Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bKhww-0002Sm-SI for pgadmin-hackers@arkaria.postgresql.org; Wed, 06 Jul 2016 08:12:51 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.84_2) (envelope-from ) id 1bKhww-0008SS-Fe for pgadmin-hackers@arkaria.postgresql.org; Wed, 06 Jul 2016 08:12:50 +0000 Received: from makus.postgresql.org ([2001:4800:1501:1::229]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1bKhwu-0008S8-Ed for pgadmin-hackers@postgresql.org; Wed, 06 Jul 2016 08:12:48 +0000 Received: from mail-yw0-x235.google.com ([2607:f8b0:4002:c05::235]) by makus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.84_2) (envelope-from ) id 1bKhwq-0007DI-VD for pgadmin-hackers@postgresql.org; Wed, 06 Jul 2016 08:12:47 +0000 Received: by mail-yw0-x235.google.com with SMTP id i12so81017902ywa.1 for ; Wed, 06 Jul 2016 01:12:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=NmdND/QQCCAEpRwcketvyfw9oVm+jRQttj74ZPqNSx8=; b=nYKl19WTYzeSfCARL2/30J7p05cy1/1S3LpcnIgEjYADrogqqmosmkAvBuJhmJsfYx MVwK5jsRbcmUEoQmorsLXzY6lj71rpI4rILJ6GRWfLaqJxuH6Hl2tbU21A/LmzC5EJKu 2I80PEDC1FX/udQYS+CEvaCFdAagKfw68/AKFfC3ZGRMG4CaGQtEFehgCZ1OJnEowuu7 yz2b2fowBBF9q/e8QFb8VxDMKXlrHHn5Iq+ANLd3Sta5WF6h/hd1ZGyyjFa1EbRZLXUa AOSG2r/ZTvp/BFbTHUAhST687A5yCHPXu6nlZFMmZTBfh9gkrOzObxlbEAz9x9h6NTh7 KBuA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=NmdND/QQCCAEpRwcketvyfw9oVm+jRQttj74ZPqNSx8=; b=g9NL8qZb1V64+alxibGXWMt+yzi8TZ0tiquz0LKQSAkT5pibjsvzB6xJncqhhftFqT yVy4aACRIm9+eMmdpAxtJsUsflDu6Jdcz5dEeQKcwvHGxhcOXiYIKVU26PMaYWnHPKkN WBT8u+qFlbdY7CqAFKWQ5g91gIPEs8xVT1CObJjxczhOu5puYIVFQFRUeZYoDzrmoRtT oS4XIQiFeJgVRD2OOp2CF6ScYB8Gk40BvzEQ47Z2vDwGvVml0laQGvYtWIwX1rkIc/GV iAguCporquIdNLVy6LnwQC2i1WezTJNlqfj+iNkvG5D3Wn+1b1g2eB3WTsaYmv5KpEut 5x+w== X-Gm-Message-State: ALyK8tIBtV7DxxIKHCEpEnaTmvNtiMUCPEiXjQpBHLpjPhvbTYWPv0Yob1Cww5SCX7UDgPVttPqpY4MY/XFpK0yg X-Received: by 10.37.50.73 with SMTP id y70mr13319091yby.119.1467792763849; Wed, 06 Jul 2016 01:12:43 -0700 (PDT) MIME-Version: 1.0 Received: by 10.37.57.14 with HTTP; Wed, 6 Jul 2016 01:12:43 -0700 (PDT) In-Reply-To: References: From: Neel Patel Date: Wed, 6 Jul 2016 13:42:43 +0530 Message-ID: Subject: Re: [pgAdmin4][runtime]: Download feature in runtime To: Dave Page Cc: pgadmin-hackers Content-Type: multipart/mixed; boundary=001a1146c9aa4b5d230536f3226c X-Pg-Spam-Score: -2.6 (--) List-Archive: List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Mailing-List: pgadmin-hackers Precedence: bulk Sender: pgadmin-hackers-owner@postgresql.org --001a1146c9aa4b5d230536f3226c Content-Type: multipart/alternative; boundary=001a1146c9aa4b5d150536f3226a --001a1146c9aa4b5d150536f3226a Content-Type: text/plain; charset=UTF-8 Hi Dave, I have tried to fix most of the review comments. I have modified the patch on top of your changes. Please find attached updated patch file. Find my comments inline. Can you please review and let us know your feedback ? Thanks, Neel Patel On Fri, Jul 1, 2016 at 2:39 PM, Dave Page wrote: > On Fri, Jul 1, 2016 at 5:43 AM, Neel Patel > wrote: > > Hi Dave, > > > > On Thu, Jun 30, 2016 at 7:31 PM, Dave Page wrote: > >> > >> Hi > >> > >> On Thu, Jun 30, 2016 at 10:42 AM, Neel Patel > >> wrote: > >> > Hi, > >> > > >> > Please find attached patch file for initial version of download file > in > >> > runtime application. > >> > >> I've attached an update with some improved messages, and setting the > >> progress dialogue to be modal (seeing as we cannot have multiple > >> downloads, and it's easy to lose the dialogue). > >> > >> > With this patch, we have implemented two features. > >> > > >> > Feature 1 :- Normal "Download file" from runtime application > >> > > >> > Previously "Download file" was not implemented in runtime application. > >> > With this patch file, we have handled Qt signal for download file > >> > properly. > >> > >> This seems to work fine. I did get one crash (after I cancelled a > >> download, then tried it again), but I couldn't reproduce that. > > > > > > Okay. I will try to reproduce the issue and also i will try to review the > > code again if i can find something regrading crash. > I have tried to reproduce the crash but no luck. I have tried on Linux and Mac. > > Thanks. > > > > >> > >> > Feature 2 :- "download" attribute support for 'a' tag for client > side > >> > download > >> > > >> > As per our knowledge, webkit has not implemented the download > attribute > >> > at > >> > 'a' tag. > >> > Currently it shows under development from below link. > >> > > >> > https://bugreports.qt.io/browse/QTBUG-47732 > >> > > >> > We did not found any signal in Qt for download attribute feature but > to > >> > implement this feature in runtime application, we added one workaround > >> > to > >> > make it work with download CSV file. > >> > > >> > When we click on download buttons, we are getting Qt signal > >> > "urlLinkClicked" > >> > and in that url we are finding "data:text/csv" from encoded URL > >> > generated > >> > from sqleditor. Once we found that tag then we are decoding the csv > data > >> > and > >> > writing to file. > >> > > >> > Is that right approach ? Should we add our own custom mime-type to > >> > header ? > >> > Let us know your thoughts on this feature. > >> > >> This doesn't work so well, for a number of reasons: > >> > >> 1) QT Creator is complaining that your regexp contains an invalid > >> escape sequence (line 546). > > > > > > I will fix. > >> > >> > >> 2) The default file name seems to be the entire data blob. I would > >> suggest making the file name "download.csv" if we don't know anything > >> better. The "csv" part should be taken from the mime type (see below) > >> > >> 3) Should we handle all "data:" downloads in this way? Taking the file > >> type and default extension from the mimetype offered. > > > > > > We can handle all "data:" download. We will extract the filename and > > extension from mime type. > > As i know, Qt provides QUrlQuery class which will be useful to find the > key > > value pair. I will test and let you know. > > > > e.g. If we have header as below > > > > > "data:text/csv;charset=utf-8;Content-disposition:attachment;filename=download.csv;" > > > > From the QurlQuery class we can query "filename" and "data:" and > accordingly > > save the data to filename provided. > > > > Please suggest. > > Sounds good. > > >> 4) When I change the filename the data is properly saved, but then I > >> get a confirmation message that still has the full data blob as the > >> filename. > I found that it is due to different Qt version. You might be using Qt 5.5. In Qt 5.5, we are getting "download" signal and for Qt < 5.5 we are getting "urlLinkClicked" signal for client side data download. We have fixed the issue for all Qt version. Let me know if you can still able to reproduce the issue. > >> > >> 5) It somehow seems to have let me save files with forward slashes in > >> the name. See attachment. > Fixed. > > > > > I think we should not ask for "Save as" dialog. If there is no key found > of > > "filename" in encodedURI then we should create the file "download.csv" in > > user's download directory and save the csv data. > > Well we can get the extension from the mimetype in that instance, but > otherwise I agree with the naming. I do think we need a Save As > dialogue, as the user should be able to choose the location for the > file (and rename it). We should also remember the last save location > for convenience. > Fixed. > > >> 6) I get all sorts of weird redrawing on the screen when downloading a > >> data blob. I suspect it's because the filename (which is still the > >> entire data blob) is shown on the progress dialogue. > >> > Fixed. > > > > I will try to fix as per above comments and submit the patch again. > > Let us know for any misunderstanding. > > Cool, thanks. > > > -- > Dave Page > Blog: http://pgsnake.blogspot.com > Twitter: @pgsnake > > EnterpriseDB UK: http://www.enterprisedb.com > The Enterprise PostgreSQL Company > --001a1146c9aa4b5d150536f3226a Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Hi Dave,

I have tried to fix most of th= e review comments.=C2=A0 I have modified the patch on top of your changes. = Please find attached updated patch file.
Find my comments inline.= Can you please review and let us know your feedback ?

=
Thanks,
Neel Patel

On Fri, Jul 1, 2016 at 2:39 PM, Dave Page <dpage@pgadm= in.org> wrote:
On Fri= , Jul 1, 2016 at 5:43 AM, Neel Patel <neel.patel@enterprisedb.com> wrote: > Hi Dave,
>
> On Thu, Jun 30, 2016 at 7:31 PM, Dave Page <dpage@pgadmin.org> wrote:
>>
>> Hi
>>
>> On Thu, Jun 30, 2016 at 10:42 AM, Neel Patel
>> <neel.patel@enterprisedb.com> wrote:
>> > Hi,
>> >
>> > Please find attached patch file for initial version of downlo= ad file in
>> > runtime application.
>>
>> I've attached an update with some improved messages, and setti= ng the
>> progress dialogue to be modal (seeing as we cannot have multiple >> downloads, and it's easy to lose the dialogue).
>>
>> > With this patch, we have implemented two features.
>> >
>> > Feature 1 :- Normal "Download file" from runtime ap= plication
>> >
>> > Previously "Download file" was not implemented in r= untime application.
>> > With this patch file, we have handled Qt signal for download = file
>> > properly.
>>
>> This seems to work fine. I did get one crash (after I cancelled a<= br> >> download, then tried it again), but I couldn't reproduce that.=
>
>
> Okay. I will try to reproduce the issue and also i will try to review = the
> code again if i can find something regrading crash.

I have tried to reproduce the crash but no luck. I= have tried on Linux and Mac.
=C2=A0

Thanks.

>
>>
>> > Feature 2 :-=C2=A0 =C2=A0"download" attribute suppo= rt for 'a' tag for client side
>> > download
>> >
>> > As per our knowledge, webkit has not implemented the download= attribute
>> > at
>> > 'a' tag.
>> > Currently it shows under development from below link.
>> >
>> > https://bugreports.qt.io/browse/QTBUG-477= 32
>> >
>> > We did not found any signal in Qt for download attribute feat= ure but to
>> > implement this feature in runtime application, we added one w= orkaround
>> > to
>> > make it work with download CSV file.
>> >
>> > When we click on download buttons, we are getting Qt signal >> > "urlLinkClicked"
>> > and in that url we are finding "data:text/csv" from= encoded URL
>> > generated
>> > from sqleditor. Once we found that tag then we are decoding t= he csv data
>> > and
>> > writing to file.
>> >
>> > Is that right approach ? Should we add our own custom mime-ty= pe to
>> > header ?
>> > Let us know your thoughts on this feature.
>>
>> This doesn't work so well, for a number of reasons:
>>
>> 1) QT Creator is complaining that your regexp contains an invalid<= br> >> escape sequence (line 546).
>
>
> I will fix.
>>
>>
>> 2) The default file name seems to be the entire data blob. I would=
>> suggest making the file name "download.csv" if we don= 9;t know anything
>> better. The "csv" part should be taken from the mime typ= e (see below)
>>
>> 3) Should we handle all "data:" downloads in this way? T= aking the file
>> type and default extension from the mimetype offered.
>
>
> We can handle all "data:" download. We will extract the file= name and
> extension from mime type.
> As i know, Qt provides QUrlQuery class which will be useful to find th= e key
> value pair. I will test and let you know.
>
> e.g. If we have header as below
>
> "data:text/csv;charset=3Dutf-8;Content-disposition:attachment;fil= ename=3Ddownload.csv;"
>
> From the QurlQuery class we can query "filename" and "d= ata:" and accordingly
> save the data to filename provided.
>
> Please suggest.

Sounds good.

>> 4) When I change the filename the data is properly saved, but then= I
>> get a confirmation message that still has the full data blob as th= e
>> filename.

I found that = it is due to different Qt version. You might be using Qt 5.5.
In = Qt 5.5, we are getting "download" signal and for Qt < 5.5 we a= re getting "urlLinkClicked" signal for client side data download.=
We have fixed the issue for all Qt version. Let me know if you c= an still able to reproduce the issue.
=C2=A0
>>
>> 5) It somehow seems to have let me save files with forward slashes= in
>> the name. See attachment.

Fixed.

>
>
> I think we should not ask for "Save as" dialog. If there is = no key found of
> "filename" in encodedURI then we should create the file &quo= t;download.csv" in
> user's download directory and save the csv data.

Well we can get the extension from the mimetype in that instance, bu= t
otherwise I agree with the naming. I do think we need a Save As
dialogue, as the user should be able to choose the location for the
file (and rename it). We should also remember the last save location
for convenience.

Fixed.
=C2= =A0

>> 6) I get all sorts of weird redrawing on the screen when downloadi= ng a
>> data blob. I suspect it's because the filename (which is still= the
>> entire data blob) is shown on the progress dialogue.
>>

Fixed.
=C2=A0=
>
> I will try to fix as per above comments and submit the patch again.
> Let us know for any misunderstanding.

Cool, thanks.


--
Dave Page
Blog: http://pgsnake.blogspot.com
Twitter: @pgsnake

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--001a1146c9aa4b5d150536f3226a-- --001a1146c9aa4b5d230536f3226c Content-Type: application/octet-stream; name="download_runtime_v3.patch" Content-Disposition: attachment; filename="download_runtime_v3.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_iqalvfgg0 ZGlmZiAtLWdpdCBhL3J1bnRpbWUvQnJvd3NlcldpbmRvdy5jcHAgYi9ydW50 aW1lL0Jyb3dzZXJXaW5kb3cuY3BwCmluZGV4IGU4NzViMjguLmE3M2FiMDAg MTAwNjQ0Ci0tLSBhL3J1bnRpbWUvQnJvd3NlcldpbmRvdy5jcHAKKysrIGIv cnVudGltZS9Ccm93c2VyV2luZG93LmNwcApAQCAtMjMsNyArMjMsNiBAQAog I2luY2x1ZGUgPFFJbnB1dERpYWxvZz4KICNpbmNsdWRlIDxRTGluZUVkaXQ+ CiAjZW5kaWYKLQogLy8gQXBwIGhlYWRlcnMKICNpbmNsdWRlICJCcm93c2Vy V2luZG93LmgiCiAjaW5jbHVkZSAiQ29uZmlnV2luZG93LmgiCkBAIC00Miw2 ICs0MSwxNCBAQCBCcm93c2VyV2luZG93OjpCcm93c2VyV2luZG93KFFTdHJp bmcgdXJsKQogICAgIG1fd2lkZ2V0ID0gTlVMTDsKICAgICBtX3Rvb2xCdG5C YWNrID0gTlVMTDsKICAgICBtX3Rvb2xCdG5Gb3J3YXJkID0gTlVMTDsKKyAg ICBtX2Rvd25sb2FkU3RhcnRlZCA9IDA7CisgICAgbV9kb3dubG9hZENhbmNl bGxlZCA9IDA7CisgICAgbV9maWxlID0gTlVMTDsKKyAgICBtX2Rvd25sb2Fk RmlsZW5hbWUgPSAiIjsKKyAgICBtX2RlZmF1bHRGaWxlbmFtZSA9ICIiOwor ICAgIG1fcHJvZ3Jlc3NEaWFsb2cgPSBOVUxMOworICAgIG1fbGFzdF9vcGVu X2ZvbGRlcl9wYXRoID0gUURpcjo6Y3VycmVudFBhdGgoKTsKKyAgICBtX2Rp ciA9ICIiOwogCiAgICAgbV9hcHBTZXJ2ZXJVcmwgPSB1cmw7CiAKQEAgLTgz LDYgKzkwLDExIEBAIEJyb3dzZXJXaW5kb3c6OkJyb3dzZXJXaW5kb3coUVN0 cmluZyB1cmwpCiAgICAgLy8gUmVnaXN0ZXIgdGhlIHNsb3Qgb24gdGFiIGlu ZGV4IGNoYW5nZQogICAgIGNvbm5lY3QobV90YWJXaWRnZXQsU0lHTkFMKGN1 cnJlbnRDaGFuZ2VkKGludCApKSx0aGlzLFNMT1QodGFiSW5kZXhDaGFuZ2Vk KGludCApKSk7CiAKKyAgICAvLyBMaXN0ZW4gZm9yIHRoZSBkb3dubG9hZCBm aWxlIHJlcXVlc3QgZnJvbSB0aGUgd2ViIHBhZ2UKKyAgICBtX21haW5XZWJW aWV3LT5wYWdlKCktPnNldEZvcndhcmRVbnN1cHBvcnRlZENvbnRlbnQodHJ1 ZSk7CisgICAgY29ubmVjdChtX21haW5XZWJWaWV3LT5wYWdlKCksIFNJR05B TChkb3dubG9hZFJlcXVlc3RlZChjb25zdCBRTmV0d29ya1JlcXVlc3QgJikp LCB0aGlzLCBTTE9UKGRvd25sb2FkKGNvbnN0IFFOZXR3b3JrUmVxdWVzdCAm KSkpOworICAgIGNvbm5lY3QobV9tYWluV2ViVmlldy0+cGFnZSgpLCBTSUdO QUwodW5zdXBwb3J0ZWRDb250ZW50KFFOZXR3b3JrUmVwbHkqKSksIHRoaXMs IFNMT1QodW5zdXBwb3J0ZWRDb250ZW50KFFOZXR3b3JrUmVwbHkqKSkpOwor CiAgICAgbV9tYWluV2ViVmlldy0+cGFnZSgpLT5zZXRMaW5rRGVsZWdhdGlv blBvbGljeShRV2ViUGFnZTo6RGVsZWdhdGVBbGxMaW5rcyk7CiAKICAgICAv LyBSZXN0b3JlIHRoZSBnZW9tZXRyeQpAQCAtMTk5LDYgKzIxMSwyODEgQEAg aW50IEJyb3dzZXJXaW5kb3c6OmZpbmRVUkxUYWIoY29uc3QgUVVybCAmbmFt ZSkKICAgICByZXR1cm4gMDsKIH0KIAorLy8gVGhpcyBzbG90IHdpbGwgYmUg Y2FsbGVkIHdoZW4gdXNlciByaWdodCBjbGljayB0aGUgZG93bmxvYWQgbGlu ayBhbmQgc2VsZWN0ICJTYXZlIExpbmsuLi4iCit2b2lkIEJyb3dzZXJXaW5k b3c6OmRvd25sb2FkKGNvbnN0IFFOZXR3b3JrUmVxdWVzdCAmcmVxdWVzdCkK K3sKKyAgICAvLyBDaGVjayB0aGF0IHJlcXVlc3QgY29udGFpbnMgdGhlIGRh dGEgZG93bmxvYWQgYXQgY2xpZW50IHNpZGUKKyAgICBRVXJsIG5hbWU7Cisg ICAgaWYgKGNoZWNrQ2xpZW50RG93bmxvYWQobmFtZSwgcmVxdWVzdCkpCisg ICAgICAgIHJldHVybjsKKworICAgIGlmIChtX2Rvd25sb2FkU3RhcnRlZCkK KyAgICB7CisgICAgICAgIC8vIEluZm9ybSB0aGUgdXNlciB0aGF0IGEgZG93 bmxvYWQgaXMgYWxyZWFkeSBzdGFydGVkCisgICAgICAgIFFNZXNzYWdlQm94 OjppbmZvcm1hdGlvbih0aGlzLCB0cigiRG93bmxvYWQgd2FybmluZyIpLCB0 cigiRmlsZSBkb3dubG9hZCBhbHJlYWR5IGluIHByb2dyZXNzOiAlMSIpLmFy ZyhtX2RlZmF1bHRGaWxlbmFtZSkpOworICAgICAgICByZXR1cm47CisgICAg fQorCisgICAgbV9kZWZhdWx0RmlsZW5hbWUgPSBRRmlsZUluZm8ocmVxdWVz dC51cmwoKS50b1N0cmluZygpKS5maWxlTmFtZSgpOworCisgICAgUUZpbGVE aWFsb2cgc2F2ZV9kaWFsb2codGhpcyk7CisgICAgc2F2ZV9kaWFsb2cuc2V0 QWNjZXB0TW9kZShRRmlsZURpYWxvZzo6QWNjZXB0U2F2ZSk7CisgICAgc2F2 ZV9kaWFsb2cuc2V0V2luZG93VGl0bGUodHIoIlNhdmUgZmlsZSIpKTsKKyAg ICBzYXZlX2RpYWxvZy5zZXREaXJlY3RvcnkobV9sYXN0X29wZW5fZm9sZGVy X3BhdGgpOworICAgIHNhdmVfZGlhbG9nLnNlbGVjdEZpbGUobV9kZWZhdWx0 RmlsZW5hbWUpOworCisgICAgUU9iamVjdDo6Y29ubmVjdCgmc2F2ZV9kaWFs b2csIFNJR05BTChkaXJlY3RvcnlFbnRlcmVkKGNvbnN0IFFTdHJpbmcgJikp LCB0aGlzLCBTTE9UKGN1cnJlbnRfZGlyX3BhdGgoY29uc3QgUVN0cmluZyAm KSkpOworICAgIG1fZGlyID0gbV9sYXN0X29wZW5fZm9sZGVyX3BhdGg7Cisg ICAgUVN0cmluZyBmaWxlTmFtZSA9ICIiOworICAgIFFTdHJpbmcgZl9uYW1l ID0gIiI7CisKKyAgICBpZiAoc2F2ZV9kaWFsb2cuZXhlYygpID09IFFEaWFs b2c6OkFjY2VwdGVkKSB7CisgICAgICAgIGZpbGVOYW1lID0gc2F2ZV9kaWFs b2cuc2VsZWN0ZWRGaWxlcygpLmZpcnN0KCk7CisgICAgICAgIGZfbmFtZSA9 IGZpbGVOYW1lLnJlcGxhY2UobV9kaXIsICIiKTsKKyAgICAgICAgLy8gcmVt b3ZlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZnJvbSBmaWVuYW1lCisgICAgICAg IGZfbmFtZS5yZW1vdmUoMCwxKTsKKyAgICAgICAgbV9kZWZhdWx0RmlsZW5h bWUgPSBmX25hbWU7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJu OworCisgICAgZmlsZU5hbWUgPSBtX2RpciArIGZpbGVOYW1lOworICAgIC8v IGNsZWFyIHRoZSBsYXN0IGZvbGRlciBvcGVuIHBhdGgKKyAgICBtX2Rpci5j bGVhcigpOworCisjaWZkZWYgX19BUFBMRV9fCisgICAgLy8gQ2hlY2sgdGhh dCB1c2VyIGhhcyBnaXZlbiB2YWxpZCBmaWxlIG5hbWUgb3Igbm90IC0gZm9y d2FyZCBzbGFzaCBub3QgYWxsb3dlZCBpbiBmaWxlIG5hbWUKKyAgICAvLyBJ biBNYWMgT1NYLCBmb3J3YXJkIHNsYXNoIGlzIGNvbnZlcnRlZCB0byBjb2xv big6KSBieSBRdCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGZvciBjb2xvbi4KKyAg ICBpZiAoZl9uYW1lLmluZGV4T2YoIjoiKSAhPSAtMSkKKyAgICB7CisgICAg ICAgIFFNZXNzYWdlQm94OjppbmZvcm1hdGlvbih0aGlzLCB0cigiRmlsZSBu YW1lIGVycm9yIiksIHRyKCJJbnZhbGlkIGZpbGUgbmFtZSIpKTsKKyAgICAg ICAgcmV0dXJuOworICAgIH0KKyNlbHNlCisgICAgLy8gQ2hlY2sgdGhhdCB1 c2VyIGhhcyBnaXZlbiB2YWxpZCBmaWxlIG5hbWUgb3Igbm90IC0gZm9yd2Fy ZCBzbGFzaCBub3QgYWxsb3dlZCBpbiBmaWxlIG5hbWUKKyAgICBpZiAoZl9u YW1lLmluZGV4T2YoIi8iKSAhPSAtMSkKKyAgICB7CisgICAgICAgIFFNZXNz YWdlQm94OjppbmZvcm1hdGlvbih0aGlzLCB0cigiRmlsZSBuYW1lIGVycm9y IiksIHRyKCJJbnZhbGlkIGZpbGUgbmFtZSIpKTsKKyAgICAgICAgcmV0dXJu OworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGZpbGVOYW1lLmlzRW1wdHko KSkKKyAgICAgICAgcmV0dXJuOworICAgIGVsc2UKKyAgICB7CisgICAgICAg IG1fZG93bmxvYWRGaWxlbmFtZSA9IGZpbGVOYW1lOworCisgICAgICAgIFFO ZXR3b3JrUmVxdWVzdCBuZXdSZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICAgICAg bmV3UmVxdWVzdC5zZXRBdHRyaWJ1dGUoUU5ldHdvcmtSZXF1ZXN0OjpVc2Vy LCBmaWxlTmFtZSk7CisKKyAgICAgICAgUU9iamVjdCAqb2JqX3dlYl9wYWdl ID0gUU9iamVjdDo6c2VuZGVyKCk7CisgICAgICAgIGlmIChvYmpfd2ViX3Bh Z2UgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgUVdlYlBhZ2Ug KnNlbmRlcl93ZWJfcGFnZSA9IGR5bmFtaWNfY2FzdDxRV2ViUGFnZSo+KG9i al93ZWJfcGFnZSk7CisgICAgICAgICAgICBpZiAoc2VuZGVyX3dlYl9wYWdl ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUU5l dHdvcmtBY2Nlc3NNYW5hZ2VyICpuZXR3b3JrTWFuYWdlciA9IHNlbmRlcl93 ZWJfcGFnZS0+bmV0d29ya0FjY2Vzc01hbmFnZXIoKTsKKyAgICAgICAgICAg ICAgICBRTmV0d29ya1JlcGx5ICpyZXBseSA9IG5ldHdvcmtNYW5hZ2VyLT5n ZXQobmV3UmVxdWVzdCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcGx5ICE9 IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAg ICBtX2Rvd25sb2FkU3RhcnRlZCA9IDE7CisgICAgICAgICAgICAgICAgICAg IG1fZG93bmxvYWRDYW5jZWxsZWQgPSAwOworICAgICAgICAgICAgICAgICAg ICAvLyBDb25uZWN0IHRoZSBzaWduYWwgZm9yIGRvd25sb2FkUHJvZ3Jlc3Mg YW5kIGRvd25sb2FkRmluaXNoZWQgZm9yIGZpbGUgZG93bmxvYWQKKyAgICAg ICAgICAgICAgICAgICAgY29ubmVjdCggcmVwbHksIFNJR05BTChkb3dubG9h ZFByb2dyZXNzKHFpbnQ2NCwgcWludDY0KSksIHRoaXMsIFNMT1QoZG93bmxv YWRGaWxlUHJvZ3Jlc3MocWludDY0LCBxaW50NjQpKSApOworICAgICAgICAg ICAgICAgICAgICBjb25uZWN0KCByZXBseSwgU0lHTkFMKGZpbmlzaGVkKCkp LCB0aGlzLCBTTE9UKGRvd25sb2FkRmluaXNoZWQoKSkpOworICAgICAgICAg ICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30K KworLy9UaGlzIHNsb3Qgd2lsbCBjYWxsZWQgaW4gY2h1bmsgYW5kIGdpdmUg dGhlIHByb2dyZXNzIGZvciB0aGUgZmlsZSBkb3dubG9hZAordm9pZCBCcm93 c2VyV2luZG93Ojpkb3dubG9hZEZpbGVQcm9ncmVzcyhxaW50NjQgcmVhZERh dGEsIHFpbnQ2NCB0b3RhbERhdGEpCit7CisgICAgUU5ldHdvcmtSZXBseSAq cmVwbHkgPSAoKFFOZXR3b3JrUmVwbHkqKXNlbmRlcigpKTsKKyAgICBRTmV0 d29ya1JlcXVlc3QgcmVxdWVzdCA9IHJlcGx5LT5yZXF1ZXN0KCk7CisgICAg UVZhcmlhbnQgdiA9IHJlcXVlc3QuYXR0cmlidXRlKFFOZXR3b3JrUmVxdWVz dDo6VXNlcik7CisKKyAgICAvLyBJcyBkb3dubG9hZCBpcyBjYW5jZWxlZCBi eSB0aGUgdXNlciB0aGVuIG5vIGFjdGlvbiBpcyB0YWtlbiwganVzdCByZXR1 cm4KKyAgICBpZiAobV9kb3dubG9hZENhbmNlbGxlZCkKKyAgICAgICAgcmV0 dXJuOworCisgICAgaWYocmVwbHkgIT0gTlVMTCAmJiByZXBseS0+ZXJyb3Io KSAhPSBRTmV0d29ya1JlcGx5OjpOb0Vycm9yKQorICAgIHsKKyAgICAgICAg cURlYnVnKCkgPDwgIk5ldHdvcmsgZXJyb3Igb2NjdXJyZWQgd2hpbHN0IGRv d25sb2FkaW5nOiAiIDw8IG1fZGVmYXVsdEZpbGVuYW1lOworICAgICAgICBy ZXR1cm47CisgICAgfQorCisgICAgLy8gRG93bmxvYWQgaXMgbm90IHlldCBz dGFydGVkIHNvIG9wZW4gdGhlIGZpbGUgZmlyc3QgdGltZS4KKyAgICBpZiAo IW1fZmlsZSkKKyAgICB7CisgICAgICAgIG1fZmlsZSA9IG5ldyBRRmlsZSht X2Rvd25sb2FkRmlsZW5hbWUpOworICAgICAgICBpZiAoIW1fZmlsZS0+b3Bl bihRSU9EZXZpY2U6OldyaXRlT25seSkpCisgICAgICAgIHsKKyAgICAgICAg ICAgIHFEZWJ1ZygpIDw8ICJFcnJvciBvcGVuaW5nIGZpbGU6ICIgPDwgbV9k b3dubG9hZEZpbGVuYW1lOworICAgICAgICAgICAgbV9kb3dubG9hZEZpbGVu YW1lLmNsZWFyKCk7CisgICAgICAgICAgICBtX2RlZmF1bHRGaWxlbmFtZS5j bGVhcigpOworICAgICAgICAgICAgbV9kb3dubG9hZFN0YXJ0ZWQgPSAwOwor ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8g U3RhcnQgZG93bmxvYWRpbmcgcHJvZ3Jlc3MgYmFyCisgICAgICAgIG1fcHJv Z3Jlc3NEaWFsb2cgPSBuZXcgUVByb2dyZXNzRGlhbG9nICh0cigiRG93bmxv YWRpbmcgZmlsZTogJTEgIikuYXJnKG1fZGVmYXVsdEZpbGVuYW1lKSwgIkNh bmNlbCIsIHJlYWREYXRhLCB0b3RhbERhdGEsIHRoaXMpOworICAgICAgICBt X3Byb2dyZXNzRGlhbG9nLT5zZXRXaW5kb3dNb2RhbGl0eShRdDo6V2luZG93 TW9kYWwpOworICAgICAgICBtX3Byb2dyZXNzRGlhbG9nLT5zZXRXaW5kb3dU aXRsZSgiRG93bmxvYWQgcHJvZ3Jlc3MiKTsKKyAgICAgICAgbV9wcm9ncmVz c0RpYWxvZy0+c2V0TWluaW11bVdpZHRoKDQ1MCk7CisgICAgICAgIG1fcHJv Z3Jlc3NEaWFsb2ctPnNldE1pbmltdW1IZWlnaHQoODApOworICAgICAgICBt X3Byb2dyZXNzRGlhbG9nLT5zZXRXaW5kb3dGbGFncyhRdDo6V2luZG93IHwg UXQ6OkN1c3RvbWl6ZVdpbmRvd0hpbnQgfCBRdDo6V2luZG93TWluaW1pemVC dXR0b25IaW50IHwgUXQ6OldpbmRvd0Nsb3NlQnV0dG9uSGludCk7CisgICAg ICAgIFFPYmplY3Q6OmNvbm5lY3QobV9wcm9ncmVzc0RpYWxvZywgU0lHTkFM KGNhbmNlbGVkKCkpLCB0aGlzLCBTTE9UKHByb2dyZXNzQ2FuY2VsZWQoKSkp OworICAgICAgICBtX3Byb2dyZXNzRGlhbG9nLT5zaG93KCk7CisgICAgfQor CisgICAgaWYgKG1fZmlsZSkKKyAgICB7CisgICAgICAgIC8vIFdyaXRlIHRo ZSBkYXRhIHRvIGZpbGUKKyAgICAgICAgbV9maWxlLT53cml0ZShyZXBseS0+ cmVhZChyZWFkRGF0YSkpOworICAgICAgICBtX3Byb2dyZXNzRGlhbG9nLT5z ZXRWYWx1ZShyZWFkRGF0YSk7CisKKyAgICAgICAgLy8gQXMgcmVhZCBkYXRh IGFuZCB0b3RhbERhdGEgZGlmZmVyZW5jZSBpcyB6ZXJvIG1lYW5zIGRvd25s b2FkaW5nIGlzIGZpbmlzaGVkCisgICAgICAgIGlmICgodG90YWxEYXRhIC0g cmVhZERhdGEpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICht X3Byb2dyZXNzRGlhbG9nKQorICAgICAgICAgICAgeworICAgICAgICAgICAg ICAgIGRlbGV0ZSBtX3Byb2dyZXNzRGlhbG9nOworICAgICAgICAgICAgICAg IG1fcHJvZ3Jlc3NEaWFsb2cgPSBOVUxMOworICAgICAgICAgICAgfQorCisg ICAgICAgICAgICAvLyBEb3dubG9hZGluZyBjb21wbHRlZCBzbyB3ZSBuZWVk IHRvIGRpc3BsYXkgdGhlIG1lc3NhZ2UKKyAgICAgICAgICAgIC8vIEluZm9y bSB1c2VyIHRoYXQgZG93bmxvYWRpbmcgaXMgY29tcGxldGVkCisgICAgICAg ICAgICBRTWVzc2FnZUJveDo6aW5mb3JtYXRpb24odGhpcywgdHIoIkRvd25s b2FkIGNvbXBsZXRlZCIpLCB0cigiU3VjY2Vzc2Z1bGx5IGRvd25sb2FkZWQg JTEiKS5hcmcobV9kZWZhdWx0RmlsZW5hbWUpKTsKKyAgICAgICAgICAgIG1f ZG93bmxvYWRGaWxlbmFtZS5jbGVhcigpOworICAgICAgICAgICAgbV9kZWZh dWx0RmlsZW5hbWUuY2xlYXIoKTsKKyAgICAgICAgICAgIG1fZG93bmxvYWRT dGFydGVkID0gMDsKKyAgICAgICAgICAgIG1fZG93bmxvYWRDYW5jZWxsZWQg PSAwOworICAgICAgICAgICAgaWYgKG1fZmlsZSkKKyAgICAgICAgICAgIHsK KyAgICAgICAgICAgICAgICBkZWxldGUgbV9maWxlOworICAgICAgICAgICAg ICAgIG1fZmlsZSA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0K KyAgICB9Cit9CisKKy8vVGhpcyBzbG90IHdpbGwgY2FsbGVkIHdoZW4gdXNl ciBjYW5jZWwgdGhlIGRvd25sb2FkaW5nIGZpbGUgd2hpY2ggaXMgaW4gcHJv Z3Jlc3MuCit2b2lkIEJyb3dzZXJXaW5kb3c6OnByb2dyZXNzQ2FuY2VsZWQo KQoreworICAgIG1fZG93bmxvYWRDYW5jZWxsZWQgPSAxOworCisgICAgaWYg KG1fcHJvZ3Jlc3NEaWFsb2cpCisgICAgeworICAgICAgICBkZWxldGUgbV9w cm9ncmVzc0RpYWxvZzsKKyAgICAgICAgbV9wcm9ncmVzc0RpYWxvZyA9IE5V TEw7CisgICAgfQorCisgICAgaWYgKG1fZmlsZSkKKyAgICB7CisgICAgICAg IGRlbGV0ZSBtX2ZpbGU7CisgICAgICAgIG1fZmlsZSA9IE5VTEw7CisgICAg fQorCisgICAgbV9kb3dubG9hZEZpbGVuYW1lLmNsZWFyKCk7CisgICAgbV9k ZWZhdWx0RmlsZW5hbWUuY2xlYXIoKTsKKyAgICBtX2Rvd25sb2FkU3RhcnRl ZCA9IDA7Cit9CisKKy8vIFRoaXMgc2xvdCB3aWxsIGNhbGxlZCB3aGVuIGZp bGUgZG93bmxvYWRpbmcgaXMgZmluaXNoZWQKK3ZvaWQgQnJvd3NlcldpbmRv dzo6ZG93bmxvYWRGaW5pc2hlZCgpCit7CisgICAgaWYgKG1fcHJvZ3Jlc3NE aWFsb2cpCisgICAgeworICAgICAgICBkZWxldGUgbV9wcm9ncmVzc0RpYWxv ZzsKKyAgICAgICAgbV9wcm9ncmVzc0RpYWxvZyA9IE5VTEw7CisgICAgfQor CisgICAgLy8gSW5mb3JtIHVzZXIgdGhhdCBkb3dubG9hZGluZyBpcyBjb21w bGV0ZWQKKyAgICBpZiAobV9kb3dubG9hZFN0YXJ0ZWQpCisgICAgICAgIFFN ZXNzYWdlQm94OjppbmZvcm1hdGlvbih0aGlzLCB0cigiRG93bmxvYWQgY29t cGxldGVkIiksIHRyKCJTdWNjZXNzZnVsbHkgZG93bmxvYWRlZCAlMSIpLmFy ZyhtX2RlZmF1bHRGaWxlbmFtZSkpOworCisgICAgbV9kb3dubG9hZEZpbGVu YW1lLmNsZWFyKCk7CisgICAgbV9kZWZhdWx0RmlsZW5hbWUuY2xlYXIoKTsK KyAgICBtX2Rvd25sb2FkU3RhcnRlZCA9IDA7CisgICAgbV9kb3dubG9hZENh bmNlbGxlZCA9IDA7CisgICAgaWYgKG1fZmlsZSkKKyAgICB7CisgICAgICAg IGRlbGV0ZSBtX2ZpbGU7CisgICAgICAgIG1fZmlsZSA9IE5VTEw7CisgICAg fQorfQorCisvLyBUaGlzIHNsb3Qgd2lsbCBiZSBjYWxsZWQgd2hlbiB1c2Vy IGRpcmVjdGx5IGNsaWNrIG9uIGFueSBkb3dubG9hZCBmaWxlCit2b2lkIEJy b3dzZXJXaW5kb3c6OnVuc3VwcG9ydGVkQ29udGVudChRTmV0d29ya1JlcGx5 ICogcmVwbHkpCit7CisgICAgaWYgKG1fZG93bmxvYWRTdGFydGVkKQorICAg IHsKKyAgICAgICAgLy9JbmZvcm0gdGhlIHVzZXIgdGhhdCBvbmUgZG93bmxv YWQgYWxyZWFkeSBzdGFydGVkCisgICAgICAgIFFNZXNzYWdlQm94OjppbmZv cm1hdGlvbih0aGlzLCB0cigiRG93bmxvYWQgd2FybmluZyIpLCB0cigiRmls ZSBkb3dubG9hZCBhbHJlYWR5IGluIHByb2dyZXNzOiAlMSIpLmFyZyhtX2Rl ZmF1bHRGaWxlbmFtZSkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisg ICAgbV9kZWZhdWx0RmlsZW5hbWUgPSBRRmlsZUluZm8ocmVwbHktPnVybCgp LnRvU3RyaW5nKCkpLmZpbGVOYW1lKCk7CisgICAgUUZpbGVEaWFsb2cgc2F2 ZV9kaWFsb2codGhpcyk7CisgICAgc2F2ZV9kaWFsb2cuc2V0QWNjZXB0TW9k ZShRRmlsZURpYWxvZzo6QWNjZXB0U2F2ZSk7CisgICAgc2F2ZV9kaWFsb2cu c2V0V2luZG93VGl0bGUodHIoIlNhdmUgZmlsZSIpKTsKKyAgICBzYXZlX2Rp YWxvZy5zZXREaXJlY3RvcnkobV9sYXN0X29wZW5fZm9sZGVyX3BhdGgpOwor ICAgIHNhdmVfZGlhbG9nLnNlbGVjdEZpbGUobV9kZWZhdWx0RmlsZW5hbWUp OworCisgICAgUU9iamVjdDo6Y29ubmVjdCgmc2F2ZV9kaWFsb2csIFNJR05B TChkaXJlY3RvcnlFbnRlcmVkKGNvbnN0IFFTdHJpbmcgJikpLCB0aGlzLCBT TE9UKGN1cnJlbnRfZGlyX3BhdGgoY29uc3QgUVN0cmluZyAmKSkpOworICAg IG1fZGlyID0gbV9sYXN0X29wZW5fZm9sZGVyX3BhdGg7CisgICAgUVN0cmlu ZyBmaWxlTmFtZSA9ICIiOworICAgIFFTdHJpbmcgZl9uYW1lID0gIiI7CisK KyAgICBpZiAoc2F2ZV9kaWFsb2cuZXhlYygpID09IFFEaWFsb2c6OkFjY2Vw dGVkKSB7CisgICAgICAgIGZpbGVOYW1lID0gc2F2ZV9kaWFsb2cuc2VsZWN0 ZWRGaWxlcygpLmZpcnN0KCk7CisgICAgICAgIGZfbmFtZSA9IGZpbGVOYW1l LnJlcGxhY2UobV9kaXIsICIiKTsKKyAgICAgICAgLy8gcmVtb3ZlIHRoZSBm aXJzdCBjaGFyYWN0ZXIgZnJvbSBmaWVuYW1lCisgICAgICAgIGZfbmFtZS5y ZW1vdmUoMCwxKTsKKyAgICAgICAgbV9kZWZhdWx0RmlsZW5hbWUgPSBmX25h bWU7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuOworCisgICAg ZmlsZU5hbWUgPSBtX2RpciArIGZpbGVOYW1lOworICAgIC8vIGNsZWFyIHRo ZSBsYXN0IGZvbGRlciBvcGVuIHBhdGgKKyAgICBtX2Rpci5jbGVhcigpOwor CisjaWZkZWYgX19BUFBMRV9fCisgICAgLy8gQ2hlY2sgdGhhdCB1c2VyIGhh cyBnaXZlbiB2YWxpZCBmaWxlIG5hbWUgb3Igbm90IC0gZm9yd2FyZCBzbGFz aCBub3QgYWxsb3dlZCBpbiBmaWxlIG5hbWUKKyAgICAvLyBJbiBNYWMgT1NY LCBmb3J3YXJkIHNsYXNoIGlzIGNvbnZlcnRlZCB0byBjb2xvbig6KSBieSBR dCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGZvciBjb2xvbi4KKyAgICBpZiAoZl9u YW1lLmluZGV4T2YoIjoiKSAhPSAtMSkKKyAgICB7CisgICAgICAgIFFNZXNz YWdlQm94OjppbmZvcm1hdGlvbih0aGlzLCB0cigiRmlsZSBuYW1lIGVycm9y IiksIHRyKCJJbnZhbGlkIGZpbGUgbmFtZSIpKTsKKyAgICAgICAgcmV0dXJu OworICAgIH0KKyNlbHNlCisgICAgLy8gQ2hlY2sgdGhhdCB1c2VyIGhhcyBn aXZlbiB2YWxpZCBmaWxlIG5hbWUgb3Igbm90IC0gZm9yd2FyZCBzbGFzaCBu b3QgYWxsb3dlZCBpbiBmaWxlIG5hbWUKKyAgICBpZiAoZl9uYW1lLmluZGV4 T2YoIi8iKSAhPSAtMSkKKyAgICB7CisgICAgICAgIFFNZXNzYWdlQm94Ojpp bmZvcm1hdGlvbih0aGlzLCB0cigiRmlsZSBuYW1lIGVycm9yIiksIHRyKCJJ bnZhbGlkIGZpbGUgbmFtZSIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K KyNlbmRpZgorCisgICAgaWYgKGZpbGVOYW1lLmlzRW1wdHkoKSkKKyAgICAg ICAgcmV0dXJuOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1fZG93bmxv YWRGaWxlbmFtZSA9IGZpbGVOYW1lOworICAgICAgICBpZiAocmVwbHkgIT0g TlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgbV9kb3dubG9hZFN0YXJ0 ZWQgPSAxOworICAgICAgICAgICAgbV9kb3dubG9hZENhbmNlbGxlZCA9IDA7 CisgICAgICAgICAgICBjb25uZWN0KCByZXBseSwgU0lHTkFMKGRvd25sb2Fk UHJvZ3Jlc3MocWludDY0LCBxaW50NjQpKSwgdGhpcywgU0xPVChkb3dubG9h ZEZpbGVQcm9ncmVzcyhxaW50NjQsIHFpbnQ2NCkpKTsKKyAgICAgICAgICAg IGNvbm5lY3QoIHJlcGx5LCBTSUdOQUwoZmluaXNoZWQoKSksIHRoaXMsIFNM T1QoZG93bmxvYWRGaW5pc2hlZCgpKSk7CisgICAgICAgIH0KKyAgICB9Cit9 CisKIC8vIFNsb3Q6IFdoZW4gdGhlIHRhYiBpbmRleCBjaGFuZ2UsIGhpZGUv c2hvdyB0aGUgdG9vbGJ1dHRvbiBkaXNwbGF5ZWQgb24gdGFiCiB2b2lkIEJy b3dzZXJXaW5kb3c6OnRhYkluZGV4Q2hhbmdlZChpbnQgaW5kZXgpCiB7CkBA IC0zNDAsOSArNjI3LDE0MiBAQCB2b2lkIEJyb3dzZXJXaW5kb3c6OnRhYlRp dGxlQ2hhbmdlZChjb25zdCBRU3RyaW5nICZzdHIpCiAgICAgfQogfQogCisv LyBUaGlzIGZ1bmN0aW9uIHdpbGwgdXNlZCB0byBkb3dubG9hZCB0aGUgZGF0 YSBzZXQgaW4gZW5jb2RlZCBVUkwgc28gZGF0YSB3aWxsIGJlIGRvd25sb2Fk ZWQgYXQgY2xpZW50IHNpZGUuCitib29sIEJyb3dzZXJXaW5kb3c6OmNoZWNr Q2xpZW50RG93bmxvYWQoY29uc3QgUVVybCAmbmFtZSwgY29uc3QgUU5ldHdv cmtSZXF1ZXN0ICZyZXF1ZXN0KQoreworICAgIFFTdHJpbmcgbWltZV90eXBl ID0gIiI7CisgICAgUVN0cmluZyBmaWxlX25hbWUgPSAiIjsKKyAgICBRU3Ry aW5nIHdyaXRlX2RhdGEgPSAiIjsKKyAgICBRU3RyaW5nIGNzdl9kYXRhID0g IiI7CisgICAgYm9vbCByZXR1cm5fdmFsID0gZmFsc2U7CisKKyAgICAvKgor ICAgIEluIFF0IHZlcnNpb24gNS41LCAiZG93bmxvYWQiIHNpZ25hbCBpcyBl bWl0dGVkIHdoZW4gJ2Rvd25sb2FkJyBhdHRyaWJ1dGUgaXMgc2V0IG9uICdh JyB0YWcuCisgICAgSW4gImRvd25sb2FkIiBzaWduYWwgZW1pc3Npb24sIG5h bWUgd2lsbCBiZSBlbXB0eSBhbmQgZGF0YSB3aWxsIGJlIGluIHJlcXVlc3Qg b2JqZWN0LgorICAgIEVhcmxpZXIgdmVyc2lvbiAoIDwgNS41ICksICJ1cmxM aW5rQ2xpY2tlZCIgc2lnbmFsIGlzIGVtaXR0ZWQgc28gbmFtZSB3aWxsIGNv bnRhaW4gdGhlIG9iamVjdCBkYXRhLgorICAgICovCisgICAgaWYgKG5hbWUu aXNFbXB0eSgpKQorICAgICAgICBjc3ZfZGF0YSA9IFFGaWxlSW5mbyhyZXF1 ZXN0LnVybCgpLnRvU3RyaW5nKCkpLmZpbGVOYW1lKCk7CisgICAgZWxzZQor ICAgICAgICBjc3ZfZGF0YSA9IFFTdHJpbmc6OmZyb21VdGY4KG5hbWUudG9F bmNvZGVkKCkpOworCisgICAgUVVybFF1ZXJ5IGRvd25sb2FkRGF0YShjc3Zf ZGF0YSk7CisgICAgUVN0cmluZ0xpc3Qga2V5VmFsdWVEYXRhID0gY3N2X2Rh dGEuc3BsaXQoIiYiKTsKKyAgICBmaWxlX25hbWUgPSBkb3dubG9hZERhdGEu cXVlcnlJdGVtVmFsdWUoImZpbGVuYW1lIik7CisgICAgd3JpdGVfZGF0YSA9 IGRvd25sb2FkRGF0YS5xdWVyeUl0ZW1WYWx1ZSgidmFsdWUiKTsKKworICAg IGludCBrZXlfdmFsdWVfbGVuZ3RoID0ga2V5VmFsdWVEYXRhLnNpemUoKTsK KyAgICBpbnQgaV9jb3VudCA9IDA7CisKKyAgICAvLyB3ZSBoYXZlIGtleSB2 YWx1ZSBkYXRhIHNvIHdlIG5lZWQgdG8gdG9rZW5pemEgaXQgYW5kIGZpbmQg dGhlIHZhbHVlcworICAgIHdoaWxlIChpX2NvdW50IDwga2V5X3ZhbHVlX2xl bmd0aCkKKyAgICB7CisgICAgICAgIC8vRXh0cmFjdCB0aGUgZXh0ZW5zaW9u IGFmdGVyICJkYXRhOiIgd29yZCBmb3VuZCBmcm9tIGVuY29kZWQgdXJsLgor ICAgICAgICBRU3RyaW5nIHN0YXJ0X21hdGNoX3N0cmluZyA9ICJkYXRhOiI7 CisgICAgICAgIGludCBzX29mZnNldCA9IGtleVZhbHVlRGF0YS5hdChpX2Nv dW50KS5pbmRleE9mKHN0YXJ0X21hdGNoX3N0cmluZyk7CisgICAgICAgIGlm IChzX29mZnNldCAhPSAtMSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50 IGZvcm1hdF9vZmZzZXQgPSBrZXlWYWx1ZURhdGEuYXQoaV9jb3VudCkuaW5k ZXhPZigiLyIpOworICAgICAgICAgICAgbWltZV90eXBlID0ga2V5VmFsdWVE YXRhLmF0KGlfY291bnQpLm1pZCgoZm9ybWF0X29mZnNldCsxKSk7CisgICAg ICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGludCBzcGxp dF9vZmZzZXQgPSBrZXlWYWx1ZURhdGEuYXQoaV9jb3VudCkuaW5kZXhPZigi PSIpOworICAgICAgICBpZiAoc3BsaXRfb2Zmc2V0ID09IC0xKQorICAgICAg ICB7CisgICAgICAgICAgICBtaW1lX3R5cGUgPSBrZXlWYWx1ZURhdGEuYXQo aV9jb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisg ICAgICAgIGlfY291bnQgKz0gMTsKKyAgICB9CisKKyAgICAvLyB3cml0ZSBk YXRhIHRvIGZpbGUKKyAgICBpZiAoIXdyaXRlX2RhdGEuaXNFbXB0eSgpKQor ICAgIHsKKyAgICAgICAgUVN0cmluZyBmaWxlbmFtZSA9ICIiOworICAgICAg ICBRU3RyaW5nIGZfbmFtZSA9ICIiOworICAgICAgICBRRmlsZURpYWxvZyBz YXZlQXNkaWFsb2codGhpcyk7CisgICAgICAgIHNhdmVBc2RpYWxvZy5zZXRB Y2NlcHRNb2RlKFFGaWxlRGlhbG9nOjpBY2NlcHRTYXZlKTsKKyAgICAgICAg c2F2ZUFzZGlhbG9nLnNlbGVjdE5hbWVGaWx0ZXIodHIoIkZpbGVzICgqLiUx KSIpLmFyZyhtaW1lX3R5cGUpKTsKKyAgICAgICAgc2F2ZUFzZGlhbG9nLnNl dFdpbmRvd1RpdGxlKHRyKCJTYXZlICUxIGZpbGUiKS5hcmcobWltZV90eXBl KSk7CisgICAgICAgIHNhdmVBc2RpYWxvZy5zZXREaXJlY3RvcnkobV9sYXN0 X29wZW5fZm9sZGVyX3BhdGgpOworICAgICAgICBzYXZlQXNkaWFsb2cuc2Vs ZWN0RmlsZShmaWxlX25hbWUpOworICAgICAgICBzYXZlQXNkaWFsb2cuc2V0 RGVmYXVsdFN1ZmZpeChtaW1lX3R5cGUpOworCisgICAgICAgIFFPYmplY3Q6 OmNvbm5lY3QoJnNhdmVBc2RpYWxvZywgU0lHTkFMKGRpcmVjdG9yeUVudGVy ZWQoY29uc3QgUVN0cmluZyAmKSksIHRoaXMsIFNMT1QoY3VycmVudF9kaXJf cGF0aChjb25zdCBRU3RyaW5nICYpKSk7CisgICAgICAgIG1fZGlyID0gbV9s YXN0X29wZW5fZm9sZGVyX3BhdGg7CisKKyAgICAgICAgaWYgKHNhdmVBc2Rp YWxvZy5leGVjKCkgPT0gUURpYWxvZzo6QWNjZXB0ZWQpIHsKKyAgICAgICAg ICAgIGZpbGVuYW1lID0gc2F2ZUFzZGlhbG9nLnNlbGVjdGVkRmlsZXMoKS5h dCgwKTsKKyAgICAgICAgICAgIFFTdHJpbmcgZmlsZW5hbWUgPSBzYXZlQXNk aWFsb2cuc2VsZWN0ZWRGaWxlcygpLmZpcnN0KCk7CisgICAgICAgICAgICBm X25hbWUgPSBmaWxlbmFtZS5yZXBsYWNlKG1fZGlyLCAiIik7CisgICAgICAg ICAgICAvLyByZW1vdmUgdGhlIGZpcnN0IGNoYXJhY3RlciBmcm9tIGZpZW5h bWUKKyAgICAgICAgICAgIGZfbmFtZS5yZW1vdmUoMCwxKTsKKyAgICAgICAg fQorCisgICAgICAgIC8vIGNsZWFyIHRoZSBsYXN0IGZvbGRlciBvcGVuIHBh dGgKKyAgICAgICAgbV9kaXIuY2xlYXIoKTsKKworICAgICAgICByZXR1cm5f dmFsID0gdHJ1ZTsKKworI2lmZGVmIF9fQVBQTEVfXworICAgICAgICAvLyBD aGVjayB0aGF0IHVzZXIgaGFzIGdpdmVuIHZhbGlkIGZpbGUgbmFtZSBvciBu b3QgLSBmb3J3YXJkIHNsYXNoIG5vdCBhbGxvd2VkIGluIGZpbGUgbmFtZQor ICAgICAgICAvLyBJbiBNYWMgT1NYLCBmb3J3YXJkIHNsYXNoIGlzIGNvbnZl cnRlZCB0byBjb2xvbig6KSBieSBRdCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGZv ciBjb2xvbi4KKyAgICAgICAgaWYgKGZfbmFtZS5pbmRleE9mKCI6IikgIT0g LTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIFFNZXNzYWdlQm94OjppbmZv cm1hdGlvbih0aGlzLCB0cigiRmlsZSBuYW1lIGVycm9yIiksIHRyKCJJbnZh bGlkIGZpbGUgbmFtZSIpKTsKKyAgICAgICAgICAgIHJldHVybiByZXR1cm5f dmFsOworICAgICAgICB9CisjZWxzZQorICAgICAgICAvLyBDaGVjayB0aGF0 IHVzZXIgaGFzIGdpdmVuIHZhbGlkIGZpbGUgbmFtZSBvciBub3QgLSBmb3J3 YXJkIHNsYXNoIG5vdCBhbGxvd2VkIGluIGZpbGUgbmFtZQorICAgICAgICBp ZiAoZl9uYW1lLmluZGV4T2YoIi8iKSAhPSAtMSkKKyAgICAgICAgeworICAg ICAgICAgICAgUU1lc3NhZ2VCb3g6OmluZm9ybWF0aW9uKHRoaXMsIHRyKCJG aWxlIG5hbWUgZXJyb3IiKSwgdHIoIkludmFsaWQgZmlsZSBuYW1lIikpOwor ICAgICAgICAgICAgcmV0dXJuIHJldHVybl92YWw7CisgICAgICAgIH0KKyNl bmRpZgorICAgICAgICBpZighZmlsZW5hbWUuaXNFbXB0eSgpKQorICAgICAg ICB7CisgICAgICAgICAgICAvLyBzYXZlIHRoZSBsYXN0IG9wZW4gZm9sZGVy IHBhdGgKKyAgICAgICAgICAgIG1fbGFzdF9vcGVuX2ZvbGRlcl9wYXRoID0g UUZpbGVJbmZvKGZpbGVuYW1lKS5wYXRoKCk7CisgICAgICAgICAgICAvLyBE ZWNvZGUgdGhlIGVuY29kZWQgdXJpIGRhdGEKKyAgICAgICAgICAgIFFTdHJp bmcgY3N2RGF0YSA9IFFVcmw6OmZyb21QZXJjZW50RW5jb2Rpbmcod3JpdGVf ZGF0YS50b1V0ZjgoKSk7CisKKyAgICAgICAgICAgIFFGaWxlIGNzdmZpbGUo ZmlsZW5hbWUpOworICAgICAgICAgICAgaWYgKCFjc3ZmaWxlLm9wZW4oUUlP RGV2aWNlOjpXcml0ZU9ubHkgfCBRSU9EZXZpY2U6OlRleHQpKQorICAgICAg ICAgICAgeworICAgICAgICAgICAgICAgIFFNZXNzYWdlQm94OjppbmZvcm1h dGlvbih0aGlzLCB0cigiU2F2ZSBjc3YgZmlsZSIpLCB0cigiRXJyb3Igd2hp bGUgb3BlbmluZyBmaWxlICUxIikuYXJnKGZpbGVuYW1lKSk7CisgICAgICAg ICAgICAgICAgcmV0dXJuIHJldHVybl92YWw7CisgICAgICAgICAgICB9Cisg ICAgICAgICAgICAvLyBXcml0ZSB0aGUgY3N2IGRhdGEgdG8gZmlsZQorICAg ICAgICAgICAgcWludDY0IGRhdGFfcmV0dXJuID0gY3N2ZmlsZS53cml0ZShj c3ZEYXRhLnRvVXRmOCgpLmNvbnN0RGF0YSgpKTsKKyAgICAgICAgICAgIGlm IChkYXRhX3JldHVybiA9PSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAg ICAgICAgICBRTWVzc2FnZUJveDo6aW5mb3JtYXRpb24odGhpcywgdHIoIlNh dmUgY3N2IGZpbGUiKSwgdHIoIkVycm9yIHdoaWxlIHdyaXRpbmcgZGF0YSB0 byBmaWxlICUxIikuYXJnKGZpbGVuYW1lKSk7CisgICAgICAgICAgICAgICAg Y3N2ZmlsZS5jbG9zZSgpOworICAgICAgICAgICAgICAgIHJldHVybiByZXR1 cm5fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3N2ZmlsZS5j bG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldHVy bl92YWw7Cit9CisKK3ZvaWQgQnJvd3NlcldpbmRvdzo6Y3VycmVudF9kaXJf cGF0aChjb25zdCBRU3RyaW5nICZkaXIpCit7CisgICAgbV9kaXIgPSBkaXI7 Cit9CisKIC8vIFNsb3Q6IExpbmsgaXMgb3BlbiBmcm9tIHBnQWRtaW4gbWFp bndpbmRvdwogdm9pZCBCcm93c2VyV2luZG93Ojp1cmxMaW5rQ2xpY2tlZChj b25zdCBRVXJsICZuYW1lKQogeworICAgIC8vIENoZWNrIHRoYXQgcmVxdWVz dCBjb250YWlucyB0aGUgZGF0YSBkb3dubG9hZCBhdCBjbGllbnQgc2lkZQor ICAgIFFOZXR3b3JrUmVxdWVzdCByZXF1ZXN0OworICAgIGlmIChjaGVja0Ns aWVudERvd25sb2FkKG5hbWUsIHJlcXVlc3QpKQorICAgICAgICByZXR1cm47 CisKICAgICAvLyBGaXJzdCBjaGVjayBpcyB0aGVyZSBhbnkgdGFiIG9wZW5l ZCB3aXRoIHNhbWUgVVJMIHRoZW4gb3BlbiBpdCBhZ2Fpbi4KICAgICBpbnQg dGFiRm91bmQgPSBmaW5kVVJMVGFiKG5hbWUpOwogCkBAIC0zNTMsNiArNzcz LDExIEBAIHZvaWQgQnJvd3NlcldpbmRvdzo6dXJsTGlua0NsaWNrZWQoY29u c3QgUVVybCAmbmFtZSkKICAgICAgICAgbV9hZGROZXdHcmlkTGF5b3V0LT5z ZXRDb250ZW50c01hcmdpbnMoMCwgMCwgMCwgMCk7CiAgICAgICAgIG1fYWRk TmV3V2ViVmlldyA9IG5ldyBXZWJWaWV3V2luZG93KG1fYWRkTmV3VGFiKTsK IAorCS8vIExpc3RlbiBmb3IgdGhlIGRvd25sb2FkIHJlcXVlc3QgZnJvbSB0 aGUgd2ViIHBhZ2UKKwltX2FkZE5ld1dlYlZpZXctPnBhZ2UoKS0+c2V0Rm9y d2FyZFVuc3VwcG9ydGVkQ29udGVudCh0cnVlKTsKKyAgICAgICAgY29ubmVj dChtX2FkZE5ld1dlYlZpZXctPnBhZ2UoKSwgU0lHTkFMKGRvd25sb2FkUmVx dWVzdGVkKGNvbnN0IFFOZXR3b3JrUmVxdWVzdCAmKSksIHRoaXMsIFNMT1Qo ZG93bmxvYWQoY29uc3QgUU5ldHdvcmtSZXF1ZXN0ICYpKSk7CisgICAgICAg IGNvbm5lY3QobV9hZGROZXdXZWJWaWV3LT5wYWdlKCksIFNJR05BTCh1bnN1 cHBvcnRlZENvbnRlbnQoUU5ldHdvcmtSZXBseSopKSwgdGhpcywgU0xPVCh1 bnN1cHBvcnRlZENvbnRlbnQoUU5ldHdvcmtSZXBseSopKSk7CisKICAgICAg ICAgbV93aWRnZXQgPSBuZXcgUVdpZGdldChtX2FkZE5ld1RhYik7CiAgICAg ICAgIG1fdG9vbEJ0bkJhY2sgPSBuZXcgUVRvb2xCdXR0b24obV93aWRnZXQp OwogICAgICAgICBtX3Rvb2xCdG5CYWNrLT5zZXRGaXhlZEhlaWdodChQR0Ff QlROX1NJWkUpOwpkaWZmIC0tZ2l0IGEvcnVudGltZS9Ccm93c2VyV2luZG93 LmggYi9ydW50aW1lL0Jyb3dzZXJXaW5kb3cuaAppbmRleCA0M2Y5MGZlLi43 NjM1NTQ5IDEwMDY0NAotLS0gYS9ydW50aW1lL0Jyb3dzZXJXaW5kb3cuaAor KysgYi9ydW50aW1lL0Jyb3dzZXJXaW5kb3cuaApAQCAtNTQsNiArNTQsMTIg QEAgcHVibGljIHNsb3RzOgogICAgIHZvaWQgdGFiSW5kZXhDaGFuZ2VkKGlu dCBpbmRleCk7CiAgICAgdm9pZCBnb0JhY2tQYWdlKCk7CiAgICAgdm9pZCBn b0ZvcndhcmRQYWdlKCk7CisgICAgdm9pZCBkb3dubG9hZChjb25zdCBRTmV0 d29ya1JlcXVlc3QgJnJlcXVlc3QpOworICAgIHZvaWQgdW5zdXBwb3J0ZWRD b250ZW50KFFOZXR3b3JrUmVwbHkgKiByZXBseSk7CisgICAgdm9pZCBkb3du bG9hZEZpbmlzaGVkKCk7CisgICAgdm9pZCBkb3dubG9hZEZpbGVQcm9ncmVz cyhxaW50NjQgLCBxaW50NjQgKTsKKyAgICB2b2lkIHByb2dyZXNzQ2FuY2Vs ZWQoKTsKKyAgICB2b2lkIGN1cnJlbnRfZGlyX3BhdGgoY29uc3QgUVN0cmlu ZyAmZGlyKTsKIAogcHJpdmF0ZToKICAgICBRU3RyaW5nIG1fYXBwU2VydmVy VXJsOwpAQCAtNzksMTAgKzg1LDE5IEBAIHByaXZhdGU6CiAKICAgICBib29s IG1faW5pdGlhbExvYWQ7CiAgICAgaW50IG1fbG9hZEF0dGVtcHQ7CisgICAg UVN0cmluZyBtX2Rvd25sb2FkRmlsZW5hbWU7CisgICAgaW50IG1fZG93bmxv YWRTdGFydGVkOworICAgIGludCBtX2Rvd25sb2FkQ2FuY2VsbGVkOworICAg IFFGaWxlICptX2ZpbGU7CisgICAgUVByb2dyZXNzRGlhbG9nICptX3Byb2dy ZXNzRGlhbG9nOworICAgIFFTdHJpbmcgbV9kZWZhdWx0RmlsZW5hbWU7Cisg ICAgUVN0cmluZyBtX2xhc3Rfb3Blbl9mb2xkZXJfcGF0aDsKKyAgICBRU3Ry aW5nIG1fZGlyOwogCiAgICAgdm9pZCBjcmVhdGVBY3Rpb25zKCk7CiAgICAg dm9pZCBwYXVzZShpbnQgc2Vjb25kcyA9IDEpOwogICAgIGludCAgZmluZFVS TFRhYihjb25zdCBRVXJsICZuYW1lKTsKKyAgICBib29sIGNoZWNrQ2xpZW50 RG93bmxvYWQoY29uc3QgUVVybCAmbmFtZSwgY29uc3QgUU5ldHdvcmtSZXF1 ZXN0ICZyZXF1ZXN0KTsKIH07CiAKICNlbmRpZiAvLyBCUk9XU0VSV0lORE9X X0gKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3Rvb2xzL3NxbGVkaXRvci90 ZW1wbGF0ZXMvc3FsZWRpdG9yL2pzL3NxbGVkaXRvci5qcyBiL3dlYi9wZ2Fk bWluL3Rvb2xzL3NxbGVkaXRvci90ZW1wbGF0ZXMvc3FsZWRpdG9yL2pzL3Nx bGVkaXRvci5qcwppbmRleCAyOTVjYWY0Li4yZGYyYjVmIDEwMDY0NAotLS0g YS93ZWIvcGdhZG1pbi90b29scy9zcWxlZGl0b3IvdGVtcGxhdGVzL3NxbGVk aXRvci9qcy9zcWxlZGl0b3IuanMKKysrIGIvd2ViL3BnYWRtaW4vdG9vbHMv c3FsZWRpdG9yL3RlbXBsYXRlcy9zcWxlZGl0b3IvanMvc3FsZWRpdG9yLmpz CkBAIC0yNTg3LDcgKzI1ODcsNyBAQCBkZWZpbmUoCiAgICAgICAgICAgICAg ICAga2V5cyA9IF8ucGx1Y2soc2VsZi5jb2x1bW5zLCAnbmFtZScpOwogCiAg ICAgICAgICAgICAvLyBGZXRjaCB0aGUgaXRlbXMgZnJvbSBmdWxsQ29sbGVj dGlvbiBhbmQgY29udmVydCBpdCBhcyBjc3YgZm9ybWF0Ci0gICAgICAgICAg ICB2YXIgY3N2ID0gbGFiZWxzLmpvaW4oJywnKSArICdcbic7CisgICAgICAg ICAgICB2YXIgY3N2ID0ga2V5cy5qb2luKCcsJykgKyAnXG4nOwogICAgICAg ICAgICAgY3N2ICs9IGNvbGwubWFwKGZ1bmN0aW9uKGl0ZW0pIHsKICAgICAg ICAgICAgICAgICByZXR1cm4gXy5tYXAoa2V5cywgZnVuY3Rpb24oa2V5KSB7 CiAgICAgICAgICAgICAgICAgICB2YXIgY2VsbCA9IGNzdl9jb2wgW2tleV0u Y2VsbCwKQEAgLTI2MDAsNyArMjYwMCw3IEBAIGRlZmluZSgKICAgICAgICAg ICAgIH0pLmpvaW4oJ1xuJyk7CiAKICAgICAgICAgICAgIC8vIERvd25sb2Fk IHRoZSBmaWxlLgotICAgICAgICAgICAgdmFyIGVuY29kZWRVcmkgPSBlbmNv ZGVVUkkoJ2RhdGE6dGV4dC9jc3Y7Y2hhcnNldD11dGYtOCwnICsgY3N2KSwK KyAgICAgICAgICAgIHZhciBlbmNvZGVkVXJpID0gZW5jb2RlVVJJKCdkYXRh OnRleHQvY3N2JmNoYXJzZXQ9dXRmLTgmZmlsZW5hbWU9ZG93bmxvYWQuY3N2 JnZhbHVlPScgKyBjc3YpLAogICAgICAgICAgICAgICAgICAgICBsaW5rID0g ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogICAgICAgICAgICAgbGlu ay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBlbmNvZGVkVXJpKTsKIAo= --001a1146c9aa4b5d230536f3226c Content-Type: text/plain Content-Disposition: inline Content-Transfer-Encoding: 8bit MIME-Version: 1.0 -- Sent via pgadmin-hackers mailing list (pgadmin-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgadmin-hackers --001a1146c9aa4b5d230536f3226c--