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 1sRWKA-00G54K-Oj for pgsql-general@arkaria.postgresql.org; Wed, 10 Jul 2024 12:21:31 +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 1sRWK8-0046Hr-Tm for pgsql-general@arkaria.postgresql.org; Wed, 10 Jul 2024 12:21:28 +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.94.2) (envelope-from ) id 1sR1du-00CDlu-KE for pgsql-general@lists.postgresql.org; Tue, 09 Jul 2024 03:35:50 +0000 Received: from au-smtp-delivery-121.mimecast.com ([103.96.23.121]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sR1do-0019f8-Di for pgsql-general@postgresql.org; Tue, 09 Jul 2024 03:35:49 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=au.harveynorman.com; s=mimecast20210112; t=1720496139; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=uqW0HzjYT67hVB2Mwy7VRvvH+u776XnMKomkCrV76EE=; b=TQs4WXhQQmihpCbsrrkHD5cwAkNUNmQopP5ZLdvH5UKDJ2uLrT+jATbtT9qNaHDZbgTjUr bDK4ioud0uTvRTIsulwXu3py6tylEVeRYRdHqXrMZTKND/ysZvp9qCk0EIhHhr+skp8/ax LdgpNM0TcnWqkjZSXaelNh/QICy7Gro= Received: from SY5PR01CU010.outbound.protection.outlook.com (mail-australiaeastazlp17012053.outbound.protection.outlook.com [40.93.136.53]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id au-mta-30-pIU5GCYIM_GksyL-25hqDA-1; Tue, 09 Jul 2024 13:35:35 +1000 X-MC-Unique: pIU5GCYIM_GksyL-25hqDA-1 Received: from SY7PR01MB9007.ausprd01.prod.outlook.com (2603:10c6:10:217::14) by SY4PR01MB6608.ausprd01.prod.outlook.com (2603:10c6:10:133::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7741.36; Tue, 9 Jul 2024 03:35:33 +0000 Received: from SY7PR01MB9007.ausprd01.prod.outlook.com ([fe80::48c9:2d5a:34cf:a1cb]) by SY7PR01MB9007.ausprd01.prod.outlook.com ([fe80::48c9:2d5a:34cf:a1cb%6]) with mapi id 15.20.7741.033; Tue, 9 Jul 2024 03:35:33 +0000 From: "Buoro, John" To: Justin Clift CC: "pgsql-general@postgresql.org" Subject: RE: [EXTERNAL] Re: SSPI Feature Request Thread-Topic: [EXTERNAL] Re: SSPI Feature Request Thread-Index: AdqR+468gF2knXg0Q3+xzSwTKNbICQARYrQAD9rSxqA= Date: Tue, 9 Jul 2024 03:35:33 +0000 Message-ID: References: <475d191dec8afe65530e81d1748582ee@postgresql.org> In-Reply-To: <475d191dec8afe65530e81d1748582ee@postgresql.org> Accept-Language: en-GB, en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: x-ms-publictraffictype: Email x-ms-traffictypediagnostic: SY7PR01MB9007:EE_|SY4PR01MB6608:EE_ x-ms-office365-filtering-correlation-id: d0d48f6d-46ab-4380-03f3-08dc9fc830a3 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0;ARA:13230040|376014|1800799024|366016|38070700018 x-microsoft-antispam-message-info: =?us-ascii?Q?e1I0Tp26QmQW6d6AbpPbC+l7SyECFVb4ru/dWwQLgNDxglvNVV4Q4kQBGxEN?= =?us-ascii?Q?Rzbp6OHP8YhdrzN86Q5XYwY4CTNxPHFN0hyycSNu/ta2I8z7iemQz6SmAVhK?= =?us-ascii?Q?FKbri/M4f00Gv4itWhC/iZ63ww2gUxKiORhbmM9bf+43SPCD5qM7Aj6AvJy5?= =?us-ascii?Q?YPKRlWRu7k7kMrUeI9YzhK+mE+fPjuxY2vit/9DhxLOqWipSu/7b3mMS7eEa?= =?us-ascii?Q?Gs15xjZyfK7yQAEXuVhisqM2aFsKP7krtmELh4dVgJUNu0IRrn+yCFuETero?= =?us-ascii?Q?RaFarCnaSHlS+R45GyXWDWs3aWt9X6DV2grakauHIPfTOP/MP/u3K96wBLBd?= =?us-ascii?Q?lmqmhLASH4dY6yd8ir8AKt899kJA8VjlNu61KiwKlWno/1hYyUJxYGePvx4o?= =?us-ascii?Q?voOXOcG7IqRpWjX2pk/WmalQPwLEP+qzL69j6FmQhThzOB19v7Jajv6/AZVv?= =?us-ascii?Q?tXs1zJbowdDX6TTBQdTV+G+I5lR/uHH0WOsrrje04rEL5Ss6O2qc3RLe26qH?= =?us-ascii?Q?udOuwtPLkmXgVf4dZ1PUhIHLm4gPx1gR/4IKP2KLuBY3MdE3Jd1+NG5SZnTJ?= =?us-ascii?Q?w6IkTLydPXF3dGMkC3oF+J9GbZBLMYOQuaRkI9dLmiIiDkNmocLJ7rNjnEL3?= =?us-ascii?Q?PHMVYsQ9sVqHXDApU+AQpkcWJEy6/+c1CIadCUoW2z6SHwHCQaeDxevjge/w?= =?us-ascii?Q?4S6XkWJFDXCdvZj97sfZHNXLKf7YKqTty+GrS852H+viT2PsykkKbgoHgdP+?= =?us-ascii?Q?Z3GlKrJXuorz2GTlwHUXiQMWusHv4PLHKNGWB2MxDsqDey6/fbM6foaf81sY?= =?us-ascii?Q?bN2assb3E0yu7kyKmFX6KPPfbMAyGT6WNwOSKY7w2I28VlNNG+KpiJzTUcXr?= =?us-ascii?Q?EEqzv48KGK5OCKx6Dh2xJvTh02EbAkLncG/szkcet2MR6MqaX36oZSsFHhXe?= =?us-ascii?Q?thX8sGqWSiGJFwZhYVf1x8F9WgCXYTzSGuFYr48lVbscy2KUIxo9qOAUO34d?= =?us-ascii?Q?gh0uYJSfAT4QwFccKESLfOykGdADFbfc+6iQvmNItLVahhV/t6iuO+/gwejj?= =?us-ascii?Q?CufPlQG63lNrM8EUySn6Yt7ReZCuodcwNn0/oagmSeS7afweyDfn0aaIBWbZ?= =?us-ascii?Q?hspTcW4Hg9M4rmww8/NqUEHi8mQ84/txDF/4v+lQ/Jsrz95ISSYSia5/Ja+l?= =?us-ascii?Q?DlD6rK35JYjK6MQXamJoAimpvoItzfgyEQhGMbRxoZz0i1TsJYo1U0KYbqzN?= =?us-ascii?Q?BVj5Fy6Lwn67bdWLgukTjRHOU15BSmfKAUs1Qt4FLJA+Q9TABhOXJFrT3inZ?= =?us-ascii?Q?nub0w298gsjh03wLEBEJOA5kA/uLsa4emNJa3uylDMiGBewaPC5CrApd0NN1?= =?us-ascii?Q?Ot7DS2eKGJ1eR0fXywx8pKDDaBXhaLoEChO/P4ifnHVRDAi6ew=3D=3D?= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SY7PR01MB9007.ausprd01.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(1800799024)(366016)(38070700018);DIR:OUT;SFP:1102 x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?y1C3qeTQMm18wFtY0jwf4flmSjrGsx8TuHVZ8gpVar2Jvo3K3UAKbNLwozuq?= =?us-ascii?Q?q5WRahi5ktjKP72902w0OofHBfDWa1arJzFrvl4gUuTjEtocCuV1Co+LD65C?= =?us-ascii?Q?qqq9XozgGX1nFgYf1KJhjr68gL3jfXuVgzd1v8iZEB6tNXAPFTjXWs7W4Tbl?= =?us-ascii?Q?RmqMFzfW53x+ab8DQZrrI1BEXU1hbiAdfeOCrFzOnWf9gE4Xef0kR8ALnFu8?= =?us-ascii?Q?tC04QB74J3wb2SWzsz1iZ4LyXlj1k+ct6APp9Gb1QwxrOKrhdEqhlJrSU++z?= =?us-ascii?Q?6ww3KFR69akXuHRBVe8D/HtoetGL9RqgaG6YYSYECPhh+cb6wUsqyHMr05WG?= =?us-ascii?Q?K22EnC6+86ol6gNsQuOSP/XlG0AootNbwJkRmjmHkQU6v5iAgkomi5unhOzg?= =?us-ascii?Q?C1BPfk+Lj/UPKkVNBbWDz0qi6ObyJXNXuaiCHrnUY0T0gmJwdiP13dyXeGjy?= =?us-ascii?Q?ngxPujcIeSpuocy1E23o/EqswYiKbP0hl+fCpX4jV4YtcFd0ejjMBZQA1QJV?= =?us-ascii?Q?SyAF+A/xbGeqJO138DjLWaXMF7eQYR00QEsEnDd+uS8RnYFMePI0+praKYj+?= =?us-ascii?Q?VWZDxWb0q1jTTkIEqsHVPv8yNneNFFwkWuhQnyyXHeOun1u8OjstB08jVDwZ?= =?us-ascii?Q?KjgQDHWIhou3wD5YMFD08UKElDy8H0jAqoVA1v5LTMwDZSDTKvq8jJzLYijp?= =?us-ascii?Q?fJUmbedABwjbZgbZ/dRc9ozlNaepg9RHXrEOpY9pLB/7T/93OHLtc0UZpl/A?= =?us-ascii?Q?q/8I/bOjaJQ4YNjJvut+kFtFsB7rF0oUWabX3BOezmDCQdPK+oHvw4SEDLqe?= =?us-ascii?Q?LdUWGYN54gq/vjf3unlviD1qV1zu90YA7+rbZTKsXngkRVLBak13IvRYrYhJ?= =?us-ascii?Q?p+8bK8/dMRp5PEX7qJb8o83iJD5Q/7T/1tRs5+P5vBoAy8vO29gCidASotrD?= =?us-ascii?Q?pWTdvdUAt05I5EVJamRW9gRHmUyiSG5zNUJmyEcS71i2btWATmiHxXG0l3q5?= =?us-ascii?Q?EtvDGJCJHAEHmzx2VVLJBOKges9Q/osITYomw6vxKtbJXxivAp83tP0ppp7B?= =?us-ascii?Q?z/Fpbm3iSU08o0VS5K1PTndWMZLupgjfNmYc9Gd3M5f740Xec1qbFfXYkqNe?= =?us-ascii?Q?MLfDMa0wUVgXj0UTnJda21M8081ty25TxSCtbXgxp6RHoIkNKkG+k+OGzUhS?= =?us-ascii?Q?6clFU9HI3r3p07oHWkqWUOUYVBA+wuv8iwp7yRQ5+/LjmQ4VM53LdUj2vKhO?= =?us-ascii?Q?GeIF37QHmOPxbEnYTQ2gtuw0zE/TCGtFxPuG0yw1oEFjb1sbsfSRrKJ44Jnc?= =?us-ascii?Q?pjRiwPSUKd0QN20fG7np2paKiE0X7jgrpzCiYjUgrjiz8oP7wy0cA9y1kh3K?= =?us-ascii?Q?1Ex2g1e1FIoTpLLVkeLhWu7H/9Sk6cAU1d44BUwIsET0BlpvQlXm2lPyifQl?= =?us-ascii?Q?S/mY5wkfMW6FY6sKghBc2R2d//+SOU3nTzTNAyKJ2wZwsHgnB7srhmn/eujy?= =?us-ascii?Q?UH7jDbrhd7HSvD7t5RDvJNKr8JanP7C9CoY3OvWsIQAHKbVHwAYw2iR+m5KI?= =?us-ascii?Q?q3B+jmFJK0mLLajYNvYG1wsHI7WW8FvhRZQNUHNOimB+yf2ZX/9201aOmQeP?= =?us-ascii?Q?Rg=3D=3D?= MIME-Version: 1.0 X-OriginatorOrg: au.harveynorman.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SY7PR01MB9007.ausprd01.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: d0d48f6d-46ab-4380-03f3-08dc9fc830a3 X-MS-Exchange-CrossTenant-originalarrivaltime: 09 Jul 2024 03:35:33.7450 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: cde2d1c1-033b-4428-84ca-0806065ca032 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: 2cpm1aT0AWDLIbqSlCe/BXJEua0qnde/pT60+ZXKZmgJcmmHZAlklaalUiWyvhajtOa7yyiQj+9iKKK6BRxDWclV95+WDHZdnYC8nTdoiYQ= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SY4PR01MB6608 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: au.harveynorman.com Content-Language: en-US Content-Type: multipart/mixed; boundary="_002_SY7PR01MB9007B2AA3CC9763E13C9B630C7DB2SY7PR01MB9007ausp_" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --_002_SY7PR01MB9007B2AA3CC9763E13C9B630C7DB2SY7PR01MB9007ausp_ Content-Type: multipart/alternative; boundary="MCBoundary=_12407091335390731" --MCBoundary=_12407091335390731 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hi, I've dusted off my C books and coded a solution. In order to achieve the ability to authenticate domain groups in PostgreSQL= , I have made changes to the auth.c file attached which is located under \s= rc\backend\libpq\ from source version 16.3.2 I've checked 17 beta 2 and it would easily be able to be inserted in there = too. The changes are in three sections that are bound using the following tags..= . // START @@@@@@@@@@@@@@@@@@ // FINISH @@@@@@@@@@@@@@@@@@ When using SSPI you can grant access to a user by giving the login name as = firstname.lastname@SOMEDOMAIN for example. PostgresSQL has no concept of groups, just roles. The code provided allows you to specify a group name as a login. Example Us= erGroupName@SOMEDOMAIN It will search Active Directory \ LDAP for the current user's distinguished= name and the domain component (DC) their account is defined in. Then it will obtain all the access groups which this account belongs to (ex= cluding mail groups). It will compare the group name with what is defined in ProgreSQL. If there is a match, then that group name will be the identity of the user,= so that for example... SELECT USER; ...will show UserGroupName@SOMEDOMAIN as the user, and NOT firstname.lastna= me@SOMEDOMAIN. This is because PostgreSQL appears not to have group support nor the abilit= y to separate user identification and user authentication from what I can s= ee in the source code. If the user's account (example firstname.lastname@SOMEDOMAIN) is specifical= ly listed in the logins as well as the group (example UserGroupName@SOMEDOM= AIN) then it will use the user firstname.lastname@SOMEDOMAIN rather than th= e group. If there are multiple groups defined in PostgreSQL that the user is a membe= r of then the code will use the first matching group as obtained from Activ= e Directory \ LDAP. It will not work out which group has the most \ highest privileges. The code supplied makes calls to Windows APIs. It does not have code to all= ow non-Windows systems to make equivalent calls. The code has directives (#ifdef WIN32 #else #endif) with empty sections def= ined for non-WIN32 code to go into. The following explains how SSPI authentication is set up, firstly on the se= rver and then for the clients. This complete information appears to be missing from nearly all official do= cumentation. For SSPI to work the pg_hba.conf file on the server needs to be modified (a= dded) with the following line... # TYPE DATABASE USER ADDRESS METHOD host all all all sspi includ= e_realm=3D1 This will allow users from different subdomains to be authenticated - but o= nly after their user or group is defined in the Logins. When hosting PostgreSQL on a Windows server, please make sure that your ser= ver has registered the Service Principle Name (SPN). This must be done by someone with administrative access to Active Directory= from the server itself. setspn -A postgres/ Or the service account is replaced with the hostname if the service is runs= as "Network Service". setspn -A postgres/ Example: setspn -S POSTGRES/au.SOMEDOMAIN.com SVRCTSTAP032 setspn -S POSTGRES/SVRCTSTAP032.au.SOMEDOMAIN.com SVRCTSTAP032 Direct assignment of domain users in PostgreSQL Logins is done by adding us= ers using the following format examples: Admin.Name1@SOMEDOMAIN and NOT SOMEDOMAIN\Admin.Name1 where the distinguish= ed name is CN=3DAdmin Name1,OU=3DAdmins,DC=3DSOMEDOMAIN,DC=3Dcom Some.Name2@SYDNEY and NOT SYDNEY\Some.Name2 where the distinguished name is= CN=3DSome Name2,OU=3DUsers,DC=3DSYDNEY,DC=3DSOMEDOMAIN,DC=3Dcom For users clients like pgAdmin, users will need to edit their server connec= tion properties and enter in the Username field their name formatted as def= ined above (example Some.Name2@SYDNEY)=20 They will need to enable Kerberos authentication. Assignment of GROUPS however in PostgreSQL Logins is done by using the same= format as Logins (above). Example: GRP_IT_DBA@CORP where the distinguished name is CN=3DGRP_IT_DBA,OU=3DPermis= sions,OU=3DGroups,DC=3DCORP,DC=3DSOMEDOMAIN,DC=3Dcom More importantly, for the users clients like pgAdmin, they need to edit the= ir server connection properties and enter in the Username field their accou= nt name format. Example Admin.Name1@SOMEDOMAIN assuming that SOMEDOMAIN\Admin.Name1 is a me= mber of the group CORP\GRP_IT_DBA Their account is NOT specified in PostgreSQL Logins itself. Users should not use the group name like GRP_IT_DBA@CORP in the Username fi= eld of pgAdmin server connection properties, just use the user's account na= me. They will need to enable Kerberos authentication. Hopefully, someone will be able to pick this up and develop this further. NOTE: The silly thing with the pgAdmin client is the Server Connection User= name MUST be specified, even though you enable Kerberos authentication whic= h should really obtain the credentials used to run the pgAdmin process itse= lf if you don't specify a Username. But that is for someone else to figure = out. Regards, John Buoro -----Original Message----- From: Justin Clift =20 Sent: Friday, April 19, 2024 8:05 PM To: Buoro, John Cc: pgsql-general@postgresql.org Subject: [EXTERNAL] Re: SSPI Feature Request CAUTION This email originated from an EXTERNAL source. Do not click on any = links or open any attachments unless you recognise the sender and know that= the content is safe. On 2024-04-19 11:53, Buoro, John wrote: > SSPI Kerberos\NTLM authentication (Windows environment) currently only=20 > authenticates users, however, it does not authenticate a user against=20 > an LDAP \ Active Directory group. > Can you please look at making this possible? Sounds like it'd be pretty useful. :) Is this something that Harvey Norman would be interested in sponsoring? ie. hiring a suitable PostgreSQL developer (not me!) to implement it There are quite a few skilled PostgreSQL developers around these days, so (= in theory) it shouldn't be *too hard* find someone the right person. ? Regards and best wishes, Justin Clift Disclaimer The information contained in this communication from the sender is confiden= tial. It is intended solely for use by the recipient and others authorized = to receive it. If you are not the recipient, you are hereby notified that a= ny disclosure, copying, distribution or taking action in relation of the co= ntents of this information is strictly prohibited and may be unlawful. This email has been scanned for viruses and malware, and may have been auto= matically archived by Mimecast, a leader in email security and cyber resili= ence. Mimecast integrates email defenses with brand protection, security aw= areness training, web security, compliance and other essential capabilities= . Mimecast helps protect large and small organizations from malicious activ= ity, human error and technology failure; and to lead the movement toward bu= ilding a more resilient world. To find out more, visit our website. --MCBoundary=_12407091335390731 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=UTF-8 Hi,

I've dusted off my C books and coded a solution.

In order to achieve the ability to authenticate domain groups in PostgreSQL= , I have made changes to the auth.c file attached which is located under \s= rc\backend\libpq\ from source version 16.3.2
I've checked 17 beta 2 and it would easily be able to be inserted in there = too.
The changes are in three sections that are bound using the following tags..= .
// START @@@@@@@@@@@@@@@@@@
// FINISH @@@@@@@@@@@@@@@@@@

When using SSPI you can grant access to a user by giving the login name as = firstname.lastname@SOMEDOM= AIN for example.
PostgresSQL has no concept of groups, just roles.
The code provided allows you to specify a group name as a login. Example UserGroupName@SOMEDOMAIN
It will search Active Directory \ LDAP for the current user's distinguished= name and the domain component (DC) their account is defined in.
Then it will obtain all the access groups which this account belongs to (ex= cluding mail groups).
It will compare the group name with what is defined in ProgreSQL.
If there is a match, then that group name will be the identity of the user,= so that for example...

SELECT USER;

...will show UserGroupName@SOME= DOMAIN as the user, and NOT firstname.lastname@SOMEDOMAIN.
This is because PostgreSQL appears not to have group support nor the abilit= y to separate user identification and user authentication from what I can s= ee in the source code.

If the user's account (example firstname.lastname@SOMEDOMAIN) is specifical= ly listed in the logins as well as the group (example UserGroupName@SOMEDOM= AIN) then it will use the user firstname.lastname@SOMEDOMAIN rather than the group.
If there are multiple groups defined in PostgreSQL that the user is a membe= r of then the code will use the first matching group as obtained from Activ= e Directory \ LDAP.
It will not work out which group has the most \ highest privileges.

The code supplied makes calls to Windows APIs. It does not have code to all= ow non-Windows systems to make equivalent calls.
The code has directives (#ifdef WIN32 #else #endif) with empty sections def= ined for non-WIN32 code to go into.

The following explains how SSPI authentication is set up, firstly on the se= rver and then for the clients.
This complete information appears to be missing from nearly all official do= cumentation.

For SSPI to work the pg_hba.conf file on the server needs to be modified (a= dded) with the following line...

# TYPE DATABASE USER ADDRESS METHOD
host all all all sspi includ= e_realm=3D1

This will allow users from different subdomains to be authenticated - but o= nly after their user or group is defined in the Logins.

When hosting PostgreSQL on a Windows server, please make sure that your ser= ver has registered the Service Principle Name (SPN).
This must be done by someone with administrative access to Active Directory= from the server itself.

setspn -A postgres/<Server FQDN> <Service Account>
Or the service account is replaced with the hostname if the service is runs= as "Network Service".
setspn -A postgres/<Server FQDN> <hostname>

Example:
setspn -S POSTGRES/au.SOMEDOMAIN.com SVRCTSTAP032
setspn -S POSTGRES/SVRCTSTAP032.au.SOMEDOMAIN.com SVRCTSTAP032

Direct assignment of domain users in PostgreSQL Logins is done by adding us= ers using the following format examples:
Admin.Name1@SOMEDOMAIN and NO= T SOMEDOMAIN\Admin.Name1 where the distinguished name is CN=3DAdmin Name1,O= U=3DAdmins,DC=3DSOMEDOMAIN,DC=3Dcom
Some.Name2@SYDNEY and NOT SYDNEY\S= ome.Name2 where the distinguished name is CN=3DSome Name2,OU=3DUsers,DC=3DS= YDNEY,DC=3DSOMEDOMAIN,DC=3Dcom

For users clients like pgAdmin, users will need to edit their server connec= tion properties and enter in the Username field their name formatted as def= ined above (example Some.Name2@SYDNEY)
They will need to enable Kerberos authentication.

Assignment of GROUPS however in PostgreSQL Logins is done by using the same= format as Logins (above). Example:
GRP_IT_DBA@CORP where the distinguis= hed name is CN=3DGRP_IT_DBA,OU=3DPermissions,OU=3DGroups,DC=3DCORP,DC=3DSOM= EDOMAIN,DC=3Dcom
More importantly, for the users clients like pgAdmin, they need to edit the= ir server connection properties and enter in the Username field their accou= nt name format.
Example Admin.Name1@SOMEDOMAIN
assuming that SOMEDOMAIN\Admin.Name1 is a member of the group CORP\GRP_IT= _DBA
Their account is NOT specified in PostgreSQL Logins itself.
Users should not use the group name like
GRP_IT_DBA@CORP in the Username field of pgAdmin server connection pro= perties, just use the user's account name.
They will need to enable Kerberos authentication.

Hopefully, someone will be able to pick this up and develop this further.
NOTE: The silly thing with the pgAdmin client is the Server Connection User= name MUST be specified, even though you enable Kerberos authentication whic= h should really obtain the credentials used to run the pgAdmin process itse= lf if you don't specify a Username. But that is for someone else to figure = out.

Regards,
John Buoro

-----Original Message-----
From: Justin Clift <justin@postgresql.org>
Sent: Friday, April 19, 2024 8:05 PM
To: Buoro, John <John.Buoro@au.harveynorman.com>
Cc: pgsql-general@postgresq= l.org
Subject: [EXTERNAL] Re: SSPI Feature Request

CAUTION This email originated from an EXTERNAL source. Do not click on any = links or open any attachments unless you recognise the sender and know that= the content is safe.

On 2024-04-19 11:53, Buoro, John wrote:
<snip>
> SSPI Kerberos\NTLM authentication (Windows environment) currently only=
> authenticates users, however, it does not authenticate a user against =
> an LDAP \ Active Directory group.
<snip>
> Can you please look at making this possible?

Sounds like it'd be pretty useful. :)

Is this something that Harvey Norman would be interested in sponsoring?

ie. hiring a suitable PostgreSQL developer (not me!) to implement it

There are quite a few skilled PostgreSQL developers around these days, so (= in theory) it shouldn't be *too hard* find someone the right person.

?

Regards and best wishes,

Justin Clift


<= b>Disclaimer

***************************************************************************=
=20 PRIVATE & CONFIDENTIAL
=20 This email may contain legally privileged, confidential information or copy= right material of the sender or a third party.=20 This email and any attachments are intended for the addressee(s) only. If = you are not the intended recipient, please contact the sender by reply emai= l and delete this email and any attachments immediately.=20 You must not read, copy, use, distribute or disclose the contents of this e= mail or any attachments without the consent of the sender or the relevant t= hird party.=20 The sender does not accept responsibility for any unauthorised use or relia= nce on the contents of this email including any attachments. Except as required by law, the sender does not represent or warrant that th= e integrity of this email has been maintained or that it is free from error= s, viruses, interceptions or interference.=20 Any views expressed by the sender in this email and any attachments are tho= se of the individual sender, except where the sender specifically states th= em to be the views of a relevant third party.
This notice should not be removed from this email.
**********************************************************************= *****

--MCBoundary=_12407091335390731-- --_002_SY7PR01MB9007B2AA3CC9763E13C9B630C7DB2SY7PR01MB9007ausp_ Content-Type: text/plain; name=auth.c; charset=WINDOWS-1252 Content-Description: auth.c Content-Disposition: attachment; filename="auth.c"; size=102992; creation-date="Tue, 09 Jul 2024 03:03:00 GMT"; modification-date="Tue, 09 Jul 2024 03:35:33 GMT" Content-Transfer-Encoding: base64 LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIGF1dGguYwogKgkgIFJvdXRpbmVzIHRvIGhhbmRsZSBu ZXR3b3JrIGF1dGhlbnRpY2F0aW9uCiAqCiAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5Ni0y MDIzLCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAogKiBQb3J0aW9ucyBDb3B5 cmlnaHQgKGMpIDE5OTQsIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQog KgogKgogKiBJREVOVElGSUNBVElPTgogKgkgIHNyYy9iYWNrZW5kL2xpYnBxL2F1dGguYwogKgog Ki0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KICovCgojaW5jbHVkZSAicG9zdGdyZXMuaCIKCiNpbmNsdWRlIDxz eXMvcGFyYW0uaD4KI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KI2luY2x1ZGUgPHN5cy9zb2NrZXQu aD4KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2luY2x1ZGUgPG5ldGRiLmg+CiNpbmNsdWRlIDxw d2QuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgoKI2luY2x1ZGUgImNvbW1hbmRzL3VzZXIuaCIKI2lu Y2x1ZGUgImNvbW1vbi9pcC5oIgojaW5jbHVkZSAiY29tbW9uL21kNS5oIgojaW5jbHVkZSAibGli cHEvYXV0aC5oIgojaW5jbHVkZSAibGlicHEvY3J5cHQuaCIKI2luY2x1ZGUgImxpYnBxL2xpYnBx LmgiCiNpbmNsdWRlICJsaWJwcS9wcWZvcm1hdC5oIgojaW5jbHVkZSAibGlicHEvc2FzbC5oIgoj aW5jbHVkZSAibGlicHEvc2NyYW0uaCIKI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgojaW5jbHVkZSAi cG9ydC9wZ19ic3dhcC5oIgojaW5jbHVkZSAicG9zdG1hc3Rlci9wb3N0bWFzdGVyLmgiCiNpbmNs dWRlICJyZXBsaWNhdGlvbi93YWxzZW5kZXIuaCIKI2luY2x1ZGUgInN0b3JhZ2UvaXBjLmgiCiNp bmNsdWRlICJ1dGlscy9ndWMuaCIKI2luY2x1ZGUgInV0aWxzL21lbXV0aWxzLmgiCiNpbmNsdWRl ICJ1dGlscy90aW1lc3RhbXAuaCIKCi8vIFNUQVJUIEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA QEBAQEBAQEBAQEBACiNpbmNsdWRlICJ1dGlscy9zeXNjYWNoZS5oIgojaWZkZWYgV0lOMzIKI2lu Y2x1ZGUgPHdjaGFyLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNp bmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHdpbnNvY2syLmg+CiNpbmNsdWRlIDx3aW5kb3dz Lmg+IAojaW5jbHVkZSA8ZHNnZXRkYy5oPgojaW5jbHVkZSA8cnBjLmg+CiNpbmNsdWRlIDxhc3Nl cnQuaD4KI2luY2x1ZGUgPGxtLmg+CiNpbmNsdWRlIDxsbWFwaWJ1Zi5oPgojaW5jbHVkZSA8bG1h Y2Nlc3MuaD4KI2luY2x1ZGUgPG50ZHNhcGkuaD4KCiNwcmFnbWEgY29tbWVudChsaWIsICJuZXRh cGkzMi5saWIiKQojcHJhZ21hIGNvbW1lbnQobGliLCAiTnRkc2FwaS5saWIiKQojZW5kaWYKLy8g RklOSVNIIEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBACgovKi0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K ICogR2xvYmFsIGF1dGhlbnRpY2F0aW9uIGZ1bmN0aW9ucwogKi0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCnN0YXRpYyB2 b2lkIGF1dGhfZmFpbGVkKFBvcnQgKnBvcnQsIGludCBzdGF0dXMsIGNvbnN0IGNoYXIgKmxvZ2Rl dGFpbCk7CnN0YXRpYyBjaGFyICpyZWN2X3Bhc3N3b3JkX3BhY2tldChQb3J0ICpwb3J0KTsKc3Rh dGljIHZvaWQgc2V0X2F1dGhuX2lkKFBvcnQgKnBvcnQsIGNvbnN0IGNoYXIgKmlkKTsKCgovKi0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KICogUGFzc3dvcmQtYmFzZWQgYXV0aGVudGljYXRpb24gbWV0aG9kcyAocGFzc3dvcmQs IG1kNSwgYW5kIHNjcmFtLXNoYS0yNTYpCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8Kc3RhdGljIGludAlDaGVja1Bh c3N3b3JkQXV0aChQb3J0ICpwb3J0LCBjb25zdCBjaGFyICoqbG9nZGV0YWlsKTsKc3RhdGljIGlu dAlDaGVja1BXQ2hhbGxlbmdlQXV0aChQb3J0ICpwb3J0LCBjb25zdCBjaGFyICoqbG9nZGV0YWls KTsKCnN0YXRpYyBpbnQJQ2hlY2tNRDVBdXRoKFBvcnQgKnBvcnQsIGNoYXIgKnNoYWRvd19wYXNz LAoJCQkJCQkgY29uc3QgY2hhciAqKmxvZ2RldGFpbCk7CgoKLyotLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIElkZW50IGF1 dGhlbnRpY2F0aW9uCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KLyogTWF4IHNpemUgb2YgdXNlcm5hbWUgaWRlbnQg c2VydmVyIGNhbiByZXR1cm4gKHBlciBSRkMgMTQxMykgKi8KI2RlZmluZSBJREVOVF9VU0VSTkFN RV9NQVggNTEyCgovKiBTdGFuZGFyZCBUQ1AgcG9ydCBudW1iZXIgZm9yIElkZW50IHNlcnZpY2Uu ICBBc3NpZ25lZCBieSBJQU5BICovCiNkZWZpbmUgSURFTlRfUE9SVCAxMTMKCnN0YXRpYyBpbnQJ aWRlbnRfaW5ldChoYmFQb3J0ICpwb3J0KTsKCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogUGVlciBhdXRoZW50aWNh dGlvbgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KICovCnN0YXRpYyBpbnQJYXV0aF9wZWVyKGhiYVBvcnQgKnBvcnQpOwoK Ci8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQogKiBQQU0gYXV0aGVudGljYXRpb24KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwojaWZkZWYgVVNF X1BBTQojaWZkZWYgSEFWRV9QQU1fUEFNX0FQUExfSAojaW5jbHVkZSA8cGFtL3BhbV9hcHBsLmg+ CiNlbmRpZgojaWZkZWYgSEFWRV9TRUNVUklUWV9QQU1fQVBQTF9ICiNpbmNsdWRlIDxzZWN1cml0 eS9wYW1fYXBwbC5oPgojZW5kaWYKCiNkZWZpbmUgUEdTUUxfUEFNX1NFUlZJQ0UgInBvc3RncmVz cWwiCS8qIFNlcnZpY2UgbmFtZSBwYXNzZWQgdG8gUEFNICovCgpzdGF0aWMgaW50CUNoZWNrUEFN QXV0aChQb3J0ICpwb3J0LCBjb25zdCBjaGFyICp1c2VyLCBjb25zdCBjaGFyICpwYXNzd29yZCk7 CnN0YXRpYyBpbnQJcGFtX3Bhc3N3ZF9jb252X3Byb2MoaW50IG51bV9tc2csIGNvbnN0IHN0cnVj dCBwYW1fbWVzc2FnZSAqKm1zZywKCQkJCQkJCQkgc3RydWN0IHBhbV9yZXNwb25zZSAqKnJlc3As IHZvaWQgKmFwcGRhdGFfcHRyKTsKCnN0YXRpYyBzdHJ1Y3QgcGFtX2NvbnYgcGFtX3Bhc3N3X2Nv bnYgPSB7CgkmcGFtX3Bhc3N3ZF9jb252X3Byb2MsCglOVUxMCn07CgpzdGF0aWMgY29uc3QgY2hh ciAqcGFtX3Bhc3N3ZCA9IE5VTEw7CS8qIFdvcmthcm91bmQgZm9yIFNvbGFyaXMgMi42CgkJCQkJ CQkJCQkgKiBicm9rZW5uZXNzICovCnN0YXRpYyBQb3J0ICpwYW1fcG9ydF9jbHVkZ2U7CS8qIFdv cmthcm91bmQgZm9yIHBhc3NpbmcgIlBvcnQgKnBvcnQiIGludG8KCQkJCQkJCQkgKiBwYW1fcGFz c3dkX2NvbnZfcHJvYyAqLwpzdGF0aWMgYm9vbCBwYW1fbm9fcGFzc3dvcmQ7CS8qIEZvciBkZXRl Y3Rpbmcgbm8tcGFzc3dvcmQtZ2l2ZW4gKi8KI2VuZGlmCQkJCQkJCS8qIFVTRV9QQU0gKi8KCgov Ki0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KICogQlNEIGF1dGhlbnRpY2F0aW9uCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KI2lmZGVmIFVTRV9C U0RfQVVUSAojaW5jbHVkZSA8YnNkX2F1dGguaD4KCnN0YXRpYyBpbnQJQ2hlY2tCU0RBdXRoKFBv cnQgKnBvcnQsIGNoYXIgKnVzZXIpOwojZW5kaWYJCQkJCQkJLyogVVNFX0JTRF9BVVRIICovCgoK LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCiAqIExEQVAgYXV0aGVudGljYXRpb24KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwojaWZkZWYgVVNF X0xEQVAKI2lmbmRlZiBXSU4zMgovKiBXZSB1c2UgYSBkZXByZWNhdGVkIGZ1bmN0aW9uIHRvIGtl ZXAgdGhlIGNvZGVwYXRoIHRoZSBzYW1lIGFzIHdpbjMyLiAqLwojZGVmaW5lIExEQVBfREVQUkVD QVRFRCAxCiNpbmNsdWRlIDxsZGFwLmg+CiNlbHNlCiNpbmNsdWRlIDx3aW5sZGFwLmg+CgojZW5k aWYKCnN0YXRpYyBpbnQJQ2hlY2tMREFQQXV0aChQb3J0ICpwb3J0KTsKCi8qIExEQVBfT1BUX0RJ QUdOT1NUSUNfTUVTU0FHRSBpcyB0aGUgbmV3ZXIgc3BlbGxpbmcgKi8KI2lmbmRlZiBMREFQX09Q VF9ESUFHTk9TVElDX01FU1NBR0UKI2RlZmluZSBMREFQX09QVF9ESUFHTk9TVElDX01FU1NBR0Ug TERBUF9PUFRfRVJST1JfU1RSSU5HCiNlbmRpZgoKLyogRGVmYXVsdCBMREFQIHBhc3N3b3JkIG11 dGF0b3IgaG9vaywgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzaGFyZWQgbGlicmFyeSAqLwpzdGF0 aWMgY2hhciAqZHVtbXlfbGRhcF9wYXNzd29yZF9tdXRhdG9yKGNoYXIgKmlucHV0KTsKYXV0aF9w YXNzd29yZF9ob29rX3R5cCBsZGFwX3Bhc3N3b3JkX2hvb2sgPSBkdW1teV9sZGFwX3Bhc3N3b3Jk X211dGF0b3I7CgojZW5kaWYJCQkJCQkJLyogVVNFX0xEQVAgKi8KCi8qLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBDZXJ0 IGF1dGhlbnRpY2F0aW9uCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KI2lmZGVmIFVTRV9TU0wKc3RhdGljIGludAlD aGVja0NlcnRBdXRoKFBvcnQgKnBvcnQpOwojZW5kaWYKCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogS2VyYmVyb3Mg YW5kIEdTU0FQSSBHVUNzCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KY2hhcgkgICAqcGdfa3JiX3NlcnZlcl9rZXlm aWxlOwpib29sCQlwZ19rcmJfY2FzZWluc191c2VyczsKYm9vbAkJcGdfZ3NzX2FjY2VwdF9kZWxl Z2F0aW9uOwoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQogKiBHU1NBUEkgQXV0aGVudGljYXRpb24KICotLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAq LwojaWZkZWYgRU5BQkxFX0dTUwojaW5jbHVkZSAibGlicHEvYmUtZ3NzYXBpLWNvbW1vbi5oIgoK c3RhdGljIGludAlwZ19HU1NfY2hlY2thdXRoKFBvcnQgKnBvcnQpOwpzdGF0aWMgaW50CXBnX0dT U19yZWN2YXV0aChQb3J0ICpwb3J0KTsKI2VuZGlmCQkJCQkJCS8qIEVOQUJMRV9HU1MgKi8KCgov Ki0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KICogU1NQSSBBdXRoZW50aWNhdGlvbgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCiNpZmRlZiBFTkFC TEVfU1NQSQp0eXBlZGVmIFNFQ1VSSVRZX1NUQVRVUwoJCQkoV0lOQVBJICogUVVFUllfU0VDVVJJ VFlfQ09OVEVYVF9UT0tFTl9GTikgKFBDdHh0SGFuZGxlLCB2b2lkICoqKTsKc3RhdGljIGludAlw Z19TU1BJX3JlY3ZhdXRoKFBvcnQgKnBvcnQpOwpzdGF0aWMgaW50CXBnX1NTUElfbWFrZV91cG4o Y2hhciAqYWNjb3VudG5hbWUsCgkJCQkJCQkgc2l6ZV90IGFjY291bnRuYW1lc2l6ZSwKCQkJCQkJ CSBjaGFyICpkb21haW5uYW1lLAoJCQkJCQkJIHNpemVfdCBkb21haW5uYW1lc2l6ZSwKCQkJCQkJ CSBib29sIHVwZGF0ZV9hY2NvdW50bmFtZSk7CiNlbmRpZgoKLyotLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIFJBRElVUyBB dXRoZW50aWNhdGlvbgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCnN0YXRpYyBpbnQJQ2hlY2tSQURJVVNBdXRoKFBv cnQgKnBvcnQpOwpzdGF0aWMgaW50CVBlcmZvcm1SYWRpdXNUcmFuc2FjdGlvbihjb25zdCBjaGFy ICpzZXJ2ZXIsIGNvbnN0IGNoYXIgKnNlY3JldCwgY29uc3QgY2hhciAqcG9ydHN0ciwgY29uc3Qg Y2hhciAqaWRlbnRpZmllciwgY29uc3QgY2hhciAqdXNlcl9uYW1lLCBjb25zdCBjaGFyICpwYXNz d2QpOwoKCi8qCiAqIE1heGltdW0gYWNjZXB0ZWQgc2l6ZSBvZiBHU1MgYW5kIFNTUEkgYXV0aGVu dGljYXRpb24gdG9rZW5zLgogKiBXZSBhbHNvIHVzZSB0aGlzIGFzIGEgbGltaXQgb24gb3JkaW5h cnkgcGFzc3dvcmQgcGFja2V0IGxlbmd0aHMuCiAqCiAqIEtlcmJlcm9zIHRpY2tldHMgYXJlIHVz dWFsbHkgcXVpdGUgc21hbGwsIGJ1dCB0aGUgVEdUcyBpc3N1ZWQgYnkgV2luZG93cwogKiBkb21h aW4gY29udHJvbGxlcnMgaW5jbHVkZSBhbiBhdXRob3JpemF0aW9uIGZpZWxkIGtub3duIGFzIHRo ZSBQcml2aWxlZ2UKICogQXR0cmlidXRlIENlcnRpZmljYXRlIChQQUMpLCB3aGljaCBjb250YWlu cyB0aGUgdXNlcidzIFdpbmRvd3MgcGVybWlzc2lvbnMKICogKGdyb3VwIG1lbWJlcnNoaXBzIGV0 Yy4pLiBUaGUgUEFDIGlzIGNvcGllZCBpbnRvIGFsbCB0aWNrZXRzIG9idGFpbmVkIG9uCiAqIHRo ZSBiYXNpcyBvZiB0aGlzIFRHVCAoZXZlbiB0aG9zZSBpc3N1ZWQgYnkgVW5peCByZWFsbXMgd2hp Y2ggdGhlIFdpbmRvd3MKICogcmVhbG0gdHJ1c3RzKSwgYW5kIGNhbiBiZSBzZXZlcmFsIGtCIGlu IHNpemUuIFRoZSBtYXhpbXVtIHRva2VuIHNpemUKICogYWNjZXB0ZWQgYnkgV2luZG93cyBzeXN0 ZW1zIGlzIGRldGVybWluZWQgYnkgdGhlIE1heEF1dGhUb2tlbiBXaW5kb3dzCiAqIHJlZ2lzdHJ5 IHNldHRpbmcuIE1pY3Jvc29mdCByZWNvbW1lbmRzIHRoYXQgaXQgaXMgbm90IHNldCBoaWdoZXIg dGhhbgogKiA2NTUzNSBieXRlcywgc28gdGhhdCBzZWVtcyBsaWtlIGEgcmVhc29uYWJsZSBsaW1p dCBmb3IgdXMgYXMgd2VsbC4KICovCiNkZWZpbmUgUEdfTUFYX0FVVEhfVE9LRU5fTEVOR1RICTY1 NTM1CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KICogR2xvYmFsIGF1dGhlbnRpY2F0aW9uIGZ1bmN0aW9ucwogKi0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KICovCgovKgogKiBUaGlzIGhvb2sgYWxsb3dzIHBsdWdpbnMgdG8gZ2V0IGNvbnRyb2wgZm9s bG93aW5nIGNsaWVudCBhdXRoZW50aWNhdGlvbiwKICogYnV0IGJlZm9yZSB0aGUgdXNlciBoYXMg YmVlbiBpbmZvcm1lZCBhYm91dCB0aGUgcmVzdWx0cy4gIEl0IGNvdWxkIGJlIHVzZWQKICogdG8g cmVjb3JkIGxvZ2luIGV2ZW50cywgaW5zZXJ0IGEgZGVsYXkgYWZ0ZXIgZmFpbGVkIGF1dGhlbnRp Y2F0aW9uLCBldGMuCiAqLwpDbGllbnRBdXRoZW50aWNhdGlvbl9ob29rX3R5cGUgQ2xpZW50QXV0 aGVudGljYXRpb25faG9vayA9IE5VTEw7CgovKgogKiBUZWxsIHRoZSB1c2VyIHRoZSBhdXRoZW50 aWNhdGlvbiBmYWlsZWQsIGJ1dCBub3QgKG11Y2ggYWJvdXQpIHdoeS4KICoKICogVGhlcmUgaXMg YSB0cmFkZW9mZiBoZXJlIGJldHdlZW4gc2VjdXJpdHkgY29uY2VybnMgYW5kIG1ha2luZyBsaWZl CiAqIHVubmVjZXNzYXJpbHkgZGlmZmljdWx0IGZvciBsZWdpdGltYXRlIHVzZXJzLiAgV2Ugd291 bGQgbm90LCBmb3IgZXhhbXBsZSwKICogd2FudCB0byByZXBvcnQgdGhlIHBhc3N3b3JkIHdlIHdl cmUgZXhwZWN0aW5nIHRvIHJlY2VpdmUuLi4KICogQnV0IGl0IHNlZW1zIHVzZWZ1bCB0byByZXBv cnQgdGhlIHVzZXJuYW1lIGFuZCBhdXRob3JpemF0aW9uIG1ldGhvZAogKiBpbiB1c2UsIGFuZCB0 aGVzZSBhcmUgaXRlbXMgdGhhdCBtdXN0IGJlIHByZXN1bWVkIGtub3duIHRvIGFuIGF0dGFja2Vy CiAqIGFueXdheS4KICogTm90ZSB0aGF0IG1hbnkgc29ydHMgb2YgZmFpbHVyZSByZXBvcnQgYWRk aXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0aGUKICogcG9zdG1hc3RlciBsb2csIHdoaWNoIHdlIGhv cGUgaXMgb25seSByZWFkYWJsZSBieSBnb29kIGd1eXMuICBJbgogKiBwYXJ0aWN1bGFyLCBpZiBs b2dkZXRhaWwgaXNuJ3QgTlVMTCwgd2Ugc2VuZCB0aGF0IHN0cmluZyB0byB0aGUgbG9nLgogKi8K c3RhdGljIHZvaWQKYXV0aF9mYWlsZWQoUG9ydCAqcG9ydCwgaW50IHN0YXR1cywgY29uc3QgY2hh ciAqbG9nZGV0YWlsKQp7Cgljb25zdCBjaGFyICplcnJzdHI7CgljaGFyCSAgICpjZGV0YWlsOwoJ aW50CQkJZXJyY29kZV9yZXR1cm4gPSBFUlJDT0RFX0lOVkFMSURfQVVUSE9SSVpBVElPTl9TUEVD SUZJQ0FUSU9OOwoKCS8qCgkgKiBJZiB3ZSBmYWlsZWQgZHVlIHRvIEVPRiBmcm9tIGNsaWVudCwg anVzdCBxdWl0OyB0aGVyZSdzIG5vIHBvaW50IGluCgkgKiB0cnlpbmcgdG8gc2VuZCBhIG1lc3Nh Z2UgdG8gdGhlIGNsaWVudCwgYW5kIG5vdCBtdWNoIHBvaW50IGluIGxvZ2dpbmcKCSAqIHRoZSBm YWlsdXJlIGluIHRoZSBwb3N0bWFzdGVyIGxvZy4gIChMb2dnaW5nIHRoZSBmYWlsdXJlIG1pZ2h0 IGJlCgkgKiBkZXNpcmFibGUsIHdlcmUgaXQgbm90IGZvciB0aGUgZmFjdCB0aGF0IGxpYnBxIGNs b3NlcyB0aGUgY29ubmVjdGlvbgoJICogdW5jZXJlbW9uaW91c2x5IGlmIGNoYWxsZW5nZWQgZm9y IGEgcGFzc3dvcmQgd2hlbiBpdCBoYXNuJ3QgZ290IG9uZSB0bwoJICogc2VuZC4gIFdlJ2xsIGdl dCBhIHVzZWxlc3MgbG9nIGVudHJ5IGZvciBldmVyeSBwc3FsIGNvbm5lY3Rpb24gdW5kZXIKCSAq IHBhc3N3b3JkIGF1dGgsIGV2ZW4gaWYgaXQncyBwZXJmZWN0bHkgc3VjY2Vzc2Z1bCwgaWYgd2Ug bG9nIFNUQVRVU19FT0YKCSAqIGV2ZW50cy4pCgkgKi8KCWlmIChzdGF0dXMgPT0gU1RBVFVTX0VP RikKCQlwcm9jX2V4aXQoMCk7CgoJc3dpdGNoIChwb3J0LT5oYmEtPmF1dGhfbWV0aG9kKQoJewoJ CWNhc2UgdWFSZWplY3Q6CgkJY2FzZSB1YUltcGxpY2l0UmVqZWN0OgoJCQllcnJzdHIgPSBnZXR0 ZXh0X25vb3AoImF1dGhlbnRpY2F0aW9uIGZhaWxlZCBmb3IgdXNlciBcIiVzXCI6IGhvc3QgcmVq ZWN0ZWQiKTsKCQkJYnJlYWs7CgkJY2FzZSB1YVRydXN0OgoJCQllcnJzdHIgPSBnZXR0ZXh0X25v b3AoIlwidHJ1c3RcIiBhdXRoZW50aWNhdGlvbiBmYWlsZWQgZm9yIHVzZXIgXCIlc1wiIik7CgkJ CWJyZWFrOwoJCWNhc2UgdWFJZGVudDoKCQkJZXJyc3RyID0gZ2V0dGV4dF9ub29wKCJJZGVudCBh dXRoZW50aWNhdGlvbiBmYWlsZWQgZm9yIHVzZXIgXCIlc1wiIik7CgkJCWJyZWFrOwoJCWNhc2Ug dWFQZWVyOgoJCQllcnJzdHIgPSBnZXR0ZXh0X25vb3AoIlBlZXIgYXV0aGVudGljYXRpb24gZmFp bGVkIGZvciB1c2VyIFwiJXNcIiIpOwoJCQlicmVhazsKCQljYXNlIHVhUGFzc3dvcmQ6CgkJY2Fz ZSB1YU1ENToKCQljYXNlIHVhU0NSQU06CgkJCWVycnN0ciA9IGdldHRleHRfbm9vcCgicGFzc3dv cmQgYXV0aGVudGljYXRpb24gZmFpbGVkIGZvciB1c2VyIFwiJXNcIiIpOwoJCQkvKiBXZSB1c2Ug aXQgdG8gaW5kaWNhdGUgaWYgYSAucGdwYXNzIHBhc3N3b3JkIGZhaWxlZC4gKi8KCQkJZXJyY29k ZV9yZXR1cm4gPSBFUlJDT0RFX0lOVkFMSURfUEFTU1dPUkQ7CgkJCWJyZWFrOwoJCWNhc2UgdWFH U1M6CgkJCWVycnN0ciA9IGdldHRleHRfbm9vcCgiR1NTQVBJIGF1dGhlbnRpY2F0aW9uIGZhaWxl ZCBmb3IgdXNlciBcIiVzXCIiKTsKCQkJYnJlYWs7CgkJY2FzZSB1YVNTUEk6CgkJCWVycnN0ciA9 IGdldHRleHRfbm9vcCgiU1NQSSBhdXRoZW50aWNhdGlvbiBmYWlsZWQgZm9yIHVzZXIgXCIlc1wi Iik7CgkJCWJyZWFrOwoJCWNhc2UgdWFQQU06CgkJCWVycnN0ciA9IGdldHRleHRfbm9vcCgiUEFN IGF1dGhlbnRpY2F0aW9uIGZhaWxlZCBmb3IgdXNlciBcIiVzXCIiKTsKCQkJYnJlYWs7CgkJY2Fz ZSB1YUJTRDoKCQkJZXJyc3RyID0gZ2V0dGV4dF9ub29wKCJCU0QgYXV0aGVudGljYXRpb24gZmFp bGVkIGZvciB1c2VyIFwiJXNcIiIpOwoJCQlicmVhazsKCQljYXNlIHVhTERBUDoKCQkJZXJyc3Ry ID0gZ2V0dGV4dF9ub29wKCJMREFQIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCBmb3IgdXNlciBcIiVz XCIiKTsKCQkJYnJlYWs7CgkJY2FzZSB1YUNlcnQ6CgkJCWVycnN0ciA9IGdldHRleHRfbm9vcCgi Y2VydGlmaWNhdGUgYXV0aGVudGljYXRpb24gZmFpbGVkIGZvciB1c2VyIFwiJXNcIiIpOwoJCQli cmVhazsKCQljYXNlIHVhUkFESVVTOgoJCQllcnJzdHIgPSBnZXR0ZXh0X25vb3AoIlJBRElVUyBh dXRoZW50aWNhdGlvbiBmYWlsZWQgZm9yIHVzZXIgXCIlc1wiIik7CgkJCWJyZWFrOwoJCWRlZmF1 bHQ6CgkJCWVycnN0ciA9IGdldHRleHRfbm9vcCgiYXV0aGVudGljYXRpb24gZmFpbGVkIGZvciB1 c2VyIFwiJXNcIjogaW52YWxpZCBhdXRoZW50aWNhdGlvbiBtZXRob2QiKTsKCQkJYnJlYWs7Cgl9 CgoJY2RldGFpbCA9IHBzcHJpbnRmKF8oIkNvbm5lY3Rpb24gbWF0Y2hlZCBmaWxlIFwiJXNcIiBs aW5lICVkOiBcIiVzXCIiKSwKCQkJCQkgICBwb3J0LT5oYmEtPnNvdXJjZWZpbGUsIHBvcnQtPmhi YS0+bGluZW51bWJlciwKCQkJCQkgICBwb3J0LT5oYmEtPnJhd2xpbmUpOwoJaWYgKGxvZ2RldGFp bCkKCQlsb2dkZXRhaWwgPSBwc3ByaW50ZigiJXNcbiVzIiwgbG9nZGV0YWlsLCBjZGV0YWlsKTsK CWVsc2UKCQlsb2dkZXRhaWwgPSBjZGV0YWlsOwoKCWVyZXBvcnQoRkFUQUwsCgkJCShlcnJjb2Rl KGVycmNvZGVfcmV0dXJuKSwKCQkJIGVycm1zZyhlcnJzdHIsIHBvcnQtPnVzZXJfbmFtZSksCgkJ CSBsb2dkZXRhaWwgPyBlcnJkZXRhaWxfbG9nKCIlcyIsIGxvZ2RldGFpbCkgOiAwKSk7CgoJLyog ZG9lc24ndCByZXR1cm4gKi8KfQoKCi8qCiAqIFNldHMgdGhlIGF1dGhlbnRpY2F0ZWQgaWRlbnRp dHkgZm9yIHRoZSBjdXJyZW50IHVzZXIuICBUaGUgcHJvdmlkZWQgc3RyaW5nCiAqIHdpbGwgYmUg c3RvcmVkIGludG8gTXlDbGllbnRDb25uZWN0aW9uSW5mbywgYWxvbmdzaWRlIHRoZSBjdXJyZW50 IEhCQQogKiBtZXRob2QgaW4gdXNlLiAgVGhlIElEIHdpbGwgYmUgbG9nZ2VkIGlmIGxvZ19jb25u ZWN0aW9ucyBpcyBlbmFibGVkLgogKgogKiBBdXRoIG1ldGhvZHMgc2hvdWxkIGNhbGwgdGhpcyBy b3V0aW5lIGV4YWN0bHkgb25jZSwgYXMgc29vbiBhcyB0aGUgdXNlciBpcwogKiBzdWNjZXNzZnVs bHkgYXV0aGVudGljYXRlZCwgZXZlbiBpZiB0aGV5IGhhdmUgcmVhc29ucyB0byBrbm93IHRoYXQK ICogYXV0aG9yaXphdGlvbiB3aWxsIGZhaWwgbGF0ZXIuCiAqCiAqIFRoZSBwcm92aWRlZCBzdHJp bmcgd2lsbCBiZSBjb3BpZWQgaW50byBUb3BNZW1vcnlDb250ZXh0LCB0byBtYXRjaCB0aGUKICog bGlmZXRpbWUgb2YgTXlDbGllbnRDb25uZWN0aW9uSW5mbywgc28gaXQgaXMgc2FmZSB0byBwYXNz IGEgc3RyaW5nIHRoYXQgaXMKICogbWFuYWdlZCBieSBhbiBleHRlcm5hbCBsaWJyYXJ5LgogKi8K c3RhdGljIHZvaWQKc2V0X2F1dGhuX2lkKFBvcnQgKnBvcnQsIGNvbnN0IGNoYXIgKmlkKQp7CglB c3NlcnQoaWQpOwoKCWlmIChNeUNsaWVudENvbm5lY3Rpb25JbmZvLmF1dGhuX2lkKQoJewoJCS8q CgkJICogQW4gZXhpc3RpbmcgYXV0aG5faWQgc2hvdWxkIG5ldmVyIGJlIG92ZXJ3cml0dGVuOyB0 aGF0IG1lYW5zIHR3bwoJCSAqIGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVycyBhcmUgZmlnaHRpbmcg KG9yIG9uZSBpcyBmaWdodGluZyBpdHNlbGYpLgoJCSAqIERvbid0IGxlYWsgYW55IGF1dGhuIGRl dGFpbHMgdG8gdGhlIGNsaWVudCwgYnV0IGRvbid0IGxldCB0aGUKCQkgKiBjb25uZWN0aW9uIGNv bnRpbnVlLCBlaXRoZXIuCgkJICovCgkJZXJlcG9ydChGQVRBTCwKCQkJCShlcnJtc2coImF1dGhl bnRpY2F0aW9uIGlkZW50aWZpZXIgc2V0IG1vcmUgdGhhbiBvbmNlIiksCgkJCQkgZXJyZGV0YWls X2xvZygicHJldmlvdXMgaWRlbnRpZmllcjogXCIlc1wiOyBuZXcgaWRlbnRpZmllcjogXCIlc1wi IiwKCQkJCQkJCSAgIE15Q2xpZW50Q29ubmVjdGlvbkluZm8uYXV0aG5faWQsIGlkKSkpOwoJfQoK CU15Q2xpZW50Q29ubmVjdGlvbkluZm8uYXV0aG5faWQgPSBNZW1vcnlDb250ZXh0U3RyZHVwKFRv cE1lbW9yeUNvbnRleHQsIGlkKTsKCU15Q2xpZW50Q29ubmVjdGlvbkluZm8uYXV0aF9tZXRob2Qg PSBwb3J0LT5oYmEtPmF1dGhfbWV0aG9kOwoKCWlmIChMb2dfY29ubmVjdGlvbnMpCgl7CgkJZXJl cG9ydChMT0csCgkJCQllcnJtc2coImNvbm5lY3Rpb24gYXV0aGVudGljYXRlZDogaWRlbnRpdHk9 XCIlc1wiIG1ldGhvZD0lcyAiCgkJCQkJICAgIiglczolZCkiLAoJCQkJCSAgIE15Q2xpZW50Q29u bmVjdGlvbkluZm8uYXV0aG5faWQsCgkJCQkJICAgaGJhX2F1dGhuYW1lKE15Q2xpZW50Q29ubmVj dGlvbkluZm8uYXV0aF9tZXRob2QpLAoJCQkJCSAgIHBvcnQtPmhiYS0+c291cmNlZmlsZSwgcG9y dC0+aGJhLT5saW5lbnVtYmVyKSk7Cgl9Cn0KCgovKgogKiBDbGllbnQgYXV0aGVudGljYXRpb24g c3RhcnRzIGhlcmUuICBJZiB0aGVyZSBpcyBhbiBlcnJvciwgdGhpcwogKiBmdW5jdGlvbiBkb2Vz IG5vdCByZXR1cm4gYW5kIHRoZSBiYWNrZW5kIHByb2Nlc3MgaXMgdGVybWluYXRlZC4KICovCnZv aWQKQ2xpZW50QXV0aGVudGljYXRpb24oUG9ydCAqcG9ydCkKewoJaW50CQkJc3RhdHVzID0gU1RB VFVTX0VSUk9SOwoJY29uc3QgY2hhciAqbG9nZGV0YWlsID0gTlVMTDsKCgkvKgoJICogR2V0IHRo ZSBhdXRoZW50aWNhdGlvbiBtZXRob2QgdG8gdXNlIGZvciB0aGlzIGZyb250ZW5kL2RhdGFiYXNl CgkgKiBjb21iaW5hdGlvbi4gIE5vdGU6IHdlIGRvIG5vdCBwYXJzZSB0aGUgZmlsZSBhdCB0aGlz IHBvaW50OyB0aGlzIGhhcwoJICogYWxyZWFkeSBiZWVuIGRvbmUgZWxzZXdoZXJlLiAgaGJhLmMg ZHJvcHBlZCBhbiBlcnJvciBtZXNzYWdlIGludG8gdGhlCgkgKiBzZXJ2ZXIgbG9nZmlsZSBpZiBw YXJzaW5nIHRoZSBoYmEgY29uZmlnIGZpbGUgZmFpbGVkLgoJICovCgloYmFfZ2V0YXV0aG1ldGhv ZChwb3J0KTsKCglDSEVDS19GT1JfSU5URVJSVVBUUygpOwoKCS8qCgkgKiBUaGlzIGlzIHRoZSBm aXJzdCBwb2ludCB3aGVyZSB3ZSBoYXZlIGFjY2VzcyB0byB0aGUgaGJhIHJlY29yZCBmb3IgdGhl CgkgKiBjdXJyZW50IGNvbm5lY3Rpb24sIHNvIHBlcmZvcm0gYW55IHZlcmlmaWNhdGlvbnMgYmFz ZWQgb24gdGhlIGhiYQoJICogb3B0aW9ucyBmaWVsZCB0aGF0IHNob3VsZCBiZSBkb25lICpiZWZv cmUqIHRoZSBhdXRoZW50aWNhdGlvbiBoZXJlLgoJICovCglpZiAocG9ydC0+aGJhLT5jbGllbnRj ZXJ0ICE9IGNsaWVudENlcnRPZmYpCgl7CgkJLyogSWYgd2UgaGF2ZW4ndCBsb2FkZWQgYSByb290 IGNlcnRpZmljYXRlIHN0b3JlLCBmYWlsICovCgkJaWYgKCFzZWN1cmVfbG9hZGVkX3ZlcmlmeV9s b2NhdGlvbnMoKSkKCQkJZXJlcG9ydChGQVRBTCwKCQkJCQkoZXJyY29kZShFUlJDT0RFX0NPTkZJ R19GSUxFX0VSUk9SKSwKCQkJCQkgZXJybXNnKCJjbGllbnQgY2VydGlmaWNhdGVzIGNhbiBvbmx5 IGJlIGNoZWNrZWQgaWYgYSByb290IGNlcnRpZmljYXRlIHN0b3JlIGlzIGF2YWlsYWJsZSIpKSk7 CgoJCS8qCgkJICogSWYgd2UgbG9hZGVkIGEgcm9vdCBjZXJ0aWZpY2F0ZSBzdG9yZSwgYW5kIGlm IGEgY2VydGlmaWNhdGUgaXMKCQkgKiBwcmVzZW50IG9uIHRoZSBjbGllbnQsIHRoZW4gaXQgaGFz IGJlZW4gdmVyaWZpZWQgYWdhaW5zdCBvdXIgcm9vdAoJCSAqIGNlcnRpZmljYXRlIHN0b3JlLCBh bmQgdGhlIGNvbm5lY3Rpb24gd291bGQgaGF2ZSBiZWVuIGFib3J0ZWQKCQkgKiBhbHJlYWR5IGlm IGl0IGRpZG4ndCB2ZXJpZnkgb2suCgkJICovCgkJaWYgKCFwb3J0LT5wZWVyX2NlcnRfdmFsaWQp CgkJCWVyZXBvcnQoRkFUQUwsCgkJCQkJKGVycmNvZGUoRVJSQ09ERV9JTlZBTElEX0FVVEhPUkla QVRJT05fU1BFQ0lGSUNBVElPTiksCgkJCQkJIGVycm1zZygiY29ubmVjdGlvbiByZXF1aXJlcyBh IHZhbGlkIGNsaWVudCBjZXJ0aWZpY2F0ZSIpKSk7Cgl9CgoJLyoKCSAqIE5vdyBwcm9jZWVkIHRv IGRvIHRoZSBhY3R1YWwgYXV0aGVudGljYXRpb24gY2hlY2sKCSAqLwoJc3dpdGNoIChwb3J0LT5o YmEtPmF1dGhfbWV0aG9kKQoJewoJCWNhc2UgdWFSZWplY3Q6CgoJCQkvKgoJCQkgKiBBbiBleHBs aWNpdCAicmVqZWN0IiBlbnRyeSBpbiBwZ19oYmEuY29uZi4gIFRoaXMgcmVwb3J0IGV4cG9zZXMK CQkJICogdGhlIGZhY3QgdGhhdCB0aGVyZSdzIGFuIGV4cGxpY2l0IHJlamVjdCBlbnRyeSwgd2hp Y2ggaXMKCQkJICogcGVyaGFwcyBub3Qgc28gZGVzaXJhYmxlIGZyb20gYSBzZWN1cml0eSBzdGFu ZHBvaW50OyBidXQgdGhlCgkJCSAqIG1lc3NhZ2UgZm9yIGFuIGltcGxpY2l0IHJlamVjdCBjb3Vs ZCBjb25mdXNlIHRoZSBEQkEgYSBsb3Qgd2hlbgoJCQkgKiB0aGUgdHJ1ZSBzaXR1YXRpb24gaXMg YSBtYXRjaCB0byBhbiBleHBsaWNpdCByZWplY3QuICBBbmQgd2UKCQkJICogZG9uJ3Qgd2FudCB0 byBjaGFuZ2UgdGhlIG1lc3NhZ2UgZm9yIGFuIGltcGxpY2l0IHJlamVjdC4gIEFzCgkJCSAqIG5v dGVkIGJlbG93LCB0aGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBzaG93biBoZXJlIGRvZXNuJ3QK CQkJICogZXhwb3NlIGFueXRoaW5nIG5vdCBrbm93biB0byBhbiBhdHRhY2tlci4KCQkJICovCgkJ CXsKCQkJCWNoYXIJCWhvc3RpbmZvW05JX01BWEhPU1RdOwoJCQkJY29uc3QgY2hhciAqZW5jcnlw dGlvbl9zdGF0ZTsKCgkJCQlwZ19nZXRuYW1laW5mb19hbGwoJnBvcnQtPnJhZGRyLmFkZHIsIHBv cnQtPnJhZGRyLnNhbGVuLAoJCQkJCQkJCSAgIGhvc3RpbmZvLCBzaXplb2YoaG9zdGluZm8pLAoJ CQkJCQkJCSAgIE5VTEwsIDAsCgkJCQkJCQkJICAgTklfTlVNRVJJQ0hPU1QpOwoKCQkJCWVuY3J5 cHRpb25fc3RhdGUgPQojaWZkZWYgRU5BQkxFX0dTUwoJCQkJCShwb3J0LT5nc3MgJiYgcG9ydC0+ Z3NzLT5lbmMpID8gXygiR1NTIGVuY3J5cHRpb24iKSA6CiNlbmRpZgojaWZkZWYgVVNFX1NTTAoJ CQkJCXBvcnQtPnNzbF9pbl91c2UgPyBfKCJTU0wgZW5jcnlwdGlvbiIpIDoKI2VuZGlmCgkJCQkJ Xygibm8gZW5jcnlwdGlvbiIpOwoKCQkJCWlmIChhbV93YWxzZW5kZXIgJiYgIWFtX2RiX3dhbHNl bmRlcikKCQkJCQllcmVwb3J0KEZBVEFMLAoJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9JTlZBTElE X0FVVEhPUklaQVRJT05fU1BFQ0lGSUNBVElPTiksCgkJCQkJLyogdHJhbnNsYXRvcjogbGFzdCAl cyBkZXNjcmliZXMgZW5jcnlwdGlvbiBzdGF0ZSAqLwoJCQkJCQkJIGVycm1zZygicGdfaGJhLmNv bmYgcmVqZWN0cyByZXBsaWNhdGlvbiBjb25uZWN0aW9uIGZvciBob3N0IFwiJXNcIiwgdXNlciBc IiVzXCIsICVzIiwKCQkJCQkJCQkJaG9zdGluZm8sIHBvcnQtPnVzZXJfbmFtZSwKCQkJCQkJCQkJ ZW5jcnlwdGlvbl9zdGF0ZSkpKTsKCQkJCWVsc2UKCQkJCQllcmVwb3J0KEZBVEFMLAoJCQkJCQkJ KGVycmNvZGUoRVJSQ09ERV9JTlZBTElEX0FVVEhPUklaQVRJT05fU1BFQ0lGSUNBVElPTiksCgkJ CQkJLyogdHJhbnNsYXRvcjogbGFzdCAlcyBkZXNjcmliZXMgZW5jcnlwdGlvbiBzdGF0ZSAqLwoJ CQkJCQkJIGVycm1zZygicGdfaGJhLmNvbmYgcmVqZWN0cyBjb25uZWN0aW9uIGZvciBob3N0IFwi JXNcIiwgdXNlciBcIiVzXCIsIGRhdGFiYXNlIFwiJXNcIiwgJXMiLAoJCQkJCQkJCQlob3N0aW5m bywgcG9ydC0+dXNlcl9uYW1lLAoJCQkJCQkJCQlwb3J0LT5kYXRhYmFzZV9uYW1lLAoJCQkJCQkJ CQllbmNyeXB0aW9uX3N0YXRlKSkpOwoJCQkJYnJlYWs7CgkJCX0KCgkJY2FzZSB1YUltcGxpY2l0 UmVqZWN0OgoKCQkJLyoKCQkJICogTm8gbWF0Y2hpbmcgZW50cnksIHNvIHRlbGwgdGhlIHVzZXIg d2UgZmVsbCB0aHJvdWdoLgoJCQkgKgoJCQkgKiBOT1RFOiB0aGUgZXh0cmEgaW5mbyByZXBvcnRl ZCBoZXJlIGlzIG5vdCBhIHNlY3VyaXR5IGJyZWFjaCwKCQkJICogYmVjYXVzZSBhbGwgdGhhdCBp bmZvIGlzIGtub3duIGF0IHRoZSBmcm9udGVuZCBhbmQgbXVzdCBiZQoJCQkgKiBhc3N1bWVkIGtu b3duIHRvIGJhZCBndXlzLiAgV2UncmUgbWVyZWx5IGhlbHBpbmcgb3V0IHRoZSBsZXNzCgkJCSAq IGNsdWVmdWwgZ29vZCBndXlzLgoJCQkgKi8KCQkJewoJCQkJY2hhcgkJaG9zdGluZm9bTklfTUFY SE9TVF07CgkJCQljb25zdCBjaGFyICplbmNyeXB0aW9uX3N0YXRlOwoKCQkJCXBnX2dldG5hbWVp bmZvX2FsbCgmcG9ydC0+cmFkZHIuYWRkciwgcG9ydC0+cmFkZHIuc2FsZW4sCgkJCQkJCQkJICAg aG9zdGluZm8sIHNpemVvZihob3N0aW5mbyksCgkJCQkJCQkJICAgTlVMTCwgMCwKCQkJCQkJCQkg ICBOSV9OVU1FUklDSE9TVCk7CgoJCQkJZW5jcnlwdGlvbl9zdGF0ZSA9CiNpZmRlZiBFTkFCTEVf R1NTCgkJCQkJKHBvcnQtPmdzcyAmJiBwb3J0LT5nc3MtPmVuYykgPyBfKCJHU1MgZW5jcnlwdGlv biIpIDoKI2VuZGlmCiNpZmRlZiBVU0VfU1NMCgkJCQkJcG9ydC0+c3NsX2luX3VzZSA/IF8oIlNT TCBlbmNyeXB0aW9uIikgOgojZW5kaWYKCQkJCQlfKCJubyBlbmNyeXB0aW9uIik7CgojZGVmaW5l IEhPU1ROQU1FX0xPT0tVUF9ERVRBSUwocG9ydCkgXAoJCQkJKHBvcnQtPnJlbW90ZV9ob3N0bmFt ZSA/IFwKCQkJCSAocG9ydC0+cmVtb3RlX2hvc3RuYW1lX3Jlc29sdiA9PSArMSA/IFwKCQkJCSAg ZXJyZGV0YWlsX2xvZygiQ2xpZW50IElQIGFkZHJlc3MgcmVzb2x2ZWQgdG8gXCIlc1wiLCBmb3J3 YXJkIGxvb2t1cCBtYXRjaGVzLiIsIFwKCQkJCQkJCQlwb3J0LT5yZW1vdGVfaG9zdG5hbWUpIDog XAoJCQkJICBwb3J0LT5yZW1vdGVfaG9zdG5hbWVfcmVzb2x2ID09IDAgPyBcCgkJCQkgIGVycmRl dGFpbF9sb2coIkNsaWVudCBJUCBhZGRyZXNzIHJlc29sdmVkIHRvIFwiJXNcIiwgZm9yd2FyZCBs b29rdXAgbm90IGNoZWNrZWQuIiwgXAoJCQkJCQkJCXBvcnQtPnJlbW90ZV9ob3N0bmFtZSkgOiBc CgkJCQkgIHBvcnQtPnJlbW90ZV9ob3N0bmFtZV9yZXNvbHYgPT0gLTEgPyBcCgkJCQkgIGVycmRl dGFpbF9sb2coIkNsaWVudCBJUCBhZGRyZXNzIHJlc29sdmVkIHRvIFwiJXNcIiwgZm9yd2FyZCBs b29rdXAgZG9lcyBub3QgbWF0Y2guIiwgXAoJCQkJCQkJCXBvcnQtPnJlbW90ZV9ob3N0bmFtZSkg OiBcCgkJCQkgIHBvcnQtPnJlbW90ZV9ob3N0bmFtZV9yZXNvbHYgPT0gLTIgPyBcCgkJCQkgIGVy cmRldGFpbF9sb2coIkNvdWxkIG5vdCB0cmFuc2xhdGUgY2xpZW50IGhvc3QgbmFtZSBcIiVzXCIg dG8gSVAgYWRkcmVzczogJXMuIiwgXAoJCQkJCQkJCXBvcnQtPnJlbW90ZV9ob3N0bmFtZSwgXAoJ CQkJCQkJCWdhaV9zdHJlcnJvcihwb3J0LT5yZW1vdGVfaG9zdG5hbWVfZXJyY29kZSkpIDogXAoJ CQkJICAwKSBcCgkJCQkgOiAocG9ydC0+cmVtb3RlX2hvc3RuYW1lX3Jlc29sdiA9PSAtMiA/IFwK CQkJCQllcnJkZXRhaWxfbG9nKCJDb3VsZCBub3QgcmVzb2x2ZSBjbGllbnQgSVAgYWRkcmVzcyB0 byBhIGhvc3QgbmFtZTogJXMuIiwgXAoJCQkJCQkJCSAgZ2FpX3N0cmVycm9yKHBvcnQtPnJlbW90 ZV9ob3N0bmFtZV9lcnJjb2RlKSkgOiBcCgkJCQkJMCkpCgoJCQkJaWYgKGFtX3dhbHNlbmRlciAm JiAhYW1fZGJfd2Fsc2VuZGVyKQoJCQkJCWVyZXBvcnQoRkFUQUwsCgkJCQkJCQkoZXJyY29kZShF UlJDT0RFX0lOVkFMSURfQVVUSE9SSVpBVElPTl9TUEVDSUZJQ0FUSU9OKSwKCQkJCQkvKiB0cmFu c2xhdG9yOiBsYXN0ICVzIGRlc2NyaWJlcyBlbmNyeXB0aW9uIHN0YXRlICovCgkJCQkJCQkgZXJy bXNnKCJubyBwZ19oYmEuY29uZiBlbnRyeSBmb3IgcmVwbGljYXRpb24gY29ubmVjdGlvbiBmcm9t IGhvc3QgXCIlc1wiLCB1c2VyIFwiJXNcIiwgJXMiLAoJCQkJCQkJCQlob3N0aW5mbywgcG9ydC0+ dXNlcl9uYW1lLAoJCQkJCQkJCQllbmNyeXB0aW9uX3N0YXRlKSwKCQkJCQkJCSBIT1NUTkFNRV9M T09LVVBfREVUQUlMKHBvcnQpKSk7CgkJCQllbHNlCgkJCQkJZXJlcG9ydChGQVRBTCwKCQkJCQkJ CShlcnJjb2RlKEVSUkNPREVfSU5WQUxJRF9BVVRIT1JJWkFUSU9OX1NQRUNJRklDQVRJT04pLAoJ CQkJCS8qIHRyYW5zbGF0b3I6IGxhc3QgJXMgZGVzY3JpYmVzIGVuY3J5cHRpb24gc3RhdGUgKi8K CQkJCQkJCSBlcnJtc2coIm5vIHBnX2hiYS5jb25mIGVudHJ5IGZvciBob3N0IFwiJXNcIiwgdXNl ciBcIiVzXCIsIGRhdGFiYXNlIFwiJXNcIiwgJXMiLAoJCQkJCQkJCQlob3N0aW5mbywgcG9ydC0+ dXNlcl9uYW1lLAoJCQkJCQkJCQlwb3J0LT5kYXRhYmFzZV9uYW1lLAoJCQkJCQkJCQllbmNyeXB0 aW9uX3N0YXRlKSwKCQkJCQkJCSBIT1NUTkFNRV9MT09LVVBfREVUQUlMKHBvcnQpKSk7CgkJCQli cmVhazsKCQkJfQoKCQljYXNlIHVhR1NTOgojaWZkZWYgRU5BQkxFX0dTUwoJCQkvKiBXZSBtaWdo dCBvciBtaWdodCBub3QgaGF2ZSB0aGUgZ3NzIHdvcmtzcGFjZSBhbHJlYWR5ICovCgkJCWlmIChw b3J0LT5nc3MgPT0gTlVMTCkKCQkJCXBvcnQtPmdzcyA9IChwZ19nc3NpbmZvICopCgkJCQkJTWVt b3J5Q29udGV4dEFsbG9jWmVybyhUb3BNZW1vcnlDb250ZXh0LAoJCQkJCQkJCQkJICAgc2l6ZW9m KHBnX2dzc2luZm8pKTsKCQkJcG9ydC0+Z3NzLT5hdXRoID0gdHJ1ZTsKCgkJCS8qCgkJCSAqIElm IEdTUyBzdGF0ZSB3YXMgc2V0IHVwIHdoaWxlIGVuYWJsaW5nIGVuY3J5cHRpb24sIHdlIGNhbiBq dXN0CgkJCSAqIGNoZWNrIHRoZSBjbGllbnQncyBwcmluY2lwYWwuICBPdGhlcndpc2UsIGFzayBm b3IgaXQuCgkJCSAqLwoJCQlpZiAocG9ydC0+Z3NzLT5lbmMpCgkJCQlzdGF0dXMgPSBwZ19HU1Nf Y2hlY2thdXRoKHBvcnQpOwoJCQllbHNlCgkJCXsKCQkJCXNlbmRBdXRoUmVxdWVzdChwb3J0LCBB VVRIX1JFUV9HU1MsIE5VTEwsIDApOwoJCQkJc3RhdHVzID0gcGdfR1NTX3JlY3ZhdXRoKHBvcnQp OwoJCQl9CiNlbHNlCgkJCUFzc2VydChmYWxzZSk7CiNlbmRpZgoJCQlicmVhazsKCgkJY2FzZSB1 YVNTUEk6CiNpZmRlZiBFTkFCTEVfU1NQSQoJCQlpZiAocG9ydC0+Z3NzID09IE5VTEwpCgkJCQlw b3J0LT5nc3MgPSAocGdfZ3NzaW5mbyAqKQoJCQkJCU1lbW9yeUNvbnRleHRBbGxvY1plcm8oVG9w TWVtb3J5Q29udGV4dCwKCQkJCQkJCQkJCSAgIHNpemVvZihwZ19nc3NpbmZvKSk7CgkJCXNlbmRB dXRoUmVxdWVzdChwb3J0LCBBVVRIX1JFUV9TU1BJLCBOVUxMLCAwKTsKCQkJc3RhdHVzID0gcGdf U1NQSV9yZWN2YXV0aChwb3J0KTsKI2Vsc2UKCQkJQXNzZXJ0KGZhbHNlKTsKI2VuZGlmCgkJCWJy ZWFrOwoKCQljYXNlIHVhUGVlcjoKCQkJc3RhdHVzID0gYXV0aF9wZWVyKHBvcnQpOwoJCQlicmVh azsKCgkJY2FzZSB1YUlkZW50OgoJCQlzdGF0dXMgPSBpZGVudF9pbmV0KHBvcnQpOwoJCQlicmVh azsKCgkJY2FzZSB1YU1ENToKCQljYXNlIHVhU0NSQU06CgkJCXN0YXR1cyA9IENoZWNrUFdDaGFs bGVuZ2VBdXRoKHBvcnQsICZsb2dkZXRhaWwpOwoJCQlicmVhazsKCgkJY2FzZSB1YVBhc3N3b3Jk OgoJCQlzdGF0dXMgPSBDaGVja1Bhc3N3b3JkQXV0aChwb3J0LCAmbG9nZGV0YWlsKTsKCQkJYnJl YWs7CgoJCWNhc2UgdWFQQU06CiNpZmRlZiBVU0VfUEFNCgkJCXN0YXR1cyA9IENoZWNrUEFNQXV0 aChwb3J0LCBwb3J0LT51c2VyX25hbWUsICIiKTsKI2Vsc2UKCQkJQXNzZXJ0KGZhbHNlKTsKI2Vu ZGlmCQkJCQkJCS8qIFVTRV9QQU0gKi8KCQkJYnJlYWs7CgoJCWNhc2UgdWFCU0Q6CiNpZmRlZiBV U0VfQlNEX0FVVEgKCQkJc3RhdHVzID0gQ2hlY2tCU0RBdXRoKHBvcnQsIHBvcnQtPnVzZXJfbmFt ZSk7CiNlbHNlCgkJCUFzc2VydChmYWxzZSk7CiNlbmRpZgkJCQkJCQkvKiBVU0VfQlNEX0FVVEgg Ki8KCQkJYnJlYWs7CgoJCWNhc2UgdWFMREFQOgojaWZkZWYgVVNFX0xEQVAKCQkJc3RhdHVzID0g Q2hlY2tMREFQQXV0aChwb3J0KTsKI2Vsc2UKCQkJQXNzZXJ0KGZhbHNlKTsKI2VuZGlmCgkJCWJy ZWFrOwoJCWNhc2UgdWFSQURJVVM6CgkJCXN0YXR1cyA9IENoZWNrUkFESVVTQXV0aChwb3J0KTsK CQkJYnJlYWs7CgkJY2FzZSB1YUNlcnQ6CgkJCS8qIHVhQ2VydCB3aWxsIGJlIHRyZWF0ZWQgYXMg aWYgY2xpZW50Y2VydD12ZXJpZnktZnVsbCAodWFUcnVzdCkgKi8KCQljYXNlIHVhVHJ1c3Q6CgkJ CXN0YXR1cyA9IFNUQVRVU19PSzsKCQkJYnJlYWs7Cgl9CgoJaWYgKChzdGF0dXMgPT0gU1RBVFVT X09LICYmIHBvcnQtPmhiYS0+Y2xpZW50Y2VydCA9PSBjbGllbnRDZXJ0RnVsbCkKCQl8fCBwb3J0 LT5oYmEtPmF1dGhfbWV0aG9kID09IHVhQ2VydCkKCXsKCQkvKgoJCSAqIE1ha2Ugc3VyZSB3ZSBv bmx5IGNoZWNrIHRoZSBjZXJ0aWZpY2F0ZSBpZiB3ZSB1c2UgdGhlIGNlcnQgbWV0aG9kCgkJICog b3IgdmVyaWZ5LWZ1bGwgb3B0aW9uLgoJCSAqLwojaWZkZWYgVVNFX1NTTAoJCXN0YXR1cyA9IENo ZWNrQ2VydEF1dGgocG9ydCk7CiNlbHNlCgkJQXNzZXJ0KGZhbHNlKTsKI2VuZGlmCgl9CgoJaWYg KENsaWVudEF1dGhlbnRpY2F0aW9uX2hvb2spCgkJKCpDbGllbnRBdXRoZW50aWNhdGlvbl9ob29r KSAocG9ydCwgc3RhdHVzKTsKCglpZiAoc3RhdHVzID09IFNUQVRVU19PSykKCQlzZW5kQXV0aFJl cXVlc3QocG9ydCwgQVVUSF9SRVFfT0ssIE5VTEwsIDApOwoJZWxzZQoJCWF1dGhfZmFpbGVkKHBv cnQsIHN0YXR1cywgbG9nZGV0YWlsKTsKfQoKCi8qCiAqIFNlbmQgYW4gYXV0aGVudGljYXRpb24g cmVxdWVzdCBwYWNrZXQgdG8gdGhlIGZyb250ZW5kLgogKi8Kdm9pZApzZW5kQXV0aFJlcXVlc3Qo UG9ydCAqcG9ydCwgQXV0aFJlcXVlc3QgYXJlcSwgY29uc3QgY2hhciAqZXh0cmFkYXRhLCBpbnQg ZXh0cmFsZW4pCnsKCVN0cmluZ0luZm9EYXRhIGJ1ZjsKCglDSEVDS19GT1JfSU5URVJSVVBUUygp OwoKCXBxX2JlZ2lubWVzc2FnZSgmYnVmLCAnUicpOwoJcHFfc2VuZGludDMyKCZidWYsIChpbnQz MikgYXJlcSk7CglpZiAoZXh0cmFsZW4gPiAwKQoJCXBxX3NlbmRieXRlcygmYnVmLCBleHRyYWRh dGEsIGV4dHJhbGVuKTsKCglwcV9lbmRtZXNzYWdlKCZidWYpOwoKCS8qCgkgKiBGbHVzaCBtZXNz YWdlIHNvIGNsaWVudCB3aWxsIHNlZSBpdCwgZXhjZXB0IGZvciBBVVRIX1JFUV9PSyBhbmQKCSAq IEFVVEhfUkVRX1NBU0xfRklOLCB3aGljaCBuZWVkIG5vdCBiZSBzZW50IHVudGlsIHdlIGFyZSBy ZWFkeSBmb3IKCSAqIHF1ZXJpZXMuCgkgKi8KCWlmIChhcmVxICE9IEFVVEhfUkVRX09LICYmIGFy ZXEgIT0gQVVUSF9SRVFfU0FTTF9GSU4pCgkJcHFfZmx1c2goKTsKCglDSEVDS19GT1JfSU5URVJS VVBUUygpOwp9CgovKgogKiBDb2xsZWN0IHBhc3N3b3JkIHJlc3BvbnNlIHBhY2tldCBmcm9tIGZy b250ZW5kLgogKgogKiBSZXR1cm5zIE5VTEwgaWYgY291bGRuJ3QgZ2V0IHBhc3N3b3JkLCBlbHNl IHBhbGxvYydkIHN0cmluZy4KICovCnN0YXRpYyBjaGFyICoKcmVjdl9wYXNzd29yZF9wYWNrZXQo UG9ydCAqcG9ydCkKewoJU3RyaW5nSW5mb0RhdGEgYnVmOwoJaW50CQkJbXR5cGU7CgoJcHFfc3Rh cnRtc2dyZWFkKCk7CgoJLyogRXhwZWN0ICdwJyBtZXNzYWdlIHR5cGUgKi8KCW10eXBlID0gcHFf Z2V0Ynl0ZSgpOwoJaWYgKG10eXBlICE9ICdwJykKCXsKCQkvKgoJCSAqIElmIHRoZSBjbGllbnQg anVzdCBkaXNjb25uZWN0cyB3aXRob3V0IG9mZmVyaW5nIGEgcGFzc3dvcmQsIGRvbid0CgkJICog bWFrZSBhIGxvZyBlbnRyeS4gIFRoaXMgaXMgbGVnYWwgcGVyIHByb3RvY29sIHNwZWMgYW5kIGlu IGZhY3QKCQkgKiBjb21tb25seSBkb25lIGJ5IHBzcWwsIHNvIGNvbXBsYWluaW5nIGp1c3QgY2x1 dHRlcnMgdGhlIGxvZy4KCQkgKi8KCQlpZiAobXR5cGUgIT0gRU9GKQoJCQllcmVwb3J0KEVSUk9S LAoJCQkJCShlcnJjb2RlKEVSUkNPREVfUFJPVE9DT0xfVklPTEFUSU9OKSwKCQkJCQkgZXJybXNn KCJleHBlY3RlZCBwYXNzd29yZCByZXNwb25zZSwgZ290IG1lc3NhZ2UgdHlwZSAlZCIsCgkJCQkJ CQltdHlwZSkpKTsKCQlyZXR1cm4gTlVMTDsJCQkvKiBFT0Ygb3IgYmFkIG1lc3NhZ2UgdHlwZSAq LwoJfQoKCWluaXRTdHJpbmdJbmZvKCZidWYpOwoJaWYgKHBxX2dldG1lc3NhZ2UoJmJ1ZiwgUEdf TUFYX0FVVEhfVE9LRU5fTEVOR1RIKSkJLyogcmVjZWl2ZSBwYXNzd29yZCAqLwoJewoJCS8qIEVP RiAtIHBxX2dldG1lc3NhZ2UgYWxyZWFkeSBsb2dnZWQgYSBzdWl0YWJsZSBtZXNzYWdlICovCgkJ cGZyZWUoYnVmLmRhdGEpOwoJCXJldHVybiBOVUxMOwoJfQoKCS8qCgkgKiBBcHBseSBzYW5pdHkg Y2hlY2s6IHBhc3N3b3JkIHBhY2tldCBsZW5ndGggc2hvdWxkIGFncmVlIHdpdGggbGVuZ3RoIG9m CgkgKiBjb250YWluZWQgc3RyaW5nLiAgTm90ZSBpdCBpcyBzYWZlIHRvIHVzZSBzdHJsZW4gaGVy ZSBiZWNhdXNlCgkgKiBTdHJpbmdJbmZvIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSBhbiBhcHBlbmRl ZCAnXDAnLgoJICovCglpZiAoc3RybGVuKGJ1Zi5kYXRhKSArIDEgIT0gYnVmLmxlbikKCQllcmVw b3J0KEVSUk9SLAoJCQkJKGVycmNvZGUoRVJSQ09ERV9QUk9UT0NPTF9WSU9MQVRJT04pLAoJCQkJ IGVycm1zZygiaW52YWxpZCBwYXNzd29yZCBwYWNrZXQgc2l6ZSIpKSk7CgoJLyoKCSAqIERvbid0 IGFsbG93IGFuIGVtcHR5IHBhc3N3b3JkLiBMaWJwcSB0cmVhdHMgYW4gZW1wdHkgcGFzc3dvcmQg dGhlIHNhbWUKCSAqIGFzIG5vIHBhc3N3b3JkIGF0IGFsbCwgYW5kIHdvbid0IGV2ZW4gdHJ5IHRv IGF1dGhlbnRpY2F0ZS4gQnV0IG90aGVyCgkgKiBjbGllbnRzIG1pZ2h0LCBzbyBhbGxvd2luZyBp dCB3b3VsZCBiZSBjb25mdXNpbmcuCgkgKgoJICogTm90ZSB0aGF0IHRoaXMgb25seSBjYXRjaGVz IGFuIGVtcHR5IHBhc3N3b3JkIHNlbnQgYnkgdGhlIGNsaWVudCBpbgoJICogcGxhaW50ZXh0LiBU aGVyZSdzIGFsc28gYSBjaGVjayBpbiBDUkVBVEUvQUxURVIgVVNFUiB0aGF0IHByZXZlbnRzIGFu CgkgKiBlbXB0eSBzdHJpbmcgZnJvbSBiZWluZyBzdG9yZWQgYXMgYSB1c2VyJ3MgcGFzc3dvcmQg aW4gdGhlIGZpcnN0IHBsYWNlLgoJICogV2UgcmVseSBvbiB0aGF0IGZvciBNRDUgYW5kIFNDUkFN IGF1dGhlbnRpY2F0aW9uLCBidXQgd2Ugc3RpbGwgbmVlZAoJICogdGhpcyBjaGVjayBoZXJlLCB0 byBwcmV2ZW50IGFuIGVtcHR5IHBhc3N3b3JkIGZyb20gYmVpbmcgdXNlZCB3aXRoCgkgKiBhdXRo ZW50aWNhdGlvbiBtZXRob2RzIHRoYXQgY2hlY2sgdGhlIHBhc3N3b3JkIGFnYWluc3QgYW4gZXh0 ZXJuYWwKCSAqIHN5c3RlbSwgbGlrZSBQQU0sIExEQVAgYW5kIFJBRElVUy4KCSAqLwoJaWYgKGJ1 Zi5sZW4gPT0gMSkKCQllcmVwb3J0KEVSUk9SLAoJCQkJKGVycmNvZGUoRVJSQ09ERV9JTlZBTElE X1BBU1NXT1JEKSwKCQkJCSBlcnJtc2coImVtcHR5IHBhc3N3b3JkIHJldHVybmVkIGJ5IGNsaWVu dCIpKSk7CgoJLyogRG8gbm90IGVjaG8gcGFzc3dvcmQgdG8gbG9ncywgZm9yIHNlY3VyaXR5LiAq LwoJZWxvZyhERUJVRzUsICJyZWNlaXZlZCBwYXNzd29yZCBwYWNrZXQiKTsKCgkvKgoJICogUmV0 dXJuIHRoZSByZWNlaXZlZCBzdHJpbmcuICBOb3RlIHdlIGRvIG5vdCBhdHRlbXB0IHRvIGRvIGFu eQoJICogY2hhcmFjdGVyLXNldCBjb252ZXJzaW9uIG9uIGl0OyBzaW5jZSB3ZSBkb24ndCB5ZXQg a25vdyB0aGUgY2xpZW50J3MKCSAqIGVuY29kaW5nLCB0aGVyZSB3b3VsZG4ndCBiZSBtdWNoIHBv aW50LgoJICovCglyZXR1cm4gYnVmLmRhdGE7Cn0KCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogUGFzc3dvcmQtYmFz ZWQgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcwogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCgovKgogKiBQbGFpbnRl eHQgcGFzc3dvcmQgYXV0aGVudGljYXRpb24uCiAqLwpzdGF0aWMgaW50CkNoZWNrUGFzc3dvcmRB dXRoKFBvcnQgKnBvcnQsIGNvbnN0IGNoYXIgKipsb2dkZXRhaWwpCnsKCWNoYXIJICAgKnBhc3N3 ZDsKCWludAkJCXJlc3VsdDsKCWNoYXIJICAgKnNoYWRvd19wYXNzOwoKCXNlbmRBdXRoUmVxdWVz dChwb3J0LCBBVVRIX1JFUV9QQVNTV09SRCwgTlVMTCwgMCk7CgoJcGFzc3dkID0gcmVjdl9wYXNz d29yZF9wYWNrZXQocG9ydCk7CglpZiAocGFzc3dkID09IE5VTEwpCgkJcmV0dXJuIFNUQVRVU19F T0Y7CQkvKiBjbGllbnQgd291bGRuJ3Qgc2VuZCBwYXNzd29yZCAqLwoKCXNoYWRvd19wYXNzID0g Z2V0X3JvbGVfcGFzc3dvcmQocG9ydC0+dXNlcl9uYW1lLCBsb2dkZXRhaWwpOwoJaWYgKHNoYWRv d19wYXNzKQoJewoJCXJlc3VsdCA9IHBsYWluX2NyeXB0X3ZlcmlmeShwb3J0LT51c2VyX25hbWUs IHNoYWRvd19wYXNzLCBwYXNzd2QsCgkJCQkJCQkJCWxvZ2RldGFpbCk7Cgl9CgllbHNlCgkJcmVz dWx0ID0gU1RBVFVTX0VSUk9SOwoKCWlmIChzaGFkb3dfcGFzcykKCQlwZnJlZShzaGFkb3dfcGFz cyk7CglwZnJlZShwYXNzd2QpOwoKCWlmIChyZXN1bHQgPT0gU1RBVFVTX09LKQoJCXNldF9hdXRo bl9pZChwb3J0LCBwb3J0LT51c2VyX25hbWUpOwoKCXJldHVybiByZXN1bHQ7Cn0KCi8qCiAqIE1E NSBhbmQgU0NSQU0gYXV0aGVudGljYXRpb24uCiAqLwpzdGF0aWMgaW50CkNoZWNrUFdDaGFsbGVu Z2VBdXRoKFBvcnQgKnBvcnQsIGNvbnN0IGNoYXIgKipsb2dkZXRhaWwpCnsKCWludAkJCWF1dGhf cmVzdWx0OwoJY2hhcgkgICAqc2hhZG93X3Bhc3M7CglQYXNzd29yZFR5cGUgcHd0eXBlOwoKCUFz c2VydChwb3J0LT5oYmEtPmF1dGhfbWV0aG9kID09IHVhU0NSQU0gfHwKCQkgICBwb3J0LT5oYmEt PmF1dGhfbWV0aG9kID09IHVhTUQ1KTsKCgkvKiBGaXJzdCBsb29rIHVwIHRoZSB1c2VyJ3MgcGFz c3dvcmQuICovCglzaGFkb3dfcGFzcyA9IGdldF9yb2xlX3Bhc3N3b3JkKHBvcnQtPnVzZXJfbmFt ZSwgbG9nZGV0YWlsKTsKCgkvKgoJICogSWYgdGhlIHVzZXIgZG9lcyBub3QgZXhpc3QsIG9yIGhh cyBubyBwYXNzd29yZCBvciBpdCdzIGV4cGlyZWQsIHdlCgkgKiBzdGlsbCBnbyB0aHJvdWdoIHRo ZSBtb3Rpb25zIG9mIGF1dGhlbnRpY2F0aW9uLCB0byBhdm9pZCByZXZlYWxpbmcgdG8KCSAqIHRo ZSBjbGllbnQgdGhhdCB0aGUgdXNlciBkaWRuJ3QgZXhpc3QuICBJZiAnbWQ1JyBpcyBhbGxvd2Vk LCB3ZSBjaG9vc2UKCSAqIHdoZXRoZXIgdG8gdXNlICdtZDUnIG9yICdzY3JhbS1zaGEtMjU2JyBh dXRoZW50aWNhdGlvbiBiYXNlZCBvbiBjdXJyZW50CgkgKiBwYXNzd29yZF9lbmNyeXB0aW9uIHNl dHRpbmcuICBUaGUgaWRlYSBpcyB0aGF0IG1vc3QgZ2VudWluZSB1c2VycwoJICogcHJvYmFibHkg aGF2ZSBhIHBhc3N3b3JkIG9mIHRoYXQgdHlwZSwgYW5kIGlmIHdlIHByZXRlbmQgdGhhdCB0aGlz IHVzZXIKCSAqIGhhZCBhIHBhc3N3b3JkIG9mIHRoYXQgdHlwZSwgdG9vLCBpdCAiYmxlbmRzIGlu IiBiZXN0LgoJICovCglpZiAoIXNoYWRvd19wYXNzKQoJCXB3dHlwZSA9IFBhc3N3b3JkX2VuY3J5 cHRpb247CgllbHNlCgkJcHd0eXBlID0gZ2V0X3Bhc3N3b3JkX3R5cGUoc2hhZG93X3Bhc3MpOwoK CS8qCgkgKiBJZiAnbWQ1JyBhdXRoZW50aWNhdGlvbiBpcyBhbGxvd2VkLCBkZWNpZGUgd2hldGhl ciB0byBwZXJmb3JtICdtZDUnIG9yCgkgKiAnc2NyYW0tc2hhLTI1NicgYXV0aGVudGljYXRpb24g YmFzZWQgb24gdGhlIHR5cGUgb2YgcGFzc3dvcmQgdGhlIHVzZXIKCSAqIGhhcy4gIElmIGl0J3Mg YW4gTUQ1IGhhc2gsIHdlIG11c3QgZG8gTUQ1IGF1dGhlbnRpY2F0aW9uLCBhbmQgaWYgaXQncyBh CgkgKiBTQ1JBTSBzZWNyZXQsIHdlIG11c3QgZG8gU0NSQU0gYXV0aGVudGljYXRpb24uCgkgKgoJ ICogSWYgTUQ1IGF1dGhlbnRpY2F0aW9uIGlzIG5vdCBhbGxvd2VkLCBhbHdheXMgdXNlIFNDUkFN LiAgSWYgdGhlIHVzZXIKCSAqIGhhZCBhbiBNRDUgcGFzc3dvcmQsIENoZWNrU0FTTEF1dGgoKSB3 aXRoIHRoZSBTQ1JBTSBtZWNoYW5pc20gd2lsbAoJICogZmFpbC4KCSAqLwoJaWYgKHBvcnQtPmhi YS0+YXV0aF9tZXRob2QgPT0gdWFNRDUgJiYgcHd0eXBlID09IFBBU1NXT1JEX1RZUEVfTUQ1KQoJ CWF1dGhfcmVzdWx0ID0gQ2hlY2tNRDVBdXRoKHBvcnQsIHNoYWRvd19wYXNzLCBsb2dkZXRhaWwp OwoJZWxzZQoJCWF1dGhfcmVzdWx0ID0gQ2hlY2tTQVNMQXV0aCgmcGdfYmVfc2NyYW1fbWVjaCwg cG9ydCwgc2hhZG93X3Bhc3MsCgkJCQkJCQkJCWxvZ2RldGFpbCk7CgoJaWYgKHNoYWRvd19wYXNz KQoJCXBmcmVlKHNoYWRvd19wYXNzKTsKCWVsc2UKCXsKCQkvKgoJCSAqIElmIGdldF9yb2xlX3Bh c3N3b3JkKCkgcmV0dXJuZWQgZXJyb3IsIGF1dGhlbnRpY2F0aW9uIGJldHRlciBub3QKCQkgKiBo YXZlIHN1Y2NlZWRlZC4KCQkgKi8KCQlBc3NlcnQoYXV0aF9yZXN1bHQgIT0gU1RBVFVTX09LKTsK CX0KCglpZiAoYXV0aF9yZXN1bHQgPT0gU1RBVFVTX09LKQoJCXNldF9hdXRobl9pZChwb3J0LCBw b3J0LT51c2VyX25hbWUpOwoKCXJldHVybiBhdXRoX3Jlc3VsdDsKfQoKc3RhdGljIGludApDaGVj a01ENUF1dGgoUG9ydCAqcG9ydCwgY2hhciAqc2hhZG93X3Bhc3MsIGNvbnN0IGNoYXIgKipsb2dk ZXRhaWwpCnsKCWNoYXIJCW1kNVNhbHRbNF07CQkvKiBQYXNzd29yZCBzYWx0ICovCgljaGFyCSAg ICpwYXNzd2Q7CglpbnQJCQlyZXN1bHQ7CgoJaWYgKERiX3VzZXJfbmFtZXNwYWNlKQoJCWVyZXBv cnQoRkFUQUwsCgkJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfQVVUSE9SSVpBVElPTl9TUEVD SUZJQ0FUSU9OKSwKCQkJCSBlcnJtc2coIk1ENSBhdXRoZW50aWNhdGlvbiBpcyBub3Qgc3VwcG9y dGVkIHdoZW4gXCJkYl91c2VyX25hbWVzcGFjZVwiIGlzIGVuYWJsZWQiKSkpOwoKCS8qIGluY2x1 ZGUgdGhlIHNhbHQgdG8gdXNlIGZvciBjb21wdXRpbmcgdGhlIHJlc3BvbnNlICovCglpZiAoIXBn X3N0cm9uZ19yYW5kb20obWQ1U2FsdCwgNCkpCgl7CgkJZXJlcG9ydChMT0csCgkJCQkoZXJybXNn KCJjb3VsZCBub3QgZ2VuZXJhdGUgcmFuZG9tIE1ENSBzYWx0IikpKTsKCQlyZXR1cm4gU1RBVFVT X0VSUk9SOwoJfQoKCXNlbmRBdXRoUmVxdWVzdChwb3J0LCBBVVRIX1JFUV9NRDUsIG1kNVNhbHQs IDQpOwoKCXBhc3N3ZCA9IHJlY3ZfcGFzc3dvcmRfcGFja2V0KHBvcnQpOwoJaWYgKHBhc3N3ZCA9 PSBOVUxMKQoJCXJldHVybiBTVEFUVVNfRU9GOwkJLyogY2xpZW50IHdvdWxkbid0IHNlbmQgcGFz c3dvcmQgKi8KCglpZiAoc2hhZG93X3Bhc3MpCgkJcmVzdWx0ID0gbWQ1X2NyeXB0X3ZlcmlmeShw b3J0LT51c2VyX25hbWUsIHNoYWRvd19wYXNzLCBwYXNzd2QsCgkJCQkJCQkJICBtZDVTYWx0LCA0 LCBsb2dkZXRhaWwpOwoJZWxzZQoJCXJlc3VsdCA9IFNUQVRVU19FUlJPUjsKCglwZnJlZShwYXNz d2QpOwoKCXJldHVybiByZXN1bHQ7Cn0KCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogR1NTQVBJIGF1dGhlbnRpY2F0 aW9uIHN5c3RlbQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCiNpZmRlZiBFTkFCTEVfR1NTCnN0YXRpYyBpbnQKcGdf R1NTX3JlY3ZhdXRoKFBvcnQgKnBvcnQpCnsKCU9NX3VpbnQzMgltYWpfc3RhdCwKCQkJCW1pbl9z dGF0LAoJCQkJbG1pbl9zLAoJCQkJZ2ZsYWdzOwoJaW50CQkJbXR5cGU7CglTdHJpbmdJbmZvRGF0 YSBidWY7Cglnc3NfYnVmZmVyX2Rlc2MgZ2J1ZjsKCWdzc19jcmVkX2lkX3QgZGVsZWdhdGVkX2Ny ZWRzOwoKCS8qCgkgKiBVc2UgdGhlIGNvbmZpZ3VyZWQga2V5dGFiLCBpZiB0aGVyZSBpcyBvbmUu ICBBcyB3ZSBub3cgcmVxdWlyZSBNSVQKCSAqIEtlcmJlcm9zLCB3ZSBtaWdodCBjb25zaWRlciB1 c2luZyB0aGUgY3JlZGVudGlhbCBzdG9yZSBleHRlbnNpb25zIGluCgkgKiB0aGUgZnV0dXJlIGlu c3RlYWQgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLgoJICovCglpZiAocGdfa3JiX3NlcnZl cl9rZXlmaWxlICE9IE5VTEwgJiYgcGdfa3JiX3NlcnZlcl9rZXlmaWxlWzBdICE9ICdcMCcpCgl7 CgkJaWYgKHNldGVudigiS1JCNV9LVE5BTUUiLCBwZ19rcmJfc2VydmVyX2tleWZpbGUsIDEpICE9 IDApCgkJewoJCQkvKiBUaGUgb25seSBsaWtlbHkgZmFpbHVyZSBjYXVzZSBpcyBPT00sIHNvIHVz ZSB0aGF0IGVycmNvZGUgKi8KCQkJZXJlcG9ydChGQVRBTCwKCQkJCQkoZXJyY29kZShFUlJDT0RF X09VVF9PRl9NRU1PUlkpLAoJCQkJCSBlcnJtc2coImNvdWxkIG5vdCBzZXQgZW52aXJvbm1lbnQ6 ICVtIikpKTsKCQl9Cgl9CgoJLyoKCSAqIFdlIGFjY2VwdCBhbnkgc2VydmljZSBwcmluY2lwYWwg dGhhdCdzIHByZXNlbnQgaW4gb3VyIGtleXRhYi4gVGhpcwoJICogaW5jcmVhc2VzIGludGVyb3Bl cmFiaWxpdHkgYmV0d2VlbiBrZXJiZXJvcyBpbXBsZW1lbnRhdGlvbnMgdGhhdCBzZWUKCSAqIGZv ciBleGFtcGxlIGNhc2Ugc2Vuc2l0aXZpdHkgZGlmZmVyZW50bHksIHdoaWxlIG5vdCByZWFsbHkg b3BlbmluZyB1cAoJICogYW55IHZlY3RvciBvZiBhdHRhY2suCgkgKi8KCXBvcnQtPmdzcy0+Y3Jl ZCA9IEdTU19DX05PX0NSRURFTlRJQUw7CgoJLyoKCSAqIEluaXRpYWxpemUgc2VxdWVuY2Ugd2l0 aCBhbiBlbXB0eSBjb250ZXh0CgkgKi8KCXBvcnQtPmdzcy0+Y3R4ID0gR1NTX0NfTk9fQ09OVEVY VDsKCglkZWxlZ2F0ZWRfY3JlZHMgPSBHU1NfQ19OT19DUkVERU5USUFMOwoJcG9ydC0+Z3NzLT5k ZWxlZ2F0ZWRfY3JlZHMgPSBmYWxzZTsKCgkvKgoJICogTG9vcCB0aHJvdWdoIEdTU0FQSSBtZXNz YWdlIGV4Y2hhbmdlLiBUaGlzIGV4Y2hhbmdlIGNhbiBjb25zaXN0IG9mCgkgKiBtdWx0aXBsZSBt ZXNzYWdlcyBzZW50IGluIGJvdGggZGlyZWN0aW9ucy4gRmlyc3QgbWVzc2FnZSBpcyBhbHdheXMg ZnJvbQoJICogdGhlIGNsaWVudC4gQWxsIG1lc3NhZ2VzIGZyb20gY2xpZW50IHRvIHNlcnZlciBh cmUgcGFzc3dvcmQgcGFja2V0cwoJICogKHR5cGUgJ3AnKS4KCSAqLwoJZG8KCXsKCQlwcV9zdGFy dG1zZ3JlYWQoKTsKCgkJQ0hFQ0tfRk9SX0lOVEVSUlVQVFMoKTsKCgkJbXR5cGUgPSBwcV9nZXRi eXRlKCk7CgkJaWYgKG10eXBlICE9ICdwJykKCQl7CgkJCS8qIE9ubHkgbG9nIGVycm9yIGlmIGNs aWVudCBkaWRuJ3QgZGlzY29ubmVjdC4gKi8KCQkJaWYgKG10eXBlICE9IEVPRikKCQkJCWVyZXBv cnQoRVJST1IsCgkJCQkJCShlcnJjb2RlKEVSUkNPREVfUFJPVE9DT0xfVklPTEFUSU9OKSwKCQkJ CQkJIGVycm1zZygiZXhwZWN0ZWQgR1NTIHJlc3BvbnNlLCBnb3QgbWVzc2FnZSB0eXBlICVkIiwK CQkJCQkJCQltdHlwZSkpKTsKCQkJcmV0dXJuIFNUQVRVU19FUlJPUjsKCQl9CgoJCS8qIEdldCB0 aGUgYWN0dWFsIEdTUyB0b2tlbiAqLwoJCWluaXRTdHJpbmdJbmZvKCZidWYpOwoJCWlmIChwcV9n ZXRtZXNzYWdlKCZidWYsIFBHX01BWF9BVVRIX1RPS0VOX0xFTkdUSCkpCgkJewoJCQkvKiBFT0Yg LSBwcV9nZXRtZXNzYWdlIGFscmVhZHkgbG9nZ2VkIGVycm9yICovCgkJCXBmcmVlKGJ1Zi5kYXRh KTsKCQkJcmV0dXJuIFNUQVRVU19FUlJPUjsKCQl9CgoJCS8qIE1hcCB0byBHU1NBUEkgc3R5bGUg YnVmZmVyICovCgkJZ2J1Zi5sZW5ndGggPSBidWYubGVuOwoJCWdidWYudmFsdWUgPSBidWYuZGF0 YTsKCgkJZWxvZyhERUJVRzQsICJwcm9jZXNzaW5nIHJlY2VpdmVkIEdTUyB0b2tlbiBvZiBsZW5n dGggJXUiLAoJCQkgKHVuc2lnbmVkIGludCkgZ2J1Zi5sZW5ndGgpOwoKCQltYWpfc3RhdCA9IGdz c19hY2NlcHRfc2VjX2NvbnRleHQoJm1pbl9zdGF0LAoJCQkJCQkJCQkJICAmcG9ydC0+Z3NzLT5j dHgsCgkJCQkJCQkJCQkgIHBvcnQtPmdzcy0+Y3JlZCwKCQkJCQkJCQkJCSAgJmdidWYsCgkJCQkJ CQkJCQkgIEdTU19DX05PX0NIQU5ORUxfQklORElOR1MsCgkJCQkJCQkJCQkgICZwb3J0LT5nc3Mt Pm5hbWUsCgkJCQkJCQkJCQkgIE5VTEwsCgkJCQkJCQkJCQkgICZwb3J0LT5nc3MtPm91dGJ1ZiwK CQkJCQkJCQkJCSAgJmdmbGFncywKCQkJCQkJCQkJCSAgTlVMTCwKCQkJCQkJCQkJCSAgcGdfZ3Nz X2FjY2VwdF9kZWxlZ2F0aW9uID8gJmRlbGVnYXRlZF9jcmVkcyA6IE5VTEwpOwoKCQkvKiBnYnVm IG5vIGxvbmdlciB1c2VkICovCgkJcGZyZWUoYnVmLmRhdGEpOwoKCQllbG9nKERFQlVHNSwgImdz c19hY2NlcHRfc2VjX2NvbnRleHQgbWFqb3I6ICV1LCAiCgkJCSAibWlub3I6ICV1LCBvdXRsZW46 ICV1LCBvdXRmbGFnczogJXgiLAoJCQkgbWFqX3N0YXQsIG1pbl9zdGF0LAoJCQkgKHVuc2lnbmVk IGludCkgcG9ydC0+Z3NzLT5vdXRidWYubGVuZ3RoLCBnZmxhZ3MpOwoKCQlDSEVDS19GT1JfSU5U RVJSVVBUUygpOwoKCQlpZiAoZGVsZWdhdGVkX2NyZWRzICE9IEdTU19DX05PX0NSRURFTlRJQUwg JiYgZ2ZsYWdzICYgR1NTX0NfREVMRUdfRkxBRykKCQl7CgkJCXBnX3N0b3JlX2RlbGVnYXRlZF9j cmVkZW50aWFsKGRlbGVnYXRlZF9jcmVkcyk7CgkJCXBvcnQtPmdzcy0+ZGVsZWdhdGVkX2NyZWRz ID0gdHJ1ZTsKCQl9CgoJCWlmIChwb3J0LT5nc3MtPm91dGJ1Zi5sZW5ndGggIT0gMCkKCQl7CgkJ CS8qCgkJCSAqIE5lZ290aWF0aW9uIGdlbmVyYXRlZCBkYXRhIHRvIGJlIHNlbnQgdG8gdGhlIGNs aWVudC4KCQkJICovCgkJCWVsb2coREVCVUc0LCAic2VuZGluZyBHU1MgcmVzcG9uc2UgdG9rZW4g b2YgbGVuZ3RoICV1IiwKCQkJCSAodW5zaWduZWQgaW50KSBwb3J0LT5nc3MtPm91dGJ1Zi5sZW5n dGgpOwoKCQkJc2VuZEF1dGhSZXF1ZXN0KHBvcnQsIEFVVEhfUkVRX0dTU19DT05ULAoJCQkJCQkJ cG9ydC0+Z3NzLT5vdXRidWYudmFsdWUsIHBvcnQtPmdzcy0+b3V0YnVmLmxlbmd0aCk7CgoJCQln c3NfcmVsZWFzZV9idWZmZXIoJmxtaW5fcywgJnBvcnQtPmdzcy0+b3V0YnVmKTsKCQl9CgoJCWlm IChtYWpfc3RhdCAhPSBHU1NfU19DT01QTEVURSAmJiBtYWpfc3RhdCAhPSBHU1NfU19DT05USU5V RV9ORUVERUQpCgkJewoJCQlnc3NfZGVsZXRlX3NlY19jb250ZXh0KCZsbWluX3MsICZwb3J0LT5n c3MtPmN0eCwgR1NTX0NfTk9fQlVGRkVSKTsKCQkJcGdfR1NTX2Vycm9yKF8oImFjY2VwdGluZyBH U1Mgc2VjdXJpdHkgY29udGV4dCBmYWlsZWQiKSwKCQkJCQkJIG1hal9zdGF0LCBtaW5fc3RhdCk7 CgkJCXJldHVybiBTVEFUVVNfRVJST1I7CgkJfQoKCQlpZiAobWFqX3N0YXQgPT0gR1NTX1NfQ09O VElOVUVfTkVFREVEKQoJCQllbG9nKERFQlVHNCwgIkdTUyBjb250aW51ZSBuZWVkZWQiKTsKCgl9 IHdoaWxlIChtYWpfc3RhdCA9PSBHU1NfU19DT05USU5VRV9ORUVERUQpOwoKCWlmIChwb3J0LT5n c3MtPmNyZWQgIT0gR1NTX0NfTk9fQ1JFREVOVElBTCkKCXsKCQkvKgoJCSAqIFJlbGVhc2Ugc2Vy dmljZSBwcmluY2lwYWwgY3JlZGVudGlhbHMKCQkgKi8KCQlnc3NfcmVsZWFzZV9jcmVkKCZtaW5f c3RhdCwgJnBvcnQtPmdzcy0+Y3JlZCk7Cgl9CglyZXR1cm4gcGdfR1NTX2NoZWNrYXV0aChwb3J0 KTsKfQoKLyoKICogQ2hlY2sgd2hldGhlciB0aGUgR1NTQVBJLWF1dGhlbnRpY2F0ZWQgdXNlciBp cyBhbGxvd2VkIHRvIGNvbm5lY3QgYXMgdGhlCiAqIGNsYWltZWQgdXNlcm5hbWUuCiAqLwpzdGF0 aWMgaW50CnBnX0dTU19jaGVja2F1dGgoUG9ydCAqcG9ydCkKewoJaW50CQkJcmV0OwoJT01fdWlu dDMyCW1hal9zdGF0LAoJCQkJbWluX3N0YXQsCgkJCQlsbWluX3M7Cglnc3NfYnVmZmVyX2Rlc2Mg Z2J1ZjsKCWNoYXIJICAgKnByaW5jOwoKCS8qCgkgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIHVzZXIg dGhhdCBhdXRoZW50aWNhdGVkLCBhbmQgY29tcGFyZSBpdCB0byB0aGUgcGcKCSAqIHVzZXJuYW1l IHRoYXQgd2FzIHNwZWNpZmllZCBmb3IgdGhlIGNvbm5lY3Rpb24uCgkgKi8KCW1hal9zdGF0ID0g Z3NzX2Rpc3BsYXlfbmFtZSgmbWluX3N0YXQsIHBvcnQtPmdzcy0+bmFtZSwgJmdidWYsIE5VTEwp OwoJaWYgKG1hal9zdGF0ICE9IEdTU19TX0NPTVBMRVRFKQoJewoJCXBnX0dTU19lcnJvcihfKCJy ZXRyaWV2aW5nIEdTUyB1c2VyIG5hbWUgZmFpbGVkIiksCgkJCQkJIG1hal9zdGF0LCBtaW5fc3Rh dCk7CgkJcmV0dXJuIFNUQVRVU19FUlJPUjsKCX0KCgkvKgoJICogZ2J1Zi52YWx1ZSBtaWdodCBu b3QgYmUgbnVsbC10ZXJtaW5hdGVkLCBzbyB0dXJuIGl0IGludG8gYSByZWd1bGFyCgkgKiBudWxs LXRlcm1pbmF0ZWQgc3RyaW5nLgoJICovCglwcmluYyA9IHBhbGxvYyhnYnVmLmxlbmd0aCArIDEp OwoJbWVtY3B5KHByaW5jLCBnYnVmLnZhbHVlLCBnYnVmLmxlbmd0aCk7CglwcmluY1tnYnVmLmxl bmd0aF0gPSAnXDAnOwoJZ3NzX3JlbGVhc2VfYnVmZmVyKCZsbWluX3MsICZnYnVmKTsKCgkvKgoJ ICogQ29weSB0aGUgb3JpZ2luYWwgbmFtZSBvZiB0aGUgYXV0aGVudGljYXRlZCBwcmluY2lwYWwg aW50byBvdXIgYmFja2VuZAoJICogbWVtb3J5IGZvciBkaXNwbGF5IGxhdGVyLgoJICoKCSAqIFRo aXMgaXMgYWxzbyBvdXIgYXV0aGVudGljYXRlZCBpZGVudGl0eS4gIFNldCBpdCBub3csIHJhdGhl ciB0aGFuCgkgKiB3YWl0aW5nIGZvciB0aGUgdXNlcm1hcCBjaGVjayBiZWxvdywgYmVjYXVzZSBh dXRoZW50aWNhdGlvbiBoYXMgYWxyZWFkeQoJICogc3VjY2VlZGVkIGFuZCB3ZSB3YW50IHRoZSBs b2cgZmlsZSB0byByZWZsZWN0IHRoYXQuCgkgKi8KCXBvcnQtPmdzcy0+cHJpbmMgPSBNZW1vcnlD b250ZXh0U3RyZHVwKFRvcE1lbW9yeUNvbnRleHQsIHByaW5jKTsKCXNldF9hdXRobl9pZChwb3J0 LCBwcmluYyk7CgoJLyoKCSAqIFNwbGl0IHRoZSB1c2VybmFtZSBhdCB0aGUgcmVhbG0gc2VwYXJh dG9yCgkgKi8KCWlmIChzdHJjaHIocHJpbmMsICdAJykpCgl7CgkJY2hhcgkgICAqY3AgPSBzdHJj aHIocHJpbmMsICdAJyk7CgoJCS8qCgkJICogSWYgd2UgYXJlIG5vdCBnb2luZyB0byBpbmNsdWRl IHRoZSByZWFsbSBpbiB0aGUgdXNlcm5hbWUgdGhhdCBpcwoJCSAqIHBhc3NlZCB0byB0aGUgaWRl bnQgbWFwLCBkZXN0cnVjdGl2ZWx5IG1vZGlmeSBpdCBoZXJlIHRvIHJlbW92ZSB0aGUKCQkgKiBy ZWFsbS4gVGhlbiBhZHZhbmNlIHBhc3QgdGhlIHNlcGFyYXRvciB0byBjaGVjayB0aGUgcmVhbG0u CgkJICovCgkJaWYgKCFwb3J0LT5oYmEtPmluY2x1ZGVfcmVhbG0pCgkJCSpjcCA9ICdcMCc7CgkJ Y3ArKzsKCgkJaWYgKHBvcnQtPmhiYS0+a3JiX3JlYWxtICE9IE5VTEwgJiYgc3RybGVuKHBvcnQt PmhiYS0+a3JiX3JlYWxtKSkKCQl7CgkJCS8qCgkJCSAqIE1hdGNoIHRoZSByZWFsbSBwYXJ0IG9m IHRoZSBuYW1lIGZpcnN0CgkJCSAqLwoJCQlpZiAocGdfa3JiX2Nhc2VpbnNfdXNlcnMpCgkJCQly ZXQgPSBwZ19zdHJjYXNlY21wKHBvcnQtPmhiYS0+a3JiX3JlYWxtLCBjcCk7CgkJCWVsc2UKCQkJ CXJldCA9IHN0cmNtcChwb3J0LT5oYmEtPmtyYl9yZWFsbSwgY3ApOwoKCQkJaWYgKHJldCkKCQkJ ewoJCQkJLyogR1NTIHJlYWxtIGRvZXMgbm90IG1hdGNoICovCgkJCQllbG9nKERFQlVHMiwKCQkJ CQkgIkdTU0FQSSByZWFsbSAoJXMpIGFuZCBjb25maWd1cmVkIHJlYWxtICglcykgZG9uJ3QgbWF0 Y2giLAoJCQkJCSBjcCwgcG9ydC0+aGJhLT5rcmJfcmVhbG0pOwoJCQkJcGZyZWUocHJpbmMpOwoJ CQkJcmV0dXJuIFNUQVRVU19FUlJPUjsKCQkJfQoJCX0KCX0KCWVsc2UgaWYgKHBvcnQtPmhiYS0+ a3JiX3JlYWxtICYmIHN0cmxlbihwb3J0LT5oYmEtPmtyYl9yZWFsbSkpCgl7CgkJZWxvZyhERUJV RzIsCgkJCSAiR1NTQVBJIGRpZCBub3QgcmV0dXJuIHJlYWxtIGJ1dCByZWFsbSBtYXRjaGluZyB3 YXMgcmVxdWVzdGVkIik7CgkJcGZyZWUocHJpbmMpOwoJCXJldHVybiBTVEFUVVNfRVJST1I7Cgl9 CgoJcmV0ID0gY2hlY2tfdXNlcm1hcChwb3J0LT5oYmEtPnVzZXJtYXAsIHBvcnQtPnVzZXJfbmFt ZSwgcHJpbmMsCgkJCQkJCXBnX2tyYl9jYXNlaW5zX3VzZXJzKTsKCglwZnJlZShwcmluYyk7CgoJ cmV0dXJuIHJldDsKfQojZW5kaWYJCQkJCQkJLyogRU5BQkxFX0dTUyAqLwoKCi8qLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQog KiBTU1BJIGF1dGhlbnRpY2F0aW9uIHN5c3RlbQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCiNpZmRlZiBFTkFCTEVf U1NQSQoKLyoKICogR2VuZXJhdGUgYW4gZXJyb3IgZm9yIFNTUEkgYXV0aGVudGljYXRpb24uICBU aGUgY2FsbGVyIHNob3VsZCBhcHBseQogKiBfKCkgdG8gZXJybXNnIHRvIG1ha2UgaXQgdHJhbnNs YXRhYmxlLgogKi8Kc3RhdGljIHZvaWQKcGdfU1NQSV9lcnJvcihpbnQgc2V2ZXJpdHksIGNvbnN0 IGNoYXIgKmVycm1zZywgU0VDVVJJVFlfU1RBVFVTIHIpCnsKCWNoYXIJCXN5c21zZ1syNTZdOwoK CWlmIChGb3JtYXRNZXNzYWdlKEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTIHwKCQkJCQkg IEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNLAoJCQkJCSAgTlVMTCwgciwgMCwKCQkJCQkgIHN5 c21zZywgc2l6ZW9mKHN5c21zZyksIE5VTEwpID09IDApCgkJZXJlcG9ydChzZXZlcml0eSwKCQkJ CShlcnJtc2dfaW50ZXJuYWwoIiVzIiwgZXJybXNnKSwKCQkJCSBlcnJkZXRhaWxfaW50ZXJuYWwo IlNTUEkgZXJyb3IgJXgiLCAodW5zaWduZWQgaW50KSByKSkpOwoJZWxzZQoJCWVyZXBvcnQoc2V2 ZXJpdHksCgkJCQkoZXJybXNnX2ludGVybmFsKCIlcyIsIGVycm1zZyksCgkJCQkgZXJyZGV0YWls X2ludGVybmFsKCIlcyAoJXgpIiwgc3lzbXNnLCAodW5zaWduZWQgaW50KSByKSkpOwp9CgovLyBT VEFSVCBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAoKLy8gLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KY2hhciogU1NQSV9HZXRVc2VyRGlzdGluZ3Vpc2hlZE5hbWUoY29uc3Qg Y2hhciogdXNlcm5hbWUpCnsKCS8qCglHZXQgdXNlciBkaXN0aW5ndWlzaGVkIG5hbWUgKENOPVVz ZXIgTmFtZSxPVT1Vc2VycyxEQz1FeGFtcGxlLERDPU1pY3Jvc29mdCxEQz1Db20pIGZyb20gU0FN IGFjY291bnQgbmFtZSAoRG9tYWluXFVzZXJOYW1lKQoJVGhlIHVzZXIgZGlzdGluZ3Vpc2hlZCBu YW1lIGNvbnRhaW5zIHRoZSBmdWxsIGRvbWFpbiBwYXRoIHdoaWNoIGlzIHJlcXVpcmVkIGJ5IHN1 YnNlcXVlbnQgc3RlcHMuCgkqLwoKCS8qCglbRHNDcmFja05hbWVzIFN0YXR1c10KCURTX05BTUVf Tk9fRVJST1IgPSAwLAoJRFNfTkFNRV9FUlJPUl9SRVNPTFZJTkcgPSAxLAoJRFNfTkFNRV9FUlJP Ul9OT1RfRk9VTkQgPSAyLAoJRFNfTkFNRV9FUlJPUl9OT1RfVU5JUVVFID0gMywKCURTX05BTUVf RVJST1JfTk9fTUFQUElORyA9IDQsCglEU19OQU1FX0VSUk9SX0RPTUFJTl9PTkxZID0gNSwKCURT X05BTUVfRVJST1JfTk9fU1lOVEFDVElDQUxfTUFQUElORyA9IDYsCglEU19OQU1FX0VSUk9SX1RS VVNUX1JFRkVSUkFMID0gNwoJKi8KCgkvL2Vsb2coREVCVUc0LCAiW3VzZXJuYW1lID0gJXNdIiwg dXNlcm5hbWUpOwoKI2lmZGVmIFdJTjMyCglORVRfQVBJX1NUQVRVUyBuU3RhdHVzOwoKCS8vIEdl dCBkb21haW4gY29udHJvbGxlcnMuCglEV09SRCBkd1JldDsKCVBET01BSU5fQ09OVFJPTExFUl9J TkZPIHBkY0luZm87CgljaGFyIERvbWFpbkNvbnRyb2xsZXJbTUFYUEdQQVRIXTsKCWJvb2wgRm91 bmRhREMgPSBmYWxzZTsKCgkvLyBHZXQgYSBkb21haW4gY29udHJvbGxlciBmb3IgdGhlIGRvbWFp biB0aGlzIGNvbXB1dGVyIGlzIG9uLgoJLy8gTk9URTogTmV0R2V0QW55RENOYW1lIGFuZCBOZXRH ZXREQ05hbWUgZG8gbm90IHdvcmsgZm9yIHNvbWUgcmVhc29uLiBPdXRwdXQgaXMgIlwiIChibGFu aykKCWR3UmV0ID0gRHNHZXREY05hbWUoTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgJnBkY0lu Zm8pOwoJaWYgKGR3UmV0ID09IEVSUk9SX1NVQ0NFU1MpCgl7CgkJSEFORExFIGhHZXREYzsKCgkJ Ly8gT3BlbiB0aGUgZW51bWVyYXRpb24uCgkJZHdSZXQgPSBEc0dldERjT3BlbihwZGNJbmZvLT5E b21haW5OYW1lLCBEU19OT1RJRllfQUZURVJfU0lURV9SRUNPUkRTLCBOVUxMLCBOVUxMLCBOVUxM LCAwLCAmaEdldERjKTsKCQlpZiAoZHdSZXQgPT0gRVJST1JfU1VDQ0VTUykKCQl7CgkJCUxQVFNU UiBwc3pEbnNIb3N0TmFtZTsKCgkJCS8vIEVudW1lcmF0ZSBlYWNoIGRvbWFpbiBjb250cm9sbGVy CgkJCXdoaWxlICghRm91bmRhREMpCgkJCXsKCQkJCVVMT05HIHVsU29ja2V0Q291bnQ7CgkJCQlM UFNPQ0tFVF9BRERSRVNTIHJnU29ja2V0QWRkcmVzc2VzOwoKCQkJCWR3UmV0ID0gRHNHZXREY05l eHQoaEdldERjLCAmdWxTb2NrZXRDb3VudCwgJnJnU29ja2V0QWRkcmVzc2VzLCAmcHN6RG5zSG9z dE5hbWUpOwoJCQkJaWYgKGR3UmV0ID09IEVSUk9SX1NVQ0NFU1MpCgkJCQl7CgkJCQkJc3RyY3B5 KERvbWFpbkNvbnRyb2xsZXIsIHBzekRuc0hvc3ROYW1lKTsKCQkJCQkvL2Vsb2coREVCVUc0LCAi RG9tYWluQ29udHJvbGxlcjogJXMiLCBEb21haW5Db250cm9sbGVyKTsKCgkJCQkJLy8gRnJlZSB0 aGUgYWxsb2NhdGVkIHN0cmluZy4KCQkJCQlOZXRBcGlCdWZmZXJGcmVlKHBzekRuc0hvc3ROYW1l KTsKCgkJCQkJLy8gRnJlZSB0aGUgc29ja2V0IGFkZHJlc3MgYXJyYXkuCgkJCQkJTG9jYWxGcmVl KHJnU29ja2V0QWRkcmVzc2VzKTsKCgkJCQkJLy8gR290IG9uZSwgbm8gbmVlZCB0byBjb250aW51 ZS4KCQkJCQlGb3VuZGFEQyA9IHRydWU7CgkJCQl9CgkJCQllbHNlIGlmIChkd1JldCA9PSBFUlJP Ul9OT19NT1JFX0lURU1TKQoJCQkJewoJCQkJCS8vIFRoZSBlbmQgb2YgdGhlIGxpc3QgaGFzIGJl ZW4gcmVhY2hlZC4KCQkJCQlicmVhazsKCQkJCX0KCQkJCWVsc2UgaWYgKGR3UmV0ID09IEVSUk9S X0ZJTEVNQVJLX0RFVEVDVEVEKQoJCQkJewoJCQkJCS8vIERTX05PVElGWV9BRlRFUl9TSVRFX1JF Q09SRFMgd2FzIHNwZWNpZmllZCBpbiBEc0dldERjT3BlbiBhbmQgdGhlIGVuZCBvZiB0aGUgc2l0 ZS1zcGVjaWZpYyByZWNvcmRzIHdhcyByZWFjaGVkLgoJCQkJCWVsb2coRVJST1IsICJFbmQgb2Yg c2l0ZS1zcGVjaWZpYyBkb21haW4gY29udHJvbGxlcnMuIik7CgkJCQkJY29udGludWU7CgkJCQl9 CgkJCQllbHNlCgkJCQl7CgkJCQkJLy8gU29tZSBvdGhlciBlcnJvciBvY2N1cnJlZC4KCQkJCQli cmVhazsKCQkJCX0KCQkJfQoJCQkvLyBDbG9zZSB0aGUgZW51bWVyYXRpb24uCgkJCURzR2V0RGND bG9zZShoR2V0RGMpOwoJCX0KCgkJLy8gRnJlZSB0aGUgRE9NQUlOX0NPTlRST0xMRVJfSU5GTyBz dHJ1Y3R1cmUuIAoJCU5ldEFwaUJ1ZmZlckZyZWUocGRjSW5mbyk7Cgl9CgllbG9nKERFQlVHNCwg IkRvbWFpbkNvbnRyb2xsZXI6ICVzIiwgRG9tYWluQ29udHJvbGxlcik7CgoJLy8gQmluZCB0byB0 aGUgZG9tYWluIGNvbnRyb2xsZXIuCglIQU5ETEUgaERTID0gTlVMTDsKCW5TdGF0dXMgPSBEc0Jp bmRBKERvbWFpbkNvbnRyb2xsZXIsIE5VTEwsICZoRFMpOwoJaWYgKG5TdGF0dXMgIT0gRVJST1Jf U1VDQ0VTUykgewoJCWVsb2coRVJST1IsICJFcnJvciBpbiBEc0JpbmRXLiBFcnJvciBiaW5kaW5n IHRvIGRvbWFpbi4gUmV0dXJuIGNvZGUgPSAlZCIsIG5TdGF0dXMpOwoJCXJldHVybiBOVUxMOwoJ fQoKCS8vIEdldCB1c2VyIGRpc3Rpbmd1aXNoZWQgbmFtZSAoQ049VXNlciBOYW1lLE9VPVVzZXJz LERDPUV4YW1wbGUsREM9TWljcm9zb2Z0LERDPUNvbSkgZnJvbSBTQU0gYWNjb3VudCBuYW1lIChE b21haW5cVXNlck5hbWUpCglMUENTVFIgc3pOYW1lc1tdID0geyB1c2VybmFtZSB9OwoJUERTX05B TUVfUkVTVUxUIHBSZXN1bHQgPSBOVUxMOwoJRFdPUkQgZHdSZXN1bHQgPSBEc0NyYWNrTmFtZXNB KGhEUywgRFNfTkFNRV9GTEFHX1RSVVNUX1JFRkVSUkFMLCBEU19OVDRfQUNDT1VOVF9OQU1FLCBE U19GUUROXzE3NzlfTkFNRSwgMSwgc3pOYW1lcywgJnBSZXN1bHQpOwoJaWYgKE5PX0VSUk9SICE9 IGR3UmVzdWx0KQoJewoJCWVsb2coRVJST1IsICJFcnJvciBpbiBEc0NyYWNrTmFtZXMuIFJldHVy biBjb2RlID0gJWQiLCBkd1Jlc3VsdCk7CgkJRHNVbkJpbmQoJmhEUyk7CgkJcmV0dXJuIE5VTEw7 Cgl9CgoJaWYgKHBSZXN1bHQtPmNJdGVtcyAhPSAxIHx8IHBSZXN1bHQtPnJJdGVtc1swXS5zdGF0 dXMgIT0gRFNfTkFNRV9OT19FUlJPUikKCXsKCQllbG9nKEVSUk9SLCAiRXJyb3IgaW4gRHNDcmFj a05hbWVzLiBJdGVtQ291bnQ9JWQgU3RhdHVzPSVkIiwgcFJlc3VsdC0+Y0l0ZW1zLCBwUmVzdWx0 LT5ySXRlbXNbMF0uc3RhdHVzKTsKCQlEc0ZyZWVOYW1lUmVzdWx0KHBSZXN1bHQpOwoJCURzVW5C aW5kKCZoRFMpOwoJCXJldHVybiBOVUxMOwoJfQoJLy9lbG9nKERFQlVHNCwgIltVc2VyRGlzdGlu Z3Vpc2hlZE5hbWUgPSAlc10iLCBwUmVzdWx0LT5ySXRlbXNbMF0ucE5hbWUpOwoJY2hhciBVc2Vy RGlzdGluZ3Vpc2hlZE5hbWVbTUFYUEdQQVRIXTsKCXNwcmludGYoVXNlckRpc3Rpbmd1aXNoZWRO YW1lLCAiJXMiLCBwUmVzdWx0LT5ySXRlbXNbMF0ucE5hbWUpOwoJZWxvZyhERUJVRzQsICJVc2Vy RGlzdGluZ3Vpc2hlZE5hbWUgPSAlcyIsIFVzZXJEaXN0aW5ndWlzaGVkTmFtZSk7CgoJRHNGcmVl TmFtZVJlc3VsdChwUmVzdWx0KTsKCURzVW5CaW5kKCZoRFMpOwoKCXJldHVybiBVc2VyRGlzdGlu Z3Vpc2hlZE5hbWU7CgojZWxzZQoJLy8gTm9uLVdpbmRvd3MgY29kZSBnb2VzIGhlcmUuCglyZXR1 cm4gTlVMTDsKI2VuZGlmCgp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBGdW5jdGlv biB0byByZXBsYWNlIGFsbCB0aGUgb2NjdXJyZW5jZXMgb2YgdGhlIHN1YnN0cmluZyBTMSB3aXRo IFMyIGluIHN0cmluZyBzCmNoYXIqIFJlcGxhY2VTdWJzdHJpbmcoY29uc3QgY2hhciogcywgY29u c3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKQp7CgkvLyBTdG9yZXMgdGhlIHJlc3VsdGFudCBz dHJpbmcKCXN0YXRpYyBjaGFyIGFuc1sxMDAwXSA9IHsgMCB9OwoJaW50IGFuc19pZHggPSAwOwoK CS8vIFRyYXZlcnNlIHRoZSBzdHJpbmcgcwoJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJsZW4ocyk7 IGkrKykKCXsKCQlpbnQgayA9IDA7CgoJCS8vIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2Ygc3Ry aW5nIHMxIG1hdGNoZXMgd2l0aCB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaW4gc3RyaW5nIHMKCQlp ZiAoc1tpXSA9PSBzMVtrXSAmJiBpICsgc3RybGVuKHMxKSA8PSBzdHJsZW4ocykpCgkJewoJCQlp bnQgajsKCgkJCS8vIElmIHRoZSBjb21wbGV0ZSBzdHJpbmcgbWF0Y2hlcyBvciBub3QuCgkJCWZv ciAoaiA9IGk7IGogPCBpICsgc3RybGVuKHMxKTsgaisrKQoJCQl7CgkJCQlpZiAoc1tqXSAhPSBz MVtrXSkKCQkJCXsKCQkJCQlicmVhazsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlrID0gayAr IDE7CgkJCQl9CgkJCX0KCgkJCS8vIElmIGNvbXBsZXRlIHN0cmluZyBtYXRjaGVzIHRoZW4gcmVw bGFjZSBpdCB3aXRoIHRoZSBzdHJpbmcgczIKCQkJaWYgKGogPT0gaSArIHN0cmxlbihzMSkpCgkJ CXsKCQkJCWZvciAoaW50IGwgPSAwOyBsIDwgc3RybGVuKHMyKTsgbCsrKQoJCQkJewoJCQkJCWFu c1thbnNfaWR4KytdID0gczJbbF07CgkJCQl9CgkJCQlpID0gaiAtIDE7CgkJCX0KCQkJLy8gT3Ro ZXJ3aXNlCgkJCWVsc2UKCQkJewoJCQkJYW5zW2Fuc19pZHgrK10gPSBzW2ldOwoJCQl9CgkJfQoJ CS8vIE90aGVyd2lzZQoJCWVsc2UKCQl7CgkJCWFuc1thbnNfaWR4KytdID0gc1tpXTsKCQl9Cgl9 CgoJcmV0dXJuIGFuczsKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gRnVuY3Rpb24g dG8gY29udmVydCBhIGNoYXIgKiBzdHJpbmcgdG8gYSB3Y2hhcl90IHN0cmluZwovLyBSZXR1cm5z IHRoZSBjb252ZXJ0ZWQgd2lkZSBjaGFyYWN0ZXIgc3RyaW5nCndjaGFyX3QqIGNvbnZlcnRfdG9f d2NoYXIoY29uc3QgY2hhciogczEpCnsKCS8vIEFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGUgd2No YXJfdCBzdHJpbmcKCXNpemVfdCBsZW4gPSBzdHJsZW4oczEpOwoJd2NoYXJfdCogczIgPSAod2No YXJfdCopbWFsbG9jKChsZW4gKyAxKSAqIHNpemVvZih3Y2hhcl90KSk7CgoJaWYgKHMyID09IE5V TEwpIHsKCQllbG9nKEVSUk9SLCAiY29udmVydF90b193Y2hhciAtIE1lbW9yeSBhbGxvY2F0aW9u IGZhaWxlZCIpOwoJCXJldHVybiBOVUxMOwoJfQoKCS8vIFVzZSBtYnN0b3djcyB0byBwZXJmb3Jt IHRoZSBjb252ZXJzaW9uCglzaXplX3QgcmVzdWx0ID0gbWJzdG93Y3MoczIsIHMxLCBsZW4gKyAx KTsKCglpZiAocmVzdWx0ID09IChzaXplX3QpLTEpIHsKCQllbG9nKEVSUk9SLCAiY29udmVydF90 b193Y2hhciAtIG1ic3Rvd2NzIGNvbnZlcnNpb24gZmFpbGVkIik7CgkJZnJlZShzMik7CgkJcmV0 dXJuIE5VTEw7Cgl9CgoJczJbbGVuXSA9IEwnXDAnOyAgLy8gTnVsbC10ZXJtaW5hdGUgdGhlIHdp ZGUgY2hhcmFjdGVyIHN0cmluZwoJcmV0dXJuIHMyOwp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQovLyBGdW5jdGlvbiB0byBjb252ZXJ0IGEgd2NoYXJfdCBzdHJpbmcgdG8gYSBjaGFyICog c3RyaW5nCi8vIFJldHVybnMgdGhlIGNvbnZlcnRlZCBtdWx0aWJ5dGUgc3RyaW5nCmNoYXIqIGNv bnZlcnRfdG9fbXVsdGlieXRlKGNvbnN0IHdjaGFyX3QqIHMxKQp7CgkvLyBEZXRlcm1pbmUgdGhl IHJlcXVpcmVkIHNpemUgZm9yIHRoZSBtdWx0aWJ5dGUgc3RyaW5nCglzaXplX3QgbGVuID0gd2Nz bGVuKHMxKTsKCXNpemVfdCBtYl9sZW4gPSBsZW4gKiBNQl9DVVJfTUFYICsgMTsgIC8vIE1CX0NV Ul9NQVggaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGluIGEgbXVsdGlieXRlIGNoYXJh Y3RlciBpbiB0aGUgY3VycmVudCBsb2NhbGUKCgkvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBt dWx0aWJ5dGUgc3RyaW5nCgljaGFyKiBzMiA9IChjaGFyKiltYWxsb2MobWJfbGVuKTsKCWlmIChz MiA9PSBOVUxMKSB7CgkJZWxvZyhFUlJPUiwgImNvbnZlcnRfdG9fbXVsdGlieXRlIC0gTWVtb3J5 IGFsbG9jYXRpb24gZmFpbGVkIik7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJLy8gQ29udmVydCB0aGUg d2NoYXJfdCBzdHJpbmcgdG8gbXVsdGlieXRlCglzaXplX3QgcmVzdWx0ID0gd2NzdG9tYnMoczIs IHMxLCBtYl9sZW4pOwoKCWlmIChyZXN1bHQgPT0gKHNpemVfdCktMSkgewoJCWVsb2coRVJST1Is ICJjb252ZXJ0X3RvX211bHRpYnl0ZSAtIHdjc3RvbWJzIGNvbnZlcnNpb24gZmFpbGVkIik7CgkJ ZnJlZShzMik7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJczJbbWJfbGVuIC0gMV0gPSAnXDAnOyAgLy8g TnVsbC10ZXJtaW5hdGUgdGhlIG11bHRpYnl0ZSBzdHJpbmcKCXJldHVybiBzMjsKfQoKLy8gLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KY2hhciogU1NQSV9HZXRHcm91cHNGb3JVc2VySW5Eb21haW4o Y29uc3QgY2hhciogdXNlcm5hbWUsIGNvbnN0IGNoYXIqIGRvbWFpbiwgY29uc3QgY2hhciogdXNl cmRvbWFpbikKewoJLyoKCVVzZXJuYW1lIG5lZWRzIHRvIGJlIHBsYWluIHVzZXJuYW1lIHdpdGgg bm8gZG9tYWluIG5hbWUuCglEb21haW4gbmVlZHMgdG8gYmUgZnVsbHkgcXVhbGlmaWVkIGRvbWFp biBuYW1lIChGUUROKS4KCVRvcCBsZXZlbCBkb21haW4gbmFtZSB3aWxsIG5vdCByZXR1cm4gdGhl IGdyb3VwcyBmb3IgdGhlIHVzZXIuCglUaGUgZG9tYWluIG5hbWUgbXVzdCBiZSB0aGUgb25lIG9i dGFpbmVkIGZyb20gdGhlIHVzZXIgZGlzdGluZ3Vpc2hlZCBuYW1lLgoJKERDPUV4YW1wbGUsREM9 TWljcm9zb2Z0LERDPUNvbSAgaW4gIENOPVVzZXIgTmFtZSxPVT1Vc2VycyxEQz1FeGFtcGxlLERD PU1pY3Jvc29mdCxEQz1Db20pCgkqLwoKCS8qCglbTmV0VXNlckdldEluZm9dCglORVJSX05vdEV4 aXN0R3JvdXBzID0gLTEKCU5FUlJfU3VjY2VzcyA9IDAKCUVSUk9SX0FDQ0VTU19ERU5JRUQgPSA1 CglORVJSX0ludmFsaWRDb21wdXRlciA9IDIzNTEKCU5FUlJfVXNlck5vdEZvdW5kID0gMjIyMQoJ UlBDX1NfU0VSVkVSX1VOQVZBSUxBQkxFID0gMTcyMgoJRVJST1JfVU5FWFBfTkVUX0VSUiA9IDU5 CglFUlJPUl9MT0dPTl9GQUlMVVJFID0gMTMyNgoJKi8KCgkvL2Vsb2coREVCVUc0LCAiW3VzZXJu YW1lID0gJXNdIiwgdXNlcm5hbWUpOwoJLy9lbG9nKERFQlVHNCwgIltkb21haW4gPSAlc10iLCBk b21haW4pOwoKCWludCBmb3VuZCA9IDA7CgojaWZkZWYgV0lOMzIKCglMUEdST1VQX1VTRVJTX0lO Rk9fMCBwQnVmID0gTlVMTDsKCURXT1JEIGR3TGV2ZWwgPSAwOwoJRFdPUkQgZHdQcmVmTWF4TGVu ID0gTUFYX1BSRUZFUlJFRF9MRU5HVEg7CglEV09SRCBkd0VudHJpZXNSZWFkID0gMDsKCURXT1JE IGR3VG90YWxFbnRyaWVzID0gMDsKCU5FVF9BUElfU1RBVFVTIG5TdGF0dXM7CgoJLy8gQ29udmVy dCB1c2VybmFtZSB0byB3Y2hhci4KCXdjaGFyX3QgKldpZGVVc2VyTmFtZTsKCXdjaGFyX3QgKldp ZGVEb21haW47CglXaWRlVXNlck5hbWUgPSBjb252ZXJ0X3RvX3djaGFyKHVzZXJuYW1lKTsKCVdp ZGVEb21haW4gPSBjb252ZXJ0X3RvX3djaGFyKGRvbWFpbik7CgoJLy8gRW51bWVyYXRlIGdyb3Vw IG1lbWJlcnNoaXBzLgoJY2hhciBncm91cFtNQVhQR1BBVEhdID0geyAwIH07CglIZWFwVHVwbGUg cm9sZVR1cDsKCW5TdGF0dXMgPSBOZXRVc2VyR2V0R3JvdXBzKFdpZGVEb21haW4sIFdpZGVVc2Vy TmFtZSwgZHdMZXZlbCwgKExQQllURSopJnBCdWYsIGR3UHJlZk1heExlbiwgJmR3RW50cmllc1Jl YWQsICZkd1RvdGFsRW50cmllcyk7CglpZiAoblN0YXR1cyA9PSBORVJSX1N1Y2Nlc3MpCgl7CgkJ ZWxvZyhERUJVRzQsICJOZXRVc2VyR2V0R3JvdXBzIEVudHJpZXNSZWFkPSVpIFRvdGFsRW50cmll cz0laSIsIGR3RW50cmllc1JlYWQsIGR3VG90YWxFbnRyaWVzKTsKCQkvL2Vsb2coREVCVUc0LCAi R3JvdXBzICVzIGJlbG9uZ3MgdG8gaW4gZG9tYWluICVzIGFyZSA6XG4iLCB1c2VybmFtZSwgZG9t YWluKTsKCQlEV09SRCBpOwoJCWZvciAoaSA9IDA7IGkgPCBkd0VudHJpZXNSZWFkOyBpKyspCgkJ ewoJCQkvL2Vsb2coREVCVUc0LCAiR3JvdXA6ICVscyIsIGNvbnZlcnRfdG9fbXVsdGlieXRlKHBC dWZbaV0uZ3J1aTBfbmFtZSkpOwoJCQlzdHJjcHkoZ3JvdXAsIGNvbnZlcnRfdG9fbXVsdGlieXRl KHBCdWZbaV0uZ3J1aTBfbmFtZSkpOwoJCQlzdHJjYXQoZ3JvdXAsICJAIik7CgkJCXN0cmNhdChn cm91cCwgdXNlcmRvbWFpbik7CgkJCWVsb2coREVCVUc0LCAiR3JvdXA6ICVzIiwgZ3JvdXApOwoJ CQkvLyBDaGVjayBncm91cCBhZ2FpbnN0IHRoZSBsaXN0IG9mIHJvbGVzLgoJCQlyb2xlVHVwID0g U2VhcmNoU3lzQ2FjaGUxKEFVVEhOQU1FLCBQb2ludGVyR2V0RGF0dW0oZ3JvdXApKTsKCQkJaWYg KEhlYXBUdXBsZUlzVmFsaWQocm9sZVR1cCkpCgkJCXsKCQkJCWZvdW5kID0gMTsKCQkJCWJyZWFr OwoJCQl9CgkJfQoJCWlmIChwQnVmICE9IE5VTEwpIE5ldEFwaUJ1ZmZlckZyZWUocEJ1Zik7Cgl9 CgllbHNlCgl7CgkJZWxvZyhFUlJPUiwgIk5ldFVzZXJHZXRHcm91cHMgZmFpbGVkOiAlZCIsIG5T dGF0dXMpOwoJfQoKI2Vsc2UKCS8vIE5vbi1XaW5kb3dzIGNvZGUgZ29lcyBoZXJlLgoKI2VuZGlm CgoJaWYgKGZvdW5kID09IDEpCgkJcmV0dXJuIGdyb3VwOwoJZWxzZQoJCXJldHVybiBOVUxMOwp9 CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpjaGFyKiBTU1BJX0NoZWNrRG9tYWluR3JvdXBN ZW1iZXJzaGlwKGNoYXIqIHN1c2VybmFtZSwgY2hhciogc2RvbWFpbikKewoJY2hhciBkb21haW5b TUFYUEdQQVRIXTsKCXN0cmNweShkb21haW4sIHNkb21haW4pOwoJLy9lbG9nKERFQlVHNCwgIkRv bWFpbjogJXMiLCBkb21haW4pOwoKCWNoYXIgdXNlcm5hbWVbTUFYUEdQQVRIXTsKCXN0cmNweSh1 c2VybmFtZSwgc3VzZXJuYW1lKTsKCS8vZWxvZyhERUJVRzQsICJVc2VybmFtZTogJXMiLCB1c2Vy bmFtZSk7CgoJLy8gQ29uc3RydWN0IHRoZSBTQU0gYWNjb3VudCBuYW1lIChEb21haW5cVXNlck5h bWUpCgljaGFyIFNBTUFjY291bnROYW1lW01BWFBHUEFUSF07CglzdHJjcHkoU0FNQWNjb3VudE5h bWUsIGRvbWFpbik7CglzdHJjYXQoU0FNQWNjb3VudE5hbWUsICJcXCIpOwoJc3RyY2F0KFNBTUFj Y291bnROYW1lLCB1c2VybmFtZSk7CgllbG9nKERFQlVHNCwgIlNBTUFjY291bnROYW1lOiAlcyIs IFNBTUFjY291bnROYW1lKTsKCgljaGFyIFVzZXJEaXN0aW5ndWlzaGVkTmFtZVtNQVhQR1BBVEhd OwoJc3RyY3B5KFVzZXJEaXN0aW5ndWlzaGVkTmFtZSwgU1NQSV9HZXRVc2VyRGlzdGluZ3Vpc2hl ZE5hbWUoU0FNQWNjb3VudE5hbWUpKTsKCWVsb2coREVCVUc0LCAiVXNlckRpc3Rpbmd1aXNoZWRO YW1lOiAlcyIsIFVzZXJEaXN0aW5ndWlzaGVkTmFtZSk7CgoJLy8gT2J0YWluIHRoZSBkb21haW4g bmFtZSBmcm9tIHRoZSB1c2VyIGRpc3Rpbmd1aXNoZWQgbmFtZSAoQ049VXNlciBOYW1lLE9VPVVz ZXJzLERDPUV4YW1wbGUsREM9TWljcm9zb2Z0LERDPUNvbSkKCS8vIChFeGFtcGxlLk1pY3Jvc29m dC5Db20gIGZyb20gIENOPVVzZXIgTmFtZSxPVT1Vc2VycyxEQz1FeGFtcGxlLERDPU1pY3Jvc29m dCxEQz1Db20pCgljaGFyIEZRRE5bTUFYUEdQQVRIXTsKCWNoYXIgRlFETjFbTUFYUEdQQVRIXTsK CWNoYXIgRlFETjJbTUFYUEdQQVRIXTsKCWNoYXIqIHB0cjsKCWludCBmaW5pc2hlZCA9IDA7Cglp bnQgZkNvdW50ID0gMDsKCWludCBwb3MsIGk7CglzdHJjcHkoRlFETjEsIHN0cmx3cihVc2VyRGlz dGluZ3Vpc2hlZE5hbWUpKTsKCXB0ciA9IHN0cnN0cihGUUROMSwgImRjPSIpOwoJaWYgKHB0ciA9 PSBOVUxMKQoJewoJCWVsb2coRVJST1IsICJFcnJvciAtIFRoZSBkYz0gc3Vic3RyaW5nIHdhcyBu b3QgZm91bmQuIik7CgkJcmV0dXJuIE5VTEw7Cgl9Cglwb3MgPSBwdHIgLSBGUUROMTsKCWludCBz bGVuID0gc3RybGVuKEZRRE4xKTsKCW1lbXNldChGUUROMiwgJ1wwJywgc2l6ZW9mKEZRRE4yKSk7 CglzdHJuY3B5KEZRRE4yLCBGUUROMSArIHBvcywgc2xlbiAtIHBvcyk7CglzdHJjcHkoRlFETjEs IFJlcGxhY2VTdWJzdHJpbmcoRlFETjIsICJkYz0iLCAiIikpOwoJc3RyY3B5KEZRRE4sIFJlcGxh Y2VTdWJzdHJpbmcoRlFETjEsICIsIiwgIi4iKSk7CgllbG9nKERFQlVHNCwgIkZRRE46ICVzIiwg RlFETik7CgoJLy8gR2V0IHRoZSBncm91cHMgd2hpY2ggdGhlIHVzZXIgYmVsb25ncyB0byBhbmQg dHJ5IHRvIG1hdGNoIG9uZSB3aXRoIGEgcm9sZS4KCWNoYXIgZ3JvdXBbTUFYUEdQQVRIXTsKCXN0 cmNweShncm91cCwgU1NQSV9HZXRHcm91cHNGb3JVc2VySW5Eb21haW4odXNlcm5hbWUsIEZRRE4s IGRvbWFpbikpOwoJZWxvZyhERUJVRzQsICJTU1BJX0dldEdyb3Vwc0ZvclVzZXJJbkRvbWFpbiA9 ICVzIiwgZ3JvdXApOwoKCXJldHVybiBncm91cDsKfQoKLy8gRklOSVNIIEBAQEBAQEBAQEBAQEBA QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBACgpzdGF0aWMgaW50CnBnX1NTUElfcmVjdmF1dGgoUG9y dCAqcG9ydCkKewoJaW50CQkJbXR5cGU7CglTdHJpbmdJbmZvRGF0YSBidWY7CglTRUNVUklUWV9T VEFUVVMgcjsKCUNyZWRIYW5kbGUJc3NwaWNyZWQ7CglDdHh0SGFuZGxlICpzc3BpY3R4ID0gTlVM TCwKCQkJCW5ld2N0eDsKCVRpbWVTdGFtcAlleHBpcnk7CglVTE9ORwkJY29udGV4dGF0dHI7CglT ZWNCdWZmZXJEZXNjIGluYnVmOwoJU2VjQnVmZmVyRGVzYyBvdXRidWY7CglTZWNCdWZmZXIJT3V0 QnVmZmVyc1sxXTsKCVNlY0J1ZmZlcglJbkJ1ZmZlcnNbMV07CglIQU5ETEUJCXRva2VuOwoJVE9L RU5fVVNFUiAqdG9rZW51c2VyOwoJRFdPUkQJCXJldGxlbjsKCWNoYXIJCWFjY291bnRuYW1lW01B WFBHUEFUSF07CgljaGFyCQlkb21haW5uYW1lW01BWFBHUEFUSF07CglEV09SRAkJYWNjb3VudG5h bWVzaXplID0gc2l6ZW9mKGFjY291bnRuYW1lKTsKCURXT1JECQlkb21haW5uYW1lc2l6ZSA9IHNp emVvZihkb21haW5uYW1lKTsKCVNJRF9OQU1FX1VTRSBhY2NvdW50bmFtZXVzZTsKCWNoYXIJICAg KmF1dGhuX2lkOwoKCS8qCgkgKiBBY3F1aXJlIGEgaGFuZGxlIHRvIHRoZSBzZXJ2ZXIgY3JlZGVu dGlhbHMuCgkgKi8KCXIgPSBBY3F1aXJlQ3JlZGVudGlhbHNIYW5kbGUoTlVMTCwKCQkJCQkJCQkg Im5lZ290aWF0ZSIsCgkJCQkJCQkJIFNFQ1BLR19DUkVEX0lOQk9VTkQsCgkJCQkJCQkJIE5VTEws CgkJCQkJCQkJIE5VTEwsCgkJCQkJCQkJIE5VTEwsCgkJCQkJCQkJIE5VTEwsCgkJCQkJCQkJICZz c3BpY3JlZCwKCQkJCQkJCQkgJmV4cGlyeSk7CglpZiAociAhPSBTRUNfRV9PSykKCQlwZ19TU1BJ X2Vycm9yKEVSUk9SLCBfKCJjb3VsZCBub3QgYWNxdWlyZSBTU1BJIGNyZWRlbnRpYWxzIiksIHIp OwoKCS8qCgkgKiBMb29wIHRocm91Z2ggU1NQSSBtZXNzYWdlIGV4Y2hhbmdlLiBUaGlzIGV4Y2hh bmdlIGNhbiBjb25zaXN0IG9mCgkgKiBtdWx0aXBsZSBtZXNzYWdlcyBzZW50IGluIGJvdGggZGly ZWN0aW9ucy4gRmlyc3QgbWVzc2FnZSBpcyBhbHdheXMgZnJvbQoJICogdGhlIGNsaWVudC4gQWxs IG1lc3NhZ2VzIGZyb20gY2xpZW50IHRvIHNlcnZlciBhcmUgcGFzc3dvcmQgcGFja2V0cwoJICog KHR5cGUgJ3AnKS4KCSAqLwoJZG8KCXsKCQlwcV9zdGFydG1zZ3JlYWQoKTsKCQltdHlwZSA9IHBx X2dldGJ5dGUoKTsKCQlpZiAobXR5cGUgIT0gJ3AnKQoJCXsKCQkJaWYgKHNzcGljdHggIT0gTlVM TCkKCQkJewoJCQkJRGVsZXRlU2VjdXJpdHlDb250ZXh0KHNzcGljdHgpOwoJCQkJZnJlZShzc3Bp Y3R4KTsKCQkJfQoJCQlGcmVlQ3JlZGVudGlhbHNIYW5kbGUoJnNzcGljcmVkKTsKCgkJCS8qIE9u bHkgbG9nIGVycm9yIGlmIGNsaWVudCBkaWRuJ3QgZGlzY29ubmVjdC4gKi8KCQkJaWYgKG10eXBl ICE9IEVPRikKCQkJCWVyZXBvcnQoRVJST1IsCgkJCQkJCShlcnJjb2RlKEVSUkNPREVfUFJPVE9D T0xfVklPTEFUSU9OKSwKCQkJCQkJIGVycm1zZygiZXhwZWN0ZWQgU1NQSSByZXNwb25zZSwgZ290 IG1lc3NhZ2UgdHlwZSAlZCIsCgkJCQkJCQkJbXR5cGUpKSk7CgkJCXJldHVybiBTVEFUVVNfRVJS T1I7CgkJfQoKCQkvKiBHZXQgdGhlIGFjdHVhbCBTU1BJIHRva2VuICovCgkJaW5pdFN0cmluZ0lu Zm8oJmJ1Zik7CgkJaWYgKHBxX2dldG1lc3NhZ2UoJmJ1ZiwgUEdfTUFYX0FVVEhfVE9LRU5fTEVO R1RIKSkKCQl7CgkJCS8qIEVPRiAtIHBxX2dldG1lc3NhZ2UgYWxyZWFkeSBsb2dnZWQgZXJyb3Ig Ki8KCQkJcGZyZWUoYnVmLmRhdGEpOwoJCQlpZiAoc3NwaWN0eCAhPSBOVUxMKQoJCQl7CgkJCQlE ZWxldGVTZWN1cml0eUNvbnRleHQoc3NwaWN0eCk7CgkJCQlmcmVlKHNzcGljdHgpOwoJCQl9CgkJ CUZyZWVDcmVkZW50aWFsc0hhbmRsZSgmc3NwaWNyZWQpOwoJCQlyZXR1cm4gU1RBVFVTX0VSUk9S OwoJCX0KCgkJLyogTWFwIHRvIFNTUEkgc3R5bGUgYnVmZmVyICovCgkJaW5idWYudWxWZXJzaW9u ID0gU0VDQlVGRkVSX1ZFUlNJT047CgkJaW5idWYuY0J1ZmZlcnMgPSAxOwoJCWluYnVmLnBCdWZm ZXJzID0gSW5CdWZmZXJzOwoJCUluQnVmZmVyc1swXS5wdkJ1ZmZlciA9IGJ1Zi5kYXRhOwoJCUlu QnVmZmVyc1swXS5jYkJ1ZmZlciA9IGJ1Zi5sZW47CgkJSW5CdWZmZXJzWzBdLkJ1ZmZlclR5cGUg PSBTRUNCVUZGRVJfVE9LRU47CgoJCS8qIFByZXBhcmUgb3V0cHV0IGJ1ZmZlciAqLwoJCU91dEJ1 ZmZlcnNbMF0ucHZCdWZmZXIgPSBOVUxMOwoJCU91dEJ1ZmZlcnNbMF0uQnVmZmVyVHlwZSA9IFNF Q0JVRkZFUl9UT0tFTjsKCQlPdXRCdWZmZXJzWzBdLmNiQnVmZmVyID0gMDsKCQlvdXRidWYuY0J1 ZmZlcnMgPSAxOwoJCW91dGJ1Zi5wQnVmZmVycyA9IE91dEJ1ZmZlcnM7CgkJb3V0YnVmLnVsVmVy c2lvbiA9IFNFQ0JVRkZFUl9WRVJTSU9OOwoKCQllbG9nKERFQlVHNCwgInByb2Nlc3NpbmcgcmVj ZWl2ZWQgU1NQSSB0b2tlbiBvZiBsZW5ndGggJXUiLAoJCQkgKHVuc2lnbmVkIGludCkgYnVmLmxl bik7CgoJCXIgPSBBY2NlcHRTZWN1cml0eUNvbnRleHQoJnNzcGljcmVkLAoJCQkJCQkJCSAgc3Nw aWN0eCwKCQkJCQkJCQkgICZpbmJ1ZiwKCQkJCQkJCQkgIEFTQ19SRVFfQUxMT0NBVEVfTUVNT1JZ LAoJCQkJCQkJCSAgU0VDVVJJVFlfTkVUV09SS19EUkVQLAoJCQkJCQkJCSAgJm5ld2N0eCwKCQkJ CQkJCQkgICZvdXRidWYsCgkJCQkJCQkJICAmY29udGV4dGF0dHIsCgkJCQkJCQkJICBOVUxMKTsK CgkJLyogaW5wdXQgYnVmZmVyIG5vIGxvbmdlciB1c2VkICovCgkJcGZyZWUoYnVmLmRhdGEpOwoK CQlpZiAob3V0YnVmLmNCdWZmZXJzID4gMCAmJiBvdXRidWYucEJ1ZmZlcnNbMF0uY2JCdWZmZXIg PiAwKQoJCXsKCQkJLyoKCQkJICogTmVnb3RpYXRpb24gZ2VuZXJhdGVkIGRhdGEgdG8gYmUgc2Vu dCB0byB0aGUgY2xpZW50LgoJCQkgKi8KCQkJZWxvZyhERUJVRzQsICJzZW5kaW5nIFNTUEkgcmVz cG9uc2UgdG9rZW4gb2YgbGVuZ3RoICV1IiwKCQkJCSAodW5zaWduZWQgaW50KSBvdXRidWYucEJ1 ZmZlcnNbMF0uY2JCdWZmZXIpOwoKCQkJcG9ydC0+Z3NzLT5vdXRidWYubGVuZ3RoID0gb3V0YnVm LnBCdWZmZXJzWzBdLmNiQnVmZmVyOwoJCQlwb3J0LT5nc3MtPm91dGJ1Zi52YWx1ZSA9IG91dGJ1 Zi5wQnVmZmVyc1swXS5wdkJ1ZmZlcjsKCgkJCXNlbmRBdXRoUmVxdWVzdChwb3J0LCBBVVRIX1JF UV9HU1NfQ09OVCwKCQkJCQkJCXBvcnQtPmdzcy0+b3V0YnVmLnZhbHVlLCBwb3J0LT5nc3MtPm91 dGJ1Zi5sZW5ndGgpOwoKCQkJRnJlZUNvbnRleHRCdWZmZXIob3V0YnVmLnBCdWZmZXJzWzBdLnB2 QnVmZmVyKTsKCQl9CgoJCWlmIChyICE9IFNFQ19FX09LICYmIHIgIT0gU0VDX0lfQ09OVElOVUVf TkVFREVEKQoJCXsKCQkJaWYgKHNzcGljdHggIT0gTlVMTCkKCQkJewoJCQkJRGVsZXRlU2VjdXJp dHlDb250ZXh0KHNzcGljdHgpOwoJCQkJZnJlZShzc3BpY3R4KTsKCQkJfQoJCQlGcmVlQ3JlZGVu dGlhbHNIYW5kbGUoJnNzcGljcmVkKTsKCQkJcGdfU1NQSV9lcnJvcihFUlJPUiwKCQkJCQkJICBf KCJjb3VsZCBub3QgYWNjZXB0IFNTUEkgc2VjdXJpdHkgY29udGV4dCIpLCByKTsKCQl9CgoJCS8q CgkJICogT3ZlcndyaXRlIHRoZSBjdXJyZW50IGNvbnRleHQgd2l0aCB0aGUgb25lIHdlIGp1c3Qg cmVjZWl2ZWQuIElmCgkJICogc3NwaWN0eCBpcyBOVUxMIGl0IHdhcyB0aGUgZmlyc3QgbG9vcCBh bmQgd2UgbmVlZCB0byBhbGxvY2F0ZSBhCgkJICogYnVmZmVyIGZvciBpdC4gT24gc3Vic2VxdWVu dCBydW5zLCB3ZSBjYW4ganVzdCBvdmVyd3JpdGUgdGhlIGJ1ZmZlcgoJCSAqIGNvbnRlbnRzIHNp bmNlIHRoZSBzaXplIGRvZXMgbm90IGNoYW5nZS4KCQkgKi8KCQlpZiAoc3NwaWN0eCA9PSBOVUxM KQoJCXsKCQkJc3NwaWN0eCA9IG1hbGxvYyhzaXplb2YoQ3R4dEhhbmRsZSkpOwoJCQlpZiAoc3Nw aWN0eCA9PSBOVUxMKQoJCQkJZXJlcG9ydChFUlJPUiwKCQkJCQkJKGVycm1zZygib3V0IG9mIG1l bW9yeSIpKSk7CgkJfQoKCQltZW1jcHkoc3NwaWN0eCwgJm5ld2N0eCwgc2l6ZW9mKEN0eHRIYW5k bGUpKTsKCgkJaWYgKHIgPT0gU0VDX0lfQ09OVElOVUVfTkVFREVEKQoJCQllbG9nKERFQlVHNCwg IlNTUEkgY29udGludWUgbmVlZGVkIik7CgoJfSB3aGlsZSAociA9PSBTRUNfSV9DT05USU5VRV9O RUVERUQpOwoKCgkvKgoJICogUmVsZWFzZSBzZXJ2aWNlIHByaW5jaXBhbCBjcmVkZW50aWFscwoJ ICovCglGcmVlQ3JlZGVudGlhbHNIYW5kbGUoJnNzcGljcmVkKTsKCgoJLyoKCSAqIFNFQ19FX09L IGluZGljYXRlcyB0aGF0IGF1dGhlbnRpY2F0aW9uIGlzIG5vdyBjb21wbGV0ZS4KCSAqCgkgKiBH ZXQgdGhlIG5hbWUgb2YgdGhlIHVzZXIgdGhhdCBhdXRoZW50aWNhdGVkLCBhbmQgY29tcGFyZSBp dCB0byB0aGUgcGcKCSAqIHVzZXJuYW1lIHRoYXQgd2FzIHNwZWNpZmllZCBmb3IgdGhlIGNvbm5l Y3Rpb24uCgkgKi8KCglyID0gUXVlcnlTZWN1cml0eUNvbnRleHRUb2tlbihzc3BpY3R4LCAmdG9r ZW4pOwoJaWYgKHIgIT0gU0VDX0VfT0spCgkJcGdfU1NQSV9lcnJvcihFUlJPUiwKCQkJCQkgIF8o ImNvdWxkIG5vdCBnZXQgdG9rZW4gZnJvbSBTU1BJIHNlY3VyaXR5IGNvbnRleHQiKSwgcik7CgoJ LyoKCSAqIE5vIGxvbmdlciBuZWVkIHRoZSBzZWN1cml0eSBjb250ZXh0LCBldmVyeXRoaW5nIGZy b20gaGVyZSBvbiB1c2VzIHRoZQoJICogdG9rZW4gaW5zdGVhZC4KCSAqLwoJRGVsZXRlU2VjdXJp dHlDb250ZXh0KHNzcGljdHgpOwoJZnJlZShzc3BpY3R4KTsKCglpZiAoIUdldFRva2VuSW5mb3Jt YXRpb24odG9rZW4sIFRva2VuVXNlciwgTlVMTCwgMCwgJnJldGxlbikgJiYgR2V0TGFzdEVycm9y KCkgIT0gMTIyKQoJCWVyZXBvcnQoRVJST1IsCgkJCQkoZXJybXNnX2ludGVybmFsKCJjb3VsZCBu b3QgZ2V0IHRva2VuIGluZm9ybWF0aW9uIGJ1ZmZlciBzaXplOiBlcnJvciBjb2RlICVsdSIsCgkJ CQkJCQkJIEdldExhc3RFcnJvcigpKSkpOwoKCXRva2VudXNlciA9IG1hbGxvYyhyZXRsZW4pOwoJ aWYgKHRva2VudXNlciA9PSBOVUxMKQoJCWVyZXBvcnQoRVJST1IsCgkJCQkoZXJybXNnKCJvdXQg b2YgbWVtb3J5IikpKTsKCglpZiAoIUdldFRva2VuSW5mb3JtYXRpb24odG9rZW4sIFRva2VuVXNl ciwgdG9rZW51c2VyLCByZXRsZW4sICZyZXRsZW4pKQoJCWVyZXBvcnQoRVJST1IsCgkJCQkoZXJy bXNnX2ludGVybmFsKCJjb3VsZCBub3QgZ2V0IHRva2VuIGluZm9ybWF0aW9uOiBlcnJvciBjb2Rl ICVsdSIsCgkJCQkJCQkJIEdldExhc3RFcnJvcigpKSkpOwoKCUNsb3NlSGFuZGxlKHRva2VuKTsK CglpZiAoIUxvb2t1cEFjY291bnRTaWQoTlVMTCwgdG9rZW51c2VyLT5Vc2VyLlNpZCwgYWNjb3Vu dG5hbWUsICZhY2NvdW50bmFtZXNpemUsCgkJCQkJCSAgZG9tYWlubmFtZSwgJmRvbWFpbm5hbWVz aXplLCAmYWNjb3VudG5hbWV1c2UpKQoJCWVyZXBvcnQoRVJST1IsCgkJCQkoZXJybXNnX2ludGVy bmFsKCJjb3VsZCBub3QgbG9vayB1cCBhY2NvdW50IFNJRDogZXJyb3IgY29kZSAlbHUiLAoJCQkJ CQkJCSBHZXRMYXN0RXJyb3IoKSkpKTsKCglmcmVlKHRva2VudXNlcik7CgoJaWYgKCFwb3J0LT5o YmEtPmNvbXBhdF9yZWFsbSkKCXsKCQlpbnQJCQlzdGF0dXMgPSBwZ19TU1BJX21ha2VfdXBuKGFj Y291bnRuYW1lLCBzaXplb2YoYWNjb3VudG5hbWUpLAoJCQkJCQkJCQkJCSAgZG9tYWlubmFtZSwg c2l6ZW9mKGRvbWFpbm5hbWUpLAoJCQkJCQkJCQkJCSAgcG9ydC0+aGJhLT51cG5fdXNlcm5hbWUp OwoKCQlpZiAoc3RhdHVzICE9IFNUQVRVU19PSykKCQkJLyogRXJyb3IgYWxyZWFkeSByZXBvcnRl ZCBmcm9tIHBnX1NTUElfbWFrZV91cG4gKi8KCQkJcmV0dXJuIHN0YXR1czsKCX0KCgkvKgoJICog V2UgaGF2ZSBhbGwgb2YgdGhlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBjb25zdHJ1Y3QgdGhl IGF1dGhlbnRpY2F0ZWQKCSAqIGlkZW50aXR5LiAgU2V0IGl0IG5vdywgcmF0aGVyIHRoYW4gd2Fp dGluZyBmb3IgY2hlY2tfdXNlcm1hcCBiZWxvdywKCSAqIGJlY2F1c2UgYXV0aGVudGljYXRpb24g aGFzIGFscmVhZHkgc3VjY2VlZGVkIGFuZCB3ZSB3YW50IHRoZSBsb2cgZmlsZQoJICogdG8gcmVm bGVjdCB0aGF0LgoJICovCglpZiAocG9ydC0+aGJhLT5jb21wYXRfcmVhbG0pCgl7CgkJLyogU0FN LWNvbXBhdGlibGUgZm9ybWF0LiAqLwoJCWF1dGhuX2lkID0gcHNwcmludGYoIiVzXFwlcyIsIGRv bWFpbm5hbWUsIGFjY291bnRuYW1lKTsKCX0KCWVsc2UKCXsKCQkvKiBLZXJiZXJvcyBwcmluY2lw YWwgZm9ybWF0LiAqLwoJCWF1dGhuX2lkID0gcHNwcmludGYoIiVzQCVzIiwgYWNjb3VudG5hbWUs IGRvbWFpbm5hbWUpOwoJfQoKCS8vIFNUQVJUIEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAKCS8v IEhlcmUgaXMgdGhlIGhvb2sgaW50byBsb29raW5nIHVwIGdyb3VwcyB3aGljaCB0aGUgVVBOIG1h eSBiZWxvbmcgdG8uCgljaGFyKiBhdXRobl9pZDI7CglpbnQgQXV0aEZvdW5kID0gMDsKCUhlYXBU dXBsZSByb2xlVHVwOwoJY2hhciBncm91cFtNQVhQR1BBVEhdOwoJaW50IHBvczsKCWNoYXIqIHB0 cjsKCWNoYXIgbmV3YWNjb3VudG5hbWVbTUFYUEdQQVRIXTsKCWNoYXIgbmV3ZG9tYWlubmFtZVtN QVhQR1BBVEhdOwoJLy8gQ2hlY2sgaWYgdXNlciBleGlzdHMgZmlyc3QgYmVmb3JlIGNoZWNraW5n IGZvciBncm91cHMuCglpZiAocG9ydC0+aGJhLT5jb21wYXRfcmVhbG0pCgl7CgkJYXV0aG5faWQy ID0gcHNwcmludGYoIiVzXFwlcyIsIGRvbWFpbm5hbWUsIGFjY291bnRuYW1lKTsKCQlyb2xlVHVw ID0gU2VhcmNoU3lzQ2FjaGUxKEFVVEhOQU1FLCBQb2ludGVyR2V0RGF0dW0oYXV0aG5faWQyKSk7 CgkJQXV0aEZvdW5kID0gSGVhcFR1cGxlSXNWYWxpZChyb2xlVHVwKTsKCX0KCWVsc2UKCXsKCQlh dXRobl9pZDIgPSBwc3ByaW50ZigiJXNAJXMiLCBhY2NvdW50bmFtZSwgZG9tYWlubmFtZSk7CgkJ cm9sZVR1cCA9IFNlYXJjaFN5c0NhY2hlMShBVVRITkFNRSwgUG9pbnRlckdldERhdHVtKGF1dGhu X2lkMikpOwoJCUF1dGhGb3VuZCA9IEhlYXBUdXBsZUlzVmFsaWQocm9sZVR1cCk7Cgl9CglpZiAo IUF1dGhGb3VuZCkKCXsKCQkvLyBDaGVjayBncm91cCBhZ2FpbnN0IHRoZSBsaXN0IG9mIHJvbGVz LgoJCWVsb2coREVCVUc0LCAiU1RBUlQgU1NQSV9DaGVja0RvbWFpbkdyb3VwTWVtYmVyc2hpcCIp OwoJCW1lbXNldChncm91cCwgJ1wwJywgc2l6ZW9mKGdyb3VwKSk7CgkJc3RyY3B5KGdyb3VwLCBT U1BJX0NoZWNrRG9tYWluR3JvdXBNZW1iZXJzaGlwKGFjY291bnRuYW1lLCBkb21haW5uYW1lKSk7 CgkJcHRyID0gc3Ryc3RyKGdyb3VwLCAiQCIpOwoJCXBvcyA9IHB0ciAtIGdyb3VwOwoJCWludCBz bGVuID0gc3RybGVuKGdyb3VwKTsKCQltZW1zZXQobmV3YWNjb3VudG5hbWUsICdcMCcsIHNpemVv ZihuZXdhY2NvdW50bmFtZSkpOwoJCXN0cm5jcHkobmV3YWNjb3VudG5hbWUsIGdyb3VwLCBwb3Mp OwoJCW1lbXNldChuZXdkb21haW5uYW1lLCAnXDAnLCBzaXplb2YobmV3ZG9tYWlubmFtZSkpOwoJ CXN0cm5jcHkobmV3ZG9tYWlubmFtZSwgZ3JvdXAgKyBwb3MgKyAxLCBzbGVuIC0gcG9zICsgMSk7 CgkJLy9lbG9nKERFQlVHNCwgIm5ld2FjY291bnRuYW1lOiAlcyIsIG5ld2FjY291bnRuYW1lKTsK CQkvL2Vsb2coREVCVUc0LCAibmV3ZG9tYWlubmFtZTogJXMiLCBuZXdkb21haW5uYW1lKTsKCQll bG9nKERFQlVHNCwgIkZJTklTSCBTU1BJX0NoZWNrRG9tYWluR3JvdXBNZW1iZXJzaGlwIik7CgkJ aWYgKHNpemVvZihncm91cCkgPiAwKQoJCXsKCQkJLy8gV2Ugbm93IGZvcmNlIHRoZSB1c2VyIG5h bWUgdG8gYmUgdGhlIGdyb3VwIG5hbWUuCgkJCWVsb2coREVCVUc0LCAiU1NQSV9DaGVja0RvbWFp bkdyb3VwTWVtYmVyc2hpcCBmb3VuZCB2YWxpZCBncm91cDogJXMiLCBncm91cCk7CgkJCXN0cmNw eShhY2NvdW50bmFtZSwgbmV3YWNjb3VudG5hbWUpOwoJCQlzdHJjcHkoZG9tYWlubmFtZSwgbmV3 ZG9tYWlubmFtZSk7CgkJCXN0cmNweShwb3J0LT51c2VyX25hbWUsIGdyb3VwKTsKCQkJYXV0aG5f aWQgPSBwc3ByaW50ZigiJXNAJXMiLCBhY2NvdW50bmFtZSwgZG9tYWlubmFtZSk7CgkJfQoJfQoJ cGZyZWUoYXV0aG5faWQyKTsKCS8vIEZJTklTSCBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBACgoJ c2V0X2F1dGhuX2lkKHBvcnQsIGF1dGhuX2lkKTsKCXBmcmVlKGF1dGhuX2lkKTsKCgkvKgoJICog Q29tcGFyZSByZWFsbS9kb21haW4gaWYgcmVxdWVzdGVkLiBJbiBTU1BJLCBhbHdheXMgY29tcGFy ZSBjYXNlCgkgKiBpbnNlbnNpdGl2ZS4KCSAqLwoJaWYgKHBvcnQtPmhiYS0+a3JiX3JlYWxtICYm IHN0cmxlbihwb3J0LT5oYmEtPmtyYl9yZWFsbSkpCgl7CgkJaWYgKHBnX3N0cmNhc2VjbXAocG9y dC0+aGJhLT5rcmJfcmVhbG0sIGRvbWFpbm5hbWUpICE9IDApCgkJewoJCQllbG9nKERFQlVHMiwK CQkJCSAiU1NQSSBkb21haW4gKCVzKSBhbmQgY29uZmlndXJlZCBkb21haW4gKCVzKSBkb24ndCBt YXRjaCIsCgkJCQkgZG9tYWlubmFtZSwgcG9ydC0+aGJhLT5rcmJfcmVhbG0pOwoKCQkJcmV0dXJu IFNUQVRVU19FUlJPUjsKCQl9Cgl9CgoJLyoKCSAqIFdlIGhhdmUgdGhlIHVzZXJuYW1lICh3aXRo b3V0IGRvbWFpbi9yZWFsbSkgaW4gYWNjb3VudG5hbWUsIGNvbXBhcmUgdG8KCSAqIHRoZSBzdXBw bGllZCB2YWx1ZS4gSW4gU1NQSSwgYWx3YXlzIGNvbXBhcmUgY2FzZSBpbnNlbnNpdGl2ZS4KCSAq CgkgKiBJZiBzZXQgdG8gaW5jbHVkZSByZWFsbSwgYXBwZW5kIGl0IGluIDx1c2VybmFtZT5APHJl YWxtPiBmb3JtYXQuCgkgKi8KCWlmIChwb3J0LT5oYmEtPmluY2x1ZGVfcmVhbG0pCgl7CgkJY2hh cgkgICAqbmFtZWJ1ZjsKCQlpbnQJCQlyZXR2YWw7CgoJCW5hbWVidWYgPSBwc3ByaW50ZigiJXNA JXMiLCBhY2NvdW50bmFtZSwgZG9tYWlubmFtZSk7CgkJcmV0dmFsID0gY2hlY2tfdXNlcm1hcChw b3J0LT5oYmEtPnVzZXJtYXAsIHBvcnQtPnVzZXJfbmFtZSwgbmFtZWJ1ZiwgdHJ1ZSk7CgkJcGZy ZWUobmFtZWJ1Zik7CgkJcmV0dXJuIHJldHZhbDsKCX0KCWVsc2UKCQlyZXR1cm4gY2hlY2tfdXNl cm1hcChwb3J0LT5oYmEtPnVzZXJtYXAsIHBvcnQtPnVzZXJfbmFtZSwgYWNjb3VudG5hbWUsIHRy dWUpOwp9CgovKgogKiBSZXBsYWNlcyB0aGUgZG9tYWlubmFtZSB3aXRoIHRoZSBLZXJiZXJvcyBy ZWFsbSBuYW1lLAogKiBhbmQgb3B0aW9uYWxseSB0aGUgYWNjb3VudG5hbWUgd2l0aCB0aGUgS2Vy YmVyb3MgdXNlciBuYW1lLgogKi8Kc3RhdGljIGludApwZ19TU1BJX21ha2VfdXBuKGNoYXIgKmFj Y291bnRuYW1lLAoJCQkJIHNpemVfdCBhY2NvdW50bmFtZXNpemUsCgkJCQkgY2hhciAqZG9tYWlu bmFtZSwKCQkJCSBzaXplX3QgZG9tYWlubmFtZXNpemUsCgkJCQkgYm9vbCB1cGRhdGVfYWNjb3Vu dG5hbWUpCnsKCWNoYXIJICAgKnNhbW5hbWU7CgljaGFyCSAgICp1cG5hbWUgPSBOVUxMOwoJY2hh cgkgICAqcCA9IE5VTEw7CglVTE9ORwkJdXBuYW1lc2l6ZSA9IDA7CglzaXplX3QJCXVwbmFtZXJl YWxtc2l6ZTsKCUJPT0xFQU4JCXJlczsKCgkvKgoJICogQnVpbGQgU0FNIG5hbWUgKERPTUFJTlx1 c2VyKSwgdGhlbiB0cmFuc2xhdGUgdG8gVVBOCgkgKiAodXNlckBrZXJiZXJvcy5yZWFsbSkuIFRo ZSByZWFsbSBuYW1lIGlzIHJldHVybmVkIGluIGxvd2VyIGNhc2UsIGJ1dAoJICogdGhhdCBpcyBm aW5lIGJlY2F1c2UgaW4gU1NQSSBhdXRoLCBzdHJpbmcgY29tcGFyaXNvbnMgYXJlIGFsd2F5cwoJ ICogY2FzZS1pbnNlbnNpdGl2ZS4KCSAqLwoKCXNhbW5hbWUgPSBwc3ByaW50ZigiJXNcXCVzIiwg ZG9tYWlubmFtZSwgYWNjb3VudG5hbWUpOwoJcmVzID0gVHJhbnNsYXRlTmFtZShzYW1uYW1lLCBO YW1lU2FtQ29tcGF0aWJsZSwgTmFtZVVzZXJQcmluY2lwYWwsCgkJCQkJCU5VTEwsICZ1cG5hbWVz aXplKTsKCglpZiAoKCFyZXMgJiYgR2V0TGFzdEVycm9yKCkgIT0gRVJST1JfSU5TVUZGSUNJRU5U X0JVRkZFUikKCQl8fCB1cG5hbWVzaXplID09IDApCgl7CgkJcGZyZWUoc2FtbmFtZSk7CgkJZXJl cG9ydChMT0csCgkJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfUk9MRV9TUEVDSUZJQ0FUSU9O KSwKCQkJCSBlcnJtc2coImNvdWxkIG5vdCB0cmFuc2xhdGUgbmFtZSIpKSk7CgkJcmV0dXJuIFNU QVRVU19FUlJPUjsKCX0KCgkvKiB1cG5hbWVzaXplIGluY2x1ZGVzIHRoZSB0ZXJtaW5hdGluZyBO VUwuICovCgl1cG5hbWUgPSBwYWxsb2ModXBuYW1lc2l6ZSk7CgoJcmVzID0gVHJhbnNsYXRlTmFt ZShzYW1uYW1lLCBOYW1lU2FtQ29tcGF0aWJsZSwgTmFtZVVzZXJQcmluY2lwYWwsCgkJCQkJCXVw bmFtZSwgJnVwbmFtZXNpemUpOwoKCXBmcmVlKHNhbW5hbWUpOwoJaWYgKHJlcykKCQlwID0gc3Ry Y2hyKHVwbmFtZSwgJ0AnKTsKCglpZiAoIXJlcyB8fCBwID09IE5VTEwpCgl7CgkJcGZyZWUodXBu YW1lKTsKCQllcmVwb3J0KExPRywKCQkJCShlcnJjb2RlKEVSUkNPREVfSU5WQUxJRF9ST0xFX1NQ RUNJRklDQVRJT04pLAoJCQkJIGVycm1zZygiY291bGQgbm90IHRyYW5zbGF0ZSBuYW1lIikpKTsK CQlyZXR1cm4gU1RBVFVTX0VSUk9SOwoJfQoKCS8qIExlbmd0aCBvZiByZWFsbSBuYW1lIGFmdGVy IHRoZSAnQCcsIGluY2x1ZGluZyB0aGUgTlVMLiAqLwoJdXBuYW1lcmVhbG1zaXplID0gdXBuYW1l c2l6ZSAtIChwIC0gdXBuYW1lICsgMSk7CgoJLyogUmVwbGFjZSBkb21haW5uYW1lIHdpdGggcmVh bG0gbmFtZS4gKi8KCWlmICh1cG5hbWVyZWFsbXNpemUgPiBkb21haW5uYW1lc2l6ZSkKCXsKCQlw ZnJlZSh1cG5hbWUpOwoJCWVyZXBvcnQoTE9HLAoJCQkJKGVycmNvZGUoRVJSQ09ERV9JTlZBTElE X1JPTEVfU1BFQ0lGSUNBVElPTiksCgkJCQkgZXJybXNnKCJyZWFsbSBuYW1lIHRvbyBsb25nIikp KTsKCQlyZXR1cm4gU1RBVFVTX0VSUk9SOwoJfQoKCS8qIExlbmd0aCBpcyBub3cgc2FmZS4gKi8K CXN0cmNweShkb21haW5uYW1lLCBwICsgMSk7CgoJLyogUmVwbGFjZSBhY2NvdW50IG5hbWUgYXMg d2VsbCAoaW4gY2FzZSBVUE4gIT0gU0FNKT8gKi8KCWlmICh1cGRhdGVfYWNjb3VudG5hbWUpCgl7 CgkJaWYgKChwIC0gdXBuYW1lICsgMSkgPiBhY2NvdW50bmFtZXNpemUpCgkJewoJCQlwZnJlZSh1 cG5hbWUpOwoJCQllcmVwb3J0KExPRywKCQkJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfUk9M RV9TUEVDSUZJQ0FUSU9OKSwKCQkJCQkgZXJybXNnKCJ0cmFuc2xhdGVkIGFjY291bnQgbmFtZSB0 b28gbG9uZyIpKSk7CgkJCXJldHVybiBTVEFUVVNfRVJST1I7CgkJfQoKCQkqcCA9IDA7CgkJc3Ry Y3B5KGFjY291bnRuYW1lLCB1cG5hbWUpOwoJfQoKCXBmcmVlKHVwbmFtZSk7CglyZXR1cm4gU1RB VFVTX09LOwp9CiNlbmRpZgkJCQkJCQkvKiBFTkFCTEVfU1NQSSAqLwoKCgovKi0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICog SWRlbnQgYXV0aGVudGljYXRpb24gc3lzdGVtCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KCi8qCiAqCVBhcnNlIHRo ZSBzdHJpbmcgIippZGVudF9yZXNwb25zZSIgYXMgYSByZXNwb25zZSBmcm9tIGEgcXVlcnkgdG8g YW4gSWRlbnQKICoJc2VydmVyLiAgSWYgaXQncyBhIG5vcm1hbCByZXNwb25zZSBpbmRpY2F0aW5n IGEgdXNlciBuYW1lLCByZXR1cm4gdHJ1ZQogKglhbmQgc3RvcmUgdGhlIHVzZXIgbmFtZSBhdCAq aWRlbnRfdXNlci4gSWYgaXQncyBhbnl0aGluZyBlbHNlLAogKglyZXR1cm4gZmFsc2UuCiAqLwpz dGF0aWMgYm9vbAppbnRlcnByZXRfaWRlbnRfcmVzcG9uc2UoY29uc3QgY2hhciAqaWRlbnRfcmVz cG9uc2UsCgkJCQkJCSBjaGFyICppZGVudF91c2VyKQp7Cgljb25zdCBjaGFyICpjdXJzb3IgPSBp ZGVudF9yZXNwb25zZTsJLyogQ3Vyc29yIGludG8gKmlkZW50X3Jlc3BvbnNlICovCgoJLyoKCSAq IElkZW50J3MgcmVzcG9uc2UsIGluIHRoZSB0ZWxuZXQgdHJhZGl0aW9uLCBzaG91bGQgZW5kIGlu IGNybGYgKFxyXG4pLgoJICovCglpZiAoc3RybGVuKGlkZW50X3Jlc3BvbnNlKSA8IDIpCgkJcmV0 dXJuIGZhbHNlOwoJZWxzZSBpZiAoaWRlbnRfcmVzcG9uc2Vbc3RybGVuKGlkZW50X3Jlc3BvbnNl KSAtIDJdICE9ICdccicpCgkJcmV0dXJuIGZhbHNlOwoJZWxzZQoJewoJCXdoaWxlICgqY3Vyc29y ICE9ICc6JyAmJiAqY3Vyc29yICE9ICdccicpCgkJCWN1cnNvcisrOwkJCS8qIHNraXAgcG9ydCBm aWVsZCAqLwoKCQlpZiAoKmN1cnNvciAhPSAnOicpCgkJCXJldHVybiBmYWxzZTsKCQllbHNlCgkJ ewoJCQkvKiBXZSdyZSBwb3NpdGlvbmVkIHRvIGNvbG9uIGJlZm9yZSByZXNwb25zZSB0eXBlIGZp ZWxkICovCgkJCWNoYXIJCXJlc3BvbnNlX3R5cGVbODBdOwoJCQlpbnQJCQlpOwkJLyogSW5kZXgg aW50byAqcmVzcG9uc2VfdHlwZSAqLwoKCQkJY3Vyc29yKys7CQkJLyogR28gb3ZlciBjb2xvbiAq LwoJCQl3aGlsZSAocGdfaXNibGFuaygqY3Vyc29yKSkKCQkJCWN1cnNvcisrOwkJLyogc2tpcCBi bGFua3MgKi8KCQkJaSA9IDA7CgkJCXdoaWxlICgqY3Vyc29yICE9ICc6JyAmJiAqY3Vyc29yICE9 ICdccicgJiYgIXBnX2lzYmxhbmsoKmN1cnNvcikgJiYKCQkJCSAgIGkgPCAoaW50KSAoc2l6ZW9m KHJlc3BvbnNlX3R5cGUpIC0gMSkpCgkJCQlyZXNwb25zZV90eXBlW2krK10gPSAqY3Vyc29yKys7 CgkJCXJlc3BvbnNlX3R5cGVbaV0gPSAnXDAnOwoJCQl3aGlsZSAocGdfaXNibGFuaygqY3Vyc29y KSkKCQkJCWN1cnNvcisrOwkJLyogc2tpcCBibGFua3MgKi8KCQkJaWYgKHN0cmNtcChyZXNwb25z ZV90eXBlLCAiVVNFUklEIikgIT0gMCkKCQkJCXJldHVybiBmYWxzZTsKCQkJZWxzZQoJCQl7CgkJ CQkvKgoJCQkJICogSXQncyBhIFVTRVJJRCByZXNwb25zZS4gIEdvb2QuICAiY3Vyc29yIiBzaG91 bGQgYmUgcG9pbnRpbmcKCQkJCSAqIHRvIHRoZSBjb2xvbiB0aGF0IHByZWNlZGVzIHRoZSBvcGVy YXRpbmcgc3lzdGVtIHR5cGUuCgkJCQkgKi8KCQkJCWlmICgqY3Vyc29yICE9ICc6JykKCQkJCQly ZXR1cm4gZmFsc2U7CgkJCQllbHNlCgkJCQl7CgkJCQkJY3Vyc29yKys7CS8qIEdvIG92ZXIgY29s b24gKi8KCQkJCQkvKiBTa2lwIG92ZXIgb3BlcmF0aW5nIHN5c3RlbSBmaWVsZC4gKi8KCQkJCQl3 aGlsZSAoKmN1cnNvciAhPSAnOicgJiYgKmN1cnNvciAhPSAnXHInKQoJCQkJCQljdXJzb3IrKzsK CQkJCQlpZiAoKmN1cnNvciAhPSAnOicpCgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQllbHNlCgkJ CQkJewoJCQkJCQljdXJzb3IrKzsJLyogR28gb3ZlciBjb2xvbiAqLwoJCQkJCQl3aGlsZSAocGdf aXNibGFuaygqY3Vyc29yKSkKCQkJCQkJCWN1cnNvcisrOwkvKiBza2lwIGJsYW5rcyAqLwoJCQkJ CQkvKiBSZXN0IG9mIGxpbmUgaXMgdXNlciBuYW1lLiAgQ29weSBpdCBvdmVyLiAqLwoJCQkJCQlp ID0gMDsKCQkJCQkJd2hpbGUgKCpjdXJzb3IgIT0gJ1xyJyAmJiBpIDwgSURFTlRfVVNFUk5BTUVf TUFYKQoJCQkJCQkJaWRlbnRfdXNlcltpKytdID0gKmN1cnNvcisrOwoJCQkJCQlpZGVudF91c2Vy W2ldID0gJ1wwJzsKCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQp9 CgoKLyoKICoJVGFsayB0byB0aGUgaWRlbnQgc2VydmVyIG9uICJyZW1vdGVfYWRkciIgYW5kIGZp bmQgb3V0IHdobwogKglvd25zIHRoZSB0Y3AgY29ubmVjdGlvbiB0byAibG9jYWxfYWRkciIKICoJ SWYgdGhlIHVzZXJuYW1lIGlzIHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQsIGNoZWNrIHRoZSB1c2Vy bWFwLgogKgogKglYWFg6IFVzaW5nIFdhaXRMYXRjaE9yU29ja2V0KCkgYW5kIGRvaW5nIGEgQ0hF Q0tfRk9SX0lOVEVSUlVQVFMoKSBpZiB0aGUKICoJbGF0Y2ggd2FzIHNldCB3b3VsZCBpbXByb3Zl IHRoZSByZXNwb25zaXZlbmVzcyB0byB0aW1lb3V0cy9jYW5jZWxsYXRpb25zLgogKi8Kc3RhdGlj IGludAppZGVudF9pbmV0KGhiYVBvcnQgKnBvcnQpCnsKCWNvbnN0IFNvY2tBZGRyIHJlbW90ZV9h ZGRyID0gcG9ydC0+cmFkZHI7Cgljb25zdCBTb2NrQWRkciBsb2NhbF9hZGRyID0gcG9ydC0+bGFk ZHI7CgljaGFyCQlpZGVudF91c2VyW0lERU5UX1VTRVJOQU1FX01BWCArIDFdOwoJcGdzb2NrZXQJ c29ja19mZCA9IFBHSU5WQUxJRF9TT0NLRVQ7IC8qIGZvciB0YWxraW5nIHRvIElkZW50IHNlcnZl ciAqLwoJaW50CQkJcmM7CQkJCS8qIFJldHVybiBjb2RlIGZyb20gYSBsb2NhbGx5IGNhbGxlZCBm dW5jdGlvbiAqLwoJYm9vbAkJaWRlbnRfcmV0dXJuOwoJY2hhcgkJcmVtb3RlX2FkZHJfc1tOSV9N QVhIT1NUXTsKCWNoYXIJCXJlbW90ZV9wb3J0W05JX01BWFNFUlZdOwoJY2hhcgkJbG9jYWxfYWRk cl9zW05JX01BWEhPU1RdOwoJY2hhcgkJbG9jYWxfcG9ydFtOSV9NQVhTRVJWXTsKCWNoYXIJCWlk ZW50X3BvcnRbTklfTUFYU0VSVl07CgljaGFyCQlpZGVudF9xdWVyeVs4MF07CgljaGFyCQlpZGVu dF9yZXNwb25zZVs4MCArIElERU5UX1VTRVJOQU1FX01BWF07CglzdHJ1Y3QgYWRkcmluZm8gKmlk ZW50X3NlcnYgPSBOVUxMLAoJCQkgICAqbGEgPSBOVUxMLAoJCQkJaGludHM7CgoJLyoKCSAqIE1p Z2h0IGxvb2sgYSBsaXR0bGUgd2VpcmQgdG8gZmlyc3QgY29udmVydCBpdCB0byB0ZXh0IGFuZCB0 aGVuIGJhY2sgdG8KCSAqIHNvY2thZGRyLCBidXQgaXQncyBwcm90b2NvbCBpbmRlcGVuZGVudC4K CSAqLwoJcGdfZ2V0bmFtZWluZm9fYWxsKCZyZW1vdGVfYWRkci5hZGRyLCByZW1vdGVfYWRkci5z YWxlbiwKCQkJCQkgICByZW1vdGVfYWRkcl9zLCBzaXplb2YocmVtb3RlX2FkZHJfcyksCgkJCQkJ ICAgcmVtb3RlX3BvcnQsIHNpemVvZihyZW1vdGVfcG9ydCksCgkJCQkJICAgTklfTlVNRVJJQ0hP U1QgfCBOSV9OVU1FUklDU0VSVik7CglwZ19nZXRuYW1laW5mb19hbGwoJmxvY2FsX2FkZHIuYWRk ciwgbG9jYWxfYWRkci5zYWxlbiwKCQkJCQkgICBsb2NhbF9hZGRyX3MsIHNpemVvZihsb2NhbF9h ZGRyX3MpLAoJCQkJCSAgIGxvY2FsX3BvcnQsIHNpemVvZihsb2NhbF9wb3J0KSwKCQkJCQkgICBO SV9OVU1FUklDSE9TVCB8IE5JX05VTUVSSUNTRVJWKTsKCglzbnByaW50ZihpZGVudF9wb3J0LCBz aXplb2YoaWRlbnRfcG9ydCksICIlZCIsIElERU5UX1BPUlQpOwoJaGludHMuYWlfZmxhZ3MgPSBB SV9OVU1FUklDSE9TVDsKCWhpbnRzLmFpX2ZhbWlseSA9IHJlbW90ZV9hZGRyLmFkZHIuc3NfZmFt aWx5OwoJaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKCWhpbnRzLmFpX3Byb3RvY29s ID0gMDsKCWhpbnRzLmFpX2FkZHJsZW4gPSAwOwoJaGludHMuYWlfY2Fub25uYW1lID0gTlVMTDsK CWhpbnRzLmFpX2FkZHIgPSBOVUxMOwoJaGludHMuYWlfbmV4dCA9IE5VTEw7CglyYyA9IHBnX2dl dGFkZHJpbmZvX2FsbChyZW1vdGVfYWRkcl9zLCBpZGVudF9wb3J0LCAmaGludHMsICZpZGVudF9z ZXJ2KTsKCWlmIChyYyB8fCAhaWRlbnRfc2VydikKCXsKCQkvKiB3ZSBkb24ndCBleHBlY3QgdGhp cyB0byBoYXBwZW4gKi8KCQlpZGVudF9yZXR1cm4gPSBmYWxzZTsKCQlnb3RvIGlkZW50X2luZXRf ZG9uZTsKCX0KCgloaW50cy5haV9mbGFncyA9IEFJX05VTUVSSUNIT1NUOwoJaGludHMuYWlfZmFt aWx5ID0gbG9jYWxfYWRkci5hZGRyLnNzX2ZhbWlseTsKCWhpbnRzLmFpX3NvY2t0eXBlID0gU09D S19TVFJFQU07CgloaW50cy5haV9wcm90b2NvbCA9IDA7CgloaW50cy5haV9hZGRybGVuID0gMDsK CWhpbnRzLmFpX2Nhbm9ubmFtZSA9IE5VTEw7CgloaW50cy5haV9hZGRyID0gTlVMTDsKCWhpbnRz LmFpX25leHQgPSBOVUxMOwoJcmMgPSBwZ19nZXRhZGRyaW5mb19hbGwobG9jYWxfYWRkcl9zLCBO VUxMLCAmaGludHMsICZsYSk7CglpZiAocmMgfHwgIWxhKQoJewoJCS8qIHdlIGRvbid0IGV4cGVj dCB0aGlzIHRvIGhhcHBlbiAqLwoJCWlkZW50X3JldHVybiA9IGZhbHNlOwoJCWdvdG8gaWRlbnRf aW5ldF9kb25lOwoJfQoKCXNvY2tfZmQgPSBzb2NrZXQoaWRlbnRfc2Vydi0+YWlfZmFtaWx5LCBp ZGVudF9zZXJ2LT5haV9zb2NrdHlwZSwKCQkJCQkgaWRlbnRfc2Vydi0+YWlfcHJvdG9jb2wpOwoJ aWYgKHNvY2tfZmQgPT0gUEdJTlZBTElEX1NPQ0tFVCkKCXsKCQllcmVwb3J0KExPRywKCQkJCShl cnJjb2RlX2Zvcl9zb2NrZXRfYWNjZXNzKCksCgkJCQkgZXJybXNnKCJjb3VsZCBub3QgY3JlYXRl IHNvY2tldCBmb3IgSWRlbnQgY29ubmVjdGlvbjogJW0iKSkpOwoJCWlkZW50X3JldHVybiA9IGZh bHNlOwoJCWdvdG8gaWRlbnRfaW5ldF9kb25lOwoJfQoKCS8qCgkgKiBCaW5kIHRvIHRoZSBhZGRy ZXNzIHdoaWNoIHRoZSBjbGllbnQgb3JpZ2luYWxseSBjb250YWN0ZWQsIG90aGVyd2lzZQoJICog dGhlIGlkZW50IHNlcnZlciB3b24ndCBiZSBhYmxlIHRvIG1hdGNoIHVwIHRoZSByaWdodCBjb25u ZWN0aW9uLiBUaGlzCgkgKiBpcyBuZWNlc3NhcnkgaWYgdGhlIFBvc3RncmVTUUwgc2VydmVyIGlz IHJ1bm5pbmcgb24gYW4gSVAgYWxpYXMuCgkgKi8KCXJjID0gYmluZChzb2NrX2ZkLCBsYS0+YWlf YWRkciwgbGEtPmFpX2FkZHJsZW4pOwoJaWYgKHJjICE9IDApCgl7CgkJZXJlcG9ydChMT0csCgkJ CQkoZXJyY29kZV9mb3Jfc29ja2V0X2FjY2VzcygpLAoJCQkJIGVycm1zZygiY291bGQgbm90IGJp bmQgdG8gbG9jYWwgYWRkcmVzcyBcIiVzXCI6ICVtIiwKCQkJCQkJbG9jYWxfYWRkcl9zKSkpOwoJ CWlkZW50X3JldHVybiA9IGZhbHNlOwoJCWdvdG8gaWRlbnRfaW5ldF9kb25lOwoJfQoKCXJjID0g Y29ubmVjdChzb2NrX2ZkLCBpZGVudF9zZXJ2LT5haV9hZGRyLAoJCQkJIGlkZW50X3NlcnYtPmFp X2FkZHJsZW4pOwoJaWYgKHJjICE9IDApCgl7CgkJZXJlcG9ydChMT0csCgkJCQkoZXJyY29kZV9m b3Jfc29ja2V0X2FjY2VzcygpLAoJCQkJIGVycm1zZygiY291bGQgbm90IGNvbm5lY3QgdG8gSWRl bnQgc2VydmVyIGF0IGFkZHJlc3MgXCIlc1wiLCBwb3J0ICVzOiAlbSIsCgkJCQkJCXJlbW90ZV9h ZGRyX3MsIGlkZW50X3BvcnQpKSk7CgkJaWRlbnRfcmV0dXJuID0gZmFsc2U7CgkJZ290byBpZGVu dF9pbmV0X2RvbmU7Cgl9CgoJLyogVGhlIHF1ZXJ5IHdlIHNlbmQgdG8gdGhlIElkZW50IHNlcnZl ciAqLwoJc25wcmludGYoaWRlbnRfcXVlcnksIHNpemVvZihpZGVudF9xdWVyeSksICIlcywlc1xy XG4iLAoJCQkgcmVtb3RlX3BvcnQsIGxvY2FsX3BvcnQpOwoKCS8qIGxvb3AgaW4gY2FzZSBzZW5k IGlzIGludGVycnVwdGVkICovCglkbwoJewoJCUNIRUNLX0ZPUl9JTlRFUlJVUFRTKCk7CgoJCXJj ID0gc2VuZChzb2NrX2ZkLCBpZGVudF9xdWVyeSwgc3RybGVuKGlkZW50X3F1ZXJ5KSwgMCk7Cgl9 IHdoaWxlIChyYyA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOwoKCWlmIChyYyA8IDApCgl7CgkJZXJl cG9ydChMT0csCgkJCQkoZXJyY29kZV9mb3Jfc29ja2V0X2FjY2VzcygpLAoJCQkJIGVycm1zZygi Y291bGQgbm90IHNlbmQgcXVlcnkgdG8gSWRlbnQgc2VydmVyIGF0IGFkZHJlc3MgXCIlc1wiLCBw b3J0ICVzOiAlbSIsCgkJCQkJCXJlbW90ZV9hZGRyX3MsIGlkZW50X3BvcnQpKSk7CgkJaWRlbnRf cmV0dXJuID0gZmFsc2U7CgkJZ290byBpZGVudF9pbmV0X2RvbmU7Cgl9CgoJZG8KCXsKCQlDSEVD S19GT1JfSU5URVJSVVBUUygpOwoKCQlyYyA9IHJlY3Yoc29ja19mZCwgaWRlbnRfcmVzcG9uc2Us IHNpemVvZihpZGVudF9yZXNwb25zZSkgLSAxLCAwKTsKCX0gd2hpbGUgKHJjIDwgMCAmJiBlcnJu byA9PSBFSU5UUik7CgoJaWYgKHJjIDwgMCkKCXsKCQllcmVwb3J0KExPRywKCQkJCShlcnJjb2Rl X2Zvcl9zb2NrZXRfYWNjZXNzKCksCgkJCQkgZXJybXNnKCJjb3VsZCBub3QgcmVjZWl2ZSByZXNw b25zZSBmcm9tIElkZW50IHNlcnZlciBhdCBhZGRyZXNzIFwiJXNcIiwgcG9ydCAlczogJW0iLAoJ CQkJCQlyZW1vdGVfYWRkcl9zLCBpZGVudF9wb3J0KSkpOwoJCWlkZW50X3JldHVybiA9IGZhbHNl OwoJCWdvdG8gaWRlbnRfaW5ldF9kb25lOwoJfQoKCWlkZW50X3Jlc3BvbnNlW3JjXSA9ICdcMCc7 CglpZGVudF9yZXR1cm4gPSBpbnRlcnByZXRfaWRlbnRfcmVzcG9uc2UoaWRlbnRfcmVzcG9uc2Us IGlkZW50X3VzZXIpOwoJaWYgKCFpZGVudF9yZXR1cm4pCgkJZXJlcG9ydChMT0csCgkJCQkoZXJy bXNnKCJpbnZhbGlkbHkgZm9ybWF0dGVkIHJlc3BvbnNlIGZyb20gSWRlbnQgc2VydmVyOiBcIiVz XCIiLAoJCQkJCQlpZGVudF9yZXNwb25zZSkpKTsKCmlkZW50X2luZXRfZG9uZToKCWlmIChzb2Nr X2ZkICE9IFBHSU5WQUxJRF9TT0NLRVQpCgkJY2xvc2Vzb2NrZXQoc29ja19mZCk7CglpZiAoaWRl bnRfc2VydikKCQlwZ19mcmVlYWRkcmluZm9fYWxsKHJlbW90ZV9hZGRyLmFkZHIuc3NfZmFtaWx5 LCBpZGVudF9zZXJ2KTsKCWlmIChsYSkKCQlwZ19mcmVlYWRkcmluZm9fYWxsKGxvY2FsX2FkZHIu YWRkci5zc19mYW1pbHksIGxhKTsKCglpZiAoaWRlbnRfcmV0dXJuKQoJewoJCS8qCgkJICogU3Vj Y2VzcyEgIFN0b3JlIHRoZSBpZGVudGl0eSwgdGhlbiBjaGVjayB0aGUgdXNlcm1hcC4gTm90ZSB0 aGF0CgkJICogc2V0dGluZyB0aGUgYXV0aGVudGljYXRlZCBpZGVudGl0eSBpcyBkb25lIGJlZm9y ZSBjaGVja2luZyB0aGUKCQkgKiB1c2VybWFwLCBiZWNhdXNlIGF0IHRoaXMgcG9pbnQgYXV0aGVu dGljYXRpb24gaGFzIHN1Y2NlZWRlZC4KCQkgKi8KCQlzZXRfYXV0aG5faWQocG9ydCwgaWRlbnRf dXNlcik7CgkJcmV0dXJuIGNoZWNrX3VzZXJtYXAocG9ydC0+aGJhLT51c2VybWFwLCBwb3J0LT51 c2VyX25hbWUsIGlkZW50X3VzZXIsIGZhbHNlKTsKCX0KCXJldHVybiBTVEFUVVNfRVJST1I7Cn0K CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KICogUGVlciBhdXRoZW50aWNhdGlvbiBzeXN0ZW0KICotLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoK LyoKICoJQXNrIGtlcm5lbCBhYm91dCB0aGUgY3JlZGVudGlhbHMgb2YgdGhlIGNvbm5lY3Rpbmcg cHJvY2VzcywKICoJZGV0ZXJtaW5lIHRoZSBzeW1ib2xpYyBuYW1lIG9mIHRoZSBjb3JyZXNwb25k aW5nIHVzZXIsIGFuZCBjaGVjawogKglpZiB2YWxpZCBwZXIgdGhlIHVzZXJtYXAuCiAqCiAqCUlm ZiBhdXRob3JpemVkLCByZXR1cm4gU1RBVFVTX09LLCBvdGhlcndpc2UgcmV0dXJuIFNUQVRVU19F UlJPUi4KICovCnN0YXRpYyBpbnQKYXV0aF9wZWVyKGhiYVBvcnQgKnBvcnQpCnsKCXVpZF90CQl1 aWQ7CglnaWRfdAkJZ2lkOwojaWZuZGVmIFdJTjMyCglzdHJ1Y3QgcGFzc3dkICpwdzsKCWludAkJ CXJldDsKI2VuZGlmCgoJaWYgKGdldHBlZXJlaWQocG9ydC0+c29jaywgJnVpZCwgJmdpZCkgIT0g MCkKCXsKCQkvKiBQcm92aWRlIHNwZWNpYWwgZXJyb3IgbWVzc2FnZSBpZiBnZXRwZWVyZWlkIGlz IGEgc3R1YiAqLwoJCWlmIChlcnJubyA9PSBFTk9TWVMpCgkJCWVyZXBvcnQoTE9HLAoJCQkJCShl cnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKCQkJCQkgZXJybXNnKCJwZWVy IGF1dGhlbnRpY2F0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSIpKSk7CgkJ ZWxzZQoJCQllcmVwb3J0KExPRywKCQkJCQkoZXJyY29kZV9mb3Jfc29ja2V0X2FjY2VzcygpLAoJ CQkJCSBlcnJtc2coImNvdWxkIG5vdCBnZXQgcGVlciBjcmVkZW50aWFsczogJW0iKSkpOwoJCXJl dHVybiBTVEFUVVNfRVJST1I7Cgl9CgojaWZuZGVmIFdJTjMyCgllcnJubyA9IDA7CQkJCQkvKiBj bGVhciBlcnJubyBiZWZvcmUgY2FsbCAqLwoJcHcgPSBnZXRwd3VpZCh1aWQpOwoJaWYgKCFwdykK CXsKCQlpbnQJCQlzYXZlX2Vycm5vID0gZXJybm87CgoJCWVyZXBvcnQoTE9HLAoJCQkJKGVycm1z ZygiY291bGQgbm90IGxvb2sgdXAgbG9jYWwgdXNlciBJRCAlbGQ6ICVzIiwKCQkJCQkJKGxvbmcp IHVpZCwKCQkJCQkJc2F2ZV9lcnJubyA/IHN0cmVycm9yKHNhdmVfZXJybm8pIDogXygidXNlciBk b2VzIG5vdCBleGlzdCIpKSkpOwoJCXJldHVybiBTVEFUVVNfRVJST1I7Cgl9CgoJLyoKCSAqIE1h a2UgYSBjb3B5IG9mIHN0YXRpYyBnZXRwdyooKSByZXN1bHQgYXJlYTsgdGhpcyBpcyBvdXIgYXV0 aGVudGljYXRlZAoJICogaWRlbnRpdHkuICBTZXQgaXQgYmVmb3JlIGNhbGxpbmcgY2hlY2tfdXNl cm1hcCwgYmVjYXVzZSBhdXRoZW50aWNhdGlvbgoJICogaGFzIGFscmVhZHkgc3VjY2VlZGVkIGFu ZCB3ZSB3YW50IHRoZSBsb2cgZmlsZSB0byByZWZsZWN0IHRoYXQuCgkgKi8KCXNldF9hdXRobl9p ZChwb3J0LCBwdy0+cHdfbmFtZSk7CgoJcmV0ID0gY2hlY2tfdXNlcm1hcChwb3J0LT5oYmEtPnVz ZXJtYXAsIHBvcnQtPnVzZXJfbmFtZSwKCQkJCQkJTXlDbGllbnRDb25uZWN0aW9uSW5mby5hdXRo bl9pZCwgZmFsc2UpOwoKCXJldHVybiByZXQ7CiNlbHNlCgkvKiBzaG91bGQgaGF2ZSBmYWlsZWQg d2l0aCBFTk9TWVMgYWJvdmUgKi8KCUFzc2VydChmYWxzZSk7CglyZXR1cm4gU1RBVFVTX0VSUk9S OwojZW5kaWYKfQoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBQQU0gYXV0aGVudGljYXRpb24gc3lzdGVtCiAqLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQogKi8KI2lmZGVmIFVTRV9QQU0KCi8qCiAqIFBBTSBjb252ZXJzYXRpb24gZnVuY3Rpb24K ICovCgpzdGF0aWMgaW50CnBhbV9wYXNzd2RfY29udl9wcm9jKGludCBudW1fbXNnLCBjb25zdCBz dHJ1Y3QgcGFtX21lc3NhZ2UgKiptc2csCgkJCQkJIHN0cnVjdCBwYW1fcmVzcG9uc2UgKipyZXNw LCB2b2lkICphcHBkYXRhX3B0cikKewoJY29uc3QgY2hhciAqcGFzc3dkOwoJc3RydWN0IHBhbV9y ZXNwb25zZSAqcmVwbHk7CglpbnQJCQlpOwoKCWlmIChhcHBkYXRhX3B0cikKCQlwYXNzd2QgPSAo Y2hhciAqKSBhcHBkYXRhX3B0cjsKCWVsc2UKCXsKCQkvKgoJCSAqIFdvcmthcm91bmQgZm9yIFNv bGFyaXMgMi42IHdoZXJlIHRoZSBQQU0gbGlicmFyeSBpcyBicm9rZW4gYW5kIGRvZXMKCQkgKiBu b3QgcGFzcyBhcHBkYXRhX3B0ciB0byB0aGUgY29udmVyc2F0aW9uIHJvdXRpbmUKCQkgKi8KCQlw YXNzd2QgPSBwYW1fcGFzc3dkOwoJfQoKCSpyZXNwID0gTlVMTDsJCQkJLyogaW4gY2FzZSBvZiBl cnJvciBleGl0ICovCgoJaWYgKG51bV9tc2cgPD0gMCB8fCBudW1fbXNnID4gUEFNX01BWF9OVU1f TVNHKQoJCXJldHVybiBQQU1fQ09OVl9FUlI7CgoJLyoKCSAqIEV4cGxpY2l0bHkgbm90IHVzaW5n IHBhbGxvYyBoZXJlIC0gUEFNIHdpbGwgZnJlZSB0aGlzIG1lbW9yeSBpbgoJICogcGFtX2VuZCgp CgkgKi8KCWlmICgocmVwbHkgPSBjYWxsb2MobnVtX21zZywgc2l6ZW9mKHN0cnVjdCBwYW1fcmVz cG9uc2UpKSkgPT0gTlVMTCkKCXsKCQllcmVwb3J0KExPRywKCQkJCShlcnJjb2RlKEVSUkNPREVf T1VUX09GX01FTU9SWSksCgkJCQkgZXJybXNnKCJvdXQgb2YgbWVtb3J5IikpKTsKCQlyZXR1cm4g UEFNX0NPTlZfRVJSOwoJfQoKCWZvciAoaSA9IDA7IGkgPCBudW1fbXNnOyBpKyspCgl7CgkJc3dp dGNoIChtc2dbaV0tPm1zZ19zdHlsZSkKCQl7CgkJCWNhc2UgUEFNX1BST01QVF9FQ0hPX09GRjoK CQkJCWlmIChzdHJsZW4ocGFzc3dkKSA9PSAwKQoJCQkJewoJCQkJCS8qCgkJCQkJICogUGFzc3dv cmQgd2Fzbid0IHBhc3NlZCB0byBQQU0gdGhlIGZpcnN0IHRpbWUgYXJvdW5kIC0KCQkJCQkgKiBs ZXQncyBnbyBhc2sgdGhlIGNsaWVudCB0byBzZW5kIGEgcGFzc3dvcmQsIHdoaWNoIHdlCgkJCQkJ ICogdGhlbiBzdHVmZiBpbnRvIFBBTS4KCQkJCQkgKi8KCQkJCQlzZW5kQXV0aFJlcXVlc3QocGFt X3BvcnRfY2x1ZGdlLCBBVVRIX1JFUV9QQVNTV09SRCwgTlVMTCwgMCk7CgkJCQkJcGFzc3dkID0g cmVjdl9wYXNzd29yZF9wYWNrZXQocGFtX3BvcnRfY2x1ZGdlKTsKCQkJCQlpZiAocGFzc3dkID09 IE5VTEwpCgkJCQkJewoJCQkJCQkvKgoJCQkJCQkgKiBDbGllbnQgZGlkbid0IHdhbnQgdG8gc2Vu ZCBwYXNzd29yZC4gIFdlCgkJCQkJCSAqIGludGVudGlvbmFsbHkgZG8gbm90IGxvZyBhbnl0aGlu ZyBhYm91dCB0aGlzLAoJCQkJCQkgKiBlaXRoZXIgaGVyZSBvciBhdCBoaWdoZXIgbGV2ZWxzLgoJ CQkJCQkgKi8KCQkJCQkJcGFtX25vX3Bhc3N3b3JkID0gdHJ1ZTsKCQkJCQkJZ290byBmYWlsOwoJ CQkJCX0KCQkJCX0KCQkJCWlmICgocmVwbHlbaV0ucmVzcCA9IHN0cmR1cChwYXNzd2QpKSA9PSBO VUxMKQoJCQkJCWdvdG8gZmFpbDsKCQkJCXJlcGx5W2ldLnJlc3BfcmV0Y29kZSA9IFBBTV9TVUND RVNTOwoJCQkJYnJlYWs7CgkJCWNhc2UgUEFNX0VSUk9SX01TRzoKCQkJCWVyZXBvcnQoTE9HLAoJ CQkJCQkoZXJybXNnKCJlcnJvciBmcm9tIHVuZGVybHlpbmcgUEFNIGxheWVyOiAlcyIsCgkJCQkJ CQkJbXNnW2ldLT5tc2cpKSk7CgkJCQkvKiBGQUxMIFRIUk9VR0ggKi8KCQkJY2FzZSBQQU1fVEVY VF9JTkZPOgoJCQkJLyogd2UgZG9uJ3QgYm90aGVyIHRvIGxvZyBURVhUX0lORk8gbWVzc2FnZXMg Ki8KCQkJCWlmICgocmVwbHlbaV0ucmVzcCA9IHN0cmR1cCgiIikpID09IE5VTEwpCgkJCQkJZ290 byBmYWlsOwoJCQkJcmVwbHlbaV0ucmVzcF9yZXRjb2RlID0gUEFNX1NVQ0NFU1M7CgkJCQlicmVh azsKCQkJZGVmYXVsdDoKCQkJCWVyZXBvcnQoTE9HLAoJCQkJCQkoZXJybXNnKCJ1bnN1cHBvcnRl ZCBQQU0gY29udmVyc2F0aW9uICVkL1wiJXNcIiIsCgkJCQkJCQkJbXNnW2ldLT5tc2dfc3R5bGUs CgkJCQkJCQkJbXNnW2ldLT5tc2cgPyBtc2dbaV0tPm1zZyA6ICIobm9uZSkiKSkpOwoJCQkJZ290 byBmYWlsOwoJCX0KCX0KCgkqcmVzcCA9IHJlcGx5OwoJcmV0dXJuIFBBTV9TVUNDRVNTOwoKZmFp bDoKCS8qIGZyZWUgdXAgd2hhdGV2ZXIgd2UgYWxsb2NhdGVkICovCglmb3IgKGkgPSAwOyBpIDwg bnVtX21zZzsgaSsrKQoJCWZyZWUocmVwbHlbaV0ucmVzcCk7CglmcmVlKHJlcGx5KTsKCglyZXR1 cm4gUEFNX0NPTlZfRVJSOwp9CgoKLyoKICogQ2hlY2sgYXV0aGVudGljYXRpb24gYWdhaW5zdCBQ QU0uCiAqLwpzdGF0aWMgaW50CkNoZWNrUEFNQXV0aChQb3J0ICpwb3J0LCBjb25zdCBjaGFyICp1 c2VyLCBjb25zdCBjaGFyICpwYXNzd29yZCkKewoJaW50CQkJcmV0dmFsOwoJcGFtX2hhbmRsZV90 ICpwYW1oID0gTlVMTDsKCgkvKgoJICogV2UgY2FuJ3QgZW50aXJlbHkgcmVseSBvbiBQQU0gdG8g cGFzcyB0aHJvdWdoIGFwcGRhdGEgLS0tIGl0IGFwcGVhcnMKCSAqIG5vdCB0byB3b3JrIG9uIGF0 IGxlYXN0IFNvbGFyaXMgMi42LiAgU28gdXNlIHRoZXNlIHVnbHkgc3RhdGljCgkgKiB2YXJpYWJs ZXMgaW5zdGVhZC4KCSAqLwoJcGFtX3Bhc3N3ZCA9IHBhc3N3b3JkOwoJcGFtX3BvcnRfY2x1ZGdl ID0gcG9ydDsKCXBhbV9ub19wYXNzd29yZCA9IGZhbHNlOwoKCS8qCgkgKiBTZXQgdGhlIGFwcGxp Y2F0aW9uIGRhdGEgcG9ydGlvbiBvZiB0aGUgY29udmVyc2F0aW9uIHN0cnVjdC4gIFRoaXMgaXMK CSAqIGxhdGVyIHVzZWQgaW5zaWRlIHRoZSBQQU0gY29udmVyc2F0aW9uIHRvIHBhc3MgdGhlIHBh c3N3b3JkIHRvIHRoZQoJICogYXV0aGVudGljYXRpb24gbW9kdWxlLgoJICovCglwYW1fcGFzc3df Y29udi5hcHBkYXRhX3B0ciA9IHVuY29uc3RpZnkoY2hhciAqLCBwYXNzd29yZCk7CS8qIGZyb20g cGFzc3dvcmQgYWJvdmUsCgkJCQkJCQkJCQkJCQkJCQkgKiBub3QgYWxsb2NhdGVkICovCgoJLyog T3B0aW9uYWxseSwgb25lIGNhbiBzZXQgdGhlIHNlcnZpY2UgbmFtZSBpbiBwZ19oYmEuY29uZiAq LwoJaWYgKHBvcnQtPmhiYS0+cGFtc2VydmljZSAmJiBwb3J0LT5oYmEtPnBhbXNlcnZpY2VbMF0g IT0gJ1wwJykKCQlyZXR2YWwgPSBwYW1fc3RhcnQocG9ydC0+aGJhLT5wYW1zZXJ2aWNlLCAicGdz cWxAIiwKCQkJCQkJICAgJnBhbV9wYXNzd19jb252LCAmcGFtaCk7CgllbHNlCgkJcmV0dmFsID0g cGFtX3N0YXJ0KFBHU1FMX1BBTV9TRVJWSUNFLCAicGdzcWxAIiwKCQkJCQkJICAgJnBhbV9wYXNz d19jb252LCAmcGFtaCk7CgoJaWYgKHJldHZhbCAhPSBQQU1fU1VDQ0VTUykKCXsKCQllcmVwb3J0 KExPRywKCQkJCShlcnJtc2coImNvdWxkIG5vdCBjcmVhdGUgUEFNIGF1dGhlbnRpY2F0b3I6ICVz IiwKCQkJCQkJcGFtX3N0cmVycm9yKHBhbWgsIHJldHZhbCkpKSk7CgkJcGFtX3Bhc3N3ZCA9IE5V TEw7CQkvKiBVbnNldCBwYW1fcGFzc3dkICovCgkJcmV0dXJuIFNUQVRVU19FUlJPUjsKCX0KCgly ZXR2YWwgPSBwYW1fc2V0X2l0ZW0ocGFtaCwgUEFNX1VTRVIsIHVzZXIpOwoKCWlmIChyZXR2YWwg IT0gUEFNX1NVQ0NFU1MpCgl7CgkJZXJlcG9ydChMT0csCgkJCQkoZXJybXNnKCJwYW1fc2V0X2l0 ZW0oUEFNX1VTRVIpIGZhaWxlZDogJXMiLAoJCQkJCQlwYW1fc3RyZXJyb3IocGFtaCwgcmV0dmFs KSkpKTsKCQlwYW1fcGFzc3dkID0gTlVMTDsJCS8qIFVuc2V0IHBhbV9wYXNzd2QgKi8KCQlyZXR1 cm4gU1RBVFVTX0VSUk9SOwoJfQoKCWlmIChwb3J0LT5oYmEtPmNvbm50eXBlICE9IGN0TG9jYWwp Cgl7CgkJY2hhcgkJaG9zdGluZm9bTklfTUFYSE9TVF07CgkJaW50CQkJZmxhZ3M7CgoJCWlmIChw b3J0LT5oYmEtPnBhbV91c2VfaG9zdG5hbWUpCgkJCWZsYWdzID0gMDsKCQllbHNlCgkJCWZsYWdz ID0gTklfTlVNRVJJQ0hPU1QgfCBOSV9OVU1FUklDU0VSVjsKCgkJcmV0dmFsID0gcGdfZ2V0bmFt ZWluZm9fYWxsKCZwb3J0LT5yYWRkci5hZGRyLCBwb3J0LT5yYWRkci5zYWxlbiwKCQkJCQkJCQkJ aG9zdGluZm8sIHNpemVvZihob3N0aW5mbyksIE5VTEwsIDAsCgkJCQkJCQkJCWZsYWdzKTsKCQlp ZiAocmV0dmFsICE9IDApCgkJewoJCQllcmVwb3J0KFdBUk5JTkcsCgkJCQkJKGVycm1zZ19pbnRl cm5hbCgicGdfZ2V0bmFtZWluZm9fYWxsKCkgZmFpbGVkOiAlcyIsCgkJCQkJCQkJCSBnYWlfc3Ry ZXJyb3IocmV0dmFsKSkpKTsKCQkJcmV0dXJuIFNUQVRVU19FUlJPUjsKCQl9CgoJCXJldHZhbCA9 IHBhbV9zZXRfaXRlbShwYW1oLCBQQU1fUkhPU1QsIGhvc3RpbmZvKTsKCgkJaWYgKHJldHZhbCAh PSBQQU1fU1VDQ0VTUykKCQl7CgkJCWVyZXBvcnQoTE9HLAoJCQkJCShlcnJtc2coInBhbV9zZXRf aXRlbShQQU1fUkhPU1QpIGZhaWxlZDogJXMiLAoJCQkJCQkJcGFtX3N0cmVycm9yKHBhbWgsIHJl dHZhbCkpKSk7CgkJCXBhbV9wYXNzd2QgPSBOVUxMOwoJCQlyZXR1cm4gU1RBVFVTX0VSUk9SOwoJ CX0KCX0KCglyZXR2YWwgPSBwYW1fc2V0X2l0ZW0ocGFtaCwgUEFNX0NPTlYsICZwYW1fcGFzc3df Y29udik7CgoJaWYgKHJldHZhbCAhPSBQQU1fU1VDQ0VTUykKCXsKCQllcmVwb3J0KExPRywKCQkJ CShlcnJtc2coInBhbV9zZXRfaXRlbShQQU1fQ09OVikgZmFpbGVkOiAlcyIsCgkJCQkJCXBhbV9z dHJlcnJvcihwYW1oLCByZXR2YWwpKSkpOwoJCXBhbV9wYXNzd2QgPSBOVUxMOwkJLyogVW5zZXQg cGFtX3Bhc3N3ZCAqLwoJCXJldHVybiBTVEFUVVNfRVJST1I7Cgl9CgoJcmV0dmFsID0gcGFtX2F1 dGhlbnRpY2F0ZShwYW1oLCAwKTsKCglpZiAocmV0dmFsICE9IFBBTV9TVUNDRVNTKQoJewoJCS8q IElmIHBhbV9wYXNzd2RfY29udl9wcm9jIHNhdyBFT0YsIGRvbid0IGxvZyBhbnl0aGluZyAqLwoJ CWlmICghcGFtX25vX3Bhc3N3b3JkKQoJCQllcmVwb3J0KExPRywKCQkJCQkoZXJybXNnKCJwYW1f YXV0aGVudGljYXRlIGZhaWxlZDogJXMiLAoJCQkJCQkJcGFtX3N0cmVycm9yKHBhbWgsIHJldHZh bCkpKSk7CgkJcGFtX3Bhc3N3ZCA9IE5VTEw7CQkvKiBVbnNldCBwYW1fcGFzc3dkICovCgkJcmV0 dXJuIHBhbV9ub19wYXNzd29yZCA/IFNUQVRVU19FT0YgOiBTVEFUVVNfRVJST1I7Cgl9CgoJcmV0 dmFsID0gcGFtX2FjY3RfbWdtdChwYW1oLCAwKTsKCglpZiAocmV0dmFsICE9IFBBTV9TVUNDRVNT KQoJewoJCS8qIElmIHBhbV9wYXNzd2RfY29udl9wcm9jIHNhdyBFT0YsIGRvbid0IGxvZyBhbnl0 aGluZyAqLwoJCWlmICghcGFtX25vX3Bhc3N3b3JkKQoJCQllcmVwb3J0KExPRywKCQkJCQkoZXJy bXNnKCJwYW1fYWNjdF9tZ210IGZhaWxlZDogJXMiLAoJCQkJCQkJcGFtX3N0cmVycm9yKHBhbWgs IHJldHZhbCkpKSk7CgkJcGFtX3Bhc3N3ZCA9IE5VTEw7CQkvKiBVbnNldCBwYW1fcGFzc3dkICov CgkJcmV0dXJuIHBhbV9ub19wYXNzd29yZCA/IFNUQVRVU19FT0YgOiBTVEFUVVNfRVJST1I7Cgl9 CgoJcmV0dmFsID0gcGFtX2VuZChwYW1oLCByZXR2YWwpOwoKCWlmIChyZXR2YWwgIT0gUEFNX1NV Q0NFU1MpCgl7CgkJZXJlcG9ydChMT0csCgkJCQkoZXJybXNnKCJjb3VsZCBub3QgcmVsZWFzZSBQ QU0gYXV0aGVudGljYXRvcjogJXMiLAoJCQkJCQlwYW1fc3RyZXJyb3IocGFtaCwgcmV0dmFsKSkp KTsKCX0KCglwYW1fcGFzc3dkID0gTlVMTDsJCQkvKiBVbnNldCBwYW1fcGFzc3dkICovCgoJaWYg KHJldHZhbCA9PSBQQU1fU1VDQ0VTUykKCQlzZXRfYXV0aG5faWQocG9ydCwgdXNlcik7CgoJcmV0 dXJuIChyZXR2YWwgPT0gUEFNX1NVQ0NFU1MgPyBTVEFUVVNfT0sgOiBTVEFUVVNfRVJST1IpOwp9 CiNlbmRpZgkJCQkJCQkvKiBVU0VfUEFNICovCgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIEJTRCBhdXRoZW50aWNh dGlvbiBzeXN0ZW0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwojaWZkZWYgVVNFX0JTRF9BVVRICnN0YXRpYyBpbnQK Q2hlY2tCU0RBdXRoKFBvcnQgKnBvcnQsIGNoYXIgKnVzZXIpCnsKCWNoYXIJICAgKnBhc3N3ZDsK CWludAkJCXJldHZhbDsKCgkvKiBTZW5kIHJlZ3VsYXIgcGFzc3dvcmQgcmVxdWVzdCB0byBjbGll bnQsIGFuZCBnZXQgdGhlIHJlc3BvbnNlICovCglzZW5kQXV0aFJlcXVlc3QocG9ydCwgQVVUSF9S RVFfUEFTU1dPUkQsIE5VTEwsIDApOwoKCXBhc3N3ZCA9IHJlY3ZfcGFzc3dvcmRfcGFja2V0KHBv cnQpOwoJaWYgKHBhc3N3ZCA9PSBOVUxMKQoJCXJldHVybiBTVEFUVVNfRU9GOwoKCS8qCgkgKiBB c2sgdGhlIEJTRCBhdXRoIHN5c3RlbSB0byB2ZXJpZnkgcGFzc3dvcmQuICBOb3RlIHRoYXQgYXV0 aF91c2Vyb2theQoJICogd2lsbCBvdmVyd3JpdGUgdGhlIHBhc3N3b3JkIHN0cmluZyB3aXRoIHpl cm9lcywgYnV0IGl0J3MganVzdCBhCgkgKiB0ZW1wb3Jhcnkgc3RyaW5nIHNvIHdlIGRvbid0IGNh cmUuCgkgKi8KCXJldHZhbCA9IGF1dGhfdXNlcm9rYXkodXNlciwgTlVMTCwgImF1dGgtcG9zdGdy ZXNxbCIsIHBhc3N3ZCk7CgoJcGZyZWUocGFzc3dkKTsKCglpZiAoIXJldHZhbCkKCQlyZXR1cm4g U1RBVFVTX0VSUk9SOwoKCXNldF9hdXRobl9pZChwb3J0LCB1c2VyKTsKCXJldHVybiBTVEFUVVNf T0s7Cn0KI2VuZGlmCQkJCQkJCS8qIFVTRV9CU0RfQVVUSCAqLwoKCi8qLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBMREFQ IGF1dGhlbnRpY2F0aW9uIHN5c3RlbQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCiNpZmRlZiBVU0VfTERBUAoKc3Rh dGljIGludAllcnJkZXRhaWxfZm9yX2xkYXAoTERBUCAqbGRhcCk7CgovKgogKiBJbml0aWFsaXpl IGEgY29ubmVjdGlvbiB0byB0aGUgTERBUCBzZXJ2ZXIsIGluY2x1ZGluZyBzZXR0aW5nIHVwCiAq IFRMUyBpZiByZXF1ZXN0ZWQuCiAqLwpzdGF0aWMgaW50CkluaXRpYWxpemVMREFQQ29ubmVjdGlv bihQb3J0ICpwb3J0LCBMREFQICoqbGRhcCkKewoJY29uc3QgY2hhciAqc2NoZW1lOwoJaW50CQkJ bGRhcHZlcnNpb24gPSBMREFQX1ZFUlNJT04zOwoJaW50CQkJcjsKCglzY2hlbWUgPSBwb3J0LT5o YmEtPmxkYXBzY2hlbWU7CglpZiAoc2NoZW1lID09IE5VTEwpCgkJc2NoZW1lID0gImxkYXAiOwoj aWZkZWYgV0lOMzIKCWlmIChzdHJjbXAoc2NoZW1lLCAibGRhcHMiKSA9PSAwKQoJCSpsZGFwID0g bGRhcF9zc2xpbml0KHBvcnQtPmhiYS0+bGRhcHNlcnZlciwgcG9ydC0+aGJhLT5sZGFwcG9ydCwg MSk7CgllbHNlCgkJKmxkYXAgPSBsZGFwX2luaXQocG9ydC0+aGJhLT5sZGFwc2VydmVyLCBwb3J0 LT5oYmEtPmxkYXBwb3J0KTsKCWlmICghKmxkYXApCgl7CgkJZXJlcG9ydChMT0csCgkJCQkoZXJy bXNnKCJjb3VsZCBub3QgaW5pdGlhbGl6ZSBMREFQOiBlcnJvciBjb2RlICVkIiwKCQkJCQkJKGlu dCkgTGRhcEdldExhc3RFcnJvcigpKSkpOwoKCQlyZXR1cm4gU1RBVFVTX0VSUk9SOwoJfQojZWxz ZQojaWZkZWYgSEFWRV9MREFQX0lOSVRJQUxJWkUKCgkvKgoJICogT3BlbkxEQVAgcHJvdmlkZXMg YSBub24tc3RhbmRhcmQgZXh0ZW5zaW9uIGxkYXBfaW5pdGlhbGl6ZSgpIHRoYXQgdGFrZXMKCSAq IGEgbGlzdCBvZiBVUklzLCBhbGxvd2luZyB1cyB0byByZXF1ZXN0ICJsZGFwcyIgaW5zdGVhZCBv ZiAibGRhcCIuICBJdAoJICogYWxzbyBwcm92aWRlcyBsZGFwX2RvbWFpbjJob3N0bGlzdCgpIHRv IGZpbmQgTERBUCBzZXJ2ZXJzIGF1dG9tYXRpY2FsbHkKCSAqIHVzaW5nIEROUyBTUlYuICBUaGV5 IHdlcmUgaW50cm9kdWNlZCBpbiB0aGUgc2FtZSB2ZXJzaW9uLCBzbyBmb3Igbm93IHdlCgkgKiBk b24ndCBoYXZlIGFuIGV4dHJhIGNvbmZpZ3VyZSBjaGVjayBmb3IgdGhlIGxhdHRlci4KCSAqLwoJ ewoJCVN0cmluZ0luZm9EYXRhIHVyaXM7CgkJY2hhcgkgICAqaG9zdGxpc3QgPSBOVUxMOwoJCWNo YXIJICAgKnA7CgkJYm9vbAkJYXBwZW5kX3BvcnQ7CgoJCS8qIFdlJ2xsIGJ1aWxkIGEgc3BhY2Ut c2VwYXJhdGVkIHNjaGVtZTovL2hvc3RuYW1lOnBvcnQgbGlzdCBoZXJlICovCgkJaW5pdFN0cmlu Z0luZm8oJnVyaXMpOwoKCQkvKgoJCSAqIElmIHBnX2hiYS5jb25mIHByb3ZpZGVkIG5vIGhvc3Ru YW1lcywgd2UgY2FuIGFzayBPcGVuTERBUCB0byB0cnkgdG8KCQkgKiBmaW5kIHNvbWUgYnkgZXh0 cmFjdGluZyBhIGRvbWFpbiBuYW1lIGZyb20gdGhlIGJhc2UgRE4gYW5kIGxvb2tpbmcKCQkgKiB1 cCBEU04gU1JWIHJlY29yZHMgZm9yIF9sZGFwLl90Y3AuPGRvbWFpbj4uCgkJICovCgkJaWYgKCFw b3J0LT5oYmEtPmxkYXBzZXJ2ZXIgfHwgcG9ydC0+aGJhLT5sZGFwc2VydmVyWzBdID09ICdcMCcp CgkJewoJCQljaGFyCSAgICpkb21haW47CgoJCQkvKiBvdT1ibGFoLGRjPWZvbyxkYz1iYXIgLT4g Zm9vLmJhciAqLwoJCQlpZiAobGRhcF9kbjJkb21haW4ocG9ydC0+aGJhLT5sZGFwYmFzZWRuLCAm ZG9tYWluKSkKCQkJewoJCQkJZXJlcG9ydChMT0csCgkJCQkJCShlcnJtc2coImNvdWxkIG5vdCBl eHRyYWN0IGRvbWFpbiBuYW1lIGZyb20gbGRhcGJhc2VkbiIpKSk7CgkJCQlyZXR1cm4gU1RBVFVT X0VSUk9SOwoJCQl9CgoJCQkvKiBMb29rIHVwIGEgbGlzdCBvZiBMREFQIHNlcnZlciBob3N0cyBh bmQgcG9ydCBudW1iZXJzICovCgkJCWlmIChsZGFwX2RvbWFpbjJob3N0bGlzdChkb21haW4sICZo b3N0bGlzdCkpCgkJCXsKCQkJCWVyZXBvcnQoTE9HLAoJCQkJCQkoZXJybXNnKCJMREFQIGF1dGhl bnRpY2F0aW9uIGNvdWxkIG5vdCBmaW5kIEROUyBTUlYgcmVjb3JkcyBmb3IgXCIlc1wiIiwKCQkJ CQkJCQlkb21haW4pLAoJCQkJCQkgKGVycmhpbnQoIlNldCBhbiBMREFQIHNlcnZlciBuYW1lIGV4 cGxpY2l0bHkuIikpKSk7CgkJCQlsZGFwX21lbWZyZWUoZG9tYWluKTsKCQkJCXJldHVybiBTVEFU VVNfRVJST1I7CgkJCX0KCQkJbGRhcF9tZW1mcmVlKGRvbWFpbik7CgoJCQkvKiBXZSBoYXZlIGEg c3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgaG9zdDpwb3J0IGVudHJpZXMgKi8KCQkJcCA9IGhvc3Rs aXN0OwoJCQlhcHBlbmRfcG9ydCA9IGZhbHNlOwoJCX0KCQllbHNlCgkJewoJCQkvKiBXZSBoYXZl IGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgaG9zdHMgZnJvbSBwZ19oYmEuY29uZiAqLwoJCQlw ID0gcG9ydC0+aGJhLT5sZGFwc2VydmVyOwoJCQlhcHBlbmRfcG9ydCA9IHRydWU7CgkJfQoKCQkv KiBDb252ZXJ0IHRoZSBsaXN0IG9mIGhvc3RbOnBvcnRdIGVudHJpZXMgdG8gZnVsbCBVUklzICov CgkJZG8KCQl7CgkJCXNpemVfdAkJc2l6ZTsKCgkJCS8qIEZpbmQgdGhlIHNwYW4gb2YgdGhlIG5l eHQgZW50cnkgKi8KCQkJc2l6ZSA9IHN0cmNzcG4ocCwgIiAiKTsKCgkJCS8qIEFwcGVuZCBhIHNw YWNlIHNlcGFyYXRvciBpZiB0aGlzIGlzbid0IHRoZSBmaXJzdCBVUkkgKi8KCQkJaWYgKHVyaXMu bGVuID4gMCkKCQkJCWFwcGVuZFN0cmluZ0luZm9DaGFyKCZ1cmlzLCAnICcpOwoKCQkJLyogQXBw ZW5kIHNjaGVtZTovL2hvc3Q6cG9ydCAqLwoJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKCZ1cmlz LCBzY2hlbWUpOwoJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKCZ1cmlzLCAiOi8vIik7CgkJCWFw cGVuZEJpbmFyeVN0cmluZ0luZm8oJnVyaXMsIHAsIHNpemUpOwoJCQlpZiAoYXBwZW5kX3BvcnQp CgkJCQlhcHBlbmRTdHJpbmdJbmZvKCZ1cmlzLCAiOiVkIiwgcG9ydC0+aGJhLT5sZGFwcG9ydCk7 CgoJCQkvKiBTdGVwIG92ZXIgdGhpcyBlbnRyeSBhbmQgYW55IG51bWJlciBvZiB0cmFpbGluZyBz cGFjZXMgKi8KCQkJcCArPSBzaXplOwoJCQl3aGlsZSAoKnAgPT0gJyAnKQoJCQkJKytwOwoJCX0g d2hpbGUgKCpwKTsKCgkJLyogRnJlZSBtZW1vcnkgZnJvbSBPcGVuTERBUCBpZiB3ZSBsb29rZWQg dXAgU1JWIHJlY29yZHMgKi8KCQlpZiAoaG9zdGxpc3QpCgkJCWxkYXBfbWVtZnJlZShob3N0bGlz dCk7CgoJCS8qIEZpbmFsbHksIHRyeSB0byBjb25uZWN0IHVzaW5nIHRoZSBVUkkgbGlzdCAqLwoJ CXIgPSBsZGFwX2luaXRpYWxpemUobGRhcCwgdXJpcy5kYXRhKTsKCQlwZnJlZSh1cmlzLmRhdGEp OwoJCWlmIChyICE9IExEQVBfU1VDQ0VTUykKCQl7CgkJCWVyZXBvcnQoTE9HLAoJCQkJCShlcnJt c2coImNvdWxkIG5vdCBpbml0aWFsaXplIExEQVA6ICVzIiwKCQkJCQkJCWxkYXBfZXJyMnN0cmlu ZyhyKSkpKTsKCgkJCXJldHVybiBTVEFUVVNfRVJST1I7CgkJfQoJfQojZWxzZQoJaWYgKHN0cmNt cChzY2hlbWUsICJsZGFwcyIpID09IDApCgl7CgkJZXJlcG9ydChMT0csCgkJCQkoZXJybXNnKCJs ZGFwcyBub3Qgc3VwcG9ydGVkIHdpdGggdGhpcyBMREFQIGxpYnJhcnkiKSkpOwoKCQlyZXR1cm4g U1RBVFVTX0VSUk9SOwoJfQoJKmxkYXAgPSBsZGFwX2luaXQocG9ydC0+aGJhLT5sZGFwc2VydmVy LCBwb3J0LT5oYmEtPmxkYXBwb3J0KTsKCWlmICghKmxkYXApCgl7CgkJZXJlcG9ydChMT0csCgkJ CQkoZXJybXNnKCJjb3VsZCBub3QgaW5pdGlhbGl6ZSBMREFQOiAlbSIpKSk7CgoJCXJldHVybiBT VEFUVVNfRVJST1I7Cgl9CiNlbmRpZgojZW5kaWYKCglpZiAoKHIgPSBsZGFwX3NldF9vcHRpb24o KmxkYXAsIExEQVBfT1BUX1BST1RPQ09MX1ZFUlNJT04sICZsZGFwdmVyc2lvbikpICE9IExEQVBf U1VDQ0VTUykKCXsKCQllcmVwb3J0KExPRywKCQkJCShlcnJtc2coImNvdWxkIG5vdCBzZXQgTERB UCBwcm90b2NvbCB2ZXJzaW9uOiAlcyIsCgkJCQkJCWxkYXBfZXJyMnN0cmluZyhyKSksCgkJCQkg ZXJyZGV0YWlsX2Zvcl9sZGFwKCpsZGFwKSkpOwoJCWxkYXBfdW5iaW5kKCpsZGFwKTsKCQlyZXR1 cm4gU1RBVFVTX0VSUk9SOwoJfQoKCWlmIChwb3J0LT5oYmEtPmxkYXB0bHMpCgl7CiNpZm5kZWYg V0lOMzIKCQlpZiAoKHIgPSBsZGFwX3N0YXJ0X3Rsc19zKCpsZGFwLCBOVUxMLCBOVUxMKSkgIT0g TERBUF9TVUNDRVNTKQojZWxzZQoJCWlmICgociA9IGxkYXBfc3RhcnRfdGxzX3MoKmxkYXAsIE5V TEwsIE5VTEwsIE5VTEwsIE5VTEwpKSAhPSBMREFQX1NVQ0NFU1MpCiNlbmRpZgoJCXsKCQkJZXJl cG9ydChMT0csCgkJCQkJKGVycm1zZygiY291bGQgbm90IHN0YXJ0IExEQVAgVExTIHNlc3Npb246 ICVzIiwKCQkJCQkJCWxkYXBfZXJyMnN0cmluZyhyKSksCgkJCQkJIGVycmRldGFpbF9mb3JfbGRh cCgqbGRhcCkpKTsKCQkJbGRhcF91bmJpbmQoKmxkYXApOwoJCQlyZXR1cm4gU1RBVFVTX0VSUk9S OwoJCX0KCX0KCglyZXR1cm4gU1RBVFVTX09LOwp9CgovKiBQbGFjZWhvbGRlcnMgcmVjb2duaXpl ZCBieSBGb3JtYXRTZWFyY2hGaWx0ZXIuICBGb3Igbm93IGp1c3Qgb25lLiAqLwojZGVmaW5lIExQ SF9VU0VSTkFNRSAiJHVzZXJuYW1lIgojZGVmaW5lIExQSF9VU0VSTkFNRV9MRU4gKHNpemVvZihM UEhfVVNFUk5BTUUpIC0gMSkKCi8qIE5vdCBhbGwgTERBUCBpbXBsZW1lbnRhdGlvbnMgZGVmaW5l IHRoaXMuICovCiNpZm5kZWYgTERBUF9OT19BVFRSUwojZGVmaW5lIExEQVBfTk9fQVRUUlMgIjEu MSIKI2VuZGlmCgovKiBOb3QgYWxsIExEQVAgaW1wbGVtZW50YXRpb25zIGRlZmluZSB0aGlzLiAq LwojaWZuZGVmIExEQVBTX1BPUlQKI2RlZmluZSBMREFQU19QT1JUIDYzNgojZW5kaWYKCnN0YXRp YyBjaGFyICoKZHVtbXlfbGRhcF9wYXNzd29yZF9tdXRhdG9yKGNoYXIgKmlucHV0KQp7CglyZXR1 cm4gaW5wdXQ7Cn0KCi8qCiAqIFJldHVybiBhIG5ld2x5IGFsbG9jYXRlZCBDIHN0cmluZyBjb3Bp ZWQgZnJvbSAicGF0dGVybiIgd2l0aCBhbGwKICogb2NjdXJyZW5jZXMgb2YgdGhlIHBsYWNlaG9s ZGVyICIkdXNlcm5hbWUiIHJlcGxhY2VkIHdpdGggInVzZXJfbmFtZSIuCiAqLwpzdGF0aWMgY2hh ciAqCkZvcm1hdFNlYXJjaEZpbHRlcihjb25zdCBjaGFyICpwYXR0ZXJuLCBjb25zdCBjaGFyICp1 c2VyX25hbWUpCnsKCVN0cmluZ0luZm9EYXRhIG91dHB1dDsKCglpbml0U3RyaW5nSW5mbygmb3V0 cHV0KTsKCXdoaWxlICgqcGF0dGVybiAhPSAnXDAnKQoJewoJCWlmIChzdHJuY21wKHBhdHRlcm4s IExQSF9VU0VSTkFNRSwgTFBIX1VTRVJOQU1FX0xFTikgPT0gMCkKCQl7CgkJCWFwcGVuZFN0cmlu Z0luZm9TdHJpbmcoJm91dHB1dCwgdXNlcl9uYW1lKTsKCQkJcGF0dGVybiArPSBMUEhfVVNFUk5B TUVfTEVOOwoJCX0KCQllbHNlCgkJCWFwcGVuZFN0cmluZ0luZm9DaGFyKCZvdXRwdXQsICpwYXR0 ZXJuKyspOwoJfQoKCXJldHVybiBvdXRwdXQuZGF0YTsKfQoKLyoKICogUGVyZm9ybSBMREFQIGF1 dGhlbnRpY2F0aW9uCiAqLwpzdGF0aWMgaW50CkNoZWNrTERBUEF1dGgoUG9ydCAqcG9ydCkKewoJ Y2hhcgkgICAqcGFzc3dkOwoJTERBUAkgICAqbGRhcDsKCWludAkJCXI7CgljaGFyCSAgICpmdWxs dXNlcjsKCWNvbnN0IGNoYXIgKnNlcnZlcl9uYW1lOwoKI2lmZGVmIEhBVkVfTERBUF9JTklUSUFM SVpFCgoJLyoKCSAqIEZvciBPcGVuTERBUCwgYWxsb3cgZW1wdHkgaG9zdG5hbWUgaWYgd2UgaGF2 ZSBhIGJhc2Vkbi4gIFdlJ2xsIGxvb2sgZm9yCgkgKiBzZXJ2ZXJzIHdpdGggRE5TIFNSViByZWNv cmRzIHZpYSBPcGVuTERBUCBsaWJyYXJ5IGZhY2lsaXRpZXMuCgkgKi8KCWlmICgoIXBvcnQtPmhi YS0+bGRhcHNlcnZlciB8fCBwb3J0LT5oYmEtPmxkYXBzZXJ2ZXJbMF0gPT0gJ1wwJykgJiYKCQko IXBvcnQtPmhiYS0+bGRhcGJhc2VkbiB8fCBwb3J0LT5oYmEtPmxkYXBiYXNlZG5bMF0gPT0gJ1ww JykpCgl7CgkJZXJlcG9ydChMT0csCgkJCQkoZXJybXNnKCJMREFQIHNlcnZlciBub3Qgc3BlY2lm aWVkLCBhbmQgbm8gbGRhcGJhc2VkbiIpKSk7CgkJcmV0dXJuIFNUQVRVU19FUlJPUjsKCX0KI2Vs c2UKCWlmICghcG9ydC0+aGJhLT5sZGFwc2VydmVyIHx8IHBvcnQtPmhiYS0+bGRhcHNlcnZlclsw XSA9PSAnXDAnKQoJewoJCWVyZXBvcnQoTE9HLAoJCQkJKGVycm1zZygiTERBUCBzZXJ2ZXIgbm90 IHNwZWNpZmllZCIpKSk7CgkJcmV0dXJuIFNUQVRVU19FUlJPUjsKCX0KI2VuZGlmCgoJLyoKCSAq IElmIHdlJ3JlIHVzaW5nIFNSViByZWNvcmRzLCB3ZSBkb24ndCBoYXZlIGEgc2VydmVyIG5hbWUg c28gd2UnbGwganVzdAoJICogc2hvdyBhbiBlbXB0eSBzdHJpbmcgaW4gZXJyb3IgbWVzc2FnZXMu CgkgKi8KCXNlcnZlcl9uYW1lID0gcG9ydC0+aGJhLT5sZGFwc2VydmVyID8gcG9ydC0+aGJhLT5s ZGFwc2VydmVyIDogIiI7CgoJaWYgKHBvcnQtPmhiYS0+bGRhcHBvcnQgPT0gMCkKCXsKCQlpZiAo cG9ydC0+aGJhLT5sZGFwc2NoZW1lICE9IE5VTEwgJiYKCQkJc3RyY21wKHBvcnQtPmhiYS0+bGRh cHNjaGVtZSwgImxkYXBzIikgPT0gMCkKCQkJcG9ydC0+aGJhLT5sZGFwcG9ydCA9IExEQVBTX1BP UlQ7CgkJZWxzZQoJCQlwb3J0LT5oYmEtPmxkYXBwb3J0ID0gTERBUF9QT1JUOwoJfQoKCXNlbmRB dXRoUmVxdWVzdChwb3J0LCBBVVRIX1JFUV9QQVNTV09SRCwgTlVMTCwgMCk7CgoJcGFzc3dkID0g cmVjdl9wYXNzd29yZF9wYWNrZXQocG9ydCk7CglpZiAocGFzc3dkID09IE5VTEwpCgkJcmV0dXJu IFNUQVRVU19FT0Y7CQkvKiBjbGllbnQgd291bGRuJ3Qgc2VuZCBwYXNzd29yZCAqLwoKCWlmIChJ bml0aWFsaXplTERBUENvbm5lY3Rpb24ocG9ydCwgJmxkYXApID09IFNUQVRVU19FUlJPUikKCXsK CQkvKiBFcnJvciBtZXNzYWdlIGFscmVhZHkgc2VudCAqLwoJCXBmcmVlKHBhc3N3ZCk7CgkJcmV0 dXJuIFNUQVRVU19FUlJPUjsKCX0KCglpZiAocG9ydC0+aGJhLT5sZGFwYmFzZWRuKQoJewoJCS8q CgkJICogRmlyc3QgcGVyZm9ybSBhbiBMREFQIHNlYXJjaCB0byBmaW5kIHRoZSBETiBmb3IgdGhl IHVzZXIgd2UgYXJlCgkJICogdHJ5aW5nIHRvIGxvZyBpbiBhcy4KCQkgKi8KCQljaGFyCSAgICpm aWx0ZXI7CgkJTERBUE1lc3NhZ2UgKnNlYXJjaF9tZXNzYWdlOwoJCUxEQVBNZXNzYWdlICplbnRy eTsKCQljaGFyCSAgICphdHRyaWJ1dGVzW10gPSB7TERBUF9OT19BVFRSUywgTlVMTH07CgkJY2hh cgkgICAqZG47CgkJY2hhcgkgICAqYzsKCQlpbnQJCQljb3VudDsKCgkJLyoKCQkgKiBEaXNhbGxv dyBhbnkgY2hhcmFjdGVycyB0aGF0IHdlIHdvdWxkIG90aGVyd2lzZSBuZWVkIHRvIGVzY2FwZSwK CQkgKiBzaW5jZSB0aGV5IGFyZW4ndCByZWFsbHkgcmVhc29uYWJsZSBpbiBhIHVzZXJuYW1lIGFu eXdheS4gQWxsb3dpbmcKCQkgKiB0aGVtIHdvdWxkIG1ha2UgaXQgcG9zc2libGUgdG8gaW5qZWN0 IGFueSBraW5kIG9mIGN1c3RvbSBmaWx0ZXJzIGluCgkJICogdGhlIExEQVAgZmlsdGVyLgoJCSAq LwoJCWZvciAoYyA9IHBvcnQtPnVzZXJfbmFtZTsgKmM7IGMrKykKCQl7CgkJCWlmICgqYyA9PSAn KicgfHwKCQkJCSpjID09ICcoJyB8fAoJCQkJKmMgPT0gJyknIHx8CgkJCQkqYyA9PSAnXFwnIHx8 CgkJCQkqYyA9PSAnLycpCgkJCXsKCQkJCWVyZXBvcnQoTE9HLAoJCQkJCQkoZXJybXNnKCJpbnZh bGlkIGNoYXJhY3RlciBpbiB1c2VyIG5hbWUgZm9yIExEQVAgYXV0aGVudGljYXRpb24iKSkpOwoJ CQkJbGRhcF91bmJpbmQobGRhcCk7CgkJCQlwZnJlZShwYXNzd2QpOwoJCQkJcmV0dXJuIFNUQVRV U19FUlJPUjsKCQkJfQoJCX0KCgkJLyoKCQkgKiBCaW5kIHdpdGggYSBwcmUtZGVmaW5lZCB1c2Vy bmFtZS9wYXNzd29yZCAoaWYgYXZhaWxhYmxlKSBmb3IKCQkgKiBzZWFyY2hpbmcuIElmIG5vbmUg aXMgc3BlY2lmaWVkLCB0aGlzIHR1cm5zIGludG8gYW4gYW5vbnltb3VzIGJpbmQuCgkJICovCgkJ ciA9IGxkYXBfc2ltcGxlX2JpbmRfcyhsZGFwLAoJCQkJCQkJICAgcG9ydC0+aGJhLT5sZGFwYmlu ZGRuID8gcG9ydC0+aGJhLT5sZGFwYmluZGRuIDogIiIsCgkJCQkJCQkgICBwb3J0LT5oYmEtPmxk YXBiaW5kcGFzc3dkID8gbGRhcF9wYXNzd29yZF9ob29rKHBvcnQtPmhiYS0+bGRhcGJpbmRwYXNz d2QpIDogIiIpOwoJCWlmIChyICE9IExEQVBfU1VDQ0VTUykKCQl7CgkJCWVyZXBvcnQoTE9HLAoJ CQkJCShlcnJtc2coImNvdWxkIG5vdCBwZXJmb3JtIGluaXRpYWwgTERBUCBiaW5kIGZvciBsZGFw YmluZGRuIFwiJXNcIiBvbiBzZXJ2ZXIgXCIlc1wiOiAlcyIsCgkJCQkJCQlwb3J0LT5oYmEtPmxk YXBiaW5kZG4gPyBwb3J0LT5oYmEtPmxkYXBiaW5kZG4gOiAiIiwKCQkJCQkJCXNlcnZlcl9uYW1l LAoJCQkJCQkJbGRhcF9lcnIyc3RyaW5nKHIpKSwKCQkJCQkgZXJyZGV0YWlsX2Zvcl9sZGFwKGxk YXApKSk7CgkJCWxkYXBfdW5iaW5kKGxkYXApOwoJCQlwZnJlZShwYXNzd2QpOwoJCQlyZXR1cm4g U1RBVFVTX0VSUk9SOwoJCX0KCgkJLyogQnVpbGQgYSBjdXN0b20gZmlsdGVyIG9yIGEgc2luZ2xl IGF0dHJpYnV0ZSBmaWx0ZXI/ICovCgkJaWYgKHBvcnQtPmhiYS0+bGRhcHNlYXJjaGZpbHRlcikK CQkJZmlsdGVyID0gRm9ybWF0U2VhcmNoRmlsdGVyKHBvcnQtPmhiYS0+bGRhcHNlYXJjaGZpbHRl ciwgcG9ydC0+dXNlcl9uYW1lKTsKCQllbHNlIGlmIChwb3J0LT5oYmEtPmxkYXBzZWFyY2hhdHRy aWJ1dGUpCgkJCWZpbHRlciA9IHBzcHJpbnRmKCIoJXM9JXMpIiwgcG9ydC0+aGJhLT5sZGFwc2Vh cmNoYXR0cmlidXRlLCBwb3J0LT51c2VyX25hbWUpOwoJCWVsc2UKCQkJZmlsdGVyID0gcHNwcmlu dGYoIih1aWQ9JXMpIiwgcG9ydC0+dXNlcl9uYW1lKTsKCgkJc2VhcmNoX21lc3NhZ2UgPSBOVUxM OwoJCXIgPSBsZGFwX3NlYXJjaF9zKGxkYXAsCgkJCQkJCSAgcG9ydC0+aGJhLT5sZGFwYmFzZWRu LAoJCQkJCQkgIHBvcnQtPmhiYS0+bGRhcHNjb3BlLAoJCQkJCQkgIGZpbHRlciwKCQkJCQkJICBh dHRyaWJ1dGVzLAoJCQkJCQkgIDAsCgkJCQkJCSAgJnNlYXJjaF9tZXNzYWdlKTsKCgkJaWYgKHIg IT0gTERBUF9TVUNDRVNTKQoJCXsKCQkJZXJlcG9ydChMT0csCgkJCQkJKGVycm1zZygiY291bGQg bm90IHNlYXJjaCBMREFQIGZvciBmaWx0ZXIgXCIlc1wiIG9uIHNlcnZlciBcIiVzXCI6ICVzIiwK CQkJCQkJCWZpbHRlciwgc2VydmVyX25hbWUsIGxkYXBfZXJyMnN0cmluZyhyKSksCgkJCQkJIGVy cmRldGFpbF9mb3JfbGRhcChsZGFwKSkpOwoJCQlpZiAoc2VhcmNoX21lc3NhZ2UgIT0gTlVMTCkK CQkJCWxkYXBfbXNnZnJlZShzZWFyY2hfbWVzc2FnZSk7CgkJCWxkYXBfdW5iaW5kKGxkYXApOwoJ CQlwZnJlZShwYXNzd2QpOwoJCQlwZnJlZShmaWx0ZXIpOwoJCQlyZXR1cm4gU1RBVFVTX0VSUk9S OwoJCX0KCgkJY291bnQgPSBsZGFwX2NvdW50X2VudHJpZXMobGRhcCwgc2VhcmNoX21lc3NhZ2Up OwoJCWlmIChjb3VudCAhPSAxKQoJCXsKCQkJaWYgKGNvdW50ID09IDApCgkJCQllcmVwb3J0KExP RywKCQkJCQkJKGVycm1zZygiTERBUCB1c2VyIFwiJXNcIiBkb2VzIG5vdCBleGlzdCIsIHBvcnQt PnVzZXJfbmFtZSksCgkJCQkJCSBlcnJkZXRhaWwoIkxEQVAgc2VhcmNoIGZvciBmaWx0ZXIgXCIl c1wiIG9uIHNlcnZlciBcIiVzXCIgcmV0dXJuZWQgbm8gZW50cmllcy4iLAoJCQkJCQkJCSAgIGZp bHRlciwgc2VydmVyX25hbWUpKSk7CgkJCWVsc2UKCQkJCWVyZXBvcnQoTE9HLAoJCQkJCQkoZXJy bXNnKCJMREFQIHVzZXIgXCIlc1wiIGlzIG5vdCB1bmlxdWUiLCBwb3J0LT51c2VyX25hbWUpLAoJ CQkJCQkgZXJyZGV0YWlsX3BsdXJhbCgiTERBUCBzZWFyY2ggZm9yIGZpbHRlciBcIiVzXCIgb24g c2VydmVyIFwiJXNcIiByZXR1cm5lZCAlZCBlbnRyeS4iLAoJCQkJCQkJCQkJICAiTERBUCBzZWFy Y2ggZm9yIGZpbHRlciBcIiVzXCIgb24gc2VydmVyIFwiJXNcIiByZXR1cm5lZCAlZCBlbnRyaWVz LiIsCgkJCQkJCQkJCQkgIGNvdW50LAoJCQkJCQkJCQkJICBmaWx0ZXIsIHNlcnZlcl9uYW1lLCBj b3VudCkpKTsKCgkJCWxkYXBfdW5iaW5kKGxkYXApOwoJCQlwZnJlZShwYXNzd2QpOwoJCQlwZnJl ZShmaWx0ZXIpOwoJCQlsZGFwX21zZ2ZyZWUoc2VhcmNoX21lc3NhZ2UpOwoJCQlyZXR1cm4gU1RB VFVTX0VSUk9SOwoJCX0KCgkJZW50cnkgPSBsZGFwX2ZpcnN0X2VudHJ5KGxkYXAsIHNlYXJjaF9t ZXNzYWdlKTsKCQlkbiA9IGxkYXBfZ2V0X2RuKGxkYXAsIGVudHJ5KTsKCQlpZiAoZG4gPT0gTlVM TCkKCQl7CgkJCWludAkJCWVycm9yOwoKCQkJKHZvaWQpIGxkYXBfZ2V0X29wdGlvbihsZGFwLCBM REFQX09QVF9FUlJPUl9OVU1CRVIsICZlcnJvcik7CgkJCWVyZXBvcnQoTE9HLAoJCQkJCShlcnJt c2coImNvdWxkIG5vdCBnZXQgZG4gZm9yIHRoZSBmaXJzdCBlbnRyeSBtYXRjaGluZyBcIiVzXCIg b24gc2VydmVyIFwiJXNcIjogJXMiLAoJCQkJCQkJZmlsdGVyLCBzZXJ2ZXJfbmFtZSwKCQkJCQkJ CWxkYXBfZXJyMnN0cmluZyhlcnJvcikpLAoJCQkJCSBlcnJkZXRhaWxfZm9yX2xkYXAobGRhcCkp KTsKCQkJbGRhcF91bmJpbmQobGRhcCk7CgkJCXBmcmVlKHBhc3N3ZCk7CgkJCXBmcmVlKGZpbHRl cik7CgkJCWxkYXBfbXNnZnJlZShzZWFyY2hfbWVzc2FnZSk7CgkJCXJldHVybiBTVEFUVVNfRVJS T1I7CgkJfQoJCWZ1bGx1c2VyID0gcHN0cmR1cChkbik7CgoJCXBmcmVlKGZpbHRlcik7CgkJbGRh cF9tZW1mcmVlKGRuKTsKCQlsZGFwX21zZ2ZyZWUoc2VhcmNoX21lc3NhZ2UpOwoKCQkvKiBVbmJp bmQgYW5kIGRpc2Nvbm5lY3QgZnJvbSB0aGUgTERBUCBzZXJ2ZXIgKi8KCQlyID0gbGRhcF91bmJp bmRfcyhsZGFwKTsKCQlpZiAociAhPSBMREFQX1NVQ0NFU1MpCgkJewoJCQllcmVwb3J0KExPRywK CQkJCQkoZXJybXNnKCJjb3VsZCBub3QgdW5iaW5kIGFmdGVyIHNlYXJjaGluZyBmb3IgdXNlciBc IiVzXCIgb24gc2VydmVyIFwiJXNcIiIsCgkJCQkJCQlmdWxsdXNlciwgc2VydmVyX25hbWUpKSk7 CgkJCXBmcmVlKHBhc3N3ZCk7CgkJCXBmcmVlKGZ1bGx1c2VyKTsKCQkJcmV0dXJuIFNUQVRVU19F UlJPUjsKCQl9CgoJCS8qCgkJICogTmVlZCB0byByZS1pbml0aWFsaXplIHRoZSBMREFQIGNvbm5l Y3Rpb24sIHNvIHRoYXQgd2UgY2FuIGJpbmQgdG8KCQkgKiBpdCB3aXRoIGEgZGlmZmVyZW50IHVz ZXJuYW1lLgoJCSAqLwoJCWlmIChJbml0aWFsaXplTERBUENvbm5lY3Rpb24ocG9ydCwgJmxkYXAp ID09IFNUQVRVU19FUlJPUikKCQl7CgkJCXBmcmVlKHBhc3N3ZCk7CgkJCXBmcmVlKGZ1bGx1c2Vy KTsKCgkJCS8qIEVycm9yIG1lc3NhZ2UgYWxyZWFkeSBzZW50ICovCgkJCXJldHVybiBTVEFUVVNf RVJST1I7CgkJfQoJfQoJZWxzZQoJCWZ1bGx1c2VyID0gcHNwcmludGYoIiVzJXMlcyIsCgkJCQkJ CQlwb3J0LT5oYmEtPmxkYXBwcmVmaXggPyBwb3J0LT5oYmEtPmxkYXBwcmVmaXggOiAiIiwKCQkJ CQkJCXBvcnQtPnVzZXJfbmFtZSwKCQkJCQkJCXBvcnQtPmhiYS0+bGRhcHN1ZmZpeCA/IHBvcnQt PmhiYS0+bGRhcHN1ZmZpeCA6ICIiKTsKCglyID0gbGRhcF9zaW1wbGVfYmluZF9zKGxkYXAsIGZ1 bGx1c2VyLCBwYXNzd2QpOwoKCWlmIChyICE9IExEQVBfU1VDQ0VTUykKCXsKCQllcmVwb3J0KExP RywKCQkJCShlcnJtc2coIkxEQVAgbG9naW4gZmFpbGVkIGZvciB1c2VyIFwiJXNcIiBvbiBzZXJ2 ZXIgXCIlc1wiOiAlcyIsCgkJCQkJCWZ1bGx1c2VyLCBzZXJ2ZXJfbmFtZSwgbGRhcF9lcnIyc3Ry aW5nKHIpKSwKCQkJCSBlcnJkZXRhaWxfZm9yX2xkYXAobGRhcCkpKTsKCQlsZGFwX3VuYmluZChs ZGFwKTsKCQlwZnJlZShwYXNzd2QpOwoJCXBmcmVlKGZ1bGx1c2VyKTsKCQlyZXR1cm4gU1RBVFVT X0VSUk9SOwoJfQoKCS8qIFNhdmUgdGhlIG9yaWdpbmFsIGJpbmQgRE4gYXMgdGhlIGF1dGhlbnRp Y2F0ZWQgaWRlbnRpdHkuICovCglzZXRfYXV0aG5faWQocG9ydCwgZnVsbHVzZXIpOwoKCWxkYXBf dW5iaW5kKGxkYXApOwoJcGZyZWUocGFzc3dkKTsKCXBmcmVlKGZ1bGx1c2VyKTsKCglyZXR1cm4g U1RBVFVTX09LOwp9CgovKgogKiBBZGQgYSBkZXRhaWwgZXJyb3IgbWVzc2FnZSB0ZXh0IHRvIHRo ZSBjdXJyZW50IGVycm9yIGlmIG9uZSBjYW4gYmUKICogY29uc3RydWN0ZWQgZnJvbSB0aGUgTERB UCAnZGlhZ25vc3RpYyBtZXNzYWdlJy4KICovCnN0YXRpYyBpbnQKZXJyZGV0YWlsX2Zvcl9sZGFw KExEQVAgKmxkYXApCnsKCWNoYXIJICAgKm1lc3NhZ2U7CglpbnQJCQlyYzsKCglyYyA9IGxkYXBf Z2V0X29wdGlvbihsZGFwLCBMREFQX09QVF9ESUFHTk9TVElDX01FU1NBR0UsICZtZXNzYWdlKTsK CWlmIChyYyA9PSBMREFQX1NVQ0NFU1MgJiYgbWVzc2FnZSAhPSBOVUxMKQoJewoJCWVycmRldGFp bCgiTERBUCBkaWFnbm9zdGljczogJXMiLCBtZXNzYWdlKTsKCQlsZGFwX21lbWZyZWUobWVzc2Fn ZSk7Cgl9CgoJcmV0dXJuIDA7Cn0KCiNlbmRpZgkJCQkJCQkvKiBVU0VfTERBUCAqLwoKCi8qLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQogKiBTU0wgY2xpZW50IGNlcnRpZmljYXRlIGF1dGhlbnRpY2F0aW9uCiAqLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQog Ki8KI2lmZGVmIFVTRV9TU0wKc3RhdGljIGludApDaGVja0NlcnRBdXRoKFBvcnQgKnBvcnQpCnsK CWludAkJCXN0YXR1c19jaGVja191c2VybWFwID0gU1RBVFVTX0VSUk9SOwoJY2hhcgkgICAqcGVl cl91c2VybmFtZSA9IE5VTEw7CgoJQXNzZXJ0KHBvcnQtPnNzbCk7CgoJLyogc2VsZWN0IHRoZSBj b3JyZWN0IGZpZWxkIHRvIGNvbXBhcmUgKi8KCXN3aXRjaCAocG9ydC0+aGJhLT5jbGllbnRjZXJ0 bmFtZSkKCXsKCQljYXNlIGNsaWVudENlcnRETjoKCQkJcGVlcl91c2VybmFtZSA9IHBvcnQtPnBl ZXJfZG47CgkJCWJyZWFrOwoJCWNhc2UgY2xpZW50Q2VydENOOgoJCQlwZWVyX3VzZXJuYW1lID0g cG9ydC0+cGVlcl9jbjsKCX0KCgkvKiBNYWtlIHN1cmUgd2UgaGF2ZSByZWNlaXZlZCBhIHVzZXJu YW1lIGluIHRoZSBjZXJ0aWZpY2F0ZSAqLwoJaWYgKHBlZXJfdXNlcm5hbWUgPT0gTlVMTCB8fAoJ CXN0cmxlbihwZWVyX3VzZXJuYW1lKSA8PSAwKQoJewoJCWVyZXBvcnQoTE9HLAoJCQkJKGVycm1z ZygiY2VydGlmaWNhdGUgYXV0aGVudGljYXRpb24gZmFpbGVkIGZvciB1c2VyIFwiJXNcIjogY2xp ZW50IGNlcnRpZmljYXRlIGNvbnRhaW5zIG5vIHVzZXIgbmFtZSIsCgkJCQkJCXBvcnQtPnVzZXJf bmFtZSkpKTsKCQlyZXR1cm4gU1RBVFVTX0VSUk9SOwoJfQoKCWlmIChwb3J0LT5oYmEtPmF1dGhf bWV0aG9kID09IHVhQ2VydCkKCXsKCQkvKgoJCSAqIEZvciBjZXJ0IGF1dGgsIHRoZSBjbGllbnQn cyBTdWJqZWN0IEROIGlzIGFsd2F5cyBvdXIgYXV0aGVudGljYXRlZAoJCSAqIGlkZW50aXR5LCBl dmVuIGlmIHdlJ3JlIG9ubHkgdXNpbmcgaXRzIENOIGZvciBhdXRob3JpemF0aW9uLiAgU2V0CgkJ ICogaXQgbm93LCByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciBjaGVja191c2VybWFwKCkgYmVsb3cs IGJlY2F1c2UKCQkgKiBhdXRoZW50aWNhdGlvbiBoYXMgYWxyZWFkeSBzdWNjZWVkZWQgYW5kIHdl IHdhbnQgdGhlIGxvZyBmaWxlIHRvCgkJICogcmVmbGVjdCB0aGF0LgoJCSAqLwoJCWlmICghcG9y dC0+cGVlcl9kbikKCQl7CgkJCS8qCgkJCSAqIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gYXMgYm90 aCBwZWVyX2RuIGFuZCBwZWVyX2NuIHNob3VsZCBiZQoJCQkgKiBzZXQgaW4gdGhpcyBjb250ZXh0 LgoJCQkgKi8KCQkJZXJlcG9ydChMT0csCgkJCQkJKGVycm1zZygiY2VydGlmaWNhdGUgYXV0aGVu dGljYXRpb24gZmFpbGVkIGZvciB1c2VyIFwiJXNcIjogdW5hYmxlIHRvIHJldHJpZXZlIHN1Ympl Y3QgRE4iLAoJCQkJCQkJcG9ydC0+dXNlcl9uYW1lKSkpOwoJCQlyZXR1cm4gU1RBVFVTX0VSUk9S OwoJCX0KCgkJc2V0X2F1dGhuX2lkKHBvcnQsIHBvcnQtPnBlZXJfZG4pOwoJfQoKCS8qIEp1c3Qg cGFzcyB0aGUgY2VydGlmaWNhdGUgY24vZG4gdG8gdGhlIHVzZXJtYXAgY2hlY2sgKi8KCXN0YXR1 c19jaGVja191c2VybWFwID0gY2hlY2tfdXNlcm1hcChwb3J0LT5oYmEtPnVzZXJtYXAsIHBvcnQt PnVzZXJfbmFtZSwgcGVlcl91c2VybmFtZSwgZmFsc2UpOwoJaWYgKHN0YXR1c19jaGVja191c2Vy bWFwICE9IFNUQVRVU19PSykKCXsKCQkvKgoJCSAqIElmIGNsaWVudGNlcnQ9dmVyaWZ5LWZ1bGwg d2FzIHNwZWNpZmllZCBhbmQgdGhlIGF1dGhlbnRpY2F0aW9uCgkJICogbWV0aG9kIGlzIG90aGVy IHRoYW4gdWFDZXJ0LCBsb2cgdGhlIHJlYXNvbiBmb3IgcmVqZWN0aW5nIHRoZQoJCSAqIGF1dGhl bnRpY2F0aW9uLgoJCSAqLwoJCWlmIChwb3J0LT5oYmEtPmNsaWVudGNlcnQgPT0gY2xpZW50Q2Vy dEZ1bGwgJiYgcG9ydC0+aGJhLT5hdXRoX21ldGhvZCAhPSB1YUNlcnQpCgkJewoJCQlzd2l0Y2gg KHBvcnQtPmhiYS0+Y2xpZW50Y2VydG5hbWUpCgkJCXsKCQkJCWNhc2UgY2xpZW50Q2VydEROOgoJ CQkJCWVyZXBvcnQoTE9HLAoJCQkJCQkJKGVycm1zZygiY2VydGlmaWNhdGUgdmFsaWRhdGlvbiAo Y2xpZW50Y2VydD12ZXJpZnktZnVsbCkgZmFpbGVkIGZvciB1c2VyIFwiJXNcIjogRE4gbWlzbWF0 Y2giLAoJCQkJCQkJCQlwb3J0LT51c2VyX25hbWUpKSk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIGNs aWVudENlcnRDTjoKCQkJCQllcmVwb3J0KExPRywKCQkJCQkJCShlcnJtc2coImNlcnRpZmljYXRl IHZhbGlkYXRpb24gKGNsaWVudGNlcnQ9dmVyaWZ5LWZ1bGwpIGZhaWxlZCBmb3IgdXNlciBcIiVz XCI6IENOIG1pc21hdGNoIiwKCQkJCQkJCQkJcG9ydC0+dXNlcl9uYW1lKSkpOwoJCQl9CgkJfQoJ fQoJcmV0dXJuIHN0YXR1c19jaGVja191c2VybWFwOwp9CiNlbmRpZgoKCi8qLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBS QURJVVMgYXV0aGVudGljYXRpb24KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKLyoKICogUkFESVVTIGF1dGhlbnRp Y2F0aW9uIGlzIGRlc2NyaWJlZCBpbiBSRkMyODY1IChhbmQgc2V2ZXJhbCBvdGhlcnMpLgogKi8K CiNkZWZpbmUgUkFESVVTX1ZFQ1RPUl9MRU5HVEggMTYKI2RlZmluZSBSQURJVVNfSEVBREVSX0xF TkdUSCAyMAojZGVmaW5lIFJBRElVU19NQVhfUEFTU1dPUkRfTEVOR1RIIDEyOAoKLyogTWF4aW11 bSBzaXplIG9mIGEgUkFESVVTIHBhY2tldCB3ZSB3aWxsIGNyZWF0ZSBvciBhY2NlcHQgKi8KI2Rl ZmluZSBSQURJVVNfQlVGRkVSX1NJWkUgMTAyNAoKdHlwZWRlZiBzdHJ1Y3QKewoJdWludDgJCWF0 dHJpYnV0ZTsKCXVpbnQ4CQlsZW5ndGg7Cgl1aW50OAkJZGF0YVtGTEVYSUJMRV9BUlJBWV9NRU1C RVJdOwp9IHJhZGl1c19hdHRyaWJ1dGU7Cgp0eXBlZGVmIHN0cnVjdAp7Cgl1aW50OAkJY29kZTsK CXVpbnQ4CQlpZDsKCXVpbnQxNgkJbGVuZ3RoOwoJdWludDgJCXZlY3RvcltSQURJVVNfVkVDVE9S X0xFTkdUSF07CgkvKiB0aGlzIGlzIGEgYml0IGxvbmdlciB0aGFuIHN0cmljdGx5IG5lY2Vzc2Fy eTogKi8KCWNoYXIJCXBhZFtSQURJVVNfQlVGRkVSX1NJWkUgLSBSQURJVVNfVkVDVE9SX0xFTkdU SF07Cn0gcmFkaXVzX3BhY2tldDsKCi8qIFJBRElVUyBwYWNrZXQgdHlwZXMgKi8KI2RlZmluZSBS QURJVVNfQUNDRVNTX1JFUVVFU1QJMQojZGVmaW5lIFJBRElVU19BQ0NFU1NfQUNDRVBUCTIKI2Rl ZmluZSBSQURJVVNfQUNDRVNTX1JFSkVDVAkzCgovKiBSQURJVVMgYXR0cmlidXRlcyAqLwojZGVm aW5lIFJBRElVU19VU0VSX05BTUUJCTEKI2RlZmluZSBSQURJVVNfUEFTU1dPUkQJCQkyCiNkZWZp bmUgUkFESVVTX1NFUlZJQ0VfVFlQRQkJNgojZGVmaW5lIFJBRElVU19OQVNfSURFTlRJRklFUgkz MgoKLyogUkFESVVTIHNlcnZpY2UgdHlwZXMgKi8KI2RlZmluZSBSQURJVVNfQVVUSEVOVElDQVRF X09OTFkJOAoKLyogU2Vjb25kcyB0byB3YWl0IC0gWFhYOiBzaG91bGQgYmUgaW4gYSBjb25maWcg dmFyaWFibGUhICovCiNkZWZpbmUgUkFESVVTX1RJTUVPVVQgMwoKc3RhdGljIHZvaWQKcmFkaXVz X2FkZF9hdHRyaWJ1dGUocmFkaXVzX3BhY2tldCAqcGFja2V0LCB1aW50OCB0eXBlLCBjb25zdCB1 bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuKQp7CglyYWRpdXNfYXR0cmlidXRlICphdHRyOwoK CWlmIChwYWNrZXQtPmxlbmd0aCArIGxlbiA+IFJBRElVU19CVUZGRVJfU0laRSkKCXsKCQkvKgoJ CSAqIFdpdGggcmVtb3RlbHkgcmVhbGlzdGljIGRhdGEsIHRoaXMgY2FuIG5ldmVyIGhhcHBlbi4g QnV0IGNhdGNoIGl0CgkJICoganVzdCB0byBtYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcnJ1biBhIGJ1 ZmZlci4gV2UnbGwganVzdCBza2lwIGFkZGluZwoJCSAqIHRoZSBicm9rZW4gYXR0cmlidXRlLCB3 aGljaCB3aWxsIGluIHRoZSBlbmQgY2F1c2UgYXV0aGVudGljYXRpb24gdG8KCQkgKiBmYWlsLgoJ CSAqLwoJCWVsb2coV0FSTklORywKCQkJICJhZGRpbmcgYXR0cmlidXRlIGNvZGUgJWQgd2l0aCBs ZW5ndGggJWQgdG8gcmFkaXVzIHBhY2tldCB3b3VsZCBjcmVhdGUgb3ZlcnNpemUgcGFja2V0LCBp Z25vcmluZyIsCgkJCSB0eXBlLCBsZW4pOwoJCXJldHVybjsKCX0KCglhdHRyID0gKHJhZGl1c19h dHRyaWJ1dGUgKikgKCh1bnNpZ25lZCBjaGFyICopIHBhY2tldCArIHBhY2tldC0+bGVuZ3RoKTsK CWF0dHItPmF0dHJpYnV0ZSA9IHR5cGU7CglhdHRyLT5sZW5ndGggPSBsZW4gKyAyOwkJLyogdG90 YWwgc2l6ZSBpbmNsdWRlcyB0eXBlIGFuZCBsZW5ndGggKi8KCW1lbWNweShhdHRyLT5kYXRhLCBk YXRhLCBsZW4pOwoJcGFja2V0LT5sZW5ndGggKz0gYXR0ci0+bGVuZ3RoOwp9CgpzdGF0aWMgaW50 CkNoZWNrUkFESVVTQXV0aChQb3J0ICpwb3J0KQp7CgljaGFyCSAgICpwYXNzd2Q7CglMaXN0Q2Vs bCAgICpzZXJ2ZXIsCgkJCSAgICpzZWNyZXRzLAoJCQkgICAqcmFkaXVzcG9ydHMsCgkJCSAgICpp ZGVudGlmaWVyczsKCgkvKiBNYWtlIHN1cmUgc3RydWN0IGFsaWdubWVudCBpcyBjb3JyZWN0ICov CglBc3NlcnQob2Zmc2V0b2YocmFkaXVzX3BhY2tldCwgdmVjdG9yKSA9PSA0KTsKCgkvKiBWZXJp ZnkgcGFyYW1ldGVycyAqLwoJaWYgKHBvcnQtPmhiYS0+cmFkaXVzc2VydmVycyA9PSBOSUwpCgl7 CgkJZXJlcG9ydChMT0csCgkJCQkoZXJybXNnKCJSQURJVVMgc2VydmVyIG5vdCBzcGVjaWZpZWQi KSkpOwoJCXJldHVybiBTVEFUVVNfRVJST1I7Cgl9CgoJaWYgKHBvcnQtPmhiYS0+cmFkaXVzc2Vj cmV0cyA9PSBOSUwpCgl7CgkJZXJlcG9ydChMT0csCgkJCQkoZXJybXNnKCJSQURJVVMgc2VjcmV0 IG5vdCBzcGVjaWZpZWQiKSkpOwoJCXJldHVybiBTVEFUVVNfRVJST1I7Cgl9CgoJLyogU2VuZCBy ZWd1bGFyIHBhc3N3b3JkIHJlcXVlc3QgdG8gY2xpZW50LCBhbmQgZ2V0IHRoZSByZXNwb25zZSAq LwoJc2VuZEF1dGhSZXF1ZXN0KHBvcnQsIEFVVEhfUkVRX1BBU1NXT1JELCBOVUxMLCAwKTsKCglw YXNzd2QgPSByZWN2X3Bhc3N3b3JkX3BhY2tldChwb3J0KTsKCWlmIChwYXNzd2QgPT0gTlVMTCkK CQlyZXR1cm4gU1RBVFVTX0VPRjsJCS8qIGNsaWVudCB3b3VsZG4ndCBzZW5kIHBhc3N3b3JkICov CgoJaWYgKHN0cmxlbihwYXNzd2QpID4gUkFESVVTX01BWF9QQVNTV09SRF9MRU5HVEgpCgl7CgkJ ZXJlcG9ydChMT0csCgkJCQkoZXJybXNnKCJSQURJVVMgYXV0aGVudGljYXRpb24gZG9lcyBub3Qg c3VwcG9ydCBwYXNzd29yZHMgbG9uZ2VyIHRoYW4gJWQgY2hhcmFjdGVycyIsIFJBRElVU19NQVhf UEFTU1dPUkRfTEVOR1RIKSkpOwoJCXBmcmVlKHBhc3N3ZCk7CgkJcmV0dXJuIFNUQVRVU19FUlJP UjsKCX0KCgkvKgoJICogTG9vcCBvdmVyIGFuZCB0cnkgZWFjaCBzZXJ2ZXIgaW4gb3JkZXIuCgkg Ki8KCXNlY3JldHMgPSBsaXN0X2hlYWQocG9ydC0+aGJhLT5yYWRpdXNzZWNyZXRzKTsKCXJhZGl1 c3BvcnRzID0gbGlzdF9oZWFkKHBvcnQtPmhiYS0+cmFkaXVzcG9ydHMpOwoJaWRlbnRpZmllcnMg PSBsaXN0X2hlYWQocG9ydC0+aGJhLT5yYWRpdXNpZGVudGlmaWVycyk7Cglmb3JlYWNoKHNlcnZl ciwgcG9ydC0+aGJhLT5yYWRpdXNzZXJ2ZXJzKQoJewoJCWludAkJCXJldCA9IFBlcmZvcm1SYWRp dXNUcmFuc2FjdGlvbihsZmlyc3Qoc2VydmVyKSwKCQkJCQkJCQkJCQkJICAgbGZpcnN0KHNlY3Jl dHMpLAoJCQkJCQkJCQkJCQkgICByYWRpdXNwb3J0cyA/IGxmaXJzdChyYWRpdXNwb3J0cykgOiBO VUxMLAoJCQkJCQkJCQkJCQkgICBpZGVudGlmaWVycyA/IGxmaXJzdChpZGVudGlmaWVycykgOiBO VUxMLAoJCQkJCQkJCQkJCQkgICBwb3J0LT51c2VyX25hbWUsCgkJCQkJCQkJCQkJCSAgIHBhc3N3 ZCk7CgoJCS8qLS0tLS0tCgkJICogU1RBVFVTX09LID0gTG9naW4gT0sKCQkgKiBTVEFUVVNfRVJS T1IgPSBMb2dpbiBub3QgT0ssIGJ1dCB0cnkgbmV4dCBzZXJ2ZXIKCQkgKiBTVEFUVVNfRU9GID0g TG9naW4gbm90IE9LLCBhbmQgZG9uJ3QgdHJ5IG5leHQgc2VydmVyCgkJICotLS0tLS0KCQkgKi8K CQlpZiAocmV0ID09IFNUQVRVU19PSykKCQl7CgkJCXNldF9hdXRobl9pZChwb3J0LCBwb3J0LT51 c2VyX25hbWUpOwoKCQkJcGZyZWUocGFzc3dkKTsKCQkJcmV0dXJuIFNUQVRVU19PSzsKCQl9CgkJ ZWxzZSBpZiAocmV0ID09IFNUQVRVU19FT0YpCgkJewoJCQlwZnJlZShwYXNzd2QpOwoJCQlyZXR1 cm4gU1RBVFVTX0VSUk9SOwoJCX0KCgkJLyoKCQkgKiBzZWNyZXQsIHBvcnQgYW5kIGlkZW50aWZp ZXJzIGVpdGhlciBoYXZlIGxlbmd0aCAwICh1c2UgZGVmYXVsdCksCgkJICogbGVuZ3RoIDEgKHVz ZSB0aGUgc2FtZSBldmVyeXdoZXJlKSBvciB0aGUgc2FtZSBsZW5ndGggYXMgc2VydmVycy4KCQkg KiBTbyBpZiB0aGUgbGVuZ3RoIGlzID4xLCB3ZSBhZHZhbmNlIG9uZSBzdGVwLiBJbiBvdGhlciBj YXNlcywgd2UKCQkgKiBkb24ndCBhbmQgd2lsbCB0aGVuIHJldXNlIHRoZSBjb3JyZWN0IHZhbHVl LgoJCSAqLwoJCWlmIChsaXN0X2xlbmd0aChwb3J0LT5oYmEtPnJhZGl1c3NlY3JldHMpID4gMSkK CQkJc2VjcmV0cyA9IGxuZXh0KHBvcnQtPmhiYS0+cmFkaXVzc2VjcmV0cywgc2VjcmV0cyk7CgkJ aWYgKGxpc3RfbGVuZ3RoKHBvcnQtPmhiYS0+cmFkaXVzcG9ydHMpID4gMSkKCQkJcmFkaXVzcG9y dHMgPSBsbmV4dChwb3J0LT5oYmEtPnJhZGl1c3BvcnRzLCByYWRpdXNwb3J0cyk7CgkJaWYgKGxp c3RfbGVuZ3RoKHBvcnQtPmhiYS0+cmFkaXVzaWRlbnRpZmllcnMpID4gMSkKCQkJaWRlbnRpZmll cnMgPSBsbmV4dChwb3J0LT5oYmEtPnJhZGl1c2lkZW50aWZpZXJzLCBpZGVudGlmaWVycyk7Cgl9 CgoJLyogTm8gc2VydmVycyBsZWZ0IHRvIHRyeSwgc28gZ2l2ZSB1cCAqLwoJcGZyZWUocGFzc3dk KTsKCXJldHVybiBTVEFUVVNfRVJST1I7Cn0KCnN0YXRpYyBpbnQKUGVyZm9ybVJhZGl1c1RyYW5z YWN0aW9uKGNvbnN0IGNoYXIgKnNlcnZlciwgY29uc3QgY2hhciAqc2VjcmV0LCBjb25zdCBjaGFy ICpwb3J0c3RyLCBjb25zdCBjaGFyICppZGVudGlmaWVyLCBjb25zdCBjaGFyICp1c2VyX25hbWUs IGNvbnN0IGNoYXIgKnBhc3N3ZCkKewoJcmFkaXVzX3BhY2tldCByYWRpdXNfc2VuZF9wYWNrOwoJ cmFkaXVzX3BhY2tldCByYWRpdXNfcmVjdl9wYWNrOwoJcmFkaXVzX3BhY2tldCAqcGFja2V0ID0g JnJhZGl1c19zZW5kX3BhY2s7CglyYWRpdXNfcGFja2V0ICpyZWNlaXZlcGFja2V0ID0gJnJhZGl1 c19yZWN2X3BhY2s7CgljaGFyCSAgICpyYWRpdXNfYnVmZmVyID0gKGNoYXIgKikgJnJhZGl1c19z ZW5kX3BhY2s7CgljaGFyCSAgICpyZWNlaXZlX2J1ZmZlciA9IChjaGFyICopICZyYWRpdXNfcmVj dl9wYWNrOwoJaW50MzIJCXNlcnZpY2UgPSBwZ19odG9uMzIoUkFESVVTX0FVVEhFTlRJQ0FURV9P TkxZKTsKCXVpbnQ4CSAgICpjcnlwdHZlY3RvcjsKCWludAkJCWVuY3J5cHRlZHBhc3N3b3JkbGVu OwoJdWludDgJCWVuY3J5cHRlZHBhc3N3b3JkW1JBRElVU19NQVhfUEFTU1dPUkRfTEVOR1RIXTsK CXVpbnQ4CSAgICptZDV0cmFpbGVyOwoJaW50CQkJcGFja2V0bGVuZ3RoOwoJcGdzb2NrZXQJc29j azsKCglzdHJ1Y3Qgc29ja2FkZHJfaW42IGxvY2FsYWRkcjsKCXN0cnVjdCBzb2NrYWRkcl9pbjYg cmVtb3RlYWRkcjsKCXN0cnVjdCBhZGRyaW5mbyBoaW50OwoJc3RydWN0IGFkZHJpbmZvICpzZXJ2 ZXJhZGRyczsKCWludAkJCXBvcnQ7Cglzb2NrbGVuX3QJYWRkcnNpemU7CglmZF9zZXQJCWZkc2V0 OwoJc3RydWN0IHRpbWV2YWwgZW5kdGltZTsKCWludAkJCWksCgkJCQlqLAoJCQkJcjsKCgkvKiBB c3NpZ24gZGVmYXVsdCB2YWx1ZXMgKi8KCWlmIChwb3J0c3RyID09IE5VTEwpCgkJcG9ydHN0ciA9 ICIxODEyIjsKCWlmIChpZGVudGlmaWVyID09IE5VTEwpCgkJaWRlbnRpZmllciA9ICJwb3N0Z3Jl c3FsIjsKCglNZW1TZXQoJmhpbnQsIDAsIHNpemVvZihoaW50KSk7CgloaW50LmFpX3NvY2t0eXBl ID0gU09DS19ER1JBTTsKCWhpbnQuYWlfZmFtaWx5ID0gQUZfVU5TUEVDOwoJcG9ydCA9IGF0b2ko cG9ydHN0cik7CgoJciA9IHBnX2dldGFkZHJpbmZvX2FsbChzZXJ2ZXIsIHBvcnRzdHIsICZoaW50 LCAmc2VydmVyYWRkcnMpOwoJaWYgKHIgfHwgIXNlcnZlcmFkZHJzKQoJewoJCWVyZXBvcnQoTE9H LAoJCQkJKGVycm1zZygiY291bGQgbm90IHRyYW5zbGF0ZSBSQURJVVMgc2VydmVyIG5hbWUgXCIl c1wiIHRvIGFkZHJlc3M6ICVzIiwKCQkJCQkJc2VydmVyLCBnYWlfc3RyZXJyb3IocikpKSk7CgkJ aWYgKHNlcnZlcmFkZHJzKQoJCQlwZ19mcmVlYWRkcmluZm9fYWxsKGhpbnQuYWlfZmFtaWx5LCBz ZXJ2ZXJhZGRycyk7CgkJcmV0dXJuIFNUQVRVU19FUlJPUjsKCX0KCS8qIFhYWDogYWRkIHN1cHBv cnQgZm9yIG11bHRpcGxlIHJldHVybmVkIGFkZHJlc3Nlcz8gKi8KCgkvKiBDb25zdHJ1Y3QgUkFE SVVTIHBhY2tldCAqLwoJcGFja2V0LT5jb2RlID0gUkFESVVTX0FDQ0VTU19SRVFVRVNUOwoJcGFj a2V0LT5sZW5ndGggPSBSQURJVVNfSEVBREVSX0xFTkdUSDsKCWlmICghcGdfc3Ryb25nX3JhbmRv bShwYWNrZXQtPnZlY3RvciwgUkFESVVTX1ZFQ1RPUl9MRU5HVEgpKQoJewoJCWVyZXBvcnQoTE9H LAoJCQkJKGVycm1zZygiY291bGQgbm90IGdlbmVyYXRlIHJhbmRvbSBlbmNyeXB0aW9uIHZlY3Rv ciIpKSk7CgkJcGdfZnJlZWFkZHJpbmZvX2FsbChoaW50LmFpX2ZhbWlseSwgc2VydmVyYWRkcnMp OwoJCXJldHVybiBTVEFUVVNfRVJST1I7Cgl9CglwYWNrZXQtPmlkID0gcGFja2V0LT52ZWN0b3Jb MF07CglyYWRpdXNfYWRkX2F0dHJpYnV0ZShwYWNrZXQsIFJBRElVU19TRVJWSUNFX1RZUEUsIChj b25zdCB1bnNpZ25lZCBjaGFyICopICZzZXJ2aWNlLCBzaXplb2Yoc2VydmljZSkpOwoJcmFkaXVz X2FkZF9hdHRyaWJ1dGUocGFja2V0LCBSQURJVVNfVVNFUl9OQU1FLCAoY29uc3QgdW5zaWduZWQg Y2hhciAqKSB1c2VyX25hbWUsIHN0cmxlbih1c2VyX25hbWUpKTsKCXJhZGl1c19hZGRfYXR0cmli dXRlKHBhY2tldCwgUkFESVVTX05BU19JREVOVElGSUVSLCAoY29uc3QgdW5zaWduZWQgY2hhciAq KSBpZGVudGlmaWVyLCBzdHJsZW4oaWRlbnRpZmllcikpOwoKCS8qCgkgKiBSQURJVVMgcGFzc3dv cmQgYXR0cmlidXRlcyBhcmUgY2FsY3VsYXRlZCBhczogZVswXSA9IHBbMF0gWE9SCgkgKiBNRDUo c2VjcmV0ICsgUmVxdWVzdCBBdXRoZW50aWNhdG9yKSBmb3IgdGhlIGZpcnN0IGdyb3VwIG9mIDE2 IG9jdGV0cywKCSAqIGFuZCB0aGVuOiBlW2ldID0gcFtpXSBYT1IgTUQ1KHNlY3JldCArIGVbaS0x XSkgZm9yIHRoZSBmb2xsb3dpbmcgb25lcwoJICogKGlmIG5lY2Vzc2FyeSkKCSAqLwoJZW5jcnlw dGVkcGFzc3dvcmRsZW4gPSAoKHN0cmxlbihwYXNzd2QpICsgUkFESVVTX1ZFQ1RPUl9MRU5HVEgg LSAxKSAvIFJBRElVU19WRUNUT1JfTEVOR1RIKSAqIFJBRElVU19WRUNUT1JfTEVOR1RIOwoJY3J5 cHR2ZWN0b3IgPSBwYWxsb2Moc3RybGVuKHNlY3JldCkgKyBSQURJVVNfVkVDVE9SX0xFTkdUSCk7 CgltZW1jcHkoY3J5cHR2ZWN0b3IsIHNlY3JldCwgc3RybGVuKHNlY3JldCkpOwoKCS8qIGZvciB0 aGUgZmlyc3QgaXRlcmF0aW9uLCB3ZSB1c2UgdGhlIFJlcXVlc3QgQXV0aGVudGljYXRvciB2ZWN0 b3IgKi8KCW1kNXRyYWlsZXIgPSBwYWNrZXQtPnZlY3RvcjsKCWZvciAoaSA9IDA7IGkgPCBlbmNy eXB0ZWRwYXNzd29yZGxlbjsgaSArPSBSQURJVVNfVkVDVE9SX0xFTkdUSCkKCXsKCQljb25zdCBj aGFyICplcnJzdHIgPSBOVUxMOwoKCQltZW1jcHkoY3J5cHR2ZWN0b3IgKyBzdHJsZW4oc2VjcmV0 KSwgbWQ1dHJhaWxlciwgUkFESVVTX1ZFQ1RPUl9MRU5HVEgpOwoKCQkvKgoJCSAqIC4uIGFuZCBm b3Igc3Vic2VxdWVudCBpdGVyYXRpb25zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIFhPUgoJ CSAqIChjYWxjdWxhdGVkIGJlbG93KQoJCSAqLwoJCW1kNXRyYWlsZXIgPSBlbmNyeXB0ZWRwYXNz d29yZCArIGk7CgoJCWlmICghcGdfbWQ1X2JpbmFyeShjcnlwdHZlY3Rvciwgc3RybGVuKHNlY3Jl dCkgKyBSQURJVVNfVkVDVE9SX0xFTkdUSCwKCQkJCQkJICAgZW5jcnlwdGVkcGFzc3dvcmQgKyBp LCAmZXJyc3RyKSkKCQl7CgkJCWVyZXBvcnQoTE9HLAoJCQkJCShlcnJtc2coImNvdWxkIG5vdCBw ZXJmb3JtIE1ENSBlbmNyeXB0aW9uIG9mIHBhc3N3b3JkOiAlcyIsCgkJCQkJCQllcnJzdHIpKSk7 CgkJCXBmcmVlKGNyeXB0dmVjdG9yKTsKCQkJcGdfZnJlZWFkZHJpbmZvX2FsbChoaW50LmFpX2Zh bWlseSwgc2VydmVyYWRkcnMpOwoJCQlyZXR1cm4gU1RBVFVTX0VSUk9SOwoJCX0KCgkJZm9yIChq ID0gaTsgaiA8IGkgKyBSQURJVVNfVkVDVE9SX0xFTkdUSDsgaisrKQoJCXsKCQkJaWYgKGogPCBz dHJsZW4ocGFzc3dkKSkKCQkJCWVuY3J5cHRlZHBhc3N3b3JkW2pdID0gcGFzc3dkW2pdIF4gZW5j cnlwdGVkcGFzc3dvcmRbal07CgkJCWVsc2UKCQkJCWVuY3J5cHRlZHBhc3N3b3JkW2pdID0gJ1ww JyBeIGVuY3J5cHRlZHBhc3N3b3JkW2pdOwoJCX0KCX0KCXBmcmVlKGNyeXB0dmVjdG9yKTsKCgly YWRpdXNfYWRkX2F0dHJpYnV0ZShwYWNrZXQsIFJBRElVU19QQVNTV09SRCwgZW5jcnlwdGVkcGFz c3dvcmQsIGVuY3J5cHRlZHBhc3N3b3JkbGVuKTsKCgkvKiBMZW5ndGggbmVlZHMgdG8gYmUgaW4g bmV0d29yayBvcmRlciBvbiB0aGUgd2lyZSAqLwoJcGFja2V0bGVuZ3RoID0gcGFja2V0LT5sZW5n dGg7CglwYWNrZXQtPmxlbmd0aCA9IHBnX2h0b24xNihwYWNrZXQtPmxlbmd0aCk7CgoJc29jayA9 IHNvY2tldChzZXJ2ZXJhZGRyc1swXS5haV9mYW1pbHksIFNPQ0tfREdSQU0sIDApOwoJaWYgKHNv Y2sgPT0gUEdJTlZBTElEX1NPQ0tFVCkKCXsKCQllcmVwb3J0KExPRywKCQkJCShlcnJtc2coImNv dWxkIG5vdCBjcmVhdGUgUkFESVVTIHNvY2tldDogJW0iKSkpOwoJCXBnX2ZyZWVhZGRyaW5mb19h bGwoaGludC5haV9mYW1pbHksIHNlcnZlcmFkZHJzKTsKCQlyZXR1cm4gU1RBVFVTX0VSUk9SOwoJ fQoKCW1lbXNldCgmbG9jYWxhZGRyLCAwLCBzaXplb2YobG9jYWxhZGRyKSk7Cglsb2NhbGFkZHIu c2luNl9mYW1pbHkgPSBzZXJ2ZXJhZGRyc1swXS5haV9mYW1pbHk7Cglsb2NhbGFkZHIuc2luNl9h ZGRyID0gaW42YWRkcl9hbnk7CglpZiAobG9jYWxhZGRyLnNpbjZfZmFtaWx5ID09IEFGX0lORVQ2 KQoJCWFkZHJzaXplID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOwoJZWxzZQoJCWFkZHJz aXplID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CgoJaWYgKGJpbmQoc29jaywgKHN0cnVj dCBzb2NrYWRkciAqKSAmbG9jYWxhZGRyLCBhZGRyc2l6ZSkpCgl7CgkJZXJlcG9ydChMT0csCgkJ CQkoZXJybXNnKCJjb3VsZCBub3QgYmluZCBsb2NhbCBSQURJVVMgc29ja2V0OiAlbSIpKSk7CgkJ Y2xvc2Vzb2NrZXQoc29jayk7CgkJcGdfZnJlZWFkZHJpbmZvX2FsbChoaW50LmFpX2ZhbWlseSwg c2VydmVyYWRkcnMpOwoJCXJldHVybiBTVEFUVVNfRVJST1I7Cgl9CgoJaWYgKHNlbmR0byhzb2Nr LCByYWRpdXNfYnVmZmVyLCBwYWNrZXRsZW5ndGgsIDAsCgkJCSAgIHNlcnZlcmFkZHJzWzBdLmFp X2FkZHIsIHNlcnZlcmFkZHJzWzBdLmFpX2FkZHJsZW4pIDwgMCkKCXsKCQllcmVwb3J0KExPRywK CQkJCShlcnJtc2coImNvdWxkIG5vdCBzZW5kIFJBRElVUyBwYWNrZXQ6ICVtIikpKTsKCQljbG9z ZXNvY2tldChzb2NrKTsKCQlwZ19mcmVlYWRkcmluZm9fYWxsKGhpbnQuYWlfZmFtaWx5LCBzZXJ2 ZXJhZGRycyk7CgkJcmV0dXJuIFNUQVRVU19FUlJPUjsKCX0KCgkvKiBEb24ndCBuZWVkIHRoZSBz ZXJ2ZXIgYWRkcmVzcyBhbnltb3JlICovCglwZ19mcmVlYWRkcmluZm9fYWxsKGhpbnQuYWlfZmFt aWx5LCBzZXJ2ZXJhZGRycyk7CgoJLyoKCSAqIEZpZ3VyZSBvdXQgYXQgd2hhdCB0aW1lIHdlIHNo b3VsZCB0aW1lIG91dC4gV2UgY2FuJ3QganVzdCB1c2UgYSBzaW5nbGUKCSAqIGNhbGwgdG8gc2Vs ZWN0KCkgd2l0aCBhIHRpbWVvdXQsIHNpbmNlIHNvbWVib2R5IGNhbiBiZSBzZW5kaW5nIGludmFs aWQKCSAqIHBhY2tldHMgdG8gb3VyIHBvcnQgdGh1cyBjYXVzaW5nIHVzIHRvIHJldHJ5IGluIGEg bG9vcCBhbmQgbmV2ZXIgdGltZQoJICogb3V0LgoJICoKCSAqIFhYWDogVXNpbmcgV2FpdExhdGNo T3JTb2NrZXQoKSBhbmQgZG9pbmcgYSBDSEVDS19GT1JfSU5URVJSVVBUUygpIGlmCgkgKiB0aGUg bGF0Y2ggd2FzIHNldCB3b3VsZCBpbXByb3ZlIHRoZSByZXNwb25zaXZlbmVzcyB0bwoJICogdGlt ZW91dHMvY2FuY2VsbGF0aW9ucy4KCSAqLwoJZ2V0dGltZW9mZGF5KCZlbmR0aW1lLCBOVUxMKTsK CWVuZHRpbWUudHZfc2VjICs9IFJBRElVU19USU1FT1VUOwoKCXdoaWxlICh0cnVlKQoJewoJCXN0 cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CgkJc3RydWN0IHRpbWV2YWwgbm93OwoJCWludDY0CQl0aW1l b3V0dmFsOwoJCWNvbnN0IGNoYXIgKmVycnN0ciA9IE5VTEw7CgoJCWdldHRpbWVvZmRheSgmbm93 LCBOVUxMKTsKCQl0aW1lb3V0dmFsID0gKGVuZHRpbWUudHZfc2VjICogMTAwMDAwMCArIGVuZHRp bWUudHZfdXNlYykgLSAobm93LnR2X3NlYyAqIDEwMDAwMDAgKyBub3cudHZfdXNlYyk7CgkJaWYg KHRpbWVvdXR2YWwgPD0gMCkKCQl7CgkJCWVyZXBvcnQoTE9HLAoJCQkJCShlcnJtc2coInRpbWVv dXQgd2FpdGluZyBmb3IgUkFESVVTIHJlc3BvbnNlIGZyb20gJXMiLAoJCQkJCQkJc2VydmVyKSkp OwoJCQljbG9zZXNvY2tldChzb2NrKTsKCQkJcmV0dXJuIFNUQVRVU19FUlJPUjsKCQl9CgkJdGlt ZW91dC50dl9zZWMgPSB0aW1lb3V0dmFsIC8gMTAwMDAwMDsKCQl0aW1lb3V0LnR2X3VzZWMgPSB0 aW1lb3V0dmFsICUgMTAwMDAwMDsKCgkJRkRfWkVSTygmZmRzZXQpOwoJCUZEX1NFVChzb2NrLCAm ZmRzZXQpOwoKCQlyID0gc2VsZWN0KHNvY2sgKyAxLCAmZmRzZXQsIE5VTEwsIE5VTEwsICZ0aW1l b3V0KTsKCQlpZiAociA8IDApCgkJewoJCQlpZiAoZXJybm8gPT0gRUlOVFIpCgkJCQljb250aW51 ZTsKCgkJCS8qIEFueXRoaW5nIGVsc2UgaXMgYW4gYWN0dWFsIGVycm9yICovCgkJCWVyZXBvcnQo TE9HLAoJCQkJCShlcnJtc2coImNvdWxkIG5vdCBjaGVjayBzdGF0dXMgb24gUkFESVVTIHNvY2tl dDogJW0iKSkpOwoJCQljbG9zZXNvY2tldChzb2NrKTsKCQkJcmV0dXJuIFNUQVRVU19FUlJPUjsK CQl9CgkJaWYgKHIgPT0gMCkKCQl7CgkJCWVyZXBvcnQoTE9HLAoJCQkJCShlcnJtc2coInRpbWVv dXQgd2FpdGluZyBmb3IgUkFESVVTIHJlc3BvbnNlIGZyb20gJXMiLAoJCQkJCQkJc2VydmVyKSkp OwoJCQljbG9zZXNvY2tldChzb2NrKTsKCQkJcmV0dXJuIFNUQVRVU19FUlJPUjsKCQl9CgoJCS8q CgkJICogQXR0ZW1wdCB0byByZWFkIHRoZSByZXNwb25zZSBwYWNrZXQsIGFuZCB2ZXJpZnkgdGhl IGNvbnRlbnRzLgoJCSAqCgkJICogQW55IHBhY2tldCB0aGF0J3Mgbm90IGFjdHVhbGx5IGEgUkFE SVVTIHBhY2tldCwgb3Igb3RoZXJ3aXNlIGRvZXMKCQkgKiBub3QgdmFsaWRhdGUgYXMgYW4gZXhw bGljaXQgcmVqZWN0LCBpcyBqdXN0IGlnbm9yZWQgYW5kIHdlIHJldHJ5CgkJICogZm9yIGFub3Ro ZXIgcGFja2V0ICh1bnRpbCB3ZSByZWFjaCB0aGUgdGltZW91dCkuIFRoaXMgaXMgdG8gYXZvaWQK CQkgKiB0aGUgcG9zc2liaWxpdHkgdG8gZGVuaWFsLW9mLXNlcnZpY2UgdGhlIGxvZ2luIGJ5IGZs b29kaW5nIHRoZQoJCSAqIHNlcnZlciB3aXRoIGludmFsaWQgcGFja2V0cyBvbiB0aGUgcG9ydCB0 aGF0IHdlJ3JlIGV4cGVjdGluZyB0aGUKCQkgKiBSQURJVVMgcmVzcG9uc2Ugb24uCgkJICovCgoJ CWFkZHJzaXplID0gc2l6ZW9mKHJlbW90ZWFkZHIpOwoJCXBhY2tldGxlbmd0aCA9IHJlY3Zmcm9t KHNvY2ssIHJlY2VpdmVfYnVmZmVyLCBSQURJVVNfQlVGRkVSX1NJWkUsIDAsCgkJCQkJCQkJKHN0 cnVjdCBzb2NrYWRkciAqKSAmcmVtb3RlYWRkciwgJmFkZHJzaXplKTsKCQlpZiAocGFja2V0bGVu Z3RoIDwgMCkKCQl7CgkJCWVyZXBvcnQoTE9HLAoJCQkJCShlcnJtc2coImNvdWxkIG5vdCByZWFk IFJBRElVUyByZXNwb25zZTogJW0iKSkpOwoJCQljbG9zZXNvY2tldChzb2NrKTsKCQkJcmV0dXJu IFNUQVRVU19FUlJPUjsKCQl9CgoJCWlmIChyZW1vdGVhZGRyLnNpbjZfcG9ydCAhPSBwZ19odG9u MTYocG9ydCkpCgkJewoJCQllcmVwb3J0KExPRywKCQkJCQkoZXJybXNnKCJSQURJVVMgcmVzcG9u c2UgZnJvbSAlcyB3YXMgc2VudCBmcm9tIGluY29ycmVjdCBwb3J0OiAlZCIsCgkJCQkJCQlzZXJ2 ZXIsIHBnX250b2gxNihyZW1vdGVhZGRyLnNpbjZfcG9ydCkpKSk7CgkJCWNvbnRpbnVlOwoJCX0K CgkJaWYgKHBhY2tldGxlbmd0aCA8IFJBRElVU19IRUFERVJfTEVOR1RIKQoJCXsKCQkJZXJlcG9y dChMT0csCgkJCQkJKGVycm1zZygiUkFESVVTIHJlc3BvbnNlIGZyb20gJXMgdG9vIHNob3J0OiAl ZCIsIHNlcnZlciwgcGFja2V0bGVuZ3RoKSkpOwoJCQljb250aW51ZTsKCQl9CgoJCWlmIChwYWNr ZXRsZW5ndGggIT0gcGdfbnRvaDE2KHJlY2VpdmVwYWNrZXQtPmxlbmd0aCkpCgkJewoJCQllcmVw b3J0KExPRywKCQkJCQkoZXJybXNnKCJSQURJVVMgcmVzcG9uc2UgZnJvbSAlcyBoYXMgY29ycnVw dCBsZW5ndGg6ICVkIChhY3R1YWwgbGVuZ3RoICVkKSIsCgkJCQkJCQlzZXJ2ZXIsIHBnX250b2gx NihyZWNlaXZlcGFja2V0LT5sZW5ndGgpLCBwYWNrZXRsZW5ndGgpKSk7CgkJCWNvbnRpbnVlOwoJ CX0KCgkJaWYgKHBhY2tldC0+aWQgIT0gcmVjZWl2ZXBhY2tldC0+aWQpCgkJewoJCQllcmVwb3J0 KExPRywKCQkJCQkoZXJybXNnKCJSQURJVVMgcmVzcG9uc2UgZnJvbSAlcyBpcyB0byBhIGRpZmZl cmVudCByZXF1ZXN0OiAlZCAoc2hvdWxkIGJlICVkKSIsCgkJCQkJCQlzZXJ2ZXIsIHJlY2VpdmVw YWNrZXQtPmlkLCBwYWNrZXQtPmlkKSkpOwoJCQljb250aW51ZTsKCQl9CgoJCS8qCgkJICogVmVy aWZ5IHRoZSByZXNwb25zZSBhdXRoZW50aWNhdG9yLCB3aGljaCBpcyBjYWxjdWxhdGVkIGFzCgkJ ICogTUQ1KENvZGUrSUQrTGVuZ3RoK1JlcXVlc3RBdXRoZW50aWNhdG9yK0F0dHJpYnV0ZXMrU2Vj cmV0KQoJCSAqLwoJCWNyeXB0dmVjdG9yID0gcGFsbG9jKHBhY2tldGxlbmd0aCArIHN0cmxlbihz ZWNyZXQpKTsKCgkJbWVtY3B5KGNyeXB0dmVjdG9yLCByZWNlaXZlcGFja2V0LCA0KTsJLyogY29k ZStpZCtsZW5ndGggKi8KCQltZW1jcHkoY3J5cHR2ZWN0b3IgKyA0LCBwYWNrZXQtPnZlY3Rvciwg UkFESVVTX1ZFQ1RPUl9MRU5HVEgpOwkvKiByZXF1ZXN0CgkJCQkJCQkJCQkJCQkJCQkJCSAqIGF1 dGhlbnRpY2F0b3IsIGZyb20KCQkJCQkJCQkJCQkJCQkJCQkJICogb3JpZ2luYWwgcGFja2V0ICov CgkJaWYgKHBhY2tldGxlbmd0aCA+IFJBRElVU19IRUFERVJfTEVOR1RIKQkvKiB0aGVyZSBtYXkg YmUgbm8KCQkJCQkJCQkJCQkJCSAqIGF0dHJpYnV0ZXMgYXQgYWxsICovCgkJCW1lbWNweShjcnlw dHZlY3RvciArIFJBRElVU19IRUFERVJfTEVOR1RILCByZWNlaXZlX2J1ZmZlciArIFJBRElVU19I RUFERVJfTEVOR1RILCBwYWNrZXRsZW5ndGggLSBSQURJVVNfSEVBREVSX0xFTkdUSCk7CgkJbWVt Y3B5KGNyeXB0dmVjdG9yICsgcGFja2V0bGVuZ3RoLCBzZWNyZXQsIHN0cmxlbihzZWNyZXQpKTsK CgkJaWYgKCFwZ19tZDVfYmluYXJ5KGNyeXB0dmVjdG9yLAoJCQkJCQkgICBwYWNrZXRsZW5ndGgg KyBzdHJsZW4oc2VjcmV0KSwKCQkJCQkJICAgZW5jcnlwdGVkcGFzc3dvcmQsICZlcnJzdHIpKQoJ CXsKCQkJZXJlcG9ydChMT0csCgkJCQkJKGVycm1zZygiY291bGQgbm90IHBlcmZvcm0gTUQ1IGVu Y3J5cHRpb24gb2YgcmVjZWl2ZWQgcGFja2V0OiAlcyIsCgkJCQkJCQllcnJzdHIpKSk7CgkJCXBm cmVlKGNyeXB0dmVjdG9yKTsKCQkJY29udGludWU7CgkJfQoJCXBmcmVlKGNyeXB0dmVjdG9yKTsK CgkJaWYgKG1lbWNtcChyZWNlaXZlcGFja2V0LT52ZWN0b3IsIGVuY3J5cHRlZHBhc3N3b3JkLCBS QURJVVNfVkVDVE9SX0xFTkdUSCkgIT0gMCkKCQl7CgkJCWVyZXBvcnQoTE9HLAoJCQkJCShlcnJt c2coIlJBRElVUyByZXNwb25zZSBmcm9tICVzIGhhcyBpbmNvcnJlY3QgTUQ1IHNpZ25hdHVyZSIs CgkJCQkJCQlzZXJ2ZXIpKSk7CgkJCWNvbnRpbnVlOwoJCX0KCgkJaWYgKHJlY2VpdmVwYWNrZXQt PmNvZGUgPT0gUkFESVVTX0FDQ0VTU19BQ0NFUFQpCgkJewoJCQljbG9zZXNvY2tldChzb2NrKTsK CQkJcmV0dXJuIFNUQVRVU19PSzsKCQl9CgkJZWxzZSBpZiAocmVjZWl2ZXBhY2tldC0+Y29kZSA9 PSBSQURJVVNfQUNDRVNTX1JFSkVDVCkKCQl7CgkJCWNsb3Nlc29ja2V0KHNvY2spOwoJCQlyZXR1 cm4gU1RBVFVTX0VPRjsKCQl9CgkJZWxzZQoJCXsKCQkJZXJlcG9ydChMT0csCgkJCQkJKGVycm1z ZygiUkFESVVTIHJlc3BvbnNlIGZyb20gJXMgaGFzIGludmFsaWQgY29kZSAoJWQpIGZvciB1c2Vy IFwiJXNcIiIsCgkJCQkJCQlzZXJ2ZXIsIHJlY2VpdmVwYWNrZXQtPmNvZGUsIHVzZXJfbmFtZSkp KTsKCQkJY29udGludWU7CgkJfQoJfQkJCQkJCQkvKiB3aGlsZSAodHJ1ZSkgKi8KfQo= --_002_SY7PR01MB9007B2AA3CC9763E13C9B630C7DB2SY7PR01MB9007ausp_--