Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wXH35-003ANd-1h for pgsql-hackers@arkaria.postgresql.org; Wed, 10 Jun 2026 11:24:44 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wXH34-00B08O-0a for pgsql-hackers@arkaria.postgresql.org; Wed, 10 Jun 2026 11:24:42 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wXH33-00B08G-2J for pgsql-hackers@lists.postgresql.org; Wed, 10 Jun 2026 11:24:41 +0000 Received: from mail-ed1-x52a.google.com ([2a00:1450:4864:20::52a]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wXH2y-00000002Jv9-0oCu for pgsql-hackers@lists.postgresql.org; Wed, 10 Jun 2026 11:24:38 +0000 Received: by mail-ed1-x52a.google.com with SMTP id 4fb4d7f45d1cf-68d23396ed3so11883834a12.1 for ; Wed, 10 Jun 2026 04:24:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1781090674; cv=none; d=google.com; s=arc-20240605; b=O+e9f7nlwwF3iMlDDvOP0QsDfesYQeMulTrD3rENKRDxmT8xw1NIOlGpoRTm2QcwUz OnBqWM2r5toZxemwYeEOGAIo+nN+P2/PeC9+6b6+7Y4YKlkZYOpqu8IeeAU01PegUKpb Pc2ejiuStnmwjYczOoe40oytPMEaNFhrdMeGoAShjNdwLigmUl/PYFiIqYtrtHSoyz+6 kJ1XWQQD3FHNGAcJZS79zAEJShDGVZoLJKxmSzpcN6IU4w3meDKTFV/eeEZMxfGrc+TW BwkaQtaO4lHMfxszcZqr7XSUXBqOvm2LgjNuqRs5dXEXmSpDrca1T4oepY2siJUmUefg LNQw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=dMTBIEoZ2KnSNK5NaInsnmdfrdzIRh+VFg13YgM4beA=; fh=jA1y0o48KsEr1ncbKeaqgkONBUmAh+4Dc8UAqTSPpFs=; b=IXY1LdNgB6TNhs7oc3Gptz23huFQpf0pyDkGg+x/O7hUPY9Ta+mKR8ZyPnumJerKZt pBsr+p7s+V132+s/O8P+Bi7SMOed0DrJaGcDlkgqBGLMb6+X/2pHz51lELBnGLnQxjz+ OaRb1wUGnjOR6salP76tsf6Nk5iZYA1NzYQRktlIkHO7twACAk8EVlQADpvjWpqGtyeG SGDpsW7THc1JXlJQ7vf+mTfmJPURU+M3WCjDSDAfWK/uAhn03y78kcL0HVhbDnp/T1pp Fdo2gQyk4bbKBWXYUWIWMXwgUnIYZoCg9z8kdwekDJt5MJZ9eI2qAPK52qIH9ExdHrNv H+Zg==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; t=1781090674; x=1781695474; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=dMTBIEoZ2KnSNK5NaInsnmdfrdzIRh+VFg13YgM4beA=; b=dZMBt5P1TDlgM9f+3NGj0Ewz25Ppm/kpxXnSlfDjCcadpw6nA3yg/4WDRp8kYiz1t8 8bHaUD2qJQcL+hIBhzKM6k9yZ7UzaaAvIJ6AlVPony+CowE80VBkwBQhmz4dHTHKQQSu yJWJEH66wMePBgCn6n5FuqSjUTVvRjjTwOLUSCi/cu4cRje8mckH/MQRhmuI9W0vmbFw S+EoOs2TDUejIBQzXOVjIEAEnm7oDOdz3veGPXFYsvaMP8xNv12bEdnXKxI4M1Ra6OJ/ MYiHExmeI2jBExt5+MGW7iQn799XJziFmfth9npHYyJZgR0EpjoxWDxRnqSiTRTbeSm0 eJ+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781090674; x=1781695474; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=dMTBIEoZ2KnSNK5NaInsnmdfrdzIRh+VFg13YgM4beA=; b=lhhX1d1S7oyv9tBGSqaZPQvf+ufLju+8EkxVeo6X0N28DaAIodVksN4dUDcJk8gAho 41qBs1NQ+RohaNgcjEu/GMt90hSZpGZ56LseC5me+llkkWPgAZLlGe+ZU+dIVpW4cq11 elFpmk+/6sp3UllrAqx6ltS6wKZT4Oq9FN+IVmdAMM1ksKSSJPDCsF50RtX3zwOXdEZc MKr1XnaakPQ6Y8Fn5Gr8/IMlMxyiIALO1fc1JERUm2jGAWOlYoh3fFYcflnj3DsxnnZp b9pU+ZQdXrrIGmjIgxx+oL879k64050tMD22Aehc9LM3fisgIvZly/RPn5hl3d7xJ+V0 l5OQ== X-Gm-Message-State: AOJu0Yz4V7WNWVXrg3YBG8RZDrpUb0belG1Lx3j2FOTbe8fRvh9e4Tah TGktGflBHSBHm0cYkeSiTeZ34ljPi2vdHNxWVY4VwvXKsVw4hyNUooME4eVGHpJnj+uV9KioRIt UdDDLgvAraZwnLLKbYpZXc5h0+2QBrHa5W++tVUXb X-Gm-Gg: Acq92OGv+w1O87g5lMmvZ/GXDrMsllxM+APWK7OD9TbEML4W/yBjHv83L6u/CpADp32 Nw/JrO2nRo2bGRx1FZqTyFOR7ZJ/Ry8c6f6MyWdJhfR3dStWjkF7EAsQUOU5GNcsdZZUsPABXN5 q3rVAGbyrVa+Qerg3a74Zqn0+j4LwKxJjhwNaEFrBwgSZK4vsRHpGcP1LfhAkqqgvcrAO/3dbnA OUJ8qHt9TgIp2cbuo1tvI2hlGFxusm6jo7v0ypCXss82jMh75Z2AUFkiLa8/Gxv4Spq9plvLkqj SO+FyiCy0wOpzH+3g3I= X-Received: by 2002:a17:907:a2cb:b0:bed:1876:96e with SMTP id a640c23a62f3a-bf938e244e6mr416104066b.31.1781090674267; Wed, 10 Jun 2026 04:24:34 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Akshay Joshi Date: Wed, 10 Jun 2026 16:54:22 +0530 X-Gm-Features: AVVi8Cfi1cDJtFsnC8QsYDBuiHanZ4LTPtpEK1VQP8RPOKcVl1WLGQuHpE-E15s Message-ID: Subject: Re: [PATCH] Add pg_get_table_ddl() to reconstruct CREATE TABLE statements To: Zsolt Parragi Cc: pgsql-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="000000000000f433b70653e47c6d" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000f433b70653e47c6d Content-Type: multipart/alternative; boundary="000000000000f433b60653e47c6b" --000000000000f433b60653e47c6b Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Thanks for the review. I have fixed all the issues you mentioned. Because this is a major restructuring of the DDL function involving multiple child elements and complex syntaxes, some edge cases might still pop up, though I have tried to cover as much as possible. The v4 patch is ready for your review. On Wed, Jun 10, 2026 at 12:47=E2=80=AFAM Zsolt Parragi wrote: > Thanks, I can confirm that the previous bugs were fixed, however the > bugfixes also introduce a new issue, where inherited not null > constraints are missing: > > CREATE TABLE par (a int); > CREATE TABLE ch (b int) INHERITS (par); > ALTER TABLE ch ADD CONSTRAINT my_nn NOT NULL a; > SELECT * FROM pg_get_table_ddl('ch','owner','false'); > -- CREATE TABLE public.ch ( b integer) INHERITS (public.par); > > The schema_qualified =3D> false part also doesn't work as described: > > + CREATE STATISTICS statement. References to > + objects in the same schema as the target table (inheritance > + parents, partition parents, identity sequences, and any > + same-schema object the deparse helpers happen to mention) are > + also emitted unqualified, so the script can be replayed under a > + different search_path to recreate the table > + in another schema. > > but: > > CREATE SCHEMA s1; > CREATE SEQUENCE s1.myseq; > CREATE FUNCTION s1.f(int) RETURNS int LANGUAGE sql IMMUTABLE AS 'SELECT > $1'; > CREATE TABLE s1.t ( > id int DEFAULT nextval('s1.myseq'), > val int, > CONSTRAINT chk CHECK (s1.f(val) > 0) > ); > SELECT * FROM pg_get_table_ddl('s1.t', 'owner','false', > 'schema_qualified','false'); > -- CREATE TABLE t ( id integer DEFAULT nextval('s1.myseq'::regclass), > val integer, CONSTRAINT chk CHECK ((s1.f(val) > 0))); > > s1 appears twice in the output. > > It also has an issue with strings containing the schema: > > CREATE SCHEMA myschema; > CREATE TABLE myschema.p (id int, note text) PARTITION BY RANGE (id); > CREATE TABLE myschema.pc PARTITION OF myschema.p > (CONSTRAINT chk CHECK (note <> 'myschema.secret')) FOR VALUES FROM > (0) TO (100); > SELECT * FROM pg_get_table_ddl('myschema.pc', 'owner','false', > 'schema_qualified','false'); > -- CREATE TABLE pc PARTITION OF p FOR VALUES FROM (0) TO (100); > -- ALTER TABLE pc ADD CONSTRAINT chk CHECK ((note <> 'secret'::text)); > > > --000000000000f433b60653e47c6b Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable

Thanks for the review. I have fixed all the issues you = mentioned.

Because this is a major restructuring of the DDL function = involving multiple child elements and complex syntaxes, some edge cases mig= ht still pop up, though I have tried to cover as much as possible.

Th= e v4 patch is ready for your review.


On Wed, Jun 1= 0, 2026 at 12:47=E2=80=AFAM Zsolt Parragi <zsolt.parragi@percona.com> wrote:
Thanks, I can confirm that the pre= vious bugs were fixed, however the
bugfixes also introduce a new issue, where inherited not null
constraints are missing:

CREATE TABLE par (a int);
CREATE TABLE ch (b int) INHERITS (par);
ALTER TABLE ch ADD CONSTRAINT my_nn NOT NULL a;
SELECT * FROM pg_get_table_ddl('ch','owner','false'= );
--=C2=A0 CREATE TABLE public.ch ( b integer) INHERITS (public.par);

The schema_qualified =3D> false part also doesn't work as described:=

+=C2=A0 =C2=A0 =C2=A0 =C2=A0 <command>CREATE STATISTICS</command&g= t; statement.=C2=A0 References to
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 objects in the same schema as the target table= (inheritance
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 parents, partition parents, identity sequences= , and any
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 same-schema object the deparse helpers happen = to mention) are
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 also emitted unqualified, so the script can be= replayed under a
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 different <varname>search_path</varna= me> to recreate the table
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 in another schema.

but:

CREATE SCHEMA s1;
CREATE SEQUENCE s1.myseq;
CREATE FUNCTION s1.f(int) RETURNS int LANGUAGE sql IMMUTABLE AS 'SELECT= $1';
CREATE TABLE s1.t (
=C2=A0 =C2=A0 id=C2=A0 int DEFAULT nextval('s1.myseq'),
=C2=A0 =C2=A0 val int,
=C2=A0 =C2=A0 CONSTRAINT chk CHECK (s1.f(val) > 0)
);
SELECT * FROM pg_get_table_ddl('s1.t', 'owner','false&#= 39;,
'schema_qualified','false');
--=C2=A0 CREATE TABLE t ( id integer DEFAULT nextval('s1.myseq'::re= gclass),
val integer, CONSTRAINT chk CHECK ((s1.f(val) > 0)));

s1 appears twice in the output.

It also has an issue with strings containing the schema:

CREATE SCHEMA myschema;
CREATE TABLE myschema.p (id int, note text) PARTITION BY RANGE (id);
CREATE TABLE myschema.pc PARTITION OF myschema.p
=C2=A0 =C2=A0 (CONSTRAINT chk CHECK (note <> 'myschema.secret'= ;)) FOR VALUES FROM
(0) TO (100);
SELECT * FROM pg_get_table_ddl('myschema.pc', 'owner','= false',
'schema_qualified','false');
-- CREATE TABLE pc PARTITION OF p FOR VALUES FROM (0) TO (100);
-- ALTER TABLE pc ADD CONSTRAINT chk CHECK ((note <> 'secret'= ::text));


--000000000000f433b60653e47c6b-- --000000000000f433b70653e47c6d Content-Type: application/octet-stream; name="v4-0001-Add-pg_get_table_ddl-to-reconstruct-CREATE-TABLE.patch" Content-Disposition: attachment; filename="v4-0001-Add-pg_get_table_ddl-to-reconstruct-CREATE-TABLE.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mq7ze0t90 RnJvbSA4YWZkMTIyNjFmNmYyYmI4NzJhZGRjNDI2NWQxYjVjODA1YjVlNzhlIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBa3NoYXkgSm9zaGkgPGFrc2hheS5qb3NoaUBlbnRlcnByaXNl ZGIuY29tPgpEYXRlOiBUdWUsIDIgSnVuIDIwMjYgMTQ6MTg6NDAgKzA1MzAKU3ViamVjdDogW1BB VENIIHY0XSBBZGQgcGdfZ2V0X3RhYmxlX2RkbCgpIHRvIHJlY29uc3RydWN0IENSRUFURSBUQUJM RQogc3RhdGVtZW50cwoKVGhlIGZ1bmN0aW9uIHJlY29uc3RydWN0cyB0aGUgQ1JFQVRFIFRBQkxF IHN0YXRlbWVudCBmb3IgYW4gb3JkaW5hcnkgb3IKcGFydGl0aW9uZWQgdGFibGUsIGZvbGxvd2Vk IGJ5IHRoZSBBTFRFUiBUQUJMRSAvIENSRUFURSBJTkRFWCAvCkNSRUFURSBSVUxFIC8gQ1JFQVRF IFNUQVRJU1RJQ1Mgc3RhdGVtZW50cyBuZWVkZWQgdG8gcmVzdG9yZSBpdHMgZnVsbApkZWZpbml0 aW9uLiAgRWFjaCBzdGF0ZW1lbnQgaXMgcmV0dXJuZWQgYXMgYSBzZXBhcmF0ZSByb3cuCgpTdXBw b3J0ZWQgcGVyLWNvbHVtbiBmZWF0dXJlczogZGF0YSB0eXBlIHdpdGggdHlwZSBtb2RpZmllcnMs IENPTExBVEUsClNUT1JBR0UsIENPTVBSRVNTSU9OIChwZ2x6IC8gbHo0KSwgR0VORVJBVEVEIEFM V0FZUyBBUyAoZXhwcikKU1RPUkVEL1ZJUlRVQUwsIEdFTkVSQVRFRCBBTFdBWVN8QlkgREVGQVVM VCBBUyBJREVOVElUWSAod2l0aCBzZXF1ZW5jZQpvcHRpb25zKSwgREVGQVVMVCwgTk9UIE5VTEws IGFuZCBwZXItY29sdW1uIGF0dG9wdGlvbnMgZW1pdHRlZCBhcwpBTFRFUiBDT0xVTU4gU0VUICgu Li4pLgoKU3VwcG9ydGVkIHRhYmxlLWxldmVsIGZlYXR1cmVzOiBVTkxPR0dFRCwgSU5IRVJJVFMs IFBBUlRJVElPTiBCWSAoUkFOR0UKLyBMSVNUIC8gSEFTSCBwYXJlbnRzKSwgUEFSVElUSU9OIE9G IHBhcmVudCBGT1IgVkFMVUVTIChGUk9NL1RPLCBXSVRICm1vZHVsdXMvcmVtYWluZGVyLCBERUZB VUxUKSwgVVNJTkcgdGFibGUgYWNjZXNzIG1ldGhvZCwgV0lUSAoocmVsb3B0aW9ucyksIFRBQkxF U1BBQ0UsIGFuZCBpbmxpbmUgQ0hFQ0sgY29uc3RyYWludHMgaW4gdGhlCkNSRUFURSBUQUJMRSBi b2R5LgoKU3VwcG9ydGVkIHN1Yi1vYmplY3RzIChyZS11c2luZyBleGlzdGluZyBkZXBhcnNlIGhl bHBlcnMgZnJvbQpydWxldXRpbHMuYyk6IGluZGV4ZXMgdmlhIHBnX2dldF9pbmRleGRlZl9zdHJp bmcsIGNvbnN0cmFpbnRzCihQUklNQVJZIEtFWSwgVU5JUVVFLCBGT1JFSUdOIEtFWSwgRVhDTFVE RSwgbmFtZWQgTk9UIE5VTEwpIHZpYQpwZ19nZXRfY29uc3RyYWludGRlZl9jb21tYW5kLCBydWxl cyB2aWEgcGdfZ2V0X3J1bGVkZWYsIGV4dGVuZGVkCnN0YXRpc3RpY3MgdmlhIHBnX2dldF9zdGF0 aXN0aWNzb2JqZGVmX3N0cmluZywgUkVQTElDQSBJREVOVElUWQpOT1RISU5HL0ZVTEwvVVNJTkcg SU5ERVgsIEFMVEVSIFRBQkxFIEVOQUJMRS9GT1JDRSBST1cgTEVWRUwgU0VDVVJJVFksCmFuZCBj aGlsZC1sb2NhbCBERUZBVUxUIG92ZXJyaWRlcyBvbiBpbmhlcml0YW5jZS9wYXJ0aXRpb24gY2hp bGRyZW4uCgpEZWZhdWx0IG9taXNzaW9uIGNvbnZlbnRpb246IGV2ZXJ5IG9wdGlvbmFsIGNsYXVz ZSBpcyBkcm9wcGVkIHdoZW4gaXRzCnZhbHVlIGVxdWFscyB3aGF0IHRoZSBzeXN0ZW0gd291bGQg cmVhcHBseSBvbiByb3VuZC10cmlwLCBpbmNsdWRpbmcKdHlwZS1kZWZhdWx0IENPTExBVEUsIHBl ci10eXBlIFNUT1JBR0UsIHRoZSBhdXRvLWdlbmVyYXRlZCBpZGVudGl0eQpzZXF1ZW5jZSBuYW1l IGFuZCBwYXJhbWV0ZXIgZGVmYXVsdHMsIGhlYXAgYWNjZXNzIG1ldGhvZCwgZGVmYXVsdApSRVBM SUNBIElERU5USVRZLCBkaXNhYmxlZCBSTFMgdG9nZ2xlcywgZW1wdHkgcmVsb3B0aW9ucywgYW5k IHRoZQpkZWZhdWx0IHRhYmxlc3BhY2UuCgpBIHJlZ3Jlc3Npb24gdGVzdCB1bmRlciBzcmMvdGVz dC9yZWdyZXNzIGNvdmVycyBvcmRpbmFyeSB0YWJsZXMsCmlkZW50aXR5IChkZWZhdWx0IGFuZCBj dXN0b20gc2VxdWVuY2Ugb3B0aW9ucyksIGdlbmVyYXRlZCBjb2x1bW5zLApTVE9SQUdFL0NPTVBS RVNTSU9OLCBjb25zdHJhaW50cyAoQ0hFQ0svVU5JUVVFL0ZLIHdpdGggZGVmZXJyYWJsZSksCmZ1 bmN0aW9uYWwgYW5kIHBhcnRpYWwgaW5kZXhlcywgaW5oZXJpdGFuY2UgYW5kIHBhcnRpdGlvbmlu ZywKcGFydGl0aW9uIGNoaWxkcmVuIHdpdGggRk9SIFZBTFVFUyBGUk9NL1RPLCBXSVRIIG1vZHVs dXMvcmVtYWluZGVyLCBhbmQKREVGQVVMVCwgcnVsZXMsIGV4dGVuZGVkIHN0YXRpc3RpY3MsIFJM UyB0b2dnbGVzLCBSRVBMSUNBIElERU5USVRZLApVTkxPR0dFRCB3aXRoIHJlbG9wdGlvbnMsIHBl ci1jb2x1bW4gYXR0b3B0aW9ucywgY2hpbGQgREVGQVVMVApvdmVycmlkZXMsIHByZXR0eSBtb2Rl LCBvd25lcj1mYWxzZSwgYW5kIHRoZSBlcnJvciBwYXRocyBmb3Igdmlld3MsCnNlcXVlbmNlcywg TlVMTCwgdW5rbm93biBvcHRpb25zLCBhbmQgb2RkLXZhcmlhZGljIGFyZ3VtZW50IGNvdW50cy4K CkF1dGhvcjogQWtzaGF5IEpvc2hpIDxha3NoYXkuam9zaGlAZW50ZXJwcmlzZWRiLmNvbT4KUmV2 aWV3ZWQtYnk6IE1hcmNvcyBQZWdvcmFybyA8bWFyY29zQGYxMC5jb20uYnI+ClJldmlld2VkLWJ5 OiBac29sdCBQYXJyYWdpIDx6c29sdC5wYXJyYWdpQHBlcmNvbmEuY29tPgotLS0KIGRvYy9zcmMv c2dtbC9mdW5jL2Z1bmMtaW5mby5zZ21sICAgICAgICAgICAgICB8ICAgNzkgKwogc3JjL2JhY2tl bmQvY29tbWFuZHMvdGFibGVjbWRzLmMgICAgICAgICAgICAgIHwgICAyNyArCiBzcmMvYmFja2Vu ZC91dGlscy9hZHQvZGRsdXRpbHMuYyAgICAgICAgICAgICAgfCAxODAwICsrKysrKysrKysrKysr KysrCiBzcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0ICAgICAgICAgICAgICAgfCAgICA3 ICsKIHNyYy9pbmNsdWRlL2NvbW1hbmRzL3RhYmxlY21kcy5oICAgICAgICAgICAgICB8ICAgIDEg KwogLi4uL3JlZ3Jlc3MvZXhwZWN0ZWQvcGdfZ2V0X3RhYmxlX2RkbC5vdXQgICAgIHwgIDcwMCAr KysrKysrCiBzcmMvdGVzdC9yZWdyZXNzL3BhcmFsbGVsX3NjaGVkdWxlICAgICAgICAgICAgfCAg ICAyICstCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9wZ19nZXRfdGFibGVfZGRsLnNxbCAgICAgfCAg NDEwICsrKysKIDggZmlsZXMgY2hhbmdlZCwgMzAyNSBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9u KC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9wZ19nZXRf dGFibGVfZGRsLm91dAogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3Bn X2dldF90YWJsZV9kZGwuc3FsCgpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL2Z1bmMvZnVuYy1p bmZvLnNnbWwgYi9kb2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWluZm8uc2dtbAppbmRleCAwMGY2NGY1 MGNlYi4uNmEzNGRlZDk2MjggMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtaW5m by5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtaW5mby5zZ21sCkBAIC0zOTYxLDYg KzM5NjEsODUgQEAgYWNsICAgICAgfCB7cG9zdGdyZXM9YXJ3ZER4dG0vcG9zdGdyZXMsZm9vPXIv cG9zdGdyZXN9CiAgICAgICAgIDxsaXRlcmFsPlRBQkxFU1BBQ0U8L2xpdGVyYWw+LgogICAgICAg IDwvcGFyYT48L2VudHJ5PgogICAgICAgPC9yb3c+CisgICAgICA8cm93PgorICAgICAgIDxlbnRy eSByb2xlPSJmdW5jX3RhYmxlX2VudHJ5Ij48cGFyYSByb2xlPSJmdW5jX3NpZ25hdHVyZSI+Cisg ICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICA8cHJpbWFyeT5wZ19nZXRfdGFibGVfZGRsPC9w cmltYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGZ1bmN0aW9uPnBnX2dldF90 YWJsZV9kZGw8L2Z1bmN0aW9uPgorICAgICAgICAoIDxwYXJhbWV0ZXI+dGFibGU8L3BhcmFtZXRl cj4gPHR5cGU+cmVnY2xhc3M8L3R5cGU+CisgICAgICAgIDxvcHRpb25hbD4sIDxsaXRlcmFsPlZB UklBRElDPC9saXRlcmFsPiA8cGFyYW1ldGVyPm9wdGlvbnM8L3BhcmFtZXRlcj4KKyAgICAgICAg PHR5cGU+dGV4dDwvdHlwZT4gPC9vcHRpb25hbD4gKQorICAgICAgICA8cmV0dXJudmFsdWU+c2V0 b2YgdGV4dDwvcmV0dXJudmFsdWU+CisgICAgICAgPC9wYXJhPgorICAgICAgIDxwYXJhPgorICAg ICAgICBSZWNvbnN0cnVjdHMgdGhlIDxjb21tYW5kPkNSRUFURSBUQUJMRTwvY29tbWFuZD4gc3Rh dGVtZW50IGZvciB0aGUKKyAgICAgICAgc3BlY2lmaWVkIG9yZGluYXJ5IG9yIHBhcnRpdGlvbmVk IHRhYmxlLCBmb2xsb3dlZCBieSB0aGUKKyAgICAgICAgPGNvbW1hbmQ+QUxURVIgVEFCTEU8L2Nv bW1hbmQ+LCA8Y29tbWFuZD5DUkVBVEUgSU5ERVg8L2NvbW1hbmQ+LAorICAgICAgICA8Y29tbWFu ZD5DUkVBVEUgUlVMRTwvY29tbWFuZD4sIGFuZCA8Y29tbWFuZD5DUkVBVEUgU1RBVElTVElDUzwv Y29tbWFuZD4KKyAgICAgICAgc3RhdGVtZW50cyBuZWVkZWQgdG8gcmVjcmVhdGUgdGhlIHRhYmxl J3MgY29sdW1ucywgY29uc3RyYWludHMsCisgICAgICAgIGluZGV4ZXMsIHJ1bGVzLCBleHRlbmRl ZCBzdGF0aXN0aWNzLCBhbmQgcm93LWxldmVsIHNlY3VyaXR5IGZsYWdzLgorICAgICAgICBJbmhl cml0ZWQgY29sdW1ucyBhbmQgY29uc3RyYWludHMgYXJlIGVtaXR0ZWQgYnkgdGhlIHBhcmVudCB0 YWJsZSdzCisgICAgICAgIERETCBhbmQgYXJlIG5vdCBkdXBsaWNhdGVkIG9uIGluaGVyaXRhbmNl IGNoaWxkcmVuIG9yIHBhcnRpdGlvbnMuCisgICAgICAgIEVhY2ggc3RhdGVtZW50IGlzIHJldHVy bmVkIGFzIGEgc2VwYXJhdGUgcm93LgorICAgICAgICBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJl IHN1cHBvcnRlZDoKKyAgICAgICAgPGxpdGVyYWw+cHJldHR5PC9saXRlcmFsPiAoYm9vbGVhbikg Zm9yIGZvcm1hdHRlZCBvdXRwdXQsCisgICAgICAgIDxsaXRlcmFsPm93bmVyPC9saXRlcmFsPiAo Ym9vbGVhbikgdG8gaW5jbHVkZSB0aGUKKyAgICAgICAgPGNvbW1hbmQ+QUxURVIgVEFCTEUgLi4u IE9XTkVSIFRPPC9jb21tYW5kPiBzdGF0ZW1lbnQsCisgICAgICAgIDxsaXRlcmFsPnRhYmxlc3Bh Y2U8L2xpdGVyYWw+IChib29sZWFuKSB0byBpbmNsdWRlIHRoZQorICAgICAgICA8bGl0ZXJhbD5U QUJMRVNQQUNFPC9saXRlcmFsPiBjbGF1c2Ugb24gdGhlCisgICAgICAgIDxjb21tYW5kPkNSRUFU RSBUQUJMRTwvY29tbWFuZD4gc3RhdGVtZW50LCBhbmQgYSBmYW1pbHkgb2YKKyAgICAgICAgPGxp dGVyYWw+aW5jbHVkZXNfPHJlcGxhY2VhYmxlPmNhdGVnb3J5PC9yZXBsYWNlYWJsZT48L2xpdGVy YWw+CisgICAgICAgIGJvb2xlYW5zIHRoYXQgZ2F0ZSBlbWlzc2lvbiBvZiBvcHRpb25hbCBzdWIt b2JqZWN0czoKKyAgICAgICAgPGxpdGVyYWw+aW5jbHVkZXNfaW5kZXhlczwvbGl0ZXJhbD4sCisg ICAgICAgIDxsaXRlcmFsPmluY2x1ZGVzX2NvbnN0cmFpbnRzPC9saXRlcmFsPiwKKyAgICAgICAg PGxpdGVyYWw+aW5jbHVkZXNfcnVsZXM8L2xpdGVyYWw+LAorICAgICAgICA8bGl0ZXJhbD5pbmNs dWRlc19zdGF0aXN0aWNzPC9saXRlcmFsPiwKKyAgICAgICAgPGxpdGVyYWw+aW5jbHVkZXNfdHJp Z2dlcnM8L2xpdGVyYWw+LAorICAgICAgICA8bGl0ZXJhbD5pbmNsdWRlc19wb2xpY2llczwvbGl0 ZXJhbD4sCisgICAgICAgIDxsaXRlcmFsPmluY2x1ZGVzX3JsczwvbGl0ZXJhbD4gKHRoZQorICAg ICAgICA8Y29tbWFuZD5FTkFCTEU8L2NvbW1hbmQ+Lzxjb21tYW5kPkZPUkNFIFJPVyBMRVZFTCBT RUNVUklUWTwvY29tbWFuZD4KKyAgICAgICAgdG9nZ2xlcyksIGFuZAorICAgICAgICA8bGl0ZXJh bD5pbmNsdWRlc19yZXBsaWNhX2lkZW50aXR5PC9saXRlcmFsPi4gIEVhY2ggb2YgdGhlc2UKKyAg ICAgICAgZGVmYXVsdHMgdG8gPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4uICBUaGUKKyAgICAgICAg PGxpdGVyYWw+aW5jbHVkZXNfcGFydGl0aW9uPC9saXRlcmFsPiBvcHRpb24sIHdoaWNoIGRlZmF1 bHRzIHRvCisgICAgICAgIDxsaXRlcmFsPmZhbHNlPC9saXRlcmFsPiwgY29udHJvbHMgd2hldGhl ciB0aGUgRERMIGZvciBwYXJ0aXRpb24KKyAgICAgICAgY2hpbGRyZW4gaXMgYXBwZW5kZWQgYWZ0 ZXIgYSBwYXJ0aXRpb25lZC10YWJsZSBwYXJlbnQuCisgICAgICAgPC9wYXJhPgorICAgICAgIDxw YXJhPgorICAgICAgICBUaGUgPGxpdGVyYWw+c2NoZW1hX3F1YWxpZmllZDwvbGl0ZXJhbD4gb3B0 aW9uIChib29sZWFuLCBkZWZhdWx0CisgICAgICAgIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+KSBj b250cm9scyB3aGV0aGVyIHRoZSB0YXJnZXQgdGFibGUncyBvd24KKyAgICAgICAgc2NoZW1hIGlz IGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQgRERMLiAgV2hlbiBzZXQgdG8KKyAgICAgICAgPGxp dGVyYWw+ZmFsc2U8L2xpdGVyYWw+LCB0aGUgdGFibGUgbmFtZSBpcyBlbWl0dGVkIHVucXVhbGlm aWVkCisgICAgICAgIGluIHRoZSA8Y29tbWFuZD5DUkVBVEUgVEFCTEU8L2NvbW1hbmQ+IGFuZCBl dmVyeSBzdWJzZXF1ZW50CisgICAgICAgIDxjb21tYW5kPkFMVEVSIFRBQkxFPC9jb21tYW5kPiwg PGNvbW1hbmQ+Q1JFQVRFIElOREVYPC9jb21tYW5kPiwKKyAgICAgICAgPGNvbW1hbmQ+Q1JFQVRF IFJVTEU8L2NvbW1hbmQ+LCBhbmQKKyAgICAgICAgPGNvbW1hbmQ+Q1JFQVRFIFNUQVRJU1RJQ1M8 L2NvbW1hbmQ+IHN0YXRlbWVudC4gIFJlZmVyZW5jZXMgdG8KKyAgICAgICAgb2JqZWN0cyBpbiB0 aGUgc2FtZSBzY2hlbWEgYXMgdGhlIHRhcmdldCB0YWJsZSAoaW5oZXJpdGFuY2UKKyAgICAgICAg cGFyZW50cywgcGFydGl0aW9uIHBhcmVudHMsIGlkZW50aXR5IHNlcXVlbmNlcywgYW5kIGFueQor ICAgICAgICBzYW1lLXNjaGVtYSBvYmplY3QgdGhlIGRlcGFyc2UgaGVscGVycyBoYXBwZW4gdG8g bWVudGlvbikgYXJlCisgICAgICAgIGFsc28gZW1pdHRlZCB1bnF1YWxpZmllZCwgc28gdGhlIHNj cmlwdCBjYW4gYmUgcmVwbGF5ZWQgdW5kZXIgYQorICAgICAgICBkaWZmZXJlbnQgPHZhcm5hbWU+ c2VhcmNoX3BhdGg8L3Zhcm5hbWU+IHRvIHJlY3JlYXRlIHRoZSB0YWJsZQorICAgICAgICBpbiBh bm90aGVyIHNjaGVtYS4gIENyb3NzLXNjaGVtYSByZWZlcmVuY2VzIChmb3IgZXhhbXBsZSBhCisg ICAgICAgIGZvcmVpZ24ga2V5IHRhcmdldCBpbiBhIGRpZmZlcmVudCBzY2hlbWEpIHJlbWFpbiBx dWFsaWZpZWQgZm9yCisgICAgICAgIGNvcnJlY3RuZXNzLgorICAgICAgIDwvcGFyYT4KKyAgICAg ICA8cGFyYT4KKyAgICAgICAgQWxsIHRocmVlIGZvcm1zIG9mIDxjb21tYW5kPkNSRUFURSBUQUJM RTwvY29tbWFuZD4gYXJlIHN1cHBvcnRlZDoKKyAgICAgICAgdGhlIG9yZGluYXJ5IGNvbHVtbi1s aXN0IGZvcm0sIHRoZSB0eXBlZC10YWJsZSBmb3JtCisgICAgICAgICg8bGl0ZXJhbD5PRiA8cmVw bGFjZWFibGU+dHlwZV9uYW1lPC9yZXBsYWNlYWJsZT48L2xpdGVyYWw+LCB3aXRoCisgICAgICAg IHBlci1jb2x1bW4gPGxpdGVyYWw+V0lUSCBPUFRJT05TPC9saXRlcmFsPiBvdmVycmlkZXMgZm9y IGxvY2FsCisgICAgICAgIGRlZmF1bHRzLCA8bGl0ZXJhbD5OT1QgTlVMTDwvbGl0ZXJhbD4sIGFu ZCA8bGl0ZXJhbD5DSEVDSzwvbGl0ZXJhbD4KKyAgICAgICAgY29uc3RyYWludHMpLCBhbmQgdGhl IDxsaXRlcmFsPlBBUlRJVElPTiBPRjwvbGl0ZXJhbD4gZm9ybS4KKyAgICAgICAgPGxpdGVyYWw+ VEVNUE9SQVJZPC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+VU5MT0dHRUQ8L2xpdGVyYWw+CisgICAg ICAgIHBlcnNpc3RlbmNlIG1vZGVzIGFyZSBlbWl0dGVkIGZyb20KKyAgICAgICAgPHN0cnVjdGZp ZWxkPnJlbHBlcnNpc3RlbmNlPC9zdHJ1Y3RmaWVsZD4uICBGb3IgdGVtcG9yYXJ5IHRhYmxlcwor ICAgICAgICByZWdpc3RlcmVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24sIHRoZQorICAgICAgICA8 bGl0ZXJhbD5PTiBDT01NSVQgREVMRVRFIFJPV1M8L2xpdGVyYWw+IGFuZAorICAgICAgICA8bGl0 ZXJhbD5PTiBDT01NSVQgRFJPUDwvbGl0ZXJhbD4gY2xhdXNlcyBhcmUgZW1pdHRlZDsgdGhlIGRl ZmF1bHQKKyAgICAgICAgPGxpdGVyYWw+T04gQ09NTUlUIFBSRVNFUlZFIFJPV1M8L2xpdGVyYWw+ IGlzIG9taXR0ZWQuCisgICAgICAgPC9wYXJhPjwvZW50cnk+CisgICAgICA8L3Jvdz4KICAgICAg PC90Ym9keT4KICAgICA8L3Rncm91cD4KICAgIDwvdGFibGU+CmRpZmYgLS1naXQgYS9zcmMvYmFj a2VuZC9jb21tYW5kcy90YWJsZWNtZHMuYyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL3RhYmxlY21k cy5jCmluZGV4IGEzM2UyMmU4ZTYxLi42YWE0MDFkOTQzYyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tl bmQvY29tbWFuZHMvdGFibGVjbWRzLmMKKysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvdGFibGVj bWRzLmMKQEAgLTE5NTU4LDYgKzE5NTU4LDMzIEBAIHJlbW92ZV9vbl9jb21taXRfYWN0aW9uKE9p ZCByZWxpZCkKIAl9CiB9CiAKKy8qCisgKiBMb29rIHVwIHRoZSByZWdpc3RlcmVkIE9OIENPTU1J VCBhY3Rpb24gZm9yIGEgcmVsYXRpb24uCisgKgorICogUmV0dXJucyBPTkNPTU1JVF9OT09QIHdo ZW4gbm90aGluZyB3YXMgcmVnaXN0ZXJlZCwgd2hpY2ggYWxzbyBjb3ZlcnMKKyAqIHRlbXBvcmFy eSB0YWJsZXMgY3JlYXRlZCB3aXRoIHRoZSBkZWZhdWx0IE9OIENPTU1JVCBQUkVTRVJWRSBST1dT CisgKiBiZWhhdmlvciAocmVnaXN0ZXJfb25fY29tbWl0X2FjdGlvbigpIHNraXBzIHRob3NlLCBz aW5jZSBubyBhY3Rpb24gaXMKKyAqIG5lZWRlZCBhdCBjb21taXQpLiAgRW50cmllcyBtYXJrZWQg Zm9yIGRlbGV0aW9uIGluIHRoZSBjdXJyZW50CisgKiB0cmFuc2FjdGlvbiBhcmUgaWdub3JlZC4K KyAqLworT25Db21taXRBY3Rpb24KK2dldF9vbl9jb21taXRfYWN0aW9uKE9pZCByZWxpZCkKK3sK KwlMaXN0Q2VsbCAgICpsOworCisJZm9yZWFjaChsLCBvbl9jb21taXRzKQorCXsKKwkJT25Db21t aXRJdGVtICpvYyA9IChPbkNvbW1pdEl0ZW0gKikgbGZpcnN0KGwpOworCisJCWlmIChvYy0+cmVs aWQgIT0gcmVsaWQpCisJCQljb250aW51ZTsKKwkJaWYgKG9jLT5kZWxldGluZ19zdWJpZCAhPSBJ bnZhbGlkU3ViVHJhbnNhY3Rpb25JZCkKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gb2MtPm9uY29t bWl0OworCX0KKwlyZXR1cm4gT05DT01NSVRfTk9PUDsKK30KKwogLyoKICAqIFBlcmZvcm0gT04g Q09NTUlUIGFjdGlvbnMuCiAgKgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2Rk bHV0aWxzLmMgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvZGRsdXRpbHMuYwppbmRleCBmMzJmY2Q0 NTNlZi4uM2QyZGViMmEzMjcgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9kZGx1 dGlscy5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9kZGx1dGlscy5jCkBAIC0yMSwxMiAr MjEsMjcgQEAKICNpbmNsdWRlICJhY2Nlc3MvZ2VuYW0uaCIKICNpbmNsdWRlICJhY2Nlc3MvaHR1 cF9kZXRhaWxzLmgiCiAjaW5jbHVkZSAiYWNjZXNzL3RhYmxlLmgiCisjaW5jbHVkZSAiYWNjZXNz L3RvYXN0X2NvbXByZXNzaW9uLmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9wZ19hdXRoX21lbWJlcnMu aCIKICNpbmNsdWRlICJjYXRhbG9nL3BnX2F1dGhpZC5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGdf Y2xhc3MuaCIKKyNpbmNsdWRlICJjYXRhbG9nL2RlcGVuZGVuY3kuaCIKICNpbmNsdWRlICJjYXRh bG9nL3BnX2NvbGxhdGlvbi5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGdfY29uc3RyYWludC5oIgog I2luY2x1ZGUgImNhdGFsb2cvcGdfZGF0YWJhc2UuaCIKICNpbmNsdWRlICJjYXRhbG9nL3BnX2Ri X3JvbGVfc2V0dGluZy5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGdfYW0uaCIKKyNpbmNsdWRlICJj YXRhbG9nL3BnX2luaGVyaXRzLmgiCisjaW5jbHVkZSAiY2F0YWxvZy9wZ19wb2xpY3kuaCIKKyNp bmNsdWRlICJjYXRhbG9nL3BnX3NlcXVlbmNlLmgiCisjaW5jbHVkZSAiY2F0YWxvZy9wZ19zdGF0 aXN0aWNfZXh0LmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9wZ190YWJsZXNwYWNlLmgiCisjaW5jbHVk ZSAiY2F0YWxvZy9wZ190cmlnZ2VyLmgiCisjaW5jbHVkZSAiY2F0YWxvZy9wYXJ0aXRpb24uaCIK KyNpbmNsdWRlICJjb21tYW5kcy9kZWZyZW0uaCIKKyNpbmNsdWRlICJjb21tYW5kcy90YWJsZWNt ZHMuaCIKKyNpbmNsdWRlICJyZXdyaXRlL3ByczJsb2NrLmgiCisjaW5jbHVkZSAibm9kZXMvbm9k ZXMuaCIKICNpbmNsdWRlICJjb21tYW5kcy90YWJsZXNwYWNlLmgiCiAjaW5jbHVkZSAiY29tbW9u L3JlbHBhdGguaCIKICNpbmNsdWRlICJmdW5jYXBpLmgiCkBAIC04Nyw2ICsxMDIsMTA1IEBAIHN0 YXRpYyBEYXR1bSBwZ19nZXRfdGFibGVzcGFjZV9kZGxfc3JmKEZ1bmN0aW9uQ2FsbEluZm8gZmNp bmZvLCBPaWQgdHNpZCwgYm9vbCBpCiBzdGF0aWMgTGlzdCAqcGdfZ2V0X2RhdGFiYXNlX2RkbF9p bnRlcm5hbChPaWQgZGJpZCwgYm9vbCBwcmV0dHksCiAJCQkJCQkJCQkJICBib29sIG5vX293bmVy LCBib29sIG5vX3RhYmxlc3BhY2UpOwogCisvKgorICogUGVyLWNvbHVtbiBjYWNoZSBvZiBsb2Nh bGx5LWRlY2xhcmVkIE5PVCBOVUxMIGNvbnN0cmFpbnRzLiAgQnVpbHQgb25jZQorICogYnkgY29s bGVjdF9sb2NhbF9ub3RfbnVsbCgpIGFuZCBjb25zdWx0ZWQgYnkgdGhlIGNvbHVtbi1lbWl0IGhl bHBlcnMKKyAqIGFuZCB0aGUgcG9zdC1DUkVBVEUgY29uc3RyYWludCBsb29wLiAgRW50cmllcyB3 aXRoIGNvbm9pZCA9PSBJbnZhbGlkT2lkCisgKiBtZWFuIHRoZSBjb2x1bW4gaGFzIG5vIGxvY2Fs IE5PVCBOVUxMIGNvbnN0cmFpbnQgcm93IGluIHBnX2NvbnN0cmFpbnQKKyAqICh0aGUgY29sdW1u IG1heSBzdGlsbCBoYXZlIGF0dG5vdG51bGw9dHJ1ZSBvbiBhIHByZS1QRy0xOC11cGdyYWRlZAor ICogY2F0YWxvZywgaW4gd2hpY2ggY2FzZSBlbWl0IHBsYWluIGlubGluZSBOT1QgTlVMTCkuCisg Ki8KK3R5cGVkZWYgc3RydWN0IExvY2FsTm90TnVsbEVudHJ5Cit7CisJT2lkCQkJY29ub2lkOwor CWNoYXIJICAgKm5hbWU7CisJYm9vbAkJaXNfYXV0bzsJCS8qIG1hdGNoZXMgIjx0YWJsZT5fPGNv bD5fbm90X251bGwiICovCisJYm9vbAkJbm9faW5oZXJpdDsKK30JCQlMb2NhbE5vdE51bGxFbnRy eTsKKworLyoKKyAqIFdvcmtpbmcgY29udGV4dCB0aHJlYWRlZCB0aHJvdWdoIHRoZSBwZXItcGFz cyBoZWxwZXJzIGJlbG93LiAgSW5wdXRzCisgKiAoY2FsbGVyLXByb3ZpZGVkIG9wdGlvbiBmbGFn cykgYXJlIGZpbGxlZCBpbiBvbmNlIGF0IHRoZSB0b3Agb2YKKyAqIHBnX2dldF90YWJsZV9kZGxf aW50ZXJuYWwgYW5kIHRyZWF0ZWQgYXMgcmVhZC1vbmx5IHRoZXJlYWZ0ZXIuICBEZXJpdmVkCisg KiBmaWVsZHMgKHF1YWxuYW1lLCBzY2hlbWFfcHJlZml4LCBubl9lbnRyaWVzLCBza2lwX25vdG51 bGxfb2lkcykgYXJlCisgKiBjb21wdXRlZCBvbmNlIGR1cmluZyBzZXR1cC4gIEVhY2ggcGFzcyBh cHBlbmRzIHRvIGN0eC0+YnVmIGFuZCBwdXNoZXMKKyAqIHRoZSBmaW5pc2hlZCBzdGF0ZW1lbnQg b250byBjdHgtPnN0YXRlbWVudHMgdmlhIGFwcGVuZF9zdG10KCkuCisgKi8KK3R5cGVkZWYgc3Ry dWN0IFRhYmxlRGRsQ29udGV4dAoreworCVJlbGF0aW9uCXJlbDsKKwlPaWQJCQlyZWxpZDsKKwli b29sCQlwcmV0dHk7CisJYm9vbAkJbm9fb3duZXI7CisJYm9vbAkJbm9fdGFibGVzcGFjZTsKKwli b29sCQlpbmNsdWRlX2luZGV4ZXM7CisJYm9vbAkJaW5jbHVkZV9jb25zdHJhaW50czsKKwlib29s CQlpbmNsdWRlX3J1bGVzOworCWJvb2wJCWluY2x1ZGVfc3RhdGlzdGljczsKKwlib29sCQlpbmNs dWRlX3RyaWdnZXJzOworCWJvb2wJCWluY2x1ZGVfcG9saWNpZXM7CisJYm9vbAkJaW5jbHVkZV9y bHM7CisJYm9vbAkJaW5jbHVkZV9yZXBsaWNhX2lkZW50aXR5OworCWJvb2wJCWluY2x1ZGVfcGFy dGl0aW9uOworCWJvb2wJCXNjaGVtYV9xdWFsaWZpZWQ7CisKKwkvKiBEZXJpdmVkIGR1cmluZyBz ZXR1cCAqLworCU9pZAkJCWJhc2VfbmFtZXNwYWNlOworCWNoYXIJICAgKnF1YWxuYW1lOworCWNo YXIJICAgKnNjaGVtYV9wcmVmaXg7CS8qIE5VTEwgd2hlbiBzY2hlbWFfcXVhbGlmaWVkICovCisJ aW50CQkJc2F2ZV9uZXN0bGV2ZWw7IC8qID49IDAgaWYgd2UgbmFycm93ZWQgc2VhcmNoX3BhdGgg Ki8KKwlMb2NhbE5vdE51bGxFbnRyeSAqbm5fZW50cmllczsKKwlMaXN0CSAgICpza2lwX25vdG51 bGxfb2lkczsKKworCS8qIE11dGFibGUgd29ya2luZyBzdGF0ZSAqLworCVN0cmluZ0luZm9EYXRh IGJ1ZjsKKwlMaXN0CSAgICpzdGF0ZW1lbnRzOworfQkJCVRhYmxlRGRsQ29udGV4dDsKKworc3Rh dGljIExpc3QgKnBnX2dldF90YWJsZV9kZGxfaW50ZXJuYWwoT2lkIHJlbGlkLCBib29sIHByZXR0 eSwKKwkJCQkJCQkJCSAgIGJvb2wgbm9fb3duZXIsIGJvb2wgbm9fdGFibGVzcGFjZSwKKwkJCQkJ CQkJCSAgIGJvb2wgaW5jbHVkZV9pbmRleGVzLAorCQkJCQkJCQkJICAgYm9vbCBpbmNsdWRlX2Nv bnN0cmFpbnRzLAorCQkJCQkJCQkJICAgYm9vbCBpbmNsdWRlX3J1bGVzLAorCQkJCQkJCQkJICAg Ym9vbCBpbmNsdWRlX3N0YXRpc3RpY3MsCisJCQkJCQkJCQkgICBib29sIGluY2x1ZGVfdHJpZ2dl cnMsCisJCQkJCQkJCQkgICBib29sIGluY2x1ZGVfcG9saWNpZXMsCisJCQkJCQkJCQkgICBib29s IGluY2x1ZGVfcmxzLAorCQkJCQkJCQkJICAgYm9vbCBpbmNsdWRlX3JlcGxpY2FfaWRlbnRpdHks CisJCQkJCQkJCQkgICBib29sIGluY2x1ZGVfcGFydGl0aW9uLAorCQkJCQkJCQkJICAgYm9vbCBz Y2hlbWFfcXVhbGlmaWVkKTsKK3N0YXRpYyB2b2lkIGFwcGVuZF9jb2x1bW5fZGVmcyhTdHJpbmdJ bmZvIGJ1ZiwgUmVsYXRpb24gcmVsLCBib29sIHByZXR0eSwKKwkJCQkJCQkgICBib29sIGluY2x1 ZGVfY29uc3RyYWludHMsCisJCQkJCQkJICAgYm9vbCBzY2hlbWFfcXVhbGlmaWVkLAorCQkJCQkJ CSAgIExvY2FsTm90TnVsbEVudHJ5ICogbm5fZW50cmllcyk7CitzdGF0aWMgdm9pZCBhcHBlbmRf dHlwZWRfY29sdW1uX292ZXJyaWRlcyhTdHJpbmdJbmZvIGJ1ZiwgUmVsYXRpb24gcmVsLAorCQkJ CQkJCQkJCSAgYm9vbCBwcmV0dHksIGJvb2wgaW5jbHVkZV9jb25zdHJhaW50cywKKwkJCQkJCQkJ CQkgIExvY2FsTm90TnVsbEVudHJ5ICogbm5fZW50cmllcyk7CitzdGF0aWMgdm9pZCBhcHBlbmRf aW5saW5lX2NoZWNrX2NvbnN0cmFpbnRzKFN0cmluZ0luZm8gYnVmLCBSZWxhdGlvbiByZWwsCisJ CQkJCQkJCQkJCWJvb2wgcHJldHR5LCBib29sICpmaXJzdCk7CitzdGF0aWMgY2hhciAqZmluZF9h dHRyZGVmX3RleHQoUmVsYXRpb24gcmVsLCBBdHRyTnVtYmVyIGF0dG51bSwKKwkJCQkJCQkgICBM aXN0ICoqZHBjb250ZXh0KTsKK3N0YXRpYyBjaGFyICpsb29rdXBfcXVhbGlmaWVkX3JlbG5hbWUo T2lkIHJlbGlkKTsKK3N0YXRpYyBjaGFyICpsb29rdXBfcmVsbmFtZV9mb3JfZW1pdChPaWQgcmVs aWQsIGJvb2wgc2NoZW1hX3F1YWxpZmllZCwKKwkJCQkJCQkJCSBPaWQgYmFzZV9uYW1lc3BhY2Up Oworc3RhdGljIGNoYXIgKnN0cmlwX3NjaGVtYV9wcmVmaXgoY29uc3QgY2hhciAqc3RtdCwgY29u c3QgY2hhciAqcHJlZml4KTsKK3N0YXRpYyBMb2NhbE5vdE51bGxFbnRyeSAqIGNvbGxlY3RfbG9j YWxfbm90X251bGwoUmVsYXRpb24gcmVsLAorCQkJCQkJCQkJCQkJICBMaXN0ICoqc2tpcF9vaWRz KTsKK3N0YXRpYyBMaXN0ICpnZXRfaW5oZXJpdGFuY2VfcGFyZW50cyhPaWQgcmVsaWQpOworCitz dGF0aWMgdm9pZCBhcHBlbmRfc3RtdChUYWJsZURkbENvbnRleHQgKiBjdHgpOworc3RhdGljIHZv aWQgZW1pdF9jcmVhdGVfdGFibGVfc3RtdChUYWJsZURkbENvbnRleHQgKiBjdHgpOworc3RhdGlj IHZvaWQgZW1pdF9vd25lcl9zdG10KFRhYmxlRGRsQ29udGV4dCAqIGN0eCk7CitzdGF0aWMgdm9p ZCBlbWl0X2NoaWxkX2RlZmF1bHRfb3ZlcnJpZGVzKFRhYmxlRGRsQ29udGV4dCAqIGN0eCk7Citz dGF0aWMgdm9pZCBlbWl0X2F0dG9wdGlvbnMoVGFibGVEZGxDb250ZXh0ICogY3R4KTsKK3N0YXRp YyB2b2lkIGVtaXRfaW5kZXhlcyhUYWJsZURkbENvbnRleHQgKiBjdHgpOworc3RhdGljIHZvaWQg ZW1pdF9sb2NhbF9jb25zdHJhaW50cyhUYWJsZURkbENvbnRleHQgKiBjdHgpOworc3RhdGljIHZv aWQgZW1pdF9ydWxlcyhUYWJsZURkbENvbnRleHQgKiBjdHgpOworc3RhdGljIHZvaWQgZW1pdF9z dGF0aXN0aWNzKFRhYmxlRGRsQ29udGV4dCAqIGN0eCk7CitzdGF0aWMgdm9pZCBlbWl0X3JlcGxp Y2FfaWRlbnRpdHkoVGFibGVEZGxDb250ZXh0ICogY3R4KTsKK3N0YXRpYyB2b2lkIGVtaXRfcmxz X3RvZ2dsZXMoVGFibGVEZGxDb250ZXh0ICogY3R4KTsKK3N0YXRpYyB2b2lkIGVtaXRfcGFydGl0 aW9uX2NoaWxkcmVuKFRhYmxlRGRsQ29udGV4dCAqIGN0eCk7CisKIAogLyoKICAqIHBhcnNlX2Rk bF9vcHRpb25zCkBAIC0xMTg1LDMgKzEyOTksMTY4OSBAQCBwZ19nZXRfZGF0YWJhc2VfZGRsKFBH X0ZVTkNUSU9OX0FSR1MpCiAJCVNSRl9SRVRVUk5fRE9ORShmdW5jY3R4KTsKIAl9CiB9CisKKy8q CisgKiBnZXRfaW5oZXJpdGFuY2VfcGFyZW50cworICoJCVJldHVybiBhIExpc3Qgb2YgcGFyZW50 IE9JRHMgZm9yIHJlbGlkLCBvcmRlcmVkIGJ5IGluaHNlcW5vLgorICoKKyAqIGZpbmRfaW5oZXJp dGFuY2VfY2hpbGRyZW4oKSB3YWxrcyB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uIChwYXJlbnQtPmNo aWxkcmVuKSwKKyAqIHNvIHdlIHNjYW4gcGdfaW5oZXJpdHMgZGlyZWN0bHkgaGVyZSB1c2luZyB0 aGUgKGluaHJlbGlkLCBpbmhzZXFubykgaW5kZXgsCisgKiB3aGljaCB5aWVsZHMgcm93cyBpbiB0 aGUgb3JkZXIgdGhleSBuZWVkIHRvIGFwcGVhciBpbiB0aGUgSU5IRVJJVFMgY2xhdXNlLgorICog UGFydGl0aW9uIGNoaWxkcmVuIGFsc28gaGF2ZSBhIHBnX2luaGVyaXRzIGVudHJ5LCBzbyBjYWxs ZXJzIG11c3Qgc2tpcCB0aGUKKyAqIElOSEVSSVRTIGNsYXVzZSB3aGVuIHJlbGlzcGFydGl0aW9u IGlzIHRydWUuCisgKi8KK3N0YXRpYyBMaXN0ICoKK2dldF9pbmhlcml0YW5jZV9wYXJlbnRzKE9p ZCByZWxpZCkKK3sKKwlSZWxhdGlvbglpbmhlcml0c1JlbDsKKwlTeXNTY2FuRGVzYyBzY2FuOwor CVNjYW5LZXlEYXRhIGtleTsKKwlIZWFwVHVwbGUJdHVwOworCUxpc3QJICAgKnBhcmVudHMgPSBO SUw7CisKKwlpbmhlcml0c1JlbCA9IHRhYmxlX29wZW4oSW5oZXJpdHNSZWxhdGlvbklkLCBBY2Nl c3NTaGFyZUxvY2spOworCVNjYW5LZXlJbml0KCZrZXksCisJCQkJQW51bV9wZ19pbmhlcml0c19p bmhyZWxpZCwKKwkJCQlCVEVxdWFsU3RyYXRlZ3lOdW1iZXIsIEZfT0lERVEsCisJCQkJT2JqZWN0 SWRHZXREYXR1bShyZWxpZCkpOworCXNjYW4gPSBzeXN0YWJsZV9iZWdpbnNjYW4oaW5oZXJpdHNS ZWwsIEluaGVyaXRzUmVsaWRTZXFub0luZGV4SWQsCisJCQkJCQkJICB0cnVlLCBOVUxMLCAxLCAm a2V5KTsKKwl3aGlsZSAoSGVhcFR1cGxlSXNWYWxpZCh0dXAgPSBzeXN0YWJsZV9nZXRuZXh0KHNj YW4pKSkKKwl7CisJCUZvcm1fcGdfaW5oZXJpdHMgaW5oID0gKEZvcm1fcGdfaW5oZXJpdHMpIEdF VFNUUlVDVCh0dXApOworCisJCXBhcmVudHMgPSBsYXBwZW5kX29pZChwYXJlbnRzLCBpbmgtPmlu aHBhcmVudCk7CisJfQorCXN5c3RhYmxlX2VuZHNjYW4oc2Nhbik7CisJdGFibGVfY2xvc2UoaW5o ZXJpdHNSZWwsIEFjY2Vzc1NoYXJlTG9jayk7CisKKwlyZXR1cm4gcGFyZW50czsKK30KKworLyoK KyAqIGxvb2t1cF9xdWFsaWZpZWRfcmVsbmFtZQorICoJCVJldHVybiB0aGUgc2NoZW1hLXF1YWxp ZmllZCwgaWRlbnRpZmllci1xdW90ZWQgbmFtZSBvZiBhIHJlbGF0aW9uLAorICoJCW9yIHJhaXNl IEVSUkNPREVfVU5ERUZJTkVEX09CSkVDVCBpZiB0aGUgcmVsYXRpb24gaGFzIGRpc2FwcGVhcmVk LgorICoKKyAqIFJlcGxhY2VzIHRoZSB1bnNhZmUgcGF0dGVybgorICoJICBxdW90ZV9xdWFsaWZp ZWRfaWRlbnRpZmllcihnZXRfbmFtZXNwYWNlX25hbWUoZ2V0X3JlbF9uYW1lc3BhY2Uob2lkKSks CisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9yZWxfbmFtZShvaWQpKQorICog d2hpY2ggZGVyZWZlcmVuY2VzIE5VTEwgd2hlbiBhIGNvbmN1cnJlbnQgdHJhbnNhY3Rpb24gaGFz IGRyb3BwZWQgdGhlCisgKiByZWZlcmVuY2VkIHJlbGF0aW9uIChvciBpdHMgc2NoZW1hKSBiZXR3 ZWVuIHdoZW4gd2UgY2FjaGVkIGl0cyBPSUQgYW5kCisgKiB3aGVuIHdlIGFzayB0aGUgc3lzY2Fj aGUgZm9yIGl0cyBuYW1lLiAgSG9sZGluZyBBY2Nlc3NTaGFyZUxvY2sgb24gYQorICogZGVwZW5k ZW50IHJlbGF0aW9uIG1ha2VzIHRoaXMgcmFjZSB2YW5pc2hpbmdseSB1bmxpa2VseSBpbiBwcmFj dGljZSwKKyAqIGJ1dCB3ZSBzdGlsbCBkZWZlbmQgYWdhaW5zdCBpdCBiZWNhdXNlIHRoZSBhbHRl cm5hdGl2ZSBpcyBhIFNJR1NFR1YuCisgKgorICogQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBw ZnJlZSgpaW5nIHRoZSByZXN1bHQuCisgKi8KK3N0YXRpYyBjaGFyICoKK2xvb2t1cF9xdWFsaWZp ZWRfcmVsbmFtZShPaWQgcmVsaWQpCit7CisJSGVhcFR1cGxlCXRwOworCUZvcm1fcGdfY2xhc3Mg cmVsdHVwOworCWNoYXIJICAgKm5zcG5hbWU7CisJY2hhcgkgICAqcmVzdWx0OworCisJdHAgPSBT ZWFyY2hTeXNDYWNoZTEoUkVMT0lELCBPYmplY3RJZEdldERhdHVtKHJlbGlkKSk7CisJaWYgKCFI ZWFwVHVwbGVJc1ZhbGlkKHRwKSkKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShFUlJD T0RFX1VOREVGSU5FRF9PQkpFQ1QpLAorCQkJCSBlcnJtc2coInJlbGF0aW9uIHdpdGggT0lEICV1 IGRvZXMgbm90IGV4aXN0IiwgcmVsaWQpLAorCQkJCSBlcnJkZXRhaWwoIkl0IG1heSBoYXZlIGJl ZW4gY29uY3VycmVudGx5IGRyb3BwZWQuIikpKTsKKworCXJlbHR1cCA9IChGb3JtX3BnX2NsYXNz KSBHRVRTVFJVQ1QodHApOworCW5zcG5hbWUgPSBnZXRfbmFtZXNwYWNlX25hbWUocmVsdHVwLT5y ZWxuYW1lc3BhY2UpOworCWlmIChuc3BuYW1lID09IE5VTEwpCisJeworCQlPaWQJCQluc3BvaWQg PSByZWx0dXAtPnJlbG5hbWVzcGFjZTsKKworCQlSZWxlYXNlU3lzQ2FjaGUodHApOworCQllcmVw b3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfVU5ERUZJTkVEX09CSkVDVCksCisJCQkJ IGVycm1zZygic2NoZW1hIHdpdGggT0lEICV1IGRvZXMgbm90IGV4aXN0IiwgbnNwb2lkKSwKKwkJ CQkgZXJyZGV0YWlsKCJJdCBtYXkgaGF2ZSBiZWVuIGNvbmN1cnJlbnRseSBkcm9wcGVkLiIpKSk7 CisJfQorCisJcmVzdWx0ID0gcXVvdGVfcXVhbGlmaWVkX2lkZW50aWZpZXIobnNwbmFtZSwgTmFt ZVN0cihyZWx0dXAtPnJlbG5hbWUpKTsKKworCXBmcmVlKG5zcG5hbWUpOworCVJlbGVhc2VTeXND YWNoZSh0cCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogbG9va3VwX3JlbG5hbWVf Zm9yX2VtaXQKKyAqCQlSZXR1cm4gZWl0aGVyIHRoZSBzY2hlbWEtcXVhbGlmaWVkIG9yIHRoZSBi YXJlIHF1b3RlZCBuYW1lIG9mIGEKKyAqCQlyZWxhdGlvbiwgZGVwZW5kaW5nIG9uIHRoZSBzY2hl bWFfcXVhbGlmaWVkIGZsYWcuCisgKgorICogV2hlbiBzY2hlbWFfcXVhbGlmaWVkIGlzIHRydWUg dGhpcyBpcyBpZGVudGljYWwgdG8KKyAqIGxvb2t1cF9xdWFsaWZpZWRfcmVsbmFtZS4gIFdoZW4g ZmFsc2UsIHRoZSBiYXJlIHJlbG5hbWUgaXMgcmV0dXJuZWQKKyAqIG9ubHkgaWYgdGhlIHRhcmdl dCByZWxhdGlvbiBsaXZlcyBpbiBiYXNlX25hbWVzcGFjZSAodGhlIG5hbWVzcGFjZQorICogb2Yg dGhlIHRhYmxlIHdob3NlIERETCBpcyBiZWluZyBnZW5lcmF0ZWQpOyBvdGhlcndpc2UgdGhlIHNj aGVtYS0KKyAqIHF1YWxpZmllZCBmb3JtIGlzIHN0aWxsIHJldHVybmVkLCBiZWNhdXNlIGNyb3Nz LXNjaGVtYSByZWZlcmVuY2VzCisgKiAoZm9yIGV4YW1wbGUgYW4gaW5oZXJpdGFuY2UgcGFyZW50 IG9yIGZvcmVpZ24ga2V5IHRhcmdldCBpbiBhCisgKiBkaWZmZXJlbnQgc2NoZW1hKSBhcmUgbm90 IHNhZmUgdG8gc3RyaXAuCisgKgorICogQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBwZnJlZSgp aW5nIHRoZSByZXN1bHQuCisgKi8KK3N0YXRpYyBjaGFyICoKK2xvb2t1cF9yZWxuYW1lX2Zvcl9l bWl0KE9pZCByZWxpZCwgYm9vbCBzY2hlbWFfcXVhbGlmaWVkLCBPaWQgYmFzZV9uYW1lc3BhY2Up Cit7CisJSGVhcFR1cGxlCXRwOworCUZvcm1fcGdfY2xhc3MgcmVsdHVwOworCWNoYXIJICAgKnJl c3VsdDsKKworCWlmIChzY2hlbWFfcXVhbGlmaWVkKQorCQlyZXR1cm4gbG9va3VwX3F1YWxpZmll ZF9yZWxuYW1lKHJlbGlkKTsKKworCXRwID0gU2VhcmNoU3lzQ2FjaGUxKFJFTE9JRCwgT2JqZWN0 SWRHZXREYXR1bShyZWxpZCkpOworCWlmICghSGVhcFR1cGxlSXNWYWxpZCh0cCkpCisJCWVyZXBv cnQoRVJST1IsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9VTkRFRklORURfT0JKRUNUKSwKKwkJCQkg ZXJybXNnKCJyZWxhdGlvbiB3aXRoIE9JRCAldSBkb2VzIG5vdCBleGlzdCIsIHJlbGlkKSwKKwkJ CQkgZXJyZGV0YWlsKCJJdCBtYXkgaGF2ZSBiZWVuIGNvbmN1cnJlbnRseSBkcm9wcGVkLiIpKSk7 CisKKwlyZWx0dXAgPSAoRm9ybV9wZ19jbGFzcykgR0VUU1RSVUNUKHRwKTsKKwlpZiAocmVsdHVw LT5yZWxuYW1lc3BhY2UgIT0gYmFzZV9uYW1lc3BhY2UpCisJeworCQkvKiBDcm9zcy1zY2hlbWEg cmVmZXJlbmNlOiBxdWFsaWZpY2F0aW9uIGlzIHJlcXVpcmVkIGZvciBjb3JyZWN0bmVzcy4gKi8K KwkJUmVsZWFzZVN5c0NhY2hlKHRwKTsKKwkJcmV0dXJuIGxvb2t1cF9xdWFsaWZpZWRfcmVsbmFt ZShyZWxpZCk7CisJfQorCisJcmVzdWx0ID0gcHN0cmR1cChxdW90ZV9pZGVudGlmaWVyKE5hbWVT dHIocmVsdHVwLT5yZWxuYW1lKSkpOworCVJlbGVhc2VTeXNDYWNoZSh0cCk7CisKKwlyZXR1cm4g cmVzdWx0OworfQorCisvKgorICogc3RyaXBfc2NoZW1hX3ByZWZpeAorICoJCVJldHVybiBhIHBh bGxvYydkIGNvcHkgb2Ygc3RtdCB3aXRoIGV2ZXJ5IG9jY3VycmVuY2Ugb2YgcHJlZml4CisgKgkJ cmVtb3ZlZCwgZXhjZXB0IG9jY3VycmVuY2VzIHRoYXQgZmFsbCBpbnNpZGUgYSBzaW5nbGUtcXVv dGVkIFNRTAorICoJCXN0cmluZyBsaXRlcmFsLgorICoKKyAqIFVzZWQgdG8gc3RyaXAgdGhlIHF1 YWxpZmllZC1zY2hlbWEgcHJlZml4IChmb3IgZXhhbXBsZSAib2xkX3NjaGVtYS4iKQorICogZnJv bSBEREwgZW1pdHRlZCBieSB0aGUgYWx3YXlzLXF1YWxpZmllZCBydWxldXRpbHMgaGVscGVycwor ICogKHBnX2dldF9jb25zdHJhaW50ZGVmX2NvbW1hbmQsIHBnX2dldF9pbmRleGRlZl9zdHJpbmcs CisgKiBwZ19nZXRfcnVsZWRlZiwgcGdfZ2V0X3N0YXRpc3RpY3NvYmpkZWZfc3RyaW5nKSB3aGVu IHRoZSBjYWxsZXIgaGFzCisgKiByZXF1ZXN0ZWQgdW5xdWFsaWZpZWQgb3V0cHV0IHZpYSBzY2hl bWFfcXVhbGlmaWVkPWZhbHNlLiAgQSBwbGFpbgorICogc3Vic3RyaW5nIHN0cmlwIHdvdWxkIGNv cnJ1cHQgc3RyaW5nIGxpdGVyYWxzIHdob3NlIGNvbnRlbnRzIGhhcHBlbgorICogdG8gY29udGFp biAiPHNjaGVtYT4uIiAoZm9yIGV4YW1wbGUgYSBDSEVDSyBjb21wYXJpbmcgYWdhaW5zdAorICog J215c2NoZW1hLnNlY3JldCcpLCBzbyB3ZSB0cmFjayBxdW90aW5nIHN0YXRlIGFuZCBza2lwIG1h dGNoZXMgdGhhdAorICogb2NjdXIgd2hpbGUgd2UgYXJlIGluc2lkZSBhIHN0cmluZy4gIEVzY2Fw ZWQgcXVvdGVzICgnJykgaW5zaWRlIGEKKyAqIHN0cmluZyBhcmUgaGFuZGxlZCBieSBrZWVwaW5n IHRoZSBpbi1zdHJpbmcgZmxhZyBzZXQgYWNyb3NzIHRoZW0uCisgKi8KK3N0YXRpYyBjaGFyICoK K3N0cmlwX3NjaGVtYV9wcmVmaXgoY29uc3QgY2hhciAqc3RtdCwgY29uc3QgY2hhciAqcHJlZml4 KQoreworCVN0cmluZ0luZm9EYXRhIGJ1ZjsKKwlzaXplX3QJCXBsZW4gPSBzdHJsZW4ocHJlZml4 KTsKKwljb25zdCBjaGFyICpwID0gc3RtdDsKKwlib29sCQlpbl9zdHJpbmcgPSBmYWxzZTsKKwor CWluaXRTdHJpbmdJbmZvKCZidWYpOworCXdoaWxlICgqcCkKKwl7CisJCWlmICgqcCA9PSAnXCcn KQorCQl7CisJCQkvKiBTUUwgJycgZXNjYXBlOiBlbWl0IGJvdGggcXVvdGVzIGFuZCBzdGF5IGlu c2lkZSB0aGUgc3RyaW5nLiAqLworCQkJaWYgKGluX3N0cmluZyAmJiBwWzFdID09ICdcJycpCisJ CQl7CisJCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoJmJ1ZiwgJ1wnJyk7CisJCQkJYXBwZW5kU3Ry aW5nSW5mb0NoYXIoJmJ1ZiwgJ1wnJyk7CisJCQkJcCArPSAyOworCQkJCWNvbnRpbnVlOworCQkJ fQorCQkJaW5fc3RyaW5nID0gIWluX3N0cmluZzsKKwkJCWFwcGVuZFN0cmluZ0luZm9DaGFyKCZi dWYsICpwKTsKKwkJCXArKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghaW5fc3RyaW5nICYm IHN0cm5jbXAocCwgcHJlZml4LCBwbGVuKSA9PSAwKQorCQl7CisJCQlwICs9IHBsZW47CisJCQlj b250aW51ZTsKKwkJfQorCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcigmYnVmLCAqcCk7CisJCXArKzsK Kwl9CisJcmV0dXJuIGJ1Zi5kYXRhOworfQorCisvKgorICogY29sbGVjdF9sb2NhbF9ub3RfbnVs bAorICoJCVNjYW4gcGdfY29uc3RyYWludCBvbmNlIGZvciBsb2NhbGx5LWRlY2xhcmVkIE5PVCBO VUxMIGNvbnN0cmFpbnRzCisgKgkJb24gcmVsLCByZXR1cm5pbmcgYSBwYWxsb2MnZCBhcnJheSBp bmRleGVkIGJ5IGF0dG51bSAoMS4ubmF0dHMpLgorICoKKyAqIEVudHJpZXMgd2l0aCBjb25vaWQ9 PUludmFsaWRPaWQgbWVhbiAibm8gbG9jYWwgTk9UIE5VTEwgcm93IGZvciB0aGlzCisgKiBjb2x1 bW4iLiAgV2hlbiB0aGUgY29uc3RyYWludCBuYW1lIGRvZXMgbm90IG1hdGNoIHRoZSBhdXRvLWdl bmVyYXRlZAorICogcGF0dGVybiAiPHRhYmxlbmFtZT5fPGNvbHVtbm5hbWU+X25vdF9udWxsIiwg dGhlIGNvbnN0cmFpbnQgT0lEIGlzCisgKiBhcHBlbmRlZCB0byAqc2tpcF9vaWRzIHNvIHRoZSBw b3N0LUNSRUFURSBjb25zdHJhaW50IGxvb3AgY2FuIGF2b2lkCisgKiByZS1lbWl0dGluZyBpdCBh cyBBTFRFUiBUQUJMRSDigKYgQUREIENPTlNUUkFJTlQg4oCUIHRoZSBjb2x1bW4tZW1pdAorICog cGFzcyB3aWxsIHByb2R1Y2UgaXQgaW5saW5lIGFzICJDT05TVFJBSU5UIG5hbWUgTk9UIE5VTEwi IGluc3RlYWQuCisgKi8KK3N0YXRpYyBMb2NhbE5vdE51bGxFbnRyeSAqCitjb2xsZWN0X2xvY2Fs X25vdF9udWxsKFJlbGF0aW9uIHJlbCwgTGlzdCAqKnNraXBfb2lkcykKK3sKKwlUdXBsZURlc2MJ dHVwZGVzYyA9IFJlbGF0aW9uR2V0RGVzY3IocmVsKTsKKwlpbnQJCQluYXR0cyA9IHR1cGRlc2Mt Pm5hdHRzOworCUxvY2FsTm90TnVsbEVudHJ5ICplbnRyaWVzOworCWNvbnN0IGNoYXIgKnJlbG5h bWUgPSBSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShyZWwpOworCVJlbGF0aW9uCWNvblJlbDsKKwlT eXNTY2FuRGVzYyBjb25TY2FuOworCVNjYW5LZXlEYXRhIGNvbktleTsKKwlIZWFwVHVwbGUJY29u VHVwOworCisJZW50cmllcyA9IChMb2NhbE5vdE51bGxFbnRyeSAqKSBwYWxsb2MwKHNpemVvZihM b2NhbE5vdE51bGxFbnRyeSkgKgorCQkJCQkJCQkJCQkobmF0dHMgKyAxKSk7CisKKwljb25SZWwg PSB0YWJsZV9vcGVuKENvbnN0cmFpbnRSZWxhdGlvbklkLCBBY2Nlc3NTaGFyZUxvY2spOworCVNj YW5LZXlJbml0KCZjb25LZXksCisJCQkJQW51bV9wZ19jb25zdHJhaW50X2NvbnJlbGlkLAorCQkJ CUJURXF1YWxTdHJhdGVneU51bWJlciwgRl9PSURFUSwKKwkJCQlPYmplY3RJZEdldERhdHVtKFJl bGF0aW9uR2V0UmVsaWQocmVsKSkpOworCWNvblNjYW4gPSBzeXN0YWJsZV9iZWdpbnNjYW4oY29u UmVsLCBDb25zdHJhaW50UmVsaWRUeXBpZE5hbWVJbmRleElkLAorCQkJCQkJCQkgdHJ1ZSwgTlVM TCwgMSwgJmNvbktleSk7CisKKwl3aGlsZSAoSGVhcFR1cGxlSXNWYWxpZChjb25UdXAgPSBzeXN0 YWJsZV9nZXRuZXh0KGNvblNjYW4pKSkKKwl7CisJCUZvcm1fcGdfY29uc3RyYWludCBjb24gPSAo Rm9ybV9wZ19jb25zdHJhaW50KSBHRVRTVFJVQ1QoY29uVHVwKTsKKwkJRGF0dW0JCWNvbmtleURh dDsKKwkJYm9vbAkJY29ua2V5TnVsbDsKKwkJQXJyYXlUeXBlICAqY29ua2V5QXJyOworCQlpbnQx NgkgICAqY29ua2V5VmFsczsKKwkJaW50CQkJYXR0bnVtOworCQlGb3JtX3BnX2F0dHJpYnV0ZSBh dHQ7CisJCWNoYXIJCWF1dG9uYW1lW05BTUVEQVRBTEVOXTsKKworCQlpZiAoY29uLT5jb250eXBl ICE9IENPTlNUUkFJTlRfTk9UTlVMTCkKKwkJCWNvbnRpbnVlOworCQlpZiAoIWNvbi0+Y29uaXNs b2NhbCkKKwkJCWNvbnRpbnVlOworCisJCWNvbmtleURhdCA9IGhlYXBfZ2V0YXR0cihjb25UdXAs IEFudW1fcGdfY29uc3RyYWludF9jb25rZXksCisJCQkJCQkJCSBSZWxhdGlvbkdldERlc2NyKGNv blJlbCksICZjb25rZXlOdWxsKTsKKwkJaWYgKGNvbmtleU51bGwpCisJCQljb250aW51ZTsKKwkJ Y29ua2V5QXJyID0gRGF0dW1HZXRBcnJheVR5cGVQKGNvbmtleURhdCk7CisKKwkJLyoKKwkJICog RGVmZW5kIGFnYWluc3QgYSBtYWxmb3JtZWQgY29ua2V5OiBhIE5PVCBOVUxMIGNvbnN0cmFpbnQg aXMgYWx3YXlzCisJCSAqIGEgc2luZ2xlLWNvbHVtbiAxLUQgaW50MiBhcnJheSwgYnV0IGEgY29y cnVwdGVkIGNhdGFsb2cgb3IgYSBmdXR1cmUKKwkJICogcGF0Y2ggdGhhdCBzdG9yZXMgd2lkZXIg Y29ua2V5cyBtdXN0bid0IHRyaXAgdXMgaW50byByZWFkaW5nIHBhc3QKKwkJICogdGhlIGFycmF5 IGhlYWRlci4KKwkJICovCisJCWlmIChBUlJfTkRJTShjb25rZXlBcnIpICE9IDEgfHwKKwkJCUFS Ul9ESU1TKGNvbmtleUFycilbMF0gPCAxIHx8CisJCQlBUlJfSEFTTlVMTChjb25rZXlBcnIpIHx8 CisJCQlBUlJfRUxFTVRZUEUoY29ua2V5QXJyKSAhPSBJTlQyT0lEKQorCQkJY29udGludWU7CisK KwkJY29ua2V5VmFscyA9IChpbnQxNiAqKSBBUlJfREFUQV9QVFIoY29ua2V5QXJyKTsKKwkJYXR0 bnVtID0gY29ua2V5VmFsc1swXTsKKwkJaWYgKGF0dG51bSA8IDEgfHwgYXR0bnVtID4gbmF0dHMp CisJCQljb250aW51ZTsKKworCQlhdHQgPSBUdXBsZURlc2NBdHRyKHR1cGRlc2MsIGF0dG51bSAt IDEpOworCQlzbnByaW50ZihhdXRvbmFtZSwgc2l6ZW9mKGF1dG9uYW1lKSwgIiVzXyVzX25vdF9u dWxsIiwKKwkJCQkgcmVsbmFtZSwgTmFtZVN0cihhdHQtPmF0dG5hbWUpKTsKKworCQllbnRyaWVz W2F0dG51bV0uY29ub2lkID0gY29uLT5vaWQ7CisJCWVudHJpZXNbYXR0bnVtXS5uYW1lID0gcHN0 cmR1cChOYW1lU3RyKGNvbi0+Y29ubmFtZSkpOworCQllbnRyaWVzW2F0dG51bV0uaXNfYXV0byA9 IChzdHJjbXAoTmFtZVN0cihjb24tPmNvbm5hbWUpLCBhdXRvbmFtZSkgPT0gMCk7CisJCWVudHJp ZXNbYXR0bnVtXS5ub19pbmhlcml0ID0gY29uLT5jb25ub2luaGVyaXQ7CisKKwkJLyoKKwkJICog SW5saW5lIGVtaXNzaW9uIG9mICJDT05TVFJBSU5UIG5hbWUgTk9UIE5VTEwiIG9ubHkgaGFwcGVu cyBmb3IKKwkJICogY29sdW1ucyB0aGF0IHRoZSBjb2x1bW4gbGlzdCBhY3R1YWxseSBlbWl0cywg aS5lLiBhdHRpc2xvY2FsCisJCSAqIGNvbHVtbnMuICBGb3IgYSBsb2NhbGx5LWRlY2xhcmVkIE5P VCBOVUxMIHNpdHRpbmcgb24gYW4gaW5oZXJpdGVkCisJCSAqIGNvbHVtbiB0aGUgaW5saW5lIHBh dGggbmV2ZXIgZmlyZXMsIHNvIHdlIG11c3QgbGVhdmUgdGhlIGNvbnN0cmFpbnQKKwkJICogT0lE IG91dCBvZiBza2lwX29pZHMgYW5kIGxldCB0aGUgcG9zdC1DUkVBVEUgY29uc3RyYWludCBsb29w IGVtaXQKKwkJICogQUxURVIgVEFCTEUgLi4uIEFERCBDT05TVFJBSU5ULgorCQkgKi8KKwkJaWYg KCFlbnRyaWVzW2F0dG51bV0uaXNfYXV0byAmJiBhdHQtPmF0dGlzbG9jYWwgJiYgc2tpcF9vaWRz ICE9IE5VTEwpCisJCQkqc2tpcF9vaWRzID0gbGFwcGVuZF9vaWQoKnNraXBfb2lkcywgY29uLT5v aWQpOworCX0KKwlzeXN0YWJsZV9lbmRzY2FuKGNvblNjYW4pOworCXRhYmxlX2Nsb3NlKGNvblJl bCwgQWNjZXNzU2hhcmVMb2NrKTsKKworCXJldHVybiBlbnRyaWVzOworfQorCisvKgorICogZmlu ZF9hdHRyZGVmX3RleHQKKyAqCQlSZXR1cm4gdGhlIGRlcGFyc2VkIERFRkFVTFQvR0VORVJBVEVE IGV4cHJlc3Npb24gZm9yIGF0dG51bSBvbiByZWwsCisgKgkJb3IgTlVMTCBpZiBubyBlbnRyeSBl eGlzdHMgaW4gVHVwbGVDb25zdHItPmRlZnZhbC4KKyAqCisgKiBUaGUgY2FsbGVyIHBhc3NlcyBh IExpc3QgKiogc28gdGhhdCB0aGUgZGVwYXJzZSBjb250ZXh0IGlzIGJ1aWx0IGxhemlseQorICog YW5kIHJldXNlZCBhY3Jvc3MgY2FsbHMgKGRlcGFyc2VfY29udGV4dF9mb3IgaXMgbm90IGNoZWFw KS4gIFJldHVybmVkCisgKiBzdHJpbmcgaXMgcGFsbG9jJ2QgaW4gdGhlIGN1cnJlbnQgbWVtb3J5 IGNvbnRleHQ7IGNhbGxlciBwZnJlZSdzIGl0LgorICovCitzdGF0aWMgY2hhciAqCitmaW5kX2F0 dHJkZWZfdGV4dChSZWxhdGlvbiByZWwsIEF0dHJOdW1iZXIgYXR0bnVtLCBMaXN0ICoqZHBjb250 ZXh0KQoreworCVR1cGxlQ29uc3RyICpjb25zdHIgPSBSZWxhdGlvbkdldERlc2NyKHJlbCktPmNv bnN0cjsKKworCWlmIChjb25zdHIgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGlu dCBqID0gMDsgaiA8IGNvbnN0ci0+bnVtX2RlZnZhbDsgaisrKQorCXsKKwkJaWYgKGNvbnN0ci0+ ZGVmdmFsW2pdLmFkbnVtICE9IGF0dG51bSkKKwkJCWNvbnRpbnVlOworCisJCWlmICgqZHBjb250 ZXh0ID09IE5JTCkKKwkJCSpkcGNvbnRleHQgPSBkZXBhcnNlX2NvbnRleHRfZm9yKFJlbGF0aW9u R2V0UmVsYXRpb25OYW1lKHJlbCksCisJCQkJCQkJCQkJCSBSZWxhdGlvbkdldFJlbGlkKHJlbCkp OworCisJCXJldHVybiBkZXBhcnNlX2V4cHJlc3Npb24oc3RyaW5nVG9Ob2RlKGNvbnN0ci0+ZGVm dmFsW2pdLmFkYmluKSwKKwkJCQkJCQkJICAqZHBjb250ZXh0LCBmYWxzZSwgZmFsc2UpOworCX0K KwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIGFwcGVuZF9pbmxpbmVfY2hlY2tfY29uc3RyYWlu dHMKKyAqCQlFbWl0IGVhY2ggbG9jYWxseS1kZWNsYXJlZCBDSEVDSyBjb25zdHJhaW50IG9uIHJl bCBhcworICoJCSJDT05TVFJBSU5UIG5hbWUgPHBnX2dldF9jb25zdHJhaW50ZGVmPiIsIHNlcGFy YXRlZCBieSAnLCcgZnJvbSBhbnkKKyAqCQlwcmV2aW91c2x5LWVtaXR0ZWQgY29sdW1uIG9yIGNv bnN0cmFpbnQuCisgKgorICogKmZpcnN0IHRyYWNrcyB3aGV0aGVyIGFueXRoaW5nIGhhcyBiZWVu IGVtaXR0ZWQgb24gdGhpcyBsaXN0IHlldCwgc28gdGhlCisgKiBjYWxsZXIgY2FuIGNoYWluIGNv bHVtbiBlbWlzc2lvbiBhbmQgY29uc3RyYWludCBlbWlzc2lvbiB0aHJvdWdoIHRoZSBzYW1lCisg KiBidWZmZXIuICBJbmhlcml0ZWQgQ0hFQ0sgY29uc3RyYWludHMgKCFjb25pc2xvY2FsKSBjb21l IGZyb20gdGhlIHBhcmVudCdzCisgKiBEREwgYW5kIGFyZW4ndCByZXBlYXRlZCBoZXJlLgorICov CitzdGF0aWMgdm9pZAorYXBwZW5kX2lubGluZV9jaGVja19jb25zdHJhaW50cyhTdHJpbmdJbmZv IGJ1ZiwgUmVsYXRpb24gcmVsLCBib29sIHByZXR0eSwKKwkJCQkJCQkJYm9vbCAqZmlyc3QpCit7 CisJUmVsYXRpb24JY29uUmVsOworCVN5c1NjYW5EZXNjIGNvblNjYW47CisJU2NhbktleURhdGEg Y29uS2V5OworCUhlYXBUdXBsZQljb25UdXA7CisKKwljb25SZWwgPSB0YWJsZV9vcGVuKENvbnN0 cmFpbnRSZWxhdGlvbklkLCBBY2Nlc3NTaGFyZUxvY2spOworCVNjYW5LZXlJbml0KCZjb25LZXks CisJCQkJQW51bV9wZ19jb25zdHJhaW50X2NvbnJlbGlkLAorCQkJCUJURXF1YWxTdHJhdGVneU51 bWJlciwgRl9PSURFUSwKKwkJCQlPYmplY3RJZEdldERhdHVtKFJlbGF0aW9uR2V0UmVsaWQocmVs KSkpOworCWNvblNjYW4gPSBzeXN0YWJsZV9iZWdpbnNjYW4oY29uUmVsLCBDb25zdHJhaW50UmVs aWRUeXBpZE5hbWVJbmRleElkLAorCQkJCQkJCQkgdHJ1ZSwgTlVMTCwgMSwgJmNvbktleSk7CisK Kwl3aGlsZSAoSGVhcFR1cGxlSXNWYWxpZChjb25UdXAgPSBzeXN0YWJsZV9nZXRuZXh0KGNvblNj YW4pKSkKKwl7CisJCUZvcm1fcGdfY29uc3RyYWludCBjb24gPSAoRm9ybV9wZ19jb25zdHJhaW50 KSBHRVRTVFJVQ1QoY29uVHVwKTsKKwkJRGF0dW0JCWRlZkRhdHVtOworCQljaGFyCSAgICpkZWZi b2R5OworCisJCWlmIChjb24tPmNvbnR5cGUgIT0gQ09OU1RSQUlOVF9DSEVDSykKKwkJCWNvbnRp bnVlOworCQlpZiAoIWNvbi0+Y29uaXNsb2NhbCkKKwkJCWNvbnRpbnVlOworCisJCWlmICghKmZp cnN0KQorCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnLCcpOworCQkqZmlyc3QgPSBmYWxz ZTsKKwkJaWYgKHByZXR0eSkKKwkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiXG4gICAg Iik7CisJCWVsc2UKKwkJCWFwcGVuZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJyAnKTsKKworCQlkZWZE YXR1bSA9IE9pZEZ1bmN0aW9uQ2FsbDEoRl9QR19HRVRfQ09OU1RSQUlOVERFRl9PSUQsCisJCQkJ CQkJCQlPYmplY3RJZEdldERhdHVtKGNvbi0+b2lkKSk7CisJCWRlZmJvZHkgPSBUZXh0RGF0dW1H ZXRDU3RyaW5nKGRlZkRhdHVtKTsKKwkJYXBwZW5kU3RyaW5nSW5mbyhidWYsICJDT05TVFJBSU5U ICVzICVzIiwKKwkJCQkJCSBxdW90ZV9pZGVudGlmaWVyKE5hbWVTdHIoY29uLT5jb25uYW1lKSks CisJCQkJCQkgZGVmYm9keSk7CisJCXBmcmVlKGRlZmJvZHkpOworCX0KKwlzeXN0YWJsZV9lbmRz Y2FuKGNvblNjYW4pOworCXRhYmxlX2Nsb3NlKGNvblJlbCwgQWNjZXNzU2hhcmVMb2NrKTsKK30K KworLyoKKyAqIGFwcGVuZF9jb2x1bW5fZGVmcworICoJCUFwcGVuZCB0aGUgY29tbWEtc2VwYXJh dGVkIGNvbHVtbiBkZWZpbml0aW9uIGxpc3QgZm9yIGEgdGFibGUuCisgKgorICogRW1pdHMgZWFj aCBub24tZHJvcHBlZCwgbG9jYWxseS1kZWNsYXJlZCBjb2x1bW4gYXMKKyAqCQluYW1lIHR5cGUg W0NPTExBVEUgeF0gW1NUT1JBR0Ugc10gW0NPTVBSRVNTSU9OIGNdCisgKgkJW0dFTkVSQVRFRCAu Li4gfCBERUZBVUxUIGVdIFtOT1QgTlVMTF0KKyAqIGZvbGxvd2VkIGJ5IGFueSBsb2NhbGx5LWRl Y2xhcmVkIGlubGluZSBDSEVDSyBjb25zdHJhaW50cy4gIE9wdGlvbmFsCisgKiBjbGF1c2VzIGFy ZSBvbWl0dGVkIHdoZW4gdGhlaXIgdmFsdWUgbWF0Y2hlcyB3aGF0IHRoZSBzeXN0ZW0gd291bGQK KyAqIHJlYXBwbHkgb24gcm91bmQtdHJpcCAoZS5nLiB0eXBlLWRlZmF1bHQgQ09MTEFURSwgdHlw ZS1kZWZhdWx0IFNUT1JBR0UpLgorICovCitzdGF0aWMgdm9pZAorYXBwZW5kX2NvbHVtbl9kZWZz KFN0cmluZ0luZm8gYnVmLCBSZWxhdGlvbiByZWwsIGJvb2wgcHJldHR5LAorCQkJCSAgIGJvb2wg aW5jbHVkZV9jb25zdHJhaW50cywKKwkJCQkgICBib29sIHNjaGVtYV9xdWFsaWZpZWQsCisJCQkJ ICAgTG9jYWxOb3ROdWxsRW50cnkgKiBubl9lbnRyaWVzKQoreworCVR1cGxlRGVzYwl0dXBkZXNj ID0gUmVsYXRpb25HZXREZXNjcihyZWwpOworCU9pZAkJCWJhc2VfbmFtZXNwYWNlID0gUmVsYXRp b25HZXROYW1lc3BhY2UocmVsKTsKKwlMaXN0CSAgICpkcGNvbnRleHQgPSBOSUw7CisJYm9vbAkJ Zmlyc3QgPSB0cnVlOworCisJZm9yIChpbnQgaSA9IDA7IGkgPCB0dXBkZXNjLT5uYXR0czsgaSsr KQorCXsKKwkJRm9ybV9wZ19hdHRyaWJ1dGUgYXR0ID0gVHVwbGVEZXNjQXR0cih0dXBkZXNjLCBp KTsKKwkJY2hhcgkgICAqdHlwc3RyOworCisJCWlmIChhdHQtPmF0dGlzZHJvcHBlZCkKKwkJCWNv bnRpbnVlOworCisJCS8qCisJCSAqIENvbHVtbnMgaW5oZXJpdGVkIGZyb20gYSBwYXJlbnQgYXJl IGVtaXR0ZWQgYnkgdGhlIElOSEVSSVRTIGNsYXVzZQorCQkgKiAob25jZSBpbXBsZW1lbnRlZCks IG5vdCB0aGUgY29sdW1uIGxpc3QsIHVubGVzcyB0aGUgY2hpbGQKKwkJICogcmVkZWNsYXJlZCB0 aGVtIGxvY2FsbHkgKGF0dGlzbG9jYWw9dHJ1ZSkuCisJCSAqLworCQlpZiAoIWF0dC0+YXR0aXNs b2NhbCkKKwkJCWNvbnRpbnVlOworCisJCWlmICghZmlyc3QpCisJCQlhcHBlbmRTdHJpbmdJbmZv Q2hhcihidWYsICcsJyk7CisJCWZpcnN0ID0gZmFsc2U7CisKKwkJaWYgKHByZXR0eSkKKwkJCWFw cGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiXG4gICAgIik7CisJCWVsc2UKKwkJCWFwcGVuZFN0 cmluZ0luZm9DaGFyKGJ1ZiwgJyAnKTsKKworCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1Ziwg cXVvdGVfaWRlbnRpZmllcihOYW1lU3RyKGF0dC0+YXR0bmFtZSkpKTsKKwkJYXBwZW5kU3RyaW5n SW5mb0NoYXIoYnVmLCAnICcpOworCisJCXR5cHN0ciA9IGZvcm1hdF90eXBlX3dpdGhfdHlwZW1v ZChhdHQtPmF0dHR5cGlkLCBhdHQtPmF0dHR5cG1vZCk7CisJCWFwcGVuZFN0cmluZ0luZm9TdHJp bmcoYnVmLCB0eXBzdHIpOworCQlwZnJlZSh0eXBzdHIpOworCisJCS8qIENPTExBVEUgY2xhdXNl LCBvbmx5IGlmIGl0IGRpZmZlcnMgZnJvbSB0aGUgdHlwZSdzIGRlZmF1bHQuICovCisJCWlmIChP aWRJc1ZhbGlkKGF0dC0+YXR0Y29sbGF0aW9uKSAmJgorCQkJYXR0LT5hdHRjb2xsYXRpb24gIT0g Z2V0X3R5cGNvbGxhdGlvbihhdHQtPmF0dHR5cGlkKSkKKwkJCWFwcGVuZFN0cmluZ0luZm8oYnVm LCAiIENPTExBVEUgJXMiLAorCQkJCQkJCSBnZW5lcmF0ZV9jb2xsYXRpb25fbmFtZShhdHQtPmF0 dGNvbGxhdGlvbikpOworCisJCS8qIFNUT1JBR0UgY2xhdXNlLCBvbmx5IGlmIGl0IGRpZmZlcnMg ZnJvbSB0aGUgdHlwZSdzIGRlZmF1bHQuICovCisJCWlmIChhdHQtPmF0dHN0b3JhZ2UgIT0gZ2V0 X3R5cHN0b3JhZ2UoYXR0LT5hdHR0eXBpZCkpCisJCXsKKwkJCWNvbnN0IGNoYXIgKnN0b3JhZ2Ug PSBOVUxMOworCisJCQlzd2l0Y2ggKGF0dC0+YXR0c3RvcmFnZSkKKwkJCXsKKwkJCQljYXNlIFRZ UFNUT1JBR0VfUExBSU46CisJCQkJCXN0b3JhZ2UgPSAiUExBSU4iOworCQkJCQlicmVhazsKKwkJ CQljYXNlIFRZUFNUT1JBR0VfRVhURVJOQUw6CisJCQkJCXN0b3JhZ2UgPSAiRVhURVJOQUwiOwor CQkJCQlicmVhazsKKwkJCQljYXNlIFRZUFNUT1JBR0VfTUFJTjoKKwkJCQkJc3RvcmFnZSA9ICJN QUlOIjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUWVBTVE9SQUdFX0VYVEVOREVEOgorCQkJCQlz dG9yYWdlID0gIkVYVEVOREVEIjsKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc3RvcmFnZSkK KwkJCQlhcHBlbmRTdHJpbmdJbmZvKGJ1ZiwgIiBTVE9SQUdFICVzIiwgc3RvcmFnZSk7CisJCX0K KworCQkvKiBDT01QUkVTU0lPTiBjbGF1c2UsIG9ubHkgaWYgZXhwbGljaXRseSBzZXQgb24gdGhl IGNvbHVtbi4gKi8KKwkJaWYgKENvbXByZXNzaW9uTWV0aG9kSXNWYWxpZChhdHQtPmF0dGNvbXBy ZXNzaW9uKSkKKwkJeworCQkJY29uc3QgY2hhciAqY20gPSBOVUxMOworCisJCQlzd2l0Y2ggKGF0 dC0+YXR0Y29tcHJlc3Npb24pCisJCQl7CisJCQkJY2FzZSBUT0FTVF9QR0xaX0NPTVBSRVNTSU9O OgorCQkJCQljbSA9ICJwZ2x6IjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUT0FTVF9MWjRfQ09N UFJFU1NJT046CisJCQkJCWNtID0gImx6NCI7CisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGNt KQorCQkJCWFwcGVuZFN0cmluZ0luZm8oYnVmLCAiIENPTVBSRVNTSU9OICVzIiwgY20pOworCQl9 CisKKwkJLyoKKwkJICogTG9vayB1cCB0aGUgZGVmYXVsdC9nZW5lcmF0ZWQgZXhwcmVzc2lvbiB0 ZXh0IHVwIGZyb250OyBnZW5lcmF0ZWQKKwkJICogY29sdW1ucyBoYXZlIGF0dGhhc2RlZj10cnVl IHdpdGggYW4gZW50cnkgaW4gcGdfYXR0cmRlZiBqdXN0IGxpa2UKKwkJICogcmVndWxhciBkZWZh dWx0cy4KKwkJICovCisJCXsKKwkJCWNoYXIJICAgKmRlZmV4cHIgPSBOVUxMOworCisJCQlpZiAo YXR0LT5hdHRoYXNkZWYpCisJCQkJZGVmZXhwciA9IGZpbmRfYXR0cmRlZl90ZXh0KHJlbCwgYXR0 LT5hdHRudW0sICZkcGNvbnRleHQpOworCisJCQkvKiBHRU5FUkFURUQgLyBJREVOVElUWSAvIERF RkFVTFQgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gKi8KKwkJCWlmIChhdHQtPmF0dGdlbmVyYXRl ZCA9PSBBVFRSSUJVVEVfR0VORVJBVEVEX1NUT1JFRCAmJiBkZWZleHByKQorCQkJCWFwcGVuZFN0 cmluZ0luZm8oYnVmLCAiIEdFTkVSQVRFRCBBTFdBWVMgQVMgKCVzKSBTVE9SRUQiLCBkZWZleHBy KTsKKwkJCWVsc2UgaWYgKGF0dC0+YXR0Z2VuZXJhdGVkID09IEFUVFJJQlVURV9HRU5FUkFURURf VklSVFVBTCAmJiBkZWZleHByKQorCQkJCWFwcGVuZFN0cmluZ0luZm8oYnVmLCAiIEdFTkVSQVRF RCBBTFdBWVMgQVMgKCVzKSBWSVJUVUFMIiwgZGVmZXhwcik7CisJCQllbHNlIGlmIChhdHQtPmF0 dGlkZW50aXR5ID09IEFUVFJJQlVURV9JREVOVElUWV9BTFdBWVMgfHwKKwkJCQkJIGF0dC0+YXR0 aWRlbnRpdHkgPT0gQVRUUklCVVRFX0lERU5USVRZX0JZX0RFRkFVTFQpCisJCQl7CisJCQkJY29u c3QgY2hhciAqaWRraW5kID0KKwkJCQkJKGF0dC0+YXR0aWRlbnRpdHkgPT0gQVRUUklCVVRFX0lE RU5USVRZX0FMV0FZUykKKwkJCQkJPyAiQUxXQVlTIiA6ICJCWSBERUZBVUxUIjsKKwkJCQlPaWQJ CQlzZXFpZCA9IGdldElkZW50aXR5U2VxdWVuY2UocmVsLCBhdHQtPmF0dG51bSwgdHJ1ZSk7CisK KwkJCQlhcHBlbmRTdHJpbmdJbmZvKGJ1ZiwgIiBHRU5FUkFURUQgJXMgQVMgSURFTlRJVFkiLCBp ZGtpbmQpOworCisJCQkJLyoKKwkJCQkgKiBFbWl0IG9ubHkgdGhlIHNlcXVlbmNlIG9wdGlvbnMg dGhhdCBkaWZmZXIgZnJvbSB0aGVpcgorCQkJCSAqIGRlZmF1bHRzIOKAlCBtaXJyb3JpbmcgcGdf Z2V0X2RhdGFiYXNlX2RkbCdzIHBhdHRlcm4gb2YKKwkJCQkgKiBvbWl0dGluZyB2YWx1ZXMgdGhh dCB0aGUgc3lzdGVtIHdvdWxkIHJlYXBwbHkgb24gaXRzIG93bi4KKwkJCQkgKi8KKwkJCQlpZiAo T2lkSXNWYWxpZChzZXFpZCkpCisJCQkJeworCQkJCQlIZWFwVHVwbGUJc2VxVHVwID0gU2VhcmNo U3lzQ2FjaGUxKFNFUVJFTElELAorCQkJCQkJCQkJCQkJCQkgT2JqZWN0SWRHZXREYXR1bShzZXFp ZCkpOworCisJCQkJCWlmIChIZWFwVHVwbGVJc1ZhbGlkKHNlcVR1cCkpCisJCQkJCXsKKwkJCQkJ CUZvcm1fcGdfc2VxdWVuY2Ugc2VxID0gKEZvcm1fcGdfc2VxdWVuY2UpIEdFVFNUUlVDVChzZXFU dXApOworCQkJCQkJU3RyaW5nSW5mb0RhdGEgb3B0czsKKwkJCQkJCWJvb2wJCWZpcnN0X29wdCA9 IHRydWU7CisJCQkJCQlpbnQ2NAkJZGVmX21pbiwKKwkJCQkJCQkJCWRlZl9tYXgsCisJCQkJCQkJ CQlkZWZfc3RhcnQ7CisJCQkJCQlpbnQ2NAkJdHlwX21pbiwKKwkJCQkJCQkJCXR5cF9tYXg7CisK KwkJCQkJCS8qCisJCQkJCQkgKiBQZXItdHlwZSBib3VuZHMgZm9yIHRoZSBzZXF1ZW5jZSdzIHVu ZGVybHlpbmcKKwkJCQkJCSAqIGludGVnZXIgdHlwZS4gIERlZmF1bHRzIHRvIGludDggaWYgdGhl IGNvbHVtbiB0eXBlCisJCQkJCQkgKiBpcyBzb21ldGhpbmcgZWxzZSAoc2hvdWxkbid0IGhhcHBl biBmb3IgSURFTlRJVFksCisJCQkJCQkgKiBidXQgYmUgZGVmZW5zaXZlKS4KKwkJCQkJCSAqLwor CQkJCQkJc3dpdGNoIChhdHQtPmF0dHR5cGlkKQorCQkJCQkJeworCQkJCQkJCWNhc2UgSU5UMk9J RDoKKwkJCQkJCQkJdHlwX21pbiA9IFBHX0lOVDE2X01JTjsKKwkJCQkJCQkJdHlwX21heCA9IFBH X0lOVDE2X01BWDsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBJTlQ0T0lEOgorCQkJCQkJ CQl0eXBfbWluID0gUEdfSU5UMzJfTUlOOworCQkJCQkJCQl0eXBfbWF4ID0gUEdfSU5UMzJfTUFY OworCQkJCQkJCQlicmVhazsKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQl0eXBfbWluID0gUEdf SU5UNjRfTUlOOworCQkJCQkJCQl0eXBfbWF4ID0gUEdfSU5UNjRfTUFYOworCQkJCQkJCQlicmVh azsKKwkJCQkJCX0KKworCQkJCQkJaWYgKHNlcS0+c2VxaW5jcmVtZW50ID4gMCkKKwkJCQkJCXsK KwkJCQkJCQlkZWZfbWluID0gMTsKKwkJCQkJCQlkZWZfbWF4ID0gdHlwX21heDsKKwkJCQkJCQlk ZWZfc3RhcnQgPSBkZWZfbWluOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJ CWRlZl9taW4gPSB0eXBfbWluOworCQkJCQkJCWRlZl9tYXggPSAtMTsKKwkJCQkJCQlkZWZfc3Rh cnQgPSBkZWZfbWF4OworCQkJCQkJfQorCisJCQkJCQlpbml0U3RyaW5nSW5mbygmb3B0cyk7CisK KwkJCQkJCS8qCisJCQkJCQkgKiBTRVFVRU5DRSBOQU1FIOKAlCBvbWl0IHdoZW4gaXQgbWF0Y2hl cyB0aGUgaW1wbGljaXQKKwkJCQkJCSAqICI8dGFibGVuYW1lPl88Y29sdW1ubmFtZT5fc2VxIiBw YXR0ZXJuIGluIHRoZSBzYW1lCisJCQkJCQkgKiBzY2hlbWEsIHNpbmNlIENSRUFURSBUQUJMRSB3 aWxsIHJlZ2VuZXJhdGUgdGhhdAorCQkJCQkJICogZXhhY3QgbmFtZS4gIFRoZSBzZXF1ZW5jZSBp cyBhbiBJTlRFUk5BTCBkZXBlbmRlbmN5CisJCQkJCQkgKiBvZiB0aGUgY29sdW1uLCBzbyB0aGUg bG9jayB3ZSBob2xkIG9uIHRoZSB0YWJsZQorCQkJCQkJICogYWxzbyBwaW5zIGl0LCBidXQgdGhl IGxvb2t1cCBoZWxwZXIgc3RpbGwgZGVmZW5kcworCQkJCQkJICogYWdhaW5zdCBhIG1pc3Npbmcg cGdfY2xhc3Mgcm93LgorCQkJCQkJICovCisJCQkJCQl7CisJCQkJCQkJSGVhcFR1cGxlCXNlcUNs YXNzVHVwOworCQkJCQkJCUZvcm1fcGdfY2xhc3Mgc2VxQ2xhc3M7CisJCQkJCQkJY2hhcgkJYXV0 b25hbWVbTkFNRURBVEFMRU5dOworCisJCQkJCQkJc2VxQ2xhc3NUdXAgPSBTZWFyY2hTeXNDYWNo ZTEoUkVMT0lELAorCQkJCQkJCQkJCQkJCQkgIE9iamVjdElkR2V0RGF0dW0oc2VxaWQpKTsKKwkJ CQkJCQlpZiAoIUhlYXBUdXBsZUlzVmFsaWQoc2VxQ2xhc3NUdXApKQorCQkJCQkJCQllcmVwb3J0 KEVSUk9SLAorCQkJCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfVU5ERUZJTkVEX09CSkVDVCksCisJ CQkJCQkJCQkJIGVycm1zZygiaWRlbnRpdHkgc2VxdWVuY2Ugd2l0aCBPSUQgJXUgZG9lcyBub3Qg ZXhpc3QiLAorCQkJCQkJCQkJCQkJc2VxaWQpLAorCQkJCQkJCQkJCSBlcnJkZXRhaWwoIkl0IG1h eSBoYXZlIGJlZW4gY29uY3VycmVudGx5IGRyb3BwZWQuIikpKTsKKwkJCQkJCQlzZXFDbGFzcyA9 IChGb3JtX3BnX2NsYXNzKSBHRVRTVFJVQ1Qoc2VxQ2xhc3NUdXApOworCisJCQkJCQkJc25wcmlu dGYoYXV0b25hbWUsIHNpemVvZihhdXRvbmFtZSksICIlc18lc19zZXEiLAorCQkJCQkJCQkJIFJl bGF0aW9uR2V0UmVsYXRpb25OYW1lKHJlbCksCisJCQkJCQkJCQkgTmFtZVN0cihhdHQtPmF0dG5h bWUpKTsKKwkJCQkJCQlpZiAoc2VxQ2xhc3MtPnJlbG5hbWVzcGFjZSAhPSBSZWxhdGlvbkdldE5h bWVzcGFjZShyZWwpIHx8CisJCQkJCQkJCXN0cmNtcChOYW1lU3RyKHNlcUNsYXNzLT5yZWxuYW1l KSwgYXV0b25hbWUpICE9IDApCisJCQkJCQkJeworCQkJCQkJCQljaGFyCSAgICpzZXFRdWFsID0K KwkJCQkJCQkJCWxvb2t1cF9yZWxuYW1lX2Zvcl9lbWl0KHNlcWlkLAorCQkJCQkJCQkJCQkJCQkJ c2NoZW1hX3F1YWxpZmllZCwKKwkJCQkJCQkJCQkJCQkJCWJhc2VfbmFtZXNwYWNlKTsKKworCQkJ CQkJCQlhcHBlbmRTdHJpbmdJbmZvKCZvcHRzLCAiJXNTRVFVRU5DRSBOQU1FICVzIiwKKwkJCQkJ CQkJCQkJCSBmaXJzdF9vcHQgPyAiIiA6ICIgIiwgc2VxUXVhbCk7CisJCQkJCQkJCWZpcnN0X29w dCA9IGZhbHNlOworCQkJCQkJCQlwZnJlZShzZXFRdWFsKTsKKwkJCQkJCQl9CisJCQkJCQkJUmVs ZWFzZVN5c0NhY2hlKHNlcUNsYXNzVHVwKTsKKwkJCQkJCX0KKworCQkJCQkJaWYgKHNlcS0+c2Vx c3RhcnQgIT0gZGVmX3N0YXJ0KQorCQkJCQkJeworCQkJCQkJCWFwcGVuZFN0cmluZ0luZm8oJm9w dHMsICIlc1NUQVJUIFdJVEggIiBJTlQ2NF9GT1JNQVQsCisJCQkJCQkJCQkJCSBmaXJzdF9vcHQg PyAiIiA6ICIgIiwgc2VxLT5zZXFzdGFydCk7CisJCQkJCQkJZmlyc3Rfb3B0ID0gZmFsc2U7CisJ CQkJCQl9CisJCQkJCQlpZiAoc2VxLT5zZXFpbmNyZW1lbnQgIT0gMSkKKwkJCQkJCXsKKwkJCQkJ CQlhcHBlbmRTdHJpbmdJbmZvKCZvcHRzLCAiJXNJTkNSRU1FTlQgQlkgIiBJTlQ2NF9GT1JNQVQs CisJCQkJCQkJCQkJCSBmaXJzdF9vcHQgPyAiIiA6ICIgIiwgc2VxLT5zZXFpbmNyZW1lbnQpOwor CQkJCQkJCWZpcnN0X29wdCA9IGZhbHNlOworCQkJCQkJfQorCQkJCQkJaWYgKHNlcS0+c2VxbWlu ICE9IGRlZl9taW4pCisJCQkJCQl7CisJCQkJCQkJYXBwZW5kU3RyaW5nSW5mbygmb3B0cywgIiVz TUlOVkFMVUUgIiBJTlQ2NF9GT1JNQVQsCisJCQkJCQkJCQkJCSBmaXJzdF9vcHQgPyAiIiA6ICIg Iiwgc2VxLT5zZXFtaW4pOworCQkJCQkJCWZpcnN0X29wdCA9IGZhbHNlOworCQkJCQkJfQorCQkJ CQkJaWYgKHNlcS0+c2VxbWF4ICE9IGRlZl9tYXgpCisJCQkJCQl7CisJCQkJCQkJYXBwZW5kU3Ry aW5nSW5mbygmb3B0cywgIiVzTUFYVkFMVUUgIiBJTlQ2NF9GT1JNQVQsCisJCQkJCQkJCQkJCSBm aXJzdF9vcHQgPyAiIiA6ICIgIiwgc2VxLT5zZXFtYXgpOworCQkJCQkJCWZpcnN0X29wdCA9IGZh bHNlOworCQkJCQkJfQorCQkJCQkJaWYgKHNlcS0+c2VxY2FjaGUgIT0gMSkKKwkJCQkJCXsKKwkJ CQkJCQlhcHBlbmRTdHJpbmdJbmZvKCZvcHRzLCAiJXNDQUNIRSAiIElOVDY0X0ZPUk1BVCwKKwkJ CQkJCQkJCQkJIGZpcnN0X29wdCA/ICIiIDogIiAiLCBzZXEtPnNlcWNhY2hlKTsKKwkJCQkJCQlm aXJzdF9vcHQgPSBmYWxzZTsKKwkJCQkJCX0KKwkJCQkJCWlmIChzZXEtPnNlcWN5Y2xlKQorCQkJ CQkJeworCQkJCQkJCWFwcGVuZFN0cmluZ0luZm8oJm9wdHMsICIlc0NZQ0xFIiwgZmlyc3Rfb3B0 ID8gIiIgOiAiICIpOworCQkJCQkJCWZpcnN0X29wdCA9IGZhbHNlOworCQkJCQkJfQorCisJCQkJ CQlpZiAoIWZpcnN0X29wdCkKKwkJCQkJCQlhcHBlbmRTdHJpbmdJbmZvKGJ1ZiwgIiAoJXMpIiwg b3B0cy5kYXRhKTsKKworCQkJCQkJcGZyZWUob3B0cy5kYXRhKTsKKwkJCQkJCVJlbGVhc2VTeXND YWNoZShzZXFUdXApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAoZGVmZXhwcikK KwkJCQlhcHBlbmRTdHJpbmdJbmZvKGJ1ZiwgIiBERUZBVUxUICVzIiwgZGVmZXhwcik7CisKKwkJ CWlmIChkZWZleHByKQorCQkJCXBmcmVlKGRlZmV4cHIpOworCQl9CisKKwkJaWYgKGF0dC0+YXR0 bm90bnVsbCkKKwkJeworCQkJTG9jYWxOb3ROdWxsRW50cnkgKm5uID0gJm5uX2VudHJpZXNbYXR0 LT5hdHRudW1dOworCisJCQlpZiAobm4tPm5hbWUgIT0gTlVMTCAmJiAhbm4tPmlzX2F1dG8pCisJ CQkJYXBwZW5kU3RyaW5nSW5mbyhidWYsICIgQ09OU1RSQUlOVCAlcyBOT1QgTlVMTCIsCisJCQkJ CQkJCSBxdW90ZV9pZGVudGlmaWVyKG5uLT5uYW1lKSk7CisJCQllbHNlCisJCQkJYXBwZW5kU3Ry aW5nSW5mb1N0cmluZyhidWYsICIgTk9UIE5VTEwiKTsKKwkJCWlmIChubi0+bmFtZSAhPSBOVUxM ICYmIG5uLT5ub19pbmhlcml0KQorCQkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiIE5P IElOSEVSSVQiKTsKKwkJfQorCX0KKworCS8qCisJICogVGFibGUtbGV2ZWwgQ0hFQ0sgY29uc3Ry YWludHMg4oCUIGVtaXR0ZWQgaW5saW5lIGluIHRoZSBDUkVBVEUgVEFCTEUKKwkgKiBib2R5IHNv IHRoZXkgYXBwZWFyIGFsb25nc2lkZSB0aGUgY29sdW1ucyAodGhlIHBnX2R1bXAgc2hhcGUpLiAg VGhlCisJICogY29uc3RyYWludCBsb29wIGxhdGVyIGluIHBnX2dldF90YWJsZV9kZGxfaW50ZXJu YWwgc2tpcHMgQ0hFQ0sKKwkgKiBjb25zdHJhaW50cyB0byBhdm9pZCBkb3VibGUtZW1pc3Npb24u CisJICovCisJaWYgKGluY2x1ZGVfY29uc3RyYWludHMpCisJCWFwcGVuZF9pbmxpbmVfY2hlY2tf Y29uc3RyYWludHMoYnVmLCByZWwsIHByZXR0eSwgJmZpcnN0KTsKK30KKworLyoKKyAqIGFwcGVu ZF90eXBlZF9jb2x1bW5fb3ZlcnJpZGVzCisgKgkJRm9yIGEgdHlwZWQgdGFibGUgKENSRUFURSBU QUJMRSAuLi4gT0YgdHlwZV9uYW1lKSwgYXBwZW5kIHRoZQorICoJCW9wdGlvbmFsICIoY29sIFdJ VEggT1BUSU9OUyAuLi4sIC4uLikiIGxpc3QgY2FycnlpbmcgbG9jYWxseQorICoJCWFwcGxpZWQg cGVyLWNvbHVtbiBvdmVycmlkZXMg4oCUIERFRkFVTFQsIE5PVCBOVUxMLCBhbmQgYW55IGxvY2Fs bHkKKyAqCQlkZWNsYXJlZCBDSEVDSyBjb25zdHJhaW50cy4KKyAqCisgKiBDb2x1bW5zIHdob3Nl IHR5cGUgaXMgZnVsbHkgZGljdGF0ZWQgYnkgcmVsb2Z0eXBlIGVtaXQgbm90aGluZy4gIFRoZQor ICogcGFyZW50aGVzaXNlZCBsaXN0IGlzIHN1cHByZXNzZWQgZW50aXJlbHkgd2hlbiBubyBjb2x1 bW4gbmVlZHMgYW4KKyAqIG92ZXJyaWRlIGFuZCB0aGVyZSBhcmUgbm8gbG9jYWxseS1kZWNsYXJl ZCBDSEVDSyBjb25zdHJhaW50cywgbWF0Y2hpbmcKKyAqIHRoZSBjYW5vbmljYWwgIkNSRUFURSBU QUJMRSB4IE9GIHQ7IiBzaGFwZS4KKyAqLworc3RhdGljIHZvaWQKK2FwcGVuZF90eXBlZF9jb2x1 bW5fb3ZlcnJpZGVzKFN0cmluZ0luZm8gYnVmLCBSZWxhdGlvbiByZWwsIGJvb2wgcHJldHR5LAor CQkJCQkJCSAgYm9vbCBpbmNsdWRlX2NvbnN0cmFpbnRzLAorCQkJCQkJCSAgTG9jYWxOb3ROdWxs RW50cnkgKiBubl9lbnRyaWVzKQoreworCVR1cGxlRGVzYwl0dXBkZXNjID0gUmVsYXRpb25HZXRE ZXNjcihyZWwpOworCUxpc3QJICAgKmRwY29udGV4dCA9IE5JTDsKKwlTdHJpbmdJbmZvRGF0YSBp bm5lcjsKKwlib29sCQlmaXJzdCA9IHRydWU7CisKKwlpbml0U3RyaW5nSW5mbygmaW5uZXIpOwor CisJZm9yIChpbnQgaSA9IDA7IGkgPCB0dXBkZXNjLT5uYXR0czsgaSsrKQorCXsKKwkJRm9ybV9w Z19hdHRyaWJ1dGUgYXR0ID0gVHVwbGVEZXNjQXR0cih0dXBkZXNjLCBpKTsKKwkJY2hhcgkgICAq ZGVmZXhwciA9IE5VTEw7CisJCWJvb2wJCWhhc19kZWZhdWx0OworCQlib29sCQloYXNfbm90bnVs bDsKKworCQlpZiAoYXR0LT5hdHRpc2Ryb3BwZWQpCisJCQljb250aW51ZTsKKworCQlpZiAoYXR0 LT5hdHRoYXNkZWYpCisJCQlkZWZleHByID0gZmluZF9hdHRyZGVmX3RleHQocmVsLCBhdHQtPmF0 dG51bSwgJmRwY29udGV4dCk7CisKKwkJaGFzX2RlZmF1bHQgPSAoZGVmZXhwciAhPSBOVUxMKTsK KwkJaGFzX25vdG51bGwgPSBhdHQtPmF0dG5vdG51bGw7CisKKwkJaWYgKCFoYXNfZGVmYXVsdCAm JiAhaGFzX25vdG51bGwpCisJCXsKKwkJCWlmIChkZWZleHByKQorCQkJCXBmcmVlKGRlZmV4cHIp OworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIWZpcnN0KQorCQkJYXBwZW5kU3RyaW5nSW5m b0NoYXIoJmlubmVyLCAnLCcpOworCQlmaXJzdCA9IGZhbHNlOworCQlpZiAocHJldHR5KQorCQkJ YXBwZW5kU3RyaW5nSW5mb1N0cmluZygmaW5uZXIsICJcbiAgICAiKTsKKwkJZWxzZQorCQkJYXBw ZW5kU3RyaW5nSW5mb0NoYXIoJmlubmVyLCAnICcpOworCisJCWFwcGVuZFN0cmluZ0luZm8oJmlu bmVyLCAiJXMgV0lUSCBPUFRJT05TIiwKKwkJCQkJCSBxdW90ZV9pZGVudGlmaWVyKE5hbWVTdHIo YXR0LT5hdHRuYW1lKSkpOworCQlpZiAoaGFzX2RlZmF1bHQpCisJCQlhcHBlbmRTdHJpbmdJbmZv KCZpbm5lciwgIiBERUZBVUxUICVzIiwgZGVmZXhwcik7CisJCWlmIChoYXNfbm90bnVsbCkKKwkJ eworCQkJTG9jYWxOb3ROdWxsRW50cnkgKm5uID0gJm5uX2VudHJpZXNbYXR0LT5hdHRudW1dOwor CisJCQlpZiAobm4tPm5hbWUgIT0gTlVMTCAmJiAhbm4tPmlzX2F1dG8pCisJCQkJYXBwZW5kU3Ry aW5nSW5mbygmaW5uZXIsICIgQ09OU1RSQUlOVCAlcyBOT1QgTlVMTCIsCisJCQkJCQkJCSBxdW90 ZV9pZGVudGlmaWVyKG5uLT5uYW1lKSk7CisJCQllbHNlCisJCQkJYXBwZW5kU3RyaW5nSW5mb1N0 cmluZygmaW5uZXIsICIgTk9UIE5VTEwiKTsKKwkJCWlmIChubi0+bmFtZSAhPSBOVUxMICYmIG5u LT5ub19pbmhlcml0KQorCQkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoJmlubmVyLCAiIE5PIElO SEVSSVQiKTsKKwkJfQorCisJCWlmIChkZWZleHByKQorCQkJcGZyZWUoZGVmZXhwcik7CisJfQor CisJLyoKKwkgKiBMb2NhbGx5LWRlY2xhcmVkIENIRUNLIGNvbnN0cmFpbnRzIG9uIGEgdHlwZWQg dGFibGUgYmVsb25nIGluIHRoZQorCSAqIGNvbHVtbi1saXN0IHBhcmVudGhlc2VzLCBzYW1lIGFz IGZvciBhbiB1bnR5cGVkIHRhYmxlLiAgVGhlIG91dC1vZi1saW5lCisJICogY29uc3RyYWludCBs b29wIGxhdGVyIHN0aWxsIHNraXBzIENIRUNLcy4KKwkgKi8KKwlpZiAoaW5jbHVkZV9jb25zdHJh aW50cykKKwkJYXBwZW5kX2lubGluZV9jaGVja19jb25zdHJhaW50cygmaW5uZXIsIHJlbCwgcHJl dHR5LCAmZmlyc3QpOworCisJaWYgKCFmaXJzdCkKKwl7CisJCWFwcGVuZFN0cmluZ0luZm9TdHJp bmcoYnVmLCAiICgiKTsKKwkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsIGlubmVyLmRhdGEp OworCQlpZiAocHJldHR5KQorCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICJcbikiKTsK KwkJZWxzZQorCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnKScpOworCX0KKwlwZnJlZShp bm5lci5kYXRhKTsKK30KKworLyoKKyAqIGFwcGVuZF9zdG10IC8gYXBwZW5kX3N0cmlwcGVkX3N0 bXQKKyAqCQlQdXNoIGN0eC0+YnVmIG9udG8gY3R4LT5zdGF0ZW1lbnRzLgorICoKKyAqIGFwcGVu ZF9zdG10IGlzIHVzZWQgZm9yIGVtaXNzaW9ucyB3aGVyZSB0aGUgdGFibGUgcmVmZXJlbmNlIGlz IGJ1aWx0CisgKiBmcm9tIGN0eC0+cXVhbG5hbWUgKGFscmVhZHkgcGFydGlhbC1xdWFsaWZpZWQg cGVyIHNjaGVtYV9xdWFsaWZpZWQpLgorICogYXBwZW5kX3N0cmlwcGVkX3N0bXQgaXMgdXNlZCBh ZnRlciBpbnZva2luZyBhbHdheXMtcXVhbGlmaWVkIHJ1bGV1dGlscworICogaGVscGVycyAocGdf Z2V0X2NvbnN0cmFpbnRkZWZfY29tbWFuZCwgcGdfZ2V0X2luZGV4ZGVmX3N0cmluZywKKyAqIHBn X2dldF9ydWxlZGVmLCBwZ19nZXRfc3RhdGlzdGljc29iamRlZl9zdHJpbmcpIOKAlCB3aGVuCisg KiBzY2hlbWFfcXVhbGlmaWVkIGlzIGZhbHNlLCB0aGUgYmFzZS1zY2hlbWEgcHJlZml4IGlzIHN0 cmlwcGVkIGZyb20KKyAqIHRoZWlyIG91dHB1dCBzbyB0aGUgZW1pdHRlZCBEREwgaXMgcmVwbGF5 LXJlbG9jYXRhYmxlLgorICovCitzdGF0aWMgdm9pZAorYXBwZW5kX3N0bXQoVGFibGVEZGxDb250 ZXh0ICogY3R4KQoreworCWN0eC0+c3RhdGVtZW50cyA9IGxhcHBlbmQoY3R4LT5zdGF0ZW1lbnRz LCBwc3RyZHVwKGN0eC0+YnVmLmRhdGEpKTsKK30KKworc3RhdGljIHZvaWQKK2FwcGVuZF9zdHJp cHBlZF9zdG10KFRhYmxlRGRsQ29udGV4dCAqIGN0eCkKK3sKKwlpZiAoY3R4LT5zY2hlbWFfcHJl Zml4ICE9IE5VTEwpCisJCWN0eC0+c3RhdGVtZW50cyA9IGxhcHBlbmQoY3R4LT5zdGF0ZW1lbnRz LAorCQkJCQkJCQkgIHN0cmlwX3NjaGVtYV9wcmVmaXgoY3R4LT5idWYuZGF0YSwKKwkJCQkJCQkJ CQkJCQkgIGN0eC0+c2NoZW1hX3ByZWZpeCkpOworCWVsc2UKKwkJY3R4LT5zdGF0ZW1lbnRzID0g bGFwcGVuZChjdHgtPnN0YXRlbWVudHMsIHBzdHJkdXAoY3R4LT5idWYuZGF0YSkpOworfQorCisv KgorICogZW1pdF9jcmVhdGVfdGFibGVfc3RtdAorICoJCUJ1aWxkIHRoZSBsZWFkaW5nIENSRUFU RSBUQUJMRSBzdGF0ZW1lbnQsIGluY2x1ZGluZyBwZXJzaXN0ZW5jZQorICoJCShURU1QT1JBUlkg LyBVTkxPR0dFRCksIGJvZHkgKGNvbHVtbiBsaXN0IC8gT0YgdHlwZV9uYW1lIC8KKyAqCQlQQVJU SVRJT04gT0YgcGFyZW50KSwgSU5IRVJJVFMsIFBBUlRJVElPTiBCWSwgVVNJTkcgbWV0aG9kLAor ICoJCVdJVEggKHJlbG9wdGlvbnMpLCBUQUJMRVNQQUNFLCBhbmQgT04gQ09NTUlULgorICovCitz dGF0aWMgdm9pZAorZW1pdF9jcmVhdGVfdGFibGVfc3RtdChUYWJsZURkbENvbnRleHQgKiBjdHgp Cit7CisJUmVsYXRpb24JcmVsID0gY3R4LT5yZWw7CisJY2hhcgkJcmVscGVyc2lzdGVuY2UgPSBy ZWwtPnJkX3JlbC0+cmVscGVyc2lzdGVuY2U7CisJY2hhcgkJcmVsa2luZCA9IHJlbC0+cmRfcmVs LT5yZWxraW5kOworCWJvb2wJCWlzX3R5cGVkID0gT2lkSXNWYWxpZChyZWwtPnJkX3JlbC0+cmVs b2Z0eXBlKTsKKwlIZWFwVHVwbGUJY2xhc3N0dXA7CisJRGF0dW0JCXJlbG9wdERhdHVtOworCWJv b2wJCXJlbG9wdElzbnVsbDsKKworCWNsYXNzdHVwID0gU2VhcmNoU3lzQ2FjaGUxKFJFTE9JRCwg T2JqZWN0SWRHZXREYXR1bShjdHgtPnJlbGlkKSk7CisJaWYgKCFIZWFwVHVwbGVJc1ZhbGlkKGNs YXNzdHVwKSkKKwkJZWxvZyhFUlJPUiwgImNhY2hlIGxvb2t1cCBmYWlsZWQgZm9yIHJlbGF0aW9u ICV1IiwgY3R4LT5yZWxpZCk7CisKKwlyZWxvcHREYXR1bSA9IFN5c0NhY2hlR2V0QXR0cihSRUxP SUQsIGNsYXNzdHVwLAorCQkJCQkJCQkgIEFudW1fcGdfY2xhc3NfcmVsb3B0aW9ucywgJnJlbG9w dElzbnVsbCk7CisKKwlyZXNldFN0cmluZ0luZm8oJmN0eC0+YnVmKTsKKwlhcHBlbmRTdHJpbmdJ bmZvU3RyaW5nKCZjdHgtPmJ1ZiwgIkNSRUFURSAiKTsKKwlpZiAocmVscGVyc2lzdGVuY2UgPT0g UkVMUEVSU0lTVEVOQ0VfVEVNUCkKKwkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmY3R4LT5idWYs ICJURU1QT1JBUlkgIik7CisJZWxzZSBpZiAocmVscGVyc2lzdGVuY2UgPT0gUkVMUEVSU0lTVEVO Q0VfVU5MT0dHRUQpCisJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoJmN0eC0+YnVmLCAiVU5MT0dH RUQgIik7CisJYXBwZW5kU3RyaW5nSW5mbygmY3R4LT5idWYsICJUQUJMRSAlcyIsIGN0eC0+cXVh bG5hbWUpOworCisJaWYgKHJlbC0+cmRfcmVsLT5yZWxpc3BhcnRpdGlvbikKKwl7CisJCU9pZAkJ CXBhcmVudE9pZCA9IGdldF9wYXJ0aXRpb25fcGFyZW50KGN0eC0+cmVsaWQsIHRydWUpOworCQlj aGFyCSAgICpwYXJlbnRRdWFsID0gbG9va3VwX3JlbG5hbWVfZm9yX2VtaXQocGFyZW50T2lkLAor CQkJCQkJCQkJCQkJCQkgY3R4LT5zY2hlbWFfcXVhbGlmaWVkLAorCQkJCQkJCQkJCQkJCQkgY3R4 LT5iYXNlX25hbWVzcGFjZSk7CisJCWNoYXIJICAgKnBhcmVudFJlbG5hbWUgPSBnZXRfcmVsX25h bWUocGFyZW50T2lkKTsKKwkJRGF0dW0JCWJvdW5kRGF0dW07CisJCWJvb2wJCWJvdW5kSXNudWxs OworCQljaGFyCSAgICpmb3JWYWx1ZXMgPSBOVUxMOworCQljaGFyCSAgICpib3VuZFN0ciA9IE5V TEw7CisKKwkJaWYgKHBhcmVudFJlbG5hbWUgPT0gTlVMTCkKKwkJCWVyZXBvcnQoRVJST1IsCisJ CQkJCShlcnJjb2RlKEVSUkNPREVfVU5ERUZJTkVEX09CSkVDVCksCisJCQkJCSBlcnJtc2coInBh cnRpdGlvbiBwYXJlbnQgd2l0aCBPSUQgJXUgZG9lcyBub3QgZXhpc3QiLAorCQkJCQkJCXBhcmVu dE9pZCksCisJCQkJCSBlcnJkZXRhaWwoIkl0IG1heSBoYXZlIGJlZW4gY29uY3VycmVudGx5IGRy b3BwZWQuIikpKTsKKworCQlib3VuZERhdHVtID0gU3lzQ2FjaGVHZXRBdHRyKFJFTE9JRCwgY2xh c3N0dXAsCisJCQkJCQkJCQkgQW51bV9wZ19jbGFzc19yZWxwYXJ0Ym91bmQsICZib3VuZElzbnVs bCk7CisJCWlmICghYm91bmRJc251bGwpCisJCXsKKwkJCU5vZGUJICAgKmJvdW5kTm9kZTsKKwkJ CUxpc3QJICAgKmRwY29udGV4dDsKKworCQkJYm91bmRTdHIgPSBUZXh0RGF0dW1HZXRDU3RyaW5n KGJvdW5kRGF0dW0pOworCQkJYm91bmROb2RlID0gc3RyaW5nVG9Ob2RlKGJvdW5kU3RyKTsKKwkJ CWRwY29udGV4dCA9IGRlcGFyc2VfY29udGV4dF9mb3IocGFyZW50UmVsbmFtZSwgcGFyZW50T2lk KTsKKwkJCWZvclZhbHVlcyA9IGRlcGFyc2VfZXhwcmVzc2lvbihib3VuZE5vZGUsIGRwY29udGV4 dCwgZmFsc2UsIGZhbHNlKTsKKwkJfQorCisJCWFwcGVuZFN0cmluZ0luZm8oJmN0eC0+YnVmLCAi IFBBUlRJVElPTiBPRiAlcyAlcyIsCisJCQkJCQkgcGFyZW50UXVhbCwgZm9yVmFsdWVzID8gZm9y VmFsdWVzIDogIkRFRkFVTFQiKTsKKwkJaWYgKGZvclZhbHVlcykKKwkJCXBmcmVlKGZvclZhbHVl cyk7CisJCWlmIChib3VuZFN0cikKKwkJCXBmcmVlKGJvdW5kU3RyKTsKKwkJcGZyZWUocGFyZW50 UXVhbCk7CisJCXBmcmVlKHBhcmVudFJlbG5hbWUpOworCX0KKwllbHNlIGlmIChpc190eXBlZCkK Kwl7CisJCWNoYXIJICAgKnR5cG5hbWUgPSBmb3JtYXRfdHlwZV9iZV9xdWFsaWZpZWQocmVsLT5y ZF9yZWwtPnJlbG9mdHlwZSk7CisKKwkJYXBwZW5kU3RyaW5nSW5mbygmY3R4LT5idWYsICIgT0Yg JXMiLCB0eXBuYW1lKTsKKwkJcGZyZWUodHlwbmFtZSk7CisKKwkJYXBwZW5kX3R5cGVkX2NvbHVt bl9vdmVycmlkZXMoJmN0eC0+YnVmLCByZWwsIGN0eC0+cHJldHR5LAorCQkJCQkJCQkJICBjdHgt PmluY2x1ZGVfY29uc3RyYWludHMsCisJCQkJCQkJCQkgIGN0eC0+bm5fZW50cmllcyk7CisJfQor CWVsc2UKKwl7CisJCUxpc3QJICAgKnBhcmVudHM7CisJCUxpc3RDZWxsICAgKmxjOworCQlib29s CQlmaXJzdDsKKworCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKCZjdHgtPmJ1ZiwgIiAoIik7CisK KwkJYXBwZW5kX2NvbHVtbl9kZWZzKCZjdHgtPmJ1ZiwgcmVsLCBjdHgtPnByZXR0eSwKKwkJCQkJ CSAgIGN0eC0+aW5jbHVkZV9jb25zdHJhaW50cywKKwkJCQkJCSAgIGN0eC0+c2NoZW1hX3F1YWxp ZmllZCwgY3R4LT5ubl9lbnRyaWVzKTsKKworCQlpZiAoY3R4LT5wcmV0dHkpCisJCQlhcHBlbmRT dHJpbmdJbmZvU3RyaW5nKCZjdHgtPmJ1ZiwgIlxuKSIpOworCQllbHNlCisJCQlhcHBlbmRTdHJp bmdJbmZvQ2hhcigmY3R4LT5idWYsICcpJyk7CisKKwkJcGFyZW50cyA9IGdldF9pbmhlcml0YW5j ZV9wYXJlbnRzKGN0eC0+cmVsaWQpOworCQlpZiAocGFyZW50cyAhPSBOSUwpCisJCXsKKwkJCWFw cGVuZFN0cmluZ0luZm9TdHJpbmcoJmN0eC0+YnVmLCAiIElOSEVSSVRTICgiKTsKKwkJCWZpcnN0 ID0gdHJ1ZTsKKwkJCWZvcmVhY2gobGMsIHBhcmVudHMpCisJCQl7CisJCQkJT2lkCQkJcG9pZCA9 IGxmaXJzdF9vaWQobGMpOworCQkJCWNoYXIJICAgKnBuYW1lID0gbG9va3VwX3JlbG5hbWVfZm9y X2VtaXQocG9pZCwKKwkJCQkJCQkJCQkJCQkJCWN0eC0+c2NoZW1hX3F1YWxpZmllZCwKKwkJCQkJ CQkJCQkJCQkJCWN0eC0+YmFzZV9uYW1lc3BhY2UpOworCisJCQkJaWYgKCFmaXJzdCkKKwkJCQkJ YXBwZW5kU3RyaW5nSW5mb1N0cmluZygmY3R4LT5idWYsICIsICIpOworCQkJCWZpcnN0ID0gZmFs c2U7CisJCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmY3R4LT5idWYsIHBuYW1lKTsKKwkJCQlw ZnJlZShwbmFtZSk7CisJCQl9CisJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcigmY3R4LT5idWYsICcp Jyk7CisJCQlsaXN0X2ZyZWUocGFyZW50cyk7CisJCX0KKwl9CisKKwlpZiAocmVsa2luZCA9PSBS RUxLSU5EX1BBUlRJVElPTkVEX1RBQkxFKQorCXsKKwkJRGF0dW0JCXBhcnRrZXlEYXR1bTsKKwkJ Y2hhcgkgICAqcGFydGtleTsKKworCQlwYXJ0a2V5RGF0dW0gPSBPaWRGdW5jdGlvbkNhbGwxKEZf UEdfR0VUX1BBUlRLRVlERUYsCisJCQkJCQkJCQkJT2JqZWN0SWRHZXREYXR1bShjdHgtPnJlbGlk KSk7CisJCXBhcnRrZXkgPSBUZXh0RGF0dW1HZXRDU3RyaW5nKHBhcnRrZXlEYXR1bSk7CisJCWFw cGVuZFN0cmluZ0luZm8oJmN0eC0+YnVmLCAiIFBBUlRJVElPTiBCWSAlcyIsIHBhcnRrZXkpOwor CQlwZnJlZShwYXJ0a2V5KTsKKwl9CisKKwlpZiAoT2lkSXNWYWxpZChyZWwtPnJkX3JlbC0+cmVs YW0pICYmCisJCXJlbC0+cmRfcmVsLT5yZWxhbSAhPSBIRUFQX1RBQkxFX0FNX09JRCkKKwl7CisJ CWNoYXIJICAgKmFtbmFtZSA9IGdldF9hbV9uYW1lKHJlbC0+cmRfcmVsLT5yZWxhbSk7CisKKwkJ aWYgKGFtbmFtZSAhPSBOVUxMKQorCQl7CisJCQlhcHBlbmRTdHJpbmdJbmZvKCZjdHgtPmJ1Ziwg IiBVU0lORyAlcyIsCisJCQkJCQkJIHF1b3RlX2lkZW50aWZpZXIoYW1uYW1lKSk7CisJCQlwZnJl ZShhbW5hbWUpOworCQl9CisJfQorCisJaWYgKCFyZWxvcHRJc251bGwpCisJeworCQlhcHBlbmRT dHJpbmdJbmZvU3RyaW5nKCZjdHgtPmJ1ZiwgIiBXSVRIICgiKTsKKwkJZ2V0X3JlbG9wdGlvbnMo JmN0eC0+YnVmLCByZWxvcHREYXR1bSk7CisJCWFwcGVuZFN0cmluZ0luZm9DaGFyKCZjdHgtPmJ1 ZiwgJyknKTsKKwl9CisKKwlSZWxlYXNlU3lzQ2FjaGUoY2xhc3N0dXApOworCisJaWYgKCFjdHgt Pm5vX3RhYmxlc3BhY2UgJiYgT2lkSXNWYWxpZChyZWwtPnJkX3JlbC0+cmVsdGFibGVzcGFjZSkp CisJeworCQljaGFyCSAgICp0c25hbWUgPSBnZXRfdGFibGVzcGFjZV9uYW1lKHJlbC0+cmRfcmVs LT5yZWx0YWJsZXNwYWNlKTsKKworCQlpZiAodHNuYW1lICE9IE5VTEwpCisJCXsKKwkJCWFwcGVu ZFN0cmluZ0luZm8oJmN0eC0+YnVmLCAiIFRBQkxFU1BBQ0UgJXMiLAorCQkJCQkJCSBxdW90ZV9p ZGVudGlmaWVyKHRzbmFtZSkpOworCQkJcGZyZWUodHNuYW1lKTsKKwkJfQorCX0KKworCWlmIChy ZWxwZXJzaXN0ZW5jZSA9PSBSRUxQRVJTSVNURU5DRV9URU1QKQorCXsKKwkJT25Db21taXRBY3Rp b24gb2MgPSBnZXRfb25fY29tbWl0X2FjdGlvbihjdHgtPnJlbGlkKTsKKworCQlpZiAob2MgPT0g T05DT01NSVRfREVMRVRFX1JPV1MpCisJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKCZjdHgtPmJ1 ZiwgIiBPTiBDT01NSVQgREVMRVRFIFJPV1MiKTsKKwkJZWxzZSBpZiAob2MgPT0gT05DT01NSVRf RFJPUCkKKwkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoJmN0eC0+YnVmLCAiIE9OIENPTU1JVCBE Uk9QIik7CisJfQorCisJYXBwZW5kU3RyaW5nSW5mb0NoYXIoJmN0eC0+YnVmLCAnOycpOworCWFw cGVuZF9zdG10KGN0eCk7Cit9CisKKy8qCisgKiBlbWl0X293bmVyX3N0bXQKKyAqCQlBTFRFUiBU QUJMRSBxdWFsbmFtZSBPV05FUiBUTyByb2xlLgorICovCitzdGF0aWMgdm9pZAorZW1pdF9vd25l cl9zdG10KFRhYmxlRGRsQ29udGV4dCAqIGN0eCkKK3sKKwljaGFyCSAgICpvd25lcjsKKworCWlm IChjdHgtPm5vX293bmVyKQorCQlyZXR1cm47CisKKwlvd25lciA9IEdldFVzZXJOYW1lRnJvbUlk KGN0eC0+cmVsLT5yZF9yZWwtPnJlbG93bmVyLCBmYWxzZSk7CisJcmVzZXRTdHJpbmdJbmZvKCZj dHgtPmJ1Zik7CisJYXBwZW5kU3RyaW5nSW5mbygmY3R4LT5idWYsICJBTFRFUiBUQUJMRSAlcyBP V05FUiBUTyAlczsiLAorCQkJCQkgY3R4LT5xdWFsbmFtZSwgcXVvdGVfaWRlbnRpZmllcihvd25l cikpOworCWFwcGVuZF9zdG10KGN0eCk7CisJcGZyZWUob3duZXIpOworfQorCisvKgorICogZW1p dF9jaGlsZF9kZWZhdWx0X292ZXJyaWRlcworICoJCUFMVEVSIFRBQkxFIHF1YWxuYW1lIEFMVEVS IENPTFVNTiBjb2wgU0VUIERFRkFVTFQgZXhwciDigJQgb25lIHBlcgorICoJCWluaGVyaXRlZCAo YXR0aXNsb2NhbD1mYWxzZSkgbm9uLWdlbmVyYXRlZCBjb2x1bW4gY2FycnlpbmcgYQorICoJCWxv Y2FsbHktc2V0IGRlZmF1bHQuICBHZW5lcmF0ZWQgY29sdW1ucyBhcmUgc2tpcHBlZDogdGhlaXIK KyAqCQlleHByZXNzaW9uIGlzIGluaGVyaXRlZCBhdXRvbWF0aWNhbGx5IGFuZCBTRVQgREVGQVVM VCB3b3VsZAorICoJCWZhaWwgYXQgcmVwbGF5LgorICovCitzdGF0aWMgdm9pZAorZW1pdF9jaGls ZF9kZWZhdWx0X292ZXJyaWRlcyhUYWJsZURkbENvbnRleHQgKiBjdHgpCit7CisJVHVwbGVEZXNj CXR1cGRlc2MgPSBSZWxhdGlvbkdldERlc2NyKGN0eC0+cmVsKTsKKwlMaXN0CSAgICpkcGNvbnRl eHQgPSBOSUw7CisKKwlmb3IgKGludCBpID0gMDsgaSA8IHR1cGRlc2MtPm5hdHRzOyBpKyspCisJ eworCQlGb3JtX3BnX2F0dHJpYnV0ZSBhdHQgPSBUdXBsZURlc2NBdHRyKHR1cGRlc2MsIGkpOwor CQljaGFyCSAgICpkZWZzdHI7CisKKwkJaWYgKGF0dC0+YXR0aXNkcm9wcGVkIHx8IGF0dC0+YXR0 aXNsb2NhbCB8fCAhYXR0LT5hdHRoYXNkZWYpCisJCQljb250aW51ZTsKKwkJaWYgKGF0dC0+YXR0 Z2VuZXJhdGVkICE9ICdcMCcpCisJCQljb250aW51ZTsKKworCQlkZWZzdHIgPSBmaW5kX2F0dHJk ZWZfdGV4dChjdHgtPnJlbCwgYXR0LT5hdHRudW0sICZkcGNvbnRleHQpOworCQlpZiAoZGVmc3Ry ID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlyZXNldFN0cmluZ0luZm8oJmN0eC0+YnVmKTsK KwkJYXBwZW5kU3RyaW5nSW5mbygmY3R4LT5idWYsCisJCQkJCQkgIkFMVEVSIFRBQkxFICVzIEFM VEVSIENPTFVNTiAlcyBTRVQgREVGQVVMVCAlczsiLAorCQkJCQkJIGN0eC0+cXVhbG5hbWUsCisJ CQkJCQkgcXVvdGVfaWRlbnRpZmllcihOYW1lU3RyKGF0dC0+YXR0bmFtZSkpLAorCQkJCQkJIGRl ZnN0cik7CisJCWFwcGVuZF9zdG10KGN0eCk7CisJCXBmcmVlKGRlZnN0cik7CisJfQorfQorCisv KgorICogZW1pdF9hdHRvcHRpb25zCisgKgkJQUxURVIgVEFCTEUgcXVhbG5hbWUgQUxURVIgQ09M VU1OIGNvbCBTRVQgKC4uLikg4oCUIG9uZSBwZXIgY29sdW1uCisgKgkJd2l0aCBub24tbnVsbCBw Z19hdHRyaWJ1dGUuYXR0b3B0aW9ucy4gIFRoZSBpbmxpbmUgZm9ybSBvZiB0aGVzZQorICoJCW9w dGlvbnMgaXNuJ3QgYXZhaWxhYmxlIGluIENSRUFURSBUQUJMRSwgc28gdGhleSBjb21lIG91dCBo ZXJlLgorICovCitzdGF0aWMgdm9pZAorZW1pdF9hdHRvcHRpb25zKFRhYmxlRGRsQ29udGV4dCAq IGN0eCkKK3sKKwlUdXBsZURlc2MJdHVwZGVzYyA9IFJlbGF0aW9uR2V0RGVzY3IoY3R4LT5yZWwp OworCisJZm9yIChpbnQgaSA9IDA7IGkgPCB0dXBkZXNjLT5uYXR0czsgaSsrKQorCXsKKwkJRm9y bV9wZ19hdHRyaWJ1dGUgYXR0ID0gVHVwbGVEZXNjQXR0cih0dXBkZXNjLCBpKTsKKwkJSGVhcFR1 cGxlCWF0dFR1cDsKKwkJRGF0dW0JCW9wdERhdHVtOworCQlib29sCQlvcHRJc251bGw7CisKKwkJ aWYgKGF0dC0+YXR0aXNkcm9wcGVkKQorCQkJY29udGludWU7CisKKwkJYXR0VHVwID0gU2VhcmNo U3lzQ2FjaGUyKEFUVE5VTSwKKwkJCQkJCQkJIE9iamVjdElkR2V0RGF0dW0oY3R4LT5yZWxpZCks CisJCQkJCQkJCSBJbnQxNkdldERhdHVtKGF0dC0+YXR0bnVtKSk7CisJCWlmICghSGVhcFR1cGxl SXNWYWxpZChhdHRUdXApKQorCQkJY29udGludWU7CisKKwkJb3B0RGF0dW0gPSBTeXNDYWNoZUdl dEF0dHIoQVRUTlVNLCBhdHRUdXAsCisJCQkJCQkJCSAgIEFudW1fcGdfYXR0cmlidXRlX2F0dG9w dGlvbnMsICZvcHRJc251bGwpOworCQlpZiAoIW9wdElzbnVsbCkKKwkJeworCQkJcmVzZXRTdHJp bmdJbmZvKCZjdHgtPmJ1Zik7CisJCQlhcHBlbmRTdHJpbmdJbmZvKCZjdHgtPmJ1ZiwKKwkJCQkJ CQkgIkFMVEVSIFRBQkxFICVzIEFMVEVSIENPTFVNTiAlcyBTRVQgKCIsCisJCQkJCQkJIGN0eC0+ cXVhbG5hbWUsCisJCQkJCQkJIHF1b3RlX2lkZW50aWZpZXIoTmFtZVN0cihhdHQtPmF0dG5hbWUp KSk7CisJCQlnZXRfcmVsb3B0aW9ucygmY3R4LT5idWYsIG9wdERhdHVtKTsKKwkJCWFwcGVuZFN0 cmluZ0luZm9TdHJpbmcoJmN0eC0+YnVmLCAiKTsiKTsKKwkJCWFwcGVuZF9zdG10KGN0eCk7CisJ CX0KKwkJUmVsZWFzZVN5c0NhY2hlKGF0dFR1cCk7CisJfQorfQorCisvKgorICogZW1pdF9pbmRl eGVzCisgKgkJQ1JFQVRFIElOREVYIHBlciBub24tY29uc3RyYWludC1iYWNrZWQgaW5kZXggb24g dGhlIHJlbGF0aW9uLgorICoJCUluZGV4ZXMgdGhhdCBiYWNrIFBLIC8gVU5JUVVFIC8gRVhDTFVE RSBjb25zdHJhaW50cyBhcmUgZW1pdHRlZAorICoJCW91dC1vZi1saW5lIGJ5IGVtaXRfbG9jYWxf Y29uc3RyYWludHMgKHRoZSBBTFRFUiBUQUJMRSDigKYgQURECisgKgkJQ09OU1RSQUlOVCBzdGF0 ZW1lbnQgY3JlYXRlcyB0aGUgaW5kZXggaW1wbGljaXRseSkuCisgKi8KK3N0YXRpYyB2b2lkCitl bWl0X2luZGV4ZXMoVGFibGVEZGxDb250ZXh0ICogY3R4KQoreworCUxpc3QJICAgKmluZGV4b2lk czsKKwlMaXN0Q2VsbCAgICpsYzsKKworCWlmICghY3R4LT5pbmNsdWRlX2luZGV4ZXMpCisJCXJl dHVybjsKKworCWluZGV4b2lkcyA9IFJlbGF0aW9uR2V0SW5kZXhMaXN0KGN0eC0+cmVsKTsKKwlm b3JlYWNoKGxjLCBpbmRleG9pZHMpCisJeworCQlPaWQJCQlpZHhvaWQgPSBsZmlyc3Rfb2lkKGxj KTsKKwkJY2hhcgkgICAqaWR4ZGVmOworCisJCWlmIChPaWRJc1ZhbGlkKGdldF9pbmRleF9jb25z dHJhaW50KGlkeG9pZCkpKQorCQkJY29udGludWU7CisKKwkJaWR4ZGVmID0gcGdfZ2V0X2luZGV4 ZGVmX3N0cmluZyhpZHhvaWQpOworCQlyZXNldFN0cmluZ0luZm8oJmN0eC0+YnVmKTsKKwkJYXBw ZW5kU3RyaW5nSW5mbygmY3R4LT5idWYsICIlczsiLCBpZHhkZWYpOworCQlhcHBlbmRfc3RyaXBw ZWRfc3RtdChjdHgpOworCQlwZnJlZShpZHhkZWYpOworCX0KKwlsaXN0X2ZyZWUoaW5kZXhvaWRz KTsKK30KKworLyoKKyAqIGVtaXRfbG9jYWxfY29uc3RyYWludHMKKyAqCQlBTFRFUiBUQUJMRSDi gKYgQUREIENPTlNUUkFJTlQgZm9yIGVhY2ggbG9jYWxseS1kZWZpbmVkIGNvbnN0cmFpbnQKKyAq CQlvbiB0aGUgcmVsYXRpb24uICBJbmhlcml0ZWQgY29uc3RyYWludHMgKGNvbmlzbG9jYWw9ZmFs c2UpIGNvbWUKKyAqCQlmcm9tIHRoZSBwYXJlbnQncyBEREwuICBDSEVDSyBjb25zdHJhaW50cyBh cmUgZW1pdHRlZCBpbmxpbmUgZm9yCisgKgkJcmVndWxhci90eXBlZCB0YWJsZXMgKHNraXAgaGVy ZSkgYnV0IG91dC1vZi1saW5lIGZvciBwYXJ0aXRpb24KKyAqCQljaGlsZHJlbiAobm8gY29sdW1u IGxpc3QgdG8gbGl2ZSBpbikuICBVc2VyLW5hbWVkIE5PVCBOVUxMCisgKgkJY29uc3RyYWludHMg YXJlIGVtaXR0ZWQgaW5saW5lIGJ5IHRoZSBjb2x1bW4tZW1pdCBoZWxwZXJzIGFuZAorICoJCWFy ZSBza2lwcGVkIHZpYSBza2lwX25vdG51bGxfb2lkczsgYXV0by1uYW1lZCBOT1QgTlVMTHMgZmFs bAorICoJCXRocm91Z2ggaGVyZSBhbmQgYXJlIGRlZHVwJ2QgYnkgbmFtZSBhdCByZXBsYXkuCisg Ki8KK3N0YXRpYyB2b2lkCitlbWl0X2xvY2FsX2NvbnN0cmFpbnRzKFRhYmxlRGRsQ29udGV4dCAq IGN0eCkKK3sKKwlSZWxhdGlvbgljb25SZWw7CisJU3lzU2NhbkRlc2MgY29uU2NhbjsKKwlTY2Fu S2V5RGF0YSBjb25LZXk7CisJSGVhcFR1cGxlCWNvblR1cDsKKwlib29sCQlpc19wYXJ0aXRpb24g PSBjdHgtPnJlbC0+cmRfcmVsLT5yZWxpc3BhcnRpdGlvbjsKKworCWlmICghY3R4LT5pbmNsdWRl X2NvbnN0cmFpbnRzKQorCQlyZXR1cm47CisKKwljb25SZWwgPSB0YWJsZV9vcGVuKENvbnN0cmFp bnRSZWxhdGlvbklkLCBBY2Nlc3NTaGFyZUxvY2spOworCVNjYW5LZXlJbml0KCZjb25LZXksCisJ CQkJQW51bV9wZ19jb25zdHJhaW50X2NvbnJlbGlkLAorCQkJCUJURXF1YWxTdHJhdGVneU51bWJl ciwgRl9PSURFUSwKKwkJCQlPYmplY3RJZEdldERhdHVtKGN0eC0+cmVsaWQpKTsKKwljb25TY2Fu ID0gc3lzdGFibGVfYmVnaW5zY2FuKGNvblJlbCwgQ29uc3RyYWludFJlbGlkVHlwaWROYW1lSW5k ZXhJZCwKKwkJCQkJCQkJIHRydWUsIE5VTEwsIDEsICZjb25LZXkpOworCisJd2hpbGUgKEhlYXBU dXBsZUlzVmFsaWQoY29uVHVwID0gc3lzdGFibGVfZ2V0bmV4dChjb25TY2FuKSkpCisJeworCQlG b3JtX3BnX2NvbnN0cmFpbnQgY29uID0gKEZvcm1fcGdfY29uc3RyYWludCkgR0VUU1RSVUNUKGNv blR1cCk7CisJCWNoYXIJICAgKmNvbmRlZjsKKworCQlpZiAoIWNvbi0+Y29uaXNsb2NhbCkKKwkJ CWNvbnRpbnVlOworCQlpZiAoY29uLT5jb250eXBlID09IENPTlNUUkFJTlRfQ0hFQ0sgJiYgIWlz X3BhcnRpdGlvbikKKwkJCWNvbnRpbnVlOworCQlpZiAoY29uLT5jb250eXBlID09IENPTlNUUkFJ TlRfTk9UTlVMTCAmJiAhaXNfcGFydGl0aW9uICYmCisJCQlsaXN0X21lbWJlcl9vaWQoY3R4LT5z a2lwX25vdG51bGxfb2lkcywgY29uLT5vaWQpKQorCQkJY29udGludWU7CisKKwkJY29uZGVmID0g cGdfZ2V0X2NvbnN0cmFpbnRkZWZfY29tbWFuZChjb24tPm9pZCk7CisJCXJlc2V0U3RyaW5nSW5m bygmY3R4LT5idWYpOworCQlhcHBlbmRTdHJpbmdJbmZvKCZjdHgtPmJ1ZiwgIiVzOyIsIGNvbmRl Zik7CisJCWFwcGVuZF9zdHJpcHBlZF9zdG10KGN0eCk7CisJCXBmcmVlKGNvbmRlZik7CisJfQor CXN5c3RhYmxlX2VuZHNjYW4oY29uU2Nhbik7CisJdGFibGVfY2xvc2UoY29uUmVsLCBBY2Nlc3NT aGFyZUxvY2spOworfQorCisvKgorICogZW1pdF9ydWxlcworICoJCUNSRUFURSBSVUxFIHBlciBj YWNoZWQgcmV3cml0ZSBydWxlIG9uIHRoZSByZWxhdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK2Vt aXRfcnVsZXMoVGFibGVEZGxDb250ZXh0ICogY3R4KQoreworCWlmICghY3R4LT5pbmNsdWRlX3J1 bGVzIHx8IGN0eC0+cmVsLT5yZF9ydWxlcyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlmb3IgKGlu dCBpID0gMDsgaSA8IGN0eC0+cmVsLT5yZF9ydWxlcy0+bnVtTG9ja3M7IGkrKykKKwl7CisJCU9p ZAkJCXJ1bGVpZCA9IGN0eC0+cmVsLT5yZF9ydWxlcy0+cnVsZXNbaV0tPnJ1bGVJZDsKKwkJRGF0 dW0JCXJ1bGVkZWY7CisJCWNoYXIJICAgKnJ1bGVkZWZfc3RyOworCisJCXJ1bGVkZWYgPSBPaWRG dW5jdGlvbkNhbGwxKEZfUEdfR0VUX1JVTEVERUZfT0lELAorCQkJCQkJCQkgICBPYmplY3RJZEdl dERhdHVtKHJ1bGVpZCkpOworCQlydWxlZGVmX3N0ciA9IFRleHREYXR1bUdldENTdHJpbmcocnVs ZWRlZik7CisJCXJlc2V0U3RyaW5nSW5mbygmY3R4LT5idWYpOworCQlhcHBlbmRTdHJpbmdJbmZv U3RyaW5nKCZjdHgtPmJ1ZiwgcnVsZWRlZl9zdHIpOworCQlhcHBlbmRfc3RyaXBwZWRfc3RtdChj dHgpOworCQlwZnJlZShydWxlZGVmX3N0cik7CisJfQorfQorCisvKgorICogZW1pdF9zdGF0aXN0 aWNzCisgKgkJQ1JFQVRFIFNUQVRJU1RJQ1MgcGVyIGV4dGVuZGVkIHN0YXRpc3RpY3Mgb2JqZWN0 IG9uIHRoZSByZWxhdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK2VtaXRfc3RhdGlzdGljcyhUYWJs ZURkbENvbnRleHQgKiBjdHgpCit7CisJUmVsYXRpb24Jc3RhdFJlbDsKKwlTeXNTY2FuRGVzYyBz dGF0U2NhbjsKKwlTY2FuS2V5RGF0YSBzdGF0S2V5OworCUhlYXBUdXBsZQlzdGF0VHVwOworCisJ aWYgKCFjdHgtPmluY2x1ZGVfc3RhdGlzdGljcykKKwkJcmV0dXJuOworCisJc3RhdFJlbCA9IHRh YmxlX29wZW4oU3RhdGlzdGljRXh0UmVsYXRpb25JZCwgQWNjZXNzU2hhcmVMb2NrKTsKKwlTY2Fu S2V5SW5pdCgmc3RhdEtleSwKKwkJCQlBbnVtX3BnX3N0YXRpc3RpY19leHRfc3R4cmVsaWQsCisJ CQkJQlRFcXVhbFN0cmF0ZWd5TnVtYmVyLCBGX09JREVRLAorCQkJCU9iamVjdElkR2V0RGF0dW0o Y3R4LT5yZWxpZCkpOworCXN0YXRTY2FuID0gc3lzdGFibGVfYmVnaW5zY2FuKHN0YXRSZWwsIFN0 YXRpc3RpY0V4dFJlbGlkSW5kZXhJZCwKKwkJCQkJCQkJICB0cnVlLCBOVUxMLCAxLCAmc3RhdEtl eSk7CisKKwl3aGlsZSAoSGVhcFR1cGxlSXNWYWxpZChzdGF0VHVwID0gc3lzdGFibGVfZ2V0bmV4 dChzdGF0U2NhbikpKQorCXsKKwkJRm9ybV9wZ19zdGF0aXN0aWNfZXh0IHN0YXQgPSAoRm9ybV9w Z19zdGF0aXN0aWNfZXh0KSBHRVRTVFJVQ1Qoc3RhdFR1cCk7CisJCWNoYXIJICAgKnN0YXRkZWYg PSBwZ19nZXRfc3RhdGlzdGljc29iamRlZl9zdHJpbmcoc3RhdC0+b2lkKTsKKworCQlyZXNldFN0 cmluZ0luZm8oJmN0eC0+YnVmKTsKKwkJYXBwZW5kU3RyaW5nSW5mbygmY3R4LT5idWYsICIlczsi LCBzdGF0ZGVmKTsKKwkJYXBwZW5kX3N0cmlwcGVkX3N0bXQoY3R4KTsKKwkJcGZyZWUoc3RhdGRl Zik7CisJfQorCXN5c3RhYmxlX2VuZHNjYW4oc3RhdFNjYW4pOworCXRhYmxlX2Nsb3NlKHN0YXRS ZWwsIEFjY2Vzc1NoYXJlTG9jayk7Cit9CisKKy8qCisgKiBlbWl0X3JlcGxpY2FfaWRlbnRpdHkK KyAqCQlBTFRFUiBUQUJMRSBxdWFsbmFtZSBSRVBMSUNBIElERU5USVRZIOKApiDigJQgZW1pdHRl ZCBvbmx5IHdoZW4gdGhlCisgKgkJcmVscmVwbGlkZW50IGRpZmZlcnMgZnJvbSB0aGUgZGVmYXVs dCAoJ2QnID0gdXNlIHByaW1hcnkga2V5KS4KKyAqLworc3RhdGljIHZvaWQKK2VtaXRfcmVwbGlj YV9pZGVudGl0eShUYWJsZURkbENvbnRleHQgKiBjdHgpCit7CisJaWYgKCFjdHgtPmluY2x1ZGVf cmVwbGljYV9pZGVudGl0eSkKKwkJcmV0dXJuOworCWlmIChjdHgtPnJlbC0+cmRfcmVsLT5yZWxy ZXBsaWRlbnQgPT0gUkVQTElDQV9JREVOVElUWV9ERUZBVUxUKQorCQlyZXR1cm47CisKKwlyZXNl dFN0cmluZ0luZm8oJmN0eC0+YnVmKTsKKwlzd2l0Y2ggKGN0eC0+cmVsLT5yZF9yZWwtPnJlbHJl cGxpZGVudCkKKwl7CisJCWNhc2UgUkVQTElDQV9JREVOVElUWV9OT1RISU5HOgorCQkJYXBwZW5k U3RyaW5nSW5mbygmY3R4LT5idWYsCisJCQkJCQkJICJBTFRFUiBUQUJMRSAlcyBSRVBMSUNBIElE RU5USVRZIE5PVEhJTkc7IiwKKwkJCQkJCQkgY3R4LT5xdWFsbmFtZSk7CisJCQlhcHBlbmRfc3Rt dChjdHgpOworCQkJYnJlYWs7CisJCWNhc2UgUkVQTElDQV9JREVOVElUWV9GVUxMOgorCQkJYXBw ZW5kU3RyaW5nSW5mbygmY3R4LT5idWYsCisJCQkJCQkJICJBTFRFUiBUQUJMRSAlcyBSRVBMSUNB IElERU5USVRZIEZVTEw7IiwKKwkJCQkJCQkgY3R4LT5xdWFsbmFtZSk7CisJCQlhcHBlbmRfc3Rt dChjdHgpOworCQkJYnJlYWs7CisJCWNhc2UgUkVQTElDQV9JREVOVElUWV9JTkRFWDoKKwkJCXsK KwkJCQlPaWQJCQlyZXBsaWR4ID0gUmVsYXRpb25HZXRSZXBsaWNhSW5kZXgoY3R4LT5yZWwpOwor CisJCQkJaWYgKE9pZElzVmFsaWQocmVwbGlkeCkpCisJCQkJeworCQkJCQljaGFyCSAgICppZHhu YW1lID0gZ2V0X3JlbF9uYW1lKHJlcGxpZHgpOworCisJCQkJCWlmIChpZHhuYW1lID09IE5VTEwp CisJCQkJCQllcmVwb3J0KEVSUk9SLAorCQkJCQkJCQkoZXJyY29kZShFUlJDT0RFX1VOREVGSU5F RF9PQkpFQ1QpLAorCQkJCQkJCQkgZXJybXNnKCJyZXBsaWNhIGlkZW50aXR5IGluZGV4IHdpdGgg T0lEICV1IGRvZXMgbm90IGV4aXN0IiwKKwkJCQkJCQkJCQlyZXBsaWR4KSwKKwkJCQkJCQkJIGVy cmRldGFpbCgiSXQgbWF5IGhhdmUgYmVlbiBjb25jdXJyZW50bHkgZHJvcHBlZC4iKSkpOworCisJ CQkJCWFwcGVuZFN0cmluZ0luZm8oJmN0eC0+YnVmLAorCQkJCQkJCQkJICJBTFRFUiBUQUJMRSAl cyBSRVBMSUNBIElERU5USVRZIFVTSU5HIElOREVYICVzOyIsCisJCQkJCQkJCQkgY3R4LT5xdWFs bmFtZSwKKwkJCQkJCQkJCSBxdW90ZV9pZGVudGlmaWVyKGlkeG5hbWUpKTsKKwkJCQkJYXBwZW5k X3N0bXQoY3R4KTsKKwkJCQkJcGZyZWUoaWR4bmFtZSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7 CisJfQorfQorCisvKgorICogZW1pdF9ybHNfdG9nZ2xlcworICoJCUFMVEVSIFRBQkxFIHF1YWxu YW1lIEVOQUJMRSAvIEZPUkNFIFJPVyBMRVZFTCBTRUNVUklUWS4KKyAqLworc3RhdGljIHZvaWQK K2VtaXRfcmxzX3RvZ2dsZXMoVGFibGVEZGxDb250ZXh0ICogY3R4KQoreworCWlmICghY3R4LT5p bmNsdWRlX3JscykKKwkJcmV0dXJuOworCisJaWYgKGN0eC0+cmVsLT5yZF9yZWwtPnJlbHJvd3Nl Y3VyaXR5KQorCXsKKwkJcmVzZXRTdHJpbmdJbmZvKCZjdHgtPmJ1Zik7CisJCWFwcGVuZFN0cmlu Z0luZm8oJmN0eC0+YnVmLAorCQkJCQkJICJBTFRFUiBUQUJMRSAlcyBFTkFCTEUgUk9XIExFVkVM IFNFQ1VSSVRZOyIsCisJCQkJCQkgY3R4LT5xdWFsbmFtZSk7CisJCWFwcGVuZF9zdG10KGN0eCk7 CisJfQorCWlmIChjdHgtPnJlbC0+cmRfcmVsLT5yZWxmb3JjZXJvd3NlY3VyaXR5KQorCXsKKwkJ cmVzZXRTdHJpbmdJbmZvKCZjdHgtPmJ1Zik7CisJCWFwcGVuZFN0cmluZ0luZm8oJmN0eC0+YnVm LAorCQkJCQkJICJBTFRFUiBUQUJMRSAlcyBGT1JDRSBST1cgTEVWRUwgU0VDVVJJVFk7IiwKKwkJ CQkJCSBjdHgtPnF1YWxuYW1lKTsKKwkJYXBwZW5kX3N0bXQoY3R4KTsKKwl9Cit9CisKKy8qCisg KiBlbWl0X3BhcnRpdGlvbl9jaGlsZHJlbgorICoJCUZvciBlYWNoIGRpcmVjdCBwYXJ0aXRpb24g Y2hpbGQgb2YgYSBwYXJ0aXRpb25lZC10YWJsZSBwYXJlbnQsCisgKgkJcmVjdXJzaXZlbHkgY2Fs bCBwZ19nZXRfdGFibGVfZGRsX2ludGVybmFsIGFuZCBhcHBlbmQgdGhlIGNoaWxkJ3MKKyAqCQlz dGF0ZW1lbnRzLiAgRWFjaCBjaGlsZCdzIG93biBEREwgaGFuZGxlcyBmdXJ0aGVyIGxldmVscyB0 aHJvdWdoCisgKgkJdGhlIHNhbWUgcmVjdXJzaW9uLgorICovCitzdGF0aWMgdm9pZAorZW1pdF9w YXJ0aXRpb25fY2hpbGRyZW4oVGFibGVEZGxDb250ZXh0ICogY3R4KQoreworCUxpc3QJICAgKmNo aWxkcmVuOworCUxpc3RDZWxsICAgKmxjOworCisJaWYgKCFjdHgtPmluY2x1ZGVfcGFydGl0aW9u IHx8CisJCWN0eC0+cmVsLT5yZF9yZWwtPnJlbGtpbmQgIT0gUkVMS0lORF9QQVJUSVRJT05FRF9U QUJMRSkKKwkJcmV0dXJuOworCisJY2hpbGRyZW4gPSBmaW5kX2luaGVyaXRhbmNlX2NoaWxkcmVu KGN0eC0+cmVsaWQsIEFjY2Vzc1NoYXJlTG9jayk7CisJZm9yZWFjaChsYywgY2hpbGRyZW4pCisJ eworCQlPaWQJCQljaGlsZG9pZCA9IGxmaXJzdF9vaWQobGMpOworCQlMaXN0CSAgICpjaGlsZHN0 bXRzOworCisJCWNoaWxkc3RtdHMgPSBwZ19nZXRfdGFibGVfZGRsX2ludGVybmFsKGNoaWxkb2lk LCBjdHgtPnByZXR0eSwKKwkJCQkJCQkJCQkJICAgY3R4LT5ub19vd25lciwKKwkJCQkJCQkJCQkJ ICAgY3R4LT5ub190YWJsZXNwYWNlLAorCQkJCQkJCQkJCQkgICBjdHgtPmluY2x1ZGVfaW5kZXhl cywKKwkJCQkJCQkJCQkJICAgY3R4LT5pbmNsdWRlX2NvbnN0cmFpbnRzLAorCQkJCQkJCQkJCQkg ICBjdHgtPmluY2x1ZGVfcnVsZXMsCisJCQkJCQkJCQkJCSAgIGN0eC0+aW5jbHVkZV9zdGF0aXN0 aWNzLAorCQkJCQkJCQkJCQkgICBjdHgtPmluY2x1ZGVfdHJpZ2dlcnMsCisJCQkJCQkJCQkJCSAg IGN0eC0+aW5jbHVkZV9wb2xpY2llcywKKwkJCQkJCQkJCQkJICAgY3R4LT5pbmNsdWRlX3JscywK KwkJCQkJCQkJCQkJICAgY3R4LT5pbmNsdWRlX3JlcGxpY2FfaWRlbnRpdHksCisJCQkJCQkJCQkJ CSAgIGN0eC0+aW5jbHVkZV9wYXJ0aXRpb24sCisJCQkJCQkJCQkJCSAgIGN0eC0+c2NoZW1hX3F1 YWxpZmllZCk7CisJCWN0eC0+c3RhdGVtZW50cyA9IGxpc3RfY29uY2F0KGN0eC0+c3RhdGVtZW50 cywgY2hpbGRzdG10cyk7CisJfQorCWxpc3RfZnJlZShjaGlsZHJlbik7Cit9CisKKy8qCisgKiBw Z19nZXRfdGFibGVfZGRsX2ludGVybmFsCisgKgkJR2VuZXJhdGUgRERMIHN0YXRlbWVudHMgdG8g cmVjcmVhdGUgYSByZWd1bGFyIG9yIHBhcnRpdGlvbmVkIHRhYmxlLgorICoKKyAqIFRoZSBmaXJz dCBsaXN0IGVsZW1lbnQgaXMgdGhlIENSRUFURSBUQUJMRSBzdGF0ZW1lbnQuICBTdWJzZXF1ZW50 CisgKiBlbGVtZW50cyBhcmUgdGhlIEFMVEVSIFRBQkxFIC8gQ1JFQVRFIElOREVYIC8gQ1JFQVRF IFJVTEUgLworICogQ1JFQVRFIFNUQVRJU1RJQ1Mgc3RhdGVtZW50cyBuZWVkZWQgdG8gcmVzdG9y ZSB0aGUgdGFibGUncyBmdWxsCisgKiBkZWZpbml0aW9uLgorICoKKyAqIFRyaWdnZXIgYW5kIHBv bGljeSBlbWlzc2lvbiBhcmUgc2NhZmZvbGRlZCBidXQgY3VycmVudGx5IGRpc2FibGVkCisgKiAo I2lmIDApIOKAlCB0aGV5IHdpbGwgYmVjb21lIGEgc2luZ2xlIGhlbHBlciBjYWxsIG9uY2UgdGhl IHN0YW5kYWxvbmUKKyAqIHBnX2dldF90cmlnZ2VyX2RkbCAvIHBnX2dldF9wb2xpY3lfZGRsIGhl bHBlcnMgbGFuZC4KKyAqLworc3RhdGljIExpc3QgKgorcGdfZ2V0X3RhYmxlX2RkbF9pbnRlcm5h bChPaWQgcmVsaWQsIGJvb2wgcHJldHR5LAorCQkJCQkJICBib29sIG5vX293bmVyLCBib29sIG5v X3RhYmxlc3BhY2UsCisJCQkJCQkgIGJvb2wgaW5jbHVkZV9pbmRleGVzLAorCQkJCQkJICBib29s IGluY2x1ZGVfY29uc3RyYWludHMsCisJCQkJCQkgIGJvb2wgaW5jbHVkZV9ydWxlcywKKwkJCQkJ CSAgYm9vbCBpbmNsdWRlX3N0YXRpc3RpY3MsCisJCQkJCQkgIGJvb2wgaW5jbHVkZV90cmlnZ2Vy cywKKwkJCQkJCSAgYm9vbCBpbmNsdWRlX3BvbGljaWVzLAorCQkJCQkJICBib29sIGluY2x1ZGVf cmxzLAorCQkJCQkJICBib29sIGluY2x1ZGVfcmVwbGljYV9pZGVudGl0eSwKKwkJCQkJCSAgYm9v bCBpbmNsdWRlX3BhcnRpdGlvbiwKKwkJCQkJCSAgYm9vbCBzY2hlbWFfcXVhbGlmaWVkKQorewor CVRhYmxlRGRsQ29udGV4dCBjdHggPSB7MH07CisJUmVsYXRpb24JcmVsOworCWNoYXIJCXJlbGtp bmQ7CisJQWNsUmVzdWx0CWFjbHJlc3VsdDsKKworCXJlbCA9IHRhYmxlX29wZW4ocmVsaWQsIEFj Y2Vzc1NoYXJlTG9jayk7CisKKwlyZWxraW5kID0gcmVsLT5yZF9yZWwtPnJlbGtpbmQ7CisKKwkv KgorCSAqIFRoZSBpbml0aWFsIGN1dCBvbmx5IHN1cHBvcnRzIG9yZGluYXJ5IGFuZCBwYXJ0aXRp b25lZCB0YWJsZXMuICBWaWV3cywKKwkgKiBtYXR2aWV3cywgZm9yZWlnbiB0YWJsZXMsIHNlcXVl bmNlcywgaW5kZXhlcywgY29tcG9zaXRlIHR5cGVzLCBhbmQKKwkgKiBUT0FTVCB0YWJsZXMgYXJl IG91dCBvZiBzY29wZSBmb3Igbm93LgorCSAqLworCWlmIChyZWxraW5kICE9IFJFTEtJTkRfUkVM QVRJT04gJiYgcmVsa2luZCAhPSBSRUxLSU5EX1BBUlRJVElPTkVEX1RBQkxFKQorCXsKKwkJY2hh cgkgICAqcmVsbmFtZSA9IHBzdHJkdXAoUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUocmVsKSk7CisK KwkJdGFibGVfY2xvc2UocmVsLCBBY2Nlc3NTaGFyZUxvY2spOworCQllcmVwb3J0KEVSUk9SLAor CQkJCShlcnJjb2RlKEVSUkNPREVfV1JPTkdfT0JKRUNUX1RZUEUpLAorCQkJCSBlcnJtc2coIlwi JXNcIiBpcyBub3QgYW4gb3JkaW5hcnkgb3IgcGFydGl0aW9uZWQgdGFibGUiLAorCQkJCQkJcmVs bmFtZSkpKTsKKwl9CisKKwkvKiBDYWxsZXIgbmVlZHMgU0VMRUNUIG9uIHRoZSB0YWJsZSB0byBy ZWFkIGl0cyBkZWZpbml0aW9uLiAqLworCWFjbHJlc3VsdCA9IHBnX2NsYXNzX2FjbGNoZWNrKHJl bGlkLCBHZXRVc2VySWQoKSwgQUNMX1NFTEVDVCk7CisJaWYgKGFjbHJlc3VsdCAhPSBBQ0xDSEVD S19PSykKKwkJYWNsY2hlY2tfZXJyb3IoYWNscmVzdWx0LCBPQkpFQ1RfVEFCTEUsCisJCQkJCSAg IFJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKHJlbCkpOworCisJY3R4LnJlbCA9IHJlbDsKKwljdHgu cmVsaWQgPSByZWxpZDsKKwljdHgucHJldHR5ID0gcHJldHR5OworCWN0eC5ub19vd25lciA9IG5v X293bmVyOworCWN0eC5ub190YWJsZXNwYWNlID0gbm9fdGFibGVzcGFjZTsKKwljdHguaW5jbHVk ZV9pbmRleGVzID0gaW5jbHVkZV9pbmRleGVzOworCWN0eC5pbmNsdWRlX2NvbnN0cmFpbnRzID0g aW5jbHVkZV9jb25zdHJhaW50czsKKwljdHguaW5jbHVkZV9ydWxlcyA9IGluY2x1ZGVfcnVsZXM7 CisJY3R4LmluY2x1ZGVfc3RhdGlzdGljcyA9IGluY2x1ZGVfc3RhdGlzdGljczsKKwljdHguaW5j bHVkZV90cmlnZ2VycyA9IGluY2x1ZGVfdHJpZ2dlcnM7CisJY3R4LmluY2x1ZGVfcG9saWNpZXMg PSBpbmNsdWRlX3BvbGljaWVzOworCWN0eC5pbmNsdWRlX3JscyA9IGluY2x1ZGVfcmxzOworCWN0 eC5pbmNsdWRlX3JlcGxpY2FfaWRlbnRpdHkgPSBpbmNsdWRlX3JlcGxpY2FfaWRlbnRpdHk7CisJ Y3R4LmluY2x1ZGVfcGFydGl0aW9uID0gaW5jbHVkZV9wYXJ0aXRpb247CisJY3R4LnNjaGVtYV9x dWFsaWZpZWQgPSBzY2hlbWFfcXVhbGlmaWVkOworCWN0eC5iYXNlX25hbWVzcGFjZSA9IFJlbGF0 aW9uR2V0TmFtZXNwYWNlKHJlbCk7CisJY3R4LnNhdmVfbmVzdGxldmVsID0gLTE7CisJY3R4LnF1 YWxuYW1lID0gbG9va3VwX3JlbG5hbWVfZm9yX2VtaXQocmVsaWQsIHNjaGVtYV9xdWFsaWZpZWQs CisJCQkJCQkJCQkJICAgY3R4LmJhc2VfbmFtZXNwYWNlKTsKKworCS8qCisJICogV2hlbiBzY2hl bWFfcXVhbGlmaWVkIGlzIGZhbHNlLCBuYXJyb3cgdGhlIGFjdGl2ZSBzZWFyY2hfcGF0aCB0byB0 aGUKKwkgKiB0YXJnZXQgdGFibGUncyBvd24gbmFtZXNwYWNlIGZvciB0aGUgZHVyYXRpb24gb2Yg RERMIGVtaXNzaW9uLiAgVGhlCisJICogZGVwYXJzZSBjb2RlIGluIHJ1bGV1dGlscyAoYW5kIHRo ZSByZWdjbGFzcy9yZWdwcm9jIG91dHB1dCBmdW5jdGlvbnMgd2UKKwkgKiB0cmFuc2l0aXZlbHkg Y2FsbCkgZGVjaWRlcyB3aGV0aGVyIHRvIHNjaGVtYS1xdWFsaWZ5IGEgbmFtZSBiYXNlZCBvbgor CSAqIHdoZXRoZXIgdGhlIHJlZmVyZW5jZWQgb2JqZWN0IGlzIHJlYWNoYWJsZSB0aHJvdWdoIHNl YXJjaF9wYXRoLCBzbyB0aGlzCisJICogbWFrZXMgc2FtZS1zY2hlbWEgcmVmZXJlbmNlcyBpbiBE RUZBVUxUIGFuZCBDSEVDSyBleHByZXNzaW9ucywgcmVnY2xhc3MKKwkgKiBsaXRlcmFscywgRksg dGFyZ2V0cywgZXRjLiBjb21lIG91dCB1bnF1YWxpZmllZC4gIENyb3NzLXNjaGVtYQorCSAqIHJl ZmVyZW5jZXMgc3RheSBxdWFsaWZpZWQsIHdoaWNoIGlzIHRoZSBjb3JyZWN0bmVzcyByZXF1aXJl bWVudC4KKwkgKiBBdEVPWGFjdF9HVUMgY2xlYW5zIHVwIGF0IHhhY3QgZW5kIGlmIGFueXRoaW5n IHRocm93cyBiZXR3ZWVuIGhlcmUgYW5kCisJICogdGhlIGV4cGxpY2l0IHJlc3RvcmUgYmVsb3c7 IG9uIHRoZSBub3JtYWwgcGF0aCB3ZSByZXN0b3JlIHJpZ2h0IGJlZm9yZQorCSAqIHJldHVybmlu Zy4KKwkgKgorCSAqIFByZS1jb21wdXRlICI8c2NoZW1hPi4iIHRvbyDigJQgdGhlIGFsd2F5cy1x dWFsaWZpZWQgaGVscGVycworCSAqIChjb25zdHJhaW50ZGVmX2NvbW1hbmQsIGluZGV4ZGVmX3N0 cmluZywgcnVsZWRlZiwKKwkgKiBzdGF0aXN0aWNzb2JqZGVmX3N0cmluZykgaWdub3JlIHNlYXJj aF9wYXRoIGZvciB0aGUgdGFyZ2V0J3Mgb3duICJBTFRFUgorCSAqIFRBQkxFIHNjaGVtYS50Ymwi LyJPTiBzY2hlbWEudGJsIi8iVE8gc2NoZW1hLnRibCIgcHJlZml4IGFuZCBmb3IgdGhlCisJICog cXVhbGlmaWVkIHN0YXRpc3RpY3MgbmFtZTsgd2Ugc3RyaXAgdGhhdCBzdHJpbmcgb3Vyc2VsdmVz IHZpYQorCSAqIHN0cmlwX3NjaGVtYV9wcmVmaXguCisJICovCisJaWYgKCFzY2hlbWFfcXVhbGlm aWVkKQorCXsKKwkJY2hhcgkgICAqbnNwbmFtZSA9IGdldF9uYW1lc3BhY2VfbmFtZShjdHguYmFz ZV9uYW1lc3BhY2UpOworCisJCWlmIChuc3BuYW1lICE9IE5VTEwpCisJCXsKKwkJCWNvbnN0IGNo YXIgKnFuc3AgPSBxdW90ZV9pZGVudGlmaWVyKG5zcG5hbWUpOworCisJCQljdHguc2NoZW1hX3By ZWZpeCA9IHBzcHJpbnRmKCIlcy4iLCBxbnNwKTsKKwkJCWN0eC5zYXZlX25lc3RsZXZlbCA9IE5l d0dVQ05lc3RMZXZlbCgpOworCQkJKHZvaWQpIHNldF9jb25maWdfb3B0aW9uKCJzZWFyY2hfcGF0 aCIsIHFuc3AsCisJCQkJCQkJCQkgUEdDX1VTRVJTRVQsIFBHQ19TX1NFU1NJT04sCisJCQkJCQkJ CQkgR1VDX0FDVElPTl9TQVZFLCB0cnVlLCAwLCBmYWxzZSk7CisJCQlwZnJlZShuc3BuYW1lKTsK KwkJfQorCX0KKworCS8qCisJICogQ2FjaGUgbG9jYWxseS1kZWNsYXJlZCBOT1QgTlVMTCBjb25z dHJhaW50IG1ldGFkYXRhIHNvIHRoZSBjb2x1bW4tIGVtaXQKKwkgKiBoZWxwZXJzIGNhbiBwcm9k dWNlICJDT05TVFJBSU5UIG5hbWUgTk9UIE5VTEwiIGlubGluZSBmb3IgdXNlci1uYW1lZAorCSAq IGNvbnN0cmFpbnRzLCBhbmQgc28gdGhlIGNvbnN0cmFpbnQgbG9vcCBjYW4gYXZvaWQgZG91Ymxl LWVtaXR0aW5nIHRoZW0uCisJICovCisJY3R4Lm5uX2VudHJpZXMgPSBjb2xsZWN0X2xvY2FsX25v dF9udWxsKHJlbCwgJmN0eC5za2lwX25vdG51bGxfb2lkcyk7CisKKwlpbml0U3RyaW5nSW5mbygm Y3R4LmJ1Zik7CisKKwkvKgorCSAqIEVhY2ggcGFzcyBiZWxvdyBhcHBlbmRzIHplcm8gb3IgbW9y ZSBmaW5pc2hlZCBzdGF0ZW1lbnRzIHRvCisJICogY3R4LnN0YXRlbWVudHMgdmlhIGFwcGVuZF9z dG10IC8gYXBwZW5kX3N0cmlwcGVkX3N0bXQuICBPcmRlciBpcworCSAqIHNpZ25pZmljYW50OiBD UkVBVEUgVEFCTEUgZmlyc3Q7IE9XTkVSIGFuZCB0aGUgcGVyLWNvbHVtbiBBTFRFUiBDT0xVTU4K KwkgKiBwYXNzZXMgYmVmb3JlIHN1Yi1vYmplY3QgZW1pc3Npb247IHN1Yi1vYmplY3RzIGluIGRl cGVuZGVuY3ktZnJpZW5kbHkKKwkgKiBvcmRlciAoaW5kZXhlcyBiZWZvcmUgY29uc3RyYWludHMs IHNpbmNlIGNvbnN0cmFpbnQtYmFja2VkIGluZGV4ZXMgYXJlCisJICogZW1pdHRlZCBvdXQtb2Yt bGluZSBieSB0aGUgY29uc3RyYWludCBsb29wKTsgYW5kIHBhcnRpdGlvbiBjaGlsZHJlbgorCSAq IGxhc3Qgc28gdGhlIHBhcmVudCBhbHJlYWR5IGV4aXN0cyBhdCByZXBsYXkgdGltZS4KKwkgKi8K KwllbWl0X2NyZWF0ZV90YWJsZV9zdG10KCZjdHgpOworCWVtaXRfb3duZXJfc3RtdCgmY3R4KTsK KwllbWl0X2NoaWxkX2RlZmF1bHRfb3ZlcnJpZGVzKCZjdHgpOworCWVtaXRfYXR0b3B0aW9ucygm Y3R4KTsKKwllbWl0X2luZGV4ZXMoJmN0eCk7CisJZW1pdF9sb2NhbF9jb25zdHJhaW50cygmY3R4 KTsKKwllbWl0X3J1bGVzKCZjdHgpOworCWVtaXRfc3RhdGlzdGljcygmY3R4KTsKKwllbWl0X3Jl cGxpY2FfaWRlbnRpdHkoJmN0eCk7CisJZW1pdF9ybHNfdG9nZ2xlcygmY3R4KTsKKworCS8qCisJ ICogVHJpZ2dlcnMgYW5kIHJvdy1sZXZlbCBzZWN1cml0eSBwb2xpY2llcyDigJQgZGlzYWJsZWQg dW50aWwgdGhlCisJICogc3RhbmRhbG9uZSBwZ19nZXRfdHJpZ2dlcl9kZGwoKSBhbmQgcGdfZ2V0 X3BvbGljeV9kZGwoKSBoZWxwZXJzIGxhbmQuCisJICogVGhlIHNjYW4gKyBsb2NrICsgZmlsdGVy IHNjYWZmb2xkaW5nIGJlbG93IGlzIHByZXNlcnZlZCAoaW5zaWRlICNpZiAwKQorCSAqIHNvIHdp cmluZyB1cCBlYWNoIGVtaXNzaW9uIGJlY29tZXMgYSBvbmUtbGluZXIgaW4gdGhlIGxvb3AgYm9k eSBvbmNlCisJICogdGhvc2UgaGVscGVycyBhcmUgYXZhaWxhYmxlLgorCSAqLworI2lmIDAKKwlp ZiAoaW5jbHVkZV90cmlnZ2VycykKKwl7CisJCVJlbGF0aW9uCXRyaWdSZWw7CisJCVN5c1NjYW5E ZXNjIHRyaWdTY2FuOworCQlTY2FuS2V5RGF0YSB0cmlnS2V5OworCQlIZWFwVHVwbGUJdHJpZ1R1 cDsKKworCQl0cmlnUmVsID0gdGFibGVfb3BlbihUcmlnZ2VyUmVsYXRpb25JZCwgQWNjZXNzU2hh cmVMb2NrKTsKKwkJU2NhbktleUluaXQoJnRyaWdLZXksCisJCQkJCUFudW1fcGdfdHJpZ2dlcl90 Z3JlbGlkLAorCQkJCQlCVEVxdWFsU3RyYXRlZ3lOdW1iZXIsIEZfT0lERVEsCisJCQkJCU9iamVj dElkR2V0RGF0dW0ocmVsaWQpKTsKKwkJdHJpZ1NjYW4gPSBzeXN0YWJsZV9iZWdpbnNjYW4odHJp Z1JlbCwgVHJpZ2dlclJlbGlkTmFtZUluZGV4SWQsCisJCQkJCQkJCQkgIHRydWUsIE5VTEwsIDEs ICZ0cmlnS2V5KTsKKwkJd2hpbGUgKEhlYXBUdXBsZUlzVmFsaWQodHJpZ1R1cCA9IHN5c3RhYmxl X2dldG5leHQodHJpZ1NjYW4pKSkKKwkJeworCQkJRm9ybV9wZ190cmlnZ2VyIHRyZyA9IChGb3Jt X3BnX3RyaWdnZXIpIEdFVFNUUlVDVCh0cmlnVHVwKTsKKworCQkJaWYgKHRyZy0+dGdpc2ludGVy bmFsKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBUT0RPOiBhcHBlbmQgcGdfZ2V0X3RyaWdnZXJf ZGRsKHRyZy0+b2lkKSBvdXRwdXQgaGVyZS4gKi8KKwkJfQorCQlzeXN0YWJsZV9lbmRzY2FuKHRy aWdTY2FuKTsKKwkJdGFibGVfY2xvc2UodHJpZ1JlbCwgQWNjZXNzU2hhcmVMb2NrKTsKKwl9CisK KwlpZiAoaW5jbHVkZV9wb2xpY2llcykKKwl7CisJCVJlbGF0aW9uCXBvbFJlbDsKKwkJU3lzU2Nh bkRlc2MgcG9sU2NhbjsKKwkJU2NhbktleURhdGEgcG9sS2V5OworCQlIZWFwVHVwbGUJcG9sVHVw OworCisJCXBvbFJlbCA9IHRhYmxlX29wZW4oUG9saWN5UmVsYXRpb25JZCwgQWNjZXNzU2hhcmVM b2NrKTsKKwkJU2NhbktleUluaXQoJnBvbEtleSwKKwkJCQkJQW51bV9wZ19wb2xpY3lfcG9scmVs aWQsCisJCQkJCUJURXF1YWxTdHJhdGVneU51bWJlciwgRl9PSURFUSwKKwkJCQkJT2JqZWN0SWRH ZXREYXR1bShyZWxpZCkpOworCQlwb2xTY2FuID0gc3lzdGFibGVfYmVnaW5zY2FuKHBvbFJlbCwg UG9saWN5UG9scmVsaWRQb2xuYW1lSW5kZXhJZCwKKwkJCQkJCQkJCSB0cnVlLCBOVUxMLCAxLCAm cG9sS2V5KTsKKwkJd2hpbGUgKEhlYXBUdXBsZUlzVmFsaWQocG9sVHVwID0gc3lzdGFibGVfZ2V0 bmV4dChwb2xTY2FuKSkpCisJCXsKKwkJCS8qIFRPRE86IGFwcGVuZCBwZ19nZXRfcG9saWN5X2Rk bChyZWxpZCwgcG9sbmFtZSkgb3V0cHV0IGhlcmUuICovCisJCX0KKwkJc3lzdGFibGVfZW5kc2Nh bihwb2xTY2FuKTsKKwkJdGFibGVfY2xvc2UocG9sUmVsLCBBY2Nlc3NTaGFyZUxvY2spOworCX0K KyNlbHNlCisJKHZvaWQpIGluY2x1ZGVfdHJpZ2dlcnM7CisJKHZvaWQpIGluY2x1ZGVfcG9saWNp ZXM7CisjZW5kaWYKKworCWVtaXRfcGFydGl0aW9uX2NoaWxkcmVuKCZjdHgpOworCisJeworCQlp bnQJCQluYXR0cyA9IFJlbGF0aW9uR2V0RGVzY3IocmVsKS0+bmF0dHM7CisKKwkJZm9yIChpbnQg aSA9IDE7IGkgPD0gbmF0dHM7IGkrKykKKwkJCWlmIChjdHgubm5fZW50cmllc1tpXS5uYW1lICE9 IE5VTEwpCisJCQkJcGZyZWUoY3R4Lm5uX2VudHJpZXNbaV0ubmFtZSk7CisJfQorCXBmcmVlKGN0 eC5ubl9lbnRyaWVzKTsKKworCXRhYmxlX2Nsb3NlKHJlbCwgQWNjZXNzU2hhcmVMb2NrKTsKKwlw ZnJlZShjdHguYnVmLmRhdGEpOworCXBmcmVlKGN0eC5xdWFsbmFtZSk7CisJaWYgKGN0eC5zY2hl bWFfcHJlZml4ICE9IE5VTEwpCisJCXBmcmVlKGN0eC5zY2hlbWFfcHJlZml4KTsKKwlsaXN0X2Zy ZWUoY3R4LnNraXBfbm90bnVsbF9vaWRzKTsKKworCS8qCisJICogUG9wIHRoZSBuYXJyb3dlZCBz ZWFyY2hfcGF0aCBub3cgdGhhdCBhbGwgaGVscGVycyBoYXZlIHJ1bi4gIEVycm9ycworCSAqIHRo cm93biBlYXJsaWVyIGFyZSBjbGVhbmVkIHVwIGJ5IEF0RU9YYWN0X0dVQyBhdCB4YWN0IGVuZC4K KwkgKi8KKwlpZiAoY3R4LnNhdmVfbmVzdGxldmVsID49IDApCisJCUF0RU9YYWN0X0dVQyh0cnVl LCBjdHguc2F2ZV9uZXN0bGV2ZWwpOworCisJcmV0dXJuIGN0eC5zdGF0ZW1lbnRzOworfQorCisv KgorICogcGdfZ2V0X3RhYmxlX2RkbAorICoJCVJldHVybiBEREwgdG8gcmVjcmVhdGUgYSB0YWJs ZSBhcyBhIHNldCBvZiB0ZXh0IHJvd3MuCisgKi8KK0RhdHVtCitwZ19nZXRfdGFibGVfZGRsKFBH X0ZVTkNUSU9OX0FSR1MpCit7CisJRnVuY0NhbGxDb250ZXh0ICpmdW5jY3R4OworCUxpc3QJICAg KnN0YXRlbWVudHM7CisKKwlpZiAoU1JGX0lTX0ZJUlNUQ0FMTCgpKQorCXsKKwkJTWVtb3J5Q29u dGV4dCBvbGRjb250ZXh0OworCQlPaWQJCQlyZWxpZDsKKwkJRGRsT3B0aW9uCW9wdHNbXSA9IHsK KwkJCXsicHJldHR5IiwgRERMX09QVF9CT09MfSwKKwkJCXsib3duZXIiLCBERExfT1BUX0JPT0x9 LAorCQkJeyJ0YWJsZXNwYWNlIiwgRERMX09QVF9CT09MfSwKKwkJCXsiaW5jbHVkZXNfaW5kZXhl cyIsIERETF9PUFRfQk9PTH0sCisJCQl7ImluY2x1ZGVzX2NvbnN0cmFpbnRzIiwgRERMX09QVF9C T09MfSwKKwkJCXsiaW5jbHVkZXNfcnVsZXMiLCBERExfT1BUX0JPT0x9LAorCQkJeyJpbmNsdWRl c19zdGF0aXN0aWNzIiwgRERMX09QVF9CT09MfSwKKwkJCXsiaW5jbHVkZXNfdHJpZ2dlcnMiLCBE RExfT1BUX0JPT0x9LAorCQkJeyJpbmNsdWRlc19wb2xpY2llcyIsIERETF9PUFRfQk9PTH0sCisJ CQl7ImluY2x1ZGVzX3JscyIsIERETF9PUFRfQk9PTH0sCisJCQl7ImluY2x1ZGVzX3JlcGxpY2Ff aWRlbnRpdHkiLCBERExfT1BUX0JPT0x9LAorCQkJeyJpbmNsdWRlc19wYXJ0aXRpb24iLCBERExf T1BUX0JPT0x9LAorCQkJeyJzY2hlbWFfcXVhbGlmaWVkIiwgRERMX09QVF9CT09MfSwKKwkJfTsK KworCQlmdW5jY3R4ID0gU1JGX0ZJUlNUQ0FMTF9JTklUKCk7CisJCW9sZGNvbnRleHQgPSBNZW1v cnlDb250ZXh0U3dpdGNoVG8oZnVuY2N0eC0+bXVsdGlfY2FsbF9tZW1vcnlfY3R4KTsKKworCQlp ZiAoUEdfQVJHSVNOVUxMKDApKQorCQl7CisJCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY29u dGV4dCk7CisJCQlTUkZfUkVUVVJOX0RPTkUoZnVuY2N0eCk7CisJCX0KKworCQlyZWxpZCA9IFBH X0dFVEFSR19PSUQoMCk7CisJCXBhcnNlX2RkbF9vcHRpb25zKGZjaW5mbywgMSwgb3B0cywgbGVu Z3Rob2Yob3B0cykpOworCisJCXN0YXRlbWVudHMgPSBwZ19nZXRfdGFibGVfZGRsX2ludGVybmFs KHJlbGlkLAorCQkJCQkJCQkJCQkgICBvcHRzWzBdLmlzc2V0ICYmIG9wdHNbMF0uYm9vbHZhbCwK KwkJCQkJCQkJCQkJICAgb3B0c1sxXS5pc3NldCAmJiAhb3B0c1sxXS5ib29sdmFsLAorCQkJCQkJ CQkJCQkgICBvcHRzWzJdLmlzc2V0ICYmICFvcHRzWzJdLmJvb2x2YWwsCisJCQkJCQkJCQkJCSAg ICFvcHRzWzNdLmlzc2V0IHx8IG9wdHNbM10uYm9vbHZhbCwKKwkJCQkJCQkJCQkJICAgIW9wdHNb NF0uaXNzZXQgfHwgb3B0c1s0XS5ib29sdmFsLAorCQkJCQkJCQkJCQkgICAhb3B0c1s1XS5pc3Nl dCB8fCBvcHRzWzVdLmJvb2x2YWwsCisJCQkJCQkJCQkJCSAgICFvcHRzWzZdLmlzc2V0IHx8IG9w dHNbNl0uYm9vbHZhbCwKKwkJCQkJCQkJCQkJICAgIW9wdHNbN10uaXNzZXQgfHwgb3B0c1s3XS5i b29sdmFsLAorCQkJCQkJCQkJCQkgICAhb3B0c1s4XS5pc3NldCB8fCBvcHRzWzhdLmJvb2x2YWws CisJCQkJCQkJCQkJCSAgICFvcHRzWzldLmlzc2V0IHx8IG9wdHNbOV0uYm9vbHZhbCwKKwkJCQkJ CQkJCQkJICAgIW9wdHNbMTBdLmlzc2V0IHx8IG9wdHNbMTBdLmJvb2x2YWwsCisJCQkJCQkJCQkJ CSAgIG9wdHNbMTFdLmlzc2V0ICYmIG9wdHNbMTFdLmJvb2x2YWwsCisJCQkJCQkJCQkJCSAgICFv cHRzWzEyXS5pc3NldCB8fCBvcHRzWzEyXS5ib29sdmFsKTsKKwkJZnVuY2N0eC0+dXNlcl9mY3R4 ID0gc3RhdGVtZW50czsKKwkJZnVuY2N0eC0+bWF4X2NhbGxzID0gbGlzdF9sZW5ndGgoc3RhdGVt ZW50cyk7CisKKwkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOworCX0KKworCWZ1 bmNjdHggPSBTUkZfUEVSQ0FMTF9TRVRVUCgpOworCXN0YXRlbWVudHMgPSAoTGlzdCAqKSBmdW5j Y3R4LT51c2VyX2ZjdHg7CisKKwlpZiAoZnVuY2N0eC0+Y2FsbF9jbnRyIDwgZnVuY2N0eC0+bWF4 X2NhbGxzKQorCXsKKwkJY2hhcgkgICAqc3RtdDsKKworCQlzdG10ID0gbGlzdF9udGgoc3RhdGVt ZW50cywgZnVuY2N0eC0+Y2FsbF9jbnRyKTsKKworCQlTUkZfUkVUVVJOX05FWFQoZnVuY2N0eCwg Q1N0cmluZ0dldFRleHREYXR1bShzdG10KSk7CisJfQorCWVsc2UKKwl7CisJCWxpc3RfZnJlZV9k ZWVwKHN0YXRlbWVudHMpOworCQlTUkZfUkVUVVJOX0RPTkUoZnVuY2N0eCk7CisJfQorfQpkaWZm IC0tZ2l0IGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdCBiL3NyYy9pbmNsdWRlL2Nh dGFsb2cvcGdfcHJvYy5kYXQKaW5kZXggYmUxNTdhNWZiZTkuLmU0NTZjMjI2ZjUzIDEwMDY0NAot LS0gYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0CisrKyBiL3NyYy9pbmNsdWRlL2Nh dGFsb2cvcGdfcHJvYy5kYXQKQEAgLTg2MTUsNiArODYxNSwxMyBAQAogICBwcm9hcmd0eXBlcyA9 PiAncmVnZGF0YWJhc2UgdGV4dCcsIHByb2FsbGFyZ3R5cGVzID0+ICd7cmVnZGF0YWJhc2UsdGV4 dH0nLAogICBwcm9hcmdtb2RlcyA9PiAne2ksdn0nLCBwcm9hcmdkZWZhdWx0cyA9PiAne05VTEx9 JywKICAgcHJvc3JjID0+ICdwZ19nZXRfZGF0YWJhc2VfZGRsJyB9LAoreyBvaWQgPT4gJzgyMTUn LCBkZXNjciA9PiAnZ2V0IERETCB0byByZWNyZWF0ZSBhIHRhYmxlJywKKyAgcHJvbmFtZSA9PiAn cGdfZ2V0X3RhYmxlX2RkbCcsIHByb3Jvd3MgPT4gJzUwJywgcHJvdmFyaWFkaWMgPT4gJ3RleHQn LAorICBwcm9pc3N0cmljdCA9PiAnZicsIHByb3JldHNldCA9PiAndCcsIHByb3ZvbGF0aWxlID0+ ICdzJywgcHJvcGFyYWxsZWwgPT4gJ3InLAorICBwcm9uYXJnZGVmYXVsdHMgPT4gJzEnLCBwcm9y ZXR0eXBlID0+ICd0ZXh0JywKKyAgcHJvYXJndHlwZXMgPT4gJ3JlZ2NsYXNzIHRleHQnLCBwcm9h bGxhcmd0eXBlcyA9PiAne3JlZ2NsYXNzLHRleHR9JywKKyAgcHJvYXJnbW9kZXMgPT4gJ3tpLHZ9 JywgcHJvYXJnZGVmYXVsdHMgPT4gJ3tOVUxMfScsCisgIHByb3NyYyA9PiAncGdfZ2V0X3RhYmxl X2RkbCcgfSwKIHsgb2lkID0+ICcyNTA5JywKICAgZGVzY3IgPT4gJ2RlcGFyc2UgYW4gZW5jb2Rl ZCBleHByZXNzaW9uIHdpdGggcHJldHR5LXByaW50IG9wdGlvbicsCiAgIHByb25hbWUgPT4gJ3Bn X2dldF9leHByJywgcHJvdm9sYXRpbGUgPT4gJ3MnLCBwcm9yZXR0eXBlID0+ICd0ZXh0JywKZGlm ZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2NvbW1hbmRzL3RhYmxlY21kcy5oIGIvc3JjL2luY2x1ZGUv Y29tbWFuZHMvdGFibGVjbWRzLmgKaW5kZXggYzNkODUxOGNiNjIuLjIwODUwMjdjOWIxIDEwMDY0 NAotLS0gYS9zcmMvaW5jbHVkZS9jb21tYW5kcy90YWJsZWNtZHMuaAorKysgYi9zcmMvaW5jbHVk ZS9jb21tYW5kcy90YWJsZWNtZHMuaApAQCAtOTIsNiArOTIsNyBAQCBleHRlcm4gdm9pZCBjaGVj a19vZl90eXBlKEhlYXBUdXBsZSB0eXBldHVwbGUpOwogCiBleHRlcm4gdm9pZCByZWdpc3Rlcl9v bl9jb21taXRfYWN0aW9uKE9pZCByZWxpZCwgT25Db21taXRBY3Rpb24gYWN0aW9uKTsKIGV4dGVy biB2b2lkIHJlbW92ZV9vbl9jb21taXRfYWN0aW9uKE9pZCByZWxpZCk7CitleHRlcm4gT25Db21t aXRBY3Rpb24gZ2V0X29uX2NvbW1pdF9hY3Rpb24oT2lkIHJlbGlkKTsKIAogZXh0ZXJuIHZvaWQg UHJlQ29tbWl0X29uX2NvbW1pdF9hY3Rpb25zKHZvaWQpOwogZXh0ZXJuIHZvaWQgQXRFT1hhY3Rf b25fY29tbWl0X2FjdGlvbnMoYm9vbCBpc0NvbW1pdCk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9y ZWdyZXNzL2V4cGVjdGVkL3BnX2dldF90YWJsZV9kZGwub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9l eHBlY3RlZC9wZ19nZXRfdGFibGVfZGRsLm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwMDAwMC4uZmU1MjJjNDc5ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZWdy ZXNzL2V4cGVjdGVkL3BnX2dldF90YWJsZV9kZGwub3V0CkBAIC0wLDAgKzEsNzAwIEBACistLQor LS0gcGdfZ2V0X3RhYmxlX2RkbAorLS0KKy0tIEFsbCB0ZXN0cyBwYXNzIG93bmVyPT5mYWxzZSBz byB0aGUgQUxURVIgVEFCTEUgT1dORVIgVE8gbGluZSBpcyBub3QKKy0tIGVtaXR0ZWQsIGtlZXBp bmcgb3V0cHV0IHN0YWJsZSBhY3Jvc3MgdGVzdCBydW5uZXJzICh3aGljaCBtYXkgcnVuIHVuZGVy CistLSBkaWZmZXJlbnQgcm9sZSBuYW1lcykuCistLQorQ1JFQVRFIFNDSEVNQSBwZ3RibF9kZGxf dGVzdDsKK1NFVCBzZWFyY2hfcGF0aCA9IHBndGJsX2RkbF90ZXN0OworLS0gQmFzaWMgdGFibGUg d2l0aCBQUklNQVJZIEtFWSwgTk9UIE5VTEwsIERFRkFVTFQsIENPTExBVEUuCitDUkVBVEUgVEFC TEUgYmFzaWMgKAorICAgIGlkIGludCBQUklNQVJZIEtFWSwKKyAgICBuYW1lIHRleHQgTk9UIE5V TEwgREVGQVVMVCAnYW5vbicgQ09MTEFURSAiQyIKKyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90 YWJsZV9kZGwoJ2Jhc2ljJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBU QUJMRSBwZ3RibF9kZGxfdGVzdC5iYXNpYyAoIGlkIGludGVnZXIgTk9UIE5VTEwsIG5hbWUgdGV4 dCBDT0xMQVRFICJDIiBERUZBVUxUICdhbm9uJzo6dGV4dCBOT1QgTlVMTCk7CisgQUxURVIgVEFC TEUgcGd0YmxfZGRsX3Rlc3QuYmFzaWMgQUREIENPTlNUUkFJTlQgYmFzaWNfaWRfbm90X251bGwg Tk9UIE5VTEwgaWQ7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuYmFzaWMgQUREIENPTlNU UkFJTlQgYmFzaWNfbmFtZV9ub3RfbnVsbCBOT1QgTlVMTCBuYW1lOworIEFMVEVSIFRBQkxFIHBn dGJsX2RkbF90ZXN0LmJhc2ljIEFERCBDT05TVFJBSU5UIGJhc2ljX3BrZXkgUFJJTUFSWSBLRVkg KGlkKTsKKyg0IHJvd3MpCisKKy0tIElkZW50aXR5IGNvbHVtbnMgKHdpdGggZGVmYXVsdCBhbmQg Y3VzdG9tIHNlcXVlbmNlIG9wdGlvbnMpLgorQ1JFQVRFIFRBQkxFIGlkX2NvbHMgKAorICAgIGlk X2Fsd2F5cyBpbnQgR0VORVJBVEVEIEFMV0FZUyBBUyBJREVOVElUWSwKKyAgICBpZF9kZWZhdWx0 IGludCBHRU5FUkFURUQgQlkgREVGQVVMVCBBUyBJREVOVElUWQorKTsKK1NFTEVDVCAqIEZST00g cGdfZ2V0X3RhYmxlX2RkbCgnaWRfY29scyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJs X2RkbF90ZXN0LmlkX2NvbHMgKCBpZF9hbHdheXMgaW50ZWdlciBHRU5FUkFURUQgQUxXQVlTIEFT IElERU5USVRZIE5PVCBOVUxMLCBpZF9kZWZhdWx0IGludGVnZXIgR0VORVJBVEVEIEJZIERFRkFV TFQgQVMgSURFTlRJVFkgTk9UIE5VTEwpOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0Lmlk X2NvbHMgQUREIENPTlNUUkFJTlQgaWRfY29sc19pZF9hbHdheXNfbm90X251bGwgTk9UIE5VTEwg aWRfYWx3YXlzOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LmlkX2NvbHMgQUREIENPTlNU UkFJTlQgaWRfY29sc19pZF9kZWZhdWx0X25vdF9udWxsIE5PVCBOVUxMIGlkX2RlZmF1bHQ7Ciso MyByb3dzKQorCitDUkVBVEUgVEFCTEUgaWRfY3VzdG9tICgKKyAgICB2IGludCBHRU5FUkFURUQg QUxXQVlTIEFTIElERU5USVRZICgKKyAgICAgICAgU0VRVUVOQ0UgTkFNRSBpZF9jdXN0b21fdl9z ZXEKKyAgICAgICAgU1RBUlQgV0lUSCAxMDAgSU5DUkVNRU5UIEJZIDUKKyAgICAgICAgTUlOVkFM VUUgNTAgTUFYVkFMVUUgMTAwMAorICAgICAgICBDQUNIRSAxMCBDWUNMRQorICAgICkKKyk7CitT RUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2lkX2N1c3RvbSc6OnJlZ2NsYXNzLCAnb3du ZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5pZF9jdXN0b20gKCB2IGludGVnZXIg R0VORVJBVEVEIEFMV0FZUyBBUyBJREVOVElUWSAoU1RBUlQgV0lUSCAxMDAgSU5DUkVNRU5UIEJZ IDUgTUlOVkFMVUUgNTAgTUFYVkFMVUUgMTAwMCBDQUNIRSAxMCBDWUNMRSkgTk9UIE5VTEwpOwor IEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LmlkX2N1c3RvbSBBREQgQ09OU1RSQUlOVCBpZF9j dXN0b21fdl9ub3RfbnVsbCBOT1QgTlVMTCB2OworKDIgcm93cykKKworLS0gR2VuZXJhdGVkIHN0 b3JlZCBjb2x1bW4uCitDUkVBVEUgVEFCTEUgZ2VuX2NvbHMgKAorICAgIGNlbnRzIGludCwKKyAg ICBkb2xsYXJzIG51bWVyaWMgR0VORVJBVEVEIEFMV0FZUyBBUyAoY2VudHMgLyAxMDAuMCkgU1RP UkVECispOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdnZW5fY29scyc6OnJlZ2Ns YXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0Lmdlbl9jb2xzICggY2VudHMgaW50ZWdlciwg ZG9sbGFycyBudW1lcmljIEdFTkVSQVRFRCBBTFdBWVMgQVMgKCgoY2VudHMpOjpudW1lcmljIC8g MTAwLjApKSBTVE9SRUQpOworKDEgcm93KQorCistLSBTVE9SQUdFIGFuZCBDT01QUkVTU0lPTiAo b25seSBlbWl0dGVkIHdoZW4gbm9uLWRlZmF1bHQgZm9yIHRoZSB0eXBlKS4KK0NSRUFURSBUQUJM RSBzdG9yYWdlX2NvbHMgKAorICAgIGEgdGV4dCBTVE9SQUdFIEVYVEVSTkFMLAorICAgIGIgdGV4 dCBTVE9SQUdFIE1BSU4sCisgICAgYyB0ZXh0IENPTVBSRVNTSU9OIHBnbHoKKyk7CitTRUxFQ1Qg KiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3N0b3JhZ2VfY29scyc6OnJlZ2NsYXNzLCAnb3duZXIn LCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5zdG9yYWdl X2NvbHMgKCBhIHRleHQgU1RPUkFHRSBFWFRFUk5BTCwgYiB0ZXh0IFNUT1JBR0UgTUFJTiwgYyB0 ZXh0IENPTVBSRVNTSU9OIHBnbHopOworKDEgcm93KQorCistLSBDb25zdHJhaW50czogQ0hFQ0ss IFVOSVFVRSwgRk9SRUlHTiBLRVkgKERFRkVSUkFCTEUpLgorQ1JFQVRFIFRBQkxFIHJlZmQgKGlk IGludCBQUklNQVJZIEtFWSk7CitDUkVBVEUgVEFCTEUgY29ucyAoCisgICAgYSBpbnQgQ0hFQ0sg KGEgPiAwKSwKKyAgICBiIGludCBVTklRVUUsCisgICAgYyBpbnQgUkVGRVJFTkNFUyByZWZkKGlk KSBERUZFUlJBQkxFIElOSVRJQUxMWSBERUZFUlJFRAorKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0 X3RhYmxlX2RkbCgnY29ucyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFi bGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuY29ucyAo IGEgaW50ZWdlciwgYiBpbnRlZ2VyLCBjIGludGVnZXIsIENPTlNUUkFJTlQgY29uc19hX2NoZWNr IENIRUNLICgoYSA+IDApKSk7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuY29ucyBBREQg Q09OU1RSQUlOVCBjb25zX2Jfa2V5IFVOSVFVRSAoYik7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRs X3Rlc3QuY29ucyBBREQgQ09OU1RSQUlOVCBjb25zX2NfZmtleSBGT1JFSUdOIEtFWSAoYykgUkVG RVJFTkNFUyByZWZkKGlkKSBERUZFUlJBQkxFIElOSVRJQUxMWSBERUZFUlJFRDsKKygzIHJvd3Mp CisKKy0tIEluZGV4ZXM6IGZ1bmN0aW9uYWwgYW5kIHBhcnRpYWwuICBDb25zdHJhaW50LWJhY2tp bmcgaW5kZXhlcyBhcmUKKy0tIHN1cHByZXNzZWQgKHRoZXkgYXJlIGVtaXR0ZWQgYnkgdGhlIGNv bnN0cmFpbnQgbG9vcCkuCitDUkVBVEUgVEFCTEUgaWR4ZCAoaWQgaW50IFBSSU1BUlkgS0VZLCBu YW1lIHRleHQpOworQ1JFQVRFIElOREVYIGlkeGRfbG93ZXIgT04gaWR4ZCAobG93ZXIobmFtZSkp OworQ1JFQVRFIElOREVYIGlkeGRfcGFydGlhbCBPTiBpZHhkIChpZCkgV0hFUkUgaWQgPiAxMDA7 CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2lkeGQnOjpyZWdjbGFzcywgJ293bmVy JywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3Rh YmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LmlkeGQgKCBpZCBp bnRlZ2VyIE5PVCBOVUxMLCBuYW1lIHRleHQpOworIENSRUFURSBJTkRFWCBpZHhkX2xvd2VyIE9O IHBndGJsX2RkbF90ZXN0LmlkeGQgVVNJTkcgYnRyZWUgKGxvd2VyKG5hbWUpKTsKKyBDUkVBVEUg SU5ERVggaWR4ZF9wYXJ0aWFsIE9OIHBndGJsX2RkbF90ZXN0LmlkeGQgVVNJTkcgYnRyZWUgKGlk KSBXSEVSRSAoaWQgPiAxMDApOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LmlkeGQgQURE IENPTlNUUkFJTlQgaWR4ZF9pZF9ub3RfbnVsbCBOT1QgTlVMTCBpZDsKKyBBTFRFUiBUQUJMRSBw Z3RibF9kZGxfdGVzdC5pZHhkIEFERCBDT05TVFJBSU5UIGlkeGRfcGtleSBQUklNQVJZIEtFWSAo aWQpOworKDUgcm93cykKKworLS0gSW5oZXJpdGFuY2UsIGluY2x1ZGluZyBhIGNoaWxkIERFRkFV TFQgb3ZlcnJpZGUgb24gYW4gaW5oZXJpdGVkIGNvbHVtbi4KK0NSRUFURSBUQUJMRSBwYXIgKGEg aW50IERFRkFVTFQgMSwgYiB0ZXh0KTsKK0NSRUFURSBUQUJMRSBjaCAoYyBpbnQpIElOSEVSSVRT IChwYXIpOworQUxURVIgVEFCTEUgY2ggQUxURVIgQ09MVU1OIGEgU0VUIERFRkFVTFQgOTk5Owor U0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdjaCc6OnJlZ2NsYXNzLCAnb3duZXInLCAn ZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVB VEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuY2ggKCBjIGludGVnZXIpIElOSEVSSVRTIChwZ3RibF9k ZGxfdGVzdC5wYXIpOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LmNoIEFMVEVSIENPTFVN TiBhIFNFVCBERUZBVUxUIDk5OTsKKygyIHJvd3MpCisKKy0tIFBlci1jb2x1bW4gYXR0b3B0aW9u czogZW1pdHRlZCBhcyBBTFRFUiBDT0xVTU4gU0VUICguLi4pLgorQ1JFQVRFIFRBQkxFIGF0dG9w dCAoYSBpbnQsIGIgdGV4dCk7CitBTFRFUiBUQUJMRSBhdHRvcHQgQUxURVIgQ09MVU1OIGEgU0VU IChuX2Rpc3RpbmN0ID0gMTAwKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnYXR0 b3B0Jzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LmF0dG9wdCAoIGEg aW50ZWdlciwgYiB0ZXh0KTsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5hdHRvcHQgQUxU RVIgQ09MVU1OIGEgU0VUIChuX2Rpc3RpbmN0PScxMDAnKTsKKygyIHJvd3MpCisKKy0tIFBhcnRp dGlvbmVkIHRhYmxlIHBhcmVudCAoUkFOR0UgYW5kIEhBU0gpLgorQ1JFQVRFIFRBQkxFIHBhcnRl ZF9yYW5nZSAoaWQgaW50LCBrIGludCkgUEFSVElUSU9OIEJZIFJBTkdFIChpZCk7CitTRUxFQ1Qg KiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3BhcnRlZF9yYW5nZSc6OnJlZ2NsYXNzLCAnb3duZXIn LCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0 X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVz dC5wYXJ0ZWRfcmFuZ2UgKCBpZCBpbnRlZ2VyLCBrIGludGVnZXIpIFBBUlRJVElPTiBCWSBSQU5H RSAoaWQpOworKDEgcm93KQorCitDUkVBVEUgVEFCTEUgcGFydGVkX2hhc2ggKGlkIGludCkgUEFS VElUSU9OIEJZIEhBU0ggKGlkKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncGFy dGVkX2hhc2gnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90 ZXN0LnBhcnRlZF9oYXNoICggaWQgaW50ZWdlcikgUEFSVElUSU9OIEJZIEhBU0ggKGlkKTsKKygx IHJvdykKKworLS0gUGFydGl0aW9uIGNoaWxkcmVuOiBGUk9NL1RPLCBXSVRIIChtb2R1bHVzLCBy ZW1haW5kZXIpLCBERUZBVUxULgorQ1JFQVRFIFRBQkxFIHBhcnRlZF9yYW5nZV8xIFBBUlRJVElP TiBPRiBwYXJ0ZWRfcmFuZ2UKKyAgICBGT1IgVkFMVUVTIEZST00gKDApIFRPICgxMDApOworQUxU RVIgVEFCTEUgcGFydGVkX3JhbmdlXzEgQUxURVIgQ09MVU1OIGsgU0VUIERFRkFVTFQgNzsKK1NF TEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncGFydGVkX3JhbmdlXzEnOjpyZWdjbGFzcywg J293bmVyJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LnBh cnRlZF9yYW5nZV8xIFBBUlRJVElPTiBPRiBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRfcmFuZ2UgRk9S IFZBTFVFUyBGUk9NICgwKSBUTyAoMTAwKTsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5w YXJ0ZWRfcmFuZ2VfMSBBTFRFUiBDT0xVTU4gayBTRVQgREVGQVVMVCA3OworKDIgcm93cykKKwor Q1JFQVRFIFRBQkxFIHBhcnRlZF9oYXNoXzAgUEFSVElUSU9OIE9GIHBhcnRlZF9oYXNoCisgICAg Rk9SIFZBTFVFUyBXSVRIIChtb2R1bHVzIDIsIHJlbWFpbmRlciAwKTsKK1NFTEVDVCAqIEZST00g cGdfZ2V0X3RhYmxlX2RkbCgncGFydGVkX2hhc2hfMCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFs c2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxf dGVzdC5wYXJ0ZWRfaGFzaF8wIFBBUlRJVElPTiBPRiBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRfaGFz aCBGT1IgVkFMVUVTIFdJVEggKG1vZHVsdXMgMiwgcmVtYWluZGVyIDApOworKDEgcm93KQorCitD UkVBVEUgVEFCTEUgcGFydGVkX3JhbmdlX2RlZiBQQVJUSVRJT04gT0YgcGFydGVkX3JhbmdlIERF RkFVTFQ7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3BhcnRlZF9yYW5nZV9kZWYn OjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor IENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRfcmFuZ2VfZGVmIFBBUlRJVElPTiBP RiBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRfcmFuZ2UgREVGQVVMVDsKKygxIHJvdykKKworLS0gUnVs ZXMuCitDUkVBVEUgVEFCTEUgcnQgKGlkIGludCk7CitDUkVBVEUgVEFCTEUgcnRfbG9nIChpZCBp bnQpOworQ1JFQVRFIFJVTEUgcnRfbG9nX2luc2VydCBBUyBPTiBJTlNFUlQgVE8gcnQKKyAgICBE TyBBTFNPIElOU0VSVCBJTlRPIHJ0X2xvZyBWQUxVRVMgKE5FVy5pZCk7CitTRUxFQ1QgKiBGUk9N IHBnX2dldF90YWJsZV9kZGwoJ3J0Jzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworICAg ICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAg ICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5ydCAoIGlkIGludGVn ZXIpOworIENSRUFURSBSVUxFIHJ0X2xvZ19pbnNlcnQgQVMgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKworICAgICBPTiBJTlNFUlQgVE8gcGd0YmxfZGRsX3Rlc3QucnQgRE8gIElO U0VSVCBJTlRPIHJ0X2xvZyAoaWQpKworICAgVkFMVUVTIChuZXcuaWQpOworKDIgcm93cykKKwor LS0gRXh0ZW5kZWQgc3RhdGlzdGljcy4KK0NSRUFURSBUQUJMRSBzdHggKGEgaW50LCBiIGludCwg YyBpbnQpOworQ1JFQVRFIFNUQVRJU1RJQ1Mgc3R4X25kdiAobmRpc3RpbmN0KSBPTiBhLCBiIEZS T00gc3R4OworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdzdHgnOjpyZWdjbGFzcywg J293bmVyJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3Rh YmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENS RUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5zdHggKCBhIGludGVnZXIsIGIgaW50ZWdlciwgYyBp bnRlZ2VyKTsKKyBDUkVBVEUgU1RBVElTVElDUyBwZ3RibF9kZGxfdGVzdC5zdHhfbmR2IChuZGlz dGluY3QpIE9OIGEsIGIgRlJPTSBzdHg7CisoMiByb3dzKQorCistLSBSb3ctbGV2ZWwgc2VjdXJp dHkgdG9nZ2xlcy4KK0NSRUFURSBUQUJMRSBybHMgKGlkIGludCk7CitBTFRFUiBUQUJMRSBybHMg RU5BQkxFIFJPVyBMRVZFTCBTRUNVUklUWTsKK0FMVEVSIFRBQkxFIHJscyBGT1JDRSBST1cgTEVW RUwgU0VDVVJJVFk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3Jscyc6OnJlZ2Ns YXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgIHBnX2dldF90YWJs ZV9kZGwgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxf dGVzdC5ybHMgKCBpZCBpbnRlZ2VyKTsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5ybHMg RU5BQkxFIFJPVyBMRVZFTCBTRUNVUklUWTsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5y bHMgRk9SQ0UgUk9XIExFVkVMIFNFQ1VSSVRZOworKDMgcm93cykKKworLS0gUkVQTElDQSBJREVO VElUWTogZW1pdHRlZCBvbmx5IHdoZW4gbm90IHRoZSBkZWZhdWx0LgorQ1JFQVRFIFRBQkxFIHJp X2Z1bGwgKGEgaW50KTsKK0FMVEVSIFRBQkxFIHJpX2Z1bGwgUkVQTElDQSBJREVOVElUWSBGVUxM OworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdyaV9mdWxsJzo6cmVnY2xhc3MsICdv d25lcicsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAg ICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LnJp X2Z1bGwgKCBhIGludGVnZXIpOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LnJpX2Z1bGwg UkVQTElDQSBJREVOVElUWSBGVUxMOworKDIgcm93cykKKworQ1JFQVRFIFRBQkxFIHJpX2lkeCAo YSBpbnQgTk9UIE5VTEwpOworQ1JFQVRFIFVOSVFVRSBJTkRFWCByaV9pZHhfYSBPTiByaV9pZHgg KGEpOworQUxURVIgVEFCTEUgcmlfaWR4IFJFUExJQ0EgSURFTlRJVFkgVVNJTkcgSU5ERVggcmlf aWR4X2E7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3JpX2lkeCc6OnJlZ2NsYXNz LCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdf Z2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5yaV9pZHggKCBhIGlu dGVnZXIgTk9UIE5VTEwpOworIENSRUFURSBVTklRVUUgSU5ERVggcmlfaWR4X2EgT04gcGd0Ymxf ZGRsX3Rlc3QucmlfaWR4IFVTSU5HIGJ0cmVlIChhKTsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxf dGVzdC5yaV9pZHggQUREIENPTlNUUkFJTlQgcmlfaWR4X2Ffbm90X251bGwgTk9UIE5VTEwgYTsK KyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5yaV9pZHggUkVQTElDQSBJREVOVElUWSBVU0lO RyBJTkRFWCByaV9pZHhfYTsKKyg0IHJvd3MpCisKKy0tIFVOTE9HR0VEICsgcmVsb3B0aW9ucy4K K0NSRUFURSBVTkxPR0dFRCBUQUJMRSB1bm8gKGlkIGludCkgV0lUSCAoZmlsbGZhY3RvciA9IDcw KTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgndW5vJzo6cmVnY2xhc3MsICdvd25l cicsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFi bGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgQ1JFQVRFIFVOTE9HR0VEIFRBQkxFIHBndGJsX2RkbF90ZXN0LnVubyAoIGlkIGlu dGVnZXIpIFdJVEggKGZpbGxmYWN0b3I9JzcwJyk7CisoMSByb3cpCisKKy0tIFR5cGVkIHRhYmxl IChDUkVBVEUgVEFCTEUgT0YgdHlwZV9uYW1lKS4gIENvbHVtbnMgaW5oZXJpdGVkIGZyb20gdGhl CistLSB0eXBlIGVtaXQgbm90aGluZzsgbG9jYWxseS1hcHBsaWVkIERFRkFVTFQsIE5PVCBOVUxM IGFuZCBDSEVDSyBjb21lCistLSBvdXQgdGhyb3VnaCBhIHNpbmdsZSAiKGNvbCBXSVRIIE9QVElP TlMgLi4uKSIgbGlzdC4KK0NSRUFURSBUWVBFIHR5cGVkX3QgQVMgKGEgaW50LCBiIHRleHQpOwor Q1JFQVRFIFRBQkxFIHR5cGVkX3BsYWluIE9GIHR5cGVkX3Q7CitTRUxFQ1QgKiBGUk9NIHBnX2dl dF90YWJsZV9kZGwoJ3R5cGVkX3BsYWluJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOwor ICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAg ICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LnR5 cGVkX3BsYWluIE9GIHBndGJsX2RkbF90ZXN0LnR5cGVkX3Q7CisoMSByb3cpCisKK0NSRUFURSBU QUJMRSB0eXBlZF9vdmVyIE9GIHR5cGVkX3QgKAorICAgIGEgV0lUSCBPUFRJT05TIERFRkFVTFQg NyBOT1QgTlVMTCwKKyAgICBiIFdJVEggT1BUSU9OUyBOT1QgTlVMTCwKKyAgICBDT05TVFJBSU5U IGJfbm9uZW1wdHkgQ0hFQ0sgKGxlbmd0aChiKSA+IDApCispOworU0VMRUNUICogRlJPTSBwZ19n ZXRfdGFibGVfZGRsKCd0eXBlZF9vdmVyJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOwor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LnR5cGVkX292ZXIgT0Yg cGd0YmxfZGRsX3Rlc3QudHlwZWRfdCAoIGEgV0lUSCBPUFRJT05TIERFRkFVTFQgNyBOT1QgTlVM TCwgYiBXSVRIIE9QVElPTlMgTk9UIE5VTEwsIENPTlNUUkFJTlQgYl9ub25lbXB0eSBDSEVDSyAo KGxlbmd0aChiKSA+IDApKSk7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QudHlwZWRfb3Zl ciBBREQgQ09OU1RSQUlOVCB0eXBlZF9vdmVyX2Ffbm90X251bGwgTk9UIE5VTEwgYTsKKyBBTFRF UiBUQUJMRSBwZ3RibF9kZGxfdGVzdC50eXBlZF9vdmVyIEFERCBDT05TVFJBSU5UIHR5cGVkX292 ZXJfYl9ub3RfbnVsbCBOT1QgTlVMTCBiOworKDMgcm93cykKKworLS0gVGVtcG9yYXJ5IHRhYmxl cyArIE9OIENPTU1JVC4gIFRlbXAgdGFibGVzIGxpdmUgaW4gYSBzZXNzaW9uLWxvY2FsCistLSBu YW1lc3BhY2Ugd2hvc2UgbmFtZSB2YXJpZXMgYmV0d2VlbiBydW5zLCBzbyB3ZSBzdHJpcCB0aGUg c2NoZW1hCistLSBwcmVmaXguICBPTiBDT01NSVQgRFJPUCBvbmx5IGZpcmVzIGF0IGNvbW1pdCwg c28gdGhlIHF1ZXJpZXMgdGhhdAorLS0gbmVlZCB0byBzZWUgdGhlIGNhdGFsb2cgZW50cnkgbXVz dCBydW4gaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24gYXMKKy0tIHRoZSBDUkVBVEUuCitCRUdJTjsK K0NSRUFURSBURU1QIFRBQkxFIHRlbXBfZGVmYXVsdCAoaWQgaW50KTsKK0NSRUFURSBURU1QIFRB QkxFIHRlbXBfZGVsZXRlIChpZCBpbnQpIE9OIENPTU1JVCBERUxFVEUgUk9XUzsKK0NSRUFURSBU RU1QIFRBQkxFIHRlbXBfZHJvcCAoaWQgaW50KSBPTiBDT01NSVQgRFJPUDsKK1NFTEVDVCByZWdl eHBfcmVwbGFjZShsaW5lLCAnIj9wZ190ZW1wXz9bMC05XSsiP1wuJywgJ3BnX3RlbXAuJykgQVMg bGluZQorRlJPTSBwZ19nZXRfdGFibGVfZGRsKCd0ZW1wX2RlZmF1bHQnOjpyZWdjbGFzcywgJ293 bmVyJywgJ2ZhbHNlJykgQVMgbGluZQorV0hFUkUgbGluZSBMSUtFICdDUkVBVEUgJSc7CisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorIENSRUFURSBURU1QT1JBUlkgVEFCTEUgcGdfdGVtcC50ZW1wX2RlZmF1bHQgKCBpZCBp bnRlZ2VyKTsKKygxIHJvdykKKworU0VMRUNUIHJlZ2V4cF9yZXBsYWNlKGxpbmUsICciP3BnX3Rl bXBfP1swLTldKyI/XC4nLCAncGdfdGVtcC4nKSBBUyBsaW5lCitGUk9NIHBnX2dldF90YWJsZV9k ZGwoJ3RlbXBfZGVsZXRlJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpIEFTIGxpbmUKK1dI RVJFIGxpbmUgTElLRSAnQ1JFQVRFICUnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEVNUE9SQVJZIFRBQkxFIHBnX3RlbXAudGVt cF9kZWxldGUgKCBpZCBpbnRlZ2VyKSBPTiBDT01NSVQgREVMRVRFIFJPV1M7CisoMSByb3cpCisK K1NFTEVDVCByZWdleHBfcmVwbGFjZShsaW5lLCAnIj9wZ190ZW1wXz9bMC05XSsiP1wuJywgJ3Bn X3RlbXAuJykgQVMgbGluZQorRlJPTSBwZ19nZXRfdGFibGVfZGRsKCd0ZW1wX2Ryb3AnOjpyZWdj bGFzcywgJ293bmVyJywgJ2ZhbHNlJykgQVMgbGluZQorV0hFUkUgbGluZSBMSUtFICdDUkVBVEUg JSc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBURU1QT1JBUlkg VEFCTEUgcGdfdGVtcC50ZW1wX2Ryb3AgKCBpZCBpbnRlZ2VyKSBPTiBDT01NSVQgRFJPUDsKKygx IHJvdykKKworUk9MTEJBQ0s7CistLSBQcmV0dHkgbW9kZS4KK1NFTEVDVCAqIEZST00gcGdfZ2V0 X3RhYmxlX2RkbCgnYmFzaWMnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywgJ3ByZXR0eScs ICd0cnVlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxl X2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5iYXNpYyAoICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArCisgICAgIGlkIGludGVnZXIg Tk9UIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICsKKyAgICAgbmFtZSB0ZXh0IENPTExBVEUgIkMiIERFRkFVTFQgJ2Fub24nOjp0 ZXh0IE5PVCBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgKworICk7CisgQUxURVIgVEFC TEUgcGd0YmxfZGRsX3Rlc3QuYmFzaWMgQUREIENPTlNUUkFJTlQgYmFzaWNfaWRfbm90X251bGwg Tk9UIE5VTEwgaWQ7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuYmFzaWMgQUREIENPTlNU UkFJTlQgYmFzaWNfbmFtZV9ub3RfbnVsbCBOT1QgTlVMTCBuYW1lOworIEFMVEVSIFRBQkxFIHBn dGJsX2RkbF90ZXN0LmJhc2ljIEFERCBDT05TVFJBSU5UIGJhc2ljX3BrZXkgUFJJTUFSWSBLRVkg KGlkKTsKKyg0IHJvd3MpCisKKy0tIGluY2x1ZGVzXyogZ2F0aW5nOiBlYWNoIHN1Yi1vYmplY3Qg Y2F0ZWdvcnkgY2FuIGJlIHN1cHByZXNzZWQgaW5kaXZpZHVhbGx5LgorLS0gaW5jbHVkZXNfaW5k ZXhlcz1mYWxzZSBoaWRlcyB0aGUgQ1JFQVRFIElOREVYIHN0YXRlbWVudHMuCitTRUxFQ1QgKiBG Uk9NIHBnX2dldF90YWJsZV9kZGwoJ2lkeGQnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZXNfaW5kZXhlcycsICdmYWxz ZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVB VEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuaWR4ZCAoIGlkIGludGVnZXIgTk9UIE5VTEwsIG5hbWUg dGV4dCk7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuaWR4ZCBBREQgQ09OU1RSQUlOVCBp ZHhkX2lkX25vdF9udWxsIE5PVCBOVUxMIGlkOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0 LmlkeGQgQUREIENPTlNUUkFJTlQgaWR4ZF9wa2V5IFBSSU1BUlkgS0VZIChpZCk7CisoMyByb3dz KQorCistLSBpbmNsdWRlc19jb25zdHJhaW50cz1mYWxzZSBoaWRlcyBib3RoIGlubGluZSBDSEVD SyBpbiBDUkVBVEUgVEFCTEUgYW5kCistLSB0aGUgQUxURVIgVEFCTEUgLi4uIEFERCBDT05TVFJB SU5UIGxpbmVzLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdjb25zJzo6cmVnY2xh c3MsICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lu Y2x1ZGVzX2NvbnN0cmFpbnRzJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAg ICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LmNvbnMgKCBhIGludGVnZXIsIGIgaW50 ZWdlciwgYyBpbnRlZ2VyKTsKKygxIHJvdykKKworLS0gaW5jbHVkZXNfcnVsZXM9ZmFsc2UgaGlk ZXMgdGhlIENSRUFURSBSVUxFLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdydCc6 OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICdpbmNsdWRlc19ydWxlcycsICdmYWxzZScpOworICAgICAgICAgICAgICAgcGdfZ2V0X3Rh YmxlX2RkbCAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LnJ0ICggaWQgaW50 ZWdlcik7CisoMSByb3cpCisKKy0tIGluY2x1ZGVzX3N0YXRpc3RpY3M9ZmFsc2UgaGlkZXMgdGhl IENSRUFURSBTVEFUSVNUSUNTLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdzdHgn OjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAnaW5jbHVkZXNfc3RhdGlzdGljcycsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAg ICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3Quc3R4ICggYSBpbnRlZ2VyLCBi IGludGVnZXIsIGMgaW50ZWdlcik7CisoMSByb3cpCisKKy0tIGluY2x1ZGVzX3Jscz1mYWxzZSBo aWRlcyB0aGUgRU5BQkxFL0ZPUkNFIFJPVyBMRVZFTCBTRUNVUklUWSB0b2dnbGVzLgorU0VMRUNU ICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdybHMnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNl JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZXNfcmxzJywgJ2ZhbHNl Jyk7CisgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBU QUJMRSBwZ3RibF9kZGxfdGVzdC5ybHMgKCBpZCBpbnRlZ2VyKTsKKygxIHJvdykKKworLS0gaW5j bHVkZXNfcmVwbGljYV9pZGVudGl0eT1mYWxzZSBoaWRlcyB0aGUgUkVQTElDQSBJREVOVElUWSBj bGF1c2UuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3JpX2Z1bGwnOjpyZWdjbGFz cywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5j bHVkZXNfcmVwbGljYV9pZGVudGl0eScsICdmYWxzZScpOworICAgICAgICAgICAgICAgICBwZ19n ZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3Qu cmlfZnVsbCAoIGEgaW50ZWdlcik7CisoMSByb3cpCisKKy0tIGluY2x1ZGVzX3BhcnRpdGlvbjog ZGVmYXVsdCBpcyBmYWxzZSwgc28gdGhlIHBhcnRpdGlvbmVkLXRhYmxlIHBhcmVudAorLS0gRERM IG9uIGl0cyBvd24gZG9lcyBub3QgaW5jbHVkZSBpdHMgY2hpbGRyZW4uICBTZXR0aW5nIGl0IHRv IHRydWUKKy0tIGFwcGVuZHMgdGhlIGNoaWxkcmVuJ3MgRERMIGFmdGVyIHRoZSBwYXJlbnQuCitT RUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3BhcnRlZF9yYW5nZSc6OnJlZ2NsYXNzLCAn b3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRl c19wYXJ0aXRpb24nLCAndHJ1ZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVz dC5wYXJ0ZWRfcmFuZ2UgKCBpZCBpbnRlZ2VyLCBrIGludGVnZXIpIFBBUlRJVElPTiBCWSBSQU5H RSAoaWQpOworIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRfcmFuZ2VfMSBQQVJU SVRJT04gT0YgcGd0YmxfZGRsX3Rlc3QucGFydGVkX3JhbmdlIEZPUiBWQUxVRVMgRlJPTSAoMCkg VE8gKDEwMCk7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QucGFydGVkX3JhbmdlXzEgQUxU RVIgQ09MVU1OIGsgU0VUIERFRkFVTFQgNzsKKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3Qu cGFydGVkX3JhbmdlX2RlZiBQQVJUSVRJT04gT0YgcGd0YmxfZGRsX3Rlc3QucGFydGVkX3Jhbmdl IERFRkFVTFQ7CisoNCByb3dzKQorCistLSBzY2hlbWFfcXVhbGlmaWVkPWZhbHNlIHN0cmlwcyB0 aGUgc2NoZW1hIGZyb20gdGhlIHRhcmdldCB0YWJsZSBpdHNlbGYKKy0tIGFuZCBmcm9tIHNhbWUt c2NoZW1hIHNpYmxpbmcgcmVmZXJlbmNlcyAoaW5oZXJpdGFuY2UvcGFydGl0aW9uCistLSBwYXJl bnRzLCBpZGVudGl0eSBzZXF1ZW5jZXMgaW4gdGhlIHNhbWUgc2NoZW1hKSwgd2hpbGUgY3Jvc3Mt c2NoZW1hCistLSByZWZlcmVuY2VzIGFyZSBrZXB0IHF1YWxpZmllZCBmb3IgY29ycmVjdG5lc3Mu CistLQorLS0gQmFyZSBDUkVBVEUgVEFCTEUgZm9yIGFuIG9yZGluYXJ5IHRhYmxlLgorU0VMRUNU ICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdiYXNpYyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFs c2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY2hlbWFfcXVhbGlmaWVkJywg J2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0 X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIGJhc2lj ICggaWQgaW50ZWdlciBOT1QgTlVMTCwgbmFtZSB0ZXh0IENPTExBVEUgIkMiIERFRkFVTFQgJ2Fu b24nOjp0ZXh0IE5PVCBOVUxMKTsKKyBBTFRFUiBUQUJMRSBiYXNpYyBBREQgQ09OU1RSQUlOVCBi YXNpY19pZF9ub3RfbnVsbCBOT1QgTlVMTCBpZDsKKyBBTFRFUiBUQUJMRSBiYXNpYyBBREQgQ09O U1RSQUlOVCBiYXNpY19uYW1lX25vdF9udWxsIE5PVCBOVUxMIG5hbWU7CisgQUxURVIgVEFCTEUg YmFzaWMgQUREIENPTlNUUkFJTlQgYmFzaWNfcGtleSBQUklNQVJZIEtFWSAoaWQpOworKDQgcm93 cykKKworLS0gSU5IRVJJVFMgcGFyZW50IGluIHRoZSBzYW1lIHNjaGVtYSBpcyBlbWl0dGVkIHVu cXVhbGlmaWVkLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdjaCc6OnJlZ2NsYXNz LCAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY2hl bWFfcXVhbGlmaWVkJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2Rk bCAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBjaCAoIGMgaW50ZWdlcikgSU5IRVJJVFMgKHBhcik7 CisgQUxURVIgVEFCTEUgY2ggQUxURVIgQ09MVU1OIGEgU0VUIERFRkFVTFQgOTk5OworKDIgcm93 cykKKworLS0gUGFydGl0aW9uIHBhcmVudCBpbiB0aGUgc2FtZSBzY2hlbWEgaXMgZW1pdHRlZCB1 bnF1YWxpZmllZC4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncGFydGVkX3Jhbmdl XzEnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAnc2NoZW1hX3F1YWxpZmllZCcsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBw YXJ0ZWRfcmFuZ2VfMSBQQVJUSVRJT04gT0YgcGFydGVkX3JhbmdlIEZPUiBWQUxVRVMgRlJPTSAo MCkgVE8gKDEwMCk7CisgQUxURVIgVEFCTEUgcGFydGVkX3JhbmdlXzEgQUxURVIgQ09MVU1OIGsg U0VUIERFRkFVTFQgNzsKKygyIHJvd3MpCisKKy0tIENyb3NzLXNjaGVtYSBGSyB0YXJnZXQga2Vl cHMgcXVhbGlmaWNhdGlvbi4gIFRoZSAncmVmZCcgdGFibGUgaXMgaW4KKy0tIHBndGJsX2RkbF90 ZXN0OyBwbGFjZSBhbiBGSyB0YXJnZXQgaW4gYSBkaWZmZXJlbnQgc2NoZW1hIGFuZCB2ZXJpZnkg aXQKKy0tIHN0YXlzIHF1YWxpZmllZCBldmVuIHdpdGggc2NoZW1hX3F1YWxpZmllZD1mYWxzZS4K K0NSRUFURSBTQ0hFTUEgcGd0YmxfZGRsX290aGVyOworQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF9v dGhlci5wYXJlbnQgKGlkIGludCBQUklNQVJZIEtFWSk7CitDUkVBVEUgVEFCTEUgeHNjaGVtYV9m ayAoCisgICAgaWQgIGludCBQUklNQVJZIEtFWSwKKyAgICBwaWQgaW50IFJFRkVSRU5DRVMgcGd0 YmxfZGRsX290aGVyLnBhcmVudAorKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgn eHNjaGVtYV9mayc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICdzY2hlbWFfcXVhbGlmaWVkJywgJ2ZhbHNlJyk7CisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBD UkVBVEUgVEFCTEUgeHNjaGVtYV9mayAoIGlkIGludGVnZXIgTk9UIE5VTEwsIHBpZCBpbnRlZ2Vy KTsKKyBBTFRFUiBUQUJMRSB4c2NoZW1hX2ZrIEFERCBDT05TVFJBSU5UIHhzY2hlbWFfZmtfaWRf bm90X251bGwgTk9UIE5VTEwgaWQ7CisgQUxURVIgVEFCTEUgeHNjaGVtYV9mayBBREQgQ09OU1RS QUlOVCB4c2NoZW1hX2ZrX3BpZF9ma2V5IEZPUkVJR04gS0VZIChwaWQpIFJFRkVSRU5DRVMgcGd0 YmxfZGRsX290aGVyLnBhcmVudChpZCk7CisgQUxURVIgVEFCTEUgeHNjaGVtYV9mayBBREQgQ09O U1RSQUlOVCB4c2NoZW1hX2ZrX3BrZXkgUFJJTUFSWSBLRVkgKGlkKTsKKyg0IHJvd3MpCisKKy0t IElkZW50aXR5IGNvbHVtbiB3aXRoIGEgY3VzdG9tIHNlcXVlbmNlIG5hbWUgaW4gdGhlIHNhbWUg c2NoZW1hIGlzCistLSBlbWl0dGVkIHVucXVhbGlmaWVkLgorU0VMRUNUICogRlJPTSBwZ19nZXRf dGFibGVfZGRsKCdpZF9jdXN0b20nOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NoZW1hX3F1YWxpZmllZCcsICdmYWxzZScpOwor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIGlkX2N1c3RvbSAoIHYgaW50ZWdlciBHRU5F UkFURUQgQUxXQVlTIEFTIElERU5USVRZIChTVEFSVCBXSVRIIDEwMCBJTkNSRU1FTlQgQlkgNSBN SU5WQUxVRSA1MCBNQVhWQUxVRSAxMDAwIENBQ0hFIDEwIENZQ0xFKSBOT1QgTlVMTCk7CisgQUxU RVIgVEFCTEUgaWRfY3VzdG9tIEFERCBDT05TVFJBSU5UIGlkX2N1c3RvbV92X25vdF9udWxsIE5P VCBOVUxMIHY7CisoMiByb3dzKQorCistLSBSb3VuZC10cmlwOiB3aXRoIHNjaGVtYV9xdWFsaWZp ZWQ9ZmFsc2UsIGFmdGVyIFNFVCBzZWFyY2hfcGF0aCB0aGUKKy0tIERETCBjYW4gYmUgcmVwbGF5 ZWQgaW50byBhIGRpZmZlcmVudCB0YXJnZXQgc2NoZW1hLgorQ1JFQVRFIFNDSEVNQSBwZ3RibF9k ZGxfcmVwbGF5OworRE8gJCQKK0RFQ0xBUkUKKyAgICBzdG10IHRleHQ7CitCRUdJTgorICAgIFNF VCBMT0NBTCBzZWFyY2hfcGF0aCA9IHBndGJsX2RkbF9yZXBsYXk7CisgICAgRk9SIHN0bXQgSU4K KyAgICAgICAgU0VMRUNUIGxpbmUgRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdwZ3RibF9kZGxfdGVz dC5iYXNpYyc6OnJlZ2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICdzY2hlbWFfcXVhbGlmaWVkJywgJ2ZhbHNlJykgQVMgbGluZQorICAgIExPT1AK KyAgICAgICAgRVhFQ1VURSBzdG10OworICAgIEVORCBMT09QOworRU5EICQkOworU0VMRUNUIHJl bG5hbWVzcGFjZTo6cmVnbmFtZXNwYWNlOjp0ZXh0LCByZWxuYW1lCitGUk9NIHBnX2NsYXNzIFdI RVJFIG9pZCA9ICdwZ3RibF9kZGxfcmVwbGF5LmJhc2ljJzo6cmVnY2xhc3M7CisgICByZWxuYW1l c3BhY2UgICB8IHJlbG5hbWUgCistLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tCisgcGd0Ymxf ZGRsX3JlcGxheSB8IGJhc2ljCisoMSByb3cpCisKK0RST1AgU0NIRU1BIHBndGJsX2RkbF9yZXBs YXkgQ0FTQ0FERTsKK05PVElDRTogIGRyb3AgY2FzY2FkZXMgdG8gdGFibGUgcGd0YmxfZGRsX3Jl cGxheS5iYXNpYworRFJPUCBUQUJMRSB4c2NoZW1hX2ZrOworRFJPUCBTQ0hFTUEgcGd0YmxfZGRs X290aGVyIENBU0NBREU7CitOT1RJQ0U6ICBkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHBndGJsX2Rk bF9vdGhlci5wYXJlbnQKKy0tIExvY2FsbHktZGVjbGFyZWQgQ0hFQ0sgb24gYSBwYXJ0aXRpb24g Y2hpbGQgaGFzIG5vIGlubGluZSBjb2x1bW4KKy0tIGxpc3QgdG8gbGl2ZSBpbiAoUEFSVElUSU9O IE9GIGZvcm0pLCBzbyBpdCBtdXN0IGNvbWUgb3V0IGFzIGEKKy0tIHNlcGFyYXRlIEFMVEVSIFRB QkxFIC4uLiBBREQgQ09OU1RSQUlOVCBzdGF0ZW1lbnQuCitDUkVBVEUgVEFCTEUgcGFydGVkX2No ayAoaWQgaW50LCB2YWwgaW50KSBQQVJUSVRJT04gQlkgUkFOR0UgKGlkKTsKK0NSRUFURSBUQUJM RSBwYXJ0ZWRfY2hrX2NoaWxkIFBBUlRJVElPTiBPRiBwYXJ0ZWRfY2hrCisgICAgKENPTlNUUkFJ TlQgY2hrX2lubGluZSBDSEVDSyAodmFsID4gMCkpCisgICAgRk9SIFZBTFVFUyBGUk9NICgwKSBU TyAoMTAwKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncGFydGVkX2Noa19jaGls ZCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0 YmxfZGRsX3Rlc3QucGFydGVkX2Noa19jaGlsZCBQQVJUSVRJT04gT0YgcGd0YmxfZGRsX3Rlc3Qu cGFydGVkX2NoayBGT1IgVkFMVUVTIEZST00gKDApIFRPICgxMDApOworIEFMVEVSIFRBQkxFIHBn dGJsX2RkbF90ZXN0LnBhcnRlZF9jaGtfY2hpbGQgQUREIENPTlNUUkFJTlQgY2hrX2lubGluZSBD SEVDSyAoKHZhbCA+IDApKTsKKygyIHJvd3MpCisKK0RST1AgVEFCTEUgcGFydGVkX2NoazsKKy0t IEluaGVyaXRhbmNlIGNoaWxkcmVuIG9mIGEgcGFyZW50IHdpdGggYSBnZW5lcmF0ZWQgY29sdW1u IHNob3VsZCBub3QKKy0tIGVtaXQgYW4gQUxURVIgQ09MVU1OIC4uLiBTRVQgREVGQVVMVCBmb3Ig dGhlIGluaGVyaXRlZCBnZW5lcmF0ZWQKKy0tIGNvbHVtbjogdGhlIEdFTkVSQVRFRCBleHByZXNz aW9uIGNhcnJpZXMgZG93biB0aHJvdWdoIGluaGVyaXRhbmNlLAorLS0gYW5kIFNFVCBERUZBVUxU IHdvdWxkIGZhaWwgYXQgcmVwbGF5IGFnYWluc3QgYSBnZW5lcmF0ZWQgY29sdW1uLgorQ1JFQVRF IFRBQkxFIHBhcl9nZW4gKAorICAgIGlkIGludCwKKyAgICBnICBpbnQgR0VORVJBVEVEIEFMV0FZ UyBBUyAoaWQgKiAyKSBTVE9SRUQKKyk7CitDUkVBVEUgVEFCTEUgY2hfZ2VuICgpIElOSEVSSVRT IChwYXJfZ2VuKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnY2hfZ2VuJzo6cmVn Y2xhc3MsICdvd25lcicsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBw Z19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LmNoX2dlbiAoKSBJTkhFUklUUyAo cGd0YmxfZGRsX3Rlc3QucGFyX2dlbik7CisoMSByb3cpCisKK0RST1AgVEFCTEUgcGFyX2dlbiBD QVNDQURFOworTk9USUNFOiAgZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBjaF9nZW4KKy0tIFVzZXIt bmFtZWQgTk9UIE5VTEwgY29uc3RyYWludCBtdXN0IGJlIGVtaXR0ZWQgaW5saW5lIGFzCistLSAi Q09OU1RSQUlOVCBuYW1lIE5PVCBOVUxMIiBzbyBhIHJlcGxheSBkb2VzIG5vdCBjb2xsaWRlIHdp dGggdGhlCistLSBhdXRvLW5hbWVkIE5PVCBOVUxMIHRoYXQgUG9zdGdyZVNRTCB3b3VsZCBvdGhl cndpc2UgY3JlYXRlIGZyb20gYQorLS0gcGxhaW4gaW5saW5lICJOT1QgTlVMTCIuICBUaGUgY29u c3RyYWludCBsb29wIHNraXBzIHRoZSB1c2VyLW5hbWVkCistLSBlbnRyeSB0byBhdm9pZCBkb3Vi bGUtZW1pc3Npb24uCitDUkVBVEUgVEFCTEUgbm5fbmFtZWQgKAorICAgIGEgaW50IENPTlNUUkFJ TlQgbXlfbm4gTk9UIE5VTEwsCisgICAgYiBpbnQgTk9UIE5VTEwKKyk7CitTRUxFQ1QgKiBGUk9N IHBnX2dldF90YWJsZV9kZGwoJ25uX25hbWVkJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScp OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVf ZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90 ZXN0Lm5uX25hbWVkICggYSBpbnRlZ2VyIENPTlNUUkFJTlQgbXlfbm4gTk9UIE5VTEwsIGIgaW50 ZWdlciBOT1QgTlVMTCk7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3Qubm5fbmFtZWQgQURE IENPTlNUUkFJTlQgbm5fbmFtZWRfYl9ub3RfbnVsbCBOT1QgTlVMTCBiOworKDIgcm93cykKKwor RFJPUCBUQUJMRSBubl9uYW1lZDsKKy0tIExvY2FsbHktZGVjbGFyZWQgTk9UIE5VTEwgb24gYW4g aW5oZXJpdGVkIGNvbHVtbi4gIFRoZSBjb2x1bW4gaXRzZWxmCistLSBpcyBvbWl0dGVkIGZyb20g dGhlIGNoaWxkJ3MgY29sdW1uIGxpc3QgKGF0dGlzbG9jYWw9ZmFsc2UpLCBzbyB0aGUKKy0tIHVz ZXItbmFtZWQgTk9UIE5VTEwgbXVzdCBjb21lIG91dCB2aWEgdGhlIHBvc3QtQ1JFQVRFIGNvbnN0 cmFpbnQKKy0tIGxvb3AgcmF0aGVyIHRoYW4gaW5saW5lLgorQ1JFQVRFIFRBQkxFIG5uX3BhciAo YSBpbnQpOworQ1JFQVRFIFRBQkxFIG5uX2NoIChiIGludCkgSU5IRVJJVFMgKG5uX3Bhcik7CitB TFRFUiBUQUJMRSBubl9jaCBBREQgQ09OU1RSQUlOVCBteV9ubiBOT1QgTlVMTCBhOworU0VMRUNU ICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdubl9jaCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFs c2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3Qubm5fY2ggKCBiIGludGVnZXIpIElOSEVS SVRTIChwZ3RibF9kZGxfdGVzdC5ubl9wYXIpOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0 Lm5uX2NoIEFERCBDT05TVFJBSU5UIG15X25uIE5PVCBOVUxMIGE7CisoMiByb3dzKQorCitEUk9Q IFRBQkxFIG5uX3BhciBDQVNDQURFOworTk9USUNFOiAgZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBu bl9jaAorLS0gc2NoZW1hX3F1YWxpZmllZD1mYWxzZSBtdXN0IGRyb3AgdGhlIHNjaGVtYSBwcmVm aXggZnJvbSBERUZBVUxUCistLSBleHByZXNzaW9ucyBhbmQgaW5saW5lIENIRUNLIGJvZGllcyB0 aGF0IHJlZmVyZW5jZSBzYW1lLXNjaGVtYQorLS0gb2JqZWN0cyAoc2VxdWVuY2UgdmlhIG5leHR2 YWwsIGZ1bmN0aW9uIHZpYSBkaXJlY3QgY2FsbCkuICBUaGlzCistLSByZWxpZXMgb24gdGhlIGRl cGFyc2VyIHJlc3BlY3RpbmcgdGhlIG5hcnJvd2VkIHNlYXJjaF9wYXRoIHJhdGhlcgorLS0gdGhh biBvbiBzdWJzdHJpbmcgc3RyaXBwaW5nLgorQ1JFQVRFIFNDSEVNQSBwZ3RibF9kZGxfeHJlZjsK K0NSRUFURSBTRVFVRU5DRSBwZ3RibF9kZGxfeHJlZi5teXNlcTsKK0NSRUFURSBGVU5DVElPTiBw Z3RibF9kZGxfeHJlZi5mKGludCkgUkVUVVJOUyBpbnQgTEFOR1VBR0Ugc3FsIElNTVVUQUJMRQor ICAgIEFTICdTRUxFQ1QgJDEnOworQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF94cmVmLnQgKAorICAg IGlkICBpbnQgREVGQVVMVCBuZXh0dmFsKCdwZ3RibF9kZGxfeHJlZi5teXNlcScpLAorICAgIHZh bCBpbnQsCisgICAgQ09OU1RSQUlOVCBjaGsgQ0hFQ0sgKHBndGJsX2RkbF94cmVmLmYodmFsKSA+ IDApCispOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdwZ3RibF9kZGxfeHJlZi50 Jzo6cmVnY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ293bmVyJywgJ2Zh bHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NoZW1hX3F1YWxpZmllZCcs ICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHQgKCBpZCBpbnRlZ2VyIERFRkFVTFQg bmV4dHZhbCgnbXlzZXEnOjpyZWdjbGFzcyksIHZhbCBpbnRlZ2VyLCBDT05TVFJBSU5UIGNoayBD SEVDSyAoKGYodmFsKSA+IDApKSk7CisoMSByb3cpCisKK0RST1AgU0NIRU1BIHBndGJsX2RkbF94 cmVmIENBU0NBREU7CitOT1RJQ0U6ICBkcm9wIGNhc2NhZGVzIHRvIDMgb3RoZXIgb2JqZWN0cwor REVUQUlMOiAgZHJvcCBjYXNjYWRlcyB0byBzZXF1ZW5jZSBwZ3RibF9kZGxfeHJlZi5teXNlcQor ZHJvcCBjYXNjYWRlcyB0byBmdW5jdGlvbiBwZ3RibF9kZGxfeHJlZi5mKGludGVnZXIpCitkcm9w IGNhc2NhZGVzIHRvIHRhYmxlIHBndGJsX2RkbF94cmVmLnQKKy0tIHNjaGVtYV9xdWFsaWZpZWQ9 ZmFsc2UgbXVzdCBOT1QgY29ycnVwdCBzdHJpbmcgbGl0ZXJhbHMgd2hvc2UKKy0tIGNvbnRlbnRz IGhhcHBlbiB0byBjb250YWluIHRoZSBzY2hlbWEgbmFtZSBmb2xsb3dlZCBieSBhIGRvdC4gIFRo ZQorLS0gaW4tc3RyaW5nIHN0YXRlIG9mIHRoZSBwcmVmaXggc3RyaXBwZXIgcHJlc2VydmVzIHRo ZW0gdmVyYmF0aW0uCitDUkVBVEUgU0NIRU1BIHBndGJsX2RkbF9zdHI7CitDUkVBVEUgVEFCTEUg cGd0YmxfZGRsX3N0ci5wIChpZCBpbnQsIG5vdGUgdGV4dCkgUEFSVElUSU9OIEJZIFJBTkdFIChp ZCk7CitDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3N0ci5wYyBQQVJUSVRJT04gT0YgcGd0YmxfZGRs X3N0ci5wCisgICAgKENPTlNUUkFJTlQgY2hrIENIRUNLIChub3RlIDw+ICdwZ3RibF9kZGxfc3Ry LnNlY3JldCcpKQorICAgIEZPUiBWQUxVRVMgRlJPTSAoMCkgVE8gKDEwMCk7CitTRUxFQ1QgKiBG Uk9NIHBnX2dldF90YWJsZV9kZGwoJ3BndGJsX2RkbF9zdHIucGMnOjpyZWdjbGFzcywKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICdzY2hlbWFfcXVhbGlmaWVkJywgJ2ZhbHNlJyk7CisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUg VEFCTEUgcGMgUEFSVElUSU9OIE9GIHAgRk9SIFZBTFVFUyBGUk9NICgwKSBUTyAoMTAwKTsKKyBB TFRFUiBUQUJMRSBwYyBBREQgQ09OU1RSQUlOVCBjaGsgQ0hFQ0sgKChub3RlIDw+ICdwZ3RibF9k ZGxfc3RyLnNlY3JldCc6OnRleHQpKTsKKygyIHJvd3MpCisKK0RST1AgU0NIRU1BIHBndGJsX2Rk bF9zdHIgQ0FTQ0FERTsKK05PVElDRTogIGRyb3AgY2FzY2FkZXMgdG8gdGFibGUgcGd0YmxfZGRs X3N0ci5wCistLSBFcnJvcjogbm90IGFuIG9yZGluYXJ5IG9yIHBhcnRpdGlvbmVkIHRhYmxlLgor Q1JFQVRFIFZJRVcgdiBBUyBTRUxFQ1QgMSBBUyB4OworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFi bGVfZGRsKCd2Jzo6cmVnY2xhc3MpOworRVJST1I6ICAidiIgaXMgbm90IGFuIG9yZGluYXJ5IG9y IHBhcnRpdGlvbmVkIHRhYmxlCitDUkVBVEUgU0VRVUVOQ0UgczsKK1NFTEVDVCAqIEZST00gcGdf Z2V0X3RhYmxlX2RkbCgncyc6OnJlZ2NsYXNzKTsKK0VSUk9SOiAgInMiIGlzIG5vdCBhbiBvcmRp bmFyeSBvciBwYXJ0aXRpb25lZCB0YWJsZQorLS0gTlVMTCBhcmd1bWVudCByZXR1cm5zIG5vIHJv d3MuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoTlVMTCk7CisgcGdfZ2V0X3RhYmxl X2RkbCAKKy0tLS0tLS0tLS0tLS0tLS0tLQorKDAgcm93cykKKworLS0gVW5yZWNvZ25pemVkIG9w dGlvbi4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnYmFzaWMnOjpyZWdjbGFzcywg J2JvZ3VzJywgJ3RydWUnKTsKK0VSUk9SOiAgdW5yZWNvZ25pemVkIG9wdGlvbjogImJvZ3VzIgor LS0gT2RkIG51bWJlciBvZiB2YXJpYWRpYyBhcmdzLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFi bGVfZGRsKCdiYXNpYyc6OnJlZ2NsYXNzLCAncHJldHR5Jyk7CitFUlJPUjogIHZhcmlhZGljIGFy Z3VtZW50cyBtdXN0IGJlIG5hbWUvdmFsdWUgcGFpcnMKK0hJTlQ6ICBQcm92aWRlIGFuIGV2ZW4g bnVtYmVyIG9mIHZhcmlhZGljIGFyZ3VtZW50cyB0aGF0IGNhbiBiZSBkaXZpZGVkIGludG8gcGFp cnMuCistLSBSb3VuZC10cmlwIHZlcmlmaWNhdGlvbi4gIEZvciBldmVyeSB0ZXN0IHRhYmxlLCBj YXB0dXJlIHRoZSBEREwgdGhlCistLSBmdW5jdGlvbiBlbWl0cywgZHJvcCB0aGUgc2NoZW1hLCBy ZXBsYXkgZWFjaCB0YWJsZSdzIERETCBpbgorLS0gZGVwZW5kZW5jeSBvcmRlciwgYW5kIGNvbmZp cm0gdGhhdCBwZ19nZXRfdGFibGVfZGRsIG9uIHRoZSByZWNyZWF0ZWQKKy0tIHJlbGF0aW9uIG1h dGNoZXMgdGhlIG9yaWdpbmFsIGxpbmUtZm9yLWxpbmUuICBUaGUgZmluYWwgU0VMRUNUIG11c3QK Ky0tIHJldHVybiB6ZXJvIHJvd3MuCitDUkVBVEUgVEVNUCBUQUJMRSBwZ3RibF9kZGxfcnRfb3Jp ZyAobmFtZSB0ZXh0LCBvcmQgaW50LCBsaW5lIHRleHQpOworSU5TRVJUIElOVE8gcGd0YmxfZGRs X3J0X29yaWcKK1NFTEVDVCB0Lm5hbWUsIG8ub3JkLCBvLmxpbmUKK0ZST00gKFZBTFVFUworICAg ICAgICAoJ2Jhc2ljJyksICgnaWRfY29scycpLCAoJ2lkX2N1c3RvbScpLCAoJ2dlbl9jb2xzJyks ICgnc3RvcmFnZV9jb2xzJyksCisgICAgICAgICgncmVmZCcpLCAoJ2NvbnMnKSwgKCdpZHhkJyks CisgICAgICAgICgncGFyJyksICgnY2gnKSwgKCdhdHRvcHQnKSwKKyAgICAgICAgKCdwYXJ0ZWRf cmFuZ2UnKSwgKCdwYXJ0ZWRfcmFuZ2VfMScpLCAoJ3BhcnRlZF9yYW5nZV9kZWYnKSwKKyAgICAg ICAgKCdwYXJ0ZWRfaGFzaCcpLCAoJ3BhcnRlZF9oYXNoXzAnKSwKKyAgICAgICAgKCdydF9sb2cn KSwgKCdydCcpLAorICAgICAgICAoJ3N0eCcpLCAoJ3JscycpLCAoJ3JpX2Z1bGwnKSwgKCdyaV9p ZHgnKSwgKCd1bm8nKQorICAgICApIEFTIHQobmFtZSksCisgICAgIExBVEVSQUwgcGdfZ2V0X3Rh YmxlX2RkbCgoJ3BndGJsX2RkbF90ZXN0LicgfHwgdC5uYW1lKTo6cmVnY2xhc3MsCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAnb3duZXInLCAnZmFsc2UnKSBXSVRIIE9SRElOQUxJVFkg byhsaW5lLCBvcmQpOworRE8gJCQKK0RFQ0xBUkUKKyAgICB0YWJsZXMgQ09OU1RBTlQgdGV4dFtd IDo9IEFSUkFZWworICAgICAgICAnYmFzaWMnLCAnaWRfY29scycsICdpZF9jdXN0b20nLCAnZ2Vu X2NvbHMnLCAnc3RvcmFnZV9jb2xzJywKKyAgICAgICAgJ3JlZmQnLCAnY29ucycsICdpZHhkJywK KyAgICAgICAgJ3BhcicsICdjaCcsICdhdHRvcHQnLAorICAgICAgICAncGFydGVkX3JhbmdlJywg J3BhcnRlZF9yYW5nZV8xJywgJ3BhcnRlZF9yYW5nZV9kZWYnLAorICAgICAgICAncGFydGVkX2hh c2gnLCAncGFydGVkX2hhc2hfMCcsCisgICAgICAgICdydF9sb2cnLCAncnQnLAorICAgICAgICAn c3R4JywgJ3JscycsICdyaV9mdWxsJywgJ3JpX2lkeCcsICd1bm8nCisgICAgXTsKKyAgICB0IHRl eHQ7CisgICAgc3RtdCB0ZXh0OworQkVHSU4KKyAgICBEUk9QIFNDSEVNQSBwZ3RibF9kZGxfdGVz dCBDQVNDQURFOworICAgIENSRUFURSBTQ0hFTUEgcGd0YmxfZGRsX3Rlc3Q7CisgICAgRk9SRUFD SCB0IElOIEFSUkFZIHRhYmxlcyBMT09QCisgICAgICAgIEZPUiBzdG10IElOCisgICAgICAgICAg ICBTRUxFQ1QgbGluZSBGUk9NIHBndGJsX2RkbF9ydF9vcmlnIFdIRVJFIG5hbWUgPSB0IE9SREVS IEJZIG9yZAorICAgICAgICBMT09QCisgICAgICAgICAgICBFWEVDVVRFIHN0bXQ7CisgICAgICAg IEVORCBMT09QOworICAgIEVORCBMT09QOworRU5EICQkOworTk9USUNFOiAgZHJvcCBjYXNjYWRl cyB0byAyNSBvdGhlciBvYmplY3RzCitERVRBSUw6ICBkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIGJh c2ljCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIGlkX2NvbHMKK2Ryb3AgY2FzY2FkZXMgdG8gdGFi bGUgaWRfY3VzdG9tCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIGdlbl9jb2xzCitkcm9wIGNhc2Nh ZGVzIHRvIHRhYmxlIHN0b3JhZ2VfY29scworZHJvcCBjYXNjYWRlcyB0byB0YWJsZSByZWZkCitk cm9wIGNhc2NhZGVzIHRvIHRhYmxlIGNvbnMKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgaWR4ZAor ZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBwYXIKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgY2gKK2Ry b3AgY2FzY2FkZXMgdG8gdGFibGUgYXR0b3B0Citkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHBhcnRl ZF9yYW5nZQorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBwYXJ0ZWRfaGFzaAorZHJvcCBjYXNjYWRl cyB0byB0YWJsZSBydAorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBydF9sb2cKK2Ryb3AgY2FzY2Fk ZXMgdG8gdGFibGUgc3R4Citkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHJscworZHJvcCBjYXNjYWRl cyB0byB0YWJsZSByaV9mdWxsCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHJpX2lkeAorZHJvcCBj YXNjYWRlcyB0byB0YWJsZSB1bm8KK2Ryb3AgY2FzY2FkZXMgdG8gdHlwZSB0eXBlZF90Citkcm9w IGNhc2NhZGVzIHRvIHRhYmxlIHR5cGVkX3BsYWluCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHR5 cGVkX292ZXIKK2Ryb3AgY2FzY2FkZXMgdG8gdmlldyB2Citkcm9wIGNhc2NhZGVzIHRvIHNlcXVl bmNlIHMKK1dJVEggYWZ0ZXJfZGRsIEFTICgKKyAgICBTRUxFQ1QgdC5uYW1lLCBvLm9yZCwgby5s aW5lCisgICAgRlJPTSAoU0VMRUNUIERJU1RJTkNUIG5hbWUgRlJPTSBwZ3RibF9kZGxfcnRfb3Jp ZykgQVMgdCwKKyAgICAgICAgIExBVEVSQUwgcGdfZ2V0X3RhYmxlX2RkbCgoJ3BndGJsX2RkbF90 ZXN0LicgfHwgdC5uYW1lKTo6cmVnY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgJ293bmVyJywgJ2ZhbHNlJykgV0lUSCBPUkRJTkFMSVRZIG8obGluZSwgb3JkKQorKQor KFNFTEVDVCAnbWlzc2luZy1pbi1jb3B5JyBBUyBraW5kLCBuYW1lLCBvcmQsIGxpbmUgRlJPTSBw Z3RibF9kZGxfcnRfb3JpZworIEVYQ0VQVAorIFNFTEVDVCAnbWlzc2luZy1pbi1jb3B5JywgbmFt ZSwgb3JkLCBsaW5lIEZST00gYWZ0ZXJfZGRsKQorVU5JT04gQUxMCisoU0VMRUNUICdleHRyYS1p bi1jb3B5JyBBUyBraW5kLCBuYW1lLCBvcmQsIGxpbmUgRlJPTSBhZnRlcl9kZGwKKyBFWENFUFQK KyBTRUxFQ1QgJ2V4dHJhLWluLWNvcHknLCBuYW1lLCBvcmQsIGxpbmUgRlJPTSBwZ3RibF9kZGxf cnRfb3JpZykKK09SREVSIEJZIGtpbmQsIG5hbWUsIG9yZDsKKyBraW5kIHwgbmFtZSB8IG9yZCB8 IGxpbmUgCistLS0tLS0rLS0tLS0tKy0tLS0tKy0tLS0tLQorKDAgcm93cykKKworLS0gQ2xlYW51 cC4KK0RST1AgU0NIRU1BIHBndGJsX2RkbF90ZXN0IENBU0NBREU7CitOT1RJQ0U6ICBkcm9wIGNh c2NhZGVzIHRvIDIwIG90aGVyIG9iamVjdHMKK0RFVEFJTDogIGRyb3AgY2FzY2FkZXMgdG8gdGFi bGUgYmFzaWMKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgaWRfY29scworZHJvcCBjYXNjYWRlcyB0 byB0YWJsZSBpZF9jdXN0b20KK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgZ2VuX2NvbHMKK2Ryb3Ag Y2FzY2FkZXMgdG8gdGFibGUgc3RvcmFnZV9jb2xzCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHJl ZmQKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgY29ucworZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBp ZHhkCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHBhcgorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBj aAorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBhdHRvcHQKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUg cGFydGVkX3JhbmdlCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHBhcnRlZF9oYXNoCitkcm9wIGNh c2NhZGVzIHRvIHRhYmxlIHJ0X2xvZworZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBydAorZHJvcCBj YXNjYWRlcyB0byB0YWJsZSBzdHgKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgcmxzCitkcm9wIGNh c2NhZGVzIHRvIHRhYmxlIHJpX2Z1bGwKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgcmlfaWR4Citk cm9wIGNhc2NhZGVzIHRvIHRhYmxlIHVubwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9w YXJhbGxlbF9zY2hlZHVsZSBiL3NyYy90ZXN0L3JlZ3Jlc3MvcGFyYWxsZWxfc2NoZWR1bGUKaW5k ZXggOGZhMGE2YzQ3ZmIuLjllY2E2NGNjYTNiIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNz L3BhcmFsbGVsX3NjaGVkdWxlCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvcGFyYWxsZWxfc2NoZWR1 bGUKQEAgLTgxLDcgKzgxLDcgQEAgdGVzdDogY3JlYXRlX3RhYmxlX2xpa2UgYWx0ZXJfZ2VuZXJp YyBhbHRlcl9vcGVyYXRvciBtaXNjIGFzeW5jIGRic2l6ZSBtZXJnZSBtaXMKICMgY29sbGF0ZS5s aW51eC51dGY4IGFuZCBjb2xsYXRlLmljdS51dGY4IHRlc3RzIGNhbm5vdCBiZSBydW4gaW4gcGFy YWxsZWwgd2l0aCBlYWNoIG90aGVyCiAjIHBzcWwgZGVwZW5kcyBvbiBjcmVhdGVfYW0KICMgYW11 dGlscyBkZXBlbmRzIG9uIGdlb21ldHJ5LCBjcmVhdGVfaW5kZXhfc3BnaXN0LCBoYXNoX2luZGV4 LCBicmluCi10ZXN0OiBydWxlcyBwc3FsIHBzcWxfY3Jvc3N0YWIgcHNxbF9waXBlbGluZSBhbXV0 aWxzIHN0YXRzX2V4dCBjb2xsYXRlLmxpbnV4LnV0ZjggY29sbGF0ZS53aW5kb3dzLndpbjEyNTIK K3Rlc3Q6IHJ1bGVzIHBzcWwgcHNxbF9jcm9zc3RhYiBwc3FsX3BpcGVsaW5lIGFtdXRpbHMgc3Rh dHNfZXh0IGNvbGxhdGUubGludXgudXRmOCBjb2xsYXRlLndpbmRvd3Mud2luMTI1MiBwZ19nZXRf dGFibGVfZGRsCiAKICMgLS0tLS0tLS0tLQogIyBSdW4gdGhlc2UgYWxvbmUgc28gdGhleSBkb24n dCBydW4gb3V0IG9mIHBhcmFsbGVsIHdvcmtlcnMKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jl c3Mvc3FsL3BnX2dldF90YWJsZV9kZGwuc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvcGdfZ2V0 X3RhYmxlX2RkbC5zcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmY2 MzJmZmQzOGMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvcGdfZ2V0 X3RhYmxlX2RkbC5zcWwKQEAgLTAsMCArMSw0MTAgQEAKKy0tCistLSBwZ19nZXRfdGFibGVfZGRs CistLQorLS0gQWxsIHRlc3RzIHBhc3Mgb3duZXI9PmZhbHNlIHNvIHRoZSBBTFRFUiBUQUJMRSBP V05FUiBUTyBsaW5lIGlzIG5vdAorLS0gZW1pdHRlZCwga2VlcGluZyBvdXRwdXQgc3RhYmxlIGFj cm9zcyB0ZXN0IHJ1bm5lcnMgKHdoaWNoIG1heSBydW4gdW5kZXIKKy0tIGRpZmZlcmVudCByb2xl IG5hbWVzKS4KKy0tCitDUkVBVEUgU0NIRU1BIHBndGJsX2RkbF90ZXN0OworU0VUIHNlYXJjaF9w YXRoID0gcGd0YmxfZGRsX3Rlc3Q7CisKKy0tIEJhc2ljIHRhYmxlIHdpdGggUFJJTUFSWSBLRVks IE5PVCBOVUxMLCBERUZBVUxULCBDT0xMQVRFLgorQ1JFQVRFIFRBQkxFIGJhc2ljICgKKyAgICBp ZCBpbnQgUFJJTUFSWSBLRVksCisgICAgbmFtZSB0ZXh0IE5PVCBOVUxMIERFRkFVTFQgJ2Fub24n IENPTExBVEUgIkMiCispOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdiYXNpYyc6 OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKworLS0gSWRlbnRpdHkgY29sdW1ucyAod2l0 aCBkZWZhdWx0IGFuZCBjdXN0b20gc2VxdWVuY2Ugb3B0aW9ucykuCitDUkVBVEUgVEFCTEUgaWRf Y29scyAoCisgICAgaWRfYWx3YXlzIGludCBHRU5FUkFURUQgQUxXQVlTIEFTIElERU5USVRZLAor ICAgIGlkX2RlZmF1bHQgaW50IEdFTkVSQVRFRCBCWSBERUZBVUxUIEFTIElERU5USVRZCispOwor U0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdpZF9jb2xzJzo6cmVnY2xhc3MsICdvd25l cicsICdmYWxzZScpOworCitDUkVBVEUgVEFCTEUgaWRfY3VzdG9tICgKKyAgICB2IGludCBHRU5F UkFURUQgQUxXQVlTIEFTIElERU5USVRZICgKKyAgICAgICAgU0VRVUVOQ0UgTkFNRSBpZF9jdXN0 b21fdl9zZXEKKyAgICAgICAgU1RBUlQgV0lUSCAxMDAgSU5DUkVNRU5UIEJZIDUKKyAgICAgICAg TUlOVkFMVUUgNTAgTUFYVkFMVUUgMTAwMAorICAgICAgICBDQUNIRSAxMCBDWUNMRQorICAgICkK Kyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2lkX2N1c3RvbSc6OnJlZ2NsYXNz LCAnb3duZXInLCAnZmFsc2UnKTsKKworLS0gR2VuZXJhdGVkIHN0b3JlZCBjb2x1bW4uCitDUkVB VEUgVEFCTEUgZ2VuX2NvbHMgKAorICAgIGNlbnRzIGludCwKKyAgICBkb2xsYXJzIG51bWVyaWMg R0VORVJBVEVEIEFMV0FZUyBBUyAoY2VudHMgLyAxMDAuMCkgU1RPUkVECispOworU0VMRUNUICog RlJPTSBwZ19nZXRfdGFibGVfZGRsKCdnZW5fY29scyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFs c2UnKTsKKworLS0gU1RPUkFHRSBhbmQgQ09NUFJFU1NJT04gKG9ubHkgZW1pdHRlZCB3aGVuIG5v bi1kZWZhdWx0IGZvciB0aGUgdHlwZSkuCitDUkVBVEUgVEFCTEUgc3RvcmFnZV9jb2xzICgKKyAg ICBhIHRleHQgU1RPUkFHRSBFWFRFUk5BTCwKKyAgICBiIHRleHQgU1RPUkFHRSBNQUlOLAorICAg IGMgdGV4dCBDT01QUkVTU0lPTiBwZ2x6CispOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVf ZGRsKCdzdG9yYWdlX2NvbHMnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisKKy0tIENv bnN0cmFpbnRzOiBDSEVDSywgVU5JUVVFLCBGT1JFSUdOIEtFWSAoREVGRVJSQUJMRSkuCitDUkVB VEUgVEFCTEUgcmVmZCAoaWQgaW50IFBSSU1BUlkgS0VZKTsKK0NSRUFURSBUQUJMRSBjb25zICgK KyAgICBhIGludCBDSEVDSyAoYSA+IDApLAorICAgIGIgaW50IFVOSVFVRSwKKyAgICBjIGludCBS RUZFUkVOQ0VTIHJlZmQoaWQpIERFRkVSUkFCTEUgSU5JVElBTExZIERFRkVSUkVECispOworU0VM RUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdjb25zJzo6cmVnY2xhc3MsICdvd25lcicsICdm YWxzZScpOworCistLSBJbmRleGVzOiBmdW5jdGlvbmFsIGFuZCBwYXJ0aWFsLiAgQ29uc3RyYWlu dC1iYWNraW5nIGluZGV4ZXMgYXJlCistLSBzdXBwcmVzc2VkICh0aGV5IGFyZSBlbWl0dGVkIGJ5 IHRoZSBjb25zdHJhaW50IGxvb3ApLgorQ1JFQVRFIFRBQkxFIGlkeGQgKGlkIGludCBQUklNQVJZ IEtFWSwgbmFtZSB0ZXh0KTsKK0NSRUFURSBJTkRFWCBpZHhkX2xvd2VyIE9OIGlkeGQgKGxvd2Vy KG5hbWUpKTsKK0NSRUFURSBJTkRFWCBpZHhkX3BhcnRpYWwgT04gaWR4ZCAoaWQpIFdIRVJFIGlk ID4gMTAwOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdpZHhkJzo6cmVnY2xhc3Ms ICdvd25lcicsICdmYWxzZScpOworCistLSBJbmhlcml0YW5jZSwgaW5jbHVkaW5nIGEgY2hpbGQg REVGQVVMVCBvdmVycmlkZSBvbiBhbiBpbmhlcml0ZWQgY29sdW1uLgorQ1JFQVRFIFRBQkxFIHBh ciAoYSBpbnQgREVGQVVMVCAxLCBiIHRleHQpOworQ1JFQVRFIFRBQkxFIGNoIChjIGludCkgSU5I RVJJVFMgKHBhcik7CitBTFRFUiBUQUJMRSBjaCBBTFRFUiBDT0xVTU4gYSBTRVQgREVGQVVMVCA5 OTk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2NoJzo6cmVnY2xhc3MsICdvd25l cicsICdmYWxzZScpOworCistLSBQZXItY29sdW1uIGF0dG9wdGlvbnM6IGVtaXR0ZWQgYXMgQUxU RVIgQ09MVU1OIFNFVCAoLi4uKS4KK0NSRUFURSBUQUJMRSBhdHRvcHQgKGEgaW50LCBiIHRleHQp OworQUxURVIgVEFCTEUgYXR0b3B0IEFMVEVSIENPTFVNTiBhIFNFVCAobl9kaXN0aW5jdCA9IDEw MCk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2F0dG9wdCc6OnJlZ2NsYXNzLCAn b3duZXInLCAnZmFsc2UnKTsKKworLS0gUGFydGl0aW9uZWQgdGFibGUgcGFyZW50IChSQU5HRSBh bmQgSEFTSCkuCitDUkVBVEUgVEFCTEUgcGFydGVkX3JhbmdlIChpZCBpbnQsIGsgaW50KSBQQVJU SVRJT04gQlkgUkFOR0UgKGlkKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncGFy dGVkX3JhbmdlJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworCitDUkVBVEUgVEFCTEUg cGFydGVkX2hhc2ggKGlkIGludCkgUEFSVElUSU9OIEJZIEhBU0ggKGlkKTsKK1NFTEVDVCAqIEZS T00gcGdfZ2V0X3RhYmxlX2RkbCgncGFydGVkX2hhc2gnOjpyZWdjbGFzcywgJ293bmVyJywgJ2Zh bHNlJyk7CisKKy0tIFBhcnRpdGlvbiBjaGlsZHJlbjogRlJPTS9UTywgV0lUSCAobW9kdWx1cywg cmVtYWluZGVyKSwgREVGQVVMVC4KK0NSRUFURSBUQUJMRSBwYXJ0ZWRfcmFuZ2VfMSBQQVJUSVRJ T04gT0YgcGFydGVkX3JhbmdlCisgICAgRk9SIFZBTFVFUyBGUk9NICgwKSBUTyAoMTAwKTsKK0FM VEVSIFRBQkxFIHBhcnRlZF9yYW5nZV8xIEFMVEVSIENPTFVNTiBrIFNFVCBERUZBVUxUIDc7CitT RUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3BhcnRlZF9yYW5nZV8xJzo6cmVnY2xhc3Ms ICdvd25lcicsICdmYWxzZScpOworCitDUkVBVEUgVEFCTEUgcGFydGVkX2hhc2hfMCBQQVJUSVRJ T04gT0YgcGFydGVkX2hhc2gKKyAgICBGT1IgVkFMVUVTIFdJVEggKG1vZHVsdXMgMiwgcmVtYWlu ZGVyIDApOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdwYXJ0ZWRfaGFzaF8wJzo6 cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworCitDUkVBVEUgVEFCTEUgcGFydGVkX3Jhbmdl X2RlZiBQQVJUSVRJT04gT0YgcGFydGVkX3JhbmdlIERFRkFVTFQ7CitTRUxFQ1QgKiBGUk9NIHBn X2dldF90YWJsZV9kZGwoJ3BhcnRlZF9yYW5nZV9kZWYnOjpyZWdjbGFzcywgJ293bmVyJywgJ2Zh bHNlJyk7CisKKy0tIFJ1bGVzLgorQ1JFQVRFIFRBQkxFIHJ0IChpZCBpbnQpOworQ1JFQVRFIFRB QkxFIHJ0X2xvZyAoaWQgaW50KTsKK0NSRUFURSBSVUxFIHJ0X2xvZ19pbnNlcnQgQVMgT04gSU5T RVJUIFRPIHJ0CisgICAgRE8gQUxTTyBJTlNFUlQgSU5UTyBydF9sb2cgVkFMVUVTIChORVcuaWQp OworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdydCc6OnJlZ2NsYXNzLCAnb3duZXIn LCAnZmFsc2UnKTsKKworLS0gRXh0ZW5kZWQgc3RhdGlzdGljcy4KK0NSRUFURSBUQUJMRSBzdHgg KGEgaW50LCBiIGludCwgYyBpbnQpOworQ1JFQVRFIFNUQVRJU1RJQ1Mgc3R4X25kdiAobmRpc3Rp bmN0KSBPTiBhLCBiIEZST00gc3R4OworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdz dHgnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisKKy0tIFJvdy1sZXZlbCBzZWN1cml0 eSB0b2dnbGVzLgorQ1JFQVRFIFRBQkxFIHJscyAoaWQgaW50KTsKK0FMVEVSIFRBQkxFIHJscyBF TkFCTEUgUk9XIExFVkVMIFNFQ1VSSVRZOworQUxURVIgVEFCTEUgcmxzIEZPUkNFIFJPVyBMRVZF TCBTRUNVUklUWTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncmxzJzo6cmVnY2xh c3MsICdvd25lcicsICdmYWxzZScpOworCistLSBSRVBMSUNBIElERU5USVRZOiBlbWl0dGVkIG9u bHkgd2hlbiBub3QgdGhlIGRlZmF1bHQuCitDUkVBVEUgVEFCTEUgcmlfZnVsbCAoYSBpbnQpOwor QUxURVIgVEFCTEUgcmlfZnVsbCBSRVBMSUNBIElERU5USVRZIEZVTEw7CitTRUxFQ1QgKiBGUk9N IHBnX2dldF90YWJsZV9kZGwoJ3JpX2Z1bGwnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7 CisKK0NSRUFURSBUQUJMRSByaV9pZHggKGEgaW50IE5PVCBOVUxMKTsKK0NSRUFURSBVTklRVUUg SU5ERVggcmlfaWR4X2EgT04gcmlfaWR4IChhKTsKK0FMVEVSIFRBQkxFIHJpX2lkeCBSRVBMSUNB IElERU5USVRZIFVTSU5HIElOREVYIHJpX2lkeF9hOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFi bGVfZGRsKCdyaV9pZHgnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisKKy0tIFVOTE9H R0VEICsgcmVsb3B0aW9ucy4KK0NSRUFURSBVTkxPR0dFRCBUQUJMRSB1bm8gKGlkIGludCkgV0lU SCAoZmlsbGZhY3RvciA9IDcwKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgndW5v Jzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworCistLSBUeXBlZCB0YWJsZSAoQ1JFQVRF IFRBQkxFIE9GIHR5cGVfbmFtZSkuICBDb2x1bW5zIGluaGVyaXRlZCBmcm9tIHRoZQorLS0gdHlw ZSBlbWl0IG5vdGhpbmc7IGxvY2FsbHktYXBwbGllZCBERUZBVUxULCBOT1QgTlVMTCBhbmQgQ0hF Q0sgY29tZQorLS0gb3V0IHRocm91Z2ggYSBzaW5nbGUgIihjb2wgV0lUSCBPUFRJT05TIC4uLiki IGxpc3QuCitDUkVBVEUgVFlQRSB0eXBlZF90IEFTIChhIGludCwgYiB0ZXh0KTsKK0NSRUFURSBU QUJMRSB0eXBlZF9wbGFpbiBPRiB0eXBlZF90OworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVf ZGRsKCd0eXBlZF9wbGFpbic6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKworQ1JFQVRF IFRBQkxFIHR5cGVkX292ZXIgT0YgdHlwZWRfdCAoCisgICAgYSBXSVRIIE9QVElPTlMgREVGQVVM VCA3IE5PVCBOVUxMLAorICAgIGIgV0lUSCBPUFRJT05TIE5PVCBOVUxMLAorICAgIENPTlNUUkFJ TlQgYl9ub25lbXB0eSBDSEVDSyAobGVuZ3RoKGIpID4gMCkKKyk7CitTRUxFQ1QgKiBGUk9NIHBn X2dldF90YWJsZV9kZGwoJ3R5cGVkX292ZXInOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7 CisKKy0tIFRlbXBvcmFyeSB0YWJsZXMgKyBPTiBDT01NSVQuICBUZW1wIHRhYmxlcyBsaXZlIGlu IGEgc2Vzc2lvbi1sb2NhbAorLS0gbmFtZXNwYWNlIHdob3NlIG5hbWUgdmFyaWVzIGJldHdlZW4g cnVucywgc28gd2Ugc3RyaXAgdGhlIHNjaGVtYQorLS0gcHJlZml4LiAgT04gQ09NTUlUIERST1Ag b25seSBmaXJlcyBhdCBjb21taXQsIHNvIHRoZSBxdWVyaWVzIHRoYXQKKy0tIG5lZWQgdG8gc2Vl IHRoZSBjYXRhbG9nIGVudHJ5IG11c3QgcnVuIGluIHRoZSBzYW1lIHRyYW5zYWN0aW9uIGFzCist LSB0aGUgQ1JFQVRFLgorQkVHSU47CitDUkVBVEUgVEVNUCBUQUJMRSB0ZW1wX2RlZmF1bHQgKGlk IGludCk7CitDUkVBVEUgVEVNUCBUQUJMRSB0ZW1wX2RlbGV0ZSAoaWQgaW50KSBPTiBDT01NSVQg REVMRVRFIFJPV1M7CitDUkVBVEUgVEVNUCBUQUJMRSB0ZW1wX2Ryb3AgKGlkIGludCkgT04gQ09N TUlUIERST1A7CisKK1NFTEVDVCByZWdleHBfcmVwbGFjZShsaW5lLCAnIj9wZ190ZW1wXz9bMC05 XSsiP1wuJywgJ3BnX3RlbXAuJykgQVMgbGluZQorRlJPTSBwZ19nZXRfdGFibGVfZGRsKCd0ZW1w X2RlZmF1bHQnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJykgQVMgbGluZQorV0hFUkUgbGlu ZSBMSUtFICdDUkVBVEUgJSc7CisKK1NFTEVDVCByZWdleHBfcmVwbGFjZShsaW5lLCAnIj9wZ190 ZW1wXz9bMC05XSsiP1wuJywgJ3BnX3RlbXAuJykgQVMgbGluZQorRlJPTSBwZ19nZXRfdGFibGVf ZGRsKCd0ZW1wX2RlbGV0ZSc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKSBBUyBsaW5lCitX SEVSRSBsaW5lIExJS0UgJ0NSRUFURSAlJzsKKworU0VMRUNUIHJlZ2V4cF9yZXBsYWNlKGxpbmUs ICciP3BnX3RlbXBfP1swLTldKyI/XC4nLCAncGdfdGVtcC4nKSBBUyBsaW5lCitGUk9NIHBnX2dl dF90YWJsZV9kZGwoJ3RlbXBfZHJvcCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKSBBUyBs aW5lCitXSEVSRSBsaW5lIExJS0UgJ0NSRUFURSAlJzsKK1JPTExCQUNLOworCistLSBQcmV0dHkg bW9kZS4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnYmFzaWMnOjpyZWdjbGFzcywg J293bmVyJywgJ2ZhbHNlJywgJ3ByZXR0eScsICd0cnVlJyk7CisKKy0tIGluY2x1ZGVzXyogZ2F0 aW5nOiBlYWNoIHN1Yi1vYmplY3QgY2F0ZWdvcnkgY2FuIGJlIHN1cHByZXNzZWQgaW5kaXZpZHVh bGx5LgorLS0gaW5jbHVkZXNfaW5kZXhlcz1mYWxzZSBoaWRlcyB0aGUgQ1JFQVRFIElOREVYIHN0 YXRlbWVudHMuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2lkeGQnOjpyZWdjbGFz cywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5j bHVkZXNfaW5kZXhlcycsICdmYWxzZScpOworCistLSBpbmNsdWRlc19jb25zdHJhaW50cz1mYWxz ZSBoaWRlcyBib3RoIGlubGluZSBDSEVDSyBpbiBDUkVBVEUgVEFCTEUgYW5kCistLSB0aGUgQUxU RVIgVEFCTEUgLi4uIEFERCBDT05TVFJBSU5UIGxpbmVzLgorU0VMRUNUICogRlJPTSBwZ19nZXRf dGFibGVfZGRsKCdjb25zJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGVzX2NvbnN0cmFpbnRzJywgJ2ZhbHNlJyk7CisK Ky0tIGluY2x1ZGVzX3J1bGVzPWZhbHNlIGhpZGVzIHRoZSBDUkVBVEUgUlVMRS4KK1NFTEVDVCAq IEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncnQnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZXNfcnVsZXMnLCAnZmFsc2Un KTsKKworLS0gaW5jbHVkZXNfc3RhdGlzdGljcz1mYWxzZSBoaWRlcyB0aGUgQ1JFQVRFIFNUQVRJ U1RJQ1MuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3N0eCc6OnJlZ2NsYXNzLCAn b3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRl c19zdGF0aXN0aWNzJywgJ2ZhbHNlJyk7CisKKy0tIGluY2x1ZGVzX3Jscz1mYWxzZSBoaWRlcyB0 aGUgRU5BQkxFL0ZPUkNFIFJPVyBMRVZFTCBTRUNVUklUWSB0b2dnbGVzLgorU0VMRUNUICogRlJP TSBwZ19nZXRfdGFibGVfZGRsKCdybHMnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZXNfcmxzJywgJ2ZhbHNlJyk7CisK Ky0tIGluY2x1ZGVzX3JlcGxpY2FfaWRlbnRpdHk9ZmFsc2UgaGlkZXMgdGhlIFJFUExJQ0EgSURF TlRJVFkgY2xhdXNlLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdyaV9mdWxsJzo6 cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgJ2luY2x1ZGVzX3JlcGxpY2FfaWRlbnRpdHknLCAnZmFsc2UnKTsKKworLS0gaW5jbHVkZXNf cGFydGl0aW9uOiBkZWZhdWx0IGlzIGZhbHNlLCBzbyB0aGUgcGFydGl0aW9uZWQtdGFibGUgcGFy ZW50CistLSBEREwgb24gaXRzIG93biBkb2VzIG5vdCBpbmNsdWRlIGl0cyBjaGlsZHJlbi4gIFNl dHRpbmcgaXQgdG8gdHJ1ZQorLS0gYXBwZW5kcyB0aGUgY2hpbGRyZW4ncyBEREwgYWZ0ZXIgdGhl IHBhcmVudC4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncGFydGVkX3JhbmdlJzo6 cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgJ2luY2x1ZGVzX3BhcnRpdGlvbicsICd0cnVlJyk7CisKKy0tIHNjaGVtYV9xdWFsaWZpZWQ9 ZmFsc2Ugc3RyaXBzIHRoZSBzY2hlbWEgZnJvbSB0aGUgdGFyZ2V0IHRhYmxlIGl0c2VsZgorLS0g YW5kIGZyb20gc2FtZS1zY2hlbWEgc2libGluZyByZWZlcmVuY2VzIChpbmhlcml0YW5jZS9wYXJ0 aXRpb24KKy0tIHBhcmVudHMsIGlkZW50aXR5IHNlcXVlbmNlcyBpbiB0aGUgc2FtZSBzY2hlbWEp LCB3aGlsZSBjcm9zcy1zY2hlbWEKKy0tIHJlZmVyZW5jZXMgYXJlIGtlcHQgcXVhbGlmaWVkIGZv ciBjb3JyZWN0bmVzcy4KKy0tCistLSBCYXJlIENSRUFURSBUQUJMRSBmb3IgYW4gb3JkaW5hcnkg dGFibGUuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2Jhc2ljJzo6cmVnY2xhc3Ms ICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjaGVt YV9xdWFsaWZpZWQnLCAnZmFsc2UnKTsKKworLS0gSU5IRVJJVFMgcGFyZW50IGluIHRoZSBzYW1l IHNjaGVtYSBpcyBlbWl0dGVkIHVucXVhbGlmaWVkLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFi bGVfZGRsKCdjaCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICdzY2hlbWFfcXVhbGlmaWVkJywgJ2ZhbHNlJyk7CisKKy0tIFBhcnRp dGlvbiBwYXJlbnQgaW4gdGhlIHNhbWUgc2NoZW1hIGlzIGVtaXR0ZWQgdW5xdWFsaWZpZWQuCitT RUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3BhcnRlZF9yYW5nZV8xJzo6cmVnY2xhc3Ms ICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjaGVt YV9xdWFsaWZpZWQnLCAnZmFsc2UnKTsKKworLS0gQ3Jvc3Mtc2NoZW1hIEZLIHRhcmdldCBrZWVw cyBxdWFsaWZpY2F0aW9uLiAgVGhlICdyZWZkJyB0YWJsZSBpcyBpbgorLS0gcGd0YmxfZGRsX3Rl c3Q7IHBsYWNlIGFuIEZLIHRhcmdldCBpbiBhIGRpZmZlcmVudCBzY2hlbWEgYW5kIHZlcmlmeSBp dAorLS0gc3RheXMgcXVhbGlmaWVkIGV2ZW4gd2l0aCBzY2hlbWFfcXVhbGlmaWVkPWZhbHNlLgor Q1JFQVRFIFNDSEVNQSBwZ3RibF9kZGxfb3RoZXI7CitDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX290 aGVyLnBhcmVudCAoaWQgaW50IFBSSU1BUlkgS0VZKTsKK0NSRUFURSBUQUJMRSB4c2NoZW1hX2Zr ICgKKyAgICBpZCAgaW50IFBSSU1BUlkgS0VZLAorICAgIHBpZCBpbnQgUkVGRVJFTkNFUyBwZ3Ri bF9kZGxfb3RoZXIucGFyZW50CispOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCd4 c2NoZW1hX2ZrJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgJ3NjaGVtYV9xdWFsaWZpZWQnLCAnZmFsc2UnKTsKKworLS0gSWRlbnRp dHkgY29sdW1uIHdpdGggYSBjdXN0b20gc2VxdWVuY2UgbmFtZSBpbiB0aGUgc2FtZSBzY2hlbWEg aXMKKy0tIGVtaXR0ZWQgdW5xdWFsaWZpZWQuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9k ZGwoJ2lkX2N1c3RvbSc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICdzY2hlbWFfcXVhbGlmaWVkJywgJ2ZhbHNlJyk7CisKKy0tIFJv dW5kLXRyaXA6IHdpdGggc2NoZW1hX3F1YWxpZmllZD1mYWxzZSwgYWZ0ZXIgU0VUIHNlYXJjaF9w YXRoIHRoZQorLS0gRERMIGNhbiBiZSByZXBsYXllZCBpbnRvIGEgZGlmZmVyZW50IHRhcmdldCBz Y2hlbWEuCitDUkVBVEUgU0NIRU1BIHBndGJsX2RkbF9yZXBsYXk7CitETyAkJAorREVDTEFSRQor ICAgIHN0bXQgdGV4dDsKK0JFR0lOCisgICAgU0VUIExPQ0FMIHNlYXJjaF9wYXRoID0gcGd0Ymxf ZGRsX3JlcGxheTsKKyAgICBGT1Igc3RtdCBJTgorICAgICAgICBTRUxFQ1QgbGluZSBGUk9NIHBn X2dldF90YWJsZV9kZGwoJ3BndGJsX2RkbF90ZXN0LmJhc2ljJzo6cmVnY2xhc3MsCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3duZXInLCAnZmFsc2UnLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjaGVtYV9xdWFsaWZpZWQn LCAnZmFsc2UnKSBBUyBsaW5lCisgICAgTE9PUAorICAgICAgICBFWEVDVVRFIHN0bXQ7CisgICAg RU5EIExPT1A7CitFTkQgJCQ7CitTRUxFQ1QgcmVsbmFtZXNwYWNlOjpyZWduYW1lc3BhY2U6OnRl eHQsIHJlbG5hbWUKK0ZST00gcGdfY2xhc3MgV0hFUkUgb2lkID0gJ3BndGJsX2RkbF9yZXBsYXku YmFzaWMnOjpyZWdjbGFzczsKK0RST1AgU0NIRU1BIHBndGJsX2RkbF9yZXBsYXkgQ0FTQ0FERTsK K0RST1AgVEFCTEUgeHNjaGVtYV9mazsKK0RST1AgU0NIRU1BIHBndGJsX2RkbF9vdGhlciBDQVND QURFOworCistLSBMb2NhbGx5LWRlY2xhcmVkIENIRUNLIG9uIGEgcGFydGl0aW9uIGNoaWxkIGhh cyBubyBpbmxpbmUgY29sdW1uCistLSBsaXN0IHRvIGxpdmUgaW4gKFBBUlRJVElPTiBPRiBmb3Jt KSwgc28gaXQgbXVzdCBjb21lIG91dCBhcyBhCistLSBzZXBhcmF0ZSBBTFRFUiBUQUJMRSAuLi4g QUREIENPTlNUUkFJTlQgc3RhdGVtZW50LgorQ1JFQVRFIFRBQkxFIHBhcnRlZF9jaGsgKGlkIGlu dCwgdmFsIGludCkgUEFSVElUSU9OIEJZIFJBTkdFIChpZCk7CitDUkVBVEUgVEFCTEUgcGFydGVk X2Noa19jaGlsZCBQQVJUSVRJT04gT0YgcGFydGVkX2NoaworICAgIChDT05TVFJBSU5UIGNoa19p bmxpbmUgQ0hFQ0sgKHZhbCA+IDApKQorICAgIEZPUiBWQUxVRVMgRlJPTSAoMCkgVE8gKDEwMCk7 CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3BhcnRlZF9jaGtfY2hpbGQnOjpyZWdj bGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CitEUk9QIFRBQkxFIHBhcnRlZF9jaGs7CisKKy0tIElu aGVyaXRhbmNlIGNoaWxkcmVuIG9mIGEgcGFyZW50IHdpdGggYSBnZW5lcmF0ZWQgY29sdW1uIHNo b3VsZCBub3QKKy0tIGVtaXQgYW4gQUxURVIgQ09MVU1OIC4uLiBTRVQgREVGQVVMVCBmb3IgdGhl IGluaGVyaXRlZCBnZW5lcmF0ZWQKKy0tIGNvbHVtbjogdGhlIEdFTkVSQVRFRCBleHByZXNzaW9u IGNhcnJpZXMgZG93biB0aHJvdWdoIGluaGVyaXRhbmNlLAorLS0gYW5kIFNFVCBERUZBVUxUIHdv dWxkIGZhaWwgYXQgcmVwbGF5IGFnYWluc3QgYSBnZW5lcmF0ZWQgY29sdW1uLgorQ1JFQVRFIFRB QkxFIHBhcl9nZW4gKAorICAgIGlkIGludCwKKyAgICBnICBpbnQgR0VORVJBVEVEIEFMV0FZUyBB UyAoaWQgKiAyKSBTVE9SRUQKKyk7CitDUkVBVEUgVEFCTEUgY2hfZ2VuICgpIElOSEVSSVRTIChw YXJfZ2VuKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnY2hfZ2VuJzo6cmVnY2xh c3MsICdvd25lcicsICdmYWxzZScpOworRFJPUCBUQUJMRSBwYXJfZ2VuIENBU0NBREU7CisKKy0t IFVzZXItbmFtZWQgTk9UIE5VTEwgY29uc3RyYWludCBtdXN0IGJlIGVtaXR0ZWQgaW5saW5lIGFz CistLSAiQ09OU1RSQUlOVCBuYW1lIE5PVCBOVUxMIiBzbyBhIHJlcGxheSBkb2VzIG5vdCBjb2xs aWRlIHdpdGggdGhlCistLSBhdXRvLW5hbWVkIE5PVCBOVUxMIHRoYXQgUG9zdGdyZVNRTCB3b3Vs ZCBvdGhlcndpc2UgY3JlYXRlIGZyb20gYQorLS0gcGxhaW4gaW5saW5lICJOT1QgTlVMTCIuICBU aGUgY29uc3RyYWludCBsb29wIHNraXBzIHRoZSB1c2VyLW5hbWVkCistLSBlbnRyeSB0byBhdm9p ZCBkb3VibGUtZW1pc3Npb24uCitDUkVBVEUgVEFCTEUgbm5fbmFtZWQgKAorICAgIGEgaW50IENP TlNUUkFJTlQgbXlfbm4gTk9UIE5VTEwsCisgICAgYiBpbnQgTk9UIE5VTEwKKyk7CitTRUxFQ1Qg KiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ25uX25hbWVkJzo6cmVnY2xhc3MsICdvd25lcicsICdm YWxzZScpOworRFJPUCBUQUJMRSBubl9uYW1lZDsKKworLS0gTG9jYWxseS1kZWNsYXJlZCBOT1Qg TlVMTCBvbiBhbiBpbmhlcml0ZWQgY29sdW1uLiAgVGhlIGNvbHVtbiBpdHNlbGYKKy0tIGlzIG9t aXR0ZWQgZnJvbSB0aGUgY2hpbGQncyBjb2x1bW4gbGlzdCAoYXR0aXNsb2NhbD1mYWxzZSksIHNv IHRoZQorLS0gdXNlci1uYW1lZCBOT1QgTlVMTCBtdXN0IGNvbWUgb3V0IHZpYSB0aGUgcG9zdC1D UkVBVEUgY29uc3RyYWludAorLS0gbG9vcCByYXRoZXIgdGhhbiBpbmxpbmUuCitDUkVBVEUgVEFC TEUgbm5fcGFyIChhIGludCk7CitDUkVBVEUgVEFCTEUgbm5fY2ggKGIgaW50KSBJTkhFUklUUyAo bm5fcGFyKTsKK0FMVEVSIFRBQkxFIG5uX2NoIEFERCBDT05TVFJBSU5UIG15X25uIE5PVCBOVUxM IGE7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ25uX2NoJzo6cmVnY2xhc3MsICdv d25lcicsICdmYWxzZScpOworRFJPUCBUQUJMRSBubl9wYXIgQ0FTQ0FERTsKKworLS0gc2NoZW1h X3F1YWxpZmllZD1mYWxzZSBtdXN0IGRyb3AgdGhlIHNjaGVtYSBwcmVmaXggZnJvbSBERUZBVUxU CistLSBleHByZXNzaW9ucyBhbmQgaW5saW5lIENIRUNLIGJvZGllcyB0aGF0IHJlZmVyZW5jZSBz YW1lLXNjaGVtYQorLS0gb2JqZWN0cyAoc2VxdWVuY2UgdmlhIG5leHR2YWwsIGZ1bmN0aW9uIHZp YSBkaXJlY3QgY2FsbCkuICBUaGlzCistLSByZWxpZXMgb24gdGhlIGRlcGFyc2VyIHJlc3BlY3Rp bmcgdGhlIG5hcnJvd2VkIHNlYXJjaF9wYXRoIHJhdGhlcgorLS0gdGhhbiBvbiBzdWJzdHJpbmcg c3RyaXBwaW5nLgorQ1JFQVRFIFNDSEVNQSBwZ3RibF9kZGxfeHJlZjsKK0NSRUFURSBTRVFVRU5D RSBwZ3RibF9kZGxfeHJlZi5teXNlcTsKK0NSRUFURSBGVU5DVElPTiBwZ3RibF9kZGxfeHJlZi5m KGludCkgUkVUVVJOUyBpbnQgTEFOR1VBR0Ugc3FsIElNTVVUQUJMRQorICAgIEFTICdTRUxFQ1Qg JDEnOworQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF94cmVmLnQgKAorICAgIGlkICBpbnQgREVGQVVM VCBuZXh0dmFsKCdwZ3RibF9kZGxfeHJlZi5teXNlcScpLAorICAgIHZhbCBpbnQsCisgICAgQ09O U1RSQUlOVCBjaGsgQ0hFQ0sgKHBndGJsX2RkbF94cmVmLmYodmFsKSA+IDApCispOworU0VMRUNU ICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdwZ3RibF9kZGxfeHJlZi50Jzo6cmVnY2xhc3MsCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAnc2NoZW1hX3F1YWxpZmllZCcsICdmYWxzZScpOworRFJP UCBTQ0hFTUEgcGd0YmxfZGRsX3hyZWYgQ0FTQ0FERTsKKworLS0gc2NoZW1hX3F1YWxpZmllZD1m YWxzZSBtdXN0IE5PVCBjb3JydXB0IHN0cmluZyBsaXRlcmFscyB3aG9zZQorLS0gY29udGVudHMg aGFwcGVuIHRvIGNvbnRhaW4gdGhlIHNjaGVtYSBuYW1lIGZvbGxvd2VkIGJ5IGEgZG90LiAgVGhl CistLSBpbi1zdHJpbmcgc3RhdGUgb2YgdGhlIHByZWZpeCBzdHJpcHBlciBwcmVzZXJ2ZXMgdGhl bSB2ZXJiYXRpbS4KK0NSRUFURSBTQ0hFTUEgcGd0YmxfZGRsX3N0cjsKK0NSRUFURSBUQUJMRSBw Z3RibF9kZGxfc3RyLnAgKGlkIGludCwgbm90ZSB0ZXh0KSBQQVJUSVRJT04gQlkgUkFOR0UgKGlk KTsKK0NSRUFURSBUQUJMRSBwZ3RibF9kZGxfc3RyLnBjIFBBUlRJVElPTiBPRiBwZ3RibF9kZGxf c3RyLnAKKyAgICAoQ09OU1RSQUlOVCBjaGsgQ0hFQ0sgKG5vdGUgPD4gJ3BndGJsX2RkbF9zdHIu c2VjcmV0JykpCisgICAgRk9SIFZBTFVFUyBGUk9NICgwKSBUTyAoMTAwKTsKK1NFTEVDVCAqIEZS T00gcGdfZ2V0X3RhYmxlX2RkbCgncGd0YmxfZGRsX3N0ci5wYyc6OnJlZ2NsYXNzLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgJ3NjaGVtYV9xdWFsaWZpZWQnLCAnZmFsc2UnKTsKK0RST1AgU0NI RU1BIHBndGJsX2RkbF9zdHIgQ0FTQ0FERTsKKworLS0gRXJyb3I6IG5vdCBhbiBvcmRpbmFyeSBv ciBwYXJ0aXRpb25lZCB0YWJsZS4KK0NSRUFURSBWSUVXIHYgQVMgU0VMRUNUIDEgQVMgeDsKK1NF TEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgndic6OnJlZ2NsYXNzKTsKKworQ1JFQVRFIFNF UVVFTkNFIHM7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3MnOjpyZWdjbGFzcyk7 CisKKy0tIE5VTEwgYXJndW1lbnQgcmV0dXJucyBubyByb3dzLgorU0VMRUNUICogRlJPTSBwZ19n ZXRfdGFibGVfZGRsKE5VTEwpOworCistLSBVbnJlY29nbml6ZWQgb3B0aW9uLgorU0VMRUNUICog RlJPTSBwZ19nZXRfdGFibGVfZGRsKCdiYXNpYyc6OnJlZ2NsYXNzLCAnYm9ndXMnLCAndHJ1ZScp OworCistLSBPZGQgbnVtYmVyIG9mIHZhcmlhZGljIGFyZ3MuCitTRUxFQ1QgKiBGUk9NIHBnX2dl dF90YWJsZV9kZGwoJ2Jhc2ljJzo6cmVnY2xhc3MsICdwcmV0dHknKTsKKworLS0gUm91bmQtdHJp cCB2ZXJpZmljYXRpb24uICBGb3IgZXZlcnkgdGVzdCB0YWJsZSwgY2FwdHVyZSB0aGUgRERMIHRo ZQorLS0gZnVuY3Rpb24gZW1pdHMsIGRyb3AgdGhlIHNjaGVtYSwgcmVwbGF5IGVhY2ggdGFibGUn cyBEREwgaW4KKy0tIGRlcGVuZGVuY3kgb3JkZXIsIGFuZCBjb25maXJtIHRoYXQgcGdfZ2V0X3Rh YmxlX2RkbCBvbiB0aGUgcmVjcmVhdGVkCistLSByZWxhdGlvbiBtYXRjaGVzIHRoZSBvcmlnaW5h bCBsaW5lLWZvci1saW5lLiAgVGhlIGZpbmFsIFNFTEVDVCBtdXN0CistLSByZXR1cm4gemVybyBy b3dzLgorQ1JFQVRFIFRFTVAgVEFCTEUgcGd0YmxfZGRsX3J0X29yaWcgKG5hbWUgdGV4dCwgb3Jk IGludCwgbGluZSB0ZXh0KTsKK0lOU0VSVCBJTlRPIHBndGJsX2RkbF9ydF9vcmlnCitTRUxFQ1Qg dC5uYW1lLCBvLm9yZCwgby5saW5lCitGUk9NIChWQUxVRVMKKyAgICAgICAgKCdiYXNpYycpLCAo J2lkX2NvbHMnKSwgKCdpZF9jdXN0b20nKSwgKCdnZW5fY29scycpLCAoJ3N0b3JhZ2VfY29scycp LAorICAgICAgICAoJ3JlZmQnKSwgKCdjb25zJyksICgnaWR4ZCcpLAorICAgICAgICAoJ3Bhcicp LCAoJ2NoJyksICgnYXR0b3B0JyksCisgICAgICAgICgncGFydGVkX3JhbmdlJyksICgncGFydGVk X3JhbmdlXzEnKSwgKCdwYXJ0ZWRfcmFuZ2VfZGVmJyksCisgICAgICAgICgncGFydGVkX2hhc2gn KSwgKCdwYXJ0ZWRfaGFzaF8wJyksCisgICAgICAgICgncnRfbG9nJyksICgncnQnKSwKKyAgICAg ICAgKCdzdHgnKSwgKCdybHMnKSwgKCdyaV9mdWxsJyksICgncmlfaWR4JyksICgndW5vJykKKyAg ICAgKSBBUyB0KG5hbWUpLAorICAgICBMQVRFUkFMIHBnX2dldF90YWJsZV9kZGwoKCdwZ3RibF9k ZGxfdGVzdC4nIHx8IHQubmFtZSk6OnJlZ2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgJ293bmVyJywgJ2ZhbHNlJykgV0lUSCBPUkRJTkFMSVRZIG8obGluZSwgb3JkKTsKKwor RE8gJCQKK0RFQ0xBUkUKKyAgICB0YWJsZXMgQ09OU1RBTlQgdGV4dFtdIDo9IEFSUkFZWworICAg ICAgICAnYmFzaWMnLCAnaWRfY29scycsICdpZF9jdXN0b20nLCAnZ2VuX2NvbHMnLCAnc3RvcmFn ZV9jb2xzJywKKyAgICAgICAgJ3JlZmQnLCAnY29ucycsICdpZHhkJywKKyAgICAgICAgJ3Bhcics ICdjaCcsICdhdHRvcHQnLAorICAgICAgICAncGFydGVkX3JhbmdlJywgJ3BhcnRlZF9yYW5nZV8x JywgJ3BhcnRlZF9yYW5nZV9kZWYnLAorICAgICAgICAncGFydGVkX2hhc2gnLCAncGFydGVkX2hh c2hfMCcsCisgICAgICAgICdydF9sb2cnLCAncnQnLAorICAgICAgICAnc3R4JywgJ3JscycsICdy aV9mdWxsJywgJ3JpX2lkeCcsICd1bm8nCisgICAgXTsKKyAgICB0IHRleHQ7CisgICAgc3RtdCB0 ZXh0OworQkVHSU4KKyAgICBEUk9QIFNDSEVNQSBwZ3RibF9kZGxfdGVzdCBDQVNDQURFOworICAg IENSRUFURSBTQ0hFTUEgcGd0YmxfZGRsX3Rlc3Q7CisgICAgRk9SRUFDSCB0IElOIEFSUkFZIHRh YmxlcyBMT09QCisgICAgICAgIEZPUiBzdG10IElOCisgICAgICAgICAgICBTRUxFQ1QgbGluZSBG Uk9NIHBndGJsX2RkbF9ydF9vcmlnIFdIRVJFIG5hbWUgPSB0IE9SREVSIEJZIG9yZAorICAgICAg ICBMT09QCisgICAgICAgICAgICBFWEVDVVRFIHN0bXQ7CisgICAgICAgIEVORCBMT09QOworICAg IEVORCBMT09QOworRU5EICQkOworCitXSVRIIGFmdGVyX2RkbCBBUyAoCisgICAgU0VMRUNUIHQu bmFtZSwgby5vcmQsIG8ubGluZQorICAgIEZST00gKFNFTEVDVCBESVNUSU5DVCBuYW1lIEZST00g cGd0YmxfZGRsX3J0X29yaWcpIEFTIHQsCisgICAgICAgICBMQVRFUkFMIHBnX2dldF90YWJsZV9k ZGwoKCdwZ3RibF9kZGxfdGVzdC4nIHx8IHQubmFtZSk6OnJlZ2NsYXNzLAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICdvd25lcicsICdmYWxzZScpIFdJVEggT1JESU5BTElUWSBv KGxpbmUsIG9yZCkKKykKKyhTRUxFQ1QgJ21pc3NpbmctaW4tY29weScgQVMga2luZCwgbmFtZSwg b3JkLCBsaW5lIEZST00gcGd0YmxfZGRsX3J0X29yaWcKKyBFWENFUFQKKyBTRUxFQ1QgJ21pc3Np bmctaW4tY29weScsIG5hbWUsIG9yZCwgbGluZSBGUk9NIGFmdGVyX2RkbCkKK1VOSU9OIEFMTAor KFNFTEVDVCAnZXh0cmEtaW4tY29weScgQVMga2luZCwgbmFtZSwgb3JkLCBsaW5lIEZST00gYWZ0 ZXJfZGRsCisgRVhDRVBUCisgU0VMRUNUICdleHRyYS1pbi1jb3B5JywgbmFtZSwgb3JkLCBsaW5l IEZST00gcGd0YmxfZGRsX3J0X29yaWcpCitPUkRFUiBCWSBraW5kLCBuYW1lLCBvcmQ7CisKKy0t IENsZWFudXAuCitEUk9QIFNDSEVNQSBwZ3RibF9kZGxfdGVzdCBDQVNDQURFOwotLSAKMi41MS4w Cgo= --000000000000f433b70653e47c6d--