Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sro2v-004ayf-3n for pgsql-hackers@arkaria.postgresql.org; Sat, 21 Sep 2024 00:32:22 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1sro2t-00Ddnt-5z for pgsql-hackers@arkaria.postgresql.org; Sat, 21 Sep 2024 00:32:20 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1srnzi-00Da3L-Cv for pgsql-hackers@lists.postgresql.org; Sat, 21 Sep 2024 00:29:04 +0000 Received: from mail-pg1-x52d.google.com ([2607:f8b0:4864:20::52d]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1srnzc-000FuT-1s for pgsql-hackers@postgresql.org; Sat, 21 Sep 2024 00:29:02 +0000 Received: by mail-pg1-x52d.google.com with SMTP id 41be03b00d2f7-7d916b6a73aso1641360a12.1 for ; Fri, 20 Sep 2024 17:28:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=j-davis-com.20230601.gappssmtp.com; s=20230601; t=1726878534; x=1727483334; darn=postgresql.org; h=mime-version:user-agent:references:in-reply-to:date:to:from:subject :message-id:from:to:cc:subject:date:message-id:reply-to; bh=fQ3tfI+HL2sUfEVuelKWkt4SgBJA2YNnT76DWnC5XJw=; b=uH56e67ichj3BNqCsl8G44JMjvGcPqKzbhNzxDNYKsRVR8R0YR18sTbNh0um/Amcwp 4P5WXKSqQFZPwwblsOZD5TwPPlI5W3A4EDLhE/NWaemYVHxOnNG5LZdGMRg8msppaARR r9aqKDYMR53fijntIAa1NWliDcAIBTrwii1VwIPXAisWvdfjrEB0yyJlUbY6DS6SKPVS 4YF+NIYhmGsWP2MqsjeWMDGu2aIwtivqO86sX14GqaxUbYkoZLQmRlnfM2OqeOvVCjaD fV+d30e0TJNuPN9eshZkz02IEh+vJcJhpvE4HxjBNi9xRpJrKcaqmw4M24d+wa2OztO+ HNsw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1726878534; x=1727483334; h=mime-version:user-agent:references:in-reply-to:date:to:from:subject :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=fQ3tfI+HL2sUfEVuelKWkt4SgBJA2YNnT76DWnC5XJw=; b=v4OSoPTFgiLtByWLMAqj6lnC/8IPkwdPe5PMp72B5vXFpyqLAf6w9Jgqrs4OdDm+B5 dRiJWX8j+TpRF8ODUvEO8/FU+pFxw2a0bo2R11tmJFzRU/X2AfI9Ot3WVyU22IRmpg4X ydJdIdBB/AZJnw8GOtBznBZtUiT+FQxwz6pf+SuaxiFHB/2ZOY03FfegGcUXF4DIJNi+ Ku4KpABK+m3ehS2ZoE82dtcr9SxTYDKAhC1jkahl17wmmRWAX+nv8RHw353Si3UTFQ7o fg4xZNYp5N4xpuQZu8XQrk+1Nn38n5lV4C9ISb0NpANCylJIYBMctRRapGWNvQScG5J3 Aleg== X-Gm-Message-State: AOJu0YwaVH20r1Q8ohZ6fBAEckf+DpInK6m49+j0TVU2iMXFux0pQClm iB9uV6h/4R8zCosM2AE8sDDlwAuBT9oxT6nzIan7203O/GqmLo01GvaNrpMwmSYjQd0ByEGcf/U = X-Google-Smtp-Source: AGHT+IE5VpzsN3eMjbAGd//SXeEPbYsEDKMZ6VtDWc3/t5jxI9PAGLKKGYZ6njwduLADQDqzpICrBA== X-Received: by 2002:a17:90b:4f8b:b0:2c8:64a:5f77 with SMTP id 98e67ed59e1d1-2dd80e7191emr5765771a91.37.1726878533745; Fri, 20 Sep 2024 17:28:53 -0700 (PDT) Received: from jeff-laptop.lan (c-76-102-242-158.hsd1.ca.comcast.net. [76.102.242.158]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2dd7f871ad7sm2632783a91.26.2024.09.20.17.28.52 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Sep 2024 17:28:53 -0700 (PDT) Message-ID: <628ce15fc833a3da075a253b11b71f409675f3f9.camel@j-davis.com> Subject: Re: Refactor: allow pg_strncoll(), etc., to accept -1 length for NUL-terminated cstrings. From: Jeff Davis To: pgsql-hackers@postgresql.org Date: Fri, 20 Sep 2024 17:28:51 -0700 In-Reply-To: <2d758e07dff26bcc7cbe2aec57431329bfe3679a.camel@j-davis.com> References: <2d758e07dff26bcc7cbe2aec57431329bfe3679a.camel@j-davis.com> Content-Type: multipart/mixed; boundary="=-reTqxxA0+F50OXMUZ9aK" User-Agent: Evolution 3.44.4-0ubuntu2 MIME-Version: 1.0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --=-reTqxxA0+F50OXMUZ9aK Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Thu, 2024-08-22 at 11:00 -0700, Jeff Davis wrote: > Like ICU, allow -1 length to mean that the input string is NUL- > terminated for pg_strncoll(), pg_strnxfrm(), and > pg_strnxfrm_prefix(). To better illustrate the direction I'm going, I roughly implemented some patches that implement collation using a table of methods rather than lots branching based on the provider. This more cleanly separates the API for a provider, which will enable us to use a hook to create a custom provider with arbitrary methods, that may have nothing to do with ICU or libc. Or, we could go so far as to implement a "CREATE LOCALE PROVIDER" that would provide the methods using a handler function, and "datlocprovider" would be an OID rather than a char. From a practical perspective, I expect that extensions would use this to lock down the version of a particular provider rather than implement a completely arbitrary one. But the API is good for either case, and offers quite a bit of code cleanup. There are quite a few loose ends, of course: * There is still a lot of branching on the provider for DDL and catalog access. I'm not sure if we will ever eliminate all of this, or if we would even want to. * I haven't done anything with get_collation_actual_version(). Perhaps that should be a method, too, but it requires some extra thought if we want this to be useful for "multilib" (having multiple versions of a provider library at once). * I didn't add methods for formatting.c yet. * initdb -- should it offer a way to preload a library and then use that for the provider? * I need to allow an arbitrary per-provider context, rather than the current union designed for the existing providers. Again, the patches are rough and there's a lot of code churn. I'd like some feedback on whether people generally like the direction this is going. If so I will clean up the patch series into smaller, more reviewable chunks. Regards, Jeff Davis --=-reTqxxA0+F50OXMUZ9aK Content-Disposition: attachment; filename="v4-0007-Use-method-table-for-collation.patch" Content-Type: text/x-patch; name="v4-0007-Use-method-table-for-collation.patch"; charset="UTF-8" Content-Transfer-Encoding: base64 RnJvbSBjOWFjZTkxNzI2YzI4ODlmZTk2ZGVjMjhmZDlmM2M2NTVlMTNhZmQ3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKZWZmIERhdmlzIDxqZWZmQGotZGF2aXMuY29tPgpEYXRlOiBU aHUsIDE5IFNlcCAyMDI0IDExOjEyOjQxIC0wNzAwClN1YmplY3Q6IFtQQVRDSCB2NCA3LzddIFVz ZSBtZXRob2QgdGFibGUgZm9yIGNvbGxhdGlvbi4KCi0tLQogc3JjL2JhY2tlbmQvcmVnZXgvcmVn Y19wZ19sb2NhbGUuYyAgICAgfCAgMzc2ICsrLS0tLS0KIHNyYy9iYWNrZW5kL3V0aWxzL2FkdC9N YWtlZmlsZSAgICAgICAgIHwgICAgMiArCiBzcmMvYmFja2VuZC91dGlscy9hZHQvbWVzb24uYnVp bGQgICAgICB8ICAgIDIgKwogc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3BnX2xvY2FsZS5jICAgICAg fCAxMzM4ICsrKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQogc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3Bn X2xvY2FsZV9pY3UuYyAgfCAgODczICsrKysrKysrKysrKysrKysKIHNyYy9iYWNrZW5kL3V0aWxz L2FkdC9wZ19sb2NhbGVfbGliYy5jIHwgIDYwNCArKysrKysrKysrKwogc3JjL2luY2x1ZGUvdXRp bHMvcGdfbG9jYWxlLmggICAgICAgICAgfCAgIDQ0ICstCiA3IGZpbGVzIGNoYW5nZWQsIDE3Mjcg aW5zZXJ0aW9ucygrKSwgMTUxMiBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMv YmFja2VuZC91dGlscy9hZHQvcGdfbG9jYWxlX2ljdS5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3Jj L2JhY2tlbmQvdXRpbHMvYWR0L3BnX2xvY2FsZV9saWJjLmMKCmRpZmYgLS1naXQgYS9zcmMvYmFj a2VuZC9yZWdleC9yZWdjX3BnX2xvY2FsZS5jIGIvc3JjL2JhY2tlbmQvcmVnZXgvcmVnY19wZ19s b2NhbGUuYwppbmRleCBiNzU3ODRiNmNlNS4uZjdjZDNmMTc4N2MgMTAwNjQ0Ci0tLSBhL3NyYy9i YWNrZW5kL3JlZ2V4L3JlZ2NfcGdfbG9jYWxlLmMKKysrIGIvc3JjL2JhY2tlbmQvcmVnZXgvcmVn Y19wZ19sb2NhbGUuYwpAQCAtNjMsMzIgKzYzLDE3IEBACiAgKiBOQjogdGhlIGNvZGluZyBoZXJl IGFzc3VtZXMgcGdfd2NoYXIgaXMgYW4gdW5zaWduZWQgdHlwZS4KICAqLwogCi10eXBlZGVmIGVu dW0KLXsKLQlQR19SRUdFWF9TVFJBVEVHWV9DLAkJLyogQyBsb2NhbGUgKGVuY29kaW5nIGluZGVw ZW5kZW50KSAqLwotCVBHX1JFR0VYX1NUUkFURUdZX0JVSUxUSU4sCS8qIGJ1aWx0LWluIFVuaWNv ZGUgc2VtYW50aWNzICovCi0JUEdfUkVHRVhfU1RSQVRFR1lfTElCQ19XSURFLAkvKiBVc2UgbG9j YWxlX3QgPHdjdHlwZS5oPiBmdW5jdGlvbnMgKi8KLQlQR19SRUdFWF9TVFJBVEVHWV9MSUJDXzFC WVRFLAkvKiBVc2UgbG9jYWxlX3QgPGN0eXBlLmg+IGZ1bmN0aW9ucyAqLwotCVBHX1JFR0VYX1NU UkFURUdZX0lDVSwJCS8qIFVzZSBJQ1UgdWNoYXIuaCBmdW5jdGlvbnMgKi8KLX0gUEdfTG9jYWxl X1N0cmF0ZWd5OwotCi1zdGF0aWMgUEdfTG9jYWxlX1N0cmF0ZWd5IHBnX3JlZ2V4X3N0cmF0ZWd5 Owogc3RhdGljIHBnX2xvY2FsZV90IHBnX3JlZ2V4X2xvY2FsZTsKIHN0YXRpYyBPaWQJcGdfcmVn ZXhfY29sbGF0aW9uOwogCitzdGF0aWMgc3RydWN0IHBnX2xvY2FsZV9zdHJ1Y3QgZHVtbXlfY19s b2NhbGUgPSB7CisJLmNvbGxhdGVfaXNfYyA9IHRydWUsCisJLmN0eXBlX2lzX2MgPSB0cnVlLAor fTsKKwogLyoKICAqIEhhcmQtd2lyZWQgY2hhcmFjdGVyIHByb3BlcnRpZXMgZm9yIEMgbG9jYWxl CiAgKi8KLSNkZWZpbmUgUEdfSVNESUdJVAkweDAxCi0jZGVmaW5lIFBHX0lTQUxQSEEJMHgwMgot I2RlZmluZSBQR19JU0FMTlVNCShQR19JU0RJR0lUIHwgUEdfSVNBTFBIQSkKLSNkZWZpbmUgUEdf SVNVUFBFUgkweDA0Ci0jZGVmaW5lIFBHX0lTTE9XRVIJMHgwOAotI2RlZmluZSBQR19JU0dSQVBI CTB4MTAKLSNkZWZpbmUgUEdfSVNQUklOVAkweDIwCi0jZGVmaW5lIFBHX0lTUFVOQ1QJMHg0MAot I2RlZmluZSBQR19JU1NQQUNFCTB4ODAKLQogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcGdf Y2hhcl9wcm9wZXJ0aWVzWzEyOF0gPSB7CiAJIC8qIE5VTCAqLyAwLAogCSAvKiBeQSAqLyAwLApA QCAtMjMyLDcgKzIxNyw2IEBAIHZvaWQKIHBnX3NldF9yZWdleF9jb2xsYXRpb24oT2lkIGNvbGxh dGlvbikKIHsKIAlwZ19sb2NhbGVfdCBsb2NhbGUgPSAwOwotCVBHX0xvY2FsZV9TdHJhdGVneSBz dHJhdGVneTsKIAogCWlmICghT2lkSXNWYWxpZChjb2xsYXRpb24pKQogCXsKQEAgLTI1Myw4ICsy MzcsOCBAQCBwZ19zZXRfcmVnZXhfY29sbGF0aW9uKE9pZCBjb2xsYXRpb24pCiAJCSAqIGNhdGFs b2cgYWNjZXNzIGlzIGF2YWlsYWJsZSwgc28gd2UgY2FuJ3QgY2FsbAogCQkgKiBwZ19uZXdsb2Nh bGVfZnJvbV9jb2xsYXRpb24oKS4KIAkJICovCi0JCXN0cmF0ZWd5ID0gUEdfUkVHRVhfU1RSQVRF R1lfQzsKIAkJY29sbGF0aW9uID0gQ19DT0xMQVRJT05fT0lEOworCQlsb2NhbGUgPSAmZHVtbXlf Y19sb2NhbGU7CiAJfQogCWVsc2UKIAl7CkBAIC0yNzEsMzIgKzI1NSwxMSBAQCBwZ19zZXRfcmVn ZXhfY29sbGF0aW9uKE9pZCBjb2xsYXRpb24pCiAJCQkgKiBDL1BPU0lYIGNvbGxhdGlvbnMgdXNl IHRoaXMgcGF0aCByZWdhcmRsZXNzIG9mIGRhdGFiYXNlCiAJCQkgKiBlbmNvZGluZwogCQkJICov Ci0JCQlzdHJhdGVneSA9IFBHX1JFR0VYX1NUUkFURUdZX0M7Ci0JCQlsb2NhbGUgPSAwOworCQkJ bG9jYWxlID0gJmR1bW15X2NfbG9jYWxlOwogCQkJY29sbGF0aW9uID0gQ19DT0xMQVRJT05fT0lE OwogCQl9Ci0JCWVsc2UgaWYgKGxvY2FsZS0+cHJvdmlkZXIgPT0gQ09MTFBST1ZJREVSX0JVSUxU SU4pCi0JCXsKLQkJCUFzc2VydChHZXREYXRhYmFzZUVuY29kaW5nKCkgPT0gUEdfVVRGOCk7Ci0J CQlzdHJhdGVneSA9IFBHX1JFR0VYX1NUUkFURUdZX0JVSUxUSU47Ci0JCX0KLSNpZmRlZiBVU0Vf SUNVCi0JCWVsc2UgaWYgKGxvY2FsZS0+cHJvdmlkZXIgPT0gQ09MTFBST1ZJREVSX0lDVSkKLQkJ ewotCQkJc3RyYXRlZ3kgPSBQR19SRUdFWF9TVFJBVEVHWV9JQ1U7Ci0JCX0KLSNlbmRpZgotCQll bHNlCi0JCXsKLQkJCUFzc2VydChsb2NhbGUtPnByb3ZpZGVyID09IENPTExQUk9WSURFUl9MSUJD KTsKLQkJCWlmIChHZXREYXRhYmFzZUVuY29kaW5nKCkgPT0gUEdfVVRGOCkKLQkJCQlzdHJhdGVn eSA9IFBHX1JFR0VYX1NUUkFURUdZX0xJQkNfV0lERTsKLQkJCWVsc2UKLQkJCQlzdHJhdGVneSA9 IFBHX1JFR0VYX1NUUkFURUdZX0xJQkNfMUJZVEU7Ci0JCX0KIAl9CiAKLQlwZ19yZWdleF9zdHJh dGVneSA9IHN0cmF0ZWd5OwogCXBnX3JlZ2V4X2xvY2FsZSA9IGxvY2FsZTsKIAlwZ19yZWdleF9j b2xsYXRpb24gPSBjb2xsYXRpb247CiB9CkBAIC0zMDQsODIgKzI2NywzMSBAQCBwZ19zZXRfcmVn ZXhfY29sbGF0aW9uKE9pZCBjb2xsYXRpb24pCiBzdGF0aWMgaW50CiBwZ193Y19pc2RpZ2l0KHBn X3djaGFyIGMpCiB7Ci0Jc3dpdGNoIChwZ19yZWdleF9zdHJhdGVneSkKLQl7Ci0JCWNhc2UgUEdf UkVHRVhfU1RSQVRFR1lfQzoKLQkJCXJldHVybiAoYyA8PSAocGdfd2NoYXIpIDEyNyAmJgotCQkJ CQkocGdfY2hhcl9wcm9wZXJ0aWVzW2NdICYgUEdfSVNESUdJVCkpOwotCQljYXNlIFBHX1JFR0VY X1NUUkFURUdZX0JVSUxUSU46Ci0JCQlyZXR1cm4gcGdfdV9pc2RpZ2l0KGMsIHRydWUpOwotCQlj YXNlIFBHX1JFR0VYX1NUUkFURUdZX0xJQkNfV0lERToKLQkJCWlmIChzaXplb2Yod2NoYXJfdCkg Pj0gNCB8fCBjIDw9IChwZ193Y2hhcikgMHhGRkZGKQotCQkJCXJldHVybiBpc3dkaWdpdF9sKCh3 aW50X3QpIGMsIHBnX3JlZ2V4X2xvY2FsZS0+aW5mby5sdCk7Ci0JCQkvKiBGQUxMIFRIUlUgKi8K LQkJY2FzZSBQR19SRUdFWF9TVFJBVEVHWV9MSUJDXzFCWVRFOgotCQkJcmV0dXJuIChjIDw9IChw Z193Y2hhcikgVUNIQVJfTUFYICYmCi0JCQkJCWlzZGlnaXRfbCgodW5zaWduZWQgY2hhcikgYywg cGdfcmVnZXhfbG9jYWxlLT5pbmZvLmx0KSk7Ci0JCQlicmVhazsKLQkJY2FzZSBQR19SRUdFWF9T VFJBVEVHWV9JQ1U6Ci0jaWZkZWYgVVNFX0lDVQotCQkJcmV0dXJuIHVfaXNkaWdpdChjKTsKLSNl bmRpZgotCQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwkJCQkJLyogY2FuJ3QgZ2V0IGhlcmUsIGJ1 dCBrZWVwIGNvbXBpbGVyIHF1aWV0ICovCisJaWYgKHBnX3JlZ2V4X2xvY2FsZS0+Y3R5cGVfaXNf YykKKwkJcmV0dXJuIChjIDw9IChwZ193Y2hhcikgMTI3ICYmCisJCQkJKHBnX2NoYXJfcHJvcGVy dGllc1tjXSAmIFBHX0lTRElHSVQpKTsKKwllbHNlCisJCXJldHVybiBjaGFyX3Byb3BzKGMsIFBH X0lTRElHSVQsIHBnX3JlZ2V4X2xvY2FsZSkgIT0gMDsKIH0KIAogc3RhdGljIGludAogcGdfd2Nf aXNhbHBoYShwZ193Y2hhciBjKQogewotCXN3aXRjaCAocGdfcmVnZXhfc3RyYXRlZ3kpCi0Jewot CQljYXNlIFBHX1JFR0VYX1NUUkFURUdZX0M6Ci0JCQlyZXR1cm4gKGMgPD0gKHBnX3djaGFyKSAx MjcgJiYKLQkJCQkJKHBnX2NoYXJfcHJvcGVydGllc1tjXSAmIFBHX0lTQUxQSEEpKTsKLQkJY2Fz ZSBQR19SRUdFWF9TVFJBVEVHWV9CVUlMVElOOgotCQkJcmV0dXJuIHBnX3VfaXNhbHBoYShjKTsK LQkJY2FzZSBQR19SRUdFWF9TVFJBVEVHWV9MSUJDX1dJREU6Ci0JCQlpZiAoc2l6ZW9mKHdjaGFy X3QpID49IDQgfHwgYyA8PSAocGdfd2NoYXIpIDB4RkZGRikKLQkJCQlyZXR1cm4gaXN3YWxwaGFf bCgod2ludF90KSBjLCBwZ19yZWdleF9sb2NhbGUtPmluZm8ubHQpOwotCQkJLyogRkFMTCBUSFJV ICovCi0JCWNhc2UgUEdfUkVHRVhfU1RSQVRFR1lfTElCQ18xQllURToKLQkJCXJldHVybiAoYyA8 PSAocGdfd2NoYXIpIFVDSEFSX01BWCAmJgotCQkJCQlpc2FscGhhX2woKHVuc2lnbmVkIGNoYXIp IGMsIHBnX3JlZ2V4X2xvY2FsZS0+aW5mby5sdCkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEdfUkVH RVhfU1RSQVRFR1lfSUNVOgotI2lmZGVmIFVTRV9JQ1UKLQkJCXJldHVybiB1X2lzYWxwaGEoYyk7 Ci0jZW5kaWYKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsJCQkJCS8qIGNhbid0IGdldCBoZXJl LCBidXQga2VlcCBjb21waWxlciBxdWlldCAqLworCWlmIChwZ19yZWdleF9sb2NhbGUtPmN0eXBl X2lzX2MpCisJCXJldHVybiAoYyA8PSAocGdfd2NoYXIpIDEyNyAmJgorCQkJCShwZ19jaGFyX3By b3BlcnRpZXNbY10gJiBQR19JU0FMUEhBKSk7CisJZWxzZQorCQlyZXR1cm4gY2hhcl9wcm9wcyhj LCBQR19JU0FMUEhBLCBwZ19yZWdleF9sb2NhbGUpICE9IDA7CiB9CiAKIHN0YXRpYyBpbnQKIHBn X3djX2lzYWxudW0ocGdfd2NoYXIgYykKIHsKLQlzd2l0Y2ggKHBnX3JlZ2V4X3N0cmF0ZWd5KQot CXsKLQkJY2FzZSBQR19SRUdFWF9TVFJBVEVHWV9DOgotCQkJcmV0dXJuIChjIDw9IChwZ193Y2hh cikgMTI3ICYmCi0JCQkJCShwZ19jaGFyX3Byb3BlcnRpZXNbY10gJiBQR19JU0FMTlVNKSk7Ci0J CWNhc2UgUEdfUkVHRVhfU1RSQVRFR1lfQlVJTFRJTjoKLQkJCXJldHVybiBwZ191X2lzYWxudW0o YywgdHJ1ZSk7Ci0JCWNhc2UgUEdfUkVHRVhfU1RSQVRFR1lfTElCQ19XSURFOgotCQkJaWYgKHNp emVvZih3Y2hhcl90KSA+PSA0IHx8IGMgPD0gKHBnX3djaGFyKSAweEZGRkYpCi0JCQkJcmV0dXJu IGlzd2FsbnVtX2woKHdpbnRfdCkgYywgcGdfcmVnZXhfbG9jYWxlLT5pbmZvLmx0KTsKLQkJCS8q IEZBTEwgVEhSVSAqLwotCQljYXNlIFBHX1JFR0VYX1NUUkFURUdZX0xJQkNfMUJZVEU6Ci0JCQly ZXR1cm4gKGMgPD0gKHBnX3djaGFyKSBVQ0hBUl9NQVggJiYKLQkJCQkJaXNhbG51bV9sKCh1bnNp Z25lZCBjaGFyKSBjLCBwZ19yZWdleF9sb2NhbGUtPmluZm8ubHQpKTsKLQkJCWJyZWFrOwotCQlj YXNlIFBHX1JFR0VYX1NUUkFURUdZX0lDVToKLSNpZmRlZiBVU0VfSUNVCi0JCQlyZXR1cm4gdV9p c2FsbnVtKGMpOwotI2VuZGlmCi0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7CQkJCQkvKiBjYW4n dCBnZXQgaGVyZSwgYnV0IGtlZXAgY29tcGlsZXIgcXVpZXQgKi8KKwlpZiAocGdfcmVnZXhfbG9j YWxlLT5jdHlwZV9pc19jKQorCQlyZXR1cm4gKGMgPD0gKHBnX3djaGFyKSAxMjcgJiYKKwkJCQko cGdfY2hhcl9wcm9wZXJ0aWVzW2NdICYgUEdfSVNBTE5VTSkpOworCWVsc2UKKwkJcmV0dXJuIGNo YXJfcHJvcHMoYywgUEdfSVNESUdJVHxQR19JU0FMUEhBLCBwZ19yZWdleF9sb2NhbGUpICE9IDA7 CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTM5NCwyMTkgKzMwNiw4NyBAQCBwZ193Y19pc3dvcmQocGdf d2NoYXIgYykKIHN0YXRpYyBpbnQKIHBnX3djX2lzdXBwZXIocGdfd2NoYXIgYykKIHsKLQlzd2l0 Y2ggKHBnX3JlZ2V4X3N0cmF0ZWd5KQotCXsKLQkJY2FzZSBQR19SRUdFWF9TVFJBVEVHWV9DOgot CQkJcmV0dXJuIChjIDw9IChwZ193Y2hhcikgMTI3ICYmCi0JCQkJCShwZ19jaGFyX3Byb3BlcnRp ZXNbY10gJiBQR19JU1VQUEVSKSk7Ci0JCWNhc2UgUEdfUkVHRVhfU1RSQVRFR1lfQlVJTFRJTjoK LQkJCXJldHVybiBwZ191X2lzdXBwZXIoYyk7Ci0JCWNhc2UgUEdfUkVHRVhfU1RSQVRFR1lfTElC Q19XSURFOgotCQkJaWYgKHNpemVvZih3Y2hhcl90KSA+PSA0IHx8IGMgPD0gKHBnX3djaGFyKSAw eEZGRkYpCi0JCQkJcmV0dXJuIGlzd3VwcGVyX2woKHdpbnRfdCkgYywgcGdfcmVnZXhfbG9jYWxl LT5pbmZvLmx0KTsKLQkJCS8qIEZBTEwgVEhSVSAqLwotCQljYXNlIFBHX1JFR0VYX1NUUkFURUdZ X0xJQkNfMUJZVEU6Ci0JCQlyZXR1cm4gKGMgPD0gKHBnX3djaGFyKSBVQ0hBUl9NQVggJiYKLQkJ CQkJaXN1cHBlcl9sKCh1bnNpZ25lZCBjaGFyKSBjLCBwZ19yZWdleF9sb2NhbGUtPmluZm8ubHQp KTsKLQkJCWJyZWFrOwotCQljYXNlIFBHX1JFR0VYX1NUUkFURUdZX0lDVToKLSNpZmRlZiBVU0Vf SUNVCi0JCQlyZXR1cm4gdV9pc3VwcGVyKGMpOwotI2VuZGlmCi0JCQlicmVhazsKLQl9Ci0JcmV0 dXJuIDA7CQkJCQkvKiBjYW4ndCBnZXQgaGVyZSwgYnV0IGtlZXAgY29tcGlsZXIgcXVpZXQgKi8K KwlpZiAocGdfcmVnZXhfbG9jYWxlLT5jdHlwZV9pc19jKQorCQlyZXR1cm4gKGMgPD0gKHBnX3dj aGFyKSAxMjcgJiYKKwkJCQkocGdfY2hhcl9wcm9wZXJ0aWVzW2NdICYgUEdfSVNVUFBFUikpOwor CWVsc2UKKwkJcmV0dXJuIGNoYXJfcHJvcHMoYywgUEdfSVNVUFBFUiwgcGdfcmVnZXhfbG9jYWxl KSAhPSAwOwogfQogCiBzdGF0aWMgaW50CiBwZ193Y19pc2xvd2VyKHBnX3djaGFyIGMpCiB7Ci0J c3dpdGNoIChwZ19yZWdleF9zdHJhdGVneSkKLQl7Ci0JCWNhc2UgUEdfUkVHRVhfU1RSQVRFR1lf QzoKLQkJCXJldHVybiAoYyA8PSAocGdfd2NoYXIpIDEyNyAmJgotCQkJCQkocGdfY2hhcl9wcm9w ZXJ0aWVzW2NdICYgUEdfSVNMT1dFUikpOwotCQljYXNlIFBHX1JFR0VYX1NUUkFURUdZX0JVSUxU SU46Ci0JCQlyZXR1cm4gcGdfdV9pc2xvd2VyKGMpOwotCQljYXNlIFBHX1JFR0VYX1NUUkFURUdZ X0xJQkNfV0lERToKLQkJCWlmIChzaXplb2Yod2NoYXJfdCkgPj0gNCB8fCBjIDw9IChwZ193Y2hh cikgMHhGRkZGKQotCQkJCXJldHVybiBpc3dsb3dlcl9sKCh3aW50X3QpIGMsIHBnX3JlZ2V4X2xv Y2FsZS0+aW5mby5sdCk7Ci0JCQkvKiBGQUxMIFRIUlUgKi8KLQkJY2FzZSBQR19SRUdFWF9TVFJB VEVHWV9MSUJDXzFCWVRFOgotCQkJcmV0dXJuIChjIDw9IChwZ193Y2hhcikgVUNIQVJfTUFYICYm Ci0JCQkJCWlzbG93ZXJfbCgodW5zaWduZWQgY2hhcikgYywgcGdfcmVnZXhfbG9jYWxlLT5pbmZv Lmx0KSk7Ci0JCQlicmVhazsKLQkJY2FzZSBQR19SRUdFWF9TVFJBVEVHWV9JQ1U6Ci0jaWZkZWYg VVNFX0lDVQotCQkJcmV0dXJuIHVfaXNsb3dlcihjKTsKLSNlbmRpZgotCQkJYnJlYWs7Ci0JfQot CXJldHVybiAwOwkJCQkJLyogY2FuJ3QgZ2V0IGhlcmUsIGJ1dCBrZWVwIGNvbXBpbGVyIHF1aWV0 ICovCisJaWYgKHBnX3JlZ2V4X2xvY2FsZS0+Y3R5cGVfaXNfYykKKwkJcmV0dXJuIChjIDw9IChw Z193Y2hhcikgMTI3ICYmCisJCQkJKHBnX2NoYXJfcHJvcGVydGllc1tjXSAmIFBHX0lTTE9XRVIp KTsKKwllbHNlCisJCXJldHVybiBjaGFyX3Byb3BzKGMsIFBHX0lTTE9XRVIsIHBnX3JlZ2V4X2xv Y2FsZSkgIT0gMDsKIH0KIAogc3RhdGljIGludAogcGdfd2NfaXNncmFwaChwZ193Y2hhciBjKQog ewotCXN3aXRjaCAocGdfcmVnZXhfc3RyYXRlZ3kpCi0JewotCQljYXNlIFBHX1JFR0VYX1NUUkFU RUdZX0M6Ci0JCQlyZXR1cm4gKGMgPD0gKHBnX3djaGFyKSAxMjcgJiYKLQkJCQkJKHBnX2NoYXJf cHJvcGVydGllc1tjXSAmIFBHX0lTR1JBUEgpKTsKLQkJY2FzZSBQR19SRUdFWF9TVFJBVEVHWV9C VUlMVElOOgotCQkJcmV0dXJuIHBnX3VfaXNncmFwaChjKTsKLQkJY2FzZSBQR19SRUdFWF9TVFJB VEVHWV9MSUJDX1dJREU6Ci0JCQlpZiAoc2l6ZW9mKHdjaGFyX3QpID49IDQgfHwgYyA8PSAocGdf d2NoYXIpIDB4RkZGRikKLQkJCQlyZXR1cm4gaXN3Z3JhcGhfbCgod2ludF90KSBjLCBwZ19yZWdl eF9sb2NhbGUtPmluZm8ubHQpOwotCQkJLyogRkFMTCBUSFJVICovCi0JCWNhc2UgUEdfUkVHRVhf U1RSQVRFR1lfTElCQ18xQllURToKLQkJCXJldHVybiAoYyA8PSAocGdfd2NoYXIpIFVDSEFSX01B WCAmJgotCQkJCQlpc2dyYXBoX2woKHVuc2lnbmVkIGNoYXIpIGMsIHBnX3JlZ2V4X2xvY2FsZS0+ aW5mby5sdCkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEdfUkVHRVhfU1RSQVRFR1lfSUNVOgotI2lm ZGVmIFVTRV9JQ1UKLQkJCXJldHVybiB1X2lzZ3JhcGgoYyk7Ci0jZW5kaWYKLQkJCWJyZWFrOwot CX0KLQlyZXR1cm4gMDsJCQkJCS8qIGNhbid0IGdldCBoZXJlLCBidXQga2VlcCBjb21waWxlciBx dWlldCAqLworCWlmIChwZ19yZWdleF9sb2NhbGUtPmN0eXBlX2lzX2MpCisJCXJldHVybiAoYyA8 PSAocGdfd2NoYXIpIDEyNyAmJgorCQkJCShwZ19jaGFyX3Byb3BlcnRpZXNbY10gJiBQR19JU0dS QVBIKSk7CisJZWxzZQorCQlyZXR1cm4gY2hhcl9wcm9wcyhjLCBQR19JU0dSQVBILCBwZ19yZWdl eF9sb2NhbGUpICE9IDA7CiB9CiAKIHN0YXRpYyBpbnQKIHBnX3djX2lzcHJpbnQocGdfd2NoYXIg YykKIHsKLQlzd2l0Y2ggKHBnX3JlZ2V4X3N0cmF0ZWd5KQotCXsKLQkJY2FzZSBQR19SRUdFWF9T VFJBVEVHWV9DOgotCQkJcmV0dXJuIChjIDw9IChwZ193Y2hhcikgMTI3ICYmCi0JCQkJCShwZ19j aGFyX3Byb3BlcnRpZXNbY10gJiBQR19JU1BSSU5UKSk7Ci0JCWNhc2UgUEdfUkVHRVhfU1RSQVRF R1lfQlVJTFRJTjoKLQkJCXJldHVybiBwZ191X2lzcHJpbnQoYyk7Ci0JCWNhc2UgUEdfUkVHRVhf U1RSQVRFR1lfTElCQ19XSURFOgotCQkJaWYgKHNpemVvZih3Y2hhcl90KSA+PSA0IHx8IGMgPD0g KHBnX3djaGFyKSAweEZGRkYpCi0JCQkJcmV0dXJuIGlzd3ByaW50X2woKHdpbnRfdCkgYywgcGdf cmVnZXhfbG9jYWxlLT5pbmZvLmx0KTsKLQkJCS8qIEZBTEwgVEhSVSAqLwotCQljYXNlIFBHX1JF R0VYX1NUUkFURUdZX0xJQkNfMUJZVEU6Ci0JCQlyZXR1cm4gKGMgPD0gKHBnX3djaGFyKSBVQ0hB Ul9NQVggJiYKLQkJCQkJaXNwcmludF9sKCh1bnNpZ25lZCBjaGFyKSBjLCBwZ19yZWdleF9sb2Nh bGUtPmluZm8ubHQpKTsKLQkJCWJyZWFrOwotCQljYXNlIFBHX1JFR0VYX1NUUkFURUdZX0lDVToK LSNpZmRlZiBVU0VfSUNVCi0JCQlyZXR1cm4gdV9pc3ByaW50KGMpOwotI2VuZGlmCi0JCQlicmVh azsKLQl9Ci0JcmV0dXJuIDA7CQkJCQkvKiBjYW4ndCBnZXQgaGVyZSwgYnV0IGtlZXAgY29tcGls ZXIgcXVpZXQgKi8KKwlpZiAocGdfcmVnZXhfbG9jYWxlLT5jdHlwZV9pc19jKQorCQlyZXR1cm4g KGMgPD0gKHBnX3djaGFyKSAxMjcgJiYKKwkJCQkocGdfY2hhcl9wcm9wZXJ0aWVzW2NdICYgUEdf SVNQUklOVCkpOworCWVsc2UKKwkJcmV0dXJuIGNoYXJfcHJvcHMoYywgUEdfSVNQUklOVCwgcGdf cmVnZXhfbG9jYWxlKSAhPSAwOwogfQogCiBzdGF0aWMgaW50CiBwZ193Y19pc3B1bmN0KHBnX3dj aGFyIGMpCiB7Ci0Jc3dpdGNoIChwZ19yZWdleF9zdHJhdGVneSkKLQl7Ci0JCWNhc2UgUEdfUkVH RVhfU1RSQVRFR1lfQzoKLQkJCXJldHVybiAoYyA8PSAocGdfd2NoYXIpIDEyNyAmJgotCQkJCQko cGdfY2hhcl9wcm9wZXJ0aWVzW2NdICYgUEdfSVNQVU5DVCkpOwotCQljYXNlIFBHX1JFR0VYX1NU UkFURUdZX0JVSUxUSU46Ci0JCQlyZXR1cm4gcGdfdV9pc3B1bmN0KGMsIHRydWUpOwotCQljYXNl IFBHX1JFR0VYX1NUUkFURUdZX0xJQkNfV0lERToKLQkJCWlmIChzaXplb2Yod2NoYXJfdCkgPj0g NCB8fCBjIDw9IChwZ193Y2hhcikgMHhGRkZGKQotCQkJCXJldHVybiBpc3dwdW5jdF9sKCh3aW50 X3QpIGMsIHBnX3JlZ2V4X2xvY2FsZS0+aW5mby5sdCk7Ci0JCQkvKiBGQUxMIFRIUlUgKi8KLQkJ Y2FzZSBQR19SRUdFWF9TVFJBVEVHWV9MSUJDXzFCWVRFOgotCQkJcmV0dXJuIChjIDw9IChwZ193 Y2hhcikgVUNIQVJfTUFYICYmCi0JCQkJCWlzcHVuY3RfbCgodW5zaWduZWQgY2hhcikgYywgcGdf cmVnZXhfbG9jYWxlLT5pbmZvLmx0KSk7Ci0JCQlicmVhazsKLQkJY2FzZSBQR19SRUdFWF9TVFJB VEVHWV9JQ1U6Ci0jaWZkZWYgVVNFX0lDVQotCQkJcmV0dXJuIHVfaXNwdW5jdChjKTsKLSNlbmRp ZgotCQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwkJCQkJLyogY2FuJ3QgZ2V0IGhlcmUsIGJ1dCBr ZWVwIGNvbXBpbGVyIHF1aWV0ICovCisJaWYgKHBnX3JlZ2V4X2xvY2FsZS0+Y3R5cGVfaXNfYykK KwkJcmV0dXJuIChjIDw9IChwZ193Y2hhcikgMTI3ICYmCisJCQkJKHBnX2NoYXJfcHJvcGVydGll c1tjXSAmIFBHX0lTUFVOQ1QpKTsKKwllbHNlCisJCXJldHVybiBjaGFyX3Byb3BzKGMsIFBHX0lT UFVOQ1QsIHBnX3JlZ2V4X2xvY2FsZSkgIT0gMDsKIH0KIAogc3RhdGljIGludAogcGdfd2NfaXNz cGFjZShwZ193Y2hhciBjKQogewotCXN3aXRjaCAocGdfcmVnZXhfc3RyYXRlZ3kpCi0JewotCQlj YXNlIFBHX1JFR0VYX1NUUkFURUdZX0M6Ci0JCQlyZXR1cm4gKGMgPD0gKHBnX3djaGFyKSAxMjcg JiYKLQkJCQkJKHBnX2NoYXJfcHJvcGVydGllc1tjXSAmIFBHX0lTU1BBQ0UpKTsKLQkJY2FzZSBQ R19SRUdFWF9TVFJBVEVHWV9CVUlMVElOOgotCQkJcmV0dXJuIHBnX3VfaXNzcGFjZShjKTsKLQkJ Y2FzZSBQR19SRUdFWF9TVFJBVEVHWV9MSUJDX1dJREU6Ci0JCQlpZiAoc2l6ZW9mKHdjaGFyX3Qp ID49IDQgfHwgYyA8PSAocGdfd2NoYXIpIDB4RkZGRikKLQkJCQlyZXR1cm4gaXN3c3BhY2VfbCgo d2ludF90KSBjLCBwZ19yZWdleF9sb2NhbGUtPmluZm8ubHQpOwotCQkJLyogRkFMTCBUSFJVICov Ci0JCWNhc2UgUEdfUkVHRVhfU1RSQVRFR1lfTElCQ18xQllURToKLQkJCXJldHVybiAoYyA8PSAo cGdfd2NoYXIpIFVDSEFSX01BWCAmJgotCQkJCQlpc3NwYWNlX2woKHVuc2lnbmVkIGNoYXIpIGMs IHBnX3JlZ2V4X2xvY2FsZS0+aW5mby5sdCkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEdfUkVHRVhf U1RSQVRFR1lfSUNVOgotI2lmZGVmIFVTRV9JQ1UKLQkJCXJldHVybiB1X2lzc3BhY2UoYyk7Ci0j ZW5kaWYKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsJCQkJCS8qIGNhbid0IGdldCBoZXJlLCBi dXQga2VlcCBjb21waWxlciBxdWlldCAqLworCWlmIChwZ19yZWdleF9sb2NhbGUtPmN0eXBlX2lz X2MpCisJCXJldHVybiAoYyA8PSAocGdfd2NoYXIpIDEyNyAmJgorCQkJCShwZ19jaGFyX3Byb3Bl cnRpZXNbY10gJiBQR19JU1NQQUNFKSk7CisJZWxzZQorCQlyZXR1cm4gY2hhcl9wcm9wcyhjLCBQ R19JU1NQQUNFLCBwZ19yZWdleF9sb2NhbGUpICE9IDA7CiB9CiAKIHN0YXRpYyBwZ193Y2hhcgog cGdfd2NfdG91cHBlcihwZ193Y2hhciBjKQogewotCXN3aXRjaCAocGdfcmVnZXhfc3RyYXRlZ3kp CisJaWYgKHBnX3JlZ2V4X2xvY2FsZS0+Y3R5cGVfaXNfYykKIAl7Ci0JCWNhc2UgUEdfUkVHRVhf U1RSQVRFR1lfQzoKLQkJCWlmIChjIDw9IChwZ193Y2hhcikgMTI3KQotCQkJCXJldHVybiBwZ19h c2NpaV90b3VwcGVyKCh1bnNpZ25lZCBjaGFyKSBjKTsKLQkJCXJldHVybiBjOwotCQljYXNlIFBH X1JFR0VYX1NUUkFURUdZX0JVSUxUSU46Ci0JCQlyZXR1cm4gdW5pY29kZV91cHBlcmNhc2Vfc2lt cGxlKGMpOwotCQljYXNlIFBHX1JFR0VYX1NUUkFURUdZX0xJQkNfV0lERToKLQkJCWlmIChzaXpl b2Yod2NoYXJfdCkgPj0gNCB8fCBjIDw9IChwZ193Y2hhcikgMHhGRkZGKQotCQkJCXJldHVybiB0 b3d1cHBlcl9sKCh3aW50X3QpIGMsIHBnX3JlZ2V4X2xvY2FsZS0+aW5mby5sdCk7Ci0JCQkvKiBG QUxMIFRIUlUgKi8KLQkJY2FzZSBQR19SRUdFWF9TVFJBVEVHWV9MSUJDXzFCWVRFOgotCQkJaWYg KGMgPD0gKHBnX3djaGFyKSBVQ0hBUl9NQVgpCi0JCQkJcmV0dXJuIHRvdXBwZXJfbCgodW5zaWdu ZWQgY2hhcikgYywgcGdfcmVnZXhfbG9jYWxlLT5pbmZvLmx0KTsKLQkJCXJldHVybiBjOwotCQlj YXNlIFBHX1JFR0VYX1NUUkFURUdZX0lDVToKLSNpZmRlZiBVU0VfSUNVCi0JCQlyZXR1cm4gdV90 b3VwcGVyKGMpOwotI2VuZGlmCi0JCQlicmVhazsKKwkJaWYgKGMgPD0gKHBnX3djaGFyKSAxMjcp CisJCQlyZXR1cm4gcGdfYXNjaWlfdG91cHBlcigodW5zaWduZWQgY2hhcikgYyk7CisJCXJldHVy biBjOwogCX0KLQlyZXR1cm4gMDsJCQkJCS8qIGNhbid0IGdldCBoZXJlLCBidXQga2VlcCBjb21w aWxlciBxdWlldCAqLworCWVsc2UKKwkJcmV0dXJuIHBnX3JlZ2V4X2xvY2FsZS0+Y3R5cGUtPndj X3RvdXBwZXIoYywgcGdfcmVnZXhfbG9jYWxlKTsKIH0KIAogc3RhdGljIHBnX3djaGFyCiBwZ193 Y190b2xvd2VyKHBnX3djaGFyIGMpCiB7Ci0Jc3dpdGNoIChwZ19yZWdleF9zdHJhdGVneSkKKwlp ZiAocGdfcmVnZXhfbG9jYWxlLT5jdHlwZV9pc19jKQogCXsKLQkJY2FzZSBQR19SRUdFWF9TVFJB VEVHWV9DOgotCQkJaWYgKGMgPD0gKHBnX3djaGFyKSAxMjcpCi0JCQkJcmV0dXJuIHBnX2FzY2lp X3RvbG93ZXIoKHVuc2lnbmVkIGNoYXIpIGMpOwotCQkJcmV0dXJuIGM7Ci0JCWNhc2UgUEdfUkVH RVhfU1RSQVRFR1lfQlVJTFRJTjoKLQkJCXJldHVybiB1bmljb2RlX2xvd2VyY2FzZV9zaW1wbGUo Yyk7Ci0JCWNhc2UgUEdfUkVHRVhfU1RSQVRFR1lfTElCQ19XSURFOgotCQkJaWYgKHNpemVvZih3 Y2hhcl90KSA+PSA0IHx8IGMgPD0gKHBnX3djaGFyKSAweEZGRkYpCi0JCQkJcmV0dXJuIHRvd2xv d2VyX2woKHdpbnRfdCkgYywgcGdfcmVnZXhfbG9jYWxlLT5pbmZvLmx0KTsKLQkJCS8qIEZBTEwg VEhSVSAqLwotCQljYXNlIFBHX1JFR0VYX1NUUkFURUdZX0xJQkNfMUJZVEU6Ci0JCQlpZiAoYyA8 PSAocGdfd2NoYXIpIFVDSEFSX01BWCkKLQkJCQlyZXR1cm4gdG9sb3dlcl9sKCh1bnNpZ25lZCBj aGFyKSBjLCBwZ19yZWdleF9sb2NhbGUtPmluZm8ubHQpOwotCQkJcmV0dXJuIGM7Ci0JCWNhc2Ug UEdfUkVHRVhfU1RSQVRFR1lfSUNVOgotI2lmZGVmIFVTRV9JQ1UKLQkJCXJldHVybiB1X3RvbG93 ZXIoYyk7Ci0jZW5kaWYKLQkJCWJyZWFrOworCQlpZiAoYyA8PSAocGdfd2NoYXIpIDEyNykKKwkJ CXJldHVybiBwZ19hc2NpaV90b2xvd2VyKCh1bnNpZ25lZCBjaGFyKSBjKTsKKwkJcmV0dXJuIGM7 CiAJfQotCXJldHVybiAwOwkJCQkJLyogY2FuJ3QgZ2V0IGhlcmUsIGJ1dCBrZWVwIGNvbXBpbGVy IHF1aWV0ICovCisJZWxzZQorCQlyZXR1cm4gcGdfcmVnZXhfbG9jYWxlLT5jdHlwZS0+d2NfdG9s b3dlcihjLCBwZ19yZWdleF9sb2NhbGUpOwogfQogCiAKQEAgLTczMiwzNyArNTEyLDI3IEBAIHBn X2N0eXBlX2dldF9jYWNoZShwZ193Y19wcm9iZWZ1bmMgcHJvYmVmdW5jLCBpbnQgY2NsYXNzY29k ZSkKIAkgKiB3b3VsZCBhbHdheXMgYmUgdHJ1ZSBmb3IgcHJvZHVjdGlvbiB2YWx1ZXMgb2YgTUFY X1NJTVBMRV9DSFIsIGJ1dCBpdCdzCiAJICogdXNlZnVsIHRvIGFsbG93IGl0IHRvIGJlIHNtYWxs IGZvciB0ZXN0aW5nIHB1cnBvc2VzLikKIAkgKi8KLQlzd2l0Y2ggKHBnX3JlZ2V4X3N0cmF0ZWd5 KQorCWlmIChwZ19yZWdleF9sb2NhbGUtPmN0eXBlX2lzX2MpCiAJewotCQljYXNlIFBHX1JFR0VY X1NUUkFURUdZX0M6CiAjaWYgTUFYX1NJTVBMRV9DSFIgPj0gMTI3CiAJCQltYXhfY2hyID0gKHBn X3djaGFyKSAxMjc7CiAJCQlwY2MtPmN2LmNjbGFzc2NvZGUgPSAtMTsKICNlbHNlCiAJCQltYXhf Y2hyID0gKHBnX3djaGFyKSBNQVhfU0lNUExFX0NIUjsKICNlbmRpZgotCQkJYnJlYWs7Ci0JCWNh c2UgUEdfUkVHRVhfU1RSQVRFR1lfQlVJTFRJTjoKLQkJCW1heF9jaHIgPSAocGdfd2NoYXIpIE1B WF9TSU1QTEVfQ0hSOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEdfUkVHRVhfU1RSQVRFR1lfTElCQ19X SURFOgotCQkJbWF4X2NociA9IChwZ193Y2hhcikgTUFYX1NJTVBMRV9DSFI7Ci0JCQlicmVhazsK LQkJY2FzZSBQR19SRUdFWF9TVFJBVEVHWV9MSUJDXzFCWVRFOgorCX0KKwllbHNlCisJewogI2lm IE1BWF9TSU1QTEVfQ0hSID49IFVDSEFSX01BWAorCQlpZiAocGdfcmVnZXhfbG9jYWxlLT5wcm92 aWRlciA9PSBDT0xMUFJPVklERVJfTElCQyAmJgorCQkJR2V0RGF0YWJhc2VFbmNvZGluZygpICE9 IFBHX1VURjgpCisJCXsKIAkJCW1heF9jaHIgPSAocGdfd2NoYXIpIFVDSEFSX01BWDsKIAkJCXBj Yy0+Y3YuY2NsYXNzY29kZSA9IC0xOwotI2Vsc2UKLQkJCW1heF9jaHIgPSAocGdfd2NoYXIpIE1B WF9TSU1QTEVfQ0hSOworCQl9CisJCWVsc2UKICNlbmRpZgotCQkJYnJlYWs7Ci0JCWNhc2UgUEdf UkVHRVhfU1RSQVRFR1lfSUNVOgogCQkJbWF4X2NociA9IChwZ193Y2hhcikgTUFYX1NJTVBMRV9D SFI7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCUFzc2VydChmYWxzZSk7Ci0JCQltYXhfY2hy ID0gMDsJCS8qIGNhbid0IGdldCBoZXJlLCBidXQga2VlcCBjb21waWxlciBxdWlldCAqLwotCQkJ YnJlYWs7CiAJfQogCiAJLyoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9NYWtl ZmlsZSBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9NYWtlZmlsZQppbmRleCBlZGIwOWQ0ZTM1Ni4u ODVlNWVhZjMyZWIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9NYWtlZmlsZQor KysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvTWFrZWZpbGUKQEAgLTc5LDYgKzc5LDggQEAgT0JK UyA9IFwKIAlvcmRlcmVkc2V0YWdncy5vIFwKIAlwYXJ0aXRpb25mdW5jcy5vIFwKIAlwZ19sb2Nh bGUubyBcCisJcGdfbG9jYWxlX2ljdS5vIFwKKwlwZ19sb2NhbGVfbGliYy5vIFwKIAlwZ19sc24u byBcCiAJcGdfdXBncmFkZV9zdXBwb3J0Lm8gXAogCXBnc3RhdGZ1bmNzLm8gXApkaWZmIC0tZ2l0 IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L21lc29uLmJ1aWxkIGIvc3JjL2JhY2tlbmQvdXRpbHMv YWR0L21lc29uLmJ1aWxkCmluZGV4IDhjNmZjODBjMzczLi5mNzNmMjk0YjhmNSAxMDA2NDQKLS0t IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L21lc29uLmJ1aWxkCisrKyBiL3NyYy9iYWNrZW5kL3V0 aWxzL2FkdC9tZXNvbi5idWlsZApAQCAtNjYsNiArNjYsOCBAQCBiYWNrZW5kX3NvdXJjZXMgKz0g ZmlsZXMoCiAgICdvcmRlcmVkc2V0YWdncy5jJywKICAgJ3BhcnRpdGlvbmZ1bmNzLmMnLAogICAn cGdfbG9jYWxlLmMnLAorICAncGdfbG9jYWxlX2ljdS5jJywKKyAgJ3BnX2xvY2FsZV9saWJjLmMn LAogICAncGdfbHNuLmMnLAogICAncGdfdXBncmFkZV9zdXBwb3J0LmMnLAogICAncGdzdGF0ZnVu Y3MuYycsCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvcGdfbG9jYWxlLmMgYi9z cmMvYmFja2VuZC91dGlscy9hZHQvcGdfbG9jYWxlLmMKaW5kZXggY2ZiYTU1YTZlMzEuLjE4MDJi N2ExNTg5IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hZHQvcGdfbG9jYWxlLmMKKysr IGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3BnX2xvY2FsZS5jCkBAIC01OCw2ICs1OCw4IEBACiAj aW5jbHVkZSAiY2F0YWxvZy9wZ19jb2xsYXRpb24uaCIKICNpbmNsdWRlICJjYXRhbG9nL3BnX2Rh dGFiYXNlLmgiCiAjaW5jbHVkZSAiY29tbW9uL2hhc2hmbi5oIgorI2luY2x1ZGUgImNvbW1vbi91 bmljb2RlX2Nhc2UuaCIKKyNpbmNsdWRlICJjb21tb24vdW5pY29kZV9jYXRlZ29yeS5oIgogI2lu Y2x1ZGUgIm1iL3BnX3djaGFyLmgiCiAjaW5jbHVkZSAibWlzY2FkbWluLmgiCiAjaW5jbHVkZSAi dXRpbHMvYnVpbHRpbnMuaCIKQEAgLTg3LDEyICs4OSw2IEBACiAjZGVmaW5lCQlQR0xPQ0FMRV9T VVBQT1JUX0VSUk9SKHByb3ZpZGVyKSBcCiAJZWxvZyhFUlJPUiwgInVuc3VwcG9ydGVkIGNvbGxw cm92aWRlciBmb3IgJXM6ICVjIiwgX19mdW5jX18sIHByb3ZpZGVyKQogCi0vKgotICogVGhpcyBz aG91bGQgYmUgbGFyZ2UgZW5vdWdoIHRoYXQgbW9zdCBzdHJpbmdzIHdpbGwgZml0LCBidXQgc21h bGwgZW5vdWdoCi0gKiB0aGF0IHdlIGZlZWwgY29tZm9ydGFibGUgcHV0dGluZyBpdCBvbiB0aGUg c3RhY2sKLSAqLwotI2RlZmluZQkJVEVYVEJVRkxFTgkJCTEwMjQKLQogI2RlZmluZQkJTUFYX0wx ME5fREFUQQkJODAKIAogCkBAIC0xMTksNyArMTE1LDIxIEBAIGNoYXIJICAgKmxvY2FsaXplZF9m dWxsX21vbnRoc1sxMiArIDFdOwogLyogaXMgdGhlIGRhdGFiYXNlcydzIExDX0NUWVBFIHRoZSBD IGxvY2FsZT8gKi8KIGJvb2wJCWRhdGFiYXNlX2N0eXBlX2lzX2MgPSBmYWxzZTsKIAotc3RhdGlj IHN0cnVjdCBwZ19sb2NhbGVfc3RydWN0IGRlZmF1bHRfbG9jYWxlOworI2lmZGVmIFVTRV9JQ1UK K2V4dGVybiBwZ19sb2NhbGVfdCBpY3VfZGF0X2NyZWF0ZV9sb2NhbGUoSGVhcFR1cGxlIGRhdHR1 cGxlKTsKK2V4dGVybiBwZ19sb2NhbGVfdCBpY3VfY29sbF9jcmVhdGVfbG9jYWxlKE1lbW9yeUNv bnRleHQgY29udGV4dCwKKwkJCQkJCQkJCQkgIFJlc291cmNlT3duZXIgcmVzb3duZXIsCisJCQkJ CQkJCQkJICBIZWFwVHVwbGUgY29sbHR1cGxlKTsKK2V4dGVybiBVQ29sbGF0b3IgKnBnX3Vjb2xf b3Blbihjb25zdCBjaGFyICpsb2Nfc3RyKTsKKyNlbmRpZgorCisKK2V4dGVybiBwZ19sb2NhbGVf dCBsaWJjX2RhdF9jcmVhdGVfbG9jYWxlKEhlYXBUdXBsZSBkYXR0dXBsZSk7CitleHRlcm4gcGdf bG9jYWxlX3QgbGliY19jb2xsX2NyZWF0ZV9sb2NhbGUoTWVtb3J5Q29udGV4dCBjb250ZXh0LAor CQkJCQkJCQkJCSAgIFJlc291cmNlT3duZXIgcmVzb3duZXIsCisJCQkJCQkJCQkJICAgSGVhcFR1 cGxlIGNvbGx0dXBsZSk7CisKK3N0YXRpYyBwZ19sb2NhbGVfdCBkZWZhdWx0X2xvY2FsZSA9IE5V TEw7CiAKIC8qIGluZGljYXRlcyB3aGV0aGVyIGxvY2FsZSBpbmZvcm1hdGlvbiBjYWNoZSBpcyB2 YWxpZCAqLwogc3RhdGljIGJvb2wgQ3VycmVudExvY2FsZUNvbnZWYWxpZCA9IGZhbHNlOwpAQCAt MTcwLDUxICsxODAsNDggQEAgc3RhdGljIHBnX2xvY2FsZV90IGxhc3RfY29sbGF0aW9uX2NhY2hl X2xvY2FsZSA9IE5VTEw7CiBzdGF0aWMgY2hhciAqSXNvTG9jYWxlTmFtZShjb25zdCBjaGFyICop OwogI2VuZGlmCiAKLSNpZmRlZiBVU0VfSUNVCi0vKgotICogQ29udmVydGVyIG9iamVjdCBmb3Ig Y29udmVydGluZyBiZXR3ZWVuIElDVSdzIFVDaGFyIHN0cmluZ3MgYW5kIEMgc3RyaW5ncwotICog aW4gZGF0YWJhc2UgZW5jb2RpbmcuICBTaW5jZSB0aGUgZGF0YWJhc2UgZW5jb2RpbmcgZG9lc24n dCBjaGFuZ2UsIHdlIG9ubHkKLSAqIG5lZWQgb25lIG9mIHRoZXNlIHBlciBzZXNzaW9uLgotICov Ci1zdGF0aWMgVUNvbnZlcnRlciAqaWN1X2NvbnZlcnRlciA9IE5VTEw7Ci0KLXN0YXRpYyBVQ29s bGF0b3IgKnBnX3Vjb2xfb3Blbihjb25zdCBjaGFyICpsb2Nfc3RyKTsKLXN0YXRpYyB2b2lkIGlu aXRfaWN1X2NvbnZlcnRlcih2b2lkKTsKLXN0YXRpYyBzaXplX3QgdWNoYXJfbGVuZ3RoKFVDb252 ZXJ0ZXIgKmNvbnZlcnRlciwKLQkJCQkJCSAgIGNvbnN0IGNoYXIgKnN0ciwgaW50MzJfdCBsZW4p Owotc3RhdGljIGludDMyX3QgdWNoYXJfY29udmVydChVQ29udmVydGVyICpjb252ZXJ0ZXIsCi0J CQkJCQkJIFVDaGFyICpkZXN0LCBpbnQzMl90IGRlc3RsZW4sCi0JCQkJCQkJIGNvbnN0IGNoYXIg KnNyYywgaW50MzJfdCBzcmNsZW4pOwotc3RhdGljIHZvaWQgaWN1X3NldF9jb2xsYXRpb25fYXR0 cmlidXRlcyhVQ29sbGF0b3IgKmNvbGxhdG9yLCBjb25zdCBjaGFyICpsb2MsCi0JCQkJCQkJCQkJ IFVFcnJvckNvZGUgKnN0YXR1cyk7Ci0KLXN0YXRpYyB2b2lkIFJlc291cmNlT3duZXJSZW1lbWJl clVDb2xsYXRvcihSZXNvdXJjZU93bmVyIG93bmVyLAotCQkJCQkJCQkJCSAgIFVDb2xsYXRvciAq Y29sbGF0b3IpOwotc3RhdGljIHZvaWQgUmVzT3duZXJSZWxlYXNlVUNvbGxhdG9yKERhdHVtIHZh bCk7Ci0KLXN0YXRpYyBjb25zdCBSZXNvdXJjZU93bmVyRGVzYyBVQ29sbGF0b3JSZXNvdXJjZUtp bmQgPQotewotCS5uYW1lID0gIlVDb2xsYXRvciByZWZlcmVuY2UiLAotCS5yZWxlYXNlX3BoYXNl ID0gUkVTT1VSQ0VfUkVMRUFTRV9BRlRFUl9MT0NLUywKLQkucmVsZWFzZV9wcmlvcml0eSA9IFJF TEVBU0VfUFJJT19MQVNULAotCS5SZWxlYXNlUmVzb3VyY2UgPSBSZXNPd25lclJlbGVhc2VVQ29s bGF0b3IsCi0JLkRlYnVnUHJpbnQgPSBOVUxMICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBk ZWZhdWx0IG1lc3NhZ2UgaXMgZmluZSAqLwotfTsKLSNlbmRpZgorc3RhdGljIGludAorY2hhcl9w cm9wc19idWlsdGluKHBnX3djaGFyIHdjLCBpbnQgbWFzaywgcGdfbG9jYWxlX3QgbG9jYWxlKQor eworCWludCByZXN1bHQgPSAwOworCisJaWYgKChtYXNrICYgUEdfSVNESUdJVCkgJiYgcGdfdV9p c2RpZ2l0KHdjLCB0cnVlKSkKKwkJcmVzdWx0IHw9IFBHX0lTRElHSVQ7CisJaWYgKChtYXNrICYg UEdfSVNBTFBIQSkgJiYgcGdfdV9pc2FscGhhKHdjKSkKKwkJcmVzdWx0IHw9IFBHX0lTQUxQSEE7 CisJaWYgKChtYXNrICYgUEdfSVNVUFBFUikgJiYgcGdfdV9pc3VwcGVyKHdjKSkKKwkJcmVzdWx0 IHw9IFBHX0lTVVBQRVI7CisJaWYgKChtYXNrICYgUEdfSVNMT1dFUikgJiYgcGdfdV9pc2xvd2Vy KHdjKSkKKwkJcmVzdWx0IHw9IFBHX0lTTE9XRVI7CisJaWYgKChtYXNrICYgUEdfSVNHUkFQSCkg JiYgcGdfdV9pc2dyYXBoKHdjKSkKKwkJcmVzdWx0IHw9IFBHX0lTR1JBUEg7CisJaWYgKChtYXNr ICYgUEdfSVNQUklOVCkgJiYgcGdfdV9pc3ByaW50KHdjKSkKKwkJcmVzdWx0IHw9IFBHX0lTUFJJ TlQ7CisJaWYgKChtYXNrICYgUEdfSVNQVU5DVCkgJiYgcGdfdV9pc3B1bmN0KHdjLCB0cnVlKSkK KwkJcmVzdWx0IHw9IFBHX0lTUFVOQ1Q7CisJaWYgKChtYXNrICYgUEdfSVNTUEFDRSkgJiYgcGdf dV9pc3NwYWNlKHdjKSkKKwkJcmVzdWx0IHw9IFBHX0lTU1BBQ0U7CisKKwlyZXR1cm4gcmVzdWx0 OworfQogCi1zdGF0aWMgdm9pZCBSZXNvdXJjZU93bmVyUmVtZW1iZXJMb2NhbGVUKFJlc291cmNl T3duZXIgb3duZXIsCi0JCQkJCQkJCQkJIGxvY2FsZV90IGxvY2FsZSk7Ci1zdGF0aWMgdm9pZCBS ZXNPd25lclJlbGVhc2VMb2NhbGVUKERhdHVtIHZhbCk7CitzdGF0aWMgcGdfd2NoYXIKK3RvdXBw ZXJfYnVpbHRpbihwZ193Y2hhciB3YywgcGdfbG9jYWxlX3QgbG9jYWxlKQoreworCXJldHVybiB1 bmljb2RlX3VwcGVyY2FzZV9zaW1wbGUod2MpOworfQogCi1zdGF0aWMgY29uc3QgUmVzb3VyY2VP d25lckRlc2MgTG9jYWxlVFJlc291cmNlS2luZCA9CitzdGF0aWMgcGdfd2NoYXIKK3RvbG93ZXJf YnVpbHRpbihwZ193Y2hhciB3YywgcGdfbG9jYWxlX3QgbG9jYWxlKQogewotCS5uYW1lID0gImxv Y2FsZV90IHJlZmVyZW5jZSIsCi0JLnJlbGVhc2VfcGhhc2UgPSBSRVNPVVJDRV9SRUxFQVNFX0FG VEVSX0xPQ0tTLAotCS5yZWxlYXNlX3ByaW9yaXR5ID0gUkVMRUFTRV9QUklPX0xBU1QsCi0JLlJl bGVhc2VSZXNvdXJjZSA9IFJlc093bmVyUmVsZWFzZUxvY2FsZVQsCi0JLkRlYnVnUHJpbnQgPSBO VUxMICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBkZWZhdWx0IG1lc3NhZ2UgaXMgZmluZSAq LwotfTsKKwlyZXR1cm4gdW5pY29kZV9sb3dlcmNhc2Vfc2ltcGxlKHdjKTsKK30KIAorc3RydWN0 IGN0eXBlX21ldGhvZHMgYnVpbHRpbl9jdHlwZV9tZXRob2RzID0geworCS5jaGFyX3Byb3BzID0g Y2hhcl9wcm9wc19idWlsdGluLAorCS53Y190b3VwcGVyID0gdG91cHBlcl9idWlsdGluLAorCS53 Y190b2xvd2VyID0gdG9sb3dlcl9idWlsdGluLAorfTsKIAogLyoKICAqIFBPU0lYIGRvZXNuJ3Qg ZGVmaW5lIF9sLXZhcmlhbnRzIG9mIHRoZXNlIGZ1bmN0aW9ucywgYnV0IHNldmVyYWwgc3lzdGVt cwpAQCAtMTI2MiwyMDYgKzEyNjksNiBAQCBJc29Mb2NhbGVOYW1lKGNvbnN0IGNoYXIgKndpbmxv Y25hbWUpCiAjZW5kaWYJCQkJCQkJLyogV0lOMzIgJiYgTENfTUVTU0FHRVMgKi8KIAogCi0vKiBz aW1wbGUgc3Vicm91dGluZSBmb3IgcmVwb3J0aW5nIGVycm9ycyBmcm9tIG5ld2xvY2FsZSgpICov Ci1zdGF0aWMgdm9pZAotcmVwb3J0X25ld2xvY2FsZV9mYWlsdXJlKGNvbnN0IGNoYXIgKmxvY2Fs ZW5hbWUpCi17Ci0JaW50CQkJc2F2ZV9lcnJubzsKLQotCS8qCi0JICogV2luZG93cyBkb2Vzbid0 IHByb3ZpZGUgYW55IHVzZWZ1bCBlcnJvciBpbmRpY2F0aW9uIGZyb20KLQkgKiBfY3JlYXRlX2xv Y2FsZSgpLCBhbmQgQlNELWRlcml2ZWQgcGxhdGZvcm1zIGRvbid0IHNlZW0gdG8gZmVlbCB0aGV5 Ci0JICogbmVlZCB0byBzZXQgZXJybm8gZWl0aGVyIChldmVuIHRob3VnaCBQT1NJWCBpcyBwcmV0 dHkgY2xlYXIgdGhhdAotCSAqIG5ld2xvY2FsZSBzaG91bGQgZG8gc28pLiAgU28sIGlmIGVycm5v IGhhc24ndCBiZWVuIHNldCwgYXNzdW1lIEVOT0VOVAotCSAqIGlzIHdoYXQgdG8gcmVwb3J0Lgot CSAqLwotCWlmIChlcnJubyA9PSAwKQotCQllcnJubyA9IEVOT0VOVDsKLQotCS8qCi0JICogRU5P RU5UIG1lYW5zICJubyBzdWNoIGxvY2FsZSIsIG5vdCAibm8gc3VjaCBmaWxlIiwgc28gY2xhcmlm eSB0aGF0Ci0JICogZXJybm8gd2l0aCBhbiBlcnJkZXRhaWwgbWVzc2FnZS4KLQkgKi8KLQlzYXZl X2Vycm5vID0gZXJybm87CQkJLyogYXV4aWxpYXJ5IGZ1bmNzIG1pZ2h0IGNoYW5nZSBlcnJubyAq LwotCWVyZXBvcnQoRVJST1IsCi0JCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfUEFSQU1FVEVS X1ZBTFVFKSwKLQkJCSBlcnJtc2coImNvdWxkIG5vdCBjcmVhdGUgbG9jYWxlIFwiJXNcIjogJW0i LAotCQkJCQlsb2NhbGVuYW1lKSwKLQkJCSAoc2F2ZV9lcnJubyA9PSBFTk9FTlQgPwotCQkJICBl cnJkZXRhaWwoIlRoZSBvcGVyYXRpbmcgc3lzdGVtIGNvdWxkIG5vdCBmaW5kIGFueSBsb2NhbGUg ZGF0YSBmb3IgdGhlIGxvY2FsZSBuYW1lIFwiJXNcIi4iLAotCQkJCQkJbG9jYWxlbmFtZSkgOiAw KSkpOwotfQotCi1zdGF0aWMgdm9pZAotUmVzb3VyY2VPd25lclJlbWVtYmVyTG9jYWxlVChSZXNv dXJjZU93bmVyIG93bmVyLCBsb2NhbGVfdCBsb2NhbGUpCi17Ci0JUmVzb3VyY2VPd25lclJlbWVt YmVyKG93bmVyLCBQb2ludGVyR2V0RGF0dW0obG9jYWxlKSwKLQkJCQkJCSAgJkxvY2FsZVRSZXNv dXJjZUtpbmQpOwotfQotCi1zdGF0aWMgdm9pZAotUmVzT3duZXJSZWxlYXNlTG9jYWxlVChEYXR1 bSB2YWwpCi17Ci0JbG9jYWxlX3QgbG9jYWxlID0gKGxvY2FsZV90KSBEYXR1bUdldFBvaW50ZXIo dmFsKTsKLQlmcmVlbG9jYWxlKGxvY2FsZSk7Ci19Ci0KLS8qCi0gKiBDcmVhdGUgYSBsb2NhbGVf dCB3aXRoIHRoZSBnaXZlbiBjb2xsYXRpb24gYW5kIGN0eXBlLgotICoKLSAqIFRoZSAiQyIgYW5k ICJQT1NJWCIgbG9jYWxlcyBhcmUgbm90IGFjdHVhbGx5IGhhbmRsZWQgYnkgbGliYywgc28gcmV0 dXJuCi0gKiBOVUxMLgotICoKLSAqIEVuc3VyZSB0aGF0IG5vIHBhdGggbGVha3MgYSBsb2NhbGVf dC4KLSAqLwotc3RhdGljIGxvY2FsZV90Ci1tYWtlX2xpYmNfY29sbGF0b3IoY29uc3QgY2hhciAq Y29sbGF0ZSwgY29uc3QgY2hhciAqY3R5cGUpCi17Ci0JbG9jYWxlX3QJbG9jID0gMDsKLQotCWlm IChzdHJjbXAoY29sbGF0ZSwgY3R5cGUpID09IDApCi0JewotCQlpZiAoc3RyY21wKGN0eXBlLCAi QyIpICE9IDAgJiYgc3RyY21wKGN0eXBlLCAiUE9TSVgiKSAhPSAwKQotCQl7Ci0JCQkvKiBOb3Jt YWwgY2FzZSB3aGVyZSB0aGV5J3JlIHRoZSBzYW1lICovCi0JCQllcnJubyA9IDA7Ci0jaWZuZGVm IFdJTjMyCi0JCQlsb2MgPSBuZXdsb2NhbGUoTENfQ09MTEFURV9NQVNLIHwgTENfQ1RZUEVfTUFT SywgY29sbGF0ZSwKLQkJCQkJCQlOVUxMKTsKLSNlbHNlCi0JCQlsb2MgPSBfY3JlYXRlX2xvY2Fs ZShMQ19BTEwsIGNvbGxhdGUpOwotI2VuZGlmCi0JCQlpZiAoIWxvYykKLQkJCQlyZXBvcnRfbmV3 bG9jYWxlX2ZhaWx1cmUoY29sbGF0ZSk7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLSNpZm5kZWYgV0lO MzIKLQkJLyogV2UgbmVlZCB0d28gbmV3bG9jYWxlKCkgc3RlcHMgKi8KLQkJbG9jYWxlX3QJbG9j MSA9IDA7Ci0KLQkJaWYgKHN0cmNtcChjb2xsYXRlLCAiQyIpICE9IDAgJiYgc3RyY21wKGNvbGxh dGUsICJQT1NJWCIpICE9IDApCi0JCXsKLQkJCWVycm5vID0gMDsKLQkJCWxvYzEgPSBuZXdsb2Nh bGUoTENfQ09MTEFURV9NQVNLLCBjb2xsYXRlLCBOVUxMKTsKLQkJCWlmICghbG9jMSkKLQkJCQly ZXBvcnRfbmV3bG9jYWxlX2ZhaWx1cmUoY29sbGF0ZSk7Ci0JCX0KLQotCQlpZiAoc3RyY21wKGN0 eXBlLCAiQyIpICE9IDAgJiYgc3RyY21wKGN0eXBlLCAiUE9TSVgiKSAhPSAwKQotCQl7Ci0JCQll cnJubyA9IDA7Ci0JCQlsb2MgPSBuZXdsb2NhbGUoTENfQ1RZUEVfTUFTSywgY3R5cGUsIGxvYzEp OwotCQkJaWYgKCFsb2MpCi0JCQl7Ci0JCQkJaWYgKGxvYzEpCi0JCQkJCWZyZWVsb2NhbGUobG9j MSk7Ci0JCQkJcmVwb3J0X25ld2xvY2FsZV9mYWlsdXJlKGN0eXBlKTsKLQkJCX0KLQkJfQotCQll bHNlCi0JCQlsb2MgPSBsb2MxOwotI2Vsc2UKLQotCQkvKgotCQkgKiBYWFggVGhlIF9jcmVhdGVf bG9jYWxlKCkgQVBJIGRvZXNuJ3QgYXBwZWFyIHRvIHN1cHBvcnQgdGhpcy4gQ291bGQKLQkJICog cGVyaGFwcyBiZSB3b3JrZWQgYXJvdW5kIGJ5IGNoYW5naW5nIHBnX2xvY2FsZV90IHRvIGNvbnRh aW4gdHdvCi0JCSAqIHNlcGFyYXRlIGZpZWxkcy4KLQkJICovCi0JCWVyZXBvcnQoRVJST1IsCi0J CQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAotCQkJCSBlcnJtc2co ImNvbGxhdGlvbnMgd2l0aCBkaWZmZXJlbnQgY29sbGF0ZSBhbmQgY3R5cGUgdmFsdWVzIGFyZSBu b3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0iKSkpOwotI2VuZGlmCi0JfQotCi0JcmV0dXJu IGxvYzsKLX0KLQotLyoKLSAqIENyZWF0ZSBhIFVDb2xsYXRvciB3aXRoIHRoZSBnaXZlbiBsb2Nh bGUgc3RyaW5nIGFuZCBydWxlcy4KLSAqCi0gKiBFbnN1cmUgdGhhdCBubyBwYXRoIGxlYWtzIGEg VUNvbGxhdG9yLgotICovCi0jaWZkZWYgVVNFX0lDVQotc3RhdGljIHZvaWQKLVJlc291cmNlT3du ZXJSZW1lbWJlclVDb2xsYXRvcihSZXNvdXJjZU93bmVyIG93bmVyLCBVQ29sbGF0b3IgKmNvbGxh dG9yKQotewotCVJlc291cmNlT3duZXJSZW1lbWJlcihvd25lciwgUG9pbnRlckdldERhdHVtKGNv bGxhdG9yKSwKLQkJCQkJCSAgJlVDb2xsYXRvclJlc291cmNlS2luZCk7Ci19Ci0KLXN0YXRpYyB2 b2lkCi1SZXNPd25lclJlbGVhc2VVQ29sbGF0b3IoRGF0dW0gdmFsKQotewotCVVDb2xsYXRvciAq Y29sbGF0b3IgPSAoVUNvbGxhdG9yICopIERhdHVtR2V0UG9pbnRlcih2YWwpOwotCXVjb2xfY2xv c2UoY29sbGF0b3IpOwotfQotCi1zdGF0aWMgVUNvbGxhdG9yICoKLW1ha2VfaWN1X2NvbGxhdG9y KGNvbnN0IGNoYXIgKmljdWxvY3N0ciwgY29uc3QgY2hhciAqaWN1cnVsZXMpCi17Ci0JaWYgKCFp Y3VydWxlcykKLQl7Ci0JCS8qIHNpbXBsZSBjYXNlIHdpdGhvdXQgcnVsZXMgKi8KLQkJcmV0dXJu IHBnX3Vjb2xfb3BlbihpY3Vsb2NzdHIpOwotCX0KLQllbHNlCi0JewotCQlVQ29sbGF0b3IgICpj b2xsYXRvcl9zdGRfcnVsZXM7Ci0JCVVDb2xsYXRvciAgKmNvbGxhdG9yX2FsbF9ydWxlczsKLQkJ Y29uc3QgVUNoYXIgKnN0ZF9ydWxlczsKLQkJVUNoYXIJICAgKm15X3J1bGVzOwotCQlVQ2hhcgkg ICAqYWxsX3J1bGVzOwotCQlpbnQzMl90CQlsZW5ndGg7Ci0JCWludDMyX3QJCXRvdGFsOwotCQlV RXJyb3JDb2RlCXN0YXR1czsKLQotCQkvKgotCQkgKiBJZiBydWxlcyBhcmUgc3BlY2lmaWVkLCB3 ZSBleHRyYWN0IHRoZSBydWxlcyBvZiB0aGUgc3RhbmRhcmQKLQkJICogY29sbGF0aW9uLCBhZGQg b3VyIG93biBydWxlcywgYW5kIG1ha2UgYSBuZXcgY29sbGF0b3Igd2l0aCB0aGUKLQkJICogY29t YmluZWQgcnVsZXMuCi0JCSAqLwotCQlpY3VfdG9fdWNoYXIoJm15X3J1bGVzLCBpY3VydWxlcywg c3RybGVuKGljdXJ1bGVzKSk7Ci0KLQkJY29sbGF0b3Jfc3RkX3J1bGVzID0gcGdfdWNvbF9vcGVu KGljdWxvY3N0cik7Ci0KLQkJc3RkX3J1bGVzID0gdWNvbF9nZXRSdWxlcyhjb2xsYXRvcl9zdGRf cnVsZXMsICZsZW5ndGgpOwotCi0JCXRvdGFsID0gdV9zdHJsZW4oc3RkX3J1bGVzKSArIHVfc3Ry bGVuKG15X3J1bGVzKSArIDE7Ci0KLQkJLyogYXZvaWQgbGVha2luZyBjb2xsYXRvciBvbiBPT00g Ki8KLQkJYWxsX3J1bGVzID0gcGFsbG9jX2V4dGVuZGVkKHNpemVvZihVQ2hhcikgKiB0b3RhbCwg TUNYVF9BTExPQ19OT19PT00pOwotCQlpZiAoIWFsbF9ydWxlcykKLQkJewotCQkJdWNvbF9jbG9z ZShjb2xsYXRvcl9zdGRfcnVsZXMpOwotCQkJZXJlcG9ydChFUlJPUiwKLQkJCQkJKGVycmNvZGUo RVJSQ09ERV9PVVRfT0ZfTUVNT1JZKSwKLQkJCQkJIGVycm1zZygib3V0IG9mIG1lbW9yeSIpKSk7 Ci0JCX0KLQotCQl1X3N0cmNweShhbGxfcnVsZXMsIHN0ZF9ydWxlcyk7Ci0JCXVfc3RyY2F0KGFs bF9ydWxlcywgbXlfcnVsZXMpOwotCi0JCXVjb2xfY2xvc2UoY29sbGF0b3Jfc3RkX3J1bGVzKTsK LQotCQlzdGF0dXMgPSBVX1pFUk9fRVJST1I7Ci0JCWNvbGxhdG9yX2FsbF9ydWxlcyA9IHVjb2xf b3BlblJ1bGVzKGFsbF9ydWxlcywgdV9zdHJsZW4oYWxsX3J1bGVzKSwKLQkJCQkJCQkJCQkJVUNP TF9ERUZBVUxULCBVQ09MX0RFRkFVTFRfU1RSRU5HVEgsCi0JCQkJCQkJCQkJCU5VTEwsICZzdGF0 dXMpOwotCQlpZiAoVV9GQUlMVVJFKHN0YXR1cykpCi0JCXsKLQkJCWVyZXBvcnQoRVJST1IsCi0J CQkJCShlcnJjb2RlKEVSUkNPREVfSU5WQUxJRF9QQVJBTUVURVJfVkFMVUUpLAotCQkJCQkgZXJy bXNnKCJjb3VsZCBub3Qgb3BlbiBjb2xsYXRvciBmb3IgbG9jYWxlIFwiJXNcIiB3aXRoIHJ1bGVz IFwiJXNcIjogJXMiLAotCQkJCQkJCWljdWxvY3N0ciwgaWN1cnVsZXMsIHVfZXJyb3JOYW1lKHN0 YXR1cykpKSk7Ci0JCX0KLQotCQlyZXR1cm4gY29sbGF0b3JfYWxsX3J1bGVzOwotCX0KLX0KLSNl bmRpZgkJCQkJCQkvKiBub3QgVVNFX0lDVSAqLwotCiAvKgogICogSW5pdGlhbGl6ZSBkZWZhdWx0 X2xvY2FsZSB3aXRoIGRhdGFiYXNlIGxvY2FsZSBzZXR0aW5ncy4KICAqLwpAQCAtMTQ3MSw2ICsx Mjc4LDcgQEAgaW5pdF9kYXRhYmFzZV9jb2xsYXRpb24odm9pZCkKIAlIZWFwVHVwbGUJdHVwOwog CUZvcm1fcGdfZGF0YWJhc2UgZGJmb3JtOwogCURhdHVtCQlkYXR1bTsKKwlwZ19sb2NhbGVfdAly ZXN1bHQgPSBOVUxMOwogCiAJLyogRmV0Y2ggb3VyIHBnX2RhdGFiYXNlIHJvdyBub3JtYWxseSwg dmlhIHN5c2NhY2hlICovCiAJdHVwID0gU2VhcmNoU3lzQ2FjaGUxKERBVEFCQVNFT0lELCBPYmpl Y3RJZEdldERhdHVtKE15RGF0YWJhc2VJZCkpOwpAQCAtMTQ4Nyw3MCArMTI5NSwzOCBAQCBpbml0 X2RhdGFiYXNlX2NvbGxhdGlvbih2b2lkKQogCiAJCWJ1aWx0aW5fdmFsaWRhdGVfbG9jYWxlKGRi Zm9ybS0+ZW5jb2RpbmcsIGRhdGxvY2FsZSk7CiAKLQkJZGVmYXVsdF9sb2NhbGUuY29sbGF0ZV9p c19jID0gdHJ1ZTsKLQkJZGVmYXVsdF9sb2NhbGUuY3R5cGVfaXNfYyA9IChzdHJjbXAoZGF0bG9j YWxlLCAiQyIpID09IDApOwotCi0JCWRlZmF1bHRfbG9jYWxlLmluZm8uYnVpbHRpbi5sb2NhbGUg PSBNZW1vcnlDb250ZXh0U3RyZHVwKAorCQlyZXN1bHQgPSBNZW1vcnlDb250ZXh0QWxsb2NaZXJv KFRvcE1lbW9yeUNvbnRleHQsCisJCQkJCQkJCQkJc2l6ZW9mKHN0cnVjdCBwZ19sb2NhbGVfc3Ry dWN0KSk7CisJCXJlc3VsdC0+aW5mby5idWlsdGluLmxvY2FsZSA9IE1lbW9yeUNvbnRleHRTdHJk dXAoCiAJCQkJCQkJCQkJCQkJCQkJIFRvcE1lbW9yeUNvbnRleHQsIGRhdGxvY2FsZSk7Ci0JfQot CWVsc2UgaWYgKGRiZm9ybS0+ZGF0bG9jcHJvdmlkZXIgPT0gQ09MTFBST1ZJREVSX0lDVSkKLQl7 Ci0jaWZkZWYgVVNFX0lDVQotCQljaGFyCSAgICpkYXRsb2NhbGU7Ci0JCWNoYXIJICAgKmljdXJ1 bGVzOwotCQlib29sCQlpc251bGw7Ci0KLQkJZGF0dW0gPSBTeXNDYWNoZUdldEF0dHJOb3ROdWxs KERBVEFCQVNFT0lELCB0dXAsIEFudW1fcGdfZGF0YWJhc2VfZGF0bG9jYWxlKTsKLQkJZGF0bG9j YWxlID0gVGV4dERhdHVtR2V0Q1N0cmluZyhkYXR1bSk7Ci0KLQkJZGVmYXVsdF9sb2NhbGUuY29s bGF0ZV9pc19jID0gZmFsc2U7Ci0JCWRlZmF1bHRfbG9jYWxlLmN0eXBlX2lzX2MgPSBmYWxzZTsK KwkJcmVzdWx0LT5jb2xsYXRlX2lzX2MgPSB0cnVlOworCQlyZXN1bHQtPmN0eXBlX2lzX2MgPSAo c3RyY21wKGRhdGxvY2FsZSwgIkMiKSA9PSAwKTsKIAotCQlkYXR1bSA9IFN5c0NhY2hlR2V0QXR0 cihEQVRBQkFTRU9JRCwgdHVwLCBBbnVtX3BnX2RhdGFiYXNlX2RhdGljdXJ1bGVzLCAmaXNudWxs KTsKLQkJaWYgKCFpc251bGwpCi0JCQlpY3VydWxlcyA9IFRleHREYXR1bUdldENTdHJpbmcoZGF0 dW0pOwotCQllbHNlCi0JCQlpY3VydWxlcyA9IE5VTEw7CisJCWlmICghcmVzdWx0LT5jdHlwZV9p c19jKQorCQkJcmVzdWx0LT5jdHlwZSA9ICZidWlsdGluX2N0eXBlX21ldGhvZHM7CiAKLQkJZGVm YXVsdF9sb2NhbGUuaW5mby5pY3UubG9jYWxlID0gTWVtb3J5Q29udGV4dFN0cmR1cChUb3BNZW1v cnlDb250ZXh0LCBkYXRsb2NhbGUpOwotCQlkZWZhdWx0X2xvY2FsZS5pbmZvLmljdS51Y29sID0g bWFrZV9pY3VfY29sbGF0b3IoZGF0bG9jYWxlLCBpY3VydWxlcyk7Ci0jZWxzZQkJCQkJCQkvKiBu b3QgVVNFX0lDVSAqLwotCQkvKiBjb3VsZCBnZXQgaGVyZSBpZiBhIGNvbGxhdGlvbiB3YXMgY3Jl YXRlZCBieSBhIGJ1aWxkIHdpdGggSUNVICovCi0JCWVyZXBvcnQoRVJST1IsCi0JCQkJKGVycmNv ZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAotCQkJCSBlcnJtc2coIklDVSBpcyBu b3Qgc3VwcG9ydGVkIGluIHRoaXMgYnVpbGQiKSkpOwotI2VuZGlmCQkJCQkJCS8qIG5vdCBVU0Vf SUNVICovCiAJfQorI2lmZGVmIFVTRV9JQ1UKKwllbHNlIGlmIChkYmZvcm0tPmRhdGxvY3Byb3Zp ZGVyID09IENPTExQUk9WSURFUl9JQ1UpCisJCXJlc3VsdCA9IGljdV9kYXRfY3JlYXRlX2xvY2Fs ZSh0dXApOworI2VuZGlmCQkJCQkJCS8qIG5vdCBVU0VfSUNVICovCisJZWxzZSBpZiAoZGJmb3Jt LT5kYXRsb2Nwcm92aWRlciA9PSBDT0xMUFJPVklERVJfTElCQykKKwkJcmVzdWx0ID0gbGliY19k YXRfY3JlYXRlX2xvY2FsZSh0dXApOwogCWVsc2UKLQl7Ci0JCWNvbnN0IGNoYXIgKmRhdGNvbGxh dGU7Ci0JCWNvbnN0IGNoYXIgKmRhdGN0eXBlOwotCi0JCUFzc2VydChkYmZvcm0tPmRhdGxvY3By b3ZpZGVyID09IENPTExQUk9WSURFUl9MSUJDKTsKLQotCQlkYXR1bSA9IFN5c0NhY2hlR2V0QXR0 ck5vdE51bGwoREFUQUJBU0VPSUQsIHR1cCwgQW51bV9wZ19kYXRhYmFzZV9kYXRjb2xsYXRlKTsK LQkJZGF0Y29sbGF0ZSA9IFRleHREYXR1bUdldENTdHJpbmcoZGF0dW0pOwotCQlkYXR1bSA9IFN5 c0NhY2hlR2V0QXR0ck5vdE51bGwoREFUQUJBU0VPSUQsIHR1cCwgQW51bV9wZ19kYXRhYmFzZV9k YXRjdHlwZSk7Ci0JCWRhdGN0eXBlID0gVGV4dERhdHVtR2V0Q1N0cmluZyhkYXR1bSk7Ci0KLQkJ ZGVmYXVsdF9sb2NhbGUuY29sbGF0ZV9pc19jID0gKHN0cmNtcChkYXRjb2xsYXRlLCAiQyIpID09 IDApIHx8Ci0JCQkoc3RyY21wKGRhdGNvbGxhdGUsICJQT1NJWCIpID09IDApOwotCQlkZWZhdWx0 X2xvY2FsZS5jdHlwZV9pc19jID0gKHN0cmNtcChkYXRjdHlwZSwgIkMiKSA9PSAwKSB8fAotCQkJ KHN0cmNtcChkYXRjdHlwZSwgIlBPU0lYIikgPT0gMCk7CisJCVBHTE9DQUxFX1NVUFBPUlRfRVJS T1IoZGJmb3JtLT5kYXRsb2Nwcm92aWRlcik7CiAKLQkJZGVmYXVsdF9sb2NhbGUuaW5mby5sdCA9 IG1ha2VfbGliY19jb2xsYXRvcihkYXRjb2xsYXRlLCBkYXRjdHlwZSk7Ci0JfQotCi0JZGVmYXVs dF9sb2NhbGUucHJvdmlkZXIgPSBkYmZvcm0tPmRhdGxvY3Byb3ZpZGVyOworCXJlc3VsdC0+cHJv dmlkZXIgPSBkYmZvcm0tPmRhdGxvY3Byb3ZpZGVyOwogCiAJLyoKIAkgKiBEZWZhdWx0IGxvY2Fs ZSBpcyBjdXJyZW50bHkgYWx3YXlzIGRldGVybWluaXN0aWMuICBOb25kZXRlcm1pbmlzdGljCiAJ ICogbG9jYWxlcyBjdXJyZW50bHkgZG9uJ3Qgc3VwcG9ydCBwYXR0ZXJuIG1hdGNoaW5nLCB3aGlj aCB3b3VsZCBicmVhayBhCiAJICogbG90IG9mIHRoaW5ncyBpZiBhcHBsaWVkIGdsb2JhbGx5Lgog CSAqLwotCWRlZmF1bHRfbG9jYWxlLmRldGVybWluaXN0aWMgPSB0cnVlOworCXJlc3VsdC0+ZGV0 ZXJtaW5pc3RpYyA9IHRydWU7CiAKIAlSZWxlYXNlU3lzQ2FjaGUodHVwKTsKKworCWRlZmF1bHRf bG9jYWxlID0gcmVzdWx0OwogfQogCiAvKgpAQCAtMTU1OCwxMiArMTMzNCwxMiBAQCBpbml0X2Rh dGFiYXNlX2NvbGxhdGlvbih2b2lkKQogICogYWxsb2NhdGluZyBtZW1vcnkuCiAgKi8KIHN0YXRp YyBwZ19sb2NhbGVfdAotY3JlYXRlX3BnX2xvY2FsZShNZW1vcnlDb250ZXh0IGNvbnRleHQsIFJl c291cmNlT3duZXIgb3duZXIsIE9pZCBjb2xsaWQpCitjcmVhdGVfcGdfbG9jYWxlKE1lbW9yeUNv bnRleHQgY29udGV4dCwgUmVzb3VyY2VPd25lciByZXNvd25lciwgT2lkIGNvbGxpZCkKIHsKIAkv KiBXZSBoYXZlbid0IGNvbXB1dGVkIHRoaXMgeWV0IGluIHRoaXMgc2Vzc2lvbiwgc28gZG8gaXQg Ki8KIAlIZWFwVHVwbGUJdHA7CiAJRm9ybV9wZ19jb2xsYXRpb24gY29sbGZvcm07Ci0JcGdfbG9j YWxlX3QgcmVzdWx0OworCXBnX2xvY2FsZV90IHJlc3VsdCA9IE5VTEw7CiAJRGF0dW0JCWRhdHVt OwogCWJvb2wJCWlzbnVsbDsKIApAQCAtMTYzMSw2NSArMTQwNywxOSBAQCBjcmVhdGVfcGdfbG9j YWxlKE1lbW9yeUNvbnRleHQgY29udGV4dCwgUmVzb3VyY2VPd25lciBvd25lciwgT2lkIGNvbGxp ZCkKIAkJcmVzdWx0LT5kZXRlcm1pbmlzdGljID0gY29sbGZvcm0tPmNvbGxpc2RldGVybWluaXN0 aWM7CiAJCXJlc3VsdC0+Y29sbGF0ZV9pc19jID0gdHJ1ZTsKIAkJcmVzdWx0LT5jdHlwZV9pc19j ID0gKHN0cmNtcChsb2NzdHIsICJDIikgPT0gMCk7CisJCWlmICghcmVzdWx0LT5jdHlwZV9pc19j KQorCQkJcmVzdWx0LT5jdHlwZSA9ICZidWlsdGluX2N0eXBlX21ldGhvZHM7CiAJCXJlc3VsdC0+ aW5mby5idWlsdGluLmxvY2FsZSA9IE1lbW9yeUNvbnRleHRTdHJkdXAoY29udGV4dCwKIAkJCQkJ CQkJCQkJCQkJICBsb2NzdHIpOwogCX0KLQllbHNlIGlmIChjb2xsZm9ybS0+Y29sbHByb3ZpZGVy ID09IENPTExQUk9WSURFUl9MSUJDKQotCXsKLQkJY29uc3QgY2hhciAqY29sbGNvbGxhdGU7Ci0J CWNvbnN0IGNoYXIgKmNvbGxjdHlwZTsKLQkJbG9jYWxlX3QJbG9jYWxlOwotCi0JCWRhdHVtID0g U3lzQ2FjaGVHZXRBdHRyTm90TnVsbChDT0xMT0lELCB0cCwgQW51bV9wZ19jb2xsYXRpb25fY29s bGNvbGxhdGUpOwotCQljb2xsY29sbGF0ZSA9IFRleHREYXR1bUdldENTdHJpbmcoZGF0dW0pOwot CQlkYXR1bSA9IFN5c0NhY2hlR2V0QXR0ck5vdE51bGwoQ09MTE9JRCwgdHAsIEFudW1fcGdfY29s bGF0aW9uX2NvbGxjdHlwZSk7Ci0JCWNvbGxjdHlwZSA9IFRleHREYXR1bUdldENTdHJpbmcoZGF0 dW0pOwotCi0JCVJlc291cmNlT3duZXJFbmxhcmdlKG93bmVyKTsKLQkJbG9jYWxlID0gbWFrZV9s aWJjX2NvbGxhdG9yKGNvbGxjb2xsYXRlLCBjb2xsY3R5cGUpOwotCQlpZiAobG9jYWxlKQotCQkJ UmVzb3VyY2VPd25lclJlbWVtYmVyTG9jYWxlVChvd25lciwgbG9jYWxlKTsKLQotCQlyZXN1bHQg PSBNZW1vcnlDb250ZXh0QWxsb2NaZXJvKGNvbnRleHQsCi0JCQkJCQkJCQkJc2l6ZW9mKHN0cnVj dCBwZ19sb2NhbGVfc3RydWN0KSk7Ci0KLQkJcmVzdWx0LT5wcm92aWRlciA9IGNvbGxmb3JtLT5j b2xscHJvdmlkZXI7Ci0JCXJlc3VsdC0+ZGV0ZXJtaW5pc3RpYyA9IGNvbGxmb3JtLT5jb2xsaXNk ZXRlcm1pbmlzdGljOwotCQlyZXN1bHQtPmNvbGxhdGVfaXNfYyA9IChzdHJjbXAoY29sbGNvbGxh dGUsICJDIikgPT0gMCkgfHwKLQkJCShzdHJjbXAoY29sbGNvbGxhdGUsICJQT1NJWCIpID09IDAp OwotCQlyZXN1bHQtPmN0eXBlX2lzX2MgPSAoc3RyY21wKGNvbGxjdHlwZSwgIkMiKSA9PSAwKSB8 fAotCQkJKHN0cmNtcChjb2xsY3R5cGUsICJQT1NJWCIpID09IDApOwotCQlyZXN1bHQtPmluZm8u bHQgPSBsb2NhbGU7Ci0JfQorI2lmZGVmIFVTRV9JQ1UKIAllbHNlIGlmIChjb2xsZm9ybS0+Y29s bHByb3ZpZGVyID09IENPTExQUk9WSURFUl9JQ1UpCi0JewotCQljb25zdCBjaGFyICppY3Vsb2Nz dHI7Ci0JCWNvbnN0IGNoYXIgKmljdXJ1bGVzOwotCQlVQ29sbGF0b3IgICpjb2xsYXRvcjsKLQot CQlkYXR1bSA9IFN5c0NhY2hlR2V0QXR0ck5vdE51bGwoQ09MTE9JRCwgdHAsIEFudW1fcGdfY29s bGF0aW9uX2NvbGxsb2NhbGUpOwotCQlpY3Vsb2NzdHIgPSBUZXh0RGF0dW1HZXRDU3RyaW5nKGRh dHVtKTsKLQotCQlkYXR1bSA9IFN5c0NhY2hlR2V0QXR0cihDT0xMT0lELCB0cCwgQW51bV9wZ19j b2xsYXRpb25fY29sbGljdXJ1bGVzLCAmaXNudWxsKTsKLQkJaWYgKCFpc251bGwpCi0JCQlpY3Vy dWxlcyA9IFRleHREYXR1bUdldENTdHJpbmcoZGF0dW0pOwotCQllbHNlCi0JCQlpY3VydWxlcyA9 IE5VTEw7Ci0KLQkJUmVzb3VyY2VPd25lckVubGFyZ2Uob3duZXIpOwotCQljb2xsYXRvciA9IG1h a2VfaWN1X2NvbGxhdG9yKGljdWxvY3N0ciwgaWN1cnVsZXMpOwotCQlSZXNvdXJjZU93bmVyUmVt ZW1iZXJVQ29sbGF0b3Iob3duZXIsIGNvbGxhdG9yKTsKLQotCQlyZXN1bHQgPSBNZW1vcnlDb250 ZXh0QWxsb2NaZXJvKGNvbnRleHQsCi0JCQkJCQkJCQkJc2l6ZW9mKHN0cnVjdCBwZ19sb2NhbGVf c3RydWN0KSk7Ci0KLQkJcmVzdWx0LT5wcm92aWRlciA9IGNvbGxmb3JtLT5jb2xscHJvdmlkZXI7 Ci0JCXJlc3VsdC0+ZGV0ZXJtaW5pc3RpYyA9IGNvbGxmb3JtLT5jb2xsaXNkZXRlcm1pbmlzdGlj OwotCQlyZXN1bHQtPmNvbGxhdGVfaXNfYyA9IGZhbHNlOwotCQlyZXN1bHQtPmN0eXBlX2lzX2Mg PSBmYWxzZTsKLQkJcmVzdWx0LT5pbmZvLmljdS5sb2NhbGUgPSBNZW1vcnlDb250ZXh0U3RyZHVw KGNvbnRleHQsIGljdWxvY3N0cik7Ci0JCXJlc3VsdC0+aW5mby5pY3UudWNvbCA9IGNvbGxhdG9y OwotCX0KKwkJcmVzdWx0ID0gaWN1X2NvbGxfY3JlYXRlX2xvY2FsZShjb250ZXh0LCByZXNvd25l ciwgdHApOworI2VuZGlmCisJZWxzZSBpZiAoY29sbGZvcm0tPmNvbGxwcm92aWRlciA9PSBDT0xM UFJPVklERVJfTElCQykKKwkJcmVzdWx0ID0gbGliY19jb2xsX2NyZWF0ZV9sb2NhbGUoY29udGV4 dCwgcmVzb3duZXIsIHRwKTsKKwllbHNlCisJCVBHTE9DQUxFX1NVUFBPUlRfRVJST1IoY29sbGZv cm0tPmNvbGxwcm92aWRlcik7CiAKIAlSZWxlYXNlU3lzQ2FjaGUodHApOwogCkBAIC0xNzM1LDcg KzE0NjUsNyBAQCBwZ19uZXdsb2NhbGVfZnJvbV9jb2xsYXRpb24oT2lkIGNvbGxpZCkKIAlib29s CQkJCQkgZm91bmQ7CiAKIAlpZiAoY29sbGlkID09IERFRkFVTFRfQ09MTEFUSU9OX09JRCkKLQkJ cmV0dXJuICZkZWZhdWx0X2xvY2FsZTsKKwkJcmV0dXJuIGRlZmF1bHRfbG9jYWxlOwogCiAJaWYg KCFPaWRJc1ZhbGlkKGNvbGxpZCkpCiAJCWVsb2coRVJST1IsICJjYWNoZSBsb29rdXAgZmFpbGVk IGZvciBjb2xsYXRpb24gJXUiLCBjb2xsaWQpOwpAQCAtMTg4Niw0ODMgKzE2MTYsNDggQEAgZ2V0 X2NvbGxhdGlvbl9hY3R1YWxfdmVyc2lvbihjaGFyIGNvbGxwcm92aWRlciwgY29uc3QgY2hhciAq Y29sbGNvbGxhdGUpCiB9CiAKIC8qCi0gKiBzdHJuY29sbF9saWJjX3dpbjMyX3V0ZjgKLSAqCi0g KiBXaW4zMiBkb2VzIG5vdCBoYXZlIFVURi04LiBDb252ZXJ0IFVURjggYXJndW1lbnRzIHRvIHdp ZGUgY2hhcmFjdGVycyBhbmQKLSAqIGludm9rZSB3Y3Njb2xsX2woKS4KKyAqIHBnX3N0cmNvbGwK ICAqCi0gKiBBbiBpbnB1dCBzdHJpbmcgbGVuZ3RoIG9mIC0xIG1lYW5zIHRoYXQgaXQncyBOVUwt dGVybWluYXRlZC4KKyAqIExpa2UgcGdfc3RybmNvbGwgZm9yIE5VTC10ZXJtaW5hdGVkIGlucHV0 IHN0cmluZ3MuCiAgKi8KLSNpZmRlZiBXSU4zMgotc3RhdGljIGludAotc3RybmNvbGxfbGliY193 aW4zMl91dGY4KGNvbnN0IGNoYXIgKmFyZzEsIHNzaXplX3QgbGVuMSwgY29uc3QgY2hhciAqYXJn MiwKLQkJCQkJCSBzc2l6ZV90IGxlbjIsIHBnX2xvY2FsZV90IGxvY2FsZSkKK2ludAorcGdfc3Ry Y29sbChjb25zdCBjaGFyICphcmcxLCBjb25zdCBjaGFyICphcmcyLCBwZ19sb2NhbGVfdCBsb2Nh bGUpCiB7Ci0JY2hhcgkJc2J1ZltURVhUQlVGTEVOXTsKLQljaGFyCSAgICpidWYgPSBzYnVmOwot CWNoYXIJICAgKmExcCwKLQkJCSAgICphMnA7Ci0JaW50CQkJYTFsZW47Ci0JaW50CQkJYTJsZW47 Ci0JaW50CQkJcjsKLQlpbnQJCQlyZXN1bHQ7Ci0KLQlBc3NlcnQobG9jYWxlLT5wcm92aWRlciA9 PSBDT0xMUFJPVklERVJfTElCQyk7Ci0JQXNzZXJ0KEdldERhdGFiYXNlRW5jb2RpbmcoKSA9PSBQ R19VVEY4KTsKLSNpZm5kZWYgV0lOMzIKLQlBc3NlcnQoZmFsc2UpOwotI2VuZGlmCi0KLQlpZiAo bGVuMSA9PSAtMSkKLQkJbGVuMSA9IHN0cmxlbihhcmcxKTsKLQlpZiAobGVuMiA9PSAtMSkKLQkJ bGVuMiA9IHN0cmxlbihhcmcyKTsKLQotCWExbGVuID0gbGVuMSAqIDIgKyAyOwotCWEybGVuID0g bGVuMiAqIDIgKyAyOwotCi0JaWYgKGExbGVuICsgYTJsZW4gPiBURVhUQlVGTEVOKQotCQlidWYg PSBwYWxsb2MoYTFsZW4gKyBhMmxlbik7Ci0KLQlhMXAgPSBidWY7Ci0JYTJwID0gYnVmICsgYTFs ZW47Ci0KLQkvKiBBUEkgZG9lcyBub3Qgd29yayBmb3IgemVyby1sZW5ndGggaW5wdXQgKi8KLQlp ZiAobGVuMSA9PSAwKQotCQlyID0gMDsKLQllbHNlCi0JewotCQlyID0gTXVsdGlCeXRlVG9XaWRl Q2hhcihDUF9VVEY4LCAwLCBhcmcxLCBsZW4xLAotCQkJCQkJCQkoTFBXU1RSKSBhMXAsIGExbGVu IC8gMik7Ci0JCWlmICghcikKLQkJCWVyZXBvcnQoRVJST1IsCi0JCQkJCShlcnJtc2coImNvdWxk IG5vdCBjb252ZXJ0IHN0cmluZyB0byBVVEYtMTY6IGVycm9yIGNvZGUgJWx1IiwKLQkJCQkJCQlH ZXRMYXN0RXJyb3IoKSkpKTsKLQl9Ci0JKChMUFdTVFIpIGExcClbcl0gPSAwOwotCi0JaWYgKGxl bjIgPT0gMCkKLQkJciA9IDA7Ci0JZWxzZQotCXsKLQkJciA9IE11bHRpQnl0ZVRvV2lkZUNoYXIo Q1BfVVRGOCwgMCwgYXJnMiwgbGVuMiwKLQkJCQkJCQkJKExQV1NUUikgYTJwLCBhMmxlbiAvIDIp OwotCQlpZiAoIXIpCi0JCQllcmVwb3J0KEVSUk9SLAotCQkJCQkoZXJybXNnKCJjb3VsZCBub3Qg Y29udmVydCBzdHJpbmcgdG8gVVRGLTE2OiBlcnJvciBjb2RlICVsdSIsCi0JCQkJCQkJR2V0TGFz dEVycm9yKCkpKSk7Ci0JfQotCSgoTFBXU1RSKSBhMnApW3JdID0gMDsKLQotCWVycm5vID0gMDsK LQlyZXN1bHQgPSB3Y3Njb2xsX2woKExQV1NUUikgYTFwLCAoTFBXU1RSKSBhMnAsIGxvY2FsZS0+ aW5mby5sdCk7Ci0JaWYgKHJlc3VsdCA9PSAyMTQ3NDgzNjQ3KQkvKiBfTkxTQ01QRVJST1I7IG1p c3NpbmcgZnJvbSBtaW5ndyBoZWFkZXJzICovCi0JCWVyZXBvcnQoRVJST1IsCi0JCQkJKGVycm1z ZygiY291bGQgbm90IGNvbXBhcmUgVW5pY29kZSBzdHJpbmdzOiAlbSIpKSk7Ci0KLQlpZiAoYnVm ICE9IHNidWYpCi0JCXBmcmVlKGJ1Zik7Ci0KLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiBsb2Nh bGUtPmNvbGxhdGUtPnN0cm5jb2xsKGFyZzEsIC0xLCBhcmcyLCAtMSwgbG9jYWxlKTsKIH0KLSNl bmRpZgkJCQkJCQkvKiBXSU4zMiAqLwogCiAvKgotICogc3RybmNvbGxfbGliYworICogcGdfc3Ry bmNvbGwKKyAqCisgKiBDYWxsIHVjb2xfc3RyY29sbFVURjgoKSwgdWNvbF9zdHJjb2xsKCksIHN0 cmNvbGxfbCgpIG9yIHdjc2NvbGxfbCgpIGFzCisgKiBhcHByb3ByaWF0ZSBmb3IgdGhlIGdpdmVu IGxvY2FsZSwgcGxhdGZvcm0sIGFuZCBkYXRhYmFzZSBlbmNvZGluZy4gSWYgdGhlCisgKiBsb2Nh bGUgaXMgbm90IHNwZWNpZmllZCwgdXNlIHRoZSBkYXRhYmFzZSBjb2xsYXRpb24uCisgKgorICog VGhlIGlucHV0IHN0cmluZ3MgbXVzdCBiZSBlbmNvZGVkIGluIHRoZSBkYXRhYmFzZSBlbmNvZGlu Zy4gSWYgYW4gaW5wdXQKKyAqIHN0cmluZyBpcyBOVUwtdGVybWluYXRlZCwgaXRzIGxlbmd0aCBt YXkgYmUgc3BlY2lmaWVkIGFzIC0xLgogICoKLSAqIEFuIGlucHV0IHN0cmluZyBsZW5ndGggb2Yg LTEgbWVhbnMgdGhhdCBpdCdzIE5VTC10ZXJtaW5hdGVkLgorICogVGhlIGNhbGxlciBpcyByZXNw b25zaWJsZSBmb3IgYnJlYWtpbmcgdGllcyBpZiB0aGUgY29sbGF0aW9uIGlzCisgKiBkZXRlcm1p bmlzdGljOyB0aGlzIG1haW50YWlucyBjb25zaXN0ZW5jeSB3aXRoIHBnX3N0cm54ZnJtKCksIHdo aWNoIGNhbm5vdAorICogZWFzaWx5IGFjY291bnQgZm9yIGRldGVybWluaXN0aWMgY29sbGF0aW9u cy4KICAqLwotc3RhdGljIGludAotc3RybmNvbGxfbGliYyhjb25zdCBjaGFyICphcmcxLCBzc2l6 ZV90IGxlbjEsIGNvbnN0IGNoYXIgKmFyZzIsIHNzaXplX3QgbGVuMiwKLQkJCSAgcGdfbG9jYWxl X3QgbG9jYWxlKQoraW50CitwZ19zdHJuY29sbChjb25zdCBjaGFyICphcmcxLCBzc2l6ZV90IGxl bjEsIGNvbnN0IGNoYXIgKmFyZzIsIHNzaXplX3QgbGVuMiwKKwkJCXBnX2xvY2FsZV90IGxvY2Fs ZSkKIHsKLQljaGFyCQlzYnVmW1RFWFRCVUZMRU5dOwotCWNoYXIJICAgKmJ1ZiA9IHNidWY7Ci0J c2l6ZV90CQlidWZzaXplMSA9IChsZW4xID09IC0xKSA/IDAgOiBsZW4xICsgMTsKLQlzaXplX3QJ CWJ1ZnNpemUyID0gKGxlbjIgPT0gLTEpID8gMCA6IGxlbjIgKyAxOwotCWNvbnN0IGNoYXIgKmFy ZzFuOwotCWNvbnN0IGNoYXIgKmFyZzJuOwotCWludAkJCXJlc3VsdDsKLQotCUFzc2VydChsb2Nh bGUtPnByb3ZpZGVyID09IENPTExQUk9WSURFUl9MSUJDKTsKLQotI2lmZGVmIFdJTjMyCi0JLyog Y2hlY2sgZm9yIHRoaXMgY2FzZSBiZWZvcmUgZG9pbmcgdGhlIHdvcmsgZm9yIG51bC10ZXJtaW5h dGlvbiAqLwotCWlmIChHZXREYXRhYmFzZUVuY29kaW5nKCkgPT0gUEdfVVRGOCkKLQkJcmV0dXJu IHN0cm5jb2xsX2xpYmNfd2luMzJfdXRmOChhcmcxLCBsZW4xLCBhcmcyLCBsZW4yLCBsb2NhbGUp OwotI2VuZGlmCQkJCQkJCS8qIFdJTjMyICovCi0KLQlpZiAoYnVmc2l6ZTEgKyBidWZzaXplMiA+ IFRFWFRCVUZMRU4pCi0JCWJ1ZiA9IHBhbGxvYyhidWZzaXplMSArIGJ1ZnNpemUyKTsKLQotCS8q IG51bC10ZXJtaW5hdGUgYXJndW1lbnRzIGlmIG5lY2Vzc2FyeSAqLwotCWlmIChsZW4xID09IC0x KQotCXsKLQkJYXJnMW4gPSBhcmcxOwotCX0KLQllbHNlCi0JewotCQljaGFyICpidWYxID0gYnVm OwotCQltZW1jcHkoYnVmMSwgYXJnMSwgbGVuMSk7Ci0JCWJ1ZjFbbGVuMV0gPSAnXDAnOwotCQlh cmcxbiA9IGJ1ZjE7Ci0JfQotCi0JaWYgKGxlbjIgPT0gLTEpCi0JewotCQlhcmcybiA9IGFyZzI7 Ci0JfQotCWVsc2UKLQl7Ci0JCWNoYXIgKmJ1ZjIgPSBidWYgKyBidWZzaXplMTsKLQkJbWVtY3B5 KGJ1ZjIsIGFyZzIsIGxlbjIpOwotCQlidWYyW2xlbjJdID0gJ1wwJzsKLQkJYXJnMm4gPSBidWYy OwotCX0KLQotCXJlc3VsdCA9IHN0cmNvbGxfbChhcmcxbiwgYXJnMm4sIGxvY2FsZS0+aW5mby5s dCk7Ci0KLQlpZiAoYnVmICE9IHNidWYpCi0JCXBmcmVlKGJ1Zik7Ci0KLQlyZXR1cm4gcmVzdWx0 OworCXJldHVybiBsb2NhbGUtPmNvbGxhdGUtPnN0cm5jb2xsKGFyZzEsIGxlbjEsIGFyZzIsIGxl bjIsIGxvY2FsZSk7CiB9CiAKLSNpZmRlZiBVU0VfSUNVCi0KIC8qCi0gKiBzdHJuY29sbF9pY3Vf bm9fdXRmOAorICogUmV0dXJuIHRydWUgaWYgdGhlIGNvbGxhdGlvbiBwcm92aWRlciBzdXBwb3J0 cyBwZ19zdHJ4ZnJtKCkgYW5kCisgKiBwZ19zdHJueGZybSgpOyBvdGhlcndpc2UgZmFsc2UuCiAg KgotICogQ29udmVydCB0aGUgYXJndW1lbnRzIGZyb20gdGhlIGRhdGFiYXNlIGVuY29kaW5nIHRv IFVDaGFyIHN0cmluZ3MsIHRoZW4KLSAqIGNhbGwgdWNvbF9zdHJjb2xsKCkuIEFuIGFyZ3VtZW50 IGxlbmd0aCBvZiAtMSBtZWFucyB0aGF0IHRoZSBzdHJpbmcgaXMKLSAqIE5VTC10ZXJtaW5hdGVk LgotICoKLSAqIFdoZW4gdGhlIGRhdGFiYXNlIGVuY29kaW5nIGlzIFVURi04LCBhbmQgSUNVIHN1 cHBvcnRzIHVjb2xfc3RyY29sbFVURjgoKSwKLSAqIGNhbGxlciBzaG91bGQgY2FsbCB0aGF0IGlu c3RlYWQuCi0gKi8KLXN0YXRpYyBpbnQKLXN0cm5jb2xsX2ljdV9ub191dGY4KGNvbnN0IGNoYXIg KmFyZzEsIHNzaXplX3QgbGVuMSwKLQkJCQkJIGNvbnN0IGNoYXIgKmFyZzIsIHNzaXplX3QgbGVu MiwgcGdfbG9jYWxlX3QgbG9jYWxlKQotewotCWNoYXIJCXNidWZbVEVYVEJVRkxFTl07Ci0JY2hh cgkgICAqYnVmID0gc2J1ZjsKLQlpbnQzMl90CQl1bGVuMTsKLQlpbnQzMl90CQl1bGVuMjsKLQlz aXplX3QJCWJ1ZnNpemUxOwotCXNpemVfdAkJYnVmc2l6ZTI7Ci0JVUNoYXIJICAgKnVjaGFyMSwK LQkJCSAgICp1Y2hhcjI7Ci0JaW50CQkJcmVzdWx0OwotCi0JQXNzZXJ0KGxvY2FsZS0+cHJvdmlk ZXIgPT0gQ09MTFBST1ZJREVSX0lDVSk7Ci0jaWZkZWYgSEFWRV9VQ09MX1NUUkNPTExVVEY4Ci0J QXNzZXJ0KEdldERhdGFiYXNlRW5jb2RpbmcoKSAhPSBQR19VVEY4KTsKLSNlbmRpZgotCi0JaW5p dF9pY3VfY29udmVydGVyKCk7Ci0KLQl1bGVuMSA9IHVjaGFyX2xlbmd0aChpY3VfY29udmVydGVy LCBhcmcxLCBsZW4xKTsKLQl1bGVuMiA9IHVjaGFyX2xlbmd0aChpY3VfY29udmVydGVyLCBhcmcy LCBsZW4yKTsKLQotCWJ1ZnNpemUxID0gKHVsZW4xICsgMSkgKiBzaXplb2YoVUNoYXIpOwotCWJ1 ZnNpemUyID0gKHVsZW4yICsgMSkgKiBzaXplb2YoVUNoYXIpOwotCi0JaWYgKGJ1ZnNpemUxICsg YnVmc2l6ZTIgPiBURVhUQlVGTEVOKQotCQlidWYgPSBwYWxsb2MoYnVmc2l6ZTEgKyBidWZzaXpl Mik7Ci0KLQl1Y2hhcjEgPSAoVUNoYXIgKikgYnVmOwotCXVjaGFyMiA9IChVQ2hhciAqKSAoYnVm ICsgYnVmc2l6ZTEpOwotCi0JdWxlbjEgPSB1Y2hhcl9jb252ZXJ0KGljdV9jb252ZXJ0ZXIsIHVj aGFyMSwgdWxlbjEgKyAxLCBhcmcxLCBsZW4xKTsKLQl1bGVuMiA9IHVjaGFyX2NvbnZlcnQoaWN1 X2NvbnZlcnRlciwgdWNoYXIyLCB1bGVuMiArIDEsIGFyZzIsIGxlbjIpOwotCi0JcmVzdWx0ID0g dWNvbF9zdHJjb2xsKGxvY2FsZS0+aW5mby5pY3UudWNvbCwKLQkJCQkJCSAgdWNoYXIxLCB1bGVu MSwKLQkJCQkJCSAgdWNoYXIyLCB1bGVuMik7Ci0KLQlpZiAoYnVmICE9IHNidWYpCi0JCXBmcmVl KGJ1Zik7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKgotICogc3RybmNvbGxfaWN1Ci0gKgot ICogQ2FsbCB1Y29sX3N0cmNvbGxVVEY4KCkgb3IgdWNvbF9zdHJjb2xsKCkgYXMgYXBwcm9wcmlh dGUgZm9yIHRoZSBnaXZlbgotICogZGF0YWJhc2UgZW5jb2RpbmcuIEFuIGFyZ3VtZW50IGxlbmd0 aCBvZiAtMSBtZWFucyB0aGUgc3RyaW5nIGlzCi0gKiBOVUwtdGVybWluYXRlZC4KLSAqLwotc3Rh dGljIGludAotc3RybmNvbGxfaWN1KGNvbnN0IGNoYXIgKmFyZzEsIHNzaXplX3QgbGVuMSwgY29u c3QgY2hhciAqYXJnMiwgc3NpemVfdCBsZW4yLAotCQkJIHBnX2xvY2FsZV90IGxvY2FsZSkKLXsK LQlpbnQJCQlyZXN1bHQ7Ci0KLQlBc3NlcnQobG9jYWxlLT5wcm92aWRlciA9PSBDT0xMUFJPVklE RVJfSUNVKTsKLQotI2lmZGVmIEhBVkVfVUNPTF9TVFJDT0xMVVRGOAotCWlmIChHZXREYXRhYmFz ZUVuY29kaW5nKCkgPT0gUEdfVVRGOCkKLQl7Ci0JCVVFcnJvckNvZGUJc3RhdHVzOwotCi0JCXN0 YXR1cyA9IFVfWkVST19FUlJPUjsKLQkJcmVzdWx0ID0gdWNvbF9zdHJjb2xsVVRGOChsb2NhbGUt PmluZm8uaWN1LnVjb2wsCi0JCQkJCQkJCSAgYXJnMSwgbGVuMSwKLQkJCQkJCQkJICBhcmcyLCBs ZW4yLAotCQkJCQkJCQkgICZzdGF0dXMpOwotCQlpZiAoVV9GQUlMVVJFKHN0YXR1cykpCi0JCQll cmVwb3J0KEVSUk9SLAotCQkJCQkoZXJybXNnKCJjb2xsYXRpb24gZmFpbGVkOiAlcyIsIHVfZXJy b3JOYW1lKHN0YXR1cykpKSk7Ci0JfQotCWVsc2UKLSNlbmRpZgotCXsKLQkJcmVzdWx0ID0gc3Ry bmNvbGxfaWN1X25vX3V0ZjgoYXJnMSwgbGVuMSwgYXJnMiwgbGVuMiwgbG9jYWxlKTsKLQl9Ci0K LQlyZXR1cm4gcmVzdWx0OwotfQotCi0jZW5kaWYJCQkJCQkJLyogVVNFX0lDVSAqLwotCi0vKgot ICogcGdfc3RyY29sbAotICoKLSAqIExpa2UgcGdfc3RybmNvbGwgZm9yIE5VTC10ZXJtaW5hdGVk IGlucHV0IHN0cmluZ3MuCi0gKi8KLWludAotcGdfc3RyY29sbChjb25zdCBjaGFyICphcmcxLCBj b25zdCBjaGFyICphcmcyLCBwZ19sb2NhbGVfdCBsb2NhbGUpCi17Ci0JaW50CQkJcmVzdWx0Owot Ci0JaWYgKGxvY2FsZS0+cHJvdmlkZXIgPT0gQ09MTFBST1ZJREVSX0xJQkMpCi0JCXJlc3VsdCA9 IHN0cm5jb2xsX2xpYmMoYXJnMSwgLTEsIGFyZzIsIC0xLCBsb2NhbGUpOwotI2lmZGVmIFVTRV9J Q1UKLQllbHNlIGlmIChsb2NhbGUtPnByb3ZpZGVyID09IENPTExQUk9WSURFUl9JQ1UpCi0JCXJl c3VsdCA9IHN0cm5jb2xsX2ljdShhcmcxLCAtMSwgYXJnMiwgLTEsIGxvY2FsZSk7Ci0jZW5kaWYK LQllbHNlCi0JCS8qIHNob3VsZG4ndCBoYXBwZW4gKi8KLQkJUEdMT0NBTEVfU1VQUE9SVF9FUlJP Uihsb2NhbGUtPnByb3ZpZGVyKTsKLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qCi0gKiBwZ19z dHJuY29sbAotICoKLSAqIENhbGwgdWNvbF9zdHJjb2xsVVRGOCgpLCB1Y29sX3N0cmNvbGwoKSwg c3RyY29sbF9sKCkgb3Igd2NzY29sbF9sKCkgYXMKLSAqIGFwcHJvcHJpYXRlIGZvciB0aGUgZ2l2 ZW4gbG9jYWxlLCBwbGF0Zm9ybSwgYW5kIGRhdGFiYXNlIGVuY29kaW5nLiBJZiB0aGUKLSAqIGxv Y2FsZSBpcyBub3Qgc3BlY2lmaWVkLCB1c2UgdGhlIGRhdGFiYXNlIGNvbGxhdGlvbi4KLSAqCi0g KiBUaGUgaW5wdXQgc3RyaW5ncyBtdXN0IGJlIGVuY29kZWQgaW4gdGhlIGRhdGFiYXNlIGVuY29k aW5nLiBJZiBhbiBpbnB1dAotICogc3RyaW5nIGlzIE5VTC10ZXJtaW5hdGVkLCBpdHMgbGVuZ3Ro IG1heSBiZSBzcGVjaWZpZWQgYXMgLTEuCi0gKgotICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJs ZSBmb3IgYnJlYWtpbmcgdGllcyBpZiB0aGUgY29sbGF0aW9uIGlzCi0gKiBkZXRlcm1pbmlzdGlj OyB0aGlzIG1haW50YWlucyBjb25zaXN0ZW5jeSB3aXRoIHBnX3N0cm54ZnJtKCksIHdoaWNoIGNh bm5vdAotICogZWFzaWx5IGFjY291bnQgZm9yIGRldGVybWluaXN0aWMgY29sbGF0aW9ucy4KLSAq LwotaW50Ci1wZ19zdHJuY29sbChjb25zdCBjaGFyICphcmcxLCBzc2l6ZV90IGxlbjEsIGNvbnN0 IGNoYXIgKmFyZzIsIHNzaXplX3QgbGVuMiwKLQkJCXBnX2xvY2FsZV90IGxvY2FsZSkKLXsKLQlp bnQJCQlyZXN1bHQ7Ci0KLQlpZiAobG9jYWxlLT5wcm92aWRlciA9PSBDT0xMUFJPVklERVJfTElC QykKLQkJcmVzdWx0ID0gc3RybmNvbGxfbGliYyhhcmcxLCBsZW4xLCBhcmcyLCBsZW4yLCBsb2Nh bGUpOwotI2lmZGVmIFVTRV9JQ1UKLQllbHNlIGlmIChsb2NhbGUtPnByb3ZpZGVyID09IENPTExQ Uk9WSURFUl9JQ1UpCi0JCXJlc3VsdCA9IHN0cm5jb2xsX2ljdShhcmcxLCBsZW4xLCBhcmcyLCBs ZW4yLCBsb2NhbGUpOwotI2VuZGlmCi0JZWxzZQotCQkvKiBzaG91bGRuJ3QgaGFwcGVuICovCi0J CVBHTE9DQUxFX1NVUFBPUlRfRVJST1IobG9jYWxlLT5wcm92aWRlcik7Ci0KLQlyZXR1cm4gcmVz dWx0OwotfQotCi0KLXN0YXRpYyBzaXplX3QKLXN0cm54ZnJtX2xpYmMoY2hhciAqZGVzdCwgc2l6 ZV90IGRlc3RzaXplLCBjb25zdCBjaGFyICpzcmMsIHNzaXplX3Qgc3JjbGVuLAotCQkJICBwZ19s b2NhbGVfdCBsb2NhbGUpCi17Ci0JY2hhcgkJc2J1ZltURVhUQlVGTEVOXTsKLQljaGFyCSAgICpi dWYgPSBzYnVmOwotCXNpemVfdAkJYnVmc2l6ZSA9IHNyY2xlbiArIDE7Ci0Jc2l6ZV90CQlyZXN1 bHQ7Ci0KLQlBc3NlcnQobG9jYWxlLT5wcm92aWRlciA9PSBDT0xMUFJPVklERVJfTElCQyk7Ci0K LQlpZiAoc3JjbGVuID09IC0xKQotCQlyZXR1cm4gc3RyeGZybV9sKGRlc3QsIHNyYywgZGVzdHNp emUsIGxvY2FsZS0+aW5mby5sdCk7Ci0KLQlpZiAoYnVmc2l6ZSA+IFRFWFRCVUZMRU4pCi0JCWJ1 ZiA9IHBhbGxvYyhidWZzaXplKTsKLQotCS8qIG51bC10ZXJtaW5hdGUgYXJndW1lbnQgKi8KLQlt ZW1jcHkoYnVmLCBzcmMsIHNyY2xlbik7Ci0JYnVmW3NyY2xlbl0gPSAnXDAnOwotCi0JcmVzdWx0 ID0gc3RyeGZybV9sKGRlc3QsIGJ1ZiwgZGVzdHNpemUsIGxvY2FsZS0+aW5mby5sdCk7Ci0KLQlp ZiAoYnVmICE9IHNidWYpCi0JCXBmcmVlKGJ1Zik7Ci0KLQkvKiBpZiBkZXN0IGlzIGRlZmluZWQs IGl0IHNob3VsZCBiZSBudWwtdGVybWluYXRlZCAqLwotCUFzc2VydChyZXN1bHQgPj0gZGVzdHNp emUgfHwgZGVzdFtyZXN1bHRdID09ICdcMCcpOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotI2lm ZGVmIFVTRV9JQ1UKLQotLyogJ3NyY2xlbicgb2YgLTEgbWVhbnMgdGhlIHN0cmluZ3MgYXJlIE5V TC10ZXJtaW5hdGVkICovCi1zdGF0aWMgc2l6ZV90Ci1zdHJueGZybV9pY3UoY2hhciAqZGVzdCwg c2l6ZV90IGRlc3RzaXplLCBjb25zdCBjaGFyICpzcmMsIHNzaXplX3Qgc3JjbGVuLAotCQkJIHBn X2xvY2FsZV90IGxvY2FsZSkKLXsKLQljaGFyCQlzYnVmW1RFWFRCVUZMRU5dOwotCWNoYXIJICAg KmJ1ZiA9IHNidWY7Ci0JVUNoYXIJICAgKnVjaGFyOwotCWludDMyX3QJCXVsZW47Ci0Jc2l6ZV90 CQl1Y2hhcl9ic2l6ZTsKLQlTaXplCQlyZXN1bHRfYnNpemU7Ci0KLQlBc3NlcnQobG9jYWxlLT5w cm92aWRlciA9PSBDT0xMUFJPVklERVJfSUNVKTsKLQotCWluaXRfaWN1X2NvbnZlcnRlcigpOwot Ci0JdWxlbiA9IHVjaGFyX2xlbmd0aChpY3VfY29udmVydGVyLCBzcmMsIHNyY2xlbik7Ci0KLQl1 Y2hhcl9ic2l6ZSA9ICh1bGVuICsgMSkgKiBzaXplb2YoVUNoYXIpOwotCi0JaWYgKHVjaGFyX2Jz aXplID4gVEVYVEJVRkxFTikKLQkJYnVmID0gcGFsbG9jKHVjaGFyX2JzaXplKTsKLQotCXVjaGFy ID0gKFVDaGFyICopIGJ1ZjsKLQotCXVsZW4gPSB1Y2hhcl9jb252ZXJ0KGljdV9jb252ZXJ0ZXIs IHVjaGFyLCB1bGVuICsgMSwgc3JjLCBzcmNsZW4pOwotCi0JcmVzdWx0X2JzaXplID0gdWNvbF9n ZXRTb3J0S2V5KGxvY2FsZS0+aW5mby5pY3UudWNvbCwKLQkJCQkJCQkJICAgdWNoYXIsIHVsZW4s Ci0JCQkJCQkJCSAgICh1aW50OF90ICopIGRlc3QsIGRlc3RzaXplKTsKLQotCS8qCi0JICogdWNv bF9nZXRTb3J0S2V5KCkgY291bnRzIHRoZSBudWwtdGVybWluYXRvciBpbiB0aGUgcmVzdWx0IGxl bmd0aCwgYnV0Ci0JICogdGhpcyBmdW5jdGlvbiBzaG91bGQgbm90LgotCSAqLwotCUFzc2VydChy ZXN1bHRfYnNpemUgPiAwKTsKLQlyZXN1bHRfYnNpemUtLTsKLQotCWlmIChidWYgIT0gc2J1ZikK LQkJcGZyZWUoYnVmKTsKLQotCS8qIGlmIGRlc3QgaXMgZGVmaW5lZCwgaXQgc2hvdWxkIGJlIG51 bC10ZXJtaW5hdGVkICovCi0JQXNzZXJ0KHJlc3VsdF9ic2l6ZSA+PSBkZXN0c2l6ZSB8fCBkZXN0 W3Jlc3VsdF9ic2l6ZV0gPT0gJ1wwJyk7Ci0KLQlyZXR1cm4gcmVzdWx0X2JzaXplOwotfQotCi0v KiAnc3JjbGVuJyBvZiAtMSBtZWFucyB0aGUgc3RyaW5ncyBhcmUgTlVMLXRlcm1pbmF0ZWQgKi8K LXN0YXRpYyBzaXplX3QKLXN0cm54ZnJtX3ByZWZpeF9pY3Vfbm9fdXRmOChjaGFyICpkZXN0LHNp emVfdCBkZXN0c2l6ZSwKLQkJCQkJCQljb25zdCBjaGFyICpzcmMsIHNzaXplX3Qgc3JjbGVuLAot CQkJCQkJCXBnX2xvY2FsZV90IGxvY2FsZSkKLXsKLQljaGFyCQlzYnVmW1RFWFRCVUZMRU5dOwot CWNoYXIJICAgKmJ1ZiA9IHNidWY7Ci0JVUNoYXJJdGVyYXRvciBpdGVyOwotCXVpbnQzMl90CXN0 YXRlWzJdOwotCVVFcnJvckNvZGUJc3RhdHVzOwotCWludDMyX3QJCXVsZW4gPSAtMTsKLQlVQ2hh cgkgICAqdWNoYXIgPSBOVUxMOwotCXNpemVfdAkJdWNoYXJfYnNpemU7Ci0JU2l6ZQkJcmVzdWx0 X2JzaXplOwotCi0JQXNzZXJ0KGxvY2FsZS0+cHJvdmlkZXIgPT0gQ09MTFBST1ZJREVSX0lDVSk7 Ci0JQXNzZXJ0KEdldERhdGFiYXNlRW5jb2RpbmcoKSAhPSBQR19VVEY4KTsKLQotCWluaXRfaWN1 X2NvbnZlcnRlcigpOwotCi0JdWxlbiA9IHVjaGFyX2xlbmd0aChpY3VfY29udmVydGVyLCBzcmMs IHNyY2xlbik7Ci0KLQl1Y2hhcl9ic2l6ZSA9ICh1bGVuICsgMSkgKiBzaXplb2YoVUNoYXIpOwot Ci0JaWYgKHVjaGFyX2JzaXplID4gVEVYVEJVRkxFTikKLQkJYnVmID0gcGFsbG9jKHVjaGFyX2Jz aXplKTsKLQotCXVjaGFyID0gKFVDaGFyICopIGJ1ZjsKLQotCXVsZW4gPSB1Y2hhcl9jb252ZXJ0 KGljdV9jb252ZXJ0ZXIsIHVjaGFyLCB1bGVuICsgMSwgc3JjLCBzcmNsZW4pOwotCi0JdWl0ZXJf c2V0U3RyaW5nKCZpdGVyLCB1Y2hhciwgdWxlbik7Ci0Jc3RhdGVbMF0gPSBzdGF0ZVsxXSA9IDA7 CS8qIHdvbid0IG5lZWQgdGhhdCBhZ2FpbiAqLwotCXN0YXR1cyA9IFVfWkVST19FUlJPUjsKLQly ZXN1bHRfYnNpemUgPSB1Y29sX25leHRTb3J0S2V5UGFydChsb2NhbGUtPmluZm8uaWN1LnVjb2ws Ci0JCQkJCQkJCQkJJml0ZXIsCi0JCQkJCQkJCQkJc3RhdGUsCi0JCQkJCQkJCQkJKHVpbnQ4X3Qg KikgZGVzdCwKLQkJCQkJCQkJCQlkZXN0c2l6ZSwKLQkJCQkJCQkJCQkmc3RhdHVzKTsKLQlpZiAo VV9GQUlMVVJFKHN0YXR1cykpCi0JCWVyZXBvcnQoRVJST1IsCi0JCQkJKGVycm1zZygic29ydCBr ZXkgZ2VuZXJhdGlvbiBmYWlsZWQ6ICVzIiwKLQkJCQkJCXVfZXJyb3JOYW1lKHN0YXR1cykpKSk7 Ci0KLQlyZXR1cm4gcmVzdWx0X2JzaXplOwotfQotCi0vKiAnc3JjbGVuJyBvZiAtMSBtZWFucyB0 aGUgc3RyaW5ncyBhcmUgTlVMLXRlcm1pbmF0ZWQgKi8KLXN0YXRpYyBzaXplX3QKLXN0cm54ZnJt X3ByZWZpeF9pY3UoY2hhciAqZGVzdCwgc2l6ZV90IGRlc3RzaXplLAotCQkJCQljb25zdCBjaGFy ICpzcmMsIHNzaXplX3Qgc3JjbGVuLAotCQkJCQlwZ19sb2NhbGVfdCBsb2NhbGUpCi17Ci0Jc2l6 ZV90CQlyZXN1bHQ7Ci0KLQlBc3NlcnQobG9jYWxlLT5wcm92aWRlciA9PSBDT0xMUFJPVklERVJf SUNVKTsKLQotCWlmIChHZXREYXRhYmFzZUVuY29kaW5nKCkgPT0gUEdfVVRGOCkKLQl7Ci0JCVVD aGFySXRlcmF0b3IgaXRlcjsKLQkJdWludDMyX3QJc3RhdGVbMl07Ci0JCVVFcnJvckNvZGUJc3Rh dHVzOwotCi0JCXVpdGVyX3NldFVURjgoJml0ZXIsIHNyYywgc3JjbGVuKTsKLQkJc3RhdGVbMF0g PSBzdGF0ZVsxXSA9IDA7CS8qIHdvbid0IG5lZWQgdGhhdCBhZ2FpbiAqLwotCQlzdGF0dXMgPSBV X1pFUk9fRVJST1I7Ci0JCXJlc3VsdCA9IHVjb2xfbmV4dFNvcnRLZXlQYXJ0KGxvY2FsZS0+aW5m by5pY3UudWNvbCwKLQkJCQkJCQkJCSAgJml0ZXIsCi0JCQkJCQkJCQkgIHN0YXRlLAotCQkJCQkJ CQkJICAodWludDhfdCAqKSBkZXN0LAotCQkJCQkJCQkJICBkZXN0c2l6ZSwKLQkJCQkJCQkJCSAg JnN0YXR1cyk7Ci0JCWlmIChVX0ZBSUxVUkUoc3RhdHVzKSkKLQkJCWVyZXBvcnQoRVJST1IsCi0J CQkJCShlcnJtc2coInNvcnQga2V5IGdlbmVyYXRpb24gZmFpbGVkOiAlcyIsCi0JCQkJCQkJdV9l cnJvck5hbWUoc3RhdHVzKSkpKTsKLQl9Ci0JZWxzZQotCQlyZXN1bHQgPSBzdHJueGZybV9wcmVm aXhfaWN1X25vX3V0ZjgoZGVzdCwgZGVzdHNpemUsIHNyYywgc3JjbGVuLAotCQkJCQkJCQkJCQkg bG9jYWxlKTsKLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLSNlbmRpZgotCi0vKgotICogUmV0dXJu IHRydWUgaWYgdGhlIGNvbGxhdGlvbiBwcm92aWRlciBzdXBwb3J0cyBwZ19zdHJ4ZnJtKCkgYW5k Ci0gKiBwZ19zdHJueGZybSgpOyBvdGhlcndpc2UgZmFsc2UuCi0gKgotICogVW5mb3J0dW5hdGVs eSwgaXQgc2VlbXMgdGhhdCBzdHJ4ZnJtKCkgZm9yIG5vbi1DIGNvbGxhdGlvbnMgaXMgYnJva2Vu IG9uCi0gKiBtYW55IGNvbW1vbiBwbGF0Zm9ybXM7IHRlc3Rpbmcgb2YgbXVsdGlwbGUgdmVyc2lv bnMgb2YgZ2xpYmMgcmV2ZWFscyB0aGF0LAotICogZm9yIG1hbnkgbG9jYWxlcywgc3RyY29sbCgp IGFuZCBzdHJ4ZnJtKCkgZG8gbm90IHJldHVybiBjb25zaXN0ZW50Ci0gKiByZXN1bHRzLiBXaGls ZSBubyBvdGhlciBsaWJjIG90aGVyIHRoYW4gQ3lnd2luIGhhcyBzbyBmYXIgYmVlbiBzaG93biB0 bwotICogaGF2ZSBhIHByb2JsZW0sIHdlIHRha2UgdGhlIGNvbnNlcnZhdGl2ZSBjb3Vyc2Ugb2Yg YWN0aW9uIGZvciByaWdodCBub3cgYW5kCi0gKiBkaXNhYmxlIHRoaXMgY2F0ZWdvcmljYWxseS4g IChVc2VycyB3aG8gYXJlIGNlcnRhaW4gdGhpcyBpc24ndCBhIHByb2JsZW0gb24KLSAqIHRoZWly IHN5c3RlbSBjYW4gZGVmaW5lIFRSVVNUX1NUUlhGUk0uKQorICogVW5mb3J0dW5hdGVseSwgaXQg c2VlbXMgdGhhdCBzdHJ4ZnJtKCkgZm9yIG5vbi1DIGNvbGxhdGlvbnMgaXMgYnJva2VuIG9uCisg KiBtYW55IGNvbW1vbiBwbGF0Zm9ybXM7IHRlc3Rpbmcgb2YgbXVsdGlwbGUgdmVyc2lvbnMgb2Yg Z2xpYmMgcmV2ZWFscyB0aGF0LAorICogZm9yIG1hbnkgbG9jYWxlcywgc3RyY29sbCgpIGFuZCBz dHJ4ZnJtKCkgZG8gbm90IHJldHVybiBjb25zaXN0ZW50CisgKiByZXN1bHRzLiBXaGlsZSBubyBv dGhlciBsaWJjIG90aGVyIHRoYW4gQ3lnd2luIGhhcyBzbyBmYXIgYmVlbiBzaG93biB0bworICog aGF2ZSBhIHByb2JsZW0sIHdlIHRha2UgdGhlIGNvbnNlcnZhdGl2ZSBjb3Vyc2Ugb2YgYWN0aW9u IGZvciByaWdodCBub3cgYW5kCisgKiBkaXNhYmxlIHRoaXMgY2F0ZWdvcmljYWxseS4gIChVc2Vy cyB3aG8gYXJlIGNlcnRhaW4gdGhpcyBpc24ndCBhIHByb2JsZW0gb24KKyAqIHRoZWlyIHN5c3Rl bSBjYW4gZGVmaW5lIFRSVVNUX1NUUlhGUk0uKQogICoKICAqIE5vIHNpbWlsYXIgcHJvYmxlbSBp cyBrbm93biBmb3IgdGhlIElDVSBwcm92aWRlci4KICAqLwpAQCAtMjM5MiwxOSArMTY4Nyw3IEBA IHBnX3N0cnhmcm1fZW5hYmxlZChwZ19sb2NhbGVfdCBsb2NhbGUpCiBzaXplX3QKIHBnX3N0cnhm cm0oY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3QgZGVzdHNpemUsIHBnX2xvY2Fs ZV90IGxvY2FsZSkKIHsKLQlzaXplX3QJCXJlc3VsdCA9IDA7CQkvKiBrZWVwIGNvbXBpbGVyIHF1 aWV0ICovCi0KLQlpZiAobG9jYWxlLT5wcm92aWRlciA9PSBDT0xMUFJPVklERVJfTElCQykKLQkJ cmVzdWx0ID0gc3Rybnhmcm1fbGliYyhkZXN0LCBkZXN0c2l6ZSwgc3JjLCAtMSwgbG9jYWxlKTsK LSNpZmRlZiBVU0VfSUNVCi0JZWxzZSBpZiAobG9jYWxlLT5wcm92aWRlciA9PSBDT0xMUFJPVklE RVJfSUNVKQotCQlyZXN1bHQgPSBzdHJueGZybV9pY3UoZGVzdCwgZGVzdHNpemUsIHNyYywgLTEs IGxvY2FsZSk7Ci0jZW5kaWYKLQllbHNlCi0JCS8qIHNob3VsZG4ndCBoYXBwZW4gKi8KLQkJUEdM T0NBTEVfU1VQUE9SVF9FUlJPUihsb2NhbGUtPnByb3ZpZGVyKTsKLQotCXJldHVybiByZXN1bHQ7 CisJcmV0dXJuIGxvY2FsZS0+Y29sbGF0ZS0+c3Rybnhmcm0oZGVzdCwgZGVzdHNpemUsIHNyYywg LTEsIGxvY2FsZSk7CiB9CiAKIC8qCkBAIC0yNDMwLDE5ICsxNzEzLDcgQEAgc2l6ZV90CiBwZ19z dHJueGZybShjaGFyICpkZXN0LCBzaXplX3QgZGVzdHNpemUsIGNvbnN0IGNoYXIgKnNyYywgc3Np emVfdCBzcmNsZW4sCiAJCQlwZ19sb2NhbGVfdCBsb2NhbGUpCiB7Ci0Jc2l6ZV90CQlyZXN1bHQg PSAwOwkJLyoga2VlcCBjb21waWxlciBxdWlldCAqLwotCi0JaWYgKGxvY2FsZS0+cHJvdmlkZXIg PT0gQ09MTFBST1ZJREVSX0xJQkMpCi0JCXJlc3VsdCA9IHN0cm54ZnJtX2xpYmMoZGVzdCwgc3Jj LCBzcmNsZW4sIGRlc3RzaXplLCBsb2NhbGUpOwotI2lmZGVmIFVTRV9JQ1UKLQllbHNlIGlmIChs b2NhbGUtPnByb3ZpZGVyID09IENPTExQUk9WSURFUl9JQ1UpCi0JCXJlc3VsdCA9IHN0cm54ZnJt X2ljdShkZXN0LCBzcmMsIHNyY2xlbiwgZGVzdHNpemUsIGxvY2FsZSk7Ci0jZW5kaWYKLQllbHNl Ci0JCS8qIHNob3VsZG4ndCBoYXBwZW4gKi8KLQkJUEdMT0NBTEVfU1VQUE9SVF9FUlJPUihsb2Nh bGUtPnByb3ZpZGVyKTsKLQotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIGxvY2FsZS0+Y29sbGF0 ZS0+c3Rybnhmcm0oZGVzdCwgZGVzdHNpemUsIHNyYywgc3JjbGVuLCBsb2NhbGUpOwogfQogCiAv KgpAQCAtMjQ3Miw3ICsxNzQzLDcgQEAgc2l6ZV90CiBwZ19zdHJ4ZnJtX3ByZWZpeChjaGFyICpk ZXN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBkZXN0c2l6ZSwKIAkJCQkgIHBnX2xvY2FsZV90 IGxvY2FsZSkKIHsKLQlyZXR1cm4gcGdfc3Rybnhmcm1fcHJlZml4KGRlc3QsIGRlc3RzaXplLCBz cmMsIC0xLCBsb2NhbGUpOworCXJldHVybiBsb2NhbGUtPmNvbGxhdGUtPnN0cm54ZnJtX3ByZWZp eChkZXN0LCBkZXN0c2l6ZSwgc3JjLCAtMSwgbG9jYWxlKTsKIH0KIAogLyoKQEAgLTI0OTcsMTYg KzE3NjgsOSBAQCBzaXplX3QKIHBnX3N0cm54ZnJtX3ByZWZpeChjaGFyICpkZXN0LCBzaXplX3Qg ZGVzdHNpemUsIGNvbnN0IGNoYXIgKnNyYywKIAkJCQkgICBzc2l6ZV90IHNyY2xlbiwgcGdfbG9j YWxlX3QgbG9jYWxlKQogewotCXNpemVfdAkJcmVzdWx0ID0gMDsJCS8qIGtlZXAgY29tcGlsZXIg cXVpZXQgKi8KLQotI2lmZGVmIFVTRV9JQ1UKLQlpZiAobG9jYWxlLT5wcm92aWRlciA9PSBDT0xM UFJPVklERVJfSUNVKQotCQlyZXN1bHQgPSBzdHJueGZybV9wcmVmaXhfaWN1KGRlc3QsIHNyYywg LTEsIGRlc3RzaXplLCBsb2NhbGUpOwotCWVsc2UKLSNlbmRpZgotCQlQR0xPQ0FMRV9TVVBQT1JU X0VSUk9SKGxvY2FsZS0+cHJvdmlkZXIpOwotCi0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gbG9j YWxlLT5jb2xsYXRlLT5zdHJueGZybV9wcmVmaXgoZGVzdCwgZGVzdHNpemUsCisJCQkJCQkJCQkJ CXNyYywgc3JjbGVuLAorCQkJCQkJCQkJCQlsb2NhbGUpOwogfQogCiAvKgpAQCAtMjU2MSwzNTYg KzE4MjUsNiBAQCBidWlsdGluX3ZhbGlkYXRlX2xvY2FsZShpbnQgZW5jb2RpbmcsIGNvbnN0IGNo YXIgKmxvY2FsZSkKIAlyZXR1cm4gY2Fub25pY2FsX25hbWU7CiB9CiAKLQotI2lmZGVmIFVTRV9J Q1UKLQotLyoKLSAqIFdyYXBwZXIgYXJvdW5kIHVjb2xfb3BlbigpIHRvIGhhbmRsZSBBUEkgZGlm ZmVyZW5jZXMgZm9yIG9sZGVyIElDVQotICogdmVyc2lvbnMuCi0gKgotICogRW5zdXJlIHRoYXQg bm8gcGF0aCBsZWFrcyBhIFVDb2xsYXRvci4KLSAqLwotc3RhdGljIFVDb2xsYXRvciAqCi1wZ191 Y29sX29wZW4oY29uc3QgY2hhciAqbG9jX3N0cikKLXsKLQlVQ29sbGF0b3IgICpjb2xsYXRvcjsK LQlVRXJyb3JDb2RlCXN0YXR1czsKLQljb25zdCBjaGFyICpvcmlnX3N0ciA9IGxvY19zdHI7Ci0J Y2hhcgkgICAqZml4ZWRfc3RyID0gTlVMTDsKLQotCS8qCi0JICogTXVzdCBuZXZlciBvcGVuIGRl ZmF1bHQgY29sbGF0b3IsIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiB0aGUgZW52aXJvbm1lbnQKLQkg KiBhbmQgbWF5IGNoYW5nZSBhdCBhbnkgdGltZS4gU2hvdWxkIG5vdCBoYXBwZW4sIGJ1dCBjaGVj ayBoZXJlIHRvIGNhdGNoCi0JICogYnVncyB0aGF0IG1pZ2h0IGJlIGhhcmQgdG8gY2F0Y2ggb3Ro ZXJ3aXNlLgotCSAqCi0JICogTkI6IHRoZSBkZWZhdWx0IGNvbGxhdG9yIGlzIG5vdCB0aGUgc2Ft ZSBhcyB0aGUgY29sbGF0b3IgZm9yIHRoZSByb290Ci0JICogbG9jYWxlLiBUaGUgcm9vdCBsb2Nh bGUgbWF5IGJlIHNwZWNpZmllZCBhcyB0aGUgZW1wdHkgc3RyaW5nLCAidW5kIiwgb3IKLQkgKiAi cm9vdCIuIFRoZSBkZWZhdWx0IGNvbGxhdG9yIGlzIG9wZW5lZCBieSBwYXNzaW5nIE5VTEwgdG8g dWNvbF9vcGVuKCkuCi0JICovCi0JaWYgKGxvY19zdHIgPT0gTlVMTCkKLQkJZWxvZyhFUlJPUiwg Im9wZW5pbmcgZGVmYXVsdCBjb2xsYXRvciBpcyBub3Qgc3VwcG9ydGVkIik7Ci0KLQkvKgotCSAq IEluIElDVSB2ZXJzaW9ucyA1NCBhbmQgZWFybGllciwgInVuZCIgaXMgbm90IGEgcmVjb2duaXpl ZCBzcGVsbGluZyBvZgotCSAqIHRoZSByb290IGxvY2FsZS4gSWYgdGhlIGZpcnN0IGNvbXBvbmVu dCBvZiB0aGUgbG9jYWxlIGlzICJ1bmQiLCByZXBsYWNlCi0JICogd2l0aCAicm9vdCIgYmVmb3Jl IG9wZW5pbmcuCi0JICovCi0JaWYgKFVfSUNVX1ZFUlNJT05fTUFKT1JfTlVNIDwgNTUpCi0Jewot CQljaGFyCQlsYW5nW1VMT0NfTEFOR19DQVBBQ0lUWV07Ci0KLQkJc3RhdHVzID0gVV9aRVJPX0VS Uk9SOwotCQl1bG9jX2dldExhbmd1YWdlKGxvY19zdHIsIGxhbmcsIFVMT0NfTEFOR19DQVBBQ0lU WSwgJnN0YXR1cyk7Ci0JCWlmIChVX0ZBSUxVUkUoc3RhdHVzKSB8fCBzdGF0dXMgPT0gVV9TVFJJ TkdfTk9UX1RFUk1JTkFURURfV0FSTklORykKLQkJewotCQkJZXJlcG9ydChFUlJPUiwKLQkJCQkJ KGVycmNvZGUoRVJSQ09ERV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRSksCi0JCQkJCSBlcnJtc2co ImNvdWxkIG5vdCBnZXQgbGFuZ3VhZ2UgZnJvbSBsb2NhbGUgXCIlc1wiOiAlcyIsCi0JCQkJCQkJ bG9jX3N0ciwgdV9lcnJvck5hbWUoc3RhdHVzKSkpKTsKLQkJfQotCi0JCWlmIChzdHJjbXAobGFu ZywgInVuZCIpID09IDApCi0JCXsKLQkJCWNvbnN0IGNoYXIgKnJlbWFpbmRlciA9IGxvY19zdHIg KyBzdHJsZW4oInVuZCIpOwotCi0JCQlmaXhlZF9zdHIgPSBwYWxsb2Moc3RybGVuKCJyb290Iikg KyBzdHJsZW4ocmVtYWluZGVyKSArIDEpOwotCQkJc3RyY3B5KGZpeGVkX3N0ciwgInJvb3QiKTsK LQkJCXN0cmNhdChmaXhlZF9zdHIsIHJlbWFpbmRlcik7Ci0KLQkJCWxvY19zdHIgPSBmaXhlZF9z dHI7Ci0JCX0KLQl9Ci0KLQlzdGF0dXMgPSBVX1pFUk9fRVJST1I7Ci0JY29sbGF0b3IgPSB1Y29s X29wZW4obG9jX3N0ciwgJnN0YXR1cyk7Ci0JaWYgKFVfRkFJTFVSRShzdGF0dXMpKQotCQllcmVw b3J0KEVSUk9SLAotCQkvKiB1c2Ugb3JpZ2luYWwgc3RyaW5nIGZvciBlcnJvciByZXBvcnQgKi8K LQkJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFKSwKLQkJCQkgZXJy bXNnKCJjb3VsZCBub3Qgb3BlbiBjb2xsYXRvciBmb3IgbG9jYWxlIFwiJXNcIjogJXMiLAotCQkJ CQkJb3JpZ19zdHIsIHVfZXJyb3JOYW1lKHN0YXR1cykpKSk7Ci0KLQlpZiAoVV9JQ1VfVkVSU0lP Tl9NQUpPUl9OVU0gPCA1NCkKLQl7Ci0JCXN0YXR1cyA9IFVfWkVST19FUlJPUjsKLQkJaWN1X3Nl dF9jb2xsYXRpb25fYXR0cmlidXRlcyhjb2xsYXRvciwgbG9jX3N0ciwgJnN0YXR1cyk7Ci0KLQkJ LyoKLQkJICogUHJldGVuZCB0aGUgZXJyb3IgY2FtZSBmcm9tIHVjb2xfb3BlbigpLCBmb3IgY29u c2lzdGVudCBlcnJvcgotCQkgKiBtZXNzYWdlIGFjcm9zcyBJQ1UgdmVyc2lvbnMuCi0JCSAqLwot CQlpZiAoVV9GQUlMVVJFKHN0YXR1cykgfHwgc3RhdHVzID09IFVfU1RSSU5HX05PVF9URVJNSU5B VEVEX1dBUk5JTkcpCi0JCXsKLQkJCXVjb2xfY2xvc2UoY29sbGF0b3IpOwotCQkJZXJlcG9ydChF UlJPUiwKLQkJCQkJKGVycmNvZGUoRVJSQ09ERV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRSksCi0J CQkJCSBlcnJtc2coImNvdWxkIG5vdCBvcGVuIGNvbGxhdG9yIGZvciBsb2NhbGUgXCIlc1wiOiAl cyIsCi0JCQkJCQkJb3JpZ19zdHIsIHVfZXJyb3JOYW1lKHN0YXR1cykpKSk7Ci0JCX0KLQl9Ci0K LQlpZiAoZml4ZWRfc3RyICE9IE5VTEwpCi0JCXBmcmVlKGZpeGVkX3N0cik7Ci0KLQlyZXR1cm4g Y29sbGF0b3I7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbml0X2ljdV9jb252ZXJ0ZXIodm9pZCkKLXsK LQljb25zdCBjaGFyICppY3VfZW5jb2RpbmdfbmFtZTsKLQlVRXJyb3JDb2RlCXN0YXR1czsKLQlV Q29udmVydGVyICpjb252OwotCi0JaWYgKGljdV9jb252ZXJ0ZXIpCi0JCXJldHVybjsJCQkJCS8q IGFscmVhZHkgZG9uZSAqLwotCi0JaWN1X2VuY29kaW5nX25hbWUgPSBnZXRfZW5jb2RpbmdfbmFt ZV9mb3JfaWN1KEdldERhdGFiYXNlRW5jb2RpbmcoKSk7Ci0JaWYgKCFpY3VfZW5jb2RpbmdfbmFt ZSkKLQkJZXJlcG9ydChFUlJPUiwKLQkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NV UFBPUlRFRCksCi0JCQkJIGVycm1zZygiZW5jb2RpbmcgXCIlc1wiIG5vdCBzdXBwb3J0ZWQgYnkg SUNVIiwKLQkJCQkJCXBnX2VuY29kaW5nX3RvX2NoYXIoR2V0RGF0YWJhc2VFbmNvZGluZygpKSkp KTsKLQotCXN0YXR1cyA9IFVfWkVST19FUlJPUjsKLQljb252ID0gdWNudl9vcGVuKGljdV9lbmNv ZGluZ19uYW1lLCAmc3RhdHVzKTsKLQlpZiAoVV9GQUlMVVJFKHN0YXR1cykpCi0JCWVyZXBvcnQo RVJST1IsCi0JCQkJKGVycm1zZygiY291bGQgbm90IG9wZW4gSUNVIGNvbnZlcnRlciBmb3IgZW5j b2RpbmcgXCIlc1wiOiAlcyIsCi0JCQkJCQlpY3VfZW5jb2RpbmdfbmFtZSwgdV9lcnJvck5hbWUo c3RhdHVzKSkpKTsKLQotCWljdV9jb252ZXJ0ZXIgPSBjb252OwotfQotCi0vKgotICogRmluZCBs ZW5ndGgsIGluIFVDaGFycywgb2YgZ2l2ZW4gc3RyaW5nIGlmIGNvbnZlcnRlZCB0byBVQ2hhciBz dHJpbmcuCi0gKgotICogQSBsZW5ndGggb2YgLTEgaW5kaWNhdGVzIHRoYXQgdGhlIGlucHV0IHN0 cmluZyBpcyBOVUwtdGVybWluYXRlZC4KLSAqLwotc3RhdGljIHNpemVfdAotdWNoYXJfbGVuZ3Ro KFVDb252ZXJ0ZXIgKmNvbnZlcnRlciwgY29uc3QgY2hhciAqc3RyLCBpbnQzMl90IGxlbikKLXsK LQlVRXJyb3JDb2RlCXN0YXR1cyA9IFVfWkVST19FUlJPUjsKLQlpbnQzMl90CQl1bGVuOwotCi0J dWxlbiA9IHVjbnZfdG9VQ2hhcnMoY29udmVydGVyLCBOVUxMLCAwLCBzdHIsIGxlbiwgJnN0YXR1 cyk7Ci0JaWYgKFVfRkFJTFVSRShzdGF0dXMpICYmIHN0YXR1cyAhPSBVX0JVRkZFUl9PVkVSRkxP V19FUlJPUikKLQkJZXJlcG9ydChFUlJPUiwKLQkJCQkoZXJybXNnKCIlcyBmYWlsZWQ6ICVzIiwg InVjbnZfdG9VQ2hhcnMiLCB1X2Vycm9yTmFtZShzdGF0dXMpKSkpOwotCXJldHVybiB1bGVuOwot fQotCi0vKgotICogQ29udmVydCB0aGUgZ2l2ZW4gc291cmNlIHN0cmluZyBpbnRvIGEgVUNoYXIg c3RyaW5nLCBzdG9yZWQgaW4gZGVzdCwgYW5kCi0gKiByZXR1cm4gdGhlIGxlbmd0aCAoaW4gVUNo YXJzKS4KLSAqCi0gKiBBIHNyY2xlbiBvZiAtMSBpbmRpY2F0ZXMgdGhhdCB0aGUgaW5wdXQgc3Ry aW5nIGlzIE5VTC10ZXJtaW5hdGVkLgotICovCi1zdGF0aWMgaW50MzJfdAotdWNoYXJfY29udmVy dChVQ29udmVydGVyICpjb252ZXJ0ZXIsIFVDaGFyICpkZXN0LCBpbnQzMl90IGRlc3RsZW4sCi0J CQkgIGNvbnN0IGNoYXIgKnNyYywgaW50MzJfdCBzcmNsZW4pCi17Ci0JVUVycm9yQ29kZQlzdGF0 dXMgPSBVX1pFUk9fRVJST1I7Ci0JaW50MzJfdAkJdWxlbjsKLQotCXN0YXR1cyA9IFVfWkVST19F UlJPUjsKLQl1bGVuID0gdWNudl90b1VDaGFycyhjb252ZXJ0ZXIsIGRlc3QsIGRlc3RsZW4sIHNy Yywgc3JjbGVuLCAmc3RhdHVzKTsKLQlpZiAoVV9GQUlMVVJFKHN0YXR1cykpCi0JCWVyZXBvcnQo RVJST1IsCi0JCQkJKGVycm1zZygiJXMgZmFpbGVkOiAlcyIsICJ1Y252X3RvVUNoYXJzIiwgdV9l cnJvck5hbWUoc3RhdHVzKSkpKTsKLQlyZXR1cm4gdWxlbjsKLX0KLQotLyoKLSAqIENvbnZlcnQg YSBzdHJpbmcgaW4gdGhlIGRhdGFiYXNlIGVuY29kaW5nIGludG8gYSBzdHJpbmcgb2YgVUNoYXJz LgotICoKLSAqIFRoZSBzb3VyY2Ugc3RyaW5nIGF0IGJ1ZmYgaXMgb2YgbGVuZ3RoIG5ieXRlcwot ICogKGl0IG5lZWRuJ3QgYmUgbnVsLXRlcm1pbmF0ZWQpCi0gKgotICogKmJ1ZmZfdWNoYXIgcmVj ZWl2ZXMgYSBwb2ludGVyIHRvIHRoZSBwYWxsb2MnZCByZXN1bHQgc3RyaW5nLCBhbmQKLSAqIHRo ZSBmdW5jdGlvbidzIHJlc3VsdCBpcyB0aGUgbnVtYmVyIG9mIFVDaGFycyBnZW5lcmF0ZWQuCi0g KgotICogVGhlIHJlc3VsdCBzdHJpbmcgaXMgbnVsLXRlcm1pbmF0ZWQsIHRob3VnaCBtb3N0IGNh bGxlcnMgcmVseSBvbiB0aGUKLSAqIHJlc3VsdCBsZW5ndGggaW5zdGVhZC4KLSAqLwotaW50MzJf dAotaWN1X3RvX3VjaGFyKFVDaGFyICoqYnVmZl91Y2hhciwgY29uc3QgY2hhciAqYnVmZiwgc2l6 ZV90IG5ieXRlcykKLXsKLQlpbnQzMl90CQlsZW5fdWNoYXI7Ci0KLQlpbml0X2ljdV9jb252ZXJ0 ZXIoKTsKLQotCWxlbl91Y2hhciA9IHVjaGFyX2xlbmd0aChpY3VfY29udmVydGVyLCBidWZmLCBu Ynl0ZXMpOwotCi0JKmJ1ZmZfdWNoYXIgPSBwYWxsb2MoKGxlbl91Y2hhciArIDEpICogc2l6ZW9m KCoqYnVmZl91Y2hhcikpOwotCWxlbl91Y2hhciA9IHVjaGFyX2NvbnZlcnQoaWN1X2NvbnZlcnRl ciwKLQkJCQkJCQkgICpidWZmX3VjaGFyLCBsZW5fdWNoYXIgKyAxLCBidWZmLCBuYnl0ZXMpOwot Ci0JcmV0dXJuIGxlbl91Y2hhcjsKLX0KLQotLyoKLSAqIENvbnZlcnQgYSBzdHJpbmcgb2YgVUNo YXJzIGludG8gdGhlIGRhdGFiYXNlIGVuY29kaW5nLgotICoKLSAqIFRoZSBzb3VyY2Ugc3RyaW5n IGF0IGJ1ZmZfdWNoYXIgaXMgb2YgbGVuZ3RoIGxlbl91Y2hhcgotICogKGl0IG5lZWRuJ3QgYmUg bnVsLXRlcm1pbmF0ZWQpCi0gKgotICogKnJlc3VsdCByZWNlaXZlcyBhIHBvaW50ZXIgdG8gdGhl IHBhbGxvYydkIHJlc3VsdCBzdHJpbmcsIGFuZCB0aGUKLSAqIGZ1bmN0aW9uJ3MgcmVzdWx0IGlz IHRoZSBudW1iZXIgb2YgYnl0ZXMgZ2VuZXJhdGVkIChub3QgY291bnRpbmcgbnVsKS4KLSAqCi0g KiBUaGUgcmVzdWx0IHN0cmluZyBpcyBudWwtdGVybWluYXRlZC4KLSAqLwotaW50MzJfdAotaWN1 X2Zyb21fdWNoYXIoY2hhciAqKnJlc3VsdCwgY29uc3QgVUNoYXIgKmJ1ZmZfdWNoYXIsIGludDMy X3QgbGVuX3VjaGFyKQotewotCVVFcnJvckNvZGUJc3RhdHVzOwotCWludDMyX3QJCWxlbl9yZXN1 bHQ7Ci0KLQlpbml0X2ljdV9jb252ZXJ0ZXIoKTsKLQotCXN0YXR1cyA9IFVfWkVST19FUlJPUjsK LQlsZW5fcmVzdWx0ID0gdWNudl9mcm9tVUNoYXJzKGljdV9jb252ZXJ0ZXIsIE5VTEwsIDAsCi0J CQkJCQkJCSBidWZmX3VjaGFyLCBsZW5fdWNoYXIsICZzdGF0dXMpOwotCWlmIChVX0ZBSUxVUkUo c3RhdHVzKSAmJiBzdGF0dXMgIT0gVV9CVUZGRVJfT1ZFUkZMT1dfRVJST1IpCi0JCWVyZXBvcnQo RVJST1IsCi0JCQkJKGVycm1zZygiJXMgZmFpbGVkOiAlcyIsICJ1Y252X2Zyb21VQ2hhcnMiLAot CQkJCQkJdV9lcnJvck5hbWUoc3RhdHVzKSkpKTsKLQotCSpyZXN1bHQgPSBwYWxsb2MobGVuX3Jl c3VsdCArIDEpOwotCi0Jc3RhdHVzID0gVV9aRVJPX0VSUk9SOwotCWxlbl9yZXN1bHQgPSB1Y252 X2Zyb21VQ2hhcnMoaWN1X2NvbnZlcnRlciwgKnJlc3VsdCwgbGVuX3Jlc3VsdCArIDEsCi0JCQkJ CQkJCSBidWZmX3VjaGFyLCBsZW5fdWNoYXIsICZzdGF0dXMpOwotCWlmIChVX0ZBSUxVUkUoc3Rh dHVzKSB8fAotCQlzdGF0dXMgPT0gVV9TVFJJTkdfTk9UX1RFUk1JTkFURURfV0FSTklORykKLQkJ ZXJlcG9ydChFUlJPUiwKLQkJCQkoZXJybXNnKCIlcyBmYWlsZWQ6ICVzIiwgInVjbnZfZnJvbVVD aGFycyIsCi0JCQkJCQl1X2Vycm9yTmFtZShzdGF0dXMpKSkpOwotCi0JcmV0dXJuIGxlbl9yZXN1 bHQ7Ci19Ci0KLS8qCi0gKiBQYXJzZSBjb2xsYXRpb24gYXR0cmlidXRlcyBmcm9tIHRoZSBnaXZl biBsb2NhbGUgc3RyaW5nIGFuZCBhcHBseSB0aGVtIHRvCi0gKiB0aGUgb3BlbiBjb2xsYXRvci4K LSAqCi0gKiBGaXJzdCwgdGhlIGxvY2FsZSBzdHJpbmcgaXMgY2Fub25pY2FsaXplZCB0byBhbiBJ Q1UgZm9ybWF0IGxvY2FsZSBJRCBzdWNoCi0gKiBhcyAidW5kQGNvbFN0cmVuZ3RoPXByaW1hcnk7 Y29sQ2FzZUxldmVsPXllcyIuIFRoZW4sIGl0IHBhcnNlcyBhbmQgYXBwbGllcwotICogdGhlIGtl eS12YWx1ZSBhcmd1bWVudHMuCi0gKgotICogU3RhcnRpbmcgd2l0aCBJQ1UgdmVyc2lvbiA1NCwg dGhlIGF0dHJpYnV0ZXMgYXJlIHByb2Nlc3NlZCBhdXRvbWF0aWNhbGx5IGJ5Ci0gKiB1Y29sX29w ZW4oKSwgc28gdGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBmb3IgZW11bGF0aW5nIHRoaXMgYmVoYXZp b3Igb24gb2xkZXIKLSAqIHZlcnNpb25zLgotICovCi1wZ19hdHRyaWJ1dGVfdW51c2VkKCkKLXN0 YXRpYyB2b2lkCi1pY3Vfc2V0X2NvbGxhdGlvbl9hdHRyaWJ1dGVzKFVDb2xsYXRvciAqY29sbGF0 b3IsIGNvbnN0IGNoYXIgKmxvYywKLQkJCQkJCQkgVUVycm9yQ29kZSAqc3RhdHVzKQotewotCWlu dDMyX3QJCWxlbjsKLQljaGFyCSAgICppY3VfbG9jYWxlX2lkOwotCWNoYXIJICAgKmxvd2VyX3N0 cjsKLQljaGFyCSAgICpzdHI7Ci0JY2hhcgkgICAqdG9rZW47Ci0KLQkvKgotCSAqIFRoZSBpbnB1 dCBsb2NhbGUgbWF5IGJlIGEgQkNQIDQ3IGxhbmd1YWdlIHRhZywgZS5nLgotCSAqICJ1bmQtdS1r Yy1rcy1sZXZlbDEiLCB3aGljaCBleHByZXNzZXMgdGhlIHNhbWUgYXR0cmlidXRlcyBpbiBhCi0J ICogZGlmZmVyZW50IGZvcm0uIEl0IHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSBlcXVpdmFsZW50 IElDVSBmb3JtYXQKLQkgKiBsb2NhbGUgSUQsIGUuZy4gInVuZEBjb2xjYXNlbGV2ZWw9eWVzO2Nv bHN0cmVuZ3RoPXByaW1hcnkiLCBieQotCSAqIHVsb2NfY2Fub25pY2FsaXplKCkuCi0JICovCi0J KnN0YXR1cyA9IFVfWkVST19FUlJPUjsKLQlsZW4gPSB1bG9jX2Nhbm9uaWNhbGl6ZShsb2MsIE5V TEwsIDAsIHN0YXR1cyk7Ci0JaWN1X2xvY2FsZV9pZCA9IHBhbGxvYyhsZW4gKyAxKTsKLQkqc3Rh dHVzID0gVV9aRVJPX0VSUk9SOwotCWxlbiA9IHVsb2NfY2Fub25pY2FsaXplKGxvYywgaWN1X2xv Y2FsZV9pZCwgbGVuICsgMSwgc3RhdHVzKTsKLQlpZiAoVV9GQUlMVVJFKCpzdGF0dXMpIHx8ICpz dGF0dXMgPT0gVV9TVFJJTkdfTk9UX1RFUk1JTkFURURfV0FSTklORykKLQkJcmV0dXJuOwotCi0J bG93ZXJfc3RyID0gYXNjX3RvbG93ZXIoaWN1X2xvY2FsZV9pZCwgc3RybGVuKGljdV9sb2NhbGVf aWQpKTsKLQotCXBmcmVlKGljdV9sb2NhbGVfaWQpOwotCi0Jc3RyID0gc3RyY2hyKGxvd2VyX3N0 ciwgJ0AnKTsKLQlpZiAoIXN0cikKLQkJcmV0dXJuOwotCXN0cisrOwotCi0Jd2hpbGUgKCh0b2tl biA9IHN0cnNlcCgmc3RyLCAiOyIpKSkKLQl7Ci0JCWNoYXIJICAgKmUgPSBzdHJjaHIodG9rZW4s ICc9Jyk7Ci0KLQkJaWYgKGUpCi0JCXsKLQkJCWNoYXIJICAgKm5hbWU7Ci0JCQljaGFyCSAgICp2 YWx1ZTsKLQkJCVVDb2xBdHRyaWJ1dGUgdWF0dHI7Ci0JCQlVQ29sQXR0cmlidXRlVmFsdWUgdXZh bHVlOwotCi0JCQkqc3RhdHVzID0gVV9aRVJPX0VSUk9SOwotCi0JCQkqZSA9ICdcMCc7Ci0JCQlu YW1lID0gdG9rZW47Ci0JCQl2YWx1ZSA9IGUgKyAxOwotCi0JCQkvKgotCQkJICogU2VlIGF0dHJp YnV0ZSBuYW1lIGFuZCB2YWx1ZSBsaXN0cyBpbiBJQ1UgaTE4bi9jb2xsLmNwcAotCQkJICovCi0J CQlpZiAoc3RyY21wKG5hbWUsICJjb2xzdHJlbmd0aCIpID09IDApCi0JCQkJdWF0dHIgPSBVQ09M X1NUUkVOR1RIOwotCQkJZWxzZSBpZiAoc3RyY21wKG5hbWUsICJjb2xiYWNrd2FyZHMiKSA9PSAw KQotCQkJCXVhdHRyID0gVUNPTF9GUkVOQ0hfQ09MTEFUSU9OOwotCQkJZWxzZSBpZiAoc3RyY21w KG5hbWUsICJjb2xjYXNlbGV2ZWwiKSA9PSAwKQotCQkJCXVhdHRyID0gVUNPTF9DQVNFX0xFVkVM OwotCQkJZWxzZSBpZiAoc3RyY21wKG5hbWUsICJjb2xjYXNlZmlyc3QiKSA9PSAwKQotCQkJCXVh dHRyID0gVUNPTF9DQVNFX0ZJUlNUOwotCQkJZWxzZSBpZiAoc3RyY21wKG5hbWUsICJjb2xhbHRl cm5hdGUiKSA9PSAwKQotCQkJCXVhdHRyID0gVUNPTF9BTFRFUk5BVEVfSEFORExJTkc7Ci0JCQll bHNlIGlmIChzdHJjbXAobmFtZSwgImNvbG5vcm1hbGl6YXRpb24iKSA9PSAwKQotCQkJCXVhdHRy ID0gVUNPTF9OT1JNQUxJWkFUSU9OX01PREU7Ci0JCQllbHNlIGlmIChzdHJjbXAobmFtZSwgImNv bG51bWVyaWMiKSA9PSAwKQotCQkJCXVhdHRyID0gVUNPTF9OVU1FUklDX0NPTExBVElPTjsKLQkJ CWVsc2UKLQkJCQkvKiBpZ25vcmUgaWYgdW5rbm93biAqLwotCQkJCWNvbnRpbnVlOwotCi0JCQlp ZiAoc3RyY21wKHZhbHVlLCAicHJpbWFyeSIpID09IDApCi0JCQkJdXZhbHVlID0gVUNPTF9QUklN QVJZOwotCQkJZWxzZSBpZiAoc3RyY21wKHZhbHVlLCAic2Vjb25kYXJ5IikgPT0gMCkKLQkJCQl1 dmFsdWUgPSBVQ09MX1NFQ09OREFSWTsKLQkJCWVsc2UgaWYgKHN0cmNtcCh2YWx1ZSwgInRlcnRp YXJ5IikgPT0gMCkKLQkJCQl1dmFsdWUgPSBVQ09MX1RFUlRJQVJZOwotCQkJZWxzZSBpZiAoc3Ry Y21wKHZhbHVlLCAicXVhdGVybmFyeSIpID09IDApCi0JCQkJdXZhbHVlID0gVUNPTF9RVUFURVJO QVJZOwotCQkJZWxzZSBpZiAoc3RyY21wKHZhbHVlLCAiaWRlbnRpY2FsIikgPT0gMCkKLQkJCQl1 dmFsdWUgPSBVQ09MX0lERU5USUNBTDsKLQkJCWVsc2UgaWYgKHN0cmNtcCh2YWx1ZSwgIm5vIikg PT0gMCkKLQkJCQl1dmFsdWUgPSBVQ09MX09GRjsKLQkJCWVsc2UgaWYgKHN0cmNtcCh2YWx1ZSwg InllcyIpID09IDApCi0JCQkJdXZhbHVlID0gVUNPTF9PTjsKLQkJCWVsc2UgaWYgKHN0cmNtcCh2 YWx1ZSwgInNoaWZ0ZWQiKSA9PSAwKQotCQkJCXV2YWx1ZSA9IFVDT0xfU0hJRlRFRDsKLQkJCWVs c2UgaWYgKHN0cmNtcCh2YWx1ZSwgIm5vbi1pZ25vcmFibGUiKSA9PSAwKQotCQkJCXV2YWx1ZSA9 IFVDT0xfTk9OX0lHTk9SQUJMRTsKLQkJCWVsc2UgaWYgKHN0cmNtcCh2YWx1ZSwgImxvd2VyIikg PT0gMCkKLQkJCQl1dmFsdWUgPSBVQ09MX0xPV0VSX0ZJUlNUOwotCQkJZWxzZSBpZiAoc3RyY21w KHZhbHVlLCAidXBwZXIiKSA9PSAwKQotCQkJCXV2YWx1ZSA9IFVDT0xfVVBQRVJfRklSU1Q7Ci0J CQllbHNlCi0JCQl7Ci0JCQkJKnN0YXR1cyA9IFVfSUxMRUdBTF9BUkdVTUVOVF9FUlJPUjsKLQkJ CQlicmVhazsKLQkJCX0KLQotCQkJdWNvbF9zZXRBdHRyaWJ1dGUoY29sbGF0b3IsIHVhdHRyLCB1 dmFsdWUsIHN0YXR1cyk7Ci0JCX0KLQl9Ci0KLQlwZnJlZShsb3dlcl9zdHIpOwotfQotI2VuZGlm Ci0KIC8qCiAgKiBSZXR1cm4gdGhlIEJDUDQ3IGxhbmd1YWdlIHRhZyByZXByZXNlbnRhdGlvbiBv ZiB0aGUgcmVxdWVzdGVkIGxvY2FsZS4KICAqCkBAIC0zMDQ5LDYgKzE5NjMsMTYgQEAgaWN1X3Zh bGlkYXRlX2xvY2FsZShjb25zdCBjaGFyICpsb2Nfc3RyKQogI2VuZGlmCQkJCQkJCS8qIG5vdCBV U0VfSUNVICovCiB9CiAKKy8qCisgKgorICpUT0RPOiBhZGQgY2FjaGluZz8KKyAqLworaW50Citj aGFyX3Byb3BzKHBnX3djaGFyIHdjLCBpbnQgbWFzaywgcGdfbG9jYWxlX3QgbG9jYWxlKQorewor CXJldHVybiBsb2NhbGUtPmN0eXBlLT5jaGFyX3Byb3BzKHdjLCBtYXNrLCBsb2NhbGUpOworfQor CiAvKgogICogVGhlc2UgZnVuY3Rpb25zIGNvbnZlcnQgZnJvbS90byBsaWJjJ3Mgd2NoYXJfdCwg Km5vdCogcGdfd2NoYXJfdC4KICAqIFRoZXJlZm9yZSB3ZSBrZWVwIHRoZW0gaGVyZSByYXRoZXIg dGhhbiB3aXRoIHRoZSBtYnV0aWxzIGNvZGUuCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGls cy9hZHQvcGdfbG9jYWxlX2ljdS5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3BnX2xvY2FsZV9p Y3UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uYTllOGI0YjY0MmIK LS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvcGdfbG9jYWxlX2ljdS5j CkBAIC0wLDAgKzEsODczIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogUG9zdGdyZVNRTCBs b2NhbGUgdXRpbGl0aWVzIGZvciBJQ1UKKyAqCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDIw MDItMjAyNCwgUG9zdGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKKyAqCisgKiBzcmMv YmFja2VuZC91dGlscy9hZHQvcGdfbG9jYWxlX2xpYmMuYworICoKKyAqLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyAqLworCisKKyNpbmNsdWRlICJwb3N0Z3Jlcy5oIgorCisjaWZkZWYgVVNFX0lDVQorCisjaW5j bHVkZSA8dW5pY29kZS91Y252Lmg+CisjaW5jbHVkZSA8dW5pY29kZS91c3RyaW5nLmg+CisKKyNp bmNsdWRlICJhY2Nlc3MvaHR1cF9kZXRhaWxzLmgiCisjaW5jbHVkZSAiY2F0YWxvZy9wZ19jb2xs YXRpb24uaCIKKyNpbmNsdWRlICJjYXRhbG9nL3BnX2RhdGFiYXNlLmgiCisjaW5jbHVkZSAidXRp bHMvYnVpbHRpbnMuaCIKKyNpbmNsdWRlICJ1dGlscy9mb3JtYXR0aW5nLmgiCisjaW5jbHVkZSAi dXRpbHMvbWVtdXRpbHMuaCIKKyNpbmNsdWRlICJ1dGlscy9wZ19sb2NhbGUuaCIKKyNpbmNsdWRl ICJ1dGlscy9yZXNvd25lci5oIgorI2luY2x1ZGUgInV0aWxzL3N5c2NhY2hlLmgiCisKKy8qCisg KiBUaGlzIHNob3VsZCBiZSBsYXJnZSBlbm91Z2ggdGhhdCBtb3N0IHN0cmluZ3Mgd2lsbCBmaXQs IGJ1dCBzbWFsbCBlbm91Z2gKKyAqIHRoYXQgd2UgZmVlbCBjb21mb3J0YWJsZSBwdXR0aW5nIGl0 IG9uIHRoZSBzdGFjaworICovCisjZGVmaW5lCQlURVhUQlVGTEVOCQkJMTAyNAorCitleHRlcm4g cGdfbG9jYWxlX3QgaWN1X2RhdF9jcmVhdGVfbG9jYWxlKEhlYXBUdXBsZSBkYXR0dXBsZSk7Citl eHRlcm4gcGdfbG9jYWxlX3QgaWN1X2NvbGxfY3JlYXRlX2xvY2FsZShNZW1vcnlDb250ZXh0IGNv bnRleHQsCisJCQkJCQkJCQkJICBSZXNvdXJjZU93bmVyIHJlc293bmVyLAorCQkJCQkJCQkJCSAg SGVhcFR1cGxlIGNvbGx0dXBsZSk7CitleHRlcm4gVUNvbGxhdG9yICpwZ191Y29sX29wZW4oY29u c3QgY2hhciAqbG9jX3N0cik7CisKKworc3RhdGljIFVDb2xsYXRvciAqIG1ha2VfaWN1X2NvbGxh dG9yKGNvbnN0IGNoYXIgKmljdWxvY3N0ciwKKwkJCQkJCQkJCSBjb25zdCBjaGFyICppY3VydWxl cyk7CisKK3N0YXRpYyBpbnQgc3RybmNvbGxfaWN1KGNvbnN0IGNoYXIgKmFyZzEsIHNzaXplX3Qg bGVuMSwKKwkJCQkJCWNvbnN0IGNoYXIgKmFyZzIsIHNzaXplX3QgbGVuMiwKKwkJCQkJCXBnX2xv Y2FsZV90IGxvY2FsZSk7CitzdGF0aWMgc2l6ZV90IHN0cm54ZnJtX2ljdShjaGFyICpkZXN0LCBz aXplX3QgZGVzdHNpemUsCisJCQkJCQkgICBjb25zdCBjaGFyICpzcmMsIHNzaXplX3Qgc3JjbGVu LAorCQkJCQkJICAgcGdfbG9jYWxlX3QgbG9jYWxlKTsKK3N0YXRpYyBzaXplX3Qgc3Rybnhmcm1f cHJlZml4X2ljdShjaGFyICpkZXN0LCBzaXplX3QgZGVzdHNpemUsCisJCQkJCQkJCSAgY29uc3Qg Y2hhciAqc3JjLCBzc2l6ZV90IHNyY2xlbiwKKwkJCQkJCQkJICBwZ19sb2NhbGVfdCBsb2NhbGUp OworCitzdGF0aWMgdm9pZCBSZXNvdXJjZU93bmVyUmVtZW1iZXJVQ29sbGF0b3IoUmVzb3VyY2VP d25lciBvd25lciwKKwkJCQkJCQkJCQkgICBVQ29sbGF0b3IgKmNvbGxhdG9yKTsKK3N0YXRpYyB2 b2lkIFJlc093bmVyUmVsZWFzZVVDb2xsYXRvcihEYXR1bSB2YWwpOworCitzdGF0aWMgdm9pZCBp bml0X2ljdV9jb252ZXJ0ZXIodm9pZCk7CitzdGF0aWMgc2l6ZV90IHVjaGFyX2xlbmd0aChVQ29u dmVydGVyICpjb252ZXJ0ZXIsCisJCQkJCQkgICBjb25zdCBjaGFyICpzdHIsIGludDMyX3QgbGVu KTsKK3N0YXRpYyBpbnQzMl90IHVjaGFyX2NvbnZlcnQoVUNvbnZlcnRlciAqY29udmVydGVyLAor CQkJCQkJCSBVQ2hhciAqZGVzdCwgaW50MzJfdCBkZXN0bGVuLAorCQkJCQkJCSBjb25zdCBjaGFy ICpzcmMsIGludDMyX3Qgc3JjbGVuKTsKK3N0YXRpYyB2b2lkIGljdV9zZXRfY29sbGF0aW9uX2F0 dHJpYnV0ZXMoVUNvbGxhdG9yICpjb2xsYXRvciwgY29uc3QgY2hhciAqbG9jLAorCQkJCQkJCQkJ CSBVRXJyb3JDb2RlICpzdGF0dXMpOworCisvKgorICogQ29udmVydGVyIG9iamVjdCBmb3IgY29u dmVydGluZyBiZXR3ZWVuIElDVSdzIFVDaGFyIHN0cmluZ3MgYW5kIEMgc3RyaW5ncworICogaW4g ZGF0YWJhc2UgZW5jb2RpbmcuICBTaW5jZSB0aGUgZGF0YWJhc2UgZW5jb2RpbmcgZG9lc24ndCBj aGFuZ2UsIHdlIG9ubHkKKyAqIG5lZWQgb25lIG9mIHRoZXNlIHBlciBzZXNzaW9uLgorICovCitz dGF0aWMgVUNvbnZlcnRlciAqaWN1X2NvbnZlcnRlciA9IE5VTEw7CisKK3N0YXRpYyBjb25zdCBS ZXNvdXJjZU93bmVyRGVzYyBVQ29sbGF0b3JSZXNvdXJjZUtpbmQgPQoreworCS5uYW1lID0gIlVD b2xsYXRvciByZWZlcmVuY2UiLAorCS5yZWxlYXNlX3BoYXNlID0gUkVTT1VSQ0VfUkVMRUFTRV9B RlRFUl9MT0NLUywKKwkucmVsZWFzZV9wcmlvcml0eSA9IFJFTEVBU0VfUFJJT19MQVNULAorCS5S ZWxlYXNlUmVzb3VyY2UgPSBSZXNPd25lclJlbGVhc2VVQ29sbGF0b3IsCisJLkRlYnVnUHJpbnQg PSBOVUxMICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBkZWZhdWx0IG1lc3NhZ2UgaXMgZmlu ZSAqLworfTsKKworCitzdGF0aWMgaW50CitjaGFyX3Byb3BzX2ljdShwZ193Y2hhciB3YywgaW50 IG1hc2ssIHBnX2xvY2FsZV90IGxvY2FsZSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKworCWlmICgo bWFzayAmIFBHX0lTRElHSVQpICYmIHVfaXNkaWdpdCh3YykpCisJCXJlc3VsdCB8PSBQR19JU0RJ R0lUOworCWlmICgobWFzayAmIFBHX0lTQUxQSEEpICYmIHVfaXNhbHBoYSh3YykpCisJCXJlc3Vs dCB8PSBQR19JU0FMUEhBOworCWlmICgobWFzayAmIFBHX0lTVVBQRVIpICYmIHVfaXN1cHBlcih3 YykpCisJCXJlc3VsdCB8PSBQR19JU1VQUEVSOworCWlmICgobWFzayAmIFBHX0lTTE9XRVIpICYm IHVfaXNsb3dlcih3YykpCisJCXJlc3VsdCB8PSBQR19JU0xPV0VSOworCWlmICgobWFzayAmIFBH X0lTR1JBUEgpICYmIHVfaXNncmFwaCh3YykpCisJCXJlc3VsdCB8PSBQR19JU0dSQVBIOworCWlm ICgobWFzayAmIFBHX0lTUFJJTlQpICYmIHVfaXNwcmludCh3YykpCisJCXJlc3VsdCB8PSBQR19J U1BSSU5UOworCWlmICgobWFzayAmIFBHX0lTUFVOQ1QpICYmIHVfaXNwdW5jdCh3YykpCisJCXJl c3VsdCB8PSBQR19JU1BVTkNUOworCWlmICgobWFzayAmIFBHX0lTU1BBQ0UpICYmIHVfaXNzcGFj ZSh3YykpCisJCXJlc3VsdCB8PSBQR19JU1NQQUNFOworCisJcmV0dXJuIHJlc3VsdDsKK30KKwor c3RhdGljIHBnX3djaGFyCit0b3VwcGVyX2ljdShwZ193Y2hhciB3YywgcGdfbG9jYWxlX3QgbG9j YWxlKQoreworCXJldHVybiB1X3RvdXBwZXIod2MpOworfQorCitzdGF0aWMgcGdfd2NoYXIKK3Rv bG93ZXJfaWN1KHBnX3djaGFyIHdjLCBwZ19sb2NhbGVfdCBsb2NhbGUpCit7CisJcmV0dXJuIHVf dG9sb3dlcih3Yyk7Cit9CisKK3N0cnVjdCBjb2xsYXRlX21ldGhvZHMgaWN1X2NvbGxhdGVfbWV0 aG9kcyA9IHsKKwkuc3RybmNvbGwgPSBzdHJuY29sbF9pY3UsCisJLnN0cm54ZnJtID0gc3Rybnhm cm1faWN1LAorCS5zdHJueGZybV9wcmVmaXggPSBzdHJueGZybV9wcmVmaXhfaWN1LAorfTsKKwor c3RydWN0IGN0eXBlX21ldGhvZHMgaWN1X2N0eXBlX21ldGhvZHMgPSB7CisJLmNoYXJfcHJvcHMg PSBjaGFyX3Byb3BzX2ljdSwKKwkud2NfdG91cHBlciA9IHRvdXBwZXJfaWN1LAorCS53Y190b2xv d2VyID0gdG9sb3dlcl9pY3UsCit9OworCitzdGF0aWMgdm9pZAorUmVzb3VyY2VPd25lclJlbWVt YmVyVUNvbGxhdG9yKFJlc291cmNlT3duZXIgb3duZXIsIFVDb2xsYXRvciAqY29sbGF0b3IpCit7 CisJUmVzb3VyY2VPd25lclJlbWVtYmVyKG93bmVyLCBQb2ludGVyR2V0RGF0dW0oY29sbGF0b3Ip LAorCQkJCQkJICAmVUNvbGxhdG9yUmVzb3VyY2VLaW5kKTsKK30KKworc3RhdGljIHZvaWQKK1Jl c093bmVyUmVsZWFzZVVDb2xsYXRvcihEYXR1bSB2YWwpCit7CisJVUNvbGxhdG9yICpjb2xsYXRv ciA9IChVQ29sbGF0b3IgKikgRGF0dW1HZXRQb2ludGVyKHZhbCk7CisJdWNvbF9jbG9zZShjb2xs YXRvcik7Cit9CisKK3BnX2xvY2FsZV90CitpY3VfZGF0X2NyZWF0ZV9sb2NhbGUoSGVhcFR1cGxl IGRhdHR1cGxlKQoreworCUZvcm1fcGdfZGF0YWJhc2UgZGJmb3JtOworCURhdHVtCQlkYXR1bTsK KwljaGFyCSAgICpkYXRsb2NhbGU7CisJY2hhcgkgICAqaWN1cnVsZXM7CisJYm9vbAkJaXNudWxs OworCXBnX2xvY2FsZV90IHJlc3VsdDsKKworCWRiZm9ybSA9IChGb3JtX3BnX2RhdGFiYXNlKSBH RVRTVFJVQ1QoZGF0dHVwbGUpOworCisJZGF0dW0gPSBTeXNDYWNoZUdldEF0dHJOb3ROdWxsKERB VEFCQVNFT0lELCBkYXR0dXBsZSwgQW51bV9wZ19kYXRhYmFzZV9kYXRsb2NhbGUpOworCWRhdGxv Y2FsZSA9IFRleHREYXR1bUdldENTdHJpbmcoZGF0dW0pOworCisJZGF0dW0gPSBTeXNDYWNoZUdl dEF0dHIoREFUQUJBU0VPSUQsIGRhdHR1cGxlLCBBbnVtX3BnX2RhdGFiYXNlX2RhdGljdXJ1bGVz LCAmaXNudWxsKTsKKwlpZiAoIWlzbnVsbCkKKwkJaWN1cnVsZXMgPSBUZXh0RGF0dW1HZXRDU3Ry aW5nKGRhdHVtKTsKKwllbHNlCisJCWljdXJ1bGVzID0gTlVMTDsKKworCXJlc3VsdCA9IE1lbW9y eUNvbnRleHRBbGxvY1plcm8oVG9wTWVtb3J5Q29udGV4dCwKKwkJCQkJCQkJCXNpemVvZihzdHJ1 Y3QgcGdfbG9jYWxlX3N0cnVjdCkpOworCisJcmVzdWx0LT5pbmZvLmljdS5sb2NhbGUgPSBNZW1v cnlDb250ZXh0U3RyZHVwKFRvcE1lbW9yeUNvbnRleHQsCisJCQkJCQkJCQkJCQkgIGRhdGxvY2Fs ZSk7CisJcmVzdWx0LT5wcm92aWRlciA9IGRiZm9ybS0+ZGF0bG9jcHJvdmlkZXI7CisJcmVzdWx0 LT5kZXRlcm1pbmlzdGljID0gdHJ1ZTsKKwlyZXN1bHQtPmNvbGxhdGVfaXNfYyA9IGZhbHNlOwor CXJlc3VsdC0+Y3R5cGVfaXNfYyA9IGZhbHNlOworCXJlc3VsdC0+Y29sbGF0ZSA9ICZpY3VfY29s bGF0ZV9tZXRob2RzOworCXJlc3VsdC0+Y3R5cGUgPSAmaWN1X2N0eXBlX21ldGhvZHM7CisJcmVz dWx0LT5pbmZvLmljdS51Y29sID0gbWFrZV9pY3VfY29sbGF0b3IoZGF0bG9jYWxlLCBpY3VydWxl cyk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitwZ19sb2NhbGVfdAoraWN1X2NvbGxfY3JlYXRl X2xvY2FsZShNZW1vcnlDb250ZXh0IGNvbnRleHQsIFJlc291cmNlT3duZXIgcmVzb3duZXIsCisJ CQkJCSAgIEhlYXBUdXBsZSBjb2xsdHVwbGUpCit7CisJRm9ybV9wZ19jb2xsYXRpb24gY29sbGZv cm07CisJRGF0dW0JCWRhdHVtOworCWJvb2wJCWlzbnVsbDsKKwljb25zdCBjaGFyICppY3Vsb2Nz dHI7CisJY29uc3QgY2hhciAqaWN1cnVsZXM7CisJVUNvbGxhdG9yICAqY29sbGF0b3I7CisJcGdf bG9jYWxlX3QgcmVzdWx0OworCisJY29sbGZvcm0gPSAoRm9ybV9wZ19jb2xsYXRpb24pIEdFVFNU UlVDVChjb2xsdHVwbGUpOworCisJQXNzZXJ0KGNvbGxmb3JtLT5jb2xscHJvdmlkZXIgPT0gQ09M TFBST1ZJREVSX0lDVSk7CisKKwlkYXR1bSA9IFN5c0NhY2hlR2V0QXR0ck5vdE51bGwoQ09MTE9J RCwgY29sbHR1cGxlLCBBbnVtX3BnX2NvbGxhdGlvbl9jb2xsbG9jYWxlKTsKKwlpY3Vsb2NzdHIg PSBUZXh0RGF0dW1HZXRDU3RyaW5nKGRhdHVtKTsKKworCWRhdHVtID0gU3lzQ2FjaGVHZXRBdHRy KENPTExPSUQsIGNvbGx0dXBsZSwgQW51bV9wZ19jb2xsYXRpb25fY29sbGljdXJ1bGVzLCAmaXNu dWxsKTsKKwlpZiAoIWlzbnVsbCkKKwkJaWN1cnVsZXMgPSBUZXh0RGF0dW1HZXRDU3RyaW5nKGRh dHVtKTsKKwllbHNlCisJCWljdXJ1bGVzID0gTlVMTDsKKworCVJlc291cmNlT3duZXJFbmxhcmdl KHJlc293bmVyKTsKKwljb2xsYXRvciA9IG1ha2VfaWN1X2NvbGxhdG9yKGljdWxvY3N0ciwgaWN1 cnVsZXMpOworCVJlc291cmNlT3duZXJSZW1lbWJlclVDb2xsYXRvcihyZXNvd25lciwgY29sbGF0 b3IpOworCisJcmVzdWx0ID0gTWVtb3J5Q29udGV4dEFsbG9jWmVybyhjb250ZXh0LAorCQkJCQkJ CQkJc2l6ZW9mKHN0cnVjdCBwZ19sb2NhbGVfc3RydWN0KSk7CisKKwlyZXN1bHQtPmluZm8uaWN1 LmxvY2FsZSA9IE1lbW9yeUNvbnRleHRTdHJkdXAoY29udGV4dCwgaWN1bG9jc3RyKTsKKwlyZXN1 bHQtPnByb3ZpZGVyID0gY29sbGZvcm0tPmNvbGxwcm92aWRlcjsKKwlyZXN1bHQtPmRldGVybWlu aXN0aWMgPSBjb2xsZm9ybS0+Y29sbGlzZGV0ZXJtaW5pc3RpYzsKKwlyZXN1bHQtPmNvbGxhdGVf aXNfYyA9IGZhbHNlOworCXJlc3VsdC0+Y3R5cGVfaXNfYyA9IGZhbHNlOworCXJlc3VsdC0+Y29s bGF0ZSA9ICZpY3VfY29sbGF0ZV9tZXRob2RzOworCXJlc3VsdC0+Y3R5cGUgPSAmaWN1X2N0eXBl X21ldGhvZHM7CisJcmVzdWx0LT5pbmZvLmljdS51Y29sID0gY29sbGF0b3I7CisKKwlyZXR1cm4g cmVzdWx0OworfQorCisvKgorICogQ3JlYXRlIGEgVUNvbGxhdG9yIHdpdGggdGhlIGdpdmVuIGxv Y2FsZSBzdHJpbmcgYW5kIHJ1bGVzLgorICoKKyAqIEVuc3VyZSB0aGF0IG5vIHBhdGggbGVha3Mg YSBVQ29sbGF0b3IuCisgKi8KK3N0YXRpYyBVQ29sbGF0b3IgKgorbWFrZV9pY3VfY29sbGF0b3Io Y29uc3QgY2hhciAqaWN1bG9jc3RyLCBjb25zdCBjaGFyICppY3VydWxlcykKK3sKKwlpZiAoIWlj dXJ1bGVzKQorCXsKKwkJLyogc2ltcGxlIGNhc2Ugd2l0aG91dCBydWxlcyAqLworCQlyZXR1cm4g cGdfdWNvbF9vcGVuKGljdWxvY3N0cik7CisJfQorCWVsc2UKKwl7CisJCVVDb2xsYXRvciAgKmNv bGxhdG9yX3N0ZF9ydWxlczsKKwkJVUNvbGxhdG9yICAqY29sbGF0b3JfYWxsX3J1bGVzOworCQlj b25zdCBVQ2hhciAqc3RkX3J1bGVzOworCQlVQ2hhcgkgICAqbXlfcnVsZXM7CisJCVVDaGFyCSAg ICphbGxfcnVsZXM7CisJCWludDMyX3QJCWxlbmd0aDsKKwkJaW50MzJfdAkJdG90YWw7CisJCVVF cnJvckNvZGUJc3RhdHVzOworCisJCS8qCisJCSAqIElmIHJ1bGVzIGFyZSBzcGVjaWZpZWQsIHdl IGV4dHJhY3QgdGhlIHJ1bGVzIG9mIHRoZSBzdGFuZGFyZAorCQkgKiBjb2xsYXRpb24sIGFkZCBv dXIgb3duIHJ1bGVzLCBhbmQgbWFrZSBhIG5ldyBjb2xsYXRvciB3aXRoIHRoZQorCQkgKiBjb21i aW5lZCBydWxlcy4KKwkJICovCisJCWljdV90b191Y2hhcigmbXlfcnVsZXMsIGljdXJ1bGVzLCBz dHJsZW4oaWN1cnVsZXMpKTsKKworCQljb2xsYXRvcl9zdGRfcnVsZXMgPSBwZ191Y29sX29wZW4o aWN1bG9jc3RyKTsKKworCQlzdGRfcnVsZXMgPSB1Y29sX2dldFJ1bGVzKGNvbGxhdG9yX3N0ZF9y dWxlcywgJmxlbmd0aCk7CisKKwkJdG90YWwgPSB1X3N0cmxlbihzdGRfcnVsZXMpICsgdV9zdHJs ZW4obXlfcnVsZXMpICsgMTsKKworCQkvKiBhdm9pZCBsZWFraW5nIGNvbGxhdG9yIG9uIE9PTSAq LworCQlhbGxfcnVsZXMgPSBwYWxsb2NfZXh0ZW5kZWQoc2l6ZW9mKFVDaGFyKSAqIHRvdGFsLCBN Q1hUX0FMTE9DX05PX09PTSk7CisJCWlmICghYWxsX3J1bGVzKQorCQl7CisJCQl1Y29sX2Nsb3Nl KGNvbGxhdG9yX3N0ZF9ydWxlcyk7CisJCQllcmVwb3J0KEVSUk9SLAorCQkJCQkoZXJyY29kZShF UlJDT0RFX09VVF9PRl9NRU1PUlkpLAorCQkJCQkgZXJybXNnKCJvdXQgb2YgbWVtb3J5IikpKTsK KwkJfQorCisJCXVfc3RyY3B5KGFsbF9ydWxlcywgc3RkX3J1bGVzKTsKKwkJdV9zdHJjYXQoYWxs X3J1bGVzLCBteV9ydWxlcyk7CisKKwkJdWNvbF9jbG9zZShjb2xsYXRvcl9zdGRfcnVsZXMpOwor CisJCXN0YXR1cyA9IFVfWkVST19FUlJPUjsKKwkJY29sbGF0b3JfYWxsX3J1bGVzID0gdWNvbF9v cGVuUnVsZXMoYWxsX3J1bGVzLCB1X3N0cmxlbihhbGxfcnVsZXMpLAorCQkJCQkJCQkJCQlVQ09M X0RFRkFVTFQsIFVDT0xfREVGQVVMVF9TVFJFTkdUSCwKKwkJCQkJCQkJCQkJTlVMTCwgJnN0YXR1 cyk7CisJCWlmIChVX0ZBSUxVUkUoc3RhdHVzKSkKKwkJeworCQkJZXJlcG9ydChFUlJPUiwKKwkJ CQkJKGVycmNvZGUoRVJSQ09ERV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRSksCisJCQkJCSBlcnJt c2coImNvdWxkIG5vdCBvcGVuIGNvbGxhdG9yIGZvciBsb2NhbGUgXCIlc1wiIHdpdGggcnVsZXMg XCIlc1wiOiAlcyIsCisJCQkJCQkJaWN1bG9jc3RyLCBpY3VydWxlcywgdV9lcnJvck5hbWUoc3Rh dHVzKSkpKTsKKwkJfQorCisJCXJldHVybiBjb2xsYXRvcl9hbGxfcnVsZXM7CisJfQorfQorCisK Ky8qCisgKiBzdHJuY29sbF9pY3Vfbm9fdXRmOAorICoKKyAqIENvbnZlcnQgdGhlIGFyZ3VtZW50 cyBmcm9tIHRoZSBkYXRhYmFzZSBlbmNvZGluZyB0byBVQ2hhciBzdHJpbmdzLCB0aGVuCisgKiBj YWxsIHVjb2xfc3RyY29sbCgpLiBBbiBhcmd1bWVudCBsZW5ndGggb2YgLTEgbWVhbnMgdGhhdCB0 aGUgc3RyaW5nIGlzCisgKiBOVUwtdGVybWluYXRlZC4KKyAqCisgKiBXaGVuIHRoZSBkYXRhYmFz ZSBlbmNvZGluZyBpcyBVVEYtOCwgYW5kIElDVSBzdXBwb3J0cyB1Y29sX3N0cmNvbGxVVEY4KCks CisgKiBjYWxsZXIgc2hvdWxkIGNhbGwgdGhhdCBpbnN0ZWFkLgorICovCitzdGF0aWMgaW50Citz dHJuY29sbF9pY3Vfbm9fdXRmOChjb25zdCBjaGFyICphcmcxLCBzc2l6ZV90IGxlbjEsCisJCQkJ CSBjb25zdCBjaGFyICphcmcyLCBzc2l6ZV90IGxlbjIsIHBnX2xvY2FsZV90IGxvY2FsZSkKK3sK KwljaGFyCQlzYnVmW1RFWFRCVUZMRU5dOworCWNoYXIJICAgKmJ1ZiA9IHNidWY7CisJaW50MzJf dAkJdWxlbjE7CisJaW50MzJfdAkJdWxlbjI7CisJc2l6ZV90CQlidWZzaXplMTsKKwlzaXplX3QJ CWJ1ZnNpemUyOworCVVDaGFyCSAgICp1Y2hhcjEsCisJCQkgICAqdWNoYXIyOworCWludAkJCXJl c3VsdDsKKworCUFzc2VydChsb2NhbGUtPnByb3ZpZGVyID09IENPTExQUk9WSURFUl9JQ1UpOwor I2lmZGVmIEhBVkVfVUNPTF9TVFJDT0xMVVRGOAorCUFzc2VydChHZXREYXRhYmFzZUVuY29kaW5n KCkgIT0gUEdfVVRGOCk7CisjZW5kaWYKKworCWluaXRfaWN1X2NvbnZlcnRlcigpOworCisJdWxl bjEgPSB1Y2hhcl9sZW5ndGgoaWN1X2NvbnZlcnRlciwgYXJnMSwgbGVuMSk7CisJdWxlbjIgPSB1 Y2hhcl9sZW5ndGgoaWN1X2NvbnZlcnRlciwgYXJnMiwgbGVuMik7CisKKwlidWZzaXplMSA9ICh1 bGVuMSArIDEpICogc2l6ZW9mKFVDaGFyKTsKKwlidWZzaXplMiA9ICh1bGVuMiArIDEpICogc2l6 ZW9mKFVDaGFyKTsKKworCWlmIChidWZzaXplMSArIGJ1ZnNpemUyID4gVEVYVEJVRkxFTikKKwkJ YnVmID0gcGFsbG9jKGJ1ZnNpemUxICsgYnVmc2l6ZTIpOworCisJdWNoYXIxID0gKFVDaGFyICop IGJ1ZjsKKwl1Y2hhcjIgPSAoVUNoYXIgKikgKGJ1ZiArIGJ1ZnNpemUxKTsKKworCXVsZW4xID0g dWNoYXJfY29udmVydChpY3VfY29udmVydGVyLCB1Y2hhcjEsIHVsZW4xICsgMSwgYXJnMSwgbGVu MSk7CisJdWxlbjIgPSB1Y2hhcl9jb252ZXJ0KGljdV9jb252ZXJ0ZXIsIHVjaGFyMiwgdWxlbjIg KyAxLCBhcmcyLCBsZW4yKTsKKworCXJlc3VsdCA9IHVjb2xfc3RyY29sbChsb2NhbGUtPmluZm8u aWN1LnVjb2wsCisJCQkJCQkgIHVjaGFyMSwgdWxlbjEsCisJCQkJCQkgIHVjaGFyMiwgdWxlbjIp OworCisJaWYgKGJ1ZiAhPSBzYnVmKQorCQlwZnJlZShidWYpOworCisJcmV0dXJuIHJlc3VsdDsK K30KKworLyoKKyAqIHN0cm5jb2xsX2ljdQorICoKKyAqIENhbGwgdWNvbF9zdHJjb2xsVVRGOCgp IG9yIHVjb2xfc3RyY29sbCgpIGFzIGFwcHJvcHJpYXRlIGZvciB0aGUgZ2l2ZW4KKyAqIGRhdGFi YXNlIGVuY29kaW5nLiBBbiBhcmd1bWVudCBsZW5ndGggb2YgLTEgbWVhbnMgdGhlIHN0cmluZyBp cworICogTlVMLXRlcm1pbmF0ZWQuCisgKi8KK3N0YXRpYyBpbnQKK3N0cm5jb2xsX2ljdShjb25z dCBjaGFyICphcmcxLCBzc2l6ZV90IGxlbjEsIGNvbnN0IGNoYXIgKmFyZzIsIHNzaXplX3QgbGVu MiwKKwkJCSBwZ19sb2NhbGVfdCBsb2NhbGUpCit7CisJaW50CQkJcmVzdWx0OworCisJQXNzZXJ0 KGxvY2FsZS0+cHJvdmlkZXIgPT0gQ09MTFBST1ZJREVSX0lDVSk7CisKKyNpZmRlZiBIQVZFX1VD T0xfU1RSQ09MTFVURjgKKwlpZiAoR2V0RGF0YWJhc2VFbmNvZGluZygpID09IFBHX1VURjgpCisJ eworCQlVRXJyb3JDb2RlCXN0YXR1czsKKworCQlzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisJCXJl c3VsdCA9IHVjb2xfc3RyY29sbFVURjgobG9jYWxlLT5pbmZvLmljdS51Y29sLAorCQkJCQkJCQkg IGFyZzEsIGxlbjEsCisJCQkJCQkJCSAgYXJnMiwgbGVuMiwKKwkJCQkJCQkJICAmc3RhdHVzKTsK KwkJaWYgKFVfRkFJTFVSRShzdGF0dXMpKQorCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJKGVycm1z ZygiY29sbGF0aW9uIGZhaWxlZDogJXMiLCB1X2Vycm9yTmFtZShzdGF0dXMpKSkpOworCX0KKwll bHNlCisjZW5kaWYKKwl7CisJCXJlc3VsdCA9IHN0cm5jb2xsX2ljdV9ub191dGY4KGFyZzEsIGxl bjEsIGFyZzIsIGxlbjIsIGxvY2FsZSk7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworCisv KiAnc3JjbGVuJyBvZiAtMSBtZWFucyB0aGUgc3RyaW5ncyBhcmUgTlVMLXRlcm1pbmF0ZWQgKi8K K3N0YXRpYyBzaXplX3QKK3N0cm54ZnJtX2ljdShjaGFyICpkZXN0LCBzaXplX3QgZGVzdHNpemUs IGNvbnN0IGNoYXIgKnNyYywgc3NpemVfdCBzcmNsZW4sCisJCQkgcGdfbG9jYWxlX3QgbG9jYWxl KQoreworCWNoYXIJCXNidWZbVEVYVEJVRkxFTl07CisJY2hhcgkgICAqYnVmID0gc2J1ZjsKKwlV Q2hhcgkgICAqdWNoYXI7CisJaW50MzJfdAkJdWxlbjsKKwlzaXplX3QJCXVjaGFyX2JzaXplOwor CVNpemUJCXJlc3VsdF9ic2l6ZTsKKworCUFzc2VydChsb2NhbGUtPnByb3ZpZGVyID09IENPTExQ Uk9WSURFUl9JQ1UpOworCisJaW5pdF9pY3VfY29udmVydGVyKCk7CisKKwl1bGVuID0gdWNoYXJf bGVuZ3RoKGljdV9jb252ZXJ0ZXIsIHNyYywgc3JjbGVuKTsKKworCXVjaGFyX2JzaXplID0gKHVs ZW4gKyAxKSAqIHNpemVvZihVQ2hhcik7CisKKwlpZiAodWNoYXJfYnNpemUgPiBURVhUQlVGTEVO KQorCQlidWYgPSBwYWxsb2ModWNoYXJfYnNpemUpOworCisJdWNoYXIgPSAoVUNoYXIgKikgYnVm OworCisJdWxlbiA9IHVjaGFyX2NvbnZlcnQoaWN1X2NvbnZlcnRlciwgdWNoYXIsIHVsZW4gKyAx LCBzcmMsIHNyY2xlbik7CisKKwlyZXN1bHRfYnNpemUgPSB1Y29sX2dldFNvcnRLZXkobG9jYWxl LT5pbmZvLmljdS51Y29sLAorCQkJCQkJCQkgICB1Y2hhciwgdWxlbiwKKwkJCQkJCQkJICAgKHVp bnQ4X3QgKikgZGVzdCwgZGVzdHNpemUpOworCisJLyoKKwkgKiB1Y29sX2dldFNvcnRLZXkoKSBj b3VudHMgdGhlIG51bC10ZXJtaW5hdG9yIGluIHRoZSByZXN1bHQgbGVuZ3RoLCBidXQKKwkgKiB0 aGlzIGZ1bmN0aW9uIHNob3VsZCBub3QuCisJICovCisJQXNzZXJ0KHJlc3VsdF9ic2l6ZSA+IDAp OworCXJlc3VsdF9ic2l6ZS0tOworCisJaWYgKGJ1ZiAhPSBzYnVmKQorCQlwZnJlZShidWYpOwor CisJLyogaWYgZGVzdCBpcyBkZWZpbmVkLCBpdCBzaG91bGQgYmUgbnVsLXRlcm1pbmF0ZWQgKi8K KwlBc3NlcnQocmVzdWx0X2JzaXplID49IGRlc3RzaXplIHx8IGRlc3RbcmVzdWx0X2JzaXplXSA9 PSAnXDAnKTsKKworCXJldHVybiByZXN1bHRfYnNpemU7Cit9CisKKy8qICdzcmNsZW4nIG9mIC0x IG1lYW5zIHRoZSBzdHJpbmdzIGFyZSBOVUwtdGVybWluYXRlZCAqLworc3RhdGljIHNpemVfdAor c3Rybnhmcm1fcHJlZml4X2ljdV9ub191dGY4KGNoYXIgKmRlc3Qsc2l6ZV90IGRlc3RzaXplLAor CQkJCQkJCWNvbnN0IGNoYXIgKnNyYywgc3NpemVfdCBzcmNsZW4sCisJCQkJCQkJcGdfbG9jYWxl X3QgbG9jYWxlKQoreworCWNoYXIJCXNidWZbVEVYVEJVRkxFTl07CisJY2hhcgkgICAqYnVmID0g c2J1ZjsKKwlVQ2hhckl0ZXJhdG9yIGl0ZXI7CisJdWludDMyX3QJc3RhdGVbMl07CisJVUVycm9y Q29kZQlzdGF0dXM7CisJaW50MzJfdAkJdWxlbiA9IC0xOworCVVDaGFyCSAgICp1Y2hhciA9IE5V TEw7CisJc2l6ZV90CQl1Y2hhcl9ic2l6ZTsKKwlTaXplCQlyZXN1bHRfYnNpemU7CisKKwlBc3Nl cnQobG9jYWxlLT5wcm92aWRlciA9PSBDT0xMUFJPVklERVJfSUNVKTsKKwlBc3NlcnQoR2V0RGF0 YWJhc2VFbmNvZGluZygpICE9IFBHX1VURjgpOworCisJaW5pdF9pY3VfY29udmVydGVyKCk7CisK Kwl1bGVuID0gdWNoYXJfbGVuZ3RoKGljdV9jb252ZXJ0ZXIsIHNyYywgc3JjbGVuKTsKKworCXVj aGFyX2JzaXplID0gKHVsZW4gKyAxKSAqIHNpemVvZihVQ2hhcik7CisKKwlpZiAodWNoYXJfYnNp emUgPiBURVhUQlVGTEVOKQorCQlidWYgPSBwYWxsb2ModWNoYXJfYnNpemUpOworCisJdWNoYXIg PSAoVUNoYXIgKikgYnVmOworCisJdWxlbiA9IHVjaGFyX2NvbnZlcnQoaWN1X2NvbnZlcnRlciwg dWNoYXIsIHVsZW4gKyAxLCBzcmMsIHNyY2xlbik7CisKKwl1aXRlcl9zZXRTdHJpbmcoJml0ZXIs IHVjaGFyLCB1bGVuKTsKKwlzdGF0ZVswXSA9IHN0YXRlWzFdID0gMDsJLyogd29uJ3QgbmVlZCB0 aGF0IGFnYWluICovCisJc3RhdHVzID0gVV9aRVJPX0VSUk9SOworCXJlc3VsdF9ic2l6ZSA9IHVj b2xfbmV4dFNvcnRLZXlQYXJ0KGxvY2FsZS0+aW5mby5pY3UudWNvbCwKKwkJCQkJCQkJCQkmaXRl ciwKKwkJCQkJCQkJCQlzdGF0ZSwKKwkJCQkJCQkJCQkodWludDhfdCAqKSBkZXN0LAorCQkJCQkJ CQkJCWRlc3RzaXplLAorCQkJCQkJCQkJCSZzdGF0dXMpOworCWlmIChVX0ZBSUxVUkUoc3RhdHVz KSkKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJybXNnKCJzb3J0IGtleSBnZW5lcmF0aW9uIGZh aWxlZDogJXMiLAorCQkJCQkJdV9lcnJvck5hbWUoc3RhdHVzKSkpKTsKKworCXJldHVybiByZXN1 bHRfYnNpemU7Cit9CisKKy8qICdzcmNsZW4nIG9mIC0xIG1lYW5zIHRoZSBzdHJpbmdzIGFyZSBO VUwtdGVybWluYXRlZCAqLworc3RhdGljIHNpemVfdAorc3Rybnhmcm1fcHJlZml4X2ljdShjaGFy ICpkZXN0LCBzaXplX3QgZGVzdHNpemUsCisJCQkJCWNvbnN0IGNoYXIgKnNyYywgc3NpemVfdCBz cmNsZW4sCisJCQkJCXBnX2xvY2FsZV90IGxvY2FsZSkKK3sKKwlzaXplX3QJCXJlc3VsdDsKKwor CUFzc2VydChsb2NhbGUtPnByb3ZpZGVyID09IENPTExQUk9WSURFUl9JQ1UpOworCisJaWYgKEdl dERhdGFiYXNlRW5jb2RpbmcoKSA9PSBQR19VVEY4KQorCXsKKwkJVUNoYXJJdGVyYXRvciBpdGVy OworCQl1aW50MzJfdAlzdGF0ZVsyXTsKKwkJVUVycm9yQ29kZQlzdGF0dXM7CisKKwkJdWl0ZXJf c2V0VVRGOCgmaXRlciwgc3JjLCBzcmNsZW4pOworCQlzdGF0ZVswXSA9IHN0YXRlWzFdID0gMDsJ Lyogd29uJ3QgbmVlZCB0aGF0IGFnYWluICovCisJCXN0YXR1cyA9IFVfWkVST19FUlJPUjsKKwkJ cmVzdWx0ID0gdWNvbF9uZXh0U29ydEtleVBhcnQobG9jYWxlLT5pbmZvLmljdS51Y29sLAorCQkJ CQkJCQkJICAmaXRlciwKKwkJCQkJCQkJCSAgc3RhdGUsCisJCQkJCQkJCQkgICh1aW50OF90ICop IGRlc3QsCisJCQkJCQkJCQkgIGRlc3RzaXplLAorCQkJCQkJCQkJICAmc3RhdHVzKTsKKwkJaWYg KFVfRkFJTFVSRShzdGF0dXMpKQorCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJKGVycm1zZygic29y dCBrZXkgZ2VuZXJhdGlvbiBmYWlsZWQ6ICVzIiwKKwkJCQkJCQl1X2Vycm9yTmFtZShzdGF0dXMp KSkpOworCX0KKwllbHNlCisJCXJlc3VsdCA9IHN0cm54ZnJtX3ByZWZpeF9pY3Vfbm9fdXRmOChk ZXN0LCBkZXN0c2l6ZSwgc3JjLCBzcmNsZW4sCisJCQkJCQkJCQkJCSBsb2NhbGUpOworCisJcmV0 dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIFdyYXBwZXIgYXJvdW5kIHVjb2xfb3BlbigpIHRvIGhh bmRsZSBBUEkgZGlmZmVyZW5jZXMgZm9yIG9sZGVyIElDVQorICogdmVyc2lvbnMuCisgKgorICog RW5zdXJlIHRoYXQgbm8gcGF0aCBsZWFrcyBhIFVDb2xsYXRvci4KKyAqLworVUNvbGxhdG9yICoK K3BnX3Vjb2xfb3Blbihjb25zdCBjaGFyICpsb2Nfc3RyKQoreworCVVDb2xsYXRvciAgKmNvbGxh dG9yOworCVVFcnJvckNvZGUJc3RhdHVzOworCWNvbnN0IGNoYXIgKm9yaWdfc3RyID0gbG9jX3N0 cjsKKwljaGFyCSAgICpmaXhlZF9zdHIgPSBOVUxMOworCisJLyoKKwkgKiBNdXN0IG5ldmVyIG9w ZW4gZGVmYXVsdCBjb2xsYXRvciwgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIHRoZSBlbnZpcm9ubWVu dAorCSAqIGFuZCBtYXkgY2hhbmdlIGF0IGFueSB0aW1lLiBTaG91bGQgbm90IGhhcHBlbiwgYnV0 IGNoZWNrIGhlcmUgdG8gY2F0Y2gKKwkgKiBidWdzIHRoYXQgbWlnaHQgYmUgaGFyZCB0byBjYXRj aCBvdGhlcndpc2UuCisJICoKKwkgKiBOQjogdGhlIGRlZmF1bHQgY29sbGF0b3IgaXMgbm90IHRo ZSBzYW1lIGFzIHRoZSBjb2xsYXRvciBmb3IgdGhlIHJvb3QKKwkgKiBsb2NhbGUuIFRoZSByb290 IGxvY2FsZSBtYXkgYmUgc3BlY2lmaWVkIGFzIHRoZSBlbXB0eSBzdHJpbmcsICJ1bmQiLCBvcgor CSAqICJyb290Ii4gVGhlIGRlZmF1bHQgY29sbGF0b3IgaXMgb3BlbmVkIGJ5IHBhc3NpbmcgTlVM TCB0byB1Y29sX29wZW4oKS4KKwkgKi8KKwlpZiAobG9jX3N0ciA9PSBOVUxMKQorCQllbG9nKEVS Uk9SLCAib3BlbmluZyBkZWZhdWx0IGNvbGxhdG9yIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKworCS8q CisJICogSW4gSUNVIHZlcnNpb25zIDU0IGFuZCBlYXJsaWVyLCAidW5kIiBpcyBub3QgYSByZWNv Z25pemVkIHNwZWxsaW5nIG9mCisJICogdGhlIHJvb3QgbG9jYWxlLiBJZiB0aGUgZmlyc3QgY29t cG9uZW50IG9mIHRoZSBsb2NhbGUgaXMgInVuZCIsIHJlcGxhY2UKKwkgKiB3aXRoICJyb290IiBi ZWZvcmUgb3BlbmluZy4KKwkgKi8KKwlpZiAoVV9JQ1VfVkVSU0lPTl9NQUpPUl9OVU0gPCA1NSkK Kwl7CisJCWNoYXIJCWxhbmdbVUxPQ19MQU5HX0NBUEFDSVRZXTsKKworCQlzdGF0dXMgPSBVX1pF Uk9fRVJST1I7CisJCXVsb2NfZ2V0TGFuZ3VhZ2UobG9jX3N0ciwgbGFuZywgVUxPQ19MQU5HX0NB UEFDSVRZLCAmc3RhdHVzKTsKKwkJaWYgKFVfRkFJTFVSRShzdGF0dXMpIHx8IHN0YXR1cyA9PSBV X1NUUklOR19OT1RfVEVSTUlOQVRFRF9XQVJOSU5HKQorCQl7CisJCQllcmVwb3J0KEVSUk9SLAor CQkJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFKSwKKwkJCQkJIGVy cm1zZygiY291bGQgbm90IGdldCBsYW5ndWFnZSBmcm9tIGxvY2FsZSBcIiVzXCI6ICVzIiwKKwkJ CQkJCQlsb2Nfc3RyLCB1X2Vycm9yTmFtZShzdGF0dXMpKSkpOworCQl9CisKKwkJaWYgKHN0cmNt cChsYW5nLCAidW5kIikgPT0gMCkKKwkJeworCQkJY29uc3QgY2hhciAqcmVtYWluZGVyID0gbG9j X3N0ciArIHN0cmxlbigidW5kIik7CisKKwkJCWZpeGVkX3N0ciA9IHBhbGxvYyhzdHJsZW4oInJv b3QiKSArIHN0cmxlbihyZW1haW5kZXIpICsgMSk7CisJCQlzdHJjcHkoZml4ZWRfc3RyLCAicm9v dCIpOworCQkJc3RyY2F0KGZpeGVkX3N0ciwgcmVtYWluZGVyKTsKKworCQkJbG9jX3N0ciA9IGZp eGVkX3N0cjsKKwkJfQorCX0KKworCXN0YXR1cyA9IFVfWkVST19FUlJPUjsKKwljb2xsYXRvciA9 IHVjb2xfb3Blbihsb2Nfc3RyLCAmc3RhdHVzKTsKKwlpZiAoVV9GQUlMVVJFKHN0YXR1cykpCisJ CWVyZXBvcnQoRVJST1IsCisJCS8qIHVzZSBvcmlnaW5hbCBzdHJpbmcgZm9yIGVycm9yIHJlcG9y dCAqLworCQkJCShlcnJjb2RlKEVSUkNPREVfSU5WQUxJRF9QQVJBTUVURVJfVkFMVUUpLAorCQkJ CSBlcnJtc2coImNvdWxkIG5vdCBvcGVuIGNvbGxhdG9yIGZvciBsb2NhbGUgXCIlc1wiOiAlcyIs CisJCQkJCQlvcmlnX3N0ciwgdV9lcnJvck5hbWUoc3RhdHVzKSkpKTsKKworCWlmIChVX0lDVV9W RVJTSU9OX01BSk9SX05VTSA8IDU0KQorCXsKKwkJc3RhdHVzID0gVV9aRVJPX0VSUk9SOworCQlp Y3Vfc2V0X2NvbGxhdGlvbl9hdHRyaWJ1dGVzKGNvbGxhdG9yLCBsb2Nfc3RyLCAmc3RhdHVzKTsK KworCQkvKgorCQkgKiBQcmV0ZW5kIHRoZSBlcnJvciBjYW1lIGZyb20gdWNvbF9vcGVuKCksIGZv ciBjb25zaXN0ZW50IGVycm9yCisJCSAqIG1lc3NhZ2UgYWNyb3NzIElDVSB2ZXJzaW9ucy4KKwkJ ICovCisJCWlmIChVX0ZBSUxVUkUoc3RhdHVzKSB8fCBzdGF0dXMgPT0gVV9TVFJJTkdfTk9UX1RF Uk1JTkFURURfV0FSTklORykKKwkJeworCQkJdWNvbF9jbG9zZShjb2xsYXRvcik7CisJCQllcmVw b3J0KEVSUk9SLAorCQkJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVF KSwKKwkJCQkJIGVycm1zZygiY291bGQgbm90IG9wZW4gY29sbGF0b3IgZm9yIGxvY2FsZSBcIiVz XCI6ICVzIiwKKwkJCQkJCQlvcmlnX3N0ciwgdV9lcnJvck5hbWUoc3RhdHVzKSkpKTsKKwkJfQor CX0KKworCWlmIChmaXhlZF9zdHIgIT0gTlVMTCkKKwkJcGZyZWUoZml4ZWRfc3RyKTsKKworCXJl dHVybiBjb2xsYXRvcjsKK30KKworc3RhdGljIHZvaWQKK2luaXRfaWN1X2NvbnZlcnRlcih2b2lk KQoreworCWNvbnN0IGNoYXIgKmljdV9lbmNvZGluZ19uYW1lOworCVVFcnJvckNvZGUJc3RhdHVz OworCVVDb252ZXJ0ZXIgKmNvbnY7CisKKwlpZiAoaWN1X2NvbnZlcnRlcikKKwkJcmV0dXJuOwkJ CQkJLyogYWxyZWFkeSBkb25lICovCisKKwlpY3VfZW5jb2RpbmdfbmFtZSA9IGdldF9lbmNvZGlu Z19uYW1lX2Zvcl9pY3UoR2V0RGF0YWJhc2VFbmNvZGluZygpKTsKKwlpZiAoIWljdV9lbmNvZGlu Z19uYW1lKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9O T1RfU1VQUE9SVEVEKSwKKwkJCQkgZXJybXNnKCJlbmNvZGluZyBcIiVzXCIgbm90IHN1cHBvcnRl ZCBieSBJQ1UiLAorCQkJCQkJcGdfZW5jb2RpbmdfdG9fY2hhcihHZXREYXRhYmFzZUVuY29kaW5n KCkpKSkpOworCisJc3RhdHVzID0gVV9aRVJPX0VSUk9SOworCWNvbnYgPSB1Y252X29wZW4oaWN1 X2VuY29kaW5nX25hbWUsICZzdGF0dXMpOworCWlmIChVX0ZBSUxVUkUoc3RhdHVzKSkKKwkJZXJl cG9ydChFUlJPUiwKKwkJCQkoZXJybXNnKCJjb3VsZCBub3Qgb3BlbiBJQ1UgY29udmVydGVyIGZv ciBlbmNvZGluZyBcIiVzXCI6ICVzIiwKKwkJCQkJCWljdV9lbmNvZGluZ19uYW1lLCB1X2Vycm9y TmFtZShzdGF0dXMpKSkpOworCisJaWN1X2NvbnZlcnRlciA9IGNvbnY7Cit9CisKKy8qCisgKiBG aW5kIGxlbmd0aCwgaW4gVUNoYXJzLCBvZiBnaXZlbiBzdHJpbmcgaWYgY29udmVydGVkIHRvIFVD aGFyIHN0cmluZy4KKyAqCisgKiBBIGxlbmd0aCBvZiAtMSBpbmRpY2F0ZXMgdGhhdCB0aGUgaW5w dXQgc3RyaW5nIGlzIE5VTC10ZXJtaW5hdGVkLgorICovCitzdGF0aWMgc2l6ZV90Cit1Y2hhcl9s ZW5ndGgoVUNvbnZlcnRlciAqY29udmVydGVyLCBjb25zdCBjaGFyICpzdHIsIGludDMyX3QgbGVu KQoreworCVVFcnJvckNvZGUJc3RhdHVzID0gVV9aRVJPX0VSUk9SOworCWludDMyX3QJCXVsZW47 CisKKwl1bGVuID0gdWNudl90b1VDaGFycyhjb252ZXJ0ZXIsIE5VTEwsIDAsIHN0ciwgbGVuLCAm c3RhdHVzKTsKKwlpZiAoVV9GQUlMVVJFKHN0YXR1cykgJiYgc3RhdHVzICE9IFVfQlVGRkVSX09W RVJGTE9XX0VSUk9SKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJtc2coIiVzIGZhaWxlZDog JXMiLCAidWNudl90b1VDaGFycyIsIHVfZXJyb3JOYW1lKHN0YXR1cykpKSk7CisJcmV0dXJuIHVs ZW47Cit9CisKKy8qCisgKiBDb252ZXJ0IHRoZSBnaXZlbiBzb3VyY2Ugc3RyaW5nIGludG8gYSBV Q2hhciBzdHJpbmcsIHN0b3JlZCBpbiBkZXN0LCBhbmQKKyAqIHJldHVybiB0aGUgbGVuZ3RoIChp biBVQ2hhcnMpLgorICoKKyAqIEEgc3JjbGVuIG9mIC0xIGluZGljYXRlcyB0aGF0IHRoZSBpbnB1 dCBzdHJpbmcgaXMgTlVMLXRlcm1pbmF0ZWQuCisgKi8KK3N0YXRpYyBpbnQzMl90Cit1Y2hhcl9j b252ZXJ0KFVDb252ZXJ0ZXIgKmNvbnZlcnRlciwgVUNoYXIgKmRlc3QsIGludDMyX3QgZGVzdGxl biwKKwkJCSAgY29uc3QgY2hhciAqc3JjLCBpbnQzMl90IHNyY2xlbikKK3sKKwlVRXJyb3JDb2Rl CXN0YXR1cyA9IFVfWkVST19FUlJPUjsKKwlpbnQzMl90CQl1bGVuOworCisJc3RhdHVzID0gVV9a RVJPX0VSUk9SOworCXVsZW4gPSB1Y252X3RvVUNoYXJzKGNvbnZlcnRlciwgZGVzdCwgZGVzdGxl biwgc3JjLCBzcmNsZW4sICZzdGF0dXMpOworCWlmIChVX0ZBSUxVUkUoc3RhdHVzKSkKKwkJZXJl cG9ydChFUlJPUiwKKwkJCQkoZXJybXNnKCIlcyBmYWlsZWQ6ICVzIiwgInVjbnZfdG9VQ2hhcnMi LCB1X2Vycm9yTmFtZShzdGF0dXMpKSkpOworCXJldHVybiB1bGVuOworfQorCisvKgorICogQ29u dmVydCBhIHN0cmluZyBpbiB0aGUgZGF0YWJhc2UgZW5jb2RpbmcgaW50byBhIHN0cmluZyBvZiBV Q2hhcnMuCisgKgorICogVGhlIHNvdXJjZSBzdHJpbmcgYXQgYnVmZiBpcyBvZiBsZW5ndGggbmJ5 dGVzCisgKiAoaXQgbmVlZG4ndCBiZSBudWwtdGVybWluYXRlZCkKKyAqCisgKiAqYnVmZl91Y2hh ciByZWNlaXZlcyBhIHBvaW50ZXIgdG8gdGhlIHBhbGxvYydkIHJlc3VsdCBzdHJpbmcsIGFuZAor ICogdGhlIGZ1bmN0aW9uJ3MgcmVzdWx0IGlzIHRoZSBudW1iZXIgb2YgVUNoYXJzIGdlbmVyYXRl ZC4KKyAqCisgKiBUaGUgcmVzdWx0IHN0cmluZyBpcyBudWwtdGVybWluYXRlZCwgdGhvdWdoIG1v c3QgY2FsbGVycyByZWx5IG9uIHRoZQorICogcmVzdWx0IGxlbmd0aCBpbnN0ZWFkLgorICovCitp bnQzMl90CitpY3VfdG9fdWNoYXIoVUNoYXIgKipidWZmX3VjaGFyLCBjb25zdCBjaGFyICpidWZm LCBzaXplX3QgbmJ5dGVzKQoreworCWludDMyX3QJCWxlbl91Y2hhcjsKKworCWluaXRfaWN1X2Nv bnZlcnRlcigpOworCisJbGVuX3VjaGFyID0gdWNoYXJfbGVuZ3RoKGljdV9jb252ZXJ0ZXIsIGJ1 ZmYsIG5ieXRlcyk7CisKKwkqYnVmZl91Y2hhciA9IHBhbGxvYygobGVuX3VjaGFyICsgMSkgKiBz aXplb2YoKipidWZmX3VjaGFyKSk7CisJbGVuX3VjaGFyID0gdWNoYXJfY29udmVydChpY3VfY29u dmVydGVyLAorCQkJCQkJCSAgKmJ1ZmZfdWNoYXIsIGxlbl91Y2hhciArIDEsIGJ1ZmYsIG5ieXRl cyk7CisKKwlyZXR1cm4gbGVuX3VjaGFyOworfQorCisvKgorICogQ29udmVydCBhIHN0cmluZyBv ZiBVQ2hhcnMgaW50byB0aGUgZGF0YWJhc2UgZW5jb2RpbmcuCisgKgorICogVGhlIHNvdXJjZSBz dHJpbmcgYXQgYnVmZl91Y2hhciBpcyBvZiBsZW5ndGggbGVuX3VjaGFyCisgKiAoaXQgbmVlZG4n dCBiZSBudWwtdGVybWluYXRlZCkKKyAqCisgKiAqcmVzdWx0IHJlY2VpdmVzIGEgcG9pbnRlciB0 byB0aGUgcGFsbG9jJ2QgcmVzdWx0IHN0cmluZywgYW5kIHRoZQorICogZnVuY3Rpb24ncyByZXN1 bHQgaXMgdGhlIG51bWJlciBvZiBieXRlcyBnZW5lcmF0ZWQgKG5vdCBjb3VudGluZyBudWwpLgor ICoKKyAqIFRoZSByZXN1bHQgc3RyaW5nIGlzIG51bC10ZXJtaW5hdGVkLgorICovCitpbnQzMl90 CitpY3VfZnJvbV91Y2hhcihjaGFyICoqcmVzdWx0LCBjb25zdCBVQ2hhciAqYnVmZl91Y2hhciwg aW50MzJfdCBsZW5fdWNoYXIpCit7CisJVUVycm9yQ29kZQlzdGF0dXM7CisJaW50MzJfdAkJbGVu X3Jlc3VsdDsKKworCWluaXRfaWN1X2NvbnZlcnRlcigpOworCisJc3RhdHVzID0gVV9aRVJPX0VS Uk9SOworCWxlbl9yZXN1bHQgPSB1Y252X2Zyb21VQ2hhcnMoaWN1X2NvbnZlcnRlciwgTlVMTCwg MCwKKwkJCQkJCQkJIGJ1ZmZfdWNoYXIsIGxlbl91Y2hhciwgJnN0YXR1cyk7CisJaWYgKFVfRkFJ TFVSRShzdGF0dXMpICYmIHN0YXR1cyAhPSBVX0JVRkZFUl9PVkVSRkxPV19FUlJPUikKKwkJZXJl cG9ydChFUlJPUiwKKwkJCQkoZXJybXNnKCIlcyBmYWlsZWQ6ICVzIiwgInVjbnZfZnJvbVVDaGFy cyIsCisJCQkJCQl1X2Vycm9yTmFtZShzdGF0dXMpKSkpOworCisJKnJlc3VsdCA9IHBhbGxvYyhs ZW5fcmVzdWx0ICsgMSk7CisKKwlzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisJbGVuX3Jlc3VsdCA9 IHVjbnZfZnJvbVVDaGFycyhpY3VfY29udmVydGVyLCAqcmVzdWx0LCBsZW5fcmVzdWx0ICsgMSwK KwkJCQkJCQkJIGJ1ZmZfdWNoYXIsIGxlbl91Y2hhciwgJnN0YXR1cyk7CisJaWYgKFVfRkFJTFVS RShzdGF0dXMpIHx8CisJCXN0YXR1cyA9PSBVX1NUUklOR19OT1RfVEVSTUlOQVRFRF9XQVJOSU5H KQorCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJtc2coIiVzIGZhaWxlZDogJXMiLCAidWNudl9m cm9tVUNoYXJzIiwKKwkJCQkJCXVfZXJyb3JOYW1lKHN0YXR1cykpKSk7CisKKwlyZXR1cm4gbGVu X3Jlc3VsdDsKK30KKworLyoKKyAqIFBhcnNlIGNvbGxhdGlvbiBhdHRyaWJ1dGVzIGZyb20gdGhl IGdpdmVuIGxvY2FsZSBzdHJpbmcgYW5kIGFwcGx5IHRoZW0gdG8KKyAqIHRoZSBvcGVuIGNvbGxh dG9yLgorICoKKyAqIEZpcnN0LCB0aGUgbG9jYWxlIHN0cmluZyBpcyBjYW5vbmljYWxpemVkIHRv IGFuIElDVSBmb3JtYXQgbG9jYWxlIElEIHN1Y2gKKyAqIGFzICJ1bmRAY29sU3RyZW5ndGg9cHJp bWFyeTtjb2xDYXNlTGV2ZWw9eWVzIi4gVGhlbiwgaXQgcGFyc2VzIGFuZCBhcHBsaWVzCisgKiB0 aGUga2V5LXZhbHVlIGFyZ3VtZW50cy4KKyAqCisgKiBTdGFydGluZyB3aXRoIElDVSB2ZXJzaW9u IDU0LCB0aGUgYXR0cmlidXRlcyBhcmUgcHJvY2Vzc2VkIGF1dG9tYXRpY2FsbHkgYnkKKyAqIHVj b2xfb3BlbigpLCBzbyB0aGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGZvciBlbXVsYXRpbmcgdGhpcyBi ZWhhdmlvciBvbiBvbGRlcgorICogdmVyc2lvbnMuCisgKi8KK3BnX2F0dHJpYnV0ZV91bnVzZWQo KQorc3RhdGljIHZvaWQKK2ljdV9zZXRfY29sbGF0aW9uX2F0dHJpYnV0ZXMoVUNvbGxhdG9yICpj b2xsYXRvciwgY29uc3QgY2hhciAqbG9jLAorCQkJCQkJCSBVRXJyb3JDb2RlICpzdGF0dXMpCit7 CisJaW50MzJfdAkJbGVuOworCWNoYXIJICAgKmljdV9sb2NhbGVfaWQ7CisJY2hhcgkgICAqbG93 ZXJfc3RyOworCWNoYXIJICAgKnN0cjsKKwljaGFyCSAgICp0b2tlbjsKKworCS8qCisJICogVGhl IGlucHV0IGxvY2FsZSBtYXkgYmUgYSBCQ1AgNDcgbGFuZ3VhZ2UgdGFnLCBlLmcuCisJICogInVu ZC11LWtjLWtzLWxldmVsMSIsIHdoaWNoIGV4cHJlc3NlcyB0aGUgc2FtZSBhdHRyaWJ1dGVzIGlu IGEKKwkgKiBkaWZmZXJlbnQgZm9ybS4gSXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdGhlIGVxdWl2 YWxlbnQgSUNVIGZvcm1hdAorCSAqIGxvY2FsZSBJRCwgZS5nLiAidW5kQGNvbGNhc2VsZXZlbD15 ZXM7Y29sc3RyZW5ndGg9cHJpbWFyeSIsIGJ5CisJICogdWxvY19jYW5vbmljYWxpemUoKS4KKwkg Ki8KKwkqc3RhdHVzID0gVV9aRVJPX0VSUk9SOworCWxlbiA9IHVsb2NfY2Fub25pY2FsaXplKGxv YywgTlVMTCwgMCwgc3RhdHVzKTsKKwlpY3VfbG9jYWxlX2lkID0gcGFsbG9jKGxlbiArIDEpOwor CSpzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisJbGVuID0gdWxvY19jYW5vbmljYWxpemUobG9jLCBp Y3VfbG9jYWxlX2lkLCBsZW4gKyAxLCBzdGF0dXMpOworCWlmIChVX0ZBSUxVUkUoKnN0YXR1cykg fHwgKnN0YXR1cyA9PSBVX1NUUklOR19OT1RfVEVSTUlOQVRFRF9XQVJOSU5HKQorCQlyZXR1cm47 CisKKwlsb3dlcl9zdHIgPSBhc2NfdG9sb3dlcihpY3VfbG9jYWxlX2lkLCBzdHJsZW4oaWN1X2xv Y2FsZV9pZCkpOworCisJcGZyZWUoaWN1X2xvY2FsZV9pZCk7CisKKwlzdHIgPSBzdHJjaHIobG93 ZXJfc3RyLCAnQCcpOworCWlmICghc3RyKQorCQlyZXR1cm47CisJc3RyKys7CisKKwl3aGlsZSAo KHRva2VuID0gc3Ryc2VwKCZzdHIsICI7IikpKQorCXsKKwkJY2hhcgkgICAqZSA9IHN0cmNocih0 b2tlbiwgJz0nKTsKKworCQlpZiAoZSkKKwkJeworCQkJY2hhcgkgICAqbmFtZTsKKwkJCWNoYXIJ ICAgKnZhbHVlOworCQkJVUNvbEF0dHJpYnV0ZSB1YXR0cjsKKwkJCVVDb2xBdHRyaWJ1dGVWYWx1 ZSB1dmFsdWU7CisKKwkJCSpzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisKKwkJCSplID0gJ1wwJzsK KwkJCW5hbWUgPSB0b2tlbjsKKwkJCXZhbHVlID0gZSArIDE7CisKKwkJCS8qCisJCQkgKiBTZWUg YXR0cmlidXRlIG5hbWUgYW5kIHZhbHVlIGxpc3RzIGluIElDVSBpMThuL2NvbGwuY3BwCisJCQkg Ki8KKwkJCWlmIChzdHJjbXAobmFtZSwgImNvbHN0cmVuZ3RoIikgPT0gMCkKKwkJCQl1YXR0ciA9 IFVDT0xfU1RSRU5HVEg7CisJCQllbHNlIGlmIChzdHJjbXAobmFtZSwgImNvbGJhY2t3YXJkcyIp ID09IDApCisJCQkJdWF0dHIgPSBVQ09MX0ZSRU5DSF9DT0xMQVRJT047CisJCQllbHNlIGlmIChz dHJjbXAobmFtZSwgImNvbGNhc2VsZXZlbCIpID09IDApCisJCQkJdWF0dHIgPSBVQ09MX0NBU0Vf TEVWRUw7CisJCQllbHNlIGlmIChzdHJjbXAobmFtZSwgImNvbGNhc2VmaXJzdCIpID09IDApCisJ CQkJdWF0dHIgPSBVQ09MX0NBU0VfRklSU1Q7CisJCQllbHNlIGlmIChzdHJjbXAobmFtZSwgImNv bGFsdGVybmF0ZSIpID09IDApCisJCQkJdWF0dHIgPSBVQ09MX0FMVEVSTkFURV9IQU5ETElORzsK KwkJCWVsc2UgaWYgKHN0cmNtcChuYW1lLCAiY29sbm9ybWFsaXphdGlvbiIpID09IDApCisJCQkJ dWF0dHIgPSBVQ09MX05PUk1BTElaQVRJT05fTU9ERTsKKwkJCWVsc2UgaWYgKHN0cmNtcChuYW1l LCAiY29sbnVtZXJpYyIpID09IDApCisJCQkJdWF0dHIgPSBVQ09MX05VTUVSSUNfQ09MTEFUSU9O OworCQkJZWxzZQorCQkJCS8qIGlnbm9yZSBpZiB1bmtub3duICovCisJCQkJY29udGludWU7CisK KwkJCWlmIChzdHJjbXAodmFsdWUsICJwcmltYXJ5IikgPT0gMCkKKwkJCQl1dmFsdWUgPSBVQ09M X1BSSU1BUlk7CisJCQllbHNlIGlmIChzdHJjbXAodmFsdWUsICJzZWNvbmRhcnkiKSA9PSAwKQor CQkJCXV2YWx1ZSA9IFVDT0xfU0VDT05EQVJZOworCQkJZWxzZSBpZiAoc3RyY21wKHZhbHVlLCAi dGVydGlhcnkiKSA9PSAwKQorCQkJCXV2YWx1ZSA9IFVDT0xfVEVSVElBUlk7CisJCQllbHNlIGlm IChzdHJjbXAodmFsdWUsICJxdWF0ZXJuYXJ5IikgPT0gMCkKKwkJCQl1dmFsdWUgPSBVQ09MX1FV QVRFUk5BUlk7CisJCQllbHNlIGlmIChzdHJjbXAodmFsdWUsICJpZGVudGljYWwiKSA9PSAwKQor CQkJCXV2YWx1ZSA9IFVDT0xfSURFTlRJQ0FMOworCQkJZWxzZSBpZiAoc3RyY21wKHZhbHVlLCAi bm8iKSA9PSAwKQorCQkJCXV2YWx1ZSA9IFVDT0xfT0ZGOworCQkJZWxzZSBpZiAoc3RyY21wKHZh bHVlLCAieWVzIikgPT0gMCkKKwkJCQl1dmFsdWUgPSBVQ09MX09OOworCQkJZWxzZSBpZiAoc3Ry Y21wKHZhbHVlLCAic2hpZnRlZCIpID09IDApCisJCQkJdXZhbHVlID0gVUNPTF9TSElGVEVEOwor CQkJZWxzZSBpZiAoc3RyY21wKHZhbHVlLCAibm9uLWlnbm9yYWJsZSIpID09IDApCisJCQkJdXZh bHVlID0gVUNPTF9OT05fSUdOT1JBQkxFOworCQkJZWxzZSBpZiAoc3RyY21wKHZhbHVlLCAibG93 ZXIiKSA9PSAwKQorCQkJCXV2YWx1ZSA9IFVDT0xfTE9XRVJfRklSU1Q7CisJCQllbHNlIGlmIChz dHJjbXAodmFsdWUsICJ1cHBlciIpID09IDApCisJCQkJdXZhbHVlID0gVUNPTF9VUFBFUl9GSVJT VDsKKwkJCWVsc2UKKwkJCXsKKwkJCQkqc3RhdHVzID0gVV9JTExFR0FMX0FSR1VNRU5UX0VSUk9S OworCQkJCWJyZWFrOworCQkJfQorCisJCQl1Y29sX3NldEF0dHJpYnV0ZShjb2xsYXRvciwgdWF0 dHIsIHV2YWx1ZSwgc3RhdHVzKTsKKwkJfQorCX0KKworCXBmcmVlKGxvd2VyX3N0cik7Cit9CisK KyNlbmRpZgkJCQkJLyogVVNFX0lDVSAqLwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMv YWR0L3BnX2xvY2FsZV9saWJjLmMgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvcGdfbG9jYWxlX2xp YmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNmViOGI4MGZkZjkK LS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvcGdfbG9jYWxlX2xpYmMu YwpAQCAtMCwwICsxLDYwNCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFBvc3RncmVTUUwg bG9jYWxlIHV0aWxpdGllcyBmb3IgbGliYworICoKKyAqIFBvcnRpb25zIENvcHlyaWdodCAoYykg MjAwMi0yMDI0LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAorICoKKyAqIHNy Yy9iYWNrZW5kL3V0aWxzL2FkdC9wZ19sb2NhbGVfbGliYy5jCisgKgorICotLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorICovCisKKyNpbmNsdWRlICJwb3N0Z3Jlcy5oIgorCisjaW5jbHVkZSA8bGltaXRzLmg+Cisj aW5jbHVkZSA8d2N0eXBlLmg+CisKKyNpbmNsdWRlICJhY2Nlc3MvaHR1cF9kZXRhaWxzLmgiCisj aW5jbHVkZSAiY2F0YWxvZy9wZ19jb2xsYXRpb24uaCIKKyNpbmNsdWRlICJjYXRhbG9nL3BnX2Rh dGFiYXNlLmgiCisjaW5jbHVkZSAidXRpbHMvYnVpbHRpbnMuaCIKKyNpbmNsdWRlICJ1dGlscy9t ZW11dGlscy5oIgorI2luY2x1ZGUgInV0aWxzL3BnX2xvY2FsZS5oIgorI2luY2x1ZGUgInV0aWxz L3Jlc293bmVyLmgiCisjaW5jbHVkZSAidXRpbHMvc3lzY2FjaGUuaCIKKworLyoKKyAqIFRoaXMg c2hvdWxkIGJlIGxhcmdlIGVub3VnaCB0aGF0IG1vc3Qgc3RyaW5ncyB3aWxsIGZpdCwgYnV0IHNt YWxsIGVub3VnaAorICogdGhhdCB3ZSBmZWVsIGNvbWZvcnRhYmxlIHB1dHRpbmcgaXQgb24gdGhl IHN0YWNrCisgKi8KKyNkZWZpbmUJCVRFWFRCVUZMRU4JCQkxMDI0CisKK2V4dGVybiBwZ19sb2Nh bGVfdCBsaWJjX2RhdF9jcmVhdGVfbG9jYWxlKEhlYXBUdXBsZSBkYXR0dXBsZSk7CitleHRlcm4g cGdfbG9jYWxlX3QgbGliY19jb2xsX2NyZWF0ZV9sb2NhbGUoTWVtb3J5Q29udGV4dCBjb250ZXh0 LAorCQkJCQkJCQkJCSAgIFJlc291cmNlT3duZXIgcmVzb3duZXIsCisJCQkJCQkJCQkJICAgSGVh cFR1cGxlIGNvbGx0dXBsZSk7CisKK3N0YXRpYyBpbnQgc3RybmNvbGxfbGliYyhjb25zdCBjaGFy ICphcmcxLCBzc2l6ZV90IGxlbjEsCisJCQkJCQkgY29uc3QgY2hhciAqYXJnMiwgc3NpemVfdCBs ZW4yLAorCQkJCQkJIHBnX2xvY2FsZV90IGxvY2FsZSk7CitzdGF0aWMgc2l6ZV90IHN0cm54ZnJt X2xpYmMoY2hhciAqZGVzdCwgc2l6ZV90IGRlc3RzaXplLAorCQkJCQkJCWNvbnN0IGNoYXIgKnNy Yywgc3NpemVfdCBzcmNsZW4sCisJCQkJCQkJcGdfbG9jYWxlX3QgbG9jYWxlKTsKKworc3RhdGlj IGludCBjaGFyX3Byb3BzX2xpYmMocGdfd2NoYXIgd2MsIGludCBtYXNrLCBwZ19sb2NhbGVfdCBs b2NhbGUpOworc3RhdGljIHBnX3djaGFyIHRvdXBwZXJfbGliYyhwZ193Y2hhciB3YywgcGdfbG9j YWxlX3QgbG9jYWxlKTsKK3N0YXRpYyBwZ193Y2hhciB0b2xvd2VyX2xpYmMocGdfd2NoYXIgd2Ms IHBnX2xvY2FsZV90IGxvY2FsZSk7CisKK3N0YXRpYyB2b2lkIFJlc291cmNlT3duZXJSZW1lbWJl ckxvY2FsZVQoUmVzb3VyY2VPd25lciByZXNvd25lciwKKwkJCQkJCQkJCQkgbG9jYWxlX3QgbG9j YWxlKTsKK3N0YXRpYyB2b2lkIFJlc093bmVyUmVsZWFzZUxvY2FsZVQoRGF0dW0gdmFsKTsKKwor c3RhdGljIGxvY2FsZV90IG1ha2VfbGliY19jb2xsYXRvcihjb25zdCBjaGFyICpjb2xsYXRlLCBj b25zdCBjaGFyICpjdHlwZSk7CisKK3N0YXRpYyB2b2lkIHJlcG9ydF9uZXdsb2NhbGVfZmFpbHVy ZShjb25zdCBjaGFyICpsb2NhbGVuYW1lKTsKKworc3RhdGljIGNvbnN0IFJlc291cmNlT3duZXJE ZXNjIExvY2FsZVRSZXNvdXJjZUtpbmQgPQoreworCS5uYW1lID0gImxvY2FsZV90IHJlZmVyZW5j ZSIsCisJLnJlbGVhc2VfcGhhc2UgPSBSRVNPVVJDRV9SRUxFQVNFX0FGVEVSX0xPQ0tTLAorCS5y ZWxlYXNlX3ByaW9yaXR5ID0gUkVMRUFTRV9QUklPX0xBU1QsCisJLlJlbGVhc2VSZXNvdXJjZSA9 IFJlc093bmVyUmVsZWFzZUxvY2FsZVQsCisJLkRlYnVnUHJpbnQgPSBOVUxMICAgICAgICAgICAg ICAgICAgICAgIC8qIHRoZSBkZWZhdWx0IG1lc3NhZ2UgaXMgZmluZSAqLworfTsKKworc3RydWN0 IGNvbGxhdGVfbWV0aG9kcyBsaWJjX2NvbGxhdGVfbWV0aG9kcyA9IHsKKwkuc3RybmNvbGwgPSBz dHJuY29sbF9saWJjLAorCS5zdHJueGZybSA9IHN0cm54ZnJtX2xpYmMsCisJLnN0cm54ZnJtX3By ZWZpeCA9IE5VTEwsCit9OworCitzdHJ1Y3QgY3R5cGVfbWV0aG9kcyBsaWJjX2N0eXBlX21ldGhv ZHMgPSB7CisJLmNoYXJfcHJvcHMgPSBjaGFyX3Byb3BzX2xpYmMsCisJLndjX3RvdXBwZXIgPSB0 b3VwcGVyX2xpYmMsCisJLndjX3RvbG93ZXIgPSB0b2xvd2VyX2xpYmMsCit9OworCitwZ19sb2Nh bGVfdAorbGliY19kYXRfY3JlYXRlX2xvY2FsZShIZWFwVHVwbGUgZGF0dHVwbGUpCit7CisJRm9y bV9wZ19kYXRhYmFzZSBkYmZvcm07CisJRGF0dW0JCWRhdHVtOworCWNvbnN0IGNoYXIgKmRhdGNv bGxhdGU7CisJY29uc3QgY2hhciAqZGF0Y3R5cGU7CisJcGdfbG9jYWxlX3QJcmVzdWx0OworCisJ ZGJmb3JtID0gKEZvcm1fcGdfZGF0YWJhc2UpIEdFVFNUUlVDVChkYXR0dXBsZSk7CisJCisJQXNz ZXJ0KGRiZm9ybS0+ZGF0bG9jcHJvdmlkZXIgPT0gQ09MTFBST1ZJREVSX0xJQkMpOworCisJZGF0 dW0gPSBTeXNDYWNoZUdldEF0dHJOb3ROdWxsKERBVEFCQVNFT0lELCBkYXR0dXBsZSwgQW51bV9w Z19kYXRhYmFzZV9kYXRjb2xsYXRlKTsKKwlkYXRjb2xsYXRlID0gVGV4dERhdHVtR2V0Q1N0cmlu ZyhkYXR1bSk7CisJZGF0dW0gPSBTeXNDYWNoZUdldEF0dHJOb3ROdWxsKERBVEFCQVNFT0lELCBk YXR0dXBsZSwgQW51bV9wZ19kYXRhYmFzZV9kYXRjdHlwZSk7CisJZGF0Y3R5cGUgPSBUZXh0RGF0 dW1HZXRDU3RyaW5nKGRhdHVtKTsKKworCXJlc3VsdCA9IE1lbW9yeUNvbnRleHRBbGxvY1plcm8o VG9wTWVtb3J5Q29udGV4dCwKKwkJCQkJCQkJCXNpemVvZihzdHJ1Y3QgcGdfbG9jYWxlX3N0cnVj dCkpOworCisJcmVzdWx0LT5wcm92aWRlciA9IGRiZm9ybS0+ZGF0bG9jcHJvdmlkZXI7CisJcmVz dWx0LT5kZXRlcm1pbmlzdGljID0gdHJ1ZTsKKwlyZXN1bHQtPmNvbGxhdGVfaXNfYyA9IChzdHJj bXAoZGF0Y29sbGF0ZSwgIkMiKSA9PSAwKSB8fAorCQkoc3RyY21wKGRhdGNvbGxhdGUsICJQT1NJ WCIpID09IDApOworCXJlc3VsdC0+Y3R5cGVfaXNfYyA9IChzdHJjbXAoZGF0Y3R5cGUsICJDIikg PT0gMCkgfHwKKwkJKHN0cmNtcChkYXRjdHlwZSwgIlBPU0lYIikgPT0gMCk7CisKKwlpZiAoIXJl c3VsdC0+Y29sbGF0ZV9pc19jKQorCQlyZXN1bHQtPmNvbGxhdGUgPSAmbGliY19jb2xsYXRlX21l dGhvZHM7CisJaWYgKCFyZXN1bHQtPmN0eXBlX2lzX2MpCisJCXJlc3VsdC0+Y3R5cGUgPSAmbGli Y19jdHlwZV9tZXRob2RzOworCXJlc3VsdC0+aW5mby5sdCA9IG1ha2VfbGliY19jb2xsYXRvcihk YXRjb2xsYXRlLCBkYXRjdHlwZSk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitwZ19sb2NhbGVf dAorbGliY19jb2xsX2NyZWF0ZV9sb2NhbGUoTWVtb3J5Q29udGV4dCBjb250ZXh0LCBSZXNvdXJj ZU93bmVyIHJlc293bmVyLAorCQkJCQkJSGVhcFR1cGxlIGNvbGx0dXBsZSkKK3sKKwlGb3JtX3Bn X2NvbGxhdGlvbiBjb2xsZm9ybTsKKwlEYXR1bQkJZGF0dW07CisJY29uc3QgY2hhciAqY29sbGNv bGxhdGU7CisJY29uc3QgY2hhciAqY29sbGN0eXBlOworCWxvY2FsZV90CWxvY2FsZTsKKwlwZ19s b2NhbGVfdCByZXN1bHQ7CisKKwljb2xsZm9ybSA9IChGb3JtX3BnX2NvbGxhdGlvbikgR0VUU1RS VUNUKGNvbGx0dXBsZSk7CisKKwlkYXR1bSA9IFN5c0NhY2hlR2V0QXR0ck5vdE51bGwoQ09MTE9J RCwgY29sbHR1cGxlLCBBbnVtX3BnX2NvbGxhdGlvbl9jb2xsY29sbGF0ZSk7CisJY29sbGNvbGxh dGUgPSBUZXh0RGF0dW1HZXRDU3RyaW5nKGRhdHVtKTsKKwlkYXR1bSA9IFN5c0NhY2hlR2V0QXR0 ck5vdE51bGwoQ09MTE9JRCwgY29sbHR1cGxlLCBBbnVtX3BnX2NvbGxhdGlvbl9jb2xsY3R5cGUp OworCWNvbGxjdHlwZSA9IFRleHREYXR1bUdldENTdHJpbmcoZGF0dW0pOworCisJUmVzb3VyY2VP d25lckVubGFyZ2UocmVzb3duZXIpOworCWxvY2FsZSA9IG1ha2VfbGliY19jb2xsYXRvcihjb2xs Y29sbGF0ZSwgY29sbGN0eXBlKTsKKwlpZiAobG9jYWxlKQorCQlSZXNvdXJjZU93bmVyUmVtZW1i ZXJMb2NhbGVUKHJlc293bmVyLCBsb2NhbGUpOworCisJcmVzdWx0ID0gTWVtb3J5Q29udGV4dEFs bG9jWmVybyhjb250ZXh0LAorCQkJCQkJCQkJc2l6ZW9mKHN0cnVjdCBwZ19sb2NhbGVfc3RydWN0 KSk7CisKKwlyZXN1bHQtPnByb3ZpZGVyID0gY29sbGZvcm0tPmNvbGxwcm92aWRlcjsKKwlyZXN1 bHQtPmRldGVybWluaXN0aWMgPSBjb2xsZm9ybS0+Y29sbGlzZGV0ZXJtaW5pc3RpYzsKKwlyZXN1 bHQtPmNvbGxhdGVfaXNfYyA9IChzdHJjbXAoY29sbGNvbGxhdGUsICJDIikgPT0gMCkgfHwKKwkJ KHN0cmNtcChjb2xsY29sbGF0ZSwgIlBPU0lYIikgPT0gMCk7CisJcmVzdWx0LT5jdHlwZV9pc19j ID0gKHN0cmNtcChjb2xsY3R5cGUsICJDIikgPT0gMCkgfHwKKwkJKHN0cmNtcChjb2xsY3R5cGUs ICJQT1NJWCIpID09IDApOworCWlmICghcmVzdWx0LT5jb2xsYXRlX2lzX2MpCisJCXJlc3VsdC0+ Y29sbGF0ZSA9ICZsaWJjX2NvbGxhdGVfbWV0aG9kczsKKwlpZiAoIXJlc3VsdC0+Y3R5cGVfaXNf YykKKwkJcmVzdWx0LT5jdHlwZSA9ICZsaWJjX2N0eXBlX21ldGhvZHM7CisJcmVzdWx0LT5pbmZv Lmx0ID0gbG9jYWxlOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK1Jlc291 cmNlT3duZXJSZW1lbWJlckxvY2FsZVQoUmVzb3VyY2VPd25lciByZXNvd25lciwgbG9jYWxlX3Qg bG9jYWxlKQoreworCVJlc291cmNlT3duZXJSZW1lbWJlcihyZXNvd25lciwgUG9pbnRlckdldERh dHVtKGxvY2FsZSksCisJCQkJCQkgICZMb2NhbGVUUmVzb3VyY2VLaW5kKTsKK30KKworc3RhdGlj IHZvaWQKK1Jlc093bmVyUmVsZWFzZUxvY2FsZVQoRGF0dW0gdmFsKQoreworCWxvY2FsZV90IGxv Y2FsZSA9IChsb2NhbGVfdCkgRGF0dW1HZXRQb2ludGVyKHZhbCk7CisjaWZuZGVmIFdJTjMyCisJ ZnJlZWxvY2FsZShsb2NhbGUpOworI2Vsc2UKKwlfZnJlZV9sb2NhbGUobG9jYWxlKTsKKyNlbmRp ZgorfQorCitzdGF0aWMgaW50CitjaGFyX3Byb3BzX2xpYmMocGdfd2NoYXIgd2MsIGludCBtYXNr LCBwZ19sb2NhbGVfdCBsb2NhbGUpCit7CisJaW50IHJlc3VsdCA9IDA7CisKKwlBc3NlcnQoIWxv Y2FsZS0+Y3R5cGVfaXNfYyk7CisKKwlpZiAobWFzayAmIFBHX0lTRElHSVQpCisJeworCQlpZiAo R2V0RGF0YWJhc2VFbmNvZGluZygpID09IFBHX1VURjggJiYKKwkJCShzaXplb2Yod2NoYXJfdCkg Pj0gNCB8fCB3YyA8PSAocGdfd2NoYXIpIDB4RkZGRikpCisJCXsKKwkJCWlmIChpc3dkaWdpdF9s KCh3aW50X3QpIHdjLCBsb2NhbGUtPmluZm8ubHQpKQorCQkJCXJlc3VsdCB8PSBQR19JU0RJR0lU OworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKHdjIDw9IChwZ193Y2hhcikgVUNIQVJfTUFYICYm CisJCQkJaXNkaWdpdF9sKCh1bnNpZ25lZCBjaGFyKSB3YywgbG9jYWxlLT5pbmZvLmx0KSkKKwkJ CQlyZXN1bHQgfD0gUEdfSVNESUdJVDsKKwkJfQorCX0KKwlpZiAobWFzayAmIFBHX0lTQUxQSEEp CisJeworCQlpZiAoR2V0RGF0YWJhc2VFbmNvZGluZygpID09IFBHX1VURjggJiYKKwkJCShzaXpl b2Yod2NoYXJfdCkgPj0gNCB8fCB3YyA8PSAocGdfd2NoYXIpIDB4RkZGRikpCisJCXsKKwkJCWlm IChpc3dhbHBoYV9sKCh3aW50X3QpIHdjLCBsb2NhbGUtPmluZm8ubHQpKQorCQkJCXJlc3VsdCB8 PSBQR19JU0FMUEhBOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKHdjIDw9IChwZ193Y2hhcikg VUNIQVJfTUFYICYmCisJCQkJaXNhbHBoYV9sKCh1bnNpZ25lZCBjaGFyKSB3YywgbG9jYWxlLT5p bmZvLmx0KSkKKwkJCQlyZXN1bHQgfD0gUEdfSVNBTFBIQTsKKwkJfQorCX0KKwlpZiAobWFzayAm IFBHX0lTVVBQRVIpCisJeworCQlpZiAoR2V0RGF0YWJhc2VFbmNvZGluZygpID09IFBHX1VURjgg JiYKKwkJCShzaXplb2Yod2NoYXJfdCkgPj0gNCB8fCB3YyA8PSAocGdfd2NoYXIpIDB4RkZGRikp CisJCXsKKwkJCWlmIChpc3d1cHBlcl9sKCh3aW50X3QpIHdjLCBsb2NhbGUtPmluZm8ubHQpKQor CQkJCXJlc3VsdCB8PSBQR19JU1VQUEVSOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKHdjIDw9 IChwZ193Y2hhcikgVUNIQVJfTUFYICYmCisJCQkJaXN1cHBlcl9sKCh1bnNpZ25lZCBjaGFyKSB3 YywgbG9jYWxlLT5pbmZvLmx0KSkKKwkJCQlyZXN1bHQgfD0gUEdfSVNVUFBFUjsKKwkJfQorCX0K KwlpZiAobWFzayAmIFBHX0lTTE9XRVIpCisJeworCQlpZiAoR2V0RGF0YWJhc2VFbmNvZGluZygp ID09IFBHX1VURjggJiYKKwkJCShzaXplb2Yod2NoYXJfdCkgPj0gNCB8fCB3YyA8PSAocGdfd2No YXIpIDB4RkZGRikpCisJCXsKKwkJCWlmIChpc3dsb3dlcl9sKCh3aW50X3QpIHdjLCBsb2NhbGUt PmluZm8ubHQpKQorCQkJCXJlc3VsdCB8PSBQR19JU0xPV0VSOworCQl9CisJCWVsc2UKKwkJewor CQkJaWYgKHdjIDw9IChwZ193Y2hhcikgVUNIQVJfTUFYICYmCisJCQkJaXNsb3dlcl9sKCh1bnNp Z25lZCBjaGFyKSB3YywgbG9jYWxlLT5pbmZvLmx0KSkKKwkJCQlyZXN1bHQgfD0gUEdfSVNMT1dF UjsKKwkJfQorCX0KKwlpZiAobWFzayAmIFBHX0lTR1JBUEgpCisJeworCQlpZiAoR2V0RGF0YWJh c2VFbmNvZGluZygpID09IFBHX1VURjggJiYKKwkJCShzaXplb2Yod2NoYXJfdCkgPj0gNCB8fCB3 YyA8PSAocGdfd2NoYXIpIDB4RkZGRikpCisJCXsKKwkJCWlmIChpc3dncmFwaF9sKCh3aW50X3Qp IHdjLCBsb2NhbGUtPmluZm8ubHQpKQorCQkJCXJlc3VsdCB8PSBQR19JU0dSQVBIOworCQl9CisJ CWVsc2UKKwkJeworCQkJaWYgKHdjIDw9IChwZ193Y2hhcikgVUNIQVJfTUFYICYmCisJCQkJaXNn cmFwaF9sKCh1bnNpZ25lZCBjaGFyKSB3YywgbG9jYWxlLT5pbmZvLmx0KSkKKwkJCQlyZXN1bHQg fD0gUEdfSVNHUkFQSDsKKwkJfQorCX0KKwlpZiAobWFzayAmIFBHX0lTUFJJTlQpCisJeworCQlp ZiAoR2V0RGF0YWJhc2VFbmNvZGluZygpID09IFBHX1VURjggJiYKKwkJCShzaXplb2Yod2NoYXJf dCkgPj0gNCB8fCB3YyA8PSAocGdfd2NoYXIpIDB4RkZGRikpCisJCXsKKwkJCWlmIChpc3dwcmlu dF9sKCh3aW50X3QpIHdjLCBsb2NhbGUtPmluZm8ubHQpKQorCQkJCXJlc3VsdCB8PSBQR19JU1BS SU5UOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKHdjIDw9IChwZ193Y2hhcikgVUNIQVJfTUFY ICYmCisJCQkJaXNwcmludF9sKCh1bnNpZ25lZCBjaGFyKSB3YywgbG9jYWxlLT5pbmZvLmx0KSkK KwkJCQlyZXN1bHQgfD0gUEdfSVNQUklOVDsKKwkJfQorCX0KKwlpZiAobWFzayAmIFBHX0lTUFVO Q1QpCisJeworCQlpZiAoR2V0RGF0YWJhc2VFbmNvZGluZygpID09IFBHX1VURjggJiYKKwkJCShz aXplb2Yod2NoYXJfdCkgPj0gNCB8fCB3YyA8PSAocGdfd2NoYXIpIDB4RkZGRikpCisJCXsKKwkJ CWlmIChpc3dwdW5jdF9sKCh3aW50X3QpIHdjLCBsb2NhbGUtPmluZm8ubHQpKQorCQkJCXJlc3Vs dCB8PSBQR19JU1BVTkNUOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKHdjIDw9IChwZ193Y2hh cikgVUNIQVJfTUFYICYmCisJCQkJaXNwdW5jdF9sKCh1bnNpZ25lZCBjaGFyKSB3YywgbG9jYWxl LT5pbmZvLmx0KSkKKwkJCQlyZXN1bHQgfD0gUEdfSVNQVU5DVDsKKwkJfQorCX0KKwlpZiAobWFz ayAmIFBHX0lTU1BBQ0UpCisJeworCQlpZiAoR2V0RGF0YWJhc2VFbmNvZGluZygpID09IFBHX1VU RjggJiYKKwkJCShzaXplb2Yod2NoYXJfdCkgPj0gNCB8fCB3YyA8PSAocGdfd2NoYXIpIDB4RkZG RikpCisJCXsKKwkJCWlmIChpc3dzcGFjZV9sKCh3aW50X3QpIHdjLCBsb2NhbGUtPmluZm8ubHQp KQorCQkJCXJlc3VsdCB8PSBQR19JU1NQQUNFOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKHdj IDw9IChwZ193Y2hhcikgVUNIQVJfTUFYICYmCisJCQkJaXNzcGFjZV9sKCh1bnNpZ25lZCBjaGFy KSB3YywgbG9jYWxlLT5pbmZvLmx0KSkKKwkJCQlyZXN1bHQgfD0gUEdfSVNTUEFDRTsKKwkJfQor CX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBwZ193Y2hhcgordG91cHBlcl9saWJj KHBnX3djaGFyIHdjLCBwZ19sb2NhbGVfdCBsb2NhbGUpCit7CisJaWYgKEdldERhdGFiYXNlRW5j b2RpbmcoKSA9PSBQR19VVEY4ICYmCisJCShzaXplb2Yod2NoYXJfdCkgPj0gNCB8fCB3YyA8PSAo cGdfd2NoYXIpIDB4RkZGRikpCisJCXJldHVybiB0b3d1cHBlcl9sKCh3aW50X3QpIHdjLCBsb2Nh bGUtPmluZm8ubHQpOworCWVsc2UgaWYgKHdjIDw9IChwZ193Y2hhcikgVUNIQVJfTUFYKQorCQly ZXR1cm4gdG91cHBlcl9sKCh1bnNpZ25lZCBjaGFyKSB3YywgbG9jYWxlLT5pbmZvLmx0KTsKKwll bHNlCisJCXJldHVybiB3YzsKK30KKworc3RhdGljIHBnX3djaGFyCit0b2xvd2VyX2xpYmMocGdf d2NoYXIgd2MsIHBnX2xvY2FsZV90IGxvY2FsZSkKK3sKKwlpZiAoR2V0RGF0YWJhc2VFbmNvZGlu ZygpID09IFBHX1VURjggJiYKKwkJKHNpemVvZih3Y2hhcl90KSA+PSA0IHx8IHdjIDw9IChwZ193 Y2hhcikgMHhGRkZGKSkKKwkJcmV0dXJuIHRvd2xvd2VyX2woKHdpbnRfdCkgd2MsIGxvY2FsZS0+ aW5mby5sdCk7CisJZWxzZSBpZiAod2MgPD0gKHBnX3djaGFyKSBVQ0hBUl9NQVgpCisJCXJldHVy biB0b2xvd2VyX2woKHVuc2lnbmVkIGNoYXIpIHdjLCBsb2NhbGUtPmluZm8ubHQpOworCWVsc2UK KwkJcmV0dXJuIHdjOworfQorCisvKgorICogQ3JlYXRlIGEgbG9jYWxlX3Qgd2l0aCB0aGUgZ2l2 ZW4gY29sbGF0aW9uIGFuZCBjdHlwZS4KKyAqCisgKiBUaGUgIkMiIGFuZCAiUE9TSVgiIGxvY2Fs ZXMgYXJlIG5vdCBhY3R1YWxseSBoYW5kbGVkIGJ5IGxpYmMsIHNvIHJldHVybgorICogTlVMTC4K KyAqCisgKiBFbnN1cmUgdGhhdCBubyBwYXRoIGxlYWtzIGEgbG9jYWxlX3QuCisgKi8KK3N0YXRp YyBsb2NhbGVfdAorbWFrZV9saWJjX2NvbGxhdG9yKGNvbnN0IGNoYXIgKmNvbGxhdGUsIGNvbnN0 IGNoYXIgKmN0eXBlKQoreworCWxvY2FsZV90CWxvYyA9IDA7CisKKwlpZiAoc3RyY21wKGNvbGxh dGUsIGN0eXBlKSA9PSAwKQorCXsKKwkJaWYgKHN0cmNtcChjdHlwZSwgIkMiKSAhPSAwICYmIHN0 cmNtcChjdHlwZSwgIlBPU0lYIikgIT0gMCkKKwkJeworCQkJLyogTm9ybWFsIGNhc2Ugd2hlcmUg dGhleSdyZSB0aGUgc2FtZSAqLworCQkJZXJybm8gPSAwOworI2lmbmRlZiBXSU4zMgorCQkJbG9j ID0gbmV3bG9jYWxlKExDX0NPTExBVEVfTUFTSyB8IExDX0NUWVBFX01BU0ssIGNvbGxhdGUsCisJ CQkJCQkJTlVMTCk7CisjZWxzZQorCQkJbG9jID0gX2NyZWF0ZV9sb2NhbGUoTENfQUxMLCBjb2xs YXRlKTsKKyNlbmRpZgorCQkJaWYgKCFsb2MpCisJCQkJcmVwb3J0X25ld2xvY2FsZV9mYWlsdXJl KGNvbGxhdGUpOworCQl9CisJfQorCWVsc2UKKwl7CisjaWZuZGVmIFdJTjMyCisJCS8qIFdlIG5l ZWQgdHdvIG5ld2xvY2FsZSgpIHN0ZXBzICovCisJCWxvY2FsZV90CWxvYzEgPSAwOworCisJCWlm IChzdHJjbXAoY29sbGF0ZSwgIkMiKSAhPSAwICYmIHN0cmNtcChjb2xsYXRlLCAiUE9TSVgiKSAh PSAwKQorCQl7CisJCQllcnJubyA9IDA7CisJCQlsb2MxID0gbmV3bG9jYWxlKExDX0NPTExBVEVf TUFTSywgY29sbGF0ZSwgTlVMTCk7CisJCQlpZiAoIWxvYzEpCisJCQkJcmVwb3J0X25ld2xvY2Fs ZV9mYWlsdXJlKGNvbGxhdGUpOworCQl9CisKKwkJaWYgKHN0cmNtcChjdHlwZSwgIkMiKSAhPSAw ICYmIHN0cmNtcChjdHlwZSwgIlBPU0lYIikgIT0gMCkKKwkJeworCQkJZXJybm8gPSAwOworCQkJ bG9jID0gbmV3bG9jYWxlKExDX0NUWVBFX01BU0ssIGN0eXBlLCBsb2MxKTsKKwkJCWlmICghbG9j KQorCQkJeworCQkJCWlmIChsb2MxKQorCQkJCQlmcmVlbG9jYWxlKGxvYzEpOworCQkJCXJlcG9y dF9uZXdsb2NhbGVfZmFpbHVyZShjdHlwZSk7CisJCQl9CisJCX0KKwkJZWxzZQorCQkJbG9jID0g bG9jMTsKKyNlbHNlCisKKwkJLyoKKwkJICogWFhYIFRoZSBfY3JlYXRlX2xvY2FsZSgpIEFQSSBk b2Vzbid0IGFwcGVhciB0byBzdXBwb3J0IHRoaXMuIENvdWxkCisJCSAqIHBlcmhhcHMgYmUgd29y a2VkIGFyb3VuZCBieSBjaGFuZ2luZyBwZ19sb2NhbGVfdCB0byBjb250YWluIHR3bworCQkgKiBz ZXBhcmF0ZSBmaWVsZHMuCisJCSAqLworCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVS UkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKKwkJCQkgZXJybXNnKCJjb2xsYXRpb25zIHdp dGggZGlmZmVyZW50IGNvbGxhdGUgYW5kIGN0eXBlIHZhbHVlcyBhcmUgbm90IHN1cHBvcnRlZCBv biB0aGlzIHBsYXRmb3JtIikpKTsKKyNlbmRpZgorCX0KKworCXJldHVybiBsb2M7Cit9CisKKy8q CisgKiBzdHJuY29sbF9saWJjX3dpbjMyX3V0ZjgKKyAqCisgKiBXaW4zMiBkb2VzIG5vdCBoYXZl IFVURi04LiBDb252ZXJ0IFVURjggYXJndW1lbnRzIHRvIHdpZGUgY2hhcmFjdGVycyBhbmQKKyAq IGludm9rZSB3Y3Njb2xsX2woKS4KKyAqCisgKiBBbiBpbnB1dCBzdHJpbmcgbGVuZ3RoIG9mIC0x IG1lYW5zIHRoYXQgaXQncyBOVUwtdGVybWluYXRlZC4KKyAqLworI2lmZGVmIFdJTjMyCitzdGF0 aWMgaW50CitzdHJuY29sbF9saWJjX3dpbjMyX3V0ZjgoY29uc3QgY2hhciAqYXJnMSwgc3NpemVf dCBsZW4xLCBjb25zdCBjaGFyICphcmcyLAorCQkJCQkJIHNzaXplX3QgbGVuMiwgcGdfbG9jYWxl X3QgbG9jYWxlKQoreworCWNoYXIJCXNidWZbVEVYVEJVRkxFTl07CisJY2hhcgkgICAqYnVmID0g c2J1ZjsKKwljaGFyCSAgICphMXAsCisJCQkgICAqYTJwOworCWludAkJCWExbGVuOworCWludAkJ CWEybGVuOworCWludAkJCXI7CisJaW50CQkJcmVzdWx0OworCisJQXNzZXJ0KGxvY2FsZS0+cHJv dmlkZXIgPT0gQ09MTFBST1ZJREVSX0xJQkMpOworCUFzc2VydChHZXREYXRhYmFzZUVuY29kaW5n KCkgPT0gUEdfVVRGOCk7CisjaWZuZGVmIFdJTjMyCisJQXNzZXJ0KGZhbHNlKTsKKyNlbmRpZgor CisJaWYgKGxlbjEgPT0gLTEpCisJCWxlbjEgPSBzdHJsZW4oYXJnMSk7CisJaWYgKGxlbjIgPT0g LTEpCisJCWxlbjIgPSBzdHJsZW4oYXJnMik7CisKKwlhMWxlbiA9IGxlbjEgKiAyICsgMjsKKwlh MmxlbiA9IGxlbjIgKiAyICsgMjsKKworCWlmIChhMWxlbiArIGEybGVuID4gVEVYVEJVRkxFTikK KwkJYnVmID0gcGFsbG9jKGExbGVuICsgYTJsZW4pOworCisJYTFwID0gYnVmOworCWEycCA9IGJ1 ZiArIGExbGVuOworCisJLyogQVBJIGRvZXMgbm90IHdvcmsgZm9yIHplcm8tbGVuZ3RoIGlucHV0 ICovCisJaWYgKGxlbjEgPT0gMCkKKwkJciA9IDA7CisJZWxzZQorCXsKKwkJciA9IE11bHRpQnl0 ZVRvV2lkZUNoYXIoQ1BfVVRGOCwgMCwgYXJnMSwgbGVuMSwKKwkJCQkJCQkJKExQV1NUUikgYTFw LCBhMWxlbiAvIDIpOworCQlpZiAoIXIpCisJCQllcmVwb3J0KEVSUk9SLAorCQkJCQkoZXJybXNn KCJjb3VsZCBub3QgY29udmVydCBzdHJpbmcgdG8gVVRGLTE2OiBlcnJvciBjb2RlICVsdSIsCisJ CQkJCQkJR2V0TGFzdEVycm9yKCkpKSk7CisJfQorCSgoTFBXU1RSKSBhMXApW3JdID0gMDsKKwor CWlmIChsZW4yID09IDApCisJCXIgPSAwOworCWVsc2UKKwl7CisJCXIgPSBNdWx0aUJ5dGVUb1dp ZGVDaGFyKENQX1VURjgsIDAsIGFyZzIsIGxlbjIsCisJCQkJCQkJCShMUFdTVFIpIGEycCwgYTJs ZW4gLyAyKTsKKwkJaWYgKCFyKQorCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJKGVycm1zZygiY291 bGQgbm90IGNvbnZlcnQgc3RyaW5nIHRvIFVURi0xNjogZXJyb3IgY29kZSAlbHUiLAorCQkJCQkJ CUdldExhc3RFcnJvcigpKSkpOworCX0KKwkoKExQV1NUUikgYTJwKVtyXSA9IDA7CisKKwllcnJu byA9IDA7CisJcmVzdWx0ID0gd2NzY29sbF9sKChMUFdTVFIpIGExcCwgKExQV1NUUikgYTJwLCBs b2NhbGUtPmluZm8ubHQpOworCWlmIChyZXN1bHQgPT0gMjE0NzQ4MzY0NykJLyogX05MU0NNUEVS Uk9SOyBtaXNzaW5nIGZyb20gbWluZ3cgaGVhZGVycyAqLworCQllcmVwb3J0KEVSUk9SLAorCQkJ CShlcnJtc2coImNvdWxkIG5vdCBjb21wYXJlIFVuaWNvZGUgc3RyaW5nczogJW0iKSkpOworCisJ aWYgKGJ1ZiAhPSBzYnVmKQorCQlwZnJlZShidWYpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKyNl bmRpZgkJCQkJCQkvKiBXSU4zMiAqLworCisvKgorICogc3RybmNvbGxfbGliYworICoKKyAqIEFu IGlucHV0IHN0cmluZyBsZW5ndGggb2YgLTEgbWVhbnMgdGhhdCBpdCdzIE5VTC10ZXJtaW5hdGVk LgorICovCitzdGF0aWMgaW50CitzdHJuY29sbF9saWJjKGNvbnN0IGNoYXIgKmFyZzEsIHNzaXpl X3QgbGVuMSwgY29uc3QgY2hhciAqYXJnMiwgc3NpemVfdCBsZW4yLAorCQkJICBwZ19sb2NhbGVf dCBsb2NhbGUpCit7CisJY2hhcgkJc2J1ZltURVhUQlVGTEVOXTsKKwljaGFyCSAgICpidWYgPSBz YnVmOworCXNpemVfdAkJYnVmc2l6ZTEgPSAobGVuMSA9PSAtMSkgPyAwIDogbGVuMSArIDE7CisJ c2l6ZV90CQlidWZzaXplMiA9IChsZW4yID09IC0xKSA/IDAgOiBsZW4yICsgMTsKKwljb25zdCBj aGFyICphcmcxbjsKKwljb25zdCBjaGFyICphcmcybjsKKwlpbnQJCQlyZXN1bHQ7CisKKwlBc3Nl cnQobG9jYWxlLT5wcm92aWRlciA9PSBDT0xMUFJPVklERVJfTElCQyk7CisKKyNpZmRlZiBXSU4z MgorCS8qIGNoZWNrIGZvciB0aGlzIGNhc2UgYmVmb3JlIGRvaW5nIHRoZSB3b3JrIGZvciBudWwt dGVybWluYXRpb24gKi8KKwlpZiAoR2V0RGF0YWJhc2VFbmNvZGluZygpID09IFBHX1VURjgpCisJ CXJldHVybiBzdHJuY29sbF9saWJjX3dpbjMyX3V0ZjgoYXJnMSwgbGVuMSwgYXJnMiwgbGVuMiwg bG9jYWxlKTsKKyNlbmRpZgkJCQkJCQkvKiBXSU4zMiAqLworCisJaWYgKGJ1ZnNpemUxICsgYnVm c2l6ZTIgPiBURVhUQlVGTEVOKQorCQlidWYgPSBwYWxsb2MoYnVmc2l6ZTEgKyBidWZzaXplMik7 CisKKwkvKiBudWwtdGVybWluYXRlIGFyZ3VtZW50cyBpZiBuZWNlc3NhcnkgKi8KKwlpZiAobGVu MSA9PSAtMSkKKwl7CisJCWFyZzFuID0gYXJnMTsKKwl9CisJZWxzZQorCXsKKwkJY2hhciAqYnVm MSA9IGJ1ZjsKKwkJbWVtY3B5KGJ1ZjEsIGFyZzEsIGxlbjEpOworCQlidWYxW2xlbjFdID0gJ1ww JzsKKwkJYXJnMW4gPSBidWYxOworCX0KKworCWlmIChsZW4yID09IC0xKQorCXsKKwkJYXJnMm4g PSBhcmcyOworCX0KKwllbHNlCisJeworCQljaGFyICpidWYyID0gYnVmICsgYnVmc2l6ZTE7CisJ CW1lbWNweShidWYyLCBhcmcyLCBsZW4yKTsKKwkJYnVmMltsZW4yXSA9ICdcMCc7CisJCWFyZzJu ID0gYnVmMjsKKwl9CisKKwlyZXN1bHQgPSBzdHJjb2xsX2woYXJnMW4sIGFyZzJuLCBsb2NhbGUt PmluZm8ubHQpOworCisJaWYgKGJ1ZiAhPSBzYnVmKQorCQlwZnJlZShidWYpOworCisJcmV0dXJu IHJlc3VsdDsKK30KKworc3RhdGljIHNpemVfdAorc3Rybnhmcm1fbGliYyhjaGFyICpkZXN0LCBz aXplX3QgZGVzdHNpemUsIGNvbnN0IGNoYXIgKnNyYywgc3NpemVfdCBzcmNsZW4sCisJCQkgIHBn X2xvY2FsZV90IGxvY2FsZSkKK3sKKwljaGFyCQlzYnVmW1RFWFRCVUZMRU5dOworCWNoYXIJICAg KmJ1ZiA9IHNidWY7CisJc2l6ZV90CQlidWZzaXplID0gc3JjbGVuICsgMTsKKwlzaXplX3QJCXJl c3VsdDsKKworCUFzc2VydChsb2NhbGUtPnByb3ZpZGVyID09IENPTExQUk9WSURFUl9MSUJDKTsK KworCWlmIChzcmNsZW4gPT0gLTEpCisJCXJldHVybiBzdHJ4ZnJtX2woZGVzdCwgc3JjLCBkZXN0 c2l6ZSwgbG9jYWxlLT5pbmZvLmx0KTsKKworCWlmIChidWZzaXplID4gVEVYVEJVRkxFTikKKwkJ YnVmID0gcGFsbG9jKGJ1ZnNpemUpOworCisJLyogbnVsLXRlcm1pbmF0ZSBhcmd1bWVudCAqLwor CW1lbWNweShidWYsIHNyYywgc3JjbGVuKTsKKwlidWZbc3JjbGVuXSA9ICdcMCc7CisKKwlyZXN1 bHQgPSBzdHJ4ZnJtX2woZGVzdCwgYnVmLCBkZXN0c2l6ZSwgbG9jYWxlLT5pbmZvLmx0KTsKKwor CWlmIChidWYgIT0gc2J1ZikKKwkJcGZyZWUoYnVmKTsKKworCS8qIGlmIGRlc3QgaXMgZGVmaW5l ZCwgaXQgc2hvdWxkIGJlIG51bC10ZXJtaW5hdGVkICovCisJQXNzZXJ0KHJlc3VsdCA+PSBkZXN0 c2l6ZSB8fCBkZXN0W3Jlc3VsdF0gPT0gJ1wwJyk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisv KiBzaW1wbGUgc3Vicm91dGluZSBmb3IgcmVwb3J0aW5nIGVycm9ycyBmcm9tIG5ld2xvY2FsZSgp ICovCitzdGF0aWMgdm9pZAorcmVwb3J0X25ld2xvY2FsZV9mYWlsdXJlKGNvbnN0IGNoYXIgKmxv Y2FsZW5hbWUpCit7CisJaW50CQkJc2F2ZV9lcnJubzsKKworCS8qCisJICogV2luZG93cyBkb2Vz bid0IHByb3ZpZGUgYW55IHVzZWZ1bCBlcnJvciBpbmRpY2F0aW9uIGZyb20KKwkgKiBfY3JlYXRl X2xvY2FsZSgpLCBhbmQgQlNELWRlcml2ZWQgcGxhdGZvcm1zIGRvbid0IHNlZW0gdG8gZmVlbCB0 aGV5CisJICogbmVlZCB0byBzZXQgZXJybm8gZWl0aGVyIChldmVuIHRob3VnaCBQT1NJWCBpcyBw cmV0dHkgY2xlYXIgdGhhdAorCSAqIG5ld2xvY2FsZSBzaG91bGQgZG8gc28pLiAgU28sIGlmIGVy cm5vIGhhc24ndCBiZWVuIHNldCwgYXNzdW1lIEVOT0VOVAorCSAqIGlzIHdoYXQgdG8gcmVwb3J0 LgorCSAqLworCWlmIChlcnJubyA9PSAwKQorCQllcnJubyA9IEVOT0VOVDsKKworCS8qCisJICog RU5PRU5UIG1lYW5zICJubyBzdWNoIGxvY2FsZSIsIG5vdCAibm8gc3VjaCBmaWxlIiwgc28gY2xh cmlmeSB0aGF0CisJICogZXJybm8gd2l0aCBhbiBlcnJkZXRhaWwgbWVzc2FnZS4KKwkgKi8KKwlz YXZlX2Vycm5vID0gZXJybm87CQkJLyogYXV4aWxpYXJ5IGZ1bmNzIG1pZ2h0IGNoYW5nZSBlcnJu byAqLworCWVyZXBvcnQoRVJST1IsCisJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfUEFSQU1F VEVSX1ZBTFVFKSwKKwkJCSBlcnJtc2coImNvdWxkIG5vdCBjcmVhdGUgbG9jYWxlIFwiJXNcIjog JW0iLAorCQkJCQlsb2NhbGVuYW1lKSwKKwkJCSAoc2F2ZV9lcnJubyA9PSBFTk9FTlQgPworCQkJ ICBlcnJkZXRhaWwoIlRoZSBvcGVyYXRpbmcgc3lzdGVtIGNvdWxkIG5vdCBmaW5kIGFueSBsb2Nh bGUgZGF0YSBmb3IgdGhlIGxvY2FsZSBuYW1lIFwiJXNcIi4iLAorCQkJCQkJbG9jYWxlbmFtZSkg OiAwKSkpOworfQorCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS91dGlscy9wZ19sb2NhbGUuaCBi L3NyYy9pbmNsdWRlL3V0aWxzL3BnX2xvY2FsZS5oCmluZGV4IDNiNDQzZGY4MDE0Li45NWJhNzk0 MGI5NSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvdXRpbHMvcGdfbG9jYWxlLmgKKysrIGIvc3Jj L2luY2x1ZGUvdXRpbHMvcGdfbG9jYWxlLmgKQEAgLTEyLDYgKzEyLDcgQEAKICNpZm5kZWYgX1BH X0xPQ0FMRV8KICNkZWZpbmUgX1BHX0xPQ0FMRV8KIAorI2luY2x1ZGUgIm1iL3BnX3djaGFyLmgi CiAjaWYgZGVmaW5lZChMT0NBTEVfVF9JTl9YTE9DQUxFKSB8fCBkZWZpbmVkKFdDU1RPTUJTX0xf SU5fWExPQ0FMRSkKICNpbmNsdWRlIDx4bG9jYWxlLmg+CiAjZW5kaWYKQEAgLTE5LDYgKzIwLDE5 IEBACiAjaW5jbHVkZSA8dW5pY29kZS91Y29sLmg+CiAjZW5kaWYKIAorLyoKKyAqIENoYXJhY3Rl ciBwcm9wZXJ0aWVzIGZvciByZWd1bGFyIGV4cHJlc3Npb25zLgorICovCisjZGVmaW5lIFBHX0lT RElHSVQJMHgwMQorI2RlZmluZSBQR19JU0FMUEhBCTB4MDIKKyNkZWZpbmUgUEdfSVNBTE5VTQko UEdfSVNESUdJVCB8IFBHX0lTQUxQSEEpCisjZGVmaW5lIFBHX0lTVVBQRVIJMHgwNAorI2RlZmlu ZSBQR19JU0xPV0VSCTB4MDgKKyNkZWZpbmUgUEdfSVNHUkFQSAkweDEwCisjZGVmaW5lIFBHX0lT UFJJTlQJMHgyMAorI2RlZmluZSBQR19JU1BVTkNUCTB4NDAKKyNkZWZpbmUgUEdfSVNTUEFDRQkw eDgwCisKICNpZmRlZiBVU0VfSUNVCiAvKgogICogdWNvbF9zdHJjb2xsVVRGOCgpIHdhcyBpbnRy b2R1Y2VkIGluIElDVSA1MCwgYnV0IGl0IGlzIGJ1Z2d5IGJlZm9yZSBJQ1UgNTMuCkBAIC02Miw2 ICs3NiwyOCBAQCBleHRlcm4gc3RydWN0IGxjb252ICpQR0xDX2xvY2FsZWNvbnYodm9pZCk7CiAK IGV4dGVybiB2b2lkIGNhY2hlX2xvY2FsZV90aW1lKHZvaWQpOwogCitzdHJ1Y3QgcGdfbG9jYWxl X3N0cnVjdDsKK3R5cGVkZWYgc3RydWN0IHBnX2xvY2FsZV9zdHJ1Y3QgKnBnX2xvY2FsZV90Owor CitzdHJ1Y3QgY29sbGF0ZV9tZXRob2RzCit7CisJaW50CSgqc3RybmNvbGwpKGNvbnN0IGNoYXIg KmFyZzEsIHNzaXplX3QgbGVuMSwKKwkJCQkJY29uc3QgY2hhciAqYXJnMiwgc3NpemVfdCBsZW4y LAorCQkJCQlwZ19sb2NhbGVfdCBsb2NhbGUpOworCXNpemVfdCAoKnN0cm54ZnJtKShjaGFyICpk ZXN0LCBzaXplX3QgZGVzdHNpemUsCisJCQkJCSAgIGNvbnN0IGNoYXIgKnNyYywgc3NpemVfdCBz cmNsZW4sCisJCQkJCSAgIHBnX2xvY2FsZV90IGxvY2FsZSk7CisJc2l6ZV90ICgqc3Rybnhmcm1f cHJlZml4KShjaGFyICpkZXN0LCBzaXplX3QgZGVzdHNpemUsCisJCQkJCQkJICBjb25zdCBjaGFy ICpzcmMsIHNzaXplX3Qgc3JjbGVuLAorCQkJCQkJCSAgcGdfbG9jYWxlX3QgbG9jYWxlKTsKK307 CisKK3N0cnVjdCBjdHlwZV9tZXRob2RzCit7CisJaW50ICgqY2hhcl9wcm9wcykocGdfd2NoYXIg d2MsIGludCBtYXNrLCBwZ19sb2NhbGVfdCBsb2NhbGUpOworCXBnX3djaGFyICgqd2NfdG91cHBl cikocGdfd2NoYXIgd2MsIHBnX2xvY2FsZV90IGxvY2FsZSk7CisJcGdfd2NoYXIgKCp3Y190b2xv d2VyKShwZ193Y2hhciB3YywgcGdfbG9jYWxlX3QgbG9jYWxlKTsKK307CiAKIC8qCiAgKiBXZSB1 c2UgYSBkaXNjcmltaW5hdGVkIHVuaW9uIHRvIGhvbGQgZWl0aGVyIGEgbG9jYWxlX3Qgb3IgYW4g SUNVIGNvbGxhdG9yLgpAQCAtODUsNiArMTIxLDEwIEBAIHN0cnVjdCBwZ19sb2NhbGVfc3RydWN0 CiAJYm9vbAkJZGV0ZXJtaW5pc3RpYzsKIAlib29sCQljb2xsYXRlX2lzX2M7CiAJYm9vbAkJY3R5 cGVfaXNfYzsKKworCXN0cnVjdCBjb2xsYXRlX21ldGhvZHMgKmNvbGxhdGU7CisJc3RydWN0IGN0 eXBlX21ldGhvZHMgKmN0eXBlOworCiAJdW5pb24KIAl7CiAJCXN0cnVjdApAQCAtMTAyLDggKzE0 Miw2IEBAIHN0cnVjdCBwZ19sb2NhbGVfc3RydWN0CiAJfQkJCWluZm87CiB9OwogCi10eXBlZGVm IHN0cnVjdCBwZ19sb2NhbGVfc3RydWN0ICpwZ19sb2NhbGVfdDsKLQogZXh0ZXJuIHZvaWQgaW5p dF9kYXRhYmFzZV9jb2xsYXRpb24odm9pZCk7CiBleHRlcm4gcGdfbG9jYWxlX3QgcGdfbmV3bG9j YWxlX2Zyb21fY29sbGF0aW9uKE9pZCBjb2xsaWQpOwogCkBAIC0xMzIsNiArMTcwLDggQEAgZXh0 ZXJuIGludDMyX3QgaWN1X3RvX3VjaGFyKFVDaGFyICoqYnVmZl91Y2hhciwgY29uc3QgY2hhciAq YnVmZiwgc2l6ZV90IG5ieXRlcykKIGV4dGVybiBpbnQzMl90IGljdV9mcm9tX3VjaGFyKGNoYXIg KipyZXN1bHQsIGNvbnN0IFVDaGFyICpidWZmX3VjaGFyLCBpbnQzMl90IGxlbl91Y2hhcik7CiAj ZW5kaWYKIAorZXh0ZXJuIGludCBjaGFyX3Byb3BzKHBnX3djaGFyIHdjLCBpbnQgbWFzaywgcGdf bG9jYWxlX3QgbG9jYWxlKTsKKwogLyogVGhlc2UgZnVuY3Rpb25zIGNvbnZlcnQgZnJvbS90byBs aWJjJ3Mgd2NoYXJfdCwgKm5vdCogcGdfd2NoYXJfdCAqLwogZXh0ZXJuIHNpemVfdCB3Y2hhcjJj aGFyKGNoYXIgKnRvLCBjb25zdCB3Y2hhcl90ICpmcm9tLCBzaXplX3QgdG9sZW4sCiAJCQkJCQkg cGdfbG9jYWxlX3QgbG9jYWxlKTsKLS0gCjIuMzQuMQoK --=-reTqxxA0+F50OXMUZ9aK Content-Disposition: attachment; filename*0=v4-0006-Allow-length-1-for-NUL-terminated-input-to-pg_str.pat; filename*1=ch Content-Type: text/x-patch; name="v4-0006-Allow-length-1-for-NUL-terminated-input-to-pg_str.patch"; charset="UTF-8" Content-Transfer-Encoding: base64 RnJvbSA1NmU0ZmJiM2NjZDI5MjdlNGNjOTJiNDIwMTYzMjM2MWUyYjE2YWJiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKZWZmIERhdmlzIDxqZWZmQGotZGF2aXMuY29tPgpEYXRlOiBX ZWQsIDIxIEF1ZyAyMDI0IDEwOjU5OjI4IC0wNzAwClN1YmplY3Q6IFtQQVRDSCB2NCA2LzddIEFs bG93IGxlbmd0aD0tMSBmb3IgTlVMLXRlcm1pbmF0ZWQgaW5wdXQgdG8KIHBnX3N0cm5jb2xsKCks IGV0Yy4KCkxpa2UgSUNVLCBhbGxvdyBhIGxlbmd0aCBvZiAtMSB0byBiZSBzcGVjaWZpZWQgZm9y IE5VTC10ZXJtaW5hdGVkCmFyZ3VtZW50cyB0byBwZ19zdHJuY29sbCgpLCBwZ19zdHJueGZybSgp LCBhbmQgcGdfc3Rybnhmcm1fcHJlZml4KCkuCgpTaW1wbGlmaWVzIHRoZSBjb2RlIGFuZCBjb21t ZW50cy4KLS0tCiBzcmMvYmFja2VuZC91dGlscy9hZHQvcGdfbG9jYWxlLmMgfCAyNTYgKysrKysr KysrKysrLS0tLS0tLS0tLS0tLS0tLS0tCiBzcmMvaW5jbHVkZS91dGlscy9wZ19sb2NhbGUuaCAg ICAgfCAgIDggKy0KIDIgZmlsZXMgY2hhbmdlZCwgMTA0IGluc2VydGlvbnMoKyksIDE2MCBkZWxl dGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvcGdfbG9jYWxlLmMg Yi9zcmMvYmFja2VuZC91dGlscy9hZHQvcGdfbG9jYWxlLmMKaW5kZXggYzg5YWMzYjllMDEuLmNm YmE1NWE2ZTMxIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hZHQvcGdfbG9jYWxlLmMK KysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3BnX2xvY2FsZS5jCkBAIC0xODg2LDIyICsxODg2 LDI0IEBAIGdldF9jb2xsYXRpb25fYWN0dWFsX3ZlcnNpb24oY2hhciBjb2xscHJvdmlkZXIsIGNv bnN0IGNoYXIgKmNvbGxjb2xsYXRlKQogfQogCiAvKgotICogcGdfc3RybmNvbGxfbGliY193aW4z Ml91dGY4CisgKiBzdHJuY29sbF9saWJjX3dpbjMyX3V0ZjgKICAqCiAgKiBXaW4zMiBkb2VzIG5v dCBoYXZlIFVURi04LiBDb252ZXJ0IFVURjggYXJndW1lbnRzIHRvIHdpZGUgY2hhcmFjdGVycyBh bmQKICAqIGludm9rZSB3Y3Njb2xsX2woKS4KKyAqCisgKiBBbiBpbnB1dCBzdHJpbmcgbGVuZ3Ro IG9mIC0xIG1lYW5zIHRoYXQgaXQncyBOVUwtdGVybWluYXRlZC4KICAqLwogI2lmZGVmIFdJTjMy CiBzdGF0aWMgaW50Ci1wZ19zdHJuY29sbF9saWJjX3dpbjMyX3V0ZjgoY29uc3QgY2hhciAqYXJn MSwgc2l6ZV90IGxlbjEsIGNvbnN0IGNoYXIgKmFyZzIsCi0JCQkJCQkJc2l6ZV90IGxlbjIsIHBn X2xvY2FsZV90IGxvY2FsZSkKK3N0cm5jb2xsX2xpYmNfd2luMzJfdXRmOChjb25zdCBjaGFyICph cmcxLCBzc2l6ZV90IGxlbjEsIGNvbnN0IGNoYXIgKmFyZzIsCisJCQkJCQkgc3NpemVfdCBsZW4y LCBwZ19sb2NhbGVfdCBsb2NhbGUpCiB7CiAJY2hhcgkJc2J1ZltURVhUQlVGTEVOXTsKIAljaGFy CSAgICpidWYgPSBzYnVmOwogCWNoYXIJICAgKmExcCwKIAkJCSAgICphMnA7Ci0JaW50CQkJYTFs ZW4gPSBsZW4xICogMiArIDI7Ci0JaW50CQkJYTJsZW4gPSBsZW4yICogMiArIDI7CisJaW50CQkJ YTFsZW47CisJaW50CQkJYTJsZW47CiAJaW50CQkJcjsKIAlpbnQJCQlyZXN1bHQ7CiAKQEAgLTE5 MTEsNiArMTkxMywxNCBAQCBwZ19zdHJuY29sbF9saWJjX3dpbjMyX3V0ZjgoY29uc3QgY2hhciAq YXJnMSwgc2l6ZV90IGxlbjEsIGNvbnN0IGNoYXIgKmFyZzIsCiAJQXNzZXJ0KGZhbHNlKTsKICNl bmRpZgogCisJaWYgKGxlbjEgPT0gLTEpCisJCWxlbjEgPSBzdHJsZW4oYXJnMSk7CisJaWYgKGxl bjIgPT0gLTEpCisJCWxlbjIgPSBzdHJsZW4oYXJnMik7CisKKwlhMWxlbiA9IGxlbjEgKiAyICsg MjsKKwlhMmxlbiA9IGxlbjIgKiAyICsgMjsKKwogCWlmIChhMWxlbiArIGEybGVuID4gVEVYVEJV RkxFTikKIAkJYnVmID0gcGFsbG9jKGExbGVuICsgYTJsZW4pOwogCkBAIC0xOTU4LDUwICsxOTY4 LDIwIEBAIHBnX3N0cm5jb2xsX2xpYmNfd2luMzJfdXRmOChjb25zdCBjaGFyICphcmcxLCBzaXpl X3QgbGVuMSwgY29uc3QgY2hhciAqYXJnMiwKICNlbmRpZgkJCQkJCQkvKiBXSU4zMiAqLwogCiAv KgotICogcGdfc3RyY29sbF9saWJjCisgKiBzdHJuY29sbF9saWJjCiAgKgotICogQ2FsbCBzdHJj b2xsX2woKSBvciB3Y3Njb2xsX2woKSBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGdpdmVuIGxvY2Fs ZSwKLSAqIHBsYXRmb3JtLCBhbmQgZGF0YWJhc2UgZW5jb2RpbmcuIElmIHRoZSBsb2NhbGUgaXMg TlVMTCwgdXNlIHRoZSBkYXRhYmFzZQotICogY29sbGF0aW9uLgotICoKLSAqIEFyZ3VtZW50cyBt dXN0IGJlIGVuY29kZWQgaW4gdGhlIGRhdGFiYXNlIGVuY29kaW5nIGFuZCBudWwtdGVybWluYXRl ZC4KKyAqIEFuIGlucHV0IHN0cmluZyBsZW5ndGggb2YgLTEgbWVhbnMgdGhhdCBpdCdzIE5VTC10 ZXJtaW5hdGVkLgogICovCiBzdGF0aWMgaW50Ci1wZ19zdHJjb2xsX2xpYmMoY29uc3QgY2hhciAq YXJnMSwgY29uc3QgY2hhciAqYXJnMiwgcGdfbG9jYWxlX3QgbG9jYWxlKQotewotCWludAkJCXJl c3VsdDsKLQotCUFzc2VydChsb2NhbGUtPnByb3ZpZGVyID09IENPTExQUk9WSURFUl9MSUJDKTsK LSNpZmRlZiBXSU4zMgotCWlmIChHZXREYXRhYmFzZUVuY29kaW5nKCkgPT0gUEdfVVRGOCkKLQl7 Ci0JCXNpemVfdAkJbGVuMSA9IHN0cmxlbihhcmcxKTsKLQkJc2l6ZV90CQlsZW4yID0gc3RybGVu KGFyZzIpOwotCi0JCXJlc3VsdCA9IHBnX3N0cm5jb2xsX2xpYmNfd2luMzJfdXRmOChhcmcxLCBs ZW4xLCBhcmcyLCBsZW4yLCBsb2NhbGUpOwotCX0KLQllbHNlCi0jZW5kaWYJCQkJCQkJLyogV0lO MzIgKi8KLQkJcmVzdWx0ID0gc3RyY29sbF9sKGFyZzEsIGFyZzIsIGxvY2FsZS0+aW5mby5sdCk7 Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKgotICogcGdfc3RybmNvbGxfbGliYwotICoKLSAq IE51bC10ZXJtaW5hdGUgdGhlIGFyZ3VtZW50cyBhbmQgY2FsbCBwZ19zdHJjb2xsX2xpYmMoKS4K LSAqLwotc3RhdGljIGludAotcGdfc3RybmNvbGxfbGliYyhjb25zdCBjaGFyICphcmcxLCBzaXpl X3QgbGVuMSwgY29uc3QgY2hhciAqYXJnMiwgc2l6ZV90IGxlbjIsCi0JCQkJIHBnX2xvY2FsZV90 IGxvY2FsZSkKK3N0cm5jb2xsX2xpYmMoY29uc3QgY2hhciAqYXJnMSwgc3NpemVfdCBsZW4xLCBj b25zdCBjaGFyICphcmcyLCBzc2l6ZV90IGxlbjIsCisJCQkgIHBnX2xvY2FsZV90IGxvY2FsZSkK IHsKIAljaGFyCQlzYnVmW1RFWFRCVUZMRU5dOwogCWNoYXIJICAgKmJ1ZiA9IHNidWY7Ci0Jc2l6 ZV90CQlidWZzaXplMSA9IGxlbjEgKyAxOwotCXNpemVfdAkJYnVmc2l6ZTIgPSBsZW4yICsgMTsK LQljaGFyCSAgICphcmcxbjsKLQljaGFyCSAgICphcmcybjsKKwlzaXplX3QJCWJ1ZnNpemUxID0g KGxlbjEgPT0gLTEpID8gMCA6IGxlbjEgKyAxOworCXNpemVfdAkJYnVmc2l6ZTIgPSAobGVuMiA9 PSAtMSkgPyAwIDogbGVuMiArIDE7CisJY29uc3QgY2hhciAqYXJnMW47CisJY29uc3QgY2hhciAq YXJnMm47CiAJaW50CQkJcmVzdWx0OwogCiAJQXNzZXJ0KGxvY2FsZS0+cHJvdmlkZXIgPT0gQ09M TFBST1ZJREVSX0xJQkMpOwpAQCAtMjAwOSwyMiArMTk4OSwzOCBAQCBwZ19zdHJuY29sbF9saWJj KGNvbnN0IGNoYXIgKmFyZzEsIHNpemVfdCBsZW4xLCBjb25zdCBjaGFyICphcmcyLCBzaXplX3Qg bGVuMiwKICNpZmRlZiBXSU4zMgogCS8qIGNoZWNrIGZvciB0aGlzIGNhc2UgYmVmb3JlIGRvaW5n IHRoZSB3b3JrIGZvciBudWwtdGVybWluYXRpb24gKi8KIAlpZiAoR2V0RGF0YWJhc2VFbmNvZGlu ZygpID09IFBHX1VURjgpCi0JCXJldHVybiBwZ19zdHJuY29sbF9saWJjX3dpbjMyX3V0ZjgoYXJn MSwgbGVuMSwgYXJnMiwgbGVuMiwgbG9jYWxlKTsKKwkJcmV0dXJuIHN0cm5jb2xsX2xpYmNfd2lu MzJfdXRmOChhcmcxLCBsZW4xLCBhcmcyLCBsZW4yLCBsb2NhbGUpOwogI2VuZGlmCQkJCQkJCS8q IFdJTjMyICovCiAKIAlpZiAoYnVmc2l6ZTEgKyBidWZzaXplMiA+IFRFWFRCVUZMRU4pCiAJCWJ1 ZiA9IHBhbGxvYyhidWZzaXplMSArIGJ1ZnNpemUyKTsKIAotCWFyZzFuID0gYnVmOwotCWFyZzJu ID0gYnVmICsgYnVmc2l6ZTE7CisJLyogbnVsLXRlcm1pbmF0ZSBhcmd1bWVudHMgaWYgbmVjZXNz YXJ5ICovCisJaWYgKGxlbjEgPT0gLTEpCisJeworCQlhcmcxbiA9IGFyZzE7CisJfQorCWVsc2UK Kwl7CisJCWNoYXIgKmJ1ZjEgPSBidWY7CisJCW1lbWNweShidWYxLCBhcmcxLCBsZW4xKTsKKwkJ YnVmMVtsZW4xXSA9ICdcMCc7CisJCWFyZzFuID0gYnVmMTsKKwl9CiAKLQkvKiBudWwtdGVybWlu YXRlIGFyZ3VtZW50cyAqLwotCW1lbWNweShhcmcxbiwgYXJnMSwgbGVuMSk7Ci0JYXJnMW5bbGVu MV0gPSAnXDAnOwotCW1lbWNweShhcmcybiwgYXJnMiwgbGVuMik7Ci0JYXJnMm5bbGVuMl0gPSAn XDAnOworCWlmIChsZW4yID09IC0xKQorCXsKKwkJYXJnMm4gPSBhcmcyOworCX0KKwllbHNlCisJ eworCQljaGFyICpidWYyID0gYnVmICsgYnVmc2l6ZTE7CisJCW1lbWNweShidWYyLCBhcmcyLCBs ZW4yKTsKKwkJYnVmMltsZW4yXSA9ICdcMCc7CisJCWFyZzJuID0gYnVmMjsKKwl9CiAKLQlyZXN1 bHQgPSBwZ19zdHJjb2xsX2xpYmMoYXJnMW4sIGFyZzJuLCBsb2NhbGUpOworCXJlc3VsdCA9IHN0 cmNvbGxfbChhcmcxbiwgYXJnMm4sIGxvY2FsZS0+aW5mby5sdCk7CiAKIAlpZiAoYnVmICE9IHNi dWYpCiAJCXBmcmVlKGJ1Zik7CkBAIC0yMDM1LDcgKzIwMzEsNyBAQCBwZ19zdHJuY29sbF9saWJj KGNvbnN0IGNoYXIgKmFyZzEsIHNpemVfdCBsZW4xLCBjb25zdCBjaGFyICphcmcyLCBzaXplX3Qg bGVuMiwKICNpZmRlZiBVU0VfSUNVCiAKIC8qCi0gKiBwZ19zdHJuY29sbF9pY3Vfbm9fdXRmOAor ICogc3RybmNvbGxfaWN1X25vX3V0ZjgKICAqCiAgKiBDb252ZXJ0IHRoZSBhcmd1bWVudHMgZnJv bSB0aGUgZGF0YWJhc2UgZW5jb2RpbmcgdG8gVUNoYXIgc3RyaW5ncywgdGhlbgogICogY2FsbCB1 Y29sX3N0cmNvbGwoKS4gQW4gYXJndW1lbnQgbGVuZ3RoIG9mIC0xIG1lYW5zIHRoYXQgdGhlIHN0 cmluZyBpcwpAQCAtMjA0NSw4ICsyMDQxLDggQEAgcGdfc3RybmNvbGxfbGliYyhjb25zdCBjaGFy ICphcmcxLCBzaXplX3QgbGVuMSwgY29uc3QgY2hhciAqYXJnMiwgc2l6ZV90IGxlbjIsCiAgKiBj YWxsZXIgc2hvdWxkIGNhbGwgdGhhdCBpbnN0ZWFkLgogICovCiBzdGF0aWMgaW50Ci1wZ19zdHJu Y29sbF9pY3Vfbm9fdXRmOChjb25zdCBjaGFyICphcmcxLCBpbnQzMl90IGxlbjEsCi0JCQkJCQlj b25zdCBjaGFyICphcmcyLCBpbnQzMl90IGxlbjIsIHBnX2xvY2FsZV90IGxvY2FsZSkKK3N0cm5j b2xsX2ljdV9ub191dGY4KGNvbnN0IGNoYXIgKmFyZzEsIHNzaXplX3QgbGVuMSwKKwkJCQkJIGNv bnN0IGNoYXIgKmFyZzIsIHNzaXplX3QgbGVuMiwgcGdfbG9jYWxlX3QgbG9jYWxlKQogewogCWNo YXIJCXNidWZbVEVYVEJVRkxFTl07CiAJY2hhcgkgICAqYnVmID0gc2J1ZjsKQEAgLTIwOTEsMTcg KzIwODcsMTUgQEAgcGdfc3RybmNvbGxfaWN1X25vX3V0ZjgoY29uc3QgY2hhciAqYXJnMSwgaW50 MzJfdCBsZW4xLAogfQogCiAvKgotICogcGdfc3RybmNvbGxfaWN1CisgKiBzdHJuY29sbF9pY3UK ICAqCiAgKiBDYWxsIHVjb2xfc3RyY29sbFVURjgoKSBvciB1Y29sX3N0cmNvbGwoKSBhcyBhcHBy b3ByaWF0ZSBmb3IgdGhlIGdpdmVuCiAgKiBkYXRhYmFzZSBlbmNvZGluZy4gQW4gYXJndW1lbnQg bGVuZ3RoIG9mIC0xIG1lYW5zIHRoZSBzdHJpbmcgaXMKICAqIE5VTC10ZXJtaW5hdGVkLgotICoK LSAqIEFyZ3VtZW50cyBtdXN0IGJlIGVuY29kZWQgaW4gdGhlIGRhdGFiYXNlIGVuY29kaW5nLgog ICovCiBzdGF0aWMgaW50Ci1wZ19zdHJuY29sbF9pY3UoY29uc3QgY2hhciAqYXJnMSwgaW50MzJf dCBsZW4xLCBjb25zdCBjaGFyICphcmcyLCBpbnQzMl90IGxlbjIsCi0JCQkJcGdfbG9jYWxlX3Qg bG9jYWxlKQorc3RybmNvbGxfaWN1KGNvbnN0IGNoYXIgKmFyZzEsIHNzaXplX3QgbGVuMSwgY29u c3QgY2hhciAqYXJnMiwgc3NpemVfdCBsZW4yLAorCQkJIHBnX2xvY2FsZV90IGxvY2FsZSkKIHsK IAlpbnQJCQlyZXN1bHQ7CiAKQEAgLTIxMjQsNyArMjExOCw3IEBAIHBnX3N0cm5jb2xsX2ljdShj b25zdCBjaGFyICphcmcxLCBpbnQzMl90IGxlbjEsIGNvbnN0IGNoYXIgKmFyZzIsIGludDMyX3Qg bGVuMiwKIAllbHNlCiAjZW5kaWYKIAl7Ci0JCXJlc3VsdCA9IHBnX3N0cm5jb2xsX2ljdV9ub191 dGY4KGFyZzEsIGxlbjEsIGFyZzIsIGxlbjIsIGxvY2FsZSk7CisJCXJlc3VsdCA9IHN0cm5jb2xs X2ljdV9ub191dGY4KGFyZzEsIGxlbjEsIGFyZzIsIGxlbjIsIGxvY2FsZSk7CiAJfQogCiAJcmV0 dXJuIHJlc3VsdDsKQEAgLTIxMzUsMTUgKzIxMjksNyBAQCBwZ19zdHJuY29sbF9pY3UoY29uc3Qg Y2hhciAqYXJnMSwgaW50MzJfdCBsZW4xLCBjb25zdCBjaGFyICphcmcyLCBpbnQzMl90IGxlbjIs CiAvKgogICogcGdfc3RyY29sbAogICoKLSAqIENhbGwgdWNvbF9zdHJjb2xsVVRGOCgpLCB1Y29s X3N0cmNvbGwoKSwgc3RyY29sbF9sKCkgb3Igd2NzY29sbF9sKCkgYXMKLSAqIGFwcHJvcHJpYXRl IGZvciB0aGUgZ2l2ZW4gbG9jYWxlLCBwbGF0Zm9ybSwgYW5kIGRhdGFiYXNlIGVuY29kaW5nLiBJ ZiB0aGUKLSAqIGxvY2FsZSBpcyBub3Qgc3BlY2lmaWVkLCB1c2UgdGhlIGRhdGFiYXNlIGNvbGxh dGlvbi4KLSAqCi0gKiBBcmd1bWVudHMgbXVzdCBiZSBlbmNvZGVkIGluIHRoZSBkYXRhYmFzZSBl bmNvZGluZyBhbmQgbnVsLXRlcm1pbmF0ZWQuCi0gKgotICogVGhlIGNhbGxlciBpcyByZXNwb25z aWJsZSBmb3IgYnJlYWtpbmcgdGllcyBpZiB0aGUgY29sbGF0aW9uIGlzCi0gKiBkZXRlcm1pbmlz dGljOyB0aGlzIG1haW50YWlucyBjb25zaXN0ZW5jeSB3aXRoIHBnX3N0cnhmcm0oKSwgd2hpY2gg Y2Fubm90Ci0gKiBlYXNpbHkgYWNjb3VudCBmb3IgZGV0ZXJtaW5pc3RpYyBjb2xsYXRpb25zLgor ICogTGlrZSBwZ19zdHJuY29sbCBmb3IgTlVMLXRlcm1pbmF0ZWQgaW5wdXQgc3RyaW5ncy4KICAq LwogaW50CiBwZ19zdHJjb2xsKGNvbnN0IGNoYXIgKmFyZzEsIGNvbnN0IGNoYXIgKmFyZzIsIHBn X2xvY2FsZV90IGxvY2FsZSkKQEAgLTIxNTEsMTAgKzIxMzcsMTAgQEAgcGdfc3RyY29sbChjb25z dCBjaGFyICphcmcxLCBjb25zdCBjaGFyICphcmcyLCBwZ19sb2NhbGVfdCBsb2NhbGUpCiAJaW50 CQkJcmVzdWx0OwogCiAJaWYgKGxvY2FsZS0+cHJvdmlkZXIgPT0gQ09MTFBST1ZJREVSX0xJQkMp Ci0JCXJlc3VsdCA9IHBnX3N0cmNvbGxfbGliYyhhcmcxLCBhcmcyLCBsb2NhbGUpOworCQlyZXN1 bHQgPSBzdHJuY29sbF9saWJjKGFyZzEsIC0xLCBhcmcyLCAtMSwgbG9jYWxlKTsKICNpZmRlZiBV U0VfSUNVCiAJZWxzZSBpZiAobG9jYWxlLT5wcm92aWRlciA9PSBDT0xMUFJPVklERVJfSUNVKQot CQlyZXN1bHQgPSBwZ19zdHJuY29sbF9pY3UoYXJnMSwgLTEsIGFyZzIsIC0xLCBsb2NhbGUpOwor CQlyZXN1bHQgPSBzdHJuY29sbF9pY3UoYXJnMSwgLTEsIGFyZzIsIC0xLCBsb2NhbGUpOwogI2Vu ZGlmCiAJZWxzZQogCQkvKiBzaG91bGRuJ3QgaGFwcGVuICovCkBAIC0yMTcwLDI3ICsyMTU2LDI0 IEBAIHBnX3N0cmNvbGwoY29uc3QgY2hhciAqYXJnMSwgY29uc3QgY2hhciAqYXJnMiwgcGdfbG9j YWxlX3QgbG9jYWxlKQogICogYXBwcm9wcmlhdGUgZm9yIHRoZSBnaXZlbiBsb2NhbGUsIHBsYXRm b3JtLCBhbmQgZGF0YWJhc2UgZW5jb2RpbmcuIElmIHRoZQogICogbG9jYWxlIGlzIG5vdCBzcGVj aWZpZWQsIHVzZSB0aGUgZGF0YWJhc2UgY29sbGF0aW9uLgogICoKLSAqIEFyZ3VtZW50cyBtdXN0 IGJlIGVuY29kZWQgaW4gdGhlIGRhdGFiYXNlIGVuY29kaW5nLgotICoKLSAqIFRoaXMgZnVuY3Rp b24gbWF5IG5lZWQgdG8gbnVsLXRlcm1pbmF0ZSB0aGUgYXJndW1lbnRzIGZvciBsaWJjIGZ1bmN0 aW9uczsKLSAqIHNvIGlmIHRoZSBjYWxsZXIgYWxyZWFkeSBoYXMgbnVsLXRlcm1pbmF0ZWQgc3Ry aW5ncywgaXQgc2hvdWxkIGNhbGwKLSAqIHBnX3N0cmNvbGwoKSBpbnN0ZWFkLgorICogVGhlIGlu cHV0IHN0cmluZ3MgbXVzdCBiZSBlbmNvZGVkIGluIHRoZSBkYXRhYmFzZSBlbmNvZGluZy4gSWYg YW4gaW5wdXQKKyAqIHN0cmluZyBpcyBOVUwtdGVybWluYXRlZCwgaXRzIGxlbmd0aCBtYXkgYmUg c3BlY2lmaWVkIGFzIC0xLgogICoKICAqIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGJy ZWFraW5nIHRpZXMgaWYgdGhlIGNvbGxhdGlvbiBpcwogICogZGV0ZXJtaW5pc3RpYzsgdGhpcyBt YWludGFpbnMgY29uc2lzdGVuY3kgd2l0aCBwZ19zdHJueGZybSgpLCB3aGljaCBjYW5ub3QKICAq IGVhc2lseSBhY2NvdW50IGZvciBkZXRlcm1pbmlzdGljIGNvbGxhdGlvbnMuCiAgKi8KIGludAot cGdfc3RybmNvbGwoY29uc3QgY2hhciAqYXJnMSwgc2l6ZV90IGxlbjEsIGNvbnN0IGNoYXIgKmFy ZzIsIHNpemVfdCBsZW4yLAorcGdfc3RybmNvbGwoY29uc3QgY2hhciAqYXJnMSwgc3NpemVfdCBs ZW4xLCBjb25zdCBjaGFyICphcmcyLCBzc2l6ZV90IGxlbjIsCiAJCQlwZ19sb2NhbGVfdCBsb2Nh bGUpCiB7CiAJaW50CQkJcmVzdWx0OwogCiAJaWYgKGxvY2FsZS0+cHJvdmlkZXIgPT0gQ09MTFBS T1ZJREVSX0xJQkMpCi0JCXJlc3VsdCA9IHBnX3N0cm5jb2xsX2xpYmMoYXJnMSwgbGVuMSwgYXJn MiwgbGVuMiwgbG9jYWxlKTsKKwkJcmVzdWx0ID0gc3RybmNvbGxfbGliYyhhcmcxLCBsZW4xLCBh cmcyLCBsZW4yLCBsb2NhbGUpOwogI2lmZGVmIFVTRV9JQ1UKIAllbHNlIGlmIChsb2NhbGUtPnBy b3ZpZGVyID09IENPTExQUk9WSURFUl9JQ1UpCi0JCXJlc3VsdCA9IHBnX3N0cm5jb2xsX2ljdShh cmcxLCBsZW4xLCBhcmcyLCBsZW4yLCBsb2NhbGUpOworCQlyZXN1bHQgPSBzdHJuY29sbF9pY3Uo YXJnMSwgbGVuMSwgYXJnMiwgbGVuMiwgbG9jYWxlKTsKICNlbmRpZgogCWVsc2UKIAkJLyogc2hv dWxkbid0IGhhcHBlbiAqLwpAQCAtMjIwMSwxNiArMjE4NCw4IEBAIHBnX3N0cm5jb2xsKGNvbnN0 IGNoYXIgKmFyZzEsIHNpemVfdCBsZW4xLCBjb25zdCBjaGFyICphcmcyLCBzaXplX3QgbGVuMiwK IAogCiBzdGF0aWMgc2l6ZV90Ci1wZ19zdHJ4ZnJtX2xpYmMoY2hhciAqZGVzdCwgY29uc3QgY2hh ciAqc3JjLCBzaXplX3QgZGVzdHNpemUsCi0JCQkJcGdfbG9jYWxlX3QgbG9jYWxlKQotewotCUFz c2VydChsb2NhbGUtPnByb3ZpZGVyID09IENPTExQUk9WSURFUl9MSUJDKTsKLQlyZXR1cm4gc3Ry eGZybV9sKGRlc3QsIHNyYywgZGVzdHNpemUsIGxvY2FsZS0+aW5mby5sdCk7Ci19Ci0KLXN0YXRp YyBzaXplX3QKLXBnX3N0cm54ZnJtX2xpYmMoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjLCBz aXplX3Qgc3JjbGVuLCBzaXplX3QgZGVzdHNpemUsCi0JCQkJIHBnX2xvY2FsZV90IGxvY2FsZSkK K3N0cm54ZnJtX2xpYmMoY2hhciAqZGVzdCwgc2l6ZV90IGRlc3RzaXplLCBjb25zdCBjaGFyICpz cmMsIHNzaXplX3Qgc3JjbGVuLAorCQkJICBwZ19sb2NhbGVfdCBsb2NhbGUpCiB7CiAJY2hhcgkJ c2J1ZltURVhUQlVGTEVOXTsKIAljaGFyCSAgICpidWYgPSBzYnVmOwpAQCAtMjIxOSwxNCArMjE5 NCwxNyBAQCBwZ19zdHJueGZybV9saWJjKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6 ZV90IHNyY2xlbiwgc2l6ZV90IGRlc3RzaXplLAogCiAJQXNzZXJ0KGxvY2FsZS0+cHJvdmlkZXIg PT0gQ09MTFBST1ZJREVSX0xJQkMpOwogCisJaWYgKHNyY2xlbiA9PSAtMSkKKwkJcmV0dXJuIHN0 cnhmcm1fbChkZXN0LCBzcmMsIGRlc3RzaXplLCBsb2NhbGUtPmluZm8ubHQpOworCiAJaWYgKGJ1 ZnNpemUgPiBURVhUQlVGTEVOKQogCQlidWYgPSBwYWxsb2MoYnVmc2l6ZSk7CiAKLQkvKiBudWwt dGVybWluYXRlIGFyZ3VtZW50cyAqLworCS8qIG51bC10ZXJtaW5hdGUgYXJndW1lbnQgKi8KIAlt ZW1jcHkoYnVmLCBzcmMsIHNyY2xlbik7CiAJYnVmW3NyY2xlbl0gPSAnXDAnOwogCi0JcmVzdWx0 ID0gcGdfc3RyeGZybV9saWJjKGRlc3QsIGJ1ZiwgZGVzdHNpemUsIGxvY2FsZSk7CisJcmVzdWx0 ID0gc3RyeGZybV9sKGRlc3QsIGJ1ZiwgZGVzdHNpemUsIGxvY2FsZS0+aW5mby5sdCk7CiAKIAlp ZiAoYnVmICE9IHNidWYpCiAJCXBmcmVlKGJ1Zik7CkBAIC0yMjQxLDggKzIyMTksOCBAQCBwZ19z dHJueGZybV9saWJjKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNyY2xlbiwg c2l6ZV90IGRlc3RzaXplLAogCiAvKiAnc3JjbGVuJyBvZiAtMSBtZWFucyB0aGUgc3RyaW5ncyBh cmUgTlVMLXRlcm1pbmF0ZWQgKi8KIHN0YXRpYyBzaXplX3QKLXBnX3N0cm54ZnJtX2ljdShjaGFy ICpkZXN0LCBjb25zdCBjaGFyICpzcmMsIGludDMyX3Qgc3JjbGVuLCBpbnQzMl90IGRlc3RzaXpl LAotCQkJCXBnX2xvY2FsZV90IGxvY2FsZSkKK3N0cm54ZnJtX2ljdShjaGFyICpkZXN0LCBzaXpl X3QgZGVzdHNpemUsIGNvbnN0IGNoYXIgKnNyYywgc3NpemVfdCBzcmNsZW4sCisJCQkgcGdfbG9j YWxlX3QgbG9jYWxlKQogewogCWNoYXIJCXNidWZbVEVYVEJVRkxFTl07CiAJY2hhcgkgICAqYnVm ID0gc2J1ZjsKQEAgLTIyODgsOCArMjI2Niw5IEBAIHBnX3N0cm54ZnJtX2ljdShjaGFyICpkZXN0 LCBjb25zdCBjaGFyICpzcmMsIGludDMyX3Qgc3JjbGVuLCBpbnQzMl90IGRlc3RzaXplLAogCiAv KiAnc3JjbGVuJyBvZiAtMSBtZWFucyB0aGUgc3RyaW5ncyBhcmUgTlVMLXRlcm1pbmF0ZWQgKi8K IHN0YXRpYyBzaXplX3QKLXBnX3N0cm54ZnJtX3ByZWZpeF9pY3Vfbm9fdXRmOChjaGFyICpkZXN0 LCBjb25zdCBjaGFyICpzcmMsIGludDMyX3Qgc3JjbGVuLAotCQkJCQkJCSAgIGludDMyX3QgZGVz dHNpemUsIHBnX2xvY2FsZV90IGxvY2FsZSkKK3N0cm54ZnJtX3ByZWZpeF9pY3Vfbm9fdXRmOChj aGFyICpkZXN0LHNpemVfdCBkZXN0c2l6ZSwKKwkJCQkJCQljb25zdCBjaGFyICpzcmMsIHNzaXpl X3Qgc3JjbGVuLAorCQkJCQkJCXBnX2xvY2FsZV90IGxvY2FsZSkKIHsKIAljaGFyCQlzYnVmW1RF WFRCVUZMRU5dOwogCWNoYXIJICAgKmJ1ZiA9IHNidWY7CkBAIC0yMzM2LDggKzIzMTUsOSBAQCBw Z19zdHJueGZybV9wcmVmaXhfaWN1X25vX3V0ZjgoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3Jj LCBpbnQzMl90IHNyY2xlbiwKIAogLyogJ3NyY2xlbicgb2YgLTEgbWVhbnMgdGhlIHN0cmluZ3Mg YXJlIE5VTC10ZXJtaW5hdGVkICovCiBzdGF0aWMgc2l6ZV90Ci1wZ19zdHJueGZybV9wcmVmaXhf aWN1KGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYywgaW50MzJfdCBzcmNsZW4sCi0JCQkJCSAg IGludDMyX3QgZGVzdHNpemUsIHBnX2xvY2FsZV90IGxvY2FsZSkKK3N0cm54ZnJtX3ByZWZpeF9p Y3UoY2hhciAqZGVzdCwgc2l6ZV90IGRlc3RzaXplLAorCQkJCQljb25zdCBjaGFyICpzcmMsIHNz aXplX3Qgc3JjbGVuLAorCQkJCQlwZ19sb2NhbGVfdCBsb2NhbGUpCiB7CiAJc2l6ZV90CQlyZXN1 bHQ7CiAKQEAgLTIzNjQsOCArMjM0NCw4IEBAIHBnX3N0cm54ZnJtX3ByZWZpeF9pY3UoY2hhciAq ZGVzdCwgY29uc3QgY2hhciAqc3JjLCBpbnQzMl90IHNyY2xlbiwKIAkJCQkJCQl1X2Vycm9yTmFt ZShzdGF0dXMpKSkpOwogCX0KIAllbHNlCi0JCXJlc3VsdCA9IHBnX3N0cm54ZnJtX3ByZWZpeF9p Y3Vfbm9fdXRmOChkZXN0LCBzcmMsIHNyY2xlbiwgZGVzdHNpemUsCi0JCQkJCQkJCQkJCQlsb2Nh bGUpOworCQlyZXN1bHQgPSBzdHJueGZybV9wcmVmaXhfaWN1X25vX3V0ZjgoZGVzdCwgZGVzdHNp emUsIHNyYywgc3JjbGVuLAorCQkJCQkJCQkJCQkgbG9jYWxlKTsKIAogCXJldHVybiByZXN1bHQ7 CiB9CkBAIC0yNDA3LDIwICsyMzg3LDcgQEAgcGdfc3RyeGZybV9lbmFibGVkKHBnX2xvY2FsZV90 IGxvY2FsZSkKIC8qCiAgKiBwZ19zdHJ4ZnJtCiAgKgotICogVHJhbnNmb3JtcyAnc3JjJyB0byBh IG51bC10ZXJtaW5hdGVkIHN0cmluZyBzdG9yZWQgaW4gJ2Rlc3QnIHN1Y2ggdGhhdAotICogb3Jk aW5hcnkgc3RyY21wKCkgb24gdHJhbnNmb3JtZWQgc3RyaW5ncyBpcyBlcXVpdmFsZW50IHRvIHBn X3N0cmNvbGwoKSBvbgotICogdW50cmFuc2Zvcm1lZCBzdHJpbmdzLgotICoKLSAqIFRoZSBwcm92 aWRlZCAnc3JjJyBtdXN0IGJlIG51bC10ZXJtaW5hdGVkLiBJZiAnZGVzdHNpemUnIGlzIHplcm8s ICdkZXN0JwotICogbWF5IGJlIE5VTEwuCi0gKgotICogTm90IGFsbCBwcm92aWRlcnMgc3VwcG9y dCBwZ19zdHJ4ZnJtKCkgc2FmZWx5LiBUaGUgY2FsbGVyIHNob3VsZCBjaGVjawotICogcGdfc3Ry eGZybV9lbmFibGVkKCkgZmlyc3QsIG90aGVyd2lzZSB0aGlzIGZ1bmN0aW9uIG1heSByZXR1cm4g d3JvbmcKLSAqIHJlc3VsdHMgb3IgYW4gZXJyb3IuCi0gKgotICogUmV0dXJucyB0aGUgbnVtYmVy IG9mIGJ5dGVzIG5lZWRlZCAob3IgbW9yZSkgdG8gc3RvcmUgdGhlIHRyYW5zZm9ybWVkCi0gKiBz dHJpbmcsIGV4Y2x1ZGluZyB0aGUgdGVybWluYXRpbmcgbnVsIGJ5dGUuIElmIHRoZSB2YWx1ZSBy ZXR1cm5lZCBpcwotICogJ2Rlc3RzaXplJyBvciBncmVhdGVyLCB0aGUgcmVzdWx0aW5nIGNvbnRl bnRzIG9mICdkZXN0JyBhcmUgdW5kZWZpbmVkLgorICogTGlrZSBwZ19zdHJueGZybSBmb3IgYSBO VUwtdGVybWluYXRlZCBpbnB1dCBzdHJpbmcuCiAgKi8KIHNpemVfdAogcGdfc3RyeGZybShjaGFy ICpkZXN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBkZXN0c2l6ZSwgcGdfbG9jYWxlX3QgbG9j YWxlKQpAQCAtMjQyOCwxMCArMjM5NSwxMCBAQCBwZ19zdHJ4ZnJtKGNoYXIgKmRlc3QsIGNvbnN0 IGNoYXIgKnNyYywgc2l6ZV90IGRlc3RzaXplLCBwZ19sb2NhbGVfdCBsb2NhbGUpCiAJc2l6ZV90 CQlyZXN1bHQgPSAwOwkJLyoga2VlcCBjb21waWxlciBxdWlldCAqLwogCiAJaWYgKGxvY2FsZS0+ cHJvdmlkZXIgPT0gQ09MTFBST1ZJREVSX0xJQkMpCi0JCXJlc3VsdCA9IHBnX3N0cnhmcm1fbGli YyhkZXN0LCBzcmMsIGRlc3RzaXplLCBsb2NhbGUpOworCQlyZXN1bHQgPSBzdHJueGZybV9saWJj KGRlc3QsIGRlc3RzaXplLCBzcmMsIC0xLCBsb2NhbGUpOwogI2lmZGVmIFVTRV9JQ1UKIAllbHNl IGlmIChsb2NhbGUtPnByb3ZpZGVyID09IENPTExQUk9WSURFUl9JQ1UpCi0JCXJlc3VsdCA9IHBn X3N0cm54ZnJtX2ljdShkZXN0LCBzcmMsIC0xLCBkZXN0c2l6ZSwgbG9jYWxlKTsKKwkJcmVzdWx0 ID0gc3Rybnhmcm1faWN1KGRlc3QsIGRlc3RzaXplLCBzcmMsIC0xLCBsb2NhbGUpOwogI2VuZGlm CiAJZWxzZQogCQkvKiBzaG91bGRuJ3QgaGFwcGVuICovCkBAIC0yNDQ3LDggKzI0MTQsOSBAQCBw Z19zdHJ4ZnJtKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IGRlc3RzaXplLCBw Z19sb2NhbGVfdCBsb2NhbGUpCiAgKiBvcmRpbmFyeSBzdHJjbXAoKSBvbiB0cmFuc2Zvcm1lZCBz dHJpbmdzIGlzIGVxdWl2YWxlbnQgdG8gcGdfc3RyY29sbCgpIG9uCiAgKiB1bnRyYW5zZm9ybWVk IHN0cmluZ3MuCiAgKgotICogJ3NyYycgZG9lcyBub3QgbmVlZCB0byBiZSBudWwtdGVybWluYXRl ZC4gSWYgJ2Rlc3RzaXplJyBpcyB6ZXJvLCAnZGVzdCcgbWF5Ci0gKiBiZSBOVUxMLgorICogVGhl IGlucHV0IHN0cmluZyBtdXN0IGJlIGVuY29kZWQgaW4gdGhlIGRhdGFiYXNlIGVuY29kaW5nLiBJ ZiB0aGUgaW5wdXQKKyAqIHN0cmluZyBpcyBOVUwtdGVybWluYXRlZCwgaXRzIGxlbmd0aCBtYXkg YmUgc3BlY2lmaWVkIGFzIC0xLiBJZiAnZGVzdHNpemUnCisgKiBpcyB6ZXJvLCAnZGVzdCcgbWF5 IGJlIE5VTEwuCiAgKgogICogTm90IGFsbCBwcm92aWRlcnMgc3VwcG9ydCBwZ19zdHJueGZybSgp IHNhZmVseS4gVGhlIGNhbGxlciBzaG91bGQgY2hlY2sKICAqIHBnX3N0cnhmcm1fZW5hYmxlZCgp IGZpcnN0LCBvdGhlcndpc2UgdGhpcyBmdW5jdGlvbiBtYXkgcmV0dXJuIHdyb25nCkBAIC0yNDU3 LDIyICsyNDI1LDE4IEBAIHBnX3N0cnhmcm0oY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjLCBz aXplX3QgZGVzdHNpemUsIHBnX2xvY2FsZV90IGxvY2FsZSkKICAqIFJldHVybnMgdGhlIG51bWJl ciBvZiBieXRlcyBuZWVkZWQgKG9yIG1vcmUpIHRvIHN0b3JlIHRoZSB0cmFuc2Zvcm1lZAogICog c3RyaW5nLCBleGNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIG51bCBieXRlLiBJZiB0aGUgdmFsdWUg cmV0dXJuZWQgaXMKICAqICdkZXN0c2l6ZScgb3IgZ3JlYXRlciwgdGhlIHJlc3VsdGluZyBjb250 ZW50cyBvZiAnZGVzdCcgYXJlIHVuZGVmaW5lZC4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIG1heSBu ZWVkIHRvIG51bC10ZXJtaW5hdGUgdGhlIGFyZ3VtZW50IGZvciBsaWJjIGZ1bmN0aW9uczsKLSAq IHNvIGlmIHRoZSBjYWxsZXIgYWxyZWFkeSBoYXMgYSBudWwtdGVybWluYXRlZCBzdHJpbmcsIGl0 IHNob3VsZCBjYWxsCi0gKiBwZ19zdHJ4ZnJtKCkgaW5zdGVhZC4KICAqLwogc2l6ZV90Ci1wZ19z dHJueGZybShjaGFyICpkZXN0LCBzaXplX3QgZGVzdHNpemUsIGNvbnN0IGNoYXIgKnNyYywgc2l6 ZV90IHNyY2xlbiwKK3BnX3N0cm54ZnJtKGNoYXIgKmRlc3QsIHNpemVfdCBkZXN0c2l6ZSwgY29u c3QgY2hhciAqc3JjLCBzc2l6ZV90IHNyY2xlbiwKIAkJCXBnX2xvY2FsZV90IGxvY2FsZSkKIHsK IAlzaXplX3QJCXJlc3VsdCA9IDA7CQkvKiBrZWVwIGNvbXBpbGVyIHF1aWV0ICovCiAKIAlpZiAo bG9jYWxlLT5wcm92aWRlciA9PSBDT0xMUFJPVklERVJfTElCQykKLQkJcmVzdWx0ID0gcGdfc3Ry bnhmcm1fbGliYyhkZXN0LCBzcmMsIHNyY2xlbiwgZGVzdHNpemUsIGxvY2FsZSk7CisJCXJlc3Vs dCA9IHN0cm54ZnJtX2xpYmMoZGVzdCwgc3JjLCBzcmNsZW4sIGRlc3RzaXplLCBsb2NhbGUpOwog I2lmZGVmIFVTRV9JQ1UKIAllbHNlIGlmIChsb2NhbGUtPnByb3ZpZGVyID09IENPTExQUk9WSURF Ul9JQ1UpCi0JCXJlc3VsdCA9IHBnX3N0cm54ZnJtX2ljdShkZXN0LCBzcmMsIHNyY2xlbiwgZGVz dHNpemUsIGxvY2FsZSk7CisJCXJlc3VsdCA9IHN0cm54ZnJtX2ljdShkZXN0LCBzcmMsIHNyY2xl biwgZGVzdHNpemUsIGxvY2FsZSk7CiAjZW5kaWYKIAllbHNlCiAJCS8qIHNob3VsZG4ndCBoYXBw ZW4gKi8KQEAgLTI1MDIsNDQgKzI0NjYsMjQgQEAgcGdfc3RyeGZybV9wcmVmaXhfZW5hYmxlZChw Z19sb2NhbGVfdCBsb2NhbGUpCiAvKgogICogcGdfc3RyeGZybV9wcmVmaXgKICAqCi0gKiBUcmFu c2Zvcm1zICdzcmMnIHRvIGEgYnl0ZSBzZXF1ZW5jZSBzdG9yZWQgaW4gJ2Rlc3QnIHN1Y2ggdGhh dCBvcmRpbmFyeQotICogbWVtY21wKCkgb24gdGhlIGJ5dGUgc2VxdWVuY2UgaXMgZXF1aXZhbGVu dCB0byBwZ19zdHJjb2xsKCkgb24KLSAqIHVudHJhbnNmb3JtZWQgc3RyaW5ncy4gVGhlIHJlc3Vs dCBpcyBub3QgbnVsLXRlcm1pbmF0ZWQuCi0gKgotICogVGhlIHByb3ZpZGVkICdzcmMnIG11c3Qg YmUgbnVsLXRlcm1pbmF0ZWQuCi0gKgotICogTm90IGFsbCBwcm92aWRlcnMgc3VwcG9ydCBwZ19z dHJ4ZnJtX3ByZWZpeCgpIHNhZmVseS4gVGhlIGNhbGxlciBzaG91bGQKLSAqIGNoZWNrIHBnX3N0 cnhmcm1fcHJlZml4X2VuYWJsZWQoKSBmaXJzdCwgb3RoZXJ3aXNlIHRoaXMgZnVuY3Rpb24gbWF5 IHJldHVybgotICogd3JvbmcgcmVzdWx0cyBvciBhbiBlcnJvci4KLSAqCi0gKiBJZiBkZXN0c2l6 ZSBpcyBub3QgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIHJlc3VsdGluZyBieXRlIHNlcXVlbmNl LCBzdG9yZXMKLSAqIG9ubHkgdGhlIGZpcnN0IGRlc3RzaXplIGJ5dGVzIGluICdkZXN0Jy4gUmV0 dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gKiBhY3R1YWxseSBjb3BpZWQgdG8gJ2Rlc3QnLgor ICogTGlrZSBwZ19zdHJueGZybV9wcmVmaXggZm9yIGEgTlVMLXRlcm1pbmF0ZWQgaW5wdXQgc3Ry aW5nLgogICovCiBzaXplX3QKIHBnX3N0cnhmcm1fcHJlZml4KGNoYXIgKmRlc3QsIGNvbnN0IGNo YXIgKnNyYywgc2l6ZV90IGRlc3RzaXplLAogCQkJCSAgcGdfbG9jYWxlX3QgbG9jYWxlKQogewot CXNpemVfdAkJcmVzdWx0ID0gMDsJCS8qIGtlZXAgY29tcGlsZXIgcXVpZXQgKi8KLQotI2lmZGVm IFVTRV9JQ1UKLQlpZiAobG9jYWxlLT5wcm92aWRlciA9PSBDT0xMUFJPVklERVJfSUNVKQotCQly ZXN1bHQgPSBwZ19zdHJueGZybV9wcmVmaXhfaWN1KGRlc3QsIHNyYywgLTEsIGRlc3RzaXplLCBs b2NhbGUpOwotCWVsc2UKLSNlbmRpZgotCQlQR0xPQ0FMRV9TVVBQT1JUX0VSUk9SKGxvY2FsZS0+ cHJvdmlkZXIpOwotCi0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gcGdfc3Rybnhmcm1fcHJlZml4 KGRlc3QsIGRlc3RzaXplLCBzcmMsIC0xLCBsb2NhbGUpOwogfQogCiAvKgogICogcGdfc3Rybnhm cm1fcHJlZml4CiAgKgogICogVHJhbnNmb3JtcyAnc3JjJyB0byBhIGJ5dGUgc2VxdWVuY2Ugc3Rv cmVkIGluICdkZXN0JyBzdWNoIHRoYXQgb3JkaW5hcnkKLSAqIG1lbWNtcCgpIG9uIHRoZSBieXRl IHNlcXVlbmNlIGlzIGVxdWl2YWxlbnQgdG8gcGdfc3RyY29sbCgpIG9uCisgKiBtZW1jbXAoKSBv biB0aGUgYnl0ZSBzZXF1ZW5jZSBpcyBlcXVpdmFsZW50IHRvIHBnX3N0cm5jb2xsKCkgb24KICAq IHVudHJhbnNmb3JtZWQgc3RyaW5ncy4gVGhlIHJlc3VsdCBpcyBub3QgbnVsLXRlcm1pbmF0ZWQu CiAgKgotICogVGhlIHByb3ZpZGVkICdzcmMnIG11c3QgYmUgbnVsLXRlcm1pbmF0ZWQuCisgKiBU aGUgaW5wdXQgc3RyaW5nIG11c3QgYmUgZW5jb2RlZCBpbiB0aGUgZGF0YWJhc2UgZW5jb2Rpbmcu IElmIHRoZSBpbnB1dAorICogc3RyaW5nIGlzIE5VTC10ZXJtaW5hdGVkLCBpdHMgbGVuZ3RoIG1h eSBiZSBzcGVjaWZpZWQgYXMgLTEuCiAgKgogICogTm90IGFsbCBwcm92aWRlcnMgc3VwcG9ydCBw Z19zdHJueGZybV9wcmVmaXgoKSBzYWZlbHkuIFRoZSBjYWxsZXIgc2hvdWxkCiAgKiBjaGVjayBw Z19zdHJ4ZnJtX3ByZWZpeF9lbmFibGVkKCkgZmlyc3QsIG90aGVyd2lzZSB0aGlzIGZ1bmN0aW9u IG1heSByZXR1cm4KQEAgLTI1NDgsMjAgKzI0OTIsMTYgQEAgcGdfc3RyeGZybV9wcmVmaXgoY2hh ciAqZGVzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3QgZGVzdHNpemUsCiAgKiBJZiBkZXN0c2l6 ZSBpcyBub3QgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIHJlc3VsdGluZyBieXRlIHNlcXVlbmNl LCBzdG9yZXMKICAqIG9ubHkgdGhlIGZpcnN0IGRlc3RzaXplIGJ5dGVzIGluICdkZXN0Jy4gUmV0 dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzCiAgKiBhY3R1YWxseSBjb3BpZWQgdG8gJ2Rlc3QnLgot ICoKLSAqIFRoaXMgZnVuY3Rpb24gbWF5IG5lZWQgdG8gbnVsLXRlcm1pbmF0ZSB0aGUgYXJndW1l bnQgZm9yIGxpYmMgZnVuY3Rpb25zOwotICogc28gaWYgdGhlIGNhbGxlciBhbHJlYWR5IGhhcyBh IG51bC10ZXJtaW5hdGVkIHN0cmluZywgaXQgc2hvdWxkIGNhbGwKLSAqIHBnX3N0cnhmcm1fcHJl Zml4KCkgaW5zdGVhZC4KICAqLwogc2l6ZV90CiBwZ19zdHJueGZybV9wcmVmaXgoY2hhciAqZGVz dCwgc2l6ZV90IGRlc3RzaXplLCBjb25zdCBjaGFyICpzcmMsCi0JCQkJICAgc2l6ZV90IHNyY2xl biwgcGdfbG9jYWxlX3QgbG9jYWxlKQorCQkJCSAgIHNzaXplX3Qgc3JjbGVuLCBwZ19sb2NhbGVf dCBsb2NhbGUpCiB7CiAJc2l6ZV90CQlyZXN1bHQgPSAwOwkJLyoga2VlcCBjb21waWxlciBxdWll dCAqLwogCiAjaWZkZWYgVVNFX0lDVQogCWlmIChsb2NhbGUtPnByb3ZpZGVyID09IENPTExQUk9W SURFUl9JQ1UpCi0JCXJlc3VsdCA9IHBnX3N0cm54ZnJtX3ByZWZpeF9pY3UoZGVzdCwgc3JjLCAt MSwgZGVzdHNpemUsIGxvY2FsZSk7CisJCXJlc3VsdCA9IHN0cm54ZnJtX3ByZWZpeF9pY3UoZGVz dCwgc3JjLCAtMSwgZGVzdHNpemUsIGxvY2FsZSk7CiAJZWxzZQogI2VuZGlmCiAJCVBHTE9DQUxF X1NVUFBPUlRfRVJST1IobG9jYWxlLT5wcm92aWRlcik7CkBAIC0yNzQ0LDYgKzI2ODQsOCBAQCBp bml0X2ljdV9jb252ZXJ0ZXIodm9pZCkKIAogLyoKICAqIEZpbmQgbGVuZ3RoLCBpbiBVQ2hhcnMs IG9mIGdpdmVuIHN0cmluZyBpZiBjb252ZXJ0ZWQgdG8gVUNoYXIgc3RyaW5nLgorICoKKyAqIEEg bGVuZ3RoIG9mIC0xIGluZGljYXRlcyB0aGF0IHRoZSBpbnB1dCBzdHJpbmcgaXMgTlVMLXRlcm1p bmF0ZWQuCiAgKi8KIHN0YXRpYyBzaXplX3QKIHVjaGFyX2xlbmd0aChVQ29udmVydGVyICpjb252 ZXJ0ZXIsIGNvbnN0IGNoYXIgKnN0ciwgaW50MzJfdCBsZW4pCkBAIC0yNzYxLDYgKzI3MDMsOCBA QCB1Y2hhcl9sZW5ndGgoVUNvbnZlcnRlciAqY29udmVydGVyLCBjb25zdCBjaGFyICpzdHIsIGlu dDMyX3QgbGVuKQogLyoKICAqIENvbnZlcnQgdGhlIGdpdmVuIHNvdXJjZSBzdHJpbmcgaW50byBh IFVDaGFyIHN0cmluZywgc3RvcmVkIGluIGRlc3QsIGFuZAogICogcmV0dXJuIHRoZSBsZW5ndGgg KGluIFVDaGFycykuCisgKgorICogQSBzcmNsZW4gb2YgLTEgaW5kaWNhdGVzIHRoYXQgdGhlIGlu cHV0IHN0cmluZyBpcyBOVUwtdGVybWluYXRlZC4KICAqLwogc3RhdGljIGludDMyX3QKIHVjaGFy X2NvbnZlcnQoVUNvbnZlcnRlciAqY29udmVydGVyLCBVQ2hhciAqZGVzdCwgaW50MzJfdCBkZXN0 bGVuLApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvdXRpbHMvcGdfbG9jYWxlLmggYi9zcmMvaW5j bHVkZS91dGlscy9wZ19sb2NhbGUuaAppbmRleCBjMmQ5NTQxMWUwYS4uM2I0NDNkZjgwMTQgMTAw NjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3V0aWxzL3BnX2xvY2FsZS5oCisrKyBiL3NyYy9pbmNsdWRl L3V0aWxzL3BnX2xvY2FsZS5oCkBAIC0xMDksMTggKzEwOSwxOCBAQCBleHRlcm4gcGdfbG9jYWxl X3QgcGdfbmV3bG9jYWxlX2Zyb21fY29sbGF0aW9uKE9pZCBjb2xsaWQpOwogCiBleHRlcm4gY2hh ciAqZ2V0X2NvbGxhdGlvbl9hY3R1YWxfdmVyc2lvbihjaGFyIGNvbGxwcm92aWRlciwgY29uc3Qg Y2hhciAqY29sbGNvbGxhdGUpOwogZXh0ZXJuIGludAlwZ19zdHJjb2xsKGNvbnN0IGNoYXIgKmFy ZzEsIGNvbnN0IGNoYXIgKmFyZzIsIHBnX2xvY2FsZV90IGxvY2FsZSk7Ci1leHRlcm4gaW50CXBn X3N0cm5jb2xsKGNvbnN0IGNoYXIgKmFyZzEsIHNpemVfdCBsZW4xLAotCQkJCQkJY29uc3QgY2hh ciAqYXJnMiwgc2l6ZV90IGxlbjIsIHBnX2xvY2FsZV90IGxvY2FsZSk7CitleHRlcm4gaW50CXBn X3N0cm5jb2xsKGNvbnN0IGNoYXIgKmFyZzEsIHNzaXplX3QgbGVuMSwKKwkJCQkJCWNvbnN0IGNo YXIgKmFyZzIsIHNzaXplX3QgbGVuMiwgcGdfbG9jYWxlX3QgbG9jYWxlKTsKIGV4dGVybiBib29s IHBnX3N0cnhmcm1fZW5hYmxlZChwZ19sb2NhbGVfdCBsb2NhbGUpOwogZXh0ZXJuIHNpemVfdCBw Z19zdHJ4ZnJtKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IGRlc3RzaXplLAog CQkJCQkJIHBnX2xvY2FsZV90IGxvY2FsZSk7CiBleHRlcm4gc2l6ZV90IHBnX3N0cm54ZnJtKGNo YXIgKmRlc3QsIHNpemVfdCBkZXN0c2l6ZSwgY29uc3QgY2hhciAqc3JjLAotCQkJCQkJICBzaXpl X3Qgc3JjbGVuLCBwZ19sb2NhbGVfdCBsb2NhbGUpOworCQkJCQkJICBzc2l6ZV90IHNyY2xlbiwg cGdfbG9jYWxlX3QgbG9jYWxlKTsKIGV4dGVybiBib29sIHBnX3N0cnhmcm1fcHJlZml4X2VuYWJs ZWQocGdfbG9jYWxlX3QgbG9jYWxlKTsKIGV4dGVybiBzaXplX3QgcGdfc3RyeGZybV9wcmVmaXgo Y2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3QgZGVzdHNpemUsCiAJCQkJCQkJCXBn X2xvY2FsZV90IGxvY2FsZSk7CiBleHRlcm4gc2l6ZV90IHBnX3N0cm54ZnJtX3ByZWZpeChjaGFy ICpkZXN0LCBzaXplX3QgZGVzdHNpemUsIGNvbnN0IGNoYXIgKnNyYywKLQkJCQkJCQkJIHNpemVf dCBzcmNsZW4sIHBnX2xvY2FsZV90IGxvY2FsZSk7CisJCQkJCQkJCSBzc2l6ZV90IHNyY2xlbiwg cGdfbG9jYWxlX3QgbG9jYWxlKTsKIAogZXh0ZXJuIGludAlidWlsdGluX2xvY2FsZV9lbmNvZGlu Zyhjb25zdCBjaGFyICpsb2NhbGUpOwogZXh0ZXJuIGNvbnN0IGNoYXIgKmJ1aWx0aW5fdmFsaWRh dGVfbG9jYWxlKGludCBlbmNvZGluZywgY29uc3QgY2hhciAqbG9jYWxlKTsKLS0gCjIuMzQuMQoK --=-reTqxxA0+F50OXMUZ9aK Content-Disposition: attachment; filename="v4-0005-invalidation.patch" Content-Type: text/x-patch; name="v4-0005-invalidation.patch"; charset="UTF-8" Content-Transfer-Encoding: base64 RnJvbSAyZjUxMjQ3NjE1YTM2ZGMyNTdiNzAwYzI4MzJmM2Q0YWEzMmZjZTY0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKZWZmIERhdmlzIDxqZWZmQGotZGF2aXMuY29tPgpEYXRlOiBX ZWQsIDE4IFNlcCAyMDI0IDE3OjQ5OjU3IC0wNzAwClN1YmplY3Q6IFtQQVRDSCB2NCA1LzddIGlu dmFsaWRhdGlvbgoKLS0tCiBzcmMvYmFja2VuZC91dGlscy9hZHQvcGdfbG9jYWxlLmMgfCA0MSAr KysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgMzMgaW5zZXJ0 aW9ucygrKSwgOCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9h ZHQvcGdfbG9jYWxlLmMgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvcGdfbG9jYWxlLmMKaW5kZXgg OWQxZDcxZjE1NjEuLmM4OWFjM2I5ZTAxIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9h ZHQvcGdfbG9jYWxlLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3BnX2xvY2FsZS5jCkBA IC02Myw2ICs2Myw3IEBACiAjaW5jbHVkZSAidXRpbHMvYnVpbHRpbnMuaCIKICNpbmNsdWRlICJ1 dGlscy9mb3JtYXR0aW5nLmgiCiAjaW5jbHVkZSAidXRpbHMvZ3VjX2hvb2tzLmgiCisjaW5jbHVk ZSAidXRpbHMvaW52YWwuaCIKICNpbmNsdWRlICJ1dGlscy9sc3lzY2FjaGUuaCIKICNpbmNsdWRl ICJ1dGlscy9tZW11dGlscy5oIgogI2luY2x1ZGUgInV0aWxzL3BnX2xvY2FsZS5oIgpAQCAtMTY5 NSw2ICsxNjk2LDM0IEBAIGNyZWF0ZV9wZ19sb2NhbGUoTWVtb3J5Q29udGV4dCBjb250ZXh0LCBS ZXNvdXJjZU93bmVyIG93bmVyLCBPaWQgY29sbGlkKQogCXJldHVybiByZXN1bHQ7CiB9CiAKK3N0 YXRpYyB2b2lkCitDb2xsYXRpb25DYWNoZUludmFsaWRhdGUoRGF0dW0gYXJnLCBpbnQgY2FjaGVp ZCwgdWludDMyIGhhc2h2YWx1ZSkKK3sKKwlsYXN0X2NvbGxhdGlvbl9jYWNoZV9vaWQgPSBJbnZh bGlkT2lkOworCisJaWYgKENvbGxhdGlvbkNhY2hlID09IE5VTEwpCisJCXJldHVybjsKKworCVJl c291cmNlT3duZXJSZWxlYXNlKENvbGxhdGlvbkNhY2hlT3duZXIsCisJCQkJCQkgUkVTT1VSQ0Vf UkVMRUFTRV9CRUZPUkVfTE9DS1MsCisJCQkJCQkgZmFsc2UsIHRydWUpOworCVJlc291cmNlT3du ZXJSZWxlYXNlKENvbGxhdGlvbkNhY2hlT3duZXIsCisJCQkJCQkgUkVTT1VSQ0VfUkVMRUFTRV9M T0NLUywKKwkJCQkJCSBmYWxzZSwgdHJ1ZSk7CisJUmVzb3VyY2VPd25lclJlbGVhc2UoQ29sbGF0 aW9uQ2FjaGVPd25lciwKKwkJCQkJCSBSRVNPVVJDRV9SRUxFQVNFX0FGVEVSX0xPQ0tTLAorCQkJ CQkJIGZhbHNlLCB0cnVlKTsKKwlSZXNvdXJjZU93bmVyRGVsZXRlKENvbGxhdGlvbkNhY2hlT3du ZXIpOworCUNvbGxhdGlvbkNhY2hlT3duZXIgPSBSZXNvdXJjZU93bmVyQ3JlYXRlKE5VTEwsICJj b2xsYXRpb24gY2FjaGUiKTsKKworCU1lbW9yeUNvbnRleHRSZXNldChDb2xsYXRpb25DYWNoZUNv bnRleHQpOworCisJLyogZnJlZSBhbGwgbWVtb3J5IGFuZCByZXNldCBoYXNoIHRhYmxlICovCisJ Q29sbGF0aW9uQ2FjaGUgPSBjb2xsYXRpb25fY2FjaGVfY3JlYXRlKENvbGxhdGlvbkNhY2hlQ29u dGV4dCwKKwkJCQkJCQkJCQkJMTYsIE5VTEwpOworfQorCisKIC8qCiAgKiBDcmVhdGUgb3IgcmV0 cmlldmUgYSBwZ19sb2NhbGVfdCBmb3IgdGhlIGdpdmVuIGNvbGxhdGlvbiBPSUQuICBSZXN1bHRz IGFyZQogICogY2FjaGVkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGJhY2tlbmQuCkBAIC0xNzE0 LDE0ICsxNzQzLDcgQEAgcGdfbmV3bG9jYWxlX2Zyb21fY29sbGF0aW9uKE9pZCBjb2xsaWQpCiAJ aWYgKGxhc3RfY29sbGF0aW9uX2NhY2hlX29pZCA9PSBjb2xsaWQpCiAJCXJldHVybiBsYXN0X2Nv bGxhdGlvbl9jYWNoZV9sb2NhbGU7CiAKLQkvKgotCSAqIENhY2hlIG1lY2hhbmlzbSBmb3IgY29s bGF0aW9uIGluZm9ybWF0aW9uLgotCSAqCi0JICogTm90ZSB0aGF0IHdlIGN1cnJlbnRseSBsYWNr IGFueSB3YXkgdG8gZmx1c2ggdGhlIGNhY2hlLiAgU2luY2Ugd2UgZG9uJ3QKLQkgKiBzdXBwb3J0 IEFMVEVSIENPTExBVElPTiwgdGhpcyBpcyBPSy4gIFRoZSB3b3JzdCBjYXNlIGlzIHRoYXQgc29t ZW9uZQotCSAqIGRyb3BzIGEgY29sbGF0aW9uLCBhbmQgYSB1c2VsZXNzIGNhY2hlIGVudHJ5IGhh bmdzIGFyb3VuZCBpbiBleGlzdGluZwotCSAqIGJhY2tlbmRzLgotCSAqLworCS8qIGNhY2hlIG1l Y2hhbmlzbSBmb3IgY29sbGF0aW9uIGluZm9ybWF0aW9uICovCiAJaWYgKENvbGxhdGlvbkNhY2hl ID09IE5VTEwpCiAJewogCQlDb2xsYXRpb25DYWNoZU93bmVyID0gUmVzb3VyY2VPd25lckNyZWF0 ZShOVUxMLCAiY29sbGF0aW9uIGNhY2hlIik7CkBAIC0xNzMwLDYgKzE3NTIsOSBAQCBwZ19uZXds b2NhbGVfZnJvbV9jb2xsYXRpb24oT2lkIGNvbGxpZCkKIAkJCQkJCQkJCQkJCQkgIEFMTE9DU0VU X0RFRkFVTFRfU0laRVMpOwogCQlDb2xsYXRpb25DYWNoZSA9IGNvbGxhdGlvbl9jYWNoZV9jcmVh dGUoQ29sbGF0aW9uQ2FjaGVDb250ZXh0LAogCQkJCQkJCQkJCQkJMTYsIE5VTEwpOworCQlDYWNo ZVJlZ2lzdGVyU3lzY2FjaGVDYWxsYmFjayhDT0xMT0lELAorCQkJCQkJCQkJICBDb2xsYXRpb25D YWNoZUludmFsaWRhdGUsCisJCQkJCQkJCQkgIChEYXR1bSkgMCk7CiAJfQogCiAJY2FjaGVfZW50 cnkgPSBjb2xsYXRpb25fY2FjaGVfaW5zZXJ0KENvbGxhdGlvbkNhY2hlLCBjb2xsaWQsICZmb3Vu ZCk7Ci0tIAoyLjM0LjEKCg== --=-reTqxxA0+F50OXMUZ9aK Content-Disposition: attachment; filename="v4-0004-resource-owners.patch" Content-Type: text/x-patch; name="v4-0004-resource-owners.patch"; charset="UTF-8" Content-Transfer-Encoding: base64 RnJvbSA1YWUzYjFiZTY0ODk2MTdhMTYzOTE0MTc0OWMzMWQyZjQ0MTlhNjc2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKZWZmIERhdmlzIDxqZWZmQGotZGF2aXMuY29tPgpEYXRlOiBX ZWQsIDE4IFNlcCAyMDI0IDE2OjU1OjQyIC0wNzAwClN1YmplY3Q6IFtQQVRDSCB2NCA0LzddIHJl c291cmNlIG93bmVycwoKLS0tCiBzcmMvYmFja2VuZC91dGlscy9hZHQvcGdfbG9jYWxlLmMgfCA3 NCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKystCiAxIGZpbGUgY2hhbmdlZCwgNzIgaW5z ZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGls cy9hZHQvcGdfbG9jYWxlLmMgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvcGdfbG9jYWxlLmMKaW5k ZXggZDNkOWMzOTIwZTYuLjlkMWQ3MWYxNTYxIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGls cy9hZHQvcGdfbG9jYWxlLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3BnX2xvY2FsZS5j CkBAIC02Niw2ICs2Niw3IEBACiAjaW5jbHVkZSAidXRpbHMvbHN5c2NhY2hlLmgiCiAjaW5jbHVk ZSAidXRpbHMvbWVtdXRpbHMuaCIKICNpbmNsdWRlICJ1dGlscy9wZ19sb2NhbGUuaCIKKyNpbmNs dWRlICJ1dGlscy9yZXNvd25lci5oIgogI2luY2x1ZGUgInV0aWxzL3N5c2NhY2hlLmgiCiAKICNp ZmRlZiBVU0VfSUNVCkBAIC0xNDgsNiArMTQ5LDEyIEBAIHR5cGVkZWYgc3RydWN0CiAjZGVmaW5l IFNIX0RFRklORQogI2luY2x1ZGUgImxpYi9zaW1wbGVoYXNoLmgiCiAKKy8qCisgKiBDb2xsYXRv ciBvYmplY3RzIChVQ29sbGF0b3IgZm9yIElDVSBvciBsb2NhbGVfdCBmb3IgbGliYykgYXJlIGFs bG9jYXRlZCBpbgorICogYW4gZXh0ZXJuYWwgbGlicmFyeSwgc28gdHJhY2sgdGhlbSB1c2luZyBh IHJlc291cmNlIG93bmVyLgorICovCitzdGF0aWMgUmVzb3VyY2VPd25lciBDb2xsYXRpb25DYWNo ZU93bmVyID0gTlVMTDsKKwogc3RhdGljIE1lbW9yeUNvbnRleHQgQ29sbGF0aW9uQ2FjaGVDb250 ZXh0ID0gTlVMTDsKIHN0YXRpYyBjb2xsYXRpb25fY2FjaGVfaGFzaCAqQ29sbGF0aW9uQ2FjaGUg PSBOVUxMOwogCkBAIC0xNzksOCArMTg2LDM1IEBAIHN0YXRpYyBpbnQzMl90IHVjaGFyX2NvbnZl cnQoVUNvbnZlcnRlciAqY29udmVydGVyLAogCQkJCQkJCSBjb25zdCBjaGFyICpzcmMsIGludDMy X3Qgc3JjbGVuKTsKIHN0YXRpYyB2b2lkIGljdV9zZXRfY29sbGF0aW9uX2F0dHJpYnV0ZXMoVUNv bGxhdG9yICpjb2xsYXRvciwgY29uc3QgY2hhciAqbG9jLAogCQkJCQkJCQkJCSBVRXJyb3JDb2Rl ICpzdGF0dXMpOworCitzdGF0aWMgdm9pZCBSZXNvdXJjZU93bmVyUmVtZW1iZXJVQ29sbGF0b3Io UmVzb3VyY2VPd25lciBvd25lciwKKwkJCQkJCQkJCQkgICBVQ29sbGF0b3IgKmNvbGxhdG9yKTsK K3N0YXRpYyB2b2lkIFJlc093bmVyUmVsZWFzZVVDb2xsYXRvcihEYXR1bSB2YWwpOworCitzdGF0 aWMgY29uc3QgUmVzb3VyY2VPd25lckRlc2MgVUNvbGxhdG9yUmVzb3VyY2VLaW5kID0KK3sKKwku bmFtZSA9ICJVQ29sbGF0b3IgcmVmZXJlbmNlIiwKKwkucmVsZWFzZV9waGFzZSA9IFJFU09VUkNF X1JFTEVBU0VfQUZURVJfTE9DS1MsCisJLnJlbGVhc2VfcHJpb3JpdHkgPSBSRUxFQVNFX1BSSU9f TEFTVCwKKwkuUmVsZWFzZVJlc291cmNlID0gUmVzT3duZXJSZWxlYXNlVUNvbGxhdG9yLAorCS5E ZWJ1Z1ByaW50ID0gTlVMTCAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgZGVmYXVsdCBtZXNz YWdlIGlzIGZpbmUgKi8KK307CiAjZW5kaWYKIAorc3RhdGljIHZvaWQgUmVzb3VyY2VPd25lclJl bWVtYmVyTG9jYWxlVChSZXNvdXJjZU93bmVyIG93bmVyLAorCQkJCQkJCQkJCSBsb2NhbGVfdCBs b2NhbGUpOworc3RhdGljIHZvaWQgUmVzT3duZXJSZWxlYXNlTG9jYWxlVChEYXR1bSB2YWwpOwor CitzdGF0aWMgY29uc3QgUmVzb3VyY2VPd25lckRlc2MgTG9jYWxlVFJlc291cmNlS2luZCA9Cit7 CisJLm5hbWUgPSAibG9jYWxlX3QgcmVmZXJlbmNlIiwKKwkucmVsZWFzZV9waGFzZSA9IFJFU09V UkNFX1JFTEVBU0VfQUZURVJfTE9DS1MsCisJLnJlbGVhc2VfcHJpb3JpdHkgPSBSRUxFQVNFX1BS SU9fTEFTVCwKKwkuUmVsZWFzZVJlc291cmNlID0gUmVzT3duZXJSZWxlYXNlTG9jYWxlVCwKKwku RGVidWdQcmludCA9IE5VTEwgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIGRlZmF1bHQgbWVz c2FnZSBpcyBmaW5lICovCit9OworCisKIC8qCiAgKiBQT1NJWCBkb2Vzbid0IGRlZmluZSBfbC12 YXJpYW50cyBvZiB0aGVzZSBmdW5jdGlvbnMsIGJ1dCBzZXZlcmFsIHN5c3RlbXMKICAqIGhhdmUg dGhlbS4gIFdlIHByb3ZpZGUgb3VyIG93biByZXBsYWNlbWVudHMgaGVyZS4KQEAgLTEyNTcsNiAr MTI5MSwyMCBAQCByZXBvcnRfbmV3bG9jYWxlX2ZhaWx1cmUoY29uc3QgY2hhciAqbG9jYWxlbmFt ZSkKIAkJCQkJCWxvY2FsZW5hbWUpIDogMCkpKTsKIH0KIAorc3RhdGljIHZvaWQKK1Jlc291cmNl T3duZXJSZW1lbWJlckxvY2FsZVQoUmVzb3VyY2VPd25lciBvd25lciwgbG9jYWxlX3QgbG9jYWxl KQoreworCVJlc291cmNlT3duZXJSZW1lbWJlcihvd25lciwgUG9pbnRlckdldERhdHVtKGxvY2Fs ZSksCisJCQkJCQkgICZMb2NhbGVUUmVzb3VyY2VLaW5kKTsKK30KKworc3RhdGljIHZvaWQKK1Jl c093bmVyUmVsZWFzZUxvY2FsZVQoRGF0dW0gdmFsKQoreworCWxvY2FsZV90IGxvY2FsZSA9IChs b2NhbGVfdCkgRGF0dW1HZXRQb2ludGVyKHZhbCk7CisJZnJlZWxvY2FsZShsb2NhbGUpOworfQor CiAvKgogICogQ3JlYXRlIGEgbG9jYWxlX3Qgd2l0aCB0aGUgZ2l2ZW4gY29sbGF0aW9uIGFuZCBj dHlwZS4KICAqCkBAIC0xMzM1LDYgKzEzODMsMjAgQEAgbWFrZV9saWJjX2NvbGxhdG9yKGNvbnN0 IGNoYXIgKmNvbGxhdGUsIGNvbnN0IGNoYXIgKmN0eXBlKQogICogRW5zdXJlIHRoYXQgbm8gcGF0 aCBsZWFrcyBhIFVDb2xsYXRvci4KICAqLwogI2lmZGVmIFVTRV9JQ1UKK3N0YXRpYyB2b2lkCitS ZXNvdXJjZU93bmVyUmVtZW1iZXJVQ29sbGF0b3IoUmVzb3VyY2VPd25lciBvd25lciwgVUNvbGxh dG9yICpjb2xsYXRvcikKK3sKKwlSZXNvdXJjZU93bmVyUmVtZW1iZXIob3duZXIsIFBvaW50ZXJH ZXREYXR1bShjb2xsYXRvciksCisJCQkJCQkgICZVQ29sbGF0b3JSZXNvdXJjZUtpbmQpOworfQor CitzdGF0aWMgdm9pZAorUmVzT3duZXJSZWxlYXNlVUNvbGxhdG9yKERhdHVtIHZhbCkKK3sKKwlV Q29sbGF0b3IgKmNvbGxhdG9yID0gKFVDb2xsYXRvciAqKSBEYXR1bUdldFBvaW50ZXIodmFsKTsK Kwl1Y29sX2Nsb3NlKGNvbGxhdG9yKTsKK30KKwogc3RhdGljIFVDb2xsYXRvciAqCiBtYWtlX2lj dV9jb2xsYXRvcihjb25zdCBjaGFyICppY3Vsb2NzdHIsIGNvbnN0IGNoYXIgKmljdXJ1bGVzKQog ewpAQCAtMTQ5NSw3ICsxNTU3LDcgQEAgaW5pdF9kYXRhYmFzZV9jb2xsYXRpb24odm9pZCkKICAq IGFsbG9jYXRpbmcgbWVtb3J5LgogICovCiBzdGF0aWMgcGdfbG9jYWxlX3QKLWNyZWF0ZV9wZ19s b2NhbGUoTWVtb3J5Q29udGV4dCBjb250ZXh0LCBPaWQgY29sbGlkKQorY3JlYXRlX3BnX2xvY2Fs ZShNZW1vcnlDb250ZXh0IGNvbnRleHQsIFJlc291cmNlT3duZXIgb3duZXIsIE9pZCBjb2xsaWQp CiB7CiAJLyogV2UgaGF2ZW4ndCBjb21wdXRlZCB0aGlzIHlldCBpbiB0aGlzIHNlc3Npb24sIHNv IGRvIGl0ICovCiAJSGVhcFR1cGxlCXRwOwpAQCAtMTU4Miw3ICsxNjQ0LDEwIEBAIGNyZWF0ZV9w Z19sb2NhbGUoTWVtb3J5Q29udGV4dCBjb250ZXh0LCBPaWQgY29sbGlkKQogCQlkYXR1bSA9IFN5 c0NhY2hlR2V0QXR0ck5vdE51bGwoQ09MTE9JRCwgdHAsIEFudW1fcGdfY29sbGF0aW9uX2NvbGxj dHlwZSk7CiAJCWNvbGxjdHlwZSA9IFRleHREYXR1bUdldENTdHJpbmcoZGF0dW0pOwogCisJCVJl c291cmNlT3duZXJFbmxhcmdlKG93bmVyKTsKIAkJbG9jYWxlID0gbWFrZV9saWJjX2NvbGxhdG9y KGNvbGxjb2xsYXRlLCBjb2xsY3R5cGUpOworCQlpZiAobG9jYWxlKQorCQkJUmVzb3VyY2VPd25l clJlbWVtYmVyTG9jYWxlVChvd25lciwgbG9jYWxlKTsKIAogCQlyZXN1bHQgPSBNZW1vcnlDb250 ZXh0QWxsb2NaZXJvKGNvbnRleHQsCiAJCQkJCQkJCQkJc2l6ZW9mKHN0cnVjdCBwZ19sb2NhbGVf c3RydWN0KSk7CkBAIC0xNjEwLDcgKzE2NzUsOSBAQCBjcmVhdGVfcGdfbG9jYWxlKE1lbW9yeUNv bnRleHQgY29udGV4dCwgT2lkIGNvbGxpZCkKIAkJZWxzZQogCQkJaWN1cnVsZXMgPSBOVUxMOwog CisJCVJlc291cmNlT3duZXJFbmxhcmdlKG93bmVyKTsKIAkJY29sbGF0b3IgPSBtYWtlX2ljdV9j b2xsYXRvcihpY3Vsb2NzdHIsIGljdXJ1bGVzKTsKKwkJUmVzb3VyY2VPd25lclJlbWVtYmVyVUNv bGxhdG9yKG93bmVyLCBjb2xsYXRvcik7CiAKIAkJcmVzdWx0ID0gTWVtb3J5Q29udGV4dEFsbG9j WmVybyhjb250ZXh0LAogCQkJCQkJCQkJCXNpemVvZihzdHJ1Y3QgcGdfbG9jYWxlX3N0cnVjdCkp OwpAQCAtMTY1Nyw2ICsxNzI0LDcgQEAgcGdfbmV3bG9jYWxlX2Zyb21fY29sbGF0aW9uKE9pZCBj b2xsaWQpCiAJICovCiAJaWYgKENvbGxhdGlvbkNhY2hlID09IE5VTEwpCiAJeworCQlDb2xsYXRp b25DYWNoZU93bmVyID0gUmVzb3VyY2VPd25lckNyZWF0ZShOVUxMLCAiY29sbGF0aW9uIGNhY2hl Iik7CiAJCUNvbGxhdGlvbkNhY2hlQ29udGV4dCA9IEFsbG9jU2V0Q29udGV4dENyZWF0ZShUb3BN ZW1vcnlDb250ZXh0LAogCQkJCQkJCQkJCQkJCSAgImNvbGxhdGlvbiBjYWNoZSIsCiAJCQkJCQkJ CQkJCQkJICBBTExPQ1NFVF9ERUZBVUxUX1NJWkVTKTsKQEAgLTE2NzUsNyArMTc0Myw5IEBAIHBn X25ld2xvY2FsZV9mcm9tX2NvbGxhdGlvbihPaWQgY29sbGlkKQogCX0KIAogCWlmIChjYWNoZV9l bnRyeS0+bG9jYWxlID09IDApCi0JCWNhY2hlX2VudHJ5LT5sb2NhbGUgPSBjcmVhdGVfcGdfbG9j YWxlKENvbGxhdGlvbkNhY2hlQ29udGV4dCwgY29sbGlkKTsKKwkJY2FjaGVfZW50cnktPmxvY2Fs ZSA9IGNyZWF0ZV9wZ19sb2NhbGUoQ29sbGF0aW9uQ2FjaGVDb250ZXh0LAorCQkJCQkJCQkJCQkg ICBDb2xsYXRpb25DYWNoZU93bmVyLAorCQkJCQkJCQkJCQkgICBjb2xsaWQpOwogCiAJbGFzdF9j b2xsYXRpb25fY2FjaGVfb2lkID0gY29sbGlkOwogCWxhc3RfY29sbGF0aW9uX2NhY2hlX2xvY2Fs ZSA9IGNhY2hlX2VudHJ5LT5sb2NhbGU7Ci0tIAoyLjM0LjEKCg== --=-reTqxxA0+F50OXMUZ9aK Content-Disposition: attachment; filename="v4-0003-CollationCacheContext.patch" Content-Type: text/x-patch; name="v4-0003-CollationCacheContext.patch"; charset="UTF-8" Content-Transfer-Encoding: base64 RnJvbSBmY2EwZWZhMTg0OTcxZjk3ODBiMzU2MDM5YWEzZWQwOGE3NDQ1NTI0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKZWZmIERhdmlzIDxqZWZmQGotZGF2aXMuY29tPgpEYXRlOiBX ZWQsIDE4IFNlcCAyMDI0IDE1OjU1OjM3IC0wNzAwClN1YmplY3Q6IFtQQVRDSCB2NCAzLzddIENv bGxhdGlvbkNhY2hlQ29udGV4dAoKLS0tCiBzcmMvYmFja2VuZC91dGlscy9hZHQvcGdfbG9jYWxl LmMgfCAxNiArKysrKysrKy0tLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgOCBpbnNlcnRpb25zKCsp LCA4IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9wZ19s b2NhbGUuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9wZ19sb2NhbGUuYwppbmRleCAxZGVjMDBi NTVlZC4uZDNkOWMzOTIwZTYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9wZ19s b2NhbGUuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvcGdfbG9jYWxlLmMKQEAgLTE0OTUs NyArMTQ5NSw3IEBAIGluaXRfZGF0YWJhc2VfY29sbGF0aW9uKHZvaWQpCiAgKiBhbGxvY2F0aW5n IG1lbW9yeS4KICAqLwogc3RhdGljIHBnX2xvY2FsZV90Ci1jcmVhdGVfcGdfbG9jYWxlKE9pZCBj b2xsaWQpCitjcmVhdGVfcGdfbG9jYWxlKE1lbW9yeUNvbnRleHQgY29udGV4dCwgT2lkIGNvbGxp ZCkKIHsKIAkvKiBXZSBoYXZlbid0IGNvbXB1dGVkIHRoaXMgeWV0IGluIHRoaXMgc2Vzc2lvbiwg c28gZG8gaXQgKi8KIAlIZWFwVHVwbGUJdHA7CkBAIC0xNTYxLDE1ICsxNTYxLDE1IEBAIGNyZWF0 ZV9wZ19sb2NhbGUoT2lkIGNvbGxpZCkKIAogCQlidWlsdGluX3ZhbGlkYXRlX2xvY2FsZShHZXRE YXRhYmFzZUVuY29kaW5nKCksIGxvY3N0cik7CiAKLQkJcmVzdWx0ID0gTWVtb3J5Q29udGV4dEFs bG9jWmVybyhUb3BNZW1vcnlDb250ZXh0LAorCQlyZXN1bHQgPSBNZW1vcnlDb250ZXh0QWxsb2Na ZXJvKGNvbnRleHQsCiAJCQkJCQkJCQkJc2l6ZW9mKHN0cnVjdCBwZ19sb2NhbGVfc3RydWN0KSk7 CiAKIAkJcmVzdWx0LT5wcm92aWRlciA9IGNvbGxmb3JtLT5jb2xscHJvdmlkZXI7CiAJCXJlc3Vs dC0+ZGV0ZXJtaW5pc3RpYyA9IGNvbGxmb3JtLT5jb2xsaXNkZXRlcm1pbmlzdGljOwogCQlyZXN1 bHQtPmNvbGxhdGVfaXNfYyA9IHRydWU7CiAJCXJlc3VsdC0+Y3R5cGVfaXNfYyA9IChzdHJjbXAo bG9jc3RyLCAiQyIpID09IDApOwotCQlyZXN1bHQtPmluZm8uYnVpbHRpbi5sb2NhbGUgPSBNZW1v cnlDb250ZXh0U3RyZHVwKFRvcE1lbW9yeUNvbnRleHQsCi0JCQkJCQkJCQkJCQkJCSBsb2NzdHIp OworCQlyZXN1bHQtPmluZm8uYnVpbHRpbi5sb2NhbGUgPSBNZW1vcnlDb250ZXh0U3RyZHVwKGNv bnRleHQsCisJCQkJCQkJCQkJCQkJCSAgbG9jc3RyKTsKIAl9CiAJZWxzZSBpZiAoY29sbGZvcm0t PmNvbGxwcm92aWRlciA9PSBDT0xMUFJPVklERVJfTElCQykKIAl7CkBAIC0xNTg0LDcgKzE1ODQs NyBAQCBjcmVhdGVfcGdfbG9jYWxlKE9pZCBjb2xsaWQpCiAKIAkJbG9jYWxlID0gbWFrZV9saWJj X2NvbGxhdG9yKGNvbGxjb2xsYXRlLCBjb2xsY3R5cGUpOwogCi0JCXJlc3VsdCA9IE1lbW9yeUNv bnRleHRBbGxvY1plcm8oVG9wTWVtb3J5Q29udGV4dCwKKwkJcmVzdWx0ID0gTWVtb3J5Q29udGV4 dEFsbG9jWmVybyhjb250ZXh0LAogCQkJCQkJCQkJCXNpemVvZihzdHJ1Y3QgcGdfbG9jYWxlX3N0 cnVjdCkpOwogCiAJCXJlc3VsdC0+cHJvdmlkZXIgPSBjb2xsZm9ybS0+Y29sbHByb3ZpZGVyOwpA QCAtMTYxMiwxNCArMTYxMiwxNCBAQCBjcmVhdGVfcGdfbG9jYWxlKE9pZCBjb2xsaWQpCiAKIAkJ Y29sbGF0b3IgPSBtYWtlX2ljdV9jb2xsYXRvcihpY3Vsb2NzdHIsIGljdXJ1bGVzKTsKIAotCQly ZXN1bHQgPSBNZW1vcnlDb250ZXh0QWxsb2NaZXJvKFRvcE1lbW9yeUNvbnRleHQsCisJCXJlc3Vs dCA9IE1lbW9yeUNvbnRleHRBbGxvY1plcm8oY29udGV4dCwKIAkJCQkJCQkJCQlzaXplb2Yoc3Ry dWN0IHBnX2xvY2FsZV9zdHJ1Y3QpKTsKIAogCQlyZXN1bHQtPnByb3ZpZGVyID0gY29sbGZvcm0t PmNvbGxwcm92aWRlcjsKIAkJcmVzdWx0LT5kZXRlcm1pbmlzdGljID0gY29sbGZvcm0tPmNvbGxp c2RldGVybWluaXN0aWM7CiAJCXJlc3VsdC0+Y29sbGF0ZV9pc19jID0gZmFsc2U7CiAJCXJlc3Vs dC0+Y3R5cGVfaXNfYyA9IGZhbHNlOwotCQlyZXN1bHQtPmluZm8uaWN1LmxvY2FsZSA9IE1lbW9y eUNvbnRleHRTdHJkdXAoVG9wTWVtb3J5Q29udGV4dCwgaWN1bG9jc3RyKTsKKwkJcmVzdWx0LT5p bmZvLmljdS5sb2NhbGUgPSBNZW1vcnlDb250ZXh0U3RyZHVwKGNvbnRleHQsIGljdWxvY3N0cik7 CiAJCXJlc3VsdC0+aW5mby5pY3UudWNvbCA9IGNvbGxhdG9yOwogCX0KIApAQCAtMTY3NSw3ICsx Njc1LDcgQEAgcGdfbmV3bG9jYWxlX2Zyb21fY29sbGF0aW9uKE9pZCBjb2xsaWQpCiAJfQogCiAJ aWYgKGNhY2hlX2VudHJ5LT5sb2NhbGUgPT0gMCkKLQkJY2FjaGVfZW50cnktPmxvY2FsZSA9IGNy ZWF0ZV9wZ19sb2NhbGUoY29sbGlkKTsKKwkJY2FjaGVfZW50cnktPmxvY2FsZSA9IGNyZWF0ZV9w Z19sb2NhbGUoQ29sbGF0aW9uQ2FjaGVDb250ZXh0LCBjb2xsaWQpOwogCiAJbGFzdF9jb2xsYXRp b25fY2FjaGVfb2lkID0gY29sbGlkOwogCWxhc3RfY29sbGF0aW9uX2NhY2hlX2xvY2FsZSA9IGNh Y2hlX2VudHJ5LT5sb2NhbGU7Ci0tIAoyLjM0LjEKCg== --=-reTqxxA0+F50OXMUZ9aK Content-Disposition: attachment; filename="v4-0002-create_pg_locale.patch" Content-Type: text/x-patch; name="v4-0002-create_pg_locale.patch"; charset="UTF-8" Content-Transfer-Encoding: base64 RnJvbSBlY2NjNGE0YTgzMDY5YzZhMTQ0NjViNGE5MjM5YTRkNzU5YWFhMmE4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKZWZmIERhdmlzIDxqZWZmQGotZGF2aXMuY29tPgpEYXRlOiBX ZWQsIDE4IFNlcCAyMDI0IDE1OjUzOjU2IC0wNzAwClN1YmplY3Q6IFtQQVRDSCB2NCAyLzddIGNy ZWF0ZV9wZ19sb2NhbGUKCi0tLQogc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3BnX2xvY2FsZS5jIHwg MzEwICsrKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0tLQogMSBmaWxlIGNoYW5nZWQsIDE1NSBp bnNlcnRpb25zKCspLCAxNTUgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQv dXRpbHMvYWR0L3BnX2xvY2FsZS5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3BnX2xvY2FsZS5j CmluZGV4IDEyYmE1NzI2Zjc3Li4xZGVjMDBiNTVlZCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQv dXRpbHMvYWR0L3BnX2xvY2FsZS5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9wZ19sb2Nh bGUuYwpAQCAtMTIyNyw0NSArMTIyNyw2IEBAIElzb0xvY2FsZU5hbWUoY29uc3QgY2hhciAqd2lu bG9jbmFtZSkKICNlbmRpZgkJCQkJCQkvKiBXSU4zMiAmJiBMQ19NRVNTQUdFUyAqLwogCiAKLS8q Ci0gKiBDYWNoZSBtZWNoYW5pc20gZm9yIGNvbGxhdGlvbiBpbmZvcm1hdGlvbi4KLSAqCi0gKiBO b3RlIHRoYXQgd2UgY3VycmVudGx5IGxhY2sgYW55IHdheSB0byBmbHVzaCB0aGUgY2FjaGUuICBT aW5jZSB3ZSBkb24ndAotICogc3VwcG9ydCBBTFRFUiBDT0xMQVRJT04sIHRoaXMgaXMgT0suICBU aGUgd29yc3QgY2FzZSBpcyB0aGF0IHNvbWVvbmUKLSAqIGRyb3BzIGEgY29sbGF0aW9uLCBhbmQg YSB1c2VsZXNzIGNhY2hlIGVudHJ5IGhhbmdzIGFyb3VuZCBpbiBleGlzdGluZwotICogYmFja2Vu ZHMuCi0gKi8KLXN0YXRpYyBjb2xsYXRpb25fY2FjaGVfZW50cnkgKgotbG9va3VwX2NvbGxhdGlv bl9jYWNoZShPaWQgY29sbGF0aW9uKQotewotCWNvbGxhdGlvbl9jYWNoZV9lbnRyeSAqY2FjaGVf ZW50cnk7Ci0JYm9vbAkJZm91bmQ7Ci0KLQlBc3NlcnQoT2lkSXNWYWxpZChjb2xsYXRpb24pKTsK LQlBc3NlcnQoY29sbGF0aW9uICE9IERFRkFVTFRfQ09MTEFUSU9OX09JRCk7Ci0KLQlpZiAoQ29s bGF0aW9uQ2FjaGUgPT0gTlVMTCkKLQl7Ci0JCUNvbGxhdGlvbkNhY2hlQ29udGV4dCA9IEFsbG9j U2V0Q29udGV4dENyZWF0ZShUb3BNZW1vcnlDb250ZXh0LAotCQkJCQkJCQkJCQkJCSAgImNvbGxh dGlvbiBjYWNoZSIsCi0JCQkJCQkJCQkJCQkJICBBTExPQ1NFVF9ERUZBVUxUX1NJWkVTKTsKLQkJ Q29sbGF0aW9uQ2FjaGUgPSBjb2xsYXRpb25fY2FjaGVfY3JlYXRlKENvbGxhdGlvbkNhY2hlQ29u dGV4dCwKLQkJCQkJCQkJCQkJCTE2LCBOVUxMKTsKLQl9Ci0KLQljYWNoZV9lbnRyeSA9IGNvbGxh dGlvbl9jYWNoZV9pbnNlcnQoQ29sbGF0aW9uQ2FjaGUsIGNvbGxhdGlvbiwgJmZvdW5kKTsKLQlp ZiAoIWZvdW5kKQotCXsKLQkJLyoKLQkJICogTWFrZSBzdXJlIGNhY2hlIGVudHJ5IGlzIG1hcmtl ZCBpbnZhbGlkLCBpbiBjYXNlIHdlIGZhaWwgYmVmb3JlCi0JCSAqIHNldHRpbmcgdGhpbmdzLgot CQkgKi8KLQkJY2FjaGVfZW50cnktPmxvY2FsZSA9IDA7Ci0JfQotCi0JcmV0dXJuIGNhY2hlX2Vu dHJ5OwotfQotCiAvKiBzaW1wbGUgc3Vicm91dGluZSBmb3IgcmVwb3J0aW5nIGVycm9ycyBmcm9t IG5ld2xvY2FsZSgpICovCiBzdGF0aWMgdm9pZAogcmVwb3J0X25ld2xvY2FsZV9mYWlsdXJlKGNv bnN0IGNoYXIgKmxvY2FsZW5hbWUpCkBAIC0xNTMwLDE1MyArMTQ5MSwxOTIgQEAgaW5pdF9kYXRh YmFzZV9jb2xsYXRpb24odm9pZCkKIH0KIAogLyoKLSAqIENyZWF0ZSBhIHBnX2xvY2FsZV90IGZy b20gYSBjb2xsYXRpb24gT0lELiAgUmVzdWx0cyBhcmUgY2FjaGVkIGZvciB0aGUKLSAqIGxpZmV0 aW1lIG9mIHRoZSBiYWNrZW5kLiAgVGh1cywgZG8gbm90IGZyZWUgdGhlIHJlc3VsdCB3aXRoIGZy ZWVsb2NhbGUoKS4KLSAqCi0gKiBGb3Igc2ltcGxpY2l0eSwgd2UgYWx3YXlzIGdlbmVyYXRlIENP TExBVEUgKyBDVFlQRSBldmVuIHRob3VnaCB3ZQotICogbWlnaHQgb25seSBuZWVkIG9uZSBvZiB0 aGVtLiAgU2luY2UgdGhpcyBpcyBjYWxsZWQgb25seSBvbmNlIHBlciBzZXNzaW9uLAotICogaXQg c2hvdWxkbid0IGNvc3QgbXVjaC4KKyAqIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIHBnX2xvY2Fs ZV90LiAgQmUgY2FyZWZ1bCB0byBjaGVjayBmb3IgZXJyb3JzIGJlZm9yZQorICogYWxsb2NhdGlu ZyBtZW1vcnkuCiAgKi8KLXBnX2xvY2FsZV90Ci1wZ19uZXdsb2NhbGVfZnJvbV9jb2xsYXRpb24o T2lkIGNvbGxpZCkKK3N0YXRpYyBwZ19sb2NhbGVfdAorY3JlYXRlX3BnX2xvY2FsZShPaWQgY29s bGlkKQogewotCWNvbGxhdGlvbl9jYWNoZV9lbnRyeSAqY2FjaGVfZW50cnk7Ci0KLQlpZiAoY29s bGlkID09IERFRkFVTFRfQ09MTEFUSU9OX09JRCkKLQkJcmV0dXJuICZkZWZhdWx0X2xvY2FsZTsK KwkvKiBXZSBoYXZlbid0IGNvbXB1dGVkIHRoaXMgeWV0IGluIHRoaXMgc2Vzc2lvbiwgc28gZG8g aXQgKi8KKwlIZWFwVHVwbGUJdHA7CisJRm9ybV9wZ19jb2xsYXRpb24gY29sbGZvcm07CisJcGdf bG9jYWxlX3QgcmVzdWx0OworCURhdHVtCQlkYXR1bTsKKwlib29sCQlpc251bGw7CiAKLQlpZiAo IU9pZElzVmFsaWQoY29sbGlkKSkKKwl0cCA9IFNlYXJjaFN5c0NhY2hlMShDT0xMT0lELCBPYmpl Y3RJZEdldERhdHVtKGNvbGxpZCkpOworCWlmICghSGVhcFR1cGxlSXNWYWxpZCh0cCkpCiAJCWVs b2coRVJST1IsICJjYWNoZSBsb29rdXAgZmFpbGVkIGZvciBjb2xsYXRpb24gJXUiLCBjb2xsaWQp OworCWNvbGxmb3JtID0gKEZvcm1fcGdfY29sbGF0aW9uKSBHRVRTVFJVQ1QodHApOwogCi0JaWYg KGxhc3RfY29sbGF0aW9uX2NhY2hlX29pZCA9PSBjb2xsaWQpCi0JCXJldHVybiBsYXN0X2NvbGxh dGlvbl9jYWNoZV9sb2NhbGU7Ci0KLQljYWNoZV9lbnRyeSA9IGxvb2t1cF9jb2xsYXRpb25fY2Fj aGUoY29sbGlkKTsKLQotCWlmIChjYWNoZV9lbnRyeS0+bG9jYWxlID09IDApCisJLyogY29tcGFy ZSB2ZXJzaW9uIGluIGNhdGFsb2cgdG8gdmVyc2lvbiBmcm9tIHByb3ZpZGVyICovCisJZGF0dW0g PSBTeXNDYWNoZUdldEF0dHIoQ09MTE9JRCwgdHAsIEFudW1fcGdfY29sbGF0aW9uX2NvbGx2ZXJz aW9uLAorCQkJCQkJCSZpc251bGwpOworCWlmICghaXNudWxsKQogCXsKLQkJLyogV2UgaGF2ZW4n dCBjb21wdXRlZCB0aGlzIHlldCBpbiB0aGlzIHNlc3Npb24sIHNvIGRvIGl0ICovCi0JCUhlYXBU dXBsZQl0cDsKLQkJRm9ybV9wZ19jb2xsYXRpb24gY29sbGZvcm07Ci0JCXN0cnVjdCBwZ19sb2Nh bGVfc3RydWN0IHJlc3VsdDsKLQkJcGdfbG9jYWxlX3QgcmVzdWx0cDsKLQkJRGF0dW0JCWRhdHVt OwotCQlib29sCQlpc251bGw7CisJCWNoYXIJICAgKmFjdHVhbF92ZXJzaW9uc3RyOworCQljaGFy CSAgICpjb2xsdmVyc2lvbnN0cjsKIAotCQl0cCA9IFNlYXJjaFN5c0NhY2hlMShDT0xMT0lELCBP YmplY3RJZEdldERhdHVtKGNvbGxpZCkpOwotCQlpZiAoIUhlYXBUdXBsZUlzVmFsaWQodHApKQot CQkJZWxvZyhFUlJPUiwgImNhY2hlIGxvb2t1cCBmYWlsZWQgZm9yIGNvbGxhdGlvbiAldSIsIGNv bGxpZCk7Ci0JCWNvbGxmb3JtID0gKEZvcm1fcGdfY29sbGF0aW9uKSBHRVRTVFJVQ1QodHApOwor CQljb2xsdmVyc2lvbnN0ciA9IFRleHREYXR1bUdldENTdHJpbmcoZGF0dW0pOwogCi0JCS8qIFdl J2xsIGZpbGwgaW4gdGhlIHJlc3VsdCBzdHJ1Y3QgbG9jYWxseSBiZWZvcmUgYWxsb2NhdGluZyBt ZW1vcnkgKi8KLQkJbWVtc2V0KCZyZXN1bHQsIDAsIHNpemVvZihyZXN1bHQpKTsKLQkJcmVzdWx0 LnByb3ZpZGVyID0gY29sbGZvcm0tPmNvbGxwcm92aWRlcjsKLQkJcmVzdWx0LmRldGVybWluaXN0 aWMgPSBjb2xsZm9ybS0+Y29sbGlzZGV0ZXJtaW5pc3RpYzsKKwkJaWYgKGNvbGxmb3JtLT5jb2xs cHJvdmlkZXIgPT0gQ09MTFBST1ZJREVSX0xJQkMpCisJCQlkYXR1bSA9IFN5c0NhY2hlR2V0QXR0 ck5vdE51bGwoQ09MTE9JRCwgdHAsIEFudW1fcGdfY29sbGF0aW9uX2NvbGxjb2xsYXRlKTsKKwkJ ZWxzZQorCQkJZGF0dW0gPSBTeXNDYWNoZUdldEF0dHJOb3ROdWxsKENPTExPSUQsIHRwLCBBbnVt X3BnX2NvbGxhdGlvbl9jb2xsbG9jYWxlKTsKIAotCQlpZiAoY29sbGZvcm0tPmNvbGxwcm92aWRl ciA9PSBDT0xMUFJPVklERVJfQlVJTFRJTikKKwkJYWN0dWFsX3ZlcnNpb25zdHIgPSBnZXRfY29s bGF0aW9uX2FjdHVhbF92ZXJzaW9uKGNvbGxmb3JtLT5jb2xscHJvdmlkZXIsCisJCQkJCQkJCQkJ CQkJCSBUZXh0RGF0dW1HZXRDU3RyaW5nKGRhdHVtKSk7CisJCWlmICghYWN0dWFsX3ZlcnNpb25z dHIpCiAJCXsKLQkJCWNvbnN0IGNoYXIgKmxvY3N0cjsKKwkJCS8qCisJCQkgKiBUaGlzIGNvdWxk IGhhcHBlbiB3aGVuIHNwZWNpZnlpbmcgYSB2ZXJzaW9uIGluIENSRUFURQorCQkJICogQ09MTEFU SU9OIGJ1dCB0aGUgcHJvdmlkZXIgZG9lcyBub3Qgc3VwcG9ydCB2ZXJzaW9uaW5nLCBvcgorCQkJ ICogbWFudWFsbHkgY3JlYXRpbmcgYSBtZXNzIGluIHRoZSBjYXRhbG9ncy4KKwkJCSAqLworCQkJ ZXJlcG9ydChFUlJPUiwKKwkJCQkJKGVycm1zZygiY29sbGF0aW9uIFwiJXNcIiBoYXMgbm8gYWN0 dWFsIHZlcnNpb24sIGJ1dCBhIHZlcnNpb24gd2FzIHJlY29yZGVkIiwKKwkJCQkJCQlOYW1lU3Ry KGNvbGxmb3JtLT5jb2xsbmFtZSkpKSk7CisJCX0KIAotCQkJZGF0dW0gPSBTeXNDYWNoZUdldEF0 dHJOb3ROdWxsKENPTExPSUQsIHRwLCBBbnVtX3BnX2NvbGxhdGlvbl9jb2xsbG9jYWxlKTsKLQkJ CWxvY3N0ciA9IFRleHREYXR1bUdldENTdHJpbmcoZGF0dW0pOworCQlpZiAoc3RyY21wKGFjdHVh bF92ZXJzaW9uc3RyLCBjb2xsdmVyc2lvbnN0cikgIT0gMCkKKwkJCWVyZXBvcnQoV0FSTklORywK KwkJCQkJKGVycm1zZygiY29sbGF0aW9uIFwiJXNcIiBoYXMgdmVyc2lvbiBtaXNtYXRjaCIsCisJ CQkJCQkJTmFtZVN0cihjb2xsZm9ybS0+Y29sbG5hbWUpKSwKKwkJCQkJIGVycmRldGFpbCgiVGhl IGNvbGxhdGlvbiBpbiB0aGUgZGF0YWJhc2Ugd2FzIGNyZWF0ZWQgdXNpbmcgdmVyc2lvbiAlcywg IgorCQkJCQkJCSAgICJidXQgdGhlIG9wZXJhdGluZyBzeXN0ZW0gcHJvdmlkZXMgdmVyc2lvbiAl cy4iLAorCQkJCQkJCSAgIGNvbGx2ZXJzaW9uc3RyLCBhY3R1YWxfdmVyc2lvbnN0ciksCisJCQkJ CSBlcnJoaW50KCJSZWJ1aWxkIGFsbCBvYmplY3RzIGFmZmVjdGVkIGJ5IHRoaXMgY29sbGF0aW9u IGFuZCBydW4gIgorCQkJCQkJCSAiQUxURVIgQ09MTEFUSU9OICVzIFJFRlJFU0ggVkVSU0lPTiwg IgorCQkJCQkJCSAib3IgYnVpbGQgUG9zdGdyZVNRTCB3aXRoIHRoZSByaWdodCBsaWJyYXJ5IHZl cnNpb24uIiwKKwkJCQkJCQkgcXVvdGVfcXVhbGlmaWVkX2lkZW50aWZpZXIoZ2V0X25hbWVzcGFj ZV9uYW1lKGNvbGxmb3JtLT5jb2xsbmFtZXNwYWNlKSwKKwkJCQkJCQkJCQkJCQkJTmFtZVN0cihj b2xsZm9ybS0+Y29sbG5hbWUpKSkpKTsKKwl9CiAKLQkJCXJlc3VsdC5jb2xsYXRlX2lzX2MgPSB0 cnVlOwotCQkJcmVzdWx0LmN0eXBlX2lzX2MgPSAoc3RyY21wKGxvY3N0ciwgIkMiKSA9PSAwKTsK KwlpZiAoY29sbGZvcm0tPmNvbGxwcm92aWRlciA9PSBDT0xMUFJPVklERVJfQlVJTFRJTikKKwl7 CisJCWNvbnN0IGNoYXIgKmxvY3N0cjsKIAotCQkJYnVpbHRpbl92YWxpZGF0ZV9sb2NhbGUoR2V0 RGF0YWJhc2VFbmNvZGluZygpLCBsb2NzdHIpOworCQlkYXR1bSA9IFN5c0NhY2hlR2V0QXR0ck5v dE51bGwoQ09MTE9JRCwgdHAsIEFudW1fcGdfY29sbGF0aW9uX2NvbGxsb2NhbGUpOworCQlsb2Nz dHIgPSBUZXh0RGF0dW1HZXRDU3RyaW5nKGRhdHVtKTsKIAotCQkJcmVzdWx0LmluZm8uYnVpbHRp bi5sb2NhbGUgPSBNZW1vcnlDb250ZXh0U3RyZHVwKFRvcE1lbW9yeUNvbnRleHQsCi0JCQkJCQkJ CQkJCQkJCQkgbG9jc3RyKTsKLQkJfQotCQllbHNlIGlmIChjb2xsZm9ybS0+Y29sbHByb3ZpZGVy ID09IENPTExQUk9WSURFUl9MSUJDKQotCQl7Ci0JCQljb25zdCBjaGFyICpjb2xsY29sbGF0ZTsK LQkJCWNvbnN0IGNoYXIgKmNvbGxjdHlwZTsKKwkJYnVpbHRpbl92YWxpZGF0ZV9sb2NhbGUoR2V0 RGF0YWJhc2VFbmNvZGluZygpLCBsb2NzdHIpOwogCi0JCQlkYXR1bSA9IFN5c0NhY2hlR2V0QXR0 ck5vdE51bGwoQ09MTE9JRCwgdHAsIEFudW1fcGdfY29sbGF0aW9uX2NvbGxjb2xsYXRlKTsKLQkJ CWNvbGxjb2xsYXRlID0gVGV4dERhdHVtR2V0Q1N0cmluZyhkYXR1bSk7Ci0JCQlkYXR1bSA9IFN5 c0NhY2hlR2V0QXR0ck5vdE51bGwoQ09MTE9JRCwgdHAsIEFudW1fcGdfY29sbGF0aW9uX2NvbGxj dHlwZSk7Ci0JCQljb2xsY3R5cGUgPSBUZXh0RGF0dW1HZXRDU3RyaW5nKGRhdHVtKTsKKwkJcmVz dWx0ID0gTWVtb3J5Q29udGV4dEFsbG9jWmVybyhUb3BNZW1vcnlDb250ZXh0LAorCQkJCQkJCQkJ CXNpemVvZihzdHJ1Y3QgcGdfbG9jYWxlX3N0cnVjdCkpOwogCi0JCQlyZXN1bHQuY29sbGF0ZV9p c19jID0gKHN0cmNtcChjb2xsY29sbGF0ZSwgIkMiKSA9PSAwKSB8fAotCQkJCShzdHJjbXAoY29s bGNvbGxhdGUsICJQT1NJWCIpID09IDApOwotCQkJcmVzdWx0LmN0eXBlX2lzX2MgPSAoc3RyY21w KGNvbGxjdHlwZSwgIkMiKSA9PSAwKSB8fAotCQkJCShzdHJjbXAoY29sbGN0eXBlLCAiUE9TSVgi KSA9PSAwKTsKKwkJcmVzdWx0LT5wcm92aWRlciA9IGNvbGxmb3JtLT5jb2xscHJvdmlkZXI7CisJ CXJlc3VsdC0+ZGV0ZXJtaW5pc3RpYyA9IGNvbGxmb3JtLT5jb2xsaXNkZXRlcm1pbmlzdGljOwor CQlyZXN1bHQtPmNvbGxhdGVfaXNfYyA9IHRydWU7CisJCXJlc3VsdC0+Y3R5cGVfaXNfYyA9IChz dHJjbXAobG9jc3RyLCAiQyIpID09IDApOworCQlyZXN1bHQtPmluZm8uYnVpbHRpbi5sb2NhbGUg PSBNZW1vcnlDb250ZXh0U3RyZHVwKFRvcE1lbW9yeUNvbnRleHQsCisJCQkJCQkJCQkJCQkJCSBs b2NzdHIpOworCX0KKwllbHNlIGlmIChjb2xsZm9ybS0+Y29sbHByb3ZpZGVyID09IENPTExQUk9W SURFUl9MSUJDKQorCXsKKwkJY29uc3QgY2hhciAqY29sbGNvbGxhdGU7CisJCWNvbnN0IGNoYXIg KmNvbGxjdHlwZTsKKwkJbG9jYWxlX3QJbG9jYWxlOworCisJCWRhdHVtID0gU3lzQ2FjaGVHZXRB dHRyTm90TnVsbChDT0xMT0lELCB0cCwgQW51bV9wZ19jb2xsYXRpb25fY29sbGNvbGxhdGUpOwor CQljb2xsY29sbGF0ZSA9IFRleHREYXR1bUdldENTdHJpbmcoZGF0dW0pOworCQlkYXR1bSA9IFN5 c0NhY2hlR2V0QXR0ck5vdE51bGwoQ09MTE9JRCwgdHAsIEFudW1fcGdfY29sbGF0aW9uX2NvbGxj dHlwZSk7CisJCWNvbGxjdHlwZSA9IFRleHREYXR1bUdldENTdHJpbmcoZGF0dW0pOworCisJCWxv Y2FsZSA9IG1ha2VfbGliY19jb2xsYXRvcihjb2xsY29sbGF0ZSwgY29sbGN0eXBlKTsKKworCQly ZXN1bHQgPSBNZW1vcnlDb250ZXh0QWxsb2NaZXJvKFRvcE1lbW9yeUNvbnRleHQsCisJCQkJCQkJ CQkJc2l6ZW9mKHN0cnVjdCBwZ19sb2NhbGVfc3RydWN0KSk7CisKKwkJcmVzdWx0LT5wcm92aWRl ciA9IGNvbGxmb3JtLT5jb2xscHJvdmlkZXI7CisJCXJlc3VsdC0+ZGV0ZXJtaW5pc3RpYyA9IGNv bGxmb3JtLT5jb2xsaXNkZXRlcm1pbmlzdGljOworCQlyZXN1bHQtPmNvbGxhdGVfaXNfYyA9IChz dHJjbXAoY29sbGNvbGxhdGUsICJDIikgPT0gMCkgfHwKKwkJCShzdHJjbXAoY29sbGNvbGxhdGUs ICJQT1NJWCIpID09IDApOworCQlyZXN1bHQtPmN0eXBlX2lzX2MgPSAoc3RyY21wKGNvbGxjdHlw ZSwgIkMiKSA9PSAwKSB8fAorCQkJKHN0cmNtcChjb2xsY3R5cGUsICJQT1NJWCIpID09IDApOwor CQlyZXN1bHQtPmluZm8ubHQgPSBsb2NhbGU7CisJfQorCWVsc2UgaWYgKGNvbGxmb3JtLT5jb2xs cHJvdmlkZXIgPT0gQ09MTFBST1ZJREVSX0lDVSkKKwl7CisJCWNvbnN0IGNoYXIgKmljdWxvY3N0 cjsKKwkJY29uc3QgY2hhciAqaWN1cnVsZXM7CisJCVVDb2xsYXRvciAgKmNvbGxhdG9yOwogCi0J CQlyZXN1bHQuaW5mby5sdCA9IG1ha2VfbGliY19jb2xsYXRvcihjb2xsY29sbGF0ZSwgY29sbGN0 eXBlKTsKLQkJfQotCQllbHNlIGlmIChjb2xsZm9ybS0+Y29sbHByb3ZpZGVyID09IENPTExQUk9W SURFUl9JQ1UpCi0JCXsKLQkJCWNvbnN0IGNoYXIgKmljdWxvY3N0cjsKLQkJCWNvbnN0IGNoYXIg KmljdXJ1bGVzOworCQlkYXR1bSA9IFN5c0NhY2hlR2V0QXR0ck5vdE51bGwoQ09MTE9JRCwgdHAs IEFudW1fcGdfY29sbGF0aW9uX2NvbGxsb2NhbGUpOworCQlpY3Vsb2NzdHIgPSBUZXh0RGF0dW1H ZXRDU3RyaW5nKGRhdHVtKTsKIAotCQkJZGF0dW0gPSBTeXNDYWNoZUdldEF0dHJOb3ROdWxsKENP TExPSUQsIHRwLCBBbnVtX3BnX2NvbGxhdGlvbl9jb2xsbG9jYWxlKTsKLQkJCWljdWxvY3N0ciA9 IFRleHREYXR1bUdldENTdHJpbmcoZGF0dW0pOworCQlkYXR1bSA9IFN5c0NhY2hlR2V0QXR0cihD T0xMT0lELCB0cCwgQW51bV9wZ19jb2xsYXRpb25fY29sbGljdXJ1bGVzLCAmaXNudWxsKTsKKwkJ aWYgKCFpc251bGwpCisJCQlpY3VydWxlcyA9IFRleHREYXR1bUdldENTdHJpbmcoZGF0dW0pOwor CQllbHNlCisJCQlpY3VydWxlcyA9IE5VTEw7CiAKLQkJCXJlc3VsdC5jb2xsYXRlX2lzX2MgPSBm YWxzZTsKLQkJCXJlc3VsdC5jdHlwZV9pc19jID0gZmFsc2U7CisJCWNvbGxhdG9yID0gbWFrZV9p Y3VfY29sbGF0b3IoaWN1bG9jc3RyLCBpY3VydWxlcyk7CiAKLQkJCWRhdHVtID0gU3lzQ2FjaGVH ZXRBdHRyKENPTExPSUQsIHRwLCBBbnVtX3BnX2NvbGxhdGlvbl9jb2xsaWN1cnVsZXMsICZpc251 bGwpOwotCQkJaWYgKCFpc251bGwpCi0JCQkJaWN1cnVsZXMgPSBUZXh0RGF0dW1HZXRDU3RyaW5n KGRhdHVtKTsKLQkJCWVsc2UKLQkJCQlpY3VydWxlcyA9IE5VTEw7CisJCXJlc3VsdCA9IE1lbW9y eUNvbnRleHRBbGxvY1plcm8oVG9wTWVtb3J5Q29udGV4dCwKKwkJCQkJCQkJCQlzaXplb2Yoc3Ry dWN0IHBnX2xvY2FsZV9zdHJ1Y3QpKTsKIAotCQkJcmVzdWx0LmluZm8uaWN1LmxvY2FsZSA9IE1l bW9yeUNvbnRleHRTdHJkdXAoVG9wTWVtb3J5Q29udGV4dCwgaWN1bG9jc3RyKTsKLQkJCXJlc3Vs dC5pbmZvLmljdS51Y29sID0gbWFrZV9pY3VfY29sbGF0b3IoaWN1bG9jc3RyLCBpY3VydWxlcyk7 Ci0JCX0KKwkJcmVzdWx0LT5wcm92aWRlciA9IGNvbGxmb3JtLT5jb2xscHJvdmlkZXI7CisJCXJl c3VsdC0+ZGV0ZXJtaW5pc3RpYyA9IGNvbGxmb3JtLT5jb2xsaXNkZXRlcm1pbmlzdGljOworCQly ZXN1bHQtPmNvbGxhdGVfaXNfYyA9IGZhbHNlOworCQlyZXN1bHQtPmN0eXBlX2lzX2MgPSBmYWxz ZTsKKwkJcmVzdWx0LT5pbmZvLmljdS5sb2NhbGUgPSBNZW1vcnlDb250ZXh0U3RyZHVwKFRvcE1l bW9yeUNvbnRleHQsIGljdWxvY3N0cik7CisJCXJlc3VsdC0+aW5mby5pY3UudWNvbCA9IGNvbGxh dG9yOworCX0KIAotCQlkYXR1bSA9IFN5c0NhY2hlR2V0QXR0cihDT0xMT0lELCB0cCwgQW51bV9w Z19jb2xsYXRpb25fY29sbHZlcnNpb24sCi0JCQkJCQkJCSZpc251bGwpOwotCQlpZiAoIWlzbnVs bCkKLQkJewotCQkJY2hhcgkgICAqYWN0dWFsX3ZlcnNpb25zdHI7Ci0JCQljaGFyCSAgICpjb2xs dmVyc2lvbnN0cjsKKwlSZWxlYXNlU3lzQ2FjaGUodHApOwogCi0JCQljb2xsdmVyc2lvbnN0ciA9 IFRleHREYXR1bUdldENTdHJpbmcoZGF0dW0pOworCXJldHVybiByZXN1bHQ7Cit9CiAKLQkJCWlm IChjb2xsZm9ybS0+Y29sbHByb3ZpZGVyID09IENPTExQUk9WSURFUl9MSUJDKQotCQkJCWRhdHVt ID0gU3lzQ2FjaGVHZXRBdHRyTm90TnVsbChDT0xMT0lELCB0cCwgQW51bV9wZ19jb2xsYXRpb25f Y29sbGNvbGxhdGUpOwotCQkJZWxzZQotCQkJCWRhdHVtID0gU3lzQ2FjaGVHZXRBdHRyTm90TnVs bChDT0xMT0lELCB0cCwgQW51bV9wZ19jb2xsYXRpb25fY29sbGxvY2FsZSk7CisvKgorICogQ3Jl YXRlIG9yIHJldHJpZXZlIGEgcGdfbG9jYWxlX3QgZm9yIHRoZSBnaXZlbiBjb2xsYXRpb24gT0lE LiAgUmVzdWx0cyBhcmUKKyAqIGNhY2hlZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBiYWNrZW5k LgorICovCitwZ19sb2NhbGVfdAorcGdfbmV3bG9jYWxlX2Zyb21fY29sbGF0aW9uKE9pZCBjb2xs aWQpCit7CisJY29sbGF0aW9uX2NhY2hlX2VudHJ5CSpjYWNoZV9lbnRyeTsKKwlib29sCQkJCQkg Zm91bmQ7CiAKLQkJCWFjdHVhbF92ZXJzaW9uc3RyID0gZ2V0X2NvbGxhdGlvbl9hY3R1YWxfdmVy c2lvbihjb2xsZm9ybS0+Y29sbHByb3ZpZGVyLAotCQkJCQkJCQkJCQkJCQkJIFRleHREYXR1bUdl dENTdHJpbmcoZGF0dW0pKTsKLQkJCWlmICghYWN0dWFsX3ZlcnNpb25zdHIpCi0JCQl7Ci0JCQkJ LyoKLQkJCQkgKiBUaGlzIGNvdWxkIGhhcHBlbiB3aGVuIHNwZWNpZnlpbmcgYSB2ZXJzaW9uIGlu IENSRUFURQotCQkJCSAqIENPTExBVElPTiBidXQgdGhlIHByb3ZpZGVyIGRvZXMgbm90IHN1cHBv cnQgdmVyc2lvbmluZywgb3IKLQkJCQkgKiBtYW51YWxseSBjcmVhdGluZyBhIG1lc3MgaW4gdGhl IGNhdGFsb2dzLgotCQkJCSAqLwotCQkJCWVyZXBvcnQoRVJST1IsCi0JCQkJCQkoZXJybXNnKCJj b2xsYXRpb24gXCIlc1wiIGhhcyBubyBhY3R1YWwgdmVyc2lvbiwgYnV0IGEgdmVyc2lvbiB3YXMg cmVjb3JkZWQiLAotCQkJCQkJCQlOYW1lU3RyKGNvbGxmb3JtLT5jb2xsbmFtZSkpKSk7Ci0JCQl9 CisJaWYgKGNvbGxpZCA9PSBERUZBVUxUX0NPTExBVElPTl9PSUQpCisJCXJldHVybiAmZGVmYXVs dF9sb2NhbGU7CiAKLQkJCWlmIChzdHJjbXAoYWN0dWFsX3ZlcnNpb25zdHIsIGNvbGx2ZXJzaW9u c3RyKSAhPSAwKQotCQkJCWVyZXBvcnQoV0FSTklORywKLQkJCQkJCShlcnJtc2coImNvbGxhdGlv biBcIiVzXCIgaGFzIHZlcnNpb24gbWlzbWF0Y2giLAotCQkJCQkJCQlOYW1lU3RyKGNvbGxmb3Jt LT5jb2xsbmFtZSkpLAotCQkJCQkJIGVycmRldGFpbCgiVGhlIGNvbGxhdGlvbiBpbiB0aGUgZGF0 YWJhc2Ugd2FzIGNyZWF0ZWQgdXNpbmcgdmVyc2lvbiAlcywgIgotCQkJCQkJCQkgICAiYnV0IHRo ZSBvcGVyYXRpbmcgc3lzdGVtIHByb3ZpZGVzIHZlcnNpb24gJXMuIiwKLQkJCQkJCQkJICAgY29s bHZlcnNpb25zdHIsIGFjdHVhbF92ZXJzaW9uc3RyKSwKLQkJCQkJCSBlcnJoaW50KCJSZWJ1aWxk IGFsbCBvYmplY3RzIGFmZmVjdGVkIGJ5IHRoaXMgY29sbGF0aW9uIGFuZCBydW4gIgotCQkJCQkJ CQkgIkFMVEVSIENPTExBVElPTiAlcyBSRUZSRVNIIFZFUlNJT04sICIKLQkJCQkJCQkJICJvciBi dWlsZCBQb3N0Z3JlU1FMIHdpdGggdGhlIHJpZ2h0IGxpYnJhcnkgdmVyc2lvbi4iLAotCQkJCQkJ CQkgcXVvdGVfcXVhbGlmaWVkX2lkZW50aWZpZXIoZ2V0X25hbWVzcGFjZV9uYW1lKGNvbGxmb3Jt LT5jb2xsbmFtZXNwYWNlKSwKLQkJCQkJCQkJCQkJCQkJCU5hbWVTdHIoY29sbGZvcm0tPmNvbGxu YW1lKSkpKSk7Ci0JCX0KKwlpZiAoIU9pZElzVmFsaWQoY29sbGlkKSkKKwkJZWxvZyhFUlJPUiwg ImNhY2hlIGxvb2t1cCBmYWlsZWQgZm9yIGNvbGxhdGlvbiAldSIsIGNvbGxpZCk7CiAKLQkJUmVs ZWFzZVN5c0NhY2hlKHRwKTsKKwlpZiAobGFzdF9jb2xsYXRpb25fY2FjaGVfb2lkID09IGNvbGxp ZCkKKwkJcmV0dXJuIGxhc3RfY29sbGF0aW9uX2NhY2hlX2xvY2FsZTsKIAotCQkvKiBXZSdsbCBr ZWVwIHRoZSBwZ19sb2NhbGVfdCBzdHJ1Y3R1cmVzIGluIFRvcE1lbW9yeUNvbnRleHQgKi8KLQkJ cmVzdWx0cCA9IE1lbW9yeUNvbnRleHRBbGxvYyhUb3BNZW1vcnlDb250ZXh0LCBzaXplb2YoKnJl c3VsdHApKTsKLQkJKnJlc3VsdHAgPSByZXN1bHQ7CisJLyoKKwkgKiBDYWNoZSBtZWNoYW5pc20g Zm9yIGNvbGxhdGlvbiBpbmZvcm1hdGlvbi4KKwkgKgorCSAqIE5vdGUgdGhhdCB3ZSBjdXJyZW50 bHkgbGFjayBhbnkgd2F5IHRvIGZsdXNoIHRoZSBjYWNoZS4gIFNpbmNlIHdlIGRvbid0CisJICog c3VwcG9ydCBBTFRFUiBDT0xMQVRJT04sIHRoaXMgaXMgT0suICBUaGUgd29yc3QgY2FzZSBpcyB0 aGF0IHNvbWVvbmUKKwkgKiBkcm9wcyBhIGNvbGxhdGlvbiwgYW5kIGEgdXNlbGVzcyBjYWNoZSBl bnRyeSBoYW5ncyBhcm91bmQgaW4gZXhpc3RpbmcKKwkgKiBiYWNrZW5kcy4KKwkgKi8KKwlpZiAo Q29sbGF0aW9uQ2FjaGUgPT0gTlVMTCkKKwl7CisJCUNvbGxhdGlvbkNhY2hlQ29udGV4dCA9IEFs bG9jU2V0Q29udGV4dENyZWF0ZShUb3BNZW1vcnlDb250ZXh0LAorCQkJCQkJCQkJCQkJCSAgImNv bGxhdGlvbiBjYWNoZSIsCisJCQkJCQkJCQkJCQkJICBBTExPQ1NFVF9ERUZBVUxUX1NJWkVTKTsK KwkJQ29sbGF0aW9uQ2FjaGUgPSBjb2xsYXRpb25fY2FjaGVfY3JlYXRlKENvbGxhdGlvbkNhY2hl Q29udGV4dCwKKwkJCQkJCQkJCQkJCTE2LCBOVUxMKTsKKwl9CiAKLQkJY2FjaGVfZW50cnktPmxv Y2FsZSA9IHJlc3VsdHA7CisJY2FjaGVfZW50cnkgPSBjb2xsYXRpb25fY2FjaGVfaW5zZXJ0KENv bGxhdGlvbkNhY2hlLCBjb2xsaWQsICZmb3VuZCk7CisJaWYgKCFmb3VuZCkKKwl7CisJCS8qCisJ CSAqIE1ha2Ugc3VyZSBjYWNoZSBlbnRyeSBpcyBtYXJrZWQgaW52YWxpZCwgaW4gY2FzZSB3ZSBm YWlsIGJlZm9yZQorCQkgKiBzZXR0aW5nIHRoaW5ncy4KKwkJICovCisJCWNhY2hlX2VudHJ5LT5s b2NhbGUgPSAwOwogCX0KIAorCWlmIChjYWNoZV9lbnRyeS0+bG9jYWxlID09IDApCisJCWNhY2hl X2VudHJ5LT5sb2NhbGUgPSBjcmVhdGVfcGdfbG9jYWxlKGNvbGxpZCk7CisKIAlsYXN0X2NvbGxh dGlvbl9jYWNoZV9vaWQgPSBjb2xsaWQ7CiAJbGFzdF9jb2xsYXRpb25fY2FjaGVfbG9jYWxlID0g Y2FjaGVfZW50cnktPmxvY2FsZTsKIAotLSAKMi4zNC4xCgo= --=-reTqxxA0+F50OXMUZ9aK Content-Disposition: attachment; filename*0=v4-0001-Tighten-up-make_libc_collator-and-make_icu_collat.pat; filename*1=ch Content-Type: text/x-patch; name="v4-0001-Tighten-up-make_libc_collator-and-make_icu_collat.patch"; charset="UTF-8" Content-Transfer-Encoding: base64 RnJvbSAyMjQ0NzBiYzRkMDY2MGRjMTE5NDBmNTU5NTAzMWVlY2IwMzE5ZDYyIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKZWZmIERhdmlzIDxqZWZmQGotZGF2aXMuY29tPgpEYXRlOiBX ZWQsIDcgQXVnIDIwMjQgMTE6MDU6NDYgLTA3MDAKU3ViamVjdDogW1BBVENIIHY0IDEvN10gVGln aHRlbiB1cCBtYWtlX2xpYmNfY29sbGF0b3IoKSBhbmQKIG1ha2VfaWN1X2NvbGxhdG9yKCkuCgpS ZXR1cm4gdGhlIHJlc3VsdCByYXRoZXIgdGhhbiB1c2luZyBhbiBvdXQgcGFyYW1ldGVyLCBhbmQg bWFrZSBpdCB0aGUKY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gY29weSBpdCBpbnRvIHRoZSBy aWdodCBjb250ZXh0LiBFbnN1cmUgdGhhdApubyBwYXRocyBsZWFrIGEgY29sbGF0b3IuCgpUaGUg ZnVuY3Rpb24gbWFrZV9pY3VfY29sbGF0b3IoKSBkb2Vzbid0IGhhdmUgYW55IGV4dGVybmFsIGNh bGxlcnMsIHNvCmNoYW5nZSBpdCB0byBiZSBzdGF0aWMuIEFsc28sIHdoZW4gcmUtb3BlbmluZyB3 aXRoIHJ1bGVzLCB1c2UgYQp0cnkvZmluYWxseSBibG9jayB0byBhdm9pZCBsZWFraW5nIHRoZSBj b2xsYXRvci4KCkluIG1ha2VfbGliY19jb2xsYXRvcigpLCBpZiB0aGUgZmlyc3QgbmV3bG9jYWxl KCkgc3VjY2VlZHMgYW5kIHRoZQpzZWNvbmQgb25lIGZhaWxzLCBjbG9zZSB0aGUgZmlyc3QgbG9j YWxlX3Qgb2JqZWN0LgoKRGlzY3Vzc2lvbjogaHR0cHM6Ly9wb3N0Z3IuZXMvbS81NGQyMGU4MTJi ZDZjM2U0NGMxMGVkZGNkNzU3ZWM0OTRlYmYxODAzLmNhbWVsQGotZGF2aXMuY29tCi0tLQogc3Jj L2JhY2tlbmQvdXRpbHMvYWR0L3BnX2xvY2FsZS5jIHwgMTI2ICsrKysrKysrKysrKysrKysrKyst LS0tLS0tLS0tLQogc3JjL2luY2x1ZGUvdXRpbHMvcGdfbG9jYWxlLmggICAgIHwgICA0IC0KIDIg ZmlsZXMgY2hhbmdlZCwgODAgaW5zZXJ0aW9ucygrKSwgNTAgZGVsZXRpb25zKC0pCgpkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3BnX2xvY2FsZS5jIGIvc3JjL2JhY2tlbmQvdXRp bHMvYWR0L3BnX2xvY2FsZS5jCmluZGV4IDViZWYxYjExM2E4Li4xMmJhNTcyNmY3NyAxMDA2NDQK LS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3BnX2xvY2FsZS5jCisrKyBiL3NyYy9iYWNrZW5k L3V0aWxzL2FkdC9wZ19sb2NhbGUuYwpAQCAtMTI5NywxNCArMTI5NywxNSBAQCByZXBvcnRfbmV3 bG9jYWxlX2ZhaWx1cmUoY29uc3QgY2hhciAqbG9jYWxlbmFtZSkKIH0KIAogLyoKLSAqIEluaXRp YWxpemUgdGhlIGxvY2FsZV90IGZpZWxkLgorICogQ3JlYXRlIGEgbG9jYWxlX3Qgd2l0aCB0aGUg Z2l2ZW4gY29sbGF0aW9uIGFuZCBjdHlwZS4KICAqCi0gKiBUaGUgIkMiIGFuZCAiUE9TSVgiIGxv Y2FsZXMgYXJlIG5vdCBhY3R1YWxseSBoYW5kbGVkIGJ5IGxpYmMsIHNvIHNldCB0aGUKLSAqIGxv Y2FsZV90IHRvIHplcm8gaW4gdGhhdCBjYXNlLgorICogVGhlICJDIiBhbmQgIlBPU0lYIiBsb2Nh bGVzIGFyZSBub3QgYWN0dWFsbHkgaGFuZGxlZCBieSBsaWJjLCBzbyByZXR1cm4KKyAqIE5VTEwu CisgKgorICogRW5zdXJlIHRoYXQgbm8gcGF0aCBsZWFrcyBhIGxvY2FsZV90LgogICovCi1zdGF0 aWMgdm9pZAotbWFrZV9saWJjX2NvbGxhdG9yKGNvbnN0IGNoYXIgKmNvbGxhdGUsIGNvbnN0IGNo YXIgKmN0eXBlLAotCQkJCSAgIHBnX2xvY2FsZV90IHJlc3VsdCkKK3N0YXRpYyBsb2NhbGVfdAor bWFrZV9saWJjX2NvbGxhdG9yKGNvbnN0IGNoYXIgKmNvbGxhdGUsIGNvbnN0IGNoYXIgKmN0eXBl KQogewogCWxvY2FsZV90CWxvYyA9IDA7CiAKQEAgLTEzNDMsNyArMTM0NCwxMSBAQCBtYWtlX2xp YmNfY29sbGF0b3IoY29uc3QgY2hhciAqY29sbGF0ZSwgY29uc3QgY2hhciAqY3R5cGUsCiAJCQll cnJubyA9IDA7CiAJCQlsb2MgPSBuZXdsb2NhbGUoTENfQ1RZUEVfTUFTSywgY3R5cGUsIGxvYzEp OwogCQkJaWYgKCFsb2MpCisJCQl7CisJCQkJaWYgKGxvYzEpCisJCQkJCWZyZWVsb2NhbGUobG9j MSk7CiAJCQkJcmVwb3J0X25ld2xvY2FsZV9mYWlsdXJlKGN0eXBlKTsKKwkJCX0KIAkJfQogCQll bHNlCiAJCQlsb2MgPSBsb2MxOwpAQCAtMTM2MCw2MCArMTM2NSw3OCBAQCBtYWtlX2xpYmNfY29s bGF0b3IoY29uc3QgY2hhciAqY29sbGF0ZSwgY29uc3QgY2hhciAqY3R5cGUsCiAjZW5kaWYKIAl9 CiAKLQlyZXN1bHQtPmluZm8ubHQgPSBsb2M7CisJcmV0dXJuIGxvYzsKIH0KIAotdm9pZAotbWFr ZV9pY3VfY29sbGF0b3IoY29uc3QgY2hhciAqaWN1bG9jc3RyLAotCQkJCSAgY29uc3QgY2hhciAq aWN1cnVsZXMsCi0JCQkJICBzdHJ1Y3QgcGdfbG9jYWxlX3N0cnVjdCAqcmVzdWx0cCkKLXsKKy8q CisgKiBDcmVhdGUgYSBVQ29sbGF0b3Igd2l0aCB0aGUgZ2l2ZW4gbG9jYWxlIHN0cmluZyBhbmQg cnVsZXMuCisgKgorICogRW5zdXJlIHRoYXQgbm8gcGF0aCBsZWFrcyBhIFVDb2xsYXRvci4KKyAq LwogI2lmZGVmIFVTRV9JQ1UKLQlVQ29sbGF0b3IgICpjb2xsYXRvcjsKLQotCWNvbGxhdG9yID0g cGdfdWNvbF9vcGVuKGljdWxvY3N0cik7Ci0KLQkvKgotCSAqIElmIHJ1bGVzIGFyZSBzcGVjaWZp ZWQsIHdlIGV4dHJhY3QgdGhlIHJ1bGVzIG9mIHRoZSBzdGFuZGFyZCBjb2xsYXRpb24sCi0JICog YWRkIG91ciBvd24gcnVsZXMsIGFuZCBtYWtlIGEgbmV3IGNvbGxhdG9yIHdpdGggdGhlIGNvbWJp bmVkIHJ1bGVzLgotCSAqLwotCWlmIChpY3VydWxlcykKK3N0YXRpYyBVQ29sbGF0b3IgKgorbWFr ZV9pY3VfY29sbGF0b3IoY29uc3QgY2hhciAqaWN1bG9jc3RyLCBjb25zdCBjaGFyICppY3VydWxl cykKK3sKKwlpZiAoIWljdXJ1bGVzKQogCXsKLQkJY29uc3QgVUNoYXIgKmRlZmF1bHRfcnVsZXM7 Ci0JCVVDaGFyCSAgICphZ2dfcnVsZXM7CisJCS8qIHNpbXBsZSBjYXNlIHdpdGhvdXQgcnVsZXMg Ki8KKwkJcmV0dXJuIHBnX3Vjb2xfb3BlbihpY3Vsb2NzdHIpOworCX0KKwllbHNlCisJeworCQlV Q29sbGF0b3IgICpjb2xsYXRvcl9zdGRfcnVsZXM7CisJCVVDb2xsYXRvciAgKmNvbGxhdG9yX2Fs bF9ydWxlczsKKwkJY29uc3QgVUNoYXIgKnN0ZF9ydWxlczsKIAkJVUNoYXIJICAgKm15X3J1bGVz OwotCQlVRXJyb3JDb2RlCXN0YXR1czsKKwkJVUNoYXIJICAgKmFsbF9ydWxlczsKIAkJaW50MzJf dAkJbGVuZ3RoOworCQlpbnQzMl90CQl0b3RhbDsKKwkJVUVycm9yQ29kZQlzdGF0dXM7CiAKLQkJ ZGVmYXVsdF9ydWxlcyA9IHVjb2xfZ2V0UnVsZXMoY29sbGF0b3IsICZsZW5ndGgpOworCQkvKgor CQkgKiBJZiBydWxlcyBhcmUgc3BlY2lmaWVkLCB3ZSBleHRyYWN0IHRoZSBydWxlcyBvZiB0aGUg c3RhbmRhcmQKKwkJICogY29sbGF0aW9uLCBhZGQgb3VyIG93biBydWxlcywgYW5kIG1ha2UgYSBu ZXcgY29sbGF0b3Igd2l0aCB0aGUKKwkJICogY29tYmluZWQgcnVsZXMuCisJCSAqLwogCQlpY3Vf dG9fdWNoYXIoJm15X3J1bGVzLCBpY3VydWxlcywgc3RybGVuKGljdXJ1bGVzKSk7CiAKLQkJYWdn X3J1bGVzID0gcGFsbG9jX2FycmF5KFVDaGFyLCB1X3N0cmxlbihkZWZhdWx0X3J1bGVzKSArIHVf c3RybGVuKG15X3J1bGVzKSArIDEpOwotCQl1X3N0cmNweShhZ2dfcnVsZXMsIGRlZmF1bHRfcnVs ZXMpOwotCQl1X3N0cmNhdChhZ2dfcnVsZXMsIG15X3J1bGVzKTsKKwkJY29sbGF0b3Jfc3RkX3J1 bGVzID0gcGdfdWNvbF9vcGVuKGljdWxvY3N0cik7CiAKLQkJdWNvbF9jbG9zZShjb2xsYXRvcik7 CisJCXN0ZF9ydWxlcyA9IHVjb2xfZ2V0UnVsZXMoY29sbGF0b3Jfc3RkX3J1bGVzLCAmbGVuZ3Ro KTsKKworCQl0b3RhbCA9IHVfc3RybGVuKHN0ZF9ydWxlcykgKyB1X3N0cmxlbihteV9ydWxlcykg KyAxOworCisJCS8qIGF2b2lkIGxlYWtpbmcgY29sbGF0b3Igb24gT09NICovCisJCWFsbF9ydWxl cyA9IHBhbGxvY19leHRlbmRlZChzaXplb2YoVUNoYXIpICogdG90YWwsIE1DWFRfQUxMT0NfTk9f T09NKTsKKwkJaWYgKCFhbGxfcnVsZXMpCisJCXsKKwkJCXVjb2xfY2xvc2UoY29sbGF0b3Jfc3Rk X3J1bGVzKTsKKwkJCWVyZXBvcnQoRVJST1IsCisJCQkJCShlcnJjb2RlKEVSUkNPREVfT1VUX09G X01FTU9SWSksCisJCQkJCSBlcnJtc2coIm91dCBvZiBtZW1vcnkiKSkpOworCQl9CisKKwkJdV9z dHJjcHkoYWxsX3J1bGVzLCBzdGRfcnVsZXMpOworCQl1X3N0cmNhdChhbGxfcnVsZXMsIG15X3J1 bGVzKTsKKworCQl1Y29sX2Nsb3NlKGNvbGxhdG9yX3N0ZF9ydWxlcyk7CiAKIAkJc3RhdHVzID0g VV9aRVJPX0VSUk9SOwotCQljb2xsYXRvciA9IHVjb2xfb3BlblJ1bGVzKGFnZ19ydWxlcywgdV9z dHJsZW4oYWdnX3J1bGVzKSwKLQkJCQkJCQkJICBVQ09MX0RFRkFVTFQsIFVDT0xfREVGQVVMVF9T VFJFTkdUSCwgTlVMTCwgJnN0YXR1cyk7CisJCWNvbGxhdG9yX2FsbF9ydWxlcyA9IHVjb2xfb3Bl blJ1bGVzKGFsbF9ydWxlcywgdV9zdHJsZW4oYWxsX3J1bGVzKSwKKwkJCQkJCQkJCQkJVUNPTF9E RUZBVUxULCBVQ09MX0RFRkFVTFRfU1RSRU5HVEgsCisJCQkJCQkJCQkJCU5VTEwsICZzdGF0dXMp OwogCQlpZiAoVV9GQUlMVVJFKHN0YXR1cykpCisJCXsKIAkJCWVyZXBvcnQoRVJST1IsCiAJCQkJ CShlcnJjb2RlKEVSUkNPREVfSU5WQUxJRF9QQVJBTUVURVJfVkFMVUUpLAogCQkJCQkgZXJybXNn KCJjb3VsZCBub3Qgb3BlbiBjb2xsYXRvciBmb3IgbG9jYWxlIFwiJXNcIiB3aXRoIHJ1bGVzIFwi JXNcIjogJXMiLAogCQkJCQkJCWljdWxvY3N0ciwgaWN1cnVsZXMsIHVfZXJyb3JOYW1lKHN0YXR1 cykpKSk7Ci0JfQorCQl9CiAKLQkvKiBXZSB3aWxsIGxlYWsgdGhpcyBzdHJpbmcgaWYgdGhlIGNh bGxlciBlcnJvcnMgbGF0ZXIgOi0oICovCi0JcmVzdWx0cC0+aW5mby5pY3UubG9jYWxlID0gTWVt b3J5Q29udGV4dFN0cmR1cChUb3BNZW1vcnlDb250ZXh0LCBpY3Vsb2NzdHIpOwotCXJlc3VsdHAt PmluZm8uaWN1LnVjb2wgPSBjb2xsYXRvcjsKLSNlbHNlCQkJCQkJCS8qIG5vdCBVU0VfSUNVICov Ci0JLyogY291bGQgZ2V0IGhlcmUgaWYgYSBjb2xsYXRpb24gd2FzIGNyZWF0ZWQgYnkgYSBidWls ZCB3aXRoIElDVSAqLwotCWVyZXBvcnQoRVJST1IsCi0JCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRV UkVfTk9UX1NVUFBPUlRFRCksCi0JCQkgZXJybXNnKCJJQ1UgaXMgbm90IHN1cHBvcnRlZCBpbiB0 aGlzIGJ1aWxkIikpKTsKLSNlbmRpZgkJCQkJCQkvKiBub3QgVVNFX0lDVSAqLworCQlyZXR1cm4g Y29sbGF0b3JfYWxsX3J1bGVzOworCX0KIH0KKyNlbmRpZgkJCQkJCQkvKiBub3QgVVNFX0lDVSAq LwogCiAvKgogICogSW5pdGlhbGl6ZSBkZWZhdWx0X2xvY2FsZSB3aXRoIGRhdGFiYXNlIGxvY2Fs ZSBzZXR0aW5ncy4KQEAgLTE0MjQsNyArMTQ0Nyw2IEBAIGluaXRfZGF0YWJhc2VfY29sbGF0aW9u KHZvaWQpCiAJSGVhcFR1cGxlCXR1cDsKIAlGb3JtX3BnX2RhdGFiYXNlIGRiZm9ybTsKIAlEYXR1 bQkJZGF0dW07Ci0JYm9vbAkJaXNudWxsOwogCiAJLyogRmV0Y2ggb3VyIHBnX2RhdGFiYXNlIHJv dyBub3JtYWxseSwgdmlhIHN5c2NhY2hlICovCiAJdHVwID0gU2VhcmNoU3lzQ2FjaGUxKERBVEFC QVNFT0lELCBPYmplY3RJZEdldERhdHVtKE15RGF0YWJhc2VJZCkpOwpAQCAtMTQ0OSw4ICsxNDcx LDEwIEBAIGluaXRfZGF0YWJhc2VfY29sbGF0aW9uKHZvaWQpCiAJfQogCWVsc2UgaWYgKGRiZm9y bS0+ZGF0bG9jcHJvdmlkZXIgPT0gQ09MTFBST1ZJREVSX0lDVSkKIAl7CisjaWZkZWYgVVNFX0lD VQogCQljaGFyCSAgICpkYXRsb2NhbGU7CiAJCWNoYXIJICAgKmljdXJ1bGVzOworCQlib29sCQlp c251bGw7CiAKIAkJZGF0dW0gPSBTeXNDYWNoZUdldEF0dHJOb3ROdWxsKERBVEFCQVNFT0lELCB0 dXAsIEFudW1fcGdfZGF0YWJhc2VfZGF0bG9jYWxlKTsKIAkJZGF0bG9jYWxlID0gVGV4dERhdHVt R2V0Q1N0cmluZyhkYXR1bSk7CkBAIC0xNDY0LDcgKzE0ODgsMTQgQEAgaW5pdF9kYXRhYmFzZV9j b2xsYXRpb24odm9pZCkKIAkJZWxzZQogCQkJaWN1cnVsZXMgPSBOVUxMOwogCi0JCW1ha2VfaWN1 X2NvbGxhdG9yKGRhdGxvY2FsZSwgaWN1cnVsZXMsICZkZWZhdWx0X2xvY2FsZSk7CisJCWRlZmF1 bHRfbG9jYWxlLmluZm8uaWN1LmxvY2FsZSA9IE1lbW9yeUNvbnRleHRTdHJkdXAoVG9wTWVtb3J5 Q29udGV4dCwgZGF0bG9jYWxlKTsKKwkJZGVmYXVsdF9sb2NhbGUuaW5mby5pY3UudWNvbCA9IG1h a2VfaWN1X2NvbGxhdG9yKGRhdGxvY2FsZSwgaWN1cnVsZXMpOworI2Vsc2UJCQkJCQkJLyogbm90 IFVTRV9JQ1UgKi8KKwkJLyogY291bGQgZ2V0IGhlcmUgaWYgYSBjb2xsYXRpb24gd2FzIGNyZWF0 ZWQgYnkgYSBidWlsZCB3aXRoIElDVSAqLworCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2Rl KEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKKwkJCQkgZXJybXNnKCJJQ1UgaXMgbm90 IHN1cHBvcnRlZCBpbiB0aGlzIGJ1aWxkIikpKTsKKyNlbmRpZgkJCQkJCQkvKiBub3QgVVNFX0lD VSAqLwogCX0KIAllbHNlCiAJewpAQCAtMTQ4Myw3ICsxNTE0LDcgQEAgaW5pdF9kYXRhYmFzZV9j b2xsYXRpb24odm9pZCkKIAkJZGVmYXVsdF9sb2NhbGUuY3R5cGVfaXNfYyA9IChzdHJjbXAoZGF0 Y3R5cGUsICJDIikgPT0gMCkgfHwKIAkJCShzdHJjbXAoZGF0Y3R5cGUsICJQT1NJWCIpID09IDAp OwogCi0JCW1ha2VfbGliY19jb2xsYXRvcihkYXRjb2xsYXRlLCBkYXRjdHlwZSwgJmRlZmF1bHRf bG9jYWxlKTsKKwkJZGVmYXVsdF9sb2NhbGUuaW5mby5sdCA9IG1ha2VfbGliY19jb2xsYXRvcihk YXRjb2xsYXRlLCBkYXRjdHlwZSk7CiAJfQogCiAJZGVmYXVsdF9sb2NhbGUucHJvdmlkZXIgPSBk YmZvcm0tPmRhdGxvY3Byb3ZpZGVyOwpAQCAtMTU3Miw3ICsxNjAzLDcgQEAgcGdfbmV3bG9jYWxl X2Zyb21fY29sbGF0aW9uKE9pZCBjb2xsaWQpCiAJCQlyZXN1bHQuY3R5cGVfaXNfYyA9IChzdHJj bXAoY29sbGN0eXBlLCAiQyIpID09IDApIHx8CiAJCQkJKHN0cmNtcChjb2xsY3R5cGUsICJQT1NJ WCIpID09IDApOwogCi0JCQltYWtlX2xpYmNfY29sbGF0b3IoY29sbGNvbGxhdGUsIGNvbGxjdHlw ZSwgJnJlc3VsdCk7CisJCQlyZXN1bHQuaW5mby5sdCA9IG1ha2VfbGliY19jb2xsYXRvcihjb2xs Y29sbGF0ZSwgY29sbGN0eXBlKTsKIAkJfQogCQllbHNlIGlmIChjb2xsZm9ybS0+Y29sbHByb3Zp ZGVyID09IENPTExQUk9WSURFUl9JQ1UpCiAJCXsKQEAgLTE1OTEsNyArMTYyMiw4IEBAIHBnX25l d2xvY2FsZV9mcm9tX2NvbGxhdGlvbihPaWQgY29sbGlkKQogCQkJZWxzZQogCQkJCWljdXJ1bGVz ID0gTlVMTDsKIAotCQkJbWFrZV9pY3VfY29sbGF0b3IoaWN1bG9jc3RyLCBpY3VydWxlcywgJnJl c3VsdCk7CisJCQlyZXN1bHQuaW5mby5pY3UubG9jYWxlID0gTWVtb3J5Q29udGV4dFN0cmR1cChU b3BNZW1vcnlDb250ZXh0LCBpY3Vsb2NzdHIpOworCQkJcmVzdWx0LmluZm8uaWN1LnVjb2wgPSBt YWtlX2ljdV9jb2xsYXRvcihpY3Vsb2NzdHIsIGljdXJ1bGVzKTsKIAkJfQogCiAJCWRhdHVtID0g U3lzQ2FjaGVHZXRBdHRyKENPTExPSUQsIHRwLCBBbnVtX3BnX2NvbGxhdGlvbl9jb2xsdmVyc2lv biwKQEAgLTI1MDAsNiArMjUzMiw4IEBAIGJ1aWx0aW5fdmFsaWRhdGVfbG9jYWxlKGludCBlbmNv ZGluZywgY29uc3QgY2hhciAqbG9jYWxlKQogLyoKICAqIFdyYXBwZXIgYXJvdW5kIHVjb2xfb3Bl bigpIHRvIGhhbmRsZSBBUEkgZGlmZmVyZW5jZXMgZm9yIG9sZGVyIElDVQogICogdmVyc2lvbnMu CisgKgorICogRW5zdXJlIHRoYXQgbm8gcGF0aCBsZWFrcyBhIFVDb2xsYXRvci4KICAqLwogc3Rh dGljIFVDb2xsYXRvciAqCiBwZ191Y29sX29wZW4oY29uc3QgY2hhciAqbG9jX3N0cikKZGlmZiAt LWdpdCBhL3NyYy9pbmNsdWRlL3V0aWxzL3BnX2xvY2FsZS5oIGIvc3JjL2luY2x1ZGUvdXRpbHMv cGdfbG9jYWxlLmgKaW5kZXggZmFhZTg2OGJmY2MuLmMyZDk1NDExZTBhIDEwMDY0NAotLS0gYS9z cmMvaW5jbHVkZS91dGlscy9wZ19sb2NhbGUuaAorKysgYi9zcmMvaW5jbHVkZS91dGlscy9wZ19s b2NhbGUuaApAQCAtMTA0LDEwICsxMDQsNiBAQCBzdHJ1Y3QgcGdfbG9jYWxlX3N0cnVjdAogCiB0 eXBlZGVmIHN0cnVjdCBwZ19sb2NhbGVfc3RydWN0ICpwZ19sb2NhbGVfdDsKIAotZXh0ZXJuIHZv aWQgbWFrZV9pY3VfY29sbGF0b3IoY29uc3QgY2hhciAqaWN1bG9jc3RyLAotCQkJCQkJCSAgY29u c3QgY2hhciAqaWN1cnVsZXMsCi0JCQkJCQkJICBzdHJ1Y3QgcGdfbG9jYWxlX3N0cnVjdCAqcmVz dWx0cCk7Ci0KIGV4dGVybiB2b2lkIGluaXRfZGF0YWJhc2VfY29sbGF0aW9uKHZvaWQpOwogZXh0 ZXJuIHBnX2xvY2FsZV90IHBnX25ld2xvY2FsZV9mcm9tX2NvbGxhdGlvbihPaWQgY29sbGlkKTsK IAotLSAKMi4zNC4xCgo= --=-reTqxxA0+F50OXMUZ9aK--