Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1vE76p-005Lsd-Tc for pgsql-hackers@arkaria.postgresql.org; Wed, 29 Oct 2025 14:25:08 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1vE76o-001Ru4-Rr for pgsql-hackers@arkaria.postgresql.org; Wed, 29 Oct 2025 14:25:05 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1vE76o-001Rtw-8e for pgsql-hackers@lists.postgresql.org; Wed, 29 Oct 2025 14:25:05 +0000 Received: from mail-pj1-x1030.google.com ([2607:f8b0:4864:20::1030]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vE76k-004Oes-16 for pgsql-hackers@postgresql.org; Wed, 29 Oct 2025 14:25:04 +0000 Received: by mail-pj1-x1030.google.com with SMTP id 98e67ed59e1d1-33badfbbc48so9334791a91.2 for ; Wed, 29 Oct 2025 07:25:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1761747901; x=1762352701; darn=postgresql.org; h=in-reply-to:references:cc:to:from:subject:message-id:date :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=UMIUlOGzpnIZsaD/z7kZ630p4Z5mHDWpcwJTbxCRXK4=; b=VFpZP4XHINQzdD22el5ZKXbWgjzs9pLmPHkIk1VFOL2L1orWKAlZLueqm0DW4naBZC A3oMUq8eDihBqNhAOl+P7xxKGL8OeL535eCtr3e0pEd5RU76eKjSSCLHEMxsuWJpOPgS fB0vfZcURJ6FudhU7C8pdNDBvjT+vVKRM/vBQ+fTGVbP8XL/vmijC3VaCc+HAHCtCFvM owfm+Yv3NEhelN8tWeFs9Fj9HPbyp1A2G0biBSOdi64TXxX5vlPIL9oBSml3Zkbyua0b Gu7vAQ4z/PXGNPli+oHM1SWmtrV49EuogjOFLGq4OVaUFfAjArmqrWzponzJFCbzRV0b sK2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1761747901; x=1762352701; h=in-reply-to:references:cc:to:from:subject:message-id:date :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=UMIUlOGzpnIZsaD/z7kZ630p4Z5mHDWpcwJTbxCRXK4=; b=fJq222zBWbGbhx1Z+p9f0TaT6hI4e1P7L9Eorm6Dba2QdKl0lT3KsaGk93fix/MuIz DTVt1PPWfmW5Q1OQ07tzEOxh9/gHdNHTeJXvekdnhr4lqaWDKGOZfepQUR7E9B070tDV B8GXoxS5j3I55CmcP0xIKQLjzBLC2P5KrY5PrAioFEsmAC755biqh3ak5+0qhwqdb+4H 7hQkuIW6Kth4fxMPcfn7ttTH1PKmIU8L8gfbGCQBpi2gt5HOOcciAhcHD/YPA7Nt9fFJ 912dOkEwE9797mnTH68Cl0wFGieUMAn6Kiv7u1tsznSY9MG1trY4BjrFUAclnDzXytlR KL0w== X-Gm-Message-State: AOJu0Yz9RViCwmEm/1r8LWsNvDQ68FdFGme1xd5eKDRabyqrFJdWM9P1 rdIPamZVg2Fg1IdVhm5ih1rNrIkmvKWQoanM3hIM0uYQIEXRb14v09s9 X-Gm-Gg: ASbGncvgW/pjItFoj0zLjuhQTYdtmH6q/S4Gm3WswBrLL2zdYXAVxzXw5a8fPjzJFHc bFv1SjBRJgFgX89EGorgbtZ+iir7UB1grWicIBk82VXtpdt3O62X2B3WbZicpMtSrOn/iIP+i8l Gj77XVON0nnnM109ZF8uJ7CwJ1xC0oeSVOrONitBUmXybaqOpDOzDgYT/1flknnTji8ac4L5riK XHpw/VrhvasjgCqs3WE2Xd+Qka7LRebBaAiKdX1oCU6refTvJCJbm0Oc8q2EgHbWTk4oLGtBtBf 2pg9fiwATYNEVOvv7whTcUZp0eXgPTNEcBxmKbiYOb1rwZuYRD2cYMV7uD/8mMqNu553QRqU0Zb D9ijLZSUA9kRhB9LR7l89y3WgDpobi2JwV0k8b8Cufk22tsZzekgBTGE4UznID8VzSrRQPA/mHL LkiIm5yEFFEG6IG5gyzeQII0M= X-Google-Smtp-Source: AGHT+IEWAUc3dJKcocRnhONjP7Gbet7OfSydCMMOCZIFFLwG7FFa+EAoJloXbLRTo/74dEQi5Ghe+g== X-Received: by 2002:a17:90b:2e44:b0:32e:38b0:15f4 with SMTP id 98e67ed59e1d1-3403a142313mr4278095a91.7.1761747900781; Wed, 29 Oct 2025 07:25:00 -0700 (PDT) Received: from localhost ([2804:14d:328a:a59c:f817:1d4b:5dab:62d0]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b71268bd810sm14072206a12.6.2025.10.29.07.24.58 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 29 Oct 2025 07:25:00 -0700 (PDT) Content-Type: multipart/mixed; boundary=545bb1b47ce55957c3c8a9d03ae46335495f3a1b1ec2e0ce8c6f60499f7e Mime-Version: 1.0 Date: Wed, 29 Oct 2025 11:24:55 -0300 Message-Id: Subject: Re: Include extension path on pg_available_extensions From: "Matheus Alcantara" To: "Euler Taveira" , "Matheus Alcantara" , "Quan Zongliang" , "Chao Li" Cc: "pgsql-hackers" X-Mailer: aerc 0.21.0 References: <0DDF33A5-4F8C-4725-A124-B301147FA1FA@gmail.com> <5aaee744-342c-4ec8-a2ef-ffa0969cc51c@app.fastmail.com> <5f8b90df-b5fa-48ac-9931-f1608310cb52@yeah.net> In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --545bb1b47ce55957c3c8a9d03ae46335495f3a1b1ec2e0ce8c6f60499f7e Content-Type: multipart/alternative; boundary=15d78ecd7954b847c69b5ee3c44d2487cde45a65e63af433210c09ef5932 --15d78ecd7954b847c69b5ee3c44d2487cde45a65e63af433210c09ef5932 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Content-Type: text/plain; charset=UTF-8 On Tue Oct 28, 2025 at 5:56 PM -03, Euler Taveira wrote: > On Tue, Oct 28, 2025, at 9:29 AM, Matheus Alcantara wrote: >> So here it is, see attached. >> > > I took another look at this patch. > Thanks for reviewing! > ! This adds a new "location" column on pg_available_extensions and > ! pg_available_extension_versions views to show the path of locations tha= t > ! Postgres is seeing based on the extension_control_path GUC. > > Maybe the sentence above can be written in a different way such as > > Add a new "location" column to pg_available_extensions and > pg_available_extension_versions views. It exposes the directory that the > extension is located. > Sounds better, fixed. > ! User configured paths is only visible for users that has the > ! pg_read_extension_paths role, otherwise is > ! returned as a column value, the same behaviour that we already have on > ! pg_stat_activity. > > s/User configured paths is/User-defined locations are/ > Fixed. > +typedef struct > +{ > + char *macro; > + char *loc; > +} Location; > > Location is a generic name. I would use something like ExtensionLocation = or > ExtLocation or ExtControlPath. Do you really need a struct here? You are > storing the same element (location) in both members. Couldn't you use a s= ingle > string to represent the location (with and without the macro)? > ExtensionLocation sounds good, fixed for this. I think that the struct is necessary because we use the "loc" field for other things other than just printing on "location" column results. For instance, on pg_available_extension_versions() we get the list of ExtensionLocation's and use the "loc" field to call AllocateDir() and ReadDir() and then we pass the location pointer to get_available_versions_for_extension() that it will decide if it should use the "loc" or the "macro" field by calling the location_to_display(). So I don't think that we can use a single string to represent the location because we may use the raw location or the macro value depending on the case. > +/* > + * Return the location to display for the given Location based on the u= ser > + * privileges. If the user connected to the database don't have the > + * permissions is returned. > + */ > +static char * > +location_to_display(Location *loc) > +{ > > Could you improve this comment? > Fixed. > Return the extension location. If the current user doesn't have sufficien= t > privileges, don't show the location. You could also rename this function > (something like get_extension_location). Since has_privs_of_role returns = a > bool, you can simplify the code and call it directly into the if block. Y= ou can > also use GetUserId() directly instead of declaring another variable. > Fixed. > +{ oid =3D> '6434', oid_symbol =3D> 'ROLE_PG_READ_EXTENSION_PATHS', > + rolname =3D> 'pg_read_extension_paths', rolsuper =3D> 'f', rolinherit = =3D> 't', > + rolcreaterole =3D> 'f', rolcreatedb =3D> 'f', rolcanlogin =3D> 'f', > + rolreplication =3D> 'f', rolbypassrls =3D> 'f', rolconnlimit =3D> '-1'= , > + rolpassword =3D> '_null_', rolvaliduntil =3D> '_null_' }, > > I'm not convinced that we need a new predefined role just to control if i= t can > expose the extension location. Should it return the location only for > superusers? Can't one of the current predefined roles be used? If it does= n't > fit, you should probably use a generic name so this new predefined role c= an be > used by other extension-related stuff in the future. > Yeah, I think that we can limit this only for superusers. Fixed. > @@ -43,31 +51,63 @@ is($ecp, "\$system$sep$ext_dir$sep$ext_dir2", > $node->safe_psql('postgres', "CREATE EXTENSION $ext_name"); > $node->safe_psql('postgres', "CREATE EXTENSION $ext_name2"); > =20 > + > my $ret =3D $node->safe_psql('postgres', > "select * from pg_available_extensions where name =3D '$ext_name'"); > > Remove this new line. > Fixed. > Adding more tests is always a good thing. However, in this case, we can > simplify the tests. The current queries already cover the > get-the-extension-location case. If you add an additional test showing th= e > insufficient privilege case, that's fine. The other tests are basically > exercising the permission system. > Fixed. > Documentation is missing. These views are documented in system-views.sgml= . > Fixed -- Matheus Alcantara --15d78ecd7954b847c69b5ee3c44d2487cde45a65e63af433210c09ef5932-- --545bb1b47ce55957c3c8a9d03ae46335495f3a1b1ec2e0ce8c6f60499f7e Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=v4-0001-Add-path-of-extension-on-pg_available_extensions.patch Content-Type: text/plain; charset=utf-8; name=v4-0001-Add-path-of-extension-on-pg_available_extensions.patch RnJvbSBmYTY1NjBhODFjNzQ2ZWEyOGMxMjI1NmZjYmUwMzcyODUwMzg1MzMyIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXRoZXVzIEFsY2FudGFyYSA8bXRocy5kZXZAcG0ubWU+CkRh dGU6IE1vbiwgMTUgU2VwIDIwMjUgMTU6NDY6MjQgLTAzMDAKU3ViamVjdDogW1BBVENIIHY0XSBB ZGQgcGF0aCBvZiBleHRlbnNpb24gb24gcGdfYXZhaWxhYmxlX2V4dGVuc2lvbnMKCkFkZCBhIG5l dyAibG9jYXRpb24iIGNvbHVtbiB0byBwZ19hdmFpbGFibGVfZXh0ZW5zaW9ucyBhbmQKcGdfYXZh aWxhYmxlX2V4dGVuc2lvbl92ZXJzaW9ucyB2aWV3cy4gSXQgZXhwb3NlcyB0aGUgZGlyZWN0b3J5 IHRoYXQgdGhlCmV4dGVuc2lvbiBpcyBsb2NhdGVkLgoKVGhlIGRlZmF1bHQgc3lzdGVtIGxvY2F0 aW9uIGlzIHNob3cgYXMgJHN5c3RlbSBtYWNybywgdGhlIHNhbWUgdmFsdWUKdGhhdCBpcyB1c2Vk IHRvIGNvbmZpZ3VyZSB0aGUgZXh0ZW5zaW9uX2NvbnRyb2xfcGF0aCBHVUMuCgpVc2VyLWRlZmlu ZWQgbG9jYXRpb25zIGFyZSBvbmx5IHZpc2libGUgZm9yIHVzZXJzIHRoYXQgaGFzIHRoZQpwZ19y ZWFkX2V4dGVuc2lvbl9wYXRocyByb2xlLCBvdGhlcndpc2UgPGluc3VmZmljaWVudCBwcml2aWxl Z2U+IGlzCnJldHVybmVkIGFzIGEgY29sdW1uIHZhbHVlLCB0aGUgc2FtZSBiZWhhdmlvdXIgdGhh dCB3ZSBhbHJlYWR5IGhhdmUgb24KcGdfc3RhdF9hY3Rpdml0eS4KLS0tCiBkb2Mvc3JjL3NnbWwv c3lzdGVtLXZpZXdzLnNnbWwgICAgICAgICAgICAgICAgfCAyMiArKysrKwogc3JjL2JhY2tlbmQv Y2F0YWxvZy9zeXN0ZW1fdmlld3Muc3FsICAgICAgICAgIHwgIDQgKy0KIHNyYy9iYWNrZW5kL2Nv bW1hbmRzL2V4dGVuc2lvbi5jICAgICAgICAgICAgICB8IDk1ICsrKysrKysrKysrKysrKy0tLS0K IHNyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQgICAgICAgICAgICAgICB8IDEwICstCiAu Li4vdC8wMDFfZXh0ZW5zaW9uX2NvbnRyb2xfcGF0aC5wbCAgICAgICAgICAgfCAzNSArKysrKyst CiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3J1bGVzLm91dCAgICAgICAgICAgfCAxMCArLQog c3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QgICAgICAgICAgICAgIHwgIDIgKy0KIDcg ZmlsZXMgY2hhbmdlZCwgMTQyIGluc2VydGlvbnMoKyksIDM2IGRlbGV0aW9ucygtKQoKZGlmZiAt LWdpdCBhL2RvYy9zcmMvc2dtbC9zeXN0ZW0tdmlld3Muc2dtbCBiL2RvYy9zcmMvc2dtbC9zeXN0 ZW0tdmlld3Muc2dtbAppbmRleCA3OTcxNDk4ZmU3NS4uYWVmMGYwNjc0MzYgMTAwNjQ0Ci0tLSBh L2RvYy9zcmMvc2dtbC9zeXN0ZW0tdmlld3Muc2dtbAorKysgYi9kb2Mvc3JjL3NnbWwvc3lzdGVt LXZpZXdzLnNnbWwKQEAgLTYwNyw2ICs2MDcsMTcgQEAKICAgICAgICBDb21tZW50IHN0cmluZyBm cm9tIHRoZSBleHRlbnNpb24ncyBjb250cm9sIGZpbGUKICAgICAgIDwvcGFyYT48L2VudHJ5Pgog ICAgICA8L3Jvdz4KKworICAgICA8cm93PgorICAgICAgPGVudHJ5IHJvbGU9ImNhdGFsb2dfdGFi bGVfZW50cnkiPjxwYXJhIHJvbGU9ImNvbHVtbl9kZWZpbml0aW9uIj4KKyAgICAgICA8c3RydWN0 ZmllbGQ+bG9jYXRpb248L3N0cnVjdGZpZWxkPiA8dHlwZT50ZXh0PC90eXBlPgorICAgICAgPC9w YXJhPgorICAgICAgPHBhcmE+CisgICAgICAgVGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBleHRlbnNp b24gd2FzIGZvdW5kIGJhc2VkIG9uIHRoZSA8bGluaworICAgICAgIGxpbmtlbmQ9Imd1Yy1leHRl bnNpb24tY29udHJvbC1wYXRoIj48c3RydWN0bmFtZT5leHRlbnNpb25fY29udHJvbF9wYXRoPC9z dHJ1Y3RuYW1lPjwvbGluaz4KKyAgICAgICBHVUMuIE9ubHkgc3VwZXJ1c2VycyBjYW4gc2VlIHRo ZSBjb250ZW50cyBvZiB0aGlzIGNvbHVtbi4KKyAgICAgIDwvcGFyYT48L2VudHJ5PgorICAgICA8 L3Jvdz4KICAgICA8L3Rib2R5PgogICAgPC90Z3JvdXA+CiAgIDwvdGFibGU+CkBAIC03MzEsNiAr NzQyLDE3IEBACiAgICAgICAgQ29tbWVudCBzdHJpbmcgZnJvbSB0aGUgZXh0ZW5zaW9uJ3MgY29u dHJvbCBmaWxlCiAgICAgICA8L3BhcmE+PC9lbnRyeT4KICAgICAgPC9yb3c+CisKKyAgICAgPHJv dz4KKyAgICAgIDxlbnRyeSByb2xlPSJjYXRhbG9nX3RhYmxlX2VudHJ5Ij48cGFyYSByb2xlPSJj b2x1bW5fZGVmaW5pdGlvbiI+CisgICAgICAgPHN0cnVjdGZpZWxkPmxvY2F0aW9uPC9zdHJ1Y3Rm aWVsZD4gPHR5cGU+dGV4dDwvdHlwZT4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAg ICAgIFRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgZXh0ZW5zaW9uIHdhcyBmb3VuZCBiYXNlZCBvbiB0 aGUgPGxpbmsKKyAgICAgICBsaW5rZW5kPSJndWMtZXh0ZW5zaW9uLWNvbnRyb2wtcGF0aCI+PHN0 cnVjdG5hbWU+ZXh0ZW5zaW9uX2NvbnRyb2xfcGF0aDwvc3RydWN0bmFtZT48L2xpbms+CisgICAg ICAgR1VDLiBPbmx5IHN1cGVydXNlcnMgY2FuIHNlZSB0aGUgY29udGVudHMgb2YgdGhpcyBjb2x1 bW4uCisgICAgICA8L3BhcmE+PC9lbnRyeT4KKyAgICAgPC9yb3c+CiAgICAgPC90Ym9keT4KICAg IDwvdGdyb3VwPgogICA8L3RhYmxlPgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvY2F0YWxvZy9z eXN0ZW1fdmlld3Muc3FsIGIvc3JjL2JhY2tlbmQvY2F0YWxvZy9zeXN0ZW1fdmlld3Muc3FsCmlu ZGV4IGRlYzhkZjRmOGVlLi44YTA4NDkyNzk1NCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY2F0 YWxvZy9zeXN0ZW1fdmlld3Muc3FsCisrKyBiL3NyYy9iYWNrZW5kL2NhdGFsb2cvc3lzdGVtX3Zp ZXdzLnNxbApAQCAtNDEyLDE0ICs0MTIsMTQgQEAgQ1JFQVRFIFZJRVcgcGdfY3Vyc29ycyBBUwog CiBDUkVBVEUgVklFVyBwZ19hdmFpbGFibGVfZXh0ZW5zaW9ucyBBUwogICAgIFNFTEVDVCBFLm5h bWUsIEUuZGVmYXVsdF92ZXJzaW9uLCBYLmV4dHZlcnNpb24gQVMgaW5zdGFsbGVkX3ZlcnNpb24s Ci0gICAgICAgICAgIEUuY29tbWVudAorICAgICAgICAgICBFLmNvbW1lbnQsIEUubG9jYXRpb24K ICAgICAgIEZST00gcGdfYXZhaWxhYmxlX2V4dGVuc2lvbnMoKSBBUyBFCiAgICAgICAgICAgIExF RlQgSk9JTiBwZ19leHRlbnNpb24gQVMgWCBPTiBFLm5hbWUgPSBYLmV4dG5hbWU7CiAKIENSRUFU RSBWSUVXIHBnX2F2YWlsYWJsZV9leHRlbnNpb25fdmVyc2lvbnMgQVMKICAgICBTRUxFQ1QgRS5u YW1lLCBFLnZlcnNpb24sIChYLmV4dG5hbWUgSVMgTk9UIE5VTEwpIEFTIGluc3RhbGxlZCwKICAg ICAgICAgICAgRS5zdXBlcnVzZXIsIEUudHJ1c3RlZCwgRS5yZWxvY2F0YWJsZSwKLSAgICAgICAg ICAgRS5zY2hlbWEsIEUucmVxdWlyZXMsIEUuY29tbWVudAorICAgICAgICAgICBFLnNjaGVtYSwg RS5yZXF1aXJlcywgRS5jb21tZW50LCBFLmxvY2F0aW9uCiAgICAgICBGUk9NIHBnX2F2YWlsYWJs ZV9leHRlbnNpb25fdmVyc2lvbnMoKSBBUyBFCiAgICAgICAgICAgIExFRlQgSk9JTiBwZ19leHRl bnNpb24gQVMgWAogICAgICAgICAgICAgIE9OIEUubmFtZSA9IFguZXh0bmFtZSBBTkQgRS52ZXJz aW9uID0gWC5leHR2ZXJzaW9uOwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvZXh0 ZW5zaW9uLmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9leHRlbnNpb24uYwppbmRleCA5M2VmMWFk MTA2Zi4uZTY0YTY4MTc5MGUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2V4dGVu c2lvbi5jCisrKyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2V4dGVuc2lvbi5jCkBAIC0xMjYsNiAr MTI2LDIwIEBAIHR5cGVkZWYgc3RydWN0CiAJUGFyc2VMb2MJc3RtdF9sZW47CQkvKiBsZW5ndGgg aW4gYnl0ZXM7IDAgbWVhbnMgInJlc3Qgb2Ygc3RyaW5nIiAqLwogfSBzY3JpcHRfZXJyb3JfY2Fs bGJhY2tfYXJnOwogCisvKgorICogQSBsb2NhdGlvbiBjb25maWd1cmVkIG9uIGV4dGVuc2lvbl9j b250cm9sX3BhdGggR1VDLgorICoKKyAqIFRoZSBtYWNybyBmaWVsZCBzdG9yZXMgdGhlIG5hbWUg b2YgYSBtYWNybyAoZm9yIGV4YW1wbGUg4oCcJHN5c3RlbeKAnSkgdGhhdAorICogZXh0ZW5zaW9u X2NvbnRyb2xfcGF0aCBzdXBwb3J0cywgd2hpY2ggaXMgcmVwbGFjZWQgYnkgYSBzeXN0ZW0gdmFs dWUgdGhhdCBpcworICogc3RvcmVkIGluIGxvYy4gRm9yIGN1c3RvbSBwYXRocyB0aGF0IGRvbid0 IGhhdmUgYSBtYWNybyB0aGUgbWFjcm8gZmllbGQgaXMKKyAqIE5VTEwuCisgKi8KK3R5cGVkZWYg c3RydWN0Cit7CisJY2hhcgkgICAqbWFjcm87CisJY2hhcgkgICAqbG9jOworfSBFeHRlbnNpb25M b2NhdGlvbjsKKwogLyogTG9jYWwgZnVuY3Rpb25zICovCiBzdGF0aWMgTGlzdCAqZmluZF91cGRh dGVfcGF0aChMaXN0ICpldmlfbGlzdCwKIAkJCQkJCQkgIEV4dGVuc2lvblZlcnNpb25JbmZvICpl dmlfc3RhcnQsCkBAIC0xNDAsNyArMTU0LDggQEAgc3RhdGljIE9pZAlnZXRfcmVxdWlyZWRfZXh0 ZW5zaW9uKGNoYXIgKnJlcUV4dGVuc2lvbk5hbWUsCiAJCQkJCQkJCSAgIGJvb2wgaXNfY3JlYXRl KTsKIHN0YXRpYyB2b2lkIGdldF9hdmFpbGFibGVfdmVyc2lvbnNfZm9yX2V4dGVuc2lvbihFeHRl bnNpb25Db250cm9sRmlsZSAqcGNvbnRyb2wsCiAJCQkJCQkJCQkJCQkgVHVwbGVzdG9yZXN0YXRl ICp0dXBzdG9yZSwKLQkJCQkJCQkJCQkJCSBUdXBsZURlc2MgdHVwZGVzYyk7CisJCQkJCQkJCQkJ CQkgVHVwbGVEZXNjIHR1cGRlc2MsCisJCQkJCQkJCQkJCQkgRXh0ZW5zaW9uTG9jYXRpb24gKmxv Y2F0aW9uKTsKIHN0YXRpYyBEYXR1bSBjb252ZXJ0X3JlcXVpcmVzX3RvX2RhdHVtKExpc3QgKnJl cXVpcmVzKTsKIHN0YXRpYyB2b2lkIEFwcGx5RXh0ZW5zaW9uVXBkYXRlcyhPaWQgZXh0ZW5zaW9u T2lkLAogCQkJCQkJCQkgIEV4dGVuc2lvbkNvbnRyb2xGaWxlICpwY29udHJvbCwKQEAgLTE1Nyw2 ICsxNzIsMjYgQEAgc3RhdGljIEV4dGVuc2lvbkNvbnRyb2xGaWxlICpuZXdfRXh0ZW5zaW9uQ29u dHJvbEZpbGUoY29uc3QgY2hhciAqZXh0bmFtZSk7CiAKIGNoYXIJICAgKmZpbmRfaW5fcGF0aHMo Y29uc3QgY2hhciAqYmFzZW5hbWUsIExpc3QgKnBhdGhzKTsKIAorLyoKKyAqICBSZXR1cm4gdGhl IGV4dGVuc2lvbiBsb2NhdGlvbi4gSWYgdGhlIGN1cnJlbnQgdXNlciBkb2Vzbid0IGhhdmUgc3Vm ZmljaWVudAorICogIHByaXZpbGVnZXMsIGRvbid0IHNob3cgdGhlIGxvY2F0aW9uLgorICovCitz dGF0aWMgY2hhciAqCitnZXRfZXh0ZW5zaW9uX2xvY2F0aW9uKEV4dGVuc2lvbkxvY2F0aW9uICps b2MpCit7CisJLyogV2Ugb25seSB3YW50IHRvIHNob3cgZXh0ZW5zaW9uIHBhdGhzIGZvciBzdXBl cnVzZXJzLiAqLworCWlmIChzdXBlcnVzZXJfYXJnKEdldFVzZXJJZCgpKSkKKwl7CisJCS8qIFJl dHVybiB0aGUgbWFjcm8gdmFsdWUgaWYgaXQncyBwcmVzZW50IHRvIGRvbid0IHNob3cgc3lzdGVt IHBhdGhzLiAqLworCQlpZiAobG9jLT5tYWNybyA9PSBOVUxMKQorCQkJcmV0dXJuIGxvYy0+bG9j OworCQllbHNlCisJCQlyZXR1cm4gbG9jLT5tYWNybzsKKwl9CisJZWxzZQorCQlyZXR1cm4gIjxp bnN1ZmZpY2llbnQgcHJpdmlsZWdlPiI7Cit9CisKIC8qCiAgKiBnZXRfZXh0ZW5zaW9uX29pZCAt IGdpdmVuIGFuIGV4dGVuc2lvbiBuYW1lLCBsb29rIHVwIHRoZSBPSUQKICAqCkBAIC0zNTQsNyAr Mzg5LDExIEBAIGdldF9leHRlbnNpb25fY29udHJvbF9kaXJlY3Rvcmllcyh2b2lkKQogCiAJaWYg KHN0cmxlbihFeHRlbnNpb25fY29udHJvbF9wYXRoKSA9PSAwKQogCXsKLQkJcGF0aHMgPSBsYXBw ZW5kKHBhdGhzLCBzeXN0ZW1fZGlyKTsKKwkJRXh0ZW5zaW9uTG9jYXRpb24gKmxvY2F0aW9uID0g cGFsbG9jX29iamVjdChFeHRlbnNpb25Mb2NhdGlvbik7CisKKwkJbG9jYXRpb24tPm1hY3JvID0g TlVMTDsKKwkJbG9jYXRpb24tPmxvYyA9IHN5c3RlbV9kaXI7CisJCXBhdGhzID0gbGFwcGVuZChw YXRocywgbG9jYXRpb24pOwogCX0KIAllbHNlCiAJewpAQCAtMzY2LDYgKzQwNSw3IEBAIGdldF9l eHRlbnNpb25fY29udHJvbF9kaXJlY3Rvcmllcyh2b2lkKQogCQkJaW50CQkJbGVuOwogCQkJY2hh cgkgICAqbWFuZ2xlZDsKIAkJCWNoYXIJICAgKnBpZWNlID0gZmlyc3RfcGF0aF92YXJfc2VwYXJh dG9yKGVjcCk7CisJCQlFeHRlbnNpb25Mb2NhdGlvbiAqbG9jYXRpb24gPSBwYWxsb2Nfb2JqZWN0 KEV4dGVuc2lvbkxvY2F0aW9uKTsKIAogCQkJLyogR2V0IHRoZSBsZW5ndGggb2YgdGhlIG5leHQg cGF0aCBvbiBlY3AgKi8KIAkJCWlmIChwaWVjZSA9PSBOVUxMKQpAQCAtMzgyLDE1ICs0MjIsMjEg QEAgZ2V0X2V4dGVuc2lvbl9jb250cm9sX2RpcmVjdG9yaWVzKHZvaWQpCiAJCQkgKiBzdWZmaXgg aWYgaXQgaXMgYSBjdXN0b20gZXh0ZW5zaW9uIGNvbnRyb2wgcGF0aC4KIAkJCSAqLwogCQkJaWYg KHN0cmNtcChwaWVjZSwgIiRzeXN0ZW0iKSA9PSAwKQorCQkJeworCQkJCWxvY2F0aW9uLT5tYWNy byA9IHBzdHJkdXAocGllY2UpOwogCQkJCW1hbmdsZWQgPSBzdWJzdGl0dXRlX3BhdGhfbWFjcm8o cGllY2UsICIkc3lzdGVtIiwgc3lzdGVtX2Rpcik7CisJCQl9CiAJCQllbHNlCisJCQl7CisJCQkJ bG9jYXRpb24tPm1hY3JvID0gTlVMTDsKIAkJCQltYW5nbGVkID0gcHNwcmludGYoIiVzL2V4dGVu c2lvbiIsIHBpZWNlKTsKLQorCQkJfQogCQkJcGZyZWUocGllY2UpOwogCiAJCQkvKiBDYW5vbmlj YWxpemUgdGhlIHBhdGggYmFzZWQgb24gdGhlIE9TIGFuZCBhZGQgdG8gdGhlIGxpc3QgKi8KIAkJ CWNhbm9uaWNhbGl6ZV9wYXRoKG1hbmdsZWQpOwotCQkJcGF0aHMgPSBsYXBwZW5kKHBhdGhzLCBt YW5nbGVkKTsKKwkJCWxvY2F0aW9uLT5sb2MgPSBtYW5nbGVkOworCQkJcGF0aHMgPSBsYXBwZW5k KHBhdGhzLCBsb2NhdGlvbik7CiAKIAkJCS8qIEJyZWFrIGlmIGVjcCBpcyBlbXB0eSBvciBtb3Zl IHRvIHRoZSBuZXh0IHBhdGggb24gZWNwICovCiAJCQlpZiAoZWNwW2xlbl0gPT0gJ1wwJykKQEAg LTIyMTUsOSArMjI2MSw5IEBAIHBnX2F2YWlsYWJsZV9leHRlbnNpb25zKFBHX0ZVTkNUSU9OX0FS R1MpCiAKIAlsb2NhdGlvbnMgPSBnZXRfZXh0ZW5zaW9uX2NvbnRyb2xfZGlyZWN0b3JpZXMoKTsK IAotCWZvcmVhY2hfcHRyKGNoYXIsIGxvY2F0aW9uLCBsb2NhdGlvbnMpCisJZm9yZWFjaF9wdHIo RXh0ZW5zaW9uTG9jYXRpb24sIGxvY2F0aW9uLCBsb2NhdGlvbnMpCiAJewotCQlkaXIgPSBBbGxv Y2F0ZURpcihsb2NhdGlvbik7CisJCWRpciA9IEFsbG9jYXRlRGlyKGxvY2F0aW9uLT5sb2MpOwog CiAJCS8qCiAJCSAqIElmIHRoZSBjb250cm9sIGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0LCB3ZSB3 YW50IHRvIHNpbGVudGx5IHJldHVybgpAQCAtMjIyOSwxMyArMjI3NSwxMyBAQCBwZ19hdmFpbGFi bGVfZXh0ZW5zaW9ucyhQR19GVU5DVElPTl9BUkdTKQogCQl9CiAJCWVsc2UKIAkJewotCQkJd2hp bGUgKChkZSA9IFJlYWREaXIoZGlyLCBsb2NhdGlvbikpICE9IE5VTEwpCisJCQl3aGlsZSAoKGRl ID0gUmVhZERpcihkaXIsIGxvY2F0aW9uLT5sb2MpKSAhPSBOVUxMKQogCQkJewogCQkJCUV4dGVu c2lvbkNvbnRyb2xGaWxlICpjb250cm9sOwogCQkJCWNoYXIJICAgKmV4dG5hbWU7CiAJCQkJU3Ry aW5nCSAgICpleHRuYW1lX3N0cjsKLQkJCQlEYXR1bQkJdmFsdWVzWzNdOwotCQkJCWJvb2wJCW51 bGxzWzNdOworCQkJCURhdHVtCQl2YWx1ZXNbNF07CisJCQkJYm9vbAkJbnVsbHNbNF07CiAKIAkJ CQlpZiAoIWlzX2V4dGVuc2lvbl9jb250cm9sX2ZpbGVuYW1lKGRlLT5kX25hbWUpKQogCQkJCQlj b250aW51ZTsKQEAgLTIyNTksNyArMjMwNSw3IEBAIHBnX2F2YWlsYWJsZV9leHRlbnNpb25zKFBH X0ZVTkNUSU9OX0FSR1MpCiAJCQkJCWZvdW5kX2V4dCA9IGxhcHBlbmQoZm91bmRfZXh0LCBleHRu YW1lX3N0cik7CiAKIAkJCQljb250cm9sID0gbmV3X0V4dGVuc2lvbkNvbnRyb2xGaWxlKGV4dG5h bWUpOwotCQkJCWNvbnRyb2wtPmNvbnRyb2xfZGlyID0gcHN0cmR1cChsb2NhdGlvbik7CisJCQkJ Y29udHJvbC0+Y29udHJvbF9kaXIgPSBwc3RyZHVwKGxvY2F0aW9uLT5sb2MpOwogCQkJCXBhcnNl X2V4dGVuc2lvbl9jb250cm9sX2ZpbGUoY29udHJvbCwgTlVMTCk7CiAKIAkJCQltZW1zZXQodmFs dWVzLCAwLCBzaXplb2YodmFsdWVzKSk7CkBAIC0yMjc5LDYgKzIzMjUsOSBAQCBwZ19hdmFpbGFi bGVfZXh0ZW5zaW9ucyhQR19GVU5DVElPTl9BUkdTKQogCQkJCWVsc2UKIAkJCQkJdmFsdWVzWzJd ID0gQ1N0cmluZ0dldFRleHREYXR1bShjb250cm9sLT5jb21tZW50KTsKIAorCQkJCS8qIGxvY2F0 aW9uICovCisJCQkJdmFsdWVzWzNdID0gQ1N0cmluZ0dldFRleHREYXR1bShnZXRfZXh0ZW5zaW9u X2xvY2F0aW9uKGxvY2F0aW9uKSk7CisKIAkJCQl0dXBsZXN0b3JlX3B1dHZhbHVlcyhyc2luZm8t PnNldFJlc3VsdCwgcnNpbmZvLT5zZXREZXNjLAogCQkJCQkJCQkJIHZhbHVlcywgbnVsbHMpOwog CQkJfQpAQCAtMjMxMyw5ICsyMzYyLDkgQEAgcGdfYXZhaWxhYmxlX2V4dGVuc2lvbl92ZXJzaW9u cyhQR19GVU5DVElPTl9BUkdTKQogCiAJbG9jYXRpb25zID0gZ2V0X2V4dGVuc2lvbl9jb250cm9s X2RpcmVjdG9yaWVzKCk7CiAKLQlmb3JlYWNoX3B0cihjaGFyLCBsb2NhdGlvbiwgbG9jYXRpb25z KQorCWZvcmVhY2hfcHRyKEV4dGVuc2lvbkxvY2F0aW9uLCBsb2NhdGlvbiwgbG9jYXRpb25zKQog CXsKLQkJZGlyID0gQWxsb2NhdGVEaXIobG9jYXRpb24pOworCQlkaXIgPSBBbGxvY2F0ZURpcihs b2NhdGlvbi0+bG9jKTsKIAogCQkvKgogCQkgKiBJZiB0aGUgY29udHJvbCBkaXJlY3RvcnkgZG9l c24ndCBleGlzdCwgd2Ugd2FudCB0byBzaWxlbnRseSByZXR1cm4KQEAgLTIzMjcsNyArMjM3Niw3 IEBAIHBnX2F2YWlsYWJsZV9leHRlbnNpb25fdmVyc2lvbnMoUEdfRlVOQ1RJT05fQVJHUykKIAkJ fQogCQllbHNlCiAJCXsKLQkJCXdoaWxlICgoZGUgPSBSZWFkRGlyKGRpciwgbG9jYXRpb24pKSAh PSBOVUxMKQorCQkJd2hpbGUgKChkZSA9IFJlYWREaXIoZGlyLCBsb2NhdGlvbi0+bG9jKSkgIT0g TlVMTCkKIAkJCXsKIAkJCQlFeHRlbnNpb25Db250cm9sRmlsZSAqY29udHJvbDsKIAkJCQljaGFy CSAgICpleHRuYW1lOwpAQCAtMjM1NiwxMiArMjQwNSwxMyBAQCBwZ19hdmFpbGFibGVfZXh0ZW5z aW9uX3ZlcnNpb25zKFBHX0ZVTkNUSU9OX0FSR1MpCiAKIAkJCQkvKiByZWFkIHRoZSBjb250cm9s IGZpbGUgKi8KIAkJCQljb250cm9sID0gbmV3X0V4dGVuc2lvbkNvbnRyb2xGaWxlKGV4dG5hbWUp OwotCQkJCWNvbnRyb2wtPmNvbnRyb2xfZGlyID0gcHN0cmR1cChsb2NhdGlvbik7CisJCQkJY29u dHJvbC0+Y29udHJvbF9kaXIgPSBwc3RyZHVwKGxvY2F0aW9uLT5sb2MpOwogCQkJCXBhcnNlX2V4 dGVuc2lvbl9jb250cm9sX2ZpbGUoY29udHJvbCwgTlVMTCk7CiAKIAkJCQkvKiBzY2FuIGV4dGVu c2lvbidzIHNjcmlwdCBkaXJlY3RvcnkgZm9yIGluc3RhbGwgc2NyaXB0cyAqLwogCQkJCWdldF9h dmFpbGFibGVfdmVyc2lvbnNfZm9yX2V4dGVuc2lvbihjb250cm9sLCByc2luZm8tPnNldFJlc3Vs dCwKLQkJCQkJCQkJCQkJCQkgcnNpbmZvLT5zZXREZXNjKTsKKwkJCQkJCQkJCQkJCQkgcnNpbmZv LT5zZXREZXNjLAorCQkJCQkJCQkJCQkJCSBsb2NhdGlvbik7CiAJCQl9CiAKIAkJCUZyZWVEaXIo ZGlyKTsKQEAgLTIzNzgsNyArMjQyOCw4IEBAIHBnX2F2YWlsYWJsZV9leHRlbnNpb25fdmVyc2lv bnMoUEdfRlVOQ1RJT05fQVJHUykKIHN0YXRpYyB2b2lkCiBnZXRfYXZhaWxhYmxlX3ZlcnNpb25z X2Zvcl9leHRlbnNpb24oRXh0ZW5zaW9uQ29udHJvbEZpbGUgKnBjb250cm9sLAogCQkJCQkJCQkJ IFR1cGxlc3RvcmVzdGF0ZSAqdHVwc3RvcmUsCi0JCQkJCQkJCQkgVHVwbGVEZXNjIHR1cGRlc2Mp CisJCQkJCQkJCQkgVHVwbGVEZXNjIHR1cGRlc2MsCisJCQkJCQkJCQkgRXh0ZW5zaW9uTG9jYXRp b24gKmxvY2F0aW9uKQogewogCUxpc3QJICAgKmV2aV9saXN0OwogCUxpc3RDZWxsICAgKmxjOwpA QCAtMjM5MSw4ICsyNDQyLDggQEAgZ2V0X2F2YWlsYWJsZV92ZXJzaW9uc19mb3JfZXh0ZW5zaW9u KEV4dGVuc2lvbkNvbnRyb2xGaWxlICpwY29udHJvbCwKIAl7CiAJCUV4dGVuc2lvblZlcnNpb25J bmZvICpldmkgPSAoRXh0ZW5zaW9uVmVyc2lvbkluZm8gKikgbGZpcnN0KGxjKTsKIAkJRXh0ZW5z aW9uQ29udHJvbEZpbGUgKmNvbnRyb2w7Ci0JCURhdHVtCQl2YWx1ZXNbOF07Ci0JCWJvb2wJCW51 bGxzWzhdOworCQlEYXR1bQkJdmFsdWVzWzldOworCQlib29sCQludWxsc1s5XTsKIAkJTGlzdENl bGwgICAqbGMyOwogCiAJCWlmICghZXZpLT5pbnN0YWxsYWJsZSkKQEAgLTI0MzQsNiArMjQ4NSw5 IEBAIGdldF9hdmFpbGFibGVfdmVyc2lvbnNfZm9yX2V4dGVuc2lvbihFeHRlbnNpb25Db250cm9s RmlsZSAqcGNvbnRyb2wsCiAJCWVsc2UKIAkJCXZhbHVlc1s3XSA9IENTdHJpbmdHZXRUZXh0RGF0 dW0oY29udHJvbC0+Y29tbWVudCk7CiAKKwkJLyogbG9jYXRpb24gKi8KKwkJdmFsdWVzWzhdID0g Q1N0cmluZ0dldFRleHREYXR1bShnZXRfZXh0ZW5zaW9uX2xvY2F0aW9uKGxvY2F0aW9uKSk7CisK IAkJdHVwbGVzdG9yZV9wdXR2YWx1ZXModHVwc3RvcmUsIHR1cGRlc2MsIHZhbHVlcywgbnVsbHMp OwogCiAJCS8qCkBAIC0yNDc1LDYgKzI1MjksOCBAQCBnZXRfYXZhaWxhYmxlX3ZlcnNpb25zX2Zv cl9leHRlbnNpb24oRXh0ZW5zaW9uQ29udHJvbEZpbGUgKnBjb250cm9sLAogCQkJCX0KIAkJCQkv KiBjb21tZW50IHN0YXlzIHRoZSBzYW1lICovCiAKKwkJCQkvKiBsb2NhdGlvbiBzdGF5cyB0aGUg c2FtZSAqLworCiAJCQkJdHVwbGVzdG9yZV9wdXR2YWx1ZXModHVwc3RvcmUsIHR1cGRlc2MsIHZh bHVlcywgbnVsbHMpOwogCQkJfQogCQl9CkBAIC0zOTAzLDcgKzM5NTksOCBAQCBmaW5kX2luX3Bh dGhzKGNvbnN0IGNoYXIgKmJhc2VuYW1lLCBMaXN0ICpwYXRocykKIAogCWZvcmVhY2goY2VsbCwg cGF0aHMpCiAJewotCQljaGFyCSAgICpwYXRoID0gbGZpcnN0KGNlbGwpOworCQlFeHRlbnNpb25M b2NhdGlvbiAqbG9jYXRpb24gPSBsZmlyc3QoY2VsbCk7CisJCWNoYXIJICAgKnBhdGggPSBsb2Nh dGlvbi0+bG9jOwogCQljaGFyCSAgICpmdWxsOwogCiAJCUFzc2VydChwYXRoICE9IE5VTEwpOwpk aWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdCBiL3NyYy9pbmNsdWRl L2NhdGFsb2cvcGdfcHJvYy5kYXQKaW5kZXggOTEyMWEzODJmNzYuLjg2ZDA1MDlmMmM3IDEwMDY0 NAotLS0gYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0CisrKyBiL3NyYy9pbmNsdWRl L2NhdGFsb2cvcGdfcHJvYy5kYXQKQEAgLTEwNzQzLDE2ICsxMDc0MywxNiBAQAogeyBvaWQgPT4g JzMwODInLCBkZXNjciA9PiAnbGlzdCBhdmFpbGFibGUgZXh0ZW5zaW9ucycsCiAgIHByb25hbWUg PT4gJ3BnX2F2YWlsYWJsZV9leHRlbnNpb25zJywgcHJvY29zdCA9PiAnMTAnLCBwcm9yb3dzID0+ ICcxMDAnLAogICBwcm9yZXRzZXQgPT4gJ3QnLCBwcm92b2xhdGlsZSA9PiAncycsIHByb3JldHR5 cGUgPT4gJ3JlY29yZCcsCi0gIHByb2FyZ3R5cGVzID0+ICcnLCBwcm9hbGxhcmd0eXBlcyA9PiAn e25hbWUsdGV4dCx0ZXh0fScsCi0gIHByb2FyZ21vZGVzID0+ICd7byxvLG99JywgcHJvYXJnbmFt ZXMgPT4gJ3tuYW1lLGRlZmF1bHRfdmVyc2lvbixjb21tZW50fScsCisgIHByb2FyZ3R5cGVzID0+ ICcnLCBwcm9hbGxhcmd0eXBlcyA9PiAne25hbWUsdGV4dCx0ZXh0LHRleHR9JywKKyAgcHJvYXJn bW9kZXMgPT4gJ3tvLG8sbyxvfScsIHByb2FyZ25hbWVzID0+ICd7bmFtZSxkZWZhdWx0X3ZlcnNp b24sY29tbWVudCxsb2NhdGlvbn0nLAogICBwcm9zcmMgPT4gJ3BnX2F2YWlsYWJsZV9leHRlbnNp b25zJyB9LAogeyBvaWQgPT4gJzMwODMnLCBkZXNjciA9PiAnbGlzdCBhdmFpbGFibGUgZXh0ZW5z aW9uIHZlcnNpb25zJywKICAgcHJvbmFtZSA9PiAncGdfYXZhaWxhYmxlX2V4dGVuc2lvbl92ZXJz aW9ucycsIHByb2Nvc3QgPT4gJzEwJywKICAgcHJvcm93cyA9PiAnMTAwJywgcHJvcmV0c2V0ID0+ ICd0JywgcHJvdm9sYXRpbGUgPT4gJ3MnLAogICBwcm9yZXR0eXBlID0+ICdyZWNvcmQnLCBwcm9h cmd0eXBlcyA9PiAnJywKLSAgcHJvYWxsYXJndHlwZXMgPT4gJ3tuYW1lLHRleHQsYm9vbCxib29s LGJvb2wsbmFtZSxfbmFtZSx0ZXh0fScsCi0gIHByb2FyZ21vZGVzID0+ICd7byxvLG8sbyxvLG8s byxvfScsCi0gIHByb2FyZ25hbWVzID0+ICd7bmFtZSx2ZXJzaW9uLHN1cGVydXNlcix0cnVzdGVk LHJlbG9jYXRhYmxlLHNjaGVtYSxyZXF1aXJlcyxjb21tZW50fScsCisgIHByb2FsbGFyZ3R5cGVz ID0+ICd7bmFtZSx0ZXh0LGJvb2wsYm9vbCxib29sLG5hbWUsX25hbWUsdGV4dCx0ZXh0fScsCisg IHByb2FyZ21vZGVzID0+ICd7byxvLG8sbyxvLG8sbyxvLG99JywKKyAgcHJvYXJnbmFtZXMgPT4g J3tuYW1lLHZlcnNpb24sc3VwZXJ1c2VyLHRydXN0ZWQscmVsb2NhdGFibGUsc2NoZW1hLHJlcXVp cmVzLGNvbW1lbnQsbG9jYXRpb259JywKICAgcHJvc3JjID0+ICdwZ19hdmFpbGFibGVfZXh0ZW5z aW9uX3ZlcnNpb25zJyB9LAogeyBvaWQgPT4gJzMwODQnLCBkZXNjciA9PiAnbGlzdCBhbiBleHRl bnNpb25cJ3MgdmVyc2lvbiB1cGRhdGUgcGF0aHMnLAogICBwcm9uYW1lID0+ICdwZ19leHRlbnNp b25fdXBkYXRlX3BhdGhzJywgcHJvY29zdCA9PiAnMTAnLCBwcm9yb3dzID0+ICcxMDAnLApkaWZm IC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2V4dGVuc2lvbnMvdC8wMDFfZXh0ZW5zaW9u X2NvbnRyb2xfcGF0aC5wbCBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9leHRlbnNpb25zL3QvMDAx X2V4dGVuc2lvbl9jb250cm9sX3BhdGgucGwKaW5kZXggN2ZiZTViZGUzMzIuLjQ5OGQ5Njk2OWYw IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfZXh0ZW5zaW9ucy90LzAwMV9leHRl bnNpb25fY29udHJvbF9wYXRoLnBsCisrKyBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9leHRlbnNp b25zL3QvMDAxX2V4dGVuc2lvbl9jb250cm9sX3BhdGgucGwKQEAgLTI1LDYgKzI1LDEwIEBAIG15 ICRleHRfbmFtZTIgPSAidGVzdF9jdXN0b21fZXh0X3BhdGhzX3VzaW5nX2RpcmVjdG9yeSI7CiBt a3BhdGgoIiRleHRfZGlyLyRleHRfbmFtZTIiKTsKIGNyZWF0ZV9leHRlbnNpb24oJGV4dF9uYW1l MiwgJGV4dF9kaXIsICRleHRfbmFtZTIpOwogCisjIE1ha2Ugd2luZG93cyBwYXRoIHVzZSBVbml4 IHNsYXNoZXMgYXMgY2Fub25pY2FsaXplX3BhdGgoKSBpcyBjYWxsZWQgd2hlbgorIyBjb2xsZWN0 aW5nIGV4dGVuc2lvbiBjb250cm9sIHBhdGhzLiBTZWUgZ2V0X2V4dGVuc2lvbl9jb250cm9sX2Rp cmVjdG9yaWVzKCkuCitteSAkZXh0X2Rpcl9jYW5vbmljYWxpemVkID0gJHdpbmRvd3Nfb3MgPyAo JGV4dF9kaXIgPX4gcy9cXC9cLy9ncikgOiAkZXh0X2RpcjsKKwogIyBVc2UgdGhlIGNvcnJlY3Qg c2VwYXJhdG9yIGFuZCBlc2NhcGUgXCB3aGVuIHJ1bm5pbmcgb24gV2luZG93cy4KIG15ICRzZXAg PSAkd2luZG93c19vcyA/ICI7IiA6ICI6IjsKICRub2RlLT5hcHBlbmRfY29uZigKQEAgLTM1LDYg KzM5LDEwIEBAIGV4dGVuc2lvbl9jb250cm9sX3BhdGggPSAnXCRzeXN0ZW0kc2VwQHtbICR3aW5k b3dzX29zID8gKCRleHRfZGlyID1+IHMvXFwvXFxcXC9nCiAjIFN0YXJ0IG5vZGUKICRub2RlLT5z dGFydDsKIAorIyBDcmVhdGUgYW4gdXNlciB0byB0ZXN0IHBlcm1pc3Npb25zIHRvIHJlYWQgZXh0 ZW5zaW9uIGxvY2F0aW9ucy4KK215ICR1c2VyID0gInVzZXIwMSI7Ciskbm9kZS0+c2FmZV9wc3Fs KCdwb3N0Z3JlcycsICJDUkVBVEUgVVNFUiAkdXNlciIpOworCiBteSAkZWNwID0gJG5vZGUtPnNh ZmVfcHNxbCgncG9zdGdyZXMnLCAnc2hvdyBleHRlbnNpb25fY29udHJvbF9wYXRoOycpOwogCiBp cygkZWNwLCAiXCRzeXN0ZW0kc2VwJGV4dF9kaXIkc2VwJGV4dF9kaXIyIiwKQEAgLTQ2LDI4ICs1 NCw0NiBAQCAkbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJDUkVBVEUgRVhURU5TSU9OICRl eHRfbmFtZTIiKTsKIG15ICRyZXQgPSAkbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsCiAJInNl bGVjdCAqIGZyb20gcGdfYXZhaWxhYmxlX2V4dGVuc2lvbnMgd2hlcmUgbmFtZSA9ICckZXh0X25h bWUnIik7CiBpcyggJHJldCwKLQkidGVzdF9jdXN0b21fZXh0X3BhdGhzfDEuMHwxLjB8VGVzdCBl eHRlbnNpb25fY29udHJvbF9wYXRoIiwKKwkidGVzdF9jdXN0b21fZXh0X3BhdGhzfDEuMHwxLjB8 VGVzdCBleHRlbnNpb25fY29udHJvbF9wYXRofCRleHRfZGlyX2Nhbm9uaWNhbGl6ZWQvZXh0ZW5z aW9uIiwKIAkiZXh0ZW5zaW9uIGlzIGluc3RhbGxlZCBjb3JyZWN0bHkgb24gcGdfYXZhaWxhYmxl X2V4dGVuc2lvbnMiKTsKIAogJHJldCA9ICRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywKIAki c2VsZWN0ICogZnJvbSBwZ19hdmFpbGFibGVfZXh0ZW5zaW9uX3ZlcnNpb25zIHdoZXJlIG5hbWUg PSAnJGV4dF9uYW1lJyIpOwogaXMoICRyZXQsCi0JInRlc3RfY3VzdG9tX2V4dF9wYXRoc3wxLjB8 dHx0fGZ8dHx8fFRlc3QgZXh0ZW5zaW9uX2NvbnRyb2xfcGF0aCIsCisJInRlc3RfY3VzdG9tX2V4 dF9wYXRoc3wxLjB8dHx0fGZ8dHx8fFRlc3QgZXh0ZW5zaW9uX2NvbnRyb2xfcGF0aHwkZXh0X2Rp cl9jYW5vbmljYWxpemVkL2V4dGVuc2lvbiIsCiAJImV4dGVuc2lvbiBpcyBpbnN0YWxsZWQgY29y cmVjdGx5IG9uIHBnX2F2YWlsYWJsZV9leHRlbnNpb25fdmVyc2lvbnMiKTsKIAogJHJldCA9ICRu b2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywKIAkic2VsZWN0ICogZnJvbSBwZ19hdmFpbGFibGVf ZXh0ZW5zaW9ucyB3aGVyZSBuYW1lID0gJyRleHRfbmFtZTInIik7CiBpcyggJHJldCwKLQkidGVz dF9jdXN0b21fZXh0X3BhdGhzX3VzaW5nX2RpcmVjdG9yeXwxLjB8MS4wfFRlc3QgZXh0ZW5zaW9u X2NvbnRyb2xfcGF0aCIsCisJInRlc3RfY3VzdG9tX2V4dF9wYXRoc191c2luZ19kaXJlY3Rvcnl8 MS4wfDEuMHxUZXN0IGV4dGVuc2lvbl9jb250cm9sX3BhdGh8JGV4dF9kaXJfY2Fub25pY2FsaXpl ZC9leHRlbnNpb24iLAogCSJleHRlbnNpb24gaXMgaW5zdGFsbGVkIGNvcnJlY3RseSBvbiBwZ19h dmFpbGFibGVfZXh0ZW5zaW9ucyIpOwogCiAkcmV0ID0gJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdy ZXMnLAogCSJzZWxlY3QgKiBmcm9tIHBnX2F2YWlsYWJsZV9leHRlbnNpb25fdmVyc2lvbnMgd2hl cmUgbmFtZSA9ICckZXh0X25hbWUyJyIKICk7CiBpcyggJHJldCwKLQkidGVzdF9jdXN0b21fZXh0 X3BhdGhzX3VzaW5nX2RpcmVjdG9yeXwxLjB8dHx0fGZ8dHx8fFRlc3QgZXh0ZW5zaW9uX2NvbnRy b2xfcGF0aCIsCisJInRlc3RfY3VzdG9tX2V4dF9wYXRoc191c2luZ19kaXJlY3Rvcnl8MS4wfHR8 dHxmfHR8fHxUZXN0IGV4dGVuc2lvbl9jb250cm9sX3BhdGh8JGV4dF9kaXJfY2Fub25pY2FsaXpl ZC9leHRlbnNpb24iLAogCSJleHRlbnNpb24gaXMgaW5zdGFsbGVkIGNvcnJlY3RseSBvbiBwZ19h dmFpbGFibGVfZXh0ZW5zaW9uX3ZlcnNpb25zIik7CiAKKyMgVGVzdCB0aGF0IGEgbm9uLXN1cGVy dXNlciBjYW4gbm90IHJlYWQgdGhlIGV4dGVuc2lvbiBsb2NhdGlvbiBvbgorIyBwZ19hdmFpbGFi bGVfZXh0ZW5zaW9ucworJHJldCA9ICRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywKKwkic2Vs ZWN0IGxvY2F0aW9uIGZyb20gcGdfYXZhaWxhYmxlX2V4dGVuc2lvbnMgd2hlcmUgbmFtZSA9ICck ZXh0X25hbWUyJyIsCisJY29ubnN0ciA9PiAidXNlcj0kdXNlciIpOworaXMoICRyZXQsCisJIjxp bnN1ZmZpY2llbnQgcHJpdmlsZWdlPiIsCisJImV4dGVuc2lvbiBsb2NhdGlvbiBpcyBoaWRlIG9u IHBnX2F2YWlsYWJsZV9leHRlbnNpb25zIGZvciBpbnN1ZmZpY2llbnQgcHJpdmlsZWdlIik7CisK KyMgVGVzdCB0aGF0IGEgbm9uLXN1cGVydXNlciBjYW4gbm90IHJlYWQgdGhlIGV4dGVuc2lvbiBs b2NhdGlvbiBvbgorIyBwZ19hdmFpbGFibGVfZXh0ZW5zaW9uX3ZlcnNpb25zCiskcmV0ID0gJG5v ZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLAorCSJzZWxlY3QgbG9jYXRpb24gZnJvbSBwZ19hdmFp bGFibGVfZXh0ZW5zaW9uX3ZlcnNpb25zIHdoZXJlIG5hbWUgPSAnJGV4dF9uYW1lMiciLAorCWNv bm5zdHIgPT4gInVzZXI9JHVzZXIiKTsKK2lzKCAkcmV0LAorCSI8aW5zdWZmaWNpZW50IHByaXZp bGVnZT4iLAorCSJleHRlbnNpb24gbG9jYXRpb24gaXMgaGlkZSBvbiBwZ19hdmFpbGFibGVfZXh0 ZW5zaW9uX3ZlcnNpb25zIGZvciBpbnN1ZmZpY2llbnQgcHJpdmlsZWdlIik7CisKICMgRW5zdXJl IHRoYXQgZXh0ZW5zaW9ucyBpbnN0YWxsZWQgb24gJHN5c3RlbSBpcyBzdGlsbCB2aXNpYmxlIHdo ZW4gdXNpbmcgd2l0aAogIyBjdXN0b20gZXh0ZW5zaW9uIGNvbnRyb2wgcGF0aC4KICRyZXQgPSAk bm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsCkBAIC03Niw3ICsxMDIsNiBAQCAkcmV0ID0gJG5v ZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLAogaXMoJHJldCwgInQiLAogCSJcJHN5c3RlbSBleHRl bnNpb24gaXMgaW5zdGFsbGVkIGNvcnJlY3RseSBvbiBwZ19hdmFpbGFibGVfZXh0ZW5zaW9ucyIp OwogCi0KICRyZXQgPSAkbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsCiAJInNldCBleHRlbnNp b25fY29udHJvbF9wYXRoID0gJyc7IHNlbGVjdCBjb3VudCgqKSA+IDAgYXMgb2sgZnJvbSBwZ19h dmFpbGFibGVfZXh0ZW5zaW9ucyB3aGVyZSBuYW1lID0gJ3BscGdzcWwnIgogKTsKZGlmZiAtLWdp dCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvcnVsZXMub3V0IGIvc3JjL3Rlc3QvcmVncmVz cy9leHBlY3RlZC9ydWxlcy5vdXQKaW5kZXggNzdlMjVjYTAyOWUuLjM4M2FjNTY5YzQzIDEwMDY0 NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3J1bGVzLm91dAorKysgYi9zcmMvdGVz dC9yZWdyZXNzL2V4cGVjdGVkL3J1bGVzLm91dApAQCAtMTMxMCwxNCArMTMxMCwxNiBAQCBwZ19h dmFpbGFibGVfZXh0ZW5zaW9uX3ZlcnNpb25zfCBTRUxFQ1QgZS5uYW1lLAogICAgIGUucmVsb2Nh dGFibGUsCiAgICAgZS5zY2hlbWEsCiAgICAgZS5yZXF1aXJlcywKLSAgICBlLmNvbW1lbnQKLSAg IEZST00gKHBnX2F2YWlsYWJsZV9leHRlbnNpb25fdmVyc2lvbnMoKSBlKG5hbWUsIHZlcnNpb24s IHN1cGVydXNlciwgdHJ1c3RlZCwgcmVsb2NhdGFibGUsIHNjaGVtYSwgcmVxdWlyZXMsIGNvbW1l bnQpCisgICAgZS5jb21tZW50LAorICAgIGUubG9jYXRpb24KKyAgIEZST00gKHBnX2F2YWlsYWJs ZV9leHRlbnNpb25fdmVyc2lvbnMoKSBlKG5hbWUsIHZlcnNpb24sIHN1cGVydXNlciwgdHJ1c3Rl ZCwgcmVsb2NhdGFibGUsIHNjaGVtYSwgcmVxdWlyZXMsIGNvbW1lbnQsIGxvY2F0aW9uKQogICAg ICBMRUZUIEpPSU4gcGdfZXh0ZW5zaW9uIHggT04gKCgoZS5uYW1lID0geC5leHRuYW1lKSBBTkQg KGUudmVyc2lvbiA9IHguZXh0dmVyc2lvbikpKSk7CiBwZ19hdmFpbGFibGVfZXh0ZW5zaW9uc3wg U0VMRUNUIGUubmFtZSwKICAgICBlLmRlZmF1bHRfdmVyc2lvbiwKICAgICB4LmV4dHZlcnNpb24g QVMgaW5zdGFsbGVkX3ZlcnNpb24sCi0gICAgZS5jb21tZW50Ci0gICBGUk9NIChwZ19hdmFpbGFi bGVfZXh0ZW5zaW9ucygpIGUobmFtZSwgZGVmYXVsdF92ZXJzaW9uLCBjb21tZW50KQorICAgIGUu Y29tbWVudCwKKyAgICBlLmxvY2F0aW9uCisgICBGUk9NIChwZ19hdmFpbGFibGVfZXh0ZW5zaW9u cygpIGUobmFtZSwgZGVmYXVsdF92ZXJzaW9uLCBjb21tZW50LCBsb2NhdGlvbikKICAgICAgTEVG VCBKT0lOIHBnX2V4dGVuc2lvbiB4IE9OICgoZS5uYW1lID0geC5leHRuYW1lKSkpOwogcGdfYmFj a2VuZF9tZW1vcnlfY29udGV4dHN8IFNFTEVDVCBuYW1lLAogICAgIGlkZW50LApkaWZmIC0tZ2l0 IGEvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QgYi9zcmMvdG9vbHMvcGdpbmRlbnQv dHlwZWRlZnMubGlzdAppbmRleCBhYzJkYTRjOThjZi4uYTZlMzlhZGUzZDIgMTAwNjQ0Ci0tLSBh L3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0CisrKyBiL3NyYy90b29scy9wZ2luZGVu dC90eXBlZGVmcy5saXN0CkBAIC03ODksNiArNzg5LDcgQEAgRXh0ZW5zaWJsZU5vZGVFbnRyeQog RXh0ZW5zaWJsZU5vZGVNZXRob2RzCiBFeHRlbnNpb25Db250cm9sRmlsZQogRXh0ZW5zaW9uSW5m bworRXh0ZW5zaW9uTG9jYXRpb24KIEV4dGVuc2lvblZlcnNpb25JbmZvCiBGRFdDb2xsYXRlU3Rh dGUKIEZEX1NFVApAQCAtMTU2OCw3ICsxNTY5LDYgQEAgTG9hZFN0bXQKIExvY2FsQnVmZmVyTG9v a3VwRW50CiBMb2NhbFBnQmFja2VuZFN0YXR1cwogTG9jYWxUcmFuc2FjdGlvbklkCi1Mb2NhdGlv bgogTG9jYXRpb25JbmRleAogTG9jYXRpb25MZW4KIExvY2tBY3F1aXJlUmVzdWx0Ci0tIAoyLjUx LjAKCg== --545bb1b47ce55957c3c8a9d03ae46335495f3a1b1ec2e0ce8c6f60499f7e--