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.96) (envelope-from ) id 1w64vG-003vhv-10 for pgsql-hackers@arkaria.postgresql.org; Fri, 27 Mar 2026 11:00:14 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w64vE-009Ebv-2V for pgsql-hackers@arkaria.postgresql.org; Fri, 27 Mar 2026 11:00:13 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w64vE-009Ebn-0u for pgsql-hackers@lists.postgresql.org; Fri, 27 Mar 2026 11:00:12 +0000 Received: from mail-lj1-x234.google.com ([2a00:1450:4864:20::234]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w64vC-00000001Smx-0VVe for pgsql-hackers@lists.postgresql.org; Fri, 27 Mar 2026 11:00:12 +0000 Received: by mail-lj1-x234.google.com with SMTP id 38308e7fff4ca-38a32d36396so16945531fa.0 for ; Fri, 27 Mar 2026 04:00:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1774609209; cv=none; d=google.com; s=arc-20240605; b=Z8wSCkCniRWWchuPKHWTBmEiwvfi2VFXiDqZciwJ0qK1IFKkuTZdycamdG1/bRr/CQ +sFEeOMYBiPEzyEBTIvGJCEMm1e5giqMU16R52PMEXyepvVzmY4noxWnVD+f+p9v88Io WpQQNq2wfGJ41oe2DmrYQhDJbA1YRzldRaAQTjxBZe6xRnLEvLLueL/vSRhwUmOj6pdW r5cq6GQFhQK5RNrhHVnvh3rpKTBLhuew0vnGVFjaqKpvuNMZPNtrUY8oicFeXJbPB+to 1kgZV0eBIR/7IQmR3VjxQQGsMju7vJ5NKXS8yunIyGkc+dIqd+psRPTqBjNAGCBuZbLf NRvg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=y0dHij1nRPJZGLOrD1YZUEHm4zgMqS7QaNf3GQ77qn0=; fh=5qzrJ2QvhSbUYEgrVw+LqtAjmAlSxsdRqAWeiLx/2Ac=; b=Kp58PjHrJy6giTUmQMIfplCSncs/4SlwODscp4TQpciywSu6ONYYG7h4hWouIFHJZH KOPAd08jrtFTdIGaHpB4Ge4uZt/aoTvIUqW+CZUoz4hGZwB8TiKAc3GKi4tmXc+7aZA6 Kw2q3XW+2CDjfn+8QaPC000wueYft+Lm1D+wiIXGfTVSJtCWjlK+kF0cYE0kPBig/dfw JN30yGy07DeMbFuHZBc7fRZWB2pu8g3L3USQ/UWVHHDEhov5cCj0q7O/b+Glo7MGP2N+ n+F05JqWpatmcimt5Q1dDjCP79Zk1Jvcg4lO50Xq3kt5at2LKYiqNlueGO7sgnf+3+E5 Dhpg==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774609209; x=1775214009; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=y0dHij1nRPJZGLOrD1YZUEHm4zgMqS7QaNf3GQ77qn0=; b=k85GpwXYazovVNNltQyp/AYcXh8G8d+m6bINdm3TAW/nSVSkNF5P8IOQ9e5NL8qfWn aXg2cT3dig54H/xEx7LoXXD8DxxX1p1MP3shaueFfgDNK4vwk8i/77XnGwdD/YJsVrhq a+49cKFnad3AFZ/fCZKQoANLRIFbIQ5kwpwOWxAErENnUX4bfn4wPLl+sB8VH8ZgN8H8 yDDFYPnwyPOhtAUYiUJHSgu+x8HhRqtidfbJL3uOXdsj6ZV/cSwwJFictyDD/9c+XBoO hn4p6I8QgrG8upnVWe+OSif06onha5dTEFfm8r1WwNPLxuq1w4tMqNy3t8ZwzCsqw+3E hA+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774609209; x=1775214009; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=y0dHij1nRPJZGLOrD1YZUEHm4zgMqS7QaNf3GQ77qn0=; b=Dg+i6mlmn6nob4SUQQwM1UUZkK+Wggq6GqpPCTIdQKfP6BdW/G8hTKlKQyA9HNWZuE tWK5/Bc6dIgQkXGYhFKPmhcpN9TbuE5TDj8xEiEzYKubTns5kE7fxg1MSJ/TveEiCvSA pvIMXkdg3UW7GfTBV4811h5uqa2aLjzUgBCG6NrlPHKlBVFTtADJHUlOqywTOWAA+Hq4 I4pCHtgoBMkD24jg57ukBT27aoCgeVghx2BYZlzZOX6dR/NkKwLpu2bdULhiN35+dHrm J4xK5reislVc5y+mHpvlirKjhan9WgvCPZtzrXx5Q25MPf0VdBtT7sI9mg37K/H+WD+y J3Ew== X-Forwarded-Encrypted: i=1; AJvYcCUm0w8ttJ8rD255wk/aKh3dDJoLFQ8+h/N50NhIdaTA2zakLOmVqKmuWY4sFKTw5PpTDBiUJwkXQY9lX0oJ@lists.postgresql.org X-Gm-Message-State: AOJu0YyrRBvdiGGfwKWPjyXqx7VMn2I0xb+Bu7FGrA0QK34boQezfZmY 9XMsmlp7uysytQoYVBf/zlxZTqUa+d1lm0MapV54B/50Bduwc7s2fD1ZnjTLOfSYhxQJmUwgskc DClLZoG6BTCPsnMnOGI0z5bUfhkx3u4k= X-Gm-Gg: ATEYQzyflNDNYmE9/E85XIrmc7F7+lP+b4Sqz2AF1Q+0agkYVoNzkvqsB17EhTm2rcy oTA82/vG3kBgAbOXD0W4VDIURrzadbo1qufsFoRgMOZSsTDQUfvbBYlYmujXpF4C5226euRjBLP 4y7YEbz45xwpzv9ATmz4sXzOjl6AcD5SnQ5DzXcGJxP/6lvgsWMWHPUTM+jlpFuETfrJvgmzhZ1 1oEgIIqBuhGK3YRN9p97YkffRIjwRix2yOQRlB0M5t1ILTG+K09ga3JIkNFAs+9rxLkDftbAYGF zFmF0XwJANEtaswcE9oY8iP/A5/F9KTBcq/5BMRntA== X-Received: by 2002:a2e:a54f:0:b0:38a:2a56:9546 with SMTP id 38308e7fff4ca-38c75c900demr6008811fa.13.1774609208871; Fri, 27 Mar 2026 04:00:08 -0700 (PDT) MIME-Version: 1.0 References: <7F3C1A8B-F0FF-49BF-A53C-DC043BBB1FE7@yesql.se> In-Reply-To: From: Ajit Awekar Date: Fri, 27 Mar 2026 16:29:57 +0530 X-Gm-Features: AQROBzDhrePnJrzyEM3fTUB_Y8lB0Q3z2i8nni8-pRmgpJ5qppXPXf-IMC0T98Y Message-ID: Subject: Re: [OAuth2] Infrastructure for tracking token expiry time To: Zsolt Parragi Cc: Daniel Gustafsson , VASUKI M , PostgreSQL Hackers Content-Type: multipart/mixed; boundary="00000000000082b155064dff67ce" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000082b155064dff67ce Content-Type: multipart/alternative; boundary="00000000000082b153064dff67cc" --00000000000082b153064dff67cc Content-Type: text/plain; charset="UTF-8" Hi All, I'd like to propose a patch that adds a credential validation framework to PostgreSQL, enabling periodic re-validation of authentication credentials during active sessions. Currently, PostgreSQL validates credentials only at connection time. Once authenticated, a session remains valid even if the underlying credentials expire (e.g., a user's rolvaliduntil passes, or an OAuth token expires). This can be problematic in environments with strict security requirements where sessions should be terminated when credentials become invalid. This patch introduces a timer-based credential validation mechanism that periodically checks whether a session's authentication credentials are still valid. When credentials are found to be expired, the session is terminated with an appropriate error message *Key Components * 1. Core Framework (auth-validate.c, auth-validate.h) - Manages validation callbacks for different authentication methods - Provides a timeout-based scheduler using CREDENTIAL_VALIDATION_TIMEOUT - Handles validation status (CVS_VALID, CVS_EXPIRED, CVS_ERROR) 2. Validation Methods (auth-validate-methods.c) - Password validation: checks rolvaliduntil in pg_authid - OAuth validation: delegates to the validator module's new expire_cb callback 3. GUC Parameters - credential_validation.enabled (boolean, default: false) - credential_validation.interval (integer, 1-60 minutes, default: 1) *OAuth Validator Changes * The patch extends the OAuth validator API with an optional expire_cb callback. To maintain backward compatibility, the magic version has been bumped to PG_OAUTH_VALIDATOR_MAGIC_V2. Existing V1 validators continue to work; the server simply skips expiration checking for them. *Example Configuration* credential_validation.enabled = on credential_validation.interval = 5 # minutes Thanks & Best Regards, Ajit On Mon, 16 Mar 2026 at 19:27, Ajit Awekar wrote: > Hi, > > Please find the attached first version of the patch providing credential > validation framework. > > The credential validation framework provides a mechanism to continuously > validate authentication credentials during an active session. This enables > the server to periodically check credential validity and take appropriate > action when credentials expire or become invalid. > > Currently, Postgres validates credentials only at connection time. Once > authenticated, a session remains active even if: > > - A user's rolvaliduntil expiration time passes > - An OAuth bearer token expires > > > > * Proposed Solution* > The patch introduces a credential validation framework that: > > 1. Periodically checks credential validity during active sessions > 2. Terminates sessions when credentials expire or become invalid > > *Implementation* > > The framework consists of: > > - Core infrastructure (auth-validate.c/h): Manages validation callbacks, > dispatches validation checks based on authentication method > - Method implementations (auth-validate-methods.c/h): Contains > validators for password-based auth (checks rolvaliduntil in pg_authid) and > OAuth > (delegates to validator's expire_cb) > > Validation is triggered during query execution in both simple and > extended query protocol paths, using a time-based approach to limit > overhead. > > > * Configuration* > Two new GUC parameters: > > credential_validation.enabled = false # enable/disable validation > credential_validation.interval = 1 # check interval in minutes > (1-60) > > > * Extensibility* > New authentication methods can be supported by: > 1. Adding an enum value to CredentialValidationType > 2. Implementing a validation callback > 3. Registering it via RegisterCredentialValidator() > > > Should there be per-authentication-method enable/disable settings? > > Thanks & Best Regards, > Ajit > > > On Fri, 20 Feb 2026 at 15:12, Ajit Awekar wrote: > >> >> Thanks a lot Daniel, Zslot, Vasuki for your review comments. >> >> >The mechanism used is however a secondary discussion, >> >first thing to get in place is a design for how to handle mid-connection >> >credential expiration. >> >> This patch introduces a generic credential validation framework that >> allows >> us to periodically validate authentication credentials during active >> database sessions. When enabled, this feature detects expired >> credentials and terminates sessions that are no longer valid. >> >> Added GUCs >> Credential_validation.enabled = on // Enable or Disable Credential >> validation >> Credential_validation.interval = 120 //Frequency in seconds of running >> credential validation >> >> The callback mechanism works by: >> - Defining a CredentialValidationCallback function pointer type >> - Maintaining an array of validators indexed by authentication method >> - Allowing other auth mechanisms to register validators via >> RegisterCredentialValidator() >> - Selecting the appropriate validator at runtime based on the session's >> authentication method >> >> The current implementation primarily supports password-based >> authentication methods, verifying that passwords haven't expired. It can be >> extended to any authentication method. >> This patch is WIP. I am submitting it now to get early feedback on the >> overall design and approach. >> >> Thanks & Best Regards, >> Ajit >> >> On Wed, 18 Feb 2026 at 22:29, Zsolt Parragi >> wrote: >> >>> > but I still think that neither should overload >>> > what FATAL error means >>> >>> I see, I misunderstood what you meant by graceful there. In this case, >>> this is also a good comment for the password expiration thread, >>> currently that also uses FATAL errors for terminating a connection >>> when the password expires. >>> >>> What other option do you see? Something new for this use case like >>> GoAway, and clients not understanding it simply get disconnected after >>> some grace period? Or using the recently merged connectionWarning to >>> send a warning to the client, and disconnect it shortly if it doesn't >>> do anything to fix the situation? >>> >>> When I tested the password expiration patch I noticed that deleted >>> users who still have remaining active connections currently get ERRORs >>> for every statement that requires permission checks, so in this regard >>> using ERROR/FATAL for the situation seemed fine to me - it's similar >>> to what already happens in some edge cases with authentication. >>> >> --00000000000082b153064dff67cc Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi All,

I'd like to propose a= patch that adds a credential validation framework to PostgreSQL, enabling = periodic re-validation of authentication
=C2=A0credentials during activ= e sessions.

Currently, PostgreSQL validates credentials = only at connection time. Once authenticated, a session remains valid even i= f the underlying =C2=A0 =C2=A0 =C2=A0 =C2=A0
credentials expire (e.g., = a user's rolvaliduntil passes, or an OAuth token expires). This can be = problematic in environments with strict
security requirements where sess= ions should be terminated when credentials become invalid.

This patch introduces a timer-based credential validation mechanis= m that periodically checks whether a session's authentication credentia= ls are
=C2=A0still valid. When credentials are found to be expire= d, the session is terminated with an appropriate error message
Key Components =C2=A0

=C2=A0 1. Core Framework (= auth-validate.c, auth-validate.h)
=C2=A0 =C2=A0 - Manages validation cal= lbacks for different authentication methods
=C2=A0 =C2=A0 - Provides a t= imeout-based scheduler using CREDENTIAL_VALIDATION_TIMEOUT =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0
=C2=A0 =C2=A0 - Handles validation status (CVS_VALID, CVS_EXP= IRED, CVS_ERROR)
=C2=A0 2. Validation Methods (auth-validate-methods.c) = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0
=C2=A0 =C2=A0 - Password vali= dation: checks rolvaliduntil in pg_authid =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0
=C2=A0 =C2=A0 - OAuth v= alidation: delegates to the validator module's new expire_cb callback=C2=A0 3. GUC Parameters =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0
=C2=A0 =C2=A0 - credential_validation.enabled = (boolean, default: false)
=C2=A0 =C2=A0 - credential_validation.interval= (integer, 1-60 minutes, default: 1)=C2=A0=C2=A0

<= b>OAuth Validator Changes =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 <= br>=C2=A0 The patch extends the OAuth validator API with an optional expire= _cb callback. To maintain backward compatibility, the magic version has bee= n
=C2=A0 bumped to PG_OAUTH_VALIDATOR_MAGIC_V2. Existing V1 validators c= ontinue to work; the server simply skips expiration checking for them.
<= /div>

Example Configuration

=C2=A0 credent= ial_validation.enabled =3D on
=C2=A0 credential_validation.interval =3D = 5 =C2=A0 # minutes=C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0

Thanks & Best Regards,
Ajit


On Mon, 16 Mar 2026 at 19:27, Ajit Awekar <ajitpostgres@gmail.com> wrote:
Hi,
Please find the attached first version of the patch provid= ing credential validation framework.=C2=A0

The cre= dential validation framework provides a mechanism to continuously validate = authentication credentials during an active=C2=A0session. This enables the = server to periodically check credential validity and take appropriate actio= n when credentials expire or become invalid.

=C2= =A0 Currently, Postgres validates credentials only at connection time. Once= authenticated, a session remains active even if:

=C2=A0 - A user= 9;s rolvaliduntil expiration time passes
=C2=A0 - An OAuth bearer token = expires


=C2=A0Proposed Solution
=
=C2=A0 The patch introduces a credential validation framework that:
=
=C2=A0 1. Periodically checks credential validity during active session= s
=C2=A0 2. Terminates sessions when credentials expire or become invali= d

Implementation

=C2=A0 The framework consists of:
=
=C2=A0 - Core infrastructure (auth-validate.c/h): Manages validation ca= llbacks, dispatches validation checks based on authentication method
=C2= =A0 - Method implementations (auth-validate-methods.c/h): Contains validato= rs for password-based auth (checks rolvaliduntil in pg_authid) and OAuth=C2=A0 (delegates to validator's expire_cb)

=C2=A0 Validation i= s triggered during query execution in both simple and extended query protoc= ol paths, using a time-based approach to limit overhead.

=C2=A0 C= onfiguration

=C2=A0 Two new GUC parameters:

=C2=A0 creden= tial_validation.enabled =3D false =C2=A0 # enable/disable validation
=C2= =A0 credential_validation.interval =3D 1 =C2=A0 =C2=A0 =C2=A0# check interv= al in minutes (1-60)

=C2=A0Extensibility
=C2=A0 New authentication methods can be supported by:
=C2=A0 1= . Adding an enum value to CredentialValidationType
=C2=A0 2. Implementin= g a validation callback
=C2=A0 3. Registering it via RegisterCredentialV= alidator()


=C2=A0Should there be pe= r-authentication-method enable/disable settings?

T= hanks & Best Regards,
Ajit


On = Fri, 20 Feb 2026 at 15:12, Ajit Awekar <ajitpostgres@gmail.com> wrote:
=

Thanks a lot Daniel, Zslot, Vasuki for your review=C2=A0comments.

>The mechanism used is however a secondary discussion,<= br>>first thing to get in place is a design for how to handle mid-connec= tion
>credential expiration.

This patch introduces= a generic credential validation framework that allows =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0
= =C2=A0us to periodically validate authentication credentials during active<= br>=C2=A0database sessions. When enabled, this feature detects expired=C2= =A0
=C2=A0credentials and terminates sessions that are no longer valid.<= br>=C2=A0
=C2=A0Added GUCs
Credential_validation.enabled =3D on =C2= =A0 // Enable or Disable Credential validation
Credential_validation.int= erval =3D 120 =C2=A0//Frequency in seconds of running credential validation=

=C2=A0The callback mechanism works by:
=C2=A0 - Defining a Crede= ntialValidationCallback function pointer type
=C2=A0 - Maintaining an ar= ray of validators indexed by authentication method
=C2=A0 - Allowing oth= er auth mechanisms to register validators via
=C2=A0 =C2=A0 RegisterCred= entialValidator()
=C2=A0 - Selecting the appropriate validator at runtim= e based on the session's
=C2=A0 =C2=A0 authentication method

= The current implementation primarily supports password-based authentication= methods, verifying that passwords haven't expired. It can be extended = to any authentication method.
This patch is WIP. I am submitting it now = to get early feedback on the overall design and approach.
=C2=A0=C2=A0
Thanks & Best Regards,
Ajit

On= Wed, 18 Feb 2026 at 22:29, Zsolt Parragi <zsolt.parragi@percona.com> wrote:<= br>
> but I still= think that neither should overload
> what FATAL error means

I see, I misunderstood what you meant by graceful there. In this case,
this is also a good comment for the password expiration thread,
currently that also uses FATAL errors for terminating a connection
when the password expires.

What other option do you see? Something new for this use case like
GoAway, and clients not understanding it simply get disconnected after
some grace period? Or using the recently merged connectionWarning to
send a warning to the client, and disconnect it shortly if it doesn't do anything to fix the situation?

When I tested the password expiration patch I noticed that deleted
users who still have remaining active connections currently get ERRORs
for every statement that requires permission checks, so in this regard
using ERROR/FATAL for the situation seemed fine to me - it's similar to what already happens in some edge cases with authentication.
--00000000000082b153064dff67cc-- --00000000000082b155064dff67ce Content-Type: application/octet-stream; name="Credential_validation.patch" Content-Disposition: attachment; filename="Credential_validation.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mn8shh8g0 ZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9vYXV0aC12YWxpZGF0b3JzLnNnbWwgYi9kb2Mvc3Jj L3NnbWwvb2F1dGgtdmFsaWRhdG9ycy5zZ21sCmluZGV4IDcwNDA4OWRkN2IzLi4wNWM2MjZiYWI5 MyAxMDA2NDQKLS0tIGEvZG9jL3NyYy9zZ21sL29hdXRoLXZhbGlkYXRvcnMuc2dtbAorKysgYi9k b2Mvc3JjL3NnbWwvb2F1dGgtdmFsaWRhdG9ycy5zZ21sCkBAIC0zMTIsNiArMzEyLDcgQEAgdHlw ZWRlZiBzdHJ1Y3QgT0F1dGhWYWxpZGF0b3JDYWxsYmFja3MKICAgICBWYWxpZGF0b3JTdGFydHVw Q0Igc3RhcnR1cF9jYjsKICAgICBWYWxpZGF0b3JTaHV0ZG93bkNCIHNodXRkb3duX2NiOwogICAg IFZhbGlkYXRvclZhbGlkYXRlQ0IgdmFsaWRhdGVfY2I7CisgICAgVmFsaWRhdG9yRXhwaXJlQ0Ig ZXhwaXJlX2NiOyAgICAvKiBPcHRpb25hbDogY2hlY2sgdG9rZW4gZXhwaXJhdGlvbiAqLwogfSBP QXV0aFZhbGlkYXRvckNhbGxiYWNrczsKIAogdHlwZWRlZiBjb25zdCBPQXV0aFZhbGlkYXRvckNh bGxiYWNrcyAqKCpPQXV0aFZhbGlkYXRvck1vZHVsZUluaXQpICh2b2lkKTsKQEAgLTMyMCw2ICsz MjEsMTUgQEAgdHlwZWRlZiBjb25zdCBPQXV0aFZhbGlkYXRvckNhbGxiYWNrcyAqKCpPQXV0aFZh bGlkYXRvck1vZHVsZUluaXQpICh2b2lkKTsKICAgIE9ubHkgdGhlIDxmdW5jdGlvbj52YWxpZGF0 ZV9jYjwvZnVuY3Rpb24+IGNhbGxiYWNrIGlzIHJlcXVpcmVkLCB0aGUgb3RoZXJzCiAgICBhcmUg b3B0aW9uYWwuCiAgIDwvcGFyYT4KKyAgPHBhcmE+CisgICBUaGUgPGxpdGVyYWw+bWFnaWM8L2xp dGVyYWw+IGZpZWxkIGlkZW50aWZpZXMgdGhlIEFCSSB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUuCisg ICBUaGUgc2VydmVyIHN1cHBvcnRzIGJvdGggPGxpdGVyYWw+UEdfT0FVVEhfVkFMSURBVE9SX01B R0lDX1YxPC9saXRlcmFsPiAodGhlCisgICBvcmlnaW5hbCB2ZXJzaW9uIHdpdGhvdXQgPGZ1bmN0 aW9uPmV4cGlyZV9jYjwvZnVuY3Rpb24+KSBhbmQKKyAgIDxsaXRlcmFsPlBHX09BVVRIX1ZBTElE QVRPUl9NQUdJQ19WMjwvbGl0ZXJhbD4gKHdoaWNoIGFkZHMKKyAgIDxmdW5jdGlvbj5leHBpcmVf Y2I8L2Z1bmN0aW9uPikuICBOZXcgbW9kdWxlcyBzaG91bGQgdXNlCisgICA8bGl0ZXJhbD5QR19P QVVUSF9WQUxJREFUT1JfTUFHSUM8L2xpdGVyYWw+LCB3aGljaCBhbHdheXMgcmVmZXJzIHRvIHRo ZQorICAgbGF0ZXN0IHZlcnNpb24uCisgIDwvcGFyYT4KICA8L3NlY3QxPgogCiAgPHNlY3QxIGlk PSJvYXV0aC12YWxpZGF0b3ItY2FsbGJhY2tzIj4KQEAgLTQxMiw1ICs0MjIsMjcgQEAgdHlwZWRl ZiB2b2lkICgqVmFsaWRhdG9yU2h1dGRvd25DQikgKFZhbGlkYXRvck1vZHVsZVN0YXRlICpzdGF0 ZSk7CiAgICA8L3BhcmE+CiAgIDwvc2VjdDI+CiAKKyAgPHNlY3QyIGlkPSJvYXV0aC12YWxpZGF0 b3ItY2FsbGJhY2stZXhwaXJlIj4KKyAgIDx0aXRsZT5FeHBpcmUgQ2FsbGJhY2s8L3RpdGxlPgor ICAgPHBhcmE+CisgICAgVGhlIDxmdW5jdGlvbj5leHBpcmVfY2I8L2Z1bmN0aW9uPiBjYWxsYmFj ayBpcyBhbiBvcHRpb25hbCBjYWxsYmFjayB0aGF0CisgICAgY2FuIGJlIHVzZWQgdG8gY2hlY2sg d2hldGhlciB0aGUgT0F1dGggdG9rZW4gaGFzIGV4cGlyZWQuIFRoaXMgaXMgY2FsbGVkCisgICAg ZHVyaW5nIGNyZWRlbnRpYWwgdmFsaWRhdGlvbiB0byB2ZXJpZnkgdGhhdCB0aGUgdG9rZW4gaXMg c3RpbGwgdmFsaWQuCis8cHJvZ3JhbWxpc3Rpbmc+Cit0eXBlZGVmIGJvb2wgKCpWYWxpZGF0b3JF eHBpcmVDQikgKGNvbnN0IFZhbGlkYXRvck1vZHVsZVN0YXRlICpzdGF0ZSk7Cis8L3Byb2dyYW1s aXN0aW5nPgorICAgIFRoZSBjYWxsYmFjayBzaG91bGQgcmV0dXJuIDxsaXRlcmFsPnRydWU8L2xp dGVyYWw+IGlmIHRoZSB0b2tlbiBpcyBzdGlsbAorICAgIHZhbGlkLCBvciA8bGl0ZXJhbD5mYWxz ZTwvbGl0ZXJhbD4gaWYgdGhlIHRva2VuIGhhcyBleHBpcmVkLiBJZiB0aGlzCisgICAgY2FsbGJh Y2sgaXMgbm90IHByb3ZpZGVkIChzZXQgdG8gTlVMTCksIHRoZSBzZXJ2ZXIgYXNzdW1lcyB0aGUg dG9rZW4KKyAgICByZW1haW5zIHZhbGlkLgorICAgPC9wYXJhPgorICAgPHBhcmE+CisgICAgVGhp cyBjYWxsYmFjayB3YXMgYWRkZWQgaW4gPGxpdGVyYWw+UEdfT0FVVEhfVkFMSURBVE9SX01BR0lD X1YyPC9saXRlcmFsPi4KKyAgICBNb2R1bGVzIGNvbXBpbGVkIGFnYWluc3QgdGhlIG9sZGVyIDxs aXRlcmFsPlBHX09BVVRIX1ZBTElEQVRPUl9NQUdJQ19WMTwvbGl0ZXJhbD4KKyAgICBkbyBub3Qg aGF2ZSB0aGlzIGZpZWxkLCBhbmQgdGhlIHNlcnZlciB3aWxsIG5vdCBhdHRlbXB0IHRvIGNhbGwg aXQgZm9yCisgICAgc3VjaCBtb2R1bGVzLgorICAgPC9wYXJhPgorICA8L3NlY3QyPgorCiAgPC9z ZWN0MT4KIDwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2xpYnBxL01ha2VmaWxl IGIvc3JjL2JhY2tlbmQvbGlicHEvTWFrZWZpbGUKaW5kZXggOThlYjJhODI0MmQuLjMyZTRjNzI4 MGU1IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9saWJwcS9NYWtlZmlsZQorKysgYi9zcmMvYmFj a2VuZC9saWJwcS9NYWtlZmlsZQpAQCAtMTgsNiArMTgsOCBAQCBPQkpTID0gXAogCWF1dGgtb2F1 dGgubyBcCiAJYXV0aC1zYXNsLm8gXAogCWF1dGgtc2NyYW0ubyBcCisJYXV0aC12YWxpZGF0ZS1t ZXRob2RzLm8gXAorCWF1dGgtdmFsaWRhdGUubyBcCiAJYXV0aC5vIFwKIAliZS1mc3N0dWJzLm8g XAogCWJlLXNlY3VyZS1jb21tb24ubyBcCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9saWJwcS9h dXRoLW9hdXRoLmMgYi9zcmMvYmFja2VuZC9saWJwcS9hdXRoLW9hdXRoLmMKaW5kZXggMTEzNjUw NDg5NTEuLjQ5NTIzNDM0M2MyIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9saWJwcS9hdXRoLW9h dXRoLmMKKysrIGIvc3JjL2JhY2tlbmQvbGlicHEvYXV0aC1vYXV0aC5jCkBAIC00Myw2ICs0Myw3 IEBAIHN0YXRpYyB2b2lkIHNodXRkb3duX3ZhbGlkYXRvcl9saWJyYXJ5KHZvaWQgKmFyZyk7CiAK IHN0YXRpYyBWYWxpZGF0b3JNb2R1bGVTdGF0ZSAqdmFsaWRhdG9yX21vZHVsZV9zdGF0ZTsKIHN0 YXRpYyBjb25zdCBPQXV0aFZhbGlkYXRvckNhbGxiYWNrcyAqVmFsaWRhdG9yQ2FsbGJhY2tzOwor c3RhdGljIGludCBWYWxpZGF0b3JBQklWZXJzaW9uOwkJLyogdHJhY2tzIFYxIHZzIFYyIG1vZHVs ZSBBQkkgKi8KIAogLyogTWVjaGFuaXNtIGRlY2xhcmF0aW9uICovCiBjb25zdCBwZ19iZV9zYXNs X21lY2ggcGdfYmVfb2F1dGhfbWVjaCA9IHsKQEAgLTc2NywxMyArNzY4LDIyIEBAIGxvYWRfdmFs aWRhdG9yX2xpYnJhcnkoY29uc3QgY2hhciAqbGlibmFtZSkKIAkgKiBDaGVjayB0aGUgbWFnaWMg bnVtYmVyLCB0byBwcm90ZWN0IGFnYWluc3QgYnJlYWstZ2xhc3Mgc2NlbmFyaW9zIHdoZXJlCiAJ ICogdGhlIEFCSSBtdXN0IGNoYW5nZSB3aXRoaW4gYSBtYWpvciB2ZXJzaW9uLiBsb2FkX2V4dGVy bmFsX2Z1bmN0aW9uKCkKIAkgKiBhbHJlYWR5IGNoZWNrcyBmb3IgY29tcGF0aWJpbGl0eSBhY3Jv c3MgbWFqb3IgdmVyc2lvbnMuCisJICoKKwkgKiBXZSBhY2NlcHQgYm90aCBWMSBhbmQgVjIgbWFn aWMgbnVtYmVycyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKwkgKiBWMSBtb2R1bGVzIGRv bid0IGhhdmUgdGhlIGV4cGlyZV9jYiBmaWVsZCwgc28gd2UgdHJhY2sgdGhlIHZlcnNpb24KKwkg KiB0byBhdm9pZCBhY2Nlc3Npbmcgbm9uLWV4aXN0ZW50IHN0cnVjdCBtZW1iZXJzLgogCSAqLwot CWlmIChWYWxpZGF0b3JDYWxsYmFja3MtPm1hZ2ljICE9IFBHX09BVVRIX1ZBTElEQVRPUl9NQUdJ QykKKwlpZiAoVmFsaWRhdG9yQ2FsbGJhY2tzLT5tYWdpYyA9PSBQR19PQVVUSF9WQUxJREFUT1Jf TUFHSUNfVjIpCisJCVZhbGlkYXRvckFCSVZlcnNpb24gPSAyOworCWVsc2UgaWYgKFZhbGlkYXRv ckNhbGxiYWNrcy0+bWFnaWMgPT0gUEdfT0FVVEhfVkFMSURBVE9SX01BR0lDX1YxKQorCQlWYWxp ZGF0b3JBQklWZXJzaW9uID0gMTsKKwllbHNlCiAJCWVyZXBvcnQoRVJST1IsCiAJCQkJZXJybXNn KCIlcyBtb2R1bGUgXCIlc1wiOiBtYWdpYyBudW1iZXIgbWlzbWF0Y2giLAogCQkJCQkgICAiT0F1 dGggdmFsaWRhdG9yIiwgbGlibmFtZSksCi0JCQkJZXJyZGV0YWlsKCJTZXJ2ZXIgaGFzIG1hZ2lj IG51bWJlciAweCUwOFgsIG1vZHVsZSBoYXMgMHglMDhYLiIsCi0JCQkJCQkgIFBHX09BVVRIX1ZB TElEQVRPUl9NQUdJQywgVmFsaWRhdG9yQ2FsbGJhY2tzLT5tYWdpYykpOworCQkJCWVycmRldGFp bCgiU2VydmVyIGV4cGVjdHMgbWFnaWMgbnVtYmVyIDB4JTA4WCBvciAweCUwOFgsIG1vZHVsZSBo YXMgMHglMDhYLiIsCisJCQkJCQkgIFBHX09BVVRIX1ZBTElEQVRPUl9NQUdJQ19WMiwgUEdfT0FV VEhfVkFMSURBVE9SX01BR0lDX1YxLAorCQkJCQkJICBWYWxpZGF0b3JDYWxsYmFja3MtPm1hZ2lj KSk7CiAKIAkvKgogCSAqIE1ha2Ugc3VyZSBhbGwgcmVxdWlyZWQgY2FsbGJhY2tzIGFyZSBwcmVz ZW50IGluIHRoZSBWYWxpZGF0b3JDYWxsYmFja3MKQEAgLTg5MiwzICs5MDIsMjQgQEAgZG9uZToK IAogCXJldHVybiAoKmVycl9tc2cgPT0gTlVMTCk7CiB9CisKKy8qCisgKiBDaGVjayBpZiBhbiBP QXV0aCB0b2tlbiBoYXMgZXhwaXJlZC4KKyAqIFRoaXMgaXMgY2FsbGVkIGZyb20gY3JlZGVudGlh bCB2YWxpZGF0aW9uIHRvIGNoZWNrIHRva2VuIHZhbGlkaXR5LgorICovCitib29sCitDaGVja09B dXRoVmFsaWRhdG9yRXhwaXJhdGlvbih2b2lkKQoreworCS8qCisJICogRGVsZWdhdGUgdG8gdmFs aWRhdG9yJ3MgZXhwaXJlX2NiIGlmIGF2YWlsYWJsZS4gIE9ubHkgVjIrIG1vZHVsZXMgaGF2ZQor CSAqIHRoZSBleHBpcmVfY2IgZmllbGQsIHNvIHdlIG11c3QgY2hlY2sgdGhlIEFCSSB2ZXJzaW9u IGJlZm9yZSBhY2Nlc3NpbmcKKwkgKiBpdCB0byBtYWludGFpbiBiYWNrd2FyZCBjb21wYXRpYmls aXR5IHdpdGggVjEgbW9kdWxlcy4KKwkgKi8KKwlpZiAoVmFsaWRhdG9yQ2FsbGJhY2tzICE9IE5V TEwgJiYKKwkJVmFsaWRhdG9yQUJJVmVyc2lvbiA+PSAyICYmCisJCVZhbGlkYXRvckNhbGxiYWNr cy0+ZXhwaXJlX2NiICE9IE5VTEwpCisJCXJldHVybiBWYWxpZGF0b3JDYWxsYmFja3MtPmV4cGly ZV9jYih2YWxpZGF0b3JfbW9kdWxlX3N0YXRlKTsKKworCS8qIFYxIG1vZHVsZSBvciBubyBleHBp cmVfY2IsIGFzc3VtZSB0b2tlbiBpcyB2YWxpZCAqLworCXJldHVybiB0cnVlOworfQpkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvbGlicHEvYXV0aC12YWxpZGF0ZS1tZXRob2RzLmMgYi9zcmMvYmFj a2VuZC9saWJwcS9hdXRoLXZhbGlkYXRlLW1ldGhvZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMDAwMC4uZjY1MTY0NTk2MjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYmFj a2VuZC9saWJwcS9hdXRoLXZhbGlkYXRlLW1ldGhvZHMuYwpAQCAtMCwwICsxLDEzNiBAQAorLyot LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgKgorICogYXV0aC12YWxpZGF0ZS1tZXRob2RzLmMKKyAqICAgICAg SW1wbGVtZW50YXRpb24gb2YgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbCB2YWxpZGF0aW9uIG1l dGhvZHMKKyAqCisgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBjcmVkZW50aWFsIHZhbGlkYXRpb24g bWV0aG9kcyBmb3IgdmFyaW91cyBhdXRoZW50aWNhdGlvbgorICogdHlwZXMgZHVyaW5nIGFjdGl2 ZSBQb3N0Z3JlU1FMIHNlc3Npb25zLiBJdCBpbmNsdWRlcyB2YWxpZGF0aW9uIGZvciBwYXNzd29y ZAorICogZXhwaXJ5LCBPQXV0aCB0b2tlbiBleHBpcnksIGFuZCBjYW4gYmUgZXh0ZW5kZWQgdG8g b3RoZXIgYXV0aGVudGljYXRpb24KKyAqIG1lY2hhbmlzbXMuCisgKgorICogUG9ydGlvbnMgQ29w eXJpZ2h0IChjKSAxOTk2LTIwMjYsIFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdyb3Vw CisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTQsIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNp dHkgb2YgQ2FsaWZvcm5pYQorICoKKyAqIElERU5USUZJQ0FUSU9OCisgKiAgICAgIHNyYy9iYWNr ZW5kL2xpYnBxL2F1dGgtdmFsaWRhdGUtbWV0aG9kcy5jCisgKgorICotLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgKi8KKyNpbmNsdWRlICJwb3N0Z3Jlcy5oIgorCisjaW5jbHVkZSAiYWNjZXNzL2h0dXBfZGV0 YWlscy5oIgorI2luY2x1ZGUgImFjY2Vzcy94YWN0LmgiCisjaW5jbHVkZSAiY2F0YWxvZy9wZ19h dXRoaWQuaCIKKyNpbmNsdWRlICJjYXRhbG9nL2NhdGFsb2cuaCIKKyNpbmNsdWRlICJsaWJwcS9h dXRoLXZhbGlkYXRlLmgiCisjaW5jbHVkZSAibGlicHEvbGlicHEtYmUuaCIKKyNpbmNsdWRlICJs aWJwcS9vYXV0aC5oIgorI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgorI2luY2x1ZGUgInN0b3JhZ2Uv bG1nci5oIgorI2luY2x1ZGUgInV0aWxzL3N5c2NhY2hlLmgiCisjaW5jbHVkZSAidXRpbHMvdGlt ZXN0YW1wLmgiCisKKy8qIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBmb3IgaW50ZXJuYWwgdXNlICov CitzdGF0aWMgYm9vbCB2YWxpZGF0ZV9wYXNzd29yZF9jcmVkZW50aWFscyh2b2lkKTsKK3N0YXRp YyBib29sIHZhbGlkYXRlX29hdXRoX2NyZWRlbnRpYWxzKHZvaWQpOworCisvKiBGdW5jdGlvbiBw cm90b3R5cGVzICovCit2b2lkIEluaXRpYWxpemVWYWxpZGF0aW9uTWV0aG9kcyh2b2lkKTsKKwor LyoKKyAqIEluaXRpYWxpemUgdmFsaWRhdGlvbiBtZXRob2RzCisgKi8KK3ZvaWQKK0luaXRpYWxp emVWYWxpZGF0aW9uTWV0aG9kcyh2b2lkKQoreworCS8qIFJlZ2lzdGVyIGFsbCB0aGUgdmFsaWRh dGlvbiBtZXRob2RzICovCisJUmVnaXN0ZXJDcmVkZW50aWFsVmFsaWRhdG9yKENWVF9QQVNTV09S RCwgdmFsaWRhdGVfcGFzc3dvcmRfY3JlZGVudGlhbHMpOworCVJlZ2lzdGVyQ3JlZGVudGlhbFZh bGlkYXRvcihDVlRfT0FVVEgsIHZhbGlkYXRlX29hdXRoX2NyZWRlbnRpYWxzKTsKK30KKworLyoK KyAqIFZhbGlkYXRlIHBhc3N3b3JkIGNyZWRlbnRpYWxzIGJ5IGNoZWNraW5nIHJvbHZhbGlkdW50 aWwKKyAqIFJldHVybnMgdHJ1ZSBpZiBjcmVkZW50aWFscyBhcmUgc3RpbGwgdmFsaWQsIGZhbHNl IGlmIHRoZXkgaGF2ZSBleHBpcmVkLgorICovCitzdGF0aWMgYm9vbAordmFsaWRhdGVfcGFzc3dv cmRfY3JlZGVudGlhbHModm9pZCkKK3sKKwlIZWFwVHVwbGUgICB0dXBsZSA9IE5VTEw7CisJRGF0 dW0gICAgICAgcm9sdmFsaWR1bnRpbF9kYXR1bTsKKwlib29sICAgICAgICB2YWxpZHVudGlsX251 bGw7CisJVGltZXN0YW1wVHogdmFsaWRfdW50aWwgPSAwOworCVRpbWVzdGFtcFR6IGN1cnJlbnRf dGltZTsKKwlPaWQgICAgICAgICB1c2VyaWQ7CisJYm9vbCAgICAgICAgcmVzdWx0ID0gZmFsc2U7 CisKKwl1c2VyaWQgPSBHZXRTZXNzaW9uVXNlcklkKCk7CisKKwkvKgorCSAqIFRyeSB0byB0YWtl IEFjY2Vzc1NoYXJlTG9jayBvbiBwZ19hdXRoaWQgdG8gcHJldmVudCBjb25jdXJyZW50IG1vZGlm aWNhdGlvbnMKKwkgKiBmcm9tIGludGVyZmVyaW5nIHdpdGggb3VyIHZhbGlkYXRpb24uIFVzZSBj b25kaXRpb25hbCBhY3F1aXNpdGlvbiB0byBhdm9pZAorCSAqIGluZGVmaW5pdGUgd2FpdGluZyBk dXJpbmcgY3JlZGVudGlhbCB2YWxpZGF0aW9uLgorCSAqLworCWlmICghQ29uZGl0aW9uYWxMb2Nr UmVsYXRpb25PaWQoQXV0aElkUmVsYXRpb25JZCwgQWNjZXNzU2hhcmVMb2NrKSkKKwl7CisJCS8q CisJCSAqIENvdWxkIG5vdCBhY3F1aXJlIGxvY2sgaW1tZWRpYXRlbHksIHdoaWNoIGxpa2VseSBt ZWFucyBhbm90aGVyIHNlc3Npb24KKwkJICogaXMgbW9kaWZ5aW5nIHVzZXIgZGF0YS4gRm9yIGNy ZWRlbnRpYWwgdmFsaWRhdGlvbiwgaXQncyBiZXR0ZXIgdG8KKwkJICogY29uc2lkZXIgY3JlZGVu dGlhbHMgdmFsaWQgYW5kIHJldHJ5IGxhdGVyIHRoYW4gdG8gYmxvY2sgaW5kZWZpbml0ZWx5Lgor CQkgKi8KKwkJZWxvZyhMT0csICJjcmVkZW50aWFsIHZhbGlkYXRpb246IGNvdWxkIG5vdCBhY3F1 aXJlIGxvY2sgb24gcGdfYXV0aGlkIGltbWVkaWF0ZWx5LCB3aWxsIHJldHJ5IGxhdGVyIik7CisJ CXJldHVybiB0cnVlOyAvKiBDb25zaWRlciB2YWxpZCAqLworCX0KKworCVBHX1RSWSgpOworCXsK KwkJdHVwbGUgPSBTZWFyY2hTeXNDYWNoZTEoQVVUSE9JRCwgT2JqZWN0SWRHZXREYXR1bSh1c2Vy aWQpKTsKKworCQlpZiAoSGVhcFR1cGxlSXNWYWxpZCh0dXBsZSkpCisJCXsKKwkJCS8qIEdldCB0 aGUgZXhwaXJhdGlvbiB0aW1lIGNvbHVtbiAqLworCQkJcm9sdmFsaWR1bnRpbF9kYXR1bSA9IFN5 c0NhY2hlR2V0QXR0cihBVVRIT0lELCB0dXBsZSwKKwkJCQkJCQkJCQkJCSAgQW51bV9wZ19hdXRo aWRfcm9sdmFsaWR1bnRpbCwKKwkJCQkJCQkJCQkJCSAgJnZhbGlkdW50aWxfbnVsbCk7CisJCQlp ZiAoIXZhbGlkdW50aWxfbnVsbCkKKwkJCXsKKwkJCQl2YWxpZF91bnRpbCA9IERhdHVtR2V0VGlt ZXN0YW1wVHoocm9sdmFsaWR1bnRpbF9kYXR1bSk7CisJCQkJY3VycmVudF90aW1lID0gR2V0Q3Vy cmVudFRpbWVzdGFtcCgpOworCisJCQkJcmVzdWx0ID0gISh2YWxpZF91bnRpbCA8IGN1cnJlbnRf dGltZSk7CisJCQl9CisJCQllbHNlCisJCQkJcmVzdWx0ID0gdHJ1ZTsKKworCQkJUmVsZWFzZVN5 c0NhY2hlKHR1cGxlKTsKKwkJCXR1cGxlID0gTlVMTDsKKwkJfQorCX0KKwlQR19GSU5BTExZKCk7 CisJeworCQlpZiAodHVwbGUgIT0gTlVMTCkKKwkJCVJlbGVhc2VTeXNDYWNoZSh0dXBsZSk7CisK KwkJVW5sb2NrUmVsYXRpb25PaWQoQXV0aElkUmVsYXRpb25JZCwgQWNjZXNzU2hhcmVMb2NrKTsK Kwl9CisJUEdfRU5EX1RSWSgpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIENoZWNr IGlmIGFuIE9BdXRoIHRva2VuIGhhcyBleHBpcmVkLgorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0 aGUgdG9rZW4gaXMgc3RpbGwgdmFsaWQsIGZhbHNlIGlmIGl0IGhhcyBleHBpcmVkLgorICoKKyAq IENhbGxzIHdyYXBwZXIgQ2hlY2tPQXV0aFZhbGlkYXRvckV4cGlyYXRpb24oKSBmdW5jdGlvbgor ICogdG8gdmVyaWZ5IHRoYXQgdGhlIHRva2VuIGhhc24ndCBleHBpcmVkLgorICovCitzdGF0aWMg Ym9vbAordmFsaWRhdGVfb2F1dGhfY3JlZGVudGlhbHModm9pZCkKK3sKKwkvKiBDYWxsIHRoZSB2 YWxpZGF0b3IncyBleHBpcmVfY2IgdG8gY2hlY2sgdG9rZW4gZXhwaXJhdGlvbiAqLworCWlmICgh Q2hlY2tPQXV0aFZhbGlkYXRvckV4cGlyYXRpb24oKSkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0 dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9saWJwcS9hdXRoLXZhbGlkYXRl LmMgYi9zcmMvYmFja2VuZC9saWJwcS9hdXRoLXZhbGlkYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKaW5kZXggMDAwMDAwMDAwMDAuLjkyZDQ2ODM2NTFiCi0tLSAvZGV2L251bGwKKysrIGIvc3Jj L2JhY2tlbmQvbGlicHEvYXV0aC12YWxpZGF0ZS5jCkBAIC0wLDAgKzEsMjYwIEBACisvKi0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyoKKyogYXV0aC12YWxpZGF0ZS5jCisqICAgICAgSW1wbGVtZW50YXRpb24g b2YgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbCB2YWxpZGF0aW9uCisqCisqIFRoaXMgbW9kdWxl IHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciB2YWxpZGF0aW5nIGNyZWRlbnRpYWxzIGR1cmluZwor KiBhbiBhY3RpdmUgUG9zdGdyZVNRTCBzZXNzaW9uLgorKgorKiBQb3J0aW9ucyBDb3B5cmlnaHQg KGMpIDE5OTYtMjAyNiwgUG9zdGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKKyogUG9y dGlvbnMgQ29weXJpZ2h0IChjKSAxOTk0LCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENh bGlmb3JuaWEKKyoKKyogSURFTlRJRklDQVRJT04KKyogICAgICBzcmMvYmFja2VuZC9saWJwcS9h dXRoLXZhbGlkYXRlLmMKKyoKKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2luY2x1ZGUgInBvc3Rn cmVzLmgiCisKKyNpbmNsdWRlICJhY2Nlc3MveGFjdC5oIgorI2luY2x1ZGUgImFjY2Vzcy94bG9n LmgiCisjaW5jbHVkZSAibGlicHEvYXV0aC5oIgorI2luY2x1ZGUgImxpYnBxL2xpYnBxLWJlLmgi CisjaW5jbHVkZSAibGlicHEvYXV0aC12YWxpZGF0ZS5oIgorI2luY2x1ZGUgImxpYnBxL2F1dGgt dmFsaWRhdGUtbWV0aG9kcy5oIgorI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgorI2luY2x1ZGUgInBv c3RtYXN0ZXIvcG9zdG1hc3Rlci5oIgorI2luY2x1ZGUgInN0b3JhZ2UvaXBjLmgiCisjaW5jbHVk ZSAidGNvcC90Y29wcHJvdC5oIgorI2luY2x1ZGUgInV0aWxzL2Vsb2cuaCIKKyNpbmNsdWRlICJ1 dGlscy9ndWMuaCIKKyNpbmNsdWRlICJ1dGlscy90aW1lc3RhbXAuaCIKKyNpbmNsdWRlICJ1dGls cy90aW1lb3V0LmgiCisKKy8qIEdVQyB2YXJpYWJsZXMgKi8KK2Jvb2wJCWNyZWRlbnRpYWxfdmFs aWRhdGlvbl9lbmFibGVkOworaW50CQkJY3JlZGVudGlhbF92YWxpZGF0aW9uX2ludGVydmFsOwor CisKKy8qIFJlZ2lzdGVyZWQgY3JlZGVudGlhbCB2YWxpZGF0b3JzICovCitzdGF0aWMgQ3JlZGVu dGlhbFZhbGlkYXRpb25DYWxsYmFjayB2YWxpZGF0b3JzW0NWVF9DT1VOVF07CisKKworLyoKKyAq IENvbnZlcnQgVXNlckF1dGggZW51bSB0byBDcmVkZW50aWFsVmFsaWRhdGlvblR5cGUgZm9yIHZh bGlkYXRvciBzZWxlY3Rpb24KKyAqLworc3RhdGljIENyZWRlbnRpYWxWYWxpZGF0aW9uVHlwZQor VXNlckF1dGhUb1ZhbGlkYXRpb25UeXBlKFVzZXJBdXRoIGF1dGhfbWV0aG9kKQoreworCXN3aXRj aCAoYXV0aF9tZXRob2QpCisJeworCQljYXNlIHVhUGFzc3dvcmQ6CisJCWNhc2UgdWFNRDU6CisJ CWNhc2UgdWFTQ1JBTToKKwkJLyogQWxsIHBhc3N3b3JkLWJhc2VkIG1ldGhvZHMgdXNlIHRoZSBw YXNzd29yZCB2YWxpZGF0b3IgKi8KKwkJCXJldHVybiBDVlRfUEFTU1dPUkQ7CisJCWNhc2UgdWFP QXV0aDoKKwkJCXJldHVybiBDVlRfT0FVVEg7CisJCWRlZmF1bHQ6CisJCQkvKiBObyBzcGVjaWZp YyB2YWxpZGF0b3IgZm9yIG90aGVyIGF1dGggbWV0aG9kcyAqLworCQkJcmV0dXJuIENWVF9DT1VO VDsgIC8qIEludmFsaWQgdmFsdWUgKi8KKwl9Cit9CisKKy8qCisgKiBQcm9jZXNzIGNyZWRlbnRp YWwgdmFsaWRhdGlvbgorICovCit2b2lkCitQcm9jZXNzQ3JlZGVudGlhbFZhbGlkYXRpb24odm9p ZCkKK3sKKwkvKiBTa2lwIHZhbGlkYXRpb24gZHVyaW5nIGluaXRpYWxpemF0aW9uLCBib290c3Ry YXAsIGF1dGhlbnRpY2F0aW9uIG9yIGNvbm5lY3Rpb24gc2V0dXAgKi8KKwlpZiAoQ2xpZW50QXV0 aEluUHJvZ3Jlc3MgfHwgSXNJbml0UHJvY2Vzc2luZ01vZGUoKSB8fCBJc0Jvb3RzdHJhcFByb2Nl c3NpbmdNb2RlKCkpCisJCXJldHVybjsKKworCS8qIENoZWNrIGNyZWRlbnRpYWxzIGlmIHZhbGlk YXRpb24gaXMgZW5hYmxlZCAqLworCWlmIChjcmVkZW50aWFsX3ZhbGlkYXRpb25fZW5hYmxlZCAm JiBNeUNsaWVudENvbm5lY3Rpb25JbmZvLmF1dGhuX2lkICE9IE5VTEwpCisJeworCQlDcmVkZW50 aWFsVmFsaWRhdGlvblN0YXR1cyBzdGF0dXM7CisJCVVzZXJBdXRoCWF1dGhfbWV0aG9kID0gTXlD bGllbnRDb25uZWN0aW9uSW5mby5hdXRoX21ldGhvZDsKKworCQlzdGF0dXMgPSBDaGVja0NyZWRl bnRpYWxWYWxpZGl0eSgpOworCisJCXN3aXRjaCAoc3RhdHVzKQorCQl7CisJCQljYXNlIENWU19W QUxJRDoKKwkJCQkvKiBDcmVkZW50aWFscyBhcmUgdmFsaWQsIGNvbnRpbnVlICovCisJCQkJYnJl YWs7CisKKwkJCWNhc2UgQ1ZTX0VYUElSRUQ6CisJCQkJZWxvZyhMT0csICJjcmVkZW50aWFsIHZh bGlkYXRpb246IGNyZWRlbnRpYWxzIGV4cGlyZWQgZm9yIGF1dGhfbWV0aG9kPSVkIiwKKwkJCQkJ IChpbnQpIGF1dGhfbWV0aG9kKTsKKwkJCQllcmVwb3J0KEZBVEFMLAorCQkJCQkJKGVycmNvZGUo RVJSQ09ERV9JTlZBTElEX0FVVEhPUklaQVRJT05fU1BFQ0lGSUNBVElPTiksCisJCQkJCQkgZXJy bXNnKCJzZXNzaW9uIGNyZWRlbnRpYWxzIGhhdmUgZXhwaXJlZCIpLAorCQkJCQkJIGVycmhpbnQo IlBsZWFzZSByZWNvbm5lY3QgdG8gZXN0YWJsaXNoIGEgbmV3IGF1dGhlbnRpY2F0ZWQgc2Vzc2lv biIpKSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQ1ZTX0VSUk9SOgorCQkJCWVsb2coTE9HLCAi Y3JlZGVudGlhbCB2YWxpZGF0aW9uOiBlcnJvciBjaGVja2luZyBjcmVkZW50aWFscyBmb3IgYXV0 aF9tZXRob2Q9JWQiLAorCQkJCQkgKGludCkgYXV0aF9tZXRob2QpOworCQkJCWVyZXBvcnQoV0FS TklORywKKwkJCQkJCShlcnJjb2RlKEVSUkNPREVfSU5WQUxJRF9BVVRIT1JJWkFUSU9OX1NQRUNJ RklDQVRJT04pLAorCQkJCQkJIGVycm1zZygiZXJyb3IgY2hlY2tpbmcgY3JlZGVudGlhbCB2YWxp ZGl0eSIpLAorCQkJCQkJIGVycmhpbnQoIkNyZWRlbnRpYWwgdmFsaWRhdGlvbiB3aWxsIGJlIHJl dHJpZWQgYXQgdGhlIG5leHQgaW50ZXJ2YWwiKSkpOworCQkJCWJyZWFrOworCQkJfQorCX0KK30K KworLyoKKyAqIEluaXRpYWxpemUgY3JlZGVudGlhbCB2YWxpZGF0aW9uIHN5c3RlbSBDYWxsZWQg ZnJvbSBJbml0UG9zdGdyZXMgYWZ0ZXIKKyAqIGF1dGhlbnRpY2F0aW9uIGNvbXBsZXRlcworICov Cit2b2lkCitJbml0aWFsaXplQ3JlZGVudGlhbFZhbGlkYXRpb24odm9pZCkKK3sKKwlpbnQJCQlp OworCisJLyogRGVmaW5lIEdVQyB2YXJpYWJsZXMgKi8KKwlEZWZpbmVDdXN0b21Cb29sVmFyaWFi bGUoImNyZWRlbnRpYWxfdmFsaWRhdGlvbi5lbmFibGVkIiwKKwkJCQkJCQkgIkVuYWJsZSBwZXJp b2RpYyBjcmVkZW50aWFsIHZhbGlkYXRpb24uIiwKKwkJCQkJCQkgTlVMTCwKKwkJCQkJCQkgJmNy ZWRlbnRpYWxfdmFsaWRhdGlvbl9lbmFibGVkLAorCQkJCQkJCSBmYWxzZSwKKwkJCQkJCQkgUEdD X1NVU0VULAorCQkJCQkJCSAwLAorCQkJCQkJCSBOVUxMLAorCQkJCQkJCSBOVUxMLAorCQkJCQkJ CSBOVUxMKTsKKworCURlZmluZUN1c3RvbUludFZhcmlhYmxlKCJjcmVkZW50aWFsX3ZhbGlkYXRp b24uaW50ZXJ2YWwiLAorCQkJCQkJCSJDcmVkZW50aWFsIHZhbGlkYXRpb24gaW50ZXJ2YWwgaW4g bWludXRlcy4iLAorCQkJCQkJCU5VTEwsCisJCQkJCQkJJmNyZWRlbnRpYWxfdmFsaWRhdGlvbl9p bnRlcnZhbCwKKwkJCQkJCQkxLAkvKiBkZWZhdWx0OiAxIG1pbnV0ZSAqLworCQkJCQkJCTEsCS8q IG1pbjogMSBtaW51dGUgKi8KKwkJCQkJCQk2MCwJLyogbWF4OiA2MCBtaW51dGVzICovCisJCQkJ CQkJUEdDX1NVU0VULAorCQkJCQkJCUdVQ19VTklUX01JTiwKKwkJCQkJCQlOVUxMLAorCQkJCQkJ CU5VTEwsCisJCQkJCQkJTlVMTCk7CisKKwkvKiBJbml0aWFsaXplIHZhbGlkYXRvciBjYWxsYmFj a3MgdG8gTlVMTCAqLworCWZvciAoaSA9IDA7IGkgPCBDVlRfQ09VTlQ7IGkrKykKKwkJdmFsaWRh dG9yc1tpXSA9IE5VTEw7CisKKwkvKiBJbml0aWFsaXplIGFuZCByZWdpc3RlciBhbGwgdmFsaWRh dGlvbiBtZXRob2RzICovCisJSW5pdGlhbGl6ZVZhbGlkYXRpb25NZXRob2RzKCk7Cit9CisKKy8q CisgKiBFbmFibGUgb3IgcmUtZW5hYmxlIHRoZSBjcmVkZW50aWFsIHZhbGlkYXRpb24gdGltZW91 dCB0aW1lci4KKyAqIENhbGxlZCBhdCBzZXNzaW9uIHN0YXJ0dXAgYW5kIGFmdGVyIGVhY2ggdmFs aWRhdGlvbiBvciBlcnJvciByZWNvdmVyeS4KKyAqLwordm9pZAorRW5hYmxlQ3JlZGVudGlhbFZh bGlkYXRpb25UaW1lb3V0KHZvaWQpCit7CisJaW50CQkJaW50ZXJ2YWxfbXM7CisKKwkvKiBPbmx5 IGVuYWJsZSBpZiBjcmVkZW50aWFsIHZhbGlkYXRpb24gaXMgY29uZmlndXJlZCAqLworCWlmICgh Y3JlZGVudGlhbF92YWxpZGF0aW9uX2VuYWJsZWQpCisJCXJldHVybjsKKworCS8qIFNraXAgZm9y IG5vbi1jbGllbnQgYmFja2VuZHMgKi8KKwlpZiAoIUlzRXh0ZXJuYWxDb25uZWN0aW9uQmFja2Vu ZChNeUJhY2tlbmRUeXBlKSkKKwkJcmV0dXJuOworCisJLyogQ29udmVydCBpbnRlcnZhbCBmcm9t IG1pbnV0ZXMgdG8gbWlsbGlzZWNvbmRzICovCisJaW50ZXJ2YWxfbXMgPSBjcmVkZW50aWFsX3Zh bGlkYXRpb25faW50ZXJ2YWwgKiA2MCAqIDEwMDA7CisKKwllbmFibGVfdGltZW91dF9hZnRlcihD UkVERU5USUFMX1ZBTElEQVRJT05fVElNRU9VVCwgaW50ZXJ2YWxfbXMpOworCisJZWxvZyhERUJV RzEsICJjcmVkZW50aWFsIHZhbGlkYXRpb24gdGltZW91dCBlbmFibGVkLCBpbnRlcnZhbD0lZCBt aW4iLCBjcmVkZW50aWFsX3ZhbGlkYXRpb25faW50ZXJ2YWwpOworfQorCisvKgorICogUmVnaXN0 ZXIgYSB2YWxpZGF0b3IgY2FsbGJhY2sgZm9yIGEgc3BlY2lmaWMgYXV0aGVudGljYXRpb24gbWV0 aG9kCisgKi8KK3ZvaWQKK1JlZ2lzdGVyQ3JlZGVudGlhbFZhbGlkYXRvcihDcmVkZW50aWFsVmFs aWRhdGlvblR5cGUgbWV0aG9kX3R5cGUsIENyZWRlbnRpYWxWYWxpZGF0aW9uQ2FsbGJhY2sgdmFs aWRhdG9yKQoreworCWlmIChtZXRob2RfdHlwZSA8IDAgfHwgbWV0aG9kX3R5cGUgPj0gQ1ZUX0NP VU5UKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfSU5WQUxJRF9QQVJB TUVURVJfVkFMVUUpLAorCQkJCSBlcnJtc2coImludmFsaWQgdmFsaWRhdGlvbiBtZXRob2QgdHlw ZTogJWQiLCBtZXRob2RfdHlwZSkpKTsKKworCXZhbGlkYXRvcnNbbWV0aG9kX3R5cGVdID0gdmFs aWRhdG9yOworfQorCisvKgorICogQ2hlY2sgY3JlZGVudGlhbCB2YWxpZGl0eSB1c2luZyB0aGUg YXBwcm9wcmlhdGUgdmFsaWRhdG9yCisgKi8KK0NyZWRlbnRpYWxWYWxpZGF0aW9uU3RhdHVzCitD aGVja0NyZWRlbnRpYWxWYWxpZGl0eSh2b2lkKQoreworCUNyZWRlbnRpYWxWYWxpZGF0aW9uQ2Fs bGJhY2sgdmFsaWRhdG9yID0gTlVMTDsKKwlDcmVkZW50aWFsVmFsaWRhdGlvblN0YXR1cyBzdGF0 dXM7CisKKwkvKgorCSAqIFNraXAgdmFsaWRhdGlvbiBmb3I6CisJICogLSBEdXJpbmcgc2h1dGRv d24gb3IgcmVjb3ZlcnkKKwkgKiAtIE5vbi1jbGllbnQgYmFja2VuZHMgKGFueSBwcm9jZXNzIG5v dCBzZXJ2aW5nIGEgY2xpZW50IGNvbm5lY3Rpb24pCisJICogLSBBdXRvVmFjdXVtIHByb2Nlc3Nl cyAobGF1bmNoZXIgYW5kIHdvcmtlcnMpCisJICogLSBCYWNrZ3JvdW5kIHdvcmtlciBwcm9jZXNz ZXMKKwkgKiAtIEF1dGhlbnRpY2F0aW9uIGlzIGluIHByb2dyZXNzCisJICovCisJaWYgKHByb2Nf ZXhpdF9pbnByb2dyZXNzIHx8CisJCVJlY292ZXJ5SW5Qcm9ncmVzcygpIHx8CisJCSFJc0V4dGVy bmFsQ29ubmVjdGlvbkJhY2tlbmQoTXlCYWNrZW5kVHlwZSkgfHwKKwkJQW1BdXRvVmFjdXVtTGF1 bmNoZXJQcm9jZXNzKCkgfHwKKwkJQW1BdXRvVmFjdXVtV29ya2VyUHJvY2VzcygpIHx8CisJCUFt QmFja2dyb3VuZFdvcmtlclByb2Nlc3MoKSB8fAorCQlDbGllbnRBdXRoSW5Qcm9ncmVzcykKKwkJ cmV0dXJuIENWU19WQUxJRDsKKwkvKgorCSAqIFVzZSB0aGUgc2Vzc2lvbidzIGF1dGhlbnRpY2F0 aW9uIG1ldGhvZCBmcm9tIE15Q2xpZW50Q29ubmVjdGlvbkluZm8KKwkgKiB0byBzZWxlY3QgdGhl IGFwcHJvcHJpYXRlIHZhbGlkYXRvci4KKwkgKi8KKwlpZiAoTXlDbGllbnRDb25uZWN0aW9uSW5m by5hdXRobl9pZCAhPSBOVUxMKQorCXsKKwkJQ3JlZGVudGlhbFZhbGlkYXRpb25UeXBlIHZhbGlk YXRpb25fdHlwZTsKKworCQl2YWxpZGF0aW9uX3R5cGUgPSBVc2VyQXV0aFRvVmFsaWRhdGlvblR5 cGUoTXlDbGllbnRDb25uZWN0aW9uSW5mby5hdXRoX21ldGhvZCk7CisKKwkJLyoKKwkJICogSWYg d2UgaGF2ZSBhIHZhbGlkIHZhbGlkYXRpb24gdHlwZSwgZ2V0IHRoZSBjb3JyZXNwb25kaW5nCisJ CSAqIHZhbGlkYXRvcgorCQkgKi8KKwkJaWYgKHZhbGlkYXRpb25fdHlwZSA8IENWVF9DT1VOVCkK KwkJCXZhbGlkYXRvciA9IHZhbGlkYXRvcnNbdmFsaWRhdGlvbl90eXBlXTsKKworCX0KKworCS8q CisJICogSWYgbm8gdmFsaWRhdG9yIGZvdW5kIGZvciB0aGUgY3VycmVudCBhdXRoIG1ldGhvZCBv ciBubworCSAqIGF1dGhlbnRpY2F0ZWQgc2Vzc2lvbiwgc2tpcCB2YWxpZGF0aW9uIGFuZCBjb25z aWRlciBjcmVkZW50aWFscworCSAqIHZhbGlkCisJICovCisJaWYgKHZhbGlkYXRvciA9PSBOVUxM IHx8ICFNeUNsaWVudENvbm5lY3Rpb25JbmZvLmF1dGhuX2lkKQorCQkJcmV0dXJuIENWU19WQUxJ RDsKKworCS8qIENhbGwgdGhlIHZhbGlkYXRvciBhbmQgaW50ZXJwcmV0IHJlc3VsdCAqLworCWVs b2coREVCVUcxLCAiY3JlZGVudGlhbCB2YWxpZGF0aW9uOiB2YWxpZGF0aW5nIGF1dGhfbWV0aG9k PSVkIiwgKGludCkgTXlDbGllbnRDb25uZWN0aW9uSW5mby5hdXRoX21ldGhvZCk7CisKKwlQR19U UlkoKTsKKwl7CisJCWJvb2wJCXJlc3VsdCA9IHZhbGlkYXRvcigpOworCisJCXN0YXR1cyA9IHJl c3VsdCA/IENWU19WQUxJRCA6IENWU19FWFBJUkVEOworCX0KKwlQR19DQVRDSCgpOworCXsKKwkJ LyogRXJyb3IgZHVyaW5nIHZhbGlkYXRpb24gKi8KKwkJRmx1c2hFcnJvclN0YXRlKCk7CisJCXN0 YXR1cyA9IENWU19FUlJPUjsKKwl9CisJUEdfRU5EX1RSWSgpOworCisJcmV0dXJuIHN0YXR1czsK K30KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2xpYnBxL21lc29uLmJ1aWxkIGIvc3JjL2JhY2tl bmQvbGlicHEvbWVzb24uYnVpbGQKaW5kZXggODU3MWY2NTI4NDQuLjJlNjk2ODU2NzJiIDEwMDY0 NAotLS0gYS9zcmMvYmFja2VuZC9saWJwcS9tZXNvbi5idWlsZAorKysgYi9zcmMvYmFja2VuZC9s aWJwcS9tZXNvbi5idWlsZApAQCAtNCw2ICs0LDggQEAgYmFja2VuZF9zb3VyY2VzICs9IGZpbGVz KAogICAnYXV0aC1vYXV0aC5jJywKICAgJ2F1dGgtc2FzbC5jJywKICAgJ2F1dGgtc2NyYW0uYycs CisgICdhdXRoLXZhbGlkYXRlLW1ldGhvZHMuYycsCisgICdhdXRoLXZhbGlkYXRlLmMnLAogICAn YXV0aC5jJywKICAgJ2JlLWZzc3R1YnMuYycsCiAgICdiZS1zZWN1cmUtY29tbW9uLmMnLApkaWZm IC0tZ2l0IGEvc3JjL2JhY2tlbmQvdGNvcC9wb3N0Z3Jlcy5jIGIvc3JjL2JhY2tlbmQvdGNvcC9w b3N0Z3Jlcy5jCmluZGV4IGIzNTYzMTEzMjE5Li5jZTlmOWNlZjVjNSAxMDA2NDQKLS0tIGEvc3Jj L2JhY2tlbmQvdGNvcC9wb3N0Z3Jlcy5jCisrKyBiL3NyYy9iYWNrZW5kL3Rjb3AvcG9zdGdyZXMu YwpAQCAtNDQsNiArNDQsNyBAQAogI2luY2x1ZGUgImxpYnBxL2xpYnBxLmgiCiAjaW5jbHVkZSAi bGlicHEvcHFmb3JtYXQuaCIKICNpbmNsdWRlICJsaWJwcS9wcXNpZ25hbC5oIgorI2luY2x1ZGUg ImxpYnBxL2F1dGgtdmFsaWRhdGUuaCIKICNpbmNsdWRlICJtYi9wZ193Y2hhci5oIgogI2luY2x1 ZGUgIm1iL3N0cmluZ2luZm9fbWIuaCIKICNpbmNsdWRlICJtaXNjYWRtaW4uaCIKQEAgLTk4LDYg Kzk5LDI1IEBAIGJvb2wJCUxvZ19kaXNjb25uZWN0aW9ucyA9IGZhbHNlOwogCiBpbnQJCQlsb2df c3RhdGVtZW50ID0gTE9HU1RNVF9OT05FOwogCisKKworLyoKKyAqIEZ1bmN0aW9uIHRoYXQgcGVy Zm9ybXMgY3JlZGVudGlhbCB2YWxpZGF0aW9uIHdoZW4gbmVlZGVkCisgKiBVc2VzIGEgdGltZXIt YmFzZWQgYXBwcm9hY2ggdG8gcGVyaW9kaWNhbGx5IHZhbGlkYXRlIGNyZWRlbnRpYWxzCisgKiBk dXJpbmcgbm9ybWFsIG9wZXJhdGlvbiwgc2tpcHBpbmcgdmFsaWRhdGlvbiBpbiBib290c3RyYXBw aW5nLgorICovCitzdGF0aWMgdm9pZAorQ2hlY2tBbmRFeGVjdXRlQ3JlZGVudGlhbFZhbGlkYXRp b24odm9pZCkKK3sKKwlDcmVkZW50aWFsVmFsaWRhdGlvblRpbWVvdXRQZW5kaW5nID0gZmFsc2U7 CisKKwkvKiBQcm9jZXNzIGNyZWRlbnRpYWwgdmFsaWRhdGlvbiAqLworCVByb2Nlc3NDcmVkZW50 aWFsVmFsaWRhdGlvbigpOworCisJLyogUmUtZW5hYmxlIHRoZSB0aW1lb3V0IGZvciB0aGUgbmV4 dCB2YWxpZGF0aW9uIGN5Y2xlICovCisJRW5hYmxlQ3JlZGVudGlhbFZhbGlkYXRpb25UaW1lb3V0 KCk7Cit9CisKIC8qIHdhaXQgTiBzZWNvbmRzIHRvIGFsbG93IGF0dGFjaCBmcm9tIGEgZGVidWdn ZXIgKi8KIGludAkJCVBvc3RBdXRoRGVsYXkgPSAwOwogCkBAIC0xMDUwLDYgKzEwNzAsMTAgQEAg ZXhlY19zaW1wbGVfcXVlcnkoY29uc3QgY2hhciAqcXVlcnlfc3RyaW5nKQogCSAqLwogCXN0YXJ0 X3hhY3RfY29tbWFuZCgpOwogCisJLyogQ2hlY2sgYW5kIHBvdGVudGlhbGx5IGV4ZWN1dGUgY3Jl ZGVudGlhbCB2YWxpZGF0aW9uICovCisJaWYgKENyZWRlbnRpYWxWYWxpZGF0aW9uVGltZW91dFBl bmRpbmcgJiYgSXNOb3JtYWxQcm9jZXNzaW5nTW9kZSgpKQorCQlDaGVja0FuZEV4ZWN1dGVDcmVk ZW50aWFsVmFsaWRhdGlvbigpOworCiAJLyoKIAkgKiBaYXAgYW55IHByZS1leGlzdGluZyB1bm5h bWVkIHN0YXRlbWVudC4gIChXaGlsZSBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5LAogCSAqIGl0IHNl ZW1zIGJlc3QgdG8gZGVmaW5lIHNpbXBsZS1RdWVyeSBtb2RlIGFzIGlmIGl0IHVzZWQgdGhlIHVu bmFtZWQKQEAgLTE0MzEsNiArMTQ1NSwxMSBAQCBleGVjX3BhcnNlX21lc3NhZ2UoY29uc3QgY2hh ciAqcXVlcnlfc3RyaW5nLAkvKiBzdHJpbmcgdG8gZXhlY3V0ZSAqLwogCSAqLwogCXN0YXJ0X3hh Y3RfY29tbWFuZCgpOwogCisKKwkvKiBDaGVjayBhbmQgcG90ZW50aWFsbHkgZXhlY3V0ZSBjcmVk ZW50aWFsIHZhbGlkYXRpb24gKi8KKwlpZiAoQ3JlZGVudGlhbFZhbGlkYXRpb25UaW1lb3V0UGVu ZGluZyAmJiBJc05vcm1hbFByb2Nlc3NpbmdNb2RlKCkpCisJCUNoZWNrQW5kRXhlY3V0ZUNyZWRl bnRpYWxWYWxpZGF0aW9uKCk7CisKIAkvKgogCSAqIFN3aXRjaCB0byBhcHByb3ByaWF0ZSBjb250 ZXh0IGZvciBjb25zdHJ1Y3RpbmcgcGFyc2V0cmVlcy4KIAkgKgpAQCAtMTcwNiw2ICsxNzM1LDEw IEBAIGV4ZWNfYmluZF9tZXNzYWdlKFN0cmluZ0luZm8gaW5wdXRfbWVzc2FnZSkKIAkgKi8KIAlz dGFydF94YWN0X2NvbW1hbmQoKTsKIAorCS8qIENoZWNrIGFuZCBwb3RlbnRpYWxseSBleGVjdXRl IGNyZWRlbnRpYWwgdmFsaWRhdGlvbiAqLworCWlmIChDcmVkZW50aWFsVmFsaWRhdGlvblRpbWVv dXRQZW5kaW5nICYmIElzTm9ybWFsUHJvY2Vzc2luZ01vZGUoKSkKKwkJQ2hlY2tBbmRFeGVjdXRl Q3JlZGVudGlhbFZhbGlkYXRpb24oKTsKKwogCS8qIFN3aXRjaCBiYWNrIHRvIG1lc3NhZ2UgY29u dGV4dCAqLwogCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhNZXNzYWdlQ29udGV4dCk7CiAKQEAgLTIy MTgsNiArMjI1MSwxMCBAQCBleGVjX2V4ZWN1dGVfbWVzc2FnZShjb25zdCBjaGFyICpwb3J0YWxf bmFtZSwgbG9uZyBtYXhfcm93cykKIAkgKi8KIAlzdGFydF94YWN0X2NvbW1hbmQoKTsKIAorCS8q IENoZWNrIGFuZCBwb3RlbnRpYWxseSBleGVjdXRlIGNyZWRlbnRpYWwgdmFsaWRhdGlvbiAqLwor CWlmIChDcmVkZW50aWFsVmFsaWRhdGlvblRpbWVvdXRQZW5kaW5nICYmIElzTm9ybWFsUHJvY2Vz c2luZ01vZGUoKSkKKwkJQ2hlY2tBbmRFeGVjdXRlQ3JlZGVudGlhbFZhbGlkYXRpb24oKTsKKwog CS8qCiAJICogSWYgd2UgcmUtaXNzdWUgYW4gRXhlY3V0ZSBwcm90b2NvbCByZXF1ZXN0IGFnYWlu c3QgYW4gZXhpc3RpbmcgcG9ydGFsLAogCSAqIHRoZW4gd2UgYXJlIG9ubHkgZmV0Y2hpbmcgbW9y ZSByb3dzIHJhdGhlciB0aGFuIGNvbXBsZXRlbHkgcmUtZXhlY3V0aW5nCkBAIC0yNjM2LDYgKzI2 NzMsMTAgQEAgZXhlY19kZXNjcmliZV9zdGF0ZW1lbnRfbWVzc2FnZShjb25zdCBjaGFyICpzdG10 X25hbWUpCiAJICovCiAJc3RhcnRfeGFjdF9jb21tYW5kKCk7CiAKKwkvKiBDaGVjayBhbmQgcG90 ZW50aWFsbHkgZXhlY3V0ZSBjcmVkZW50aWFsIHZhbGlkYXRpb24gKi8KKwlpZiAoQ3JlZGVudGlh bFZhbGlkYXRpb25UaW1lb3V0UGVuZGluZyAmJiBJc05vcm1hbFByb2Nlc3NpbmdNb2RlKCkpCisJ CUNoZWNrQW5kRXhlY3V0ZUNyZWRlbnRpYWxWYWxpZGF0aW9uKCk7CisKIAkvKiBTd2l0Y2ggYmFj ayB0byBtZXNzYWdlIGNvbnRleHQgKi8KIAlNZW1vcnlDb250ZXh0U3dpdGNoVG8oTWVzc2FnZUNv bnRleHQpOwogCkBAIC0yNzI4LDYgKzI3NjksMTAgQEAgZXhlY19kZXNjcmliZV9wb3J0YWxfbWVz c2FnZShjb25zdCBjaGFyICpwb3J0YWxfbmFtZSkKIAkgKi8KIAlzdGFydF94YWN0X2NvbW1hbmQo KTsKIAorCS8qIENoZWNrIGFuZCBwb3RlbnRpYWxseSBleGVjdXRlIGNyZWRlbnRpYWwgdmFsaWRh dGlvbiAqLworCWlmIChDcmVkZW50aWFsVmFsaWRhdGlvblRpbWVvdXRQZW5kaW5nICYmIElzTm9y bWFsUHJvY2Vzc2luZ01vZGUoKSkKKwkJQ2hlY2tBbmRFeGVjdXRlQ3JlZGVudGlhbFZhbGlkYXRp b24oKTsKKwogCS8qIFN3aXRjaCBiYWNrIHRvIG1lc3NhZ2UgY29udGV4dCAqLwogCU1lbW9yeUNv bnRleHRTd2l0Y2hUbyhNZXNzYWdlQ29udGV4dCk7CiAKQEAgLTQ2MzUsNiArNDY4MCwxMSBAQCBQ b3N0Z3Jlc01haW4oY29uc3QgY2hhciAqZGJuYW1lLCBjb25zdCBjaGFyICp1c2VybmFtZSkKIAkJ CQkJZW5hYmxlX3RpbWVvdXRfYWZ0ZXIoSURMRV9JTl9UUkFOU0FDVElPTl9TRVNTSU9OX1RJTUVP VVQsCiAJCQkJCQkJCQkJIElkbGVJblRyYW5zYWN0aW9uU2Vzc2lvblRpbWVvdXQpOwogCQkJCX0K KworCQkJCS8qIFJlLWVuYWJsZSBjcmVkZW50aWFsIHZhbGlkYXRpb24gdGltZXIgaWYgbmVlZGVk ICovCisJCQkJaWYgKGNyZWRlbnRpYWxfdmFsaWRhdGlvbl9lbmFibGVkICYmCisJCQkJCSFnZXRf dGltZW91dF9hY3RpdmUoQ1JFREVOVElBTF9WQUxJREFUSU9OX1RJTUVPVVQpKQorCQkJCQlFbmFi bGVDcmVkZW50aWFsVmFsaWRhdGlvblRpbWVvdXQoKTsKIAkJCX0KIAkJCWVsc2UKIAkJCXsKQEAg LTQ2ODcsNiArNDczNywxMSBAQCBQb3N0Z3Jlc01haW4oY29uc3QgY2hhciAqZGJuYW1lLCBjb25z dCBjaGFyICp1c2VybmFtZSkKIAkJCQkJZW5hYmxlX3RpbWVvdXRfYWZ0ZXIoSURMRV9TRVNTSU9O X1RJTUVPVVQsCiAJCQkJCQkJCQkJIElkbGVTZXNzaW9uVGltZW91dCk7CiAJCQkJfQorCisJCQkJ LyogUmUtZW5hYmxlIGNyZWRlbnRpYWwgdmFsaWRhdGlvbiB0aW1lciBpZiBuZWVkZWQgKi8KKwkJ CQlpZiAoY3JlZGVudGlhbF92YWxpZGF0aW9uX2VuYWJsZWQgJiYKKwkJCQkJIWdldF90aW1lb3V0 X2FjdGl2ZShDUkVERU5USUFMX1ZBTElEQVRJT05fVElNRU9VVCkpCisJCQkJCUVuYWJsZUNyZWRl bnRpYWxWYWxpZGF0aW9uVGltZW91dCgpOwogCQkJfQogCiAJCQkvKiBSZXBvcnQgYW55IHJlY2Vu dGx5LWNoYW5nZWQgR1VDIG9wdGlvbnMgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxz L2luaXQvZ2xvYmFscy5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvaW5pdC9nbG9iYWxzLmMKaW5kZXgg MzZhZDcwOGIzNjAuLmFhYjUyNmE0NWRkIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9p bml0L2dsb2JhbHMuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9pbml0L2dsb2JhbHMuYwpAQCAt MzQsNiArMzQsNyBAQCB2b2xhdGlsZSBzaWdfYXRvbWljX3QgUXVlcnlDYW5jZWxQZW5kaW5nID0g ZmFsc2U7CiB2b2xhdGlsZSBzaWdfYXRvbWljX3QgUHJvY0RpZVBlbmRpbmcgPSBmYWxzZTsKIHZv bGF0aWxlIHNpZ19hdG9taWNfdCBDaGVja0NsaWVudENvbm5lY3Rpb25QZW5kaW5nID0gZmFsc2U7 CiB2b2xhdGlsZSBzaWdfYXRvbWljX3QgQ2xpZW50Q29ubmVjdGlvbkxvc3QgPSBmYWxzZTsKK3Zv bGF0aWxlIHNpZ19hdG9taWNfdCBDcmVkZW50aWFsVmFsaWRhdGlvblRpbWVvdXRQZW5kaW5nID0g ZmFsc2U7CiB2b2xhdGlsZSBzaWdfYXRvbWljX3QgSWRsZUluVHJhbnNhY3Rpb25TZXNzaW9uVGlt ZW91dFBlbmRpbmcgPSBmYWxzZTsKIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBUcmFuc2FjdGlvblRp bWVvdXRQZW5kaW5nID0gZmFsc2U7CiB2b2xhdGlsZSBzaWdfYXRvbWljX3QgSWRsZVNlc3Npb25U aW1lb3V0UGVuZGluZyA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvaW5p dC9wb3N0aW5pdC5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvaW5pdC9wb3N0aW5pdC5jCmluZGV4IDI2 MTE4NjYxZjA3Li5kY2ViNzQ1MzAxMyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvaW5p dC9wb3N0aW5pdC5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2luaXQvcG9zdGluaXQuYwpAQCAt MzQsNiArMzQsNyBAQAogI2luY2x1ZGUgImNhdGFsb2cvcGdfZGJfcm9sZV9zZXR0aW5nLmgiCiAj aW5jbHVkZSAiY2F0YWxvZy9wZ190YWJsZXNwYWNlLmgiCiAjaW5jbHVkZSAibGlicHEvYXV0aC5o IgorI2luY2x1ZGUgImxpYnBxL2F1dGgtdmFsaWRhdGUuaCIKICNpbmNsdWRlICJsaWJwcS9saWJw cS1iZS5oIgogI2luY2x1ZGUgIm1iL3BnX3djaGFyLmgiCiAjaW5jbHVkZSAibWlzY2FkbWluLmgi CkBAIC05MCw2ICs5MSw3IEBAIHN0YXRpYyB2b2lkIFRyYW5zYWN0aW9uVGltZW91dEhhbmRsZXIo dm9pZCk7CiBzdGF0aWMgdm9pZCBJZGxlU2Vzc2lvblRpbWVvdXRIYW5kbGVyKHZvaWQpOwogc3Rh dGljIHZvaWQgSWRsZVN0YXRzVXBkYXRlVGltZW91dEhhbmRsZXIodm9pZCk7CiBzdGF0aWMgdm9p ZCBDbGllbnRDaGVja1RpbWVvdXRIYW5kbGVyKHZvaWQpOworc3RhdGljIHZvaWQgQ3JlZGVudGlh bFZhbGlkYXRpb25UaW1lb3V0SGFuZGxlcih2b2lkKTsKIHN0YXRpYyBib29sIFRoZXJlSXNBdExl YXN0T25lUm9sZSh2b2lkKTsKIHN0YXRpYyB2b2lkIHByb2Nlc3Nfc3RhcnR1cF9vcHRpb25zKFBv cnQgKnBvcnQsIGJvb2wgYW1fc3VwZXJ1c2VyKTsKIHN0YXRpYyB2b2lkIHByb2Nlc3Nfc2V0dGlu Z3MoT2lkIGRhdGFiYXNlaWQsIE9pZCByb2xlaWQpOwpAQCAtNzc0LDYgKzc3Niw4IEBAIEluaXRQ b3N0Z3Jlcyhjb25zdCBjaGFyICppbl9kYm5hbWUsIE9pZCBkYm9pZCwKIAkJUmVnaXN0ZXJUaW1l b3V0KENMSUVOVF9DT05ORUNUSU9OX0NIRUNLX1RJTUVPVVQsIENsaWVudENoZWNrVGltZW91dEhh bmRsZXIpOwogCQlSZWdpc3RlclRpbWVvdXQoSURMRV9TVEFUU19VUERBVEVfVElNRU9VVCwKIAkJ CQkJCUlkbGVTdGF0c1VwZGF0ZVRpbWVvdXRIYW5kbGVyKTsKKwkJUmVnaXN0ZXJUaW1lb3V0KENS RURFTlRJQUxfVkFMSURBVElPTl9USU1FT1VULAorCQkJCQkJQ3JlZGVudGlhbFZhbGlkYXRpb25U aW1lb3V0SGFuZGxlcik7CiAJfQogCiAJLyoKQEAgLTEyMjcsNiArMTIzMSwxMiBAQCBJbml0UG9z dGdyZXMoY29uc3QgY2hhciAqaW5fZGJuYW1lLCBPaWQgZGJvaWQsCiAJLyogSW5pdGlhbGl6ZSB0 aGlzIGJhY2tlbmQncyBzZXNzaW9uIHN0YXRlLiAqLwogCUluaXRpYWxpemVTZXNzaW9uKCk7CiAK KwkvKiBJbml0aWFsaXplIGNyZWRlbnRpYWwgdmFsaWRhdGlvbiBzeXN0ZW0gKi8KKwlJbml0aWFs aXplQ3JlZGVudGlhbFZhbGlkYXRpb24oKTsKKworCS8qIEVuYWJsZSBjcmVkZW50aWFsIHZhbGlk YXRpb24gdGltZW91dCBpZiBjb25maWd1cmVkICovCisJRW5hYmxlQ3JlZGVudGlhbFZhbGlkYXRp b25UaW1lb3V0KCk7CisKIAkvKgogCSAqIElmIHRoaXMgaXMgYW4gaW50ZXJhY3RpdmUgc2Vzc2lv biwgbG9hZCBhbnkgbGlicmFyaWVzIHRoYXQgc2hvdWxkIGJlCiAJICogcHJlbG9hZGVkIGF0IGJh Y2tlbmQgc3RhcnQuICBTaW5jZSB0aG9zZSBhcmUgZGV0ZXJtaW5lZCBieSBHVUNzLCB0aGlzCkBA IC0xNDMzLDYgKzE0NDMsMTQgQEAgSWRsZVN0YXRzVXBkYXRlVGltZW91dEhhbmRsZXIodm9pZCkK IAlTZXRMYXRjaChNeUxhdGNoKTsKIH0KIAorc3RhdGljIHZvaWQKK0NyZWRlbnRpYWxWYWxpZGF0 aW9uVGltZW91dEhhbmRsZXIodm9pZCkKK3sKKwlDcmVkZW50aWFsVmFsaWRhdGlvblRpbWVvdXRQ ZW5kaW5nID0gdHJ1ZTsKKwlJbnRlcnJ1cHRQZW5kaW5nID0gdHJ1ZTsKKwlTZXRMYXRjaChNeUxh dGNoKTsKK30KKwogc3RhdGljIHZvaWQKIENsaWVudENoZWNrVGltZW91dEhhbmRsZXIodm9pZCkK IHsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvcG9zdGdyZXNxbC5jb25mLnNh bXBsZSBiL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvcG9zdGdyZXNxbC5jb25mLnNhbXBsZQppbmRl eCBlNGFiZTZjMDA3Ny4uMDVlMjgxNDMyODEgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxz L21pc2MvcG9zdGdyZXNxbC5jb25mLnNhbXBsZQorKysgYi9zcmMvYmFja2VuZC91dGlscy9taXNj L3Bvc3RncmVzcWwuY29uZi5zYW1wbGUKQEAgLTkwNCw2ICs5MDQsMTIgQEAKICNpbmNsdWRlX2lm X2V4aXN0cyA9ICcuLi4nICAgICAgICAgICAgICAjIGluY2x1ZGUgZmlsZSBvbmx5IGlmIGl0IGV4 aXN0cwogI2luY2x1ZGUgPSAnLi4uJyAgICAgICAgICAgICAgICAgICAgICAgICMgaW5jbHVkZSBm aWxlCiAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ1JFREVOVElBTCBWQUxJREFUSU9OCisj LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NyZWRlbnRpYWxfdmFsaWRhdGlvbi5lbmFibGVkID0g dHJ1ZSAgICAjIGVuYWJsZSBwZXJpb2RpYyBjcmVkZW50aWFsIHZhbGlkYXRpb24KK2NyZWRlbnRp YWxfdmFsaWRhdGlvbi5pbnRlcnZhbCA9IDEgICAgICAjIHZhbGlkYXRpb24gaW50ZXJ2YWwgaW4g bWludXRlcyAoMS02MCkKIAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBDVVNUT01JWkVEIE9Q VElPTlMKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2xpYnBxL2F1dGgtdmFsaWRhdGUtbWV0aG9k cy5oIGIvc3JjL2luY2x1ZGUvbGlicHEvYXV0aC12YWxpZGF0ZS1tZXRob2RzLmgKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjQyMDE4M2ExYzdkCi0tLSAvZGV2L251bGwK KysrIGIvc3JjL2luY2x1ZGUvbGlicHEvYXV0aC12YWxpZGF0ZS1tZXRob2RzLmgKQEAgLTAsMCAr MSwyNSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogYXV0aC12YWxpZGF0ZS1tZXRob2Rz LmgKKyAqICAgICAgSW50ZXJmYWNlIGZvciBhdXRoZW50aWNhdGlvbiBjcmVkZW50aWFsIHZhbGlk YXRpb24gbWV0aG9kcworICoKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyBkZWNsYXJhdGlvbnMgZm9y IHZhcmlvdXMgY3JlZGVudGlhbCB2YWxpZGF0aW9uIG1ldGhvZHMKKyAqIHVzZWQgd2l0aCB0aGUg Y3JlZGVudGlhbCB2YWxpZGF0aW9uIHN5c3RlbS4KKyAqCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQg KGMpIDE5OTYtMjAyNiwgUG9zdGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKKyAqIFBv cnRpb25zIENvcHlyaWdodCAoYykgMTk5NCwgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBD YWxpZm9ybmlhCisgKgorICogc3JjL2luY2x1ZGUvbGlicHEvYXV0aC12YWxpZGF0ZS1tZXRob2Rz LmgKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2lmbmRlZiBBVVRIX1ZBTElEQVRFX01F VEhPRFNfSAorI2RlZmluZSBBVVRIX1ZBTElEQVRFX01FVEhPRFNfSAorCisjaW5jbHVkZSAibGli cHEvbGlicHEtYmUuaCIKKyNpbmNsdWRlICJ1dGlscy90aW1lc3RhbXAuaCIKKworLyogSW5pdGlh bGl6ZSBhbGwgdmFsaWRhdGlvbiBtZXRob2RzICovCitleHRlcm4gdm9pZCBJbml0aWFsaXplVmFs aWRhdGlvbk1ldGhvZHModm9pZCk7CisKKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAg LyogQVVUSF9WQUxJREFURV9NRVRIT0RTX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2xp YnBxL2F1dGgtdmFsaWRhdGUuaCBiL3NyYy9pbmNsdWRlL2xpYnBxL2F1dGgtdmFsaWRhdGUuaApu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uZWEwOGM1MmZkYjkKLS0tIC9k ZXYvbnVsbAorKysgYi9zcmMvaW5jbHVkZS9saWJwcS9hdXRoLXZhbGlkYXRlLmgKQEAgLTAsMCAr MSw2NCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogYXV0aC12YWxpZGF0ZS5oCisgKgkg IEludGVyZmFjZSBmb3IgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbCB2YWxpZGF0aW9uCisgKgor ICogVGhpcyBmaWxlIHByb3ZpZGVzIGEgY29tbW9uIGludGVyZmFjZSBmb3IgdmFsaWRhdGluZyBj cmVkZW50aWFscworICogZHVyaW5nIGFuIGFjdGl2ZSBQb3N0Z3JlU1FMIHNlc3Npb24uCisgKgor ICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk2LTIwMjYsIFBvc3RncmVTUUwgR2xvYmFsIERl dmVsb3BtZW50IEdyb3VwCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTQsIFJlZ2VudHMg b2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQorICoKKyAqIHNyYy9pbmNsdWRlL2xpYnBx L2F1dGgtdmFsaWRhdGUuaAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaWZuZGVmIEFV VEhfVkFMSURBVEVfSAorI2RlZmluZSBBVVRIX1ZBTElEQVRFX0gKKworI2luY2x1ZGUgImxpYnBx L2xpYnBxLWJlLmgiCisjaW5jbHVkZSAibGlicHEvcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJwb3N0 bWFzdGVyL3Bvc3RtYXN0ZXIuaCIKKyNpbmNsdWRlICJ1dGlscy9ndWMuaCIKKyNpbmNsdWRlICJ1 dGlscy90aW1lb3V0LmgiCisKKy8qIERlZmluZSBjcmVkZW50aWFsIHZhbGlkYXRpb24gbWV0aG9k IHR5cGVzIGFzIGFuIGVudW0gKi8KK3R5cGVkZWYgZW51bSBDcmVkZW50aWFsVmFsaWRhdGlvblR5 cGUKK3sKKwlDVlRfUEFTU1dPUkQgPSAwLCAgICAgICAgICAvKiBBbGwgcGFzc3dvcmQtYmFzZWQg bWV0aG9kcyAobWQ1LCBzY3JhbSwgZXRjKSAqLworCUNWVF9PQVVUSCwgICAgICAgICAgICAgICAg IC8qIE9BdXRoIGJlYXJlciB0b2tlbiBhdXRoZW50aWNhdGlvbiAqLworCUNWVF9DT1VOVCAgICAg ICAgICAgICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiBjcmVkZW50aWFsIHZhbGlkYXRpb24gdHlw ZXMgKi8KK30gQ3JlZGVudGlhbFZhbGlkYXRpb25UeXBlOworCisvKiBQcm9jZXNzIGNyZWRlbnRp YWwgdmFsaWRhdGlvbiAqLworZXh0ZXJuIHZvaWQgUHJvY2Vzc0NyZWRlbnRpYWxWYWxpZGF0aW9u KHZvaWQpOworCisvKiBHVUMgdmFyaWFibGVzICovCitleHRlcm4gUEdETExJTVBPUlQgYm9vbCBj cmVkZW50aWFsX3ZhbGlkYXRpb25fZW5hYmxlZDsKK2V4dGVybiBQR0RMTElNUE9SVCBpbnQgY3Jl ZGVudGlhbF92YWxpZGF0aW9uX2ludGVydmFsOworCisvKiBDb21tb24gY3JlZGVudGlhbCB2YWxp ZGF0aW9uIGNhbGxiYWNrIHByb3RvdHlwZSAqLwordHlwZWRlZiBib29sICgqQ3JlZGVudGlhbFZh bGlkYXRpb25DYWxsYmFjaykgKHZvaWQpOworCisvKiBDcmVkZW50aWFsIHZhbGlkYXRpb24gc3Rh dHVzICovCit0eXBlZGVmIGVudW0gQ3JlZGVudGlhbFZhbGlkYXRpb25TdGF0dXMKK3sKKwlDVlNf VkFMSUQsCQkJCQkvKiBDcmVkZW50aWFscyBhcmUgdmFsaWQgKi8KKwlDVlNfRVhQSVJFRCwJCQkJ LyogQ3JlZGVudGlhbHMgaGF2ZSBleHBpcmVkICovCisJQ1ZTX0VSUk9SCQkJCQkvKiBFcnJvciBk dXJpbmcgdmFsaWRhdGlvbiAqLworfSBDcmVkZW50aWFsVmFsaWRhdGlvblN0YXR1czsKKworLyog SW5pdGlhbGl6ZSBjcmVkZW50aWFsIHZhbGlkYXRpb24gc3lzdGVtICovCitleHRlcm4gdm9pZCBJ bml0aWFsaXplQ3JlZGVudGlhbFZhbGlkYXRpb24odm9pZCk7CisKKy8qIFJlZ2lzdGVyIGEgdmFs aWRhdGlvbiBjYWxsYmFjayBmb3IgYSBzcGVjaWZpYyBhdXRoZW50aWNhdGlvbiBtZXRob2QgKi8K K2V4dGVybiB2b2lkIFJlZ2lzdGVyQ3JlZGVudGlhbFZhbGlkYXRvcihDcmVkZW50aWFsVmFsaWRh dGlvblR5cGUgbWV0aG9kX3R5cGUsCisJCQkJCQkJCQkJQ3JlZGVudGlhbFZhbGlkYXRpb25DYWxs YmFjayB2YWxpZGF0b3IpOworCisvKiBDaGVjayBjcmVkZW50aWFsIHZhbGlkaXR5ICovCitleHRl cm4gQ3JlZGVudGlhbFZhbGlkYXRpb25TdGF0dXMgQ2hlY2tDcmVkZW50aWFsVmFsaWRpdHkodm9p ZCk7CisKKy8qIEVuYWJsZSBjcmVkZW50aWFsIHZhbGlkYXRpb24gdGltZW91dCB0aW1lciAqLwor ZXh0ZXJuIHZvaWQgRW5hYmxlQ3JlZGVudGlhbFZhbGlkYXRpb25UaW1lb3V0KHZvaWQpOworCisj ZW5kaWYJCQkJCQkJLyogQVVUSF9WQUxJREFURV9IICovCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVk ZS9saWJwcS9vYXV0aC5oIGIvc3JjL2luY2x1ZGUvbGlicHEvb2F1dGguaAppbmRleCA0YTgyMmU5 YTFmMi4uMmZkMzBjNTU4MTQgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2xpYnBxL29hdXRoLmgK KysrIGIvc3JjL2luY2x1ZGUvbGlicHEvb2F1dGguaApAQCAtNjQsNiArNjQsNyBAQCB0eXBlZGVm IHZvaWQgKCpWYWxpZGF0b3JTaHV0ZG93bkNCKSAoVmFsaWRhdG9yTW9kdWxlU3RhdGUgKnN0YXRl KTsKIHR5cGVkZWYgYm9vbCAoKlZhbGlkYXRvclZhbGlkYXRlQ0IpIChjb25zdCBWYWxpZGF0b3JN b2R1bGVTdGF0ZSAqc3RhdGUsCiAJCQkJCQkJCQkgY29uc3QgY2hhciAqdG9rZW4sIGNvbnN0IGNo YXIgKnJvbGUsCiAJCQkJCQkJCQkgVmFsaWRhdG9yTW9kdWxlUmVzdWx0ICpyZXN1bHQpOwordHlw ZWRlZiBib29sICgqVmFsaWRhdG9yRXhwaXJlQ0IpIChjb25zdCBWYWxpZGF0b3JNb2R1bGVTdGF0 ZSAqc3RhdGUpOwogCiAvKgogICogSWRlbnRpZmllcyB0aGUgY29tcGlsZWQgQUJJIHZlcnNpb24g b2YgdGhlIHZhbGlkYXRvciBtb2R1bGUuIFNpbmNlIHRoZSBzZXJ2ZXIKQEAgLTcxLDcgKzcyLDkg QEAgdHlwZWRlZiBib29sICgqVmFsaWRhdG9yVmFsaWRhdGVDQikgKGNvbnN0IFZhbGlkYXRvck1v ZHVsZVN0YXRlICpzdGF0ZSwKICAqIHZlcnNpb25zLCB0aGlzIGlzIHJlc2VydmVkIGZvciBlbWVy Z2VuY3kgdXNlIHdpdGhpbiBhIHN0YWJsZSByZWxlYXNlIGxpbmUuCiAgKiBNYXkgaXQgbmV2ZXIg bmVlZCB0byBjaGFuZ2UuCiAgKi8KLSNkZWZpbmUgUEdfT0FVVEhfVkFMSURBVE9SX01BR0lDIDB4 MjAyNTAyMjAKKyNkZWZpbmUgUEdfT0FVVEhfVkFMSURBVE9SX01BR0lDX1YxIDB4MjAyNTAyMjAK KyNkZWZpbmUgUEdfT0FVVEhfVkFMSURBVE9SX01BR0lDX1YyIDB4MjAyNjAzMjYKKyNkZWZpbmUg UEdfT0FVVEhfVkFMSURBVE9SX01BR0lDIFBHX09BVVRIX1ZBTElEQVRPUl9NQUdJQ19WMgogCiB0 eXBlZGVmIHN0cnVjdCBPQXV0aFZhbGlkYXRvckNhbGxiYWNrcwogewpAQCAtODAsNiArODMsNyBA QCB0eXBlZGVmIHN0cnVjdCBPQXV0aFZhbGlkYXRvckNhbGxiYWNrcwogCVZhbGlkYXRvclN0YXJ0 dXBDQiBzdGFydHVwX2NiOwogCVZhbGlkYXRvclNodXRkb3duQ0Igc2h1dGRvd25fY2I7CiAJVmFs aWRhdG9yVmFsaWRhdGVDQiB2YWxpZGF0ZV9jYjsKKwlWYWxpZGF0b3JFeHBpcmVDQiBleHBpcmVf Y2I7ICAvKiBPcHRpb25hbDogQ2hlY2sgdG9rZW4gZXhwaXJhdGlvbiAqLwogfSBPQXV0aFZhbGlk YXRvckNhbGxiYWNrczsKIAogLyoKQEAgLTk4LDQgKzEwMiw4IEBAIGV4dGVybiBQR0RMTElNUE9S VCBjb25zdCBwZ19iZV9zYXNsX21lY2ggcGdfYmVfb2F1dGhfbWVjaDsKICAqLwogZXh0ZXJuIGJv b2wgY2hlY2tfb2F1dGhfdmFsaWRhdG9yKEhiYUxpbmUgKmhiYWxpbmUsIGludCBlbGV2ZWwsIGNo YXIgKiplcnJfbXNnKTsKIAorLyoKKyAqIENoZWNrIE9BdXRoIHRva2VuIGV4cGlyYXRpb24gdXNp bmcgdmFsaWRhdG9yJ3MgZXhwaXJlX2NiIGlmIGF2YWlsYWJsZS4KKyAqLworYm9vbCBDaGVja09B dXRoVmFsaWRhdG9yRXhwaXJhdGlvbih2b2lkKTsKICNlbmRpZgkJCQkJCQkvKiBQR19PQVVUSF9I ICovCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9taXNjYWRtaW4uaCBiL3NyYy9pbmNsdWRlL21p c2NhZG1pbi5oCmluZGV4IGYxNmYzNTY1OWI5Li40MmEwOWUyZjI5OSAxMDA2NDQKLS0tIGEvc3Jj L2luY2x1ZGUvbWlzY2FkbWluLmgKKysrIGIvc3JjL2luY2x1ZGUvbWlzY2FkbWluLmgKQEAgLTk5 LDYgKzk5LDcgQEAgZXh0ZXJuIFBHRExMSU1QT1JUIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBJZGxl U3RhdHNVcGRhdGVUaW1lb3V0UGVuZGluZzsKIAogZXh0ZXJuIFBHRExMSU1QT1JUIHZvbGF0aWxl IHNpZ19hdG9taWNfdCBDaGVja0NsaWVudENvbm5lY3Rpb25QZW5kaW5nOwogZXh0ZXJuIFBHRExM SU1QT1JUIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBDbGllbnRDb25uZWN0aW9uTG9zdDsKK2V4dGVy biBQR0RMTElNUE9SVCB2b2xhdGlsZSBzaWdfYXRvbWljX3QgQ3JlZGVudGlhbFZhbGlkYXRpb25U aW1lb3V0UGVuZGluZzsKIAogLyogdGhlc2UgYXJlIG1hcmtlZCB2b2xhdGlsZSBiZWNhdXNlIHRo ZXkgYXJlIGV4YW1pbmVkIGJ5IHNpZ25hbCBoYW5kbGVyczogKi8KIGV4dGVybiBQR0RMTElNUE9S VCB2b2xhdGlsZSB1aW50MzIgSW50ZXJydXB0SG9sZG9mZkNvdW50OwpkaWZmIC0tZ2l0IGEvc3Jj L2luY2x1ZGUvdXRpbHMvdGltZW91dC5oIGIvc3JjL2luY2x1ZGUvdXRpbHMvdGltZW91dC5oCmlu ZGV4IDA5NjViNTkwYjM0Li5kNDY3M2E4YTQwOCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvdXRp bHMvdGltZW91dC5oCisrKyBiL3NyYy9pbmNsdWRlL3V0aWxzL3RpbWVvdXQuaApAQCAtMzYsNiAr MzYsNyBAQCB0eXBlZGVmIGVudW0gVGltZW91dElkCiAJSURMRV9TVEFUU19VUERBVEVfVElNRU9V VCwKIAlDTElFTlRfQ09OTkVDVElPTl9DSEVDS19USU1FT1VULAogCVNUQVJUVVBfUFJPR1JFU1Nf VElNRU9VVCwKKwlDUkVERU5USUFMX1ZBTElEQVRJT05fVElNRU9VVCwKIAkvKiBGaXJzdCB1c2Vy LWRlZmluYWJsZSB0aW1lb3V0IHJlYXNvbiAqLwogCVVTRVJfVElNRU9VVCwKIAkvKiBNYXhpbXVt IG51bWJlciBvZiB0aW1lb3V0IHJlYXNvbnMgKi8KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L21vZHVs ZXMvb2F1dGhfdmFsaWRhdG9yL2ZhaWxfdmFsaWRhdG9yLmMgYi9zcmMvdGVzdC9tb2R1bGVzL29h dXRoX3ZhbGlkYXRvci9mYWlsX3ZhbGlkYXRvci5jCmluZGV4IDNkZTA0NzBhNTQxLi44NzU0ZTFl OGY4NSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvbW9kdWxlcy9vYXV0aF92YWxpZGF0b3IvZmFpbF92 YWxpZGF0b3IuYworKysgYi9zcmMvdGVzdC9tb2R1bGVzL29hdXRoX3ZhbGlkYXRvci9mYWlsX3Zh bGlkYXRvci5jCkBAIC0yOSw2ICsyOSw3IEBAIHN0YXRpYyBjb25zdCBPQXV0aFZhbGlkYXRvckNh bGxiYWNrcyB2YWxpZGF0b3JfY2FsbGJhY2tzID0gewogCVBHX09BVVRIX1ZBTElEQVRPUl9NQUdJ QywKIAogCS52YWxpZGF0ZV9jYiA9IGZhaWxfdG9rZW4sCisJLmV4cGlyZV9jYiA9IE5VTEwsCiB9 OwogCiBjb25zdCBPQXV0aFZhbGlkYXRvckNhbGxiYWNrcyAqCmRpZmYgLS1naXQgYS9zcmMvdGVz dC9tb2R1bGVzL29hdXRoX3ZhbGlkYXRvci9tYWdpY192YWxpZGF0b3IuYyBiL3NyYy90ZXN0L21v ZHVsZXMvb2F1dGhfdmFsaWRhdG9yL21hZ2ljX3ZhbGlkYXRvci5jCmluZGV4IDU1MGRhNDFkMTFi Li42ZTRkNzJmZGUzMCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvbW9kdWxlcy9vYXV0aF92YWxpZGF0 b3IvbWFnaWNfdmFsaWRhdG9yLmMKKysrIGIvc3JjL3Rlc3QvbW9kdWxlcy9vYXV0aF92YWxpZGF0 b3IvbWFnaWNfdmFsaWRhdG9yLmMKQEAgLTMwLDYgKzMwLDcgQEAgc3RhdGljIGNvbnN0IE9BdXRo VmFsaWRhdG9yQ2FsbGJhY2tzIHZhbGlkYXRvcl9jYWxsYmFja3MgPSB7CiAJMHhkZWFkYmVlZiwK IAogCS52YWxpZGF0ZV9jYiA9IHZhbGlkYXRlX3Rva2VuLAorCS5leHBpcmVfY2IgPSBOVUxMLAog fTsKIAogY29uc3QgT0F1dGhWYWxpZGF0b3JDYWxsYmFja3MgKgpkaWZmIC0tZ2l0IGEvc3JjL3Rl c3QvbW9kdWxlcy9vYXV0aF92YWxpZGF0b3IvdmFsaWRhdG9yLmMgYi9zcmMvdGVzdC9tb2R1bGVz L29hdXRoX3ZhbGlkYXRvci92YWxpZGF0b3IuYwppbmRleCAwYjk4M2E5ZGM4Zi4uMjc4NDcwOGE3 ODQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L21vZHVsZXMvb2F1dGhfdmFsaWRhdG9yL3ZhbGlkYXRv ci5jCisrKyBiL3NyYy90ZXN0L21vZHVsZXMvb2F1dGhfdmFsaWRhdG9yL3ZhbGlkYXRvci5jCkBA IC0zNCw3ICszNCw4IEBAIHN0YXRpYyBjb25zdCBPQXV0aFZhbGlkYXRvckNhbGxiYWNrcyB2YWxp ZGF0b3JfY2FsbGJhY2tzID0gewogCiAJLnN0YXJ0dXBfY2IgPSB2YWxpZGF0b3Jfc3RhcnR1cCwK IAkuc2h1dGRvd25fY2IgPSB2YWxpZGF0b3Jfc2h1dGRvd24sCi0JLnZhbGlkYXRlX2NiID0gdmFs aWRhdGVfdG9rZW4KKwkudmFsaWRhdGVfY2IgPSB2YWxpZGF0ZV90b2tlbiwKKwkuZXhwaXJlX2Ni ID0gTlVMTCwJCQkvKiBPcHRpb25hbDogbm90IGltcGxlbWVudGVkICovCiB9OwogCiAvKiBHVUNz ICovCg== --00000000000082b155064dff67ce--