Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dNQjx-0000GV-0j for pgadmin-hackers@arkaria.postgresql.org; Tue, 20 Jun 2017 21:31:13 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dNQjv-0002B1-8g for pgadmin-hackers@arkaria.postgresql.org; Tue, 20 Jun 2017 21:31:11 +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 1dNQil-00022R-Ht for pgadmin-hackers@lists.postgresql.org; Tue, 20 Jun 2017 21:30:00 +0000 Received: from mail-ua0-x22a.google.com ([2607:f8b0:400c:c08::22a]) by makus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.84_2) (envelope-from ) id 1dNQiZ-0005Vz-8s for pgadmin-hackers@postgresql.org; Tue, 20 Jun 2017 21:29:54 +0000 Received: by mail-ua0-x22a.google.com with SMTP id j53so81127081uaa.2 for ; Tue, 20 Jun 2017 14:29:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pivotal-io.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=95mfZv8AfVctpcvNCnH1t21snyX101e6TMESqdBmpYA=; b=e6f81E8avw0cWvUmU9aR7z8lej7moQhjttPsUdIWaSxClh8A9g7/4qFDAsldohLAAk CsM4ovvK1V7LN99qugAyHEbaHgVcmBSIOxSTokyH3KwLIxD9MVMZKovnkR1C3UN4d2Ku HO4PtT0daBHPCESF1uHex1FaCHDeUZlD9Ol5XuUoK/e7JQ8ZmiUHhdBgMzyQPy615XtJ 9Z2VXCp7QKss7UyVTfpvBQuSkuS5mvhlcDLqvNS4wCS1LzN+Afs9FffN2kykTaQ9LDv9 zsc5lYhVgFnT2wH2S6z2703F6neJZ1699bk9j6SYgbEl7cOfuNGLK+PReRcUTa0DAY5U Ho9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=95mfZv8AfVctpcvNCnH1t21snyX101e6TMESqdBmpYA=; b=N7o7bSoSl4RuqjNQn2wF/a6xtppLomVm1Szn+3bqMsPD9LN58vVkhj29rJmEiGFsID 267zzafTaEKn+PEgovOxeqBcq+54gEXts6sBuUMVSAkyr66jfxqOqf33+Jkdk/nWAYIP MfAqKchcTLSZ8IvyyxflFFufLpCKIgDsVmJt8n9YIDZ9nDEQU76XdJrr5jHYsRaw3Jxm gOZiom9Ftj2ZUmV5GSfpmjvH3ywRSNz9EFJmdJIwDEiSlNlC16be4zkjZFj4uFNh8xCy nYKnN24lJ+TkAejmHcCoqiOwSsrI+sgopioSGezbLV0Z2tqIZ/7FUObpd/vkQ65gD9Fc LeiA== X-Gm-Message-State: AKS2vOwxin4INwjSESUDZBpevjhcCXPh4ztfvdLK8NhTTfvLP/LLFFp1 U7FnMACUS4Qh29zWwJYq+uZbGJqGrnoU X-Received: by 10.176.16.11 with SMTP id f11mr10782450uab.146.1497994184339; Tue, 20 Jun 2017 14:29:44 -0700 (PDT) MIME-Version: 1.0 Received: by 10.176.85.151 with HTTP; Tue, 20 Jun 2017 14:29:23 -0700 (PDT) In-Reply-To: References: From: George Gelashvili Date: Tue, 20 Jun 2017 17:29:23 -0400 Message-ID: Subject: Re: [pgadmin-hackers] [pgAdmin4] [PATCH] History Tab rewrite in React To: Dave Page Cc: Surinder Kumar , Ashesh Vashi , Shruti B Iyer , Joao Pedro De Almeida Pereira , Murtuza Zabuawala , pgadmin-hackers , Sarah McAlear Content-Type: multipart/mixed; boundary="f403045e1d6c3cf30605526af3d5" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Unsubscribe: , List-Archive: Precedence: bulk --f403045e1d6c3cf30605526af3d5 Content-Type: multipart/alternative; boundary="f403045e1d6c3cf30205526af3d3" --f403045e1d6c3cf30205526af3d3 Content-Type: text/plain; charset="UTF-8" We learned that the underlying issue was related to react-dom's SyntheticEvent.augmentClass function being undefined. This seems to be caused by attempted property assignment after the SyntheticEvent had been replaced by a Proxy of itself. This works fine in Chromium et al, but QtWebKit doesn't deal with Proxy Event objects well. Moving the augmentClass definition and assignment up above the Proxy stuff resolves the issue in a PR to React: https://github.com/facebook/react/pull/10011 This has a decent chance of being rejected, as QtWebKit appears to be losing support. While and if this is being sorted out, we vendorized React, as one does. Here are patches on the version we were using previously, and the fix from the above PR. We started talking to some Pivotal folks about QtWebKit to see if we can fix the Proxy Event issue in the browser. We are also looking into replacements for QtWebKit. Thanks! George and Sarah On Tue, Jun 13, 2017 at 7:19 AM, Dave Page wrote: > On Tue, Jun 13, 2017 at 11:47 AM, Surinder Kumar > wrote: > > On Tue, Jun 13, 2017 at 4:05 PM, Dave Page wrote: > >> > >> On Tue, Jun 13, 2017 at 11:31 AM, Surinder Kumar > >> wrote: > >> > > >> > On Tue, Jun 13, 2017 at 3:56 PM, Dave Page wrote: > >> >> > >> >> On Tue, Jun 13, 2017 at 11:22 AM, Ashesh Vashi > >> >> wrote: > >> >> > On Tue, Jun 13, 2017 at 2:47 PM, Dave Page > wrote: > >> >> >> > >> >> >> And then I find a problem. Sigh. > >> >> >> > >> >> >> When running in the desktop runtime, under QtWekKit (the forked, > >> >> >> updated version that is by far the best of the browser engines > we've > >> >> >> used), we get the attached error at startup. I don't see this > under > >> >> >> QtWebEngine, though as we've already found, that's not usable for > >> >> >> other reasons. > >> >> >> > >> >> >> Is this fixable? > >> >> > > >> >> > As per 'http://qtwebkit.blogspot.in/2016/08/qtwebkit-im-back.html' > : > >> >> > " > >> >> > WebKit engine itself has not been updated since Qt 5.2 release. > >> >> > That's > >> >> > why > >> >> > it didn't support recent changes in Web standards that happened > after > >> >> > 2013, > >> >> > including: new JavaScript language standard ES2015 (also known as > >> >> > ES6), > >> >> > as > >> >> > well as improvements in DOM API and CSS. > >> >> > ... > >> >> > " > >> >> > > >> >> > Could this be a reason? > >> >> > >> >> For the old webkit, certainly, but if you read further down, the > >> >> version we're using has been updated and does now claim to support > >> >> most of ES2015. > >> > > >> > In fact the modern browsers don't support ES6 JS so the JS files > >> > containing > >> > ES6 code are first transpiled using babel into JS that browsers > >> > supports. > >> > >> Well, we *could* do that, but are we? I'm not sure the current code > >> does anything more than lint and webpack it. > > > > Yes. babel is used in webpack config which converts JSX, JS and react JS > > library code into browser supportable JS code and put them into generated > > directory which we are then imported in sqleditor.js > > Ahh, yes - I see it (still getting my head around this stuff). So, > perhaps we need a different transform to support webkit? > > > -- > Dave Page > Blog: http://pgsnake.blogspot.com > Twitter: @pgsnake > > EnterpriseDB UK: http://www.enterprisedb.com > The Enterprise PostgreSQL Company > > > -- > Sent via pgadmin-hackers mailing list (pgadmin-hackers@postgresql.org) > To make changes to your subscription: > http://www.postgresql.org/mailpref/pgadmin-hackers > --f403045e1d6c3cf30205526af3d3 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
We learned that the underlying issue was related to react-= dom's SyntheticEvent.augmentClass function being undefined.

This seems to be caused by attempted property assignment after the = SyntheticEvent had been replaced by a Proxy of itself. This works fine in C= hromium et al, but QtWebKit doesn't deal with Proxy Event objects well.=
Moving the augmentClass definition and assignment up above the P= roxy stuff resolves the issue in a PR to React:=C2=A0https://github.com/facebook/react/pull/1= 0011

This has a decent chance of being rejecte= d, as QtWebKit appears to be losing support.

While= and if this is being sorted out, we vendorized React, as one does. Here ar= e patches on the version we were using previously, and the fix from the abo= ve PR.

We started talking to some Pivotal folks about QtWebKit to se= e if we can fix the Proxy Event issue in the browser.=C2=A0
We ar= e also looking into replacements for QtWebKit.=C2=A0

Thanks!
George and Sarah

On Tue, Jun 13, 2017 at 7:19 AM,= Dave Page <dpage@pgadmin.org> wrote:
On Tue, Jun 13, 2017 at 11:47 AM, Surinder Kumar
<surinder.kumar@enterprisedb.com> wrote:
> On Tue, Jun 13, 2017 at 4:05 PM, Dave Page <dpage@pgadmin.org> wrote:
>>
>> On Tue, Jun 13, 2017 at 11:31 AM, Surinder Kumar
>> <surinder.ku= mar@enterprisedb.com> wrote:
>> >
>> > On Tue, Jun 13, 2017 at 3:56 PM, Dave Page <dpage@pgadmin.org> wrote:
>> >>
>> >> On Tue, Jun 13, 2017 at 11:22 AM, Ashesh Vashi
>> >> <ashe= sh.vashi@enterprisedb.com> wrote:
>> >> > On Tue, Jun 13, 2017 at 2:47 PM, Dave Page <dpage@pgadmin.org> wrote:
>> >> >>
>> >> >> And then I find a problem. Sigh.
>> >> >>
>> >> >> When running in the desktop runtime, under QtWek= Kit (the forked,
>> >> >> updated version that is by far the best of the b= rowser engines we've
>> >> >> used), we get the attached error at startup. I d= on't see this under
>> >> >> QtWebEngine, though as we've already found, = that's not usable for
>> >> >> other reasons.
>> >> >>
>> >> >> Is this fixable?
>> >> >
>> >> > As per 'http://q= twebkit.blogspot.in/2016/08/qtwebkit-im-back.html':
>> >> > "
>> >> > WebKit engine itself has not been updated since Qt 5= .2 release.
>> >> > That's
>> >> > why
>> >> > it didn't support recent changes in Web standard= s that happened after
>> >> > 2013,
>> >> > including: new JavaScript language standard ES2015 (= also known as
>> >> > ES6),
>> >> > as
>> >> > well as improvements in DOM API and CSS.
>> >> > ...
>> >> > "
>> >> >
>> >> > Could this be a reason?
>> >>
>> >> For the old webkit, certainly, but if you read further do= wn, the
>> >> version we're using has been updated and does now cla= im to support
>> >> most of ES2015.
>> >
>> > In fact the modern browsers don't support ES6 JS so the J= S files
>> > containing
>> > ES6 code are first transpiled using babel into JS that browse= rs
>> > supports.
>>
>> Well, we *could* do that, but are we? I'm not sure the current= code
>> does anything more than lint and webpack it.
>
> Yes. babel is used in webpack config which converts JSX, JS and react = JS
> library code into browser supportable JS code and put them into genera= ted
> directory which we are then imported in sqleditor.js

Ahh, yes - I see it (still getting my head around this stuff). = So,
perhaps we need a different transform to support webkit?


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

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


--
Sent via pgadmin-hackers mailing list (pgadmin-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-ha= ckers

--f403045e1d6c3cf30205526af3d3-- --f403045e1d6c3cf30605526af3d5 Content-Type: text/plain; charset="US-ASCII"; name="01-vendorize-react.diff" Content-Disposition: attachment; filename="01-vendorize-react.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_j462zy990 ZGlmZiAtLWdpdCBhL3dlYi9wYWNrYWdlLmpzb24gYi93ZWIvcGFja2FnZS5qc29uCmluZGV4IGNk ODk5MmY5Li5iNThhZjJlOSAxMDA2NDQKLS0tIGEvd2ViL3BhY2thZ2UuanNvbgorKysgYi93ZWIv cGFja2FnZS5qc29uCkBAIC0zMyw4ICszMyw4IEBACiAgICAgImltbXV0YWJpbGl0eS1oZWxwZXIi OiAiXjIuMi4wIiwKICAgICAiaW1wb3J0cy1sb2FkZXIiOiAiZ2l0K2h0dHBzOi8vZ2l0aHViLmNv bS93ZWJwYWNrLWNvbnRyaWIvaW1wb3J0cy1sb2FkZXIuZ2l0IzQ0ZDZmNDg0NjNiMjU2YTE3YzFi YTZmZDliNWNjMTQ0OWI0ZTM3OWQiLAogICAgICJtb21lbnQiOiAiXjIuMTguMSIsCi0gICAgInJl YWN0IjogIn4xNS40LjIiLAotICAgICJyZWFjdC1kb20iOiAifjE1LjQuMiIsCisgICAgInJlYWN0 IjogImZpbGU6Li4vd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdCIsCisgICAgInJlYWN0 LWRvbSI6ICJmaWxlOi4uL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tIiwKICAg ICAicmVxdWlyZWpzIjogIn4yLjMuMyIsCiAgICAgInVuZGVyc2NvcmUiOiAifjEuOC4zIiwKICAg ICAid2F0Y2hpZnkiOiAifjMuOS4wIgpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3Zl bmRvci9yZWFjdC1kb20vTElDRU5TRSBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3Qt ZG9tL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjkxYjhmNmY3 Ci0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20v TElDRU5TRQpAQCAtMCwwICsxLDMxIEBACitCU0QgTGljZW5zZQorCitGb3IgUmVhY3Qgc29mdHdh cmUKKworQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCitBbGwgcmln aHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCBw cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgKiBSZWRp c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo dCBub3RpY2UsIHRoaXMKKyAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk aXNjbGFpbWVyLgorCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICB0aGlzIGxpc3Qgb2YgY29uZGl0 aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisg ICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K KworICogTmVpdGhlciB0aGUgbmFtZSBGYWNlYm9vayBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250 cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8KKyAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBk ZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljCisgICBwcmlvciB3cml0 dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlS SUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKK0FOWSBFWFBSRVNTIE9S IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJ TVBMSUVECitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ QVJUSUNVTEFSIFBVUlBPU0UgQVJFCitESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg Q09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorQU5ZIERJUkVD VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO VElBTCBEQU1BR0VTCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5U IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CitMT1NTIE9GIFVTRSwgREFUQSwgT1Ig UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04K K0FOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB QklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworU09GVFdBUkUsIEVWRU4gSUYg QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCmRpZmYgLS1naXQgYS93 ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9QQVRFTlRTIGIvd2ViL3BnYWRtaW4v c3RhdGljL3ZlbmRvci9yZWFjdC1kb20vUEFURU5UUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMC4uOWM5ZjhlODcKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0 aWMvdmVuZG9yL3JlYWN0LWRvbS9QQVRFTlRTCkBAIC0wLDAgKzEsMzMgQEAKK0FkZGl0aW9uYWwg R3JhbnQgb2YgUGF0ZW50IFJpZ2h0cyBWZXJzaW9uIDIKKworIlNvZnR3YXJlIiBtZWFucyB0aGUg UmVhY3Qgc29mdHdhcmUgZGlzdHJpYnV0ZWQgYnkgRmFjZWJvb2ssIEluYy4KKworRmFjZWJvb2ss IEluYy4gKCJGYWNlYm9vayIpIGhlcmVieSBncmFudHMgdG8gZWFjaCByZWNpcGllbnQgb2YgdGhl IFNvZnR3YXJlCisoInlvdSIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSwg bm9uLWV4Y2x1c2l2ZSwgaXJyZXZvY2FibGUKKyhzdWJqZWN0IHRvIHRoZSB0ZXJtaW5hdGlvbiBw cm92aXNpb24gYmVsb3cpIGxpY2Vuc2UgdW5kZXIgYW55IE5lY2Vzc2FyeQorQ2xhaW1zLCB0byBt YWtlLCBoYXZlIG1hZGUsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0LCBhbmQgb3Ro ZXJ3aXNlCit0cmFuc2ZlciB0aGUgU29mdHdhcmUuIEZvciBhdm9pZGFuY2Ugb2YgZG91YnQsIG5v IGxpY2Vuc2UgaXMgZ3JhbnRlZCB1bmRlcgorRmFjZWJvb2sncyByaWdodHMgaW4gYW55IHBhdGVu dCBjbGFpbXMgdGhhdCBhcmUgaW5mcmluZ2VkIGJ5IChpKSBtb2RpZmljYXRpb25zCit0byB0aGUg U29mdHdhcmUgbWFkZSBieSB5b3Ugb3IgYW55IHRoaXJkIHBhcnR5IG9yIChpaSkgdGhlIFNvZnR3 YXJlIGluCitjb21iaW5hdGlvbiB3aXRoIGFueSBzb2Z0d2FyZSBvciBvdGhlciB0ZWNobm9sb2d5 LgorCitUaGUgbGljZW5zZSBncmFudGVkIGhlcmV1bmRlciB3aWxsIHRlcm1pbmF0ZSwgYXV0b21h dGljYWxseSBhbmQgd2l0aG91dCBub3RpY2UsCitpZiB5b3UgKG9yIGFueSBvZiB5b3VyIHN1YnNp ZGlhcmllcywgY29ycG9yYXRlIGFmZmlsaWF0ZXMgb3IgYWdlbnRzKSBpbml0aWF0ZQorZGlyZWN0 bHkgb3IgaW5kaXJlY3RseSwgb3IgdGFrZSBhIGRpcmVjdCBmaW5hbmNpYWwgaW50ZXJlc3QgaW4s IGFueSBQYXRlbnQKK0Fzc2VydGlvbjogKGkpIGFnYWluc3QgRmFjZWJvb2sgb3IgYW55IG9mIGl0 cyBzdWJzaWRpYXJpZXMgb3IgY29ycG9yYXRlCithZmZpbGlhdGVzLCAoaWkpIGFnYWluc3QgYW55 IHBhcnR5IGlmIHN1Y2ggUGF0ZW50IEFzc2VydGlvbiBhcmlzZXMgaW4gd2hvbGUgb3IKK2luIHBh cnQgZnJvbSBhbnkgc29mdHdhcmUsIHRlY2hub2xvZ3ksIHByb2R1Y3Qgb3Igc2VydmljZSBvZiBG YWNlYm9vayBvciBhbnkgb2YKK2l0cyBzdWJzaWRpYXJpZXMgb3IgY29ycG9yYXRlIGFmZmlsaWF0 ZXMsIG9yIChpaWkpIGFnYWluc3QgYW55IHBhcnR5IHJlbGF0aW5nCit0byB0aGUgU29mdHdhcmUu IE5vdHdpdGhzdGFuZGluZyB0aGUgZm9yZWdvaW5nLCBpZiBGYWNlYm9vayBvciBhbnkgb2YgaXRz CitzdWJzaWRpYXJpZXMgb3IgY29ycG9yYXRlIGFmZmlsaWF0ZXMgZmlsZXMgYSBsYXdzdWl0IGFs bGVnaW5nIHBhdGVudAoraW5mcmluZ2VtZW50IGFnYWluc3QgeW91IGluIHRoZSBmaXJzdCBpbnN0 YW5jZSwgYW5kIHlvdSByZXNwb25kIGJ5IGZpbGluZyBhCitwYXRlbnQgaW5mcmluZ2VtZW50IGNv dW50ZXJjbGFpbSBpbiB0aGF0IGxhd3N1aXQgYWdhaW5zdCB0aGF0IHBhcnR5IHRoYXQgaXMKK3Vu cmVsYXRlZCB0byB0aGUgU29mdHdhcmUsIHRoZSBsaWNlbnNlIGdyYW50ZWQgaGVyZXVuZGVyIHdp bGwgbm90IHRlcm1pbmF0ZQordW5kZXIgc2VjdGlvbiAoaSkgb2YgdGhpcyBwYXJhZ3JhcGggZHVl IHRvIHN1Y2ggY291bnRlcmNsYWltLgorCitBICJOZWNlc3NhcnkgQ2xhaW0iIGlzIGEgY2xhaW0g b2YgYSBwYXRlbnQgb3duZWQgYnkgRmFjZWJvb2sgdGhhdCBpcworbmVjZXNzYXJpbHkgaW5mcmlu Z2VkIGJ5IHRoZSBTb2Z0d2FyZSBzdGFuZGluZyBhbG9uZS4KKworQSAiUGF0ZW50IEFzc2VydGlv biIgaXMgYW55IGxhd3N1aXQgb3Igb3RoZXIgYWN0aW9uIGFsbGVnaW5nIGRpcmVjdCwgaW5kaXJl Y3QsCitvciBjb250cmlidXRvcnkgaW5mcmluZ2VtZW50IG9yIGluZHVjZW1lbnQgdG8gaW5mcmlu Z2UgYW55IHBhdGVudCwgaW5jbHVkaW5nIGEKK2Nyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbS4K ZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL1JFQURNRS5t ZCBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL1JFQURNRS5tZApuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uNzllNTEzM2EKLS0tIC9kZXYvbnVsbAorKysg Yi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9SRUFETUUubWQKQEAgLTAsMCAr MSw1NCBAQAorIyBgcmVhY3QtZG9tYAorCitUaGlzIHBhY2thZ2Ugc2VydmVzIGFzIHRoZSBlbnRy eSBwb2ludCBvZiB0aGUgRE9NLXJlbGF0ZWQgcmVuZGVyaW5nIHBhdGhzLiBJdCBpcyBpbnRlbmRl ZCB0byBiZSBwYWlyZWQgd2l0aCB0aGUgaXNvbW9ycGhpYyBSZWFjdCwgd2hpY2ggd2lsbCBiZSBz aGlwcGVkIGFzIGByZWFjdGAgdG8gbnBtLgorCisjIyBJbnN0YWxsYXRpb24KKworYGBgc2gKK25w bSBpbnN0YWxsIHJlYWN0IHJlYWN0LWRvbQorYGBgCisKKyMjIFVzYWdlCisKKyMjIyBJbiB0aGUg YnJvd3NlcgorCitgYGBqcwordmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTsKK3ZhciBSZWFj dERPTSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpOworCitjbGFzcyBNeUNvbXBvbmVudCBleHRlbmRz IFJlYWN0LkNvbXBvbmVudCB7CisgIHJlbmRlcigpIHsKKyAgICByZXR1cm4gPGRpdj5IZWxsbyBX b3JsZDwvZGl2PjsKKyAgfQorfQorCitSZWFjdERPTS5yZW5kZXIoPE15Q29tcG9uZW50IC8+LCBu b2RlKTsKK2BgYAorCisjIyMgT24gdGhlIHNlcnZlcgorCitgYGBqcwordmFyIFJlYWN0ID0gcmVx dWlyZSgncmVhY3QnKTsKK3ZhciBSZWFjdERPTVNlcnZlciA9IHJlcXVpcmUoJ3JlYWN0LWRvbS9z ZXJ2ZXInKTsKKworY2xhc3MgTXlDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQgewor ICByZW5kZXIoKSB7CisgICAgcmV0dXJuIDxkaXY+SGVsbG8gV29ybGQ8L2Rpdj47CisgIH0KK30K KworUmVhY3RET01TZXJ2ZXIucmVuZGVyVG9TdHJpbmcoPE15Q29tcG9uZW50IC8+KTsKK2BgYAor CisjIyBBUEkKKworIyMjIGByZWFjdC1kb21gCisKKy0gYGZpbmRET01Ob2RlYAorLSBgcmVuZGVy YAorLSBgdW5tb3VudENvbXBvbmVudEF0Tm9kZWAKKworIyMjIGByZWFjdC1kb20vc2VydmVyYAor CistIGByZW5kZXJUb1N0cmluZ2AKKy0gYHJlbmRlclRvU3RhdGljTWFya3VwYApkaWZmIC0tZ2l0 IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vZGlzdC9yZWFjdC1kb20tc2Vy dmVyLmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vZGlzdC9yZWFjdC1k b20tc2VydmVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi44ZWIyYzkw YwotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9t L2Rpc3QvcmVhY3QtZG9tLXNlcnZlci5qcwpAQCAtMCwwICsxLDE2MjIzIEBACisgLyoqCisgICog UmVhY3RET01TZXJ2ZXIgdjE1LjQuMgorICAqLworCis7KGZ1bmN0aW9uKGYpIHsKKyAgLy8gQ29t bW9uSlMKKyAgaWYgKHR5cGVvZiBleHBvcnRzID09PSAib2JqZWN0IiAmJiB0eXBlb2YgbW9kdWxl ICE9PSAidW5kZWZpbmVkIikgeworICAgIG1vZHVsZS5leHBvcnRzID0gZihyZXF1aXJlKCdyZWFj dCcpKTsKKworICAvLyBSZXF1aXJlSlMKKyAgfSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSAi ZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIHsKKyAgICBkZWZpbmUoWydyZWFjdCddLCBmKTsKKwor ICAvLyA8c2NyaXB0PgorICB9IGVsc2UgeworICAgIHZhciBnOworICAgIGlmICh0eXBlb2Ygd2lu ZG93ICE9PSAidW5kZWZpbmVkIikgeworICAgICAgZyA9IHdpbmRvdzsKKyAgICB9IGVsc2UgaWYg KHR5cGVvZiBnbG9iYWwgIT09ICJ1bmRlZmluZWQiKSB7CisgICAgICBnID0gZ2xvYmFsOworICAg IH0gZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09ICJ1bmRlZmluZWQiKSB7CisgICAgICBnID0gc2Vs ZjsKKyAgICB9IGVsc2UgeworICAgICAgLy8gd29ya3MgcHJvdmlkaW5nIHdlJ3JlIG5vdCBpbiAi dXNlIHN0cmljdCI7CisgICAgICAvLyBuZWVkZWQgZm9yIEphdmEgOCBOYXNob3JuCisgICAgICAv LyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8zMDM3CisgICAg ICBnID0gdGhpczsKKyAgICB9CisgICAgZy5SZWFjdERPTVNlcnZlciA9IGYoZy5SZWFjdCk7Cisg IH0KK30pKGZ1bmN0aW9uKFJlYWN0KSB7CisgIHJldHVybiAoZnVuY3Rpb24oZil7cmV0dXJuIGYo KX0pKGZ1bmN0aW9uKCl7dmFyIGRlZmluZSxtb2R1bGUsZXhwb3J0cztyZXR1cm4gKGZ1bmN0aW9u IGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVv ZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lm KGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIr bysiJyIpO3Rocm93IGYuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsZn12YXIgbD1uW29dPXtleHBv cnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1b ZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBv cnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2Zvcih2YXIgbz0w O288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSh7MTpbZnVuY3Rpb24oX2RlcmVxXyxt b2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29r LCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUg aXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICog TElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBB biBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0 aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBz dHJpY3QnOworCit2YXIgQVJJQURPTVByb3BlcnR5Q29uZmlnID0geworICBQcm9wZXJ0aWVzOiB7 CisgICAgLy8gR2xvYmFsIFN0YXRlcyBhbmQgUHJvcGVydGllcworICAgICdhcmlhLWN1cnJlbnQn OiAwLCAvLyBzdGF0ZQorICAgICdhcmlhLWRldGFpbHMnOiAwLAorICAgICdhcmlhLWRpc2FibGVk JzogMCwgLy8gc3RhdGUKKyAgICAnYXJpYS1oaWRkZW4nOiAwLCAvLyBzdGF0ZQorICAgICdhcmlh LWludmFsaWQnOiAwLCAvLyBzdGF0ZQorICAgICdhcmlhLWtleXNob3J0Y3V0cyc6IDAsCisgICAg J2FyaWEtbGFiZWwnOiAwLAorICAgICdhcmlhLXJvbGVkZXNjcmlwdGlvbic6IDAsCisgICAgLy8g V2lkZ2V0IEF0dHJpYnV0ZXMKKyAgICAnYXJpYS1hdXRvY29tcGxldGUnOiAwLAorICAgICdhcmlh LWNoZWNrZWQnOiAwLAorICAgICdhcmlhLWV4cGFuZGVkJzogMCwKKyAgICAnYXJpYS1oYXNwb3B1 cCc6IDAsCisgICAgJ2FyaWEtbGV2ZWwnOiAwLAorICAgICdhcmlhLW1vZGFsJzogMCwKKyAgICAn YXJpYS1tdWx0aWxpbmUnOiAwLAorICAgICdhcmlhLW11bHRpc2VsZWN0YWJsZSc6IDAsCisgICAg J2FyaWEtb3JpZW50YXRpb24nOiAwLAorICAgICdhcmlhLXBsYWNlaG9sZGVyJzogMCwKKyAgICAn YXJpYS1wcmVzc2VkJzogMCwKKyAgICAnYXJpYS1yZWFkb25seSc6IDAsCisgICAgJ2FyaWEtcmVx dWlyZWQnOiAwLAorICAgICdhcmlhLXNlbGVjdGVkJzogMCwKKyAgICAnYXJpYS1zb3J0JzogMCwK KyAgICAnYXJpYS12YWx1ZW1heCc6IDAsCisgICAgJ2FyaWEtdmFsdWVtaW4nOiAwLAorICAgICdh cmlhLXZhbHVlbm93JzogMCwKKyAgICAnYXJpYS12YWx1ZXRleHQnOiAwLAorICAgIC8vIExpdmUg UmVnaW9uIEF0dHJpYnV0ZXMKKyAgICAnYXJpYS1hdG9taWMnOiAwLAorICAgICdhcmlhLWJ1c3kn OiAwLAorICAgICdhcmlhLWxpdmUnOiAwLAorICAgICdhcmlhLXJlbGV2YW50JzogMCwKKyAgICAv LyBEcmFnLWFuZC1Ecm9wIEF0dHJpYnV0ZXMKKyAgICAnYXJpYS1kcm9wZWZmZWN0JzogMCwKKyAg ICAnYXJpYS1ncmFiYmVkJzogMCwKKyAgICAvLyBSZWxhdGlvbnNoaXAgQXR0cmlidXRlcworICAg ICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnOiAwLAorICAgICdhcmlhLWNvbGNvdW50JzogMCwKKyAg ICAnYXJpYS1jb2xpbmRleCc6IDAsCisgICAgJ2FyaWEtY29sc3Bhbic6IDAsCisgICAgJ2FyaWEt Y29udHJvbHMnOiAwLAorICAgICdhcmlhLWRlc2NyaWJlZGJ5JzogMCwKKyAgICAnYXJpYS1lcnJv cm1lc3NhZ2UnOiAwLAorICAgICdhcmlhLWZsb3d0byc6IDAsCisgICAgJ2FyaWEtbGFiZWxsZWRi eSc6IDAsCisgICAgJ2FyaWEtb3ducyc6IDAsCisgICAgJ2FyaWEtcG9zaW5zZXQnOiAwLAorICAg ICdhcmlhLXJvd2NvdW50JzogMCwKKyAgICAnYXJpYS1yb3dpbmRleCc6IDAsCisgICAgJ2FyaWEt cm93c3Bhbic6IDAsCisgICAgJ2FyaWEtc2V0c2l6ZSc6IDAKKyAgfSwKKyAgRE9NQXR0cmlidXRl TmFtZXM6IHt9LAorICBET01Qcm9wZXJ0eU5hbWVzOiB7fQorfTsKKworbW9kdWxlLmV4cG9ydHMg PSBBUklBRE9NUHJvcGVydHlDb25maWc7Cit9LHt9XSwyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVs ZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIElu Yy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBs aWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNF TlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFk ZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQ QVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmlj dCc7CisKK3ZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSBfZGVyZXFfKDMyKTsKKwordmFyIGZv Y3VzTm9kZSA9IF9kZXJlcV8oMTM0KTsKKwordmFyIEF1dG9Gb2N1c1V0aWxzID0geworICBmb2N1 c0RPTUNvbXBvbmVudDogZnVuY3Rpb24gKCkgeworICAgIGZvY3VzTm9kZShSZWFjdERPTUNvbXBv bmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0aGlzKSk7CisgIH0KK307CisKK21vZHVsZS5l eHBvcnRzID0gQXV0b0ZvY3VzVXRpbHM7Cit9LHsiMTM0IjoxMzQsIjMyIjozMn1dLDM6W2Z1bmN0 aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVz ZW50IEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMg c291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5k IGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNv dXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBi ZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisg Ki8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgRXZlbnRQcm9wYWdhdG9ycyA9IF9kZXJlcV8oMTkp OwordmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0gX2RlcmVxXygxMjYpOwordmFyIEZhbGxiYWNr Q29tcG9zaXRpb25TdGF0ZSA9IF9kZXJlcV8oMjApOwordmFyIFN5bnRoZXRpY0NvbXBvc2l0aW9u RXZlbnQgPSBfZGVyZXFfKDgyKTsKK3ZhciBTeW50aGV0aWNJbnB1dEV2ZW50ID0gX2RlcmVxXyg4 Nik7CisKK3ZhciBFTkRfS0VZQ09ERVMgPSBbOSwgMTMsIDI3LCAzMl07IC8vIFRhYiwgUmV0dXJu LCBFc2MsIFNwYWNlCit2YXIgU1RBUlRfS0VZQ09ERSA9IDIyOTsKKwordmFyIGNhblVzZUNvbXBv c2l0aW9uRXZlbnQgPSBFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gJiYgJ0NvbXBvc2l0 aW9uRXZlbnQnIGluIHdpbmRvdzsKKwordmFyIGRvY3VtZW50TW9kZSA9IG51bGw7CitpZiAoRXhl Y3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NICYmICdkb2N1bWVudE1vZGUnIGluIGRvY3VtZW50 KSB7CisgIGRvY3VtZW50TW9kZSA9IGRvY3VtZW50LmRvY3VtZW50TW9kZTsKK30KKworLy8gV2Vi a2l0IG9mZmVycyBhIHZlcnkgdXNlZnVsIGB0ZXh0SW5wdXRgIGV2ZW50IHRoYXQgY2FuIGJlIHVz ZWQgdG8KKy8vIGRpcmVjdGx5IHJlcHJlc2VudCBgYmVmb3JlSW5wdXRgLiBUaGUgSUUgYHRleHRp bnB1dGAgZXZlbnQgaXMgbm90IGFzCisvLyB1c2VmdWwsIHNvIHdlIGRvbid0IHVzZSBpdC4KK3Zh ciBjYW5Vc2VUZXh0SW5wdXRFdmVudCA9IEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSAm JiAnVGV4dEV2ZW50JyBpbiB3aW5kb3cgJiYgIWRvY3VtZW50TW9kZSAmJiAhaXNQcmVzdG8oKTsK KworLy8gSW4gSUU5Kywgd2UgaGF2ZSBhY2Nlc3MgdG8gY29tcG9zaXRpb24gZXZlbnRzLCBidXQg dGhlIGRhdGEgc3VwcGxpZWQKKy8vIGJ5IHRoZSBuYXRpdmUgY29tcG9zaXRpb25lbmQgZXZlbnQg bWF5IGJlIGluY29ycmVjdC4gSmFwYW5lc2UgaWRlb2dyYXBoaWMKKy8vIHNwYWNlcywgZm9yIGlu c3RhbmNlIChcdTMwMDApIGFyZSBub3QgcmVjb3JkZWQgY29ycmVjdGx5LgordmFyIHVzZUZhbGxi YWNrQ29tcG9zaXRpb25EYXRhID0gRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NICYmICgh Y2FuVXNlQ29tcG9zaXRpb25FdmVudCB8fCBkb2N1bWVudE1vZGUgJiYgZG9jdW1lbnRNb2RlID4g OCAmJiBkb2N1bWVudE1vZGUgPD0gMTEpOworCisvKioKKyAqIE9wZXJhIDw9IDEyIGluY2x1ZGVz IFRleHRFdmVudCBpbiB3aW5kb3csIGJ1dCBkb2VzIG5vdCBmaXJlCisgKiB0ZXh0IGlucHV0IGV2 ZW50cy4gUmVseSBvbiBrZXlwcmVzcyBpbnN0ZWFkLgorICovCitmdW5jdGlvbiBpc1ByZXN0bygp IHsKKyAgdmFyIG9wZXJhID0gd2luZG93Lm9wZXJhOworICByZXR1cm4gdHlwZW9mIG9wZXJhID09 PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb3BlcmEudmVyc2lvbiA9PT0gJ2Z1bmN0aW9uJyAmJiBwYXJz ZUludChvcGVyYS52ZXJzaW9uKCksIDEwKSA8PSAxMjsKK30KKwordmFyIFNQQUNFQkFSX0NPREUg PSAzMjsKK3ZhciBTUEFDRUJBUl9DSEFSID0gU3RyaW5nLmZyb21DaGFyQ29kZShTUEFDRUJBUl9D T0RFKTsKKworLy8gRXZlbnRzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIHByb3BlcnR5IG5hbWVz LgordmFyIGV2ZW50VHlwZXMgPSB7CisgIGJlZm9yZUlucHV0OiB7CisgICAgcGhhc2VkUmVnaXN0 cmF0aW9uTmFtZXM6IHsKKyAgICAgIGJ1YmJsZWQ6ICdvbkJlZm9yZUlucHV0JywKKyAgICAgIGNh cHR1cmVkOiAnb25CZWZvcmVJbnB1dENhcHR1cmUnCisgICAgfSwKKyAgICBkZXBlbmRlbmNpZXM6 IFsndG9wQ29tcG9zaXRpb25FbmQnLCAndG9wS2V5UHJlc3MnLCAndG9wVGV4dElucHV0JywgJ3Rv cFBhc3RlJ10KKyAgfSwKKyAgY29tcG9zaXRpb25FbmQ6IHsKKyAgICBwaGFzZWRSZWdpc3RyYXRp b25OYW1lczogeworICAgICAgYnViYmxlZDogJ29uQ29tcG9zaXRpb25FbmQnLAorICAgICAgY2Fw dHVyZWQ6ICdvbkNvbXBvc2l0aW9uRW5kQ2FwdHVyZScKKyAgICB9LAorICAgIGRlcGVuZGVuY2ll czogWyd0b3BCbHVyJywgJ3RvcENvbXBvc2l0aW9uRW5kJywgJ3RvcEtleURvd24nLCAndG9wS2V5 UHJlc3MnLCAndG9wS2V5VXAnLCAndG9wTW91c2VEb3duJ10KKyAgfSwKKyAgY29tcG9zaXRpb25T dGFydDogeworICAgIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOiB7CisgICAgICBidWJibGVkOiAn b25Db21wb3NpdGlvblN0YXJ0JywKKyAgICAgIGNhcHR1cmVkOiAnb25Db21wb3NpdGlvblN0YXJ0 Q2FwdHVyZScKKyAgICB9LAorICAgIGRlcGVuZGVuY2llczogWyd0b3BCbHVyJywgJ3RvcENvbXBv c2l0aW9uU3RhcnQnLCAndG9wS2V5RG93bicsICd0b3BLZXlQcmVzcycsICd0b3BLZXlVcCcsICd0 b3BNb3VzZURvd24nXQorICB9LAorICBjb21wb3NpdGlvblVwZGF0ZTogeworICAgIHBoYXNlZFJl Z2lzdHJhdGlvbk5hbWVzOiB7CisgICAgICBidWJibGVkOiAnb25Db21wb3NpdGlvblVwZGF0ZScs CisgICAgICBjYXB0dXJlZDogJ29uQ29tcG9zaXRpb25VcGRhdGVDYXB0dXJlJworICAgIH0sCisg ICAgZGVwZW5kZW5jaWVzOiBbJ3RvcEJsdXInLCAndG9wQ29tcG9zaXRpb25VcGRhdGUnLCAndG9w S2V5RG93bicsICd0b3BLZXlQcmVzcycsICd0b3BLZXlVcCcsICd0b3BNb3VzZURvd24nXQorICB9 Cit9OworCisvLyBUcmFjayB3aGV0aGVyIHdlJ3ZlIGV2ZXIgaGFuZGxlZCBhIGtleXByZXNzIG9u IHRoZSBzcGFjZSBrZXkuCit2YXIgaGFzU3BhY2VLZXlwcmVzcyA9IGZhbHNlOworCisvKioKKyAq IFJldHVybiB3aGV0aGVyIGEgbmF0aXZlIGtleXByZXNzIGV2ZW50IGlzIGFzc3VtZWQgdG8gYmUg YSBjb21tYW5kLgorICogVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIEZpcmVmb3ggZmlyZXMgYGtl eXByZXNzYCBldmVudHMgZm9yIGtleSBjb21tYW5kcworICogKGN1dCwgY29weSwgc2VsZWN0LWFs bCwgZXRjLikgZXZlbiB0aG91Z2ggbm8gY2hhcmFjdGVyIGlzIGluc2VydGVkLgorICovCitmdW5j dGlvbiBpc0tleXByZXNzQ29tbWFuZChuYXRpdmVFdmVudCkgeworICByZXR1cm4gKG5hdGl2ZUV2 ZW50LmN0cmxLZXkgfHwgbmF0aXZlRXZlbnQuYWx0S2V5IHx8IG5hdGl2ZUV2ZW50Lm1ldGFLZXkp ICYmCisgIC8vIGN0cmxLZXkgJiYgYWx0S2V5IGlzIGVxdWl2YWxlbnQgdG8gQWx0R3IsIGFuZCBp cyBub3QgYSBjb21tYW5kLgorICAhKG5hdGl2ZUV2ZW50LmN0cmxLZXkgJiYgbmF0aXZlRXZlbnQu YWx0S2V5KTsKK30KKworLyoqCisgKiBUcmFuc2xhdGUgbmF0aXZlIHRvcCBsZXZlbCBldmVudHMg aW50byBldmVudCB0eXBlcy4KKyAqCisgKiBAcGFyYW0ge3N0cmluZ30gdG9wTGV2ZWxUeXBlCisg KiBAcmV0dXJuIHtvYmplY3R9CisgKi8KK2Z1bmN0aW9uIGdldENvbXBvc2l0aW9uRXZlbnRUeXBl KHRvcExldmVsVHlwZSkgeworICBzd2l0Y2ggKHRvcExldmVsVHlwZSkgeworICAgIGNhc2UgJ3Rv cENvbXBvc2l0aW9uU3RhcnQnOgorICAgICAgcmV0dXJuIGV2ZW50VHlwZXMuY29tcG9zaXRpb25T dGFydDsKKyAgICBjYXNlICd0b3BDb21wb3NpdGlvbkVuZCc6CisgICAgICByZXR1cm4gZXZlbnRU eXBlcy5jb21wb3NpdGlvbkVuZDsKKyAgICBjYXNlICd0b3BDb21wb3NpdGlvblVwZGF0ZSc6Cisg ICAgICByZXR1cm4gZXZlbnRUeXBlcy5jb21wb3NpdGlvblVwZGF0ZTsKKyAgfQorfQorCisvKioK KyAqIERvZXMgb3VyIGZhbGxiYWNrIGJlc3QtZ3Vlc3MgbW9kZWwgdGhpbmsgdGhpcyBldmVudCBz aWduaWZpZXMgdGhhdAorICogY29tcG9zaXRpb24gaGFzIGJlZ3VuPworICoKKyAqIEBwYXJhbSB7 c3RyaW5nfSB0b3BMZXZlbFR5cGUKKyAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudAorICog QHJldHVybiB7Ym9vbGVhbn0KKyAqLworZnVuY3Rpb24gaXNGYWxsYmFja0NvbXBvc2l0aW9uU3Rh cnQodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkgeworICByZXR1cm4gdG9wTGV2ZWxUeXBlID09 PSAndG9wS2V5RG93bicgJiYgbmF0aXZlRXZlbnQua2V5Q29kZSA9PT0gU1RBUlRfS0VZQ09ERTsK K30KKworLyoqCisgKiBEb2VzIG91ciBmYWxsYmFjayBtb2RlIHRoaW5rIHRoYXQgdGhpcyBldmVu dCBpcyB0aGUgZW5kIG9mIGNvbXBvc2l0aW9uPworICoKKyAqIEBwYXJhbSB7c3RyaW5nfSB0b3BM ZXZlbFR5cGUKKyAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudAorICogQHJldHVybiB7Ym9v bGVhbn0KKyAqLworZnVuY3Rpb24gaXNGYWxsYmFja0NvbXBvc2l0aW9uRW5kKHRvcExldmVsVHlw ZSwgbmF0aXZlRXZlbnQpIHsKKyAgc3dpdGNoICh0b3BMZXZlbFR5cGUpIHsKKyAgICBjYXNlICd0 b3BLZXlVcCc6CisgICAgICAvLyBDb21tYW5kIGtleXMgaW5zZXJ0IG9yIGNsZWFyIElNRSBpbnB1 dC4KKyAgICAgIHJldHVybiBFTkRfS0VZQ09ERVMuaW5kZXhPZihuYXRpdmVFdmVudC5rZXlDb2Rl KSAhPT0gLTE7CisgICAgY2FzZSAndG9wS2V5RG93bic6CisgICAgICAvLyBFeHBlY3QgSU1FIGtl eUNvZGUgb24gZWFjaCBrZXlkb3duLiBJZiB3ZSBnZXQgYW55IG90aGVyCisgICAgICAvLyBjb2Rl IHdlIG11c3QgaGF2ZSBleGl0ZWQgZWFybGllci4KKyAgICAgIHJldHVybiBuYXRpdmVFdmVudC5r ZXlDb2RlICE9PSBTVEFSVF9LRVlDT0RFOworICAgIGNhc2UgJ3RvcEtleVByZXNzJzoKKyAgICBj YXNlICd0b3BNb3VzZURvd24nOgorICAgIGNhc2UgJ3RvcEJsdXInOgorICAgICAgLy8gRXZlbnRz IGFyZSBub3QgcG9zc2libGUgd2l0aG91dCBjYW5jZWxsaW5nIElNRS4KKyAgICAgIHJldHVybiB0 cnVlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworLyoqCisg KiBHb29nbGUgSW5wdXQgVG9vbHMgcHJvdmlkZXMgY29tcG9zaXRpb24gZGF0YSB2aWEgYSBDdXN0 b21FdmVudCwKKyAqIHdpdGggdGhlIGBkYXRhYCBwcm9wZXJ0eSBwb3B1bGF0ZWQgaW4gdGhlIGBk ZXRhaWxgIG9iamVjdC4gSWYgdGhpcworICogaXMgYXZhaWxhYmxlIG9uIHRoZSBldmVudCBvYmpl Y3QsIHVzZSBpdC4gSWYgbm90LCB0aGlzIGlzIGEgcGxhaW4KKyAqIGNvbXBvc2l0aW9uIGV2ZW50 IGFuZCB3ZSBoYXZlIG5vdGhpbmcgc3BlY2lhbCB0byBleHRyYWN0LgorICoKKyAqIEBwYXJhbSB7 b2JqZWN0fSBuYXRpdmVFdmVudAorICogQHJldHVybiB7P3N0cmluZ30KKyAqLworZnVuY3Rpb24g Z2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCkgeworICB2YXIgZGV0YWlsID0gbmF0 aXZlRXZlbnQuZGV0YWlsOworICBpZiAodHlwZW9mIGRldGFpbCA9PT0gJ29iamVjdCcgJiYgJ2Rh dGEnIGluIGRldGFpbCkgeworICAgIHJldHVybiBkZXRhaWwuZGF0YTsKKyAgfQorICByZXR1cm4g bnVsbDsKK30KKworLy8gVHJhY2sgdGhlIGN1cnJlbnQgSU1FIGNvbXBvc2l0aW9uIGZhbGxiYWNr IG9iamVjdCwgaWYgYW55LgordmFyIGN1cnJlbnRDb21wb3NpdGlvbiA9IG51bGw7CisKKy8qKgor ICogQHJldHVybiB7P29iamVjdH0gQSBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50LgorICovCitm dW5jdGlvbiBleHRyYWN0Q29tcG9zaXRpb25FdmVudCh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3Qs IG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkgeworICB2YXIgZXZlbnRUeXBlOworICB2 YXIgZmFsbGJhY2tEYXRhOworCisgIGlmIChjYW5Vc2VDb21wb3NpdGlvbkV2ZW50KSB7CisgICAg ZXZlbnRUeXBlID0gZ2V0Q29tcG9zaXRpb25FdmVudFR5cGUodG9wTGV2ZWxUeXBlKTsKKyAgfSBl bHNlIGlmICghY3VycmVudENvbXBvc2l0aW9uKSB7CisgICAgaWYgKGlzRmFsbGJhY2tDb21wb3Np dGlvblN0YXJ0KHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpKSB7CisgICAgICBldmVudFR5cGUg PSBldmVudFR5cGVzLmNvbXBvc2l0aW9uU3RhcnQ7CisgICAgfQorICB9IGVsc2UgaWYgKGlzRmFs bGJhY2tDb21wb3NpdGlvbkVuZCh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KSkgeworICAgIGV2 ZW50VHlwZSA9IGV2ZW50VHlwZXMuY29tcG9zaXRpb25FbmQ7CisgIH0KKworICBpZiAoIWV2ZW50 VHlwZSkgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAgaWYgKHVzZUZhbGxiYWNrQ29tcG9z aXRpb25EYXRhKSB7CisgICAgLy8gVGhlIGN1cnJlbnQgY29tcG9zaXRpb24gaXMgc3RvcmVkIHN0 YXRpY2FsbHkgYW5kIG11c3Qgbm90IGJlCisgICAgLy8gb3ZlcndyaXR0ZW4gd2hpbGUgY29tcG9z aXRpb24gY29udGludWVzLgorICAgIGlmICghY3VycmVudENvbXBvc2l0aW9uICYmIGV2ZW50VHlw ZSA9PT0gZXZlbnRUeXBlcy5jb21wb3NpdGlvblN0YXJ0KSB7CisgICAgICBjdXJyZW50Q29tcG9z aXRpb24gPSBGYWxsYmFja0NvbXBvc2l0aW9uU3RhdGUuZ2V0UG9vbGVkKG5hdGl2ZUV2ZW50VGFy Z2V0KTsKKyAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gZXZlbnRUeXBlcy5jb21wb3NpdGlv bkVuZCkgeworICAgICAgaWYgKGN1cnJlbnRDb21wb3NpdGlvbikgeworICAgICAgICBmYWxsYmFj a0RhdGEgPSBjdXJyZW50Q29tcG9zaXRpb24uZ2V0RGF0YSgpOworICAgICAgfQorICAgIH0KKyAg fQorCisgIHZhciBldmVudCA9IFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQuZ2V0UG9vbGVkKGV2 ZW50VHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTsKKwor ICBpZiAoZmFsbGJhY2tEYXRhKSB7CisgICAgLy8gSW5qZWN0IGRhdGEgZ2VuZXJhdGVkIGZyb20g ZmFsbGJhY2sgcGF0aCBpbnRvIHRoZSBzeW50aGV0aWMgZXZlbnQuCisgICAgLy8gVGhpcyBtYXRj aGVzIHRoZSBwcm9wZXJ0eSBvZiBuYXRpdmUgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZS4KKyAg ICBldmVudC5kYXRhID0gZmFsbGJhY2tEYXRhOworICB9IGVsc2UgeworICAgIHZhciBjdXN0b21E YXRhID0gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCk7CisgICAgaWYgKGN1c3Rv bURhdGEgIT09IG51bGwpIHsKKyAgICAgIGV2ZW50LmRhdGEgPSBjdXN0b21EYXRhOworICAgIH0K KyAgfQorCisgIEV2ZW50UHJvcGFnYXRvcnMuYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyhl dmVudCk7CisgIHJldHVybiBldmVudDsKK30KKworLyoqCisgKiBAcGFyYW0ge3N0cmluZ30gdG9w TGV2ZWxUeXBlIFJlY29yZCBmcm9tIGBFdmVudENvbnN0YW50c2AuCisgKiBAcGFyYW0ge29iamVj dH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuCisgKiBAcmV0dXJuIHs/c3RyaW5n fSBUaGUgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBgYmVmb3JlSW5wdXRgIGV2ZW50Lgor ICovCitmdW5jdGlvbiBnZXROYXRpdmVCZWZvcmVJbnB1dENoYXJzKHRvcExldmVsVHlwZSwgbmF0 aXZlRXZlbnQpIHsKKyAgc3dpdGNoICh0b3BMZXZlbFR5cGUpIHsKKyAgICBjYXNlICd0b3BDb21w b3NpdGlvbkVuZCc6CisgICAgICByZXR1cm4gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVF dmVudCk7CisgICAgY2FzZSAndG9wS2V5UHJlc3MnOgorICAgICAgLyoqCisgICAgICAgKiBJZiBu YXRpdmUgYHRleHRJbnB1dGAgZXZlbnRzIGFyZSBhdmFpbGFibGUsIG91ciBnb2FsIGlzIHRvIG1h a2UKKyAgICAgICAqIHVzZSBvZiB0aGVtLiBIb3dldmVyLCB0aGVyZSBpcyBhIHNwZWNpYWwgY2Fz ZTogdGhlIHNwYWNlYmFyIGtleS4KKyAgICAgICAqIEluIFdlYmtpdCwgcHJldmVudGluZyBkZWZh dWx0IG9uIGEgc3BhY2ViYXIgYHRleHRJbnB1dGAgZXZlbnQKKyAgICAgICAqIGNhbmNlbHMgY2hh cmFjdGVyIGluc2VydGlvbiwgYnV0IGl0ICphbHNvKiBjYXVzZXMgdGhlIGJyb3dzZXIKKyAgICAg ICAqIHRvIGZhbGwgYmFjayB0byBpdHMgZGVmYXVsdCBzcGFjZWJhciBiZWhhdmlvciBvZiBzY3Jv bGxpbmcgdGhlCisgICAgICAgKiBwYWdlLgorICAgICAgICoKKyAgICAgICAqIFRyYWNraW5nIGF0 OgorICAgICAgICogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0 YWlsP2lkPTM1NTEwMworICAgICAgICoKKyAgICAgICAqIFRvIGF2b2lkIHRoaXMgaXNzdWUsIHVz ZSB0aGUga2V5cHJlc3MgZXZlbnQgYXMgaWYgbm8gYHRleHRJbnB1dGAKKyAgICAgICAqIGV2ZW50 IGlzIGF2YWlsYWJsZS4KKyAgICAgICAqLworICAgICAgdmFyIHdoaWNoID0gbmF0aXZlRXZlbnQu d2hpY2g7CisgICAgICBpZiAod2hpY2ggIT09IFNQQUNFQkFSX0NPREUpIHsKKyAgICAgICAgcmV0 dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIGhhc1NwYWNlS2V5cHJlc3MgPSB0cnVlOworICAg ICAgcmV0dXJuIFNQQUNFQkFSX0NIQVI7CisKKyAgICBjYXNlICd0b3BUZXh0SW5wdXQnOgorICAg ICAgLy8gUmVjb3JkIHRoZSBjaGFyYWN0ZXJzIHRvIGJlIGFkZGVkIHRvIHRoZSBET00uCisgICAg ICB2YXIgY2hhcnMgPSBuYXRpdmVFdmVudC5kYXRhOworCisgICAgICAvLyBJZiBpdCdzIGEgc3Bh Y2ViYXIgY2hhcmFjdGVyLCBhc3N1bWUgdGhhdCB3ZSBoYXZlIGFscmVhZHkgaGFuZGxlZAorICAg ICAgLy8gaXQgYXQgdGhlIGtleXByZXNzIGxldmVsIGFuZCBiYWlsIGltbWVkaWF0ZWx5LiBBbmRy b2lkIENocm9tZQorICAgICAgLy8gZG9lc24ndCBnaXZlIHVzIGtleWNvZGVzLCBzbyB3ZSBuZWVk IHRvIGJsYWNrbGlzdCBpdC4KKyAgICAgIGlmIChjaGFycyA9PT0gU1BBQ0VCQVJfQ0hBUiAmJiBo YXNTcGFjZUtleXByZXNzKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorCisgICAg ICByZXR1cm4gY2hhcnM7CisKKyAgICBkZWZhdWx0OgorICAgICAgLy8gRm9yIG90aGVyIG5hdGl2 ZSBldmVudCB0eXBlcywgZG8gbm90aGluZy4KKyAgICAgIHJldHVybiBudWxsOworICB9Cit9CisK Ky8qKgorICogRm9yIGJyb3dzZXJzIHRoYXQgZG8gbm90IHByb3ZpZGUgdGhlIGB0ZXh0SW5wdXRg IGV2ZW50LCBleHRyYWN0IHRoZQorICogYXBwcm9wcmlhdGUgc3RyaW5nIHRvIHVzZSBmb3IgU3lu dGhldGljSW5wdXRFdmVudC4KKyAqCisgKiBAcGFyYW0ge3N0cmluZ30gdG9wTGV2ZWxUeXBlIFJl Y29yZCBmcm9tIGBFdmVudENvbnN0YW50c2AuCisgKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZl bnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuCisgKiBAcmV0dXJuIHs/c3RyaW5nfSBUaGUgZmFsbGJh Y2sgc3RyaW5nIGZvciB0aGlzIGBiZWZvcmVJbnB1dGAgZXZlbnQuCisgKi8KK2Z1bmN0aW9uIGdl dEZhbGxiYWNrQmVmb3JlSW5wdXRDaGFycyh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KSB7Cisg IC8vIElmIHdlIGFyZSBjdXJyZW50bHkgY29tcG9zaW5nIChJTUUpIGFuZCB1c2luZyBhIGZhbGxi YWNrIHRvIGRvIHNvLAorICAvLyB0cnkgdG8gZXh0cmFjdCB0aGUgY29tcG9zZWQgY2hhcmFjdGVy cyBmcm9tIHRoZSBmYWxsYmFjayBvYmplY3QuCisgIC8vIElmIGNvbXBvc2l0aW9uIGV2ZW50IGlz IGF2YWlsYWJsZSwgd2UgZXh0cmFjdCBhIHN0cmluZyBvbmx5IGF0CisgIC8vIGNvbXBvc2l0aW9u ZXZlbnQsIG90aGVyd2lzZSBleHRyYWN0IGl0IGF0IGZhbGxiYWNrIGV2ZW50cy4KKyAgaWYgKGN1 cnJlbnRDb21wb3NpdGlvbikgeworICAgIGlmICh0b3BMZXZlbFR5cGUgPT09ICd0b3BDb21wb3Np dGlvbkVuZCcgfHwgIWNhblVzZUNvbXBvc2l0aW9uRXZlbnQgJiYgaXNGYWxsYmFja0NvbXBvc2l0 aW9uRW5kKHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpKSB7CisgICAgICB2YXIgY2hhcnMgPSBj dXJyZW50Q29tcG9zaXRpb24uZ2V0RGF0YSgpOworICAgICAgRmFsbGJhY2tDb21wb3NpdGlvblN0 YXRlLnJlbGVhc2UoY3VycmVudENvbXBvc2l0aW9uKTsKKyAgICAgIGN1cnJlbnRDb21wb3NpdGlv biA9IG51bGw7CisgICAgICByZXR1cm4gY2hhcnM7CisgICAgfQorICAgIHJldHVybiBudWxsOwor ICB9CisKKyAgc3dpdGNoICh0b3BMZXZlbFR5cGUpIHsKKyAgICBjYXNlICd0b3BQYXN0ZSc6Cisg ICAgICAvLyBJZiBhIHBhc3RlIGV2ZW50IG9jY3VycyBhZnRlciBhIGtleXByZXNzLCB0aHJvdyBv dXQgdGhlIGlucHV0CisgICAgICAvLyBjaGFycy4gUGFzdGUgZXZlbnRzIHNob3VsZCBub3QgbGVh ZCB0byBCZWZvcmVJbnB1dCBldmVudHMuCisgICAgICByZXR1cm4gbnVsbDsKKyAgICBjYXNlICd0 b3BLZXlQcmVzcyc6CisgICAgICAvKioKKyAgICAgICAqIEFzIG9mIHYyNywgRmlyZWZveCBtYXkg ZmlyZSBrZXlwcmVzcyBldmVudHMgZXZlbiB3aGVuIG5vIGNoYXJhY3RlcgorICAgICAgICogd2ls bCBiZSBpbnNlcnRlZC4gQSBmZXcgcG9zc2liaWxpdGllczoKKyAgICAgICAqCisgICAgICAgKiAt IGB3aGljaGAgaXMgYDBgLiBBcnJvdyBrZXlzLCBFc2Mga2V5LCBldGMuCisgICAgICAgKgorICAg ICAgICogLSBgd2hpY2hgIGlzIHRoZSBwcmVzc2VkIGtleSBjb2RlLCBidXQgbm8gY2hhciBpcyBh dmFpbGFibGUuCisgICAgICAgKiAgIEV4OiAnQWx0R3IgKyBkYCBpbiBQb2xpc2guIFRoZXJlIGlz IG5vIG1vZGlmaWVkIGNoYXJhY3RlciBmb3IKKyAgICAgICAqICAgdGhpcyBrZXkgY29tYmluYXRp b24gYW5kIG5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZCBpbnRvIHRoZQorICAgICAgICogICBkb2N1 bWVudCwgYnV0IEZGIGZpcmVzIHRoZSBrZXlwcmVzcyBmb3IgY2hhciBjb2RlIGAxMDBgIGFueXdh eS4KKyAgICAgICAqICAgTm8gYGlucHV0YCBldmVudCB3aWxsIG9jY3VyLgorICAgICAgICoKKyAg ICAgICAqIC0gYHdoaWNoYCBpcyB0aGUgcHJlc3NlZCBrZXkgY29kZSwgYnV0IGEgY29tbWFuZCBj b21iaW5hdGlvbiBpcworICAgICAgICogICBiZWluZyB1c2VkLiBFeDogYENtZCtDYC4gTm8gY2hh cmFjdGVyIGlzIGluc2VydGVkLCBhbmQgbm8KKyAgICAgICAqICAgYGlucHV0YCBldmVudCB3aWxs IG9jY3VyLgorICAgICAgICovCisgICAgICBpZiAobmF0aXZlRXZlbnQud2hpY2ggJiYgIWlzS2V5 cHJlc3NDb21tYW5kKG5hdGl2ZUV2ZW50KSkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21D aGFyQ29kZShuYXRpdmVFdmVudC53aGljaCk7CisgICAgICB9CisgICAgICByZXR1cm4gbnVsbDsK KyAgICBjYXNlICd0b3BDb21wb3NpdGlvbkVuZCc6CisgICAgICByZXR1cm4gdXNlRmFsbGJhY2tD b21wb3NpdGlvbkRhdGEgPyBudWxsIDogbmF0aXZlRXZlbnQuZGF0YTsKKyAgICBkZWZhdWx0Ogor ICAgICAgcmV0dXJuIG51bGw7CisgIH0KK30KKworLyoqCisgKiBFeHRyYWN0IGEgU3ludGhldGlj SW5wdXRFdmVudCBmb3IgYGJlZm9yZUlucHV0YCwgYmFzZWQgb24gZWl0aGVyIG5hdGl2ZQorICog YHRleHRJbnB1dGAgb3IgZmFsbGJhY2sgYmVoYXZpb3IuCisgKgorICogQHJldHVybiB7P29iamVj dH0gQSBTeW50aGV0aWNJbnB1dEV2ZW50LgorICovCitmdW5jdGlvbiBleHRyYWN0QmVmb3JlSW5w dXRFdmVudCh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVu dFRhcmdldCkgeworICB2YXIgY2hhcnM7CisKKyAgaWYgKGNhblVzZVRleHRJbnB1dEV2ZW50KSB7 CisgICAgY2hhcnMgPSBnZXROYXRpdmVCZWZvcmVJbnB1dENoYXJzKHRvcExldmVsVHlwZSwgbmF0 aXZlRXZlbnQpOworICB9IGVsc2UgeworICAgIGNoYXJzID0gZ2V0RmFsbGJhY2tCZWZvcmVJbnB1 dENoYXJzKHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpOworICB9CisKKyAgLy8gSWYgbm8gY2hh cmFjdGVycyBhcmUgYmVpbmcgaW5zZXJ0ZWQsIG5vIEJlZm9yZUlucHV0IGV2ZW50IHNob3VsZAor ICAvLyBiZSBmaXJlZC4KKyAgaWYgKCFjaGFycykgeworICAgIHJldHVybiBudWxsOworICB9CisK KyAgdmFyIGV2ZW50ID0gU3ludGhldGljSW5wdXRFdmVudC5nZXRQb29sZWQoZXZlbnRUeXBlcy5i ZWZvcmVJbnB1dCwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTsK KworICBldmVudC5kYXRhID0gY2hhcnM7CisgIEV2ZW50UHJvcGFnYXRvcnMuYWNjdW11bGF0ZVR3 b1BoYXNlRGlzcGF0Y2hlcyhldmVudCk7CisgIHJldHVybiBldmVudDsKK30KKworLyoqCisgKiBD cmVhdGUgYW4gYG9uQmVmb3JlSW5wdXRgIGV2ZW50IHRvIG1hdGNoCisgKiBodHRwOi8vd3d3Lncz Lm9yZy9UUi8yMDEzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDEzMTEwNS8jZXZlbnRzLWlucHV0 ZXZlbnRzLgorICoKKyAqIFRoaXMgZXZlbnQgcGx1Z2luIGlzIGJhc2VkIG9uIHRoZSBuYXRpdmUg YHRleHRJbnB1dGAgZXZlbnQKKyAqIGF2YWlsYWJsZSBpbiBDaHJvbWUsIFNhZmFyaSwgT3BlcmEs IGFuZCBJRS4gVGhpcyBldmVudCBmaXJlcyBhZnRlcgorICogYG9uS2V5UHJlc3NgIGFuZCBgb25D b21wb3NpdGlvbkVuZGAsIGJ1dCBiZWZvcmUgYG9uSW5wdXRgLgorICoKKyAqIGBiZWZvcmVJbnB1 dGAgaXMgc3BlYydkIGJ1dCBub3QgaW1wbGVtZW50ZWQgaW4gYW55IGJyb3dzZXJzLCBhbmQKKyAq IHRoZSBgaW5wdXRgIGV2ZW50IGRvZXMgbm90IHByb3ZpZGUgYW55IHVzZWZ1bCBpbmZvcm1hdGlv biBhYm91dCB3aGF0IGhhcworICogYWN0dWFsbHkgYmVlbiBhZGRlZCwgY29udHJhcnkgdG8gdGhl IHNwZWMuIFRodXMsIGB0ZXh0SW5wdXRgIGlzIHRoZSBiZXN0CisgKiBhdmFpbGFibGUgZXZlbnQg dG8gaWRlbnRpZnkgdGhlIGNoYXJhY3RlcnMgdGhhdCBoYXZlIGFjdHVhbGx5IGJlZW4gaW5zZXJ0 ZWQKKyAqIGludG8gdGhlIHRhcmdldCBub2RlLgorICoKKyAqIFRoaXMgcGx1Z2luIGlzIGFsc28g cmVzcG9uc2libGUgZm9yIGVtaXR0aW5nIGBjb21wb3NpdGlvbmAgZXZlbnRzLCB0aHVzCisgKiBh bGxvd2luZyB1cyB0byBzaGFyZSBjb21wb3NpdGlvbiBmYWxsYmFjayBjb2RlIGZvciBib3RoIGBi ZWZvcmVJbnB1dGAgYW5kCisgKiBgY29tcG9zaXRpb25gIGV2ZW50IHR5cGVzLgorICovCit2YXIg QmVmb3JlSW5wdXRFdmVudFBsdWdpbiA9IHsKKworICBldmVudFR5cGVzOiBldmVudFR5cGVzLAor CisgIGV4dHJhY3RFdmVudHM6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5h dGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkgeworICAgIHJldHVybiBbZXh0cmFjdENvbXBv c2l0aW9uRXZlbnQodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZl RXZlbnRUYXJnZXQpLCBleHRyYWN0QmVmb3JlSW5wdXRFdmVudCh0b3BMZXZlbFR5cGUsIHRhcmdl dEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCldOworICB9Cit9OworCittb2R1 bGUuZXhwb3J0cyA9IEJlZm9yZUlucHV0RXZlbnRQbHVnaW47Cit9LHsiMTI2IjoxMjYsIjE5Ijox OSwiMjAiOjIwLCI4MiI6ODIsIjg2Ijo4Nn1dLDQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4 cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgor ICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vu c2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0Ug ZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRp b25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVO VFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsK KworLyoqCisgKiBDU1MgcHJvcGVydGllcyB3aGljaCBhY2NlcHQgbnVtYmVycyBidXQgYXJlIG5v dCBpbiB1bml0cyBvZiAicHgiLgorICovCisKK3ZhciBpc1VuaXRsZXNzTnVtYmVyID0geworICBh bmltYXRpb25JdGVyYXRpb25Db3VudDogdHJ1ZSwKKyAgYm9yZGVySW1hZ2VPdXRzZXQ6IHRydWUs CisgIGJvcmRlckltYWdlU2xpY2U6IHRydWUsCisgIGJvcmRlckltYWdlV2lkdGg6IHRydWUsCisg IGJveEZsZXg6IHRydWUsCisgIGJveEZsZXhHcm91cDogdHJ1ZSwKKyAgYm94T3JkaW5hbEdyb3Vw OiB0cnVlLAorICBjb2x1bW5Db3VudDogdHJ1ZSwKKyAgZmxleDogdHJ1ZSwKKyAgZmxleEdyb3c6 IHRydWUsCisgIGZsZXhQb3NpdGl2ZTogdHJ1ZSwKKyAgZmxleFNocmluazogdHJ1ZSwKKyAgZmxl eE5lZ2F0aXZlOiB0cnVlLAorICBmbGV4T3JkZXI6IHRydWUsCisgIGdyaWRSb3c6IHRydWUsCisg IGdyaWRDb2x1bW46IHRydWUsCisgIGZvbnRXZWlnaHQ6IHRydWUsCisgIGxpbmVDbGFtcDogdHJ1 ZSwKKyAgbGluZUhlaWdodDogdHJ1ZSwKKyAgb3BhY2l0eTogdHJ1ZSwKKyAgb3JkZXI6IHRydWUs CisgIG9ycGhhbnM6IHRydWUsCisgIHRhYlNpemU6IHRydWUsCisgIHdpZG93czogdHJ1ZSwKKyAg ekluZGV4OiB0cnVlLAorICB6b29tOiB0cnVlLAorCisgIC8vIFNWRy1yZWxhdGVkIHByb3BlcnRp ZXMKKyAgZmlsbE9wYWNpdHk6IHRydWUsCisgIGZsb29kT3BhY2l0eTogdHJ1ZSwKKyAgc3RvcE9w YWNpdHk6IHRydWUsCisgIHN0cm9rZURhc2hhcnJheTogdHJ1ZSwKKyAgc3Ryb2tlRGFzaG9mZnNl dDogdHJ1ZSwKKyAgc3Ryb2tlTWl0ZXJsaW1pdDogdHJ1ZSwKKyAgc3Ryb2tlT3BhY2l0eTogdHJ1 ZSwKKyAgc3Ryb2tlV2lkdGg6IHRydWUKK307CisKKy8qKgorICogQHBhcmFtIHtzdHJpbmd9IHBy ZWZpeCB2ZW5kb3Itc3BlY2lmaWMgcHJlZml4LCBlZzogV2Via2l0CisgKiBAcGFyYW0ge3N0cmlu Z30ga2V5IHN0eWxlIG5hbWUsIGVnOiB0cmFuc2l0aW9uRHVyYXRpb24KKyAqIEByZXR1cm4ge3N0 cmluZ30gc3R5bGUgbmFtZSBwcmVmaXhlZCB3aXRoIGBwcmVmaXhgLCBwcm9wZXJseSBjYW1lbENh c2VkLCBlZzoKKyAqIFdlYmtpdFRyYW5zaXRpb25EdXJhdGlvbgorICovCitmdW5jdGlvbiBwcmVm aXhLZXkocHJlZml4LCBrZXkpIHsKKyAgcmV0dXJuIHByZWZpeCArIGtleS5jaGFyQXQoMCkudG9V cHBlckNhc2UoKSArIGtleS5zdWJzdHJpbmcoMSk7Cit9CisKKy8qKgorICogU3VwcG9ydCBzdHls ZSBuYW1lcyB0aGF0IG1heSBjb21lIHBhc3NlZCBpbiBwcmVmaXhlZCBieSBhZGRpbmcgcGVybXV0 YXRpb25zCisgKiBvZiB2ZW5kb3IgcHJlZml4ZXMuCisgKi8KK3ZhciBwcmVmaXhlcyA9IFsnV2Vi a2l0JywgJ21zJywgJ01veicsICdPJ107CisKKy8vIFVzaW5nIE9iamVjdC5rZXlzIGhlcmUsIG9y IGVsc2UgdGhlIHZhbmlsbGEgZm9yLWluIGxvb3AgbWFrZXMgSUU4IGdvIGludG8gYW4KKy8vIGlu ZmluaXRlIGxvb3AsIGJlY2F1c2UgaXQgaXRlcmF0ZXMgb3ZlciB0aGUgbmV3bHkgYWRkZWQgcHJv cHMgdG9vLgorT2JqZWN0LmtleXMoaXNVbml0bGVzc051bWJlcikuZm9yRWFjaChmdW5jdGlvbiAo cHJvcCkgeworICBwcmVmaXhlcy5mb3JFYWNoKGZ1bmN0aW9uIChwcmVmaXgpIHsKKyAgICBpc1Vu aXRsZXNzTnVtYmVyW3ByZWZpeEtleShwcmVmaXgsIHByb3ApXSA9IGlzVW5pdGxlc3NOdW1iZXJb cHJvcF07CisgIH0pOworfSk7CisKKy8qKgorICogTW9zdCBzdHlsZSBwcm9wZXJ0aWVzIGNhbiBi ZSB1bnNldCBieSBkb2luZyAuc3R5bGVbcHJvcF0gPSAnJyBidXQgSUU4CisgKiBkb2Vzbid0IGxp a2UgZG9pbmcgdGhhdCB3aXRoIHNob3J0aGFuZCBwcm9wZXJ0aWVzIHNvIGZvciB0aGUgcHJvcGVy dGllcyB0aGF0CisgKiBJRTggYnJlYWtzIG9uLCB3aGljaCBhcmUgbGlzdGVkIGhlcmUsIHdlIGlu c3RlYWQgdW5zZXQgZWFjaCBvZiB0aGUKKyAqIGluZGl2aWR1YWwgcHJvcGVydGllcy4gU2VlIGh0 dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEyMzg1LgorICogVGhlIDQtdmFsdWUgJ2Nsb2Nr JyBwcm9wZXJ0aWVzIGxpa2UgbWFyZ2luLCBwYWRkaW5nLCBib3JkZXItd2lkdGggc2VlbSB0bwor ICogYmVoYXZlIHdpdGhvdXQgYW55IHByb2JsZW1zLiBDdXJpb3VzbHksIGxpc3Qtc3R5bGUgd29y a3MgdG9vIHdpdGhvdXQgYW55CisgKiBzcGVjaWFsIHByb2RkaW5nLgorICovCit2YXIgc2hvcnRo YW5kUHJvcGVydHlFeHBhbnNpb25zID0geworICBiYWNrZ3JvdW5kOiB7CisgICAgYmFja2dyb3Vu ZEF0dGFjaG1lbnQ6IHRydWUsCisgICAgYmFja2dyb3VuZENvbG9yOiB0cnVlLAorICAgIGJhY2tn cm91bmRJbWFnZTogdHJ1ZSwKKyAgICBiYWNrZ3JvdW5kUG9zaXRpb25YOiB0cnVlLAorICAgIGJh Y2tncm91bmRQb3NpdGlvblk6IHRydWUsCisgICAgYmFja2dyb3VuZFJlcGVhdDogdHJ1ZQorICB9 LAorICBiYWNrZ3JvdW5kUG9zaXRpb246IHsKKyAgICBiYWNrZ3JvdW5kUG9zaXRpb25YOiB0cnVl LAorICAgIGJhY2tncm91bmRQb3NpdGlvblk6IHRydWUKKyAgfSwKKyAgYm9yZGVyOiB7CisgICAg Ym9yZGVyV2lkdGg6IHRydWUsCisgICAgYm9yZGVyU3R5bGU6IHRydWUsCisgICAgYm9yZGVyQ29s b3I6IHRydWUKKyAgfSwKKyAgYm9yZGVyQm90dG9tOiB7CisgICAgYm9yZGVyQm90dG9tV2lkdGg6 IHRydWUsCisgICAgYm9yZGVyQm90dG9tU3R5bGU6IHRydWUsCisgICAgYm9yZGVyQm90dG9tQ29s b3I6IHRydWUKKyAgfSwKKyAgYm9yZGVyTGVmdDogeworICAgIGJvcmRlckxlZnRXaWR0aDogdHJ1 ZSwKKyAgICBib3JkZXJMZWZ0U3R5bGU6IHRydWUsCisgICAgYm9yZGVyTGVmdENvbG9yOiB0cnVl CisgIH0sCisgIGJvcmRlclJpZ2h0OiB7CisgICAgYm9yZGVyUmlnaHRXaWR0aDogdHJ1ZSwKKyAg ICBib3JkZXJSaWdodFN0eWxlOiB0cnVlLAorICAgIGJvcmRlclJpZ2h0Q29sb3I6IHRydWUKKyAg fSwKKyAgYm9yZGVyVG9wOiB7CisgICAgYm9yZGVyVG9wV2lkdGg6IHRydWUsCisgICAgYm9yZGVy VG9wU3R5bGU6IHRydWUsCisgICAgYm9yZGVyVG9wQ29sb3I6IHRydWUKKyAgfSwKKyAgZm9udDog eworICAgIGZvbnRTdHlsZTogdHJ1ZSwKKyAgICBmb250VmFyaWFudDogdHJ1ZSwKKyAgICBmb250 V2VpZ2h0OiB0cnVlLAorICAgIGZvbnRTaXplOiB0cnVlLAorICAgIGxpbmVIZWlnaHQ6IHRydWUs CisgICAgZm9udEZhbWlseTogdHJ1ZQorICB9LAorICBvdXRsaW5lOiB7CisgICAgb3V0bGluZVdp ZHRoOiB0cnVlLAorICAgIG91dGxpbmVTdHlsZTogdHJ1ZSwKKyAgICBvdXRsaW5lQ29sb3I6IHRy dWUKKyAgfQorfTsKKwordmFyIENTU1Byb3BlcnR5ID0geworICBpc1VuaXRsZXNzTnVtYmVyOiBp c1VuaXRsZXNzTnVtYmVyLAorICBzaG9ydGhhbmRQcm9wZXJ0eUV4cGFuc2lvbnM6IHNob3J0aGFu ZFByb3BlcnR5RXhwYW5zaW9ucworfTsKKworbW9kdWxlLmV4cG9ydHMgPSBDU1NQcm9wZXJ0eTsK K30se31dLDU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5 cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZl ZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5 bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJl Y3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0 ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBk aXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIENTU1Byb3BlcnR5ID0g X2RlcmVxXyg0KTsKK3ZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IF9kZXJlcV8oMTI2KTsKK3Zh ciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IF9kZXJlcV8oNTkpOworCit2YXIgY2FtZWxpemVTdHls ZU5hbWUgPSBfZGVyZXFfKDEyOCk7Cit2YXIgZGFuZ2Vyb3VzU3R5bGVWYWx1ZSA9IF9kZXJlcV8o OTkpOwordmFyIGh5cGhlbmF0ZVN0eWxlTmFtZSA9IF9kZXJlcV8oMTM5KTsKK3ZhciBtZW1vaXpl U3RyaW5nT25seSA9IF9kZXJlcV8oMTQzKTsKK3ZhciB3YXJuaW5nID0gX2RlcmVxXygxNDcpOwor Cit2YXIgcHJvY2Vzc1N0eWxlTmFtZSA9IG1lbW9pemVTdHJpbmdPbmx5KGZ1bmN0aW9uIChzdHls ZU5hbWUpIHsKKyAgcmV0dXJuIGh5cGhlbmF0ZVN0eWxlTmFtZShzdHlsZU5hbWUpOworfSk7CisK K3ZhciBoYXNTaG9ydGhhbmRQcm9wZXJ0eUJ1ZyA9IGZhbHNlOwordmFyIHN0eWxlRmxvYXRBY2Nl c3NvciA9ICdjc3NGbG9hdCc7CitpZiAoRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NKSB7 CisgIHZhciB0ZW1wU3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5zdHlsZTsK KyAgdHJ5IHsKKyAgICAvLyBJRTggdGhyb3dzICJJbnZhbGlkIGFyZ3VtZW50LiIgaWYgcmVzZXR0 aW5nIHNob3J0aGFuZCBzdHlsZSBwcm9wZXJ0aWVzLgorICAgIHRlbXBTdHlsZS5mb250ID0gJyc7 CisgIH0gY2F0Y2ggKGUpIHsKKyAgICBoYXNTaG9ydGhhbmRQcm9wZXJ0eUJ1ZyA9IHRydWU7Cisg IH0KKyAgLy8gSUU4IG9ubHkgc3VwcG9ydHMgYWNjZXNzaW5nIGNzc0Zsb2F0IChzdGFuZGFyZCkg YXMgc3R5bGVGbG9hdAorICBpZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmNzc0Zs b2F0ID09PSB1bmRlZmluZWQpIHsKKyAgICBzdHlsZUZsb2F0QWNjZXNzb3IgPSAnc3R5bGVGbG9h dCc7CisgIH0KK30KKworaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAv LyAnbXNUcmFuc2Zvcm0nIGlzIGNvcnJlY3QsIGJ1dCB0aGUgb3RoZXIgcHJlZml4ZXMgc2hvdWxk IGJlIGNhcGl0YWxpemVkCisgIHZhciBiYWRWZW5kb3JlZFN0eWxlTmFtZVBhdHRlcm4gPSAvXig/ OndlYmtpdHxtb3p8bylbQS1aXS87CisKKyAgLy8gc3R5bGUgdmFsdWVzIHNob3VsZG4ndCBjb250 YWluIGEgc2VtaWNvbG9uCisgIHZhciBiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4g PSAvO1xzKiQvOworCisgIHZhciB3YXJuZWRTdHlsZU5hbWVzID0ge307CisgIHZhciB3YXJuZWRT dHlsZVZhbHVlcyA9IHt9OworICB2YXIgd2FybmVkRm9yTmFOVmFsdWUgPSBmYWxzZTsKKworICB2 YXIgd2Fybkh5cGhlbmF0ZWRTdHlsZU5hbWUgPSBmdW5jdGlvbiAobmFtZSwgb3duZXIpIHsKKyAg ICBpZiAod2FybmVkU3R5bGVOYW1lcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiB3YXJuZWRTdHls ZU5hbWVzW25hbWVdKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2FybmVkU3R5bGVO YW1lc1tuYW1lXSA9IHRydWU7CisgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8g d2FybmluZyhmYWxzZSwgJ1Vuc3VwcG9ydGVkIHN0eWxlIHByb3BlcnR5ICVzLiBEaWQgeW91IG1l YW4gJXM/JXMnLCBuYW1lLCBjYW1lbGl6ZVN0eWxlTmFtZShuYW1lKSwgY2hlY2tSZW5kZXJNZXNz YWdlKG93bmVyKSkgOiB2b2lkIDA7CisgIH07CisKKyAgdmFyIHdhcm5CYWRWZW5kb3JlZFN0eWxl TmFtZSA9IGZ1bmN0aW9uIChuYW1lLCBvd25lcikgeworICAgIGlmICh3YXJuZWRTdHlsZU5hbWVz Lmhhc093blByb3BlcnR5KG5hbWUpICYmIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0pIHsKKyAgICAg IHJldHVybjsKKyAgICB9CisKKyAgICB3YXJuZWRTdHlsZU5hbWVzW25hbWVdID0gdHJ1ZTsKKyAg ICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnVW5zdXBw b3J0ZWQgdmVuZG9yLXByZWZpeGVkIHN0eWxlIHByb3BlcnR5ICVzLiBEaWQgeW91IG1lYW4gJXM/ JXMnLCBuYW1lLCBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKSwg Y2hlY2tSZW5kZXJNZXNzYWdlKG93bmVyKSkgOiB2b2lkIDA7CisgIH07CisKKyAgdmFyIHdhcm5T dHlsZVZhbHVlV2l0aFNlbWljb2xvbiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgb3duZXIpIHsK KyAgICBpZiAod2FybmVkU3R5bGVWYWx1ZXMuaGFzT3duUHJvcGVydHkodmFsdWUpICYmIHdhcm5l ZFN0eWxlVmFsdWVzW3ZhbHVlXSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdhcm5l ZFN0eWxlVmFsdWVzW3ZhbHVlXSA9IHRydWU7CisgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1 Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1N0eWxlIHByb3BlcnR5IHZhbHVlcyBzaG91bGRuXCd0 IGNvbnRhaW4gYSBzZW1pY29sb24uJXMgJyArICdUcnkgIiVzOiAlcyIgaW5zdGVhZC4nLCBjaGVj a1JlbmRlck1lc3NhZ2Uob3duZXIpLCBuYW1lLCB2YWx1ZS5yZXBsYWNlKGJhZFN0eWxlVmFsdWVX aXRoU2VtaWNvbG9uUGF0dGVybiwgJycpKSA6IHZvaWQgMDsKKyAgfTsKKworICB2YXIgd2FyblN0 eWxlVmFsdWVJc05hTiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgb3duZXIpIHsKKyAgICBpZiAo d2FybmVkRm9yTmFOVmFsdWUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3YXJuZWRG b3JOYU5WYWx1ZSA9IHRydWU7CisgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8g d2FybmluZyhmYWxzZSwgJ2BOYU5gIGlzIGFuIGludmFsaWQgdmFsdWUgZm9yIHRoZSBgJXNgIGNz cyBzdHlsZSBwcm9wZXJ0eS4lcycsIG5hbWUsIGNoZWNrUmVuZGVyTWVzc2FnZShvd25lcikpIDog dm9pZCAwOworICB9OworCisgIHZhciBjaGVja1JlbmRlck1lc3NhZ2UgPSBmdW5jdGlvbiAob3du ZXIpIHsKKyAgICBpZiAob3duZXIpIHsKKyAgICAgIHZhciBuYW1lID0gb3duZXIuZ2V0TmFtZSgp OworICAgICAgaWYgKG5hbWUpIHsKKyAgICAgICAgcmV0dXJuICcgQ2hlY2sgdGhlIHJlbmRlciBt ZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJzsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICcn OworICB9OworCisgIC8qKgorICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZQorICAgKiBAcGFyYW0g eyp9IHZhbHVlCisgICAqIEBwYXJhbSB7UmVhY3RET01Db21wb25lbnR9IGNvbXBvbmVudAorICAg Ki8KKyAgdmFyIHdhcm5WYWxpZFN0eWxlID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBjb21wb25l bnQpIHsKKyAgICB2YXIgb3duZXI7CisgICAgaWYgKGNvbXBvbmVudCkgeworICAgICAgb3duZXIg PSBjb21wb25lbnQuX2N1cnJlbnRFbGVtZW50Ll9vd25lcjsKKyAgICB9CisgICAgaWYgKG5hbWUu aW5kZXhPZignLScpID4gLTEpIHsKKyAgICAgIHdhcm5IeXBoZW5hdGVkU3R5bGVOYW1lKG5hbWUs IG93bmVyKTsKKyAgICB9IGVsc2UgaWYgKGJhZFZlbmRvcmVkU3R5bGVOYW1lUGF0dGVybi50ZXN0 KG5hbWUpKSB7CisgICAgICB3YXJuQmFkVmVuZG9yZWRTdHlsZU5hbWUobmFtZSwgb3duZXIpOwor ICAgIH0gZWxzZSBpZiAoYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuLnRlc3QodmFs dWUpKSB7CisgICAgICB3YXJuU3R5bGVWYWx1ZVdpdGhTZW1pY29sb24obmFtZSwgdmFsdWUsIG93 bmVyKTsKKyAgICB9CisKKyAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc05h Tih2YWx1ZSkpIHsKKyAgICAgIHdhcm5TdHlsZVZhbHVlSXNOYU4obmFtZSwgdmFsdWUsIG93bmVy KTsKKyAgICB9CisgIH07Cit9CisKKy8qKgorICogT3BlcmF0aW9ucyBmb3IgZGVhbGluZyB3aXRo IENTUyBwcm9wZXJ0aWVzLgorICovCit2YXIgQ1NTUHJvcGVydHlPcGVyYXRpb25zID0geworCisg IC8qKgorICAgKiBTZXJpYWxpemVzIGEgbWFwcGluZyBvZiBzdHlsZSBwcm9wZXJ0aWVzIGZvciB1 c2UgYXMgaW5saW5lIHN0eWxlczoKKyAgICoKKyAgICogICA+IGNyZWF0ZU1hcmt1cEZvclN0eWxl cyh7d2lkdGg6ICcyMDBweCcsIGhlaWdodDogMH0pCisgICAqICAgIndpZHRoOjIwMHB4O2hlaWdo dDowOyIKKyAgICoKKyAgICogVW5kZWZpbmVkIHZhbHVlcyBhcmUgaWdub3JlZCBzbyB0aGF0IGRl Y2xhcmF0aXZlIHByb2dyYW1taW5nIGlzIGVhc2llci4KKyAgICogVGhlIHJlc3VsdCBzaG91bGQg YmUgSFRNTC1lc2NhcGVkIGJlZm9yZSBpbnNlcnRpb24gaW50byB0aGUgRE9NLgorICAgKgorICAg KiBAcGFyYW0ge29iamVjdH0gc3R5bGVzCisgICAqIEBwYXJhbSB7UmVhY3RET01Db21wb25lbnR9 IGNvbXBvbmVudAorICAgKiBAcmV0dXJuIHs/c3RyaW5nfQorICAgKi8KKyAgY3JlYXRlTWFya3Vw Rm9yU3R5bGVzOiBmdW5jdGlvbiAoc3R5bGVzLCBjb21wb25lbnQpIHsKKyAgICB2YXIgc2VyaWFs aXplZCA9ICcnOworICAgIGZvciAodmFyIHN0eWxlTmFtZSBpbiBzdHlsZXMpIHsKKyAgICAgIGlm ICghc3R5bGVzLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIHsKKyAgICAgICAgY29udGludWU7 CisgICAgICB9CisgICAgICB2YXIgc3R5bGVWYWx1ZSA9IHN0eWxlc1tzdHlsZU5hbWVdOworICAg ICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgICB3YXJuVmFs aWRTdHlsZShzdHlsZU5hbWUsIHN0eWxlVmFsdWUsIGNvbXBvbmVudCk7CisgICAgICB9CisgICAg ICBpZiAoc3R5bGVWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgIHNlcmlhbGl6ZWQgKz0gcHJvY2Vz c1N0eWxlTmFtZShzdHlsZU5hbWUpICsgJzonOworICAgICAgICBzZXJpYWxpemVkICs9IGRhbmdl cm91c1N0eWxlVmFsdWUoc3R5bGVOYW1lLCBzdHlsZVZhbHVlLCBjb21wb25lbnQpICsgJzsnOwor ICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2VyaWFsaXplZCB8fCBudWxsOworICB9LAorCisg IC8qKgorICAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgbXVsdGlwbGUgc3R5bGVzIG9uIGEgbm9kZS4g IElmIGEgdmFsdWUgaXMgc3BlY2lmaWVkIGFzCisgICAqICcnIChlbXB0eSBzdHJpbmcpLCB0aGUg Y29ycmVzcG9uZGluZyBzdHlsZSBwcm9wZXJ0eSB3aWxsIGJlIHVuc2V0LgorICAgKgorICAgKiBA cGFyYW0ge0RPTUVsZW1lbnR9IG5vZGUKKyAgICogQHBhcmFtIHtvYmplY3R9IHN0eWxlcworICAg KiBAcGFyYW0ge1JlYWN0RE9NQ29tcG9uZW50fSBjb21wb25lbnQKKyAgICovCisgIHNldFZhbHVl Rm9yU3R5bGVzOiBmdW5jdGlvbiAobm9kZSwgc3R5bGVzLCBjb21wb25lbnQpIHsKKyAgICBpZiAo ImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICBSZWFjdEluc3RydW1lbnRh dGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHsKKyAgICAgICAgaW5zdGFuY2VJRDogY29t cG9uZW50Ll9kZWJ1Z0lELAorICAgICAgICB0eXBlOiAndXBkYXRlIHN0eWxlcycsCisgICAgICAg IHBheWxvYWQ6IHN0eWxlcworICAgICAgfSk7CisgICAgfQorCisgICAgdmFyIHN0eWxlID0gbm9k ZS5zdHlsZTsKKyAgICBmb3IgKHZhciBzdHlsZU5hbWUgaW4gc3R5bGVzKSB7CisgICAgICBpZiAo IXN0eWxlcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7CisgICAgICAgIGNvbnRpbnVlOwor ICAgICAgfQorICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAg ICAgICB3YXJuVmFsaWRTdHlsZShzdHlsZU5hbWUsIHN0eWxlc1tzdHlsZU5hbWVdLCBjb21wb25l bnQpOworICAgICAgfQorICAgICAgdmFyIHN0eWxlVmFsdWUgPSBkYW5nZXJvdXNTdHlsZVZhbHVl KHN0eWxlTmFtZSwgc3R5bGVzW3N0eWxlTmFtZV0sIGNvbXBvbmVudCk7CisgICAgICBpZiAoc3R5 bGVOYW1lID09PSAnZmxvYXQnIHx8IHN0eWxlTmFtZSA9PT0gJ2Nzc0Zsb2F0JykgeworICAgICAg ICBzdHlsZU5hbWUgPSBzdHlsZUZsb2F0QWNjZXNzb3I7CisgICAgICB9CisgICAgICBpZiAoc3R5 bGVWYWx1ZSkgeworICAgICAgICBzdHlsZVtzdHlsZU5hbWVdID0gc3R5bGVWYWx1ZTsKKyAgICAg IH0gZWxzZSB7CisgICAgICAgIHZhciBleHBhbnNpb24gPSBoYXNTaG9ydGhhbmRQcm9wZXJ0eUJ1 ZyAmJiBDU1NQcm9wZXJ0eS5zaG9ydGhhbmRQcm9wZXJ0eUV4cGFuc2lvbnNbc3R5bGVOYW1lXTsK KyAgICAgICAgaWYgKGV4cGFuc2lvbikgeworICAgICAgICAgIC8vIFNob3J0aGFuZCBwcm9wZXJ0 eSB0aGF0IElFOCB3b24ndCBsaWtlIHVuc2V0dGluZywgc28gdW5zZXQgZWFjaAorICAgICAgICAg IC8vIGNvbXBvbmVudCB0byBwbGFjYXRlIGl0CisgICAgICAgICAgZm9yICh2YXIgaW5kaXZpZHVh bFN0eWxlTmFtZSBpbiBleHBhbnNpb24pIHsKKyAgICAgICAgICAgIHN0eWxlW2luZGl2aWR1YWxT dHlsZU5hbWVdID0gJyc7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAg IHN0eWxlW3N0eWxlTmFtZV0gPSAnJzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQor Cit9OworCittb2R1bGUuZXhwb3J0cyA9IENTU1Byb3BlcnR5T3BlcmF0aW9uczsKK30seyIxMjYi OjEyNiwiMTI4IjoxMjgsIjEzOSI6MTM5LCIxNDMiOjE0MywiMTQ3IjoxNDcsIjQiOjQsIjU5Ijo1 OSwiOTkiOjk5fV0sNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAq IENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJl c2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJT RC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290 IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBv ZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBz YW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJv ZEludmFyaWFudCA9IF9kZXJlcV8oMTE2KTsKKworZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGlu c3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVj dG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVu Y3Rpb24iKTsgfSB9CisKK3ZhciBQb29sZWRDbGFzcyA9IF9kZXJlcV8oMjQpOworCit2YXIgaW52 YXJpYW50ID0gX2RlcmVxXygxNDApOworCisvKioKKyAqIEEgc3BlY2lhbGl6ZWQgcHNldWRvLWV2 ZW50IG1vZHVsZSB0byBoZWxwIGtlZXAgdHJhY2sgb2YgY29tcG9uZW50cyB3YWl0aW5nIHRvCisg KiBiZSBub3RpZmllZCB3aGVuIHRoZWlyIERPTSByZXByZXNlbnRhdGlvbnMgYXJlIGF2YWlsYWJs ZSBmb3IgdXNlLgorICoKKyAqIFRoaXMgaW1wbGVtZW50cyBgUG9vbGVkQ2xhc3NgLCBzbyB5b3Ug c2hvdWxkIG5ldmVyIG5lZWQgdG8gaW5zdGFudGlhdGUgdGhpcy4KKyAqIEluc3RlYWQsIHVzZSBg Q2FsbGJhY2tRdWV1ZS5nZXRQb29sZWQoKWAuCisgKgorICogQGNsYXNzIFJlYWN0TW91bnRSZWFk eQorICogQGltcGxlbWVudHMgUG9vbGVkQ2xhc3MKKyAqIEBpbnRlcm5hbAorICovCisKK3ZhciBD YWxsYmFja1F1ZXVlID0gZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBDYWxsYmFja1F1ZXVlKGFy ZykgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDYWxsYmFja1F1ZXVlKTsKKworICAgIHRo aXMuX2NhbGxiYWNrcyA9IG51bGw7CisgICAgdGhpcy5fY29udGV4dHMgPSBudWxsOworICAgIHRo aXMuX2FyZyA9IGFyZzsKKyAgfQorCisgIC8qKgorICAgKiBFbnF1ZXVlcyBhIGNhbGxiYWNrIHRv IGJlIGludm9rZWQgd2hlbiBgbm90aWZ5QWxsYCBpcyBpbnZva2VkLgorICAgKgorICAgKiBAcGFy YW0ge2Z1bmN0aW9ufSBjYWxsYmFjayBJbnZva2VkIHdoZW4gYG5vdGlmeUFsbGAgaXMgaW52b2tl ZC4KKyAgICogQHBhcmFtIHs/b2JqZWN0fSBjb250ZXh0IENvbnRleHQgdG8gY2FsbCBgY2FsbGJh Y2tgIHdpdGguCisgICAqIEBpbnRlcm5hbAorICAgKi8KKworCisgIENhbGxiYWNrUXVldWUucHJv dG90eXBlLmVucXVldWUgPSBmdW5jdGlvbiBlbnF1ZXVlKGNhbGxiYWNrLCBjb250ZXh0KSB7Cisg ICAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IFtdOworICAgIHRoaXMuX2Nh bGxiYWNrcy5wdXNoKGNhbGxiYWNrKTsKKyAgICB0aGlzLl9jb250ZXh0cyA9IHRoaXMuX2NvbnRl eHRzIHx8IFtdOworICAgIHRoaXMuX2NvbnRleHRzLnB1c2goY29udGV4dCk7CisgIH07CisKKyAg LyoqCisgICAqIEludm9rZXMgYWxsIGVucXVldWVkIGNhbGxiYWNrcyBhbmQgY2xlYXJzIHRoZSBx dWV1ZS4gVGhpcyBpcyBpbnZva2VkIGFmdGVyCisgICAqIHRoZSBET00gcmVwcmVzZW50YXRpb24g b2YgYSBjb21wb25lbnQgaGFzIGJlZW4gY3JlYXRlZCBvciB1cGRhdGVkLgorICAgKgorICAgKiBA aW50ZXJuYWwKKyAgICovCisKKworICBDYWxsYmFja1F1ZXVlLnByb3RvdHlwZS5ub3RpZnlBbGwg PSBmdW5jdGlvbiBub3RpZnlBbGwoKSB7CisgICAgdmFyIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxi YWNrczsKKyAgICB2YXIgY29udGV4dHMgPSB0aGlzLl9jb250ZXh0czsKKyAgICB2YXIgYXJnID0g dGhpcy5fYXJnOworICAgIGlmIChjYWxsYmFja3MgJiYgY29udGV4dHMpIHsKKyAgICAgICEoY2Fs bGJhY2tzLmxlbmd0aCA9PT0gY29udGV4dHMubGVuZ3RoKSA/ICJkZXZlbG9wbWVudCIgIT09ICdw cm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ01pc21hdGNoZWQgbGlzdCBvZiBjb250ZXh0 cyBpbiBjYWxsYmFjayBxdWV1ZScpIDogX3Byb2RJbnZhcmlhbnQoJzI0JykgOiB2b2lkIDA7Cisg ICAgICB0aGlzLl9jYWxsYmFja3MgPSBudWxsOworICAgICAgdGhpcy5fY29udGV4dHMgPSBudWxs OworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHsKKyAg ICAgICAgY2FsbGJhY2tzW2ldLmNhbGwoY29udGV4dHNbaV0sIGFyZyk7CisgICAgICB9CisgICAg ICBjYWxsYmFja3MubGVuZ3RoID0gMDsKKyAgICAgIGNvbnRleHRzLmxlbmd0aCA9IDA7CisgICAg fQorICB9OworCisgIENhbGxiYWNrUXVldWUucHJvdG90eXBlLmNoZWNrcG9pbnQgPSBmdW5jdGlv biBjaGVja3BvaW50KCkgeworICAgIHJldHVybiB0aGlzLl9jYWxsYmFja3MgPyB0aGlzLl9jYWxs YmFja3MubGVuZ3RoIDogMDsKKyAgfTsKKworICBDYWxsYmFja1F1ZXVlLnByb3RvdHlwZS5yb2xs YmFjayA9IGZ1bmN0aW9uIHJvbGxiYWNrKGxlbikgeworICAgIGlmICh0aGlzLl9jYWxsYmFja3Mg JiYgdGhpcy5fY29udGV4dHMpIHsKKyAgICAgIHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggPSBsZW47 CisgICAgICB0aGlzLl9jb250ZXh0cy5sZW5ndGggPSBsZW47CisgICAgfQorICB9OworCisgIC8q KgorICAgKiBSZXNldHMgdGhlIGludGVybmFsIHF1ZXVlLgorICAgKgorICAgKiBAaW50ZXJuYWwK KyAgICovCisKKworICBDYWxsYmFja1F1ZXVlLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uIHJl c2V0KCkgeworICAgIHRoaXMuX2NhbGxiYWNrcyA9IG51bGw7CisgICAgdGhpcy5fY29udGV4dHMg PSBudWxsOworICB9OworCisgIC8qKgorICAgKiBgUG9vbGVkQ2xhc3NgIGxvb2tzIGZvciB0aGlz LgorICAgKi8KKworCisgIENhbGxiYWNrUXVldWUucHJvdG90eXBlLmRlc3RydWN0b3IgPSBmdW5j dGlvbiBkZXN0cnVjdG9yKCkgeworICAgIHRoaXMucmVzZXQoKTsKKyAgfTsKKworICByZXR1cm4g Q2FsbGJhY2tRdWV1ZTsKK30oKTsKKworbW9kdWxlLmV4cG9ydHMgPSBQb29sZWRDbGFzcy5hZGRQ b29saW5nVG8oQ2FsbGJhY2tRdWV1ZSk7Cit9LHsiMTE2IjoxMTYsIjE0MCI6MTQwLCIyNCI6MjR9 XSw3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0 IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg KgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxp Y2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5 IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCBy aWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0 b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBFdmVudFBsdWdpbkh1YiA9IF9k ZXJlcV8oMTYpOwordmFyIEV2ZW50UHJvcGFnYXRvcnMgPSBfZGVyZXFfKDE5KTsKK3ZhciBFeGVj dXRpb25FbnZpcm9ubWVudCA9IF9kZXJlcV8oMTI2KTsKK3ZhciBSZWFjdERPTUNvbXBvbmVudFRy ZWUgPSBfZGVyZXFfKDMyKTsKK3ZhciBSZWFjdFVwZGF0ZXMgPSBfZGVyZXFfKDc1KTsKK3ZhciBT eW50aGV0aWNFdmVudCA9IF9kZXJlcV8oODQpOworCit2YXIgZ2V0RXZlbnRUYXJnZXQgPSBfZGVy ZXFfKDEwNik7Cit2YXIgaXNFdmVudFN1cHBvcnRlZCA9IF9kZXJlcV8oMTEzKTsKK3ZhciBpc1Rl eHRJbnB1dEVsZW1lbnQgPSBfZGVyZXFfKDExNCk7CisKK3ZhciBldmVudFR5cGVzID0geworICBj aGFuZ2U6IHsKKyAgICBwaGFzZWRSZWdpc3RyYXRpb25OYW1lczogeworICAgICAgYnViYmxlZDog J29uQ2hhbmdlJywKKyAgICAgIGNhcHR1cmVkOiAnb25DaGFuZ2VDYXB0dXJlJworICAgIH0sCisg ICAgZGVwZW5kZW5jaWVzOiBbJ3RvcEJsdXInLCAndG9wQ2hhbmdlJywgJ3RvcENsaWNrJywgJ3Rv cEZvY3VzJywgJ3RvcElucHV0JywgJ3RvcEtleURvd24nLCAndG9wS2V5VXAnLCAndG9wU2VsZWN0 aW9uQ2hhbmdlJ10KKyAgfQorfTsKKworLyoqCisgKiBGb3IgSUUgc2hpbXMKKyAqLwordmFyIGFj dGl2ZUVsZW1lbnQgPSBudWxsOwordmFyIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDsKK3ZhciBh Y3RpdmVFbGVtZW50VmFsdWUgPSBudWxsOwordmFyIGFjdGl2ZUVsZW1lbnRWYWx1ZVByb3AgPSBu dWxsOworCisvKioKKyAqIFNFQ1RJT046IGhhbmRsZSBgY2hhbmdlYCBldmVudAorICovCitmdW5j dGlvbiBzaG91bGRVc2VDaGFuZ2VFdmVudChlbGVtKSB7CisgIHZhciBub2RlTmFtZSA9IGVsZW0u bm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOworICByZXR1cm4gbm9kZU5h bWUgPT09ICdzZWxlY3QnIHx8IG5vZGVOYW1lID09PSAnaW5wdXQnICYmIGVsZW0udHlwZSA9PT0g J2ZpbGUnOworfQorCit2YXIgZG9lc0NoYW5nZUV2ZW50QnViYmxlID0gZmFsc2U7CitpZiAoRXhl Y3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NKSB7CisgIC8vIFNlZSBgaGFuZGxlQ2hhbmdlYCBj b21tZW50IGJlbG93CisgIGRvZXNDaGFuZ2VFdmVudEJ1YmJsZSA9IGlzRXZlbnRTdXBwb3J0ZWQo J2NoYW5nZScpICYmICghZG9jdW1lbnQuZG9jdW1lbnRNb2RlIHx8IGRvY3VtZW50LmRvY3VtZW50 TW9kZSA+IDgpOworfQorCitmdW5jdGlvbiBtYW51YWxEaXNwYXRjaENoYW5nZUV2ZW50KG5hdGl2 ZUV2ZW50KSB7CisgIHZhciBldmVudCA9IFN5bnRoZXRpY0V2ZW50LmdldFBvb2xlZChldmVudFR5 cGVzLmNoYW5nZSwgYWN0aXZlRWxlbWVudEluc3QsIG5hdGl2ZUV2ZW50LCBnZXRFdmVudFRhcmdl dChuYXRpdmVFdmVudCkpOworICBFdmVudFByb3BhZ2F0b3JzLmFjY3VtdWxhdGVUd29QaGFzZURp c3BhdGNoZXMoZXZlbnQpOworCisgIC8vIElmIGNoYW5nZSBhbmQgcHJvcGVydHljaGFuZ2UgYnVi YmxlZCwgd2UnZCBqdXN0IGJpbmQgdG8gaXQgbGlrZSBhbGwgdGhlCisgIC8vIG90aGVyIGV2ZW50 cyBhbmQgaGF2ZSBpdCBnbyB0aHJvdWdoIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci4gU2luY2Ug aXQKKyAgLy8gZG9lc24ndCwgd2UgbWFudWFsbHkgbGlzdGVuIGZvciB0aGUgZXZlbnRzIGFuZCBz byB3ZSBoYXZlIHRvIGVucXVldWUgYW5kCisgIC8vIHByb2Nlc3MgdGhlIGFic3RyYWN0IGV2ZW50 IG1hbnVhbGx5LgorICAvLworICAvLyBCYXRjaGluZyBpcyBuZWNlc3NhcnkgaGVyZSBpbiBvcmRl ciB0byBlbnN1cmUgdGhhdCBhbGwgZXZlbnQgaGFuZGxlcnMgcnVuCisgIC8vIGJlZm9yZSB0aGUg bmV4dCByZXJlbmRlciAoaW5jbHVkaW5nIGV2ZW50IGhhbmRsZXJzIGF0dGFjaGVkIHRvIGFuY2Vz dG9yCisgIC8vIGVsZW1lbnRzIGluc3RlYWQgb2YgZGlyZWN0bHkgb24gdGhlIGlucHV0KS4gV2l0 aG91dCB0aGlzLCBjb250cm9sbGVkCisgIC8vIGNvbXBvbmVudHMgZG9uJ3Qgd29yayBwcm9wZXJs eSBpbiBjb25qdW5jdGlvbiB3aXRoIGV2ZW50IGJ1YmJsaW5nIGJlY2F1c2UKKyAgLy8gdGhlIGNv bXBvbmVudCBpcyByZXJlbmRlcmVkIGFuZCB0aGUgdmFsdWUgcmV2ZXJ0ZWQgYmVmb3JlIGFsbCB0 aGUgZXZlbnQKKyAgLy8gaGFuZGxlcnMgY2FuIHJ1bi4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9m YWNlYm9vay9yZWFjdC9pc3N1ZXMvNzA4LgorICBSZWFjdFVwZGF0ZXMuYmF0Y2hlZFVwZGF0ZXMo cnVuRXZlbnRJbkJhdGNoLCBldmVudCk7Cit9CisKK2Z1bmN0aW9uIHJ1bkV2ZW50SW5CYXRjaChl dmVudCkgeworICBFdmVudFBsdWdpbkh1Yi5lbnF1ZXVlRXZlbnRzKGV2ZW50KTsKKyAgRXZlbnRQ bHVnaW5IdWIucHJvY2Vzc0V2ZW50UXVldWUoZmFsc2UpOworfQorCitmdW5jdGlvbiBzdGFydFdh dGNoaW5nRm9yQ2hhbmdlRXZlbnRJRTgodGFyZ2V0LCB0YXJnZXRJbnN0KSB7CisgIGFjdGl2ZUVs ZW1lbnQgPSB0YXJnZXQ7CisgIGFjdGl2ZUVsZW1lbnRJbnN0ID0gdGFyZ2V0SW5zdDsKKyAgYWN0 aXZlRWxlbWVudC5hdHRhY2hFdmVudCgnb25jaGFuZ2UnLCBtYW51YWxEaXNwYXRjaENoYW5nZUV2 ZW50KTsKK30KKworZnVuY3Rpb24gc3RvcFdhdGNoaW5nRm9yQ2hhbmdlRXZlbnRJRTgoKSB7Cisg IGlmICghYWN0aXZlRWxlbWVudCkgeworICAgIHJldHVybjsKKyAgfQorICBhY3RpdmVFbGVtZW50 LmRldGFjaEV2ZW50KCdvbmNoYW5nZScsIG1hbnVhbERpc3BhdGNoQ2hhbmdlRXZlbnQpOworICBh Y3RpdmVFbGVtZW50ID0gbnVsbDsKKyAgYWN0aXZlRWxlbWVudEluc3QgPSBudWxsOworfQorCitm dW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9yQ2hhbmdlRXZlbnQodG9wTGV2ZWxUeXBlLCB0YXJnZXRJ bnN0KSB7CisgIGlmICh0b3BMZXZlbFR5cGUgPT09ICd0b3BDaGFuZ2UnKSB7CisgICAgcmV0dXJu IHRhcmdldEluc3Q7CisgIH0KK30KK2Z1bmN0aW9uIGhhbmRsZUV2ZW50c0ZvckNoYW5nZUV2ZW50 SUU4KHRvcExldmVsVHlwZSwgdGFyZ2V0LCB0YXJnZXRJbnN0KSB7CisgIGlmICh0b3BMZXZlbFR5 cGUgPT09ICd0b3BGb2N1cycpIHsKKyAgICAvLyBzdG9wV2F0Y2hpbmcoKSBzaG91bGQgYmUgYSBu b29wIGhlcmUgYnV0IHdlIGNhbGwgaXQganVzdCBpbiBjYXNlIHdlCisgICAgLy8gbWlzc2VkIGEg Ymx1ciBldmVudCBzb21laG93LgorICAgIHN0b3BXYXRjaGluZ0ZvckNoYW5nZUV2ZW50SUU4KCk7 CisgICAgc3RhcnRXYXRjaGluZ0ZvckNoYW5nZUV2ZW50SUU4KHRhcmdldCwgdGFyZ2V0SW5zdCk7 CisgIH0gZWxzZSBpZiAodG9wTGV2ZWxUeXBlID09PSAndG9wQmx1cicpIHsKKyAgICBzdG9wV2F0 Y2hpbmdGb3JDaGFuZ2VFdmVudElFOCgpOworICB9Cit9CisKKy8qKgorICogU0VDVElPTjogaGFu ZGxlIGBpbnB1dGAgZXZlbnQKKyAqLwordmFyIGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9IGZhbHNl OworaWYgKEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSkgeworICAvLyBJRTkgY2xhaW1z IHRvIHN1cHBvcnQgdGhlIGlucHV0IGV2ZW50IGJ1dCBmYWlscyB0byB0cmlnZ2VyIGl0IHdoZW4K KyAgLy8gZGVsZXRpbmcgdGV4dCwgc28gd2UgaWdub3JlIGl0cyBpbnB1dCBldmVudHMuCisgIC8v IElFMTArIGZpcmUgaW5wdXQgZXZlbnRzIHRvIG9mdGVuLCBzdWNoIHdoZW4gYSBwbGFjZWhvbGRl cgorICAvLyBjaGFuZ2VzIG9yIHdoZW4gYW4gaW5wdXQgd2l0aCBhIHBsYWNlaG9sZGVyIGlzIGZv Y3VzZWQuCisgIGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9IGlzRXZlbnRTdXBwb3J0ZWQoJ2lucHV0 JykgJiYgKCFkb2N1bWVudC5kb2N1bWVudE1vZGUgfHwgZG9jdW1lbnQuZG9jdW1lbnRNb2RlID4g MTEpOworfQorCisvKioKKyAqIChGb3IgSUUgPD0xMSkgUmVwbGFjZW1lbnQgZ2V0dGVyL3NldHRl ciBmb3IgdGhlIGB2YWx1ZWAgcHJvcGVydHkgdGhhdCBnZXRzCisgKiBzZXQgb24gdGhlIGFjdGl2 ZSBlbGVtZW50LgorICovCit2YXIgbmV3VmFsdWVQcm9wID0geworICBnZXQ6IGZ1bmN0aW9uICgp IHsKKyAgICByZXR1cm4gYWN0aXZlRWxlbWVudFZhbHVlUHJvcC5nZXQuY2FsbCh0aGlzKTsKKyAg fSwKKyAgc2V0OiBmdW5jdGlvbiAodmFsKSB7CisgICAgLy8gQ2FzdCB0byBhIHN0cmluZyBzbyB3 ZSBjYW4gZG8gZXF1YWxpdHkgY2hlY2tzLgorICAgIGFjdGl2ZUVsZW1lbnRWYWx1ZSA9ICcnICsg dmFsOworICAgIGFjdGl2ZUVsZW1lbnRWYWx1ZVByb3Auc2V0LmNhbGwodGhpcywgdmFsKTsKKyAg fQorfTsKKworLyoqCisgKiAoRm9yIElFIDw9MTEpIFN0YXJ0cyB0cmFja2luZyBwcm9wZXJ0eWNo YW5nZSBldmVudHMgb24gdGhlIHBhc3NlZC1pbiBlbGVtZW50CisgKiBhbmQgb3ZlcnJpZGUgdGhl IHZhbHVlIHByb3BlcnR5IHNvIHRoYXQgd2UgY2FuIGRpc3Rpbmd1aXNoIHVzZXIgZXZlbnRzIGZy b20KKyAqIHZhbHVlIGNoYW5nZXMgaW4gSlMuCisgKi8KK2Z1bmN0aW9uIHN0YXJ0V2F0Y2hpbmdG b3JWYWx1ZUNoYW5nZSh0YXJnZXQsIHRhcmdldEluc3QpIHsKKyAgYWN0aXZlRWxlbWVudCA9IHRh cmdldDsKKyAgYWN0aXZlRWxlbWVudEluc3QgPSB0YXJnZXRJbnN0OworICBhY3RpdmVFbGVtZW50 VmFsdWUgPSB0YXJnZXQudmFsdWU7CisgIGFjdGl2ZUVsZW1lbnRWYWx1ZVByb3AgPSBPYmplY3Qu Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsICd2 YWx1ZScpOworCisgIC8vIE5vdCBndWFyZGVkIGluIGEgY2FuRGVmaW5lUHJvcGVydHkgY2hlY2s6 IElFOCBzdXBwb3J0cyBkZWZpbmVQcm9wZXJ0eSBvbmx5CisgIC8vIG9uIERPTSBlbGVtZW50cwor ICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYWN0aXZlRWxlbWVudCwgJ3ZhbHVlJywgbmV3VmFsdWVQ cm9wKTsKKyAgaWYgKGFjdGl2ZUVsZW1lbnQuYXR0YWNoRXZlbnQpIHsKKyAgICBhY3RpdmVFbGVt ZW50LmF0dGFjaEV2ZW50KCdvbnByb3BlcnR5Y2hhbmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2Up OworICB9IGVsc2UgeworICAgIGFjdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncHJvcGVy dHljaGFuZ2UnLCBoYW5kbGVQcm9wZXJ0eUNoYW5nZSwgZmFsc2UpOworICB9Cit9CisKKy8qKgor ICogKEZvciBJRSA8PTExKSBSZW1vdmVzIHRoZSBldmVudCBsaXN0ZW5lcnMgZnJvbSB0aGUgY3Vy cmVudGx5LXRyYWNrZWQgZWxlbWVudCwKKyAqIGlmIGFueSBleGlzdHMuCisgKi8KK2Z1bmN0aW9u IHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCkgeworICBpZiAoIWFjdGl2ZUVsZW1lbnQpIHsK KyAgICByZXR1cm47CisgIH0KKworICAvLyBkZWxldGUgcmVzdG9yZXMgdGhlIG9yaWdpbmFsIHBy b3BlcnR5IGRlZmluaXRpb24KKyAgZGVsZXRlIGFjdGl2ZUVsZW1lbnQudmFsdWU7CisKKyAgaWYg KGFjdGl2ZUVsZW1lbnQuZGV0YWNoRXZlbnQpIHsKKyAgICBhY3RpdmVFbGVtZW50LmRldGFjaEV2 ZW50KCdvbnByb3BlcnR5Y2hhbmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2UpOworICB9IGVsc2Ug eworICAgIGFjdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncHJvcGVydHljaGFuZ2Un LCBoYW5kbGVQcm9wZXJ0eUNoYW5nZSwgZmFsc2UpOworICB9CisKKyAgYWN0aXZlRWxlbWVudCA9 IG51bGw7CisgIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDsKKyAgYWN0aXZlRWxlbWVudFZhbHVl ID0gbnVsbDsKKyAgYWN0aXZlRWxlbWVudFZhbHVlUHJvcCA9IG51bGw7Cit9CisKKy8qKgorICog KEZvciBJRSA8PTExKSBIYW5kbGVzIGEgcHJvcGVydHljaGFuZ2UgZXZlbnQsIHNlbmRpbmcgYSBg Y2hhbmdlYCBldmVudCBpZgorICogdGhlIHZhbHVlIG9mIHRoZSBhY3RpdmUgZWxlbWVudCBoYXMg Y2hhbmdlZC4KKyAqLworZnVuY3Rpb24gaGFuZGxlUHJvcGVydHlDaGFuZ2UobmF0aXZlRXZlbnQp IHsKKyAgaWYgKG5hdGl2ZUV2ZW50LnByb3BlcnR5TmFtZSAhPT0gJ3ZhbHVlJykgeworICAgIHJl dHVybjsKKyAgfQorICB2YXIgdmFsdWUgPSBuYXRpdmVFdmVudC5zcmNFbGVtZW50LnZhbHVlOwor ICBpZiAodmFsdWUgPT09IGFjdGl2ZUVsZW1lbnRWYWx1ZSkgeworICAgIHJldHVybjsKKyAgfQor ICBhY3RpdmVFbGVtZW50VmFsdWUgPSB2YWx1ZTsKKworICBtYW51YWxEaXNwYXRjaENoYW5nZUV2 ZW50KG5hdGl2ZUV2ZW50KTsKK30KKworLyoqCisgKiBJZiBhIGBjaGFuZ2VgIGV2ZW50IHNob3Vs ZCBiZSBmaXJlZCwgcmV0dXJucyB0aGUgdGFyZ2V0J3MgSUQuCisgKi8KK2Z1bmN0aW9uIGdldFRh cmdldEluc3RGb3JJbnB1dEV2ZW50KHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCkgeworICBpZiAo dG9wTGV2ZWxUeXBlID09PSAndG9wSW5wdXQnKSB7CisgICAgLy8gSW4gbW9kZXJuIGJyb3dzZXJz IChpLmUuLCBub3QgSUU4IG9yIElFOSksIHRoZSBpbnB1dCBldmVudCBpcyBleGFjdGx5CisgICAg Ly8gd2hhdCB3ZSB3YW50IHNvIGZhbGwgdGhyb3VnaCBoZXJlIGFuZCB0cmlnZ2VyIGFuIGFic3Ry YWN0IGV2ZW50CisgICAgcmV0dXJuIHRhcmdldEluc3Q7CisgIH0KK30KKworZnVuY3Rpb24gaGFu ZGxlRXZlbnRzRm9ySW5wdXRFdmVudElFKHRvcExldmVsVHlwZSwgdGFyZ2V0LCB0YXJnZXRJbnN0 KSB7CisgIGlmICh0b3BMZXZlbFR5cGUgPT09ICd0b3BGb2N1cycpIHsKKyAgICAvLyBJbiBJRTgs IHdlIGNhbiBjYXB0dXJlIGFsbW9zdCBhbGwgLnZhbHVlIGNoYW5nZXMgYnkgYWRkaW5nIGEKKyAg ICAvLyBwcm9wZXJ0eWNoYW5nZSBoYW5kbGVyIGFuZCBsb29raW5nIGZvciBldmVudHMgd2l0aCBw cm9wZXJ0eU5hbWUKKyAgICAvLyBlcXVhbCB0byAndmFsdWUnCisgICAgLy8gSW4gSUU5LTExLCBw cm9wZXJ0eWNoYW5nZSBmaXJlcyBmb3IgbW9zdCBpbnB1dCBldmVudHMgYnV0IGlzIGJ1Z2d5IGFu ZAorICAgIC8vIGRvZXNuJ3QgZmlyZSB3aGVuIHRleHQgaXMgZGVsZXRlZCwgYnV0IGNvbnZlbmll bnRseSwgc2VsZWN0aW9uY2hhbmdlCisgICAgLy8gYXBwZWFycyB0byBmaXJlIGluIGFsbCBvZiB0 aGUgcmVtYWluaW5nIGNhc2VzIHNvIHdlIGNhdGNoIHRob3NlIGFuZAorICAgIC8vIGZvcndhcmQg dGhlIGV2ZW50IGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZAorICAgIC8vIEluIGVpdGhlciBjYXNl LCB3ZSBkb24ndCB3YW50IHRvIGNhbGwgdGhlIGV2ZW50IGhhbmRsZXIgaWYgdGhlIHZhbHVlCisg ICAgLy8gaXMgY2hhbmdlZCBmcm9tIEpTIHNvIHdlIHJlZGVmaW5lIGEgc2V0dGVyIGZvciBgLnZh bHVlYCB0aGF0IHVwZGF0ZXMKKyAgICAvLyBvdXIgYWN0aXZlRWxlbWVudFZhbHVlIHZhcmlhYmxl LCBhbGxvd2luZyB1cyB0byBpZ25vcmUgdGhvc2UgY2hhbmdlcworICAgIC8vCisgICAgLy8gc3Rv cFdhdGNoaW5nKCkgc2hvdWxkIGJlIGEgbm9vcCBoZXJlIGJ1dCB3ZSBjYWxsIGl0IGp1c3QgaW4g Y2FzZSB3ZQorICAgIC8vIG1pc3NlZCBhIGJsdXIgZXZlbnQgc29tZWhvdy4KKyAgICBzdG9wV2F0 Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpOworICAgIHN0YXJ0V2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSh0 YXJnZXQsIHRhcmdldEluc3QpOworICB9IGVsc2UgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcEJs dXInKSB7CisgICAgc3RvcFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKTsKKyAgfQorfQorCisvLyBG b3IgSUU4IGFuZCBJRTkuCitmdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRFdmVudElFKHRv cExldmVsVHlwZSwgdGFyZ2V0SW5zdCkgeworICBpZiAodG9wTGV2ZWxUeXBlID09PSAndG9wU2Vs ZWN0aW9uQ2hhbmdlJyB8fCB0b3BMZXZlbFR5cGUgPT09ICd0b3BLZXlVcCcgfHwgdG9wTGV2ZWxU eXBlID09PSAndG9wS2V5RG93bicpIHsKKyAgICAvLyBPbiB0aGUgc2VsZWN0aW9uY2hhbmdlIGV2 ZW50LCB0aGUgdGFyZ2V0IGlzIGp1c3QgZG9jdW1lbnQgd2hpY2ggaXNuJ3QKKyAgICAvLyBoZWxw ZnVsIGZvciB1cyBzbyBqdXN0IGNoZWNrIGFjdGl2ZUVsZW1lbnQgaW5zdGVhZC4KKyAgICAvLwor ICAgIC8vIDk5JSBvZiB0aGUgdGltZSwga2V5ZG93biBhbmQga2V5dXAgYXJlbid0IG5lY2Vzc2Fy eS4gSUU4IGZhaWxzIHRvIGZpcmUKKyAgICAvLyBwcm9wZXJ0eWNoYW5nZSBvbiB0aGUgZmlyc3Qg aW5wdXQgZXZlbnQgYWZ0ZXIgc2V0dGluZyBgdmFsdWVgIGZyb20gYQorICAgIC8vIHNjcmlwdCBh bmQgZmlyZXMgb25seSBrZXlkb3duLCBrZXlwcmVzcywga2V5dXAuIENhdGNoaW5nIGtleXVwIHVz dWFsbHkKKyAgICAvLyBnZXRzIGl0IGFuZCBjYXRjaGluZyBrZXlkb3duIGxldHMgdXMgZmlyZSBh biBldmVudCBmb3IgdGhlIGZpcnN0CisgICAgLy8ga2V5c3Ryb2tlIGlmIHVzZXIgZG9lcyBhIGtl eSByZXBlYXQgKGl0J2xsIGJlIGEgbGl0dGxlIGRlbGF5ZWQ6IHJpZ2h0CisgICAgLy8gYmVmb3Jl IHRoZSBzZWNvbmQga2V5c3Ryb2tlKS4gT3RoZXIgaW5wdXQgbWV0aG9kcyAoZS5nLiwgcGFzdGUp IHNlZW0gdG8KKyAgICAvLyBmaXJlIHNlbGVjdGlvbmNoYW5nZSBub3JtYWxseS4KKyAgICBpZiAo YWN0aXZlRWxlbWVudCAmJiBhY3RpdmVFbGVtZW50LnZhbHVlICE9PSBhY3RpdmVFbGVtZW50VmFs dWUpIHsKKyAgICAgIGFjdGl2ZUVsZW1lbnRWYWx1ZSA9IGFjdGl2ZUVsZW1lbnQudmFsdWU7Cisg ICAgICByZXR1cm4gYWN0aXZlRWxlbWVudEluc3Q7CisgICAgfQorICB9Cit9CisKKy8qKgorICog U0VDVElPTjogaGFuZGxlIGBjbGlja2AgZXZlbnQKKyAqLworZnVuY3Rpb24gc2hvdWxkVXNlQ2xp Y2tFdmVudChlbGVtKSB7CisgIC8vIFVzZSB0aGUgYGNsaWNrYCBldmVudCB0byBkZXRlY3QgY2hh bmdlcyB0byBjaGVja2JveCBhbmQgcmFkaW8gaW5wdXRzLgorICAvLyBUaGlzIGFwcHJvYWNoIHdv cmtzIGFjcm9zcyBhbGwgYnJvd3NlcnMsIHdoZXJlYXMgYGNoYW5nZWAgZG9lcyBub3QgZmlyZQor ICAvLyB1bnRpbCBgYmx1cmAgaW4gSUU4LgorICByZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVt Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcgJiYgKGVsZW0udHlwZSA9PT0gJ2No ZWNrYm94JyB8fCBlbGVtLnR5cGUgPT09ICdyYWRpbycpOworfQorCitmdW5jdGlvbiBnZXRUYXJn ZXRJbnN0Rm9yQ2xpY2tFdmVudCh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QpIHsKKyAgaWYgKHRv cExldmVsVHlwZSA9PT0gJ3RvcENsaWNrJykgeworICAgIHJldHVybiB0YXJnZXRJbnN0OworICB9 Cit9CisKKy8qKgorICogVGhpcyBwbHVnaW4gY3JlYXRlcyBhbiBgb25DaGFuZ2VgIGV2ZW50IHRo YXQgbm9ybWFsaXplcyBjaGFuZ2UgZXZlbnRzCisgKiBhY3Jvc3MgZm9ybSBlbGVtZW50cy4gVGhp cyBldmVudCBmaXJlcyBhdCBhIHRpbWUgd2hlbiBpdCdzIHBvc3NpYmxlIHRvCisgKiBjaGFuZ2Ug dGhlIGVsZW1lbnQncyB2YWx1ZSB3aXRob3V0IHNlZWluZyBhIGZsaWNrZXIuCisgKgorICogU3Vw cG9ydGVkIGVsZW1lbnRzIGFyZToKKyAqIC0gaW5wdXQgKHNlZSBgaXNUZXh0SW5wdXRFbGVtZW50 YCkKKyAqIC0gdGV4dGFyZWEKKyAqIC0gc2VsZWN0CisgKi8KK3ZhciBDaGFuZ2VFdmVudFBsdWdp biA9IHsKKworICBldmVudFR5cGVzOiBldmVudFR5cGVzLAorCisgIGV4dHJhY3RFdmVudHM6IGZ1 bmN0aW9uICh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVu dFRhcmdldCkgeworICAgIHZhciB0YXJnZXROb2RlID0gdGFyZ2V0SW5zdCA/IFJlYWN0RE9NQ29t cG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpIDogd2luZG93OworCisg ICAgdmFyIGdldFRhcmdldEluc3RGdW5jLCBoYW5kbGVFdmVudEZ1bmM7CisgICAgaWYgKHNob3Vs ZFVzZUNoYW5nZUV2ZW50KHRhcmdldE5vZGUpKSB7CisgICAgICBpZiAoZG9lc0NoYW5nZUV2ZW50 QnViYmxlKSB7CisgICAgICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvckNo YW5nZUV2ZW50OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaGFuZGxlRXZlbnRGdW5jID0gaGFu ZGxlRXZlbnRzRm9yQ2hhbmdlRXZlbnRJRTg7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChpc1Rl eHRJbnB1dEVsZW1lbnQodGFyZ2V0Tm9kZSkpIHsKKyAgICAgIGlmIChpc0lucHV0RXZlbnRTdXBw b3J0ZWQpIHsKKyAgICAgICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9ySW5w dXRFdmVudDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0 VGFyZ2V0SW5zdEZvcklucHV0RXZlbnRJRTsKKyAgICAgICAgaGFuZGxlRXZlbnRGdW5jID0gaGFu ZGxlRXZlbnRzRm9ySW5wdXRFdmVudElFOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoc2hvdWxk VXNlQ2xpY2tFdmVudCh0YXJnZXROb2RlKSkgeworICAgICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBn ZXRUYXJnZXRJbnN0Rm9yQ2xpY2tFdmVudDsKKyAgICB9CisKKyAgICBpZiAoZ2V0VGFyZ2V0SW5z dEZ1bmMpIHsKKyAgICAgIHZhciBpbnN0ID0gZ2V0VGFyZ2V0SW5zdEZ1bmModG9wTGV2ZWxUeXBl LCB0YXJnZXRJbnN0KTsKKyAgICAgIGlmIChpbnN0KSB7CisgICAgICAgIHZhciBldmVudCA9IFN5 bnRoZXRpY0V2ZW50LmdldFBvb2xlZChldmVudFR5cGVzLmNoYW5nZSwgaW5zdCwgbmF0aXZlRXZl bnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTsKKyAgICAgICAgZXZlbnQudHlwZSA9ICdjaGFuZ2UnOwor ICAgICAgICBFdmVudFByb3BhZ2F0b3JzLmFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMoZXZl bnQpOworICAgICAgICByZXR1cm4gZXZlbnQ7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGhh bmRsZUV2ZW50RnVuYykgeworICAgICAgaGFuZGxlRXZlbnRGdW5jKHRvcExldmVsVHlwZSwgdGFy Z2V0Tm9kZSwgdGFyZ2V0SW5zdCk7CisgICAgfQorICB9CisKK307CisKK21vZHVsZS5leHBvcnRz ID0gQ2hhbmdlRXZlbnRQbHVnaW47Cit9LHsiMTA2IjoxMDYsIjExMyI6MTEzLCIxMTQiOjExNCwi MTI2IjoxMjYsIjE2IjoxNiwiMTkiOjE5LCIzMiI6MzIsIjc1Ijo3NSwiODQiOjg0fV0sODpbZnVu Y3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXBy ZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRo aXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZv dW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlz IHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNh biBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAq CisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgRE9NTGF6eVRyZWUgPSBfZGVyZXFfKDkpOwor dmFyIERhbmdlciA9IF9kZXJlcV8oMTMpOwordmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IF9k ZXJlcV8oMzIpOwordmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gX2RlcmVxXyg1OSk7CisKK3Zh ciBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uID0gX2RlcmVxXyg5OCk7Cit2YXIg c2V0SW5uZXJIVE1MID0gX2RlcmVxXygxMTcpOwordmFyIHNldFRleHRDb250ZW50ID0gX2RlcmVx XygxMTgpOworCitmdW5jdGlvbiBnZXROb2RlQWZ0ZXIocGFyZW50Tm9kZSwgbm9kZSkgeworICAv LyBTcGVjaWFsIGNhc2UgZm9yIHRleHQgY29tcG9uZW50cywgd2hpY2ggcmV0dXJuIFtvcGVuLCBj bG9zZV0gY29tbWVudHMKKyAgLy8gZnJvbSBnZXRIb3N0Tm9kZS4KKyAgaWYgKEFycmF5LmlzQXJy YXkobm9kZSkpIHsKKyAgICBub2RlID0gbm9kZVsxXTsKKyAgfQorICByZXR1cm4gbm9kZSA/IG5v ZGUubmV4dFNpYmxpbmcgOiBwYXJlbnROb2RlLmZpcnN0Q2hpbGQ7Cit9CisKKy8qKgorICogSW5z ZXJ0cyBgY2hpbGROb2RlYCBhcyBhIGNoaWxkIG9mIGBwYXJlbnROb2RlYCBhdCB0aGUgYGluZGV4 YC4KKyAqCisgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IHBhcmVudE5vZGUgUGFyZW50IG5vZGUgaW4g d2hpY2ggdG8gaW5zZXJ0LgorICogQHBhcmFtIHtET01FbGVtZW50fSBjaGlsZE5vZGUgQ2hpbGQg bm9kZSB0byBpbnNlcnQuCisgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggYXQgd2hpY2gg dG8gaW5zZXJ0IHRoZSBjaGlsZC4KKyAqIEBpbnRlcm5hbAorICovCit2YXIgaW5zZXJ0Q2hpbGRB dCA9IGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKHBhcmVudE5v ZGUsIGNoaWxkTm9kZSwgcmVmZXJlbmNlTm9kZSkgeworICAvLyBXZSByZWx5IGV4Y2x1c2l2ZWx5 IG9uIGBpbnNlcnRCZWZvcmUobm9kZSwgbnVsbClgIGluc3RlYWQgb2YgYWxzbyB1c2luZworICAv LyBgYXBwZW5kQ2hpbGQobm9kZSlgLiAoVXNpbmcgYHVuZGVmaW5lZGAgaXMgbm90IGFsbG93ZWQg YnkgYWxsIGJyb3dzZXJzIHNvCisgIC8vIHdlIGFyZSBjYXJlZnVsIHRvIHVzZSBgbnVsbGAuKQor ICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZE5vZGUsIHJlZmVyZW5jZU5vZGUpOworfSk7 CisKK2Z1bmN0aW9uIGluc2VydExhenlUcmVlQ2hpbGRBdChwYXJlbnROb2RlLCBjaGlsZFRyZWUs IHJlZmVyZW5jZU5vZGUpIHsKKyAgRE9NTGF6eVRyZWUuaW5zZXJ0VHJlZUJlZm9yZShwYXJlbnRO b2RlLCBjaGlsZFRyZWUsIHJlZmVyZW5jZU5vZGUpOworfQorCitmdW5jdGlvbiBtb3ZlQ2hpbGQo cGFyZW50Tm9kZSwgY2hpbGROb2RlLCByZWZlcmVuY2VOb2RlKSB7CisgIGlmIChBcnJheS5pc0Fy cmF5KGNoaWxkTm9kZSkpIHsKKyAgICBtb3ZlRGVsaW1pdGVkVGV4dChwYXJlbnROb2RlLCBjaGls ZE5vZGVbMF0sIGNoaWxkTm9kZVsxXSwgcmVmZXJlbmNlTm9kZSk7CisgIH0gZWxzZSB7CisgICAg aW5zZXJ0Q2hpbGRBdChwYXJlbnROb2RlLCBjaGlsZE5vZGUsIHJlZmVyZW5jZU5vZGUpOworICB9 Cit9CisKK2Z1bmN0aW9uIHJlbW92ZUNoaWxkKHBhcmVudE5vZGUsIGNoaWxkTm9kZSkgeworICBp ZiAoQXJyYXkuaXNBcnJheShjaGlsZE5vZGUpKSB7CisgICAgdmFyIGNsb3NpbmdDb21tZW50ID0g Y2hpbGROb2RlWzFdOworICAgIGNoaWxkTm9kZSA9IGNoaWxkTm9kZVswXTsKKyAgICByZW1vdmVE ZWxpbWl0ZWRUZXh0KHBhcmVudE5vZGUsIGNoaWxkTm9kZSwgY2xvc2luZ0NvbW1lbnQpOworICAg IHBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2xvc2luZ0NvbW1lbnQpOworICB9CisgIHBhcmVudE5v ZGUucmVtb3ZlQ2hpbGQoY2hpbGROb2RlKTsKK30KKworZnVuY3Rpb24gbW92ZURlbGltaXRlZFRl eHQocGFyZW50Tm9kZSwgb3BlbmluZ0NvbW1lbnQsIGNsb3NpbmdDb21tZW50LCByZWZlcmVuY2VO b2RlKSB7CisgIHZhciBub2RlID0gb3BlbmluZ0NvbW1lbnQ7CisgIHdoaWxlICh0cnVlKSB7Cisg ICAgdmFyIG5leHROb2RlID0gbm9kZS5uZXh0U2libGluZzsKKyAgICBpbnNlcnRDaGlsZEF0KHBh cmVudE5vZGUsIG5vZGUsIHJlZmVyZW5jZU5vZGUpOworICAgIGlmIChub2RlID09PSBjbG9zaW5n Q29tbWVudCkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIG5vZGUgPSBuZXh0Tm9kZTsKKyAg fQorfQorCitmdW5jdGlvbiByZW1vdmVEZWxpbWl0ZWRUZXh0KHBhcmVudE5vZGUsIHN0YXJ0Tm9k ZSwgY2xvc2luZ0NvbW1lbnQpIHsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICB2YXIgbm9kZSA9IHN0 YXJ0Tm9kZS5uZXh0U2libGluZzsKKyAgICBpZiAobm9kZSA9PT0gY2xvc2luZ0NvbW1lbnQpIHsK KyAgICAgIC8vIFRoZSBjbG9zaW5nIGNvbW1lbnQgaXMgcmVtb3ZlZCBieSBSZWFjdE11bHRpQ2hp bGQuCisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgcGFyZW50Tm9kZS5yZW1vdmVD aGlsZChub2RlKTsKKyAgICB9CisgIH0KK30KKworZnVuY3Rpb24gcmVwbGFjZURlbGltaXRlZFRl eHQob3BlbmluZ0NvbW1lbnQsIGNsb3NpbmdDb21tZW50LCBzdHJpbmdUZXh0KSB7CisgIHZhciBw YXJlbnROb2RlID0gb3BlbmluZ0NvbW1lbnQucGFyZW50Tm9kZTsKKyAgdmFyIG5vZGVBZnRlckNv bW1lbnQgPSBvcGVuaW5nQ29tbWVudC5uZXh0U2libGluZzsKKyAgaWYgKG5vZGVBZnRlckNvbW1l bnQgPT09IGNsb3NpbmdDb21tZW50KSB7CisgICAgLy8gVGhlcmUgYXJlIG5vIHRleHQgbm9kZXMg YmV0d2VlbiB0aGUgb3BlbmluZyBhbmQgY2xvc2luZyBjb21tZW50czsgaW5zZXJ0CisgICAgLy8g YSBuZXcgb25lIGlmIHN0cmluZ1RleHQgaXNuJ3QgZW1wdHkuCisgICAgaWYgKHN0cmluZ1RleHQp IHsKKyAgICAgIGluc2VydENoaWxkQXQocGFyZW50Tm9kZSwgZG9jdW1lbnQuY3JlYXRlVGV4dE5v ZGUoc3RyaW5nVGV4dCksIG5vZGVBZnRlckNvbW1lbnQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAg ICBpZiAoc3RyaW5nVGV4dCkgeworICAgICAgLy8gU2V0IHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhl IGZpcnN0IG5vZGUgYWZ0ZXIgdGhlIG9wZW5pbmcgY29tbWVudCwgYW5kCisgICAgICAvLyByZW1v dmUgYWxsIGZvbGxvd2luZyBub2RlcyB1cCB1bnRpbCB0aGUgY2xvc2luZyBjb21tZW50LgorICAg ICAgc2V0VGV4dENvbnRlbnQobm9kZUFmdGVyQ29tbWVudCwgc3RyaW5nVGV4dCk7CisgICAgICBy ZW1vdmVEZWxpbWl0ZWRUZXh0KHBhcmVudE5vZGUsIG5vZGVBZnRlckNvbW1lbnQsIGNsb3NpbmdD b21tZW50KTsKKyAgICB9IGVsc2UgeworICAgICAgcmVtb3ZlRGVsaW1pdGVkVGV4dChwYXJlbnRO b2RlLCBvcGVuaW5nQ29tbWVudCwgY2xvc2luZ0NvbW1lbnQpOworICAgIH0KKyAgfQorCisgIGlm ICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICBSZWFjdEluc3RydW1lbnRh dGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHsKKyAgICAgIGluc3RhbmNlSUQ6IFJlYWN0 RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKG9wZW5pbmdDb21tZW50KS5fZGVi dWdJRCwKKyAgICAgIHR5cGU6ICdyZXBsYWNlIHRleHQnLAorICAgICAgcGF5bG9hZDogc3RyaW5n VGV4dAorICAgIH0pOworICB9Cit9CisKK3ZhciBkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1h cmt1cCA9IERhbmdlci5kYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cDsKK2lmICgiZGV2 ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdp dGhNYXJrdXAgPSBmdW5jdGlvbiAob2xkQ2hpbGQsIG1hcmt1cCwgcHJldkluc3RhbmNlKSB7Cisg ICAgRGFuZ2VyLmRhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwKG9sZENoaWxkLCBtYXJr dXApOworICAgIGlmIChwcmV2SW5zdGFuY2UuX2RlYnVnSUQgIT09IDApIHsKKyAgICAgIFJlYWN0 SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oeworICAgICAgICBpbnN0 YW5jZUlEOiBwcmV2SW5zdGFuY2UuX2RlYnVnSUQsCisgICAgICAgIHR5cGU6ICdyZXBsYWNlIHdp dGgnLAorICAgICAgICBwYXlsb2FkOiBtYXJrdXAudG9TdHJpbmcoKQorICAgICAgfSk7CisgICAg fSBlbHNlIHsKKyAgICAgIHZhciBuZXh0SW5zdGFuY2UgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUu Z2V0SW5zdGFuY2VGcm9tTm9kZShtYXJrdXAubm9kZSk7CisgICAgICBpZiAobmV4dEluc3RhbmNl Ll9kZWJ1Z0lEICE9PSAwKSB7CisgICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9v bC5vbkhvc3RPcGVyYXRpb24oeworICAgICAgICAgIGluc3RhbmNlSUQ6IG5leHRJbnN0YW5jZS5f ZGVidWdJRCwKKyAgICAgICAgICB0eXBlOiAnbW91bnQnLAorICAgICAgICAgIHBheWxvYWQ6IG1h cmt1cC50b1N0cmluZygpCisgICAgICAgIH0pOworICAgICAgfQorICAgIH0KKyAgfTsKK30KKwor LyoqCisgKiBPcGVyYXRpb25zIGZvciB1cGRhdGluZyB3aXRoIERPTSBjaGlsZHJlbi4KKyAqLwor dmFyIERPTUNoaWxkcmVuT3BlcmF0aW9ucyA9IHsKKworICBkYW5nZXJvdXNseVJlcGxhY2VOb2Rl V2l0aE1hcmt1cDogZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXAsCisKKyAgcmVwbGFj ZURlbGltaXRlZFRleHQ6IHJlcGxhY2VEZWxpbWl0ZWRUZXh0LAorCisgIC8qKgorICAgKiBVcGRh dGVzIGEgY29tcG9uZW50J3MgY2hpbGRyZW4gYnkgcHJvY2Vzc2luZyBhIHNlcmllcyBvZiB1cGRh dGVzLiBUaGUKKyAgICogdXBkYXRlIGNvbmZpZ3VyYXRpb25zIGFyZSBlYWNoIGV4cGVjdGVkIHRv IGhhdmUgYSBgcGFyZW50Tm9kZWAgcHJvcGVydHkuCisgICAqCisgICAqIEBwYXJhbSB7YXJyYXk8 b2JqZWN0Pn0gdXBkYXRlcyBMaXN0IG9mIHVwZGF0ZSBjb25maWd1cmF0aW9ucy4KKyAgICogQGlu dGVybmFsCisgICAqLworICBwcm9jZXNzVXBkYXRlczogZnVuY3Rpb24gKHBhcmVudE5vZGUsIHVw ZGF0ZXMpIHsKKyAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAg ICB2YXIgcGFyZW50Tm9kZURlYnVnSUQgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFu Y2VGcm9tTm9kZShwYXJlbnROb2RlKS5fZGVidWdJRDsKKyAgICB9CisKKyAgICBmb3IgKHZhciBr ID0gMDsgayA8IHVwZGF0ZXMubGVuZ3RoOyBrKyspIHsKKyAgICAgIHZhciB1cGRhdGUgPSB1cGRh dGVzW2tdOworICAgICAgc3dpdGNoICh1cGRhdGUudHlwZSkgeworICAgICAgICBjYXNlICdJTlNF UlRfTUFSS1VQJzoKKyAgICAgICAgICBpbnNlcnRMYXp5VHJlZUNoaWxkQXQocGFyZW50Tm9kZSwg dXBkYXRlLmNvbnRlbnQsIGdldE5vZGVBZnRlcihwYXJlbnROb2RlLCB1cGRhdGUuYWZ0ZXJOb2Rl KSk7CisgICAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAg ICAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7 CisgICAgICAgICAgICAgIGluc3RhbmNlSUQ6IHBhcmVudE5vZGVEZWJ1Z0lELAorICAgICAgICAg ICAgICB0eXBlOiAnaW5zZXJ0IGNoaWxkJywKKyAgICAgICAgICAgICAgcGF5bG9hZDogeyB0b0lu ZGV4OiB1cGRhdGUudG9JbmRleCwgY29udGVudDogdXBkYXRlLmNvbnRlbnQudG9TdHJpbmcoKSB9 CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAg IGNhc2UgJ01PVkVfRVhJU1RJTkcnOgorICAgICAgICAgIG1vdmVDaGlsZChwYXJlbnROb2RlLCB1 cGRhdGUuZnJvbU5vZGUsIGdldE5vZGVBZnRlcihwYXJlbnROb2RlLCB1cGRhdGUuYWZ0ZXJOb2Rl KSk7CisgICAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAg ICAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7 CisgICAgICAgICAgICAgIGluc3RhbmNlSUQ6IHBhcmVudE5vZGVEZWJ1Z0lELAorICAgICAgICAg ICAgICB0eXBlOiAnbW92ZSBjaGlsZCcsCisgICAgICAgICAgICAgIHBheWxvYWQ6IHsgZnJvbUlu ZGV4OiB1cGRhdGUuZnJvbUluZGV4LCB0b0luZGV4OiB1cGRhdGUudG9JbmRleCB9CisgICAgICAg ICAgICB9KTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1NF VF9NQVJLVVAnOgorICAgICAgICAgIHNldElubmVySFRNTChwYXJlbnROb2RlLCB1cGRhdGUuY29u dGVudCk7CisgICAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgewor ICAgICAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlv bih7CisgICAgICAgICAgICAgIGluc3RhbmNlSUQ6IHBhcmVudE5vZGVEZWJ1Z0lELAorICAgICAg ICAgICAgICB0eXBlOiAncmVwbGFjZSBjaGlsZHJlbicsCisgICAgICAgICAgICAgIHBheWxvYWQ6 IHVwZGF0ZS5jb250ZW50LnRvU3RyaW5nKCkKKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH0K KyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnVEVYVF9DT05URU5UJzoKKyAgICAgICAg ICBzZXRUZXh0Q29udGVudChwYXJlbnROb2RlLCB1cGRhdGUuY29udGVudCk7CisgICAgICAgICAg aWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgICAgICAgUmVhY3RJ bnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7CisgICAgICAgICAgICAg IGluc3RhbmNlSUQ6IHBhcmVudE5vZGVEZWJ1Z0lELAorICAgICAgICAgICAgICB0eXBlOiAncmVw bGFjZSB0ZXh0JywKKyAgICAgICAgICAgICAgcGF5bG9hZDogdXBkYXRlLmNvbnRlbnQudG9TdHJp bmcoKQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAg ICAgICBjYXNlICdSRU1PVkVfTk9ERSc6CisgICAgICAgICAgcmVtb3ZlQ2hpbGQocGFyZW50Tm9k ZSwgdXBkYXRlLmZyb21Ob2RlKTsKKyAgICAgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3By b2R1Y3Rpb24nKSB7CisgICAgICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wu b25Ib3N0T3BlcmF0aW9uKHsKKyAgICAgICAgICAgICAgaW5zdGFuY2VJRDogcGFyZW50Tm9kZURl YnVnSUQsCisgICAgICAgICAgICAgIHR5cGU6ICdyZW1vdmUgY2hpbGQnLAorICAgICAgICAgICAg ICBwYXlsb2FkOiB7IGZyb21JbmRleDogdXBkYXRlLmZyb21JbmRleCB9CisgICAgICAgICAgICB9 KTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisK K307CisKK21vZHVsZS5leHBvcnRzID0gRE9NQ2hpbGRyZW5PcGVyYXRpb25zOworfSx7IjExNyI6 MTE3LCIxMTgiOjExOCwiMTMiOjEzLCIzMiI6MzIsIjU5Ijo1OSwiOSI6OSwiOTgiOjk4fV0sOTpb ZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDE1 LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq IFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNl IGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0 aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRz IGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4K KyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgRE9NTmFtZXNwYWNlcyA9IF9kZXJlcV8o MTApOwordmFyIHNldElubmVySFRNTCA9IF9kZXJlcV8oMTE3KTsKKwordmFyIGNyZWF0ZU1pY3Jv c29mdFVuc2FmZUxvY2FsRnVuY3Rpb24gPSBfZGVyZXFfKDk4KTsKK3ZhciBzZXRUZXh0Q29udGVu dCA9IF9kZXJlcV8oMTE4KTsKKwordmFyIEVMRU1FTlRfTk9ERV9UWVBFID0gMTsKK3ZhciBET0NV TUVOVF9GUkFHTUVOVF9OT0RFX1RZUEUgPSAxMTsKKworLyoqCisgKiBJbiBJRSAoOC0xMSkgYW5k IEVkZ2UsIGFwcGVuZGluZyBub2RlcyB3aXRoIG5vIGNoaWxkcmVuIGlzIGRyYW1hdGljYWxseQor ICogZmFzdGVyIHRoYW4gYXBwZW5kaW5nIGEgZnVsbCBzdWJ0cmVlLCBzbyB3ZSBlc3NlbnRpYWxs eSBxdWV1ZSB1cCB0aGUKKyAqIC5hcHBlbmRDaGlsZCBjYWxscyBoZXJlIGFuZCBhcHBseSB0aGVt IHNvIGVhY2ggbm9kZSBpcyBhZGRlZCB0byBpdHMgcGFyZW50CisgKiBiZWZvcmUgYW55IGNoaWxk cmVuIGFyZSBhZGRlZC4KKyAqCisgKiBJbiBvdGhlciBicm93c2VycywgZG9pbmcgc28gaXMgc2xv d2VyIG9yIG5ldXRyYWwgY29tcGFyZWQgdG8gdGhlIG90aGVyIG9yZGVyCisgKiAoaW4gRmlyZWZv eCwgdHdpY2UgYXMgc2xvdykgc28gd2Ugb25seSBkbyB0aGlzIGludmVyc2lvbiBpbiBJRS4KKyAq CisgKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3NwaWN5ai9pbm5lcmh0bWwtdnMtY3JlYXRlZWxl bWVudC12cy1jbG9uZW5vZGUuCisgKi8KK3ZhciBlbmFibGVMYXp5ID0gdHlwZW9mIGRvY3VtZW50 ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQuZG9jdW1lbnRNb2RlID09PSAnbnVt YmVyJyB8fCB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbmF2aWdh dG9yLnVzZXJBZ2VudCA9PT0gJ3N0cmluZycgJiYgL1xiRWRnZVwvXGQvLnRlc3QobmF2aWdhdG9y LnVzZXJBZ2VudCk7CisKK2Z1bmN0aW9uIGluc2VydFRyZWVDaGlsZHJlbih0cmVlKSB7CisgIGlm ICghZW5hYmxlTGF6eSkgeworICAgIHJldHVybjsKKyAgfQorICB2YXIgbm9kZSA9IHRyZWUubm9k ZTsKKyAgdmFyIGNoaWxkcmVuID0gdHJlZS5jaGlsZHJlbjsKKyAgaWYgKGNoaWxkcmVuLmxlbmd0 aCkgeworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKyAg ICAgIGluc2VydFRyZWVCZWZvcmUobm9kZSwgY2hpbGRyZW5baV0sIG51bGwpOworICAgIH0KKyAg fSBlbHNlIGlmICh0cmVlLmh0bWwgIT0gbnVsbCkgeworICAgIHNldElubmVySFRNTChub2RlLCB0 cmVlLmh0bWwpOworICB9IGVsc2UgaWYgKHRyZWUudGV4dCAhPSBudWxsKSB7CisgICAgc2V0VGV4 dENvbnRlbnQobm9kZSwgdHJlZS50ZXh0KTsKKyAgfQorfQorCit2YXIgaW5zZXJ0VHJlZUJlZm9y ZSA9IGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKHBhcmVudE5v ZGUsIHRyZWUsIHJlZmVyZW5jZU5vZGUpIHsKKyAgLy8gRG9jdW1lbnRGcmFnbWVudHMgYXJlbid0 IGFjdHVhbGx5IHBhcnQgb2YgdGhlIERPTSBhZnRlciBpbnNlcnRpb24gc28KKyAgLy8gYXBwZW5k aW5nIGNoaWxkcmVuIHdvbid0IHVwZGF0ZSB0aGUgRE9NLiBXZSBuZWVkIHRvIGVuc3VyZSB0aGUg ZnJhZ21lbnQKKyAgLy8gaXMgcHJvcGVybHkgcG9wdWxhdGVkIGZpcnN0LCBicmVha2luZyBvdXQg b2Ygb3VyIGxhenkgYXBwcm9hY2ggZm9yIGp1c3QKKyAgLy8gdGhpcyBsZXZlbC4gQWxzbywgc29t ZSA8b2JqZWN0PiBwbHVnaW5zIChsaWtlIEZsYXNoIFBsYXllcikgd2lsbCByZWFkCisgIC8vIDxw YXJhbT4gbm9kZXMgaW1tZWRpYXRlbHkgdXBvbiBpbnNlcnRpb24gaW50byB0aGUgRE9NLCBzbyA8 b2JqZWN0PgorICAvLyBtdXN0IGFsc28gYmUgcG9wdWxhdGVkIHByaW9yIHRvIGluc2VydGlvbiBp bnRvIHRoZSBET00uCisgIGlmICh0cmVlLm5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdN RU5UX05PREVfVFlQRSB8fCB0cmVlLm5vZGUubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERV9UWVBF ICYmIHRyZWUubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnb2JqZWN0JyAmJiAodHJl ZS5ub2RlLm5hbWVzcGFjZVVSSSA9PSBudWxsIHx8IHRyZWUubm9kZS5uYW1lc3BhY2VVUkkgPT09 IERPTU5hbWVzcGFjZXMuaHRtbCkpIHsKKyAgICBpbnNlcnRUcmVlQ2hpbGRyZW4odHJlZSk7Cisg ICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodHJlZS5ub2RlLCByZWZlcmVuY2VOb2RlKTsKKyAg fSBlbHNlIHsKKyAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZSh0cmVlLm5vZGUsIHJlZmVyZW5j ZU5vZGUpOworICAgIGluc2VydFRyZWVDaGlsZHJlbih0cmVlKTsKKyAgfQorfSk7CisKK2Z1bmN0 aW9uIHJlcGxhY2VDaGlsZFdpdGhUcmVlKG9sZE5vZGUsIG5ld1RyZWUpIHsKKyAgb2xkTm9kZS5w YXJlbnROb2RlLnJlcGxhY2VDaGlsZChuZXdUcmVlLm5vZGUsIG9sZE5vZGUpOworICBpbnNlcnRU cmVlQ2hpbGRyZW4obmV3VHJlZSk7Cit9CisKK2Z1bmN0aW9uIHF1ZXVlQ2hpbGQocGFyZW50VHJl ZSwgY2hpbGRUcmVlKSB7CisgIGlmIChlbmFibGVMYXp5KSB7CisgICAgcGFyZW50VHJlZS5jaGls ZHJlbi5wdXNoKGNoaWxkVHJlZSk7CisgIH0gZWxzZSB7CisgICAgcGFyZW50VHJlZS5ub2RlLmFw cGVuZENoaWxkKGNoaWxkVHJlZS5ub2RlKTsKKyAgfQorfQorCitmdW5jdGlvbiBxdWV1ZUhUTUwo dHJlZSwgaHRtbCkgeworICBpZiAoZW5hYmxlTGF6eSkgeworICAgIHRyZWUuaHRtbCA9IGh0bWw7 CisgIH0gZWxzZSB7CisgICAgc2V0SW5uZXJIVE1MKHRyZWUubm9kZSwgaHRtbCk7CisgIH0KK30K KworZnVuY3Rpb24gcXVldWVUZXh0KHRyZWUsIHRleHQpIHsKKyAgaWYgKGVuYWJsZUxhenkpIHsK KyAgICB0cmVlLnRleHQgPSB0ZXh0OworICB9IGVsc2UgeworICAgIHNldFRleHRDb250ZW50KHRy ZWUubm9kZSwgdGV4dCk7CisgIH0KK30KKworZnVuY3Rpb24gdG9TdHJpbmcoKSB7CisgIHJldHVy biB0aGlzLm5vZGUubm9kZU5hbWU7Cit9CisKK2Z1bmN0aW9uIERPTUxhenlUcmVlKG5vZGUpIHsK KyAgcmV0dXJuIHsKKyAgICBub2RlOiBub2RlLAorICAgIGNoaWxkcmVuOiBbXSwKKyAgICBodG1s OiBudWxsLAorICAgIHRleHQ6IG51bGwsCisgICAgdG9TdHJpbmc6IHRvU3RyaW5nCisgIH07Cit9 CisKK0RPTUxhenlUcmVlLmluc2VydFRyZWVCZWZvcmUgPSBpbnNlcnRUcmVlQmVmb3JlOworRE9N TGF6eVRyZWUucmVwbGFjZUNoaWxkV2l0aFRyZWUgPSByZXBsYWNlQ2hpbGRXaXRoVHJlZTsKK0RP TUxhenlUcmVlLnF1ZXVlQ2hpbGQgPSBxdWV1ZUNoaWxkOworRE9NTGF6eVRyZWUucXVldWVIVE1M ID0gcXVldWVIVE1MOworRE9NTGF6eVRyZWUucXVldWVUZXh0ID0gcXVldWVUZXh0OworCittb2R1 bGUuZXhwb3J0cyA9IERPTUxhenlUcmVlOworfSx7IjEwIjoxMCwiMTE3IjoxMTcsIjExOCI6MTE4 LCI5OCI6OTh9XSwxMDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAq IENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJl c2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJT RC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290 IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBv ZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBz YW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgRE9NTmFtZXNw YWNlcyA9IHsKKyAgaHRtbDogJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLAorICBtYXRo bWw6ICdodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MJywKKyAgc3ZnOiAnaHR0cDov L3d3dy53My5vcmcvMjAwMC9zdmcnCit9OworCittb2R1bGUuZXhwb3J0cyA9IERPTU5hbWVzcGFj ZXM7Cit9LHt9XSwxMTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAq IENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJl c2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJT RC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290 IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBv ZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBz YW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX3Byb2RJbnZh cmlhbnQgPSBfZGVyZXFfKDExNik7CisKK3ZhciBpbnZhcmlhbnQgPSBfZGVyZXFfKDE0MCk7CisK K2Z1bmN0aW9uIGNoZWNrTWFzayh2YWx1ZSwgYml0bWFzaykgeworICByZXR1cm4gKHZhbHVlICYg Yml0bWFzaykgPT09IGJpdG1hc2s7Cit9CisKK3ZhciBET01Qcm9wZXJ0eUluamVjdGlvbiA9IHsK KyAgLyoqCisgICAqIE1hcHBpbmcgZnJvbSBub3JtYWxpemVkLCBjYW1lbGNhc2VkIHByb3BlcnR5 IG5hbWVzIHRvIGEgY29uZmlndXJhdGlvbiB0aGF0CisgICAqIHNwZWNpZmllcyBob3cgdGhlIGFz c29jaWF0ZWQgRE9NIHByb3BlcnR5IHNob3VsZCBiZSBhY2Nlc3NlZCBvciByZW5kZXJlZC4KKyAg ICovCisgIE1VU1RfVVNFX1BST1BFUlRZOiAweDEsCisgIEhBU19CT09MRUFOX1ZBTFVFOiAweDQs CisgIEhBU19OVU1FUklDX1ZBTFVFOiAweDgsCisgIEhBU19QT1NJVElWRV9OVU1FUklDX1ZBTFVF OiAweDEwIHwgMHg4LAorICBIQVNfT1ZFUkxPQURFRF9CT09MRUFOX1ZBTFVFOiAweDIwLAorCisg IC8qKgorICAgKiBJbmplY3Qgc29tZSBzcGVjaWFsaXplZCBrbm93bGVkZ2UgYWJvdXQgdGhlIERP TS4gVGhpcyB0YWtlcyBhIGNvbmZpZyBvYmplY3QKKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBy b3BlcnRpZXM6CisgICAqCisgICAqIGlzQ3VzdG9tQXR0cmlidXRlOiBmdW5jdGlvbiB0aGF0IGdp dmVuIGFuIGF0dHJpYnV0ZSBuYW1lIHdpbGwgcmV0dXJuIHRydWUKKyAgICogaWYgaXQgY2FuIGJl IGluc2VydGVkIGludG8gdGhlIERPTSB2ZXJiYXRpbS4gVXNlZnVsIGZvciBkYXRhLSogb3IgYXJp YS0qCisgICAqIGF0dHJpYnV0ZXMgd2hlcmUgaXQncyBpbXBvc3NpYmxlIHRvIGVudW1lcmF0ZSBh bGwgb2YgdGhlIHBvc3NpYmxlCisgICAqIGF0dHJpYnV0ZSBuYW1lcywKKyAgICoKKyAgICogUHJv cGVydGllczogb2JqZWN0IG1hcHBpbmcgRE9NIHByb3BlcnR5IG5hbWUgdG8gb25lIG9mIHRoZQor ICAgKiBET01Qcm9wZXJ0eUluamVjdGlvbiBjb25zdGFudHMgb3IgbnVsbC4gSWYgeW91ciBhdHRy aWJ1dGUgaXNuJ3QgaW4gaGVyZSwKKyAgICogaXQgd29uJ3QgZ2V0IHdyaXR0ZW4gdG8gdGhlIERP TS4KKyAgICoKKyAgICogRE9NQXR0cmlidXRlTmFtZXM6IG9iamVjdCBtYXBwaW5nIFJlYWN0IGF0 dHJpYnV0ZSBuYW1lIHRvIHRoZSBET00KKyAgICogYXR0cmlidXRlIG5hbWUuIEF0dHJpYnV0ZSBu YW1lcyBub3Qgc3BlY2lmaWVkIHVzZSB0aGUgKipsb3dlcmNhc2UqKgorICAgKiBub3JtYWxpemVk IG5hbWUuCisgICAqCisgICAqIERPTUF0dHJpYnV0ZU5hbWVzcGFjZXM6IG9iamVjdCBtYXBwaW5n IFJlYWN0IGF0dHJpYnV0ZSBuYW1lIHRvIHRoZSBET00KKyAgICogYXR0cmlidXRlIG5hbWVzcGFj ZSBVUkwuIChBdHRyaWJ1dGUgbmFtZXMgbm90IHNwZWNpZmllZCB1c2Ugbm8gbmFtZXNwYWNlLikK KyAgICoKKyAgICogRE9NUHJvcGVydHlOYW1lczogc2ltaWxhciB0byBET01BdHRyaWJ1dGVOYW1l cyBidXQgZm9yIERPTSBwcm9wZXJ0aWVzLgorICAgKiBQcm9wZXJ0eSBuYW1lcyBub3Qgc3BlY2lm aWVkIHVzZSB0aGUgbm9ybWFsaXplZCBuYW1lLgorICAgKgorICAgKiBET01NdXRhdGlvbk1ldGhv ZHM6IFByb3BlcnRpZXMgdGhhdCByZXF1aXJlIHNwZWNpYWwgbXV0YXRpb24gbWV0aG9kcy4gSWYK KyAgICogYHZhbHVlYCBpcyB1bmRlZmluZWQsIHRoZSBtdXRhdGlvbiBtZXRob2Qgc2hvdWxkIHVu c2V0IHRoZSBwcm9wZXJ0eS4KKyAgICoKKyAgICogQHBhcmFtIHtvYmplY3R9IGRvbVByb3BlcnR5 Q29uZmlnIHRoZSBjb25maWcgYXMgZGVzY3JpYmVkIGFib3ZlLgorICAgKi8KKyAgaW5qZWN0RE9N UHJvcGVydHlDb25maWc6IGZ1bmN0aW9uIChkb21Qcm9wZXJ0eUNvbmZpZykgeworICAgIHZhciBJ bmplY3Rpb24gPSBET01Qcm9wZXJ0eUluamVjdGlvbjsKKyAgICB2YXIgUHJvcGVydGllcyA9IGRv bVByb3BlcnR5Q29uZmlnLlByb3BlcnRpZXMgfHwge307CisgICAgdmFyIERPTUF0dHJpYnV0ZU5h bWVzcGFjZXMgPSBkb21Qcm9wZXJ0eUNvbmZpZy5ET01BdHRyaWJ1dGVOYW1lc3BhY2VzIHx8IHt9 OworICAgIHZhciBET01BdHRyaWJ1dGVOYW1lcyA9IGRvbVByb3BlcnR5Q29uZmlnLkRPTUF0dHJp YnV0ZU5hbWVzIHx8IHt9OworICAgIHZhciBET01Qcm9wZXJ0eU5hbWVzID0gZG9tUHJvcGVydHlD b25maWcuRE9NUHJvcGVydHlOYW1lcyB8fCB7fTsKKyAgICB2YXIgRE9NTXV0YXRpb25NZXRob2Rz ID0gZG9tUHJvcGVydHlDb25maWcuRE9NTXV0YXRpb25NZXRob2RzIHx8IHt9OworCisgICAgaWYg KGRvbVByb3BlcnR5Q29uZmlnLmlzQ3VzdG9tQXR0cmlidXRlKSB7CisgICAgICBET01Qcm9wZXJ0 eS5faXNDdXN0b21BdHRyaWJ1dGVGdW5jdGlvbnMucHVzaChkb21Qcm9wZXJ0eUNvbmZpZy5pc0N1 c3RvbUF0dHJpYnV0ZSk7CisgICAgfQorCisgICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gUHJvcGVy dGllcykgeworICAgICAgISFET01Qcm9wZXJ0eS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHBy b3BOYW1lKSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxz ZSwgJ2luamVjdERPTVByb3BlcnR5Q29uZmlnKC4uLik6IFlvdVwncmUgdHJ5aW5nIHRvIGluamVj dCBET00gcHJvcGVydHkgXCclc1wnIHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4gaW5qZWN0ZWQuIFlv dSBtYXkgYmUgYWNjaWRlbnRhbGx5IGluamVjdGluZyB0aGUgc2FtZSBET00gcHJvcGVydHkgY29u ZmlnIHR3aWNlLCBvciB5b3UgbWF5IGJlIGluamVjdGluZyB0d28gY29uZmlncyB0aGF0IGhhdmUg Y29uZmxpY3RpbmcgcHJvcGVydHkgbmFtZXMuJywgcHJvcE5hbWUpIDogX3Byb2RJbnZhcmlhbnQo JzQ4JywgcHJvcE5hbWUpIDogdm9pZCAwOworCisgICAgICB2YXIgbG93ZXJDYXNlZCA9IHByb3BO YW1lLnRvTG93ZXJDYXNlKCk7CisgICAgICB2YXIgcHJvcENvbmZpZyA9IFByb3BlcnRpZXNbcHJv cE5hbWVdOworCisgICAgICB2YXIgcHJvcGVydHlJbmZvID0geworICAgICAgICBhdHRyaWJ1dGVO YW1lOiBsb3dlckNhc2VkLAorICAgICAgICBhdHRyaWJ1dGVOYW1lc3BhY2U6IG51bGwsCisgICAg ICAgIHByb3BlcnR5TmFtZTogcHJvcE5hbWUsCisgICAgICAgIG11dGF0aW9uTWV0aG9kOiBudWxs LAorCisgICAgICAgIG11c3RVc2VQcm9wZXJ0eTogY2hlY2tNYXNrKHByb3BDb25maWcsIEluamVj dGlvbi5NVVNUX1VTRV9QUk9QRVJUWSksCisgICAgICAgIGhhc0Jvb2xlYW5WYWx1ZTogY2hlY2tN YXNrKHByb3BDb25maWcsIEluamVjdGlvbi5IQVNfQk9PTEVBTl9WQUxVRSksCisgICAgICAgIGhh c051bWVyaWNWYWx1ZTogY2hlY2tNYXNrKHByb3BDb25maWcsIEluamVjdGlvbi5IQVNfTlVNRVJJ Q19WQUxVRSksCisgICAgICAgIGhhc1Bvc2l0aXZlTnVtZXJpY1ZhbHVlOiBjaGVja01hc2socHJv cENvbmZpZywgSW5qZWN0aW9uLkhBU19QT1NJVElWRV9OVU1FUklDX1ZBTFVFKSwKKyAgICAgICAg aGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZTogY2hlY2tNYXNrKHByb3BDb25maWcsIEluamVjdGlv bi5IQVNfT1ZFUkxPQURFRF9CT09MRUFOX1ZBTFVFKQorICAgICAgfTsKKyAgICAgICEocHJvcGVy dHlJbmZvLmhhc0Jvb2xlYW5WYWx1ZSArIHByb3BlcnR5SW5mby5oYXNOdW1lcmljVmFsdWUgKyBw cm9wZXJ0eUluZm8uaGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZSA8PSAxKSA/ICJkZXZlbG9wbWVu dCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0RPTVByb3BlcnR5OiBWYWx1 ZSBjYW4gYmUgb25lIG9mIGJvb2xlYW4sIG92ZXJsb2FkZWQgYm9vbGVhbiwgb3IgbnVtZXJpYyB2 YWx1ZSwgYnV0IG5vdCBhIGNvbWJpbmF0aW9uOiAlcycsIHByb3BOYW1lKSA6IF9wcm9kSW52YXJp YW50KCc1MCcsIHByb3BOYW1lKSA6IHZvaWQgMDsKKworICAgICAgaWYgKCJkZXZlbG9wbWVudCIg IT09ICdwcm9kdWN0aW9uJykgeworICAgICAgICBET01Qcm9wZXJ0eS5nZXRQb3NzaWJsZVN0YW5k YXJkTmFtZVtsb3dlckNhc2VkXSA9IHByb3BOYW1lOworICAgICAgfQorCisgICAgICBpZiAoRE9N QXR0cmlidXRlTmFtZXMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7CisgICAgICAgIHZhciBh dHRyaWJ1dGVOYW1lID0gRE9NQXR0cmlidXRlTmFtZXNbcHJvcE5hbWVdOworICAgICAgICBwcm9w ZXJ0eUluZm8uYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5hbWU7CisgICAgICAgIGlmICgiZGV2 ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICAgICBET01Qcm9wZXJ0eS5nZXRQ b3NzaWJsZVN0YW5kYXJkTmFtZVthdHRyaWJ1dGVOYW1lXSA9IHByb3BOYW1lOworICAgICAgICB9 CisgICAgICB9CisKKyAgICAgIGlmIChET01BdHRyaWJ1dGVOYW1lc3BhY2VzLmhhc093blByb3Bl cnR5KHByb3BOYW1lKSkgeworICAgICAgICBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZXNwYWNl ID0gRE9NQXR0cmlidXRlTmFtZXNwYWNlc1twcm9wTmFtZV07CisgICAgICB9CisKKyAgICAgIGlm IChET01Qcm9wZXJ0eU5hbWVzLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkgeworICAgICAgICBw cm9wZXJ0eUluZm8ucHJvcGVydHlOYW1lID0gRE9NUHJvcGVydHlOYW1lc1twcm9wTmFtZV07Cisg ICAgICB9CisKKyAgICAgIGlmIChET01NdXRhdGlvbk1ldGhvZHMuaGFzT3duUHJvcGVydHkocHJv cE5hbWUpKSB7CisgICAgICAgIHByb3BlcnR5SW5mby5tdXRhdGlvbk1ldGhvZCA9IERPTU11dGF0 aW9uTWV0aG9kc1twcm9wTmFtZV07CisgICAgICB9CisKKyAgICAgIERPTVByb3BlcnR5LnByb3Bl cnRpZXNbcHJvcE5hbWVdID0gcHJvcGVydHlJbmZvOworICAgIH0KKyAgfQorfTsKKworLyogZXNs aW50LWRpc2FibGUgbWF4LWxlbiAqLwordmFyIEFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIgPSAn OkEtWl9hLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyRkZcXHUw MzcwLVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZc XHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZG RkQnOworLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuICovCisKKy8qKgorICogRE9NUHJvcGVydHkg ZXhwb3J0cyBsb29rdXAgb2JqZWN0cyB0aGF0IGNhbiBiZSB1c2VkIGxpa2UgZnVuY3Rpb25zOgor ICoKKyAqICAgPiBET01Qcm9wZXJ0eS5pc1ZhbGlkWydpZCddCisgKiAgIHRydWUKKyAqICAgPiBE T01Qcm9wZXJ0eS5pc1ZhbGlkWydmb29iYXInXQorICogICB1bmRlZmluZWQKKyAqCisgKiBBbHRo b3VnaCB0aGlzIG1heSBiZSBjb25mdXNpbmcsIGl0IHBlcmZvcm1zIGJldHRlciBpbiBnZW5lcmFs LgorICoKKyAqIEBzZWUgaHR0cDovL2pzcGVyZi5jb20va2V5LWV4aXN0cworICogQHNlZSBodHRw Oi8vanNwZXJmLmNvbS9rZXktbWlzc2luZworICovCit2YXIgRE9NUHJvcGVydHkgPSB7CisKKyAg SURfQVRUUklCVVRFX05BTUU6ICdkYXRhLXJlYWN0aWQnLAorICBST09UX0FUVFJJQlVURV9OQU1F OiAnZGF0YS1yZWFjdHJvb3QnLAorCisgIEFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVI6IEFUVFJJ QlVURV9OQU1FX1NUQVJUX0NIQVIsCisgIEFUVFJJQlVURV9OQU1FX0NIQVI6IEFUVFJJQlVURV9O QU1FX1NUQVJUX0NIQVIgKyAnXFwtLjAtOVxcdTAwQjdcXHUwMzAwLVxcdTAzNkZcXHUyMDNGLVxc dTIwNDAnLAorCisgIC8qKgorICAgKiBNYXAgZnJvbSBwcm9wZXJ0eSAic3RhbmRhcmQgbmFtZSIg dG8gYW4gb2JqZWN0IHdpdGggaW5mbyBhYm91dCBob3cgdG8gc2V0CisgICAqIHRoZSBwcm9wZXJ0 eSBpbiB0aGUgRE9NLiBFYWNoIG9iamVjdCBjb250YWluczoKKyAgICoKKyAgICogYXR0cmlidXRl TmFtZToKKyAgICogICBVc2VkIHdoZW4gcmVuZGVyaW5nIG1hcmt1cCBvciB3aXRoIGAqQXR0cmli dXRlKClgLgorICAgKiBhdHRyaWJ1dGVOYW1lc3BhY2UKKyAgICogcHJvcGVydHlOYW1lOgorICAg KiAgIFVzZWQgb24gRE9NIG5vZGUgaW5zdGFuY2VzLiAoVGhpcyBpbmNsdWRlcyBwcm9wZXJ0aWVz IHRoYXQgbXV0YXRlIGR1ZSB0bworICAgKiAgIGV4dGVybmFsIGZhY3RvcnMuKQorICAgKiBtdXRh dGlvbk1ldGhvZDoKKyAgICogICBJZiBub24tbnVsbCwgdXNlZCBpbnN0ZWFkIG9mIHRoZSBwcm9w ZXJ0eSBvciBgc2V0QXR0cmlidXRlKClgIGFmdGVyCisgICAqICAgaW5pdGlhbCByZW5kZXIuCisg ICAqIG11c3RVc2VQcm9wZXJ0eToKKyAgICogICBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBtdXN0IGJl IGFjY2Vzc2VkIGFuZCBtdXRhdGVkIGFzIGFuIG9iamVjdCBwcm9wZXJ0eS4KKyAgICogaGFzQm9v bGVhblZhbHVlOgorICAgKiAgIFdoZXRoZXIgdGhlIHByb3BlcnR5IHNob3VsZCBiZSByZW1vdmVk IHdoZW4gc2V0IHRvIGEgZmFsc2V5IHZhbHVlLgorICAgKiBoYXNOdW1lcmljVmFsdWU6CisgICAq ICAgV2hldGhlciB0aGUgcHJvcGVydHkgbXVzdCBiZSBudW1lcmljIG9yIHBhcnNlIGFzIGEgbnVt ZXJpYyBhbmQgc2hvdWxkIGJlCisgICAqICAgcmVtb3ZlZCB3aGVuIHNldCB0byBhIGZhbHNleSB2 YWx1ZS4KKyAgICogaGFzUG9zaXRpdmVOdW1lcmljVmFsdWU6CisgICAqICAgV2hldGhlciB0aGUg cHJvcGVydHkgbXVzdCBiZSBwb3NpdGl2ZSBudW1lcmljIG9yIHBhcnNlIGFzIGEgcG9zaXRpdmUK KyAgICogICBudW1lcmljIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIHNldCB0byBhIGZhbHNl eSB2YWx1ZS4KKyAgICogaGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZToKKyAgICogICBXaGV0aGVy IHRoZSBwcm9wZXJ0eSBjYW4gYmUgdXNlZCBhcyBhIGZsYWcgYXMgd2VsbCBhcyB3aXRoIGEgdmFs dWUuCisgICAqICAgUmVtb3ZlZCB3aGVuIHN0cmljdGx5IGVxdWFsIHRvIGZhbHNlOyBwcmVzZW50 IHdpdGhvdXQgYSB2YWx1ZSB3aGVuCisgICAqICAgc3RyaWN0bHkgZXF1YWwgdG8gdHJ1ZTsgcHJl c2VudCB3aXRoIGEgdmFsdWUgb3RoZXJ3aXNlLgorICAgKi8KKyAgcHJvcGVydGllczoge30sCisK KyAgLyoqCisgICAqIE1hcHBpbmcgZnJvbSBsb3dlcmNhc2UgcHJvcGVydHkgbmFtZXMgdG8gdGhl IHByb3Blcmx5IGNhc2VkIHZlcnNpb24sIHVzZWQKKyAgICogdG8gd2FybiBpbiB0aGUgY2FzZSBv ZiBtaXNzaW5nIHByb3BlcnRpZXMuIEF2YWlsYWJsZSBvbmx5IGluIF9fREVWX18uCisgICAqCisg ICAqIGF1dG9mb2N1cyBpcyBwcmVkZWZpbmVkLCBiZWNhdXNlIGFkZGluZyBpdCB0byB0aGUgcHJv cGVydHkgd2hpdGVsaXN0CisgICAqIGNhdXNlcyB1bmludGVuZGVkIHNpZGUgZWZmZWN0cy4KKyAg ICoKKyAgICogQHR5cGUge09iamVjdH0KKyAgICovCisgIGdldFBvc3NpYmxlU3RhbmRhcmROYW1l OiAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB7IGF1dG9mb2N1czogJ2F1dG9Gb2N1 cycgfSA6IG51bGwsCisKKyAgLyoqCisgICAqIEFsbCBvZiB0aGUgaXNDdXN0b21BdHRyaWJ1dGUo KSBmdW5jdGlvbnMgdGhhdCBoYXZlIGJlZW4gaW5qZWN0ZWQuCisgICAqLworICBfaXNDdXN0b21B dHRyaWJ1dGVGdW5jdGlvbnM6IFtdLAorCisgIC8qKgorICAgKiBDaGVja3Mgd2hldGhlciBhIHBy b3BlcnR5IG5hbWUgaXMgYSBjdXN0b20gYXR0cmlidXRlLgorICAgKiBAbWV0aG9kCisgICAqLwor ICBpc0N1c3RvbUF0dHJpYnV0ZTogZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHsKKyAgICBmb3Ig KHZhciBpID0gMDsgaSA8IERPTVByb3BlcnR5Ll9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9ucy5s ZW5ndGg7IGkrKykgeworICAgICAgdmFyIGlzQ3VzdG9tQXR0cmlidXRlRm4gPSBET01Qcm9wZXJ0 eS5faXNDdXN0b21BdHRyaWJ1dGVGdW5jdGlvbnNbaV07CisgICAgICBpZiAoaXNDdXN0b21BdHRy aWJ1dGVGbihhdHRyaWJ1dGVOYW1lKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0K KyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9LAorCisgIGluamVjdGlvbjogRE9NUHJvcGVy dHlJbmplY3Rpb24KK307CisKK21vZHVsZS5leHBvcnRzID0gRE9NUHJvcGVydHk7Cit9LHsiMTE2 IjoxMTYsIjE0MCI6MTQwfV0sMTI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpewor LyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJp Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVy IHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0 aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFu dAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBp biB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIERP TVByb3BlcnR5ID0gX2RlcmVxXygxMSk7Cit2YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gX2Rl cmVxXygzMik7Cit2YXIgUmVhY3RJbnN0cnVtZW50YXRpb24gPSBfZGVyZXFfKDU5KTsKKwordmFy IHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyID0gX2RlcmVxXygxMTUpOwordmFyIHdhcm5p bmcgPSBfZGVyZXFfKDE0Nyk7CisKK3ZhciBWQUxJRF9BVFRSSUJVVEVfTkFNRV9SRUdFWCA9IG5l dyBSZWdFeHAoJ15bJyArIERPTVByb3BlcnR5LkFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIgKyAn XVsnICsgRE9NUHJvcGVydHkuQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTsKK3ZhciBpbGxl Z2FsQXR0cmlidXRlTmFtZUNhY2hlID0ge307Cit2YXIgdmFsaWRhdGVkQXR0cmlidXRlTmFtZUNh Y2hlID0ge307CisKK2Z1bmN0aW9uIGlzQXR0cmlidXRlTmFtZVNhZmUoYXR0cmlidXRlTmFtZSkg eworICBpZiAodmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlLmhhc093blByb3BlcnR5KGF0dHJp YnV0ZU5hbWUpKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgaWYgKGlsbGVnYWxBdHRyaWJ1 dGVOYW1lQ2FjaGUuaGFzT3duUHJvcGVydHkoYXR0cmlidXRlTmFtZSkpIHsKKyAgICByZXR1cm4g ZmFsc2U7CisgIH0KKyAgaWYgKFZBTElEX0FUVFJJQlVURV9OQU1FX1JFR0VYLnRlc3QoYXR0cmli dXRlTmFtZSkpIHsKKyAgICB2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGVbYXR0cmlidXRlTmFt ZV0gPSB0cnVlOworICAgIHJldHVybiB0cnVlOworICB9CisgIGlsbGVnYWxBdHRyaWJ1dGVOYW1l Q2FjaGVbYXR0cmlidXRlTmFtZV0gPSB0cnVlOworICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVj dGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnSW52YWxpZCBhdHRyaWJ1dGUgbmFtZTogYCVzYCcsIGF0 dHJpYnV0ZU5hbWUpIDogdm9pZCAwOworICByZXR1cm4gZmFsc2U7Cit9CisKK2Z1bmN0aW9uIHNo b3VsZElnbm9yZVZhbHVlKHByb3BlcnR5SW5mbywgdmFsdWUpIHsKKyAgcmV0dXJuIHZhbHVlID09 IG51bGwgfHwgcHJvcGVydHlJbmZvLmhhc0Jvb2xlYW5WYWx1ZSAmJiAhdmFsdWUgfHwgcHJvcGVy dHlJbmZvLmhhc051bWVyaWNWYWx1ZSAmJiBpc05hTih2YWx1ZSkgfHwgcHJvcGVydHlJbmZvLmhh c1Bvc2l0aXZlTnVtZXJpY1ZhbHVlICYmIHZhbHVlIDwgMSB8fCBwcm9wZXJ0eUluZm8uaGFzT3Zl cmxvYWRlZEJvb2xlYW5WYWx1ZSAmJiB2YWx1ZSA9PT0gZmFsc2U7Cit9CisKKy8qKgorICogT3Bl cmF0aW9ucyBmb3IgZGVhbGluZyB3aXRoIERPTSBwcm9wZXJ0aWVzLgorICovCit2YXIgRE9NUHJv cGVydHlPcGVyYXRpb25zID0geworCisgIC8qKgorICAgKiBDcmVhdGVzIG1hcmt1cCBmb3IgdGhl IElEIHByb3BlcnR5LgorICAgKgorICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVW5lc2NhcGVkIElE LgorICAgKiBAcmV0dXJuIHtzdHJpbmd9IE1hcmt1cCBzdHJpbmcuCisgICAqLworICBjcmVhdGVN YXJrdXBGb3JJRDogZnVuY3Rpb24gKGlkKSB7CisgICAgcmV0dXJuIERPTVByb3BlcnR5LklEX0FU VFJJQlVURV9OQU1FICsgJz0nICsgcXVvdGVBdHRyaWJ1dGVWYWx1ZUZvckJyb3dzZXIoaWQpOwor ICB9LAorCisgIHNldEF0dHJpYnV0ZUZvcklEOiBmdW5jdGlvbiAobm9kZSwgaWQpIHsKKyAgICBu b2RlLnNldEF0dHJpYnV0ZShET01Qcm9wZXJ0eS5JRF9BVFRSSUJVVEVfTkFNRSwgaWQpOworICB9 LAorCisgIGNyZWF0ZU1hcmt1cEZvclJvb3Q6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gRE9N UHJvcGVydHkuUk9PVF9BVFRSSUJVVEVfTkFNRSArICc9IiInOworICB9LAorCisgIHNldEF0dHJp YnV0ZUZvclJvb3Q6IGZ1bmN0aW9uIChub2RlKSB7CisgICAgbm9kZS5zZXRBdHRyaWJ1dGUoRE9N UHJvcGVydHkuUk9PVF9BVFRSSUJVVEVfTkFNRSwgJycpOworICB9LAorCisgIC8qKgorICAgKiBD cmVhdGVzIG1hcmt1cCBmb3IgYSBwcm9wZXJ0eS4KKyAgICoKKyAgICogQHBhcmFtIHtzdHJpbmd9 IG5hbWUKKyAgICogQHBhcmFtIHsqfSB2YWx1ZQorICAgKiBAcmV0dXJuIHs/c3RyaW5nfSBNYXJr dXAgc3RyaW5nLCBvciBudWxsIGlmIHRoZSBwcm9wZXJ0eSB3YXMgaW52YWxpZC4KKyAgICovCisg IGNyZWF0ZU1hcmt1cEZvclByb3BlcnR5OiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHsKKyAgICB2 YXIgcHJvcGVydHlJbmZvID0gRE9NUHJvcGVydHkucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShu YW1lKSA/IERPTVByb3BlcnR5LnByb3BlcnRpZXNbbmFtZV0gOiBudWxsOworICAgIGlmIChwcm9w ZXJ0eUluZm8pIHsKKyAgICAgIGlmIChzaG91bGRJZ25vcmVWYWx1ZShwcm9wZXJ0eUluZm8sIHZh bHVlKSkgeworICAgICAgICByZXR1cm4gJyc7CisgICAgICB9CisgICAgICB2YXIgYXR0cmlidXRl TmFtZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lOworICAgICAgaWYgKHByb3BlcnR5SW5m by5oYXNCb29sZWFuVmFsdWUgfHwgcHJvcGVydHlJbmZvLmhhc092ZXJsb2FkZWRCb29sZWFuVmFs dWUgJiYgdmFsdWUgPT09IHRydWUpIHsKKyAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZU5hbWUgKyAn PSIiJzsKKyAgICAgIH0KKyAgICAgIHJldHVybiBhdHRyaWJ1dGVOYW1lICsgJz0nICsgcXVvdGVB dHRyaWJ1dGVWYWx1ZUZvckJyb3dzZXIodmFsdWUpOworICAgIH0gZWxzZSBpZiAoRE9NUHJvcGVy dHkuaXNDdXN0b21BdHRyaWJ1dGUobmFtZSkpIHsKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7 CisgICAgICAgIHJldHVybiAnJzsKKyAgICAgIH0KKyAgICAgIHJldHVybiBuYW1lICsgJz0nICsg cXVvdGVBdHRyaWJ1dGVWYWx1ZUZvckJyb3dzZXIodmFsdWUpOworICAgIH0KKyAgICByZXR1cm4g bnVsbDsKKyAgfSwKKworICAvKioKKyAgICogQ3JlYXRlcyBtYXJrdXAgZm9yIGEgY3VzdG9tIHBy b3BlcnR5LgorICAgKgorICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZQorICAgKiBAcGFyYW0geyp9 IHZhbHVlCisgICAqIEByZXR1cm4ge3N0cmluZ30gTWFya3VwIHN0cmluZywgb3IgZW1wdHkgc3Ry aW5nIGlmIHRoZSBwcm9wZXJ0eSB3YXMgaW52YWxpZC4KKyAgICovCisgIGNyZWF0ZU1hcmt1cEZv ckN1c3RvbUF0dHJpYnV0ZTogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7CisgICAgaWYgKCFpc0F0 dHJpYnV0ZU5hbWVTYWZlKG5hbWUpIHx8IHZhbHVlID09IG51bGwpIHsKKyAgICAgIHJldHVybiAn JzsKKyAgICB9CisgICAgcmV0dXJuIG5hbWUgKyAnPScgKyBxdW90ZUF0dHJpYnV0ZVZhbHVlRm9y QnJvd3Nlcih2YWx1ZSk7CisgIH0sCisKKyAgLyoqCisgICAqIFNldHMgdGhlIHZhbHVlIGZvciBh IHByb3BlcnR5IG9uIGEgbm9kZS4KKyAgICoKKyAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2Rl CisgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCisgICAqIEBwYXJhbSB7Kn0gdmFsdWUKKyAgICov CisgIHNldFZhbHVlRm9yUHJvcGVydHk6IGZ1bmN0aW9uIChub2RlLCBuYW1lLCB2YWx1ZSkgewor ICAgIHZhciBwcm9wZXJ0eUluZm8gPSBET01Qcm9wZXJ0eS5wcm9wZXJ0aWVzLmhhc093blByb3Bl cnR5KG5hbWUpID8gRE9NUHJvcGVydHkucHJvcGVydGllc1tuYW1lXSA6IG51bGw7CisgICAgaWYg KHByb3BlcnR5SW5mbykgeworICAgICAgdmFyIG11dGF0aW9uTWV0aG9kID0gcHJvcGVydHlJbmZv Lm11dGF0aW9uTWV0aG9kOworICAgICAgaWYgKG11dGF0aW9uTWV0aG9kKSB7CisgICAgICAgIG11 dGF0aW9uTWV0aG9kKG5vZGUsIHZhbHVlKTsKKyAgICAgIH0gZWxzZSBpZiAoc2hvdWxkSWdub3Jl VmFsdWUocHJvcGVydHlJbmZvLCB2YWx1ZSkpIHsKKyAgICAgICAgdGhpcy5kZWxldGVWYWx1ZUZv clByb3BlcnR5KG5vZGUsIG5hbWUpOworICAgICAgICByZXR1cm47CisgICAgICB9IGVsc2UgaWYg KHByb3BlcnR5SW5mby5tdXN0VXNlUHJvcGVydHkpIHsKKyAgICAgICAgLy8gQ29udHJhcnkgdG8g YHNldEF0dHJpYnV0ZWAsIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBwcm9wZXJseQorICAgICAgICAv LyBgdG9TdHJpbmdgZWQgYnkgSUU4LzkuCisgICAgICAgIG5vZGVbcHJvcGVydHlJbmZvLnByb3Bl cnR5TmFtZV0gPSB2YWx1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhciBhdHRyaWJ1dGVO YW1lID0gcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWU7CisgICAgICAgIHZhciBuYW1lc3BhY2Ug PSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZXNwYWNlOworICAgICAgICAvLyBgc2V0QXR0cmli dXRlYCB3aXRoIG9iamVjdHMgYmVjb21lcyBvbmx5IGBbb2JqZWN0XWAgaW4gSUU4LzksCisgICAg ICAgIC8vICgnJyArIHZhbHVlKSBtYWtlcyBpdCBvdXRwdXQgdGhlIGNvcnJlY3QgdG9TdHJpbmco KS12YWx1ZS4KKyAgICAgICAgaWYgKG5hbWVzcGFjZSkgeworICAgICAgICAgIG5vZGUuc2V0QXR0 cmlidXRlTlMobmFtZXNwYWNlLCBhdHRyaWJ1dGVOYW1lLCAnJyArIHZhbHVlKTsKKyAgICAgICAg fSBlbHNlIGlmIChwcm9wZXJ0eUluZm8uaGFzQm9vbGVhblZhbHVlIHx8IHByb3BlcnR5SW5mby5o YXNPdmVybG9hZGVkQm9vbGVhblZhbHVlICYmIHZhbHVlID09PSB0cnVlKSB7CisgICAgICAgICAg bm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgJycpOworICAgICAgICB9IGVsc2Ugewor ICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsICcnICsgdmFsdWUpOwor ICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChET01Qcm9wZXJ0eS5pc0N1c3RvbUF0 dHJpYnV0ZShuYW1lKSkgeworICAgICAgRE9NUHJvcGVydHlPcGVyYXRpb25zLnNldFZhbHVlRm9y QXR0cmlidXRlKG5vZGUsIG5hbWUsIHZhbHVlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAg ICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICB2YXIgcGF5bG9h ZCA9IHt9OworICAgICAgcGF5bG9hZFtuYW1lXSA9IHZhbHVlOworICAgICAgUmVhY3RJbnN0cnVt ZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7CisgICAgICAgIGluc3RhbmNlSUQ6 IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpLl9kZWJ1Z0lE LAorICAgICAgICB0eXBlOiAndXBkYXRlIGF0dHJpYnV0ZScsCisgICAgICAgIHBheWxvYWQ6IHBh eWxvYWQKKyAgICAgIH0pOworICAgIH0KKyAgfSwKKworICBzZXRWYWx1ZUZvckF0dHJpYnV0ZTog ZnVuY3Rpb24gKG5vZGUsIG5hbWUsIHZhbHVlKSB7CisgICAgaWYgKCFpc0F0dHJpYnV0ZU5hbWVT YWZlKG5hbWUpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICh2YWx1ZSA9PSBudWxs KSB7CisgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKKyAgICB9IGVsc2UgeworICAg ICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgJycgKyB2YWx1ZSk7CisgICAgfQorCisgICAgaWYg KCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgdmFyIHBheWxvYWQgPSB7 fTsKKyAgICAgIHBheWxvYWRbbmFtZV0gPSB2YWx1ZTsKKyAgICAgIFJlYWN0SW5zdHJ1bWVudGF0 aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oeworICAgICAgICBpbnN0YW5jZUlEOiBSZWFj dERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShub2RlKS5fZGVidWdJRCwKKyAg ICAgICAgdHlwZTogJ3VwZGF0ZSBhdHRyaWJ1dGUnLAorICAgICAgICBwYXlsb2FkOiBwYXlsb2Fk CisgICAgICB9KTsKKyAgICB9CisgIH0sCisKKyAgLyoqCisgICAqIERlbGV0ZXMgYW4gYXR0cmli dXRlcyBmcm9tIGEgbm9kZS4KKyAgICoKKyAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlCisg ICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCisgICAqLworICBkZWxldGVWYWx1ZUZvckF0dHJpYnV0 ZTogZnVuY3Rpb24gKG5vZGUsIG5hbWUpIHsKKyAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1l KTsKKyAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICBSZWFj dEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHsKKyAgICAgICAgaW5z dGFuY2VJRDogUmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUobm9kZSku X2RlYnVnSUQsCisgICAgICAgIHR5cGU6ICdyZW1vdmUgYXR0cmlidXRlJywKKyAgICAgICAgcGF5 bG9hZDogbmFtZQorICAgICAgfSk7CisgICAgfQorICB9LAorCisgIC8qKgorICAgKiBEZWxldGVz IHRoZSB2YWx1ZSBmb3IgYSBwcm9wZXJ0eSBvbiBhIG5vZGUuCisgICAqCisgICAqIEBwYXJhbSB7 RE9NRWxlbWVudH0gbm9kZQorICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZQorICAgKi8KKyAgZGVs ZXRlVmFsdWVGb3JQcm9wZXJ0eTogZnVuY3Rpb24gKG5vZGUsIG5hbWUpIHsKKyAgICB2YXIgcHJv cGVydHlJbmZvID0gRE9NUHJvcGVydHkucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/ IERPTVByb3BlcnR5LnByb3BlcnRpZXNbbmFtZV0gOiBudWxsOworICAgIGlmIChwcm9wZXJ0eUlu Zm8pIHsKKyAgICAgIHZhciBtdXRhdGlvbk1ldGhvZCA9IHByb3BlcnR5SW5mby5tdXRhdGlvbk1l dGhvZDsKKyAgICAgIGlmIChtdXRhdGlvbk1ldGhvZCkgeworICAgICAgICBtdXRhdGlvbk1ldGhv ZChub2RlLCB1bmRlZmluZWQpOworICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eUluZm8ubXVzdFVz ZVByb3BlcnR5KSB7CisgICAgICAgIHZhciBwcm9wTmFtZSA9IHByb3BlcnR5SW5mby5wcm9wZXJ0 eU5hbWU7CisgICAgICAgIGlmIChwcm9wZXJ0eUluZm8uaGFzQm9vbGVhblZhbHVlKSB7CisgICAg ICAgICAgbm9kZVtwcm9wTmFtZV0gPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg ICBub2RlW3Byb3BOYW1lXSA9ICcnOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAg ICBub2RlLnJlbW92ZUF0dHJpYnV0ZShwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZSk7CisgICAg ICB9CisgICAgfSBlbHNlIGlmIChET01Qcm9wZXJ0eS5pc0N1c3RvbUF0dHJpYnV0ZShuYW1lKSkg eworICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgfQorCisgICAgaWYgKCJk ZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgUmVhY3RJbnN0cnVtZW50YXRp b24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7CisgICAgICAgIGluc3RhbmNlSUQ6IFJlYWN0 RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpLl9kZWJ1Z0lELAorICAg ICAgICB0eXBlOiAncmVtb3ZlIGF0dHJpYnV0ZScsCisgICAgICAgIHBheWxvYWQ6IG5hbWUKKyAg ICAgIH0pOworICAgIH0KKyAgfQorCit9OworCittb2R1bGUuZXhwb3J0cyA9IERPTVByb3BlcnR5 T3BlcmF0aW9uczsKK30seyIxMSI6MTEsIjExNSI6MTE1LCIxNDciOjE0NywiMzIiOjMyLCI1OSI6 NTl9XSwxMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHly aWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVk LgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHls ZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVj dG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRl bnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRp cmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX3Byb2RJbnZhcmlhbnQg PSBfZGVyZXFfKDExNik7CisKK3ZhciBET01MYXp5VHJlZSA9IF9kZXJlcV8oOSk7Cit2YXIgRXhl Y3V0aW9uRW52aXJvbm1lbnQgPSBfZGVyZXFfKDEyNik7CisKK3ZhciBjcmVhdGVOb2Rlc0Zyb21N YXJrdXAgPSBfZGVyZXFfKDEzMSk7Cit2YXIgZW1wdHlGdW5jdGlvbiA9IF9kZXJlcV8oMTMyKTsK K3ZhciBpbnZhcmlhbnQgPSBfZGVyZXFfKDE0MCk7CisKK3ZhciBEYW5nZXIgPSB7CisKKyAgLyoq CisgICAqIFJlcGxhY2VzIGEgbm9kZSB3aXRoIGEgc3RyaW5nIG9mIG1hcmt1cCBhdCBpdHMgY3Vy cmVudCBwb3NpdGlvbiB3aXRoaW4gaXRzCisgICAqIHBhcmVudC4gVGhlIG1hcmt1cCBtdXN0IHJl bmRlciBpbnRvIGEgc2luZ2xlIHJvb3Qgbm9kZS4KKyAgICoKKyAgICogQHBhcmFtIHtET01FbGVt ZW50fSBvbGRDaGlsZCBDaGlsZCBub2RlIHRvIHJlcGxhY2UuCisgICAqIEBwYXJhbSB7c3RyaW5n fSBtYXJrdXAgTWFya3VwIHRvIHJlbmRlciBpbiBwbGFjZSBvZiB0aGUgY2hpbGQgbm9kZS4KKyAg ICogQGludGVybmFsCisgICAqLworICBkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cDog ZnVuY3Rpb24gKG9sZENoaWxkLCBtYXJrdXApIHsKKyAgICAhRXhlY3V0aW9uRW52aXJvbm1lbnQu Y2FuVXNlRE9NID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZh bHNlLCAnZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXAoLi4uKTogQ2Fubm90IHJlbmRl ciBtYXJrdXAgaW4gYSB3b3JrZXIgdGhyZWFkLiBNYWtlIHN1cmUgYHdpbmRvd2AgYW5kIGBkb2N1 bWVudGAgYXJlIGF2YWlsYWJsZSBnbG9iYWxseSBiZWZvcmUgcmVxdWlyaW5nIFJlYWN0IHdoZW4g dW5pdCB0ZXN0aW5nIG9yIHVzZSBSZWFjdERPTVNlcnZlci5yZW5kZXJUb1N0cmluZygpIGZvciBz ZXJ2ZXIgcmVuZGVyaW5nLicpIDogX3Byb2RJbnZhcmlhbnQoJzU2JykgOiB2b2lkIDA7CisgICAg IW1hcmt1cCA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxz ZSwgJ2Rhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwKC4uLik6IE1pc3NpbmcgbWFya3Vw LicpIDogX3Byb2RJbnZhcmlhbnQoJzU3JykgOiB2b2lkIDA7CisgICAgIShvbGRDaGlsZC5ub2Rl TmFtZSAhPT0gJ0hUTUwnKSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFy aWFudChmYWxzZSwgJ2Rhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwKC4uLik6IENhbm5v dCByZXBsYWNlIG1hcmt1cCBvZiB0aGUgPGh0bWw+IG5vZGUuIFRoaXMgaXMgYmVjYXVzZSBicm93 c2VyIHF1aXJrcyBtYWtlIHRoaXMgdW5yZWxpYWJsZSBhbmQvb3Igc2xvdy4gSWYgeW91IHdhbnQg dG8gcmVuZGVyIHRvIHRoZSByb290IHlvdSBtdXN0IHVzZSBzZXJ2ZXIgcmVuZGVyaW5nLiBTZWUg UmVhY3RET01TZXJ2ZXIucmVuZGVyVG9TdHJpbmcoKS4nKSA6IF9wcm9kSW52YXJpYW50KCc1OCcp IDogdm9pZCAwOworCisgICAgaWYgKHR5cGVvZiBtYXJrdXAgPT09ICdzdHJpbmcnKSB7CisgICAg ICB2YXIgbmV3Q2hpbGQgPSBjcmVhdGVOb2Rlc0Zyb21NYXJrdXAobWFya3VwLCBlbXB0eUZ1bmN0 aW9uKVswXTsKKyAgICAgIG9sZENoaWxkLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5ld0NoaWxk LCBvbGRDaGlsZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIERPTUxhenlUcmVlLnJlcGxhY2VDaGls ZFdpdGhUcmVlKG9sZENoaWxkLCBtYXJrdXApOworICAgIH0KKyAgfQorCit9OworCittb2R1bGUu ZXhwb3J0cyA9IERhbmdlcjsKK30seyIxMTYiOjExNiwiMTI2IjoxMjYsIjEzMSI6MTMxLCIxMzIi OjEzMiwiMTQwIjoxNDAsIjkiOjl9XSwxNDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0 cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBB bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQg dW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxl IGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFs IGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBm aWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCisv KioKKyAqIE1vZHVsZSB0aGF0IGlzIGluamVjdGFibGUgaW50byBgRXZlbnRQbHVnaW5IdWJgLCB0 aGF0IHNwZWNpZmllcyBhCisgKiBkZXRlcm1pbmlzdGljIG9yZGVyaW5nIG9mIGBFdmVudFBsdWdp bmBzLiBBIGNvbnZlbmllbnQgd2F5IHRvIHJlYXNvbiBhYm91dAorICogcGx1Z2lucywgd2l0aG91 dCBoYXZpbmcgdG8gcGFja2FnZSBldmVyeSBvbmUgb2YgdGhlbS4gVGhpcyBpcyBiZXR0ZXIgdGhh bgorICogaGF2aW5nIHBsdWdpbnMgYmUgb3JkZXJlZCBpbiB0aGUgc2FtZSBvcmRlciB0aGF0IHRo ZXkgYXJlIGluamVjdGVkIGJlY2F1c2UKKyAqIHRoYXQgb3JkZXJpbmcgd291bGQgYmUgaW5mbHVl bmNlZCBieSB0aGUgcGFja2FnaW5nIG9yZGVyLgorICogYFJlc3BvbmRlckV2ZW50UGx1Z2luYCBt dXN0IG9jY3VyIGJlZm9yZSBgU2ltcGxlRXZlbnRQbHVnaW5gIHNvIHRoYXQKKyAqIHByZXZlbnRp bmcgZGVmYXVsdCBvbiBldmVudHMgaXMgY29udmVuaWVudCBpbiBgU2ltcGxlRXZlbnRQbHVnaW5g IGhhbmRsZXJzLgorICovCisKK3ZhciBEZWZhdWx0RXZlbnRQbHVnaW5PcmRlciA9IFsnUmVzcG9u ZGVyRXZlbnRQbHVnaW4nLCAnU2ltcGxlRXZlbnRQbHVnaW4nLCAnVGFwRXZlbnRQbHVnaW4nLCAn RW50ZXJMZWF2ZUV2ZW50UGx1Z2luJywgJ0NoYW5nZUV2ZW50UGx1Z2luJywgJ1NlbGVjdEV2ZW50 UGx1Z2luJywgJ0JlZm9yZUlucHV0RXZlbnRQbHVnaW4nXTsKKworbW9kdWxlLmV4cG9ydHMgPSBE ZWZhdWx0RXZlbnRQbHVnaW5PcmRlcjsKK30se31dLDE1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVs ZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIElu Yy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBs aWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNF TlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFk ZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQ QVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmlj dCc7CisKK3ZhciBFdmVudFByb3BhZ2F0b3JzID0gX2RlcmVxXygxOSk7Cit2YXIgUmVhY3RET01D b21wb25lbnRUcmVlID0gX2RlcmVxXygzMik7Cit2YXIgU3ludGhldGljTW91c2VFdmVudCA9IF9k ZXJlcV8oODgpOworCit2YXIgZXZlbnRUeXBlcyA9IHsKKyAgbW91c2VFbnRlcjogeworICAgIHJl Z2lzdHJhdGlvbk5hbWU6ICdvbk1vdXNlRW50ZXInLAorICAgIGRlcGVuZGVuY2llczogWyd0b3BN b3VzZU91dCcsICd0b3BNb3VzZU92ZXInXQorICB9LAorICBtb3VzZUxlYXZlOiB7CisgICAgcmVn aXN0cmF0aW9uTmFtZTogJ29uTW91c2VMZWF2ZScsCisgICAgZGVwZW5kZW5jaWVzOiBbJ3RvcE1v dXNlT3V0JywgJ3RvcE1vdXNlT3ZlciddCisgIH0KK307CisKK3ZhciBFbnRlckxlYXZlRXZlbnRQ bHVnaW4gPSB7CisKKyAgZXZlbnRUeXBlczogZXZlbnRUeXBlcywKKworICAvKioKKyAgICogRm9y IGFsbW9zdCBldmVyeSBpbnRlcmFjdGlvbiB3ZSBjYXJlIGFib3V0LCB0aGVyZSB3aWxsIGJlIGJv dGggYSB0b3AtbGV2ZWwKKyAgICogYG1vdXNlb3ZlcmAgYW5kIGBtb3VzZW91dGAgZXZlbnQgdGhh dCBvY2N1cnMuIE9ubHkgdXNlIGBtb3VzZW91dGAgc28gdGhhdAorICAgKiB3ZSBkbyBub3QgZXh0 cmFjdCBkdXBsaWNhdGUgZXZlbnRzLiBIb3dldmVyLCBtb3ZpbmcgdGhlIG1vdXNlIGludG8gdGhl CisgICAqIGJyb3dzZXIgZnJvbSBvdXRzaWRlIHdpbGwgbm90IGZpcmUgYSBgbW91c2VvdXRgIGV2 ZW50LiBJbiB0aGlzIGNhc2UsIHdlIHVzZQorICAgKiB0aGUgYG1vdXNlb3ZlcmAgdG9wLWxldmVs IGV2ZW50LgorICAgKi8KKyAgZXh0cmFjdEV2ZW50czogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwg dGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7CisgICAgaWYgKHRv cExldmVsVHlwZSA9PT0gJ3RvcE1vdXNlT3ZlcicgJiYgKG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJn ZXQgfHwgbmF0aXZlRXZlbnQuZnJvbUVsZW1lbnQpKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAg ICB9CisgICAgaWYgKHRvcExldmVsVHlwZSAhPT0gJ3RvcE1vdXNlT3V0JyAmJiB0b3BMZXZlbFR5 cGUgIT09ICd0b3BNb3VzZU92ZXInKSB7CisgICAgICAvLyBNdXN0IG5vdCBiZSBhIG1vdXNlIGlu IG9yIG1vdXNlIG91dCAtIGlnbm9yaW5nLgorICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisg ICAgdmFyIHdpbjsKKyAgICBpZiAobmF0aXZlRXZlbnRUYXJnZXQud2luZG93ID09PSBuYXRpdmVF dmVudFRhcmdldCkgeworICAgICAgLy8gYG5hdGl2ZUV2ZW50VGFyZ2V0YCBpcyBwcm9iYWJseSBh IHdpbmRvdyBvYmplY3QuCisgICAgICB3aW4gPSBuYXRpdmVFdmVudFRhcmdldDsKKyAgICB9IGVs c2UgeworICAgICAgLy8gVE9ETzogRmlndXJlIG91dCB3aHkgYG93bmVyRG9jdW1lbnRgIGlzIHNv bWV0aW1lcyB1bmRlZmluZWQgaW4gSUU4LgorICAgICAgdmFyIGRvYyA9IG5hdGl2ZUV2ZW50VGFy Z2V0Lm93bmVyRG9jdW1lbnQ7CisgICAgICBpZiAoZG9jKSB7CisgICAgICAgIHdpbiA9IGRvYy5k ZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93OworICAgICAgfSBlbHNlIHsKKyAgICAgICAg d2luID0gd2luZG93OworICAgICAgfQorICAgIH0KKworICAgIHZhciBmcm9tOworICAgIHZhciB0 bzsKKyAgICBpZiAodG9wTGV2ZWxUeXBlID09PSAndG9wTW91c2VPdXQnKSB7CisgICAgICBmcm9t ID0gdGFyZ2V0SW5zdDsKKyAgICAgIHZhciByZWxhdGVkID0gbmF0aXZlRXZlbnQucmVsYXRlZFRh cmdldCB8fCBuYXRpdmVFdmVudC50b0VsZW1lbnQ7CisgICAgICB0byA9IHJlbGF0ZWQgPyBSZWFj dERPTUNvbXBvbmVudFRyZWUuZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUocmVsYXRlZCkgOiBu dWxsOworICAgIH0gZWxzZSB7CisgICAgICAvLyBNb3ZpbmcgdG8gYSBub2RlIGZyb20gb3V0c2lk ZSB0aGUgd2luZG93LgorICAgICAgZnJvbSA9IG51bGw7CisgICAgICB0byA9IHRhcmdldEluc3Q7 CisgICAgfQorCisgICAgaWYgKGZyb20gPT09IHRvKSB7CisgICAgICAvLyBOb3RoaW5nIHBlcnRh aW5zIHRvIG91ciBtYW5hZ2VkIGNvbXBvbmVudHMuCisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9 CisKKyAgICB2YXIgZnJvbU5vZGUgPSBmcm9tID09IG51bGwgPyB3aW4gOiBSZWFjdERPTUNvbXBv bmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShmcm9tKTsKKyAgICB2YXIgdG9Ob2RlID0gdG8g PT0gbnVsbCA/IHdpbiA6IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNl KHRvKTsKKworICAgIHZhciBsZWF2ZSA9IFN5bnRoZXRpY01vdXNlRXZlbnQuZ2V0UG9vbGVkKGV2 ZW50VHlwZXMubW91c2VMZWF2ZSwgZnJvbSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0 KTsKKyAgICBsZWF2ZS50eXBlID0gJ21vdXNlbGVhdmUnOworICAgIGxlYXZlLnRhcmdldCA9IGZy b21Ob2RlOworICAgIGxlYXZlLnJlbGF0ZWRUYXJnZXQgPSB0b05vZGU7CisKKyAgICB2YXIgZW50 ZXIgPSBTeW50aGV0aWNNb3VzZUV2ZW50LmdldFBvb2xlZChldmVudFR5cGVzLm1vdXNlRW50ZXIs IHRvLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpOworICAgIGVudGVyLnR5cGUgPSAn bW91c2VlbnRlcic7CisgICAgZW50ZXIudGFyZ2V0ID0gdG9Ob2RlOworICAgIGVudGVyLnJlbGF0 ZWRUYXJnZXQgPSBmcm9tTm9kZTsKKworICAgIEV2ZW50UHJvcGFnYXRvcnMuYWNjdW11bGF0ZUVu dGVyTGVhdmVEaXNwYXRjaGVzKGxlYXZlLCBlbnRlciwgZnJvbSwgdG8pOworCisgICAgcmV0dXJu IFtsZWF2ZSwgZW50ZXJdOworICB9CisKK307CisKK21vZHVsZS5leHBvcnRzID0gRW50ZXJMZWF2 ZUV2ZW50UGx1Z2luOworfSx7IjE5IjoxOSwiMzIiOjMyLCI4OCI6ODh9XSwxNjpbZnVuY3Rpb24o X2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQs IEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291 cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGlu IHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJj ZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBm b3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8K KworJ3VzZSBzdHJpY3QnOworCit2YXIgX3Byb2RJbnZhcmlhbnQgPSBfZGVyZXFfKDExNik7CisK K3ZhciBFdmVudFBsdWdpblJlZ2lzdHJ5ID0gX2RlcmVxXygxNyk7Cit2YXIgRXZlbnRQbHVnaW5V dGlscyA9IF9kZXJlcV8oMTgpOwordmFyIFJlYWN0RXJyb3JVdGlscyA9IF9kZXJlcV8oNTApOwor Cit2YXIgYWNjdW11bGF0ZUludG8gPSBfZGVyZXFfKDk1KTsKK3ZhciBmb3JFYWNoQWNjdW11bGF0 ZWQgPSBfZGVyZXFfKDEwMik7Cit2YXIgaW52YXJpYW50ID0gX2RlcmVxXygxNDApOworCisvKioK KyAqIEludGVybmFsIHN0b3JlIGZvciBldmVudCBsaXN0ZW5lcnMKKyAqLwordmFyIGxpc3RlbmVy QmFuayA9IHt9OworCisvKioKKyAqIEludGVybmFsIHF1ZXVlIG9mIGV2ZW50cyB0aGF0IGhhdmUg YWNjdW11bGF0ZWQgdGhlaXIgZGlzcGF0Y2hlcyBhbmQgYXJlCisgKiB3YWl0aW5nIHRvIGhhdmUg dGhlaXIgZGlzcGF0Y2hlcyBleGVjdXRlZC4KKyAqLwordmFyIGV2ZW50UXVldWUgPSBudWxsOwor CisvKioKKyAqIERpc3BhdGNoZXMgYW4gZXZlbnQgYW5kIHJlbGVhc2VzIGl0IGJhY2sgaW50byB0 aGUgcG9vbCwgdW5sZXNzIHBlcnNpc3RlbnQuCisgKgorICogQHBhcmFtIHs/b2JqZWN0fSBldmVu dCBTeW50aGV0aWMgZXZlbnQgdG8gYmUgZGlzcGF0Y2hlZC4KKyAqIEBwYXJhbSB7Ym9vbGVhbn0g c2ltdWxhdGVkIElmIHRoZSBldmVudCBpcyBzaW11bGF0ZWQgKGNoYW5nZXMgZXhuIGJlaGF2aW9y KQorICogQHByaXZhdGUKKyAqLwordmFyIGV4ZWN1dGVEaXNwYXRjaGVzQW5kUmVsZWFzZSA9IGZ1 bmN0aW9uIChldmVudCwgc2ltdWxhdGVkKSB7CisgIGlmIChldmVudCkgeworICAgIEV2ZW50UGx1 Z2luVXRpbHMuZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyKGV2ZW50LCBzaW11bGF0ZWQpOworCisg ICAgaWYgKCFldmVudC5pc1BlcnNpc3RlbnQoKSkgeworICAgICAgZXZlbnQuY29uc3RydWN0b3Iu cmVsZWFzZShldmVudCk7CisgICAgfQorICB9Cit9OwordmFyIGV4ZWN1dGVEaXNwYXRjaGVzQW5k UmVsZWFzZVNpbXVsYXRlZCA9IGZ1bmN0aW9uIChlKSB7CisgIHJldHVybiBleGVjdXRlRGlzcGF0 Y2hlc0FuZFJlbGVhc2UoZSwgdHJ1ZSk7Cit9OwordmFyIGV4ZWN1dGVEaXNwYXRjaGVzQW5kUmVs ZWFzZVRvcExldmVsID0gZnVuY3Rpb24gKGUpIHsKKyAgcmV0dXJuIGV4ZWN1dGVEaXNwYXRjaGVz QW5kUmVsZWFzZShlLCBmYWxzZSk7Cit9OworCit2YXIgZ2V0RGljdGlvbmFyeUtleSA9IGZ1bmN0 aW9uIChpbnN0KSB7CisgIC8vIFByZXZlbnRzIFY4IHBlcmZvcm1hbmNlIGlzc3VlOgorICAvLyBo dHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC83MjMyCisgIHJldHVybiAnLicg KyBpbnN0Ll9yb290Tm9kZUlEOworfTsKKworZnVuY3Rpb24gaXNJbnRlcmFjdGl2ZSh0YWcpIHsK KyAgcmV0dXJuIHRhZyA9PT0gJ2J1dHRvbicgfHwgdGFnID09PSAnaW5wdXQnIHx8IHRhZyA9PT0g J3NlbGVjdCcgfHwgdGFnID09PSAndGV4dGFyZWEnOworfQorCitmdW5jdGlvbiBzaG91bGRQcmV2 ZW50TW91c2VFdmVudChuYW1lLCB0eXBlLCBwcm9wcykgeworICBzd2l0Y2ggKG5hbWUpIHsKKyAg ICBjYXNlICdvbkNsaWNrJzoKKyAgICBjYXNlICdvbkNsaWNrQ2FwdHVyZSc6CisgICAgY2FzZSAn b25Eb3VibGVDbGljayc6CisgICAgY2FzZSAnb25Eb3VibGVDbGlja0NhcHR1cmUnOgorICAgIGNh c2UgJ29uTW91c2VEb3duJzoKKyAgICBjYXNlICdvbk1vdXNlRG93bkNhcHR1cmUnOgorICAgIGNh c2UgJ29uTW91c2VNb3ZlJzoKKyAgICBjYXNlICdvbk1vdXNlTW92ZUNhcHR1cmUnOgorICAgIGNh c2UgJ29uTW91c2VVcCc6CisgICAgY2FzZSAnb25Nb3VzZVVwQ2FwdHVyZSc6CisgICAgICByZXR1 cm4gISEocHJvcHMuZGlzYWJsZWQgJiYgaXNJbnRlcmFjdGl2ZSh0eXBlKSk7CisgICAgZGVmYXVs dDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCisvKioKKyAqIFRoaXMgaXMgYSB1bmlm aWVkIGludGVyZmFjZSBmb3IgZXZlbnQgcGx1Z2lucyB0byBiZSBpbnN0YWxsZWQgYW5kIGNvbmZp Z3VyZWQuCisgKgorICogRXZlbnQgcGx1Z2lucyBjYW4gaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcg cHJvcGVydGllczoKKyAqCisgKiAgIGBleHRyYWN0RXZlbnRzYCB7ZnVuY3Rpb24oc3RyaW5nLCBE T01FdmVudFRhcmdldCwgc3RyaW5nLCBvYmplY3QpOiAqfQorICogICAgIFJlcXVpcmVkLiBXaGVu IGEgdG9wLWxldmVsIGV2ZW50IGlzIGZpcmVkLCB0aGlzIG1ldGhvZCBpcyBleHBlY3RlZCB0bwor ICogICAgIGV4dHJhY3Qgc3ludGhldGljIGV2ZW50cyB0aGF0IHdpbGwgaW4gdHVybiBiZSBxdWV1 ZWQgYW5kIGRpc3BhdGNoZWQuCisgKgorICogICBgZXZlbnRUeXBlc2Age29iamVjdH0KKyAqICAg ICBPcHRpb25hbCwgcGx1Z2lucyB0aGF0IGZpcmUgZXZlbnRzIG11c3QgcHVibGlzaCBhIG1hcHBp bmcgb2YgcmVnaXN0cmF0aW9uCisgKiAgICAgbmFtZXMgdGhhdCBhcmUgdXNlZCB0byByZWdpc3Rl ciBsaXN0ZW5lcnMuIFZhbHVlcyBvZiB0aGlzIG1hcHBpbmcgbXVzdAorICogICAgIGJlIG9iamVj dHMgdGhhdCBjb250YWluIGByZWdpc3RyYXRpb25OYW1lYCBvciBgcGhhc2VkUmVnaXN0cmF0aW9u TmFtZXNgLgorICoKKyAqICAgYGV4ZWN1dGVEaXNwYXRjaGAge2Z1bmN0aW9uKG9iamVjdCwgZnVu Y3Rpb24sIHN0cmluZyl9CisgKiAgICAgT3B0aW9uYWwsIGFsbG93cyBwbHVnaW5zIHRvIG92ZXJy aWRlIGhvdyBhbiBldmVudCBnZXRzIGRpc3BhdGNoZWQuIEJ5CisgKiAgICAgZGVmYXVsdCwgdGhl IGxpc3RlbmVyIGlzIHNpbXBseSBpbnZva2VkLgorICoKKyAqIEVhY2ggcGx1Z2luIHRoYXQgaXMg aW5qZWN0ZWQgaW50byBgRXZlbnRzUGx1Z2luSHViYCBpcyBpbW1lZGlhdGVseSBvcGVyYWJsZS4K KyAqCisgKiBAcHVibGljCisgKi8KK3ZhciBFdmVudFBsdWdpbkh1YiA9IHsKKworICAvKioKKyAg ICogTWV0aG9kcyBmb3IgaW5qZWN0aW5nIGRlcGVuZGVuY2llcy4KKyAgICovCisgIGluamVjdGlv bjogeworCisgICAgLyoqCisgICAgICogQHBhcmFtIHthcnJheX0gSW5qZWN0ZWRFdmVudFBsdWdp bk9yZGVyCisgICAgICogQHB1YmxpYworICAgICAqLworICAgIGluamVjdEV2ZW50UGx1Z2luT3Jk ZXI6IEV2ZW50UGx1Z2luUmVnaXN0cnkuaW5qZWN0RXZlbnRQbHVnaW5PcmRlciwKKworICAgIC8q KgorICAgICAqIEBwYXJhbSB7b2JqZWN0fSBpbmplY3RlZE5hbWVzVG9QbHVnaW5zIE1hcCBmcm9t IG5hbWVzIHRvIHBsdWdpbiBtb2R1bGVzLgorICAgICAqLworICAgIGluamVjdEV2ZW50UGx1Z2lu c0J5TmFtZTogRXZlbnRQbHVnaW5SZWdpc3RyeS5pbmplY3RFdmVudFBsdWdpbnNCeU5hbWUKKwor ICB9LAorCisgIC8qKgorICAgKiBTdG9yZXMgYGxpc3RlbmVyYCBhdCBgbGlzdGVuZXJCYW5rW3Jl Z2lzdHJhdGlvbk5hbWVdW2tleV1gLiBJcyBpZGVtcG90ZW50LgorICAgKgorICAgKiBAcGFyYW0g e29iamVjdH0gaW5zdCBUaGUgaW5zdGFuY2UsIHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2YgZXZlbnRz LgorICAgKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uTmFtZSBOYW1lIG9mIGxpc3RlbmVy IChlLmcuIGBvbkNsaWNrYCkuCisgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyIFRoZSBj YWxsYmFjayB0byBzdG9yZS4KKyAgICovCisgIHB1dExpc3RlbmVyOiBmdW5jdGlvbiAoaW5zdCwg cmVnaXN0cmF0aW9uTmFtZSwgbGlzdGVuZXIpIHsKKyAgICAhKHR5cGVvZiBsaXN0ZW5lciA9PT0g J2Z1bmN0aW9uJykgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQo ZmFsc2UsICdFeHBlY3RlZCAlcyBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdv dCB0eXBlICVzJywgcmVnaXN0cmF0aW9uTmFtZSwgdHlwZW9mIGxpc3RlbmVyKSA6IF9wcm9kSW52 YXJpYW50KCc5NCcsIHJlZ2lzdHJhdGlvbk5hbWUsIHR5cGVvZiBsaXN0ZW5lcikgOiB2b2lkIDA7 CisKKyAgICB2YXIga2V5ID0gZ2V0RGljdGlvbmFyeUtleShpbnN0KTsKKyAgICB2YXIgYmFua0Zv clJlZ2lzdHJhdGlvbk5hbWUgPSBsaXN0ZW5lckJhbmtbcmVnaXN0cmF0aW9uTmFtZV0gfHwgKGxp c3RlbmVyQmFua1tyZWdpc3RyYXRpb25OYW1lXSA9IHt9KTsKKyAgICBiYW5rRm9yUmVnaXN0cmF0 aW9uTmFtZVtrZXldID0gbGlzdGVuZXI7CisKKyAgICB2YXIgUGx1Z2luTW9kdWxlID0gRXZlbnRQ bHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tyZWdpc3RyYXRpb25OYW1lXTsK KyAgICBpZiAoUGx1Z2luTW9kdWxlICYmIFBsdWdpbk1vZHVsZS5kaWRQdXRMaXN0ZW5lcikgewor ICAgICAgUGx1Z2luTW9kdWxlLmRpZFB1dExpc3RlbmVyKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUs IGxpc3RlbmVyKTsKKyAgICB9CisgIH0sCisKKyAgLyoqCisgICAqIEBwYXJhbSB7b2JqZWN0fSBp bnN0IFRoZSBpbnN0YW5jZSwgd2hpY2ggaXMgdGhlIHNvdXJjZSBvZiBldmVudHMuCisgICAqIEBw YXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb25OYW1lIE5hbWUgb2YgbGlzdGVuZXIgKGUuZy4gYG9u Q2xpY2tgKS4KKyAgICogQHJldHVybiB7P2Z1bmN0aW9ufSBUaGUgc3RvcmVkIGNhbGxiYWNrLgor ICAgKi8KKyAgZ2V0TGlzdGVuZXI6IGZ1bmN0aW9uIChpbnN0LCByZWdpc3RyYXRpb25OYW1lKSB7 CisgICAgLy8gVE9ETzogc2hvdWxkUHJldmVudE1vdXNlRXZlbnQgaXMgRE9NLXNwZWNpZmljIGFu ZCBkZWZpbml0ZWx5IHNob3VsZCBub3QKKyAgICAvLyBsaXZlIGhlcmU7IG5lZWRzIHRvIGJlIG1v dmVkIHRvIGEgYmV0dGVyIHBsYWNlIHNvb24KKyAgICB2YXIgYmFua0ZvclJlZ2lzdHJhdGlvbk5h bWUgPSBsaXN0ZW5lckJhbmtbcmVnaXN0cmF0aW9uTmFtZV07CisgICAgaWYgKHNob3VsZFByZXZl bnRNb3VzZUV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGluc3QuX2N1cnJlbnRFbGVtZW50LnR5cGUs IGluc3QuX2N1cnJlbnRFbGVtZW50LnByb3BzKSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAg fQorICAgIHZhciBrZXkgPSBnZXREaWN0aW9uYXJ5S2V5KGluc3QpOworICAgIHJldHVybiBiYW5r Rm9yUmVnaXN0cmF0aW9uTmFtZSAmJiBiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZVtrZXldOworICB9 LAorCisgIC8qKgorICAgKiBEZWxldGVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgcmVnaXN0cmF0aW9u IGJhbmsuCisgICAqCisgICAqIEBwYXJhbSB7b2JqZWN0fSBpbnN0IFRoZSBpbnN0YW5jZSwgd2hp Y2ggaXMgdGhlIHNvdXJjZSBvZiBldmVudHMuCisgICAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3Ry YXRpb25OYW1lIE5hbWUgb2YgbGlzdGVuZXIgKGUuZy4gYG9uQ2xpY2tgKS4KKyAgICovCisgIGRl bGV0ZUxpc3RlbmVyOiBmdW5jdGlvbiAoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSkgeworICAgIHZh ciBQbHVnaW5Nb2R1bGUgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVNb2R1 bGVzW3JlZ2lzdHJhdGlvbk5hbWVdOworICAgIGlmIChQbHVnaW5Nb2R1bGUgJiYgUGx1Z2luTW9k dWxlLndpbGxEZWxldGVMaXN0ZW5lcikgeworICAgICAgUGx1Z2luTW9kdWxlLndpbGxEZWxldGVM aXN0ZW5lcihpbnN0LCByZWdpc3RyYXRpb25OYW1lKTsKKyAgICB9CisKKyAgICB2YXIgYmFua0Zv clJlZ2lzdHJhdGlvbk5hbWUgPSBsaXN0ZW5lckJhbmtbcmVnaXN0cmF0aW9uTmFtZV07CisgICAg Ly8gVE9ETzogVGhpcyBzaG91bGQgbmV2ZXIgYmUgbnVsbCAtLSB3aGVuIGlzIGl0PworICAgIGlm IChiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZSkgeworICAgICAgdmFyIGtleSA9IGdldERpY3Rpb25h cnlLZXkoaW5zdCk7CisgICAgICBkZWxldGUgYmFua0ZvclJlZ2lzdHJhdGlvbk5hbWVba2V5XTsK KyAgICB9CisgIH0sCisKKyAgLyoqCisgICAqIERlbGV0ZXMgYWxsIGxpc3RlbmVycyBmb3IgdGhl IERPTSBlbGVtZW50IHdpdGggdGhlIHN1cHBsaWVkIElELgorICAgKgorICAgKiBAcGFyYW0ge29i amVjdH0gaW5zdCBUaGUgaW5zdGFuY2UsIHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2YgZXZlbnRzLgor ICAgKi8KKyAgZGVsZXRlQWxsTGlzdGVuZXJzOiBmdW5jdGlvbiAoaW5zdCkgeworICAgIHZhciBr ZXkgPSBnZXREaWN0aW9uYXJ5S2V5KGluc3QpOworICAgIGZvciAodmFyIHJlZ2lzdHJhdGlvbk5h bWUgaW4gbGlzdGVuZXJCYW5rKSB7CisgICAgICBpZiAoIWxpc3RlbmVyQmFuay5oYXNPd25Qcm9w ZXJ0eShyZWdpc3RyYXRpb25OYW1lKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKwor ICAgICAgaWYgKCFsaXN0ZW5lckJhbmtbcmVnaXN0cmF0aW9uTmFtZV1ba2V5XSkgeworICAgICAg ICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgdmFyIFBsdWdpbk1vZHVsZSA9IEV2ZW50UGx1 Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbcmVnaXN0cmF0aW9uTmFtZV07Cisg ICAgICBpZiAoUGx1Z2luTW9kdWxlICYmIFBsdWdpbk1vZHVsZS53aWxsRGVsZXRlTGlzdGVuZXIp IHsKKyAgICAgICAgUGx1Z2luTW9kdWxlLndpbGxEZWxldGVMaXN0ZW5lcihpbnN0LCByZWdpc3Ry YXRpb25OYW1lKTsKKyAgICAgIH0KKworICAgICAgZGVsZXRlIGxpc3RlbmVyQmFua1tyZWdpc3Ry YXRpb25OYW1lXVtrZXldOworICAgIH0KKyAgfSwKKworICAvKioKKyAgICogQWxsb3dzIHJlZ2lz dGVyZWQgcGx1Z2lucyBhbiBvcHBvcnR1bml0eSB0byBleHRyYWN0IGV2ZW50cyBmcm9tIHRvcC1s ZXZlbAorICAgKiBuYXRpdmUgYnJvd3NlciBldmVudHMuCisgICAqCisgICAqIEByZXR1cm4geyp9 IEFuIGFjY3VtdWxhdGlvbiBvZiBzeW50aGV0aWMgZXZlbnRzLgorICAgKiBAaW50ZXJuYWwKKyAg ICovCisgIGV4dHJhY3RFdmVudHM6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3Qs IG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkgeworICAgIHZhciBldmVudHM7CisgICAg dmFyIHBsdWdpbnMgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LnBsdWdpbnM7CisgICAgZm9yICh2YXIg aSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAvLyBOb3QgZXZlcnkgcGx1 Z2luIGluIHRoZSBvcmRlcmluZyBtYXkgYmUgbG9hZGVkIGF0IHJ1bnRpbWUuCisgICAgICB2YXIg cG9zc2libGVQbHVnaW4gPSBwbHVnaW5zW2ldOworICAgICAgaWYgKHBvc3NpYmxlUGx1Z2luKSB7 CisgICAgICAgIHZhciBleHRyYWN0ZWRFdmVudHMgPSBwb3NzaWJsZVBsdWdpbi5leHRyYWN0RXZl bnRzKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFy Z2V0KTsKKyAgICAgICAgaWYgKGV4dHJhY3RlZEV2ZW50cykgeworICAgICAgICAgIGV2ZW50cyA9 IGFjY3VtdWxhdGVJbnRvKGV2ZW50cywgZXh0cmFjdGVkRXZlbnRzKTsKKyAgICAgICAgfQorICAg ICAgfQorICAgIH0KKyAgICByZXR1cm4gZXZlbnRzOworICB9LAorCisgIC8qKgorICAgKiBFbnF1 ZXVlcyBhIHN5bnRoZXRpYyBldmVudCB0aGF0IHNob3VsZCBiZSBkaXNwYXRjaGVkIHdoZW4KKyAg ICogYHByb2Nlc3NFdmVudFF1ZXVlYCBpcyBpbnZva2VkLgorICAgKgorICAgKiBAcGFyYW0geyp9 IGV2ZW50cyBBbiBhY2N1bXVsYXRpb24gb2Ygc3ludGhldGljIGV2ZW50cy4KKyAgICogQGludGVy bmFsCisgICAqLworICBlbnF1ZXVlRXZlbnRzOiBmdW5jdGlvbiAoZXZlbnRzKSB7CisgICAgaWYg KGV2ZW50cykgeworICAgICAgZXZlbnRRdWV1ZSA9IGFjY3VtdWxhdGVJbnRvKGV2ZW50UXVldWUs IGV2ZW50cyk7CisgICAgfQorICB9LAorCisgIC8qKgorICAgKiBEaXNwYXRjaGVzIGFsbCBzeW50 aGV0aWMgZXZlbnRzIG9uIHRoZSBldmVudCBxdWV1ZS4KKyAgICoKKyAgICogQGludGVybmFsCisg ICAqLworICBwcm9jZXNzRXZlbnRRdWV1ZTogZnVuY3Rpb24gKHNpbXVsYXRlZCkgeworICAgIC8v IFNldCBgZXZlbnRRdWV1ZWAgdG8gbnVsbCBiZWZvcmUgcHJvY2Vzc2luZyBpdCBzbyB0aGF0IHdl IGNhbiB0ZWxsIGlmIG1vcmUKKyAgICAvLyBldmVudHMgZ2V0IGVucXVldWVkIHdoaWxlIHByb2Nl c3NpbmcuCisgICAgdmFyIHByb2Nlc3NpbmdFdmVudFF1ZXVlID0gZXZlbnRRdWV1ZTsKKyAgICBl dmVudFF1ZXVlID0gbnVsbDsKKyAgICBpZiAoc2ltdWxhdGVkKSB7CisgICAgICBmb3JFYWNoQWNj dW11bGF0ZWQocHJvY2Vzc2luZ0V2ZW50UXVldWUsIGV4ZWN1dGVEaXNwYXRjaGVzQW5kUmVsZWFz ZVNpbXVsYXRlZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvckVhY2hBY2N1bXVsYXRlZChwcm9j ZXNzaW5nRXZlbnRRdWV1ZSwgZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlVG9wTGV2ZWwpOwor ICAgIH0KKyAgICAhIWV2ZW50UXVldWUgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicg PyBpbnZhcmlhbnQoZmFsc2UsICdwcm9jZXNzRXZlbnRRdWV1ZSgpOiBBZGRpdGlvbmFsIGV2ZW50 cyB3ZXJlIGVucXVldWVkIHdoaWxlIHByb2Nlc3NpbmcgYW4gZXZlbnQgcXVldWUuIFN1cHBvcnQg Zm9yIHRoaXMgaGFzIG5vdCB5ZXQgYmVlbiBpbXBsZW1lbnRlZC4nKSA6IF9wcm9kSW52YXJpYW50 KCc5NScpIDogdm9pZCAwOworICAgIC8vIFRoaXMgd291bGQgYmUgYSBnb29kIHRpbWUgdG8gcmV0 aHJvdyBpZiBhbnkgb2YgdGhlIGV2ZW50IGhhbmRsZXJzIHRocmV3LgorICAgIFJlYWN0RXJyb3JV dGlscy5yZXRocm93Q2F1Z2h0RXJyb3IoKTsKKyAgfSwKKworICAvKioKKyAgICogVGhlc2UgYXJl IG5lZWRlZCBmb3IgdGVzdHMgb25seS4gRG8gbm90IHVzZSEKKyAgICovCisgIF9fcHVyZ2U6IGZ1 bmN0aW9uICgpIHsKKyAgICBsaXN0ZW5lckJhbmsgPSB7fTsKKyAgfSwKKworICBfX2dldExpc3Rl bmVyQmFuazogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBsaXN0ZW5lckJhbms7CisgIH0KKwor fTsKKworbW9kdWxlLmV4cG9ydHMgPSBFdmVudFBsdWdpbkh1YjsKK30seyIxMDIiOjEwMiwiMTE2 IjoxMTYsIjE0MCI6MTQwLCIxNyI6MTcsIjE4IjoxOCwiNTAiOjUwLCI5NSI6OTV9XSwxNzpbZnVu Y3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXBy ZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRo aXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZv dW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlz IHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNh biBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAq CisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJvZEludmFyaWFudCA9IF9kZXJl cV8oMTE2KTsKKwordmFyIGludmFyaWFudCA9IF9kZXJlcV8oMTQwKTsKKworLyoqCisgKiBJbmpl Y3RhYmxlIG9yZGVyaW5nIG9mIGV2ZW50IHBsdWdpbnMuCisgKi8KK3ZhciBldmVudFBsdWdpbk9y ZGVyID0gbnVsbDsKKworLyoqCisgKiBJbmplY3RhYmxlIG1hcHBpbmcgZnJvbSBuYW1lcyB0byBl dmVudCBwbHVnaW4gbW9kdWxlcy4KKyAqLwordmFyIG5hbWVzVG9QbHVnaW5zID0ge307CisKKy8q KgorICogUmVjb21wdXRlcyB0aGUgcGx1Z2luIGxpc3QgdXNpbmcgdGhlIGluamVjdGVkIHBsdWdp bnMgYW5kIHBsdWdpbiBvcmRlcmluZy4KKyAqCisgKiBAcHJpdmF0ZQorICovCitmdW5jdGlvbiBy ZWNvbXB1dGVQbHVnaW5PcmRlcmluZygpIHsKKyAgaWYgKCFldmVudFBsdWdpbk9yZGVyKSB7Cisg ICAgLy8gV2FpdCB1bnRpbCBhbiBgZXZlbnRQbHVnaW5PcmRlcmAgaXMgaW5qZWN0ZWQuCisgICAg cmV0dXJuOworICB9CisgIGZvciAodmFyIHBsdWdpbk5hbWUgaW4gbmFtZXNUb1BsdWdpbnMpIHsK KyAgICB2YXIgcGx1Z2luTW9kdWxlID0gbmFtZXNUb1BsdWdpbnNbcGx1Z2luTmFtZV07CisgICAg dmFyIHBsdWdpbkluZGV4ID0gZXZlbnRQbHVnaW5PcmRlci5pbmRleE9mKHBsdWdpbk5hbWUpOwor ICAgICEocGx1Z2luSW5kZXggPiAtMSkgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicg PyBpbnZhcmlhbnQoZmFsc2UsICdFdmVudFBsdWdpblJlZ2lzdHJ5OiBDYW5ub3QgaW5qZWN0IGV2 ZW50IHBsdWdpbnMgdGhhdCBkbyBub3QgZXhpc3QgaW4gdGhlIHBsdWdpbiBvcmRlcmluZywgYCVz YC4nLCBwbHVnaW5OYW1lKSA6IF9wcm9kSW52YXJpYW50KCc5NicsIHBsdWdpbk5hbWUpIDogdm9p ZCAwOworICAgIGlmIChFdmVudFBsdWdpblJlZ2lzdHJ5LnBsdWdpbnNbcGx1Z2luSW5kZXhdKSB7 CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgIXBsdWdpbk1vZHVsZS5leHRyYWN0RXZlbnRz ID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXZl bnRQbHVnaW5SZWdpc3RyeTogRXZlbnQgcGx1Z2lucyBtdXN0IGltcGxlbWVudCBhbiBgZXh0cmFj dEV2ZW50c2AgbWV0aG9kLCBidXQgYCVzYCBkb2VzIG5vdC4nLCBwbHVnaW5OYW1lKSA6IF9wcm9k SW52YXJpYW50KCc5NycsIHBsdWdpbk5hbWUpIDogdm9pZCAwOworICAgIEV2ZW50UGx1Z2luUmVn aXN0cnkucGx1Z2luc1twbHVnaW5JbmRleF0gPSBwbHVnaW5Nb2R1bGU7CisgICAgdmFyIHB1Ymxp c2hlZEV2ZW50cyA9IHBsdWdpbk1vZHVsZS5ldmVudFR5cGVzOworICAgIGZvciAodmFyIGV2ZW50 TmFtZSBpbiBwdWJsaXNoZWRFdmVudHMpIHsKKyAgICAgICFwdWJsaXNoRXZlbnRGb3JQbHVnaW4o cHVibGlzaGVkRXZlbnRzW2V2ZW50TmFtZV0sIHBsdWdpbk1vZHVsZSwgZXZlbnROYW1lKSA/ICJk ZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V2ZW50UGx1 Z2luUmVnaXN0cnk6IEZhaWxlZCB0byBwdWJsaXNoIGV2ZW50IGAlc2AgZm9yIHBsdWdpbiBgJXNg LicsIGV2ZW50TmFtZSwgcGx1Z2luTmFtZSkgOiBfcHJvZEludmFyaWFudCgnOTgnLCBldmVudE5h bWUsIHBsdWdpbk5hbWUpIDogdm9pZCAwOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFB1Ymxp c2hlcyBhbiBldmVudCBzbyB0aGF0IGl0IGNhbiBiZSBkaXNwYXRjaGVkIGJ5IHRoZSBzdXBwbGll ZCBwbHVnaW4uCisgKgorICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIERpc3BhdGNo IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBldmVudC4KKyAqIEBwYXJhbSB7b2JqZWN0fSBQbHVnaW5N b2R1bGUgUGx1Z2luIHB1Ymxpc2hpbmcgdGhlIGV2ZW50LgorICogQHJldHVybiB7Ym9vbGVhbn0g VHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIHN1Y2Nlc3NmdWxseSBwdWJsaXNoZWQuCisgKiBAcHJpdmF0 ZQorICovCitmdW5jdGlvbiBwdWJsaXNoRXZlbnRGb3JQbHVnaW4oZGlzcGF0Y2hDb25maWcsIHBs dWdpbk1vZHVsZSwgZXZlbnROYW1lKSB7CisgICEhRXZlbnRQbHVnaW5SZWdpc3RyeS5ldmVudE5h bWVEaXNwYXRjaENvbmZpZ3MuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSA/ICJkZXZlbG9wbWVu dCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V2ZW50UGx1Z2luSHViOiBN b3JlIHRoYW4gb25lIHBsdWdpbiBhdHRlbXB0ZWQgdG8gcHVibGlzaCB0aGUgc2FtZSBldmVudCBu YW1lLCBgJXNgLicsIGV2ZW50TmFtZSkgOiBfcHJvZEludmFyaWFudCgnOTknLCBldmVudE5hbWUp IDogdm9pZCAwOworICBFdmVudFBsdWdpblJlZ2lzdHJ5LmV2ZW50TmFtZURpc3BhdGNoQ29uZmln c1tldmVudE5hbWVdID0gZGlzcGF0Y2hDb25maWc7CisKKyAgdmFyIHBoYXNlZFJlZ2lzdHJhdGlv bk5hbWVzID0gZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM7CisgIGlmIChw aGFzZWRSZWdpc3RyYXRpb25OYW1lcykgeworICAgIGZvciAodmFyIHBoYXNlTmFtZSBpbiBwaGFz ZWRSZWdpc3RyYXRpb25OYW1lcykgeworICAgICAgaWYgKHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVz Lmhhc093blByb3BlcnR5KHBoYXNlTmFtZSkpIHsKKyAgICAgICAgdmFyIHBoYXNlZFJlZ2lzdHJh dGlvbk5hbWUgPSBwaGFzZWRSZWdpc3RyYXRpb25OYW1lc1twaGFzZU5hbWVdOworICAgICAgICBw dWJsaXNoUmVnaXN0cmF0aW9uTmFtZShwaGFzZWRSZWdpc3RyYXRpb25OYW1lLCBwbHVnaW5Nb2R1 bGUsIGV2ZW50TmFtZSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9IGVs c2UgaWYgKGRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUpIHsKKyAgICBwdWJsaXNoUmVn aXN0cmF0aW9uTmFtZShkaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lLCBwbHVnaW5Nb2R1 bGUsIGV2ZW50TmFtZSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOwor fQorCisvKioKKyAqIFB1Ymxpc2hlcyBhIHJlZ2lzdHJhdGlvbiBuYW1lIHRoYXQgaXMgdXNlZCB0 byBpZGVudGlmeSBkaXNwYXRjaGVkIGV2ZW50cyBhbmQKKyAqIGNhbiBiZSB1c2VkIHdpdGggYEV2 ZW50UGx1Z2luSHViLnB1dExpc3RlbmVyYCB0byByZWdpc3RlciBsaXN0ZW5lcnMuCisgKgorICog QHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbk5hbWUgUmVnaXN0cmF0aW9uIG5hbWUgdG8gYWRk LgorICogQHBhcmFtIHtvYmplY3R9IFBsdWdpbk1vZHVsZSBQbHVnaW4gcHVibGlzaGluZyB0aGUg ZXZlbnQuCisgKiBAcHJpdmF0ZQorICovCitmdW5jdGlvbiBwdWJsaXNoUmVnaXN0cmF0aW9uTmFt ZShyZWdpc3RyYXRpb25OYW1lLCBwbHVnaW5Nb2R1bGUsIGV2ZW50TmFtZSkgeworICAhIUV2ZW50 UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbcmVnaXN0cmF0aW9uTmFtZV0g PyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFdmVu dFBsdWdpbkh1YjogTW9yZSB0aGFuIG9uZSBwbHVnaW4gYXR0ZW1wdGVkIHRvIHB1Ymxpc2ggdGhl IHNhbWUgcmVnaXN0cmF0aW9uIG5hbWUsIGAlc2AuJywgcmVnaXN0cmF0aW9uTmFtZSkgOiBfcHJv ZEludmFyaWFudCgnMTAwJywgcmVnaXN0cmF0aW9uTmFtZSkgOiB2b2lkIDA7CisgIEV2ZW50UGx1 Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbcmVnaXN0cmF0aW9uTmFtZV0gPSBw bHVnaW5Nb2R1bGU7CisgIEV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZURlcGVu ZGVuY2llc1tyZWdpc3RyYXRpb25OYW1lXSA9IHBsdWdpbk1vZHVsZS5ldmVudFR5cGVzW2V2ZW50 TmFtZV0uZGVwZW5kZW5jaWVzOworCisgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlv bicpIHsKKyAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSByZWdpc3RyYXRpb25OYW1lLnRvTG93ZXJD YXNlKCk7CisgICAgRXZlbnRQbHVnaW5SZWdpc3RyeS5wb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVz W2xvd2VyQ2FzZWROYW1lXSA9IHJlZ2lzdHJhdGlvbk5hbWU7CisKKyAgICBpZiAocmVnaXN0cmF0 aW9uTmFtZSA9PT0gJ29uRG91YmxlQ2xpY2snKSB7CisgICAgICBFdmVudFBsdWdpblJlZ2lzdHJ5 LnBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMub25kYmxjbGljayA9IHJlZ2lzdHJhdGlvbk5hbWU7 CisgICAgfQorICB9Cit9CisKKy8qKgorICogUmVnaXN0ZXJzIHBsdWdpbnMgc28gdGhhdCB0aGV5 IGNhbiBleHRyYWN0IGFuZCBkaXNwYXRjaCBldmVudHMuCisgKgorICogQHNlZSB7RXZlbnRQbHVn aW5IdWJ9CisgKi8KK3ZhciBFdmVudFBsdWdpblJlZ2lzdHJ5ID0geworCisgIC8qKgorICAgKiBP cmRlcmVkIGxpc3Qgb2YgaW5qZWN0ZWQgcGx1Z2lucy4KKyAgICovCisgIHBsdWdpbnM6IFtdLAor CisgIC8qKgorICAgKiBNYXBwaW5nIGZyb20gZXZlbnQgbmFtZSB0byBkaXNwYXRjaCBjb25maWcK KyAgICovCisgIGV2ZW50TmFtZURpc3BhdGNoQ29uZmlnczoge30sCisKKyAgLyoqCisgICAqIE1h cHBpbmcgZnJvbSByZWdpc3RyYXRpb24gbmFtZSB0byBwbHVnaW4gbW9kdWxlCisgICAqLworICBy ZWdpc3RyYXRpb25OYW1lTW9kdWxlczoge30sCisKKyAgLyoqCisgICAqIE1hcHBpbmcgZnJvbSBy ZWdpc3RyYXRpb24gbmFtZSB0byBldmVudCBuYW1lCisgICAqLworICByZWdpc3RyYXRpb25OYW1l RGVwZW5kZW5jaWVzOiB7fSwKKworICAvKioKKyAgICogTWFwcGluZyBmcm9tIGxvd2VyY2FzZSBy ZWdpc3RyYXRpb24gbmFtZXMgdG8gdGhlIHByb3Blcmx5IGNhc2VkIHZlcnNpb24sCisgICAqIHVz ZWQgdG8gd2FybiBpbiB0aGUgY2FzZSBvZiBtaXNzaW5nIGV2ZW50IGhhbmRsZXJzLiBBdmFpbGFi bGUKKyAgICogb25seSBpbiBfX0RFVl9fLgorICAgKiBAdHlwZSB7T2JqZWN0fQorICAgKi8KKyAg cG9zc2libGVSZWdpc3RyYXRpb25OYW1lczogImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24n ID8ge30gOiBudWxsLAorICAvLyBUcnVzdCB0aGUgZGV2ZWxvcGVyIHRvIG9ubHkgdXNlIHBvc3Np YmxlUmVnaXN0cmF0aW9uTmFtZXMgaW4gX19ERVZfXworCisgIC8qKgorICAgKiBJbmplY3RzIGFu IG9yZGVyaW5nIG9mIHBsdWdpbnMgKGJ5IHBsdWdpbiBuYW1lKS4gVGhpcyBhbGxvd3MgdGhlIG9y ZGVyaW5nCisgICAqIHRvIGJlIGRlY291cGxlZCBmcm9tIGluamVjdGlvbiBvZiB0aGUgYWN0dWFs IHBsdWdpbnMgc28gdGhhdCBvcmRlcmluZyBpcworICAgKiBhbHdheXMgZGV0ZXJtaW5pc3RpYyBy ZWdhcmRsZXNzIG9mIHBhY2thZ2luZywgb24tdGhlLWZseSBpbmplY3Rpb24sIGV0Yy4KKyAgICoK KyAgICogQHBhcmFtIHthcnJheX0gSW5qZWN0ZWRFdmVudFBsdWdpbk9yZGVyCisgICAqIEBpbnRl cm5hbAorICAgKiBAc2VlIHtFdmVudFBsdWdpbkh1Yi5pbmplY3Rpb24uaW5qZWN0RXZlbnRQbHVn aW5PcmRlcn0KKyAgICovCisgIGluamVjdEV2ZW50UGx1Z2luT3JkZXI6IGZ1bmN0aW9uIChpbmpl Y3RlZEV2ZW50UGx1Z2luT3JkZXIpIHsKKyAgICAhIWV2ZW50UGx1Z2luT3JkZXIgPyAiZGV2ZWxv cG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFdmVudFBsdWdpblJl Z2lzdHJ5OiBDYW5ub3QgaW5qZWN0IGV2ZW50IHBsdWdpbiBvcmRlcmluZyBtb3JlIHRoYW4gb25j ZS4gWW91IGFyZSBsaWtlbHkgdHJ5aW5nIHRvIGxvYWQgbW9yZSB0aGFuIG9uZSBjb3B5IG9mIFJl YWN0LicpIDogX3Byb2RJbnZhcmlhbnQoJzEwMScpIDogdm9pZCAwOworICAgIC8vIENsb25lIHRo ZSBvcmRlcmluZyBzbyBpdCBjYW5ub3QgYmUgZHluYW1pY2FsbHkgbXV0YXRlZC4KKyAgICBldmVu dFBsdWdpbk9yZGVyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoaW5qZWN0ZWRFdmVudFBs dWdpbk9yZGVyKTsKKyAgICByZWNvbXB1dGVQbHVnaW5PcmRlcmluZygpOworICB9LAorCisgIC8q KgorICAgKiBJbmplY3RzIHBsdWdpbnMgdG8gYmUgdXNlZCBieSBgRXZlbnRQbHVnaW5IdWJgLiBU aGUgcGx1Z2luIG5hbWVzIG11c3QgYmUKKyAgICogaW4gdGhlIG9yZGVyaW5nIGluamVjdGVkIGJ5 IGBpbmplY3RFdmVudFBsdWdpbk9yZGVyYC4KKyAgICoKKyAgICogUGx1Z2lucyBjYW4gYmUgaW5q ZWN0ZWQgYXMgcGFydCBvZiBwYWdlIGluaXRpYWxpemF0aW9uIG9yIG9uLXRoZS1mbHkuCisgICAq CisgICAqIEBwYXJhbSB7b2JqZWN0fSBpbmplY3RlZE5hbWVzVG9QbHVnaW5zIE1hcCBmcm9tIG5h bWVzIHRvIHBsdWdpbiBtb2R1bGVzLgorICAgKiBAaW50ZXJuYWwKKyAgICogQHNlZSB7RXZlbnRQ bHVnaW5IdWIuaW5qZWN0aW9uLmluamVjdEV2ZW50UGx1Z2luc0J5TmFtZX0KKyAgICovCisgIGlu amVjdEV2ZW50UGx1Z2luc0J5TmFtZTogZnVuY3Rpb24gKGluamVjdGVkTmFtZXNUb1BsdWdpbnMp IHsKKyAgICB2YXIgaXNPcmRlcmluZ0RpcnR5ID0gZmFsc2U7CisgICAgZm9yICh2YXIgcGx1Z2lu TmFtZSBpbiBpbmplY3RlZE5hbWVzVG9QbHVnaW5zKSB7CisgICAgICBpZiAoIWluamVjdGVkTmFt ZXNUb1BsdWdpbnMuaGFzT3duUHJvcGVydHkocGx1Z2luTmFtZSkpIHsKKyAgICAgICAgY29udGlu dWU7CisgICAgICB9CisgICAgICB2YXIgcGx1Z2luTW9kdWxlID0gaW5qZWN0ZWROYW1lc1RvUGx1 Z2luc1twbHVnaW5OYW1lXTsKKyAgICAgIGlmICghbmFtZXNUb1BsdWdpbnMuaGFzT3duUHJvcGVy dHkocGx1Z2luTmFtZSkgfHwgbmFtZXNUb1BsdWdpbnNbcGx1Z2luTmFtZV0gIT09IHBsdWdpbk1v ZHVsZSkgeworICAgICAgICAhIW5hbWVzVG9QbHVnaW5zW3BsdWdpbk5hbWVdID8gImRldmVsb3Bt ZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXZlbnRQbHVnaW5SZWdp c3RyeTogQ2Fubm90IGluamVjdCB0d28gZGlmZmVyZW50IGV2ZW50IHBsdWdpbnMgdXNpbmcgdGhl IHNhbWUgbmFtZSwgYCVzYC4nLCBwbHVnaW5OYW1lKSA6IF9wcm9kSW52YXJpYW50KCcxMDInLCBw bHVnaW5OYW1lKSA6IHZvaWQgMDsKKyAgICAgICAgbmFtZXNUb1BsdWdpbnNbcGx1Z2luTmFtZV0g PSBwbHVnaW5Nb2R1bGU7CisgICAgICAgIGlzT3JkZXJpbmdEaXJ0eSA9IHRydWU7CisgICAgICB9 CisgICAgfQorICAgIGlmIChpc09yZGVyaW5nRGlydHkpIHsKKyAgICAgIHJlY29tcHV0ZVBsdWdp bk9yZGVyaW5nKCk7CisgICAgfQorICB9LAorCisgIC8qKgorICAgKiBMb29rcyB1cCB0aGUgcGx1 Z2luIGZvciB0aGUgc3VwcGxpZWQgZXZlbnQuCisgICAqCisgICAqIEBwYXJhbSB7b2JqZWN0fSBl dmVudCBBIHN5bnRoZXRpYyBldmVudC4KKyAgICogQHJldHVybiB7P29iamVjdH0gVGhlIHBsdWdp biB0aGF0IGNyZWF0ZWQgdGhlIHN1cHBsaWVkIGV2ZW50LgorICAgKiBAaW50ZXJuYWwKKyAgICov CisgIGdldFBsdWdpbk1vZHVsZUZvckV2ZW50OiBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICB2YXIg ZGlzcGF0Y2hDb25maWcgPSBldmVudC5kaXNwYXRjaENvbmZpZzsKKyAgICBpZiAoZGlzcGF0Y2hD b25maWcucmVnaXN0cmF0aW9uTmFtZSkgeworICAgICAgcmV0dXJuIEV2ZW50UGx1Z2luUmVnaXN0 cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbZGlzcGF0Y2hDb25maWcucmVnaXN0cmF0aW9uTmFt ZV0gfHwgbnVsbDsKKyAgICB9CisgICAgaWYgKGRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJh dGlvbk5hbWVzICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIC8vIHB1bGxpbmcgcGhhc2VkUmVnaXN0 cmF0aW9uTmFtZXMgb3V0IG9mIGRpc3BhdGNoQ29uZmlnIGhlbHBzIEZsb3cgc2VlCisgICAgICAv LyB0aGF0IGl0IGlzIG5vdCB1bmRlZmluZWQuCisgICAgICB2YXIgcGhhc2VkUmVnaXN0cmF0aW9u TmFtZXMgPSBkaXNwYXRjaENvbmZpZy5waGFzZWRSZWdpc3RyYXRpb25OYW1lczsKKworICAgICAg Zm9yICh2YXIgcGhhc2UgaW4gcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMpIHsKKyAgICAgICAgaWYg KCFwaGFzZWRSZWdpc3RyYXRpb25OYW1lcy5oYXNPd25Qcm9wZXJ0eShwaGFzZSkpIHsKKyAgICAg ICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB2YXIgcGx1Z2luTW9kdWxlID0gRXZl bnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1twaGFzZWRSZWdpc3RyYXRp b25OYW1lc1twaGFzZV1dOworICAgICAgICBpZiAocGx1Z2luTW9kdWxlKSB7CisgICAgICAgICAg cmV0dXJuIHBsdWdpbk1vZHVsZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1 cm4gbnVsbDsKKyAgfSwKKworICAvKioKKyAgICogRXhwb3NlZCBmb3IgdW5pdCB0ZXN0aW5nLgor ICAgKiBAcHJpdmF0ZQorICAgKi8KKyAgX3Jlc2V0RXZlbnRQbHVnaW5zOiBmdW5jdGlvbiAoKSB7 CisgICAgZXZlbnRQbHVnaW5PcmRlciA9IG51bGw7CisgICAgZm9yICh2YXIgcGx1Z2luTmFtZSBp biBuYW1lc1RvUGx1Z2lucykgeworICAgICAgaWYgKG5hbWVzVG9QbHVnaW5zLmhhc093blByb3Bl cnR5KHBsdWdpbk5hbWUpKSB7CisgICAgICAgIGRlbGV0ZSBuYW1lc1RvUGx1Z2luc1twbHVnaW5O YW1lXTsKKyAgICAgIH0KKyAgICB9CisgICAgRXZlbnRQbHVnaW5SZWdpc3RyeS5wbHVnaW5zLmxl bmd0aCA9IDA7CisKKyAgICB2YXIgZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzID0gRXZlbnRQbHVn aW5SZWdpc3RyeS5ldmVudE5hbWVEaXNwYXRjaENvbmZpZ3M7CisgICAgZm9yICh2YXIgZXZlbnRO YW1lIGluIGV2ZW50TmFtZURpc3BhdGNoQ29uZmlncykgeworICAgICAgaWYgKGV2ZW50TmFtZURp c3BhdGNoQ29uZmlncy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpKSB7CisgICAgICAgIGRlbGV0 ZSBldmVudE5hbWVEaXNwYXRjaENvbmZpZ3NbZXZlbnROYW1lXTsKKyAgICAgIH0KKyAgICB9CisK KyAgICB2YXIgcmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LnJl Z2lzdHJhdGlvbk5hbWVNb2R1bGVzOworICAgIGZvciAodmFyIHJlZ2lzdHJhdGlvbk5hbWUgaW4g cmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMpIHsKKyAgICAgIGlmIChyZWdpc3RyYXRpb25OYW1lTW9k dWxlcy5oYXNPd25Qcm9wZXJ0eShyZWdpc3RyYXRpb25OYW1lKSkgeworICAgICAgICBkZWxldGUg cmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbcmVnaXN0cmF0aW9uTmFtZV07CisgICAgICB9CisgICAg fQorCisgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgdmFy IHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LnBvc3NpYmxl UmVnaXN0cmF0aW9uTmFtZXM7CisgICAgICBmb3IgKHZhciBsb3dlckNhc2VkTmFtZSBpbiBwb3Nz aWJsZVJlZ2lzdHJhdGlvbk5hbWVzKSB7CisgICAgICAgIGlmIChwb3NzaWJsZVJlZ2lzdHJhdGlv bk5hbWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSkgeworICAgICAgICAgIGRlbGV0 ZSBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzW2xvd2VyQ2FzZWROYW1lXTsKKyAgICAgICAgfQor ICAgICAgfQorICAgIH0KKyAgfQorCit9OworCittb2R1bGUuZXhwb3J0cyA9IEV2ZW50UGx1Z2lu UmVnaXN0cnk7Cit9LHsiMTE2IjoxMTYsIjE0MCI6MTQwfV0sMTg6W2Z1bmN0aW9uKF9kZXJlcV8s bW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9v aywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2Rl IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAq IExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4g QW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4g dGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ug c3RyaWN0JzsKKwordmFyIF9wcm9kSW52YXJpYW50ID0gX2RlcmVxXygxMTYpOworCit2YXIgUmVh Y3RFcnJvclV0aWxzID0gX2RlcmVxXyg1MCk7CisKK3ZhciBpbnZhcmlhbnQgPSBfZGVyZXFfKDE0 MCk7Cit2YXIgd2FybmluZyA9IF9kZXJlcV8oMTQ3KTsKKworLyoqCisgKiBJbmplY3RlZCBkZXBl bmRlbmNpZXM6CisgKi8KKworLyoqCisgKiAtIGBDb21wb25lbnRUcmVlYDogW3JlcXVpcmVkXSBN b2R1bGUgdGhhdCBjYW4gY29udmVydCBiZXR3ZWVuIFJlYWN0IGluc3RhbmNlcworICogICBhbmQg YWN0dWFsIG5vZGUgcmVmZXJlbmNlcy4KKyAqLwordmFyIENvbXBvbmVudFRyZWU7Cit2YXIgVHJl ZVRyYXZlcnNhbDsKK3ZhciBpbmplY3Rpb24gPSB7CisgIGluamVjdENvbXBvbmVudFRyZWU6IGZ1 bmN0aW9uIChJbmplY3RlZCkgeworICAgIENvbXBvbmVudFRyZWUgPSBJbmplY3RlZDsKKyAgICBp ZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAiZGV2ZWxvcG1lbnQi ICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKEluamVjdGVkICYmIEluamVjdGVkLmdldE5vZGVG cm9tSW5zdGFuY2UgJiYgSW5qZWN0ZWQuZ2V0SW5zdGFuY2VGcm9tTm9kZSwgJ0V2ZW50UGx1Z2lu VXRpbHMuaW5qZWN0aW9uLmluamVjdENvbXBvbmVudFRyZWUoLi4uKTogSW5qZWN0ZWQgJyArICdt b2R1bGUgaXMgbWlzc2luZyBnZXROb2RlRnJvbUluc3RhbmNlIG9yIGdldEluc3RhbmNlRnJvbU5v ZGUuJykgOiB2b2lkIDA7CisgICAgfQorICB9LAorICBpbmplY3RUcmVlVHJhdmVyc2FsOiBmdW5j dGlvbiAoSW5qZWN0ZWQpIHsKKyAgICBUcmVlVHJhdmVyc2FsID0gSW5qZWN0ZWQ7CisgICAgaWYg KCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgImRldmVsb3BtZW50IiAh PT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhJbmplY3RlZCAmJiBJbmplY3RlZC5pc0FuY2VzdG9y ICYmIEluamVjdGVkLmdldExvd2VzdENvbW1vbkFuY2VzdG9yLCAnRXZlbnRQbHVnaW5VdGlscy5p bmplY3Rpb24uaW5qZWN0VHJlZVRyYXZlcnNhbCguLi4pOiBJbmplY3RlZCAnICsgJ21vZHVsZSBp cyBtaXNzaW5nIGlzQW5jZXN0b3Igb3IgZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IuJykgOiB2b2lk IDA7CisgICAgfQorICB9Cit9OworCitmdW5jdGlvbiBpc0VuZGlzaCh0b3BMZXZlbFR5cGUpIHsK KyAgcmV0dXJuIHRvcExldmVsVHlwZSA9PT0gJ3RvcE1vdXNlVXAnIHx8IHRvcExldmVsVHlwZSA9 PT0gJ3RvcFRvdWNoRW5kJyB8fCB0b3BMZXZlbFR5cGUgPT09ICd0b3BUb3VjaENhbmNlbCc7Cit9 CisKK2Z1bmN0aW9uIGlzTW92ZWlzaCh0b3BMZXZlbFR5cGUpIHsKKyAgcmV0dXJuIHRvcExldmVs VHlwZSA9PT0gJ3RvcE1vdXNlTW92ZScgfHwgdG9wTGV2ZWxUeXBlID09PSAndG9wVG91Y2hNb3Zl JzsKK30KK2Z1bmN0aW9uIGlzU3RhcnRpc2godG9wTGV2ZWxUeXBlKSB7CisgIHJldHVybiB0b3BM ZXZlbFR5cGUgPT09ICd0b3BNb3VzZURvd24nIHx8IHRvcExldmVsVHlwZSA9PT0gJ3RvcFRvdWNo U3RhcnQnOworfQorCit2YXIgdmFsaWRhdGVFdmVudERpc3BhdGNoZXM7CitpZiAoImRldmVsb3Bt ZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgIHZhbGlkYXRlRXZlbnREaXNwYXRjaGVzID0gZnVu Y3Rpb24gKGV2ZW50KSB7CisgICAgdmFyIGRpc3BhdGNoTGlzdGVuZXJzID0gZXZlbnQuX2Rpc3Bh dGNoTGlzdGVuZXJzOworICAgIHZhciBkaXNwYXRjaEluc3RhbmNlcyA9IGV2ZW50Ll9kaXNwYXRj aEluc3RhbmNlczsKKworICAgIHZhciBsaXN0ZW5lcnNJc0FyciA9IEFycmF5LmlzQXJyYXkoZGlz cGF0Y2hMaXN0ZW5lcnMpOworICAgIHZhciBsaXN0ZW5lcnNMZW4gPSBsaXN0ZW5lcnNJc0FyciA/ IGRpc3BhdGNoTGlzdGVuZXJzLmxlbmd0aCA6IGRpc3BhdGNoTGlzdGVuZXJzID8gMSA6IDA7CisK KyAgICB2YXIgaW5zdGFuY2VzSXNBcnIgPSBBcnJheS5pc0FycmF5KGRpc3BhdGNoSW5zdGFuY2Vz KTsKKyAgICB2YXIgaW5zdGFuY2VzTGVuID0gaW5zdGFuY2VzSXNBcnIgPyBkaXNwYXRjaEluc3Rh bmNlcy5sZW5ndGggOiBkaXNwYXRjaEluc3RhbmNlcyA/IDEgOiAwOworCisgICAgImRldmVsb3Bt ZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhpbnN0YW5jZXNJc0FyciA9PT0gbGlzdGVu ZXJzSXNBcnIgJiYgaW5zdGFuY2VzTGVuID09PSBsaXN0ZW5lcnNMZW4sICdFdmVudFBsdWdpblV0 aWxzOiBJbnZhbGlkIGBldmVudGAuJykgOiB2b2lkIDA7CisgIH07Cit9CisKKy8qKgorICogRGlz cGF0Y2ggdGhlIGV2ZW50IHRvIHRoZSBsaXN0ZW5lci4KKyAqIEBwYXJhbSB7U3ludGhldGljRXZl bnR9IGV2ZW50IFN5bnRoZXRpY0V2ZW50IHRvIGhhbmRsZQorICogQHBhcmFtIHtib29sZWFufSBz aW11bGF0ZWQgSWYgdGhlIGV2ZW50IGlzIHNpbXVsYXRlZCAoY2hhbmdlcyBleG4gYmVoYXZpb3Ip CisgKiBAcGFyYW0ge2Z1bmN0aW9ufSBsaXN0ZW5lciBBcHBsaWNhdGlvbi1sZXZlbCBjYWxsYmFj aworICogQHBhcmFtIHsqfSBpbnN0IEludGVybmFsIGNvbXBvbmVudCBpbnN0YW5jZQorICovCitm dW5jdGlvbiBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIHNpbXVsYXRlZCwgbGlzdGVuZXIsIGluc3Qp IHsKKyAgdmFyIHR5cGUgPSBldmVudC50eXBlIHx8ICd1bmtub3duLWV2ZW50JzsKKyAgZXZlbnQu Y3VycmVudFRhcmdldCA9IEV2ZW50UGx1Z2luVXRpbHMuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0 KTsKKyAgaWYgKHNpbXVsYXRlZCkgeworICAgIFJlYWN0RXJyb3JVdGlscy5pbnZva2VHdWFyZGVk Q2FsbGJhY2tXaXRoQ2F0Y2godHlwZSwgbGlzdGVuZXIsIGV2ZW50KTsKKyAgfSBlbHNlIHsKKyAg ICBSZWFjdEVycm9yVXRpbHMuaW52b2tlR3VhcmRlZENhbGxiYWNrKHR5cGUsIGxpc3RlbmVyLCBl dmVudCk7CisgIH0KKyAgZXZlbnQuY3VycmVudFRhcmdldCA9IG51bGw7Cit9CisKKy8qKgorICog U3RhbmRhcmQvc2ltcGxlIGl0ZXJhdGlvbiB0aHJvdWdoIGFuIGV2ZW50J3MgY29sbGVjdGVkIGRp c3BhdGNoZXMuCisgKi8KK2Z1bmN0aW9uIGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlcihldmVudCwg c2ltdWxhdGVkKSB7CisgIHZhciBkaXNwYXRjaExpc3RlbmVycyA9IGV2ZW50Ll9kaXNwYXRjaExp c3RlbmVyczsKKyAgdmFyIGRpc3BhdGNoSW5zdGFuY2VzID0gZXZlbnQuX2Rpc3BhdGNoSW5zdGFu Y2VzOworICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgdmFsaWRh dGVFdmVudERpc3BhdGNoZXMoZXZlbnQpOworICB9CisgIGlmIChBcnJheS5pc0FycmF5KGRpc3Bh dGNoTGlzdGVuZXJzKSkgeworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlzcGF0Y2hMaXN0ZW5l cnMubGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmIChldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgp KSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLy8gTGlzdGVuZXJzIGFuZCBJbnN0 YW5jZXMgYXJlIHR3byBwYXJhbGxlbCBhcnJheXMgdGhhdCBhcmUgYWx3YXlzIGluIHN5bmMuCisg ICAgICBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIHNpbXVsYXRlZCwgZGlzcGF0Y2hMaXN0ZW5lcnNb aV0sIGRpc3BhdGNoSW5zdGFuY2VzW2ldKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoZGlzcGF0Y2hM aXN0ZW5lcnMpIHsKKyAgICBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIHNpbXVsYXRlZCwgZGlzcGF0 Y2hMaXN0ZW5lcnMsIGRpc3BhdGNoSW5zdGFuY2VzKTsKKyAgfQorICBldmVudC5fZGlzcGF0Y2hM aXN0ZW5lcnMgPSBudWxsOworICBldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXMgPSBudWxsOworfQor CisvKioKKyAqIFN0YW5kYXJkL3NpbXBsZSBpdGVyYXRpb24gdGhyb3VnaCBhbiBldmVudCdzIGNv bGxlY3RlZCBkaXNwYXRjaGVzLCBidXQgc3RvcHMKKyAqIGF0IHRoZSBmaXJzdCBkaXNwYXRjaCBl eGVjdXRpb24gcmV0dXJuaW5nIHRydWUsIGFuZCByZXR1cm5zIHRoYXQgaWQuCisgKgorICogQHJl dHVybiB7P3N0cmluZ30gaWQgb2YgdGhlIGZpcnN0IGRpc3BhdGNoIGV4ZWN1dGlvbiB3aG8ncyBs aXN0ZW5lciByZXR1cm5zCisgKiB0cnVlLCBvciBudWxsIGlmIG5vIGxpc3RlbmVyIHJldHVybmVk IHRydWUuCisgKi8KK2Z1bmN0aW9uIGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlclN0b3BBdFRydWVJ bXBsKGV2ZW50KSB7CisgIHZhciBkaXNwYXRjaExpc3RlbmVycyA9IGV2ZW50Ll9kaXNwYXRjaExp c3RlbmVyczsKKyAgdmFyIGRpc3BhdGNoSW5zdGFuY2VzID0gZXZlbnQuX2Rpc3BhdGNoSW5zdGFu Y2VzOworICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgdmFsaWRh dGVFdmVudERpc3BhdGNoZXMoZXZlbnQpOworICB9CisgIGlmIChBcnJheS5pc0FycmF5KGRpc3Bh dGNoTGlzdGVuZXJzKSkgeworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlzcGF0Y2hMaXN0ZW5l cnMubGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmIChldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgp KSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLy8gTGlzdGVuZXJzIGFuZCBJbnN0 YW5jZXMgYXJlIHR3byBwYXJhbGxlbCBhcnJheXMgdGhhdCBhcmUgYWx3YXlzIGluIHN5bmMuCisg ICAgICBpZiAoZGlzcGF0Y2hMaXN0ZW5lcnNbaV0oZXZlbnQsIGRpc3BhdGNoSW5zdGFuY2VzW2ld KSkgeworICAgICAgICByZXR1cm4gZGlzcGF0Y2hJbnN0YW5jZXNbaV07CisgICAgICB9CisgICAg fQorICB9IGVsc2UgaWYgKGRpc3BhdGNoTGlzdGVuZXJzKSB7CisgICAgaWYgKGRpc3BhdGNoTGlz dGVuZXJzKGV2ZW50LCBkaXNwYXRjaEluc3RhbmNlcykpIHsKKyAgICAgIHJldHVybiBkaXNwYXRj aEluc3RhbmNlczsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bGw7Cit9CisKKy8qKgorICogQHNl ZSBleGVjdXRlRGlzcGF0Y2hlc0luT3JkZXJTdG9wQXRUcnVlSW1wbAorICovCitmdW5jdGlvbiBl eGVjdXRlRGlzcGF0Y2hlc0luT3JkZXJTdG9wQXRUcnVlKGV2ZW50KSB7CisgIHZhciByZXQgPSBl eGVjdXRlRGlzcGF0Y2hlc0luT3JkZXJTdG9wQXRUcnVlSW1wbChldmVudCk7CisgIGV2ZW50Ll9k aXNwYXRjaEluc3RhbmNlcyA9IG51bGw7CisgIGV2ZW50Ll9kaXNwYXRjaExpc3RlbmVycyA9IG51 bGw7CisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogRXhlY3V0aW9uIG9mIGEgImRpcmVjdCIg ZGlzcGF0Y2ggLSB0aGVyZSBtdXN0IGJlIGF0IG1vc3Qgb25lIGRpc3BhdGNoCisgKiBhY2N1bXVs YXRlZCBvbiB0aGUgZXZlbnQgb3IgaXQgaXMgY29uc2lkZXJlZCBhbiBlcnJvci4gSXQgZG9lc24n dCByZWFsbHkgbWFrZQorICogc2Vuc2UgZm9yIGFuIGV2ZW50IHdpdGggbXVsdGlwbGUgZGlzcGF0 Y2hlcyAoYnViYmxlZCkgdG8ga2VlcCB0cmFjayBvZiB0aGUKKyAqIHJldHVybiB2YWx1ZXMgYXQg ZWFjaCBkaXNwYXRjaCBleGVjdXRpb24sIGJ1dCBpdCBkb2VzIHRlbmQgdG8gbWFrZSBzZW5zZSB3 aGVuCisgKiBkZWFsaW5nIHdpdGggImRpcmVjdCIgZGlzcGF0Y2hlcy4KKyAqCisgKiBAcmV0dXJu IHsqfSBUaGUgcmV0dXJuIHZhbHVlIG9mIGV4ZWN1dGluZyB0aGUgc2luZ2xlIGRpc3BhdGNoLgor ICovCitmdW5jdGlvbiBleGVjdXRlRGlyZWN0RGlzcGF0Y2goZXZlbnQpIHsKKyAgaWYgKCJkZXZl bG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgIHZhbGlkYXRlRXZlbnREaXNwYXRjaGVz KGV2ZW50KTsKKyAgfQorICB2YXIgZGlzcGF0Y2hMaXN0ZW5lciA9IGV2ZW50Ll9kaXNwYXRjaExp c3RlbmVyczsKKyAgdmFyIGRpc3BhdGNoSW5zdGFuY2UgPSBldmVudC5fZGlzcGF0Y2hJbnN0YW5j ZXM7CisgICEhQXJyYXkuaXNBcnJheShkaXNwYXRjaExpc3RlbmVyKSA/ICJkZXZlbG9wbWVudCIg IT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2V4ZWN1dGVEaXJlY3REaXNwYXRj aCguLi4pOiBJbnZhbGlkIGBldmVudGAuJykgOiBfcHJvZEludmFyaWFudCgnMTAzJykgOiB2b2lk IDA7CisgIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBkaXNwYXRjaExpc3RlbmVyID8gRXZlbnRQbHVn aW5VdGlscy5nZXROb2RlRnJvbUluc3RhbmNlKGRpc3BhdGNoSW5zdGFuY2UpIDogbnVsbDsKKyAg dmFyIHJlcyA9IGRpc3BhdGNoTGlzdGVuZXIgPyBkaXNwYXRjaExpc3RlbmVyKGV2ZW50KSA6IG51 bGw7CisgIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBudWxsOworICBldmVudC5fZGlzcGF0Y2hMaXN0 ZW5lcnMgPSBudWxsOworICBldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXMgPSBudWxsOworICByZXR1 cm4gcmVzOworfQorCisvKioKKyAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50CisgKiBA cmV0dXJuIHtib29sZWFufSBUcnVlIGlmZiBudW1iZXIgb2YgZGlzcGF0Y2hlcyBhY2N1bXVsYXRl ZCBpcyBncmVhdGVyIHRoYW4gMC4KKyAqLworZnVuY3Rpb24gaGFzRGlzcGF0Y2hlcyhldmVudCkg eworICByZXR1cm4gISFldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnM7Cit9CisKKy8qKgorICogR2Vu ZXJhbCB1dGlsaXRpZXMgdGhhdCBhcmUgdXNlZnVsIGluIGNyZWF0aW5nIGN1c3RvbSBFdmVudCBQ bHVnaW5zLgorICovCit2YXIgRXZlbnRQbHVnaW5VdGlscyA9IHsKKyAgaXNFbmRpc2g6IGlzRW5k aXNoLAorICBpc01vdmVpc2g6IGlzTW92ZWlzaCwKKyAgaXNTdGFydGlzaDogaXNTdGFydGlzaCwK KworICBleGVjdXRlRGlyZWN0RGlzcGF0Y2g6IGV4ZWN1dGVEaXJlY3REaXNwYXRjaCwKKyAgZXhl Y3V0ZURpc3BhdGNoZXNJbk9yZGVyOiBleGVjdXRlRGlzcGF0Y2hlc0luT3JkZXIsCisgIGV4ZWN1 dGVEaXNwYXRjaGVzSW5PcmRlclN0b3BBdFRydWU6IGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlclN0 b3BBdFRydWUsCisgIGhhc0Rpc3BhdGNoZXM6IGhhc0Rpc3BhdGNoZXMsCisKKyAgZ2V0SW5zdGFu Y2VGcm9tTm9kZTogZnVuY3Rpb24gKG5vZGUpIHsKKyAgICByZXR1cm4gQ29tcG9uZW50VHJlZS5n ZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpOworICB9LAorICBnZXROb2RlRnJvbUluc3RhbmNlOiBm dW5jdGlvbiAobm9kZSkgeworICAgIHJldHVybiBDb21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5z dGFuY2Uobm9kZSk7CisgIH0sCisgIGlzQW5jZXN0b3I6IGZ1bmN0aW9uIChhLCBiKSB7CisgICAg cmV0dXJuIFRyZWVUcmF2ZXJzYWwuaXNBbmNlc3RvcihhLCBiKTsKKyAgfSwKKyAgZ2V0TG93ZXN0 Q29tbW9uQW5jZXN0b3I6IGZ1bmN0aW9uIChhLCBiKSB7CisgICAgcmV0dXJuIFRyZWVUcmF2ZXJz YWwuZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoYSwgYik7CisgIH0sCisgIGdldFBhcmVudEluc3Rh bmNlOiBmdW5jdGlvbiAoaW5zdCkgeworICAgIHJldHVybiBUcmVlVHJhdmVyc2FsLmdldFBhcmVu dEluc3RhbmNlKGluc3QpOworICB9LAorICB0cmF2ZXJzZVR3b1BoYXNlOiBmdW5jdGlvbiAodGFy Z2V0LCBmbiwgYXJnKSB7CisgICAgcmV0dXJuIFRyZWVUcmF2ZXJzYWwudHJhdmVyc2VUd29QaGFz ZSh0YXJnZXQsIGZuLCBhcmcpOworICB9LAorICB0cmF2ZXJzZUVudGVyTGVhdmU6IGZ1bmN0aW9u IChmcm9tLCB0bywgZm4sIGFyZ0Zyb20sIGFyZ1RvKSB7CisgICAgcmV0dXJuIFRyZWVUcmF2ZXJz YWwudHJhdmVyc2VFbnRlckxlYXZlKGZyb20sIHRvLCBmbiwgYXJnRnJvbSwgYXJnVG8pOworICB9 LAorCisgIGluamVjdGlvbjogaW5qZWN0aW9uCit9OworCittb2R1bGUuZXhwb3J0cyA9IEV2ZW50 UGx1Z2luVXRpbHM7Cit9LHsiMTE2IjoxMTYsIjE0MCI6MTQwLCIxNDciOjE0NywiNTAiOjUwfV0s MTk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQg MjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq CisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGlj ZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkg b2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJp Z2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3Rv cnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIEV2ZW50UGx1Z2luSHViID0gX2Rl cmVxXygxNik7Cit2YXIgRXZlbnRQbHVnaW5VdGlscyA9IF9kZXJlcV8oMTgpOworCit2YXIgYWNj dW11bGF0ZUludG8gPSBfZGVyZXFfKDk1KTsKK3ZhciBmb3JFYWNoQWNjdW11bGF0ZWQgPSBfZGVy ZXFfKDEwMik7Cit2YXIgd2FybmluZyA9IF9kZXJlcV8oMTQ3KTsKKwordmFyIGdldExpc3RlbmVy ID0gRXZlbnRQbHVnaW5IdWIuZ2V0TGlzdGVuZXI7CisKKy8qKgorICogU29tZSBldmVudCB0eXBl cyBoYXZlIGEgbm90aW9uIG9mIGRpZmZlcmVudCByZWdpc3RyYXRpb24gbmFtZXMgZm9yIGRpZmZl cmVudAorICogInBoYXNlcyIgb2YgcHJvcGFnYXRpb24uIFRoaXMgZmluZHMgbGlzdGVuZXJzIGJ5 IGEgZ2l2ZW4gcGhhc2UuCisgKi8KK2Z1bmN0aW9uIGxpc3RlbmVyQXRQaGFzZShpbnN0LCBldmVu dCwgcHJvcGFnYXRpb25QaGFzZSkgeworICB2YXIgcmVnaXN0cmF0aW9uTmFtZSA9IGV2ZW50LmRp c3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzW3Byb3BhZ2F0aW9uUGhhc2VdOwor ICByZXR1cm4gZ2V0TGlzdGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSk7Cit9CisKKy8qKgor ICogVGFncyBhIGBTeW50aGV0aWNFdmVudGAgd2l0aCBkaXNwYXRjaGVkIGxpc3RlbmVycy4gQ3Jl YXRpbmcgdGhpcyBmdW5jdGlvbgorICogaGVyZSwgYWxsb3dzIHVzIHRvIG5vdCBoYXZlIHRvIGJp bmQgb3IgY3JlYXRlIGZ1bmN0aW9ucyBmb3IgZWFjaCBldmVudC4KKyAqIE11dGF0aW5nIHRoZSBl dmVudCdzIG1lbWJlcnMgYWxsb3dzIHVzIHRvIG5vdCBoYXZlIHRvIGNyZWF0ZSBhIHdyYXBwaW5n CisgKiAiZGlzcGF0Y2giIG9iamVjdCB0aGF0IHBhaXJzIHRoZSBldmVudCB3aXRoIHRoZSBsaXN0 ZW5lci4KKyAqLworZnVuY3Rpb24gYWNjdW11bGF0ZURpcmVjdGlvbmFsRGlzcGF0Y2hlcyhpbnN0 LCBwaGFzZSwgZXZlbnQpIHsKKyAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykg eworICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoaW5zdCwgJ0Rp c3BhdGNoaW5nIGluc3QgbXVzdCBub3QgYmUgbnVsbCcpIDogdm9pZCAwOworICB9CisgIHZhciBs aXN0ZW5lciA9IGxpc3RlbmVyQXRQaGFzZShpbnN0LCBldmVudCwgcGhhc2UpOworICBpZiAobGlz dGVuZXIpIHsKKyAgICBldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnMgPSBhY2N1bXVsYXRlSW50byhl dmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnMsIGxpc3RlbmVyKTsKKyAgICBldmVudC5fZGlzcGF0Y2hJ bnN0YW5jZXMgPSBhY2N1bXVsYXRlSW50byhldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXMsIGluc3Qp OworICB9Cit9CisKKy8qKgorICogQ29sbGVjdCBkaXNwYXRjaGVzIChtdXN0IGJlIGVudGlyZWx5 IGNvbGxlY3RlZCBiZWZvcmUgZGlzcGF0Y2hpbmcgLSBzZWUgdW5pdAorICogdGVzdHMpLiBMYXpp bHkgYWxsb2NhdGUgdGhlIGFycmF5IHRvIGNvbnNlcnZlIG1lbW9yeS4gIFdlIG11c3QgbG9vcCB0 aHJvdWdoCisgKiBlYWNoIGV2ZW50IGFuZCBwZXJmb3JtIHRoZSB0cmF2ZXJzYWwgZm9yIGVhY2gg b25lLiBXZSBjYW5ub3QgcGVyZm9ybSBhCisgKiBzaW5nbGUgdHJhdmVyc2FsIGZvciB0aGUgZW50 aXJlIGNvbGxlY3Rpb24gb2YgZXZlbnRzIGJlY2F1c2UgZWFjaCBldmVudCBtYXkKKyAqIGhhdmUg YSBkaWZmZXJlbnQgdGFyZ2V0LgorICovCitmdW5jdGlvbiBhY2N1bXVsYXRlVHdvUGhhc2VEaXNw YXRjaGVzU2luZ2xlKGV2ZW50KSB7CisgIGlmIChldmVudCAmJiBldmVudC5kaXNwYXRjaENvbmZp Zy5waGFzZWRSZWdpc3RyYXRpb25OYW1lcykgeworICAgIEV2ZW50UGx1Z2luVXRpbHMudHJhdmVy c2VUd29QaGFzZShldmVudC5fdGFyZ2V0SW5zdCwgYWNjdW11bGF0ZURpcmVjdGlvbmFsRGlzcGF0 Y2hlcywgZXZlbnQpOworICB9Cit9CisKKy8qKgorICogU2FtZSBhcyBgYWNjdW11bGF0ZVR3b1Bo YXNlRGlzcGF0Y2hlc1NpbmdsZWAsIGJ1dCBza2lwcyBvdmVyIHRoZSB0YXJnZXRJRC4KKyAqLwor ZnVuY3Rpb24gYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1NpbmdsZVNraXBUYXJnZXQoZXZl bnQpIHsKKyAgaWYgKGV2ZW50ICYmIGV2ZW50LmRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJh dGlvbk5hbWVzKSB7CisgICAgdmFyIHRhcmdldEluc3QgPSBldmVudC5fdGFyZ2V0SW5zdDsKKyAg ICB2YXIgcGFyZW50SW5zdCA9IHRhcmdldEluc3QgPyBFdmVudFBsdWdpblV0aWxzLmdldFBhcmVu dEluc3RhbmNlKHRhcmdldEluc3QpIDogbnVsbDsKKyAgICBFdmVudFBsdWdpblV0aWxzLnRyYXZl cnNlVHdvUGhhc2UocGFyZW50SW5zdCwgYWNjdW11bGF0ZURpcmVjdGlvbmFsRGlzcGF0Y2hlcywg ZXZlbnQpOworICB9Cit9CisKKy8qKgorICogQWNjdW11bGF0ZXMgd2l0aG91dCByZWdhcmQgdG8g ZGlyZWN0aW9uLCBkb2VzIG5vdCBsb29rIGZvciBwaGFzZWQKKyAqIHJlZ2lzdHJhdGlvbiBuYW1l cy4gU2FtZSBhcyBgYWNjdW11bGF0ZURpcmVjdERpc3BhdGNoZXNTaW5nbGVgIGJ1dCB3aXRob3V0 CisgKiByZXF1aXJpbmcgdGhhdCB0aGUgYGRpc3BhdGNoTWFya2VyYCBiZSB0aGUgc2FtZSBhcyB0 aGUgZGlzcGF0Y2hlZCBJRC4KKyAqLworZnVuY3Rpb24gYWNjdW11bGF0ZURpc3BhdGNoZXMoaW5z dCwgaWdub3JlZERpcmVjdGlvbiwgZXZlbnQpIHsKKyAgaWYgKGV2ZW50ICYmIGV2ZW50LmRpc3Bh dGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUpIHsKKyAgICB2YXIgcmVnaXN0cmF0aW9uTmFtZSA9 IGV2ZW50LmRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWU7CisgICAgdmFyIGxpc3RlbmVy ID0gZ2V0TGlzdGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSk7CisgICAgaWYgKGxpc3RlbmVy KSB7CisgICAgICBldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnMgPSBhY2N1bXVsYXRlSW50byhldmVu dC5fZGlzcGF0Y2hMaXN0ZW5lcnMsIGxpc3RlbmVyKTsKKyAgICAgIGV2ZW50Ll9kaXNwYXRjaElu c3RhbmNlcyA9IGFjY3VtdWxhdGVJbnRvKGV2ZW50Ll9kaXNwYXRjaEluc3RhbmNlcywgaW5zdCk7 CisgICAgfQorICB9Cit9CisKKy8qKgorICogQWNjdW11bGF0ZXMgZGlzcGF0Y2hlcyBvbiBhbiBg U3ludGhldGljRXZlbnRgLCBidXQgb25seSBmb3IgdGhlCisgKiBgZGlzcGF0Y2hNYXJrZXJgLgor ICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQKKyAqLworZnVuY3Rpb24gYWNjdW11bGF0 ZURpcmVjdERpc3BhdGNoZXNTaW5nbGUoZXZlbnQpIHsKKyAgaWYgKGV2ZW50ICYmIGV2ZW50LmRp c3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUpIHsKKyAgICBhY2N1bXVsYXRlRGlzcGF0Y2hl cyhldmVudC5fdGFyZ2V0SW5zdCwgbnVsbCwgZXZlbnQpOworICB9Cit9CisKK2Z1bmN0aW9uIGFj Y3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMoZXZlbnRzKSB7CisgIGZvckVhY2hBY2N1bXVsYXRl ZChldmVudHMsIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXNTaW5nbGUpOworfQorCitmdW5j dGlvbiBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzU2tpcFRhcmdldChldmVudHMpIHsKKyAg Zm9yRWFjaEFjY3VtdWxhdGVkKGV2ZW50cywgYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1Np bmdsZVNraXBUYXJnZXQpOworfQorCitmdW5jdGlvbiBhY2N1bXVsYXRlRW50ZXJMZWF2ZURpc3Bh dGNoZXMobGVhdmUsIGVudGVyLCBmcm9tLCB0bykgeworICBFdmVudFBsdWdpblV0aWxzLnRyYXZl cnNlRW50ZXJMZWF2ZShmcm9tLCB0bywgYWNjdW11bGF0ZURpc3BhdGNoZXMsIGxlYXZlLCBlbnRl cik7Cit9CisKK2Z1bmN0aW9uIGFjY3VtdWxhdGVEaXJlY3REaXNwYXRjaGVzKGV2ZW50cykgewor ICBmb3JFYWNoQWNjdW11bGF0ZWQoZXZlbnRzLCBhY2N1bXVsYXRlRGlyZWN0RGlzcGF0Y2hlc1Np bmdsZSk7Cit9CisKKy8qKgorICogQSBzbWFsbCBzZXQgb2YgcHJvcGFnYXRpb24gcGF0dGVybnMs IGVhY2ggb2Ygd2hpY2ggd2lsbCBhY2NlcHQgYSBzbWFsbCBhbW91bnQKKyAqIG9mIGluZm9ybWF0 aW9uLCBhbmQgZ2VuZXJhdGUgYSBzZXQgb2YgImRpc3BhdGNoIHJlYWR5IGV2ZW50IG9iamVjdHMi IC0gd2hpY2gKKyAqIGFyZSBzZXRzIG9mIGV2ZW50cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGFu bm90YXRlZCB3aXRoIGEgc2V0IG9mIGRpc3BhdGNoZWQKKyAqIGxpc3RlbmVyIGZ1bmN0aW9ucy9p ZHMuIFRoZSBBUEkgaXMgZGVzaWduZWQgdGhpcyB3YXkgdG8gZGlzY291cmFnZSB0aGVzZQorICog cHJvcGFnYXRpb24gc3RyYXRlZ2llcyBmcm9tIGFjdHVhbGx5IGV4ZWN1dGluZyB0aGUgZGlzcGF0 Y2hlcywgc2luY2Ugd2UKKyAqIGFsd2F5cyB3YW50IHRvIGNvbGxlY3QgdGhlIGVudGlyZSBzZXQg b2YgZGlzcGF0Y2hlcyBiZWZvcmUgZXhlY3V0aW5nIGV2ZW50IGEKKyAqIHNpbmdsZSBvbmUuCisg KgorICogQGNvbnN0cnVjdG9yIEV2ZW50UHJvcGFnYXRvcnMKKyAqLwordmFyIEV2ZW50UHJvcGFn YXRvcnMgPSB7CisgIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXM6IGFjY3VtdWxhdGVUd29Q aGFzZURpc3BhdGNoZXMsCisgIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXNTa2lwVGFyZ2V0 OiBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzU2tpcFRhcmdldCwKKyAgYWNjdW11bGF0ZURp cmVjdERpc3BhdGNoZXM6IGFjY3VtdWxhdGVEaXJlY3REaXNwYXRjaGVzLAorICBhY2N1bXVsYXRl RW50ZXJMZWF2ZURpc3BhdGNoZXM6IGFjY3VtdWxhdGVFbnRlckxlYXZlRGlzcGF0Y2hlcworfTsK KworbW9kdWxlLmV4cG9ydHMgPSBFdmVudFByb3BhZ2F0b3JzOworfSx7IjEwMiI6MTAyLCIxNDci OjE0NywiMTYiOjE2LCIxOCI6MTgsIjk1Ijo5NX1dLDIwOltmdW5jdGlvbihfZGVyZXFfLG1vZHVs ZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIElu Yy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBs aWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNF TlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFk ZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQ QVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmlj dCc7CisKK3ZhciBfYXNzaWduID0gX2RlcmVxXygxNDgpOworCit2YXIgUG9vbGVkQ2xhc3MgPSBf ZGVyZXFfKDI0KTsKKwordmFyIGdldFRleHRDb250ZW50QWNjZXNzb3IgPSBfZGVyZXFfKDExMCk7 CisKKy8qKgorICogVGhpcyBoZWxwZXIgY2xhc3Mgc3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IHRl eHQgY29udGVudCBvZiBhIHRhcmdldCBub2RlLAorICogYWxsb3dpbmcgY29tcGFyaXNvbiBvZiBj b250ZW50IGJlZm9yZSBhbmQgYWZ0ZXIgYSBnaXZlbiBldmVudC4KKyAqCisgKiBJZGVudGlmeSB0 aGUgbm9kZSB3aGVyZSBzZWxlY3Rpb24gY3VycmVudGx5IGJlZ2lucywgdGhlbiBvYnNlcnZlCisg KiBib3RoIGl0cyB0ZXh0IGNvbnRlbnQgYW5kIGl0cyBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBE T00uIFNpbmNlIHRoZQorICogYnJvd3NlciBtYXkgbmF0aXZlbHkgcmVwbGFjZSB0aGUgdGFyZ2V0 IG5vZGUgZHVyaW5nIGNvbXBvc2l0aW9uLCB3ZSBjYW4KKyAqIHVzZSBpdHMgcG9zaXRpb24gdG8g ZmluZCBpdHMgcmVwbGFjZW1lbnQuCisgKgorICogQHBhcmFtIHtET01FdmVudFRhcmdldH0gcm9v dAorICovCitmdW5jdGlvbiBGYWxsYmFja0NvbXBvc2l0aW9uU3RhdGUocm9vdCkgeworICB0aGlz Ll9yb290ID0gcm9vdDsKKyAgdGhpcy5fc3RhcnRUZXh0ID0gdGhpcy5nZXRUZXh0KCk7CisgIHRo aXMuX2ZhbGxiYWNrVGV4dCA9IG51bGw7Cit9CisKK19hc3NpZ24oRmFsbGJhY2tDb21wb3NpdGlv blN0YXRlLnByb3RvdHlwZSwgeworICBkZXN0cnVjdG9yOiBmdW5jdGlvbiAoKSB7CisgICAgdGhp cy5fcm9vdCA9IG51bGw7CisgICAgdGhpcy5fc3RhcnRUZXh0ID0gbnVsbDsKKyAgICB0aGlzLl9m YWxsYmFja1RleHQgPSBudWxsOworICB9LAorCisgIC8qKgorICAgKiBHZXQgY3VycmVudCB0ZXh0 IG9mIGlucHV0LgorICAgKgorICAgKiBAcmV0dXJuIHtzdHJpbmd9CisgICAqLworICBnZXRUZXh0 OiBmdW5jdGlvbiAoKSB7CisgICAgaWYgKCd2YWx1ZScgaW4gdGhpcy5fcm9vdCkgeworICAgICAg cmV0dXJuIHRoaXMuX3Jvb3QudmFsdWU7CisgICAgfQorICAgIHJldHVybiB0aGlzLl9yb290W2dl dFRleHRDb250ZW50QWNjZXNzb3IoKV07CisgIH0sCisKKyAgLyoqCisgICAqIERldGVybWluZSB0 aGUgZGlmZmVyaW5nIHN1YnN0cmluZyBiZXR3ZWVuIHRoZSBpbml0aWFsbHkgc3RvcmVkCisgICAq IHRleHQgY29udGVudCBhbmQgdGhlIGN1cnJlbnQgY29udGVudC4KKyAgICoKKyAgICogQHJldHVy biB7c3RyaW5nfQorICAgKi8KKyAgZ2V0RGF0YTogZnVuY3Rpb24gKCkgeworICAgIGlmICh0aGlz Ll9mYWxsYmFja1RleHQpIHsKKyAgICAgIHJldHVybiB0aGlzLl9mYWxsYmFja1RleHQ7CisgICAg fQorCisgICAgdmFyIHN0YXJ0OworICAgIHZhciBzdGFydFZhbHVlID0gdGhpcy5fc3RhcnRUZXh0 OworICAgIHZhciBzdGFydExlbmd0aCA9IHN0YXJ0VmFsdWUubGVuZ3RoOworICAgIHZhciBlbmQ7 CisgICAgdmFyIGVuZFZhbHVlID0gdGhpcy5nZXRUZXh0KCk7CisgICAgdmFyIGVuZExlbmd0aCA9 IGVuZFZhbHVlLmxlbmd0aDsKKworICAgIGZvciAoc3RhcnQgPSAwOyBzdGFydCA8IHN0YXJ0TGVu Z3RoOyBzdGFydCsrKSB7CisgICAgICBpZiAoc3RhcnRWYWx1ZVtzdGFydF0gIT09IGVuZFZhbHVl W3N0YXJ0XSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgbWlu RW5kID0gc3RhcnRMZW5ndGggLSBzdGFydDsKKyAgICBmb3IgKGVuZCA9IDE7IGVuZCA8PSBtaW5F bmQ7IGVuZCsrKSB7CisgICAgICBpZiAoc3RhcnRWYWx1ZVtzdGFydExlbmd0aCAtIGVuZF0gIT09 IGVuZFZhbHVlW2VuZExlbmd0aCAtIGVuZF0pIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9Cisg ICAgfQorCisgICAgdmFyIHNsaWNlVGFpbCA9IGVuZCA+IDEgPyAxIC0gZW5kIDogdW5kZWZpbmVk OworICAgIHRoaXMuX2ZhbGxiYWNrVGV4dCA9IGVuZFZhbHVlLnNsaWNlKHN0YXJ0LCBzbGljZVRh aWwpOworICAgIHJldHVybiB0aGlzLl9mYWxsYmFja1RleHQ7CisgIH0KK30pOworCitQb29sZWRD bGFzcy5hZGRQb29saW5nVG8oRmFsbGJhY2tDb21wb3NpdGlvblN0YXRlKTsKKworbW9kdWxlLmV4 cG9ydHMgPSBGYWxsYmFja0NvbXBvc2l0aW9uU3RhdGU7Cit9LHsiMTEwIjoxMTAsIjE0OCI6MTQ4 LCIyNCI6MjR9XSwyMTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAq IENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJl c2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJT RC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290 IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBv ZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBz YW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgRE9NUHJvcGVy dHkgPSBfZGVyZXFfKDExKTsKKwordmFyIE1VU1RfVVNFX1BST1BFUlRZID0gRE9NUHJvcGVydHku aW5qZWN0aW9uLk1VU1RfVVNFX1BST1BFUlRZOwordmFyIEhBU19CT09MRUFOX1ZBTFVFID0gRE9N UHJvcGVydHkuaW5qZWN0aW9uLkhBU19CT09MRUFOX1ZBTFVFOwordmFyIEhBU19OVU1FUklDX1ZB TFVFID0gRE9NUHJvcGVydHkuaW5qZWN0aW9uLkhBU19OVU1FUklDX1ZBTFVFOwordmFyIEhBU19Q T1NJVElWRV9OVU1FUklDX1ZBTFVFID0gRE9NUHJvcGVydHkuaW5qZWN0aW9uLkhBU19QT1NJVElW RV9OVU1FUklDX1ZBTFVFOwordmFyIEhBU19PVkVSTE9BREVEX0JPT0xFQU5fVkFMVUUgPSBET01Q cm9wZXJ0eS5pbmplY3Rpb24uSEFTX09WRVJMT0FERURfQk9PTEVBTl9WQUxVRTsKKwordmFyIEhU TUxET01Qcm9wZXJ0eUNvbmZpZyA9IHsKKyAgaXNDdXN0b21BdHRyaWJ1dGU6IFJlZ0V4cC5wcm90 b3R5cGUudGVzdC5iaW5kKG5ldyBSZWdFeHAoJ14oZGF0YXxhcmlhKS1bJyArIERPTVByb3BlcnR5 LkFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJykpLAorICBQcm9wZXJ0aWVzOiB7CisgICAgLyoq CisgICAgICogU3RhbmRhcmQgUHJvcGVydGllcworICAgICAqLworICAgIGFjY2VwdDogMCwKKyAg ICBhY2NlcHRDaGFyc2V0OiAwLAorICAgIGFjY2Vzc0tleTogMCwKKyAgICBhY3Rpb246IDAsCisg ICAgYWxsb3dGdWxsU2NyZWVuOiBIQVNfQk9PTEVBTl9WQUxVRSwKKyAgICBhbGxvd1RyYW5zcGFy ZW5jeTogMCwKKyAgICBhbHQ6IDAsCisgICAgLy8gc3BlY2lmaWVzIHRhcmdldCBjb250ZXh0IGZv ciBsaW5rcyB3aXRoIGBwcmVsb2FkYCB0eXBlCisgICAgYXM6IDAsCisgICAgYXN5bmM6IEhBU19C T09MRUFOX1ZBTFVFLAorICAgIGF1dG9Db21wbGV0ZTogMCwKKyAgICAvLyBhdXRvRm9jdXMgaXMg cG9seWZpbGxlZC9ub3JtYWxpemVkIGJ5IEF1dG9Gb2N1c1V0aWxzCisgICAgLy8gYXV0b0ZvY3Vz OiBIQVNfQk9PTEVBTl9WQUxVRSwKKyAgICBhdXRvUGxheTogSEFTX0JPT0xFQU5fVkFMVUUsCisg ICAgY2FwdHVyZTogSEFTX0JPT0xFQU5fVkFMVUUsCisgICAgY2VsbFBhZGRpbmc6IDAsCisgICAg Y2VsbFNwYWNpbmc6IDAsCisgICAgY2hhclNldDogMCwKKyAgICBjaGFsbGVuZ2U6IDAsCisgICAg Y2hlY2tlZDogTVVTVF9VU0VfUFJPUEVSVFkgfCBIQVNfQk9PTEVBTl9WQUxVRSwKKyAgICBjaXRl OiAwLAorICAgIGNsYXNzSUQ6IDAsCisgICAgY2xhc3NOYW1lOiAwLAorICAgIGNvbHM6IEhBU19Q T1NJVElWRV9OVU1FUklDX1ZBTFVFLAorICAgIGNvbFNwYW46IDAsCisgICAgY29udGVudDogMCwK KyAgICBjb250ZW50RWRpdGFibGU6IDAsCisgICAgY29udGV4dE1lbnU6IDAsCisgICAgY29udHJv bHM6IEhBU19CT09MRUFOX1ZBTFVFLAorICAgIGNvb3JkczogMCwKKyAgICBjcm9zc09yaWdpbjog MCwKKyAgICBkYXRhOiAwLCAvLyBGb3IgYDxvYmplY3QgLz5gIGFjdHMgYXMgYHNyY2AuCisgICAg ZGF0ZVRpbWU6IDAsCisgICAgJ2RlZmF1bHQnOiBIQVNfQk9PTEVBTl9WQUxVRSwKKyAgICBkZWZl cjogSEFTX0JPT0xFQU5fVkFMVUUsCisgICAgZGlyOiAwLAorICAgIGRpc2FibGVkOiBIQVNfQk9P TEVBTl9WQUxVRSwKKyAgICBkb3dubG9hZDogSEFTX09WRVJMT0FERURfQk9PTEVBTl9WQUxVRSwK KyAgICBkcmFnZ2FibGU6IDAsCisgICAgZW5jVHlwZTogMCwKKyAgICBmb3JtOiAwLAorICAgIGZv cm1BY3Rpb246IDAsCisgICAgZm9ybUVuY1R5cGU6IDAsCisgICAgZm9ybU1ldGhvZDogMCwKKyAg ICBmb3JtTm9WYWxpZGF0ZTogSEFTX0JPT0xFQU5fVkFMVUUsCisgICAgZm9ybVRhcmdldDogMCwK KyAgICBmcmFtZUJvcmRlcjogMCwKKyAgICBoZWFkZXJzOiAwLAorICAgIGhlaWdodDogMCwKKyAg ICBoaWRkZW46IEhBU19CT09MRUFOX1ZBTFVFLAorICAgIGhpZ2g6IDAsCisgICAgaHJlZjogMCwK KyAgICBocmVmTGFuZzogMCwKKyAgICBodG1sRm9yOiAwLAorICAgIGh0dHBFcXVpdjogMCwKKyAg ICBpY29uOiAwLAorICAgIGlkOiAwLAorICAgIGlucHV0TW9kZTogMCwKKyAgICBpbnRlZ3JpdHk6 IDAsCisgICAgaXM6IDAsCisgICAga2V5UGFyYW1zOiAwLAorICAgIGtleVR5cGU6IDAsCisgICAg a2luZDogMCwKKyAgICBsYWJlbDogMCwKKyAgICBsYW5nOiAwLAorICAgIGxpc3Q6IDAsCisgICAg bG9vcDogSEFTX0JPT0xFQU5fVkFMVUUsCisgICAgbG93OiAwLAorICAgIG1hbmlmZXN0OiAwLAor ICAgIG1hcmdpbkhlaWdodDogMCwKKyAgICBtYXJnaW5XaWR0aDogMCwKKyAgICBtYXg6IDAsCisg ICAgbWF4TGVuZ3RoOiAwLAorICAgIG1lZGlhOiAwLAorICAgIG1lZGlhR3JvdXA6IDAsCisgICAg bWV0aG9kOiAwLAorICAgIG1pbjogMCwKKyAgICBtaW5MZW5ndGg6IDAsCisgICAgLy8gQ2F1dGlv bjsgYG9wdGlvbi5zZWxlY3RlZGAgaXMgbm90IHVwZGF0ZWQgaWYgYHNlbGVjdC5tdWx0aXBsZWAg aXMKKyAgICAvLyBkaXNhYmxlZCB3aXRoIGByZW1vdmVBdHRyaWJ1dGVgLgorICAgIG11bHRpcGxl OiBNVVNUX1VTRV9QUk9QRVJUWSB8IEhBU19CT09MRUFOX1ZBTFVFLAorICAgIG11dGVkOiBNVVNU X1VTRV9QUk9QRVJUWSB8IEhBU19CT09MRUFOX1ZBTFVFLAorICAgIG5hbWU6IDAsCisgICAgbm9u Y2U6IDAsCisgICAgbm9WYWxpZGF0ZTogSEFTX0JPT0xFQU5fVkFMVUUsCisgICAgb3BlbjogSEFT X0JPT0xFQU5fVkFMVUUsCisgICAgb3B0aW11bTogMCwKKyAgICBwYXR0ZXJuOiAwLAorICAgIHBs YWNlaG9sZGVyOiAwLAorICAgIHBsYXlzSW5saW5lOiBIQVNfQk9PTEVBTl9WQUxVRSwKKyAgICBw b3N0ZXI6IDAsCisgICAgcHJlbG9hZDogMCwKKyAgICBwcm9maWxlOiAwLAorICAgIHJhZGlvR3Jv dXA6IDAsCisgICAgcmVhZE9ubHk6IEhBU19CT09MRUFOX1ZBTFVFLAorICAgIHJlZmVycmVyUG9s aWN5OiAwLAorICAgIHJlbDogMCwKKyAgICByZXF1aXJlZDogSEFTX0JPT0xFQU5fVkFMVUUsCisg ICAgcmV2ZXJzZWQ6IEhBU19CT09MRUFOX1ZBTFVFLAorICAgIHJvbGU6IDAsCisgICAgcm93czog SEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUUsCisgICAgcm93U3BhbjogSEFTX05VTUVSSUNfVkFM VUUsCisgICAgc2FuZGJveDogMCwKKyAgICBzY29wZTogMCwKKyAgICBzY29wZWQ6IEhBU19CT09M RUFOX1ZBTFVFLAorICAgIHNjcm9sbGluZzogMCwKKyAgICBzZWFtbGVzczogSEFTX0JPT0xFQU5f VkFMVUUsCisgICAgc2VsZWN0ZWQ6IE1VU1RfVVNFX1BST1BFUlRZIHwgSEFTX0JPT0xFQU5fVkFM VUUsCisgICAgc2hhcGU6IDAsCisgICAgc2l6ZTogSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUUs CisgICAgc2l6ZXM6IDAsCisgICAgc3BhbjogSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUUsCisg ICAgc3BlbGxDaGVjazogMCwKKyAgICBzcmM6IDAsCisgICAgc3JjRG9jOiAwLAorICAgIHNyY0xh bmc6IDAsCisgICAgc3JjU2V0OiAwLAorICAgIHN0YXJ0OiBIQVNfTlVNRVJJQ19WQUxVRSwKKyAg ICBzdGVwOiAwLAorICAgIHN0eWxlOiAwLAorICAgIHN1bW1hcnk6IDAsCisgICAgdGFiSW5kZXg6 IDAsCisgICAgdGFyZ2V0OiAwLAorICAgIHRpdGxlOiAwLAorICAgIC8vIFNldHRpbmcgLnR5cGUg dGhyb3dzIG9uIG5vbi08aW5wdXQ+IHRhZ3MKKyAgICB0eXBlOiAwLAorICAgIHVzZU1hcDogMCwK KyAgICB2YWx1ZTogMCwKKyAgICB3aWR0aDogMCwKKyAgICB3bW9kZTogMCwKKyAgICB3cmFwOiAw LAorCisgICAgLyoqCisgICAgICogUkRGYSBQcm9wZXJ0aWVzCisgICAgICovCisgICAgYWJvdXQ6 IDAsCisgICAgZGF0YXR5cGU6IDAsCisgICAgaW5saXN0OiAwLAorICAgIHByZWZpeDogMCwKKyAg ICAvLyBwcm9wZXJ0eSBpcyBhbHNvIHN1cHBvcnRlZCBmb3IgT3BlbkdyYXBoIGluIG1ldGEgdGFn cy4KKyAgICBwcm9wZXJ0eTogMCwKKyAgICByZXNvdXJjZTogMCwKKyAgICAndHlwZW9mJzogMCwK KyAgICB2b2NhYjogMCwKKworICAgIC8qKgorICAgICAqIE5vbi1zdGFuZGFyZCBQcm9wZXJ0aWVz CisgICAgICovCisgICAgLy8gYXV0b0NhcGl0YWxpemUgYW5kIGF1dG9Db3JyZWN0IGFyZSBzdXBw b3J0ZWQgaW4gTW9iaWxlIFNhZmFyaSBmb3IKKyAgICAvLyBrZXlib2FyZCBoaW50cy4KKyAgICBh dXRvQ2FwaXRhbGl6ZTogMCwKKyAgICBhdXRvQ29ycmVjdDogMCwKKyAgICAvLyBhdXRvU2F2ZSBh bGxvd3MgV2ViS2l0L0JsaW5rIHRvIHBlcnNpc3QgdmFsdWVzIG9mIGlucHV0IGZpZWxkcyBvbiBw YWdlIHJlbG9hZHMKKyAgICBhdXRvU2F2ZTogMCwKKyAgICAvLyBjb2xvciBpcyBmb3IgU2FmYXJp IG1hc2staWNvbiBsaW5rCisgICAgY29sb3I6IDAsCisgICAgLy8gaXRlbVByb3AsIGl0ZW1TY29w ZSwgaXRlbVR5cGUgYXJlIGZvcgorICAgIC8vIE1pY3JvZGF0YSBzdXBwb3J0LiBTZWUgaHR0cDov L3NjaGVtYS5vcmcvZG9jcy9ncy5odG1sCisgICAgaXRlbVByb3A6IDAsCisgICAgaXRlbVNjb3Bl OiBIQVNfQk9PTEVBTl9WQUxVRSwKKyAgICBpdGVtVHlwZTogMCwKKyAgICAvLyBpdGVtSUQgYW5k IGl0ZW1SZWYgYXJlIGZvciBNaWNyb2RhdGEgc3VwcG9ydCBhcyB3ZWxsIGJ1dAorICAgIC8vIG9u bHkgc3BlY2lmaWVkIGluIHRoZSBXSEFUV0cgc3BlYyBkb2N1bWVudC4gU2VlCisgICAgLy8gaHR0 cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvbWljcm9kYXRhLmh0bWwjbWljcm9k YXRhLWRvbS1hcGkKKyAgICBpdGVtSUQ6IDAsCisgICAgaXRlbVJlZjogMCwKKyAgICAvLyByZXN1 bHRzIHNob3cgbG9va2luZyBnbGFzcyBpY29uIGFuZCByZWNlbnQgc2VhcmNoZXMgb24gaW5wdXQK KyAgICAvLyBzZWFyY2ggZmllbGRzIGluIFdlYktpdC9CbGluaworICAgIHJlc3VsdHM6IDAsCisg ICAgLy8gSUUtb25seSBhdHRyaWJ1dGUgdGhhdCBzcGVjaWZpZXMgc2VjdXJpdHkgcmVzdHJpY3Rp b25zIG9uIGFuIGlmcmFtZQorICAgIC8vIGFzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBzYW5kYm94 IGF0dHJpYnV0ZSBvbiBJRTwxMAorICAgIHNlY3VyaXR5OiAwLAorICAgIC8vIElFLW9ubHkgYXR0 cmlidXRlIHRoYXQgY29udHJvbHMgZm9jdXMgYmVoYXZpb3IKKyAgICB1bnNlbGVjdGFibGU6IDAK KyAgfSwKKyAgRE9NQXR0cmlidXRlTmFtZXM6IHsKKyAgICBhY2NlcHRDaGFyc2V0OiAnYWNjZXB0 LWNoYXJzZXQnLAorICAgIGNsYXNzTmFtZTogJ2NsYXNzJywKKyAgICBodG1sRm9yOiAnZm9yJywK KyAgICBodHRwRXF1aXY6ICdodHRwLWVxdWl2JworICB9LAorICBET01Qcm9wZXJ0eU5hbWVzOiB7 fQorfTsKKworbW9kdWxlLmV4cG9ydHMgPSBIVE1MRE9NUHJvcGVydHlDb25maWc7Cit9LHsiMTEi OjExfV0sMjI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5 cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZl ZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5 bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJl Y3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0 ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBk aXJlY3RvcnkuCisgKgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOworCisvKioKKyAqIEVzY2Fw ZSBhbmQgd3JhcCBrZXkgc28gaXQgaXMgc2FmZSB0byB1c2UgYXMgYSByZWFjdGlkCisgKgorICog QHBhcmFtIHtzdHJpbmd9IGtleSB0byBiZSBlc2NhcGVkLgorICogQHJldHVybiB7c3RyaW5nfSB0 aGUgZXNjYXBlZCBrZXkuCisgKi8KKworZnVuY3Rpb24gZXNjYXBlKGtleSkgeworICB2YXIgZXNj YXBlUmVnZXggPSAvWz06XS9nOworICB2YXIgZXNjYXBlckxvb2t1cCA9IHsKKyAgICAnPSc6ICc9 MCcsCisgICAgJzonOiAnPTInCisgIH07CisgIHZhciBlc2NhcGVkU3RyaW5nID0gKCcnICsga2V5 KS5yZXBsYWNlKGVzY2FwZVJlZ2V4LCBmdW5jdGlvbiAobWF0Y2gpIHsKKyAgICByZXR1cm4gZXNj YXBlckxvb2t1cFttYXRjaF07CisgIH0pOworCisgIHJldHVybiAnJCcgKyBlc2NhcGVkU3RyaW5n OworfQorCisvKioKKyAqIFVuZXNjYXBlIGFuZCB1bndyYXAga2V5IGZvciBodW1hbi1yZWFkYWJs ZSBkaXNwbGF5CisgKgorICogQHBhcmFtIHtzdHJpbmd9IGtleSB0byB1bmVzY2FwZS4KKyAqIEBy ZXR1cm4ge3N0cmluZ30gdGhlIHVuZXNjYXBlZCBrZXkuCisgKi8KK2Z1bmN0aW9uIHVuZXNjYXBl KGtleSkgeworICB2YXIgdW5lc2NhcGVSZWdleCA9IC8oPTB8PTIpL2c7CisgIHZhciB1bmVzY2Fw ZXJMb29rdXAgPSB7CisgICAgJz0wJzogJz0nLAorICAgICc9Mic6ICc6JworICB9OworICB2YXIg a2V5U3Vic3RyaW5nID0ga2V5WzBdID09PSAnLicgJiYga2V5WzFdID09PSAnJCcgPyBrZXkuc3Vi c3RyaW5nKDIpIDoga2V5LnN1YnN0cmluZygxKTsKKworICByZXR1cm4gKCcnICsga2V5U3Vic3Ry aW5nKS5yZXBsYWNlKHVuZXNjYXBlUmVnZXgsIGZ1bmN0aW9uIChtYXRjaCkgeworICAgIHJldHVy biB1bmVzY2FwZXJMb29rdXBbbWF0Y2hdOworICB9KTsKK30KKwordmFyIEtleUVzY2FwZVV0aWxz ID0geworICBlc2NhcGU6IGVzY2FwZSwKKyAgdW5lc2NhcGU6IHVuZXNjYXBlCit9OworCittb2R1 bGUuZXhwb3J0cyA9IEtleUVzY2FwZVV0aWxzOworfSx7fV0sMjM6W2Z1bmN0aW9uKF9kZXJlcV8s bW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9v aywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2Rl IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAq IExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4g QW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4g dGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ug c3RyaWN0JzsKKwordmFyIF9wcm9kSW52YXJpYW50ID0gX2RlcmVxXygxMTYpOworCit2YXIgUmVh Y3QgPSBfZGVyZXFfKDEyNCk7Cit2YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSBfZGVyZXFfKDY2 KTsKKwordmFyIGludmFyaWFudCA9IF9kZXJlcV8oMTQwKTsKK3ZhciB3YXJuaW5nID0gX2RlcmVx XygxNDcpOworCit2YXIgaGFzUmVhZE9ubHlWYWx1ZSA9IHsKKyAgJ2J1dHRvbic6IHRydWUsCisg ICdjaGVja2JveCc6IHRydWUsCisgICdpbWFnZSc6IHRydWUsCisgICdoaWRkZW4nOiB0cnVlLAor ICAncmFkaW8nOiB0cnVlLAorICAncmVzZXQnOiB0cnVlLAorICAnc3VibWl0JzogdHJ1ZQorfTsK KworZnVuY3Rpb24gX2Fzc2VydFNpbmdsZUxpbmsoaW5wdXRQcm9wcykgeworICAhKGlucHV0UHJv cHMuY2hlY2tlZExpbmsgPT0gbnVsbCB8fCBpbnB1dFByb3BzLnZhbHVlTGluayA9PSBudWxsKSA/ ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0Nhbm5v dCBwcm92aWRlIGEgY2hlY2tlZExpbmsgYW5kIGEgdmFsdWVMaW5rLiBJZiB5b3Ugd2FudCB0byB1 c2UgY2hlY2tlZExpbmssIHlvdSBwcm9iYWJseSBkb25cJ3Qgd2FudCB0byB1c2UgdmFsdWVMaW5r IGFuZCB2aWNlIHZlcnNhLicpIDogX3Byb2RJbnZhcmlhbnQoJzg3JykgOiB2b2lkIDA7Cit9Citm dW5jdGlvbiBfYXNzZXJ0VmFsdWVMaW5rKGlucHV0UHJvcHMpIHsKKyAgX2Fzc2VydFNpbmdsZUxp bmsoaW5wdXRQcm9wcyk7CisgICEoaW5wdXRQcm9wcy52YWx1ZSA9PSBudWxsICYmIGlucHV0UHJv cHMub25DaGFuZ2UgPT0gbnVsbCkgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBp bnZhcmlhbnQoZmFsc2UsICdDYW5ub3QgcHJvdmlkZSBhIHZhbHVlTGluayBhbmQgYSB2YWx1ZSBv ciBvbkNoYW5nZSBldmVudC4gSWYgeW91IHdhbnQgdG8gdXNlIHZhbHVlIG9yIG9uQ2hhbmdlLCB5 b3UgcHJvYmFibHkgZG9uXCd0IHdhbnQgdG8gdXNlIHZhbHVlTGluay4nKSA6IF9wcm9kSW52YXJp YW50KCc4OCcpIDogdm9pZCAwOworfQorCitmdW5jdGlvbiBfYXNzZXJ0Q2hlY2tlZExpbmsoaW5w dXRQcm9wcykgeworICBfYXNzZXJ0U2luZ2xlTGluayhpbnB1dFByb3BzKTsKKyAgIShpbnB1dFBy b3BzLmNoZWNrZWQgPT0gbnVsbCAmJiBpbnB1dFByb3BzLm9uQ2hhbmdlID09IG51bGwpID8gImRl dmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnQ2Fubm90IHBy b3ZpZGUgYSBjaGVja2VkTGluayBhbmQgYSBjaGVja2VkIHByb3BlcnR5IG9yIG9uQ2hhbmdlIGV2 ZW50LiBJZiB5b3Ugd2FudCB0byB1c2UgY2hlY2tlZCBvciBvbkNoYW5nZSwgeW91IHByb2JhYmx5 IGRvblwndCB3YW50IHRvIHVzZSBjaGVja2VkTGluaycpIDogX3Byb2RJbnZhcmlhbnQoJzg5Jykg OiB2b2lkIDA7Cit9CisKK3ZhciBwcm9wVHlwZXMgPSB7CisgIHZhbHVlOiBmdW5jdGlvbiAocHJv cHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lKSB7CisgICAgaWYgKCFwcm9wc1twcm9wTmFtZV0g fHwgaGFzUmVhZE9ubHlWYWx1ZVtwcm9wcy50eXBlXSB8fCBwcm9wcy5vbkNoYW5nZSB8fCBwcm9w cy5yZWFkT25seSB8fCBwcm9wcy5kaXNhYmxlZCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAg fQorICAgIHJldHVybiBuZXcgRXJyb3IoJ1lvdSBwcm92aWRlZCBhIGB2YWx1ZWAgcHJvcCB0byBh IGZvcm0gZmllbGQgd2l0aG91dCBhbiAnICsgJ2BvbkNoYW5nZWAgaGFuZGxlci4gVGhpcyB3aWxs IHJlbmRlciBhIHJlYWQtb25seSBmaWVsZC4gSWYgJyArICd0aGUgZmllbGQgc2hvdWxkIGJlIG11 dGFibGUgdXNlIGBkZWZhdWx0VmFsdWVgLiBPdGhlcndpc2UsICcgKyAnc2V0IGVpdGhlciBgb25D aGFuZ2VgIG9yIGByZWFkT25seWAuJyk7CisgIH0sCisgIGNoZWNrZWQ6IGZ1bmN0aW9uIChwcm9w cywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUpIHsKKyAgICBpZiAoIXByb3BzW3Byb3BOYW1lXSB8 fCBwcm9wcy5vbkNoYW5nZSB8fCBwcm9wcy5yZWFkT25seSB8fCBwcm9wcy5kaXNhYmxlZCkgewor ICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIHJldHVybiBuZXcgRXJyb3IoJ1lvdSBwcm92 aWRlZCBhIGBjaGVja2VkYCBwcm9wIHRvIGEgZm9ybSBmaWVsZCB3aXRob3V0IGFuICcgKyAnYG9u Q2hhbmdlYCBoYW5kbGVyLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiBJZiAn ICsgJ3RoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRDaGVja2VkYC4gT3Ro ZXJ3aXNlLCAnICsgJ3NldCBlaXRoZXIgYG9uQ2hhbmdlYCBvciBgcmVhZE9ubHlgLicpOworICB9 LAorICBvbkNoYW5nZTogUmVhY3QuUHJvcFR5cGVzLmZ1bmMKK307CisKK3ZhciBsb2dnZWRUeXBl RmFpbHVyZXMgPSB7fTsKK2Z1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShvd25l cikgeworICBpZiAob3duZXIpIHsKKyAgICB2YXIgbmFtZSA9IG93bmVyLmdldE5hbWUoKTsKKyAg ICBpZiAobmFtZSkgeworICAgICAgcmV0dXJuICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2Yg YCcgKyBuYW1lICsgJ2AuJzsKKyAgICB9CisgIH0KKyAgcmV0dXJuICcnOworfQorCisvKioKKyAq IFByb3ZpZGUgYSBsaW5rZWQgYHZhbHVlYCBhdHRyaWJ1dGUgZm9yIGNvbnRyb2xsZWQgZm9ybXMu IFlvdSBzaG91bGQgbm90IHVzZQorICogdGhpcyBvdXRzaWRlIG9mIHRoZSBSZWFjdERPTSBjb250 cm9sbGVkIGZvcm0gY29tcG9uZW50cy4KKyAqLwordmFyIExpbmtlZFZhbHVlVXRpbHMgPSB7Cisg IGNoZWNrUHJvcFR5cGVzOiBmdW5jdGlvbiAodGFnTmFtZSwgcHJvcHMsIG93bmVyKSB7CisgICAg Zm9yICh2YXIgcHJvcE5hbWUgaW4gcHJvcFR5cGVzKSB7CisgICAgICBpZiAocHJvcFR5cGVzLmhh c093blByb3BlcnR5KHByb3BOYW1lKSkgeworICAgICAgICB2YXIgZXJyb3IgPSBwcm9wVHlwZXNb cHJvcE5hbWVdKHByb3BzLCBwcm9wTmFtZSwgdGFnTmFtZSwgJ3Byb3AnLCBudWxsLCBSZWFjdFBy b3BUeXBlc1NlY3JldCk7CisgICAgICB9CisgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJv ciAmJiAhKGVycm9yLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkgeworICAgICAgICAv LyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBi ZSBhIGxvdCBvZiB0aGUKKyAgICAgICAgLy8gc2FtZSBlcnJvci4KKyAgICAgICAgbG9nZ2VkVHlw ZUZhaWx1cmVzW2Vycm9yLm1lc3NhZ2VdID0gdHJ1ZTsKKworICAgICAgICB2YXIgYWRkZW5kdW0g PSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0ob3duZXIpOworICAgICAgICAiZGV2ZWxvcG1l bnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnRmFpbGVkIGZvcm0gcHJvcFR5 cGU6ICVzJXMnLCBlcnJvci5tZXNzYWdlLCBhZGRlbmR1bSkgOiB2b2lkIDA7CisgICAgICB9Cisg ICAgfQorICB9LAorCisgIC8qKgorICAgKiBAcGFyYW0ge29iamVjdH0gaW5wdXRQcm9wcyBQcm9w cyBmb3IgZm9ybSBjb21wb25lbnQKKyAgICogQHJldHVybiB7Kn0gY3VycmVudCB2YWx1ZSBvZiB0 aGUgaW5wdXQgZWl0aGVyIGZyb20gdmFsdWUgcHJvcCBvciBsaW5rLgorICAgKi8KKyAgZ2V0VmFs dWU6IGZ1bmN0aW9uIChpbnB1dFByb3BzKSB7CisgICAgaWYgKGlucHV0UHJvcHMudmFsdWVMaW5r KSB7CisgICAgICBfYXNzZXJ0VmFsdWVMaW5rKGlucHV0UHJvcHMpOworICAgICAgcmV0dXJuIGlu cHV0UHJvcHMudmFsdWVMaW5rLnZhbHVlOworICAgIH0KKyAgICByZXR1cm4gaW5wdXRQcm9wcy52 YWx1ZTsKKyAgfSwKKworICAvKioKKyAgICogQHBhcmFtIHtvYmplY3R9IGlucHV0UHJvcHMgUHJv cHMgZm9yIGZvcm0gY29tcG9uZW50CisgICAqIEByZXR1cm4geyp9IGN1cnJlbnQgY2hlY2tlZCBz dGF0dXMgb2YgdGhlIGlucHV0IGVpdGhlciBmcm9tIGNoZWNrZWQgcHJvcAorICAgKiAgICAgICAg ICAgICBvciBsaW5rLgorICAgKi8KKyAgZ2V0Q2hlY2tlZDogZnVuY3Rpb24gKGlucHV0UHJvcHMp IHsKKyAgICBpZiAoaW5wdXRQcm9wcy5jaGVja2VkTGluaykgeworICAgICAgX2Fzc2VydENoZWNr ZWRMaW5rKGlucHV0UHJvcHMpOworICAgICAgcmV0dXJuIGlucHV0UHJvcHMuY2hlY2tlZExpbmsu dmFsdWU7CisgICAgfQorICAgIHJldHVybiBpbnB1dFByb3BzLmNoZWNrZWQ7CisgIH0sCisKKyAg LyoqCisgICAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dFByb3BzIFByb3BzIGZvciBmb3JtIGNvbXBv bmVudAorICAgKiBAcGFyYW0ge1N5bnRoZXRpY0V2ZW50fSBldmVudCBjaGFuZ2UgZXZlbnQgdG8g aGFuZGxlCisgICAqLworICBleGVjdXRlT25DaGFuZ2U6IGZ1bmN0aW9uIChpbnB1dFByb3BzLCBl dmVudCkgeworICAgIGlmIChpbnB1dFByb3BzLnZhbHVlTGluaykgeworICAgICAgX2Fzc2VydFZh bHVlTGluayhpbnB1dFByb3BzKTsKKyAgICAgIHJldHVybiBpbnB1dFByb3BzLnZhbHVlTGluay5y ZXF1ZXN0Q2hhbmdlKGV2ZW50LnRhcmdldC52YWx1ZSk7CisgICAgfSBlbHNlIGlmIChpbnB1dFBy b3BzLmNoZWNrZWRMaW5rKSB7CisgICAgICBfYXNzZXJ0Q2hlY2tlZExpbmsoaW5wdXRQcm9wcyk7 CisgICAgICByZXR1cm4gaW5wdXRQcm9wcy5jaGVja2VkTGluay5yZXF1ZXN0Q2hhbmdlKGV2ZW50 LnRhcmdldC5jaGVja2VkKTsKKyAgICB9IGVsc2UgaWYgKGlucHV0UHJvcHMub25DaGFuZ2UpIHsK KyAgICAgIHJldHVybiBpbnB1dFByb3BzLm9uQ2hhbmdlLmNhbGwodW5kZWZpbmVkLCBldmVudCk7 CisgICAgfQorICB9Cit9OworCittb2R1bGUuZXhwb3J0cyA9IExpbmtlZFZhbHVlVXRpbHM7Cit9 LHsiMTE2IjoxMTYsIjEyNCI6MTI0LCIxNDAiOjE0MCwiMTQ3IjoxNDcsIjY2Ijo2Nn1dLDI0Oltm dW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMt cHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog VGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2Ug Zm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRo aXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMg Y2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5Lgor ICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9wcm9kSW52YXJpYW50ID0gX2Rl cmVxXygxMTYpOworCit2YXIgaW52YXJpYW50ID0gX2RlcmVxXygxNDApOworCisvKioKKyAqIFN0 YXRpYyBwb29sZXJzLiBTZXZlcmFsIGN1c3RvbSB2ZXJzaW9ucyBmb3IgZWFjaCBwb3RlbnRpYWwg bnVtYmVyIG9mCisgKiBhcmd1bWVudHMuIEEgY29tcGxldGVseSBnZW5lcmljIHBvb2xlciBpcyBl YXN5IHRvIGltcGxlbWVudCwgYnV0IHdvdWxkCisgKiByZXF1aXJlIGFjY2Vzc2luZyB0aGUgYGFy Z3VtZW50c2Agb2JqZWN0LiBJbiBlYWNoIG9mIHRoZXNlLCBgdGhpc2AgcmVmZXJzIHRvCisgKiB0 aGUgQ2xhc3MgaXRzZWxmLCBub3QgYW4gaW5zdGFuY2UuIElmIGFueSBvdGhlcnMgYXJlIG5lZWRl ZCwgc2ltcGx5IGFkZCB0aGVtCisgKiBoZXJlLCBvciBpbiB0aGVpciBvd24gZmlsZXMuCisgKi8K K3ZhciBvbmVBcmd1bWVudFBvb2xlciA9IGZ1bmN0aW9uIChjb3B5RmllbGRzRnJvbSkgeworICB2 YXIgS2xhc3MgPSB0aGlzOworICBpZiAoS2xhc3MuaW5zdGFuY2VQb29sLmxlbmd0aCkgeworICAg IHZhciBpbnN0YW5jZSA9IEtsYXNzLmluc3RhbmNlUG9vbC5wb3AoKTsKKyAgICBLbGFzcy5jYWxs KGluc3RhbmNlLCBjb3B5RmllbGRzRnJvbSk7CisgICAgcmV0dXJuIGluc3RhbmNlOworICB9IGVs c2UgeworICAgIHJldHVybiBuZXcgS2xhc3MoY29weUZpZWxkc0Zyb20pOworICB9Cit9OworCit2 YXIgdHdvQXJndW1lbnRQb29sZXIgPSBmdW5jdGlvbiAoYTEsIGEyKSB7CisgIHZhciBLbGFzcyA9 IHRoaXM7CisgIGlmIChLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoKSB7CisgICAgdmFyIGluc3Rh bmNlID0gS2xhc3MuaW5zdGFuY2VQb29sLnBvcCgpOworICAgIEtsYXNzLmNhbGwoaW5zdGFuY2Us IGExLCBhMik7CisgICAgcmV0dXJuIGluc3RhbmNlOworICB9IGVsc2UgeworICAgIHJldHVybiBu ZXcgS2xhc3MoYTEsIGEyKTsKKyAgfQorfTsKKwordmFyIHRocmVlQXJndW1lbnRQb29sZXIgPSBm dW5jdGlvbiAoYTEsIGEyLCBhMykgeworICB2YXIgS2xhc3MgPSB0aGlzOworICBpZiAoS2xhc3Mu aW5zdGFuY2VQb29sLmxlbmd0aCkgeworICAgIHZhciBpbnN0YW5jZSA9IEtsYXNzLmluc3RhbmNl UG9vbC5wb3AoKTsKKyAgICBLbGFzcy5jYWxsKGluc3RhbmNlLCBhMSwgYTIsIGEzKTsKKyAgICBy ZXR1cm4gaW5zdGFuY2U7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5ldyBLbGFzcyhhMSwgYTIs IGEzKTsKKyAgfQorfTsKKwordmFyIGZvdXJBcmd1bWVudFBvb2xlciA9IGZ1bmN0aW9uIChhMSwg YTIsIGEzLCBhNCkgeworICB2YXIgS2xhc3MgPSB0aGlzOworICBpZiAoS2xhc3MuaW5zdGFuY2VQ b29sLmxlbmd0aCkgeworICAgIHZhciBpbnN0YW5jZSA9IEtsYXNzLmluc3RhbmNlUG9vbC5wb3Ao KTsKKyAgICBLbGFzcy5jYWxsKGluc3RhbmNlLCBhMSwgYTIsIGEzLCBhNCk7CisgICAgcmV0dXJu IGluc3RhbmNlOworICB9IGVsc2UgeworICAgIHJldHVybiBuZXcgS2xhc3MoYTEsIGEyLCBhMywg YTQpOworICB9Cit9OworCit2YXIgc3RhbmRhcmRSZWxlYXNlciA9IGZ1bmN0aW9uIChpbnN0YW5j ZSkgeworICB2YXIgS2xhc3MgPSB0aGlzOworICAhKGluc3RhbmNlIGluc3RhbmNlb2YgS2xhc3Mp ID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnVHJ5 aW5nIHRvIHJlbGVhc2UgYW4gaW5zdGFuY2UgaW50byBhIHBvb2wgb2YgYSBkaWZmZXJlbnQgdHlw ZS4nKSA6IF9wcm9kSW52YXJpYW50KCcyNScpIDogdm9pZCAwOworICBpbnN0YW5jZS5kZXN0cnVj dG9yKCk7CisgIGlmIChLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoIDwgS2xhc3MucG9vbFNpemUp IHsKKyAgICBLbGFzcy5pbnN0YW5jZVBvb2wucHVzaChpbnN0YW5jZSk7CisgIH0KK307CisKK3Zh ciBERUZBVUxUX1BPT0xfU0laRSA9IDEwOwordmFyIERFRkFVTFRfUE9PTEVSID0gb25lQXJndW1l bnRQb29sZXI7CisKKy8qKgorICogQXVnbWVudHMgYENvcHlDb25zdHJ1Y3RvcmAgdG8gYmUgYSBw b29sYWJsZSBjbGFzcywgYXVnbWVudGluZyBvbmx5IHRoZSBjbGFzcworICogaXRzZWxmIChzdGF0 aWNhbGx5KSBub3QgYWRkaW5nIGFueSBwcm90b3R5cGljYWwgZmllbGRzLiBBbnkgQ29weUNvbnN0 cnVjdG9yCisgKiB5b3UgZ2l2ZSB0aGlzIG1heSBoYXZlIGEgYHBvb2xTaXplYCBwcm9wZXJ0eSwg YW5kIHdpbGwgbG9vayBmb3IgYQorICogcHJvdG90eXBpY2FsIGBkZXN0cnVjdG9yYCBvbiBpbnN0 YW5jZXMuCisgKgorICogQHBhcmFtIHtGdW5jdGlvbn0gQ29weUNvbnN0cnVjdG9yIENvbnN0cnVj dG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVzZXQuCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwb29s ZXIgQ3VzdG9taXphYmxlIHBvb2xlci4KKyAqLwordmFyIGFkZFBvb2xpbmdUbyA9IGZ1bmN0aW9u IChDb3B5Q29uc3RydWN0b3IsIHBvb2xlcikgeworICAvLyBDYXN0aW5nIGFzIGFueSBzbyB0aGF0 IGZsb3cgaWdub3JlcyB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIGFuZCB0cnVzdHMKKyAgLy8g aXQgdG8gbWF0Y2ggdGhlIHR5cGUgd2UgZGVjbGFyZWQKKyAgdmFyIE5ld0tsYXNzID0gQ29weUNv bnN0cnVjdG9yOworICBOZXdLbGFzcy5pbnN0YW5jZVBvb2wgPSBbXTsKKyAgTmV3S2xhc3MuZ2V0 UG9vbGVkID0gcG9vbGVyIHx8IERFRkFVTFRfUE9PTEVSOworICBpZiAoIU5ld0tsYXNzLnBvb2xT aXplKSB7CisgICAgTmV3S2xhc3MucG9vbFNpemUgPSBERUZBVUxUX1BPT0xfU0laRTsKKyAgfQor ICBOZXdLbGFzcy5yZWxlYXNlID0gc3RhbmRhcmRSZWxlYXNlcjsKKyAgcmV0dXJuIE5ld0tsYXNz OworfTsKKwordmFyIFBvb2xlZENsYXNzID0geworICBhZGRQb29saW5nVG86IGFkZFBvb2xpbmdU bywKKyAgb25lQXJndW1lbnRQb29sZXI6IG9uZUFyZ3VtZW50UG9vbGVyLAorICB0d29Bcmd1bWVu dFBvb2xlcjogdHdvQXJndW1lbnRQb29sZXIsCisgIHRocmVlQXJndW1lbnRQb29sZXI6IHRocmVl QXJndW1lbnRQb29sZXIsCisgIGZvdXJBcmd1bWVudFBvb2xlcjogZm91ckFyZ3VtZW50UG9vbGVy Cit9OworCittb2R1bGUuZXhwb3J0cyA9IFBvb2xlZENsYXNzOworfSx7IjExNiI6MTE2LCIxNDAi OjE0MH1dLDI1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29w eXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2 ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0 eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGly ZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBh dGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUg ZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfYXNzaWduID0gX2Rl cmVxXygxNDgpOworCit2YXIgRXZlbnRQbHVnaW5SZWdpc3RyeSA9IF9kZXJlcV8oMTcpOwordmFy IFJlYWN0RXZlbnRFbWl0dGVyTWl4aW4gPSBfZGVyZXFfKDUxKTsKK3ZhciBWaWV3cG9ydE1ldHJp Y3MgPSBfZGVyZXFfKDk0KTsKKwordmFyIGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lID0gX2Rl cmVxXygxMTEpOwordmFyIGlzRXZlbnRTdXBwb3J0ZWQgPSBfZGVyZXFfKDExMyk7CisKKy8qKgor ICogU3VtbWFyeSBvZiBgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyYCBldmVudCBoYW5kbGluZzoK KyAqCisgKiAgLSBUb3AtbGV2ZWwgZGVsZWdhdGlvbiBpcyB1c2VkIHRvIHRyYXAgbW9zdCBuYXRp dmUgYnJvd3NlciBldmVudHMuIFRoaXMKKyAqICAgIG1heSBvbmx5IG9jY3VyIGluIHRoZSBtYWlu IHRocmVhZCBhbmQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mCisgKiAgICBSZWFjdEV2ZW50TGlz dGVuZXIsIHdoaWNoIGlzIGluamVjdGVkIGFuZCBjYW4gdGhlcmVmb3JlIHN1cHBvcnQgcGx1Z2dh YmxlCisgKiAgICBldmVudCBzb3VyY2VzLiBUaGlzIGlzIHRoZSBvbmx5IHdvcmsgdGhhdCBvY2N1 cnMgaW4gdGhlIG1haW4gdGhyZWFkLgorICoKKyAqICAtIFdlIG5vcm1hbGl6ZSBhbmQgZGUtZHVw bGljYXRlIGV2ZW50cyB0byBhY2NvdW50IGZvciBicm93c2VyIHF1aXJrcy4gVGhpcworICogICAg bWF5IGJlIGRvbmUgaW4gdGhlIHdvcmtlciB0aHJlYWQuCisgKgorICogIC0gRm9yd2FyZCB0aGVz ZSBuYXRpdmUgZXZlbnRzICh3aXRoIHRoZSBhc3NvY2lhdGVkIHRvcC1sZXZlbCB0eXBlIHVzZWQg dG8KKyAqICAgIHRyYXAgaXQpIHRvIGBFdmVudFBsdWdpbkh1YmAsIHdoaWNoIGluIHR1cm4gd2ls bCBhc2sgcGx1Z2lucyBpZiB0aGV5IHdhbnQKKyAqICAgIHRvIGV4dHJhY3QgYW55IHN5bnRoZXRp YyBldmVudHMuCisgKgorICogIC0gVGhlIGBFdmVudFBsdWdpbkh1YmAgd2lsbCB0aGVuIHByb2Nl c3MgZWFjaCBldmVudCBieSBhbm5vdGF0aW5nIHRoZW0gd2l0aAorICogICAgImRpc3BhdGNoZXMi LCBhIHNlcXVlbmNlIG9mIGxpc3RlbmVycyBhbmQgSURzIHRoYXQgY2FyZSBhYm91dCB0aGF0IGV2 ZW50LgorICoKKyAqICAtIFRoZSBgRXZlbnRQbHVnaW5IdWJgIHRoZW4gZGlzcGF0Y2hlcyB0aGUg ZXZlbnRzLgorICoKKyAqIE92ZXJ2aWV3IG9mIFJlYWN0IGFuZCB0aGUgZXZlbnQgc3lzdGVtOgor ICoKKyAqICstLS0tLS0tLS0tLS0rICAgIC4KKyAqIHwgICAgRE9NICAgICB8ICAgIC4KKyAqICst LS0tLS0tLS0tLS0rICAgIC4KKyAqICAgICAgIHwgICAgICAgICAgIC4KKyAqICAgICAgIHYgICAg ICAgICAgIC4KKyAqICstLS0tLS0tLS0tLS0rICAgIC4KKyAqIHwgUmVhY3RFdmVudCB8ICAgIC4K KyAqIHwgIExpc3RlbmVyICB8ICAgIC4KKyAqICstLS0tLS0tLS0tLS0rICAgIC4gICAgICAgICAg ICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tKworICogICAgICAgfCAgICAgICAgICAgLiAgICAg ICAgICAgICAgICstLS0tLS0tLSt8U2ltcGxlRXZlbnR8CisgKiAgICAgICB8ICAgICAgICAgICAu ICAgICAgICAgICAgICAgfCAgICAgICAgIHxQbHVnaW4gICAgIHwKKyAqICstLS0tLXwtLS0tLS0r ICAgIC4gICAgICAgICAgICAgICB2ICAgICAgICAgKy0tLS0tLS0tLS0tKworICogfCAgICAgfCAg ICAgIHwgICAgLiAgICArLS0tLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgICAgICArLS0tLS0t LS0tLS0tKworICogfCAgICAgKy0tLS0tLS0tLS0tLi0tLT58RXZlbnRQbHVnaW5IdWJ8ICAgICAg ICAgICAgICAgICAgICB8ICAgIEV2ZW50ICAgfAorICogfCAgICAgICAgICAgIHwgICAgLiAgICB8 ICAgICAgICAgICAgICB8ICAgICArLS0tLS0tLS0tLS0rICB8IFByb3BhZ2F0b3JzfAorICogfCBS ZWFjdEV2ZW50IHwgICAgLiAgICB8ICAgICAgICAgICAgICB8ICAgICB8VGFwRXZlbnQgICB8ICB8 LS0tLS0tLS0tLS0tfAorICogfCAgRW1pdHRlciAgIHwgICAgLiAgICB8ICAgICAgICAgICAgICB8 PC0tLSt8UGx1Z2luICAgICB8ICB8b3RoZXIgcGx1Z2lufAorICogfCAgICAgICAgICAgIHwgICAg LiAgICB8ICAgICAgICAgICAgICB8ICAgICArLS0tLS0tLS0tLS0rICB8ICB1dGlsaXRpZXMgfAor ICogfCAgICAgKy0tLS0tLS0tLS0tLi0tLT58ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAg ICAgICArLS0tLS0tLS0tLS0tKworICogfCAgICAgfCAgICAgIHwgICAgLiAgICArLS0tLS0tLS0t LS0tLS0rCisgKiArLS0tLS18LS0tLS0tKyAgICAuICAgICAgICAgICAgICAgIF4gICAgICAgICst LS0tLS0tLS0tLSsKKyAqICAgICAgIHwgICAgICAgICAgIC4gICAgICAgICAgICAgICAgfCAgICAg ICAgfEVudGVyL0xlYXZlfAorICogICAgICAgKyAgICAgICAgICAgLiAgICAgICAgICAgICAgICAr LS0tLS0tLSt8UGx1Z2luICAgICB8CisgKiArLS0tLS0tLS0tLS0tLSsgICAuICAgICAgICAgICAg ICAgICAgICAgICAgICstLS0tLS0tLS0tLSsKKyAqIHwgYXBwbGljYXRpb24gfCAgIC4KKyAqIHwt LS0tLS0tLS0tLS0tfCAgIC4KKyAqIHwgICAgICAgICAgICAgfCAgIC4KKyAqIHwgICAgICAgICAg ICAgfCAgIC4KKyAqICstLS0tLS0tLS0tLS0tKyAgIC4KKyAqICAgICAgICAgICAgICAgICAgIC4K KyAqICAgIFJlYWN0IENvcmUgICAgIC4gIEdlbmVyYWwgUHVycG9zZSBFdmVudCBQbHVnaW4gU3lz dGVtCisgKi8KKwordmFyIGhhc0V2ZW50UGFnZVhZOwordmFyIGFscmVhZHlMaXN0ZW5pbmdUbyA9 IHt9OwordmFyIGlzTW9uaXRvcmluZ1Njcm9sbFZhbHVlID0gZmFsc2U7Cit2YXIgcmVhY3RUb3BM aXN0ZW5lcnNDb3VudGVyID0gMDsKKworLy8gRm9yIGV2ZW50cyBsaWtlICdzdWJtaXQnIHdoaWNo IGRvbid0IGNvbnNpc3RlbnRseSBidWJibGUgKHdoaWNoIHdlIHRyYXAgYXQgYQorLy8gbG93ZXIg bm9kZSB0aGFuIGBkb2N1bWVudGApLCBiaW5kaW5nIGF0IGBkb2N1bWVudGAgd291bGQgY2F1c2Ug ZHVwbGljYXRlCisvLyBldmVudHMgc28gd2UgZG9uJ3QgaW5jbHVkZSB0aGVtIGhlcmUKK3ZhciB0 b3BFdmVudE1hcHBpbmcgPSB7CisgIHRvcEFib3J0OiAnYWJvcnQnLAorICB0b3BBbmltYXRpb25F bmQ6IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25lbmQnKSB8fCAnYW5pbWF0 aW9uZW5kJywKKyAgdG9wQW5pbWF0aW9uSXRlcmF0aW9uOiBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50 TmFtZSgnYW5pbWF0aW9uaXRlcmF0aW9uJykgfHwgJ2FuaW1hdGlvbml0ZXJhdGlvbicsCisgIHRv cEFuaW1hdGlvblN0YXJ0OiBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uc3Rh cnQnKSB8fCAnYW5pbWF0aW9uc3RhcnQnLAorICB0b3BCbHVyOiAnYmx1cicsCisgIHRvcENhblBs YXk6ICdjYW5wbGF5JywKKyAgdG9wQ2FuUGxheVRocm91Z2g6ICdjYW5wbGF5dGhyb3VnaCcsCisg IHRvcENoYW5nZTogJ2NoYW5nZScsCisgIHRvcENsaWNrOiAnY2xpY2snLAorICB0b3BDb21wb3Np dGlvbkVuZDogJ2NvbXBvc2l0aW9uZW5kJywKKyAgdG9wQ29tcG9zaXRpb25TdGFydDogJ2NvbXBv c2l0aW9uc3RhcnQnLAorICB0b3BDb21wb3NpdGlvblVwZGF0ZTogJ2NvbXBvc2l0aW9udXBkYXRl JywKKyAgdG9wQ29udGV4dE1lbnU6ICdjb250ZXh0bWVudScsCisgIHRvcENvcHk6ICdjb3B5JywK KyAgdG9wQ3V0OiAnY3V0JywKKyAgdG9wRG91YmxlQ2xpY2s6ICdkYmxjbGljaycsCisgIHRvcERy YWc6ICdkcmFnJywKKyAgdG9wRHJhZ0VuZDogJ2RyYWdlbmQnLAorICB0b3BEcmFnRW50ZXI6ICdk cmFnZW50ZXInLAorICB0b3BEcmFnRXhpdDogJ2RyYWdleGl0JywKKyAgdG9wRHJhZ0xlYXZlOiAn ZHJhZ2xlYXZlJywKKyAgdG9wRHJhZ092ZXI6ICdkcmFnb3ZlcicsCisgIHRvcERyYWdTdGFydDog J2RyYWdzdGFydCcsCisgIHRvcERyb3A6ICdkcm9wJywKKyAgdG9wRHVyYXRpb25DaGFuZ2U6ICdk dXJhdGlvbmNoYW5nZScsCisgIHRvcEVtcHRpZWQ6ICdlbXB0aWVkJywKKyAgdG9wRW5jcnlwdGVk OiAnZW5jcnlwdGVkJywKKyAgdG9wRW5kZWQ6ICdlbmRlZCcsCisgIHRvcEVycm9yOiAnZXJyb3In LAorICB0b3BGb2N1czogJ2ZvY3VzJywKKyAgdG9wSW5wdXQ6ICdpbnB1dCcsCisgIHRvcEtleURv d246ICdrZXlkb3duJywKKyAgdG9wS2V5UHJlc3M6ICdrZXlwcmVzcycsCisgIHRvcEtleVVwOiAn a2V5dXAnLAorICB0b3BMb2FkZWREYXRhOiAnbG9hZGVkZGF0YScsCisgIHRvcExvYWRlZE1ldGFk YXRhOiAnbG9hZGVkbWV0YWRhdGEnLAorICB0b3BMb2FkU3RhcnQ6ICdsb2Fkc3RhcnQnLAorICB0 b3BNb3VzZURvd246ICdtb3VzZWRvd24nLAorICB0b3BNb3VzZU1vdmU6ICdtb3VzZW1vdmUnLAor ICB0b3BNb3VzZU91dDogJ21vdXNlb3V0JywKKyAgdG9wTW91c2VPdmVyOiAnbW91c2VvdmVyJywK KyAgdG9wTW91c2VVcDogJ21vdXNldXAnLAorICB0b3BQYXN0ZTogJ3Bhc3RlJywKKyAgdG9wUGF1 c2U6ICdwYXVzZScsCisgIHRvcFBsYXk6ICdwbGF5JywKKyAgdG9wUGxheWluZzogJ3BsYXlpbmcn LAorICB0b3BQcm9ncmVzczogJ3Byb2dyZXNzJywKKyAgdG9wUmF0ZUNoYW5nZTogJ3JhdGVjaGFu Z2UnLAorICB0b3BTY3JvbGw6ICdzY3JvbGwnLAorICB0b3BTZWVrZWQ6ICdzZWVrZWQnLAorICB0 b3BTZWVraW5nOiAnc2Vla2luZycsCisgIHRvcFNlbGVjdGlvbkNoYW5nZTogJ3NlbGVjdGlvbmNo YW5nZScsCisgIHRvcFN0YWxsZWQ6ICdzdGFsbGVkJywKKyAgdG9wU3VzcGVuZDogJ3N1c3BlbmQn LAorICB0b3BUZXh0SW5wdXQ6ICd0ZXh0SW5wdXQnLAorICB0b3BUaW1lVXBkYXRlOiAndGltZXVw ZGF0ZScsCisgIHRvcFRvdWNoQ2FuY2VsOiAndG91Y2hjYW5jZWwnLAorICB0b3BUb3VjaEVuZDog J3RvdWNoZW5kJywKKyAgdG9wVG91Y2hNb3ZlOiAndG91Y2htb3ZlJywKKyAgdG9wVG91Y2hTdGFy dDogJ3RvdWNoc3RhcnQnLAorICB0b3BUcmFuc2l0aW9uRW5kOiBnZXRWZW5kb3JQcmVmaXhlZEV2 ZW50TmFtZSgndHJhbnNpdGlvbmVuZCcpIHx8ICd0cmFuc2l0aW9uZW5kJywKKyAgdG9wVm9sdW1l Q2hhbmdlOiAndm9sdW1lY2hhbmdlJywKKyAgdG9wV2FpdGluZzogJ3dhaXRpbmcnLAorICB0b3BX aGVlbDogJ3doZWVsJworfTsKKworLyoqCisgKiBUbyBlbnN1cmUgbm8gY29uZmxpY3RzIHdpdGgg b3RoZXIgcG90ZW50aWFsIFJlYWN0IGluc3RhbmNlcyBvbiB0aGUgcGFnZQorICovCit2YXIgdG9w TGlzdGVuZXJzSURLZXkgPSAnX3JlYWN0TGlzdGVuZXJzSUQnICsgU3RyaW5nKE1hdGgucmFuZG9t KCkpLnNsaWNlKDIpOworCitmdW5jdGlvbiBnZXRMaXN0ZW5pbmdGb3JEb2N1bWVudChtb3VudEF0 KSB7CisgIC8vIEluIElFOCwgYG1vdW50QXRgIGlzIGEgaG9zdCBvYmplY3QgYW5kIGRvZXNuJ3Qg aGF2ZSBgaGFzT3duUHJvcGVydHlgCisgIC8vIGRpcmVjdGx5LgorICBpZiAoIU9iamVjdC5wcm90 b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb3VudEF0LCB0b3BMaXN0ZW5lcnNJREtleSkpIHsK KyAgICBtb3VudEF0W3RvcExpc3RlbmVyc0lES2V5XSA9IHJlYWN0VG9wTGlzdGVuZXJzQ291bnRl cisrOworICAgIGFscmVhZHlMaXN0ZW5pbmdUb1ttb3VudEF0W3RvcExpc3RlbmVyc0lES2V5XV0g PSB7fTsKKyAgfQorICByZXR1cm4gYWxyZWFkeUxpc3RlbmluZ1RvW21vdW50QXRbdG9wTGlzdGVu ZXJzSURLZXldXTsKK30KKworLyoqCisgKiBgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyYCBpcyB1 c2VkIHRvIGF0dGFjaCB0b3AtbGV2ZWwgZXZlbnQgbGlzdGVuZXJzLiBGb3IKKyAqIGV4YW1wbGU6 CisgKgorICogICBFdmVudFBsdWdpbkh1Yi5wdXRMaXN0ZW5lcignbXlJRCcsICdvbkNsaWNrJywg bXlGdW5jdGlvbik7CisgKgorICogVGhpcyB3b3VsZCBhbGxvY2F0ZSBhICJyZWdpc3RyYXRpb24i IG9mIGAoJ29uQ2xpY2snLCBteUZ1bmN0aW9uKWAgb24gJ215SUQnLgorICoKKyAqIEBpbnRlcm5h bAorICovCit2YXIgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyID0gX2Fzc2lnbih7fSwgUmVhY3RF dmVudEVtaXR0ZXJNaXhpbiwgeworCisgIC8qKgorICAgKiBJbmplY3RhYmxlIGV2ZW50IGJhY2tl bmQKKyAgICovCisgIFJlYWN0RXZlbnRMaXN0ZW5lcjogbnVsbCwKKworICBpbmplY3Rpb246IHsK KyAgICAvKioKKyAgICAgKiBAcGFyYW0ge29iamVjdH0gUmVhY3RFdmVudExpc3RlbmVyCisgICAg ICovCisgICAgaW5qZWN0UmVhY3RFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAoUmVhY3RFdmVudExp c3RlbmVyKSB7CisgICAgICBSZWFjdEV2ZW50TGlzdGVuZXIuc2V0SGFuZGxlVG9wTGV2ZWwoUmVh Y3RCcm93c2VyRXZlbnRFbWl0dGVyLmhhbmRsZVRvcExldmVsKTsKKyAgICAgIFJlYWN0QnJvd3Nl ckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIgPSBSZWFjdEV2ZW50TGlzdGVuZXI7Cisg ICAgfQorICB9LAorCisgIC8qKgorICAgKiBTZXRzIHdoZXRoZXIgb3Igbm90IGFueSBjcmVhdGVk IGNhbGxiYWNrcyBzaG91bGQgYmUgZW5hYmxlZC4KKyAgICoKKyAgICogQHBhcmFtIHtib29sZWFu fSBlbmFibGVkIFRydWUgaWYgY2FsbGJhY2tzIHNob3VsZCBiZSBlbmFibGVkLgorICAgKi8KKyAg c2V0RW5hYmxlZDogZnVuY3Rpb24gKGVuYWJsZWQpIHsKKyAgICBpZiAoUmVhY3RCcm93c2VyRXZl bnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lcikgeworICAgICAgUmVhY3RCcm93c2VyRXZlbnRF bWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci5zZXRFbmFibGVkKGVuYWJsZWQpOworICAgIH0KKyAg fSwKKworICAvKioKKyAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBjYWxsYmFja3MgYXJl IGVuYWJsZWQuCisgICAqLworICBpc0VuYWJsZWQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4g ISEoUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lciAmJiBSZWFjdEJy b3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLmlzRW5hYmxlZCgpKTsKKyAgfSwK KworICAvKioKKyAgICogV2UgbGlzdGVuIGZvciBidWJibGVkIHRvdWNoIGV2ZW50cyBvbiB0aGUg ZG9jdW1lbnQgb2JqZWN0LgorICAgKgorICAgKiBGaXJlZm94IHY4LjAxIChhbmQgcG9zc2libHkg b3RoZXJzKSBleGhpYml0ZWQgc3RyYW5nZSBiZWhhdmlvciB3aGVuCisgICAqIG1vdW50aW5nIGBv bm1vdXNlbW92ZWAgZXZlbnRzIGF0IHNvbWUgbm9kZSB0aGF0IHdhcyBub3QgdGhlIGRvY3VtZW50 CisgICAqIGVsZW1lbnQuIFRoZSBzeW1wdG9tcyB3ZXJlIHRoYXQgaWYgeW91ciBtb3VzZSBpcyBu b3QgbW92aW5nIG92ZXIgc29tZXRoaW5nCisgICAqIGNvbnRhaW5lZCB3aXRoaW4gdGhhdCBtb3Vu dCBwb2ludCAoZm9yIGV4YW1wbGUgb24gdGhlIGJhY2tncm91bmQpIHRoZQorICAgKiB0b3AtbGV2 ZWwgbGlzdGVuZXJzIGZvciBgb25tb3VzZW1vdmVgIHdvbid0IGJlIGNhbGxlZC4gSG93ZXZlciwg aWYgeW91CisgICAqIHJlZ2lzdGVyIHRoZSBgbW91c2Vtb3ZlYCBvbiB0aGUgZG9jdW1lbnQgb2Jq ZWN0LCB0aGVuIGl0IHdpbGwgb2YgY291cnNlCisgICAqIGNhdGNoIGFsbCBgbW91c2Vtb3ZlYHMu IFRoaXMgYWxvbmcgd2l0aCBpT1MgcXVpcmtzLCBqdXN0aWZpZXMgcmVzdHJpY3RpbmcKKyAgICog dG9wLWxldmVsIGxpc3RlbmVycyB0byB0aGUgZG9jdW1lbnQgb2JqZWN0IG9ubHksIGF0IGxlYXN0 IGZvciB0aGVzZQorICAgKiBtb3ZlbWVudCB0eXBlcyBvZiBldmVudHMgYW5kIHBvc3NpYmx5IGFs bCBldmVudHMuCisgICAqCisgICAqIEBzZWUgaHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9n L2FyY2hpdmVzLzIwMTAvMDkvY2xpY2tfZXZlbnRfZGVsLmh0bWwKKyAgICoKKyAgICogQWxzbywg YGtleXVwYC9ga2V5cHJlc3NgL2BrZXlkb3duYCBkbyBub3QgYnViYmxlIHRvIHRoZSB3aW5kb3cg b24gSUUsIGJ1dAorICAgKiB0aGV5IGJ1YmJsZSB0byBkb2N1bWVudC4KKyAgICoKKyAgICogQHBh cmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbk5hbWUgTmFtZSBvZiBsaXN0ZW5lciAoZS5nLiBgb25D bGlja2ApLgorICAgKiBAcGFyYW0ge29iamVjdH0gY29udGVudERvY3VtZW50SGFuZGxlIERvY3Vt ZW50IHdoaWNoIG93bnMgdGhlIGNvbnRhaW5lcgorICAgKi8KKyAgbGlzdGVuVG86IGZ1bmN0aW9u IChyZWdpc3RyYXRpb25OYW1lLCBjb250ZW50RG9jdW1lbnRIYW5kbGUpIHsKKyAgICB2YXIgbW91 bnRBdCA9IGNvbnRlbnREb2N1bWVudEhhbmRsZTsKKyAgICB2YXIgaXNMaXN0ZW5pbmcgPSBnZXRM aXN0ZW5pbmdGb3JEb2N1bWVudChtb3VudEF0KTsKKyAgICB2YXIgZGVwZW5kZW5jaWVzID0gRXZl bnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlv bk5hbWVdOworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXBlbmRlbmNpZXMubGVuZ3RoOyBp KyspIHsKKyAgICAgIHZhciBkZXBlbmRlbmN5ID0gZGVwZW5kZW5jaWVzW2ldOworICAgICAgaWYg KCEoaXNMaXN0ZW5pbmcuaGFzT3duUHJvcGVydHkoZGVwZW5kZW5jeSkgJiYgaXNMaXN0ZW5pbmdb ZGVwZW5kZW5jeV0pKSB7CisgICAgICAgIGlmIChkZXBlbmRlbmN5ID09PSAndG9wV2hlZWwnKSB7 CisgICAgICAgICAgaWYgKGlzRXZlbnRTdXBwb3J0ZWQoJ3doZWVsJykpIHsKKyAgICAgICAgICAg IFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRF dmVudCgndG9wV2hlZWwnLCAnd2hlZWwnLCBtb3VudEF0KTsKKyAgICAgICAgICB9IGVsc2UgaWYg KGlzRXZlbnRTdXBwb3J0ZWQoJ21vdXNld2hlZWwnKSkgeworICAgICAgICAgICAgUmVhY3RCcm93 c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KCd0b3BX aGVlbCcsICdtb3VzZXdoZWVsJywgbW91bnRBdCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAg ICAgICAgIC8vIEZpcmVmb3ggbmVlZHMgdG8gY2FwdHVyZSBhIGRpZmZlcmVudCBtb3VzZSBzY3Jv bGwgZXZlbnQuCisgICAgICAgICAgICAvLyBAc2VlIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcv ZG9tL2V2ZW50cy90ZXN0cy9zY3JvbGwuaHRtbAorICAgICAgICAgICAgUmVhY3RCcm93c2VyRXZl bnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KCd0b3BXaGVlbCcs ICdET01Nb3VzZVNjcm9sbCcsIG1vdW50QXQpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNl IGlmIChkZXBlbmRlbmN5ID09PSAndG9wU2Nyb2xsJykgeworCisgICAgICAgICAgaWYgKGlzRXZl bnRTdXBwb3J0ZWQoJ3Njcm9sbCcsIHRydWUpKSB7CisgICAgICAgICAgICBSZWFjdEJyb3dzZXJF dmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBDYXB0dXJlZEV2ZW50KCd0b3BTY3Jv bGwnLCAnc2Nyb2xsJywgbW91bnRBdCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg IFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRF dmVudCgndG9wU2Nyb2xsJywgJ3Njcm9sbCcsIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFj dEV2ZW50TGlzdGVuZXIuV0lORE9XX0hBTkRMRSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVs c2UgaWYgKGRlcGVuZGVuY3kgPT09ICd0b3BGb2N1cycgfHwgZGVwZW5kZW5jeSA9PT0gJ3RvcEJs dXInKSB7CisKKyAgICAgICAgICBpZiAoaXNFdmVudFN1cHBvcnRlZCgnZm9jdXMnLCB0cnVlKSkg eworICAgICAgICAgICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5l ci50cmFwQ2FwdHVyZWRFdmVudCgndG9wRm9jdXMnLCAnZm9jdXMnLCBtb3VudEF0KTsKKyAgICAg ICAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcENh cHR1cmVkRXZlbnQoJ3RvcEJsdXInLCAnYmx1cicsIG1vdW50QXQpOworICAgICAgICAgIH0gZWxz ZSBpZiAoaXNFdmVudFN1cHBvcnRlZCgnZm9jdXNpbicpKSB7CisgICAgICAgICAgICAvLyBJRSBo YXMgYGZvY3VzaW5gIGFuZCBgZm9jdXNvdXRgIGV2ZW50cyB3aGljaCBidWJibGUuCisgICAgICAg ICAgICAvLyBAc2VlIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDA4 LzA0L2RlbGVnYXRpbmdfdGhlLmh0bWwKKyAgICAgICAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1p dHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wRm9jdXMnLCAnZm9j dXNpbicsIG1vdW50QXQpOworICAgICAgICAgICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJl YWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KCd0b3BCbHVyJywgJ2ZvY3Vzb3V0Jywg bW91bnRBdCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gdG8gbWFrZSBzdXJlIGJsdXIg YW5kIGZvY3VzIGV2ZW50IGxpc3RlbmVycyBhcmUgb25seSBhdHRhY2hlZCBvbmNlCisgICAgICAg ICAgaXNMaXN0ZW5pbmcudG9wQmx1ciA9IHRydWU7CisgICAgICAgICAgaXNMaXN0ZW5pbmcudG9w Rm9jdXMgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKHRvcEV2ZW50TWFwcGluZy5oYXNPd25Q cm9wZXJ0eShkZXBlbmRlbmN5KSkgeworICAgICAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRl ci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudChkZXBlbmRlbmN5LCB0b3BFdmVu dE1hcHBpbmdbZGVwZW5kZW5jeV0sIG1vdW50QXQpOworICAgICAgICB9CisKKyAgICAgICAgaXNM aXN0ZW5pbmdbZGVwZW5kZW5jeV0gPSB0cnVlOworICAgICAgfQorICAgIH0KKyAgfSwKKworICB0 cmFwQnViYmxlZEV2ZW50OiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCBoYW5kbGVyQmFzZU5hbWUs IGhhbmRsZSkgeworICAgIHJldHVybiBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVu dExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQodG9wTGV2ZWxUeXBlLCBoYW5kbGVyQmFzZU5hbWUs IGhhbmRsZSk7CisgIH0sCisKKyAgdHJhcENhcHR1cmVkRXZlbnQ6IGZ1bmN0aW9uICh0b3BMZXZl bFR5cGUsIGhhbmRsZXJCYXNlTmFtZSwgaGFuZGxlKSB7CisgICAgcmV0dXJuIFJlYWN0QnJvd3Nl ckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcENhcHR1cmVkRXZlbnQodG9wTGV2 ZWxUeXBlLCBoYW5kbGVyQmFzZU5hbWUsIGhhbmRsZSk7CisgIH0sCisKKyAgLyoqCisgICAqIFBy b3RlY3QgYWdhaW5zdCBkb2N1bWVudC5jcmVhdGVFdmVudCgpIHJldHVybmluZyBudWxsCisgICAq IFNvbWUgcG9wdXAgYmxvY2tlciBleHRlbnNpb25zIGFwcGVhciB0byBkbyB0aGlzOgorICAgKiBo dHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzY4ODcKKyAgICovCisgIHN1 cHBvcnRzRXZlbnRQYWdlWFk6IGZ1bmN0aW9uICgpIHsKKyAgICBpZiAoIWRvY3VtZW50LmNyZWF0 ZUV2ZW50KSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHZhciBldiA9IGRvY3Vt ZW50LmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50Jyk7CisgICAgcmV0dXJuIGV2ICE9IG51bGwgJiYg J3BhZ2VYJyBpbiBldjsKKyAgfSwKKworICAvKioKKyAgICogTGlzdGVucyB0byB3aW5kb3cgc2Ny b2xsIGFuZCByZXNpemUgZXZlbnRzLiBXZSBjYWNoZSBzY3JvbGwgdmFsdWVzIHNvIHRoYXQKKyAg ICogYXBwbGljYXRpb24gY29kZSBjYW4gYWNjZXNzIHRoZW0gd2l0aG91dCB0cmlnZ2VyaW5nIHJl Zmxvd3MuCisgICAqCisgICAqIFZpZXdwb3J0TWV0cmljcyBpcyBvbmx5IHVzZWQgYnkgU3ludGhl dGljTW91c2UvVG91Y2hFdmVudCBhbmQgb25seSB3aGVuCisgICAqIHBhZ2VYL3BhZ2VZIGlzbid0 IHN1cHBvcnRlZCAobGVnYWN5IGJyb3dzZXJzKS4KKyAgICoKKyAgICogTk9URTogU2Nyb2xsIGV2 ZW50cyBkbyBub3QgYnViYmxlLgorICAgKgorICAgKiBAc2VlIGh0dHA6Ly93d3cucXVpcmtzbW9k ZS5vcmcvZG9tL2V2ZW50cy9zY3JvbGwuaHRtbAorICAgKi8KKyAgZW5zdXJlU2Nyb2xsVmFsdWVN b25pdG9yaW5nOiBmdW5jdGlvbiAoKSB7CisgICAgaWYgKGhhc0V2ZW50UGFnZVhZID09PSB1bmRl ZmluZWQpIHsKKyAgICAgIGhhc0V2ZW50UGFnZVhZID0gUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVy LnN1cHBvcnRzRXZlbnRQYWdlWFkoKTsKKyAgICB9CisgICAgaWYgKCFoYXNFdmVudFBhZ2VYWSAm JiAhaXNNb25pdG9yaW5nU2Nyb2xsVmFsdWUpIHsKKyAgICAgIHZhciByZWZyZXNoID0gVmlld3Bv cnRNZXRyaWNzLnJlZnJlc2hTY3JvbGxWYWx1ZXM7CisgICAgICBSZWFjdEJyb3dzZXJFdmVudEVt aXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLm1vbml0b3JTY3JvbGxWYWx1ZShyZWZyZXNoKTsKKyAg ICAgIGlzTW9uaXRvcmluZ1Njcm9sbFZhbHVlID0gdHJ1ZTsKKyAgICB9CisgIH0KKworfSk7CisK K21vZHVsZS5leHBvcnRzID0gUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyOworfSx7IjExMSI6MTEx LCIxMTMiOjExMywiMTQ4IjoxNDgsIjE3IjoxNywiNTEiOjUxLCI5NCI6OTR9XSwyNjpbZnVuY3Rp b24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisoZnVuY3Rpb24gKHByb2Nlc3MpeworLyoqCisg KiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyBy ZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBC U0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9v dCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICog b2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUg c2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFJlYWN0UmVj b25jaWxlciA9IF9kZXJlcV8oNjgpOworCit2YXIgaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudCA9 IF9kZXJlcV8oMTEyKTsKK3ZhciBLZXlFc2NhcGVVdGlscyA9IF9kZXJlcV8oMjIpOwordmFyIHNo b3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50ID0gX2RlcmVxXygxMTkpOwordmFyIHRyYXZlcnNlQWxs Q2hpbGRyZW4gPSBfZGVyZXFfKDEyMCk7Cit2YXIgd2FybmluZyA9IF9kZXJlcV8oMTQ3KTsKKwor dmFyIFJlYWN0Q29tcG9uZW50VHJlZUhvb2s7CisKK2lmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3Vu ZGVmaW5lZCcgJiYgcHJvY2Vzcy5lbnYgJiYgImRldmVsb3BtZW50IiA9PT0gJ3Rlc3QnKSB7Cisg IC8vIFRlbXBvcmFyeSBoYWNrLgorICAvLyBJbmxpbmUgcmVxdWlyZXMgZG9uJ3Qgd29yayB3ZWxs IHdpdGggSmVzdDoKKyAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vl cy83MjQwCisgIC8vIFJlbW92ZSB0aGUgaW5saW5lIHJlcXVpcmVzIHdoZW4gd2UgZG9uJ3QgbmVl ZCB0aGVtIGFueW1vcmU6CisgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9w dWxsLzcxNzgKKyAgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IF9kZXJlcV8oMTIyKTsKK30KKwor ZnVuY3Rpb24gaW5zdGFudGlhdGVDaGlsZChjaGlsZEluc3RhbmNlcywgY2hpbGQsIG5hbWUsIHNl bGZEZWJ1Z0lEKSB7CisgIC8vIFdlIGZvdW5kIGEgY29tcG9uZW50IGluc3RhbmNlLgorICB2YXIg a2V5VW5pcXVlID0gY2hpbGRJbnN0YW5jZXNbbmFtZV0gPT09IHVuZGVmaW5lZDsKKyAgaWYgKCJk ZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgIGlmICghUmVhY3RDb21wb25lbnRU cmVlSG9vaykgeworICAgICAgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IF9kZXJlcV8oMTIyKTsK KyAgICB9CisgICAgaWYgKCFrZXlVbmlxdWUpIHsKKyAgICAgICJkZXZlbG9wbWVudCIgIT09ICdw cm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdmbGF0dGVuQ2hpbGRyZW4oLi4uKTogRW5jb3Vu dGVyZWQgdHdvIGNoaWxkcmVuIHdpdGggdGhlIHNhbWUga2V5LCAnICsgJ2Alc2AuIENoaWxkIGtl eXMgbXVzdCBiZSB1bmlxdWU7IHdoZW4gdHdvIGNoaWxkcmVuIHNoYXJlIGEga2V5LCBvbmx5ICcg KyAndGhlIGZpcnN0IGNoaWxkIHdpbGwgYmUgdXNlZC4lcycsIEtleUVzY2FwZVV0aWxzLnVuZXNj YXBlKG5hbWUpLCBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKHNl bGZEZWJ1Z0lEKSkgOiB2b2lkIDA7CisgICAgfQorICB9CisgIGlmIChjaGlsZCAhPSBudWxsICYm IGtleVVuaXF1ZSkgeworICAgIGNoaWxkSW5zdGFuY2VzW25hbWVdID0gaW5zdGFudGlhdGVSZWFj dENvbXBvbmVudChjaGlsZCwgdHJ1ZSk7CisgIH0KK30KKworLyoqCisgKiBSZWFjdENoaWxkUmVj b25jaWxlciBwcm92aWRlcyBoZWxwZXJzIGZvciBpbml0aWFsaXppbmcgb3IgdXBkYXRpbmcgYSBz ZXQgb2YKKyAqIGNoaWxkcmVuLiBJdHMgb3V0cHV0IGlzIHN1aXRhYmxlIGZvciBwYXNzaW5nIGl0 IG9udG8gUmVhY3RNdWx0aUNoaWxkIHdoaWNoCisgKiBkb2VzIGRpZmZlZCByZW9yZGVyaW5nIGFu ZCBpbnNlcnRpb24uCisgKi8KK3ZhciBSZWFjdENoaWxkUmVjb25jaWxlciA9IHsKKyAgLyoqCisg ICAqIEdlbmVyYXRlcyBhICJtb3VudCBpbWFnZSIgZm9yIGVhY2ggb2YgdGhlIHN1cHBsaWVkIGNo aWxkcmVuLiBJbiB0aGUgY2FzZQorICAgKiBvZiBgUmVhY3RET01Db21wb25lbnRgLCBhIG1vdW50 IGltYWdlIGlzIGEgc3RyaW5nIG9mIG1hcmt1cC4KKyAgICoKKyAgICogQHBhcmFtIHs/b2JqZWN0 fSBuZXN0ZWRDaGlsZE5vZGVzIE5lc3RlZCBjaGlsZCBtYXBzLgorICAgKiBAcmV0dXJuIHs/b2Jq ZWN0fSBBIHNldCBvZiBjaGlsZCBpbnN0YW5jZXMuCisgICAqIEBpbnRlcm5hbAorICAgKi8KKyAg aW5zdGFudGlhdGVDaGlsZHJlbjogZnVuY3Rpb24gKG5lc3RlZENoaWxkTm9kZXMsIHRyYW5zYWN0 aW9uLCBjb250ZXh0LCBzZWxmRGVidWdJRCAvLyAwIGluIHByb2R1Y3Rpb24gYW5kIGZvciByb290 cworICApIHsKKyAgICBpZiAobmVzdGVkQ2hpbGROb2RlcyA9PSBudWxsKSB7CisgICAgICByZXR1 cm4gbnVsbDsKKyAgICB9CisgICAgdmFyIGNoaWxkSW5zdGFuY2VzID0ge307CisKKyAgICBpZiAo ImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICB0cmF2ZXJzZUFsbENoaWxk cmVuKG5lc3RlZENoaWxkTm9kZXMsIGZ1bmN0aW9uIChjaGlsZEluc3RzLCBjaGlsZCwgbmFtZSkg eworICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVDaGlsZChjaGlsZEluc3RzLCBjaGlsZCwgbmFt ZSwgc2VsZkRlYnVnSUQpOworICAgICAgfSwgY2hpbGRJbnN0YW5jZXMpOworICAgIH0gZWxzZSB7 CisgICAgICB0cmF2ZXJzZUFsbENoaWxkcmVuKG5lc3RlZENoaWxkTm9kZXMsIGluc3RhbnRpYXRl Q2hpbGQsIGNoaWxkSW5zdGFuY2VzKTsKKyAgICB9CisgICAgcmV0dXJuIGNoaWxkSW5zdGFuY2Vz OworICB9LAorCisgIC8qKgorICAgKiBVcGRhdGVzIHRoZSByZW5kZXJlZCBjaGlsZHJlbiBhbmQg cmV0dXJucyBhIG5ldyBzZXQgb2YgY2hpbGRyZW4uCisgICAqCisgICAqIEBwYXJhbSB7P29iamVj dH0gcHJldkNoaWxkcmVuIFByZXZpb3VzbHkgaW5pdGlhbGl6ZWQgc2V0IG9mIGNoaWxkcmVuLgor ICAgKiBAcGFyYW0gez9vYmplY3R9IG5leHRDaGlsZHJlbiBGbGF0IGNoaWxkIGVsZW1lbnQgbWFw cy4KKyAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvbgor ICAgKiBAcGFyYW0ge29iamVjdH0gY29udGV4dAorICAgKiBAcmV0dXJuIHs/b2JqZWN0fSBBIG5l dyBzZXQgb2YgY2hpbGQgaW5zdGFuY2VzLgorICAgKiBAaW50ZXJuYWwKKyAgICovCisgIHVwZGF0 ZUNoaWxkcmVuOiBmdW5jdGlvbiAocHJldkNoaWxkcmVuLCBuZXh0Q2hpbGRyZW4sIG1vdW50SW1h Z2VzLCByZW1vdmVkTm9kZXMsIHRyYW5zYWN0aW9uLCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVy SW5mbywgY29udGV4dCwgc2VsZkRlYnVnSUQgLy8gMCBpbiBwcm9kdWN0aW9uIGFuZCBmb3Igcm9v dHMKKyAgKSB7CisgICAgLy8gV2UgY3VycmVudGx5IGRvbid0IGhhdmUgYSB3YXkgdG8gdHJhY2sg bW92ZXMgaGVyZSBidXQgaWYgd2UgdXNlIGl0ZXJhdG9ycworICAgIC8vIGluc3RlYWQgb2YgZm9y Li5pbiB3ZSBjYW4gemlwIHRoZSBpdGVyYXRvcnMgYW5kIGNoZWNrIGlmIGFuIGl0ZW0gaGFzCisg ICAgLy8gbW92ZWQuCisgICAgLy8gVE9ETzogSWYgbm90aGluZyBoYXMgY2hhbmdlZCwgcmV0dXJu IHRoZSBwcmV2Q2hpbGRyZW4gb2JqZWN0IHNvIHRoYXQgd2UKKyAgICAvLyBjYW4gcXVpY2tseSBi YWlsb3V0IGlmIG5vdGhpbmcgaGFzIGNoYW5nZWQuCisgICAgaWYgKCFuZXh0Q2hpbGRyZW4gJiYg IXByZXZDaGlsZHJlbikgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICB2YXIgbmFtZTsKKyAg ICB2YXIgcHJldkNoaWxkOworICAgIGZvciAobmFtZSBpbiBuZXh0Q2hpbGRyZW4pIHsKKyAgICAg IGlmICghbmV4dENoaWxkcmVuLmhhc093blByb3BlcnR5KG5hbWUpKSB7CisgICAgICAgIGNvbnRp bnVlOworICAgICAgfQorICAgICAgcHJldkNoaWxkID0gcHJldkNoaWxkcmVuICYmIHByZXZDaGls ZHJlbltuYW1lXTsKKyAgICAgIHZhciBwcmV2RWxlbWVudCA9IHByZXZDaGlsZCAmJiBwcmV2Q2hp bGQuX2N1cnJlbnRFbGVtZW50OworICAgICAgdmFyIG5leHRFbGVtZW50ID0gbmV4dENoaWxkcmVu W25hbWVdOworICAgICAgaWYgKHByZXZDaGlsZCAhPSBudWxsICYmIHNob3VsZFVwZGF0ZVJlYWN0 Q29tcG9uZW50KHByZXZFbGVtZW50LCBuZXh0RWxlbWVudCkpIHsKKyAgICAgICAgUmVhY3RSZWNv bmNpbGVyLnJlY2VpdmVDb21wb25lbnQocHJldkNoaWxkLCBuZXh0RWxlbWVudCwgdHJhbnNhY3Rp b24sIGNvbnRleHQpOworICAgICAgICBuZXh0Q2hpbGRyZW5bbmFtZV0gPSBwcmV2Q2hpbGQ7Cisg ICAgICB9IGVsc2UgeworICAgICAgICBpZiAocHJldkNoaWxkKSB7CisgICAgICAgICAgcmVtb3Zl ZE5vZGVzW25hbWVdID0gUmVhY3RSZWNvbmNpbGVyLmdldEhvc3ROb2RlKHByZXZDaGlsZCk7Cisg ICAgICAgICAgUmVhY3RSZWNvbmNpbGVyLnVubW91bnRDb21wb25lbnQocHJldkNoaWxkLCBmYWxz ZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlIGNoaWxkIG11c3QgYmUgaW5zdGFudGlhdGVk IGJlZm9yZSBpdCdzIG1vdW50ZWQuCisgICAgICAgIHZhciBuZXh0Q2hpbGRJbnN0YW5jZSA9IGlu c3RhbnRpYXRlUmVhY3RDb21wb25lbnQobmV4dEVsZW1lbnQsIHRydWUpOworICAgICAgICBuZXh0 Q2hpbGRyZW5bbmFtZV0gPSBuZXh0Q2hpbGRJbnN0YW5jZTsKKyAgICAgICAgLy8gQ3JlYXRpbmcg bW91bnQgaW1hZ2Ugbm93IGVuc3VyZXMgcmVmcyBhcmUgcmVzb2x2ZWQgaW4gcmlnaHQgb3JkZXIK KyAgICAgICAgLy8gKHNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC83 MTAxIGZvciBleHBsYW5hdGlvbikuCisgICAgICAgIHZhciBuZXh0Q2hpbGRNb3VudEltYWdlID0g UmVhY3RSZWNvbmNpbGVyLm1vdW50Q29tcG9uZW50KG5leHRDaGlsZEluc3RhbmNlLCB0cmFuc2Fj dGlvbiwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIGNvbnRleHQsIHNlbGZEZWJ1Z0lE KTsKKyAgICAgICAgbW91bnRJbWFnZXMucHVzaChuZXh0Q2hpbGRNb3VudEltYWdlKTsKKyAgICAg IH0KKyAgICB9CisgICAgLy8gVW5tb3VudCBjaGlsZHJlbiB0aGF0IGFyZSBubyBsb25nZXIgcHJl c2VudC4KKyAgICBmb3IgKG5hbWUgaW4gcHJldkNoaWxkcmVuKSB7CisgICAgICBpZiAocHJldkNo aWxkcmVuLmhhc093blByb3BlcnR5KG5hbWUpICYmICEobmV4dENoaWxkcmVuICYmIG5leHRDaGls ZHJlbi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkpIHsKKyAgICAgICAgcHJldkNoaWxkID0gcHJldkNo aWxkcmVuW25hbWVdOworICAgICAgICByZW1vdmVkTm9kZXNbbmFtZV0gPSBSZWFjdFJlY29uY2ls ZXIuZ2V0SG9zdE5vZGUocHJldkNoaWxkKTsKKyAgICAgICAgUmVhY3RSZWNvbmNpbGVyLnVubW91 bnRDb21wb25lbnQocHJldkNoaWxkLCBmYWxzZSk7CisgICAgICB9CisgICAgfQorICB9LAorCisg IC8qKgorICAgKiBVbm1vdW50cyBhbGwgcmVuZGVyZWQgY2hpbGRyZW4uIFRoaXMgc2hvdWxkIGJl IHVzZWQgdG8gY2xlYW4gdXAgY2hpbGRyZW4KKyAgICogd2hlbiB0aGlzIGNvbXBvbmVudCBpcyB1 bm1vdW50ZWQuCisgICAqCisgICAqIEBwYXJhbSB7P29iamVjdH0gcmVuZGVyZWRDaGlsZHJlbiBQ cmV2aW91c2x5IGluaXRpYWxpemVkIHNldCBvZiBjaGlsZHJlbi4KKyAgICogQGludGVybmFsCisg ICAqLworICB1bm1vdW50Q2hpbGRyZW46IGZ1bmN0aW9uIChyZW5kZXJlZENoaWxkcmVuLCBzYWZl bHkpIHsKKyAgICBmb3IgKHZhciBuYW1lIGluIHJlbmRlcmVkQ2hpbGRyZW4pIHsKKyAgICAgIGlm IChyZW5kZXJlZENoaWxkcmVuLmhhc093blByb3BlcnR5KG5hbWUpKSB7CisgICAgICAgIHZhciBy ZW5kZXJlZENoaWxkID0gcmVuZGVyZWRDaGlsZHJlbltuYW1lXTsKKyAgICAgICAgUmVhY3RSZWNv bmNpbGVyLnVubW91bnRDb21wb25lbnQocmVuZGVyZWRDaGlsZCwgc2FmZWx5KTsKKyAgICAgIH0K KyAgICB9CisgIH0KKworfTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdENoaWxkUmVjb25jaWxl cjsKK30pLmNhbGwodGhpcyx1bmRlZmluZWQpCit9LHsiMTEyIjoxMTIsIjExOSI6MTE5LCIxMjAi OjEyMCwiMTIyIjoxMjIsIjE0NyI6MTQ3LCIyMiI6MjIsIjY4Ijo2OH1dLDI3OltmdW5jdGlvbihf ZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwg RmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3Vy Y2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4g dGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNl IHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZv dW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLwor CisndXNlIHN0cmljdCc7CisKK3ZhciBET01DaGlsZHJlbk9wZXJhdGlvbnMgPSBfZGVyZXFfKDgp OwordmFyIFJlYWN0RE9NSURPcGVyYXRpb25zID0gX2RlcmVxXygzNSk7CisKKy8qKgorICogQWJz dHJhY3RzIGF3YXkgYWxsIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIHJlY29uY2lsZXIgdGhhdCByZXF1 aXJlcyBrbm93bGVkZ2Ugb2YKKyAqIHRoZSBicm93c2VyIGNvbnRleHQuIFRPRE86IFRoZXNlIGNh bGxlcnMgc2hvdWxkIGJlIHJlZmFjdG9yZWQgdG8gYXZvaWQgdGhlCisgKiBuZWVkIGZvciB0aGlz IGluamVjdGlvbi4KKyAqLwordmFyIFJlYWN0Q29tcG9uZW50QnJvd3NlckVudmlyb25tZW50ID0g eworCisgIHByb2Nlc3NDaGlsZHJlblVwZGF0ZXM6IFJlYWN0RE9NSURPcGVyYXRpb25zLmRhbmdl cm91c2x5UHJvY2Vzc0NoaWxkcmVuVXBkYXRlcywKKworICByZXBsYWNlTm9kZVdpdGhNYXJrdXA6 IERPTUNoaWxkcmVuT3BlcmF0aW9ucy5kYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cAor Cit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q29tcG9uZW50QnJvd3NlckVudmlyb25tZW50 OworfSx7IjM1IjozNSwiOCI6OH1dLDI4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRz KXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFs bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1 bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUg aW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwg Z3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZp bGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsK KwordmFyIF9wcm9kSW52YXJpYW50ID0gX2RlcmVxXygxMTYpOworCit2YXIgaW52YXJpYW50ID0g X2RlcmVxXygxNDApOworCit2YXIgaW5qZWN0ZWQgPSBmYWxzZTsKKwordmFyIFJlYWN0Q29tcG9u ZW50RW52aXJvbm1lbnQgPSB7CisKKyAgLyoqCisgICAqIE9wdGlvbmFsbHkgaW5qZWN0YWJsZSBo b29rIGZvciBzd2FwcGluZyBvdXQgbW91bnQgaW1hZ2VzIGluIHRoZSBtaWRkbGUgb2YKKyAgICog dGhlIHRyZWUuCisgICAqLworICByZXBsYWNlTm9kZVdpdGhNYXJrdXA6IG51bGwsCisKKyAgLyoq CisgICAqIE9wdGlvbmFsbHkgaW5qZWN0YWJsZSBob29rIGZvciBwcm9jZXNzaW5nIGEgcXVldWUg b2YgY2hpbGQgdXBkYXRlcy4gV2lsbAorICAgKiBsYXRlciBtb3ZlIGludG8gTXVsdGlDaGlsZENv bXBvbmVudHMuCisgICAqLworICBwcm9jZXNzQ2hpbGRyZW5VcGRhdGVzOiBudWxsLAorCisgIGlu amVjdGlvbjogeworICAgIGluamVjdEVudmlyb25tZW50OiBmdW5jdGlvbiAoZW52aXJvbm1lbnQp IHsKKyAgICAgICEhaW5qZWN0ZWQgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBp bnZhcmlhbnQoZmFsc2UsICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudDogaW5qZWN0RW52aXJvbm1l bnQoKSBjYW4gb25seSBiZSBjYWxsZWQgb25jZS4nKSA6IF9wcm9kSW52YXJpYW50KCcxMDQnKSA6 IHZvaWQgMDsKKyAgICAgIFJlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQucmVwbGFjZU5vZGVXaXRo TWFya3VwID0gZW52aXJvbm1lbnQucmVwbGFjZU5vZGVXaXRoTWFya3VwOworICAgICAgUmVhY3RD b21wb25lbnRFbnZpcm9ubWVudC5wcm9jZXNzQ2hpbGRyZW5VcGRhdGVzID0gZW52aXJvbm1lbnQu cHJvY2Vzc0NoaWxkcmVuVXBkYXRlczsKKyAgICAgIGluamVjdGVkID0gdHJ1ZTsKKyAgICB9Cisg IH0KKworfTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdENvbXBvbmVudEVudmlyb25tZW50Owor fSx7IjExNiI6MTE2LCIxNDAiOjE0MH1dLDI5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBv cnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAq IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNl ZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZp bGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9u YWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRT IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisK K3ZhciBfcHJvZEludmFyaWFudCA9IF9kZXJlcV8oMTE2KSwKKyAgICBfYXNzaWduID0gX2RlcmVx XygxNDgpOworCit2YXIgUmVhY3QgPSBfZGVyZXFfKDEyNCk7Cit2YXIgUmVhY3RDb21wb25lbnRF bnZpcm9ubWVudCA9IF9kZXJlcV8oMjgpOwordmFyIFJlYWN0Q3VycmVudE93bmVyID0gX2RlcmVx XygxMjMpOwordmFyIFJlYWN0RXJyb3JVdGlscyA9IF9kZXJlcV8oNTApOwordmFyIFJlYWN0SW5z dGFuY2VNYXAgPSBfZGVyZXFfKDU4KTsKK3ZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IF9kZXJl cV8oNTkpOwordmFyIFJlYWN0Tm9kZVR5cGVzID0gX2RlcmVxXyg2Myk7Cit2YXIgUmVhY3RSZWNv bmNpbGVyID0gX2RlcmVxXyg2OCk7CisKK2lmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlv bicpIHsKKyAgdmFyIGNoZWNrUmVhY3RUeXBlU3BlYyA9IF9kZXJlcV8oOTcpOworfQorCit2YXIg ZW1wdHlPYmplY3QgPSBfZGVyZXFfKDEzMyk7Cit2YXIgaW52YXJpYW50ID0gX2RlcmVxXygxNDAp OwordmFyIHNoYWxsb3dFcXVhbCA9IF9kZXJlcV8oMTQ2KTsKK3ZhciBzaG91bGRVcGRhdGVSZWFj dENvbXBvbmVudCA9IF9kZXJlcV8oMTE5KTsKK3ZhciB3YXJuaW5nID0gX2RlcmVxXygxNDcpOwor Cit2YXIgQ29tcG9zaXRlVHlwZXMgPSB7CisgIEltcHVyZUNsYXNzOiAwLAorICBQdXJlQ2xhc3M6 IDEsCisgIFN0YXRlbGVzc0Z1bmN0aW9uYWw6IDIKK307CisKK2Z1bmN0aW9uIFN0YXRlbGVzc0Nv bXBvbmVudChDb21wb25lbnQpIHt9CitTdGF0ZWxlc3NDb21wb25lbnQucHJvdG90eXBlLnJlbmRl ciA9IGZ1bmN0aW9uICgpIHsKKyAgdmFyIENvbXBvbmVudCA9IFJlYWN0SW5zdGFuY2VNYXAuZ2V0 KHRoaXMpLl9jdXJyZW50RWxlbWVudC50eXBlOworICB2YXIgZWxlbWVudCA9IENvbXBvbmVudCh0 aGlzLnByb3BzLCB0aGlzLmNvbnRleHQsIHRoaXMudXBkYXRlcik7CisgIHdhcm5JZkludmFsaWRF bGVtZW50KENvbXBvbmVudCwgZWxlbWVudCk7CisgIHJldHVybiBlbGVtZW50OworfTsKKworZnVu Y3Rpb24gd2FybklmSW52YWxpZEVsZW1lbnQoQ29tcG9uZW50LCBlbGVtZW50KSB7CisgIGlmICgi ZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAiZGV2ZWxvcG1lbnQiICE9PSAn cHJvZHVjdGlvbicgPyB3YXJuaW5nKGVsZW1lbnQgPT09IG51bGwgfHwgZWxlbWVudCA9PT0gZmFs c2UgfHwgUmVhY3QuaXNWYWxpZEVsZW1lbnQoZWxlbWVudCksICclcyguLi4pOiBBIHZhbGlkIFJl YWN0IGVsZW1lbnQgKG9yIG51bGwpIG11c3QgYmUgcmV0dXJuZWQuIFlvdSBtYXkgaGF2ZSAnICsg J3JldHVybmVkIHVuZGVmaW5lZCwgYW4gYXJyYXkgb3Igc29tZSBvdGhlciBpbnZhbGlkIG9iamVj dC4nLCBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVu dCcpIDogdm9pZCAwOworICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5p bmcoIUNvbXBvbmVudC5jaGlsZENvbnRleHRUeXBlcywgJyVzKC4uLik6IGNoaWxkQ29udGV4dFR5 cGVzIGNhbm5vdCBiZSBkZWZpbmVkIG9uIGEgZnVuY3Rpb25hbCBjb21wb25lbnQuJywgQ29tcG9u ZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnKSA6IHZvaWQg MDsKKyAgfQorfQorCitmdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7CisgIHJl dHVybiAhIShDb21wb25lbnQucHJvdG90eXBlICYmIENvbXBvbmVudC5wcm90b3R5cGUuaXNSZWFj dENvbXBvbmVudCk7Cit9CisKK2Z1bmN0aW9uIGlzUHVyZUNvbXBvbmVudChDb21wb25lbnQpIHsK KyAgcmV0dXJuICEhKENvbXBvbmVudC5wcm90b3R5cGUgJiYgQ29tcG9uZW50LnByb3RvdHlwZS5p c1B1cmVSZWFjdENvbXBvbmVudCk7Cit9CisKKy8vIFNlcGFyYXRlZCBpbnRvIGEgZnVuY3Rpb24g dG8gY29udGFpbiBkZW9wdGltaXphdGlvbnMgY2F1c2VkIGJ5IHRyeS9maW5hbGx5LgorZnVuY3Rp b24gbWVhc3VyZUxpZmVDeWNsZVBlcmYoZm4sIGRlYnVnSUQsIHRpbWVyVHlwZSkgeworICBpZiAo ZGVidWdJRCA9PT0gMCkgeworICAgIC8vIFRvcC1sZXZlbCB3cmFwcGVycyAoc2VlIFJlYWN0TW91 bnQpIGFuZCBlbXB0eSBjb21wb25lbnRzIChzZWUKKyAgICAvLyBSZWFjdERPTUVtcHR5Q29tcG9u ZW50KSBhcmUgaW52aXNpYmxlIHRvIGhvb2tzIGFuZCBkZXZ0b29scy4KKyAgICAvLyBCb3RoIGFy ZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIHRoYXQgc2hvdWxkIGdvIGF3YXkgaW4gdGhlIGZ1dHVy ZS4KKyAgICByZXR1cm4gZm4oKTsKKyAgfQorCisgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVn VG9vbC5vbkJlZ2luTGlmZUN5Y2xlVGltZXIoZGVidWdJRCwgdGltZXJUeXBlKTsKKyAgdHJ5IHsK KyAgICByZXR1cm4gZm4oKTsKKyAgfSBmaW5hbGx5IHsKKyAgICBSZWFjdEluc3RydW1lbnRhdGlv bi5kZWJ1Z1Rvb2wub25FbmRMaWZlQ3ljbGVUaW1lcihkZWJ1Z0lELCB0aW1lclR5cGUpOworICB9 Cit9CisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tIFRoZSBMaWZlLUN5Y2xlIG9mIGEgQ29t cG9zaXRlIENvbXBvbmVudCAtLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAtIGNvbnN0cnVjdG9y OiBJbml0aWFsaXphdGlvbiBvZiBzdGF0ZS4gVGhlIGluc3RhbmNlIGlzIG5vdyByZXRhaW5lZC4K KyAqICAgLSBjb21wb25lbnRXaWxsTW91bnQKKyAqICAgLSByZW5kZXIKKyAqICAgLSBbY2hpbGRy ZW4ncyBjb25zdHJ1Y3RvcnNdCisgKiAgICAgLSBbY2hpbGRyZW4ncyBjb21wb25lbnRXaWxsTW91 bnQgYW5kIHJlbmRlcl0KKyAqICAgICAtIFtjaGlsZHJlbidzIGNvbXBvbmVudERpZE1vdW50XQor ICogICAgIC0gY29tcG9uZW50RGlkTW91bnQKKyAqCisgKiAgICAgICBVcGRhdGUgUGhhc2VzOgor ICogICAgICAgLSBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIChvbmx5IGNhbGxlZCBpZiBwYXJl bnQgdXBkYXRlZCkKKyAqICAgICAgIC0gc2hvdWxkQ29tcG9uZW50VXBkYXRlCisgKiAgICAgICAg IC0gY29tcG9uZW50V2lsbFVwZGF0ZQorICogICAgICAgICAgIC0gcmVuZGVyCisgKiAgICAgICAg ICAgLSBbY2hpbGRyZW4ncyBjb25zdHJ1Y3RvcnMgb3IgcmVjZWl2ZSBwcm9wcyBwaGFzZXNdCisg KiAgICAgICAgIC0gY29tcG9uZW50RGlkVXBkYXRlCisgKgorICogICAgIC0gY29tcG9uZW50V2ls bFVubW91bnQKKyAqICAgICAtIFtjaGlsZHJlbidzIGNvbXBvbmVudFdpbGxVbm1vdW50XQorICog ICAtIFtjaGlsZHJlbiBkZXN0cm95ZWRdCisgKiAtIChkZXN0cm95ZWQpOiBUaGUgaW5zdGFuY2Ug aXMgbm93IGJsYW5rLCByZWxlYXNlZCBieSBSZWFjdCBhbmQgcmVhZHkgZm9yIEdDLgorICoKKyAq IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyoqCisgKiBBbiBpbmNyZW1lbnRpbmcgSUQg YXNzaWduZWQgdG8gZWFjaCBjb21wb25lbnQgd2hlbiBpdCBpcyBtb3VudGVkLiBUaGlzIGlzCisg KiB1c2VkIHRvIGVuZm9yY2UgdGhlIG9yZGVyIGluIHdoaWNoIGBSZWFjdFVwZGF0ZXNgIHVwZGF0 ZXMgZGlydHkgY29tcG9uZW50cy4KKyAqCisgKiBAcHJpdmF0ZQorICovCit2YXIgbmV4dE1vdW50 SUQgPSAxOworCisvKioKKyAqIEBsZW5kcyB7UmVhY3RDb21wb3NpdGVDb21wb25lbnQucHJvdG90 eXBlfQorICovCit2YXIgUmVhY3RDb21wb3NpdGVDb21wb25lbnQgPSB7CisKKyAgLyoqCisgICAq IEJhc2UgY29uc3RydWN0b3IgZm9yIGFsbCBjb21wb3NpdGUgY29tcG9uZW50LgorICAgKgorICAg KiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudAorICAgKiBAZmluYWwKKyAgICogQGludGVy bmFsCisgICAqLworICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIChlbGVtZW50KSB7CisgICAgdGhpcy5f Y3VycmVudEVsZW1lbnQgPSBlbGVtZW50OworICAgIHRoaXMuX3Jvb3ROb2RlSUQgPSAwOworICAg IHRoaXMuX2NvbXBvc2l0ZVR5cGUgPSBudWxsOworICAgIHRoaXMuX2luc3RhbmNlID0gbnVsbDsK KyAgICB0aGlzLl9ob3N0UGFyZW50ID0gbnVsbDsKKyAgICB0aGlzLl9ob3N0Q29udGFpbmVySW5m byA9IG51bGw7CisKKyAgICAvLyBTZWUgUmVhY3RVcGRhdGVRdWV1ZQorICAgIHRoaXMuX3VwZGF0 ZUJhdGNoTnVtYmVyID0gbnVsbDsKKyAgICB0aGlzLl9wZW5kaW5nRWxlbWVudCA9IG51bGw7Cisg ICAgdGhpcy5fcGVuZGluZ1N0YXRlUXVldWUgPSBudWxsOworICAgIHRoaXMuX3BlbmRpbmdSZXBs YWNlU3RhdGUgPSBmYWxzZTsKKyAgICB0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGUgPSBmYWxzZTsK KworICAgIHRoaXMuX3JlbmRlcmVkTm9kZVR5cGUgPSBudWxsOworICAgIHRoaXMuX3JlbmRlcmVk Q29tcG9uZW50ID0gbnVsbDsKKyAgICB0aGlzLl9jb250ZXh0ID0gbnVsbDsKKyAgICB0aGlzLl9t b3VudE9yZGVyID0gMDsKKyAgICB0aGlzLl90b3BMZXZlbFdyYXBwZXIgPSBudWxsOworCisgICAg Ly8gU2VlIFJlYWN0VXBkYXRlcyBhbmQgUmVhY3RVcGRhdGVRdWV1ZS4KKyAgICB0aGlzLl9wZW5k aW5nQ2FsbGJhY2tzID0gbnVsbDsKKworICAgIC8vIENvbXBvbmVudFdpbGxVbm1vdW50IHNoYWxs IG9ubHkgYmUgY2FsbGVkIG9uY2UKKyAgICB0aGlzLl9jYWxsZWRDb21wb25lbnRXaWxsVW5tb3Vu dCA9IGZhbHNlOworCisgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgewor ICAgICAgdGhpcy5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSBmYWxzZTsKKyAgICB9CisgIH0s CisKKyAgLyoqCisgICAqIEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQsIHJlbmRlcnMgbWFya3Vw LCBhbmQgcmVnaXN0ZXJzIGV2ZW50IGxpc3RlbmVycy4KKyAgICoKKyAgICogQHBhcmFtIHtSZWFj dFJlY29uY2lsZVRyYW5zYWN0aW9ufFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb259IHRy YW5zYWN0aW9uCisgICAqIEBwYXJhbSB7P29iamVjdH0gaG9zdFBhcmVudAorICAgKiBAcGFyYW0g ez9vYmplY3R9IGhvc3RDb250YWluZXJJbmZvCisgICAqIEBwYXJhbSB7P29iamVjdH0gY29udGV4 dAorICAgKiBAcmV0dXJuIHs/c3RyaW5nfSBSZW5kZXJlZCBtYXJrdXAgdG8gYmUgaW5zZXJ0ZWQg aW50byB0aGUgRE9NLgorICAgKiBAZmluYWwKKyAgICogQGludGVybmFsCisgICAqLworICBtb3Vu dENvbXBvbmVudDogZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBob3N0UGFyZW50LCBob3N0Q29udGFp bmVySW5mbywgY29udGV4dCkgeworICAgIHZhciBfdGhpcyA9IHRoaXM7CisKKyAgICB0aGlzLl9j b250ZXh0ID0gY29udGV4dDsKKyAgICB0aGlzLl9tb3VudE9yZGVyID0gbmV4dE1vdW50SUQrKzsK KyAgICB0aGlzLl9ob3N0UGFyZW50ID0gaG9zdFBhcmVudDsKKyAgICB0aGlzLl9ob3N0Q29udGFp bmVySW5mbyA9IGhvc3RDb250YWluZXJJbmZvOworCisgICAgdmFyIHB1YmxpY1Byb3BzID0gdGhp cy5fY3VycmVudEVsZW1lbnQucHJvcHM7CisgICAgdmFyIHB1YmxpY0NvbnRleHQgPSB0aGlzLl9w cm9jZXNzQ29udGV4dChjb250ZXh0KTsKKworICAgIHZhciBDb21wb25lbnQgPSB0aGlzLl9jdXJy ZW50RWxlbWVudC50eXBlOworCisgICAgdmFyIHVwZGF0ZVF1ZXVlID0gdHJhbnNhY3Rpb24uZ2V0 VXBkYXRlUXVldWUoKTsKKworICAgIC8vIEluaXRpYWxpemUgdGhlIHB1YmxpYyBjbGFzcworICAg IHZhciBkb0NvbnN0cnVjdCA9IHNob3VsZENvbnN0cnVjdChDb21wb25lbnQpOworICAgIHZhciBp bnN0ID0gdGhpcy5fY29uc3RydWN0Q29tcG9uZW50KGRvQ29uc3RydWN0LCBwdWJsaWNQcm9wcywg cHVibGljQ29udGV4dCwgdXBkYXRlUXVldWUpOworICAgIHZhciByZW5kZXJlZEVsZW1lbnQ7CisK KyAgICAvLyBTdXBwb3J0IGZ1bmN0aW9uYWwgY29tcG9uZW50cworICAgIGlmICghZG9Db25zdHJ1 Y3QgJiYgKGluc3QgPT0gbnVsbCB8fCBpbnN0LnJlbmRlciA9PSBudWxsKSkgeworICAgICAgcmVu ZGVyZWRFbGVtZW50ID0gaW5zdDsKKyAgICAgIHdhcm5JZkludmFsaWRFbGVtZW50KENvbXBvbmVu dCwgcmVuZGVyZWRFbGVtZW50KTsKKyAgICAgICEoaW5zdCA9PT0gbnVsbCB8fCBpbnN0ID09PSBm YWxzZSB8fCBSZWFjdC5pc1ZhbGlkRWxlbWVudChpbnN0KSkgPyAiZGV2ZWxvcG1lbnQiICE9PSAn cHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICclcyguLi4pOiBBIHZhbGlkIFJlYWN0IGVs ZW1lbnQgKG9yIG51bGwpIG11c3QgYmUgcmV0dXJuZWQuIFlvdSBtYXkgaGF2ZSByZXR1cm5lZCB1 bmRlZmluZWQsIGFuIGFycmF5IG9yIHNvbWUgb3RoZXIgaW52YWxpZCBvYmplY3QuJywgQ29tcG9u ZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnKSA6IF9wcm9k SW52YXJpYW50KCcxMDUnLCBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUg fHwgJ0NvbXBvbmVudCcpIDogdm9pZCAwOworICAgICAgaW5zdCA9IG5ldyBTdGF0ZWxlc3NDb21w b25lbnQoQ29tcG9uZW50KTsKKyAgICAgIHRoaXMuX2NvbXBvc2l0ZVR5cGUgPSBDb21wb3NpdGVU eXBlcy5TdGF0ZWxlc3NGdW5jdGlvbmFsOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoaXNQdXJl Q29tcG9uZW50KENvbXBvbmVudCkpIHsKKyAgICAgICAgdGhpcy5fY29tcG9zaXRlVHlwZSA9IENv bXBvc2l0ZVR5cGVzLlB1cmVDbGFzczsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuX2Nv bXBvc2l0ZVR5cGUgPSBDb21wb3NpdGVUeXBlcy5JbXB1cmVDbGFzczsKKyAgICAgIH0KKyAgICB9 CisKKyAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAvLyBU aGlzIHdpbGwgdGhyb3cgbGF0ZXIgaW4gX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudCwgYnV0IGFk ZCBhbiBlYXJseQorICAgICAgLy8gd2FybmluZyBub3cgdG8gaGVscCBkZWJ1Z2dpbmcKKyAgICAg IGlmIChpbnN0LnJlbmRlciA9PSBudWxsKSB7CisgICAgICAgICJkZXZlbG9wbWVudCIgIT09ICdw cm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclcyguLi4pOiBObyBgcmVuZGVyYCBtZXRob2Qg Zm91bmQgb24gdGhlIHJldHVybmVkIGNvbXBvbmVudCAnICsgJ2luc3RhbmNlOiB5b3UgbWF5IGhh dmUgZm9yZ290dGVuIHRvIGRlZmluZSBgcmVuZGVyYC4nLCBDb21wb25lbnQuZGlzcGxheU5hbWUg fHwgQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCcpIDogdm9pZCAwOworICAgICAgfQorCisg ICAgICB2YXIgcHJvcHNNdXRhdGVkID0gaW5zdC5wcm9wcyAhPT0gcHVibGljUHJvcHM7CisgICAg ICB2YXIgY29tcG9uZW50TmFtZSA9IENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQu bmFtZSB8fCAnQ29tcG9uZW50JzsKKworICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rp b24nID8gd2FybmluZyhpbnN0LnByb3BzID09PSB1bmRlZmluZWQgfHwgIXByb3BzTXV0YXRlZCwg JyVzKC4uLik6IFdoZW4gY2FsbGluZyBzdXBlcigpIGluIGAlc2AsIG1ha2Ugc3VyZSB0byBwYXNz ICcgKyAndXAgdGhlIHNhbWUgcHJvcHMgdGhhdCB5b3VyIGNvbXBvbmVudFwncyBjb25zdHJ1Y3Rv ciB3YXMgcGFzc2VkLicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpIDogdm9pZCAwOwor ICAgIH0KKworICAgIC8vIFRoZXNlIHNob3VsZCBiZSBzZXQgdXAgaW4gdGhlIGNvbnN0cnVjdG9y LCBidXQgYXMgYSBjb252ZW5pZW5jZSBmb3IKKyAgICAvLyBzaW1wbGVyIGNsYXNzIGFic3RyYWN0 aW9ucywgd2Ugc2V0IHRoZW0gdXAgYWZ0ZXIgdGhlIGZhY3QuCisgICAgaW5zdC5wcm9wcyA9IHB1 YmxpY1Byb3BzOworICAgIGluc3QuY29udGV4dCA9IHB1YmxpY0NvbnRleHQ7CisgICAgaW5zdC5y ZWZzID0gZW1wdHlPYmplY3Q7CisgICAgaW5zdC51cGRhdGVyID0gdXBkYXRlUXVldWU7CisKKyAg ICB0aGlzLl9pbnN0YW5jZSA9IGluc3Q7CisKKyAgICAvLyBTdG9yZSBhIHJlZmVyZW5jZSBmcm9t IHRoZSBpbnN0YW5jZSBiYWNrIHRvIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbgorICAgIFJl YWN0SW5zdGFuY2VNYXAuc2V0KGluc3QsIHRoaXMpOworCisgICAgaWYgKCJkZXZlbG9wbWVudCIg IT09ICdwcm9kdWN0aW9uJykgeworICAgICAgLy8gU2luY2UgcGxhaW4gSlMgY2xhc3NlcyBhcmUg ZGVmaW5lZCB3aXRob3V0IGFueSBzcGVjaWFsIGluaXRpYWxpemF0aW9uCisgICAgICAvLyBsb2dp Yywgd2UgY2FuIG5vdCBjYXRjaCBjb21tb24gZXJyb3JzIGVhcmx5LiBUaGVyZWZvcmUsIHdlIGhh dmUgdG8KKyAgICAgIC8vIGNhdGNoIHRoZW0gaGVyZSwgYXQgaW5pdGlhbGl6YXRpb24gdGltZSwg aW5zdGVhZC4KKyAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmco IWluc3QuZ2V0SW5pdGlhbFN0YXRlIHx8IGluc3QuZ2V0SW5pdGlhbFN0YXRlLmlzUmVhY3RDbGFz c0FwcHJvdmVkIHx8IGluc3Quc3RhdGUsICdnZXRJbml0aWFsU3RhdGUgd2FzIGRlZmluZWQgb24g JXMsIGEgcGxhaW4gSmF2YVNjcmlwdCBjbGFzcy4gJyArICdUaGlzIGlzIG9ubHkgc3VwcG9ydGVk IGZvciBjbGFzc2VzIGNyZWF0ZWQgdXNpbmcgUmVhY3QuY3JlYXRlQ2xhc3MuICcgKyAnRGlkIHlv dSBtZWFuIHRvIGRlZmluZSBhIHN0YXRlIHByb3BlcnR5IGluc3RlYWQ/JywgdGhpcy5nZXROYW1l KCkgfHwgJ2EgY29tcG9uZW50JykgOiB2b2lkIDA7CisgICAgICAiZGV2ZWxvcG1lbnQiICE9PSAn cHJvZHVjdGlvbicgPyB3YXJuaW5nKCFpbnN0LmdldERlZmF1bHRQcm9wcyB8fCBpbnN0LmdldERl ZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCwgJ2dldERlZmF1bHRQcm9wcyB3YXMgZGVm aW5lZCBvbiAlcywgYSBwbGFpbiBKYXZhU2NyaXB0IGNsYXNzLiAnICsgJ1RoaXMgaXMgb25seSBz dXBwb3J0ZWQgZm9yIGNsYXNzZXMgY3JlYXRlZCB1c2luZyBSZWFjdC5jcmVhdGVDbGFzcy4gJyAr ICdVc2UgYSBzdGF0aWMgcHJvcGVydHkgdG8gZGVmaW5lIGRlZmF1bHRQcm9wcyBpbnN0ZWFkLics IHRoaXMuZ2V0TmFtZSgpIHx8ICdhIGNvbXBvbmVudCcpIDogdm9pZCAwOworICAgICAgImRldmVs b3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghaW5zdC5wcm9wVHlwZXMsICdwcm9w VHlwZXMgd2FzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMuIFVzZSBhIHN0 YXRpYyAnICsgJ3Byb3BlcnR5IHRvIGRlZmluZSBwcm9wVHlwZXMgaW5zdGVhZC4nLCB0aGlzLmdl dE5hbWUoKSB8fCAnYSBjb21wb25lbnQnKSA6IHZvaWQgMDsKKyAgICAgICJkZXZlbG9wbWVudCIg IT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIWluc3QuY29udGV4dFR5cGVzLCAnY29udGV4dFR5 cGVzIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzLiBVc2UgYSAnICsg J3N0YXRpYyBwcm9wZXJ0eSB0byBkZWZpbmUgY29udGV4dFR5cGVzIGluc3RlYWQuJywgdGhpcy5n ZXROYW1lKCkgfHwgJ2EgY29tcG9uZW50JykgOiB2b2lkIDA7CisgICAgICAiZGV2ZWxvcG1lbnQi ICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHR5cGVvZiBpbnN0LmNvbXBvbmVudFNob3VsZFVw ZGF0ZSAhPT0gJ2Z1bmN0aW9uJywgJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25l bnRTaG91bGRVcGRhdGUoKS4gRGlkIHlvdSBtZWFuIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpPyAn ICsgJ1RoZSBuYW1lIGlzIHBocmFzZWQgYXMgYSBxdWVzdGlvbiBiZWNhdXNlIHRoZSBmdW5jdGlv biBpcyAnICsgJ2V4cGVjdGVkIHRvIHJldHVybiBhIHZhbHVlLicsIHRoaXMuZ2V0TmFtZSgpIHx8 ICdBIGNvbXBvbmVudCcpIDogdm9pZCAwOworICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1 Y3Rpb24nID8gd2FybmluZyh0eXBlb2YgaW5zdC5jb21wb25lbnREaWRVbm1vdW50ICE9PSAnZnVu Y3Rpb24nLCAnJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudERpZFVubW91bnQo KS4gQnV0IHRoZXJlIGlzIG5vIHN1Y2ggbGlmZWN5Y2xlIG1ldGhvZC4gJyArICdEaWQgeW91IG1l YW4gY29tcG9uZW50V2lsbFVubW91bnQoKT8nLCB0aGlzLmdldE5hbWUoKSB8fCAnQSBjb21wb25l bnQnKSA6IHZvaWQgMDsKKyAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdh cm5pbmcodHlwZW9mIGluc3QuY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcyAhPT0gJ2Z1bmN0aW9u JywgJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnRXaWxsUmVjaWV2ZVByb3Bz KCkuIERpZCB5b3UgbWVhbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk/JywgdGhpcy5nZXRO YW1lKCkgfHwgJ0EgY29tcG9uZW50JykgOiB2b2lkIDA7CisgICAgfQorCisgICAgdmFyIGluaXRp YWxTdGF0ZSA9IGluc3Quc3RhdGU7CisgICAgaWYgKGluaXRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVk KSB7CisgICAgICBpbnN0LnN0YXRlID0gaW5pdGlhbFN0YXRlID0gbnVsbDsKKyAgICB9CisgICAg ISh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShpbml0 aWFsU3RhdGUpKSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChm YWxzZSwgJyVzLnN0YXRlOiBtdXN0IGJlIHNldCB0byBhbiBvYmplY3Qgb3IgbnVsbCcsIHRoaXMu Z2V0TmFtZSgpIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcpIDogX3Byb2RJbnZhcmlhbnQo JzEwNicsIHRoaXMuZ2V0TmFtZSgpIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcpIDogdm9p ZCAwOworCisgICAgdGhpcy5fcGVuZGluZ1N0YXRlUXVldWUgPSBudWxsOworICAgIHRoaXMuX3Bl bmRpbmdSZXBsYWNlU3RhdGUgPSBmYWxzZTsKKyAgICB0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGUg PSBmYWxzZTsKKworICAgIHZhciBtYXJrdXA7CisgICAgaWYgKGluc3QudW5zdGFibGVfaGFuZGxl RXJyb3IpIHsKKyAgICAgIG1hcmt1cCA9IHRoaXMucGVyZm9ybUluaXRpYWxNb3VudFdpdGhFcnJv ckhhbmRsaW5nKHJlbmRlcmVkRWxlbWVudCwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8s IHRyYW5zYWN0aW9uLCBjb250ZXh0KTsKKyAgICB9IGVsc2UgeworICAgICAgbWFya3VwID0gdGhp cy5wZXJmb3JtSW5pdGlhbE1vdW50KHJlbmRlcmVkRWxlbWVudCwgaG9zdFBhcmVudCwgaG9zdENv bnRhaW5lckluZm8sIHRyYW5zYWN0aW9uLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICBpZiAoaW5z dC5jb21wb25lbnREaWRNb3VudCkgeworICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9k dWN0aW9uJykgeworICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1 ZXVlKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICBtZWFzdXJlTGlmZUN5Y2xlUGVyZihmdW5jdGlv biAoKSB7CisgICAgICAgICAgICByZXR1cm4gaW5zdC5jb21wb25lbnREaWRNb3VudCgpOworICAg ICAgICAgIH0sIF90aGlzLl9kZWJ1Z0lELCAnY29tcG9uZW50RGlkTW91bnQnKTsKKyAgICAgICAg fSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVh ZHkoKS5lbnF1ZXVlKGluc3QuY29tcG9uZW50RGlkTW91bnQsIGluc3QpOworICAgICAgfQorICAg IH0KKworICAgIHJldHVybiBtYXJrdXA7CisgIH0sCisKKyAgX2NvbnN0cnVjdENvbXBvbmVudDog ZnVuY3Rpb24gKGRvQ29uc3RydWN0LCBwdWJsaWNQcm9wcywgcHVibGljQ29udGV4dCwgdXBkYXRl UXVldWUpIHsKKyAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAg ICBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ID0gdGhpczsKKyAgICAgIHRyeSB7CisgICAgICAg IHJldHVybiB0aGlzLl9jb25zdHJ1Y3RDb21wb25lbnRXaXRob3V0T3duZXIoZG9Db25zdHJ1Y3Qs IHB1YmxpY1Byb3BzLCBwdWJsaWNDb250ZXh0LCB1cGRhdGVRdWV1ZSk7CisgICAgICB9IGZpbmFs bHkgeworICAgICAgICBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ID0gbnVsbDsKKyAgICAgIH0K KyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHRoaXMuX2NvbnN0cnVjdENvbXBvbmVudFdpdGhv dXRPd25lcihkb0NvbnN0cnVjdCwgcHVibGljUHJvcHMsIHB1YmxpY0NvbnRleHQsIHVwZGF0ZVF1 ZXVlKTsKKyAgICB9CisgIH0sCisKKyAgX2NvbnN0cnVjdENvbXBvbmVudFdpdGhvdXRPd25lcjog ZnVuY3Rpb24gKGRvQ29uc3RydWN0LCBwdWJsaWNQcm9wcywgcHVibGljQ29udGV4dCwgdXBkYXRl UXVldWUpIHsKKyAgICB2YXIgQ29tcG9uZW50ID0gdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTsK KworICAgIGlmIChkb0NvbnN0cnVjdCkgeworICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdw cm9kdWN0aW9uJykgeworICAgICAgICByZXR1cm4gbWVhc3VyZUxpZmVDeWNsZVBlcmYoZnVuY3Rp b24gKCkgeworICAgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50KHB1YmxpY1Byb3BzLCBwdWJs aWNDb250ZXh0LCB1cGRhdGVRdWV1ZSk7CisgICAgICAgIH0sIHRoaXMuX2RlYnVnSUQsICdjdG9y Jyk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudChwdWJsaWNQ cm9wcywgcHVibGljQ29udGV4dCwgdXBkYXRlUXVldWUpOworICAgICAgfQorICAgIH0KKworICAg IC8vIFRoaXMgY2FuIHN0aWxsIGJlIGFuIGluc3RhbmNlIGluIGNhc2Ugb2YgZmFjdG9yeSBjb21w b25lbnRzCisgICAgLy8gYnV0IHdlJ2xsIGNvdW50IHRoaXMgYXMgdGltZSBzcGVudCByZW5kZXJp bmcgYXMgdGhlIG1vcmUgY29tbW9uIGNhc2UuCisgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdw cm9kdWN0aW9uJykgeworICAgICAgcmV0dXJuIG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0aW9u ICgpIHsKKyAgICAgICAgcmV0dXJuIENvbXBvbmVudChwdWJsaWNQcm9wcywgcHVibGljQ29udGV4 dCwgdXBkYXRlUXVldWUpOworICAgICAgfSwgdGhpcy5fZGVidWdJRCwgJ3JlbmRlcicpOworICAg IH0gZWxzZSB7CisgICAgICByZXR1cm4gQ29tcG9uZW50KHB1YmxpY1Byb3BzLCBwdWJsaWNDb250 ZXh0LCB1cGRhdGVRdWV1ZSk7CisgICAgfQorICB9LAorCisgIHBlcmZvcm1Jbml0aWFsTW91bnRX aXRoRXJyb3JIYW5kbGluZzogZnVuY3Rpb24gKHJlbmRlcmVkRWxlbWVudCwgaG9zdFBhcmVudCwg aG9zdENvbnRhaW5lckluZm8sIHRyYW5zYWN0aW9uLCBjb250ZXh0KSB7CisgICAgdmFyIG1hcmt1 cDsKKyAgICB2YXIgY2hlY2twb2ludCA9IHRyYW5zYWN0aW9uLmNoZWNrcG9pbnQoKTsKKyAgICB0 cnkgeworICAgICAgbWFya3VwID0gdGhpcy5wZXJmb3JtSW5pdGlhbE1vdW50KHJlbmRlcmVkRWxl bWVudCwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIHRyYW5zYWN0aW9uLCBjb250ZXh0 KTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgICAvLyBSb2xsIGJhY2sgdG8gY2hlY2twb2ludCwg aGFuZGxlIGVycm9yICh3aGljaCBtYXkgYWRkIGl0ZW1zIHRvIHRoZSB0cmFuc2FjdGlvbiksIGFu ZCB0YWtlIGEgbmV3IGNoZWNrcG9pbnQKKyAgICAgIHRyYW5zYWN0aW9uLnJvbGxiYWNrKGNoZWNr cG9pbnQpOworICAgICAgdGhpcy5faW5zdGFuY2UudW5zdGFibGVfaGFuZGxlRXJyb3IoZSk7Cisg ICAgICBpZiAodGhpcy5fcGVuZGluZ1N0YXRlUXVldWUpIHsKKyAgICAgICAgdGhpcy5faW5zdGFu Y2Uuc3RhdGUgPSB0aGlzLl9wcm9jZXNzUGVuZGluZ1N0YXRlKHRoaXMuX2luc3RhbmNlLnByb3Bz LCB0aGlzLl9pbnN0YW5jZS5jb250ZXh0KTsKKyAgICAgIH0KKyAgICAgIGNoZWNrcG9pbnQgPSB0 cmFuc2FjdGlvbi5jaGVja3BvaW50KCk7CisKKyAgICAgIHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50 LnVubW91bnRDb21wb25lbnQodHJ1ZSk7CisgICAgICB0cmFuc2FjdGlvbi5yb2xsYmFjayhjaGVj a3BvaW50KTsKKworICAgICAgLy8gVHJ5IGFnYWluIC0gd2UndmUgaW5mb3JtZWQgdGhlIGNvbXBv bmVudCBhYm91dCB0aGUgZXJyb3IsIHNvIHRoZXkgY2FuIHJlbmRlciBhbiBlcnJvciBtZXNzYWdl IHRoaXMgdGltZS4KKyAgICAgIC8vIElmIHRoaXMgdGhyb3dzIGFnYWluLCB0aGUgZXJyb3Igd2ls bCBidWJibGUgdXAgKGFuZCBjYW4gYmUgY2F1Z2h0IGJ5IGEgaGlnaGVyIGVycm9yIGJvdW5kYXJ5 KS4KKyAgICAgIG1hcmt1cCA9IHRoaXMucGVyZm9ybUluaXRpYWxNb3VudChyZW5kZXJlZEVsZW1l bnQsIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCB0cmFuc2FjdGlvbiwgY29udGV4dCk7 CisgICAgfQorICAgIHJldHVybiBtYXJrdXA7CisgIH0sCisKKyAgcGVyZm9ybUluaXRpYWxNb3Vu dDogZnVuY3Rpb24gKHJlbmRlcmVkRWxlbWVudCwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lcklu Zm8sIHRyYW5zYWN0aW9uLCBjb250ZXh0KSB7CisgICAgdmFyIGluc3QgPSB0aGlzLl9pbnN0YW5j ZTsKKworICAgIHZhciBkZWJ1Z0lEID0gMDsKKyAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3By b2R1Y3Rpb24nKSB7CisgICAgICBkZWJ1Z0lEID0gdGhpcy5fZGVidWdJRDsKKyAgICB9CisKKyAg ICBpZiAoaW5zdC5jb21wb25lbnRXaWxsTW91bnQpIHsKKyAgICAgIGlmICgiZGV2ZWxvcG1lbnQi ICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICAgbWVhc3VyZUxpZmVDeWNsZVBlcmYoZnVuY3Rp b24gKCkgeworICAgICAgICAgIHJldHVybiBpbnN0LmNvbXBvbmVudFdpbGxNb3VudCgpOworICAg ICAgICB9LCBkZWJ1Z0lELCAnY29tcG9uZW50V2lsbE1vdW50Jyk7CisgICAgICB9IGVsc2Ugewor ICAgICAgICBpbnN0LmNvbXBvbmVudFdpbGxNb3VudCgpOworICAgICAgfQorICAgICAgLy8gV2hl biBtb3VudGluZywgY2FsbHMgdG8gYHNldFN0YXRlYCBieSBgY29tcG9uZW50V2lsbE1vdW50YCB3 aWxsIHNldAorICAgICAgLy8gYHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlYCB3aXRob3V0IHRyaWdn ZXJpbmcgYSByZS1yZW5kZXIuCisgICAgICBpZiAodGhpcy5fcGVuZGluZ1N0YXRlUXVldWUpIHsK KyAgICAgICAgaW5zdC5zdGF0ZSA9IHRoaXMuX3Byb2Nlc3NQZW5kaW5nU3RhdGUoaW5zdC5wcm9w cywgaW5zdC5jb250ZXh0KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiBub3QgYSBzdGF0 ZWxlc3MgY29tcG9uZW50LCB3ZSBub3cgcmVuZGVyCisgICAgaWYgKHJlbmRlcmVkRWxlbWVudCA9 PT0gdW5kZWZpbmVkKSB7CisgICAgICByZW5kZXJlZEVsZW1lbnQgPSB0aGlzLl9yZW5kZXJWYWxp ZGF0ZWRDb21wb25lbnQoKTsKKyAgICB9CisKKyAgICB2YXIgbm9kZVR5cGUgPSBSZWFjdE5vZGVU eXBlcy5nZXRUeXBlKHJlbmRlcmVkRWxlbWVudCk7CisgICAgdGhpcy5fcmVuZGVyZWROb2RlVHlw ZSA9IG5vZGVUeXBlOworICAgIHZhciBjaGlsZCA9IHRoaXMuX2luc3RhbnRpYXRlUmVhY3RDb21w b25lbnQocmVuZGVyZWRFbGVtZW50LCBub2RlVHlwZSAhPT0gUmVhY3ROb2RlVHlwZXMuRU1QVFkg Lyogc2hvdWxkSGF2ZURlYnVnSUQgKi8KKyAgICApOworICAgIHRoaXMuX3JlbmRlcmVkQ29tcG9u ZW50ID0gY2hpbGQ7CisKKyAgICB2YXIgbWFya3VwID0gUmVhY3RSZWNvbmNpbGVyLm1vdW50Q29t cG9uZW50KGNoaWxkLCB0cmFuc2FjdGlvbiwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8s IHRoaXMuX3Byb2Nlc3NDaGlsZENvbnRleHQoY29udGV4dCksIGRlYnVnSUQpOworCisgICAgaWYg KCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgaWYgKGRlYnVnSUQgIT09 IDApIHsKKyAgICAgICAgdmFyIGNoaWxkRGVidWdJRHMgPSBjaGlsZC5fZGVidWdJRCAhPT0gMCA/ IFtjaGlsZC5fZGVidWdJRF0gOiBbXTsKKyAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVi dWdUb29sLm9uU2V0Q2hpbGRyZW4oZGVidWdJRCwgY2hpbGREZWJ1Z0lEcyk7CisgICAgICB9Cisg ICAgfQorCisgICAgcmV0dXJuIG1hcmt1cDsKKyAgfSwKKworICBnZXRIb3N0Tm9kZTogZnVuY3Rp b24gKCkgeworICAgIHJldHVybiBSZWFjdFJlY29uY2lsZXIuZ2V0SG9zdE5vZGUodGhpcy5fcmVu ZGVyZWRDb21wb25lbnQpOworICB9LAorCisgIC8qKgorICAgKiBSZWxlYXNlcyBhbnkgcmVzb3Vy Y2VzIGFsbG9jYXRlZCBieSBgbW91bnRDb21wb25lbnRgLgorICAgKgorICAgKiBAZmluYWwKKyAg ICogQGludGVybmFsCisgICAqLworICB1bm1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoc2FmZWx5 KSB7CisgICAgaWYgKCF0aGlzLl9yZW5kZXJlZENvbXBvbmVudCkgeworICAgICAgcmV0dXJuOwor ICAgIH0KKworICAgIHZhciBpbnN0ID0gdGhpcy5faW5zdGFuY2U7CisKKyAgICBpZiAoaW5zdC5j b21wb25lbnRXaWxsVW5tb3VudCAmJiAhaW5zdC5fY2FsbGVkQ29tcG9uZW50V2lsbFVubW91bnQp IHsKKyAgICAgIGluc3QuX2NhbGxlZENvbXBvbmVudFdpbGxVbm1vdW50ID0gdHJ1ZTsKKworICAg ICAgaWYgKHNhZmVseSkgeworICAgICAgICB2YXIgbmFtZSA9IHRoaXMuZ2V0TmFtZSgpICsgJy5j b21wb25lbnRXaWxsVW5tb3VudCgpJzsKKyAgICAgICAgUmVhY3RFcnJvclV0aWxzLmludm9rZUd1 YXJkZWRDYWxsYmFjayhuYW1lLCBpbnN0LmNvbXBvbmVudFdpbGxVbm1vdW50LmJpbmQoaW5zdCkp OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0 aW9uJykgeworICAgICAgICAgIG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0aW9uICgpIHsKKyAg ICAgICAgICAgIHJldHVybiBpbnN0LmNvbXBvbmVudFdpbGxVbm1vdW50KCk7CisgICAgICAgICAg fSwgdGhpcy5fZGVidWdJRCwgJ2NvbXBvbmVudFdpbGxVbm1vdW50Jyk7CisgICAgICAgIH0gZWxz ZSB7CisgICAgICAgICAgaW5zdC5jb21wb25lbnRXaWxsVW5tb3VudCgpOworICAgICAgICB9Cisg ICAgICB9CisgICAgfQorCisgICAgaWYgKHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50KSB7CisgICAg ICBSZWFjdFJlY29uY2lsZXIudW5tb3VudENvbXBvbmVudCh0aGlzLl9yZW5kZXJlZENvbXBvbmVu dCwgc2FmZWx5KTsKKyAgICAgIHRoaXMuX3JlbmRlcmVkTm9kZVR5cGUgPSBudWxsOworICAgICAg dGhpcy5fcmVuZGVyZWRDb21wb25lbnQgPSBudWxsOworICAgICAgdGhpcy5faW5zdGFuY2UgPSBu dWxsOworICAgIH0KKworICAgIC8vIFJlc2V0IHBlbmRpbmcgZmllbGRzCisgICAgLy8gRXZlbiBp ZiB0aGlzIGNvbXBvbmVudCBpcyBzY2hlZHVsZWQgZm9yIGFub3RoZXIgdXBkYXRlIGluIFJlYWN0 VXBkYXRlcywKKyAgICAvLyBpdCB3b3VsZCBzdGlsbCBiZSBpZ25vcmVkIGJlY2F1c2UgdGhlc2Ug ZmllbGRzIGFyZSByZXNldC4KKyAgICB0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSA9IG51bGw7Cisg ICAgdGhpcy5fcGVuZGluZ1JlcGxhY2VTdGF0ZSA9IGZhbHNlOworICAgIHRoaXMuX3BlbmRpbmdG b3JjZVVwZGF0ZSA9IGZhbHNlOworICAgIHRoaXMuX3BlbmRpbmdDYWxsYmFja3MgPSBudWxsOwor ICAgIHRoaXMuX3BlbmRpbmdFbGVtZW50ID0gbnVsbDsKKworICAgIC8vIFRoZXNlIGZpZWxkcyBk byBub3QgcmVhbGx5IG5lZWQgdG8gYmUgcmVzZXQgc2luY2UgdGhpcyBvYmplY3QgaXMgbm8KKyAg ICAvLyBsb25nZXIgYWNjZXNzaWJsZS4KKyAgICB0aGlzLl9jb250ZXh0ID0gbnVsbDsKKyAgICB0 aGlzLl9yb290Tm9kZUlEID0gMDsKKyAgICB0aGlzLl90b3BMZXZlbFdyYXBwZXIgPSBudWxsOwor CisgICAgLy8gRGVsZXRlIHRoZSByZWZlcmVuY2UgZnJvbSB0aGUgaW5zdGFuY2UgdG8gdGhpcyBp bnRlcm5hbCByZXByZXNlbnRhdGlvbgorICAgIC8vIHdoaWNoIGFsbG93IHRoZSBpbnRlcm5hbHMg dG8gYmUgcHJvcGVybHkgY2xlYW5lZCB1cCBldmVuIGlmIHRoZSB1c2VyCisgICAgLy8gbGVha3Mg YSByZWZlcmVuY2UgdG8gdGhlIHB1YmxpYyBpbnN0YW5jZS4KKyAgICBSZWFjdEluc3RhbmNlTWFw LnJlbW92ZShpbnN0KTsKKworICAgIC8vIFNvbWUgZXhpc3RpbmcgY29tcG9uZW50cyByZWx5IG9u IGluc3QucHJvcHMgZXZlbiBhZnRlciB0aGV5J3ZlIGJlZW4KKyAgICAvLyBkZXN0cm95ZWQgKGlu IGV2ZW50IGhhbmRsZXJzKS4KKyAgICAvLyBUT0RPOiBpbnN0LnByb3BzID0gbnVsbDsKKyAgICAv LyBUT0RPOiBpbnN0LnN0YXRlID0gbnVsbDsKKyAgICAvLyBUT0RPOiBpbnN0LmNvbnRleHQgPSBu dWxsOworICB9LAorCisgIC8qKgorICAgKiBGaWx0ZXJzIHRoZSBjb250ZXh0IG9iamVjdCB0byBv bmx5IGNvbnRhaW4ga2V5cyBzcGVjaWZpZWQgaW4KKyAgICogYGNvbnRleHRUeXBlc2AKKyAgICoK KyAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHQKKyAgICogQHJldHVybiB7P29iamVjdH0KKyAg ICogQHByaXZhdGUKKyAgICovCisgIF9tYXNrQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHsK KyAgICB2YXIgQ29tcG9uZW50ID0gdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTsKKyAgICB2YXIg Y29udGV4dFR5cGVzID0gQ29tcG9uZW50LmNvbnRleHRUeXBlczsKKyAgICBpZiAoIWNvbnRleHRU eXBlcykgeworICAgICAgcmV0dXJuIGVtcHR5T2JqZWN0OworICAgIH0KKyAgICB2YXIgbWFza2Vk Q29udGV4dCA9IHt9OworICAgIGZvciAodmFyIGNvbnRleHROYW1lIGluIGNvbnRleHRUeXBlcykg eworICAgICAgbWFza2VkQ29udGV4dFtjb250ZXh0TmFtZV0gPSBjb250ZXh0W2NvbnRleHROYW1l XTsKKyAgICB9CisgICAgcmV0dXJuIG1hc2tlZENvbnRleHQ7CisgIH0sCisKKyAgLyoqCisgICAq IEZpbHRlcnMgdGhlIGNvbnRleHQgb2JqZWN0IHRvIG9ubHkgY29udGFpbiBrZXlzIHNwZWNpZmll ZCBpbgorICAgKiBgY29udGV4dFR5cGVzYCwgYW5kIGFzc2VydHMgdGhhdCB0aGV5IGFyZSB2YWxp ZC4KKyAgICoKKyAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHQKKyAgICogQHJldHVybiB7P29i amVjdH0KKyAgICogQHByaXZhdGUKKyAgICovCisgIF9wcm9jZXNzQ29udGV4dDogZnVuY3Rpb24g KGNvbnRleHQpIHsKKyAgICB2YXIgbWFza2VkQ29udGV4dCA9IHRoaXMuX21hc2tDb250ZXh0KGNv bnRleHQpOworICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAg IHZhciBDb21wb25lbnQgPSB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlOworICAgICAgaWYgKENv bXBvbmVudC5jb250ZXh0VHlwZXMpIHsKKyAgICAgICAgdGhpcy5fY2hlY2tDb250ZXh0VHlwZXMo Q29tcG9uZW50LmNvbnRleHRUeXBlcywgbWFza2VkQ29udGV4dCwgJ2NvbnRleHQnKTsKKyAgICAg IH0KKyAgICB9CisgICAgcmV0dXJuIG1hc2tlZENvbnRleHQ7CisgIH0sCisKKyAgLyoqCisgICAq IEBwYXJhbSB7b2JqZWN0fSBjdXJyZW50Q29udGV4dAorICAgKiBAcmV0dXJuIHtvYmplY3R9Cisg ICAqIEBwcml2YXRlCisgICAqLworICBfcHJvY2Vzc0NoaWxkQ29udGV4dDogZnVuY3Rpb24gKGN1 cnJlbnRDb250ZXh0KSB7CisgICAgdmFyIENvbXBvbmVudCA9IHRoaXMuX2N1cnJlbnRFbGVtZW50 LnR5cGU7CisgICAgdmFyIGluc3QgPSB0aGlzLl9pbnN0YW5jZTsKKyAgICB2YXIgY2hpbGRDb250 ZXh0OworCisgICAgaWYgKGluc3QuZ2V0Q2hpbGRDb250ZXh0KSB7CisgICAgICBpZiAoImRldmVs b3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9u LmRlYnVnVG9vbC5vbkJlZ2luUHJvY2Vzc2luZ0NoaWxkQ29udGV4dCgpOworICAgICAgICB0cnkg eworICAgICAgICAgIGNoaWxkQ29udGV4dCA9IGluc3QuZ2V0Q2hpbGRDb250ZXh0KCk7CisgICAg ICAgIH0gZmluYWxseSB7CisgICAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29s Lm9uRW5kUHJvY2Vzc2luZ0NoaWxkQ29udGV4dCgpOworICAgICAgICB9CisgICAgICB9IGVsc2Ug eworICAgICAgICBjaGlsZENvbnRleHQgPSBpbnN0LmdldENoaWxkQ29udGV4dCgpOworICAgICAg fQorICAgIH0KKworICAgIGlmIChjaGlsZENvbnRleHQpIHsKKyAgICAgICEodHlwZW9mIENvbXBv bmVudC5jaGlsZENvbnRleHRUeXBlcyA9PT0gJ29iamVjdCcpID8gImRldmVsb3BtZW50IiAhPT0g J3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMuZ2V0Q2hpbGRDb250ZXh0KCk6IGNo aWxkQ29udGV4dFR5cGVzIG11c3QgYmUgZGVmaW5lZCBpbiBvcmRlciB0byB1c2UgZ2V0Q2hpbGRD b250ZXh0KCkuJywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50Jykg OiBfcHJvZEludmFyaWFudCgnMTA3JywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRl Q29tcG9uZW50JykgOiB2b2lkIDA7CisgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1 Y3Rpb24nKSB7CisgICAgICAgIHRoaXMuX2NoZWNrQ29udGV4dFR5cGVzKENvbXBvbmVudC5jaGls ZENvbnRleHRUeXBlcywgY2hpbGRDb250ZXh0LCAnY2hpbGRDb250ZXh0Jyk7CisgICAgICB9Cisg ICAgICBmb3IgKHZhciBuYW1lIGluIGNoaWxkQ29udGV4dCkgeworICAgICAgICAhKG5hbWUgaW4g Q29tcG9uZW50LmNoaWxkQ29udGV4dFR5cGVzKSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0 aW9uJyA/IGludmFyaWFudChmYWxzZSwgJyVzLmdldENoaWxkQ29udGV4dCgpOiBrZXkgIiVzIiBp cyBub3QgZGVmaW5lZCBpbiBjaGlsZENvbnRleHRUeXBlcy4nLCB0aGlzLmdldE5hbWUoKSB8fCAn UmVhY3RDb21wb3NpdGVDb21wb25lbnQnLCBuYW1lKSA6IF9wcm9kSW52YXJpYW50KCcxMDgnLCB0 aGlzLmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnLCBuYW1lKSA6IHZvaWQg MDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfYXNzaWduKHt9LCBjdXJyZW50Q29udGV4dCwgY2hp bGRDb250ZXh0KTsKKyAgICB9CisgICAgcmV0dXJuIGN1cnJlbnRDb250ZXh0OworICB9LAorCisg IC8qKgorICAgKiBBc3NlcnQgdGhhdCB0aGUgY29udGV4dCB0eXBlcyBhcmUgdmFsaWQKKyAgICoK KyAgICogQHBhcmFtIHtvYmplY3R9IHR5cGVTcGVjcyBNYXAgb2YgY29udGV4dCBmaWVsZCB0byBh IFJlYWN0UHJvcFR5cGUKKyAgICogQHBhcmFtIHtvYmplY3R9IHZhbHVlcyBSdW50aW1lIHZhbHVl cyB0aGF0IG5lZWQgdG8gYmUgdHlwZS1jaGVja2VkCisgICAqIEBwYXJhbSB7c3RyaW5nfSBsb2Nh dGlvbiBlLmcuICJwcm9wIiwgImNvbnRleHQiLCAiY2hpbGQgY29udGV4dCIKKyAgICogQHByaXZh dGUKKyAgICovCisgIF9jaGVja0NvbnRleHRUeXBlczogZnVuY3Rpb24gKHR5cGVTcGVjcywgdmFs dWVzLCBsb2NhdGlvbikgeworICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicp IHsKKyAgICAgIGNoZWNrUmVhY3RUeXBlU3BlYyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24s IHRoaXMuZ2V0TmFtZSgpLCBudWxsLCB0aGlzLl9kZWJ1Z0lEKTsKKyAgICB9CisgIH0sCisKKyAg cmVjZWl2ZUNvbXBvbmVudDogZnVuY3Rpb24gKG5leHRFbGVtZW50LCB0cmFuc2FjdGlvbiwgbmV4 dENvbnRleHQpIHsKKyAgICB2YXIgcHJldkVsZW1lbnQgPSB0aGlzLl9jdXJyZW50RWxlbWVudDsK KyAgICB2YXIgcHJldkNvbnRleHQgPSB0aGlzLl9jb250ZXh0OworCisgICAgdGhpcy5fcGVuZGlu Z0VsZW1lbnQgPSBudWxsOworCisgICAgdGhpcy51cGRhdGVDb21wb25lbnQodHJhbnNhY3Rpb24s IHByZXZFbGVtZW50LCBuZXh0RWxlbWVudCwgcHJldkNvbnRleHQsIG5leHRDb250ZXh0KTsKKyAg fSwKKworICAvKioKKyAgICogSWYgYW55IG9mIGBfcGVuZGluZ0VsZW1lbnRgLCBgX3BlbmRpbmdT dGF0ZVF1ZXVlYCwgb3IgYF9wZW5kaW5nRm9yY2VVcGRhdGVgCisgICAqIGlzIHNldCwgdXBkYXRl IHRoZSBjb21wb25lbnQuCisgICAqCisgICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2Fj dGlvbn0gdHJhbnNhY3Rpb24KKyAgICogQGludGVybmFsCisgICAqLworICBwZXJmb3JtVXBkYXRl SWZOZWNlc3Nhcnk6IGZ1bmN0aW9uICh0cmFuc2FjdGlvbikgeworICAgIGlmICh0aGlzLl9wZW5k aW5nRWxlbWVudCAhPSBudWxsKSB7CisgICAgICBSZWFjdFJlY29uY2lsZXIucmVjZWl2ZUNvbXBv bmVudCh0aGlzLCB0aGlzLl9wZW5kaW5nRWxlbWVudCwgdHJhbnNhY3Rpb24sIHRoaXMuX2NvbnRl eHQpOworICAgIH0gZWxzZSBpZiAodGhpcy5fcGVuZGluZ1N0YXRlUXVldWUgIT09IG51bGwgfHwg dGhpcy5fcGVuZGluZ0ZvcmNlVXBkYXRlKSB7CisgICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudCh0 cmFuc2FjdGlvbiwgdGhpcy5fY3VycmVudEVsZW1lbnQsIHRoaXMuX2N1cnJlbnRFbGVtZW50LCB0 aGlzLl9jb250ZXh0LCB0aGlzLl9jb250ZXh0KTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5f dXBkYXRlQmF0Y2hOdW1iZXIgPSBudWxsOworICAgIH0KKyAgfSwKKworICAvKioKKyAgICogUGVy Zm9ybSBhbiB1cGRhdGUgdG8gYSBtb3VudGVkIGNvbXBvbmVudC4gVGhlIGNvbXBvbmVudFdpbGxS ZWNlaXZlUHJvcHMgYW5kCisgICAqIHNob3VsZENvbXBvbmVudFVwZGF0ZSBtZXRob2RzIGFyZSBj YWxsZWQsIHRoZW4gKGFzc3VtaW5nIHRoZSB1cGRhdGUgaXNuJ3QKKyAgICogc2tpcHBlZCkgdGhl IHJlbWFpbmluZyB1cGRhdGUgbGlmZWN5Y2xlIG1ldGhvZHMgYXJlIGNhbGxlZCBhbmQgdGhlIERP TQorICAgKiByZXByZXNlbnRhdGlvbiBpcyB1cGRhdGVkLgorICAgKgorICAgKiBCeSBkZWZhdWx0 LCB0aGlzIGltcGxlbWVudHMgUmVhY3QncyByZW5kZXJpbmcgYW5kIHJlY29uY2lsaWF0aW9uIGFs Z29yaXRobS4KKyAgICogU29waGlzdGljYXRlZCBjbGllbnRzIG1heSB3aXNoIHRvIG92ZXJyaWRl IHRoaXMuCisgICAqCisgICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJh bnNhY3Rpb24KKyAgICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IHByZXZQYXJlbnRFbGVtZW50Cisg ICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBuZXh0UGFyZW50RWxlbWVudAorICAgKiBAaW50ZXJu YWwKKyAgICogQG92ZXJyaWRhYmxlCisgICAqLworICB1cGRhdGVDb21wb25lbnQ6IGZ1bmN0aW9u ICh0cmFuc2FjdGlvbiwgcHJldlBhcmVudEVsZW1lbnQsIG5leHRQYXJlbnRFbGVtZW50LCBwcmV2 VW5tYXNrZWRDb250ZXh0LCBuZXh0VW5tYXNrZWRDb250ZXh0KSB7CisgICAgdmFyIGluc3QgPSB0 aGlzLl9pbnN0YW5jZTsKKyAgICAhKGluc3QgIT0gbnVsbCkgPyAiZGV2ZWxvcG1lbnQiICE9PSAn cHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdBdHRlbXB0ZWQgdG8gdXBkYXRlIGNvbXBv bmVudCBgJXNgIHRoYXQgaGFzIGFscmVhZHkgYmVlbiB1bm1vdW50ZWQgKG9yIGZhaWxlZCB0byBt b3VudCkuJywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiBf cHJvZEludmFyaWFudCgnMTM2JywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29t cG9uZW50JykgOiB2b2lkIDA7CisKKyAgICB2YXIgd2lsbFJlY2VpdmUgPSBmYWxzZTsKKyAgICB2 YXIgbmV4dENvbnRleHQ7CisKKyAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIGNvbnRleHQgaGFzIGNo YW5nZWQgb3Igbm90CisgICAgaWYgKHRoaXMuX2NvbnRleHQgPT09IG5leHRVbm1hc2tlZENvbnRl eHQpIHsKKyAgICAgIG5leHRDb250ZXh0ID0gaW5zdC5jb250ZXh0OworICAgIH0gZWxzZSB7Cisg ICAgICBuZXh0Q29udGV4dCA9IHRoaXMuX3Byb2Nlc3NDb250ZXh0KG5leHRVbm1hc2tlZENvbnRl eHQpOworICAgICAgd2lsbFJlY2VpdmUgPSB0cnVlOworICAgIH0KKworICAgIHZhciBwcmV2UHJv cHMgPSBwcmV2UGFyZW50RWxlbWVudC5wcm9wczsKKyAgICB2YXIgbmV4dFByb3BzID0gbmV4dFBh cmVudEVsZW1lbnQucHJvcHM7CisKKyAgICAvLyBOb3QgYSBzaW1wbGUgc3RhdGUgdXBkYXRlIGJ1 dCBhIHByb3BzIHVwZGF0ZQorICAgIGlmIChwcmV2UGFyZW50RWxlbWVudCAhPT0gbmV4dFBhcmVu dEVsZW1lbnQpIHsKKyAgICAgIHdpbGxSZWNlaXZlID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBB biB1cGRhdGUgaGVyZSB3aWxsIHNjaGVkdWxlIGFuIHVwZGF0ZSBidXQgaW1tZWRpYXRlbHkgc2V0 CisgICAgLy8gX3BlbmRpbmdTdGF0ZVF1ZXVlIHdoaWNoIHdpbGwgZW5zdXJlIHRoYXQgYW55IHN0 YXRlIHVwZGF0ZXMgZ2V0cworICAgIC8vIGltbWVkaWF0ZWx5IHJlY29uY2lsZWQgaW5zdGVhZCBv ZiB3YWl0aW5nIGZvciB0aGUgbmV4dCBiYXRjaC4KKyAgICBpZiAod2lsbFJlY2VpdmUgJiYgaW5z dC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKSB7CisgICAgICBpZiAoImRldmVsb3BtZW50IiAh PT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAgIG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0aW9u ICgpIHsKKyAgICAgICAgICByZXR1cm4gaW5zdC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5l eHRQcm9wcywgbmV4dENvbnRleHQpOworICAgICAgICB9LCB0aGlzLl9kZWJ1Z0lELCAnY29tcG9u ZW50V2lsbFJlY2VpdmVQcm9wcycpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5zdC5jb21w b25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcywgbmV4dENvbnRleHQpOworICAgICAgfQor ICAgIH0KKworICAgIHZhciBuZXh0U3RhdGUgPSB0aGlzLl9wcm9jZXNzUGVuZGluZ1N0YXRlKG5l eHRQcm9wcywgbmV4dENvbnRleHQpOworICAgIHZhciBzaG91bGRVcGRhdGUgPSB0cnVlOworCisg ICAgaWYgKCF0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGUpIHsKKyAgICAgIGlmIChpbnN0LnNob3Vs ZENvbXBvbmVudFVwZGF0ZSkgeworICAgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1 Y3Rpb24nKSB7CisgICAgICAgICAgc2hvdWxkVXBkYXRlID0gbWVhc3VyZUxpZmVDeWNsZVBlcmYo ZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgcmV0dXJuIGluc3Quc2hvdWxkQ29tcG9uZW50VXBk YXRlKG5leHRQcm9wcywgbmV4dFN0YXRlLCBuZXh0Q29udGV4dCk7CisgICAgICAgICAgfSwgdGhp cy5fZGVidWdJRCwgJ3Nob3VsZENvbXBvbmVudFVwZGF0ZScpOworICAgICAgICB9IGVsc2Ugewor ICAgICAgICAgIHNob3VsZFVwZGF0ZSA9IGluc3Quc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQ cm9wcywgbmV4dFN0YXRlLCBuZXh0Q29udGV4dCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7 CisgICAgICAgIGlmICh0aGlzLl9jb21wb3NpdGVUeXBlID09PSBDb21wb3NpdGVUeXBlcy5QdXJl Q2xhc3MpIHsKKyAgICAgICAgICBzaG91bGRVcGRhdGUgPSAhc2hhbGxvd0VxdWFsKHByZXZQcm9w cywgbmV4dFByb3BzKSB8fCAhc2hhbGxvd0VxdWFsKGluc3Quc3RhdGUsIG5leHRTdGF0ZSk7Cisg ICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3By b2R1Y3Rpb24nKSB7CisgICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJu aW5nKHNob3VsZFVwZGF0ZSAhPT0gdW5kZWZpbmVkLCAnJXMuc2hvdWxkQ29tcG9uZW50VXBkYXRl KCk6IFJldHVybmVkIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIGEgJyArICdib29sZWFuIHZhbHVlLiBN YWtlIHN1cmUgdG8gcmV0dXJuIHRydWUgb3IgZmFsc2UuJywgdGhpcy5nZXROYW1lKCkgfHwgJ1Jl YWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiB2b2lkIDA7CisgICAgfQorCisgICAgdGhpcy5fdXBk YXRlQmF0Y2hOdW1iZXIgPSBudWxsOworICAgIGlmIChzaG91bGRVcGRhdGUpIHsKKyAgICAgIHRo aXMuX3BlbmRpbmdGb3JjZVVwZGF0ZSA9IGZhbHNlOworICAgICAgLy8gV2lsbCBzZXQgYHRoaXMu cHJvcHNgLCBgdGhpcy5zdGF0ZWAgYW5kIGB0aGlzLmNvbnRleHRgLgorICAgICAgdGhpcy5fcGVy Zm9ybUNvbXBvbmVudFVwZGF0ZShuZXh0UGFyZW50RWxlbWVudCwgbmV4dFByb3BzLCBuZXh0U3Rh dGUsIG5leHRDb250ZXh0LCB0cmFuc2FjdGlvbiwgbmV4dFVubWFza2VkQ29udGV4dCk7CisgICAg fSBlbHNlIHsKKyAgICAgIC8vIElmIGl0J3MgZGV0ZXJtaW5lZCB0aGF0IGEgY29tcG9uZW50IHNo b3VsZCBub3QgdXBkYXRlLCB3ZSBzdGlsbCB3YW50CisgICAgICAvLyB0byBzZXQgcHJvcHMgYW5k IHN0YXRlIGJ1dCB3ZSBzaG9ydGN1dCB0aGUgcmVzdCBvZiB0aGUgdXBkYXRlLgorICAgICAgdGhp cy5fY3VycmVudEVsZW1lbnQgPSBuZXh0UGFyZW50RWxlbWVudDsKKyAgICAgIHRoaXMuX2NvbnRl eHQgPSBuZXh0VW5tYXNrZWRDb250ZXh0OworICAgICAgaW5zdC5wcm9wcyA9IG5leHRQcm9wczsK KyAgICAgIGluc3Quc3RhdGUgPSBuZXh0U3RhdGU7CisgICAgICBpbnN0LmNvbnRleHQgPSBuZXh0 Q29udGV4dDsKKyAgICB9CisgIH0sCisKKyAgX3Byb2Nlc3NQZW5kaW5nU3RhdGU6IGZ1bmN0aW9u IChwcm9wcywgY29udGV4dCkgeworICAgIHZhciBpbnN0ID0gdGhpcy5faW5zdGFuY2U7CisgICAg dmFyIHF1ZXVlID0gdGhpcy5fcGVuZGluZ1N0YXRlUXVldWU7CisgICAgdmFyIHJlcGxhY2UgPSB0 aGlzLl9wZW5kaW5nUmVwbGFjZVN0YXRlOworICAgIHRoaXMuX3BlbmRpbmdSZXBsYWNlU3RhdGUg PSBmYWxzZTsKKyAgICB0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSA9IG51bGw7CisKKyAgICBpZiAo IXF1ZXVlKSB7CisgICAgICByZXR1cm4gaW5zdC5zdGF0ZTsKKyAgICB9CisKKyAgICBpZiAocmVw bGFjZSAmJiBxdWV1ZS5sZW5ndGggPT09IDEpIHsKKyAgICAgIHJldHVybiBxdWV1ZVswXTsKKyAg ICB9CisKKyAgICB2YXIgbmV4dFN0YXRlID0gX2Fzc2lnbih7fSwgcmVwbGFjZSA/IHF1ZXVlWzBd IDogaW5zdC5zdGF0ZSk7CisgICAgZm9yICh2YXIgaSA9IHJlcGxhY2UgPyAxIDogMDsgaSA8IHF1 ZXVlLmxlbmd0aDsgaSsrKSB7CisgICAgICB2YXIgcGFydGlhbCA9IHF1ZXVlW2ldOworICAgICAg X2Fzc2lnbihuZXh0U3RhdGUsIHR5cGVvZiBwYXJ0aWFsID09PSAnZnVuY3Rpb24nID8gcGFydGlh bC5jYWxsKGluc3QsIG5leHRTdGF0ZSwgcHJvcHMsIGNvbnRleHQpIDogcGFydGlhbCk7CisgICAg fQorCisgICAgcmV0dXJuIG5leHRTdGF0ZTsKKyAgfSwKKworICAvKioKKyAgICogTWVyZ2VzIG5l dyBwcm9wcyBhbmQgc3RhdGUsIG5vdGlmaWVzIGRlbGVnYXRlIG1ldGhvZHMgb2YgdXBkYXRlIGFu ZAorICAgKiBwZXJmb3JtcyB1cGRhdGUuCisgICAqCisgICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50 fSBuZXh0RWxlbWVudCBOZXh0IGVsZW1lbnQKKyAgICogQHBhcmFtIHtvYmplY3R9IG5leHRQcm9w cyBOZXh0IHB1YmxpYyBvYmplY3QgdG8gc2V0IGFzIHByb3BlcnRpZXMuCisgICAqIEBwYXJhbSB7 P29iamVjdH0gbmV4dFN0YXRlIE5leHQgb2JqZWN0IHRvIHNldCBhcyBzdGF0ZS4KKyAgICogQHBh cmFtIHs/b2JqZWN0fSBuZXh0Q29udGV4dCBOZXh0IHB1YmxpYyBvYmplY3QgdG8gc2V0IGFzIGNv bnRleHQuCisgICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rp b24KKyAgICogQHBhcmFtIHs/b2JqZWN0fSB1bm1hc2tlZENvbnRleHQKKyAgICogQHByaXZhdGUK KyAgICovCisgIF9wZXJmb3JtQ29tcG9uZW50VXBkYXRlOiBmdW5jdGlvbiAobmV4dEVsZW1lbnQs IG5leHRQcm9wcywgbmV4dFN0YXRlLCBuZXh0Q29udGV4dCwgdHJhbnNhY3Rpb24sIHVubWFza2Vk Q29udGV4dCkgeworICAgIHZhciBfdGhpczIgPSB0aGlzOworCisgICAgdmFyIGluc3QgPSB0aGlz Ll9pbnN0YW5jZTsKKworICAgIHZhciBoYXNDb21wb25lbnREaWRVcGRhdGUgPSBCb29sZWFuKGlu c3QuY29tcG9uZW50RGlkVXBkYXRlKTsKKyAgICB2YXIgcHJldlByb3BzOworICAgIHZhciBwcmV2 U3RhdGU7CisgICAgdmFyIHByZXZDb250ZXh0OworICAgIGlmIChoYXNDb21wb25lbnREaWRVcGRh dGUpIHsKKyAgICAgIHByZXZQcm9wcyA9IGluc3QucHJvcHM7CisgICAgICBwcmV2U3RhdGUgPSBp bnN0LnN0YXRlOworICAgICAgcHJldkNvbnRleHQgPSBpbnN0LmNvbnRleHQ7CisgICAgfQorCisg ICAgaWYgKGluc3QuY29tcG9uZW50V2lsbFVwZGF0ZSkgeworICAgICAgaWYgKCJkZXZlbG9wbWVu dCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgICBtZWFzdXJlTGlmZUN5Y2xlUGVyZihmdW5j dGlvbiAoKSB7CisgICAgICAgICAgcmV0dXJuIGluc3QuY29tcG9uZW50V2lsbFVwZGF0ZShuZXh0 UHJvcHMsIG5leHRTdGF0ZSwgbmV4dENvbnRleHQpOworICAgICAgICB9LCB0aGlzLl9kZWJ1Z0lE LCAnY29tcG9uZW50V2lsbFVwZGF0ZScpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5zdC5j b21wb25lbnRXaWxsVXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlLCBuZXh0Q29udGV4dCk7Cisg ICAgICB9CisgICAgfQorCisgICAgdGhpcy5fY3VycmVudEVsZW1lbnQgPSBuZXh0RWxlbWVudDsK KyAgICB0aGlzLl9jb250ZXh0ID0gdW5tYXNrZWRDb250ZXh0OworICAgIGluc3QucHJvcHMgPSBu ZXh0UHJvcHM7CisgICAgaW5zdC5zdGF0ZSA9IG5leHRTdGF0ZTsKKyAgICBpbnN0LmNvbnRleHQg PSBuZXh0Q29udGV4dDsKKworICAgIHRoaXMuX3VwZGF0ZVJlbmRlcmVkQ29tcG9uZW50KHRyYW5z YWN0aW9uLCB1bm1hc2tlZENvbnRleHQpOworCisgICAgaWYgKGhhc0NvbXBvbmVudERpZFVwZGF0 ZSkgeworICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAg ICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGZ1bmN0aW9uICgpIHsK KyAgICAgICAgICBtZWFzdXJlTGlmZUN5Y2xlUGVyZihpbnN0LmNvbXBvbmVudERpZFVwZGF0ZS5i aW5kKGluc3QsIHByZXZQcm9wcywgcHJldlN0YXRlLCBwcmV2Q29udGV4dCksIF90aGlzMi5fZGVi dWdJRCwgJ2NvbXBvbmVudERpZFVwZGF0ZScpOworICAgICAgICB9KTsKKyAgICAgIH0gZWxzZSB7 CisgICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoaW5zdC5j b21wb25lbnREaWRVcGRhdGUuYmluZChpbnN0LCBwcmV2UHJvcHMsIHByZXZTdGF0ZSwgcHJldkNv bnRleHQpLCBpbnN0KTsKKyAgICAgIH0KKyAgICB9CisgIH0sCisKKyAgLyoqCisgICAqIENhbGwg dGhlIGNvbXBvbmVudCdzIGByZW5kZXJgIG1ldGhvZCBhbmQgdXBkYXRlIHRoZSBET00gYWNjb3Jk aW5nbHkuCisgICAqCisgICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJh bnNhY3Rpb24KKyAgICogQGludGVybmFsCisgICAqLworICBfdXBkYXRlUmVuZGVyZWRDb21wb25l bnQ6IGZ1bmN0aW9uICh0cmFuc2FjdGlvbiwgY29udGV4dCkgeworICAgIHZhciBwcmV2Q29tcG9u ZW50SW5zdGFuY2UgPSB0aGlzLl9yZW5kZXJlZENvbXBvbmVudDsKKyAgICB2YXIgcHJldlJlbmRl cmVkRWxlbWVudCA9IHByZXZDb21wb25lbnRJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQ7CisgICAg dmFyIG5leHRSZW5kZXJlZEVsZW1lbnQgPSB0aGlzLl9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnQo KTsKKworICAgIHZhciBkZWJ1Z0lEID0gMDsKKyAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3By b2R1Y3Rpb24nKSB7CisgICAgICBkZWJ1Z0lEID0gdGhpcy5fZGVidWdJRDsKKyAgICB9CisKKyAg ICBpZiAoc2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQocHJldlJlbmRlcmVkRWxlbWVudCwgbmV4 dFJlbmRlcmVkRWxlbWVudCkpIHsKKyAgICAgIFJlYWN0UmVjb25jaWxlci5yZWNlaXZlQ29tcG9u ZW50KHByZXZDb21wb25lbnRJbnN0YW5jZSwgbmV4dFJlbmRlcmVkRWxlbWVudCwgdHJhbnNhY3Rp b24sIHRoaXMuX3Byb2Nlc3NDaGlsZENvbnRleHQoY29udGV4dCkpOworICAgIH0gZWxzZSB7Cisg ICAgICB2YXIgb2xkSG9zdE5vZGUgPSBSZWFjdFJlY29uY2lsZXIuZ2V0SG9zdE5vZGUocHJldkNv bXBvbmVudEluc3RhbmNlKTsKKyAgICAgIFJlYWN0UmVjb25jaWxlci51bm1vdW50Q29tcG9uZW50 KHByZXZDb21wb25lbnRJbnN0YW5jZSwgZmFsc2UpOworCisgICAgICB2YXIgbm9kZVR5cGUgPSBS ZWFjdE5vZGVUeXBlcy5nZXRUeXBlKG5leHRSZW5kZXJlZEVsZW1lbnQpOworICAgICAgdGhpcy5f cmVuZGVyZWROb2RlVHlwZSA9IG5vZGVUeXBlOworICAgICAgdmFyIGNoaWxkID0gdGhpcy5faW5z dGFudGlhdGVSZWFjdENvbXBvbmVudChuZXh0UmVuZGVyZWRFbGVtZW50LCBub2RlVHlwZSAhPT0g UmVhY3ROb2RlVHlwZXMuRU1QVFkgLyogc2hvdWxkSGF2ZURlYnVnSUQgKi8KKyAgICAgICk7Cisg ICAgICB0aGlzLl9yZW5kZXJlZENvbXBvbmVudCA9IGNoaWxkOworCisgICAgICB2YXIgbmV4dE1h cmt1cCA9IFJlYWN0UmVjb25jaWxlci5tb3VudENvbXBvbmVudChjaGlsZCwgdHJhbnNhY3Rpb24s IHRoaXMuX2hvc3RQYXJlbnQsIHRoaXMuX2hvc3RDb250YWluZXJJbmZvLCB0aGlzLl9wcm9jZXNz Q2hpbGRDb250ZXh0KGNvbnRleHQpLCBkZWJ1Z0lEKTsKKworICAgICAgaWYgKCJkZXZlbG9wbWVu dCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgICBpZiAoZGVidWdJRCAhPT0gMCkgeworICAg ICAgICAgIHZhciBjaGlsZERlYnVnSURzID0gY2hpbGQuX2RlYnVnSUQgIT09IDAgPyBbY2hpbGQu X2RlYnVnSURdIDogW107CisgICAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29s Lm9uU2V0Q2hpbGRyZW4oZGVidWdJRCwgY2hpbGREZWJ1Z0lEcyk7CisgICAgICAgIH0KKyAgICAg IH0KKworICAgICAgdGhpcy5fcmVwbGFjZU5vZGVXaXRoTWFya3VwKG9sZEhvc3ROb2RlLCBuZXh0 TWFya3VwLCBwcmV2Q29tcG9uZW50SW5zdGFuY2UpOworICAgIH0KKyAgfSwKKworICAvKioKKyAg ICogT3ZlcnJpZGRlbiBpbiBzaGFsbG93IHJlbmRlcmluZy4KKyAgICoKKyAgICogQHByb3RlY3Rl ZAorICAgKi8KKyAgX3JlcGxhY2VOb2RlV2l0aE1hcmt1cDogZnVuY3Rpb24gKG9sZEhvc3ROb2Rl LCBuZXh0TWFya3VwLCBwcmV2SW5zdGFuY2UpIHsKKyAgICBSZWFjdENvbXBvbmVudEVudmlyb25t ZW50LnJlcGxhY2VOb2RlV2l0aE1hcmt1cChvbGRIb3N0Tm9kZSwgbmV4dE1hcmt1cCwgcHJldklu c3RhbmNlKTsKKyAgfSwKKworICAvKioKKyAgICogQHByb3RlY3RlZAorICAgKi8KKyAgX3JlbmRl clZhbGlkYXRlZENvbXBvbmVudFdpdGhvdXRPd25lck9yQ29udGV4dDogZnVuY3Rpb24gKCkgewor ICAgIHZhciBpbnN0ID0gdGhpcy5faW5zdGFuY2U7CisgICAgdmFyIHJlbmRlcmVkRWxlbWVudDsK KworICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIHJlbmRl cmVkRWxlbWVudCA9IG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0aW9uICgpIHsKKyAgICAgICAg cmV0dXJuIGluc3QucmVuZGVyKCk7CisgICAgICB9LCB0aGlzLl9kZWJ1Z0lELCAncmVuZGVyJyk7 CisgICAgfSBlbHNlIHsKKyAgICAgIHJlbmRlcmVkRWxlbWVudCA9IGluc3QucmVuZGVyKCk7Cisg ICAgfQorCisgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAg Ly8gV2UgYWxsb3cgYXV0by1tb2NrcyB0byBwcm9jZWVkIGFzIGlmIHRoZXkncmUgcmV0dXJuaW5n IG51bGwuCisgICAgICBpZiAocmVuZGVyZWRFbGVtZW50ID09PSB1bmRlZmluZWQgJiYgaW5zdC5y ZW5kZXIuX2lzTW9ja0Z1bmN0aW9uKSB7CisgICAgICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgYmFk IHByYWN0aWNlLiBDb25zaWRlciB3YXJuaW5nIGhlcmUgYW5kCisgICAgICAgIC8vIGRlcHJlY2F0 aW5nIHRoaXMgY29udmVuaWVuY2UuCisgICAgICAgIHJlbmRlcmVkRWxlbWVudCA9IG51bGw7Cisg ICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlbmRlcmVkRWxlbWVudDsKKyAgfSwKKworICAv KioKKyAgICogQHByaXZhdGUKKyAgICovCisgIF9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnQ6IGZ1 bmN0aW9uICgpIHsKKyAgICB2YXIgcmVuZGVyZWRFbGVtZW50OworICAgIGlmICgiZGV2ZWxvcG1l bnQiICE9PSAncHJvZHVjdGlvbicgfHwgdGhpcy5fY29tcG9zaXRlVHlwZSAhPT0gQ29tcG9zaXRl VHlwZXMuU3RhdGVsZXNzRnVuY3Rpb25hbCkgeworICAgICAgUmVhY3RDdXJyZW50T3duZXIuY3Vy cmVudCA9IHRoaXM7CisgICAgICB0cnkgeworICAgICAgICByZW5kZXJlZEVsZW1lbnQgPSB0aGlz Ll9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnRXaXRob3V0T3duZXJPckNvbnRleHQoKTsKKyAgICAg IH0gZmluYWxseSB7CisgICAgICAgIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgPSBudWxsOwor ICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZW5kZXJlZEVsZW1lbnQgPSB0aGlzLl9yZW5k ZXJWYWxpZGF0ZWRDb21wb25lbnRXaXRob3V0T3duZXJPckNvbnRleHQoKTsKKyAgICB9CisgICAg ISgKKyAgICAvLyBUT0RPOiBBbiBgaXNWYWxpZE5vZGVgIGZ1bmN0aW9uIHdvdWxkIHByb2JhYmx5 IGJlIG1vcmUgYXBwcm9wcmlhdGUKKyAgICByZW5kZXJlZEVsZW1lbnQgPT09IG51bGwgfHwgcmVu ZGVyZWRFbGVtZW50ID09PSBmYWxzZSB8fCBSZWFjdC5pc1ZhbGlkRWxlbWVudChyZW5kZXJlZEVs ZW1lbnQpKSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxz ZSwgJyVzLnJlbmRlcigpOiBBIHZhbGlkIFJlYWN0IGVsZW1lbnQgKG9yIG51bGwpIG11c3QgYmUg cmV0dXJuZWQuIFlvdSBtYXkgaGF2ZSByZXR1cm5lZCB1bmRlZmluZWQsIGFuIGFycmF5IG9yIHNv bWUgb3RoZXIgaW52YWxpZCBvYmplY3QuJywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9z aXRlQ29tcG9uZW50JykgOiBfcHJvZEludmFyaWFudCgnMTA5JywgdGhpcy5nZXROYW1lKCkgfHwg J1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiB2b2lkIDA7CisKKyAgICByZXR1cm4gcmVuZGVy ZWRFbGVtZW50OworICB9LAorCisgIC8qKgorICAgKiBMYXppbHkgYWxsb2NhdGVzIHRoZSByZWZz IG9iamVjdCBhbmQgc3RvcmVzIGBjb21wb25lbnRgIGFzIGByZWZgLgorICAgKgorICAgKiBAcGFy YW0ge3N0cmluZ30gcmVmIFJlZmVyZW5jZSBuYW1lLgorICAgKiBAcGFyYW0ge2NvbXBvbmVudH0g Y29tcG9uZW50IENvbXBvbmVudCB0byBzdG9yZSBhcyBgcmVmYC4KKyAgICogQGZpbmFsCisgICAq IEBwcml2YXRlCisgICAqLworICBhdHRhY2hSZWY6IGZ1bmN0aW9uIChyZWYsIGNvbXBvbmVudCkg eworICAgIHZhciBpbnN0ID0gdGhpcy5nZXRQdWJsaWNJbnN0YW5jZSgpOworICAgICEoaW5zdCAh PSBudWxsKSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxz ZSwgJ1N0YXRlbGVzcyBmdW5jdGlvbiBjb21wb25lbnRzIGNhbm5vdCBoYXZlIHJlZnMuJykgOiBf cHJvZEludmFyaWFudCgnMTEwJykgOiB2b2lkIDA7CisgICAgdmFyIHB1YmxpY0NvbXBvbmVudElu c3RhbmNlID0gY29tcG9uZW50LmdldFB1YmxpY0luc3RhbmNlKCk7CisgICAgaWYgKCJkZXZlbG9w bWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBjb21w b25lbnQgJiYgY29tcG9uZW50LmdldE5hbWUgPyBjb21wb25lbnQuZ2V0TmFtZSgpIDogJ2EgY29t cG9uZW50JzsKKyAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmco cHVibGljQ29tcG9uZW50SW5zdGFuY2UgIT0gbnVsbCB8fCBjb21wb25lbnQuX2NvbXBvc2l0ZVR5 cGUgIT09IENvbXBvc2l0ZVR5cGVzLlN0YXRlbGVzc0Z1bmN0aW9uYWwsICdTdGF0ZWxlc3MgZnVu Y3Rpb24gY29tcG9uZW50cyBjYW5ub3QgYmUgZ2l2ZW4gcmVmcyAnICsgJyhTZWUgcmVmICIlcyIg aW4gJXMgY3JlYXRlZCBieSAlcykuICcgKyAnQXR0ZW1wdHMgdG8gYWNjZXNzIHRoaXMgcmVmIHdp bGwgZmFpbC4nLCByZWYsIGNvbXBvbmVudE5hbWUsIHRoaXMuZ2V0TmFtZSgpKSA6IHZvaWQgMDsK KyAgICB9CisgICAgdmFyIHJlZnMgPSBpbnN0LnJlZnMgPT09IGVtcHR5T2JqZWN0ID8gaW5zdC5y ZWZzID0ge30gOiBpbnN0LnJlZnM7CisgICAgcmVmc1tyZWZdID0gcHVibGljQ29tcG9uZW50SW5z dGFuY2U7CisgIH0sCisKKyAgLyoqCisgICAqIERldGFjaGVzIGEgcmVmZXJlbmNlIG5hbWUuCisg ICAqCisgICAqIEBwYXJhbSB7c3RyaW5nfSByZWYgTmFtZSB0byBkZXJlZmVyZW5jZS4KKyAgICog QGZpbmFsCisgICAqIEBwcml2YXRlCisgICAqLworICBkZXRhY2hSZWY6IGZ1bmN0aW9uIChyZWYp IHsKKyAgICB2YXIgcmVmcyA9IHRoaXMuZ2V0UHVibGljSW5zdGFuY2UoKS5yZWZzOworICAgIGRl bGV0ZSByZWZzW3JlZl07CisgIH0sCisKKyAgLyoqCisgICAqIEdldCBhIHRleHQgZGVzY3JpcHRp b24gb2YgdGhlIGNvbXBvbmVudCB0aGF0IGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IGl0CisgICAq IGluIGVycm9yIG1lc3NhZ2VzLgorICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBuYW1lIG9yIG51 bGwuCisgICAqIEBpbnRlcm5hbAorICAgKi8KKyAgZ2V0TmFtZTogZnVuY3Rpb24gKCkgeworICAg IHZhciB0eXBlID0gdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTsKKyAgICB2YXIgY29uc3RydWN0 b3IgPSB0aGlzLl9pbnN0YW5jZSAmJiB0aGlzLl9pbnN0YW5jZS5jb25zdHJ1Y3RvcjsKKyAgICBy ZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCBjb25zdHJ1Y3RvciAmJiBjb25zdHJ1Y3Rvci5kaXNw bGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgY29uc3RydWN0b3IgJiYgY29uc3RydWN0b3IubmFtZSB8 fCBudWxsOworICB9LAorCisgIC8qKgorICAgKiBHZXQgdGhlIHB1YmxpY2x5IGFjY2Vzc2libGUg cmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb21wb25lbnQgLSBpLmUuIHdoYXQKKyAgICogaXMgZXhw b3NlZCBieSByZWZzIGFuZCByZXR1cm5lZCBieSByZW5kZXIuIENhbiBiZSBudWxsIGZvciBzdGF0 ZWxlc3MKKyAgICogY29tcG9uZW50cy4KKyAgICoKKyAgICogQHJldHVybiB7UmVhY3RDb21wb25l bnR9IHRoZSBwdWJsaWMgY29tcG9uZW50IGluc3RhbmNlLgorICAgKiBAaW50ZXJuYWwKKyAgICov CisgIGdldFB1YmxpY0luc3RhbmNlOiBmdW5jdGlvbiAoKSB7CisgICAgdmFyIGluc3QgPSB0aGlz Ll9pbnN0YW5jZTsKKyAgICBpZiAodGhpcy5fY29tcG9zaXRlVHlwZSA9PT0gQ29tcG9zaXRlVHlw ZXMuU3RhdGVsZXNzRnVuY3Rpb25hbCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAg IHJldHVybiBpbnN0OworICB9LAorCisgIC8vIFN0dWIKKyAgX2luc3RhbnRpYXRlUmVhY3RDb21w b25lbnQ6IG51bGwKKworfTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdENvbXBvc2l0ZUNvbXBv bmVudDsKK30seyIxMTYiOjExNiwiMTE5IjoxMTksIjEyMyI6MTIzLCIxMjQiOjEyNCwiMTMzIjox MzMsIjE0MCI6MTQwLCIxNDYiOjE0NiwiMTQ3IjoxNDcsIjE0OCI6MTQ4LCIyOCI6MjgsIjUwIjo1 MCwiNTgiOjU4LCI1OSI6NTksIjYzIjo2MywiNjgiOjY4LCI5NyI6OTd9XSwzMDpbZnVuY3Rpb24o X2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQs IEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291 cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGlu IHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJj ZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBm b3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8K KworLyogZ2xvYmFsIGhhc093blByb3BlcnR5OnRydWUgKi8KKworJ3VzZSBzdHJpY3QnOworCit2 YXIgX3Byb2RJbnZhcmlhbnQgPSBfZGVyZXFfKDExNiksCisgICAgX2Fzc2lnbiA9IF9kZXJlcV8o MTQ4KTsKKwordmFyIEF1dG9Gb2N1c1V0aWxzID0gX2RlcmVxXygyKTsKK3ZhciBDU1NQcm9wZXJ0 eU9wZXJhdGlvbnMgPSBfZGVyZXFfKDUpOwordmFyIERPTUxhenlUcmVlID0gX2RlcmVxXyg5KTsK K3ZhciBET01OYW1lc3BhY2VzID0gX2RlcmVxXygxMCk7Cit2YXIgRE9NUHJvcGVydHkgPSBfZGVy ZXFfKDExKTsKK3ZhciBET01Qcm9wZXJ0eU9wZXJhdGlvbnMgPSBfZGVyZXFfKDEyKTsKK3ZhciBF dmVudFBsdWdpbkh1YiA9IF9kZXJlcV8oMTYpOwordmFyIEV2ZW50UGx1Z2luUmVnaXN0cnkgPSBf ZGVyZXFfKDE3KTsKK3ZhciBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIgPSBfZGVyZXFfKDI1KTsK K3ZhciBSZWFjdERPTUNvbXBvbmVudEZsYWdzID0gX2RlcmVxXygzMSk7Cit2YXIgUmVhY3RET01D b21wb25lbnRUcmVlID0gX2RlcmVxXygzMik7Cit2YXIgUmVhY3RET01JbnB1dCA9IF9kZXJlcV8o MzYpOwordmFyIFJlYWN0RE9NT3B0aW9uID0gX2RlcmVxXygzNyk7Cit2YXIgUmVhY3RET01TZWxl Y3QgPSBfZGVyZXFfKDM4KTsKK3ZhciBSZWFjdERPTVRleHRhcmVhID0gX2RlcmVxXyg0Myk7Cit2 YXIgUmVhY3RJbnN0cnVtZW50YXRpb24gPSBfZGVyZXFfKDU5KTsKK3ZhciBSZWFjdE11bHRpQ2hp bGQgPSBfZGVyZXFfKDYyKTsKK3ZhciBSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9uID0g X2RlcmVxXyg3Mik7CisKK3ZhciBlbXB0eUZ1bmN0aW9uID0gX2RlcmVxXygxMzIpOwordmFyIGVz Y2FwZVRleHRDb250ZW50Rm9yQnJvd3NlciA9IF9kZXJlcV8oMTAwKTsKK3ZhciBpbnZhcmlhbnQg PSBfZGVyZXFfKDE0MCk7Cit2YXIgaXNFdmVudFN1cHBvcnRlZCA9IF9kZXJlcV8oMTEzKTsKK3Zh ciBzaGFsbG93RXF1YWwgPSBfZGVyZXFfKDE0Nik7Cit2YXIgdmFsaWRhdGVET01OZXN0aW5nID0g X2RlcmVxXygxMjEpOwordmFyIHdhcm5pbmcgPSBfZGVyZXFfKDE0Nyk7CisKK3ZhciBGbGFncyA9 IFJlYWN0RE9NQ29tcG9uZW50RmxhZ3M7Cit2YXIgZGVsZXRlTGlzdGVuZXIgPSBFdmVudFBsdWdp bkh1Yi5kZWxldGVMaXN0ZW5lcjsKK3ZhciBnZXROb2RlID0gUmVhY3RET01Db21wb25lbnRUcmVl LmdldE5vZGVGcm9tSW5zdGFuY2U7Cit2YXIgbGlzdGVuVG8gPSBSZWFjdEJyb3dzZXJFdmVudEVt aXR0ZXIubGlzdGVuVG87Cit2YXIgcmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMgPSBFdmVudFBsdWdp blJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzOworCisvLyBGb3IgcXVpY2tseSBtYXRj aGluZyBjaGlsZHJlbiB0eXBlLCB0byB0ZXN0IGlmIGNhbiBiZSB0cmVhdGVkIGFzIGNvbnRlbnQu Cit2YXIgQ09OVEVOVF9UWVBFUyA9IHsgJ3N0cmluZyc6IHRydWUsICdudW1iZXInOiB0cnVlIH07 CisKK3ZhciBTVFlMRSA9ICdzdHlsZSc7Cit2YXIgSFRNTCA9ICdfX2h0bWwnOwordmFyIFJFU0VS VkVEX1BST1BTID0geworICBjaGlsZHJlbjogbnVsbCwKKyAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhU TUw6IG51bGwsCisgIHN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZzogbnVsbAorfTsKKwor Ly8gTm9kZSB0eXBlIGZvciBkb2N1bWVudCBmcmFnbWVudHMgKE5vZGUuRE9DVU1FTlRfRlJBR01F TlRfTk9ERSkuCit2YXIgRE9DX0ZSQUdNRU5UX1RZUEUgPSAxMTsKKworZnVuY3Rpb24gZ2V0RGVj bGFyYXRpb25FcnJvckFkZGVuZHVtKGludGVybmFsSW5zdGFuY2UpIHsKKyAgaWYgKGludGVybmFs SW5zdGFuY2UpIHsKKyAgICB2YXIgb3duZXIgPSBpbnRlcm5hbEluc3RhbmNlLl9jdXJyZW50RWxl bWVudC5fb3duZXIgfHwgbnVsbDsKKyAgICBpZiAob3duZXIpIHsKKyAgICAgIHZhciBuYW1lID0g b3duZXIuZ2V0TmFtZSgpOworICAgICAgaWYgKG5hbWUpIHsKKyAgICAgICAgcmV0dXJuICcgVGhp cyBET00gbm9kZSB3YXMgcmVuZGVyZWQgYnkgYCcgKyBuYW1lICsgJ2AuJzsKKyAgICAgIH0KKyAg ICB9CisgIH0KKyAgcmV0dXJuICcnOworfQorCitmdW5jdGlvbiBmcmllbmRseVN0cmluZ2lmeShv YmopIHsKKyAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7CisgICAgaWYgKEFycmF5Lmlz QXJyYXkob2JqKSkgeworICAgICAgcmV0dXJuICdbJyArIG9iai5tYXAoZnJpZW5kbHlTdHJpbmdp ZnkpLmpvaW4oJywgJykgKyAnXSc7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBwYWlycyA9IFtd OworICAgICAgZm9yICh2YXIga2V5IGluIG9iaikgeworICAgICAgICBpZiAoT2JqZWN0LnByb3Rv dHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeworICAgICAgICAgIHZhciBrZXlF c2NhcGVkID0gL15bYS16JF9dW1x3JF9dKiQvaS50ZXN0KGtleSkgPyBrZXkgOiBKU09OLnN0cmlu Z2lmeShrZXkpOworICAgICAgICAgIHBhaXJzLnB1c2goa2V5RXNjYXBlZCArICc6ICcgKyBmcmll bmRseVN0cmluZ2lmeShvYmpba2V5XSkpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1 cm4gJ3snICsgcGFpcnMuam9pbignLCAnKSArICd9JzsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlw ZW9mIG9iaiA9PT0gJ3N0cmluZycpIHsKKyAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqKTsK KyAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7CisgICAgcmV0dXJuICdb ZnVuY3Rpb24gb2JqZWN0XSc7CisgIH0KKyAgLy8gRGlmZmVycyBmcm9tIEpTT04uc3RyaW5naWZ5 IGluIHRoYXQgdW5kZWZpbmVkIGJlY2F1c2UgdW5kZWZpbmVkIGFuZCB0aGF0CisgIC8vIGluZiBh bmQgbmFuIGRvbid0IGJlY29tZSBudWxsCisgIHJldHVybiBTdHJpbmcob2JqKTsKK30KKwordmFy IHN0eWxlTXV0YXRpb25XYXJuaW5nID0ge307CisKK2Z1bmN0aW9uIGNoZWNrQW5kV2FybkZvck11 dGF0ZWRTdHlsZShzdHlsZTEsIHN0eWxlMiwgY29tcG9uZW50KSB7CisgIGlmIChzdHlsZTEgPT0g bnVsbCB8fCBzdHlsZTIgPT0gbnVsbCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoc2hhbGxv d0VxdWFsKHN0eWxlMSwgc3R5bGUyKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHZhciBjb21w b25lbnROYW1lID0gY29tcG9uZW50Ll90YWc7CisgIHZhciBvd25lciA9IGNvbXBvbmVudC5fY3Vy cmVudEVsZW1lbnQuX293bmVyOworICB2YXIgb3duZXJOYW1lOworICBpZiAob3duZXIpIHsKKyAg ICBvd25lck5hbWUgPSBvd25lci5nZXROYW1lKCk7CisgIH0KKworICB2YXIgaGFzaCA9IG93bmVy TmFtZSArICd8JyArIGNvbXBvbmVudE5hbWU7CisKKyAgaWYgKHN0eWxlTXV0YXRpb25XYXJuaW5n Lmhhc093blByb3BlcnR5KGhhc2gpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3R5bGVNdXRh dGlvbldhcm5pbmdbaGFzaF0gPSB0cnVlOworCisgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0 aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdgJXNgIHdhcyBwYXNzZWQgYSBzdHlsZSBvYmplY3QgdGhh dCBoYXMgcHJldmlvdXNseSBiZWVuIG11dGF0ZWQuICcgKyAnTXV0YXRpbmcgYHN0eWxlYCBpcyBk ZXByZWNhdGVkLiBDb25zaWRlciBjbG9uaW5nIGl0IGJlZm9yZWhhbmQuIENoZWNrICcgKyAndGhl IGByZW5kZXJgICVzLiBQcmV2aW91cyBzdHlsZTogJXMuIE11dGF0ZWQgc3R5bGU6ICVzLicsIGNv bXBvbmVudE5hbWUsIG93bmVyID8gJ29mIGAnICsgb3duZXJOYW1lICsgJ2AnIDogJ3VzaW5nIDwn ICsgY29tcG9uZW50TmFtZSArICc+JywgZnJpZW5kbHlTdHJpbmdpZnkoc3R5bGUxKSwgZnJpZW5k bHlTdHJpbmdpZnkoc3R5bGUyKSkgOiB2b2lkIDA7Cit9CisKKy8qKgorICogQHBhcmFtIHtvYmpl Y3R9IGNvbXBvbmVudAorICogQHBhcmFtIHs/b2JqZWN0fSBwcm9wcworICovCitmdW5jdGlvbiBh c3NlcnRWYWxpZFByb3BzKGNvbXBvbmVudCwgcHJvcHMpIHsKKyAgaWYgKCFwcm9wcykgeworICAg IHJldHVybjsKKyAgfQorICAvLyBOb3RlIHRoZSB1c2Ugb2YgYD09YCB3aGljaCBjaGVja3MgZm9y IG51bGwgb3IgdW5kZWZpbmVkLgorICBpZiAodm9pZEVsZW1lbnRUYWdzW2NvbXBvbmVudC5fdGFn XSkgeworICAgICEocHJvcHMuY2hpbGRyZW4gPT0gbnVsbCAmJiBwcm9wcy5kYW5nZXJvdXNseVNl dElubmVySFRNTCA9PSBudWxsKSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGlu dmFyaWFudChmYWxzZSwgJyVzIGlzIGEgdm9pZCBlbGVtZW50IHRhZyBhbmQgbXVzdCBuZWl0aGVy IGhhdmUgYGNoaWxkcmVuYCBub3IgdXNlIGBkYW5nZXJvdXNseVNldElubmVySFRNTGAuJXMnLCBj b21wb25lbnQuX3RhZywgY29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC5fb3duZXIgPyAnIENoZWNr IHRoZSByZW5kZXIgbWV0aG9kIG9mICcgKyBjb21wb25lbnQuX2N1cnJlbnRFbGVtZW50Ll9vd25l ci5nZXROYW1lKCkgKyAnLicgOiAnJykgOiBfcHJvZEludmFyaWFudCgnMTM3JywgY29tcG9uZW50 Ll90YWcsIGNvbXBvbmVudC5fY3VycmVudEVsZW1lbnQuX293bmVyID8gJyBDaGVjayB0aGUgcmVu ZGVyIG1ldGhvZCBvZiAnICsgY29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC5fb3duZXIuZ2V0TmFt ZSgpICsgJy4nIDogJycpIDogdm9pZCAwOworICB9CisgIGlmIChwcm9wcy5kYW5nZXJvdXNseVNl dElubmVySFRNTCAhPSBudWxsKSB7CisgICAgIShwcm9wcy5jaGlsZHJlbiA9PSBudWxsKSA/ICJk ZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0NhbiBvbmx5 IHNldCBvbmUgb2YgYGNoaWxkcmVuYCBvciBgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxg LicpIDogX3Byb2RJbnZhcmlhbnQoJzYwJykgOiB2b2lkIDA7CisgICAgISh0eXBlb2YgcHJvcHMu ZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgPT09ICdvYmplY3QnICYmIEhUTUwgaW4gcHJvcHMuZGFu Z2Vyb3VzbHlTZXRJbm5lckhUTUwpID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8g aW52YXJpYW50KGZhbHNlLCAnYHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYCBtdXN0IGJl IGluIHRoZSBmb3JtIGB7X19odG1sOiAuLi59YC4gUGxlYXNlIHZpc2l0IGh0dHBzOi8vZmIubWUv cmVhY3QtaW52YXJpYW50LWRhbmdlcm91c2x5LXNldC1pbm5lci1odG1sIGZvciBtb3JlIGluZm9y bWF0aW9uLicpIDogX3Byb2RJbnZhcmlhbnQoJzYxJykgOiB2b2lkIDA7CisgIH0KKyAgaWYgKCJk ZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICJkZXZlbG9wbWVudCIgIT09ICdw cm9kdWN0aW9uJyA/IHdhcm5pbmcocHJvcHMuaW5uZXJIVE1MID09IG51bGwsICdEaXJlY3RseSBz ZXR0aW5nIHByb3BlcnR5IGBpbm5lckhUTUxgIGlzIG5vdCBwZXJtaXR0ZWQuICcgKyAnRm9yIG1v cmUgaW5mb3JtYXRpb24sIGxvb2t1cCBkb2N1bWVudGF0aW9uIG9uIGBkYW5nZXJvdXNseVNldElu bmVySFRNTGAuJykgOiB2b2lkIDA7CisgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24n ID8gd2FybmluZyhwcm9wcy5zdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgfHwgIXByb3Bz LmNvbnRlbnRFZGl0YWJsZSB8fCBwcm9wcy5jaGlsZHJlbiA9PSBudWxsLCAnQSBjb21wb25lbnQg aXMgYGNvbnRlbnRFZGl0YWJsZWAgYW5kIGNvbnRhaW5zIGBjaGlsZHJlbmAgbWFuYWdlZCBieSAn ICsgJ1JlYWN0LiBJdCBpcyBub3cgeW91ciByZXNwb25zaWJpbGl0eSB0byBndWFyYW50ZWUgdGhh dCBub25lIG9mICcgKyAndGhvc2Ugbm9kZXMgYXJlIHVuZXhwZWN0ZWRseSBtb2RpZmllZCBvciBk dXBsaWNhdGVkLiBUaGlzIGlzICcgKyAncHJvYmFibHkgbm90IGludGVudGlvbmFsLicpIDogdm9p ZCAwOworICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcocHJvcHMu b25Gb2N1c0luID09IG51bGwgJiYgcHJvcHMub25Gb2N1c091dCA9PSBudWxsLCAnUmVhY3QgdXNl cyBvbkZvY3VzIGFuZCBvbkJsdXIgaW5zdGVhZCBvZiBvbkZvY3VzSW4gYW5kIG9uRm9jdXNPdXQu ICcgKyAnQWxsIFJlYWN0IGV2ZW50cyBhcmUgbm9ybWFsaXplZCB0byBidWJibGUsIHNvIG9uRm9j dXNJbiBhbmQgb25Gb2N1c091dCAnICsgJ2FyZSBub3QgbmVlZGVkL3N1cHBvcnRlZCBieSBSZWFj dC4nKSA6IHZvaWQgMDsKKyAgfQorICAhKHByb3BzLnN0eWxlID09IG51bGwgfHwgdHlwZW9mIHBy b3BzLnN0eWxlID09PSAnb2JqZWN0JykgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicg PyBpbnZhcmlhbnQoZmFsc2UsICdUaGUgYHN0eWxlYCBwcm9wIGV4cGVjdHMgYSBtYXBwaW5nIGZy b20gc3R5bGUgcHJvcGVydGllcyB0byB2YWx1ZXMsIG5vdCBhIHN0cmluZy4gRm9yIGV4YW1wbGUs IHN0eWxlPXt7bWFyZ2luUmlnaHQ6IHNwYWNpbmcgKyBcJ2VtXCd9fSB3aGVuIHVzaW5nIEpTWC4l cycsIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShjb21wb25lbnQpKSA6IF9wcm9kSW52YXJp YW50KCc2MicsIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShjb21wb25lbnQpKSA6IHZvaWQg MDsKK30KKworZnVuY3Rpb24gZW5xdWV1ZVB1dExpc3RlbmVyKGluc3QsIHJlZ2lzdHJhdGlvbk5h bWUsIGxpc3RlbmVyLCB0cmFuc2FjdGlvbikgeworICBpZiAodHJhbnNhY3Rpb24gaW5zdGFuY2Vv ZiBSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9uKSB7CisgICAgcmV0dXJuOworICB9Cisg IGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAvLyBJRTggaGFzIG5v IEFQSSBmb3IgZXZlbnQgY2FwdHVyaW5nIGFuZCB0aGUgYG9uU2Nyb2xsYCBldmVudCBkb2Vzbid0 CisgICAgLy8gYnViYmxlLgorICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdh cm5pbmcocmVnaXN0cmF0aW9uTmFtZSAhPT0gJ29uU2Nyb2xsJyB8fCBpc0V2ZW50U3VwcG9ydGVk KCdzY3JvbGwnLCB0cnVlKSwgJ1RoaXMgYnJvd3NlciBkb2VzblwndCBzdXBwb3J0IHRoZSBgb25T Y3JvbGxgIGV2ZW50JykgOiB2b2lkIDA7CisgIH0KKyAgdmFyIGNvbnRhaW5lckluZm8gPSBpbnN0 Ll9ob3N0Q29udGFpbmVySW5mbzsKKyAgdmFyIGlzRG9jdW1lbnRGcmFnbWVudCA9IGNvbnRhaW5l ckluZm8uX25vZGUgJiYgY29udGFpbmVySW5mby5fbm9kZS5ub2RlVHlwZSA9PT0gRE9DX0ZSQUdN RU5UX1RZUEU7CisgIHZhciBkb2MgPSBpc0RvY3VtZW50RnJhZ21lbnQgPyBjb250YWluZXJJbmZv Ll9ub2RlIDogY29udGFpbmVySW5mby5fb3duZXJEb2N1bWVudDsKKyAgbGlzdGVuVG8ocmVnaXN0 cmF0aW9uTmFtZSwgZG9jKTsKKyAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5x dWV1ZShwdXRMaXN0ZW5lciwgeworICAgIGluc3Q6IGluc3QsCisgICAgcmVnaXN0cmF0aW9uTmFt ZTogcmVnaXN0cmF0aW9uTmFtZSwKKyAgICBsaXN0ZW5lcjogbGlzdGVuZXIKKyAgfSk7Cit9CisK K2Z1bmN0aW9uIHB1dExpc3RlbmVyKCkgeworICB2YXIgbGlzdGVuZXJUb1B1dCA9IHRoaXM7Cisg IEV2ZW50UGx1Z2luSHViLnB1dExpc3RlbmVyKGxpc3RlbmVyVG9QdXQuaW5zdCwgbGlzdGVuZXJU b1B1dC5yZWdpc3RyYXRpb25OYW1lLCBsaXN0ZW5lclRvUHV0Lmxpc3RlbmVyKTsKK30KKworZnVu Y3Rpb24gaW5wdXRQb3N0TW91bnQoKSB7CisgIHZhciBpbnN0ID0gdGhpczsKKyAgUmVhY3RET01J bnB1dC5wb3N0TW91bnRXcmFwcGVyKGluc3QpOworfQorCitmdW5jdGlvbiB0ZXh0YXJlYVBvc3RN b3VudCgpIHsKKyAgdmFyIGluc3QgPSB0aGlzOworICBSZWFjdERPTVRleHRhcmVhLnBvc3RNb3Vu dFdyYXBwZXIoaW5zdCk7Cit9CisKK2Z1bmN0aW9uIG9wdGlvblBvc3RNb3VudCgpIHsKKyAgdmFy IGluc3QgPSB0aGlzOworICBSZWFjdERPTU9wdGlvbi5wb3N0TW91bnRXcmFwcGVyKGluc3QpOwor fQorCit2YXIgc2V0QW5kVmFsaWRhdGVDb250ZW50Q2hpbGREZXYgPSBlbXB0eUZ1bmN0aW9uOwor aWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICBzZXRBbmRWYWxpZGF0ZUNv bnRlbnRDaGlsZERldiA9IGZ1bmN0aW9uIChjb250ZW50KSB7CisgICAgdmFyIGhhc0V4aXN0aW5n Q29udGVudCA9IHRoaXMuX2NvbnRlbnREZWJ1Z0lEICE9IG51bGw7CisgICAgdmFyIGRlYnVnSUQg PSB0aGlzLl9kZWJ1Z0lEOworICAgIC8vIFRoaXMgSUQgcmVwcmVzZW50cyB0aGUgaW5saW5lZCBj aGlsZCB0aGF0IGhhcyBubyBiYWNraW5nIGluc3RhbmNlOgorICAgIHZhciBjb250ZW50RGVidWdJ RCA9IC1kZWJ1Z0lEOworCisgICAgaWYgKGNvbnRlbnQgPT0gbnVsbCkgeworICAgICAgaWYgKGhh c0V4aXN0aW5nQ29udGVudCkgeworICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rv b2wub25Vbm1vdW50Q29tcG9uZW50KHRoaXMuX2NvbnRlbnREZWJ1Z0lEKTsKKyAgICAgIH0KKyAg ICAgIHRoaXMuX2NvbnRlbnREZWJ1Z0lEID0gbnVsbDsKKyAgICAgIHJldHVybjsKKyAgICB9CisK KyAgICB2YWxpZGF0ZURPTU5lc3RpbmcobnVsbCwgU3RyaW5nKGNvbnRlbnQpLCB0aGlzLCB0aGlz Ll9hbmNlc3RvckluZm8pOworICAgIHRoaXMuX2NvbnRlbnREZWJ1Z0lEID0gY29udGVudERlYnVn SUQ7CisgICAgaWYgKGhhc0V4aXN0aW5nQ29udGVudCkgeworICAgICAgUmVhY3RJbnN0cnVtZW50 YXRpb24uZGVidWdUb29sLm9uQmVmb3JlVXBkYXRlQ29tcG9uZW50KGNvbnRlbnREZWJ1Z0lELCBj b250ZW50KTsKKyAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblVwZGF0ZUNv bXBvbmVudChjb250ZW50RGVidWdJRCk7CisgICAgfSBlbHNlIHsKKyAgICAgIFJlYWN0SW5zdHJ1 bWVudGF0aW9uLmRlYnVnVG9vbC5vbkJlZm9yZU1vdW50Q29tcG9uZW50KGNvbnRlbnREZWJ1Z0lE LCBjb250ZW50LCBkZWJ1Z0lEKTsKKyAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9v bC5vbk1vdW50Q29tcG9uZW50KGNvbnRlbnREZWJ1Z0lEKTsKKyAgICAgIFJlYWN0SW5zdHJ1bWVu dGF0aW9uLmRlYnVnVG9vbC5vblNldENoaWxkcmVuKGRlYnVnSUQsIFtjb250ZW50RGVidWdJRF0p OworICAgIH0KKyAgfTsKK30KKworLy8gVGhlcmUgYXJlIHNvIG1hbnkgbWVkaWEgZXZlbnRzLCBp dCBtYWtlcyBzZW5zZSB0byBqdXN0CisvLyBtYWludGFpbiBhIGxpc3QgcmF0aGVyIHRoYW4gY3Jl YXRlIGEgYHRyYXBCdWJibGVkRXZlbnRgIGZvciBlYWNoCit2YXIgbWVkaWFFdmVudHMgPSB7Cisg IHRvcEFib3J0OiAnYWJvcnQnLAorICB0b3BDYW5QbGF5OiAnY2FucGxheScsCisgIHRvcENhblBs YXlUaHJvdWdoOiAnY2FucGxheXRocm91Z2gnLAorICB0b3BEdXJhdGlvbkNoYW5nZTogJ2R1cmF0 aW9uY2hhbmdlJywKKyAgdG9wRW1wdGllZDogJ2VtcHRpZWQnLAorICB0b3BFbmNyeXB0ZWQ6ICdl bmNyeXB0ZWQnLAorICB0b3BFbmRlZDogJ2VuZGVkJywKKyAgdG9wRXJyb3I6ICdlcnJvcicsCisg IHRvcExvYWRlZERhdGE6ICdsb2FkZWRkYXRhJywKKyAgdG9wTG9hZGVkTWV0YWRhdGE6ICdsb2Fk ZWRtZXRhZGF0YScsCisgIHRvcExvYWRTdGFydDogJ2xvYWRzdGFydCcsCisgIHRvcFBhdXNlOiAn cGF1c2UnLAorICB0b3BQbGF5OiAncGxheScsCisgIHRvcFBsYXlpbmc6ICdwbGF5aW5nJywKKyAg dG9wUHJvZ3Jlc3M6ICdwcm9ncmVzcycsCisgIHRvcFJhdGVDaGFuZ2U6ICdyYXRlY2hhbmdlJywK KyAgdG9wU2Vla2VkOiAnc2Vla2VkJywKKyAgdG9wU2Vla2luZzogJ3NlZWtpbmcnLAorICB0b3BT dGFsbGVkOiAnc3RhbGxlZCcsCisgIHRvcFN1c3BlbmQ6ICdzdXNwZW5kJywKKyAgdG9wVGltZVVw ZGF0ZTogJ3RpbWV1cGRhdGUnLAorICB0b3BWb2x1bWVDaGFuZ2U6ICd2b2x1bWVjaGFuZ2UnLAor ICB0b3BXYWl0aW5nOiAnd2FpdGluZycKK307CisKK2Z1bmN0aW9uIHRyYXBCdWJibGVkRXZlbnRz TG9jYWwoKSB7CisgIHZhciBpbnN0ID0gdGhpczsKKyAgLy8gSWYgYSBjb21wb25lbnQgcmVuZGVy cyB0byBudWxsIG9yIGlmIGFub3RoZXIgY29tcG9uZW50IGZhdGFscyBhbmQgY2F1c2VzCisgIC8v IHRoZSBzdGF0ZSBvZiB0aGUgdHJlZSB0byBiZSBjb3JydXB0ZWQsIGBub2RlYCBoZXJlIGNhbiBi ZSBudWxsLgorICAhaW5zdC5fcm9vdE5vZGVJRCA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0 aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ011c3QgYmUgbW91bnRlZCB0byB0cmFwIGV2ZW50cycp IDogX3Byb2RJbnZhcmlhbnQoJzYzJykgOiB2b2lkIDA7CisgIHZhciBub2RlID0gZ2V0Tm9kZShp bnN0KTsKKyAgIW5vZGUgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlh bnQoZmFsc2UsICd0cmFwQnViYmxlZEV2ZW50KC4uLik6IFJlcXVpcmVzIG5vZGUgdG8gYmUgcmVu ZGVyZWQuJykgOiBfcHJvZEludmFyaWFudCgnNjQnKSA6IHZvaWQgMDsKKworICBzd2l0Y2ggKGlu c3QuX3RhZykgeworICAgIGNhc2UgJ2lmcmFtZSc6CisgICAgY2FzZSAnb2JqZWN0JzoKKyAgICAg IGluc3QuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnMgPSBbUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVy LnRyYXBCdWJibGVkRXZlbnQoJ3RvcExvYWQnLCAnbG9hZCcsIG5vZGUpXTsKKyAgICAgIGJyZWFr OworICAgIGNhc2UgJ3ZpZGVvJzoKKyAgICBjYXNlICdhdWRpbyc6CisKKyAgICAgIGluc3QuX3dy YXBwZXJTdGF0ZS5saXN0ZW5lcnMgPSBbXTsKKyAgICAgIC8vIENyZWF0ZSBsaXN0ZW5lciBmb3Ig ZWFjaCBtZWRpYSBldmVudAorICAgICAgZm9yICh2YXIgZXZlbnQgaW4gbWVkaWFFdmVudHMpIHsK KyAgICAgICAgaWYgKG1lZGlhRXZlbnRzLmhhc093blByb3BlcnR5KGV2ZW50KSkgeworICAgICAg ICAgIGluc3QuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnMucHVzaChSZWFjdEJyb3dzZXJFdmVudEVt aXR0ZXIudHJhcEJ1YmJsZWRFdmVudChldmVudCwgbWVkaWFFdmVudHNbZXZlbnRdLCBub2RlKSk7 CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3NvdXJjZSc6Cisg ICAgICBpbnN0Ll93cmFwcGVyU3RhdGUubGlzdGVuZXJzID0gW1JlYWN0QnJvd3NlckV2ZW50RW1p dHRlci50cmFwQnViYmxlZEV2ZW50KCd0b3BFcnJvcicsICdlcnJvcicsIG5vZGUpXTsKKyAgICAg IGJyZWFrOworICAgIGNhc2UgJ2ltZyc6CisgICAgICBpbnN0Ll93cmFwcGVyU3RhdGUubGlzdGVu ZXJzID0gW1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci50cmFwQnViYmxlZEV2ZW50KCd0b3BFcnJv cicsICdlcnJvcicsIG5vZGUpLCBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIudHJhcEJ1YmJsZWRF dmVudCgndG9wTG9hZCcsICdsb2FkJywgbm9kZSldOworICAgICAgYnJlYWs7CisgICAgY2FzZSAn Zm9ybSc6CisgICAgICBpbnN0Ll93cmFwcGVyU3RhdGUubGlzdGVuZXJzID0gW1JlYWN0QnJvd3Nl ckV2ZW50RW1pdHRlci50cmFwQnViYmxlZEV2ZW50KCd0b3BSZXNldCcsICdyZXNldCcsIG5vZGUp LCBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wU3VibWl0Jywg J3N1Ym1pdCcsIG5vZGUpXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2lucHV0JzoKKyAgICBj YXNlICdzZWxlY3QnOgorICAgIGNhc2UgJ3RleHRhcmVhJzoKKyAgICAgIGluc3QuX3dyYXBwZXJT dGF0ZS5saXN0ZW5lcnMgPSBbUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLnRyYXBCdWJibGVkRXZl bnQoJ3RvcEludmFsaWQnLCAnaW52YWxpZCcsIG5vZGUpXTsKKyAgICAgIGJyZWFrOworICB9Cit9 CisKK2Z1bmN0aW9uIHBvc3RVcGRhdGVTZWxlY3RXcmFwcGVyKCkgeworICBSZWFjdERPTVNlbGVj dC5wb3N0VXBkYXRlV3JhcHBlcih0aGlzKTsKK30KKworLy8gRm9yIEhUTUwsIGNlcnRhaW4gdGFn cyBzaG91bGQgb21pdCB0aGVpciBjbG9zZSB0YWcuIFdlIGtlZXAgYSB3aGl0ZWxpc3QgZm9yCisv LyB0aG9zZSBzcGVjaWFsLWNhc2UgdGFncy4KKwordmFyIG9taXR0ZWRDbG9zZVRhZ3MgPSB7Cisg ICdhcmVhJzogdHJ1ZSwKKyAgJ2Jhc2UnOiB0cnVlLAorICAnYnInOiB0cnVlLAorICAnY29sJzog dHJ1ZSwKKyAgJ2VtYmVkJzogdHJ1ZSwKKyAgJ2hyJzogdHJ1ZSwKKyAgJ2ltZyc6IHRydWUsCisg ICdpbnB1dCc6IHRydWUsCisgICdrZXlnZW4nOiB0cnVlLAorICAnbGluayc6IHRydWUsCisgICdt ZXRhJzogdHJ1ZSwKKyAgJ3BhcmFtJzogdHJ1ZSwKKyAgJ3NvdXJjZSc6IHRydWUsCisgICd0cmFj ayc6IHRydWUsCisgICd3YnInOiB0cnVlCit9OworCit2YXIgbmV3bGluZUVhdGluZ1RhZ3MgPSB7 CisgICdsaXN0aW5nJzogdHJ1ZSwKKyAgJ3ByZSc6IHRydWUsCisgICd0ZXh0YXJlYSc6IHRydWUK K307CisKKy8vIEZvciBIVE1MLCBjZXJ0YWluIHRhZ3MgY2Fubm90IGhhdmUgY2hpbGRyZW4uIFRo aXMgaGFzIHRoZSBzYW1lIHB1cnBvc2UgYXMKKy8vIGBvbWl0dGVkQ2xvc2VUYWdzYCBleGNlcHQg dGhhdCBgbWVudWl0ZW1gIHNob3VsZCBzdGlsbCBoYXZlIGl0cyBjbG9zaW5nIHRhZy4KKwordmFy IHZvaWRFbGVtZW50VGFncyA9IF9hc3NpZ24oeworICAnbWVudWl0ZW0nOiB0cnVlCit9LCBvbWl0 dGVkQ2xvc2VUYWdzKTsKKworLy8gV2UgYWNjZXB0IGFueSB0YWcgdG8gYmUgcmVuZGVyZWQgYnV0 IHNpbmNlIHRoaXMgZ2V0cyBpbmplY3RlZCBpbnRvIGFyYml0cmFyeQorLy8gSFRNTCwgd2Ugd2Fu dCB0byBtYWtlIHN1cmUgdGhhdCBpdCdzIGEgc2FmZSB0YWcuCisvLyBodHRwOi8vd3d3LnczLm9y Zy9UUi9SRUMteG1sLyNOVC1OYW1lCisKK3ZhciBWQUxJRF9UQUdfUkVHRVggPSAvXlthLXpBLVpd W2EtekEtWjpfXC5cLVxkXSokLzsgLy8gU2ltcGxpZmllZCBzdWJzZXQKK3ZhciB2YWxpZGF0ZWRU YWdDYWNoZSA9IHt9OwordmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7CisK K2Z1bmN0aW9uIHZhbGlkYXRlRGFuZ2Vyb3VzVGFnKHRhZykgeworICBpZiAoIWhhc093blByb3Bl cnR5LmNhbGwodmFsaWRhdGVkVGFnQ2FjaGUsIHRhZykpIHsKKyAgICAhVkFMSURfVEFHX1JFR0VY LnRlc3QodGFnKSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChm YWxzZSwgJ0ludmFsaWQgdGFnOiAlcycsIHRhZykgOiBfcHJvZEludmFyaWFudCgnNjUnLCB0YWcp IDogdm9pZCAwOworICAgIHZhbGlkYXRlZFRhZ0NhY2hlW3RhZ10gPSB0cnVlOworICB9Cit9CisK K2Z1bmN0aW9uIGlzQ3VzdG9tQ29tcG9uZW50KHRhZ05hbWUsIHByb3BzKSB7CisgIHJldHVybiB0 YWdOYW1lLmluZGV4T2YoJy0nKSA+PSAwIHx8IHByb3BzLmlzICE9IG51bGw7Cit9CisKK3ZhciBn bG9iYWxJZENvdW50ZXIgPSAxOworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgUmVhY3QgY2xhc3Mg dGhhdCBpcyBpZGVtcG90ZW50IGFuZCBjYXBhYmxlIG9mIGNvbnRhaW5pbmcgb3RoZXIKKyAqIFJl YWN0IGNvbXBvbmVudHMuIEl0IGFjY2VwdHMgZXZlbnQgbGlzdGVuZXJzIGFuZCBET00gcHJvcGVy dGllcyB0aGF0IGFyZQorICogdmFsaWQgYWNjb3JkaW5nIHRvIGBET01Qcm9wZXJ0eWAuCisgKgor ICogIC0gRXZlbnQgbGlzdGVuZXJzOiBgb25DbGlja2AsIGBvbk1vdXNlRG93bmAsIGV0Yy4KKyAq ICAtIERPTSBwcm9wZXJ0aWVzOiBgY2xhc3NOYW1lYCwgYG5hbWVgLCBgdGl0bGVgLCBldGMuCisg KgorICogVGhlIGBzdHlsZWAgcHJvcGVydHkgZnVuY3Rpb25zIGRpZmZlcmVudGx5IGZyb20gdGhl IERPTSBBUEkuIEl0IGFjY2VwdHMgYW4KKyAqIG9iamVjdCBtYXBwaW5nIG9mIHN0eWxlIHByb3Bl cnRpZXMgdG8gdmFsdWVzLgorICoKKyAqIEBjb25zdHJ1Y3RvciBSZWFjdERPTUNvbXBvbmVudAor ICogQGV4dGVuZHMgUmVhY3RNdWx0aUNoaWxkCisgKi8KK2Z1bmN0aW9uIFJlYWN0RE9NQ29tcG9u ZW50KGVsZW1lbnQpIHsKKyAgdmFyIHRhZyA9IGVsZW1lbnQudHlwZTsKKyAgdmFsaWRhdGVEYW5n ZXJvdXNUYWcodGFnKTsKKyAgdGhpcy5fY3VycmVudEVsZW1lbnQgPSBlbGVtZW50OworICB0aGlz Ll90YWcgPSB0YWcudG9Mb3dlckNhc2UoKTsKKyAgdGhpcy5fbmFtZXNwYWNlVVJJID0gbnVsbDsK KyAgdGhpcy5fcmVuZGVyZWRDaGlsZHJlbiA9IG51bGw7CisgIHRoaXMuX3ByZXZpb3VzU3R5bGUg PSBudWxsOworICB0aGlzLl9wcmV2aW91c1N0eWxlQ29weSA9IG51bGw7CisgIHRoaXMuX2hvc3RO b2RlID0gbnVsbDsKKyAgdGhpcy5faG9zdFBhcmVudCA9IG51bGw7CisgIHRoaXMuX3Jvb3ROb2Rl SUQgPSAwOworICB0aGlzLl9kb21JRCA9IDA7CisgIHRoaXMuX2hvc3RDb250YWluZXJJbmZvID0g bnVsbDsKKyAgdGhpcy5fd3JhcHBlclN0YXRlID0gbnVsbDsKKyAgdGhpcy5fdG9wTGV2ZWxXcmFw cGVyID0gbnVsbDsKKyAgdGhpcy5fZmxhZ3MgPSAwOworICBpZiAoImRldmVsb3BtZW50IiAhPT0g J3Byb2R1Y3Rpb24nKSB7CisgICAgdGhpcy5fYW5jZXN0b3JJbmZvID0gbnVsbDsKKyAgICBzZXRB bmRWYWxpZGF0ZUNvbnRlbnRDaGlsZERldi5jYWxsKHRoaXMsIG51bGwpOworICB9Cit9CisKK1Jl YWN0RE9NQ29tcG9uZW50LmRpc3BsYXlOYW1lID0gJ1JlYWN0RE9NQ29tcG9uZW50JzsKKworUmVh Y3RET01Db21wb25lbnQuTWl4aW4gPSB7CisKKyAgLyoqCisgICAqIEdlbmVyYXRlcyByb290IHRh ZyBtYXJrdXAgdGhlbiByZWN1cnNlcy4gVGhpcyBtZXRob2QgaGFzIHNpZGUgZWZmZWN0cyBhbmQK KyAgICogaXMgbm90IGlkZW1wb3RlbnQuCisgICAqCisgICAqIEBpbnRlcm5hbAorICAgKiBAcGFy YW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb258UmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2Fj dGlvbn0gdHJhbnNhY3Rpb24KKyAgICogQHBhcmFtIHs/UmVhY3RET01Db21wb25lbnR9IHRoZSBw YXJlbnQgY29tcG9uZW50IGluc3RhbmNlCisgICAqIEBwYXJhbSB7P29iamVjdH0gaW5mbyBhYm91 dCB0aGUgaG9zdCBjb250YWluZXIKKyAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHQKKyAgICog QHJldHVybiB7c3RyaW5nfSBUaGUgY29tcHV0ZWQgbWFya3VwLgorICAgKi8KKyAgbW91bnRDb21w b25lbnQ6IGZ1bmN0aW9uICh0cmFuc2FjdGlvbiwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lcklu Zm8sIGNvbnRleHQpIHsKKyAgICB0aGlzLl9yb290Tm9kZUlEID0gZ2xvYmFsSWRDb3VudGVyKys7 CisgICAgdGhpcy5fZG9tSUQgPSBob3N0Q29udGFpbmVySW5mby5faWRDb3VudGVyKys7CisgICAg dGhpcy5faG9zdFBhcmVudCA9IGhvc3RQYXJlbnQ7CisgICAgdGhpcy5faG9zdENvbnRhaW5lcklu Zm8gPSBob3N0Q29udGFpbmVySW5mbzsKKworICAgIHZhciBwcm9wcyA9IHRoaXMuX2N1cnJlbnRF bGVtZW50LnByb3BzOworCisgICAgc3dpdGNoICh0aGlzLl90YWcpIHsKKyAgICAgIGNhc2UgJ2F1 ZGlvJzoKKyAgICAgIGNhc2UgJ2Zvcm0nOgorICAgICAgY2FzZSAnaWZyYW1lJzoKKyAgICAgIGNh c2UgJ2ltZyc6CisgICAgICBjYXNlICdsaW5rJzoKKyAgICAgIGNhc2UgJ29iamVjdCc6CisgICAg ICBjYXNlICdzb3VyY2UnOgorICAgICAgY2FzZSAndmlkZW8nOgorICAgICAgICB0aGlzLl93cmFw cGVyU3RhdGUgPSB7CisgICAgICAgICAgbGlzdGVuZXJzOiBudWxsCisgICAgICAgIH07CisgICAg ICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUodHJhcEJ1YmJsZWRF dmVudHNMb2NhbCwgdGhpcyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnaW5wdXQnOgor ICAgICAgICBSZWFjdERPTUlucHV0Lm1vdW50V3JhcHBlcih0aGlzLCBwcm9wcywgaG9zdFBhcmVu dCk7CisgICAgICAgIHByb3BzID0gUmVhY3RET01JbnB1dC5nZXRIb3N0UHJvcHModGhpcywgcHJv cHMpOworICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHRy YXBCdWJibGVkRXZlbnRzTG9jYWwsIHRoaXMpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Ug J29wdGlvbic6CisgICAgICAgIFJlYWN0RE9NT3B0aW9uLm1vdW50V3JhcHBlcih0aGlzLCBwcm9w cywgaG9zdFBhcmVudCk7CisgICAgICAgIHByb3BzID0gUmVhY3RET01PcHRpb24uZ2V0SG9zdFBy b3BzKHRoaXMsIHByb3BzKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdzZWxlY3QnOgor ICAgICAgICBSZWFjdERPTVNlbGVjdC5tb3VudFdyYXBwZXIodGhpcywgcHJvcHMsIGhvc3RQYXJl bnQpOworICAgICAgICBwcm9wcyA9IFJlYWN0RE9NU2VsZWN0LmdldEhvc3RQcm9wcyh0aGlzLCBw cm9wcyk7CisgICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUo dHJhcEJ1YmJsZWRFdmVudHNMb2NhbCwgdGhpcyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2Fz ZSAndGV4dGFyZWEnOgorICAgICAgICBSZWFjdERPTVRleHRhcmVhLm1vdW50V3JhcHBlcih0aGlz LCBwcm9wcywgaG9zdFBhcmVudCk7CisgICAgICAgIHByb3BzID0gUmVhY3RET01UZXh0YXJlYS5n ZXRIb3N0UHJvcHModGhpcywgcHJvcHMpOworICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1v dW50UmVhZHkoKS5lbnF1ZXVlKHRyYXBCdWJibGVkRXZlbnRzTG9jYWwsIHRoaXMpOworICAgICAg ICBicmVhazsKKyAgICB9CisKKyAgICBhc3NlcnRWYWxpZFByb3BzKHRoaXMsIHByb3BzKTsKKwor ICAgIC8vIFdlIGNyZWF0ZSB0YWdzIGluIHRoZSBuYW1lc3BhY2Ugb2YgdGhlaXIgcGFyZW50IGNv bnRhaW5lciwgZXhjZXB0IEhUTUwKKyAgICAvLyB0YWdzIGdldCBubyBuYW1lc3BhY2UuCisgICAg dmFyIG5hbWVzcGFjZVVSSTsKKyAgICB2YXIgcGFyZW50VGFnOworICAgIGlmIChob3N0UGFyZW50 ICE9IG51bGwpIHsKKyAgICAgIG5hbWVzcGFjZVVSSSA9IGhvc3RQYXJlbnQuX25hbWVzcGFjZVVS STsKKyAgICAgIHBhcmVudFRhZyA9IGhvc3RQYXJlbnQuX3RhZzsKKyAgICB9IGVsc2UgaWYgKGhv c3RDb250YWluZXJJbmZvLl90YWcpIHsKKyAgICAgIG5hbWVzcGFjZVVSSSA9IGhvc3RDb250YWlu ZXJJbmZvLl9uYW1lc3BhY2VVUkk7CisgICAgICBwYXJlbnRUYWcgPSBob3N0Q29udGFpbmVySW5m by5fdGFnOworICAgIH0KKyAgICBpZiAobmFtZXNwYWNlVVJJID09IG51bGwgfHwgbmFtZXNwYWNl VVJJID09PSBET01OYW1lc3BhY2VzLnN2ZyAmJiBwYXJlbnRUYWcgPT09ICdmb3JlaWdub2JqZWN0 JykgeworICAgICAgbmFtZXNwYWNlVVJJID0gRE9NTmFtZXNwYWNlcy5odG1sOworICAgIH0KKyAg ICBpZiAobmFtZXNwYWNlVVJJID09PSBET01OYW1lc3BhY2VzLmh0bWwpIHsKKyAgICAgIGlmICh0 aGlzLl90YWcgPT09ICdzdmcnKSB7CisgICAgICAgIG5hbWVzcGFjZVVSSSA9IERPTU5hbWVzcGFj ZXMuc3ZnOworICAgICAgfSBlbHNlIGlmICh0aGlzLl90YWcgPT09ICdtYXRoJykgeworICAgICAg ICBuYW1lc3BhY2VVUkkgPSBET01OYW1lc3BhY2VzLm1hdGhtbDsKKyAgICAgIH0KKyAgICB9Cisg ICAgdGhpcy5fbmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOworCisgICAgaWYgKCJkZXZlbG9w bWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgdmFyIHBhcmVudEluZm87CisgICAgICBp ZiAoaG9zdFBhcmVudCAhPSBudWxsKSB7CisgICAgICAgIHBhcmVudEluZm8gPSBob3N0UGFyZW50 Ll9hbmNlc3RvckluZm87CisgICAgICB9IGVsc2UgaWYgKGhvc3RDb250YWluZXJJbmZvLl90YWcp IHsKKyAgICAgICAgcGFyZW50SW5mbyA9IGhvc3RDb250YWluZXJJbmZvLl9hbmNlc3RvckluZm87 CisgICAgICB9CisgICAgICBpZiAocGFyZW50SW5mbykgeworICAgICAgICAvLyBwYXJlbnRJbmZv IHNob3VsZCBhbHdheXMgYmUgcHJlc2VudCBleGNlcHQgZm9yIHRoZSB0b3AtbGV2ZWwKKyAgICAg ICAgLy8gY29tcG9uZW50IHdoZW4gc2VydmVyIHJlbmRlcmluZworICAgICAgICB2YWxpZGF0ZURP TU5lc3RpbmcodGhpcy5fdGFnLCBudWxsLCB0aGlzLCBwYXJlbnRJbmZvKTsKKyAgICAgIH0KKyAg ICAgIHRoaXMuX2FuY2VzdG9ySW5mbyA9IHZhbGlkYXRlRE9NTmVzdGluZy51cGRhdGVkQW5jZXN0 b3JJbmZvKHBhcmVudEluZm8sIHRoaXMuX3RhZywgdGhpcyk7CisgICAgfQorCisgICAgdmFyIG1v dW50SW1hZ2U7CisgICAgaWYgKHRyYW5zYWN0aW9uLnVzZUNyZWF0ZUVsZW1lbnQpIHsKKyAgICAg IHZhciBvd25lckRvY3VtZW50ID0gaG9zdENvbnRhaW5lckluZm8uX293bmVyRG9jdW1lbnQ7Cisg ICAgICB2YXIgZWw7CisgICAgICBpZiAobmFtZXNwYWNlVVJJID09PSBET01OYW1lc3BhY2VzLmh0 bWwpIHsKKyAgICAgICAgaWYgKHRoaXMuX3RhZyA9PT0gJ3NjcmlwdCcpIHsKKyAgICAgICAgICAv LyBDcmVhdGUgdGhlIHNjcmlwdCB2aWEgLmlubmVySFRNTCBzbyBpdHMgInBhcnNlci1pbnNlcnRl ZCIgZmxhZyBpcworICAgICAgICAgIC8vIHNldCB0byB0cnVlIGFuZCBpdCBkb2VzIG5vdCBleGVj dXRlCisgICAgICAgICAgdmFyIGRpdiA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2 Jyk7CisgICAgICAgICAgdmFyIHR5cGUgPSB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlOworICAg ICAgICAgIGRpdi5pbm5lckhUTUwgPSAnPCcgKyB0eXBlICsgJz48LycgKyB0eXBlICsgJz4nOwor ICAgICAgICAgIGVsID0gZGl2LnJlbW92ZUNoaWxkKGRpdi5maXJzdENoaWxkKTsKKyAgICAgICAg fSBlbHNlIGlmIChwcm9wcy5pcykgeworICAgICAgICAgIGVsID0gb3duZXJEb2N1bWVudC5jcmVh dGVFbGVtZW50KHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGUsIHByb3BzLmlzKTsKKyAgICAgICAg fSBlbHNlIHsKKyAgICAgICAgICAvLyBTZXBhcmF0ZSBlbHNlIGJyYW5jaCBpbnN0ZWFkIG9mIHVz aW5nIGBwcm9wcy5pcyB8fCB1bmRlZmluZWRgIGFib3ZlIGJlY3Vhc2Ugb2YgYSBGaXJlZm94IGJ1 Zy4KKyAgICAgICAgICAvLyBTZWUgZGlzY3Vzc2lvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vZmFj ZWJvb2svcmVhY3QvcHVsbC82ODk2CisgICAgICAgICAgLy8gYW5kIGRpc2N1c3Npb24gaW4gaHR0 cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTI3NjI0MAorICAgICAg ICAgIGVsID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KHRoaXMuX2N1cnJlbnRFbGVtZW50 LnR5cGUpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBlbCA9IG93bmVyRG9j dW1lbnQuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZVVSSSwgdGhpcy5fY3VycmVudEVsZW1lbnQu dHlwZSk7CisgICAgICB9CisgICAgICBSZWFjdERPTUNvbXBvbmVudFRyZWUucHJlY2FjaGVOb2Rl KHRoaXMsIGVsKTsKKyAgICAgIHRoaXMuX2ZsYWdzIHw9IEZsYWdzLmhhc0NhY2hlZENoaWxkTm9k ZXM7CisgICAgICBpZiAoIXRoaXMuX2hvc3RQYXJlbnQpIHsKKyAgICAgICAgRE9NUHJvcGVydHlP cGVyYXRpb25zLnNldEF0dHJpYnV0ZUZvclJvb3QoZWwpOworICAgICAgfQorICAgICAgdGhpcy5f dXBkYXRlRE9NUHJvcGVydGllcyhudWxsLCBwcm9wcywgdHJhbnNhY3Rpb24pOworICAgICAgdmFy IGxhenlUcmVlID0gRE9NTGF6eVRyZWUoZWwpOworICAgICAgdGhpcy5fY3JlYXRlSW5pdGlhbENo aWxkcmVuKHRyYW5zYWN0aW9uLCBwcm9wcywgY29udGV4dCwgbGF6eVRyZWUpOworICAgICAgbW91 bnRJbWFnZSA9IGxhenlUcmVlOworICAgIH0gZWxzZSB7CisgICAgICB2YXIgdGFnT3BlbiA9IHRo aXMuX2NyZWF0ZU9wZW5UYWdNYXJrdXBBbmRQdXRMaXN0ZW5lcnModHJhbnNhY3Rpb24sIHByb3Bz KTsKKyAgICAgIHZhciB0YWdDb250ZW50ID0gdGhpcy5fY3JlYXRlQ29udGVudE1hcmt1cCh0cmFu c2FjdGlvbiwgcHJvcHMsIGNvbnRleHQpOworICAgICAgaWYgKCF0YWdDb250ZW50ICYmIG9taXR0 ZWRDbG9zZVRhZ3NbdGhpcy5fdGFnXSkgeworICAgICAgICBtb3VudEltYWdlID0gdGFnT3BlbiAr ICcvPic7CisgICAgICB9IGVsc2UgeworICAgICAgICBtb3VudEltYWdlID0gdGFnT3BlbiArICc+ JyArIHRhZ0NvbnRlbnQgKyAnPC8nICsgdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSArICc+JzsK KyAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMuX3RhZykgeworICAgICAgY2FzZSAn aW5wdXQnOgorICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVl KGlucHV0UG9zdE1vdW50LCB0aGlzKTsKKyAgICAgICAgaWYgKHByb3BzLmF1dG9Gb2N1cykgewor ICAgICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoQXV0b0Zv Y3VzVXRpbHMuZm9jdXNET01Db21wb25lbnQsIHRoaXMpOworICAgICAgICB9CisgICAgICAgIGJy ZWFrOworICAgICAgY2FzZSAndGV4dGFyZWEnOgorICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFj dE1vdW50UmVhZHkoKS5lbnF1ZXVlKHRleHRhcmVhUG9zdE1vdW50LCB0aGlzKTsKKyAgICAgICAg aWYgKHByb3BzLmF1dG9Gb2N1cykgeworICAgICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91 bnRSZWFkeSgpLmVucXVldWUoQXV0b0ZvY3VzVXRpbHMuZm9jdXNET01Db21wb25lbnQsIHRoaXMp OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnc2VsZWN0JzoKKyAgICAg ICAgaWYgKHByb3BzLmF1dG9Gb2N1cykgeworICAgICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0 TW91bnRSZWFkeSgpLmVucXVldWUoQXV0b0ZvY3VzVXRpbHMuZm9jdXNET01Db21wb25lbnQsIHRo aXMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnYnV0dG9uJzoKKyAg ICAgICAgaWYgKHByb3BzLmF1dG9Gb2N1cykgeworICAgICAgICAgIHRyYW5zYWN0aW9uLmdldFJl YWN0TW91bnRSZWFkeSgpLmVucXVldWUoQXV0b0ZvY3VzVXRpbHMuZm9jdXNET01Db21wb25lbnQs IHRoaXMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnb3B0aW9uJzoK KyAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShvcHRpb25Q b3N0TW91bnQsIHRoaXMpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gbW91 bnRJbWFnZTsKKyAgfSwKKworICAvKioKKyAgICogQ3JlYXRlcyBtYXJrdXAgZm9yIHRoZSBvcGVu IHRhZyBhbmQgYWxsIGF0dHJpYnV0ZXMuCisgICAqCisgICAqIFRoaXMgbWV0aG9kIGhhcyBzaWRl IGVmZmVjdHMgYmVjYXVzZSBldmVudHMgZ2V0IHJlZ2lzdGVyZWQuCisgICAqCisgICAqIEl0ZXJh dGluZyBvdmVyIG9iamVjdCBwcm9wZXJ0aWVzIGlzIGZhc3RlciB0aGFuIGl0ZXJhdGluZyBvdmVy IGFycmF5cy4KKyAgICogQHNlZSBodHRwOi8vanNwZXJmLmNvbS9vYmotdnMtYXJyLWl0ZXJhdGlv bgorICAgKgorICAgKiBAcHJpdmF0ZQorICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNh Y3Rpb258UmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24KKyAgICog QHBhcmFtIHtvYmplY3R9IHByb3BzCisgICAqIEByZXR1cm4ge3N0cmluZ30gTWFya3VwIG9mIG9w ZW5pbmcgdGFnLgorICAgKi8KKyAgX2NyZWF0ZU9wZW5UYWdNYXJrdXBBbmRQdXRMaXN0ZW5lcnM6 IGZ1bmN0aW9uICh0cmFuc2FjdGlvbiwgcHJvcHMpIHsKKyAgICB2YXIgcmV0ID0gJzwnICsgdGhp cy5fY3VycmVudEVsZW1lbnQudHlwZTsKKworICAgIGZvciAodmFyIHByb3BLZXkgaW4gcHJvcHMp IHsKKyAgICAgIGlmICghcHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHsKKyAgICAgICAg Y29udGludWU7CisgICAgICB9CisgICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcEtleV07 CisgICAgICBpZiAocHJvcFZhbHVlID09IG51bGwpIHsKKyAgICAgICAgY29udGludWU7CisgICAg ICB9CisgICAgICBpZiAocmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMuaGFzT3duUHJvcGVydHkocHJv cEtleSkpIHsKKyAgICAgICAgaWYgKHByb3BWYWx1ZSkgeworICAgICAgICAgIGVucXVldWVQdXRM aXN0ZW5lcih0aGlzLCBwcm9wS2V5LCBwcm9wVmFsdWUsIHRyYW5zYWN0aW9uKTsKKyAgICAgICAg fQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7CisgICAg ICAgICAgaWYgKHByb3BWYWx1ZSkgeworICAgICAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09 ICdwcm9kdWN0aW9uJykgeworICAgICAgICAgICAgICAvLyBTZWUgYF91cGRhdGVET01Qcm9wZXJ0 aWVzYC4gc3R5bGUgYmxvY2sKKyAgICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNTdHlsZSA9IHBy b3BWYWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb3BWYWx1ZSA9IHRoaXMuX3By ZXZpb3VzU3R5bGVDb3B5ID0gX2Fzc2lnbih7fSwgcHJvcHMuc3R5bGUpOworICAgICAgICAgIH0K KyAgICAgICAgICBwcm9wVmFsdWUgPSBDU1NQcm9wZXJ0eU9wZXJhdGlvbnMuY3JlYXRlTWFya3Vw Rm9yU3R5bGVzKHByb3BWYWx1ZSwgdGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgdmFyIG1hcmt1 cCA9IG51bGw7CisgICAgICAgIGlmICh0aGlzLl90YWcgIT0gbnVsbCAmJiBpc0N1c3RvbUNvbXBv bmVudCh0aGlzLl90YWcsIHByb3BzKSkgeworICAgICAgICAgIGlmICghUkVTRVJWRURfUFJPUFMu aGFzT3duUHJvcGVydHkocHJvcEtleSkpIHsKKyAgICAgICAgICAgIG1hcmt1cCA9IERPTVByb3Bl cnR5T3BlcmF0aW9ucy5jcmVhdGVNYXJrdXBGb3JDdXN0b21BdHRyaWJ1dGUocHJvcEtleSwgcHJv cFZhbHVlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbWFya3Vw ID0gRE9NUHJvcGVydHlPcGVyYXRpb25zLmNyZWF0ZU1hcmt1cEZvclByb3BlcnR5KHByb3BLZXks IHByb3BWYWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hcmt1cCkgeworICAgICAgICAg IHJldCArPSAnICcgKyBtYXJrdXA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAv LyBGb3Igc3RhdGljIHBhZ2VzLCBubyBuZWVkIHRvIHB1dCBSZWFjdCBJRCBhbmQgY2hlY2tzdW0u IFNhdmVzIGxvdHMgb2YKKyAgICAvLyBieXRlcy4KKyAgICBpZiAodHJhbnNhY3Rpb24ucmVuZGVy VG9TdGF0aWNNYXJrdXApIHsKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKCF0 aGlzLl9ob3N0UGFyZW50KSB7CisgICAgICByZXQgKz0gJyAnICsgRE9NUHJvcGVydHlPcGVyYXRp b25zLmNyZWF0ZU1hcmt1cEZvclJvb3QoKTsKKyAgICB9CisgICAgcmV0ICs9ICcgJyArIERPTVBy b3BlcnR5T3BlcmF0aW9ucy5jcmVhdGVNYXJrdXBGb3JJRCh0aGlzLl9kb21JRCk7CisgICAgcmV0 dXJuIHJldDsKKyAgfSwKKworICAvKioKKyAgICogQ3JlYXRlcyBtYXJrdXAgZm9yIHRoZSBjb250 ZW50IGJldHdlZW4gdGhlIHRhZ3MuCisgICAqCisgICAqIEBwcml2YXRlCisgICAqIEBwYXJhbSB7 UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbnxSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9u fSB0cmFuc2FjdGlvbgorICAgKiBAcGFyYW0ge29iamVjdH0gcHJvcHMKKyAgICogQHBhcmFtIHtv YmplY3R9IGNvbnRleHQKKyAgICogQHJldHVybiB7c3RyaW5nfSBDb250ZW50IG1hcmt1cC4KKyAg ICovCisgIF9jcmVhdGVDb250ZW50TWFya3VwOiBmdW5jdGlvbiAodHJhbnNhY3Rpb24sIHByb3Bz LCBjb250ZXh0KSB7CisgICAgdmFyIHJldCA9ICcnOworCisgICAgLy8gSW50ZW50aW9uYWwgdXNl IG9mICE9IHRvIGF2b2lkIGNhdGNoaW5nIHplcm8vZmFsc2UuCisgICAgdmFyIGlubmVySFRNTCA9 IHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOworICAgIGlmIChpbm5lckhUTUwgIT0gbnVs bCkgeworICAgICAgaWYgKGlubmVySFRNTC5fX2h0bWwgIT0gbnVsbCkgeworICAgICAgICByZXQg PSBpbm5lckhUTUwuX19odG1sOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB2YXIgY29u dGVudFRvVXNlID0gQ09OVEVOVF9UWVBFU1t0eXBlb2YgcHJvcHMuY2hpbGRyZW5dID8gcHJvcHMu Y2hpbGRyZW4gOiBudWxsOworICAgICAgdmFyIGNoaWxkcmVuVG9Vc2UgPSBjb250ZW50VG9Vc2Ug IT0gbnVsbCA/IG51bGwgOiBwcm9wcy5jaGlsZHJlbjsKKyAgICAgIGlmIChjb250ZW50VG9Vc2Ug IT0gbnVsbCkgeworICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSB0aGF0IHRleHQgaXMgYWxsb3dl ZCBhcyBhIGNoaWxkIG9mIHRoaXMgbm9kZQorICAgICAgICByZXQgPSBlc2NhcGVUZXh0Q29udGVu dEZvckJyb3dzZXIoY29udGVudFRvVXNlKTsKKyAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09 ICdwcm9kdWN0aW9uJykgeworICAgICAgICAgIHNldEFuZFZhbGlkYXRlQ29udGVudENoaWxkRGV2 LmNhbGwodGhpcywgY29udGVudFRvVXNlKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChj aGlsZHJlblRvVXNlICE9IG51bGwpIHsKKyAgICAgICAgdmFyIG1vdW50SW1hZ2VzID0gdGhpcy5t b3VudENoaWxkcmVuKGNoaWxkcmVuVG9Vc2UsIHRyYW5zYWN0aW9uLCBjb250ZXh0KTsKKyAgICAg ICAgcmV0ID0gbW91bnRJbWFnZXMuam9pbignJyk7CisgICAgICB9CisgICAgfQorICAgIGlmIChu ZXdsaW5lRWF0aW5nVGFnc1t0aGlzLl90YWddICYmIHJldC5jaGFyQXQoMCkgPT09ICdcbicpIHsK KyAgICAgIC8vIHRleHQvaHRtbCBpZ25vcmVzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlc2Ug dGFncyBpZiBpdCdzIGEgbmV3bGluZQorICAgICAgLy8gUHJlZmVyIHRvIGJyZWFrIGFwcGxpY2F0 aW9uL3htbCBvdmVyIHRleHQvaHRtbCAoZm9yIG5vdykgYnkgYWRkaW5nCisgICAgICAvLyBhIG5l d2xpbmUgc3BlY2lmaWNhbGx5IHRvIGdldCBlYXRlbiBieSB0aGUgcGFyc2VyLiAoQWx0ZXJuYXRl bHkgZm9yCisgICAgICAvLyB0ZXh0YXJlYXMsIHJlcGxhY2luZyAiXlxuIiB3aXRoICJcclxuIiBk b2Vzbid0IGdldCBlYXRlbiwgYW5kIHRoZSBmaXJzdAorICAgICAgLy8gXHIgaXMgbm9ybWFsaXpl ZCBvdXQgYnkgSFRNTFRleHRBcmVhRWxlbWVudCN2YWx1ZS4pCisgICAgICAvLyBTZWU6IDxodHRw Oi8vd3d3LnczLm9yZy9UUi9odG1sLXBvbHlnbG90LyNuZXdsaW5lcy1pbi10ZXh0YXJlYS1hbmQt cHJlPgorICAgICAgLy8gU2VlOiA8aHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDUvc3ludGF4Lmh0 bWwjZWxlbWVudC1yZXN0cmljdGlvbnM+CisgICAgICAvLyBTZWU6IDxodHRwOi8vd3d3LnczLm9y Zy9UUi9odG1sNS9zeW50YXguaHRtbCNuZXdsaW5lcz4KKyAgICAgIC8vIFNlZTogUGFyc2luZyBv ZiAidGV4dGFyZWEiICJsaXN0aW5nIiBhbmQgInByZSIgZWxlbWVudHMKKyAgICAgIC8vICBmcm9t IDxodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5i b2R5PgorICAgICAgcmV0dXJuICdcbicgKyByZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVy biByZXQ7CisgICAgfQorICB9LAorCisgIF9jcmVhdGVJbml0aWFsQ2hpbGRyZW46IGZ1bmN0aW9u ICh0cmFuc2FjdGlvbiwgcHJvcHMsIGNvbnRleHQsIGxhenlUcmVlKSB7CisgICAgLy8gSW50ZW50 aW9uYWwgdXNlIG9mICE9IHRvIGF2b2lkIGNhdGNoaW5nIHplcm8vZmFsc2UuCisgICAgdmFyIGlu bmVySFRNTCA9IHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOworICAgIGlmIChpbm5lckhU TUwgIT0gbnVsbCkgeworICAgICAgaWYgKGlubmVySFRNTC5fX2h0bWwgIT0gbnVsbCkgeworICAg ICAgICBET01MYXp5VHJlZS5xdWV1ZUhUTUwobGF6eVRyZWUsIGlubmVySFRNTC5fX2h0bWwpOwor ICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB2YXIgY29udGVudFRvVXNlID0gQ09OVEVOVF9U WVBFU1t0eXBlb2YgcHJvcHMuY2hpbGRyZW5dID8gcHJvcHMuY2hpbGRyZW4gOiBudWxsOworICAg ICAgdmFyIGNoaWxkcmVuVG9Vc2UgPSBjb250ZW50VG9Vc2UgIT0gbnVsbCA/IG51bGwgOiBwcm9w cy5jaGlsZHJlbjsKKyAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHRoYXQgdGV4dCBpcyBhbGxvd2Vk IGFzIGEgY2hpbGQgb2YgdGhpcyBub2RlCisgICAgICBpZiAoY29udGVudFRvVXNlICE9IG51bGwp IHsKKyAgICAgICAgLy8gQXZvaWQgc2V0dGluZyB0ZXh0Q29udGVudCB3aGVuIHRoZSB0ZXh0IGlz IGVtcHR5LiBJbiBJRTExIHNldHRpbmcKKyAgICAgICAgLy8gdGV4dENvbnRlbnQgb24gYSB0ZXh0 IGFyZWEgd2lsbCBjYXVzZSB0aGUgcGxhY2Vob2xkZXIgdG8gbm90CisgICAgICAgIC8vIHNob3cg d2l0aGluIHRoZSB0ZXh0YXJlYSB1bnRpbCBpdCBoYXMgYmVlbiBmb2N1c2VkIGFuZCBibHVycmVk IGFnYWluLgorICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNz dWVzLzY3MzEjaXNzdWVjb21tZW50LTI1NDg3NDU1MworICAgICAgICBpZiAoY29udGVudFRvVXNl ICE9PSAnJykgeworICAgICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicp IHsKKyAgICAgICAgICAgIHNldEFuZFZhbGlkYXRlQ29udGVudENoaWxkRGV2LmNhbGwodGhpcywg Y29udGVudFRvVXNlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgRE9NTGF6eVRyZWUucXVldWVU ZXh0KGxhenlUcmVlLCBjb250ZW50VG9Vc2UpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYg KGNoaWxkcmVuVG9Vc2UgIT0gbnVsbCkgeworICAgICAgICB2YXIgbW91bnRJbWFnZXMgPSB0aGlz Lm1vdW50Q2hpbGRyZW4oY2hpbGRyZW5Ub1VzZSwgdHJhbnNhY3Rpb24sIGNvbnRleHQpOworICAg ICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vdW50SW1hZ2VzLmxlbmd0aDsgaSsrKSB7CisgICAg ICAgICAgRE9NTGF6eVRyZWUucXVldWVDaGlsZChsYXp5VHJlZSwgbW91bnRJbWFnZXNbaV0pOwor ICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9LAorCisgIC8qKgorICAgKiBSZWNlaXZlcyBh IG5leHQgZWxlbWVudCBhbmQgdXBkYXRlcyB0aGUgY29tcG9uZW50LgorICAgKgorICAgKiBAaW50 ZXJuYWwKKyAgICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IG5leHRFbGVtZW50CisgICAqIEBwYXJh bSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbnxSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0 aW9ufSB0cmFuc2FjdGlvbgorICAgKiBAcGFyYW0ge29iamVjdH0gY29udGV4dAorICAgKi8KKyAg cmVjZWl2ZUNvbXBvbmVudDogZnVuY3Rpb24gKG5leHRFbGVtZW50LCB0cmFuc2FjdGlvbiwgY29u dGV4dCkgeworICAgIHZhciBwcmV2RWxlbWVudCA9IHRoaXMuX2N1cnJlbnRFbGVtZW50OworICAg IHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbmV4dEVsZW1lbnQ7CisgICAgdGhpcy51cGRhdGVDb21w b25lbnQodHJhbnNhY3Rpb24sIHByZXZFbGVtZW50LCBuZXh0RWxlbWVudCwgY29udGV4dCk7Cisg IH0sCisKKyAgLyoqCisgICAqIFVwZGF0ZXMgYSBET00gY29tcG9uZW50IGFmdGVyIGl0IGhhcyBh bHJlYWR5IGJlZW4gYWxsb2NhdGVkIGFuZAorICAgKiBhdHRhY2hlZCB0byB0aGUgRE9NLiBSZWNv bmNpbGVzIHRoZSByb290IERPTSBub2RlLCB0aGVuIHJlY3Vyc2VzLgorICAgKgorICAgKiBAcGFy YW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uCisgICAqIEBwYXJhbSB7 UmVhY3RFbGVtZW50fSBwcmV2RWxlbWVudAorICAgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gbmV4 dEVsZW1lbnQKKyAgICogQGludGVybmFsCisgICAqIEBvdmVycmlkYWJsZQorICAgKi8KKyAgdXBk YXRlQ29tcG9uZW50OiBmdW5jdGlvbiAodHJhbnNhY3Rpb24sIHByZXZFbGVtZW50LCBuZXh0RWxl bWVudCwgY29udGV4dCkgeworICAgIHZhciBsYXN0UHJvcHMgPSBwcmV2RWxlbWVudC5wcm9wczsK KyAgICB2YXIgbmV4dFByb3BzID0gdGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHM7CisKKyAgICBz d2l0Y2ggKHRoaXMuX3RhZykgeworICAgICAgY2FzZSAnaW5wdXQnOgorICAgICAgICBsYXN0UHJv cHMgPSBSZWFjdERPTUlucHV0LmdldEhvc3RQcm9wcyh0aGlzLCBsYXN0UHJvcHMpOworICAgICAg ICBuZXh0UHJvcHMgPSBSZWFjdERPTUlucHV0LmdldEhvc3RQcm9wcyh0aGlzLCBuZXh0UHJvcHMp OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ29wdGlvbic6CisgICAgICAgIGxhc3RQcm9w cyA9IFJlYWN0RE9NT3B0aW9uLmdldEhvc3RQcm9wcyh0aGlzLCBsYXN0UHJvcHMpOworICAgICAg ICBuZXh0UHJvcHMgPSBSZWFjdERPTU9wdGlvbi5nZXRIb3N0UHJvcHModGhpcywgbmV4dFByb3Bz KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdzZWxlY3QnOgorICAgICAgICBsYXN0UHJv cHMgPSBSZWFjdERPTVNlbGVjdC5nZXRIb3N0UHJvcHModGhpcywgbGFzdFByb3BzKTsKKyAgICAg ICAgbmV4dFByb3BzID0gUmVhY3RET01TZWxlY3QuZ2V0SG9zdFByb3BzKHRoaXMsIG5leHRQcm9w cyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAndGV4dGFyZWEnOgorICAgICAgICBsYXN0 UHJvcHMgPSBSZWFjdERPTVRleHRhcmVhLmdldEhvc3RQcm9wcyh0aGlzLCBsYXN0UHJvcHMpOwor ICAgICAgICBuZXh0UHJvcHMgPSBSZWFjdERPTVRleHRhcmVhLmdldEhvc3RQcm9wcyh0aGlzLCBu ZXh0UHJvcHMpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBhc3NlcnRWYWxpZFByb3Bz KHRoaXMsIG5leHRQcm9wcyk7CisgICAgdGhpcy5fdXBkYXRlRE9NUHJvcGVydGllcyhsYXN0UHJv cHMsIG5leHRQcm9wcywgdHJhbnNhY3Rpb24pOworICAgIHRoaXMuX3VwZGF0ZURPTUNoaWxkcmVu KGxhc3RQcm9wcywgbmV4dFByb3BzLCB0cmFuc2FjdGlvbiwgY29udGV4dCk7CisKKyAgICBzd2l0 Y2ggKHRoaXMuX3RhZykgeworICAgICAgY2FzZSAnaW5wdXQnOgorICAgICAgICAvLyBVcGRhdGUg dGhlIHdyYXBwZXIgYXJvdW5kIGlucHV0cyAqYWZ0ZXIqIHVwZGF0aW5nIHByb3BzLiBUaGlzIGhh cyB0bworICAgICAgICAvLyBoYXBwZW4gYWZ0ZXIgYF91cGRhdGVET01Qcm9wZXJ0aWVzYC4gT3Ro ZXJ3aXNlIEhUTUw1IGlucHV0IHZhbGlkYXRpb25zCisgICAgICAgIC8vIHJhaXNlIHdhcm5pbmdz IGFuZCBwcmV2ZW50IHRoZSBuZXcgdmFsdWUgZnJvbSBiZWluZyBhc3NpZ25lZC4KKyAgICAgICAg UmVhY3RET01JbnB1dC51cGRhdGVXcmFwcGVyKHRoaXMpOworICAgICAgICBicmVhazsKKyAgICAg IGNhc2UgJ3RleHRhcmVhJzoKKyAgICAgICAgUmVhY3RET01UZXh0YXJlYS51cGRhdGVXcmFwcGVy KHRoaXMpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3NlbGVjdCc6CisgICAgICAgIC8v IDxzZWxlY3Q+IHZhbHVlIHVwZGF0ZSBuZWVkcyB0byBvY2N1ciBhZnRlciA8b3B0aW9uPiBjaGls ZHJlbgorICAgICAgICAvLyByZWNvbmNpbGlhdGlvbgorICAgICAgICB0cmFuc2FjdGlvbi5nZXRS ZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHBvc3RVcGRhdGVTZWxlY3RXcmFwcGVyLCB0aGlzKTsK KyAgICAgICAgYnJlYWs7CisgICAgfQorICB9LAorCisgIC8qKgorICAgKiBSZWNvbmNpbGVzIHRo ZSBwcm9wZXJ0aWVzIGJ5IGRldGVjdGluZyBkaWZmZXJlbmNlcyBpbiBwcm9wZXJ0eSB2YWx1ZXMg YW5kCisgICAqIHVwZGF0aW5nIHRoZSBET00gYXMgbmVjZXNzYXJ5LiBUaGlzIGZ1bmN0aW9uIGlz IHByb2JhYmx5IHRoZSBzaW5nbGUgbW9zdAorICAgKiBjcml0aWNhbCBwYXRoIGZvciBwZXJmb3Jt YW5jZSBvcHRpbWl6YXRpb24uCisgICAqCisgICAqIFRPRE86IEJlbmNobWFyayB3aGV0aGVyIGNo ZWNraW5nIGZvciBjaGFuZ2VkIHZhbHVlcyBpbiBtZW1vcnkgYWN0dWFsbHkKKyAgICogICAgICAg aW1wcm92ZXMgcGVyZm9ybWFuY2UgKGVzcGVjaWFsbHkgc3RhdGljYWxseSBwb3NpdGlvbmVkIGVs ZW1lbnRzKS4KKyAgICogVE9ETzogQmVuY2htYXJrIHRoZSBlZmZlY3RzIG9mIHB1dHRpbmcgdGhp cyBhdCB0aGUgdG9wIHNpbmNlIDk5JSBvZiBwcm9wcworICAgKiAgICAgICBkbyBub3QgY2hhbmdl IGZvciBhIGdpdmVuIHJlY29uY2lsaWF0aW9uLgorICAgKiBUT0RPOiBCZW5jaG1hcmsgYXJlYXMg dGhhdCBjYW4gYmUgaW1wcm92ZWQgd2l0aCBjYWNoaW5nLgorICAgKgorICAgKiBAcHJpdmF0ZQor ICAgKiBAcGFyYW0ge29iamVjdH0gbGFzdFByb3BzCisgICAqIEBwYXJhbSB7b2JqZWN0fSBuZXh0 UHJvcHMKKyAgICogQHBhcmFtIHs/RE9NRWxlbWVudH0gbm9kZQorICAgKi8KKyAgX3VwZGF0ZURP TVByb3BlcnRpZXM6IGZ1bmN0aW9uIChsYXN0UHJvcHMsIG5leHRQcm9wcywgdHJhbnNhY3Rpb24p IHsKKyAgICB2YXIgcHJvcEtleTsKKyAgICB2YXIgc3R5bGVOYW1lOworICAgIHZhciBzdHlsZVVw ZGF0ZXM7CisgICAgZm9yIChwcm9wS2V5IGluIGxhc3RQcm9wcykgeworICAgICAgaWYgKG5leHRQ cm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSB8fCAhbGFzdFByb3BzLmhhc093blByb3BlcnR5 KHByb3BLZXkpIHx8IGxhc3RQcm9wc1twcm9wS2V5XSA9PSBudWxsKSB7CisgICAgICAgIGNvbnRp bnVlOworICAgICAgfQorICAgICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7CisgICAgICAgIHZh ciBsYXN0U3R5bGUgPSB0aGlzLl9wcmV2aW91c1N0eWxlQ29weTsKKyAgICAgICAgZm9yIChzdHls ZU5hbWUgaW4gbGFzdFN0eWxlKSB7CisgICAgICAgICAgaWYgKGxhc3RTdHlsZS5oYXNPd25Qcm9w ZXJ0eShzdHlsZU5hbWUpKSB7CisgICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSBzdHlsZVVwZGF0 ZXMgfHwge307CisgICAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9ICcnOworICAg ICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aGlzLl9wcmV2aW91c1N0eWxlQ29weSA9IG51 bGw7CisgICAgICB9IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzLmhhc093blByb3Bl cnR5KHByb3BLZXkpKSB7CisgICAgICAgIGlmIChsYXN0UHJvcHNbcHJvcEtleV0pIHsKKyAgICAg ICAgICAvLyBPbmx5IGNhbGwgZGVsZXRlTGlzdGVuZXIgaWYgdGhlcmUgd2FzIGEgbGlzdGVuZXIg cHJldmlvdXNseSBvcgorICAgICAgICAgIC8vIGVsc2Ugd2lsbERlbGV0ZUxpc3RlbmVyIGdldHMg Y2FsbGVkIHdoZW4gdGhlcmUgd2Fzbid0IGFjdHVhbGx5IGEKKyAgICAgICAgICAvLyBsaXN0ZW5l ciAoZS5nLiwgb25DbGljaz17bnVsbH0pCisgICAgICAgICAgZGVsZXRlTGlzdGVuZXIodGhpcywg cHJvcEtleSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoaXNDdXN0b21Db21wb25lbnQo dGhpcy5fdGFnLCBsYXN0UHJvcHMpKSB7CisgICAgICAgIGlmICghUkVTRVJWRURfUFJPUFMuaGFz T3duUHJvcGVydHkocHJvcEtleSkpIHsKKyAgICAgICAgICBET01Qcm9wZXJ0eU9wZXJhdGlvbnMu ZGVsZXRlVmFsdWVGb3JBdHRyaWJ1dGUoZ2V0Tm9kZSh0aGlzKSwgcHJvcEtleSk7CisgICAgICAg IH0KKyAgICAgIH0gZWxzZSBpZiAoRE9NUHJvcGVydHkucHJvcGVydGllc1twcm9wS2V5XSB8fCBE T01Qcm9wZXJ0eS5pc0N1c3RvbUF0dHJpYnV0ZShwcm9wS2V5KSkgeworICAgICAgICBET01Qcm9w ZXJ0eU9wZXJhdGlvbnMuZGVsZXRlVmFsdWVGb3JQcm9wZXJ0eShnZXROb2RlKHRoaXMpLCBwcm9w S2V5KTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yIChwcm9wS2V5IGluIG5leHRQcm9wcykgewor ICAgICAgdmFyIG5leHRQcm9wID0gbmV4dFByb3BzW3Byb3BLZXldOworICAgICAgdmFyIGxhc3RQ cm9wID0gcHJvcEtleSA9PT0gU1RZTEUgPyB0aGlzLl9wcmV2aW91c1N0eWxlQ29weSA6IGxhc3RQ cm9wcyAhPSBudWxsID8gbGFzdFByb3BzW3Byb3BLZXldIDogdW5kZWZpbmVkOworICAgICAgaWYg KCFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbmV4dFByb3AgPT09IGxhc3RQ cm9wIHx8IG5leHRQcm9wID09IG51bGwgJiYgbGFzdFByb3AgPT0gbnVsbCkgeworICAgICAgICBj b250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkgeworICAgICAg ICBpZiAobmV4dFByb3ApIHsKKyAgICAgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1 Y3Rpb24nKSB7CisgICAgICAgICAgICBjaGVja0FuZFdhcm5Gb3JNdXRhdGVkU3R5bGUodGhpcy5f cHJldmlvdXNTdHlsZUNvcHksIHRoaXMuX3ByZXZpb3VzU3R5bGUsIHRoaXMpOworICAgICAgICAg ICAgdGhpcy5fcHJldmlvdXNTdHlsZSA9IG5leHRQcm9wOworICAgICAgICAgIH0KKyAgICAgICAg ICBuZXh0UHJvcCA9IHRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5ID0gX2Fzc2lnbih7fSwgbmV4dFBy b3ApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5 ID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAobGFzdFByb3ApIHsKKyAgICAgICAgICAv LyBVbnNldCBzdHlsZXMgb24gYGxhc3RQcm9wYCBidXQgbm90IG9uIGBuZXh0UHJvcGAuCisgICAg ICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbGFzdFByb3ApIHsKKyAgICAgICAgICAgIGlmIChsYXN0 UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpICYmICghbmV4dFByb3AgfHwgIW5leHRQcm9w Lmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpKSB7CisgICAgICAgICAgICAgIHN0eWxlVXBkYXRl cyA9IHN0eWxlVXBkYXRlcyB8fCB7fTsKKyAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxl TmFtZV0gPSAnJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgLy8gVXBk YXRlIHN0eWxlcyB0aGF0IGNoYW5nZWQgc2luY2UgYGxhc3RQcm9wYC4KKyAgICAgICAgICBmb3Ig KHN0eWxlTmFtZSBpbiBuZXh0UHJvcCkgeworICAgICAgICAgICAgaWYgKG5leHRQcm9wLmhhc093 blByb3BlcnR5KHN0eWxlTmFtZSkgJiYgbGFzdFByb3Bbc3R5bGVOYW1lXSAhPT0gbmV4dFByb3Bb c3R5bGVOYW1lXSkgeworICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSBzdHlsZVVwZGF0ZXMg fHwge307CisgICAgICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gbmV4dFByb3Bb c3R5bGVOYW1lXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7 CisgICAgICAgICAgLy8gUmVsaWVzIG9uIGB1cGRhdGVTdHlsZXNCeUlEYCBub3QgbXV0YXRpbmcg YHN0eWxlVXBkYXRlc2AuCisgICAgICAgICAgc3R5bGVVcGRhdGVzID0gbmV4dFByb3A7CisgICAg ICAgIH0KKyAgICAgIH0gZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMuaGFzT3duUHJv cGVydHkocHJvcEtleSkpIHsKKyAgICAgICAgaWYgKG5leHRQcm9wKSB7CisgICAgICAgICAgZW5x dWV1ZVB1dExpc3RlbmVyKHRoaXMsIHByb3BLZXksIG5leHRQcm9wLCB0cmFuc2FjdGlvbik7Cisg ICAgICAgIH0gZWxzZSBpZiAobGFzdFByb3ApIHsKKyAgICAgICAgICBkZWxldGVMaXN0ZW5lcih0 aGlzLCBwcm9wS2V5KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChpc0N1c3RvbUNvbXBv bmVudCh0aGlzLl90YWcsIG5leHRQcm9wcykpIHsKKyAgICAgICAgaWYgKCFSRVNFUlZFRF9QUk9Q Uy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkgeworICAgICAgICAgIERPTVByb3BlcnR5T3BlcmF0 aW9ucy5zZXRWYWx1ZUZvckF0dHJpYnV0ZShnZXROb2RlKHRoaXMpLCBwcm9wS2V5LCBuZXh0UHJv cCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoRE9NUHJvcGVydHkucHJvcGVydGllc1tw cm9wS2V5XSB8fCBET01Qcm9wZXJ0eS5pc0N1c3RvbUF0dHJpYnV0ZShwcm9wS2V5KSkgeworICAg ICAgICB2YXIgbm9kZSA9IGdldE5vZGUodGhpcyk7CisgICAgICAgIC8vIElmIHdlJ3JlIHVwZGF0 aW5nIHRvIG51bGwgb3IgdW5kZWZpbmVkLCB3ZSBzaG91bGQgcmVtb3ZlIHRoZSBwcm9wZXJ0eQor ICAgICAgICAvLyBmcm9tIHRoZSBET00gbm9kZSBpbnN0ZWFkIG9mIGluYWR2ZXJ0ZW50bHkgc2V0 dGluZyB0byBhIHN0cmluZy4gVGhpcworICAgICAgICAvLyBicmluZ3MgdXMgaW4gbGluZSB3aXRo IHRoZSBzYW1lIGJlaGF2aW9yIHdlIGhhdmUgb24gaW5pdGlhbCByZW5kZXIuCisgICAgICAgIGlm IChuZXh0UHJvcCAhPSBudWxsKSB7CisgICAgICAgICAgRE9NUHJvcGVydHlPcGVyYXRpb25zLnNl dFZhbHVlRm9yUHJvcGVydHkobm9kZSwgcHJvcEtleSwgbmV4dFByb3ApOworICAgICAgICB9IGVs c2UgeworICAgICAgICAgIERPTVByb3BlcnR5T3BlcmF0aW9ucy5kZWxldGVWYWx1ZUZvclByb3Bl cnR5KG5vZGUsIHByb3BLZXkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmIChz dHlsZVVwZGF0ZXMpIHsKKyAgICAgIENTU1Byb3BlcnR5T3BlcmF0aW9ucy5zZXRWYWx1ZUZvclN0 eWxlcyhnZXROb2RlKHRoaXMpLCBzdHlsZVVwZGF0ZXMsIHRoaXMpOworICAgIH0KKyAgfSwKKwor ICAvKioKKyAgICogUmVjb25jaWxlcyB0aGUgY2hpbGRyZW4gd2l0aCB0aGUgdmFyaW91cyBwcm9w ZXJ0aWVzIHRoYXQgYWZmZWN0IHRoZQorICAgKiBjaGlsZHJlbiBjb250ZW50LgorICAgKgorICAg KiBAcGFyYW0ge29iamVjdH0gbGFzdFByb3BzCisgICAqIEBwYXJhbSB7b2JqZWN0fSBuZXh0UHJv cHMKKyAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvbgor ICAgKiBAcGFyYW0ge29iamVjdH0gY29udGV4dAorICAgKi8KKyAgX3VwZGF0ZURPTUNoaWxkcmVu OiBmdW5jdGlvbiAobGFzdFByb3BzLCBuZXh0UHJvcHMsIHRyYW5zYWN0aW9uLCBjb250ZXh0KSB7 CisgICAgdmFyIGxhc3RDb250ZW50ID0gQ09OVEVOVF9UWVBFU1t0eXBlb2YgbGFzdFByb3BzLmNo aWxkcmVuXSA/IGxhc3RQcm9wcy5jaGlsZHJlbiA6IG51bGw7CisgICAgdmFyIG5leHRDb250ZW50 ID0gQ09OVEVOVF9UWVBFU1t0eXBlb2YgbmV4dFByb3BzLmNoaWxkcmVuXSA/IG5leHRQcm9wcy5j aGlsZHJlbiA6IG51bGw7CisKKyAgICB2YXIgbGFzdEh0bWwgPSBsYXN0UHJvcHMuZGFuZ2Vyb3Vz bHlTZXRJbm5lckhUTUwgJiYgbGFzdFByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRt bDsKKyAgICB2YXIgbmV4dEh0bWwgPSBuZXh0UHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwg JiYgbmV4dFByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRtbDsKKworICAgIC8vIE5v dGUgdGhlIHVzZSBvZiBgIT1gIHdoaWNoIGNoZWNrcyBmb3IgbnVsbCBvciB1bmRlZmluZWQuCisg ICAgdmFyIGxhc3RDaGlsZHJlbiA9IGxhc3RDb250ZW50ICE9IG51bGwgPyBudWxsIDogbGFzdFBy b3BzLmNoaWxkcmVuOworICAgIHZhciBuZXh0Q2hpbGRyZW4gPSBuZXh0Q29udGVudCAhPSBudWxs ID8gbnVsbCA6IG5leHRQcm9wcy5jaGlsZHJlbjsKKworICAgIC8vIElmIHdlJ3JlIHN3aXRjaGlu ZyBmcm9tIGNoaWxkcmVuIHRvIGNvbnRlbnQvaHRtbCBvciB2aWNlIHZlcnNhLCByZW1vdmUKKyAg ICAvLyB0aGUgb2xkIGNvbnRlbnQKKyAgICB2YXIgbGFzdEhhc0NvbnRlbnRPckh0bWwgPSBsYXN0 Q29udGVudCAhPSBudWxsIHx8IGxhc3RIdG1sICE9IG51bGw7CisgICAgdmFyIG5leHRIYXNDb250 ZW50T3JIdG1sID0gbmV4dENvbnRlbnQgIT0gbnVsbCB8fCBuZXh0SHRtbCAhPSBudWxsOworICAg IGlmIChsYXN0Q2hpbGRyZW4gIT0gbnVsbCAmJiBuZXh0Q2hpbGRyZW4gPT0gbnVsbCkgeworICAg ICAgdGhpcy51cGRhdGVDaGlsZHJlbihudWxsLCB0cmFuc2FjdGlvbiwgY29udGV4dCk7CisgICAg fSBlbHNlIGlmIChsYXN0SGFzQ29udGVudE9ySHRtbCAmJiAhbmV4dEhhc0NvbnRlbnRPckh0bWwp IHsKKyAgICAgIHRoaXMudXBkYXRlVGV4dENvbnRlbnQoJycpOworICAgICAgaWYgKCJkZXZlbG9w bWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5k ZWJ1Z1Rvb2wub25TZXRDaGlsZHJlbih0aGlzLl9kZWJ1Z0lELCBbXSk7CisgICAgICB9CisgICAg fQorCisgICAgaWYgKG5leHRDb250ZW50ICE9IG51bGwpIHsKKyAgICAgIGlmIChsYXN0Q29udGVu dCAhPT0gbmV4dENvbnRlbnQpIHsKKyAgICAgICAgdGhpcy51cGRhdGVUZXh0Q29udGVudCgnJyAr IG5leHRDb250ZW50KTsKKyAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9u JykgeworICAgICAgICAgIHNldEFuZFZhbGlkYXRlQ29udGVudENoaWxkRGV2LmNhbGwodGhpcywg bmV4dENvbnRlbnQpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChuZXh0SHRt bCAhPSBudWxsKSB7CisgICAgICBpZiAobGFzdEh0bWwgIT09IG5leHRIdG1sKSB7CisgICAgICAg IHRoaXMudXBkYXRlTWFya3VwKCcnICsgbmV4dEh0bWwpOworICAgICAgfQorICAgICAgaWYgKCJk ZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgICBSZWFjdEluc3RydW1lbnRh dGlvbi5kZWJ1Z1Rvb2wub25TZXRDaGlsZHJlbih0aGlzLl9kZWJ1Z0lELCBbXSk7CisgICAgICB9 CisgICAgfSBlbHNlIGlmIChuZXh0Q2hpbGRyZW4gIT0gbnVsbCkgeworICAgICAgaWYgKCJkZXZl bG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgICBzZXRBbmRWYWxpZGF0ZUNvbnRl bnRDaGlsZERldi5jYWxsKHRoaXMsIG51bGwpOworICAgICAgfQorCisgICAgICB0aGlzLnVwZGF0 ZUNoaWxkcmVuKG5leHRDaGlsZHJlbiwgdHJhbnNhY3Rpb24sIGNvbnRleHQpOworICAgIH0KKyAg fSwKKworICBnZXRIb3N0Tm9kZTogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBnZXROb2RlKHRo aXMpOworICB9LAorCisgIC8qKgorICAgKiBEZXN0cm95cyBhbGwgZXZlbnQgcmVnaXN0cmF0aW9u cyBmb3IgdGhpcyBpbnN0YW5jZS4gRG9lcyBub3QgcmVtb3ZlIGZyb20KKyAgICogdGhlIERPTS4g VGhhdCBtdXN0IGJlIGRvbmUgYnkgdGhlIHBhcmVudC4KKyAgICoKKyAgICogQGludGVybmFsCisg ICAqLworICB1bm1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoc2FmZWx5KSB7CisgICAgc3dpdGNo ICh0aGlzLl90YWcpIHsKKyAgICAgIGNhc2UgJ2F1ZGlvJzoKKyAgICAgIGNhc2UgJ2Zvcm0nOgor ICAgICAgY2FzZSAnaWZyYW1lJzoKKyAgICAgIGNhc2UgJ2ltZyc6CisgICAgICBjYXNlICdsaW5r JzoKKyAgICAgIGNhc2UgJ29iamVjdCc6CisgICAgICBjYXNlICdzb3VyY2UnOgorICAgICAgY2Fz ZSAndmlkZW8nOgorICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fd3JhcHBlclN0YXRlLmxp c3RlbmVyczsKKyAgICAgICAgaWYgKGxpc3RlbmVycykgeworICAgICAgICAgIGZvciAodmFyIGkg PSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBsaXN0ZW5lcnNb aV0ucmVtb3ZlKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAg ICAgY2FzZSAnaHRtbCc6CisgICAgICBjYXNlICdoZWFkJzoKKyAgICAgIGNhc2UgJ2JvZHknOgor ICAgICAgICAvKioKKyAgICAgICAgICogQ29tcG9uZW50cyBsaWtlIDxodG1sPiA8aGVhZD4gYW5k IDxib2R5PiBjYW4ndCBiZSByZW1vdmVkIG9yIGFkZGVkCisgICAgICAgICAqIGVhc2lseSBpbiBh IGNyb3NzLWJyb3dzZXIgd2F5LCBob3dldmVyIGl0J3MgdmFsdWFibGUgdG8gYmUgYWJsZSB0bwor ICAgICAgICAgKiB0YWtlIGFkdmFudGFnZSBvZiBSZWFjdCdzIHJlY29uY2lsaWF0aW9uIGZvciBz dHlsaW5nIGFuZCA8dGl0bGU+CisgICAgICAgICAqIG1hbmFnZW1lbnQuIFNvIHdlIGp1c3QgZG9j dW1lbnQgaXQgYW5kIHRocm93IGluIGRhbmdlcm91cyBjYXNlcy4KKyAgICAgICAgICovCisgICAg ICAgICFmYWxzZSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChm YWxzZSwgJzwlcz4gdHJpZWQgdG8gdW5tb3VudC4gQmVjYXVzZSBvZiBjcm9zcy1icm93c2VyIHF1 aXJrcyBpdCBpcyBpbXBvc3NpYmxlIHRvIHVubW91bnQgc29tZSB0b3AtbGV2ZWwgY29tcG9uZW50 cyAoZWcgPGh0bWw+LCA8aGVhZD4sIGFuZCA8Ym9keT4pIHJlbGlhYmx5IGFuZCBlZmZpY2llbnRs eS4gVG8gZml4IHRoaXMsIGhhdmUgYSBzaW5nbGUgdG9wLWxldmVsIGNvbXBvbmVudCB0aGF0IG5l dmVyIHVubW91bnRzIHJlbmRlciB0aGVzZSBlbGVtZW50cy4nLCB0aGlzLl90YWcpIDogX3Byb2RJ bnZhcmlhbnQoJzY2JywgdGhpcy5fdGFnKSA6IHZvaWQgMDsKKyAgICAgICAgYnJlYWs7CisgICAg fQorCisgICAgdGhpcy51bm1vdW50Q2hpbGRyZW4oc2FmZWx5KTsKKyAgICBSZWFjdERPTUNvbXBv bmVudFRyZWUudW5jYWNoZU5vZGUodGhpcyk7CisgICAgRXZlbnRQbHVnaW5IdWIuZGVsZXRlQWxs TGlzdGVuZXJzKHRoaXMpOworICAgIHRoaXMuX3Jvb3ROb2RlSUQgPSAwOworICAgIHRoaXMuX2Rv bUlEID0gMDsKKyAgICB0aGlzLl93cmFwcGVyU3RhdGUgPSBudWxsOworCisgICAgaWYgKCJkZXZl bG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgc2V0QW5kVmFsaWRhdGVDb250ZW50 Q2hpbGREZXYuY2FsbCh0aGlzLCBudWxsKTsKKyAgICB9CisgIH0sCisKKyAgZ2V0UHVibGljSW5z dGFuY2U6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gZ2V0Tm9kZSh0aGlzKTsKKyAgfQorCit9 OworCitfYXNzaWduKFJlYWN0RE9NQ29tcG9uZW50LnByb3RvdHlwZSwgUmVhY3RET01Db21wb25l bnQuTWl4aW4sIFJlYWN0TXVsdGlDaGlsZC5NaXhpbik7CisKK21vZHVsZS5leHBvcnRzID0gUmVh Y3RET01Db21wb25lbnQ7Cit9LHsiMTAiOjEwLCIxMDAiOjEwMCwiMTEiOjExLCIxMTMiOjExMywi MTE2IjoxMTYsIjEyIjoxMiwiMTIxIjoxMjEsIjEzMiI6MTMyLCIxNDAiOjE0MCwiMTQ2IjoxNDYs IjE0NyI6MTQ3LCIxNDgiOjE0OCwiMTYiOjE2LCIxNyI6MTcsIjIiOjIsIjI1IjoyNSwiMzEiOjMx LCIzMiI6MzIsIjM2IjozNiwiMzciOjM3LCIzOCI6MzgsIjQzIjo0MywiNSI6NSwiNTkiOjU5LCI2 MiI6NjIsIjcyIjo3MiwiOSI6OX1dLDMxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRz KXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTUtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFs bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1 bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUg aW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwg Z3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZp bGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3Zh ciBSZWFjdERPTUNvbXBvbmVudEZsYWdzID0geworICBoYXNDYWNoZWRDaGlsZE5vZGVzOiAxIDw8 IDAKK307CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RET01Db21wb25lbnRGbGFnczsKK30se31d LDMyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0 IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg KgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxp Y2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5 IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCBy aWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0 b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJvZEludmFyaWFudCA9IF9k ZXJlcV8oMTE2KTsKKwordmFyIERPTVByb3BlcnR5ID0gX2RlcmVxXygxMSk7Cit2YXIgUmVhY3RE T01Db21wb25lbnRGbGFncyA9IF9kZXJlcV8oMzEpOworCit2YXIgaW52YXJpYW50ID0gX2RlcmVx XygxNDApOworCit2YXIgQVRUUl9OQU1FID0gRE9NUHJvcGVydHkuSURfQVRUUklCVVRFX05BTUU7 Cit2YXIgRmxhZ3MgPSBSZWFjdERPTUNvbXBvbmVudEZsYWdzOworCit2YXIgaW50ZXJuYWxJbnN0 YW5jZUtleSA9ICdfX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSQnICsgTWF0aC5yYW5kb20oKS50b1N0 cmluZygzNikuc2xpY2UoMik7CisKKy8qKgorICogQ2hlY2sgaWYgYSBnaXZlbiBub2RlIHNob3Vs ZCBiZSBjYWNoZWQuCisgKi8KK2Z1bmN0aW9uIHNob3VsZFByZWNhY2hlTm9kZShub2RlLCBub2Rl SUQpIHsKKyAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgbm9kZS5nZXRBdHRyaWJ1dGUo QVRUUl9OQU1FKSA9PT0gU3RyaW5nKG5vZGVJRCkgfHwgbm9kZS5ub2RlVHlwZSA9PT0gOCAmJiBu b2RlLm5vZGVWYWx1ZSA9PT0gJyByZWFjdC10ZXh0OiAnICsgbm9kZUlEICsgJyAnIHx8IG5vZGUu bm9kZVR5cGUgPT09IDggJiYgbm9kZS5ub2RlVmFsdWUgPT09ICcgcmVhY3QtZW1wdHk6ICcgKyBu b2RlSUQgKyAnICc7Cit9CisKKy8qKgorICogRHJpbGwgZG93biAodGhyb3VnaCBjb21wb3NpdGVz IGFuZCBlbXB0eSBjb21wb25lbnRzKSB1bnRpbCB3ZSBnZXQgYSBob3N0IG9yCisgKiBob3N0IHRl eHQgY29tcG9uZW50LgorICoKKyAqIFRoaXMgaXMgcHJldHR5IHBvbHltb3JwaGljIGJ1dCB1bmF2 b2lkYWJsZSB3aXRoIHRoZSBjdXJyZW50IHN0cnVjdHVyZSB3ZSBoYXZlCisgKiBmb3IgYF9yZW5k ZXJlZENoaWxkcmVuYC4KKyAqLworZnVuY3Rpb24gZ2V0UmVuZGVyZWRIb3N0T3JUZXh0RnJvbUNv bXBvbmVudChjb21wb25lbnQpIHsKKyAgdmFyIHJlbmRlcmVkOworICB3aGlsZSAocmVuZGVyZWQg PSBjb21wb25lbnQuX3JlbmRlcmVkQ29tcG9uZW50KSB7CisgICAgY29tcG9uZW50ID0gcmVuZGVy ZWQ7CisgIH0KKyAgcmV0dXJuIGNvbXBvbmVudDsKK30KKworLyoqCisgKiBQb3B1bGF0ZSBgX2hv c3ROb2RlYCBvbiB0aGUgcmVuZGVyZWQgaG9zdC90ZXh0IGNvbXBvbmVudCB3aXRoIHRoZSBnaXZl bgorICogRE9NIG5vZGUuIFRoZSBwYXNzZWQgYGluc3RgIGNhbiBiZSBhIGNvbXBvc2l0ZS4KKyAq LworZnVuY3Rpb24gcHJlY2FjaGVOb2RlKGluc3QsIG5vZGUpIHsKKyAgdmFyIGhvc3RJbnN0ID0g Z2V0UmVuZGVyZWRIb3N0T3JUZXh0RnJvbUNvbXBvbmVudChpbnN0KTsKKyAgaG9zdEluc3QuX2hv c3ROb2RlID0gbm9kZTsKKyAgbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSA9IGhvc3RJbnN0Owor fQorCitmdW5jdGlvbiB1bmNhY2hlTm9kZShpbnN0KSB7CisgIHZhciBub2RlID0gaW5zdC5faG9z dE5vZGU7CisgIGlmIChub2RlKSB7CisgICAgZGVsZXRlIG5vZGVbaW50ZXJuYWxJbnN0YW5jZUtl eV07CisgICAgaW5zdC5faG9zdE5vZGUgPSBudWxsOworICB9Cit9CisKKy8qKgorICogUG9wdWxh dGUgYF9ob3N0Tm9kZWAgb24gZWFjaCBjaGlsZCBvZiBgaW5zdGAsIGFzc3VtaW5nIHRoYXQgdGhl IGNoaWxkcmVuCisgKiBtYXRjaCB1cCB3aXRoIHRoZSBET00gKGVsZW1lbnQpIGNoaWxkcmVuIG9m IGBub2RlYC4KKyAqCisgKiBXZSBjYWNoZSBlbnRpcmUgbGV2ZWxzIGF0IG9uY2UgdG8gYXZvaWQg YW4gbl4yIHByb2JsZW0gd2hlcmUgd2UgYWNjZXNzIHRoZQorICogY2hpbGRyZW4gb2YgYSBub2Rl IHNlcXVlbnRpYWxseSBhbmQgaGF2ZSB0byB3YWxrIGZyb20gdGhlIHN0YXJ0IHRvIG91ciB0YXJn ZXQKKyAqIG5vZGUgZXZlcnkgdGltZS4KKyAqCisgKiBTaW5jZSB3ZSB1cGRhdGUgYF9yZW5kZXJl ZENoaWxkcmVuYCBhbmQgdGhlIGFjdHVhbCBET00gYXQgKHNsaWdodGx5KQorICogZGlmZmVyZW50 IHRpbWVzLCB3ZSBjb3VsZCByYWNlIGhlcmUgYW5kIHNlZSBhIG5ld2VyIGBfcmVuZGVyZWRDaGls ZHJlbmAgdGhhbgorICogdGhlIERPTSBub2RlcyB3ZSBzZWUuIFRvIGF2b2lkIHRoaXMsIFJlYWN0 TXVsdGlDaGlsZCBjYWxscworICogYHByZXBhcmVUb01hbmFnZUNoaWxkcmVuYCBiZWZvcmUgd2Ug Y2hhbmdlIGBfcmVuZGVyZWRDaGlsZHJlbmAsIGF0IHdoaWNoCisgKiB0aW1lIHRoZSBjb250YWlu ZXIncyBjaGlsZCBub2RlcyBhcmUgYWx3YXlzIGNhY2hlZCAodW50aWwgaXQgdW5tb3VudHMpLgor ICovCitmdW5jdGlvbiBwcmVjYWNoZUNoaWxkTm9kZXMoaW5zdCwgbm9kZSkgeworICBpZiAoaW5z dC5fZmxhZ3MgJiBGbGFncy5oYXNDYWNoZWRDaGlsZE5vZGVzKSB7CisgICAgcmV0dXJuOworICB9 CisgIHZhciBjaGlsZHJlbiA9IGluc3QuX3JlbmRlcmVkQ2hpbGRyZW47CisgIHZhciBjaGlsZE5v ZGUgPSBub2RlLmZpcnN0Q2hpbGQ7CisgIG91dGVyOiBmb3IgKHZhciBuYW1lIGluIGNoaWxkcmVu KSB7CisgICAgaWYgKCFjaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgeworICAgICAgY29u dGludWU7CisgICAgfQorICAgIHZhciBjaGlsZEluc3QgPSBjaGlsZHJlbltuYW1lXTsKKyAgICB2 YXIgY2hpbGRJRCA9IGdldFJlbmRlcmVkSG9zdE9yVGV4dEZyb21Db21wb25lbnQoY2hpbGRJbnN0 KS5fZG9tSUQ7CisgICAgaWYgKGNoaWxkSUQgPT09IDApIHsKKyAgICAgIC8vIFdlJ3JlIGN1cnJl bnRseSB1bm1vdW50aW5nIHRoaXMgY2hpbGQgaW4gUmVhY3RNdWx0aUNoaWxkOyBza2lwIGl0Lgor ICAgICAgY29udGludWU7CisgICAgfQorICAgIC8vIFdlIGFzc3VtZSB0aGUgY2hpbGQgbm9kZXMg YXJlIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBjaGlsZCBpbnN0YW5jZXMuCisgICAgZm9yICg7 IGNoaWxkTm9kZSAhPT0gbnVsbDsgY2hpbGROb2RlID0gY2hpbGROb2RlLm5leHRTaWJsaW5nKSB7 CisgICAgICBpZiAoc2hvdWxkUHJlY2FjaGVOb2RlKGNoaWxkTm9kZSwgY2hpbGRJRCkpIHsKKyAg ICAgICAgcHJlY2FjaGVOb2RlKGNoaWxkSW5zdCwgY2hpbGROb2RlKTsKKyAgICAgICAgY29udGlu dWUgb3V0ZXI7CisgICAgICB9CisgICAgfQorICAgIC8vIFdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0 aGUgRE9NIGNoaWxkcmVuIHdpdGhvdXQgZmluZGluZyBhbiBJRCBtYXRjaC4KKyAgICAhZmFsc2Ug PyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdVbmFi bGUgdG8gZmluZCBlbGVtZW50IHdpdGggSUQgJXMuJywgY2hpbGRJRCkgOiBfcHJvZEludmFyaWFu dCgnMzInLCBjaGlsZElEKSA6IHZvaWQgMDsKKyAgfQorICBpbnN0Ll9mbGFncyB8PSBGbGFncy5o YXNDYWNoZWRDaGlsZE5vZGVzOworfQorCisvKioKKyAqIEdpdmVuIGEgRE9NIG5vZGUsIHJldHVy biB0aGUgY2xvc2VzdCBSZWFjdERPTUNvbXBvbmVudCBvcgorICogUmVhY3RET01UZXh0Q29tcG9u ZW50IGluc3RhbmNlIGFuY2VzdG9yLgorICovCitmdW5jdGlvbiBnZXRDbG9zZXN0SW5zdGFuY2VG cm9tTm9kZShub2RlKSB7CisgIGlmIChub2RlW2ludGVybmFsSW5zdGFuY2VLZXldKSB7CisgICAg cmV0dXJuIG5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV07CisgIH0KKworICAvLyBXYWxrIHVwIHRo ZSB0cmVlIHVudGlsIHdlIGZpbmQgYW4gYW5jZXN0b3Igd2hvc2UgaW5zdGFuY2Ugd2UgaGF2ZSBj YWNoZWQuCisgIHZhciBwYXJlbnRzID0gW107CisgIHdoaWxlICghbm9kZVtpbnRlcm5hbEluc3Rh bmNlS2V5XSkgeworICAgIHBhcmVudHMucHVzaChub2RlKTsKKyAgICBpZiAobm9kZS5wYXJlbnRO b2RlKSB7CisgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlOworICAgIH0gZWxzZSB7CisgICAg ICAvLyBUb3Agb2YgdGhlIHRyZWUuIFRoaXMgbm9kZSBtdXN0IG5vdCBiZSBwYXJ0IG9mIGEgUmVh Y3QgdHJlZSAob3IgaXMKKyAgICAgIC8vIHVubW91bnRlZCwgcG90ZW50aWFsbHkpLgorICAgICAg cmV0dXJuIG51bGw7CisgICAgfQorICB9CisKKyAgdmFyIGNsb3Nlc3Q7CisgIHZhciBpbnN0Owor ICBmb3IgKDsgbm9kZSAmJiAoaW5zdCA9IG5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV0pOyBub2Rl ID0gcGFyZW50cy5wb3AoKSkgeworICAgIGNsb3Nlc3QgPSBpbnN0OworICAgIGlmIChwYXJlbnRz Lmxlbmd0aCkgeworICAgICAgcHJlY2FjaGVDaGlsZE5vZGVzKGluc3QsIG5vZGUpOworICAgIH0K KyAgfQorCisgIHJldHVybiBjbG9zZXN0OworfQorCisvKioKKyAqIEdpdmVuIGEgRE9NIG5vZGUs IHJldHVybiB0aGUgUmVhY3RET01Db21wb25lbnQgb3IgUmVhY3RET01UZXh0Q29tcG9uZW50Cisg KiBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgbm9kZSB3YXMgbm90IHJlbmRlcmVkIGJ5IHRoaXMg UmVhY3QuCisgKi8KK2Z1bmN0aW9uIGdldEluc3RhbmNlRnJvbU5vZGUobm9kZSkgeworICB2YXIg aW5zdCA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5vZGUpOworICBpZiAoaW5zdCAhPSBu dWxsICYmIGluc3QuX2hvc3ROb2RlID09PSBub2RlKSB7CisgICAgcmV0dXJuIGluc3Q7CisgIH0g ZWxzZSB7CisgICAgcmV0dXJuIG51bGw7CisgIH0KK30KKworLyoqCisgKiBHaXZlbiBhIFJlYWN0 RE9NQ29tcG9uZW50IG9yIFJlYWN0RE9NVGV4dENvbXBvbmVudCwgcmV0dXJuIHRoZSBjb3JyZXNw b25kaW5nCisgKiBET00gbm9kZS4KKyAqLworZnVuY3Rpb24gZ2V0Tm9kZUZyb21JbnN0YW5jZShp bnN0KSB7CisgIC8vIFdpdGhvdXQgdGhpcyBmaXJzdCBpbnZhcmlhbnQsIHBhc3NpbmcgYSBub24t RE9NLWNvbXBvbmVudCB0cmlnZ2VycyB0aGUgbmV4dAorICAvLyBpbnZhcmlhbnQgZm9yIGEgbWlz c2luZyBwYXJlbnQsIHdoaWNoIGlzIHN1cGVyIGNvbmZ1c2luZy4KKyAgIShpbnN0Ll9ob3N0Tm9k ZSAhPT0gdW5kZWZpbmVkKSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFy aWFudChmYWxzZSwgJ2dldE5vZGVGcm9tSW5zdGFuY2U6IEludmFsaWQgYXJndW1lbnQuJykgOiBf cHJvZEludmFyaWFudCgnMzMnKSA6IHZvaWQgMDsKKworICBpZiAoaW5zdC5faG9zdE5vZGUpIHsK KyAgICByZXR1cm4gaW5zdC5faG9zdE5vZGU7CisgIH0KKworICAvLyBXYWxrIHVwIHRoZSB0cmVl IHVudGlsIHdlIGZpbmQgYW4gYW5jZXN0b3Igd2hvc2UgRE9NIG5vZGUgd2UgaGF2ZSBjYWNoZWQu CisgIHZhciBwYXJlbnRzID0gW107CisgIHdoaWxlICghaW5zdC5faG9zdE5vZGUpIHsKKyAgICBw YXJlbnRzLnB1c2goaW5zdCk7CisgICAgIWluc3QuX2hvc3RQYXJlbnQgPyAiZGV2ZWxvcG1lbnQi ICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdCBET00gdHJlZSByb290 IHNob3VsZCBhbHdheXMgaGF2ZSBhIG5vZGUgcmVmZXJlbmNlLicpIDogX3Byb2RJbnZhcmlhbnQo JzM0JykgOiB2b2lkIDA7CisgICAgaW5zdCA9IGluc3QuX2hvc3RQYXJlbnQ7CisgIH0KKworICAv LyBOb3cgcGFyZW50cyBjb250YWlucyBlYWNoIGFuY2VzdG9yIHRoYXQgZG9lcyAqbm90KiBoYXZl IGEgY2FjaGVkIG5hdGl2ZQorICAvLyBub2RlLCBhbmQgYGluc3RgIGlzIHRoZSBkZWVwZXN0IGFu Y2VzdG9yIHRoYXQgZG9lcy4KKyAgZm9yICg7IHBhcmVudHMubGVuZ3RoOyBpbnN0ID0gcGFyZW50 cy5wb3AoKSkgeworICAgIHByZWNhY2hlQ2hpbGROb2RlcyhpbnN0LCBpbnN0Ll9ob3N0Tm9kZSk7 CisgIH0KKworICByZXR1cm4gaW5zdC5faG9zdE5vZGU7Cit9CisKK3ZhciBSZWFjdERPTUNvbXBv bmVudFRyZWUgPSB7CisgIGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlOiBnZXRDbG9zZXN0SW5z dGFuY2VGcm9tTm9kZSwKKyAgZ2V0SW5zdGFuY2VGcm9tTm9kZTogZ2V0SW5zdGFuY2VGcm9tTm9k ZSwKKyAgZ2V0Tm9kZUZyb21JbnN0YW5jZTogZ2V0Tm9kZUZyb21JbnN0YW5jZSwKKyAgcHJlY2Fj aGVDaGlsZE5vZGVzOiBwcmVjYWNoZUNoaWxkTm9kZXMsCisgIHByZWNhY2hlTm9kZTogcHJlY2Fj aGVOb2RlLAorICB1bmNhY2hlTm9kZTogdW5jYWNoZU5vZGUKK307CisKK21vZHVsZS5leHBvcnRz ID0gUmVhY3RET01Db21wb25lbnRUcmVlOworfSx7IjExIjoxMSwiMTE2IjoxMTYsIjE0MCI6MTQw LCIzMSI6MzF9XSwzMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAq IENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJl c2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJT RC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290 IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBv ZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBz YW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgdmFsaWRhdGVE T01OZXN0aW5nID0gX2RlcmVxXygxMjEpOworCit2YXIgRE9DX05PREVfVFlQRSA9IDk7CisKK2Z1 bmN0aW9uIFJlYWN0RE9NQ29udGFpbmVySW5mbyh0b3BMZXZlbFdyYXBwZXIsIG5vZGUpIHsKKyAg dmFyIGluZm8gPSB7CisgICAgX3RvcExldmVsV3JhcHBlcjogdG9wTGV2ZWxXcmFwcGVyLAorICAg IF9pZENvdW50ZXI6IDEsCisgICAgX293bmVyRG9jdW1lbnQ6IG5vZGUgPyBub2RlLm5vZGVUeXBl ID09PSBET0NfTk9ERV9UWVBFID8gbm9kZSA6IG5vZGUub3duZXJEb2N1bWVudCA6IG51bGwsCisg ICAgX25vZGU6IG5vZGUsCisgICAgX3RhZzogbm9kZSA/IG5vZGUubm9kZU5hbWUudG9Mb3dlckNh c2UoKSA6IG51bGwsCisgICAgX25hbWVzcGFjZVVSSTogbm9kZSA/IG5vZGUubmFtZXNwYWNlVVJJ IDogbnVsbAorICB9OworICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7Cisg ICAgaW5mby5fYW5jZXN0b3JJbmZvID0gbm9kZSA/IHZhbGlkYXRlRE9NTmVzdGluZy51cGRhdGVk QW5jZXN0b3JJbmZvKG51bGwsIGluZm8uX3RhZywgbnVsbCkgOiBudWxsOworICB9CisgIHJldHVy biBpbmZvOworfQorCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NQ29udGFpbmVySW5mbzsKK30s eyIxMjEiOjEyMX1dLDM0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgor ICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMg cmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUg QlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJv b3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAq IG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhl IHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfYXNzaWdu ID0gX2RlcmVxXygxNDgpOworCit2YXIgRE9NTGF6eVRyZWUgPSBfZGVyZXFfKDkpOwordmFyIFJl YWN0RE9NQ29tcG9uZW50VHJlZSA9IF9kZXJlcV8oMzIpOworCit2YXIgUmVhY3RET01FbXB0eUNv bXBvbmVudCA9IGZ1bmN0aW9uIChpbnN0YW50aWF0ZSkgeworICAvLyBSZWFjdENvbXBvc2l0ZUNv bXBvbmVudCB1c2VzIHRoaXM6CisgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbnVsbDsKKyAgLy8g UmVhY3RET01Db21wb25lbnRUcmVlIHVzZXMgdGhlc2U6CisgIHRoaXMuX2hvc3ROb2RlID0gbnVs bDsKKyAgdGhpcy5faG9zdFBhcmVudCA9IG51bGw7CisgIHRoaXMuX2hvc3RDb250YWluZXJJbmZv ID0gbnVsbDsKKyAgdGhpcy5fZG9tSUQgPSAwOworfTsKK19hc3NpZ24oUmVhY3RET01FbXB0eUNv bXBvbmVudC5wcm90b3R5cGUsIHsKKyAgbW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uICh0cmFuc2Fj dGlvbiwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIGNvbnRleHQpIHsKKyAgICB2YXIg ZG9tSUQgPSBob3N0Q29udGFpbmVySW5mby5faWRDb3VudGVyKys7CisgICAgdGhpcy5fZG9tSUQg PSBkb21JRDsKKyAgICB0aGlzLl9ob3N0UGFyZW50ID0gaG9zdFBhcmVudDsKKyAgICB0aGlzLl9o b3N0Q29udGFpbmVySW5mbyA9IGhvc3RDb250YWluZXJJbmZvOworCisgICAgdmFyIG5vZGVWYWx1 ZSA9ICcgcmVhY3QtZW1wdHk6ICcgKyB0aGlzLl9kb21JRCArICcgJzsKKyAgICBpZiAodHJhbnNh Y3Rpb24udXNlQ3JlYXRlRWxlbWVudCkgeworICAgICAgdmFyIG93bmVyRG9jdW1lbnQgPSBob3N0 Q29udGFpbmVySW5mby5fb3duZXJEb2N1bWVudDsKKyAgICAgIHZhciBub2RlID0gb3duZXJEb2N1 bWVudC5jcmVhdGVDb21tZW50KG5vZGVWYWx1ZSk7CisgICAgICBSZWFjdERPTUNvbXBvbmVudFRy ZWUucHJlY2FjaGVOb2RlKHRoaXMsIG5vZGUpOworICAgICAgcmV0dXJuIERPTUxhenlUcmVlKG5v ZGUpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAodHJhbnNhY3Rpb24ucmVuZGVyVG9TdGF0aWNN YXJrdXApIHsKKyAgICAgICAgLy8gTm9ybWFsbHkgd2UnZCBpbnNlcnQgYSBjb21tZW50IG5vZGUs IGJ1dCBzaW5jZSB0aGlzIGlzIGEgc2l0dWF0aW9uCisgICAgICAgIC8vIHdoZXJlIFJlYWN0IHdv bid0IHRha2Ugb3ZlciAoc3RhdGljIHBhZ2VzKSwgd2UgY2FuIHNpbXBseSByZXR1cm4KKyAgICAg ICAgLy8gbm90aGluZy4KKyAgICAgICAgcmV0dXJuICcnOworICAgICAgfQorICAgICAgcmV0dXJu ICc8IS0tJyArIG5vZGVWYWx1ZSArICctLT4nOworICAgIH0KKyAgfSwKKyAgcmVjZWl2ZUNvbXBv bmVudDogZnVuY3Rpb24gKCkge30sCisgIGdldEhvc3ROb2RlOiBmdW5jdGlvbiAoKSB7CisgICAg cmV0dXJuIFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKHRoaXMpOwor ICB9LAorICB1bm1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoKSB7CisgICAgUmVhY3RET01Db21w b25lbnRUcmVlLnVuY2FjaGVOb2RlKHRoaXMpOworICB9Cit9KTsKKworbW9kdWxlLmV4cG9ydHMg PSBSZWFjdERPTUVtcHR5Q29tcG9uZW50OworfSx7IjE0OCI6MTQ4LCIzMiI6MzIsIjkiOjl9XSwz NTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAy MDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK KyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNl bnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBv ZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmln aHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9y eS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgRE9NQ2hpbGRyZW5PcGVyYXRpb25z ID0gX2RlcmVxXyg4KTsKK3ZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSBfZGVyZXFfKDMyKTsK KworLyoqCisgKiBPcGVyYXRpb25zIHVzZWQgdG8gcHJvY2VzcyB1cGRhdGVzIHRvIERPTSBub2Rl cy4KKyAqLwordmFyIFJlYWN0RE9NSURPcGVyYXRpb25zID0geworCisgIC8qKgorICAgKiBVcGRh dGVzIGEgY29tcG9uZW50J3MgY2hpbGRyZW4gYnkgcHJvY2Vzc2luZyBhIHNlcmllcyBvZiB1cGRh dGVzLgorICAgKgorICAgKiBAcGFyYW0ge2FycmF5PG9iamVjdD59IHVwZGF0ZXMgTGlzdCBvZiB1 cGRhdGUgY29uZmlndXJhdGlvbnMuCisgICAqIEBpbnRlcm5hbAorICAgKi8KKyAgZGFuZ2Vyb3Vz bHlQcm9jZXNzQ2hpbGRyZW5VcGRhdGVzOiBmdW5jdGlvbiAocGFyZW50SW5zdCwgdXBkYXRlcykg eworICAgIHZhciBub2RlID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFu Y2UocGFyZW50SW5zdCk7CisgICAgRE9NQ2hpbGRyZW5PcGVyYXRpb25zLnByb2Nlc3NVcGRhdGVz KG5vZGUsIHVwZGF0ZXMpOworICB9Cit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NSURP cGVyYXRpb25zOworfSx7IjMyIjozMiwiOCI6OH1dLDM2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVs ZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIElu Yy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBs aWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNF TlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFk ZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQ QVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmlj dCc7CisKK3ZhciBfcHJvZEludmFyaWFudCA9IF9kZXJlcV8oMTE2KSwKKyAgICBfYXNzaWduID0g X2RlcmVxXygxNDgpOworCit2YXIgRE9NUHJvcGVydHlPcGVyYXRpb25zID0gX2RlcmVxXygxMik7 Cit2YXIgTGlua2VkVmFsdWVVdGlscyA9IF9kZXJlcV8oMjMpOwordmFyIFJlYWN0RE9NQ29tcG9u ZW50VHJlZSA9IF9kZXJlcV8oMzIpOwordmFyIFJlYWN0VXBkYXRlcyA9IF9kZXJlcV8oNzUpOwor Cit2YXIgaW52YXJpYW50ID0gX2RlcmVxXygxNDApOwordmFyIHdhcm5pbmcgPSBfZGVyZXFfKDE0 Nyk7CisKK3ZhciBkaWRXYXJuVmFsdWVMaW5rID0gZmFsc2U7Cit2YXIgZGlkV2FybkNoZWNrZWRM aW5rID0gZmFsc2U7Cit2YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gZmFsc2U7Cit2YXIg ZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9IGZhbHNlOwordmFyIGRpZFdhcm5Db250cm9s bGVkVG9VbmNvbnRyb2xsZWQgPSBmYWxzZTsKK3ZhciBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250 cm9sbGVkID0gZmFsc2U7CisKK2Z1bmN0aW9uIGZvcmNlVXBkYXRlSWZNb3VudGVkKCkgeworICBp ZiAodGhpcy5fcm9vdE5vZGVJRCkgeworICAgIC8vIERPTSBjb21wb25lbnQgaXMgc3RpbGwgbW91 bnRlZDsgdXBkYXRlCisgICAgUmVhY3RET01JbnB1dC51cGRhdGVXcmFwcGVyKHRoaXMpOworICB9 Cit9CisKK2Z1bmN0aW9uIGlzQ29udHJvbGxlZChwcm9wcykgeworICB2YXIgdXNlc0NoZWNrZWQg PSBwcm9wcy50eXBlID09PSAnY2hlY2tib3gnIHx8IHByb3BzLnR5cGUgPT09ICdyYWRpbyc7Cisg IHJldHVybiB1c2VzQ2hlY2tlZCA/IHByb3BzLmNoZWNrZWQgIT0gbnVsbCA6IHByb3BzLnZhbHVl ICE9IG51bGw7Cit9CisKKy8qKgorICogSW1wbGVtZW50cyBhbiA8aW5wdXQ+IGhvc3QgY29tcG9u ZW50IHRoYXQgYWxsb3dzIHNldHRpbmcgdGhlc2Ugb3B0aW9uYWwKKyAqIHByb3BzOiBgY2hlY2tl ZGAsIGB2YWx1ZWAsIGBkZWZhdWx0Q2hlY2tlZGAsIGFuZCBgZGVmYXVsdFZhbHVlYC4KKyAqCisg KiBJZiBgY2hlY2tlZGAgb3IgYHZhbHVlYCBhcmUgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVm aW5lZCksIHVzZXIgYWN0aW9ucworICogdGhhdCBhZmZlY3QgdGhlIGNoZWNrZWQgc3RhdGUgb3Ig dmFsdWUgd2lsbCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuCisgKgorICogSWYgdGhl eSBhcmUgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVyZWQgZWxl bWVudCB3aWxsIG5vdAorICogdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LiBJbnN0ZWFk LCB0aGUgcHJvcHMgbXVzdCBjaGFuZ2UgaW4gb3JkZXIgZm9yCisgKiB0aGUgcmVuZGVyZWQgZWxl bWVudCB0byBiZSB1cGRhdGVkLgorICoKKyAqIFRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGwgYmUg aW5pdGlhbGl6ZWQgYXMgdW5jaGVja2VkIChvciBgZGVmYXVsdENoZWNrZWRgKQorICogd2l0aCBh biBlbXB0eSB2YWx1ZSAob3IgYGRlZmF1bHRWYWx1ZWApLgorICoKKyAqIEBzZWUgaHR0cDovL3d3 dy53My5vcmcvVFIvMjAxMi9XRC1odG1sNS0yMDEyMTAyNS90aGUtaW5wdXQtZWxlbWVudC5odG1s CisgKi8KK3ZhciBSZWFjdERPTUlucHV0ID0geworICBnZXRIb3N0UHJvcHM6IGZ1bmN0aW9uIChp bnN0LCBwcm9wcykgeworICAgIHZhciB2YWx1ZSA9IExpbmtlZFZhbHVlVXRpbHMuZ2V0VmFsdWUo cHJvcHMpOworICAgIHZhciBjaGVja2VkID0gTGlua2VkVmFsdWVVdGlscy5nZXRDaGVja2VkKHBy b3BzKTsKKworICAgIHZhciBob3N0UHJvcHMgPSBfYXNzaWduKHsKKyAgICAgIC8vIE1ha2Ugc3Vy ZSB3ZSBzZXQgLnR5cGUgYmVmb3JlIGFueSBvdGhlciBwcm9wZXJ0aWVzIChzZXR0aW5nIC52YWx1 ZQorICAgICAgLy8gYmVmb3JlIC50eXBlIG1lYW5zIC52YWx1ZSBpcyBsb3N0IGluIElFMTEgYW5k IGJlbG93KQorICAgICAgdHlwZTogdW5kZWZpbmVkLAorICAgICAgLy8gTWFrZSBzdXJlIHdlIHNl dCAuc3RlcCBiZWZvcmUgLnZhbHVlIChzZXR0aW5nIC52YWx1ZSBiZWZvcmUgLnN0ZXAKKyAgICAg IC8vIG1lYW5zIC52YWx1ZSBpcyByb3VuZGVkIG9uIG1vdW50LCBiYXNlZCB1cG9uIHN0ZXAgcHJl Y2lzaW9uKQorICAgICAgc3RlcDogdW5kZWZpbmVkLAorICAgICAgLy8gTWFrZSBzdXJlIHdlIHNl dCAubWluICYgLm1heCBiZWZvcmUgLnZhbHVlICh0byBlbnN1cmUgcHJvcGVyIG9yZGVyCisgICAg ICAvLyBpbiBjb3JuZXIgY2FzZXMgc3VjaCBhcyBtaW4gb3IgbWF4IGRlcml2aW5nIGZyb20gdmFs dWUsIGUuZy4gSXNzdWUgIzcxNzApCisgICAgICBtaW46IHVuZGVmaW5lZCwKKyAgICAgIG1heDog dW5kZWZpbmVkCisgICAgfSwgcHJvcHMsIHsKKyAgICAgIGRlZmF1bHRDaGVja2VkOiB1bmRlZmlu ZWQsCisgICAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCwKKyAgICAgIHZhbHVlOiB2YWx1ZSAh PSBudWxsID8gdmFsdWUgOiBpbnN0Ll93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlLAorICAgICAg Y2hlY2tlZDogY2hlY2tlZCAhPSBudWxsID8gY2hlY2tlZCA6IGluc3QuX3dyYXBwZXJTdGF0ZS5p bml0aWFsQ2hlY2tlZCwKKyAgICAgIG9uQ2hhbmdlOiBpbnN0Ll93cmFwcGVyU3RhdGUub25DaGFu Z2UKKyAgICB9KTsKKworICAgIHJldHVybiBob3N0UHJvcHM7CisgIH0sCisKKyAgbW91bnRXcmFw cGVyOiBmdW5jdGlvbiAoaW5zdCwgcHJvcHMpIHsKKyAgICBpZiAoImRldmVsb3BtZW50IiAhPT0g J3Byb2R1Y3Rpb24nKSB7CisgICAgICBMaW5rZWRWYWx1ZVV0aWxzLmNoZWNrUHJvcFR5cGVzKCdp bnB1dCcsIHByb3BzLCBpbnN0Ll9jdXJyZW50RWxlbWVudC5fb3duZXIpOworCisgICAgICB2YXIg b3duZXIgPSBpbnN0Ll9jdXJyZW50RWxlbWVudC5fb3duZXI7CisKKyAgICAgIGlmIChwcm9wcy52 YWx1ZUxpbmsgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbHVlTGluaykgeworICAgICAgICAi ZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnYHZhbHVlTGlu a2AgcHJvcCBvbiBgaW5wdXRgIGlzIGRlcHJlY2F0ZWQ7IHNldCBgdmFsdWVgIGFuZCBgb25DaGFu Z2VgIGluc3RlYWQuJykgOiB2b2lkIDA7CisgICAgICAgIGRpZFdhcm5WYWx1ZUxpbmsgPSB0cnVl OworICAgICAgfQorICAgICAgaWYgKHByb3BzLmNoZWNrZWRMaW5rICE9PSB1bmRlZmluZWQgJiYg IWRpZFdhcm5DaGVja2VkTGluaykgeworICAgICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVj dGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnYGNoZWNrZWRMaW5rYCBwcm9wIG9uIGBpbnB1dGAgaXMg ZGVwcmVjYXRlZDsgc2V0IGB2YWx1ZWAgYW5kIGBvbkNoYW5nZWAgaW5zdGVhZC4nKSA6IHZvaWQg MDsKKyAgICAgICAgZGlkV2FybkNoZWNrZWRMaW5rID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGlm IChwcm9wcy5jaGVja2VkICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdENoZWNrZWQgIT09 IHVuZGVmaW5lZCAmJiAhZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCkgeworICAgICAgICAi ZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnJXMgY29udGFp bnMgYW4gaW5wdXQgb2YgdHlwZSAlcyB3aXRoIGJvdGggY2hlY2tlZCBhbmQgZGVmYXVsdENoZWNr ZWQgcHJvcHMuICcgKyAnSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBv ciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIGNoZWNrZWQgcHJvcCwgb3Ig dGhlIGRlZmF1bHRDaGVja2VkIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdl ZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQg YW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL2Zi Lm1lL3JlYWN0LWNvbnRyb2xsZWQtY29tcG9uZW50cycsIG93bmVyICYmIG93bmVyLmdldE5hbWUo KSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKSA6IHZvaWQgMDsKKyAgICAgICAgZGlkV2Fy bkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9IHRydWU7CisgICAgICB9CisgICAgICBpZiAocHJvcHMu dmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAm JiAhZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlKSB7CisgICAgICAgICJkZXZlbG9wbWVudCIgIT09 ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclcyBjb250YWlucyBhbiBpbnB1dCBvZiB0 eXBlICVzIHdpdGggYm90aCB2YWx1ZSBhbmQgZGVmYXVsdFZhbHVlIHByb3BzLiAnICsgJ0lucHV0 IGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAn KHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3As IGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9y IHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2Ug cHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL2ZiLm1lL3JlYWN0LWNvbnRyb2xsZWQtY29t cG9uZW50cycsIG93bmVyICYmIG93bmVyLmdldE5hbWUoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9w cy50eXBlKSA6IHZvaWQgMDsKKyAgICAgICAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gdHJ1 ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVs dFZhbHVlOworICAgIGluc3QuX3dyYXBwZXJTdGF0ZSA9IHsKKyAgICAgIGluaXRpYWxDaGVja2Vk OiBwcm9wcy5jaGVja2VkICE9IG51bGwgPyBwcm9wcy5jaGVja2VkIDogcHJvcHMuZGVmYXVsdENo ZWNrZWQsCisgICAgICBpbml0aWFsVmFsdWU6IHByb3BzLnZhbHVlICE9IG51bGwgPyBwcm9wcy52 YWx1ZSA6IGRlZmF1bHRWYWx1ZSwKKyAgICAgIGxpc3RlbmVyczogbnVsbCwKKyAgICAgIG9uQ2hh bmdlOiBfaGFuZGxlQ2hhbmdlLmJpbmQoaW5zdCkKKyAgICB9OworCisgICAgaWYgKCJkZXZlbG9w bWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgaW5zdC5fd3JhcHBlclN0YXRlLmNvbnRy b2xsZWQgPSBpc0NvbnRyb2xsZWQocHJvcHMpOworICAgIH0KKyAgfSwKKworICB1cGRhdGVXcmFw cGVyOiBmdW5jdGlvbiAoaW5zdCkgeworICAgIHZhciBwcm9wcyA9IGluc3QuX2N1cnJlbnRFbGVt ZW50LnByb3BzOworCisgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgewor ICAgICAgdmFyIGNvbnRyb2xsZWQgPSBpc0NvbnRyb2xsZWQocHJvcHMpOworICAgICAgdmFyIG93 bmVyID0gaW5zdC5fY3VycmVudEVsZW1lbnQuX293bmVyOworCisgICAgICBpZiAoIWluc3QuX3dy YXBwZXJTdGF0ZS5jb250cm9sbGVkICYmIGNvbnRyb2xsZWQgJiYgIWRpZFdhcm5VbmNvbnRyb2xs ZWRUb0NvbnRyb2xsZWQpIHsKKyAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24n ID8gd2FybmluZyhmYWxzZSwgJyVzIGlzIGNoYW5naW5nIGFuIHVuY29udHJvbGxlZCBpbnB1dCBv ZiB0eXBlICVzIHRvIGJlIGNvbnRyb2xsZWQuICcgKyAnSW5wdXQgZWxlbWVudHMgc2hvdWxkIG5v dCBzd2l0Y2ggZnJvbSB1bmNvbnRyb2xsZWQgdG8gY29udHJvbGxlZCAob3IgdmljZSB2ZXJzYSku ICcgKyAnRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBp bnB1dCAnICsgJ2VsZW1lbnQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgY29tcG9uZW50LiBNb3Jl IGluZm86IGh0dHBzOi8vZmIubWUvcmVhY3QtY29udHJvbGxlZC1jb21wb25lbnRzJywgb3duZXIg JiYgb3duZXIuZ2V0TmFtZSgpIHx8ICdBIGNvbXBvbmVudCcsIHByb3BzLnR5cGUpIDogdm9pZCAw OworICAgICAgICBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gdHJ1ZTsKKyAgICAg IH0KKyAgICAgIGlmIChpbnN0Ll93cmFwcGVyU3RhdGUuY29udHJvbGxlZCAmJiAhY29udHJvbGxl ZCAmJiAhZGlkV2FybkNvbnRyb2xsZWRUb1VuY29udHJvbGxlZCkgeworICAgICAgICAiZGV2ZWxv cG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnJXMgaXMgY2hhbmdpbmcg YSBjb250cm9sbGVkIGlucHV0IG9mIHR5cGUgJXMgdG8gYmUgdW5jb250cm9sbGVkLiAnICsgJ0lu cHV0IGVsZW1lbnRzIHNob3VsZCBub3Qgc3dpdGNoIGZyb20gY29udHJvbGxlZCB0byB1bmNvbnRy b2xsZWQgKG9yIHZpY2UgdmVyc2EpLiAnICsgJ0RlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJv bGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGZvciB0aGUgbGlmZXRpbWUg b2YgdGhlIGNvbXBvbmVudC4gTW9yZSBpbmZvOiBodHRwczovL2ZiLm1lL3JlYWN0LWNvbnRyb2xs ZWQtY29tcG9uZW50cycsIG93bmVyICYmIG93bmVyLmdldE5hbWUoKSB8fCAnQSBjb21wb25lbnQn LCBwcm9wcy50eXBlKSA6IHZvaWQgMDsKKyAgICAgICAgZGlkV2FybkNvbnRyb2xsZWRUb1VuY29u dHJvbGxlZCA9IHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgLy8gVE9ETzogU2hvdWxkbid0 IHRoaXMgYmUgZ2V0Q2hlY2tlZChwcm9wcyk/CisgICAgdmFyIGNoZWNrZWQgPSBwcm9wcy5jaGVj a2VkOworICAgIGlmIChjaGVja2VkICE9IG51bGwpIHsKKyAgICAgIERPTVByb3BlcnR5T3BlcmF0 aW9ucy5zZXRWYWx1ZUZvclByb3BlcnR5KFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJv bUluc3RhbmNlKGluc3QpLCAnY2hlY2tlZCcsIGNoZWNrZWQgfHwgZmFsc2UpOworICAgIH0KKwor ICAgIHZhciBub2RlID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2Uo aW5zdCk7CisgICAgdmFyIHZhbHVlID0gTGlua2VkVmFsdWVVdGlscy5nZXRWYWx1ZShwcm9wcyk7 CisgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKworICAgICAgLy8gQ2FzdCBgdmFsdWVgIHRvIGEg c3RyaW5nIHRvIGVuc3VyZSB0aGUgdmFsdWUgaXMgc2V0IGNvcnJlY3RseS4gV2hpbGUKKyAgICAg IC8vIGJyb3dzZXJzIHR5cGljYWxseSBkbyB0aGlzIGFzIG5lY2Vzc2FyeSwganNkb20gZG9lc24n dC4KKyAgICAgIHZhciBuZXdWYWx1ZSA9ICcnICsgdmFsdWU7CisKKyAgICAgIC8vIFRvIGF2b2lk IHNpZGUgZWZmZWN0cyAoc3VjaCBhcyBsb3NpbmcgdGV4dCBzZWxlY3Rpb24pLCBvbmx5IHNldCB2 YWx1ZSBpZiBjaGFuZ2VkCisgICAgICBpZiAobmV3VmFsdWUgIT09IG5vZGUudmFsdWUpIHsKKyAg ICAgICAgbm9kZS52YWx1ZSA9IG5ld1ZhbHVlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAg ICBpZiAocHJvcHMudmFsdWUgPT0gbnVsbCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUgIT0gbnVsbCkg eworICAgICAgICAvLyBJbiBDaHJvbWUsIGFzc2lnbmluZyBkZWZhdWx0VmFsdWUgdG8gY2VydGFp biBpbnB1dCB0eXBlcyB0cmlnZ2VycyBpbnB1dCB2YWxpZGF0aW9uLgorICAgICAgICAvLyBGb3Ig bnVtYmVyIGlucHV0cywgdGhlIGRpc3BsYXkgdmFsdWUgbG9zZXMgdHJhaWxpbmcgZGVjaW1hbCBw b2ludHMuIEZvciBlbWFpbCBpbnB1dHMsCisgICAgICAgIC8vIENocm9tZSByYWlzZXMgIlRoZSBz cGVjaWZpZWQgdmFsdWUgPHg+IGlzIG5vdCBhIHZhbGlkIGVtYWlsIGFkZHJlc3MiLgorICAgICAg ICAvLworICAgICAgICAvLyBIZXJlIHdlIGNoZWNrIHRvIHNlZSBpZiB0aGUgZGVmYXVsdFZhbHVl IGhhcyBhY3R1YWxseSBjaGFuZ2VkLCBhdm9pZGluZyB0aGVzZSBwcm9ibGVtcworICAgICAgICAv LyB3aGVuIHRoZSB1c2VyIGlzIGlucHV0dGluZyB0ZXh0CisgICAgICAgIC8vCisgICAgICAgIC8v IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzI1MworICAgICAgICBp ZiAobm9kZS5kZWZhdWx0VmFsdWUgIT09ICcnICsgcHJvcHMuZGVmYXVsdFZhbHVlKSB7CisgICAg ICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSAnJyArIHByb3BzLmRlZmF1bHRWYWx1ZTsKKyAgICAg ICAgfQorICAgICAgfQorICAgICAgaWYgKHByb3BzLmNoZWNrZWQgPT0gbnVsbCAmJiBwcm9wcy5k ZWZhdWx0Q2hlY2tlZCAhPSBudWxsKSB7CisgICAgICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAh IXByb3BzLmRlZmF1bHRDaGVja2VkOworICAgICAgfQorICAgIH0KKyAgfSwKKworICBwb3N0TW91 bnRXcmFwcGVyOiBmdW5jdGlvbiAoaW5zdCkgeworICAgIHZhciBwcm9wcyA9IGluc3QuX2N1cnJl bnRFbGVtZW50LnByb3BzOworCisgICAgLy8gVGhpcyBpcyBpbiBwb3N0TW91bnQgYmVjYXVzZSB3 ZSBuZWVkIGFjY2VzcyB0byB0aGUgRE9NIG5vZGUsIHdoaWNoIGlzIG5vdAorICAgIC8vIGF2YWls YWJsZSB1bnRpbCBhZnRlciB0aGUgY29tcG9uZW50IGhhcyBtb3VudGVkLgorICAgIHZhciBub2Rl ID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCk7CisKKyAg ICAvLyBEZXRhY2ggdmFsdWUgZnJvbSBkZWZhdWx0VmFsdWUuIFdlIHdvbid0IGRvIGFueXRoaW5n IGlmIHdlJ3JlIHdvcmtpbmcgb24KKyAgICAvLyBzdWJtaXQgb3IgcmVzZXQgaW5wdXRzIGFzIHRo b3NlIHZhbHVlcyAmIGRlZmF1bHRWYWx1ZXMgYXJlIGxpbmtlZC4gVGhleQorICAgIC8vIGFyZSBu b3QgcmVzZXRhYmxlIG5vZGVzIHNvIHRoaXMgb3BlcmF0aW9uIGRvZXNuJ3QgbWF0dGVyIGFuZCBh Y3R1YWxseQorICAgIC8vIHJlbW92ZXMgYnJvd3Nlci1kZWZhdWx0IHZhbHVlcyAoZWcgIlN1Ym1p dCBRdWVyeSIpIHdoZW4gbm8gdmFsdWUgaXMKKyAgICAvLyBwcm92aWRlZC4KKworICAgIHN3aXRj aCAocHJvcHMudHlwZSkgeworICAgICAgY2FzZSAnc3VibWl0JzoKKyAgICAgIGNhc2UgJ3Jlc2V0 JzoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdjb2xvcic6CisgICAgICBjYXNlICdkYXRl JzoKKyAgICAgIGNhc2UgJ2RhdGV0aW1lJzoKKyAgICAgIGNhc2UgJ2RhdGV0aW1lLWxvY2FsJzoK KyAgICAgIGNhc2UgJ21vbnRoJzoKKyAgICAgIGNhc2UgJ3RpbWUnOgorICAgICAgY2FzZSAnd2Vl ayc6CisgICAgICAgIC8vIFRoaXMgZml4ZXMgdGhlIG5vLXNob3cgaXNzdWUgb24gaU9TIFNhZmFy aSBhbmQgQW5kcm9pZCBDaHJvbWU6CisgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNl Ym9vay9yZWFjdC9pc3N1ZXMvNzIzMworICAgICAgICBub2RlLnZhbHVlID0gJyc7CisgICAgICAg IG5vZGUudmFsdWUgPSBub2RlLmRlZmF1bHRWYWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBk ZWZhdWx0OgorICAgICAgICBub2RlLnZhbHVlID0gbm9kZS52YWx1ZTsKKyAgICAgICAgYnJlYWs7 CisgICAgfQorCisgICAgLy8gTm9ybWFsbHksIHdlJ2QganVzdCBkbyBgbm9kZS5jaGVja2VkID0g bm9kZS5jaGVja2VkYCB1cG9uIGluaXRpYWwgbW91bnQsIGxlc3MgdGhpcyBidWcKKyAgICAvLyB0 aGlzIGlzIG5lZWRlZCB0byB3b3JrIGFyb3VuZCBhIGNocm9tZSBidWcgd2hlcmUgc2V0dGluZyBk ZWZhdWx0Q2hlY2tlZAorICAgIC8vIHdpbGwgc29tZXRpbWVzIGluZmx1ZW5jZSB0aGUgdmFsdWUg b2YgY2hlY2tlZCAoZXZlbiBhZnRlciBkZXRhY2htZW50KS4KKyAgICAvLyBSZWZlcmVuY2U6IGh0 dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTYwODQx NgorICAgIC8vIFdlIG5lZWQgdG8gdGVtcG9yYXJpbHkgdW5zZXQgbmFtZSB0byBhdm9pZCBkaXNy dXB0aW5nIHJhZGlvIGJ1dHRvbiBncm91cHMuCisgICAgdmFyIG5hbWUgPSBub2RlLm5hbWU7Cisg ICAgaWYgKG5hbWUgIT09ICcnKSB7CisgICAgICBub2RlLm5hbWUgPSAnJzsKKyAgICB9CisgICAg bm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICFub2RlLmRlZmF1bHRDaGVja2VkOworICAgIG5vZGUuZGVm YXVsdENoZWNrZWQgPSAhbm9kZS5kZWZhdWx0Q2hlY2tlZDsKKyAgICBpZiAobmFtZSAhPT0gJycp IHsKKyAgICAgIG5vZGUubmFtZSA9IG5hbWU7CisgICAgfQorICB9Cit9OworCitmdW5jdGlvbiBf aGFuZGxlQ2hhbmdlKGV2ZW50KSB7CisgIHZhciBwcm9wcyA9IHRoaXMuX2N1cnJlbnRFbGVtZW50 LnByb3BzOworCisgIHZhciByZXR1cm5WYWx1ZSA9IExpbmtlZFZhbHVlVXRpbHMuZXhlY3V0ZU9u Q2hhbmdlKHByb3BzLCBldmVudCk7CisKKyAgLy8gSGVyZSB3ZSB1c2UgYXNhcCB0byB3YWl0IHVu dGlsIGFsbCB1cGRhdGVzIGhhdmUgcHJvcGFnYXRlZCwgd2hpY2gKKyAgLy8gaXMgaW1wb3J0YW50 IHdoZW4gdXNpbmcgY29udHJvbGxlZCBjb21wb25lbnRzIHdpdGhpbiBsYXllcnM6CisgIC8vIGh0 dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTY5OAorICBSZWFjdFVwZGF0 ZXMuYXNhcChmb3JjZVVwZGF0ZUlmTW91bnRlZCwgdGhpcyk7CisKKyAgdmFyIG5hbWUgPSBwcm9w cy5uYW1lOworICBpZiAocHJvcHMudHlwZSA9PT0gJ3JhZGlvJyAmJiBuYW1lICE9IG51bGwpIHsK KyAgICB2YXIgcm9vdE5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0 YW5jZSh0aGlzKTsKKyAgICB2YXIgcXVlcnlSb290ID0gcm9vdE5vZGU7CisKKyAgICB3aGlsZSAo cXVlcnlSb290LnBhcmVudE5vZGUpIHsKKyAgICAgIHF1ZXJ5Um9vdCA9IHF1ZXJ5Um9vdC5wYXJl bnROb2RlOworICAgIH0KKworICAgIC8vIElmIGByb290Tm9kZS5mb3JtYCB3YXMgbm9uLW51bGws IHRoZW4gd2UgY291bGQgdHJ5IGBmb3JtLmVsZW1lbnRzYCwKKyAgICAvLyBidXQgdGhhdCBzb21l dGltZXMgYmVoYXZlcyBzdHJhbmdlbHkgaW4gSUU4LiBXZSBjb3VsZCBhbHNvIHRyeSB1c2luZwor ICAgIC8vIGBmb3JtLmdldEVsZW1lbnRzQnlOYW1lYCwgYnV0IHRoYXQgd2lsbCBvbmx5IHJldHVy biBkaXJlY3QgY2hpbGRyZW4KKyAgICAvLyBhbmQgd29uJ3QgaW5jbHVkZSBpbnB1dHMgdGhhdCB1 c2UgdGhlIEhUTUw1IGBmb3JtPWAgYXR0cmlidXRlLiBTaW5jZQorICAgIC8vIHRoZSBpbnB1dCBt aWdodCBub3QgZXZlbiBiZSBpbiBhIGZvcm0sIGxldCdzIGp1c3QgdXNlIHRoZSBnbG9iYWwKKyAg ICAvLyBgcXVlcnlTZWxlY3RvckFsbGAgdG8gZW5zdXJlIHdlIGRvbid0IG1pc3MgYW55dGhpbmcu CisgICAgdmFyIGdyb3VwID0gcXVlcnlSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W25hbWU9 JyArIEpTT04uc3RyaW5naWZ5KCcnICsgbmFtZSkgKyAnXVt0eXBlPSJyYWRpbyJdJyk7CisKKyAg ICBmb3IgKHZhciBpID0gMDsgaSA8IGdyb3VwLmxlbmd0aDsgaSsrKSB7CisgICAgICB2YXIgb3Ro ZXJOb2RlID0gZ3JvdXBbaV07CisgICAgICBpZiAob3RoZXJOb2RlID09PSByb290Tm9kZSB8fCBv dGhlck5vZGUuZm9ybSAhPT0gcm9vdE5vZGUuZm9ybSkgeworICAgICAgICBjb250aW51ZTsKKyAg ICAgIH0KKyAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBpZiByYWRpbyBidXR0b25zIHJlbmRlcmVk IGJ5IGRpZmZlcmVudCBjb3BpZXMgb2YgUmVhY3QKKyAgICAgIC8vIGFuZCB0aGUgc2FtZSBuYW1l IGFyZSByZW5kZXJlZCBpbnRvIHRoZSBzYW1lIGZvcm0gKHNhbWUgYXMgIzE5MzkpLgorICAgICAg Ly8gVGhhdCdzIHByb2JhYmx5IG9rYXk7IHdlIGRvbid0IHN1cHBvcnQgaXQganVzdCBhcyB3ZSBk b24ndCBzdXBwb3J0CisgICAgICAvLyBtaXhpbmcgUmVhY3QgcmFkaW8gYnV0dG9ucyB3aXRoIG5v bi1SZWFjdCBvbmVzLgorICAgICAgdmFyIG90aGVySW5zdGFuY2UgPSBSZWFjdERPTUNvbXBvbmVu dFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShvdGhlck5vZGUpOworICAgICAgIW90aGVySW5zdGFu Y2UgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdS ZWFjdERPTUlucHV0OiBNaXhpbmcgUmVhY3QgYW5kIG5vbi1SZWFjdCByYWRpbyBpbnB1dHMgd2l0 aCB0aGUgc2FtZSBgbmFtZWAgaXMgbm90IHN1cHBvcnRlZC4nKSA6IF9wcm9kSW52YXJpYW50KCc5 MCcpIDogdm9pZCAwOworICAgICAgLy8gSWYgdGhpcyBpcyBhIGNvbnRyb2xsZWQgcmFkaW8gYnV0 dG9uIGdyb3VwLCBmb3JjaW5nIHRoZSBpbnB1dCB0aGF0CisgICAgICAvLyB3YXMgcHJldmlvdXNs eSBjaGVja2VkIHRvIHVwZGF0ZSB3aWxsIGNhdXNlIGl0IHRvIGJlIGNvbWUgcmUtY2hlY2tlZAor ICAgICAgLy8gYXMgYXBwcm9wcmlhdGUuCisgICAgICBSZWFjdFVwZGF0ZXMuYXNhcChmb3JjZVVw ZGF0ZUlmTW91bnRlZCwgb3RoZXJJbnN0YW5jZSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJl dHVyblZhbHVlOworfQorCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NSW5wdXQ7Cit9LHsiMTE2 IjoxMTYsIjEyIjoxMiwiMTQwIjoxNDAsIjE0NyI6MTQ3LCIxNDgiOjE0OCwiMjMiOjIzLCIzMiI6 MzIsIjc1Ijo3NX1dLDM3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgor ICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMg cmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUg QlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJv b3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAq IG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhl IHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfYXNzaWdu ID0gX2RlcmVxXygxNDgpOworCit2YXIgUmVhY3QgPSBfZGVyZXFfKDEyNCk7Cit2YXIgUmVhY3RE T01Db21wb25lbnRUcmVlID0gX2RlcmVxXygzMik7Cit2YXIgUmVhY3RET01TZWxlY3QgPSBfZGVy ZXFfKDM4KTsKKwordmFyIHdhcm5pbmcgPSBfZGVyZXFfKDE0Nyk7Cit2YXIgZGlkV2FybkludmFs aWRPcHRpb25DaGlsZHJlbiA9IGZhbHNlOworCitmdW5jdGlvbiBmbGF0dGVuQ2hpbGRyZW4oY2hp bGRyZW4pIHsKKyAgdmFyIGNvbnRlbnQgPSAnJzsKKworICAvLyBGbGF0dGVuIGNoaWxkcmVuIGFu ZCB3YXJuIGlmIHRoZXkgYXJlbid0IHN0cmluZ3Mgb3IgbnVtYmVyczsKKyAgLy8gaW52YWxpZCB0 eXBlcyBhcmUgaWdub3JlZC4KKyAgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgZnVu Y3Rpb24gKGNoaWxkKSB7CisgICAgaWYgKGNoaWxkID09IG51bGwpIHsKKyAgICAgIHJldHVybjsK KyAgICB9CisgICAgaWYgKHR5cGVvZiBjaGlsZCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGNoaWxk ID09PSAnbnVtYmVyJykgeworICAgICAgY29udGVudCArPSBjaGlsZDsKKyAgICB9IGVsc2UgaWYg KCFkaWRXYXJuSW52YWxpZE9wdGlvbkNoaWxkcmVuKSB7CisgICAgICBkaWRXYXJuSW52YWxpZE9w dGlvbkNoaWxkcmVuID0gdHJ1ZTsKKyAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9u JyA/IHdhcm5pbmcoZmFsc2UsICdPbmx5IHN0cmluZ3MgYW5kIG51bWJlcnMgYXJlIHN1cHBvcnRl ZCBhcyA8b3B0aW9uPiBjaGlsZHJlbi4nKSA6IHZvaWQgMDsKKyAgICB9CisgIH0pOworCisgIHJl dHVybiBjb250ZW50OworfQorCisvKioKKyAqIEltcGxlbWVudHMgYW4gPG9wdGlvbj4gaG9zdCBj b21wb25lbnQgdGhhdCB3YXJucyB3aGVuIGBzZWxlY3RlZGAgaXMgc2V0LgorICovCit2YXIgUmVh Y3RET01PcHRpb24gPSB7CisgIG1vdW50V3JhcHBlcjogZnVuY3Rpb24gKGluc3QsIHByb3BzLCBo b3N0UGFyZW50KSB7CisgICAgLy8gVE9ETyAoeXVuZ3N0ZXJzKTogUmVtb3ZlIHN1cHBvcnQgZm9y IGBzZWxlY3RlZGAgaW4gPG9wdGlvbj4uCisgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9k dWN0aW9uJykgeworICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2Fybmlu Zyhwcm9wcy5zZWxlY3RlZCA9PSBudWxsLCAnVXNlIHRoZSBgZGVmYXVsdFZhbHVlYCBvciBgdmFs dWVgIHByb3BzIG9uIDxzZWxlY3Q+IGluc3RlYWQgb2YgJyArICdzZXR0aW5nIGBzZWxlY3RlZGAg b24gPG9wdGlvbj4uJykgOiB2b2lkIDA7CisgICAgfQorCisgICAgLy8gTG9vayB1cCB3aGV0aGVy IHRoaXMgb3B0aW9uIGlzICdzZWxlY3RlZCcKKyAgICB2YXIgc2VsZWN0VmFsdWUgPSBudWxsOwor ICAgIGlmIChob3N0UGFyZW50ICE9IG51bGwpIHsKKyAgICAgIHZhciBzZWxlY3RQYXJlbnQgPSBo b3N0UGFyZW50OworCisgICAgICBpZiAoc2VsZWN0UGFyZW50Ll90YWcgPT09ICdvcHRncm91cCcp IHsKKyAgICAgICAgc2VsZWN0UGFyZW50ID0gc2VsZWN0UGFyZW50Ll9ob3N0UGFyZW50OworICAg ICAgfQorCisgICAgICBpZiAoc2VsZWN0UGFyZW50ICE9IG51bGwgJiYgc2VsZWN0UGFyZW50Ll90 YWcgPT09ICdzZWxlY3QnKSB7CisgICAgICAgIHNlbGVjdFZhbHVlID0gUmVhY3RET01TZWxlY3Qu Z2V0U2VsZWN0VmFsdWVDb250ZXh0KHNlbGVjdFBhcmVudCk7CisgICAgICB9CisgICAgfQorCisg ICAgLy8gSWYgdGhlIHZhbHVlIGlzIG51bGwgKGUuZy4sIG5vIHNwZWNpZmllZCB2YWx1ZSBvciBh ZnRlciBpbml0aWFsIG1vdW50KQorICAgIC8vIG9yIG1pc3NpbmcgKGUuZy4sIGZvciA8ZGF0YWxp c3Q+KSwgd2UgZG9uJ3QgY2hhbmdlIHByb3BzLnNlbGVjdGVkCisgICAgdmFyIHNlbGVjdGVkID0g bnVsbDsKKyAgICBpZiAoc2VsZWN0VmFsdWUgIT0gbnVsbCkgeworICAgICAgdmFyIHZhbHVlOwor ICAgICAgaWYgKHByb3BzLnZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgdmFsdWUgPSBwcm9wcy52 YWx1ZSArICcnOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsdWUgPSBmbGF0dGVuQ2hpbGRy ZW4ocHJvcHMuY2hpbGRyZW4pOworICAgICAgfQorICAgICAgc2VsZWN0ZWQgPSBmYWxzZTsKKyAg ICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdFZhbHVlKSkgeworICAgICAgICAvLyBtdWx0aXBs ZQorICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdFZhbHVlLmxlbmd0aDsgaSsrKSB7 CisgICAgICAgICAgaWYgKCcnICsgc2VsZWN0VmFsdWVbaV0gPT09IHZhbHVlKSB7CisgICAgICAg ICAgICBzZWxlY3RlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9Cisg ICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNlbGVjdGVkID0gJycgKyBzZWxlY3RW YWx1ZSA9PT0gdmFsdWU7CisgICAgICB9CisgICAgfQorCisgICAgaW5zdC5fd3JhcHBlclN0YXRl ID0geyBzZWxlY3RlZDogc2VsZWN0ZWQgfTsKKyAgfSwKKworICBwb3N0TW91bnRXcmFwcGVyOiBm dW5jdGlvbiAoaW5zdCkgeworICAgIC8vIHZhbHVlPSIiIHNob3VsZCBtYWtlIGEgdmFsdWUgYXR0 cmlidXRlICgjNjIxOSkKKyAgICB2YXIgcHJvcHMgPSBpbnN0Ll9jdXJyZW50RWxlbWVudC5wcm9w czsKKyAgICBpZiAocHJvcHMudmFsdWUgIT0gbnVsbCkgeworICAgICAgdmFyIG5vZGUgPSBSZWFj dERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KTsKKyAgICAgIG5vZGUu c2V0QXR0cmlidXRlKCd2YWx1ZScsIHByb3BzLnZhbHVlKTsKKyAgICB9CisgIH0sCisKKyAgZ2V0 SG9zdFByb3BzOiBmdW5jdGlvbiAoaW5zdCwgcHJvcHMpIHsKKyAgICB2YXIgaG9zdFByb3BzID0g X2Fzc2lnbih7IHNlbGVjdGVkOiB1bmRlZmluZWQsIGNoaWxkcmVuOiB1bmRlZmluZWQgfSwgcHJv cHMpOworCisgICAgLy8gUmVhZCBzdGF0ZSBvbmx5IGZyb20gaW5pdGlhbCBtb3VudCBiZWNhdXNl IDxzZWxlY3Q+IHVwZGF0ZXMgdmFsdWUKKyAgICAvLyBtYW51YWxseTsgd2UgbmVlZCB0aGUgaW5p dGlhbCBzdGF0ZSBvbmx5IGZvciBzZXJ2ZXIgcmVuZGVyaW5nCisgICAgaWYgKGluc3QuX3dyYXBw ZXJTdGF0ZS5zZWxlY3RlZCAhPSBudWxsKSB7CisgICAgICBob3N0UHJvcHMuc2VsZWN0ZWQgPSBp bnN0Ll93cmFwcGVyU3RhdGUuc2VsZWN0ZWQ7CisgICAgfQorCisgICAgdmFyIGNvbnRlbnQgPSBm bGF0dGVuQ2hpbGRyZW4ocHJvcHMuY2hpbGRyZW4pOworCisgICAgaWYgKGNvbnRlbnQpIHsKKyAg ICAgIGhvc3RQcm9wcy5jaGlsZHJlbiA9IGNvbnRlbnQ7CisgICAgfQorCisgICAgcmV0dXJuIGhv c3RQcm9wczsKKyAgfQorCit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NT3B0aW9uOwor fSx7IjEyNCI6MTI0LCIxNDciOjE0NywiMTQ4IjoxNDgsIjMyIjozMiwiMzgiOjM4fV0sMzg6W2Z1 bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1w cmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBU aGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBm b3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhp cyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBj YW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisg KgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9hc3NpZ24gPSBfZGVyZXFfKDE0OCk7CisK K3ZhciBMaW5rZWRWYWx1ZVV0aWxzID0gX2RlcmVxXygyMyk7Cit2YXIgUmVhY3RET01Db21wb25l bnRUcmVlID0gX2RlcmVxXygzMik7Cit2YXIgUmVhY3RVcGRhdGVzID0gX2RlcmVxXyg3NSk7CisK K3ZhciB3YXJuaW5nID0gX2RlcmVxXygxNDcpOworCit2YXIgZGlkV2FyblZhbHVlTGluayA9IGZh bHNlOwordmFyIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSA9IGZhbHNlOworCitmdW5jdGlvbiB1 cGRhdGVPcHRpb25zSWZQZW5kaW5nVXBkYXRlQW5kTW91bnRlZCgpIHsKKyAgaWYgKHRoaXMuX3Jv b3ROb2RlSUQgJiYgdGhpcy5fd3JhcHBlclN0YXRlLnBlbmRpbmdVcGRhdGUpIHsKKyAgICB0aGlz Ll93cmFwcGVyU3RhdGUucGVuZGluZ1VwZGF0ZSA9IGZhbHNlOworCisgICAgdmFyIHByb3BzID0g dGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHM7CisgICAgdmFyIHZhbHVlID0gTGlua2VkVmFsdWVV dGlscy5nZXRWYWx1ZShwcm9wcyk7CisKKyAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAg dXBkYXRlT3B0aW9ucyh0aGlzLCBCb29sZWFuKHByb3BzLm11bHRpcGxlKSwgdmFsdWUpOworICAg IH0KKyAgfQorfQorCitmdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0ob3duZXIp IHsKKyAgaWYgKG93bmVyKSB7CisgICAgdmFyIG5hbWUgPSBvd25lci5nZXROYW1lKCk7CisgICAg aWYgKG5hbWUpIHsKKyAgICAgIHJldHVybiAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAn ICsgbmFtZSArICdgLic7CisgICAgfQorICB9CisgIHJldHVybiAnJzsKK30KKwordmFyIHZhbHVl UHJvcE5hbWVzID0gWyd2YWx1ZScsICdkZWZhdWx0VmFsdWUnXTsKKworLyoqCisgKiBWYWxpZGF0 aW9uIGZ1bmN0aW9uIGZvciBgdmFsdWVgIGFuZCBgZGVmYXVsdFZhbHVlYC4KKyAqIEBwcml2YXRl CisgKi8KK2Z1bmN0aW9uIGNoZWNrU2VsZWN0UHJvcFR5cGVzKGluc3QsIHByb3BzKSB7CisgIHZh ciBvd25lciA9IGluc3QuX2N1cnJlbnRFbGVtZW50Ll9vd25lcjsKKyAgTGlua2VkVmFsdWVVdGls cy5jaGVja1Byb3BUeXBlcygnc2VsZWN0JywgcHJvcHMsIG93bmVyKTsKKworICBpZiAocHJvcHMu dmFsdWVMaW5rICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZUxpbmspIHsKKyAgICAiZGV2 ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnYHZhbHVlTGlua2Ag cHJvcCBvbiBgc2VsZWN0YCBpcyBkZXByZWNhdGVkOyBzZXQgYHZhbHVlYCBhbmQgYG9uQ2hhbmdl YCBpbnN0ZWFkLicpIDogdm9pZCAwOworICAgIGRpZFdhcm5WYWx1ZUxpbmsgPSB0cnVlOworICB9 CisKKyAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZVByb3BOYW1lcy5sZW5ndGg7IGkrKykgewor ICAgIHZhciBwcm9wTmFtZSA9IHZhbHVlUHJvcE5hbWVzW2ldOworICAgIGlmIChwcm9wc1twcm9w TmFtZV0gPT0gbnVsbCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIHZhciBpc0FycmF5 ID0gQXJyYXkuaXNBcnJheShwcm9wc1twcm9wTmFtZV0pOworICAgIGlmIChwcm9wcy5tdWx0aXBs ZSAmJiAhaXNBcnJheSkgeworICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8g d2FybmluZyhmYWxzZSwgJ1RoZSBgJXNgIHByb3Agc3VwcGxpZWQgdG8gPHNlbGVjdD4gbXVzdCBi ZSBhbiBhcnJheSBpZiAnICsgJ2BtdWx0aXBsZWAgaXMgdHJ1ZS4lcycsIHByb3BOYW1lLCBnZXRE ZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0ob3duZXIpKSA6IHZvaWQgMDsKKyAgICB9IGVsc2UgaWYg KCFwcm9wcy5tdWx0aXBsZSAmJiBpc0FycmF5KSB7CisgICAgICAiZGV2ZWxvcG1lbnQiICE9PSAn cHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnVGhlIGAlc2AgcHJvcCBzdXBwbGllZCB0byA8 c2VsZWN0PiBtdXN0IGJlIGEgc2NhbGFyICcgKyAndmFsdWUgaWYgYG11bHRpcGxlYCBpcyBmYWxz ZS4lcycsIHByb3BOYW1lLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0ob3duZXIpKSA6IHZv aWQgMDsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBAcGFyYW0ge1JlYWN0RE9NQ29tcG9uZW50 fSBpbnN0CisgKiBAcGFyYW0ge2Jvb2xlYW59IG11bHRpcGxlCisgKiBAcGFyYW0geyp9IHByb3BW YWx1ZSBBIHN0cmluZ2FibGUgKHdpdGggYG11bHRpcGxlYCwgYSBsaXN0IG9mIHN0cmluZ2FibGVz KS4KKyAqIEBwcml2YXRlCisgKi8KK2Z1bmN0aW9uIHVwZGF0ZU9wdGlvbnMoaW5zdCwgbXVsdGlw bGUsIHByb3BWYWx1ZSkgeworICB2YXIgc2VsZWN0ZWRWYWx1ZSwgaTsKKyAgdmFyIG9wdGlvbnMg PSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KS5vcHRpb25z OworCisgIGlmIChtdWx0aXBsZSkgeworICAgIHNlbGVjdGVkVmFsdWUgPSB7fTsKKyAgICBmb3Ig KGkgPSAwOyBpIDwgcHJvcFZhbHVlLmxlbmd0aDsgaSsrKSB7CisgICAgICBzZWxlY3RlZFZhbHVl WycnICsgcHJvcFZhbHVlW2ldXSA9IHRydWU7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBv cHRpb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICB2YXIgc2VsZWN0ZWQgPSBzZWxlY3RlZFZhbHVl Lmhhc093blByb3BlcnR5KG9wdGlvbnNbaV0udmFsdWUpOworICAgICAgaWYgKG9wdGlvbnNbaV0u c2VsZWN0ZWQgIT09IHNlbGVjdGVkKSB7CisgICAgICAgIG9wdGlvbnNbaV0uc2VsZWN0ZWQgPSBz ZWxlY3RlZDsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gRG8gbm90IHNldCBg c2VsZWN0LnZhbHVlYCBhcyBleGFjdCBiZWhhdmlvciBpc24ndCBjb25zaXN0ZW50IGFjcm9zcyBh bGwKKyAgICAvLyBicm93c2VycyBmb3IgYWxsIGNhc2VzLgorICAgIHNlbGVjdGVkVmFsdWUgPSAn JyArIHByb3BWYWx1ZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5sZW5ndGg7IGkrKykg eworICAgICAgaWYgKG9wdGlvbnNbaV0udmFsdWUgPT09IHNlbGVjdGVkVmFsdWUpIHsKKyAgICAg ICAgb3B0aW9uc1tpXS5zZWxlY3RlZCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0K KyAgICB9CisgICAgaWYgKG9wdGlvbnMubGVuZ3RoKSB7CisgICAgICBvcHRpb25zWzBdLnNlbGVj dGVkID0gdHJ1ZTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBJbXBsZW1lbnRzIGEgPHNlbGVj dD4gaG9zdCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgb3B0aW9uYWxseSBzZXR0aW5nIHRoZQorICog cHJvcHMgYHZhbHVlYCBhbmQgYGRlZmF1bHRWYWx1ZWAuIElmIGBtdWx0aXBsZWAgaXMgZmFsc2Us IHRoZSBwcm9wIG11c3QgYmUgYQorICogc3RyaW5nYWJsZS4gSWYgYG11bHRpcGxlYCBpcyB0cnVl LCB0aGUgcHJvcCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ2FibGVzLgorICoKKyAqIElmIGB2 YWx1ZWAgaXMgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9ucyB0 aGF0IGNoYW5nZSB0aGUKKyAqIHNlbGVjdGVkIG9wdGlvbiB3aWxsIHRyaWdnZXIgdXBkYXRlcyB0 byB0aGUgcmVuZGVyZWQgb3B0aW9ucy4KKyAqCisgKiBJZiBpdCBpcyBzdXBwbGllZCAoYW5kIG5v dCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBvcHRpb25zIHdpbGwgbm90CisgKiB1cGRh dGUgaW4gcmVzcG9uc2UgdG8gdXNlciBhY3Rpb25zLiBJbnN0ZWFkLCB0aGUgYHZhbHVlYCBwcm9w IG11c3QgY2hhbmdlIGluCisgKiBvcmRlciBmb3IgdGhlIHJlbmRlcmVkIG9wdGlvbnMgdG8gdXBk YXRlLgorICoKKyAqIElmIGBkZWZhdWx0VmFsdWVgIGlzIHByb3ZpZGVkLCBhbnkgb3B0aW9ucyB3 aXRoIHRoZSBzdXBwbGllZCB2YWx1ZXMgd2lsbCBiZQorICogc2VsZWN0ZWQuCisgKi8KK3ZhciBS ZWFjdERPTVNlbGVjdCA9IHsKKyAgZ2V0SG9zdFByb3BzOiBmdW5jdGlvbiAoaW5zdCwgcHJvcHMp IHsKKyAgICByZXR1cm4gX2Fzc2lnbih7fSwgcHJvcHMsIHsKKyAgICAgIG9uQ2hhbmdlOiBpbnN0 Ll93cmFwcGVyU3RhdGUub25DaGFuZ2UsCisgICAgICB2YWx1ZTogdW5kZWZpbmVkCisgICAgfSk7 CisgIH0sCisKKyAgbW91bnRXcmFwcGVyOiBmdW5jdGlvbiAoaW5zdCwgcHJvcHMpIHsKKyAgICBp ZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICBjaGVja1NlbGVjdFBy b3BUeXBlcyhpbnN0LCBwcm9wcyk7CisgICAgfQorCisgICAgdmFyIHZhbHVlID0gTGlua2VkVmFs dWVVdGlscy5nZXRWYWx1ZShwcm9wcyk7CisgICAgaW5zdC5fd3JhcHBlclN0YXRlID0geworICAg ICAgcGVuZGluZ1VwZGF0ZTogZmFsc2UsCisgICAgICBpbml0aWFsVmFsdWU6IHZhbHVlICE9IG51 bGwgPyB2YWx1ZSA6IHByb3BzLmRlZmF1bHRWYWx1ZSwKKyAgICAgIGxpc3RlbmVyczogbnVsbCwK KyAgICAgIG9uQ2hhbmdlOiBfaGFuZGxlQ2hhbmdlLmJpbmQoaW5zdCksCisgICAgICB3YXNNdWx0 aXBsZTogQm9vbGVhbihwcm9wcy5tdWx0aXBsZSkKKyAgICB9OworCisgICAgaWYgKHByb3BzLnZh bHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYg IWRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSkgeworICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3By b2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1NlbGVjdCBlbGVtZW50cyBtdXN0IGJlIGVpdGhl ciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFs dWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERl Y2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgc2VsZWN0ICcg KyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsg J2h0dHBzOi8vZmIubWUvcmVhY3QtY29udHJvbGxlZC1jb21wb25lbnRzJykgOiB2b2lkIDA7Cisg ICAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgPSB0cnVlOworICAgIH0KKyAgfSwKKworICBn ZXRTZWxlY3RWYWx1ZUNvbnRleHQ6IGZ1bmN0aW9uIChpbnN0KSB7CisgICAgLy8gUmVhY3RET01P cHRpb24gbG9va3MgYXQgdGhpcyBpbml0aWFsIHZhbHVlIHNvIHRoZSBpbml0aWFsIGdlbmVyYXRl ZAorICAgIC8vIG1hcmt1cCBoYXMgY29ycmVjdCBgc2VsZWN0ZWRgIGF0dHJpYnV0ZXMKKyAgICBy ZXR1cm4gaW5zdC5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZTsKKyAgfSwKKworICBwb3N0VXBk YXRlV3JhcHBlcjogZnVuY3Rpb24gKGluc3QpIHsKKyAgICB2YXIgcHJvcHMgPSBpbnN0Ll9jdXJy ZW50RWxlbWVudC5wcm9wczsKKworICAgIC8vIEFmdGVyIHRoZSBpbml0aWFsIG1vdW50LCB3ZSBj b250cm9sIHNlbGVjdGVkLW5lc3MgbWFudWFsbHkgc28gZG9uJ3QgcGFzcworICAgIC8vIHRoaXMg dmFsdWUgZG93bgorICAgIGluc3QuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUgPSB1bmRlZmlu ZWQ7CisKKyAgICB2YXIgd2FzTXVsdGlwbGUgPSBpbnN0Ll93cmFwcGVyU3RhdGUud2FzTXVsdGlw bGU7CisgICAgaW5zdC5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlID0gQm9vbGVhbihwcm9wcy5t dWx0aXBsZSk7CisKKyAgICB2YXIgdmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmdldFZhbHVlKHBy b3BzKTsKKyAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgaW5zdC5fd3JhcHBlclN0YXRl LnBlbmRpbmdVcGRhdGUgPSBmYWxzZTsKKyAgICAgIHVwZGF0ZU9wdGlvbnMoaW5zdCwgQm9vbGVh bihwcm9wcy5tdWx0aXBsZSksIHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKHdhc011bHRpcGxlICE9 PSBCb29sZWFuKHByb3BzLm11bHRpcGxlKSkgeworICAgICAgLy8gRm9yIHNpbXBsaWNpdHksIHJl YXBwbHkgYGRlZmF1bHRWYWx1ZWAgaWYgYG11bHRpcGxlYCBpcyB0b2dnbGVkLgorICAgICAgaWYg KHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgIHVwZGF0ZU9wdGlvbnMoaW5z dCwgQm9vbGVhbihwcm9wcy5tdWx0aXBsZSksIHByb3BzLmRlZmF1bHRWYWx1ZSk7CisgICAgICB9 IGVsc2UgeworICAgICAgICAvLyBSZXZlcnQgdGhlIHNlbGVjdCBiYWNrIHRvIGl0cyBkZWZhdWx0 IHVuc2VsZWN0ZWQgc3RhdGUuCisgICAgICAgIHVwZGF0ZU9wdGlvbnMoaW5zdCwgQm9vbGVhbihw cm9wcy5tdWx0aXBsZSksIHByb3BzLm11bHRpcGxlID8gW10gOiAnJyk7CisgICAgICB9CisgICAg fQorICB9Cit9OworCitmdW5jdGlvbiBfaGFuZGxlQ2hhbmdlKGV2ZW50KSB7CisgIHZhciBwcm9w cyA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzOworICB2YXIgcmV0dXJuVmFsdWUgPSBMaW5r ZWRWYWx1ZVV0aWxzLmV4ZWN1dGVPbkNoYW5nZShwcm9wcywgZXZlbnQpOworCisgIGlmICh0aGlz Ll9yb290Tm9kZUlEKSB7CisgICAgdGhpcy5fd3JhcHBlclN0YXRlLnBlbmRpbmdVcGRhdGUgPSB0 cnVlOworICB9CisgIFJlYWN0VXBkYXRlcy5hc2FwKHVwZGF0ZU9wdGlvbnNJZlBlbmRpbmdVcGRh dGVBbmRNb3VudGVkLCB0aGlzKTsKKyAgcmV0dXJuIHJldHVyblZhbHVlOworfQorCittb2R1bGUu ZXhwb3J0cyA9IFJlYWN0RE9NU2VsZWN0OworfSx7IjE0NyI6MTQ3LCIxNDgiOjE0OCwiMjMiOjIz LCIzMiI6MzIsIjc1Ijo3NX1dLDM5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsK Ky8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCBy aWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRl ciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4g dGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3Jh bnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUg aW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBF eGVjdXRpb25FbnZpcm9ubWVudCA9IF9kZXJlcV8oMTI2KTsKKwordmFyIGdldE5vZGVGb3JDaGFy YWN0ZXJPZmZzZXQgPSBfZGVyZXFfKDEwOSk7Cit2YXIgZ2V0VGV4dENvbnRlbnRBY2Nlc3NvciA9 IF9kZXJlcV8oMTEwKTsKKworLyoqCisgKiBXaGlsZSBgaXNDb2xsYXBzZWRgIGlzIGF2YWlsYWJs ZSBvbiB0aGUgU2VsZWN0aW9uIG9iamVjdCBhbmQgYGNvbGxhcHNlZGAKKyAqIGlzIGF2YWlsYWJs ZSBvbiB0aGUgUmFuZ2Ugb2JqZWN0LCBJRTExIHNvbWV0aW1lcyBnZXRzIHRoZW0gd3JvbmcuCisg KiBJZiB0aGUgYW5jaG9yL2ZvY3VzIG5vZGVzIGFuZCBvZmZzZXRzIGFyZSB0aGUgc2FtZSwgdGhl IHJhbmdlIGlzIGNvbGxhcHNlZC4KKyAqLworZnVuY3Rpb24gaXNDb2xsYXBzZWQoYW5jaG9yTm9k ZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KSB7CisgIHJldHVybiBhbmNo b3JOb2RlID09PSBmb2N1c05vZGUgJiYgYW5jaG9yT2Zmc2V0ID09PSBmb2N1c09mZnNldDsKK30K KworLyoqCisgKiBHZXQgdGhlIGFwcHJvcHJpYXRlIGFuY2hvciBhbmQgZm9jdXMgbm9kZS9vZmZz ZXQgcGFpcnMgZm9yIElFLgorICoKKyAqIFRoZSBjYXRjaCBoZXJlIGlzIHRoYXQgSUUncyBzZWxl Y3Rpb24gQVBJIGRvZXNuJ3QgcHJvdmlkZSBpbmZvcm1hdGlvbgorICogYWJvdXQgd2hldGhlciB0 aGUgc2VsZWN0aW9uIGlzIGZvcndhcmQgb3IgYmFja3dhcmQsIHNvIHdlIGhhdmUgdG8KKyAqIGJl aGF2ZSBhcyB0aG91Z2ggaXQncyBhbHdheXMgZm9yd2FyZC4KKyAqCisgKiBJRSB0ZXh0IGRpZmZl cnMgZnJvbSBtb2Rlcm4gc2VsZWN0aW9uIGluIHRoYXQgaXQgYmVoYXZlcyBhcyB0aG91Z2gKKyAq IGJsb2NrIGVsZW1lbnRzIGVuZCB3aXRoIGEgbmV3IGxpbmUuIFRoaXMgbWVhbnMgY2hhcmFjdGVy IG9mZnNldHMgd2lsbAorICogZGlmZmVyIGJldHdlZW4gdGhlIHR3byBBUElzLgorICoKKyAqIEBw YXJhbSB7RE9NRWxlbWVudH0gbm9kZQorICogQHJldHVybiB7b2JqZWN0fQorICovCitmdW5jdGlv biBnZXRJRU9mZnNldHMobm9kZSkgeworICB2YXIgc2VsZWN0aW9uID0gZG9jdW1lbnQuc2VsZWN0 aW9uOworICB2YXIgc2VsZWN0ZWRSYW5nZSA9IHNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOworICB2 YXIgc2VsZWN0ZWRMZW5ndGggPSBzZWxlY3RlZFJhbmdlLnRleHQubGVuZ3RoOworCisgIC8vIER1 cGxpY2F0ZSBzZWxlY3Rpb24gc28gd2UgY2FuIG1vdmUgcmFuZ2Ugd2l0aG91dCBicmVha2luZyB1 c2VyIHNlbGVjdGlvbi4KKyAgdmFyIGZyb21TdGFydCA9IHNlbGVjdGVkUmFuZ2UuZHVwbGljYXRl KCk7CisgIGZyb21TdGFydC5tb3ZlVG9FbGVtZW50VGV4dChub2RlKTsKKyAgZnJvbVN0YXJ0LnNl dEVuZFBvaW50KCdFbmRUb1N0YXJ0Jywgc2VsZWN0ZWRSYW5nZSk7CisKKyAgdmFyIHN0YXJ0T2Zm c2V0ID0gZnJvbVN0YXJ0LnRleHQubGVuZ3RoOworICB2YXIgZW5kT2Zmc2V0ID0gc3RhcnRPZmZz ZXQgKyBzZWxlY3RlZExlbmd0aDsKKworICByZXR1cm4geworICAgIHN0YXJ0OiBzdGFydE9mZnNl dCwKKyAgICBlbmQ6IGVuZE9mZnNldAorICB9OworfQorCisvKioKKyAqIEBwYXJhbSB7RE9NRWxl bWVudH0gbm9kZQorICogQHJldHVybiB7P29iamVjdH0KKyAqLworZnVuY3Rpb24gZ2V0TW9kZXJu T2Zmc2V0cyhub2RlKSB7CisgIHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uICYm IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKKworICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24u cmFuZ2VDb3VudCA9PT0gMCkgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAgdmFyIGFuY2hv ck5vZGUgPSBzZWxlY3Rpb24uYW5jaG9yTm9kZTsKKyAgdmFyIGFuY2hvck9mZnNldCA9IHNlbGVj dGlvbi5hbmNob3JPZmZzZXQ7CisgIHZhciBmb2N1c05vZGUgPSBzZWxlY3Rpb24uZm9jdXNOb2Rl OworICB2YXIgZm9jdXNPZmZzZXQgPSBzZWxlY3Rpb24uZm9jdXNPZmZzZXQ7CisKKyAgdmFyIGN1 cnJlbnRSYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApOworCisgIC8vIEluIEZpcmVmb3gs IHJhbmdlLnN0YXJ0Q29udGFpbmVyIGFuZCByYW5nZS5lbmRDb250YWluZXIgY2FuIGJlICJhbm9u eW1vdXMKKyAgLy8gZGl2cyIsIGUuZy4gdGhlIHVwL2Rvd24gYnV0dG9ucyBvbiBhbiA8aW5wdXQg dHlwZT0ibnVtYmVyIj4uIEFub255bW91cworICAvLyBkaXZzIGRvIG5vdCBzZWVtIHRvIGV4cG9z ZSBwcm9wZXJ0aWVzLCB0cmlnZ2VyaW5nIGEgIlBlcm1pc3Npb24gZGVuaWVkCisgIC8vIGVycm9y IiBpZiBhbnkgb2YgaXRzIHByb3BlcnRpZXMgYXJlIGFjY2Vzc2VkLiBUaGUgb25seSBzZWVtaW5n bHkgcG9zc2libGUKKyAgLy8gd2F5IHRvIGF2b2lkIGVycm9yaW5nIGlzIHRvIGFjY2VzcyBhIHBy b3BlcnR5IHRoYXQgdHlwaWNhbGx5IHdvcmtzIGZvcgorICAvLyBub24tYW5vbnltb3VzIGRpdnMg YW5kIGNhdGNoIGFueSBlcnJvciB0aGF0IG1heSBvdGhlcndpc2UgYXJpc2UuIFNlZQorICAvLyBo dHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDg0MjcKKyAgdHJ5 IHsKKyAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtZXhwcmVzc2lvbnMgKi8KKyAgICBj dXJyZW50UmFuZ2Uuc3RhcnRDb250YWluZXIubm9kZVR5cGU7CisgICAgY3VycmVudFJhbmdlLmVu ZENvbnRhaW5lci5ub2RlVHlwZTsKKyAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC1leHBy ZXNzaW9ucyAqLworICB9IGNhdGNoIChlKSB7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAv LyBJZiB0aGUgbm9kZSBhbmQgb2Zmc2V0IHZhbHVlcyBhcmUgdGhlIHNhbWUsIHRoZSBzZWxlY3Rp b24gaXMgY29sbGFwc2VkLgorICAvLyBgU2VsZWN0aW9uLmlzQ29sbGFwc2VkYCBpcyBhdmFpbGFi bGUgbmF0aXZlbHksIGJ1dCBJRSBzb21ldGltZXMgZ2V0cworICAvLyB0aGlzIHZhbHVlIHdyb25n LgorICB2YXIgaXNTZWxlY3Rpb25Db2xsYXBzZWQgPSBpc0NvbGxhcHNlZChzZWxlY3Rpb24uYW5j aG9yTm9kZSwgc2VsZWN0aW9uLmFuY2hvck9mZnNldCwgc2VsZWN0aW9uLmZvY3VzTm9kZSwgc2Vs ZWN0aW9uLmZvY3VzT2Zmc2V0KTsKKworICB2YXIgcmFuZ2VMZW5ndGggPSBpc1NlbGVjdGlvbkNv bGxhcHNlZCA/IDAgOiBjdXJyZW50UmFuZ2UudG9TdHJpbmcoKS5sZW5ndGg7CisKKyAgdmFyIHRl bXBSYW5nZSA9IGN1cnJlbnRSYW5nZS5jbG9uZVJhbmdlKCk7CisgIHRlbXBSYW5nZS5zZWxlY3RO b2RlQ29udGVudHMobm9kZSk7CisgIHRlbXBSYW5nZS5zZXRFbmQoY3VycmVudFJhbmdlLnN0YXJ0 Q29udGFpbmVyLCBjdXJyZW50UmFuZ2Uuc3RhcnRPZmZzZXQpOworCisgIHZhciBpc1RlbXBSYW5n ZUNvbGxhcHNlZCA9IGlzQ29sbGFwc2VkKHRlbXBSYW5nZS5zdGFydENvbnRhaW5lciwgdGVtcFJh bmdlLnN0YXJ0T2Zmc2V0LCB0ZW1wUmFuZ2UuZW5kQ29udGFpbmVyLCB0ZW1wUmFuZ2UuZW5kT2Zm c2V0KTsKKworICB2YXIgc3RhcnQgPSBpc1RlbXBSYW5nZUNvbGxhcHNlZCA/IDAgOiB0ZW1wUmFu Z2UudG9TdHJpbmcoKS5sZW5ndGg7CisgIHZhciBlbmQgPSBzdGFydCArIHJhbmdlTGVuZ3RoOwor CisgIC8vIERldGVjdCB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gaXMgYmFja3dhcmQuCisgIHZhciBk ZXRlY3Rpb25SYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CisgIGRldGVjdGlvblJhbmdl LnNldFN0YXJ0KGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCk7CisgIGRldGVjdGlvblJhbmdlLnNl dEVuZChmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KTsKKyAgdmFyIGlzQmFja3dhcmQgPSBkZXRlY3Rp b25SYW5nZS5jb2xsYXBzZWQ7CisKKyAgcmV0dXJuIHsKKyAgICBzdGFydDogaXNCYWNrd2FyZCA/ IGVuZCA6IHN0YXJ0LAorICAgIGVuZDogaXNCYWNrd2FyZCA/IHN0YXJ0IDogZW5kCisgIH07Cit9 CisKKy8qKgorICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlCisgKiBAcGFy YW0ge29iamVjdH0gb2Zmc2V0cworICovCitmdW5jdGlvbiBzZXRJRU9mZnNldHMobm9kZSwgb2Zm c2V0cykgeworICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKS5k dXBsaWNhdGUoKTsKKyAgdmFyIHN0YXJ0LCBlbmQ7CisKKyAgaWYgKG9mZnNldHMuZW5kID09PSB1 bmRlZmluZWQpIHsKKyAgICBzdGFydCA9IG9mZnNldHMuc3RhcnQ7CisgICAgZW5kID0gc3RhcnQ7 CisgIH0gZWxzZSBpZiAob2Zmc2V0cy5zdGFydCA+IG9mZnNldHMuZW5kKSB7CisgICAgc3RhcnQg PSBvZmZzZXRzLmVuZDsKKyAgICBlbmQgPSBvZmZzZXRzLnN0YXJ0OworICB9IGVsc2UgeworICAg IHN0YXJ0ID0gb2Zmc2V0cy5zdGFydDsKKyAgICBlbmQgPSBvZmZzZXRzLmVuZDsKKyAgfQorCisg IHJhbmdlLm1vdmVUb0VsZW1lbnRUZXh0KG5vZGUpOworICByYW5nZS5tb3ZlU3RhcnQoJ2NoYXJh Y3RlcicsIHN0YXJ0KTsKKyAgcmFuZ2Uuc2V0RW5kUG9pbnQoJ0VuZFRvU3RhcnQnLCByYW5nZSk7 CisgIHJhbmdlLm1vdmVFbmQoJ2NoYXJhY3RlcicsIGVuZCAtIHN0YXJ0KTsKKyAgcmFuZ2Uuc2Vs ZWN0KCk7Cit9CisKKy8qKgorICogSW4gbW9kZXJuIG5vbi1JRSBicm93c2Vycywgd2UgY2FuIHN1 cHBvcnQgYm90aCBmb3J3YXJkIGFuZCBiYWNrd2FyZAorICogc2VsZWN0aW9ucy4KKyAqCisgKiBO b3RlOiBJRTEwKyBzdXBwb3J0cyB0aGUgU2VsZWN0aW9uIG9iamVjdCwgYnV0IGl0IGRvZXMgbm90 IHN1cHBvcnQKKyAqIHRoZSBgZXh0ZW5kYCBtZXRob2QsIHdoaWNoIG1lYW5zIHRoYXQgZXZlbiBp biBtb2Rlcm4gSUUsIGl0J3Mgbm90IHBvc3NpYmxlCisgKiB0byBwcm9ncmFtbWF0aWNhbGx5IGNy ZWF0ZSBhIGJhY2t3YXJkIHNlbGVjdGlvbi4gVGh1cywgZm9yIGFsbCBJRQorICogdmVyc2lvbnMs IHdlIHVzZSB0aGUgb2xkIElFIEFQSSB0byBjcmVhdGUgb3VyIHNlbGVjdGlvbnMuCisgKgorICog QHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlCisgKiBAcGFyYW0ge29iamVjdH0g b2Zmc2V0cworICovCitmdW5jdGlvbiBzZXRNb2Rlcm5PZmZzZXRzKG5vZGUsIG9mZnNldHMpIHsK KyAgaWYgKCF3aW5kb3cuZ2V0U2VsZWN0aW9uKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgdmFy IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKKyAgdmFyIGxlbmd0aCA9IG5vZGVb Z2V0VGV4dENvbnRlbnRBY2Nlc3NvcigpXS5sZW5ndGg7CisgIHZhciBzdGFydCA9IE1hdGgubWlu KG9mZnNldHMuc3RhcnQsIGxlbmd0aCk7CisgIHZhciBlbmQgPSBvZmZzZXRzLmVuZCA9PT0gdW5k ZWZpbmVkID8gc3RhcnQgOiBNYXRoLm1pbihvZmZzZXRzLmVuZCwgbGVuZ3RoKTsKKworICAvLyBJ RSAxMSB1c2VzIG1vZGVybiBzZWxlY3Rpb24sIGJ1dCBkb2Vzbid0IHN1cHBvcnQgdGhlIGV4dGVu ZCBtZXRob2QuCisgIC8vIEZsaXAgYmFja3dhcmQgc2VsZWN0aW9ucywgc28gd2UgY2FuIHNldCB3 aXRoIGEgc2luZ2xlIHJhbmdlLgorICBpZiAoIXNlbGVjdGlvbi5leHRlbmQgJiYgc3RhcnQgPiBl bmQpIHsKKyAgICB2YXIgdGVtcCA9IGVuZDsKKyAgICBlbmQgPSBzdGFydDsKKyAgICBzdGFydCA9 IHRlbXA7CisgIH0KKworICB2YXIgc3RhcnRNYXJrZXIgPSBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zm c2V0KG5vZGUsIHN0YXJ0KTsKKyAgdmFyIGVuZE1hcmtlciA9IGdldE5vZGVGb3JDaGFyYWN0ZXJP ZmZzZXQobm9kZSwgZW5kKTsKKworICBpZiAoc3RhcnRNYXJrZXIgJiYgZW5kTWFya2VyKSB7Cisg ICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKKyAgICByYW5nZS5zZXRTdGFy dChzdGFydE1hcmtlci5ub2RlLCBzdGFydE1hcmtlci5vZmZzZXQpOworICAgIHNlbGVjdGlvbi5y ZW1vdmVBbGxSYW5nZXMoKTsKKworICAgIGlmIChzdGFydCA+IGVuZCkgeworICAgICAgc2VsZWN0 aW9uLmFkZFJhbmdlKHJhbmdlKTsKKyAgICAgIHNlbGVjdGlvbi5leHRlbmQoZW5kTWFya2VyLm5v ZGUsIGVuZE1hcmtlci5vZmZzZXQpOworICAgIH0gZWxzZSB7CisgICAgICByYW5nZS5zZXRFbmQo ZW5kTWFya2VyLm5vZGUsIGVuZE1hcmtlci5vZmZzZXQpOworICAgICAgc2VsZWN0aW9uLmFkZFJh bmdlKHJhbmdlKTsKKyAgICB9CisgIH0KK30KKwordmFyIHVzZUlFT2Zmc2V0cyA9IEV4ZWN1dGlv bkVudmlyb25tZW50LmNhblVzZURPTSAmJiAnc2VsZWN0aW9uJyBpbiBkb2N1bWVudCAmJiAhKCdn ZXRTZWxlY3Rpb24nIGluIHdpbmRvdyk7CisKK3ZhciBSZWFjdERPTVNlbGVjdGlvbiA9IHsKKyAg LyoqCisgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZQorICAgKi8KKyAgZ2V0T2Zmc2V0czog dXNlSUVPZmZzZXRzID8gZ2V0SUVPZmZzZXRzIDogZ2V0TW9kZXJuT2Zmc2V0cywKKworICAvKioK KyAgICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlCisgICAqIEBwYXJhbSB7 b2JqZWN0fSBvZmZzZXRzCisgICAqLworICBzZXRPZmZzZXRzOiB1c2VJRU9mZnNldHMgPyBzZXRJ RU9mZnNldHMgOiBzZXRNb2Rlcm5PZmZzZXRzCit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0 RE9NU2VsZWN0aW9uOworfSx7IjEwOSI6MTA5LCIxMTAiOjExMCwiMTI2IjoxMjZ9XSw0MDpbZnVu Y3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXBy ZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRo aXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZv dW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlz IHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNh biBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAq CisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgUmVhY3REZWZhdWx0SW5qZWN0aW9uID0gX2Rl cmVxXyg0Nyk7Cit2YXIgUmVhY3RTZXJ2ZXJSZW5kZXJpbmcgPSBfZGVyZXFfKDcxKTsKK3ZhciBS ZWFjdFZlcnNpb24gPSBfZGVyZXFfKDc2KTsKKworUmVhY3REZWZhdWx0SW5qZWN0aW9uLmluamVj dCgpOworCit2YXIgUmVhY3RET01TZXJ2ZXIgPSB7CisgIHJlbmRlclRvU3RyaW5nOiBSZWFjdFNl cnZlclJlbmRlcmluZy5yZW5kZXJUb1N0cmluZywKKyAgcmVuZGVyVG9TdGF0aWNNYXJrdXA6IFJl YWN0U2VydmVyUmVuZGVyaW5nLnJlbmRlclRvU3RhdGljTWFya3VwLAorICB2ZXJzaW9uOiBSZWFj dFZlcnNpb24KK307CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RET01TZXJ2ZXI7Cit9LHsiNDci OjQ3LCI3MSI6NzEsIjc2Ijo3Nn1dLDQxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRz KXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFs bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1 bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUg aW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwg Z3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZp bGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3Zh ciBSZWFjdERPTVNlcnZlciA9IF9kZXJlcV8oNDApOworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0 RE9NU2VydmVyOworfSx7IjQwIjo0MH1dLDQyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBv cnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAq IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNl ZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZp bGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9u YWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRT IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisK K3ZhciBfcHJvZEludmFyaWFudCA9IF9kZXJlcV8oMTE2KSwKKyAgICBfYXNzaWduID0gX2RlcmVx XygxNDgpOworCit2YXIgRE9NQ2hpbGRyZW5PcGVyYXRpb25zID0gX2RlcmVxXyg4KTsKK3ZhciBE T01MYXp5VHJlZSA9IF9kZXJlcV8oOSk7Cit2YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gX2Rl cmVxXygzMik7CisKK3ZhciBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIgPSBfZGVyZXFfKDEw MCk7Cit2YXIgaW52YXJpYW50ID0gX2RlcmVxXygxNDApOwordmFyIHZhbGlkYXRlRE9NTmVzdGlu ZyA9IF9kZXJlcV8oMTIxKTsKKworLyoqCisgKiBUZXh0IG5vZGVzIHZpb2xhdGUgYSBjb3VwbGUg YXNzdW1wdGlvbnMgdGhhdCBSZWFjdCBtYWtlcyBhYm91dCBjb21wb25lbnRzOgorICoKKyAqICAt IFdoZW4gbW91bnRpbmcgdGV4dCBpbnRvIHRoZSBET00sIGFkamFjZW50IHRleHQgbm9kZXMgYXJl IG1lcmdlZC4KKyAqICAtIFRleHQgbm9kZXMgY2Fubm90IGJlIGFzc2lnbmVkIGEgUmVhY3Qgcm9v dCBJRC4KKyAqCisgKiBUaGlzIGNvbXBvbmVudCBpcyB1c2VkIHRvIHdyYXAgc3RyaW5ncyBiZXR3 ZWVuIGNvbW1lbnQgbm9kZXMgc28gdGhhdCB0aGV5CisgKiBjYW4gdW5kZXJnbyB0aGUgc2FtZSBy ZWNvbmNpbGlhdGlvbiB0aGF0IGlzIGFwcGxpZWQgdG8gZWxlbWVudHMuCisgKgorICogVE9ETzog SW52ZXN0aWdhdGUgcmVwcmVzZW50aW5nIFJlYWN0IGNvbXBvbmVudHMgaW4gdGhlIERPTSB3aXRo IHRleHQgbm9kZXMuCisgKgorICogQGNsYXNzIFJlYWN0RE9NVGV4dENvbXBvbmVudAorICogQGV4 dGVuZHMgUmVhY3RDb21wb25lbnQKKyAqIEBpbnRlcm5hbAorICovCit2YXIgUmVhY3RET01UZXh0 Q29tcG9uZW50ID0gZnVuY3Rpb24gKHRleHQpIHsKKyAgLy8gVE9ETzogVGhpcyBpcyByZWFsbHkg YSBSZWFjdFRleHQgKFJlYWN0Tm9kZSksIG5vdCBhIFJlYWN0RWxlbWVudAorICB0aGlzLl9jdXJy ZW50RWxlbWVudCA9IHRleHQ7CisgIHRoaXMuX3N0cmluZ1RleHQgPSAnJyArIHRleHQ7CisgIC8v IFJlYWN0RE9NQ29tcG9uZW50VHJlZSB1c2VzIHRoZXNlOgorICB0aGlzLl9ob3N0Tm9kZSA9IG51 bGw7CisgIHRoaXMuX2hvc3RQYXJlbnQgPSBudWxsOworCisgIC8vIFByb3BlcnRpZXMKKyAgdGhp cy5fZG9tSUQgPSAwOworICB0aGlzLl9tb3VudEluZGV4ID0gMDsKKyAgdGhpcy5fY2xvc2luZ0Nv bW1lbnQgPSBudWxsOworICB0aGlzLl9jb21tZW50Tm9kZXMgPSBudWxsOworfTsKKworX2Fzc2ln bihSZWFjdERPTVRleHRDb21wb25lbnQucHJvdG90eXBlLCB7CisKKyAgLyoqCisgICAqIENyZWF0 ZXMgdGhlIG1hcmt1cCBmb3IgdGhpcyB0ZXh0IG5vZGUuIFRoaXMgbm9kZSBpcyBub3QgaW50ZW5k ZWQgdG8gaGF2ZQorICAgKiBhbnkgZmVhdHVyZXMgYmVzaWRlcyBjb250YWluaW5nIHRleHQgY29u dGVudC4KKyAgICoKKyAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufFJlYWN0 U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uCisgICAqIEByZXR1cm4ge3N0 cmluZ30gTWFya3VwIGZvciB0aGlzIHRleHQgbm9kZS4KKyAgICogQGludGVybmFsCisgICAqLwor ICBtb3VudENvbXBvbmVudDogZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBob3N0UGFyZW50LCBob3N0 Q29udGFpbmVySW5mbywgY29udGV4dCkgeworICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJv ZHVjdGlvbicpIHsKKyAgICAgIHZhciBwYXJlbnRJbmZvOworICAgICAgaWYgKGhvc3RQYXJlbnQg IT0gbnVsbCkgeworICAgICAgICBwYXJlbnRJbmZvID0gaG9zdFBhcmVudC5fYW5jZXN0b3JJbmZv OworICAgICAgfSBlbHNlIGlmIChob3N0Q29udGFpbmVySW5mbyAhPSBudWxsKSB7CisgICAgICAg IHBhcmVudEluZm8gPSBob3N0Q29udGFpbmVySW5mby5fYW5jZXN0b3JJbmZvOworICAgICAgfQor ICAgICAgaWYgKHBhcmVudEluZm8pIHsKKyAgICAgICAgLy8gcGFyZW50SW5mbyBzaG91bGQgYWx3 YXlzIGJlIHByZXNlbnQgZXhjZXB0IGZvciB0aGUgdG9wLWxldmVsCisgICAgICAgIC8vIGNvbXBv bmVudCB3aGVuIHNlcnZlciByZW5kZXJpbmcKKyAgICAgICAgdmFsaWRhdGVET01OZXN0aW5nKG51 bGwsIHRoaXMuX3N0cmluZ1RleHQsIHRoaXMsIHBhcmVudEluZm8pOworICAgICAgfQorICAgIH0K KworICAgIHZhciBkb21JRCA9IGhvc3RDb250YWluZXJJbmZvLl9pZENvdW50ZXIrKzsKKyAgICB2 YXIgb3BlbmluZ1ZhbHVlID0gJyByZWFjdC10ZXh0OiAnICsgZG9tSUQgKyAnICc7CisgICAgdmFy IGNsb3NpbmdWYWx1ZSA9ICcgL3JlYWN0LXRleHQgJzsKKyAgICB0aGlzLl9kb21JRCA9IGRvbUlE OworICAgIHRoaXMuX2hvc3RQYXJlbnQgPSBob3N0UGFyZW50OworICAgIGlmICh0cmFuc2FjdGlv bi51c2VDcmVhdGVFbGVtZW50KSB7CisgICAgICB2YXIgb3duZXJEb2N1bWVudCA9IGhvc3RDb250 YWluZXJJbmZvLl9vd25lckRvY3VtZW50OworICAgICAgdmFyIG9wZW5pbmdDb21tZW50ID0gb3du ZXJEb2N1bWVudC5jcmVhdGVDb21tZW50KG9wZW5pbmdWYWx1ZSk7CisgICAgICB2YXIgY2xvc2lu Z0NvbW1lbnQgPSBvd25lckRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoY2xvc2luZ1ZhbHVlKTsKKyAg ICAgIHZhciBsYXp5VHJlZSA9IERPTUxhenlUcmVlKG93bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1l bnRGcmFnbWVudCgpKTsKKyAgICAgIERPTUxhenlUcmVlLnF1ZXVlQ2hpbGQobGF6eVRyZWUsIERP TUxhenlUcmVlKG9wZW5pbmdDb21tZW50KSk7CisgICAgICBpZiAodGhpcy5fc3RyaW5nVGV4dCkg eworICAgICAgICBET01MYXp5VHJlZS5xdWV1ZUNoaWxkKGxhenlUcmVlLCBET01MYXp5VHJlZShv d25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMuX3N0cmluZ1RleHQpKSk7CisgICAgICB9 CisgICAgICBET01MYXp5VHJlZS5xdWV1ZUNoaWxkKGxhenlUcmVlLCBET01MYXp5VHJlZShjbG9z aW5nQ29tbWVudCkpOworICAgICAgUmVhY3RET01Db21wb25lbnRUcmVlLnByZWNhY2hlTm9kZSh0 aGlzLCBvcGVuaW5nQ29tbWVudCk7CisgICAgICB0aGlzLl9jbG9zaW5nQ29tbWVudCA9IGNsb3Np bmdDb21tZW50OworICAgICAgcmV0dXJuIGxhenlUcmVlOworICAgIH0gZWxzZSB7CisgICAgICB2 YXIgZXNjYXBlZFRleHQgPSBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIodGhpcy5fc3RyaW5n VGV4dCk7CisKKyAgICAgIGlmICh0cmFuc2FjdGlvbi5yZW5kZXJUb1N0YXRpY01hcmt1cCkgewor ICAgICAgICAvLyBOb3JtYWxseSB3ZSdkIHdyYXAgdGhpcyBiZXR3ZWVuIGNvbW1lbnQgbm9kZXMg Zm9yIHRoZSByZWFzb25zIHN0YXRlZAorICAgICAgICAvLyBhYm92ZSwgYnV0IHNpbmNlIHRoaXMg aXMgYSBzaXR1YXRpb24gd2hlcmUgUmVhY3Qgd29uJ3QgdGFrZSBvdmVyCisgICAgICAgIC8vIChz dGF0aWMgcGFnZXMpLCB3ZSBjYW4gc2ltcGx5IHJldHVybiB0aGUgdGV4dCBhcyBpdCBpcy4KKyAg ICAgICAgcmV0dXJuIGVzY2FwZWRUZXh0OworICAgICAgfQorCisgICAgICByZXR1cm4gJzwhLS0n ICsgb3BlbmluZ1ZhbHVlICsgJy0tPicgKyBlc2NhcGVkVGV4dCArICc8IS0tJyArIGNsb3NpbmdW YWx1ZSArICctLT4nOworICAgIH0KKyAgfSwKKworICAvKioKKyAgICogVXBkYXRlcyB0aGlzIGNv bXBvbmVudCBieSB1cGRhdGluZyB0aGUgdGV4dCBjb250ZW50LgorICAgKgorICAgKiBAcGFyYW0g e1JlYWN0VGV4dH0gbmV4dFRleHQgVGhlIG5leHQgdGV4dCBjb250ZW50CisgICAqIEBwYXJhbSB7 UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24KKyAgICogQGludGVybmFsCisg ICAqLworICByZWNlaXZlQ29tcG9uZW50OiBmdW5jdGlvbiAobmV4dFRleHQsIHRyYW5zYWN0aW9u KSB7CisgICAgaWYgKG5leHRUZXh0ICE9PSB0aGlzLl9jdXJyZW50RWxlbWVudCkgeworICAgICAg dGhpcy5fY3VycmVudEVsZW1lbnQgPSBuZXh0VGV4dDsKKyAgICAgIHZhciBuZXh0U3RyaW5nVGV4 dCA9ICcnICsgbmV4dFRleHQ7CisgICAgICBpZiAobmV4dFN0cmluZ1RleHQgIT09IHRoaXMuX3N0 cmluZ1RleHQpIHsKKyAgICAgICAgLy8gVE9ETzogU2F2ZSB0aGlzIGFzIHBlbmRpbmcgcHJvcHMg YW5kIHVzZSBwZXJmb3JtVXBkYXRlSWZOZWNlc3NhcnkKKyAgICAgICAgLy8gYW5kL29yIHVwZGF0 ZUNvbXBvbmVudCB0byBkbyB0aGUgYWN0dWFsIHVwZGF0ZSBmb3IgY29uc2lzdGVuY3kgd2l0aAor ICAgICAgICAvLyBvdGhlciBjb21wb25lbnQgdHlwZXM/CisgICAgICAgIHRoaXMuX3N0cmluZ1Rl eHQgPSBuZXh0U3RyaW5nVGV4dDsKKyAgICAgICAgdmFyIGNvbW1lbnROb2RlcyA9IHRoaXMuZ2V0 SG9zdE5vZGUoKTsKKyAgICAgICAgRE9NQ2hpbGRyZW5PcGVyYXRpb25zLnJlcGxhY2VEZWxpbWl0 ZWRUZXh0KGNvbW1lbnROb2Rlc1swXSwgY29tbWVudE5vZGVzWzFdLCBuZXh0U3RyaW5nVGV4dCk7 CisgICAgICB9CisgICAgfQorICB9LAorCisgIGdldEhvc3ROb2RlOiBmdW5jdGlvbiAoKSB7Cisg ICAgdmFyIGhvc3ROb2RlID0gdGhpcy5fY29tbWVudE5vZGVzOworICAgIGlmIChob3N0Tm9kZSkg eworICAgICAgcmV0dXJuIGhvc3ROb2RlOworICAgIH0KKyAgICBpZiAoIXRoaXMuX2Nsb3NpbmdD b21tZW50KSB7CisgICAgICB2YXIgb3BlbmluZ0NvbW1lbnQgPSBSZWFjdERPTUNvbXBvbmVudFRy ZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0aGlzKTsKKyAgICAgIHZhciBub2RlID0gb3BlbmluZ0Nv bW1lbnQubmV4dFNpYmxpbmc7CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAhKG5vZGUg IT0gbnVsbCkgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFs c2UsICdNaXNzaW5nIGNsb3NpbmcgY29tbWVudCBmb3IgdGV4dCBjb21wb25lbnQgJXMnLCB0aGlz Ll9kb21JRCkgOiBfcHJvZEludmFyaWFudCgnNjcnLCB0aGlzLl9kb21JRCkgOiB2b2lkIDA7Cisg ICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSA4ICYmIG5vZGUubm9kZVZhbHVlID09PSAnIC9y ZWFjdC10ZXh0ICcpIHsKKyAgICAgICAgICB0aGlzLl9jbG9zaW5nQ29tbWVudCA9IG5vZGU7Cisg ICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxp bmc7CisgICAgICB9CisgICAgfQorICAgIGhvc3ROb2RlID0gW3RoaXMuX2hvc3ROb2RlLCB0aGlz Ll9jbG9zaW5nQ29tbWVudF07CisgICAgdGhpcy5fY29tbWVudE5vZGVzID0gaG9zdE5vZGU7Cisg ICAgcmV0dXJuIGhvc3ROb2RlOworICB9LAorCisgIHVubW91bnRDb21wb25lbnQ6IGZ1bmN0aW9u ICgpIHsKKyAgICB0aGlzLl9jbG9zaW5nQ29tbWVudCA9IG51bGw7CisgICAgdGhpcy5fY29tbWVu dE5vZGVzID0gbnVsbDsKKyAgICBSZWFjdERPTUNvbXBvbmVudFRyZWUudW5jYWNoZU5vZGUodGhp cyk7CisgIH0KKworfSk7CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RET01UZXh0Q29tcG9uZW50 OworfSx7IjEwMCI6MTAwLCIxMTYiOjExNiwiMTIxIjoxMjEsIjE0MCI6MTQwLCIxNDgiOjE0OCwi MzIiOjMyLCI4Ijo4LCI5Ijo5fV0sNDM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMp eworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxs IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVu ZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBp biB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBn cmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmls ZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFy IF9wcm9kSW52YXJpYW50ID0gX2RlcmVxXygxMTYpLAorICAgIF9hc3NpZ24gPSBfZGVyZXFfKDE0 OCk7CisKK3ZhciBMaW5rZWRWYWx1ZVV0aWxzID0gX2RlcmVxXygyMyk7Cit2YXIgUmVhY3RET01D b21wb25lbnRUcmVlID0gX2RlcmVxXygzMik7Cit2YXIgUmVhY3RVcGRhdGVzID0gX2RlcmVxXyg3 NSk7CisKK3ZhciBpbnZhcmlhbnQgPSBfZGVyZXFfKDE0MCk7Cit2YXIgd2FybmluZyA9IF9kZXJl cV8oMTQ3KTsKKwordmFyIGRpZFdhcm5WYWx1ZUxpbmsgPSBmYWxzZTsKK3ZhciBkaWRXYXJuVmFs RGVmYXVsdFZhbCA9IGZhbHNlOworCitmdW5jdGlvbiBmb3JjZVVwZGF0ZUlmTW91bnRlZCgpIHsK KyAgaWYgKHRoaXMuX3Jvb3ROb2RlSUQpIHsKKyAgICAvLyBET00gY29tcG9uZW50IGlzIHN0aWxs IG1vdW50ZWQ7IHVwZGF0ZQorICAgIFJlYWN0RE9NVGV4dGFyZWEudXBkYXRlV3JhcHBlcih0aGlz KTsKKyAgfQorfQorCisvKioKKyAqIEltcGxlbWVudHMgYSA8dGV4dGFyZWE+IGhvc3QgY29tcG9u ZW50IHRoYXQgYWxsb3dzIHNldHRpbmcgYHZhbHVlYCwgYW5kCisgKiBgZGVmYXVsdFZhbHVlYC4g VGhpcyBkaWZmZXJzIGZyb20gdGhlIHRyYWRpdGlvbmFsIERPTSBBUEkgYmVjYXVzZSB2YWx1ZSBp cworICogdXN1YWxseSBzZXQgYXMgUENEQVRBIGNoaWxkcmVuLgorICoKKyAqIElmIGB2YWx1ZWAg aXMgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9ucyB0aGF0IGFm ZmVjdCB0aGUKKyAqIHZhbHVlIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50Lgor ICoKKyAqIElmIGB2YWx1ZWAgaXMgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0 aGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsCisgKiBub3QgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBl bGVtZW50LiBJbnN0ZWFkLCB0aGUgYHZhbHVlYCBwcm9wIG11c3QgY2hhbmdlIGluCisgKiBvcmRl ciBmb3IgdGhlIHJlbmRlcmVkIGVsZW1lbnQgdG8gYmUgdXBkYXRlZC4KKyAqCisgKiBUaGUgcmVu ZGVyZWQgZWxlbWVudCB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggYW4gZW1wdHkgdmFsdWUsIHRo ZSBwcm9wCisgKiBgZGVmYXVsdFZhbHVlYCBpZiBzcGVjaWZpZWQsIG9yIHRoZSBjaGlsZHJlbiBj b250ZW50IChkZXByZWNhdGVkKS4KKyAqLwordmFyIFJlYWN0RE9NVGV4dGFyZWEgPSB7CisgIGdl dEhvc3RQcm9wczogZnVuY3Rpb24gKGluc3QsIHByb3BzKSB7CisgICAgIShwcm9wcy5kYW5nZXJv dXNseVNldElubmVySFRNTCA9PSBudWxsKSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9u JyA/IGludmFyaWFudChmYWxzZSwgJ2BkYW5nZXJvdXNseVNldElubmVySFRNTGAgZG9lcyBub3Qg bWFrZSBzZW5zZSBvbiA8dGV4dGFyZWE+LicpIDogX3Byb2RJbnZhcmlhbnQoJzkxJykgOiB2b2lk IDA7CisKKyAgICAvLyBBbHdheXMgc2V0IGNoaWxkcmVuIHRvIHRoZSBzYW1lIHRoaW5nLiBJbiBJ RTksIHRoZSBzZWxlY3Rpb24gcmFuZ2Ugd2lsbAorICAgIC8vIGdldCByZXNldCBpZiBgdGV4dENv bnRlbnRgIGlzIG11dGF0ZWQuICBXZSBjb3VsZCBhZGQgYSBjaGVjayBpbiBzZXRUZXh0Q29udGVu dAorICAgIC8vIHRvIG9ubHkgc2V0IHRoZSB2YWx1ZSBpZi93aGVuIHRoZSB2YWx1ZSBkaWZmZXJz IGZyb20gdGhlIG5vZGUgdmFsdWUgKHdoaWNoIHdvdWxkCisgICAgLy8gY29tcGxldGVseSBzb2x2 ZSB0aGlzIElFOSBidWcpLCBidXQgU2ViYXN0aWFuK0JlbiBzZWVtZWQgdG8gbGlrZSB0aGlzIHNv bHV0aW9uLgorICAgIC8vIFRoZSB2YWx1ZSBjYW4gYmUgYSBib29sZWFuIG9yIG9iamVjdCBzbyB0 aGF0J3Mgd2h5IGl0J3MgZm9yY2VkIHRvIGJlIGEgc3RyaW5nLgorICAgIHZhciBob3N0UHJvcHMg PSBfYXNzaWduKHt9LCBwcm9wcywgeworICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKKyAgICAgIGRl ZmF1bHRWYWx1ZTogdW5kZWZpbmVkLAorICAgICAgY2hpbGRyZW46ICcnICsgaW5zdC5fd3JhcHBl clN0YXRlLmluaXRpYWxWYWx1ZSwKKyAgICAgIG9uQ2hhbmdlOiBpbnN0Ll93cmFwcGVyU3RhdGUu b25DaGFuZ2UKKyAgICB9KTsKKworICAgIHJldHVybiBob3N0UHJvcHM7CisgIH0sCisKKyAgbW91 bnRXcmFwcGVyOiBmdW5jdGlvbiAoaW5zdCwgcHJvcHMpIHsKKyAgICBpZiAoImRldmVsb3BtZW50 IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICBMaW5rZWRWYWx1ZVV0aWxzLmNoZWNrUHJvcFR5 cGVzKCd0ZXh0YXJlYScsIHByb3BzLCBpbnN0Ll9jdXJyZW50RWxlbWVudC5fb3duZXIpOworICAg ICAgaWYgKHByb3BzLnZhbHVlTGluayAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsdWVMaW5r KSB7CisgICAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFs c2UsICdgdmFsdWVMaW5rYCBwcm9wIG9uIGB0ZXh0YXJlYWAgaXMgZGVwcmVjYXRlZDsgc2V0IGB2 YWx1ZWAgYW5kIGBvbkNoYW5nZWAgaW5zdGVhZC4nKSA6IHZvaWQgMDsKKyAgICAgICAgZGlkV2Fy blZhbHVlTGluayA9IHRydWU7CisgICAgICB9CisgICAgICBpZiAocHJvcHMudmFsdWUgIT09IHVu ZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZh bERlZmF1bHRWYWwpIHsKKyAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8g d2FybmluZyhmYWxzZSwgJ1RleHRhcmVhIGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xs ZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBv ciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdl ZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCB0ZXh0YXJlYSAnICsgJ2FuZCBy ZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9mYi5tZS9y ZWFjdC1jb250cm9sbGVkLWNvbXBvbmVudHMnKSA6IHZvaWQgMDsKKyAgICAgICAgZGlkV2FyblZh bERlZmF1bHRWYWwgPSB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIHZhciB2YWx1ZSA9IExp bmtlZFZhbHVlVXRpbHMuZ2V0VmFsdWUocHJvcHMpOworICAgIHZhciBpbml0aWFsVmFsdWUgPSB2 YWx1ZTsKKworICAgIC8vIE9ubHkgYm90aGVyIGZldGNoaW5nIGRlZmF1bHQgdmFsdWUgaWYgd2Un cmUgZ29pbmcgdG8gdXNlIGl0CisgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgIHZhciBk ZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWU7CisgICAgICAvLyBUT0RPICh5dW5nc3Rl cnMpOiBSZW1vdmUgc3VwcG9ydCBmb3IgY2hpbGRyZW4gY29udGVudCBpbiA8dGV4dGFyZWE+Lgor ICAgICAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW47CisgICAgICBpZiAoY2hpbGRyZW4g IT0gbnVsbCkgeworICAgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7 CisgICAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxz ZSwgJ1VzZSB0aGUgYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBwcm9wcyBpbnN0ZWFkIG9mIHNl dHRpbmcgJyArICdjaGlsZHJlbiBvbiA8dGV4dGFyZWE+LicpIDogdm9pZCAwOworICAgICAgICB9 CisgICAgICAgICEoZGVmYXVsdFZhbHVlID09IG51bGwpID8gImRldmVsb3BtZW50IiAhPT0gJ3By b2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnSWYgeW91IHN1cHBseSBgZGVmYXVsdFZhbHVl YCBvbiBhIDx0ZXh0YXJlYT4sIGRvIG5vdCBwYXNzIGNoaWxkcmVuLicpIDogX3Byb2RJbnZhcmlh bnQoJzkyJykgOiB2b2lkIDA7CisgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkg eworICAgICAgICAgICEoY2hpbGRyZW4ubGVuZ3RoIDw9IDEpID8gImRldmVsb3BtZW50IiAhPT0g J3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnPHRleHRhcmVhPiBjYW4gb25seSBoYXZl IGF0IG1vc3Qgb25lIGNoaWxkLicpIDogX3Byb2RJbnZhcmlhbnQoJzkzJykgOiB2b2lkIDA7Cisg ICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlblswXTsKKyAgICAgICAgfQorCisgICAgICAgIGRl ZmF1bHRWYWx1ZSA9ICcnICsgY2hpbGRyZW47CisgICAgICB9CisgICAgICBpZiAoZGVmYXVsdFZh bHVlID09IG51bGwpIHsKKyAgICAgICAgZGVmYXVsdFZhbHVlID0gJyc7CisgICAgICB9CisgICAg ICBpbml0aWFsVmFsdWUgPSBkZWZhdWx0VmFsdWU7CisgICAgfQorCisgICAgaW5zdC5fd3JhcHBl clN0YXRlID0geworICAgICAgaW5pdGlhbFZhbHVlOiAnJyArIGluaXRpYWxWYWx1ZSwKKyAgICAg IGxpc3RlbmVyczogbnVsbCwKKyAgICAgIG9uQ2hhbmdlOiBfaGFuZGxlQ2hhbmdlLmJpbmQoaW5z dCkKKyAgICB9OworICB9LAorCisgIHVwZGF0ZVdyYXBwZXI6IGZ1bmN0aW9uIChpbnN0KSB7Cisg ICAgdmFyIHByb3BzID0gaW5zdC5fY3VycmVudEVsZW1lbnQucHJvcHM7CisKKyAgICB2YXIgbm9k ZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpOworICAg IHZhciB2YWx1ZSA9IExpbmtlZFZhbHVlVXRpbHMuZ2V0VmFsdWUocHJvcHMpOworICAgIGlmICh2 YWx1ZSAhPSBudWxsKSB7CisgICAgICAvLyBDYXN0IGB2YWx1ZWAgdG8gYSBzdHJpbmcgdG8gZW5z dXJlIHRoZSB2YWx1ZSBpcyBzZXQgY29ycmVjdGx5LiBXaGlsZQorICAgICAgLy8gYnJvd3NlcnMg dHlwaWNhbGx5IGRvIHRoaXMgYXMgbmVjZXNzYXJ5LCBqc2RvbSBkb2Vzbid0LgorICAgICAgdmFy IG5ld1ZhbHVlID0gJycgKyB2YWx1ZTsKKworICAgICAgLy8gVG8gYXZvaWQgc2lkZSBlZmZlY3Rz IChzdWNoIGFzIGxvc2luZyB0ZXh0IHNlbGVjdGlvbiksIG9ubHkgc2V0IHZhbHVlIGlmIGNoYW5n ZWQKKyAgICAgIGlmIChuZXdWYWx1ZSAhPT0gbm9kZS52YWx1ZSkgeworICAgICAgICBub2RlLnZh bHVlID0gbmV3VmFsdWU7CisgICAgICB9CisgICAgICBpZiAocHJvcHMuZGVmYXVsdFZhbHVlID09 IG51bGwpIHsKKyAgICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSBuZXdWYWx1ZTsKKyAgICAgIH0K KyAgICB9CisgICAgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7CisgICAgICBub2Rl LmRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZTsKKyAgICB9CisgIH0sCisKKyAgcG9z dE1vdW50V3JhcHBlcjogZnVuY3Rpb24gKGluc3QpIHsKKyAgICAvLyBUaGlzIGlzIGluIHBvc3RN b3VudCBiZWNhdXNlIHdlIG5lZWQgYWNjZXNzIHRvIHRoZSBET00gbm9kZSwgd2hpY2ggaXMgbm90 CisgICAgLy8gYXZhaWxhYmxlIHVudGlsIGFmdGVyIHRoZSBjb21wb25lbnQgaGFzIG1vdW50ZWQu CisgICAgdmFyIG5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5j ZShpbnN0KTsKKyAgICB2YXIgdGV4dENvbnRlbnQgPSBub2RlLnRleHRDb250ZW50OworCisgICAg Ly8gT25seSBzZXQgbm9kZS52YWx1ZSBpZiB0ZXh0Q29udGVudCBpcyBlcXVhbCB0byB0aGUgZXhw ZWN0ZWQKKyAgICAvLyBpbml0aWFsIHZhbHVlLiBJbiBJRTEwL0lFMTEgdGhlcmUgaXMgYSBidWcg d2hlcmUgdGhlIHBsYWNlaG9sZGVyIGF0dHJpYnV0ZQorICAgIC8vIHdpbGwgcG9wdWxhdGUgdGV4 dENvbnRlbnQgYXMgd2VsbC4KKyAgICAvLyBodHRwczovL2RldmVsb3Blci5taWNyb3NvZnQuY29t L21pY3Jvc29mdC1lZGdlL3BsYXRmb3JtL2lzc3Vlcy8xMDE1MjUvCisgICAgaWYgKHRleHRDb250 ZW50ID09PSBpbnN0Ll93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKSB7CisgICAgICBub2RlLnZh bHVlID0gdGV4dENvbnRlbnQ7CisgICAgfQorICB9Cit9OworCitmdW5jdGlvbiBfaGFuZGxlQ2hh bmdlKGV2ZW50KSB7CisgIHZhciBwcm9wcyA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzOwor ICB2YXIgcmV0dXJuVmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmV4ZWN1dGVPbkNoYW5nZShwcm9w cywgZXZlbnQpOworICBSZWFjdFVwZGF0ZXMuYXNhcChmb3JjZVVwZGF0ZUlmTW91bnRlZCwgdGhp cyk7CisgIHJldHVybiByZXR1cm5WYWx1ZTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdERP TVRleHRhcmVhOworfSx7IjExNiI6MTE2LCIxNDAiOjE0MCwiMTQ3IjoxNDcsIjE0OCI6MTQ4LCIy MyI6MjMsIjMyIjozMiwiNzUiOjc1fV0sNDQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9y dHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxNS1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICog QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2Vk IHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmls ZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25h bCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMg ZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwor dmFyIF9wcm9kSW52YXJpYW50ID0gX2RlcmVxXygxMTYpOworCit2YXIgaW52YXJpYW50ID0gX2Rl cmVxXygxNDApOworCisvKioKKyAqIFJldHVybiB0aGUgbG93ZXN0IGNvbW1vbiBhbmNlc3RvciBv ZiBBIGFuZCBCLCBvciBudWxsIGlmIHRoZXkgYXJlIGluCisgKiBkaWZmZXJlbnQgdHJlZXMuCisg Ki8KK2Z1bmN0aW9uIGdldExvd2VzdENvbW1vbkFuY2VzdG9yKGluc3RBLCBpbnN0QikgeworICAh KCdfaG9zdE5vZGUnIGluIGluc3RBKSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/ IGludmFyaWFudChmYWxzZSwgJ2dldE5vZGVGcm9tSW5zdGFuY2U6IEludmFsaWQgYXJndW1lbnQu JykgOiBfcHJvZEludmFyaWFudCgnMzMnKSA6IHZvaWQgMDsKKyAgISgnX2hvc3ROb2RlJyBpbiBp bnN0QikgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2Us ICdnZXROb2RlRnJvbUluc3RhbmNlOiBJbnZhbGlkIGFyZ3VtZW50LicpIDogX3Byb2RJbnZhcmlh bnQoJzMzJykgOiB2b2lkIDA7CisKKyAgdmFyIGRlcHRoQSA9IDA7CisgIGZvciAodmFyIHRlbXBB ID0gaW5zdEE7IHRlbXBBOyB0ZW1wQSA9IHRlbXBBLl9ob3N0UGFyZW50KSB7CisgICAgZGVwdGhB Kys7CisgIH0KKyAgdmFyIGRlcHRoQiA9IDA7CisgIGZvciAodmFyIHRlbXBCID0gaW5zdEI7IHRl bXBCOyB0ZW1wQiA9IHRlbXBCLl9ob3N0UGFyZW50KSB7CisgICAgZGVwdGhCKys7CisgIH0KKwor ICAvLyBJZiBBIGlzIGRlZXBlciwgY3Jhd2wgdXAuCisgIHdoaWxlIChkZXB0aEEgLSBkZXB0aEIg PiAwKSB7CisgICAgaW5zdEEgPSBpbnN0QS5faG9zdFBhcmVudDsKKyAgICBkZXB0aEEtLTsKKyAg fQorCisgIC8vIElmIEIgaXMgZGVlcGVyLCBjcmF3bCB1cC4KKyAgd2hpbGUgKGRlcHRoQiAtIGRl cHRoQSA+IDApIHsKKyAgICBpbnN0QiA9IGluc3RCLl9ob3N0UGFyZW50OworICAgIGRlcHRoQi0t OworICB9CisKKyAgLy8gV2FsayBpbiBsb2Nrc3RlcCB1bnRpbCB3ZSBmaW5kIGEgbWF0Y2guCisg IHZhciBkZXB0aCA9IGRlcHRoQTsKKyAgd2hpbGUgKGRlcHRoLS0pIHsKKyAgICBpZiAoaW5zdEEg PT09IGluc3RCKSB7CisgICAgICByZXR1cm4gaW5zdEE7CisgICAgfQorICAgIGluc3RBID0gaW5z dEEuX2hvc3RQYXJlbnQ7CisgICAgaW5zdEIgPSBpbnN0Qi5faG9zdFBhcmVudDsKKyAgfQorICBy ZXR1cm4gbnVsbDsKK30KKworLyoqCisgKiBSZXR1cm4gaWYgQSBpcyBhbiBhbmNlc3RvciBvZiBC LgorICovCitmdW5jdGlvbiBpc0FuY2VzdG9yKGluc3RBLCBpbnN0QikgeworICAhKCdfaG9zdE5v ZGUnIGluIGluc3RBKSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFu dChmYWxzZSwgJ2lzQW5jZXN0b3I6IEludmFsaWQgYXJndW1lbnQuJykgOiBfcHJvZEludmFyaWFu dCgnMzUnKSA6IHZvaWQgMDsKKyAgISgnX2hvc3ROb2RlJyBpbiBpbnN0QikgPyAiZGV2ZWxvcG1l bnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdpc0FuY2VzdG9yOiBJbnZh bGlkIGFyZ3VtZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzM1JykgOiB2b2lkIDA7CisKKyAgd2hp bGUgKGluc3RCKSB7CisgICAgaWYgKGluc3RCID09PSBpbnN0QSkgeworICAgICAgcmV0dXJuIHRy dWU7CisgICAgfQorICAgIGluc3RCID0gaW5zdEIuX2hvc3RQYXJlbnQ7CisgIH0KKyAgcmV0dXJu IGZhbHNlOworfQorCisvKioKKyAqIFJldHVybiB0aGUgcGFyZW50IGluc3RhbmNlIG9mIHRoZSBw YXNzZWQtaW4gaW5zdGFuY2UuCisgKi8KK2Z1bmN0aW9uIGdldFBhcmVudEluc3RhbmNlKGluc3Qp IHsKKyAgISgnX2hvc3ROb2RlJyBpbiBpbnN0KSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0 aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2dldFBhcmVudEluc3RhbmNlOiBJbnZhbGlkIGFyZ3Vt ZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzM2JykgOiB2b2lkIDA7CisKKyAgcmV0dXJuIGluc3Qu X2hvc3RQYXJlbnQ7Cit9CisKKy8qKgorICogU2ltdWxhdGVzIHRoZSB0cmF2ZXJzYWwgb2YgYSB0 d28tcGhhc2UsIGNhcHR1cmUvYnViYmxlIGV2ZW50IGRpc3BhdGNoLgorICovCitmdW5jdGlvbiB0 cmF2ZXJzZVR3b1BoYXNlKGluc3QsIGZuLCBhcmcpIHsKKyAgdmFyIHBhdGggPSBbXTsKKyAgd2hp bGUgKGluc3QpIHsKKyAgICBwYXRoLnB1c2goaW5zdCk7CisgICAgaW5zdCA9IGluc3QuX2hvc3RQ YXJlbnQ7CisgIH0KKyAgdmFyIGk7CisgIGZvciAoaSA9IHBhdGgubGVuZ3RoOyBpLS0gPiAwOykg eworICAgIGZuKHBhdGhbaV0sICdjYXB0dXJlZCcsIGFyZyk7CisgIH0KKyAgZm9yIChpID0gMDsg aSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKKyAgICBmbihwYXRoW2ldLCAnYnViYmxlZCcsIGFyZyk7 CisgIH0KK30KKworLyoqCisgKiBUcmF2ZXJzZXMgdGhlIElEIGhpZXJhcmNoeSBhbmQgaW52b2tl cyB0aGUgc3VwcGxpZWQgYGNiYCBvbiBhbnkgSURzIHRoYXQKKyAqIHNob3VsZCB3b3VsZCByZWNl aXZlIGEgYG1vdXNlRW50ZXJgIG9yIGBtb3VzZUxlYXZlYCBldmVudC4KKyAqCisgKiBEb2VzIG5v dCBpbnZva2UgdGhlIGNhbGxiYWNrIG9uIHRoZSBuZWFyZXN0IGNvbW1vbiBhbmNlc3RvciBiZWNh dXNlIG5vdGhpbmcKKyAqICJlbnRlcmVkIiBvciAibGVmdCIgdGhhdCBlbGVtZW50LgorICovCitm dW5jdGlvbiB0cmF2ZXJzZUVudGVyTGVhdmUoZnJvbSwgdG8sIGZuLCBhcmdGcm9tLCBhcmdUbykg eworICB2YXIgY29tbW9uID0gZnJvbSAmJiB0byA/IGdldExvd2VzdENvbW1vbkFuY2VzdG9yKGZy b20sIHRvKSA6IG51bGw7CisgIHZhciBwYXRoRnJvbSA9IFtdOworICB3aGlsZSAoZnJvbSAmJiBm cm9tICE9PSBjb21tb24pIHsKKyAgICBwYXRoRnJvbS5wdXNoKGZyb20pOworICAgIGZyb20gPSBm cm9tLl9ob3N0UGFyZW50OworICB9CisgIHZhciBwYXRoVG8gPSBbXTsKKyAgd2hpbGUgKHRvICYm IHRvICE9PSBjb21tb24pIHsKKyAgICBwYXRoVG8ucHVzaCh0byk7CisgICAgdG8gPSB0by5faG9z dFBhcmVudDsKKyAgfQorICB2YXIgaTsKKyAgZm9yIChpID0gMDsgaSA8IHBhdGhGcm9tLmxlbmd0 aDsgaSsrKSB7CisgICAgZm4ocGF0aEZyb21baV0sICdidWJibGVkJywgYXJnRnJvbSk7CisgIH0K KyAgZm9yIChpID0gcGF0aFRvLmxlbmd0aDsgaS0tID4gMDspIHsKKyAgICBmbihwYXRoVG9baV0s ICdjYXB0dXJlZCcsIGFyZ1RvKTsKKyAgfQorfQorCittb2R1bGUuZXhwb3J0cyA9IHsKKyAgaXNB bmNlc3RvcjogaXNBbmNlc3RvciwKKyAgZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3I6IGdldExvd2Vz dENvbW1vbkFuY2VzdG9yLAorICBnZXRQYXJlbnRJbnN0YW5jZTogZ2V0UGFyZW50SW5zdGFuY2Us CisgIHRyYXZlcnNlVHdvUGhhc2U6IHRyYXZlcnNlVHdvUGhhc2UsCisgIHRyYXZlcnNlRW50ZXJM ZWF2ZTogdHJhdmVyc2VFbnRlckxlYXZlCit9OworfSx7IjExNiI6MTE2LCIxNDAiOjE0MH1dLDQ1 OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIw MTYtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor ICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vu c2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9m IHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdo dHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5 LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFJlYWN0SW52YWxpZFNldFN0 YXRlV2FybmluZ0hvb2sgPSBfZGVyZXFfKDYwKTsKK3ZhciBSZWFjdEhvc3RPcGVyYXRpb25IaXN0 b3J5SG9vayA9IF9kZXJlcV8oNTUpOwordmFyIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSBfZGVy ZXFfKDEyMik7Cit2YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSBfZGVyZXFfKDEyNik7CisKK3Zh ciBwZXJmb3JtYW5jZU5vdyA9IF9kZXJlcV8oMTQ1KTsKK3ZhciB3YXJuaW5nID0gX2RlcmVxXygx NDcpOworCit2YXIgaG9va3MgPSBbXTsKK3ZhciBkaWRIb29rVGhyb3dGb3JFdmVudCA9IHt9Owor CitmdW5jdGlvbiBjYWxsSG9vayhldmVudCwgZm4sIGNvbnRleHQsIGFyZzEsIGFyZzIsIGFyZzMs IGFyZzQsIGFyZzUpIHsKKyAgdHJ5IHsKKyAgICBmbi5jYWxsKGNvbnRleHQsIGFyZzEsIGFyZzIs IGFyZzMsIGFyZzQsIGFyZzUpOworICB9IGNhdGNoIChlKSB7CisgICAgImRldmVsb3BtZW50IiAh PT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhkaWRIb29rVGhyb3dGb3JFdmVudFtldmVudF0sICdF eGNlcHRpb24gdGhyb3duIGJ5IGhvb2sgd2hpbGUgaGFuZGxpbmcgJXM6ICVzJywgZXZlbnQsIGUg KyAnXG4nICsgZS5zdGFjaykgOiB2b2lkIDA7CisgICAgZGlkSG9va1Rocm93Rm9yRXZlbnRbZXZl bnRdID0gdHJ1ZTsKKyAgfQorfQorCitmdW5jdGlvbiBlbWl0RXZlbnQoZXZlbnQsIGFyZzEsIGFy ZzIsIGFyZzMsIGFyZzQsIGFyZzUpIHsKKyAgZm9yICh2YXIgaSA9IDA7IGkgPCBob29rcy5sZW5n dGg7IGkrKykgeworICAgIHZhciBob29rID0gaG9va3NbaV07CisgICAgdmFyIGZuID0gaG9va1tl dmVudF07CisgICAgaWYgKGZuKSB7CisgICAgICBjYWxsSG9vayhldmVudCwgZm4sIGhvb2ssIGFy ZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOworICAgIH0KKyAgfQorfQorCit2YXIgaXNQcm9m aWxpbmcgPSBmYWxzZTsKK3ZhciBmbHVzaEhpc3RvcnkgPSBbXTsKK3ZhciBsaWZlQ3ljbGVUaW1l clN0YWNrID0gW107Cit2YXIgY3VycmVudEZsdXNoTmVzdGluZyA9IDA7Cit2YXIgY3VycmVudEZs dXNoTWVhc3VyZW1lbnRzID0gW107Cit2YXIgY3VycmVudEZsdXNoU3RhcnRUaW1lID0gMDsKK3Zh ciBjdXJyZW50VGltZXJEZWJ1Z0lEID0gbnVsbDsKK3ZhciBjdXJyZW50VGltZXJTdGFydFRpbWUg PSAwOwordmFyIGN1cnJlbnRUaW1lck5lc3RlZEZsdXNoRHVyYXRpb24gPSAwOwordmFyIGN1cnJl bnRUaW1lclR5cGUgPSBudWxsOworCit2YXIgbGlmZUN5Y2xlVGltZXJIYXNXYXJuZWQgPSBmYWxz ZTsKKworZnVuY3Rpb24gY2xlYXJIaXN0b3J5KCkgeworICBSZWFjdENvbXBvbmVudFRyZWVIb29r LnB1cmdlVW5tb3VudGVkQ29tcG9uZW50cygpOworICBSZWFjdEhvc3RPcGVyYXRpb25IaXN0b3J5 SG9vay5jbGVhckhpc3RvcnkoKTsKK30KKworZnVuY3Rpb24gZ2V0VHJlZVNuYXBzaG90KHJlZ2lz dGVyZWRJRHMpIHsKKyAgcmV0dXJuIHJlZ2lzdGVyZWRJRHMucmVkdWNlKGZ1bmN0aW9uICh0cmVl LCBpZCkgeworICAgIHZhciBvd25lcklEID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRPd25l cklEKGlkKTsKKyAgICB2YXIgcGFyZW50SUQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFBh cmVudElEKGlkKTsKKyAgICB0cmVlW2lkXSA9IHsKKyAgICAgIGRpc3BsYXlOYW1lOiBSZWFjdENv bXBvbmVudFRyZWVIb29rLmdldERpc3BsYXlOYW1lKGlkKSwKKyAgICAgIHRleHQ6IFJlYWN0Q29t cG9uZW50VHJlZUhvb2suZ2V0VGV4dChpZCksCisgICAgICB1cGRhdGVDb3VudDogUmVhY3RDb21w b25lbnRUcmVlSG9vay5nZXRVcGRhdGVDb3VudChpZCksCisgICAgICBjaGlsZElEczogUmVhY3RD b21wb25lbnRUcmVlSG9vay5nZXRDaGlsZElEcyhpZCksCisgICAgICAvLyBUZXh0IG5vZGVzIGRv bid0IGhhdmUgb3duZXJzIGJ1dCB0aGlzIGlzIGNsb3NlIGVub3VnaC4KKyAgICAgIG93bmVySUQ6 IG93bmVySUQgfHwgcGFyZW50SUQgJiYgUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRPd25lcklE KHBhcmVudElEKSB8fCAwLAorICAgICAgcGFyZW50SUQ6IHBhcmVudElECisgICAgfTsKKyAgICBy ZXR1cm4gdHJlZTsKKyAgfSwge30pOworfQorCitmdW5jdGlvbiByZXNldE1lYXN1cmVtZW50cygp IHsKKyAgdmFyIHByZXZpb3VzU3RhcnRUaW1lID0gY3VycmVudEZsdXNoU3RhcnRUaW1lOworICB2 YXIgcHJldmlvdXNNZWFzdXJlbWVudHMgPSBjdXJyZW50Rmx1c2hNZWFzdXJlbWVudHM7CisgIHZh ciBwcmV2aW91c09wZXJhdGlvbnMgPSBSZWFjdEhvc3RPcGVyYXRpb25IaXN0b3J5SG9vay5nZXRI aXN0b3J5KCk7CisKKyAgaWYgKGN1cnJlbnRGbHVzaE5lc3RpbmcgPT09IDApIHsKKyAgICBjdXJy ZW50Rmx1c2hTdGFydFRpbWUgPSAwOworICAgIGN1cnJlbnRGbHVzaE1lYXN1cmVtZW50cyA9IFtd OworICAgIGNsZWFySGlzdG9yeSgpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChwcmV2aW91 c01lYXN1cmVtZW50cy5sZW5ndGggfHwgcHJldmlvdXNPcGVyYXRpb25zLmxlbmd0aCkgeworICAg IHZhciByZWdpc3RlcmVkSURzID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRSZWdpc3RlcmVk SURzKCk7CisgICAgZmx1c2hIaXN0b3J5LnB1c2goeworICAgICAgZHVyYXRpb246IHBlcmZvcm1h bmNlTm93KCkgLSBwcmV2aW91c1N0YXJ0VGltZSwKKyAgICAgIG1lYXN1cmVtZW50czogcHJldmlv dXNNZWFzdXJlbWVudHMgfHwgW10sCisgICAgICBvcGVyYXRpb25zOiBwcmV2aW91c09wZXJhdGlv bnMgfHwgW10sCisgICAgICB0cmVlU25hcHNob3Q6IGdldFRyZWVTbmFwc2hvdChyZWdpc3RlcmVk SURzKQorICAgIH0pOworICB9CisKKyAgY2xlYXJIaXN0b3J5KCk7CisgIGN1cnJlbnRGbHVzaFN0 YXJ0VGltZSA9IHBlcmZvcm1hbmNlTm93KCk7CisgIGN1cnJlbnRGbHVzaE1lYXN1cmVtZW50cyA9 IFtdOworfQorCitmdW5jdGlvbiBjaGVja0RlYnVnSUQoZGVidWdJRCkgeworICB2YXIgYWxsb3dS b290ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQg PyBhcmd1bWVudHNbMV0gOiBmYWxzZTsKKworICBpZiAoYWxsb3dSb290ICYmIGRlYnVnSUQgPT09 IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFkZWJ1Z0lEKSB7CisgICAgImRldmVsb3Bt ZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1JlYWN0RGVidWdUb29sOiBk ZWJ1Z0lEIG1heSBub3QgYmUgZW1wdHkuJykgOiB2b2lkIDA7CisgIH0KK30KKworZnVuY3Rpb24g YmVnaW5MaWZlQ3ljbGVUaW1lcihkZWJ1Z0lELCB0aW1lclR5cGUpIHsKKyAgaWYgKGN1cnJlbnRG bHVzaE5lc3RpbmcgPT09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGN1cnJlbnRUaW1l clR5cGUgJiYgIWxpZmVDeWNsZVRpbWVySGFzV2FybmVkKSB7CisgICAgImRldmVsb3BtZW50IiAh PT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1RoZXJlIGlzIGFuIGludGVybmFsIGVy cm9yIGluIHRoZSBSZWFjdCBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudCBjb2RlLiAnICsgJ0RpZCBu b3QgZXhwZWN0ICVzIHRpbWVyIHRvIHN0YXJ0IHdoaWxlICVzIHRpbWVyIGlzIHN0aWxsIGluICcg KyAncHJvZ3Jlc3MgZm9yICVzIGluc3RhbmNlLicsIHRpbWVyVHlwZSwgY3VycmVudFRpbWVyVHlw ZSB8fCAnbm8nLCBkZWJ1Z0lEID09PSBjdXJyZW50VGltZXJEZWJ1Z0lEID8gJ3RoZSBzYW1lJyA6 ICdhbm90aGVyJykgOiB2b2lkIDA7CisgICAgbGlmZUN5Y2xlVGltZXJIYXNXYXJuZWQgPSB0cnVl OworICB9CisgIGN1cnJlbnRUaW1lclN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlTm93KCk7CisgIGN1 cnJlbnRUaW1lck5lc3RlZEZsdXNoRHVyYXRpb24gPSAwOworICBjdXJyZW50VGltZXJEZWJ1Z0lE ID0gZGVidWdJRDsKKyAgY3VycmVudFRpbWVyVHlwZSA9IHRpbWVyVHlwZTsKK30KKworZnVuY3Rp b24gZW5kTGlmZUN5Y2xlVGltZXIoZGVidWdJRCwgdGltZXJUeXBlKSB7CisgIGlmIChjdXJyZW50 Rmx1c2hOZXN0aW5nID09PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChjdXJyZW50VGlt ZXJUeXBlICE9PSB0aW1lclR5cGUgJiYgIWxpZmVDeWNsZVRpbWVySGFzV2FybmVkKSB7CisgICAg ImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1RoZXJlIGlz IGFuIGludGVybmFsIGVycm9yIGluIHRoZSBSZWFjdCBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudCBj b2RlLiAnICsgJ1dlIGRpZCBub3QgZXhwZWN0ICVzIHRpbWVyIHRvIHN0b3Agd2hpbGUgJXMgdGlt ZXIgaXMgc3RpbGwgaW4gJyArICdwcm9ncmVzcyBmb3IgJXMgaW5zdGFuY2UuIFBsZWFzZSByZXBv cnQgdGhpcyBhcyBhIGJ1ZyBpbiBSZWFjdC4nLCB0aW1lclR5cGUsIGN1cnJlbnRUaW1lclR5cGUg fHwgJ25vJywgZGVidWdJRCA9PT0gY3VycmVudFRpbWVyRGVidWdJRCA/ICd0aGUgc2FtZScgOiAn YW5vdGhlcicpIDogdm9pZCAwOworICAgIGxpZmVDeWNsZVRpbWVySGFzV2FybmVkID0gdHJ1ZTsK KyAgfQorICBpZiAoaXNQcm9maWxpbmcpIHsKKyAgICBjdXJyZW50Rmx1c2hNZWFzdXJlbWVudHMu cHVzaCh7CisgICAgICB0aW1lclR5cGU6IHRpbWVyVHlwZSwKKyAgICAgIGluc3RhbmNlSUQ6IGRl YnVnSUQsCisgICAgICBkdXJhdGlvbjogcGVyZm9ybWFuY2VOb3coKSAtIGN1cnJlbnRUaW1lclN0 YXJ0VGltZSAtIGN1cnJlbnRUaW1lck5lc3RlZEZsdXNoRHVyYXRpb24KKyAgICB9KTsKKyAgfQor ICBjdXJyZW50VGltZXJTdGFydFRpbWUgPSAwOworICBjdXJyZW50VGltZXJOZXN0ZWRGbHVzaER1 cmF0aW9uID0gMDsKKyAgY3VycmVudFRpbWVyRGVidWdJRCA9IG51bGw7CisgIGN1cnJlbnRUaW1l clR5cGUgPSBudWxsOworfQorCitmdW5jdGlvbiBwYXVzZUN1cnJlbnRMaWZlQ3ljbGVUaW1lcigp IHsKKyAgdmFyIGN1cnJlbnRUaW1lciA9IHsKKyAgICBzdGFydFRpbWU6IGN1cnJlbnRUaW1lclN0 YXJ0VGltZSwKKyAgICBuZXN0ZWRGbHVzaFN0YXJ0VGltZTogcGVyZm9ybWFuY2VOb3coKSwKKyAg ICBkZWJ1Z0lEOiBjdXJyZW50VGltZXJEZWJ1Z0lELAorICAgIHRpbWVyVHlwZTogY3VycmVudFRp bWVyVHlwZQorICB9OworICBsaWZlQ3ljbGVUaW1lclN0YWNrLnB1c2goY3VycmVudFRpbWVyKTsK KyAgY3VycmVudFRpbWVyU3RhcnRUaW1lID0gMDsKKyAgY3VycmVudFRpbWVyTmVzdGVkRmx1c2hE dXJhdGlvbiA9IDA7CisgIGN1cnJlbnRUaW1lckRlYnVnSUQgPSBudWxsOworICBjdXJyZW50VGlt ZXJUeXBlID0gbnVsbDsKK30KKworZnVuY3Rpb24gcmVzdW1lQ3VycmVudExpZmVDeWNsZVRpbWVy KCkgeworICB2YXIgX2xpZmVDeWNsZVRpbWVyU3RhY2skID0gbGlmZUN5Y2xlVGltZXJTdGFjay5w b3AoKSwKKyAgICAgIHN0YXJ0VGltZSA9IF9saWZlQ3ljbGVUaW1lclN0YWNrJC5zdGFydFRpbWUs CisgICAgICBuZXN0ZWRGbHVzaFN0YXJ0VGltZSA9IF9saWZlQ3ljbGVUaW1lclN0YWNrJC5uZXN0 ZWRGbHVzaFN0YXJ0VGltZSwKKyAgICAgIGRlYnVnSUQgPSBfbGlmZUN5Y2xlVGltZXJTdGFjayQu ZGVidWdJRCwKKyAgICAgIHRpbWVyVHlwZSA9IF9saWZlQ3ljbGVUaW1lclN0YWNrJC50aW1lclR5 cGU7CisKKyAgdmFyIG5lc3RlZEZsdXNoRHVyYXRpb24gPSBwZXJmb3JtYW5jZU5vdygpIC0gbmVz dGVkRmx1c2hTdGFydFRpbWU7CisgIGN1cnJlbnRUaW1lclN0YXJ0VGltZSA9IHN0YXJ0VGltZTsK KyAgY3VycmVudFRpbWVyTmVzdGVkRmx1c2hEdXJhdGlvbiArPSBuZXN0ZWRGbHVzaER1cmF0aW9u OworICBjdXJyZW50VGltZXJEZWJ1Z0lEID0gZGVidWdJRDsKKyAgY3VycmVudFRpbWVyVHlwZSA9 IHRpbWVyVHlwZTsKK30KKwordmFyIGxhc3RNYXJrVGltZVN0YW1wID0gMDsKK3ZhciBjYW5Vc2VQ ZXJmb3JtYW5jZU1lYXN1cmUgPQorLy8gJEZsb3dGaXhNZSBodHRwczovL2dpdGh1Yi5jb20vZmFj ZWJvb2svZmxvdy9pc3N1ZXMvMjM0NQordHlwZW9mIHBlcmZvcm1hbmNlICE9PSAndW5kZWZpbmVk JyAmJiB0eXBlb2YgcGVyZm9ybWFuY2UubWFyayA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgcGVy Zm9ybWFuY2UuY2xlYXJNYXJrcyA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgcGVyZm9ybWFuY2Uu bWVhc3VyZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgcGVyZm9ybWFuY2UuY2xlYXJNZWFzdXJl cyA9PT0gJ2Z1bmN0aW9uJzsKKworZnVuY3Rpb24gc2hvdWxkTWFyayhkZWJ1Z0lEKSB7CisgIGlm ICghaXNQcm9maWxpbmcgfHwgIWNhblVzZVBlcmZvcm1hbmNlTWVhc3VyZSkgeworICAgIHJldHVy biBmYWxzZTsKKyAgfQorICB2YXIgZWxlbWVudCA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0 RWxlbWVudChkZWJ1Z0lEKTsKKyAgaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCB0eXBlb2YgZWxlbWVu dCAhPT0gJ29iamVjdCcpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgdmFyIGlzSG9zdEVs ZW1lbnQgPSB0eXBlb2YgZWxlbWVudC50eXBlID09PSAnc3RyaW5nJzsKKyAgaWYgKGlzSG9zdEVs ZW1lbnQpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Z1 bmN0aW9uIG1hcmtCZWdpbihkZWJ1Z0lELCBtYXJrVHlwZSkgeworICBpZiAoIXNob3VsZE1hcmso ZGVidWdJRCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICB2YXIgbWFya05hbWUgPSBkZWJ1Z0lE ICsgJzo6JyArIG1hcmtUeXBlOworICBsYXN0TWFya1RpbWVTdGFtcCA9IHBlcmZvcm1hbmNlTm93 KCk7CisgIHBlcmZvcm1hbmNlLm1hcmsobWFya05hbWUpOworfQorCitmdW5jdGlvbiBtYXJrRW5k KGRlYnVnSUQsIG1hcmtUeXBlKSB7CisgIGlmICghc2hvdWxkTWFyayhkZWJ1Z0lEKSkgeworICAg IHJldHVybjsKKyAgfQorCisgIHZhciBtYXJrTmFtZSA9IGRlYnVnSUQgKyAnOjonICsgbWFya1R5 cGU7CisgIHZhciBkaXNwbGF5TmFtZSA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0RGlzcGxh eU5hbWUoZGVidWdJRCkgfHwgJ1Vua25vd24nOworCisgIC8vIENocm9tZSBoYXMgYW4gaXNzdWUg b2YgZHJvcHBpbmcgbWFya2VycyByZWNvcmRlZCB0b28gZmFzdDoKKyAgLy8gaHR0cHM6Ly9idWdz LmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NjQwNjUyCisgIC8vIFRv IHdvcmsgYXJvdW5kIHRoaXMsIHdlIHdpbGwgbm90IHJlcG9ydCB2ZXJ5IHNtYWxsIG1lYXN1cmVt ZW50cy4KKyAgLy8gSSBkZXRlcm1pbmVkIHRoZSBtYWdpYyBudW1iZXIgYnkgdHdlYWtpbmcgaXQg YmFjayBhbmQgZm9ydGguCisgIC8vIDAuMDVtcyB3YXMgZW5vdWdoIHRvIHByZXZlbnQgdGhlIGlz c3VlLCBidXQgSSBzZXQgaXQgdG8gMC4xbXMgdG8gYmUgc2FmZS4KKyAgLy8gV2hlbiB0aGUgYnVn IGlzIGZpeGVkLCB3ZSBjYW4gYG1lYXN1cmUoKWAgdW5jb25kaXRpb25hbGx5IGlmIHdlIHdhbnQg dG8uCisgIHZhciB0aW1lU3RhbXAgPSBwZXJmb3JtYW5jZU5vdygpOworICBpZiAodGltZVN0YW1w IC0gbGFzdE1hcmtUaW1lU3RhbXAgPiAwLjEpIHsKKyAgICB2YXIgbWVhc3VyZW1lbnROYW1lID0g ZGlzcGxheU5hbWUgKyAnIFsnICsgbWFya1R5cGUgKyAnXSc7CisgICAgcGVyZm9ybWFuY2UubWVh c3VyZShtZWFzdXJlbWVudE5hbWUsIG1hcmtOYW1lKTsKKyAgfQorCisgIHBlcmZvcm1hbmNlLmNs ZWFyTWFya3MobWFya05hbWUpOworICBwZXJmb3JtYW5jZS5jbGVhck1lYXN1cmVzKG1lYXN1cmVt ZW50TmFtZSk7Cit9CisKK3ZhciBSZWFjdERlYnVnVG9vbCA9IHsKKyAgYWRkSG9vazogZnVuY3Rp b24gKGhvb2spIHsKKyAgICBob29rcy5wdXNoKGhvb2spOworICB9LAorICByZW1vdmVIb29rOiBm dW5jdGlvbiAoaG9vaykgeworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaG9va3MubGVuZ3RoOyBp KyspIHsKKyAgICAgIGlmIChob29rc1tpXSA9PT0gaG9vaykgeworICAgICAgICBob29rcy5zcGxp Y2UoaSwgMSk7CisgICAgICAgIGktLTsKKyAgICAgIH0KKyAgICB9CisgIH0sCisgIGlzUHJvZmls aW5nOiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIGlzUHJvZmlsaW5nOworICB9LAorICBiZWdp blByb2ZpbGluZzogZnVuY3Rpb24gKCkgeworICAgIGlmIChpc1Byb2ZpbGluZykgeworICAgICAg cmV0dXJuOworICAgIH0KKworICAgIGlzUHJvZmlsaW5nID0gdHJ1ZTsKKyAgICBmbHVzaEhpc3Rv cnkubGVuZ3RoID0gMDsKKyAgICByZXNldE1lYXN1cmVtZW50cygpOworICAgIFJlYWN0RGVidWdU b29sLmFkZEhvb2soUmVhY3RIb3N0T3BlcmF0aW9uSGlzdG9yeUhvb2spOworICB9LAorICBlbmRQ cm9maWxpbmc6IGZ1bmN0aW9uICgpIHsKKyAgICBpZiAoIWlzUHJvZmlsaW5nKSB7CisgICAgICBy ZXR1cm47CisgICAgfQorCisgICAgaXNQcm9maWxpbmcgPSBmYWxzZTsKKyAgICByZXNldE1lYXN1 cmVtZW50cygpOworICAgIFJlYWN0RGVidWdUb29sLnJlbW92ZUhvb2soUmVhY3RIb3N0T3BlcmF0 aW9uSGlzdG9yeUhvb2spOworICB9LAorICBnZXRGbHVzaEhpc3Rvcnk6IGZ1bmN0aW9uICgpIHsK KyAgICByZXR1cm4gZmx1c2hIaXN0b3J5OworICB9LAorICBvbkJlZ2luRmx1c2g6IGZ1bmN0aW9u ICgpIHsKKyAgICBjdXJyZW50Rmx1c2hOZXN0aW5nKys7CisgICAgcmVzZXRNZWFzdXJlbWVudHMo KTsKKyAgICBwYXVzZUN1cnJlbnRMaWZlQ3ljbGVUaW1lcigpOworICAgIGVtaXRFdmVudCgnb25C ZWdpbkZsdXNoJyk7CisgIH0sCisgIG9uRW5kRmx1c2g6IGZ1bmN0aW9uICgpIHsKKyAgICByZXNl dE1lYXN1cmVtZW50cygpOworICAgIGN1cnJlbnRGbHVzaE5lc3RpbmctLTsKKyAgICByZXN1bWVD dXJyZW50TGlmZUN5Y2xlVGltZXIoKTsKKyAgICBlbWl0RXZlbnQoJ29uRW5kRmx1c2gnKTsKKyAg fSwKKyAgb25CZWdpbkxpZmVDeWNsZVRpbWVyOiBmdW5jdGlvbiAoZGVidWdJRCwgdGltZXJUeXBl KSB7CisgICAgY2hlY2tEZWJ1Z0lEKGRlYnVnSUQpOworICAgIGVtaXRFdmVudCgnb25CZWdpbkxp ZmVDeWNsZVRpbWVyJywgZGVidWdJRCwgdGltZXJUeXBlKTsKKyAgICBtYXJrQmVnaW4oZGVidWdJ RCwgdGltZXJUeXBlKTsKKyAgICBiZWdpbkxpZmVDeWNsZVRpbWVyKGRlYnVnSUQsIHRpbWVyVHlw ZSk7CisgIH0sCisgIG9uRW5kTGlmZUN5Y2xlVGltZXI6IGZ1bmN0aW9uIChkZWJ1Z0lELCB0aW1l clR5cGUpIHsKKyAgICBjaGVja0RlYnVnSUQoZGVidWdJRCk7CisgICAgZW5kTGlmZUN5Y2xlVGlt ZXIoZGVidWdJRCwgdGltZXJUeXBlKTsKKyAgICBtYXJrRW5kKGRlYnVnSUQsIHRpbWVyVHlwZSk7 CisgICAgZW1pdEV2ZW50KCdvbkVuZExpZmVDeWNsZVRpbWVyJywgZGVidWdJRCwgdGltZXJUeXBl KTsKKyAgfSwKKyAgb25CZWdpblByb2Nlc3NpbmdDaGlsZENvbnRleHQ6IGZ1bmN0aW9uICgpIHsK KyAgICBlbWl0RXZlbnQoJ29uQmVnaW5Qcm9jZXNzaW5nQ2hpbGRDb250ZXh0Jyk7CisgIH0sCisg IG9uRW5kUHJvY2Vzc2luZ0NoaWxkQ29udGV4dDogZnVuY3Rpb24gKCkgeworICAgIGVtaXRFdmVu dCgnb25FbmRQcm9jZXNzaW5nQ2hpbGRDb250ZXh0Jyk7CisgIH0sCisgIG9uSG9zdE9wZXJhdGlv bjogZnVuY3Rpb24gKG9wZXJhdGlvbikgeworICAgIGNoZWNrRGVidWdJRChvcGVyYXRpb24uaW5z dGFuY2VJRCk7CisgICAgZW1pdEV2ZW50KCdvbkhvc3RPcGVyYXRpb24nLCBvcGVyYXRpb24pOwor ICB9LAorICBvblNldFN0YXRlOiBmdW5jdGlvbiAoKSB7CisgICAgZW1pdEV2ZW50KCdvblNldFN0 YXRlJyk7CisgIH0sCisgIG9uU2V0Q2hpbGRyZW46IGZ1bmN0aW9uIChkZWJ1Z0lELCBjaGlsZERl YnVnSURzKSB7CisgICAgY2hlY2tEZWJ1Z0lEKGRlYnVnSUQpOworICAgIGNoaWxkRGVidWdJRHMu Zm9yRWFjaChjaGVja0RlYnVnSUQpOworICAgIGVtaXRFdmVudCgnb25TZXRDaGlsZHJlbicsIGRl YnVnSUQsIGNoaWxkRGVidWdJRHMpOworICB9LAorICBvbkJlZm9yZU1vdW50Q29tcG9uZW50OiBm dW5jdGlvbiAoZGVidWdJRCwgZWxlbWVudCwgcGFyZW50RGVidWdJRCkgeworICAgIGNoZWNrRGVi dWdJRChkZWJ1Z0lEKTsKKyAgICBjaGVja0RlYnVnSUQocGFyZW50RGVidWdJRCwgdHJ1ZSk7Cisg ICAgZW1pdEV2ZW50KCdvbkJlZm9yZU1vdW50Q29tcG9uZW50JywgZGVidWdJRCwgZWxlbWVudCwg cGFyZW50RGVidWdJRCk7CisgICAgbWFya0JlZ2luKGRlYnVnSUQsICdtb3VudCcpOworICB9LAor ICBvbk1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCkgeworICAgIGNoZWNrRGVidWdJ RChkZWJ1Z0lEKTsKKyAgICBtYXJrRW5kKGRlYnVnSUQsICdtb3VudCcpOworICAgIGVtaXRFdmVu dCgnb25Nb3VudENvbXBvbmVudCcsIGRlYnVnSUQpOworICB9LAorICBvbkJlZm9yZVVwZGF0ZUNv bXBvbmVudDogZnVuY3Rpb24gKGRlYnVnSUQsIGVsZW1lbnQpIHsKKyAgICBjaGVja0RlYnVnSUQo ZGVidWdJRCk7CisgICAgZW1pdEV2ZW50KCdvbkJlZm9yZVVwZGF0ZUNvbXBvbmVudCcsIGRlYnVn SUQsIGVsZW1lbnQpOworICAgIG1hcmtCZWdpbihkZWJ1Z0lELCAndXBkYXRlJyk7CisgIH0sCisg IG9uVXBkYXRlQ29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCkgeworICAgIGNoZWNrRGVidWdJ RChkZWJ1Z0lEKTsKKyAgICBtYXJrRW5kKGRlYnVnSUQsICd1cGRhdGUnKTsKKyAgICBlbWl0RXZl bnQoJ29uVXBkYXRlQ29tcG9uZW50JywgZGVidWdJRCk7CisgIH0sCisgIG9uQmVmb3JlVW5tb3Vu dENvbXBvbmVudDogZnVuY3Rpb24gKGRlYnVnSUQpIHsKKyAgICBjaGVja0RlYnVnSUQoZGVidWdJ RCk7CisgICAgZW1pdEV2ZW50KCdvbkJlZm9yZVVubW91bnRDb21wb25lbnQnLCBkZWJ1Z0lEKTsK KyAgICBtYXJrQmVnaW4oZGVidWdJRCwgJ3VubW91bnQnKTsKKyAgfSwKKyAgb25Vbm1vdW50Q29t cG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCkgeworICAgIGNoZWNrRGVidWdJRChkZWJ1Z0lEKTsK KyAgICBtYXJrRW5kKGRlYnVnSUQsICd1bm1vdW50Jyk7CisgICAgZW1pdEV2ZW50KCdvblVubW91 bnRDb21wb25lbnQnLCBkZWJ1Z0lEKTsKKyAgfSwKKyAgb25UZXN0RXZlbnQ6IGZ1bmN0aW9uICgp IHsKKyAgICBlbWl0RXZlbnQoJ29uVGVzdEV2ZW50Jyk7CisgIH0KK307CisKKy8vIFRPRE8gcmVt b3ZlIHRoZXNlIHdoZW4gUk4vd3d3IGdldHMgdXBkYXRlZAorUmVhY3REZWJ1Z1Rvb2wuYWRkRGV2 dG9vbCA9IFJlYWN0RGVidWdUb29sLmFkZEhvb2s7CitSZWFjdERlYnVnVG9vbC5yZW1vdmVEZXZ0 b29sID0gUmVhY3REZWJ1Z1Rvb2wucmVtb3ZlSG9vazsKKworUmVhY3REZWJ1Z1Rvb2wuYWRkSG9v ayhSZWFjdEludmFsaWRTZXRTdGF0ZVdhcm5pbmdIb29rKTsKK1JlYWN0RGVidWdUb29sLmFkZEhv b2soUmVhY3RDb21wb25lbnRUcmVlSG9vayk7Cit2YXIgdXJsID0gRXhlY3V0aW9uRW52aXJvbm1l bnQuY2FuVXNlRE9NICYmIHdpbmRvdy5sb2NhdGlvbi5ocmVmIHx8ICcnOworaWYgKC9bPyZdcmVh Y3RfcGVyZlxiLy50ZXN0KHVybCkpIHsKKyAgUmVhY3REZWJ1Z1Rvb2wuYmVnaW5Qcm9maWxpbmco KTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdERlYnVnVG9vbDsKK30seyIxMjIiOjEyMiwi MTI2IjoxMjYsIjE0NSI6MTQ1LCIxNDciOjE0NywiNTUiOjU1LCI2MCI6NjB9XSw0NjpbZnVuY3Rp b24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNl bnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMg c291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5k IGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNv dXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBi ZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisg Ki8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX2Fzc2lnbiA9IF9kZXJlcV8oMTQ4KTsKKwordmFy IFJlYWN0VXBkYXRlcyA9IF9kZXJlcV8oNzUpOwordmFyIFRyYW5zYWN0aW9uID0gX2RlcmVxXyg5 Myk7CisKK3ZhciBlbXB0eUZ1bmN0aW9uID0gX2RlcmVxXygxMzIpOworCit2YXIgUkVTRVRfQkFU Q0hFRF9VUERBVEVTID0geworICBpbml0aWFsaXplOiBlbXB0eUZ1bmN0aW9uLAorICBjbG9zZTog ZnVuY3Rpb24gKCkgeworICAgIFJlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3kuaXNCYXRjaGlu Z1VwZGF0ZXMgPSBmYWxzZTsKKyAgfQorfTsKKwordmFyIEZMVVNIX0JBVENIRURfVVBEQVRFUyA9 IHsKKyAgaW5pdGlhbGl6ZTogZW1wdHlGdW5jdGlvbiwKKyAgY2xvc2U6IFJlYWN0VXBkYXRlcy5m bHVzaEJhdGNoZWRVcGRhdGVzLmJpbmQoUmVhY3RVcGRhdGVzKQorfTsKKwordmFyIFRSQU5TQUNU SU9OX1dSQVBQRVJTID0gW0ZMVVNIX0JBVENIRURfVVBEQVRFUywgUkVTRVRfQkFUQ0hFRF9VUERB VEVTXTsKKworZnVuY3Rpb24gUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVneVRyYW5zYWN0aW9u KCkgeworICB0aGlzLnJlaW5pdGlhbGl6ZVRyYW5zYWN0aW9uKCk7Cit9CisKK19hc3NpZ24oUmVh Y3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVneVRyYW5zYWN0aW9uLnByb3RvdHlwZSwgVHJhbnNhY3Rp b24sIHsKKyAgZ2V0VHJhbnNhY3Rpb25XcmFwcGVyczogZnVuY3Rpb24gKCkgeworICAgIHJldHVy biBUUkFOU0FDVElPTl9XUkFQUEVSUzsKKyAgfQorfSk7CisKK3ZhciB0cmFuc2FjdGlvbiA9IG5l dyBSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5VHJhbnNhY3Rpb24oKTsKKwordmFyIFJlYWN0 RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3kgPSB7CisgIGlzQmF0Y2hpbmdVcGRhdGVzOiBmYWxzZSwK KworICAvKioKKyAgICogQ2FsbCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gaW4gYSBjb250ZXh0IHdp dGhpbiB3aGljaCBjYWxscyB0byBgc2V0U3RhdGVgCisgICAqIGFuZCBmcmllbmRzIGFyZSBiYXRj aGVkIHN1Y2ggdGhhdCBjb21wb25lbnRzIGFyZW4ndCB1cGRhdGVkIHVubmVjZXNzYXJpbHkuCisg ICAqLworICBiYXRjaGVkVXBkYXRlczogZnVuY3Rpb24gKGNhbGxiYWNrLCBhLCBiLCBjLCBkLCBl KSB7CisgICAgdmFyIGFscmVhZHlCYXRjaGluZ1VwZGF0ZXMgPSBSZWFjdERlZmF1bHRCYXRjaGlu Z1N0cmF0ZWd5LmlzQmF0Y2hpbmdVcGRhdGVzOworCisgICAgUmVhY3REZWZhdWx0QmF0Y2hpbmdT dHJhdGVneS5pc0JhdGNoaW5nVXBkYXRlcyA9IHRydWU7CisKKyAgICAvLyBUaGUgY29kZSBpcyB3 cml0dGVuIHRoaXMgd2F5IHRvIGF2b2lkIGV4dHJhIGFsbG9jYXRpb25zCisgICAgaWYgKGFscmVh ZHlCYXRjaGluZ1VwZGF0ZXMpIHsKKyAgICAgIHJldHVybiBjYWxsYmFjayhhLCBiLCBjLCBkLCBl KTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHRyYW5zYWN0aW9uLnBlcmZvcm0oY2FsbGJh Y2ssIG51bGwsIGEsIGIsIGMsIGQsIGUpOworICAgIH0KKyAgfQorfTsKKworbW9kdWxlLmV4cG9y dHMgPSBSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5OworfSx7IjEzMiI6MTMyLCIxNDgiOjE0 OCwiNzUiOjc1LCI5MyI6OTN9XSw0NzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7 CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwg cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5k ZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGlu IHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdy YW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxl IGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIg QVJJQURPTVByb3BlcnR5Q29uZmlnID0gX2RlcmVxXygxKTsKK3ZhciBCZWZvcmVJbnB1dEV2ZW50 UGx1Z2luID0gX2RlcmVxXygzKTsKK3ZhciBDaGFuZ2VFdmVudFBsdWdpbiA9IF9kZXJlcV8oNyk7 Cit2YXIgRGVmYXVsdEV2ZW50UGx1Z2luT3JkZXIgPSBfZGVyZXFfKDE0KTsKK3ZhciBFbnRlckxl YXZlRXZlbnRQbHVnaW4gPSBfZGVyZXFfKDE1KTsKK3ZhciBIVE1MRE9NUHJvcGVydHlDb25maWcg PSBfZGVyZXFfKDIxKTsKK3ZhciBSZWFjdENvbXBvbmVudEJyb3dzZXJFbnZpcm9ubWVudCA9IF9k ZXJlcV8oMjcpOwordmFyIFJlYWN0RE9NQ29tcG9uZW50ID0gX2RlcmVxXygzMCk7Cit2YXIgUmVh Y3RET01Db21wb25lbnRUcmVlID0gX2RlcmVxXygzMik7Cit2YXIgUmVhY3RET01FbXB0eUNvbXBv bmVudCA9IF9kZXJlcV8oMzQpOwordmFyIFJlYWN0RE9NVHJlZVRyYXZlcnNhbCA9IF9kZXJlcV8o NDQpOwordmFyIFJlYWN0RE9NVGV4dENvbXBvbmVudCA9IF9kZXJlcV8oNDIpOwordmFyIFJlYWN0 RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3kgPSBfZGVyZXFfKDQ2KTsKK3ZhciBSZWFjdEV2ZW50TGlz dGVuZXIgPSBfZGVyZXFfKDUyKTsKK3ZhciBSZWFjdEluamVjdGlvbiA9IF9kZXJlcV8oNTYpOwor dmFyIFJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24gPSBfZGVyZXFfKDY3KTsKK3ZhciBTVkdET01Q cm9wZXJ0eUNvbmZpZyA9IF9kZXJlcV8oNzcpOwordmFyIFNlbGVjdEV2ZW50UGx1Z2luID0gX2Rl cmVxXyg3OCk7Cit2YXIgU2ltcGxlRXZlbnRQbHVnaW4gPSBfZGVyZXFfKDc5KTsKKwordmFyIGFs cmVhZHlJbmplY3RlZCA9IGZhbHNlOworCitmdW5jdGlvbiBpbmplY3QoKSB7CisgIGlmIChhbHJl YWR5SW5qZWN0ZWQpIHsKKyAgICAvLyBUT0RPOiBUaGlzIGlzIGN1cnJlbnRseSB0cnVlIGJlY2F1 c2UgdGhlc2UgaW5qZWN0aW9ucyBhcmUgc2hhcmVkIGJldHdlZW4KKyAgICAvLyB0aGUgY2xpZW50 IGFuZCB0aGUgc2VydmVyIHBhY2thZ2UuIFRoZXkgc2hvdWxkIGJlIGJ1aWx0IGluZGVwZW5kZW50 bHkKKyAgICAvLyBhbmQgbm90IHNoYXJlIGFueSBpbmplY3Rpb24gc3RhdGUuIFRoZW4gdGhpcyBw cm9ibGVtIHdpbGwgYmUgc29sdmVkLgorICAgIHJldHVybjsKKyAgfQorICBhbHJlYWR5SW5qZWN0 ZWQgPSB0cnVlOworCisgIFJlYWN0SW5qZWN0aW9uLkV2ZW50RW1pdHRlci5pbmplY3RSZWFjdEV2 ZW50TGlzdGVuZXIoUmVhY3RFdmVudExpc3RlbmVyKTsKKworICAvKioKKyAgICogSW5qZWN0IG1v ZHVsZXMgZm9yIHJlc29sdmluZyBET00gaGllcmFyY2h5IGFuZCBwbHVnaW4gb3JkZXJpbmcuCisg ICAqLworICBSZWFjdEluamVjdGlvbi5FdmVudFBsdWdpbkh1Yi5pbmplY3RFdmVudFBsdWdpbk9y ZGVyKERlZmF1bHRFdmVudFBsdWdpbk9yZGVyKTsKKyAgUmVhY3RJbmplY3Rpb24uRXZlbnRQbHVn aW5VdGlscy5pbmplY3RDb21wb25lbnRUcmVlKFJlYWN0RE9NQ29tcG9uZW50VHJlZSk7CisgIFJl YWN0SW5qZWN0aW9uLkV2ZW50UGx1Z2luVXRpbHMuaW5qZWN0VHJlZVRyYXZlcnNhbChSZWFjdERP TVRyZWVUcmF2ZXJzYWwpOworCisgIC8qKgorICAgKiBTb21lIGltcG9ydGFudCBldmVudCBwbHVn aW5zIGluY2x1ZGVkIGJ5IGRlZmF1bHQgKHdpdGhvdXQgaGF2aW5nIHRvIHJlcXVpcmUKKyAgICog dGhlbSkuCisgICAqLworICBSZWFjdEluamVjdGlvbi5FdmVudFBsdWdpbkh1Yi5pbmplY3RFdmVu dFBsdWdpbnNCeU5hbWUoeworICAgIFNpbXBsZUV2ZW50UGx1Z2luOiBTaW1wbGVFdmVudFBsdWdp biwKKyAgICBFbnRlckxlYXZlRXZlbnRQbHVnaW46IEVudGVyTGVhdmVFdmVudFBsdWdpbiwKKyAg ICBDaGFuZ2VFdmVudFBsdWdpbjogQ2hhbmdlRXZlbnRQbHVnaW4sCisgICAgU2VsZWN0RXZlbnRQ bHVnaW46IFNlbGVjdEV2ZW50UGx1Z2luLAorICAgIEJlZm9yZUlucHV0RXZlbnRQbHVnaW46IEJl Zm9yZUlucHV0RXZlbnRQbHVnaW4KKyAgfSk7CisKKyAgUmVhY3RJbmplY3Rpb24uSG9zdENvbXBv bmVudC5pbmplY3RHZW5lcmljQ29tcG9uZW50Q2xhc3MoUmVhY3RET01Db21wb25lbnQpOworCisg IFJlYWN0SW5qZWN0aW9uLkhvc3RDb21wb25lbnQuaW5qZWN0VGV4dENvbXBvbmVudENsYXNzKFJl YWN0RE9NVGV4dENvbXBvbmVudCk7CisKKyAgUmVhY3RJbmplY3Rpb24uRE9NUHJvcGVydHkuaW5q ZWN0RE9NUHJvcGVydHlDb25maWcoQVJJQURPTVByb3BlcnR5Q29uZmlnKTsKKyAgUmVhY3RJbmpl Y3Rpb24uRE9NUHJvcGVydHkuaW5qZWN0RE9NUHJvcGVydHlDb25maWcoSFRNTERPTVByb3BlcnR5 Q29uZmlnKTsKKyAgUmVhY3RJbmplY3Rpb24uRE9NUHJvcGVydHkuaW5qZWN0RE9NUHJvcGVydHlD b25maWcoU1ZHRE9NUHJvcGVydHlDb25maWcpOworCisgIFJlYWN0SW5qZWN0aW9uLkVtcHR5Q29t cG9uZW50LmluamVjdEVtcHR5Q29tcG9uZW50RmFjdG9yeShmdW5jdGlvbiAoaW5zdGFudGlhdGUp IHsKKyAgICByZXR1cm4gbmV3IFJlYWN0RE9NRW1wdHlDb21wb25lbnQoaW5zdGFudGlhdGUpOwor ICB9KTsKKworICBSZWFjdEluamVjdGlvbi5VcGRhdGVzLmluamVjdFJlY29uY2lsZVRyYW5zYWN0 aW9uKFJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24pOworICBSZWFjdEluamVjdGlvbi5VcGRhdGVz LmluamVjdEJhdGNoaW5nU3RyYXRlZ3koUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVneSk7CisK KyAgUmVhY3RJbmplY3Rpb24uQ29tcG9uZW50LmluamVjdEVudmlyb25tZW50KFJlYWN0Q29tcG9u ZW50QnJvd3NlckVudmlyb25tZW50KTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSB7CisgIGluamVj dDogaW5qZWN0Cit9OworfSx7IjEiOjEsIjE0IjoxNCwiMTUiOjE1LCIyMSI6MjEsIjI3IjoyNywi MyI6MywiMzAiOjMwLCIzMiI6MzIsIjM0IjozNCwiNDIiOjQyLCI0NCI6NDQsIjQ2Ijo0NiwiNTIi OjUyLCI1NiI6NTYsIjY3Ijo2NywiNyI6NywiNzciOjc3LCI3OCI6NzgsIjc5Ijo3OX1dLDQ4Oltm dW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTQt cHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog VGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2Ug Zm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRo aXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMg Y2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5Lgor ICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKKworLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRh ZyB0aGUgUmVhY3RFbGVtZW50IHR5cGUuIElmIHRoZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2wKKy8v IG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5j ZS4KKwordmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlv bicgJiYgU3ltYm9sWydmb3InXSAmJiBTeW1ib2xbJ2ZvciddKCdyZWFjdC5lbGVtZW50JykgfHwg MHhlYWM3OworCittb2R1bGUuZXhwb3J0cyA9IFJFQUNUX0VMRU1FTlRfVFlQRTsKK30se31dLDQ5 OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIw MTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor ICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vu c2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9m IHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdo dHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5 LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBlbXB0eUNvbXBvbmVudEZhY3Rvcnk7 CisKK3ZhciBSZWFjdEVtcHR5Q29tcG9uZW50SW5qZWN0aW9uID0geworICBpbmplY3RFbXB0eUNv bXBvbmVudEZhY3Rvcnk6IGZ1bmN0aW9uIChmYWN0b3J5KSB7CisgICAgZW1wdHlDb21wb25lbnRG YWN0b3J5ID0gZmFjdG9yeTsKKyAgfQorfTsKKwordmFyIFJlYWN0RW1wdHlDb21wb25lbnQgPSB7 CisgIGNyZWF0ZTogZnVuY3Rpb24gKGluc3RhbnRpYXRlKSB7CisgICAgcmV0dXJuIGVtcHR5Q29t cG9uZW50RmFjdG9yeShpbnN0YW50aWF0ZSk7CisgIH0KK307CisKK1JlYWN0RW1wdHlDb21wb25l bnQuaW5qZWN0aW9uID0gUmVhY3RFbXB0eUNvbXBvbmVudEluamVjdGlvbjsKKworbW9kdWxlLmV4 cG9ydHMgPSBSZWFjdEVtcHR5Q29tcG9uZW50OworfSx7fV0sNTA6W2Z1bmN0aW9uKF9kZXJlcV8s bW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9v aywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2Rl IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAq IExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4g QW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4g dGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogCisgKi8KKwor J3VzZSBzdHJpY3QnOworCit2YXIgY2F1Z2h0RXJyb3IgPSBudWxsOworCisvKioKKyAqIENhbGwg YSBmdW5jdGlvbiB3aGlsZSBndWFyZGluZyBhZ2FpbnN0IGVycm9ycyB0aGF0IGhhcHBlbnMgd2l0 aGluIGl0LgorICoKKyAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIG9mIHRoZSBndWFyZCB0byB1c2Ug Zm9yIGxvZ2dpbmcgb3IgZGVidWdnaW5nCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBm dW5jdGlvbiB0byBpbnZva2UKKyAqIEBwYXJhbSB7Kn0gYSBGaXJzdCBhcmd1bWVudAorICogQHBh cmFtIHsqfSBiIFNlY29uZCBhcmd1bWVudAorICovCitmdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2Fs bGJhY2sobmFtZSwgZnVuYywgYSkgeworICB0cnkgeworICAgIGZ1bmMoYSk7CisgIH0gY2F0Y2gg KHgpIHsKKyAgICBpZiAoY2F1Z2h0RXJyb3IgPT09IG51bGwpIHsKKyAgICAgIGNhdWdodEVycm9y ID0geDsKKyAgICB9CisgIH0KK30KKwordmFyIFJlYWN0RXJyb3JVdGlscyA9IHsKKyAgaW52b2tl R3VhcmRlZENhbGxiYWNrOiBpbnZva2VHdWFyZGVkQ2FsbGJhY2ssCisKKyAgLyoqCisgICAqIElu dm9rZWQgYnkgUmVhY3RUZXN0VXRpbHMuU2ltdWxhdGUgc28gdGhhdCBhbnkgZXJyb3JzIHRocm93 biBieSB0aGUgZXZlbnQKKyAgICogaGFuZGxlciBhcmUgc3VyZSB0byBiZSByZXRocm93biBieSBy ZXRocm93Q2F1Z2h0RXJyb3IuCisgICAqLworICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tXaXRoQ2F0 Y2g6IGludm9rZUd1YXJkZWRDYWxsYmFjaywKKworICAvKioKKyAgICogRHVyaW5nIGV4ZWN1dGlv biBvZiBndWFyZGVkIGZ1bmN0aW9ucyB3ZSB3aWxsIGNhcHR1cmUgdGhlIGZpcnN0IGVycm9yIHdo aWNoCisgICAqIHdlIHdpbGwgcmV0aHJvdyB0byBiZSBoYW5kbGVkIGJ5IHRoZSB0b3AgbGV2ZWwg ZXJyb3IgaGFuZGxlci4KKyAgICovCisgIHJldGhyb3dDYXVnaHRFcnJvcjogZnVuY3Rpb24gKCkg eworICAgIGlmIChjYXVnaHRFcnJvcikgeworICAgICAgdmFyIGVycm9yID0gY2F1Z2h0RXJyb3I7 CisgICAgICBjYXVnaHRFcnJvciA9IG51bGw7CisgICAgICB0aHJvdyBlcnJvcjsKKyAgICB9Cisg IH0KK307CisKK2lmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgLyoqCisg ICAqIFRvIGhlbHAgZGV2ZWxvcG1lbnQgd2UgY2FuIGdldCBiZXR0ZXIgZGV2dG9vbHMgaW50ZWdy YXRpb24gYnkgc2ltdWxhdGluZyBhCisgICAqIHJlYWwgYnJvd3NlciBldmVudC4KKyAgICovCisg IGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRpc3Bh dGNoRXZlbnQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVk JyAmJiB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRXZlbnQgPT09ICdmdW5jdGlvbicpIHsKKyAgICB2 YXIgZmFrZU5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdyZWFjdCcpOworICAgIFJlYWN0 RXJyb3JVdGlscy5pbnZva2VHdWFyZGVkQ2FsbGJhY2sgPSBmdW5jdGlvbiAobmFtZSwgZnVuYywg YSkgeworICAgICAgdmFyIGJvdW5kRnVuYyA9IGZ1bmMuYmluZChudWxsLCBhKTsKKyAgICAgIHZh ciBldnRUeXBlID0gJ3JlYWN0LScgKyBuYW1lOworICAgICAgZmFrZU5vZGUuYWRkRXZlbnRMaXN0 ZW5lcihldnRUeXBlLCBib3VuZEZ1bmMsIGZhbHNlKTsKKyAgICAgIHZhciBldnQgPSBkb2N1bWVu dC5jcmVhdGVFdmVudCgnRXZlbnQnKTsKKyAgICAgIC8vICRGbG93Rml4TWUgaHR0cHM6Ly9naXRo dWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzIzMzYKKyAgICAgIGV2dC5pbml0RXZlbnQoZXZ0 VHlwZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgIGZha2VOb2RlLmRpc3BhdGNoRXZlbnQoZXZ0KTsK KyAgICAgIGZha2VOb2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZ0VHlwZSwgYm91bmRGdW5jLCBm YWxzZSk7CisgICAgfTsKKyAgfQorfQorCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0RXJyb3JVdGls czsKK30se31dLDUxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICog Q29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVz ZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNE LXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qg ZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9m IHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNh bWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBFdmVudFBsdWdp bkh1YiA9IF9kZXJlcV8oMTYpOworCitmdW5jdGlvbiBydW5FdmVudFF1ZXVlSW5CYXRjaChldmVu dHMpIHsKKyAgRXZlbnRQbHVnaW5IdWIuZW5xdWV1ZUV2ZW50cyhldmVudHMpOworICBFdmVudFBs dWdpbkh1Yi5wcm9jZXNzRXZlbnRRdWV1ZShmYWxzZSk7Cit9CisKK3ZhciBSZWFjdEV2ZW50RW1p dHRlck1peGluID0geworCisgIC8qKgorICAgKiBTdHJlYW1zIGEgZmlyZWQgdG9wLWxldmVsIGV2 ZW50IHRvIGBFdmVudFBsdWdpbkh1YmAgd2hlcmUgcGx1Z2lucyBoYXZlIHRoZQorICAgKiBvcHBv cnR1bml0eSB0byBjcmVhdGUgYFJlYWN0RXZlbnRgcyB0byBiZSBkaXNwYXRjaGVkLgorICAgKi8K KyAgaGFuZGxlVG9wTGV2ZWw6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5h dGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkgeworICAgIHZhciBldmVudHMgPSBFdmVudFBs dWdpbkh1Yi5leHRyYWN0RXZlbnRzKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZl bnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTsKKyAgICBydW5FdmVudFF1ZXVlSW5CYXRjaChldmVudHMp OworICB9Cit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0RXZlbnRFbWl0dGVyTWl4aW47Cit9 LHsiMTYiOjE2fV0sNTI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisg KiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyBy ZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBC U0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9v dCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICog b2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUg c2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9hc3NpZ24g PSBfZGVyZXFfKDE0OCk7CisKK3ZhciBFdmVudExpc3RlbmVyID0gX2RlcmVxXygxMjUpOwordmFy IEV4ZWN1dGlvbkVudmlyb25tZW50ID0gX2RlcmVxXygxMjYpOwordmFyIFBvb2xlZENsYXNzID0g X2RlcmVxXygyNCk7Cit2YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gX2RlcmVxXygzMik7Cit2 YXIgUmVhY3RVcGRhdGVzID0gX2RlcmVxXyg3NSk7CisKK3ZhciBnZXRFdmVudFRhcmdldCA9IF9k ZXJlcV8oMTA2KTsKK3ZhciBnZXRVbmJvdW5kZWRTY3JvbGxQb3NpdGlvbiA9IF9kZXJlcV8oMTM3 KTsKKworLyoqCisgKiBGaW5kIHRoZSBkZWVwZXN0IFJlYWN0IGNvbXBvbmVudCBjb21wbGV0ZWx5 IGNvbnRhaW5pbmcgdGhlIHJvb3Qgb2YgdGhlCisgKiBwYXNzZWQtaW4gaW5zdGFuY2UgKGZvciB1 c2Ugd2hlbiBlbnRpcmUgUmVhY3QgdHJlZXMgYXJlIG5lc3RlZCB3aXRoaW4gZWFjaAorICogb3Ro ZXIpLiBJZiBSZWFjdCB0cmVlcyBhcmUgbm90IG5lc3RlZCwgcmV0dXJucyBudWxsLgorICovCitm dW5jdGlvbiBmaW5kUGFyZW50KGluc3QpIHsKKyAgLy8gVE9ETzogSXQgbWF5IGJlIGEgZ29vZCBp ZGVhIHRvIGNhY2hlIHRoaXMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSBET00KKyAgLy8gdHJhdmVy c2FsLCBidXQgY2FjaGluZyBpcyBkaWZmaWN1bHQgdG8gZG8gY29ycmVjdGx5IHdpdGhvdXQgdXNp bmcgYQorICAvLyBtdXRhdGlvbiBvYnNlcnZlciB0byBsaXN0ZW4gZm9yIGFsbCBET00gY2hhbmdl cy4KKyAgd2hpbGUgKGluc3QuX2hvc3RQYXJlbnQpIHsKKyAgICBpbnN0ID0gaW5zdC5faG9zdFBh cmVudDsKKyAgfQorICB2YXIgcm9vdE5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9k ZUZyb21JbnN0YW5jZShpbnN0KTsKKyAgdmFyIGNvbnRhaW5lciA9IHJvb3ROb2RlLnBhcmVudE5v ZGU7CisgIHJldHVybiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Q2xvc2VzdEluc3RhbmNlRnJv bU5vZGUoY29udGFpbmVyKTsKK30KKworLy8gVXNlZCB0byBzdG9yZSBhbmNlc3RvciBoaWVyYXJj aHkgaW4gdG9wIGxldmVsIGNhbGxiYWNrCitmdW5jdGlvbiBUb3BMZXZlbENhbGxiYWNrQm9va0tl ZXBpbmcodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkgeworICB0aGlzLnRvcExldmVsVHlwZSA9 IHRvcExldmVsVHlwZTsKKyAgdGhpcy5uYXRpdmVFdmVudCA9IG5hdGl2ZUV2ZW50OworICB0aGlz LmFuY2VzdG9ycyA9IFtdOworfQorX2Fzc2lnbihUb3BMZXZlbENhbGxiYWNrQm9va0tlZXBpbmcu cHJvdG90eXBlLCB7CisgIGRlc3RydWN0b3I6IGZ1bmN0aW9uICgpIHsKKyAgICB0aGlzLnRvcExl dmVsVHlwZSA9IG51bGw7CisgICAgdGhpcy5uYXRpdmVFdmVudCA9IG51bGw7CisgICAgdGhpcy5h bmNlc3RvcnMubGVuZ3RoID0gMDsKKyAgfQorfSk7CitQb29sZWRDbGFzcy5hZGRQb29saW5nVG8o VG9wTGV2ZWxDYWxsYmFja0Jvb2tLZWVwaW5nLCBQb29sZWRDbGFzcy50d29Bcmd1bWVudFBvb2xl cik7CisKK2Z1bmN0aW9uIGhhbmRsZVRvcExldmVsSW1wbChib29rS2VlcGluZykgeworICB2YXIg bmF0aXZlRXZlbnRUYXJnZXQgPSBnZXRFdmVudFRhcmdldChib29rS2VlcGluZy5uYXRpdmVFdmVu dCk7CisgIHZhciB0YXJnZXRJbnN0ID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldENsb3Nlc3RJ bnN0YW5jZUZyb21Ob2RlKG5hdGl2ZUV2ZW50VGFyZ2V0KTsKKworICAvLyBMb29wIHRocm91Z2gg dGhlIGhpZXJhcmNoeSwgaW4gY2FzZSB0aGVyZSdzIGFueSBuZXN0ZWQgY29tcG9uZW50cy4KKyAg Ly8gSXQncyBpbXBvcnRhbnQgdGhhdCB3ZSBidWlsZCB0aGUgYXJyYXkgb2YgYW5jZXN0b3JzIGJl Zm9yZSBjYWxsaW5nIGFueQorICAvLyBldmVudCBoYW5kbGVycywgYmVjYXVzZSBldmVudCBoYW5k bGVycyBjYW4gbW9kaWZ5IHRoZSBET00sIGxlYWRpbmcgdG8KKyAgLy8gaW5jb25zaXN0ZW5jaWVz IHdpdGggUmVhY3RNb3VudCdzIG5vZGUgY2FjaGUuIFNlZSAjMTEwNS4KKyAgdmFyIGFuY2VzdG9y ID0gdGFyZ2V0SW5zdDsKKyAgZG8geworICAgIGJvb2tLZWVwaW5nLmFuY2VzdG9ycy5wdXNoKGFu Y2VzdG9yKTsKKyAgICBhbmNlc3RvciA9IGFuY2VzdG9yICYmIGZpbmRQYXJlbnQoYW5jZXN0b3Ip OworICB9IHdoaWxlIChhbmNlc3Rvcik7CisKKyAgZm9yICh2YXIgaSA9IDA7IGkgPCBib29rS2Vl cGluZy5hbmNlc3RvcnMubGVuZ3RoOyBpKyspIHsKKyAgICB0YXJnZXRJbnN0ID0gYm9va0tlZXBp bmcuYW5jZXN0b3JzW2ldOworICAgIFJlYWN0RXZlbnRMaXN0ZW5lci5faGFuZGxlVG9wTGV2ZWwo Ym9va0tlZXBpbmcudG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBib29rS2VlcGluZy5uYXRpdmVF dmVudCwgZ2V0RXZlbnRUYXJnZXQoYm9va0tlZXBpbmcubmF0aXZlRXZlbnQpKTsKKyAgfQorfQor CitmdW5jdGlvbiBzY3JvbGxWYWx1ZU1vbml0b3IoY2IpIHsKKyAgdmFyIHNjcm9sbFBvc2l0aW9u ID0gZ2V0VW5ib3VuZGVkU2Nyb2xsUG9zaXRpb24od2luZG93KTsKKyAgY2Ioc2Nyb2xsUG9zaXRp b24pOworfQorCit2YXIgUmVhY3RFdmVudExpc3RlbmVyID0geworICBfZW5hYmxlZDogdHJ1ZSwK KyAgX2hhbmRsZVRvcExldmVsOiBudWxsLAorCisgIFdJTkRPV19IQU5ETEU6IEV4ZWN1dGlvbkVu dmlyb25tZW50LmNhblVzZURPTSA/IHdpbmRvdyA6IG51bGwsCisKKyAgc2V0SGFuZGxlVG9wTGV2 ZWw6IGZ1bmN0aW9uIChoYW5kbGVUb3BMZXZlbCkgeworICAgIFJlYWN0RXZlbnRMaXN0ZW5lci5f aGFuZGxlVG9wTGV2ZWwgPSBoYW5kbGVUb3BMZXZlbDsKKyAgfSwKKworICBzZXRFbmFibGVkOiBm dW5jdGlvbiAoZW5hYmxlZCkgeworICAgIFJlYWN0RXZlbnRMaXN0ZW5lci5fZW5hYmxlZCA9ICEh ZW5hYmxlZDsKKyAgfSwKKworICBpc0VuYWJsZWQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4g UmVhY3RFdmVudExpc3RlbmVyLl9lbmFibGVkOworICB9LAorCisgIC8qKgorICAgKiBUcmFwcyB0 b3AtbGV2ZWwgZXZlbnRzIGJ5IHVzaW5nIGV2ZW50IGJ1YmJsaW5nLgorICAgKgorICAgKiBAcGFy YW0ge3N0cmluZ30gdG9wTGV2ZWxUeXBlIFJlY29yZCBmcm9tIGBFdmVudENvbnN0YW50c2AuCisg ICAqIEBwYXJhbSB7c3RyaW5nfSBoYW5kbGVyQmFzZU5hbWUgRXZlbnQgbmFtZSAoZS5nLiAiY2xp Y2siKS4KKyAgICogQHBhcmFtIHtvYmplY3R9IGVsZW1lbnQgRWxlbWVudCBvbiB3aGljaCB0byBh dHRhY2ggbGlzdGVuZXIuCisgICAqIEByZXR1cm4gez9vYmplY3R9IEFuIG9iamVjdCB3aXRoIGEg cmVtb3ZlIGZ1bmN0aW9uIHdoaWNoIHdpbGwgZm9yY2VmdWxseQorICAgKiAgICAgICAgICAgICAg ICAgIHJlbW92ZSB0aGUgbGlzdGVuZXIuCisgICAqIEBpbnRlcm5hbAorICAgKi8KKyAgdHJhcEJ1 YmJsZWRFdmVudDogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgaGFuZGxlckJhc2VOYW1lLCBlbGVt ZW50KSB7CisgICAgaWYgKCFlbGVtZW50KSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cisg ICAgcmV0dXJuIEV2ZW50TGlzdGVuZXIubGlzdGVuKGVsZW1lbnQsIGhhbmRsZXJCYXNlTmFtZSwg UmVhY3RFdmVudExpc3RlbmVyLmRpc3BhdGNoRXZlbnQuYmluZChudWxsLCB0b3BMZXZlbFR5cGUp KTsKKyAgfSwKKworICAvKioKKyAgICogVHJhcHMgYSB0b3AtbGV2ZWwgZXZlbnQgYnkgdXNpbmcg ZXZlbnQgY2FwdHVyaW5nLgorICAgKgorICAgKiBAcGFyYW0ge3N0cmluZ30gdG9wTGV2ZWxUeXBl IFJlY29yZCBmcm9tIGBFdmVudENvbnN0YW50c2AuCisgICAqIEBwYXJhbSB7c3RyaW5nfSBoYW5k bGVyQmFzZU5hbWUgRXZlbnQgbmFtZSAoZS5nLiAiY2xpY2siKS4KKyAgICogQHBhcmFtIHtvYmpl Y3R9IGVsZW1lbnQgRWxlbWVudCBvbiB3aGljaCB0byBhdHRhY2ggbGlzdGVuZXIuCisgICAqIEBy ZXR1cm4gez9vYmplY3R9IEFuIG9iamVjdCB3aXRoIGEgcmVtb3ZlIGZ1bmN0aW9uIHdoaWNoIHdp bGwgZm9yY2VmdWxseQorICAgKiAgICAgICAgICAgICAgICAgIHJlbW92ZSB0aGUgbGlzdGVuZXIu CisgICAqIEBpbnRlcm5hbAorICAgKi8KKyAgdHJhcENhcHR1cmVkRXZlbnQ6IGZ1bmN0aW9uICh0 b3BMZXZlbFR5cGUsIGhhbmRsZXJCYXNlTmFtZSwgZWxlbWVudCkgeworICAgIGlmICghZWxlbWVu dCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIHJldHVybiBFdmVudExpc3RlbmVy LmNhcHR1cmUoZWxlbWVudCwgaGFuZGxlckJhc2VOYW1lLCBSZWFjdEV2ZW50TGlzdGVuZXIuZGlz cGF0Y2hFdmVudC5iaW5kKG51bGwsIHRvcExldmVsVHlwZSkpOworICB9LAorCisgIG1vbml0b3JT Y3JvbGxWYWx1ZTogZnVuY3Rpb24gKHJlZnJlc2gpIHsKKyAgICB2YXIgY2FsbGJhY2sgPSBzY3Jv bGxWYWx1ZU1vbml0b3IuYmluZChudWxsLCByZWZyZXNoKTsKKyAgICBFdmVudExpc3RlbmVyLmxp c3Rlbih3aW5kb3csICdzY3JvbGwnLCBjYWxsYmFjayk7CisgIH0sCisKKyAgZGlzcGF0Y2hFdmVu dDogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpIHsKKyAgICBpZiAoIVJlYWN0 RXZlbnRMaXN0ZW5lci5fZW5hYmxlZCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZh ciBib29rS2VlcGluZyA9IFRvcExldmVsQ2FsbGJhY2tCb29rS2VlcGluZy5nZXRQb29sZWQodG9w TGV2ZWxUeXBlLCBuYXRpdmVFdmVudCk7CisgICAgdHJ5IHsKKyAgICAgIC8vIEV2ZW50IHF1ZXVl IGJlaW5nIHByb2Nlc3NlZCBpbiB0aGUgc2FtZSBjeWNsZSBhbGxvd3MKKyAgICAgIC8vIGBwcmV2 ZW50RGVmYXVsdGAuCisgICAgICBSZWFjdFVwZGF0ZXMuYmF0Y2hlZFVwZGF0ZXMoaGFuZGxlVG9w TGV2ZWxJbXBsLCBib29rS2VlcGluZyk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIFRvcExldmVs Q2FsbGJhY2tCb29rS2VlcGluZy5yZWxlYXNlKGJvb2tLZWVwaW5nKTsKKyAgICB9CisgIH0KK307 CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RFdmVudExpc3RlbmVyOworfSx7IjEwNiI6MTA2LCIx MjUiOjEyNSwiMTI2IjoxMjYsIjEzNyI6MTM3LCIxNDgiOjE0OCwiMjQiOjI0LCIzMiI6MzIsIjc1 Ijo3NX1dLDUzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29w eXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2 ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0 eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGly ZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBh dGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUg ZGlyZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFJlYWN0RmVh dHVyZUZsYWdzID0geworICAvLyBXaGVuIHRydWUsIGNhbGwgY29uc29sZS50aW1lKCkgYmVmb3Jl IGFuZCAudGltZUVuZCgpIGFmdGVyIGVhY2ggdG9wLWxldmVsCisgIC8vIHJlbmRlciAoYm90aCBp bml0aWFsIHJlbmRlcnMgYW5kIHVwZGF0ZXMpLiBVc2VmdWwgd2hlbiBsb29raW5nIGF0IHByb2Qt bW9kZQorICAvLyB0aW1lbGluZSBwcm9maWxlcyBpbiBDaHJvbWUsIGZvciBleGFtcGxlLgorICBs b2dUb3BMZXZlbFJlbmRlcnM6IGZhbHNlCit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0RmVh dHVyZUZsYWdzOworfSx7fV0sNTQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpewor LyoqCisgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJp Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVy IHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0 aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFu dAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBp biB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9w cm9kSW52YXJpYW50ID0gX2RlcmVxXygxMTYpOworCit2YXIgaW52YXJpYW50ID0gX2RlcmVxXygx NDApOworCit2YXIgZ2VuZXJpY0NvbXBvbmVudENsYXNzID0gbnVsbDsKK3ZhciB0ZXh0Q29tcG9u ZW50Q2xhc3MgPSBudWxsOworCit2YXIgUmVhY3RIb3N0Q29tcG9uZW50SW5qZWN0aW9uID0gewor ICAvLyBUaGlzIGFjY2VwdHMgYSBjbGFzcyB0aGF0IHJlY2VpdmVzIHRoZSB0YWcgc3RyaW5nLiBU aGlzIGlzIGEgY2F0Y2ggYWxsCisgIC8vIHRoYXQgY2FuIHJlbmRlciBhbnkga2luZCBvZiB0YWcu CisgIGluamVjdEdlbmVyaWNDb21wb25lbnRDbGFzczogZnVuY3Rpb24gKGNvbXBvbmVudENsYXNz KSB7CisgICAgZ2VuZXJpY0NvbXBvbmVudENsYXNzID0gY29tcG9uZW50Q2xhc3M7CisgIH0sCisg IC8vIFRoaXMgYWNjZXB0cyBhIHRleHQgY29tcG9uZW50IGNsYXNzIHRoYXQgdGFrZXMgdGhlIHRl eHQgc3RyaW5nIHRvIGJlCisgIC8vIHJlbmRlcmVkIGFzIHByb3BzLgorICBpbmplY3RUZXh0Q29t cG9uZW50Q2xhc3M6IGZ1bmN0aW9uIChjb21wb25lbnRDbGFzcykgeworICAgIHRleHRDb21wb25l bnRDbGFzcyA9IGNvbXBvbmVudENsYXNzOworICB9Cit9OworCisvKioKKyAqIEdldCBhIGhvc3Qg aW50ZXJuYWwgY29tcG9uZW50IGNsYXNzIGZvciBhIHNwZWNpZmljIHRhZy4KKyAqCisgKiBAcGFy YW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudCBUaGUgZWxlbWVudCB0byBjcmVhdGUuCisgKiBAcmV0 dXJuIHtmdW5jdGlvbn0gVGhlIGludGVybmFsIGNsYXNzIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLgor ICovCitmdW5jdGlvbiBjcmVhdGVJbnRlcm5hbENvbXBvbmVudChlbGVtZW50KSB7CisgICFnZW5l cmljQ29tcG9uZW50Q2xhc3MgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZh cmlhbnQoZmFsc2UsICdUaGVyZSBpcyBubyByZWdpc3RlcmVkIGNvbXBvbmVudCBmb3IgdGhlIHRh ZyAlcycsIGVsZW1lbnQudHlwZSkgOiBfcHJvZEludmFyaWFudCgnMTExJywgZWxlbWVudC50eXBl KSA6IHZvaWQgMDsKKyAgcmV0dXJuIG5ldyBnZW5lcmljQ29tcG9uZW50Q2xhc3MoZWxlbWVudCk7 Cit9CisKKy8qKgorICogQHBhcmFtIHtSZWFjdFRleHR9IHRleHQKKyAqIEByZXR1cm4ge1JlYWN0 Q29tcG9uZW50fQorICovCitmdW5jdGlvbiBjcmVhdGVJbnN0YW5jZUZvclRleHQodGV4dCkgewor ICByZXR1cm4gbmV3IHRleHRDb21wb25lbnRDbGFzcyh0ZXh0KTsKK30KKworLyoqCisgKiBAcGFy YW0ge1JlYWN0Q29tcG9uZW50fSBjb21wb25lbnQKKyAqIEByZXR1cm4ge2Jvb2xlYW59CisgKi8K K2Z1bmN0aW9uIGlzVGV4dENvbXBvbmVudChjb21wb25lbnQpIHsKKyAgcmV0dXJuIGNvbXBvbmVu dCBpbnN0YW5jZW9mIHRleHRDb21wb25lbnRDbGFzczsKK30KKwordmFyIFJlYWN0SG9zdENvbXBv bmVudCA9IHsKKyAgY3JlYXRlSW50ZXJuYWxDb21wb25lbnQ6IGNyZWF0ZUludGVybmFsQ29tcG9u ZW50LAorICBjcmVhdGVJbnN0YW5jZUZvclRleHQ6IGNyZWF0ZUluc3RhbmNlRm9yVGV4dCwKKyAg aXNUZXh0Q29tcG9uZW50OiBpc1RleHRDb21wb25lbnQsCisgIGluamVjdGlvbjogUmVhY3RIb3N0 Q29tcG9uZW50SW5qZWN0aW9uCit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0SG9zdENvbXBv bmVudDsKK30seyIxMTYiOjExNiwiMTQwIjoxNDB9XSw1NTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1 bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDE2LXByZXNlbnQsIEZhY2Vib29rLCBJ bmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMg bGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElD RU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBh ZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUg UEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisndXNl IHN0cmljdCc7CisKK3ZhciBoaXN0b3J5ID0gW107CisKK3ZhciBSZWFjdEhvc3RPcGVyYXRpb25I aXN0b3J5SG9vayA9IHsKKyAgb25Ib3N0T3BlcmF0aW9uOiBmdW5jdGlvbiAob3BlcmF0aW9uKSB7 CisgICAgaGlzdG9yeS5wdXNoKG9wZXJhdGlvbik7CisgIH0sCisgIGNsZWFySGlzdG9yeTogZnVu Y3Rpb24gKCkgeworICAgIGlmIChSZWFjdEhvc3RPcGVyYXRpb25IaXN0b3J5SG9vay5fcHJldmVu dENsZWFyaW5nKSB7CisgICAgICAvLyBTaG91bGQgb25seSBiZSB1c2VkIGZvciB0ZXN0cy4KKyAg ICAgIHJldHVybjsKKyAgICB9CisKKyAgICBoaXN0b3J5ID0gW107CisgIH0sCisgIGdldEhpc3Rv cnk6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gaGlzdG9yeTsKKyAgfQorfTsKKworbW9kdWxl LmV4cG9ydHMgPSBSZWFjdEhvc3RPcGVyYXRpb25IaXN0b3J5SG9vazsKK30se31dLDU2OltmdW5j dGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJl c2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhp cyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91 bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMg c291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2Fu IGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoK KyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBET01Qcm9wZXJ0eSA9IF9kZXJlcV8oMTEpOwor dmFyIEV2ZW50UGx1Z2luSHViID0gX2RlcmVxXygxNik7Cit2YXIgRXZlbnRQbHVnaW5VdGlscyA9 IF9kZXJlcV8oMTgpOwordmFyIFJlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQgPSBfZGVyZXFfKDI4 KTsKK3ZhciBSZWFjdEVtcHR5Q29tcG9uZW50ID0gX2RlcmVxXyg0OSk7Cit2YXIgUmVhY3RCcm93 c2VyRXZlbnRFbWl0dGVyID0gX2RlcmVxXygyNSk7Cit2YXIgUmVhY3RIb3N0Q29tcG9uZW50ID0g X2RlcmVxXyg1NCk7Cit2YXIgUmVhY3RVcGRhdGVzID0gX2RlcmVxXyg3NSk7CisKK3ZhciBSZWFj dEluamVjdGlvbiA9IHsKKyAgQ29tcG9uZW50OiBSZWFjdENvbXBvbmVudEVudmlyb25tZW50Lmlu amVjdGlvbiwKKyAgRE9NUHJvcGVydHk6IERPTVByb3BlcnR5LmluamVjdGlvbiwKKyAgRW1wdHlD b21wb25lbnQ6IFJlYWN0RW1wdHlDb21wb25lbnQuaW5qZWN0aW9uLAorICBFdmVudFBsdWdpbkh1 YjogRXZlbnRQbHVnaW5IdWIuaW5qZWN0aW9uLAorICBFdmVudFBsdWdpblV0aWxzOiBFdmVudFBs dWdpblV0aWxzLmluamVjdGlvbiwKKyAgRXZlbnRFbWl0dGVyOiBSZWFjdEJyb3dzZXJFdmVudEVt aXR0ZXIuaW5qZWN0aW9uLAorICBIb3N0Q29tcG9uZW50OiBSZWFjdEhvc3RDb21wb25lbnQuaW5q ZWN0aW9uLAorICBVcGRhdGVzOiBSZWFjdFVwZGF0ZXMuaW5qZWN0aW9uCit9OworCittb2R1bGUu ZXhwb3J0cyA9IFJlYWN0SW5qZWN0aW9uOworfSx7IjExIjoxMSwiMTYiOjE2LCIxOCI6MTgsIjI1 IjoyNSwiMjgiOjI4LCI0OSI6NDksIjU0Ijo1NCwiNzUiOjc1fV0sNTc6W2Z1bmN0aW9uKF9kZXJl cV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNl Ym9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBj b2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUK KyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJl ZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQg aW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1 c2Ugc3RyaWN0JzsKKwordmFyIFJlYWN0RE9NU2VsZWN0aW9uID0gX2RlcmVxXygzOSk7CisKK3Zh ciBjb250YWluc05vZGUgPSBfZGVyZXFfKDEyOSk7Cit2YXIgZm9jdXNOb2RlID0gX2RlcmVxXygx MzQpOwordmFyIGdldEFjdGl2ZUVsZW1lbnQgPSBfZGVyZXFfKDEzNSk7CisKK2Z1bmN0aW9uIGlz SW5Eb2N1bWVudChub2RlKSB7CisgIHJldHVybiBjb250YWluc05vZGUoZG9jdW1lbnQuZG9jdW1l bnRFbGVtZW50LCBub2RlKTsKK30KKworLyoqCisgKiBAUmVhY3RJbnB1dFNlbGVjdGlvbjogUmVh Y3QgaW5wdXQgc2VsZWN0aW9uIG1vZHVsZS4gQmFzZWQgb24gU2VsZWN0aW9uLmpzLAorICogYnV0 IG1vZGlmaWVkIHRvIGJlIHN1aXRhYmxlIGZvciByZWFjdCBhbmQgaGFzIGEgY291cGxlIG9mIGJ1 ZyBmaXhlcyAoZG9lc24ndAorICogYXNzdW1lIGJ1dHRvbnMgaGF2ZSByYW5nZSBzZWxlY3Rpb25z IGFsbG93ZWQpLgorICogSW5wdXQgc2VsZWN0aW9uIG1vZHVsZSBmb3IgUmVhY3QuCisgKi8KK3Zh ciBSZWFjdElucHV0U2VsZWN0aW9uID0geworCisgIGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllczog ZnVuY3Rpb24gKGVsZW0pIHsKKyAgICB2YXIgbm9kZU5hbWUgPSBlbGVtICYmIGVsZW0ubm9kZU5h bWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOworICAgIHJldHVybiBub2RlTmFtZSAm JiAobm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgZWxlbS50eXBlID09PSAndGV4dCcgfHwgbm9kZU5h bWUgPT09ICd0ZXh0YXJlYScgfHwgZWxlbS5jb250ZW50RWRpdGFibGUgPT09ICd0cnVlJyk7Cisg IH0sCisKKyAgZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb246IGZ1bmN0aW9uICgpIHsKKyAgICB2YXIg Zm9jdXNlZEVsZW0gPSBnZXRBY3RpdmVFbGVtZW50KCk7CisgICAgcmV0dXJuIHsKKyAgICAgIGZv Y3VzZWRFbGVtOiBmb2N1c2VkRWxlbSwKKyAgICAgIHNlbGVjdGlvblJhbmdlOiBSZWFjdElucHV0 U2VsZWN0aW9uLmhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhmb2N1c2VkRWxlbSkgPyBSZWFjdElu cHV0U2VsZWN0aW9uLmdldFNlbGVjdGlvbihmb2N1c2VkRWxlbSkgOiBudWxsCisgICAgfTsKKyAg fSwKKworICAvKioKKyAgICogQHJlc3RvcmVTZWxlY3Rpb246IElmIGFueSBzZWxlY3Rpb24gaW5m b3JtYXRpb24gd2FzIHBvdGVudGlhbGx5IGxvc3QsCisgICAqIHJlc3RvcmUgaXQuIFRoaXMgaXMg dXNlZnVsIHdoZW4gcGVyZm9ybWluZyBvcGVyYXRpb25zIHRoYXQgY291bGQgcmVtb3ZlIGRvbQor ICAgKiBub2RlcyBhbmQgcGxhY2UgdGhlbSBiYWNrIGluLCByZXN1bHRpbmcgaW4gZm9jdXMgYmVp bmcgbG9zdC4KKyAgICovCisgIHJlc3RvcmVTZWxlY3Rpb246IGZ1bmN0aW9uIChwcmlvclNlbGVj dGlvbkluZm9ybWF0aW9uKSB7CisgICAgdmFyIGN1ckZvY3VzZWRFbGVtID0gZ2V0QWN0aXZlRWxl bWVudCgpOworICAgIHZhciBwcmlvckZvY3VzZWRFbGVtID0gcHJpb3JTZWxlY3Rpb25JbmZvcm1h dGlvbi5mb2N1c2VkRWxlbTsKKyAgICB2YXIgcHJpb3JTZWxlY3Rpb25SYW5nZSA9IHByaW9yU2Vs ZWN0aW9uSW5mb3JtYXRpb24uc2VsZWN0aW9uUmFuZ2U7CisgICAgaWYgKGN1ckZvY3VzZWRFbGVt ICE9PSBwcmlvckZvY3VzZWRFbGVtICYmIGlzSW5Eb2N1bWVudChwcmlvckZvY3VzZWRFbGVtKSkg eworICAgICAgaWYgKFJlYWN0SW5wdXRTZWxlY3Rpb24uaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVz KHByaW9yRm9jdXNlZEVsZW0pKSB7CisgICAgICAgIFJlYWN0SW5wdXRTZWxlY3Rpb24uc2V0U2Vs ZWN0aW9uKHByaW9yRm9jdXNlZEVsZW0sIHByaW9yU2VsZWN0aW9uUmFuZ2UpOworICAgICAgfQor ICAgICAgZm9jdXNOb2RlKHByaW9yRm9jdXNlZEVsZW0pOworICAgIH0KKyAgfSwKKworICAvKioK KyAgICogQGdldFNlbGVjdGlvbjogR2V0cyB0aGUgc2VsZWN0aW9uIGJvdW5kcyBvZiBhIGZvY3Vz ZWQgdGV4dGFyZWEsIGlucHV0IG9yCisgICAqIGNvbnRlbnRFZGl0YWJsZSBub2RlLgorICAgKiAt QGlucHV0OiBMb29rIHVwIHNlbGVjdGlvbiBib3VuZHMgb2YgdGhpcyBpbnB1dAorICAgKiAtQHJl dHVybiB7c3RhcnQ6IHNlbGVjdGlvblN0YXJ0LCBlbmQ6IHNlbGVjdGlvbkVuZH0KKyAgICovCisg IGdldFNlbGVjdGlvbjogZnVuY3Rpb24gKGlucHV0KSB7CisgICAgdmFyIHNlbGVjdGlvbjsKKwor ICAgIGlmICgnc2VsZWN0aW9uU3RhcnQnIGluIGlucHV0KSB7CisgICAgICAvLyBNb2Rlcm4gYnJv d3NlciB3aXRoIGlucHV0IG9yIHRleHRhcmVhLgorICAgICAgc2VsZWN0aW9uID0geworICAgICAg ICBzdGFydDogaW5wdXQuc2VsZWN0aW9uU3RhcnQsCisgICAgICAgIGVuZDogaW5wdXQuc2VsZWN0 aW9uRW5kCisgICAgICB9OworICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQuc2VsZWN0aW9uICYmIGlu cHV0Lm5vZGVOYW1lICYmIGlucHV0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcp IHsKKyAgICAgIC8vIElFOCBpbnB1dC4KKyAgICAgIHZhciByYW5nZSA9IGRvY3VtZW50LnNlbGVj dGlvbi5jcmVhdGVSYW5nZSgpOworICAgICAgLy8gVGhlcmUgY2FuIG9ubHkgYmUgb25lIHNlbGVj dGlvbiBwZXIgZG9jdW1lbnQgaW4gSUUsIHNvIGl0IG11c3QKKyAgICAgIC8vIGJlIGluIG91ciBl bGVtZW50LgorICAgICAgaWYgKHJhbmdlLnBhcmVudEVsZW1lbnQoKSA9PT0gaW5wdXQpIHsKKyAg ICAgICAgc2VsZWN0aW9uID0geworICAgICAgICAgIHN0YXJ0OiAtcmFuZ2UubW92ZVN0YXJ0KCdj aGFyYWN0ZXInLCAtaW5wdXQudmFsdWUubGVuZ3RoKSwKKyAgICAgICAgICBlbmQ6IC1yYW5nZS5t b3ZlRW5kKCdjaGFyYWN0ZXInLCAtaW5wdXQudmFsdWUubGVuZ3RoKQorICAgICAgICB9OworICAg ICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBDb250ZW50IGVkaXRhYmxlIG9yIG9sZCBJRSB0 ZXh0YXJlYS4KKyAgICAgIHNlbGVjdGlvbiA9IFJlYWN0RE9NU2VsZWN0aW9uLmdldE9mZnNldHMo aW5wdXQpOworICAgIH0KKworICAgIHJldHVybiBzZWxlY3Rpb24gfHwgeyBzdGFydDogMCwgZW5k OiAwIH07CisgIH0sCisKKyAgLyoqCisgICAqIEBzZXRTZWxlY3Rpb246IFNldHMgdGhlIHNlbGVj dGlvbiBib3VuZHMgb2YgYSB0ZXh0YXJlYSBvciBpbnB1dCBhbmQgZm9jdXNlcworICAgKiB0aGUg aW5wdXQuCisgICAqIC1AaW5wdXQgICAgIFNldCBzZWxlY3Rpb24gYm91bmRzIG9mIHRoaXMgaW5w dXQgb3IgdGV4dGFyZWEKKyAgICogLUBvZmZzZXRzICAgT2JqZWN0IG9mIHNhbWUgZm9ybSB0aGF0 IGlzIHJldHVybmVkIGZyb20gZ2V0KgorICAgKi8KKyAgc2V0U2VsZWN0aW9uOiBmdW5jdGlvbiAo aW5wdXQsIG9mZnNldHMpIHsKKyAgICB2YXIgc3RhcnQgPSBvZmZzZXRzLnN0YXJ0OworICAgIHZh ciBlbmQgPSBvZmZzZXRzLmVuZDsKKyAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHsKKyAgICAg IGVuZCA9IHN0YXJ0OworICAgIH0KKworICAgIGlmICgnc2VsZWN0aW9uU3RhcnQnIGluIGlucHV0 KSB7CisgICAgICBpbnB1dC5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0OworICAgICAgaW5wdXQuc2Vs ZWN0aW9uRW5kID0gTWF0aC5taW4oZW5kLCBpbnB1dC52YWx1ZS5sZW5ndGgpOworICAgIH0gZWxz ZSBpZiAoZG9jdW1lbnQuc2VsZWN0aW9uICYmIGlucHV0Lm5vZGVOYW1lICYmIGlucHV0Lm5vZGVO YW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcpIHsKKyAgICAgIHZhciByYW5nZSA9IGlucHV0 LmNyZWF0ZVRleHRSYW5nZSgpOworICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7CisgICAgICBy YW5nZS5tb3ZlU3RhcnQoJ2NoYXJhY3RlcicsIHN0YXJ0KTsKKyAgICAgIHJhbmdlLm1vdmVFbmQo J2NoYXJhY3RlcicsIGVuZCAtIHN0YXJ0KTsKKyAgICAgIHJhbmdlLnNlbGVjdCgpOworICAgIH0g ZWxzZSB7CisgICAgICBSZWFjdERPTVNlbGVjdGlvbi5zZXRPZmZzZXRzKGlucHV0LCBvZmZzZXRz KTsKKyAgICB9CisgIH0KK307CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RJbnB1dFNlbGVjdGlv bjsKK30seyIxMjkiOjEyOSwiMTM0IjoxMzQsIjEzNSI6MTM1LCIzOSI6Mzl9XSw1ODpbZnVuY3Rp b24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNl bnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMg c291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5k IGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNv dXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBi ZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisg Ki8KKworJ3VzZSBzdHJpY3QnOworCisvKioKKyAqIGBSZWFjdEluc3RhbmNlTWFwYCBtYWludGFp bnMgYSBtYXBwaW5nIGZyb20gYSBwdWJsaWMgZmFjaW5nIHN0YXRlZnVsCisgKiBpbnN0YW5jZSAo a2V5KSBhbmQgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uICh2YWx1ZSkuIFRoaXMgYWxsb3dz IHB1YmxpYworICogbWV0aG9kcyB0byBhY2NlcHQgdGhlIHVzZXIgZmFjaW5nIGluc3RhbmNlIGFz IGFuIGFyZ3VtZW50IGFuZCBtYXAgdGhlbSBiYWNrCisgKiB0byBpbnRlcm5hbCBtZXRob2RzLgor ICovCisKKy8vIFRPRE86IFJlcGxhY2UgdGhpcyB3aXRoIEVTNjogdmFyIFJlYWN0SW5zdGFuY2VN YXAgPSBuZXcgTWFwKCk7CisKK3ZhciBSZWFjdEluc3RhbmNlTWFwID0geworCisgIC8qKgorICAg KiBUaGlzIEFQSSBzaG91bGQgYmUgY2FsbGVkIGBkZWxldGVgIGJ1dCB3ZSdkIGhhdmUgdG8gbWFr ZSBzdXJlIHRvIGFsd2F5cworICAgKiB0cmFuc2Zvcm0gdGhlc2UgdG8gc3RyaW5ncyBmb3IgSUUg c3VwcG9ydC4gV2hlbiB0aGlzIHRyYW5zZm9ybSBpcyBmdWxseQorICAgKiBzdXBwb3J0ZWQgd2Ug Y2FuIHJlbmFtZSBpdC4KKyAgICovCisgIHJlbW92ZTogZnVuY3Rpb24gKGtleSkgeworICAgIGtl eS5fcmVhY3RJbnRlcm5hbEluc3RhbmNlID0gdW5kZWZpbmVkOworICB9LAorCisgIGdldDogZnVu Y3Rpb24gKGtleSkgeworICAgIHJldHVybiBrZXkuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZTsKKyAg fSwKKworICBoYXM6IGZ1bmN0aW9uIChrZXkpIHsKKyAgICByZXR1cm4ga2V5Ll9yZWFjdEludGVy bmFsSW5zdGFuY2UgIT09IHVuZGVmaW5lZDsKKyAgfSwKKworICBzZXQ6IGZ1bmN0aW9uIChrZXks IHZhbHVlKSB7CisgICAga2V5Ll9yZWFjdEludGVybmFsSW5zdGFuY2UgPSB2YWx1ZTsKKyAgfQor Cit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0SW5zdGFuY2VNYXA7Cit9LHt9XSw1OTpbZnVu Y3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDE2LXBy ZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRo aXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZv dW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlz IHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNh biBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAq CisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisKKy8vIFRydXN0IHRoZSBkZXZlbG9wZXIgdG8g b25seSB1c2UgUmVhY3RJbnN0cnVtZW50YXRpb24gd2l0aCBhIF9fREVWX18gY2hlY2sKKwordmFy IGRlYnVnVG9vbCA9IG51bGw7CisKK2lmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicp IHsKKyAgdmFyIFJlYWN0RGVidWdUb29sID0gX2RlcmVxXyg0NSk7CisgIGRlYnVnVG9vbCA9IFJl YWN0RGVidWdUb29sOworfQorCittb2R1bGUuZXhwb3J0cyA9IHsgZGVidWdUb29sOiBkZWJ1Z1Rv b2wgfTsKK30seyI0NSI6NDV9XSw2MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7 CisvKioKKyAqIENvcHlyaWdodCAyMDE2LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwg cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5k ZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGlu IHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdy YW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxl IGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisK K3ZhciB3YXJuaW5nID0gX2RlcmVxXygxNDcpOworCitpZiAoImRldmVsb3BtZW50IiAhPT0gJ3By b2R1Y3Rpb24nKSB7CisgIHZhciBwcm9jZXNzaW5nQ2hpbGRDb250ZXh0ID0gZmFsc2U7CisKKyAg dmFyIHdhcm5JbnZhbGlkU2V0U3RhdGUgPSBmdW5jdGlvbiAoKSB7CisgICAgImRldmVsb3BtZW50 IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghcHJvY2Vzc2luZ0NoaWxkQ29udGV4dCwgJ3Nl dFN0YXRlKC4uLik6IENhbm5vdCBjYWxsIHNldFN0YXRlKCkgaW5zaWRlIGdldENoaWxkQ29udGV4 dCgpJykgOiB2b2lkIDA7CisgIH07Cit9CisKK3ZhciBSZWFjdEludmFsaWRTZXRTdGF0ZVdhcm5p bmdIb29rID0geworICBvbkJlZ2luUHJvY2Vzc2luZ0NoaWxkQ29udGV4dDogZnVuY3Rpb24gKCkg eworICAgIHByb2Nlc3NpbmdDaGlsZENvbnRleHQgPSB0cnVlOworICB9LAorICBvbkVuZFByb2Nl c3NpbmdDaGlsZENvbnRleHQ6IGZ1bmN0aW9uICgpIHsKKyAgICBwcm9jZXNzaW5nQ2hpbGRDb250 ZXh0ID0gZmFsc2U7CisgIH0sCisgIG9uU2V0U3RhdGU6IGZ1bmN0aW9uICgpIHsKKyAgICB3YXJu SW52YWxpZFNldFN0YXRlKCk7CisgIH0KK307CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RJbnZh bGlkU2V0U3RhdGVXYXJuaW5nSG9vazsKK30seyIxNDciOjE0N31dLDYxOltmdW5jdGlvbihfZGVy ZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFj ZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2Ug Y29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhl CisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRy ZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5k IGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisn dXNlIHN0cmljdCc7CisKK3ZhciBhZGxlcjMyID0gX2RlcmVxXyg5Nik7CisKK3ZhciBUQUdfRU5E ID0gL1wvPz4vOwordmFyIENPTU1FTlRfU1RBUlQgPSAvXjxcIVwtXC0vOworCit2YXIgUmVhY3RN YXJrdXBDaGVja3N1bSA9IHsKKyAgQ0hFQ0tTVU1fQVRUUl9OQU1FOiAnZGF0YS1yZWFjdC1jaGVj a3N1bScsCisKKyAgLyoqCisgICAqIEBwYXJhbSB7c3RyaW5nfSBtYXJrdXAgTWFya3VwIHN0cmlu ZworICAgKiBAcmV0dXJuIHtzdHJpbmd9IE1hcmt1cCBzdHJpbmcgd2l0aCBjaGVja3N1bSBhdHRy aWJ1dGUgYXR0YWNoZWQKKyAgICovCisgIGFkZENoZWNrc3VtVG9NYXJrdXA6IGZ1bmN0aW9uICht YXJrdXApIHsKKyAgICB2YXIgY2hlY2tzdW0gPSBhZGxlcjMyKG1hcmt1cCk7CisKKyAgICAvLyBB ZGQgY2hlY2tzdW0gKGhhbmRsZSBib3RoIHBhcmVudCB0YWdzLCBjb21tZW50cyBhbmQgc2VsZi1j bG9zaW5nIHRhZ3MpCisgICAgaWYgKENPTU1FTlRfU1RBUlQudGVzdChtYXJrdXApKSB7CisgICAg ICByZXR1cm4gbWFya3VwOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbWFya3VwLnJlcGxh Y2UoVEFHX0VORCwgJyAnICsgUmVhY3RNYXJrdXBDaGVja3N1bS5DSEVDS1NVTV9BVFRSX05BTUUg KyAnPSInICsgY2hlY2tzdW0gKyAnIiQmJyk7CisgICAgfQorICB9LAorCisgIC8qKgorICAgKiBA cGFyYW0ge3N0cmluZ30gbWFya3VwIHRvIHVzZQorICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGVs ZW1lbnQgcm9vdCBSZWFjdCBlbGVtZW50CisgICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVy IG9yIG5vdCB0aGUgbWFya3VwIGlzIHRoZSBzYW1lCisgICAqLworICBjYW5SZXVzZU1hcmt1cDog ZnVuY3Rpb24gKG1hcmt1cCwgZWxlbWVudCkgeworICAgIHZhciBleGlzdGluZ0NoZWNrc3VtID0g ZWxlbWVudC5nZXRBdHRyaWJ1dGUoUmVhY3RNYXJrdXBDaGVja3N1bS5DSEVDS1NVTV9BVFRSX05B TUUpOworICAgIGV4aXN0aW5nQ2hlY2tzdW0gPSBleGlzdGluZ0NoZWNrc3VtICYmIHBhcnNlSW50 KGV4aXN0aW5nQ2hlY2tzdW0sIDEwKTsKKyAgICB2YXIgbWFya3VwQ2hlY2tzdW0gPSBhZGxlcjMy KG1hcmt1cCk7CisgICAgcmV0dXJuIG1hcmt1cENoZWNrc3VtID09PSBleGlzdGluZ0NoZWNrc3Vt OworICB9Cit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0TWFya3VwQ2hlY2tzdW07Cit9LHsi OTYiOjk2fV0sNjI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBD b3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNl cnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qt c3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBk aXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2Yg cGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2Ft ZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9wcm9kSW52YXJp YW50ID0gX2RlcmVxXygxMTYpOworCit2YXIgUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudCA9IF9k ZXJlcV8oMjgpOwordmFyIFJlYWN0SW5zdGFuY2VNYXAgPSBfZGVyZXFfKDU4KTsKK3ZhciBSZWFj dEluc3RydW1lbnRhdGlvbiA9IF9kZXJlcV8oNTkpOworCit2YXIgUmVhY3RDdXJyZW50T3duZXIg PSBfZGVyZXFfKDEyMyk7Cit2YXIgUmVhY3RSZWNvbmNpbGVyID0gX2RlcmVxXyg2OCk7Cit2YXIg UmVhY3RDaGlsZFJlY29uY2lsZXIgPSBfZGVyZXFfKDI2KTsKKwordmFyIGVtcHR5RnVuY3Rpb24g PSBfZGVyZXFfKDEzMik7Cit2YXIgZmxhdHRlbkNoaWxkcmVuID0gX2RlcmVxXygxMDEpOwordmFy IGludmFyaWFudCA9IF9kZXJlcV8oMTQwKTsKKworLyoqCisgKiBNYWtlIGFuIHVwZGF0ZSBmb3Ig bWFya3VwIHRvIGJlIHJlbmRlcmVkIGFuZCBpbnNlcnRlZCBhdCBhIHN1cHBsaWVkIGluZGV4Lgor ICoKKyAqIEBwYXJhbSB7c3RyaW5nfSBtYXJrdXAgTWFya3VwIHRoYXQgcmVuZGVycyBpbnRvIGFu IGVsZW1lbnQuCisgKiBAcGFyYW0ge251bWJlcn0gdG9JbmRleCBEZXN0aW5hdGlvbiBpbmRleC4K KyAqIEBwcml2YXRlCisgKi8KK2Z1bmN0aW9uIG1ha2VJbnNlcnRNYXJrdXAobWFya3VwLCBhZnRl ck5vZGUsIHRvSW5kZXgpIHsKKyAgLy8gTk9URTogTnVsbCB2YWx1ZXMgcmVkdWNlIGhpZGRlbiBj bGFzc2VzLgorICByZXR1cm4geworICAgIHR5cGU6ICdJTlNFUlRfTUFSS1VQJywKKyAgICBjb250 ZW50OiBtYXJrdXAsCisgICAgZnJvbUluZGV4OiBudWxsLAorICAgIGZyb21Ob2RlOiBudWxsLAor ICAgIHRvSW5kZXg6IHRvSW5kZXgsCisgICAgYWZ0ZXJOb2RlOiBhZnRlck5vZGUKKyAgfTsKK30K KworLyoqCisgKiBNYWtlIGFuIHVwZGF0ZSBmb3IgbW92aW5nIGFuIGV4aXN0aW5nIGVsZW1lbnQg dG8gYW5vdGhlciBpbmRleC4KKyAqCisgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFNvdXJj ZSBpbmRleCBvZiB0aGUgZXhpc3RpbmcgZWxlbWVudC4KKyAqIEBwYXJhbSB7bnVtYmVyfSB0b0lu ZGV4IERlc3RpbmF0aW9uIGluZGV4IG9mIHRoZSBlbGVtZW50LgorICogQHByaXZhdGUKKyAqLwor ZnVuY3Rpb24gbWFrZU1vdmUoY2hpbGQsIGFmdGVyTm9kZSwgdG9JbmRleCkgeworICAvLyBOT1RF OiBOdWxsIHZhbHVlcyByZWR1Y2UgaGlkZGVuIGNsYXNzZXMuCisgIHJldHVybiB7CisgICAgdHlw ZTogJ01PVkVfRVhJU1RJTkcnLAorICAgIGNvbnRlbnQ6IG51bGwsCisgICAgZnJvbUluZGV4OiBj aGlsZC5fbW91bnRJbmRleCwKKyAgICBmcm9tTm9kZTogUmVhY3RSZWNvbmNpbGVyLmdldEhvc3RO b2RlKGNoaWxkKSwKKyAgICB0b0luZGV4OiB0b0luZGV4LAorICAgIGFmdGVyTm9kZTogYWZ0ZXJO b2RlCisgIH07Cit9CisKKy8qKgorICogTWFrZSBhbiB1cGRhdGUgZm9yIHJlbW92aW5nIGFuIGVs ZW1lbnQgYXQgYW4gaW5kZXguCisgKgorICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBJbmRl eCBvZiB0aGUgZWxlbWVudCB0byByZW1vdmUuCisgKiBAcHJpdmF0ZQorICovCitmdW5jdGlvbiBt YWtlUmVtb3ZlKGNoaWxkLCBub2RlKSB7CisgIC8vIE5PVEU6IE51bGwgdmFsdWVzIHJlZHVjZSBo aWRkZW4gY2xhc3Nlcy4KKyAgcmV0dXJuIHsKKyAgICB0eXBlOiAnUkVNT1ZFX05PREUnLAorICAg IGNvbnRlbnQ6IG51bGwsCisgICAgZnJvbUluZGV4OiBjaGlsZC5fbW91bnRJbmRleCwKKyAgICBm cm9tTm9kZTogbm9kZSwKKyAgICB0b0luZGV4OiBudWxsLAorICAgIGFmdGVyTm9kZTogbnVsbAor ICB9OworfQorCisvKioKKyAqIE1ha2UgYW4gdXBkYXRlIGZvciBzZXR0aW5nIHRoZSBtYXJrdXAg b2YgYSBub2RlLgorICoKKyAqIEBwYXJhbSB7c3RyaW5nfSBtYXJrdXAgTWFya3VwIHRoYXQgcmVu ZGVycyBpbnRvIGFuIGVsZW1lbnQuCisgKiBAcHJpdmF0ZQorICovCitmdW5jdGlvbiBtYWtlU2V0 TWFya3VwKG1hcmt1cCkgeworICAvLyBOT1RFOiBOdWxsIHZhbHVlcyByZWR1Y2UgaGlkZGVuIGNs YXNzZXMuCisgIHJldHVybiB7CisgICAgdHlwZTogJ1NFVF9NQVJLVVAnLAorICAgIGNvbnRlbnQ6 IG1hcmt1cCwKKyAgICBmcm9tSW5kZXg6IG51bGwsCisgICAgZnJvbU5vZGU6IG51bGwsCisgICAg dG9JbmRleDogbnVsbCwKKyAgICBhZnRlck5vZGU6IG51bGwKKyAgfTsKK30KKworLyoqCisgKiBN YWtlIGFuIHVwZGF0ZSBmb3Igc2V0dGluZyB0aGUgdGV4dCBjb250ZW50LgorICoKKyAqIEBwYXJh bSB7c3RyaW5nfSB0ZXh0Q29udGVudCBUZXh0IGNvbnRlbnQgdG8gc2V0LgorICogQHByaXZhdGUK KyAqLworZnVuY3Rpb24gbWFrZVRleHRDb250ZW50KHRleHRDb250ZW50KSB7CisgIC8vIE5PVEU6 IE51bGwgdmFsdWVzIHJlZHVjZSBoaWRkZW4gY2xhc3Nlcy4KKyAgcmV0dXJuIHsKKyAgICB0eXBl OiAnVEVYVF9DT05URU5UJywKKyAgICBjb250ZW50OiB0ZXh0Q29udGVudCwKKyAgICBmcm9tSW5k ZXg6IG51bGwsCisgICAgZnJvbU5vZGU6IG51bGwsCisgICAgdG9JbmRleDogbnVsbCwKKyAgICBh ZnRlck5vZGU6IG51bGwKKyAgfTsKK30KKworLyoqCisgKiBQdXNoIGFuIHVwZGF0ZSwgaWYgYW55 LCBvbnRvIHRoZSBxdWV1ZS4gQ3JlYXRlcyBhIG5ldyBxdWV1ZSBpZiBub25lIGlzCisgKiBwYXNz ZWQgYW5kIGFsd2F5cyByZXR1cm5zIHRoZSBxdWV1ZS4gTXV0YXRpdmUuCisgKi8KK2Z1bmN0aW9u IGVucXVldWUocXVldWUsIHVwZGF0ZSkgeworICBpZiAodXBkYXRlKSB7CisgICAgcXVldWUgPSBx dWV1ZSB8fCBbXTsKKyAgICBxdWV1ZS5wdXNoKHVwZGF0ZSk7CisgIH0KKyAgcmV0dXJuIHF1ZXVl OworfQorCisvKioKKyAqIFByb2Nlc3NlcyBhbnkgZW5xdWV1ZWQgdXBkYXRlcy4KKyAqCisgKiBA cHJpdmF0ZQorICovCitmdW5jdGlvbiBwcm9jZXNzUXVldWUoaW5zdCwgdXBkYXRlUXVldWUpIHsK KyAgUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudC5wcm9jZXNzQ2hpbGRyZW5VcGRhdGVzKGluc3Qs IHVwZGF0ZVF1ZXVlKTsKK30KKwordmFyIHNldENoaWxkcmVuRm9ySW5zdHJ1bWVudGF0aW9uID0g ZW1wdHlGdW5jdGlvbjsKK2lmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAg dmFyIGdldERlYnVnSUQgPSBmdW5jdGlvbiAoaW5zdCkgeworICAgIGlmICghaW5zdC5fZGVidWdJ RCkgeworICAgICAgLy8gQ2hlY2sgZm9yIEFSVC1saWtlIGluc3RhbmNlcy4gVE9ETzogVGhpcyBp cyBzaWxseS9ncm9zcy4KKyAgICAgIHZhciBpbnRlcm5hbDsKKyAgICAgIGlmIChpbnRlcm5hbCA9 IFJlYWN0SW5zdGFuY2VNYXAuZ2V0KGluc3QpKSB7CisgICAgICAgIGluc3QgPSBpbnRlcm5hbDsK KyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGluc3QuX2RlYnVnSUQ7CisgIH07CisgIHNldENo aWxkcmVuRm9ySW5zdHJ1bWVudGF0aW9uID0gZnVuY3Rpb24gKGNoaWxkcmVuKSB7CisgICAgdmFy IGRlYnVnSUQgPSBnZXREZWJ1Z0lEKHRoaXMpOworICAgIC8vIFRPRE86IFJlYWN0IE5hdGl2ZSBl bXB0eSBjb21wb25lbnRzIGFyZSBhbHNvIG11bHRpY2hpbGQuCisgICAgLy8gVGhpcyBtZWFucyB0 aGV5IHN0aWxsIGdldCBpbnRvIHRoaXMgbWV0aG9kIGJ1dCBkb24ndCBoYXZlIF9kZWJ1Z0lELgor ICAgIGlmIChkZWJ1Z0lEICE9PSAwKSB7CisgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1 Z1Rvb2wub25TZXRDaGlsZHJlbihkZWJ1Z0lELCBjaGlsZHJlbiA/IE9iamVjdC5rZXlzKGNoaWxk cmVuKS5tYXAoZnVuY3Rpb24gKGtleSkgeworICAgICAgICByZXR1cm4gY2hpbGRyZW5ba2V5XS5f ZGVidWdJRDsKKyAgICAgIH0pIDogW10pOworICAgIH0KKyAgfTsKK30KKworLyoqCisgKiBSZWFj dE11bHRpQ2hpbGQgYXJlIGNhcGFibGUgb2YgcmVjb25jaWxpbmcgbXVsdGlwbGUgY2hpbGRyZW4u CisgKgorICogQGNsYXNzIFJlYWN0TXVsdGlDaGlsZAorICogQGludGVybmFsCisgKi8KK3ZhciBS ZWFjdE11bHRpQ2hpbGQgPSB7CisKKyAgLyoqCisgICAqIFByb3ZpZGVzIGNvbW1vbiBmdW5jdGlv bmFsaXR5IGZvciBjb21wb25lbnRzIHRoYXQgbXVzdCByZWNvbmNpbGUgbXVsdGlwbGUKKyAgICog Y2hpbGRyZW4uIFRoaXMgaXMgdXNlZCBieSBgUmVhY3RET01Db21wb25lbnRgIHRvIG1vdW50LCB1 cGRhdGUsIGFuZAorICAgKiB1bm1vdW50IGNoaWxkIGNvbXBvbmVudHMuCisgICAqCisgICAqIEBs ZW5kcyB7UmVhY3RNdWx0aUNoaWxkLnByb3RvdHlwZX0KKyAgICovCisgIE1peGluOiB7CisKKyAg ICBfcmVjb25jaWxlckluc3RhbnRpYXRlQ2hpbGRyZW46IGZ1bmN0aW9uIChuZXN0ZWRDaGlsZHJl biwgdHJhbnNhY3Rpb24sIGNvbnRleHQpIHsKKyAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAn cHJvZHVjdGlvbicpIHsKKyAgICAgICAgdmFyIHNlbGZEZWJ1Z0lEID0gZ2V0RGVidWdJRCh0aGlz KTsKKyAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRFbGVtZW50KSB7CisgICAgICAgICAgdHJ5IHsK KyAgICAgICAgICAgIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgPSB0aGlzLl9jdXJyZW50RWxl bWVudC5fb3duZXI7CisgICAgICAgICAgICByZXR1cm4gUmVhY3RDaGlsZFJlY29uY2lsZXIuaW5z dGFudGlhdGVDaGlsZHJlbihuZXN0ZWRDaGlsZHJlbiwgdHJhbnNhY3Rpb24sIGNvbnRleHQsIHNl bGZEZWJ1Z0lEKTsKKyAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgUmVhY3RDdXJy ZW50T3duZXIuY3VycmVudCA9IG51bGw7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9 CisgICAgICByZXR1cm4gUmVhY3RDaGlsZFJlY29uY2lsZXIuaW5zdGFudGlhdGVDaGlsZHJlbihu ZXN0ZWRDaGlsZHJlbiwgdHJhbnNhY3Rpb24sIGNvbnRleHQpOworICAgIH0sCisKKyAgICBfcmVj b25jaWxlclVwZGF0ZUNoaWxkcmVuOiBmdW5jdGlvbiAocHJldkNoaWxkcmVuLCBuZXh0TmVzdGVk Q2hpbGRyZW5FbGVtZW50cywgbW91bnRJbWFnZXMsIHJlbW92ZWROb2RlcywgdHJhbnNhY3Rpb24s IGNvbnRleHQpIHsKKyAgICAgIHZhciBuZXh0Q2hpbGRyZW47CisgICAgICB2YXIgc2VsZkRlYnVn SUQgPSAwOworICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAg ICAgICBzZWxmRGVidWdJRCA9IGdldERlYnVnSUQodGhpcyk7CisgICAgICAgIGlmICh0aGlzLl9j dXJyZW50RWxlbWVudCkgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBSZWFjdEN1cnJl bnRPd25lci5jdXJyZW50ID0gdGhpcy5fY3VycmVudEVsZW1lbnQuX293bmVyOworICAgICAgICAg ICAgbmV4dENoaWxkcmVuID0gZmxhdHRlbkNoaWxkcmVuKG5leHROZXN0ZWRDaGlsZHJlbkVsZW1l bnRzLCBzZWxmRGVidWdJRCk7CisgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIFJl YWN0Q3VycmVudE93bmVyLmN1cnJlbnQgPSBudWxsOworICAgICAgICAgIH0KKyAgICAgICAgICBS ZWFjdENoaWxkUmVjb25jaWxlci51cGRhdGVDaGlsZHJlbihwcmV2Q2hpbGRyZW4sIG5leHRDaGls ZHJlbiwgbW91bnRJbWFnZXMsIHJlbW92ZWROb2RlcywgdHJhbnNhY3Rpb24sIHRoaXMsIHRoaXMu X2hvc3RDb250YWluZXJJbmZvLCBjb250ZXh0LCBzZWxmRGVidWdJRCk7CisgICAgICAgICAgcmV0 dXJuIG5leHRDaGlsZHJlbjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbmV4dENoaWxkcmVu ID0gZmxhdHRlbkNoaWxkcmVuKG5leHROZXN0ZWRDaGlsZHJlbkVsZW1lbnRzLCBzZWxmRGVidWdJ RCk7CisgICAgICBSZWFjdENoaWxkUmVjb25jaWxlci51cGRhdGVDaGlsZHJlbihwcmV2Q2hpbGRy ZW4sIG5leHRDaGlsZHJlbiwgbW91bnRJbWFnZXMsIHJlbW92ZWROb2RlcywgdHJhbnNhY3Rpb24s IHRoaXMsIHRoaXMuX2hvc3RDb250YWluZXJJbmZvLCBjb250ZXh0LCBzZWxmRGVidWdJRCk7Cisg ICAgICByZXR1cm4gbmV4dENoaWxkcmVuOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBHZW5l cmF0ZXMgYSAibW91bnQgaW1hZ2UiIGZvciBlYWNoIG9mIHRoZSBzdXBwbGllZCBjaGlsZHJlbi4g SW4gdGhlIGNhc2UKKyAgICAgKiBvZiBgUmVhY3RET01Db21wb25lbnRgLCBhIG1vdW50IGltYWdl IGlzIGEgc3RyaW5nIG9mIG1hcmt1cC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB7P29iamVjdH0g bmVzdGVkQ2hpbGRyZW4gTmVzdGVkIGNoaWxkIG1hcHMuCisgICAgICogQHJldHVybiB7YXJyYXl9 IEFuIGFycmF5IG9mIG1vdW50ZWQgcmVwcmVzZW50YXRpb25zLgorICAgICAqIEBpbnRlcm5hbAor ICAgICAqLworICAgIG1vdW50Q2hpbGRyZW46IGZ1bmN0aW9uIChuZXN0ZWRDaGlsZHJlbiwgdHJh bnNhY3Rpb24sIGNvbnRleHQpIHsKKyAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuX3JlY29uY2ls ZXJJbnN0YW50aWF0ZUNoaWxkcmVuKG5lc3RlZENoaWxkcmVuLCB0cmFuc2FjdGlvbiwgY29udGV4 dCk7CisgICAgICB0aGlzLl9yZW5kZXJlZENoaWxkcmVuID0gY2hpbGRyZW47CisKKyAgICAgIHZh ciBtb3VudEltYWdlcyA9IFtdOworICAgICAgdmFyIGluZGV4ID0gMDsKKyAgICAgIGZvciAodmFy IG5hbWUgaW4gY2hpbGRyZW4pIHsKKyAgICAgICAgaWYgKGNoaWxkcmVuLmhhc093blByb3BlcnR5 KG5hbWUpKSB7CisgICAgICAgICAgdmFyIGNoaWxkID0gY2hpbGRyZW5bbmFtZV07CisgICAgICAg ICAgdmFyIHNlbGZEZWJ1Z0lEID0gMDsKKyAgICAgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0g J3Byb2R1Y3Rpb24nKSB7CisgICAgICAgICAgICBzZWxmRGVidWdJRCA9IGdldERlYnVnSUQodGhp cyk7CisgICAgICAgICAgfQorICAgICAgICAgIHZhciBtb3VudEltYWdlID0gUmVhY3RSZWNvbmNp bGVyLm1vdW50Q29tcG9uZW50KGNoaWxkLCB0cmFuc2FjdGlvbiwgdGhpcywgdGhpcy5faG9zdENv bnRhaW5lckluZm8sIGNvbnRleHQsIHNlbGZEZWJ1Z0lEKTsKKyAgICAgICAgICBjaGlsZC5fbW91 bnRJbmRleCA9IGluZGV4Kys7CisgICAgICAgICAgbW91bnRJbWFnZXMucHVzaChtb3VudEltYWdl KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3By b2R1Y3Rpb24nKSB7CisgICAgICAgIHNldENoaWxkcmVuRm9ySW5zdHJ1bWVudGF0aW9uLmNhbGwo dGhpcywgY2hpbGRyZW4pOworICAgICAgfQorCisgICAgICByZXR1cm4gbW91bnRJbWFnZXM7Cisg ICAgfSwKKworICAgIC8qKgorICAgICAqIFJlcGxhY2VzIGFueSByZW5kZXJlZCBjaGlsZHJlbiB3 aXRoIGEgdGV4dCBjb250ZW50IHN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB7c3RyaW5n fSBuZXh0Q29udGVudCBTdHJpbmcgb2YgY29udGVudC4KKyAgICAgKiBAaW50ZXJuYWwKKyAgICAg Ki8KKyAgICB1cGRhdGVUZXh0Q29udGVudDogZnVuY3Rpb24gKG5leHRDb250ZW50KSB7CisgICAg ICB2YXIgcHJldkNoaWxkcmVuID0gdGhpcy5fcmVuZGVyZWRDaGlsZHJlbjsKKyAgICAgIC8vIFJl bW92ZSBhbnkgcmVuZGVyZWQgY2hpbGRyZW4uCisgICAgICBSZWFjdENoaWxkUmVjb25jaWxlci51 bm1vdW50Q2hpbGRyZW4ocHJldkNoaWxkcmVuLCBmYWxzZSk7CisgICAgICBmb3IgKHZhciBuYW1l IGluIHByZXZDaGlsZHJlbikgeworICAgICAgICBpZiAocHJldkNoaWxkcmVuLmhhc093blByb3Bl cnR5KG5hbWUpKSB7CisgICAgICAgICAgIWZhbHNlID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1 Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAndXBkYXRlVGV4dENvbnRlbnQgY2FsbGVkIG9uIG5v bi1lbXB0eSBjb21wb25lbnQuJykgOiBfcHJvZEludmFyaWFudCgnMTE4JykgOiB2b2lkIDA7Cisg ICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIFNldCBuZXcgdGV4dCBjb250ZW50LgorICAgICAg dmFyIHVwZGF0ZXMgPSBbbWFrZVRleHRDb250ZW50KG5leHRDb250ZW50KV07CisgICAgICBwcm9j ZXNzUXVldWUodGhpcywgdXBkYXRlcyk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFJlcGxh Y2VzIGFueSByZW5kZXJlZCBjaGlsZHJlbiB3aXRoIGEgbWFya3VwIHN0cmluZy4KKyAgICAgKgor ICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXh0TWFya3VwIFN0cmluZyBvZiBtYXJrdXAuCisgICAg ICogQGludGVybmFsCisgICAgICovCisgICAgdXBkYXRlTWFya3VwOiBmdW5jdGlvbiAobmV4dE1h cmt1cCkgeworICAgICAgdmFyIHByZXZDaGlsZHJlbiA9IHRoaXMuX3JlbmRlcmVkQ2hpbGRyZW47 CisgICAgICAvLyBSZW1vdmUgYW55IHJlbmRlcmVkIGNoaWxkcmVuLgorICAgICAgUmVhY3RDaGls ZFJlY29uY2lsZXIudW5tb3VudENoaWxkcmVuKHByZXZDaGlsZHJlbiwgZmFsc2UpOworICAgICAg Zm9yICh2YXIgbmFtZSBpbiBwcmV2Q2hpbGRyZW4pIHsKKyAgICAgICAgaWYgKHByZXZDaGlsZHJl bi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgeworICAgICAgICAgICFmYWxzZSA/ICJkZXZlbG9wbWVu dCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3VwZGF0ZVRleHRDb250ZW50 IGNhbGxlZCBvbiBub24tZW1wdHkgY29tcG9uZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzExOCcp IDogdm9pZCAwOworICAgICAgICB9CisgICAgICB9CisgICAgICB2YXIgdXBkYXRlcyA9IFttYWtl U2V0TWFya3VwKG5leHRNYXJrdXApXTsKKyAgICAgIHByb2Nlc3NRdWV1ZSh0aGlzLCB1cGRhdGVz KTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogVXBkYXRlcyB0aGUgcmVuZGVyZWQgY2hpbGRy ZW4gd2l0aCBuZXcgY2hpbGRyZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gez9vYmplY3R9IG5l eHROZXN0ZWRDaGlsZHJlbkVsZW1lbnRzIE5lc3RlZCBjaGlsZCBlbGVtZW50IG1hcHMuCisgICAg ICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvbgorICAgICAq IEBpbnRlcm5hbAorICAgICAqLworICAgIHVwZGF0ZUNoaWxkcmVuOiBmdW5jdGlvbiAobmV4dE5l c3RlZENoaWxkcmVuRWxlbWVudHMsIHRyYW5zYWN0aW9uLCBjb250ZXh0KSB7CisgICAgICAvLyBI b29rIHVzZWQgYnkgUmVhY3QgQVJUCisgICAgICB0aGlzLl91cGRhdGVDaGlsZHJlbihuZXh0TmVz dGVkQ2hpbGRyZW5FbGVtZW50cywgdHJhbnNhY3Rpb24sIGNvbnRleHQpOworICAgIH0sCisKKyAg ICAvKioKKyAgICAgKiBAcGFyYW0gez9vYmplY3R9IG5leHROZXN0ZWRDaGlsZHJlbkVsZW1lbnRz IE5lc3RlZCBjaGlsZCBlbGVtZW50IG1hcHMuCisgICAgICogQHBhcmFtIHtSZWFjdFJlY29uY2ls ZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvbgorICAgICAqIEBmaW5hbAorICAgICAqIEBwcm90ZWN0 ZWQKKyAgICAgKi8KKyAgICBfdXBkYXRlQ2hpbGRyZW46IGZ1bmN0aW9uIChuZXh0TmVzdGVkQ2hp bGRyZW5FbGVtZW50cywgdHJhbnNhY3Rpb24sIGNvbnRleHQpIHsKKyAgICAgIHZhciBwcmV2Q2hp bGRyZW4gPSB0aGlzLl9yZW5kZXJlZENoaWxkcmVuOworICAgICAgdmFyIHJlbW92ZWROb2RlcyA9 IHt9OworICAgICAgdmFyIG1vdW50SW1hZ2VzID0gW107CisgICAgICB2YXIgbmV4dENoaWxkcmVu ID0gdGhpcy5fcmVjb25jaWxlclVwZGF0ZUNoaWxkcmVuKHByZXZDaGlsZHJlbiwgbmV4dE5lc3Rl ZENoaWxkcmVuRWxlbWVudHMsIG1vdW50SW1hZ2VzLCByZW1vdmVkTm9kZXMsIHRyYW5zYWN0aW9u LCBjb250ZXh0KTsKKyAgICAgIGlmICghbmV4dENoaWxkcmVuICYmICFwcmV2Q2hpbGRyZW4pIHsK KyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgdmFyIHVwZGF0ZXMgPSBudWxsOworICAg ICAgdmFyIG5hbWU7CisgICAgICAvLyBgbmV4dEluZGV4YCB3aWxsIGluY3JlbWVudCBmb3IgZWFj aCBjaGlsZCBpbiBgbmV4dENoaWxkcmVuYCwgYnV0CisgICAgICAvLyBgbGFzdEluZGV4YCB3aWxs IGJlIHRoZSBsYXN0IGluZGV4IHZpc2l0ZWQgaW4gYHByZXZDaGlsZHJlbmAuCisgICAgICB2YXIg bmV4dEluZGV4ID0gMDsKKyAgICAgIHZhciBsYXN0SW5kZXggPSAwOworICAgICAgLy8gYG5leHRN b3VudEluZGV4YCB3aWxsIGluY3JlbWVudCBmb3IgZWFjaCBuZXdseSBtb3VudGVkIGNoaWxkLgor ICAgICAgdmFyIG5leHRNb3VudEluZGV4ID0gMDsKKyAgICAgIHZhciBsYXN0UGxhY2VkTm9kZSA9 IG51bGw7CisgICAgICBmb3IgKG5hbWUgaW4gbmV4dENoaWxkcmVuKSB7CisgICAgICAgIGlmICgh bmV4dENoaWxkcmVuLmhhc093blByb3BlcnR5KG5hbWUpKSB7CisgICAgICAgICAgY29udGludWU7 CisgICAgICAgIH0KKyAgICAgICAgdmFyIHByZXZDaGlsZCA9IHByZXZDaGlsZHJlbiAmJiBwcmV2 Q2hpbGRyZW5bbmFtZV07CisgICAgICAgIHZhciBuZXh0Q2hpbGQgPSBuZXh0Q2hpbGRyZW5bbmFt ZV07CisgICAgICAgIGlmIChwcmV2Q2hpbGQgPT09IG5leHRDaGlsZCkgeworICAgICAgICAgIHVw ZGF0ZXMgPSBlbnF1ZXVlKHVwZGF0ZXMsIHRoaXMubW92ZUNoaWxkKHByZXZDaGlsZCwgbGFzdFBs YWNlZE5vZGUsIG5leHRJbmRleCwgbGFzdEluZGV4KSk7CisgICAgICAgICAgbGFzdEluZGV4ID0g TWF0aC5tYXgocHJldkNoaWxkLl9tb3VudEluZGV4LCBsYXN0SW5kZXgpOworICAgICAgICAgIHBy ZXZDaGlsZC5fbW91bnRJbmRleCA9IG5leHRJbmRleDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAg ICAgICBpZiAocHJldkNoaWxkKSB7CisgICAgICAgICAgICAvLyBVcGRhdGUgYGxhc3RJbmRleGAg YmVmb3JlIGBfbW91bnRJbmRleGAgZ2V0cyB1bnNldCBieSB1bm1vdW50aW5nLgorICAgICAgICAg ICAgbGFzdEluZGV4ID0gTWF0aC5tYXgocHJldkNoaWxkLl9tb3VudEluZGV4LCBsYXN0SW5kZXgp OworICAgICAgICAgICAgLy8gVGhlIGByZW1vdmVkTm9kZXNgIGxvb3AgYmVsb3cgd2lsbCBhY3R1 YWxseSByZW1vdmUgdGhlIGNoaWxkLgorICAgICAgICAgIH0KKyAgICAgICAgICAvLyBUaGUgY2hp bGQgbXVzdCBiZSBpbnN0YW50aWF0ZWQgYmVmb3JlIGl0J3MgbW91bnRlZC4KKyAgICAgICAgICB1 cGRhdGVzID0gZW5xdWV1ZSh1cGRhdGVzLCB0aGlzLl9tb3VudENoaWxkQXRJbmRleChuZXh0Q2hp bGQsIG1vdW50SW1hZ2VzW25leHRNb3VudEluZGV4XSwgbGFzdFBsYWNlZE5vZGUsIG5leHRJbmRl eCwgdHJhbnNhY3Rpb24sIGNvbnRleHQpKTsKKyAgICAgICAgICBuZXh0TW91bnRJbmRleCsrOwor ICAgICAgICB9CisgICAgICAgIG5leHRJbmRleCsrOworICAgICAgICBsYXN0UGxhY2VkTm9kZSA9 IFJlYWN0UmVjb25jaWxlci5nZXRIb3N0Tm9kZShuZXh0Q2hpbGQpOworICAgICAgfQorICAgICAg Ly8gUmVtb3ZlIGNoaWxkcmVuIHRoYXQgYXJlIG5vIGxvbmdlciBwcmVzZW50LgorICAgICAgZm9y IChuYW1lIGluIHJlbW92ZWROb2RlcykgeworICAgICAgICBpZiAocmVtb3ZlZE5vZGVzLmhhc093 blByb3BlcnR5KG5hbWUpKSB7CisgICAgICAgICAgdXBkYXRlcyA9IGVucXVldWUodXBkYXRlcywg dGhpcy5fdW5tb3VudENoaWxkKHByZXZDaGlsZHJlbltuYW1lXSwgcmVtb3ZlZE5vZGVzW25hbWVd KSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICh1cGRhdGVzKSB7CisgICAgICAgIHBy b2Nlc3NRdWV1ZSh0aGlzLCB1cGRhdGVzKTsKKyAgICAgIH0KKyAgICAgIHRoaXMuX3JlbmRlcmVk Q2hpbGRyZW4gPSBuZXh0Q2hpbGRyZW47CisKKyAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAn cHJvZHVjdGlvbicpIHsKKyAgICAgICAgc2V0Q2hpbGRyZW5Gb3JJbnN0cnVtZW50YXRpb24uY2Fs bCh0aGlzLCBuZXh0Q2hpbGRyZW4pOworICAgICAgfQorICAgIH0sCisKKyAgICAvKioKKyAgICAg KiBVbm1vdW50cyBhbGwgcmVuZGVyZWQgY2hpbGRyZW4uIFRoaXMgc2hvdWxkIGJlIHVzZWQgdG8g Y2xlYW4gdXAgY2hpbGRyZW4KKyAgICAgKiB3aGVuIHRoaXMgY29tcG9uZW50IGlzIHVubW91bnRl ZC4gSXQgZG9lcyBub3QgYWN0dWFsbHkgcGVyZm9ybSBhbnkKKyAgICAgKiBiYWNrZW5kIG9wZXJh dGlvbnMuCisgICAgICoKKyAgICAgKiBAaW50ZXJuYWwKKyAgICAgKi8KKyAgICB1bm1vdW50Q2hp bGRyZW46IGZ1bmN0aW9uIChzYWZlbHkpIHsKKyAgICAgIHZhciByZW5kZXJlZENoaWxkcmVuID0g dGhpcy5fcmVuZGVyZWRDaGlsZHJlbjsKKyAgICAgIFJlYWN0Q2hpbGRSZWNvbmNpbGVyLnVubW91 bnRDaGlsZHJlbihyZW5kZXJlZENoaWxkcmVuLCBzYWZlbHkpOworICAgICAgdGhpcy5fcmVuZGVy ZWRDaGlsZHJlbiA9IG51bGw7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIE1vdmVzIGEgY2hp bGQgY29tcG9uZW50IHRvIHRoZSBzdXBwbGllZCBpbmRleC4KKyAgICAgKgorICAgICAqIEBwYXJh bSB7UmVhY3RDb21wb25lbnR9IGNoaWxkIENvbXBvbmVudCB0byBtb3ZlLgorICAgICAqIEBwYXJh bSB7bnVtYmVyfSB0b0luZGV4IERlc3RpbmF0aW9uIGluZGV4IG9mIHRoZSBlbGVtZW50LgorICAg ICAqIEBwYXJhbSB7bnVtYmVyfSBsYXN0SW5kZXggTGFzdCBpbmRleCB2aXNpdGVkIG9mIHRoZSBz aWJsaW5ncyBvZiBgY2hpbGRgLgorICAgICAqIEBwcm90ZWN0ZWQKKyAgICAgKi8KKyAgICBtb3Zl Q2hpbGQ6IGZ1bmN0aW9uIChjaGlsZCwgYWZ0ZXJOb2RlLCB0b0luZGV4LCBsYXN0SW5kZXgpIHsK KyAgICAgIC8vIElmIHRoZSBpbmRleCBvZiBgY2hpbGRgIGlzIGxlc3MgdGhhbiBgbGFzdEluZGV4 YCwgdGhlbiBpdCBuZWVkcyB0bworICAgICAgLy8gYmUgbW92ZWQuIE90aGVyd2lzZSwgd2UgZG8g bm90IG5lZWQgdG8gbW92ZSBpdCBiZWNhdXNlIGEgY2hpbGQgd2lsbCBiZQorICAgICAgLy8gaW5z ZXJ0ZWQgb3IgbW92ZWQgYmVmb3JlIGBjaGlsZGAuCisgICAgICBpZiAoY2hpbGQuX21vdW50SW5k ZXggPCBsYXN0SW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIG1ha2VNb3ZlKGNoaWxkLCBhZnRlck5v ZGUsIHRvSW5kZXgpOworICAgICAgfQorICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVz IGEgY2hpbGQgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVu dH0gY2hpbGQgQ29tcG9uZW50IHRvIGNyZWF0ZS4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW91 bnRJbWFnZSBNYXJrdXAgdG8gaW5zZXJ0LgorICAgICAqIEBwcm90ZWN0ZWQKKyAgICAgKi8KKyAg ICBjcmVhdGVDaGlsZDogZnVuY3Rpb24gKGNoaWxkLCBhZnRlck5vZGUsIG1vdW50SW1hZ2UpIHsK KyAgICAgIHJldHVybiBtYWtlSW5zZXJ0TWFya3VwKG1vdW50SW1hZ2UsIGFmdGVyTm9kZSwgY2hp bGQuX21vdW50SW5kZXgpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgY2hp bGQgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gY2hp bGQgQ2hpbGQgdG8gcmVtb3ZlLgorICAgICAqIEBwcm90ZWN0ZWQKKyAgICAgKi8KKyAgICByZW1v dmVDaGlsZDogZnVuY3Rpb24gKGNoaWxkLCBub2RlKSB7CisgICAgICByZXR1cm4gbWFrZVJlbW92 ZShjaGlsZCwgbm9kZSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIE1vdW50cyBhIGNoaWxk IHdpdGggdGhlIHN1cHBsaWVkIG5hbWUuCisgICAgICoKKyAgICAgKiBOT1RFOiBUaGlzIGlzIHBh cnQgb2YgYHVwZGF0ZUNoaWxkcmVuYCBhbmQgaXMgaGVyZSBmb3IgcmVhZGFiaWxpdHkuCisgICAg ICoKKyAgICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBjaGlsZCBDb21wb25lbnQgdG8gbW91 bnQuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgY2hpbGQuCisgICAg ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IEluZGV4IGF0IHdoaWNoIHRvIGluc2VydCB0aGUgY2hp bGQuCisgICAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlv bgorICAgICAqIEBwcml2YXRlCisgICAgICovCisgICAgX21vdW50Q2hpbGRBdEluZGV4OiBmdW5j dGlvbiAoY2hpbGQsIG1vdW50SW1hZ2UsIGFmdGVyTm9kZSwgaW5kZXgsIHRyYW5zYWN0aW9uLCBj b250ZXh0KSB7CisgICAgICBjaGlsZC5fbW91bnRJbmRleCA9IGluZGV4OworICAgICAgcmV0dXJu IHRoaXMuY3JlYXRlQ2hpbGQoY2hpbGQsIGFmdGVyTm9kZSwgbW91bnRJbWFnZSk7CisgICAgfSwK KworICAgIC8qKgorICAgICAqIFVubW91bnRzIGEgcmVuZGVyZWQgY2hpbGQuCisgICAgICoKKyAg ICAgKiBOT1RFOiBUaGlzIGlzIHBhcnQgb2YgYHVwZGF0ZUNoaWxkcmVuYCBhbmQgaXMgaGVyZSBm b3IgcmVhZGFiaWxpdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBj aGlsZCBDb21wb25lbnQgdG8gdW5tb3VudC4KKyAgICAgKiBAcHJpdmF0ZQorICAgICAqLworICAg IF91bm1vdW50Q2hpbGQ6IGZ1bmN0aW9uIChjaGlsZCwgbm9kZSkgeworICAgICAgdmFyIHVwZGF0 ZSA9IHRoaXMucmVtb3ZlQ2hpbGQoY2hpbGQsIG5vZGUpOworICAgICAgY2hpbGQuX21vdW50SW5k ZXggPSBudWxsOworICAgICAgcmV0dXJuIHVwZGF0ZTsKKyAgICB9CisKKyAgfQorCit9OworCitt b2R1bGUuZXhwb3J0cyA9IFJlYWN0TXVsdGlDaGlsZDsKK30seyIxMDEiOjEwMSwiMTE2IjoxMTYs IjEyMyI6MTIzLCIxMzIiOjEzMiwiMTQwIjoxNDAsIjI2IjoyNiwiMjgiOjI4LCI1OCI6NTgsIjU5 Ijo1OSwiNjgiOjY4fV0sNjM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoq CisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0 cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRo ZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUg cm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAor ICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0 aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIg X3Byb2RJbnZhcmlhbnQgPSBfZGVyZXFfKDExNik7CisKK3ZhciBSZWFjdCA9IF9kZXJlcV8oMTI0 KTsKKwordmFyIGludmFyaWFudCA9IF9kZXJlcV8oMTQwKTsKKwordmFyIFJlYWN0Tm9kZVR5cGVz ID0geworICBIT1NUOiAwLAorICBDT01QT1NJVEU6IDEsCisgIEVNUFRZOiAyLAorCisgIGdldFR5 cGU6IGZ1bmN0aW9uIChub2RlKSB7CisgICAgaWYgKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0g ZmFsc2UpIHsKKyAgICAgIHJldHVybiBSZWFjdE5vZGVUeXBlcy5FTVBUWTsKKyAgICB9IGVsc2Ug aWYgKFJlYWN0LmlzVmFsaWRFbGVtZW50KG5vZGUpKSB7CisgICAgICBpZiAodHlwZW9mIG5vZGUu dHlwZSA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgICByZXR1cm4gUmVhY3ROb2RlVHlwZXMuQ09N UE9TSVRFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFJlYWN0Tm9kZVR5cGVzLkhP U1Q7CisgICAgICB9CisgICAgfQorICAgICFmYWxzZSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9k dWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1VuZXhwZWN0ZWQgbm9kZTogJXMnLCBub2RlKSA6 IF9wcm9kSW52YXJpYW50KCcyNicsIG5vZGUpIDogdm9pZCAwOworICB9Cit9OworCittb2R1bGUu ZXhwb3J0cyA9IFJlYWN0Tm9kZVR5cGVzOworfSx7IjExNiI6MTE2LCIxMjQiOjEyNCwiMTQwIjox NDB9XSw2NDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHly aWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVk LgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHls ZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVj dG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRl bnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRp cmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJvZEludmFy aWFudCA9IF9kZXJlcV8oMTE2KTsKKwordmFyIGludmFyaWFudCA9IF9kZXJlcV8oMTQwKTsKKwor LyoqCisgKiBAcGFyYW0gez9vYmplY3R9IG9iamVjdAorICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1 ZSBpZiBgb2JqZWN0YCBpcyBhIHZhbGlkIG93bmVyLgorICogQGZpbmFsCisgKi8KK2Z1bmN0aW9u IGlzVmFsaWRPd25lcihvYmplY3QpIHsKKyAgcmV0dXJuICEhKG9iamVjdCAmJiB0eXBlb2Ygb2Jq ZWN0LmF0dGFjaFJlZiA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqZWN0LmRldGFjaFJlZiA9 PT0gJ2Z1bmN0aW9uJyk7Cit9CisKKy8qKgorICogUmVhY3RPd25lcnMgYXJlIGNhcGFibGUgb2Yg c3RvcmluZyByZWZlcmVuY2VzIHRvIG93bmVkIGNvbXBvbmVudHMuCisgKgorICogQWxsIGNvbXBv bmVudHMgYXJlIGNhcGFibGUgb2YgLy9iZWluZy8vIHJlZmVyZW5jZWQgYnkgb3duZXIgY29tcG9u ZW50cywgYnV0CisgKiBvbmx5IFJlYWN0T3duZXIgY29tcG9uZW50cyBhcmUgY2FwYWJsZSBvZiAv L3JlZmVyZW5jaW5nLy8gb3duZWQgY29tcG9uZW50cy4KKyAqIFRoZSBuYW1lZCByZWZlcmVuY2Ug aXMga25vd24gYXMgYSAicmVmIi4KKyAqCisgKiBSZWZzIGFyZSBhdmFpbGFibGUgd2hlbiBtb3Vu dGVkIGFuZCB1cGRhdGVkIGR1cmluZyByZWNvbmNpbGlhdGlvbi4KKyAqCisgKiAgIHZhciBNeUNv bXBvbmVudCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHsKKyAqICAgICByZW5kZXI6IGZ1bmN0aW9uKCkg eworICogICAgICAgcmV0dXJuICgKKyAqICAgICAgICAgPGRpdiBvbkNsaWNrPXt0aGlzLmhhbmRs ZUNsaWNrfT4KKyAqICAgICAgICAgICA8Q3VzdG9tQ29tcG9uZW50IHJlZj0iY3VzdG9tIiAvPgor ICogICAgICAgICA8L2Rpdj4KKyAqICAgICAgICk7CisgKiAgICAgfSwKKyAqICAgICBoYW5kbGVD bGljazogZnVuY3Rpb24oKSB7CisgKiAgICAgICB0aGlzLnJlZnMuY3VzdG9tLmhhbmRsZUNsaWNr KCk7CisgKiAgICAgfSwKKyAqICAgICBjb21wb25lbnREaWRNb3VudDogZnVuY3Rpb24oKSB7Cisg KiAgICAgICB0aGlzLnJlZnMuY3VzdG9tLmluaXRpYWxpemUoKTsKKyAqICAgICB9CisgKiAgIH0p OworICoKKyAqIFJlZnMgc2hvdWxkIHJhcmVseSBiZSB1c2VkLiBXaGVuIHJlZnMgYXJlIHVzZWQs IHRoZXkgc2hvdWxkIG9ubHkgYmUgZG9uZSB0bworICogY29udHJvbCBkYXRhIHRoYXQgaXMgbm90 IGhhbmRsZWQgYnkgUmVhY3QncyBkYXRhIGZsb3cuCisgKgorICogQGNsYXNzIFJlYWN0T3duZXIK KyAqLwordmFyIFJlYWN0T3duZXIgPSB7CisgIC8qKgorICAgKiBBZGRzIGEgY29tcG9uZW50IGJ5 IHJlZiB0byBhbiBvd25lciBjb21wb25lbnQuCisgICAqCisgICAqIEBwYXJhbSB7UmVhY3RDb21w b25lbnR9IGNvbXBvbmVudCBDb21wb25lbnQgdG8gcmVmZXJlbmNlLgorICAgKiBAcGFyYW0ge3N0 cmluZ30gcmVmIE5hbWUgYnkgd2hpY2ggdG8gcmVmZXIgdG8gdGhlIGNvbXBvbmVudC4KKyAgICog QHBhcmFtIHtSZWFjdE93bmVyfSBvd25lciBDb21wb25lbnQgb24gd2hpY2ggdG8gcmVjb3JkIHRo ZSByZWYuCisgICAqIEBmaW5hbAorICAgKiBAaW50ZXJuYWwKKyAgICovCisgIGFkZENvbXBvbmVu dEFzUmVmVG86IGZ1bmN0aW9uIChjb21wb25lbnQsIHJlZiwgb3duZXIpIHsKKyAgICAhaXNWYWxp ZE93bmVyKG93bmVyKSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFu dChmYWxzZSwgJ2FkZENvbXBvbmVudEFzUmVmVG8oLi4uKTogT25seSBhIFJlYWN0T3duZXIgY2Fu IGhhdmUgcmVmcy4gWW91IG1pZ2h0IGJlIGFkZGluZyBhIHJlZiB0byBhIGNvbXBvbmVudCB0aGF0 IHdhcyBub3QgY3JlYXRlZCBpbnNpZGUgYSBjb21wb25lbnRcJ3MgYHJlbmRlcmAgbWV0aG9kLCBv ciB5b3UgaGF2ZSBtdWx0aXBsZSBjb3BpZXMgb2YgUmVhY3QgbG9hZGVkIChkZXRhaWxzOiBodHRw czovL2ZiLm1lL3JlYWN0LXJlZnMtbXVzdC1oYXZlLW93bmVyKS4nKSA6IF9wcm9kSW52YXJpYW50 KCcxMTknKSA6IHZvaWQgMDsKKyAgICBvd25lci5hdHRhY2hSZWYocmVmLCBjb21wb25lbnQpOwor ICB9LAorCisgIC8qKgorICAgKiBSZW1vdmVzIGEgY29tcG9uZW50IGJ5IHJlZiBmcm9tIGFuIG93 bmVyIGNvbXBvbmVudC4KKyAgICoKKyAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gY29tcG9u ZW50IENvbXBvbmVudCB0byBkZXJlZmVyZW5jZS4KKyAgICogQHBhcmFtIHtzdHJpbmd9IHJlZiBO YW1lIG9mIHRoZSByZWYgdG8gcmVtb3ZlLgorICAgKiBAcGFyYW0ge1JlYWN0T3duZXJ9IG93bmVy IENvbXBvbmVudCBvbiB3aGljaCB0aGUgcmVmIGlzIHJlY29yZGVkLgorICAgKiBAZmluYWwKKyAg ICogQGludGVybmFsCisgICAqLworICByZW1vdmVDb21wb25lbnRBc1JlZkZyb206IGZ1bmN0aW9u IChjb21wb25lbnQsIHJlZiwgb3duZXIpIHsKKyAgICAhaXNWYWxpZE93bmVyKG93bmVyKSA/ICJk ZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3JlbW92ZUNv bXBvbmVudEFzUmVmRnJvbSguLi4pOiBPbmx5IGEgUmVhY3RPd25lciBjYW4gaGF2ZSByZWZzLiBZ b3UgbWlnaHQgYmUgcmVtb3ZpbmcgYSByZWYgdG8gYSBjb21wb25lbnQgdGhhdCB3YXMgbm90IGNy ZWF0ZWQgaW5zaWRlIGEgY29tcG9uZW50XCdzIGByZW5kZXJgIG1ldGhvZCwgb3IgeW91IGhhdmUg bXVsdGlwbGUgY29waWVzIG9mIFJlYWN0IGxvYWRlZCAoZGV0YWlsczogaHR0cHM6Ly9mYi5tZS9y ZWFjdC1yZWZzLW11c3QtaGF2ZS1vd25lcikuJykgOiBfcHJvZEludmFyaWFudCgnMTIwJykgOiB2 b2lkIDA7CisgICAgdmFyIG93bmVyUHVibGljSW5zdGFuY2UgPSBvd25lci5nZXRQdWJsaWNJbnN0 YW5jZSgpOworICAgIC8vIENoZWNrIHRoYXQgYGNvbXBvbmVudGAncyBvd25lciBpcyBzdGlsbCBh bGl2ZSBhbmQgdGhhdCBgY29tcG9uZW50YCBpcyBzdGlsbCB0aGUgY3VycmVudCByZWYKKyAgICAv LyBiZWNhdXNlIHdlIGRvIG5vdCB3YW50IHRvIGRldGFjaCB0aGUgcmVmIGlmIGFub3RoZXIgY29t cG9uZW50IHN0b2xlIGl0LgorICAgIGlmIChvd25lclB1YmxpY0luc3RhbmNlICYmIG93bmVyUHVi bGljSW5zdGFuY2UucmVmc1tyZWZdID09PSBjb21wb25lbnQuZ2V0UHVibGljSW5zdGFuY2UoKSkg eworICAgICAgb3duZXIuZGV0YWNoUmVmKHJlZik7CisgICAgfQorICB9CisKK307CisKK21vZHVs ZS5leHBvcnRzID0gUmVhY3RPd25lcjsKK30seyIxMTYiOjExNiwiMTQwIjoxNDB9XSw2NTpbZnVu Y3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXBy ZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRo aXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZv dW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlz IHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNh biBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAq CisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBSZWFjdFByb3BUeXBlTG9jYXRpb25O YW1lcyA9IHt9OworCitpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgIFJl YWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzID0geworICAgIHByb3A6ICdwcm9wJywKKyAgICBjb250 ZXh0OiAnY29udGV4dCcsCisgICAgY2hpbGRDb250ZXh0OiAnY2hpbGQgY29udGV4dCcKKyAgfTsK K30KKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lczsKK30se31d LDY2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0 IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg KgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxp Y2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5 IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCBy aWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0 b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFJlYWN0UHJvcFR5cGVz U2VjcmV0ID0gJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJzsK KworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdFByb3BUeXBlc1NlY3JldDsKK30se31dLDY3OltmdW5j dGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJl c2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhp cyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91 bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMg c291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2Fu IGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoK KyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfYXNzaWduID0gX2RlcmVxXygxNDgpOworCit2 YXIgQ2FsbGJhY2tRdWV1ZSA9IF9kZXJlcV8oNik7Cit2YXIgUG9vbGVkQ2xhc3MgPSBfZGVyZXFf KDI0KTsKK3ZhciBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIgPSBfZGVyZXFfKDI1KTsKK3ZhciBS ZWFjdElucHV0U2VsZWN0aW9uID0gX2RlcmVxXyg1Nyk7Cit2YXIgUmVhY3RJbnN0cnVtZW50YXRp b24gPSBfZGVyZXFfKDU5KTsKK3ZhciBUcmFuc2FjdGlvbiA9IF9kZXJlcV8oOTMpOwordmFyIFJl YWN0VXBkYXRlUXVldWUgPSBfZGVyZXFfKDc0KTsKKworLyoqCisgKiBFbnN1cmVzIHRoYXQsIHdo ZW4gcG9zc2libGUsIHRoZSBzZWxlY3Rpb24gcmFuZ2UgKGN1cnJlbnRseSBzZWxlY3RlZCB0ZXh0 CisgKiBpbnB1dCkgaXMgbm90IGRpc3R1cmJlZCBieSBwZXJmb3JtaW5nIHRoZSB0cmFuc2FjdGlv bi4KKyAqLwordmFyIFNFTEVDVElPTl9SRVNUT1JBVElPTiA9IHsKKyAgLyoqCisgICAqIEByZXR1 cm4ge1NlbGVjdGlvbn0gU2VsZWN0aW9uIGluZm9ybWF0aW9uLgorICAgKi8KKyAgaW5pdGlhbGl6 ZTogUmVhY3RJbnB1dFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25JbmZvcm1hdGlvbiwKKyAgLyoqCisg ICAqIEBwYXJhbSB7U2VsZWN0aW9ufSBzZWwgU2VsZWN0aW9uIGluZm9ybWF0aW9uIHJldHVybmVk IGZyb20gYGluaXRpYWxpemVgLgorICAgKi8KKyAgY2xvc2U6IFJlYWN0SW5wdXRTZWxlY3Rpb24u cmVzdG9yZVNlbGVjdGlvbgorfTsKKworLyoqCisgKiBTdXBwcmVzc2VzIGV2ZW50cyAoYmx1ci9m b2N1cykgdGhhdCBjb3VsZCBiZSBpbmFkdmVydGVudGx5IGRpc3BhdGNoZWQgZHVlIHRvCisgKiBo aWdoIGxldmVsIERPTSBtYW5pcHVsYXRpb25zIChsaWtlIHRlbXBvcmFyaWx5IHJlbW92aW5nIGEg dGV4dCBpbnB1dCBmcm9tIHRoZQorICogRE9NKS4KKyAqLwordmFyIEVWRU5UX1NVUFBSRVNTSU9O ID0geworICAvKioKKyAgICogQHJldHVybiB7Ym9vbGVhbn0gVGhlIGVuYWJsZWQgc3RhdHVzIG9m IGBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXJgIGJlZm9yZQorICAgKiB0aGUgcmVjb25jaWxpYXRp b24uCisgICAqLworICBpbml0aWFsaXplOiBmdW5jdGlvbiAoKSB7CisgICAgdmFyIGN1cnJlbnRs eUVuYWJsZWQgPSBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuaXNFbmFibGVkKCk7CisgICAgUmVh Y3RCcm93c2VyRXZlbnRFbWl0dGVyLnNldEVuYWJsZWQoZmFsc2UpOworICAgIHJldHVybiBjdXJy ZW50bHlFbmFibGVkOworICB9LAorCisgIC8qKgorICAgKiBAcGFyYW0ge2Jvb2xlYW59IHByZXZp b3VzbHlFbmFibGVkIEVuYWJsZWQgc3RhdHVzIG9mCisgICAqICAgYFJlYWN0QnJvd3NlckV2ZW50 RW1pdHRlcmAgYmVmb3JlIHRoZSByZWNvbmNpbGlhdGlvbiBvY2N1cnJlZC4gYGNsb3NlYAorICAg KiAgIHJlc3RvcmVzIHRoZSBwcmV2aW91cyB2YWx1ZS4KKyAgICovCisgIGNsb3NlOiBmdW5jdGlv biAocHJldmlvdXNseUVuYWJsZWQpIHsKKyAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuc2V0 RW5hYmxlZChwcmV2aW91c2x5RW5hYmxlZCk7CisgIH0KK307CisKKy8qKgorICogUHJvdmlkZXMg YSBxdWV1ZSBmb3IgY29sbGVjdGluZyBgY29tcG9uZW50RGlkTW91bnRgIGFuZAorICogYGNvbXBv bmVudERpZFVwZGF0ZWAgY2FsbGJhY2tzIGR1cmluZyB0aGUgdHJhbnNhY3Rpb24uCisgKi8KK3Zh ciBPTl9ET01fUkVBRFlfUVVFVUVJTkcgPSB7CisgIC8qKgorICAgKiBJbml0aWFsaXplcyB0aGUg aW50ZXJuYWwgYG9uRE9NUmVhZHlgIHF1ZXVlLgorICAgKi8KKyAgaW5pdGlhbGl6ZTogZnVuY3Rp b24gKCkgeworICAgIHRoaXMucmVhY3RNb3VudFJlYWR5LnJlc2V0KCk7CisgIH0sCisKKyAgLyoq CisgICAqIEFmdGVyIERPTSBpcyBmbHVzaGVkLCBpbnZva2UgYWxsIHJlZ2lzdGVyZWQgYG9uRE9N UmVhZHlgIGNhbGxiYWNrcy4KKyAgICovCisgIGNsb3NlOiBmdW5jdGlvbiAoKSB7CisgICAgdGhp cy5yZWFjdE1vdW50UmVhZHkubm90aWZ5QWxsKCk7CisgIH0KK307CisKKy8qKgorICogRXhlY3V0 ZWQgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgYFRyYW5zYWN0aW9uYCBpbnN0YW5jZS4gQ29uc2lk ZXIgdGhlc2UgYXMKKyAqIGJlaW5nIG1lbWJlciBtZXRob2RzLCBidXQgd2l0aCBhbiBpbXBsaWVk IG9yZGVyaW5nIHdoaWxlIGJlaW5nIGlzb2xhdGVkIGZyb20KKyAqIGVhY2ggb3RoZXIuCisgKi8K K3ZhciBUUkFOU0FDVElPTl9XUkFQUEVSUyA9IFtTRUxFQ1RJT05fUkVTVE9SQVRJT04sIEVWRU5U X1NVUFBSRVNTSU9OLCBPTl9ET01fUkVBRFlfUVVFVUVJTkddOworCitpZiAoImRldmVsb3BtZW50 IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgIFRSQU5TQUNUSU9OX1dSQVBQRVJTLnB1c2goeworICAg IGluaXRpYWxpemU6IFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkJlZ2luRmx1c2gs CisgICAgY2xvc2U6IFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkVuZEZsdXNoCisg IH0pOworfQorCisvKioKKyAqIEN1cnJlbnRseToKKyAqIC0gVGhlIG9yZGVyIHRoYXQgdGhlc2Ug YXJlIGxpc3RlZCBpbiB0aGUgdHJhbnNhY3Rpb24gaXMgY3JpdGljYWw6CisgKiAtIFN1cHByZXNz ZXMgZXZlbnRzLgorICogLSBSZXN0b3JlcyBzZWxlY3Rpb24gcmFuZ2UuCisgKgorICogRnV0dXJl OgorICogLSBSZXN0b3JlIGRvY3VtZW50L292ZXJmbG93IHNjcm9sbCBwb3NpdGlvbnMgdGhhdCB3 ZXJlIHVuaW50ZW50aW9uYWxseQorICogICBtb2RpZmllZCB2aWEgRE9NIGluc2VydGlvbnMgYWJv dmUgdGhlIHRvcCB2aWV3cG9ydCBib3VuZGFyeS4KKyAqIC0gSW1wbGVtZW50L2ludGVncmF0ZSB3 aXRoIGN1c3RvbWl6ZWQgY29uc3RyYWludCBiYXNlZCBsYXlvdXQgc3lzdGVtIGFuZCBrZWVwCisg KiAgIHRyYWNrIG9mIHdoaWNoIGRpbWVuc2lvbnMgbXVzdCBiZSByZW1lYXN1cmVkLgorICoKKyAq IEBjbGFzcyBSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uCisgKi8KK2Z1bmN0aW9uIFJlYWN0UmVj b25jaWxlVHJhbnNhY3Rpb24odXNlQ3JlYXRlRWxlbWVudCkgeworICB0aGlzLnJlaW5pdGlhbGl6 ZVRyYW5zYWN0aW9uKCk7CisgIC8vIE9ubHkgc2VydmVyLXNpZGUgcmVuZGVyaW5nIHJlYWxseSBu ZWVkcyB0aGlzIG9wdGlvbiAoc2VlCisgIC8vIGBSZWFjdFNlcnZlclJlbmRlcmluZ2ApLCBidXQg c2VydmVyLXNpZGUgdXNlcworICAvLyBgUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbmAg aW5zdGVhZC4gVGhpcyBvcHRpb24gaXMgaGVyZSBzbyB0aGF0IGl0J3MKKyAgLy8gYWNjZXNzaWJs ZSBhbmQgZGVmYXVsdHMgdG8gZmFsc2Ugd2hlbiBgUmVhY3RET01Db21wb25lbnRgIGFuZAorICAv LyBgUmVhY3RET01UZXh0Q29tcG9uZW50YCBjaGVja3MgaXQgaW4gYG1vdW50Q29tcG9uZW50YC5g CisgIHRoaXMucmVuZGVyVG9TdGF0aWNNYXJrdXAgPSBmYWxzZTsKKyAgdGhpcy5yZWFjdE1vdW50 UmVhZHkgPSBDYWxsYmFja1F1ZXVlLmdldFBvb2xlZChudWxsKTsKKyAgdGhpcy51c2VDcmVhdGVF bGVtZW50ID0gdXNlQ3JlYXRlRWxlbWVudDsKK30KKwordmFyIE1peGluID0geworICAvKioKKyAg ICogQHNlZSBUcmFuc2FjdGlvbgorICAgKiBAYWJzdHJhY3QKKyAgICogQGZpbmFsCisgICAqIEBy ZXR1cm4ge2FycmF5PG9iamVjdD59IExpc3Qgb2Ygb3BlcmF0aW9uIHdyYXAgcHJvY2VkdXJlcy4K KyAgICogICBUT0RPOiBjb252ZXJ0IHRvIGFycmF5PFRyYW5zYWN0aW9uV3JhcHBlcj4KKyAgICov CisgIGdldFRyYW5zYWN0aW9uV3JhcHBlcnM6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gVFJB TlNBQ1RJT05fV1JBUFBFUlM7CisgIH0sCisKKyAgLyoqCisgICAqIEByZXR1cm4ge29iamVjdH0g VGhlIHF1ZXVlIHRvIGNvbGxlY3QgYG9uRE9NUmVhZHlgIGNhbGxiYWNrcyB3aXRoLgorICAgKi8K KyAgZ2V0UmVhY3RNb3VudFJlYWR5OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIHRoaXMucmVh Y3RNb3VudFJlYWR5OworICB9LAorCisgIC8qKgorICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoZSBx dWV1ZSB0byBjb2xsZWN0IFJlYWN0IGFzeW5jIGV2ZW50cy4KKyAgICovCisgIGdldFVwZGF0ZVF1 ZXVlOiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIFJlYWN0VXBkYXRlUXVldWU7CisgIH0sCisK KyAgLyoqCisgICAqIFNhdmUgY3VycmVudCB0cmFuc2FjdGlvbiBzdGF0ZSAtLSBpZiB0aGUgcmV0 dXJuIHZhbHVlIGZyb20gdGhpcyBtZXRob2QgaXMKKyAgICogcGFzc2VkIHRvIGByb2xsYmFja2As IHRoZSB0cmFuc2FjdGlvbiB3aWxsIGJlIHJlc2V0IHRvIHRoYXQgc3RhdGUuCisgICAqLworICBj aGVja3BvaW50OiBmdW5jdGlvbiAoKSB7CisgICAgLy8gcmVhY3RNb3VudFJlYWR5IGlzIHRoZSBv dXIgb25seSBzdGF0ZWZ1bCB3cmFwcGVyCisgICAgcmV0dXJuIHRoaXMucmVhY3RNb3VudFJlYWR5 LmNoZWNrcG9pbnQoKTsKKyAgfSwKKworICByb2xsYmFjazogZnVuY3Rpb24gKGNoZWNrcG9pbnQp IHsKKyAgICB0aGlzLnJlYWN0TW91bnRSZWFkeS5yb2xsYmFjayhjaGVja3BvaW50KTsKKyAgfSwK KworICAvKioKKyAgICogYFBvb2xlZENsYXNzYCBsb29rcyBmb3IgdGhpcywgYW5kIHdpbGwgaW52 b2tlIHRoaXMgYmVmb3JlIGFsbG93aW5nIHRoaXMKKyAgICogaW5zdGFuY2UgdG8gYmUgcmV1c2Vk LgorICAgKi8KKyAgZGVzdHJ1Y3RvcjogZnVuY3Rpb24gKCkgeworICAgIENhbGxiYWNrUXVldWUu cmVsZWFzZSh0aGlzLnJlYWN0TW91bnRSZWFkeSk7CisgICAgdGhpcy5yZWFjdE1vdW50UmVhZHkg PSBudWxsOworICB9Cit9OworCitfYXNzaWduKFJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24ucHJv dG90eXBlLCBUcmFuc2FjdGlvbiwgTWl4aW4pOworCitQb29sZWRDbGFzcy5hZGRQb29saW5nVG8o UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbik7CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RSZWNv bmNpbGVUcmFuc2FjdGlvbjsKK30seyIxNDgiOjE0OCwiMjQiOjI0LCIyNSI6MjUsIjU3Ijo1Nywi NTkiOjU5LCI2Ijo2LCI3NCI6NzQsIjkzIjo5M31dLDY4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVs ZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIElu Yy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBs aWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNF TlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFk ZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQ QVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmlj dCc7CisKK3ZhciBSZWFjdFJlZiA9IF9kZXJlcV8oNjkpOwordmFyIFJlYWN0SW5zdHJ1bWVudGF0 aW9uID0gX2RlcmVxXyg1OSk7CisKK3ZhciB3YXJuaW5nID0gX2RlcmVxXygxNDcpOworCisvKioK KyAqIEhlbHBlciB0byBjYWxsIFJlYWN0UmVmLmF0dGFjaFJlZnMgd2l0aCB0aGlzIGNvbXBvc2l0 ZSBjb21wb25lbnQsIHNwbGl0IG91dAorICogdG8gYXZvaWQgYWxsb2NhdGlvbnMgaW4gdGhlIHRy YW5zYWN0aW9uIG1vdW50LXJlYWR5IHF1ZXVlLgorICovCitmdW5jdGlvbiBhdHRhY2hSZWZzKCkg eworICBSZWFjdFJlZi5hdHRhY2hSZWZzKHRoaXMsIHRoaXMuX2N1cnJlbnRFbGVtZW50KTsKK30K KwordmFyIFJlYWN0UmVjb25jaWxlciA9IHsKKworICAvKioKKyAgICogSW5pdGlhbGl6ZXMgdGhl IGNvbXBvbmVudCwgcmVuZGVycyBtYXJrdXAsIGFuZCByZWdpc3RlcnMgZXZlbnQgbGlzdGVuZXJz LgorICAgKgorICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBpbnRlcm5hbEluc3RhbmNlCisg ICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbnxSZWFjdFNlcnZlclJlbmRlcmlu Z1RyYW5zYWN0aW9ufSB0cmFuc2FjdGlvbgorICAgKiBAcGFyYW0gez9vYmplY3R9IHRoZSBjb250 YWluaW5nIGhvc3QgY29tcG9uZW50IGluc3RhbmNlCisgICAqIEBwYXJhbSB7P29iamVjdH0gaW5m byBhYm91dCB0aGUgaG9zdCBjb250YWluZXIKKyAgICogQHJldHVybiB7P3N0cmluZ30gUmVuZGVy ZWQgbWFya3VwIHRvIGJlIGluc2VydGVkIGludG8gdGhlIERPTS4KKyAgICogQGZpbmFsCisgICAq IEBpbnRlcm5hbAorICAgKi8KKyAgbW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChpbnRlcm5hbElu c3RhbmNlLCB0cmFuc2FjdGlvbiwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIGNvbnRl eHQsIHBhcmVudERlYnVnSUQgLy8gMCBpbiBwcm9kdWN0aW9uIGFuZCBmb3Igcm9vdHMKKyAgKSB7 CisgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgaWYgKGlu dGVybmFsSW5zdGFuY2UuX2RlYnVnSUQgIT09IDApIHsKKyAgICAgICAgUmVhY3RJbnN0cnVtZW50 YXRpb24uZGVidWdUb29sLm9uQmVmb3JlTW91bnRDb21wb25lbnQoaW50ZXJuYWxJbnN0YW5jZS5f ZGVidWdJRCwgaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQsIHBhcmVudERlYnVnSUQp OworICAgICAgfQorICAgIH0KKyAgICB2YXIgbWFya3VwID0gaW50ZXJuYWxJbnN0YW5jZS5tb3Vu dENvbXBvbmVudCh0cmFuc2FjdGlvbiwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIGNv bnRleHQsIHBhcmVudERlYnVnSUQpOworICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9jdXJyZW50 RWxlbWVudCAmJiBpbnRlcm5hbEluc3RhbmNlLl9jdXJyZW50RWxlbWVudC5yZWYgIT0gbnVsbCkg eworICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShhdHRhY2hS ZWZzLCBpbnRlcm5hbEluc3RhbmNlKTsKKyAgICB9CisgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09 ICdwcm9kdWN0aW9uJykgeworICAgICAgaWYgKGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQgIT09 IDApIHsKKyAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uTW91bnRDb21w b25lbnQoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCk7CisgICAgICB9CisgICAgfQorICAgIHJl dHVybiBtYXJrdXA7CisgIH0sCisKKyAgLyoqCisgICAqIFJldHVybnMgYSB2YWx1ZSB0aGF0IGNh biBiZSBwYXNzZWQgdG8KKyAgICogUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudC5yZXBsYWNlTm9k ZVdpdGhNYXJrdXAuCisgICAqLworICBnZXRIb3N0Tm9kZTogZnVuY3Rpb24gKGludGVybmFsSW5z dGFuY2UpIHsKKyAgICByZXR1cm4gaW50ZXJuYWxJbnN0YW5jZS5nZXRIb3N0Tm9kZSgpOworICB9 LAorCisgIC8qKgorICAgKiBSZWxlYXNlcyBhbnkgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSBgbW91 bnRDb21wb25lbnRgLgorICAgKgorICAgKiBAZmluYWwKKyAgICogQGludGVybmFsCisgICAqLwor ICB1bm1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoaW50ZXJuYWxJbnN0YW5jZSwgc2FmZWx5KSB7 CisgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgaWYgKGlu dGVybmFsSW5zdGFuY2UuX2RlYnVnSUQgIT09IDApIHsKKyAgICAgICAgUmVhY3RJbnN0cnVtZW50 YXRpb24uZGVidWdUb29sLm9uQmVmb3JlVW5tb3VudENvbXBvbmVudChpbnRlcm5hbEluc3RhbmNl Ll9kZWJ1Z0lEKTsKKyAgICAgIH0KKyAgICB9CisgICAgUmVhY3RSZWYuZGV0YWNoUmVmcyhpbnRl cm5hbEluc3RhbmNlLCBpbnRlcm5hbEluc3RhbmNlLl9jdXJyZW50RWxlbWVudCk7CisgICAgaW50 ZXJuYWxJbnN0YW5jZS51bm1vdW50Q29tcG9uZW50KHNhZmVseSk7CisgICAgaWYgKCJkZXZlbG9w bWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgaWYgKGludGVybmFsSW5zdGFuY2UuX2Rl YnVnSUQgIT09IDApIHsKKyAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9u VW5tb3VudENvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEKTsKKyAgICAgIH0KKyAg ICB9CisgIH0sCisKKyAgLyoqCisgICAqIFVwZGF0ZSBhIGNvbXBvbmVudCB1c2luZyBhIG5ldyBl bGVtZW50LgorICAgKgorICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBpbnRlcm5hbEluc3Rh bmNlCisgICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBuZXh0RWxlbWVudAorICAgKiBAcGFyYW0g e1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uCisgICAqIEBwYXJhbSB7b2Jq ZWN0fSBjb250ZXh0CisgICAqIEBpbnRlcm5hbAorICAgKi8KKyAgcmVjZWl2ZUNvbXBvbmVudDog ZnVuY3Rpb24gKGludGVybmFsSW5zdGFuY2UsIG5leHRFbGVtZW50LCB0cmFuc2FjdGlvbiwgY29u dGV4dCkgeworICAgIHZhciBwcmV2RWxlbWVudCA9IGludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRF bGVtZW50OworCisgICAgaWYgKG5leHRFbGVtZW50ID09PSBwcmV2RWxlbWVudCAmJiBjb250ZXh0 ID09PSBpbnRlcm5hbEluc3RhbmNlLl9jb250ZXh0KSB7CisgICAgICAvLyBTaW5jZSBlbGVtZW50 cyBhcmUgaW1tdXRhYmxlIGFmdGVyIHRoZSBvd25lciBpcyByZW5kZXJlZCwKKyAgICAgIC8vIHdl IGNhbiBkbyBhIGNoZWFwIGlkZW50aXR5IGNvbXBhcmUgaGVyZSB0byBkZXRlcm1pbmUgaWYgdGhp cyBpcyBhCisgICAgICAvLyBzdXBlcmZsdW91cyByZWNvbmNpbGUuIEl0J3MgcG9zc2libGUgZm9y IHN0YXRlIHRvIGJlIG11dGFibGUgYnV0IHN1Y2gKKyAgICAgIC8vIGNoYW5nZSBzaG91bGQgdHJp Z2dlciBhbiB1cGRhdGUgb2YgdGhlIG93bmVyIHdoaWNoIHdvdWxkIHJlY3JlYXRlCisgICAgICAv LyB0aGUgZWxlbWVudC4gV2UgZXhwbGljaXRseSBjaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBh biBvd25lciBzaW5jZQorICAgICAgLy8gaXQncyBwb3NzaWJsZSBmb3IgYW4gZWxlbWVudCBjcmVh dGVkIG91dHNpZGUgYSBjb21wb3NpdGUgdG8gYmUKKyAgICAgIC8vIGRlZXBseSBtdXRhdGVkIGFu ZCByZXVzZWQuCisKKyAgICAgIC8vIFRPRE86IEJhaWxpbmcgb3V0IGVhcmx5IGlzIGp1c3QgYSBw ZXJmIG9wdGltaXphdGlvbiByaWdodD8KKyAgICAgIC8vIFRPRE86IFJlbW92aW5nIHRoZSByZXR1 cm4gc3RhdGVtZW50IHNob3VsZCBhZmZlY3QgY29ycmVjdG5lc3M/CisgICAgICByZXR1cm47Cisg ICAgfQorCisgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAg aWYgKGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQgIT09IDApIHsKKyAgICAgICAgUmVhY3RJbnN0 cnVtZW50YXRpb24uZGVidWdUb29sLm9uQmVmb3JlVXBkYXRlQ29tcG9uZW50KGludGVybmFsSW5z dGFuY2UuX2RlYnVnSUQsIG5leHRFbGVtZW50KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIg cmVmc0NoYW5nZWQgPSBSZWFjdFJlZi5zaG91bGRVcGRhdGVSZWZzKHByZXZFbGVtZW50LCBuZXh0 RWxlbWVudCk7CisKKyAgICBpZiAocmVmc0NoYW5nZWQpIHsKKyAgICAgIFJlYWN0UmVmLmRldGFj aFJlZnMoaW50ZXJuYWxJbnN0YW5jZSwgcHJldkVsZW1lbnQpOworICAgIH0KKworICAgIGludGVy bmFsSW5zdGFuY2UucmVjZWl2ZUNvbXBvbmVudChuZXh0RWxlbWVudCwgdHJhbnNhY3Rpb24sIGNv bnRleHQpOworCisgICAgaWYgKHJlZnNDaGFuZ2VkICYmIGludGVybmFsSW5zdGFuY2UuX2N1cnJl bnRFbGVtZW50ICYmIGludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50LnJlZiAhPSBudWxs KSB7CisgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGF0dGFj aFJlZnMsIGludGVybmFsSW5zdGFuY2UpOworICAgIH0KKworICAgIGlmICgiZGV2ZWxvcG1lbnQi ICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lE ICE9PSAwKSB7CisgICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblVwZGF0 ZUNvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEKTsKKyAgICAgIH0KKyAgICB9Cisg IH0sCisKKyAgLyoqCisgICAqIEZsdXNoIGFueSBkaXJ0eSBjaGFuZ2VzIGluIGEgY29tcG9uZW50 LgorICAgKgorICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBpbnRlcm5hbEluc3RhbmNlCisg ICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24KKyAgICog QGludGVybmFsCisgICAqLworICBwZXJmb3JtVXBkYXRlSWZOZWNlc3Nhcnk6IGZ1bmN0aW9uIChp bnRlcm5hbEluc3RhbmNlLCB0cmFuc2FjdGlvbiwgdXBkYXRlQmF0Y2hOdW1iZXIpIHsKKyAgICBp ZiAoaW50ZXJuYWxJbnN0YW5jZS5fdXBkYXRlQmF0Y2hOdW1iZXIgIT09IHVwZGF0ZUJhdGNoTnVt YmVyKSB7CisgICAgICAvLyBUaGUgY29tcG9uZW50J3MgZW5xdWV1ZWQgYmF0Y2ggbnVtYmVyIHNo b3VsZCBhbHdheXMgYmUgdGhlIGN1cnJlbnQKKyAgICAgIC8vIGJhdGNoIG9yIHRoZSBmb2xsb3dp bmcgb25lLgorICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhp bnRlcm5hbEluc3RhbmNlLl91cGRhdGVCYXRjaE51bWJlciA9PSBudWxsIHx8IGludGVybmFsSW5z dGFuY2UuX3VwZGF0ZUJhdGNoTnVtYmVyID09PSB1cGRhdGVCYXRjaE51bWJlciArIDEsICdwZXJm b3JtVXBkYXRlSWZOZWNlc3Nhcnk6IFVuZXhwZWN0ZWQgYmF0Y2ggbnVtYmVyIChjdXJyZW50ICVz LCAnICsgJ3BlbmRpbmcgJXMpJywgdXBkYXRlQmF0Y2hOdW1iZXIsIGludGVybmFsSW5zdGFuY2Uu X3VwZGF0ZUJhdGNoTnVtYmVyKSA6IHZvaWQgMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAg aWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgaWYgKGludGVybmFs SW5zdGFuY2UuX2RlYnVnSUQgIT09IDApIHsKKyAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24u ZGVidWdUb29sLm9uQmVmb3JlVXBkYXRlQ29tcG9uZW50KGludGVybmFsSW5zdGFuY2UuX2RlYnVn SUQsIGludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50KTsKKyAgICAgIH0KKyAgICB9Cisg ICAgaW50ZXJuYWxJbnN0YW5jZS5wZXJmb3JtVXBkYXRlSWZOZWNlc3NhcnkodHJhbnNhY3Rpb24p OworICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIGlmIChp bnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEICE9PSAwKSB7CisgICAgICAgIFJlYWN0SW5zdHJ1bWVu dGF0aW9uLmRlYnVnVG9vbC5vblVwZGF0ZUNvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1 Z0lEKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworfTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFj dFJlY29uY2lsZXI7Cit9LHsiMTQ3IjoxNDcsIjU5Ijo1OSwiNjkiOjY5fV0sNjk6W2Z1bmN0aW9u KF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50 LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNv dXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBp biB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3Vy Y2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUg Zm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICog CisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgUmVhY3RPd25lciA9IF9kZXJlcV8oNjQpOwor Cit2YXIgUmVhY3RSZWYgPSB7fTsKKworZnVuY3Rpb24gYXR0YWNoUmVmKHJlZiwgY29tcG9uZW50 LCBvd25lcikgeworICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykgeworICAgIHJlZihj b21wb25lbnQuZ2V0UHVibGljSW5zdGFuY2UoKSk7CisgIH0gZWxzZSB7CisgICAgLy8gTGVnYWN5 IHJlZgorICAgIFJlYWN0T3duZXIuYWRkQ29tcG9uZW50QXNSZWZUbyhjb21wb25lbnQsIHJlZiwg b3duZXIpOworICB9Cit9CisKK2Z1bmN0aW9uIGRldGFjaFJlZihyZWYsIGNvbXBvbmVudCwgb3du ZXIpIHsKKyAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHsKKyAgICByZWYobnVsbCk7 CisgIH0gZWxzZSB7CisgICAgLy8gTGVnYWN5IHJlZgorICAgIFJlYWN0T3duZXIucmVtb3ZlQ29t cG9uZW50QXNSZWZGcm9tKGNvbXBvbmVudCwgcmVmLCBvd25lcik7CisgIH0KK30KKworUmVhY3RS ZWYuYXR0YWNoUmVmcyA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgZWxlbWVudCkgeworICBpZiAoZWxl bWVudCA9PT0gbnVsbCB8fCB0eXBlb2YgZWxlbWVudCAhPT0gJ29iamVjdCcpIHsKKyAgICByZXR1 cm47CisgIH0KKyAgdmFyIHJlZiA9IGVsZW1lbnQucmVmOworICBpZiAocmVmICE9IG51bGwpIHsK KyAgICBhdHRhY2hSZWYocmVmLCBpbnN0YW5jZSwgZWxlbWVudC5fb3duZXIpOworICB9Cit9Owor CitSZWFjdFJlZi5zaG91bGRVcGRhdGVSZWZzID0gZnVuY3Rpb24gKHByZXZFbGVtZW50LCBuZXh0 RWxlbWVudCkgeworICAvLyBJZiBlaXRoZXIgdGhlIG93bmVyIG9yIGEgYHJlZmAgaGFzIGNoYW5n ZWQsIG1ha2Ugc3VyZSB0aGUgbmV3ZXN0IG93bmVyCisgIC8vIGhhcyBzdG9yZWQgYSByZWZlcmVu Y2UgdG8gYHRoaXNgLCBhbmQgdGhlIHByZXZpb3VzIG93bmVyIChpZiBkaWZmZXJlbnQpCisgIC8v IGhhcyBmb3Jnb3R0ZW4gdGhlIHJlZmVyZW5jZSB0byBgdGhpc2AuIFdlIHVzZSB0aGUgZWxlbWVu dCBpbnN0ZWFkCisgIC8vIG9mIHRoZSBwdWJsaWMgdGhpcy5wcm9wcyBiZWNhdXNlIHRoZSBwb3N0 IHByb2Nlc3NpbmcgY2Fubm90IGRldGVybWluZQorICAvLyBhIHJlZi4gVGhlIHJlZiBjb25jZXB0 dWFsbHkgbGl2ZXMgb24gdGhlIGVsZW1lbnQuCisKKyAgLy8gVE9ETzogU2hvdWxkIHRoaXMgZXZl biBiZSBwb3NzaWJsZT8gVGhlIG93bmVyIGNhbm5vdCBjaGFuZ2UgYmVjYXVzZQorICAvLyBpdCdz IGZvcmJpZGRlbiBieSBzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudC4gVGhlIHJlZiBjYW4gY2hh bmdlCisgIC8vIGlmIHlvdSBzd2FwIHRoZSBrZXlzIG9mIGJ1dCBub3QgdGhlIHJlZnMuIFJlY29u c2lkZXIgd2hlcmUgdGhpcyBjaGVjaworICAvLyBpcyBtYWRlLiBJdCBwcm9iYWJseSBiZWxvbmdz IHdoZXJlIHRoZSBrZXkgY2hlY2tpbmcgYW5kCisgIC8vIGluc3RhbnRpYXRlUmVhY3RDb21wb25l bnQgaXMgZG9uZS4KKworICB2YXIgcHJldlJlZiA9IG51bGw7CisgIHZhciBwcmV2T3duZXIgPSBu dWxsOworICBpZiAocHJldkVsZW1lbnQgIT09IG51bGwgJiYgdHlwZW9mIHByZXZFbGVtZW50ID09 PSAnb2JqZWN0JykgeworICAgIHByZXZSZWYgPSBwcmV2RWxlbWVudC5yZWY7CisgICAgcHJldk93 bmVyID0gcHJldkVsZW1lbnQuX293bmVyOworICB9CisKKyAgdmFyIG5leHRSZWYgPSBudWxsOwor ICB2YXIgbmV4dE93bmVyID0gbnVsbDsKKyAgaWYgKG5leHRFbGVtZW50ICE9PSBudWxsICYmIHR5 cGVvZiBuZXh0RWxlbWVudCA9PT0gJ29iamVjdCcpIHsKKyAgICBuZXh0UmVmID0gbmV4dEVsZW1l bnQucmVmOworICAgIG5leHRPd25lciA9IG5leHRFbGVtZW50Ll9vd25lcjsKKyAgfQorCisgIHJl dHVybiBwcmV2UmVmICE9PSBuZXh0UmVmIHx8CisgIC8vIElmIG93bmVyIGNoYW5nZXMgYnV0IHdl IGhhdmUgYW4gdW5jaGFuZ2VkIGZ1bmN0aW9uIHJlZiwgZG9uJ3QgdXBkYXRlIHJlZnMKKyAgdHlw ZW9mIG5leHRSZWYgPT09ICdzdHJpbmcnICYmIG5leHRPd25lciAhPT0gcHJldk93bmVyOworfTsK KworUmVhY3RSZWYuZGV0YWNoUmVmcyA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgZWxlbWVudCkgewor ICBpZiAoZWxlbWVudCA9PT0gbnVsbCB8fCB0eXBlb2YgZWxlbWVudCAhPT0gJ29iamVjdCcpIHsK KyAgICByZXR1cm47CisgIH0KKyAgdmFyIHJlZiA9IGVsZW1lbnQucmVmOworICBpZiAocmVmICE9 IG51bGwpIHsKKyAgICBkZXRhY2hSZWYocmVmLCBpbnN0YW5jZSwgZWxlbWVudC5fb3duZXIpOwor ICB9Cit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0UmVmOworfSx7IjY0Ijo2NH1dLDcwOltm dW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTQt cHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog VGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2Ug Zm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRo aXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMg Y2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5Lgor ICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBSZWFjdFNlcnZlckJhdGNoaW5nU3RyYXRl Z3kgPSB7CisgIGlzQmF0Y2hpbmdVcGRhdGVzOiBmYWxzZSwKKyAgYmF0Y2hlZFVwZGF0ZXM6IGZ1 bmN0aW9uIChjYWxsYmFjaykgeworICAgIC8vIERvbid0IGRvIGFueXRoaW5nIGhlcmUuIER1cmlu ZyB0aGUgc2VydmVyIHJlbmRlcmluZyB3ZSBkb24ndCB3YW50IHRvCisgICAgLy8gc2NoZWR1bGUg YW55IHVwZGF0ZXMuIFdlIHdpbGwgc2ltcGx5IGlnbm9yZSB0aGVtLgorICB9Cit9OworCittb2R1 bGUuZXhwb3J0cyA9IFJlYWN0U2VydmVyQmF0Y2hpbmdTdHJhdGVneTsKK30se31dLDcxOltmdW5j dGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJl c2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhp cyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91 bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMg c291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2Fu IGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoK KyAqLworJ3VzZSBzdHJpY3QnOworCit2YXIgX3Byb2RJbnZhcmlhbnQgPSBfZGVyZXFfKDExNik7 CisKK3ZhciBSZWFjdCA9IF9kZXJlcV8oMTI0KTsKK3ZhciBSZWFjdERPTUNvbnRhaW5lckluZm8g PSBfZGVyZXFfKDMzKTsKK3ZhciBSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5ID0gX2RlcmVx Xyg0Nik7Cit2YXIgUmVhY3RJbnN0cnVtZW50YXRpb24gPSBfZGVyZXFfKDU5KTsKK3ZhciBSZWFj dE1hcmt1cENoZWNrc3VtID0gX2RlcmVxXyg2MSk7Cit2YXIgUmVhY3RSZWNvbmNpbGVyID0gX2Rl cmVxXyg2OCk7Cit2YXIgUmVhY3RTZXJ2ZXJCYXRjaGluZ1N0cmF0ZWd5ID0gX2RlcmVxXyg3MCk7 Cit2YXIgUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbiA9IF9kZXJlcV8oNzIpOwordmFy IFJlYWN0VXBkYXRlcyA9IF9kZXJlcV8oNzUpOworCit2YXIgZW1wdHlPYmplY3QgPSBfZGVyZXFf KDEzMyk7Cit2YXIgaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudCA9IF9kZXJlcV8oMTEyKTsKK3Zh ciBpbnZhcmlhbnQgPSBfZGVyZXFfKDE0MCk7CisKK3ZhciBwZW5kaW5nVHJhbnNhY3Rpb25zID0g MDsKKworLyoqCisgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudAorICogQHJldHVybiB7 c3RyaW5nfSB0aGUgSFRNTCBtYXJrdXAKKyAqLworZnVuY3Rpb24gcmVuZGVyVG9TdHJpbmdJbXBs KGVsZW1lbnQsIG1ha2VTdGF0aWNNYXJrdXApIHsKKyAgdmFyIHRyYW5zYWN0aW9uOworICB0cnkg eworICAgIFJlYWN0VXBkYXRlcy5pbmplY3Rpb24uaW5qZWN0QmF0Y2hpbmdTdHJhdGVneShSZWFj dFNlcnZlckJhdGNoaW5nU3RyYXRlZ3kpOworCisgICAgdHJhbnNhY3Rpb24gPSBSZWFjdFNlcnZl clJlbmRlcmluZ1RyYW5zYWN0aW9uLmdldFBvb2xlZChtYWtlU3RhdGljTWFya3VwKTsKKworICAg IHBlbmRpbmdUcmFuc2FjdGlvbnMrKzsKKworICAgIHJldHVybiB0cmFuc2FjdGlvbi5wZXJmb3Jt KGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBjb21wb25lbnRJbnN0YW5jZSA9IGluc3RhbnRpYXRl UmVhY3RDb21wb25lbnQoZWxlbWVudCwgdHJ1ZSk7CisgICAgICB2YXIgbWFya3VwID0gUmVhY3RS ZWNvbmNpbGVyLm1vdW50Q29tcG9uZW50KGNvbXBvbmVudEluc3RhbmNlLCB0cmFuc2FjdGlvbiwg bnVsbCwgUmVhY3RET01Db250YWluZXJJbmZvKCksIGVtcHR5T2JqZWN0LCAwIC8qIHBhcmVudERl YnVnSUQgKi8KKyAgICAgICk7CisgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rp b24nKSB7CisgICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblVubW91bnRD b21wb25lbnQoY29tcG9uZW50SW5zdGFuY2UuX2RlYnVnSUQpOworICAgICAgfQorICAgICAgaWYg KCFtYWtlU3RhdGljTWFya3VwKSB7CisgICAgICAgIG1hcmt1cCA9IFJlYWN0TWFya3VwQ2hlY2tz dW0uYWRkQ2hlY2tzdW1Ub01hcmt1cChtYXJrdXApOworICAgICAgfQorICAgICAgcmV0dXJuIG1h cmt1cDsKKyAgICB9LCBudWxsKTsKKyAgfSBmaW5hbGx5IHsKKyAgICBwZW5kaW5nVHJhbnNhY3Rp b25zLS07CisgICAgUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbi5yZWxlYXNlKHRyYW5z YWN0aW9uKTsKKyAgICAvLyBSZXZlcnQgdG8gdGhlIERPTSBiYXRjaGluZyBzdHJhdGVneSBzaW5j ZSB0aGVzZSB0d28gcmVuZGVyZXJzCisgICAgLy8gY3VycmVudGx5IHNoYXJlIHRoZXNlIHN0YXRl ZnVsIG1vZHVsZXMuCisgICAgaWYgKCFwZW5kaW5nVHJhbnNhY3Rpb25zKSB7CisgICAgICBSZWFj dFVwZGF0ZXMuaW5qZWN0aW9uLmluamVjdEJhdGNoaW5nU3RyYXRlZ3koUmVhY3REZWZhdWx0QmF0 Y2hpbmdTdHJhdGVneSk7CisgICAgfQorICB9Cit9CisKKy8qKgorICogUmVuZGVyIGEgUmVhY3RF bGVtZW50IHRvIGl0cyBpbml0aWFsIEhUTUwuIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBvbiB0 aGUKKyAqIHNlcnZlci4KKyAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9k b2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdGRvbXNlcnZlci5yZW5kZXJ0b3N0cmluZworICov CitmdW5jdGlvbiByZW5kZXJUb1N0cmluZyhlbGVtZW50KSB7CisgICFSZWFjdC5pc1ZhbGlkRWxl bWVudChlbGVtZW50KSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFu dChmYWxzZSwgJ3JlbmRlclRvU3RyaW5nKCk6IFlvdSBtdXN0IHBhc3MgYSB2YWxpZCBSZWFjdEVs ZW1lbnQuJykgOiBfcHJvZEludmFyaWFudCgnNDYnKSA6IHZvaWQgMDsKKyAgcmV0dXJuIHJlbmRl clRvU3RyaW5nSW1wbChlbGVtZW50LCBmYWxzZSk7Cit9CisKKy8qKgorICogU2ltaWxhciB0byBy ZW5kZXJUb1N0cmluZywgZXhjZXB0IHRoaXMgZG9lc24ndCBjcmVhdGUgZXh0cmEgRE9NIGF0dHJp YnV0ZXMKKyAqIHN1Y2ggYXMgZGF0YS1yZWFjdC1pZCB0aGF0IFJlYWN0IHVzZXMgaW50ZXJuYWxs eS4KKyAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZl bC1hcGkuaHRtbCNyZWFjdGRvbXNlcnZlci5yZW5kZXJ0b3N0YXRpY21hcmt1cAorICovCitmdW5j dGlvbiByZW5kZXJUb1N0YXRpY01hcmt1cChlbGVtZW50KSB7CisgICFSZWFjdC5pc1ZhbGlkRWxl bWVudChlbGVtZW50KSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFu dChmYWxzZSwgJ3JlbmRlclRvU3RhdGljTWFya3VwKCk6IFlvdSBtdXN0IHBhc3MgYSB2YWxpZCBS ZWFjdEVsZW1lbnQuJykgOiBfcHJvZEludmFyaWFudCgnNDcnKSA6IHZvaWQgMDsKKyAgcmV0dXJu IHJlbmRlclRvU3RyaW5nSW1wbChlbGVtZW50LCB0cnVlKTsKK30KKworbW9kdWxlLmV4cG9ydHMg PSB7CisgIHJlbmRlclRvU3RyaW5nOiByZW5kZXJUb1N0cmluZywKKyAgcmVuZGVyVG9TdGF0aWNN YXJrdXA6IHJlbmRlclRvU3RhdGljTWFya3VwCit9OworfSx7IjExMiI6MTEyLCIxMTYiOjExNiwi MTI0IjoxMjQsIjEzMyI6MTMzLCIxNDAiOjE0MCwiMzMiOjMzLCI0NiI6NDYsIjU5Ijo1OSwiNjEi OjYxLCI2OCI6NjgsIjcwIjo3MCwiNzIiOjcyLCI3NSI6NzV9XSw3MjpbZnVuY3Rpb24oX2RlcmVx Xyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQsIEZhY2Vi b29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNv ZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQor ICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVl LiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBp biB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3Vz ZSBzdHJpY3QnOworCit2YXIgX2Fzc2lnbiA9IF9kZXJlcV8oMTQ4KTsKKwordmFyIFBvb2xlZENs YXNzID0gX2RlcmVxXygyNCk7Cit2YXIgVHJhbnNhY3Rpb24gPSBfZGVyZXFfKDkzKTsKK3ZhciBS ZWFjdEluc3RydW1lbnRhdGlvbiA9IF9kZXJlcV8oNTkpOwordmFyIFJlYWN0U2VydmVyVXBkYXRl UXVldWUgPSBfZGVyZXFfKDczKTsKKworLyoqCisgKiBFeGVjdXRlZCB3aXRoaW4gdGhlIHNjb3Bl IG9mIHRoZSBgVHJhbnNhY3Rpb25gIGluc3RhbmNlLiBDb25zaWRlciB0aGVzZSBhcworICogYmVp bmcgbWVtYmVyIG1ldGhvZHMsIGJ1dCB3aXRoIGFuIGltcGxpZWQgb3JkZXJpbmcgd2hpbGUgYmVp bmcgaXNvbGF0ZWQgZnJvbQorICogZWFjaCBvdGhlci4KKyAqLwordmFyIFRSQU5TQUNUSU9OX1dS QVBQRVJTID0gW107CisKK2lmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAg VFJBTlNBQ1RJT05fV1JBUFBFUlMucHVzaCh7CisgICAgaW5pdGlhbGl6ZTogUmVhY3RJbnN0cnVt ZW50YXRpb24uZGVidWdUb29sLm9uQmVnaW5GbHVzaCwKKyAgICBjbG9zZTogUmVhY3RJbnN0cnVt ZW50YXRpb24uZGVidWdUb29sLm9uRW5kRmx1c2gKKyAgfSk7Cit9CisKK3ZhciBub29wQ2FsbGJh Y2tRdWV1ZSA9IHsKKyAgZW5xdWV1ZTogZnVuY3Rpb24gKCkge30KK307CisKKy8qKgorICogQGNs YXNzIFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb24KKyAqIEBwYXJhbSB7Ym9vbGVhbn0g cmVuZGVyVG9TdGF0aWNNYXJrdXAKKyAqLworZnVuY3Rpb24gUmVhY3RTZXJ2ZXJSZW5kZXJpbmdU cmFuc2FjdGlvbihyZW5kZXJUb1N0YXRpY01hcmt1cCkgeworICB0aGlzLnJlaW5pdGlhbGl6ZVRy YW5zYWN0aW9uKCk7CisgIHRoaXMucmVuZGVyVG9TdGF0aWNNYXJrdXAgPSByZW5kZXJUb1N0YXRp Y01hcmt1cDsKKyAgdGhpcy51c2VDcmVhdGVFbGVtZW50ID0gZmFsc2U7CisgIHRoaXMudXBkYXRl UXVldWUgPSBuZXcgUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZSh0aGlzKTsKK30KKwordmFyIE1peGlu ID0geworICAvKioKKyAgICogQHNlZSBUcmFuc2FjdGlvbgorICAgKiBAYWJzdHJhY3QKKyAgICog QGZpbmFsCisgICAqIEByZXR1cm4ge2FycmF5fSBFbXB0eSBsaXN0IG9mIG9wZXJhdGlvbiB3cmFw IHByb2NlZHVyZXMuCisgICAqLworICBnZXRUcmFuc2FjdGlvbldyYXBwZXJzOiBmdW5jdGlvbiAo KSB7CisgICAgcmV0dXJuIFRSQU5TQUNUSU9OX1dSQVBQRVJTOworICB9LAorCisgIC8qKgorICAg KiBAcmV0dXJuIHtvYmplY3R9IFRoZSBxdWV1ZSB0byBjb2xsZWN0IGBvbkRPTVJlYWR5YCBjYWxs YmFja3Mgd2l0aC4KKyAgICovCisgIGdldFJlYWN0TW91bnRSZWFkeTogZnVuY3Rpb24gKCkgewor ICAgIHJldHVybiBub29wQ2FsbGJhY2tRdWV1ZTsKKyAgfSwKKworICAvKioKKyAgICogQHJldHVy biB7b2JqZWN0fSBUaGUgcXVldWUgdG8gY29sbGVjdCBSZWFjdCBhc3luYyBldmVudHMuCisgICAq LworICBnZXRVcGRhdGVRdWV1ZTogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiB0aGlzLnVwZGF0 ZVF1ZXVlOworICB9LAorCisgIC8qKgorICAgKiBgUG9vbGVkQ2xhc3NgIGxvb2tzIGZvciB0aGlz LCBhbmQgd2lsbCBpbnZva2UgdGhpcyBiZWZvcmUgYWxsb3dpbmcgdGhpcworICAgKiBpbnN0YW5j ZSB0byBiZSByZXVzZWQuCisgICAqLworICBkZXN0cnVjdG9yOiBmdW5jdGlvbiAoKSB7fSwKKwor ICBjaGVja3BvaW50OiBmdW5jdGlvbiAoKSB7fSwKKworICByb2xsYmFjazogZnVuY3Rpb24gKCkg e30KK307CisKK19hc3NpZ24oUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbi5wcm90b3R5 cGUsIFRyYW5zYWN0aW9uLCBNaXhpbik7CisKK1Bvb2xlZENsYXNzLmFkZFBvb2xpbmdUbyhSZWFj dFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9uKTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdFNl cnZlclJlbmRlcmluZ1RyYW5zYWN0aW9uOworfSx7IjE0OCI6MTQ4LCIyNCI6MjQsIjU5Ijo1OSwi NzMiOjczLCI5MyI6OTN9XSw3MzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7Cisv KioKKyAqIENvcHlyaWdodCAyMDE1LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmln aHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIg dGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRo ZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50 CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGlu IHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisKK2Z1 bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5z dGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fu bm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQorCit2YXIgUmVhY3RVcGRhdGVR dWV1ZSA9IF9kZXJlcV8oNzQpOworCit2YXIgd2FybmluZyA9IF9kZXJlcV8oMTQ3KTsKKworZnVu Y3Rpb24gd2Fybk5vb3AocHVibGljSW5zdGFuY2UsIGNhbGxlck5hbWUpIHsKKyAgaWYgKCJkZXZl bG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgIHZhciBjb25zdHJ1Y3RvciA9IHB1Ymxp Y0luc3RhbmNlLmNvbnN0cnVjdG9yOworICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9u JyA/IHdhcm5pbmcoZmFsc2UsICclcyguLi4pOiBDYW4gb25seSB1cGRhdGUgYSBtb3VudGluZyBj b21wb25lbnQuICcgKyAnVGhpcyB1c3VhbGx5IG1lYW5zIHlvdSBjYWxsZWQgJXMoKSBvdXRzaWRl IGNvbXBvbmVudFdpbGxNb3VudCgpIG9uIHRoZSBzZXJ2ZXIuICcgKyAnVGhpcyBpcyBhIG5vLW9w LiBQbGVhc2UgY2hlY2sgdGhlIGNvZGUgZm9yIHRoZSAlcyBjb21wb25lbnQuJywgY2FsbGVyTmFt ZSwgY2FsbGVyTmFtZSwgY29uc3RydWN0b3IgJiYgKGNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8 IGNvbnN0cnVjdG9yLm5hbWUpIHx8ICdSZWFjdENsYXNzJykgOiB2b2lkIDA7CisgIH0KK30KKwor LyoqCisgKiBUaGlzIGlzIHRoZSB1cGRhdGUgcXVldWUgdXNlZCBmb3Igc2VydmVyIHJlbmRlcmlu Zy4KKyAqIEl0IGRlbGVnYXRlcyB0byBSZWFjdFVwZGF0ZVF1ZXVlIHdoaWxlIHNlcnZlciByZW5k ZXJpbmcgaXMgaW4gcHJvZ3Jlc3MgYW5kCisgKiBzd2l0Y2hlcyB0byBSZWFjdE5vb3BVcGRhdGVR dWV1ZSBhZnRlciB0aGUgdHJhbnNhY3Rpb24gaGFzIGNvbXBsZXRlZC4KKyAqIEBjbGFzcyBSZWFj dFNlcnZlclVwZGF0ZVF1ZXVlCisgKiBAcGFyYW0ge1RyYW5zYWN0aW9ufSB0cmFuc2FjdGlvbgor ICovCisKK3ZhciBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlID0gZnVuY3Rpb24gKCkgeworICBmdW5j dGlvbiBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlKHRyYW5zYWN0aW9uKSB7CisgICAgX2NsYXNzQ2Fs bENoZWNrKHRoaXMsIFJlYWN0U2VydmVyVXBkYXRlUXVldWUpOworCisgICAgdGhpcy50cmFuc2Fj dGlvbiA9IHRyYW5zYWN0aW9uOworICB9CisKKyAgLyoqCisgICAqIENoZWNrcyB3aGV0aGVyIG9y IG5vdCB0aGlzIGNvbXBvc2l0ZSBjb21wb25lbnQgaXMgbW91bnRlZC4KKyAgICogQHBhcmFtIHtS ZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2Ugd2Ugd2FudCB0byB0ZXN0Lgor ICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIG1vdW50ZWQsIGZhbHNlIG90aGVyd2lzZS4K KyAgICogQHByb3RlY3RlZAorICAgKiBAZmluYWwKKyAgICovCisKKworICBSZWFjdFNlcnZlclVw ZGF0ZVF1ZXVlLnByb3RvdHlwZS5pc01vdW50ZWQgPSBmdW5jdGlvbiBpc01vdW50ZWQocHVibGlj SW5zdGFuY2UpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH07CisKKyAgLyoqCisgICAqIEVucXVl dWUgYSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYWZ0ZXIgYWxsIHRoZSBwZW5kaW5n IHVwZGF0ZXMKKyAgICogaGF2ZSBwcm9jZXNzZWQuCisgICAqCisgICAqIEBwYXJhbSB7UmVhY3RD bGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRvIHVzZSBhcyBgdGhpc2AgY29udGV4 dC4KKyAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBzdGF0ZSBp cyB1cGRhdGVkLgorICAgKiBAaW50ZXJuYWwKKyAgICovCisKKworICBSZWFjdFNlcnZlclVwZGF0 ZVF1ZXVlLnByb3RvdHlwZS5lbnF1ZXVlQ2FsbGJhY2sgPSBmdW5jdGlvbiBlbnF1ZXVlQ2FsbGJh Y2socHVibGljSW5zdGFuY2UsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7CisgICAgaWYgKHRoaXMu dHJhbnNhY3Rpb24uaXNJblRyYW5zYWN0aW9uKCkpIHsKKyAgICAgIFJlYWN0VXBkYXRlUXVldWUu ZW5xdWV1ZUNhbGxiYWNrKHB1YmxpY0luc3RhbmNlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSk7Cisg ICAgfQorICB9OworCisgIC8qKgorICAgKiBGb3JjZXMgYW4gdXBkYXRlLiBUaGlzIHNob3VsZCBv bmx5IGJlIGludm9rZWQgd2hlbiBpdCBpcyBrbm93biB3aXRoCisgICAqIGNlcnRhaW50eSB0aGF0 IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLgorICAgKgorICAgKiBZb3UgbWF5 IHdhbnQgdG8gY2FsbCB0aGlzIHdoZW4geW91IGtub3cgdGhhdCBzb21lIGRlZXBlciBhc3BlY3Qg b2YgdGhlCisgICAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVg IHdhcyBub3QgY2FsbGVkLgorICAgKgorICAgKiBUaGlzIHdpbGwgbm90IGludm9rZSBgc2hvdWxk Q29tcG9uZW50VXBkYXRlYCwgYnV0IGl0IHdpbGwgaW52b2tlCisgICAqIGBjb21wb25lbnRXaWxs VXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuCisgICAqCisgICAqIEBwYXJhbSB7UmVh Y3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVy LgorICAgKiBAaW50ZXJuYWwKKyAgICovCisKKworICBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlLnBy b3RvdHlwZS5lbnF1ZXVlRm9yY2VVcGRhdGUgPSBmdW5jdGlvbiBlbnF1ZXVlRm9yY2VVcGRhdGUo cHVibGljSW5zdGFuY2UpIHsKKyAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5pc0luVHJhbnNhY3Rp b24oKSkgeworICAgICAgUmVhY3RVcGRhdGVRdWV1ZS5lbnF1ZXVlRm9yY2VVcGRhdGUocHVibGlj SW5zdGFuY2UpOworICAgIH0gZWxzZSB7CisgICAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwg J2ZvcmNlVXBkYXRlJyk7CisgICAgfQorICB9OworCisgIC8qKgorICAgKiBSZXBsYWNlcyBhbGwg b2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRoaXMgb3IgYHNldFN0YXRlYCB0byBtdXRhdGUgc3Rh dGUuCisgICAqIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS4KKyAg ICoKKyAgICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYHRoaXMuc3RhdGVgIHdpbGwgYmUg aW1tZWRpYXRlbHkgdXBkYXRlZCwgc28KKyAgICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRl ciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gdGhlIG9sZCB2YWx1ZS4KKyAgICoKKyAg ICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBz aG91bGQgcmVyZW5kZXIuCisgICAqIEBwYXJhbSB7b2JqZWN0fGZ1bmN0aW9ufSBjb21wbGV0ZVN0 YXRlIE5leHQgc3RhdGUuCisgICAqIEBpbnRlcm5hbAorICAgKi8KKworCisgIFJlYWN0U2VydmVy VXBkYXRlUXVldWUucHJvdG90eXBlLmVucXVldWVSZXBsYWNlU3RhdGUgPSBmdW5jdGlvbiBlbnF1 ZXVlUmVwbGFjZVN0YXRlKHB1YmxpY0luc3RhbmNlLCBjb21wbGV0ZVN0YXRlKSB7CisgICAgaWYg KHRoaXMudHJhbnNhY3Rpb24uaXNJblRyYW5zYWN0aW9uKCkpIHsKKyAgICAgIFJlYWN0VXBkYXRl UXVldWUuZW5xdWV1ZVJlcGxhY2VTdGF0ZShwdWJsaWNJbnN0YW5jZSwgY29tcGxldGVTdGF0ZSk7 CisgICAgfSBlbHNlIHsKKyAgICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAncmVwbGFjZVN0 YXRlJyk7CisgICAgfQorICB9OworCisgIC8qKgorICAgKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBz dGF0ZS4gVGhpcyBvbmx5IGV4aXN0cyBiZWNhdXNlIF9wZW5kaW5nU3RhdGUgaXMKKyAgICogaW50 ZXJuYWwuIFRoaXMgcHJvdmlkZXMgYSBtZXJnaW5nIHN0cmF0ZWd5IHRoYXQgaXMgbm90IGF2YWls YWJsZSB0byBkZWVwCisgICAqIHByb3BlcnRpZXMgd2hpY2ggaXMgY29uZnVzaW5nLiBUT0RPOiBF eHBvc2UgcGVuZGluZ1N0YXRlIG9yIGRvbid0IHVzZSBpdAorICAgKiBkdXJpbmcgdGhlIG1lcmdl LgorICAgKgorICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0 YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci4KKyAgICogQHBhcmFtIHtvYmplY3R8ZnVuY3Rpb259 IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgdG8gYmUgbWVyZ2VkIHdpdGggc3RhdGUu CisgICAqIEBpbnRlcm5hbAorICAgKi8KKworCisgIFJlYWN0U2VydmVyVXBkYXRlUXVldWUucHJv dG90eXBlLmVucXVldWVTZXRTdGF0ZSA9IGZ1bmN0aW9uIGVucXVldWVTZXRTdGF0ZShwdWJsaWNJ bnN0YW5jZSwgcGFydGlhbFN0YXRlKSB7CisgICAgaWYgKHRoaXMudHJhbnNhY3Rpb24uaXNJblRy YW5zYWN0aW9uKCkpIHsKKyAgICAgIFJlYWN0VXBkYXRlUXVldWUuZW5xdWV1ZVNldFN0YXRlKHB1 YmxpY0luc3RhbmNlLCBwYXJ0aWFsU3RhdGUpOworICAgIH0gZWxzZSB7CisgICAgICB3YXJuTm9v cChwdWJsaWNJbnN0YW5jZSwgJ3NldFN0YXRlJyk7CisgICAgfQorICB9OworCisgIHJldHVybiBS ZWFjdFNlcnZlclVwZGF0ZVF1ZXVlOworfSgpOworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0U2Vy dmVyVXBkYXRlUXVldWU7Cit9LHsiMTQ3IjoxNDcsIjc0Ijo3NH1dLDc0OltmdW5jdGlvbihfZGVy ZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTUtcHJlc2VudCwgRmFj ZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2Ug Y29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhl CisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRy ZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5k IGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisn dXNlIHN0cmljdCc7CisKK3ZhciBfcHJvZEludmFyaWFudCA9IF9kZXJlcV8oMTE2KTsKKwordmFy IFJlYWN0Q3VycmVudE93bmVyID0gX2RlcmVxXygxMjMpOwordmFyIFJlYWN0SW5zdGFuY2VNYXAg PSBfZGVyZXFfKDU4KTsKK3ZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IF9kZXJlcV8oNTkpOwor dmFyIFJlYWN0VXBkYXRlcyA9IF9kZXJlcV8oNzUpOworCit2YXIgaW52YXJpYW50ID0gX2RlcmVx XygxNDApOwordmFyIHdhcm5pbmcgPSBfZGVyZXFfKDE0Nyk7CisKK2Z1bmN0aW9uIGVucXVldWVV cGRhdGUoaW50ZXJuYWxJbnN0YW5jZSkgeworICBSZWFjdFVwZGF0ZXMuZW5xdWV1ZVVwZGF0ZShp bnRlcm5hbEluc3RhbmNlKTsKK30KKworZnVuY3Rpb24gZm9ybWF0VW5leHBlY3RlZEFyZ3VtZW50 KGFyZykgeworICB2YXIgdHlwZSA9IHR5cGVvZiBhcmc7CisgIGlmICh0eXBlICE9PSAnb2JqZWN0 JykgeworICAgIHJldHVybiB0eXBlOworICB9CisgIHZhciBkaXNwbGF5TmFtZSA9IGFyZy5jb25z dHJ1Y3RvciAmJiBhcmcuY29uc3RydWN0b3IubmFtZSB8fCB0eXBlOworICB2YXIga2V5cyA9IE9i amVjdC5rZXlzKGFyZyk7CisgIGlmIChrZXlzLmxlbmd0aCA+IDAgJiYga2V5cy5sZW5ndGggPCAy MCkgeworICAgIHJldHVybiBkaXNwbGF5TmFtZSArICcgKGtleXM6ICcgKyBrZXlzLmpvaW4oJywg JykgKyAnKSc7CisgIH0KKyAgcmV0dXJuIGRpc3BsYXlOYW1lOworfQorCitmdW5jdGlvbiBnZXRJ bnRlcm5hbEluc3RhbmNlUmVhZHlGb3JVcGRhdGUocHVibGljSW5zdGFuY2UsIGNhbGxlck5hbWUp IHsKKyAgdmFyIGludGVybmFsSW5zdGFuY2UgPSBSZWFjdEluc3RhbmNlTWFwLmdldChwdWJsaWNJ bnN0YW5jZSk7CisgIGlmICghaW50ZXJuYWxJbnN0YW5jZSkgeworICAgIGlmICgiZGV2ZWxvcG1l bnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIHZhciBjdG9yID0gcHVibGljSW5zdGFuY2Uu Y29uc3RydWN0b3I7CisgICAgICAvLyBPbmx5IHdhcm4gd2hlbiB3ZSBoYXZlIGEgY2FsbGVyTmFt ZS4gT3RoZXJ3aXNlIHdlIHNob3VsZCBiZSBzaWxlbnQuCisgICAgICAvLyBXZSdyZSBwcm9iYWJs eSBjYWxsaW5nIGZyb20gZW5xdWV1ZUNhbGxiYWNrLiBXZSBkb24ndCB3YW50IHRvIHdhcm4KKyAg ICAgIC8vIHRoZXJlIGJlY2F1c2Ugd2UgYWxyZWFkeSB3YXJuZWQgZm9yIHRoZSBjb3JyZXNwb25k aW5nIGxpZmVjeWNsZSBtZXRob2QuCisgICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlv bicgPyB3YXJuaW5nKCFjYWxsZXJOYW1lLCAnJXMoLi4uKTogQ2FuIG9ubHkgdXBkYXRlIGEgbW91 bnRlZCBvciBtb3VudGluZyBjb21wb25lbnQuICcgKyAnVGhpcyB1c3VhbGx5IG1lYW5zIHlvdSBj YWxsZWQgJXMoKSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LiAnICsgJ1RoaXMgaXMgYSBuby1v cC4gUGxlYXNlIGNoZWNrIHRoZSBjb2RlIGZvciB0aGUgJXMgY29tcG9uZW50LicsIGNhbGxlck5h bWUsIGNhbGxlck5hbWUsIGN0b3IgJiYgKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSB8 fCAnUmVhY3RDbGFzcycpIDogdm9pZCAwOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQor CisgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAiZGV2ZWxvcG1l bnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQg PT0gbnVsbCwgJyVzKC4uLik6IENhbm5vdCB1cGRhdGUgZHVyaW5nIGFuIGV4aXN0aW5nIHN0YXRl IHRyYW5zaXRpb24gKHN1Y2ggYXMgJyArICd3aXRoaW4gYHJlbmRlcmAgb3IgYW5vdGhlciBjb21w b25lbnRcJ3MgY29uc3RydWN0b3IpLiBSZW5kZXIgbWV0aG9kcyAnICsgJ3Nob3VsZCBiZSBhIHB1 cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlOyBjb25zdHJ1Y3RvciAnICsgJ3NpZGUtZWZm ZWN0cyBhcmUgYW4gYW50aS1wYXR0ZXJuLCBidXQgY2FuIGJlIG1vdmVkIHRvICcgKyAnYGNvbXBv bmVudFdpbGxNb3VudGAuJywgY2FsbGVyTmFtZSkgOiB2b2lkIDA7CisgIH0KKworICByZXR1cm4g aW50ZXJuYWxJbnN0YW5jZTsKK30KKworLyoqCisgKiBSZWFjdFVwZGF0ZVF1ZXVlIGFsbG93cyBm b3Igc3RhdGUgdXBkYXRlcyB0byBiZSBzY2hlZHVsZWQgaW50byBhIGxhdGVyCisgKiByZWNvbmNp bGlhdGlvbiBzdGVwLgorICovCit2YXIgUmVhY3RVcGRhdGVRdWV1ZSA9IHsKKworICAvKioKKyAg ICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCBpcyBtb3Vu dGVkLgorICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5j ZSB3ZSB3YW50IHRvIHRlc3QuCisgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbW91bnRl ZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKiBAcHJvdGVjdGVkCisgICAqIEBmaW5hbAorICAgKi8K KyAgaXNNb3VudGVkOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UpIHsKKyAgICBpZiAoImRldmVs b3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICB2YXIgb3duZXIgPSBSZWFjdEN1cnJl bnRPd25lci5jdXJyZW50OworICAgICAgaWYgKG93bmVyICE9PSBudWxsKSB7CisgICAgICAgICJk ZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcob3duZXIuX3dhcm5lZEFib3V0 UmVmc0luUmVuZGVyLCAnJXMgaXMgYWNjZXNzaW5nIGlzTW91bnRlZCBpbnNpZGUgaXRzIHJlbmRl cigpIGZ1bmN0aW9uLiAnICsgJ3JlbmRlcigpIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2Yg cHJvcHMgYW5kIHN0YXRlLiBJdCBzaG91bGQgJyArICduZXZlciBhY2Nlc3Mgc29tZXRoaW5nIHRo YXQgcmVxdWlyZXMgc3RhbGUgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyAnICsgJ3JlbmRlciwgc3Vj aCBhcyByZWZzLiBNb3ZlIHRoaXMgbG9naWMgdG8gY29tcG9uZW50RGlkTW91bnQgYW5kICcgKyAn Y29tcG9uZW50RGlkVXBkYXRlIGluc3RlYWQuJywgb3duZXIuZ2V0TmFtZSgpIHx8ICdBIGNvbXBv bmVudCcpIDogdm9pZCAwOworICAgICAgICBvd25lci5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIg PSB0cnVlOworICAgICAgfQorICAgIH0KKyAgICB2YXIgaW50ZXJuYWxJbnN0YW5jZSA9IFJlYWN0 SW5zdGFuY2VNYXAuZ2V0KHB1YmxpY0luc3RhbmNlKTsKKyAgICBpZiAoaW50ZXJuYWxJbnN0YW5j ZSkgeworICAgICAgLy8gRHVyaW5nIGNvbXBvbmVudFdpbGxNb3VudCBhbmQgcmVuZGVyIHRoaXMg d2lsbCBzdGlsbCBiZSBudWxsIGJ1dCBhZnRlcgorICAgICAgLy8gdGhhdCB3aWxsIGFsd2F5cyBy ZW5kZXIgdG8gc29tZXRoaW5nLiBBdCBsZWFzdCBmb3Igbm93LiBTbyB3ZSBjYW4gdXNlCisgICAg ICAvLyB0aGlzIGhhY2suCisgICAgICByZXR1cm4gISFpbnRlcm5hbEluc3RhbmNlLl9yZW5kZXJl ZENvbXBvbmVudDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAg fSwKKworICAvKioKKyAgICogRW5xdWV1ZSBhIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRl ZCBhZnRlciBhbGwgdGhlIHBlbmRpbmcgdXBkYXRlcworICAgKiBoYXZlIHByb2Nlc3NlZC4KKyAg ICoKKyAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2Ug dG8gdXNlIGFzIGB0aGlzYCBjb250ZXh0LgorICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJh Y2sgQ2FsbGVkIGFmdGVyIHN0YXRlIGlzIHVwZGF0ZWQuCisgICAqIEBwYXJhbSB7c3RyaW5nfSBj YWxsZXJOYW1lIE5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEku CisgICAqIEBpbnRlcm5hbAorICAgKi8KKyAgZW5xdWV1ZUNhbGxiYWNrOiBmdW5jdGlvbiAocHVi bGljSW5zdGFuY2UsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7CisgICAgUmVhY3RVcGRhdGVRdWV1 ZS52YWxpZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBjYWxsZXJOYW1lKTsKKyAgICB2YXIgaW50ZXJu YWxJbnN0YW5jZSA9IGdldEludGVybmFsSW5zdGFuY2VSZWFkeUZvclVwZGF0ZShwdWJsaWNJbnN0 YW5jZSk7CisKKyAgICAvLyBQcmV2aW91c2x5IHdlIHdvdWxkIHRocm93IGFuIGVycm9yIGlmIHdl IGRpZG4ndCBoYXZlIGFuIGludGVybmFsCisgICAgLy8gaW5zdGFuY2UuIFNpbmNlIHdlIHdhbnQg dG8gbWFrZSBpdCBhIG5vLW9wIGluc3RlYWQsIHdlIG1pcnJvciB0aGUgc2FtZQorICAgIC8vIGJl aGF2aW9yIHdlIGhhdmUgaW4gb3RoZXIgZW5xdWV1ZSogbWV0aG9kcy4KKyAgICAvLyBXZSBhbHNv IG5lZWQgdG8gaWdub3JlIGNhbGxiYWNrcyBpbiBjb21wb25lbnRXaWxsTW91bnQuIFNlZQorICAg IC8vIGVucXVldWVVcGRhdGVzLgorICAgIGlmICghaW50ZXJuYWxJbnN0YW5jZSkgeworICAgICAg cmV0dXJuIG51bGw7CisgICAgfQorCisgICAgaWYgKGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdD YWxsYmFja3MpIHsKKyAgICAgIGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdDYWxsYmFja3MucHVz aChjYWxsYmFjayk7CisgICAgfSBlbHNlIHsKKyAgICAgIGludGVybmFsSW5zdGFuY2UuX3BlbmRp bmdDYWxsYmFja3MgPSBbY2FsbGJhY2tdOworICAgIH0KKyAgICAvLyBUT0RPOiBUaGUgY2FsbGJh Y2sgaGVyZSBpcyBpZ25vcmVkIHdoZW4gc2V0U3RhdGUgaXMgY2FsbGVkIGZyb20KKyAgICAvLyBj b21wb25lbnRXaWxsTW91bnQuIEVpdGhlciBmaXggaXQgb3IgZGlzYWxsb3cgZG9pbmcgc28gY29t cGxldGVseSBpbgorICAgIC8vIGZhdm9yIG9mIGdldEluaXRpYWxTdGF0ZS4gQWx0ZXJuYXRpdmVs eSwgd2UgY2FuIGRpc2FsbG93CisgICAgLy8gY29tcG9uZW50V2lsbE1vdW50IGR1cmluZyBzZXJ2 ZXItc2lkZSByZW5kZXJpbmcuCisgICAgZW5xdWV1ZVVwZGF0ZShpbnRlcm5hbEluc3RhbmNlKTsK KyAgfSwKKworICBlbnF1ZXVlQ2FsbGJhY2tJbnRlcm5hbDogZnVuY3Rpb24gKGludGVybmFsSW5z dGFuY2UsIGNhbGxiYWNrKSB7CisgICAgaWYgKGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdDYWxs YmFja3MpIHsKKyAgICAgIGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdDYWxsYmFja3MucHVzaChj YWxsYmFjayk7CisgICAgfSBlbHNlIHsKKyAgICAgIGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdD YWxsYmFja3MgPSBbY2FsbGJhY2tdOworICAgIH0KKyAgICBlbnF1ZXVlVXBkYXRlKGludGVybmFs SW5zdGFuY2UpOworICB9LAorCisgIC8qKgorICAgKiBGb3JjZXMgYW4gdXBkYXRlLiBUaGlzIHNo b3VsZCBvbmx5IGJlIGludm9rZWQgd2hlbiBpdCBpcyBrbm93biB3aXRoCisgICAqIGNlcnRhaW50 eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLgorICAgKgorICAgKiBZ b3UgbWF5IHdhbnQgdG8gY2FsbCB0aGlzIHdoZW4geW91IGtub3cgdGhhdCBzb21lIGRlZXBlciBh c3BlY3Qgb2YgdGhlCisgICAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0 U3RhdGVgIHdhcyBub3QgY2FsbGVkLgorICAgKgorICAgKiBUaGlzIHdpbGwgbm90IGludm9rZSBg c2hvdWxkQ29tcG9uZW50VXBkYXRlYCwgYnV0IGl0IHdpbGwgaW52b2tlCisgICAqIGBjb21wb25l bnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuCisgICAqCisgICAqIEBwYXJh bSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJl cmVuZGVyLgorICAgKiBAaW50ZXJuYWwKKyAgICovCisgIGVucXVldWVGb3JjZVVwZGF0ZTogZnVu Y3Rpb24gKHB1YmxpY0luc3RhbmNlKSB7CisgICAgdmFyIGludGVybmFsSW5zdGFuY2UgPSBnZXRJ bnRlcm5hbEluc3RhbmNlUmVhZHlGb3JVcGRhdGUocHVibGljSW5zdGFuY2UsICdmb3JjZVVwZGF0 ZScpOworCisgICAgaWYgKCFpbnRlcm5hbEluc3RhbmNlKSB7CisgICAgICByZXR1cm47CisgICAg fQorCisgICAgaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ0ZvcmNlVXBkYXRlID0gdHJ1ZTsKKwor ICAgIGVucXVldWVVcGRhdGUoaW50ZXJuYWxJbnN0YW5jZSk7CisgIH0sCisKKyAgLyoqCisgICAq IFJlcGxhY2VzIGFsbCBvZiB0aGUgc3RhdGUuIEFsd2F5cyB1c2UgdGhpcyBvciBgc2V0U3RhdGVg IHRvIG11dGF0ZSBzdGF0ZS4KKyAgICogWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMg aW1tdXRhYmxlLgorICAgKgorICAgKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5z dGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzbworICAgKiBhY2Nlc3NpbmcgYHRo aXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZh bHVlLgorICAgKgorICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBp bnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci4KKyAgICogQHBhcmFtIHtvYmplY3R9IGNvbXBs ZXRlU3RhdGUgTmV4dCBzdGF0ZS4KKyAgICogQGludGVybmFsCisgICAqLworICBlbnF1ZXVlUmVw bGFjZVN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNvbXBsZXRlU3RhdGUpIHsKKyAg ICB2YXIgaW50ZXJuYWxJbnN0YW5jZSA9IGdldEludGVybmFsSW5zdGFuY2VSZWFkeUZvclVwZGF0 ZShwdWJsaWNJbnN0YW5jZSwgJ3JlcGxhY2VTdGF0ZScpOworCisgICAgaWYgKCFpbnRlcm5hbElu c3RhbmNlKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50ZXJuYWxJbnN0YW5jZS5f cGVuZGluZ1N0YXRlUXVldWUgPSBbY29tcGxldGVTdGF0ZV07CisgICAgaW50ZXJuYWxJbnN0YW5j ZS5fcGVuZGluZ1JlcGxhY2VTdGF0ZSA9IHRydWU7CisKKyAgICBlbnF1ZXVlVXBkYXRlKGludGVy bmFsSW5zdGFuY2UpOworICB9LAorCisgIC8qKgorICAgKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBz dGF0ZS4gVGhpcyBvbmx5IGV4aXN0cyBiZWNhdXNlIF9wZW5kaW5nU3RhdGUgaXMKKyAgICogaW50 ZXJuYWwuIFRoaXMgcHJvdmlkZXMgYSBtZXJnaW5nIHN0cmF0ZWd5IHRoYXQgaXMgbm90IGF2YWls YWJsZSB0byBkZWVwCisgICAqIHByb3BlcnRpZXMgd2hpY2ggaXMgY29uZnVzaW5nLiBUT0RPOiBF eHBvc2UgcGVuZGluZ1N0YXRlIG9yIGRvbid0IHVzZSBpdAorICAgKiBkdXJpbmcgdGhlIG1lcmdl LgorICAgKgorICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0 YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci4KKyAgICogQHBhcmFtIHtvYmplY3R9IHBhcnRpYWxT dGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgdG8gYmUgbWVyZ2VkIHdpdGggc3RhdGUuCisgICAqIEBp bnRlcm5hbAorICAgKi8KKyAgZW5xdWV1ZVNldFN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFu Y2UsIHBhcnRpYWxTdGF0ZSkgeworICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlv bicpIHsKKyAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblNldFN0YXRlKCk7 CisgICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHBhcnRpYWxT dGF0ZSAhPSBudWxsLCAnc2V0U3RhdGUoLi4uKTogWW91IHBhc3NlZCBhbiB1bmRlZmluZWQgb3Ig bnVsbCBzdGF0ZSBvYmplY3Q7ICcgKyAnaW5zdGVhZCwgdXNlIGZvcmNlVXBkYXRlKCkuJykgOiB2 b2lkIDA7CisgICAgfQorCisgICAgdmFyIGludGVybmFsSW5zdGFuY2UgPSBnZXRJbnRlcm5hbElu c3RhbmNlUmVhZHlGb3JVcGRhdGUocHVibGljSW5zdGFuY2UsICdzZXRTdGF0ZScpOworCisgICAg aWYgKCFpbnRlcm5hbEluc3RhbmNlKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFy IHF1ZXVlID0gaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ1N0YXRlUXVldWUgfHwgKGludGVybmFs SW5zdGFuY2UuX3BlbmRpbmdTdGF0ZVF1ZXVlID0gW10pOworICAgIHF1ZXVlLnB1c2gocGFydGlh bFN0YXRlKTsKKworICAgIGVucXVldWVVcGRhdGUoaW50ZXJuYWxJbnN0YW5jZSk7CisgIH0sCisK KyAgZW5xdWV1ZUVsZW1lbnRJbnRlcm5hbDogZnVuY3Rpb24gKGludGVybmFsSW5zdGFuY2UsIG5l eHRFbGVtZW50LCBuZXh0Q29udGV4dCkgeworICAgIGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdF bGVtZW50ID0gbmV4dEVsZW1lbnQ7CisgICAgLy8gVE9ETzogaW50cm9kdWNlIF9wZW5kaW5nQ29u dGV4dCBpbnN0ZWFkIG9mIHNldHRpbmcgaXQgZGlyZWN0bHkuCisgICAgaW50ZXJuYWxJbnN0YW5j ZS5fY29udGV4dCA9IG5leHRDb250ZXh0OworICAgIGVucXVldWVVcGRhdGUoaW50ZXJuYWxJbnN0 YW5jZSk7CisgIH0sCisKKyAgdmFsaWRhdGVDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBj YWxsZXJOYW1lKSB7CisgICAgISghY2FsbGJhY2sgfHwgdHlwZW9mIGNhbGxiYWNrID09PSAnZnVu Y3Rpb24nKSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxz ZSwgJyVzKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1l bnQgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY2FsbGVyTmFtZSwg Zm9ybWF0VW5leHBlY3RlZEFyZ3VtZW50KGNhbGxiYWNrKSkgOiBfcHJvZEludmFyaWFudCgnMTIy JywgY2FsbGVyTmFtZSwgZm9ybWF0VW5leHBlY3RlZEFyZ3VtZW50KGNhbGxiYWNrKSkgOiB2b2lk IDA7CisgIH0KKworfTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdFVwZGF0ZVF1ZXVlOworfSx7 IjExNiI6MTE2LCIxMjMiOjEyMywiMTQwIjoxNDAsIjE0NyI6MTQ3LCI1OCI6NTgsIjU5Ijo1OSwi NzUiOjc1fV0sNzU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBD b3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNl cnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qt c3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBk aXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2Yg cGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2Ft ZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9wcm9kSW52YXJp YW50ID0gX2RlcmVxXygxMTYpLAorICAgIF9hc3NpZ24gPSBfZGVyZXFfKDE0OCk7CisKK3ZhciBD YWxsYmFja1F1ZXVlID0gX2RlcmVxXyg2KTsKK3ZhciBQb29sZWRDbGFzcyA9IF9kZXJlcV8oMjQp OwordmFyIFJlYWN0RmVhdHVyZUZsYWdzID0gX2RlcmVxXyg1Myk7Cit2YXIgUmVhY3RSZWNvbmNp bGVyID0gX2RlcmVxXyg2OCk7Cit2YXIgVHJhbnNhY3Rpb24gPSBfZGVyZXFfKDkzKTsKKwordmFy IGludmFyaWFudCA9IF9kZXJlcV8oMTQwKTsKKwordmFyIGRpcnR5Q29tcG9uZW50cyA9IFtdOwor dmFyIHVwZGF0ZUJhdGNoTnVtYmVyID0gMDsKK3ZhciBhc2FwQ2FsbGJhY2tRdWV1ZSA9IENhbGxi YWNrUXVldWUuZ2V0UG9vbGVkKCk7Cit2YXIgYXNhcEVucXVldWVkID0gZmFsc2U7CisKK3ZhciBi YXRjaGluZ1N0cmF0ZWd5ID0gbnVsbDsKKworZnVuY3Rpb24gZW5zdXJlSW5qZWN0ZWQoKSB7Cisg ICEoUmVhY3RVcGRhdGVzLlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24gJiYgYmF0Y2hpbmdTdHJh dGVneSkgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2Us ICdSZWFjdFVwZGF0ZXM6IG11c3QgaW5qZWN0IGEgcmVjb25jaWxlIHRyYW5zYWN0aW9uIGNsYXNz IGFuZCBiYXRjaGluZyBzdHJhdGVneScpIDogX3Byb2RJbnZhcmlhbnQoJzEyMycpIDogdm9pZCAw OworfQorCit2YXIgTkVTVEVEX1VQREFURVMgPSB7CisgIGluaXRpYWxpemU6IGZ1bmN0aW9uICgp IHsKKyAgICB0aGlzLmRpcnR5Q29tcG9uZW50c0xlbmd0aCA9IGRpcnR5Q29tcG9uZW50cy5sZW5n dGg7CisgIH0sCisgIGNsb3NlOiBmdW5jdGlvbiAoKSB7CisgICAgaWYgKHRoaXMuZGlydHlDb21w b25lbnRzTGVuZ3RoICE9PSBkaXJ0eUNvbXBvbmVudHMubGVuZ3RoKSB7CisgICAgICAvLyBBZGRp dGlvbmFsIHVwZGF0ZXMgd2VyZSBlbnF1ZXVlZCBieSBjb21wb25lbnREaWRVcGRhdGUgaGFuZGxl cnMgb3IKKyAgICAgIC8vIHNpbWlsYXI7IGJlZm9yZSBvdXIgb3duIFVQREFURV9RVUVVRUlORyB3 cmFwcGVyIGNsb3Nlcywgd2Ugd2FudCB0byBydW4KKyAgICAgIC8vIHRoZXNlIG5ldyB1cGRhdGVz IHNvIHRoYXQgaWYgQSdzIGNvbXBvbmVudERpZFVwZGF0ZSBjYWxscyBzZXRTdGF0ZSBvbgorICAg ICAgLy8gQiwgQiB3aWxsIHVwZGF0ZSBiZWZvcmUgdGhlIGNhbGxiYWNrIEEncyB1cGRhdGVyIHBy b3ZpZGVkIHdoZW4gY2FsbGluZworICAgICAgLy8gc2V0U3RhdGUuCisgICAgICBkaXJ0eUNvbXBv bmVudHMuc3BsaWNlKDAsIHRoaXMuZGlydHlDb21wb25lbnRzTGVuZ3RoKTsKKyAgICAgIGZsdXNo QmF0Y2hlZFVwZGF0ZXMoKTsKKyAgICB9IGVsc2UgeworICAgICAgZGlydHlDb21wb25lbnRzLmxl bmd0aCA9IDA7CisgICAgfQorICB9Cit9OworCit2YXIgVVBEQVRFX1FVRVVFSU5HID0geworICBp bml0aWFsaXplOiBmdW5jdGlvbiAoKSB7CisgICAgdGhpcy5jYWxsYmFja1F1ZXVlLnJlc2V0KCk7 CisgIH0sCisgIGNsb3NlOiBmdW5jdGlvbiAoKSB7CisgICAgdGhpcy5jYWxsYmFja1F1ZXVlLm5v dGlmeUFsbCgpOworICB9Cit9OworCit2YXIgVFJBTlNBQ1RJT05fV1JBUFBFUlMgPSBbTkVTVEVE X1VQREFURVMsIFVQREFURV9RVUVVRUlOR107CisKK2Z1bmN0aW9uIFJlYWN0VXBkYXRlc0ZsdXNo VHJhbnNhY3Rpb24oKSB7CisgIHRoaXMucmVpbml0aWFsaXplVHJhbnNhY3Rpb24oKTsKKyAgdGhp cy5kaXJ0eUNvbXBvbmVudHNMZW5ndGggPSBudWxsOworICB0aGlzLmNhbGxiYWNrUXVldWUgPSBD YWxsYmFja1F1ZXVlLmdldFBvb2xlZCgpOworICB0aGlzLnJlY29uY2lsZVRyYW5zYWN0aW9uID0g UmVhY3RVcGRhdGVzLlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24uZ2V0UG9vbGVkKAorICAvKiB1 c2VDcmVhdGVFbGVtZW50ICovdHJ1ZSk7Cit9CisKK19hc3NpZ24oUmVhY3RVcGRhdGVzRmx1c2hU cmFuc2FjdGlvbi5wcm90b3R5cGUsIFRyYW5zYWN0aW9uLCB7CisgIGdldFRyYW5zYWN0aW9uV3Jh cHBlcnM6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gVFJBTlNBQ1RJT05fV1JBUFBFUlM7Cisg IH0sCisKKyAgZGVzdHJ1Y3RvcjogZnVuY3Rpb24gKCkgeworICAgIHRoaXMuZGlydHlDb21wb25l bnRzTGVuZ3RoID0gbnVsbDsKKyAgICBDYWxsYmFja1F1ZXVlLnJlbGVhc2UodGhpcy5jYWxsYmFj a1F1ZXVlKTsKKyAgICB0aGlzLmNhbGxiYWNrUXVldWUgPSBudWxsOworICAgIFJlYWN0VXBkYXRl cy5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uLnJlbGVhc2UodGhpcy5yZWNvbmNpbGVUcmFuc2Fj dGlvbik7CisgICAgdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbiA9IG51bGw7CisgIH0sCisKKyAg cGVyZm9ybTogZnVuY3Rpb24gKG1ldGhvZCwgc2NvcGUsIGEpIHsKKyAgICAvLyBFc3NlbnRpYWxs eSBjYWxscyBgdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbi5wZXJmb3JtKG1ldGhvZCwgc2NvcGUs IGEpYAorICAgIC8vIHdpdGggdGhpcyB0cmFuc2FjdGlvbidzIHdyYXBwZXJzIGFyb3VuZCBpdC4K KyAgICByZXR1cm4gVHJhbnNhY3Rpb24ucGVyZm9ybS5jYWxsKHRoaXMsIHRoaXMucmVjb25jaWxl VHJhbnNhY3Rpb24ucGVyZm9ybSwgdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbiwgbWV0aG9kLCBz Y29wZSwgYSk7CisgIH0KK30pOworCitQb29sZWRDbGFzcy5hZGRQb29saW5nVG8oUmVhY3RVcGRh dGVzRmx1c2hUcmFuc2FjdGlvbik7CisKK2Z1bmN0aW9uIGJhdGNoZWRVcGRhdGVzKGNhbGxiYWNr LCBhLCBiLCBjLCBkLCBlKSB7CisgIGVuc3VyZUluamVjdGVkKCk7CisgIHJldHVybiBiYXRjaGlu Z1N0cmF0ZWd5LmJhdGNoZWRVcGRhdGVzKGNhbGxiYWNrLCBhLCBiLCBjLCBkLCBlKTsKK30KKwor LyoqCisgKiBBcnJheSBjb21wYXJhdG9yIGZvciBSZWFjdENvbXBvbmVudHMgYnkgbW91bnQgb3Jk ZXJpbmcuCisgKgorICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gYzEgZmlyc3QgY29tcG9uZW50 IHlvdSdyZSBjb21wYXJpbmcKKyAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGMyIHNlY29uZCBj b21wb25lbnQgeW91J3JlIGNvbXBhcmluZworICogQHJldHVybiB7bnVtYmVyfSBSZXR1cm4gdmFs dWUgdXNhYmxlIGJ5IEFycmF5LnByb3RvdHlwZS5zb3J0KCkuCisgKi8KK2Z1bmN0aW9uIG1vdW50 T3JkZXJDb21wYXJhdG9yKGMxLCBjMikgeworICByZXR1cm4gYzEuX21vdW50T3JkZXIgLSBjMi5f bW91bnRPcmRlcjsKK30KKworZnVuY3Rpb24gcnVuQmF0Y2hlZFVwZGF0ZXModHJhbnNhY3Rpb24p IHsKKyAgdmFyIGxlbiA9IHRyYW5zYWN0aW9uLmRpcnR5Q29tcG9uZW50c0xlbmd0aDsKKyAgIShs ZW4gPT09IGRpcnR5Q29tcG9uZW50cy5sZW5ndGgpID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1 Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgZmx1c2ggdHJhbnNhY3Rpb25cJ3Mg c3RvcmVkIGRpcnR5LWNvbXBvbmVudHMgbGVuZ3RoICglcykgdG8gbWF0Y2ggZGlydHktY29tcG9u ZW50cyBhcnJheSBsZW5ndGggKCVzKS4nLCBsZW4sIGRpcnR5Q29tcG9uZW50cy5sZW5ndGgpIDog X3Byb2RJbnZhcmlhbnQoJzEyNCcsIGxlbiwgZGlydHlDb21wb25lbnRzLmxlbmd0aCkgOiB2b2lk IDA7CisKKyAgLy8gU2luY2UgcmVjb25jaWxpbmcgYSBjb21wb25lbnQgaGlnaGVyIGluIHRoZSBv d25lciBoaWVyYXJjaHkgdXN1YWxseSAobm90CisgIC8vIGFsd2F5cyAtLSBzZWUgc2hvdWxkQ29t cG9uZW50VXBkYXRlKCkpIHdpbGwgcmVjb25jaWxlIGNoaWxkcmVuLCByZWNvbmNpbGUKKyAgLy8g dGhlbSBiZWZvcmUgdGhlaXIgY2hpbGRyZW4gYnkgc29ydGluZyB0aGUgYXJyYXkuCisgIGRpcnR5 Q29tcG9uZW50cy5zb3J0KG1vdW50T3JkZXJDb21wYXJhdG9yKTsKKworICAvLyBBbnkgdXBkYXRl cyBlbnF1ZXVlZCB3aGlsZSByZWNvbmNpbGluZyBtdXN0IGJlIHBlcmZvcm1lZCBhZnRlciB0aGlz IGVudGlyZQorICAvLyBiYXRjaC4gT3RoZXJ3aXNlLCBpZiBkaXJ0eUNvbXBvbmVudHMgaXMgW0Es IEJdIHdoZXJlIEEgaGFzIGNoaWxkcmVuIEIgYW5kCisgIC8vIEMsIEIgY291bGQgdXBkYXRlIHR3 aWNlIGluIGEgc2luZ2xlIGJhdGNoIGlmIEMncyByZW5kZXIgZW5xdWV1ZXMgYW4gdXBkYXRlCisg IC8vIHRvIEIgKHNpbmNlIEIgd291bGQgaGF2ZSBhbHJlYWR5IHVwZGF0ZWQsIHdlIHNob3VsZCBz a2lwIGl0LCBhbmQgdGhlIG9ubHkKKyAgLy8gd2F5IHdlIGNhbiBrbm93IHRvIGRvIHNvIGlzIGJ5 IGNoZWNraW5nIHRoZSBiYXRjaCBjb3VudGVyKS4KKyAgdXBkYXRlQmF0Y2hOdW1iZXIrKzsKKwor ICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgLy8gSWYgYSBjb21wb25lbnQg aXMgdW5tb3VudGVkIGJlZm9yZSBwZW5kaW5nIGNoYW5nZXMgYXBwbHksIGl0IHdpbGwgc3RpbGwK KyAgICAvLyBiZSBoZXJlLCBidXQgd2UgYXNzdW1lIHRoYXQgaXQgaGFzIGNsZWFyZWQgaXRzIF9w ZW5kaW5nQ2FsbGJhY2tzIGFuZAorICAgIC8vIHRoYXQgcGVyZm9ybVVwZGF0ZUlmTmVjZXNzYXJ5 IGlzIGEgbm9vcC4KKyAgICB2YXIgY29tcG9uZW50ID0gZGlydHlDb21wb25lbnRzW2ldOworCisg ICAgLy8gSWYgcGVyZm9ybVVwZGF0ZUlmTmVjZXNzYXJ5IGhhcHBlbnMgdG8gZW5xdWV1ZSBhbnkg bmV3IHVwZGF0ZXMsIHdlCisgICAgLy8gc2hvdWxkbid0IGV4ZWN1dGUgdGhlIGNhbGxiYWNrcyB1 bnRpbCB0aGUgbmV4dCByZW5kZXIgaGFwcGVucywgc28KKyAgICAvLyBzdGFzaCB0aGUgY2FsbGJh Y2tzIGZpcnN0CisgICAgdmFyIGNhbGxiYWNrcyA9IGNvbXBvbmVudC5fcGVuZGluZ0NhbGxiYWNr czsKKyAgICBjb21wb25lbnQuX3BlbmRpbmdDYWxsYmFja3MgPSBudWxsOworCisgICAgdmFyIG1h cmtlck5hbWU7CisgICAgaWYgKFJlYWN0RmVhdHVyZUZsYWdzLmxvZ1RvcExldmVsUmVuZGVycykg eworICAgICAgdmFyIG5hbWVkQ29tcG9uZW50ID0gY29tcG9uZW50OworICAgICAgLy8gRHVjayB0 eXBlIFRvcExldmVsV3JhcHBlci4gVGhpcyBpcyBwcm9iYWJseSBhbHdheXMgdHJ1ZS4KKyAgICAg IGlmIChjb21wb25lbnQuX2N1cnJlbnRFbGVtZW50LnR5cGUuaXNSZWFjdFRvcExldmVsV3JhcHBl cikgeworICAgICAgICBuYW1lZENvbXBvbmVudCA9IGNvbXBvbmVudC5fcmVuZGVyZWRDb21wb25l bnQ7CisgICAgICB9CisgICAgICBtYXJrZXJOYW1lID0gJ1JlYWN0IHVwZGF0ZTogJyArIG5hbWVk Q29tcG9uZW50LmdldE5hbWUoKTsKKyAgICAgIGNvbnNvbGUudGltZShtYXJrZXJOYW1lKTsKKyAg ICB9CisKKyAgICBSZWFjdFJlY29uY2lsZXIucGVyZm9ybVVwZGF0ZUlmTmVjZXNzYXJ5KGNvbXBv bmVudCwgdHJhbnNhY3Rpb24ucmVjb25jaWxlVHJhbnNhY3Rpb24sIHVwZGF0ZUJhdGNoTnVtYmVy KTsKKworICAgIGlmIChtYXJrZXJOYW1lKSB7CisgICAgICBjb25zb2xlLnRpbWVFbmQobWFya2Vy TmFtZSk7CisgICAgfQorCisgICAgaWYgKGNhbGxiYWNrcykgeworICAgICAgZm9yICh2YXIgaiA9 IDA7IGogPCBjYWxsYmFja3MubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgdHJhbnNhY3Rpb24uY2Fs bGJhY2tRdWV1ZS5lbnF1ZXVlKGNhbGxiYWNrc1tqXSwgY29tcG9uZW50LmdldFB1YmxpY0luc3Rh bmNlKCkpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2YXIgZmx1c2hCYXRjaGVkVXBkYXRl cyA9IGZ1bmN0aW9uICgpIHsKKyAgLy8gUmVhY3RVcGRhdGVzRmx1c2hUcmFuc2FjdGlvbidzIHdy YXBwZXJzIHdpbGwgY2xlYXIgdGhlIGRpcnR5Q29tcG9uZW50cworICAvLyBhcnJheSBhbmQgcGVy Zm9ybSBhbnkgdXBkYXRlcyBlbnF1ZXVlZCBieSBtb3VudC1yZWFkeSBoYW5kbGVycyAoaS5lLiwK KyAgLy8gY29tcG9uZW50RGlkVXBkYXRlKSBidXQgd2UgbmVlZCB0byBjaGVjayBoZXJlIHRvbyBp biBvcmRlciB0byBjYXRjaAorICAvLyB1cGRhdGVzIGVucXVldWVkIGJ5IHNldFN0YXRlIGNhbGxi YWNrcyBhbmQgYXNhcCBjYWxscy4KKyAgd2hpbGUgKGRpcnR5Q29tcG9uZW50cy5sZW5ndGggfHwg YXNhcEVucXVldWVkKSB7CisgICAgaWYgKGRpcnR5Q29tcG9uZW50cy5sZW5ndGgpIHsKKyAgICAg IHZhciB0cmFuc2FjdGlvbiA9IFJlYWN0VXBkYXRlc0ZsdXNoVHJhbnNhY3Rpb24uZ2V0UG9vbGVk KCk7CisgICAgICB0cmFuc2FjdGlvbi5wZXJmb3JtKHJ1bkJhdGNoZWRVcGRhdGVzLCBudWxsLCB0 cmFuc2FjdGlvbik7CisgICAgICBSZWFjdFVwZGF0ZXNGbHVzaFRyYW5zYWN0aW9uLnJlbGVhc2Uo dHJhbnNhY3Rpb24pOworICAgIH0KKworICAgIGlmIChhc2FwRW5xdWV1ZWQpIHsKKyAgICAgIGFz YXBFbnF1ZXVlZCA9IGZhbHNlOworICAgICAgdmFyIHF1ZXVlID0gYXNhcENhbGxiYWNrUXVldWU7 CisgICAgICBhc2FwQ2FsbGJhY2tRdWV1ZSA9IENhbGxiYWNrUXVldWUuZ2V0UG9vbGVkKCk7Cisg ICAgICBxdWV1ZS5ub3RpZnlBbGwoKTsKKyAgICAgIENhbGxiYWNrUXVldWUucmVsZWFzZShxdWV1 ZSk7CisgICAgfQorICB9Cit9OworCisvKioKKyAqIE1hcmsgYSBjb21wb25lbnQgYXMgbmVlZGlu ZyBhIHJlcmVuZGVyLCBhZGRpbmcgYW4gb3B0aW9uYWwgY2FsbGJhY2sgdG8gYQorICogbGlzdCBv ZiBmdW5jdGlvbnMgd2hpY2ggd2lsbCBiZSBleGVjdXRlZCBvbmNlIHRoZSByZXJlbmRlciBvY2N1 cnMuCisgKi8KK2Z1bmN0aW9uIGVucXVldWVVcGRhdGUoY29tcG9uZW50KSB7CisgIGVuc3VyZUlu amVjdGVkKCk7CisKKyAgLy8gVmFyaW91cyBwYXJ0cyBvZiBvdXIgY29kZSAoc3VjaCBhcyBSZWFj dENvbXBvc2l0ZUNvbXBvbmVudCdzCisgIC8vIF9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnQpIGFz c3VtZSB0aGF0IGNhbGxzIHRvIHJlbmRlciBhcmVuJ3QgbmVzdGVkOworICAvLyB2ZXJpZnkgdGhh dCB0aGF0J3MgdGhlIGNhc2UuIChUaGlzIGlzIGNhbGxlZCBieSBlYWNoIHRvcC1sZXZlbCB1cGRh dGUKKyAgLy8gZnVuY3Rpb24sIGxpa2Ugc2V0U3RhdGUsIGZvcmNlVXBkYXRlLCBldGMuOyBjcmVh dGlvbiBhbmQKKyAgLy8gZGVzdHJ1Y3Rpb24gb2YgdG9wLWxldmVsIGNvbXBvbmVudHMgaXMgZ3Vh cmRlZCBpbiBSZWFjdE1vdW50LikKKworICBpZiAoIWJhdGNoaW5nU3RyYXRlZ3kuaXNCYXRjaGlu Z1VwZGF0ZXMpIHsKKyAgICBiYXRjaGluZ1N0cmF0ZWd5LmJhdGNoZWRVcGRhdGVzKGVucXVldWVV cGRhdGUsIGNvbXBvbmVudCk7CisgICAgcmV0dXJuOworICB9CisKKyAgZGlydHlDb21wb25lbnRz LnB1c2goY29tcG9uZW50KTsKKyAgaWYgKGNvbXBvbmVudC5fdXBkYXRlQmF0Y2hOdW1iZXIgPT0g bnVsbCkgeworICAgIGNvbXBvbmVudC5fdXBkYXRlQmF0Y2hOdW1iZXIgPSB1cGRhdGVCYXRjaE51 bWJlciArIDE7CisgIH0KK30KKworLyoqCisgKiBFbnF1ZXVlIGEgY2FsbGJhY2sgdG8gYmUgcnVu IGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgYmF0Y2hpbmcgY3ljbGUuIFRocm93cworICogaWYg bm8gdXBkYXRlcyBhcmUgY3VycmVudGx5IGJlaW5nIHBlcmZvcm1lZC4KKyAqLworZnVuY3Rpb24g YXNhcChjYWxsYmFjaywgY29udGV4dCkgeworICAhYmF0Y2hpbmdTdHJhdGVneS5pc0JhdGNoaW5n VXBkYXRlcyA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxz ZSwgJ1JlYWN0VXBkYXRlcy5hc2FwOiBDYW5cJ3QgZW5xdWV1ZSBhbiBhc2FwIGNhbGxiYWNrIGlu IGEgY29udGV4dCB3aGVyZXVwZGF0ZXMgYXJlIG5vdCBiZWluZyBiYXRjaGVkLicpIDogX3Byb2RJ bnZhcmlhbnQoJzEyNScpIDogdm9pZCAwOworICBhc2FwQ2FsbGJhY2tRdWV1ZS5lbnF1ZXVlKGNh bGxiYWNrLCBjb250ZXh0KTsKKyAgYXNhcEVucXVldWVkID0gdHJ1ZTsKK30KKwordmFyIFJlYWN0 VXBkYXRlc0luamVjdGlvbiA9IHsKKyAgaW5qZWN0UmVjb25jaWxlVHJhbnNhY3Rpb246IGZ1bmN0 aW9uIChSZWNvbmNpbGVUcmFuc2FjdGlvbikgeworICAgICFSZWNvbmNpbGVUcmFuc2FjdGlvbiA/ ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0 VXBkYXRlczogbXVzdCBwcm92aWRlIGEgcmVjb25jaWxlIHRyYW5zYWN0aW9uIGNsYXNzJykgOiBf cHJvZEludmFyaWFudCgnMTI2JykgOiB2b2lkIDA7CisgICAgUmVhY3RVcGRhdGVzLlJlYWN0UmVj b25jaWxlVHJhbnNhY3Rpb24gPSBSZWNvbmNpbGVUcmFuc2FjdGlvbjsKKyAgfSwKKworICBpbmpl Y3RCYXRjaGluZ1N0cmF0ZWd5OiBmdW5jdGlvbiAoX2JhdGNoaW5nU3RyYXRlZ3kpIHsKKyAgICAh X2JhdGNoaW5nU3RyYXRlZ3kgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZh cmlhbnQoZmFsc2UsICdSZWFjdFVwZGF0ZXM6IG11c3QgcHJvdmlkZSBhIGJhdGNoaW5nIHN0cmF0 ZWd5JykgOiBfcHJvZEludmFyaWFudCgnMTI3JykgOiB2b2lkIDA7CisgICAgISh0eXBlb2YgX2Jh dGNoaW5nU3RyYXRlZ3kuYmF0Y2hlZFVwZGF0ZXMgPT09ICdmdW5jdGlvbicpID8gImRldmVsb3Bt ZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RVcGRhdGVzOiBt dXN0IHByb3ZpZGUgYSBiYXRjaGVkVXBkYXRlcygpIGZ1bmN0aW9uJykgOiBfcHJvZEludmFyaWFu dCgnMTI4JykgOiB2b2lkIDA7CisgICAgISh0eXBlb2YgX2JhdGNoaW5nU3RyYXRlZ3kuaXNCYXRj aGluZ1VwZGF0ZXMgPT09ICdib29sZWFuJykgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlv bicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdFVwZGF0ZXM6IG11c3QgcHJvdmlkZSBhbiBpc0Jh dGNoaW5nVXBkYXRlcyBib29sZWFuIGF0dHJpYnV0ZScpIDogX3Byb2RJbnZhcmlhbnQoJzEyOScp IDogdm9pZCAwOworICAgIGJhdGNoaW5nU3RyYXRlZ3kgPSBfYmF0Y2hpbmdTdHJhdGVneTsKKyAg fQorfTsKKwordmFyIFJlYWN0VXBkYXRlcyA9IHsKKyAgLyoqCisgICAqIFJlYWN0IHJlZmVyZW5j ZXMgYFJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb25gIHVzaW5nIHRoaXMgcHJvcGVydHkgaW4gb3Jk ZXIKKyAgICogdG8gYWxsb3cgZGVwZW5kZW5jeSBpbmplY3Rpb24uCisgICAqCisgICAqIEBpbnRl cm5hbAorICAgKi8KKyAgUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbjogbnVsbCwKKworICBiYXRj aGVkVXBkYXRlczogYmF0Y2hlZFVwZGF0ZXMsCisgIGVucXVldWVVcGRhdGU6IGVucXVldWVVcGRh dGUsCisgIGZsdXNoQmF0Y2hlZFVwZGF0ZXM6IGZsdXNoQmF0Y2hlZFVwZGF0ZXMsCisgIGluamVj dGlvbjogUmVhY3RVcGRhdGVzSW5qZWN0aW9uLAorICBhc2FwOiBhc2FwCit9OworCittb2R1bGUu ZXhwb3J0cyA9IFJlYWN0VXBkYXRlczsKK30seyIxMTYiOjExNiwiMTQwIjoxNDAsIjE0OCI6MTQ4 LCIyNCI6MjQsIjUzIjo1MywiNiI6NiwiNjgiOjY4LCI5MyI6OTN9XSw3NjpbZnVuY3Rpb24oX2Rl cmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZh Y2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNl IGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRo ZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0 cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3Vu ZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKwor J3VzZSBzdHJpY3QnOworCittb2R1bGUuZXhwb3J0cyA9ICcxNS40LjInOworfSx7fV0sNzc6W2Z1 bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1w cmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBU aGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBm b3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhp cyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBj YW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisg KgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIE5TID0geworICB4bGluazogJ2h0dHA6Ly93 d3cudzMub3JnLzE5OTkveGxpbmsnLAorICB4bWw6ICdodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5 OC9uYW1lc3BhY2UnCit9OworCisvLyBXZSB1c2UgYXR0cmlidXRlcyBmb3IgZXZlcnl0aGluZyBT Vkcgc28gbGV0J3MgYXZvaWQgc29tZSBkdXBsaWNhdGlvbiBhbmQgcnVuCisvLyBjb2RlIGluc3Rl YWQuCisvLyBUaGUgZm9sbG93aW5nIGFyZSBhbGwgc3BlY2lmaWVkIGluIHRoZSBIVE1MIGNvbmZp ZyBhbHJlYWR5IHNvIHdlIGV4Y2x1ZGUgaGVyZS4KKy8vIC0gY2xhc3MgKGFzIGNsYXNzTmFtZSkK Ky8vIC0gY29sb3IKKy8vIC0gaGVpZ2h0CisvLyAtIGlkCisvLyAtIGxhbmcKKy8vIC0gbWF4Cisv LyAtIG1lZGlhCisvLyAtIG1ldGhvZAorLy8gLSBtaW4KKy8vIC0gbmFtZQorLy8gLSBzdHlsZQor Ly8gLSB0YXJnZXQKKy8vIC0gdHlwZQorLy8gLSB3aWR0aAordmFyIEFUVFJTID0geworICBhY2Nl bnRIZWlnaHQ6ICdhY2NlbnQtaGVpZ2h0JywKKyAgYWNjdW11bGF0ZTogMCwKKyAgYWRkaXRpdmU6 IDAsCisgIGFsaWdubWVudEJhc2VsaW5lOiAnYWxpZ25tZW50LWJhc2VsaW5lJywKKyAgYWxsb3dS ZW9yZGVyOiAnYWxsb3dSZW9yZGVyJywKKyAgYWxwaGFiZXRpYzogMCwKKyAgYW1wbGl0dWRlOiAw LAorICBhcmFiaWNGb3JtOiAnYXJhYmljLWZvcm0nLAorICBhc2NlbnQ6IDAsCisgIGF0dHJpYnV0 ZU5hbWU6ICdhdHRyaWJ1dGVOYW1lJywKKyAgYXR0cmlidXRlVHlwZTogJ2F0dHJpYnV0ZVR5cGUn LAorICBhdXRvUmV2ZXJzZTogJ2F1dG9SZXZlcnNlJywKKyAgYXppbXV0aDogMCwKKyAgYmFzZUZy ZXF1ZW5jeTogJ2Jhc2VGcmVxdWVuY3knLAorICBiYXNlUHJvZmlsZTogJ2Jhc2VQcm9maWxlJywK KyAgYmFzZWxpbmVTaGlmdDogJ2Jhc2VsaW5lLXNoaWZ0JywKKyAgYmJveDogMCwKKyAgYmVnaW46 IDAsCisgIGJpYXM6IDAsCisgIGJ5OiAwLAorICBjYWxjTW9kZTogJ2NhbGNNb2RlJywKKyAgY2Fw SGVpZ2h0OiAnY2FwLWhlaWdodCcsCisgIGNsaXA6IDAsCisgIGNsaXBQYXRoOiAnY2xpcC1wYXRo JywKKyAgY2xpcFJ1bGU6ICdjbGlwLXJ1bGUnLAorICBjbGlwUGF0aFVuaXRzOiAnY2xpcFBhdGhV bml0cycsCisgIGNvbG9ySW50ZXJwb2xhdGlvbjogJ2NvbG9yLWludGVycG9sYXRpb24nLAorICBj b2xvckludGVycG9sYXRpb25GaWx0ZXJzOiAnY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzJywK KyAgY29sb3JQcm9maWxlOiAnY29sb3ItcHJvZmlsZScsCisgIGNvbG9yUmVuZGVyaW5nOiAnY29s b3ItcmVuZGVyaW5nJywKKyAgY29udGVudFNjcmlwdFR5cGU6ICdjb250ZW50U2NyaXB0VHlwZScs CisgIGNvbnRlbnRTdHlsZVR5cGU6ICdjb250ZW50U3R5bGVUeXBlJywKKyAgY3Vyc29yOiAwLAor ICBjeDogMCwKKyAgY3k6IDAsCisgIGQ6IDAsCisgIGRlY2VsZXJhdGU6IDAsCisgIGRlc2NlbnQ6 IDAsCisgIGRpZmZ1c2VDb25zdGFudDogJ2RpZmZ1c2VDb25zdGFudCcsCisgIGRpcmVjdGlvbjog MCwKKyAgZGlzcGxheTogMCwKKyAgZGl2aXNvcjogMCwKKyAgZG9taW5hbnRCYXNlbGluZTogJ2Rv bWluYW50LWJhc2VsaW5lJywKKyAgZHVyOiAwLAorICBkeDogMCwKKyAgZHk6IDAsCisgIGVkZ2VN b2RlOiAnZWRnZU1vZGUnLAorICBlbGV2YXRpb246IDAsCisgIGVuYWJsZUJhY2tncm91bmQ6ICdl bmFibGUtYmFja2dyb3VuZCcsCisgIGVuZDogMCwKKyAgZXhwb25lbnQ6IDAsCisgIGV4dGVybmFs UmVzb3VyY2VzUmVxdWlyZWQ6ICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJywKKyAgZmlsbDog MCwKKyAgZmlsbE9wYWNpdHk6ICdmaWxsLW9wYWNpdHknLAorICBmaWxsUnVsZTogJ2ZpbGwtcnVs ZScsCisgIGZpbHRlcjogMCwKKyAgZmlsdGVyUmVzOiAnZmlsdGVyUmVzJywKKyAgZmlsdGVyVW5p dHM6ICdmaWx0ZXJVbml0cycsCisgIGZsb29kQ29sb3I6ICdmbG9vZC1jb2xvcicsCisgIGZsb29k T3BhY2l0eTogJ2Zsb29kLW9wYWNpdHknLAorICBmb2N1c2FibGU6IDAsCisgIGZvbnRGYW1pbHk6 ICdmb250LWZhbWlseScsCisgIGZvbnRTaXplOiAnZm9udC1zaXplJywKKyAgZm9udFNpemVBZGp1 c3Q6ICdmb250LXNpemUtYWRqdXN0JywKKyAgZm9udFN0cmV0Y2g6ICdmb250LXN0cmV0Y2gnLAor ICBmb250U3R5bGU6ICdmb250LXN0eWxlJywKKyAgZm9udFZhcmlhbnQ6ICdmb250LXZhcmlhbnQn LAorICBmb250V2VpZ2h0OiAnZm9udC13ZWlnaHQnLAorICBmb3JtYXQ6IDAsCisgIGZyb206IDAs CisgIGZ4OiAwLAorICBmeTogMCwKKyAgZzE6IDAsCisgIGcyOiAwLAorICBnbHlwaE5hbWU6ICdn bHlwaC1uYW1lJywKKyAgZ2x5cGhPcmllbnRhdGlvbkhvcml6b250YWw6ICdnbHlwaC1vcmllbnRh dGlvbi1ob3Jpem9udGFsJywKKyAgZ2x5cGhPcmllbnRhdGlvblZlcnRpY2FsOiAnZ2x5cGgtb3Jp ZW50YXRpb24tdmVydGljYWwnLAorICBnbHlwaFJlZjogJ2dseXBoUmVmJywKKyAgZ3JhZGllbnRU cmFuc2Zvcm06ICdncmFkaWVudFRyYW5zZm9ybScsCisgIGdyYWRpZW50VW5pdHM6ICdncmFkaWVu dFVuaXRzJywKKyAgaGFuZ2luZzogMCwKKyAgaG9yaXpBZHZYOiAnaG9yaXotYWR2LXgnLAorICBo b3Jpek9yaWdpblg6ICdob3Jpei1vcmlnaW4teCcsCisgIGlkZW9ncmFwaGljOiAwLAorICBpbWFn ZVJlbmRlcmluZzogJ2ltYWdlLXJlbmRlcmluZycsCisgICdpbic6IDAsCisgIGluMjogMCwKKyAg aW50ZXJjZXB0OiAwLAorICBrOiAwLAorICBrMTogMCwKKyAgazI6IDAsCisgIGszOiAwLAorICBr NDogMCwKKyAga2VybmVsTWF0cml4OiAna2VybmVsTWF0cml4JywKKyAga2VybmVsVW5pdExlbmd0 aDogJ2tlcm5lbFVuaXRMZW5ndGgnLAorICBrZXJuaW5nOiAwLAorICBrZXlQb2ludHM6ICdrZXlQ b2ludHMnLAorICBrZXlTcGxpbmVzOiAna2V5U3BsaW5lcycsCisgIGtleVRpbWVzOiAna2V5VGlt ZXMnLAorICBsZW5ndGhBZGp1c3Q6ICdsZW5ndGhBZGp1c3QnLAorICBsZXR0ZXJTcGFjaW5nOiAn bGV0dGVyLXNwYWNpbmcnLAorICBsaWdodGluZ0NvbG9yOiAnbGlnaHRpbmctY29sb3InLAorICBs aW1pdGluZ0NvbmVBbmdsZTogJ2xpbWl0aW5nQ29uZUFuZ2xlJywKKyAgbG9jYWw6IDAsCisgIG1h cmtlckVuZDogJ21hcmtlci1lbmQnLAorICBtYXJrZXJNaWQ6ICdtYXJrZXItbWlkJywKKyAgbWFy a2VyU3RhcnQ6ICdtYXJrZXItc3RhcnQnLAorICBtYXJrZXJIZWlnaHQ6ICdtYXJrZXJIZWlnaHQn LAorICBtYXJrZXJVbml0czogJ21hcmtlclVuaXRzJywKKyAgbWFya2VyV2lkdGg6ICdtYXJrZXJX aWR0aCcsCisgIG1hc2s6IDAsCisgIG1hc2tDb250ZW50VW5pdHM6ICdtYXNrQ29udGVudFVuaXRz JywKKyAgbWFza1VuaXRzOiAnbWFza1VuaXRzJywKKyAgbWF0aGVtYXRpY2FsOiAwLAorICBtb2Rl OiAwLAorICBudW1PY3RhdmVzOiAnbnVtT2N0YXZlcycsCisgIG9mZnNldDogMCwKKyAgb3BhY2l0 eTogMCwKKyAgb3BlcmF0b3I6IDAsCisgIG9yZGVyOiAwLAorICBvcmllbnQ6IDAsCisgIG9yaWVu dGF0aW9uOiAwLAorICBvcmlnaW46IDAsCisgIG92ZXJmbG93OiAwLAorICBvdmVybGluZVBvc2l0 aW9uOiAnb3ZlcmxpbmUtcG9zaXRpb24nLAorICBvdmVybGluZVRoaWNrbmVzczogJ292ZXJsaW5l LXRoaWNrbmVzcycsCisgIHBhaW50T3JkZXI6ICdwYWludC1vcmRlcicsCisgIHBhbm9zZTE6ICdw YW5vc2UtMScsCisgIHBhdGhMZW5ndGg6ICdwYXRoTGVuZ3RoJywKKyAgcGF0dGVybkNvbnRlbnRV bml0czogJ3BhdHRlcm5Db250ZW50VW5pdHMnLAorICBwYXR0ZXJuVHJhbnNmb3JtOiAncGF0dGVy blRyYW5zZm9ybScsCisgIHBhdHRlcm5Vbml0czogJ3BhdHRlcm5Vbml0cycsCisgIHBvaW50ZXJF dmVudHM6ICdwb2ludGVyLWV2ZW50cycsCisgIHBvaW50czogMCwKKyAgcG9pbnRzQXRYOiAncG9p bnRzQXRYJywKKyAgcG9pbnRzQXRZOiAncG9pbnRzQXRZJywKKyAgcG9pbnRzQXRaOiAncG9pbnRz QXRaJywKKyAgcHJlc2VydmVBbHBoYTogJ3ByZXNlcnZlQWxwaGEnLAorICBwcmVzZXJ2ZUFzcGVj dFJhdGlvOiAncHJlc2VydmVBc3BlY3RSYXRpbycsCisgIHByaW1pdGl2ZVVuaXRzOiAncHJpbWl0 aXZlVW5pdHMnLAorICByOiAwLAorICByYWRpdXM6IDAsCisgIHJlZlg6ICdyZWZYJywKKyAgcmVm WTogJ3JlZlknLAorICByZW5kZXJpbmdJbnRlbnQ6ICdyZW5kZXJpbmctaW50ZW50JywKKyAgcmVw ZWF0Q291bnQ6ICdyZXBlYXRDb3VudCcsCisgIHJlcGVhdER1cjogJ3JlcGVhdER1cicsCisgIHJl cXVpcmVkRXh0ZW5zaW9uczogJ3JlcXVpcmVkRXh0ZW5zaW9ucycsCisgIHJlcXVpcmVkRmVhdHVy ZXM6ICdyZXF1aXJlZEZlYXR1cmVzJywKKyAgcmVzdGFydDogMCwKKyAgcmVzdWx0OiAwLAorICBy b3RhdGU6IDAsCisgIHJ4OiAwLAorICByeTogMCwKKyAgc2NhbGU6IDAsCisgIHNlZWQ6IDAsCisg IHNoYXBlUmVuZGVyaW5nOiAnc2hhcGUtcmVuZGVyaW5nJywKKyAgc2xvcGU6IDAsCisgIHNwYWNp bmc6IDAsCisgIHNwZWN1bGFyQ29uc3RhbnQ6ICdzcGVjdWxhckNvbnN0YW50JywKKyAgc3BlY3Vs YXJFeHBvbmVudDogJ3NwZWN1bGFyRXhwb25lbnQnLAorICBzcGVlZDogMCwKKyAgc3ByZWFkTWV0 aG9kOiAnc3ByZWFkTWV0aG9kJywKKyAgc3RhcnRPZmZzZXQ6ICdzdGFydE9mZnNldCcsCisgIHN0 ZERldmlhdGlvbjogJ3N0ZERldmlhdGlvbicsCisgIHN0ZW1oOiAwLAorICBzdGVtdjogMCwKKyAg c3RpdGNoVGlsZXM6ICdzdGl0Y2hUaWxlcycsCisgIHN0b3BDb2xvcjogJ3N0b3AtY29sb3InLAor ICBzdG9wT3BhY2l0eTogJ3N0b3Atb3BhY2l0eScsCisgIHN0cmlrZXRocm91Z2hQb3NpdGlvbjog J3N0cmlrZXRocm91Z2gtcG9zaXRpb24nLAorICBzdHJpa2V0aHJvdWdoVGhpY2tuZXNzOiAnc3Ry aWtldGhyb3VnaC10aGlja25lc3MnLAorICBzdHJpbmc6IDAsCisgIHN0cm9rZTogMCwKKyAgc3Ry b2tlRGFzaGFycmF5OiAnc3Ryb2tlLWRhc2hhcnJheScsCisgIHN0cm9rZURhc2hvZmZzZXQ6ICdz dHJva2UtZGFzaG9mZnNldCcsCisgIHN0cm9rZUxpbmVjYXA6ICdzdHJva2UtbGluZWNhcCcsCisg IHN0cm9rZUxpbmVqb2luOiAnc3Ryb2tlLWxpbmVqb2luJywKKyAgc3Ryb2tlTWl0ZXJsaW1pdDog J3N0cm9rZS1taXRlcmxpbWl0JywKKyAgc3Ryb2tlT3BhY2l0eTogJ3N0cm9rZS1vcGFjaXR5JywK KyAgc3Ryb2tlV2lkdGg6ICdzdHJva2Utd2lkdGgnLAorICBzdXJmYWNlU2NhbGU6ICdzdXJmYWNl U2NhbGUnLAorICBzeXN0ZW1MYW5ndWFnZTogJ3N5c3RlbUxhbmd1YWdlJywKKyAgdGFibGVWYWx1 ZXM6ICd0YWJsZVZhbHVlcycsCisgIHRhcmdldFg6ICd0YXJnZXRYJywKKyAgdGFyZ2V0WTogJ3Rh cmdldFknLAorICB0ZXh0QW5jaG9yOiAndGV4dC1hbmNob3InLAorICB0ZXh0RGVjb3JhdGlvbjog J3RleHQtZGVjb3JhdGlvbicsCisgIHRleHRSZW5kZXJpbmc6ICd0ZXh0LXJlbmRlcmluZycsCisg IHRleHRMZW5ndGg6ICd0ZXh0TGVuZ3RoJywKKyAgdG86IDAsCisgIHRyYW5zZm9ybTogMCwKKyAg dTE6IDAsCisgIHUyOiAwLAorICB1bmRlcmxpbmVQb3NpdGlvbjogJ3VuZGVybGluZS1wb3NpdGlv bicsCisgIHVuZGVybGluZVRoaWNrbmVzczogJ3VuZGVybGluZS10aGlja25lc3MnLAorICB1bmlj b2RlOiAwLAorICB1bmljb2RlQmlkaTogJ3VuaWNvZGUtYmlkaScsCisgIHVuaWNvZGVSYW5nZTog J3VuaWNvZGUtcmFuZ2UnLAorICB1bml0c1BlckVtOiAndW5pdHMtcGVyLWVtJywKKyAgdkFscGhh YmV0aWM6ICd2LWFscGhhYmV0aWMnLAorICB2SGFuZ2luZzogJ3YtaGFuZ2luZycsCisgIHZJZGVv Z3JhcGhpYzogJ3YtaWRlb2dyYXBoaWMnLAorICB2TWF0aGVtYXRpY2FsOiAndi1tYXRoZW1hdGlj YWwnLAorICB2YWx1ZXM6IDAsCisgIHZlY3RvckVmZmVjdDogJ3ZlY3Rvci1lZmZlY3QnLAorICB2 ZXJzaW9uOiAwLAorICB2ZXJ0QWR2WTogJ3ZlcnQtYWR2LXknLAorICB2ZXJ0T3JpZ2luWDogJ3Zl cnQtb3JpZ2luLXgnLAorICB2ZXJ0T3JpZ2luWTogJ3ZlcnQtb3JpZ2luLXknLAorICB2aWV3Qm94 OiAndmlld0JveCcsCisgIHZpZXdUYXJnZXQ6ICd2aWV3VGFyZ2V0JywKKyAgdmlzaWJpbGl0eTog MCwKKyAgd2lkdGhzOiAwLAorICB3b3JkU3BhY2luZzogJ3dvcmQtc3BhY2luZycsCisgIHdyaXRp bmdNb2RlOiAnd3JpdGluZy1tb2RlJywKKyAgeDogMCwKKyAgeEhlaWdodDogJ3gtaGVpZ2h0JywK KyAgeDE6IDAsCisgIHgyOiAwLAorICB4Q2hhbm5lbFNlbGVjdG9yOiAneENoYW5uZWxTZWxlY3Rv cicsCisgIHhsaW5rQWN0dWF0ZTogJ3hsaW5rOmFjdHVhdGUnLAorICB4bGlua0FyY3JvbGU6ICd4 bGluazphcmNyb2xlJywKKyAgeGxpbmtIcmVmOiAneGxpbms6aHJlZicsCisgIHhsaW5rUm9sZTog J3hsaW5rOnJvbGUnLAorICB4bGlua1Nob3c6ICd4bGluazpzaG93JywKKyAgeGxpbmtUaXRsZTog J3hsaW5rOnRpdGxlJywKKyAgeGxpbmtUeXBlOiAneGxpbms6dHlwZScsCisgIHhtbEJhc2U6ICd4 bWw6YmFzZScsCisgIHhtbG5zOiAwLAorICB4bWxuc1hsaW5rOiAneG1sbnM6eGxpbmsnLAorICB4 bWxMYW5nOiAneG1sOmxhbmcnLAorICB4bWxTcGFjZTogJ3htbDpzcGFjZScsCisgIHk6IDAsCisg IHkxOiAwLAorICB5MjogMCwKKyAgeUNoYW5uZWxTZWxlY3RvcjogJ3lDaGFubmVsU2VsZWN0b3In LAorICB6OiAwLAorICB6b29tQW5kUGFuOiAnem9vbUFuZFBhbicKK307CisKK3ZhciBTVkdET01Q cm9wZXJ0eUNvbmZpZyA9IHsKKyAgUHJvcGVydGllczoge30sCisgIERPTUF0dHJpYnV0ZU5hbWVz cGFjZXM6IHsKKyAgICB4bGlua0FjdHVhdGU6IE5TLnhsaW5rLAorICAgIHhsaW5rQXJjcm9sZTog TlMueGxpbmssCisgICAgeGxpbmtIcmVmOiBOUy54bGluaywKKyAgICB4bGlua1JvbGU6IE5TLnhs aW5rLAorICAgIHhsaW5rU2hvdzogTlMueGxpbmssCisgICAgeGxpbmtUaXRsZTogTlMueGxpbmss CisgICAgeGxpbmtUeXBlOiBOUy54bGluaywKKyAgICB4bWxCYXNlOiBOUy54bWwsCisgICAgeG1s TGFuZzogTlMueG1sLAorICAgIHhtbFNwYWNlOiBOUy54bWwKKyAgfSwKKyAgRE9NQXR0cmlidXRl TmFtZXM6IHt9Cit9OworCitPYmplY3Qua2V5cyhBVFRSUykuZm9yRWFjaChmdW5jdGlvbiAoa2V5 KSB7CisgIFNWR0RPTVByb3BlcnR5Q29uZmlnLlByb3BlcnRpZXNba2V5XSA9IDA7CisgIGlmIChB VFRSU1trZXldKSB7CisgICAgU1ZHRE9NUHJvcGVydHlDb25maWcuRE9NQXR0cmlidXRlTmFtZXNb a2V5XSA9IEFUVFJTW2tleV07CisgIH0KK30pOworCittb2R1bGUuZXhwb3J0cyA9IFNWR0RPTVBy b3BlcnR5Q29uZmlnOworfSx7fV0sNzg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMp eworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxs IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVu ZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBp biB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBn cmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmls ZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFy IEV2ZW50UHJvcGFnYXRvcnMgPSBfZGVyZXFfKDE5KTsKK3ZhciBFeGVjdXRpb25FbnZpcm9ubWVu dCA9IF9kZXJlcV8oMTI2KTsKK3ZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSBfZGVyZXFfKDMy KTsKK3ZhciBSZWFjdElucHV0U2VsZWN0aW9uID0gX2RlcmVxXyg1Nyk7Cit2YXIgU3ludGhldGlj RXZlbnQgPSBfZGVyZXFfKDg0KTsKKwordmFyIGdldEFjdGl2ZUVsZW1lbnQgPSBfZGVyZXFfKDEz NSk7Cit2YXIgaXNUZXh0SW5wdXRFbGVtZW50ID0gX2RlcmVxXygxMTQpOwordmFyIHNoYWxsb3dF cXVhbCA9IF9kZXJlcV8oMTQ2KTsKKwordmFyIHNraXBTZWxlY3Rpb25DaGFuZ2VFdmVudCA9IEV4 ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSAmJiAnZG9jdW1lbnRNb2RlJyBpbiBkb2N1bWVu dCAmJiBkb2N1bWVudC5kb2N1bWVudE1vZGUgPD0gMTE7CisKK3ZhciBldmVudFR5cGVzID0gewor ICBzZWxlY3Q6IHsKKyAgICBwaGFzZWRSZWdpc3RyYXRpb25OYW1lczogeworICAgICAgYnViYmxl ZDogJ29uU2VsZWN0JywKKyAgICAgIGNhcHR1cmVkOiAnb25TZWxlY3RDYXB0dXJlJworICAgIH0s CisgICAgZGVwZW5kZW5jaWVzOiBbJ3RvcEJsdXInLCAndG9wQ29udGV4dE1lbnUnLCAndG9wRm9j dXMnLCAndG9wS2V5RG93bicsICd0b3BLZXlVcCcsICd0b3BNb3VzZURvd24nLCAndG9wTW91c2VV cCcsICd0b3BTZWxlY3Rpb25DaGFuZ2UnXQorICB9Cit9OworCit2YXIgYWN0aXZlRWxlbWVudCA9 IG51bGw7Cit2YXIgYWN0aXZlRWxlbWVudEluc3QgPSBudWxsOwordmFyIGxhc3RTZWxlY3Rpb24g PSBudWxsOwordmFyIG1vdXNlRG93biA9IGZhbHNlOworCisvLyBUcmFjayB3aGV0aGVyIGEgbGlz dGVuZXIgZXhpc3RzIGZvciB0aGlzIHBsdWdpbi4gSWYgbm9uZSBleGlzdCwgd2UgZG8KKy8vIG5v dCBleHRyYWN0IGV2ZW50cy4gU2VlICMzNjM5LgordmFyIGhhc0xpc3RlbmVyID0gZmFsc2U7CisK Ky8qKgorICogR2V0IGFuIG9iamVjdCB3aGljaCBpcyBhIHVuaXF1ZSByZXByZXNlbnRhdGlvbiBv ZiB0aGUgY3VycmVudCBzZWxlY3Rpb24uCisgKgorICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIG5v dCBiZSBjb25zaXN0ZW50IGFjcm9zcyBub2RlcyBvciBicm93c2VycywgYnV0CisgKiB0d28gaWRl bnRpY2FsIHNlbGVjdGlvbnMgb24gdGhlIHNhbWUgbm9kZSB3aWxsIHJldHVybiBpZGVudGljYWwg b2JqZWN0cy4KKyAqCisgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGUKKyAqIEByZXR1cm4ge29i amVjdH0KKyAqLworZnVuY3Rpb24gZ2V0U2VsZWN0aW9uKG5vZGUpIHsKKyAgaWYgKCdzZWxlY3Rp b25TdGFydCcgaW4gbm9kZSAmJiBSZWFjdElucHV0U2VsZWN0aW9uLmhhc1NlbGVjdGlvbkNhcGFi aWxpdGllcyhub2RlKSkgeworICAgIHJldHVybiB7CisgICAgICBzdGFydDogbm9kZS5zZWxlY3Rp b25TdGFydCwKKyAgICAgIGVuZDogbm9kZS5zZWxlY3Rpb25FbmQKKyAgICB9OworICB9IGVsc2Ug aWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24pIHsKKyAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93Lmdl dFNlbGVjdGlvbigpOworICAgIHJldHVybiB7CisgICAgICBhbmNob3JOb2RlOiBzZWxlY3Rpb24u YW5jaG9yTm9kZSwKKyAgICAgIGFuY2hvck9mZnNldDogc2VsZWN0aW9uLmFuY2hvck9mZnNldCwK KyAgICAgIGZvY3VzTm9kZTogc2VsZWN0aW9uLmZvY3VzTm9kZSwKKyAgICAgIGZvY3VzT2Zmc2V0 OiBzZWxlY3Rpb24uZm9jdXNPZmZzZXQKKyAgICB9OworICB9IGVsc2UgaWYgKGRvY3VtZW50LnNl bGVjdGlvbikgeworICAgIHZhciByYW5nZSA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5n ZSgpOworICAgIHJldHVybiB7CisgICAgICBwYXJlbnRFbGVtZW50OiByYW5nZS5wYXJlbnRFbGVt ZW50KCksCisgICAgICB0ZXh0OiByYW5nZS50ZXh0LAorICAgICAgdG9wOiByYW5nZS5ib3VuZGlu Z1RvcCwKKyAgICAgIGxlZnQ6IHJhbmdlLmJvdW5kaW5nTGVmdAorICAgIH07CisgIH0KK30KKwor LyoqCisgKiBQb2xsIHNlbGVjdGlvbiB0byBzZWUgd2hldGhlciBpdCdzIGNoYW5nZWQuCisgKgor ICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50CisgKiBAcmV0dXJuIHs/U3ludGhldGljRXZl bnR9CisgKi8KK2Z1bmN0aW9uIGNvbnN0cnVjdFNlbGVjdEV2ZW50KG5hdGl2ZUV2ZW50LCBuYXRp dmVFdmVudFRhcmdldCkgeworICAvLyBFbnN1cmUgd2UgaGF2ZSB0aGUgcmlnaHQgZWxlbWVudCwg YW5kIHRoYXQgdGhlIHVzZXIgaXMgbm90IGRyYWdnaW5nIGEKKyAgLy8gc2VsZWN0aW9uICh0aGlz IG1hdGNoZXMgbmF0aXZlIGBzZWxlY3RgIGV2ZW50IGJlaGF2aW9yKS4gSW4gSFRNTDUsIHNlbGVj dAorICAvLyBmaXJlcyBvbmx5IG9uIGlucHV0IGFuZCB0ZXh0YXJlYSB0aHVzIGlmIHRoZXJlJ3Mg bm8gZm9jdXNlZCBlbGVtZW50IHdlCisgIC8vIHdvbid0IGRpc3BhdGNoLgorICBpZiAobW91c2VE b3duIHx8IGFjdGl2ZUVsZW1lbnQgPT0gbnVsbCB8fCBhY3RpdmVFbGVtZW50ICE9PSBnZXRBY3Rp dmVFbGVtZW50KCkpIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8vIE9ubHkgZmlyZSB3 aGVuIHNlbGVjdGlvbiBoYXMgYWN0dWFsbHkgY2hhbmdlZC4KKyAgdmFyIGN1cnJlbnRTZWxlY3Rp b24gPSBnZXRTZWxlY3Rpb24oYWN0aXZlRWxlbWVudCk7CisgIGlmICghbGFzdFNlbGVjdGlvbiB8 fCAhc2hhbGxvd0VxdWFsKGxhc3RTZWxlY3Rpb24sIGN1cnJlbnRTZWxlY3Rpb24pKSB7CisgICAg bGFzdFNlbGVjdGlvbiA9IGN1cnJlbnRTZWxlY3Rpb247CisKKyAgICB2YXIgc3ludGhldGljRXZl bnQgPSBTeW50aGV0aWNFdmVudC5nZXRQb29sZWQoZXZlbnRUeXBlcy5zZWxlY3QsIGFjdGl2ZUVs ZW1lbnRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpOworCisgICAgc3ludGhl dGljRXZlbnQudHlwZSA9ICdzZWxlY3QnOworICAgIHN5bnRoZXRpY0V2ZW50LnRhcmdldCA9IGFj dGl2ZUVsZW1lbnQ7CisKKyAgICBFdmVudFByb3BhZ2F0b3JzLmFjY3VtdWxhdGVUd29QaGFzZURp c3BhdGNoZXMoc3ludGhldGljRXZlbnQpOworCisgICAgcmV0dXJuIHN5bnRoZXRpY0V2ZW50Owor ICB9CisKKyAgcmV0dXJuIG51bGw7Cit9CisKKy8qKgorICogVGhpcyBwbHVnaW4gY3JlYXRlcyBh biBgb25TZWxlY3RgIGV2ZW50IHRoYXQgbm9ybWFsaXplcyBzZWxlY3QgZXZlbnRzCisgKiBhY3Jv c3MgZm9ybSBlbGVtZW50cy4KKyAqCisgKiBTdXBwb3J0ZWQgZWxlbWVudHMgYXJlOgorICogLSBp bnB1dCAoc2VlIGBpc1RleHRJbnB1dEVsZW1lbnRgKQorICogLSB0ZXh0YXJlYQorICogLSBjb250 ZW50RWRpdGFibGUKKyAqCisgKiBUaGlzIGRpZmZlcnMgZnJvbSBuYXRpdmUgYnJvd3NlciBpbXBs ZW1lbnRhdGlvbnMgaW4gdGhlIGZvbGxvd2luZyB3YXlzOgorICogLSBGaXJlcyBvbiBjb250ZW50 RWRpdGFibGUgZmllbGRzIGFzIHdlbGwgYXMgaW5wdXRzLgorICogLSBGaXJlcyBmb3IgY29sbGFw c2VkIHNlbGVjdGlvbi4KKyAqIC0gRmlyZXMgYWZ0ZXIgdXNlciBpbnB1dC4KKyAqLwordmFyIFNl bGVjdEV2ZW50UGx1Z2luID0geworCisgIGV2ZW50VHlwZXM6IGV2ZW50VHlwZXMsCisKKyAgZXh0 cmFjdEV2ZW50czogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZl bnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7CisgICAgaWYgKCFoYXNMaXN0ZW5lcikgeworICAgICAg cmV0dXJuIG51bGw7CisgICAgfQorCisgICAgdmFyIHRhcmdldE5vZGUgPSB0YXJnZXRJbnN0ID8g UmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UodGFyZ2V0SW5zdCkgOiB3 aW5kb3c7CisKKyAgICBzd2l0Y2ggKHRvcExldmVsVHlwZSkgeworICAgICAgLy8gVHJhY2sgdGhl IGlucHV0IG5vZGUgdGhhdCBoYXMgZm9jdXMuCisgICAgICBjYXNlICd0b3BGb2N1cyc6CisgICAg ICAgIGlmIChpc1RleHRJbnB1dEVsZW1lbnQodGFyZ2V0Tm9kZSkgfHwgdGFyZ2V0Tm9kZS5jb250 ZW50RWRpdGFibGUgPT09ICd0cnVlJykgeworICAgICAgICAgIGFjdGl2ZUVsZW1lbnQgPSB0YXJn ZXROb2RlOworICAgICAgICAgIGFjdGl2ZUVsZW1lbnRJbnN0ID0gdGFyZ2V0SW5zdDsKKyAgICAg ICAgICBsYXN0U2VsZWN0aW9uID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAg ICAgIGNhc2UgJ3RvcEJsdXInOgorICAgICAgICBhY3RpdmVFbGVtZW50ID0gbnVsbDsKKyAgICAg ICAgYWN0aXZlRWxlbWVudEluc3QgPSBudWxsOworICAgICAgICBsYXN0U2VsZWN0aW9uID0gbnVs bDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8vIERvbid0IGZpcmUgdGhlIGV2ZW50IHdoaWxl IHRoZSB1c2VyIGlzIGRyYWdnaW5nLiBUaGlzIG1hdGNoZXMgdGhlCisgICAgICAvLyBzZW1hbnRp Y3Mgb2YgdGhlIG5hdGl2ZSBzZWxlY3QgZXZlbnQuCisgICAgICBjYXNlICd0b3BNb3VzZURvd24n OgorICAgICAgICBtb3VzZURvd24gPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Ug J3RvcENvbnRleHRNZW51JzoKKyAgICAgIGNhc2UgJ3RvcE1vdXNlVXAnOgorICAgICAgICBtb3Vz ZURvd24gPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGNvbnN0cnVjdFNlbGVjdEV2ZW50KG5hdGl2 ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7CisKKyAgICAgIC8vIENocm9tZSBhbmQgSUUgZmly ZSBub24tc3RhbmRhcmQgZXZlbnQgd2hlbiBzZWxlY3Rpb24gaXMgY2hhbmdlZCAoYW5kCisgICAg ICAvLyBzb21ldGltZXMgd2hlbiBpdCBoYXNuJ3QpLiBJRSdzIGV2ZW50IGZpcmVzIG91dCBvZiBv cmRlciB3aXRoIHJlc3BlY3QKKyAgICAgIC8vIHRvIGtleSBhbmQgaW5wdXQgZXZlbnRzIG9uIGRl bGV0aW9uLCBzbyB3ZSBkaXNjYXJkIGl0LgorICAgICAgLy8KKyAgICAgIC8vIEZpcmVmb3ggZG9l c24ndCBzdXBwb3J0IHNlbGVjdGlvbmNoYW5nZSwgc28gY2hlY2sgc2VsZWN0aW9uIHN0YXR1cwor ICAgICAgLy8gYWZ0ZXIgZWFjaCBrZXkgZW50cnkuIFRoZSBzZWxlY3Rpb24gY2hhbmdlcyBhZnRl ciBrZXlkb3duIGFuZCBiZWZvcmUKKyAgICAgIC8vIGtleXVwLCBidXQgd2UgY2hlY2sgb24ga2V5 ZG93biBhcyB3ZWxsIGluIHRoZSBjYXNlIG9mIGhvbGRpbmcgZG93biBhCisgICAgICAvLyBrZXks IHdoZW4gbXVsdGlwbGUga2V5ZG93biBldmVudHMgYXJlIGZpcmVkIGJ1dCBvbmx5IG9uZSBrZXl1 cCBpcy4KKyAgICAgIC8vIFRoaXMgaXMgYWxzbyBvdXIgYXBwcm9hY2ggZm9yIElFIGhhbmRsaW5n LCBmb3IgdGhlIHJlYXNvbiBhYm92ZS4KKyAgICAgIGNhc2UgJ3RvcFNlbGVjdGlvbkNoYW5nZSc6 CisgICAgICAgIGlmIChza2lwU2VsZWN0aW9uQ2hhbmdlRXZlbnQpIHsKKyAgICAgICAgICBicmVh azsKKyAgICAgICAgfQorICAgICAgLy8gZmFsbHMgdGhyb3VnaAorICAgICAgY2FzZSAndG9wS2V5 RG93bic6CisgICAgICBjYXNlICd0b3BLZXlVcCc6CisgICAgICAgIHJldHVybiBjb25zdHJ1Y3RT ZWxlY3RFdmVudChuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpOworICAgIH0KKworICAg IHJldHVybiBudWxsOworICB9LAorCisgIGRpZFB1dExpc3RlbmVyOiBmdW5jdGlvbiAoaW5zdCwg cmVnaXN0cmF0aW9uTmFtZSwgbGlzdGVuZXIpIHsKKyAgICBpZiAocmVnaXN0cmF0aW9uTmFtZSA9 PT0gJ29uU2VsZWN0JykgeworICAgICAgaGFzTGlzdGVuZXIgPSB0cnVlOworICAgIH0KKyAgfQor fTsKKworbW9kdWxlLmV4cG9ydHMgPSBTZWxlY3RFdmVudFBsdWdpbjsKK30seyIxMTQiOjExNCwi MTI2IjoxMjYsIjEzNSI6MTM1LCIxNDYiOjE0NiwiMTkiOjE5LCIzMiI6MzIsIjU3Ijo1NywiODQi Ojg0fV0sNzk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5 cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZl ZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5 bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJl Y3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0 ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBk aXJlY3RvcnkuCisgKgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX3Byb2RJbnZh cmlhbnQgPSBfZGVyZXFfKDExNik7CisKK3ZhciBFdmVudExpc3RlbmVyID0gX2RlcmVxXygxMjUp OwordmFyIEV2ZW50UHJvcGFnYXRvcnMgPSBfZGVyZXFfKDE5KTsKK3ZhciBSZWFjdERPTUNvbXBv bmVudFRyZWUgPSBfZGVyZXFfKDMyKTsKK3ZhciBTeW50aGV0aWNBbmltYXRpb25FdmVudCA9IF9k ZXJlcV8oODApOwordmFyIFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50ID0gX2RlcmVxXyg4MSk7Cit2 YXIgU3ludGhldGljRXZlbnQgPSBfZGVyZXFfKDg0KTsKK3ZhciBTeW50aGV0aWNGb2N1c0V2ZW50 ID0gX2RlcmVxXyg4NSk7Cit2YXIgU3ludGhldGljS2V5Ym9hcmRFdmVudCA9IF9kZXJlcV8oODcp OwordmFyIFN5bnRoZXRpY01vdXNlRXZlbnQgPSBfZGVyZXFfKDg4KTsKK3ZhciBTeW50aGV0aWNE cmFnRXZlbnQgPSBfZGVyZXFfKDgzKTsKK3ZhciBTeW50aGV0aWNUb3VjaEV2ZW50ID0gX2RlcmVx Xyg4OSk7Cit2YXIgU3ludGhldGljVHJhbnNpdGlvbkV2ZW50ID0gX2RlcmVxXyg5MCk7Cit2YXIg U3ludGhldGljVUlFdmVudCA9IF9kZXJlcV8oOTEpOwordmFyIFN5bnRoZXRpY1doZWVsRXZlbnQg PSBfZGVyZXFfKDkyKTsKKwordmFyIGVtcHR5RnVuY3Rpb24gPSBfZGVyZXFfKDEzMik7Cit2YXIg Z2V0RXZlbnRDaGFyQ29kZSA9IF9kZXJlcV8oMTAzKTsKK3ZhciBpbnZhcmlhbnQgPSBfZGVyZXFf KDE0MCk7CisKKy8qKgorICogVHVybnMKKyAqIFsnYWJvcnQnLCAuLi5dCisgKiBpbnRvCisgKiBl dmVudFR5cGVzID0geworICogICAnYWJvcnQnOiB7CisgKiAgICAgcGhhc2VkUmVnaXN0cmF0aW9u TmFtZXM6IHsKKyAqICAgICAgIGJ1YmJsZWQ6ICdvbkFib3J0JywKKyAqICAgICAgIGNhcHR1cmVk OiAnb25BYm9ydENhcHR1cmUnLAorICogICAgIH0sCisgKiAgICAgZGVwZW5kZW5jaWVzOiBbJ3Rv cEFib3J0J10sCisgKiAgIH0sCisgKiAgIC4uLgorICogfTsKKyAqIHRvcExldmVsRXZlbnRzVG9E aXNwYXRjaENvbmZpZyA9IHsKKyAqICAgJ3RvcEFib3J0JzogeyBzYW1lQ29uZmlnIH0KKyAqIH07 CisgKi8KK3ZhciBldmVudFR5cGVzID0ge307Cit2YXIgdG9wTGV2ZWxFdmVudHNUb0Rpc3BhdGNo Q29uZmlnID0ge307CitbJ2Fib3J0JywgJ2FuaW1hdGlvbkVuZCcsICdhbmltYXRpb25JdGVyYXRp b24nLCAnYW5pbWF0aW9uU3RhcnQnLCAnYmx1cicsICdjYW5QbGF5JywgJ2NhblBsYXlUaHJvdWdo JywgJ2NsaWNrJywgJ2NvbnRleHRNZW51JywgJ2NvcHknLCAnY3V0JywgJ2RvdWJsZUNsaWNrJywg J2RyYWcnLCAnZHJhZ0VuZCcsICdkcmFnRW50ZXInLCAnZHJhZ0V4aXQnLCAnZHJhZ0xlYXZlJywg J2RyYWdPdmVyJywgJ2RyYWdTdGFydCcsICdkcm9wJywgJ2R1cmF0aW9uQ2hhbmdlJywgJ2VtcHRp ZWQnLCAnZW5jcnlwdGVkJywgJ2VuZGVkJywgJ2Vycm9yJywgJ2ZvY3VzJywgJ2lucHV0JywgJ2lu dmFsaWQnLCAna2V5RG93bicsICdrZXlQcmVzcycsICdrZXlVcCcsICdsb2FkJywgJ2xvYWRlZERh dGEnLCAnbG9hZGVkTWV0YWRhdGEnLCAnbG9hZFN0YXJ0JywgJ21vdXNlRG93bicsICdtb3VzZU1v dmUnLCAnbW91c2VPdXQnLCAnbW91c2VPdmVyJywgJ21vdXNlVXAnLCAncGFzdGUnLCAncGF1c2Un LCAncGxheScsICdwbGF5aW5nJywgJ3Byb2dyZXNzJywgJ3JhdGVDaGFuZ2UnLCAncmVzZXQnLCAn c2Nyb2xsJywgJ3NlZWtlZCcsICdzZWVraW5nJywgJ3N0YWxsZWQnLCAnc3VibWl0JywgJ3N1c3Bl bmQnLCAndGltZVVwZGF0ZScsICd0b3VjaENhbmNlbCcsICd0b3VjaEVuZCcsICd0b3VjaE1vdmUn LCAndG91Y2hTdGFydCcsICd0cmFuc2l0aW9uRW5kJywgJ3ZvbHVtZUNoYW5nZScsICd3YWl0aW5n JywgJ3doZWVsJ10uZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHsKKyAgdmFyIGNhcGl0YWxpemVk RXZlbnQgPSBldmVudFswXS50b1VwcGVyQ2FzZSgpICsgZXZlbnQuc2xpY2UoMSk7CisgIHZhciBv bkV2ZW50ID0gJ29uJyArIGNhcGl0YWxpemVkRXZlbnQ7CisgIHZhciB0b3BFdmVudCA9ICd0b3An ICsgY2FwaXRhbGl6ZWRFdmVudDsKKworICB2YXIgdHlwZSA9IHsKKyAgICBwaGFzZWRSZWdpc3Ry YXRpb25OYW1lczogeworICAgICAgYnViYmxlZDogb25FdmVudCwKKyAgICAgIGNhcHR1cmVkOiBv bkV2ZW50ICsgJ0NhcHR1cmUnCisgICAgfSwKKyAgICBkZXBlbmRlbmNpZXM6IFt0b3BFdmVudF0K KyAgfTsKKyAgZXZlbnRUeXBlc1tldmVudF0gPSB0eXBlOworICB0b3BMZXZlbEV2ZW50c1RvRGlz cGF0Y2hDb25maWdbdG9wRXZlbnRdID0gdHlwZTsKK30pOworCit2YXIgb25DbGlja0xpc3RlbmVy cyA9IHt9OworCitmdW5jdGlvbiBnZXREaWN0aW9uYXJ5S2V5KGluc3QpIHsKKyAgLy8gUHJldmVu dHMgVjggcGVyZm9ybWFuY2UgaXNzdWU6CisgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9v ay9yZWFjdC9wdWxsLzcyMzIKKyAgcmV0dXJuICcuJyArIGluc3QuX3Jvb3ROb2RlSUQ7Cit9CisK K2Z1bmN0aW9uIGlzSW50ZXJhY3RpdmUodGFnKSB7CisgIHJldHVybiB0YWcgPT09ICdidXR0b24n IHx8IHRhZyA9PT0gJ2lucHV0JyB8fCB0YWcgPT09ICdzZWxlY3QnIHx8IHRhZyA9PT0gJ3RleHRh cmVhJzsKK30KKwordmFyIFNpbXBsZUV2ZW50UGx1Z2luID0geworCisgIGV2ZW50VHlwZXM6IGV2 ZW50VHlwZXMsCisKKyAgZXh0cmFjdEV2ZW50czogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgdGFy Z2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7CisgICAgdmFyIGRpc3Bh dGNoQ29uZmlnID0gdG9wTGV2ZWxFdmVudHNUb0Rpc3BhdGNoQ29uZmlnW3RvcExldmVsVHlwZV07 CisgICAgaWYgKCFkaXNwYXRjaENvbmZpZykgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQor ICAgIHZhciBFdmVudENvbnN0cnVjdG9yOworICAgIHN3aXRjaCAodG9wTGV2ZWxUeXBlKSB7Cisg ICAgICBjYXNlICd0b3BBYm9ydCc6CisgICAgICBjYXNlICd0b3BDYW5QbGF5JzoKKyAgICAgIGNh c2UgJ3RvcENhblBsYXlUaHJvdWdoJzoKKyAgICAgIGNhc2UgJ3RvcER1cmF0aW9uQ2hhbmdlJzoK KyAgICAgIGNhc2UgJ3RvcEVtcHRpZWQnOgorICAgICAgY2FzZSAndG9wRW5jcnlwdGVkJzoKKyAg ICAgIGNhc2UgJ3RvcEVuZGVkJzoKKyAgICAgIGNhc2UgJ3RvcEVycm9yJzoKKyAgICAgIGNhc2Ug J3RvcElucHV0JzoKKyAgICAgIGNhc2UgJ3RvcEludmFsaWQnOgorICAgICAgY2FzZSAndG9wTG9h ZCc6CisgICAgICBjYXNlICd0b3BMb2FkZWREYXRhJzoKKyAgICAgIGNhc2UgJ3RvcExvYWRlZE1l dGFkYXRhJzoKKyAgICAgIGNhc2UgJ3RvcExvYWRTdGFydCc6CisgICAgICBjYXNlICd0b3BQYXVz ZSc6CisgICAgICBjYXNlICd0b3BQbGF5JzoKKyAgICAgIGNhc2UgJ3RvcFBsYXlpbmcnOgorICAg ICAgY2FzZSAndG9wUHJvZ3Jlc3MnOgorICAgICAgY2FzZSAndG9wUmF0ZUNoYW5nZSc6CisgICAg ICBjYXNlICd0b3BSZXNldCc6CisgICAgICBjYXNlICd0b3BTZWVrZWQnOgorICAgICAgY2FzZSAn dG9wU2Vla2luZyc6CisgICAgICBjYXNlICd0b3BTdGFsbGVkJzoKKyAgICAgIGNhc2UgJ3RvcFN1 Ym1pdCc6CisgICAgICBjYXNlICd0b3BTdXNwZW5kJzoKKyAgICAgIGNhc2UgJ3RvcFRpbWVVcGRh dGUnOgorICAgICAgY2FzZSAndG9wVm9sdW1lQ2hhbmdlJzoKKyAgICAgIGNhc2UgJ3RvcFdhaXRp bmcnOgorICAgICAgICAvLyBIVE1MIEV2ZW50cworICAgICAgICAvLyBAc2VlIGh0dHA6Ly93d3cu dzMub3JnL1RSL2h0bWw1L2luZGV4Lmh0bWwjZXZlbnRzLTAKKyAgICAgICAgRXZlbnRDb25zdHJ1 Y3RvciA9IFN5bnRoZXRpY0V2ZW50OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3RvcEtl eVByZXNzJzoKKyAgICAgICAgLy8gRmlyZWZveCBjcmVhdGVzIGEga2V5cHJlc3MgZXZlbnQgZm9y IGZ1bmN0aW9uIGtleXMgdG9vLiBUaGlzIHJlbW92ZXMKKyAgICAgICAgLy8gdGhlIHVud2FudGVk IGtleXByZXNzIGV2ZW50cy4gRW50ZXIgaXMgaG93ZXZlciBib3RoIHByaW50YWJsZSBhbmQKKyAg ICAgICAgLy8gbm9uLXByaW50YWJsZS4gT25lIHdvdWxkIGV4cGVjdCBUYWIgdG8gYmUgYXMgd2Vs bCAoYnV0IGl0IGlzbid0KS4KKyAgICAgICAgaWYgKGdldEV2ZW50Q2hhckNvZGUobmF0aXZlRXZl bnQpID09PSAwKSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgIC8q IGZhbGxzIHRocm91Z2ggKi8KKyAgICAgIGNhc2UgJ3RvcEtleURvd24nOgorICAgICAgY2FzZSAn dG9wS2V5VXAnOgorICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljS2V5Ym9hcmRF dmVudDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICd0b3BCbHVyJzoKKyAgICAgIGNhc2Ug J3RvcEZvY3VzJzoKKyAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY0ZvY3VzRXZl bnQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAndG9wQ2xpY2snOgorICAgICAgICAvLyBG aXJlZm94IGNyZWF0ZXMgYSBjbGljayBldmVudCBvbiByaWdodCBtb3VzZSBjbGlja3MuIFRoaXMg cmVtb3ZlcyB0aGUKKyAgICAgICAgLy8gdW53YW50ZWQgY2xpY2sgZXZlbnRzLgorICAgICAgICBp ZiAobmF0aXZlRXZlbnQuYnV0dG9uID09PSAyKSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7Cisg ICAgICAgIH0KKyAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi8KKyAgICAgIGNhc2UgJ3RvcERvdWJs ZUNsaWNrJzoKKyAgICAgIGNhc2UgJ3RvcE1vdXNlRG93bic6CisgICAgICBjYXNlICd0b3BNb3Vz ZU1vdmUnOgorICAgICAgY2FzZSAndG9wTW91c2VVcCc6CisgICAgICAvLyBUT0RPOiBEaXNhYmxl ZCBlbGVtZW50cyBzaG91bGQgbm90IHJlc3BvbmQgdG8gbW91c2UgZXZlbnRzCisgICAgICAvKiBm YWxscyB0aHJvdWdoICovCisgICAgICBjYXNlICd0b3BNb3VzZU91dCc6CisgICAgICBjYXNlICd0 b3BNb3VzZU92ZXInOgorICAgICAgY2FzZSAndG9wQ29udGV4dE1lbnUnOgorICAgICAgICBFdmVu dENvbnN0cnVjdG9yID0gU3ludGhldGljTW91c2VFdmVudDsKKyAgICAgICAgYnJlYWs7CisgICAg ICBjYXNlICd0b3BEcmFnJzoKKyAgICAgIGNhc2UgJ3RvcERyYWdFbmQnOgorICAgICAgY2FzZSAn dG9wRHJhZ0VudGVyJzoKKyAgICAgIGNhc2UgJ3RvcERyYWdFeGl0JzoKKyAgICAgIGNhc2UgJ3Rv cERyYWdMZWF2ZSc6CisgICAgICBjYXNlICd0b3BEcmFnT3Zlcic6CisgICAgICBjYXNlICd0b3BE cmFnU3RhcnQnOgorICAgICAgY2FzZSAndG9wRHJvcCc6CisgICAgICAgIEV2ZW50Q29uc3RydWN0 b3IgPSBTeW50aGV0aWNEcmFnRXZlbnQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAndG9w VG91Y2hDYW5jZWwnOgorICAgICAgY2FzZSAndG9wVG91Y2hFbmQnOgorICAgICAgY2FzZSAndG9w VG91Y2hNb3ZlJzoKKyAgICAgIGNhc2UgJ3RvcFRvdWNoU3RhcnQnOgorICAgICAgICBFdmVudENv bnN0cnVjdG9yID0gU3ludGhldGljVG91Y2hFdmVudDsKKyAgICAgICAgYnJlYWs7CisgICAgICBj YXNlICd0b3BBbmltYXRpb25FbmQnOgorICAgICAgY2FzZSAndG9wQW5pbWF0aW9uSXRlcmF0aW9u JzoKKyAgICAgIGNhc2UgJ3RvcEFuaW1hdGlvblN0YXJ0JzoKKyAgICAgICAgRXZlbnRDb25zdHJ1 Y3RvciA9IFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50OworICAgICAgICBicmVhazsKKyAgICAgIGNh c2UgJ3RvcFRyYW5zaXRpb25FbmQnOgorICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhl dGljVHJhbnNpdGlvbkV2ZW50OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3RvcFNjcm9s bCc6CisgICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNVSUV2ZW50OworICAgICAg ICBicmVhazsKKyAgICAgIGNhc2UgJ3RvcFdoZWVsJzoKKyAgICAgICAgRXZlbnRDb25zdHJ1Y3Rv ciA9IFN5bnRoZXRpY1doZWVsRXZlbnQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAndG9w Q29weSc6CisgICAgICBjYXNlICd0b3BDdXQnOgorICAgICAgY2FzZSAndG9wUGFzdGUnOgorICAg ICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljQ2xpcGJvYXJkRXZlbnQ7CisgICAgICAg IGJyZWFrOworICAgIH0KKyAgICAhRXZlbnRDb25zdHJ1Y3RvciA/ICJkZXZlbG9wbWVudCIgIT09 ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1NpbXBsZUV2ZW50UGx1Z2luOiBVbmhh bmRsZWQgZXZlbnQgdHlwZSwgYCVzYC4nLCB0b3BMZXZlbFR5cGUpIDogX3Byb2RJbnZhcmlhbnQo Jzg2JywgdG9wTGV2ZWxUeXBlKSA6IHZvaWQgMDsKKyAgICB2YXIgZXZlbnQgPSBFdmVudENvbnN0 cnVjdG9yLmdldFBvb2xlZChkaXNwYXRjaENvbmZpZywgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQs IG5hdGl2ZUV2ZW50VGFyZ2V0KTsKKyAgICBFdmVudFByb3BhZ2F0b3JzLmFjY3VtdWxhdGVUd29Q aGFzZURpc3BhdGNoZXMoZXZlbnQpOworICAgIHJldHVybiBldmVudDsKKyAgfSwKKworICBkaWRQ dXRMaXN0ZW5lcjogZnVuY3Rpb24gKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUsIGxpc3RlbmVyKSB7 CisgICAgLy8gTW9iaWxlIFNhZmFyaSBkb2VzIG5vdCBmaXJlIHByb3Blcmx5IGJ1YmJsZSBjbGlj ayBldmVudHMgb24KKyAgICAvLyBub24taW50ZXJhY3RpdmUgZWxlbWVudHMsIHdoaWNoIG1lYW5z IGRlbGVnYXRlZCBjbGljayBsaXN0ZW5lcnMgZG8gbm90CisgICAgLy8gZmlyZS4gVGhlIHdvcmth cm91bmQgZm9yIHRoaXMgYnVnIGludm9sdmVzIGF0dGFjaGluZyBhbiBlbXB0eSBjbGljaworICAg IC8vIGxpc3RlbmVyIG9uIHRoZSB0YXJnZXQgbm9kZS4KKyAgICAvLyBodHRwOi8vd3d3LnF1aXJr c21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAxMC8wOS9jbGlja19ldmVudF9kZWwuaHRtbAorICAg IGlmIChyZWdpc3RyYXRpb25OYW1lID09PSAnb25DbGljaycgJiYgIWlzSW50ZXJhY3RpdmUoaW5z dC5fdGFnKSkgeworICAgICAgdmFyIGtleSA9IGdldERpY3Rpb25hcnlLZXkoaW5zdCk7CisgICAg ICB2YXIgbm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGlu c3QpOworICAgICAgaWYgKCFvbkNsaWNrTGlzdGVuZXJzW2tleV0pIHsKKyAgICAgICAgb25DbGlj a0xpc3RlbmVyc1trZXldID0gRXZlbnRMaXN0ZW5lci5saXN0ZW4obm9kZSwgJ2NsaWNrJywgZW1w dHlGdW5jdGlvbik7CisgICAgICB9CisgICAgfQorICB9LAorCisgIHdpbGxEZWxldGVMaXN0ZW5l cjogZnVuY3Rpb24gKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUpIHsKKyAgICBpZiAocmVnaXN0cmF0 aW9uTmFtZSA9PT0gJ29uQ2xpY2snICYmICFpc0ludGVyYWN0aXZlKGluc3QuX3RhZykpIHsKKyAg ICAgIHZhciBrZXkgPSBnZXREaWN0aW9uYXJ5S2V5KGluc3QpOworICAgICAgb25DbGlja0xpc3Rl bmVyc1trZXldLnJlbW92ZSgpOworICAgICAgZGVsZXRlIG9uQ2xpY2tMaXN0ZW5lcnNba2V5XTsK KyAgICB9CisgIH0KKworfTsKKworbW9kdWxlLmV4cG9ydHMgPSBTaW1wbGVFdmVudFBsdWdpbjsK K30seyIxMDMiOjEwMywiMTE2IjoxMTYsIjEyNSI6MTI1LCIxMzIiOjEzMiwiMTQwIjoxNDAsIjE5 IjoxOSwiMzIiOjMyLCI4MCI6ODAsIjgxIjo4MSwiODMiOjgzLCI4NCI6ODQsIjg1Ijo4NSwiODci Ojg3LCI4OCI6ODgsIjg5Ijo4OSwiOTAiOjkwLCI5MSI6OTEsIjkyIjo5Mn1dLDgwOltmdW5jdGlv bihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2Vu dCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBz b3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQg aW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291 cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJl IGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAq LworCisndXNlIHN0cmljdCc7CisKK3ZhciBTeW50aGV0aWNFdmVudCA9IF9kZXJlcV8oODQpOwor CisvKioKKyAqIEBpbnRlcmZhY2UgRXZlbnQKKyAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIv Y3NzMy1hbmltYXRpb25zLyNBbmltYXRpb25FdmVudC1pbnRlcmZhY2UKKyAqIEBzZWUgaHR0cHM6 Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0FuaW1hdGlvbkV2ZW50 CisgKi8KK3ZhciBBbmltYXRpb25FdmVudEludGVyZmFjZSA9IHsKKyAgYW5pbWF0aW9uTmFtZTog bnVsbCwKKyAgZWxhcHNlZFRpbWU6IG51bGwsCisgIHBzZXVkb0VsZW1lbnQ6IG51bGwKK307CisK Ky8qKgorICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNl ZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LgorICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFy a2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LgorICogQHBhcmFtIHtvYmpl Y3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LgorICogQGV4dGVuZHMge1N5bnRo ZXRpY0V2ZW50fQorICovCitmdW5jdGlvbiBTeW50aGV0aWNBbmltYXRpb25FdmVudChkaXNwYXRj aENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkg eworICByZXR1cm4gU3ludGhldGljRXZlbnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywgZGlz cGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7Cit9CisKK1N5bnRo ZXRpY0V2ZW50LmF1Z21lbnRDbGFzcyhTeW50aGV0aWNBbmltYXRpb25FdmVudCwgQW5pbWF0aW9u RXZlbnRJbnRlcmZhY2UpOworCittb2R1bGUuZXhwb3J0cyA9IFN5bnRoZXRpY0FuaW1hdGlvbkV2 ZW50OworfSx7Ijg0Ijo4NH1dLDgxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsK Ky8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCBy aWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRl ciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4g dGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3Jh bnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUg aW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBT eW50aGV0aWNFdmVudCA9IF9kZXJlcV8oODQpOworCisvKioKKyAqIEBpbnRlcmZhY2UgRXZlbnQK KyAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvY2xpcGJvYXJkLWFwaXMvCisgKi8KK3ZhciBD bGlwYm9hcmRFdmVudEludGVyZmFjZSA9IHsKKyAgY2xpcGJvYXJkRGF0YTogZnVuY3Rpb24gKGV2 ZW50KSB7CisgICAgcmV0dXJuICdjbGlwYm9hcmREYXRhJyBpbiBldmVudCA/IGV2ZW50LmNsaXBi b2FyZERhdGEgOiB3aW5kb3cuY2xpcGJvYXJkRGF0YTsKKyAgfQorfTsKKworLyoqCisgKiBAcGFy YW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3BhdGNo IHRoaXMgZXZlbnQuCisgKiBAcGFyYW0ge3N0cmluZ30gZGlzcGF0Y2hNYXJrZXIgTWFya2VyIGlk ZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuCisgKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZl bnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuCisgKiBAZXh0ZW5kcyB7U3ludGhldGljVUlFdmVudH0K KyAqLworZnVuY3Rpb24gU3ludGhldGljQ2xpcGJvYXJkRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRp c3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHsKKyAgcmV0dXJu IFN5bnRoZXRpY0V2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2Vy LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpOworfQorCitTeW50aGV0aWNFdmVudC5h dWdtZW50Q2xhc3MoU3ludGhldGljQ2xpcGJvYXJkRXZlbnQsIENsaXBib2FyZEV2ZW50SW50ZXJm YWNlKTsKKworbW9kdWxlLmV4cG9ydHMgPSBTeW50aGV0aWNDbGlwYm9hcmRFdmVudDsKK30seyI4 NCI6ODR9XSw4MjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENv cHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2Vy dmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1z dHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRp cmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBw YXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1l IGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgU3ludGhldGljRXZl bnQgPSBfZGVyZXFfKDg0KTsKKworLyoqCisgKiBAaW50ZXJmYWNlIEV2ZW50CisgKiBAc2VlIGh0 dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnRzLWNvbXBvc2l0aW9u ZXZlbnRzCisgKi8KK3ZhciBDb21wb3NpdGlvbkV2ZW50SW50ZXJmYWNlID0geworICBkYXRhOiBu dWxsCit9OworCisvKioKKyAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1 cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC4KKyAqIEBwYXJhbSB7c3RyaW5nfSBk aXNwYXRjaE1hcmtlciBNYXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC4KKyAqIEBw YXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC4KKyAqIEBleHRl bmRzIHtTeW50aGV0aWNVSUV2ZW50fQorICovCitmdW5jdGlvbiBTeW50aGV0aWNDb21wb3NpdGlv bkV2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2 ZUV2ZW50VGFyZ2V0KSB7CisgIHJldHVybiBTeW50aGV0aWNFdmVudC5jYWxsKHRoaXMsIGRpc3Bh dGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0 KTsKK30KKworU3ludGhldGljRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY0NvbXBvc2l0aW9u RXZlbnQsIENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UpOworCittb2R1bGUuZXhwb3J0cyA9IFN5 bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQ7Cit9LHsiODQiOjg0fV0sODM6W2Z1bmN0aW9uKF9kZXJl cV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNl Ym9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBj b2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUK KyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJl ZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQg aW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1 c2Ugc3RyaWN0JzsKKwordmFyIFN5bnRoZXRpY01vdXNlRXZlbnQgPSBfZGVyZXFfKDg4KTsKKwor LyoqCisgKiBAaW50ZXJmYWNlIERyYWdFdmVudAorICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9U Ui9ET00tTGV2ZWwtMy1FdmVudHMvCisgKi8KK3ZhciBEcmFnRXZlbnRJbnRlcmZhY2UgPSB7Cisg IGRhdGFUcmFuc2ZlcjogbnVsbAorfTsKKworLyoqCisgKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0 Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgZXZlbnQuCisgKiBA cGFyYW0ge3N0cmluZ30gZGlzcGF0Y2hNYXJrZXIgTWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVu dCB0YXJnZXQuCisgKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIg ZXZlbnQuCisgKiBAZXh0ZW5kcyB7U3ludGhldGljVUlFdmVudH0KKyAqLworZnVuY3Rpb24gU3lu dGhldGljRHJhZ0V2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZl bnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7CisgIHJldHVybiBTeW50aGV0aWNNb3VzZUV2ZW50LmNh bGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0 aXZlRXZlbnRUYXJnZXQpOworfQorCitTeW50aGV0aWNNb3VzZUV2ZW50LmF1Z21lbnRDbGFzcyhT eW50aGV0aWNEcmFnRXZlbnQsIERyYWdFdmVudEludGVyZmFjZSk7CisKK21vZHVsZS5leHBvcnRz ID0gU3ludGhldGljRHJhZ0V2ZW50OworfSx7Ijg4Ijo4OH1dLDg0OltmdW5jdGlvbihfZGVyZXFf LG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJv b2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29k ZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisg KiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUu IEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGlu IHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNl IHN0cmljdCc7CisKK3ZhciBfYXNzaWduID0gX2RlcmVxXygxNDgpOworCit2YXIgUG9vbGVkQ2xh c3MgPSBfZGVyZXFfKDI0KTsKKwordmFyIGVtcHR5RnVuY3Rpb24gPSBfZGVyZXFfKDEzMik7Cit2 YXIgd2FybmluZyA9IF9kZXJlcV8oMTQ3KTsKKwordmFyIGRpZFdhcm5Gb3JBZGRlZE5ld1Byb3Bl cnR5ID0gZmFsc2U7Cit2YXIgaXNQcm94eVN1cHBvcnRlZCA9IHR5cGVvZiBQcm94eSA9PT0gJ2Z1 bmN0aW9uJzsKKwordmFyIHNob3VsZEJlUmVsZWFzZWRQcm9wZXJ0aWVzID0gWydkaXNwYXRjaENv bmZpZycsICdfdGFyZ2V0SW5zdCcsICduYXRpdmVFdmVudCcsICdpc0RlZmF1bHRQcmV2ZW50ZWQn LCAnaXNQcm9wYWdhdGlvblN0b3BwZWQnLCAnX2Rpc3BhdGNoTGlzdGVuZXJzJywgJ19kaXNwYXRj aEluc3RhbmNlcyddOworCisvKioKKyAqIEBpbnRlcmZhY2UgRXZlbnQKKyAqIEBzZWUgaHR0cDov L3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLworICovCit2YXIgRXZlbnRJbnRlcmZh Y2UgPSB7CisgIHR5cGU6IG51bGwsCisgIHRhcmdldDogbnVsbCwKKyAgLy8gY3VycmVudFRhcmdl dCBpcyBzZXQgd2hlbiBkaXNwYXRjaGluZzsgbm8gdXNlIGluIGNvcHlpbmcgaXQgaGVyZQorICBj dXJyZW50VGFyZ2V0OiBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zTnVsbCwKKyAgZXZlbnRQaGFz ZTogbnVsbCwKKyAgYnViYmxlczogbnVsbCwKKyAgY2FuY2VsYWJsZTogbnVsbCwKKyAgdGltZVN0 YW1wOiBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICByZXR1cm4gZXZlbnQudGltZVN0YW1wIHx8IERh dGUubm93KCk7CisgIH0sCisgIGRlZmF1bHRQcmV2ZW50ZWQ6IG51bGwsCisgIGlzVHJ1c3RlZDog bnVsbAorfTsKKworLyoqCisgKiBTeW50aGV0aWMgZXZlbnRzIGFyZSBkaXNwYXRjaGVkIGJ5IGV2 ZW50IHBsdWdpbnMsIHR5cGljYWxseSBpbiByZXNwb25zZSB0byBhCisgKiB0b3AtbGV2ZWwgZXZl bnQgZGVsZWdhdGlvbiBoYW5kbGVyLgorICoKKyAqIFRoZXNlIHN5c3RlbXMgc2hvdWxkIGdlbmVy YWxseSB1c2UgcG9vbGluZyB0byByZWR1Y2UgdGhlIGZyZXF1ZW5jeSBvZiBnYXJiYWdlCisgKiBj b2xsZWN0aW9uLiBUaGUgc3lzdGVtIHNob3VsZCBjaGVjayBgaXNQZXJzaXN0ZW50YCB0byBkZXRl cm1pbmUgd2hldGhlciB0aGUKKyAqIGV2ZW50IHNob3VsZCBiZSByZWxlYXNlZCBpbnRvIHRoZSBw b29sIGFmdGVyIGJlaW5nIGRpc3BhdGNoZWQuIFVzZXJzIHRoYXQKKyAqIG5lZWQgYSBwZXJzaXN0 ZWQgZXZlbnQgc2hvdWxkIGludm9rZSBgcGVyc2lzdGAuCisgKgorICogU3ludGhldGljIGV2ZW50 cyAoYW5kIHN1YmNsYXNzZXMpIGltcGxlbWVudCB0aGUgRE9NIExldmVsIDMgRXZlbnRzIEFQSSBi eQorICogbm9ybWFsaXppbmcgYnJvd3NlciBxdWlya3MuIFN1YmNsYXNzZXMgZG8gbm90IG5lY2Vz c2FyaWx5IGhhdmUgdG8gaW1wbGVtZW50IGEKKyAqIERPTSBpbnRlcmZhY2U7IGN1c3RvbSBhcHBs aWNhdGlvbi1zcGVjaWZpYyBldmVudHMgY2FuIGFsc28gc3ViY2xhc3MgdGhpcy4KKyAqCisgKiBA cGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3Bh dGNoIHRoaXMgZXZlbnQuCisgKiBAcGFyYW0geyp9IHRhcmdldEluc3QgTWFya2VyIGlkZW50aWZ5 aW5nIHRoZSBldmVudCB0YXJnZXQuCisgKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0 aXZlIGJyb3dzZXIgZXZlbnQuCisgKiBAcGFyYW0ge0RPTUV2ZW50VGFyZ2V0fSBuYXRpdmVFdmVu dFRhcmdldCBUYXJnZXQgbm9kZS4KKyAqLworZnVuY3Rpb24gU3ludGhldGljRXZlbnQoZGlzcGF0 Y2hDb25maWcsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkgewor ICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgLy8gdGhlc2UgaGF2 ZSBhIGdldHRlci9zZXR0ZXIgZm9yIHdhcm5pbmdzCisgICAgZGVsZXRlIHRoaXMubmF0aXZlRXZl bnQ7CisgICAgZGVsZXRlIHRoaXMucHJldmVudERlZmF1bHQ7CisgICAgZGVsZXRlIHRoaXMuc3Rv cFByb3BhZ2F0aW9uOworICB9CisKKyAgdGhpcy5kaXNwYXRjaENvbmZpZyA9IGRpc3BhdGNoQ29u ZmlnOworICB0aGlzLl90YXJnZXRJbnN0ID0gdGFyZ2V0SW5zdDsKKyAgdGhpcy5uYXRpdmVFdmVu dCA9IG5hdGl2ZUV2ZW50OworCisgIHZhciBJbnRlcmZhY2UgPSB0aGlzLmNvbnN0cnVjdG9yLklu dGVyZmFjZTsKKyAgZm9yICh2YXIgcHJvcE5hbWUgaW4gSW50ZXJmYWNlKSB7CisgICAgaWYgKCFJ bnRlcmZhY2UuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7CisgICAgICBjb250aW51ZTsKKyAg ICB9CisgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgZGVs ZXRlIHRoaXNbcHJvcE5hbWVdOyAvLyB0aGlzIGhhcyBhIGdldHRlci9zZXR0ZXIgZm9yIHdhcm5p bmdzCisgICAgfQorICAgIHZhciBub3JtYWxpemUgPSBJbnRlcmZhY2VbcHJvcE5hbWVdOworICAg IGlmIChub3JtYWxpemUpIHsKKyAgICAgIHRoaXNbcHJvcE5hbWVdID0gbm9ybWFsaXplKG5hdGl2 ZUV2ZW50KTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHByb3BOYW1lID09PSAndGFyZ2V0Jykg eworICAgICAgICB0aGlzLnRhcmdldCA9IG5hdGl2ZUV2ZW50VGFyZ2V0OworICAgICAgfSBlbHNl IHsKKyAgICAgICAgdGhpc1twcm9wTmFtZV0gPSBuYXRpdmVFdmVudFtwcm9wTmFtZV07CisgICAg ICB9CisgICAgfQorICB9CisKKyAgdmFyIGRlZmF1bHRQcmV2ZW50ZWQgPSBuYXRpdmVFdmVudC5k ZWZhdWx0UHJldmVudGVkICE9IG51bGwgPyBuYXRpdmVFdmVudC5kZWZhdWx0UHJldmVudGVkIDog bmF0aXZlRXZlbnQucmV0dXJuVmFsdWUgPT09IGZhbHNlOworICBpZiAoZGVmYXVsdFByZXZlbnRl ZCkgeworICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZW1wdHlGdW5jdGlvbi50aGF0UmV0 dXJuc1RydWU7CisgIH0gZWxzZSB7CisgICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBlbXB0 eUZ1bmN0aW9uLnRoYXRSZXR1cm5zRmFsc2U7CisgIH0KKyAgdGhpcy5pc1Byb3BhZ2F0aW9uU3Rv cHBlZCA9IGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNGYWxzZTsKKyAgcmV0dXJuIHRoaXM7Cit9 CisKK19hc3NpZ24oU3ludGhldGljRXZlbnQucHJvdG90eXBlLCB7CisKKyAgcHJldmVudERlZmF1 bHQ6IGZ1bmN0aW9uICgpIHsKKyAgICB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlOworICAg IHZhciBldmVudCA9IHRoaXMubmF0aXZlRXZlbnQ7CisgICAgaWYgKCFldmVudCkgeworICAgICAg cmV0dXJuOworICAgIH0KKworICAgIGlmIChldmVudC5wcmV2ZW50RGVmYXVsdCkgeworICAgICAg ZXZlbnQucHJldmVudERlZmF1bHQoKTsKKyAgICB9IGVsc2UgaWYgKHR5cGVvZiBldmVudC5yZXR1 cm5WYWx1ZSAhPT0gJ3Vua25vd24nKSB7CisgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHZh bGlkLXR5cGVvZgorICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTsKKyAgICB9CisgICAg dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zVHJ1ZTsK KyAgfSwKKworICBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgZXZlbnQg PSB0aGlzLm5hdGl2ZUV2ZW50OworICAgIGlmICghZXZlbnQpIHsKKyAgICAgIHJldHVybjsKKyAg ICB9CisKKyAgICBpZiAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSB7CisgICAgICBldmVudC5zdG9w UHJvcGFnYXRpb24oKTsKKyAgICB9IGVsc2UgaWYgKHR5cGVvZiBldmVudC5jYW5jZWxCdWJibGUg IT09ICd1bmtub3duJykgeworICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSB2YWxpZC10eXBl b2YKKyAgICAgIC8vIFRoZSBDaGFuZ2VFdmVudFBsdWdpbiByZWdpc3RlcnMgYSAicHJvcGVydHlj aGFuZ2UiIGV2ZW50IGZvcgorICAgICAgLy8gSUUuIFRoaXMgZXZlbnQgZG9lcyBub3Qgc3VwcG9y dCBidWJibGluZyBvciBjYW5jZWxsaW5nLCBhbmQKKyAgICAgIC8vIGFueSByZWZlcmVuY2VzIHRv IGNhbmNlbEJ1YmJsZSB0aHJvdyAiTWVtYmVyIG5vdCBmb3VuZCIuICBBCisgICAgICAvLyB0eXBl b2YgY2hlY2sgb2YgInVua25vd24iIGNpcmN1bXZlbnRzIHRoaXMgaXNzdWUgKGFuZCBpcyBhbHNv CisgICAgICAvLyBJRSBzcGVjaWZpYykuCisgICAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVl OworICAgIH0KKworICAgIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBlbXB0eUZ1bmN0aW9u LnRoYXRSZXR1cm5zVHJ1ZTsKKyAgfSwKKworICAvKioKKyAgICogV2UgcmVsZWFzZSBhbGwgZGlz cGF0Y2hlZCBgU3ludGhldGljRXZlbnRgcyBhZnRlciBlYWNoIGV2ZW50IGxvb3AsIGFkZGluZwor ICAgKiB0aGVtIGJhY2sgaW50byB0aGUgcG9vbC4gVGhpcyBhbGxvd3MgYSB3YXkgdG8gaG9sZCBv bnRvIGEgcmVmZXJlbmNlIHRoYXQKKyAgICogd29uJ3QgYmUgYWRkZWQgYmFjayBpbnRvIHRoZSBw b29sLgorICAgKi8KKyAgcGVyc2lzdDogZnVuY3Rpb24gKCkgeworICAgIHRoaXMuaXNQZXJzaXN0 ZW50ID0gZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc1RydWU7CisgIH0sCisKKyAgLyoqCisgICAq IENoZWNrcyBpZiB0aGlzIGV2ZW50IHNob3VsZCBiZSByZWxlYXNlZCBiYWNrIGludG8gdGhlIHBv b2wuCisgICAqCisgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhpcyBzaG91bGQgbm90 IGJlIHJlbGVhc2VkLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICBpc1BlcnNpc3RlbnQ6IGVt cHR5RnVuY3Rpb24udGhhdFJldHVybnNGYWxzZSwKKworICAvKioKKyAgICogYFBvb2xlZENsYXNz YCBsb29rcyBmb3IgYGRlc3RydWN0b3JgIG9uIGVhY2ggaW5zdGFuY2UgaXQgcmVsZWFzZXMuCisg ICAqLworICBkZXN0cnVjdG9yOiBmdW5jdGlvbiAoKSB7CisgICAgdmFyIEludGVyZmFjZSA9IHRo aXMuY29uc3RydWN0b3IuSW50ZXJmYWNlOworICAgIGZvciAodmFyIHByb3BOYW1lIGluIEludGVy ZmFjZSkgeworICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAg ICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcE5hbWUsIGdldFBvb2xlZFdhcm5p bmdQcm9wZXJ0eURlZmluaXRpb24ocHJvcE5hbWUsIEludGVyZmFjZVtwcm9wTmFtZV0pKTsKKyAg ICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXNbcHJvcE5hbWVdID0gbnVsbDsKKyAgICAgIH0KKyAg ICB9CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaG91bGRCZVJlbGVhc2VkUHJvcGVydGllcy5s ZW5ndGg7IGkrKykgeworICAgICAgdGhpc1tzaG91bGRCZVJlbGVhc2VkUHJvcGVydGllc1tpXV0g PSBudWxsOworICAgIH0KKyAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7 CisgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ25hdGl2ZUV2ZW50JywgZ2V0UG9v bGVkV2FybmluZ1Byb3BlcnR5RGVmaW5pdGlvbignbmF0aXZlRXZlbnQnLCBudWxsKSk7CisgICAg ICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3ByZXZlbnREZWZhdWx0JywgZ2V0UG9vbGVk V2FybmluZ1Byb3BlcnR5RGVmaW5pdGlvbigncHJldmVudERlZmF1bHQnLCBlbXB0eUZ1bmN0aW9u KSk7CisgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3N0b3BQcm9wYWdhdGlvbics IGdldFBvb2xlZFdhcm5pbmdQcm9wZXJ0eURlZmluaXRpb24oJ3N0b3BQcm9wYWdhdGlvbicsIGVt cHR5RnVuY3Rpb24pKTsKKyAgICB9CisgIH0KKworfSk7CisKK1N5bnRoZXRpY0V2ZW50LkludGVy ZmFjZSA9IEV2ZW50SW50ZXJmYWNlOworCitpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rp b24nKSB7CisgIGlmIChpc1Byb3h5U3VwcG9ydGVkKSB7CisgICAgLyplc2xpbnQtZGlzYWJsZSBu by1mdW5jLWFzc2lnbiAqLworICAgIFN5bnRoZXRpY0V2ZW50ID0gbmV3IFByb3h5KFN5bnRoZXRp Y0V2ZW50LCB7CisgICAgICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uICh0YXJnZXQsIGFyZ3MpIHsKKyAg ICAgICAgcmV0dXJuIHRoaXMuYXBwbHkodGFyZ2V0LCBPYmplY3QuY3JlYXRlKHRhcmdldC5wcm90 b3R5cGUpLCBhcmdzKTsKKyAgICAgIH0sCisgICAgICBhcHBseTogZnVuY3Rpb24gKGNvbnN0cnVj dG9yLCB0aGF0LCBhcmdzKSB7CisgICAgICAgIHJldHVybiBuZXcgUHJveHkoY29uc3RydWN0b3Iu YXBwbHkodGhhdCwgYXJncyksIHsKKyAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh0YXJnZXQsIHBy b3AsIHZhbHVlKSB7CisgICAgICAgICAgICBpZiAocHJvcCAhPT0gJ2lzUGVyc2lzdGVudCcgJiYg IXRhcmdldC5jb25zdHJ1Y3Rvci5JbnRlcmZhY2UuaGFzT3duUHJvcGVydHkocHJvcCkgJiYgc2hv dWxkQmVSZWxlYXNlZFByb3BlcnRpZXMuaW5kZXhPZihwcm9wKSA9PT0gLTEpIHsKKyAgICAgICAg ICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhkaWRXYXJuRm9y QWRkZWROZXdQcm9wZXJ0eSB8fCB0YXJnZXQuaXNQZXJzaXN0ZW50KCksICdUaGlzIHN5bnRoZXRp YyBldmVudCBpcyByZXVzZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuIElmIHlvdVwncmUgJyAr ICdzZWVpbmcgdGhpcywgeW91XCdyZSBhZGRpbmcgYSBuZXcgcHJvcGVydHkgaW4gdGhlIHN5bnRo ZXRpYyBldmVudCBvYmplY3QuICcgKyAnVGhlIHByb3BlcnR5IGlzIG5ldmVyIHJlbGVhc2VkLiBT ZWUgJyArICdodHRwczovL2ZiLm1lL3JlYWN0LWV2ZW50LXBvb2xpbmcgZm9yIG1vcmUgaW5mb3Jt YXRpb24uJykgOiB2b2lkIDA7CisgICAgICAgICAgICAgIGRpZFdhcm5Gb3JBZGRlZE5ld1Byb3Bl cnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHZh bHVlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9KTsK KyAgICAgIH0KKyAgICB9KTsKKyAgICAvKmVzbGludC1lbmFibGUgbm8tZnVuYy1hc3NpZ24gKi8K KyAgfQorfQorLyoqCisgKiBIZWxwZXIgdG8gcmVkdWNlIGJvaWxlcnBsYXRlIHdoZW4gY3JlYXRp bmcgc3ViY2xhc3Nlcy4KKyAqCisgKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcworICogQHBhcmFt IHs/b2JqZWN0fSBJbnRlcmZhY2UKKyAqLworU3ludGhldGljRXZlbnQuYXVnbWVudENsYXNzID0g ZnVuY3Rpb24gKENsYXNzLCBJbnRlcmZhY2UpIHsKKyAgdmFyIFN1cGVyID0gdGhpczsKKworICB2 YXIgRSA9IGZ1bmN0aW9uICgpIHt9OworICBFLnByb3RvdHlwZSA9IFN1cGVyLnByb3RvdHlwZTsK KyAgdmFyIHByb3RvdHlwZSA9IG5ldyBFKCk7CisKKyAgX2Fzc2lnbihwcm90b3R5cGUsIENsYXNz LnByb3RvdHlwZSk7CisgIENsYXNzLnByb3RvdHlwZSA9IHByb3RvdHlwZTsKKyAgQ2xhc3MucHJv dG90eXBlLmNvbnN0cnVjdG9yID0gQ2xhc3M7CisKKyAgQ2xhc3MuSW50ZXJmYWNlID0gX2Fzc2ln bih7fSwgU3VwZXIuSW50ZXJmYWNlLCBJbnRlcmZhY2UpOworICBDbGFzcy5hdWdtZW50Q2xhc3Mg PSBTdXBlci5hdWdtZW50Q2xhc3M7CisKKyAgUG9vbGVkQ2xhc3MuYWRkUG9vbGluZ1RvKENsYXNz LCBQb29sZWRDbGFzcy5mb3VyQXJndW1lbnRQb29sZXIpOworfTsKKworUG9vbGVkQ2xhc3MuYWRk UG9vbGluZ1RvKFN5bnRoZXRpY0V2ZW50LCBQb29sZWRDbGFzcy5mb3VyQXJndW1lbnRQb29sZXIp OworCittb2R1bGUuZXhwb3J0cyA9IFN5bnRoZXRpY0V2ZW50OworCisvKioKKyAgKiBIZWxwZXIg dG8gbnVsbGlmeSBzeW50aGV0aWNFdmVudCBpbnN0YW5jZSBwcm9wZXJ0aWVzIHdoZW4gZGVzdHJ1 Y3RpbmcKKyAgKgorICAqIEBwYXJhbSB7b2JqZWN0fSBTeW50aGV0aWNFdmVudAorICAqIEBwYXJh bSB7U3RyaW5nfSBwcm9wTmFtZQorICAqIEByZXR1cm4ge29iamVjdH0gZGVmaW5lUHJvcGVydHkg b2JqZWN0CisgICovCitmdW5jdGlvbiBnZXRQb29sZWRXYXJuaW5nUHJvcGVydHlEZWZpbml0aW9u KHByb3BOYW1lLCBnZXRWYWwpIHsKKyAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2YgZ2V0VmFsID09 PSAnZnVuY3Rpb24nOworICByZXR1cm4geworICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAgICBz ZXQ6IHNldCwKKyAgICBnZXQ6IGdldAorICB9OworCisgIGZ1bmN0aW9uIHNldCh2YWwpIHsKKyAg ICB2YXIgYWN0aW9uID0gaXNGdW5jdGlvbiA/ICdzZXR0aW5nIHRoZSBtZXRob2QnIDogJ3NldHRp bmcgdGhlIHByb3BlcnR5JzsKKyAgICB3YXJuKGFjdGlvbiwgJ1RoaXMgaXMgZWZmZWN0aXZlbHkg YSBuby1vcCcpOworICAgIHJldHVybiB2YWw7CisgIH0KKworICBmdW5jdGlvbiBnZXQoKSB7Cisg ICAgdmFyIGFjdGlvbiA9IGlzRnVuY3Rpb24gPyAnYWNjZXNzaW5nIHRoZSBtZXRob2QnIDogJ2Fj Y2Vzc2luZyB0aGUgcHJvcGVydHknOworICAgIHZhciByZXN1bHQgPSBpc0Z1bmN0aW9uID8gJ1Ro aXMgaXMgYSBuby1vcCBmdW5jdGlvbicgOiAnVGhpcyBpcyBzZXQgdG8gbnVsbCc7CisgICAgd2Fy bihhY3Rpb24sIHJlc3VsdCk7CisgICAgcmV0dXJuIGdldFZhbDsKKyAgfQorCisgIGZ1bmN0aW9u IHdhcm4oYWN0aW9uLCByZXN1bHQpIHsKKyAgICB2YXIgd2FybmluZ0NvbmRpdGlvbiA9IGZhbHNl OworICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcod2FybmluZ0Nv bmRpdGlvbiwgJ1RoaXMgc3ludGhldGljIGV2ZW50IGlzIHJldXNlZCBmb3IgcGVyZm9ybWFuY2Ug cmVhc29ucy4gSWYgeW91XCdyZSBzZWVpbmcgdGhpcywgJyArICd5b3VcJ3JlICVzIGAlc2Agb24g YSByZWxlYXNlZC9udWxsaWZpZWQgc3ludGhldGljIGV2ZW50LiAlcy4gJyArICdJZiB5b3UgbXVz dCBrZWVwIHRoZSBvcmlnaW5hbCBzeW50aGV0aWMgZXZlbnQgYXJvdW5kLCB1c2UgZXZlbnQucGVy c2lzdCgpLiAnICsgJ1NlZSBodHRwczovL2ZiLm1lL3JlYWN0LWV2ZW50LXBvb2xpbmcgZm9yIG1v cmUgaW5mb3JtYXRpb24uJywgYWN0aW9uLCBwcm9wTmFtZSwgcmVzdWx0KSA6IHZvaWQgMDsKKyAg fQorfQorfSx7IjEzMiI6MTMyLCIxNDciOjE0NywiMTQ4IjoxNDgsIjI0IjoyNH1dLDg1OltmdW5j dGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJl c2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhp cyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91 bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMg c291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2Fu IGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoK KyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBTeW50aGV0aWNVSUV2ZW50ID0gX2RlcmVxXyg5 MSk7CisKKy8qKgorICogQGludGVyZmFjZSBGb2N1c0V2ZW50CisgKiBAc2VlIGh0dHA6Ly93d3cu dzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8KKyAqLwordmFyIEZvY3VzRXZlbnRJbnRlcmZh Y2UgPSB7CisgIHJlbGF0ZWRUYXJnZXQ6IG51bGwKK307CisKKy8qKgorICogQHBhcmFtIHtvYmpl Y3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2 ZW50LgorICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWlu ZyB0aGUgZXZlbnQgdGFyZ2V0LgorICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2 ZSBicm93c2VyIGV2ZW50LgorICogQGV4dGVuZHMge1N5bnRoZXRpY1VJRXZlbnR9CisgKi8KK2Z1 bmN0aW9uIFN5bnRoZXRpY0ZvY3VzRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2Vy LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHsKKyAgcmV0dXJuIFN5bnRoZXRpY1VJ RXZlbnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2 ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7Cit9CisKK1N5bnRoZXRpY1VJRXZlbnQuYXVnbWVudENs YXNzKFN5bnRoZXRpY0ZvY3VzRXZlbnQsIEZvY3VzRXZlbnRJbnRlcmZhY2UpOworCittb2R1bGUu ZXhwb3J0cyA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7Cit9LHsiOTEiOjkxfV0sODY6W2Z1bmN0aW9u KF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50 LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNv dXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBp biB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3Vy Y2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUg Zm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICov CisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFN5bnRoZXRpY0V2ZW50ID0gX2RlcmVxXyg4NCk7CisK Ky8qKgorICogQGludGVyZmFjZSBFdmVudAorICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8y MDEzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDEzMTEwNQorICogICAgICAvI2V2ZW50cy1pbnB1 dGV2ZW50cworICovCit2YXIgSW5wdXRFdmVudEludGVyZmFjZSA9IHsKKyAgZGF0YTogbnVsbAor fTsKKworLyoqCisgKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlv biB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgZXZlbnQuCisgKiBAcGFyYW0ge3N0cmluZ30gZGlzcGF0 Y2hNYXJrZXIgTWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuCisgKiBAcGFyYW0g e29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuCisgKiBAZXh0ZW5kcyB7 U3ludGhldGljVUlFdmVudH0KKyAqLworZnVuY3Rpb24gU3ludGhldGljSW5wdXRFdmVudChkaXNw YXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdl dCkgeworICByZXR1cm4gU3ludGhldGljRXZlbnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywg ZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7Cit9CisKK1N5 bnRoZXRpY0V2ZW50LmF1Z21lbnRDbGFzcyhTeW50aGV0aWNJbnB1dEV2ZW50LCBJbnB1dEV2ZW50 SW50ZXJmYWNlKTsKKworbW9kdWxlLmV4cG9ydHMgPSBTeW50aGV0aWNJbnB1dEV2ZW50OworfSx7 Ijg0Ijo4NH1dLDg3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICog Q29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVz ZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNE LXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qg ZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9m IHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNh bWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBTeW50aGV0aWNV SUV2ZW50ID0gX2RlcmVxXyg5MSk7CisKK3ZhciBnZXRFdmVudENoYXJDb2RlID0gX2RlcmVxXygx MDMpOwordmFyIGdldEV2ZW50S2V5ID0gX2RlcmVxXygxMDQpOwordmFyIGdldEV2ZW50TW9kaWZp ZXJTdGF0ZSA9IF9kZXJlcV8oMTA1KTsKKworLyoqCisgKiBAaW50ZXJmYWNlIEtleWJvYXJkRXZl bnQKKyAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLworICov Cit2YXIgS2V5Ym9hcmRFdmVudEludGVyZmFjZSA9IHsKKyAga2V5OiBnZXRFdmVudEtleSwKKyAg bG9jYXRpb246IG51bGwsCisgIGN0cmxLZXk6IG51bGwsCisgIHNoaWZ0S2V5OiBudWxsLAorICBh bHRLZXk6IG51bGwsCisgIG1ldGFLZXk6IG51bGwsCisgIHJlcGVhdDogbnVsbCwKKyAgbG9jYWxl OiBudWxsLAorICBnZXRNb2RpZmllclN0YXRlOiBnZXRFdmVudE1vZGlmaWVyU3RhdGUsCisgIC8v IExlZ2FjeSBJbnRlcmZhY2UKKyAgY2hhckNvZGU6IGZ1bmN0aW9uIChldmVudCkgeworICAgIC8v IGBjaGFyQ29kZWAgaXMgdGhlIHJlc3VsdCBvZiBhIEtleVByZXNzIGV2ZW50IGFuZCByZXByZXNl bnRzIHRoZSB2YWx1ZSBvZgorICAgIC8vIHRoZSBhY3R1YWwgcHJpbnRhYmxlIGNoYXJhY3Rlci4K KworICAgIC8vIEtleVByZXNzIGlzIGRlcHJlY2F0ZWQsIGJ1dCBpdHMgcmVwbGFjZW1lbnQgaXMg bm90IHlldCBmaW5hbCBhbmQgbm90CisgICAgLy8gaW1wbGVtZW50ZWQgaW4gYW55IG1ham9yIGJy b3dzZXIuIE9ubHkgS2V5UHJlc3MgaGFzIGNoYXJDb2RlLgorICAgIGlmIChldmVudC50eXBlID09 PSAna2V5cHJlc3MnKSB7CisgICAgICByZXR1cm4gZ2V0RXZlbnRDaGFyQ29kZShldmVudCk7Cisg ICAgfQorICAgIHJldHVybiAwOworICB9LAorICBrZXlDb2RlOiBmdW5jdGlvbiAoZXZlbnQpIHsK KyAgICAvLyBga2V5Q29kZWAgaXMgdGhlIHJlc3VsdCBvZiBhIEtleURvd24vVXAgZXZlbnQgYW5k IHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mCisgICAgLy8gcGh5c2ljYWwga2V5Ym9hcmQga2V5Lgor CisgICAgLy8gVGhlIGFjdHVhbCBtZWFuaW5nIG9mIHRoZSB2YWx1ZSBkZXBlbmRzIG9uIHRoZSB1 c2Vycycga2V5Ym9hcmQgbGF5b3V0CisgICAgLy8gd2hpY2ggY2Fubm90IGJlIGRldGVjdGVkLiBB c3N1bWluZyB0aGF0IGl0IGlzIGEgVVMga2V5Ym9hcmQgbGF5b3V0CisgICAgLy8gcHJvdmlkZXMg YSBzdXJwcmlzaW5nbHkgYWNjdXJhdGUgbWFwcGluZyBmb3IgVVMgYW5kIEV1cm9wZWFuIHVzZXJz LgorICAgIC8vIER1ZSB0byB0aGlzLCBpdCBpcyBsZWZ0IHRvIHRoZSB1c2VyIHRvIGltcGxlbWVu dCBhdCB0aGlzIHRpbWUuCisgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBldmVu dC50eXBlID09PSAna2V5dXAnKSB7CisgICAgICByZXR1cm4gZXZlbnQua2V5Q29kZTsKKyAgICB9 CisgICAgcmV0dXJuIDA7CisgIH0sCisgIHdoaWNoOiBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICAv LyBgd2hpY2hgIGlzIGFuIGFsaWFzIGZvciBlaXRoZXIgYGtleUNvZGVgIG9yIGBjaGFyQ29kZWAg ZGVwZW5kaW5nIG9uIHRoZQorICAgIC8vIHR5cGUgb2YgdGhlIGV2ZW50LgorICAgIGlmIChldmVu dC50eXBlID09PSAna2V5cHJlc3MnKSB7CisgICAgICByZXR1cm4gZ2V0RXZlbnRDaGFyQ29kZShl dmVudCk7CisgICAgfQorICAgIGlmIChldmVudC50eXBlID09PSAna2V5ZG93bicgfHwgZXZlbnQu dHlwZSA9PT0gJ2tleXVwJykgeworICAgICAgcmV0dXJuIGV2ZW50LmtleUNvZGU7CisgICAgfQor ICAgIHJldHVybiAwOworICB9Cit9OworCisvKioKKyAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRj aENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC4KKyAqIEBw YXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50 IHRhcmdldC4KKyAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBl dmVudC4KKyAqIEBleHRlbmRzIHtTeW50aGV0aWNVSUV2ZW50fQorICovCitmdW5jdGlvbiBTeW50 aGV0aWNLZXlib2FyZEV2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZl RXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7CisgIHJldHVybiBTeW50aGV0aWNVSUV2ZW50LmNh bGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0 aXZlRXZlbnRUYXJnZXQpOworfQorCitTeW50aGV0aWNVSUV2ZW50LmF1Z21lbnRDbGFzcyhTeW50 aGV0aWNLZXlib2FyZEV2ZW50LCBLZXlib2FyZEV2ZW50SW50ZXJmYWNlKTsKKworbW9kdWxlLmV4 cG9ydHMgPSBTeW50aGV0aWNLZXlib2FyZEV2ZW50OworfSx7IjEwMyI6MTAzLCIxMDQiOjEwNCwi MTA1IjoxMDUsIjkxIjo5MX1dLDg4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsK Ky8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCBy aWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRl ciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4g dGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3Jh bnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUg aW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBT eW50aGV0aWNVSUV2ZW50ID0gX2RlcmVxXyg5MSk7Cit2YXIgVmlld3BvcnRNZXRyaWNzID0gX2Rl cmVxXyg5NCk7CisKK3ZhciBnZXRFdmVudE1vZGlmaWVyU3RhdGUgPSBfZGVyZXFfKDEwNSk7CisK Ky8qKgorICogQGludGVyZmFjZSBNb3VzZUV2ZW50CisgKiBAc2VlIGh0dHA6Ly93d3cudzMub3Jn L1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8KKyAqLwordmFyIE1vdXNlRXZlbnRJbnRlcmZhY2UgPSB7 CisgIHNjcmVlblg6IG51bGwsCisgIHNjcmVlblk6IG51bGwsCisgIGNsaWVudFg6IG51bGwsCisg IGNsaWVudFk6IG51bGwsCisgIGN0cmxLZXk6IG51bGwsCisgIHNoaWZ0S2V5OiBudWxsLAorICBh bHRLZXk6IG51bGwsCisgIG1ldGFLZXk6IG51bGwsCisgIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2 ZW50TW9kaWZpZXJTdGF0ZSwKKyAgYnV0dG9uOiBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICAvLyBX ZWJraXQsIEZpcmVmb3gsIElFOSsKKyAgICAvLyB3aGljaDogIDEgMiAzCisgICAgLy8gYnV0dG9u OiAwIDEgMiAoc3RhbmRhcmQpCisgICAgdmFyIGJ1dHRvbiA9IGV2ZW50LmJ1dHRvbjsKKyAgICBp ZiAoJ3doaWNoJyBpbiBldmVudCkgeworICAgICAgcmV0dXJuIGJ1dHRvbjsKKyAgICB9CisgICAg Ly8gSUU8OQorICAgIC8vIHdoaWNoOiAgdW5kZWZpbmVkCisgICAgLy8gYnV0dG9uOiAwIDAgMAor ICAgIC8vIGJ1dHRvbjogMSA0IDIgKG9ubW91c2V1cCkKKyAgICByZXR1cm4gYnV0dG9uID09PSAy ID8gMiA6IGJ1dHRvbiA9PT0gNCA/IDEgOiAwOworICB9LAorICBidXR0b25zOiBudWxsLAorICBy ZWxhdGVkVGFyZ2V0OiBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICByZXR1cm4gZXZlbnQucmVsYXRl ZFRhcmdldCB8fCAoZXZlbnQuZnJvbUVsZW1lbnQgPT09IGV2ZW50LnNyY0VsZW1lbnQgPyBldmVu dC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudCk7CisgIH0sCisgIC8vICJQcm9wcmlldGFy eSIgSW50ZXJmYWNlLgorICBwYWdlWDogZnVuY3Rpb24gKGV2ZW50KSB7CisgICAgcmV0dXJuICdw YWdlWCcgaW4gZXZlbnQgPyBldmVudC5wYWdlWCA6IGV2ZW50LmNsaWVudFggKyBWaWV3cG9ydE1l dHJpY3MuY3VycmVudFNjcm9sbExlZnQ7CisgIH0sCisgIHBhZ2VZOiBmdW5jdGlvbiAoZXZlbnQp IHsKKyAgICByZXR1cm4gJ3BhZ2VZJyBpbiBldmVudCA/IGV2ZW50LnBhZ2VZIDogZXZlbnQuY2xp ZW50WSArIFZpZXdwb3J0TWV0cmljcy5jdXJyZW50U2Nyb2xsVG9wOworICB9Cit9OworCisvKioK KyAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8g ZGlzcGF0Y2ggdGhpcyBldmVudC4KKyAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBN YXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC4KKyAqIEBwYXJhbSB7b2JqZWN0fSBu YXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC4KKyAqIEBleHRlbmRzIHtTeW50aGV0aWNV SUV2ZW50fQorICovCitmdW5jdGlvbiBTeW50aGV0aWNNb3VzZUV2ZW50KGRpc3BhdGNoQ29uZmln LCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7CisgIHJl dHVybiBTeW50aGV0aWNVSUV2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNo TWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpOworfQorCitTeW50aGV0aWNV SUV2ZW50LmF1Z21lbnRDbGFzcyhTeW50aGV0aWNNb3VzZUV2ZW50LCBNb3VzZUV2ZW50SW50ZXJm YWNlKTsKKworbW9kdWxlLmV4cG9ydHMgPSBTeW50aGV0aWNNb3VzZUV2ZW50OworfSx7IjEwNSI6 MTA1LCI5MSI6OTEsIjk0Ijo5NH1dLDg5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRz KXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFs bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1 bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUg aW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwg Z3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZp bGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3Zh ciBTeW50aGV0aWNVSUV2ZW50ID0gX2RlcmVxXyg5MSk7CisKK3ZhciBnZXRFdmVudE1vZGlmaWVy U3RhdGUgPSBfZGVyZXFfKDEwNSk7CisKKy8qKgorICogQGludGVyZmFjZSBUb3VjaEV2ZW50Cisg KiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3RvdWNoLWV2ZW50cy8KKyAqLwordmFyIFRvdWNo RXZlbnRJbnRlcmZhY2UgPSB7CisgIHRvdWNoZXM6IG51bGwsCisgIHRhcmdldFRvdWNoZXM6IG51 bGwsCisgIGNoYW5nZWRUb3VjaGVzOiBudWxsLAorICBhbHRLZXk6IG51bGwsCisgIG1ldGFLZXk6 IG51bGwsCisgIGN0cmxLZXk6IG51bGwsCisgIHNoaWZ0S2V5OiBudWxsLAorICBnZXRNb2RpZmll clN0YXRlOiBnZXRFdmVudE1vZGlmaWVyU3RhdGUKK307CisKKy8qKgorICogQHBhcmFtIHtvYmpl Y3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2 ZW50LgorICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWlu ZyB0aGUgZXZlbnQgdGFyZ2V0LgorICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2 ZSBicm93c2VyIGV2ZW50LgorICogQGV4dGVuZHMge1N5bnRoZXRpY1VJRXZlbnR9CisgKi8KK2Z1 bmN0aW9uIFN5bnRoZXRpY1RvdWNoRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2Vy LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHsKKyAgcmV0dXJuIFN5bnRoZXRpY1VJ RXZlbnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2 ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7Cit9CisKK1N5bnRoZXRpY1VJRXZlbnQuYXVnbWVudENs YXNzKFN5bnRoZXRpY1RvdWNoRXZlbnQsIFRvdWNoRXZlbnRJbnRlcmZhY2UpOworCittb2R1bGUu ZXhwb3J0cyA9IFN5bnRoZXRpY1RvdWNoRXZlbnQ7Cit9LHsiMTA1IjoxMDUsIjkxIjo5MX1dLDkw OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIw MTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor ICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vu c2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9m IHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdo dHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5 LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBTeW50aGV0aWNFdmVudCA9IF9kZXJl cV8oODQpOworCisvKioKKyAqIEBpbnRlcmZhY2UgRXZlbnQKKyAqIEBzZWUgaHR0cDovL3d3dy53 My5vcmcvVFIvMjAwOS9XRC1jc3MzLXRyYW5zaXRpb25zLTIwMDkwMzIwLyN0cmFuc2l0aW9uLWV2 ZW50cy0KKyAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9X ZWIvQVBJL1RyYW5zaXRpb25FdmVudAorICovCit2YXIgVHJhbnNpdGlvbkV2ZW50SW50ZXJmYWNl ID0geworICBwcm9wZXJ0eU5hbWU6IG51bGwsCisgIGVsYXBzZWRUaW1lOiBudWxsLAorICBwc2V1 ZG9FbGVtZW50OiBudWxsCit9OworCisvKioKKyAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENv bmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC4KKyAqIEBwYXJh bSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRh cmdldC4KKyAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVu dC4KKyAqIEBleHRlbmRzIHtTeW50aGV0aWNFdmVudH0KKyAqLworZnVuY3Rpb24gU3ludGhldGlj VHJhbnNpdGlvbkV2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZl bnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7CisgIHJldHVybiBTeW50aGV0aWNFdmVudC5jYWxsKHRo aXMsIGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2 ZW50VGFyZ2V0KTsKK30KKworU3ludGhldGljRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY1Ry YW5zaXRpb25FdmVudCwgVHJhbnNpdGlvbkV2ZW50SW50ZXJmYWNlKTsKKworbW9kdWxlLmV4cG9y dHMgPSBTeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQ7Cit9LHsiODQiOjg0fV0sOTE6W2Z1bmN0aW9u KF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50 LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNv dXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBp biB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3Vy Y2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUg Zm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICov CisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFN5bnRoZXRpY0V2ZW50ID0gX2RlcmVxXyg4NCk7CisK K3ZhciBnZXRFdmVudFRhcmdldCA9IF9kZXJlcV8oMTA2KTsKKworLyoqCisgKiBAaW50ZXJmYWNl IFVJRXZlbnQKKyAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRz LworICovCit2YXIgVUlFdmVudEludGVyZmFjZSA9IHsKKyAgdmlldzogZnVuY3Rpb24gKGV2ZW50 KSB7CisgICAgaWYgKGV2ZW50LnZpZXcpIHsKKyAgICAgIHJldHVybiBldmVudC52aWV3OworICAg IH0KKworICAgIHZhciB0YXJnZXQgPSBnZXRFdmVudFRhcmdldChldmVudCk7CisgICAgaWYgKHRh cmdldC53aW5kb3cgPT09IHRhcmdldCkgeworICAgICAgLy8gdGFyZ2V0IGlzIGEgd2luZG93IG9i amVjdAorICAgICAgcmV0dXJuIHRhcmdldDsKKyAgICB9CisKKyAgICB2YXIgZG9jID0gdGFyZ2V0 Lm93bmVyRG9jdW1lbnQ7CisgICAgLy8gVE9ETzogRmlndXJlIG91dCB3aHkgYG93bmVyRG9jdW1l bnRgIGlzIHNvbWV0aW1lcyB1bmRlZmluZWQgaW4gSUU4LgorICAgIGlmIChkb2MpIHsKKyAgICAg IHJldHVybiBkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdzsKKyAgICB9IGVsc2Ug eworICAgICAgcmV0dXJuIHdpbmRvdzsKKyAgICB9CisgIH0sCisgIGRldGFpbDogZnVuY3Rpb24g KGV2ZW50KSB7CisgICAgcmV0dXJuIGV2ZW50LmRldGFpbCB8fCAwOworICB9Cit9OworCisvKioK KyAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8g ZGlzcGF0Y2ggdGhpcyBldmVudC4KKyAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBN YXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC4KKyAqIEBwYXJhbSB7b2JqZWN0fSBu YXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC4KKyAqIEBleHRlbmRzIHtTeW50aGV0aWNF dmVudH0KKyAqLworZnVuY3Rpb24gU3ludGhldGljVUlFdmVudChkaXNwYXRjaENvbmZpZywgZGlz cGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkgeworICByZXR1cm4g U3ludGhldGljRXZlbnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIs IG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7Cit9CisKK1N5bnRoZXRpY0V2ZW50LmF1 Z21lbnRDbGFzcyhTeW50aGV0aWNVSUV2ZW50LCBVSUV2ZW50SW50ZXJmYWNlKTsKKworbW9kdWxl LmV4cG9ydHMgPSBTeW50aGV0aWNVSUV2ZW50OworfSx7IjEwNiI6MTA2LCI4NCI6ODR9XSw5Mjpb ZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEz LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq IFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNl IGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0 aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRz IGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4K KyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgU3ludGhldGljTW91c2VFdmVudCA9IF9k ZXJlcV8oODgpOworCisvKioKKyAqIEBpbnRlcmZhY2UgV2hlZWxFdmVudAorICogQHNlZSBodHRw Oi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvCisgKi8KK3ZhciBXaGVlbEV2ZW50 SW50ZXJmYWNlID0geworICBkZWx0YVg6IGZ1bmN0aW9uIChldmVudCkgeworICAgIHJldHVybiAn ZGVsdGFYJyBpbiBldmVudCA/IGV2ZW50LmRlbHRhWCA6CisgICAgLy8gRmFsbGJhY2sgdG8gYHdo ZWVsRGVsdGFYYCBmb3IgV2Via2l0IGFuZCBub3JtYWxpemUgKHJpZ2h0IGlzIHBvc2l0aXZlKS4K KyAgICAnd2hlZWxEZWx0YVgnIGluIGV2ZW50ID8gLWV2ZW50LndoZWVsRGVsdGFYIDogMDsKKyAg fSwKKyAgZGVsdGFZOiBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICByZXR1cm4gJ2RlbHRhWScgaW4g ZXZlbnQgPyBldmVudC5kZWx0YVkgOgorICAgIC8vIEZhbGxiYWNrIHRvIGB3aGVlbERlbHRhWWAg Zm9yIFdlYmtpdCBhbmQgbm9ybWFsaXplIChkb3duIGlzIHBvc2l0aXZlKS4KKyAgICAnd2hlZWxE ZWx0YVknIGluIGV2ZW50ID8gLWV2ZW50LndoZWVsRGVsdGFZIDoKKyAgICAvLyBGYWxsYmFjayB0 byBgd2hlZWxEZWx0YWAgZm9yIElFPDkgYW5kIG5vcm1hbGl6ZSAoZG93biBpcyBwb3NpdGl2ZSku CisgICAgJ3doZWVsRGVsdGEnIGluIGV2ZW50ID8gLWV2ZW50LndoZWVsRGVsdGEgOiAwOworICB9 LAorICBkZWx0YVo6IG51bGwsCisKKyAgLy8gQnJvd3NlcnMgd2l0aG91dCAiZGVsdGFNb2RlIiBp cyByZXBvcnRpbmcgaW4gcmF3IHdoZWVsIGRlbHRhIHdoZXJlIG9uZQorICAvLyBub3RjaCBvbiB0 aGUgc2Nyb2xsIGlzIGFsd2F5cyArLy0gMTIwLCByb3VnaGx5IGVxdWl2YWxlbnQgdG8gcGl4ZWxz LgorICAvLyBBIGdvb2QgYXBwcm94aW1hdGlvbiBvZiBET01fREVMVEFfTElORSAoMSkgaXMgNSUg b2Ygdmlld3BvcnQgc2l6ZSBvcgorICAvLyB+NDAgcGl4ZWxzLCBmb3IgRE9NX0RFTFRBX1NDUkVF TiAoMikgaXQgaXMgODcuNSUgb2Ygdmlld3BvcnQgc2l6ZS4KKyAgZGVsdGFNb2RlOiBudWxsCit9 OworCisvKioKKyAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9u IHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC4KKyAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRj aE1hcmtlciBNYXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC4KKyAqIEBwYXJhbSB7 b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC4KKyAqIEBleHRlbmRzIHtT eW50aGV0aWNNb3VzZUV2ZW50fQorICovCitmdW5jdGlvbiBTeW50aGV0aWNXaGVlbEV2ZW50KGRp c3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFy Z2V0KSB7CisgIHJldHVybiBTeW50aGV0aWNNb3VzZUV2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hD b25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpOwor fQorCitTeW50aGV0aWNNb3VzZUV2ZW50LmF1Z21lbnRDbGFzcyhTeW50aGV0aWNXaGVlbEV2ZW50 LCBXaGVlbEV2ZW50SW50ZXJmYWNlKTsKKworbW9kdWxlLmV4cG9ydHMgPSBTeW50aGV0aWNXaGVl bEV2ZW50OworfSx7Ijg4Ijo4OH1dLDkzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRz KXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFs bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1 bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUg aW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwg Z3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZp bGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsK KwordmFyIF9wcm9kSW52YXJpYW50ID0gX2RlcmVxXygxMTYpOworCit2YXIgaW52YXJpYW50ID0g X2RlcmVxXygxNDApOworCit2YXIgT0JTRVJWRURfRVJST1IgPSB7fTsKKworLyoqCisgKiBgVHJh bnNhY3Rpb25gIGNyZWF0ZXMgYSBibGFjayBib3ggdGhhdCBpcyBhYmxlIHRvIHdyYXAgYW55IG1l dGhvZCBzdWNoIHRoYXQKKyAqIGNlcnRhaW4gaW52YXJpYW50cyBhcmUgbWFpbnRhaW5lZCBiZWZv cmUgYW5kIGFmdGVyIHRoZSBtZXRob2QgaXMgaW52b2tlZAorICogKEV2ZW4gaWYgYW4gZXhjZXB0 aW9uIGlzIHRocm93biB3aGlsZSBpbnZva2luZyB0aGUgd3JhcHBlZCBtZXRob2QpLiBXaG9ldmVy CisgKiBpbnN0YW50aWF0ZXMgYSB0cmFuc2FjdGlvbiBjYW4gcHJvdmlkZSBlbmZvcmNlcnMgb2Yg dGhlIGludmFyaWFudHMgYXQKKyAqIGNyZWF0aW9uIHRpbWUuIFRoZSBgVHJhbnNhY3Rpb25gIGNs YXNzIGl0c2VsZiB3aWxsIHN1cHBseSBvbmUgYWRkaXRpb25hbAorICogYXV0b21hdGljIGludmFy aWFudCBmb3IgeW91IC0gdGhlIGludmFyaWFudCB0aGF0IGFueSB0cmFuc2FjdGlvbiBpbnN0YW5j ZQorICogc2hvdWxkIG5vdCBiZSBydW4gd2hpbGUgaXQgaXMgYWxyZWFkeSBiZWluZyBydW4uIFlv dSB3b3VsZCB0eXBpY2FsbHkgY3JlYXRlIGEKKyAqIHNpbmdsZSBpbnN0YW5jZSBvZiBhIGBUcmFu c2FjdGlvbmAgZm9yIHJldXNlIG11bHRpcGxlIHRpbWVzLCB0aGF0IHBvdGVudGlhbGx5CisgKiBp cyB1c2VkIHRvIHdyYXAgc2V2ZXJhbCBkaWZmZXJlbnQgbWV0aG9kcy4gV3JhcHBlcnMgYXJlIGV4 dHJlbWVseSBzaW1wbGUgLQorICogdGhleSBvbmx5IHJlcXVpcmUgaW1wbGVtZW50aW5nIHR3byBt ZXRob2RzLgorICoKKyAqIDxwcmU+CisgKiAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlcnMg KGluamVjdGVkIGF0IGNyZWF0aW9uIHRpbWUpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKyAgICAgICAgKworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0t LS18LS0tLS0tLS18LS0tLS0tLS0tLS0tLS0rCisgKiAgICAgICAgICAgICAgICAgICAgfCAgICAg ICAgICAgICAgICAgdiAgICAgICAgfCAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICAg ICAgIHwgICAgICArLS0tLS0tLS0tLS0tLS0tKyAgIHwgICAgICAgICAgICAgIHwKKyAqICAgICAg ICAgICAgICAgICAgICB8ICAgKy0tfCAgICB3cmFwcGVyMSAgIHwtLS18LS0tLSsgICAgICAgICB8 CisgKiAgICAgICAgICAgICAgICAgICAgfCAgIHwgICstLS0tLS0tLS0tLS0tLS0rICAgdiAgICB8 ICAgICAgICAgfAorICogICAgICAgICAgICAgICAgICAgIHwgICB8ICAgICAgICAgICstLS0tLS0t LS0tLS0tKyAgfCAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICB8ICAgfCAgICAgKy0t LS18ICAgd3JhcHBlcjIgIHwtLS0tLS0tLSsgICB8CisgKiAgICAgICAgICAgICAgICAgICAgfCAg IHwgICAgIHwgICAgKy0tLS0tLS0tLS0tLS0rICB8ICAgICB8ICAgfAorICogICAgICAgICAgICAg ICAgICAgIHwgICB8ICAgICB8ICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCAgIHwKKyAqICAg ICAgICAgICAgICAgICAgICB8ICAgdiAgICAgdiAgICAgICAgICAgICAgICAgICAgIHYgICAgIHYg ICB8IHdyYXBwZXIKKyAqICAgICAgICAgICAgICAgICAgICB8ICstLS0rICstLS0rICAgKy0tLS0t LS0tLSsgICArLS0tKyArLS0tKyB8IGludmFyaWFudHMKKyAqIHBlcmZvcm0oYW55TWV0aG9kKSB8 IHwgICB8IHwgICB8ICAgfCAgICAgICAgIHwgICB8ICAgfCB8ICAgfCB8IG1haW50YWluZWQKKyAq ICstLS0tLS0tLS0tLS0tLS0tLT58LXwtLS18LXwtLS18LS0+fGFueU1ldGhvZHwtLS18LS0tfC18 LS0tfC18LS0tLS0tLS0+CisgKiAgICAgICAgICAgICAgICAgICAgfCB8ICAgfCB8ICAgfCAgIHwg ICAgICAgICB8ICAgfCAgIHwgfCAgIHwgfAorICogICAgICAgICAgICAgICAgICAgIHwgfCAgIHwg fCAgIHwgICB8ICAgICAgICAgfCAgIHwgICB8IHwgICB8IHwKKyAqICAgICAgICAgICAgICAgICAg ICB8IHwgICB8IHwgICB8ICAgfCAgICAgICAgIHwgICB8ICAgfCB8ICAgfCB8CisgKiAgICAgICAg ICAgICAgICAgICAgfCArLS0tKyArLS0tKyAgICstLS0tLS0tLS0rICAgKy0tLSsgKy0tLSsgfAor ICogICAgICAgICAgICAgICAgICAgIHwgIGluaXRpYWxpemUgICAgICAgICAgICAgICAgICAgIGNs b3NlICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0rCisgKiA8L3ByZT4KKyAqCisgKiBVc2UgY2FzZXM6CisgKiAtIFBy ZXNlcnZpbmcgdGhlIGlucHV0IHNlbGVjdGlvbiByYW5nZXMgYmVmb3JlL2FmdGVyIHJlY29uY2ls aWF0aW9uLgorICogICBSZXN0b3Jpbmcgc2VsZWN0aW9uIGV2ZW4gaW4gdGhlIGV2ZW50IG9mIGFu IHVuZXhwZWN0ZWQgZXJyb3IuCisgKiAtIERlYWN0aXZhdGluZyBldmVudHMgd2hpbGUgcmVhcnJh bmdpbmcgdGhlIERPTSwgcHJldmVudGluZyBibHVycy9mb2N1c2VzLAorICogICB3aGlsZSBndWFy YW50ZWVpbmcgdGhhdCBhZnRlcndhcmRzLCB0aGUgZXZlbnQgc3lzdGVtIGlzIHJlYWN0aXZhdGVk LgorICogLSBGbHVzaGluZyBhIHF1ZXVlIG9mIGNvbGxlY3RlZCBET00gbXV0YXRpb25zIHRvIHRo ZSBtYWluIFVJIHRocmVhZCBhZnRlciBhCisgKiAgIHJlY29uY2lsaWF0aW9uIHRha2VzIHBsYWNl IGluIGEgd29ya2VyIHRocmVhZC4KKyAqIC0gSW52b2tpbmcgYW55IGNvbGxlY3RlZCBgY29tcG9u ZW50RGlkVXBkYXRlYCBjYWxsYmFja3MgYWZ0ZXIgcmVuZGVyaW5nIG5ldworICogICBjb250ZW50 LgorICogLSAoRnV0dXJlIHVzZSBjYXNlKTogV3JhcHBpbmcgcGFydGljdWxhciBmbHVzaGVzIG9m IHRoZSBgUmVhY3RXb3JrZXJgIHF1ZXVlCisgKiAgIHRvIHByZXNlcnZlIHRoZSBgc2Nyb2xsVG9w YCAoYW4gYXV0b21hdGljIHNjcm9sbCBhd2FyZSBET00pLgorICogLSAoRnV0dXJlIHVzZSBjYXNl KTogTGF5b3V0IGNhbGN1bGF0aW9ucyBiZWZvcmUgYW5kIGFmdGVyIERPTSB1cGRhdGVzLgorICoK KyAqIFRyYW5zYWN0aW9uYWwgcGx1Z2luIEFQSToKKyAqIC0gQSBtb2R1bGUgdGhhdCBoYXMgYW4g YGluaXRpYWxpemVgIG1ldGhvZCB0aGF0IHJldHVybnMgYW55IHByZWNvbXB1dGF0aW9uLgorICog LSBhbmQgYSBgY2xvc2VgIG1ldGhvZCB0aGF0IGFjY2VwdHMgdGhlIHByZWNvbXB1dGF0aW9uLiBg Y2xvc2VgIGlzIGludm9rZWQKKyAqICAgd2hlbiB0aGUgd3JhcHBlZCBwcm9jZXNzIGlzIGNvbXBs ZXRlZCwgb3IgaGFzIGZhaWxlZC4KKyAqCisgKiBAcGFyYW0ge0FycmF5PFRyYW5zYWN0aW9uYWxX cmFwcGVyPn0gdHJhbnNhY3Rpb25XcmFwcGVyIFdyYXBwZXIgbW9kdWxlcworICogdGhhdCBpbXBs ZW1lbnQgYGluaXRpYWxpemVgIGFuZCBgY2xvc2VgLgorICogQHJldHVybiB7VHJhbnNhY3Rpb259 IFNpbmdsZSB0cmFuc2FjdGlvbiBmb3IgcmV1c2UgaW4gdGhyZWFkLgorICoKKyAqIEBjbGFzcyBU cmFuc2FjdGlvbgorICovCit2YXIgVHJhbnNhY3Rpb25JbXBsID0geworICAvKioKKyAgICogU2V0 cyB1cCB0aGlzIGluc3RhbmNlIHNvIHRoYXQgaXQgaXMgcHJlcGFyZWQgZm9yIGNvbGxlY3Rpbmcg bWV0cmljcy4gRG9lcworICAgKiBzbyBzdWNoIHRoYXQgdGhpcyBzZXR1cCBtZXRob2QgbWF5IGJl IHVzZWQgb24gYW4gaW5zdGFuY2UgdGhhdCBpcyBhbHJlYWR5CisgICAqIGluaXRpYWxpemVkLCBp biBhIHdheSB0aGF0IGRvZXMgbm90IGNvbnN1bWUgYWRkaXRpb25hbCBtZW1vcnkgdXBvbiByZXVz ZS4KKyAgICogVGhhdCBjYW4gYmUgdXNlZnVsIGlmIHlvdSBkZWNpZGUgdG8gbWFrZSB5b3VyIHN1 YmNsYXNzIG9mIHRoaXMgbWl4aW4gYQorICAgKiAiUG9vbGVkQ2xhc3MiLgorICAgKi8KKyAgcmVp bml0aWFsaXplVHJhbnNhY3Rpb246IGZ1bmN0aW9uICgpIHsKKyAgICB0aGlzLnRyYW5zYWN0aW9u V3JhcHBlcnMgPSB0aGlzLmdldFRyYW5zYWN0aW9uV3JhcHBlcnMoKTsKKyAgICBpZiAodGhpcy53 cmFwcGVySW5pdERhdGEpIHsKKyAgICAgIHRoaXMud3JhcHBlckluaXREYXRhLmxlbmd0aCA9IDA7 CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMud3JhcHBlckluaXREYXRhID0gW107CisgICAgfQor ICAgIHRoaXMuX2lzSW5UcmFuc2FjdGlvbiA9IGZhbHNlOworICB9LAorCisgIF9pc0luVHJhbnNh Y3Rpb246IGZhbHNlLAorCisgIC8qKgorICAgKiBAYWJzdHJhY3QKKyAgICogQHJldHVybiB7QXJy YXk8VHJhbnNhY3Rpb25XcmFwcGVyPn0gQXJyYXkgb2YgdHJhbnNhY3Rpb24gd3JhcHBlcnMuCisg ICAqLworICBnZXRUcmFuc2FjdGlvbldyYXBwZXJzOiBudWxsLAorCisgIGlzSW5UcmFuc2FjdGlv bjogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiAhIXRoaXMuX2lzSW5UcmFuc2FjdGlvbjsKKyAg fSwKKworICAvKioKKyAgICogRXhlY3V0ZXMgdGhlIGZ1bmN0aW9uIHdpdGhpbiBhIHNhZmV0eSB3 aW5kb3cuIFVzZSB0aGlzIGZvciB0aGUgdG9wIGxldmVsCisgICAqIG1ldGhvZHMgdGhhdCByZXN1 bHQgaW4gbGFyZ2UgYW1vdW50cyBvZiBjb21wdXRhdGlvbi9tdXRhdGlvbnMgdGhhdCB3b3VsZAor ICAgKiBuZWVkIHRvIGJlIHNhZmV0eSBjaGVja2VkLiBUaGUgb3B0aW9uYWwgYXJndW1lbnRzIGhl bHBzIHByZXZlbnQgdGhlIG5lZWQKKyAgICogdG8gYmluZCBpbiBtYW55IGNhc2VzLgorICAgKgor ICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBtZXRob2QgTWVtYmVyIG9mIHNjb3BlIHRvIGNhbGwuCisg ICAqIEBwYXJhbSB7T2JqZWN0fSBzY29wZSBTY29wZSB0byBpbnZva2UgZnJvbS4KKyAgICogQHBh cmFtIHtPYmplY3Q/PX0gYSBBcmd1bWVudCB0byBwYXNzIHRvIHRoZSBtZXRob2QuCisgICAqIEBw YXJhbSB7T2JqZWN0Pz19IGIgQXJndW1lbnQgdG8gcGFzcyB0byB0aGUgbWV0aG9kLgorICAgKiBA cGFyYW0ge09iamVjdD89fSBjIEFyZ3VtZW50IHRvIHBhc3MgdG8gdGhlIG1ldGhvZC4KKyAgICog QHBhcmFtIHtPYmplY3Q/PX0gZCBBcmd1bWVudCB0byBwYXNzIHRvIHRoZSBtZXRob2QuCisgICAq IEBwYXJhbSB7T2JqZWN0Pz19IGUgQXJndW1lbnQgdG8gcGFzcyB0byB0aGUgbWV0aG9kLgorICAg KiBAcGFyYW0ge09iamVjdD89fSBmIEFyZ3VtZW50IHRvIHBhc3MgdG8gdGhlIG1ldGhvZC4KKyAg ICoKKyAgICogQHJldHVybiB7Kn0gUmV0dXJuIHZhbHVlIGZyb20gYG1ldGhvZGAuCisgICAqLwor ICBwZXJmb3JtOiBmdW5jdGlvbiAobWV0aG9kLCBzY29wZSwgYSwgYiwgYywgZCwgZSwgZikgewor ICAgICEhdGhpcy5pc0luVHJhbnNhY3Rpb24oKSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0 aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1RyYW5zYWN0aW9uLnBlcmZvcm0oLi4uKTogQ2Fubm90 IGluaXRpYWxpemUgYSB0cmFuc2FjdGlvbiB3aGVuIHRoZXJlIGlzIGFscmVhZHkgYW4gb3V0c3Rh bmRpbmcgdHJhbnNhY3Rpb24uJykgOiBfcHJvZEludmFyaWFudCgnMjcnKSA6IHZvaWQgMDsKKyAg ICB2YXIgZXJyb3JUaHJvd247CisgICAgdmFyIHJldDsKKyAgICB0cnkgeworICAgICAgdGhpcy5f aXNJblRyYW5zYWN0aW9uID0gdHJ1ZTsKKyAgICAgIC8vIENhdGNoaW5nIGVycm9ycyBtYWtlcyBk ZWJ1Z2dpbmcgbW9yZSBkaWZmaWN1bHQsIHNvIHdlIHN0YXJ0IHdpdGgKKyAgICAgIC8vIGVycm9y VGhyb3duIHNldCB0byB0cnVlIGJlZm9yZSBzZXR0aW5nIGl0IHRvIGZhbHNlIGFmdGVyIGNhbGxp bmcKKyAgICAgIC8vIGNsb3NlIC0tIGlmIGl0J3Mgc3RpbGwgc2V0IHRvIHRydWUgaW4gdGhlIGZp bmFsbHkgYmxvY2ssIGl0IG1lYW5zCisgICAgICAvLyBvbmUgb2YgdGhlc2UgY2FsbHMgdGhyZXcu CisgICAgICBlcnJvclRocm93biA9IHRydWU7CisgICAgICB0aGlzLmluaXRpYWxpemVBbGwoMCk7 CisgICAgICByZXQgPSBtZXRob2QuY2FsbChzY29wZSwgYSwgYiwgYywgZCwgZSwgZik7CisgICAg ICBlcnJvclRocm93biA9IGZhbHNlOworICAgIH0gZmluYWxseSB7CisgICAgICB0cnkgeworICAg ICAgICBpZiAoZXJyb3JUaHJvd24pIHsKKyAgICAgICAgICAvLyBJZiBgbWV0aG9kYCB0aHJvd3Ms IHByZWZlciB0byBzaG93IHRoYXQgc3RhY2sgdHJhY2Ugb3ZlciBhbnkgdGhyb3duCisgICAgICAg ICAgLy8gYnkgaW52b2tpbmcgYGNsb3NlQWxsYC4KKyAgICAgICAgICB0cnkgeworICAgICAgICAg ICAgdGhpcy5jbG9zZUFsbCgwKTsKKyAgICAgICAgICB9IGNhdGNoIChlcnIpIHt9CisgICAgICAg IH0gZWxzZSB7CisgICAgICAgICAgLy8gU2luY2UgYG1ldGhvZGAgZGlkbid0IHRocm93LCB3ZSBk b24ndCB3YW50IHRvIHNpbGVuY2UgdGhlIGV4Y2VwdGlvbgorICAgICAgICAgIC8vIGhlcmUuCisg ICAgICAgICAgdGhpcy5jbG9zZUFsbCgwKTsKKyAgICAgICAgfQorICAgICAgfSBmaW5hbGx5IHsK KyAgICAgICAgdGhpcy5faXNJblRyYW5zYWN0aW9uID0gZmFsc2U7CisgICAgICB9CisgICAgfQor ICAgIHJldHVybiByZXQ7CisgIH0sCisKKyAgaW5pdGlhbGl6ZUFsbDogZnVuY3Rpb24gKHN0YXJ0 SW5kZXgpIHsKKyAgICB2YXIgdHJhbnNhY3Rpb25XcmFwcGVycyA9IHRoaXMudHJhbnNhY3Rpb25X cmFwcGVyczsKKyAgICBmb3IgKHZhciBpID0gc3RhcnRJbmRleDsgaSA8IHRyYW5zYWN0aW9uV3Jh cHBlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciB3cmFwcGVyID0gdHJhbnNhY3Rpb25XcmFw cGVyc1tpXTsKKyAgICAgIHRyeSB7CisgICAgICAgIC8vIENhdGNoaW5nIGVycm9ycyBtYWtlcyBk ZWJ1Z2dpbmcgbW9yZSBkaWZmaWN1bHQsIHNvIHdlIHN0YXJ0IHdpdGggdGhlCisgICAgICAgIC8v IE9CU0VSVkVEX0VSUk9SIHN0YXRlIGJlZm9yZSBvdmVyd3JpdGluZyBpdCB3aXRoIHRoZSByZWFs IHJldHVybiB2YWx1ZQorICAgICAgICAvLyBvZiBpbml0aWFsaXplIC0tIGlmIGl0J3Mgc3RpbGwg c2V0IHRvIE9CU0VSVkVEX0VSUk9SIGluIHRoZSBmaW5hbGx5CisgICAgICAgIC8vIGJsb2NrLCBp dCBtZWFucyB3cmFwcGVyLmluaXRpYWxpemUgdGhyZXcuCisgICAgICAgIHRoaXMud3JhcHBlcklu aXREYXRhW2ldID0gT0JTRVJWRURfRVJST1I7CisgICAgICAgIHRoaXMud3JhcHBlckluaXREYXRh W2ldID0gd3JhcHBlci5pbml0aWFsaXplID8gd3JhcHBlci5pbml0aWFsaXplLmNhbGwodGhpcykg OiBudWxsOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgaWYgKHRoaXMud3JhcHBlckluaXRE YXRhW2ldID09PSBPQlNFUlZFRF9FUlJPUikgeworICAgICAgICAgIC8vIFRoZSBpbml0aWFsaXpl ciBmb3Igd3JhcHBlciBpIHRocmV3IGFuIGVycm9yOyBpbml0aWFsaXplIHRoZQorICAgICAgICAg IC8vIHJlbWFpbmluZyB3cmFwcGVycyBidXQgc2lsZW5jZSBhbnkgZXhjZXB0aW9ucyBmcm9tIHRo ZW0gdG8gZW5zdXJlCisgICAgICAgICAgLy8gdGhhdCB0aGUgZmlyc3QgZXJyb3IgaXMgdGhlIG9u ZSB0byBidWJibGUgdXAuCisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRoaXMuaW5pdGlh bGl6ZUFsbChpICsgMSk7CisgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7fQorICAgICAgICB9Cisg ICAgICB9CisgICAgfQorICB9LAorCisgIC8qKgorICAgKiBJbnZva2VzIGVhY2ggb2YgYHRoaXMu dHJhbnNhY3Rpb25XcmFwcGVycy5jbG9zZVtpXWAgZnVuY3Rpb25zLCBwYXNzaW5nIGludG8KKyAg ICogdGhlbSB0aGUgcmVzcGVjdGl2ZSByZXR1cm4gdmFsdWVzIG9mIGB0aGlzLnRyYW5zYWN0aW9u V3JhcHBlcnMuaW5pdFtpXWAKKyAgICogKGBjbG9zZWBycyB0aGF0IGNvcnJlc3BvbmQgdG8gaW5p dGlhbGl6ZXJzIHRoYXQgZmFpbGVkIHdpbGwgbm90IGJlCisgICAqIGludm9rZWQpLgorICAgKi8K KyAgY2xvc2VBbGw6IGZ1bmN0aW9uIChzdGFydEluZGV4KSB7CisgICAgIXRoaXMuaXNJblRyYW5z YWN0aW9uKCkgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFs c2UsICdUcmFuc2FjdGlvbi5jbG9zZUFsbCgpOiBDYW5ub3QgY2xvc2UgdHJhbnNhY3Rpb24gd2hl biBub25lIGFyZSBvcGVuLicpIDogX3Byb2RJbnZhcmlhbnQoJzI4JykgOiB2b2lkIDA7CisgICAg dmFyIHRyYW5zYWN0aW9uV3JhcHBlcnMgPSB0aGlzLnRyYW5zYWN0aW9uV3JhcHBlcnM7CisgICAg Zm9yICh2YXIgaSA9IHN0YXJ0SW5kZXg7IGkgPCB0cmFuc2FjdGlvbldyYXBwZXJzLmxlbmd0aDsg aSsrKSB7CisgICAgICB2YXIgd3JhcHBlciA9IHRyYW5zYWN0aW9uV3JhcHBlcnNbaV07CisgICAg ICB2YXIgaW5pdERhdGEgPSB0aGlzLndyYXBwZXJJbml0RGF0YVtpXTsKKyAgICAgIHZhciBlcnJv clRocm93bjsKKyAgICAgIHRyeSB7CisgICAgICAgIC8vIENhdGNoaW5nIGVycm9ycyBtYWtlcyBk ZWJ1Z2dpbmcgbW9yZSBkaWZmaWN1bHQsIHNvIHdlIHN0YXJ0IHdpdGgKKyAgICAgICAgLy8gZXJy b3JUaHJvd24gc2V0IHRvIHRydWUgYmVmb3JlIHNldHRpbmcgaXQgdG8gZmFsc2UgYWZ0ZXIgY2Fs bGluZworICAgICAgICAvLyBjbG9zZSAtLSBpZiBpdCdzIHN0aWxsIHNldCB0byB0cnVlIGluIHRo ZSBmaW5hbGx5IGJsb2NrLCBpdCBtZWFucworICAgICAgICAvLyB3cmFwcGVyLmNsb3NlIHRocmV3 LgorICAgICAgICBlcnJvclRocm93biA9IHRydWU7CisgICAgICAgIGlmIChpbml0RGF0YSAhPT0g T0JTRVJWRURfRVJST1IgJiYgd3JhcHBlci5jbG9zZSkgeworICAgICAgICAgIHdyYXBwZXIuY2xv c2UuY2FsbCh0aGlzLCBpbml0RGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgZXJyb3JUaHJvd24g PSBmYWxzZTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIGlmIChlcnJvclRocm93bikgewor ICAgICAgICAgIC8vIFRoZSBjbG9zZXIgZm9yIHdyYXBwZXIgaSB0aHJldyBhbiBlcnJvcjsgY2xv c2UgdGhlIHJlbWFpbmluZworICAgICAgICAgIC8vIHdyYXBwZXJzIGJ1dCBzaWxlbmNlIGFueSBl eGNlcHRpb25zIGZyb20gdGhlbSB0byBlbnN1cmUgdGhhdCB0aGUKKyAgICAgICAgICAvLyBmaXJz dCBlcnJvciBpcyB0aGUgb25lIHRvIGJ1YmJsZSB1cC4KKyAgICAgICAgICB0cnkgeworICAgICAg ICAgICAgdGhpcy5jbG9zZUFsbChpICsgMSk7CisgICAgICAgICAgfSBjYXRjaCAoZSkge30KKyAg ICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICB0aGlzLndyYXBwZXJJbml0RGF0YS5sZW5ndGgg PSAwOworICB9Cit9OworCittb2R1bGUuZXhwb3J0cyA9IFRyYW5zYWN0aW9uSW1wbDsKK30seyIx MTYiOjExNiwiMTQwIjoxNDB9XSw5NDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7 CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwg cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5k ZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGlu IHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdy YW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxl IGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIg Vmlld3BvcnRNZXRyaWNzID0geworCisgIGN1cnJlbnRTY3JvbGxMZWZ0OiAwLAorCisgIGN1cnJl bnRTY3JvbGxUb3A6IDAsCisKKyAgcmVmcmVzaFNjcm9sbFZhbHVlczogZnVuY3Rpb24gKHNjcm9s bFBvc2l0aW9uKSB7CisgICAgVmlld3BvcnRNZXRyaWNzLmN1cnJlbnRTY3JvbGxMZWZ0ID0gc2Ny b2xsUG9zaXRpb24ueDsKKyAgICBWaWV3cG9ydE1ldHJpY3MuY3VycmVudFNjcm9sbFRvcCA9IHNj cm9sbFBvc2l0aW9uLnk7CisgIH0KKworfTsKKworbW9kdWxlLmV4cG9ydHMgPSBWaWV3cG9ydE1l dHJpY3M7Cit9LHt9XSw5NTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioK KyAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRz IHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhl IEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSBy b290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50Cisg KiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRo ZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBf cHJvZEludmFyaWFudCA9IF9kZXJlcV8oMTE2KTsKKwordmFyIGludmFyaWFudCA9IF9kZXJlcV8o MTQwKTsKKworLyoqCisgKiBBY2N1bXVsYXRlcyBpdGVtcyB0aGF0IG11c3Qgbm90IGJlIG51bGwg b3IgdW5kZWZpbmVkIGludG8gdGhlIGZpcnN0IG9uZS4gVGhpcworICogaXMgdXNlZCB0byBjb25z ZXJ2ZSBtZW1vcnkgYnkgYXZvaWRpbmcgYXJyYXkgYWxsb2NhdGlvbnMsIGFuZCB0aHVzIHNhY3Jp ZmljZXMKKyAqIEFQSSBjbGVhbm5lc3MuIFNpbmNlIGBjdXJyZW50YCBjYW4gYmUgbnVsbCBiZWZv cmUgYmVpbmcgcGFzc2VkIGluIGFuZCBub3QKKyAqIG51bGwgYWZ0ZXIgdGhpcyBmdW5jdGlvbiwg bWFrZSBzdXJlIHRvIGFzc2lnbiBpdCBiYWNrIHRvIGBjdXJyZW50YDoKKyAqCisgKiBgYSA9IGFj Y3VtdWxhdGVJbnRvKGEsIGIpO2AKKyAqCisgKiBUaGlzIEFQSSBzaG91bGQgYmUgc3BhcmluZ2x5 IHVzZWQuIFRyeSBgYWNjdW11bGF0ZWAgZm9yIHNvbWV0aGluZyBjbGVhbmVyLgorICoKKyAqIEBy ZXR1cm4geyp8YXJyYXk8Kj59IEFuIGFjY3VtdWxhdGlvbiBvZiBpdGVtcy4KKyAqLworCitmdW5j dGlvbiBhY2N1bXVsYXRlSW50byhjdXJyZW50LCBuZXh0KSB7CisgICEobmV4dCAhPSBudWxsKSA/ ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2FjY3Vt dWxhdGVJbnRvKC4uLik6IEFjY3VtdWxhdGVkIGl0ZW1zIG11c3Qgbm90IGJlIG51bGwgb3IgdW5k ZWZpbmVkLicpIDogX3Byb2RJbnZhcmlhbnQoJzMwJykgOiB2b2lkIDA7CisKKyAgaWYgKGN1cnJl bnQgPT0gbnVsbCkgeworICAgIHJldHVybiBuZXh0OworICB9CisKKyAgLy8gQm90aCBhcmUgbm90 IGVtcHR5LiBXYXJuaW5nOiBOZXZlciBjYWxsIHguY29uY2F0KHkpIHdoZW4geW91IGFyZSBub3QK KyAgLy8gY2VydGFpbiB0aGF0IHggaXMgYW4gQXJyYXkgKHggY291bGQgYmUgYSBzdHJpbmcgd2l0 aCBjb25jYXQgbWV0aG9kKS4KKyAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudCkpIHsKKyAgICBp ZiAoQXJyYXkuaXNBcnJheShuZXh0KSkgeworICAgICAgY3VycmVudC5wdXNoLmFwcGx5KGN1cnJl bnQsIG5leHQpOworICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIGN1cnJlbnQucHVz aChuZXh0KTsKKyAgICByZXR1cm4gY3VycmVudDsKKyAgfQorCisgIGlmIChBcnJheS5pc0FycmF5 KG5leHQpKSB7CisgICAgLy8gQSBiaXQgdG9vIGRhbmdlcm91cyB0byBtdXRhdGUgYG5leHRgLgor ICAgIHJldHVybiBbY3VycmVudF0uY29uY2F0KG5leHQpOworICB9CisKKyAgcmV0dXJuIFtjdXJy ZW50LCBuZXh0XTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBhY2N1bXVsYXRlSW50bzsKK30seyIx MTYiOjExNiwiMTQwIjoxNDB9XSw5NjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7 CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwg cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5k ZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGlu IHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdy YW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxl IGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisK K3ZhciBNT0QgPSA2NTUyMTsKKworLy8gYWRsZXIzMiBpcyBub3QgY3J5cHRvZ3JhcGhpY2FsbHkg c3Ryb25nLCBhbmQgaXMgb25seSB1c2VkIHRvIHNhbml0eSBjaGVjayB0aGF0CisvLyBtYXJrdXAg Z2VuZXJhdGVkIG9uIHRoZSBzZXJ2ZXIgbWF0Y2hlcyB0aGUgbWFya3VwIGdlbmVyYXRlZCBvbiB0 aGUgY2xpZW50LgorLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiAoYSBtb2RpZmllZCB2ZXJzaW9uIG9m IHRoZSBTaGVldEpTIHZlcnNpb24pIGhhcyBiZWVuIG9wdGltaXplZAorLy8gZm9yIG91ciB1c2Ug Y2FzZSwgYXQgdGhlIGV4cGVuc2Ugb2YgY29uZm9ybWluZyB0byB0aGUgYWRsZXIzMiBzcGVjaWZp Y2F0aW9uCisvLyBmb3Igbm9uLWFzY2lpIGlucHV0cy4KK2Z1bmN0aW9uIGFkbGVyMzIoZGF0YSkg eworICB2YXIgYSA9IDE7CisgIHZhciBiID0gMDsKKyAgdmFyIGkgPSAwOworICB2YXIgbCA9IGRh dGEubGVuZ3RoOworICB2YXIgbSA9IGwgJiB+MHgzOworICB3aGlsZSAoaSA8IG0pIHsKKyAgICB2 YXIgbiA9IE1hdGgubWluKGkgKyA0MDk2LCBtKTsKKyAgICBmb3IgKDsgaSA8IG47IGkgKz0gNCkg eworICAgICAgYiArPSAoYSArPSBkYXRhLmNoYXJDb2RlQXQoaSkpICsgKGEgKz0gZGF0YS5jaGFy Q29kZUF0KGkgKyAxKSkgKyAoYSArPSBkYXRhLmNoYXJDb2RlQXQoaSArIDIpKSArIChhICs9IGRh dGEuY2hhckNvZGVBdChpICsgMykpOworICAgIH0KKyAgICBhICU9IE1PRDsKKyAgICBiICU9IE1P RDsKKyAgfQorICBmb3IgKDsgaSA8IGw7IGkrKykgeworICAgIGIgKz0gYSArPSBkYXRhLmNoYXJD b2RlQXQoaSk7CisgIH0KKyAgYSAlPSBNT0Q7CisgIGIgJT0gTU9EOworICByZXR1cm4gYSB8IGIg PDwgMTY7Cit9CisKK21vZHVsZS5leHBvcnRzID0gYWRsZXIzMjsKK30se31dLDk3OltmdW5jdGlv bihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKyhmdW5jdGlvbiAocHJvY2Vzcyl7CisvKioKKyAq IENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJl c2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJT RC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290 IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBv ZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBz YW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX3Byb2RJbnZh cmlhbnQgPSBfZGVyZXFfKDExNik7CisKK3ZhciBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcyA9 IF9kZXJlcV8oNjUpOwordmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gX2RlcmVxXyg2Nik7CisK K3ZhciBpbnZhcmlhbnQgPSBfZGVyZXFfKDE0MCk7Cit2YXIgd2FybmluZyA9IF9kZXJlcV8oMTQ3 KTsKKwordmFyIFJlYWN0Q29tcG9uZW50VHJlZUhvb2s7CisKK2lmICh0eXBlb2YgcHJvY2VzcyAh PT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5lbnYgJiYgImRldmVsb3BtZW50IiA9PT0gJ3Rlc3Qn KSB7CisgIC8vIFRlbXBvcmFyeSBoYWNrLgorICAvLyBJbmxpbmUgcmVxdWlyZXMgZG9uJ3Qgd29y ayB3ZWxsIHdpdGggSmVzdDoKKyAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0 L2lzc3Vlcy83MjQwCisgIC8vIFJlbW92ZSB0aGUgaW5saW5lIHJlcXVpcmVzIHdoZW4gd2UgZG9u J3QgbmVlZCB0aGVtIGFueW1vcmU6CisgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9y ZWFjdC9wdWxsLzcxNzgKKyAgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IF9kZXJlcV8oMTIyKTsK K30KKwordmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9OworCisvKioKKyAqIEFzc2VydCB0aGF0 IHRoZSB2YWx1ZXMgbWF0Y2ggd2l0aCB0aGUgdHlwZSBzcGVjcy4KKyAqIEVycm9yIG1lc3NhZ2Vz IGFyZSBtZW1vcml6ZWQgYW5kIHdpbGwgb25seSBiZSBzaG93biBvbmNlLgorICoKKyAqIEBwYXJh bSB7b2JqZWN0fSB0eXBlU3BlY3MgTWFwIG9mIG5hbWUgdG8gYSBSZWFjdFByb3BUeXBlCisgKiBA cGFyYW0ge29iamVjdH0gdmFsdWVzIFJ1bnRpbWUgdmFsdWVzIHRoYXQgbmVlZCB0byBiZSB0eXBl LWNoZWNrZWQKKyAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbiBlLmcuICJwcm9wIiwgImNvbnRl eHQiLCAiY2hpbGQgY29udGV4dCIKKyAqIEBwYXJhbSB7c3RyaW5nfSBjb21wb25lbnROYW1lIE5h bWUgb2YgdGhlIGNvbXBvbmVudCBmb3IgZXJyb3IgbWVzc2FnZXMuCisgKiBAcGFyYW0gez9vYmpl Y3R9IGVsZW1lbnQgVGhlIFJlYWN0IGVsZW1lbnQgdGhhdCBpcyBiZWluZyB0eXBlLWNoZWNrZWQK KyAqIEBwYXJhbSB7P251bWJlcn0gZGVidWdJRCBUaGUgUmVhY3QgY29tcG9uZW50IGluc3RhbmNl IHRoYXQgaXMgYmVpbmcgdHlwZS1jaGVja2VkCisgKiBAcHJpdmF0ZQorICovCitmdW5jdGlvbiBj aGVja1JlYWN0VHlwZVNwZWModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnRO YW1lLCBlbGVtZW50LCBkZWJ1Z0lEKSB7CisgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBl U3BlY3MpIHsKKyAgICBpZiAodHlwZVNwZWNzLmhhc093blByb3BlcnR5KHR5cGVTcGVjTmFtZSkp IHsKKyAgICAgIHZhciBlcnJvcjsKKyAgICAgIC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0 aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvCisgICAgICAvLyBmYWlsIHRo ZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQu CisgICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRo ZW0gdGhyb3cuCisgICAgICB0cnkgeworICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkg YW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWUKKyAgICAgICAgLy8g YmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBt ZXNzYWdlLgorICAgICAgICAhKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSA9PT0gJ2Z1 bmN0aW9uJykgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFs c2UsICclczogJXMgdHlwZSBgJXNgIGlzIGludmFsaWQ7IGl0IG11c3QgYmUgYSBmdW5jdGlvbiwg dXN1YWxseSBmcm9tIFJlYWN0LlByb3BUeXBlcy4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBj bGFzcycsIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXSwgdHlwZVNwZWNOYW1l KSA6IF9wcm9kSW52YXJpYW50KCc4NCcsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywg UmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dLCB0eXBlU3BlY05hbWUpIDogdm9p ZCAwOworICAgICAgICBlcnJvciA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlw ZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgUmVhY3RQcm9wVHlwZXNT ZWNyZXQpOworICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgZXJyb3IgPSBleDsKKyAgICAg IH0KKyAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIWVycm9y IHx8IGVycm9yIGluc3RhbmNlb2YgRXJyb3IsICclczogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICVz IGAlc2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICsgJ2Z1bmN0aW9uIG11c3QgcmV0 dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICVzLiAnICsgJ1lvdSBtYXkg aGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcg KyAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5 cGUsIGFuZCAnICsgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nLCBjb21wb25lbnRO YW1lIHx8ICdSZWFjdCBjbGFzcycsIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9u XSwgdHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IpIDogdm9pZCAwOworICAgICAgaWYgKGVycm9y IGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvci5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJl cykpIHsKKyAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2Ug dGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlCisgICAgICAgIC8vIHNhbWUgZXJyb3IuCisg ICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvci5tZXNzYWdlXSA9IHRydWU7CisKKyAgICAg ICAgdmFyIGNvbXBvbmVudFN0YWNrSW5mbyA9ICcnOworCisgICAgICAgIGlmICgiZGV2ZWxvcG1l bnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICAgICBpZiAoIVJlYWN0Q29tcG9uZW50VHJl ZUhvb2spIHsKKyAgICAgICAgICAgIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSBfZGVyZXFfKDEy Mik7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChkZWJ1Z0lEICE9PSBudWxsKSB7CisgICAg ICAgICAgICBjb21wb25lbnRTdGFja0luZm8gPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0 YWNrQWRkZW5kdW1CeUlEKGRlYnVnSUQpOworICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCAh PT0gbnVsbCkgeworICAgICAgICAgICAgY29tcG9uZW50U3RhY2tJbmZvID0gUmVhY3RDb21wb25l bnRUcmVlSG9vay5nZXRDdXJyZW50U3RhY2tBZGRlbmR1bShlbGVtZW50KTsKKyAgICAgICAgICB9 CisgICAgICAgIH0KKworICAgICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3 YXJuaW5nKGZhbHNlLCAnRmFpbGVkICVzIHR5cGU6ICVzJXMnLCBsb2NhdGlvbiwgZXJyb3IubWVz c2FnZSwgY29tcG9uZW50U3RhY2tJbmZvKSA6IHZvaWQgMDsKKyAgICAgIH0KKyAgICB9CisgIH0K K30KKworbW9kdWxlLmV4cG9ydHMgPSBjaGVja1JlYWN0VHlwZVNwZWM7Cit9KS5jYWxsKHRoaXMs dW5kZWZpbmVkKQorfSx7IjExNiI6MTE2LCIxMjIiOjEyMiwiMTQwIjoxNDAsIjE0NyI6MTQ3LCI2 NSI6NjUsIjY2Ijo2Nn1dLDk4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8q KgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdo dHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0 aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhl IHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQK KyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4g dGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisvKiBnbG9iYWxzIE1TQXBwICovCisKKyd1 c2Ugc3RyaWN0JzsKKworLyoqCisgKiBDcmVhdGUgYSBmdW5jdGlvbiB3aGljaCBoYXMgJ3Vuc2Fm ZScgcHJpdmlsZWdlcyAocmVxdWlyZWQgYnkgd2luZG93czggYXBwcykKKyAqLworCit2YXIgY3Jl YXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbiA9IGZ1bmN0aW9uIChmdW5jKSB7CisgIGlm ICh0eXBlb2YgTVNBcHAgIT09ICd1bmRlZmluZWQnICYmIE1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1 bmN0aW9uKSB7CisgICAgcmV0dXJuIGZ1bmN0aW9uIChhcmcwLCBhcmcxLCBhcmcyLCBhcmczKSB7 CisgICAgICBNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbihmdW5jdGlvbiAoKSB7CisgICAg ICAgIHJldHVybiBmdW5jKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOworICAgICAgfSk7CisgICAg fTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZnVuYzsKKyAgfQorfTsKKworbW9kdWxlLmV4cG9y dHMgPSBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uOworfSx7fV0sOTk6W2Z1bmN0 aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVz ZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlz IHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3Vu ZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBz b3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4g YmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgor ICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIENTU1Byb3BlcnR5ID0gX2RlcmVxXyg0KTsKK3Zh ciB3YXJuaW5nID0gX2RlcmVxXygxNDcpOworCit2YXIgaXNVbml0bGVzc051bWJlciA9IENTU1By b3BlcnR5LmlzVW5pdGxlc3NOdW1iZXI7Cit2YXIgc3R5bGVXYXJuaW5ncyA9IHt9OworCisvKioK KyAqIENvbnZlcnQgYSB2YWx1ZSBpbnRvIHRoZSBwcm9wZXIgY3NzIHdyaXRhYmxlIHZhbHVlLiBU aGUgc3R5bGUgbmFtZSBgbmFtZWAKKyAqIHNob3VsZCBiZSBsb2dpY2FsIChubyBoeXBoZW5zKSwg YXMgc3BlY2lmaWVkCisgKiBpbiBgQ1NTUHJvcGVydHkuaXNVbml0bGVzc051bWJlcmAuCisgKgor ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgQ1NTIHByb3BlcnR5IG5hbWUgc3VjaCBhcyBgdG9wTWFy Z2luYC4KKyAqIEBwYXJhbSB7Kn0gdmFsdWUgQ1NTIHByb3BlcnR5IHZhbHVlIHN1Y2ggYXMgYDEw cHhgLgorICogQHBhcmFtIHtSZWFjdERPTUNvbXBvbmVudH0gY29tcG9uZW50CisgKiBAcmV0dXJu IHtzdHJpbmd9IE5vcm1hbGl6ZWQgc3R5bGUgdmFsdWUgd2l0aCBkaW1lbnNpb25zIGFwcGxpZWQu CisgKi8KK2Z1bmN0aW9uIGRhbmdlcm91c1N0eWxlVmFsdWUobmFtZSwgdmFsdWUsIGNvbXBvbmVu dCkgeworICAvLyBOb3RlIHRoYXQgd2UndmUgcmVtb3ZlZCBlc2NhcGVUZXh0Rm9yQnJvd3Nlcigp IGNhbGxzIGhlcmUgc2luY2UgdGhlCisgIC8vIHdob2xlIHN0cmluZyB3aWxsIGJlIGVzY2FwZWQg d2hlbiB0aGUgYXR0cmlidXRlIGlzIGluamVjdGVkIGludG8KKyAgLy8gdGhlIG1hcmt1cC4gSWYg eW91IHByb3ZpZGUgdW5zYWZlIHVzZXIgZGF0YSBoZXJlIHRoZXkgY2FuIGluamVjdAorICAvLyBh cmJpdHJhcnkgQ1NTIHdoaWNoIG1heSBiZSBwcm9ibGVtYXRpYyAoSSBjb3VsZG4ndCByZXBybyB0 aGlzKToKKyAgLy8gaHR0cHM6Ly93d3cub3dhc3Aub3JnL2luZGV4LnBocC9YU1NfRmlsdGVyX0V2 YXNpb25fQ2hlYXRfU2hlZXQKKyAgLy8gaHR0cDovL3d3dy50aGVzcGFubmVyLmNvLnVrLzIwMDcv MTEvMjYvdWx0aW1hdGUteHNzLWNzcy1pbmplY3Rpb24vCisgIC8vIFRoaXMgaXMgbm90IGFuIFhT UyBob2xlIGJ1dCBpbnN0ZWFkIGEgcG90ZW50aWFsIENTUyBpbmplY3Rpb24gaXNzdWUKKyAgLy8g d2hpY2ggaGFzIGxlYWQgdG8gYSBncmVhdGVyIGRpc2N1c3Npb24gYWJvdXQgaG93IHdlJ3JlIGdv aW5nIHRvCisgIC8vIHRydXN0IFVSTHMgbW92aW5nIGZvcndhcmQuIFNlZSAjMjExNTkwMQorCisg IHZhciBpc0VtcHR5ID0gdmFsdWUgPT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFu JyB8fCB2YWx1ZSA9PT0gJyc7CisgIGlmIChpc0VtcHR5KSB7CisgICAgcmV0dXJuICcnOworICB9 CisKKyAgdmFyIGlzTm9uTnVtZXJpYyA9IGlzTmFOKHZhbHVlKTsKKyAgaWYgKGlzTm9uTnVtZXJp YyB8fCB2YWx1ZSA9PT0gMCB8fCBpc1VuaXRsZXNzTnVtYmVyLmhhc093blByb3BlcnR5KG5hbWUp ICYmIGlzVW5pdGxlc3NOdW1iZXJbbmFtZV0pIHsKKyAgICByZXR1cm4gJycgKyB2YWx1ZTsgLy8g Y2FzdCB0byBzdHJpbmcKKyAgfQorCisgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7 CisgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgLy8gQWxs b3cgJzAnIHRvIHBhc3MgdGhyb3VnaCB3aXRob3V0IHdhcm5pbmcuIDAgaXMgYWxyZWFkeSBzcGVj aWFsIGFuZAorICAgICAgLy8gZG9lc24ndCByZXF1aXJlIHVuaXRzLCBzbyB3ZSBkb24ndCBuZWVk IHRvIHdhcm4gYWJvdXQgaXQuCisgICAgICBpZiAoY29tcG9uZW50ICYmIHZhbHVlICE9PSAnMCcp IHsKKyAgICAgICAgdmFyIG93bmVyID0gY29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC5fb3duZXI7 CisgICAgICAgIHZhciBvd25lck5hbWUgPSBvd25lciA/IG93bmVyLmdldE5hbWUoKSA6IG51bGw7 CisgICAgICAgIGlmIChvd25lck5hbWUgJiYgIXN0eWxlV2FybmluZ3Nbb3duZXJOYW1lXSkgewor ICAgICAgICAgIHN0eWxlV2FybmluZ3Nbb3duZXJOYW1lXSA9IHt9OworICAgICAgICB9CisgICAg ICAgIHZhciB3YXJuZWQgPSBmYWxzZTsKKyAgICAgICAgaWYgKG93bmVyTmFtZSkgeworICAgICAg ICAgIHZhciB3YXJuaW5ncyA9IHN0eWxlV2FybmluZ3Nbb3duZXJOYW1lXTsKKyAgICAgICAgICB3 YXJuZWQgPSB3YXJuaW5nc1tuYW1lXTsKKyAgICAgICAgICBpZiAoIXdhcm5lZCkgeworICAgICAg ICAgICAgd2FybmluZ3NbbmFtZV0gPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAg ICAgICBpZiAoIXdhcm5lZCkgeworICAgICAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0 aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdhIGAlc2AgdGFnIChvd25lcjogYCVzYCkgd2FzIHBhc3Nl ZCBhIG51bWVyaWMgc3RyaW5nIHZhbHVlICcgKyAnZm9yIENTUyBwcm9wZXJ0eSBgJXNgICh2YWx1 ZTogYCVzYCkgd2hpY2ggd2lsbCBiZSB0cmVhdGVkICcgKyAnYXMgYSB1bml0bGVzcyBudW1iZXIg aW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBSZWFjdC4nLCBjb21wb25lbnQuX2N1cnJlbnRFbGVtZW50 LnR5cGUsIG93bmVyTmFtZSB8fCAndW5rbm93bicsIG5hbWUsIHZhbHVlKSA6IHZvaWQgMDsKKyAg ICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTsKKyAgfQor ICByZXR1cm4gdmFsdWUgKyAncHgnOworfQorCittb2R1bGUuZXhwb3J0cyA9IGRhbmdlcm91c1N0 eWxlVmFsdWU7Cit9LHsiMTQ3IjoxNDcsIjQiOjR9XSwxMDA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9k dWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxNi1wcmVzZW50LCBGYWNlYm9vaywg SW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlz IGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJ Q0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4g YWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhl IFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogQmFzZWQgb24gdGhl IGVzY2FwZS1odG1sIGxpYnJhcnksIHdoaWNoIGlzIHVzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNl IGJlbG93OgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDEzIFRKIEhvbG93YXljaHVrCisg KiBDb3B5cmlnaHQgKGMpIDIwMTUgQW5kcmVhcyBMdWJiZQorICogQ29weXJpZ2h0IChjKSAyMDE1 IFRpYW5jaGVuZyAiVGltb3RoeSIgR3UKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFu dGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBv ZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQor ICogJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rp b24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBj b3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwg YW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVy c29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3Qg dG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJp Z2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVk ZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUu CisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFO VFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9U IExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5P IEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBG T1IgQU5ZCisgKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g QU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJP TSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBV U0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisndXNlIHN0 cmljdCc7CisKKy8vIGNvZGUgY29waWVkIGFuZCBtb2RpZmllZCBmcm9tIGVzY2FwZS1odG1sCisv KioKKyAqIE1vZHVsZSB2YXJpYWJsZXMuCisgKiBAcHJpdmF0ZQorICovCisKK3ZhciBtYXRjaEh0 bWxSZWdFeHAgPSAvWyInJjw+XS87CisKKy8qKgorICogRXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVy cyBpbiB0aGUgZ2l2ZW4gc3RyaW5nIG9mIGh0bWwuCisgKgorICogQHBhcmFtICB7c3RyaW5nfSBz dHJpbmcgVGhlIHN0cmluZyB0byBlc2NhcGUgZm9yIGluc2VydGluZyBpbnRvIEhUTUwKKyAqIEBy ZXR1cm4ge3N0cmluZ30KKyAqIEBwdWJsaWMKKyAqLworCitmdW5jdGlvbiBlc2NhcGVIdG1sKHN0 cmluZykgeworICB2YXIgc3RyID0gJycgKyBzdHJpbmc7CisgIHZhciBtYXRjaCA9IG1hdGNoSHRt bFJlZ0V4cC5leGVjKHN0cik7CisKKyAgaWYgKCFtYXRjaCkgeworICAgIHJldHVybiBzdHI7Cisg IH0KKworICB2YXIgZXNjYXBlOworICB2YXIgaHRtbCA9ICcnOworICB2YXIgaW5kZXggPSAwOwor ICB2YXIgbGFzdEluZGV4ID0gMDsKKworICBmb3IgKGluZGV4ID0gbWF0Y2guaW5kZXg7IGluZGV4 IDwgc3RyLmxlbmd0aDsgaW5kZXgrKykgeworICAgIHN3aXRjaCAoc3RyLmNoYXJDb2RlQXQoaW5k ZXgpKSB7CisgICAgICBjYXNlIDM0OgorICAgICAgICAvLyAiCisgICAgICAgIGVzY2FwZSA9ICcm cXVvdDsnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzg6CisgICAgICAgIC8vICYKKyAg ICAgICAgZXNjYXBlID0gJyZhbXA7JzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDM5Ogor ICAgICAgICAvLyAnCisgICAgICAgIGVzY2FwZSA9ICcmI3gyNzsnOyAvLyBtb2RpZmllZCBmcm9t IGVzY2FwZS1odG1sOyB1c2VkIHRvIGJlICcmIzM5JworICAgICAgICBicmVhazsKKyAgICAgIGNh c2UgNjA6CisgICAgICAgIC8vIDwKKyAgICAgICAgZXNjYXBlID0gJyZsdDsnOworICAgICAgICBi cmVhazsKKyAgICAgIGNhc2UgNjI6CisgICAgICAgIC8vID4KKyAgICAgICAgZXNjYXBlID0gJyZn dDsnOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNvbnRpbnVlOwor ICAgIH0KKworICAgIGlmIChsYXN0SW5kZXggIT09IGluZGV4KSB7CisgICAgICBodG1sICs9IHN0 ci5zdWJzdHJpbmcobGFzdEluZGV4LCBpbmRleCk7CisgICAgfQorCisgICAgbGFzdEluZGV4ID0g aW5kZXggKyAxOworICAgIGh0bWwgKz0gZXNjYXBlOworICB9CisKKyAgcmV0dXJuIGxhc3RJbmRl eCAhPT0gaW5kZXggPyBodG1sICsgc3RyLnN1YnN0cmluZyhsYXN0SW5kZXgsIGluZGV4KSA6IGh0 bWw7Cit9CisvLyBlbmQgY29kZSBjb3BpZWQgYW5kIG1vZGlmaWVkIGZyb20gZXNjYXBlLWh0bWwK KworCisvKioKKyAqIEVzY2FwZXMgdGV4dCB0byBwcmV2ZW50IHNjcmlwdGluZyBhdHRhY2tzLgor ICoKKyAqIEBwYXJhbSB7Kn0gdGV4dCBUZXh0IHZhbHVlIHRvIGVzY2FwZS4KKyAqIEByZXR1cm4g e3N0cmluZ30gQW4gZXNjYXBlZCBzdHJpbmcuCisgKi8KK2Z1bmN0aW9uIGVzY2FwZVRleHRDb250 ZW50Rm9yQnJvd3Nlcih0ZXh0KSB7CisgIGlmICh0eXBlb2YgdGV4dCA9PT0gJ2Jvb2xlYW4nIHx8 IHR5cGVvZiB0ZXh0ID09PSAnbnVtYmVyJykgeworICAgIC8vIHRoaXMgc2hvcnRjaXJjdWl0IGhl bHBzIHBlcmYgZm9yIHR5cGVzIHRoYXQgd2Uga25vdyB3aWxsIG5ldmVyIGhhdmUKKyAgICAvLyBz cGVjaWFsIGNoYXJhY3RlcnMsIGVzcGVjaWFsbHkgZ2l2ZW4gdGhhdCB0aGlzIGZ1bmN0aW9uIGlz IHVzZWQgb2Z0ZW4KKyAgICAvLyBmb3IgbnVtZXJpYyBkb20gaWRzLgorICAgIHJldHVybiAnJyAr IHRleHQ7CisgIH0KKyAgcmV0dXJuIGVzY2FwZUh0bWwodGV4dCk7Cit9CisKK21vZHVsZS5leHBv cnRzID0gZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyOworfSx7fV0sMTAxOltmdW5jdGlvbihf ZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKyhmdW5jdGlvbiAocHJvY2Vzcyl7CisvKioKKyAqIENv cHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2Vy dmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1z dHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRp cmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBw YXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1l IGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBLZXlFc2Nh cGVVdGlscyA9IF9kZXJlcV8oMjIpOwordmFyIHRyYXZlcnNlQWxsQ2hpbGRyZW4gPSBfZGVyZXFf KDEyMCk7Cit2YXIgd2FybmluZyA9IF9kZXJlcV8oMTQ3KTsKKwordmFyIFJlYWN0Q29tcG9uZW50 VHJlZUhvb2s7CisKK2lmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vz cy5lbnYgJiYgImRldmVsb3BtZW50IiA9PT0gJ3Rlc3QnKSB7CisgIC8vIFRlbXBvcmFyeSBoYWNr LgorICAvLyBJbmxpbmUgcmVxdWlyZXMgZG9uJ3Qgd29yayB3ZWxsIHdpdGggSmVzdDoKKyAgLy8g aHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy83MjQwCisgIC8vIFJlbW92 ZSB0aGUgaW5saW5lIHJlcXVpcmVzIHdoZW4gd2UgZG9uJ3QgbmVlZCB0aGVtIGFueW1vcmU6Cisg IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzcxNzgKKyAgUmVhY3RD b21wb25lbnRUcmVlSG9vayA9IF9kZXJlcV8oMTIyKTsKK30KKworLyoqCisgKiBAcGFyYW0ge2Z1 bmN0aW9ufSB0cmF2ZXJzZUNvbnRleHQgQ29udGV4dCBwYXNzZWQgdGhyb3VnaCB0cmF2ZXJzYWwu CisgKiBAcGFyYW0gez9SZWFjdENvbXBvbmVudH0gY2hpbGQgUmVhY3QgY2hpbGQgY29tcG9uZW50 LgorICogQHBhcmFtIHshc3RyaW5nfSBuYW1lIFN0cmluZyBuYW1lIG9mIGtleSBwYXRoIHRvIGNo aWxkLgorICogQHBhcmFtIHtudW1iZXI9fSBzZWxmRGVidWdJRCBPcHRpb25hbCBkZWJ1Z0lEIG9m IHRoZSBjdXJyZW50IGludGVybmFsIGluc3RhbmNlLgorICovCitmdW5jdGlvbiBmbGF0dGVuU2lu Z2xlQ2hpbGRJbnRvQ29udGV4dCh0cmF2ZXJzZUNvbnRleHQsIGNoaWxkLCBuYW1lLCBzZWxmRGVi dWdJRCkgeworICAvLyBXZSBmb3VuZCBhIGNvbXBvbmVudCBpbnN0YW5jZS4KKyAgaWYgKHRyYXZl cnNlQ29udGV4dCAmJiB0eXBlb2YgdHJhdmVyc2VDb250ZXh0ID09PSAnb2JqZWN0JykgeworICAg IHZhciByZXN1bHQgPSB0cmF2ZXJzZUNvbnRleHQ7CisgICAgdmFyIGtleVVuaXF1ZSA9IHJlc3Vs dFtuYW1lXSA9PT0gdW5kZWZpbmVkOworICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVj dGlvbicpIHsKKyAgICAgIGlmICghUmVhY3RDb21wb25lbnRUcmVlSG9vaykgeworICAgICAgICBS ZWFjdENvbXBvbmVudFRyZWVIb29rID0gX2RlcmVxXygxMjIpOworICAgICAgfQorICAgICAgaWYg KCFrZXlVbmlxdWUpIHsKKyAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8g d2FybmluZyhmYWxzZSwgJ2ZsYXR0ZW5DaGlsZHJlbiguLi4pOiBFbmNvdW50ZXJlZCB0d28gY2hp bGRyZW4gd2l0aCB0aGUgc2FtZSBrZXksICcgKyAnYCVzYC4gQ2hpbGQga2V5cyBtdXN0IGJlIHVu aXF1ZTsgd2hlbiB0d28gY2hpbGRyZW4gc2hhcmUgYSBrZXksIG9ubHkgJyArICd0aGUgZmlyc3Qg Y2hpbGQgd2lsbCBiZSB1c2VkLiVzJywgS2V5RXNjYXBlVXRpbHMudW5lc2NhcGUobmFtZSksIFJl YWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0U3RhY2tBZGRlbmR1bUJ5SUQoc2VsZkRlYnVnSUQpKSA6 IHZvaWQgMDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGtleVVuaXF1ZSAmJiBjaGlsZCAhPSBu dWxsKSB7CisgICAgICByZXN1bHRbbmFtZV0gPSBjaGlsZDsKKyAgICB9CisgIH0KK30KKworLyoq CisgKiBGbGF0dGVucyBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBw cm9wcy5jaGlsZHJlbmAuIEFueSBudWxsCisgKiBjaGlsZHJlbiB3aWxsIG5vdCBiZSBpbmNsdWRl ZCBpbiB0aGUgcmVzdWx0aW5nIG9iamVjdC4KKyAqIEByZXR1cm4geyFvYmplY3R9IGZsYXR0ZW5l ZCBjaGlsZHJlbiBrZXllZCBieSBuYW1lLgorICovCitmdW5jdGlvbiBmbGF0dGVuQ2hpbGRyZW4o Y2hpbGRyZW4sIHNlbGZEZWJ1Z0lEKSB7CisgIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7CisgICAg cmV0dXJuIGNoaWxkcmVuOworICB9CisgIHZhciByZXN1bHQgPSB7fTsKKworICBpZiAoImRldmVs b3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgdHJhdmVyc2VBbGxDaGlsZHJlbihjaGls ZHJlbiwgZnVuY3Rpb24gKHRyYXZlcnNlQ29udGV4dCwgY2hpbGQsIG5hbWUpIHsKKyAgICAgIHJl dHVybiBmbGF0dGVuU2luZ2xlQ2hpbGRJbnRvQ29udGV4dCh0cmF2ZXJzZUNvbnRleHQsIGNoaWxk LCBuYW1lLCBzZWxmRGVidWdJRCk7CisgICAgfSwgcmVzdWx0KTsKKyAgfSBlbHNlIHsKKyAgICB0 cmF2ZXJzZUFsbENoaWxkcmVuKGNoaWxkcmVuLCBmbGF0dGVuU2luZ2xlQ2hpbGRJbnRvQ29udGV4 dCwgcmVzdWx0KTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCittb2R1bGUuZXhwb3J0cyA9 IGZsYXR0ZW5DaGlsZHJlbjsKK30pLmNhbGwodGhpcyx1bmRlZmluZWQpCit9LHsiMTIwIjoxMjAs IjEyMiI6MTIyLCIxNDciOjE0NywiMjIiOjIyfV0sMTAyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVs ZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIElu Yy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBs aWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNF TlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFk ZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQ QVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ug c3RyaWN0JzsKKworLyoqCisgKiBAcGFyYW0ge2FycmF5fSBhcnIgYW4gImFjY3VtdWxhdGlvbiIg b2YgaXRlbXMgd2hpY2ggaXMgZWl0aGVyIGFuIEFycmF5IG9yCisgKiBhIHNpbmdsZSBpdGVtLiBV c2VmdWwgd2hlbiBwYWlyZWQgd2l0aCB0aGUgYGFjY3VtdWxhdGVgIG1vZHVsZS4gVGhpcyBpcyBh CisgKiBzaW1wbGUgdXRpbGl0eSB0aGF0IGFsbG93cyB1cyB0byByZWFzb24gYWJvdXQgYSBjb2xs ZWN0aW9uIG9mIGl0ZW1zLCBidXQKKyAqIGhhbmRsaW5nIHRoZSBjYXNlIHdoZW4gdGhlcmUgaXMg ZXhhY3RseSBvbmUgaXRlbSAoYW5kIHdlIGRvIG5vdCBuZWVkIHRvCisgKiBhbGxvY2F0ZSBhbiBh cnJheSkuCisgKi8KKworZnVuY3Rpb24gZm9yRWFjaEFjY3VtdWxhdGVkKGFyciwgY2IsIHNjb3Bl KSB7CisgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHsKKyAgICBhcnIuZm9yRWFjaChjYiwgc2Nv cGUpOworICB9IGVsc2UgaWYgKGFycikgeworICAgIGNiLmNhbGwoc2NvcGUsIGFycik7CisgIH0K K30KKworbW9kdWxlLmV4cG9ydHMgPSBmb3JFYWNoQWNjdW11bGF0ZWQ7Cit9LHt9XSwxMDM6W2Z1 bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1w cmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBU aGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBm b3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhp cyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBj YW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisg KgorICovCisKKyd1c2Ugc3RyaWN0JzsKKworLyoqCisgKiBgY2hhckNvZGVgIHJlcHJlc2VudHMg dGhlIGFjdHVhbCAiY2hhcmFjdGVyIGNvZGUiIGFuZCBpcyBzYWZlIHRvIHVzZSB3aXRoCisgKiBg U3RyaW5nLmZyb21DaGFyQ29kZWAuIEFzIHN1Y2gsIG9ubHkga2V5cyB0aGF0IGNvcnJlc3BvbmQg dG8gcHJpbnRhYmxlCisgKiBjaGFyYWN0ZXJzIHByb2R1Y2UgYSB2YWxpZCBgY2hhckNvZGVgLCB0 aGUgb25seSBleGNlcHRpb24gdG8gdGhpcyBpcyBFbnRlci4KKyAqIFRoZSBUYWIta2V5IGlzIGNv bnNpZGVyZWQgbm9uLXByaW50YWJsZSBhbmQgZG9lcyBub3QgaGF2ZSBhIGBjaGFyQ29kZWAsCisg KiBwcmVzdW1hYmx5IGJlY2F1c2UgaXQgZG9lcyBub3QgcHJvZHVjZSBhIHRhYi1jaGFyYWN0ZXIg aW4gYnJvd3NlcnMuCisgKgorICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBi cm93c2VyIGV2ZW50LgorICogQHJldHVybiB7bnVtYmVyfSBOb3JtYWxpemVkIGBjaGFyQ29kZWAg cHJvcGVydHkuCisgKi8KKworZnVuY3Rpb24gZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCkg eworICB2YXIgY2hhckNvZGU7CisgIHZhciBrZXlDb2RlID0gbmF0aXZlRXZlbnQua2V5Q29kZTsK KworICBpZiAoJ2NoYXJDb2RlJyBpbiBuYXRpdmVFdmVudCkgeworICAgIGNoYXJDb2RlID0gbmF0 aXZlRXZlbnQuY2hhckNvZGU7CisKKyAgICAvLyBGRiBkb2VzIG5vdCBzZXQgYGNoYXJDb2RlYCBm b3IgdGhlIEVudGVyLWtleSwgY2hlY2sgYWdhaW5zdCBga2V5Q29kZWAuCisgICAgaWYgKGNoYXJD b2RlID09PSAwICYmIGtleUNvZGUgPT09IDEzKSB7CisgICAgICBjaGFyQ29kZSA9IDEzOworICAg IH0KKyAgfSBlbHNlIHsKKyAgICAvLyBJRTggZG9lcyBub3QgaW1wbGVtZW50IGBjaGFyQ29kZWAs IGJ1dCBga2V5Q29kZWAgaGFzIHRoZSBjb3JyZWN0IHZhbHVlLgorICAgIGNoYXJDb2RlID0ga2V5 Q29kZTsKKyAgfQorCisgIC8vIFNvbWUgbm9uLXByaW50YWJsZSBrZXlzIGFyZSByZXBvcnRlZCBp biBgY2hhckNvZGVgL2BrZXlDb2RlYCwgZGlzY2FyZCB0aGVtLgorICAvLyBNdXN0IG5vdCBkaXNj YXJkIHRoZSAobm9uLSlwcmludGFibGUgRW50ZXIta2V5LgorICBpZiAoY2hhckNvZGUgPj0gMzIg fHwgY2hhckNvZGUgPT09IDEzKSB7CisgICAgcmV0dXJuIGNoYXJDb2RlOworICB9CisKKyAgcmV0 dXJuIDA7Cit9CisKK21vZHVsZS5leHBvcnRzID0gZ2V0RXZlbnRDaGFyQ29kZTsKK30se31dLDEw NDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAy MDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK KyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNl bnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBv ZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmln aHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9y eS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgZ2V0RXZlbnRDaGFyQ29kZSA9IF9k ZXJlcV8oMTAzKTsKKworLyoqCisgKiBOb3JtYWxpemF0aW9uIG9mIGRlcHJlY2F0ZWQgSFRNTDUg YGtleWAgdmFsdWVzCisgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVT L2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50I0tleV9uYW1lcworICovCit2YXIgbm9ybWFsaXpl S2V5ID0geworICAnRXNjJzogJ0VzY2FwZScsCisgICdTcGFjZWJhcic6ICcgJywKKyAgJ0xlZnQn OiAnQXJyb3dMZWZ0JywKKyAgJ1VwJzogJ0Fycm93VXAnLAorICAnUmlnaHQnOiAnQXJyb3dSaWdo dCcsCisgICdEb3duJzogJ0Fycm93RG93bicsCisgICdEZWwnOiAnRGVsZXRlJywKKyAgJ1dpbic6 ICdPUycsCisgICdNZW51JzogJ0NvbnRleHRNZW51JywKKyAgJ0FwcHMnOiAnQ29udGV4dE1lbnUn LAorICAnU2Nyb2xsJzogJ1Njcm9sbExvY2snLAorICAnTW96UHJpbnRhYmxlS2V5JzogJ1VuaWRl bnRpZmllZCcKK307CisKKy8qKgorICogVHJhbnNsYXRpb24gZnJvbSBsZWdhY3kgYGtleUNvZGVg IHRvIEhUTUw1IGBrZXlgCisgKiBPbmx5IHNwZWNpYWwga2V5cyBzdXBwb3J0ZWQsIGFsbCBvdGhl cnMgZGVwZW5kIG9uIGtleWJvYXJkIGxheW91dCBvciBicm93c2VyCisgKiBAc2VlIGh0dHBzOi8v ZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50I0tl eV9uYW1lcworICovCit2YXIgdHJhbnNsYXRlVG9LZXkgPSB7CisgIDg6ICdCYWNrc3BhY2UnLAor ICA5OiAnVGFiJywKKyAgMTI6ICdDbGVhcicsCisgIDEzOiAnRW50ZXInLAorICAxNjogJ1NoaWZ0 JywKKyAgMTc6ICdDb250cm9sJywKKyAgMTg6ICdBbHQnLAorICAxOTogJ1BhdXNlJywKKyAgMjA6 ICdDYXBzTG9jaycsCisgIDI3OiAnRXNjYXBlJywKKyAgMzI6ICcgJywKKyAgMzM6ICdQYWdlVXAn LAorICAzNDogJ1BhZ2VEb3duJywKKyAgMzU6ICdFbmQnLAorICAzNjogJ0hvbWUnLAorICAzNzog J0Fycm93TGVmdCcsCisgIDM4OiAnQXJyb3dVcCcsCisgIDM5OiAnQXJyb3dSaWdodCcsCisgIDQw OiAnQXJyb3dEb3duJywKKyAgNDU6ICdJbnNlcnQnLAorICA0NjogJ0RlbGV0ZScsCisgIDExMjog J0YxJywgMTEzOiAnRjInLCAxMTQ6ICdGMycsIDExNTogJ0Y0JywgMTE2OiAnRjUnLCAxMTc6ICdG NicsCisgIDExODogJ0Y3JywgMTE5OiAnRjgnLCAxMjA6ICdGOScsIDEyMTogJ0YxMCcsIDEyMjog J0YxMScsIDEyMzogJ0YxMicsCisgIDE0NDogJ051bUxvY2snLAorICAxNDU6ICdTY3JvbGxMb2Nr JywKKyAgMjI0OiAnTWV0YScKK307CisKKy8qKgorICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2 ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LgorICogQHJldHVybiB7c3RyaW5nfSBOb3JtYWxpemVk IGBrZXlgIHByb3BlcnR5LgorICovCitmdW5jdGlvbiBnZXRFdmVudEtleShuYXRpdmVFdmVudCkg eworICBpZiAobmF0aXZlRXZlbnQua2V5KSB7CisgICAgLy8gTm9ybWFsaXplIGluY29uc2lzdGVu dCB2YWx1ZXMgcmVwb3J0ZWQgYnkgYnJvd3NlcnMgZHVlIHRvCisgICAgLy8gaW1wbGVtZW50YXRp b25zIG9mIGEgd29ya2luZyBkcmFmdCBzcGVjaWZpY2F0aW9uLgorCisgICAgLy8gRmlyZUZveCBp bXBsZW1lbnRzIGBrZXlgIGJ1dCByZXR1cm5zIGBNb3pQcmludGFibGVLZXlgIGZvciBhbGwKKyAg ICAvLyBwcmludGFibGUgY2hhcmFjdGVycyAobm9ybWFsaXplZCB0byBgVW5pZGVudGlmaWVkYCks IGlnbm9yZSBpdC4KKyAgICB2YXIga2V5ID0gbm9ybWFsaXplS2V5W25hdGl2ZUV2ZW50LmtleV0g fHwgbmF0aXZlRXZlbnQua2V5OworICAgIGlmIChrZXkgIT09ICdVbmlkZW50aWZpZWQnKSB7Cisg ICAgICByZXR1cm4ga2V5OworICAgIH0KKyAgfQorCisgIC8vIEJyb3dzZXIgZG9lcyBub3QgaW1w bGVtZW50IGBrZXlgLCBwb2x5ZmlsbCBhcyBtdWNoIG9mIGl0IGFzIHdlIGNhbi4KKyAgaWYgKG5h dGl2ZUV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHsKKyAgICB2YXIgY2hhckNvZGUgPSBnZXRF dmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KTsKKworICAgIC8vIFRoZSBlbnRlci1rZXkgaXMgdGVj aG5pY2FsbHkgYm90aCBwcmludGFibGUgYW5kIG5vbi1wcmludGFibGUgYW5kIGNhbgorICAgIC8v IHRodXMgYmUgY2FwdHVyZWQgYnkgYGtleXByZXNzYCwgbm8gb3RoZXIgbm9uLXByaW50YWJsZSBr ZXkgc2hvdWxkLgorICAgIHJldHVybiBjaGFyQ29kZSA9PT0gMTMgPyAnRW50ZXInIDogU3RyaW5n LmZyb21DaGFyQ29kZShjaGFyQ29kZSk7CisgIH0KKyAgaWYgKG5hdGl2ZUV2ZW50LnR5cGUgPT09 ICdrZXlkb3duJyB8fCBuYXRpdmVFdmVudC50eXBlID09PSAna2V5dXAnKSB7CisgICAgLy8gV2hp bGUgdXNlciBrZXlib2FyZCBsYXlvdXQgZGV0ZXJtaW5lcyB0aGUgYWN0dWFsIG1lYW5pbmcgb2Yg ZWFjaAorICAgIC8vIGBrZXlDb2RlYCB2YWx1ZSwgYWxtb3N0IGFsbCBmdW5jdGlvbiBrZXlzIGhh dmUgYSB1bml2ZXJzYWwgdmFsdWUuCisgICAgcmV0dXJuIHRyYW5zbGF0ZVRvS2V5W25hdGl2ZUV2 ZW50LmtleUNvZGVdIHx8ICdVbmlkZW50aWZpZWQnOworICB9CisgIHJldHVybiAnJzsKK30KKwor bW9kdWxlLmV4cG9ydHMgPSBnZXRFdmVudEtleTsKK30seyIxMDMiOjEwM31dLDEwNTpbZnVuY3Rp b24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNl bnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMg c291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5k IGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNv dXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBi ZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisg Ki8KKworJ3VzZSBzdHJpY3QnOworCisvKioKKyAqIFRyYW5zbGF0aW9uIGZyb20gbW9kaWZpZXIg a2V5IHRvIHRoZSBhc3NvY2lhdGVkIHByb3BlcnR5IGluIHRoZSBldmVudC4KKyAqIEBzZWUgaHR0 cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNrZXlzLU1vZGlmaWVycworICov CisKK3ZhciBtb2RpZmllcktleVRvUHJvcCA9IHsKKyAgJ0FsdCc6ICdhbHRLZXknLAorICAnQ29u dHJvbCc6ICdjdHJsS2V5JywKKyAgJ01ldGEnOiAnbWV0YUtleScsCisgICdTaGlmdCc6ICdzaGlm dEtleScKK307CisKKy8vIElFOCBkb2VzIG5vdCBpbXBsZW1lbnQgZ2V0TW9kaWZpZXJTdGF0ZSBz byB3ZSBzaW1wbHkgbWFwIGl0IHRvIHRoZSBvbmx5CisvLyBtb2RpZmllciBrZXlzIGV4cG9zZWQg YnkgdGhlIGV2ZW50IGl0c2VsZiwgZG9lcyBub3Qgc3VwcG9ydCBMb2NrLWtleXMuCisvLyBDdXJy ZW50bHksIGFsbCBtYWpvciBicm93c2VycyBleGNlcHQgQ2hyb21lIHNlZW1zIHRvIHN1cHBvcnQg TG9jay1rZXlzLgorZnVuY3Rpb24gbW9kaWZpZXJTdGF0ZUdldHRlcihrZXlBcmcpIHsKKyAgdmFy IHN5bnRoZXRpY0V2ZW50ID0gdGhpczsKKyAgdmFyIG5hdGl2ZUV2ZW50ID0gc3ludGhldGljRXZl bnQubmF0aXZlRXZlbnQ7CisgIGlmIChuYXRpdmVFdmVudC5nZXRNb2RpZmllclN0YXRlKSB7Cisg ICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmdldE1vZGlmaWVyU3RhdGUoa2V5QXJnKTsKKyAgfQorICB2 YXIga2V5UHJvcCA9IG1vZGlmaWVyS2V5VG9Qcm9wW2tleUFyZ107CisgIHJldHVybiBrZXlQcm9w ID8gISFuYXRpdmVFdmVudFtrZXlQcm9wXSA6IGZhbHNlOworfQorCitmdW5jdGlvbiBnZXRFdmVu dE1vZGlmaWVyU3RhdGUobmF0aXZlRXZlbnQpIHsKKyAgcmV0dXJuIG1vZGlmaWVyU3RhdGVHZXR0 ZXI7Cit9CisKK21vZHVsZS5leHBvcnRzID0gZ2V0RXZlbnRNb2RpZmllclN0YXRlOworfSx7fV0s MTA2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0 IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg KgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxp Y2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5 IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCBy aWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0 b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKKy8qKgorICogR2V0cyB0aGUgdGFyZ2V0 IG5vZGUgZnJvbSBhIG5hdGl2ZSBicm93c2VyIGV2ZW50IGJ5IGFjY291bnRpbmcgZm9yCisgKiBp bmNvbnNpc3RlbmNpZXMgaW4gYnJvd3NlciBET00gQVBJcy4KKyAqCisgKiBAcGFyYW0ge29iamVj dH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuCisgKiBAcmV0dXJuIHtET01FdmVu dFRhcmdldH0gVGFyZ2V0IG5vZGUuCisgKi8KKworZnVuY3Rpb24gZ2V0RXZlbnRUYXJnZXQobmF0 aXZlRXZlbnQpIHsKKyAgdmFyIHRhcmdldCA9IG5hdGl2ZUV2ZW50LnRhcmdldCB8fCBuYXRpdmVF dmVudC5zcmNFbGVtZW50IHx8IHdpbmRvdzsKKworICAvLyBOb3JtYWxpemUgU1ZHIDx1c2U+IGVs ZW1lbnQgZXZlbnRzICM0OTYzCisgIGlmICh0YXJnZXQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQp IHsKKyAgICB0YXJnZXQgPSB0YXJnZXQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQ7CisgIH0KKwor ICAvLyBTYWZhcmkgbWF5IGZpcmUgZXZlbnRzIG9uIHRleHQgbm9kZXMgKE5vZGUuVEVYVF9OT0RF IGlzIDMpLgorICAvLyBAc2VlIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzX3By b3BlcnRpZXMuaHRtbAorICByZXR1cm4gdGFyZ2V0Lm5vZGVUeXBlID09PSAzID8gdGFyZ2V0LnBh cmVudE5vZGUgOiB0YXJnZXQ7Cit9CisKK21vZHVsZS5leHBvcnRzID0gZ2V0RXZlbnRUYXJnZXQ7 Cit9LHt9XSwxMDc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBD b3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNl cnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qt c3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBk aXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2Yg cGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2Ft ZSBkaXJlY3RvcnkuCisgKgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOworCisvKiBnbG9iYWwg U3ltYm9sICovCisKK3ZhciBJVEVSQVRPUl9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVu Y3Rpb24nICYmIFN5bWJvbC5pdGVyYXRvcjsKK3ZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdA QGl0ZXJhdG9yJzsgLy8gQmVmb3JlIFN5bWJvbCBzcGVjLgorCisvKioKKyAqIFJldHVybnMgdGhl IGl0ZXJhdG9yIG1ldGhvZCBmdW5jdGlvbiBjb250YWluZWQgb24gdGhlIGl0ZXJhYmxlIG9iamVj dC4KKyAqCisgKiBCZSBzdXJlIHRvIGludm9rZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgaXRlcmFi bGUgYXMgY29udGV4dDoKKyAqCisgKiAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZu KG15SXRlcmFibGUpOworICogICAgIGlmIChpdGVyYXRvckZuKSB7CisgKiAgICAgICB2YXIgaXRl cmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobXlJdGVyYWJsZSk7CisgKiAgICAgICAuLi4KKyAqICAg ICB9CisgKgorICogQHBhcmFtIHs/b2JqZWN0fSBtYXliZUl0ZXJhYmxlCisgKiBAcmV0dXJuIHs/ ZnVuY3Rpb259CisgKi8KK2Z1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkgewor ICB2YXIgaXRlcmF0b3JGbiA9IG1heWJlSXRlcmFibGUgJiYgKElURVJBVE9SX1NZTUJPTCAmJiBt YXliZUl0ZXJhYmxlW0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJB VE9SX1NZTUJPTF0pOworICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHsK KyAgICByZXR1cm4gaXRlcmF0b3JGbjsKKyAgfQorfQorCittb2R1bGUuZXhwb3J0cyA9IGdldEl0 ZXJhdG9yRm47Cit9LHt9XSwxMDg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpewor LyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJp Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVy IHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0 aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFu dAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBp biB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2 YXIgbmV4dERlYnVnSUQgPSAxOworCitmdW5jdGlvbiBnZXROZXh0RGVidWdJRCgpIHsKKyAgcmV0 dXJuIG5leHREZWJ1Z0lEKys7Cit9CisKK21vZHVsZS5leHBvcnRzID0gZ2V0TmV4dERlYnVnSUQ7 Cit9LHt9XSwxMDk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBD b3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNl cnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qt c3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBk aXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2Yg cGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2Ft ZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKworLyoqCisgKiBHaXZlbiBh bnkgbm9kZSByZXR1cm4gdGhlIGZpcnN0IGxlYWYgbm9kZSB3aXRob3V0IGNoaWxkcmVuLgorICoK KyAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZQorICogQHJldHVybiB7RE9N RWxlbWVudHxET01UZXh0Tm9kZX0KKyAqLworCitmdW5jdGlvbiBnZXRMZWFmTm9kZShub2RlKSB7 CisgIHdoaWxlIChub2RlICYmIG5vZGUuZmlyc3RDaGlsZCkgeworICAgIG5vZGUgPSBub2RlLmZp cnN0Q2hpbGQ7CisgIH0KKyAgcmV0dXJuIG5vZGU7Cit9CisKKy8qKgorICogR2V0IHRoZSBuZXh0 IHNpYmxpbmcgd2l0aGluIGEgY29udGFpbmVyLiBUaGlzIHdpbGwgd2FsayB1cCB0aGUKKyAqIERP TSBpZiBhIG5vZGUncyBzaWJsaW5ncyBoYXZlIGJlZW4gZXhoYXVzdGVkLgorICoKKyAqIEBwYXJh bSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZQorICogQHJldHVybiB7P0RPTUVsZW1lbnR8 RE9NVGV4dE5vZGV9CisgKi8KK2Z1bmN0aW9uIGdldFNpYmxpbmdOb2RlKG5vZGUpIHsKKyAgd2hp bGUgKG5vZGUpIHsKKyAgICBpZiAobm9kZS5uZXh0U2libGluZykgeworICAgICAgcmV0dXJuIG5v ZGUubmV4dFNpYmxpbmc7CisgICAgfQorICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7CisgIH0K K30KKworLyoqCisgKiBHZXQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIG5vZGVzIHdoaWNoIGNvbnRh aW4gY2hhcmFjdGVycyBhdCBvZmZzZXQuCisgKgorICogQHBhcmFtIHtET01FbGVtZW50fERPTVRl eHROb2RlfSByb290CisgKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0CisgKiBAcmV0dXJuIHs/b2Jq ZWN0fQorICovCitmdW5jdGlvbiBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KHJvb3QsIG9mZnNl dCkgeworICB2YXIgbm9kZSA9IGdldExlYWZOb2RlKHJvb3QpOworICB2YXIgbm9kZVN0YXJ0ID0g MDsKKyAgdmFyIG5vZGVFbmQgPSAwOworCisgIHdoaWxlIChub2RlKSB7CisgICAgaWYgKG5vZGUu bm9kZVR5cGUgPT09IDMpIHsKKyAgICAgIG5vZGVFbmQgPSBub2RlU3RhcnQgKyBub2RlLnRleHRD b250ZW50Lmxlbmd0aDsKKworICAgICAgaWYgKG5vZGVTdGFydCA8PSBvZmZzZXQgJiYgbm9kZUVu ZCA+PSBvZmZzZXQpIHsKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICBub2RlOiBub2RlLAor ICAgICAgICAgIG9mZnNldDogb2Zmc2V0IC0gbm9kZVN0YXJ0CisgICAgICAgIH07CisgICAgICB9 CisKKyAgICAgIG5vZGVTdGFydCA9IG5vZGVFbmQ7CisgICAgfQorCisgICAgbm9kZSA9IGdldExl YWZOb2RlKGdldFNpYmxpbmdOb2RlKG5vZGUpKTsKKyAgfQorfQorCittb2R1bGUuZXhwb3J0cyA9 IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQ7Cit9LHt9XSwxMTA6W2Z1bmN0aW9uKF9kZXJlcV8s bW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9v aywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2Rl IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAq IExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4g QW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4g dGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ug c3RyaWN0JzsKKwordmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0gX2RlcmVxXygxMjYpOworCit2 YXIgY29udGVudEtleSA9IG51bGw7CisKKy8qKgorICogR2V0cyB0aGUga2V5IHVzZWQgdG8gYWNj ZXNzIHRleHQgY29udGVudCBvbiBhIERPTSBub2RlLgorICoKKyAqIEByZXR1cm4gez9zdHJpbmd9 IEtleSB1c2VkIHRvIGFjY2VzcyB0ZXh0IGNvbnRlbnQuCisgKiBAaW50ZXJuYWwKKyAqLworZnVu Y3Rpb24gZ2V0VGV4dENvbnRlbnRBY2Nlc3NvcigpIHsKKyAgaWYgKCFjb250ZW50S2V5ICYmIEV4 ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSkgeworICAgIC8vIFByZWZlciB0ZXh0Q29udGVu dCB0byBpbm5lclRleHQgYmVjYXVzZSBtYW55IGJyb3dzZXJzIHN1cHBvcnQgYm90aCBidXQKKyAg ICAvLyBTVkcgPHRleHQ+IGVsZW1lbnRzIGRvbid0IHN1cHBvcnQgaW5uZXJUZXh0IGV2ZW4gd2hl biA8ZGl2PiBkb2VzLgorICAgIGNvbnRlbnRLZXkgPSAndGV4dENvbnRlbnQnIGluIGRvY3VtZW50 LmRvY3VtZW50RWxlbWVudCA/ICd0ZXh0Q29udGVudCcgOiAnaW5uZXJUZXh0JzsKKyAgfQorICBy ZXR1cm4gY29udGVudEtleTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBnZXRUZXh0Q29udGVudEFj Y2Vzc29yOworfSx7IjEyNiI6MTI2fV0sMTExOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBv cnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAq IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNl ZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZp bGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9u YWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRT IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisK K3ZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IF9kZXJlcV8oMTI2KTsKKworLyoqCisgKiBHZW5l cmF0ZSBhIG1hcHBpbmcgb2Ygc3RhbmRhcmQgdmVuZG9yIHByZWZpeGVzIHVzaW5nIHRoZSBkZWZp bmVkIHN0eWxlIHByb3BlcnR5IGFuZCBldmVudCBuYW1lLgorICoKKyAqIEBwYXJhbSB7c3RyaW5n fSBzdHlsZVByb3AKKyAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUKKyAqIEByZXR1cm5zIHtv YmplY3R9CisgKi8KK2Z1bmN0aW9uIG1ha2VQcmVmaXhNYXAoc3R5bGVQcm9wLCBldmVudE5hbWUp IHsKKyAgdmFyIHByZWZpeGVzID0ge307CisKKyAgcHJlZml4ZXNbc3R5bGVQcm9wLnRvTG93ZXJD YXNlKCldID0gZXZlbnROYW1lLnRvTG93ZXJDYXNlKCk7CisgIHByZWZpeGVzWydXZWJraXQnICsg c3R5bGVQcm9wXSA9ICd3ZWJraXQnICsgZXZlbnROYW1lOworICBwcmVmaXhlc1snTW96JyArIHN0 eWxlUHJvcF0gPSAnbW96JyArIGV2ZW50TmFtZTsKKyAgcHJlZml4ZXNbJ21zJyArIHN0eWxlUHJv cF0gPSAnTVMnICsgZXZlbnROYW1lOworICBwcmVmaXhlc1snTycgKyBzdHlsZVByb3BdID0gJ28n ICsgZXZlbnROYW1lLnRvTG93ZXJDYXNlKCk7CisKKyAgcmV0dXJuIHByZWZpeGVzOworfQorCisv KioKKyAqIEEgbGlzdCBvZiBldmVudCBuYW1lcyB0byBhIGNvbmZpZ3VyYWJsZSBsaXN0IG9mIHZl bmRvciBwcmVmaXhlcy4KKyAqLwordmFyIHZlbmRvclByZWZpeGVzID0geworICBhbmltYXRpb25l bmQ6IG1ha2VQcmVmaXhNYXAoJ0FuaW1hdGlvbicsICdBbmltYXRpb25FbmQnKSwKKyAgYW5pbWF0 aW9uaXRlcmF0aW9uOiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uSXRlcmF0 aW9uJyksCisgIGFuaW1hdGlvbnN0YXJ0OiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5p bWF0aW9uU3RhcnQnKSwKKyAgdHJhbnNpdGlvbmVuZDogbWFrZVByZWZpeE1hcCgnVHJhbnNpdGlv bicsICdUcmFuc2l0aW9uRW5kJykKK307CisKKy8qKgorICogRXZlbnQgbmFtZXMgdGhhdCBoYXZl IGFscmVhZHkgYmVlbiBkZXRlY3RlZCBhbmQgcHJlZml4ZWQgKGlmIGFwcGxpY2FibGUpLgorICov Cit2YXIgcHJlZml4ZWRFdmVudE5hbWVzID0ge307CisKKy8qKgorICogRWxlbWVudCB0byBjaGVj ayBmb3IgcHJlZml4ZXMgb24uCisgKi8KK3ZhciBzdHlsZSA9IHt9OworCisvKioKKyAqIEJvb3Rz dHJhcCBpZiBhIERPTSBleGlzdHMuCisgKi8KK2lmIChFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5V c2VET00pIHsKKyAgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5zdHlsZTsK KworICAvLyBPbiBzb21lIHBsYXRmb3JtcywgaW4gcGFydGljdWxhciBzb21lIHJlbGVhc2VzIG9m IEFuZHJvaWQgNC54LAorICAvLyB0aGUgdW4tcHJlZml4ZWQgImFuaW1hdGlvbiIgYW5kICJ0cmFu c2l0aW9uIiBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIG9uIHRoZQorICAvLyBzdHlsZSBvYmplY3Qg YnV0IHRoZSBldmVudHMgdGhhdCBmaXJlIHdpbGwgc3RpbGwgYmUgcHJlZml4ZWQsIHNvIHdlIG5l ZWQKKyAgLy8gdG8gY2hlY2sgaWYgdGhlIHVuLXByZWZpeGVkIGV2ZW50cyBhcmUgdXNhYmxlLCBh bmQgaWYgbm90IHJlbW92ZSB0aGVtIGZyb20gdGhlIG1hcC4KKyAgaWYgKCEoJ0FuaW1hdGlvbkV2 ZW50JyBpbiB3aW5kb3cpKSB7CisgICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLmFuaW1hdGlvbmVu ZC5hbmltYXRpb247CisgICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLmFuaW1hdGlvbml0ZXJhdGlv bi5hbmltYXRpb247CisgICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLmFuaW1hdGlvbnN0YXJ0LmFu aW1hdGlvbjsKKyAgfQorCisgIC8vIFNhbWUgYXMgYWJvdmUKKyAgaWYgKCEoJ1RyYW5zaXRpb25F dmVudCcgaW4gd2luZG93KSkgeworICAgIGRlbGV0ZSB2ZW5kb3JQcmVmaXhlcy50cmFuc2l0aW9u ZW5kLnRyYW5zaXRpb247CisgIH0KK30KKworLyoqCisgKiBBdHRlbXB0cyB0byBkZXRlcm1pbmUg dGhlIGNvcnJlY3QgdmVuZG9yIHByZWZpeGVkIGV2ZW50IG5hbWUuCisgKgorICogQHBhcmFtIHtz dHJpbmd9IGV2ZW50TmFtZQorICogQHJldHVybnMge3N0cmluZ30KKyAqLworZnVuY3Rpb24gZ2V0 VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoZXZlbnROYW1lKSB7CisgIGlmIChwcmVmaXhlZEV2ZW50 TmFtZXNbZXZlbnROYW1lXSkgeworICAgIHJldHVybiBwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnRO YW1lXTsKKyAgfSBlbHNlIGlmICghdmVuZG9yUHJlZml4ZXNbZXZlbnROYW1lXSkgeworICAgIHJl dHVybiBldmVudE5hbWU7CisgIH0KKworICB2YXIgcHJlZml4TWFwID0gdmVuZG9yUHJlZml4ZXNb ZXZlbnROYW1lXTsKKworICBmb3IgKHZhciBzdHlsZVByb3AgaW4gcHJlZml4TWFwKSB7CisgICAg aWYgKHByZWZpeE1hcC5oYXNPd25Qcm9wZXJ0eShzdHlsZVByb3ApICYmIHN0eWxlUHJvcCBpbiBz dHlsZSkgeworICAgICAgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdID0gcHJl Zml4TWFwW3N0eWxlUHJvcF07CisgICAgfQorICB9CisKKyAgcmV0dXJuICcnOworfQorCittb2R1 bGUuZXhwb3J0cyA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lOworfSx7IjEyNiI6MTI2fV0s MTEyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0 IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg KgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxp Y2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5 IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCBy aWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0 b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJvZEludmFyaWFudCA9IF9k ZXJlcV8oMTE2KSwKKyAgICBfYXNzaWduID0gX2RlcmVxXygxNDgpOworCit2YXIgUmVhY3RDb21w b3NpdGVDb21wb25lbnQgPSBfZGVyZXFfKDI5KTsKK3ZhciBSZWFjdEVtcHR5Q29tcG9uZW50ID0g X2RlcmVxXyg0OSk7Cit2YXIgUmVhY3RIb3N0Q29tcG9uZW50ID0gX2RlcmVxXyg1NCk7CisKK3Zh ciBnZXROZXh0RGVidWdJRCA9IF9kZXJlcV8oMTA4KTsKK3ZhciBpbnZhcmlhbnQgPSBfZGVyZXFf KDE0MCk7Cit2YXIgd2FybmluZyA9IF9kZXJlcV8oMTQ3KTsKKworLy8gVG8gYXZvaWQgYSBjeWNs aWMgZGVwZW5kZW5jeSwgd2UgY3JlYXRlIHRoZSBmaW5hbCBjbGFzcyBpbiB0aGlzIG1vZHVsZQor dmFyIFJlYWN0Q29tcG9zaXRlQ29tcG9uZW50V3JhcHBlciA9IGZ1bmN0aW9uIChlbGVtZW50KSB7 CisgIHRoaXMuY29uc3RydWN0KGVsZW1lbnQpOworfTsKK19hc3NpZ24oUmVhY3RDb21wb3NpdGVD b21wb25lbnRXcmFwcGVyLnByb3RvdHlwZSwgUmVhY3RDb21wb3NpdGVDb21wb25lbnQsIHsKKyAg X2luc3RhbnRpYXRlUmVhY3RDb21wb25lbnQ6IGluc3RhbnRpYXRlUmVhY3RDb21wb25lbnQKK30p OworCitmdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0ob3duZXIpIHsKKyAgaWYg KG93bmVyKSB7CisgICAgdmFyIG5hbWUgPSBvd25lci5nZXROYW1lKCk7CisgICAgaWYgKG5hbWUp IHsKKyAgICAgIHJldHVybiAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSAr ICdgLic7CisgICAgfQorICB9CisgIHJldHVybiAnJzsKK30KKworLyoqCisgKiBDaGVjayBpZiB0 aGUgdHlwZSByZWZlcmVuY2UgaXMgYSBrbm93biBpbnRlcm5hbCB0eXBlLiBJLmUuIG5vdCBhIHVz ZXIKKyAqIHByb3ZpZGVkIGNvbXBvc2l0ZSB0eXBlLgorICoKKyAqIEBwYXJhbSB7ZnVuY3Rpb259 IHR5cGUKKyAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgdmFs aWQgaW50ZXJuYWwgdHlwZS4KKyAqLworZnVuY3Rpb24gaXNJbnRlcm5hbENvbXBvbmVudFR5cGUo dHlwZSkgeworICByZXR1cm4gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHR5 cGUucHJvdG90eXBlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgdHlwZS5wcm90b3R5cGUubW91 bnRDb21wb25lbnQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHR5cGUucHJvdG90eXBlLnJlY2Vp dmVDb21wb25lbnQgPT09ICdmdW5jdGlvbic7Cit9CisKKy8qKgorICogR2l2ZW4gYSBSZWFjdE5v ZGUsIGNyZWF0ZSBhbiBpbnN0YW5jZSB0aGF0IHdpbGwgYWN0dWFsbHkgYmUgbW91bnRlZC4KKyAq CisgKiBAcGFyYW0ge1JlYWN0Tm9kZX0gbm9kZQorICogQHBhcmFtIHtib29sZWFufSBzaG91bGRI YXZlRGVidWdJRAorICogQHJldHVybiB7b2JqZWN0fSBBIG5ldyBpbnN0YW5jZSBvZiB0aGUgZWxl bWVudCdzIGNvbnN0cnVjdG9yLgorICogQHByb3RlY3RlZAorICovCitmdW5jdGlvbiBpbnN0YW50 aWF0ZVJlYWN0Q29tcG9uZW50KG5vZGUsIHNob3VsZEhhdmVEZWJ1Z0lEKSB7CisgIHZhciBpbnN0 YW5jZTsKKworICBpZiAobm9kZSA9PT0gbnVsbCB8fCBub2RlID09PSBmYWxzZSkgeworICAgIGlu c3RhbmNlID0gUmVhY3RFbXB0eUNvbXBvbmVudC5jcmVhdGUoaW5zdGFudGlhdGVSZWFjdENvbXBv bmVudCk7CisgIH0gZWxzZSBpZiAodHlwZW9mIG5vZGUgPT09ICdvYmplY3QnKSB7CisgICAgdmFy IGVsZW1lbnQgPSBub2RlOworICAgIHZhciB0eXBlID0gZWxlbWVudC50eXBlOworICAgIGlmICh0 eXBlb2YgdHlwZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdHlwZSAhPT0gJ3N0cmluZycpIHsK KyAgICAgIHZhciBpbmZvID0gJyc7CisgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1 Y3Rpb24nKSB7CisgICAgICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHR5cGUg PT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwgJiYgT2JqZWN0LmtleXModHlwZSkubGVuZ3Ro ID09PSAwKSB7CisgICAgICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9y dCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyAnaXRcJ3MgZGVmaW5lZCBpbi4nOwor ICAgICAgICB9CisgICAgICB9CisgICAgICBpbmZvICs9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRl bmR1bShlbGVtZW50Ll9vd25lcik7CisgICAgICAhZmFsc2UgPyAiZGV2ZWxvcG1lbnQiICE9PSAn cHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFbGVtZW50IHR5cGUgaXMgaW52YWxpZDog ZXhwZWN0ZWQgYSBzdHJpbmcgKGZvciBidWlsdC1pbiBjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1 bmN0aW9uIChmb3IgY29tcG9zaXRlIGNvbXBvbmVudHMpIGJ1dCBnb3Q6ICVzLiVzJywgdHlwZSA9 PSBudWxsID8gdHlwZSA6IHR5cGVvZiB0eXBlLCBpbmZvKSA6IF9wcm9kSW52YXJpYW50KCcxMzAn LCB0eXBlID09IG51bGwgPyB0eXBlIDogdHlwZW9mIHR5cGUsIGluZm8pIDogdm9pZCAwOworICAg IH0KKworICAgIC8vIFNwZWNpYWwgY2FzZSBzdHJpbmcgdmFsdWVzCisgICAgaWYgKHR5cGVvZiBl bGVtZW50LnR5cGUgPT09ICdzdHJpbmcnKSB7CisgICAgICBpbnN0YW5jZSA9IFJlYWN0SG9zdENv bXBvbmVudC5jcmVhdGVJbnRlcm5hbENvbXBvbmVudChlbGVtZW50KTsKKyAgICB9IGVsc2UgaWYg KGlzSW50ZXJuYWxDb21wb25lbnRUeXBlKGVsZW1lbnQudHlwZSkpIHsKKyAgICAgIC8vIFRoaXMg aXMgdGVtcG9yYXJpbHkgYXZhaWxhYmxlIGZvciBjdXN0b20gY29tcG9uZW50cyB0aGF0IGFyZSBu b3Qgc3RyaW5nCisgICAgICAvLyByZXByZXNlbnRhdGlvbnMuIEkuZS4gQVJULiBPbmNlIHRob3Nl IGFyZSB1cGRhdGVkIHRvIHVzZSB0aGUgc3RyaW5nCisgICAgICAvLyByZXByZXNlbnRhdGlvbiwg d2UgY2FuIGRyb3AgdGhpcyBjb2RlIHBhdGguCisgICAgICBpbnN0YW5jZSA9IG5ldyBlbGVtZW50 LnR5cGUoZWxlbWVudCk7CisKKyAgICAgIC8vIFdlIHJlbmFtZWQgdGhpcy4gQWxsb3cgdGhlIG9s ZCBuYW1lIGZvciBjb21wYXQuIDooCisgICAgICBpZiAoIWluc3RhbmNlLmdldEhvc3ROb2RlKSB7 CisgICAgICAgIGluc3RhbmNlLmdldEhvc3ROb2RlID0gaW5zdGFuY2UuZ2V0TmF0aXZlTm9kZTsK KyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaW5zdGFuY2UgPSBuZXcgUmVhY3RDb21wb3Np dGVDb21wb25lbnRXcmFwcGVyKGVsZW1lbnQpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlb2Yg bm9kZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG5vZGUgPT09ICdudW1iZXInKSB7CisgICAgaW5z dGFuY2UgPSBSZWFjdEhvc3RDb21wb25lbnQuY3JlYXRlSW5zdGFuY2VGb3JUZXh0KG5vZGUpOwor ICB9IGVsc2UgeworICAgICFmYWxzZSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/ IGludmFyaWFudChmYWxzZSwgJ0VuY291bnRlcmVkIGludmFsaWQgUmVhY3Qgbm9kZSBvZiB0eXBl ICVzJywgdHlwZW9mIG5vZGUpIDogX3Byb2RJbnZhcmlhbnQoJzEzMScsIHR5cGVvZiBub2RlKSA6 IHZvaWQgMDsKKyAgfQorCisgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsK KyAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHR5cGVvZiBpbnN0 YW5jZS5tb3VudENvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgaW5zdGFuY2UucmVj ZWl2ZUNvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgaW5zdGFuY2UuZ2V0SG9zdE5v ZGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluc3RhbmNlLnVubW91bnRDb21wb25lbnQgPT09 ICdmdW5jdGlvbicsICdPbmx5IFJlYWN0IENvbXBvbmVudHMgY2FuIGJlIG1vdW50ZWQuJykgOiB2 b2lkIDA7CisgIH0KKworICAvLyBUaGVzZSB0d28gZmllbGRzIGFyZSB1c2VkIGJ5IHRoZSBET00g YW5kIEFSVCBkaWZmaW5nIGFsZ29yaXRobXMKKyAgLy8gcmVzcGVjdGl2ZWx5LiBJbnN0ZWFkIG9m IHVzaW5nIGV4cGFuZG9zIG9uIGNvbXBvbmVudHMsIHdlIHNob3VsZCBiZQorICAvLyBzdG9yaW5n IHRoZSBzdGF0ZSBuZWVkZWQgYnkgdGhlIGRpZmZpbmcgYWxnb3JpdGhtcyBlbHNld2hlcmUuCisg IGluc3RhbmNlLl9tb3VudEluZGV4ID0gMDsKKyAgaW5zdGFuY2UuX21vdW50SW1hZ2UgPSBudWxs OworCisgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICBpbnN0YW5j ZS5fZGVidWdJRCA9IHNob3VsZEhhdmVEZWJ1Z0lEID8gZ2V0TmV4dERlYnVnSUQoKSA6IDA7Cisg IH0KKworICAvLyBJbnRlcm5hbCBpbnN0YW5jZXMgc2hvdWxkIGZ1bGx5IGNvbnN0cnVjdGVkIGF0 IHRoaXMgcG9pbnQsIHNvIHRoZXkgc2hvdWxkCisgIC8vIG5vdCBnZXQgYW55IG5ldyBmaWVsZHMg YWRkZWQgdG8gdGhlbSBhdCB0aGlzIHBvaW50LgorICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3By b2R1Y3Rpb24nKSB7CisgICAgaWYgKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucykgeworICAgICAg T2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKGluc3RhbmNlKTsKKyAgICB9CisgIH0KKworICByZXR1 cm4gaW5zdGFuY2U7Cit9CisKK21vZHVsZS5leHBvcnRzID0gaW5zdGFudGlhdGVSZWFjdENvbXBv bmVudDsKK30seyIxMDgiOjEwOCwiMTE2IjoxMTYsIjE0MCI6MTQwLCIxNDciOjE0NywiMTQ4Ijox NDgsIjI5IjoyOSwiNDkiOjQ5LCI1NCI6NTR9XSwxMTM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxl LGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5j LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxp Y2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VO U0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRk aXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBB VEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0 JzsKKwordmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0gX2RlcmVxXygxMjYpOworCit2YXIgdXNl SGFzRmVhdHVyZTsKK2lmIChFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00pIHsKKyAgdXNl SGFzRmVhdHVyZSA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uICYmIGRvY3VtZW50LmltcGxlbWVu dGF0aW9uLmhhc0ZlYXR1cmUgJiYKKyAgLy8gYWx3YXlzIHJldHVybnMgdHJ1ZSBpbiBuZXdlciBi cm93c2VycyBhcyBwZXIgdGhlIHN0YW5kYXJkLgorICAvLyBAc2VlIGh0dHA6Ly9kb20uc3BlYy53 aGF0d2cub3JnLyNkb20tZG9taW1wbGVtZW50YXRpb24taGFzZmVhdHVyZQorICBkb2N1bWVudC5p bXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCcnLCAnJykgIT09IHRydWU7Cit9CisKKy8qKgorICog Q2hlY2tzIGlmIGFuIGV2ZW50IGlzIHN1cHBvcnRlZCBpbiB0aGUgY3VycmVudCBleGVjdXRpb24g ZW52aXJvbm1lbnQuCisgKgorICogTk9URTogVGhpcyB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseSBm b3Igbm9uLWdlbmVyaWMgZXZlbnRzIHN1Y2ggYXMgYGNoYW5nZWAsCisgKiBgcmVzZXRgLCBgbG9h ZGAsIGBlcnJvcmAsIGFuZCBgc2VsZWN0YC4KKyAqCisgKiBCb3Jyb3dzIGZyb20gTW9kZXJuaXpy LgorICoKKyAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVTdWZmaXggRXZlbnQgbmFtZSwgZS5n LiAiY2xpY2siLgorICogQHBhcmFtIHs/Ym9vbGVhbn0gY2FwdHVyZSBDaGVjayBpZiB0aGUgY2Fw dHVyZSBwaGFzZSBpcyBzdXBwb3J0ZWQuCisgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRo ZSBldmVudCBpcyBzdXBwb3J0ZWQuCisgKiBAaW50ZXJuYWwKKyAqIEBsaWNlbnNlIE1vZGVybml6 ciAzLjAuMHByZSAoQ3VzdG9tIEJ1aWxkKSB8IE1JVAorICovCitmdW5jdGlvbiBpc0V2ZW50U3Vw cG9ydGVkKGV2ZW50TmFtZVN1ZmZpeCwgY2FwdHVyZSkgeworICBpZiAoIUV4ZWN1dGlvbkVudmly b25tZW50LmNhblVzZURPTSB8fCBjYXB0dXJlICYmICEoJ2FkZEV2ZW50TGlzdGVuZXInIGluIGRv Y3VtZW50KSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZhciBldmVudE5hbWUgPSAn b24nICsgZXZlbnROYW1lU3VmZml4OworICB2YXIgaXNTdXBwb3J0ZWQgPSBldmVudE5hbWUgaW4g ZG9jdW1lbnQ7CisKKyAgaWYgKCFpc1N1cHBvcnRlZCkgeworICAgIHZhciBlbGVtZW50ID0gZG9j dW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoZXZl bnROYW1lLCAncmV0dXJuOycpOworICAgIGlzU3VwcG9ydGVkID0gdHlwZW9mIGVsZW1lbnRbZXZl bnROYW1lXSA9PT0gJ2Z1bmN0aW9uJzsKKyAgfQorCisgIGlmICghaXNTdXBwb3J0ZWQgJiYgdXNl SGFzRmVhdHVyZSAmJiBldmVudE5hbWVTdWZmaXggPT09ICd3aGVlbCcpIHsKKyAgICAvLyBUaGlz IGlzIHRoZSBvbmx5IHdheSB0byB0ZXN0IHN1cHBvcnQgZm9yIHRoZSBgd2hlZWxgIGV2ZW50IGlu IElFOSsuCisgICAgaXNTdXBwb3J0ZWQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0 dXJlKCdFdmVudHMud2hlZWwnLCAnMy4wJyk7CisgIH0KKworICByZXR1cm4gaXNTdXBwb3J0ZWQ7 Cit9CisKK21vZHVsZS5leHBvcnRzID0gaXNFdmVudFN1cHBvcnRlZDsKK30seyIxMjYiOjEyNn1d LDExNDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdo dCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgor ICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBs aWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9y eSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQg cmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVj dG9yeS4KKyAqCisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisKKy8qKgorICogQHNlZSBodHRw Oi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS90 aGUtaW5wdXQtZWxlbWVudC5odG1sI2lucHV0LXR5cGUtYXR0ci1zdW1tYXJ5CisgKi8KKwordmFy IHN1cHBvcnRlZElucHV0VHlwZXMgPSB7CisgICdjb2xvcic6IHRydWUsCisgICdkYXRlJzogdHJ1 ZSwKKyAgJ2RhdGV0aW1lJzogdHJ1ZSwKKyAgJ2RhdGV0aW1lLWxvY2FsJzogdHJ1ZSwKKyAgJ2Vt YWlsJzogdHJ1ZSwKKyAgJ21vbnRoJzogdHJ1ZSwKKyAgJ251bWJlcic6IHRydWUsCisgICdwYXNz d29yZCc6IHRydWUsCisgICdyYW5nZSc6IHRydWUsCisgICdzZWFyY2gnOiB0cnVlLAorICAndGVs JzogdHJ1ZSwKKyAgJ3RleHQnOiB0cnVlLAorICAndGltZSc6IHRydWUsCisgICd1cmwnOiB0cnVl LAorICAnd2Vlayc6IHRydWUKK307CisKK2Z1bmN0aW9uIGlzVGV4dElucHV0RWxlbWVudChlbGVt KSB7CisgIHZhciBub2RlTmFtZSA9IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVO YW1lLnRvTG93ZXJDYXNlKCk7CisKKyAgaWYgKG5vZGVOYW1lID09PSAnaW5wdXQnKSB7CisgICAg cmV0dXJuICEhc3VwcG9ydGVkSW5wdXRUeXBlc1tlbGVtLnR5cGVdOworICB9CisKKyAgaWYgKG5v ZGVOYW1lID09PSAndGV4dGFyZWEnKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1 cm4gZmFsc2U7Cit9CisKK21vZHVsZS5leHBvcnRzID0gaXNUZXh0SW5wdXRFbGVtZW50OworfSx7 fV0sMTE1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJp Z2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQu CisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxl IGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0 b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVu dCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGly ZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBlc2NhcGVUZXh0Q29udGVu dEZvckJyb3dzZXIgPSBfZGVyZXFfKDEwMCk7CisKKy8qKgorICogRXNjYXBlcyBhdHRyaWJ1dGUg dmFsdWUgdG8gcHJldmVudCBzY3JpcHRpbmcgYXR0YWNrcy4KKyAqCisgKiBAcGFyYW0geyp9IHZh bHVlIFZhbHVlIHRvIGVzY2FwZS4KKyAqIEByZXR1cm4ge3N0cmluZ30gQW4gZXNjYXBlZCBzdHJp bmcuCisgKi8KK2Z1bmN0aW9uIHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyKHZhbHVlKSB7 CisgIHJldHVybiAnIicgKyBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIodmFsdWUpICsgJyIn OworfQorCittb2R1bGUuZXhwb3J0cyA9IHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyOwor fSx7IjEwMCI6MTAwfV0sMTE2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8q KgorICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwg cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5k ZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGlu IHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdy YW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxl IGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworJ3VzZSBzdHJpY3QnOworCisv KioKKyAqIFdBUk5JTkc6IERPIE5PVCBtYW51YWxseSByZXF1aXJlIHRoaXMgbW9kdWxlLgorICog VGhpcyBpcyBhIHJlcGxhY2VtZW50IGZvciBgaW52YXJpYW50KC4uLilgIHVzZWQgYnkgdGhlIGVy cm9yIGNvZGUgc3lzdGVtCisgKiBhbmQgd2lsbCBfb25seV8gYmUgcmVxdWlyZWQgYnkgdGhlIGNv cnJlc3BvbmRpbmcgYmFiZWwgcGFzcy4KKyAqIEl0IGFsd2F5cyB0aHJvd3MuCisgKi8KKworZnVu Y3Rpb24gcmVhY3RQcm9kSW52YXJpYW50KGNvZGUpIHsKKyAgdmFyIGFyZ0NvdW50ID0gYXJndW1l bnRzLmxlbmd0aCAtIDE7CisKKyAgdmFyIG1lc3NhZ2UgPSAnTWluaWZpZWQgUmVhY3QgZXJyb3Ig IycgKyBjb2RlICsgJzsgdmlzaXQgJyArICdodHRwOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0 L2RvY3MvZXJyb3ItZGVjb2Rlci5odG1sP2ludmFyaWFudD0nICsgY29kZTsKKworICBmb3IgKHZh ciBhcmdJZHggPSAwOyBhcmdJZHggPCBhcmdDb3VudDsgYXJnSWR4KyspIHsKKyAgICBtZXNzYWdl ICs9ICcmYXJnc1tdPScgKyBlbmNvZGVVUklDb21wb25lbnQoYXJndW1lbnRzW2FyZ0lkeCArIDFd KTsKKyAgfQorCisgIG1lc3NhZ2UgKz0gJyBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhl IG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQnICsgJyBmb3IgZnVsbCBlcnJvcnMgYW5kIGFk ZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4nOworCisgIHZhciBlcnJvciA9IG5ldyBFcnJvciht ZXNzYWdlKTsKKyAgZXJyb3IubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJzsKKyAgZXJyb3Iu ZnJhbWVzVG9Qb3AgPSAxOyAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IHJlYWN0UHJvZEludmFyaWFu dCdzIG93biBmcmFtZQorCisgIHRocm93IGVycm9yOworfQorCittb2R1bGUuZXhwb3J0cyA9IHJl YWN0UHJvZEludmFyaWFudDsKK30se31dLDExNzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhw b3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisg KiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5z ZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBm aWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlv bmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5U UyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOwor Cit2YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSBfZGVyZXFfKDEyNik7Cit2YXIgRE9NTmFtZXNw YWNlcyA9IF9kZXJlcV8oMTApOworCit2YXIgV0hJVEVTUEFDRV9URVNUID0gL15bIFxyXG5cdFxm XS87Cit2YXIgTk9OVklTSUJMRV9URVNUID0gLzwoIS0tfGxpbmt8bm9zY3JpcHR8bWV0YXxzY3Jp cHR8c3R5bGUpWyBcclxuXHRcZlwvPl0vOworCit2YXIgY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9j YWxGdW5jdGlvbiA9IF9kZXJlcV8oOTgpOworCisvLyBTVkcgdGVtcCBjb250YWluZXIgZm9yIElF IGxhY2tpbmcgaW5uZXJIVE1MCit2YXIgcmV1c2FibGVTVkdDb250YWluZXI7CisKKy8qKgorICog U2V0IHRoZSBpbm5lckhUTUwgcHJvcGVydHkgb2YgYSBub2RlLCBlbnN1cmluZyB0aGF0IHdoaXRl c3BhY2UgaXMgcHJlc2VydmVkCisgKiBldmVuIGluIElFOC4KKyAqCisgKiBAcGFyYW0ge0RPTUVs ZW1lbnR9IG5vZGUKKyAqIEBwYXJhbSB7c3RyaW5nfSBodG1sCisgKiBAaW50ZXJuYWwKKyAqLwor dmFyIHNldElubmVySFRNTCA9IGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24oZnVu Y3Rpb24gKG5vZGUsIGh0bWwpIHsKKyAgLy8gSUUgZG9lcyBub3QgaGF2ZSBpbm5lckhUTUwgZm9y IFNWRyBub2Rlcywgc28gaW5zdGVhZCB3ZSBpbmplY3QgdGhlCisgIC8vIG5ldyBtYXJrdXAgaW4g YSB0ZW1wIG5vZGUgYW5kIHRoZW4gbW92ZSB0aGUgY2hpbGQgbm9kZXMgYWNyb3NzIGludG8KKyAg Ly8gdGhlIHRhcmdldCBub2RlCisgIGlmIChub2RlLm5hbWVzcGFjZVVSSSA9PT0gRE9NTmFtZXNw YWNlcy5zdmcgJiYgISgnaW5uZXJIVE1MJyBpbiBub2RlKSkgeworICAgIHJldXNhYmxlU1ZHQ29u dGFpbmVyID0gcmV1c2FibGVTVkdDb250YWluZXIgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgn ZGl2Jyk7CisgICAgcmV1c2FibGVTVkdDb250YWluZXIuaW5uZXJIVE1MID0gJzxzdmc+JyArIGh0 bWwgKyAnPC9zdmc+JzsKKyAgICB2YXIgc3ZnTm9kZSA9IHJldXNhYmxlU1ZHQ29udGFpbmVyLmZp cnN0Q2hpbGQ7CisgICAgd2hpbGUgKHN2Z05vZGUuZmlyc3RDaGlsZCkgeworICAgICAgbm9kZS5h cHBlbmRDaGlsZChzdmdOb2RlLmZpcnN0Q2hpbGQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBu b2RlLmlubmVySFRNTCA9IGh0bWw7CisgIH0KK30pOworCitpZiAoRXhlY3V0aW9uRW52aXJvbm1l bnQuY2FuVXNlRE9NKSB7CisgIC8vIElFODogV2hlbiB1cGRhdGluZyBhIGp1c3QgY3JlYXRlZCBu b2RlIHdpdGggaW5uZXJIVE1MIG9ubHkgbGVhZGluZworICAvLyB3aGl0ZXNwYWNlIGlzIHJlbW92 ZWQuIFdoZW4gdXBkYXRpbmcgYW4gZXhpc3Rpbmcgbm9kZSB3aXRoIGlubmVySFRNTAorICAvLyB3 aGl0ZXNwYWNlIGluIHJvb3QgVGV4dE5vZGVzIGlzIGFsc28gY29sbGFwc2VkLgorICAvLyBAc2Vl IHF1aXJrc21vZGUub3JnL2J1Z3JlcG9ydHMvYXJjaGl2ZXMvMjAwNC8xMS9pbm5lcmh0bWxfYW5k X3QuaHRtbAorCisgIC8vIEZlYXR1cmUgZGV0ZWN0aW9uOyBvbmx5IElFOCBpcyBrbm93biB0byBi ZWhhdmUgaW1wcm9wZXJseSBsaWtlIHRoaXMuCisgIHZhciB0ZXN0RWxlbWVudCA9IGRvY3VtZW50 LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworICB0ZXN0RWxlbWVudC5pbm5lckhUTUwgPSAnICc7Cisg IGlmICh0ZXN0RWxlbWVudC5pbm5lckhUTUwgPT09ICcnKSB7CisgICAgc2V0SW5uZXJIVE1MID0g ZnVuY3Rpb24gKG5vZGUsIGh0bWwpIHsKKyAgICAgIC8vIE1hZ2ljIHRoZW9yeTogSUU4IHN1cHBv c2VkbHkgZGlmZmVyZW50aWF0ZXMgYmV0d2VlbiBhZGRlZCBhbmQgdXBkYXRlZAorICAgICAgLy8g bm9kZXMgd2hlbiBwcm9jZXNzaW5nIGlubmVySFRNTCwgaW5uZXJIVE1MIG9uIHVwZGF0ZWQgbm9k ZXMgc3VmZmVycworICAgICAgLy8gZnJvbSB3b3JzZSB3aGl0ZXNwYWNlIGJlaGF2aW9yLiBSZS1h ZGRpbmcgYSBub2RlIGxpa2UgdGhpcyB0cmlnZ2VycworICAgICAgLy8gdGhlIGluaXRpYWwgYW5k IG1vcmUgZmF2b3JhYmxlIHdoaXRlc3BhY2UgYmVoYXZpb3IuCisgICAgICAvLyBUT0RPOiBXaGF0 IHRvIGRvIG9uIGEgZGV0YWNoZWQgbm9kZT8KKyAgICAgIGlmIChub2RlLnBhcmVudE5vZGUpIHsK KyAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChub2RlLCBub2RlKTsKKyAgICAg IH0KKworICAgICAgLy8gV2UgYWxzbyBpbXBsZW1lbnQgYSB3b3JrYXJvdW5kIGZvciBub24tdmlz aWJsZSB0YWdzIGRpc2FwcGVhcmluZyBpbnRvCisgICAgICAvLyB0aGluIGFpciBvbiBJRTgsIHRo aXMgb25seSBoYXBwZW5zIGlmIHRoZXJlIGlzIG5vIHZpc2libGUgdGV4dAorICAgICAgLy8gaW4t ZnJvbnQgb2YgdGhlIG5vbi12aXNpYmxlIHRhZ3MuIFBpZ2d5YmFjayBvbiB0aGUgd2hpdGVzcGFj ZSBmaXgKKyAgICAgIC8vIGFuZCBzaW1wbHkgY2hlY2sgaWYgYW55IG5vbi12aXNpYmxlIHRhZ3Mg YXBwZWFyIGluIHRoZSBzb3VyY2UuCisgICAgICBpZiAoV0hJVEVTUEFDRV9URVNULnRlc3QoaHRt bCkgfHwgaHRtbFswXSA9PT0gJzwnICYmIE5PTlZJU0lCTEVfVEVTVC50ZXN0KGh0bWwpKSB7Cisg ICAgICAgIC8vIFJlY292ZXIgbGVhZGluZyB3aGl0ZXNwYWNlIGJ5IHRlbXBvcmFyaWx5IHByZXBl bmRpbmcgYW55IGNoYXJhY3Rlci4KKyAgICAgICAgLy8gXHVGRUZGIGhhcyB0aGUgcG90ZW50aWFs IGFkdmFudGFnZSBvZiBiZWluZyB6ZXJvLXdpZHRoL2ludmlzaWJsZS4KKyAgICAgICAgLy8gVWds aWZ5SlMgZHJvcHMgVStGRUZGIGNoYXJzIHdoZW4gcGFyc2luZywgc28gdXNlIFN0cmluZy5mcm9t Q2hhckNvZGUKKyAgICAgICAgLy8gaW4gaG9wZXMgdGhhdCB0aGlzIGlzIHByZXNlcnZlZCBldmVu IGlmICJcdUZFRkYiIGlzIHRyYW5zZm9ybWVkIHRvCisgICAgICAgIC8vIHRoZSBhY3R1YWwgVW5p Y29kZSBjaGFyYWN0ZXIgKGJ5IEJhYmVsLCBmb3IgZXhhbXBsZSkuCisgICAgICAgIC8vIGh0dHBz Oi8vZ2l0aHViLmNvbS9taXNob28vVWdsaWZ5SlMyL2Jsb2IvdjIuNC4yMC9saWIvcGFyc2UuanMj TDIxNgorICAgICAgICBub2RlLmlubmVySFRNTCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhGRUZG KSArIGh0bWw7CisKKyAgICAgICAgLy8gZGVsZXRlRGF0YSBsZWF2ZXMgYW4gZW1wdHkgYFRleHRO b2RlYCB3aGljaCBvZmZzZXRzIHRoZSBpbmRleCBvZiBhbGwKKyAgICAgICAgLy8gY2hpbGRyZW4u IERlZmluaXRlbHkgd2FudCB0byBhdm9pZCB0aGlzLgorICAgICAgICB2YXIgdGV4dE5vZGUgPSBu b2RlLmZpcnN0Q2hpbGQ7CisgICAgICAgIGlmICh0ZXh0Tm9kZS5kYXRhLmxlbmd0aCA9PT0gMSkg eworICAgICAgICAgIG5vZGUucmVtb3ZlQ2hpbGQodGV4dE5vZGUpOworICAgICAgICB9IGVsc2Ug eworICAgICAgICAgIHRleHROb2RlLmRlbGV0ZURhdGEoMCwgMSk7CisgICAgICAgIH0KKyAgICAg IH0gZWxzZSB7CisgICAgICAgIG5vZGUuaW5uZXJIVE1MID0gaHRtbDsKKyAgICAgIH0KKyAgICB9 OworICB9CisgIHRlc3RFbGVtZW50ID0gbnVsbDsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBzZXRJ bm5lckhUTUw7Cit9LHsiMTAiOjEwLCIxMjYiOjEyNiwiOTgiOjk4fV0sMTE4OltmdW5jdGlvbihf ZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwg RmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3Vy Y2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4g dGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNl IHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZv dW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLwor CisndXNlIHN0cmljdCc7CisKK3ZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IF9kZXJlcV8oMTI2 KTsKK3ZhciBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIgPSBfZGVyZXFfKDEwMCk7Cit2YXIg c2V0SW5uZXJIVE1MID0gX2RlcmVxXygxMTcpOworCisvKioKKyAqIFNldCB0aGUgdGV4dENvbnRl bnQgcHJvcGVydHkgb2YgYSBub2RlLCBlbnN1cmluZyB0aGF0IHdoaXRlc3BhY2UgaXMgcHJlc2Vy dmVkCisgKiBldmVuIGluIElFOC4gaW5uZXJUZXh0IGlzIGEgcG9vciBzdWJzdGl0dXRlIGZvciB0 ZXh0Q29udGVudCBhbmQsIGFtb25nIG1hbnkKKyAqIGlzc3VlcywgaW5zZXJ0cyA8YnI+IGluc3Rl YWQgb2YgdGhlIGxpdGVyYWwgbmV3bGluZSBjaGFycy4gaW5uZXJIVE1MIGJlaGF2ZXMKKyAqIGFz IGl0IHNob3VsZC4KKyAqCisgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGUKKyAqIEBwYXJhbSB7 c3RyaW5nfSB0ZXh0CisgKiBAaW50ZXJuYWwKKyAqLwordmFyIHNldFRleHRDb250ZW50ID0gZnVu Y3Rpb24gKG5vZGUsIHRleHQpIHsKKyAgaWYgKHRleHQpIHsKKyAgICB2YXIgZmlyc3RDaGlsZCA9 IG5vZGUuZmlyc3RDaGlsZDsKKworICAgIGlmIChmaXJzdENoaWxkICYmIGZpcnN0Q2hpbGQgPT09 IG5vZGUubGFzdENoaWxkICYmIGZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IDMpIHsKKyAgICAgIGZp cnN0Q2hpbGQubm9kZVZhbHVlID0gdGV4dDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAg bm9kZS50ZXh0Q29udGVudCA9IHRleHQ7Cit9OworCitpZiAoRXhlY3V0aW9uRW52aXJvbm1lbnQu Y2FuVXNlRE9NKSB7CisgIGlmICghKCd0ZXh0Q29udGVudCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRF bGVtZW50KSkgeworICAgIHNldFRleHRDb250ZW50ID0gZnVuY3Rpb24gKG5vZGUsIHRleHQpIHsK KyAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAzKSB7CisgICAgICAgIG5vZGUubm9kZVZhbHVl ID0gdGV4dDsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgc2V0SW5uZXJIVE1MKG5v ZGUsIGVzY2FwZVRleHRDb250ZW50Rm9yQnJvd3Nlcih0ZXh0KSk7CisgICAgfTsKKyAgfQorfQor Cittb2R1bGUuZXhwb3J0cyA9IHNldFRleHRDb250ZW50OworfSx7IjEwMCI6MTAwLCIxMTciOjEx NywiMTI2IjoxMjZ9XSwxMTk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoq CisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0 cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRo ZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUg cm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAor ICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0 aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKworLyoqCisgKiBH aXZlbiBhIGBwcmV2RWxlbWVudGAgYW5kIGBuZXh0RWxlbWVudGAsIGRldGVybWluZXMgaWYgdGhl IGV4aXN0aW5nCisgKiBpbnN0YW5jZSBzaG91bGQgYmUgdXBkYXRlZCBhcyBvcHBvc2VkIHRvIGJl aW5nIGRlc3Ryb3llZCBvciByZXBsYWNlZCBieSBhIG5ldworICogaW5zdGFuY2UuIEJvdGggYXJn dW1lbnRzIGFyZSBlbGVtZW50cy4gVGhpcyBlbnN1cmVzIHRoYXQgdGhpcyBsb2dpYyBjYW4KKyAq IG9wZXJhdGUgb24gc3RhdGVsZXNzIHRyZWVzIHdpdGhvdXQgYW55IGJhY2tpbmcgaW5zdGFuY2Uu CisgKgorICogQHBhcmFtIHs/b2JqZWN0fSBwcmV2RWxlbWVudAorICogQHBhcmFtIHs/b2JqZWN0 fSBuZXh0RWxlbWVudAorICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZXhpc3Rpbmcg aW5zdGFuY2Ugc2hvdWxkIGJlIHVwZGF0ZWQuCisgKiBAcHJvdGVjdGVkCisgKi8KKworZnVuY3Rp b24gc2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQocHJldkVsZW1lbnQsIG5leHRFbGVtZW50KSB7 CisgIHZhciBwcmV2RW1wdHkgPSBwcmV2RWxlbWVudCA9PT0gbnVsbCB8fCBwcmV2RWxlbWVudCA9 PT0gZmFsc2U7CisgIHZhciBuZXh0RW1wdHkgPSBuZXh0RWxlbWVudCA9PT0gbnVsbCB8fCBuZXh0 RWxlbWVudCA9PT0gZmFsc2U7CisgIGlmIChwcmV2RW1wdHkgfHwgbmV4dEVtcHR5KSB7CisgICAg cmV0dXJuIHByZXZFbXB0eSA9PT0gbmV4dEVtcHR5OworICB9CisKKyAgdmFyIHByZXZUeXBlID0g dHlwZW9mIHByZXZFbGVtZW50OworICB2YXIgbmV4dFR5cGUgPSB0eXBlb2YgbmV4dEVsZW1lbnQ7 CisgIGlmIChwcmV2VHlwZSA9PT0gJ3N0cmluZycgfHwgcHJldlR5cGUgPT09ICdudW1iZXInKSB7 CisgICAgcmV0dXJuIG5leHRUeXBlID09PSAnc3RyaW5nJyB8fCBuZXh0VHlwZSA9PT0gJ251bWJl cic7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5leHRUeXBlID09PSAnb2JqZWN0JyAmJiBwcmV2 RWxlbWVudC50eXBlID09PSBuZXh0RWxlbWVudC50eXBlICYmIHByZXZFbGVtZW50LmtleSA9PT0g bmV4dEVsZW1lbnQua2V5OworICB9Cit9CisKK21vZHVsZS5leHBvcnRzID0gc2hvdWxkVXBkYXRl UmVhY3RDb21wb25lbnQ7Cit9LHt9XSwxMjA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9y dHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICog QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2Vk IHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmls ZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25h bCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMg ZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwor dmFyIF9wcm9kSW52YXJpYW50ID0gX2RlcmVxXygxMTYpOworCit2YXIgUmVhY3RDdXJyZW50T3du ZXIgPSBfZGVyZXFfKDEyMyk7Cit2YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gX2RlcmVxXyg0OCk7 CisKK3ZhciBnZXRJdGVyYXRvckZuID0gX2RlcmVxXygxMDcpOwordmFyIGludmFyaWFudCA9IF9k ZXJlcV8oMTQwKTsKK3ZhciBLZXlFc2NhcGVVdGlscyA9IF9kZXJlcV8oMjIpOwordmFyIHdhcm5p bmcgPSBfZGVyZXFfKDE0Nyk7CisKK3ZhciBTRVBBUkFUT1IgPSAnLic7Cit2YXIgU1VCU0VQQVJB VE9SID0gJzonOworCisvKioKKyAqIFRoaXMgaXMgaW5saW5lZCBmcm9tIFJlYWN0RWxlbWVudCBz aW5jZSB0aGlzIGZpbGUgaXMgc2hhcmVkIGJldHdlZW4KKyAqIGlzb21vcnBoaWMgYW5kIHJlbmRl cmVycy4gV2UgY291bGQgZXh0cmFjdCB0aGlzIHRvIGEKKyAqCisgKi8KKworLyoqCisgKiBUT0RP OiBUZXN0IHRoYXQgYSBzaW5nbGUgY2hpbGQgYW5kIGFuIGFycmF5IHdpdGggb25lIGl0ZW0gaGF2 ZSB0aGUgc2FtZSBrZXkKKyAqIHBhdHRlcm4uCisgKi8KKwordmFyIGRpZFdhcm5BYm91dE1hcHMg PSBmYWxzZTsKKworLyoqCisgKiBHZW5lcmF0ZSBhIGtleSBzdHJpbmcgdGhhdCBpZGVudGlmaWVz IGEgY29tcG9uZW50IHdpdGhpbiBhIHNldC4KKyAqCisgKiBAcGFyYW0geyp9IGNvbXBvbmVudCBB IGNvbXBvbmVudCB0aGF0IGNvdWxkIGNvbnRhaW4gYSBtYW51YWwga2V5LgorICogQHBhcmFtIHtu dW1iZXJ9IGluZGV4IEluZGV4IHRoYXQgaXMgdXNlZCBpZiBhIG1hbnVhbCBrZXkgaXMgbm90IHBy b3ZpZGVkLgorICogQHJldHVybiB7c3RyaW5nfQorICovCitmdW5jdGlvbiBnZXRDb21wb25lbnRL ZXkoY29tcG9uZW50LCBpbmRleCkgeworICAvLyBEbyBzb21lIHR5cGVjaGVja2luZyBoZXJlIHNp bmNlIHdlIGNhbGwgdGhpcyBibGluZGx5LiBXZSB3YW50IHRvIGVuc3VyZQorICAvLyB0aGF0IHdl IGRvbid0IGJsb2NrIHBvdGVudGlhbCBmdXR1cmUgRVMgQVBJcy4KKyAgaWYgKGNvbXBvbmVudCAm JiB0eXBlb2YgY29tcG9uZW50ID09PSAnb2JqZWN0JyAmJiBjb21wb25lbnQua2V5ICE9IG51bGwp IHsKKyAgICAvLyBFeHBsaWNpdCBrZXkKKyAgICByZXR1cm4gS2V5RXNjYXBlVXRpbHMuZXNjYXBl KGNvbXBvbmVudC5rZXkpOworICB9CisgIC8vIEltcGxpY2l0IGtleSBkZXRlcm1pbmVkIGJ5IHRo ZSBpbmRleCBpbiB0aGUgc2V0CisgIHJldHVybiBpbmRleC50b1N0cmluZygzNik7Cit9CisKKy8q KgorICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuCisgKiBA cGFyYW0geyFzdHJpbmd9IG5hbWVTb0ZhciBOYW1lIG9mIHRoZSBrZXkgcGF0aCBzbyBmYXIuCisg KiBAcGFyYW0geyFmdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgdG8gaW52b2tlIHdpdGggZWFj aCBjaGlsZCBmb3VuZC4KKyAqIEBwYXJhbSB7Pyp9IHRyYXZlcnNlQ29udGV4dCBVc2VkIHRvIHBh c3MgaW5mb3JtYXRpb24gdGhyb3VnaG91dCB0aGUgdHJhdmVyc2FsCisgKiBwcm9jZXNzLgorICog QHJldHVybiB7IW51bWJlcn0gVGhlIG51bWJlciBvZiBjaGlsZHJlbiBpbiB0aGlzIHN1YnRyZWUu CisgKi8KK2Z1bmN0aW9uIHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkcmVuLCBuYW1lU29G YXIsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpIHsKKyAgdmFyIHR5cGUgPSB0eXBlb2YgY2hp bGRyZW47CisKKyAgaWYgKHR5cGUgPT09ICd1bmRlZmluZWQnIHx8IHR5cGUgPT09ICdib29sZWFu JykgeworICAgIC8vIEFsbCBvZiB0aGUgYWJvdmUgYXJlIHBlcmNlaXZlZCBhcyBudWxsLgorICAg IGNoaWxkcmVuID0gbnVsbDsKKyAgfQorCisgIGlmIChjaGlsZHJlbiA9PT0gbnVsbCB8fCB0eXBl ID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAnbnVtYmVyJyB8fAorICAvLyBUaGUgZm9sbG93aW5n IGlzIGlubGluZWQgZnJvbSBSZWFjdEVsZW1lbnQuIFRoaXMgbWVhbnMgd2UgY2FuIG9wdGltaXpl CisgIC8vIHNvbWUgY2hlY2tzLiBSZWFjdCBGaWJlciBhbHNvIGlubGluZXMgdGhpcyBsb2dpYyBm b3Igc2ltaWxhciBwdXJwb3Nlcy4KKyAgdHlwZSA9PT0gJ29iamVjdCcgJiYgY2hpbGRyZW4uJCR0 eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSkgeworICAgIGNhbGxiYWNrKHRyYXZlcnNlQ29u dGV4dCwgY2hpbGRyZW4sCisgICAgLy8gSWYgaXQncyB0aGUgb25seSBjaGlsZCwgdHJlYXQgdGhl IG5hbWUgYXMgaWYgaXQgd2FzIHdyYXBwZWQgaW4gYW4gYXJyYXkKKyAgICAvLyBzbyB0aGF0IGl0 J3MgY29uc2lzdGVudCBpZiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIGdyb3dzLgorICAgIG5hbWVT b0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgKyBnZXRDb21wb25lbnRLZXkoY2hpbGRyZW4sIDApIDog bmFtZVNvRmFyKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHZhciBjaGlsZDsKKyAgdmFyIG5l eHROYW1lOworICB2YXIgc3VidHJlZUNvdW50ID0gMDsgLy8gQ291bnQgb2YgY2hpbGRyZW4gZm91 bmQgaW4gdGhlIGN1cnJlbnQgc3VidHJlZS4KKyAgdmFyIG5leHROYW1lUHJlZml4ID0gbmFtZVNv RmFyID09PSAnJyA/IFNFUEFSQVRPUiA6IG5hbWVTb0ZhciArIFNVQlNFUEFSQVRPUjsKKworICBp ZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNo aWxkcmVuLmxlbmd0aDsgaSsrKSB7CisgICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldOworICAgICAg bmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIGdldENvbXBvbmVudEtleShjaGlsZCwgaSk7Cisg ICAgICBzdWJ0cmVlQ291bnQgKz0gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGQsIG5leHRO YW1lLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAg dmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKGNoaWxkcmVuKTsKKyAgICBpZiAoaXRlcmF0 b3JGbikgeworICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKGNoaWxkcmVuKTsK KyAgICAgIHZhciBzdGVwOworICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IGNoaWxkcmVuLmVudHJp ZXMpIHsKKyAgICAgICAgdmFyIGlpID0gMDsKKyAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJh dG9yLm5leHQoKSkuZG9uZSkgeworICAgICAgICAgIGNoaWxkID0gc3RlcC52YWx1ZTsKKyAgICAg ICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkLCBp aSsrKTsKKyAgICAgICAgICBzdWJ0cmVlQ291bnQgKz0gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwo Y2hpbGQsIG5leHROYW1lLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KTsKKyAgICAgICAgfQor ICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9u JykgeworICAgICAgICAgIHZhciBtYXBzQXNDaGlsZHJlbkFkZGVuZHVtID0gJyc7CisgICAgICAg ICAgaWYgKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHsKKyAgICAgICAgICAgIHZhciBtYXBz QXNDaGlsZHJlbk93bmVyTmFtZSA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQuZ2V0TmFtZSgp OworICAgICAgICAgICAgaWYgKG1hcHNBc0NoaWxkcmVuT3duZXJOYW1lKSB7CisgICAgICAgICAg ICAgIG1hcHNBc0NoaWxkcmVuQWRkZW5kdW0gPSAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9m IGAnICsgbWFwc0FzQ2hpbGRyZW5Pd25lck5hbWUgKyAnYC4nOworICAgICAgICAgICAgfQorICAg ICAgICAgIH0KKyAgICAgICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJu aW5nKGRpZFdhcm5BYm91dE1hcHMsICdVc2luZyBNYXBzIGFzIGNoaWxkcmVuIGlzIG5vdCB5ZXQg ZnVsbHkgc3VwcG9ydGVkLiBJdCBpcyBhbiAnICsgJ2V4cGVyaW1lbnRhbCBmZWF0dXJlIHRoYXQg bWlnaHQgYmUgcmVtb3ZlZC4gQ29udmVydCBpdCB0byBhICcgKyAnc2VxdWVuY2UgLyBpdGVyYWJs ZSBvZiBrZXllZCBSZWFjdEVsZW1lbnRzIGluc3RlYWQuJXMnLCBtYXBzQXNDaGlsZHJlbkFkZGVu ZHVtKSA6IHZvaWQgMDsKKyAgICAgICAgICBkaWRXYXJuQWJvdXRNYXBzID0gdHJ1ZTsKKyAgICAg ICAgfQorICAgICAgICAvLyBJdGVyYXRvciB3aWxsIHByb3ZpZGUgZW50cnkgW2ssdl0gdHVwbGVz IHJhdGhlciB0aGFuIHZhbHVlcy4KKyAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5l eHQoKSkuZG9uZSkgeworICAgICAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7CisgICAgICAg ICAgaWYgKGVudHJ5KSB7CisgICAgICAgICAgICBjaGlsZCA9IGVudHJ5WzFdOworICAgICAgICAg ICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIEtleUVzY2FwZVV0aWxzLmVzY2FwZShlbnRy eVswXSkgKyBTVUJTRVBBUkFUT1IgKyBnZXRDb21wb25lbnRLZXkoY2hpbGQsIDApOworICAgICAg ICAgICAgc3VidHJlZUNvdW50ICs9IHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkLCBuZXh0 TmFtZSwgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCk7CisgICAgICAgICAgfQorICAgICAgICB9 CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0JykgeworICAgICAgdmFy IGFkZGVuZHVtID0gJyc7CisgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24n KSB7CisgICAgICAgIGFkZGVuZHVtID0gJyBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVj dGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5ICcgKyAnaW5zdGVhZCBvciB3cmFwIHRoZSBv YmplY3QgdXNpbmcgY3JlYXRlRnJhZ21lbnQob2JqZWN0KSBmcm9tIHRoZSAnICsgJ1JlYWN0IGFk ZC1vbnMuJzsKKyAgICAgICAgaWYgKGNoaWxkcmVuLl9pc1JlYWN0RWxlbWVudCkgeworICAgICAg ICAgIGFkZGVuZHVtID0gJyBJdCBsb29rcyBsaWtlIHlvdVwncmUgdXNpbmcgYW4gZWxlbWVudCBj cmVhdGVkIGJ5IGEgZGlmZmVyZW50ICcgKyAndmVyc2lvbiBvZiBSZWFjdC4gTWFrZSBzdXJlIHRv IHVzZSBvbmx5IG9uZSBjb3B5IG9mIFJlYWN0Lic7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFJl YWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHsKKyAgICAgICAgICB2YXIgbmFtZSA9IFJlYWN0Q3Vy cmVudE93bmVyLmN1cnJlbnQuZ2V0TmFtZSgpOworICAgICAgICAgIGlmIChuYW1lKSB7CisgICAg ICAgICAgICBhZGRlbmR1bSArPSAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFt ZSArICdgLic7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICB2YXIgY2hp bGRyZW5TdHJpbmcgPSBTdHJpbmcoY2hpbGRyZW4pOworICAgICAgIWZhbHNlID8gImRldmVsb3Bt ZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnT2JqZWN0cyBhcmUgbm90 IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQgKGZvdW5kOiAlcykuJXMnLCBjaGlsZHJlblN0cmluZyA9 PT0gJ1tvYmplY3QgT2JqZWN0XScgPyAnb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlz KGNoaWxkcmVuKS5qb2luKCcsICcpICsgJ30nIDogY2hpbGRyZW5TdHJpbmcsIGFkZGVuZHVtKSA6 IF9wcm9kSW52YXJpYW50KCczMScsIGNoaWxkcmVuU3RyaW5nID09PSAnW29iamVjdCBPYmplY3Rd JyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY2hpbGRyZW4pLmpvaW4oJywg JykgKyAnfScgOiBjaGlsZHJlblN0cmluZywgYWRkZW5kdW0pIDogdm9pZCAwOworICAgIH0KKyAg fQorCisgIHJldHVybiBzdWJ0cmVlQ291bnQ7Cit9CisKKy8qKgorICogVHJhdmVyc2VzIGNoaWxk cmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYCwgYnV0 CisgKiBtaWdodCBhbHNvIGJlIHNwZWNpZmllZCB0aHJvdWdoIGF0dHJpYnV0ZXM6CisgKgorICog LSBgdHJhdmVyc2VBbGxDaGlsZHJlbih0aGlzLnByb3BzLmNoaWxkcmVuLCAuLi4pYAorICogLSBg dHJhdmVyc2VBbGxDaGlsZHJlbih0aGlzLnByb3BzLmxlZnRQYW5lbENoaWxkcmVuLCAuLi4pYAor ICoKKyAqIFRoZSBgdHJhdmVyc2VDb250ZXh0YCBpcyBhbiBvcHRpb25hbCBhcmd1bWVudCB0aGF0 IGlzIHBhc3NlZCB0aHJvdWdoIHRoZQorICogZW50aXJlIHRyYXZlcnNhbC4gSXQgY2FuIGJlIHVz ZWQgdG8gc3RvcmUgYWNjdW11bGF0aW9ucyBvciBhbnl0aGluZyBlbHNlIHRoYXQKKyAqIHRoZSBj YWxsYmFjayBtaWdodCBmaW5kIHJlbGV2YW50LgorICoKKyAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVu IENoaWxkcmVuIHRyZWUgb2JqZWN0LgorICogQHBhcmFtIHshZnVuY3Rpb259IGNhbGxiYWNrIFRv IGludm9rZSB1cG9uIHRyYXZlcnNpbmcgZWFjaCBjaGlsZC4KKyAqIEBwYXJhbSB7Pyp9IHRyYXZl cnNlQ29udGV4dCBDb250ZXh0IGZvciB0cmF2ZXJzYWwuCisgKiBAcmV0dXJuIHshbnVtYmVyfSBU aGUgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHRoaXMgc3VidHJlZS4KKyAqLworZnVuY3Rpb24gdHJh dmVyc2VBbGxDaGlsZHJlbihjaGlsZHJlbiwgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCkgewor ICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJu IHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkcmVuLCAnJywgY2FsbGJhY2ssIHRyYXZlcnNl Q29udGV4dCk7Cit9CisKK21vZHVsZS5leHBvcnRzID0gdHJhdmVyc2VBbGxDaGlsZHJlbjsKK30s eyIxMDciOjEwNywiMTE2IjoxMTYsIjEyMyI6MTIzLCIxNDAiOjE0MCwiMTQ3IjoxNDcsIjIyIjoy MiwiNDgiOjQ4fV0sMTIxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgor ICogQ29weXJpZ2h0IDIwMTUtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMg cmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUg QlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJv b3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAq IG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhl IHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfYXNzaWdu ID0gX2RlcmVxXygxNDgpOworCit2YXIgZW1wdHlGdW5jdGlvbiA9IF9kZXJlcV8oMTMyKTsKK3Zh ciB3YXJuaW5nID0gX2RlcmVxXygxNDcpOworCit2YXIgdmFsaWRhdGVET01OZXN0aW5nID0gZW1w dHlGdW5jdGlvbjsKKworaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAv LyBUaGlzIHZhbGlkYXRpb24gY29kZSB3YXMgd3JpdHRlbiBiYXNlZCBvbiB0aGUgSFRNTDUgcGFy c2luZyBzcGVjOgorICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9z eW50YXguaHRtbCNoYXMtYW4tZWxlbWVudC1pbi1zY29wZQorICAvLworICAvLyBOb3RlOiB0aGlz IGRvZXMgbm90IGNhdGNoIGFsbCBpbnZhbGlkIG5lc3RpbmcsIG5vciBkb2VzIGl0IHRyeSB0byAo YXMgaXQncworICAvLyBub3QgY2xlYXIgd2hhdCBwcmFjdGljYWwgYmVuZWZpdCBkb2luZyBzbyBw cm92aWRlcyk7IGluc3RlYWQsIHdlIHdhcm4gb25seQorICAvLyBmb3IgY2FzZXMgd2hlcmUgdGhl IHBhcnNlciB3aWxsIGdpdmUgYSBwYXJzZSB0cmVlIGRpZmZlcmluZyBmcm9tIHdoYXQgUmVhY3QK KyAgLy8gaW50ZW5kZWQuIEZvciBleGFtcGxlLCA8Yj48ZGl2PjwvZGl2PjwvYj4gaXMgaW52YWxp ZCBidXQgd2UgZG9uJ3Qgd2FybgorICAvLyBiZWNhdXNlIGl0IHN0aWxsIHBhcnNlcyBjb3JyZWN0 bHk7IHdlIGRvIHdhcm4gZm9yIG90aGVyIGNhc2VzIGxpa2UgbmVzdGVkCisgIC8vIDxwPiB0YWdz IHdoZXJlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY29uZCBlbGVtZW50IGltcGxpY2l0bHkgY2xv c2VzIHRoZQorICAvLyBmaXJzdCwgY2F1c2luZyBhIGNvbmZ1c2luZyBtZXNzLgorCisgIC8vIGh0 dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3NwZWNpYWwK KyAgdmFyIHNwZWNpYWxUYWdzID0gWydhZGRyZXNzJywgJ2FwcGxldCcsICdhcmVhJywgJ2FydGlj bGUnLCAnYXNpZGUnLCAnYmFzZScsICdiYXNlZm9udCcsICdiZ3NvdW5kJywgJ2Jsb2NrcXVvdGUn LCAnYm9keScsICdicicsICdidXR0b24nLCAnY2FwdGlvbicsICdjZW50ZXInLCAnY29sJywgJ2Nv bGdyb3VwJywgJ2RkJywgJ2RldGFpbHMnLCAnZGlyJywgJ2RpdicsICdkbCcsICdkdCcsICdlbWJl ZCcsICdmaWVsZHNldCcsICdmaWdjYXB0aW9uJywgJ2ZpZ3VyZScsICdmb290ZXInLCAnZm9ybScs ICdmcmFtZScsICdmcmFtZXNldCcsICdoMScsICdoMicsICdoMycsICdoNCcsICdoNScsICdoNics ICdoZWFkJywgJ2hlYWRlcicsICdoZ3JvdXAnLCAnaHInLCAnaHRtbCcsICdpZnJhbWUnLCAnaW1n JywgJ2lucHV0JywgJ2lzaW5kZXgnLCAnbGknLCAnbGluaycsICdsaXN0aW5nJywgJ21haW4nLCAn bWFycXVlZScsICdtZW51JywgJ21lbnVpdGVtJywgJ21ldGEnLCAnbmF2JywgJ25vZW1iZWQnLCAn bm9mcmFtZXMnLCAnbm9zY3JpcHQnLCAnb2JqZWN0JywgJ29sJywgJ3AnLCAncGFyYW0nLCAncGxh aW50ZXh0JywgJ3ByZScsICdzY3JpcHQnLCAnc2VjdGlvbicsICdzZWxlY3QnLCAnc291cmNlJywg J3N0eWxlJywgJ3N1bW1hcnknLCAndGFibGUnLCAndGJvZHknLCAndGQnLCAndGVtcGxhdGUnLCAn dGV4dGFyZWEnLCAndGZvb3QnLCAndGgnLCAndGhlYWQnLCAndGl0bGUnLCAndHInLCAndHJhY2sn LCAndWwnLCAnd2JyJywgJ3htcCddOworCisgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5v cmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLXNjb3BlCisgIHZhciBp blNjb3BlVGFncyA9IFsnYXBwbGV0JywgJ2NhcHRpb24nLCAnaHRtbCcsICd0YWJsZScsICd0ZCcs ICd0aCcsICdtYXJxdWVlJywgJ29iamVjdCcsICd0ZW1wbGF0ZScsCisKKyAgLy8gaHR0cHM6Ly9o dG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaHRtbC1pbnRlZ3JhdGlv bi1wb2ludAorICAvLyBUT0RPOiBEaXN0aW5ndWlzaCBieSBuYW1lc3BhY2UgaGVyZSAtLSBmb3Ig PHRpdGxlPiwgaW5jbHVkaW5nIGl0IGhlcmUKKyAgLy8gZXJycyBvbiB0aGUgc2lkZSBvZiBmZXdl ciB3YXJuaW5ncworICAnZm9yZWlnbk9iamVjdCcsICdkZXNjJywgJ3RpdGxlJ107CisKKyAgLy8g aHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFu LWVsZW1lbnQtaW4tYnV0dG9uLXNjb3BlCisgIHZhciBidXR0b25TY29wZVRhZ3MgPSBpblNjb3Bl VGFncy5jb25jYXQoWydidXR0b24nXSk7CisKKyAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdn Lm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjZ2VuZXJhdGUtaW1wbGllZC1lbmQtdGFncworICB2 YXIgaW1wbGllZEVuZFRhZ3MgPSBbJ2RkJywgJ2R0JywgJ2xpJywgJ29wdGlvbicsICdvcHRncm91 cCcsICdwJywgJ3JwJywgJ3J0J107CisKKyAgdmFyIGVtcHR5QW5jZXN0b3JJbmZvID0geworICAg IGN1cnJlbnQ6IG51bGwsCisKKyAgICBmb3JtVGFnOiBudWxsLAorICAgIGFUYWdJblNjb3BlOiBu dWxsLAorICAgIGJ1dHRvblRhZ0luU2NvcGU6IG51bGwsCisgICAgbm9iclRhZ0luU2NvcGU6IG51 bGwsCisgICAgcFRhZ0luQnV0dG9uU2NvcGU6IG51bGwsCisKKyAgICBsaXN0SXRlbVRhZ0F1dG9j bG9zaW5nOiBudWxsLAorICAgIGRsSXRlbVRhZ0F1dG9jbG9zaW5nOiBudWxsCisgIH07CisKKyAg dmFyIHVwZGF0ZWRBbmNlc3RvckluZm8gPSBmdW5jdGlvbiAob2xkSW5mbywgdGFnLCBpbnN0YW5j ZSkgeworICAgIHZhciBhbmNlc3RvckluZm8gPSBfYXNzaWduKHt9LCBvbGRJbmZvIHx8IGVtcHR5 QW5jZXN0b3JJbmZvKTsKKyAgICB2YXIgaW5mbyA9IHsgdGFnOiB0YWcsIGluc3RhbmNlOiBpbnN0 YW5jZSB9OworCisgICAgaWYgKGluU2NvcGVUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEpIHsKKyAg ICAgIGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZSA9IG51bGw7CisgICAgICBhbmNlc3RvckluZm8u YnV0dG9uVGFnSW5TY29wZSA9IG51bGw7CisgICAgICBhbmNlc3RvckluZm8ubm9iclRhZ0luU2Nv cGUgPSBudWxsOworICAgIH0KKyAgICBpZiAoYnV0dG9uU2NvcGVUYWdzLmluZGV4T2YodGFnKSAh PT0gLTEpIHsKKyAgICAgIGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZSA9IG51bGw7Cisg ICAgfQorCisgICAgLy8gU2VlIHJ1bGVzIGZvciAnbGknLCAnZGQnLCAnZHQnIHN0YXJ0IHRhZ3Mg aW4KKyAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXgu aHRtbCNwYXJzaW5nLW1haW4taW5ib2R5CisgICAgaWYgKHNwZWNpYWxUYWdzLmluZGV4T2YodGFn KSAhPT0gLTEgJiYgdGFnICE9PSAnYWRkcmVzcycgJiYgdGFnICE9PSAnZGl2JyAmJiB0YWcgIT09 ICdwJykgeworICAgICAgYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3NpbmcgPSBudWxs OworICAgICAgYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nID0gbnVsbDsKKyAgICB9 CisKKyAgICBhbmNlc3RvckluZm8uY3VycmVudCA9IGluZm87CisKKyAgICBpZiAodGFnID09PSAn Zm9ybScpIHsKKyAgICAgIGFuY2VzdG9ySW5mby5mb3JtVGFnID0gaW5mbzsKKyAgICB9CisgICAg aWYgKHRhZyA9PT0gJ2EnKSB7CisgICAgICBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGUgPSBpbmZv OworICAgIH0KKyAgICBpZiAodGFnID09PSAnYnV0dG9uJykgeworICAgICAgYW5jZXN0b3JJbmZv LmJ1dHRvblRhZ0luU2NvcGUgPSBpbmZvOworICAgIH0KKyAgICBpZiAodGFnID09PSAnbm9icicp IHsKKyAgICAgIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZSA9IGluZm87CisgICAgfQorICAg IGlmICh0YWcgPT09ICdwJykgeworICAgICAgYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3Bl ID0gaW5mbzsKKyAgICB9CisgICAgaWYgKHRhZyA9PT0gJ2xpJykgeworICAgICAgYW5jZXN0b3JJ bmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3NpbmcgPSBpbmZvOworICAgIH0KKyAgICBpZiAodGFnID09 PSAnZGQnIHx8IHRhZyA9PT0gJ2R0JykgeworICAgICAgYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1 dG9jbG9zaW5nID0gaW5mbzsKKyAgICB9CisKKyAgICByZXR1cm4gYW5jZXN0b3JJbmZvOworICB9 OworCisgIC8qKgorICAgKiBSZXR1cm5zIHdoZXRoZXIKKyAgICovCisgIHZhciBpc1RhZ1ZhbGlk V2l0aFBhcmVudCA9IGZ1bmN0aW9uICh0YWcsIHBhcmVudFRhZykgeworICAgIC8vIEZpcnN0LCBs ZXQncyBjaGVjayBpZiB3ZSdyZSBpbiBhbiB1bnVzdWFsIHBhcnNpbmcgbW9kZS4uLgorICAgIHN3 aXRjaCAocGFyZW50VGFnKSB7CisgICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3Jn L211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5zZWxlY3QKKyAgICAgIGNhc2Ug J3NlbGVjdCc6CisgICAgICAgIHJldHVybiB0YWcgPT09ICdvcHRpb24nIHx8IHRhZyA9PT0gJ29w dGdyb3VwJyB8fCB0YWcgPT09ICcjdGV4dCc7CisgICAgICBjYXNlICdvcHRncm91cCc6CisgICAg ICAgIHJldHVybiB0YWcgPT09ICdvcHRpb24nIHx8IHRhZyA9PT0gJyN0ZXh0JzsKKyAgICAgIC8v IFN0cmljdGx5IHNwZWFraW5nLCBzZWVpbmcgYW4gPG9wdGlvbj4gZG9lc24ndCBtZWFuIHdlJ3Jl IGluIGEgPHNlbGVjdD4KKyAgICAgIC8vIGJ1dAorICAgICAgY2FzZSAnb3B0aW9uJzoKKyAgICAg ICAgcmV0dXJuIHRhZyA9PT0gJyN0ZXh0JzsKKworICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMu d2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGQKKyAgICAg IC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3Bh cnNpbmctbWFpbi1pbmNhcHRpb24KKyAgICAgIC8vIE5vIHNwZWNpYWwgYmVoYXZpb3Igc2luY2Ug dGhlc2UgcnVsZXMgZmFsbCBiYWNrIHRvICJpbiBib2R5IiBtb2RlIGZvcgorICAgICAgLy8gYWxs IGV4Y2VwdCBzcGVjaWFsIHRhYmxlIG5vZGVzIHdoaWNoIGNhdXNlIGJhZCBwYXJzaW5nIGJlaGF2 aW9yIGFueXdheS4KKworICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0 aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludHIKKyAgICAgIGNhc2UgJ3RyJzoKKyAg ICAgICAgcmV0dXJuIHRhZyA9PT0gJ3RoJyB8fCB0YWcgPT09ICd0ZCcgfHwgdGFnID09PSAnc3R5 bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnOworCisgICAgICAv LyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJz aW5nLW1haW4taW50Ym9keQorICAgICAgY2FzZSAndGJvZHknOgorICAgICAgY2FzZSAndGhlYWQn OgorICAgICAgY2FzZSAndGZvb3QnOgorICAgICAgICByZXR1cm4gdGFnID09PSAndHInIHx8IHRh ZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJzsK KworICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4 Lmh0bWwjcGFyc2luZy1tYWluLWluY29sZ3JvdXAKKyAgICAgIGNhc2UgJ2NvbGdyb3VwJzoKKyAg ICAgICAgcmV0dXJuIHRhZyA9PT0gJ2NvbCcgfHwgdGFnID09PSAndGVtcGxhdGUnOworCisgICAg ICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNw YXJzaW5nLW1haW4taW50YWJsZQorICAgICAgY2FzZSAndGFibGUnOgorICAgICAgICByZXR1cm4g dGFnID09PSAnY2FwdGlvbicgfHwgdGFnID09PSAnY29sZ3JvdXAnIHx8IHRhZyA9PT0gJ3Rib2R5 JyB8fCB0YWcgPT09ICd0Zm9vdCcgfHwgdGFnID09PSAndGhlYWQnIHx8IHRhZyA9PT0gJ3N0eWxl JyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJzsKKworICAgICAgLy8g aHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2lu Zy1tYWluLWluaGVhZAorICAgICAgY2FzZSAnaGVhZCc6CisgICAgICAgIHJldHVybiB0YWcgPT09 ICdiYXNlJyB8fCB0YWcgPT09ICdiYXNlZm9udCcgfHwgdGFnID09PSAnYmdzb3VuZCcgfHwgdGFn ID09PSAnbGluaycgfHwgdGFnID09PSAnbWV0YScgfHwgdGFnID09PSAndGl0bGUnIHx8IHRhZyA9 PT0gJ25vc2NyaXB0JyB8fCB0YWcgPT09ICdub2ZyYW1lcycgfHwgdGFnID09PSAnc3R5bGUnIHx8 IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnOworCisgICAgICAvLyBodHRw czovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zZW1hbnRpY3MuaHRtbCN0aGUtaHRt bC1lbGVtZW50CisgICAgICBjYXNlICdodG1sJzoKKyAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2hl YWQnIHx8IHRhZyA9PT0gJ2JvZHknOworICAgICAgY2FzZSAnI2RvY3VtZW50JzoKKyAgICAgICAg cmV0dXJuIHRhZyA9PT0gJ2h0bWwnOworICAgIH0KKworICAgIC8vIFByb2JhYmx5IGluIHRoZSAi aW4gYm9keSIgcGFyc2luZyBtb2RlLCBzbyB3ZSBvdXRsYXcgb25seSB0YWcgY29tYm9zCisgICAg Ly8gd2hlcmUgdGhlIHBhcnNpbmcgcnVsZXMgY2F1c2UgaW1wbGljaXQgb3BlbnMgb3IgY2xvc2Vz IHRvIGJlIGFkZGVkLgorICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlw YWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmJvZHkKKyAgICBzd2l0Y2ggKHRhZykgewor ICAgICAgY2FzZSAnaDEnOgorICAgICAgY2FzZSAnaDInOgorICAgICAgY2FzZSAnaDMnOgorICAg ICAgY2FzZSAnaDQnOgorICAgICAgY2FzZSAnaDUnOgorICAgICAgY2FzZSAnaDYnOgorICAgICAg ICByZXR1cm4gcGFyZW50VGFnICE9PSAnaDEnICYmIHBhcmVudFRhZyAhPT0gJ2gyJyAmJiBwYXJl bnRUYWcgIT09ICdoMycgJiYgcGFyZW50VGFnICE9PSAnaDQnICYmIHBhcmVudFRhZyAhPT0gJ2g1 JyAmJiBwYXJlbnRUYWcgIT09ICdoNic7CisKKyAgICAgIGNhc2UgJ3JwJzoKKyAgICAgIGNhc2Ug J3J0JzoKKyAgICAgICAgcmV0dXJuIGltcGxpZWRFbmRUYWdzLmluZGV4T2YocGFyZW50VGFnKSA9 PT0gLTE7CisKKyAgICAgIGNhc2UgJ2JvZHknOgorICAgICAgY2FzZSAnY2FwdGlvbic6CisgICAg ICBjYXNlICdjb2wnOgorICAgICAgY2FzZSAnY29sZ3JvdXAnOgorICAgICAgY2FzZSAnZnJhbWUn OgorICAgICAgY2FzZSAnaGVhZCc6CisgICAgICBjYXNlICdodG1sJzoKKyAgICAgIGNhc2UgJ3Ri b2R5JzoKKyAgICAgIGNhc2UgJ3RkJzoKKyAgICAgIGNhc2UgJ3Rmb290JzoKKyAgICAgIGNhc2Ug J3RoJzoKKyAgICAgIGNhc2UgJ3RoZWFkJzoKKyAgICAgIGNhc2UgJ3RyJzoKKyAgICAgICAgLy8g VGhlc2UgdGFncyBhcmUgb25seSB2YWxpZCB3aXRoIGEgZmV3IHBhcmVudHMgdGhhdCBoYXZlIHNw ZWNpYWwgY2hpbGQKKyAgICAgICAgLy8gcGFyc2luZyBydWxlcyAtLSBpZiB3ZSdyZSBkb3duIGhl cmUsIHRoZW4gbm9uZSBvZiB0aG9zZSBtYXRjaGVkIGFuZAorICAgICAgICAvLyBzbyB3ZSBhbGxv dyBpdCBvbmx5IGlmIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgcGFyZW50IGlzLCBhcyBhbGwgb3Ro ZXIKKyAgICAgICAgLy8gY2FzZXMgYXJlIGludmFsaWQuCisgICAgICAgIHJldHVybiBwYXJlbnRU YWcgPT0gbnVsbDsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfTsKKworICAvKioKKyAg ICogUmV0dXJucyB3aGV0aGVyCisgICAqLworICB2YXIgZmluZEludmFsaWRBbmNlc3RvckZvclRh ZyA9IGZ1bmN0aW9uICh0YWcsIGFuY2VzdG9ySW5mbykgeworICAgIHN3aXRjaCAodGFnKSB7Cisg ICAgICBjYXNlICdhZGRyZXNzJzoKKyAgICAgIGNhc2UgJ2FydGljbGUnOgorICAgICAgY2FzZSAn YXNpZGUnOgorICAgICAgY2FzZSAnYmxvY2txdW90ZSc6CisgICAgICBjYXNlICdjZW50ZXInOgor ICAgICAgY2FzZSAnZGV0YWlscyc6CisgICAgICBjYXNlICdkaWFsb2cnOgorICAgICAgY2FzZSAn ZGlyJzoKKyAgICAgIGNhc2UgJ2Rpdic6CisgICAgICBjYXNlICdkbCc6CisgICAgICBjYXNlICdm aWVsZHNldCc6CisgICAgICBjYXNlICdmaWdjYXB0aW9uJzoKKyAgICAgIGNhc2UgJ2ZpZ3VyZSc6 CisgICAgICBjYXNlICdmb290ZXInOgorICAgICAgY2FzZSAnaGVhZGVyJzoKKyAgICAgIGNhc2Ug J2hncm91cCc6CisgICAgICBjYXNlICdtYWluJzoKKyAgICAgIGNhc2UgJ21lbnUnOgorICAgICAg Y2FzZSAnbmF2JzoKKyAgICAgIGNhc2UgJ29sJzoKKyAgICAgIGNhc2UgJ3AnOgorICAgICAgY2Fz ZSAnc2VjdGlvbic6CisgICAgICBjYXNlICdzdW1tYXJ5JzoKKyAgICAgIGNhc2UgJ3VsJzoKKwor ICAgICAgY2FzZSAncHJlJzoKKyAgICAgIGNhc2UgJ2xpc3RpbmcnOgorCisgICAgICBjYXNlICd0 YWJsZSc6CisKKyAgICAgIGNhc2UgJ2hyJzoKKworICAgICAgY2FzZSAneG1wJzoKKworICAgICAg Y2FzZSAnaDEnOgorICAgICAgY2FzZSAnaDInOgorICAgICAgY2FzZSAnaDMnOgorICAgICAgY2Fz ZSAnaDQnOgorICAgICAgY2FzZSAnaDUnOgorICAgICAgY2FzZSAnaDYnOgorICAgICAgICByZXR1 cm4gYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlOworCisgICAgICBjYXNlICdmb3JtJzoK KyAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5mb3JtVGFnIHx8IGFuY2VzdG9ySW5mby5wVGFn SW5CdXR0b25TY29wZTsKKworICAgICAgY2FzZSAnbGknOgorICAgICAgICByZXR1cm4gYW5jZXN0 b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3Npbmc7CisKKyAgICAgIGNhc2UgJ2RkJzoKKyAgICAg IGNhc2UgJ2R0JzoKKyAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xv c2luZzsKKworICAgICAgY2FzZSAnYnV0dG9uJzoKKyAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5m by5idXR0b25UYWdJblNjb3BlOworCisgICAgICBjYXNlICdhJzoKKyAgICAgICAgLy8gU3BlYyBz YXlzIHNvbWV0aGluZyBhYm91dCBzdG9yaW5nIGEgbGlzdCBvZiBtYXJrZXJzLCBidXQgaXQgc291 bmRzCisgICAgICAgIC8vIGVxdWl2YWxlbnQgdG8gdGhpcyBjaGVjay4KKyAgICAgICAgcmV0dXJu IGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZTsKKworICAgICAgY2FzZSAnbm9icic6CisgICAgICAg IHJldHVybiBhbmNlc3RvckluZm8ubm9iclRhZ0luU2NvcGU7CisgICAgfQorCisgICAgcmV0dXJu IG51bGw7CisgIH07CisKKyAgLyoqCisgICAqIEdpdmVuIGEgUmVhY3RDb21wb3NpdGVDb21wb25l bnQgaW5zdGFuY2UsIHJldHVybiBhIGxpc3Qgb2YgaXRzIHJlY3Vyc2l2ZQorICAgKiBvd25lcnMs IHN0YXJ0aW5nIGF0IHRoZSByb290IGFuZCBlbmRpbmcgd2l0aCB0aGUgaW5zdGFuY2UgaXRzZWxm LgorICAgKi8KKyAgdmFyIGZpbmRPd25lclN0YWNrID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7Cisg ICAgaWYgKCFpbnN0YW5jZSkgeworICAgICAgcmV0dXJuIFtdOworICAgIH0KKworICAgIHZhciBz dGFjayA9IFtdOworICAgIGRvIHsKKyAgICAgIHN0YWNrLnB1c2goaW5zdGFuY2UpOworICAgIH0g d2hpbGUgKGluc3RhbmNlID0gaW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50Ll9vd25lcik7CisgICAg c3RhY2sucmV2ZXJzZSgpOworICAgIHJldHVybiBzdGFjazsKKyAgfTsKKworICB2YXIgZGlkV2Fy biA9IHt9OworCisgIHZhbGlkYXRlRE9NTmVzdGluZyA9IGZ1bmN0aW9uIChjaGlsZFRhZywgY2hp bGRUZXh0LCBjaGlsZEluc3RhbmNlLCBhbmNlc3RvckluZm8pIHsKKyAgICBhbmNlc3RvckluZm8g PSBhbmNlc3RvckluZm8gfHwgZW1wdHlBbmNlc3RvckluZm87CisgICAgdmFyIHBhcmVudEluZm8g PSBhbmNlc3RvckluZm8uY3VycmVudDsKKyAgICB2YXIgcGFyZW50VGFnID0gcGFyZW50SW5mbyAm JiBwYXJlbnRJbmZvLnRhZzsKKworICAgIGlmIChjaGlsZFRleHQgIT0gbnVsbCkgeworICAgICAg ImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhjaGlsZFRhZyA9PSBudWxs LCAndmFsaWRhdGVET01OZXN0aW5nOiB3aGVuIGNoaWxkVGV4dCBpcyBwYXNzZWQsIGNoaWxkVGFn IHNob3VsZCBiZSBudWxsJykgOiB2b2lkIDA7CisgICAgICBjaGlsZFRhZyA9ICcjdGV4dCc7Cisg ICAgfQorCisgICAgdmFyIGludmFsaWRQYXJlbnQgPSBpc1RhZ1ZhbGlkV2l0aFBhcmVudChjaGls ZFRhZywgcGFyZW50VGFnKSA/IG51bGwgOiBwYXJlbnRJbmZvOworICAgIHZhciBpbnZhbGlkQW5j ZXN0b3IgPSBpbnZhbGlkUGFyZW50ID8gbnVsbCA6IGZpbmRJbnZhbGlkQW5jZXN0b3JGb3JUYWco Y2hpbGRUYWcsIGFuY2VzdG9ySW5mbyk7CisgICAgdmFyIHByb2JsZW1hdGljID0gaW52YWxpZFBh cmVudCB8fCBpbnZhbGlkQW5jZXN0b3I7CisKKyAgICBpZiAocHJvYmxlbWF0aWMpIHsKKyAgICAg IHZhciBhbmNlc3RvclRhZyA9IHByb2JsZW1hdGljLnRhZzsKKyAgICAgIHZhciBhbmNlc3Rvcklu c3RhbmNlID0gcHJvYmxlbWF0aWMuaW5zdGFuY2U7CisKKyAgICAgIHZhciBjaGlsZE93bmVyID0g Y2hpbGRJbnN0YW5jZSAmJiBjaGlsZEluc3RhbmNlLl9jdXJyZW50RWxlbWVudC5fb3duZXI7Cisg ICAgICB2YXIgYW5jZXN0b3JPd25lciA9IGFuY2VzdG9ySW5zdGFuY2UgJiYgYW5jZXN0b3JJbnN0 YW5jZS5fY3VycmVudEVsZW1lbnQuX293bmVyOworCisgICAgICB2YXIgY2hpbGRPd25lcnMgPSBm aW5kT3duZXJTdGFjayhjaGlsZE93bmVyKTsKKyAgICAgIHZhciBhbmNlc3Rvck93bmVycyA9IGZp bmRPd25lclN0YWNrKGFuY2VzdG9yT3duZXIpOworCisgICAgICB2YXIgbWluU3RhY2tMZW4gPSBN YXRoLm1pbihjaGlsZE93bmVycy5sZW5ndGgsIGFuY2VzdG9yT3duZXJzLmxlbmd0aCk7CisgICAg ICB2YXIgaTsKKworICAgICAgdmFyIGRlZXBlc3RDb21tb24gPSAtMTsKKyAgICAgIGZvciAoaSA9 IDA7IGkgPCBtaW5TdGFja0xlbjsgaSsrKSB7CisgICAgICAgIGlmIChjaGlsZE93bmVyc1tpXSA9 PT0gYW5jZXN0b3JPd25lcnNbaV0pIHsKKyAgICAgICAgICBkZWVwZXN0Q29tbW9uID0gaTsKKyAg ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisg ICAgICB2YXIgVU5LTk9XTiA9ICcodW5rbm93biknOworICAgICAgdmFyIGNoaWxkT3duZXJOYW1l cyA9IGNoaWxkT3duZXJzLnNsaWNlKGRlZXBlc3RDb21tb24gKyAxKS5tYXAoZnVuY3Rpb24gKGlu c3QpIHsKKyAgICAgICAgcmV0dXJuIGluc3QuZ2V0TmFtZSgpIHx8IFVOS05PV047CisgICAgICB9 KTsKKyAgICAgIHZhciBhbmNlc3Rvck93bmVyTmFtZXMgPSBhbmNlc3Rvck93bmVycy5zbGljZShk ZWVwZXN0Q29tbW9uICsgMSkubWFwKGZ1bmN0aW9uIChpbnN0KSB7CisgICAgICAgIHJldHVybiBp bnN0LmdldE5hbWUoKSB8fCBVTktOT1dOOworICAgICAgfSk7CisgICAgICB2YXIgb3duZXJJbmZv ID0gW10uY29uY2F0KAorICAgICAgLy8gSWYgdGhlIHBhcmVudCBhbmQgY2hpbGQgaW5zdGFuY2Vz IGhhdmUgYSBjb21tb24gb3duZXIgYW5jZXN0b3IsIHN0YXJ0CisgICAgICAvLyB3aXRoIHRoYXQg LS0gb3RoZXJ3aXNlIHdlIGp1c3Qgc3RhcnQgd2l0aCB0aGUgcGFyZW50J3Mgb3duZXJzLgorICAg ICAgZGVlcGVzdENvbW1vbiAhPT0gLTEgPyBjaGlsZE93bmVyc1tkZWVwZXN0Q29tbW9uXS5nZXRO YW1lKCkgfHwgVU5LTk9XTiA6IFtdLCBhbmNlc3Rvck93bmVyTmFtZXMsIGFuY2VzdG9yVGFnLAor ICAgICAgLy8gSWYgd2UncmUgd2FybmluZyBhYm91dCBhbiBpbnZhbGlkIChub24tcGFyZW50KSBh bmNlc3RyeSwgYWRkICcuLi4nCisgICAgICBpbnZhbGlkQW5jZXN0b3IgPyBbJy4uLiddIDogW10s IGNoaWxkT3duZXJOYW1lcywgY2hpbGRUYWcpLmpvaW4oJyA+ICcpOworCisgICAgICB2YXIgd2Fy bktleSA9ICEhaW52YWxpZFBhcmVudCArICd8JyArIGNoaWxkVGFnICsgJ3wnICsgYW5jZXN0b3JU YWcgKyAnfCcgKyBvd25lckluZm87CisgICAgICBpZiAoZGlkV2Fyblt3YXJuS2V5XSkgeworICAg ICAgICByZXR1cm47CisgICAgICB9CisgICAgICBkaWRXYXJuW3dhcm5LZXldID0gdHJ1ZTsKKwor ICAgICAgdmFyIHRhZ0Rpc3BsYXlOYW1lID0gY2hpbGRUYWc7CisgICAgICB2YXIgd2hpdGVzcGFj ZUluZm8gPSAnJzsKKyAgICAgIGlmIChjaGlsZFRhZyA9PT0gJyN0ZXh0JykgeworICAgICAgICBp ZiAoL1xTLy50ZXN0KGNoaWxkVGV4dCkpIHsKKyAgICAgICAgICB0YWdEaXNwbGF5TmFtZSA9ICdU ZXh0IG5vZGVzJzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0YWdEaXNwbGF5TmFtZSA9 ICdXaGl0ZXNwYWNlIHRleHQgbm9kZXMnOworICAgICAgICAgIHdoaXRlc3BhY2VJbmZvID0gJyBN YWtlIHN1cmUgeW91IGRvblwndCBoYXZlIGFueSBleHRyYSB3aGl0ZXNwYWNlIGJldHdlZW4gdGFn cyBvbiAnICsgJ2VhY2ggbGluZSBvZiB5b3VyIHNvdXJjZSBjb2RlLic7CisgICAgICAgIH0KKyAg ICAgIH0gZWxzZSB7CisgICAgICAgIHRhZ0Rpc3BsYXlOYW1lID0gJzwnICsgY2hpbGRUYWcgKyAn Pic7CisgICAgICB9CisKKyAgICAgIGlmIChpbnZhbGlkUGFyZW50KSB7CisgICAgICAgIHZhciBp bmZvID0gJyc7CisgICAgICAgIGlmIChhbmNlc3RvclRhZyA9PT0gJ3RhYmxlJyAmJiBjaGlsZFRh ZyA9PT0gJ3RyJykgeworICAgICAgICAgIGluZm8gKz0gJyBBZGQgYSA8dGJvZHk+IHRvIHlvdXIg Y29kZSB0byBtYXRjaCB0aGUgRE9NIHRyZWUgZ2VuZXJhdGVkIGJ5ICcgKyAndGhlIGJyb3dzZXIu JzsKKyAgICAgICAgfQorICAgICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3 YXJuaW5nKGZhbHNlLCAndmFsaWRhdGVET01OZXN0aW5nKC4uLik6ICVzIGNhbm5vdCBhcHBlYXIg YXMgYSBjaGlsZCBvZiA8JXM+LiVzICcgKyAnU2VlICVzLiVzJywgdGFnRGlzcGxheU5hbWUsIGFu Y2VzdG9yVGFnLCB3aGl0ZXNwYWNlSW5mbywgb3duZXJJbmZvLCBpbmZvKSA6IHZvaWQgMDsKKyAg ICAgIH0gZWxzZSB7CisgICAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdh cm5pbmcoZmFsc2UsICd2YWxpZGF0ZURPTU5lc3RpbmcoLi4uKTogJXMgY2Fubm90IGFwcGVhciBh cyBhIGRlc2NlbmRhbnQgb2YgJyArICc8JXM+LiBTZWUgJXMuJywgdGFnRGlzcGxheU5hbWUsIGFu Y2VzdG9yVGFnLCBvd25lckluZm8pIDogdm9pZCAwOworICAgICAgfQorICAgIH0KKyAgfTsKKwor ICB2YWxpZGF0ZURPTU5lc3RpbmcudXBkYXRlZEFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3Rv ckluZm87CisKKyAgLy8gRm9yIHRlc3RpbmcKKyAgdmFsaWRhdGVET01OZXN0aW5nLmlzVGFnVmFs aWRJbkNvbnRleHQgPSBmdW5jdGlvbiAodGFnLCBhbmNlc3RvckluZm8pIHsKKyAgICBhbmNlc3Rv ckluZm8gPSBhbmNlc3RvckluZm8gfHwgZW1wdHlBbmNlc3RvckluZm87CisgICAgdmFyIHBhcmVu dEluZm8gPSBhbmNlc3RvckluZm8uY3VycmVudDsKKyAgICB2YXIgcGFyZW50VGFnID0gcGFyZW50 SW5mbyAmJiBwYXJlbnRJbmZvLnRhZzsKKyAgICByZXR1cm4gaXNUYWdWYWxpZFdpdGhQYXJlbnQo dGFnLCBwYXJlbnRUYWcpICYmICFmaW5kSW52YWxpZEFuY2VzdG9yRm9yVGFnKHRhZywgYW5jZXN0 b3JJbmZvKTsKKyAgfTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSB2YWxpZGF0ZURPTU5lc3Rpbmc7 Cit9LHsiMTMyIjoxMzIsIjE0NyI6MTQ3LCIxNDgiOjE0OH1dLDEyMjpbZnVuY3Rpb24oX2RlcmVx Xyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vi b29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNv ZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQor ICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVl LiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBp biB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworLyog Z2xvYmFscyBSZWFjdCAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBSZWFjdEludGVybmFscyA9 IFJlYWN0Ll9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVE OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0SW50ZXJuYWxzLlJlYWN0Q29tcG9uZW50VHJlZUhv b2s7Cit9LHt9XSwxMjM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisg KiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyBy ZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBC U0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9v dCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICog b2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUg c2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKy8qIGdsb2JhbHMgUmVhY3QgKi8KKworJ3VzZSBz dHJpY3QnOworCit2YXIgUmVhY3RJbnRlcm5hbHMgPSBSZWFjdC5fX1NFQ1JFVF9JTlRFUk5BTFNf RE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFj dEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjsKK30se31dLDEyNDpbZnVuY3Rpb24oX2RlcmVx Xyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vi b29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNv ZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQor ICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVl LiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBp biB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworLyog Z2xvYmFscyBSZWFjdCAqLworCisndXNlIHN0cmljdCc7CisKK21vZHVsZS5leHBvcnRzID0gUmVh Y3Q7Cit9LHt9XSwxMjU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworJ3VzZSBz dHJpY3QnOworCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywg SW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAy LjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQg aW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5 IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2Vz L0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9y IGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhl IExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQg V0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBp bXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292 ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2Uu CisgKgorICogQHR5cGVjaGVja3MKKyAqLworCit2YXIgZW1wdHlGdW5jdGlvbiA9IF9kZXJlcV8o MTMyKTsKKworLyoqCisgKiBVcHN0cmVhbSB2ZXJzaW9uIG9mIGV2ZW50IGxpc3RlbmVyLiBEb2Vz IG5vdCB0YWtlIGludG8gYWNjb3VudCBzcGVjaWZpYworICogbmF0dXJlIG9mIHBsYXRmb3JtLgor ICovCit2YXIgRXZlbnRMaXN0ZW5lciA9IHsKKyAgLyoqCisgICAqIExpc3RlbiB0byBET00gZXZl bnRzIGR1cmluZyB0aGUgYnViYmxlIHBoYXNlLgorICAgKgorICAgKiBAcGFyYW0ge0RPTUV2ZW50 VGFyZ2V0fSB0YXJnZXQgRE9NIGVsZW1lbnQgdG8gcmVnaXN0ZXIgbGlzdGVuZXIgb24uCisgICAq IEBwYXJhbSB7c3RyaW5nfSBldmVudFR5cGUgRXZlbnQgdHlwZSwgZS5nLiAnY2xpY2snIG9yICdt b3VzZW92ZXInLgorICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBmdW5j dGlvbi4KKyAgICogQHJldHVybiB7b2JqZWN0fSBPYmplY3Qgd2l0aCBhIGByZW1vdmVgIG1ldGhv ZC4KKyAgICovCisgIGxpc3RlbjogZnVuY3Rpb24gbGlzdGVuKHRhcmdldCwgZXZlbnRUeXBlLCBj YWxsYmFjaykgeworICAgIGlmICh0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcikgeworICAgICAgdGFy Z2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBjYWxsYmFjaywgZmFsc2UpOworICAgICAg cmV0dXJuIHsKKyAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7CisgICAgICAgICAg dGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBjYWxsYmFjaywgZmFsc2UpOwor ICAgICAgICB9CisgICAgICB9OworICAgIH0gZWxzZSBpZiAodGFyZ2V0LmF0dGFjaEV2ZW50KSB7 CisgICAgICB0YXJnZXQuYXR0YWNoRXZlbnQoJ29uJyArIGV2ZW50VHlwZSwgY2FsbGJhY2spOwor ICAgICAgcmV0dXJuIHsKKyAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7CisgICAg ICAgICAgdGFyZ2V0LmRldGFjaEV2ZW50KCdvbicgKyBldmVudFR5cGUsIGNhbGxiYWNrKTsKKyAg ICAgICAgfQorICAgICAgfTsKKyAgICB9CisgIH0sCisKKyAgLyoqCisgICAqIExpc3RlbiB0byBE T00gZXZlbnRzIGR1cmluZyB0aGUgY2FwdHVyZSBwaGFzZS4KKyAgICoKKyAgICogQHBhcmFtIHtE T01FdmVudFRhcmdldH0gdGFyZ2V0IERPTSBlbGVtZW50IHRvIHJlZ2lzdGVyIGxpc3RlbmVyIG9u LgorICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRUeXBlIEV2ZW50IHR5cGUsIGUuZy4gJ2NsaWNr JyBvciAnbW91c2VvdmVyJy4KKyAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJh Y2sgZnVuY3Rpb24uCisgICAqIEByZXR1cm4ge29iamVjdH0gT2JqZWN0IHdpdGggYSBgcmVtb3Zl YCBtZXRob2QuCisgICAqLworICBjYXB0dXJlOiBmdW5jdGlvbiBjYXB0dXJlKHRhcmdldCwgZXZl bnRUeXBlLCBjYWxsYmFjaykgeworICAgIGlmICh0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcikgewor ICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBjYWxsYmFjaywgdHJ1ZSk7 CisgICAgICByZXR1cm4geworICAgICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHsKKyAg ICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGNhbGxiYWNrLCB0 cnVlKTsKKyAgICAgICAgfQorICAgICAgfTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCJkZXZl bG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgICBjb25zb2xlLmVycm9yKCdBdHRl bXB0ZWQgdG8gbGlzdGVuIHRvIGV2ZW50cyBkdXJpbmcgdGhlIGNhcHR1cmUgcGhhc2Ugb24gYSAn ICsgJ2Jyb3dzZXIgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBjYXB0dXJlIHBoYXNlLiBZb3Vy IGFwcGxpY2F0aW9uICcgKyAnd2lsbCBub3QgcmVjZWl2ZSBzb21lIGV2ZW50cy4nKTsKKyAgICAg IH0KKyAgICAgIHJldHVybiB7CisgICAgICAgIHJlbW92ZTogZW1wdHlGdW5jdGlvbgorICAgICAg fTsKKyAgICB9CisgIH0sCisKKyAgcmVnaXN0ZXJEZWZhdWx0OiBmdW5jdGlvbiByZWdpc3RlckRl ZmF1bHQoKSB7fQorfTsKKworbW9kdWxlLmV4cG9ydHMgPSBFdmVudExpc3RlbmVyOworfSx7IjEz MiI6MTMyfV0sMTI2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICog Q29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRz IHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhl IEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSBy b290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50Cisg KiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRo ZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgY2FuVXNl RE9NID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50 ICYmIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KTsKKworLyoqCisgKiBTaW1wbGUsIGxp Z2h0d2VpZ2h0IG1vZHVsZSBhc3Npc3Rpbmcgd2l0aCB0aGUgZGV0ZWN0aW9uIGFuZCBjb250ZXh0 IG9mCisgKiBXb3JrZXIuIEhlbHBzIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llcyBhbmQgYWxs b3dzIGNvZGUgdG8gcmVhc29uIGFib3V0CisgKiB3aGV0aGVyIG9yIG5vdCB0aGV5IGFyZSBpbiBh IFdvcmtlciwgZXZlbiBpZiB0aGV5IG5ldmVyIGluY2x1ZGUgdGhlIG1haW4KKyAqIGBSZWFjdFdv cmtlcmAgZGVwZW5kZW5jeS4KKyAqLwordmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0geworCisg IGNhblVzZURPTTogY2FuVXNlRE9NLAorCisgIGNhblVzZVdvcmtlcnM6IHR5cGVvZiBXb3JrZXIg IT09ICd1bmRlZmluZWQnLAorCisgIGNhblVzZUV2ZW50TGlzdGVuZXJzOiBjYW5Vc2VET00gJiYg ISEod2luZG93LmFkZEV2ZW50TGlzdGVuZXIgfHwgd2luZG93LmF0dGFjaEV2ZW50KSwKKworICBj YW5Vc2VWaWV3cG9ydDogY2FuVXNlRE9NICYmICEhd2luZG93LnNjcmVlbiwKKworICBpc0luV29y a2VyOiAhY2FuVXNlRE9NIC8vIEZvciBub3csIHRoaXMgaXMgdHJ1ZSAtIG1pZ2h0IGNoYW5nZSBp biB0aGUgZnV0dXJlLgorCit9OworCittb2R1bGUuZXhwb3J0cyA9IEV4ZWN1dGlvbkVudmlyb25t ZW50OworfSx7fV0sMTI3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKyJ1c2Ug c3RyaWN0IjsKKworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ss IEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBp cyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBM SUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFu IGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRo ZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIEB0eXBlY2hlY2tz CisgKi8KKwordmFyIF9oeXBoZW5QYXR0ZXJuID0gLy0oLikvZzsKKworLyoqCisgKiBDYW1lbGNh c2VzIGEgaHlwaGVuYXRlZCBzdHJpbmcsIGZvciBleGFtcGxlOgorICoKKyAqICAgPiBjYW1lbGl6 ZSgnYmFja2dyb3VuZC1jb2xvcicpCisgKiAgIDwgImJhY2tncm91bmRDb2xvciIKKyAqCisgKiBA cGFyYW0ge3N0cmluZ30gc3RyaW5nCisgKiBAcmV0dXJuIHtzdHJpbmd9CisgKi8KK2Z1bmN0aW9u IGNhbWVsaXplKHN0cmluZykgeworICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoX2h5cGhlblBhdHRl cm4sIGZ1bmN0aW9uIChfLCBjaGFyYWN0ZXIpIHsKKyAgICByZXR1cm4gY2hhcmFjdGVyLnRvVXBw ZXJDYXNlKCk7CisgIH0pOworfQorCittb2R1bGUuZXhwb3J0cyA9IGNhbWVsaXplOworfSx7fV0s MTI4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0 IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVk LgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHls ZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVj dG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRl bnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRp cmVjdG9yeS4KKyAqCisgKiBAdHlwZWNoZWNrcworICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFy IGNhbWVsaXplID0gX2RlcmVxXygxMjcpOworCit2YXIgbXNQYXR0ZXJuID0gL14tbXMtLzsKKwor LyoqCisgKiBDYW1lbGNhc2VzIGEgaHlwaGVuYXRlZCBDU1MgcHJvcGVydHkgbmFtZSwgZm9yIGV4 YW1wbGU6CisgKgorICogICA+IGNhbWVsaXplU3R5bGVOYW1lKCdiYWNrZ3JvdW5kLWNvbG9yJykK KyAqICAgPCAiYmFja2dyb3VuZENvbG9yIgorICogICA+IGNhbWVsaXplU3R5bGVOYW1lKCctbW96 LXRyYW5zaXRpb24nKQorICogICA8ICJNb3pUcmFuc2l0aW9uIgorICogICA+IGNhbWVsaXplU3R5 bGVOYW1lKCctbXMtdHJhbnNpdGlvbicpCisgKiAgIDwgIm1zVHJhbnNpdGlvbiIKKyAqCisgKiBB cyBBbmRpIFNtaXRoIHN1Z2dlc3RzCisgKiAoaHR0cDovL3d3dy5hbmRpc21pdGguY29tL2Jsb2cv MjAxMi8wMi9tb2Rlcm5penItcHJlZml4ZWQvKSwgYW4gYC1tc2AgcHJlZml4CisgKiBpcyBjb252 ZXJ0ZWQgdG8gbG93ZXJjYXNlIGBtc2AuCisgKgorICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZwor ICogQHJldHVybiB7c3RyaW5nfQorICovCitmdW5jdGlvbiBjYW1lbGl6ZVN0eWxlTmFtZShzdHJp bmcpIHsKKyAgcmV0dXJuIGNhbWVsaXplKHN0cmluZy5yZXBsYWNlKG1zUGF0dGVybiwgJ21zLScp KTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBjYW1lbGl6ZVN0eWxlTmFtZTsKK30seyIxMjciOjEy N31dLDEyOTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisndXNlIHN0cmljdCc7 CisKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisg KiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5z ZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBm aWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlv bmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5U UyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCit2YXIgaXNUZXh0 Tm9kZSA9IF9kZXJlcV8oMTQyKTsKKworLyplc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlICovCisK Ky8qKgorICogQ2hlY2tzIGlmIGEgZ2l2ZW4gRE9NIG5vZGUgY29udGFpbnMgb3IgaXMgYW5vdGhl ciBET00gbm9kZS4KKyAqLworZnVuY3Rpb24gY29udGFpbnNOb2RlKG91dGVyTm9kZSwgaW5uZXJO b2RlKSB7CisgIGlmICghb3V0ZXJOb2RlIHx8ICFpbm5lck5vZGUpIHsKKyAgICByZXR1cm4gZmFs c2U7CisgIH0gZWxzZSBpZiAob3V0ZXJOb2RlID09PSBpbm5lck5vZGUpIHsKKyAgICByZXR1cm4g dHJ1ZTsKKyAgfSBlbHNlIGlmIChpc1RleHROb2RlKG91dGVyTm9kZSkpIHsKKyAgICByZXR1cm4g ZmFsc2U7CisgIH0gZWxzZSBpZiAoaXNUZXh0Tm9kZShpbm5lck5vZGUpKSB7CisgICAgcmV0dXJu IGNvbnRhaW5zTm9kZShvdXRlck5vZGUsIGlubmVyTm9kZS5wYXJlbnROb2RlKTsKKyAgfSBlbHNl IGlmICgnY29udGFpbnMnIGluIG91dGVyTm9kZSkgeworICAgIHJldHVybiBvdXRlck5vZGUuY29u dGFpbnMoaW5uZXJOb2RlKTsKKyAgfSBlbHNlIGlmIChvdXRlck5vZGUuY29tcGFyZURvY3VtZW50 UG9zaXRpb24pIHsKKyAgICByZXR1cm4gISEob3V0ZXJOb2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0 aW9uKGlubmVyTm9kZSkgJiAxNik7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9 Cit9CisKK21vZHVsZS5leHBvcnRzID0gY29udGFpbnNOb2RlOworfSx7IjE0MiI6MTQyfV0sMTMw OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKyd1c2Ugc3RyaWN0JzsKKworLyoq CisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCBy aWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRl ciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4g dGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3Jh bnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUg aW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIEB0eXBlY2hlY2tzCisgKi8KKwordmFyIGlu dmFyaWFudCA9IF9kZXJlcV8oMTQwKTsKKworLyoqCisgKiBDb252ZXJ0IGFycmF5LWxpa2Ugb2Jq ZWN0cyB0byBhcnJheXMuCisgKgorICogVGhpcyBBUEkgYXNzdW1lcyB0aGUgY2FsbGVyIGtub3dz IHRoZSBjb250ZW50cyBvZiB0aGUgZGF0YSB0eXBlLiBGb3IgbGVzcworICogd2VsbCBkZWZpbmVk IGlucHV0cyB1c2UgY3JlYXRlQXJyYXlGcm9tTWl4ZWQuCisgKgorICogQHBhcmFtIHtvYmplY3R8 ZnVuY3Rpb258ZmlsZWxpc3R9IG9iagorICogQHJldHVybiB7YXJyYXl9CisgKi8KK2Z1bmN0aW9u IHRvQXJyYXkob2JqKSB7CisgIHZhciBsZW5ndGggPSBvYmoubGVuZ3RoOworCisgIC8vIFNvbWUg YnJvd3NlcnMgYnVpbHRpbiBvYmplY3RzIGNhbiByZXBvcnQgdHlwZW9mICdmdW5jdGlvbicgKGUu Zy4gTm9kZUxpc3QKKyAgLy8gaW4gb2xkIHZlcnNpb25zIG9mIFNhZmFyaSkuCisgICEoIUFycmF5 LmlzQXJyYXkob2JqKSAmJiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIG9iaiA9 PT0gJ2Z1bmN0aW9uJykpID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJp YW50KGZhbHNlLCAndG9BcnJheTogQXJyYXktbGlrZSBvYmplY3QgZXhwZWN0ZWQnKSA6IGludmFy aWFudChmYWxzZSkgOiB2b2lkIDA7CisKKyAgISh0eXBlb2YgbGVuZ3RoID09PSAnbnVtYmVyJykg PyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd0b0Fy cmF5OiBPYmplY3QgbmVlZHMgYSBsZW5ndGggcHJvcGVydHknKSA6IGludmFyaWFudChmYWxzZSkg OiB2b2lkIDA7CisKKyAgIShsZW5ndGggPT09IDAgfHwgbGVuZ3RoIC0gMSBpbiBvYmopID8gImRl dmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAndG9BcnJheTog T2JqZWN0IHNob3VsZCBoYXZlIGtleXMgZm9yIGluZGljZXMnKSA6IGludmFyaWFudChmYWxzZSkg OiB2b2lkIDA7CisKKyAgISh0eXBlb2Ygb2JqLmNhbGxlZSAhPT0gJ2Z1bmN0aW9uJykgPyAiZGV2 ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd0b0FycmF5OiBP YmplY3QgY2FuXCd0IGJlIGBhcmd1bWVudHNgLiBVc2UgcmVzdCBwYXJhbXMgJyArICcoZnVuY3Rp b24oLi4uYXJncykge30pIG9yIEFycmF5LmZyb20oKSBpbnN0ZWFkLicpIDogaW52YXJpYW50KGZh bHNlKSA6IHZvaWQgMDsKKworICAvLyBPbGQgSUUgZG9lc24ndCBnaXZlIGNvbGxlY3Rpb25zIGFj Y2VzcyB0byBoYXNPd25Qcm9wZXJ0eS4gQXNzdW1lIGlucHV0cworICAvLyB3aXRob3V0IG1ldGhv ZCB3aWxsIHRocm93IGR1cmluZyB0aGUgc2xpY2UgY2FsbCBhbmQgc2tpcCBzdHJhaWdodCB0byB0 aGUKKyAgLy8gZmFsbGJhY2suCisgIGlmIChvYmouaGFzT3duUHJvcGVydHkpIHsKKyAgICB0cnkg eworICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG9iaik7CisgICAgfSBj YXRjaCAoZSkgeworICAgICAgLy8gSUUgPCA5IGRvZXMgbm90IHN1cHBvcnQgQXJyYXkjc2xpY2Ug b24gY29sbGVjdGlvbnMgb2JqZWN0cworICAgIH0KKyAgfQorCisgIC8vIEZhbGwgYmFjayB0byBj b3B5aW5nIGtleSBieSBrZXkuIFRoaXMgYXNzdW1lcyBhbGwga2V5cyBoYXZlIGEgdmFsdWUsCisg IC8vIHNvIHdpbGwgbm90IHByZXNlcnZlIHNwYXJzZWx5IHBvcHVsYXRlZCBpbnB1dHMuCisgIHZh ciByZXQgPSBBcnJheShsZW5ndGgpOworICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgbGVuZ3RoOyBp aSsrKSB7CisgICAgcmV0W2lpXSA9IG9ialtpaV07CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKwor LyoqCisgKiBQZXJmb3JtIGEgaGV1cmlzdGljIHRlc3QgdG8gZGV0ZXJtaW5lIGlmIGFuIG9iamVj dCBpcyAiYXJyYXktbGlrZSIuCisgKgorICogICBBIG1vbmsgYXNrZWQgSm9zaHUsIGEgWmVuIG1h c3RlciwgIkhhcyBhIGRvZyBCdWRkaGEgbmF0dXJlPyIKKyAqICAgSm9zaHUgcmVwbGllZDogIk11 LiIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgaWYgaXRzIGFyZ3VtZW50IGhhcyAi YXJyYXkgbmF0dXJlIjogaXQgcmV0dXJucworICogdHJ1ZSBpZiB0aGUgYXJndW1lbnQgaXMgYW4g YWN0dWFsIGFycmF5LCBhbiBgYXJndW1lbnRzJyBvYmplY3QsIG9yIGFuCisgKiBIVE1MQ29sbGVj dGlvbiAoZS5nLiBub2RlLmNoaWxkTm9kZXMgb3Igbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgp KS4KKyAqCisgKiBJdCB3aWxsIHJldHVybiBmYWxzZSBmb3Igb3RoZXIgYXJyYXktbGlrZSBvYmpl Y3RzIGxpa2UgRmlsZWxpc3QuCisgKgorICogQHBhcmFtIHsqfSBvYmoKKyAqIEByZXR1cm4ge2Jv b2xlYW59CisgKi8KK2Z1bmN0aW9uIGhhc0FycmF5TmF0dXJlKG9iaikgeworICByZXR1cm4gKAor ICAgIC8vIG5vdCBudWxsL2ZhbHNlCisgICAgISFvYmogJiYgKAorICAgIC8vIGFycmF5cyBhcmUg b2JqZWN0cywgTm9kZUxpc3RzIGFyZSBmdW5jdGlvbnMgaW4gU2FmYXJpCisgICAgdHlwZW9mIG9i aiA9PSAnb2JqZWN0JyB8fCB0eXBlb2Ygb2JqID09ICdmdW5jdGlvbicpICYmCisgICAgLy8gcXVh Y2tzIGxpa2UgYW4gYXJyYXkKKyAgICAnbGVuZ3RoJyBpbiBvYmogJiYKKyAgICAvLyBub3Qgd2lu ZG93CisgICAgISgnc2V0SW50ZXJ2YWwnIGluIG9iaikgJiYKKyAgICAvLyBubyBET00gbm9kZSBz aG91bGQgYmUgY29uc2lkZXJlZCBhbiBhcnJheS1saWtlCisgICAgLy8gYSAnc2VsZWN0JyBlbGVt ZW50IGhhcyAnbGVuZ3RoJyBhbmQgJ2l0ZW0nIHByb3BlcnRpZXMgb24gSUU4CisgICAgdHlwZW9m IG9iai5ub2RlVHlwZSAhPSAnbnVtYmVyJyAmJiAoCisgICAgLy8gYSByZWFsIGFycmF5CisgICAg QXJyYXkuaXNBcnJheShvYmopIHx8CisgICAgLy8gYXJndW1lbnRzCisgICAgJ2NhbGxlZScgaW4g b2JqIHx8CisgICAgLy8gSFRNTENvbGxlY3Rpb24vTm9kZUxpc3QKKyAgICAnaXRlbScgaW4gb2Jq KQorICApOworfQorCisvKioKKyAqIEVuc3VyZSB0aGF0IHRoZSBhcmd1bWVudCBpcyBhbiBhcnJh eSBieSB3cmFwcGluZyBpdCBpbiBhbiBhcnJheSBpZiBpdCBpcyBub3QuCisgKiBDcmVhdGVzIGEg Y29weSBvZiB0aGUgYXJndW1lbnQgaWYgaXQgaXMgYWxyZWFkeSBhbiBhcnJheS4KKyAqCisgKiBU aGlzIGlzIG1vc3RseSB1c2VmdWwgaWRpb21hdGljYWxseToKKyAqCisgKiAgIHZhciBjcmVhdGVB cnJheUZyb21NaXhlZCA9IHJlcXVpcmUoJ2NyZWF0ZUFycmF5RnJvbU1peGVkJyk7CisgKgorICog ICBmdW5jdGlvbiB0YWtlc09uZU9yTW9yZVRoaW5ncyh0aGluZ3MpIHsKKyAqICAgICB0aGluZ3Mg PSBjcmVhdGVBcnJheUZyb21NaXhlZCh0aGluZ3MpOworICogICAgIC4uLgorICogICB9CisgKgor ICogVGhpcyBhbGxvd3MgeW91IHRvIHRyZWF0IGB0aGluZ3MnIGFzIGFuIGFycmF5LCBidXQgYWNj ZXB0IHNjYWxhcnMgaW4gdGhlIEFQSS4KKyAqCisgKiBJZiB5b3UgbmVlZCB0byBjb252ZXJ0IGFu IGFycmF5LWxpa2Ugb2JqZWN0LCBsaWtlIGBhcmd1bWVudHNgLCBpbnRvIGFuIGFycmF5CisgKiB1 c2UgdG9BcnJheSBpbnN0ZWFkLgorICoKKyAqIEBwYXJhbSB7Kn0gb2JqCisgKiBAcmV0dXJuIHth cnJheX0KKyAqLworZnVuY3Rpb24gY3JlYXRlQXJyYXlGcm9tTWl4ZWQob2JqKSB7CisgIGlmICgh aGFzQXJyYXlOYXR1cmUob2JqKSkgeworICAgIHJldHVybiBbb2JqXTsKKyAgfSBlbHNlIGlmIChB cnJheS5pc0FycmF5KG9iaikpIHsKKyAgICByZXR1cm4gb2JqLnNsaWNlKCk7CisgIH0gZWxzZSB7 CisgICAgcmV0dXJuIHRvQXJyYXkob2JqKTsKKyAgfQorfQorCittb2R1bGUuZXhwb3J0cyA9IGNy ZWF0ZUFycmF5RnJvbU1peGVkOworfSx7IjE0MCI6MTQwfV0sMTMxOltmdW5jdGlvbihfZGVyZXFf LG1vZHVsZSxleHBvcnRzKXsKKyd1c2Ugc3RyaWN0JzsKKworLyoqCisgKiBDb3B5cmlnaHQgKGMp IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg KgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxp Y2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5 IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCBy aWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0 b3J5LgorICoKKyAqIEB0eXBlY2hlY2tzCisgKi8KKworLyplc2xpbnQtZGlzYWJsZSBmYi13d3cv dW5zYWZlLWh0bWwqLworCit2YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSBfZGVyZXFfKDEyNik7 CisKK3ZhciBjcmVhdGVBcnJheUZyb21NaXhlZCA9IF9kZXJlcV8oMTMwKTsKK3ZhciBnZXRNYXJr dXBXcmFwID0gX2RlcmVxXygxMzYpOwordmFyIGludmFyaWFudCA9IF9kZXJlcV8oMTQwKTsKKwor LyoqCisgKiBEdW1teSBjb250YWluZXIgdXNlZCB0byByZW5kZXIgYWxsIG1hcmt1cC4KKyAqLwor dmFyIGR1bW15Tm9kZSA9IEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSA/IGRvY3VtZW50 LmNyZWF0ZUVsZW1lbnQoJ2RpdicpIDogbnVsbDsKKworLyoqCisgKiBQYXR0ZXJuIHVzZWQgYnkg YGdldE5vZGVOYW1lYC4KKyAqLwordmFyIG5vZGVOYW1lUGF0dGVybiA9IC9eXHMqPChcdyspLzsK KworLyoqCisgKiBFeHRyYWN0cyB0aGUgYG5vZGVOYW1lYCBvZiB0aGUgZmlyc3QgZWxlbWVudCBp biBhIHN0cmluZyBvZiBtYXJrdXAuCisgKgorICogQHBhcmFtIHtzdHJpbmd9IG1hcmt1cCBTdHJp bmcgb2YgbWFya3VwLgorICogQHJldHVybiB7P3N0cmluZ30gTm9kZSBuYW1lIG9mIHRoZSBzdXBw bGllZCBtYXJrdXAuCisgKi8KK2Z1bmN0aW9uIGdldE5vZGVOYW1lKG1hcmt1cCkgeworICB2YXIg bm9kZU5hbWVNYXRjaCA9IG1hcmt1cC5tYXRjaChub2RlTmFtZVBhdHRlcm4pOworICByZXR1cm4g bm9kZU5hbWVNYXRjaCAmJiBub2RlTmFtZU1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7Cit9CisKKy8q KgorICogQ3JlYXRlcyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBub2RlcyByZW5kZXJlZCBmcm9t IHRoZSBzdXBwbGllZCBtYXJrdXAuIFRoZQorICogb3B0aW9uYWxseSBzdXBwbGllZCBgaGFuZGxl U2NyaXB0YCBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgb25jZSBmb3IgZWFjaAorICogPHNjcmlw dD4gZWxlbWVudCB0aGF0IGlzIHJlbmRlcmVkLiBJZiBubyBgaGFuZGxlU2NyaXB0YCBmdW5jdGlv biBpcyBzdXBwbGllZCwKKyAqIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgYW55IDxzY3JpcHQ+ IGVsZW1lbnRzIGFyZSByZW5kZXJlZC4KKyAqCisgKiBAcGFyYW0ge3N0cmluZ30gbWFya3VwIEEg c3RyaW5nIG9mIHZhbGlkIEhUTUwgbWFya3VwLgorICogQHBhcmFtIHs/ZnVuY3Rpb259IGhhbmRs ZVNjcmlwdCBJbnZva2VkIG9uY2UgZm9yIGVhY2ggcmVuZGVyZWQgPHNjcmlwdD4uCisgKiBAcmV0 dXJuIHthcnJheTxET01FbGVtZW50fERPTVRleHROb2RlPn0gQW4gYXJyYXkgb2YgcmVuZGVyZWQg bm9kZXMuCisgKi8KK2Z1bmN0aW9uIGNyZWF0ZU5vZGVzRnJvbU1hcmt1cChtYXJrdXAsIGhhbmRs ZVNjcmlwdCkgeworICB2YXIgbm9kZSA9IGR1bW15Tm9kZTsKKyAgISEhZHVtbXlOb2RlID8gImRl dmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnY3JlYXRlTm9k ZXNGcm9tTWFya3VwIGR1bW15IG5vdCBpbml0aWFsaXplZCcpIDogaW52YXJpYW50KGZhbHNlKSA6 IHZvaWQgMDsKKyAgdmFyIG5vZGVOYW1lID0gZ2V0Tm9kZU5hbWUobWFya3VwKTsKKworICB2YXIg d3JhcCA9IG5vZGVOYW1lICYmIGdldE1hcmt1cFdyYXAobm9kZU5hbWUpOworICBpZiAod3JhcCkg eworICAgIG5vZGUuaW5uZXJIVE1MID0gd3JhcFsxXSArIG1hcmt1cCArIHdyYXBbMl07CisKKyAg ICB2YXIgd3JhcERlcHRoID0gd3JhcFswXTsKKyAgICB3aGlsZSAod3JhcERlcHRoLS0pIHsKKyAg ICAgIG5vZGUgPSBub2RlLmxhc3RDaGlsZDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbm9kZS5p bm5lckhUTUwgPSBtYXJrdXA7CisgIH0KKworICB2YXIgc2NyaXB0cyA9IG5vZGUuZ2V0RWxlbWVu dHNCeVRhZ05hbWUoJ3NjcmlwdCcpOworICBpZiAoc2NyaXB0cy5sZW5ndGgpIHsKKyAgICAhaGFu ZGxlU2NyaXB0ID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZh bHNlLCAnY3JlYXRlTm9kZXNGcm9tTWFya3VwKC4uLik6IFVuZXhwZWN0ZWQgPHNjcmlwdD4gZWxl bWVudCByZW5kZXJlZC4nKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7CisgICAgY3JlYXRl QXJyYXlGcm9tTWl4ZWQoc2NyaXB0cykuZm9yRWFjaChoYW5kbGVTY3JpcHQpOworICB9CisKKyAg dmFyIG5vZGVzID0gQXJyYXkuZnJvbShub2RlLmNoaWxkTm9kZXMpOworICB3aGlsZSAobm9kZS5s YXN0Q2hpbGQpIHsKKyAgICBub2RlLnJlbW92ZUNoaWxkKG5vZGUubGFzdENoaWxkKTsKKyAgfQor ICByZXR1cm4gbm9kZXM7Cit9CisKK21vZHVsZS5leHBvcnRzID0gY3JlYXRlTm9kZXNGcm9tTWFy a3VwOworfSx7IjEyNiI6MTI2LCIxMzAiOjEzMCwiMTM2IjoxMzYsIjE0MCI6MTQwfV0sMTMyOltm dW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKyJ1c2Ugc3RyaWN0IjsKKworLyoqCisg KiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdo dHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0 aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhl IHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQK KyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4g dGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAorICovCisKK2Z1bmN0aW9uIG1ha2VFbXB0eUZ1 bmN0aW9uKGFyZykgeworICByZXR1cm4gZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBhcmc7Cisg IH07Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBhY2NlcHRzIGFuZCBkaXNjYXJkcyBpbnB1 dHM7IGl0IGhhcyBubyBzaWRlIGVmZmVjdHMuIFRoaXMgaXMKKyAqIHByaW1hcmlseSB1c2VmdWwg aWRpb21hdGljYWxseSBmb3Igb3ZlcnJpZGFibGUgZnVuY3Rpb24gZW5kcG9pbnRzIHdoaWNoCisg KiBhbHdheXMgbmVlZCB0byBiZSBjYWxsYWJsZSwgc2luY2UgSlMgbGFja3MgYSBudWxsLWNhbGwg aWRpb20gYWxhIENvY29hLgorICovCit2YXIgZW1wdHlGdW5jdGlvbiA9IGZ1bmN0aW9uIGVtcHR5 RnVuY3Rpb24oKSB7fTsKKworZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJucyA9IG1ha2VFbXB0eUZ1 bmN0aW9uOworZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc0ZhbHNlID0gbWFrZUVtcHR5RnVuY3Rp b24oZmFsc2UpOworZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc1RydWUgPSBtYWtlRW1wdHlGdW5j dGlvbih0cnVlKTsKK2VtcHR5RnVuY3Rpb24udGhhdFJldHVybnNOdWxsID0gbWFrZUVtcHR5RnVu Y3Rpb24obnVsbCk7CitlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zVGhpcyA9IGZ1bmN0aW9uICgp IHsKKyAgcmV0dXJuIHRoaXM7Cit9OworZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc0FyZ3VtZW50 ID0gZnVuY3Rpb24gKGFyZykgeworICByZXR1cm4gYXJnOworfTsKKworbW9kdWxlLmV4cG9ydHMg PSBlbXB0eUZ1bmN0aW9uOworfSx7fV0sMTMzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBv cnRzKXsKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMu CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGlj ZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5T RSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRp dGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFU RU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3Qn OworCit2YXIgZW1wdHlPYmplY3QgPSB7fTsKKworaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9k dWN0aW9uJykgeworICBPYmplY3QuZnJlZXplKGVtcHR5T2JqZWN0KTsKK30KKworbW9kdWxlLmV4 cG9ydHMgPSBlbXB0eU9iamVjdDsKK30se31dLDEzNDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUs ZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywg SW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlz IGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJ Q0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4g YWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhl IFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3Ry aWN0JzsKKworLyoqCisgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGUgaW5wdXQvdGV4dGFyZWEg dG8gZm9jdXMKKyAqLworCitmdW5jdGlvbiBmb2N1c05vZGUobm9kZSkgeworICAvLyBJRTggY2Fu IHRocm93ICJDYW4ndCBtb3ZlIGZvY3VzIHRvIHRoZSBjb250cm9sIGJlY2F1c2UgaXQgaXMgaW52 aXNpYmxlLAorICAvLyBub3QgZW5hYmxlZCwgb3Igb2YgYSB0eXBlIHRoYXQgZG9lcyBub3QgYWNj ZXB0IHRoZSBmb2N1cy4iIGZvciBhbGwga2luZHMgb2YKKyAgLy8gcmVhc29ucyB0aGF0IGFyZSB0 b28gZXhwZW5zaXZlIGFuZCBmcmFnaWxlIHRvIHRlc3QuCisgIHRyeSB7CisgICAgbm9kZS5mb2N1 cygpOworICB9IGNhdGNoIChlKSB7fQorfQorCittb2R1bGUuZXhwb3J0cyA9IGZvY3VzTm9kZTsK K30se31dLDEzNTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisndXNlIHN0cmlj dCc7CisKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMu CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGlj ZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5T RSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRp dGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFU RU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiBAdHlwZWNoZWNrcworICov CisKKy8qIGVzbGludC1kaXNhYmxlIGZiLXd3dy90eXBlb2YtdW5kZWZpbmVkICovCisKKy8qKgor ICogU2FtZSBhcyBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGJ1dCB3cmFwcyBpbiBhIHRyeS1jYXRj aCBibG9jay4gSW4gSUUgaXQgaXMKKyAqIG5vdCBzYWZlIHRvIGNhbGwgZG9jdW1lbnQuYWN0aXZl RWxlbWVudCBpZiB0aGVyZSBpcyBub3RoaW5nIGZvY3VzZWQuCisgKgorICogVGhlIGFjdGl2ZUVs ZW1lbnQgd2lsbCBiZSBudWxsIG9ubHkgaWYgdGhlIGRvY3VtZW50IG9yIGRvY3VtZW50IGJvZHkg aXMgbm90CisgKiB5ZXQgZGVmaW5lZC4KKyAqLworZnVuY3Rpb24gZ2V0QWN0aXZlRWxlbWVudCgp IC8qP0RPTUVsZW1lbnQqL3sKKyAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcp IHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorICB0cnkgeworICAgIHJldHVybiBkb2N1bWVudC5h Y3RpdmVFbGVtZW50IHx8IGRvY3VtZW50LmJvZHk7CisgIH0gY2F0Y2ggKGUpIHsKKyAgICByZXR1 cm4gZG9jdW1lbnQuYm9keTsKKyAgfQorfQorCittb2R1bGUuZXhwb3J0cyA9IGdldEFjdGl2ZUVs ZW1lbnQ7Cit9LHt9XSwxMzY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworJ3Vz ZSBzdHJpY3QnOworCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9v aywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2Rl IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAq IExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4g QW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4g dGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKy8qZXNs aW50LWRpc2FibGUgZmItd3d3L3Vuc2FmZS1odG1sICovCisKK3ZhciBFeGVjdXRpb25FbnZpcm9u bWVudCA9IF9kZXJlcV8oMTI2KTsKKwordmFyIGludmFyaWFudCA9IF9kZXJlcV8oMTQwKTsKKwor LyoqCisgKiBEdW1teSBjb250YWluZXIgdXNlZCB0byBkZXRlY3Qgd2hpY2ggd3JhcHMgYXJlIG5l Y2Vzc2FyeS4KKyAqLwordmFyIGR1bW15Tm9kZSA9IEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVz ZURPTSA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpIDogbnVsbDsKKworLyoqCisgKiBT b21lIGJyb3dzZXJzIGNhbm5vdCB1c2UgYGlubmVySFRNTGAgdG8gcmVuZGVyIGNlcnRhaW4gZWxl bWVudHMgc3RhbmRhbG9uZSwKKyAqIHNvIHdlIHdyYXAgdGhlbSwgcmVuZGVyIHRoZSB3cmFwcGVk IG5vZGVzLCB0aGVuIGV4dHJhY3QgdGhlIGRlc2lyZWQgbm9kZS4KKyAqCisgKiBJbiBJRTgsIGNl cnRhaW4gZWxlbWVudHMgY2Fubm90IHJlbmRlciBhbG9uZSwgc28gd3JhcCBhbGwgZWxlbWVudHMg KCcqJykuCisgKi8KKwordmFyIHNob3VsZFdyYXAgPSB7fTsKKwordmFyIHNlbGVjdFdyYXAgPSBb MSwgJzxzZWxlY3QgbXVsdGlwbGU9InRydWUiPicsICc8L3NlbGVjdD4nXTsKK3ZhciB0YWJsZVdy YXAgPSBbMSwgJzx0YWJsZT4nLCAnPC90YWJsZT4nXTsKK3ZhciB0cldyYXAgPSBbMywgJzx0YWJs ZT48dGJvZHk+PHRyPicsICc8L3RyPjwvdGJvZHk+PC90YWJsZT4nXTsKKwordmFyIHN2Z1dyYXAg PSBbMSwgJzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4nLCAnPC9zdmc+ J107CisKK3ZhciBtYXJrdXBXcmFwID0geworICAnKic6IFsxLCAnPzxkaXY+JywgJzwvZGl2Pidd LAorCisgICdhcmVhJzogWzEsICc8bWFwPicsICc8L21hcD4nXSwKKyAgJ2NvbCc6IFsyLCAnPHRh YmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4nLCAnPC9jb2xncm91cD48L3RhYmxlPiddLAor ICAnbGVnZW5kJzogWzEsICc8ZmllbGRzZXQ+JywgJzwvZmllbGRzZXQ+J10sCisgICdwYXJhbSc6 IFsxLCAnPG9iamVjdD4nLCAnPC9vYmplY3Q+J10sCisgICd0cic6IFsyLCAnPHRhYmxlPjx0Ym9k eT4nLCAnPC90Ym9keT48L3RhYmxlPiddLAorCisgICdvcHRncm91cCc6IHNlbGVjdFdyYXAsCisg ICdvcHRpb24nOiBzZWxlY3RXcmFwLAorCisgICdjYXB0aW9uJzogdGFibGVXcmFwLAorICAnY29s Z3JvdXAnOiB0YWJsZVdyYXAsCisgICd0Ym9keSc6IHRhYmxlV3JhcCwKKyAgJ3Rmb290JzogdGFi bGVXcmFwLAorICAndGhlYWQnOiB0YWJsZVdyYXAsCisKKyAgJ3RkJzogdHJXcmFwLAorICAndGgn OiB0cldyYXAKK307CisKKy8vIEluaXRpYWxpemUgdGhlIFNWRyBlbGVtZW50cyBzaW5jZSB3ZSBr bm93IHRoZXknbGwgYWx3YXlzIG5lZWQgdG8gYmUgd3JhcHBlZAorLy8gY29uc2lzdGVudGx5LiBJ ZiB0aGV5IGFyZSBjcmVhdGVkIGluc2lkZSBhIDxkaXY+IHRoZXkgd2lsbCBiZSBpbml0aWFsaXpl ZCBpbgorLy8gdGhlIHdyb25nIG5hbWVzcGFjZSAoYW5kIHdpbGwgbm90IGRpc3BsYXkpLgordmFy IHN2Z0VsZW1lbnRzID0gWydjaXJjbGUnLCAnY2xpcFBhdGgnLCAnZGVmcycsICdlbGxpcHNlJywg J2cnLCAnaW1hZ2UnLCAnbGluZScsICdsaW5lYXJHcmFkaWVudCcsICdtYXNrJywgJ3BhdGgnLCAn cGF0dGVybicsICdwb2x5Z29uJywgJ3BvbHlsaW5lJywgJ3JhZGlhbEdyYWRpZW50JywgJ3JlY3Qn LCAnc3RvcCcsICd0ZXh0JywgJ3RzcGFuJ107CitzdmdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9u IChub2RlTmFtZSkgeworICBtYXJrdXBXcmFwW25vZGVOYW1lXSA9IHN2Z1dyYXA7CisgIHNob3Vs ZFdyYXBbbm9kZU5hbWVdID0gdHJ1ZTsKK30pOworCisvKioKKyAqIEdldHMgdGhlIG1hcmt1cCB3 cmFwIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzdXBwbGllZCBgbm9kZU5hbWVgLgorICoKKyAqIE5P VEU6IFRoaXMgbGF6aWx5IGRldGVjdHMgd2hpY2ggd3JhcHMgYXJlIG5lY2Vzc2FyeSBmb3IgdGhl IGN1cnJlbnQgYnJvd3Nlci4KKyAqCisgKiBAcGFyYW0ge3N0cmluZ30gbm9kZU5hbWUgTG93ZXJj YXNlIGBub2RlTmFtZWAuCisgKiBAcmV0dXJuIHs/YXJyYXl9IE1hcmt1cCB3cmFwIGNvbmZpZ3Vy YXRpb24sIGlmIGFwcGxpY2FibGUuCisgKi8KK2Z1bmN0aW9uIGdldE1hcmt1cFdyYXAobm9kZU5h bWUpIHsKKyAgISEhZHVtbXlOb2RlID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8g aW52YXJpYW50KGZhbHNlLCAnTWFya3VwIHdyYXBwaW5nIG5vZGUgbm90IGluaXRpYWxpemVkJykg OiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwOworICBpZiAoIW1hcmt1cFdyYXAuaGFzT3duUHJv cGVydHkobm9kZU5hbWUpKSB7CisgICAgbm9kZU5hbWUgPSAnKic7CisgIH0KKyAgaWYgKCFzaG91 bGRXcmFwLmhhc093blByb3BlcnR5KG5vZGVOYW1lKSkgeworICAgIGlmIChub2RlTmFtZSA9PT0g JyonKSB7CisgICAgICBkdW1teU5vZGUuaW5uZXJIVE1MID0gJzxsaW5rIC8+JzsKKyAgICB9IGVs c2UgeworICAgICAgZHVtbXlOb2RlLmlubmVySFRNTCA9ICc8JyArIG5vZGVOYW1lICsgJz48Lycg KyBub2RlTmFtZSArICc+JzsKKyAgICB9CisgICAgc2hvdWxkV3JhcFtub2RlTmFtZV0gPSAhZHVt bXlOb2RlLmZpcnN0Q2hpbGQ7CisgIH0KKyAgcmV0dXJuIHNob3VsZFdyYXBbbm9kZU5hbWVdID8g bWFya3VwV3JhcFtub2RlTmFtZV0gOiBudWxsOworfQorCittb2R1bGUuZXhwb3J0cyA9IGdldE1h cmt1cFdyYXA7Cit9LHsiMTI2IjoxMjYsIjE0MCI6MTQwfV0sMTM3OltmdW5jdGlvbihfZGVyZXFf LG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZh Y2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNl IGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRo ZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0 cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3Vu ZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiBAdHlw ZWNoZWNrcworICovCisKKyd1c2Ugc3RyaWN0JzsKKworLyoqCisgKiBHZXRzIHRoZSBzY3JvbGwg cG9zaXRpb24gb2YgdGhlIHN1cHBsaWVkIGVsZW1lbnQgb3Igd2luZG93LgorICoKKyAqIFRoZSBy ZXR1cm4gdmFsdWVzIGFyZSB1bmJvdW5kZWQsIHVubGlrZSBgZ2V0U2Nyb2xsUG9zaXRpb25gLiBU aGlzIG1lYW5zIHRoZXkKKyAqIG1heSBiZSBuZWdhdGl2ZSBvciBleGNlZWQgdGhlIGVsZW1lbnQg Ym91bmRhcmllcyAod2hpY2ggaXMgcG9zc2libGUgdXNpbmcKKyAqIGluZXJ0aWFsIHNjcm9sbGlu ZykuCisgKgorICogQHBhcmFtIHtET01XaW5kb3d8RE9NRWxlbWVudH0gc2Nyb2xsYWJsZQorICog QHJldHVybiB7b2JqZWN0fSBNYXAgd2l0aCBgeGAgYW5kIGB5YCBrZXlzLgorICovCisKK2Z1bmN0 aW9uIGdldFVuYm91bmRlZFNjcm9sbFBvc2l0aW9uKHNjcm9sbGFibGUpIHsKKyAgaWYgKHNjcm9s bGFibGUgPT09IHdpbmRvdykgeworICAgIHJldHVybiB7CisgICAgICB4OiB3aW5kb3cucGFnZVhP ZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsCisgICAgICB5OiB3 aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcAor ICAgIH07CisgIH0KKyAgcmV0dXJuIHsKKyAgICB4OiBzY3JvbGxhYmxlLnNjcm9sbExlZnQsCisg ICAgeTogc2Nyb2xsYWJsZS5zY3JvbGxUb3AKKyAgfTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBn ZXRVbmJvdW5kZWRTY3JvbGxQb3NpdGlvbjsKK30se31dLDEzODpbZnVuY3Rpb24oX2RlcmVxXyxt b2R1bGUsZXhwb3J0cyl7CisndXNlIHN0cmljdCc7CisKKy8qKgorICogQ29weXJpZ2h0IChjKSAy MDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK KyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNl bnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBv ZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmln aHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9y eS4KKyAqCisgKiBAdHlwZWNoZWNrcworICovCisKK3ZhciBfdXBwZXJjYXNlUGF0dGVybiA9IC8o W0EtWl0pL2c7CisKKy8qKgorICogSHlwaGVuYXRlcyBhIGNhbWVsY2FzZWQgc3RyaW5nLCBmb3Ig ZXhhbXBsZToKKyAqCisgKiAgID4gaHlwaGVuYXRlKCdiYWNrZ3JvdW5kQ29sb3InKQorICogICA8 ICJiYWNrZ3JvdW5kLWNvbG9yIgorICoKKyAqIEZvciBDU1Mgc3R5bGUgbmFtZXMsIHVzZSBgaHlw aGVuYXRlU3R5bGVOYW1lYCBpbnN0ZWFkIHdoaWNoIHdvcmtzIHByb3Blcmx5CisgKiB3aXRoIGFs bCB2ZW5kb3IgcHJlZml4ZXMsIGluY2x1ZGluZyBgbXNgLgorICoKKyAqIEBwYXJhbSB7c3RyaW5n fSBzdHJpbmcKKyAqIEByZXR1cm4ge3N0cmluZ30KKyAqLworZnVuY3Rpb24gaHlwaGVuYXRlKHN0 cmluZykgeworICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoX3VwcGVyY2FzZVBhdHRlcm4sICctJDEn KS50b0xvd2VyQ2FzZSgpOworfQorCittb2R1bGUuZXhwb3J0cyA9IGh5cGhlbmF0ZTsKK30se31d LDEzOTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdo dCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZl ZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5 bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJl Y3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0 ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBk aXJlY3RvcnkuCisgKgorICogQHR5cGVjaGVja3MKKyAqLworCisndXNlIHN0cmljdCc7CisKK3Zh ciBoeXBoZW5hdGUgPSBfZGVyZXFfKDEzOCk7CisKK3ZhciBtc1BhdHRlcm4gPSAvXm1zLS87CisK Ky8qKgorICogSHlwaGVuYXRlcyBhIGNhbWVsY2FzZWQgQ1NTIHByb3BlcnR5IG5hbWUsIGZvciBl eGFtcGxlOgorICoKKyAqICAgPiBoeXBoZW5hdGVTdHlsZU5hbWUoJ2JhY2tncm91bmRDb2xvcicp CisgKiAgIDwgImJhY2tncm91bmQtY29sb3IiCisgKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdN b3pUcmFuc2l0aW9uJykKKyAqICAgPCAiLW1vei10cmFuc2l0aW9uIgorICogICA+IGh5cGhlbmF0 ZVN0eWxlTmFtZSgnbXNUcmFuc2l0aW9uJykKKyAqICAgPCAiLW1zLXRyYW5zaXRpb24iCisgKgor ICogQXMgTW9kZXJuaXpyIHN1Z2dlc3RzIChodHRwOi8vbW9kZXJuaXpyLmNvbS9kb2NzLyNwcmVm aXhlZCksIGFuIGBtc2AgcHJlZml4CisgKiBpcyBjb252ZXJ0ZWQgdG8gYC1tcy1gLgorICoKKyAq IEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcKKyAqIEByZXR1cm4ge3N0cmluZ30KKyAqLworZnVuY3Rp b24gaHlwaGVuYXRlU3R5bGVOYW1lKHN0cmluZykgeworICByZXR1cm4gaHlwaGVuYXRlKHN0cmlu ZykucmVwbGFjZShtc1BhdHRlcm4sICctbXMtJyk7Cit9CisKK21vZHVsZS5leHBvcnRzID0gaHlw aGVuYXRlU3R5bGVOYW1lOworfSx7IjEzOCI6MTM4fV0sMTQwOltmdW5jdGlvbihfZGVyZXFfLG1v ZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vi b29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNv ZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQor ICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVl LiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBp biB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3Vz ZSBzdHJpY3QnOworCisvKioKKyAqIFVzZSBpbnZhcmlhbnQoKSB0byBhc3NlcnQgc3RhdGUgd2hp Y2ggeW91ciBwcm9ncmFtIGFzc3VtZXMgdG8gYmUgdHJ1ZS4KKyAqCisgKiBQcm92aWRlIHNwcmlu dGYtc3R5bGUgZm9ybWF0IChvbmx5ICVzIGlzIHN1cHBvcnRlZCkgYW5kIGFyZ3VtZW50cworICog dG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGJyb2tlIGFuZCB3aGF0IHlvdSB3ZXJl CisgKiBleHBlY3RpbmcuCisgKgorICogVGhlIGludmFyaWFudCBtZXNzYWdlIHdpbGwgYmUgc3Ry aXBwZWQgaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBpbnZhcmlhbnQKKyAqIHdpbGwgcmVtYWluIHRv IGVuc3VyZSBsb2dpYyBkb2VzIG5vdCBkaWZmZXIgaW4gcHJvZHVjdGlvbi4KKyAqLworCit2YXIg dmFsaWRhdGVGb3JtYXQgPSBmdW5jdGlvbiB2YWxpZGF0ZUZvcm1hdChmb3JtYXQpIHt9OworCitp ZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgIHZhbGlkYXRlRm9ybWF0ID0g ZnVuY3Rpb24gdmFsaWRhdGVGb3JtYXQoZm9ybWF0KSB7CisgICAgaWYgKGZvcm1hdCA9PT0gdW5k ZWZpbmVkKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFyaWFudCByZXF1aXJlcyBhbiBl cnJvciBtZXNzYWdlIGFyZ3VtZW50Jyk7CisgICAgfQorICB9OworfQorCitmdW5jdGlvbiBpbnZh cmlhbnQoY29uZGl0aW9uLCBmb3JtYXQsIGEsIGIsIGMsIGQsIGUsIGYpIHsKKyAgdmFsaWRhdGVG b3JtYXQoZm9ybWF0KTsKKworICBpZiAoIWNvbmRpdGlvbikgeworICAgIHZhciBlcnJvcjsKKyAg ICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHsKKyAgICAgIGVycm9yID0gbmV3IEVycm9yKCdN aW5pZmllZCBleGNlcHRpb24gb2NjdXJyZWQ7IHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZp cm9ubWVudCAnICsgJ2ZvciB0aGUgZnVsbCBlcnJvciBtZXNzYWdlIGFuZCBhZGRpdGlvbmFsIGhl bHBmdWwgd2FybmluZ3MuJyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBhcmdzID0gW2EsIGIs IGMsIGQsIGUsIGZdOworICAgICAgdmFyIGFyZ0luZGV4ID0gMDsKKyAgICAgIGVycm9yID0gbmV3 IEVycm9yKGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbiAoKSB7CisgICAgICAgIHJldHVy biBhcmdzW2FyZ0luZGV4KytdOworICAgICAgfSkpOworICAgICAgZXJyb3IubmFtZSA9ICdJbnZh cmlhbnQgVmlvbGF0aW9uJzsKKyAgICB9CisKKyAgICBlcnJvci5mcmFtZXNUb1BvcCA9IDE7IC8v IHdlIGRvbid0IGNhcmUgYWJvdXQgaW52YXJpYW50J3Mgb3duIGZyYW1lCisgICAgdGhyb3cgZXJy b3I7CisgIH0KK30KKworbW9kdWxlLmV4cG9ydHMgPSBpbnZhcmlhbnQ7Cit9LHt9XSwxNDE6W2Z1 bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworJ3VzZSBzdHJpY3QnOworCisvKioKKyAq IENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0 cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRo ZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUg cm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAor ICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0 aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogQHR5cGVjaGVja3MKKyAqLworCisvKioKKyAqIEBw YXJhbSB7Kn0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2hlY2suCisgKiBAcmV0dXJuIHtib29sZWFu fSBXaGV0aGVyIG9yIG5vdCB0aGUgb2JqZWN0IGlzIGEgRE9NIG5vZGUuCisgKi8KK2Z1bmN0aW9u IGlzTm9kZShvYmplY3QpIHsKKyAgcmV0dXJuICEhKG9iamVjdCAmJiAodHlwZW9mIE5vZGUgPT09 ICdmdW5jdGlvbicgPyBvYmplY3QgaW5zdGFuY2VvZiBOb2RlIDogdHlwZW9mIG9iamVjdCA9PT0g J29iamVjdCcgJiYgdHlwZW9mIG9iamVjdC5ub2RlVHlwZSA9PT0gJ251bWJlcicgJiYgdHlwZW9m IG9iamVjdC5ub2RlTmFtZSA9PT0gJ3N0cmluZycpKTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBp c05vZGU7Cit9LHt9XSwxNDI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworJ3Vz ZSBzdHJpY3QnOworCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9v aywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2Rl IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAq IExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4g QW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4g dGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogQHR5cGVjaGVj a3MKKyAqLworCit2YXIgaXNOb2RlID0gX2RlcmVxXygxNDEpOworCisvKioKKyAqIEBwYXJhbSB7 Kn0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2hlY2suCisgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0 aGVyIG9yIG5vdCB0aGUgb2JqZWN0IGlzIGEgRE9NIHRleHQgbm9kZS4KKyAqLworZnVuY3Rpb24g aXNUZXh0Tm9kZShvYmplY3QpIHsKKyAgcmV0dXJuIGlzTm9kZShvYmplY3QpICYmIG9iamVjdC5u b2RlVHlwZSA9PSAzOworfQorCittb2R1bGUuZXhwb3J0cyA9IGlzVGV4dE5vZGU7Cit9LHsiMTQx IjoxNDF9XSwxNDM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBD b3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMg cmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUg QlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJv b3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAq IG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhl IHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAorICogQHR5cGVjaGVja3Mgc3RhdGljLW9ubHkKKyAq LworCisndXNlIHN0cmljdCc7CisKKy8qKgorICogTWVtb2l6ZXMgdGhlIHJldHVybiB2YWx1ZSBv ZiBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBvbmUgc3RyaW5nIGFyZ3VtZW50LgorICovCisKK2Z1 bmN0aW9uIG1lbW9pemVTdHJpbmdPbmx5KGNhbGxiYWNrKSB7CisgIHZhciBjYWNoZSA9IHt9Owor ICByZXR1cm4gZnVuY3Rpb24gKHN0cmluZykgeworICAgIGlmICghY2FjaGUuaGFzT3duUHJvcGVy dHkoc3RyaW5nKSkgeworICAgICAgY2FjaGVbc3RyaW5nXSA9IGNhbGxiYWNrLmNhbGwodGhpcywg c3RyaW5nKTsKKyAgICB9CisgICAgcmV0dXJuIGNhY2hlW3N0cmluZ107CisgIH07Cit9CisKK21v ZHVsZS5leHBvcnRzID0gbWVtb2l6ZVN0cmluZ09ubHk7Cit9LHt9XSwxNDQ6W2Z1bmN0aW9uKF9k ZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2Vu dCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBz b3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQg aW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291 cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJl IGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAq IEB0eXBlY2hlY2tzCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgRXhlY3V0aW9uRW52aXJv bm1lbnQgPSBfZGVyZXFfKDEyNik7CisKK3ZhciBwZXJmb3JtYW5jZTsKKworaWYgKEV4ZWN1dGlv bkVudmlyb25tZW50LmNhblVzZURPTSkgeworICBwZXJmb3JtYW5jZSA9IHdpbmRvdy5wZXJmb3Jt YW5jZSB8fCB3aW5kb3cubXNQZXJmb3JtYW5jZSB8fCB3aW5kb3cud2Via2l0UGVyZm9ybWFuY2U7 Cit9CisKK21vZHVsZS5leHBvcnRzID0gcGVyZm9ybWFuY2UgfHwge307Cit9LHsiMTI2IjoxMjZ9 XSwxNDU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworJ3VzZSBzdHJpY3QnOwor CisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICog QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2Vk IHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmls ZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25h bCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMg ZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogQHR5cGVjaGVja3MKKyAqLworCit2 YXIgcGVyZm9ybWFuY2UgPSBfZGVyZXFfKDE0NCk7CisKK3ZhciBwZXJmb3JtYW5jZU5vdzsKKwor LyoqCisgKiBEZXRlY3QgaWYgd2UgY2FuIHVzZSBgd2luZG93LnBlcmZvcm1hbmNlLm5vdygpYCBh bmQgZ3JhY2VmdWxseSBmYWxsYmFjayB0bworICogYERhdGUubm93KClgIGlmIGl0IGRvZXNuJ3Qg ZXhpc3QuIFdlIG5lZWQgdG8gc3VwcG9ydCBGaXJlZm94IDwgMTUgZm9yIG5vdworICogYmVjYXVz ZSBvZiBGYWNlYm9vaydzIHRlc3RpbmcgaW5mcmFzdHJ1Y3R1cmUuCisgKi8KK2lmIChwZXJmb3Jt YW5jZS5ub3cpIHsKKyAgcGVyZm9ybWFuY2VOb3cgPSBmdW5jdGlvbiBwZXJmb3JtYW5jZU5vdygp IHsKKyAgICByZXR1cm4gcGVyZm9ybWFuY2Uubm93KCk7CisgIH07Cit9IGVsc2UgeworICBwZXJm b3JtYW5jZU5vdyA9IGZ1bmN0aW9uIHBlcmZvcm1hbmNlTm93KCkgeworICAgIHJldHVybiBEYXRl Lm5vdygpOworICB9OworfQorCittb2R1bGUuZXhwb3J0cyA9IHBlcmZvcm1hbmNlTm93OworfSx7 IjE0NCI6MTQ0fV0sMTQ2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgor ICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmln aHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIg dGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRo ZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50 CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGlu IHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiBAdHlwZWNoZWNrcworICogCisgKi8KKworLypl c2xpbnQtZGlzYWJsZSBuby1zZWxmLWNvbXBhcmUgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIg aGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5OworCisvKioK KyAqIGlubGluZWQgT2JqZWN0LmlzIHBvbHlmaWxsIHRvIGF2b2lkIHJlcXVpcmluZyBjb25zdW1l cnMgc2hpcCB0aGVpciBvd24KKyAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVT L2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pcwor ICovCitmdW5jdGlvbiBpcyh4LCB5KSB7CisgIC8vIFNhbWVWYWx1ZSBhbGdvcml0aG0KKyAgaWYg KHggPT09IHkpIHsKKyAgICAvLyBTdGVwcyAxLTUsIDctMTAKKyAgICAvLyBTdGVwcyA2LmItNi5l OiArMCAhPSAtMAorICAgIC8vIEFkZGVkIHRoZSBub256ZXJvIHkgY2hlY2sgdG8gbWFrZSBGbG93 IGhhcHB5LCBidXQgaXQgaXMgcmVkdW5kYW50CisgICAgcmV0dXJuIHggIT09IDAgfHwgeSAhPT0g MCB8fCAxIC8geCA9PT0gMSAvIHk7CisgIH0gZWxzZSB7CisgICAgLy8gU3RlcCA2LmE6IE5hTiA9 PSBOYU4KKyAgICByZXR1cm4geCAhPT0geCAmJiB5ICE9PSB5OworICB9Cit9CisKKy8qKgorICog UGVyZm9ybXMgZXF1YWxpdHkgYnkgaXRlcmF0aW5nIHRocm91Z2gga2V5cyBvbiBhbiBvYmplY3Qg YW5kIHJldHVybmluZyBmYWxzZQorICogd2hlbiBhbnkga2V5IGhhcyB2YWx1ZXMgd2hpY2ggYXJl IG5vdCBzdHJpY3RseSBlcXVhbCBiZXR3ZWVuIHRoZSBhcmd1bWVudHMuCisgKiBSZXR1cm5zIHRy dWUgd2hlbiB0aGUgdmFsdWVzIG9mIGFsbCBrZXlzIGFyZSBzdHJpY3RseSBlcXVhbC4KKyAqLwor ZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakEsIG9iakIpIHsKKyAgaWYgKGlzKG9iakEsIG9iakIp KSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBpZiAodHlwZW9mIG9iakEgIT09ICdvYmpl Y3QnIHx8IG9iakEgPT09IG51bGwgfHwgdHlwZW9mIG9iakIgIT09ICdvYmplY3QnIHx8IG9iakIg PT09IG51bGwpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2YXIga2V5c0EgPSBPYmpl Y3Qua2V5cyhvYmpBKTsKKyAgdmFyIGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7CisKKyAgaWYg KGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9 CisKKyAgLy8gVGVzdCBmb3IgQSdzIGtleXMgZGlmZmVyZW50IGZyb20gQi4KKyAgZm9yICh2YXIg aSA9IDA7IGkgPCBrZXlzQS5sZW5ndGg7IGkrKykgeworICAgIGlmICghaGFzT3duUHJvcGVydHku Y2FsbChvYmpCLCBrZXlzQVtpXSkgfHwgIWlzKG9iakFba2V5c0FbaV1dLCBvYmpCW2tleXNBW2ld XSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsK K30KKworbW9kdWxlLmV4cG9ydHMgPSBzaGFsbG93RXF1YWw7Cit9LHt9XSwxNDc6W2Z1bmN0aW9u KF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE1LCBG YWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJj ZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0 aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2Ug dHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91 bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisK Kyd1c2Ugc3RyaWN0JzsKKwordmFyIGVtcHR5RnVuY3Rpb24gPSBfZGVyZXFfKDEzMik7CisKKy8q KgorICogU2ltaWxhciB0byBpbnZhcmlhbnQgYnV0IG9ubHkgbG9ncyBhIHdhcm5pbmcgaWYgdGhl IGNvbmRpdGlvbiBpcyBub3QgbWV0LgorICogVGhpcyBjYW4gYmUgdXNlZCB0byBsb2cgaXNzdWVz IGluIGRldmVsb3BtZW50IGVudmlyb25tZW50cyBpbiBjcml0aWNhbAorICogcGF0aHMuIFJlbW92 aW5nIHRoZSBsb2dnaW5nIGNvZGUgZm9yIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzIHdpbGwga2Vl cCB0aGUKKyAqIHNhbWUgbG9naWMgYW5kIGZvbGxvdyB0aGUgc2FtZSBjb2RlIHBhdGhzLgorICov CisKK3ZhciB3YXJuaW5nID0gZW1wdHlGdW5jdGlvbjsKKworaWYgKCJkZXZlbG9wbWVudCIgIT09 ICdwcm9kdWN0aW9uJykgeworICAoZnVuY3Rpb24gKCkgeworICAgIHZhciBwcmludFdhcm5pbmcg PSBmdW5jdGlvbiBwcmludFdhcm5pbmcoZm9ybWF0KSB7CisgICAgICBmb3IgKHZhciBfbGVuID0g YXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwg X2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHsKKyAgICAgICAgYXJnc1tfa2V5IC0gMV0g PSBhcmd1bWVudHNbX2tleV07CisgICAgICB9CisKKyAgICAgIHZhciBhcmdJbmRleCA9IDA7Cisg ICAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICsgZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1 bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107CisgICAgICB9KTsK KyAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgY29u c29sZS5lcnJvcihtZXNzYWdlKTsKKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIC8vIC0t LSBXZWxjb21lIHRvIGRlYnVnZ2luZyBSZWFjdCAtLS0KKyAgICAgICAgLy8gVGhpcyBlcnJvciB3 YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCB5b3UgY2FuIHVzZSB0aGlzIHN0YWNr CisgICAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2Fybmlu ZyB0byBmaXJlLgorICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7CisgICAgICB9IGNh dGNoICh4KSB7fQorICAgIH07CisKKyAgICB3YXJuaW5nID0gZnVuY3Rpb24gd2FybmluZyhjb25k aXRpb24sIGZvcm1hdCkgeworICAgICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7CisgICAg ICAgIHRocm93IG5ldyBFcnJvcignYHdhcm5pbmcoY29uZGl0aW9uLCBmb3JtYXQsIC4uLmFyZ3Mp YCByZXF1aXJlcyBhIHdhcm5pbmcgJyArICdtZXNzYWdlIGFyZ3VtZW50Jyk7CisgICAgICB9CisK KyAgICAgIGlmIChmb3JtYXQuaW5kZXhPZignRmFpbGVkIENvbXBvc2l0ZSBwcm9wVHlwZTogJykg PT09IDApIHsKKyAgICAgICAgcmV0dXJuOyAvLyBJZ25vcmUgQ29tcG9zaXRlQ29tcG9uZW50IHBy b3B0eXBlIGNoZWNrLgorICAgICAgfQorCisgICAgICBpZiAoIWNvbmRpdGlvbikgeworICAgICAg ICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMiA+ IDIgPyBfbGVuMiAtIDIgOiAwKSwgX2tleTIgPSAyOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7 CisgICAgICAgICAgYXJnc1tfa2V5MiAtIDJdID0gYXJndW1lbnRzW19rZXkyXTsKKyAgICAgICAg fQorCisgICAgICAgIHByaW50V2FybmluZy5hcHBseSh1bmRlZmluZWQsIFtmb3JtYXRdLmNvbmNh dChhcmdzKSk7CisgICAgICB9CisgICAgfTsKKyAgfSkoKTsKK30KKworbW9kdWxlLmV4cG9ydHMg PSB3YXJuaW5nOworfSx7IjEzMiI6MTMyfV0sMTQ4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxl eHBvcnRzKXsKKyd1c2Ugc3RyaWN0JzsKKy8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJz ICovCit2YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5 OwordmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVt ZXJhYmxlOworCitmdW5jdGlvbiB0b09iamVjdCh2YWwpIHsKKwlpZiAodmFsID09PSBudWxsIHx8 IHZhbCA9PT0gdW5kZWZpbmVkKSB7CisJCXRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3Np Z24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7CisJfQorCisJcmV0 dXJuIE9iamVjdCh2YWwpOworfQorCitmdW5jdGlvbiBzaG91bGRVc2VOYXRpdmUoKSB7CisJdHJ5 IHsKKwkJaWYgKCFPYmplY3QuYXNzaWduKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkv LyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVy c2lvbnMuCisKKwkJLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRh aWw/aWQ9NDExOAorCQl2YXIgdGVzdDEgPSBuZXcgU3RyaW5nKCdhYmMnKTsgIC8vIGVzbGludC1k aXNhYmxlLWxpbmUKKwkJdGVzdDFbNV0gPSAnZGUnOworCQlpZiAoT2JqZWN0LmdldE93blByb3Bl cnR5TmFtZXModGVzdDEpWzBdID09PSAnNScpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJ CS8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTYK KwkJdmFyIHRlc3QyID0ge307CisJCWZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQkJ dGVzdDJbJ18nICsgU3RyaW5nLmZyb21DaGFyQ29kZShpKV0gPSBpOworCQl9CisJCXZhciBvcmRl cjIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MikubWFwKGZ1bmN0aW9uIChuKSB7 CisJCQlyZXR1cm4gdGVzdDJbbl07CisJCX0pOworCQlpZiAob3JkZXIyLmpvaW4oJycpICE9PSAn MDEyMzQ1Njc4OScpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCS8vIGh0dHBzOi8vYnVn cy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTYKKwkJdmFyIHRlc3QzID0g e307CisJCSdhYmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24g KGxldHRlcikgeworCQkJdGVzdDNbbGV0dGVyXSA9IGxldHRlcjsKKwkJfSk7CisJCWlmIChPYmpl Y3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LCB0ZXN0MykpLmpvaW4oJycpICE9PQorCQkJCSdhYmNk ZWZnaGlqa2xtbm9wcXJzdCcpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiB0 cnVlOworCX0gY2F0Y2ggKGUpIHsKKwkJLy8gV2UgZG9uJ3QgZXhwZWN0IGFueSBvZiB0aGUgYWJv dmUgdG8gdGhyb3csIGJ1dCBiZXR0ZXIgdG8gYmUgc2FmZS4KKwkJcmV0dXJuIGZhbHNlOworCX0K K30KKworbW9kdWxlLmV4cG9ydHMgPSBzaG91bGRVc2VOYXRpdmUoKSA/IE9iamVjdC5hc3NpZ24g OiBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHsKKwl2YXIgZnJvbTsKKwl2YXIgdG8gPSB0b09i amVjdCh0YXJnZXQpOworCXZhciBzeW1ib2xzOworCisJZm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1 bWVudHMubGVuZ3RoOyBzKyspIHsKKwkJZnJvbSA9IE9iamVjdChhcmd1bWVudHNbc10pOworCisJ CWZvciAodmFyIGtleSBpbiBmcm9tKSB7CisJCQlpZiAoaGFzT3duUHJvcGVydHkuY2FsbChmcm9t LCBrZXkpKSB7CisJCQkJdG9ba2V5XSA9IGZyb21ba2V5XTsKKwkJCX0KKwkJfQorCisJCWlmIChP YmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7CisJCQlzeW1ib2xzID0gT2JqZWN0LmdldE93 blByb3BlcnR5U3ltYm9scyhmcm9tKTsKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgc3ltYm9scy5s ZW5ndGg7IGkrKykgeworCQkJCWlmIChwcm9wSXNFbnVtZXJhYmxlLmNhbGwoZnJvbSwgc3ltYm9s c1tpXSkpIHsKKwkJCQkJdG9bc3ltYm9sc1tpXV0gPSBmcm9tW3N5bWJvbHNbaV1dOworCQkJCX0K KwkJCX0KKwkJfQorCX0KKworCXJldHVybiB0bzsKK307CisKK30se31dfSx7fSxbNDFdKSg0MSkK K30pOworfSk7CmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRv bS9kaXN0L3JlYWN0LWRvbS1zZXJ2ZXIubWluLmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRv ci9yZWFjdC1kb20vZGlzdC9yZWFjdC1kb20tc2VydmVyLm1pbi5qcwpuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwMC4uZTNiOTBkMjYKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdh ZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9kaXN0L3JlYWN0LWRvbS1zZXJ2ZXIubWluLmpz CkBAIC0wLDAgKzEsMTUgQEAKKy8qKgorICogUmVhY3RET01TZXJ2ZXIgdjE1LjQuMgorICoKKyAq IENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJl c2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJT RC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290 IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBv ZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBz YW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKyFmdW5jdGlvbihlKXtpZigib2JqZWN0Ij09dHlwZW9m IGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlKW1vZHVsZS5leHBvcnRzPWUocmVx dWlyZSgicmVhY3QiKSk7ZWxzZSBpZigiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUu YW1kKWRlZmluZShbInJlYWN0Il0sZSk7ZWxzZXt2YXIgdDt0PSJ1bmRlZmluZWQiIT10eXBlb2Yg d2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5l ZCIhPXR5cGVvZiBzZWxmP3NlbGY6dGhpcyx0LlJlYWN0RE9NU2VydmVyPWUodC5SZWFjdCl9fShm dW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGUoKX0oZnVuY3Rpb24oKXtyZXR1 cm4gZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gbyhhLHMpe2lmKCFuW2FdKXtpZighdFthXSl7 dmFyIHU9ImZ1bmN0aW9uIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIXMmJnUpcmV0dXJu IHUoYSwhMCk7aWYoaSlyZXR1cm4gaShhLCEwKTt2YXIgbD1uZXcgRXJyb3IoIkNhbm5vdCBmaW5k IG1vZHVsZSAnIithKyInIik7dGhyb3cgbC5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixsfXZhciBj PW5bYV09e2V4cG9ydHM6e319O3RbYV1bMF0uY2FsbChjLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFy IG49dFthXVsxXVtlXTtyZXR1cm4gbyhuP246ZSl9LGMsYy5leHBvcnRzLGUsdCxuLHIpfXJldHVy biBuW2FdLmV4cG9ydHN9Zm9yKHZhciBpPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1 aXJlLGE9MDthPHIubGVuZ3RoO2ErKylvKHJbYV0pO3JldHVybiBvfSh7MTpbZnVuY3Rpb24oZSx0 LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17UHJvcGVydGllczp7ImFyaWEtY3VycmVudCI6MCwiYXJp YS1kZXRhaWxzIjowLCJhcmlhLWRpc2FibGVkIjowLCJhcmlhLWhpZGRlbiI6MCwiYXJpYS1pbnZh bGlkIjowLCJhcmlhLWtleXNob3J0Y3V0cyI6MCwiYXJpYS1sYWJlbCI6MCwiYXJpYS1yb2xlZGVz Y3JpcHRpb24iOjAsImFyaWEtYXV0b2NvbXBsZXRlIjowLCJhcmlhLWNoZWNrZWQiOjAsImFyaWEt ZXhwYW5kZWQiOjAsImFyaWEtaGFzcG9wdXAiOjAsImFyaWEtbGV2ZWwiOjAsImFyaWEtbW9kYWwi OjAsImFyaWEtbXVsdGlsaW5lIjowLCJhcmlhLW11bHRpc2VsZWN0YWJsZSI6MCwiYXJpYS1vcmll bnRhdGlvbiI6MCwiYXJpYS1wbGFjZWhvbGRlciI6MCwiYXJpYS1wcmVzc2VkIjowLCJhcmlhLXJl YWRvbmx5IjowLCJhcmlhLXJlcXVpcmVkIjowLCJhcmlhLXNlbGVjdGVkIjowLCJhcmlhLXNvcnQi OjAsImFyaWEtdmFsdWVtYXgiOjAsImFyaWEtdmFsdWVtaW4iOjAsImFyaWEtdmFsdWVub3ciOjAs ImFyaWEtdmFsdWV0ZXh0IjowLCJhcmlhLWF0b21pYyI6MCwiYXJpYS1idXN5IjowLCJhcmlhLWxp dmUiOjAsImFyaWEtcmVsZXZhbnQiOjAsImFyaWEtZHJvcGVmZmVjdCI6MCwiYXJpYS1ncmFiYmVk IjowLCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnQiOjAsImFyaWEtY29sY291bnQiOjAsImFyaWEtY29s aW5kZXgiOjAsImFyaWEtY29sc3BhbiI6MCwiYXJpYS1jb250cm9scyI6MCwiYXJpYS1kZXNjcmli ZWRieSI6MCwiYXJpYS1lcnJvcm1lc3NhZ2UiOjAsImFyaWEtZmxvd3RvIjowLCJhcmlhLWxhYmVs bGVkYnkiOjAsImFyaWEtb3ducyI6MCwiYXJpYS1wb3NpbnNldCI6MCwiYXJpYS1yb3djb3VudCI6 MCwiYXJpYS1yb3dpbmRleCI6MCwiYXJpYS1yb3dzcGFuIjowLCJhcmlhLXNldHNpemUiOjB9LERP TUF0dHJpYnV0ZU5hbWVzOnt9LERPTVByb3BlcnR5TmFtZXM6e319O3QuZXhwb3J0cz1yfSx7fV0s MjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDMyKSxvPWUoMTI4KSxpPXtm b2N1c0RPTUNvbXBvbmVudDpmdW5jdGlvbigpe28oci5nZXROb2RlRnJvbUluc3RhbmNlKHRoaXMp KX19O3QuZXhwb3J0cz1pfSx7MTI4OjEyOCwzMjozMn1dLDM6W2Z1bmN0aW9uKGUsdCxuKXsidXNl IHN0cmljdCI7ZnVuY3Rpb24gcigpe3ZhciBlPXdpbmRvdy5vcGVyYTtyZXR1cm4ib2JqZWN0Ij09 dHlwZW9mIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnZlcnNpb24mJnBhcnNlSW50KGUudmVyc2lv bigpLDEwKTw9MTJ9ZnVuY3Rpb24gbyhlKXtyZXR1cm4oZS5jdHJsS2V5fHxlLmFsdEtleXx8ZS5t ZXRhS2V5KSYmIShlLmN0cmxLZXkmJmUuYWx0S2V5KX1mdW5jdGlvbiBpKGUpe3N3aXRjaChlKXtj YXNlInRvcENvbXBvc2l0aW9uU3RhcnQiOnJldHVybiBULmNvbXBvc2l0aW9uU3RhcnQ7Y2FzZSJ0 b3BDb21wb3NpdGlvbkVuZCI6cmV0dXJuIFQuY29tcG9zaXRpb25FbmQ7Y2FzZSJ0b3BDb21wb3Np dGlvblVwZGF0ZSI6cmV0dXJuIFQuY29tcG9zaXRpb25VcGRhdGV9fWZ1bmN0aW9uIGEoZSx0KXty ZXR1cm4idG9wS2V5RG93biI9PT1lJiZ0LmtleUNvZGU9PT1DfWZ1bmN0aW9uIHMoZSx0KXtzd2l0 Y2goZSl7Y2FzZSJ0b3BLZXlVcCI6cmV0dXJuIHkuaW5kZXhPZih0LmtleUNvZGUpIT09LTE7Y2Fz ZSJ0b3BLZXlEb3duIjpyZXR1cm4gdC5rZXlDb2RlIT09QztjYXNlInRvcEtleVByZXNzIjpjYXNl InRvcE1vdXNlRG93biI6Y2FzZSJ0b3BCbHVyIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1m dW5jdGlvbiB1KGUpe3ZhciB0PWUuZGV0YWlsO3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmImRh dGEiaW4gdD90LmRhdGE6bnVsbH1mdW5jdGlvbiBsKGUsdCxuLHIpe3ZhciBvLGw7aWYoXz9vPWko ZSk6Uz9zKGUsbikmJihvPVQuY29tcG9zaXRpb25FbmQpOmEoZSxuKSYmKG89VC5jb21wb3NpdGlv blN0YXJ0KSwhbylyZXR1cm4gbnVsbDt4JiYoU3x8byE9PVQuY29tcG9zaXRpb25TdGFydD9vPT09 VC5jb21wb3NpdGlvbkVuZCYmUyYmKGw9Uy5nZXREYXRhKCkpOlM9di5nZXRQb29sZWQocikpO3Zh ciBjPW0uZ2V0UG9vbGVkKG8sdCxuLHIpO2lmKGwpYy5kYXRhPWw7ZWxzZXt2YXIgcD11KG4pO251 bGwhPT1wJiYoYy5kYXRhPXApfXJldHVybiBmLmFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMo YyksY31mdW5jdGlvbiBjKGUsdCl7c3dpdGNoKGUpe2Nhc2UidG9wQ29tcG9zaXRpb25FbmQiOnJl dHVybiB1KHQpO2Nhc2UidG9wS2V5UHJlc3MiOnZhciBuPXQud2hpY2g7cmV0dXJuIG4hPT13P251 bGw6KFA9ITAsayk7Y2FzZSJ0b3BUZXh0SW5wdXQiOnZhciByPXQuZGF0YTtyZXR1cm4gcj09PWsm JlA/bnVsbDpyO2RlZmF1bHQ6cmV0dXJuIG51bGx9fWZ1bmN0aW9uIHAoZSx0KXtpZihTKXtpZigi dG9wQ29tcG9zaXRpb25FbmQiPT09ZXx8IV8mJnMoZSx0KSl7dmFyIG49Uy5nZXREYXRhKCk7cmV0 dXJuIHYucmVsZWFzZShTKSxTPW51bGwsbn1yZXR1cm4gbnVsbH1zd2l0Y2goZSl7Y2FzZSJ0b3BQ YXN0ZSI6cmV0dXJuIG51bGw7Y2FzZSJ0b3BLZXlQcmVzcyI6cmV0dXJuIHQud2hpY2gmJiFvKHQp P1N0cmluZy5mcm9tQ2hhckNvZGUodC53aGljaCk6bnVsbDtjYXNlInRvcENvbXBvc2l0aW9uRW5k IjpyZXR1cm4geD9udWxsOnQuZGF0YTtkZWZhdWx0OnJldHVybiBudWxsfX1mdW5jdGlvbiBkKGUs dCxuLHIpe3ZhciBvO2lmKG89RT9jKGUsbik6cChlLG4pLCFvKXJldHVybiBudWxsO3ZhciBpPWcu Z2V0UG9vbGVkKFQuYmVmb3JlSW5wdXQsdCxuLHIpO3JldHVybiBpLmRhdGE9byxmLmFjY3VtdWxh dGVUd29QaGFzZURpc3BhdGNoZXMoaSksaX12YXIgZj1lKDE5KSxoPWUoMTIwKSx2PWUoMjApLG09 ZSg3OCksZz1lKDgyKSx5PVs5LDEzLDI3LDMyXSxDPTIyOSxfPWguY2FuVXNlRE9NJiYiQ29tcG9z aXRpb25FdmVudCJpbiB3aW5kb3csYj1udWxsO2guY2FuVXNlRE9NJiYiZG9jdW1lbnRNb2RlImlu IGRvY3VtZW50JiYoYj1kb2N1bWVudC5kb2N1bWVudE1vZGUpO3ZhciBFPWguY2FuVXNlRE9NJiYi VGV4dEV2ZW50ImluIHdpbmRvdyYmIWImJiFyKCkseD1oLmNhblVzZURPTSYmKCFffHxiJiZiPjgm JmI8PTExKSx3PTMyLGs9U3RyaW5nLmZyb21DaGFyQ29kZSh3KSxUPXtiZWZvcmVJbnB1dDp7cGhh c2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Im9uQmVmb3JlSW5wdXQiLGNhcHR1cmVkOiJv bkJlZm9yZUlucHV0Q2FwdHVyZSJ9LGRlcGVuZGVuY2llczpbInRvcENvbXBvc2l0aW9uRW5kIiwi dG9wS2V5UHJlc3MiLCJ0b3BUZXh0SW5wdXQiLCJ0b3BQYXN0ZSJdfSxjb21wb3NpdGlvbkVuZDp7 cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Im9uQ29tcG9zaXRpb25FbmQiLGNhcHR1 cmVkOiJvbkNvbXBvc2l0aW9uRW5kQ2FwdHVyZSJ9LGRlcGVuZGVuY2llczpbInRvcEJsdXIiLCJ0 b3BDb21wb3NpdGlvbkVuZCIsInRvcEtleURvd24iLCJ0b3BLZXlQcmVzcyIsInRvcEtleVVwIiwi dG9wTW91c2VEb3duIl19LGNvbXBvc2l0aW9uU3RhcnQ6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVz OntidWJibGVkOiJvbkNvbXBvc2l0aW9uU3RhcnQiLGNhcHR1cmVkOiJvbkNvbXBvc2l0aW9uU3Rh cnRDYXB0dXJlIn0sZGVwZW5kZW5jaWVzOlsidG9wQmx1ciIsInRvcENvbXBvc2l0aW9uU3RhcnQi LCJ0b3BLZXlEb3duIiwidG9wS2V5UHJlc3MiLCJ0b3BLZXlVcCIsInRvcE1vdXNlRG93biJdfSxj b21wb3NpdGlvblVwZGF0ZTp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Im9uQ29t cG9zaXRpb25VcGRhdGUiLGNhcHR1cmVkOiJvbkNvbXBvc2l0aW9uVXBkYXRlQ2FwdHVyZSJ9LGRl cGVuZGVuY2llczpbInRvcEJsdXIiLCJ0b3BDb21wb3NpdGlvblVwZGF0ZSIsInRvcEtleURvd24i LCJ0b3BLZXlQcmVzcyIsInRvcEtleVVwIiwidG9wTW91c2VEb3duIl19fSxQPSExLFM9bnVsbCxN PXtldmVudFR5cGVzOlQsZXh0cmFjdEV2ZW50czpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm5bbChl LHQsbixyKSxkKGUsdCxuLHIpXX19O3QuZXhwb3J0cz1NfSx7MTIwOjEyMCwxOToxOSwyMDoyMCw3 ODo3OCw4Mjo4Mn1dLDQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihl LHQpe3JldHVybiBlK3QuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHJpbmcoMSl9dmFy IG89e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGJvcmRlckltYWdlT3V0c2V0OiEwLGJvcmRl ckltYWdlU2xpY2U6ITAsYm9yZGVySW1hZ2VXaWR0aDohMCxib3hGbGV4OiEwLGJveEZsZXhHcm91 cDohMCxib3hPcmRpbmFsR3JvdXA6ITAsY29sdW1uQ291bnQ6ITAsZmxleDohMCxmbGV4R3Jvdzoh MCxmbGV4UG9zaXRpdmU6ITAsZmxleFNocmluazohMCxmbGV4TmVnYXRpdmU6ITAsZmxleE9yZGVy OiEwLGdyaWRSb3c6ITAsZ3JpZENvbHVtbjohMCxmb250V2VpZ2h0OiEwLGxpbmVDbGFtcDohMCxs aW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx0YWJTaXplOiEwLHdp ZG93czohMCx6SW5kZXg6ITAsem9vbTohMCxmaWxsT3BhY2l0eTohMCxmbG9vZE9wYWNpdHk6ITAs c3RvcE9wYWNpdHk6ITAsc3Ryb2tlRGFzaGFycmF5OiEwLHN0cm9rZURhc2hvZmZzZXQ6ITAsc3Ry b2tlTWl0ZXJsaW1pdDohMCxzdHJva2VPcGFjaXR5OiEwLHN0cm9rZVdpZHRoOiEwfSxpPVsiV2Vi a2l0IiwibXMiLCJNb3oiLCJPIl07T2JqZWN0LmtleXMobykuZm9yRWFjaChmdW5jdGlvbihlKXtp LmZvckVhY2goZnVuY3Rpb24odCl7b1tyKHQsZSldPW9bZV19KX0pO3ZhciBhPXtiYWNrZ3JvdW5k OntiYWNrZ3JvdW5kQXR0YWNobWVudDohMCxiYWNrZ3JvdW5kQ29sb3I6ITAsYmFja2dyb3VuZElt YWdlOiEwLGJhY2tncm91bmRQb3NpdGlvblg6ITAsYmFja2dyb3VuZFBvc2l0aW9uWTohMCxiYWNr Z3JvdW5kUmVwZWF0OiEwfSxiYWNrZ3JvdW5kUG9zaXRpb246e2JhY2tncm91bmRQb3NpdGlvblg6 ITAsYmFja2dyb3VuZFBvc2l0aW9uWTohMH0sYm9yZGVyOntib3JkZXJXaWR0aDohMCxib3JkZXJT dHlsZTohMCxib3JkZXJDb2xvcjohMH0sYm9yZGVyQm90dG9tOntib3JkZXJCb3R0b21XaWR0aDoh MCxib3JkZXJCb3R0b21TdHlsZTohMCxib3JkZXJCb3R0b21Db2xvcjohMH0sYm9yZGVyTGVmdDp7 Ym9yZGVyTGVmdFdpZHRoOiEwLGJvcmRlckxlZnRTdHlsZTohMCxib3JkZXJMZWZ0Q29sb3I6ITB9 LGJvcmRlclJpZ2h0Ontib3JkZXJSaWdodFdpZHRoOiEwLGJvcmRlclJpZ2h0U3R5bGU6ITAsYm9y ZGVyUmlnaHRDb2xvcjohMH0sYm9yZGVyVG9wOntib3JkZXJUb3BXaWR0aDohMCxib3JkZXJUb3BT dHlsZTohMCxib3JkZXJUb3BDb2xvcjohMH0sZm9udDp7Zm9udFN0eWxlOiEwLGZvbnRWYXJpYW50 OiEwLGZvbnRXZWlnaHQ6ITAsZm9udFNpemU6ITAsbGluZUhlaWdodDohMCxmb250RmFtaWx5OiEw fSxvdXRsaW5lOntvdXRsaW5lV2lkdGg6ITAsb3V0bGluZVN0eWxlOiEwLG91dGxpbmVDb2xvcjoh MH19LHM9e2lzVW5pdGxlc3NOdW1iZXI6byxzaG9ydGhhbmRQcm9wZXJ0eUV4cGFuc2lvbnM6YX07 dC5leHBvcnRzPXN9LHt9XSw1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUo NCksbz1lKDEyMCksaT0oZSg1NyksZSgxMjIpLGUoOTQpKSxhPWUoMTMzKSxzPWUoMTM3KSx1PShl KDEzOSkscyhmdW5jdGlvbihlKXtyZXR1cm4gYShlKX0pKSxsPSExLGM9ImNzc0Zsb2F0IjtpZihv LmNhblVzZURPTSl7dmFyIHA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGU7dHJ5 e3AuZm9udD0iIn1jYXRjaChlKXtsPSEwfXZvaWQgMD09PWRvY3VtZW50LmRvY3VtZW50RWxlbWVu dC5zdHlsZS5jc3NGbG9hdCYmKGM9InN0eWxlRmxvYXQiKX12YXIgZD17Y3JlYXRlTWFya3VwRm9y U3R5bGVzOmZ1bmN0aW9uKGUsdCl7dmFyIG49IiI7Zm9yKHZhciByIGluIGUpaWYoZS5oYXNPd25Q cm9wZXJ0eShyKSl7dmFyIG89ZVtyXTtudWxsIT1vJiYobis9dShyKSsiOiIsbis9aShyLG8sdCkr IjsiKX1yZXR1cm4gbnx8bnVsbH0sc2V0VmFsdWVGb3JTdHlsZXM6ZnVuY3Rpb24oZSx0LG4pe3Zh ciBvPWUuc3R5bGU7Zm9yKHZhciBhIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIHM9 aShhLHRbYV0sbik7aWYoImZsb2F0IiE9PWEmJiJjc3NGbG9hdCIhPT1hfHwoYT1jKSxzKW9bYV09 cztlbHNle3ZhciB1PWwmJnIuc2hvcnRoYW5kUHJvcGVydHlFeHBhbnNpb25zW2FdO2lmKHUpZm9y KHZhciBwIGluIHUpb1twXT0iIjtlbHNlIG9bYV09IiJ9fX19O3QuZXhwb3J0cz1kfSx7MTIwOjEy MCwxMjI6MTIyLDEzMzoxMzMsMTM3OjEzNywxMzk6MTM5LDQ6NCw1Nzo1Nyw5NDo5NH1dLDY6W2Z1 bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe2lmKCEoZSBpbnN0YW5j ZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5j dGlvbiIpfXZhciBvPWUoMTExKSxpPWUoMjQpLGE9KGUoMTM0KSxmdW5jdGlvbigpe2Z1bmN0aW9u IGUodCl7cih0aGlzLGUpLHRoaXMuX2NhbGxiYWNrcz1udWxsLHRoaXMuX2NvbnRleHRzPW51bGws dGhpcy5fYXJnPXR9cmV0dXJuIGUucHJvdG90eXBlLmVucXVldWU9ZnVuY3Rpb24oZSx0KXt0aGlz Ll9jYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzfHxbXSx0aGlzLl9jYWxsYmFja3MucHVzaChlKSx0 aGlzLl9jb250ZXh0cz10aGlzLl9jb250ZXh0c3x8W10sdGhpcy5fY29udGV4dHMucHVzaCh0KX0s ZS5wcm90b3R5cGUubm90aWZ5QWxsPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fY2FsbGJhY2tzLHQ9 dGhpcy5fY29udGV4dHMsbj10aGlzLl9hcmc7aWYoZSYmdCl7ZS5sZW5ndGghPT10Lmxlbmd0aD9v KCIyNCIpOnZvaWQgMCx0aGlzLl9jYWxsYmFja3M9bnVsbCx0aGlzLl9jb250ZXh0cz1udWxsO2Zv cih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKWVbcl0uY2FsbCh0W3JdLG4pO2UubGVuZ3RoPTAsdC5s ZW5ndGg9MH19LGUucHJvdG90eXBlLmNoZWNrcG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5f Y2FsbGJhY2tzP3RoaXMuX2NhbGxiYWNrcy5sZW5ndGg6MH0sZS5wcm90b3R5cGUucm9sbGJhY2s9 ZnVuY3Rpb24oZSl7dGhpcy5fY2FsbGJhY2tzJiZ0aGlzLl9jb250ZXh0cyYmKHRoaXMuX2NhbGxi YWNrcy5sZW5ndGg9ZSx0aGlzLl9jb250ZXh0cy5sZW5ndGg9ZSl9LGUucHJvdG90eXBlLnJlc2V0 PWZ1bmN0aW9uKCl7dGhpcy5fY2FsbGJhY2tzPW51bGwsdGhpcy5fY29udGV4dHM9bnVsbH0sZS5w cm90b3R5cGUuZGVzdHJ1Y3Rvcj1mdW5jdGlvbigpe3RoaXMucmVzZXQoKX0sZX0oKSk7dC5leHBv cnRzPWkuYWRkUG9vbGluZ1RvKGEpfSx7MTExOjExMSwxMzQ6MTM0LDI0OjI0fV0sNzpbZnVuY3Rp b24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3ZhciB0PWUubm9kZU5hbWUmJmUu bm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4ic2VsZWN0Ij09PXR8fCJpbnB1dCI9PT10JiYi ZmlsZSI9PT1lLnR5cGV9ZnVuY3Rpb24gbyhlKXt2YXIgdD14LmdldFBvb2xlZChQLmNoYW5nZSxN LGUsdyhlKSk7Qy5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKHQpLEUuYmF0Y2hlZFVwZGF0 ZXMoaSx0KX1mdW5jdGlvbiBpKGUpe3kuZW5xdWV1ZUV2ZW50cyhlKSx5LnByb2Nlc3NFdmVudFF1 ZXVlKCExKX1mdW5jdGlvbiBhKGUsdCl7Uz1lLE09dCxTLmF0dGFjaEV2ZW50KCJvbmNoYW5nZSIs byl9ZnVuY3Rpb24gcygpe1MmJihTLmRldGFjaEV2ZW50KCJvbmNoYW5nZSIsbyksUz1udWxsLE09 bnVsbCl9ZnVuY3Rpb24gdShlLHQpe2lmKCJ0b3BDaGFuZ2UiPT09ZSlyZXR1cm4gdH1mdW5jdGlv biBsKGUsdCxuKXsidG9wRm9jdXMiPT09ZT8ocygpLGEodCxuKSk6InRvcEJsdXIiPT09ZSYmcygp fWZ1bmN0aW9uIGMoZSx0KXtTPWUsTT10LE49ZS52YWx1ZSxPPU9iamVjdC5nZXRPd25Qcm9wZXJ0 eURlc2NyaXB0b3IoZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsInZhbHVlIiksT2JqZWN0LmRlZmlu ZVByb3BlcnR5KFMsInZhbHVlIixBKSxTLmF0dGFjaEV2ZW50P1MuYXR0YWNoRXZlbnQoIm9ucHJv cGVydHljaGFuZ2UiLGQpOlMuYWRkRXZlbnRMaXN0ZW5lcigicHJvcGVydHljaGFuZ2UiLGQsITEp fWZ1bmN0aW9uIHAoKXtTJiYoZGVsZXRlIFMudmFsdWUsUy5kZXRhY2hFdmVudD9TLmRldGFjaEV2 ZW50KCJvbnByb3BlcnR5Y2hhbmdlIixkKTpTLnJlbW92ZUV2ZW50TGlzdGVuZXIoInByb3BlcnR5 Y2hhbmdlIixkLCExKSxTPW51bGwsTT1udWxsLE49bnVsbCxPPW51bGwpfWZ1bmN0aW9uIGQoZSl7 aWYoInZhbHVlIj09PWUucHJvcGVydHlOYW1lKXt2YXIgdD1lLnNyY0VsZW1lbnQudmFsdWU7dCE9 PU4mJihOPXQsbyhlKSl9fWZ1bmN0aW9uIGYoZSx0KXtpZigidG9wSW5wdXQiPT09ZSlyZXR1cm4g dH1mdW5jdGlvbiBoKGUsdCxuKXsidG9wRm9jdXMiPT09ZT8ocCgpLGModCxuKSk6InRvcEJsdXIi PT09ZSYmcCgpfWZ1bmN0aW9uIHYoZSx0KXtpZigoInRvcFNlbGVjdGlvbkNoYW5nZSI9PT1lfHwi dG9wS2V5VXAiPT09ZXx8InRvcEtleURvd24iPT09ZSkmJlMmJlMudmFsdWUhPT1OKXJldHVybiBO PVMudmFsdWUsTX1mdW5jdGlvbiBtKGUpe3JldHVybiBlLm5vZGVOYW1lJiYiaW5wdXQiPT09ZS5u b2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYoImNoZWNrYm94Ij09PWUudHlwZXx8InJhZGlvIj09PWUu dHlwZSl9ZnVuY3Rpb24gZyhlLHQpe2lmKCJ0b3BDbGljayI9PT1lKXJldHVybiB0fXZhciB5PWUo MTYpLEM9ZSgxOSksXz1lKDEyMCksYj1lKDMyKSxFPWUoNzEpLHg9ZSg4MCksdz1lKDEwMSksaz1l KDEwOCksVD1lKDEwOSksUD17Y2hhbmdlOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxl ZDoib25DaGFuZ2UiLGNhcHR1cmVkOiJvbkNoYW5nZUNhcHR1cmUifSxkZXBlbmRlbmNpZXM6WyJ0 b3BCbHVyIiwidG9wQ2hhbmdlIiwidG9wQ2xpY2siLCJ0b3BGb2N1cyIsInRvcElucHV0IiwidG9w S2V5RG93biIsInRvcEtleVVwIiwidG9wU2VsZWN0aW9uQ2hhbmdlIl19fSxTPW51bGwsTT1udWxs LE49bnVsbCxPPW51bGwsST0hMTtfLmNhblVzZURPTSYmKEk9aygiY2hhbmdlIikmJighZG9jdW1l bnQuZG9jdW1lbnRNb2RlfHxkb2N1bWVudC5kb2N1bWVudE1vZGU+OCkpO3ZhciBSPSExO18uY2Fu VXNlRE9NJiYoUj1rKCJpbnB1dCIpJiYoIWRvY3VtZW50LmRvY3VtZW50TW9kZXx8ZG9jdW1lbnQu ZG9jdW1lbnRNb2RlPjExKSk7dmFyIEE9e2dldDpmdW5jdGlvbigpe3JldHVybiBPLmdldC5jYWxs KHRoaXMpfSxzZXQ6ZnVuY3Rpb24oZSl7Tj0iIitlLE8uc2V0LmNhbGwodGhpcyxlKX19LEQ9e2V2 ZW50VHlwZXM6UCxleHRyYWN0RXZlbnRzOmZ1bmN0aW9uKGUsdCxuLG8pe3ZhciBpLGEscz10P2Iu Z2V0Tm9kZUZyb21JbnN0YW5jZSh0KTp3aW5kb3c7aWYocihzKT9JP2k9dTphPWw6VChzKT9SP2k9 ZjooaT12LGE9aCk6bShzKSYmKGk9ZyksaSl7dmFyIGM9aShlLHQpO2lmKGMpe3ZhciBwPXguZ2V0 UG9vbGVkKFAuY2hhbmdlLGMsbixvKTtyZXR1cm4gcC50eXBlPSJjaGFuZ2UiLEMuYWNjdW11bGF0 ZVR3b1BoYXNlRGlzcGF0Y2hlcyhwKSxwfX1hJiZhKGUscyx0KX19O3QuZXhwb3J0cz1EfSx7MTAx OjEwMSwxMDg6MTA4LDEwOToxMDksMTIwOjEyMCwxNjoxNiwxOToxOSwzMjozMiw3MTo3MSw4MDo4 MH1dLDg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3JldHVy biBBcnJheS5pc0FycmF5KHQpJiYodD10WzFdKSx0P3QubmV4dFNpYmxpbmc6ZS5maXJzdENoaWxk fWZ1bmN0aW9uIG8oZSx0LG4pe2MuaW5zZXJ0VHJlZUJlZm9yZShlLHQsbil9ZnVuY3Rpb24gaShl LHQsbil7QXJyYXkuaXNBcnJheSh0KT9zKGUsdFswXSx0WzFdLG4pOnYoZSx0LG4pfWZ1bmN0aW9u IGEoZSx0KXtpZihBcnJheS5pc0FycmF5KHQpKXt2YXIgbj10WzFdO3Q9dFswXSx1KGUsdCxuKSxl LnJlbW92ZUNoaWxkKG4pfWUucmVtb3ZlQ2hpbGQodCl9ZnVuY3Rpb24gcyhlLHQsbixyKXtmb3Io dmFyIG89dDs7KXt2YXIgaT1vLm5leHRTaWJsaW5nO2lmKHYoZSxvLHIpLG89PT1uKWJyZWFrO289 aX19ZnVuY3Rpb24gdShlLHQsbil7Zm9yKDs7KXt2YXIgcj10Lm5leHRTaWJsaW5nO2lmKHI9PT1u KWJyZWFrO2UucmVtb3ZlQ2hpbGQocil9fWZ1bmN0aW9uIGwoZSx0LG4pe3ZhciByPWUucGFyZW50 Tm9kZSxvPWUubmV4dFNpYmxpbmc7bz09PXQ/biYmdihyLGRvY3VtZW50LmNyZWF0ZVRleHROb2Rl KG4pLG8pOm4/KGgobyxuKSx1KHIsbyx0KSk6dShyLGUsdCl9dmFyIGM9ZSg5KSxwPWUoMTMpLGQ9 KGUoMzIpLGUoNTcpLGUoOTMpKSxmPWUoMTEyKSxoPWUoMTEzKSx2PWQoZnVuY3Rpb24oZSx0LG4p e2UuaW5zZXJ0QmVmb3JlKHQsbil9KSxtPXAuZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJr dXAsZz17ZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXA6bSxyZXBsYWNlRGVsaW1pdGVk VGV4dDpsLHByb2Nlc3NVcGRhdGVzOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0 aDtuKyspe3ZhciBzPXRbbl07c3dpdGNoKHMudHlwZSl7Y2FzZSJJTlNFUlRfTUFSS1VQIjpvKGUs cy5jb250ZW50LHIoZSxzLmFmdGVyTm9kZSkpO2JyZWFrO2Nhc2UiTU9WRV9FWElTVElORyI6aShl LHMuZnJvbU5vZGUscihlLHMuYWZ0ZXJOb2RlKSk7YnJlYWs7Y2FzZSJTRVRfTUFSS1VQIjpmKGUs cy5jb250ZW50KTticmVhaztjYXNlIlRFWFRfQ09OVEVOVCI6aChlLHMuY29udGVudCk7YnJlYWs7 Y2FzZSJSRU1PVkVfTk9ERSI6YShlLHMuZnJvbU5vZGUpfX19fTt0LmV4cG9ydHM9Z30sezExMjox MTIsMTEzOjExMywxMzoxMywzMjozMiw1Nzo1Nyw5OjksOTM6OTN9XSw5OltmdW5jdGlvbihlLHQs bil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7aWYobSl7dmFyIHQ9ZS5ub2RlLG49ZS5jaGls ZHJlbjtpZihuLmxlbmd0aClmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKylnKHQsbltyXSxudWxs KTtlbHNlIG51bGwhPWUuaHRtbD9wKHQsZS5odG1sKTpudWxsIT1lLnRleHQmJmYodCxlLnRleHQp fX1mdW5jdGlvbiBvKGUsdCl7ZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0Lm5vZGUsZSkscih0 KX1mdW5jdGlvbiBpKGUsdCl7bT9lLmNoaWxkcmVuLnB1c2godCk6ZS5ub2RlLmFwcGVuZENoaWxk KHQubm9kZSl9ZnVuY3Rpb24gYShlLHQpe20/ZS5odG1sPXQ6cChlLm5vZGUsdCl9ZnVuY3Rpb24g cyhlLHQpe20/ZS50ZXh0PXQ6ZihlLm5vZGUsdCl9ZnVuY3Rpb24gdSgpe3JldHVybiB0aGlzLm5v ZGUubm9kZU5hbWV9ZnVuY3Rpb24gbChlKXtyZXR1cm57bm9kZTplLGNoaWxkcmVuOltdLGh0bWw6 bnVsbCx0ZXh0Om51bGwsdG9TdHJpbmc6dX19dmFyIGM9ZSgxMCkscD1lKDExMiksZD1lKDkzKSxm PWUoMTEzKSxoPTEsdj0xMSxtPSJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJiJudW1iZXIi PT10eXBlb2YgZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHwidW5kZWZpbmVkIiE9dHlwZW9mIG5hdmln YXRvciYmInN0cmluZyI9PXR5cGVvZiBuYXZpZ2F0b3IudXNlckFnZW50JiYvXGJFZGdlXC9cZC8u dGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxnPWQoZnVuY3Rpb24oZSx0LG4pe3Qubm9kZS5ub2Rl VHlwZT09PXZ8fHQubm9kZS5ub2RlVHlwZT09PWgmJiJvYmplY3QiPT09dC5ub2RlLm5vZGVOYW1l LnRvTG93ZXJDYXNlKCkmJihudWxsPT10Lm5vZGUubmFtZXNwYWNlVVJJfHx0Lm5vZGUubmFtZXNw YWNlVVJJPT09Yy5odG1sKT8ocih0KSxlLmluc2VydEJlZm9yZSh0Lm5vZGUsbikpOihlLmluc2Vy dEJlZm9yZSh0Lm5vZGUsbikscih0KSl9KTtsLmluc2VydFRyZWVCZWZvcmU9ZyxsLnJlcGxhY2VD aGlsZFdpdGhUcmVlPW8sbC5xdWV1ZUNoaWxkPWksbC5xdWV1ZUhUTUw9YSxsLnF1ZXVlVGV4dD1z LHQuZXhwb3J0cz1sfSx7MTA6MTAsMTEyOjExMiwxMTM6MTEzLDkzOjkzfV0sMTA6W2Z1bmN0aW9u KGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9e2h0bWw6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkv eGh0bWwiLG1hdGhtbDoiaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCIsc3ZnOiJo dHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyJ9O3QuZXhwb3J0cz1yfSx7fV0sMTE6W2Z1bmN0aW9u KGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3JldHVybihlJnQpPT09dH12YXIg bz1lKDExMSksaT0oZSgxMzQpLHtNVVNUX1VTRV9QUk9QRVJUWToxLEhBU19CT09MRUFOX1ZBTFVF OjQsSEFTX05VTUVSSUNfVkFMVUU6OCxIQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRToyNCxIQVNf T1ZFUkxPQURFRF9CT09MRUFOX1ZBTFVFOjMyLGluamVjdERPTVByb3BlcnR5Q29uZmlnOmZ1bmN0 aW9uKGUpe3ZhciB0PWksbj1lLlByb3BlcnRpZXN8fHt9LGE9ZS5ET01BdHRyaWJ1dGVOYW1lc3Bh Y2VzfHx7fSx1PWUuRE9NQXR0cmlidXRlTmFtZXN8fHt9LGw9ZS5ET01Qcm9wZXJ0eU5hbWVzfHx7 fSxjPWUuRE9NTXV0YXRpb25NZXRob2RzfHx7fTtlLmlzQ3VzdG9tQXR0cmlidXRlJiZzLl9pc0N1 c3RvbUF0dHJpYnV0ZUZ1bmN0aW9ucy5wdXNoKGUuaXNDdXN0b21BdHRyaWJ1dGUpO2Zvcih2YXIg cCBpbiBuKXtzLnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkocCk/bygiNDgiLHApOnZvaWQgMDt2 YXIgZD1wLnRvTG93ZXJDYXNlKCksZj1uW3BdLGg9e2F0dHJpYnV0ZU5hbWU6ZCxhdHRyaWJ1dGVO YW1lc3BhY2U6bnVsbCxwcm9wZXJ0eU5hbWU6cCxtdXRhdGlvbk1ldGhvZDpudWxsLG11c3RVc2VQ cm9wZXJ0eTpyKGYsdC5NVVNUX1VTRV9QUk9QRVJUWSksaGFzQm9vbGVhblZhbHVlOnIoZix0LkhB U19CT09MRUFOX1ZBTFVFKSxoYXNOdW1lcmljVmFsdWU6cihmLHQuSEFTX05VTUVSSUNfVkFMVUUp LGhhc1Bvc2l0aXZlTnVtZXJpY1ZhbHVlOnIoZix0LkhBU19QT1NJVElWRV9OVU1FUklDX1ZBTFVF KSxoYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlOnIoZix0LkhBU19PVkVSTE9BREVEX0JPT0xFQU5f VkFMVUUpfTtpZihoLmhhc0Jvb2xlYW5WYWx1ZStoLmhhc051bWVyaWNWYWx1ZStoLmhhc092ZXJs b2FkZWRCb29sZWFuVmFsdWU8PTE/dm9pZCAwOm8oIjUwIixwKSx1Lmhhc093blByb3BlcnR5KHAp KXt2YXIgdj11W3BdO2guYXR0cmlidXRlTmFtZT12fWEuaGFzT3duUHJvcGVydHkocCkmJihoLmF0 dHJpYnV0ZU5hbWVzcGFjZT1hW3BdKSxsLmhhc093blByb3BlcnR5KHApJiYoaC5wcm9wZXJ0eU5h bWU9bFtwXSksYy5oYXNPd25Qcm9wZXJ0eShwKSYmKGgubXV0YXRpb25NZXRob2Q9Y1twXSkscy5w cm9wZXJ0aWVzW3BdPWh9fX0pLGE9IjpBLVpfYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUw MEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1c XHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1Rjkw MC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEIixzPXtJRF9BVFRSSUJVVEVfTkFNRToiZGF0YS1yZWFj dGlkIixST09UX0FUVFJJQlVURV9OQU1FOiJkYXRhLXJlYWN0cm9vdCIsQVRUUklCVVRFX05BTUVf U1RBUlRfQ0hBUjphLEFUVFJJQlVURV9OQU1FX0NIQVI6YSsiXFwtLjAtOVxcdTAwQjdcXHUwMzAw LVxcdTAzNkZcXHUyMDNGLVxcdTIwNDAiLHByb3BlcnRpZXM6e30sZ2V0UG9zc2libGVTdGFuZGFy ZE5hbWU6bnVsbCxfaXNDdXN0b21BdHRyaWJ1dGVGdW5jdGlvbnM6W10saXNDdXN0b21BdHRyaWJ1 dGU6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxzLl9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9u cy5sZW5ndGg7dCsrKXt2YXIgbj1zLl9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9uc1t0XTtpZihu KGUpKXJldHVybiEwfXJldHVybiExfSxpbmplY3Rpb246aX07dC5leHBvcnRzPXN9LHsxMTE6MTEx LDEzNDoxMzR9XSwxMjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUp e3JldHVybiEhbC5oYXNPd25Qcm9wZXJ0eShlKXx8IXUuaGFzT3duUHJvcGVydHkoZSkmJihzLnRl c3QoZSk/KGxbZV09ITAsITApOih1W2VdPSEwLCExKSl9ZnVuY3Rpb24gbyhlLHQpe3JldHVybiBu dWxsPT10fHxlLmhhc0Jvb2xlYW5WYWx1ZSYmIXR8fGUuaGFzTnVtZXJpY1ZhbHVlJiZpc05hTih0 KXx8ZS5oYXNQb3NpdGl2ZU51bWVyaWNWYWx1ZSYmdDwxfHxlLmhhc092ZXJsb2FkZWRCb29sZWFu VmFsdWUmJnQ9PT0hMX12YXIgaT1lKDExKSxhPShlKDMyKSxlKDU3KSxlKDExMCkpLHM9KGUoMTM5 KSxuZXcgUmVnRXhwKCJeWyIraS5BVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSKyJdWyIraS5BVFRS SUJVVEVfTkFNRV9DSEFSKyJdKiQiKSksdT17fSxsPXt9LGM9e2NyZWF0ZU1hcmt1cEZvcklEOmZ1 bmN0aW9uKGUpe3JldHVybiBpLklEX0FUVFJJQlVURV9OQU1FKyI9IithKGUpfSxzZXRBdHRyaWJ1 dGVGb3JJRDpmdW5jdGlvbihlLHQpe2Uuc2V0QXR0cmlidXRlKGkuSURfQVRUUklCVVRFX05BTUUs dCl9LGNyZWF0ZU1hcmt1cEZvclJvb3Q6ZnVuY3Rpb24oKXtyZXR1cm4gaS5ST09UX0FUVFJJQlVU RV9OQU1FKyc9IiInfSxzZXRBdHRyaWJ1dGVGb3JSb290OmZ1bmN0aW9uKGUpe2Uuc2V0QXR0cmli dXRlKGkuUk9PVF9BVFRSSUJVVEVfTkFNRSwiIil9LGNyZWF0ZU1hcmt1cEZvclByb3BlcnR5OmZ1 bmN0aW9uKGUsdCl7dmFyIG49aS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGUpP2kucHJvcGVy dGllc1tlXTpudWxsO2lmKG4pe2lmKG8obix0KSlyZXR1cm4iIjt2YXIgcj1uLmF0dHJpYnV0ZU5h bWU7cmV0dXJuIG4uaGFzQm9vbGVhblZhbHVlfHxuLmhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWUm JnQ9PT0hMD9yKyc9IiInOnIrIj0iK2EodCl9cmV0dXJuIGkuaXNDdXN0b21BdHRyaWJ1dGUoZSk/ bnVsbD09dD8iIjplKyI9IithKHQpOm51bGx9LGNyZWF0ZU1hcmt1cEZvckN1c3RvbUF0dHJpYnV0 ZTpmdW5jdGlvbihlLHQpe3JldHVybiByKGUpJiZudWxsIT10P2UrIj0iK2EodCk6IiJ9LHNldFZh bHVlRm9yUHJvcGVydHk6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWkucHJvcGVydGllcy5oYXNPd25Q cm9wZXJ0eSh0KT9pLnByb3BlcnRpZXNbdF06bnVsbDtpZihyKXt2YXIgYT1yLm11dGF0aW9uTWV0 aG9kO2lmKGEpYShlLG4pO2Vsc2V7aWYobyhyLG4pKXJldHVybiB2b2lkIHRoaXMuZGVsZXRlVmFs dWVGb3JQcm9wZXJ0eShlLHQpO2lmKHIubXVzdFVzZVByb3BlcnR5KWVbci5wcm9wZXJ0eU5hbWVd PW47ZWxzZXt2YXIgcz1yLmF0dHJpYnV0ZU5hbWUsdT1yLmF0dHJpYnV0ZU5hbWVzcGFjZTt1P2Uu c2V0QXR0cmlidXRlTlModSxzLCIiK24pOnIuaGFzQm9vbGVhblZhbHVlfHxyLmhhc092ZXJsb2Fk ZWRCb29sZWFuVmFsdWUmJm49PT0hMD9lLnNldEF0dHJpYnV0ZShzLCIiKTplLnNldEF0dHJpYnV0 ZShzLCIiK24pfX19ZWxzZSBpZihpLmlzQ3VzdG9tQXR0cmlidXRlKHQpKXJldHVybiB2b2lkIGMu c2V0VmFsdWVGb3JBdHRyaWJ1dGUoZSx0LG4pfSxzZXRWYWx1ZUZvckF0dHJpYnV0ZTpmdW5jdGlv bihlLHQsbil7cih0KSYmKG51bGw9PW4/ZS5yZW1vdmVBdHRyaWJ1dGUodCk6ZS5zZXRBdHRyaWJ1 dGUodCwiIituKSl9LGRlbGV0ZVZhbHVlRm9yQXR0cmlidXRlOmZ1bmN0aW9uKGUsdCl7ZS5yZW1v dmVBdHRyaWJ1dGUodCl9LGRlbGV0ZVZhbHVlRm9yUHJvcGVydHk6ZnVuY3Rpb24oZSx0KXt2YXIg bj1pLnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkodCk/aS5wcm9wZXJ0aWVzW3RdOm51bGw7aWYo bil7dmFyIHI9bi5tdXRhdGlvbk1ldGhvZDtpZihyKXIoZSx2b2lkIDApO2Vsc2UgaWYobi5tdXN0 VXNlUHJvcGVydHkpe3ZhciBvPW4ucHJvcGVydHlOYW1lO24uaGFzQm9vbGVhblZhbHVlP2Vbb109 ITE6ZVtvXT0iIn1lbHNlIGUucmVtb3ZlQXR0cmlidXRlKG4uYXR0cmlidXRlTmFtZSl9ZWxzZSBp LmlzQ3VzdG9tQXR0cmlidXRlKHQpJiZlLnJlbW92ZUF0dHJpYnV0ZSh0KX19O3QuZXhwb3J0cz1j fSx7MTE6MTEsMTEwOjExMCwxMzk6MTM5LDMyOjMyLDU3OjU3fV0sMTM6W2Z1bmN0aW9uKGUsdCxu KXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxMTEpLG89ZSg5KSxpPWUoMTIwKSxhPWUoMTI1KSxzPWUo MTI2KSx1PShlKDEzNCkse2Rhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwOmZ1bmN0aW9u KGUsdCl7aWYoaS5jYW5Vc2VET00/dm9pZCAwOnIoIjU2IiksdD92b2lkIDA6cigiNTciKSwiSFRN TCI9PT1lLm5vZGVOYW1lP3IoIjU4Iik6dm9pZCAwLCJzdHJpbmciPT10eXBlb2YgdCl7dmFyIG49 YSh0LHMpWzBdO2UucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobixlKX1lbHNlIG8ucmVwbGFjZUNo aWxkV2l0aFRyZWUoZSx0KX19KTt0LmV4cG9ydHM9dX0sezExMToxMTEsMTIwOjEyMCwxMjU6MTI1 LDEyNjoxMjYsMTM0OjEzNCw5Ojl9XSwxNDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2 YXIgcj1bIlJlc3BvbmRlckV2ZW50UGx1Z2luIiwiU2ltcGxlRXZlbnRQbHVnaW4iLCJUYXBFdmVu dFBsdWdpbiIsIkVudGVyTGVhdmVFdmVudFBsdWdpbiIsIkNoYW5nZUV2ZW50UGx1Z2luIiwiU2Vs ZWN0RXZlbnRQbHVnaW4iLCJCZWZvcmVJbnB1dEV2ZW50UGx1Z2luIl07dC5leHBvcnRzPXJ9LHt9 XSwxNTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDE5KSxvPWUoMzIpLGk9 ZSg4NCksYT17bW91c2VFbnRlcjp7cmVnaXN0cmF0aW9uTmFtZToib25Nb3VzZUVudGVyIixkZXBl bmRlbmNpZXM6WyJ0b3BNb3VzZU91dCIsInRvcE1vdXNlT3ZlciJdfSxtb3VzZUxlYXZlOntyZWdp c3RyYXRpb25OYW1lOiJvbk1vdXNlTGVhdmUiLGRlcGVuZGVuY2llczpbInRvcE1vdXNlT3V0Iiwi dG9wTW91c2VPdmVyIl19fSxzPXtldmVudFR5cGVzOmEsZXh0cmFjdEV2ZW50czpmdW5jdGlvbihl LHQsbixzKXtpZigidG9wTW91c2VPdmVyIj09PWUmJihuLnJlbGF0ZWRUYXJnZXR8fG4uZnJvbUVs ZW1lbnQpKXJldHVybiBudWxsO2lmKCJ0b3BNb3VzZU91dCIhPT1lJiYidG9wTW91c2VPdmVyIiE9 PWUpcmV0dXJuIG51bGw7dmFyIHU7aWYocy53aW5kb3c9PT1zKXU9cztlbHNle3ZhciBsPXMub3du ZXJEb2N1bWVudDt1PWw/bC5kZWZhdWx0Vmlld3x8bC5wYXJlbnRXaW5kb3c6d2luZG93fXZhciBj LHA7aWYoInRvcE1vdXNlT3V0Ij09PWUpe2M9dDt2YXIgZD1uLnJlbGF0ZWRUYXJnZXR8fG4udG9F bGVtZW50O3A9ZD9vLmdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKGQpOm51bGx9ZWxzZSBjPW51 bGwscD10O2lmKGM9PT1wKXJldHVybiBudWxsO3ZhciBmPW51bGw9PWM/dTpvLmdldE5vZGVGcm9t SW5zdGFuY2UoYyksaD1udWxsPT1wP3U6by5nZXROb2RlRnJvbUluc3RhbmNlKHApLHY9aS5nZXRQ b29sZWQoYS5tb3VzZUxlYXZlLGMsbixzKTt2LnR5cGU9Im1vdXNlbGVhdmUiLHYudGFyZ2V0PWYs di5yZWxhdGVkVGFyZ2V0PWg7dmFyIG09aS5nZXRQb29sZWQoYS5tb3VzZUVudGVyLHAsbixzKTty ZXR1cm4gbS50eXBlPSJtb3VzZWVudGVyIixtLnRhcmdldD1oLG0ucmVsYXRlZFRhcmdldD1mLHIu YWNjdW11bGF0ZUVudGVyTGVhdmVEaXNwYXRjaGVzKHYsbSxjLHApLFt2LG1dfX07dC5leHBvcnRz PXN9LHsxOToxOSwzMjozMiw4NDo4NH1dLDE2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3Qi O2Z1bmN0aW9uIHIoZSl7cmV0dXJuImJ1dHRvbiI9PT1lfHwiaW5wdXQiPT09ZXx8InNlbGVjdCI9 PT1lfHwidGV4dGFyZWEiPT09ZX1mdW5jdGlvbiBvKGUsdCxuKXtzd2l0Y2goZSl7Y2FzZSJvbkNs aWNrIjpjYXNlIm9uQ2xpY2tDYXB0dXJlIjpjYXNlIm9uRG91YmxlQ2xpY2siOmNhc2Uib25Eb3Vi bGVDbGlja0NhcHR1cmUiOmNhc2Uib25Nb3VzZURvd24iOmNhc2Uib25Nb3VzZURvd25DYXB0dXJl IjpjYXNlIm9uTW91c2VNb3ZlIjpjYXNlIm9uTW91c2VNb3ZlQ2FwdHVyZSI6Y2FzZSJvbk1vdXNl VXAiOmNhc2Uib25Nb3VzZVVwQ2FwdHVyZSI6cmV0dXJuISghbi5kaXNhYmxlZHx8IXIodCkpO2Rl ZmF1bHQ6cmV0dXJuITF9fXZhciBpPWUoMTExKSxhPWUoMTcpLHM9ZSgxOCksdT1lKDQ5KSxsPWUo OTEpLGM9ZSg5NykscD0oZSgxMzQpLHt9KSxkPW51bGwsZj1mdW5jdGlvbihlLHQpe2UmJihzLmV4 ZWN1dGVEaXNwYXRjaGVzSW5PcmRlcihlLHQpLGUuaXNQZXJzaXN0ZW50KCl8fGUuY29uc3RydWN0 b3IucmVsZWFzZShlKSl9LGg9ZnVuY3Rpb24oZSl7cmV0dXJuIGYoZSwhMCl9LHY9ZnVuY3Rpb24o ZSl7cmV0dXJuIGYoZSwhMSl9LG09ZnVuY3Rpb24oZSl7cmV0dXJuIi4iK2UuX3Jvb3ROb2RlSUR9 LGc9e2luamVjdGlvbjp7aW5qZWN0RXZlbnRQbHVnaW5PcmRlcjphLmluamVjdEV2ZW50UGx1Z2lu T3JkZXIsaW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lOmEuaW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1l fSxwdXRMaXN0ZW5lcjpmdW5jdGlvbihlLHQsbil7ImZ1bmN0aW9uIiE9dHlwZW9mIG4/aSgiOTQi LHQsdHlwZW9mIG4pOnZvaWQgMDt2YXIgcj1tKGUpLG89cFt0XXx8KHBbdF09e30pO29bcl09bjt2 YXIgcz1hLnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW3RdO3MmJnMuZGlkUHV0TGlzdGVuZXImJnMu ZGlkUHV0TGlzdGVuZXIoZSx0LG4pfSxnZXRMaXN0ZW5lcjpmdW5jdGlvbihlLHQpe3ZhciBuPXBb dF07aWYobyh0LGUuX2N1cnJlbnRFbGVtZW50LnR5cGUsZS5fY3VycmVudEVsZW1lbnQucHJvcHMp KXJldHVybiBudWxsO3ZhciByPW0oZSk7cmV0dXJuIG4mJm5bcl19LGRlbGV0ZUxpc3RlbmVyOmZ1 bmN0aW9uKGUsdCl7dmFyIG49YS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1t0XTtuJiZuLndpbGxE ZWxldGVMaXN0ZW5lciYmbi53aWxsRGVsZXRlTGlzdGVuZXIoZSx0KTt2YXIgcj1wW3RdO2lmKHIp e3ZhciBvPW0oZSk7ZGVsZXRlIHJbb119fSxkZWxldGVBbGxMaXN0ZW5lcnM6ZnVuY3Rpb24oZSl7 dmFyIHQ9bShlKTtmb3IodmFyIG4gaW4gcClpZihwLmhhc093blByb3BlcnR5KG4pJiZwW25dW3Rd KXt2YXIgcj1hLnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW25dO3ImJnIud2lsbERlbGV0ZUxpc3Rl bmVyJiZyLndpbGxEZWxldGVMaXN0ZW5lcihlLG4pLGRlbGV0ZSBwW25dW3RdfX0sZXh0cmFjdEV2 ZW50czpmdW5jdGlvbihlLHQsbixyKXtmb3IodmFyIG8saT1hLnBsdWdpbnMscz0wO3M8aS5sZW5n dGg7cysrKXt2YXIgdT1pW3NdO2lmKHUpe3ZhciBjPXUuZXh0cmFjdEV2ZW50cyhlLHQsbixyKTtj JiYobz1sKG8sYykpfX1yZXR1cm4gb30sZW5xdWV1ZUV2ZW50czpmdW5jdGlvbihlKXtlJiYoZD1s KGQsZSkpfSxwcm9jZXNzRXZlbnRRdWV1ZTpmdW5jdGlvbihlKXt2YXIgdD1kO2Q9bnVsbCxlP2Mo dCxoKTpjKHQsdiksZD9pKCI5NSIpOnZvaWQgMCx1LnJldGhyb3dDYXVnaHRFcnJvcigpfSxfX3B1 cmdlOmZ1bmN0aW9uKCl7cD17fX0sX19nZXRMaXN0ZW5lckJhbms6ZnVuY3Rpb24oKXtyZXR1cm4g cH19O3QuZXhwb3J0cz1nfSx7MTExOjExMSwxMzQ6MTM0LDE3OjE3LDE4OjE4LDQ5OjQ5LDkxOjkx LDk3Ojk3fV0sMTc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcigpe2lm KHMpZm9yKHZhciBlIGluIHUpe3ZhciB0PXVbZV0sbj1zLmluZGV4T2YoZSk7aWYobj4tMT92b2lk IDA6YSgiOTYiLGUpLCFsLnBsdWdpbnNbbl0pe3QuZXh0cmFjdEV2ZW50cz92b2lkIDA6YSgiOTci LGUpLGwucGx1Z2luc1tuXT10O3ZhciByPXQuZXZlbnRUeXBlcztmb3IodmFyIGkgaW4gcilvKHJb aV0sdCxpKT92b2lkIDA6YSgiOTgiLGksZSl9fX1mdW5jdGlvbiBvKGUsdCxuKXtsLmV2ZW50TmFt ZURpc3BhdGNoQ29uZmlncy5oYXNPd25Qcm9wZXJ0eShuKT9hKCI5OSIsbik6dm9pZCAwLGwuZXZl bnROYW1lRGlzcGF0Y2hDb25maWdzW25dPWU7dmFyIHI9ZS5waGFzZWRSZWdpc3RyYXRpb25OYW1l cztpZihyKXtmb3IodmFyIG8gaW4gcilpZihyLmhhc093blByb3BlcnR5KG8pKXt2YXIgcz1yW29d O2kocyx0LG4pfXJldHVybiEwfXJldHVybiEhZS5yZWdpc3RyYXRpb25OYW1lJiYoaShlLnJlZ2lz dHJhdGlvbk5hbWUsdCxuKSwhMCl9ZnVuY3Rpb24gaShlLHQsbil7bC5yZWdpc3RyYXRpb25OYW1l TW9kdWxlc1tlXT9hKCIxMDAiLGUpOnZvaWQgMCxsLnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW2Vd PXQsbC5yZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW2VdPXQuZXZlbnRUeXBlc1tuXS5kZXBl bmRlbmNpZXN9dmFyIGE9ZSgxMTEpLHM9KGUoMTM0KSxudWxsKSx1PXt9LGw9e3BsdWdpbnM6W10s ZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzOnt9LHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzOnt9LHJl Z2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXM6e30scG9zc2libGVSZWdpc3RyYXRpb25OYW1lczpu dWxsLGluamVjdEV2ZW50UGx1Z2luT3JkZXI6ZnVuY3Rpb24oZSl7cz9hKCIxMDEiKTp2b2lkIDAs cz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlKSxyKCl9LGluamVjdEV2ZW50UGx1Z2luc0J5 TmFtZTpmdW5jdGlvbihlKXt2YXIgdD0hMTtmb3IodmFyIG4gaW4gZSlpZihlLmhhc093blByb3Bl cnR5KG4pKXt2YXIgbz1lW25dO3UuaGFzT3duUHJvcGVydHkobikmJnVbbl09PT1vfHwodVtuXT9h KCIxMDIiLG4pOnZvaWQgMCx1W25dPW8sdD0hMCl9dCYmcigpfSxnZXRQbHVnaW5Nb2R1bGVGb3JF dmVudDpmdW5jdGlvbihlKXt2YXIgdD1lLmRpc3BhdGNoQ29uZmlnO2lmKHQucmVnaXN0cmF0aW9u TmFtZSlyZXR1cm4gbC5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1t0LnJlZ2lzdHJhdGlvbk5hbWVd fHxudWxsO2lmKHZvaWQgMCE9PXQucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMpe3ZhciBuPXQucGhh c2VkUmVnaXN0cmF0aW9uTmFtZXM7Zm9yKHZhciByIGluIG4paWYobi5oYXNPd25Qcm9wZXJ0eShy KSl7dmFyIG89bC5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tuW3JdXTtpZihvKXJldHVybiBvfX1y ZXR1cm4gbnVsbH0sX3Jlc2V0RXZlbnRQbHVnaW5zOmZ1bmN0aW9uKCl7cz1udWxsO2Zvcih2YXIg ZSBpbiB1KXUuaGFzT3duUHJvcGVydHkoZSkmJmRlbGV0ZSB1W2VdO2wucGx1Z2lucy5sZW5ndGg9 MDt2YXIgdD1sLmV2ZW50TmFtZURpc3BhdGNoQ29uZmlncztmb3IodmFyIG4gaW4gdCl0Lmhhc093 blByb3BlcnR5KG4pJiZkZWxldGUgdFtuXTt2YXIgcj1sLnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVz O2Zvcih2YXIgbyBpbiByKXIuaGFzT3duUHJvcGVydHkobykmJmRlbGV0ZSByW29dfX07dC5leHBv cnRzPWx9LHsxMTE6MTExLDEzNDoxMzR9XSwxODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0 IjtmdW5jdGlvbiByKGUpe3JldHVybiJ0b3BNb3VzZVVwIj09PWV8fCJ0b3BUb3VjaEVuZCI9PT1l fHwidG9wVG91Y2hDYW5jZWwiPT09ZX1mdW5jdGlvbiBvKGUpe3JldHVybiJ0b3BNb3VzZU1vdmUi PT09ZXx8InRvcFRvdWNoTW92ZSI9PT1lfWZ1bmN0aW9uIGkoZSl7cmV0dXJuInRvcE1vdXNlRG93 biI9PT1lfHwidG9wVG91Y2hTdGFydCI9PT1lfWZ1bmN0aW9uIGEoZSx0LG4scil7dmFyIG89ZS50 eXBlfHwidW5rbm93bi1ldmVudCI7ZS5jdXJyZW50VGFyZ2V0PWcuZ2V0Tm9kZUZyb21JbnN0YW5j ZShyKSx0P3YuaW52b2tlR3VhcmRlZENhbGxiYWNrV2l0aENhdGNoKG8sbixlKTp2Lmludm9rZUd1 YXJkZWRDYWxsYmFjayhvLG4sZSksZS5jdXJyZW50VGFyZ2V0PW51bGx9ZnVuY3Rpb24gcyhlLHQp e3ZhciBuPWUuX2Rpc3BhdGNoTGlzdGVuZXJzLHI9ZS5fZGlzcGF0Y2hJbnN0YW5jZXM7aWYoQXJy YXkuaXNBcnJheShuKSlmb3IodmFyIG89MDtvPG4ubGVuZ3RoJiYhZS5pc1Byb3BhZ2F0aW9uU3Rv cHBlZCgpO28rKylhKGUsdCxuW29dLHJbb10pO2Vsc2UgbiYmYShlLHQsbixyKTtlLl9kaXNwYXRj aExpc3RlbmVycz1udWxsLGUuX2Rpc3BhdGNoSW5zdGFuY2VzPW51bGx9ZnVuY3Rpb24gdShlKXt2 YXIgdD1lLl9kaXNwYXRjaExpc3RlbmVycyxuPWUuX2Rpc3BhdGNoSW5zdGFuY2VzO2lmKEFycmF5 LmlzQXJyYXkodCkpe2Zvcih2YXIgcj0wO3I8dC5sZW5ndGgmJiFlLmlzUHJvcGFnYXRpb25TdG9w cGVkKCk7cisrKWlmKHRbcl0oZSxuW3JdKSlyZXR1cm4gbltyXX1lbHNlIGlmKHQmJnQoZSxuKSly ZXR1cm4gbjtyZXR1cm4gbnVsbH1mdW5jdGlvbiBsKGUpe3ZhciB0PXUoZSk7cmV0dXJuIGUuX2Rp c3BhdGNoSW5zdGFuY2VzPW51bGwsZS5fZGlzcGF0Y2hMaXN0ZW5lcnM9bnVsbCx0fWZ1bmN0aW9u IGMoZSl7dmFyIHQ9ZS5fZGlzcGF0Y2hMaXN0ZW5lcnMsbj1lLl9kaXNwYXRjaEluc3RhbmNlcztB cnJheS5pc0FycmF5KHQpP2goIjEwMyIpOnZvaWQgMCxlLmN1cnJlbnRUYXJnZXQ9dD9nLmdldE5v ZGVGcm9tSW5zdGFuY2Uobik6bnVsbDt2YXIgcj10P3QoZSk6bnVsbDtyZXR1cm4gZS5jdXJyZW50 VGFyZ2V0PW51bGwsZS5fZGlzcGF0Y2hMaXN0ZW5lcnM9bnVsbCxlLl9kaXNwYXRjaEluc3RhbmNl cz1udWxsLHJ9ZnVuY3Rpb24gcChlKXtyZXR1cm4hIWUuX2Rpc3BhdGNoTGlzdGVuZXJzfXZhciBk LGYsaD1lKDExMSksdj1lKDQ5KSxtPShlKDEzNCksZSgxMzkpLHtpbmplY3RDb21wb25lbnRUcmVl OmZ1bmN0aW9uKGUpe2Q9ZX0saW5qZWN0VHJlZVRyYXZlcnNhbDpmdW5jdGlvbihlKXtmPWV9fSks Zz17aXNFbmRpc2g6cixpc01vdmVpc2g6byxpc1N0YXJ0aXNoOmksZXhlY3V0ZURpcmVjdERpc3Bh dGNoOmMsZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyOnMsZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVy U3RvcEF0VHJ1ZTpsLGhhc0Rpc3BhdGNoZXM6cCxnZXRJbnN0YW5jZUZyb21Ob2RlOmZ1bmN0aW9u KGUpe3JldHVybiBkLmdldEluc3RhbmNlRnJvbU5vZGUoZSl9LGdldE5vZGVGcm9tSW5zdGFuY2U6 ZnVuY3Rpb24oZSl7cmV0dXJuIGQuZ2V0Tm9kZUZyb21JbnN0YW5jZShlKX0saXNBbmNlc3Rvcjpm dW5jdGlvbihlLHQpe3JldHVybiBmLmlzQW5jZXN0b3IoZSx0KX0sZ2V0TG93ZXN0Q29tbW9uQW5j ZXN0b3I6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZi5nZXRMb3dlc3RDb21tb25BbmNlc3RvcihlLHQp fSxnZXRQYXJlbnRJbnN0YW5jZTpmdW5jdGlvbihlKXtyZXR1cm4gZi5nZXRQYXJlbnRJbnN0YW5j ZShlKX0sdHJhdmVyc2VUd29QaGFzZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGYudHJhdmVyc2VU d29QaGFzZShlLHQsbil9LHRyYXZlcnNlRW50ZXJMZWF2ZTpmdW5jdGlvbihlLHQsbixyLG8pe3Jl dHVybiBmLnRyYXZlcnNlRW50ZXJMZWF2ZShlLHQsbixyLG8pfSxpbmplY3Rpb246bX07dC5leHBv cnRzPWd9LHsxMTE6MTExLDEzNDoxMzQsMTM5OjEzOSw0OTo0OX1dLDE5OltmdW5jdGlvbihlLHQs bil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4pe3ZhciByPXQuZGlzcGF0Y2hDb25maWcu cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXNbbl07cmV0dXJuIGcoZSxyKX1mdW5jdGlvbiBvKGUsdCxu KXt2YXIgbz1yKGUsbix0KTtvJiYobi5fZGlzcGF0Y2hMaXN0ZW5lcnM9dihuLl9kaXNwYXRjaExp c3RlbmVycyxvKSxuLl9kaXNwYXRjaEluc3RhbmNlcz12KG4uX2Rpc3BhdGNoSW5zdGFuY2VzLGUp KX1mdW5jdGlvbiBpKGUpe2UmJmUuZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFt ZXMmJmgudHJhdmVyc2VUd29QaGFzZShlLl90YXJnZXRJbnN0LG8sZSl9ZnVuY3Rpb24gYShlKXtp ZihlJiZlLmRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzKXt2YXIgdD1lLl90 YXJnZXRJbnN0LG49dD9oLmdldFBhcmVudEluc3RhbmNlKHQpOm51bGw7aC50cmF2ZXJzZVR3b1Bo YXNlKG4sbyxlKX19ZnVuY3Rpb24gcyhlLHQsbil7aWYobiYmbi5kaXNwYXRjaENvbmZpZy5yZWdp c3RyYXRpb25OYW1lKXt2YXIgcj1uLmRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUsbz1n KGUscik7byYmKG4uX2Rpc3BhdGNoTGlzdGVuZXJzPXYobi5fZGlzcGF0Y2hMaXN0ZW5lcnMsbyks bi5fZGlzcGF0Y2hJbnN0YW5jZXM9dihuLl9kaXNwYXRjaEluc3RhbmNlcyxlKSl9fWZ1bmN0aW9u IHUoZSl7ZSYmZS5kaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lJiZzKGUuX3RhcmdldElu c3QsbnVsbCxlKX1mdW5jdGlvbiBsKGUpe20oZSxpKX1mdW5jdGlvbiBjKGUpe20oZSxhKX1mdW5j dGlvbiBwKGUsdCxuLHIpe2gudHJhdmVyc2VFbnRlckxlYXZlKG4scixzLGUsdCl9ZnVuY3Rpb24g ZChlKXttKGUsdSl9dmFyIGY9ZSgxNiksaD1lKDE4KSx2PWUoOTEpLG09ZSg5NyksZz0oZSgxMzkp LGYuZ2V0TGlzdGVuZXIpLHk9e2FjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXM6bCxhY2N1bXVs YXRlVHdvUGhhc2VEaXNwYXRjaGVzU2tpcFRhcmdldDpjLGFjY3VtdWxhdGVEaXJlY3REaXNwYXRj aGVzOmQsYWNjdW11bGF0ZUVudGVyTGVhdmVEaXNwYXRjaGVzOnB9O3QuZXhwb3J0cz15fSx7MTM5 OjEzOSwxNjoxNiwxODoxOCw5MTo5MSw5Nzo5N31dLDIwOltmdW5jdGlvbihlLHQsbil7InVzZSBz dHJpY3QiO2Z1bmN0aW9uIHIoZSl7dGhpcy5fcm9vdD1lLHRoaXMuX3N0YXJ0VGV4dD10aGlzLmdl dFRleHQoKSx0aGlzLl9mYWxsYmFja1RleHQ9bnVsbH12YXIgbz1lKDE0MCksaT1lKDI0KSxhPWUo MTA1KTtvKHIucHJvdG90eXBlLHtkZXN0cnVjdG9yOmZ1bmN0aW9uKCl7dGhpcy5fcm9vdD1udWxs LHRoaXMuX3N0YXJ0VGV4dD1udWxsLHRoaXMuX2ZhbGxiYWNrVGV4dD1udWxsfSxnZXRUZXh0OmZ1 bmN0aW9uKCl7cmV0dXJuInZhbHVlImluIHRoaXMuX3Jvb3Q/dGhpcy5fcm9vdC52YWx1ZTp0aGlz Ll9yb290W2EoKV19LGdldERhdGE6ZnVuY3Rpb24oKXtpZih0aGlzLl9mYWxsYmFja1RleHQpcmV0 dXJuIHRoaXMuX2ZhbGxiYWNrVGV4dDt2YXIgZSx0LG49dGhpcy5fc3RhcnRUZXh0LHI9bi5sZW5n dGgsbz10aGlzLmdldFRleHQoKSxpPW8ubGVuZ3RoO2ZvcihlPTA7ZTxyJiZuW2VdPT09b1tlXTtl KyspO3ZhciBhPXItZTtmb3IodD0xO3Q8PWEmJm5bci10XT09PW9baS10XTt0KyspO3ZhciBzPXQ+ MT8xLXQ6dm9pZCAwO3JldHVybiB0aGlzLl9mYWxsYmFja1RleHQ9by5zbGljZShlLHMpLHRoaXMu X2ZhbGxiYWNrVGV4dH19KSxpLmFkZFBvb2xpbmdUbyhyKSx0LmV4cG9ydHM9cn0sezEwNToxMDUs MTQwOjE0MCwyNDoyNH1dLDIxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUo MTEpLG89ci5pbmplY3Rpb24uTVVTVF9VU0VfUFJPUEVSVFksaT1yLmluamVjdGlvbi5IQVNfQk9P TEVBTl9WQUxVRSxhPXIuaW5qZWN0aW9uLkhBU19OVU1FUklDX1ZBTFVFLHM9ci5pbmplY3Rpb24u SEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUUsdT1yLmluamVjdGlvbi5IQVNfT1ZFUkxPQURFRF9C T09MRUFOX1ZBTFVFLGw9e2lzQ3VzdG9tQXR0cmlidXRlOlJlZ0V4cC5wcm90b3R5cGUudGVzdC5i aW5kKG5ldyBSZWdFeHAoIl4oZGF0YXxhcmlhKS1bIityLkFUVFJJQlVURV9OQU1FX0NIQVIrIl0q JCIpKSxQcm9wZXJ0aWVzOnthY2NlcHQ6MCxhY2NlcHRDaGFyc2V0OjAsYWNjZXNzS2V5OjAsYWN0 aW9uOjAsYWxsb3dGdWxsU2NyZWVuOmksYWxsb3dUcmFuc3BhcmVuY3k6MCxhbHQ6MCxhczowLGFz eW5jOmksYXV0b0NvbXBsZXRlOjAsYXV0b1BsYXk6aSxjYXB0dXJlOmksY2VsbFBhZGRpbmc6MCxj ZWxsU3BhY2luZzowLGNoYXJTZXQ6MCxjaGFsbGVuZ2U6MCxjaGVja2VkOm98aSxjaXRlOjAsY2xh c3NJRDowLGNsYXNzTmFtZTowLGNvbHM6cyxjb2xTcGFuOjAsY29udGVudDowLGNvbnRlbnRFZGl0 YWJsZTowLGNvbnRleHRNZW51OjAsY29udHJvbHM6aSxjb29yZHM6MCxjcm9zc09yaWdpbjowLGRh dGE6MCxkYXRlVGltZTowLGRlZmF1bHQ6aSxkZWZlcjppLGRpcjowLGRpc2FibGVkOmksZG93bmxv YWQ6dSxkcmFnZ2FibGU6MCxlbmNUeXBlOjAsZm9ybTowLGZvcm1BY3Rpb246MCxmb3JtRW5jVHlw ZTowLGZvcm1NZXRob2Q6MCxmb3JtTm9WYWxpZGF0ZTppLGZvcm1UYXJnZXQ6MCxmcmFtZUJvcmRl cjowLGhlYWRlcnM6MCxoZWlnaHQ6MCxoaWRkZW46aSxoaWdoOjAsaHJlZjowLGhyZWZMYW5nOjAs aHRtbEZvcjowLGh0dHBFcXVpdjowLGljb246MCxpZDowLGlucHV0TW9kZTowLGludGVncml0eTow LGlzOjAsa2V5UGFyYW1zOjAsa2V5VHlwZTowLGtpbmQ6MCxsYWJlbDowLGxhbmc6MCxsaXN0OjAs bG9vcDppLGxvdzowLG1hbmlmZXN0OjAsbWFyZ2luSGVpZ2h0OjAsbWFyZ2luV2lkdGg6MCxtYXg6 MCxtYXhMZW5ndGg6MCxtZWRpYTowLG1lZGlhR3JvdXA6MCxtZXRob2Q6MCxtaW46MCxtaW5MZW5n dGg6MCxtdWx0aXBsZTpvfGksbXV0ZWQ6b3xpLG5hbWU6MCxub25jZTowLG5vVmFsaWRhdGU6aSxv cGVuOmksb3B0aW11bTowLHBhdHRlcm46MCxwbGFjZWhvbGRlcjowLHBsYXlzSW5saW5lOmkscG9z dGVyOjAscHJlbG9hZDowLHByb2ZpbGU6MCxyYWRpb0dyb3VwOjAscmVhZE9ubHk6aSxyZWZlcnJl clBvbGljeTowLHJlbDowLHJlcXVpcmVkOmkscmV2ZXJzZWQ6aSxyb2xlOjAscm93czpzLHJvd1Nw YW46YSxzYW5kYm94OjAsc2NvcGU6MCxzY29wZWQ6aSxzY3JvbGxpbmc6MCxzZWFtbGVzczppLHNl bGVjdGVkOm98aSxzaGFwZTowLHNpemU6cyxzaXplczowLHNwYW46cyxzcGVsbENoZWNrOjAsc3Jj OjAsc3JjRG9jOjAsc3JjTGFuZzowLHNyY1NldDowLHN0YXJ0OmEsc3RlcDowLHN0eWxlOjAsc3Vt bWFyeTowLHRhYkluZGV4OjAsdGFyZ2V0OjAsdGl0bGU6MCx0eXBlOjAsdXNlTWFwOjAsdmFsdWU6 MCx3aWR0aDowLHdtb2RlOjAsd3JhcDowLGFib3V0OjAsZGF0YXR5cGU6MCxpbmxpc3Q6MCxwcmVm aXg6MCxwcm9wZXJ0eTowLHJlc291cmNlOjAsdHlwZW9mOjAsdm9jYWI6MCxhdXRvQ2FwaXRhbGl6 ZTowLGF1dG9Db3JyZWN0OjAsYXV0b1NhdmU6MCxjb2xvcjowLGl0ZW1Qcm9wOjAsaXRlbVNjb3Bl OmksaXRlbVR5cGU6MCxpdGVtSUQ6MCxpdGVtUmVmOjAscmVzdWx0czowLHNlY3VyaXR5OjAsdW5z ZWxlY3RhYmxlOjB9LERPTUF0dHJpYnV0ZU5hbWVzOnthY2NlcHRDaGFyc2V0OiJhY2NlcHQtY2hh cnNldCIsY2xhc3NOYW1lOiJjbGFzcyIsaHRtbEZvcjoiZm9yIixodHRwRXF1aXY6Imh0dHAtZXF1 aXYifSxET01Qcm9wZXJ0eU5hbWVzOnt9fTt0LmV4cG9ydHM9bH0sezExOjExfV0sMjI6W2Z1bmN0 aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt2YXIgdD0vWz06XS9nLG49eyI9 IjoiPTAiLCI6IjoiPTIifSxyPSgiIitlKS5yZXBsYWNlKHQsZnVuY3Rpb24oZSl7cmV0dXJuIG5b ZV19KTtyZXR1cm4iJCIrcn1mdW5jdGlvbiBvKGUpe3ZhciB0PS8oPTB8PTIpL2csbj17Ij0wIjoi PSIsIj0yIjoiOiJ9LHI9Ii4iPT09ZVswXSYmIiQiPT09ZVsxXT9lLnN1YnN0cmluZygyKTplLnN1 YnN0cmluZygxKTtyZXR1cm4oIiIrcikucmVwbGFjZSh0LGZ1bmN0aW9uKGUpe3JldHVybiBuW2Vd fSl9dmFyIGk9e2VzY2FwZTpyLHVuZXNjYXBlOm99O3QuZXhwb3J0cz1pfSx7fV0sMjM6W2Z1bmN0 aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtudWxsIT1lLmNoZWNrZWRMaW5r JiZudWxsIT1lLnZhbHVlTGluaz9zKCI4NyIpOnZvaWQgMH1mdW5jdGlvbiBvKGUpe3IoZSksbnVs bCE9ZS52YWx1ZXx8bnVsbCE9ZS5vbkNoYW5nZT9zKCI4OCIpOnZvaWQgMH1mdW5jdGlvbiBpKGUp e3IoZSksbnVsbCE9ZS5jaGVja2VkfHxudWxsIT1lLm9uQ2hhbmdlP3MoIjg5Iik6dm9pZCAwfWZ1 bmN0aW9uIGEoZSl7aWYoZSl7dmFyIHQ9ZS5nZXROYW1lKCk7aWYodClyZXR1cm4iIENoZWNrIHRo ZSByZW5kZXIgbWV0aG9kIG9mIGAiK3QrImAuIn1yZXR1cm4iIn12YXIgcz1lKDExMSksdT1lKDEx OCksbD1lKDYyKSxjPShlKDEzNCksZSgxMzkpLHtidXR0b246ITAsY2hlY2tib3g6ITAsaW1hZ2U6 ITAsaGlkZGVuOiEwLHJhZGlvOiEwLHJlc2V0OiEwLHN1Ym1pdDohMH0pLHA9e3ZhbHVlOmZ1bmN0 aW9uKGUsdCxuKXtyZXR1cm4hZVt0XXx8Y1tlLnR5cGVdfHxlLm9uQ2hhbmdlfHxlLnJlYWRPbmx5 fHxlLmRpc2FibGVkP251bGw6bmV3IEVycm9yKCJZb3UgcHJvdmlkZWQgYSBgdmFsdWVgIHByb3Ag dG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gYG9uQ2hhbmdlYCBoYW5kbGVyLiBUaGlzIHdpbGwg cmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiBJZiB0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUg dXNlIGBkZWZhdWx0VmFsdWVgLiBPdGhlcndpc2UsIHNldCBlaXRoZXIgYG9uQ2hhbmdlYCBvciBg cmVhZE9ubHlgLiIpfSxjaGVja2VkOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4hZVt0XXx8ZS5vbkNo YW5nZXx8ZS5yZWFkT25seXx8ZS5kaXNhYmxlZD9udWxsOm5ldyBFcnJvcigiWW91IHByb3ZpZGVk IGEgYGNoZWNrZWRgIHByb3AgdG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gYG9uQ2hhbmdlYCBo YW5kbGVyLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiBJZiB0aGUgZmllbGQg c2hvdWxkIGJlIG11dGFibGUgdXNlIGBkZWZhdWx0Q2hlY2tlZGAuIE90aGVyd2lzZSwgc2V0IGVp dGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuIil9LG9uQ2hhbmdlOnUuUHJvcFR5cGVzLmZ1 bmN9LGQ9e30sZj17Y2hlY2tQcm9wVHlwZXM6ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgciBpbiBw KXtpZihwLmhhc093blByb3BlcnR5KHIpKXZhciBvPXBbcl0odCxyLGUsInByb3AiLG51bGwsbCk7 byBpbnN0YW5jZW9mIEVycm9yJiYhKG8ubWVzc2FnZSBpbiBkKSYmKGRbby5tZXNzYWdlXT0hMCxh KG4pKX19LGdldFZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnZhbHVlTGluaz8obyhlKSxlLnZh bHVlTGluay52YWx1ZSk6ZS52YWx1ZX0sZ2V0Q2hlY2tlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5j aGVja2VkTGluaz8oaShlKSxlLmNoZWNrZWRMaW5rLnZhbHVlKTplLmNoZWNrZWR9LGV4ZWN1dGVP bkNoYW5nZTpmdW5jdGlvbihlLHQpe3JldHVybiBlLnZhbHVlTGluaz8obyhlKSxlLnZhbHVlTGlu ay5yZXF1ZXN0Q2hhbmdlKHQudGFyZ2V0LnZhbHVlKSk6ZS5jaGVja2VkTGluaz8oaShlKSxlLmNo ZWNrZWRMaW5rLnJlcXVlc3RDaGFuZ2UodC50YXJnZXQuY2hlY2tlZCkpOmUub25DaGFuZ2U/ZS5v bkNoYW5nZS5jYWxsKHZvaWQgMCx0KTp2b2lkIDB9fTt0LmV4cG9ydHM9Zn0sezExMToxMTEsMTE4 OjExOCwxMzQ6MTM0LDEzOToxMzksNjI6NjJ9XSwyNDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3Ry aWN0Ijt2YXIgcj1lKDExMSksbz0oZSgxMzQpLGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYodC5p bnN0YW5jZVBvb2wubGVuZ3RoKXt2YXIgbj10Lmluc3RhbmNlUG9vbC5wb3AoKTtyZXR1cm4gdC5j YWxsKG4sZSksbn1yZXR1cm4gbmV3IHQoZSl9KSxpPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztp ZihuLmluc3RhbmNlUG9vbC5sZW5ndGgpe3ZhciByPW4uaW5zdGFuY2VQb29sLnBvcCgpO3JldHVy biBuLmNhbGwocixlLHQpLHJ9cmV0dXJuIG5ldyBuKGUsdCl9LGE9ZnVuY3Rpb24oZSx0LG4pe3Zh ciByPXRoaXM7aWYoci5pbnN0YW5jZVBvb2wubGVuZ3RoKXt2YXIgbz1yLmluc3RhbmNlUG9vbC5w b3AoKTtyZXR1cm4gci5jYWxsKG8sZSx0LG4pLG99cmV0dXJuIG5ldyByKGUsdCxuKX0scz1mdW5j dGlvbihlLHQsbixyKXt2YXIgbz10aGlzO2lmKG8uaW5zdGFuY2VQb29sLmxlbmd0aCl7dmFyIGk9 by5pbnN0YW5jZVBvb2wucG9wKCk7cmV0dXJuIG8uY2FsbChpLGUsdCxuLHIpLGl9cmV0dXJuIG5l dyBvKGUsdCxuLHIpfSx1PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7ZSBpbnN0YW5jZW9mIHQ/dm9p ZCAwOnIoIjI1IiksZS5kZXN0cnVjdG9yKCksdC5pbnN0YW5jZVBvb2wubGVuZ3RoPHQucG9vbFNp emUmJnQuaW5zdGFuY2VQb29sLnB1c2goZSl9LGw9MTAsYz1vLHA9ZnVuY3Rpb24oZSx0KXt2YXIg bj1lO3JldHVybiBuLmluc3RhbmNlUG9vbD1bXSxuLmdldFBvb2xlZD10fHxjLG4ucG9vbFNpemV8 fChuLnBvb2xTaXplPWwpLG4ucmVsZWFzZT11LG59LGQ9e2FkZFBvb2xpbmdUbzpwLG9uZUFyZ3Vt ZW50UG9vbGVyOm8sdHdvQXJndW1lbnRQb29sZXI6aSx0aHJlZUFyZ3VtZW50UG9vbGVyOmEsZm91 ckFyZ3VtZW50UG9vbGVyOnN9O3QuZXhwb3J0cz1kfSx7MTExOjExMSwxMzQ6MTM0fV0sMjU6W2Z1 bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gT2JqZWN0LnBy b3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdil8fChlW3ZdPWYrKyxwW2Vbdl1dPXt9KSxw W2Vbdl1dfXZhciBvLGk9ZSgxNDApLGE9ZSgxNykscz1lKDUwKSx1PWUoOTApLGw9ZSgxMDYpLGM9 ZSgxMDgpLHA9e30sZD0hMSxmPTAsaD17dG9wQWJvcnQ6ImFib3J0Iix0b3BBbmltYXRpb25FbmQ6 bCgiYW5pbWF0aW9uZW5kIil8fCJhbmltYXRpb25lbmQiLHRvcEFuaW1hdGlvbkl0ZXJhdGlvbjps KCJhbmltYXRpb25pdGVyYXRpb24iKXx8ImFuaW1hdGlvbml0ZXJhdGlvbiIsdG9wQW5pbWF0aW9u U3RhcnQ6bCgiYW5pbWF0aW9uc3RhcnQiKXx8ImFuaW1hdGlvbnN0YXJ0Iix0b3BCbHVyOiJibHVy Iix0b3BDYW5QbGF5OiJjYW5wbGF5Iix0b3BDYW5QbGF5VGhyb3VnaDoiY2FucGxheXRocm91Z2gi LHRvcENoYW5nZToiY2hhbmdlIix0b3BDbGljazoiY2xpY2siLHRvcENvbXBvc2l0aW9uRW5kOiJj b21wb3NpdGlvbmVuZCIsdG9wQ29tcG9zaXRpb25TdGFydDoiY29tcG9zaXRpb25zdGFydCIsdG9w Q29tcG9zaXRpb25VcGRhdGU6ImNvbXBvc2l0aW9udXBkYXRlIix0b3BDb250ZXh0TWVudToiY29u dGV4dG1lbnUiLHRvcENvcHk6ImNvcHkiLHRvcEN1dDoiY3V0Iix0b3BEb3VibGVDbGljazoiZGJs Y2xpY2siLHRvcERyYWc6ImRyYWciLHRvcERyYWdFbmQ6ImRyYWdlbmQiLHRvcERyYWdFbnRlcjoi ZHJhZ2VudGVyIix0b3BEcmFnRXhpdDoiZHJhZ2V4aXQiLHRvcERyYWdMZWF2ZToiZHJhZ2xlYXZl Iix0b3BEcmFnT3ZlcjoiZHJhZ292ZXIiLHRvcERyYWdTdGFydDoiZHJhZ3N0YXJ0Iix0b3BEcm9w OiJkcm9wIix0b3BEdXJhdGlvbkNoYW5nZToiZHVyYXRpb25jaGFuZ2UiLHRvcEVtcHRpZWQ6ImVt cHRpZWQiLHRvcEVuY3J5cHRlZDoiZW5jcnlwdGVkIix0b3BFbmRlZDoiZW5kZWQiLHRvcEVycm9y OiJlcnJvciIsdG9wRm9jdXM6ImZvY3VzIix0b3BJbnB1dDoiaW5wdXQiLHRvcEtleURvd246Imtl eWRvd24iLHRvcEtleVByZXNzOiJrZXlwcmVzcyIsdG9wS2V5VXA6ImtleXVwIix0b3BMb2FkZWRE YXRhOiJsb2FkZWRkYXRhIix0b3BMb2FkZWRNZXRhZGF0YToibG9hZGVkbWV0YWRhdGEiLHRvcExv YWRTdGFydDoibG9hZHN0YXJ0Iix0b3BNb3VzZURvd246Im1vdXNlZG93biIsdG9wTW91c2VNb3Zl OiJtb3VzZW1vdmUiLHRvcE1vdXNlT3V0OiJtb3VzZW91dCIsdG9wTW91c2VPdmVyOiJtb3VzZW92 ZXIiLHRvcE1vdXNlVXA6Im1vdXNldXAiLHRvcFBhc3RlOiJwYXN0ZSIsdG9wUGF1c2U6InBhdXNl IiwKK3RvcFBsYXk6InBsYXkiLHRvcFBsYXlpbmc6InBsYXlpbmciLHRvcFByb2dyZXNzOiJwcm9n cmVzcyIsdG9wUmF0ZUNoYW5nZToicmF0ZWNoYW5nZSIsdG9wU2Nyb2xsOiJzY3JvbGwiLHRvcFNl ZWtlZDoic2Vla2VkIix0b3BTZWVraW5nOiJzZWVraW5nIix0b3BTZWxlY3Rpb25DaGFuZ2U6InNl bGVjdGlvbmNoYW5nZSIsdG9wU3RhbGxlZDoic3RhbGxlZCIsdG9wU3VzcGVuZDoic3VzcGVuZCIs dG9wVGV4dElucHV0OiJ0ZXh0SW5wdXQiLHRvcFRpbWVVcGRhdGU6InRpbWV1cGRhdGUiLHRvcFRv dWNoQ2FuY2VsOiJ0b3VjaGNhbmNlbCIsdG9wVG91Y2hFbmQ6InRvdWNoZW5kIix0b3BUb3VjaE1v dmU6InRvdWNobW92ZSIsdG9wVG91Y2hTdGFydDoidG91Y2hzdGFydCIsdG9wVHJhbnNpdGlvbkVu ZDpsKCJ0cmFuc2l0aW9uZW5kIil8fCJ0cmFuc2l0aW9uZW5kIix0b3BWb2x1bWVDaGFuZ2U6InZv bHVtZWNoYW5nZSIsdG9wV2FpdGluZzoid2FpdGluZyIsdG9wV2hlZWw6IndoZWVsIn0sdj0iX3Jl YWN0TGlzdGVuZXJzSUQiK1N0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZSgyKSxtPWkoe30scyx7 UmVhY3RFdmVudExpc3RlbmVyOm51bGwsaW5qZWN0aW9uOntpbmplY3RSZWFjdEV2ZW50TGlzdGVu ZXI6ZnVuY3Rpb24oZSl7ZS5zZXRIYW5kbGVUb3BMZXZlbChtLmhhbmRsZVRvcExldmVsKSxtLlJl YWN0RXZlbnRMaXN0ZW5lcj1lfX0sc2V0RW5hYmxlZDpmdW5jdGlvbihlKXttLlJlYWN0RXZlbnRM aXN0ZW5lciYmbS5SZWFjdEV2ZW50TGlzdGVuZXIuc2V0RW5hYmxlZChlKX0saXNFbmFibGVkOmZ1 bmN0aW9uKCl7cmV0dXJuISghbS5SZWFjdEV2ZW50TGlzdGVuZXJ8fCFtLlJlYWN0RXZlbnRMaXN0 ZW5lci5pc0VuYWJsZWQoKSl9LGxpc3RlblRvOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXQsbz1y KG4pLGk9YS5yZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW2VdLHM9MDtzPGkubGVuZ3RoO3Mr Kyl7dmFyIHU9aVtzXTtvLmhhc093blByb3BlcnR5KHUpJiZvW3VdfHwoInRvcFdoZWVsIj09PXU/ Yygid2hlZWwiKT9tLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KCJ0b3BXaGVl bCIsIndoZWVsIixuKTpjKCJtb3VzZXdoZWVsIik/bS5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1 YmJsZWRFdmVudCgidG9wV2hlZWwiLCJtb3VzZXdoZWVsIixuKTptLlJlYWN0RXZlbnRMaXN0ZW5l ci50cmFwQnViYmxlZEV2ZW50KCJ0b3BXaGVlbCIsIkRPTU1vdXNlU2Nyb2xsIixuKToidG9wU2Ny b2xsIj09PXU/Yygic2Nyb2xsIiwhMCk/bS5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcENhcHR1cmVk RXZlbnQoInRvcFNjcm9sbCIsInNjcm9sbCIsbik6bS5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1 YmJsZWRFdmVudCgidG9wU2Nyb2xsIiwic2Nyb2xsIixtLlJlYWN0RXZlbnRMaXN0ZW5lci5XSU5E T1dfSEFORExFKToidG9wRm9jdXMiPT09dXx8InRvcEJsdXIiPT09dT8oYygiZm9jdXMiLCEwKT8o bS5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcENhcHR1cmVkRXZlbnQoInRvcEZvY3VzIiwiZm9jdXMi LG4pLG0uUmVhY3RFdmVudExpc3RlbmVyLnRyYXBDYXB0dXJlZEV2ZW50KCJ0b3BCbHVyIiwiYmx1 ciIsbikpOmMoImZvY3VzaW4iKSYmKG0uUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZl bnQoInRvcEZvY3VzIiwiZm9jdXNpbiIsbiksbS5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJs ZWRFdmVudCgidG9wQmx1ciIsImZvY3Vzb3V0IixuKSksby50b3BCbHVyPSEwLG8udG9wRm9jdXM9 ITApOmguaGFzT3duUHJvcGVydHkodSkmJm0uUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVk RXZlbnQodSxoW3VdLG4pLG9bdV09ITApfX0sdHJhcEJ1YmJsZWRFdmVudDpmdW5jdGlvbihlLHQs bil7cmV0dXJuIG0uUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQoZSx0LG4pfSx0 cmFwQ2FwdHVyZWRFdmVudDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIG0uUmVhY3RFdmVudExpc3Rl bmVyLnRyYXBDYXB0dXJlZEV2ZW50KGUsdCxuKX0sc3VwcG9ydHNFdmVudFBhZ2VYWTpmdW5jdGlv bigpe2lmKCFkb2N1bWVudC5jcmVhdGVFdmVudClyZXR1cm4hMTt2YXIgZT1kb2N1bWVudC5jcmVh dGVFdmVudCgiTW91c2VFdmVudCIpO3JldHVybiBudWxsIT1lJiYicGFnZVgiaW4gZX0sZW5zdXJl U2Nyb2xsVmFsdWVNb25pdG9yaW5nOmZ1bmN0aW9uKCl7aWYodm9pZCAwPT09byYmKG89bS5zdXBw b3J0c0V2ZW50UGFnZVhZKCkpLCFvJiYhZCl7dmFyIGU9dS5yZWZyZXNoU2Nyb2xsVmFsdWVzO20u UmVhY3RFdmVudExpc3RlbmVyLm1vbml0b3JTY3JvbGxWYWx1ZShlKSxkPSEwfX19KTt0LmV4cG9y dHM9bX0sezEwNjoxMDYsMTA4OjEwOCwxNDA6MTQwLDE3OjE3LDUwOjUwLDkwOjkwfV0sMjY6W2Z1 bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24obil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4s cil7dmFyIG89dm9pZCAwPT09ZVtuXTtudWxsIT10JiZvJiYoZVtuXT1pKHQsITApKX12YXIgbz1l KDY0KSxpPWUoMTA3KSxhPShlKDIyKSxlKDExNCkpLHM9ZSgxMTUpO2UoMTM5KTsidW5kZWZpbmVk IiE9dHlwZW9mIG4mJm4uZW52LDE7dmFyIHU9e2luc3RhbnRpYXRlQ2hpbGRyZW46ZnVuY3Rpb24o ZSx0LG4sbyl7aWYobnVsbD09ZSlyZXR1cm4gbnVsbDt2YXIgaT17fTtyZXR1cm4gcyhlLHIsaSks aX0sdXBkYXRlQ2hpbGRyZW46ZnVuY3Rpb24oZSx0LG4scixzLHUsbCxjLHApe2lmKHR8fGUpe3Zh ciBkLGY7Zm9yKGQgaW4gdClpZih0Lmhhc093blByb3BlcnR5KGQpKXtmPWUmJmVbZF07dmFyIGg9 ZiYmZi5fY3VycmVudEVsZW1lbnQsdj10W2RdO2lmKG51bGwhPWYmJmEoaCx2KSlvLnJlY2VpdmVD b21wb25lbnQoZix2LHMsYyksdFtkXT1mO2Vsc2V7ZiYmKHJbZF09by5nZXRIb3N0Tm9kZShmKSxv LnVubW91bnRDb21wb25lbnQoZiwhMSkpO3ZhciBtPWkodiwhMCk7dFtkXT1tO3ZhciBnPW8ubW91 bnRDb21wb25lbnQobSxzLHUsbCxjLHApO24ucHVzaChnKX19Zm9yKGQgaW4gZSkhZS5oYXNPd25Q cm9wZXJ0eShkKXx8dCYmdC5oYXNPd25Qcm9wZXJ0eShkKXx8KGY9ZVtkXSxyW2RdPW8uZ2V0SG9z dE5vZGUoZiksby51bm1vdW50Q29tcG9uZW50KGYsITEpKX19LHVubW91bnRDaGlsZHJlbjpmdW5j dGlvbihlLHQpe2Zvcih2YXIgbiBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkobikpe3ZhciByPWVb bl07by51bm1vdW50Q29tcG9uZW50KHIsdCl9fX07dC5leHBvcnRzPXV9KS5jYWxsKHRoaXMsdm9p ZCAwKX0sezEwNzoxMDcsMTE0OjExNCwxMTU6MTE1LDEzOToxMzksMjI6MjIsNjQ6NjR9XSwyNzpb ZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDgpLG89ZSgzNSksaT17cHJvY2Vz c0NoaWxkcmVuVXBkYXRlczpvLmRhbmdlcm91c2x5UHJvY2Vzc0NoaWxkcmVuVXBkYXRlcyxyZXBs YWNlTm9kZVdpdGhNYXJrdXA6ci5kYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cH07dC5l eHBvcnRzPWl9LHszNTozNSw4Ojh9XSwyODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2 YXIgcj1lKDExMSksbz0oZSgxMzQpLCExKSxpPXtyZXBsYWNlTm9kZVdpdGhNYXJrdXA6bnVsbCxw cm9jZXNzQ2hpbGRyZW5VcGRhdGVzOm51bGwsaW5qZWN0aW9uOntpbmplY3RFbnZpcm9ubWVudDpm dW5jdGlvbihlKXtvP3IoIjEwNCIpOnZvaWQgMCxpLnJlcGxhY2VOb2RlV2l0aE1hcmt1cD1lLnJl cGxhY2VOb2RlV2l0aE1hcmt1cCxpLnByb2Nlc3NDaGlsZHJlblVwZGF0ZXM9ZS5wcm9jZXNzQ2hp bGRyZW5VcGRhdGVzLG89ITB9fX07dC5leHBvcnRzPWl9LHsxMTE6MTExLDEzNDoxMzR9XSwyOTpb ZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe31mdW5jdGlvbiBvKGUs dCl7fWZ1bmN0aW9uIGkoZSl7cmV0dXJuISghZS5wcm90b3R5cGV8fCFlLnByb3RvdHlwZS5pc1Jl YWN0Q29tcG9uZW50KX1mdW5jdGlvbiBhKGUpe3JldHVybiEoIWUucHJvdG90eXBlfHwhZS5wcm90 b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQpfXZhciBzPWUoMTExKSx1PWUoMTQwKSxsPWUoMTE4 KSxjPWUoMjgpLHA9ZSgxMTcpLGQ9ZSg0OSksZj1lKDU2KSxoPShlKDU3KSxlKDYwKSksdj1lKDY0 KSxtPWUoMTI3KSxnPShlKDEzNCksZSgxMzgpKSx5PWUoMTE0KSxDPShlKDEzOSkse0ltcHVyZUNs YXNzOjAsUHVyZUNsYXNzOjEsU3RhdGVsZXNzRnVuY3Rpb25hbDoyfSk7ci5wcm90b3R5cGUucmVu ZGVyPWZ1bmN0aW9uKCl7dmFyIGU9Zi5nZXQodGhpcykuX2N1cnJlbnRFbGVtZW50LnR5cGUsdD1l KHRoaXMucHJvcHMsdGhpcy5jb250ZXh0LHRoaXMudXBkYXRlcik7cmV0dXJuIG8oZSx0KSx0fTt2 YXIgXz0xLGI9e2NvbnN0cnVjdDpmdW5jdGlvbihlKXt0aGlzLl9jdXJyZW50RWxlbWVudD1lLHRo aXMuX3Jvb3ROb2RlSUQ9MCx0aGlzLl9jb21wb3NpdGVUeXBlPW51bGwsdGhpcy5faW5zdGFuY2U9 bnVsbCx0aGlzLl9ob3N0UGFyZW50PW51bGwsdGhpcy5faG9zdENvbnRhaW5lckluZm89bnVsbCx0 aGlzLl91cGRhdGVCYXRjaE51bWJlcj1udWxsLHRoaXMuX3BlbmRpbmdFbGVtZW50PW51bGwsdGhp cy5fcGVuZGluZ1N0YXRlUXVldWU9bnVsbCx0aGlzLl9wZW5kaW5nUmVwbGFjZVN0YXRlPSExLHRo aXMuX3BlbmRpbmdGb3JjZVVwZGF0ZT0hMSx0aGlzLl9yZW5kZXJlZE5vZGVUeXBlPW51bGwsdGhp cy5fcmVuZGVyZWRDb21wb25lbnQ9bnVsbCx0aGlzLl9jb250ZXh0PW51bGwsdGhpcy5fbW91bnRP cmRlcj0wLHRoaXMuX3RvcExldmVsV3JhcHBlcj1udWxsLHRoaXMuX3BlbmRpbmdDYWxsYmFja3M9 bnVsbCx0aGlzLl9jYWxsZWRDb21wb25lbnRXaWxsVW5tb3VudD0hMX0sbW91bnRDb21wb25lbnQ6 ZnVuY3Rpb24oZSx0LG4sdSl7dGhpcy5fY29udGV4dD11LHRoaXMuX21vdW50T3JkZXI9XysrLHRo aXMuX2hvc3RQYXJlbnQ9dCx0aGlzLl9ob3N0Q29udGFpbmVySW5mbz1uO3ZhciBjLHA9dGhpcy5f Y3VycmVudEVsZW1lbnQucHJvcHMsZD10aGlzLl9wcm9jZXNzQ29udGV4dCh1KSxoPXRoaXMuX2N1 cnJlbnRFbGVtZW50LnR5cGUsdj1lLmdldFVwZGF0ZVF1ZXVlKCksZz1pKGgpLHk9dGhpcy5fY29u c3RydWN0Q29tcG9uZW50KGcscCxkLHYpO2d8fG51bGwhPXkmJm51bGwhPXkucmVuZGVyP2EoaCk/ dGhpcy5fY29tcG9zaXRlVHlwZT1DLlB1cmVDbGFzczp0aGlzLl9jb21wb3NpdGVUeXBlPUMuSW1w dXJlQ2xhc3M6KGM9eSxvKGgsYyksbnVsbD09PXl8fHk9PT0hMXx8bC5pc1ZhbGlkRWxlbWVudCh5 KT92b2lkIDA6cygiMTA1IixoLmRpc3BsYXlOYW1lfHxoLm5hbWV8fCJDb21wb25lbnQiKSx5PW5l dyByKGgpLHRoaXMuX2NvbXBvc2l0ZVR5cGU9Qy5TdGF0ZWxlc3NGdW5jdGlvbmFsKSx5LnByb3Bz PXAseS5jb250ZXh0PWQseS5yZWZzPW0seS51cGRhdGVyPXYsdGhpcy5faW5zdGFuY2U9eSxmLnNl dCh5LHRoaXMpO3ZhciBiPXkuc3RhdGU7dm9pZCAwPT09YiYmKHkuc3RhdGU9Yj1udWxsKSwib2Jq ZWN0IiE9dHlwZW9mIGJ8fEFycmF5LmlzQXJyYXkoYik/cygiMTA2Iix0aGlzLmdldE5hbWUoKXx8 IlJlYWN0Q29tcG9zaXRlQ29tcG9uZW50Iik6dm9pZCAwLHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVl PW51bGwsdGhpcy5fcGVuZGluZ1JlcGxhY2VTdGF0ZT0hMSx0aGlzLl9wZW5kaW5nRm9yY2VVcGRh dGU9ITE7dmFyIEU7cmV0dXJuIEU9eS51bnN0YWJsZV9oYW5kbGVFcnJvcj90aGlzLnBlcmZvcm1J bml0aWFsTW91bnRXaXRoRXJyb3JIYW5kbGluZyhjLHQsbixlLHUpOnRoaXMucGVyZm9ybUluaXRp YWxNb3VudChjLHQsbixlLHUpLHkuY29tcG9uZW50RGlkTW91bnQmJmUuZ2V0UmVhY3RNb3VudFJl YWR5KCkuZW5xdWV1ZSh5LmNvbXBvbmVudERpZE1vdW50LHkpLEV9LF9jb25zdHJ1Y3RDb21wb25l bnQ6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMuX2NvbnN0cnVjdENvbXBvbmVudFdpdGhv dXRPd25lcihlLHQsbixyKX0sX2NvbnN0cnVjdENvbXBvbmVudFdpdGhvdXRPd25lcjpmdW5jdGlv bihlLHQsbixyKXt2YXIgbz10aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO3JldHVybiBlP25ldyBv KHQsbixyKTpvKHQsbixyKX0scGVyZm9ybUluaXRpYWxNb3VudFdpdGhFcnJvckhhbmRsaW5nOmZ1 bmN0aW9uKGUsdCxuLHIsbyl7dmFyIGksYT1yLmNoZWNrcG9pbnQoKTt0cnl7aT10aGlzLnBlcmZv cm1Jbml0aWFsTW91bnQoZSx0LG4scixvKX1jYXRjaChzKXtyLnJvbGxiYWNrKGEpLHRoaXMuX2lu c3RhbmNlLnVuc3RhYmxlX2hhbmRsZUVycm9yKHMpLHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlJiYo dGhpcy5faW5zdGFuY2Uuc3RhdGU9dGhpcy5fcHJvY2Vzc1BlbmRpbmdTdGF0ZSh0aGlzLl9pbnN0 YW5jZS5wcm9wcyx0aGlzLl9pbnN0YW5jZS5jb250ZXh0KSksYT1yLmNoZWNrcG9pbnQoKSx0aGlz Ll9yZW5kZXJlZENvbXBvbmVudC51bm1vdW50Q29tcG9uZW50KCEwKSxyLnJvbGxiYWNrKGEpLGk9 dGhpcy5wZXJmb3JtSW5pdGlhbE1vdW50KGUsdCxuLHIsbyl9cmV0dXJuIGl9LHBlcmZvcm1Jbml0 aWFsTW91bnQ6ZnVuY3Rpb24oZSx0LG4scixvKXt2YXIgaT10aGlzLl9pbnN0YW5jZSxhPTA7aS5j b21wb25lbnRXaWxsTW91bnQmJihpLmNvbXBvbmVudFdpbGxNb3VudCgpLHRoaXMuX3BlbmRpbmdT dGF0ZVF1ZXVlJiYoaS5zdGF0ZT10aGlzLl9wcm9jZXNzUGVuZGluZ1N0YXRlKGkucHJvcHMsaS5j b250ZXh0KSkpLHZvaWQgMD09PWUmJihlPXRoaXMuX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudCgp KTt2YXIgcz1oLmdldFR5cGUoZSk7dGhpcy5fcmVuZGVyZWROb2RlVHlwZT1zO3ZhciB1PXRoaXMu X2luc3RhbnRpYXRlUmVhY3RDb21wb25lbnQoZSxzIT09aC5FTVBUWSk7dGhpcy5fcmVuZGVyZWRD b21wb25lbnQ9dTt2YXIgbD12Lm1vdW50Q29tcG9uZW50KHUscix0LG4sdGhpcy5fcHJvY2Vzc0No aWxkQ29udGV4dChvKSxhKTtyZXR1cm4gbH0sZ2V0SG9zdE5vZGU6ZnVuY3Rpb24oKXtyZXR1cm4g di5nZXRIb3N0Tm9kZSh0aGlzLl9yZW5kZXJlZENvbXBvbmVudCl9LHVubW91bnRDb21wb25lbnQ6 ZnVuY3Rpb24oZSl7aWYodGhpcy5fcmVuZGVyZWRDb21wb25lbnQpe3ZhciB0PXRoaXMuX2luc3Rh bmNlO2lmKHQuY29tcG9uZW50V2lsbFVubW91bnQmJiF0Ll9jYWxsZWRDb21wb25lbnRXaWxsVW5t b3VudClpZih0Ll9jYWxsZWRDb21wb25lbnRXaWxsVW5tb3VudD0hMCxlKXt2YXIgbj10aGlzLmdl dE5hbWUoKSsiLmNvbXBvbmVudFdpbGxVbm1vdW50KCkiO2QuaW52b2tlR3VhcmRlZENhbGxiYWNr KG4sdC5jb21wb25lbnRXaWxsVW5tb3VudC5iaW5kKHQpKX1lbHNlIHQuY29tcG9uZW50V2lsbFVu bW91bnQoKTt0aGlzLl9yZW5kZXJlZENvbXBvbmVudCYmKHYudW5tb3VudENvbXBvbmVudCh0aGlz Ll9yZW5kZXJlZENvbXBvbmVudCxlKSx0aGlzLl9yZW5kZXJlZE5vZGVUeXBlPW51bGwsdGhpcy5f cmVuZGVyZWRDb21wb25lbnQ9bnVsbCx0aGlzLl9pbnN0YW5jZT1udWxsKSx0aGlzLl9wZW5kaW5n U3RhdGVRdWV1ZT1udWxsLHRoaXMuX3BlbmRpbmdSZXBsYWNlU3RhdGU9ITEsdGhpcy5fcGVuZGlu Z0ZvcmNlVXBkYXRlPSExLHRoaXMuX3BlbmRpbmdDYWxsYmFja3M9bnVsbCx0aGlzLl9wZW5kaW5n RWxlbWVudD1udWxsLHRoaXMuX2NvbnRleHQ9bnVsbCx0aGlzLl9yb290Tm9kZUlEPTAsdGhpcy5f dG9wTGV2ZWxXcmFwcGVyPW51bGwsZi5yZW1vdmUodCl9fSxfbWFza0NvbnRleHQ6ZnVuY3Rpb24o ZSl7dmFyIHQ9dGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSxuPXQuY29udGV4dFR5cGVzO2lmKCFu KXJldHVybiBtO3ZhciByPXt9O2Zvcih2YXIgbyBpbiBuKXJbb109ZVtvXTtyZXR1cm4gcn0sX3By b2Nlc3NDb250ZXh0OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX21hc2tDb250ZXh0KGUpO3JldHVy biB0fSxfcHJvY2Vzc0NoaWxkQ29udGV4dDpmdW5jdGlvbihlKXt2YXIgdCxuPXRoaXMuX2N1cnJl bnRFbGVtZW50LnR5cGUscj10aGlzLl9pbnN0YW5jZTtpZihyLmdldENoaWxkQ29udGV4dCYmKHQ9 ci5nZXRDaGlsZENvbnRleHQoKSksdCl7Im9iamVjdCIhPXR5cGVvZiBuLmNoaWxkQ29udGV4dFR5 cGVzP3MoIjEwNyIsdGhpcy5nZXROYW1lKCl8fCJSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCIpOnZv aWQgMDtmb3IodmFyIG8gaW4gdClvIGluIG4uY2hpbGRDb250ZXh0VHlwZXM/dm9pZCAwOnMoIjEw OCIsdGhpcy5nZXROYW1lKCl8fCJSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCIsbyk7cmV0dXJuIHUo e30sZSx0KX1yZXR1cm4gZX0sX2NoZWNrQ29udGV4dFR5cGVzOmZ1bmN0aW9uKGUsdCxuKXt9LHJl Y2VpdmVDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuX2N1cnJlbnRFbGVtZW50 LG89dGhpcy5fY29udGV4dDt0aGlzLl9wZW5kaW5nRWxlbWVudD1udWxsLHRoaXMudXBkYXRlQ29t cG9uZW50KHQscixlLG8sbil9LHBlcmZvcm1VcGRhdGVJZk5lY2Vzc2FyeTpmdW5jdGlvbihlKXtu dWxsIT10aGlzLl9wZW5kaW5nRWxlbWVudD92LnJlY2VpdmVDb21wb25lbnQodGhpcyx0aGlzLl9w ZW5kaW5nRWxlbWVudCxlLHRoaXMuX2NvbnRleHQpOm51bGwhPT10aGlzLl9wZW5kaW5nU3RhdGVR dWV1ZXx8dGhpcy5fcGVuZGluZ0ZvcmNlVXBkYXRlP3RoaXMudXBkYXRlQ29tcG9uZW50KGUsdGhp cy5fY3VycmVudEVsZW1lbnQsdGhpcy5fY3VycmVudEVsZW1lbnQsdGhpcy5fY29udGV4dCx0aGlz Ll9jb250ZXh0KTp0aGlzLl91cGRhdGVCYXRjaE51bWJlcj1udWxsfSx1cGRhdGVDb21wb25lbnQ6 ZnVuY3Rpb24oZSx0LG4scixvKXt2YXIgaT10aGlzLl9pbnN0YW5jZTtudWxsPT1pP3MoIjEzNiIs dGhpcy5nZXROYW1lKCl8fCJSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCIpOnZvaWQgMDt2YXIgYSx1 PSExO3RoaXMuX2NvbnRleHQ9PT1vP2E9aS5jb250ZXh0OihhPXRoaXMuX3Byb2Nlc3NDb250ZXh0 KG8pLHU9ITApO3ZhciBsPXQucHJvcHMsYz1uLnByb3BzO3QhPT1uJiYodT0hMCksdSYmaS5jb21w b25lbnRXaWxsUmVjZWl2ZVByb3BzJiZpLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoYyxhKTt2 YXIgcD10aGlzLl9wcm9jZXNzUGVuZGluZ1N0YXRlKGMsYSksZD0hMDt0aGlzLl9wZW5kaW5nRm9y Y2VVcGRhdGV8fChpLnNob3VsZENvbXBvbmVudFVwZGF0ZT9kPWkuc2hvdWxkQ29tcG9uZW50VXBk YXRlKGMscCxhKTp0aGlzLl9jb21wb3NpdGVUeXBlPT09Qy5QdXJlQ2xhc3MmJihkPSFnKGwsYyl8 fCFnKGkuc3RhdGUscCkpKSx0aGlzLl91cGRhdGVCYXRjaE51bWJlcj1udWxsLGQ/KHRoaXMuX3Bl bmRpbmdGb3JjZVVwZGF0ZT0hMSx0aGlzLl9wZXJmb3JtQ29tcG9uZW50VXBkYXRlKG4sYyxwLGEs ZSxvKSk6KHRoaXMuX2N1cnJlbnRFbGVtZW50PW4sdGhpcy5fY29udGV4dD1vLGkucHJvcHM9Yyxp LnN0YXRlPXAsaS5jb250ZXh0PWEpfSxfcHJvY2Vzc1BlbmRpbmdTdGF0ZTpmdW5jdGlvbihlLHQp e3ZhciBuPXRoaXMuX2luc3RhbmNlLHI9dGhpcy5fcGVuZGluZ1N0YXRlUXVldWUsbz10aGlzLl9w ZW5kaW5nUmVwbGFjZVN0YXRlO2lmKHRoaXMuX3BlbmRpbmdSZXBsYWNlU3RhdGU9ITEsdGhpcy5f cGVuZGluZ1N0YXRlUXVldWU9bnVsbCwhcilyZXR1cm4gbi5zdGF0ZTtpZihvJiYxPT09ci5sZW5n dGgpcmV0dXJuIHJbMF07Zm9yKHZhciBpPXUoe30sbz9yWzBdOm4uc3RhdGUpLGE9bz8xOjA7YTxy Lmxlbmd0aDthKyspe3ZhciBzPXJbYV07dShpLCJmdW5jdGlvbiI9PXR5cGVvZiBzP3MuY2FsbChu LGksZSx0KTpzKX1yZXR1cm4gaX0sX3BlcmZvcm1Db21wb25lbnRVcGRhdGU6ZnVuY3Rpb24oZSx0 LG4scixvLGkpe3ZhciBhLHMsdSxsPXRoaXMuX2luc3RhbmNlLGM9Qm9vbGVhbihsLmNvbXBvbmVu dERpZFVwZGF0ZSk7YyYmKGE9bC5wcm9wcyxzPWwuc3RhdGUsdT1sLmNvbnRleHQpLGwuY29tcG9u ZW50V2lsbFVwZGF0ZSYmbC5jb21wb25lbnRXaWxsVXBkYXRlKHQsbixyKSx0aGlzLl9jdXJyZW50 RWxlbWVudD1lLHRoaXMuX2NvbnRleHQ9aSxsLnByb3BzPXQsbC5zdGF0ZT1uLGwuY29udGV4dD1y LHRoaXMuX3VwZGF0ZVJlbmRlcmVkQ29tcG9uZW50KG8saSksYyYmby5nZXRSZWFjdE1vdW50UmVh ZHkoKS5lbnF1ZXVlKGwuY29tcG9uZW50RGlkVXBkYXRlLmJpbmQobCxhLHMsdSksbCl9LF91cGRh dGVSZW5kZXJlZENvbXBvbmVudDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX3JlbmRlcmVkQ29t cG9uZW50LHI9bi5fY3VycmVudEVsZW1lbnQsbz10aGlzLl9yZW5kZXJWYWxpZGF0ZWRDb21wb25l bnQoKSxpPTA7aWYoeShyLG8pKXYucmVjZWl2ZUNvbXBvbmVudChuLG8sZSx0aGlzLl9wcm9jZXNz Q2hpbGRDb250ZXh0KHQpKTtlbHNle3ZhciBhPXYuZ2V0SG9zdE5vZGUobik7di51bm1vdW50Q29t cG9uZW50KG4sITEpO3ZhciBzPWguZ2V0VHlwZShvKTt0aGlzLl9yZW5kZXJlZE5vZGVUeXBlPXM7 dmFyIHU9dGhpcy5faW5zdGFudGlhdGVSZWFjdENvbXBvbmVudChvLHMhPT1oLkVNUFRZKTt0aGlz Ll9yZW5kZXJlZENvbXBvbmVudD11O3ZhciBsPXYubW91bnRDb21wb25lbnQodSxlLHRoaXMuX2hv c3RQYXJlbnQsdGhpcy5faG9zdENvbnRhaW5lckluZm8sdGhpcy5fcHJvY2Vzc0NoaWxkQ29udGV4 dCh0KSxpKTt0aGlzLl9yZXBsYWNlTm9kZVdpdGhNYXJrdXAoYSxsLG4pfX0sX3JlcGxhY2VOb2Rl V2l0aE1hcmt1cDpmdW5jdGlvbihlLHQsbil7Yy5yZXBsYWNlTm9kZVdpdGhNYXJrdXAoZSx0LG4p fSxfcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50V2l0aG91dE93bmVyT3JDb250ZXh0OmZ1bmN0aW9u KCl7dmFyIGUsdD10aGlzLl9pbnN0YW5jZTtyZXR1cm4gZT10LnJlbmRlcigpfSxfcmVuZGVyVmFs aWRhdGVkQ29tcG9uZW50OmZ1bmN0aW9uKCl7dmFyIGU7aWYodGhpcy5fY29tcG9zaXRlVHlwZSE9 PUMuU3RhdGVsZXNzRnVuY3Rpb25hbCl7cC5jdXJyZW50PXRoaXM7dHJ5e2U9dGhpcy5fcmVuZGVy VmFsaWRhdGVkQ29tcG9uZW50V2l0aG91dE93bmVyT3JDb250ZXh0KCl9ZmluYWxseXtwLmN1cnJl bnQ9bnVsbH19ZWxzZSBlPXRoaXMuX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudFdpdGhvdXRPd25l ck9yQ29udGV4dCgpO3JldHVybiBudWxsPT09ZXx8ZT09PSExfHxsLmlzVmFsaWRFbGVtZW50KGUp P3ZvaWQgMDpzKCIxMDkiLHRoaXMuZ2V0TmFtZSgpfHwiUmVhY3RDb21wb3NpdGVDb21wb25lbnQi KSxlfSxhdHRhY2hSZWY6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmdldFB1YmxpY0luc3RhbmNl KCk7bnVsbD09bj9zKCIxMTAiKTp2b2lkIDA7dmFyIHI9dC5nZXRQdWJsaWNJbnN0YW5jZSgpLG89 bi5yZWZzPT09bT9uLnJlZnM9e306bi5yZWZzO29bZV09cn0sZGV0YWNoUmVmOmZ1bmN0aW9uKGUp e3ZhciB0PXRoaXMuZ2V0UHVibGljSW5zdGFuY2UoKS5yZWZzO2RlbGV0ZSB0W2VdfSxnZXROYW1l OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSx0PXRoaXMuX2luc3Rh bmNlJiZ0aGlzLl9pbnN0YW5jZS5jb25zdHJ1Y3RvcjtyZXR1cm4gZS5kaXNwbGF5TmFtZXx8dCYm dC5kaXNwbGF5TmFtZXx8ZS5uYW1lfHx0JiZ0Lm5hbWV8fG51bGx9LGdldFB1YmxpY0luc3RhbmNl OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5faW5zdGFuY2U7cmV0dXJuIHRoaXMuX2NvbXBvc2l0ZVR5 cGU9PT1DLlN0YXRlbGVzc0Z1bmN0aW9uYWw/bnVsbDplfSxfaW5zdGFudGlhdGVSZWFjdENvbXBv bmVudDpudWxsfTt0LmV4cG9ydHM9Yn0sezExMToxMTEsMTE0OjExNCwxMTc6MTE3LDExODoxMTgs MTI3OjEyNywxMzQ6MTM0LDEzODoxMzgsMTM5OjEzOSwxNDA6MTQwLDI4OjI4LDQ5OjQ5LDU2OjU2 LDU3OjU3LDYwOjYwLDY0OjY0fV0sMzA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVu Y3Rpb24gcihlKXtpZihlKXt2YXIgdD1lLl9jdXJyZW50RWxlbWVudC5fb3duZXJ8fG51bGw7aWYo dCl7dmFyIG49dC5nZXROYW1lKCk7aWYobilyZXR1cm4iIFRoaXMgRE9NIG5vZGUgd2FzIHJlbmRl cmVkIGJ5IGAiK24rImAuIn19cmV0dXJuIiJ9ZnVuY3Rpb24gbyhlLHQpe3QmJihYW2UuX3RhZ10m JihudWxsIT10LmNoaWxkcmVufHxudWxsIT10LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MP3YoIjEz NyIsZS5fdGFnLGUuX2N1cnJlbnRFbGVtZW50Ll9vd25lcj8iIENoZWNrIHRoZSByZW5kZXIgbWV0 aG9kIG9mICIrZS5fY3VycmVudEVsZW1lbnQuX293bmVyLmdldE5hbWUoKSsiLiI6IiIpOnZvaWQg MCksbnVsbCE9dC5kYW5nZXJvdXNseVNldElubmVySFRNTCYmKG51bGwhPXQuY2hpbGRyZW4/digi NjAiKTp2b2lkIDAsIm9iamVjdCI9PXR5cGVvZiB0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MJiZX IGluIHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw/dm9pZCAwOnYoIjYxIikpLG51bGwhPXQuc3R5 bGUmJiJvYmplY3QiIT10eXBlb2YgdC5zdHlsZT92KCI2MiIscihlKSk6dm9pZCAwKX1mdW5jdGlv biBpKGUsdCxuLHIpe2lmKCEociBpbnN0YW5jZW9mIFIpKXt2YXIgbz1lLl9ob3N0Q29udGFpbmVy SW5mbyxpPW8uX25vZGUmJm8uX25vZGUubm9kZVR5cGU9PT1xLHM9aT9vLl9ub2RlOm8uX293bmVy RG9jdW1lbnQ7Rih0LHMpLHIuZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShhLHtpbnN0OmUs cmVnaXN0cmF0aW9uTmFtZTp0LGxpc3RlbmVyOm59KX19ZnVuY3Rpb24gYSgpe3ZhciBlPXRoaXM7 eC5wdXRMaXN0ZW5lcihlLmluc3QsZS5yZWdpc3RyYXRpb25OYW1lLGUubGlzdGVuZXIpfWZ1bmN0 aW9uIHMoKXt2YXIgZT10aGlzO1MucG9zdE1vdW50V3JhcHBlcihlKX1mdW5jdGlvbiB1KCl7dmFy IGU9dGhpcztPLnBvc3RNb3VudFdyYXBwZXIoZSl9ZnVuY3Rpb24gbCgpe3ZhciBlPXRoaXM7TS5w b3N0TW91bnRXcmFwcGVyKGUpfWZ1bmN0aW9uIGMoKXt2YXIgZT10aGlzO2UuX3Jvb3ROb2RlSUQ/ dm9pZCAwOnYoIjYzIik7dmFyIHQ9VShlKTtzd2l0Y2godD92b2lkIDA6digiNjQiKSxlLl90YWcp e2Nhc2UiaWZyYW1lIjpjYXNlIm9iamVjdCI6ZS5fd3JhcHBlclN0YXRlLmxpc3RlbmVycz1bay50 cmFwQnViYmxlZEV2ZW50KCJ0b3BMb2FkIiwibG9hZCIsdCldO2JyZWFrO2Nhc2UidmlkZW8iOmNh c2UiYXVkaW8iOmUuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM9W107Zm9yKHZhciBuIGluIEspSy5o YXNPd25Qcm9wZXJ0eShuKSYmZS5fd3JhcHBlclN0YXRlLmxpc3RlbmVycy5wdXNoKGsudHJhcEJ1 YmJsZWRFdmVudChuLEtbbl0sdCkpO2JyZWFrO2Nhc2Uic291cmNlIjplLl93cmFwcGVyU3RhdGUu bGlzdGVuZXJzPVtrLnRyYXBCdWJibGVkRXZlbnQoInRvcEVycm9yIiwiZXJyb3IiLHQpXTticmVh aztjYXNlImltZyI6ZS5fd3JhcHBlclN0YXRlLmxpc3RlbmVycz1bay50cmFwQnViYmxlZEV2ZW50 KCJ0b3BFcnJvciIsImVycm9yIix0KSxrLnRyYXBCdWJibGVkRXZlbnQoInRvcExvYWQiLCJsb2Fk Iix0KV07YnJlYWs7Y2FzZSJmb3JtIjplLl93cmFwcGVyU3RhdGUubGlzdGVuZXJzPVtrLnRyYXBC dWJibGVkRXZlbnQoInRvcFJlc2V0IiwicmVzZXQiLHQpLGsudHJhcEJ1YmJsZWRFdmVudCgidG9w U3VibWl0Iiwic3VibWl0Iix0KV07YnJlYWs7Y2FzZSJpbnB1dCI6Y2FzZSJzZWxlY3QiOmNhc2Ui dGV4dGFyZWEiOmUuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM9W2sudHJhcEJ1YmJsZWRFdmVudCgi dG9wSW52YWxpZCIsImludmFsaWQiLHQpXX19ZnVuY3Rpb24gcCgpe04ucG9zdFVwZGF0ZVdyYXBw ZXIodGhpcyl9ZnVuY3Rpb24gZChlKXskLmNhbGwoRyxlKXx8KFEudGVzdChlKT92b2lkIDA6digi NjUiLGUpLEdbZV09ITApfWZ1bmN0aW9uIGYoZSx0KXtyZXR1cm4gZS5pbmRleE9mKCItIik+PTB8 fG51bGwhPXQuaXN9ZnVuY3Rpb24gaChlKXt2YXIgdD1lLnR5cGU7ZCh0KSx0aGlzLl9jdXJyZW50 RWxlbWVudD1lLHRoaXMuX3RhZz10LnRvTG93ZXJDYXNlKCksdGhpcy5fbmFtZXNwYWNlVVJJPW51 bGwsdGhpcy5fcmVuZGVyZWRDaGlsZHJlbj1udWxsLHRoaXMuX3ByZXZpb3VzU3R5bGU9bnVsbCx0 aGlzLl9wcmV2aW91c1N0eWxlQ29weT1udWxsLHRoaXMuX2hvc3ROb2RlPW51bGwsdGhpcy5faG9z dFBhcmVudD1udWxsLHRoaXMuX3Jvb3ROb2RlSUQ9MCx0aGlzLl9kb21JRD0wLHRoaXMuX2hvc3RD b250YWluZXJJbmZvPW51bGwsdGhpcy5fd3JhcHBlclN0YXRlPW51bGwsdGhpcy5fdG9wTGV2ZWxX cmFwcGVyPW51bGwsdGhpcy5fZmxhZ3M9MH12YXIgdj1lKDExMSksbT1lKDE0MCksZz1lKDIpLHk9 ZSg1KSxDPWUoOSksXz1lKDEwKSxiPWUoMTEpLEU9ZSgxMikseD1lKDE2KSx3PWUoMTcpLGs9ZSgy NSksVD1lKDMxKSxQPWUoMzIpLFM9ZSgzNiksTT1lKDM3KSxOPWUoMzgpLE89ZSg0MyksST0oZSg1 NyksZSg1OSkpLFI9ZSg2OCksQT0oZSgxMjYpLGUoOTUpKSxEPShlKDEzNCksZSgxMDgpLGUoMTM4 KSxlKDExNiksZSgxMzkpLFQpLEw9eC5kZWxldGVMaXN0ZW5lcixVPVAuZ2V0Tm9kZUZyb21JbnN0 YW5jZSxGPWsubGlzdGVuVG8sVj13LnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzLGo9e3N0cmluZzoh MCxudW1iZXI6ITB9LEI9InN0eWxlIixXPSJfX2h0bWwiLEg9e2NoaWxkcmVuOm51bGwsZGFuZ2Vy b3VzbHlTZXRJbm5lckhUTUw6bnVsbCxzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmc6bnVs bH0scT0xMSxLPXt0b3BBYm9ydDoiYWJvcnQiLHRvcENhblBsYXk6ImNhbnBsYXkiLHRvcENhblBs YXlUaHJvdWdoOiJjYW5wbGF5dGhyb3VnaCIsdG9wRHVyYXRpb25DaGFuZ2U6ImR1cmF0aW9uY2hh bmdlIix0b3BFbXB0aWVkOiJlbXB0aWVkIix0b3BFbmNyeXB0ZWQ6ImVuY3J5cHRlZCIsdG9wRW5k ZWQ6ImVuZGVkIix0b3BFcnJvcjoiZXJyb3IiLHRvcExvYWRlZERhdGE6ImxvYWRlZGRhdGEiLHRv cExvYWRlZE1ldGFkYXRhOiJsb2FkZWRtZXRhZGF0YSIsdG9wTG9hZFN0YXJ0OiJsb2Fkc3RhcnQi LHRvcFBhdXNlOiJwYXVzZSIsdG9wUGxheToicGxheSIsdG9wUGxheWluZzoicGxheWluZyIsdG9w UHJvZ3Jlc3M6InByb2dyZXNzIix0b3BSYXRlQ2hhbmdlOiJyYXRlY2hhbmdlIix0b3BTZWVrZWQ6 InNlZWtlZCIsdG9wU2Vla2luZzoic2Vla2luZyIsdG9wU3RhbGxlZDoic3RhbGxlZCIsdG9wU3Vz cGVuZDoic3VzcGVuZCIsdG9wVGltZVVwZGF0ZToidGltZXVwZGF0ZSIsdG9wVm9sdW1lQ2hhbmdl OiJ2b2x1bWVjaGFuZ2UiLHRvcFdhaXRpbmc6IndhaXRpbmcifSx6PXthcmVhOiEwLGJhc2U6ITAs YnI6ITAsY29sOiEwLGVtYmVkOiEwLGhyOiEwLGltZzohMCxpbnB1dDohMCxrZXlnZW46ITAsbGlu azohMCxtZXRhOiEwLHBhcmFtOiEwLHNvdXJjZTohMCx0cmFjazohMCx3YnI6ITB9LFk9e2xpc3Rp bmc6ITAscHJlOiEwLHRleHRhcmVhOiEwfSxYPW0oe21lbnVpdGVtOiEwfSx6KSxRPS9eW2EtekEt Wl1bYS16QS1aOl9cLlwtXGRdKiQvLEc9e30sJD17fS5oYXNPd25Qcm9wZXJ0eSxaPTE7aC5kaXNw bGF5TmFtZT0iUmVhY3RET01Db21wb25lbnQiLGguTWl4aW49e21vdW50Q29tcG9uZW50OmZ1bmN0 aW9uKGUsdCxuLHIpe3RoaXMuX3Jvb3ROb2RlSUQ9WisrLHRoaXMuX2RvbUlEPW4uX2lkQ291bnRl cisrLHRoaXMuX2hvc3RQYXJlbnQ9dCx0aGlzLl9ob3N0Q29udGFpbmVySW5mbz1uO3ZhciBpPXRo aXMuX2N1cnJlbnRFbGVtZW50LnByb3BzO3N3aXRjaCh0aGlzLl90YWcpe2Nhc2UiYXVkaW8iOmNh c2UiZm9ybSI6Y2FzZSJpZnJhbWUiOmNhc2UiaW1nIjpjYXNlImxpbmsiOmNhc2Uib2JqZWN0Ijpj YXNlInNvdXJjZSI6Y2FzZSJ2aWRlbyI6dGhpcy5fd3JhcHBlclN0YXRlPXtsaXN0ZW5lcnM6bnVs bH0sZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGMsdGhpcyk7YnJlYWs7Y2FzZSJpbnB1 dCI6Uy5tb3VudFdyYXBwZXIodGhpcyxpLHQpLGk9Uy5nZXRIb3N0UHJvcHModGhpcyxpKSxlLmdl dFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoYyx0aGlzKTticmVhaztjYXNlIm9wdGlvbiI6TS5t b3VudFdyYXBwZXIodGhpcyxpLHQpLGk9TS5nZXRIb3N0UHJvcHModGhpcyxpKTticmVhaztjYXNl InNlbGVjdCI6Ti5tb3VudFdyYXBwZXIodGhpcyxpLHQpLGk9Ti5nZXRIb3N0UHJvcHModGhpcyxp KSxlLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoYyx0aGlzKTticmVhaztjYXNlInRleHRh cmVhIjpPLm1vdW50V3JhcHBlcih0aGlzLGksdCksaT1PLmdldEhvc3RQcm9wcyh0aGlzLGkpLGUu Z2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShjLHRoaXMpfW8odGhpcyxpKTt2YXIgYSxwO251 bGwhPXQ/KGE9dC5fbmFtZXNwYWNlVVJJLHA9dC5fdGFnKTpuLl90YWcmJihhPW4uX25hbWVzcGFj ZVVSSSxwPW4uX3RhZyksKG51bGw9PWF8fGE9PT1fLnN2ZyYmImZvcmVpZ25vYmplY3QiPT09cCkm JihhPV8uaHRtbCksYT09PV8uaHRtbCYmKCJzdmciPT09dGhpcy5fdGFnP2E9Xy5zdmc6Im1hdGgi PT09dGhpcy5fdGFnJiYoYT1fLm1hdGhtbCkpLHRoaXMuX25hbWVzcGFjZVVSST1hO3ZhciBkO2lm KGUudXNlQ3JlYXRlRWxlbWVudCl7dmFyIGYsaD1uLl9vd25lckRvY3VtZW50O2lmKGE9PT1fLmh0 bWwpaWYoInNjcmlwdCI9PT10aGlzLl90YWcpe3ZhciB2PWguY3JlYXRlRWxlbWVudCgiZGl2Iiks bT10aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO3YuaW5uZXJIVE1MPSI8IittKyI+PC8iK20rIj4i LGY9di5yZW1vdmVDaGlsZCh2LmZpcnN0Q2hpbGQpfWVsc2UgZj1pLmlzP2guY3JlYXRlRWxlbWVu dCh0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlLGkuaXMpOmguY3JlYXRlRWxlbWVudCh0aGlzLl9j dXJyZW50RWxlbWVudC50eXBlKTtlbHNlIGY9aC5jcmVhdGVFbGVtZW50TlMoYSx0aGlzLl9jdXJy ZW50RWxlbWVudC50eXBlKTtQLnByZWNhY2hlTm9kZSh0aGlzLGYpLHRoaXMuX2ZsYWdzfD1ELmhh c0NhY2hlZENoaWxkTm9kZXMsdGhpcy5faG9zdFBhcmVudHx8RS5zZXRBdHRyaWJ1dGVGb3JSb290 KGYpLHRoaXMuX3VwZGF0ZURPTVByb3BlcnRpZXMobnVsbCxpLGUpO3ZhciB5PUMoZik7dGhpcy5f Y3JlYXRlSW5pdGlhbENoaWxkcmVuKGUsaSxyLHkpLGQ9eX1lbHNle3ZhciBiPXRoaXMuX2NyZWF0 ZU9wZW5UYWdNYXJrdXBBbmRQdXRMaXN0ZW5lcnMoZSxpKSx4PXRoaXMuX2NyZWF0ZUNvbnRlbnRN YXJrdXAoZSxpLHIpO2Q9IXgmJnpbdGhpcy5fdGFnXT9iKyIvPiI6YisiPiIreCsiPC8iK3RoaXMu X2N1cnJlbnRFbGVtZW50LnR5cGUrIj4ifXN3aXRjaCh0aGlzLl90YWcpe2Nhc2UiaW5wdXQiOmUu Z2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShzLHRoaXMpLGkuYXV0b0ZvY3VzJiZlLmdldFJl YWN0TW91bnRSZWFkeSgpLmVucXVldWUoZy5mb2N1c0RPTUNvbXBvbmVudCx0aGlzKTticmVhaztj YXNlInRleHRhcmVhIjplLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUodSx0aGlzKSxpLmF1 dG9Gb2N1cyYmZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGcuZm9jdXNET01Db21wb25l bnQsdGhpcyk7YnJlYWs7Y2FzZSJzZWxlY3QiOmkuYXV0b0ZvY3VzJiZlLmdldFJlYWN0TW91bnRS ZWFkeSgpLmVucXVldWUoZy5mb2N1c0RPTUNvbXBvbmVudCx0aGlzKTticmVhaztjYXNlImJ1dHRv biI6aS5hdXRvRm9jdXMmJmUuZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShnLmZvY3VzRE9N Q29tcG9uZW50LHRoaXMpO2JyZWFrO2Nhc2Uib3B0aW9uIjplLmdldFJlYWN0TW91bnRSZWFkeSgp LmVucXVldWUobCx0aGlzKX1yZXR1cm4gZH0sX2NyZWF0ZU9wZW5UYWdNYXJrdXBBbmRQdXRMaXN0 ZW5lcnM6ZnVuY3Rpb24oZSx0KXt2YXIgbj0iPCIrdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTtm b3IodmFyIHIgaW4gdClpZih0Lmhhc093blByb3BlcnR5KHIpKXt2YXIgbz10W3JdO2lmKG51bGwh PW8paWYoVi5oYXNPd25Qcm9wZXJ0eShyKSlvJiZpKHRoaXMscixvLGUpO2Vsc2V7cj09PUImJihv JiYobz10aGlzLl9wcmV2aW91c1N0eWxlQ29weT1tKHt9LHQuc3R5bGUpKSxvPXkuY3JlYXRlTWFy a3VwRm9yU3R5bGVzKG8sdGhpcykpO3ZhciBhPW51bGw7bnVsbCE9dGhpcy5fdGFnJiZmKHRoaXMu X3RhZyx0KT9ILmhhc093blByb3BlcnR5KHIpfHwoYT1FLmNyZWF0ZU1hcmt1cEZvckN1c3RvbUF0 dHJpYnV0ZShyLG8pKTphPUUuY3JlYXRlTWFya3VwRm9yUHJvcGVydHkocixvKSxhJiYobis9IiAi K2EpfX1yZXR1cm4gZS5yZW5kZXJUb1N0YXRpY01hcmt1cD9uOih0aGlzLl9ob3N0UGFyZW50fHwo bis9IiAiK0UuY3JlYXRlTWFya3VwRm9yUm9vdCgpKSxuKz0iICIrRS5jcmVhdGVNYXJrdXBGb3JJ RCh0aGlzLl9kb21JRCkpfSxfY3JlYXRlQ29udGVudE1hcmt1cDpmdW5jdGlvbihlLHQsbil7dmFy IHI9IiIsbz10LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MO2lmKG51bGwhPW8pbnVsbCE9by5fX2h0 bWwmJihyPW8uX19odG1sKTtlbHNle3ZhciBpPWpbdHlwZW9mIHQuY2hpbGRyZW5dP3QuY2hpbGRy ZW46bnVsbCxhPW51bGwhPWk/bnVsbDp0LmNoaWxkcmVuO2lmKG51bGwhPWkpcj1BKGkpO2Vsc2Ug aWYobnVsbCE9YSl7dmFyIHM9dGhpcy5tb3VudENoaWxkcmVuKGEsZSxuKTtyPXMuam9pbigiIil9 fXJldHVybiBZW3RoaXMuX3RhZ10mJiJcbiI9PT1yLmNoYXJBdCgwKT8iXG4iK3I6cn0sX2NyZWF0 ZUluaXRpYWxDaGlsZHJlbjpmdW5jdGlvbihlLHQsbixyKXt2YXIgbz10LmRhbmdlcm91c2x5U2V0 SW5uZXJIVE1MO2lmKG51bGwhPW8pbnVsbCE9by5fX2h0bWwmJkMucXVldWVIVE1MKHIsby5fX2h0 bWwpO2Vsc2V7dmFyIGk9alt0eXBlb2YgdC5jaGlsZHJlbl0/dC5jaGlsZHJlbjpudWxsLGE9bnVs bCE9aT9udWxsOnQuY2hpbGRyZW47aWYobnVsbCE9aSkiIiE9PWkmJkMucXVldWVUZXh0KHIsaSk7 ZWxzZSBpZihudWxsIT1hKWZvcih2YXIgcz10aGlzLm1vdW50Q2hpbGRyZW4oYSxlLG4pLHU9MDt1 PHMubGVuZ3RoO3UrKylDLnF1ZXVlQ2hpbGQocixzW3VdKX19LHJlY2VpdmVDb21wb25lbnQ6ZnVu Y3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuX2N1cnJlbnRFbGVtZW50O3RoaXMuX2N1cnJlbnRFbGVt ZW50PWUsdGhpcy51cGRhdGVDb21wb25lbnQodCxyLGUsbil9LHVwZGF0ZUNvbXBvbmVudDpmdW5j dGlvbihlLHQsbixyKXt2YXIgaT10LnByb3BzLGE9dGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHM7 c3dpdGNoKHRoaXMuX3RhZyl7Y2FzZSJpbnB1dCI6aT1TLmdldEhvc3RQcm9wcyh0aGlzLGkpLGE9 Uy5nZXRIb3N0UHJvcHModGhpcyxhKTticmVhaztjYXNlIm9wdGlvbiI6aT1NLmdldEhvc3RQcm9w cyh0aGlzLGkpLGE9TS5nZXRIb3N0UHJvcHModGhpcyxhKTticmVhaztjYXNlInNlbGVjdCI6aT1O LmdldEhvc3RQcm9wcyh0aGlzLGkpLGE9Ti5nZXRIb3N0UHJvcHModGhpcyxhKTticmVhaztjYXNl InRleHRhcmVhIjppPU8uZ2V0SG9zdFByb3BzKHRoaXMsaSksYT1PLmdldEhvc3RQcm9wcyh0aGlz LGEpfXN3aXRjaChvKHRoaXMsYSksdGhpcy5fdXBkYXRlRE9NUHJvcGVydGllcyhpLGEsZSksdGhp cy5fdXBkYXRlRE9NQ2hpbGRyZW4oaSxhLGUsciksdGhpcy5fdGFnKXtjYXNlImlucHV0IjpTLnVw ZGF0ZVdyYXBwZXIodGhpcyk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6Ty51cGRhdGVXcmFwcGVyKHRo aXMpO2JyZWFrO2Nhc2Uic2VsZWN0IjplLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUocCx0 aGlzKX19LF91cGRhdGVET01Qcm9wZXJ0aWVzOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixvLGE7Zm9y KHIgaW4gZSlpZighdC5oYXNPd25Qcm9wZXJ0eShyKSYmZS5oYXNPd25Qcm9wZXJ0eShyKSYmbnVs bCE9ZVtyXSlpZihyPT09Qil7dmFyIHM9dGhpcy5fcHJldmlvdXNTdHlsZUNvcHk7Zm9yKG8gaW4g cylzLmhhc093blByb3BlcnR5KG8pJiYoYT1hfHx7fSxhW29dPSIiKTt0aGlzLl9wcmV2aW91c1N0 eWxlQ29weT1udWxsfWVsc2UgVi5oYXNPd25Qcm9wZXJ0eShyKT9lW3JdJiZMKHRoaXMscik6Zih0 aGlzLl90YWcsZSk/SC5oYXNPd25Qcm9wZXJ0eShyKXx8RS5kZWxldGVWYWx1ZUZvckF0dHJpYnV0 ZShVKHRoaXMpLHIpOihiLnByb3BlcnRpZXNbcl18fGIuaXNDdXN0b21BdHRyaWJ1dGUocikpJiZF LmRlbGV0ZVZhbHVlRm9yUHJvcGVydHkoVSh0aGlzKSxyKTtmb3IociBpbiB0KXt2YXIgdT10W3Jd LGw9cj09PUI/dGhpcy5fcHJldmlvdXNTdHlsZUNvcHk6bnVsbCE9ZT9lW3JdOnZvaWQgMDtpZih0 Lmhhc093blByb3BlcnR5KHIpJiZ1IT09bCYmKG51bGwhPXV8fG51bGwhPWwpKWlmKHI9PT1CKWlm KHU/dT10aGlzLl9wcmV2aW91c1N0eWxlQ29weT1tKHt9LHUpOnRoaXMuX3ByZXZpb3VzU3R5bGVD b3B5PW51bGwsbCl7Zm9yKG8gaW4gbCkhbC5oYXNPd25Qcm9wZXJ0eShvKXx8dSYmdS5oYXNPd25Q cm9wZXJ0eShvKXx8KGE9YXx8e30sYVtvXT0iIik7Zm9yKG8gaW4gdSl1Lmhhc093blByb3BlcnR5 KG8pJiZsW29dIT09dVtvXSYmKGE9YXx8e30sYVtvXT11W29dKX1lbHNlIGE9dTtlbHNlIGlmKFYu aGFzT3duUHJvcGVydHkocikpdT9pKHRoaXMscix1LG4pOmwmJkwodGhpcyxyKTtlbHNlIGlmKGYo dGhpcy5fdGFnLHQpKUguaGFzT3duUHJvcGVydHkocil8fEUuc2V0VmFsdWVGb3JBdHRyaWJ1dGUo VSh0aGlzKSxyLHUpO2Vsc2UgaWYoYi5wcm9wZXJ0aWVzW3JdfHxiLmlzQ3VzdG9tQXR0cmlidXRl KHIpKXt2YXIgYz1VKHRoaXMpO251bGwhPXU/RS5zZXRWYWx1ZUZvclByb3BlcnR5KGMscix1KTpF LmRlbGV0ZVZhbHVlRm9yUHJvcGVydHkoYyxyKX19YSYmeS5zZXRWYWx1ZUZvclN0eWxlcyhVKHRo aXMpLGEsdGhpcyl9LF91cGRhdGVET01DaGlsZHJlbjpmdW5jdGlvbihlLHQsbixyKXt2YXIgbz1q W3R5cGVvZiBlLmNoaWxkcmVuXT9lLmNoaWxkcmVuOm51bGwsaT1qW3R5cGVvZiB0LmNoaWxkcmVu XT90LmNoaWxkcmVuOm51bGwsYT1lLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MJiZlLmRhbmdlcm91 c2x5U2V0SW5uZXJIVE1MLl9faHRtbCxzPXQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwmJnQuZGFu Z2Vyb3VzbHlTZXRJbm5lckhUTUwuX19odG1sLHU9bnVsbCE9bz9udWxsOmUuY2hpbGRyZW4sbD1u dWxsIT1pP251bGw6dC5jaGlsZHJlbixjPW51bGwhPW98fG51bGwhPWEscD1udWxsIT1pfHxudWxs IT1zO251bGwhPXUmJm51bGw9PWw/dGhpcy51cGRhdGVDaGlsZHJlbihudWxsLG4scik6YyYmIXAm JnRoaXMudXBkYXRlVGV4dENvbnRlbnQoIiIpLG51bGwhPWk/byE9PWkmJnRoaXMudXBkYXRlVGV4 dENvbnRlbnQoIiIraSk6bnVsbCE9cz9hIT09cyYmdGhpcy51cGRhdGVNYXJrdXAoIiIrcyk6bnVs bCE9bCYmdGhpcy51cGRhdGVDaGlsZHJlbihsLG4scil9LGdldEhvc3ROb2RlOmZ1bmN0aW9uKCl7 cmV0dXJuIFUodGhpcyl9LHVubW91bnRDb21wb25lbnQ6ZnVuY3Rpb24oZSl7c3dpdGNoKHRoaXMu X3RhZyl7Y2FzZSJhdWRpbyI6Y2FzZSJmb3JtIjpjYXNlImlmcmFtZSI6Y2FzZSJpbWciOmNhc2Ui bGluayI6Y2FzZSJvYmplY3QiOmNhc2Uic291cmNlIjpjYXNlInZpZGVvIjp2YXIgdD10aGlzLl93 cmFwcGVyU3RhdGUubGlzdGVuZXJzO2lmKHQpZm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspdFtu XS5yZW1vdmUoKTticmVhaztjYXNlImh0bWwiOmNhc2UiaGVhZCI6Y2FzZSJib2R5Ijp2KCI2NiIs dGhpcy5fdGFnKX10aGlzLnVubW91bnRDaGlsZHJlbihlKSxQLnVuY2FjaGVOb2RlKHRoaXMpLHgu ZGVsZXRlQWxsTGlzdGVuZXJzKHRoaXMpLHRoaXMuX3Jvb3ROb2RlSUQ9MCx0aGlzLl9kb21JRD0w LHRoaXMuX3dyYXBwZXJTdGF0ZT1udWxsfSxnZXRQdWJsaWNJbnN0YW5jZTpmdW5jdGlvbigpe3Jl dHVybiBVKHRoaXMpfX0sbShoLnByb3RvdHlwZSxoLk1peGluLEkuTWl4aW4pLHQuZXhwb3J0cz1o fSx7MTA6MTAsMTA4OjEwOCwxMToxMSwxMTE6MTExLDExNjoxMTYsMTI6MTIsMTI2OjEyNiwxMzQ6 MTM0LDEzODoxMzgsMTM5OjEzOSwxNDA6MTQwLDE2OjE2LDE3OjE3LDI6MiwyNToyNSwzMTozMSwz MjozMiwzNjozNiwzNzozNywzODozOCw0Mzo0Myw1OjUsNTc6NTcsNTk6NTksNjg6NjgsOTo5LDk1 Ojk1fV0sMzE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9e2hhc0NhY2hlZENo aWxkTm9kZXM6MX07dC5leHBvcnRzPXJ9LHt9XSwzMjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3Ry aWN0IjtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlJiZlLmdldEF0dHJpYnV0 ZShoKT09PVN0cmluZyh0KXx8OD09PWUubm9kZVR5cGUmJmUubm9kZVZhbHVlPT09IiByZWFjdC10 ZXh0OiAiK3QrIiAifHw4PT09ZS5ub2RlVHlwZSYmZS5ub2RlVmFsdWU9PT0iIHJlYWN0LWVtcHR5 OiAiK3QrIiAifWZ1bmN0aW9uIG8oZSl7Zm9yKHZhciB0O3Q9ZS5fcmVuZGVyZWRDb21wb25lbnQ7 KWU9dDtyZXR1cm4gZX1mdW5jdGlvbiBpKGUsdCl7dmFyIG49byhlKTtuLl9ob3N0Tm9kZT10LHRb bV09bn1mdW5jdGlvbiBhKGUpe3ZhciB0PWUuX2hvc3ROb2RlO3QmJihkZWxldGUgdFttXSxlLl9o b3N0Tm9kZT1udWxsKX1mdW5jdGlvbiBzKGUsdCl7aWYoIShlLl9mbGFncyZ2Lmhhc0NhY2hlZENo aWxkTm9kZXMpKXt2YXIgbj1lLl9yZW5kZXJlZENoaWxkcmVuLGE9dC5maXJzdENoaWxkO2U6Zm9y KHZhciBzIGluIG4paWYobi5oYXNPd25Qcm9wZXJ0eShzKSl7dmFyIHU9bltzXSxsPW8odSkuX2Rv bUlEO2lmKDAhPT1sKXtmb3IoO251bGwhPT1hO2E9YS5uZXh0U2libGluZylpZihyKGEsbCkpe2ko dSxhKTtjb250aW51ZSBlfXAoIjMyIixsKX19ZS5fZmxhZ3N8PXYuaGFzQ2FjaGVkQ2hpbGROb2Rl c319ZnVuY3Rpb24gdShlKXtpZihlW21dKXJldHVybiBlW21dO2Zvcih2YXIgdD1bXTshZVttXTsp e2lmKHQucHVzaChlKSwhZS5wYXJlbnROb2RlKXJldHVybiBudWxsO2U9ZS5wYXJlbnROb2RlfWZv cih2YXIgbixyO2UmJihyPWVbbV0pO2U9dC5wb3AoKSluPXIsdC5sZW5ndGgmJnMocixlKTtyZXR1 cm4gbn1mdW5jdGlvbiBsKGUpe3ZhciB0PXUoZSk7cmV0dXJuIG51bGwhPXQmJnQuX2hvc3ROb2Rl PT09ZT90Om51bGx9ZnVuY3Rpb24gYyhlKXtpZih2b2lkIDA9PT1lLl9ob3N0Tm9kZT9wKCIzMyIp OnZvaWQgMCxlLl9ob3N0Tm9kZSlyZXR1cm4gZS5faG9zdE5vZGU7Zm9yKHZhciB0PVtdOyFlLl9o b3N0Tm9kZTspdC5wdXNoKGUpLGUuX2hvc3RQYXJlbnQ/dm9pZCAwOnAoIjM0IiksZT1lLl9ob3N0 UGFyZW50O2Zvcig7dC5sZW5ndGg7ZT10LnBvcCgpKXMoZSxlLl9ob3N0Tm9kZSk7cmV0dXJuIGUu X2hvc3ROb2RlfXZhciBwPWUoMTExKSxkPWUoMTEpLGY9ZSgzMSksaD0oZSgxMzQpLGQuSURfQVRU UklCVVRFX05BTUUpLHY9ZixtPSJfX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSQiK01hdGgucmFuZG9t KCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpLGc9e2dldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlOnUs Z2V0SW5zdGFuY2VGcm9tTm9kZTpsLGdldE5vZGVGcm9tSW5zdGFuY2U6YyxwcmVjYWNoZUNoaWxk Tm9kZXM6cyxwcmVjYWNoZU5vZGU6aSx1bmNhY2hlTm9kZTphfTt0LmV4cG9ydHM9Z30sezExOjEx LDExMToxMTEsMTM0OjEzNCwzMTozMX1dLDMzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3Qi O2Z1bmN0aW9uIHIoZSx0KXt2YXIgbj17X3RvcExldmVsV3JhcHBlcjplLF9pZENvdW50ZXI6MSxf b3duZXJEb2N1bWVudDp0P3Qubm9kZVR5cGU9PT1vP3Q6dC5vd25lckRvY3VtZW50Om51bGwsX25v ZGU6dCxfdGFnOnQ/dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOm51bGwsX25hbWVzcGFjZVVSSTp0 P3QubmFtZXNwYWNlVVJJOm51bGx9O3JldHVybiBufXZhciBvPShlKDExNiksOSk7dC5leHBvcnRz PXJ9LHsxMTY6MTE2fV0sMzQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgx NDApLG89ZSg5KSxpPWUoMzIpLGE9ZnVuY3Rpb24oZSl7dGhpcy5fY3VycmVudEVsZW1lbnQ9bnVs bCx0aGlzLl9ob3N0Tm9kZT1udWxsLHRoaXMuX2hvc3RQYXJlbnQ9bnVsbCx0aGlzLl9ob3N0Q29u dGFpbmVySW5mbz1udWxsLHRoaXMuX2RvbUlEPTB9O3IoYS5wcm90b3R5cGUse21vdW50Q29tcG9u ZW50OmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBhPW4uX2lkQ291bnRlcisrO3RoaXMuX2RvbUlEPWEs dGhpcy5faG9zdFBhcmVudD10LHRoaXMuX2hvc3RDb250YWluZXJJbmZvPW47dmFyIHM9IiByZWFj dC1lbXB0eTogIit0aGlzLl9kb21JRCsiICI7aWYoZS51c2VDcmVhdGVFbGVtZW50KXt2YXIgdT1u Ll9vd25lckRvY3VtZW50LGw9dS5jcmVhdGVDb21tZW50KHMpO3JldHVybiBpLnByZWNhY2hlTm9k ZSh0aGlzLGwpLG8obCl9cmV0dXJuIGUucmVuZGVyVG9TdGF0aWNNYXJrdXA/IiI6IjwhLS0iK3Mr Ii0tPiJ9LHJlY2VpdmVDb21wb25lbnQ6ZnVuY3Rpb24oKXt9LGdldEhvc3ROb2RlOmZ1bmN0aW9u KCl7cmV0dXJuIGkuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0aGlzKX0sdW5tb3VudENvbXBvbmVudDpm dW5jdGlvbigpe2kudW5jYWNoZU5vZGUodGhpcyl9fSksdC5leHBvcnRzPWF9LHsxNDA6MTQwLDMy OjMyLDk6OX1dLDM1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoOCksbz1l KDMyKSxpPXtkYW5nZXJvdXNseVByb2Nlc3NDaGlsZHJlblVwZGF0ZXM6ZnVuY3Rpb24oZSx0KXt2 YXIgbj1vLmdldE5vZGVGcm9tSW5zdGFuY2UoZSk7ci5wcm9jZXNzVXBkYXRlcyhuLHQpfX07dC5l eHBvcnRzPWl9LHszMjozMiw4Ojh9XSwzNjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijtm dW5jdGlvbiByKCl7dGhpcy5fcm9vdE5vZGVJRCYmcC51cGRhdGVXcmFwcGVyKHRoaXMpfWZ1bmN0 aW9uIG8oZSl7dmFyIHQ9dGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHMsbj11LmV4ZWN1dGVPbkNo YW5nZSh0LGUpO2MuYXNhcChyLHRoaXMpO3ZhciBvPXQubmFtZTtpZigicmFkaW8iPT09dC50eXBl JiZudWxsIT1vKXtmb3IodmFyIGE9bC5nZXROb2RlRnJvbUluc3RhbmNlKHRoaXMpLHM9YTtzLnBh cmVudE5vZGU7KXM9cy5wYXJlbnROb2RlO2Zvcih2YXIgcD1zLnF1ZXJ5U2VsZWN0b3JBbGwoImlu cHV0W25hbWU9IitKU09OLnN0cmluZ2lmeSgiIitvKSsnXVt0eXBlPSJyYWRpbyJdJyksZD0wO2Q8 cC5sZW5ndGg7ZCsrKXt2YXIgZj1wW2RdO2lmKGYhPT1hJiZmLmZvcm09PT1hLmZvcm0pe3ZhciBo PWwuZ2V0SW5zdGFuY2VGcm9tTm9kZShmKTtoP3ZvaWQgMDppKCI5MCIpLGMuYXNhcChyLGgpfX19 cmV0dXJuIG59dmFyIGk9ZSgxMTEpLGE9ZSgxNDApLHM9ZSgxMiksdT1lKDIzKSxsPWUoMzIpLGM9 ZSg3MSkscD0oZSgxMzQpLGUoMTM5KSx7Z2V0SG9zdFByb3BzOmZ1bmN0aW9uKGUsdCl7dmFyIG49 dS5nZXRWYWx1ZSh0KSxyPXUuZ2V0Q2hlY2tlZCh0KSxvPWEoe3R5cGU6dm9pZCAwLHN0ZXA6dm9p ZCAwLG1pbjp2b2lkIDAsbWF4OnZvaWQgMH0sdCx7ZGVmYXVsdENoZWNrZWQ6dm9pZCAwLGRlZmF1 bHRWYWx1ZTp2b2lkIDAsdmFsdWU6bnVsbCE9bj9uOmUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFs dWUsY2hlY2tlZDpudWxsIT1yP3I6ZS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkLG9uQ2hh bmdlOmUuX3dyYXBwZXJTdGF0ZS5vbkNoYW5nZX0pO3JldHVybiBvfSxtb3VudFdyYXBwZXI6ZnVu Y3Rpb24oZSx0KXt2YXIgbj10LmRlZmF1bHRWYWx1ZTtlLl93cmFwcGVyU3RhdGU9e2luaXRpYWxD aGVja2VkOm51bGwhPXQuY2hlY2tlZD90LmNoZWNrZWQ6dC5kZWZhdWx0Q2hlY2tlZCxpbml0aWFs VmFsdWU6bnVsbCE9dC52YWx1ZT90LnZhbHVlOm4sbGlzdGVuZXJzOm51bGwsb25DaGFuZ2U6by5i aW5kKGUpfX0sdXBkYXRlV3JhcHBlcjpmdW5jdGlvbihlKXt2YXIgdD1lLl9jdXJyZW50RWxlbWVu dC5wcm9wcyxuPXQuY2hlY2tlZDtudWxsIT1uJiZzLnNldFZhbHVlRm9yUHJvcGVydHkobC5nZXRO b2RlRnJvbUluc3RhbmNlKGUpLCJjaGVja2VkIixufHwhMSk7dmFyIHI9bC5nZXROb2RlRnJvbUlu c3RhbmNlKGUpLG89dS5nZXRWYWx1ZSh0KTtpZihudWxsIT1vKXt2YXIgaT0iIitvO2khPT1yLnZh bHVlJiYoci52YWx1ZT1pKX1lbHNlIG51bGw9PXQudmFsdWUmJm51bGwhPXQuZGVmYXVsdFZhbHVl JiZyLmRlZmF1bHRWYWx1ZSE9PSIiK3QuZGVmYXVsdFZhbHVlJiYoci5kZWZhdWx0VmFsdWU9IiIr dC5kZWZhdWx0VmFsdWUpLG51bGw9PXQuY2hlY2tlZCYmbnVsbCE9dC5kZWZhdWx0Q2hlY2tlZCYm KHIuZGVmYXVsdENoZWNrZWQ9ISF0LmRlZmF1bHRDaGVja2VkKX0scG9zdE1vdW50V3JhcHBlcjpm dW5jdGlvbihlKXt2YXIgdD1lLl9jdXJyZW50RWxlbWVudC5wcm9wcyxuPWwuZ2V0Tm9kZUZyb21J bnN0YW5jZShlKTtzd2l0Y2godC50eXBlKXtjYXNlInN1Ym1pdCI6Y2FzZSJyZXNldCI6YnJlYWs7 Y2FzZSJjb2xvciI6Y2FzZSJkYXRlIjpjYXNlImRhdGV0aW1lIjpjYXNlImRhdGV0aW1lLWxvY2Fs IjpjYXNlIm1vbnRoIjpjYXNlInRpbWUiOmNhc2Uid2VlayI6bi52YWx1ZT0iIixuLnZhbHVlPW4u ZGVmYXVsdFZhbHVlO2JyZWFrO2RlZmF1bHQ6bi52YWx1ZT1uLnZhbHVlfXZhciByPW4ubmFtZTsi IiE9PXImJihuLm5hbWU9IiIpLG4uZGVmYXVsdENoZWNrZWQ9IW4uZGVmYXVsdENoZWNrZWQsbi5k ZWZhdWx0Q2hlY2tlZD0hbi5kZWZhdWx0Q2hlY2tlZCwiIiE9PXImJihuLm5hbWU9cil9fSk7dC5l eHBvcnRzPXB9LHsxMTE6MTExLDEyOjEyLDEzNDoxMzQsMTM5OjEzOSwxNDA6MTQwLDIzOjIzLDMy OjMyLDcxOjcxfV0sMzc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihl KXt2YXIgdD0iIjtyZXR1cm4gaS5DaGlsZHJlbi5mb3JFYWNoKGUsZnVuY3Rpb24oZSl7bnVsbCE9 ZSYmKCJzdHJpbmciPT10eXBlb2YgZXx8Im51bWJlciI9PXR5cGVvZiBlP3QrPWU6dXx8KHU9ITAp KX0pLHR9dmFyIG89ZSgxNDApLGk9ZSgxMTgpLGE9ZSgzMikscz1lKDM4KSx1PShlKDEzOSksITEp LGw9e21vdW50V3JhcHBlcjpmdW5jdGlvbihlLHQsbil7dmFyIG89bnVsbDtpZihudWxsIT1uKXt2 YXIgaT1uOyJvcHRncm91cCI9PT1pLl90YWcmJihpPWkuX2hvc3RQYXJlbnQpLG51bGwhPWkmJiJz ZWxlY3QiPT09aS5fdGFnJiYobz1zLmdldFNlbGVjdFZhbHVlQ29udGV4dChpKSl9dmFyIGE9bnVs bDtpZihudWxsIT1vKXt2YXIgdTtpZih1PW51bGwhPXQudmFsdWU/dC52YWx1ZSsiIjpyKHQuY2hp bGRyZW4pLGE9ITEsQXJyYXkuaXNBcnJheShvKSl7Zm9yKHZhciBsPTA7bDxvLmxlbmd0aDtsKysp aWYoIiIrb1tsXT09PXUpe2E9ITA7YnJlYWt9fWVsc2UgYT0iIitvPT09dX1lLl93cmFwcGVyU3Rh dGU9e3NlbGVjdGVkOmF9fSxwb3N0TW91bnRXcmFwcGVyOmZ1bmN0aW9uKGUpe3ZhciB0PWUuX2N1 cnJlbnRFbGVtZW50LnByb3BzO2lmKG51bGwhPXQudmFsdWUpe3ZhciBuPWEuZ2V0Tm9kZUZyb21J bnN0YW5jZShlKTtuLnNldEF0dHJpYnV0ZSgidmFsdWUiLHQudmFsdWUpfX0sZ2V0SG9zdFByb3Bz OmZ1bmN0aW9uKGUsdCl7dmFyIG49byh7c2VsZWN0ZWQ6dm9pZCAwLGNoaWxkcmVuOnZvaWQgMH0s dCk7bnVsbCE9ZS5fd3JhcHBlclN0YXRlLnNlbGVjdGVkJiYobi5zZWxlY3RlZD1lLl93cmFwcGVy U3RhdGUuc2VsZWN0ZWQpO3ZhciBpPXIodC5jaGlsZHJlbik7cmV0dXJuIGkmJihuLmNoaWxkcmVu PWkpLG59fTt0LmV4cG9ydHM9bH0sezExODoxMTgsMTM5OjEzOSwxNDA6MTQwLDMyOjMyLDM4OjM4 fV0sMzg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcigpe2lmKHRoaXMu X3Jvb3ROb2RlSUQmJnRoaXMuX3dyYXBwZXJTdGF0ZS5wZW5kaW5nVXBkYXRlKXt0aGlzLl93cmFw cGVyU3RhdGUucGVuZGluZ1VwZGF0ZT0hMTt2YXIgZT10aGlzLl9jdXJyZW50RWxlbWVudC5wcm9w cyx0PXMuZ2V0VmFsdWUoZSk7bnVsbCE9dCYmbyh0aGlzLEJvb2xlYW4oZS5tdWx0aXBsZSksdCl9 fWZ1bmN0aW9uIG8oZSx0LG4pe3ZhciByLG8saT11LmdldE5vZGVGcm9tSW5zdGFuY2UoZSkub3B0 aW9ucztpZih0KXtmb3Iocj17fSxvPTA7bzxuLmxlbmd0aDtvKyspclsiIituW29dXT0hMDtmb3Io bz0wO288aS5sZW5ndGg7bysrKXt2YXIgYT1yLmhhc093blByb3BlcnR5KGlbb10udmFsdWUpO2lb b10uc2VsZWN0ZWQhPT1hJiYoaVtvXS5zZWxlY3RlZD1hKX19ZWxzZXtmb3Iocj0iIituLG89MDtv PGkubGVuZ3RoO28rKylpZihpW29dLnZhbHVlPT09cilyZXR1cm4gdm9pZChpW29dLnNlbGVjdGVk PSEwKTtpLmxlbmd0aCYmKGlbMF0uc2VsZWN0ZWQ9ITApfX1mdW5jdGlvbiBpKGUpe3ZhciB0PXRo aXMuX2N1cnJlbnRFbGVtZW50LnByb3BzLG49cy5leGVjdXRlT25DaGFuZ2UodCxlKTtyZXR1cm4g dGhpcy5fcm9vdE5vZGVJRCYmKHRoaXMuX3dyYXBwZXJTdGF0ZS5wZW5kaW5nVXBkYXRlPSEwKSxs LmFzYXAocix0aGlzKSxufXZhciBhPWUoMTQwKSxzPWUoMjMpLHU9ZSgzMiksbD1lKDcxKSxjPShl KDEzOSksITEpLHA9e2dldEhvc3RQcm9wczpmdW5jdGlvbihlLHQpe3JldHVybiBhKHt9LHQse29u Q2hhbmdlOmUuX3dyYXBwZXJTdGF0ZS5vbkNoYW5nZSx2YWx1ZTp2b2lkIDB9KX0sbW91bnRXcmFw cGVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49cy5nZXRWYWx1ZSh0KTtlLl93cmFwcGVyU3RhdGU9e3Bl bmRpbmdVcGRhdGU6ITEsaW5pdGlhbFZhbHVlOm51bGwhPW4/bjp0LmRlZmF1bHRWYWx1ZSxsaXN0 ZW5lcnM6bnVsbCxvbkNoYW5nZTppLmJpbmQoZSksd2FzTXVsdGlwbGU6Qm9vbGVhbih0Lm11bHRp cGxlKX0sdm9pZCAwPT09dC52YWx1ZXx8dm9pZCAwPT09dC5kZWZhdWx0VmFsdWV8fGN8fChjPSEw KX0sZ2V0U2VsZWN0VmFsdWVDb250ZXh0OmZ1bmN0aW9uKGUpe3JldHVybiBlLl93cmFwcGVyU3Rh dGUuaW5pdGlhbFZhbHVlfSxwb3N0VXBkYXRlV3JhcHBlcjpmdW5jdGlvbihlKXt2YXIgdD1lLl9j dXJyZW50RWxlbWVudC5wcm9wcztlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlPXZvaWQgMDt2 YXIgbj1lLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU7ZS5fd3JhcHBlclN0YXRlLndhc011bHRp cGxlPUJvb2xlYW4odC5tdWx0aXBsZSk7dmFyIHI9cy5nZXRWYWx1ZSh0KTtudWxsIT1yPyhlLl93 cmFwcGVyU3RhdGUucGVuZGluZ1VwZGF0ZT0hMSxvKGUsQm9vbGVhbih0Lm11bHRpcGxlKSxyKSk6 biE9PUJvb2xlYW4odC5tdWx0aXBsZSkmJihudWxsIT10LmRlZmF1bHRWYWx1ZT9vKGUsQm9vbGVh bih0Lm11bHRpcGxlKSx0LmRlZmF1bHRWYWx1ZSk6byhlLEJvb2xlYW4odC5tdWx0aXBsZSksdC5t dWx0aXBsZT9bXToiIikpfX07dC5leHBvcnRzPXB9LHsxMzk6MTM5LDE0MDoxNDAsMjM6MjMsMzI6 MzIsNzE6NzF9XSwzOTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUs dCxuLHIpe3JldHVybiBlPT09biYmdD09PXJ9ZnVuY3Rpb24gbyhlKXt2YXIgdD1kb2N1bWVudC5z ZWxlY3Rpb24sbj10LmNyZWF0ZVJhbmdlKCkscj1uLnRleHQubGVuZ3RoLG89bi5kdXBsaWNhdGUo KTtvLm1vdmVUb0VsZW1lbnRUZXh0KGUpLG8uc2V0RW5kUG9pbnQoIkVuZFRvU3RhcnQiLG4pO3Zh ciBpPW8udGV4dC5sZW5ndGgsYT1pK3I7cmV0dXJue3N0YXJ0OmksZW5kOmF9fWZ1bmN0aW9uIGko ZSl7dmFyIHQ9d2luZG93LmdldFNlbGVjdGlvbiYmd2luZG93LmdldFNlbGVjdGlvbigpO2lmKCF0 fHwwPT09dC5yYW5nZUNvdW50KXJldHVybiBudWxsO3ZhciBuPXQuYW5jaG9yTm9kZSxvPXQuYW5j aG9yT2Zmc2V0LGk9dC5mb2N1c05vZGUsYT10LmZvY3VzT2Zmc2V0LHM9dC5nZXRSYW5nZUF0KDAp O3RyeXtzLnN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlLHMuZW5kQ29udGFpbmVyLm5vZGVUeXBlfWNh dGNoKGUpe3JldHVybiBudWxsfXZhciB1PXIodC5hbmNob3JOb2RlLHQuYW5jaG9yT2Zmc2V0LHQu Zm9jdXNOb2RlLHQuZm9jdXNPZmZzZXQpLGw9dT8wOnMudG9TdHJpbmcoKS5sZW5ndGgsYz1zLmNs b25lUmFuZ2UoKTtjLnNlbGVjdE5vZGVDb250ZW50cyhlKSxjLnNldEVuZChzLnN0YXJ0Q29udGFp bmVyLHMuc3RhcnRPZmZzZXQpO3ZhciBwPXIoYy5zdGFydENvbnRhaW5lcixjLnN0YXJ0T2Zmc2V0 LGMuZW5kQ29udGFpbmVyLGMuZW5kT2Zmc2V0KSxkPXA/MDpjLnRvU3RyaW5nKCkubGVuZ3RoLGY9 ZCtsLGg9ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtoLnNldFN0YXJ0KG4sbyksaC5zZXRFbmQoaSxh KTt2YXIgdj1oLmNvbGxhcHNlZDtyZXR1cm57c3RhcnQ6dj9mOmQsZW5kOnY/ZDpmfX1mdW5jdGlv biBhKGUsdCl7dmFyIG4scixvPWRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLmR1cGxp Y2F0ZSgpO3ZvaWQgMD09PXQuZW5kPyhuPXQuc3RhcnQscj1uKTp0LnN0YXJ0PnQuZW5kPyhuPXQu ZW5kLHI9dC5zdGFydCk6KG49dC5zdGFydCxyPXQuZW5kKSxvLm1vdmVUb0VsZW1lbnRUZXh0KGUp LG8ubW92ZVN0YXJ0KCJjaGFyYWN0ZXIiLG4pLG8uc2V0RW5kUG9pbnQoIkVuZFRvU3RhcnQiLG8p LG8ubW92ZUVuZCgiY2hhcmFjdGVyIixyLW4pLG8uc2VsZWN0KCl9ZnVuY3Rpb24gcyhlLHQpe2lm KHdpbmRvdy5nZXRTZWxlY3Rpb24pe3ZhciBuPXdpbmRvdy5nZXRTZWxlY3Rpb24oKSxyPWVbYygp XS5sZW5ndGgsbz1NYXRoLm1pbih0LnN0YXJ0LHIpLGk9dm9pZCAwPT09dC5lbmQ/bzpNYXRoLm1p bih0LmVuZCxyKTtpZighbi5leHRlbmQmJm8+aSl7dmFyIGE9aTtpPW8sbz1hfXZhciBzPWwoZSxv KSx1PWwoZSxpKTtpZihzJiZ1KXt2YXIgcD1kb2N1bWVudC5jcmVhdGVSYW5nZSgpO3Auc2V0U3Rh cnQocy5ub2RlLHMub2Zmc2V0KSxuLnJlbW92ZUFsbFJhbmdlcygpLG8+aT8obi5hZGRSYW5nZShw KSxuLmV4dGVuZCh1Lm5vZGUsdS5vZmZzZXQpKToocC5zZXRFbmQodS5ub2RlLHUub2Zmc2V0KSxu LmFkZFJhbmdlKHApKX19fXZhciB1PWUoMTIwKSxsPWUoMTA0KSxjPWUoMTA1KSxwPXUuY2FuVXNl RE9NJiYic2VsZWN0aW9uImluIGRvY3VtZW50JiYhKCJnZXRTZWxlY3Rpb24iaW4gd2luZG93KSxk PXtnZXRPZmZzZXRzOnA/bzppLHNldE9mZnNldHM6cD9hOnN9O3QuZXhwb3J0cz1kfSx7MTA0OjEw NCwxMDU6MTA1LDEyMDoxMjB9XSw0MDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIg cj1lKDQ2KSxvPWUoNjcpLGk9ZSg3Mik7ci5pbmplY3QoKTt2YXIgYT17cmVuZGVyVG9TdHJpbmc6 by5yZW5kZXJUb1N0cmluZyxyZW5kZXJUb1N0YXRpY01hcmt1cDpvLnJlbmRlclRvU3RhdGljTWFy a3VwLHZlcnNpb246aX07dC5leHBvcnRzPWF9LHs0Njo0Niw2Nzo2Nyw3Mjo3Mn1dLDQxOltmdW5j dGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoNDApO3QuZXhwb3J0cz1yfSx7NDA6NDB9 XSw0MjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDExMSksbz1lKDE0MCks aT1lKDgpLGE9ZSg5KSxzPWUoMzIpLHU9ZSg5NSksbD0oZSgxMzQpLGUoMTE2KSxmdW5jdGlvbihl KXt0aGlzLl9jdXJyZW50RWxlbWVudD1lLHRoaXMuX3N0cmluZ1RleHQ9IiIrZSx0aGlzLl9ob3N0 Tm9kZT1udWxsLHRoaXMuX2hvc3RQYXJlbnQ9bnVsbCx0aGlzLl9kb21JRD0wLHRoaXMuX21vdW50 SW5kZXg9MCx0aGlzLl9jbG9zaW5nQ29tbWVudD1udWxsLHRoaXMuX2NvbW1lbnROb2Rlcz1udWxs fSk7byhsLnByb3RvdHlwZSx7bW91bnRDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89 bi5faWRDb3VudGVyKyssaT0iIHJlYWN0LXRleHQ6ICIrbysiICIsbD0iIC9yZWFjdC10ZXh0ICI7 aWYodGhpcy5fZG9tSUQ9byx0aGlzLl9ob3N0UGFyZW50PXQsZS51c2VDcmVhdGVFbGVtZW50KXt2 YXIgYz1uLl9vd25lckRvY3VtZW50LHA9Yy5jcmVhdGVDb21tZW50KGkpLGQ9Yy5jcmVhdGVDb21t ZW50KGwpLGY9YShjLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSk7cmV0dXJuIGEucXVldWVDaGls ZChmLGEocCkpLHRoaXMuX3N0cmluZ1RleHQmJmEucXVldWVDaGlsZChmLGEoYy5jcmVhdGVUZXh0 Tm9kZSh0aGlzLl9zdHJpbmdUZXh0KSkpLGEucXVldWVDaGlsZChmLGEoZCkpLHMucHJlY2FjaGVO b2RlKHRoaXMscCksdGhpcy5fY2xvc2luZ0NvbW1lbnQ9ZCxmfXZhciBoPXUodGhpcy5fc3RyaW5n VGV4dCk7cmV0dXJuIGUucmVuZGVyVG9TdGF0aWNNYXJrdXA/aDoiPCEtLSIraSsiLS0+IitoKyI8 IS0tIitsKyItLT4ifSxyZWNlaXZlQ29tcG9uZW50OmZ1bmN0aW9uKGUsdCl7aWYoZSE9PXRoaXMu X2N1cnJlbnRFbGVtZW50KXt0aGlzLl9jdXJyZW50RWxlbWVudD1lO3ZhciBuPSIiK2U7aWYobiE9 PXRoaXMuX3N0cmluZ1RleHQpe3RoaXMuX3N0cmluZ1RleHQ9bjt2YXIgcj10aGlzLmdldEhvc3RO b2RlKCk7aS5yZXBsYWNlRGVsaW1pdGVkVGV4dChyWzBdLHJbMV0sbik7Cit9fX0sZ2V0SG9zdE5v ZGU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9jb21tZW50Tm9kZXM7aWYoZSlyZXR1cm4gZTtpZigh dGhpcy5fY2xvc2luZ0NvbW1lbnQpZm9yKHZhciB0PXMuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0aGlz KSxuPXQubmV4dFNpYmxpbmc7Oyl7aWYobnVsbD09bj9yKCI2NyIsdGhpcy5fZG9tSUQpOnZvaWQg MCw4PT09bi5ub2RlVHlwZSYmIiAvcmVhY3QtdGV4dCAiPT09bi5ub2RlVmFsdWUpe3RoaXMuX2Ns b3NpbmdDb21tZW50PW47YnJlYWt9bj1uLm5leHRTaWJsaW5nfXJldHVybiBlPVt0aGlzLl9ob3N0 Tm9kZSx0aGlzLl9jbG9zaW5nQ29tbWVudF0sdGhpcy5fY29tbWVudE5vZGVzPWUsZX0sdW5tb3Vu dENvbXBvbmVudDpmdW5jdGlvbigpe3RoaXMuX2Nsb3NpbmdDb21tZW50PW51bGwsdGhpcy5fY29t bWVudE5vZGVzPW51bGwscy51bmNhY2hlTm9kZSh0aGlzKX19KSx0LmV4cG9ydHM9bH0sezExMTox MTEsMTE2OjExNiwxMzQ6MTM0LDE0MDoxNDAsMzI6MzIsODo4LDk6OSw5NTo5NX1dLDQzOltmdW5j dGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoKXt0aGlzLl9yb290Tm9kZUlEJiZj LnVwZGF0ZVdyYXBwZXIodGhpcyl9ZnVuY3Rpb24gbyhlKXt2YXIgdD10aGlzLl9jdXJyZW50RWxl bWVudC5wcm9wcyxuPXMuZXhlY3V0ZU9uQ2hhbmdlKHQsZSk7cmV0dXJuIGwuYXNhcChyLHRoaXMp LG59dmFyIGk9ZSgxMTEpLGE9ZSgxNDApLHM9ZSgyMyksdT1lKDMyKSxsPWUoNzEpLGM9KGUoMTM0 KSxlKDEzOSkse2dldEhvc3RQcm9wczpmdW5jdGlvbihlLHQpe251bGwhPXQuZGFuZ2Vyb3VzbHlT ZXRJbm5lckhUTUw/aSgiOTEiKTp2b2lkIDA7dmFyIG49YSh7fSx0LHt2YWx1ZTp2b2lkIDAsZGVm YXVsdFZhbHVlOnZvaWQgMCxjaGlsZHJlbjoiIitlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVl LG9uQ2hhbmdlOmUuX3dyYXBwZXJTdGF0ZS5vbkNoYW5nZX0pO3JldHVybiBufSxtb3VudFdyYXBw ZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj1zLmdldFZhbHVlKHQpLHI9bjtpZihudWxsPT1uKXt2YXIg YT10LmRlZmF1bHRWYWx1ZSx1PXQuY2hpbGRyZW47bnVsbCE9dSYmKG51bGwhPWE/aSgiOTIiKTp2 b2lkIDAsQXJyYXkuaXNBcnJheSh1KSYmKHUubGVuZ3RoPD0xP3ZvaWQgMDppKCI5MyIpLHU9dVsw XSksYT0iIit1KSxudWxsPT1hJiYoYT0iIikscj1hfWUuX3dyYXBwZXJTdGF0ZT17aW5pdGlhbFZh bHVlOiIiK3IsbGlzdGVuZXJzOm51bGwsb25DaGFuZ2U6by5iaW5kKGUpfX0sdXBkYXRlV3JhcHBl cjpmdW5jdGlvbihlKXt2YXIgdD1lLl9jdXJyZW50RWxlbWVudC5wcm9wcyxuPXUuZ2V0Tm9kZUZy b21JbnN0YW5jZShlKSxyPXMuZ2V0VmFsdWUodCk7aWYobnVsbCE9cil7dmFyIG89IiIrcjtvIT09 bi52YWx1ZSYmKG4udmFsdWU9byksbnVsbD09dC5kZWZhdWx0VmFsdWUmJihuLmRlZmF1bHRWYWx1 ZT1vKX1udWxsIT10LmRlZmF1bHRWYWx1ZSYmKG4uZGVmYXVsdFZhbHVlPXQuZGVmYXVsdFZhbHVl KX0scG9zdE1vdW50V3JhcHBlcjpmdW5jdGlvbihlKXt2YXIgdD11LmdldE5vZGVGcm9tSW5zdGFu Y2UoZSksbj10LnRleHRDb250ZW50O249PT1lLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlJiYo dC52YWx1ZT1uKX19KTt0LmV4cG9ydHM9Y30sezExMToxMTEsMTM0OjEzNCwxMzk6MTM5LDE0MDox NDAsMjM6MjMsMzI6MzIsNzE6NzF9XSw0NDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijtm dW5jdGlvbiByKGUsdCl7Il9ob3N0Tm9kZSJpbiBlP3ZvaWQgMDp1KCIzMyIpLCJfaG9zdE5vZGUi aW4gdD92b2lkIDA6dSgiMzMiKTtmb3IodmFyIG49MCxyPWU7cjtyPXIuX2hvc3RQYXJlbnQpbisr O2Zvcih2YXIgbz0wLGk9dDtpO2k9aS5faG9zdFBhcmVudClvKys7Zm9yKDtuLW8+MDspZT1lLl9o b3N0UGFyZW50LG4tLTtmb3IoO28tbj4wOyl0PXQuX2hvc3RQYXJlbnQsby0tO2Zvcih2YXIgYT1u O2EtLTspe2lmKGU9PT10KXJldHVybiBlO2U9ZS5faG9zdFBhcmVudCx0PXQuX2hvc3RQYXJlbnR9 cmV0dXJuIG51bGx9ZnVuY3Rpb24gbyhlLHQpeyJfaG9zdE5vZGUiaW4gZT92b2lkIDA6dSgiMzUi KSwiX2hvc3ROb2RlImluIHQ/dm9pZCAwOnUoIjM1Iik7Zm9yKDt0Oyl7aWYodD09PWUpcmV0dXJu ITA7dD10Ll9ob3N0UGFyZW50fXJldHVybiExfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIl9ob3N0Tm9k ZSJpbiBlP3ZvaWQgMDp1KCIzNiIpLGUuX2hvc3RQYXJlbnR9ZnVuY3Rpb24gYShlLHQsbil7Zm9y KHZhciByPVtdO2U7KXIucHVzaChlKSxlPWUuX2hvc3RQYXJlbnQ7dmFyIG87Zm9yKG89ci5sZW5n dGg7by0tID4wOyl0KHJbb10sImNhcHR1cmVkIixuKTtmb3Iobz0wO288ci5sZW5ndGg7bysrKXQo cltvXSwiYnViYmxlZCIsbil9ZnVuY3Rpb24gcyhlLHQsbixvLGkpe2Zvcih2YXIgYT1lJiZ0P3Io ZSx0KTpudWxsLHM9W107ZSYmZSE9PWE7KXMucHVzaChlKSxlPWUuX2hvc3RQYXJlbnQ7Zm9yKHZh ciB1PVtdO3QmJnQhPT1hOyl1LnB1c2godCksdD10Ll9ob3N0UGFyZW50O3ZhciBsO2ZvcihsPTA7 bDxzLmxlbmd0aDtsKyspbihzW2xdLCJidWJibGVkIixvKTtmb3IobD11Lmxlbmd0aDtsLS0gPjA7 KW4odVtsXSwiY2FwdHVyZWQiLGkpfXZhciB1PWUoMTExKTtlKDEzNCk7dC5leHBvcnRzPXtpc0Fu Y2VzdG9yOm8sZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3I6cixnZXRQYXJlbnRJbnN0YW5jZTppLHRy YXZlcnNlVHdvUGhhc2U6YSx0cmF2ZXJzZUVudGVyTGVhdmU6c319LHsxMTE6MTExLDEzNDoxMzR9 XSw0NTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7dGhpcy5yZWlu aXRpYWxpemVUcmFuc2FjdGlvbigpfXZhciBvPWUoMTQwKSxpPWUoNzEpLGE9ZSg4OSkscz1lKDEy NiksdT17aW5pdGlhbGl6ZTpzLGNsb3NlOmZ1bmN0aW9uKCl7ZC5pc0JhdGNoaW5nVXBkYXRlcz0h MX19LGw9e2luaXRpYWxpemU6cyxjbG9zZTppLmZsdXNoQmF0Y2hlZFVwZGF0ZXMuYmluZChpKX0s Yz1bbCx1XTtvKHIucHJvdG90eXBlLGEse2dldFRyYW5zYWN0aW9uV3JhcHBlcnM6ZnVuY3Rpb24o KXtyZXR1cm4gY319KTt2YXIgcD1uZXcgcixkPXtpc0JhdGNoaW5nVXBkYXRlczohMSxiYXRjaGVk VXBkYXRlczpmdW5jdGlvbihlLHQsbixyLG8saSl7dmFyIGE9ZC5pc0JhdGNoaW5nVXBkYXRlczty ZXR1cm4gZC5pc0JhdGNoaW5nVXBkYXRlcz0hMCxhP2UodCxuLHIsbyxpKTpwLnBlcmZvcm0oZSxu dWxsLHQsbixyLG8saSl9fTt0LmV4cG9ydHM9ZH0sezEyNjoxMjYsMTQwOjE0MCw3MTo3MSw4OTo4 OX1dLDQ2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoKXt4fHwoeD0h MCx5LkV2ZW50RW1pdHRlci5pbmplY3RSZWFjdEV2ZW50TGlzdGVuZXIoZykseS5FdmVudFBsdWdp bkh1Yi5pbmplY3RFdmVudFBsdWdpbk9yZGVyKHMpLHkuRXZlbnRQbHVnaW5VdGlscy5pbmplY3RD b21wb25lbnRUcmVlKGQpLHkuRXZlbnRQbHVnaW5VdGlscy5pbmplY3RUcmVlVHJhdmVyc2FsKGgp LHkuRXZlbnRQbHVnaW5IdWIuaW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lKHtTaW1wbGVFdmVudFBs dWdpbjpFLEVudGVyTGVhdmVFdmVudFBsdWdpbjp1LENoYW5nZUV2ZW50UGx1Z2luOmEsU2VsZWN0 RXZlbnRQbHVnaW46YixCZWZvcmVJbnB1dEV2ZW50UGx1Z2luOml9KSx5Lkhvc3RDb21wb25lbnQu aW5qZWN0R2VuZXJpY0NvbXBvbmVudENsYXNzKHApLHkuSG9zdENvbXBvbmVudC5pbmplY3RUZXh0 Q29tcG9uZW50Q2xhc3ModikseS5ET01Qcm9wZXJ0eS5pbmplY3RET01Qcm9wZXJ0eUNvbmZpZyhv KSx5LkRPTVByb3BlcnR5LmluamVjdERPTVByb3BlcnR5Q29uZmlnKGwpLHkuRE9NUHJvcGVydHku aW5qZWN0RE9NUHJvcGVydHlDb25maWcoXykseS5FbXB0eUNvbXBvbmVudC5pbmplY3RFbXB0eUNv bXBvbmVudEZhY3RvcnkoZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBmKGUpfSkseS5VcGRhdGVzLmlu amVjdFJlY29uY2lsZVRyYW5zYWN0aW9uKEMpLHkuVXBkYXRlcy5pbmplY3RCYXRjaGluZ1N0cmF0 ZWd5KG0pLHkuQ29tcG9uZW50LmluamVjdEVudmlyb25tZW50KGMpKX12YXIgbz1lKDEpLGk9ZSgz KSxhPWUoNykscz1lKDE0KSx1PWUoMTUpLGw9ZSgyMSksYz1lKDI3KSxwPWUoMzApLGQ9ZSgzMiks Zj1lKDM0KSxoPWUoNDQpLHY9ZSg0MiksbT1lKDQ1KSxnPWUoNTEpLHk9ZSg1NCksQz1lKDYzKSxf PWUoNzMpLGI9ZSg3NCksRT1lKDc1KSx4PSExO3QuZXhwb3J0cz17aW5qZWN0OnJ9fSx7MToxLDE0 OjE0LDE1OjE1LDIxOjIxLDI3OjI3LDM6MywzMDozMCwzMjozMiwzNDozNCw0Mjo0Miw0NDo0NCw0 NTo0NSw1MTo1MSw1NDo1NCw2Mzo2Myw3OjcsNzM6NzMsNzQ6NzQsNzU6NzV9XSw0NzpbZnVuY3Rp b24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZT eW1ib2wuZm9yJiZTeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50Iil8fDYwMTAzO3QuZXhwb3J0cz1y fSx7fV0sNDg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHIsbz17aW5qZWN0RW1w dHlDb21wb25lbnRGYWN0b3J5OmZ1bmN0aW9uKGUpe3I9ZX19LGk9e2NyZWF0ZTpmdW5jdGlvbihl KXtyZXR1cm4gcihlKX19O2kuaW5qZWN0aW9uPW8sdC5leHBvcnRzPWl9LHt9XSw0OTpbZnVuY3Rp b24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuKXt0cnl7dChuKX1jYXRjaChl KXtudWxsPT09byYmKG89ZSl9fXZhciBvPW51bGwsaT17aW52b2tlR3VhcmRlZENhbGxiYWNrOnIs aW52b2tlR3VhcmRlZENhbGxiYWNrV2l0aENhdGNoOnIscmV0aHJvd0NhdWdodEVycm9yOmZ1bmN0 aW9uKCl7aWYobyl7dmFyIGU9bzt0aHJvdyBvPW51bGwsZX19fTt0LmV4cG9ydHM9aX0se31dLDUw OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7by5lbnF1ZXVlRXZl bnRzKGUpLG8ucHJvY2Vzc0V2ZW50UXVldWUoITEpfXZhciBvPWUoMTYpLGk9e2hhbmRsZVRvcExl dmVsOmZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBhPW8uZXh0cmFjdEV2ZW50cyhlLHQsbixpKTtyKGEp fX07dC5leHBvcnRzPWl9LHsxNjoxNn1dLDUxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3Qi O2Z1bmN0aW9uIHIoZSl7Zm9yKDtlLl9ob3N0UGFyZW50OyllPWUuX2hvc3RQYXJlbnQ7dmFyIHQ9 cC5nZXROb2RlRnJvbUluc3RhbmNlKGUpLG49dC5wYXJlbnROb2RlO3JldHVybiBwLmdldENsb3Nl c3RJbnN0YW5jZUZyb21Ob2RlKG4pfWZ1bmN0aW9uIG8oZSx0KXt0aGlzLnRvcExldmVsVHlwZT1l LHRoaXMubmF0aXZlRXZlbnQ9dCx0aGlzLmFuY2VzdG9ycz1bXX1mdW5jdGlvbiBpKGUpe3ZhciB0 PWYoZS5uYXRpdmVFdmVudCksbj1wLmdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKHQpLG89bjtk byBlLmFuY2VzdG9ycy5wdXNoKG8pLG89byYmcihvKTt3aGlsZShvKTtmb3IodmFyIGk9MDtpPGUu YW5jZXN0b3JzLmxlbmd0aDtpKyspbj1lLmFuY2VzdG9yc1tpXSx2Ll9oYW5kbGVUb3BMZXZlbChl LnRvcExldmVsVHlwZSxuLGUubmF0aXZlRXZlbnQsZihlLm5hdGl2ZUV2ZW50KSl9ZnVuY3Rpb24g YShlKXt2YXIgdD1oKHdpbmRvdyk7ZSh0KX12YXIgcz1lKDE0MCksdT1lKDExOSksbD1lKDEyMCks Yz1lKDI0KSxwPWUoMzIpLGQ9ZSg3MSksZj1lKDEwMSksaD1lKDEzMSk7cyhvLnByb3RvdHlwZSx7 ZGVzdHJ1Y3RvcjpmdW5jdGlvbigpe3RoaXMudG9wTGV2ZWxUeXBlPW51bGwsdGhpcy5uYXRpdmVF dmVudD1udWxsLHRoaXMuYW5jZXN0b3JzLmxlbmd0aD0wfX0pLGMuYWRkUG9vbGluZ1RvKG8sYy50 d29Bcmd1bWVudFBvb2xlcik7dmFyIHY9e19lbmFibGVkOiEwLF9oYW5kbGVUb3BMZXZlbDpudWxs LFdJTkRPV19IQU5ETEU6bC5jYW5Vc2VET00/d2luZG93Om51bGwsc2V0SGFuZGxlVG9wTGV2ZWw6 ZnVuY3Rpb24oZSl7di5faGFuZGxlVG9wTGV2ZWw9ZX0sc2V0RW5hYmxlZDpmdW5jdGlvbihlKXt2 Ll9lbmFibGVkPSEhZX0saXNFbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHYuX2VuYWJsZWR9LHRy YXBCdWJibGVkRXZlbnQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuP3UubGlzdGVuKG4sdCx2LmRp c3BhdGNoRXZlbnQuYmluZChudWxsLGUpKTpudWxsfSx0cmFwQ2FwdHVyZWRFdmVudDpmdW5jdGlv bihlLHQsbil7cmV0dXJuIG4/dS5jYXB0dXJlKG4sdCx2LmRpc3BhdGNoRXZlbnQuYmluZChudWxs LGUpKTpudWxsfSxtb25pdG9yU2Nyb2xsVmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9YS5iaW5kKG51 bGwsZSk7dS5saXN0ZW4od2luZG93LCJzY3JvbGwiLHQpfSxkaXNwYXRjaEV2ZW50OmZ1bmN0aW9u KGUsdCl7aWYodi5fZW5hYmxlZCl7dmFyIG49by5nZXRQb29sZWQoZSx0KTt0cnl7ZC5iYXRjaGVk VXBkYXRlcyhpLG4pfWZpbmFsbHl7by5yZWxlYXNlKG4pfX19fTt0LmV4cG9ydHM9dn0sezEwMTox MDEsMTE5OjExOSwxMjA6MTIwLDEzMToxMzEsMTQwOjE0MCwyNDoyNCwzMjozMiw3MTo3MX1dLDUy OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXtsb2dUb3BMZXZlbFJlbmRlcnM6 ITF9O3QuZXhwb3J0cz1yfSx7fV0sNTM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVu Y3Rpb24gcihlKXtyZXR1cm4gcz92b2lkIDA6YSgiMTExIixlLnR5cGUpLG5ldyBzKGUpfWZ1bmN0 aW9uIG8oZSl7cmV0dXJuIG5ldyB1KGUpfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIGUgaW5zdGFuY2Vv ZiB1fXZhciBhPWUoMTExKSxzPShlKDEzNCksbnVsbCksdT1udWxsLGw9e2luamVjdEdlbmVyaWND b21wb25lbnRDbGFzczpmdW5jdGlvbihlKXtzPWV9LGluamVjdFRleHRDb21wb25lbnRDbGFzczpm dW5jdGlvbihlKXt1PWV9fSxjPXtjcmVhdGVJbnRlcm5hbENvbXBvbmVudDpyLGNyZWF0ZUluc3Rh bmNlRm9yVGV4dDpvLGlzVGV4dENvbXBvbmVudDppLGluamVjdGlvbjpsfTt0LmV4cG9ydHM9Y30s ezExMToxMTEsMTM0OjEzNH1dLDU0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciBy PWUoMTEpLG89ZSgxNiksaT1lKDE4KSxhPWUoMjgpLHM9ZSg0OCksdT1lKDI1KSxsPWUoNTMpLGM9 ZSg3MSkscD17Q29tcG9uZW50OmEuaW5qZWN0aW9uLERPTVByb3BlcnR5OnIuaW5qZWN0aW9uLEVt cHR5Q29tcG9uZW50OnMuaW5qZWN0aW9uLEV2ZW50UGx1Z2luSHViOm8uaW5qZWN0aW9uLEV2ZW50 UGx1Z2luVXRpbHM6aS5pbmplY3Rpb24sRXZlbnRFbWl0dGVyOnUuaW5qZWN0aW9uLEhvc3RDb21w b25lbnQ6bC5pbmplY3Rpb24sVXBkYXRlczpjLmluamVjdGlvbn07dC5leHBvcnRzPXB9LHsxMTox MSwxNjoxNiwxODoxOCwyNToyNSwyODoyOCw0ODo0OCw1Mzo1Myw3MTo3MX1dLDU1OltmdW5jdGlv bihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGkoZG9jdW1lbnQuZG9j dW1lbnRFbGVtZW50LGUpfXZhciBvPWUoMzkpLGk9ZSgxMjMpLGE9ZSgxMjgpLHM9ZSgxMjkpLHU9 e2hhc1NlbGVjdGlvbkNhcGFiaWxpdGllczpmdW5jdGlvbihlKXt2YXIgdD1lJiZlLm5vZGVOYW1l JiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHQmJigiaW5wdXQiPT09dCYmInRleHQi PT09ZS50eXBlfHwidGV4dGFyZWEiPT09dHx8InRydWUiPT09ZS5jb250ZW50RWRpdGFibGUpfSxn ZXRTZWxlY3Rpb25JbmZvcm1hdGlvbjpmdW5jdGlvbigpe3ZhciBlPXMoKTtyZXR1cm57Zm9jdXNl ZEVsZW06ZSxzZWxlY3Rpb25SYW5nZTp1Lmhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhlKT91Lmdl dFNlbGVjdGlvbihlKTpudWxsfX0scmVzdG9yZVNlbGVjdGlvbjpmdW5jdGlvbihlKXt2YXIgdD1z KCksbj1lLmZvY3VzZWRFbGVtLG89ZS5zZWxlY3Rpb25SYW5nZTt0IT09biYmcihuKSYmKHUuaGFz U2VsZWN0aW9uQ2FwYWJpbGl0aWVzKG4pJiZ1LnNldFNlbGVjdGlvbihuLG8pLGEobikpfSxnZXRT ZWxlY3Rpb246ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoInNlbGVjdGlvblN0YXJ0ImluIGUpdD17c3Rh cnQ6ZS5zZWxlY3Rpb25TdGFydCxlbmQ6ZS5zZWxlY3Rpb25FbmR9O2Vsc2UgaWYoZG9jdW1lbnQu c2VsZWN0aW9uJiZlLm5vZGVOYW1lJiYiaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgp KXt2YXIgbj1kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTtuLnBhcmVudEVsZW1lbnQo KT09PWUmJih0PXtzdGFydDotbi5tb3ZlU3RhcnQoImNoYXJhY3RlciIsLWUudmFsdWUubGVuZ3Ro KSxlbmQ6LW4ubW92ZUVuZCgiY2hhcmFjdGVyIiwtZS52YWx1ZS5sZW5ndGgpfSl9ZWxzZSB0PW8u Z2V0T2Zmc2V0cyhlKTtyZXR1cm4gdHx8e3N0YXJ0OjAsZW5kOjB9fSxzZXRTZWxlY3Rpb246ZnVu Y3Rpb24oZSx0KXt2YXIgbj10LnN0YXJ0LHI9dC5lbmQ7aWYodm9pZCAwPT09ciYmKHI9biksInNl bGVjdGlvblN0YXJ0ImluIGUpZS5zZWxlY3Rpb25TdGFydD1uLGUuc2VsZWN0aW9uRW5kPU1hdGgu bWluKHIsZS52YWx1ZS5sZW5ndGgpO2Vsc2UgaWYoZG9jdW1lbnQuc2VsZWN0aW9uJiZlLm5vZGVO YW1lJiYiaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXt2YXIgaT1lLmNyZWF0ZVRl eHRSYW5nZSgpO2kuY29sbGFwc2UoITApLGkubW92ZVN0YXJ0KCJjaGFyYWN0ZXIiLG4pLGkubW92 ZUVuZCgiY2hhcmFjdGVyIixyLW4pLGkuc2VsZWN0KCl9ZWxzZSBvLnNldE9mZnNldHMoZSx0KX19 O3QuZXhwb3J0cz11fSx7MTIzOjEyMywxMjg6MTI4LDEyOToxMjksMzk6Mzl9XSw1NjpbZnVuY3Rp b24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17cmVtb3ZlOmZ1bmN0aW9uKGUpe2UuX3JlYWN0 SW50ZXJuYWxJbnN0YW5jZT12b2lkIDB9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gZS5fcmVhY3RJ bnRlcm5hbEluc3RhbmNlfSxoYXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PWUuX3JlYWN0 SW50ZXJuYWxJbnN0YW5jZX0sc2V0OmZ1bmN0aW9uKGUsdCl7ZS5fcmVhY3RJbnRlcm5hbEluc3Rh bmNlPXR9fTt0LmV4cG9ydHM9cn0se31dLDU3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3Qi O3ZhciByPW51bGw7dC5leHBvcnRzPXtkZWJ1Z1Rvb2w6cn19LHt9XSw1ODpbZnVuY3Rpb24oZSx0 LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDkyKSxvPS9cLz8+LyxpPS9ePFwhXC1cLS8sYT17Q0hF Q0tTVU1fQVRUUl9OQU1FOiJkYXRhLXJlYWN0LWNoZWNrc3VtIixhZGRDaGVja3N1bVRvTWFya3Vw OmZ1bmN0aW9uKGUpe3ZhciB0PXIoZSk7cmV0dXJuIGkudGVzdChlKT9lOmUucmVwbGFjZShvLCIg IithLkNIRUNLU1VNX0FUVFJfTkFNRSsnPSInK3QrJyIkJicpfSxjYW5SZXVzZU1hcmt1cDpmdW5j dGlvbihlLHQpe3ZhciBuPXQuZ2V0QXR0cmlidXRlKGEuQ0hFQ0tTVU1fQVRUUl9OQU1FKTtuPW4m JnBhcnNlSW50KG4sMTApO3ZhciBvPXIoZSk7cmV0dXJuIG89PT1ufX07dC5leHBvcnRzPWF9LHs5 Mjo5Mn1dLDU5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4p e3JldHVybnt0eXBlOiJJTlNFUlRfTUFSS1VQIixjb250ZW50OmUsZnJvbUluZGV4Om51bGwsZnJv bU5vZGU6bnVsbCx0b0luZGV4Om4sYWZ0ZXJOb2RlOnR9fWZ1bmN0aW9uIG8oZSx0LG4pe3JldHVy bnt0eXBlOiJNT1ZFX0VYSVNUSU5HIixjb250ZW50Om51bGwsZnJvbUluZGV4OmUuX21vdW50SW5k ZXgsZnJvbU5vZGU6ZC5nZXRIb3N0Tm9kZShlKSx0b0luZGV4Om4sYWZ0ZXJOb2RlOnR9fWZ1bmN0 aW9uIGkoZSx0KXtyZXR1cm57dHlwZToiUkVNT1ZFX05PREUiLGNvbnRlbnQ6bnVsbCxmcm9tSW5k ZXg6ZS5fbW91bnRJbmRleCxmcm9tTm9kZTp0LHRvSW5kZXg6bnVsbCxhZnRlck5vZGU6bnVsbH19 ZnVuY3Rpb24gYShlKXtyZXR1cm57dHlwZToiU0VUX01BUktVUCIsY29udGVudDplLGZyb21JbmRl eDpudWxsLGZyb21Ob2RlOm51bGwsdG9JbmRleDpudWxsLGFmdGVyTm9kZTpudWxsfX1mdW5jdGlv biBzKGUpe3JldHVybnt0eXBlOiJURVhUX0NPTlRFTlQiLGNvbnRlbnQ6ZSxmcm9tSW5kZXg6bnVs bCxmcm9tTm9kZTpudWxsLHRvSW5kZXg6bnVsbCxhZnRlck5vZGU6bnVsbH19ZnVuY3Rpb24gdShl LHQpe3JldHVybiB0JiYoZT1lfHxbXSxlLnB1c2godCkpLGV9ZnVuY3Rpb24gbChlLHQpe3AucHJv Y2Vzc0NoaWxkcmVuVXBkYXRlcyhlLHQpfXZhciBjPWUoMTExKSxwPWUoMjgpLGQ9KGUoNTYpLGUo NTcpLGUoMTE3KSxlKDY0KSksZj1lKDI2KSxoPShlKDEyNiksZSg5NikpLHY9KGUoMTM0KSx7TWl4 aW46e19yZWNvbmNpbGVySW5zdGFudGlhdGVDaGlsZHJlbjpmdW5jdGlvbihlLHQsbil7cmV0dXJu IGYuaW5zdGFudGlhdGVDaGlsZHJlbihlLHQsbil9LF9yZWNvbmNpbGVyVXBkYXRlQ2hpbGRyZW46 ZnVuY3Rpb24oZSx0LG4scixvLGkpe3ZhciBhLHM9MDtyZXR1cm4gYT1oKHQscyksZi51cGRhdGVD aGlsZHJlbihlLGEsbixyLG8sdGhpcyx0aGlzLl9ob3N0Q29udGFpbmVySW5mbyxpLHMpLGF9LG1v dW50Q2hpbGRyZW46ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuX3JlY29uY2lsZXJJbnN0YW50 aWF0ZUNoaWxkcmVuKGUsdCxuKTt0aGlzLl9yZW5kZXJlZENoaWxkcmVuPXI7dmFyIG89W10saT0w O2Zvcih2YXIgYSBpbiByKWlmKHIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBzPXJbYV0sdT0wLGw9 ZC5tb3VudENvbXBvbmVudChzLHQsdGhpcyx0aGlzLl9ob3N0Q29udGFpbmVySW5mbyxuLHUpO3Mu X21vdW50SW5kZXg9aSsrLG8ucHVzaChsKX1yZXR1cm4gb30sdXBkYXRlVGV4dENvbnRlbnQ6ZnVu Y3Rpb24oZSl7dmFyIHQ9dGhpcy5fcmVuZGVyZWRDaGlsZHJlbjtmLnVubW91bnRDaGlsZHJlbih0 LCExKTtmb3IodmFyIG4gaW4gdCl0Lmhhc093blByb3BlcnR5KG4pJiZjKCIxMTgiKTt2YXIgcj1b cyhlKV07bCh0aGlzLHIpfSx1cGRhdGVNYXJrdXA6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fcmVu ZGVyZWRDaGlsZHJlbjtmLnVubW91bnRDaGlsZHJlbih0LCExKTtmb3IodmFyIG4gaW4gdCl0Lmhh c093blByb3BlcnR5KG4pJiZjKCIxMTgiKTt2YXIgcj1bYShlKV07bCh0aGlzLHIpfSx1cGRhdGVD aGlsZHJlbjpmdW5jdGlvbihlLHQsbil7dGhpcy5fdXBkYXRlQ2hpbGRyZW4oZSx0LG4pfSxfdXBk YXRlQ2hpbGRyZW46ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuX3JlbmRlcmVkQ2hpbGRyZW4s bz17fSxpPVtdLGE9dGhpcy5fcmVjb25jaWxlclVwZGF0ZUNoaWxkcmVuKHIsZSxpLG8sdCxuKTtp ZihhfHxyKXt2YXIgcyxjPW51bGwscD0wLGY9MCxoPTAsdj1udWxsO2ZvcihzIGluIGEpaWYoYS5o YXNPd25Qcm9wZXJ0eShzKSl7dmFyIG09ciYmcltzXSxnPWFbc107bT09PWc/KGM9dShjLHRoaXMu bW92ZUNoaWxkKG0sdixwLGYpKSxmPU1hdGgubWF4KG0uX21vdW50SW5kZXgsZiksbS5fbW91bnRJ bmRleD1wKToobSYmKGY9TWF0aC5tYXgobS5fbW91bnRJbmRleCxmKSksYz11KGMsdGhpcy5fbW91 bnRDaGlsZEF0SW5kZXgoZyxpW2hdLHYscCx0LG4pKSxoKyspLHArKyx2PWQuZ2V0SG9zdE5vZGUo Zyl9Zm9yKHMgaW4gbylvLmhhc093blByb3BlcnR5KHMpJiYoYz11KGMsdGhpcy5fdW5tb3VudENo aWxkKHJbc10sb1tzXSkpKTtjJiZsKHRoaXMsYyksdGhpcy5fcmVuZGVyZWRDaGlsZHJlbj1hfX0s dW5tb3VudENoaWxkcmVuOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX3JlbmRlcmVkQ2hpbGRyZW47 Zi51bm1vdW50Q2hpbGRyZW4odCxlKSx0aGlzLl9yZW5kZXJlZENoaWxkcmVuPW51bGx9LG1vdmVD aGlsZDpmdW5jdGlvbihlLHQsbixyKXtpZihlLl9tb3VudEluZGV4PHIpcmV0dXJuIG8oZSx0LG4p fSxjcmVhdGVDaGlsZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHIobix0LGUuX21vdW50SW5kZXgp fSxyZW1vdmVDaGlsZDpmdW5jdGlvbihlLHQpe3JldHVybiBpKGUsdCl9LF9tb3VudENoaWxkQXRJ bmRleDpmdW5jdGlvbihlLHQsbixyLG8saSl7cmV0dXJuIGUuX21vdW50SW5kZXg9cix0aGlzLmNy ZWF0ZUNoaWxkKGUsbix0KX0sX3VubW91bnRDaGlsZDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMu cmVtb3ZlQ2hpbGQoZSx0KTtyZXR1cm4gZS5fbW91bnRJbmRleD1udWxsLG59fX0pO3QuZXhwb3J0 cz12fSx7MTExOjExMSwxMTc6MTE3LDEyNjoxMjYsMTM0OjEzNCwyNjoyNiwyODoyOCw1Njo1Niw1 Nzo1Nyw2NDo2NCw5Njo5Nn1dLDYwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciBy PWUoMTExKSxvPWUoMTE4KSxpPShlKDEzNCkse0hPU1Q6MCxDT01QT1NJVEU6MSxFTVBUWToyLGdl dFR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PT1lfHxlPT09ITE/aS5FTVBUWTpvLmlzVmFs aWRFbGVtZW50KGUpPyJmdW5jdGlvbiI9PXR5cGVvZiBlLnR5cGU/aS5DT01QT1NJVEU6aS5IT1NU OnZvaWQgcigiMjYiLGUpfX0pO3QuZXhwb3J0cz1pfSx7MTExOjExMSwxMTg6MTE4LDEzNDoxMzR9 XSw2MTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiEo IWV8fCJmdW5jdGlvbiIhPXR5cGVvZiBlLmF0dGFjaFJlZnx8ImZ1bmN0aW9uIiE9dHlwZW9mIGUu ZGV0YWNoUmVmKX12YXIgbz1lKDExMSksaT0oZSgxMzQpLHthZGRDb21wb25lbnRBc1JlZlRvOmZ1 bmN0aW9uKGUsdCxuKXtyKG4pP3ZvaWQgMDpvKCIxMTkiKSxuLmF0dGFjaFJlZih0LGUpfSxyZW1v dmVDb21wb25lbnRBc1JlZkZyb206ZnVuY3Rpb24oZSx0LG4pe3Iobik/dm9pZCAwOm8oIjEyMCIp O3ZhciBpPW4uZ2V0UHVibGljSW5zdGFuY2UoKTtpJiZpLnJlZnNbdF09PT1lLmdldFB1YmxpY0lu c3RhbmNlKCkmJm4uZGV0YWNoUmVmKHQpfX0pO3QuZXhwb3J0cz1pfSx7MTExOjExMSwxMzQ6MTM0 fV0sNjI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9IlNFQ1JFVF9ET19OT1Rf UEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEIjt0LmV4cG9ydHM9cn0se31dLDYzOltmdW5j dGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dGhpcy5yZWluaXRpYWxpemVU cmFuc2FjdGlvbigpLHRoaXMucmVuZGVyVG9TdGF0aWNNYXJrdXA9ITEsdGhpcy5yZWFjdE1vdW50 UmVhZHk9aS5nZXRQb29sZWQobnVsbCksdGhpcy51c2VDcmVhdGVFbGVtZW50PWV9dmFyIG89ZSgx NDApLGk9ZSg2KSxhPWUoMjQpLHM9ZSgyNSksdT1lKDU1KSxsPShlKDU3KSxlKDg5KSksYz1lKDcw KSxwPXtpbml0aWFsaXplOnUuZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb24sY2xvc2U6dS5yZXN0b3Jl U2VsZWN0aW9ufSxkPXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7dmFyIGU9cy5pc0VuYWJsZWQoKTty ZXR1cm4gcy5zZXRFbmFibGVkKCExKSxlfSxjbG9zZTpmdW5jdGlvbihlKXtzLnNldEVuYWJsZWQo ZSl9fSxmPXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7dGhpcy5yZWFjdE1vdW50UmVhZHkucmVzZXQo KX0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLnJlYWN0TW91bnRSZWFkeS5ub3RpZnlBbGwoKX19LGg9 W3AsZCxmXSx2PXtnZXRUcmFuc2FjdGlvbldyYXBwZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIGh9LGdl dFJlYWN0TW91bnRSZWFkeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWN0TW91bnRSZWFkeX0s Z2V0VXBkYXRlUXVldWU6ZnVuY3Rpb24oKXtyZXR1cm4gY30sY2hlY2twb2ludDpmdW5jdGlvbigp e3JldHVybiB0aGlzLnJlYWN0TW91bnRSZWFkeS5jaGVja3BvaW50KCl9LHJvbGxiYWNrOmZ1bmN0 aW9uKGUpe3RoaXMucmVhY3RNb3VudFJlYWR5LnJvbGxiYWNrKGUpfSxkZXN0cnVjdG9yOmZ1bmN0 aW9uKCl7aS5yZWxlYXNlKHRoaXMucmVhY3RNb3VudFJlYWR5KSx0aGlzLnJlYWN0TW91bnRSZWFk eT1udWxsfX07byhyLnByb3RvdHlwZSxsLHYpLGEuYWRkUG9vbGluZ1RvKHIpLHQuZXhwb3J0cz1y fSx7MTQwOjE0MCwyNDoyNCwyNToyNSw1NTo1NSw1Nzo1Nyw2OjYsNzA6NzAsODk6ODl9XSw2NDpb ZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7by5hdHRhY2hSZWZzKHRo aXMsdGhpcy5fY3VycmVudEVsZW1lbnQpfXZhciBvPWUoNjUpLGk9KGUoNTcpLGUoMTM5KSx7bW91 bnRDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4sbyxpLGEpe3ZhciBzPWUubW91bnRDb21wb25lbnQo dCxuLG8saSxhKTtyZXR1cm4gZS5fY3VycmVudEVsZW1lbnQmJm51bGwhPWUuX2N1cnJlbnRFbGVt ZW50LnJlZiYmdC5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHIsZSksc30sZ2V0SG9zdE5v ZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0SG9zdE5vZGUoKX0sdW5tb3VudENvbXBvbmVudDpm dW5jdGlvbihlLHQpe28uZGV0YWNoUmVmcyhlLGUuX2N1cnJlbnRFbGVtZW50KSxlLnVubW91bnRD b21wb25lbnQodCl9LHJlY2VpdmVDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4saSl7dmFyIGE9ZS5f Y3VycmVudEVsZW1lbnQ7aWYodCE9PWF8fGkhPT1lLl9jb250ZXh0KXt2YXIgcz1vLnNob3VsZFVw ZGF0ZVJlZnMoYSx0KTtzJiZvLmRldGFjaFJlZnMoZSxhKSxlLnJlY2VpdmVDb21wb25lbnQodCxu LGkpLHMmJmUuX2N1cnJlbnRFbGVtZW50JiZudWxsIT1lLl9jdXJyZW50RWxlbWVudC5yZWYmJm4u Z2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShyLGUpfX0scGVyZm9ybVVwZGF0ZUlmTmVjZXNz YXJ5OmZ1bmN0aW9uKGUsdCxuKXtlLl91cGRhdGVCYXRjaE51bWJlcj09PW4mJmUucGVyZm9ybVVw ZGF0ZUlmTmVjZXNzYXJ5KHQpfX0pO3QuZXhwb3J0cz1pfSx7MTM5OjEzOSw1Nzo1Nyw2NTo2NX1d LDY1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4peyJmdW5j dGlvbiI9PXR5cGVvZiBlP2UodC5nZXRQdWJsaWNJbnN0YW5jZSgpKTppLmFkZENvbXBvbmVudEFz UmVmVG8odCxlLG4pfWZ1bmN0aW9uIG8oZSx0LG4peyJmdW5jdGlvbiI9PXR5cGVvZiBlP2UobnVs bCk6aS5yZW1vdmVDb21wb25lbnRBc1JlZkZyb20odCxlLG4pfXZhciBpPWUoNjEpLGE9e307YS5h dHRhY2hSZWZzPWZ1bmN0aW9uKGUsdCl7aWYobnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdCl7 dmFyIG49dC5yZWY7bnVsbCE9biYmcihuLGUsdC5fb3duZXIpfX0sYS5zaG91bGRVcGRhdGVSZWZz PWZ1bmN0aW9uKGUsdCl7dmFyIG49bnVsbCxyPW51bGw7bnVsbCE9PWUmJiJvYmplY3QiPT10eXBl b2YgZSYmKG49ZS5yZWYscj1lLl9vd25lcik7dmFyIG89bnVsbCxpPW51bGw7cmV0dXJuIG51bGwh PT10JiYib2JqZWN0Ij09dHlwZW9mIHQmJihvPXQucmVmLGk9dC5fb3duZXIpLG4hPT1vfHwic3Ry aW5nIj09dHlwZW9mIG8mJmkhPT1yfSxhLmRldGFjaFJlZnM9ZnVuY3Rpb24oZSx0KXtpZihudWxs IT09dCYmIm9iamVjdCI9PXR5cGVvZiB0KXt2YXIgbj10LnJlZjtudWxsIT1uJiZvKG4sZSx0Ll9v d25lcil9fSx0LmV4cG9ydHM9YX0sezYxOjYxfV0sNjY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0 cmljdCI7dmFyIHI9e2lzQmF0Y2hpbmdVcGRhdGVzOiExLGJhdGNoZWRVcGRhdGVzOmZ1bmN0aW9u KGUpe319O3QuZXhwb3J0cz1yfSx7fV0sNjc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7 ZnVuY3Rpb24gcihlLHQpe3ZhciBuO3RyeXtyZXR1cm4gaC5pbmplY3Rpb24uaW5qZWN0QmF0Y2hp bmdTdHJhdGVneShkKSxuPWYuZ2V0UG9vbGVkKHQpLGcrKyxuLnBlcmZvcm0oZnVuY3Rpb24oKXt2 YXIgcj1tKGUsITApLG89cC5tb3VudENvbXBvbmVudChyLG4sbnVsbCx1KCksdiwwKTtyZXR1cm4g dHx8KG89Yy5hZGRDaGVja3N1bVRvTWFya3VwKG8pKSxvfSxudWxsKX1maW5hbGx5e2ctLSxmLnJl bGVhc2UobiksZ3x8aC5pbmplY3Rpb24uaW5qZWN0QmF0Y2hpbmdTdHJhdGVneShsKX19ZnVuY3Rp b24gbyhlKXtyZXR1cm4gcy5pc1ZhbGlkRWxlbWVudChlKT92b2lkIDA6YSgiNDYiKSxyKGUsITEp fWZ1bmN0aW9uIGkoZSl7cmV0dXJuIHMuaXNWYWxpZEVsZW1lbnQoZSk/dm9pZCAwOmEoIjQ3Iiks cihlLCEwKX12YXIgYT1lKDExMSkscz1lKDExOCksdT1lKDMzKSxsPWUoNDUpLGM9KGUoNTcpLGUo NTgpKSxwPWUoNjQpLGQ9ZSg2NiksZj1lKDY4KSxoPWUoNzEpLHY9ZSgxMjcpLG09ZSgxMDcpLGc9 KGUoMTM0KSwwKTt0LmV4cG9ydHM9e3JlbmRlclRvU3RyaW5nOm8scmVuZGVyVG9TdGF0aWNNYXJr dXA6aX19LHsxMDc6MTA3LDExMToxMTEsMTE4OjExOCwxMjc6MTI3LDEzNDoxMzQsMzM6MzMsNDU6 NDUsNTc6NTcsNTg6NTgsNjQ6NjQsNjY6NjYsNjg6NjgsNzE6NzF9XSw2ODpbZnVuY3Rpb24oZSx0 LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3RoaXMucmVpbml0aWFsaXplVHJhbnNhY3Rp b24oKSx0aGlzLnJlbmRlclRvU3RhdGljTWFya3VwPWUsdGhpcy51c2VDcmVhdGVFbGVtZW50PSEx LHRoaXMudXBkYXRlUXVldWU9bmV3IHModGhpcyl9dmFyIG89ZSgxNDApLGk9ZSgyNCksYT1lKDg5 KSxzPShlKDU3KSxlKDY5KSksdT1bXSxsPXtlbnF1ZXVlOmZ1bmN0aW9uKCl7fX0sYz17Z2V0VHJh bnNhY3Rpb25XcmFwcGVyczpmdW5jdGlvbigpe3JldHVybiB1fSxnZXRSZWFjdE1vdW50UmVhZHk6 ZnVuY3Rpb24oKXtyZXR1cm4gbH0sZ2V0VXBkYXRlUXVldWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhp cy51cGRhdGVRdWV1ZX0sZGVzdHJ1Y3RvcjpmdW5jdGlvbigpe30sY2hlY2twb2ludDpmdW5jdGlv bigpe30scm9sbGJhY2s6ZnVuY3Rpb24oKXt9fTtvKHIucHJvdG90eXBlLGEsYyksaS5hZGRQb29s aW5nVG8ociksdC5leHBvcnRzPXJ9LHsxNDA6MTQwLDI0OjI0LDU3OjU3LDY5OjY5LDg5Ojg5fV0s Njk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe2lmKCEoZSBp bnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMg YSBmdW5jdGlvbiIpfWZ1bmN0aW9uIG8oZSx0KXt9dmFyIGk9ZSg3MCksYT0oZSgxMzkpLGZ1bmN0 aW9uKCl7ZnVuY3Rpb24gZSh0KXtyKHRoaXMsZSksdGhpcy50cmFuc2FjdGlvbj10fXJldHVybiBl LnByb3RvdHlwZS5pc01vdW50ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuITF9LGUucHJvdG90eXBlLmVu cXVldWVDYWxsYmFjaz1mdW5jdGlvbihlLHQsbil7dGhpcy50cmFuc2FjdGlvbi5pc0luVHJhbnNh Y3Rpb24oKSYmaS5lbnF1ZXVlQ2FsbGJhY2soZSx0LG4pfSxlLnByb3RvdHlwZS5lbnF1ZXVlRm9y Y2VVcGRhdGU9ZnVuY3Rpb24oZSl7dGhpcy50cmFuc2FjdGlvbi5pc0luVHJhbnNhY3Rpb24oKT9p LmVucXVldWVGb3JjZVVwZGF0ZShlKTpvKGUsImZvcmNlVXBkYXRlIil9LGUucHJvdG90eXBlLmVu cXVldWVSZXBsYWNlU3RhdGU9ZnVuY3Rpb24oZSx0KXt0aGlzLnRyYW5zYWN0aW9uLmlzSW5UcmFu c2FjdGlvbigpP2kuZW5xdWV1ZVJlcGxhY2VTdGF0ZShlLHQpOm8oZSwicmVwbGFjZVN0YXRlIil9 LGUucHJvdG90eXBlLmVucXVldWVTZXRTdGF0ZT1mdW5jdGlvbihlLHQpe3RoaXMudHJhbnNhY3Rp b24uaXNJblRyYW5zYWN0aW9uKCk/aS5lbnF1ZXVlU2V0U3RhdGUoZSx0KTpvKGUsInNldFN0YXRl Iil9LGV9KCkpO3QuZXhwb3J0cz1hfSx7MTM5OjEzOSw3MDo3MH1dLDcwOltmdW5jdGlvbihlLHQs bil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dS5lbnF1ZXVlVXBkYXRlKGUpfWZ1bmN0aW9u IG8oZSl7dmFyIHQ9dHlwZW9mIGU7aWYoIm9iamVjdCIhPT10KXJldHVybiB0O3ZhciBuPWUuY29u c3RydWN0b3ImJmUuY29uc3RydWN0b3IubmFtZXx8dCxyPU9iamVjdC5rZXlzKGUpO3JldHVybiBy Lmxlbmd0aD4wJiZyLmxlbmd0aDwyMD9uKyIgKGtleXM6ICIrci5qb2luKCIsICIpKyIpIjpufWZ1 bmN0aW9uIGkoZSx0KXt2YXIgbj1zLmdldChlKTtyZXR1cm4gbj9uOm51bGx9dmFyIGE9ZSgxMTEp LHM9KGUoMTE3KSxlKDU2KSksdT0oZSg1NyksZSg3MSkpLGw9KGUoMTM0KSxlKDEzOSkse2lzTW91 bnRlZDpmdW5jdGlvbihlKXt2YXIgdD1zLmdldChlKTtyZXR1cm4hIXQmJiEhdC5fcmVuZGVyZWRD b21wb25lbnR9LGVucXVldWVDYWxsYmFjazpmdW5jdGlvbihlLHQsbil7bC52YWxpZGF0ZUNhbGxi YWNrKHQsbik7dmFyIG89aShlKTtyZXR1cm4gbz8oby5fcGVuZGluZ0NhbGxiYWNrcz9vLl9wZW5k aW5nQ2FsbGJhY2tzLnB1c2godCk6by5fcGVuZGluZ0NhbGxiYWNrcz1bdF0sdm9pZCByKG8pKTpu dWxsfSxlbnF1ZXVlQ2FsbGJhY2tJbnRlcm5hbDpmdW5jdGlvbihlLHQpe2UuX3BlbmRpbmdDYWxs YmFja3M/ZS5fcGVuZGluZ0NhbGxiYWNrcy5wdXNoKHQpOmUuX3BlbmRpbmdDYWxsYmFja3M9W3Rd LHIoZSl9LGVucXVldWVGb3JjZVVwZGF0ZTpmdW5jdGlvbihlKXt2YXIgdD1pKGUsImZvcmNlVXBk YXRlIik7dCYmKHQuX3BlbmRpbmdGb3JjZVVwZGF0ZT0hMCxyKHQpKX0sZW5xdWV1ZVJlcGxhY2VT dGF0ZTpmdW5jdGlvbihlLHQpe3ZhciBuPWkoZSwicmVwbGFjZVN0YXRlIik7biYmKG4uX3BlbmRp bmdTdGF0ZVF1ZXVlPVt0XSxuLl9wZW5kaW5nUmVwbGFjZVN0YXRlPSEwLHIobikpfSxlbnF1ZXVl U2V0U3RhdGU6ZnVuY3Rpb24oZSx0KXt2YXIgbj1pKGUsInNldFN0YXRlIik7aWYobil7dmFyIG89 bi5fcGVuZGluZ1N0YXRlUXVldWV8fChuLl9wZW5kaW5nU3RhdGVRdWV1ZT1bXSk7by5wdXNoKHQp LHIobil9fSxlbnF1ZXVlRWxlbWVudEludGVybmFsOmZ1bmN0aW9uKGUsdCxuKXtlLl9wZW5kaW5n RWxlbWVudD10LGUuX2NvbnRleHQ9bixyKGUpfSx2YWxpZGF0ZUNhbGxiYWNrOmZ1bmN0aW9uKGUs dCl7ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU/YSgiMTIyIix0LG8oZSkpOnZvaWQgMH19KTt0LmV4 cG9ydHM9bH0sezExMToxMTEsMTE3OjExNywxMzQ6MTM0LDEzOToxMzksNTY6NTYsNTc6NTcsNzE6 NzF9XSw3MTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7UC5SZWFj dFJlY29uY2lsZVRyYW5zYWN0aW9uJiZiP3ZvaWQgMDpjKCIxMjMiKX1mdW5jdGlvbiBvKCl7dGhp cy5yZWluaXRpYWxpemVUcmFuc2FjdGlvbigpLHRoaXMuZGlydHlDb21wb25lbnRzTGVuZ3RoPW51 bGwsdGhpcy5jYWxsYmFja1F1ZXVlPWQuZ2V0UG9vbGVkKCksdGhpcy5yZWNvbmNpbGVUcmFuc2Fj dGlvbj1QLlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24uZ2V0UG9vbGVkKCEwKX1mdW5jdGlvbiBp KGUsdCxuLG8saSxhKXtyZXR1cm4gcigpLGIuYmF0Y2hlZFVwZGF0ZXMoZSx0LG4sbyxpLGEpfWZ1 bmN0aW9uIGEoZSx0KXtyZXR1cm4gZS5fbW91bnRPcmRlci10Ll9tb3VudE9yZGVyfWZ1bmN0aW9u IHMoZSl7dmFyIHQ9ZS5kaXJ0eUNvbXBvbmVudHNMZW5ndGg7dCE9PWcubGVuZ3RoP2MoIjEyNCIs dCxnLmxlbmd0aCk6dm9pZCAwLGcuc29ydChhKSx5Kys7Zm9yKHZhciBuPTA7bjx0O24rKyl7dmFy IHI9Z1tuXSxvPXIuX3BlbmRpbmdDYWxsYmFja3M7ci5fcGVuZGluZ0NhbGxiYWNrcz1udWxsO3Zh ciBpO2lmKGgubG9nVG9wTGV2ZWxSZW5kZXJzKXt2YXIgcz1yO3IuX2N1cnJlbnRFbGVtZW50LnR5 cGUuaXNSZWFjdFRvcExldmVsV3JhcHBlciYmKHM9ci5fcmVuZGVyZWRDb21wb25lbnQpLGk9IlJl YWN0IHVwZGF0ZTogIitzLmdldE5hbWUoKSxjb25zb2xlLnRpbWUoaSl9aWYodi5wZXJmb3JtVXBk YXRlSWZOZWNlc3NhcnkocixlLnJlY29uY2lsZVRyYW5zYWN0aW9uLHkpLGkmJmNvbnNvbGUudGlt ZUVuZChpKSxvKWZvcih2YXIgdT0wO3U8by5sZW5ndGg7dSsrKWUuY2FsbGJhY2tRdWV1ZS5lbnF1 ZXVlKG9bdV0sci5nZXRQdWJsaWNJbnN0YW5jZSgpKX19ZnVuY3Rpb24gdShlKXtyZXR1cm4gcigp LGIuaXNCYXRjaGluZ1VwZGF0ZXM/KGcucHVzaChlKSx2b2lkKG51bGw9PWUuX3VwZGF0ZUJhdGNo TnVtYmVyJiYoZS5fdXBkYXRlQmF0Y2hOdW1iZXI9eSsxKSkpOnZvaWQgYi5iYXRjaGVkVXBkYXRl cyh1LGUpfWZ1bmN0aW9uIGwoZSx0KXtiLmlzQmF0Y2hpbmdVcGRhdGVzP3ZvaWQgMDpjKCIxMjUi KSxDLmVucXVldWUoZSx0KSxfPSEwfXZhciBjPWUoMTExKSxwPWUoMTQwKSxkPWUoNiksZj1lKDI0 KSxoPWUoNTIpLHY9ZSg2NCksbT1lKDg5KSxnPShlKDEzNCksW10pLHk9MCxDPWQuZ2V0UG9vbGVk KCksXz0hMSxiPW51bGwsRT17aW5pdGlhbGl6ZTpmdW5jdGlvbigpe3RoaXMuZGlydHlDb21wb25l bnRzTGVuZ3RoPWcubGVuZ3RofSxjbG9zZTpmdW5jdGlvbigpe3RoaXMuZGlydHlDb21wb25lbnRz TGVuZ3RoIT09Zy5sZW5ndGg/KGcuc3BsaWNlKDAsdGhpcy5kaXJ0eUNvbXBvbmVudHNMZW5ndGgp LGsoKSk6Zy5sZW5ndGg9MH19LHg9e2luaXRpYWxpemU6ZnVuY3Rpb24oKXt0aGlzLmNhbGxiYWNr UXVldWUucmVzZXQoKX0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLmNhbGxiYWNrUXVldWUubm90aWZ5 QWxsKCl9fSx3PVtFLHhdO3Aoby5wcm90b3R5cGUsbSx7Z2V0VHJhbnNhY3Rpb25XcmFwcGVyczpm dW5jdGlvbigpe3JldHVybiB3fSxkZXN0cnVjdG9yOmZ1bmN0aW9uKCl7dGhpcy5kaXJ0eUNvbXBv bmVudHNMZW5ndGg9bnVsbCxkLnJlbGVhc2UodGhpcy5jYWxsYmFja1F1ZXVlKSx0aGlzLmNhbGxi YWNrUXVldWU9bnVsbCxQLlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24ucmVsZWFzZSh0aGlzLnJl Y29uY2lsZVRyYW5zYWN0aW9uKSx0aGlzLnJlY29uY2lsZVRyYW5zYWN0aW9uPW51bGx9LHBlcmZv cm06ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBtLnBlcmZvcm0uY2FsbCh0aGlzLHRoaXMucmVjb25j aWxlVHJhbnNhY3Rpb24ucGVyZm9ybSx0aGlzLnJlY29uY2lsZVRyYW5zYWN0aW9uLGUsdCxuKX19 KSxmLmFkZFBvb2xpbmdUbyhvKTt2YXIgaz1mdW5jdGlvbigpe2Zvcig7Zy5sZW5ndGh8fF87KXtp ZihnLmxlbmd0aCl7dmFyIGU9by5nZXRQb29sZWQoKTtlLnBlcmZvcm0ocyxudWxsLGUpLG8ucmVs ZWFzZShlKX1pZihfKXtfPSExO3ZhciB0PUM7Qz1kLmdldFBvb2xlZCgpLHQubm90aWZ5QWxsKCks ZC5yZWxlYXNlKHQpfX19LFQ9e2luamVjdFJlY29uY2lsZVRyYW5zYWN0aW9uOmZ1bmN0aW9uKGUp e2U/dm9pZCAwOmMoIjEyNiIpLFAuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbj1lfSxpbmplY3RC YXRjaGluZ1N0cmF0ZWd5OmZ1bmN0aW9uKGUpe2U/dm9pZCAwOmMoIjEyNyIpLCJmdW5jdGlvbiIh PXR5cGVvZiBlLmJhdGNoZWRVcGRhdGVzP2MoIjEyOCIpOnZvaWQgMCwiYm9vbGVhbiIhPXR5cGVv ZiBlLmlzQmF0Y2hpbmdVcGRhdGVzP2MoIjEyOSIpOnZvaWQgMCxiPWV9fSxQPXtSZWFjdFJlY29u Y2lsZVRyYW5zYWN0aW9uOm51bGwsYmF0Y2hlZFVwZGF0ZXM6aSxlbnF1ZXVlVXBkYXRlOnUsZmx1 c2hCYXRjaGVkVXBkYXRlczprLGluamVjdGlvbjpULGFzYXA6bH07dC5leHBvcnRzPVB9LHsxMTE6 MTExLDEzNDoxMzQsMTQwOjE0MCwyNDoyNCw1Mjo1Miw2OjYsNjQ6NjQsODk6ODl9XSw3MjpbZnVu Y3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9IjE1LjQuMiJ9LHt9XSw3MzpbZnVu Y3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17eGxpbms6Imh0dHA6Ly93d3cudzMub3Jn LzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIn0s bz17YWNjZW50SGVpZ2h0OiJhY2NlbnQtaGVpZ2h0IixhY2N1bXVsYXRlOjAsYWRkaXRpdmU6MCxh bGlnbm1lbnRCYXNlbGluZToiYWxpZ25tZW50LWJhc2VsaW5lIixhbGxvd1Jlb3JkZXI6ImFsbG93 UmVvcmRlciIsYWxwaGFiZXRpYzowLGFtcGxpdHVkZTowLGFyYWJpY0Zvcm06ImFyYWJpYy1mb3Jt Iixhc2NlbnQ6MCxhdHRyaWJ1dGVOYW1lOiJhdHRyaWJ1dGVOYW1lIixhdHRyaWJ1dGVUeXBlOiJh dHRyaWJ1dGVUeXBlIixhdXRvUmV2ZXJzZToiYXV0b1JldmVyc2UiLGF6aW11dGg6MCxiYXNlRnJl cXVlbmN5OiJiYXNlRnJlcXVlbmN5IixiYXNlUHJvZmlsZToiYmFzZVByb2ZpbGUiLGJhc2VsaW5l U2hpZnQ6ImJhc2VsaW5lLXNoaWZ0IixiYm94OjAsYmVnaW46MCxiaWFzOjAsYnk6MCxjYWxjTW9k ZToiY2FsY01vZGUiLGNhcEhlaWdodDoiY2FwLWhlaWdodCIsY2xpcDowLGNsaXBQYXRoOiJjbGlw LXBhdGgiLGNsaXBSdWxlOiJjbGlwLXJ1bGUiLGNsaXBQYXRoVW5pdHM6ImNsaXBQYXRoVW5pdHMi LGNvbG9ySW50ZXJwb2xhdGlvbjoiY29sb3ItaW50ZXJwb2xhdGlvbiIsY29sb3JJbnRlcnBvbGF0 aW9uRmlsdGVyczoiY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzIixjb2xvclByb2ZpbGU6ImNv bG9yLXByb2ZpbGUiLGNvbG9yUmVuZGVyaW5nOiJjb2xvci1yZW5kZXJpbmciLGNvbnRlbnRTY3Jp cHRUeXBlOiJjb250ZW50U2NyaXB0VHlwZSIsY29udGVudFN0eWxlVHlwZToiY29udGVudFN0eWxl VHlwZSIsY3Vyc29yOjAsY3g6MCxjeTowLGQ6MCxkZWNlbGVyYXRlOjAsZGVzY2VudDowLGRpZmZ1 c2VDb25zdGFudDoiZGlmZnVzZUNvbnN0YW50IixkaXJlY3Rpb246MCxkaXNwbGF5OjAsZGl2aXNv cjowLGRvbWluYW50QmFzZWxpbmU6ImRvbWluYW50LWJhc2VsaW5lIixkdXI6MCxkeDowLGR5OjAs ZWRnZU1vZGU6ImVkZ2VNb2RlIixlbGV2YXRpb246MCxlbmFibGVCYWNrZ3JvdW5kOiJlbmFibGUt YmFja2dyb3VuZCIsZW5kOjAsZXhwb25lbnQ6MCxleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkOiJl eHRlcm5hbFJlc291cmNlc1JlcXVpcmVkIixmaWxsOjAsZmlsbE9wYWNpdHk6ImZpbGwtb3BhY2l0 eSIsZmlsbFJ1bGU6ImZpbGwtcnVsZSIsZmlsdGVyOjAsZmlsdGVyUmVzOiJmaWx0ZXJSZXMiLGZp bHRlclVuaXRzOiJmaWx0ZXJVbml0cyIsZmxvb2RDb2xvcjoiZmxvb2QtY29sb3IiLGZsb29kT3Bh Y2l0eToiZmxvb2Qtb3BhY2l0eSIsZm9jdXNhYmxlOjAsZm9udEZhbWlseToiZm9udC1mYW1pbHki LGZvbnRTaXplOiJmb250LXNpemUiLGZvbnRTaXplQWRqdXN0OiJmb250LXNpemUtYWRqdXN0Iixm b250U3RyZXRjaDoiZm9udC1zdHJldGNoIixmb250U3R5bGU6ImZvbnQtc3R5bGUiLGZvbnRWYXJp YW50OiJmb250LXZhcmlhbnQiLGZvbnRXZWlnaHQ6ImZvbnQtd2VpZ2h0Iixmb3JtYXQ6MCxmcm9t OjAsZng6MCxmeTowLGcxOjAsZzI6MCxnbHlwaE5hbWU6ImdseXBoLW5hbWUiLGdseXBoT3JpZW50 YXRpb25Ib3Jpem9udGFsOiJnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIixnbHlwaE9yaWVu dGF0aW9uVmVydGljYWw6ImdseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsIixnbHlwaFJlZjoiZ2x5 cGhSZWYiLGdyYWRpZW50VHJhbnNmb3JtOiJncmFkaWVudFRyYW5zZm9ybSIsZ3JhZGllbnRVbml0 czoiZ3JhZGllbnRVbml0cyIsaGFuZ2luZzowLGhvcml6QWR2WDoiaG9yaXotYWR2LXgiLGhvcml6 T3JpZ2luWDoiaG9yaXotb3JpZ2luLXgiLGlkZW9ncmFwaGljOjAsaW1hZ2VSZW5kZXJpbmc6Imlt YWdlLXJlbmRlcmluZyIsaW46MCxpbjI6MCxpbnRlcmNlcHQ6MCxrOjAsazE6MCxrMjowLGszOjAs azQ6MCxrZXJuZWxNYXRyaXg6Imtlcm5lbE1hdHJpeCIsa2VybmVsVW5pdExlbmd0aDoia2VybmVs VW5pdExlbmd0aCIsa2VybmluZzowLGtleVBvaW50czoia2V5UG9pbnRzIixrZXlTcGxpbmVzOiJr ZXlTcGxpbmVzIixrZXlUaW1lczoia2V5VGltZXMiLGxlbmd0aEFkanVzdDoibGVuZ3RoQWRqdXN0 IixsZXR0ZXJTcGFjaW5nOiJsZXR0ZXItc3BhY2luZyIsbGlnaHRpbmdDb2xvcjoibGlnaHRpbmct Y29sb3IiLGxpbWl0aW5nQ29uZUFuZ2xlOiJsaW1pdGluZ0NvbmVBbmdsZSIsbG9jYWw6MCxtYXJr ZXJFbmQ6Im1hcmtlci1lbmQiLG1hcmtlck1pZDoibWFya2VyLW1pZCIsbWFya2VyU3RhcnQ6Im1h cmtlci1zdGFydCIsbWFya2VySGVpZ2h0OiJtYXJrZXJIZWlnaHQiLG1hcmtlclVuaXRzOiJtYXJr ZXJVbml0cyIsbWFya2VyV2lkdGg6Im1hcmtlcldpZHRoIixtYXNrOjAsbWFza0NvbnRlbnRVbml0 czoibWFza0NvbnRlbnRVbml0cyIsbWFza1VuaXRzOiJtYXNrVW5pdHMiLG1hdGhlbWF0aWNhbDow LG1vZGU6MCxudW1PY3RhdmVzOiJudW1PY3RhdmVzIixvZmZzZXQ6MCxvcGFjaXR5OjAsb3BlcmF0 b3I6MCxvcmRlcjowLG9yaWVudDowLG9yaWVudGF0aW9uOjAsb3JpZ2luOjAsb3ZlcmZsb3c6MCxv dmVybGluZVBvc2l0aW9uOiJvdmVybGluZS1wb3NpdGlvbiIsb3ZlcmxpbmVUaGlja25lc3M6Im92 ZXJsaW5lLXRoaWNrbmVzcyIscGFpbnRPcmRlcjoicGFpbnQtb3JkZXIiLHBhbm9zZTE6InBhbm9z ZS0xIixwYXRoTGVuZ3RoOiJwYXRoTGVuZ3RoIixwYXR0ZXJuQ29udGVudFVuaXRzOiJwYXR0ZXJu Q29udGVudFVuaXRzIixwYXR0ZXJuVHJhbnNmb3JtOiJwYXR0ZXJuVHJhbnNmb3JtIixwYXR0ZXJu VW5pdHM6InBhdHRlcm5Vbml0cyIscG9pbnRlckV2ZW50czoicG9pbnRlci1ldmVudHMiLHBvaW50 czowLHBvaW50c0F0WDoicG9pbnRzQXRYIixwb2ludHNBdFk6InBvaW50c0F0WSIscG9pbnRzQXRa OiJwb2ludHNBdFoiLHByZXNlcnZlQWxwaGE6InByZXNlcnZlQWxwaGEiLHByZXNlcnZlQXNwZWN0 UmF0aW86InByZXNlcnZlQXNwZWN0UmF0aW8iLHByaW1pdGl2ZVVuaXRzOiJwcmltaXRpdmVVbml0 cyIscjowLHJhZGl1czowLHJlZlg6InJlZlgiLHJlZlk6InJlZlkiLHJlbmRlcmluZ0ludGVudDoi cmVuZGVyaW5nLWludGVudCIscmVwZWF0Q291bnQ6InJlcGVhdENvdW50IixyZXBlYXREdXI6InJl cGVhdER1ciIscmVxdWlyZWRFeHRlbnNpb25zOiJyZXF1aXJlZEV4dGVuc2lvbnMiLHJlcXVpcmVk RmVhdHVyZXM6InJlcXVpcmVkRmVhdHVyZXMiLHJlc3RhcnQ6MCxyZXN1bHQ6MCxyb3RhdGU6MCxy eDowLHJ5OjAsc2NhbGU6MCxzZWVkOjAsc2hhcGVSZW5kZXJpbmc6InNoYXBlLXJlbmRlcmluZyIs c2xvcGU6MCxzcGFjaW5nOjAsc3BlY3VsYXJDb25zdGFudDoic3BlY3VsYXJDb25zdGFudCIsc3Bl Y3VsYXJFeHBvbmVudDoic3BlY3VsYXJFeHBvbmVudCIsc3BlZWQ6MCxzcHJlYWRNZXRob2Q6InNw cmVhZE1ldGhvZCIsc3RhcnRPZmZzZXQ6InN0YXJ0T2Zmc2V0IixzdGREZXZpYXRpb246InN0ZERl dmlhdGlvbiIsc3RlbWg6MCxzdGVtdjowLHN0aXRjaFRpbGVzOiJzdGl0Y2hUaWxlcyIsc3RvcENv bG9yOiJzdG9wLWNvbG9yIixzdG9wT3BhY2l0eToic3RvcC1vcGFjaXR5IixzdHJpa2V0aHJvdWdo UG9zaXRpb246InN0cmlrZXRocm91Z2gtcG9zaXRpb24iLHN0cmlrZXRocm91Z2hUaGlja25lc3M6 InN0cmlrZXRocm91Z2gtdGhpY2tuZXNzIixzdHJpbmc6MCxzdHJva2U6MCxzdHJva2VEYXNoYXJy YXk6InN0cm9rZS1kYXNoYXJyYXkiLHN0cm9rZURhc2hvZmZzZXQ6InN0cm9rZS1kYXNob2Zmc2V0 IixzdHJva2VMaW5lY2FwOiJzdHJva2UtbGluZWNhcCIsc3Ryb2tlTGluZWpvaW46InN0cm9rZS1s aW5lam9pbiIsc3Ryb2tlTWl0ZXJsaW1pdDoic3Ryb2tlLW1pdGVybGltaXQiLHN0cm9rZU9wYWNp dHk6InN0cm9rZS1vcGFjaXR5IixzdHJva2VXaWR0aDoic3Ryb2tlLXdpZHRoIixzdXJmYWNlU2Nh bGU6InN1cmZhY2VTY2FsZSIsc3lzdGVtTGFuZ3VhZ2U6InN5c3RlbUxhbmd1YWdlIix0YWJsZVZh bHVlczoidGFibGVWYWx1ZXMiLHRhcmdldFg6InRhcmdldFgiLHRhcmdldFk6InRhcmdldFkiLHRl eHRBbmNob3I6InRleHQtYW5jaG9yIix0ZXh0RGVjb3JhdGlvbjoidGV4dC1kZWNvcmF0aW9uIix0 ZXh0UmVuZGVyaW5nOiJ0ZXh0LXJlbmRlcmluZyIsdGV4dExlbmd0aDoidGV4dExlbmd0aCIsdG86 MCx0cmFuc2Zvcm06MCx1MTowLHUyOjAsdW5kZXJsaW5lUG9zaXRpb246InVuZGVybGluZS1wb3Np dGlvbiIsdW5kZXJsaW5lVGhpY2tuZXNzOiJ1bmRlcmxpbmUtdGhpY2tuZXNzIix1bmljb2RlOjAs dW5pY29kZUJpZGk6InVuaWNvZGUtYmlkaSIsdW5pY29kZVJhbmdlOiJ1bmljb2RlLXJhbmdlIix1 bml0c1BlckVtOiJ1bml0cy1wZXItZW0iLHZBbHBoYWJldGljOiJ2LWFscGhhYmV0aWMiLHZIYW5n aW5nOiJ2LWhhbmdpbmciLHZJZGVvZ3JhcGhpYzoidi1pZGVvZ3JhcGhpYyIsdk1hdGhlbWF0aWNh bDoidi1tYXRoZW1hdGljYWwiLHZhbHVlczowLHZlY3RvckVmZmVjdDoidmVjdG9yLWVmZmVjdCIs dmVyc2lvbjowLHZlcnRBZHZZOiJ2ZXJ0LWFkdi15Iix2ZXJ0T3JpZ2luWDoidmVydC1vcmlnaW4t eCIsdmVydE9yaWdpblk6InZlcnQtb3JpZ2luLXkiLHZpZXdCb3g6InZpZXdCb3giLHZpZXdUYXJn ZXQ6InZpZXdUYXJnZXQiLHZpc2liaWxpdHk6MCx3aWR0aHM6MCx3b3JkU3BhY2luZzoid29yZC1z cGFjaW5nIix3cml0aW5nTW9kZToid3JpdGluZy1tb2RlIix4OjAseEhlaWdodDoieC1oZWlnaHQi LHgxOjAseDI6MCx4Q2hhbm5lbFNlbGVjdG9yOiJ4Q2hhbm5lbFNlbGVjdG9yIix4bGlua0FjdHVh dGU6InhsaW5rOmFjdHVhdGUiLHhsaW5rQXJjcm9sZToieGxpbms6YXJjcm9sZSIseGxpbmtIcmVm OiJ4bGluazpocmVmIix4bGlua1JvbGU6InhsaW5rOnJvbGUiLHhsaW5rU2hvdzoieGxpbms6c2hv dyIseGxpbmtUaXRsZToieGxpbms6dGl0bGUiLHhsaW5rVHlwZToieGxpbms6dHlwZSIseG1sQmFz ZToieG1sOmJhc2UiLHhtbG5zOjAseG1sbnNYbGluazoieG1sbnM6eGxpbmsiLHhtbExhbmc6Inht bDpsYW5nIix4bWxTcGFjZToieG1sOnNwYWNlIix5OjAseTE6MCx5MjowLHlDaGFubmVsU2VsZWN0 b3I6InlDaGFubmVsU2VsZWN0b3IiLHo6MCx6b29tQW5kUGFuOiJ6b29tQW5kUGFuIn0saT17UHJv cGVydGllczp7fSxET01BdHRyaWJ1dGVOYW1lc3BhY2VzOnt4bGlua0FjdHVhdGU6ci54bGluayx4 bGlua0FyY3JvbGU6ci54bGluayx4bGlua0hyZWY6ci54bGluayx4bGlua1JvbGU6ci54bGluayx4 bGlua1Nob3c6ci54bGluayx4bGlua1RpdGxlOnIueGxpbmsseGxpbmtUeXBlOnIueGxpbmsseG1s QmFzZTpyLnhtbCx4bWxMYW5nOnIueG1sLHhtbFNwYWNlOnIueG1sfSxET01BdHRyaWJ1dGVOYW1l czp7fX07T2JqZWN0LmtleXMobykuZm9yRWFjaChmdW5jdGlvbihlKXtpLlByb3BlcnRpZXNbZV09 MCxvW2VdJiYoaS5ET01BdHRyaWJ1dGVOYW1lc1tlXT1vW2VdKX0pLHQuZXhwb3J0cz1pfSx7fV0s NzQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtpZigic2VsZWN0 aW9uU3RhcnQiaW4gZSYmdS5oYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMoZSkpcmV0dXJue3N0YXJ0 OmUuc2VsZWN0aW9uU3RhcnQsZW5kOmUuc2VsZWN0aW9uRW5kfTtpZih3aW5kb3cuZ2V0U2VsZWN0 aW9uKXt2YXIgdD13aW5kb3cuZ2V0U2VsZWN0aW9uKCk7cmV0dXJue2FuY2hvck5vZGU6dC5hbmNo b3JOb2RlLGFuY2hvck9mZnNldDp0LmFuY2hvck9mZnNldCxmb2N1c05vZGU6dC5mb2N1c05vZGUs Zm9jdXNPZmZzZXQ6dC5mb2N1c09mZnNldH19aWYoZG9jdW1lbnQuc2VsZWN0aW9uKXt2YXIgbj1k b2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTtyZXR1cm57cGFyZW50RWxlbWVudDpuLnBh cmVudEVsZW1lbnQoKSx0ZXh0Om4udGV4dCx0b3A6bi5ib3VuZGluZ1RvcCxsZWZ0Om4uYm91bmRp bmdMZWZ0fX19ZnVuY3Rpb24gbyhlLHQpe2lmKHl8fG51bGw9PXZ8fHYhPT1jKCkpcmV0dXJuIG51 bGw7dmFyIG49cih2KTtpZighZ3x8IWQoZyxuKSl7Zz1uO3ZhciBvPWwuZ2V0UG9vbGVkKGguc2Vs ZWN0LG0sZSx0KTtyZXR1cm4gby50eXBlPSJzZWxlY3QiLG8udGFyZ2V0PXYsaS5hY2N1bXVsYXRl VHdvUGhhc2VEaXNwYXRjaGVzKG8pLG99cmV0dXJuIG51bGx9dmFyIGk9ZSgxOSksYT1lKDEyMCks cz1lKDMyKSx1PWUoNTUpLGw9ZSg4MCksYz1lKDEyOSkscD1lKDEwOSksZD1lKDEzOCksZj1hLmNh blVzZURPTSYmImRvY3VtZW50TW9kZSJpbiBkb2N1bWVudCYmZG9jdW1lbnQuZG9jdW1lbnRNb2Rl PD0xMSxoPXtzZWxlY3Q6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOiJvblNlbGVj dCIsY2FwdHVyZWQ6Im9uU2VsZWN0Q2FwdHVyZSJ9LGRlcGVuZGVuY2llczpbInRvcEJsdXIiLCJ0 b3BDb250ZXh0TWVudSIsInRvcEZvY3VzIiwidG9wS2V5RG93biIsInRvcEtleVVwIiwidG9wTW91 c2VEb3duIiwidG9wTW91c2VVcCIsInRvcFNlbGVjdGlvbkNoYW5nZSJdfX0sdj1udWxsLG09bnVs bCxnPW51bGwseT0hMSxDPSExLF89e2V2ZW50VHlwZXM6aCxleHRyYWN0RXZlbnRzOmZ1bmN0aW9u KGUsdCxuLHIpe2lmKCFDKXJldHVybiBudWxsO3ZhciBpPXQ/cy5nZXROb2RlRnJvbUluc3RhbmNl KHQpOndpbmRvdztzd2l0Y2goZSl7Y2FzZSJ0b3BGb2N1cyI6KHAoaSl8fCJ0cnVlIj09PWkuY29u dGVudEVkaXRhYmxlKSYmKHY9aSxtPXQsZz1udWxsKTticmVhaztjYXNlInRvcEJsdXIiOnY9bnVs bCxtPW51bGwsZz1udWxsO2JyZWFrO2Nhc2UidG9wTW91c2VEb3duIjp5PSEwO2JyZWFrO2Nhc2Ui dG9wQ29udGV4dE1lbnUiOmNhc2UidG9wTW91c2VVcCI6cmV0dXJuIHk9ITEsbyhuLHIpO2Nhc2Ui dG9wU2VsZWN0aW9uQ2hhbmdlIjppZihmKWJyZWFrO2Nhc2UidG9wS2V5RG93biI6Y2FzZSJ0b3BL ZXlVcCI6cmV0dXJuIG8obixyKX1yZXR1cm4gbnVsbH0sZGlkUHV0TGlzdGVuZXI6ZnVuY3Rpb24o ZSx0LG4peyJvblNlbGVjdCI9PT10JiYoQz0hMCl9fTt0LmV4cG9ydHM9X30sezEwOToxMDksMTIw OjEyMCwxMjk6MTI5LDEzODoxMzgsMTk6MTksMzI6MzIsNTU6NTUsODA6ODB9XSw3NTpbZnVuY3Rp b24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiIuIitlLl9yb290Tm9k ZUlEfWZ1bmN0aW9uIG8oZSl7cmV0dXJuImJ1dHRvbiI9PT1lfHwiaW5wdXQiPT09ZXx8InNlbGVj dCI9PT1lfHwidGV4dGFyZWEiPT09ZX12YXIgaT1lKDExMSksYT1lKDExOSkscz1lKDE5KSx1PWUo MzIpLGw9ZSg3NiksYz1lKDc3KSxwPWUoODApLGQ9ZSg4MSksZj1lKDgzKSxoPWUoODQpLHY9ZSg3 OSksbT1lKDg1KSxnPWUoODYpLHk9ZSg4NyksQz1lKDg4KSxfPWUoMTI2KSxiPWUoOTgpLEU9KGUo MTM0KSx7fSkseD17fTtbImFib3J0IiwiYW5pbWF0aW9uRW5kIiwiYW5pbWF0aW9uSXRlcmF0aW9u IiwiYW5pbWF0aW9uU3RhcnQiLCJibHVyIiwiY2FuUGxheSIsImNhblBsYXlUaHJvdWdoIiwiY2xp Y2siLCJjb250ZXh0TWVudSIsImNvcHkiLCJjdXQiLCJkb3VibGVDbGljayIsImRyYWciLCJkcmFn RW5kIiwiZHJhZ0VudGVyIiwiZHJhZ0V4aXQiLCJkcmFnTGVhdmUiLCJkcmFnT3ZlciIsImRyYWdT dGFydCIsImRyb3AiLCJkdXJhdGlvbkNoYW5nZSIsImVtcHRpZWQiLCJlbmNyeXB0ZWQiLCJlbmRl ZCIsImVycm9yIiwiZm9jdXMiLCJpbnB1dCIsImludmFsaWQiLCJrZXlEb3duIiwia2V5UHJlc3Mi LCJrZXlVcCIsImxvYWQiLCJsb2FkZWREYXRhIiwibG9hZGVkTWV0YWRhdGEiLCJsb2FkU3RhcnQi LCJtb3VzZURvd24iLCJtb3VzZU1vdmUiLCJtb3VzZU91dCIsIm1vdXNlT3ZlciIsIm1vdXNlVXAi LCJwYXN0ZSIsInBhdXNlIiwicGxheSIsInBsYXlpbmciLCJwcm9ncmVzcyIsInJhdGVDaGFuZ2Ui LCJyZXNldCIsInNjcm9sbCIsInNlZWtlZCIsInNlZWtpbmciLCJzdGFsbGVkIiwic3VibWl0Iiwi c3VzcGVuZCIsInRpbWVVcGRhdGUiLCJ0b3VjaENhbmNlbCIsInRvdWNoRW5kIiwidG91Y2hNb3Zl IiwidG91Y2hTdGFydCIsInRyYW5zaXRpb25FbmQiLCJ2b2x1bWVDaGFuZ2UiLCJ3YWl0aW5nIiwi d2hlZWwiXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0udG9VcHBlckNhc2UoKStlLnNs aWNlKDEpLG49Im9uIit0LHI9InRvcCIrdCxvPXtwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnVi YmxlZDpuLGNhcHR1cmVkOm4rIkNhcHR1cmUifSxkZXBlbmRlbmNpZXM6W3JdfTtFW2VdPW8seFty XT1vfSk7dmFyIHc9e30saz17ZXZlbnRUeXBlczpFLGV4dHJhY3RFdmVudHM6ZnVuY3Rpb24oZSx0 LG4scil7dmFyIG89eFtlXTtpZighbylyZXR1cm4gbnVsbDt2YXIgYTtzd2l0Y2goZSl7Y2FzZSJ0 b3BBYm9ydCI6Y2FzZSJ0b3BDYW5QbGF5IjpjYXNlInRvcENhblBsYXlUaHJvdWdoIjpjYXNlInRv cER1cmF0aW9uQ2hhbmdlIjpjYXNlInRvcEVtcHRpZWQiOmNhc2UidG9wRW5jcnlwdGVkIjpjYXNl InRvcEVuZGVkIjpjYXNlInRvcEVycm9yIjpjYXNlInRvcElucHV0IjpjYXNlInRvcEludmFsaWQi OmNhc2UidG9wTG9hZCI6Y2FzZSJ0b3BMb2FkZWREYXRhIjpjYXNlInRvcExvYWRlZE1ldGFkYXRh IjpjYXNlInRvcExvYWRTdGFydCI6Y2FzZSJ0b3BQYXVzZSI6Y2FzZSJ0b3BQbGF5IjpjYXNlInRv cFBsYXlpbmciOmNhc2UidG9wUHJvZ3Jlc3MiOmNhc2UidG9wUmF0ZUNoYW5nZSI6Y2FzZSJ0b3BS ZXNldCI6Y2FzZSJ0b3BTZWVrZWQiOmNhc2UidG9wU2Vla2luZyI6Y2FzZSJ0b3BTdGFsbGVkIjpj YXNlInRvcFN1Ym1pdCI6Y2FzZSJ0b3BTdXNwZW5kIjpjYXNlInRvcFRpbWVVcGRhdGUiOmNhc2Ui dG9wVm9sdW1lQ2hhbmdlIjpjYXNlInRvcFdhaXRpbmciOmE9cDticmVhaztjYXNlInRvcEtleVBy ZXNzIjppZigwPT09YihuKSlyZXR1cm4gbnVsbDtjYXNlInRvcEtleURvd24iOmNhc2UidG9wS2V5 VXAiOmE9ZjticmVhaztjYXNlInRvcEJsdXIiOmNhc2UidG9wRm9jdXMiOmE9ZDticmVhaztjYXNl InRvcENsaWNrIjppZigyPT09bi5idXR0b24pcmV0dXJuIG51bGw7Y2FzZSJ0b3BEb3VibGVDbGlj ayI6Y2FzZSJ0b3BNb3VzZURvd24iOmNhc2UidG9wTW91c2VNb3ZlIjpjYXNlInRvcE1vdXNlVXAi OmNhc2UidG9wTW91c2VPdXQiOmNhc2UidG9wTW91c2VPdmVyIjpjYXNlInRvcENvbnRleHRNZW51 IjphPWg7YnJlYWs7Y2FzZSJ0b3BEcmFnIjpjYXNlInRvcERyYWdFbmQiOmNhc2UidG9wRHJhZ0Vu dGVyIjpjYXNlInRvcERyYWdFeGl0IjpjYXNlInRvcERyYWdMZWF2ZSI6Y2FzZSJ0b3BEcmFnT3Zl ciI6Y2FzZSJ0b3BEcmFnU3RhcnQiOmNhc2UidG9wRHJvcCI6YT12O2JyZWFrO2Nhc2UidG9wVG91 Y2hDYW5jZWwiOmNhc2UidG9wVG91Y2hFbmQiOmNhc2UidG9wVG91Y2hNb3ZlIjpjYXNlInRvcFRv dWNoU3RhcnQiOmE9bTticmVhaztjYXNlInRvcEFuaW1hdGlvbkVuZCI6Y2FzZSJ0b3BBbmltYXRp b25JdGVyYXRpb24iOmNhc2UidG9wQW5pbWF0aW9uU3RhcnQiOmE9bDticmVhaztjYXNlInRvcFRy YW5zaXRpb25FbmQiOmE9ZzticmVhaztjYXNlInRvcFNjcm9sbCI6YT15O2JyZWFrO2Nhc2UidG9w V2hlZWwiOmE9QzticmVhaztjYXNlInRvcENvcHkiOmNhc2UidG9wQ3V0IjpjYXNlInRvcFBhc3Rl IjphPWN9YT92b2lkIDA6aSgiODYiLGUpO3ZhciB1PWEuZ2V0UG9vbGVkKG8sdCxuLHIpO3JldHVy biBzLmFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXModSksdX0sZGlkUHV0TGlzdGVuZXI6ZnVu Y3Rpb24oZSx0LG4pe2lmKCJvbkNsaWNrIj09PXQmJiFvKGUuX3RhZykpe3ZhciBpPXIoZSkscz11 LmdldE5vZGVGcm9tSW5zdGFuY2UoZSk7d1tpXXx8KHdbaV09YS5saXN0ZW4ocywiY2xpY2siLF8p KX19LHdpbGxEZWxldGVMaXN0ZW5lcjpmdW5jdGlvbihlLHQpe2lmKCJvbkNsaWNrIj09PXQmJiFv KGUuX3RhZykpe3ZhciBuPXIoZSk7d1tuXS5yZW1vdmUoKSxkZWxldGUgd1tuXX19fTt0LmV4cG9y dHM9a30sezExMToxMTEsMTE5OjExOSwxMjY6MTI2LDEzNDoxMzQsMTk6MTksMzI6MzIsNzY6NzYs Nzc6NzcsNzk6NzksODA6ODAsODE6ODEsODM6ODMsODQ6ODQsODU6ODUsODY6ODYsODc6ODcsODg6 ODgsOTg6OTh9XSw3NjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUs dCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDgwKSxpPXthbmltYXRp b25OYW1lOm51bGwsZWxhcHNlZFRpbWU6bnVsbCxwc2V1ZG9FbGVtZW50Om51bGx9O28uYXVnbWVu dENsYXNzKHIsaSksdC5leHBvcnRzPXJ9LHs4MDo4MH1dLDc3OltmdW5jdGlvbihlLHQsbil7InVz ZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4scil7cmV0dXJuIG8uY2FsbCh0aGlzLGUsdCxuLHIp fXZhciBvPWUoODApLGk9e2NsaXBib2FyZERhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuImNsaXBib2Fy ZERhdGEiaW4gZT9lLmNsaXBib2FyZERhdGE6d2luZG93LmNsaXBib2FyZERhdGF9fTtvLmF1Z21l bnRDbGFzcyhyLGkpLHQuZXhwb3J0cz1yfSx7ODA6ODB9XSw3ODpbZnVuY3Rpb24oZSx0LG4peyJ1 c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixy KX12YXIgbz1lKDgwKSxpPXtkYXRhOm51bGx9O28uYXVnbWVudENsYXNzKHIsaSksdC5leHBvcnRz PXJ9LHs4MDo4MH1dLDc5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIo ZSx0LG4scil7cmV0dXJuIG8uY2FsbCh0aGlzLGUsdCxuLHIpfXZhciBvPWUoODQpLGk9e2RhdGFU cmFuc2ZlcjpudWxsfTtvLmF1Z21lbnRDbGFzcyhyLGkpLHQuZXhwb3J0cz1yfSx7ODQ6ODR9XSw4 MDpbZnVuY3Rpb24oZSx0LG4peworInVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4scil7dGhp cy5kaXNwYXRjaENvbmZpZz1lLHRoaXMuX3RhcmdldEluc3Q9dCx0aGlzLm5hdGl2ZUV2ZW50PW47 dmFyIG89dGhpcy5jb25zdHJ1Y3Rvci5JbnRlcmZhY2U7Zm9yKHZhciBpIGluIG8paWYoby5oYXNP d25Qcm9wZXJ0eShpKSl7dmFyIHM9b1tpXTtzP3RoaXNbaV09cyhuKToidGFyZ2V0Ij09PWk/dGhp cy50YXJnZXQ9cjp0aGlzW2ldPW5baV19dmFyIHU9bnVsbCE9bi5kZWZhdWx0UHJldmVudGVkP24u ZGVmYXVsdFByZXZlbnRlZDpuLnJldHVyblZhbHVlPT09ITE7cmV0dXJuIHU/dGhpcy5pc0RlZmF1 bHRQcmV2ZW50ZWQ9YS50aGF0UmV0dXJuc1RydWU6dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9YS50 aGF0UmV0dXJuc0ZhbHNlLHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9YS50aGF0UmV0dXJuc0Zh bHNlLHRoaXN9dmFyIG89ZSgxNDApLGk9ZSgyNCksYT1lKDEyNikscz0oZSgxMzkpLCJmdW5jdGlv biI9PXR5cGVvZiBQcm94eSxbImRpc3BhdGNoQ29uZmlnIiwiX3RhcmdldEluc3QiLCJuYXRpdmVF dmVudCIsImlzRGVmYXVsdFByZXZlbnRlZCIsImlzUHJvcGFnYXRpb25TdG9wcGVkIiwiX2Rpc3Bh dGNoTGlzdGVuZXJzIiwiX2Rpc3BhdGNoSW5zdGFuY2VzIl0pLHU9e3R5cGU6bnVsbCx0YXJnZXQ6 bnVsbCxjdXJyZW50VGFyZ2V0OmEudGhhdFJldHVybnNOdWxsLGV2ZW50UGhhc2U6bnVsbCxidWJi bGVzOm51bGwsY2FuY2VsYWJsZTpudWxsLHRpbWVTdGFtcDpmdW5jdGlvbihlKXtyZXR1cm4gZS50 aW1lU3RhbXB8fERhdGUubm93KCl9LGRlZmF1bHRQcmV2ZW50ZWQ6bnVsbCxpc1RydXN0ZWQ6bnVs bH07byhyLnByb3RvdHlwZSx7cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmRlZmF1bHRQ cmV2ZW50ZWQ9ITA7dmFyIGU9dGhpcy5uYXRpdmVFdmVudDtlJiYoZS5wcmV2ZW50RGVmYXVsdD9l LnByZXZlbnREZWZhdWx0KCk6InVua25vd24iIT10eXBlb2YgZS5yZXR1cm5WYWx1ZSYmKGUucmV0 dXJuVmFsdWU9ITEpLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEudGhhdFJldHVybnNUcnVlKX0s c3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5uYXRpdmVFdmVudDtlJiYoZS5z dG9wUHJvcGFnYXRpb24/ZS5zdG9wUHJvcGFnYXRpb24oKToidW5rbm93biIhPXR5cGVvZiBlLmNh bmNlbEJ1YmJsZSYmKGUuY2FuY2VsQnViYmxlPSEwKSx0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVk PWEudGhhdFJldHVybnNUcnVlKX0scGVyc2lzdDpmdW5jdGlvbigpe3RoaXMuaXNQZXJzaXN0ZW50 PWEudGhhdFJldHVybnNUcnVlfSxpc1BlcnNpc3RlbnQ6YS50aGF0UmV0dXJuc0ZhbHNlLGRlc3Ry dWN0b3I6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmNvbnN0cnVjdG9yLkludGVyZmFjZTtmb3IodmFy IHQgaW4gZSl0aGlzW3RdPW51bGw7Zm9yKHZhciBuPTA7bjxzLmxlbmd0aDtuKyspdGhpc1tzW25d XT1udWxsfX0pLHIuSW50ZXJmYWNlPXUsci5hdWdtZW50Q2xhc3M9ZnVuY3Rpb24oZSx0KXt2YXIg bj10aGlzLHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPW4ucHJvdG90eXBlO3ZhciBhPW5ldyBy O28oYSxlLnByb3RvdHlwZSksZS5wcm90b3R5cGU9YSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1l LGUuSW50ZXJmYWNlPW8oe30sbi5JbnRlcmZhY2UsdCksZS5hdWdtZW50Q2xhc3M9bi5hdWdtZW50 Q2xhc3MsaS5hZGRQb29saW5nVG8oZSxpLmZvdXJBcmd1bWVudFBvb2xlcil9LGkuYWRkUG9vbGlu Z1RvKHIsaS5mb3VyQXJndW1lbnRQb29sZXIpLHQuZXhwb3J0cz1yfSx7MTI2OjEyNiwxMzk6MTM5 LDE0MDoxNDAsMjQ6MjR9XSw4MTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlv biByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDg3KSxpPXty ZWxhdGVkVGFyZ2V0Om51bGx9O28uYXVnbWVudENsYXNzKHIsaSksdC5leHBvcnRzPXJ9LHs4Nzo4 N31dLDgyOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4scil7 cmV0dXJuIG8uY2FsbCh0aGlzLGUsdCxuLHIpfXZhciBvPWUoODApLGk9e2RhdGE6bnVsbH07by5h dWdtZW50Q2xhc3MocixpKSx0LmV4cG9ydHM9cn0sezgwOjgwfV0sODM6W2Z1bmN0aW9uKGUsdCxu KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbixyKXtyZXR1cm4gby5jYWxsKHRoaXMsZSx0 LG4scil9dmFyIG89ZSg4NyksaT1lKDk4KSxhPWUoOTkpLHM9ZSgxMDApLHU9e2tleTphLGxvY2F0 aW9uOm51bGwsY3RybEtleTpudWxsLHNoaWZ0S2V5Om51bGwsYWx0S2V5Om51bGwsbWV0YUtleTpu dWxsLHJlcGVhdDpudWxsLGxvY2FsZTpudWxsLGdldE1vZGlmaWVyU3RhdGU6cyxjaGFyQ29kZTpm dW5jdGlvbihlKXtyZXR1cm4ia2V5cHJlc3MiPT09ZS50eXBlP2koZSk6MH0sa2V5Q29kZTpmdW5j dGlvbihlKXtyZXR1cm4ia2V5ZG93biI9PT1lLnR5cGV8fCJrZXl1cCI9PT1lLnR5cGU/ZS5rZXlD b2RlOjB9LHdoaWNoOmZ1bmN0aW9uKGUpe3JldHVybiJrZXlwcmVzcyI9PT1lLnR5cGU/aShlKToi a2V5ZG93biI9PT1lLnR5cGV8fCJrZXl1cCI9PT1lLnR5cGU/ZS5rZXlDb2RlOjB9fTtvLmF1Z21l bnRDbGFzcyhyLHUpLHQuZXhwb3J0cz1yfSx7MTAwOjEwMCw4Nzo4Nyw5ODo5OCw5OTo5OX1dLDg0 OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4scil7cmV0dXJu IG8uY2FsbCh0aGlzLGUsdCxuLHIpfXZhciBvPWUoODcpLGk9ZSg5MCksYT1lKDEwMCkscz17c2Ny ZWVuWDpudWxsLHNjcmVlblk6bnVsbCxjbGllbnRYOm51bGwsY2xpZW50WTpudWxsLGN0cmxLZXk6 bnVsbCxzaGlmdEtleTpudWxsLGFsdEtleTpudWxsLG1ldGFLZXk6bnVsbCxnZXRNb2RpZmllclN0 YXRlOmEsYnV0dG9uOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYnV0dG9uO3JldHVybiJ3aGljaCJpbiBl P3Q6Mj09PXQ/Mjo0PT09dD8xOjB9LGJ1dHRvbnM6bnVsbCxyZWxhdGVkVGFyZ2V0OmZ1bmN0aW9u KGUpe3JldHVybiBlLnJlbGF0ZWRUYXJnZXR8fChlLmZyb21FbGVtZW50PT09ZS5zcmNFbGVtZW50 P2UudG9FbGVtZW50OmUuZnJvbUVsZW1lbnQpfSxwYWdlWDpmdW5jdGlvbihlKXtyZXR1cm4icGFn ZVgiaW4gZT9lLnBhZ2VYOmUuY2xpZW50WCtpLmN1cnJlbnRTY3JvbGxMZWZ0fSxwYWdlWTpmdW5j dGlvbihlKXtyZXR1cm4icGFnZVkiaW4gZT9lLnBhZ2VZOmUuY2xpZW50WStpLmN1cnJlbnRTY3Jv bGxUb3B9fTtvLmF1Z21lbnRDbGFzcyhyLHMpLHQuZXhwb3J0cz1yfSx7MTAwOjEwMCw4Nzo4Nyw5 MDo5MH1dLDg1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4s cil7cmV0dXJuIG8uY2FsbCh0aGlzLGUsdCxuLHIpfXZhciBvPWUoODcpLGk9ZSgxMDApLGE9e3Rv dWNoZXM6bnVsbCx0YXJnZXRUb3VjaGVzOm51bGwsY2hhbmdlZFRvdWNoZXM6bnVsbCxhbHRLZXk6 bnVsbCxtZXRhS2V5Om51bGwsY3RybEtleTpudWxsLHNoaWZ0S2V5Om51bGwsZ2V0TW9kaWZpZXJT dGF0ZTppfTtvLmF1Z21lbnRDbGFzcyhyLGEpLHQuZXhwb3J0cz1yfSx7MTAwOjEwMCw4Nzo4N31d LDg2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4scil7cmV0 dXJuIG8uY2FsbCh0aGlzLGUsdCxuLHIpfXZhciBvPWUoODApLGk9e3Byb3BlcnR5TmFtZTpudWxs LGVsYXBzZWRUaW1lOm51bGwscHNldWRvRWxlbWVudDpudWxsfTtvLmF1Z21lbnRDbGFzcyhyLGkp LHQuZXhwb3J0cz1yfSx7ODA6ODB9XSw4NzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijtm dW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDgw KSxpPWUoMTAxKSxhPXt2aWV3OmZ1bmN0aW9uKGUpe2lmKGUudmlldylyZXR1cm4gZS52aWV3O3Zh ciB0PWkoZSk7aWYodC53aW5kb3c9PT10KXJldHVybiB0O3ZhciBuPXQub3duZXJEb2N1bWVudDty ZXR1cm4gbj9uLmRlZmF1bHRWaWV3fHxuLnBhcmVudFdpbmRvdzp3aW5kb3d9LGRldGFpbDpmdW5j dGlvbihlKXtyZXR1cm4gZS5kZXRhaWx8fDB9fTtvLmF1Z21lbnRDbGFzcyhyLGEpLHQuZXhwb3J0 cz1yfSx7MTAxOjEwMSw4MDo4MH1dLDg4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1 bmN0aW9uIHIoZSx0LG4scil7cmV0dXJuIG8uY2FsbCh0aGlzLGUsdCxuLHIpfXZhciBvPWUoODQp LGk9e2RlbHRhWDpmdW5jdGlvbihlKXtyZXR1cm4iZGVsdGFYImluIGU/ZS5kZWx0YVg6IndoZWVs RGVsdGFYImluIGU/LWUud2hlZWxEZWx0YVg6MH0sZGVsdGFZOmZ1bmN0aW9uKGUpe3JldHVybiJk ZWx0YVkiaW4gZT9lLmRlbHRhWToid2hlZWxEZWx0YVkiaW4gZT8tZS53aGVlbERlbHRhWToid2hl ZWxEZWx0YSJpbiBlPy1lLndoZWVsRGVsdGE6MH0sZGVsdGFaOm51bGwsZGVsdGFNb2RlOm51bGx9 O28uYXVnbWVudENsYXNzKHIsaSksdC5leHBvcnRzPXJ9LHs4NDo4NH1dLDg5OltmdW5jdGlvbihl LHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTExKSxvPShlKDEzNCkse30pLGk9e3JlaW5pdGlh bGl6ZVRyYW5zYWN0aW9uOmZ1bmN0aW9uKCl7dGhpcy50cmFuc2FjdGlvbldyYXBwZXJzPXRoaXMu Z2V0VHJhbnNhY3Rpb25XcmFwcGVycygpLHRoaXMud3JhcHBlckluaXREYXRhP3RoaXMud3JhcHBl ckluaXREYXRhLmxlbmd0aD0wOnRoaXMud3JhcHBlckluaXREYXRhPVtdLHRoaXMuX2lzSW5UcmFu c2FjdGlvbj0hMX0sX2lzSW5UcmFuc2FjdGlvbjohMSxnZXRUcmFuc2FjdGlvbldyYXBwZXJzOm51 bGwsaXNJblRyYW5zYWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLl9pc0luVHJhbnNhY3Rp b259LHBlcmZvcm06ZnVuY3Rpb24oZSx0LG4sbyxpLGEscyx1KXt0aGlzLmlzSW5UcmFuc2FjdGlv bigpP3IoIjI3Iik6dm9pZCAwO3ZhciBsLGM7dHJ5e3RoaXMuX2lzSW5UcmFuc2FjdGlvbj0hMCxs PSEwLHRoaXMuaW5pdGlhbGl6ZUFsbCgwKSxjPWUuY2FsbCh0LG4sbyxpLGEscyx1KSxsPSExfWZp bmFsbHl7dHJ5e2lmKGwpdHJ5e3RoaXMuY2xvc2VBbGwoMCl9Y2F0Y2goZSl7fWVsc2UgdGhpcy5j bG9zZUFsbCgwKX1maW5hbGx5e3RoaXMuX2lzSW5UcmFuc2FjdGlvbj0hMX19cmV0dXJuIGN9LGlu aXRpYWxpemVBbGw6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMudHJhbnNhY3Rpb25XcmFwcGVy cyxuPWU7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07dHJ5e3RoaXMud3JhcHBlckluaXREYXRh W25dPW8sdGhpcy53cmFwcGVySW5pdERhdGFbbl09ci5pbml0aWFsaXplP3IuaW5pdGlhbGl6ZS5j YWxsKHRoaXMpOm51bGx9ZmluYWxseXtpZih0aGlzLndyYXBwZXJJbml0RGF0YVtuXT09PW8pdHJ5 e3RoaXMuaW5pdGlhbGl6ZUFsbChuKzEpfWNhdGNoKGUpe319fX0sY2xvc2VBbGw6ZnVuY3Rpb24o ZSl7dGhpcy5pc0luVHJhbnNhY3Rpb24oKT92b2lkIDA6cigiMjgiKTtmb3IodmFyIHQ9dGhpcy50 cmFuc2FjdGlvbldyYXBwZXJzLG49ZTtuPHQubGVuZ3RoO24rKyl7dmFyIGksYT10W25dLHM9dGhp cy53cmFwcGVySW5pdERhdGFbbl07dHJ5e2k9ITAscyE9PW8mJmEuY2xvc2UmJmEuY2xvc2UuY2Fs bCh0aGlzLHMpLGk9ITF9ZmluYWxseXtpZihpKXRyeXt0aGlzLmNsb3NlQWxsKG4rMSl9Y2F0Y2go ZSl7fX19dGhpcy53cmFwcGVySW5pdERhdGEubGVuZ3RoPTB9fTt0LmV4cG9ydHM9aX0sezExMTox MTEsMTM0OjEzNH1dLDkwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXtjdXJy ZW50U2Nyb2xsTGVmdDowLGN1cnJlbnRTY3JvbGxUb3A6MCxyZWZyZXNoU2Nyb2xsVmFsdWVzOmZ1 bmN0aW9uKGUpe3IuY3VycmVudFNjcm9sbExlZnQ9ZS54LHIuY3VycmVudFNjcm9sbFRvcD1lLnl9 fTt0LmV4cG9ydHM9cn0se31dLDkxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0 aW9uIHIoZSx0KXtyZXR1cm4gbnVsbD09dD9vKCIzMCIpOnZvaWQgMCxudWxsPT1lP3Q6QXJyYXku aXNBcnJheShlKT9BcnJheS5pc0FycmF5KHQpPyhlLnB1c2guYXBwbHkoZSx0KSxlKTooZS5wdXNo KHQpLGUpOkFycmF5LmlzQXJyYXkodCk/W2VdLmNvbmNhdCh0KTpbZSx0XX12YXIgbz1lKDExMSk7 ZSgxMzQpO3QuZXhwb3J0cz1yfSx7MTExOjExMSwxMzQ6MTM0fV0sOTI6W2Z1bmN0aW9uKGUsdCxu KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtmb3IodmFyIHQ9MSxuPTAscj0wLGk9ZS5sZW5n dGgsYT1pJi00O3I8YTspe2Zvcih2YXIgcz1NYXRoLm1pbihyKzQwOTYsYSk7cjxzO3IrPTQpbis9 KHQrPWUuY2hhckNvZGVBdChyKSkrKHQrPWUuY2hhckNvZGVBdChyKzEpKSsodCs9ZS5jaGFyQ29k ZUF0KHIrMikpKyh0Kz1lLmNoYXJDb2RlQXQociszKSk7dCU9byxuJT1vfWZvcig7cjxpO3IrKylu Kz10Kz1lLmNoYXJDb2RlQXQocik7cmV0dXJuIHQlPW8sbiU9byx0fG48PDE2fXZhciBvPTY1NTIx O3QuZXhwb3J0cz1yfSx7fV0sOTM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9 ZnVuY3Rpb24oZSl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBNU0FwcCYmTVNBcHAuZXhlY1Vu c2FmZUxvY2FsRnVuY3Rpb24/ZnVuY3Rpb24odCxuLHIsbyl7TVNBcHAuZXhlY1Vuc2FmZUxvY2Fs RnVuY3Rpb24oZnVuY3Rpb24oKXtyZXR1cm4gZSh0LG4scixvKX0pfTplfTt0LmV4cG9ydHM9cn0s e31dLDk0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4pe3Zh ciByPW51bGw9PXR8fCJib29sZWFuIj09dHlwZW9mIHR8fCIiPT09dDtpZihyKXJldHVybiIiO3Zh ciBvPWlzTmFOKHQpO3JldHVybiBvfHwwPT09dHx8aS5oYXNPd25Qcm9wZXJ0eShlKSYmaVtlXT8i Iit0Oigic3RyaW5nIj09dHlwZW9mIHQmJih0PXQudHJpbSgpKSx0KyJweCIpfXZhciBvPWUoNCks aT0oZSgxMzkpLG8uaXNVbml0bGVzc051bWJlcik7dC5leHBvcnRzPXJ9LHsxMzk6MTM5LDQ6NH1d LDk1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dmFyIHQ9IiIr ZSxuPWkuZXhlYyh0KTtpZighbilyZXR1cm4gdDt2YXIgcixvPSIiLGE9MCxzPTA7Zm9yKGE9bi5p bmRleDthPHQubGVuZ3RoO2ErKyl7c3dpdGNoKHQuY2hhckNvZGVBdChhKSl7Y2FzZSAzNDpyPSIm cXVvdDsiO2JyZWFrO2Nhc2UgMzg6cj0iJmFtcDsiO2JyZWFrO2Nhc2UgMzk6cj0iJiN4Mjc7Ijti cmVhaztjYXNlIDYwOnI9IiZsdDsiO2JyZWFrO2Nhc2UgNjI6cj0iJmd0OyI7YnJlYWs7ZGVmYXVs dDpjb250aW51ZX1zIT09YSYmKG8rPXQuc3Vic3RyaW5nKHMsYSkpLHM9YSsxLG8rPXJ9cmV0dXJu IHMhPT1hP28rdC5zdWJzdHJpbmcocyxhKTpvfWZ1bmN0aW9uIG8oZSl7cmV0dXJuImJvb2xlYW4i PT10eXBlb2YgZXx8Im51bWJlciI9PXR5cGVvZiBlPyIiK2U6cihlKX12YXIgaT0vWyInJjw+XS87 dC5leHBvcnRzPW99LHt9XSw5NjpbZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbihuKXsidXNlIHN0 cmljdCI7ZnVuY3Rpb24gcihlLHQsbixyKXtpZihlJiYib2JqZWN0Ij09dHlwZW9mIGUpe3ZhciBv PWUsaT12b2lkIDA9PT1vW25dO2kmJm51bGwhPXQmJihvW25dPXQpfX1mdW5jdGlvbiBvKGUsdCl7 aWYobnVsbD09ZSlyZXR1cm4gZTt2YXIgbj17fTtyZXR1cm4gaShlLHIsbiksbn12YXIgaT0oZSgy MiksZSgxMTUpKTtlKDEzOSk7InVuZGVmaW5lZCIhPXR5cGVvZiBuJiZuLmVudix0LmV4cG9ydHM9 b30pLmNhbGwodGhpcyx2b2lkIDApfSx7MTE1OjExNSwxMzk6MTM5LDIyOjIyfV0sOTc6W2Z1bmN0 aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbil7QXJyYXkuaXNBcnJheShl KT9lLmZvckVhY2godCxuKTplJiZ0LmNhbGwobixlKX10LmV4cG9ydHM9cn0se31dLDk4OltmdW5j dGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dmFyIHQsbj1lLmtleUNvZGU7 cmV0dXJuImNoYXJDb2RlImluIGU/KHQ9ZS5jaGFyQ29kZSwwPT09dCYmMTM9PT1uJiYodD0xMykp OnQ9bix0Pj0zMnx8MTM9PT10P3Q6MH10LmV4cG9ydHM9cn0se31dLDk5OltmdW5jdGlvbihlLHQs bil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7aWYoZS5rZXkpe3ZhciB0PWlbZS5rZXldfHxl LmtleTtpZigiVW5pZGVudGlmaWVkIiE9PXQpcmV0dXJuIHR9aWYoImtleXByZXNzIj09PWUudHlw ZSl7dmFyIG49byhlKTtyZXR1cm4gMTM9PT1uPyJFbnRlciI6U3RyaW5nLmZyb21DaGFyQ29kZShu KX1yZXR1cm4ia2V5ZG93biI9PT1lLnR5cGV8fCJrZXl1cCI9PT1lLnR5cGU/YVtlLmtleUNvZGVd fHwiVW5pZGVudGlmaWVkIjoiIn12YXIgbz1lKDk4KSxpPXtFc2M6IkVzY2FwZSIsU3BhY2ViYXI6 IiAiLExlZnQ6IkFycm93TGVmdCIsVXA6IkFycm93VXAiLFJpZ2h0OiJBcnJvd1JpZ2h0IixEb3du OiJBcnJvd0Rvd24iLERlbDoiRGVsZXRlIixXaW46Ik9TIixNZW51OiJDb250ZXh0TWVudSIsQXBw czoiQ29udGV4dE1lbnUiLFNjcm9sbDoiU2Nyb2xsTG9jayIsTW96UHJpbnRhYmxlS2V5OiJVbmlk ZW50aWZpZWQifSxhPXs4OiJCYWNrc3BhY2UiLDk6IlRhYiIsMTI6IkNsZWFyIiwxMzoiRW50ZXIi LDE2OiJTaGlmdCIsMTc6IkNvbnRyb2wiLDE4OiJBbHQiLDE5OiJQYXVzZSIsMjA6IkNhcHNMb2Nr IiwyNzoiRXNjYXBlIiwzMjoiICIsMzM6IlBhZ2VVcCIsMzQ6IlBhZ2VEb3duIiwzNToiRW5kIiwz NjoiSG9tZSIsMzc6IkFycm93TGVmdCIsMzg6IkFycm93VXAiLDM5OiJBcnJvd1JpZ2h0Iiw0MDoi QXJyb3dEb3duIiw0NToiSW5zZXJ0Iiw0NjoiRGVsZXRlIiwxMTI6IkYxIiwxMTM6IkYyIiwxMTQ6 IkYzIiwxMTU6IkY0IiwxMTY6IkY1IiwxMTc6IkY2IiwxMTg6IkY3IiwxMTk6IkY4IiwxMjA6IkY5 IiwxMjE6IkYxMCIsMTIyOiJGMTEiLDEyMzoiRjEyIiwxNDQ6Ik51bUxvY2siLDE0NToiU2Nyb2xs TG9jayIsMjI0OiJNZXRhIn07dC5leHBvcnRzPXJ9LHs5ODo5OH1dLDEwMDpbZnVuY3Rpb24oZSx0 LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3ZhciB0PXRoaXMsbj10Lm5hdGl2ZUV2ZW50 O2lmKG4uZ2V0TW9kaWZpZXJTdGF0ZSlyZXR1cm4gbi5nZXRNb2RpZmllclN0YXRlKGUpO3ZhciBy PWlbZV07cmV0dXJuISFyJiYhIW5bcl19ZnVuY3Rpb24gbyhlKXtyZXR1cm4gcn12YXIgaT17QWx0 OiJhbHRLZXkiLENvbnRyb2w6ImN0cmxLZXkiLE1ldGE6Im1ldGFLZXkiLFNoaWZ0OiJzaGlmdEtl eSJ9O3QuZXhwb3J0cz1vfSx7fV0sMTAxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1 bmN0aW9uIHIoZSl7dmFyIHQ9ZS50YXJnZXR8fGUuc3JjRWxlbWVudHx8d2luZG93O3JldHVybiB0 LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50JiYodD10LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KSwz PT09dC5ub2RlVHlwZT90LnBhcmVudE5vZGU6dH10LmV4cG9ydHM9cn0se31dLDEwMjpbZnVuY3Rp b24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3ZhciB0PWUmJihvJiZlW29dfHxl W2ldKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdClyZXR1cm4gdH12YXIgbz0iZnVuY3Rpb24iPT10 eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3IsaT0iQEBpdGVyYXRvciI7dC5leHBvcnRzPXJ9 LHt9XSwxMDM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcigpe3JldHVy biBvKyt9dmFyIG89MTt0LmV4cG9ydHM9cn0se31dLDEwNDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ug c3RyaWN0IjtmdW5jdGlvbiByKGUpe2Zvcig7ZSYmZS5maXJzdENoaWxkOyllPWUuZmlyc3RDaGls ZDtyZXR1cm4gZX1mdW5jdGlvbiBvKGUpe2Zvcig7ZTspe2lmKGUubmV4dFNpYmxpbmcpcmV0dXJu IGUubmV4dFNpYmxpbmc7ZT1lLnBhcmVudE5vZGV9fWZ1bmN0aW9uIGkoZSx0KXtmb3IodmFyIG49 cihlKSxpPTAsYT0wO247KXtpZigzPT09bi5ub2RlVHlwZSl7aWYoYT1pK24udGV4dENvbnRlbnQu bGVuZ3RoLGk8PXQmJmE+PXQpcmV0dXJue25vZGU6bixvZmZzZXQ6dC1pfTtpPWF9bj1yKG8obikp fX10LmV4cG9ydHM9aX0se31dLDEwNTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5j dGlvbiByKCl7cmV0dXJuIWkmJm8uY2FuVXNlRE9NJiYoaT0idGV4dENvbnRlbnQiaW4gZG9jdW1l bnQuZG9jdW1lbnRFbGVtZW50PyJ0ZXh0Q29udGVudCI6ImlubmVyVGV4dCIpLGl9dmFyIG89ZSgx MjApLGk9bnVsbDt0LmV4cG9ydHM9cn0sezEyMDoxMjB9XSwxMDY6W2Z1bmN0aW9uKGUsdCxuKXsi dXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3ZhciBuPXt9O3JldHVybiBuW2UudG9Mb3dlckNh c2UoKV09dC50b0xvd2VyQ2FzZSgpLG5bIldlYmtpdCIrZV09IndlYmtpdCIrdCxuWyJNb3oiK2Vd PSJtb3oiK3QsblsibXMiK2VdPSJNUyIrdCxuWyJPIitlXT0ibyIrdC50b0xvd2VyQ2FzZSgpLG59 ZnVuY3Rpb24gbyhlKXtpZihzW2VdKXJldHVybiBzW2VdO2lmKCFhW2VdKXJldHVybiBlO3ZhciB0 PWFbZV07Zm9yKHZhciBuIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShuKSYmbiBpbiB1KXJldHVy biBzW2VdPXRbbl07cmV0dXJuIiJ9dmFyIGk9ZSgxMjApLGE9e2FuaW1hdGlvbmVuZDpyKCJBbmlt YXRpb24iLCJBbmltYXRpb25FbmQiKSxhbmltYXRpb25pdGVyYXRpb246cigiQW5pbWF0aW9uIiwi QW5pbWF0aW9uSXRlcmF0aW9uIiksYW5pbWF0aW9uc3RhcnQ6cigiQW5pbWF0aW9uIiwiQW5pbWF0 aW9uU3RhcnQiKSx0cmFuc2l0aW9uZW5kOnIoIlRyYW5zaXRpb24iLCJUcmFuc2l0aW9uRW5kIil9 LHM9e30sdT17fTtpLmNhblVzZURPTSYmKHU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iiku c3R5bGUsIkFuaW1hdGlvbkV2ZW50ImluIHdpbmRvd3x8KGRlbGV0ZSBhLmFuaW1hdGlvbmVuZC5h bmltYXRpb24sZGVsZXRlIGEuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbixkZWxldGUgYS5h bmltYXRpb25zdGFydC5hbmltYXRpb24pLCJUcmFuc2l0aW9uRXZlbnQiaW4gd2luZG93fHxkZWxl dGUgYS50cmFuc2l0aW9uZW5kLnRyYW5zaXRpb24pLHQuZXhwb3J0cz1vfSx7MTIwOjEyMH1dLDEw NzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe2lmKGUpe3ZhciB0 PWUuZ2V0TmFtZSgpO2lmKHQpcmV0dXJuIiBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgIit0 KyJgLiJ9cmV0dXJuIiJ9ZnVuY3Rpb24gbyhlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYm InVuZGVmaW5lZCIhPXR5cGVvZiBlLnByb3RvdHlwZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUucHJv dG90eXBlLm1vdW50Q29tcG9uZW50JiYiZnVuY3Rpb24iPT10eXBlb2YgZS5wcm90b3R5cGUucmVj ZWl2ZUNvbXBvbmVudH1mdW5jdGlvbiBpKGUsdCl7dmFyIG47aWYobnVsbD09PWV8fGU9PT0hMSlu PWwuY3JlYXRlKGkpO2Vsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiBlKXt2YXIgcz1lLHU9cy50eXBl O2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB1JiYic3RyaW5nIiE9dHlwZW9mIHUpe3ZhciBkPSIiO2Qr PXIocy5fb3duZXIpLGEoIjEzMCIsbnVsbD09dT91OnR5cGVvZiB1LGQpfSJzdHJpbmciPT10eXBl b2Ygcy50eXBlP249Yy5jcmVhdGVJbnRlcm5hbENvbXBvbmVudChzKTpvKHMudHlwZSk/KG49bmV3 IHMudHlwZShzKSxuLmdldEhvc3ROb2RlfHwobi5nZXRIb3N0Tm9kZT1uLmdldE5hdGl2ZU5vZGUp KTpuPW5ldyBwKHMpfWVsc2Uic3RyaW5nIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZT9u PWMuY3JlYXRlSW5zdGFuY2VGb3JUZXh0KGUpOmEoIjEzMSIsdHlwZW9mIGUpO3JldHVybiBuLl9t b3VudEluZGV4PTAsbi5fbW91bnRJbWFnZT1udWxsLG59dmFyIGE9ZSgxMTEpLHM9ZSgxNDApLHU9 ZSgyOSksbD1lKDQ4KSxjPWUoNTMpLHA9KGUoMTAzKSxlKDEzNCksZSgxMzkpLGZ1bmN0aW9uKGUp e3RoaXMuY29uc3RydWN0KGUpfSk7cyhwLnByb3RvdHlwZSx1LHtfaW5zdGFudGlhdGVSZWFjdENv bXBvbmVudDppfSksdC5leHBvcnRzPWl9LHsxMDM6MTAzLDExMToxMTEsMTM0OjEzNCwxMzk6MTM5 LDE0MDoxNDAsMjk6MjksNDg6NDgsNTM6NTN9XSwxMDg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0 cmljdCI7ZnVuY3Rpb24gcihlLHQpe2lmKCFpLmNhblVzZURPTXx8dCYmISgiYWRkRXZlbnRMaXN0 ZW5lciJpbiBkb2N1bWVudCkpcmV0dXJuITE7dmFyIG49Im9uIitlLHI9biBpbiBkb2N1bWVudDtp Zighcil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5zZXRBdHRyaWJ1dGUo biwicmV0dXJuOyIpLHI9ImZ1bmN0aW9uIj09dHlwZW9mIGFbbl19cmV0dXJuIXImJm8mJiJ3aGVl bCI9PT1lJiYocj1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCJFdmVudHMud2hl ZWwiLCIzLjAiKSkscn12YXIgbyxpPWUoMTIwKTtpLmNhblVzZURPTSYmKG89ZG9jdW1lbnQuaW1w bGVtZW50YXRpb24mJmRvY3VtZW50LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUmJmRvY3VtZW50 LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoIiIsIiIpIT09ITApLHQuZXhwb3J0cz1yfSx7MTIw OjEyMH1dLDEwOTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3Zh ciB0PWUmJmUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQi PT09dD8hIW9bZS50eXBlXToidGV4dGFyZWEiPT09dH12YXIgbz17Y29sb3I6ITAsZGF0ZTohMCxk YXRldGltZTohMCwiZGF0ZXRpbWUtbG9jYWwiOiEwLGVtYWlsOiEwLG1vbnRoOiEwLG51bWJlcjoh MCxwYXNzd29yZDohMCxyYW5nZTohMCxzZWFyY2g6ITAsdGVsOiEwLHRleHQ6ITAsdGltZTohMCx1 cmw6ITAsd2VlazohMH07dC5leHBvcnRzPXJ9LHt9XSwxMTA6W2Z1bmN0aW9uKGUsdCxuKXsidXNl IHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4nIicrbyhlKSsnIid9dmFyIG89ZSg5NSk7dC5l eHBvcnRzPXJ9LHs5NTo5NX1dLDExMTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5j dGlvbiByKGUpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLTEsbj0iTWluaWZpZWQgUmVhY3Qg ZXJyb3IgIyIrZSsiOyB2aXNpdCBodHRwOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3Mv ZXJyb3ItZGVjb2Rlci5odG1sP2ludmFyaWFudD0iK2Uscj0wO3I8dDtyKyspbis9IiZhcmdzW109 IitlbmNvZGVVUklDb21wb25lbnQoYXJndW1lbnRzW3IrMV0pO24rPSIgZm9yIHRoZSBmdWxsIG1l c3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVy cm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLiI7dmFyIG89bmV3IEVycm9yKG4p O3Rocm93IG8ubmFtZT0iSW52YXJpYW50IFZpb2xhdGlvbiIsby5mcmFtZXNUb1BvcD0xLG99dC5l eHBvcnRzPXJ9LHt9XSwxMTI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHIsbz1l KDEyMCksaT1lKDEwKSxhPS9eWyBcclxuXHRcZl0vLHM9LzwoIS0tfGxpbmt8bm9zY3JpcHR8bWV0 YXxzY3JpcHR8c3R5bGUpWyBcclxuXHRcZlwvPl0vLHU9ZSg5MyksbD11KGZ1bmN0aW9uKGUsdCl7 aWYoZS5uYW1lc3BhY2VVUkkhPT1pLnN2Z3x8ImlubmVySFRNTCJpbiBlKWUuaW5uZXJIVE1MPXQ7 ZWxzZXtyPXJ8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHIuaW5uZXJIVE1MPSI8c3Zn PiIrdCsiPC9zdmc+Ijtmb3IodmFyIG49ci5maXJzdENoaWxkO24uZmlyc3RDaGlsZDspZS5hcHBl bmRDaGlsZChuLmZpcnN0Q2hpbGQpfX0pO2lmKG8uY2FuVXNlRE9NKXt2YXIgYz1kb2N1bWVudC5j cmVhdGVFbGVtZW50KCJkaXYiKTtjLmlubmVySFRNTD0iICIsIiI9PT1jLmlubmVySFRNTCYmKGw9 ZnVuY3Rpb24oZSx0KXtpZihlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQo ZSxlKSxhLnRlc3QodCl8fCI8Ij09PXRbMF0mJnMudGVzdCh0KSl7ZS5pbm5lckhUTUw9U3RyaW5n LmZyb21DaGFyQ29kZSg2NTI3OSkrdDt2YXIgbj1lLmZpcnN0Q2hpbGQ7MT09PW4uZGF0YS5sZW5n dGg/ZS5yZW1vdmVDaGlsZChuKTpuLmRlbGV0ZURhdGEoMCwxKX1lbHNlIGUuaW5uZXJIVE1MPXR9 KSxjPW51bGx9dC5leHBvcnRzPWx9LHsxMDoxMCwxMjA6MTIwLDkzOjkzfV0sMTEzOltmdW5jdGlv bihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTIwKSxvPWUoOTUpLGk9ZSgxMTIpLGE9ZnVu Y3Rpb24oZSx0KXtpZih0KXt2YXIgbj1lLmZpcnN0Q2hpbGQ7aWYobiYmbj09PWUubGFzdENoaWxk JiYzPT09bi5ub2RlVHlwZSlyZXR1cm4gdm9pZChuLm5vZGVWYWx1ZT10KX1lLnRleHRDb250ZW50 PXR9O3IuY2FuVXNlRE9NJiYoInRleHRDb250ZW50ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVu dHx8KGE9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gMz09PWUubm9kZVR5cGU/dm9pZChlLm5vZGVWYWx1 ZT10KTp2b2lkIGkoZSxvKHQpKX0pKSx0LmV4cG9ydHM9YX0sezExMjoxMTIsMTIwOjEyMCw5NTo5 NX1dLDExNDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7dmFy IG49bnVsbD09PWV8fGU9PT0hMSxyPW51bGw9PT10fHx0PT09ITE7aWYobnx8cilyZXR1cm4gbj09 PXI7dmFyIG89dHlwZW9mIGUsaT10eXBlb2YgdDtyZXR1cm4ic3RyaW5nIj09PW98fCJudW1iZXIi PT09bz8ic3RyaW5nIj09PWl8fCJudW1iZXIiPT09aToib2JqZWN0Ij09PWkmJmUudHlwZT09PXQu dHlwZSYmZS5rZXk9PT10LmtleX10LmV4cG9ydHM9cn0se31dLDExNTpbZnVuY3Rpb24oZSx0LG4p eyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIGUmJiJvYmplY3QiPT10eXBlb2Yg ZSYmbnVsbCE9ZS5rZXk/bC5lc2NhcGUoZS5rZXkpOnQudG9TdHJpbmcoMzYpfWZ1bmN0aW9uIG8o ZSx0LG4saSl7dmFyIGQ9dHlwZW9mIGU7aWYoInVuZGVmaW5lZCIhPT1kJiYiYm9vbGVhbiIhPT1k fHwoZT1udWxsKSxudWxsPT09ZXx8InN0cmluZyI9PT1kfHwibnVtYmVyIj09PWR8fCJvYmplY3Qi PT09ZCYmZS4kJHR5cGVvZj09PXMpcmV0dXJuIG4oaSxlLCIiPT09dD9jK3IoZSwwKTp0KSwxO3Zh ciBmLGgsdj0wLG09IiI9PT10P2M6dCtwO2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciBnPTA7 ZzxlLmxlbmd0aDtnKyspZj1lW2ddLGg9bStyKGYsZyksdis9byhmLGgsbixpKTtlbHNle3ZhciB5 PXUoZSk7aWYoeSl7dmFyIEMsXz15LmNhbGwoZSk7aWYoeSE9PWUuZW50cmllcylmb3IodmFyIGI9 MDshKEM9Xy5uZXh0KCkpLmRvbmU7KWY9Qy52YWx1ZSxoPW0rcihmLGIrKyksdis9byhmLGgsbixp KTtlbHNlIGZvcig7IShDPV8ubmV4dCgpKS5kb25lOyl7dmFyIEU9Qy52YWx1ZTtFJiYoZj1FWzFd LGg9bStsLmVzY2FwZShFWzBdKStwK3IoZiwwKSx2Kz1vKGYsaCxuLGkpKX19ZWxzZSBpZigib2Jq ZWN0Ij09PWQpe3ZhciB4PSIiLHc9U3RyaW5nKGUpO2EoIjMxIiwiW29iamVjdCBPYmplY3RdIj09 PXc/Im9iamVjdCB3aXRoIGtleXMgeyIrT2JqZWN0LmtleXMoZSkuam9pbigiLCAiKSsifSI6dyx4 KX19cmV0dXJuIHZ9ZnVuY3Rpb24gaShlLHQsbil7cmV0dXJuIG51bGw9PWU/MDpvKGUsIiIsdCxu KX12YXIgYT1lKDExMSkscz0oZSgxMTcpLGUoNDcpKSx1PWUoMTAyKSxsPShlKDEzNCksZSgyMikp LGM9KGUoMTM5KSwiLiIpLHA9IjoiO3QuZXhwb3J0cz1pfSx7MTAyOjEwMiwxMTE6MTExLDExNzox MTcsMTM0OjEzNCwxMzk6MTM5LDIyOjIyLDQ3OjQ3fV0sMTE2OltmdW5jdGlvbihlLHQsbil7InVz ZSBzdHJpY3QiO3ZhciByPShlKDE0MCksZSgxMjYpKSxvPShlKDEzOSkscik7dC5leHBvcnRzPW99 LHsxMjY6MTI2LDEzOToxMzksMTQwOjE0MH1dLDExNzpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3Ry aWN0Ijt2YXIgbz1lLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JF X0ZJUkVEO24uZXhwb3J0cz1vLlJlYWN0Q3VycmVudE93bmVyfSx7fV0sMTE4OltmdW5jdGlvbih0 LG4scil7InVzZSBzdHJpY3QiO24uZXhwb3J0cz1lfSx7fV0sMTE5OltmdW5jdGlvbihlLHQsbil7 InVzZSBzdHJpY3QiO3ZhciByPWUoMTI2KSxvPXtsaXN0ZW46ZnVuY3Rpb24oZSx0LG4pe3JldHVy biBlLmFkZEV2ZW50TGlzdGVuZXI/KGUuYWRkRXZlbnRMaXN0ZW5lcih0LG4sITEpLHtyZW1vdmU6 ZnVuY3Rpb24oKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuLCExKX19KTplLmF0dGFjaEV2ZW50 PyhlLmF0dGFjaEV2ZW50KCJvbiIrdCxuKSx7cmVtb3ZlOmZ1bmN0aW9uKCl7ZS5kZXRhY2hFdmVu dCgib24iK3Qsbil9fSk6dm9pZCAwfSxjYXB0dXJlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZS5h ZGRFdmVudExpc3RlbmVyPyhlLmFkZEV2ZW50TGlzdGVuZXIodCxuLCEwKSx7cmVtb3ZlOmZ1bmN0 aW9uKCl7ZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiwhMCl9fSk6e3JlbW92ZTpyfX0scmVnaXN0 ZXJEZWZhdWx0OmZ1bmN0aW9uKCl7fX07dC5leHBvcnRzPW99LHsxMjY6MTI2fV0sMTIwOltmdW5j dGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPSEoInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5k b3d8fCF3aW5kb3cuZG9jdW1lbnR8fCF3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCksbz17 Y2FuVXNlRE9NOnIsY2FuVXNlV29ya2VyczoidW5kZWZpbmVkIiE9dHlwZW9mIFdvcmtlcixjYW5V c2VFdmVudExpc3RlbmVyczpyJiYhKCF3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciYmIXdpbmRvdy5h dHRhY2hFdmVudCksY2FuVXNlVmlld3BvcnQ6ciYmISF3aW5kb3cuc2NyZWVuLGlzSW5Xb3JrZXI6 IXJ9O3QuZXhwb3J0cz1vfSx7fV0sMTIxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1 bmN0aW9uIHIoZSl7cmV0dXJuIGUucmVwbGFjZShvLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQudG9V cHBlckNhc2UoKX0pfXZhciBvPS8tKC4pL2c7dC5leHBvcnRzPXJ9LHt9XSwxMjI6W2Z1bmN0aW9u KGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gbyhlLnJlcGxhY2UoaSwi bXMtIikpfXZhciBvPWUoMTIxKSxpPS9eLW1zLS87dC5leHBvcnRzPXJ9LHsxMjE6MTIxfV0sMTIz OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4hKCFl fHwhdCkmJihlPT09dHx8IW8oZSkmJihvKHQpP3IoZSx0LnBhcmVudE5vZGUpOiJjb250YWlucyJp biBlP2UuY29udGFpbnModCk6ISFlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYhISgxNiZlLmNv bXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpKSkpfXZhciBvPWUoMTM2KTt0LmV4cG9ydHM9cn0sezEz NjoxMzZ9XSwxMjQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt2 YXIgdD1lLmxlbmd0aDtpZihBcnJheS5pc0FycmF5KGUpfHwib2JqZWN0IiE9dHlwZW9mIGUmJiJm dW5jdGlvbiIhPXR5cGVvZiBlP2EoITEpOnZvaWQgMCwibnVtYmVyIiE9dHlwZW9mIHQ/YSghMSk6 dm9pZCAwLDA9PT10fHx0LTEgaW4gZT92b2lkIDA6YSghMSksImZ1bmN0aW9uIj09dHlwZW9mIGUu Y2FsbGVlP2EoITEpOnZvaWQgMCxlLmhhc093blByb3BlcnR5KXRyeXtyZXR1cm4gQXJyYXkucHJv dG90eXBlLnNsaWNlLmNhbGwoZSl9Y2F0Y2goZSl7fWZvcih2YXIgbj1BcnJheSh0KSxyPTA7cjx0 O3IrKyluW3JdPWVbcl07cmV0dXJuIG59ZnVuY3Rpb24gbyhlKXtyZXR1cm4hIWUmJigib2JqZWN0 Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlKSYmImxlbmd0aCJpbiBlJiYhKCJzZXRJ bnRlcnZhbCJpbiBlKSYmIm51bWJlciIhPXR5cGVvZiBlLm5vZGVUeXBlJiYoQXJyYXkuaXNBcnJh eShlKXx8ImNhbGxlZSJpbiBlfHwiaXRlbSJpbiBlKX1mdW5jdGlvbiBpKGUpe3JldHVybiBvKGUp P0FycmF5LmlzQXJyYXkoZSk/ZS5zbGljZSgpOnIoZSk6W2VdfXZhciBhPWUoMTM0KTt0LmV4cG9y dHM9aX0sezEzNDoxMzR9XSwxMjU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rp b24gcihlKXt2YXIgdD1lLm1hdGNoKGMpO3JldHVybiB0JiZ0WzFdLnRvTG93ZXJDYXNlKCl9ZnVu Y3Rpb24gbyhlLHQpe3ZhciBuPWw7bD92b2lkIDA6dSghMSk7dmFyIG89cihlKSxpPW8mJnMobyk7 aWYoaSl7bi5pbm5lckhUTUw9aVsxXStlK2lbMl07Zm9yKHZhciBjPWlbMF07Yy0tOyluPW4ubGFz dENoaWxkfWVsc2Ugbi5pbm5lckhUTUw9ZTt2YXIgcD1uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJz Y3JpcHQiKTtwLmxlbmd0aCYmKHQ/dm9pZCAwOnUoITEpLGEocCkuZm9yRWFjaCh0KSk7Zm9yKHZh ciBkPUFycmF5LmZyb20obi5jaGlsZE5vZGVzKTtuLmxhc3RDaGlsZDspbi5yZW1vdmVDaGlsZChu Lmxhc3RDaGlsZCk7cmV0dXJuIGR9dmFyIGk9ZSgxMjApLGE9ZSgxMjQpLHM9ZSgxMzApLHU9ZSgx MzQpLGw9aS5jYW5Vc2VET00/ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik6bnVsbCxjPS9e XHMqPChcdyspLzt0LmV4cG9ydHM9b30sezEyMDoxMjAsMTI0OjEyNCwxMzA6MTMwLDEzNDoxMzR9 XSwxMjY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4g ZnVuY3Rpb24oKXtyZXR1cm4gZX19dmFyIG89ZnVuY3Rpb24oKXt9O28udGhhdFJldHVybnM9cixv LnRoYXRSZXR1cm5zRmFsc2U9cighMSksby50aGF0UmV0dXJuc1RydWU9cighMCksby50aGF0UmV0 dXJuc051bGw9cihudWxsKSxvLnRoYXRSZXR1cm5zVGhpcz1mdW5jdGlvbigpe3JldHVybiB0aGlz fSxvLnRoYXRSZXR1cm5zQXJndW1lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHQuZXhwb3J0cz1v fSx7fV0sMTI3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXt9O3QuZXhwb3J0 cz1yfSx7fV0sMTI4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7 dHJ5e2UuZm9jdXMoKX1jYXRjaChlKXt9fXQuZXhwb3J0cz1yfSx7fV0sMTI5OltmdW5jdGlvbihl LHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIGRv Y3VtZW50KXJldHVybiBudWxsO3RyeXtyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudHx8ZG9j dW1lbnQuYm9keX1jYXRjaChlKXtyZXR1cm4gZG9jdW1lbnQuYm9keX19dC5leHBvcnRzPXJ9LHt9 XSwxMzA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4g YT92b2lkIDA6aSghMSksZC5oYXNPd25Qcm9wZXJ0eShlKXx8KGU9IioiKSxzLmhhc093blByb3Bl cnR5KGUpfHwoIioiPT09ZT9hLmlubmVySFRNTD0iPGxpbmsgLz4iOmEuaW5uZXJIVE1MPSI8Iitl KyI+PC8iK2UrIj4iLHNbZV09IWEuZmlyc3RDaGlsZCksc1tlXT9kW2VdOm51bGx9dmFyIG89ZSgx MjApLGk9ZSgxMzQpLGE9by5jYW5Vc2VET00/ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik6 bnVsbCxzPXt9LHU9WzEsJzxzZWxlY3QgbXVsdGlwbGU9InRydWUiPicsIjwvc2VsZWN0PiJdLGw9 WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLGM9WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+ PC90Ym9keT48L3RhYmxlPiJdLHA9WzEsJzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIw MDAvc3ZnIj4nLCI8L3N2Zz4iXSxkPXsiKiI6WzEsIj88ZGl2PiIsIjwvZGl2PiJdLGFyZWE6WzEs IjxtYXA+IiwiPC9tYXA+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3Vw PiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSxsZWdlbmQ6WzEsIjxmaWVsZHNldD4iLCI8L2ZpZWxk c2V0PiJdLHBhcmFtOlsxLCI8b2JqZWN0PiIsIjwvb2JqZWN0PiJdLHRyOlsyLCI8dGFibGU+PHRi b2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSxvcHRncm91cDp1LG9wdGlvbjp1LGNhcHRpb246bCxj b2xncm91cDpsLHRib2R5OmwsdGZvb3Q6bCx0aGVhZDpsLHRkOmMsdGg6Y30sZj1bImNpcmNsZSIs ImNsaXBQYXRoIiwiZGVmcyIsImVsbGlwc2UiLCJnIiwiaW1hZ2UiLCJsaW5lIiwibGluZWFyR3Jh ZGllbnQiLCJtYXNrIiwicGF0aCIsInBhdHRlcm4iLCJwb2x5Z29uIiwicG9seWxpbmUiLCJyYWRp YWxHcmFkaWVudCIsInJlY3QiLCJzdG9wIiwidGV4dCIsInRzcGFuIl07Zi5mb3JFYWNoKGZ1bmN0 aW9uKGUpe2RbZV09cCxzW2VdPSEwfSksdC5leHBvcnRzPXJ9LHsxMjA6MTIwLDEzNDoxMzR9XSwx MzE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZT09 PXdpbmRvdz97eDp3aW5kb3cucGFnZVhPZmZzZXR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5z Y3JvbGxMZWZ0LHk6d2luZG93LnBhZ2VZT2Zmc2V0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQu c2Nyb2xsVG9wfTp7eDplLnNjcm9sbExlZnQseTplLnNjcm9sbFRvcH19dC5leHBvcnRzPXJ9LHt9 XSwxMzI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4g ZS5yZXBsYWNlKG8sIi0kMSIpLnRvTG93ZXJDYXNlKCl9dmFyIG89LyhbQS1aXSkvZzt0LmV4cG9y dHM9cn0se31dLDEzMzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUp e3JldHVybiBvKGUpLnJlcGxhY2UoaSwiLW1zLSIpfXZhciBvPWUoMTMyKSxpPS9ebXMtLzt0LmV4 cG9ydHM9cn0sezEzMjoxMzJ9XSwxMzQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVu Y3Rpb24gcihlLHQsbixyLGksYSxzLHUpe2lmKG8odCksIWUpe3ZhciBsO2lmKHZvaWQgMD09PXQp bD1uZXcgRXJyb3IoIk1pbmlmaWVkIGV4Y2VwdGlvbiBvY2N1cnJlZDsgdXNlIHRoZSBub24tbWlu aWZpZWQgZGV2IGVudmlyb25tZW50IGZvciB0aGUgZnVsbCBlcnJvciBtZXNzYWdlIGFuZCBhZGRp dGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuIik7ZWxzZXt2YXIgYz1bbixyLGksYSxzLHVdLHA9MDts PW5ldyBFcnJvcih0LnJlcGxhY2UoLyVzL2csZnVuY3Rpb24oKXtyZXR1cm4gY1twKytdfSkpLGwu bmFtZT0iSW52YXJpYW50IFZpb2xhdGlvbiJ9dGhyb3cgbC5mcmFtZXNUb1BvcD0xLGx9fXZhciBv PWZ1bmN0aW9uKGUpe307dC5leHBvcnRzPXJ9LHt9XSwxMzU6W2Z1bmN0aW9uKGUsdCxuKXsidXNl IHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4hKCFlfHwhKCJmdW5jdGlvbiI9PXR5cGVvZiBO b2RlP2UgaW5zdGFuY2VvZiBOb2RlOiJvYmplY3QiPT10eXBlb2YgZSYmIm51bWJlciI9PXR5cGVv ZiBlLm5vZGVUeXBlJiYic3RyaW5nIj09dHlwZW9mIGUubm9kZU5hbWUpKX10LmV4cG9ydHM9cn0s e31dLDEzNjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVy biBvKGUpJiYzPT1lLm5vZGVUeXBlfXZhciBvPWUoMTM1KTt0LmV4cG9ydHM9cn0sezEzNToxMzV9 XSwxMzc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt2YXIgdD17 fTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQuaGFzT3duUHJvcGVydHkobil8fCh0W25dPWUu Y2FsbCh0aGlzLG4pKSx0W25dfX10LmV4cG9ydHM9cn0se31dLDEzODpbZnVuY3Rpb24oZSx0LG4p eyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIGU9PT10PzAhPT1lfHwwIT09dHx8 MS9lPT09MS90OmUhPT1lJiZ0IT09dH1mdW5jdGlvbiBvKGUsdCl7aWYocihlLHQpKXJldHVybiEw O2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWV8fCJvYmplY3QiIT10eXBlb2YgdHx8bnVs bD09PXQpcmV0dXJuITE7dmFyIG49T2JqZWN0LmtleXMoZSksbz1PYmplY3Qua2V5cyh0KTtpZihu Lmxlbmd0aCE9PW8ubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgYT0wO2E8bi5sZW5ndGg7YSsrKWlm KCFpLmNhbGwodCxuW2FdKXx8IXIoZVtuW2FdXSx0W25bYV1dKSlyZXR1cm4hMTtyZXR1cm4hMH12 YXIgaT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3QuZXhwb3J0cz1vfSx7fV0sMTM5 OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTI2KSxvPXI7dC5leHBvcnRz PW99LHsxMjY6MTI2fV0sMTQwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9u IHIoZSl7aWYobnVsbD09PWV8fHZvaWQgMD09PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0 LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQiKTtyZXR1cm4g T2JqZWN0KGUpfWZ1bmN0aW9uIG8oKXt0cnl7aWYoIU9iamVjdC5hc3NpZ24pcmV0dXJuITE7dmFy IGU9bmV3IFN0cmluZygiYWJjIik7aWYoZVs1XT0iZGUiLCI1Ij09PU9iamVjdC5nZXRPd25Qcm9w ZXJ0eU5hbWVzKGUpWzBdKXJldHVybiExO2Zvcih2YXIgdD17fSxuPTA7bjwxMDtuKyspdFsiXyIr U3RyaW5nLmZyb21DaGFyQ29kZShuKV09bjt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1l cyh0KS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19KTtpZigiMDEyMzQ1Njc4OSIhPT1yLmpv aW4oIiIpKXJldHVybiExO3ZhciBvPXt9O3JldHVybiJhYmNkZWZnaGlqa2xtbm9wcXJzdCIuc3Bs aXQoIiIpLmZvckVhY2goZnVuY3Rpb24oZSl7b1tlXT1lfSksImFiY2RlZmdoaWprbG1ub3BxcnN0 Ij09PU9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sbykpLmpvaW4oIiIpfWNhdGNoKGUpe3Jl dHVybiExfX12YXIgaT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGE9T2JqZWN0LnBy b3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt0LmV4cG9ydHM9bygpP09iamVjdC5hc3NpZ246 ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4sbyxzPXIoZSksdT0xO3U8YXJndW1lbnRzLmxlbmd0aDt1 Kyspe249T2JqZWN0KGFyZ3VtZW50c1t1XSk7Zm9yKHZhciBsIGluIG4paS5jYWxsKG4sbCkmJihz W2xdPW5bbF0pO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe289T2JqZWN0LmdldE93 blByb3BlcnR5U3ltYm9scyhuKTtmb3IodmFyIGM9MDtjPG8ubGVuZ3RoO2MrKylhLmNhbGwobixv W2NdKSYmKHNbb1tjXV09bltvW2NdXSl9fXJldHVybiBzfX0se31dfSx7fSxbNDFdKSg0MSl9KX0p OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0 YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2Rpc3QvcmVhY3QtZG9tLmpzIGIvd2ViL3BnYWRtaW4vc3Rh dGljL3ZlbmRvci9yZWFjdC1kb20vZGlzdC9yZWFjdC1kb20uanMKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKaW5kZXggMDAwMDAwMDAuLmZiZDI5YWVhCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRt aW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vZGlzdC9yZWFjdC1kb20uanMKQEAgLTAsMCArMSwx ODI2NSBAQAorIC8qKgorICAqIFJlYWN0RE9NIHYxNS40LjIKKyAgKi8KKworOyhmdW5jdGlvbihm KSB7CisgIC8vIENvbW1vbkpTCisgIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gIm9iamVjdCIgJiYg dHlwZW9mIG1vZHVsZSAhPT0gInVuZGVmaW5lZCIpIHsKKyAgICBtb2R1bGUuZXhwb3J0cyA9IGYo cmVxdWlyZSgncmVhY3QnKSk7CisKKyAgLy8gUmVxdWlyZUpTCisgIH0gZWxzZSBpZiAodHlwZW9m IGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSB7CisgICAgZGVmaW5lKFsncmVh Y3QnXSwgZik7CisKKyAgLy8gPHNjcmlwdD4KKyAgfSBlbHNlIHsKKyAgICB2YXIgZzsKKyAgICBp ZiAodHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIpIHsKKyAgICAgIGcgPSB3aW5kb3c7Cisg ICAgfSBlbHNlIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAidW5kZWZpbmVkIikgeworICAgICAgZyA9 IGdsb2JhbDsKKyAgICB9IGVsc2UgaWYgKHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIikgewor ICAgICAgZyA9IHNlbGY7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIHdvcmtzIHByb3ZpZGluZyB3 ZSdyZSBub3QgaW4gInVzZSBzdHJpY3QiOworICAgICAgLy8gbmVlZGVkIGZvciBKYXZhIDggTmFz aG9ybgorICAgICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1 ZXMvMzAzNworICAgICAgZyA9IHRoaXM7CisgICAgfQorICAgIGcuUmVhY3RET00gPSBmKGcuUmVh Y3QpOworICB9Cit9KShmdW5jdGlvbihSZWFjdCkgeworICByZXR1cm4gKGZ1bmN0aW9uKGYpe3Jl dHVybiBmKCl9KShmdW5jdGlvbigpe3ZhciBkZWZpbmUsbW9kdWxlLGV4cG9ydHM7cmV0dXJuIChm dW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIg YT10eXBlb2YgcmVxdWlyZT09ImZ1bmN0aW9uIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShv LCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcigiQ2Fubm90IGZpbmQgbW9k dWxlICciK28rIiciKTt0aHJvdyBmLmNvZGU9Ik1PRFVMRV9OT1RfRk9VTkQiLGZ9dmFyIGw9bltv XT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10 W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5b b10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09ImZ1bmN0aW9uIiYmcmVxdWlyZTtmb3Io dmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkoezE6W2Z1bmN0aW9uKF9k ZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBG YWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJj ZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0 aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2Ug dHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91 bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisK Kyd1c2Ugc3RyaWN0JzsKKwordmFyIEFSSUFET01Qcm9wZXJ0eUNvbmZpZyA9IHsKKyAgUHJvcGVy dGllczogeworICAgIC8vIEdsb2JhbCBTdGF0ZXMgYW5kIFByb3BlcnRpZXMKKyAgICAnYXJpYS1j dXJyZW50JzogMCwgLy8gc3RhdGUKKyAgICAnYXJpYS1kZXRhaWxzJzogMCwKKyAgICAnYXJpYS1k aXNhYmxlZCc6IDAsIC8vIHN0YXRlCisgICAgJ2FyaWEtaGlkZGVuJzogMCwgLy8gc3RhdGUKKyAg ICAnYXJpYS1pbnZhbGlkJzogMCwgLy8gc3RhdGUKKyAgICAnYXJpYS1rZXlzaG9ydGN1dHMnOiAw LAorICAgICdhcmlhLWxhYmVsJzogMCwKKyAgICAnYXJpYS1yb2xlZGVzY3JpcHRpb24nOiAwLAor ICAgIC8vIFdpZGdldCBBdHRyaWJ1dGVzCisgICAgJ2FyaWEtYXV0b2NvbXBsZXRlJzogMCwKKyAg ICAnYXJpYS1jaGVja2VkJzogMCwKKyAgICAnYXJpYS1leHBhbmRlZCc6IDAsCisgICAgJ2FyaWEt aGFzcG9wdXAnOiAwLAorICAgICdhcmlhLWxldmVsJzogMCwKKyAgICAnYXJpYS1tb2RhbCc6IDAs CisgICAgJ2FyaWEtbXVsdGlsaW5lJzogMCwKKyAgICAnYXJpYS1tdWx0aXNlbGVjdGFibGUnOiAw LAorICAgICdhcmlhLW9yaWVudGF0aW9uJzogMCwKKyAgICAnYXJpYS1wbGFjZWhvbGRlcic6IDAs CisgICAgJ2FyaWEtcHJlc3NlZCc6IDAsCisgICAgJ2FyaWEtcmVhZG9ubHknOiAwLAorICAgICdh cmlhLXJlcXVpcmVkJzogMCwKKyAgICAnYXJpYS1zZWxlY3RlZCc6IDAsCisgICAgJ2FyaWEtc29y dCc6IDAsCisgICAgJ2FyaWEtdmFsdWVtYXgnOiAwLAorICAgICdhcmlhLXZhbHVlbWluJzogMCwK KyAgICAnYXJpYS12YWx1ZW5vdyc6IDAsCisgICAgJ2FyaWEtdmFsdWV0ZXh0JzogMCwKKyAgICAv LyBMaXZlIFJlZ2lvbiBBdHRyaWJ1dGVzCisgICAgJ2FyaWEtYXRvbWljJzogMCwKKyAgICAnYXJp YS1idXN5JzogMCwKKyAgICAnYXJpYS1saXZlJzogMCwKKyAgICAnYXJpYS1yZWxldmFudCc6IDAs CisgICAgLy8gRHJhZy1hbmQtRHJvcCBBdHRyaWJ1dGVzCisgICAgJ2FyaWEtZHJvcGVmZmVjdCc6 IDAsCisgICAgJ2FyaWEtZ3JhYmJlZCc6IDAsCisgICAgLy8gUmVsYXRpb25zaGlwIEF0dHJpYnV0 ZXMKKyAgICAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JzogMCwKKyAgICAnYXJpYS1jb2xjb3VudCc6 IDAsCisgICAgJ2FyaWEtY29saW5kZXgnOiAwLAorICAgICdhcmlhLWNvbHNwYW4nOiAwLAorICAg ICdhcmlhLWNvbnRyb2xzJzogMCwKKyAgICAnYXJpYS1kZXNjcmliZWRieSc6IDAsCisgICAgJ2Fy aWEtZXJyb3JtZXNzYWdlJzogMCwKKyAgICAnYXJpYS1mbG93dG8nOiAwLAorICAgICdhcmlhLWxh YmVsbGVkYnknOiAwLAorICAgICdhcmlhLW93bnMnOiAwLAorICAgICdhcmlhLXBvc2luc2V0Jzog MCwKKyAgICAnYXJpYS1yb3djb3VudCc6IDAsCisgICAgJ2FyaWEtcm93aW5kZXgnOiAwLAorICAg ICdhcmlhLXJvd3NwYW4nOiAwLAorICAgICdhcmlhLXNldHNpemUnOiAwCisgIH0sCisgIERPTUF0 dHJpYnV0ZU5hbWVzOiB7fSwKKyAgRE9NUHJvcGVydHlOYW1lczoge30KK307CisKK21vZHVsZS5l eHBvcnRzID0gQVJJQURPTVByb3BlcnR5Q29uZmlnOworfSx7fV0sMjpbZnVuY3Rpb24oX2RlcmVx Xyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vi b29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNv ZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQor ICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVl LiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBp biB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3Vz ZSBzdHJpY3QnOworCit2YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gX2RlcmVxXygzNCk7CisK K3ZhciBmb2N1c05vZGUgPSBfZGVyZXFfKDE0NCk7CisKK3ZhciBBdXRvRm9jdXNVdGlscyA9IHsK KyAgZm9jdXNET01Db21wb25lbnQ6IGZ1bmN0aW9uICgpIHsKKyAgICBmb2N1c05vZGUoUmVhY3RE T01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UodGhpcykpOworICB9Cit9OworCitt b2R1bGUuZXhwb3J0cyA9IEF1dG9Gb2N1c1V0aWxzOworfSx7IjE0NCI6MTQ0LCIzNCI6MzR9XSwz OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIw MTMtcHJlc2VudCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg KiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5z ZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2Yg dGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0 cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3Rvcnku CisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIEV2ZW50UHJvcGFnYXRvcnMgPSBfZGVy ZXFfKDIwKTsKK3ZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IF9kZXJlcV8oMTM2KTsKK3ZhciBG YWxsYmFja0NvbXBvc2l0aW9uU3RhdGUgPSBfZGVyZXFfKDIxKTsKK3ZhciBTeW50aGV0aWNDb21w b3NpdGlvbkV2ZW50ID0gX2RlcmVxXyg4OSk7Cit2YXIgU3ludGhldGljSW5wdXRFdmVudCA9IF9k ZXJlcV8oOTMpOworCit2YXIgRU5EX0tFWUNPREVTID0gWzksIDEzLCAyNywgMzJdOyAvLyBUYWIs IFJldHVybiwgRXNjLCBTcGFjZQordmFyIFNUQVJUX0tFWUNPREUgPSAyMjk7CisKK3ZhciBjYW5V c2VDb21wb3NpdGlvbkV2ZW50ID0gRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NICYmICdD b21wb3NpdGlvbkV2ZW50JyBpbiB3aW5kb3c7CisKK3ZhciBkb2N1bWVudE1vZGUgPSBudWxsOwor aWYgKEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSAmJiAnZG9jdW1lbnRNb2RlJyBpbiBk b2N1bWVudCkgeworICBkb2N1bWVudE1vZGUgPSBkb2N1bWVudC5kb2N1bWVudE1vZGU7Cit9CisK Ky8vIFdlYmtpdCBvZmZlcnMgYSB2ZXJ5IHVzZWZ1bCBgdGV4dElucHV0YCBldmVudCB0aGF0IGNh biBiZSB1c2VkIHRvCisvLyBkaXJlY3RseSByZXByZXNlbnQgYGJlZm9yZUlucHV0YC4gVGhlIElF IGB0ZXh0aW5wdXRgIGV2ZW50IGlzIG5vdCBhcworLy8gdXNlZnVsLCBzbyB3ZSBkb24ndCB1c2Ug aXQuCit2YXIgY2FuVXNlVGV4dElucHV0RXZlbnQgPSBFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5V c2VET00gJiYgJ1RleHRFdmVudCcgaW4gd2luZG93ICYmICFkb2N1bWVudE1vZGUgJiYgIWlzUHJl c3RvKCk7CisKKy8vIEluIElFOSssIHdlIGhhdmUgYWNjZXNzIHRvIGNvbXBvc2l0aW9uIGV2ZW50 cywgYnV0IHRoZSBkYXRhIHN1cHBsaWVkCisvLyBieSB0aGUgbmF0aXZlIGNvbXBvc2l0aW9uZW5k IGV2ZW50IG1heSBiZSBpbmNvcnJlY3QuIEphcGFuZXNlIGlkZW9ncmFwaGljCisvLyBzcGFjZXMs IGZvciBpbnN0YW5jZSAoXHUzMDAwKSBhcmUgbm90IHJlY29yZGVkIGNvcnJlY3RseS4KK3ZhciB1 c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSA9IEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURP TSAmJiAoIWNhblVzZUNvbXBvc2l0aW9uRXZlbnQgfHwgZG9jdW1lbnRNb2RlICYmIGRvY3VtZW50 TW9kZSA+IDggJiYgZG9jdW1lbnRNb2RlIDw9IDExKTsKKworLyoqCisgKiBPcGVyYSA8PSAxMiBp bmNsdWRlcyBUZXh0RXZlbnQgaW4gd2luZG93LCBidXQgZG9lcyBub3QgZmlyZQorICogdGV4dCBp bnB1dCBldmVudHMuIFJlbHkgb24ga2V5cHJlc3MgaW5zdGVhZC4KKyAqLworZnVuY3Rpb24gaXNQ cmVzdG8oKSB7CisgIHZhciBvcGVyYSA9IHdpbmRvdy5vcGVyYTsKKyAgcmV0dXJuIHR5cGVvZiBv cGVyYSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG9wZXJhLnZlcnNpb24gPT09ICdmdW5jdGlvbicg JiYgcGFyc2VJbnQob3BlcmEudmVyc2lvbigpLCAxMCkgPD0gMTI7Cit9CisKK3ZhciBTUEFDRUJB Ul9DT0RFID0gMzI7Cit2YXIgU1BBQ0VCQVJfQ0hBUiA9IFN0cmluZy5mcm9tQ2hhckNvZGUoU1BB Q0VCQVJfQ09ERSk7CisKKy8vIEV2ZW50cyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBwcm9wZXJ0 eSBuYW1lcy4KK3ZhciBldmVudFR5cGVzID0geworICBiZWZvcmVJbnB1dDogeworICAgIHBoYXNl ZFJlZ2lzdHJhdGlvbk5hbWVzOiB7CisgICAgICBidWJibGVkOiAnb25CZWZvcmVJbnB1dCcsCisg ICAgICBjYXB0dXJlZDogJ29uQmVmb3JlSW5wdXRDYXB0dXJlJworICAgIH0sCisgICAgZGVwZW5k ZW5jaWVzOiBbJ3RvcENvbXBvc2l0aW9uRW5kJywgJ3RvcEtleVByZXNzJywgJ3RvcFRleHRJbnB1 dCcsICd0b3BQYXN0ZSddCisgIH0sCisgIGNvbXBvc2l0aW9uRW5kOiB7CisgICAgcGhhc2VkUmVn aXN0cmF0aW9uTmFtZXM6IHsKKyAgICAgIGJ1YmJsZWQ6ICdvbkNvbXBvc2l0aW9uRW5kJywKKyAg ICAgIGNhcHR1cmVkOiAnb25Db21wb3NpdGlvbkVuZENhcHR1cmUnCisgICAgfSwKKyAgICBkZXBl bmRlbmNpZXM6IFsndG9wQmx1cicsICd0b3BDb21wb3NpdGlvbkVuZCcsICd0b3BLZXlEb3duJywg J3RvcEtleVByZXNzJywgJ3RvcEtleVVwJywgJ3RvcE1vdXNlRG93biddCisgIH0sCisgIGNvbXBv c2l0aW9uU3RhcnQ6IHsKKyAgICBwaGFzZWRSZWdpc3RyYXRpb25OYW1lczogeworICAgICAgYnVi YmxlZDogJ29uQ29tcG9zaXRpb25TdGFydCcsCisgICAgICBjYXB0dXJlZDogJ29uQ29tcG9zaXRp b25TdGFydENhcHR1cmUnCisgICAgfSwKKyAgICBkZXBlbmRlbmNpZXM6IFsndG9wQmx1cicsICd0 b3BDb21wb3NpdGlvblN0YXJ0JywgJ3RvcEtleURvd24nLCAndG9wS2V5UHJlc3MnLCAndG9wS2V5 VXAnLCAndG9wTW91c2VEb3duJ10KKyAgfSwKKyAgY29tcG9zaXRpb25VcGRhdGU6IHsKKyAgICBw aGFzZWRSZWdpc3RyYXRpb25OYW1lczogeworICAgICAgYnViYmxlZDogJ29uQ29tcG9zaXRpb25V cGRhdGUnLAorICAgICAgY2FwdHVyZWQ6ICdvbkNvbXBvc2l0aW9uVXBkYXRlQ2FwdHVyZScKKyAg ICB9LAorICAgIGRlcGVuZGVuY2llczogWyd0b3BCbHVyJywgJ3RvcENvbXBvc2l0aW9uVXBkYXRl JywgJ3RvcEtleURvd24nLCAndG9wS2V5UHJlc3MnLCAndG9wS2V5VXAnLCAndG9wTW91c2VEb3du J10KKyAgfQorfTsKKworLy8gVHJhY2sgd2hldGhlciB3ZSd2ZSBldmVyIGhhbmRsZWQgYSBrZXlw cmVzcyBvbiB0aGUgc3BhY2Uga2V5LgordmFyIGhhc1NwYWNlS2V5cHJlc3MgPSBmYWxzZTsKKwor LyoqCisgKiBSZXR1cm4gd2hldGhlciBhIG5hdGl2ZSBrZXlwcmVzcyBldmVudCBpcyBhc3N1bWVk IHRvIGJlIGEgY29tbWFuZC4KKyAqIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBGaXJlZm94IGZp cmVzIGBrZXlwcmVzc2AgZXZlbnRzIGZvciBrZXkgY29tbWFuZHMKKyAqIChjdXQsIGNvcHksIHNl bGVjdC1hbGwsIGV0Yy4pIGV2ZW4gdGhvdWdoIG5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZC4KKyAq LworZnVuY3Rpb24gaXNLZXlwcmVzc0NvbW1hbmQobmF0aXZlRXZlbnQpIHsKKyAgcmV0dXJuIChu YXRpdmVFdmVudC5jdHJsS2V5IHx8IG5hdGl2ZUV2ZW50LmFsdEtleSB8fCBuYXRpdmVFdmVudC5t ZXRhS2V5KSAmJgorICAvLyBjdHJsS2V5ICYmIGFsdEtleSBpcyBlcXVpdmFsZW50IHRvIEFsdEdy LCBhbmQgaXMgbm90IGEgY29tbWFuZC4KKyAgIShuYXRpdmVFdmVudC5jdHJsS2V5ICYmIG5hdGl2 ZUV2ZW50LmFsdEtleSk7Cit9CisKKy8qKgorICogVHJhbnNsYXRlIG5hdGl2ZSB0b3AgbGV2ZWwg ZXZlbnRzIGludG8gZXZlbnQgdHlwZXMuCisgKgorICogQHBhcmFtIHtzdHJpbmd9IHRvcExldmVs VHlwZQorICogQHJldHVybiB7b2JqZWN0fQorICovCitmdW5jdGlvbiBnZXRDb21wb3NpdGlvbkV2 ZW50VHlwZSh0b3BMZXZlbFR5cGUpIHsKKyAgc3dpdGNoICh0b3BMZXZlbFR5cGUpIHsKKyAgICBj YXNlICd0b3BDb21wb3NpdGlvblN0YXJ0JzoKKyAgICAgIHJldHVybiBldmVudFR5cGVzLmNvbXBv c2l0aW9uU3RhcnQ7CisgICAgY2FzZSAndG9wQ29tcG9zaXRpb25FbmQnOgorICAgICAgcmV0dXJu IGV2ZW50VHlwZXMuY29tcG9zaXRpb25FbmQ7CisgICAgY2FzZSAndG9wQ29tcG9zaXRpb25VcGRh dGUnOgorICAgICAgcmV0dXJuIGV2ZW50VHlwZXMuY29tcG9zaXRpb25VcGRhdGU7CisgIH0KK30K KworLyoqCisgKiBEb2VzIG91ciBmYWxsYmFjayBiZXN0LWd1ZXNzIG1vZGVsIHRoaW5rIHRoaXMg ZXZlbnQgc2lnbmlmaWVzIHRoYXQKKyAqIGNvbXBvc2l0aW9uIGhhcyBiZWd1bj8KKyAqCisgKiBA cGFyYW0ge3N0cmluZ30gdG9wTGV2ZWxUeXBlCisgKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZl bnQKKyAqIEByZXR1cm4ge2Jvb2xlYW59CisgKi8KK2Z1bmN0aW9uIGlzRmFsbGJhY2tDb21wb3Np dGlvblN0YXJ0KHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpIHsKKyAgcmV0dXJuIHRvcExldmVs VHlwZSA9PT0gJ3RvcEtleURvd24nICYmIG5hdGl2ZUV2ZW50LmtleUNvZGUgPT09IFNUQVJUX0tF WUNPREU7Cit9CisKKy8qKgorICogRG9lcyBvdXIgZmFsbGJhY2sgbW9kZSB0aGluayB0aGF0IHRo aXMgZXZlbnQgaXMgdGhlIGVuZCBvZiBjb21wb3NpdGlvbj8KKyAqCisgKiBAcGFyYW0ge3N0cmlu Z30gdG9wTGV2ZWxUeXBlCisgKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQKKyAqIEByZXR1 cm4ge2Jvb2xlYW59CisgKi8KK2Z1bmN0aW9uIGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZCh0b3BM ZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KSB7CisgIHN3aXRjaCAodG9wTGV2ZWxUeXBlKSB7CisgICAg Y2FzZSAndG9wS2V5VXAnOgorICAgICAgLy8gQ29tbWFuZCBrZXlzIGluc2VydCBvciBjbGVhciBJ TUUgaW5wdXQuCisgICAgICByZXR1cm4gRU5EX0tFWUNPREVTLmluZGV4T2YobmF0aXZlRXZlbnQu a2V5Q29kZSkgIT09IC0xOworICAgIGNhc2UgJ3RvcEtleURvd24nOgorICAgICAgLy8gRXhwZWN0 IElNRSBrZXlDb2RlIG9uIGVhY2gga2V5ZG93bi4gSWYgd2UgZ2V0IGFueSBvdGhlcgorICAgICAg Ly8gY29kZSB3ZSBtdXN0IGhhdmUgZXhpdGVkIGVhcmxpZXIuCisgICAgICByZXR1cm4gbmF0aXZl RXZlbnQua2V5Q29kZSAhPT0gU1RBUlRfS0VZQ09ERTsKKyAgICBjYXNlICd0b3BLZXlQcmVzcyc6 CisgICAgY2FzZSAndG9wTW91c2VEb3duJzoKKyAgICBjYXNlICd0b3BCbHVyJzoKKyAgICAgIC8v IEV2ZW50cyBhcmUgbm90IHBvc3NpYmxlIHdpdGhvdXQgY2FuY2VsbGluZyBJTUUuCisgICAgICBy ZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisK Ky8qKgorICogR29vZ2xlIElucHV0IFRvb2xzIHByb3ZpZGVzIGNvbXBvc2l0aW9uIGRhdGEgdmlh IGEgQ3VzdG9tRXZlbnQsCisgKiB3aXRoIHRoZSBgZGF0YWAgcHJvcGVydHkgcG9wdWxhdGVkIGlu IHRoZSBgZGV0YWlsYCBvYmplY3QuIElmIHRoaXMKKyAqIGlzIGF2YWlsYWJsZSBvbiB0aGUgZXZl bnQgb2JqZWN0LCB1c2UgaXQuIElmIG5vdCwgdGhpcyBpcyBhIHBsYWluCisgKiBjb21wb3NpdGlv biBldmVudCBhbmQgd2UgaGF2ZSBub3RoaW5nIHNwZWNpYWwgdG8gZXh0cmFjdC4KKyAqCisgKiBA cGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQKKyAqIEByZXR1cm4gez9zdHJpbmd9CisgKi8KK2Z1 bmN0aW9uIGdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZlRXZlbnQpIHsKKyAgdmFyIGRldGFp bCA9IG5hdGl2ZUV2ZW50LmRldGFpbDsKKyAgaWYgKHR5cGVvZiBkZXRhaWwgPT09ICdvYmplY3Qn ICYmICdkYXRhJyBpbiBkZXRhaWwpIHsKKyAgICByZXR1cm4gZGV0YWlsLmRhdGE7CisgIH0KKyAg cmV0dXJuIG51bGw7Cit9CisKKy8vIFRyYWNrIHRoZSBjdXJyZW50IElNRSBjb21wb3NpdGlvbiBm YWxsYmFjayBvYmplY3QsIGlmIGFueS4KK3ZhciBjdXJyZW50Q29tcG9zaXRpb24gPSBudWxsOwor CisvKioKKyAqIEByZXR1cm4gez9vYmplY3R9IEEgU3ludGhldGljQ29tcG9zaXRpb25FdmVudC4K KyAqLworZnVuY3Rpb24gZXh0cmFjdENvbXBvc2l0aW9uRXZlbnQodG9wTGV2ZWxUeXBlLCB0YXJn ZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHsKKyAgdmFyIGV2ZW50VHlw ZTsKKyAgdmFyIGZhbGxiYWNrRGF0YTsKKworICBpZiAoY2FuVXNlQ29tcG9zaXRpb25FdmVudCkg eworICAgIGV2ZW50VHlwZSA9IGdldENvbXBvc2l0aW9uRXZlbnRUeXBlKHRvcExldmVsVHlwZSk7 CisgIH0gZWxzZSBpZiAoIWN1cnJlbnRDb21wb3NpdGlvbikgeworICAgIGlmIChpc0ZhbGxiYWNr Q29tcG9zaXRpb25TdGFydCh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KSkgeworICAgICAgZXZl bnRUeXBlID0gZXZlbnRUeXBlcy5jb21wb3NpdGlvblN0YXJ0OworICAgIH0KKyAgfSBlbHNlIGlm IChpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkpIHsK KyAgICBldmVudFR5cGUgPSBldmVudFR5cGVzLmNvbXBvc2l0aW9uRW5kOworICB9CisKKyAgaWYg KCFldmVudFR5cGUpIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIGlmICh1c2VGYWxsYmFj a0NvbXBvc2l0aW9uRGF0YSkgeworICAgIC8vIFRoZSBjdXJyZW50IGNvbXBvc2l0aW9uIGlzIHN0 b3JlZCBzdGF0aWNhbGx5IGFuZCBtdXN0IG5vdCBiZQorICAgIC8vIG92ZXJ3cml0dGVuIHdoaWxl IGNvbXBvc2l0aW9uIGNvbnRpbnVlcy4KKyAgICBpZiAoIWN1cnJlbnRDb21wb3NpdGlvbiAmJiBl dmVudFR5cGUgPT09IGV2ZW50VHlwZXMuY29tcG9zaXRpb25TdGFydCkgeworICAgICAgY3VycmVu dENvbXBvc2l0aW9uID0gRmFsbGJhY2tDb21wb3NpdGlvblN0YXRlLmdldFBvb2xlZChuYXRpdmVF dmVudFRhcmdldCk7CisgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09IGV2ZW50VHlwZXMuY29t cG9zaXRpb25FbmQpIHsKKyAgICAgIGlmIChjdXJyZW50Q29tcG9zaXRpb24pIHsKKyAgICAgICAg ZmFsbGJhY2tEYXRhID0gY3VycmVudENvbXBvc2l0aW9uLmdldERhdGEoKTsKKyAgICAgIH0KKyAg ICB9CisgIH0KKworICB2YXIgZXZlbnQgPSBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50LmdldFBv b2xlZChldmVudFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdl dCk7CisKKyAgaWYgKGZhbGxiYWNrRGF0YSkgeworICAgIC8vIEluamVjdCBkYXRhIGdlbmVyYXRl ZCBmcm9tIGZhbGxiYWNrIHBhdGggaW50byB0aGUgc3ludGhldGljIGV2ZW50LgorICAgIC8vIFRo aXMgbWF0Y2hlcyB0aGUgcHJvcGVydHkgb2YgbmF0aXZlIENvbXBvc2l0aW9uRXZlbnRJbnRlcmZh Y2UuCisgICAgZXZlbnQuZGF0YSA9IGZhbGxiYWNrRGF0YTsKKyAgfSBlbHNlIHsKKyAgICB2YXIg Y3VzdG9tRGF0YSA9IGdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZlRXZlbnQpOworICAgIGlm IChjdXN0b21EYXRhICE9PSBudWxsKSB7CisgICAgICBldmVudC5kYXRhID0gY3VzdG9tRGF0YTsK KyAgICB9CisgIH0KKworICBFdmVudFByb3BhZ2F0b3JzLmFjY3VtdWxhdGVUd29QaGFzZURpc3Bh dGNoZXMoZXZlbnQpOworICByZXR1cm4gZXZlbnQ7Cit9CisKKy8qKgorICogQHBhcmFtIHtzdHJp bmd9IHRvcExldmVsVHlwZSBSZWNvcmQgZnJvbSBgRXZlbnRDb25zdGFudHNgLgorICogQHBhcmFt IHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LgorICogQHJldHVybiB7 P3N0cmluZ30gVGhlIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoaXMgYGJlZm9yZUlucHV0YCBl dmVudC4KKyAqLworZnVuY3Rpb24gZ2V0TmF0aXZlQmVmb3JlSW5wdXRDaGFycyh0b3BMZXZlbFR5 cGUsIG5hdGl2ZUV2ZW50KSB7CisgIHN3aXRjaCAodG9wTGV2ZWxUeXBlKSB7CisgICAgY2FzZSAn dG9wQ29tcG9zaXRpb25FbmQnOgorICAgICAgcmV0dXJuIGdldERhdGFGcm9tQ3VzdG9tRXZlbnQo bmF0aXZlRXZlbnQpOworICAgIGNhc2UgJ3RvcEtleVByZXNzJzoKKyAgICAgIC8qKgorICAgICAg ICogSWYgbmF0aXZlIGB0ZXh0SW5wdXRgIGV2ZW50cyBhcmUgYXZhaWxhYmxlLCBvdXIgZ29hbCBp cyB0byBtYWtlCisgICAgICAgKiB1c2Ugb2YgdGhlbS4gSG93ZXZlciwgdGhlcmUgaXMgYSBzcGVj aWFsIGNhc2U6IHRoZSBzcGFjZWJhciBrZXkuCisgICAgICAgKiBJbiBXZWJraXQsIHByZXZlbnRp bmcgZGVmYXVsdCBvbiBhIHNwYWNlYmFyIGB0ZXh0SW5wdXRgIGV2ZW50CisgICAgICAgKiBjYW5j ZWxzIGNoYXJhY3RlciBpbnNlcnRpb24sIGJ1dCBpdCAqYWxzbyogY2F1c2VzIHRoZSBicm93c2Vy CisgICAgICAgKiB0byBmYWxsIGJhY2sgdG8gaXRzIGRlZmF1bHQgc3BhY2ViYXIgYmVoYXZpb3Ig b2Ygc2Nyb2xsaW5nIHRoZQorICAgICAgICogcGFnZS4KKyAgICAgICAqCisgICAgICAgKiBUcmFj a2luZyBhdDoKKyAgICAgICAqIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNz dWVzL2RldGFpbD9pZD0zNTUxMDMKKyAgICAgICAqCisgICAgICAgKiBUbyBhdm9pZCB0aGlzIGlz c3VlLCB1c2UgdGhlIGtleXByZXNzIGV2ZW50IGFzIGlmIG5vIGB0ZXh0SW5wdXRgCisgICAgICAg KiBldmVudCBpcyBhdmFpbGFibGUuCisgICAgICAgKi8KKyAgICAgIHZhciB3aGljaCA9IG5hdGl2 ZUV2ZW50LndoaWNoOworICAgICAgaWYgKHdoaWNoICE9PSBTUEFDRUJBUl9DT0RFKSB7CisgICAg ICAgIHJldHVybiBudWxsOworICAgICAgfQorCisgICAgICBoYXNTcGFjZUtleXByZXNzID0gdHJ1 ZTsKKyAgICAgIHJldHVybiBTUEFDRUJBUl9DSEFSOworCisgICAgY2FzZSAndG9wVGV4dElucHV0 JzoKKyAgICAgIC8vIFJlY29yZCB0aGUgY2hhcmFjdGVycyB0byBiZSBhZGRlZCB0byB0aGUgRE9N LgorICAgICAgdmFyIGNoYXJzID0gbmF0aXZlRXZlbnQuZGF0YTsKKworICAgICAgLy8gSWYgaXQn cyBhIHNwYWNlYmFyIGNoYXJhY3RlciwgYXNzdW1lIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IGhhbmRs ZWQKKyAgICAgIC8vIGl0IGF0IHRoZSBrZXlwcmVzcyBsZXZlbCBhbmQgYmFpbCBpbW1lZGlhdGVs eS4gQW5kcm9pZCBDaHJvbWUKKyAgICAgIC8vIGRvZXNuJ3QgZ2l2ZSB1cyBrZXljb2Rlcywgc28g d2UgbmVlZCB0byBibGFja2xpc3QgaXQuCisgICAgICBpZiAoY2hhcnMgPT09IFNQQUNFQkFSX0NI QVIgJiYgaGFzU3BhY2VLZXlwcmVzcykgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0K KworICAgICAgcmV0dXJuIGNoYXJzOworCisgICAgZGVmYXVsdDoKKyAgICAgIC8vIEZvciBvdGhl ciBuYXRpdmUgZXZlbnQgdHlwZXMsIGRvIG5vdGhpbmcuCisgICAgICByZXR1cm4gbnVsbDsKKyAg fQorfQorCisvKioKKyAqIEZvciBicm93c2VycyB0aGF0IGRvIG5vdCBwcm92aWRlIHRoZSBgdGV4 dElucHV0YCBldmVudCwgZXh0cmFjdCB0aGUKKyAqIGFwcHJvcHJpYXRlIHN0cmluZyB0byB1c2Ug Zm9yIFN5bnRoZXRpY0lucHV0RXZlbnQuCisgKgorICogQHBhcmFtIHtzdHJpbmd9IHRvcExldmVs VHlwZSBSZWNvcmQgZnJvbSBgRXZlbnRDb25zdGFudHNgLgorICogQHBhcmFtIHtvYmplY3R9IG5h dGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LgorICogQHJldHVybiB7P3N0cmluZ30gVGhl IGZhbGxiYWNrIHN0cmluZyBmb3IgdGhpcyBgYmVmb3JlSW5wdXRgIGV2ZW50LgorICovCitmdW5j dGlvbiBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnModG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVu dCkgeworICAvLyBJZiB3ZSBhcmUgY3VycmVudGx5IGNvbXBvc2luZyAoSU1FKSBhbmQgdXNpbmcg YSBmYWxsYmFjayB0byBkbyBzbywKKyAgLy8gdHJ5IHRvIGV4dHJhY3QgdGhlIGNvbXBvc2VkIGNo YXJhY3RlcnMgZnJvbSB0aGUgZmFsbGJhY2sgb2JqZWN0LgorICAvLyBJZiBjb21wb3NpdGlvbiBl dmVudCBpcyBhdmFpbGFibGUsIHdlIGV4dHJhY3QgYSBzdHJpbmcgb25seSBhdAorICAvLyBjb21w b3NpdGlvbmV2ZW50LCBvdGhlcndpc2UgZXh0cmFjdCBpdCBhdCBmYWxsYmFjayBldmVudHMuCisg IGlmIChjdXJyZW50Q29tcG9zaXRpb24pIHsKKyAgICBpZiAodG9wTGV2ZWxUeXBlID09PSAndG9w Q29tcG9zaXRpb25FbmQnIHx8ICFjYW5Vc2VDb21wb3NpdGlvbkV2ZW50ICYmIGlzRmFsbGJhY2tD b21wb3NpdGlvbkVuZCh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KSkgeworICAgICAgdmFyIGNo YXJzID0gY3VycmVudENvbXBvc2l0aW9uLmdldERhdGEoKTsKKyAgICAgIEZhbGxiYWNrQ29tcG9z aXRpb25TdGF0ZS5yZWxlYXNlKGN1cnJlbnRDb21wb3NpdGlvbik7CisgICAgICBjdXJyZW50Q29t cG9zaXRpb24gPSBudWxsOworICAgICAgcmV0dXJuIGNoYXJzOworICAgIH0KKyAgICByZXR1cm4g bnVsbDsKKyAgfQorCisgIHN3aXRjaCAodG9wTGV2ZWxUeXBlKSB7CisgICAgY2FzZSAndG9wUGFz dGUnOgorICAgICAgLy8gSWYgYSBwYXN0ZSBldmVudCBvY2N1cnMgYWZ0ZXIgYSBrZXlwcmVzcywg dGhyb3cgb3V0IHRoZSBpbnB1dAorICAgICAgLy8gY2hhcnMuIFBhc3RlIGV2ZW50cyBzaG91bGQg bm90IGxlYWQgdG8gQmVmb3JlSW5wdXQgZXZlbnRzLgorICAgICAgcmV0dXJuIG51bGw7CisgICAg Y2FzZSAndG9wS2V5UHJlc3MnOgorICAgICAgLyoqCisgICAgICAgKiBBcyBvZiB2MjcsIEZpcmVm b3ggbWF5IGZpcmUga2V5cHJlc3MgZXZlbnRzIGV2ZW4gd2hlbiBubyBjaGFyYWN0ZXIKKyAgICAg ICAqIHdpbGwgYmUgaW5zZXJ0ZWQuIEEgZmV3IHBvc3NpYmlsaXRpZXM6CisgICAgICAgKgorICAg ICAgICogLSBgd2hpY2hgIGlzIGAwYC4gQXJyb3cga2V5cywgRXNjIGtleSwgZXRjLgorICAgICAg ICoKKyAgICAgICAqIC0gYHdoaWNoYCBpcyB0aGUgcHJlc3NlZCBrZXkgY29kZSwgYnV0IG5vIGNo YXIgaXMgYXZhaWxhYmxlLgorICAgICAgICogICBFeDogJ0FsdEdyICsgZGAgaW4gUG9saXNoLiBU aGVyZSBpcyBubyBtb2RpZmllZCBjaGFyYWN0ZXIgZm9yCisgICAgICAgKiAgIHRoaXMga2V5IGNv bWJpbmF0aW9uIGFuZCBubyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQgaW50byB0aGUKKyAgICAgICAq ICAgZG9jdW1lbnQsIGJ1dCBGRiBmaXJlcyB0aGUga2V5cHJlc3MgZm9yIGNoYXIgY29kZSBgMTAw YCBhbnl3YXkuCisgICAgICAgKiAgIE5vIGBpbnB1dGAgZXZlbnQgd2lsbCBvY2N1ci4KKyAgICAg ICAqCisgICAgICAgKiAtIGB3aGljaGAgaXMgdGhlIHByZXNzZWQga2V5IGNvZGUsIGJ1dCBhIGNv bW1hbmQgY29tYmluYXRpb24gaXMKKyAgICAgICAqICAgYmVpbmcgdXNlZC4gRXg6IGBDbWQrQ2Au IE5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZCwgYW5kIG5vCisgICAgICAgKiAgIGBpbnB1dGAgZXZl bnQgd2lsbCBvY2N1ci4KKyAgICAgICAqLworICAgICAgaWYgKG5hdGl2ZUV2ZW50LndoaWNoICYm ICFpc0tleXByZXNzQ29tbWFuZChuYXRpdmVFdmVudCkpIHsKKyAgICAgICAgcmV0dXJuIFN0cmlu Zy5mcm9tQ2hhckNvZGUobmF0aXZlRXZlbnQud2hpY2gpOworICAgICAgfQorICAgICAgcmV0dXJu IG51bGw7CisgICAgY2FzZSAndG9wQ29tcG9zaXRpb25FbmQnOgorICAgICAgcmV0dXJuIHVzZUZh bGxiYWNrQ29tcG9zaXRpb25EYXRhID8gbnVsbCA6IG5hdGl2ZUV2ZW50LmRhdGE7CisgICAgZGVm YXVsdDoKKyAgICAgIHJldHVybiBudWxsOworICB9Cit9CisKKy8qKgorICogRXh0cmFjdCBhIFN5 bnRoZXRpY0lucHV0RXZlbnQgZm9yIGBiZWZvcmVJbnB1dGAsIGJhc2VkIG9uIGVpdGhlciBuYXRp dmUKKyAqIGB0ZXh0SW5wdXRgIG9yIGZhbGxiYWNrIGJlaGF2aW9yLgorICoKKyAqIEByZXR1cm4g ez9vYmplY3R9IEEgU3ludGhldGljSW5wdXRFdmVudC4KKyAqLworZnVuY3Rpb24gZXh0cmFjdEJl Zm9yZUlucHV0RXZlbnQodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0 aXZlRXZlbnRUYXJnZXQpIHsKKyAgdmFyIGNoYXJzOworCisgIGlmIChjYW5Vc2VUZXh0SW5wdXRF dmVudCkgeworICAgIGNoYXJzID0gZ2V0TmF0aXZlQmVmb3JlSW5wdXRDaGFycyh0b3BMZXZlbFR5 cGUsIG5hdGl2ZUV2ZW50KTsKKyAgfSBlbHNlIHsKKyAgICBjaGFycyA9IGdldEZhbGxiYWNrQmVm b3JlSW5wdXRDaGFycyh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KTsKKyAgfQorCisgIC8vIElm IG5vIGNoYXJhY3RlcnMgYXJlIGJlaW5nIGluc2VydGVkLCBubyBCZWZvcmVJbnB1dCBldmVudCBz aG91bGQKKyAgLy8gYmUgZmlyZWQuCisgIGlmICghY2hhcnMpIHsKKyAgICByZXR1cm4gbnVsbDsK KyAgfQorCisgIHZhciBldmVudCA9IFN5bnRoZXRpY0lucHV0RXZlbnQuZ2V0UG9vbGVkKGV2ZW50 VHlwZXMuYmVmb3JlSW5wdXQsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRh cmdldCk7CisKKyAgZXZlbnQuZGF0YSA9IGNoYXJzOworICBFdmVudFByb3BhZ2F0b3JzLmFjY3Vt dWxhdGVUd29QaGFzZURpc3BhdGNoZXMoZXZlbnQpOworICByZXR1cm4gZXZlbnQ7Cit9CisKKy8q KgorICogQ3JlYXRlIGFuIGBvbkJlZm9yZUlucHV0YCBldmVudCB0byBtYXRjaAorICogaHR0cDov L3d3dy53My5vcmcvVFIvMjAxMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAxMzExMDUvI2V2ZW50 cy1pbnB1dGV2ZW50cy4KKyAqCisgKiBUaGlzIGV2ZW50IHBsdWdpbiBpcyBiYXNlZCBvbiB0aGUg bmF0aXZlIGB0ZXh0SW5wdXRgIGV2ZW50CisgKiBhdmFpbGFibGUgaW4gQ2hyb21lLCBTYWZhcmks IE9wZXJhLCBhbmQgSUUuIFRoaXMgZXZlbnQgZmlyZXMgYWZ0ZXIKKyAqIGBvbktleVByZXNzYCBh bmQgYG9uQ29tcG9zaXRpb25FbmRgLCBidXQgYmVmb3JlIGBvbklucHV0YC4KKyAqCisgKiBgYmVm b3JlSW5wdXRgIGlzIHNwZWMnZCBidXQgbm90IGltcGxlbWVudGVkIGluIGFueSBicm93c2Vycywg YW5kCisgKiB0aGUgYGlucHV0YCBldmVudCBkb2VzIG5vdCBwcm92aWRlIGFueSB1c2VmdWwgaW5m b3JtYXRpb24gYWJvdXQgd2hhdCBoYXMKKyAqIGFjdHVhbGx5IGJlZW4gYWRkZWQsIGNvbnRyYXJ5 IHRvIHRoZSBzcGVjLiBUaHVzLCBgdGV4dElucHV0YCBpcyB0aGUgYmVzdAorICogYXZhaWxhYmxl IGV2ZW50IHRvIGlkZW50aWZ5IHRoZSBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSBhY3R1YWxseSBiZWVu IGluc2VydGVkCisgKiBpbnRvIHRoZSB0YXJnZXQgbm9kZS4KKyAqCisgKiBUaGlzIHBsdWdpbiBp cyBhbHNvIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyBgY29tcG9zaXRpb25gIGV2ZW50cywgdGh1 cworICogYWxsb3dpbmcgdXMgdG8gc2hhcmUgY29tcG9zaXRpb24gZmFsbGJhY2sgY29kZSBmb3Ig Ym90aCBgYmVmb3JlSW5wdXRgIGFuZAorICogYGNvbXBvc2l0aW9uYCBldmVudCB0eXBlcy4KKyAq LwordmFyIEJlZm9yZUlucHV0RXZlbnRQbHVnaW4gPSB7CisKKyAgZXZlbnRUeXBlczogZXZlbnRU eXBlcywKKworICBleHRyYWN0RXZlbnRzOiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCB0YXJnZXRJ bnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHsKKyAgICByZXR1cm4gW2V4dHJh Y3RDb21wb3NpdGlvbkV2ZW50KHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQs IG5hdGl2ZUV2ZW50VGFyZ2V0KSwgZXh0cmFjdEJlZm9yZUlucHV0RXZlbnQodG9wTGV2ZWxUeXBl LCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpXTsKKyAgfQorfTsK KworbW9kdWxlLmV4cG9ydHMgPSBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luOworfSx7IjEzNiI6MTM2 LCIyMCI6MjAsIjIxIjoyMSwiODkiOjg5LCI5MyI6OTN9XSw0OltmdW5jdGlvbihfZGVyZXFfLG1v ZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ss IEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBp cyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBM SUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFu IGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRo ZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0 cmljdCc7CisKKy8qKgorICogQ1NTIHByb3BlcnRpZXMgd2hpY2ggYWNjZXB0IG51bWJlcnMgYnV0 IGFyZSBub3QgaW4gdW5pdHMgb2YgInB4Ii4KKyAqLworCit2YXIgaXNVbml0bGVzc051bWJlciA9 IHsKKyAgYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6IHRydWUsCisgIGJvcmRlckltYWdlT3V0c2V0 OiB0cnVlLAorICBib3JkZXJJbWFnZVNsaWNlOiB0cnVlLAorICBib3JkZXJJbWFnZVdpZHRoOiB0 cnVlLAorICBib3hGbGV4OiB0cnVlLAorICBib3hGbGV4R3JvdXA6IHRydWUsCisgIGJveE9yZGlu YWxHcm91cDogdHJ1ZSwKKyAgY29sdW1uQ291bnQ6IHRydWUsCisgIGZsZXg6IHRydWUsCisgIGZs ZXhHcm93OiB0cnVlLAorICBmbGV4UG9zaXRpdmU6IHRydWUsCisgIGZsZXhTaHJpbms6IHRydWUs CisgIGZsZXhOZWdhdGl2ZTogdHJ1ZSwKKyAgZmxleE9yZGVyOiB0cnVlLAorICBncmlkUm93OiB0 cnVlLAorICBncmlkQ29sdW1uOiB0cnVlLAorICBmb250V2VpZ2h0OiB0cnVlLAorICBsaW5lQ2xh bXA6IHRydWUsCisgIGxpbmVIZWlnaHQ6IHRydWUsCisgIG9wYWNpdHk6IHRydWUsCisgIG9yZGVy OiB0cnVlLAorICBvcnBoYW5zOiB0cnVlLAorICB0YWJTaXplOiB0cnVlLAorICB3aWRvd3M6IHRy dWUsCisgIHpJbmRleDogdHJ1ZSwKKyAgem9vbTogdHJ1ZSwKKworICAvLyBTVkctcmVsYXRlZCBw cm9wZXJ0aWVzCisgIGZpbGxPcGFjaXR5OiB0cnVlLAorICBmbG9vZE9wYWNpdHk6IHRydWUsCisg IHN0b3BPcGFjaXR5OiB0cnVlLAorICBzdHJva2VEYXNoYXJyYXk6IHRydWUsCisgIHN0cm9rZURh c2hvZmZzZXQ6IHRydWUsCisgIHN0cm9rZU1pdGVybGltaXQ6IHRydWUsCisgIHN0cm9rZU9wYWNp dHk6IHRydWUsCisgIHN0cm9rZVdpZHRoOiB0cnVlCit9OworCisvKioKKyAqIEBwYXJhbSB7c3Ry aW5nfSBwcmVmaXggdmVuZG9yLXNwZWNpZmljIHByZWZpeCwgZWc6IFdlYmtpdAorICogQHBhcmFt IHtzdHJpbmd9IGtleSBzdHlsZSBuYW1lLCBlZzogdHJhbnNpdGlvbkR1cmF0aW9uCisgKiBAcmV0 dXJuIHtzdHJpbmd9IHN0eWxlIG5hbWUgcHJlZml4ZWQgd2l0aCBgcHJlZml4YCwgcHJvcGVybHkg Y2FtZWxDYXNlZCwgZWc6CisgKiBXZWJraXRUcmFuc2l0aW9uRHVyYXRpb24KKyAqLworZnVuY3Rp b24gcHJlZml4S2V5KHByZWZpeCwga2V5KSB7CisgIHJldHVybiBwcmVmaXggKyBrZXkuY2hhckF0 KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc3Vic3RyaW5nKDEpOworfQorCisvKioKKyAqIFN1cHBv cnQgc3R5bGUgbmFtZXMgdGhhdCBtYXkgY29tZSBwYXNzZWQgaW4gcHJlZml4ZWQgYnkgYWRkaW5n IHBlcm11dGF0aW9ucworICogb2YgdmVuZG9yIHByZWZpeGVzLgorICovCit2YXIgcHJlZml4ZXMg PSBbJ1dlYmtpdCcsICdtcycsICdNb3onLCAnTyddOworCisvLyBVc2luZyBPYmplY3Qua2V5cyBo ZXJlLCBvciBlbHNlIHRoZSB2YW5pbGxhIGZvci1pbiBsb29wIG1ha2VzIElFOCBnbyBpbnRvIGFu CisvLyBpbmZpbml0ZSBsb29wLCBiZWNhdXNlIGl0IGl0ZXJhdGVzIG92ZXIgdGhlIG5ld2x5IGFk ZGVkIHByb3BzIHRvby4KK09iamVjdC5rZXlzKGlzVW5pdGxlc3NOdW1iZXIpLmZvckVhY2goZnVu Y3Rpb24gKHByb3ApIHsKKyAgcHJlZml4ZXMuZm9yRWFjaChmdW5jdGlvbiAocHJlZml4KSB7Cisg ICAgaXNVbml0bGVzc051bWJlcltwcmVmaXhLZXkocHJlZml4LCBwcm9wKV0gPSBpc1VuaXRsZXNz TnVtYmVyW3Byb3BdOworICB9KTsKK30pOworCisvKioKKyAqIE1vc3Qgc3R5bGUgcHJvcGVydGll cyBjYW4gYmUgdW5zZXQgYnkgZG9pbmcgLnN0eWxlW3Byb3BdID0gJycgYnV0IElFOAorICogZG9l c24ndCBsaWtlIGRvaW5nIHRoYXQgd2l0aCBzaG9ydGhhbmQgcHJvcGVydGllcyBzbyBmb3IgdGhl IHByb3BlcnRpZXMgdGhhdAorICogSUU4IGJyZWFrcyBvbiwgd2hpY2ggYXJlIGxpc3RlZCBoZXJl LCB3ZSBpbnN0ZWFkIHVuc2V0IGVhY2ggb2YgdGhlCisgKiBpbmRpdmlkdWFsIHByb3BlcnRpZXMu IFNlZSBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjM4NS4KKyAqIFRoZSA0LXZhbHVl ICdjbG9jaycgcHJvcGVydGllcyBsaWtlIG1hcmdpbiwgcGFkZGluZywgYm9yZGVyLXdpZHRoIHNl ZW0gdG8KKyAqIGJlaGF2ZSB3aXRob3V0IGFueSBwcm9ibGVtcy4gQ3VyaW91c2x5LCBsaXN0LXN0 eWxlIHdvcmtzIHRvbyB3aXRob3V0IGFueQorICogc3BlY2lhbCBwcm9kZGluZy4KKyAqLwordmFy IHNob3J0aGFuZFByb3BlcnR5RXhwYW5zaW9ucyA9IHsKKyAgYmFja2dyb3VuZDogeworICAgIGJh Y2tncm91bmRBdHRhY2htZW50OiB0cnVlLAorICAgIGJhY2tncm91bmRDb2xvcjogdHJ1ZSwKKyAg ICBiYWNrZ3JvdW5kSW1hZ2U6IHRydWUsCisgICAgYmFja2dyb3VuZFBvc2l0aW9uWDogdHJ1ZSwK KyAgICBiYWNrZ3JvdW5kUG9zaXRpb25ZOiB0cnVlLAorICAgIGJhY2tncm91bmRSZXBlYXQ6IHRy dWUKKyAgfSwKKyAgYmFja2dyb3VuZFBvc2l0aW9uOiB7CisgICAgYmFja2dyb3VuZFBvc2l0aW9u WDogdHJ1ZSwKKyAgICBiYWNrZ3JvdW5kUG9zaXRpb25ZOiB0cnVlCisgIH0sCisgIGJvcmRlcjog eworICAgIGJvcmRlcldpZHRoOiB0cnVlLAorICAgIGJvcmRlclN0eWxlOiB0cnVlLAorICAgIGJv cmRlckNvbG9yOiB0cnVlCisgIH0sCisgIGJvcmRlckJvdHRvbTogeworICAgIGJvcmRlckJvdHRv bVdpZHRoOiB0cnVlLAorICAgIGJvcmRlckJvdHRvbVN0eWxlOiB0cnVlLAorICAgIGJvcmRlckJv dHRvbUNvbG9yOiB0cnVlCisgIH0sCisgIGJvcmRlckxlZnQ6IHsKKyAgICBib3JkZXJMZWZ0V2lk dGg6IHRydWUsCisgICAgYm9yZGVyTGVmdFN0eWxlOiB0cnVlLAorICAgIGJvcmRlckxlZnRDb2xv cjogdHJ1ZQorICB9LAorICBib3JkZXJSaWdodDogeworICAgIGJvcmRlclJpZ2h0V2lkdGg6IHRy dWUsCisgICAgYm9yZGVyUmlnaHRTdHlsZTogdHJ1ZSwKKyAgICBib3JkZXJSaWdodENvbG9yOiB0 cnVlCisgIH0sCisgIGJvcmRlclRvcDogeworICAgIGJvcmRlclRvcFdpZHRoOiB0cnVlLAorICAg IGJvcmRlclRvcFN0eWxlOiB0cnVlLAorICAgIGJvcmRlclRvcENvbG9yOiB0cnVlCisgIH0sCisg IGZvbnQ6IHsKKyAgICBmb250U3R5bGU6IHRydWUsCisgICAgZm9udFZhcmlhbnQ6IHRydWUsCisg ICAgZm9udFdlaWdodDogdHJ1ZSwKKyAgICBmb250U2l6ZTogdHJ1ZSwKKyAgICBsaW5lSGVpZ2h0 OiB0cnVlLAorICAgIGZvbnRGYW1pbHk6IHRydWUKKyAgfSwKKyAgb3V0bGluZTogeworICAgIG91 dGxpbmVXaWR0aDogdHJ1ZSwKKyAgICBvdXRsaW5lU3R5bGU6IHRydWUsCisgICAgb3V0bGluZUNv bG9yOiB0cnVlCisgIH0KK307CisKK3ZhciBDU1NQcm9wZXJ0eSA9IHsKKyAgaXNVbml0bGVzc051 bWJlcjogaXNVbml0bGVzc051bWJlciwKKyAgc2hvcnRoYW5kUHJvcGVydHlFeHBhbnNpb25zOiBz aG9ydGhhbmRQcm9wZXJ0eUV4cGFuc2lvbnMKK307CisKK21vZHVsZS5leHBvcnRzID0gQ1NTUHJv cGVydHk7Cit9LHt9XSw1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgor ICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMg cmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUg QlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJv b3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAq IG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhl IHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBDU1NQcm9w ZXJ0eSA9IF9kZXJlcV8oNCk7Cit2YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSBfZGVyZXFfKDEz Nik7Cit2YXIgUmVhY3RJbnN0cnVtZW50YXRpb24gPSBfZGVyZXFfKDY0KTsKKwordmFyIGNhbWVs aXplU3R5bGVOYW1lID0gX2RlcmVxXygxMzgpOwordmFyIGRhbmdlcm91c1N0eWxlVmFsdWUgPSBf ZGVyZXFfKDEwNik7Cit2YXIgaHlwaGVuYXRlU3R5bGVOYW1lID0gX2RlcmVxXygxNDkpOwordmFy IG1lbW9pemVTdHJpbmdPbmx5ID0gX2RlcmVxXygxNTMpOwordmFyIHdhcm5pbmcgPSBfZGVyZXFf KDE1Nyk7CisKK3ZhciBwcm9jZXNzU3R5bGVOYW1lID0gbWVtb2l6ZVN0cmluZ09ubHkoZnVuY3Rp b24gKHN0eWxlTmFtZSkgeworICByZXR1cm4gaHlwaGVuYXRlU3R5bGVOYW1lKHN0eWxlTmFtZSk7 Cit9KTsKKwordmFyIGhhc1Nob3J0aGFuZFByb3BlcnR5QnVnID0gZmFsc2U7Cit2YXIgc3R5bGVG bG9hdEFjY2Vzc29yID0gJ2Nzc0Zsb2F0JzsKK2lmIChFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5V c2VET00pIHsKKyAgdmFyIHRlbXBTdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Rpdicp LnN0eWxlOworICB0cnkgeworICAgIC8vIElFOCB0aHJvd3MgIkludmFsaWQgYXJndW1lbnQuIiBp ZiByZXNldHRpbmcgc2hvcnRoYW5kIHN0eWxlIHByb3BlcnRpZXMuCisgICAgdGVtcFN0eWxlLmZv bnQgPSAnJzsKKyAgfSBjYXRjaCAoZSkgeworICAgIGhhc1Nob3J0aGFuZFByb3BlcnR5QnVnID0g dHJ1ZTsKKyAgfQorICAvLyBJRTggb25seSBzdXBwb3J0cyBhY2Nlc3NpbmcgY3NzRmxvYXQgKHN0 YW5kYXJkKSBhcyBzdHlsZUZsb2F0CisgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5 bGUuY3NzRmxvYXQgPT09IHVuZGVmaW5lZCkgeworICAgIHN0eWxlRmxvYXRBY2Nlc3NvciA9ICdz dHlsZUZsb2F0JzsKKyAgfQorfQorCitpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24n KSB7CisgIC8vICdtc1RyYW5zZm9ybScgaXMgY29ycmVjdCwgYnV0IHRoZSBvdGhlciBwcmVmaXhl cyBzaG91bGQgYmUgY2FwaXRhbGl6ZWQKKyAgdmFyIGJhZFZlbmRvcmVkU3R5bGVOYW1lUGF0dGVy biA9IC9eKD86d2Via2l0fG1venxvKVtBLVpdLzsKKworICAvLyBzdHlsZSB2YWx1ZXMgc2hvdWxk bid0IGNvbnRhaW4gYSBzZW1pY29sb24KKyAgdmFyIGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9u UGF0dGVybiA9IC87XHMqJC87CisKKyAgdmFyIHdhcm5lZFN0eWxlTmFtZXMgPSB7fTsKKyAgdmFy IHdhcm5lZFN0eWxlVmFsdWVzID0ge307CisgIHZhciB3YXJuZWRGb3JOYU5WYWx1ZSA9IGZhbHNl OworCisgIHZhciB3YXJuSHlwaGVuYXRlZFN0eWxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lLCBvd25l cikgeworICAgIGlmICh3YXJuZWRTdHlsZU5hbWVzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHdh cm5lZFN0eWxlTmFtZXNbbmFtZV0pIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3YXJu ZWRTdHlsZU5hbWVzW25hbWVdID0gdHJ1ZTsKKyAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVj dGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnVW5zdXBwb3J0ZWQgc3R5bGUgcHJvcGVydHkgJXMuIERp ZCB5b3UgbWVhbiAlcz8lcycsIG5hbWUsIGNhbWVsaXplU3R5bGVOYW1lKG5hbWUpLCBjaGVja1Jl bmRlck1lc3NhZ2Uob3duZXIpKSA6IHZvaWQgMDsKKyAgfTsKKworICB2YXIgd2FybkJhZFZlbmRv cmVkU3R5bGVOYW1lID0gZnVuY3Rpb24gKG5hbWUsIG93bmVyKSB7CisgICAgaWYgKHdhcm5lZFN0 eWxlTmFtZXMuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSkg eworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0gPSB0 cnVlOworICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2Us ICdVbnN1cHBvcnRlZCB2ZW5kb3ItcHJlZml4ZWQgc3R5bGUgcHJvcGVydHkgJXMuIERpZCB5b3Ug bWVhbiAlcz8lcycsIG5hbWUsIG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNs aWNlKDEpLCBjaGVja1JlbmRlck1lc3NhZ2Uob3duZXIpKSA6IHZvaWQgMDsKKyAgfTsKKworICB2 YXIgd2FyblN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBv d25lcikgeworICAgIGlmICh3YXJuZWRTdHlsZVZhbHVlcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkg JiYgd2FybmVkU3R5bGVWYWx1ZXNbdmFsdWVdKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisg ICAgd2FybmVkU3R5bGVWYWx1ZXNbdmFsdWVdID0gdHJ1ZTsKKyAgICAiZGV2ZWxvcG1lbnQiICE9 PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnU3R5bGUgcHJvcGVydHkgdmFsdWVzIHNo b3VsZG5cJ3QgY29udGFpbiBhIHNlbWljb2xvbi4lcyAnICsgJ1RyeSAiJXM6ICVzIiBpbnN0ZWFk LicsIGNoZWNrUmVuZGVyTWVzc2FnZShvd25lciksIG5hbWUsIHZhbHVlLnJlcGxhY2UoYmFkU3R5 bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuLCAnJykpIDogdm9pZCAwOworICB9OworCisgIHZh ciB3YXJuU3R5bGVWYWx1ZUlzTmFOID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBvd25lcikgewor ICAgIGlmICh3YXJuZWRGb3JOYU5WYWx1ZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAg IHdhcm5lZEZvck5hTlZhbHVlID0gdHJ1ZTsKKyAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVj dGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnYE5hTmAgaXMgYW4gaW52YWxpZCB2YWx1ZSBmb3IgdGhl IGAlc2AgY3NzIHN0eWxlIHByb3BlcnR5LiVzJywgbmFtZSwgY2hlY2tSZW5kZXJNZXNzYWdlKG93 bmVyKSkgOiB2b2lkIDA7CisgIH07CisKKyAgdmFyIGNoZWNrUmVuZGVyTWVzc2FnZSA9IGZ1bmN0 aW9uIChvd25lcikgeworICAgIGlmIChvd25lcikgeworICAgICAgdmFyIG5hbWUgPSBvd25lci5n ZXROYW1lKCk7CisgICAgICBpZiAobmFtZSkgeworICAgICAgICByZXR1cm4gJyBDaGVjayB0aGUg cmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nOworICAgICAgfQorICAgIH0KKyAgICBy ZXR1cm4gJyc7CisgIH07CisKKyAgLyoqCisgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCisgICAq IEBwYXJhbSB7Kn0gdmFsdWUKKyAgICogQHBhcmFtIHtSZWFjdERPTUNvbXBvbmVudH0gY29tcG9u ZW50CisgICAqLworICB2YXIgd2FyblZhbGlkU3R5bGUgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUs IGNvbXBvbmVudCkgeworICAgIHZhciBvd25lcjsKKyAgICBpZiAoY29tcG9uZW50KSB7CisgICAg ICBvd25lciA9IGNvbXBvbmVudC5fY3VycmVudEVsZW1lbnQuX293bmVyOworICAgIH0KKyAgICBp ZiAobmFtZS5pbmRleE9mKCctJykgPiAtMSkgeworICAgICAgd2Fybkh5cGhlbmF0ZWRTdHlsZU5h bWUobmFtZSwgb3duZXIpOworICAgIH0gZWxzZSBpZiAoYmFkVmVuZG9yZWRTdHlsZU5hbWVQYXR0 ZXJuLnRlc3QobmFtZSkpIHsKKyAgICAgIHdhcm5CYWRWZW5kb3JlZFN0eWxlTmFtZShuYW1lLCBv d25lcik7CisgICAgfSBlbHNlIGlmIChiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4u dGVzdCh2YWx1ZSkpIHsKKyAgICAgIHdhcm5TdHlsZVZhbHVlV2l0aFNlbWljb2xvbihuYW1lLCB2 YWx1ZSwgb3duZXIpOworICAgIH0KKworICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXIn ICYmIGlzTmFOKHZhbHVlKSkgeworICAgICAgd2FyblN0eWxlVmFsdWVJc05hTihuYW1lLCB2YWx1 ZSwgb3duZXIpOworICAgIH0KKyAgfTsKK30KKworLyoqCisgKiBPcGVyYXRpb25zIGZvciBkZWFs aW5nIHdpdGggQ1NTIHByb3BlcnRpZXMuCisgKi8KK3ZhciBDU1NQcm9wZXJ0eU9wZXJhdGlvbnMg PSB7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6ZXMgYSBtYXBwaW5nIG9mIHN0eWxlIHByb3BlcnRp ZXMgZm9yIHVzZSBhcyBpbmxpbmUgc3R5bGVzOgorICAgKgorICAgKiAgID4gY3JlYXRlTWFya3Vw Rm9yU3R5bGVzKHt3aWR0aDogJzIwMHB4JywgaGVpZ2h0OiAwfSkKKyAgICogICAid2lkdGg6MjAw cHg7aGVpZ2h0OjA7IgorICAgKgorICAgKiBVbmRlZmluZWQgdmFsdWVzIGFyZSBpZ25vcmVkIHNv IHRoYXQgZGVjbGFyYXRpdmUgcHJvZ3JhbW1pbmcgaXMgZWFzaWVyLgorICAgKiBUaGUgcmVzdWx0 IHNob3VsZCBiZSBIVE1MLWVzY2FwZWQgYmVmb3JlIGluc2VydGlvbiBpbnRvIHRoZSBET00uCisg ICAqCisgICAqIEBwYXJhbSB7b2JqZWN0fSBzdHlsZXMKKyAgICogQHBhcmFtIHtSZWFjdERPTUNv bXBvbmVudH0gY29tcG9uZW50CisgICAqIEByZXR1cm4gez9zdHJpbmd9CisgICAqLworICBjcmVh dGVNYXJrdXBGb3JTdHlsZXM6IGZ1bmN0aW9uIChzdHlsZXMsIGNvbXBvbmVudCkgeworICAgIHZh ciBzZXJpYWxpemVkID0gJyc7CisgICAgZm9yICh2YXIgc3R5bGVOYW1lIGluIHN0eWxlcykgewor ICAgICAgaWYgKCFzdHlsZXMuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkgeworICAgICAgICBj b250aW51ZTsKKyAgICAgIH0KKyAgICAgIHZhciBzdHlsZVZhbHVlID0gc3R5bGVzW3N0eWxlTmFt ZV07CisgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAg IHdhcm5WYWxpZFN0eWxlKHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSwgY29tcG9uZW50KTsKKyAgICAg IH0KKyAgICAgIGlmIChzdHlsZVZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgc2VyaWFsaXplZCAr PSBwcm9jZXNzU3R5bGVOYW1lKHN0eWxlTmFtZSkgKyAnOic7CisgICAgICAgIHNlcmlhbGl6ZWQg Kz0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShzdHlsZU5hbWUsIHN0eWxlVmFsdWUsIGNvbXBvbmVudCkg KyAnOyc7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBzZXJpYWxpemVkIHx8IG51bGw7Cisg IH0sCisKKyAgLyoqCisgICAqIFNldHMgdGhlIHZhbHVlIGZvciBtdWx0aXBsZSBzdHlsZXMgb24g YSBub2RlLiAgSWYgYSB2YWx1ZSBpcyBzcGVjaWZpZWQgYXMKKyAgICogJycgKGVtcHR5IHN0cmlu ZyksIHRoZSBjb3JyZXNwb25kaW5nIHN0eWxlIHByb3BlcnR5IHdpbGwgYmUgdW5zZXQuCisgICAq CisgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZQorICAgKiBAcGFyYW0ge29iamVjdH0gc3R5 bGVzCisgICAqIEBwYXJhbSB7UmVhY3RET01Db21wb25lbnR9IGNvbXBvbmVudAorICAgKi8KKyAg c2V0VmFsdWVGb3JTdHlsZXM6IGZ1bmN0aW9uIChub2RlLCBzdHlsZXMsIGNvbXBvbmVudCkgewor ICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIFJlYWN0SW5z dHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oeworICAgICAgICBpbnN0YW5j ZUlEOiBjb21wb25lbnQuX2RlYnVnSUQsCisgICAgICAgIHR5cGU6ICd1cGRhdGUgc3R5bGVzJywK KyAgICAgICAgcGF5bG9hZDogc3R5bGVzCisgICAgICB9KTsKKyAgICB9CisKKyAgICB2YXIgc3R5 bGUgPSBub2RlLnN0eWxlOworICAgIGZvciAodmFyIHN0eWxlTmFtZSBpbiBzdHlsZXMpIHsKKyAg ICAgIGlmICghc3R5bGVzLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIHsKKyAgICAgICAgY29u dGludWU7CisgICAgICB9CisgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24n KSB7CisgICAgICAgIHdhcm5WYWxpZFN0eWxlKHN0eWxlTmFtZSwgc3R5bGVzW3N0eWxlTmFtZV0s IGNvbXBvbmVudCk7CisgICAgICB9CisgICAgICB2YXIgc3R5bGVWYWx1ZSA9IGRhbmdlcm91c1N0 eWxlVmFsdWUoc3R5bGVOYW1lLCBzdHlsZXNbc3R5bGVOYW1lXSwgY29tcG9uZW50KTsKKyAgICAg IGlmIChzdHlsZU5hbWUgPT09ICdmbG9hdCcgfHwgc3R5bGVOYW1lID09PSAnY3NzRmxvYXQnKSB7 CisgICAgICAgIHN0eWxlTmFtZSA9IHN0eWxlRmxvYXRBY2Nlc3NvcjsKKyAgICAgIH0KKyAgICAg IGlmIChzdHlsZVZhbHVlKSB7CisgICAgICAgIHN0eWxlW3N0eWxlTmFtZV0gPSBzdHlsZVZhbHVl OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyIGV4cGFuc2lvbiA9IGhhc1Nob3J0aGFuZFBy b3BlcnR5QnVnICYmIENTU1Byb3BlcnR5LnNob3J0aGFuZFByb3BlcnR5RXhwYW5zaW9uc1tzdHls ZU5hbWVdOworICAgICAgICBpZiAoZXhwYW5zaW9uKSB7CisgICAgICAgICAgLy8gU2hvcnRoYW5k IHByb3BlcnR5IHRoYXQgSUU4IHdvbid0IGxpa2UgdW5zZXR0aW5nLCBzbyB1bnNldCBlYWNoCisg ICAgICAgICAgLy8gY29tcG9uZW50IHRvIHBsYWNhdGUgaXQKKyAgICAgICAgICBmb3IgKHZhciBp bmRpdmlkdWFsU3R5bGVOYW1lIGluIGV4cGFuc2lvbikgeworICAgICAgICAgICAgc3R5bGVbaW5k aXZpZHVhbFN0eWxlTmFtZV0gPSAnJzsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7Cisg ICAgICAgICAgc3R5bGVbc3R5bGVOYW1lXSA9ICcnOworICAgICAgICB9CisgICAgICB9CisgICAg fQorICB9CisKK307CisKK21vZHVsZS5leHBvcnRzID0gQ1NTUHJvcGVydHlPcGVyYXRpb25zOwor fSx7IjEwNiI6MTA2LCIxMzYiOjEzNiwiMTM4IjoxMzgsIjE0OSI6MTQ5LCIxNTMiOjE1MywiMTU3 IjoxNTcsIjQiOjQsIjY0Ijo2NH1dLDY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMp eworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxs IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVu ZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBp biB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBn cmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmls ZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOwor Cit2YXIgX3Byb2RJbnZhcmlhbnQgPSBfZGVyZXFfKDEyNSk7CisKK2Z1bmN0aW9uIF9jbGFzc0Nh bGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2Vv ZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFz cyBhcyBhIGZ1bmN0aW9uIik7IH0gfQorCit2YXIgUG9vbGVkQ2xhc3MgPSBfZGVyZXFfKDI1KTsK KwordmFyIGludmFyaWFudCA9IF9kZXJlcV8oMTUwKTsKKworLyoqCisgKiBBIHNwZWNpYWxpemVk IHBzZXVkby1ldmVudCBtb2R1bGUgdG8gaGVscCBrZWVwIHRyYWNrIG9mIGNvbXBvbmVudHMgd2Fp dGluZyB0bworICogYmUgbm90aWZpZWQgd2hlbiB0aGVpciBET00gcmVwcmVzZW50YXRpb25zIGFy ZSBhdmFpbGFibGUgZm9yIHVzZS4KKyAqCisgKiBUaGlzIGltcGxlbWVudHMgYFBvb2xlZENsYXNz YCwgc28geW91IHNob3VsZCBuZXZlciBuZWVkIHRvIGluc3RhbnRpYXRlIHRoaXMuCisgKiBJbnN0 ZWFkLCB1c2UgYENhbGxiYWNrUXVldWUuZ2V0UG9vbGVkKClgLgorICoKKyAqIEBjbGFzcyBSZWFj dE1vdW50UmVhZHkKKyAqIEBpbXBsZW1lbnRzIFBvb2xlZENsYXNzCisgKiBAaW50ZXJuYWwKKyAq LworCit2YXIgQ2FsbGJhY2tRdWV1ZSA9IGZ1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gQ2FsbGJh Y2tRdWV1ZShhcmcpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2FsbGJhY2tRdWV1ZSk7 CisKKyAgICB0aGlzLl9jYWxsYmFja3MgPSBudWxsOworICAgIHRoaXMuX2NvbnRleHRzID0gbnVs bDsKKyAgICB0aGlzLl9hcmcgPSBhcmc7CisgIH0KKworICAvKioKKyAgICogRW5xdWV1ZXMgYSBj YWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gYG5vdGlmeUFsbGAgaXMgaW52b2tlZC4KKyAgICoK KyAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgSW52b2tlZCB3aGVuIGBub3RpZnlBbGxg IGlzIGludm9rZWQuCisgICAqIEBwYXJhbSB7P29iamVjdH0gY29udGV4dCBDb250ZXh0IHRvIGNh bGwgYGNhbGxiYWNrYCB3aXRoLgorICAgKiBAaW50ZXJuYWwKKyAgICovCisKKworICBDYWxsYmFj a1F1ZXVlLnByb3RvdHlwZS5lbnF1ZXVlID0gZnVuY3Rpb24gZW5xdWV1ZShjYWxsYmFjaywgY29u dGV4dCkgeworICAgIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCBbXTsKKyAg ICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7CisgICAgdGhpcy5fY29udGV4dHMgPSB0 aGlzLl9jb250ZXh0cyB8fCBbXTsKKyAgICB0aGlzLl9jb250ZXh0cy5wdXNoKGNvbnRleHQpOwor ICB9OworCisgIC8qKgorICAgKiBJbnZva2VzIGFsbCBlbnF1ZXVlZCBjYWxsYmFja3MgYW5kIGNs ZWFycyB0aGUgcXVldWUuIFRoaXMgaXMgaW52b2tlZCBhZnRlcgorICAgKiB0aGUgRE9NIHJlcHJl c2VudGF0aW9uIG9mIGEgY29tcG9uZW50IGhhcyBiZWVuIGNyZWF0ZWQgb3IgdXBkYXRlZC4KKyAg ICoKKyAgICogQGludGVybmFsCisgICAqLworCisKKyAgQ2FsbGJhY2tRdWV1ZS5wcm90b3R5cGUu bm90aWZ5QWxsID0gZnVuY3Rpb24gbm90aWZ5QWxsKCkgeworICAgIHZhciBjYWxsYmFja3MgPSB0 aGlzLl9jYWxsYmFja3M7CisgICAgdmFyIGNvbnRleHRzID0gdGhpcy5fY29udGV4dHM7CisgICAg dmFyIGFyZyA9IHRoaXMuX2FyZzsKKyAgICBpZiAoY2FsbGJhY2tzICYmIGNvbnRleHRzKSB7Cisg ICAgICAhKGNhbGxiYWNrcy5sZW5ndGggPT09IGNvbnRleHRzLmxlbmd0aCkgPyAiZGV2ZWxvcG1l bnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdNaXNtYXRjaGVkIGxpc3Qg b2YgY29udGV4dHMgaW4gY2FsbGJhY2sgcXVldWUnKSA6IF9wcm9kSW52YXJpYW50KCcyNCcpIDog dm9pZCAwOworICAgICAgdGhpcy5fY2FsbGJhY2tzID0gbnVsbDsKKyAgICAgIHRoaXMuX2NvbnRl eHRzID0gbnVsbDsKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsg aSsrKSB7CisgICAgICAgIGNhbGxiYWNrc1tpXS5jYWxsKGNvbnRleHRzW2ldLCBhcmcpOworICAg ICAgfQorICAgICAgY2FsbGJhY2tzLmxlbmd0aCA9IDA7CisgICAgICBjb250ZXh0cy5sZW5ndGgg PSAwOworICAgIH0KKyAgfTsKKworICBDYWxsYmFja1F1ZXVlLnByb3RvdHlwZS5jaGVja3BvaW50 ID0gZnVuY3Rpb24gY2hlY2twb2ludCgpIHsKKyAgICByZXR1cm4gdGhpcy5fY2FsbGJhY2tzID8g dGhpcy5fY2FsbGJhY2tzLmxlbmd0aCA6IDA7CisgIH07CisKKyAgQ2FsbGJhY2tRdWV1ZS5wcm90 b3R5cGUucm9sbGJhY2sgPSBmdW5jdGlvbiByb2xsYmFjayhsZW4pIHsKKyAgICBpZiAodGhpcy5f Y2FsbGJhY2tzICYmIHRoaXMuX2NvbnRleHRzKSB7CisgICAgICB0aGlzLl9jYWxsYmFja3MubGVu Z3RoID0gbGVuOworICAgICAgdGhpcy5fY29udGV4dHMubGVuZ3RoID0gbGVuOworICAgIH0KKyAg fTsKKworICAvKioKKyAgICogUmVzZXRzIHRoZSBpbnRlcm5hbCBxdWV1ZS4KKyAgICoKKyAgICog QGludGVybmFsCisgICAqLworCisKKyAgQ2FsbGJhY2tRdWV1ZS5wcm90b3R5cGUucmVzZXQgPSBm dW5jdGlvbiByZXNldCgpIHsKKyAgICB0aGlzLl9jYWxsYmFja3MgPSBudWxsOworICAgIHRoaXMu X2NvbnRleHRzID0gbnVsbDsKKyAgfTsKKworICAvKioKKyAgICogYFBvb2xlZENsYXNzYCBsb29r cyBmb3IgdGhpcy4KKyAgICovCisKKworICBDYWxsYmFja1F1ZXVlLnByb3RvdHlwZS5kZXN0cnVj dG9yID0gZnVuY3Rpb24gZGVzdHJ1Y3RvcigpIHsKKyAgICB0aGlzLnJlc2V0KCk7CisgIH07CisK KyAgcmV0dXJuIENhbGxiYWNrUXVldWU7Cit9KCk7CisKK21vZHVsZS5leHBvcnRzID0gUG9vbGVk Q2xhc3MuYWRkUG9vbGluZ1RvKENhbGxiYWNrUXVldWUpOworfSx7IjEyNSI6MTI1LCIxNTAiOjE1 MCwiMjUiOjI1fV0sNzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAq IENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJl c2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJT RC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290 IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBv ZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBz YW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgRXZlbnRQbHVn aW5IdWIgPSBfZGVyZXFfKDE3KTsKK3ZhciBFdmVudFByb3BhZ2F0b3JzID0gX2RlcmVxXygyMCk7 Cit2YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSBfZGVyZXFfKDEzNik7Cit2YXIgUmVhY3RET01D b21wb25lbnRUcmVlID0gX2RlcmVxXygzNCk7Cit2YXIgUmVhY3RVcGRhdGVzID0gX2RlcmVxXyg4 Mik7Cit2YXIgU3ludGhldGljRXZlbnQgPSBfZGVyZXFfKDkxKTsKKwordmFyIGdldEV2ZW50VGFy Z2V0ID0gX2RlcmVxXygxMTQpOwordmFyIGlzRXZlbnRTdXBwb3J0ZWQgPSBfZGVyZXFfKDEyMik7 Cit2YXIgaXNUZXh0SW5wdXRFbGVtZW50ID0gX2RlcmVxXygxMjMpOworCit2YXIgZXZlbnRUeXBl cyA9IHsKKyAgY2hhbmdlOiB7CisgICAgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6IHsKKyAgICAg IGJ1YmJsZWQ6ICdvbkNoYW5nZScsCisgICAgICBjYXB0dXJlZDogJ29uQ2hhbmdlQ2FwdHVyZScK KyAgICB9LAorICAgIGRlcGVuZGVuY2llczogWyd0b3BCbHVyJywgJ3RvcENoYW5nZScsICd0b3BD bGljaycsICd0b3BGb2N1cycsICd0b3BJbnB1dCcsICd0b3BLZXlEb3duJywgJ3RvcEtleVVwJywg J3RvcFNlbGVjdGlvbkNoYW5nZSddCisgIH0KK307CisKKy8qKgorICogRm9yIElFIHNoaW1zCisg Ki8KK3ZhciBhY3RpdmVFbGVtZW50ID0gbnVsbDsKK3ZhciBhY3RpdmVFbGVtZW50SW5zdCA9IG51 bGw7Cit2YXIgYWN0aXZlRWxlbWVudFZhbHVlID0gbnVsbDsKK3ZhciBhY3RpdmVFbGVtZW50VmFs dWVQcm9wID0gbnVsbDsKKworLyoqCisgKiBTRUNUSU9OOiBoYW5kbGUgYGNoYW5nZWAgZXZlbnQK KyAqLworZnVuY3Rpb24gc2hvdWxkVXNlQ2hhbmdlRXZlbnQoZWxlbSkgeworICB2YXIgbm9kZU5h bWUgPSBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKKyAgcmV0 dXJuIG5vZGVOYW1lID09PSAnc2VsZWN0JyB8fCBub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiBlbGVt LnR5cGUgPT09ICdmaWxlJzsKK30KKwordmFyIGRvZXNDaGFuZ2VFdmVudEJ1YmJsZSA9IGZhbHNl OworaWYgKEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSkgeworICAvLyBTZWUgYGhhbmRs ZUNoYW5nZWAgY29tbWVudCBiZWxvdworICBkb2VzQ2hhbmdlRXZlbnRCdWJibGUgPSBpc0V2ZW50 U3VwcG9ydGVkKCdjaGFuZ2UnKSAmJiAoIWRvY3VtZW50LmRvY3VtZW50TW9kZSB8fCBkb2N1bWVu dC5kb2N1bWVudE1vZGUgPiA4KTsKK30KKworZnVuY3Rpb24gbWFudWFsRGlzcGF0Y2hDaGFuZ2VF dmVudChuYXRpdmVFdmVudCkgeworICB2YXIgZXZlbnQgPSBTeW50aGV0aWNFdmVudC5nZXRQb29s ZWQoZXZlbnRUeXBlcy5jaGFuZ2UsIGFjdGl2ZUVsZW1lbnRJbnN0LCBuYXRpdmVFdmVudCwgZ2V0 RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpKTsKKyAgRXZlbnRQcm9wYWdhdG9ycy5hY2N1bXVsYXRl VHdvUGhhc2VEaXNwYXRjaGVzKGV2ZW50KTsKKworICAvLyBJZiBjaGFuZ2UgYW5kIHByb3BlcnR5 Y2hhbmdlIGJ1YmJsZWQsIHdlJ2QganVzdCBiaW5kIHRvIGl0IGxpa2UgYWxsIHRoZQorICAvLyBv dGhlciBldmVudHMgYW5kIGhhdmUgaXQgZ28gdGhyb3VnaCBSZWFjdEJyb3dzZXJFdmVudEVtaXR0 ZXIuIFNpbmNlIGl0CisgIC8vIGRvZXNuJ3QsIHdlIG1hbnVhbGx5IGxpc3RlbiBmb3IgdGhlIGV2 ZW50cyBhbmQgc28gd2UgaGF2ZSB0byBlbnF1ZXVlIGFuZAorICAvLyBwcm9jZXNzIHRoZSBhYnN0 cmFjdCBldmVudCBtYW51YWxseS4KKyAgLy8KKyAgLy8gQmF0Y2hpbmcgaXMgbmVjZXNzYXJ5IGhl cmUgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgYWxsIGV2ZW50IGhhbmRsZXJzIHJ1bgorICAvLyBi ZWZvcmUgdGhlIG5leHQgcmVyZW5kZXIgKGluY2x1ZGluZyBldmVudCBoYW5kbGVycyBhdHRhY2hl ZCB0byBhbmNlc3RvcgorICAvLyBlbGVtZW50cyBpbnN0ZWFkIG9mIGRpcmVjdGx5IG9uIHRoZSBp bnB1dCkuIFdpdGhvdXQgdGhpcywgY29udHJvbGxlZAorICAvLyBjb21wb25lbnRzIGRvbid0IHdv cmsgcHJvcGVybHkgaW4gY29uanVuY3Rpb24gd2l0aCBldmVudCBidWJibGluZyBiZWNhdXNlCisg IC8vIHRoZSBjb21wb25lbnQgaXMgcmVyZW5kZXJlZCBhbmQgdGhlIHZhbHVlIHJldmVydGVkIGJl Zm9yZSBhbGwgdGhlIGV2ZW50CisgIC8vIGhhbmRsZXJzIGNhbiBydW4uIFNlZSBodHRwczovL2dp dGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcwOC4KKyAgUmVhY3RVcGRhdGVzLmJhdGNo ZWRVcGRhdGVzKHJ1bkV2ZW50SW5CYXRjaCwgZXZlbnQpOworfQorCitmdW5jdGlvbiBydW5FdmVu dEluQmF0Y2goZXZlbnQpIHsKKyAgRXZlbnRQbHVnaW5IdWIuZW5xdWV1ZUV2ZW50cyhldmVudCk7 CisgIEV2ZW50UGx1Z2luSHViLnByb2Nlc3NFdmVudFF1ZXVlKGZhbHNlKTsKK30KKworZnVuY3Rp b24gc3RhcnRXYXRjaGluZ0ZvckNoYW5nZUV2ZW50SUU4KHRhcmdldCwgdGFyZ2V0SW5zdCkgewor ICBhY3RpdmVFbGVtZW50ID0gdGFyZ2V0OworICBhY3RpdmVFbGVtZW50SW5zdCA9IHRhcmdldElu c3Q7CisgIGFjdGl2ZUVsZW1lbnQuYXR0YWNoRXZlbnQoJ29uY2hhbmdlJywgbWFudWFsRGlzcGF0 Y2hDaGFuZ2VFdmVudCk7Cit9CisKK2Z1bmN0aW9uIHN0b3BXYXRjaGluZ0ZvckNoYW5nZUV2ZW50 SUU4KCkgeworICBpZiAoIWFjdGl2ZUVsZW1lbnQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgYWN0 aXZlRWxlbWVudC5kZXRhY2hFdmVudCgnb25jaGFuZ2UnLCBtYW51YWxEaXNwYXRjaENoYW5nZUV2 ZW50KTsKKyAgYWN0aXZlRWxlbWVudCA9IG51bGw7CisgIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVs bDsKK30KKworZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvckNoYW5nZUV2ZW50KHRvcExldmVsVHlw ZSwgdGFyZ2V0SW5zdCkgeworICBpZiAodG9wTGV2ZWxUeXBlID09PSAndG9wQ2hhbmdlJykgewor ICAgIHJldHVybiB0YXJnZXRJbnN0OworICB9Cit9CitmdW5jdGlvbiBoYW5kbGVFdmVudHNGb3JD aGFuZ2VFdmVudElFOCh0b3BMZXZlbFR5cGUsIHRhcmdldCwgdGFyZ2V0SW5zdCkgeworICBpZiAo dG9wTGV2ZWxUeXBlID09PSAndG9wRm9jdXMnKSB7CisgICAgLy8gc3RvcFdhdGNoaW5nKCkgc2hv dWxkIGJlIGEgbm9vcCBoZXJlIGJ1dCB3ZSBjYWxsIGl0IGp1c3QgaW4gY2FzZSB3ZQorICAgIC8v IG1pc3NlZCBhIGJsdXIgZXZlbnQgc29tZWhvdy4KKyAgICBzdG9wV2F0Y2hpbmdGb3JDaGFuZ2VF dmVudElFOCgpOworICAgIHN0YXJ0V2F0Y2hpbmdGb3JDaGFuZ2VFdmVudElFOCh0YXJnZXQsIHRh cmdldEluc3QpOworICB9IGVsc2UgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcEJsdXInKSB7Cisg ICAgc3RvcFdhdGNoaW5nRm9yQ2hhbmdlRXZlbnRJRTgoKTsKKyAgfQorfQorCisvKioKKyAqIFNF Q1RJT046IGhhbmRsZSBgaW5wdXRgIGV2ZW50CisgKi8KK3ZhciBpc0lucHV0RXZlbnRTdXBwb3J0 ZWQgPSBmYWxzZTsKK2lmIChFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00pIHsKKyAgLy8g SUU5IGNsYWltcyB0byBzdXBwb3J0IHRoZSBpbnB1dCBldmVudCBidXQgZmFpbHMgdG8gdHJpZ2dl ciBpdCB3aGVuCisgIC8vIGRlbGV0aW5nIHRleHQsIHNvIHdlIGlnbm9yZSBpdHMgaW5wdXQgZXZl bnRzLgorICAvLyBJRTEwKyBmaXJlIGlucHV0IGV2ZW50cyB0byBvZnRlbiwgc3VjaCB3aGVuIGEg cGxhY2Vob2xkZXIKKyAgLy8gY2hhbmdlcyBvciB3aGVuIGFuIGlucHV0IHdpdGggYSBwbGFjZWhv bGRlciBpcyBmb2N1c2VkLgorICBpc0lucHV0RXZlbnRTdXBwb3J0ZWQgPSBpc0V2ZW50U3VwcG9y dGVkKCdpbnB1dCcpICYmICghZG9jdW1lbnQuZG9jdW1lbnRNb2RlIHx8IGRvY3VtZW50LmRvY3Vt ZW50TW9kZSA+IDExKTsKK30KKworLyoqCisgKiAoRm9yIElFIDw9MTEpIFJlcGxhY2VtZW50IGdl dHRlci9zZXR0ZXIgZm9yIHRoZSBgdmFsdWVgIHByb3BlcnR5IHRoYXQgZ2V0cworICogc2V0IG9u IHRoZSBhY3RpdmUgZWxlbWVudC4KKyAqLwordmFyIG5ld1ZhbHVlUHJvcCA9IHsKKyAgZ2V0OiBm dW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIGFjdGl2ZUVsZW1lbnRWYWx1ZVByb3AuZ2V0LmNhbGwo dGhpcyk7CisgIH0sCisgIHNldDogZnVuY3Rpb24gKHZhbCkgeworICAgIC8vIENhc3QgdG8gYSBz dHJpbmcgc28gd2UgY2FuIGRvIGVxdWFsaXR5IGNoZWNrcy4KKyAgICBhY3RpdmVFbGVtZW50VmFs dWUgPSAnJyArIHZhbDsKKyAgICBhY3RpdmVFbGVtZW50VmFsdWVQcm9wLnNldC5jYWxsKHRoaXMs IHZhbCk7CisgIH0KK307CisKKy8qKgorICogKEZvciBJRSA8PTExKSBTdGFydHMgdHJhY2tpbmcg cHJvcGVydHljaGFuZ2UgZXZlbnRzIG9uIHRoZSBwYXNzZWQtaW4gZWxlbWVudAorICogYW5kIG92 ZXJyaWRlIHRoZSB2YWx1ZSBwcm9wZXJ0eSBzbyB0aGF0IHdlIGNhbiBkaXN0aW5ndWlzaCB1c2Vy IGV2ZW50cyBmcm9tCisgKiB2YWx1ZSBjaGFuZ2VzIGluIEpTLgorICovCitmdW5jdGlvbiBzdGFy dFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UodGFyZ2V0LCB0YXJnZXRJbnN0KSB7CisgIGFjdGl2ZUVs ZW1lbnQgPSB0YXJnZXQ7CisgIGFjdGl2ZUVsZW1lbnRJbnN0ID0gdGFyZ2V0SW5zdDsKKyAgYWN0 aXZlRWxlbWVudFZhbHVlID0gdGFyZ2V0LnZhbHVlOworICBhY3RpdmVFbGVtZW50VmFsdWVQcm9w ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQuY29uc3RydWN0b3IucHJv dG90eXBlLCAndmFsdWUnKTsKKworICAvLyBOb3QgZ3VhcmRlZCBpbiBhIGNhbkRlZmluZVByb3Bl cnR5IGNoZWNrOiBJRTggc3VwcG9ydHMgZGVmaW5lUHJvcGVydHkgb25seQorICAvLyBvbiBET00g ZWxlbWVudHMKKyAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFjdGl2ZUVsZW1lbnQsICd2YWx1ZScs IG5ld1ZhbHVlUHJvcCk7CisgIGlmIChhY3RpdmVFbGVtZW50LmF0dGFjaEV2ZW50KSB7CisgICAg YWN0aXZlRWxlbWVudC5hdHRhY2hFdmVudCgnb25wcm9wZXJ0eWNoYW5nZScsIGhhbmRsZVByb3Bl cnR5Q2hhbmdlKTsKKyAgfSBlbHNlIHsKKyAgICBhY3RpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVu ZXIoJ3Byb3BlcnR5Y2hhbmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2UsIGZhbHNlKTsKKyAgfQor fQorCisvKioKKyAqIChGb3IgSUUgPD0xMSkgUmVtb3ZlcyB0aGUgZXZlbnQgbGlzdGVuZXJzIGZy b20gdGhlIGN1cnJlbnRseS10cmFja2VkIGVsZW1lbnQsCisgKiBpZiBhbnkgZXhpc3RzLgorICov CitmdW5jdGlvbiBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpIHsKKyAgaWYgKCFhY3RpdmVF bGVtZW50KSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gZGVsZXRlIHJlc3RvcmVzIHRoZSBv cmlnaW5hbCBwcm9wZXJ0eSBkZWZpbml0aW9uCisgIGRlbGV0ZSBhY3RpdmVFbGVtZW50LnZhbHVl OworCisgIGlmIChhY3RpdmVFbGVtZW50LmRldGFjaEV2ZW50KSB7CisgICAgYWN0aXZlRWxlbWVu dC5kZXRhY2hFdmVudCgnb25wcm9wZXJ0eWNoYW5nZScsIGhhbmRsZVByb3BlcnR5Q2hhbmdlKTsK KyAgfSBlbHNlIHsKKyAgICBhY3RpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Byb3Bl cnR5Y2hhbmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2UsIGZhbHNlKTsKKyAgfQorCisgIGFjdGl2 ZUVsZW1lbnQgPSBudWxsOworICBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7CisgIGFjdGl2ZUVs ZW1lbnRWYWx1ZSA9IG51bGw7CisgIGFjdGl2ZUVsZW1lbnRWYWx1ZVByb3AgPSBudWxsOworfQor CisvKioKKyAqIChGb3IgSUUgPD0xMSkgSGFuZGxlcyBhIHByb3BlcnR5Y2hhbmdlIGV2ZW50LCBz ZW5kaW5nIGEgYGNoYW5nZWAgZXZlbnQgaWYKKyAqIHRoZSB2YWx1ZSBvZiB0aGUgYWN0aXZlIGVs ZW1lbnQgaGFzIGNoYW5nZWQuCisgKi8KK2Z1bmN0aW9uIGhhbmRsZVByb3BlcnR5Q2hhbmdlKG5h dGl2ZUV2ZW50KSB7CisgIGlmIChuYXRpdmVFdmVudC5wcm9wZXJ0eU5hbWUgIT09ICd2YWx1ZScp IHsKKyAgICByZXR1cm47CisgIH0KKyAgdmFyIHZhbHVlID0gbmF0aXZlRXZlbnQuc3JjRWxlbWVu dC52YWx1ZTsKKyAgaWYgKHZhbHVlID09PSBhY3RpdmVFbGVtZW50VmFsdWUpIHsKKyAgICByZXR1 cm47CisgIH0KKyAgYWN0aXZlRWxlbWVudFZhbHVlID0gdmFsdWU7CisKKyAgbWFudWFsRGlzcGF0 Y2hDaGFuZ2VFdmVudChuYXRpdmVFdmVudCk7Cit9CisKKy8qKgorICogSWYgYSBgY2hhbmdlYCBl dmVudCBzaG91bGQgYmUgZmlyZWQsIHJldHVybnMgdGhlIHRhcmdldCdzIElELgorICovCitmdW5j dGlvbiBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRFdmVudCh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3Qp IHsKKyAgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcElucHV0JykgeworICAgIC8vIEluIG1vZGVy biBicm93c2VycyAoaS5lLiwgbm90IElFOCBvciBJRTkpLCB0aGUgaW5wdXQgZXZlbnQgaXMgZXhh Y3RseQorICAgIC8vIHdoYXQgd2Ugd2FudCBzbyBmYWxsIHRocm91Z2ggaGVyZSBhbmQgdHJpZ2dl ciBhbiBhYnN0cmFjdCBldmVudAorICAgIHJldHVybiB0YXJnZXRJbnN0OworICB9Cit9CisKK2Z1 bmN0aW9uIGhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRJRSh0b3BMZXZlbFR5cGUsIHRhcmdldCwg dGFyZ2V0SW5zdCkgeworICBpZiAodG9wTGV2ZWxUeXBlID09PSAndG9wRm9jdXMnKSB7CisgICAg Ly8gSW4gSUU4LCB3ZSBjYW4gY2FwdHVyZSBhbG1vc3QgYWxsIC52YWx1ZSBjaGFuZ2VzIGJ5IGFk ZGluZyBhCisgICAgLy8gcHJvcGVydHljaGFuZ2UgaGFuZGxlciBhbmQgbG9va2luZyBmb3IgZXZl bnRzIHdpdGggcHJvcGVydHlOYW1lCisgICAgLy8gZXF1YWwgdG8gJ3ZhbHVlJworICAgIC8vIElu IElFOS0xMSwgcHJvcGVydHljaGFuZ2UgZmlyZXMgZm9yIG1vc3QgaW5wdXQgZXZlbnRzIGJ1dCBp cyBidWdneSBhbmQKKyAgICAvLyBkb2Vzbid0IGZpcmUgd2hlbiB0ZXh0IGlzIGRlbGV0ZWQsIGJ1 dCBjb252ZW5pZW50bHksIHNlbGVjdGlvbmNoYW5nZQorICAgIC8vIGFwcGVhcnMgdG8gZmlyZSBp biBhbGwgb2YgdGhlIHJlbWFpbmluZyBjYXNlcyBzbyB3ZSBjYXRjaCB0aG9zZSBhbmQKKyAgICAv LyBmb3J3YXJkIHRoZSBldmVudCBpZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWQKKyAgICAvLyBJbiBl aXRoZXIgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byBjYWxsIHRoZSBldmVudCBoYW5kbGVyIGlmIHRo ZSB2YWx1ZQorICAgIC8vIGlzIGNoYW5nZWQgZnJvbSBKUyBzbyB3ZSByZWRlZmluZSBhIHNldHRl ciBmb3IgYC52YWx1ZWAgdGhhdCB1cGRhdGVzCisgICAgLy8gb3VyIGFjdGl2ZUVsZW1lbnRWYWx1 ZSB2YXJpYWJsZSwgYWxsb3dpbmcgdXMgdG8gaWdub3JlIHRob3NlIGNoYW5nZXMKKyAgICAvLwor ICAgIC8vIHN0b3BXYXRjaGluZygpIHNob3VsZCBiZSBhIG5vb3AgaGVyZSBidXQgd2UgY2FsbCBp dCBqdXN0IGluIGNhc2Ugd2UKKyAgICAvLyBtaXNzZWQgYSBibHVyIGV2ZW50IHNvbWVob3cuCisg ICAgc3RvcFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKTsKKyAgICBzdGFydFdhdGNoaW5nRm9yVmFs dWVDaGFuZ2UodGFyZ2V0LCB0YXJnZXRJbnN0KTsKKyAgfSBlbHNlIGlmICh0b3BMZXZlbFR5cGUg PT09ICd0b3BCbHVyJykgeworICAgIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCk7CisgIH0K K30KKworLy8gRm9yIElFOCBhbmQgSUU5LgorZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvcklucHV0 RXZlbnRJRSh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QpIHsKKyAgaWYgKHRvcExldmVsVHlwZSA9 PT0gJ3RvcFNlbGVjdGlvbkNoYW5nZScgfHwgdG9wTGV2ZWxUeXBlID09PSAndG9wS2V5VXAnIHx8 IHRvcExldmVsVHlwZSA9PT0gJ3RvcEtleURvd24nKSB7CisgICAgLy8gT24gdGhlIHNlbGVjdGlv bmNoYW5nZSBldmVudCwgdGhlIHRhcmdldCBpcyBqdXN0IGRvY3VtZW50IHdoaWNoIGlzbid0Cisg ICAgLy8gaGVscGZ1bCBmb3IgdXMgc28ganVzdCBjaGVjayBhY3RpdmVFbGVtZW50IGluc3RlYWQu CisgICAgLy8KKyAgICAvLyA5OSUgb2YgdGhlIHRpbWUsIGtleWRvd24gYW5kIGtleXVwIGFyZW4n dCBuZWNlc3NhcnkuIElFOCBmYWlscyB0byBmaXJlCisgICAgLy8gcHJvcGVydHljaGFuZ2Ugb24g dGhlIGZpcnN0IGlucHV0IGV2ZW50IGFmdGVyIHNldHRpbmcgYHZhbHVlYCBmcm9tIGEKKyAgICAv LyBzY3JpcHQgYW5kIGZpcmVzIG9ubHkga2V5ZG93biwga2V5cHJlc3MsIGtleXVwLiBDYXRjaGlu ZyBrZXl1cCB1c3VhbGx5CisgICAgLy8gZ2V0cyBpdCBhbmQgY2F0Y2hpbmcga2V5ZG93biBsZXRz IHVzIGZpcmUgYW4gZXZlbnQgZm9yIHRoZSBmaXJzdAorICAgIC8vIGtleXN0cm9rZSBpZiB1c2Vy IGRvZXMgYSBrZXkgcmVwZWF0IChpdCdsbCBiZSBhIGxpdHRsZSBkZWxheWVkOiByaWdodAorICAg IC8vIGJlZm9yZSB0aGUgc2Vjb25kIGtleXN0cm9rZSkuIE90aGVyIGlucHV0IG1ldGhvZHMgKGUu Zy4sIHBhc3RlKSBzZWVtIHRvCisgICAgLy8gZmlyZSBzZWxlY3Rpb25jaGFuZ2Ugbm9ybWFsbHku CisgICAgaWYgKGFjdGl2ZUVsZW1lbnQgJiYgYWN0aXZlRWxlbWVudC52YWx1ZSAhPT0gYWN0aXZl RWxlbWVudFZhbHVlKSB7CisgICAgICBhY3RpdmVFbGVtZW50VmFsdWUgPSBhY3RpdmVFbGVtZW50 LnZhbHVlOworICAgICAgcmV0dXJuIGFjdGl2ZUVsZW1lbnRJbnN0OworICAgIH0KKyAgfQorfQor CisvKioKKyAqIFNFQ1RJT046IGhhbmRsZSBgY2xpY2tgIGV2ZW50CisgKi8KK2Z1bmN0aW9uIHNo b3VsZFVzZUNsaWNrRXZlbnQoZWxlbSkgeworICAvLyBVc2UgdGhlIGBjbGlja2AgZXZlbnQgdG8g ZGV0ZWN0IGNoYW5nZXMgdG8gY2hlY2tib3ggYW5kIHJhZGlvIGlucHV0cy4KKyAgLy8gVGhpcyBh cHByb2FjaCB3b3JrcyBhY3Jvc3MgYWxsIGJyb3dzZXJzLCB3aGVyZWFzIGBjaGFuZ2VgIGRvZXMg bm90IGZpcmUKKyAgLy8gdW50aWwgYGJsdXJgIGluIElFOC4KKyAgcmV0dXJuIGVsZW0ubm9kZU5h bWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmIChlbGVtLnR5 cGUgPT09ICdjaGVja2JveCcgfHwgZWxlbS50eXBlID09PSAncmFkaW8nKTsKK30KKworZnVuY3Rp b24gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0KSB7 CisgIGlmICh0b3BMZXZlbFR5cGUgPT09ICd0b3BDbGljaycpIHsKKyAgICByZXR1cm4gdGFyZ2V0 SW5zdDsKKyAgfQorfQorCisvKioKKyAqIFRoaXMgcGx1Z2luIGNyZWF0ZXMgYW4gYG9uQ2hhbmdl YCBldmVudCB0aGF0IG5vcm1hbGl6ZXMgY2hhbmdlIGV2ZW50cworICogYWNyb3NzIGZvcm0gZWxl bWVudHMuIFRoaXMgZXZlbnQgZmlyZXMgYXQgYSB0aW1lIHdoZW4gaXQncyBwb3NzaWJsZSB0bwor ICogY2hhbmdlIHRoZSBlbGVtZW50J3MgdmFsdWUgd2l0aG91dCBzZWVpbmcgYSBmbGlja2VyLgor ICoKKyAqIFN1cHBvcnRlZCBlbGVtZW50cyBhcmU6CisgKiAtIGlucHV0IChzZWUgYGlzVGV4dElu cHV0RWxlbWVudGApCisgKiAtIHRleHRhcmVhCisgKiAtIHNlbGVjdAorICovCit2YXIgQ2hhbmdl RXZlbnRQbHVnaW4gPSB7CisKKyAgZXZlbnRUeXBlczogZXZlbnRUeXBlcywKKworICBleHRyYWN0 RXZlbnRzOiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwg bmF0aXZlRXZlbnRUYXJnZXQpIHsKKyAgICB2YXIgdGFyZ2V0Tm9kZSA9IHRhcmdldEluc3QgPyBS ZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0YXJnZXRJbnN0KSA6IHdp bmRvdzsKKworICAgIHZhciBnZXRUYXJnZXRJbnN0RnVuYywgaGFuZGxlRXZlbnRGdW5jOworICAg IGlmIChzaG91bGRVc2VDaGFuZ2VFdmVudCh0YXJnZXROb2RlKSkgeworICAgICAgaWYgKGRvZXND aGFuZ2VFdmVudEJ1YmJsZSkgeworICAgICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdl dEluc3RGb3JDaGFuZ2VFdmVudDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhhbmRsZUV2ZW50 RnVuYyA9IGhhbmRsZUV2ZW50c0ZvckNoYW5nZUV2ZW50SUU4OworICAgICAgfQorICAgIH0gZWxz ZSBpZiAoaXNUZXh0SW5wdXRFbGVtZW50KHRhcmdldE5vZGUpKSB7CisgICAgICBpZiAoaXNJbnB1 dEV2ZW50U3VwcG9ydGVkKSB7CisgICAgICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0 SW5zdEZvcklucHV0RXZlbnQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBnZXRUYXJnZXRJbnN0 RnVuYyA9IGdldFRhcmdldEluc3RGb3JJbnB1dEV2ZW50SUU7CisgICAgICAgIGhhbmRsZUV2ZW50 RnVuYyA9IGhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRJRTsKKyAgICAgIH0KKyAgICB9IGVsc2Ug aWYgKHNob3VsZFVzZUNsaWNrRXZlbnQodGFyZ2V0Tm9kZSkpIHsKKyAgICAgIGdldFRhcmdldElu c3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQ7CisgICAgfQorCisgICAgaWYgKGdl dFRhcmdldEluc3RGdW5jKSB7CisgICAgICB2YXIgaW5zdCA9IGdldFRhcmdldEluc3RGdW5jKHRv cExldmVsVHlwZSwgdGFyZ2V0SW5zdCk7CisgICAgICBpZiAoaW5zdCkgeworICAgICAgICB2YXIg ZXZlbnQgPSBTeW50aGV0aWNFdmVudC5nZXRQb29sZWQoZXZlbnRUeXBlcy5jaGFuZ2UsIGluc3Qs IG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7CisgICAgICAgIGV2ZW50LnR5cGUgPSAn Y2hhbmdlJzsKKyAgICAgICAgRXZlbnRQcm9wYWdhdG9ycy5hY2N1bXVsYXRlVHdvUGhhc2VEaXNw YXRjaGVzKGV2ZW50KTsKKyAgICAgICAgcmV0dXJuIGV2ZW50OworICAgICAgfQorICAgIH0KKwor ICAgIGlmIChoYW5kbGVFdmVudEZ1bmMpIHsKKyAgICAgIGhhbmRsZUV2ZW50RnVuYyh0b3BMZXZl bFR5cGUsIHRhcmdldE5vZGUsIHRhcmdldEluc3QpOworICAgIH0KKyAgfQorCit9OworCittb2R1 bGUuZXhwb3J0cyA9IENoYW5nZUV2ZW50UGx1Z2luOworfSx7IjExNCI6MTE0LCIxMjIiOjEyMiwi MTIzIjoxMjMsIjEzNiI6MTM2LCIxNyI6MTcsIjIwIjoyMCwiMzQiOjM0LCI4MiI6ODIsIjkxIjo5 MX1dLDg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmln aHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4K KyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUg bGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rv cnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50 IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJl Y3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIERPTUxhenlUcmVlID0gX2Rl cmVxXyg5KTsKK3ZhciBEYW5nZXIgPSBfZGVyZXFfKDEzKTsKK3ZhciBSZWFjdERPTUNvbXBvbmVu dFRyZWUgPSBfZGVyZXFfKDM0KTsKK3ZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IF9kZXJlcV8o NjQpOworCit2YXIgY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbiA9IF9kZXJlcV8o MTA1KTsKK3ZhciBzZXRJbm5lckhUTUwgPSBfZGVyZXFfKDEyNyk7Cit2YXIgc2V0VGV4dENvbnRl bnQgPSBfZGVyZXFfKDEyOCk7CisKK2Z1bmN0aW9uIGdldE5vZGVBZnRlcihwYXJlbnROb2RlLCBu b2RlKSB7CisgIC8vIFNwZWNpYWwgY2FzZSBmb3IgdGV4dCBjb21wb25lbnRzLCB3aGljaCByZXR1 cm4gW29wZW4sIGNsb3NlXSBjb21tZW50cworICAvLyBmcm9tIGdldEhvc3ROb2RlLgorICBpZiAo QXJyYXkuaXNBcnJheShub2RlKSkgeworICAgIG5vZGUgPSBub2RlWzFdOworICB9CisgIHJldHVy biBub2RlID8gbm9kZS5uZXh0U2libGluZyA6IHBhcmVudE5vZGUuZmlyc3RDaGlsZDsKK30KKwor LyoqCisgKiBJbnNlcnRzIGBjaGlsZE5vZGVgIGFzIGEgY2hpbGQgb2YgYHBhcmVudE5vZGVgIGF0 IHRoZSBgaW5kZXhgLgorICoKKyAqIEBwYXJhbSB7RE9NRWxlbWVudH0gcGFyZW50Tm9kZSBQYXJl bnQgbm9kZSBpbiB3aGljaCB0byBpbnNlcnQuCisgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNoaWxk Tm9kZSBDaGlsZCBub2RlIHRvIGluc2VydC4KKyAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRl eCBhdCB3aGljaCB0byBpbnNlcnQgdGhlIGNoaWxkLgorICogQGludGVybmFsCisgKi8KK3ZhciBp bnNlcnRDaGlsZEF0ID0gY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbihmdW5jdGlv biAocGFyZW50Tm9kZSwgY2hpbGROb2RlLCByZWZlcmVuY2VOb2RlKSB7CisgIC8vIFdlIHJlbHkg ZXhjbHVzaXZlbHkgb24gYGluc2VydEJlZm9yZShub2RlLCBudWxsKWAgaW5zdGVhZCBvZiBhbHNv IHVzaW5nCisgIC8vIGBhcHBlbmRDaGlsZChub2RlKWAuIChVc2luZyBgdW5kZWZpbmVkYCBpcyBu b3QgYWxsb3dlZCBieSBhbGwgYnJvd3NlcnMgc28KKyAgLy8gd2UgYXJlIGNhcmVmdWwgdG8gdXNl IGBudWxsYC4pCisgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkTm9kZSwgcmVmZXJlbmNl Tm9kZSk7Cit9KTsKKworZnVuY3Rpb24gaW5zZXJ0TGF6eVRyZWVDaGlsZEF0KHBhcmVudE5vZGUs IGNoaWxkVHJlZSwgcmVmZXJlbmNlTm9kZSkgeworICBET01MYXp5VHJlZS5pbnNlcnRUcmVlQmVm b3JlKHBhcmVudE5vZGUsIGNoaWxkVHJlZSwgcmVmZXJlbmNlTm9kZSk7Cit9CisKK2Z1bmN0aW9u IG1vdmVDaGlsZChwYXJlbnROb2RlLCBjaGlsZE5vZGUsIHJlZmVyZW5jZU5vZGUpIHsKKyAgaWYg KEFycmF5LmlzQXJyYXkoY2hpbGROb2RlKSkgeworICAgIG1vdmVEZWxpbWl0ZWRUZXh0KHBhcmVu dE5vZGUsIGNoaWxkTm9kZVswXSwgY2hpbGROb2RlWzFdLCByZWZlcmVuY2VOb2RlKTsKKyAgfSBl bHNlIHsKKyAgICBpbnNlcnRDaGlsZEF0KHBhcmVudE5vZGUsIGNoaWxkTm9kZSwgcmVmZXJlbmNl Tm9kZSk7CisgIH0KK30KKworZnVuY3Rpb24gcmVtb3ZlQ2hpbGQocGFyZW50Tm9kZSwgY2hpbGRO b2RlKSB7CisgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkTm9kZSkpIHsKKyAgICB2YXIgY2xvc2lu Z0NvbW1lbnQgPSBjaGlsZE5vZGVbMV07CisgICAgY2hpbGROb2RlID0gY2hpbGROb2RlWzBdOwor ICAgIHJlbW92ZURlbGltaXRlZFRleHQocGFyZW50Tm9kZSwgY2hpbGROb2RlLCBjbG9zaW5nQ29t bWVudCk7CisgICAgcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjbG9zaW5nQ29tbWVudCk7CisgIH0K KyAgcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjaGlsZE5vZGUpOworfQorCitmdW5jdGlvbiBtb3Zl RGVsaW1pdGVkVGV4dChwYXJlbnROb2RlLCBvcGVuaW5nQ29tbWVudCwgY2xvc2luZ0NvbW1lbnQs IHJlZmVyZW5jZU5vZGUpIHsKKyAgdmFyIG5vZGUgPSBvcGVuaW5nQ29tbWVudDsKKyAgd2hpbGUg KHRydWUpIHsKKyAgICB2YXIgbmV4dE5vZGUgPSBub2RlLm5leHRTaWJsaW5nOworICAgIGluc2Vy dENoaWxkQXQocGFyZW50Tm9kZSwgbm9kZSwgcmVmZXJlbmNlTm9kZSk7CisgICAgaWYgKG5vZGUg PT09IGNsb3NpbmdDb21tZW50KSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgbm9kZSA9IG5l eHROb2RlOworICB9Cit9CisKK2Z1bmN0aW9uIHJlbW92ZURlbGltaXRlZFRleHQocGFyZW50Tm9k ZSwgc3RhcnROb2RlLCBjbG9zaW5nQ29tbWVudCkgeworICB3aGlsZSAodHJ1ZSkgeworICAgIHZh ciBub2RlID0gc3RhcnROb2RlLm5leHRTaWJsaW5nOworICAgIGlmIChub2RlID09PSBjbG9zaW5n Q29tbWVudCkgeworICAgICAgLy8gVGhlIGNsb3NpbmcgY29tbWVudCBpcyByZW1vdmVkIGJ5IFJl YWN0TXVsdGlDaGlsZC4KKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBwYXJlbnRO b2RlLnJlbW92ZUNoaWxkKG5vZGUpOworICAgIH0KKyAgfQorfQorCitmdW5jdGlvbiByZXBsYWNl RGVsaW1pdGVkVGV4dChvcGVuaW5nQ29tbWVudCwgY2xvc2luZ0NvbW1lbnQsIHN0cmluZ1RleHQp IHsKKyAgdmFyIHBhcmVudE5vZGUgPSBvcGVuaW5nQ29tbWVudC5wYXJlbnROb2RlOworICB2YXIg bm9kZUFmdGVyQ29tbWVudCA9IG9wZW5pbmdDb21tZW50Lm5leHRTaWJsaW5nOworICBpZiAobm9k ZUFmdGVyQ29tbWVudCA9PT0gY2xvc2luZ0NvbW1lbnQpIHsKKyAgICAvLyBUaGVyZSBhcmUgbm8g dGV4dCBub2RlcyBiZXR3ZWVuIHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nIGNvbW1lbnRzOyBpbnNl cnQKKyAgICAvLyBhIG5ldyBvbmUgaWYgc3RyaW5nVGV4dCBpc24ndCBlbXB0eS4KKyAgICBpZiAo c3RyaW5nVGV4dCkgeworICAgICAgaW5zZXJ0Q2hpbGRBdChwYXJlbnROb2RlLCBkb2N1bWVudC5j cmVhdGVUZXh0Tm9kZShzdHJpbmdUZXh0KSwgbm9kZUFmdGVyQ29tbWVudCk7CisgICAgfQorICB9 IGVsc2UgeworICAgIGlmIChzdHJpbmdUZXh0KSB7CisgICAgICAvLyBTZXQgdGhlIHRleHQgY29u dGVudCBvZiB0aGUgZmlyc3Qgbm9kZSBhZnRlciB0aGUgb3BlbmluZyBjb21tZW50LCBhbmQKKyAg ICAgIC8vIHJlbW92ZSBhbGwgZm9sbG93aW5nIG5vZGVzIHVwIHVudGlsIHRoZSBjbG9zaW5nIGNv bW1lbnQuCisgICAgICBzZXRUZXh0Q29udGVudChub2RlQWZ0ZXJDb21tZW50LCBzdHJpbmdUZXh0 KTsKKyAgICAgIHJlbW92ZURlbGltaXRlZFRleHQocGFyZW50Tm9kZSwgbm9kZUFmdGVyQ29tbWVu dCwgY2xvc2luZ0NvbW1lbnQpOworICAgIH0gZWxzZSB7CisgICAgICByZW1vdmVEZWxpbWl0ZWRU ZXh0KHBhcmVudE5vZGUsIG9wZW5pbmdDb21tZW50LCBjbG9zaW5nQ29tbWVudCk7CisgICAgfQor ICB9CisKKyAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgIFJlYWN0 SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oeworICAgICAgaW5zdGFu Y2VJRDogUmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUob3BlbmluZ0Nv bW1lbnQpLl9kZWJ1Z0lELAorICAgICAgdHlwZTogJ3JlcGxhY2UgdGV4dCcsCisgICAgICBwYXls b2FkOiBzdHJpbmdUZXh0CisgICAgfSk7CisgIH0KK30KKwordmFyIGRhbmdlcm91c2x5UmVwbGFj ZU5vZGVXaXRoTWFya3VwID0gRGFuZ2VyLmRhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3Vw OworaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICBkYW5nZXJvdXNseVJl cGxhY2VOb2RlV2l0aE1hcmt1cCA9IGZ1bmN0aW9uIChvbGRDaGlsZCwgbWFya3VwLCBwcmV2SW5z dGFuY2UpIHsKKyAgICBEYW5nZXIuZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXAob2xk Q2hpbGQsIG1hcmt1cCk7CisgICAgaWYgKHByZXZJbnN0YW5jZS5fZGVidWdJRCAhPT0gMCkgewor ICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7Cisg ICAgICAgIGluc3RhbmNlSUQ6IHByZXZJbnN0YW5jZS5fZGVidWdJRCwKKyAgICAgICAgdHlwZTog J3JlcGxhY2Ugd2l0aCcsCisgICAgICAgIHBheWxvYWQ6IG1hcmt1cC50b1N0cmluZygpCisgICAg ICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgdmFyIG5leHRJbnN0YW5jZSA9IFJlYWN0RE9NQ29t cG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKG1hcmt1cC5ub2RlKTsKKyAgICAgIGlmIChu ZXh0SW5zdGFuY2UuX2RlYnVnSUQgIT09IDApIHsKKyAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRp b24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7CisgICAgICAgICAgaW5zdGFuY2VJRDogbmV4 dEluc3RhbmNlLl9kZWJ1Z0lELAorICAgICAgICAgIHR5cGU6ICdtb3VudCcsCisgICAgICAgICAg cGF5bG9hZDogbWFya3VwLnRvU3RyaW5nKCkKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQor ICB9OworfQorCisvKioKKyAqIE9wZXJhdGlvbnMgZm9yIHVwZGF0aW5nIHdpdGggRE9NIGNoaWxk cmVuLgorICovCit2YXIgRE9NQ2hpbGRyZW5PcGVyYXRpb25zID0geworCisgIGRhbmdlcm91c2x5 UmVwbGFjZU5vZGVXaXRoTWFya3VwOiBkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cCwK KworICByZXBsYWNlRGVsaW1pdGVkVGV4dDogcmVwbGFjZURlbGltaXRlZFRleHQsCisKKyAgLyoq CisgICAqIFVwZGF0ZXMgYSBjb21wb25lbnQncyBjaGlsZHJlbiBieSBwcm9jZXNzaW5nIGEgc2Vy aWVzIG9mIHVwZGF0ZXMuIFRoZQorICAgKiB1cGRhdGUgY29uZmlndXJhdGlvbnMgYXJlIGVhY2gg ZXhwZWN0ZWQgdG8gaGF2ZSBhIGBwYXJlbnROb2RlYCBwcm9wZXJ0eS4KKyAgICoKKyAgICogQHBh cmFtIHthcnJheTxvYmplY3Q+fSB1cGRhdGVzIExpc3Qgb2YgdXBkYXRlIGNvbmZpZ3VyYXRpb25z LgorICAgKiBAaW50ZXJuYWwKKyAgICovCisgIHByb2Nlc3NVcGRhdGVzOiBmdW5jdGlvbiAocGFy ZW50Tm9kZSwgdXBkYXRlcykgeworICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlv bicpIHsKKyAgICAgIHZhciBwYXJlbnROb2RlRGVidWdJRCA9IFJlYWN0RE9NQ29tcG9uZW50VHJl ZS5nZXRJbnN0YW5jZUZyb21Ob2RlKHBhcmVudE5vZGUpLl9kZWJ1Z0lEOworICAgIH0KKworICAg IGZvciAodmFyIGsgPSAwOyBrIDwgdXBkYXRlcy5sZW5ndGg7IGsrKykgeworICAgICAgdmFyIHVw ZGF0ZSA9IHVwZGF0ZXNba107CisgICAgICBzd2l0Y2ggKHVwZGF0ZS50eXBlKSB7CisgICAgICAg IGNhc2UgJ0lOU0VSVF9NQVJLVVAnOgorICAgICAgICAgIGluc2VydExhenlUcmVlQ2hpbGRBdChw YXJlbnROb2RlLCB1cGRhdGUuY29udGVudCwgZ2V0Tm9kZUFmdGVyKHBhcmVudE5vZGUsIHVwZGF0 ZS5hZnRlck5vZGUpKTsKKyAgICAgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rp b24nKSB7CisgICAgICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0 T3BlcmF0aW9uKHsKKyAgICAgICAgICAgICAgaW5zdGFuY2VJRDogcGFyZW50Tm9kZURlYnVnSUQs CisgICAgICAgICAgICAgIHR5cGU6ICdpbnNlcnQgY2hpbGQnLAorICAgICAgICAgICAgICBwYXls b2FkOiB7IHRvSW5kZXg6IHVwZGF0ZS50b0luZGV4LCBjb250ZW50OiB1cGRhdGUuY29udGVudC50 b1N0cmluZygpIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVh azsKKyAgICAgICAgY2FzZSAnTU9WRV9FWElTVElORyc6CisgICAgICAgICAgbW92ZUNoaWxkKHBh cmVudE5vZGUsIHVwZGF0ZS5mcm9tTm9kZSwgZ2V0Tm9kZUFmdGVyKHBhcmVudE5vZGUsIHVwZGF0 ZS5hZnRlck5vZGUpKTsKKyAgICAgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rp b24nKSB7CisgICAgICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0 T3BlcmF0aW9uKHsKKyAgICAgICAgICAgICAgaW5zdGFuY2VJRDogcGFyZW50Tm9kZURlYnVnSUQs CisgICAgICAgICAgICAgIHR5cGU6ICdtb3ZlIGNoaWxkJywKKyAgICAgICAgICAgICAgcGF5bG9h ZDogeyBmcm9tSW5kZXg6IHVwZGF0ZS5mcm9tSW5kZXgsIHRvSW5kZXg6IHVwZGF0ZS50b0luZGV4 IH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAg ICAgY2FzZSAnU0VUX01BUktVUCc6CisgICAgICAgICAgc2V0SW5uZXJIVE1MKHBhcmVudE5vZGUs IHVwZGF0ZS5jb250ZW50KTsKKyAgICAgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1 Y3Rpb24nKSB7CisgICAgICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25I b3N0T3BlcmF0aW9uKHsKKyAgICAgICAgICAgICAgaW5zdGFuY2VJRDogcGFyZW50Tm9kZURlYnVn SUQsCisgICAgICAgICAgICAgIHR5cGU6ICdyZXBsYWNlIGNoaWxkcmVuJywKKyAgICAgICAgICAg ICAgcGF5bG9hZDogdXBkYXRlLmNvbnRlbnQudG9TdHJpbmcoKQorICAgICAgICAgICAgfSk7Cisg ICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdURVhUX0NPTlRFTlQn OgorICAgICAgICAgIHNldFRleHRDb250ZW50KHBhcmVudE5vZGUsIHVwZGF0ZS5jb250ZW50KTsK KyAgICAgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAg ICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHsKKyAg ICAgICAgICAgICAgaW5zdGFuY2VJRDogcGFyZW50Tm9kZURlYnVnSUQsCisgICAgICAgICAgICAg IHR5cGU6ICdyZXBsYWNlIHRleHQnLAorICAgICAgICAgICAgICBwYXlsb2FkOiB1cGRhdGUuY29u dGVudC50b1N0cmluZygpCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9CisgICAgICAgICAg YnJlYWs7CisgICAgICAgIGNhc2UgJ1JFTU9WRV9OT0RFJzoKKyAgICAgICAgICByZW1vdmVDaGls ZChwYXJlbnROb2RlLCB1cGRhdGUuZnJvbU5vZGUpOworICAgICAgICAgIGlmICgiZGV2ZWxvcG1l bnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9u LmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oeworICAgICAgICAgICAgICBpbnN0YW5jZUlEOiBw YXJlbnROb2RlRGVidWdJRCwKKyAgICAgICAgICAgICAgdHlwZTogJ3JlbW92ZSBjaGlsZCcsCisg ICAgICAgICAgICAgIHBheWxvYWQ6IHsgZnJvbUluZGV4OiB1cGRhdGUuZnJvbUluZGV4IH0KKyAg ICAgICAgICAgIH0pOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAg ICB9CisgIH0KKworfTsKKworbW9kdWxlLmV4cG9ydHMgPSBET01DaGlsZHJlbk9wZXJhdGlvbnM7 Cit9LHsiMTA1IjoxMDUsIjEyNyI6MTI3LCIxMjgiOjEyOCwiMTMiOjEzLCIzNCI6MzQsIjY0Ijo2 NCwiOSI6OX1dLDk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBD b3B5cmlnaHQgMjAxNS1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNl cnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qt c3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBk aXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2Yg cGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2Ft ZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIERPTU5hbWVzcGFj ZXMgPSBfZGVyZXFfKDEwKTsKK3ZhciBzZXRJbm5lckhUTUwgPSBfZGVyZXFfKDEyNyk7CisKK3Zh ciBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uID0gX2RlcmVxXygxMDUpOwordmFy IHNldFRleHRDb250ZW50ID0gX2RlcmVxXygxMjgpOworCit2YXIgRUxFTUVOVF9OT0RFX1RZUEUg PSAxOwordmFyIERPQ1VNRU5UX0ZSQUdNRU5UX05PREVfVFlQRSA9IDExOworCisvKioKKyAqIElu IElFICg4LTExKSBhbmQgRWRnZSwgYXBwZW5kaW5nIG5vZGVzIHdpdGggbm8gY2hpbGRyZW4gaXMg ZHJhbWF0aWNhbGx5CisgKiBmYXN0ZXIgdGhhbiBhcHBlbmRpbmcgYSBmdWxsIHN1YnRyZWUsIHNv IHdlIGVzc2VudGlhbGx5IHF1ZXVlIHVwIHRoZQorICogLmFwcGVuZENoaWxkIGNhbGxzIGhlcmUg YW5kIGFwcGx5IHRoZW0gc28gZWFjaCBub2RlIGlzIGFkZGVkIHRvIGl0cyBwYXJlbnQKKyAqIGJl Zm9yZSBhbnkgY2hpbGRyZW4gYXJlIGFkZGVkLgorICoKKyAqIEluIG90aGVyIGJyb3dzZXJzLCBk b2luZyBzbyBpcyBzbG93ZXIgb3IgbmV1dHJhbCBjb21wYXJlZCB0byB0aGUgb3RoZXIgb3JkZXIK KyAqIChpbiBGaXJlZm94LCB0d2ljZSBhcyBzbG93KSBzbyB3ZSBvbmx5IGRvIHRoaXMgaW52ZXJz aW9uIGluIElFLgorICoKKyAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vc3BpY3lqL2lubmVyaHRt bC12cy1jcmVhdGVlbGVtZW50LXZzLWNsb25lbm9kZS4KKyAqLwordmFyIGVuYWJsZUxhenkgPSB0 eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudC5kb2N1bWVu dE1vZGUgPT09ICdudW1iZXInIHx8IHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYm IHR5cGVvZiBuYXZpZ2F0b3IudXNlckFnZW50ID09PSAnc3RyaW5nJyAmJiAvXGJFZGdlXC9cZC8u dGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKKworZnVuY3Rpb24gaW5zZXJ0VHJlZUNoaWxkcmVu KHRyZWUpIHsKKyAgaWYgKCFlbmFibGVMYXp5KSB7CisgICAgcmV0dXJuOworICB9CisgIHZhciBu b2RlID0gdHJlZS5ub2RlOworICB2YXIgY2hpbGRyZW4gPSB0cmVlLmNoaWxkcmVuOworICBpZiAo Y2hpbGRyZW4ubGVuZ3RoKSB7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5n dGg7IGkrKykgeworICAgICAgaW5zZXJ0VHJlZUJlZm9yZShub2RlLCBjaGlsZHJlbltpXSwgbnVs bCk7CisgICAgfQorICB9IGVsc2UgaWYgKHRyZWUuaHRtbCAhPSBudWxsKSB7CisgICAgc2V0SW5u ZXJIVE1MKG5vZGUsIHRyZWUuaHRtbCk7CisgIH0gZWxzZSBpZiAodHJlZS50ZXh0ICE9IG51bGwp IHsKKyAgICBzZXRUZXh0Q29udGVudChub2RlLCB0cmVlLnRleHQpOworICB9Cit9CisKK3ZhciBp bnNlcnRUcmVlQmVmb3JlID0gY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbihmdW5j dGlvbiAocGFyZW50Tm9kZSwgdHJlZSwgcmVmZXJlbmNlTm9kZSkgeworICAvLyBEb2N1bWVudEZy YWdtZW50cyBhcmVuJ3QgYWN0dWFsbHkgcGFydCBvZiB0aGUgRE9NIGFmdGVyIGluc2VydGlvbiBz bworICAvLyBhcHBlbmRpbmcgY2hpbGRyZW4gd29uJ3QgdXBkYXRlIHRoZSBET00uIFdlIG5lZWQg dG8gZW5zdXJlIHRoZSBmcmFnbWVudAorICAvLyBpcyBwcm9wZXJseSBwb3B1bGF0ZWQgZmlyc3Qs IGJyZWFraW5nIG91dCBvZiBvdXIgbGF6eSBhcHByb2FjaCBmb3IganVzdAorICAvLyB0aGlzIGxl dmVsLiBBbHNvLCBzb21lIDxvYmplY3Q+IHBsdWdpbnMgKGxpa2UgRmxhc2ggUGxheWVyKSB3aWxs IHJlYWQKKyAgLy8gPHBhcmFtPiBub2RlcyBpbW1lZGlhdGVseSB1cG9uIGluc2VydGlvbiBpbnRv IHRoZSBET00sIHNvIDxvYmplY3Q+CisgIC8vIG11c3QgYWxzbyBiZSBwb3B1bGF0ZWQgcHJpb3Ig dG8gaW5zZXJ0aW9uIGludG8gdGhlIERPTS4KKyAgaWYgKHRyZWUubm9kZS5ub2RlVHlwZSA9PT0g RE9DVU1FTlRfRlJBR01FTlRfTk9ERV9UWVBFIHx8IHRyZWUubm9kZS5ub2RlVHlwZSA9PT0gRUxF TUVOVF9OT0RFX1RZUEUgJiYgdHJlZS5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdv YmplY3QnICYmICh0cmVlLm5vZGUubmFtZXNwYWNlVVJJID09IG51bGwgfHwgdHJlZS5ub2RlLm5h bWVzcGFjZVVSSSA9PT0gRE9NTmFtZXNwYWNlcy5odG1sKSkgeworICAgIGluc2VydFRyZWVDaGls ZHJlbih0cmVlKTsKKyAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZSh0cmVlLm5vZGUsIHJlZmVy ZW5jZU5vZGUpOworICB9IGVsc2UgeworICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRyZWUu bm9kZSwgcmVmZXJlbmNlTm9kZSk7CisgICAgaW5zZXJ0VHJlZUNoaWxkcmVuKHRyZWUpOworICB9 Cit9KTsKKworZnVuY3Rpb24gcmVwbGFjZUNoaWxkV2l0aFRyZWUob2xkTm9kZSwgbmV3VHJlZSkg eworICBvbGROb2RlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5ld1RyZWUubm9kZSwgb2xkTm9k ZSk7CisgIGluc2VydFRyZWVDaGlsZHJlbihuZXdUcmVlKTsKK30KKworZnVuY3Rpb24gcXVldWVD aGlsZChwYXJlbnRUcmVlLCBjaGlsZFRyZWUpIHsKKyAgaWYgKGVuYWJsZUxhenkpIHsKKyAgICBw YXJlbnRUcmVlLmNoaWxkcmVuLnB1c2goY2hpbGRUcmVlKTsKKyAgfSBlbHNlIHsKKyAgICBwYXJl bnRUcmVlLm5vZGUuYXBwZW5kQ2hpbGQoY2hpbGRUcmVlLm5vZGUpOworICB9Cit9CisKK2Z1bmN0 aW9uIHF1ZXVlSFRNTCh0cmVlLCBodG1sKSB7CisgIGlmIChlbmFibGVMYXp5KSB7CisgICAgdHJl ZS5odG1sID0gaHRtbDsKKyAgfSBlbHNlIHsKKyAgICBzZXRJbm5lckhUTUwodHJlZS5ub2RlLCBo dG1sKTsKKyAgfQorfQorCitmdW5jdGlvbiBxdWV1ZVRleHQodHJlZSwgdGV4dCkgeworICBpZiAo ZW5hYmxlTGF6eSkgeworICAgIHRyZWUudGV4dCA9IHRleHQ7CisgIH0gZWxzZSB7CisgICAgc2V0 VGV4dENvbnRlbnQodHJlZS5ub2RlLCB0ZXh0KTsKKyAgfQorfQorCitmdW5jdGlvbiB0b1N0cmlu ZygpIHsKKyAgcmV0dXJuIHRoaXMubm9kZS5ub2RlTmFtZTsKK30KKworZnVuY3Rpb24gRE9NTGF6 eVRyZWUobm9kZSkgeworICByZXR1cm4geworICAgIG5vZGU6IG5vZGUsCisgICAgY2hpbGRyZW46 IFtdLAorICAgIGh0bWw6IG51bGwsCisgICAgdGV4dDogbnVsbCwKKyAgICB0b1N0cmluZzogdG9T dHJpbmcKKyAgfTsKK30KKworRE9NTGF6eVRyZWUuaW5zZXJ0VHJlZUJlZm9yZSA9IGluc2VydFRy ZWVCZWZvcmU7CitET01MYXp5VHJlZS5yZXBsYWNlQ2hpbGRXaXRoVHJlZSA9IHJlcGxhY2VDaGls ZFdpdGhUcmVlOworRE9NTGF6eVRyZWUucXVldWVDaGlsZCA9IHF1ZXVlQ2hpbGQ7CitET01MYXp5 VHJlZS5xdWV1ZUhUTUwgPSBxdWV1ZUhUTUw7CitET01MYXp5VHJlZS5xdWV1ZVRleHQgPSBxdWV1 ZVRleHQ7CisKK21vZHVsZS5leHBvcnRzID0gRE9NTGF6eVRyZWU7Cit9LHsiMTAiOjEwLCIxMDUi OjEwNSwiMTI3IjoxMjcsIjEyOCI6MTI4fV0sMTA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4 cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgor ICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vu c2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0Ug ZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRp b25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVO VFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsK KwordmFyIERPTU5hbWVzcGFjZXMgPSB7CisgIGh0bWw6ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5 L3hodG1sJywKKyAgbWF0aG1sOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCcs CisgIHN2ZzogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJworfTsKKworbW9kdWxlLmV4cG9y dHMgPSBET01OYW1lc3BhY2VzOworfSx7fV0sMTE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4 cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgor ICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vu c2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0Ug ZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRp b25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVO VFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsK KwordmFyIF9wcm9kSW52YXJpYW50ID0gX2RlcmVxXygxMjUpOworCit2YXIgaW52YXJpYW50ID0g X2RlcmVxXygxNTApOworCitmdW5jdGlvbiBjaGVja01hc2sodmFsdWUsIGJpdG1hc2spIHsKKyAg cmV0dXJuICh2YWx1ZSAmIGJpdG1hc2spID09PSBiaXRtYXNrOworfQorCit2YXIgRE9NUHJvcGVy dHlJbmplY3Rpb24gPSB7CisgIC8qKgorICAgKiBNYXBwaW5nIGZyb20gbm9ybWFsaXplZCwgY2Ft ZWxjYXNlZCBwcm9wZXJ0eSBuYW1lcyB0byBhIGNvbmZpZ3VyYXRpb24gdGhhdAorICAgKiBzcGVj aWZpZXMgaG93IHRoZSBhc3NvY2lhdGVkIERPTSBwcm9wZXJ0eSBzaG91bGQgYmUgYWNjZXNzZWQg b3IgcmVuZGVyZWQuCisgICAqLworICBNVVNUX1VTRV9QUk9QRVJUWTogMHgxLAorICBIQVNfQk9P TEVBTl9WQUxVRTogMHg0LAorICBIQVNfTlVNRVJJQ19WQUxVRTogMHg4LAorICBIQVNfUE9TSVRJ VkVfTlVNRVJJQ19WQUxVRTogMHgxMCB8IDB4OCwKKyAgSEFTX09WRVJMT0FERURfQk9PTEVBTl9W QUxVRTogMHgyMCwKKworICAvKioKKyAgICogSW5qZWN0IHNvbWUgc3BlY2lhbGl6ZWQga25vd2xl ZGdlIGFib3V0IHRoZSBET00uIFRoaXMgdGFrZXMgYSBjb25maWcgb2JqZWN0CisgICAqIHdpdGgg dGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgorICAgKgorICAgKiBpc0N1c3RvbUF0dHJpYnV0ZTog ZnVuY3Rpb24gdGhhdCBnaXZlbiBhbiBhdHRyaWJ1dGUgbmFtZSB3aWxsIHJldHVybiB0cnVlCisg ICAqIGlmIGl0IGNhbiBiZSBpbnNlcnRlZCBpbnRvIHRoZSBET00gdmVyYmF0aW0uIFVzZWZ1bCBm b3IgZGF0YS0qIG9yIGFyaWEtKgorICAgKiBhdHRyaWJ1dGVzIHdoZXJlIGl0J3MgaW1wb3NzaWJs ZSB0byBlbnVtZXJhdGUgYWxsIG9mIHRoZSBwb3NzaWJsZQorICAgKiBhdHRyaWJ1dGUgbmFtZXMs CisgICAqCisgICAqIFByb3BlcnRpZXM6IG9iamVjdCBtYXBwaW5nIERPTSBwcm9wZXJ0eSBuYW1l IHRvIG9uZSBvZiB0aGUKKyAgICogRE9NUHJvcGVydHlJbmplY3Rpb24gY29uc3RhbnRzIG9yIG51 bGwuIElmIHlvdXIgYXR0cmlidXRlIGlzbid0IGluIGhlcmUsCisgICAqIGl0IHdvbid0IGdldCB3 cml0dGVuIHRvIHRoZSBET00uCisgICAqCisgICAqIERPTUF0dHJpYnV0ZU5hbWVzOiBvYmplY3Qg bWFwcGluZyBSZWFjdCBhdHRyaWJ1dGUgbmFtZSB0byB0aGUgRE9NCisgICAqIGF0dHJpYnV0ZSBu YW1lLiBBdHRyaWJ1dGUgbmFtZXMgbm90IHNwZWNpZmllZCB1c2UgdGhlICoqbG93ZXJjYXNlKioK KyAgICogbm9ybWFsaXplZCBuYW1lLgorICAgKgorICAgKiBET01BdHRyaWJ1dGVOYW1lc3BhY2Vz OiBvYmplY3QgbWFwcGluZyBSZWFjdCBhdHRyaWJ1dGUgbmFtZSB0byB0aGUgRE9NCisgICAqIGF0 dHJpYnV0ZSBuYW1lc3BhY2UgVVJMLiAoQXR0cmlidXRlIG5hbWVzIG5vdCBzcGVjaWZpZWQgdXNl IG5vIG5hbWVzcGFjZS4pCisgICAqCisgICAqIERPTVByb3BlcnR5TmFtZXM6IHNpbWlsYXIgdG8g RE9NQXR0cmlidXRlTmFtZXMgYnV0IGZvciBET00gcHJvcGVydGllcy4KKyAgICogUHJvcGVydHkg bmFtZXMgbm90IHNwZWNpZmllZCB1c2UgdGhlIG5vcm1hbGl6ZWQgbmFtZS4KKyAgICoKKyAgICog RE9NTXV0YXRpb25NZXRob2RzOiBQcm9wZXJ0aWVzIHRoYXQgcmVxdWlyZSBzcGVjaWFsIG11dGF0 aW9uIG1ldGhvZHMuIElmCisgICAqIGB2YWx1ZWAgaXMgdW5kZWZpbmVkLCB0aGUgbXV0YXRpb24g bWV0aG9kIHNob3VsZCB1bnNldCB0aGUgcHJvcGVydHkuCisgICAqCisgICAqIEBwYXJhbSB7b2Jq ZWN0fSBkb21Qcm9wZXJ0eUNvbmZpZyB0aGUgY29uZmlnIGFzIGRlc2NyaWJlZCBhYm92ZS4KKyAg ICovCisgIGluamVjdERPTVByb3BlcnR5Q29uZmlnOiBmdW5jdGlvbiAoZG9tUHJvcGVydHlDb25m aWcpIHsKKyAgICB2YXIgSW5qZWN0aW9uID0gRE9NUHJvcGVydHlJbmplY3Rpb247CisgICAgdmFy IFByb3BlcnRpZXMgPSBkb21Qcm9wZXJ0eUNvbmZpZy5Qcm9wZXJ0aWVzIHx8IHt9OworICAgIHZh ciBET01BdHRyaWJ1dGVOYW1lc3BhY2VzID0gZG9tUHJvcGVydHlDb25maWcuRE9NQXR0cmlidXRl TmFtZXNwYWNlcyB8fCB7fTsKKyAgICB2YXIgRE9NQXR0cmlidXRlTmFtZXMgPSBkb21Qcm9wZXJ0 eUNvbmZpZy5ET01BdHRyaWJ1dGVOYW1lcyB8fCB7fTsKKyAgICB2YXIgRE9NUHJvcGVydHlOYW1l cyA9IGRvbVByb3BlcnR5Q29uZmlnLkRPTVByb3BlcnR5TmFtZXMgfHwge307CisgICAgdmFyIERP TU11dGF0aW9uTWV0aG9kcyA9IGRvbVByb3BlcnR5Q29uZmlnLkRPTU11dGF0aW9uTWV0aG9kcyB8 fCB7fTsKKworICAgIGlmIChkb21Qcm9wZXJ0eUNvbmZpZy5pc0N1c3RvbUF0dHJpYnV0ZSkgewor ICAgICAgRE9NUHJvcGVydHkuX2lzQ3VzdG9tQXR0cmlidXRlRnVuY3Rpb25zLnB1c2goZG9tUHJv cGVydHlDb25maWcuaXNDdXN0b21BdHRyaWJ1dGUpOworICAgIH0KKworICAgIGZvciAodmFyIHBy b3BOYW1lIGluIFByb3BlcnRpZXMpIHsKKyAgICAgICEhRE9NUHJvcGVydHkucHJvcGVydGllcy5o YXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicg PyBpbnZhcmlhbnQoZmFsc2UsICdpbmplY3RET01Qcm9wZXJ0eUNvbmZpZyguLi4pOiBZb3VcJ3Jl IHRyeWluZyB0byBpbmplY3QgRE9NIHByb3BlcnR5IFwnJXNcJyB3aGljaCBoYXMgYWxyZWFkeSBi ZWVuIGluamVjdGVkLiBZb3UgbWF5IGJlIGFjY2lkZW50YWxseSBpbmplY3RpbmcgdGhlIHNhbWUg RE9NIHByb3BlcnR5IGNvbmZpZyB0d2ljZSwgb3IgeW91IG1heSBiZSBpbmplY3RpbmcgdHdvIGNv bmZpZ3MgdGhhdCBoYXZlIGNvbmZsaWN0aW5nIHByb3BlcnR5IG5hbWVzLicsIHByb3BOYW1lKSA6 IF9wcm9kSW52YXJpYW50KCc0OCcsIHByb3BOYW1lKSA6IHZvaWQgMDsKKworICAgICAgdmFyIGxv d2VyQ2FzZWQgPSBwcm9wTmFtZS50b0xvd2VyQ2FzZSgpOworICAgICAgdmFyIHByb3BDb25maWcg PSBQcm9wZXJ0aWVzW3Byb3BOYW1lXTsKKworICAgICAgdmFyIHByb3BlcnR5SW5mbyA9IHsKKyAg ICAgICAgYXR0cmlidXRlTmFtZTogbG93ZXJDYXNlZCwKKyAgICAgICAgYXR0cmlidXRlTmFtZXNw YWNlOiBudWxsLAorICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BOYW1lLAorICAgICAgICBtdXRh dGlvbk1ldGhvZDogbnVsbCwKKworICAgICAgICBtdXN0VXNlUHJvcGVydHk6IGNoZWNrTWFzayhw cm9wQ29uZmlnLCBJbmplY3Rpb24uTVVTVF9VU0VfUFJPUEVSVFkpLAorICAgICAgICBoYXNCb29s ZWFuVmFsdWU6IGNoZWNrTWFzayhwcm9wQ29uZmlnLCBJbmplY3Rpb24uSEFTX0JPT0xFQU5fVkFM VUUpLAorICAgICAgICBoYXNOdW1lcmljVmFsdWU6IGNoZWNrTWFzayhwcm9wQ29uZmlnLCBJbmpl Y3Rpb24uSEFTX05VTUVSSUNfVkFMVUUpLAorICAgICAgICBoYXNQb3NpdGl2ZU51bWVyaWNWYWx1 ZTogY2hlY2tNYXNrKHByb3BDb25maWcsIEluamVjdGlvbi5IQVNfUE9TSVRJVkVfTlVNRVJJQ19W QUxVRSksCisgICAgICAgIGhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWU6IGNoZWNrTWFzayhwcm9w Q29uZmlnLCBJbmplY3Rpb24uSEFTX09WRVJMT0FERURfQk9PTEVBTl9WQUxVRSkKKyAgICAgIH07 CisgICAgICAhKHByb3BlcnR5SW5mby5oYXNCb29sZWFuVmFsdWUgKyBwcm9wZXJ0eUluZm8uaGFz TnVtZXJpY1ZhbHVlICsgcHJvcGVydHlJbmZvLmhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWUgPD0g MSkgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdE T01Qcm9wZXJ0eTogVmFsdWUgY2FuIGJlIG9uZSBvZiBib29sZWFuLCBvdmVybG9hZGVkIGJvb2xl YW4sIG9yIG51bWVyaWMgdmFsdWUsIGJ1dCBub3QgYSBjb21iaW5hdGlvbjogJXMnLCBwcm9wTmFt ZSkgOiBfcHJvZEludmFyaWFudCgnNTAnLCBwcm9wTmFtZSkgOiB2b2lkIDA7CisKKyAgICAgIGlm ICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICAgRE9NUHJvcGVydHku Z2V0UG9zc2libGVTdGFuZGFyZE5hbWVbbG93ZXJDYXNlZF0gPSBwcm9wTmFtZTsKKyAgICAgIH0K KworICAgICAgaWYgKERPTUF0dHJpYnV0ZU5hbWVzLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkg eworICAgICAgICB2YXIgYXR0cmlidXRlTmFtZSA9IERPTUF0dHJpYnV0ZU5hbWVzW3Byb3BOYW1l XTsKKyAgICAgICAgcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lOwor ICAgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAgICAg RE9NUHJvcGVydHkuZ2V0UG9zc2libGVTdGFuZGFyZE5hbWVbYXR0cmlidXRlTmFtZV0gPSBwcm9w TmFtZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoRE9NQXR0cmlidXRlTmFtZXNw YWNlcy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHsKKyAgICAgICAgcHJvcGVydHlJbmZvLmF0 dHJpYnV0ZU5hbWVzcGFjZSA9IERPTUF0dHJpYnV0ZU5hbWVzcGFjZXNbcHJvcE5hbWVdOworICAg ICAgfQorCisgICAgICBpZiAoRE9NUHJvcGVydHlOYW1lcy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFt ZSkpIHsKKyAgICAgICAgcHJvcGVydHlJbmZvLnByb3BlcnR5TmFtZSA9IERPTVByb3BlcnR5TmFt ZXNbcHJvcE5hbWVdOworICAgICAgfQorCisgICAgICBpZiAoRE9NTXV0YXRpb25NZXRob2RzLmhh c093blByb3BlcnR5KHByb3BOYW1lKSkgeworICAgICAgICBwcm9wZXJ0eUluZm8ubXV0YXRpb25N ZXRob2QgPSBET01NdXRhdGlvbk1ldGhvZHNbcHJvcE5hbWVdOworICAgICAgfQorCisgICAgICBE T01Qcm9wZXJ0eS5wcm9wZXJ0aWVzW3Byb3BOYW1lXSA9IHByb3BlcnR5SW5mbzsKKyAgICB9Cisg IH0KK307CisKKy8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi8KK3ZhciBBVFRSSUJVVEVfTkFN RV9TVEFSVF9DSEFSID0gJzpBLVpfYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1 MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBE XFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVG RENGXFx1RkRGMC1cXHVGRkZEJzsKKy8qIGVzbGludC1lbmFibGUgbWF4LWxlbiAqLworCisvKioK KyAqIERPTVByb3BlcnR5IGV4cG9ydHMgbG9va3VwIG9iamVjdHMgdGhhdCBjYW4gYmUgdXNlZCBs aWtlIGZ1bmN0aW9uczoKKyAqCisgKiAgID4gRE9NUHJvcGVydHkuaXNWYWxpZFsnaWQnXQorICog ICB0cnVlCisgKiAgID4gRE9NUHJvcGVydHkuaXNWYWxpZFsnZm9vYmFyJ10KKyAqICAgdW5kZWZp bmVkCisgKgorICogQWx0aG91Z2ggdGhpcyBtYXkgYmUgY29uZnVzaW5nLCBpdCBwZXJmb3JtcyBi ZXR0ZXIgaW4gZ2VuZXJhbC4KKyAqCisgKiBAc2VlIGh0dHA6Ly9qc3BlcmYuY29tL2tleS1leGlz dHMKKyAqIEBzZWUgaHR0cDovL2pzcGVyZi5jb20va2V5LW1pc3NpbmcKKyAqLwordmFyIERPTVBy b3BlcnR5ID0geworCisgIElEX0FUVFJJQlVURV9OQU1FOiAnZGF0YS1yZWFjdGlkJywKKyAgUk9P VF9BVFRSSUJVVEVfTkFNRTogJ2RhdGEtcmVhY3Ryb290JywKKworICBBVFRSSUJVVEVfTkFNRV9T VEFSVF9DSEFSOiBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSLAorICBBVFRSSUJVVEVfTkFNRV9D SEFSOiBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSICsgJ1xcLS4wLTlcXHUwMEI3XFx1MDMwMC1c XHUwMzZGXFx1MjAzRi1cXHUyMDQwJywKKworICAvKioKKyAgICogTWFwIGZyb20gcHJvcGVydHkg InN0YW5kYXJkIG5hbWUiIHRvIGFuIG9iamVjdCB3aXRoIGluZm8gYWJvdXQgaG93IHRvIHNldAor ICAgKiB0aGUgcHJvcGVydHkgaW4gdGhlIERPTS4gRWFjaCBvYmplY3QgY29udGFpbnM6CisgICAq CisgICAqIGF0dHJpYnV0ZU5hbWU6CisgICAqICAgVXNlZCB3aGVuIHJlbmRlcmluZyBtYXJrdXAg b3Igd2l0aCBgKkF0dHJpYnV0ZSgpYC4KKyAgICogYXR0cmlidXRlTmFtZXNwYWNlCisgICAqIHBy b3BlcnR5TmFtZToKKyAgICogICBVc2VkIG9uIERPTSBub2RlIGluc3RhbmNlcy4gKFRoaXMgaW5j bHVkZXMgcHJvcGVydGllcyB0aGF0IG11dGF0ZSBkdWUgdG8KKyAgICogICBleHRlcm5hbCBmYWN0 b3JzLikKKyAgICogbXV0YXRpb25NZXRob2Q6CisgICAqICAgSWYgbm9uLW51bGwsIHVzZWQgaW5z dGVhZCBvZiB0aGUgcHJvcGVydHkgb3IgYHNldEF0dHJpYnV0ZSgpYCBhZnRlcgorICAgKiAgIGlu aXRpYWwgcmVuZGVyLgorICAgKiBtdXN0VXNlUHJvcGVydHk6CisgICAqICAgV2hldGhlciB0aGUg cHJvcGVydHkgbXVzdCBiZSBhY2Nlc3NlZCBhbmQgbXV0YXRlZCBhcyBhbiBvYmplY3QgcHJvcGVy dHkuCisgICAqIGhhc0Jvb2xlYW5WYWx1ZToKKyAgICogICBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBz aG91bGQgYmUgcmVtb3ZlZCB3aGVuIHNldCB0byBhIGZhbHNleSB2YWx1ZS4KKyAgICogaGFzTnVt ZXJpY1ZhbHVlOgorICAgKiAgIFdoZXRoZXIgdGhlIHByb3BlcnR5IG11c3QgYmUgbnVtZXJpYyBv ciBwYXJzZSBhcyBhIG51bWVyaWMgYW5kIHNob3VsZCBiZQorICAgKiAgIHJlbW92ZWQgd2hlbiBz ZXQgdG8gYSBmYWxzZXkgdmFsdWUuCisgICAqIGhhc1Bvc2l0aXZlTnVtZXJpY1ZhbHVlOgorICAg KiAgIFdoZXRoZXIgdGhlIHByb3BlcnR5IG11c3QgYmUgcG9zaXRpdmUgbnVtZXJpYyBvciBwYXJz ZSBhcyBhIHBvc2l0aXZlCisgICAqICAgbnVtZXJpYyBhbmQgc2hvdWxkIGJlIHJlbW92ZWQgd2hl biBzZXQgdG8gYSBmYWxzZXkgdmFsdWUuCisgICAqIGhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWU6 CisgICAqICAgV2hldGhlciB0aGUgcHJvcGVydHkgY2FuIGJlIHVzZWQgYXMgYSBmbGFnIGFzIHdl bGwgYXMgd2l0aCBhIHZhbHVlLgorICAgKiAgIFJlbW92ZWQgd2hlbiBzdHJpY3RseSBlcXVhbCB0 byBmYWxzZTsgcHJlc2VudCB3aXRob3V0IGEgdmFsdWUgd2hlbgorICAgKiAgIHN0cmljdGx5IGVx dWFsIHRvIHRydWU7IHByZXNlbnQgd2l0aCBhIHZhbHVlIG90aGVyd2lzZS4KKyAgICovCisgIHBy b3BlcnRpZXM6IHt9LAorCisgIC8qKgorICAgKiBNYXBwaW5nIGZyb20gbG93ZXJjYXNlIHByb3Bl cnR5IG5hbWVzIHRvIHRoZSBwcm9wZXJseSBjYXNlZCB2ZXJzaW9uLCB1c2VkCisgICAqIHRvIHdh cm4gaW4gdGhlIGNhc2Ugb2YgbWlzc2luZyBwcm9wZXJ0aWVzLiBBdmFpbGFibGUgb25seSBpbiBf X0RFVl9fLgorICAgKgorICAgKiBhdXRvZm9jdXMgaXMgcHJlZGVmaW5lZCwgYmVjYXVzZSBhZGRp bmcgaXQgdG8gdGhlIHByb3BlcnR5IHdoaXRlbGlzdAorICAgKiBjYXVzZXMgdW5pbnRlbmRlZCBz aWRlIGVmZmVjdHMuCisgICAqCisgICAqIEB0eXBlIHtPYmplY3R9CisgICAqLworICBnZXRQb3Nz aWJsZVN0YW5kYXJkTmFtZTogImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8geyBhdXRv Zm9jdXM6ICdhdXRvRm9jdXMnIH0gOiBudWxsLAorCisgIC8qKgorICAgKiBBbGwgb2YgdGhlIGlz Q3VzdG9tQXR0cmlidXRlKCkgZnVuY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIGluamVjdGVkLgorICAg Ki8KKyAgX2lzQ3VzdG9tQXR0cmlidXRlRnVuY3Rpb25zOiBbXSwKKworICAvKioKKyAgICogQ2hl Y2tzIHdoZXRoZXIgYSBwcm9wZXJ0eSBuYW1lIGlzIGEgY3VzdG9tIGF0dHJpYnV0ZS4KKyAgICog QG1ldGhvZAorICAgKi8KKyAgaXNDdXN0b21BdHRyaWJ1dGU6IGZ1bmN0aW9uIChhdHRyaWJ1dGVO YW1lKSB7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBET01Qcm9wZXJ0eS5faXNDdXN0b21BdHRy aWJ1dGVGdW5jdGlvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciBpc0N1c3RvbUF0dHJpYnV0 ZUZuID0gRE9NUHJvcGVydHkuX2lzQ3VzdG9tQXR0cmlidXRlRnVuY3Rpb25zW2ldOworICAgICAg aWYgKGlzQ3VzdG9tQXR0cmlidXRlRm4oYXR0cmlidXRlTmFtZSkpIHsKKyAgICAgICAgcmV0dXJu IHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfSwKKworICBpbmpl Y3Rpb246IERPTVByb3BlcnR5SW5qZWN0aW9uCit9OworCittb2R1bGUuZXhwb3J0cyA9IERPTVBy b3BlcnR5OworfSx7IjEyNSI6MTI1LCIxNTAiOjE1MH1dLDEyOltmdW5jdGlvbihfZGVyZXFfLG1v ZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ss IEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBp cyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBM SUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFu IGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRo ZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0 cmljdCc7CisKK3ZhciBET01Qcm9wZXJ0eSA9IF9kZXJlcV8oMTEpOwordmFyIFJlYWN0RE9NQ29t cG9uZW50VHJlZSA9IF9kZXJlcV8oMzQpOwordmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gX2Rl cmVxXyg2NCk7CisKK3ZhciBxdW90ZUF0dHJpYnV0ZVZhbHVlRm9yQnJvd3NlciA9IF9kZXJlcV8o MTI0KTsKK3ZhciB3YXJuaW5nID0gX2RlcmVxXygxNTcpOworCit2YXIgVkFMSURfQVRUUklCVVRF X05BTUVfUkVHRVggPSBuZXcgUmVnRXhwKCdeWycgKyBET01Qcm9wZXJ0eS5BVFRSSUJVVEVfTkFN RV9TVEFSVF9DSEFSICsgJ11bJyArIERPTVByb3BlcnR5LkFUVFJJQlVURV9OQU1FX0NIQVIgKyAn XSokJyk7Cit2YXIgaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZSA9IHt9OwordmFyIHZhbGlkYXRl ZEF0dHJpYnV0ZU5hbWVDYWNoZSA9IHt9OworCitmdW5jdGlvbiBpc0F0dHJpYnV0ZU5hbWVTYWZl KGF0dHJpYnV0ZU5hbWUpIHsKKyAgaWYgKHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZS5oYXNP d25Qcm9wZXJ0eShhdHRyaWJ1dGVOYW1lKSkgeworICAgIHJldHVybiB0cnVlOworICB9CisgIGlm IChpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlLmhhc093blByb3BlcnR5KGF0dHJpYnV0ZU5hbWUp KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChWQUxJRF9BVFRSSUJVVEVfTkFNRV9S RUdFWC50ZXN0KGF0dHJpYnV0ZU5hbWUpKSB7CisgICAgdmFsaWRhdGVkQXR0cmlidXRlTmFtZUNh Y2hlW2F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBpbGxl Z2FsQXR0cmlidXRlTmFtZUNhY2hlW2F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTsKKyAgImRldmVsb3Bt ZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ0ludmFsaWQgYXR0cmlidXRl IG5hbWU6IGAlc2AnLCBhdHRyaWJ1dGVOYW1lKSA6IHZvaWQgMDsKKyAgcmV0dXJuIGZhbHNlOwor fQorCitmdW5jdGlvbiBzaG91bGRJZ25vcmVWYWx1ZShwcm9wZXJ0eUluZm8sIHZhbHVlKSB7Cisg IHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHByb3BlcnR5SW5mby5oYXNCb29sZWFuVmFsdWUgJiYg IXZhbHVlIHx8IHByb3BlcnR5SW5mby5oYXNOdW1lcmljVmFsdWUgJiYgaXNOYU4odmFsdWUpIHx8 IHByb3BlcnR5SW5mby5oYXNQb3NpdGl2ZU51bWVyaWNWYWx1ZSAmJiB2YWx1ZSA8IDEgfHwgcHJv cGVydHlJbmZvLmhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWUgJiYgdmFsdWUgPT09IGZhbHNlOwor fQorCisvKioKKyAqIE9wZXJhdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCBET00gcHJvcGVydGllcy4K KyAqLwordmFyIERPTVByb3BlcnR5T3BlcmF0aW9ucyA9IHsKKworICAvKioKKyAgICogQ3JlYXRl cyBtYXJrdXAgZm9yIHRoZSBJRCBwcm9wZXJ0eS4KKyAgICoKKyAgICogQHBhcmFtIHtzdHJpbmd9 IGlkIFVuZXNjYXBlZCBJRC4KKyAgICogQHJldHVybiB7c3RyaW5nfSBNYXJrdXAgc3RyaW5nLgor ICAgKi8KKyAgY3JlYXRlTWFya3VwRm9ySUQ6IGZ1bmN0aW9uIChpZCkgeworICAgIHJldHVybiBE T01Qcm9wZXJ0eS5JRF9BVFRSSUJVVEVfTkFNRSArICc9JyArIHF1b3RlQXR0cmlidXRlVmFsdWVG b3JCcm93c2VyKGlkKTsKKyAgfSwKKworICBzZXRBdHRyaWJ1dGVGb3JJRDogZnVuY3Rpb24gKG5v ZGUsIGlkKSB7CisgICAgbm9kZS5zZXRBdHRyaWJ1dGUoRE9NUHJvcGVydHkuSURfQVRUUklCVVRF X05BTUUsIGlkKTsKKyAgfSwKKworICBjcmVhdGVNYXJrdXBGb3JSb290OiBmdW5jdGlvbiAoKSB7 CisgICAgcmV0dXJuIERPTVByb3BlcnR5LlJPT1RfQVRUUklCVVRFX05BTUUgKyAnPSIiJzsKKyAg fSwKKworICBzZXRBdHRyaWJ1dGVGb3JSb290OiBmdW5jdGlvbiAobm9kZSkgeworICAgIG5vZGUu c2V0QXR0cmlidXRlKERPTVByb3BlcnR5LlJPT1RfQVRUUklCVVRFX05BTUUsICcnKTsKKyAgfSwK KworICAvKioKKyAgICogQ3JlYXRlcyBtYXJrdXAgZm9yIGEgcHJvcGVydHkuCisgICAqCisgICAq IEBwYXJhbSB7c3RyaW5nfSBuYW1lCisgICAqIEBwYXJhbSB7Kn0gdmFsdWUKKyAgICogQHJldHVy biB7P3N0cmluZ30gTWFya3VwIHN0cmluZywgb3IgbnVsbCBpZiB0aGUgcHJvcGVydHkgd2FzIGlu dmFsaWQuCisgICAqLworICBjcmVhdGVNYXJrdXBGb3JQcm9wZXJ0eTogZnVuY3Rpb24gKG5hbWUs IHZhbHVlKSB7CisgICAgdmFyIHByb3BlcnR5SW5mbyA9IERPTVByb3BlcnR5LnByb3BlcnRpZXMu aGFzT3duUHJvcGVydHkobmFtZSkgPyBET01Qcm9wZXJ0eS5wcm9wZXJ0aWVzW25hbWVdIDogbnVs bDsKKyAgICBpZiAocHJvcGVydHlJbmZvKSB7CisgICAgICBpZiAoc2hvdWxkSWdub3JlVmFsdWUo cHJvcGVydHlJbmZvLCB2YWx1ZSkpIHsKKyAgICAgICAgcmV0dXJuICcnOworICAgICAgfQorICAg ICAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZTsKKyAgICAg IGlmIChwcm9wZXJ0eUluZm8uaGFzQm9vbGVhblZhbHVlIHx8IHByb3BlcnR5SW5mby5oYXNPdmVy bG9hZGVkQm9vbGVhblZhbHVlICYmIHZhbHVlID09PSB0cnVlKSB7CisgICAgICAgIHJldHVybiBh dHRyaWJ1dGVOYW1lICsgJz0iIic7CisgICAgICB9CisgICAgICByZXR1cm4gYXR0cmlidXRlTmFt ZSArICc9JyArIHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyKHZhbHVlKTsKKyAgICB9IGVs c2UgaWYgKERPTVByb3BlcnR5LmlzQ3VzdG9tQXR0cmlidXRlKG5hbWUpKSB7CisgICAgICBpZiAo dmFsdWUgPT0gbnVsbCkgeworICAgICAgICByZXR1cm4gJyc7CisgICAgICB9CisgICAgICByZXR1 cm4gbmFtZSArICc9JyArIHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyKHZhbHVlKTsKKyAg ICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0sCisKKyAgLyoqCisgICAqIENyZWF0ZXMgbWFya3Vw IGZvciBhIGN1c3RvbSBwcm9wZXJ0eS4KKyAgICoKKyAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUK KyAgICogQHBhcmFtIHsqfSB2YWx1ZQorICAgKiBAcmV0dXJuIHtzdHJpbmd9IE1hcmt1cCBzdHJp bmcsIG9yIGVtcHR5IHN0cmluZyBpZiB0aGUgcHJvcGVydHkgd2FzIGludmFsaWQuCisgICAqLwor ICBjcmVhdGVNYXJrdXBGb3JDdXN0b21BdHRyaWJ1dGU6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkg eworICAgIGlmICghaXNBdHRyaWJ1dGVOYW1lU2FmZShuYW1lKSB8fCB2YWx1ZSA9PSBudWxsKSB7 CisgICAgICByZXR1cm4gJyc7CisgICAgfQorICAgIHJldHVybiBuYW1lICsgJz0nICsgcXVvdGVB dHRyaWJ1dGVWYWx1ZUZvckJyb3dzZXIodmFsdWUpOworICB9LAorCisgIC8qKgorICAgKiBTZXRz IHRoZSB2YWx1ZSBmb3IgYSBwcm9wZXJ0eSBvbiBhIG5vZGUuCisgICAqCisgICAqIEBwYXJhbSB7 RE9NRWxlbWVudH0gbm9kZQorICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZQorICAgKiBAcGFyYW0g eyp9IHZhbHVlCisgICAqLworICBzZXRWYWx1ZUZvclByb3BlcnR5OiBmdW5jdGlvbiAobm9kZSwg bmFtZSwgdmFsdWUpIHsKKyAgICB2YXIgcHJvcGVydHlJbmZvID0gRE9NUHJvcGVydHkucHJvcGVy dGllcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IERPTVByb3BlcnR5LnByb3BlcnRpZXNbbmFtZV0g OiBudWxsOworICAgIGlmIChwcm9wZXJ0eUluZm8pIHsKKyAgICAgIHZhciBtdXRhdGlvbk1ldGhv ZCA9IHByb3BlcnR5SW5mby5tdXRhdGlvbk1ldGhvZDsKKyAgICAgIGlmIChtdXRhdGlvbk1ldGhv ZCkgeworICAgICAgICBtdXRhdGlvbk1ldGhvZChub2RlLCB2YWx1ZSk7CisgICAgICB9IGVsc2Ug aWYgKHNob3VsZElnbm9yZVZhbHVlKHByb3BlcnR5SW5mbywgdmFsdWUpKSB7CisgICAgICAgIHRo aXMuZGVsZXRlVmFsdWVGb3JQcm9wZXJ0eShub2RlLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuOwor ICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eUluZm8ubXVzdFVzZVByb3BlcnR5KSB7CisgICAgICAg IC8vIENvbnRyYXJ5IHRvIGBzZXRBdHRyaWJ1dGVgLCBvYmplY3QgcHJvcGVydGllcyBhcmUgcHJv cGVybHkKKyAgICAgICAgLy8gYHRvU3RyaW5nYGVkIGJ5IElFOC85LgorICAgICAgICBub2RlW3By b3BlcnR5SW5mby5wcm9wZXJ0eU5hbWVdID0gdmFsdWU7CisgICAgICB9IGVsc2UgeworICAgICAg ICB2YXIgYXR0cmlidXRlTmFtZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lOworICAgICAg ICB2YXIgbmFtZXNwYWNlID0gcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWVzcGFjZTsKKyAgICAg ICAgLy8gYHNldEF0dHJpYnV0ZWAgd2l0aCBvYmplY3RzIGJlY29tZXMgb25seSBgW29iamVjdF1g IGluIElFOC85LAorICAgICAgICAvLyAoJycgKyB2YWx1ZSkgbWFrZXMgaXQgb3V0cHV0IHRoZSBj b3JyZWN0IHRvU3RyaW5nKCktdmFsdWUuCisgICAgICAgIGlmIChuYW1lc3BhY2UpIHsKKyAgICAg ICAgICBub2RlLnNldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZSwgYXR0cmlidXRlTmFtZSwgJycgKyB2 YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlJbmZvLmhhc0Jvb2xlYW5WYWx1ZSB8 fCBwcm9wZXJ0eUluZm8uaGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZSAmJiB2YWx1ZSA9PT0gdHJ1 ZSkgeworICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsICcnKTsKKyAg ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1l LCAnJyArIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAoRE9NUHJv cGVydHkuaXNDdXN0b21BdHRyaWJ1dGUobmFtZSkpIHsKKyAgICAgIERPTVByb3BlcnR5T3BlcmF0 aW9ucy5zZXRWYWx1ZUZvckF0dHJpYnV0ZShub2RlLCBuYW1lLCB2YWx1ZSk7CisgICAgICByZXR1 cm47CisgICAgfQorCisgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgewor ICAgICAgdmFyIHBheWxvYWQgPSB7fTsKKyAgICAgIHBheWxvYWRbbmFtZV0gPSB2YWx1ZTsKKyAg ICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oeworICAg ICAgICBpbnN0YW5jZUlEOiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9k ZShub2RlKS5fZGVidWdJRCwKKyAgICAgICAgdHlwZTogJ3VwZGF0ZSBhdHRyaWJ1dGUnLAorICAg ICAgICBwYXlsb2FkOiBwYXlsb2FkCisgICAgICB9KTsKKyAgICB9CisgIH0sCisKKyAgc2V0VmFs dWVGb3JBdHRyaWJ1dGU6IGZ1bmN0aW9uIChub2RlLCBuYW1lLCB2YWx1ZSkgeworICAgIGlmICgh aXNBdHRyaWJ1dGVOYW1lU2FmZShuYW1lKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBp ZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7Cisg ICAgfSBlbHNlIHsKKyAgICAgIG5vZGUuc2V0QXR0cmlidXRlKG5hbWUsICcnICsgdmFsdWUpOwor ICAgIH0KKworICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAg IHZhciBwYXlsb2FkID0ge307CisgICAgICBwYXlsb2FkW25hbWVdID0gdmFsdWU7CisgICAgICBS ZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHsKKyAgICAgICAg aW5zdGFuY2VJRDogUmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUobm9k ZSkuX2RlYnVnSUQsCisgICAgICAgIHR5cGU6ICd1cGRhdGUgYXR0cmlidXRlJywKKyAgICAgICAg cGF5bG9hZDogcGF5bG9hZAorICAgICAgfSk7CisgICAgfQorICB9LAorCisgIC8qKgorICAgKiBE ZWxldGVzIGFuIGF0dHJpYnV0ZXMgZnJvbSBhIG5vZGUuCisgICAqCisgICAqIEBwYXJhbSB7RE9N RWxlbWVudH0gbm9kZQorICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZQorICAgKi8KKyAgZGVsZXRl VmFsdWVGb3JBdHRyaWJ1dGU6IGZ1bmN0aW9uIChub2RlLCBuYW1lKSB7CisgICAgbm9kZS5yZW1v dmVBdHRyaWJ1dGUobmFtZSk7CisgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9u JykgeworICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlv bih7CisgICAgICAgIGluc3RhbmNlSUQ6IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5j ZUZyb21Ob2RlKG5vZGUpLl9kZWJ1Z0lELAorICAgICAgICB0eXBlOiAncmVtb3ZlIGF0dHJpYnV0 ZScsCisgICAgICAgIHBheWxvYWQ6IG5hbWUKKyAgICAgIH0pOworICAgIH0KKyAgfSwKKworICAv KioKKyAgICogRGVsZXRlcyB0aGUgdmFsdWUgZm9yIGEgcHJvcGVydHkgb24gYSBub2RlLgorICAg KgorICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGUKKyAgICogQHBhcmFtIHtzdHJpbmd9IG5h bWUKKyAgICovCisgIGRlbGV0ZVZhbHVlRm9yUHJvcGVydHk6IGZ1bmN0aW9uIChub2RlLCBuYW1l KSB7CisgICAgdmFyIHByb3BlcnR5SW5mbyA9IERPTVByb3BlcnR5LnByb3BlcnRpZXMuaGFzT3du UHJvcGVydHkobmFtZSkgPyBET01Qcm9wZXJ0eS5wcm9wZXJ0aWVzW25hbWVdIDogbnVsbDsKKyAg ICBpZiAocHJvcGVydHlJbmZvKSB7CisgICAgICB2YXIgbXV0YXRpb25NZXRob2QgPSBwcm9wZXJ0 eUluZm8ubXV0YXRpb25NZXRob2Q7CisgICAgICBpZiAobXV0YXRpb25NZXRob2QpIHsKKyAgICAg ICAgbXV0YXRpb25NZXRob2Qobm9kZSwgdW5kZWZpbmVkKTsKKyAgICAgIH0gZWxzZSBpZiAocHJv cGVydHlJbmZvLm11c3RVc2VQcm9wZXJ0eSkgeworICAgICAgICB2YXIgcHJvcE5hbWUgPSBwcm9w ZXJ0eUluZm8ucHJvcGVydHlOYW1lOworICAgICAgICBpZiAocHJvcGVydHlJbmZvLmhhc0Jvb2xl YW5WYWx1ZSkgeworICAgICAgICAgIG5vZGVbcHJvcE5hbWVdID0gZmFsc2U7CisgICAgICAgIH0g ZWxzZSB7CisgICAgICAgICAgbm9kZVtwcm9wTmFtZV0gPSAnJzsKKyAgICAgICAgfQorICAgICAg fSBlbHNlIHsKKyAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUocHJvcGVydHlJbmZvLmF0dHJp YnV0ZU5hbWUpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoRE9NUHJvcGVydHkuaXNDdXN0b21B dHRyaWJ1dGUobmFtZSkpIHsKKyAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpOworICAg IH0KKworICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIFJl YWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oeworICAgICAgICBp bnN0YW5jZUlEOiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShub2Rl KS5fZGVidWdJRCwKKyAgICAgICAgdHlwZTogJ3JlbW92ZSBhdHRyaWJ1dGUnLAorICAgICAgICBw YXlsb2FkOiBuYW1lCisgICAgICB9KTsKKyAgICB9CisgIH0KKworfTsKKworbW9kdWxlLmV4cG9y dHMgPSBET01Qcm9wZXJ0eU9wZXJhdGlvbnM7Cit9LHsiMTEiOjExLCIxMjQiOjEyNCwiMTU3Ijox NTcsIjM0IjozNCwiNjQiOjY0fV0sMTM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMp eworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxs IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVu ZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBp biB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBn cmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmls ZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFy IF9wcm9kSW52YXJpYW50ID0gX2RlcmVxXygxMjUpOworCit2YXIgRE9NTGF6eVRyZWUgPSBfZGVy ZXFfKDkpOwordmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0gX2RlcmVxXygxMzYpOworCit2YXIg Y3JlYXRlTm9kZXNGcm9tTWFya3VwID0gX2RlcmVxXygxNDEpOwordmFyIGVtcHR5RnVuY3Rpb24g PSBfZGVyZXFfKDE0Mik7Cit2YXIgaW52YXJpYW50ID0gX2RlcmVxXygxNTApOworCit2YXIgRGFu Z2VyID0geworCisgIC8qKgorICAgKiBSZXBsYWNlcyBhIG5vZGUgd2l0aCBhIHN0cmluZyBvZiBt YXJrdXAgYXQgaXRzIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIGl0cworICAgKiBwYXJlbnQuIFRo ZSBtYXJrdXAgbXVzdCByZW5kZXIgaW50byBhIHNpbmdsZSByb290IG5vZGUuCisgICAqCisgICAq IEBwYXJhbSB7RE9NRWxlbWVudH0gb2xkQ2hpbGQgQ2hpbGQgbm9kZSB0byByZXBsYWNlLgorICAg KiBAcGFyYW0ge3N0cmluZ30gbWFya3VwIE1hcmt1cCB0byByZW5kZXIgaW4gcGxhY2Ugb2YgdGhl IGNoaWxkIG5vZGUuCisgICAqIEBpbnRlcm5hbAorICAgKi8KKyAgZGFuZ2Vyb3VzbHlSZXBsYWNl Tm9kZVdpdGhNYXJrdXA6IGZ1bmN0aW9uIChvbGRDaGlsZCwgbWFya3VwKSB7CisgICAgIUV4ZWN1 dGlvbkVudmlyb25tZW50LmNhblVzZURPTSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9u JyA/IGludmFyaWFudChmYWxzZSwgJ2Rhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwKC4u Lik6IENhbm5vdCByZW5kZXIgbWFya3VwIGluIGEgd29ya2VyIHRocmVhZC4gTWFrZSBzdXJlIGB3 aW5kb3dgIGFuZCBgZG9jdW1lbnRgIGFyZSBhdmFpbGFibGUgZ2xvYmFsbHkgYmVmb3JlIHJlcXVp cmluZyBSZWFjdCB3aGVuIHVuaXQgdGVzdGluZyBvciB1c2UgUmVhY3RET01TZXJ2ZXIucmVuZGVy VG9TdHJpbmcoKSBmb3Igc2VydmVyIHJlbmRlcmluZy4nKSA6IF9wcm9kSW52YXJpYW50KCc1Nicp IDogdm9pZCAwOworICAgICFtYXJrdXAgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicg PyBpbnZhcmlhbnQoZmFsc2UsICdkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cCguLi4p OiBNaXNzaW5nIG1hcmt1cC4nKSA6IF9wcm9kSW52YXJpYW50KCc1NycpIDogdm9pZCAwOworICAg ICEob2xkQ2hpbGQubm9kZU5hbWUgIT09ICdIVE1MJykgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJv ZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1h cmt1cCguLi4pOiBDYW5ub3QgcmVwbGFjZSBtYXJrdXAgb2YgdGhlIDxodG1sPiBub2RlLiBUaGlz IGlzIGJlY2F1c2UgYnJvd3NlciBxdWlya3MgbWFrZSB0aGlzIHVucmVsaWFibGUgYW5kL29yIHNs b3cuIElmIHlvdSB3YW50IHRvIHJlbmRlciB0byB0aGUgcm9vdCB5b3UgbXVzdCB1c2Ugc2VydmVy IHJlbmRlcmluZy4gU2VlIFJlYWN0RE9NU2VydmVyLnJlbmRlclRvU3RyaW5nKCkuJykgOiBfcHJv ZEludmFyaWFudCgnNTgnKSA6IHZvaWQgMDsKKworICAgIGlmICh0eXBlb2YgbWFya3VwID09PSAn c3RyaW5nJykgeworICAgICAgdmFyIG5ld0NoaWxkID0gY3JlYXRlTm9kZXNGcm9tTWFya3VwKG1h cmt1cCwgZW1wdHlGdW5jdGlvbilbMF07CisgICAgICBvbGRDaGlsZC5wYXJlbnROb2RlLnJlcGxh Y2VDaGlsZChuZXdDaGlsZCwgb2xkQ2hpbGQpOworICAgIH0gZWxzZSB7CisgICAgICBET01MYXp5 VHJlZS5yZXBsYWNlQ2hpbGRXaXRoVHJlZShvbGRDaGlsZCwgbWFya3VwKTsKKyAgICB9CisgIH0K KworfTsKKworbW9kdWxlLmV4cG9ydHMgPSBEYW5nZXI7Cit9LHsiMTI1IjoxMjUsIjEzNiI6MTM2 LCIxNDEiOjE0MSwiMTQyIjoxNDIsIjE1MCI6MTUwLCI5Ijo5fV0sMTQ6W2Z1bmN0aW9uKF9kZXJl cV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNl Ym9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBj b2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUK KyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJl ZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQg aW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1 c2Ugc3RyaWN0JzsKKworLyoqCisgKiBNb2R1bGUgdGhhdCBpcyBpbmplY3RhYmxlIGludG8gYEV2 ZW50UGx1Z2luSHViYCwgdGhhdCBzcGVjaWZpZXMgYQorICogZGV0ZXJtaW5pc3RpYyBvcmRlcmlu ZyBvZiBgRXZlbnRQbHVnaW5gcy4gQSBjb252ZW5pZW50IHdheSB0byByZWFzb24gYWJvdXQKKyAq IHBsdWdpbnMsIHdpdGhvdXQgaGF2aW5nIHRvIHBhY2thZ2UgZXZlcnkgb25lIG9mIHRoZW0uIFRo aXMgaXMgYmV0dGVyIHRoYW4KKyAqIGhhdmluZyBwbHVnaW5zIGJlIG9yZGVyZWQgaW4gdGhlIHNh bWUgb3JkZXIgdGhhdCB0aGV5IGFyZSBpbmplY3RlZCBiZWNhdXNlCisgKiB0aGF0IG9yZGVyaW5n IHdvdWxkIGJlIGluZmx1ZW5jZWQgYnkgdGhlIHBhY2thZ2luZyBvcmRlci4KKyAqIGBSZXNwb25k ZXJFdmVudFBsdWdpbmAgbXVzdCBvY2N1ciBiZWZvcmUgYFNpbXBsZUV2ZW50UGx1Z2luYCBzbyB0 aGF0CisgKiBwcmV2ZW50aW5nIGRlZmF1bHQgb24gZXZlbnRzIGlzIGNvbnZlbmllbnQgaW4gYFNp bXBsZUV2ZW50UGx1Z2luYCBoYW5kbGVycy4KKyAqLworCit2YXIgRGVmYXVsdEV2ZW50UGx1Z2lu T3JkZXIgPSBbJ1Jlc3BvbmRlckV2ZW50UGx1Z2luJywgJ1NpbXBsZUV2ZW50UGx1Z2luJywgJ1Rh cEV2ZW50UGx1Z2luJywgJ0VudGVyTGVhdmVFdmVudFBsdWdpbicsICdDaGFuZ2VFdmVudFBsdWdp bicsICdTZWxlY3RFdmVudFBsdWdpbicsICdCZWZvcmVJbnB1dEV2ZW50UGx1Z2luJ107CisKK21v ZHVsZS5leHBvcnRzID0gRGVmYXVsdEV2ZW50UGx1Z2luT3JkZXI7Cit9LHt9XSwxNTpbZnVuY3Rp b24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNl bnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMg c291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5k IGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNv dXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBi ZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisg Ki8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgRXZlbnRQcm9wYWdhdG9ycyA9IF9kZXJlcV8oMjAp OwordmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IF9kZXJlcV8oMzQpOwordmFyIFN5bnRoZXRp Y01vdXNlRXZlbnQgPSBfZGVyZXFfKDk1KTsKKwordmFyIGV2ZW50VHlwZXMgPSB7CisgIG1vdXNl RW50ZXI6IHsKKyAgICByZWdpc3RyYXRpb25OYW1lOiAnb25Nb3VzZUVudGVyJywKKyAgICBkZXBl bmRlbmNpZXM6IFsndG9wTW91c2VPdXQnLCAndG9wTW91c2VPdmVyJ10KKyAgfSwKKyAgbW91c2VM ZWF2ZTogeworICAgIHJlZ2lzdHJhdGlvbk5hbWU6ICdvbk1vdXNlTGVhdmUnLAorICAgIGRlcGVu ZGVuY2llczogWyd0b3BNb3VzZU91dCcsICd0b3BNb3VzZU92ZXInXQorICB9Cit9OworCit2YXIg RW50ZXJMZWF2ZUV2ZW50UGx1Z2luID0geworCisgIGV2ZW50VHlwZXM6IGV2ZW50VHlwZXMsCisK KyAgLyoqCisgICAqIEZvciBhbG1vc3QgZXZlcnkgaW50ZXJhY3Rpb24gd2UgY2FyZSBhYm91dCwg dGhlcmUgd2lsbCBiZSBib3RoIGEgdG9wLWxldmVsCisgICAqIGBtb3VzZW92ZXJgIGFuZCBgbW91 c2VvdXRgIGV2ZW50IHRoYXQgb2NjdXJzLiBPbmx5IHVzZSBgbW91c2VvdXRgIHNvIHRoYXQKKyAg ICogd2UgZG8gbm90IGV4dHJhY3QgZHVwbGljYXRlIGV2ZW50cy4gSG93ZXZlciwgbW92aW5nIHRo ZSBtb3VzZSBpbnRvIHRoZQorICAgKiBicm93c2VyIGZyb20gb3V0c2lkZSB3aWxsIG5vdCBmaXJl IGEgYG1vdXNlb3V0YCBldmVudC4gSW4gdGhpcyBjYXNlLCB3ZSB1c2UKKyAgICogdGhlIGBtb3Vz ZW92ZXJgIHRvcC1sZXZlbCBldmVudC4KKyAgICovCisgIGV4dHJhY3RFdmVudHM6IGZ1bmN0aW9u ICh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdl dCkgeworICAgIGlmICh0b3BMZXZlbFR5cGUgPT09ICd0b3BNb3VzZU92ZXInICYmIChuYXRpdmVF dmVudC5yZWxhdGVkVGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LmZyb21FbGVtZW50KSkgeworICAgICAg cmV0dXJuIG51bGw7CisgICAgfQorICAgIGlmICh0b3BMZXZlbFR5cGUgIT09ICd0b3BNb3VzZU91 dCcgJiYgdG9wTGV2ZWxUeXBlICE9PSAndG9wTW91c2VPdmVyJykgeworICAgICAgLy8gTXVzdCBu b3QgYmUgYSBtb3VzZSBpbiBvciBtb3VzZSBvdXQgLSBpZ25vcmluZy4KKyAgICAgIHJldHVybiBu dWxsOworICAgIH0KKworICAgIHZhciB3aW47CisgICAgaWYgKG5hdGl2ZUV2ZW50VGFyZ2V0Lndp bmRvdyA9PT0gbmF0aXZlRXZlbnRUYXJnZXQpIHsKKyAgICAgIC8vIGBuYXRpdmVFdmVudFRhcmdl dGAgaXMgcHJvYmFibHkgYSB3aW5kb3cgb2JqZWN0LgorICAgICAgd2luID0gbmF0aXZlRXZlbnRU YXJnZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2h5IGBvd25l ckRvY3VtZW50YCBpcyBzb21ldGltZXMgdW5kZWZpbmVkIGluIElFOC4KKyAgICAgIHZhciBkb2Mg PSBuYXRpdmVFdmVudFRhcmdldC5vd25lckRvY3VtZW50OworICAgICAgaWYgKGRvYykgeworICAg ICAgICB3aW4gPSBkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdzsKKyAgICAgIH0g ZWxzZSB7CisgICAgICAgIHdpbiA9IHdpbmRvdzsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIg ZnJvbTsKKyAgICB2YXIgdG87CisgICAgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcE1vdXNlT3V0 JykgeworICAgICAgZnJvbSA9IHRhcmdldEluc3Q7CisgICAgICB2YXIgcmVsYXRlZCA9IG5hdGl2 ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQudG9FbGVtZW50OworICAgICAgdG8g PSByZWxhdGVkID8gUmVhY3RET01Db21wb25lbnRUcmVlLmdldENsb3Nlc3RJbnN0YW5jZUZyb21O b2RlKHJlbGF0ZWQpIDogbnVsbDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTW92aW5nIHRvIGEg bm9kZSBmcm9tIG91dHNpZGUgdGhlIHdpbmRvdy4KKyAgICAgIGZyb20gPSBudWxsOworICAgICAg dG8gPSB0YXJnZXRJbnN0OworICAgIH0KKworICAgIGlmIChmcm9tID09PSB0bykgeworICAgICAg Ly8gTm90aGluZyBwZXJ0YWlucyB0byBvdXIgbWFuYWdlZCBjb21wb25lbnRzLgorICAgICAgcmV0 dXJuIG51bGw7CisgICAgfQorCisgICAgdmFyIGZyb21Ob2RlID0gZnJvbSA9PSBudWxsID8gd2lu IDogUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoZnJvbSk7CisgICAg dmFyIHRvTm9kZSA9IHRvID09IG51bGwgPyB3aW4gOiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0 Tm9kZUZyb21JbnN0YW5jZSh0byk7CisKKyAgICB2YXIgbGVhdmUgPSBTeW50aGV0aWNNb3VzZUV2 ZW50LmdldFBvb2xlZChldmVudFR5cGVzLm1vdXNlTGVhdmUsIGZyb20sIG5hdGl2ZUV2ZW50LCBu YXRpdmVFdmVudFRhcmdldCk7CisgICAgbGVhdmUudHlwZSA9ICdtb3VzZWxlYXZlJzsKKyAgICBs ZWF2ZS50YXJnZXQgPSBmcm9tTm9kZTsKKyAgICBsZWF2ZS5yZWxhdGVkVGFyZ2V0ID0gdG9Ob2Rl OworCisgICAgdmFyIGVudGVyID0gU3ludGhldGljTW91c2VFdmVudC5nZXRQb29sZWQoZXZlbnRU eXBlcy5tb3VzZUVudGVyLCB0bywgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTsKKyAg ICBlbnRlci50eXBlID0gJ21vdXNlZW50ZXInOworICAgIGVudGVyLnRhcmdldCA9IHRvTm9kZTsK KyAgICBlbnRlci5yZWxhdGVkVGFyZ2V0ID0gZnJvbU5vZGU7CisKKyAgICBFdmVudFByb3BhZ2F0 b3JzLmFjY3VtdWxhdGVFbnRlckxlYXZlRGlzcGF0Y2hlcyhsZWF2ZSwgZW50ZXIsIGZyb20sIHRv KTsKKworICAgIHJldHVybiBbbGVhdmUsIGVudGVyXTsKKyAgfQorCit9OworCittb2R1bGUuZXhw b3J0cyA9IEVudGVyTGVhdmVFdmVudFBsdWdpbjsKK30seyIyMCI6MjAsIjM0IjozNCwiOTUiOjk1 fV0sMTY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmln aHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4K KyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUg bGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rv cnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50 IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJl Y3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKworLyoqCisgKiBUeXBlcyBvZiByYXcg c2lnbmFscyBmcm9tIHRoZSBicm93c2VyIGNhdWdodCBhdCB0aGUgdG9wIGxldmVsLgorICovCit2 YXIgdG9wTGV2ZWxUeXBlcyA9IHsKKyAgdG9wQWJvcnQ6IG51bGwsCisgIHRvcEFuaW1hdGlvbkVu ZDogbnVsbCwKKyAgdG9wQW5pbWF0aW9uSXRlcmF0aW9uOiBudWxsLAorICB0b3BBbmltYXRpb25T dGFydDogbnVsbCwKKyAgdG9wQmx1cjogbnVsbCwKKyAgdG9wQ2FuUGxheTogbnVsbCwKKyAgdG9w Q2FuUGxheVRocm91Z2g6IG51bGwsCisgIHRvcENoYW5nZTogbnVsbCwKKyAgdG9wQ2xpY2s6IG51 bGwsCisgIHRvcENvbXBvc2l0aW9uRW5kOiBudWxsLAorICB0b3BDb21wb3NpdGlvblN0YXJ0OiBu dWxsLAorICB0b3BDb21wb3NpdGlvblVwZGF0ZTogbnVsbCwKKyAgdG9wQ29udGV4dE1lbnU6IG51 bGwsCisgIHRvcENvcHk6IG51bGwsCisgIHRvcEN1dDogbnVsbCwKKyAgdG9wRG91YmxlQ2xpY2s6 IG51bGwsCisgIHRvcERyYWc6IG51bGwsCisgIHRvcERyYWdFbmQ6IG51bGwsCisgIHRvcERyYWdF bnRlcjogbnVsbCwKKyAgdG9wRHJhZ0V4aXQ6IG51bGwsCisgIHRvcERyYWdMZWF2ZTogbnVsbCwK KyAgdG9wRHJhZ092ZXI6IG51bGwsCisgIHRvcERyYWdTdGFydDogbnVsbCwKKyAgdG9wRHJvcDog bnVsbCwKKyAgdG9wRHVyYXRpb25DaGFuZ2U6IG51bGwsCisgIHRvcEVtcHRpZWQ6IG51bGwsCisg IHRvcEVuY3J5cHRlZDogbnVsbCwKKyAgdG9wRW5kZWQ6IG51bGwsCisgIHRvcEVycm9yOiBudWxs LAorICB0b3BGb2N1czogbnVsbCwKKyAgdG9wSW5wdXQ6IG51bGwsCisgIHRvcEludmFsaWQ6IG51 bGwsCisgIHRvcEtleURvd246IG51bGwsCisgIHRvcEtleVByZXNzOiBudWxsLAorICB0b3BLZXlV cDogbnVsbCwKKyAgdG9wTG9hZDogbnVsbCwKKyAgdG9wTG9hZGVkRGF0YTogbnVsbCwKKyAgdG9w TG9hZGVkTWV0YWRhdGE6IG51bGwsCisgIHRvcExvYWRTdGFydDogbnVsbCwKKyAgdG9wTW91c2VE b3duOiBudWxsLAorICB0b3BNb3VzZU1vdmU6IG51bGwsCisgIHRvcE1vdXNlT3V0OiBudWxsLAor ICB0b3BNb3VzZU92ZXI6IG51bGwsCisgIHRvcE1vdXNlVXA6IG51bGwsCisgIHRvcFBhc3RlOiBu dWxsLAorICB0b3BQYXVzZTogbnVsbCwKKyAgdG9wUGxheTogbnVsbCwKKyAgdG9wUGxheWluZzog bnVsbCwKKyAgdG9wUHJvZ3Jlc3M6IG51bGwsCisgIHRvcFJhdGVDaGFuZ2U6IG51bGwsCisgIHRv cFJlc2V0OiBudWxsLAorICB0b3BTY3JvbGw6IG51bGwsCisgIHRvcFNlZWtlZDogbnVsbCwKKyAg dG9wU2Vla2luZzogbnVsbCwKKyAgdG9wU2VsZWN0aW9uQ2hhbmdlOiBudWxsLAorICB0b3BTdGFs bGVkOiBudWxsLAorICB0b3BTdWJtaXQ6IG51bGwsCisgIHRvcFN1c3BlbmQ6IG51bGwsCisgIHRv cFRleHRJbnB1dDogbnVsbCwKKyAgdG9wVGltZVVwZGF0ZTogbnVsbCwKKyAgdG9wVG91Y2hDYW5j ZWw6IG51bGwsCisgIHRvcFRvdWNoRW5kOiBudWxsLAorICB0b3BUb3VjaE1vdmU6IG51bGwsCisg IHRvcFRvdWNoU3RhcnQ6IG51bGwsCisgIHRvcFRyYW5zaXRpb25FbmQ6IG51bGwsCisgIHRvcFZv bHVtZUNoYW5nZTogbnVsbCwKKyAgdG9wV2FpdGluZzogbnVsbCwKKyAgdG9wV2hlZWw6IG51bGwK K307CisKK3ZhciBFdmVudENvbnN0YW50cyA9IHsKKyAgdG9wTGV2ZWxUeXBlczogdG9wTGV2ZWxU eXBlcworfTsKKworbW9kdWxlLmV4cG9ydHMgPSBFdmVudENvbnN0YW50czsKK30se31dLDE3Oltm dW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMt cHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog VGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2Ug Zm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRo aXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMg Y2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5Lgor ICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJvZEludmFyaWFudCA9IF9kZXJlcV8o MTI1KTsKKwordmFyIEV2ZW50UGx1Z2luUmVnaXN0cnkgPSBfZGVyZXFfKDE4KTsKK3ZhciBFdmVu dFBsdWdpblV0aWxzID0gX2RlcmVxXygxOSk7Cit2YXIgUmVhY3RFcnJvclV0aWxzID0gX2RlcmVx Xyg1NSk7CisKK3ZhciBhY2N1bXVsYXRlSW50byA9IF9kZXJlcV8oMTAyKTsKK3ZhciBmb3JFYWNo QWNjdW11bGF0ZWQgPSBfZGVyZXFfKDExMCk7Cit2YXIgaW52YXJpYW50ID0gX2RlcmVxXygxNTAp OworCisvKioKKyAqIEludGVybmFsIHN0b3JlIGZvciBldmVudCBsaXN0ZW5lcnMKKyAqLwordmFy IGxpc3RlbmVyQmFuayA9IHt9OworCisvKioKKyAqIEludGVybmFsIHF1ZXVlIG9mIGV2ZW50cyB0 aGF0IGhhdmUgYWNjdW11bGF0ZWQgdGhlaXIgZGlzcGF0Y2hlcyBhbmQgYXJlCisgKiB3YWl0aW5n IHRvIGhhdmUgdGhlaXIgZGlzcGF0Y2hlcyBleGVjdXRlZC4KKyAqLwordmFyIGV2ZW50UXVldWUg PSBudWxsOworCisvKioKKyAqIERpc3BhdGNoZXMgYW4gZXZlbnQgYW5kIHJlbGVhc2VzIGl0IGJh Y2sgaW50byB0aGUgcG9vbCwgdW5sZXNzIHBlcnNpc3RlbnQuCisgKgorICogQHBhcmFtIHs/b2Jq ZWN0fSBldmVudCBTeW50aGV0aWMgZXZlbnQgdG8gYmUgZGlzcGF0Y2hlZC4KKyAqIEBwYXJhbSB7 Ym9vbGVhbn0gc2ltdWxhdGVkIElmIHRoZSBldmVudCBpcyBzaW11bGF0ZWQgKGNoYW5nZXMgZXhu IGJlaGF2aW9yKQorICogQHByaXZhdGUKKyAqLwordmFyIGV4ZWN1dGVEaXNwYXRjaGVzQW5kUmVs ZWFzZSA9IGZ1bmN0aW9uIChldmVudCwgc2ltdWxhdGVkKSB7CisgIGlmIChldmVudCkgeworICAg IEV2ZW50UGx1Z2luVXRpbHMuZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyKGV2ZW50LCBzaW11bGF0 ZWQpOworCisgICAgaWYgKCFldmVudC5pc1BlcnNpc3RlbnQoKSkgeworICAgICAgZXZlbnQuY29u c3RydWN0b3IucmVsZWFzZShldmVudCk7CisgICAgfQorICB9Cit9OwordmFyIGV4ZWN1dGVEaXNw YXRjaGVzQW5kUmVsZWFzZVNpbXVsYXRlZCA9IGZ1bmN0aW9uIChlKSB7CisgIHJldHVybiBleGVj dXRlRGlzcGF0Y2hlc0FuZFJlbGVhc2UoZSwgdHJ1ZSk7Cit9OwordmFyIGV4ZWN1dGVEaXNwYXRj aGVzQW5kUmVsZWFzZVRvcExldmVsID0gZnVuY3Rpb24gKGUpIHsKKyAgcmV0dXJuIGV4ZWN1dGVE aXNwYXRjaGVzQW5kUmVsZWFzZShlLCBmYWxzZSk7Cit9OworCit2YXIgZ2V0RGljdGlvbmFyeUtl eSA9IGZ1bmN0aW9uIChpbnN0KSB7CisgIC8vIFByZXZlbnRzIFY4IHBlcmZvcm1hbmNlIGlzc3Vl OgorICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC83MjMyCisgIHJl dHVybiAnLicgKyBpbnN0Ll9yb290Tm9kZUlEOworfTsKKworZnVuY3Rpb24gaXNJbnRlcmFjdGl2 ZSh0YWcpIHsKKyAgcmV0dXJuIHRhZyA9PT0gJ2J1dHRvbicgfHwgdGFnID09PSAnaW5wdXQnIHx8 IHRhZyA9PT0gJ3NlbGVjdCcgfHwgdGFnID09PSAndGV4dGFyZWEnOworfQorCitmdW5jdGlvbiBz aG91bGRQcmV2ZW50TW91c2VFdmVudChuYW1lLCB0eXBlLCBwcm9wcykgeworICBzd2l0Y2ggKG5h bWUpIHsKKyAgICBjYXNlICdvbkNsaWNrJzoKKyAgICBjYXNlICdvbkNsaWNrQ2FwdHVyZSc6Cisg ICAgY2FzZSAnb25Eb3VibGVDbGljayc6CisgICAgY2FzZSAnb25Eb3VibGVDbGlja0NhcHR1cmUn OgorICAgIGNhc2UgJ29uTW91c2VEb3duJzoKKyAgICBjYXNlICdvbk1vdXNlRG93bkNhcHR1cmUn OgorICAgIGNhc2UgJ29uTW91c2VNb3ZlJzoKKyAgICBjYXNlICdvbk1vdXNlTW92ZUNhcHR1cmUn OgorICAgIGNhc2UgJ29uTW91c2VVcCc6CisgICAgY2FzZSAnb25Nb3VzZVVwQ2FwdHVyZSc6Cisg ICAgICByZXR1cm4gISEocHJvcHMuZGlzYWJsZWQgJiYgaXNJbnRlcmFjdGl2ZSh0eXBlKSk7Cisg ICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCisvKioKKyAqIFRoaXMg aXMgYSB1bmlmaWVkIGludGVyZmFjZSBmb3IgZXZlbnQgcGx1Z2lucyB0byBiZSBpbnN0YWxsZWQg YW5kIGNvbmZpZ3VyZWQuCisgKgorICogRXZlbnQgcGx1Z2lucyBjYW4gaW1wbGVtZW50IHRoZSBm b2xsb3dpbmcgcHJvcGVydGllczoKKyAqCisgKiAgIGBleHRyYWN0RXZlbnRzYCB7ZnVuY3Rpb24o c3RyaW5nLCBET01FdmVudFRhcmdldCwgc3RyaW5nLCBvYmplY3QpOiAqfQorICogICAgIFJlcXVp cmVkLiBXaGVuIGEgdG9wLWxldmVsIGV2ZW50IGlzIGZpcmVkLCB0aGlzIG1ldGhvZCBpcyBleHBl Y3RlZCB0bworICogICAgIGV4dHJhY3Qgc3ludGhldGljIGV2ZW50cyB0aGF0IHdpbGwgaW4gdHVy biBiZSBxdWV1ZWQgYW5kIGRpc3BhdGNoZWQuCisgKgorICogICBgZXZlbnRUeXBlc2Age29iamVj dH0KKyAqICAgICBPcHRpb25hbCwgcGx1Z2lucyB0aGF0IGZpcmUgZXZlbnRzIG11c3QgcHVibGlz aCBhIG1hcHBpbmcgb2YgcmVnaXN0cmF0aW9uCisgKiAgICAgbmFtZXMgdGhhdCBhcmUgdXNlZCB0 byByZWdpc3RlciBsaXN0ZW5lcnMuIFZhbHVlcyBvZiB0aGlzIG1hcHBpbmcgbXVzdAorICogICAg IGJlIG9iamVjdHMgdGhhdCBjb250YWluIGByZWdpc3RyYXRpb25OYW1lYCBvciBgcGhhc2VkUmVn aXN0cmF0aW9uTmFtZXNgLgorICoKKyAqICAgYGV4ZWN1dGVEaXNwYXRjaGAge2Z1bmN0aW9uKG9i amVjdCwgZnVuY3Rpb24sIHN0cmluZyl9CisgKiAgICAgT3B0aW9uYWwsIGFsbG93cyBwbHVnaW5z IHRvIG92ZXJyaWRlIGhvdyBhbiBldmVudCBnZXRzIGRpc3BhdGNoZWQuIEJ5CisgKiAgICAgZGVm YXVsdCwgdGhlIGxpc3RlbmVyIGlzIHNpbXBseSBpbnZva2VkLgorICoKKyAqIEVhY2ggcGx1Z2lu IHRoYXQgaXMgaW5qZWN0ZWQgaW50byBgRXZlbnRzUGx1Z2luSHViYCBpcyBpbW1lZGlhdGVseSBv cGVyYWJsZS4KKyAqCisgKiBAcHVibGljCisgKi8KK3ZhciBFdmVudFBsdWdpbkh1YiA9IHsKKwor ICAvKioKKyAgICogTWV0aG9kcyBmb3IgaW5qZWN0aW5nIGRlcGVuZGVuY2llcy4KKyAgICovCisg IGluamVjdGlvbjogeworCisgICAgLyoqCisgICAgICogQHBhcmFtIHthcnJheX0gSW5qZWN0ZWRF dmVudFBsdWdpbk9yZGVyCisgICAgICogQHB1YmxpYworICAgICAqLworICAgIGluamVjdEV2ZW50 UGx1Z2luT3JkZXI6IEV2ZW50UGx1Z2luUmVnaXN0cnkuaW5qZWN0RXZlbnRQbHVnaW5PcmRlciwK KworICAgIC8qKgorICAgICAqIEBwYXJhbSB7b2JqZWN0fSBpbmplY3RlZE5hbWVzVG9QbHVnaW5z IE1hcCBmcm9tIG5hbWVzIHRvIHBsdWdpbiBtb2R1bGVzLgorICAgICAqLworICAgIGluamVjdEV2 ZW50UGx1Z2luc0J5TmFtZTogRXZlbnRQbHVnaW5SZWdpc3RyeS5pbmplY3RFdmVudFBsdWdpbnNC eU5hbWUKKworICB9LAorCisgIC8qKgorICAgKiBTdG9yZXMgYGxpc3RlbmVyYCBhdCBgbGlzdGVu ZXJCYW5rW3JlZ2lzdHJhdGlvbk5hbWVdW2tleV1gLiBJcyBpZGVtcG90ZW50LgorICAgKgorICAg KiBAcGFyYW0ge29iamVjdH0gaW5zdCBUaGUgaW5zdGFuY2UsIHdoaWNoIGlzIHRoZSBzb3VyY2Ug b2YgZXZlbnRzLgorICAgKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uTmFtZSBOYW1lIG9m IGxpc3RlbmVyIChlLmcuIGBvbkNsaWNrYCkuCisgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3Rl bmVyIFRoZSBjYWxsYmFjayB0byBzdG9yZS4KKyAgICovCisgIHB1dExpc3RlbmVyOiBmdW5jdGlv biAoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSwgbGlzdGVuZXIpIHsKKyAgICAhKHR5cGVvZiBsaXN0 ZW5lciA9PT0gJ2Z1bmN0aW9uJykgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBp bnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCAlcyBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBp bnN0ZWFkIGdvdCB0eXBlICVzJywgcmVnaXN0cmF0aW9uTmFtZSwgdHlwZW9mIGxpc3RlbmVyKSA6 IF9wcm9kSW52YXJpYW50KCc5NCcsIHJlZ2lzdHJhdGlvbk5hbWUsIHR5cGVvZiBsaXN0ZW5lcikg OiB2b2lkIDA7CisKKyAgICB2YXIga2V5ID0gZ2V0RGljdGlvbmFyeUtleShpbnN0KTsKKyAgICB2 YXIgYmFua0ZvclJlZ2lzdHJhdGlvbk5hbWUgPSBsaXN0ZW5lckJhbmtbcmVnaXN0cmF0aW9uTmFt ZV0gfHwgKGxpc3RlbmVyQmFua1tyZWdpc3RyYXRpb25OYW1lXSA9IHt9KTsKKyAgICBiYW5rRm9y UmVnaXN0cmF0aW9uTmFtZVtrZXldID0gbGlzdGVuZXI7CisKKyAgICB2YXIgUGx1Z2luTW9kdWxl ID0gRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tyZWdpc3RyYXRp b25OYW1lXTsKKyAgICBpZiAoUGx1Z2luTW9kdWxlICYmIFBsdWdpbk1vZHVsZS5kaWRQdXRMaXN0 ZW5lcikgeworICAgICAgUGx1Z2luTW9kdWxlLmRpZFB1dExpc3RlbmVyKGluc3QsIHJlZ2lzdHJh dGlvbk5hbWUsIGxpc3RlbmVyKTsKKyAgICB9CisgIH0sCisKKyAgLyoqCisgICAqIEBwYXJhbSB7 b2JqZWN0fSBpbnN0IFRoZSBpbnN0YW5jZSwgd2hpY2ggaXMgdGhlIHNvdXJjZSBvZiBldmVudHMu CisgICAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb25OYW1lIE5hbWUgb2YgbGlzdGVuZXIg KGUuZy4gYG9uQ2xpY2tgKS4KKyAgICogQHJldHVybiB7P2Z1bmN0aW9ufSBUaGUgc3RvcmVkIGNh bGxiYWNrLgorICAgKi8KKyAgZ2V0TGlzdGVuZXI6IGZ1bmN0aW9uIChpbnN0LCByZWdpc3RyYXRp b25OYW1lKSB7CisgICAgLy8gVE9ETzogc2hvdWxkUHJldmVudE1vdXNlRXZlbnQgaXMgRE9NLXNw ZWNpZmljIGFuZCBkZWZpbml0ZWx5IHNob3VsZCBub3QKKyAgICAvLyBsaXZlIGhlcmU7IG5lZWRz IHRvIGJlIG1vdmVkIHRvIGEgYmV0dGVyIHBsYWNlIHNvb24KKyAgICB2YXIgYmFua0ZvclJlZ2lz dHJhdGlvbk5hbWUgPSBsaXN0ZW5lckJhbmtbcmVnaXN0cmF0aW9uTmFtZV07CisgICAgaWYgKHNo b3VsZFByZXZlbnRNb3VzZUV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGluc3QuX2N1cnJlbnRFbGVt ZW50LnR5cGUsIGluc3QuX2N1cnJlbnRFbGVtZW50LnByb3BzKSkgeworICAgICAgcmV0dXJuIG51 bGw7CisgICAgfQorICAgIHZhciBrZXkgPSBnZXREaWN0aW9uYXJ5S2V5KGluc3QpOworICAgIHJl dHVybiBiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZSAmJiBiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZVtr ZXldOworICB9LAorCisgIC8qKgorICAgKiBEZWxldGVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgcmVn aXN0cmF0aW9uIGJhbmsuCisgICAqCisgICAqIEBwYXJhbSB7b2JqZWN0fSBpbnN0IFRoZSBpbnN0 YW5jZSwgd2hpY2ggaXMgdGhlIHNvdXJjZSBvZiBldmVudHMuCisgICAqIEBwYXJhbSB7c3RyaW5n fSByZWdpc3RyYXRpb25OYW1lIE5hbWUgb2YgbGlzdGVuZXIgKGUuZy4gYG9uQ2xpY2tgKS4KKyAg ICovCisgIGRlbGV0ZUxpc3RlbmVyOiBmdW5jdGlvbiAoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSkg eworICAgIHZhciBQbHVnaW5Nb2R1bGUgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlv bk5hbWVNb2R1bGVzW3JlZ2lzdHJhdGlvbk5hbWVdOworICAgIGlmIChQbHVnaW5Nb2R1bGUgJiYg UGx1Z2luTW9kdWxlLndpbGxEZWxldGVMaXN0ZW5lcikgeworICAgICAgUGx1Z2luTW9kdWxlLndp bGxEZWxldGVMaXN0ZW5lcihpbnN0LCByZWdpc3RyYXRpb25OYW1lKTsKKyAgICB9CisKKyAgICB2 YXIgYmFua0ZvclJlZ2lzdHJhdGlvbk5hbWUgPSBsaXN0ZW5lckJhbmtbcmVnaXN0cmF0aW9uTmFt ZV07CisgICAgLy8gVE9ETzogVGhpcyBzaG91bGQgbmV2ZXIgYmUgbnVsbCAtLSB3aGVuIGlzIGl0 PworICAgIGlmIChiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZSkgeworICAgICAgdmFyIGtleSA9IGdl dERpY3Rpb25hcnlLZXkoaW5zdCk7CisgICAgICBkZWxldGUgYmFua0ZvclJlZ2lzdHJhdGlvbk5h bWVba2V5XTsKKyAgICB9CisgIH0sCisKKyAgLyoqCisgICAqIERlbGV0ZXMgYWxsIGxpc3RlbmVy cyBmb3IgdGhlIERPTSBlbGVtZW50IHdpdGggdGhlIHN1cHBsaWVkIElELgorICAgKgorICAgKiBA cGFyYW0ge29iamVjdH0gaW5zdCBUaGUgaW5zdGFuY2UsIHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2Yg ZXZlbnRzLgorICAgKi8KKyAgZGVsZXRlQWxsTGlzdGVuZXJzOiBmdW5jdGlvbiAoaW5zdCkgewor ICAgIHZhciBrZXkgPSBnZXREaWN0aW9uYXJ5S2V5KGluc3QpOworICAgIGZvciAodmFyIHJlZ2lz dHJhdGlvbk5hbWUgaW4gbGlzdGVuZXJCYW5rKSB7CisgICAgICBpZiAoIWxpc3RlbmVyQmFuay5o YXNPd25Qcm9wZXJ0eShyZWdpc3RyYXRpb25OYW1lKSkgeworICAgICAgICBjb250aW51ZTsKKyAg ICAgIH0KKworICAgICAgaWYgKCFsaXN0ZW5lckJhbmtbcmVnaXN0cmF0aW9uTmFtZV1ba2V5XSkg eworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgdmFyIFBsdWdpbk1vZHVsZSA9 IEV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbcmVnaXN0cmF0aW9u TmFtZV07CisgICAgICBpZiAoUGx1Z2luTW9kdWxlICYmIFBsdWdpbk1vZHVsZS53aWxsRGVsZXRl TGlzdGVuZXIpIHsKKyAgICAgICAgUGx1Z2luTW9kdWxlLndpbGxEZWxldGVMaXN0ZW5lcihpbnN0 LCByZWdpc3RyYXRpb25OYW1lKTsKKyAgICAgIH0KKworICAgICAgZGVsZXRlIGxpc3RlbmVyQmFu a1tyZWdpc3RyYXRpb25OYW1lXVtrZXldOworICAgIH0KKyAgfSwKKworICAvKioKKyAgICogQWxs b3dzIHJlZ2lzdGVyZWQgcGx1Z2lucyBhbiBvcHBvcnR1bml0eSB0byBleHRyYWN0IGV2ZW50cyBm cm9tIHRvcC1sZXZlbAorICAgKiBuYXRpdmUgYnJvd3NlciBldmVudHMuCisgICAqCisgICAqIEBy ZXR1cm4geyp9IEFuIGFjY3VtdWxhdGlvbiBvZiBzeW50aGV0aWMgZXZlbnRzLgorICAgKiBAaW50 ZXJuYWwKKyAgICovCisgIGV4dHJhY3RFdmVudHM6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIHRh cmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkgeworICAgIHZhciBldmVu dHM7CisgICAgdmFyIHBsdWdpbnMgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LnBsdWdpbnM7CisgICAg Zm9yICh2YXIgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAvLyBOb3Qg ZXZlcnkgcGx1Z2luIGluIHRoZSBvcmRlcmluZyBtYXkgYmUgbG9hZGVkIGF0IHJ1bnRpbWUuCisg ICAgICB2YXIgcG9zc2libGVQbHVnaW4gPSBwbHVnaW5zW2ldOworICAgICAgaWYgKHBvc3NpYmxl UGx1Z2luKSB7CisgICAgICAgIHZhciBleHRyYWN0ZWRFdmVudHMgPSBwb3NzaWJsZVBsdWdpbi5l eHRyYWN0RXZlbnRzKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2 ZUV2ZW50VGFyZ2V0KTsKKyAgICAgICAgaWYgKGV4dHJhY3RlZEV2ZW50cykgeworICAgICAgICAg IGV2ZW50cyA9IGFjY3VtdWxhdGVJbnRvKGV2ZW50cywgZXh0cmFjdGVkRXZlbnRzKTsKKyAgICAg ICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXZlbnRzOworICB9LAorCisgIC8qKgor ICAgKiBFbnF1ZXVlcyBhIHN5bnRoZXRpYyBldmVudCB0aGF0IHNob3VsZCBiZSBkaXNwYXRjaGVk IHdoZW4KKyAgICogYHByb2Nlc3NFdmVudFF1ZXVlYCBpcyBpbnZva2VkLgorICAgKgorICAgKiBA cGFyYW0geyp9IGV2ZW50cyBBbiBhY2N1bXVsYXRpb24gb2Ygc3ludGhldGljIGV2ZW50cy4KKyAg ICogQGludGVybmFsCisgICAqLworICBlbnF1ZXVlRXZlbnRzOiBmdW5jdGlvbiAoZXZlbnRzKSB7 CisgICAgaWYgKGV2ZW50cykgeworICAgICAgZXZlbnRRdWV1ZSA9IGFjY3VtdWxhdGVJbnRvKGV2 ZW50UXVldWUsIGV2ZW50cyk7CisgICAgfQorICB9LAorCisgIC8qKgorICAgKiBEaXNwYXRjaGVz IGFsbCBzeW50aGV0aWMgZXZlbnRzIG9uIHRoZSBldmVudCBxdWV1ZS4KKyAgICoKKyAgICogQGlu dGVybmFsCisgICAqLworICBwcm9jZXNzRXZlbnRRdWV1ZTogZnVuY3Rpb24gKHNpbXVsYXRlZCkg eworICAgIC8vIFNldCBgZXZlbnRRdWV1ZWAgdG8gbnVsbCBiZWZvcmUgcHJvY2Vzc2luZyBpdCBz byB0aGF0IHdlIGNhbiB0ZWxsIGlmIG1vcmUKKyAgICAvLyBldmVudHMgZ2V0IGVucXVldWVkIHdo aWxlIHByb2Nlc3NpbmcuCisgICAgdmFyIHByb2Nlc3NpbmdFdmVudFF1ZXVlID0gZXZlbnRRdWV1 ZTsKKyAgICBldmVudFF1ZXVlID0gbnVsbDsKKyAgICBpZiAoc2ltdWxhdGVkKSB7CisgICAgICBm b3JFYWNoQWNjdW11bGF0ZWQocHJvY2Vzc2luZ0V2ZW50UXVldWUsIGV4ZWN1dGVEaXNwYXRjaGVz QW5kUmVsZWFzZVNpbXVsYXRlZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvckVhY2hBY2N1bXVs YXRlZChwcm9jZXNzaW5nRXZlbnRRdWV1ZSwgZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlVG9w TGV2ZWwpOworICAgIH0KKyAgICAhIWV2ZW50UXVldWUgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJv ZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdwcm9jZXNzRXZlbnRRdWV1ZSgpOiBBZGRpdGlv bmFsIGV2ZW50cyB3ZXJlIGVucXVldWVkIHdoaWxlIHByb2Nlc3NpbmcgYW4gZXZlbnQgcXVldWUu IFN1cHBvcnQgZm9yIHRoaXMgaGFzIG5vdCB5ZXQgYmVlbiBpbXBsZW1lbnRlZC4nKSA6IF9wcm9k SW52YXJpYW50KCc5NScpIDogdm9pZCAwOworICAgIC8vIFRoaXMgd291bGQgYmUgYSBnb29kIHRp bWUgdG8gcmV0aHJvdyBpZiBhbnkgb2YgdGhlIGV2ZW50IGhhbmRsZXJzIHRocmV3LgorICAgIFJl YWN0RXJyb3JVdGlscy5yZXRocm93Q2F1Z2h0RXJyb3IoKTsKKyAgfSwKKworICAvKioKKyAgICog VGhlc2UgYXJlIG5lZWRlZCBmb3IgdGVzdHMgb25seS4gRG8gbm90IHVzZSEKKyAgICovCisgIF9f cHVyZ2U6IGZ1bmN0aW9uICgpIHsKKyAgICBsaXN0ZW5lckJhbmsgPSB7fTsKKyAgfSwKKworICBf X2dldExpc3RlbmVyQmFuazogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBsaXN0ZW5lckJhbms7 CisgIH0KKworfTsKKworbW9kdWxlLmV4cG9ydHMgPSBFdmVudFBsdWdpbkh1YjsKK30seyIxMDIi OjEwMiwiMTEwIjoxMTAsIjEyNSI6MTI1LCIxNTAiOjE1MCwiMTgiOjE4LCIxOSI6MTksIjU1Ijo1 NX1dLDE4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJp Z2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQu CisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxl IGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0 b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVu dCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGly ZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9wcm9kSW52YXJp YW50ID0gX2RlcmVxXygxMjUpOworCit2YXIgaW52YXJpYW50ID0gX2RlcmVxXygxNTApOworCisv KioKKyAqIEluamVjdGFibGUgb3JkZXJpbmcgb2YgZXZlbnQgcGx1Z2lucy4KKyAqLwordmFyIGV2 ZW50UGx1Z2luT3JkZXIgPSBudWxsOworCisvKioKKyAqIEluamVjdGFibGUgbWFwcGluZyBmcm9t IG5hbWVzIHRvIGV2ZW50IHBsdWdpbiBtb2R1bGVzLgorICovCit2YXIgbmFtZXNUb1BsdWdpbnMg PSB7fTsKKworLyoqCisgKiBSZWNvbXB1dGVzIHRoZSBwbHVnaW4gbGlzdCB1c2luZyB0aGUgaW5q ZWN0ZWQgcGx1Z2lucyBhbmQgcGx1Z2luIG9yZGVyaW5nLgorICoKKyAqIEBwcml2YXRlCisgKi8K K2Z1bmN0aW9uIHJlY29tcHV0ZVBsdWdpbk9yZGVyaW5nKCkgeworICBpZiAoIWV2ZW50UGx1Z2lu T3JkZXIpIHsKKyAgICAvLyBXYWl0IHVudGlsIGFuIGBldmVudFBsdWdpbk9yZGVyYCBpcyBpbmpl Y3RlZC4KKyAgICByZXR1cm47CisgIH0KKyAgZm9yICh2YXIgcGx1Z2luTmFtZSBpbiBuYW1lc1Rv UGx1Z2lucykgeworICAgIHZhciBwbHVnaW5Nb2R1bGUgPSBuYW1lc1RvUGx1Z2luc1twbHVnaW5O YW1lXTsKKyAgICB2YXIgcGx1Z2luSW5kZXggPSBldmVudFBsdWdpbk9yZGVyLmluZGV4T2YocGx1 Z2luTmFtZSk7CisgICAgIShwbHVnaW5JbmRleCA+IC0xKSA/ICJkZXZlbG9wbWVudCIgIT09ICdw cm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V2ZW50UGx1Z2luUmVnaXN0cnk6IENhbm5v dCBpbmplY3QgZXZlbnQgcGx1Z2lucyB0aGF0IGRvIG5vdCBleGlzdCBpbiB0aGUgcGx1Z2luIG9y ZGVyaW5nLCBgJXNgLicsIHBsdWdpbk5hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzk2JywgcGx1Z2lu TmFtZSkgOiB2b2lkIDA7CisgICAgaWYgKEV2ZW50UGx1Z2luUmVnaXN0cnkucGx1Z2luc1twbHVn aW5JbmRleF0pIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAhcGx1Z2luTW9kdWxlLmV4 dHJhY3RFdmVudHMgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQo ZmFsc2UsICdFdmVudFBsdWdpblJlZ2lzdHJ5OiBFdmVudCBwbHVnaW5zIG11c3QgaW1wbGVtZW50 IGFuIGBleHRyYWN0RXZlbnRzYCBtZXRob2QsIGJ1dCBgJXNgIGRvZXMgbm90LicsIHBsdWdpbk5h bWUpIDogX3Byb2RJbnZhcmlhbnQoJzk3JywgcGx1Z2luTmFtZSkgOiB2b2lkIDA7CisgICAgRXZl bnRQbHVnaW5SZWdpc3RyeS5wbHVnaW5zW3BsdWdpbkluZGV4XSA9IHBsdWdpbk1vZHVsZTsKKyAg ICB2YXIgcHVibGlzaGVkRXZlbnRzID0gcGx1Z2luTW9kdWxlLmV2ZW50VHlwZXM7CisgICAgZm9y ICh2YXIgZXZlbnROYW1lIGluIHB1Ymxpc2hlZEV2ZW50cykgeworICAgICAgIXB1Ymxpc2hFdmVu dEZvclBsdWdpbihwdWJsaXNoZWRFdmVudHNbZXZlbnROYW1lXSwgcGx1Z2luTW9kdWxlLCBldmVu dE5hbWUpID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNl LCAnRXZlbnRQbHVnaW5SZWdpc3RyeTogRmFpbGVkIHRvIHB1Ymxpc2ggZXZlbnQgYCVzYCBmb3Ig cGx1Z2luIGAlc2AuJywgZXZlbnROYW1lLCBwbHVnaW5OYW1lKSA6IF9wcm9kSW52YXJpYW50KCc5 OCcsIGV2ZW50TmFtZSwgcGx1Z2luTmFtZSkgOiB2b2lkIDA7CisgICAgfQorICB9Cit9CisKKy8q KgorICogUHVibGlzaGVzIGFuIGV2ZW50IHNvIHRoYXQgaXQgY2FuIGJlIGRpc3BhdGNoZWQgYnkg dGhlIHN1cHBsaWVkIHBsdWdpbi4KKyAqCisgKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25m aWcgRGlzcGF0Y2ggY29uZmlndXJhdGlvbiBmb3IgdGhlIGV2ZW50LgorICogQHBhcmFtIHtvYmpl Y3R9IFBsdWdpbk1vZHVsZSBQbHVnaW4gcHVibGlzaGluZyB0aGUgZXZlbnQuCisgKiBAcmV0dXJu IHtib29sZWFufSBUcnVlIGlmIHRoZSBldmVudCB3YXMgc3VjY2Vzc2Z1bGx5IHB1Ymxpc2hlZC4K KyAqIEBwcml2YXRlCisgKi8KK2Z1bmN0aW9uIHB1Ymxpc2hFdmVudEZvclBsdWdpbihkaXNwYXRj aENvbmZpZywgcGx1Z2luTW9kdWxlLCBldmVudE5hbWUpIHsKKyAgISFFdmVudFBsdWdpblJlZ2lz dHJ5LmV2ZW50TmFtZURpc3BhdGNoQ29uZmlncy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpID8g ImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXZlbnRQ bHVnaW5IdWI6IE1vcmUgdGhhbiBvbmUgcGx1Z2luIGF0dGVtcHRlZCB0byBwdWJsaXNoIHRoZSBz YW1lIGV2ZW50IG5hbWUsIGAlc2AuJywgZXZlbnROYW1lKSA6IF9wcm9kSW52YXJpYW50KCc5OScs IGV2ZW50TmFtZSkgOiB2b2lkIDA7CisgIEV2ZW50UGx1Z2luUmVnaXN0cnkuZXZlbnROYW1lRGlz cGF0Y2hDb25maWdzW2V2ZW50TmFtZV0gPSBkaXNwYXRjaENvbmZpZzsKKworICB2YXIgcGhhc2Vk UmVnaXN0cmF0aW9uTmFtZXMgPSBkaXNwYXRjaENvbmZpZy5waGFzZWRSZWdpc3RyYXRpb25OYW1l czsKKyAgaWYgKHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzKSB7CisgICAgZm9yICh2YXIgcGhhc2VO YW1lIGluIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzKSB7CisgICAgICBpZiAocGhhc2VkUmVnaXN0 cmF0aW9uTmFtZXMuaGFzT3duUHJvcGVydHkocGhhc2VOYW1lKSkgeworICAgICAgICB2YXIgcGhh c2VkUmVnaXN0cmF0aW9uTmFtZSA9IHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzW3BoYXNlTmFtZV07 CisgICAgICAgIHB1Ymxpc2hSZWdpc3RyYXRpb25OYW1lKHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWUs IHBsdWdpbk1vZHVsZSwgZXZlbnROYW1lKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRy dWU7CisgIH0gZWxzZSBpZiAoZGlzcGF0Y2hDb25maWcucmVnaXN0cmF0aW9uTmFtZSkgeworICAg IHB1Ymxpc2hSZWdpc3RyYXRpb25OYW1lKGRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUs IHBsdWdpbk1vZHVsZSwgZXZlbnROYW1lKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1 cm4gZmFsc2U7Cit9CisKKy8qKgorICogUHVibGlzaGVzIGEgcmVnaXN0cmF0aW9uIG5hbWUgdGhh dCBpcyB1c2VkIHRvIGlkZW50aWZ5IGRpc3BhdGNoZWQgZXZlbnRzIGFuZAorICogY2FuIGJlIHVz ZWQgd2l0aCBgRXZlbnRQbHVnaW5IdWIucHV0TGlzdGVuZXJgIHRvIHJlZ2lzdGVyIGxpc3RlbmVy cy4KKyAqCisgKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uTmFtZSBSZWdpc3RyYXRpb24g bmFtZSB0byBhZGQuCisgKiBAcGFyYW0ge29iamVjdH0gUGx1Z2luTW9kdWxlIFBsdWdpbiBwdWJs aXNoaW5nIHRoZSBldmVudC4KKyAqIEBwcml2YXRlCisgKi8KK2Z1bmN0aW9uIHB1Ymxpc2hSZWdp c3RyYXRpb25OYW1lKHJlZ2lzdHJhdGlvbk5hbWUsIHBsdWdpbk1vZHVsZSwgZXZlbnROYW1lKSB7 CisgICEhRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tyZWdpc3Ry YXRpb25OYW1lXSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChm YWxzZSwgJ0V2ZW50UGx1Z2luSHViOiBNb3JlIHRoYW4gb25lIHBsdWdpbiBhdHRlbXB0ZWQgdG8g cHVibGlzaCB0aGUgc2FtZSByZWdpc3RyYXRpb24gbmFtZSwgYCVzYC4nLCByZWdpc3RyYXRpb25O YW1lKSA6IF9wcm9kSW52YXJpYW50KCcxMDAnLCByZWdpc3RyYXRpb25OYW1lKSA6IHZvaWQgMDsK KyAgRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tyZWdpc3RyYXRp b25OYW1lXSA9IHBsdWdpbk1vZHVsZTsKKyAgRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRp b25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdID0gcGx1Z2luTW9kdWxlLmV2ZW50 VHlwZXNbZXZlbnROYW1lXS5kZXBlbmRlbmNpZXM7CisKKyAgaWYgKCJkZXZlbG9wbWVudCIgIT09 ICdwcm9kdWN0aW9uJykgeworICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IHJlZ2lzdHJhdGlvbk5h bWUudG9Mb3dlckNhc2UoKTsKKyAgICBFdmVudFBsdWdpblJlZ2lzdHJ5LnBvc3NpYmxlUmVnaXN0 cmF0aW9uTmFtZXNbbG93ZXJDYXNlZE5hbWVdID0gcmVnaXN0cmF0aW9uTmFtZTsKKworICAgIGlm IChyZWdpc3RyYXRpb25OYW1lID09PSAnb25Eb3VibGVDbGljaycpIHsKKyAgICAgIEV2ZW50UGx1 Z2luUmVnaXN0cnkucG9zc2libGVSZWdpc3RyYXRpb25OYW1lcy5vbmRibGNsaWNrID0gcmVnaXN0 cmF0aW9uTmFtZTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBSZWdpc3RlcnMgcGx1Z2lucyBz byB0aGF0IHRoZXkgY2FuIGV4dHJhY3QgYW5kIGRpc3BhdGNoIGV2ZW50cy4KKyAqCisgKiBAc2Vl IHtFdmVudFBsdWdpbkh1Yn0KKyAqLwordmFyIEV2ZW50UGx1Z2luUmVnaXN0cnkgPSB7CisKKyAg LyoqCisgICAqIE9yZGVyZWQgbGlzdCBvZiBpbmplY3RlZCBwbHVnaW5zLgorICAgKi8KKyAgcGx1 Z2luczogW10sCisKKyAgLyoqCisgICAqIE1hcHBpbmcgZnJvbSBldmVudCBuYW1lIHRvIGRpc3Bh dGNoIGNvbmZpZworICAgKi8KKyAgZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzOiB7fSwKKworICAv KioKKyAgICogTWFwcGluZyBmcm9tIHJlZ2lzdHJhdGlvbiBuYW1lIHRvIHBsdWdpbiBtb2R1bGUK KyAgICovCisgIHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzOiB7fSwKKworICAvKioKKyAgICogTWFw cGluZyBmcm9tIHJlZ2lzdHJhdGlvbiBuYW1lIHRvIGV2ZW50IG5hbWUKKyAgICovCisgIHJlZ2lz dHJhdGlvbk5hbWVEZXBlbmRlbmNpZXM6IHt9LAorCisgIC8qKgorICAgKiBNYXBwaW5nIGZyb20g bG93ZXJjYXNlIHJlZ2lzdHJhdGlvbiBuYW1lcyB0byB0aGUgcHJvcGVybHkgY2FzZWQgdmVyc2lv biwKKyAgICogdXNlZCB0byB3YXJuIGluIHRoZSBjYXNlIG9mIG1pc3NpbmcgZXZlbnQgaGFuZGxl cnMuIEF2YWlsYWJsZQorICAgKiBvbmx5IGluIF9fREVWX18uCisgICAqIEB0eXBlIHtPYmplY3R9 CisgICAqLworICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzOiAiZGV2ZWxvcG1lbnQiICE9PSAn cHJvZHVjdGlvbicgPyB7fSA6IG51bGwsCisgIC8vIFRydXN0IHRoZSBkZXZlbG9wZXIgdG8gb25s eSB1c2UgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcyBpbiBfX0RFVl9fCisKKyAgLyoqCisgICAq IEluamVjdHMgYW4gb3JkZXJpbmcgb2YgcGx1Z2lucyAoYnkgcGx1Z2luIG5hbWUpLiBUaGlzIGFs bG93cyB0aGUgb3JkZXJpbmcKKyAgICogdG8gYmUgZGVjb3VwbGVkIGZyb20gaW5qZWN0aW9uIG9m IHRoZSBhY3R1YWwgcGx1Z2lucyBzbyB0aGF0IG9yZGVyaW5nIGlzCisgICAqIGFsd2F5cyBkZXRl cm1pbmlzdGljIHJlZ2FyZGxlc3Mgb2YgcGFja2FnaW5nLCBvbi10aGUtZmx5IGluamVjdGlvbiwg ZXRjLgorICAgKgorICAgKiBAcGFyYW0ge2FycmF5fSBJbmplY3RlZEV2ZW50UGx1Z2luT3JkZXIK KyAgICogQGludGVybmFsCisgICAqIEBzZWUge0V2ZW50UGx1Z2luSHViLmluamVjdGlvbi5pbmpl Y3RFdmVudFBsdWdpbk9yZGVyfQorICAgKi8KKyAgaW5qZWN0RXZlbnRQbHVnaW5PcmRlcjogZnVu Y3Rpb24gKGluamVjdGVkRXZlbnRQbHVnaW5PcmRlcikgeworICAgICEhZXZlbnRQbHVnaW5PcmRl ciA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V2 ZW50UGx1Z2luUmVnaXN0cnk6IENhbm5vdCBpbmplY3QgZXZlbnQgcGx1Z2luIG9yZGVyaW5nIG1v cmUgdGhhbiBvbmNlLiBZb3UgYXJlIGxpa2VseSB0cnlpbmcgdG8gbG9hZCBtb3JlIHRoYW4gb25l IGNvcHkgb2YgUmVhY3QuJykgOiBfcHJvZEludmFyaWFudCgnMTAxJykgOiB2b2lkIDA7CisgICAg Ly8gQ2xvbmUgdGhlIG9yZGVyaW5nIHNvIGl0IGNhbm5vdCBiZSBkeW5hbWljYWxseSBtdXRhdGVk LgorICAgIGV2ZW50UGx1Z2luT3JkZXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChpbmpl Y3RlZEV2ZW50UGx1Z2luT3JkZXIpOworICAgIHJlY29tcHV0ZVBsdWdpbk9yZGVyaW5nKCk7Cisg IH0sCisKKyAgLyoqCisgICAqIEluamVjdHMgcGx1Z2lucyB0byBiZSB1c2VkIGJ5IGBFdmVudFBs dWdpbkh1YmAuIFRoZSBwbHVnaW4gbmFtZXMgbXVzdCBiZQorICAgKiBpbiB0aGUgb3JkZXJpbmcg aW5qZWN0ZWQgYnkgYGluamVjdEV2ZW50UGx1Z2luT3JkZXJgLgorICAgKgorICAgKiBQbHVnaW5z IGNhbiBiZSBpbmplY3RlZCBhcyBwYXJ0IG9mIHBhZ2UgaW5pdGlhbGl6YXRpb24gb3Igb24tdGhl LWZseS4KKyAgICoKKyAgICogQHBhcmFtIHtvYmplY3R9IGluamVjdGVkTmFtZXNUb1BsdWdpbnMg TWFwIGZyb20gbmFtZXMgdG8gcGx1Z2luIG1vZHVsZXMuCisgICAqIEBpbnRlcm5hbAorICAgKiBA c2VlIHtFdmVudFBsdWdpbkh1Yi5pbmplY3Rpb24uaW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lfQor ICAgKi8KKyAgaW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lOiBmdW5jdGlvbiAoaW5qZWN0ZWROYW1l c1RvUGx1Z2lucykgeworICAgIHZhciBpc09yZGVyaW5nRGlydHkgPSBmYWxzZTsKKyAgICBmb3Ig KHZhciBwbHVnaW5OYW1lIGluIGluamVjdGVkTmFtZXNUb1BsdWdpbnMpIHsKKyAgICAgIGlmICgh aW5qZWN0ZWROYW1lc1RvUGx1Z2lucy5oYXNPd25Qcm9wZXJ0eShwbHVnaW5OYW1lKSkgeworICAg ICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHZhciBwbHVnaW5Nb2R1bGUgPSBpbmplY3Rl ZE5hbWVzVG9QbHVnaW5zW3BsdWdpbk5hbWVdOworICAgICAgaWYgKCFuYW1lc1RvUGx1Z2lucy5o YXNPd25Qcm9wZXJ0eShwbHVnaW5OYW1lKSB8fCBuYW1lc1RvUGx1Z2luc1twbHVnaW5OYW1lXSAh PT0gcGx1Z2luTW9kdWxlKSB7CisgICAgICAgICEhbmFtZXNUb1BsdWdpbnNbcGx1Z2luTmFtZV0g PyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFdmVu dFBsdWdpblJlZ2lzdHJ5OiBDYW5ub3QgaW5qZWN0IHR3byBkaWZmZXJlbnQgZXZlbnQgcGx1Z2lu cyB1c2luZyB0aGUgc2FtZSBuYW1lLCBgJXNgLicsIHBsdWdpbk5hbWUpIDogX3Byb2RJbnZhcmlh bnQoJzEwMicsIHBsdWdpbk5hbWUpIDogdm9pZCAwOworICAgICAgICBuYW1lc1RvUGx1Z2luc1tw bHVnaW5OYW1lXSA9IHBsdWdpbk1vZHVsZTsKKyAgICAgICAgaXNPcmRlcmluZ0RpcnR5ID0gdHJ1 ZTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGlzT3JkZXJpbmdEaXJ0eSkgeworICAgICAgcmVj b21wdXRlUGx1Z2luT3JkZXJpbmcoKTsKKyAgICB9CisgIH0sCisKKyAgLyoqCisgICAqIExvb2tz IHVwIHRoZSBwbHVnaW4gZm9yIHRoZSBzdXBwbGllZCBldmVudC4KKyAgICoKKyAgICogQHBhcmFt IHtvYmplY3R9IGV2ZW50IEEgc3ludGhldGljIGV2ZW50LgorICAgKiBAcmV0dXJuIHs/b2JqZWN0 fSBUaGUgcGx1Z2luIHRoYXQgY3JlYXRlZCB0aGUgc3VwcGxpZWQgZXZlbnQuCisgICAqIEBpbnRl cm5hbAorICAgKi8KKyAgZ2V0UGx1Z2luTW9kdWxlRm9yRXZlbnQ6IGZ1bmN0aW9uIChldmVudCkg eworICAgIHZhciBkaXNwYXRjaENvbmZpZyA9IGV2ZW50LmRpc3BhdGNoQ29uZmlnOworICAgIGlm IChkaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lKSB7CisgICAgICByZXR1cm4gRXZlbnRQ bHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tkaXNwYXRjaENvbmZpZy5yZWdp c3RyYXRpb25OYW1lXSB8fCBudWxsOworICAgIH0KKyAgICBpZiAoZGlzcGF0Y2hDb25maWcucGhh c2VkUmVnaXN0cmF0aW9uTmFtZXMgIT09IHVuZGVmaW5lZCkgeworICAgICAgLy8gcHVsbGluZyBw aGFzZWRSZWdpc3RyYXRpb25OYW1lcyBvdXQgb2YgZGlzcGF0Y2hDb25maWcgaGVscHMgRmxvdyBz ZWUKKyAgICAgIC8vIHRoYXQgaXQgaXMgbm90IHVuZGVmaW5lZC4KKyAgICAgIHZhciBwaGFzZWRS ZWdpc3RyYXRpb25OYW1lcyA9IGRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVz OworCisgICAgICBmb3IgKHZhciBwaGFzZSBpbiBwaGFzZWRSZWdpc3RyYXRpb25OYW1lcykgewor ICAgICAgICBpZiAoIXBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzLmhhc093blByb3BlcnR5KHBoYXNl KSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHZhciBwbHVnaW5N b2R1bGUgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW3BoYXNl ZFJlZ2lzdHJhdGlvbk5hbWVzW3BoYXNlXV07CisgICAgICAgIGlmIChwbHVnaW5Nb2R1bGUpIHsK KyAgICAgICAgICByZXR1cm4gcGx1Z2luTW9kdWxlOworICAgICAgICB9CisgICAgICB9CisgICAg fQorICAgIHJldHVybiBudWxsOworICB9LAorCisgIC8qKgorICAgKiBFeHBvc2VkIGZvciB1bml0 IHRlc3RpbmcuCisgICAqIEBwcml2YXRlCisgICAqLworICBfcmVzZXRFdmVudFBsdWdpbnM6IGZ1 bmN0aW9uICgpIHsKKyAgICBldmVudFBsdWdpbk9yZGVyID0gbnVsbDsKKyAgICBmb3IgKHZhciBw bHVnaW5OYW1lIGluIG5hbWVzVG9QbHVnaW5zKSB7CisgICAgICBpZiAobmFtZXNUb1BsdWdpbnMu aGFzT3duUHJvcGVydHkocGx1Z2luTmFtZSkpIHsKKyAgICAgICAgZGVsZXRlIG5hbWVzVG9QbHVn aW5zW3BsdWdpbk5hbWVdOworICAgICAgfQorICAgIH0KKyAgICBFdmVudFBsdWdpblJlZ2lzdHJ5 LnBsdWdpbnMubGVuZ3RoID0gMDsKKworICAgIHZhciBldmVudE5hbWVEaXNwYXRjaENvbmZpZ3Mg PSBFdmVudFBsdWdpblJlZ2lzdHJ5LmV2ZW50TmFtZURpc3BhdGNoQ29uZmlnczsKKyAgICBmb3Ig KHZhciBldmVudE5hbWUgaW4gZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzKSB7CisgICAgICBpZiAo ZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzLmhhc093blByb3BlcnR5KGV2ZW50TmFtZSkpIHsKKyAg ICAgICAgZGVsZXRlIGV2ZW50TmFtZURpc3BhdGNoQ29uZmlnc1tldmVudE5hbWVdOworICAgICAg fQorICAgIH0KKworICAgIHZhciByZWdpc3RyYXRpb25OYW1lTW9kdWxlcyA9IEV2ZW50UGx1Z2lu UmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXM7CisgICAgZm9yICh2YXIgcmVnaXN0cmF0 aW9uTmFtZSBpbiByZWdpc3RyYXRpb25OYW1lTW9kdWxlcykgeworICAgICAgaWYgKHJlZ2lzdHJh dGlvbk5hbWVNb2R1bGVzLmhhc093blByb3BlcnR5KHJlZ2lzdHJhdGlvbk5hbWUpKSB7CisgICAg ICAgIGRlbGV0ZSByZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tyZWdpc3RyYXRpb25OYW1lXTsKKyAg ICAgIH0KKyAgICB9CisKKyAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7 CisgICAgICB2YXIgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcyA9IEV2ZW50UGx1Z2luUmVnaXN0 cnkucG9zc2libGVSZWdpc3RyYXRpb25OYW1lczsKKyAgICAgIGZvciAodmFyIGxvd2VyQ2FzZWRO YW1lIGluIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMpIHsKKyAgICAgICAgaWYgKHBvc3NpYmxl UmVnaXN0cmF0aW9uTmFtZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpKSB7CisgICAg ICAgICAgZGVsZXRlIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXNbbG93ZXJDYXNlZE5hbWVdOwor ICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKK307CisKK21vZHVsZS5leHBvcnRzID0g RXZlbnRQbHVnaW5SZWdpc3RyeTsKK30seyIxMjUiOjEyNSwiMTUwIjoxNTB9XSwxOTpbZnVuY3Rp b24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNl bnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMg c291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5k IGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNv dXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBi ZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisg Ki8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX3Byb2RJbnZhcmlhbnQgPSBfZGVyZXFfKDEyNSk7 CisKK3ZhciBSZWFjdEVycm9yVXRpbHMgPSBfZGVyZXFfKDU1KTsKKwordmFyIGludmFyaWFudCA9 IF9kZXJlcV8oMTUwKTsKK3ZhciB3YXJuaW5nID0gX2RlcmVxXygxNTcpOworCisvKioKKyAqIElu amVjdGVkIGRlcGVuZGVuY2llczoKKyAqLworCisvKioKKyAqIC0gYENvbXBvbmVudFRyZWVgOiBb cmVxdWlyZWRdIE1vZHVsZSB0aGF0IGNhbiBjb252ZXJ0IGJldHdlZW4gUmVhY3QgaW5zdGFuY2Vz CisgKiAgIGFuZCBhY3R1YWwgbm9kZSByZWZlcmVuY2VzLgorICovCit2YXIgQ29tcG9uZW50VHJl ZTsKK3ZhciBUcmVlVHJhdmVyc2FsOwordmFyIGluamVjdGlvbiA9IHsKKyAgaW5qZWN0Q29tcG9u ZW50VHJlZTogZnVuY3Rpb24gKEluamVjdGVkKSB7CisgICAgQ29tcG9uZW50VHJlZSA9IEluamVj dGVkOworICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICJk ZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoSW5qZWN0ZWQgJiYgSW5qZWN0 ZWQuZ2V0Tm9kZUZyb21JbnN0YW5jZSAmJiBJbmplY3RlZC5nZXRJbnN0YW5jZUZyb21Ob2RlLCAn RXZlbnRQbHVnaW5VdGlscy5pbmplY3Rpb24uaW5qZWN0Q29tcG9uZW50VHJlZSguLi4pOiBJbmpl Y3RlZCAnICsgJ21vZHVsZSBpcyBtaXNzaW5nIGdldE5vZGVGcm9tSW5zdGFuY2Ugb3IgZ2V0SW5z dGFuY2VGcm9tTm9kZS4nKSA6IHZvaWQgMDsKKyAgICB9CisgIH0sCisgIGluamVjdFRyZWVUcmF2 ZXJzYWw6IGZ1bmN0aW9uIChJbmplY3RlZCkgeworICAgIFRyZWVUcmF2ZXJzYWwgPSBJbmplY3Rl ZDsKKyAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAiZGV2 ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKEluamVjdGVkICYmIEluamVjdGVk LmlzQW5jZXN0b3IgJiYgSW5qZWN0ZWQuZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IsICdFdmVudFBs dWdpblV0aWxzLmluamVjdGlvbi5pbmplY3RUcmVlVHJhdmVyc2FsKC4uLik6IEluamVjdGVkICcg KyAnbW9kdWxlIGlzIG1pc3NpbmcgaXNBbmNlc3RvciBvciBnZXRMb3dlc3RDb21tb25BbmNlc3Rv ci4nKSA6IHZvaWQgMDsKKyAgICB9CisgIH0KK307CisKK2Z1bmN0aW9uIGlzRW5kaXNoKHRvcExl dmVsVHlwZSkgeworICByZXR1cm4gdG9wTGV2ZWxUeXBlID09PSAndG9wTW91c2VVcCcgfHwgdG9w TGV2ZWxUeXBlID09PSAndG9wVG91Y2hFbmQnIHx8IHRvcExldmVsVHlwZSA9PT0gJ3RvcFRvdWNo Q2FuY2VsJzsKK30KKworZnVuY3Rpb24gaXNNb3ZlaXNoKHRvcExldmVsVHlwZSkgeworICByZXR1 cm4gdG9wTGV2ZWxUeXBlID09PSAndG9wTW91c2VNb3ZlJyB8fCB0b3BMZXZlbFR5cGUgPT09ICd0 b3BUb3VjaE1vdmUnOworfQorZnVuY3Rpb24gaXNTdGFydGlzaCh0b3BMZXZlbFR5cGUpIHsKKyAg cmV0dXJuIHRvcExldmVsVHlwZSA9PT0gJ3RvcE1vdXNlRG93bicgfHwgdG9wTGV2ZWxUeXBlID09 PSAndG9wVG91Y2hTdGFydCc7Cit9CisKK3ZhciB2YWxpZGF0ZUV2ZW50RGlzcGF0Y2hlczsKK2lm ICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgdmFsaWRhdGVFdmVudERpc3Bh dGNoZXMgPSBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICB2YXIgZGlzcGF0Y2hMaXN0ZW5lcnMgPSBl dmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnM7CisgICAgdmFyIGRpc3BhdGNoSW5zdGFuY2VzID0gZXZl bnQuX2Rpc3BhdGNoSW5zdGFuY2VzOworCisgICAgdmFyIGxpc3RlbmVyc0lzQXJyID0gQXJyYXku aXNBcnJheShkaXNwYXRjaExpc3RlbmVycyk7CisgICAgdmFyIGxpc3RlbmVyc0xlbiA9IGxpc3Rl bmVyc0lzQXJyID8gZGlzcGF0Y2hMaXN0ZW5lcnMubGVuZ3RoIDogZGlzcGF0Y2hMaXN0ZW5lcnMg PyAxIDogMDsKKworICAgIHZhciBpbnN0YW5jZXNJc0FyciA9IEFycmF5LmlzQXJyYXkoZGlzcGF0 Y2hJbnN0YW5jZXMpOworICAgIHZhciBpbnN0YW5jZXNMZW4gPSBpbnN0YW5jZXNJc0FyciA/IGRp c3BhdGNoSW5zdGFuY2VzLmxlbmd0aCA6IGRpc3BhdGNoSW5zdGFuY2VzID8gMSA6IDA7CisKKyAg ICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGluc3RhbmNlc0lzQXJy ID09PSBsaXN0ZW5lcnNJc0FyciAmJiBpbnN0YW5jZXNMZW4gPT09IGxpc3RlbmVyc0xlbiwgJ0V2 ZW50UGx1Z2luVXRpbHM6IEludmFsaWQgYGV2ZW50YC4nKSA6IHZvaWQgMDsKKyAgfTsKK30KKwor LyoqCisgKiBEaXNwYXRjaCB0aGUgZXZlbnQgdG8gdGhlIGxpc3RlbmVyLgorICogQHBhcmFtIHtT eW50aGV0aWNFdmVudH0gZXZlbnQgU3ludGhldGljRXZlbnQgdG8gaGFuZGxlCisgKiBAcGFyYW0g e2Jvb2xlYW59IHNpbXVsYXRlZCBJZiB0aGUgZXZlbnQgaXMgc2ltdWxhdGVkIChjaGFuZ2VzIGV4 biBiZWhhdmlvcikKKyAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyIEFwcGxpY2F0aW9uLWxl dmVsIGNhbGxiYWNrCisgKiBAcGFyYW0geyp9IGluc3QgSW50ZXJuYWwgY29tcG9uZW50IGluc3Rh bmNlCisgKi8KK2Z1bmN0aW9uIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgc2ltdWxhdGVkLCBsaXN0 ZW5lciwgaW5zdCkgeworICB2YXIgdHlwZSA9IGV2ZW50LnR5cGUgfHwgJ3Vua25vd24tZXZlbnQn OworICBldmVudC5jdXJyZW50VGFyZ2V0ID0gRXZlbnRQbHVnaW5VdGlscy5nZXROb2RlRnJvbUlu c3RhbmNlKGluc3QpOworICBpZiAoc2ltdWxhdGVkKSB7CisgICAgUmVhY3RFcnJvclV0aWxzLmlu dm9rZUd1YXJkZWRDYWxsYmFja1dpdGhDYXRjaCh0eXBlLCBsaXN0ZW5lciwgZXZlbnQpOworICB9 IGVsc2UgeworICAgIFJlYWN0RXJyb3JVdGlscy5pbnZva2VHdWFyZGVkQ2FsbGJhY2sodHlwZSwg bGlzdGVuZXIsIGV2ZW50KTsKKyAgfQorICBldmVudC5jdXJyZW50VGFyZ2V0ID0gbnVsbDsKK30K KworLyoqCisgKiBTdGFuZGFyZC9zaW1wbGUgaXRlcmF0aW9uIHRocm91Z2ggYW4gZXZlbnQncyBj b2xsZWN0ZWQgZGlzcGF0Y2hlcy4KKyAqLworZnVuY3Rpb24gZXhlY3V0ZURpc3BhdGNoZXNJbk9y ZGVyKGV2ZW50LCBzaW11bGF0ZWQpIHsKKyAgdmFyIGRpc3BhdGNoTGlzdGVuZXJzID0gZXZlbnQu X2Rpc3BhdGNoTGlzdGVuZXJzOworICB2YXIgZGlzcGF0Y2hJbnN0YW5jZXMgPSBldmVudC5fZGlz cGF0Y2hJbnN0YW5jZXM7CisgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsK KyAgICB2YWxpZGF0ZUV2ZW50RGlzcGF0Y2hlcyhldmVudCk7CisgIH0KKyAgaWYgKEFycmF5Lmlz QXJyYXkoZGlzcGF0Y2hMaXN0ZW5lcnMpKSB7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXNw YXRjaExpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgaWYgKGV2ZW50LmlzUHJvcGFnYXRp b25TdG9wcGVkKCkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAvLyBMaXN0ZW5l cnMgYW5kIEluc3RhbmNlcyBhcmUgdHdvIHBhcmFsbGVsIGFycmF5cyB0aGF0IGFyZSBhbHdheXMg aW4gc3luYy4KKyAgICAgIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgc2ltdWxhdGVkLCBkaXNwYXRj aExpc3RlbmVyc1tpXSwgZGlzcGF0Y2hJbnN0YW5jZXNbaV0pOworICAgIH0KKyAgfSBlbHNlIGlm IChkaXNwYXRjaExpc3RlbmVycykgeworICAgIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgc2ltdWxh dGVkLCBkaXNwYXRjaExpc3RlbmVycywgZGlzcGF0Y2hJbnN0YW5jZXMpOworICB9CisgIGV2ZW50 Ll9kaXNwYXRjaExpc3RlbmVycyA9IG51bGw7CisgIGV2ZW50Ll9kaXNwYXRjaEluc3RhbmNlcyA9 IG51bGw7Cit9CisKKy8qKgorICogU3RhbmRhcmQvc2ltcGxlIGl0ZXJhdGlvbiB0aHJvdWdoIGFu IGV2ZW50J3MgY29sbGVjdGVkIGRpc3BhdGNoZXMsIGJ1dCBzdG9wcworICogYXQgdGhlIGZpcnN0 IGRpc3BhdGNoIGV4ZWN1dGlvbiByZXR1cm5pbmcgdHJ1ZSwgYW5kIHJldHVybnMgdGhhdCBpZC4K KyAqCisgKiBAcmV0dXJuIHs/c3RyaW5nfSBpZCBvZiB0aGUgZmlyc3QgZGlzcGF0Y2ggZXhlY3V0 aW9uIHdobydzIGxpc3RlbmVyIHJldHVybnMKKyAqIHRydWUsIG9yIG51bGwgaWYgbm8gbGlzdGVu ZXIgcmV0dXJuZWQgdHJ1ZS4KKyAqLworZnVuY3Rpb24gZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVy U3RvcEF0VHJ1ZUltcGwoZXZlbnQpIHsKKyAgdmFyIGRpc3BhdGNoTGlzdGVuZXJzID0gZXZlbnQu X2Rpc3BhdGNoTGlzdGVuZXJzOworICB2YXIgZGlzcGF0Y2hJbnN0YW5jZXMgPSBldmVudC5fZGlz cGF0Y2hJbnN0YW5jZXM7CisgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsK KyAgICB2YWxpZGF0ZUV2ZW50RGlzcGF0Y2hlcyhldmVudCk7CisgIH0KKyAgaWYgKEFycmF5Lmlz QXJyYXkoZGlzcGF0Y2hMaXN0ZW5lcnMpKSB7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXNw YXRjaExpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgaWYgKGV2ZW50LmlzUHJvcGFnYXRp b25TdG9wcGVkKCkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAvLyBMaXN0ZW5l cnMgYW5kIEluc3RhbmNlcyBhcmUgdHdvIHBhcmFsbGVsIGFycmF5cyB0aGF0IGFyZSBhbHdheXMg aW4gc3luYy4KKyAgICAgIGlmIChkaXNwYXRjaExpc3RlbmVyc1tpXShldmVudCwgZGlzcGF0Y2hJ bnN0YW5jZXNbaV0pKSB7CisgICAgICAgIHJldHVybiBkaXNwYXRjaEluc3RhbmNlc1tpXTsKKyAg ICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAoZGlzcGF0Y2hMaXN0ZW5lcnMpIHsKKyAgICBpZiAo ZGlzcGF0Y2hMaXN0ZW5lcnMoZXZlbnQsIGRpc3BhdGNoSW5zdGFuY2VzKSkgeworICAgICAgcmV0 dXJuIGRpc3BhdGNoSW5zdGFuY2VzOworICAgIH0KKyAgfQorICByZXR1cm4gbnVsbDsKK30KKwor LyoqCisgKiBAc2VlIGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlclN0b3BBdFRydWVJbXBsCisgKi8K K2Z1bmN0aW9uIGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlclN0b3BBdFRydWUoZXZlbnQpIHsKKyAg dmFyIHJldCA9IGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlclN0b3BBdFRydWVJbXBsKGV2ZW50KTsK KyAgZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzID0gbnVsbDsKKyAgZXZlbnQuX2Rpc3BhdGNoTGlz dGVuZXJzID0gbnVsbDsKKyAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBFeGVjdXRpb24gb2Yg YSAiZGlyZWN0IiBkaXNwYXRjaCAtIHRoZXJlIG11c3QgYmUgYXQgbW9zdCBvbmUgZGlzcGF0Y2gK KyAqIGFjY3VtdWxhdGVkIG9uIHRoZSBldmVudCBvciBpdCBpcyBjb25zaWRlcmVkIGFuIGVycm9y LiBJdCBkb2Vzbid0IHJlYWxseSBtYWtlCisgKiBzZW5zZSBmb3IgYW4gZXZlbnQgd2l0aCBtdWx0 aXBsZSBkaXNwYXRjaGVzIChidWJibGVkKSB0byBrZWVwIHRyYWNrIG9mIHRoZQorICogcmV0dXJu IHZhbHVlcyBhdCBlYWNoIGRpc3BhdGNoIGV4ZWN1dGlvbiwgYnV0IGl0IGRvZXMgdGVuZCB0byBt YWtlIHNlbnNlIHdoZW4KKyAqIGRlYWxpbmcgd2l0aCAiZGlyZWN0IiBkaXNwYXRjaGVzLgorICoK KyAqIEByZXR1cm4geyp9IFRoZSByZXR1cm4gdmFsdWUgb2YgZXhlY3V0aW5nIHRoZSBzaW5nbGUg ZGlzcGF0Y2guCisgKi8KK2Z1bmN0aW9uIGV4ZWN1dGVEaXJlY3REaXNwYXRjaChldmVudCkgewor ICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgdmFsaWRhdGVFdmVu dERpc3BhdGNoZXMoZXZlbnQpOworICB9CisgIHZhciBkaXNwYXRjaExpc3RlbmVyID0gZXZlbnQu X2Rpc3BhdGNoTGlzdGVuZXJzOworICB2YXIgZGlzcGF0Y2hJbnN0YW5jZSA9IGV2ZW50Ll9kaXNw YXRjaEluc3RhbmNlczsKKyAgISFBcnJheS5pc0FycmF5KGRpc3BhdGNoTGlzdGVuZXIpID8gImRl dmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnZXhlY3V0ZURp cmVjdERpc3BhdGNoKC4uLik6IEludmFsaWQgYGV2ZW50YC4nKSA6IF9wcm9kSW52YXJpYW50KCcx MDMnKSA6IHZvaWQgMDsKKyAgZXZlbnQuY3VycmVudFRhcmdldCA9IGRpc3BhdGNoTGlzdGVuZXIg PyBFdmVudFBsdWdpblV0aWxzLmdldE5vZGVGcm9tSW5zdGFuY2UoZGlzcGF0Y2hJbnN0YW5jZSkg OiBudWxsOworICB2YXIgcmVzID0gZGlzcGF0Y2hMaXN0ZW5lciA/IGRpc3BhdGNoTGlzdGVuZXIo ZXZlbnQpIDogbnVsbDsKKyAgZXZlbnQuY3VycmVudFRhcmdldCA9IG51bGw7CisgIGV2ZW50Ll9k aXNwYXRjaExpc3RlbmVycyA9IG51bGw7CisgIGV2ZW50Ll9kaXNwYXRjaEluc3RhbmNlcyA9IG51 bGw7CisgIHJldHVybiByZXM7Cit9CisKKy8qKgorICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0g ZXZlbnQKKyAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWZmIG51bWJlciBvZiBkaXNwYXRjaGVz IGFjY3VtdWxhdGVkIGlzIGdyZWF0ZXIgdGhhbiAwLgorICovCitmdW5jdGlvbiBoYXNEaXNwYXRj aGVzKGV2ZW50KSB7CisgIHJldHVybiAhIWV2ZW50Ll9kaXNwYXRjaExpc3RlbmVyczsKK30KKwor LyoqCisgKiBHZW5lcmFsIHV0aWxpdGllcyB0aGF0IGFyZSB1c2VmdWwgaW4gY3JlYXRpbmcgY3Vz dG9tIEV2ZW50IFBsdWdpbnMuCisgKi8KK3ZhciBFdmVudFBsdWdpblV0aWxzID0geworICBpc0Vu ZGlzaDogaXNFbmRpc2gsCisgIGlzTW92ZWlzaDogaXNNb3ZlaXNoLAorICBpc1N0YXJ0aXNoOiBp c1N0YXJ0aXNoLAorCisgIGV4ZWN1dGVEaXJlY3REaXNwYXRjaDogZXhlY3V0ZURpcmVjdERpc3Bh dGNoLAorICBleGVjdXRlRGlzcGF0Y2hlc0luT3JkZXI6IGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRl ciwKKyAgZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyU3RvcEF0VHJ1ZTogZXhlY3V0ZURpc3BhdGNo ZXNJbk9yZGVyU3RvcEF0VHJ1ZSwKKyAgaGFzRGlzcGF0Y2hlczogaGFzRGlzcGF0Y2hlcywKKwor ICBnZXRJbnN0YW5jZUZyb21Ob2RlOiBmdW5jdGlvbiAobm9kZSkgeworICAgIHJldHVybiBDb21w b25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUobm9kZSk7CisgIH0sCisgIGdldE5vZGVGcm9t SW5zdGFuY2U6IGZ1bmN0aW9uIChub2RlKSB7CisgICAgcmV0dXJuIENvbXBvbmVudFRyZWUuZ2V0 Tm9kZUZyb21JbnN0YW5jZShub2RlKTsKKyAgfSwKKyAgaXNBbmNlc3RvcjogZnVuY3Rpb24gKGEs IGIpIHsKKyAgICByZXR1cm4gVHJlZVRyYXZlcnNhbC5pc0FuY2VzdG9yKGEsIGIpOworICB9LAor ICBnZXRMb3dlc3RDb21tb25BbmNlc3RvcjogZnVuY3Rpb24gKGEsIGIpIHsKKyAgICByZXR1cm4g VHJlZVRyYXZlcnNhbC5nZXRMb3dlc3RDb21tb25BbmNlc3RvcihhLCBiKTsKKyAgfSwKKyAgZ2V0 UGFyZW50SW5zdGFuY2U6IGZ1bmN0aW9uIChpbnN0KSB7CisgICAgcmV0dXJuIFRyZWVUcmF2ZXJz YWwuZ2V0UGFyZW50SW5zdGFuY2UoaW5zdCk7CisgIH0sCisgIHRyYXZlcnNlVHdvUGhhc2U6IGZ1 bmN0aW9uICh0YXJnZXQsIGZuLCBhcmcpIHsKKyAgICByZXR1cm4gVHJlZVRyYXZlcnNhbC50cmF2 ZXJzZVR3b1BoYXNlKHRhcmdldCwgZm4sIGFyZyk7CisgIH0sCisgIHRyYXZlcnNlRW50ZXJMZWF2 ZTogZnVuY3Rpb24gKGZyb20sIHRvLCBmbiwgYXJnRnJvbSwgYXJnVG8pIHsKKyAgICByZXR1cm4g VHJlZVRyYXZlcnNhbC50cmF2ZXJzZUVudGVyTGVhdmUoZnJvbSwgdG8sIGZuLCBhcmdGcm9tLCBh cmdUbyk7CisgIH0sCisKKyAgaW5qZWN0aW9uOiBpbmplY3Rpb24KK307CisKK21vZHVsZS5leHBv cnRzID0gRXZlbnRQbHVnaW5VdGlsczsKK30seyIxMjUiOjEyNSwiMTUwIjoxNTAsIjE1NyI6MTU3 LCI1NSI6NTV9XSwyMDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAq IENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJl c2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJT RC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290 IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBv ZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBz YW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgRXZlbnRQbHVn aW5IdWIgPSBfZGVyZXFfKDE3KTsKK3ZhciBFdmVudFBsdWdpblV0aWxzID0gX2RlcmVxXygxOSk7 CisKK3ZhciBhY2N1bXVsYXRlSW50byA9IF9kZXJlcV8oMTAyKTsKK3ZhciBmb3JFYWNoQWNjdW11 bGF0ZWQgPSBfZGVyZXFfKDExMCk7Cit2YXIgd2FybmluZyA9IF9kZXJlcV8oMTU3KTsKKwordmFy IGdldExpc3RlbmVyID0gRXZlbnRQbHVnaW5IdWIuZ2V0TGlzdGVuZXI7CisKKy8qKgorICogU29t ZSBldmVudCB0eXBlcyBoYXZlIGEgbm90aW9uIG9mIGRpZmZlcmVudCByZWdpc3RyYXRpb24gbmFt ZXMgZm9yIGRpZmZlcmVudAorICogInBoYXNlcyIgb2YgcHJvcGFnYXRpb24uIFRoaXMgZmluZHMg bGlzdGVuZXJzIGJ5IGEgZ2l2ZW4gcGhhc2UuCisgKi8KK2Z1bmN0aW9uIGxpc3RlbmVyQXRQaGFz ZShpbnN0LCBldmVudCwgcHJvcGFnYXRpb25QaGFzZSkgeworICB2YXIgcmVnaXN0cmF0aW9uTmFt ZSA9IGV2ZW50LmRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzW3Byb3BhZ2F0 aW9uUGhhc2VdOworICByZXR1cm4gZ2V0TGlzdGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSk7 Cit9CisKKy8qKgorICogVGFncyBhIGBTeW50aGV0aWNFdmVudGAgd2l0aCBkaXNwYXRjaGVkIGxp c3RlbmVycy4gQ3JlYXRpbmcgdGhpcyBmdW5jdGlvbgorICogaGVyZSwgYWxsb3dzIHVzIHRvIG5v dCBoYXZlIHRvIGJpbmQgb3IgY3JlYXRlIGZ1bmN0aW9ucyBmb3IgZWFjaCBldmVudC4KKyAqIE11 dGF0aW5nIHRoZSBldmVudCdzIG1lbWJlcnMgYWxsb3dzIHVzIHRvIG5vdCBoYXZlIHRvIGNyZWF0 ZSBhIHdyYXBwaW5nCisgKiAiZGlzcGF0Y2giIG9iamVjdCB0aGF0IHBhaXJzIHRoZSBldmVudCB3 aXRoIHRoZSBsaXN0ZW5lci4KKyAqLworZnVuY3Rpb24gYWNjdW11bGF0ZURpcmVjdGlvbmFsRGlz cGF0Y2hlcyhpbnN0LCBwaGFzZSwgZXZlbnQpIHsKKyAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdw cm9kdWN0aW9uJykgeworICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5p bmcoaW5zdCwgJ0Rpc3BhdGNoaW5nIGluc3QgbXVzdCBub3QgYmUgbnVsbCcpIDogdm9pZCAwOwor ICB9CisgIHZhciBsaXN0ZW5lciA9IGxpc3RlbmVyQXRQaGFzZShpbnN0LCBldmVudCwgcGhhc2Up OworICBpZiAobGlzdGVuZXIpIHsKKyAgICBldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnMgPSBhY2N1 bXVsYXRlSW50byhldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnMsIGxpc3RlbmVyKTsKKyAgICBldmVu dC5fZGlzcGF0Y2hJbnN0YW5jZXMgPSBhY2N1bXVsYXRlSW50byhldmVudC5fZGlzcGF0Y2hJbnN0 YW5jZXMsIGluc3QpOworICB9Cit9CisKKy8qKgorICogQ29sbGVjdCBkaXNwYXRjaGVzIChtdXN0 IGJlIGVudGlyZWx5IGNvbGxlY3RlZCBiZWZvcmUgZGlzcGF0Y2hpbmcgLSBzZWUgdW5pdAorICog dGVzdHMpLiBMYXppbHkgYWxsb2NhdGUgdGhlIGFycmF5IHRvIGNvbnNlcnZlIG1lbW9yeS4gIFdl IG11c3QgbG9vcCB0aHJvdWdoCisgKiBlYWNoIGV2ZW50IGFuZCBwZXJmb3JtIHRoZSB0cmF2ZXJz YWwgZm9yIGVhY2ggb25lLiBXZSBjYW5ub3QgcGVyZm9ybSBhCisgKiBzaW5nbGUgdHJhdmVyc2Fs IGZvciB0aGUgZW50aXJlIGNvbGxlY3Rpb24gb2YgZXZlbnRzIGJlY2F1c2UgZWFjaCBldmVudCBt YXkKKyAqIGhhdmUgYSBkaWZmZXJlbnQgdGFyZ2V0LgorICovCitmdW5jdGlvbiBhY2N1bXVsYXRl VHdvUGhhc2VEaXNwYXRjaGVzU2luZ2xlKGV2ZW50KSB7CisgIGlmIChldmVudCAmJiBldmVudC5k aXNwYXRjaENvbmZpZy5waGFzZWRSZWdpc3RyYXRpb25OYW1lcykgeworICAgIEV2ZW50UGx1Z2lu VXRpbHMudHJhdmVyc2VUd29QaGFzZShldmVudC5fdGFyZ2V0SW5zdCwgYWNjdW11bGF0ZURpcmVj dGlvbmFsRGlzcGF0Y2hlcywgZXZlbnQpOworICB9Cit9CisKKy8qKgorICogU2FtZSBhcyBgYWNj dW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1NpbmdsZWAsIGJ1dCBza2lwcyBvdmVyIHRoZSB0YXJn ZXRJRC4KKyAqLworZnVuY3Rpb24gYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1NpbmdsZVNr aXBUYXJnZXQoZXZlbnQpIHsKKyAgaWYgKGV2ZW50ICYmIGV2ZW50LmRpc3BhdGNoQ29uZmlnLnBo YXNlZFJlZ2lzdHJhdGlvbk5hbWVzKSB7CisgICAgdmFyIHRhcmdldEluc3QgPSBldmVudC5fdGFy Z2V0SW5zdDsKKyAgICB2YXIgcGFyZW50SW5zdCA9IHRhcmdldEluc3QgPyBFdmVudFBsdWdpblV0 aWxzLmdldFBhcmVudEluc3RhbmNlKHRhcmdldEluc3QpIDogbnVsbDsKKyAgICBFdmVudFBsdWdp blV0aWxzLnRyYXZlcnNlVHdvUGhhc2UocGFyZW50SW5zdCwgYWNjdW11bGF0ZURpcmVjdGlvbmFs RGlzcGF0Y2hlcywgZXZlbnQpOworICB9Cit9CisKKy8qKgorICogQWNjdW11bGF0ZXMgd2l0aG91 dCByZWdhcmQgdG8gZGlyZWN0aW9uLCBkb2VzIG5vdCBsb29rIGZvciBwaGFzZWQKKyAqIHJlZ2lz dHJhdGlvbiBuYW1lcy4gU2FtZSBhcyBgYWNjdW11bGF0ZURpcmVjdERpc3BhdGNoZXNTaW5nbGVg IGJ1dCB3aXRob3V0CisgKiByZXF1aXJpbmcgdGhhdCB0aGUgYGRpc3BhdGNoTWFya2VyYCBiZSB0 aGUgc2FtZSBhcyB0aGUgZGlzcGF0Y2hlZCBJRC4KKyAqLworZnVuY3Rpb24gYWNjdW11bGF0ZURp c3BhdGNoZXMoaW5zdCwgaWdub3JlZERpcmVjdGlvbiwgZXZlbnQpIHsKKyAgaWYgKGV2ZW50ICYm IGV2ZW50LmRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUpIHsKKyAgICB2YXIgcmVnaXN0 cmF0aW9uTmFtZSA9IGV2ZW50LmRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWU7CisgICAg dmFyIGxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSk7CisgICAg aWYgKGxpc3RlbmVyKSB7CisgICAgICBldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnMgPSBhY2N1bXVs YXRlSW50byhldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnMsIGxpc3RlbmVyKTsKKyAgICAgIGV2ZW50 Ll9kaXNwYXRjaEluc3RhbmNlcyA9IGFjY3VtdWxhdGVJbnRvKGV2ZW50Ll9kaXNwYXRjaEluc3Rh bmNlcywgaW5zdCk7CisgICAgfQorICB9Cit9CisKKy8qKgorICogQWNjdW11bGF0ZXMgZGlzcGF0 Y2hlcyBvbiBhbiBgU3ludGhldGljRXZlbnRgLCBidXQgb25seSBmb3IgdGhlCisgKiBgZGlzcGF0 Y2hNYXJrZXJgLgorICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQKKyAqLworZnVuY3Rp b24gYWNjdW11bGF0ZURpcmVjdERpc3BhdGNoZXNTaW5nbGUoZXZlbnQpIHsKKyAgaWYgKGV2ZW50 ICYmIGV2ZW50LmRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUpIHsKKyAgICBhY2N1bXVs YXRlRGlzcGF0Y2hlcyhldmVudC5fdGFyZ2V0SW5zdCwgbnVsbCwgZXZlbnQpOworICB9Cit9CisK K2Z1bmN0aW9uIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMoZXZlbnRzKSB7CisgIGZvckVh Y2hBY2N1bXVsYXRlZChldmVudHMsIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXNTaW5nbGUp OworfQorCitmdW5jdGlvbiBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzU2tpcFRhcmdldChl dmVudHMpIHsKKyAgZm9yRWFjaEFjY3VtdWxhdGVkKGV2ZW50cywgYWNjdW11bGF0ZVR3b1BoYXNl RGlzcGF0Y2hlc1NpbmdsZVNraXBUYXJnZXQpOworfQorCitmdW5jdGlvbiBhY2N1bXVsYXRlRW50 ZXJMZWF2ZURpc3BhdGNoZXMobGVhdmUsIGVudGVyLCBmcm9tLCB0bykgeworICBFdmVudFBsdWdp blV0aWxzLnRyYXZlcnNlRW50ZXJMZWF2ZShmcm9tLCB0bywgYWNjdW11bGF0ZURpc3BhdGNoZXMs IGxlYXZlLCBlbnRlcik7Cit9CisKK2Z1bmN0aW9uIGFjY3VtdWxhdGVEaXJlY3REaXNwYXRjaGVz KGV2ZW50cykgeworICBmb3JFYWNoQWNjdW11bGF0ZWQoZXZlbnRzLCBhY2N1bXVsYXRlRGlyZWN0 RGlzcGF0Y2hlc1NpbmdsZSk7Cit9CisKKy8qKgorICogQSBzbWFsbCBzZXQgb2YgcHJvcGFnYXRp b24gcGF0dGVybnMsIGVhY2ggb2Ygd2hpY2ggd2lsbCBhY2NlcHQgYSBzbWFsbCBhbW91bnQKKyAq IG9mIGluZm9ybWF0aW9uLCBhbmQgZ2VuZXJhdGUgYSBzZXQgb2YgImRpc3BhdGNoIHJlYWR5IGV2 ZW50IG9iamVjdHMiIC0gd2hpY2gKKyAqIGFyZSBzZXRzIG9mIGV2ZW50cyB0aGF0IGhhdmUgYWxy ZWFkeSBiZWVuIGFubm90YXRlZCB3aXRoIGEgc2V0IG9mIGRpc3BhdGNoZWQKKyAqIGxpc3RlbmVy IGZ1bmN0aW9ucy9pZHMuIFRoZSBBUEkgaXMgZGVzaWduZWQgdGhpcyB3YXkgdG8gZGlzY291cmFn ZSB0aGVzZQorICogcHJvcGFnYXRpb24gc3RyYXRlZ2llcyBmcm9tIGFjdHVhbGx5IGV4ZWN1dGlu ZyB0aGUgZGlzcGF0Y2hlcywgc2luY2Ugd2UKKyAqIGFsd2F5cyB3YW50IHRvIGNvbGxlY3QgdGhl IGVudGlyZSBzZXQgb2YgZGlzcGF0Y2hlcyBiZWZvcmUgZXhlY3V0aW5nIGV2ZW50IGEKKyAqIHNp bmdsZSBvbmUuCisgKgorICogQGNvbnN0cnVjdG9yIEV2ZW50UHJvcGFnYXRvcnMKKyAqLwordmFy IEV2ZW50UHJvcGFnYXRvcnMgPSB7CisgIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXM6IGFj Y3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMsCisgIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNo ZXNTa2lwVGFyZ2V0OiBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzU2tpcFRhcmdldCwKKyAg YWNjdW11bGF0ZURpcmVjdERpc3BhdGNoZXM6IGFjY3VtdWxhdGVEaXJlY3REaXNwYXRjaGVzLAor ICBhY2N1bXVsYXRlRW50ZXJMZWF2ZURpc3BhdGNoZXM6IGFjY3VtdWxhdGVFbnRlckxlYXZlRGlz cGF0Y2hlcworfTsKKworbW9kdWxlLmV4cG9ydHMgPSBFdmVudFByb3BhZ2F0b3JzOworfSx7IjEw MiI6MTAyLCIxMTAiOjExMCwiMTU3IjoxNTcsIjE3IjoxNywiMTkiOjE5fV0sMjE6W2Z1bmN0aW9u KF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50 LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNv dXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBp biB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3Vy Y2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUg Zm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICov CisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9hc3NpZ24gPSBfZGVyZXFfKDE1OCk7CisKK3ZhciBQ b29sZWRDbGFzcyA9IF9kZXJlcV8oMjUpOworCit2YXIgZ2V0VGV4dENvbnRlbnRBY2Nlc3NvciA9 IF9kZXJlcV8oMTE5KTsKKworLyoqCisgKiBUaGlzIGhlbHBlciBjbGFzcyBzdG9yZXMgaW5mb3Jt YXRpb24gYWJvdXQgdGV4dCBjb250ZW50IG9mIGEgdGFyZ2V0IG5vZGUsCisgKiBhbGxvd2luZyBj b21wYXJpc29uIG9mIGNvbnRlbnQgYmVmb3JlIGFuZCBhZnRlciBhIGdpdmVuIGV2ZW50LgorICoK KyAqIElkZW50aWZ5IHRoZSBub2RlIHdoZXJlIHNlbGVjdGlvbiBjdXJyZW50bHkgYmVnaW5zLCB0 aGVuIG9ic2VydmUKKyAqIGJvdGggaXRzIHRleHQgY29udGVudCBhbmQgaXRzIGN1cnJlbnQgcG9z aXRpb24gaW4gdGhlIERPTS4gU2luY2UgdGhlCisgKiBicm93c2VyIG1heSBuYXRpdmVseSByZXBs YWNlIHRoZSB0YXJnZXQgbm9kZSBkdXJpbmcgY29tcG9zaXRpb24sIHdlIGNhbgorICogdXNlIGl0 cyBwb3NpdGlvbiB0byBmaW5kIGl0cyByZXBsYWNlbWVudC4KKyAqCisgKiBAcGFyYW0ge0RPTUV2 ZW50VGFyZ2V0fSByb290CisgKi8KK2Z1bmN0aW9uIEZhbGxiYWNrQ29tcG9zaXRpb25TdGF0ZShy b290KSB7CisgIHRoaXMuX3Jvb3QgPSByb290OworICB0aGlzLl9zdGFydFRleHQgPSB0aGlzLmdl dFRleHQoKTsKKyAgdGhpcy5fZmFsbGJhY2tUZXh0ID0gbnVsbDsKK30KKworX2Fzc2lnbihGYWxs YmFja0NvbXBvc2l0aW9uU3RhdGUucHJvdG90eXBlLCB7CisgIGRlc3RydWN0b3I6IGZ1bmN0aW9u ICgpIHsKKyAgICB0aGlzLl9yb290ID0gbnVsbDsKKyAgICB0aGlzLl9zdGFydFRleHQgPSBudWxs OworICAgIHRoaXMuX2ZhbGxiYWNrVGV4dCA9IG51bGw7CisgIH0sCisKKyAgLyoqCisgICAqIEdl dCBjdXJyZW50IHRleHQgb2YgaW5wdXQuCisgICAqCisgICAqIEByZXR1cm4ge3N0cmluZ30KKyAg ICovCisgIGdldFRleHQ6IGZ1bmN0aW9uICgpIHsKKyAgICBpZiAoJ3ZhbHVlJyBpbiB0aGlzLl9y b290KSB7CisgICAgICByZXR1cm4gdGhpcy5fcm9vdC52YWx1ZTsKKyAgICB9CisgICAgcmV0dXJu IHRoaXMuX3Jvb3RbZ2V0VGV4dENvbnRlbnRBY2Nlc3NvcigpXTsKKyAgfSwKKworICAvKioKKyAg ICogRGV0ZXJtaW5lIHRoZSBkaWZmZXJpbmcgc3Vic3RyaW5nIGJldHdlZW4gdGhlIGluaXRpYWxs eSBzdG9yZWQKKyAgICogdGV4dCBjb250ZW50IGFuZCB0aGUgY3VycmVudCBjb250ZW50LgorICAg KgorICAgKiBAcmV0dXJuIHtzdHJpbmd9CisgICAqLworICBnZXREYXRhOiBmdW5jdGlvbiAoKSB7 CisgICAgaWYgKHRoaXMuX2ZhbGxiYWNrVGV4dCkgeworICAgICAgcmV0dXJuIHRoaXMuX2ZhbGxi YWNrVGV4dDsKKyAgICB9CisKKyAgICB2YXIgc3RhcnQ7CisgICAgdmFyIHN0YXJ0VmFsdWUgPSB0 aGlzLl9zdGFydFRleHQ7CisgICAgdmFyIHN0YXJ0TGVuZ3RoID0gc3RhcnRWYWx1ZS5sZW5ndGg7 CisgICAgdmFyIGVuZDsKKyAgICB2YXIgZW5kVmFsdWUgPSB0aGlzLmdldFRleHQoKTsKKyAgICB2 YXIgZW5kTGVuZ3RoID0gZW5kVmFsdWUubGVuZ3RoOworCisgICAgZm9yIChzdGFydCA9IDA7IHN0 YXJ0IDwgc3RhcnRMZW5ndGg7IHN0YXJ0KyspIHsKKyAgICAgIGlmIChzdGFydFZhbHVlW3N0YXJ0 XSAhPT0gZW5kVmFsdWVbc3RhcnRdKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0K KworICAgIHZhciBtaW5FbmQgPSBzdGFydExlbmd0aCAtIHN0YXJ0OworICAgIGZvciAoZW5kID0g MTsgZW5kIDw9IG1pbkVuZDsgZW5kKyspIHsKKyAgICAgIGlmIChzdGFydFZhbHVlW3N0YXJ0TGVu Z3RoIC0gZW5kXSAhPT0gZW5kVmFsdWVbZW5kTGVuZ3RoIC0gZW5kXSkgeworICAgICAgICBicmVh azsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgc2xpY2VUYWlsID0gZW5kID4gMSA/IDEgLSBl bmQgOiB1bmRlZmluZWQ7CisgICAgdGhpcy5fZmFsbGJhY2tUZXh0ID0gZW5kVmFsdWUuc2xpY2Uo c3RhcnQsIHNsaWNlVGFpbCk7CisgICAgcmV0dXJuIHRoaXMuX2ZhbGxiYWNrVGV4dDsKKyAgfQor fSk7CisKK1Bvb2xlZENsYXNzLmFkZFBvb2xpbmdUbyhGYWxsYmFja0NvbXBvc2l0aW9uU3RhdGUp OworCittb2R1bGUuZXhwb3J0cyA9IEZhbGxiYWNrQ29tcG9zaXRpb25TdGF0ZTsKK30seyIxMTki OjExOSwiMTU4IjoxNTgsIjI1IjoyNX1dLDIyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBv cnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAq IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNl ZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZp bGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9u YWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRT IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisK K3ZhciBET01Qcm9wZXJ0eSA9IF9kZXJlcV8oMTEpOworCit2YXIgTVVTVF9VU0VfUFJPUEVSVFkg PSBET01Qcm9wZXJ0eS5pbmplY3Rpb24uTVVTVF9VU0VfUFJPUEVSVFk7Cit2YXIgSEFTX0JPT0xF QU5fVkFMVUUgPSBET01Qcm9wZXJ0eS5pbmplY3Rpb24uSEFTX0JPT0xFQU5fVkFMVUU7Cit2YXIg SEFTX05VTUVSSUNfVkFMVUUgPSBET01Qcm9wZXJ0eS5pbmplY3Rpb24uSEFTX05VTUVSSUNfVkFM VUU7Cit2YXIgSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUUgPSBET01Qcm9wZXJ0eS5pbmplY3Rp b24uSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUU7Cit2YXIgSEFTX09WRVJMT0FERURfQk9PTEVB Tl9WQUxVRSA9IERPTVByb3BlcnR5LmluamVjdGlvbi5IQVNfT1ZFUkxPQURFRF9CT09MRUFOX1ZB TFVFOworCit2YXIgSFRNTERPTVByb3BlcnR5Q29uZmlnID0geworICBpc0N1c3RvbUF0dHJpYnV0 ZTogUmVnRXhwLnByb3RvdHlwZS50ZXN0LmJpbmQobmV3IFJlZ0V4cCgnXihkYXRhfGFyaWEpLVsn ICsgRE9NUHJvcGVydHkuQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKSksCisgIFByb3BlcnRp ZXM6IHsKKyAgICAvKioKKyAgICAgKiBTdGFuZGFyZCBQcm9wZXJ0aWVzCisgICAgICovCisgICAg YWNjZXB0OiAwLAorICAgIGFjY2VwdENoYXJzZXQ6IDAsCisgICAgYWNjZXNzS2V5OiAwLAorICAg IGFjdGlvbjogMCwKKyAgICBhbGxvd0Z1bGxTY3JlZW46IEhBU19CT09MRUFOX1ZBTFVFLAorICAg IGFsbG93VHJhbnNwYXJlbmN5OiAwLAorICAgIGFsdDogMCwKKyAgICAvLyBzcGVjaWZpZXMgdGFy Z2V0IGNvbnRleHQgZm9yIGxpbmtzIHdpdGggYHByZWxvYWRgIHR5cGUKKyAgICBhczogMCwKKyAg ICBhc3luYzogSEFTX0JPT0xFQU5fVkFMVUUsCisgICAgYXV0b0NvbXBsZXRlOiAwLAorICAgIC8v IGF1dG9Gb2N1cyBpcyBwb2x5ZmlsbGVkL25vcm1hbGl6ZWQgYnkgQXV0b0ZvY3VzVXRpbHMKKyAg ICAvLyBhdXRvRm9jdXM6IEhBU19CT09MRUFOX1ZBTFVFLAorICAgIGF1dG9QbGF5OiBIQVNfQk9P TEVBTl9WQUxVRSwKKyAgICBjYXB0dXJlOiBIQVNfQk9PTEVBTl9WQUxVRSwKKyAgICBjZWxsUGFk ZGluZzogMCwKKyAgICBjZWxsU3BhY2luZzogMCwKKyAgICBjaGFyU2V0OiAwLAorICAgIGNoYWxs ZW5nZTogMCwKKyAgICBjaGVja2VkOiBNVVNUX1VTRV9QUk9QRVJUWSB8IEhBU19CT09MRUFOX1ZB TFVFLAorICAgIGNpdGU6IDAsCisgICAgY2xhc3NJRDogMCwKKyAgICBjbGFzc05hbWU6IDAsCisg ICAgY29sczogSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUUsCisgICAgY29sU3BhbjogMCwKKyAg ICBjb250ZW50OiAwLAorICAgIGNvbnRlbnRFZGl0YWJsZTogMCwKKyAgICBjb250ZXh0TWVudTog MCwKKyAgICBjb250cm9sczogSEFTX0JPT0xFQU5fVkFMVUUsCisgICAgY29vcmRzOiAwLAorICAg IGNyb3NzT3JpZ2luOiAwLAorICAgIGRhdGE6IDAsIC8vIEZvciBgPG9iamVjdCAvPmAgYWN0cyBh cyBgc3JjYC4KKyAgICBkYXRlVGltZTogMCwKKyAgICAnZGVmYXVsdCc6IEhBU19CT09MRUFOX1ZB TFVFLAorICAgIGRlZmVyOiBIQVNfQk9PTEVBTl9WQUxVRSwKKyAgICBkaXI6IDAsCisgICAgZGlz YWJsZWQ6IEhBU19CT09MRUFOX1ZBTFVFLAorICAgIGRvd25sb2FkOiBIQVNfT1ZFUkxPQURFRF9C T09MRUFOX1ZBTFVFLAorICAgIGRyYWdnYWJsZTogMCwKKyAgICBlbmNUeXBlOiAwLAorICAgIGZv cm06IDAsCisgICAgZm9ybUFjdGlvbjogMCwKKyAgICBmb3JtRW5jVHlwZTogMCwKKyAgICBmb3Jt TWV0aG9kOiAwLAorICAgIGZvcm1Ob1ZhbGlkYXRlOiBIQVNfQk9PTEVBTl9WQUxVRSwKKyAgICBm b3JtVGFyZ2V0OiAwLAorICAgIGZyYW1lQm9yZGVyOiAwLAorICAgIGhlYWRlcnM6IDAsCisgICAg aGVpZ2h0OiAwLAorICAgIGhpZGRlbjogSEFTX0JPT0xFQU5fVkFMVUUsCisgICAgaGlnaDogMCwK KyAgICBocmVmOiAwLAorICAgIGhyZWZMYW5nOiAwLAorICAgIGh0bWxGb3I6IDAsCisgICAgaHR0 cEVxdWl2OiAwLAorICAgIGljb246IDAsCisgICAgaWQ6IDAsCisgICAgaW5wdXRNb2RlOiAwLAor ICAgIGludGVncml0eTogMCwKKyAgICBpczogMCwKKyAgICBrZXlQYXJhbXM6IDAsCisgICAga2V5 VHlwZTogMCwKKyAgICBraW5kOiAwLAorICAgIGxhYmVsOiAwLAorICAgIGxhbmc6IDAsCisgICAg bGlzdDogMCwKKyAgICBsb29wOiBIQVNfQk9PTEVBTl9WQUxVRSwKKyAgICBsb3c6IDAsCisgICAg bWFuaWZlc3Q6IDAsCisgICAgbWFyZ2luSGVpZ2h0OiAwLAorICAgIG1hcmdpbldpZHRoOiAwLAor ICAgIG1heDogMCwKKyAgICBtYXhMZW5ndGg6IDAsCisgICAgbWVkaWE6IDAsCisgICAgbWVkaWFH cm91cDogMCwKKyAgICBtZXRob2Q6IDAsCisgICAgbWluOiAwLAorICAgIG1pbkxlbmd0aDogMCwK KyAgICAvLyBDYXV0aW9uOyBgb3B0aW9uLnNlbGVjdGVkYCBpcyBub3QgdXBkYXRlZCBpZiBgc2Vs ZWN0Lm11bHRpcGxlYCBpcworICAgIC8vIGRpc2FibGVkIHdpdGggYHJlbW92ZUF0dHJpYnV0ZWAu CisgICAgbXVsdGlwbGU6IE1VU1RfVVNFX1BST1BFUlRZIHwgSEFTX0JPT0xFQU5fVkFMVUUsCisg ICAgbXV0ZWQ6IE1VU1RfVVNFX1BST1BFUlRZIHwgSEFTX0JPT0xFQU5fVkFMVUUsCisgICAgbmFt ZTogMCwKKyAgICBub25jZTogMCwKKyAgICBub1ZhbGlkYXRlOiBIQVNfQk9PTEVBTl9WQUxVRSwK KyAgICBvcGVuOiBIQVNfQk9PTEVBTl9WQUxVRSwKKyAgICBvcHRpbXVtOiAwLAorICAgIHBhdHRl cm46IDAsCisgICAgcGxhY2Vob2xkZXI6IDAsCisgICAgcGxheXNJbmxpbmU6IEhBU19CT09MRUFO X1ZBTFVFLAorICAgIHBvc3RlcjogMCwKKyAgICBwcmVsb2FkOiAwLAorICAgIHByb2ZpbGU6IDAs CisgICAgcmFkaW9Hcm91cDogMCwKKyAgICByZWFkT25seTogSEFTX0JPT0xFQU5fVkFMVUUsCisg ICAgcmVmZXJyZXJQb2xpY3k6IDAsCisgICAgcmVsOiAwLAorICAgIHJlcXVpcmVkOiBIQVNfQk9P TEVBTl9WQUxVRSwKKyAgICByZXZlcnNlZDogSEFTX0JPT0xFQU5fVkFMVUUsCisgICAgcm9sZTog MCwKKyAgICByb3dzOiBIQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRSwKKyAgICByb3dTcGFuOiBI QVNfTlVNRVJJQ19WQUxVRSwKKyAgICBzYW5kYm94OiAwLAorICAgIHNjb3BlOiAwLAorICAgIHNj b3BlZDogSEFTX0JPT0xFQU5fVkFMVUUsCisgICAgc2Nyb2xsaW5nOiAwLAorICAgIHNlYW1sZXNz OiBIQVNfQk9PTEVBTl9WQUxVRSwKKyAgICBzZWxlY3RlZDogTVVTVF9VU0VfUFJPUEVSVFkgfCBI QVNfQk9PTEVBTl9WQUxVRSwKKyAgICBzaGFwZTogMCwKKyAgICBzaXplOiBIQVNfUE9TSVRJVkVf TlVNRVJJQ19WQUxVRSwKKyAgICBzaXplczogMCwKKyAgICBzcGFuOiBIQVNfUE9TSVRJVkVfTlVN RVJJQ19WQUxVRSwKKyAgICBzcGVsbENoZWNrOiAwLAorICAgIHNyYzogMCwKKyAgICBzcmNEb2M6 IDAsCisgICAgc3JjTGFuZzogMCwKKyAgICBzcmNTZXQ6IDAsCisgICAgc3RhcnQ6IEhBU19OVU1F UklDX1ZBTFVFLAorICAgIHN0ZXA6IDAsCisgICAgc3R5bGU6IDAsCisgICAgc3VtbWFyeTogMCwK KyAgICB0YWJJbmRleDogMCwKKyAgICB0YXJnZXQ6IDAsCisgICAgdGl0bGU6IDAsCisgICAgLy8g U2V0dGluZyAudHlwZSB0aHJvd3Mgb24gbm9uLTxpbnB1dD4gdGFncworICAgIHR5cGU6IDAsCisg ICAgdXNlTWFwOiAwLAorICAgIHZhbHVlOiAwLAorICAgIHdpZHRoOiAwLAorICAgIHdtb2RlOiAw LAorICAgIHdyYXA6IDAsCisKKyAgICAvKioKKyAgICAgKiBSREZhIFByb3BlcnRpZXMKKyAgICAg Ki8KKyAgICBhYm91dDogMCwKKyAgICBkYXRhdHlwZTogMCwKKyAgICBpbmxpc3Q6IDAsCisgICAg cHJlZml4OiAwLAorICAgIC8vIHByb3BlcnR5IGlzIGFsc28gc3VwcG9ydGVkIGZvciBPcGVuR3Jh cGggaW4gbWV0YSB0YWdzLgorICAgIHByb3BlcnR5OiAwLAorICAgIHJlc291cmNlOiAwLAorICAg ICd0eXBlb2YnOiAwLAorICAgIHZvY2FiOiAwLAorCisgICAgLyoqCisgICAgICogTm9uLXN0YW5k YXJkIFByb3BlcnRpZXMKKyAgICAgKi8KKyAgICAvLyBhdXRvQ2FwaXRhbGl6ZSBhbmQgYXV0b0Nv cnJlY3QgYXJlIHN1cHBvcnRlZCBpbiBNb2JpbGUgU2FmYXJpIGZvcgorICAgIC8vIGtleWJvYXJk IGhpbnRzLgorICAgIGF1dG9DYXBpdGFsaXplOiAwLAorICAgIGF1dG9Db3JyZWN0OiAwLAorICAg IC8vIGF1dG9TYXZlIGFsbG93cyBXZWJLaXQvQmxpbmsgdG8gcGVyc2lzdCB2YWx1ZXMgb2YgaW5w dXQgZmllbGRzIG9uIHBhZ2UgcmVsb2FkcworICAgIGF1dG9TYXZlOiAwLAorICAgIC8vIGNvbG9y IGlzIGZvciBTYWZhcmkgbWFzay1pY29uIGxpbmsKKyAgICBjb2xvcjogMCwKKyAgICAvLyBpdGVt UHJvcCwgaXRlbVNjb3BlLCBpdGVtVHlwZSBhcmUgZm9yCisgICAgLy8gTWljcm9kYXRhIHN1cHBv cnQuIFNlZSBodHRwOi8vc2NoZW1hLm9yZy9kb2NzL2dzLmh0bWwKKyAgICBpdGVtUHJvcDogMCwK KyAgICBpdGVtU2NvcGU6IEhBU19CT09MRUFOX1ZBTFVFLAorICAgIGl0ZW1UeXBlOiAwLAorICAg IC8vIGl0ZW1JRCBhbmQgaXRlbVJlZiBhcmUgZm9yIE1pY3JvZGF0YSBzdXBwb3J0IGFzIHdlbGwg YnV0CisgICAgLy8gb25seSBzcGVjaWZpZWQgaW4gdGhlIFdIQVRXRyBzcGVjIGRvY3VtZW50LiBT ZWUKKyAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9taWNyb2Rh dGEuaHRtbCNtaWNyb2RhdGEtZG9tLWFwaQorICAgIGl0ZW1JRDogMCwKKyAgICBpdGVtUmVmOiAw LAorICAgIC8vIHJlc3VsdHMgc2hvdyBsb29raW5nIGdsYXNzIGljb24gYW5kIHJlY2VudCBzZWFy Y2hlcyBvbiBpbnB1dAorICAgIC8vIHNlYXJjaCBmaWVsZHMgaW4gV2ViS2l0L0JsaW5rCisgICAg cmVzdWx0czogMCwKKyAgICAvLyBJRS1vbmx5IGF0dHJpYnV0ZSB0aGF0IHNwZWNpZmllcyBzZWN1 cml0eSByZXN0cmljdGlvbnMgb24gYW4gaWZyYW1lCisgICAgLy8gYXMgYW4gYWx0ZXJuYXRpdmUg dG8gdGhlIHNhbmRib3ggYXR0cmlidXRlIG9uIElFPDEwCisgICAgc2VjdXJpdHk6IDAsCisgICAg Ly8gSUUtb25seSBhdHRyaWJ1dGUgdGhhdCBjb250cm9scyBmb2N1cyBiZWhhdmlvcgorICAgIHVu c2VsZWN0YWJsZTogMAorICB9LAorICBET01BdHRyaWJ1dGVOYW1lczogeworICAgIGFjY2VwdENo YXJzZXQ6ICdhY2NlcHQtY2hhcnNldCcsCisgICAgY2xhc3NOYW1lOiAnY2xhc3MnLAorICAgIGh0 bWxGb3I6ICdmb3InLAorICAgIGh0dHBFcXVpdjogJ2h0dHAtZXF1aXYnCisgIH0sCisgIERPTVBy b3BlcnR5TmFtZXM6IHt9Cit9OworCittb2R1bGUuZXhwb3J0cyA9IEhUTUxET01Qcm9wZXJ0eUNv bmZpZzsKK30seyIxMSI6MTF9XSwyMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7 CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwg cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5k ZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGlu IHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdy YW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxl IGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisK Ky8qKgorICogRXNjYXBlIGFuZCB3cmFwIGtleSBzbyBpdCBpcyBzYWZlIHRvIHVzZSBhcyBhIHJl YWN0aWQKKyAqCisgKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRvIGJlIGVzY2FwZWQuCisgKiBAcmV0 dXJuIHtzdHJpbmd9IHRoZSBlc2NhcGVkIGtleS4KKyAqLworCitmdW5jdGlvbiBlc2NhcGUoa2V5 KSB7CisgIHZhciBlc2NhcGVSZWdleCA9IC9bPTpdL2c7CisgIHZhciBlc2NhcGVyTG9va3VwID0g eworICAgICc9JzogJz0wJywKKyAgICAnOic6ICc9MicKKyAgfTsKKyAgdmFyIGVzY2FwZWRTdHJp bmcgPSAoJycgKyBrZXkpLnJlcGxhY2UoZXNjYXBlUmVnZXgsIGZ1bmN0aW9uIChtYXRjaCkgewor ICAgIHJldHVybiBlc2NhcGVyTG9va3VwW21hdGNoXTsKKyAgfSk7CisKKyAgcmV0dXJuICckJyAr IGVzY2FwZWRTdHJpbmc7Cit9CisKKy8qKgorICogVW5lc2NhcGUgYW5kIHVud3JhcCBrZXkgZm9y IGh1bWFuLXJlYWRhYmxlIGRpc3BsYXkKKyAqCisgKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRvIHVu ZXNjYXBlLgorICogQHJldHVybiB7c3RyaW5nfSB0aGUgdW5lc2NhcGVkIGtleS4KKyAqLworZnVu Y3Rpb24gdW5lc2NhcGUoa2V5KSB7CisgIHZhciB1bmVzY2FwZVJlZ2V4ID0gLyg9MHw9MikvZzsK KyAgdmFyIHVuZXNjYXBlckxvb2t1cCA9IHsKKyAgICAnPTAnOiAnPScsCisgICAgJz0yJzogJzon CisgIH07CisgIHZhciBrZXlTdWJzdHJpbmcgPSBrZXlbMF0gPT09ICcuJyAmJiBrZXlbMV0gPT09 ICckJyA/IGtleS5zdWJzdHJpbmcoMikgOiBrZXkuc3Vic3RyaW5nKDEpOworCisgIHJldHVybiAo JycgKyBrZXlTdWJzdHJpbmcpLnJlcGxhY2UodW5lc2NhcGVSZWdleCwgZnVuY3Rpb24gKG1hdGNo KSB7CisgICAgcmV0dXJuIHVuZXNjYXBlckxvb2t1cFttYXRjaF07CisgIH0pOworfQorCit2YXIg S2V5RXNjYXBlVXRpbHMgPSB7CisgIGVzY2FwZTogZXNjYXBlLAorICB1bmVzY2FwZTogdW5lc2Nh cGUKK307CisKK21vZHVsZS5leHBvcnRzID0gS2V5RXNjYXBlVXRpbHM7Cit9LHt9XSwyNDpbZnVu Y3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXBy ZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRo aXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZv dW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlz IHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNh biBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAq CisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX3Byb2RJbnZhcmlhbnQgPSBfZGVyZXFfKDEy NSk7CisKK3ZhciBSZWFjdCA9IF9kZXJlcV8oMTM0KTsKK3ZhciBSZWFjdFByb3BUeXBlc1NlY3Jl dCA9IF9kZXJlcV8oNzMpOworCit2YXIgaW52YXJpYW50ID0gX2RlcmVxXygxNTApOwordmFyIHdh cm5pbmcgPSBfZGVyZXFfKDE1Nyk7CisKK3ZhciBoYXNSZWFkT25seVZhbHVlID0geworICAnYnV0 dG9uJzogdHJ1ZSwKKyAgJ2NoZWNrYm94JzogdHJ1ZSwKKyAgJ2ltYWdlJzogdHJ1ZSwKKyAgJ2hp ZGRlbic6IHRydWUsCisgICdyYWRpbyc6IHRydWUsCisgICdyZXNldCc6IHRydWUsCisgICdzdWJt aXQnOiB0cnVlCit9OworCitmdW5jdGlvbiBfYXNzZXJ0U2luZ2xlTGluayhpbnB1dFByb3BzKSB7 CisgICEoaW5wdXRQcm9wcy5jaGVja2VkTGluayA9PSBudWxsIHx8IGlucHV0UHJvcHMudmFsdWVM aW5rID09IG51bGwpID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50 KGZhbHNlLCAnQ2Fubm90IHByb3ZpZGUgYSBjaGVja2VkTGluayBhbmQgYSB2YWx1ZUxpbmsuIElm IHlvdSB3YW50IHRvIHVzZSBjaGVja2VkTGluaywgeW91IHByb2JhYmx5IGRvblwndCB3YW50IHRv IHVzZSB2YWx1ZUxpbmsgYW5kIHZpY2UgdmVyc2EuJykgOiBfcHJvZEludmFyaWFudCgnODcnKSA6 IHZvaWQgMDsKK30KK2Z1bmN0aW9uIF9hc3NlcnRWYWx1ZUxpbmsoaW5wdXRQcm9wcykgeworICBf YXNzZXJ0U2luZ2xlTGluayhpbnB1dFByb3BzKTsKKyAgIShpbnB1dFByb3BzLnZhbHVlID09IG51 bGwgJiYgaW5wdXRQcm9wcy5vbkNoYW5nZSA9PSBudWxsKSA/ICJkZXZlbG9wbWVudCIgIT09ICdw cm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0Nhbm5vdCBwcm92aWRlIGEgdmFsdWVMaW5r IGFuZCBhIHZhbHVlIG9yIG9uQ2hhbmdlIGV2ZW50LiBJZiB5b3Ugd2FudCB0byB1c2UgdmFsdWUg b3Igb25DaGFuZ2UsIHlvdSBwcm9iYWJseSBkb25cJ3Qgd2FudCB0byB1c2UgdmFsdWVMaW5rLicp IDogX3Byb2RJbnZhcmlhbnQoJzg4JykgOiB2b2lkIDA7Cit9CisKK2Z1bmN0aW9uIF9hc3NlcnRD aGVja2VkTGluayhpbnB1dFByb3BzKSB7CisgIF9hc3NlcnRTaW5nbGVMaW5rKGlucHV0UHJvcHMp OworICAhKGlucHV0UHJvcHMuY2hlY2tlZCA9PSBudWxsICYmIGlucHV0UHJvcHMub25DaGFuZ2Ug PT0gbnVsbCkgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFs c2UsICdDYW5ub3QgcHJvdmlkZSBhIGNoZWNrZWRMaW5rIGFuZCBhIGNoZWNrZWQgcHJvcGVydHkg b3Igb25DaGFuZ2UgZXZlbnQuIElmIHlvdSB3YW50IHRvIHVzZSBjaGVja2VkIG9yIG9uQ2hhbmdl LCB5b3UgcHJvYmFibHkgZG9uXCd0IHdhbnQgdG8gdXNlIGNoZWNrZWRMaW5rJykgOiBfcHJvZElu dmFyaWFudCgnODknKSA6IHZvaWQgMDsKK30KKwordmFyIHByb3BUeXBlcyA9IHsKKyAgdmFsdWU6 IGZ1bmN0aW9uIChwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUpIHsKKyAgICBpZiAoIXBy b3BzW3Byb3BOYW1lXSB8fCBoYXNSZWFkT25seVZhbHVlW3Byb3BzLnR5cGVdIHx8IHByb3BzLm9u Q2hhbmdlIHx8IHByb3BzLnJlYWRPbmx5IHx8IHByb3BzLmRpc2FibGVkKSB7CisgICAgICByZXR1 cm4gbnVsbDsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBFcnJvcignWW91IHByb3ZpZGVkIGEgYHZh bHVlYCBwcm9wIHRvIGEgZm9ybSBmaWVsZCB3aXRob3V0IGFuICcgKyAnYG9uQ2hhbmdlYCBoYW5k bGVyLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiBJZiAnICsgJ3RoZSBmaWVs ZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRWYWx1ZWAuIE90aGVyd2lzZSwgJyArICdz ZXQgZWl0aGVyIGBvbkNoYW5nZWAgb3IgYHJlYWRPbmx5YC4nKTsKKyAgfSwKKyAgY2hlY2tlZDog ZnVuY3Rpb24gKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkgeworICAgIGlmICghcHJv cHNbcHJvcE5hbWVdIHx8IHByb3BzLm9uQ2hhbmdlIHx8IHByb3BzLnJlYWRPbmx5IHx8IHByb3Bz LmRpc2FibGVkKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBF cnJvcignWW91IHByb3ZpZGVkIGEgYGNoZWNrZWRgIHByb3AgdG8gYSBmb3JtIGZpZWxkIHdpdGhv dXQgYW4gJyArICdgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9u bHkgZmllbGQuIElmICcgKyAndGhlIGZpZWxkIHNob3VsZCBiZSBtdXRhYmxlIHVzZSBgZGVmYXVs dENoZWNrZWRgLiBPdGhlcndpc2UsICcgKyAnc2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFk T25seWAuJyk7CisgIH0sCisgIG9uQ2hhbmdlOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYworfTsKKwor dmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9OworZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJv ckFkZGVuZHVtKG93bmVyKSB7CisgIGlmIChvd25lcikgeworICAgIHZhciBuYW1lID0gb3duZXIu Z2V0TmFtZSgpOworICAgIGlmIChuYW1lKSB7CisgICAgICByZXR1cm4gJyBDaGVjayB0aGUgcmVu ZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nOworICAgIH0KKyAgfQorICByZXR1cm4gJyc7 Cit9CisKKy8qKgorICogUHJvdmlkZSBhIGxpbmtlZCBgdmFsdWVgIGF0dHJpYnV0ZSBmb3IgY29u dHJvbGxlZCBmb3Jtcy4gWW91IHNob3VsZCBub3QgdXNlCisgKiB0aGlzIG91dHNpZGUgb2YgdGhl IFJlYWN0RE9NIGNvbnRyb2xsZWQgZm9ybSBjb21wb25lbnRzLgorICovCit2YXIgTGlua2VkVmFs dWVVdGlscyA9IHsKKyAgY2hlY2tQcm9wVHlwZXM6IGZ1bmN0aW9uICh0YWdOYW1lLCBwcm9wcywg b3duZXIpIHsKKyAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBwcm9wVHlwZXMpIHsKKyAgICAgIGlm IChwcm9wVHlwZXMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7CisgICAgICAgIHZhciBlcnJv ciA9IHByb3BUeXBlc1twcm9wTmFtZV0ocHJvcHMsIHByb3BOYW1lLCB0YWdOYW1lLCAncHJvcCcs IG51bGwsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTsKKyAgICAgIH0KKyAgICAgIGlmIChlcnJvciBp bnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMp KSB7CisgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRo ZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZQorICAgICAgICAvLyBzYW1lIGVycm9yLgorICAg ICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IubWVzc2FnZV0gPSB0cnVlOworCisgICAgICAg IHZhciBhZGRlbmR1bSA9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShvd25lcik7CisgICAg ICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdGYWls ZWQgZm9ybSBwcm9wVHlwZTogJXMlcycsIGVycm9yLm1lc3NhZ2UsIGFkZGVuZHVtKSA6IHZvaWQg MDsKKyAgICAgIH0KKyAgICB9CisgIH0sCisKKyAgLyoqCisgICAqIEBwYXJhbSB7b2JqZWN0fSBp bnB1dFByb3BzIFByb3BzIGZvciBmb3JtIGNvbXBvbmVudAorICAgKiBAcmV0dXJuIHsqfSBjdXJy ZW50IHZhbHVlIG9mIHRoZSBpbnB1dCBlaXRoZXIgZnJvbSB2YWx1ZSBwcm9wIG9yIGxpbmsuCisg ICAqLworICBnZXRWYWx1ZTogZnVuY3Rpb24gKGlucHV0UHJvcHMpIHsKKyAgICBpZiAoaW5wdXRQ cm9wcy52YWx1ZUxpbmspIHsKKyAgICAgIF9hc3NlcnRWYWx1ZUxpbmsoaW5wdXRQcm9wcyk7Cisg ICAgICByZXR1cm4gaW5wdXRQcm9wcy52YWx1ZUxpbmsudmFsdWU7CisgICAgfQorICAgIHJldHVy biBpbnB1dFByb3BzLnZhbHVlOworICB9LAorCisgIC8qKgorICAgKiBAcGFyYW0ge29iamVjdH0g aW5wdXRQcm9wcyBQcm9wcyBmb3IgZm9ybSBjb21wb25lbnQKKyAgICogQHJldHVybiB7Kn0gY3Vy cmVudCBjaGVja2VkIHN0YXR1cyBvZiB0aGUgaW5wdXQgZWl0aGVyIGZyb20gY2hlY2tlZCBwcm9w CisgICAqICAgICAgICAgICAgIG9yIGxpbmsuCisgICAqLworICBnZXRDaGVja2VkOiBmdW5jdGlv biAoaW5wdXRQcm9wcykgeworICAgIGlmIChpbnB1dFByb3BzLmNoZWNrZWRMaW5rKSB7CisgICAg ICBfYXNzZXJ0Q2hlY2tlZExpbmsoaW5wdXRQcm9wcyk7CisgICAgICByZXR1cm4gaW5wdXRQcm9w cy5jaGVja2VkTGluay52YWx1ZTsKKyAgICB9CisgICAgcmV0dXJuIGlucHV0UHJvcHMuY2hlY2tl ZDsKKyAgfSwKKworICAvKioKKyAgICogQHBhcmFtIHtvYmplY3R9IGlucHV0UHJvcHMgUHJvcHMg Zm9yIGZvcm0gY29tcG9uZW50CisgICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IGNo YW5nZSBldmVudCB0byBoYW5kbGUKKyAgICovCisgIGV4ZWN1dGVPbkNoYW5nZTogZnVuY3Rpb24g KGlucHV0UHJvcHMsIGV2ZW50KSB7CisgICAgaWYgKGlucHV0UHJvcHMudmFsdWVMaW5rKSB7Cisg ICAgICBfYXNzZXJ0VmFsdWVMaW5rKGlucHV0UHJvcHMpOworICAgICAgcmV0dXJuIGlucHV0UHJv cHMudmFsdWVMaW5rLnJlcXVlc3RDaGFuZ2UoZXZlbnQudGFyZ2V0LnZhbHVlKTsKKyAgICB9IGVs c2UgaWYgKGlucHV0UHJvcHMuY2hlY2tlZExpbmspIHsKKyAgICAgIF9hc3NlcnRDaGVja2VkTGlu ayhpbnB1dFByb3BzKTsKKyAgICAgIHJldHVybiBpbnB1dFByb3BzLmNoZWNrZWRMaW5rLnJlcXVl c3RDaGFuZ2UoZXZlbnQudGFyZ2V0LmNoZWNrZWQpOworICAgIH0gZWxzZSBpZiAoaW5wdXRQcm9w cy5vbkNoYW5nZSkgeworICAgICAgcmV0dXJuIGlucHV0UHJvcHMub25DaGFuZ2UuY2FsbCh1bmRl ZmluZWQsIGV2ZW50KTsKKyAgICB9CisgIH0KK307CisKK21vZHVsZS5leHBvcnRzID0gTGlua2Vk VmFsdWVVdGlsczsKK30seyIxMjUiOjEyNSwiMTM0IjoxMzQsIjE1MCI6MTUwLCIxNTciOjE1Nywi NzMiOjczfV0sMjU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBD b3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNl cnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qt c3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBk aXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2Yg cGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2Ft ZSBkaXJlY3RvcnkuCisgKgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX3Byb2RJ bnZhcmlhbnQgPSBfZGVyZXFfKDEyNSk7CisKK3ZhciBpbnZhcmlhbnQgPSBfZGVyZXFfKDE1MCk7 CisKKy8qKgorICogU3RhdGljIHBvb2xlcnMuIFNldmVyYWwgY3VzdG9tIHZlcnNpb25zIGZvciBl YWNoIHBvdGVudGlhbCBudW1iZXIgb2YKKyAqIGFyZ3VtZW50cy4gQSBjb21wbGV0ZWx5IGdlbmVy aWMgcG9vbGVyIGlzIGVhc3kgdG8gaW1wbGVtZW50LCBidXQgd291bGQKKyAqIHJlcXVpcmUgYWNj ZXNzaW5nIHRoZSBgYXJndW1lbnRzYCBvYmplY3QuIEluIGVhY2ggb2YgdGhlc2UsIGB0aGlzYCBy ZWZlcnMgdG8KKyAqIHRoZSBDbGFzcyBpdHNlbGYsIG5vdCBhbiBpbnN0YW5jZS4gSWYgYW55IG90 aGVycyBhcmUgbmVlZGVkLCBzaW1wbHkgYWRkIHRoZW0KKyAqIGhlcmUsIG9yIGluIHRoZWlyIG93 biBmaWxlcy4KKyAqLwordmFyIG9uZUFyZ3VtZW50UG9vbGVyID0gZnVuY3Rpb24gKGNvcHlGaWVs ZHNGcm9tKSB7CisgIHZhciBLbGFzcyA9IHRoaXM7CisgIGlmIChLbGFzcy5pbnN0YW5jZVBvb2wu bGVuZ3RoKSB7CisgICAgdmFyIGluc3RhbmNlID0gS2xhc3MuaW5zdGFuY2VQb29sLnBvcCgpOwor ICAgIEtsYXNzLmNhbGwoaW5zdGFuY2UsIGNvcHlGaWVsZHNGcm9tKTsKKyAgICByZXR1cm4gaW5z dGFuY2U7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5ldyBLbGFzcyhjb3B5RmllbGRzRnJvbSk7 CisgIH0KK307CisKK3ZhciB0d29Bcmd1bWVudFBvb2xlciA9IGZ1bmN0aW9uIChhMSwgYTIpIHsK KyAgdmFyIEtsYXNzID0gdGhpczsKKyAgaWYgKEtsYXNzLmluc3RhbmNlUG9vbC5sZW5ndGgpIHsK KyAgICB2YXIgaW5zdGFuY2UgPSBLbGFzcy5pbnN0YW5jZVBvb2wucG9wKCk7CisgICAgS2xhc3Mu Y2FsbChpbnN0YW5jZSwgYTEsIGEyKTsKKyAgICByZXR1cm4gaW5zdGFuY2U7CisgIH0gZWxzZSB7 CisgICAgcmV0dXJuIG5ldyBLbGFzcyhhMSwgYTIpOworICB9Cit9OworCit2YXIgdGhyZWVBcmd1 bWVudFBvb2xlciA9IGZ1bmN0aW9uIChhMSwgYTIsIGEzKSB7CisgIHZhciBLbGFzcyA9IHRoaXM7 CisgIGlmIChLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoKSB7CisgICAgdmFyIGluc3RhbmNlID0g S2xhc3MuaW5zdGFuY2VQb29sLnBvcCgpOworICAgIEtsYXNzLmNhbGwoaW5zdGFuY2UsIGExLCBh MiwgYTMpOworICAgIHJldHVybiBpbnN0YW5jZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbmV3 IEtsYXNzKGExLCBhMiwgYTMpOworICB9Cit9OworCit2YXIgZm91ckFyZ3VtZW50UG9vbGVyID0g ZnVuY3Rpb24gKGExLCBhMiwgYTMsIGE0KSB7CisgIHZhciBLbGFzcyA9IHRoaXM7CisgIGlmIChL bGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoKSB7CisgICAgdmFyIGluc3RhbmNlID0gS2xhc3MuaW5z dGFuY2VQb29sLnBvcCgpOworICAgIEtsYXNzLmNhbGwoaW5zdGFuY2UsIGExLCBhMiwgYTMsIGE0 KTsKKyAgICByZXR1cm4gaW5zdGFuY2U7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5ldyBLbGFz cyhhMSwgYTIsIGEzLCBhNCk7CisgIH0KK307CisKK3ZhciBzdGFuZGFyZFJlbGVhc2VyID0gZnVu Y3Rpb24gKGluc3RhbmNlKSB7CisgIHZhciBLbGFzcyA9IHRoaXM7CisgICEoaW5zdGFuY2UgaW5z dGFuY2VvZiBLbGFzcykgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlh bnQoZmFsc2UsICdUcnlpbmcgdG8gcmVsZWFzZSBhbiBpbnN0YW5jZSBpbnRvIGEgcG9vbCBvZiBh IGRpZmZlcmVudCB0eXBlLicpIDogX3Byb2RJbnZhcmlhbnQoJzI1JykgOiB2b2lkIDA7CisgIGlu c3RhbmNlLmRlc3RydWN0b3IoKTsKKyAgaWYgKEtsYXNzLmluc3RhbmNlUG9vbC5sZW5ndGggPCBL bGFzcy5wb29sU2l6ZSkgeworICAgIEtsYXNzLmluc3RhbmNlUG9vbC5wdXNoKGluc3RhbmNlKTsK KyAgfQorfTsKKwordmFyIERFRkFVTFRfUE9PTF9TSVpFID0gMTA7Cit2YXIgREVGQVVMVF9QT09M RVIgPSBvbmVBcmd1bWVudFBvb2xlcjsKKworLyoqCisgKiBBdWdtZW50cyBgQ29weUNvbnN0cnVj dG9yYCB0byBiZSBhIHBvb2xhYmxlIGNsYXNzLCBhdWdtZW50aW5nIG9ubHkgdGhlIGNsYXNzCisg KiBpdHNlbGYgKHN0YXRpY2FsbHkpIG5vdCBhZGRpbmcgYW55IHByb3RvdHlwaWNhbCBmaWVsZHMu IEFueSBDb3B5Q29uc3RydWN0b3IKKyAqIHlvdSBnaXZlIHRoaXMgbWF5IGhhdmUgYSBgcG9vbFNp emVgIHByb3BlcnR5LCBhbmQgd2lsbCBsb29rIGZvciBhCisgKiBwcm90b3R5cGljYWwgYGRlc3Ry dWN0b3JgIG9uIGluc3RhbmNlcy4KKyAqCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBDb3B5Q29uc3Ry dWN0b3IgQ29uc3RydWN0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byByZXNldC4KKyAqIEBwYXJhbSB7 RnVuY3Rpb259IHBvb2xlciBDdXN0b21pemFibGUgcG9vbGVyLgorICovCit2YXIgYWRkUG9vbGlu Z1RvID0gZnVuY3Rpb24gKENvcHlDb25zdHJ1Y3RvciwgcG9vbGVyKSB7CisgIC8vIENhc3Rpbmcg YXMgYW55IHNvIHRoYXQgZmxvdyBpZ25vcmVzIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gYW5k IHRydXN0cworICAvLyBpdCB0byBtYXRjaCB0aGUgdHlwZSB3ZSBkZWNsYXJlZAorICB2YXIgTmV3 S2xhc3MgPSBDb3B5Q29uc3RydWN0b3I7CisgIE5ld0tsYXNzLmluc3RhbmNlUG9vbCA9IFtdOwor ICBOZXdLbGFzcy5nZXRQb29sZWQgPSBwb29sZXIgfHwgREVGQVVMVF9QT09MRVI7CisgIGlmICgh TmV3S2xhc3MucG9vbFNpemUpIHsKKyAgICBOZXdLbGFzcy5wb29sU2l6ZSA9IERFRkFVTFRfUE9P TF9TSVpFOworICB9CisgIE5ld0tsYXNzLnJlbGVhc2UgPSBzdGFuZGFyZFJlbGVhc2VyOworICBy ZXR1cm4gTmV3S2xhc3M7Cit9OworCit2YXIgUG9vbGVkQ2xhc3MgPSB7CisgIGFkZFBvb2xpbmdU bzogYWRkUG9vbGluZ1RvLAorICBvbmVBcmd1bWVudFBvb2xlcjogb25lQXJndW1lbnRQb29sZXIs CisgIHR3b0FyZ3VtZW50UG9vbGVyOiB0d29Bcmd1bWVudFBvb2xlciwKKyAgdGhyZWVBcmd1bWVu dFBvb2xlcjogdGhyZWVBcmd1bWVudFBvb2xlciwKKyAgZm91ckFyZ3VtZW50UG9vbGVyOiBmb3Vy QXJndW1lbnRQb29sZXIKK307CisKK21vZHVsZS5leHBvcnRzID0gUG9vbGVkQ2xhc3M7Cit9LHsi MTI1IjoxMjUsIjE1MCI6MTUwfV0sMjY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMp eworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxs IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVu ZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBp biB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBn cmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmls ZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFy IF9hc3NpZ24gPSBfZGVyZXFfKDE1OCk7CisKK3ZhciBFdmVudFBsdWdpblJlZ2lzdHJ5ID0gX2Rl cmVxXygxOCk7Cit2YXIgUmVhY3RFdmVudEVtaXR0ZXJNaXhpbiA9IF9kZXJlcV8oNTYpOwordmFy IFZpZXdwb3J0TWV0cmljcyA9IF9kZXJlcV8oMTAxKTsKKwordmFyIGdldFZlbmRvclByZWZpeGVk RXZlbnROYW1lID0gX2RlcmVxXygxMjApOwordmFyIGlzRXZlbnRTdXBwb3J0ZWQgPSBfZGVyZXFf KDEyMik7CisKKy8qKgorICogU3VtbWFyeSBvZiBgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyYCBl dmVudCBoYW5kbGluZzoKKyAqCisgKiAgLSBUb3AtbGV2ZWwgZGVsZWdhdGlvbiBpcyB1c2VkIHRv IHRyYXAgbW9zdCBuYXRpdmUgYnJvd3NlciBldmVudHMuIFRoaXMKKyAqICAgIG1heSBvbmx5IG9j Y3VyIGluIHRoZSBtYWluIHRocmVhZCBhbmQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mCisgKiAg ICBSZWFjdEV2ZW50TGlzdGVuZXIsIHdoaWNoIGlzIGluamVjdGVkIGFuZCBjYW4gdGhlcmVmb3Jl IHN1cHBvcnQgcGx1Z2dhYmxlCisgKiAgICBldmVudCBzb3VyY2VzLiBUaGlzIGlzIHRoZSBvbmx5 IHdvcmsgdGhhdCBvY2N1cnMgaW4gdGhlIG1haW4gdGhyZWFkLgorICoKKyAqICAtIFdlIG5vcm1h bGl6ZSBhbmQgZGUtZHVwbGljYXRlIGV2ZW50cyB0byBhY2NvdW50IGZvciBicm93c2VyIHF1aXJr cy4gVGhpcworICogICAgbWF5IGJlIGRvbmUgaW4gdGhlIHdvcmtlciB0aHJlYWQuCisgKgorICog IC0gRm9yd2FyZCB0aGVzZSBuYXRpdmUgZXZlbnRzICh3aXRoIHRoZSBhc3NvY2lhdGVkIHRvcC1s ZXZlbCB0eXBlIHVzZWQgdG8KKyAqICAgIHRyYXAgaXQpIHRvIGBFdmVudFBsdWdpbkh1YmAsIHdo aWNoIGluIHR1cm4gd2lsbCBhc2sgcGx1Z2lucyBpZiB0aGV5IHdhbnQKKyAqICAgIHRvIGV4dHJh Y3QgYW55IHN5bnRoZXRpYyBldmVudHMuCisgKgorICogIC0gVGhlIGBFdmVudFBsdWdpbkh1YmAg d2lsbCB0aGVuIHByb2Nlc3MgZWFjaCBldmVudCBieSBhbm5vdGF0aW5nIHRoZW0gd2l0aAorICog ICAgImRpc3BhdGNoZXMiLCBhIHNlcXVlbmNlIG9mIGxpc3RlbmVycyBhbmQgSURzIHRoYXQgY2Fy ZSBhYm91dCB0aGF0IGV2ZW50LgorICoKKyAqICAtIFRoZSBgRXZlbnRQbHVnaW5IdWJgIHRoZW4g ZGlzcGF0Y2hlcyB0aGUgZXZlbnRzLgorICoKKyAqIE92ZXJ2aWV3IG9mIFJlYWN0IGFuZCB0aGUg ZXZlbnQgc3lzdGVtOgorICoKKyAqICstLS0tLS0tLS0tLS0rICAgIC4KKyAqIHwgICAgRE9NICAg ICB8ICAgIC4KKyAqICstLS0tLS0tLS0tLS0rICAgIC4KKyAqICAgICAgIHwgICAgICAgICAgIC4K KyAqICAgICAgIHYgICAgICAgICAgIC4KKyAqICstLS0tLS0tLS0tLS0rICAgIC4KKyAqIHwgUmVh Y3RFdmVudCB8ICAgIC4KKyAqIHwgIExpc3RlbmVyICB8ICAgIC4KKyAqICstLS0tLS0tLS0tLS0r ICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tKworICogICAgICAgfCAg ICAgICAgICAgLiAgICAgICAgICAgICAgICstLS0tLS0tLSt8U2ltcGxlRXZlbnR8CisgKiAgICAg ICB8ICAgICAgICAgICAuICAgICAgICAgICAgICAgfCAgICAgICAgIHxQbHVnaW4gICAgIHwKKyAq ICstLS0tLXwtLS0tLS0rICAgIC4gICAgICAgICAgICAgICB2ICAgICAgICAgKy0tLS0tLS0tLS0t KworICogfCAgICAgfCAgICAgIHwgICAgLiAgICArLS0tLS0tLS0tLS0tLS0rICAgICAgICAgICAg ICAgICAgICArLS0tLS0tLS0tLS0tKworICogfCAgICAgKy0tLS0tLS0tLS0tLi0tLT58RXZlbnRQ bHVnaW5IdWJ8ICAgICAgICAgICAgICAgICAgICB8ICAgIEV2ZW50ICAgfAorICogfCAgICAgICAg ICAgIHwgICAgLiAgICB8ICAgICAgICAgICAgICB8ICAgICArLS0tLS0tLS0tLS0rICB8IFByb3Bh Z2F0b3JzfAorICogfCBSZWFjdEV2ZW50IHwgICAgLiAgICB8ICAgICAgICAgICAgICB8ICAgICB8 VGFwRXZlbnQgICB8ICB8LS0tLS0tLS0tLS0tfAorICogfCAgRW1pdHRlciAgIHwgICAgLiAgICB8 ICAgICAgICAgICAgICB8PC0tLSt8UGx1Z2luICAgICB8ICB8b3RoZXIgcGx1Z2lufAorICogfCAg ICAgICAgICAgIHwgICAgLiAgICB8ICAgICAgICAgICAgICB8ICAgICArLS0tLS0tLS0tLS0rICB8 ICB1dGlsaXRpZXMgfAorICogfCAgICAgKy0tLS0tLS0tLS0tLi0tLT58ICAgICAgICAgICAgICB8 ICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tKworICogfCAgICAgfCAgICAgIHwgICAg LiAgICArLS0tLS0tLS0tLS0tLS0rCisgKiArLS0tLS18LS0tLS0tKyAgICAuICAgICAgICAgICAg ICAgIF4gICAgICAgICstLS0tLS0tLS0tLSsKKyAqICAgICAgIHwgICAgICAgICAgIC4gICAgICAg ICAgICAgICAgfCAgICAgICAgfEVudGVyL0xlYXZlfAorICogICAgICAgKyAgICAgICAgICAgLiAg ICAgICAgICAgICAgICArLS0tLS0tLSt8UGx1Z2luICAgICB8CisgKiArLS0tLS0tLS0tLS0tLSsg ICAuICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsKKyAqIHwgYXBwbGljYXRp b24gfCAgIC4KKyAqIHwtLS0tLS0tLS0tLS0tfCAgIC4KKyAqIHwgICAgICAgICAgICAgfCAgIC4K KyAqIHwgICAgICAgICAgICAgfCAgIC4KKyAqICstLS0tLS0tLS0tLS0tKyAgIC4KKyAqICAgICAg ICAgICAgICAgICAgIC4KKyAqICAgIFJlYWN0IENvcmUgICAgIC4gIEdlbmVyYWwgUHVycG9zZSBF dmVudCBQbHVnaW4gU3lzdGVtCisgKi8KKwordmFyIGhhc0V2ZW50UGFnZVhZOwordmFyIGFscmVh ZHlMaXN0ZW5pbmdUbyA9IHt9OwordmFyIGlzTW9uaXRvcmluZ1Njcm9sbFZhbHVlID0gZmFsc2U7 Cit2YXIgcmVhY3RUb3BMaXN0ZW5lcnNDb3VudGVyID0gMDsKKworLy8gRm9yIGV2ZW50cyBsaWtl ICdzdWJtaXQnIHdoaWNoIGRvbid0IGNvbnNpc3RlbnRseSBidWJibGUgKHdoaWNoIHdlIHRyYXAg YXQgYQorLy8gbG93ZXIgbm9kZSB0aGFuIGBkb2N1bWVudGApLCBiaW5kaW5nIGF0IGBkb2N1bWVu dGAgd291bGQgY2F1c2UgZHVwbGljYXRlCisvLyBldmVudHMgc28gd2UgZG9uJ3QgaW5jbHVkZSB0 aGVtIGhlcmUKK3ZhciB0b3BFdmVudE1hcHBpbmcgPSB7CisgIHRvcEFib3J0OiAnYWJvcnQnLAor ICB0b3BBbmltYXRpb25FbmQ6IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25l bmQnKSB8fCAnYW5pbWF0aW9uZW5kJywKKyAgdG9wQW5pbWF0aW9uSXRlcmF0aW9uOiBnZXRWZW5k b3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uaXRlcmF0aW9uJykgfHwgJ2FuaW1hdGlvbml0 ZXJhdGlvbicsCisgIHRvcEFuaW1hdGlvblN0YXJ0OiBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFt ZSgnYW5pbWF0aW9uc3RhcnQnKSB8fCAnYW5pbWF0aW9uc3RhcnQnLAorICB0b3BCbHVyOiAnYmx1 cicsCisgIHRvcENhblBsYXk6ICdjYW5wbGF5JywKKyAgdG9wQ2FuUGxheVRocm91Z2g6ICdjYW5w bGF5dGhyb3VnaCcsCisgIHRvcENoYW5nZTogJ2NoYW5nZScsCisgIHRvcENsaWNrOiAnY2xpY2sn LAorICB0b3BDb21wb3NpdGlvbkVuZDogJ2NvbXBvc2l0aW9uZW5kJywKKyAgdG9wQ29tcG9zaXRp b25TdGFydDogJ2NvbXBvc2l0aW9uc3RhcnQnLAorICB0b3BDb21wb3NpdGlvblVwZGF0ZTogJ2Nv bXBvc2l0aW9udXBkYXRlJywKKyAgdG9wQ29udGV4dE1lbnU6ICdjb250ZXh0bWVudScsCisgIHRv cENvcHk6ICdjb3B5JywKKyAgdG9wQ3V0OiAnY3V0JywKKyAgdG9wRG91YmxlQ2xpY2s6ICdkYmxj bGljaycsCisgIHRvcERyYWc6ICdkcmFnJywKKyAgdG9wRHJhZ0VuZDogJ2RyYWdlbmQnLAorICB0 b3BEcmFnRW50ZXI6ICdkcmFnZW50ZXInLAorICB0b3BEcmFnRXhpdDogJ2RyYWdleGl0JywKKyAg dG9wRHJhZ0xlYXZlOiAnZHJhZ2xlYXZlJywKKyAgdG9wRHJhZ092ZXI6ICdkcmFnb3ZlcicsCisg IHRvcERyYWdTdGFydDogJ2RyYWdzdGFydCcsCisgIHRvcERyb3A6ICdkcm9wJywKKyAgdG9wRHVy YXRpb25DaGFuZ2U6ICdkdXJhdGlvbmNoYW5nZScsCisgIHRvcEVtcHRpZWQ6ICdlbXB0aWVkJywK KyAgdG9wRW5jcnlwdGVkOiAnZW5jcnlwdGVkJywKKyAgdG9wRW5kZWQ6ICdlbmRlZCcsCisgIHRv cEVycm9yOiAnZXJyb3InLAorICB0b3BGb2N1czogJ2ZvY3VzJywKKyAgdG9wSW5wdXQ6ICdpbnB1 dCcsCisgIHRvcEtleURvd246ICdrZXlkb3duJywKKyAgdG9wS2V5UHJlc3M6ICdrZXlwcmVzcycs CisgIHRvcEtleVVwOiAna2V5dXAnLAorICB0b3BMb2FkZWREYXRhOiAnbG9hZGVkZGF0YScsCisg IHRvcExvYWRlZE1ldGFkYXRhOiAnbG9hZGVkbWV0YWRhdGEnLAorICB0b3BMb2FkU3RhcnQ6ICds b2Fkc3RhcnQnLAorICB0b3BNb3VzZURvd246ICdtb3VzZWRvd24nLAorICB0b3BNb3VzZU1vdmU6 ICdtb3VzZW1vdmUnLAorICB0b3BNb3VzZU91dDogJ21vdXNlb3V0JywKKyAgdG9wTW91c2VPdmVy OiAnbW91c2VvdmVyJywKKyAgdG9wTW91c2VVcDogJ21vdXNldXAnLAorICB0b3BQYXN0ZTogJ3Bh c3RlJywKKyAgdG9wUGF1c2U6ICdwYXVzZScsCisgIHRvcFBsYXk6ICdwbGF5JywKKyAgdG9wUGxh eWluZzogJ3BsYXlpbmcnLAorICB0b3BQcm9ncmVzczogJ3Byb2dyZXNzJywKKyAgdG9wUmF0ZUNo YW5nZTogJ3JhdGVjaGFuZ2UnLAorICB0b3BTY3JvbGw6ICdzY3JvbGwnLAorICB0b3BTZWVrZWQ6 ICdzZWVrZWQnLAorICB0b3BTZWVraW5nOiAnc2Vla2luZycsCisgIHRvcFNlbGVjdGlvbkNoYW5n ZTogJ3NlbGVjdGlvbmNoYW5nZScsCisgIHRvcFN0YWxsZWQ6ICdzdGFsbGVkJywKKyAgdG9wU3Vz cGVuZDogJ3N1c3BlbmQnLAorICB0b3BUZXh0SW5wdXQ6ICd0ZXh0SW5wdXQnLAorICB0b3BUaW1l VXBkYXRlOiAndGltZXVwZGF0ZScsCisgIHRvcFRvdWNoQ2FuY2VsOiAndG91Y2hjYW5jZWwnLAor ICB0b3BUb3VjaEVuZDogJ3RvdWNoZW5kJywKKyAgdG9wVG91Y2hNb3ZlOiAndG91Y2htb3ZlJywK KyAgdG9wVG91Y2hTdGFydDogJ3RvdWNoc3RhcnQnLAorICB0b3BUcmFuc2l0aW9uRW5kOiBnZXRW ZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgndHJhbnNpdGlvbmVuZCcpIHx8ICd0cmFuc2l0aW9uZW5k JywKKyAgdG9wVm9sdW1lQ2hhbmdlOiAndm9sdW1lY2hhbmdlJywKKyAgdG9wV2FpdGluZzogJ3dh aXRpbmcnLAorICB0b3BXaGVlbDogJ3doZWVsJworfTsKKworLyoqCisgKiBUbyBlbnN1cmUgbm8g Y29uZmxpY3RzIHdpdGggb3RoZXIgcG90ZW50aWFsIFJlYWN0IGluc3RhbmNlcyBvbiB0aGUgcGFn ZQorICovCit2YXIgdG9wTGlzdGVuZXJzSURLZXkgPSAnX3JlYWN0TGlzdGVuZXJzSUQnICsgU3Ry aW5nKE1hdGgucmFuZG9tKCkpLnNsaWNlKDIpOworCitmdW5jdGlvbiBnZXRMaXN0ZW5pbmdGb3JE b2N1bWVudChtb3VudEF0KSB7CisgIC8vIEluIElFOCwgYG1vdW50QXRgIGlzIGEgaG9zdCBvYmpl Y3QgYW5kIGRvZXNuJ3QgaGF2ZSBgaGFzT3duUHJvcGVydHlgCisgIC8vIGRpcmVjdGx5LgorICBp ZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb3VudEF0LCB0b3BMaXN0 ZW5lcnNJREtleSkpIHsKKyAgICBtb3VudEF0W3RvcExpc3RlbmVyc0lES2V5XSA9IHJlYWN0VG9w TGlzdGVuZXJzQ291bnRlcisrOworICAgIGFscmVhZHlMaXN0ZW5pbmdUb1ttb3VudEF0W3RvcExp c3RlbmVyc0lES2V5XV0gPSB7fTsKKyAgfQorICByZXR1cm4gYWxyZWFkeUxpc3RlbmluZ1RvW21v dW50QXRbdG9wTGlzdGVuZXJzSURLZXldXTsKK30KKworLyoqCisgKiBgUmVhY3RCcm93c2VyRXZl bnRFbWl0dGVyYCBpcyB1c2VkIHRvIGF0dGFjaCB0b3AtbGV2ZWwgZXZlbnQgbGlzdGVuZXJzLiBG b3IKKyAqIGV4YW1wbGU6CisgKgorICogICBFdmVudFBsdWdpbkh1Yi5wdXRMaXN0ZW5lcignbXlJ RCcsICdvbkNsaWNrJywgbXlGdW5jdGlvbik7CisgKgorICogVGhpcyB3b3VsZCBhbGxvY2F0ZSBh ICJyZWdpc3RyYXRpb24iIG9mIGAoJ29uQ2xpY2snLCBteUZ1bmN0aW9uKWAgb24gJ215SUQnLgor ICoKKyAqIEBpbnRlcm5hbAorICovCit2YXIgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyID0gX2Fz c2lnbih7fSwgUmVhY3RFdmVudEVtaXR0ZXJNaXhpbiwgeworCisgIC8qKgorICAgKiBJbmplY3Rh YmxlIGV2ZW50IGJhY2tlbmQKKyAgICovCisgIFJlYWN0RXZlbnRMaXN0ZW5lcjogbnVsbCwKKwor ICBpbmplY3Rpb246IHsKKyAgICAvKioKKyAgICAgKiBAcGFyYW0ge29iamVjdH0gUmVhY3RFdmVu dExpc3RlbmVyCisgICAgICovCisgICAgaW5qZWN0UmVhY3RFdmVudExpc3RlbmVyOiBmdW5jdGlv biAoUmVhY3RFdmVudExpc3RlbmVyKSB7CisgICAgICBSZWFjdEV2ZW50TGlzdGVuZXIuc2V0SGFu ZGxlVG9wTGV2ZWwoUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLmhhbmRsZVRvcExldmVsKTsKKyAg ICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIgPSBSZWFjdEV2 ZW50TGlzdGVuZXI7CisgICAgfQorICB9LAorCisgIC8qKgorICAgKiBTZXRzIHdoZXRoZXIgb3Ig bm90IGFueSBjcmVhdGVkIGNhbGxiYWNrcyBzaG91bGQgYmUgZW5hYmxlZC4KKyAgICoKKyAgICog QHBhcmFtIHtib29sZWFufSBlbmFibGVkIFRydWUgaWYgY2FsbGJhY2tzIHNob3VsZCBiZSBlbmFi bGVkLgorICAgKi8KKyAgc2V0RW5hYmxlZDogZnVuY3Rpb24gKGVuYWJsZWQpIHsKKyAgICBpZiAo UmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lcikgeworICAgICAgUmVh Y3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci5zZXRFbmFibGVkKGVuYWJs ZWQpOworICAgIH0KKyAgfSwKKworICAvKioKKyAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBp ZiBjYWxsYmFja3MgYXJlIGVuYWJsZWQuCisgICAqLworICBpc0VuYWJsZWQ6IGZ1bmN0aW9uICgp IHsKKyAgICByZXR1cm4gISEoUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0 ZW5lciAmJiBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLmlzRW5h YmxlZCgpKTsKKyAgfSwKKworICAvKioKKyAgICogV2UgbGlzdGVuIGZvciBidWJibGVkIHRvdWNo IGV2ZW50cyBvbiB0aGUgZG9jdW1lbnQgb2JqZWN0LgorICAgKgorICAgKiBGaXJlZm94IHY4LjAx IChhbmQgcG9zc2libHkgb3RoZXJzKSBleGhpYml0ZWQgc3RyYW5nZSBiZWhhdmlvciB3aGVuCisg ICAqIG1vdW50aW5nIGBvbm1vdXNlbW92ZWAgZXZlbnRzIGF0IHNvbWUgbm9kZSB0aGF0IHdhcyBu b3QgdGhlIGRvY3VtZW50CisgICAqIGVsZW1lbnQuIFRoZSBzeW1wdG9tcyB3ZXJlIHRoYXQgaWYg eW91ciBtb3VzZSBpcyBub3QgbW92aW5nIG92ZXIgc29tZXRoaW5nCisgICAqIGNvbnRhaW5lZCB3 aXRoaW4gdGhhdCBtb3VudCBwb2ludCAoZm9yIGV4YW1wbGUgb24gdGhlIGJhY2tncm91bmQpIHRo ZQorICAgKiB0b3AtbGV2ZWwgbGlzdGVuZXJzIGZvciBgb25tb3VzZW1vdmVgIHdvbid0IGJlIGNh bGxlZC4gSG93ZXZlciwgaWYgeW91CisgICAqIHJlZ2lzdGVyIHRoZSBgbW91c2Vtb3ZlYCBvbiB0 aGUgZG9jdW1lbnQgb2JqZWN0LCB0aGVuIGl0IHdpbGwgb2YgY291cnNlCisgICAqIGNhdGNoIGFs bCBgbW91c2Vtb3ZlYHMuIFRoaXMgYWxvbmcgd2l0aCBpT1MgcXVpcmtzLCBqdXN0aWZpZXMgcmVz dHJpY3RpbmcKKyAgICogdG9wLWxldmVsIGxpc3RlbmVycyB0byB0aGUgZG9jdW1lbnQgb2JqZWN0 IG9ubHksIGF0IGxlYXN0IGZvciB0aGVzZQorICAgKiBtb3ZlbWVudCB0eXBlcyBvZiBldmVudHMg YW5kIHBvc3NpYmx5IGFsbCBldmVudHMuCisgICAqCisgICAqIEBzZWUgaHR0cDovL3d3dy5xdWly a3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTAvMDkvY2xpY2tfZXZlbnRfZGVsLmh0bWwKKyAg ICoKKyAgICogQWxzbywgYGtleXVwYC9ga2V5cHJlc3NgL2BrZXlkb3duYCBkbyBub3QgYnViYmxl IHRvIHRoZSB3aW5kb3cgb24gSUUsIGJ1dAorICAgKiB0aGV5IGJ1YmJsZSB0byBkb2N1bWVudC4K KyAgICoKKyAgICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbk5hbWUgTmFtZSBvZiBsaXN0 ZW5lciAoZS5nLiBgb25DbGlja2ApLgorICAgKiBAcGFyYW0ge29iamVjdH0gY29udGVudERvY3Vt ZW50SGFuZGxlIERvY3VtZW50IHdoaWNoIG93bnMgdGhlIGNvbnRhaW5lcgorICAgKi8KKyAgbGlz dGVuVG86IGZ1bmN0aW9uIChyZWdpc3RyYXRpb25OYW1lLCBjb250ZW50RG9jdW1lbnRIYW5kbGUp IHsKKyAgICB2YXIgbW91bnRBdCA9IGNvbnRlbnREb2N1bWVudEhhbmRsZTsKKyAgICB2YXIgaXNM aXN0ZW5pbmcgPSBnZXRMaXN0ZW5pbmdGb3JEb2N1bWVudChtb3VudEF0KTsKKyAgICB2YXIgZGVw ZW5kZW5jaWVzID0gRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5j aWVzW3JlZ2lzdHJhdGlvbk5hbWVdOworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXBlbmRl bmNpZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciBkZXBlbmRlbmN5ID0gZGVwZW5kZW5jaWVz W2ldOworICAgICAgaWYgKCEoaXNMaXN0ZW5pbmcuaGFzT3duUHJvcGVydHkoZGVwZW5kZW5jeSkg JiYgaXNMaXN0ZW5pbmdbZGVwZW5kZW5jeV0pKSB7CisgICAgICAgIGlmIChkZXBlbmRlbmN5ID09 PSAndG9wV2hlZWwnKSB7CisgICAgICAgICAgaWYgKGlzRXZlbnRTdXBwb3J0ZWQoJ3doZWVsJykp IHsKKyAgICAgICAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVu ZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wV2hlZWwnLCAnd2hlZWwnLCBtb3VudEF0KTsKKyAgICAg ICAgICB9IGVsc2UgaWYgKGlzRXZlbnRTdXBwb3J0ZWQoJ21vdXNld2hlZWwnKSkgeworICAgICAg ICAgICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnVi YmxlZEV2ZW50KCd0b3BXaGVlbCcsICdtb3VzZXdoZWVsJywgbW91bnRBdCk7CisgICAgICAgICAg fSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEZpcmVmb3ggbmVlZHMgdG8gY2FwdHVyZSBhIGRpZmZl cmVudCBtb3VzZSBzY3JvbGwgZXZlbnQuCisgICAgICAgICAgICAvLyBAc2VlIGh0dHA6Ly93d3cu cXVpcmtzbW9kZS5vcmcvZG9tL2V2ZW50cy90ZXN0cy9zY3JvbGwuaHRtbAorICAgICAgICAgICAg UmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2 ZW50KCd0b3BXaGVlbCcsICdET01Nb3VzZVNjcm9sbCcsIG1vdW50QXQpOworICAgICAgICAgIH0K KyAgICAgICAgfSBlbHNlIGlmIChkZXBlbmRlbmN5ID09PSAndG9wU2Nyb2xsJykgeworCisgICAg ICAgICAgaWYgKGlzRXZlbnRTdXBwb3J0ZWQoJ3Njcm9sbCcsIHRydWUpKSB7CisgICAgICAgICAg ICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBDYXB0dXJl ZEV2ZW50KCd0b3BTY3JvbGwnLCAnc2Nyb2xsJywgbW91bnRBdCk7CisgICAgICAgICAgfSBlbHNl IHsKKyAgICAgICAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVu ZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wU2Nyb2xsJywgJ3Njcm9sbCcsIFJlYWN0QnJvd3NlckV2 ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIuV0lORE9XX0hBTkRMRSk7CisgICAgICAgICAg fQorICAgICAgICB9IGVsc2UgaWYgKGRlcGVuZGVuY3kgPT09ICd0b3BGb2N1cycgfHwgZGVwZW5k ZW5jeSA9PT0gJ3RvcEJsdXInKSB7CisKKyAgICAgICAgICBpZiAoaXNFdmVudFN1cHBvcnRlZCgn Zm9jdXMnLCB0cnVlKSkgeworICAgICAgICAgICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJl YWN0RXZlbnRMaXN0ZW5lci50cmFwQ2FwdHVyZWRFdmVudCgndG9wRm9jdXMnLCAnZm9jdXMnLCBt b3VudEF0KTsKKyAgICAgICAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50 TGlzdGVuZXIudHJhcENhcHR1cmVkRXZlbnQoJ3RvcEJsdXInLCAnYmx1cicsIG1vdW50QXQpOwor ICAgICAgICAgIH0gZWxzZSBpZiAoaXNFdmVudFN1cHBvcnRlZCgnZm9jdXNpbicpKSB7CisgICAg ICAgICAgICAvLyBJRSBoYXMgYGZvY3VzaW5gIGFuZCBgZm9jdXNvdXRgIGV2ZW50cyB3aGljaCBi dWJibGUuCisgICAgICAgICAgICAvLyBAc2VlIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxv Zy9hcmNoaXZlcy8yMDA4LzA0L2RlbGVnYXRpbmdfdGhlLmh0bWwKKyAgICAgICAgICAgIFJlYWN0 QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudCgn dG9wRm9jdXMnLCAnZm9jdXNpbicsIG1vdW50QXQpOworICAgICAgICAgICAgUmVhY3RCcm93c2Vy RXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KCd0b3BCbHVy JywgJ2ZvY3Vzb3V0JywgbW91bnRBdCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gdG8g bWFrZSBzdXJlIGJsdXIgYW5kIGZvY3VzIGV2ZW50IGxpc3RlbmVycyBhcmUgb25seSBhdHRhY2hl ZCBvbmNlCisgICAgICAgICAgaXNMaXN0ZW5pbmcudG9wQmx1ciA9IHRydWU7CisgICAgICAgICAg aXNMaXN0ZW5pbmcudG9wRm9jdXMgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKHRvcEV2ZW50 TWFwcGluZy5oYXNPd25Qcm9wZXJ0eShkZXBlbmRlbmN5KSkgeworICAgICAgICAgIFJlYWN0QnJv d3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudChkZXBl bmRlbmN5LCB0b3BFdmVudE1hcHBpbmdbZGVwZW5kZW5jeV0sIG1vdW50QXQpOworICAgICAgICB9 CisKKyAgICAgICAgaXNMaXN0ZW5pbmdbZGVwZW5kZW5jeV0gPSB0cnVlOworICAgICAgfQorICAg IH0KKyAgfSwKKworICB0cmFwQnViYmxlZEV2ZW50OiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCBo YW5kbGVyQmFzZU5hbWUsIGhhbmRsZSkgeworICAgIHJldHVybiBSZWFjdEJyb3dzZXJFdmVudEVt aXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQodG9wTGV2ZWxUeXBlLCBo YW5kbGVyQmFzZU5hbWUsIGhhbmRsZSk7CisgIH0sCisKKyAgdHJhcENhcHR1cmVkRXZlbnQ6IGZ1 bmN0aW9uICh0b3BMZXZlbFR5cGUsIGhhbmRsZXJCYXNlTmFtZSwgaGFuZGxlKSB7CisgICAgcmV0 dXJuIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcENhcHR1 cmVkRXZlbnQodG9wTGV2ZWxUeXBlLCBoYW5kbGVyQmFzZU5hbWUsIGhhbmRsZSk7CisgIH0sCisK KyAgLyoqCisgICAqIFByb3RlY3QgYWdhaW5zdCBkb2N1bWVudC5jcmVhdGVFdmVudCgpIHJldHVy bmluZyBudWxsCisgICAqIFNvbWUgcG9wdXAgYmxvY2tlciBleHRlbnNpb25zIGFwcGVhciB0byBk byB0aGlzOgorICAgKiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzY4 ODcKKyAgICovCisgIHN1cHBvcnRzRXZlbnRQYWdlWFk6IGZ1bmN0aW9uICgpIHsKKyAgICBpZiAo IWRvY3VtZW50LmNyZWF0ZUV2ZW50KSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAg IHZhciBldiA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50Jyk7CisgICAgcmV0dXJu IGV2ICE9IG51bGwgJiYgJ3BhZ2VYJyBpbiBldjsKKyAgfSwKKworICAvKioKKyAgICogTGlzdGVu cyB0byB3aW5kb3cgc2Nyb2xsIGFuZCByZXNpemUgZXZlbnRzLiBXZSBjYWNoZSBzY3JvbGwgdmFs dWVzIHNvIHRoYXQKKyAgICogYXBwbGljYXRpb24gY29kZSBjYW4gYWNjZXNzIHRoZW0gd2l0aG91 dCB0cmlnZ2VyaW5nIHJlZmxvd3MuCisgICAqCisgICAqIFZpZXdwb3J0TWV0cmljcyBpcyBvbmx5 IHVzZWQgYnkgU3ludGhldGljTW91c2UvVG91Y2hFdmVudCBhbmQgb25seSB3aGVuCisgICAqIHBh Z2VYL3BhZ2VZIGlzbid0IHN1cHBvcnRlZCAobGVnYWN5IGJyb3dzZXJzKS4KKyAgICoKKyAgICog Tk9URTogU2Nyb2xsIGV2ZW50cyBkbyBub3QgYnViYmxlLgorICAgKgorICAgKiBAc2VlIGh0dHA6 Ly93d3cucXVpcmtzbW9kZS5vcmcvZG9tL2V2ZW50cy9zY3JvbGwuaHRtbAorICAgKi8KKyAgZW5z dXJlU2Nyb2xsVmFsdWVNb25pdG9yaW5nOiBmdW5jdGlvbiAoKSB7CisgICAgaWYgKGhhc0V2ZW50 UGFnZVhZID09PSB1bmRlZmluZWQpIHsKKyAgICAgIGhhc0V2ZW50UGFnZVhZID0gUmVhY3RCcm93 c2VyRXZlbnRFbWl0dGVyLnN1cHBvcnRzRXZlbnRQYWdlWFkoKTsKKyAgICB9CisgICAgaWYgKCFo YXNFdmVudFBhZ2VYWSAmJiAhaXNNb25pdG9yaW5nU2Nyb2xsVmFsdWUpIHsKKyAgICAgIHZhciBy ZWZyZXNoID0gVmlld3BvcnRNZXRyaWNzLnJlZnJlc2hTY3JvbGxWYWx1ZXM7CisgICAgICBSZWFj dEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLm1vbml0b3JTY3JvbGxWYWx1 ZShyZWZyZXNoKTsKKyAgICAgIGlzTW9uaXRvcmluZ1Njcm9sbFZhbHVlID0gdHJ1ZTsKKyAgICB9 CisgIH0KKworfSk7CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVy OworfSx7IjEwMSI6MTAxLCIxMjAiOjEyMCwiMTIyIjoxMjIsIjE1OCI6MTU4LCIxOCI6MTgsIjU2 Ijo1Nn1dLDI3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKyhmdW5jdGlvbiAo cHJvY2Vzcyl7CisvKioKKyAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMu CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGlj ZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5T RSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRp dGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFU RU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3Qn OworCit2YXIgUmVhY3RSZWNvbmNpbGVyID0gX2RlcmVxXyg3NSk7CisKK3ZhciBpbnN0YW50aWF0 ZVJlYWN0Q29tcG9uZW50ID0gX2RlcmVxXygxMjEpOwordmFyIEtleUVzY2FwZVV0aWxzID0gX2Rl cmVxXygyMyk7Cit2YXIgc2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQgPSBfZGVyZXFfKDEyOSk7 Cit2YXIgdHJhdmVyc2VBbGxDaGlsZHJlbiA9IF9kZXJlcV8oMTMwKTsKK3ZhciB3YXJuaW5nID0g X2RlcmVxXygxNTcpOworCit2YXIgUmVhY3RDb21wb25lbnRUcmVlSG9vazsKKworaWYgKHR5cGVv ZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudiAmJiAiZGV2ZWxvcG1lbnQi ID09PSAndGVzdCcpIHsKKyAgLy8gVGVtcG9yYXJ5IGhhY2suCisgIC8vIElubGluZSByZXF1aXJl cyBkb24ndCB3b3JrIHdlbGwgd2l0aCBKZXN0OgorICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFj ZWJvb2svcmVhY3QvaXNzdWVzLzcyNDAKKyAgLy8gUmVtb3ZlIHRoZSBpbmxpbmUgcmVxdWlyZXMg d2hlbiB3ZSBkb24ndCBuZWVkIHRoZW0gYW55bW9yZToKKyAgLy8gaHR0cHM6Ly9naXRodWIuY29t L2ZhY2Vib29rL3JlYWN0L3B1bGwvNzE3OAorICBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gX2Rl cmVxXygxMzIpOworfQorCitmdW5jdGlvbiBpbnN0YW50aWF0ZUNoaWxkKGNoaWxkSW5zdGFuY2Vz LCBjaGlsZCwgbmFtZSwgc2VsZkRlYnVnSUQpIHsKKyAgLy8gV2UgZm91bmQgYSBjb21wb25lbnQg aW5zdGFuY2UuCisgIHZhciBrZXlVbmlxdWUgPSBjaGlsZEluc3RhbmNlc1tuYW1lXSA9PT0gdW5k ZWZpbmVkOworICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgaWYg KCFSZWFjdENvbXBvbmVudFRyZWVIb29rKSB7CisgICAgICBSZWFjdENvbXBvbmVudFRyZWVIb29r ID0gX2RlcmVxXygxMzIpOworICAgIH0KKyAgICBpZiAoIWtleVVuaXF1ZSkgeworICAgICAgImRl dmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2ZsYXR0ZW5DaGls ZHJlbiguLi4pOiBFbmNvdW50ZXJlZCB0d28gY2hpbGRyZW4gd2l0aCB0aGUgc2FtZSBrZXksICcg KyAnYCVzYC4gQ2hpbGQga2V5cyBtdXN0IGJlIHVuaXF1ZTsgd2hlbiB0d28gY2hpbGRyZW4gc2hh cmUgYSBrZXksIG9ubHkgJyArICd0aGUgZmlyc3QgY2hpbGQgd2lsbCBiZSB1c2VkLiVzJywgS2V5 RXNjYXBlVXRpbHMudW5lc2NhcGUobmFtZSksIFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0U3Rh Y2tBZGRlbmR1bUJ5SUQoc2VsZkRlYnVnSUQpKSA6IHZvaWQgMDsKKyAgICB9CisgIH0KKyAgaWYg KGNoaWxkICE9IG51bGwgJiYga2V5VW5pcXVlKSB7CisgICAgY2hpbGRJbnN0YW5jZXNbbmFtZV0g PSBpbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50KGNoaWxkLCB0cnVlKTsKKyAgfQorfQorCisvKioK KyAqIFJlYWN0Q2hpbGRSZWNvbmNpbGVyIHByb3ZpZGVzIGhlbHBlcnMgZm9yIGluaXRpYWxpemlu ZyBvciB1cGRhdGluZyBhIHNldCBvZgorICogY2hpbGRyZW4uIEl0cyBvdXRwdXQgaXMgc3VpdGFi bGUgZm9yIHBhc3NpbmcgaXQgb250byBSZWFjdE11bHRpQ2hpbGQgd2hpY2gKKyAqIGRvZXMgZGlm ZmVkIHJlb3JkZXJpbmcgYW5kIGluc2VydGlvbi4KKyAqLwordmFyIFJlYWN0Q2hpbGRSZWNvbmNp bGVyID0geworICAvKioKKyAgICogR2VuZXJhdGVzIGEgIm1vdW50IGltYWdlIiBmb3IgZWFjaCBv ZiB0aGUgc3VwcGxpZWQgY2hpbGRyZW4uIEluIHRoZSBjYXNlCisgICAqIG9mIGBSZWFjdERPTUNv bXBvbmVudGAsIGEgbW91bnQgaW1hZ2UgaXMgYSBzdHJpbmcgb2YgbWFya3VwLgorICAgKgorICAg KiBAcGFyYW0gez9vYmplY3R9IG5lc3RlZENoaWxkTm9kZXMgTmVzdGVkIGNoaWxkIG1hcHMuCisg ICAqIEByZXR1cm4gez9vYmplY3R9IEEgc2V0IG9mIGNoaWxkIGluc3RhbmNlcy4KKyAgICogQGlu dGVybmFsCisgICAqLworICBpbnN0YW50aWF0ZUNoaWxkcmVuOiBmdW5jdGlvbiAobmVzdGVkQ2hp bGROb2RlcywgdHJhbnNhY3Rpb24sIGNvbnRleHQsIHNlbGZEZWJ1Z0lEIC8vIDAgaW4gcHJvZHVj dGlvbiBhbmQgZm9yIHJvb3RzCisgICkgeworICAgIGlmIChuZXN0ZWRDaGlsZE5vZGVzID09IG51 bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICB2YXIgY2hpbGRJbnN0YW5jZXMg PSB7fTsKKworICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAg IHRyYXZlcnNlQWxsQ2hpbGRyZW4obmVzdGVkQ2hpbGROb2RlcywgZnVuY3Rpb24gKGNoaWxkSW5z dHMsIGNoaWxkLCBuYW1lKSB7CisgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZUNoaWxkKGNoaWxk SW5zdHMsIGNoaWxkLCBuYW1lLCBzZWxmRGVidWdJRCk7CisgICAgICB9LCBjaGlsZEluc3RhbmNl cyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRyYXZlcnNlQWxsQ2hpbGRyZW4obmVzdGVkQ2hpbGRO b2RlcywgaW5zdGFudGlhdGVDaGlsZCwgY2hpbGRJbnN0YW5jZXMpOworICAgIH0KKyAgICByZXR1 cm4gY2hpbGRJbnN0YW5jZXM7CisgIH0sCisKKyAgLyoqCisgICAqIFVwZGF0ZXMgdGhlIHJlbmRl cmVkIGNoaWxkcmVuIGFuZCByZXR1cm5zIGEgbmV3IHNldCBvZiBjaGlsZHJlbi4KKyAgICoKKyAg ICogQHBhcmFtIHs/b2JqZWN0fSBwcmV2Q2hpbGRyZW4gUHJldmlvdXNseSBpbml0aWFsaXplZCBz ZXQgb2YgY2hpbGRyZW4uCisgICAqIEBwYXJhbSB7P29iamVjdH0gbmV4dENoaWxkcmVuIEZsYXQg Y2hpbGQgZWxlbWVudCBtYXBzLgorICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rp b259IHRyYW5zYWN0aW9uCisgICAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0CisgICAqIEByZXR1 cm4gez9vYmplY3R9IEEgbmV3IHNldCBvZiBjaGlsZCBpbnN0YW5jZXMuCisgICAqIEBpbnRlcm5h bAorICAgKi8KKyAgdXBkYXRlQ2hpbGRyZW46IGZ1bmN0aW9uIChwcmV2Q2hpbGRyZW4sIG5leHRD aGlsZHJlbiwgbW91bnRJbWFnZXMsIHJlbW92ZWROb2RlcywgdHJhbnNhY3Rpb24sIGhvc3RQYXJl bnQsIGhvc3RDb250YWluZXJJbmZvLCBjb250ZXh0LCBzZWxmRGVidWdJRCAvLyAwIGluIHByb2R1 Y3Rpb24gYW5kIGZvciByb290cworICApIHsKKyAgICAvLyBXZSBjdXJyZW50bHkgZG9uJ3QgaGF2 ZSBhIHdheSB0byB0cmFjayBtb3ZlcyBoZXJlIGJ1dCBpZiB3ZSB1c2UgaXRlcmF0b3JzCisgICAg Ly8gaW5zdGVhZCBvZiBmb3IuLmluIHdlIGNhbiB6aXAgdGhlIGl0ZXJhdG9ycyBhbmQgY2hlY2sg aWYgYW4gaXRlbSBoYXMKKyAgICAvLyBtb3ZlZC4KKyAgICAvLyBUT0RPOiBJZiBub3RoaW5nIGhh cyBjaGFuZ2VkLCByZXR1cm4gdGhlIHByZXZDaGlsZHJlbiBvYmplY3Qgc28gdGhhdCB3ZQorICAg IC8vIGNhbiBxdWlja2x5IGJhaWxvdXQgaWYgbm90aGluZyBoYXMgY2hhbmdlZC4KKyAgICBpZiAo IW5leHRDaGlsZHJlbiAmJiAhcHJldkNoaWxkcmVuKSB7CisgICAgICByZXR1cm47CisgICAgfQor ICAgIHZhciBuYW1lOworICAgIHZhciBwcmV2Q2hpbGQ7CisgICAgZm9yIChuYW1lIGluIG5leHRD aGlsZHJlbikgeworICAgICAgaWYgKCFuZXh0Q2hpbGRyZW4uaGFzT3duUHJvcGVydHkobmFtZSkp IHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBwcmV2Q2hpbGQgPSBwcmV2Q2hp bGRyZW4gJiYgcHJldkNoaWxkcmVuW25hbWVdOworICAgICAgdmFyIHByZXZFbGVtZW50ID0gcHJl dkNoaWxkICYmIHByZXZDaGlsZC5fY3VycmVudEVsZW1lbnQ7CisgICAgICB2YXIgbmV4dEVsZW1l bnQgPSBuZXh0Q2hpbGRyZW5bbmFtZV07CisgICAgICBpZiAocHJldkNoaWxkICE9IG51bGwgJiYg c2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQocHJldkVsZW1lbnQsIG5leHRFbGVtZW50KSkgewor ICAgICAgICBSZWFjdFJlY29uY2lsZXIucmVjZWl2ZUNvbXBvbmVudChwcmV2Q2hpbGQsIG5leHRF bGVtZW50LCB0cmFuc2FjdGlvbiwgY29udGV4dCk7CisgICAgICAgIG5leHRDaGlsZHJlbltuYW1l XSA9IHByZXZDaGlsZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwcmV2Q2hpbGQpIHsK KyAgICAgICAgICByZW1vdmVkTm9kZXNbbmFtZV0gPSBSZWFjdFJlY29uY2lsZXIuZ2V0SG9zdE5v ZGUocHJldkNoaWxkKTsKKyAgICAgICAgICBSZWFjdFJlY29uY2lsZXIudW5tb3VudENvbXBvbmVu dChwcmV2Q2hpbGQsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICAvLyBUaGUgY2hpbGQgbXVz dCBiZSBpbnN0YW50aWF0ZWQgYmVmb3JlIGl0J3MgbW91bnRlZC4KKyAgICAgICAgdmFyIG5leHRD aGlsZEluc3RhbmNlID0gaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudChuZXh0RWxlbWVudCwgdHJ1 ZSk7CisgICAgICAgIG5leHRDaGlsZHJlbltuYW1lXSA9IG5leHRDaGlsZEluc3RhbmNlOworICAg ICAgICAvLyBDcmVhdGluZyBtb3VudCBpbWFnZSBub3cgZW5zdXJlcyByZWZzIGFyZSByZXNvbHZl ZCBpbiByaWdodCBvcmRlcgorICAgICAgICAvLyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNl Ym9vay9yZWFjdC9wdWxsLzcxMDEgZm9yIGV4cGxhbmF0aW9uKS4KKyAgICAgICAgdmFyIG5leHRD aGlsZE1vdW50SW1hZ2UgPSBSZWFjdFJlY29uY2lsZXIubW91bnRDb21wb25lbnQobmV4dENoaWxk SW5zdGFuY2UsIHRyYW5zYWN0aW9uLCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgY29u dGV4dCwgc2VsZkRlYnVnSUQpOworICAgICAgICBtb3VudEltYWdlcy5wdXNoKG5leHRDaGlsZE1v dW50SW1hZ2UpOworICAgICAgfQorICAgIH0KKyAgICAvLyBVbm1vdW50IGNoaWxkcmVuIHRoYXQg YXJlIG5vIGxvbmdlciBwcmVzZW50LgorICAgIGZvciAobmFtZSBpbiBwcmV2Q2hpbGRyZW4pIHsK KyAgICAgIGlmIChwcmV2Q2hpbGRyZW4uaGFzT3duUHJvcGVydHkobmFtZSkgJiYgIShuZXh0Q2hp bGRyZW4gJiYgbmV4dENoaWxkcmVuLmhhc093blByb3BlcnR5KG5hbWUpKSkgeworICAgICAgICBw cmV2Q2hpbGQgPSBwcmV2Q2hpbGRyZW5bbmFtZV07CisgICAgICAgIHJlbW92ZWROb2Rlc1tuYW1l XSA9IFJlYWN0UmVjb25jaWxlci5nZXRIb3N0Tm9kZShwcmV2Q2hpbGQpOworICAgICAgICBSZWFj dFJlY29uY2lsZXIudW5tb3VudENvbXBvbmVudChwcmV2Q2hpbGQsIGZhbHNlKTsKKyAgICAgIH0K KyAgICB9CisgIH0sCisKKyAgLyoqCisgICAqIFVubW91bnRzIGFsbCByZW5kZXJlZCBjaGlsZHJl bi4gVGhpcyBzaG91bGQgYmUgdXNlZCB0byBjbGVhbiB1cCBjaGlsZHJlbgorICAgKiB3aGVuIHRo aXMgY29tcG9uZW50IGlzIHVubW91bnRlZC4KKyAgICoKKyAgICogQHBhcmFtIHs/b2JqZWN0fSBy ZW5kZXJlZENoaWxkcmVuIFByZXZpb3VzbHkgaW5pdGlhbGl6ZWQgc2V0IG9mIGNoaWxkcmVuLgor ICAgKiBAaW50ZXJuYWwKKyAgICovCisgIHVubW91bnRDaGlsZHJlbjogZnVuY3Rpb24gKHJlbmRl cmVkQ2hpbGRyZW4sIHNhZmVseSkgeworICAgIGZvciAodmFyIG5hbWUgaW4gcmVuZGVyZWRDaGls ZHJlbikgeworICAgICAgaWYgKHJlbmRlcmVkQ2hpbGRyZW4uaGFzT3duUHJvcGVydHkobmFtZSkp IHsKKyAgICAgICAgdmFyIHJlbmRlcmVkQ2hpbGQgPSByZW5kZXJlZENoaWxkcmVuW25hbWVdOwor ICAgICAgICBSZWFjdFJlY29uY2lsZXIudW5tb3VudENvbXBvbmVudChyZW5kZXJlZENoaWxkLCBz YWZlbHkpOworICAgICAgfQorICAgIH0KKyAgfQorCit9OworCittb2R1bGUuZXhwb3J0cyA9IFJl YWN0Q2hpbGRSZWNvbmNpbGVyOworfSkuY2FsbCh0aGlzLHVuZGVmaW5lZCkKK30seyIxMjEiOjEy MSwiMTI5IjoxMjksIjEzMCI6MTMwLCIxMzIiOjEzMiwiMTU3IjoxNTcsIjIzIjoyMywiNzUiOjc1 fV0sMjg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmln aHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4K KyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUg bGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rv cnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50 IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJl Y3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIERPTUNoaWxkcmVuT3BlcmF0 aW9ucyA9IF9kZXJlcV8oOCk7Cit2YXIgUmVhY3RET01JRE9wZXJhdGlvbnMgPSBfZGVyZXFfKDM4 KTsKKworLyoqCisgKiBBYnN0cmFjdHMgYXdheSBhbGwgZnVuY3Rpb25hbGl0eSBvZiB0aGUgcmVj b25jaWxlciB0aGF0IHJlcXVpcmVzIGtub3dsZWRnZSBvZgorICogdGhlIGJyb3dzZXIgY29udGV4 dC4gVE9ETzogVGhlc2UgY2FsbGVycyBzaG91bGQgYmUgcmVmYWN0b3JlZCB0byBhdm9pZCB0aGUK KyAqIG5lZWQgZm9yIHRoaXMgaW5qZWN0aW9uLgorICovCit2YXIgUmVhY3RDb21wb25lbnRCcm93 c2VyRW52aXJvbm1lbnQgPSB7CisKKyAgcHJvY2Vzc0NoaWxkcmVuVXBkYXRlczogUmVhY3RET01J RE9wZXJhdGlvbnMuZGFuZ2Vyb3VzbHlQcm9jZXNzQ2hpbGRyZW5VcGRhdGVzLAorCisgIHJlcGxh Y2VOb2RlV2l0aE1hcmt1cDogRE9NQ2hpbGRyZW5PcGVyYXRpb25zLmRhbmdlcm91c2x5UmVwbGFj ZU5vZGVXaXRoTWFya3VwCisKK307CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RDb21wb25lbnRC cm93c2VyRW52aXJvbm1lbnQ7Cit9LHsiMzgiOjM4LCI4Ijo4fV0sMjk6W2Z1bmN0aW9uKF9kZXJl cV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNl Ym9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBj b2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUK KyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJl ZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQg aW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogCisgKi8K KworJ3VzZSBzdHJpY3QnOworCit2YXIgX3Byb2RJbnZhcmlhbnQgPSBfZGVyZXFfKDEyNSk7CisK K3ZhciBpbnZhcmlhbnQgPSBfZGVyZXFfKDE1MCk7CisKK3ZhciBpbmplY3RlZCA9IGZhbHNlOwor Cit2YXIgUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudCA9IHsKKworICAvKioKKyAgICogT3B0aW9u YWxseSBpbmplY3RhYmxlIGhvb2sgZm9yIHN3YXBwaW5nIG91dCBtb3VudCBpbWFnZXMgaW4gdGhl IG1pZGRsZSBvZgorICAgKiB0aGUgdHJlZS4KKyAgICovCisgIHJlcGxhY2VOb2RlV2l0aE1hcmt1 cDogbnVsbCwKKworICAvKioKKyAgICogT3B0aW9uYWxseSBpbmplY3RhYmxlIGhvb2sgZm9yIHBy b2Nlc3NpbmcgYSBxdWV1ZSBvZiBjaGlsZCB1cGRhdGVzLiBXaWxsCisgICAqIGxhdGVyIG1vdmUg aW50byBNdWx0aUNoaWxkQ29tcG9uZW50cy4KKyAgICovCisgIHByb2Nlc3NDaGlsZHJlblVwZGF0 ZXM6IG51bGwsCisKKyAgaW5qZWN0aW9uOiB7CisgICAgaW5qZWN0RW52aXJvbm1lbnQ6IGZ1bmN0 aW9uIChlbnZpcm9ubWVudCkgeworICAgICAgISFpbmplY3RlZCA/ICJkZXZlbG9wbWVudCIgIT09 ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50 OiBpbmplY3RFbnZpcm9ubWVudCgpIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLicpIDogX3Byb2RJ bnZhcmlhbnQoJzEwNCcpIDogdm9pZCAwOworICAgICAgUmVhY3RDb21wb25lbnRFbnZpcm9ubWVu dC5yZXBsYWNlTm9kZVdpdGhNYXJrdXAgPSBlbnZpcm9ubWVudC5yZXBsYWNlTm9kZVdpdGhNYXJr dXA7CisgICAgICBSZWFjdENvbXBvbmVudEVudmlyb25tZW50LnByb2Nlc3NDaGlsZHJlblVwZGF0 ZXMgPSBlbnZpcm9ubWVudC5wcm9jZXNzQ2hpbGRyZW5VcGRhdGVzOworICAgICAgaW5qZWN0ZWQg PSB0cnVlOworICAgIH0KKyAgfQorCit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q29tcG9u ZW50RW52aXJvbm1lbnQ7Cit9LHsiMTI1IjoxMjUsIjE1MCI6MTUwfV0sMzA6W2Z1bmN0aW9uKF9k ZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBG YWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJj ZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0 aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2Ug dHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91 bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisK Kyd1c2Ugc3RyaWN0JzsKKwordmFyIF9wcm9kSW52YXJpYW50ID0gX2RlcmVxXygxMjUpLAorICAg IF9hc3NpZ24gPSBfZGVyZXFfKDE1OCk7CisKK3ZhciBSZWFjdCA9IF9kZXJlcV8oMTM0KTsKK3Zh ciBSZWFjdENvbXBvbmVudEVudmlyb25tZW50ID0gX2RlcmVxXygyOSk7Cit2YXIgUmVhY3RDdXJy ZW50T3duZXIgPSBfZGVyZXFfKDEzMyk7Cit2YXIgUmVhY3RFcnJvclV0aWxzID0gX2RlcmVxXyg1 NSk7Cit2YXIgUmVhY3RJbnN0YW5jZU1hcCA9IF9kZXJlcV8oNjMpOwordmFyIFJlYWN0SW5zdHJ1 bWVudGF0aW9uID0gX2RlcmVxXyg2NCk7Cit2YXIgUmVhY3ROb2RlVHlwZXMgPSBfZGVyZXFfKDY5 KTsKK3ZhciBSZWFjdFJlY29uY2lsZXIgPSBfZGVyZXFfKDc1KTsKKworaWYgKCJkZXZlbG9wbWVu dCIgIT09ICdwcm9kdWN0aW9uJykgeworICB2YXIgY2hlY2tSZWFjdFR5cGVTcGVjID0gX2RlcmVx XygxMDQpOworfQorCit2YXIgZW1wdHlPYmplY3QgPSBfZGVyZXFfKDE0Myk7Cit2YXIgaW52YXJp YW50ID0gX2RlcmVxXygxNTApOwordmFyIHNoYWxsb3dFcXVhbCA9IF9kZXJlcV8oMTU2KTsKK3Zh ciBzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudCA9IF9kZXJlcV8oMTI5KTsKK3ZhciB3YXJuaW5n ID0gX2RlcmVxXygxNTcpOworCit2YXIgQ29tcG9zaXRlVHlwZXMgPSB7CisgIEltcHVyZUNsYXNz OiAwLAorICBQdXJlQ2xhc3M6IDEsCisgIFN0YXRlbGVzc0Z1bmN0aW9uYWw6IDIKK307CisKK2Z1 bmN0aW9uIFN0YXRlbGVzc0NvbXBvbmVudChDb21wb25lbnQpIHt9CitTdGF0ZWxlc3NDb21wb25l bnQucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHsKKyAgdmFyIENvbXBvbmVudCA9IFJl YWN0SW5zdGFuY2VNYXAuZ2V0KHRoaXMpLl9jdXJyZW50RWxlbWVudC50eXBlOworICB2YXIgZWxl bWVudCA9IENvbXBvbmVudCh0aGlzLnByb3BzLCB0aGlzLmNvbnRleHQsIHRoaXMudXBkYXRlcik7 CisgIHdhcm5JZkludmFsaWRFbGVtZW50KENvbXBvbmVudCwgZWxlbWVudCk7CisgIHJldHVybiBl bGVtZW50OworfTsKKworZnVuY3Rpb24gd2FybklmSW52YWxpZEVsZW1lbnQoQ29tcG9uZW50LCBl bGVtZW50KSB7CisgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAi ZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGVsZW1lbnQgPT09IG51bGwg fHwgZWxlbWVudCA9PT0gZmFsc2UgfHwgUmVhY3QuaXNWYWxpZEVsZW1lbnQoZWxlbWVudCksICcl cyguLi4pOiBBIHZhbGlkIFJlYWN0IGVsZW1lbnQgKG9yIG51bGwpIG11c3QgYmUgcmV0dXJuZWQu IFlvdSBtYXkgaGF2ZSAnICsgJ3JldHVybmVkIHVuZGVmaW5lZCwgYW4gYXJyYXkgb3Igc29tZSBv dGhlciBpbnZhbGlkIG9iamVjdC4nLCBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50 Lm5hbWUgfHwgJ0NvbXBvbmVudCcpIDogdm9pZCAwOworICAgICJkZXZlbG9wbWVudCIgIT09ICdw cm9kdWN0aW9uJyA/IHdhcm5pbmcoIUNvbXBvbmVudC5jaGlsZENvbnRleHRUeXBlcywgJyVzKC4u Lik6IGNoaWxkQ29udGV4dFR5cGVzIGNhbm5vdCBiZSBkZWZpbmVkIG9uIGEgZnVuY3Rpb25hbCBj b21wb25lbnQuJywgQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIHx8ICdD b21wb25lbnQnKSA6IHZvaWQgMDsKKyAgfQorfQorCitmdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3Qo Q29tcG9uZW50KSB7CisgIHJldHVybiAhIShDb21wb25lbnQucHJvdG90eXBlICYmIENvbXBvbmVu dC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7Cit9CisKK2Z1bmN0aW9uIGlzUHVyZUNvbXBv bmVudChDb21wb25lbnQpIHsKKyAgcmV0dXJuICEhKENvbXBvbmVudC5wcm90b3R5cGUgJiYgQ29t cG9uZW50LnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCk7Cit9CisKKy8vIFNlcGFyYXRl ZCBpbnRvIGEgZnVuY3Rpb24gdG8gY29udGFpbiBkZW9wdGltaXphdGlvbnMgY2F1c2VkIGJ5IHRy eS9maW5hbGx5LgorZnVuY3Rpb24gbWVhc3VyZUxpZmVDeWNsZVBlcmYoZm4sIGRlYnVnSUQsIHRp bWVyVHlwZSkgeworICBpZiAoZGVidWdJRCA9PT0gMCkgeworICAgIC8vIFRvcC1sZXZlbCB3cmFw cGVycyAoc2VlIFJlYWN0TW91bnQpIGFuZCBlbXB0eSBjb21wb25lbnRzIChzZWUKKyAgICAvLyBS ZWFjdERPTUVtcHR5Q29tcG9uZW50KSBhcmUgaW52aXNpYmxlIHRvIGhvb2tzIGFuZCBkZXZ0b29s cy4KKyAgICAvLyBCb3RoIGFyZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIHRoYXQgc2hvdWxkIGdv IGF3YXkgaW4gdGhlIGZ1dHVyZS4KKyAgICByZXR1cm4gZm4oKTsKKyAgfQorCisgIFJlYWN0SW5z dHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkJlZ2luTGlmZUN5Y2xlVGltZXIoZGVidWdJRCwgdGlt ZXJUeXBlKTsKKyAgdHJ5IHsKKyAgICByZXR1cm4gZm4oKTsKKyAgfSBmaW5hbGx5IHsKKyAgICBS ZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25FbmRMaWZlQ3ljbGVUaW1lcihkZWJ1Z0lE LCB0aW1lclR5cGUpOworICB9Cit9CisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tIFRoZSBM aWZlLUN5Y2xlIG9mIGEgQ29tcG9zaXRlIENvbXBvbmVudCAtLS0tLS0tLS0tLS0tLS0tLS0KKyAq CisgKiAtIGNvbnN0cnVjdG9yOiBJbml0aWFsaXphdGlvbiBvZiBzdGF0ZS4gVGhlIGluc3RhbmNl IGlzIG5vdyByZXRhaW5lZC4KKyAqICAgLSBjb21wb25lbnRXaWxsTW91bnQKKyAqICAgLSByZW5k ZXIKKyAqICAgLSBbY2hpbGRyZW4ncyBjb25zdHJ1Y3RvcnNdCisgKiAgICAgLSBbY2hpbGRyZW4n cyBjb21wb25lbnRXaWxsTW91bnQgYW5kIHJlbmRlcl0KKyAqICAgICAtIFtjaGlsZHJlbidzIGNv bXBvbmVudERpZE1vdW50XQorICogICAgIC0gY29tcG9uZW50RGlkTW91bnQKKyAqCisgKiAgICAg ICBVcGRhdGUgUGhhc2VzOgorICogICAgICAgLSBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIChv bmx5IGNhbGxlZCBpZiBwYXJlbnQgdXBkYXRlZCkKKyAqICAgICAgIC0gc2hvdWxkQ29tcG9uZW50 VXBkYXRlCisgKiAgICAgICAgIC0gY29tcG9uZW50V2lsbFVwZGF0ZQorICogICAgICAgICAgIC0g cmVuZGVyCisgKiAgICAgICAgICAgLSBbY2hpbGRyZW4ncyBjb25zdHJ1Y3RvcnMgb3IgcmVjZWl2 ZSBwcm9wcyBwaGFzZXNdCisgKiAgICAgICAgIC0gY29tcG9uZW50RGlkVXBkYXRlCisgKgorICog ICAgIC0gY29tcG9uZW50V2lsbFVubW91bnQKKyAqICAgICAtIFtjaGlsZHJlbidzIGNvbXBvbmVu dFdpbGxVbm1vdW50XQorICogICAtIFtjaGlsZHJlbiBkZXN0cm95ZWRdCisgKiAtIChkZXN0cm95 ZWQpOiBUaGUgaW5zdGFuY2UgaXMgbm93IGJsYW5rLCByZWxlYXNlZCBieSBSZWFjdCBhbmQgcmVh ZHkgZm9yIEdDLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyoqCisgKiBB biBpbmNyZW1lbnRpbmcgSUQgYXNzaWduZWQgdG8gZWFjaCBjb21wb25lbnQgd2hlbiBpdCBpcyBt b3VudGVkLiBUaGlzIGlzCisgKiB1c2VkIHRvIGVuZm9yY2UgdGhlIG9yZGVyIGluIHdoaWNoIGBS ZWFjdFVwZGF0ZXNgIHVwZGF0ZXMgZGlydHkgY29tcG9uZW50cy4KKyAqCisgKiBAcHJpdmF0ZQor ICovCit2YXIgbmV4dE1vdW50SUQgPSAxOworCisvKioKKyAqIEBsZW5kcyB7UmVhY3RDb21wb3Np dGVDb21wb25lbnQucHJvdG90eXBlfQorICovCit2YXIgUmVhY3RDb21wb3NpdGVDb21wb25lbnQg PSB7CisKKyAgLyoqCisgICAqIEJhc2UgY29uc3RydWN0b3IgZm9yIGFsbCBjb21wb3NpdGUgY29t cG9uZW50LgorICAgKgorICAgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudAorICAgKiBA ZmluYWwKKyAgICogQGludGVybmFsCisgICAqLworICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIChlbGVt ZW50KSB7CisgICAgdGhpcy5fY3VycmVudEVsZW1lbnQgPSBlbGVtZW50OworICAgIHRoaXMuX3Jv b3ROb2RlSUQgPSAwOworICAgIHRoaXMuX2NvbXBvc2l0ZVR5cGUgPSBudWxsOworICAgIHRoaXMu X2luc3RhbmNlID0gbnVsbDsKKyAgICB0aGlzLl9ob3N0UGFyZW50ID0gbnVsbDsKKyAgICB0aGlz Ll9ob3N0Q29udGFpbmVySW5mbyA9IG51bGw7CisKKyAgICAvLyBTZWUgUmVhY3RVcGRhdGVRdWV1 ZQorICAgIHRoaXMuX3VwZGF0ZUJhdGNoTnVtYmVyID0gbnVsbDsKKyAgICB0aGlzLl9wZW5kaW5n RWxlbWVudCA9IG51bGw7CisgICAgdGhpcy5fcGVuZGluZ1N0YXRlUXVldWUgPSBudWxsOworICAg IHRoaXMuX3BlbmRpbmdSZXBsYWNlU3RhdGUgPSBmYWxzZTsKKyAgICB0aGlzLl9wZW5kaW5nRm9y Y2VVcGRhdGUgPSBmYWxzZTsKKworICAgIHRoaXMuX3JlbmRlcmVkTm9kZVR5cGUgPSBudWxsOwor ICAgIHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50ID0gbnVsbDsKKyAgICB0aGlzLl9jb250ZXh0ID0g bnVsbDsKKyAgICB0aGlzLl9tb3VudE9yZGVyID0gMDsKKyAgICB0aGlzLl90b3BMZXZlbFdyYXBw ZXIgPSBudWxsOworCisgICAgLy8gU2VlIFJlYWN0VXBkYXRlcyBhbmQgUmVhY3RVcGRhdGVRdWV1 ZS4KKyAgICB0aGlzLl9wZW5kaW5nQ2FsbGJhY2tzID0gbnVsbDsKKworICAgIC8vIENvbXBvbmVu dFdpbGxVbm1vdW50IHNoYWxsIG9ubHkgYmUgY2FsbGVkIG9uY2UKKyAgICB0aGlzLl9jYWxsZWRD b21wb25lbnRXaWxsVW5tb3VudCA9IGZhbHNlOworCisgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09 ICdwcm9kdWN0aW9uJykgeworICAgICAgdGhpcy5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSBm YWxzZTsKKyAgICB9CisgIH0sCisKKyAgLyoqCisgICAqIEluaXRpYWxpemVzIHRoZSBjb21wb25l bnQsIHJlbmRlcnMgbWFya3VwLCBhbmQgcmVnaXN0ZXJzIGV2ZW50IGxpc3RlbmVycy4KKyAgICoK KyAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufFJlYWN0U2VydmVyUmVuZGVy aW5nVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uCisgICAqIEBwYXJhbSB7P29iamVjdH0gaG9zdFBh cmVudAorICAgKiBAcGFyYW0gez9vYmplY3R9IGhvc3RDb250YWluZXJJbmZvCisgICAqIEBwYXJh bSB7P29iamVjdH0gY29udGV4dAorICAgKiBAcmV0dXJuIHs/c3RyaW5nfSBSZW5kZXJlZCBtYXJr dXAgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgRE9NLgorICAgKiBAZmluYWwKKyAgICogQGludGVy bmFsCisgICAqLworICBtb3VudENvbXBvbmVudDogZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBob3N0 UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgY29udGV4dCkgeworICAgIHZhciBfdGhpcyA9IHRo aXM7CisKKyAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKKyAgICB0aGlzLl9tb3VudE9yZGVy ID0gbmV4dE1vdW50SUQrKzsKKyAgICB0aGlzLl9ob3N0UGFyZW50ID0gaG9zdFBhcmVudDsKKyAg ICB0aGlzLl9ob3N0Q29udGFpbmVySW5mbyA9IGhvc3RDb250YWluZXJJbmZvOworCisgICAgdmFy IHB1YmxpY1Byb3BzID0gdGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHM7CisgICAgdmFyIHB1Ymxp Y0NvbnRleHQgPSB0aGlzLl9wcm9jZXNzQ29udGV4dChjb250ZXh0KTsKKworICAgIHZhciBDb21w b25lbnQgPSB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlOworCisgICAgdmFyIHVwZGF0ZVF1ZXVl ID0gdHJhbnNhY3Rpb24uZ2V0VXBkYXRlUXVldWUoKTsKKworICAgIC8vIEluaXRpYWxpemUgdGhl IHB1YmxpYyBjbGFzcworICAgIHZhciBkb0NvbnN0cnVjdCA9IHNob3VsZENvbnN0cnVjdChDb21w b25lbnQpOworICAgIHZhciBpbnN0ID0gdGhpcy5fY29uc3RydWN0Q29tcG9uZW50KGRvQ29uc3Ry dWN0LCBwdWJsaWNQcm9wcywgcHVibGljQ29udGV4dCwgdXBkYXRlUXVldWUpOworICAgIHZhciBy ZW5kZXJlZEVsZW1lbnQ7CisKKyAgICAvLyBTdXBwb3J0IGZ1bmN0aW9uYWwgY29tcG9uZW50cwor ICAgIGlmICghZG9Db25zdHJ1Y3QgJiYgKGluc3QgPT0gbnVsbCB8fCBpbnN0LnJlbmRlciA9PSBu dWxsKSkgeworICAgICAgcmVuZGVyZWRFbGVtZW50ID0gaW5zdDsKKyAgICAgIHdhcm5JZkludmFs aWRFbGVtZW50KENvbXBvbmVudCwgcmVuZGVyZWRFbGVtZW50KTsKKyAgICAgICEoaW5zdCA9PT0g bnVsbCB8fCBpbnN0ID09PSBmYWxzZSB8fCBSZWFjdC5pc1ZhbGlkRWxlbWVudChpbnN0KSkgPyAi ZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICclcyguLi4p OiBBIHZhbGlkIFJlYWN0IGVsZW1lbnQgKG9yIG51bGwpIG11c3QgYmUgcmV0dXJuZWQuIFlvdSBt YXkgaGF2ZSByZXR1cm5lZCB1bmRlZmluZWQsIGFuIGFycmF5IG9yIHNvbWUgb3RoZXIgaW52YWxp ZCBvYmplY3QuJywgQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIHx8ICdD b21wb25lbnQnKSA6IF9wcm9kSW52YXJpYW50KCcxMDUnLCBDb21wb25lbnQuZGlzcGxheU5hbWUg fHwgQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCcpIDogdm9pZCAwOworICAgICAgaW5zdCA9 IG5ldyBTdGF0ZWxlc3NDb21wb25lbnQoQ29tcG9uZW50KTsKKyAgICAgIHRoaXMuX2NvbXBvc2l0 ZVR5cGUgPSBDb21wb3NpdGVUeXBlcy5TdGF0ZWxlc3NGdW5jdGlvbmFsOworICAgIH0gZWxzZSB7 CisgICAgICBpZiAoaXNQdXJlQ29tcG9uZW50KENvbXBvbmVudCkpIHsKKyAgICAgICAgdGhpcy5f Y29tcG9zaXRlVHlwZSA9IENvbXBvc2l0ZVR5cGVzLlB1cmVDbGFzczsKKyAgICAgIH0gZWxzZSB7 CisgICAgICAgIHRoaXMuX2NvbXBvc2l0ZVR5cGUgPSBDb21wb3NpdGVUeXBlcy5JbXB1cmVDbGFz czsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rp b24nKSB7CisgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgbGF0ZXIgaW4gX3JlbmRlclZhbGlkYXRl ZENvbXBvbmVudCwgYnV0IGFkZCBhbiBlYXJseQorICAgICAgLy8gd2FybmluZyBub3cgdG8gaGVs cCBkZWJ1Z2dpbmcKKyAgICAgIGlmIChpbnN0LnJlbmRlciA9PSBudWxsKSB7CisgICAgICAgICJk ZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclcyguLi4pOiBO byBgcmVuZGVyYCBtZXRob2QgZm91bmQgb24gdGhlIHJldHVybmVkIGNvbXBvbmVudCAnICsgJ2lu c3RhbmNlOiB5b3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIGRlZmluZSBgcmVuZGVyYC4nLCBDb21w b25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCcpIDogdm9p ZCAwOworICAgICAgfQorCisgICAgICB2YXIgcHJvcHNNdXRhdGVkID0gaW5zdC5wcm9wcyAhPT0g cHVibGljUHJvcHM7CisgICAgICB2YXIgY29tcG9uZW50TmFtZSA9IENvbXBvbmVudC5kaXNwbGF5 TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JzsKKworICAgICAgImRldmVsb3Bt ZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhpbnN0LnByb3BzID09PSB1bmRlZmluZWQg fHwgIXByb3BzTXV0YXRlZCwgJyVzKC4uLik6IFdoZW4gY2FsbGluZyBzdXBlcigpIGluIGAlc2As IG1ha2Ugc3VyZSB0byBwYXNzICcgKyAndXAgdGhlIHNhbWUgcHJvcHMgdGhhdCB5b3VyIGNvbXBv bmVudFwncyBjb25zdHJ1Y3RvciB3YXMgcGFzc2VkLicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVu dE5hbWUpIDogdm9pZCAwOworICAgIH0KKworICAgIC8vIFRoZXNlIHNob3VsZCBiZSBzZXQgdXAg aW4gdGhlIGNvbnN0cnVjdG9yLCBidXQgYXMgYSBjb252ZW5pZW5jZSBmb3IKKyAgICAvLyBzaW1w bGVyIGNsYXNzIGFic3RyYWN0aW9ucywgd2Ugc2V0IHRoZW0gdXAgYWZ0ZXIgdGhlIGZhY3QuCisg ICAgaW5zdC5wcm9wcyA9IHB1YmxpY1Byb3BzOworICAgIGluc3QuY29udGV4dCA9IHB1YmxpY0Nv bnRleHQ7CisgICAgaW5zdC5yZWZzID0gZW1wdHlPYmplY3Q7CisgICAgaW5zdC51cGRhdGVyID0g dXBkYXRlUXVldWU7CisKKyAgICB0aGlzLl9pbnN0YW5jZSA9IGluc3Q7CisKKyAgICAvLyBTdG9y ZSBhIHJlZmVyZW5jZSBmcm9tIHRoZSBpbnN0YW5jZSBiYWNrIHRvIHRoZSBpbnRlcm5hbCByZXBy ZXNlbnRhdGlvbgorICAgIFJlYWN0SW5zdGFuY2VNYXAuc2V0KGluc3QsIHRoaXMpOworCisgICAg aWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgLy8gU2luY2UgcGxh aW4gSlMgY2xhc3NlcyBhcmUgZGVmaW5lZCB3aXRob3V0IGFueSBzcGVjaWFsIGluaXRpYWxpemF0 aW9uCisgICAgICAvLyBsb2dpYywgd2UgY2FuIG5vdCBjYXRjaCBjb21tb24gZXJyb3JzIGVhcmx5 LiBUaGVyZWZvcmUsIHdlIGhhdmUgdG8KKyAgICAgIC8vIGNhdGNoIHRoZW0gaGVyZSwgYXQgaW5p dGlhbGl6YXRpb24gdGltZSwgaW5zdGVhZC4KKyAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9k dWN0aW9uJyA/IHdhcm5pbmcoIWluc3QuZ2V0SW5pdGlhbFN0YXRlIHx8IGluc3QuZ2V0SW5pdGlh bFN0YXRlLmlzUmVhY3RDbGFzc0FwcHJvdmVkIHx8IGluc3Quc3RhdGUsICdnZXRJbml0aWFsU3Rh dGUgd2FzIGRlZmluZWQgb24gJXMsIGEgcGxhaW4gSmF2YVNjcmlwdCBjbGFzcy4gJyArICdUaGlz IGlzIG9ubHkgc3VwcG9ydGVkIGZvciBjbGFzc2VzIGNyZWF0ZWQgdXNpbmcgUmVhY3QuY3JlYXRl Q2xhc3MuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGRlZmluZSBhIHN0YXRlIHByb3BlcnR5IGluc3Rl YWQ/JywgdGhpcy5nZXROYW1lKCkgfHwgJ2EgY29tcG9uZW50JykgOiB2b2lkIDA7CisgICAgICAi ZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFpbnN0LmdldERlZmF1bHRQ cm9wcyB8fCBpbnN0LmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCwgJ2dldERl ZmF1bHRQcm9wcyB3YXMgZGVmaW5lZCBvbiAlcywgYSBwbGFpbiBKYXZhU2NyaXB0IGNsYXNzLiAn ICsgJ1RoaXMgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGNsYXNzZXMgY3JlYXRlZCB1c2luZyBSZWFj dC5jcmVhdGVDbGFzcy4gJyArICdVc2UgYSBzdGF0aWMgcHJvcGVydHkgdG8gZGVmaW5lIGRlZmF1 bHRQcm9wcyBpbnN0ZWFkLicsIHRoaXMuZ2V0TmFtZSgpIHx8ICdhIGNvbXBvbmVudCcpIDogdm9p ZCAwOworICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghaW5z dC5wcm9wVHlwZXMsICdwcm9wVHlwZXMgd2FzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgcHJvcGVy dHkgb24gJXMuIFVzZSBhIHN0YXRpYyAnICsgJ3Byb3BlcnR5IHRvIGRlZmluZSBwcm9wVHlwZXMg aW5zdGVhZC4nLCB0aGlzLmdldE5hbWUoKSB8fCAnYSBjb21wb25lbnQnKSA6IHZvaWQgMDsKKyAg ICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIWluc3QuY29udGV4 dFR5cGVzLCAnY29udGV4dFR5cGVzIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5 IG9uICVzLiBVc2UgYSAnICsgJ3N0YXRpYyBwcm9wZXJ0eSB0byBkZWZpbmUgY29udGV4dFR5cGVz IGluc3RlYWQuJywgdGhpcy5nZXROYW1lKCkgfHwgJ2EgY29tcG9uZW50JykgOiB2b2lkIDA7Cisg ICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHR5cGVvZiBpbnN0 LmNvbXBvbmVudFNob3VsZFVwZGF0ZSAhPT0gJ2Z1bmN0aW9uJywgJyVzIGhhcyBhIG1ldGhvZCBj YWxsZWQgJyArICdjb21wb25lbnRTaG91bGRVcGRhdGUoKS4gRGlkIHlvdSBtZWFuIHNob3VsZENv bXBvbmVudFVwZGF0ZSgpPyAnICsgJ1RoZSBuYW1lIGlzIHBocmFzZWQgYXMgYSBxdWVzdGlvbiBi ZWNhdXNlIHRoZSBmdW5jdGlvbiBpcyAnICsgJ2V4cGVjdGVkIHRvIHJldHVybiBhIHZhbHVlLics IHRoaXMuZ2V0TmFtZSgpIHx8ICdBIGNvbXBvbmVudCcpIDogdm9pZCAwOworICAgICAgImRldmVs b3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyh0eXBlb2YgaW5zdC5jb21wb25lbnRE aWRVbm1vdW50ICE9PSAnZnVuY3Rpb24nLCAnJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2Nv bXBvbmVudERpZFVubW91bnQoKS4gQnV0IHRoZXJlIGlzIG5vIHN1Y2ggbGlmZWN5Y2xlIG1ldGhv ZC4gJyArICdEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFVubW91bnQoKT8nLCB0aGlzLmdldE5h bWUoKSB8fCAnQSBjb21wb25lbnQnKSA6IHZvaWQgMDsKKyAgICAgICJkZXZlbG9wbWVudCIgIT09 ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcodHlwZW9mIGluc3QuY29tcG9uZW50V2lsbFJlY2lldmVQ cm9wcyAhPT0gJ2Z1bmN0aW9uJywgJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25l bnRXaWxsUmVjaWV2ZVByb3BzKCkuIERpZCB5b3UgbWVhbiBjb21wb25lbnRXaWxsUmVjZWl2ZVBy b3BzKCk/JywgdGhpcy5nZXROYW1lKCkgfHwgJ0EgY29tcG9uZW50JykgOiB2b2lkIDA7CisgICAg fQorCisgICAgdmFyIGluaXRpYWxTdGF0ZSA9IGluc3Quc3RhdGU7CisgICAgaWYgKGluaXRpYWxT dGF0ZSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICBpbnN0LnN0YXRlID0gaW5pdGlhbFN0YXRlID0g bnVsbDsKKyAgICB9CisgICAgISh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSAnb2JqZWN0JyAmJiAh QXJyYXkuaXNBcnJheShpbml0aWFsU3RhdGUpKSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0 aW9uJyA/IGludmFyaWFudChmYWxzZSwgJyVzLnN0YXRlOiBtdXN0IGJlIHNldCB0byBhbiBvYmpl Y3Qgb3IgbnVsbCcsIHRoaXMuZ2V0TmFtZSgpIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcp IDogX3Byb2RJbnZhcmlhbnQoJzEwNicsIHRoaXMuZ2V0TmFtZSgpIHx8ICdSZWFjdENvbXBvc2l0 ZUNvbXBvbmVudCcpIDogdm9pZCAwOworCisgICAgdGhpcy5fcGVuZGluZ1N0YXRlUXVldWUgPSBu dWxsOworICAgIHRoaXMuX3BlbmRpbmdSZXBsYWNlU3RhdGUgPSBmYWxzZTsKKyAgICB0aGlzLl9w ZW5kaW5nRm9yY2VVcGRhdGUgPSBmYWxzZTsKKworICAgIHZhciBtYXJrdXA7CisgICAgaWYgKGlu c3QudW5zdGFibGVfaGFuZGxlRXJyb3IpIHsKKyAgICAgIG1hcmt1cCA9IHRoaXMucGVyZm9ybUlu aXRpYWxNb3VudFdpdGhFcnJvckhhbmRsaW5nKHJlbmRlcmVkRWxlbWVudCwgaG9zdFBhcmVudCwg aG9zdENvbnRhaW5lckluZm8sIHRyYW5zYWN0aW9uLCBjb250ZXh0KTsKKyAgICB9IGVsc2Ugewor ICAgICAgbWFya3VwID0gdGhpcy5wZXJmb3JtSW5pdGlhbE1vdW50KHJlbmRlcmVkRWxlbWVudCwg aG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIHRyYW5zYWN0aW9uLCBjb250ZXh0KTsKKyAg ICB9CisKKyAgICBpZiAoaW5zdC5jb21wb25lbnREaWRNb3VudCkgeworICAgICAgaWYgKCJkZXZl bG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFj dE1vdW50UmVhZHkoKS5lbnF1ZXVlKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICBtZWFzdXJlTGlm ZUN5Y2xlUGVyZihmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICByZXR1cm4gaW5zdC5jb21wb25l bnREaWRNb3VudCgpOworICAgICAgICAgIH0sIF90aGlzLl9kZWJ1Z0lELCAnY29tcG9uZW50RGlk TW91bnQnKTsKKyAgICAgICAgfSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0cmFuc2FjdGlv bi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGluc3QuY29tcG9uZW50RGlkTW91bnQsIGlu c3QpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtYXJrdXA7CisgIH0sCisKKyAgX2Nv bnN0cnVjdENvbXBvbmVudDogZnVuY3Rpb24gKGRvQ29uc3RydWN0LCBwdWJsaWNQcm9wcywgcHVi bGljQ29udGV4dCwgdXBkYXRlUXVldWUpIHsKKyAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3By b2R1Y3Rpb24nKSB7CisgICAgICBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ID0gdGhpczsKKyAg ICAgIHRyeSB7CisgICAgICAgIHJldHVybiB0aGlzLl9jb25zdHJ1Y3RDb21wb25lbnRXaXRob3V0 T3duZXIoZG9Db25zdHJ1Y3QsIHB1YmxpY1Byb3BzLCBwdWJsaWNDb250ZXh0LCB1cGRhdGVRdWV1 ZSk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50 ID0gbnVsbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHRoaXMuX2NvbnN0 cnVjdENvbXBvbmVudFdpdGhvdXRPd25lcihkb0NvbnN0cnVjdCwgcHVibGljUHJvcHMsIHB1Ymxp Y0NvbnRleHQsIHVwZGF0ZVF1ZXVlKTsKKyAgICB9CisgIH0sCisKKyAgX2NvbnN0cnVjdENvbXBv bmVudFdpdGhvdXRPd25lcjogZnVuY3Rpb24gKGRvQ29uc3RydWN0LCBwdWJsaWNQcm9wcywgcHVi bGljQ29udGV4dCwgdXBkYXRlUXVldWUpIHsKKyAgICB2YXIgQ29tcG9uZW50ID0gdGhpcy5fY3Vy cmVudEVsZW1lbnQudHlwZTsKKworICAgIGlmIChkb0NvbnN0cnVjdCkgeworICAgICAgaWYgKCJk ZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgICByZXR1cm4gbWVhc3VyZUxp ZmVDeWNsZVBlcmYoZnVuY3Rpb24gKCkgeworICAgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50 KHB1YmxpY1Byb3BzLCBwdWJsaWNDb250ZXh0LCB1cGRhdGVRdWV1ZSk7CisgICAgICAgIH0sIHRo aXMuX2RlYnVnSUQsICdjdG9yJyk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbmV3 IENvbXBvbmVudChwdWJsaWNQcm9wcywgcHVibGljQ29udGV4dCwgdXBkYXRlUXVldWUpOworICAg ICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgY2FuIHN0aWxsIGJlIGFuIGluc3RhbmNlIGluIGNh c2Ugb2YgZmFjdG9yeSBjb21wb25lbnRzCisgICAgLy8gYnV0IHdlJ2xsIGNvdW50IHRoaXMgYXMg dGltZSBzcGVudCByZW5kZXJpbmcgYXMgdGhlIG1vcmUgY29tbW9uIGNhc2UuCisgICAgaWYgKCJk ZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgcmV0dXJuIG1lYXN1cmVMaWZl Q3ljbGVQZXJmKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIENvbXBvbmVudChwdWJsaWNQ cm9wcywgcHVibGljQ29udGV4dCwgdXBkYXRlUXVldWUpOworICAgICAgfSwgdGhpcy5fZGVidWdJ RCwgJ3JlbmRlcicpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gQ29tcG9uZW50KHB1Ymxp Y1Byb3BzLCBwdWJsaWNDb250ZXh0LCB1cGRhdGVRdWV1ZSk7CisgICAgfQorICB9LAorCisgIHBl cmZvcm1Jbml0aWFsTW91bnRXaXRoRXJyb3JIYW5kbGluZzogZnVuY3Rpb24gKHJlbmRlcmVkRWxl bWVudCwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIHRyYW5zYWN0aW9uLCBjb250ZXh0 KSB7CisgICAgdmFyIG1hcmt1cDsKKyAgICB2YXIgY2hlY2twb2ludCA9IHRyYW5zYWN0aW9uLmNo ZWNrcG9pbnQoKTsKKyAgICB0cnkgeworICAgICAgbWFya3VwID0gdGhpcy5wZXJmb3JtSW5pdGlh bE1vdW50KHJlbmRlcmVkRWxlbWVudCwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIHRy YW5zYWN0aW9uLCBjb250ZXh0KTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgICAvLyBSb2xsIGJh Y2sgdG8gY2hlY2twb2ludCwgaGFuZGxlIGVycm9yICh3aGljaCBtYXkgYWRkIGl0ZW1zIHRvIHRo ZSB0cmFuc2FjdGlvbiksIGFuZCB0YWtlIGEgbmV3IGNoZWNrcG9pbnQKKyAgICAgIHRyYW5zYWN0 aW9uLnJvbGxiYWNrKGNoZWNrcG9pbnQpOworICAgICAgdGhpcy5faW5zdGFuY2UudW5zdGFibGVf aGFuZGxlRXJyb3IoZSk7CisgICAgICBpZiAodGhpcy5fcGVuZGluZ1N0YXRlUXVldWUpIHsKKyAg ICAgICAgdGhpcy5faW5zdGFuY2Uuc3RhdGUgPSB0aGlzLl9wcm9jZXNzUGVuZGluZ1N0YXRlKHRo aXMuX2luc3RhbmNlLnByb3BzLCB0aGlzLl9pbnN0YW5jZS5jb250ZXh0KTsKKyAgICAgIH0KKyAg ICAgIGNoZWNrcG9pbnQgPSB0cmFuc2FjdGlvbi5jaGVja3BvaW50KCk7CisKKyAgICAgIHRoaXMu X3JlbmRlcmVkQ29tcG9uZW50LnVubW91bnRDb21wb25lbnQodHJ1ZSk7CisgICAgICB0cmFuc2Fj dGlvbi5yb2xsYmFjayhjaGVja3BvaW50KTsKKworICAgICAgLy8gVHJ5IGFnYWluIC0gd2UndmUg aW5mb3JtZWQgdGhlIGNvbXBvbmVudCBhYm91dCB0aGUgZXJyb3IsIHNvIHRoZXkgY2FuIHJlbmRl ciBhbiBlcnJvciBtZXNzYWdlIHRoaXMgdGltZS4KKyAgICAgIC8vIElmIHRoaXMgdGhyb3dzIGFn YWluLCB0aGUgZXJyb3Igd2lsbCBidWJibGUgdXAgKGFuZCBjYW4gYmUgY2F1Z2h0IGJ5IGEgaGln aGVyIGVycm9yIGJvdW5kYXJ5KS4KKyAgICAgIG1hcmt1cCA9IHRoaXMucGVyZm9ybUluaXRpYWxN b3VudChyZW5kZXJlZEVsZW1lbnQsIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCB0cmFu c2FjdGlvbiwgY29udGV4dCk7CisgICAgfQorICAgIHJldHVybiBtYXJrdXA7CisgIH0sCisKKyAg cGVyZm9ybUluaXRpYWxNb3VudDogZnVuY3Rpb24gKHJlbmRlcmVkRWxlbWVudCwgaG9zdFBhcmVu dCwgaG9zdENvbnRhaW5lckluZm8sIHRyYW5zYWN0aW9uLCBjb250ZXh0KSB7CisgICAgdmFyIGlu c3QgPSB0aGlzLl9pbnN0YW5jZTsKKworICAgIHZhciBkZWJ1Z0lEID0gMDsKKyAgICBpZiAoImRl dmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICBkZWJ1Z0lEID0gdGhpcy5fZGVi dWdJRDsKKyAgICB9CisKKyAgICBpZiAoaW5zdC5jb21wb25lbnRXaWxsTW91bnQpIHsKKyAgICAg IGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICAgbWVhc3VyZUxp ZmVDeWNsZVBlcmYoZnVuY3Rpb24gKCkgeworICAgICAgICAgIHJldHVybiBpbnN0LmNvbXBvbmVu dFdpbGxNb3VudCgpOworICAgICAgICB9LCBkZWJ1Z0lELCAnY29tcG9uZW50V2lsbE1vdW50Jyk7 CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnN0LmNvbXBvbmVudFdpbGxNb3VudCgpOworICAg ICAgfQorICAgICAgLy8gV2hlbiBtb3VudGluZywgY2FsbHMgdG8gYHNldFN0YXRlYCBieSBgY29t cG9uZW50V2lsbE1vdW50YCB3aWxsIHNldAorICAgICAgLy8gYHRoaXMuX3BlbmRpbmdTdGF0ZVF1 ZXVlYCB3aXRob3V0IHRyaWdnZXJpbmcgYSByZS1yZW5kZXIuCisgICAgICBpZiAodGhpcy5fcGVu ZGluZ1N0YXRlUXVldWUpIHsKKyAgICAgICAgaW5zdC5zdGF0ZSA9IHRoaXMuX3Byb2Nlc3NQZW5k aW5nU3RhdGUoaW5zdC5wcm9wcywgaW5zdC5jb250ZXh0KTsKKyAgICAgIH0KKyAgICB9CisKKyAg ICAvLyBJZiBub3QgYSBzdGF0ZWxlc3MgY29tcG9uZW50LCB3ZSBub3cgcmVuZGVyCisgICAgaWYg KHJlbmRlcmVkRWxlbWVudCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICByZW5kZXJlZEVsZW1lbnQg PSB0aGlzLl9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnQoKTsKKyAgICB9CisKKyAgICB2YXIgbm9k ZVR5cGUgPSBSZWFjdE5vZGVUeXBlcy5nZXRUeXBlKHJlbmRlcmVkRWxlbWVudCk7CisgICAgdGhp cy5fcmVuZGVyZWROb2RlVHlwZSA9IG5vZGVUeXBlOworICAgIHZhciBjaGlsZCA9IHRoaXMuX2lu c3RhbnRpYXRlUmVhY3RDb21wb25lbnQocmVuZGVyZWRFbGVtZW50LCBub2RlVHlwZSAhPT0gUmVh Y3ROb2RlVHlwZXMuRU1QVFkgLyogc2hvdWxkSGF2ZURlYnVnSUQgKi8KKyAgICApOworICAgIHRo aXMuX3JlbmRlcmVkQ29tcG9uZW50ID0gY2hpbGQ7CisKKyAgICB2YXIgbWFya3VwID0gUmVhY3RS ZWNvbmNpbGVyLm1vdW50Q29tcG9uZW50KGNoaWxkLCB0cmFuc2FjdGlvbiwgaG9zdFBhcmVudCwg aG9zdENvbnRhaW5lckluZm8sIHRoaXMuX3Byb2Nlc3NDaGlsZENvbnRleHQoY29udGV4dCksIGRl YnVnSUQpOworCisgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAg ICAgaWYgKGRlYnVnSUQgIT09IDApIHsKKyAgICAgICAgdmFyIGNoaWxkRGVidWdJRHMgPSBjaGls ZC5fZGVidWdJRCAhPT0gMCA/IFtjaGlsZC5fZGVidWdJRF0gOiBbXTsKKyAgICAgICAgUmVhY3RJ bnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uU2V0Q2hpbGRyZW4oZGVidWdJRCwgY2hpbGREZWJ1 Z0lEcyk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1hcmt1cDsKKyAgfSwKKworICBn ZXRIb3N0Tm9kZTogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBSZWFjdFJlY29uY2lsZXIuZ2V0 SG9zdE5vZGUodGhpcy5fcmVuZGVyZWRDb21wb25lbnQpOworICB9LAorCisgIC8qKgorICAgKiBS ZWxlYXNlcyBhbnkgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSBgbW91bnRDb21wb25lbnRgLgorICAg KgorICAgKiBAZmluYWwKKyAgICogQGludGVybmFsCisgICAqLworICB1bm1vdW50Q29tcG9uZW50 OiBmdW5jdGlvbiAoc2FmZWx5KSB7CisgICAgaWYgKCF0aGlzLl9yZW5kZXJlZENvbXBvbmVudCkg eworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBpbnN0ID0gdGhpcy5faW5zdGFuY2U7 CisKKyAgICBpZiAoaW5zdC5jb21wb25lbnRXaWxsVW5tb3VudCAmJiAhaW5zdC5fY2FsbGVkQ29t cG9uZW50V2lsbFVubW91bnQpIHsKKyAgICAgIGluc3QuX2NhbGxlZENvbXBvbmVudFdpbGxVbm1v dW50ID0gdHJ1ZTsKKworICAgICAgaWYgKHNhZmVseSkgeworICAgICAgICB2YXIgbmFtZSA9IHRo aXMuZ2V0TmFtZSgpICsgJy5jb21wb25lbnRXaWxsVW5tb3VudCgpJzsKKyAgICAgICAgUmVhY3RF cnJvclV0aWxzLmludm9rZUd1YXJkZWRDYWxsYmFjayhuYW1lLCBpbnN0LmNvbXBvbmVudFdpbGxV bm1vdW50LmJpbmQoaW5zdCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCJkZXZlbG9w bWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgICAgIG1lYXN1cmVMaWZlQ3ljbGVQZXJm KGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnN0LmNvbXBvbmVudFdpbGxVbm1v dW50KCk7CisgICAgICAgICAgfSwgdGhpcy5fZGVidWdJRCwgJ2NvbXBvbmVudFdpbGxVbm1vdW50 Jyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5zdC5jb21wb25lbnRXaWxsVW5tb3Vu dCgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHRoaXMuX3JlbmRlcmVk Q29tcG9uZW50KSB7CisgICAgICBSZWFjdFJlY29uY2lsZXIudW5tb3VudENvbXBvbmVudCh0aGlz Ll9yZW5kZXJlZENvbXBvbmVudCwgc2FmZWx5KTsKKyAgICAgIHRoaXMuX3JlbmRlcmVkTm9kZVR5 cGUgPSBudWxsOworICAgICAgdGhpcy5fcmVuZGVyZWRDb21wb25lbnQgPSBudWxsOworICAgICAg dGhpcy5faW5zdGFuY2UgPSBudWxsOworICAgIH0KKworICAgIC8vIFJlc2V0IHBlbmRpbmcgZmll bGRzCisgICAgLy8gRXZlbiBpZiB0aGlzIGNvbXBvbmVudCBpcyBzY2hlZHVsZWQgZm9yIGFub3Ro ZXIgdXBkYXRlIGluIFJlYWN0VXBkYXRlcywKKyAgICAvLyBpdCB3b3VsZCBzdGlsbCBiZSBpZ25v cmVkIGJlY2F1c2UgdGhlc2UgZmllbGRzIGFyZSByZXNldC4KKyAgICB0aGlzLl9wZW5kaW5nU3Rh dGVRdWV1ZSA9IG51bGw7CisgICAgdGhpcy5fcGVuZGluZ1JlcGxhY2VTdGF0ZSA9IGZhbHNlOwor ICAgIHRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZSA9IGZhbHNlOworICAgIHRoaXMuX3BlbmRpbmdD YWxsYmFja3MgPSBudWxsOworICAgIHRoaXMuX3BlbmRpbmdFbGVtZW50ID0gbnVsbDsKKworICAg IC8vIFRoZXNlIGZpZWxkcyBkbyBub3QgcmVhbGx5IG5lZWQgdG8gYmUgcmVzZXQgc2luY2UgdGhp cyBvYmplY3QgaXMgbm8KKyAgICAvLyBsb25nZXIgYWNjZXNzaWJsZS4KKyAgICB0aGlzLl9jb250 ZXh0ID0gbnVsbDsKKyAgICB0aGlzLl9yb290Tm9kZUlEID0gMDsKKyAgICB0aGlzLl90b3BMZXZl bFdyYXBwZXIgPSBudWxsOworCisgICAgLy8gRGVsZXRlIHRoZSByZWZlcmVuY2UgZnJvbSB0aGUg aW5zdGFuY2UgdG8gdGhpcyBpbnRlcm5hbCByZXByZXNlbnRhdGlvbgorICAgIC8vIHdoaWNoIGFs bG93IHRoZSBpbnRlcm5hbHMgdG8gYmUgcHJvcGVybHkgY2xlYW5lZCB1cCBldmVuIGlmIHRoZSB1 c2VyCisgICAgLy8gbGVha3MgYSByZWZlcmVuY2UgdG8gdGhlIHB1YmxpYyBpbnN0YW5jZS4KKyAg ICBSZWFjdEluc3RhbmNlTWFwLnJlbW92ZShpbnN0KTsKKworICAgIC8vIFNvbWUgZXhpc3Rpbmcg Y29tcG9uZW50cyByZWx5IG9uIGluc3QucHJvcHMgZXZlbiBhZnRlciB0aGV5J3ZlIGJlZW4KKyAg ICAvLyBkZXN0cm95ZWQgKGluIGV2ZW50IGhhbmRsZXJzKS4KKyAgICAvLyBUT0RPOiBpbnN0LnBy b3BzID0gbnVsbDsKKyAgICAvLyBUT0RPOiBpbnN0LnN0YXRlID0gbnVsbDsKKyAgICAvLyBUT0RP OiBpbnN0LmNvbnRleHQgPSBudWxsOworICB9LAorCisgIC8qKgorICAgKiBGaWx0ZXJzIHRoZSBj b250ZXh0IG9iamVjdCB0byBvbmx5IGNvbnRhaW4ga2V5cyBzcGVjaWZpZWQgaW4KKyAgICogYGNv bnRleHRUeXBlc2AKKyAgICoKKyAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHQKKyAgICogQHJl dHVybiB7P29iamVjdH0KKyAgICogQHByaXZhdGUKKyAgICovCisgIF9tYXNrQ29udGV4dDogZnVu Y3Rpb24gKGNvbnRleHQpIHsKKyAgICB2YXIgQ29tcG9uZW50ID0gdGhpcy5fY3VycmVudEVsZW1l bnQudHlwZTsKKyAgICB2YXIgY29udGV4dFR5cGVzID0gQ29tcG9uZW50LmNvbnRleHRUeXBlczsK KyAgICBpZiAoIWNvbnRleHRUeXBlcykgeworICAgICAgcmV0dXJuIGVtcHR5T2JqZWN0OworICAg IH0KKyAgICB2YXIgbWFza2VkQ29udGV4dCA9IHt9OworICAgIGZvciAodmFyIGNvbnRleHROYW1l IGluIGNvbnRleHRUeXBlcykgeworICAgICAgbWFza2VkQ29udGV4dFtjb250ZXh0TmFtZV0gPSBj b250ZXh0W2NvbnRleHROYW1lXTsKKyAgICB9CisgICAgcmV0dXJuIG1hc2tlZENvbnRleHQ7Cisg IH0sCisKKyAgLyoqCisgICAqIEZpbHRlcnMgdGhlIGNvbnRleHQgb2JqZWN0IHRvIG9ubHkgY29u dGFpbiBrZXlzIHNwZWNpZmllZCBpbgorICAgKiBgY29udGV4dFR5cGVzYCwgYW5kIGFzc2VydHMg dGhhdCB0aGV5IGFyZSB2YWxpZC4KKyAgICoKKyAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHQK KyAgICogQHJldHVybiB7P29iamVjdH0KKyAgICogQHByaXZhdGUKKyAgICovCisgIF9wcm9jZXNz Q29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHsKKyAgICB2YXIgbWFza2VkQ29udGV4dCA9IHRo aXMuX21hc2tDb250ZXh0KGNvbnRleHQpOworICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJv ZHVjdGlvbicpIHsKKyAgICAgIHZhciBDb21wb25lbnQgPSB0aGlzLl9jdXJyZW50RWxlbWVudC50 eXBlOworICAgICAgaWYgKENvbXBvbmVudC5jb250ZXh0VHlwZXMpIHsKKyAgICAgICAgdGhpcy5f Y2hlY2tDb250ZXh0VHlwZXMoQ29tcG9uZW50LmNvbnRleHRUeXBlcywgbWFza2VkQ29udGV4dCwg J2NvbnRleHQnKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1hc2tlZENvbnRleHQ7Cisg IH0sCisKKyAgLyoqCisgICAqIEBwYXJhbSB7b2JqZWN0fSBjdXJyZW50Q29udGV4dAorICAgKiBA cmV0dXJuIHtvYmplY3R9CisgICAqIEBwcml2YXRlCisgICAqLworICBfcHJvY2Vzc0NoaWxkQ29u dGV4dDogZnVuY3Rpb24gKGN1cnJlbnRDb250ZXh0KSB7CisgICAgdmFyIENvbXBvbmVudCA9IHRo aXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7CisgICAgdmFyIGluc3QgPSB0aGlzLl9pbnN0YW5jZTsK KyAgICB2YXIgY2hpbGRDb250ZXh0OworCisgICAgaWYgKGluc3QuZ2V0Q2hpbGRDb250ZXh0KSB7 CisgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAgIFJl YWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkJlZ2luUHJvY2Vzc2luZ0NoaWxkQ29udGV4 dCgpOworICAgICAgICB0cnkgeworICAgICAgICAgIGNoaWxkQ29udGV4dCA9IGluc3QuZ2V0Q2hp bGRDb250ZXh0KCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgUmVhY3RJbnN0cnVt ZW50YXRpb24uZGVidWdUb29sLm9uRW5kUHJvY2Vzc2luZ0NoaWxkQ29udGV4dCgpOworICAgICAg ICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBjaGlsZENvbnRleHQgPSBpbnN0LmdldENoaWxk Q29udGV4dCgpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChjaGlsZENvbnRleHQpIHsKKyAg ICAgICEodHlwZW9mIENvbXBvbmVudC5jaGlsZENvbnRleHRUeXBlcyA9PT0gJ29iamVjdCcpID8g ImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMuZ2V0 Q2hpbGRDb250ZXh0KCk6IGNoaWxkQ29udGV4dFR5cGVzIG11c3QgYmUgZGVmaW5lZCBpbiBvcmRl ciB0byB1c2UgZ2V0Q2hpbGRDb250ZXh0KCkuJywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29t cG9zaXRlQ29tcG9uZW50JykgOiBfcHJvZEludmFyaWFudCgnMTA3JywgdGhpcy5nZXROYW1lKCkg fHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiB2b2lkIDA7CisgICAgICBpZiAoImRldmVs b3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAgIHRoaXMuX2NoZWNrQ29udGV4dFR5 cGVzKENvbXBvbmVudC5jaGlsZENvbnRleHRUeXBlcywgY2hpbGRDb250ZXh0LCAnY2hpbGRDb250 ZXh0Jyk7CisgICAgICB9CisgICAgICBmb3IgKHZhciBuYW1lIGluIGNoaWxkQ29udGV4dCkgewor ICAgICAgICAhKG5hbWUgaW4gQ29tcG9uZW50LmNoaWxkQ29udGV4dFR5cGVzKSA/ICJkZXZlbG9w bWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJyVzLmdldENoaWxkQ29u dGV4dCgpOiBrZXkgIiVzIiBpcyBub3QgZGVmaW5lZCBpbiBjaGlsZENvbnRleHRUeXBlcy4nLCB0 aGlzLmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnLCBuYW1lKSA6IF9wcm9k SW52YXJpYW50KCcxMDgnLCB0aGlzLmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25l bnQnLCBuYW1lKSA6IHZvaWQgMDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfYXNzaWduKHt9LCBj dXJyZW50Q29udGV4dCwgY2hpbGRDb250ZXh0KTsKKyAgICB9CisgICAgcmV0dXJuIGN1cnJlbnRD b250ZXh0OworICB9LAorCisgIC8qKgorICAgKiBBc3NlcnQgdGhhdCB0aGUgY29udGV4dCB0eXBl cyBhcmUgdmFsaWQKKyAgICoKKyAgICogQHBhcmFtIHtvYmplY3R9IHR5cGVTcGVjcyBNYXAgb2Yg Y29udGV4dCBmaWVsZCB0byBhIFJlYWN0UHJvcFR5cGUKKyAgICogQHBhcmFtIHtvYmplY3R9IHZh bHVlcyBSdW50aW1lIHZhbHVlcyB0aGF0IG5lZWQgdG8gYmUgdHlwZS1jaGVja2VkCisgICAqIEBw YXJhbSB7c3RyaW5nfSBsb2NhdGlvbiBlLmcuICJwcm9wIiwgImNvbnRleHQiLCAiY2hpbGQgY29u dGV4dCIKKyAgICogQHByaXZhdGUKKyAgICovCisgIF9jaGVja0NvbnRleHRUeXBlczogZnVuY3Rp b24gKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbikgeworICAgIGlmICgiZGV2ZWxvcG1lbnQi ICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIGNoZWNrUmVhY3RUeXBlU3BlYyh0eXBlU3BlY3Ms IHZhbHVlcywgbG9jYXRpb24sIHRoaXMuZ2V0TmFtZSgpLCBudWxsLCB0aGlzLl9kZWJ1Z0lEKTsK KyAgICB9CisgIH0sCisKKyAgcmVjZWl2ZUNvbXBvbmVudDogZnVuY3Rpb24gKG5leHRFbGVtZW50 LCB0cmFuc2FjdGlvbiwgbmV4dENvbnRleHQpIHsKKyAgICB2YXIgcHJldkVsZW1lbnQgPSB0aGlz Ll9jdXJyZW50RWxlbWVudDsKKyAgICB2YXIgcHJldkNvbnRleHQgPSB0aGlzLl9jb250ZXh0Owor CisgICAgdGhpcy5fcGVuZGluZ0VsZW1lbnQgPSBudWxsOworCisgICAgdGhpcy51cGRhdGVDb21w b25lbnQodHJhbnNhY3Rpb24sIHByZXZFbGVtZW50LCBuZXh0RWxlbWVudCwgcHJldkNvbnRleHQs IG5leHRDb250ZXh0KTsKKyAgfSwKKworICAvKioKKyAgICogSWYgYW55IG9mIGBfcGVuZGluZ0Vs ZW1lbnRgLCBgX3BlbmRpbmdTdGF0ZVF1ZXVlYCwgb3IgYF9wZW5kaW5nRm9yY2VVcGRhdGVgCisg ICAqIGlzIHNldCwgdXBkYXRlIHRoZSBjb21wb25lbnQuCisgICAqCisgICAqIEBwYXJhbSB7UmVh Y3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24KKyAgICogQGludGVybmFsCisgICAq LworICBwZXJmb3JtVXBkYXRlSWZOZWNlc3Nhcnk6IGZ1bmN0aW9uICh0cmFuc2FjdGlvbikgewor ICAgIGlmICh0aGlzLl9wZW5kaW5nRWxlbWVudCAhPSBudWxsKSB7CisgICAgICBSZWFjdFJlY29u Y2lsZXIucmVjZWl2ZUNvbXBvbmVudCh0aGlzLCB0aGlzLl9wZW5kaW5nRWxlbWVudCwgdHJhbnNh Y3Rpb24sIHRoaXMuX2NvbnRleHQpOworICAgIH0gZWxzZSBpZiAodGhpcy5fcGVuZGluZ1N0YXRl UXVldWUgIT09IG51bGwgfHwgdGhpcy5fcGVuZGluZ0ZvcmNlVXBkYXRlKSB7CisgICAgICB0aGlz LnVwZGF0ZUNvbXBvbmVudCh0cmFuc2FjdGlvbiwgdGhpcy5fY3VycmVudEVsZW1lbnQsIHRoaXMu X2N1cnJlbnRFbGVtZW50LCB0aGlzLl9jb250ZXh0LCB0aGlzLl9jb250ZXh0KTsKKyAgICB9IGVs c2UgeworICAgICAgdGhpcy5fdXBkYXRlQmF0Y2hOdW1iZXIgPSBudWxsOworICAgIH0KKyAgfSwK KworICAvKioKKyAgICogUGVyZm9ybSBhbiB1cGRhdGUgdG8gYSBtb3VudGVkIGNvbXBvbmVudC4g VGhlIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgYW5kCisgICAqIHNob3VsZENvbXBvbmVudFVw ZGF0ZSBtZXRob2RzIGFyZSBjYWxsZWQsIHRoZW4gKGFzc3VtaW5nIHRoZSB1cGRhdGUgaXNuJ3QK KyAgICogc2tpcHBlZCkgdGhlIHJlbWFpbmluZyB1cGRhdGUgbGlmZWN5Y2xlIG1ldGhvZHMgYXJl IGNhbGxlZCBhbmQgdGhlIERPTQorICAgKiByZXByZXNlbnRhdGlvbiBpcyB1cGRhdGVkLgorICAg KgorICAgKiBCeSBkZWZhdWx0LCB0aGlzIGltcGxlbWVudHMgUmVhY3QncyByZW5kZXJpbmcgYW5k IHJlY29uY2lsaWF0aW9uIGFsZ29yaXRobS4KKyAgICogU29waGlzdGljYXRlZCBjbGllbnRzIG1h eSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMuCisgICAqCisgICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNp bGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24KKyAgICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IHBy ZXZQYXJlbnRFbGVtZW50CisgICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBuZXh0UGFyZW50RWxl bWVudAorICAgKiBAaW50ZXJuYWwKKyAgICogQG92ZXJyaWRhYmxlCisgICAqLworICB1cGRhdGVD b21wb25lbnQ6IGZ1bmN0aW9uICh0cmFuc2FjdGlvbiwgcHJldlBhcmVudEVsZW1lbnQsIG5leHRQ YXJlbnRFbGVtZW50LCBwcmV2VW5tYXNrZWRDb250ZXh0LCBuZXh0VW5tYXNrZWRDb250ZXh0KSB7 CisgICAgdmFyIGluc3QgPSB0aGlzLl9pbnN0YW5jZTsKKyAgICAhKGluc3QgIT0gbnVsbCkgPyAi ZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdBdHRlbXB0 ZWQgdG8gdXBkYXRlIGNvbXBvbmVudCBgJXNgIHRoYXQgaGFzIGFscmVhZHkgYmVlbiB1bm1vdW50 ZWQgKG9yIGZhaWxlZCB0byBtb3VudCkuJywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9z aXRlQ29tcG9uZW50JykgOiBfcHJvZEludmFyaWFudCgnMTM2JywgdGhpcy5nZXROYW1lKCkgfHwg J1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiB2b2lkIDA7CisKKyAgICB2YXIgd2lsbFJlY2Vp dmUgPSBmYWxzZTsKKyAgICB2YXIgbmV4dENvbnRleHQ7CisKKyAgICAvLyBEZXRlcm1pbmUgaWYg dGhlIGNvbnRleHQgaGFzIGNoYW5nZWQgb3Igbm90CisgICAgaWYgKHRoaXMuX2NvbnRleHQgPT09 IG5leHRVbm1hc2tlZENvbnRleHQpIHsKKyAgICAgIG5leHRDb250ZXh0ID0gaW5zdC5jb250ZXh0 OworICAgIH0gZWxzZSB7CisgICAgICBuZXh0Q29udGV4dCA9IHRoaXMuX3Byb2Nlc3NDb250ZXh0 KG5leHRVbm1hc2tlZENvbnRleHQpOworICAgICAgd2lsbFJlY2VpdmUgPSB0cnVlOworICAgIH0K KworICAgIHZhciBwcmV2UHJvcHMgPSBwcmV2UGFyZW50RWxlbWVudC5wcm9wczsKKyAgICB2YXIg bmV4dFByb3BzID0gbmV4dFBhcmVudEVsZW1lbnQucHJvcHM7CisKKyAgICAvLyBOb3QgYSBzaW1w bGUgc3RhdGUgdXBkYXRlIGJ1dCBhIHByb3BzIHVwZGF0ZQorICAgIGlmIChwcmV2UGFyZW50RWxl bWVudCAhPT0gbmV4dFBhcmVudEVsZW1lbnQpIHsKKyAgICAgIHdpbGxSZWNlaXZlID0gdHJ1ZTsK KyAgICB9CisKKyAgICAvLyBBbiB1cGRhdGUgaGVyZSB3aWxsIHNjaGVkdWxlIGFuIHVwZGF0ZSBi dXQgaW1tZWRpYXRlbHkgc2V0CisgICAgLy8gX3BlbmRpbmdTdGF0ZVF1ZXVlIHdoaWNoIHdpbGwg ZW5zdXJlIHRoYXQgYW55IHN0YXRlIHVwZGF0ZXMgZ2V0cworICAgIC8vIGltbWVkaWF0ZWx5IHJl Y29uY2lsZWQgaW5zdGVhZCBvZiB3YWl0aW5nIGZvciB0aGUgbmV4dCBiYXRjaC4KKyAgICBpZiAo d2lsbFJlY2VpdmUgJiYgaW5zdC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKSB7CisgICAgICBp ZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAgIG1lYXN1cmVMaWZl Q3ljbGVQZXJmKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICByZXR1cm4gaW5zdC5jb21wb25lbnRX aWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcywgbmV4dENvbnRleHQpOworICAgICAgICB9LCB0aGlz Ll9kZWJ1Z0lELCAnY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcycpOworICAgICAgfSBlbHNlIHsK KyAgICAgICAgaW5zdC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcywgbmV4dENv bnRleHQpOworICAgICAgfQorICAgIH0KKworICAgIHZhciBuZXh0U3RhdGUgPSB0aGlzLl9wcm9j ZXNzUGVuZGluZ1N0YXRlKG5leHRQcm9wcywgbmV4dENvbnRleHQpOworICAgIHZhciBzaG91bGRV cGRhdGUgPSB0cnVlOworCisgICAgaWYgKCF0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGUpIHsKKyAg ICAgIGlmIChpbnN0LnNob3VsZENvbXBvbmVudFVwZGF0ZSkgeworICAgICAgICBpZiAoImRldmVs b3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAgICAgc2hvdWxkVXBkYXRlID0gbWVh c3VyZUxpZmVDeWNsZVBlcmYoZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgcmV0dXJuIGluc3Qu c2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlLCBuZXh0Q29udGV4dCk7 CisgICAgICAgICAgfSwgdGhpcy5fZGVidWdJRCwgJ3Nob3VsZENvbXBvbmVudFVwZGF0ZScpOwor ICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNob3VsZFVwZGF0ZSA9IGluc3Quc2hvdWxkQ29t cG9uZW50VXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlLCBuZXh0Q29udGV4dCk7CisgICAgICAg IH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh0aGlzLl9jb21wb3NpdGVUeXBlID09PSBD b21wb3NpdGVUeXBlcy5QdXJlQ2xhc3MpIHsKKyAgICAgICAgICBzaG91bGRVcGRhdGUgPSAhc2hh bGxvd0VxdWFsKHByZXZQcm9wcywgbmV4dFByb3BzKSB8fCAhc2hhbGxvd0VxdWFsKGluc3Quc3Rh dGUsIG5leHRTdGF0ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoImRl dmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAiZGV2ZWxvcG1lbnQiICE9PSAn cHJvZHVjdGlvbicgPyB3YXJuaW5nKHNob3VsZFVwZGF0ZSAhPT0gdW5kZWZpbmVkLCAnJXMuc2hv dWxkQ29tcG9uZW50VXBkYXRlKCk6IFJldHVybmVkIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIGEgJyAr ICdib29sZWFuIHZhbHVlLiBNYWtlIHN1cmUgdG8gcmV0dXJuIHRydWUgb3IgZmFsc2UuJywgdGhp cy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiB2b2lkIDA7CisgICAg fQorCisgICAgdGhpcy5fdXBkYXRlQmF0Y2hOdW1iZXIgPSBudWxsOworICAgIGlmIChzaG91bGRV cGRhdGUpIHsKKyAgICAgIHRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZSA9IGZhbHNlOworICAgICAg Ly8gV2lsbCBzZXQgYHRoaXMucHJvcHNgLCBgdGhpcy5zdGF0ZWAgYW5kIGB0aGlzLmNvbnRleHRg LgorICAgICAgdGhpcy5fcGVyZm9ybUNvbXBvbmVudFVwZGF0ZShuZXh0UGFyZW50RWxlbWVudCwg bmV4dFByb3BzLCBuZXh0U3RhdGUsIG5leHRDb250ZXh0LCB0cmFuc2FjdGlvbiwgbmV4dFVubWFz a2VkQ29udGV4dCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIElmIGl0J3MgZGV0ZXJtaW5lZCB0 aGF0IGEgY29tcG9uZW50IHNob3VsZCBub3QgdXBkYXRlLCB3ZSBzdGlsbCB3YW50CisgICAgICAv LyB0byBzZXQgcHJvcHMgYW5kIHN0YXRlIGJ1dCB3ZSBzaG9ydGN1dCB0aGUgcmVzdCBvZiB0aGUg dXBkYXRlLgorICAgICAgdGhpcy5fY3VycmVudEVsZW1lbnQgPSBuZXh0UGFyZW50RWxlbWVudDsK KyAgICAgIHRoaXMuX2NvbnRleHQgPSBuZXh0VW5tYXNrZWRDb250ZXh0OworICAgICAgaW5zdC5w cm9wcyA9IG5leHRQcm9wczsKKyAgICAgIGluc3Quc3RhdGUgPSBuZXh0U3RhdGU7CisgICAgICBp bnN0LmNvbnRleHQgPSBuZXh0Q29udGV4dDsKKyAgICB9CisgIH0sCisKKyAgX3Byb2Nlc3NQZW5k aW5nU3RhdGU6IGZ1bmN0aW9uIChwcm9wcywgY29udGV4dCkgeworICAgIHZhciBpbnN0ID0gdGhp cy5faW5zdGFuY2U7CisgICAgdmFyIHF1ZXVlID0gdGhpcy5fcGVuZGluZ1N0YXRlUXVldWU7Cisg ICAgdmFyIHJlcGxhY2UgPSB0aGlzLl9wZW5kaW5nUmVwbGFjZVN0YXRlOworICAgIHRoaXMuX3Bl bmRpbmdSZXBsYWNlU3RhdGUgPSBmYWxzZTsKKyAgICB0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSA9 IG51bGw7CisKKyAgICBpZiAoIXF1ZXVlKSB7CisgICAgICByZXR1cm4gaW5zdC5zdGF0ZTsKKyAg ICB9CisKKyAgICBpZiAocmVwbGFjZSAmJiBxdWV1ZS5sZW5ndGggPT09IDEpIHsKKyAgICAgIHJl dHVybiBxdWV1ZVswXTsKKyAgICB9CisKKyAgICB2YXIgbmV4dFN0YXRlID0gX2Fzc2lnbih7fSwg cmVwbGFjZSA/IHF1ZXVlWzBdIDogaW5zdC5zdGF0ZSk7CisgICAgZm9yICh2YXIgaSA9IHJlcGxh Y2UgPyAxIDogMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7CisgICAgICB2YXIgcGFydGlhbCA9 IHF1ZXVlW2ldOworICAgICAgX2Fzc2lnbihuZXh0U3RhdGUsIHR5cGVvZiBwYXJ0aWFsID09PSAn ZnVuY3Rpb24nID8gcGFydGlhbC5jYWxsKGluc3QsIG5leHRTdGF0ZSwgcHJvcHMsIGNvbnRleHQp IDogcGFydGlhbCk7CisgICAgfQorCisgICAgcmV0dXJuIG5leHRTdGF0ZTsKKyAgfSwKKworICAv KioKKyAgICogTWVyZ2VzIG5ldyBwcm9wcyBhbmQgc3RhdGUsIG5vdGlmaWVzIGRlbGVnYXRlIG1l dGhvZHMgb2YgdXBkYXRlIGFuZAorICAgKiBwZXJmb3JtcyB1cGRhdGUuCisgICAqCisgICAqIEBw YXJhbSB7UmVhY3RFbGVtZW50fSBuZXh0RWxlbWVudCBOZXh0IGVsZW1lbnQKKyAgICogQHBhcmFt IHtvYmplY3R9IG5leHRQcm9wcyBOZXh0IHB1YmxpYyBvYmplY3QgdG8gc2V0IGFzIHByb3BlcnRp ZXMuCisgICAqIEBwYXJhbSB7P29iamVjdH0gbmV4dFN0YXRlIE5leHQgb2JqZWN0IHRvIHNldCBh cyBzdGF0ZS4KKyAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0Q29udGV4dCBOZXh0IHB1YmxpYyBv YmplY3QgdG8gc2V0IGFzIGNvbnRleHQuCisgICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFu c2FjdGlvbn0gdHJhbnNhY3Rpb24KKyAgICogQHBhcmFtIHs/b2JqZWN0fSB1bm1hc2tlZENvbnRl eHQKKyAgICogQHByaXZhdGUKKyAgICovCisgIF9wZXJmb3JtQ29tcG9uZW50VXBkYXRlOiBmdW5j dGlvbiAobmV4dEVsZW1lbnQsIG5leHRQcm9wcywgbmV4dFN0YXRlLCBuZXh0Q29udGV4dCwgdHJh bnNhY3Rpb24sIHVubWFza2VkQ29udGV4dCkgeworICAgIHZhciBfdGhpczIgPSB0aGlzOworCisg ICAgdmFyIGluc3QgPSB0aGlzLl9pbnN0YW5jZTsKKworICAgIHZhciBoYXNDb21wb25lbnREaWRV cGRhdGUgPSBCb29sZWFuKGluc3QuY29tcG9uZW50RGlkVXBkYXRlKTsKKyAgICB2YXIgcHJldlBy b3BzOworICAgIHZhciBwcmV2U3RhdGU7CisgICAgdmFyIHByZXZDb250ZXh0OworICAgIGlmICho YXNDb21wb25lbnREaWRVcGRhdGUpIHsKKyAgICAgIHByZXZQcm9wcyA9IGluc3QucHJvcHM7Cisg ICAgICBwcmV2U3RhdGUgPSBpbnN0LnN0YXRlOworICAgICAgcHJldkNvbnRleHQgPSBpbnN0LmNv bnRleHQ7CisgICAgfQorCisgICAgaWYgKGluc3QuY29tcG9uZW50V2lsbFVwZGF0ZSkgeworICAg ICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgICBtZWFzdXJl TGlmZUN5Y2xlUGVyZihmdW5jdGlvbiAoKSB7CisgICAgICAgICAgcmV0dXJuIGluc3QuY29tcG9u ZW50V2lsbFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSwgbmV4dENvbnRleHQpOworICAgICAg ICB9LCB0aGlzLl9kZWJ1Z0lELCAnY29tcG9uZW50V2lsbFVwZGF0ZScpOworICAgICAgfSBlbHNl IHsKKyAgICAgICAgaW5zdC5jb21wb25lbnRXaWxsVXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRl LCBuZXh0Q29udGV4dCk7CisgICAgICB9CisgICAgfQorCisgICAgdGhpcy5fY3VycmVudEVsZW1l bnQgPSBuZXh0RWxlbWVudDsKKyAgICB0aGlzLl9jb250ZXh0ID0gdW5tYXNrZWRDb250ZXh0Owor ICAgIGluc3QucHJvcHMgPSBuZXh0UHJvcHM7CisgICAgaW5zdC5zdGF0ZSA9IG5leHRTdGF0ZTsK KyAgICBpbnN0LmNvbnRleHQgPSBuZXh0Q29udGV4dDsKKworICAgIHRoaXMuX3VwZGF0ZVJlbmRl cmVkQ29tcG9uZW50KHRyYW5zYWN0aW9uLCB1bm1hc2tlZENvbnRleHQpOworCisgICAgaWYgKGhh c0NvbXBvbmVudERpZFVwZGF0ZSkgeworICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9k dWN0aW9uJykgeworICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1 ZXVlKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICBtZWFzdXJlTGlmZUN5Y2xlUGVyZihpbnN0LmNv bXBvbmVudERpZFVwZGF0ZS5iaW5kKGluc3QsIHByZXZQcm9wcywgcHJldlN0YXRlLCBwcmV2Q29u dGV4dCksIF90aGlzMi5fZGVidWdJRCwgJ2NvbXBvbmVudERpZFVwZGF0ZScpOworICAgICAgICB9 KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFk eSgpLmVucXVldWUoaW5zdC5jb21wb25lbnREaWRVcGRhdGUuYmluZChpbnN0LCBwcmV2UHJvcHMs IHByZXZTdGF0ZSwgcHJldkNvbnRleHQpLCBpbnN0KTsKKyAgICAgIH0KKyAgICB9CisgIH0sCisK KyAgLyoqCisgICAqIENhbGwgdGhlIGNvbXBvbmVudCdzIGByZW5kZXJgIG1ldGhvZCBhbmQgdXBk YXRlIHRoZSBET00gYWNjb3JkaW5nbHkuCisgICAqCisgICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNp bGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24KKyAgICogQGludGVybmFsCisgICAqLworICBfdXBk YXRlUmVuZGVyZWRDb21wb25lbnQ6IGZ1bmN0aW9uICh0cmFuc2FjdGlvbiwgY29udGV4dCkgewor ICAgIHZhciBwcmV2Q29tcG9uZW50SW5zdGFuY2UgPSB0aGlzLl9yZW5kZXJlZENvbXBvbmVudDsK KyAgICB2YXIgcHJldlJlbmRlcmVkRWxlbWVudCA9IHByZXZDb21wb25lbnRJbnN0YW5jZS5fY3Vy cmVudEVsZW1lbnQ7CisgICAgdmFyIG5leHRSZW5kZXJlZEVsZW1lbnQgPSB0aGlzLl9yZW5kZXJW YWxpZGF0ZWRDb21wb25lbnQoKTsKKworICAgIHZhciBkZWJ1Z0lEID0gMDsKKyAgICBpZiAoImRl dmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICBkZWJ1Z0lEID0gdGhpcy5fZGVi dWdJRDsKKyAgICB9CisKKyAgICBpZiAoc2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQocHJldlJl bmRlcmVkRWxlbWVudCwgbmV4dFJlbmRlcmVkRWxlbWVudCkpIHsKKyAgICAgIFJlYWN0UmVjb25j aWxlci5yZWNlaXZlQ29tcG9uZW50KHByZXZDb21wb25lbnRJbnN0YW5jZSwgbmV4dFJlbmRlcmVk RWxlbWVudCwgdHJhbnNhY3Rpb24sIHRoaXMuX3Byb2Nlc3NDaGlsZENvbnRleHQoY29udGV4dCkp OworICAgIH0gZWxzZSB7CisgICAgICB2YXIgb2xkSG9zdE5vZGUgPSBSZWFjdFJlY29uY2lsZXIu Z2V0SG9zdE5vZGUocHJldkNvbXBvbmVudEluc3RhbmNlKTsKKyAgICAgIFJlYWN0UmVjb25jaWxl ci51bm1vdW50Q29tcG9uZW50KHByZXZDb21wb25lbnRJbnN0YW5jZSwgZmFsc2UpOworCisgICAg ICB2YXIgbm9kZVR5cGUgPSBSZWFjdE5vZGVUeXBlcy5nZXRUeXBlKG5leHRSZW5kZXJlZEVsZW1l bnQpOworICAgICAgdGhpcy5fcmVuZGVyZWROb2RlVHlwZSA9IG5vZGVUeXBlOworICAgICAgdmFy IGNoaWxkID0gdGhpcy5faW5zdGFudGlhdGVSZWFjdENvbXBvbmVudChuZXh0UmVuZGVyZWRFbGVt ZW50LCBub2RlVHlwZSAhPT0gUmVhY3ROb2RlVHlwZXMuRU1QVFkgLyogc2hvdWxkSGF2ZURlYnVn SUQgKi8KKyAgICAgICk7CisgICAgICB0aGlzLl9yZW5kZXJlZENvbXBvbmVudCA9IGNoaWxkOwor CisgICAgICB2YXIgbmV4dE1hcmt1cCA9IFJlYWN0UmVjb25jaWxlci5tb3VudENvbXBvbmVudChj aGlsZCwgdHJhbnNhY3Rpb24sIHRoaXMuX2hvc3RQYXJlbnQsIHRoaXMuX2hvc3RDb250YWluZXJJ bmZvLCB0aGlzLl9wcm9jZXNzQ2hpbGRDb250ZXh0KGNvbnRleHQpLCBkZWJ1Z0lEKTsKKworICAg ICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgICBpZiAoZGVi dWdJRCAhPT0gMCkgeworICAgICAgICAgIHZhciBjaGlsZERlYnVnSURzID0gY2hpbGQuX2RlYnVn SUQgIT09IDAgPyBbY2hpbGQuX2RlYnVnSURdIDogW107CisgICAgICAgICAgUmVhY3RJbnN0cnVt ZW50YXRpb24uZGVidWdUb29sLm9uU2V0Q2hpbGRyZW4oZGVidWdJRCwgY2hpbGREZWJ1Z0lEcyk7 CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGhpcy5fcmVwbGFjZU5vZGVXaXRoTWFya3Vw KG9sZEhvc3ROb2RlLCBuZXh0TWFya3VwLCBwcmV2Q29tcG9uZW50SW5zdGFuY2UpOworICAgIH0K KyAgfSwKKworICAvKioKKyAgICogT3ZlcnJpZGRlbiBpbiBzaGFsbG93IHJlbmRlcmluZy4KKyAg ICoKKyAgICogQHByb3RlY3RlZAorICAgKi8KKyAgX3JlcGxhY2VOb2RlV2l0aE1hcmt1cDogZnVu Y3Rpb24gKG9sZEhvc3ROb2RlLCBuZXh0TWFya3VwLCBwcmV2SW5zdGFuY2UpIHsKKyAgICBSZWFj dENvbXBvbmVudEVudmlyb25tZW50LnJlcGxhY2VOb2RlV2l0aE1hcmt1cChvbGRIb3N0Tm9kZSwg bmV4dE1hcmt1cCwgcHJldkluc3RhbmNlKTsKKyAgfSwKKworICAvKioKKyAgICogQHByb3RlY3Rl ZAorICAgKi8KKyAgX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudFdpdGhvdXRPd25lck9yQ29udGV4 dDogZnVuY3Rpb24gKCkgeworICAgIHZhciBpbnN0ID0gdGhpcy5faW5zdGFuY2U7CisgICAgdmFy IHJlbmRlcmVkRWxlbWVudDsKKworICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlv bicpIHsKKyAgICAgIHJlbmRlcmVkRWxlbWVudCA9IG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0 aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIGluc3QucmVuZGVyKCk7CisgICAgICB9LCB0aGlzLl9k ZWJ1Z0lELCAncmVuZGVyJyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlbmRlcmVkRWxlbWVudCA9 IGluc3QucmVuZGVyKCk7CisgICAgfQorCisgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9k dWN0aW9uJykgeworICAgICAgLy8gV2UgYWxsb3cgYXV0by1tb2NrcyB0byBwcm9jZWVkIGFzIGlm IHRoZXkncmUgcmV0dXJuaW5nIG51bGwuCisgICAgICBpZiAocmVuZGVyZWRFbGVtZW50ID09PSB1 bmRlZmluZWQgJiYgaW5zdC5yZW5kZXIuX2lzTW9ja0Z1bmN0aW9uKSB7CisgICAgICAgIC8vIFRo aXMgaXMgcHJvYmFibHkgYmFkIHByYWN0aWNlLiBDb25zaWRlciB3YXJuaW5nIGhlcmUgYW5kCisg ICAgICAgIC8vIGRlcHJlY2F0aW5nIHRoaXMgY29udmVuaWVuY2UuCisgICAgICAgIHJlbmRlcmVk RWxlbWVudCA9IG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlbmRlcmVkRWxl bWVudDsKKyAgfSwKKworICAvKioKKyAgICogQHByaXZhdGUKKyAgICovCisgIF9yZW5kZXJWYWxp ZGF0ZWRDb21wb25lbnQ6IGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgcmVuZGVyZWRFbGVtZW50Owor ICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgfHwgdGhpcy5fY29tcG9zaXRl VHlwZSAhPT0gQ29tcG9zaXRlVHlwZXMuU3RhdGVsZXNzRnVuY3Rpb25hbCkgeworICAgICAgUmVh Y3RDdXJyZW50T3duZXIuY3VycmVudCA9IHRoaXM7CisgICAgICB0cnkgeworICAgICAgICByZW5k ZXJlZEVsZW1lbnQgPSB0aGlzLl9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnRXaXRob3V0T3duZXJP ckNvbnRleHQoKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIFJlYWN0Q3VycmVudE93bmVy LmN1cnJlbnQgPSBudWxsOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZW5kZXJlZEVs ZW1lbnQgPSB0aGlzLl9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnRXaXRob3V0T3duZXJPckNvbnRl eHQoKTsKKyAgICB9CisgICAgISgKKyAgICAvLyBUT0RPOiBBbiBgaXNWYWxpZE5vZGVgIGZ1bmN0 aW9uIHdvdWxkIHByb2JhYmx5IGJlIG1vcmUgYXBwcm9wcmlhdGUKKyAgICByZW5kZXJlZEVsZW1l bnQgPT09IG51bGwgfHwgcmVuZGVyZWRFbGVtZW50ID09PSBmYWxzZSB8fCBSZWFjdC5pc1ZhbGlk RWxlbWVudChyZW5kZXJlZEVsZW1lbnQpKSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9u JyA/IGludmFyaWFudChmYWxzZSwgJyVzLnJlbmRlcigpOiBBIHZhbGlkIFJlYWN0IGVsZW1lbnQg KG9yIG51bGwpIG11c3QgYmUgcmV0dXJuZWQuIFlvdSBtYXkgaGF2ZSByZXR1cm5lZCB1bmRlZmlu ZWQsIGFuIGFycmF5IG9yIHNvbWUgb3RoZXIgaW52YWxpZCBvYmplY3QuJywgdGhpcy5nZXROYW1l KCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiBfcHJvZEludmFyaWFudCgnMTA5Jywg dGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiB2b2lkIDA7CisK KyAgICByZXR1cm4gcmVuZGVyZWRFbGVtZW50OworICB9LAorCisgIC8qKgorICAgKiBMYXppbHkg YWxsb2NhdGVzIHRoZSByZWZzIG9iamVjdCBhbmQgc3RvcmVzIGBjb21wb25lbnRgIGFzIGByZWZg LgorICAgKgorICAgKiBAcGFyYW0ge3N0cmluZ30gcmVmIFJlZmVyZW5jZSBuYW1lLgorICAgKiBA cGFyYW0ge2NvbXBvbmVudH0gY29tcG9uZW50IENvbXBvbmVudCB0byBzdG9yZSBhcyBgcmVmYC4K KyAgICogQGZpbmFsCisgICAqIEBwcml2YXRlCisgICAqLworICBhdHRhY2hSZWY6IGZ1bmN0aW9u IChyZWYsIGNvbXBvbmVudCkgeworICAgIHZhciBpbnN0ID0gdGhpcy5nZXRQdWJsaWNJbnN0YW5j ZSgpOworICAgICEoaW5zdCAhPSBudWxsKSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9u JyA/IGludmFyaWFudChmYWxzZSwgJ1N0YXRlbGVzcyBmdW5jdGlvbiBjb21wb25lbnRzIGNhbm5v dCBoYXZlIHJlZnMuJykgOiBfcHJvZEludmFyaWFudCgnMTEwJykgOiB2b2lkIDA7CisgICAgdmFy IHB1YmxpY0NvbXBvbmVudEluc3RhbmNlID0gY29tcG9uZW50LmdldFB1YmxpY0luc3RhbmNlKCk7 CisgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgdmFyIGNv bXBvbmVudE5hbWUgPSBjb21wb25lbnQgJiYgY29tcG9uZW50LmdldE5hbWUgPyBjb21wb25lbnQu Z2V0TmFtZSgpIDogJ2EgY29tcG9uZW50JzsKKyAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9k dWN0aW9uJyA/IHdhcm5pbmcocHVibGljQ29tcG9uZW50SW5zdGFuY2UgIT0gbnVsbCB8fCBjb21w b25lbnQuX2NvbXBvc2l0ZVR5cGUgIT09IENvbXBvc2l0ZVR5cGVzLlN0YXRlbGVzc0Z1bmN0aW9u YWwsICdTdGF0ZWxlc3MgZnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgYmUgZ2l2ZW4gcmVmcyAn ICsgJyhTZWUgcmVmICIlcyIgaW4gJXMgY3JlYXRlZCBieSAlcykuICcgKyAnQXR0ZW1wdHMgdG8g YWNjZXNzIHRoaXMgcmVmIHdpbGwgZmFpbC4nLCByZWYsIGNvbXBvbmVudE5hbWUsIHRoaXMuZ2V0 TmFtZSgpKSA6IHZvaWQgMDsKKyAgICB9CisgICAgdmFyIHJlZnMgPSBpbnN0LnJlZnMgPT09IGVt cHR5T2JqZWN0ID8gaW5zdC5yZWZzID0ge30gOiBpbnN0LnJlZnM7CisgICAgcmVmc1tyZWZdID0g cHVibGljQ29tcG9uZW50SW5zdGFuY2U7CisgIH0sCisKKyAgLyoqCisgICAqIERldGFjaGVzIGEg cmVmZXJlbmNlIG5hbWUuCisgICAqCisgICAqIEBwYXJhbSB7c3RyaW5nfSByZWYgTmFtZSB0byBk ZXJlZmVyZW5jZS4KKyAgICogQGZpbmFsCisgICAqIEBwcml2YXRlCisgICAqLworICBkZXRhY2hS ZWY6IGZ1bmN0aW9uIChyZWYpIHsKKyAgICB2YXIgcmVmcyA9IHRoaXMuZ2V0UHVibGljSW5zdGFu Y2UoKS5yZWZzOworICAgIGRlbGV0ZSByZWZzW3JlZl07CisgIH0sCisKKyAgLyoqCisgICAqIEdl dCBhIHRleHQgZGVzY3JpcHRpb24gb2YgdGhlIGNvbXBvbmVudCB0aGF0IGNhbiBiZSB1c2VkIHRv IGlkZW50aWZ5IGl0CisgICAqIGluIGVycm9yIG1lc3NhZ2VzLgorICAgKiBAcmV0dXJuIHtzdHJp bmd9IFRoZSBuYW1lIG9yIG51bGwuCisgICAqIEBpbnRlcm5hbAorICAgKi8KKyAgZ2V0TmFtZTog ZnVuY3Rpb24gKCkgeworICAgIHZhciB0eXBlID0gdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTsK KyAgICB2YXIgY29uc3RydWN0b3IgPSB0aGlzLl9pbnN0YW5jZSAmJiB0aGlzLl9pbnN0YW5jZS5j b25zdHJ1Y3RvcjsKKyAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCBjb25zdHJ1Y3RvciAm JiBjb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgY29uc3RydWN0b3IgJiYg Y29uc3RydWN0b3IubmFtZSB8fCBudWxsOworICB9LAorCisgIC8qKgorICAgKiBHZXQgdGhlIHB1 YmxpY2x5IGFjY2Vzc2libGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb21wb25lbnQgLSBpLmUu IHdoYXQKKyAgICogaXMgZXhwb3NlZCBieSByZWZzIGFuZCByZXR1cm5lZCBieSByZW5kZXIuIENh biBiZSBudWxsIGZvciBzdGF0ZWxlc3MKKyAgICogY29tcG9uZW50cy4KKyAgICoKKyAgICogQHJl dHVybiB7UmVhY3RDb21wb25lbnR9IHRoZSBwdWJsaWMgY29tcG9uZW50IGluc3RhbmNlLgorICAg KiBAaW50ZXJuYWwKKyAgICovCisgIGdldFB1YmxpY0luc3RhbmNlOiBmdW5jdGlvbiAoKSB7Cisg ICAgdmFyIGluc3QgPSB0aGlzLl9pbnN0YW5jZTsKKyAgICBpZiAodGhpcy5fY29tcG9zaXRlVHlw ZSA9PT0gQ29tcG9zaXRlVHlwZXMuU3RhdGVsZXNzRnVuY3Rpb25hbCkgeworICAgICAgcmV0dXJu IG51bGw7CisgICAgfQorICAgIHJldHVybiBpbnN0OworICB9LAorCisgIC8vIFN0dWIKKyAgX2lu c3RhbnRpYXRlUmVhY3RDb21wb25lbnQ6IG51bGwKKworfTsKKworbW9kdWxlLmV4cG9ydHMgPSBS ZWFjdENvbXBvc2l0ZUNvbXBvbmVudDsKK30seyIxMDQiOjEwNCwiMTI1IjoxMjUsIjEyOSI6MTI5 LCIxMzMiOjEzMywiMTM0IjoxMzQsIjE0MyI6MTQzLCIxNTAiOjE1MCwiMTU2IjoxNTYsIjE1NyI6 MTU3LCIxNTgiOjE1OCwiMjkiOjI5LCI1NSI6NTUsIjYzIjo2MywiNjQiOjY0LCI2OSI6NjksIjc1 Ijo3NX1dLDMxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29w eXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2 ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0 eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGly ZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBh dGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUg ZGlyZWN0b3J5LgorICoKKyAqLworCisvKiBnbG9iYWxzIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFM X0hPT0tfXyovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9 IF9kZXJlcV8oMzQpOwordmFyIFJlYWN0RGVmYXVsdEluamVjdGlvbiA9IF9kZXJlcV8oNTIpOwor dmFyIFJlYWN0TW91bnQgPSBfZGVyZXFfKDY3KTsKK3ZhciBSZWFjdFJlY29uY2lsZXIgPSBfZGVy ZXFfKDc1KTsKK3ZhciBSZWFjdFVwZGF0ZXMgPSBfZGVyZXFfKDgyKTsKK3ZhciBSZWFjdFZlcnNp b24gPSBfZGVyZXFfKDgzKTsKKwordmFyIGZpbmRET01Ob2RlID0gX2RlcmVxXygxMDgpOwordmFy IGdldEhvc3RDb21wb25lbnRGcm9tQ29tcG9zaXRlID0gX2RlcmVxXygxMTUpOwordmFyIHJlbmRl clN1YnRyZWVJbnRvQ29udGFpbmVyID0gX2RlcmVxXygxMjYpOwordmFyIHdhcm5pbmcgPSBfZGVy ZXFfKDE1Nyk7CisKK1JlYWN0RGVmYXVsdEluamVjdGlvbi5pbmplY3QoKTsKKwordmFyIFJlYWN0 RE9NID0geworICBmaW5kRE9NTm9kZTogZmluZERPTU5vZGUsCisgIHJlbmRlcjogUmVhY3RNb3Vu dC5yZW5kZXIsCisgIHVubW91bnRDb21wb25lbnRBdE5vZGU6IFJlYWN0TW91bnQudW5tb3VudENv bXBvbmVudEF0Tm9kZSwKKyAgdmVyc2lvbjogUmVhY3RWZXJzaW9uLAorCisgIC8qIGVzbGludC1k aXNhYmxlIGNhbWVsY2FzZSAqLworICB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlczogUmVhY3RVcGRh dGVzLmJhdGNoZWRVcGRhdGVzLAorICB1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5l cjogcmVuZGVyU3VidHJlZUludG9Db250YWluZXIKK307CisKKy8vIEluamVjdCB0aGUgcnVudGlt ZSBpbnRvIGEgZGV2dG9vbHMgZ2xvYmFsIGhvb2sgcmVnYXJkbGVzcyBvZiBicm93c2VyLgorLy8g QWxsb3dzIGZvciBkZWJ1Z2dpbmcgd2hlbiB0aGUgaG9vayBpcyBpbmplY3RlZCBvbiB0aGUgcGFn ZS4KK2lmICh0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZp bmVkJyAmJiB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmluamVjdCA9PT0g J2Z1bmN0aW9uJykgeworICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uaW5qZWN0KHsK KyAgICBDb21wb25lbnRUcmVlOiB7CisgICAgICBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZTog UmVhY3RET01Db21wb25lbnRUcmVlLmdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlLAorICAgICAg Z2V0Tm9kZUZyb21JbnN0YW5jZTogZnVuY3Rpb24gKGluc3QpIHsKKyAgICAgICAgLy8gaW5zdCBp cyBhbiBpbnRlcm5hbCBpbnN0YW5jZSAoYnV0IGNvdWxkIGJlIGEgY29tcG9zaXRlKQorICAgICAg ICBpZiAoaW5zdC5fcmVuZGVyZWRDb21wb25lbnQpIHsKKyAgICAgICAgICBpbnN0ID0gZ2V0SG9z dENvbXBvbmVudEZyb21Db21wb3NpdGUoaW5zdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlu c3QpIHsKKyAgICAgICAgICByZXR1cm4gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9t SW5zdGFuY2UoaW5zdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7 CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgIE1vdW50OiBSZWFjdE1vdW50LAorICAg IFJlY29uY2lsZXI6IFJlYWN0UmVjb25jaWxlcgorICB9KTsKK30KKworaWYgKCJkZXZlbG9wbWVu dCIgIT09ICdwcm9kdWN0aW9uJykgeworICB2YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSBfZGVy ZXFfKDEzNik7CisgIGlmIChFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gJiYgd2luZG93 LnRvcCA9PT0gd2luZG93LnNlbGYpIHsKKworICAgIC8vIEZpcnN0IGNoZWNrIGlmIGRldnRvb2xz IGlzIG5vdCBpbnN0YWxsZWQKKyAgICBpZiAodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFM X0hPT0tfXyA9PT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgIC8vIElmIHdlJ3JlIGluIENocm9tZSBv ciBGaXJlZm94LCBwcm92aWRlIGEgZG93bmxvYWQgbGluayBpZiBub3QgaW5zdGFsbGVkLgorICAg ICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignQ2hyb21lJykgPiAtMSAmJiBuYXZp Z2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0VkZ2UnKSA9PT0gLTEgfHwgbmF2aWdhdG9yLnVzZXJB Z2VudC5pbmRleE9mKCdGaXJlZm94JykgPiAtMSkgeworICAgICAgICAvLyBGaXJlZm94IGRvZXMg bm90IGhhdmUgdGhlIGlzc3VlIHdpdGggZGV2dG9vbHMgbG9hZGVkIG92ZXIgZmlsZTovLworICAg ICAgICB2YXIgc2hvd0ZpbGVVcmxNZXNzYWdlID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sLmlu ZGV4T2YoJ2h0dHAnKSA9PT0gLTEgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdGaXJl Zm94JykgPT09IC0xOworICAgICAgICBjb25zb2xlLmRlYnVnKCdEb3dubG9hZCB0aGUgUmVhY3Qg RGV2VG9vbHMgJyArIChzaG93RmlsZVVybE1lc3NhZ2UgPyAnYW5kIHVzZSBhbiBIVFRQIHNlcnZl ciAoaW5zdGVhZCBvZiBhIGZpbGU6IFVSTCkgJyA6ICcnKSArICdmb3IgYSBiZXR0ZXIgZGV2ZWxv cG1lbnQgZXhwZXJpZW5jZTogJyArICdodHRwczovL2ZiLm1lL3JlYWN0LWRldnRvb2xzJyk7Cisg ICAgICB9CisgICAgfQorCisgICAgdmFyIHRlc3RGdW5jID0gZnVuY3Rpb24gdGVzdEZuKCkge307 CisgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZygodGVzdEZ1bmMu bmFtZSB8fCB0ZXN0RnVuYy50b1N0cmluZygpKS5pbmRleE9mKCd0ZXN0Rm4nKSAhPT0gLTEsICdJ dCBsb29rcyBsaWtlIHlvdVwncmUgdXNpbmcgYSBtaW5pZmllZCBjb3B5IG9mIHRoZSBkZXZlbG9w bWVudCBidWlsZCAnICsgJ29mIFJlYWN0LiBXaGVuIGRlcGxveWluZyBSZWFjdCBhcHBzIHRvIHBy b2R1Y3Rpb24sIG1ha2Ugc3VyZSB0byB1c2UgJyArICd0aGUgcHJvZHVjdGlvbiBidWlsZCB3aGlj aCBza2lwcyBkZXZlbG9wbWVudCB3YXJuaW5ncyBhbmQgaXMgZmFzdGVyLiAnICsgJ1NlZSBodHRw czovL2ZiLm1lL3JlYWN0LW1pbmlmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLicpIDogdm9pZCAw OworCisgICAgLy8gSWYgd2UncmUgaW4gSUU4LCBjaGVjayB0byBzZWUgaWYgd2UgYXJlIGluIGNv bXBhdGliaWxpdHkgbW9kZSBhbmQgcHJvdmlkZQorICAgIC8vIGluZm9ybWF0aW9uIG9uIHByZXZl bnRpbmcgY29tcGF0aWJpbGl0eSBtb2RlCisgICAgdmFyIGllQ29tcGF0aWJpbGl0eU1vZGUgPSBk b2N1bWVudC5kb2N1bWVudE1vZGUgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlIDwgODsKKworICAg ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIWllQ29tcGF0aWJpbGl0 eU1vZGUsICdJbnRlcm5ldCBFeHBsb3JlciBpcyBydW5uaW5nIGluIGNvbXBhdGliaWxpdHkgbW9k ZTsgcGxlYXNlIGFkZCB0aGUgJyArICdmb2xsb3dpbmcgdGFnIHRvIHlvdXIgSFRNTCB0byBwcmV2 ZW50IHRoaXMgZnJvbSBoYXBwZW5pbmc6ICcgKyAnPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21w YXRpYmxlIiBjb250ZW50PSJJRT1lZGdlIiAvPicpIDogdm9pZCAwOworCisgICAgdmFyIGV4cGVj dGVkRmVhdHVyZXMgPSBbCisgICAgLy8gc2hpbXMKKyAgICBBcnJheS5pc0FycmF5LCBBcnJheS5w cm90b3R5cGUuZXZlcnksIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLCBBcnJheS5wcm90b3R5cGUu aW5kZXhPZiwgQXJyYXkucHJvdG90eXBlLm1hcCwgRGF0ZS5ub3csIEZ1bmN0aW9uLnByb3RvdHlw ZS5iaW5kLCBPYmplY3Qua2V5cywgU3RyaW5nLnByb3RvdHlwZS50cmltXTsKKworICAgIGZvciAo dmFyIGkgPSAwOyBpIDwgZXhwZWN0ZWRGZWF0dXJlcy5sZW5ndGg7IGkrKykgeworICAgICAgaWYg KCFleHBlY3RlZEZlYXR1cmVzW2ldKSB7CisgICAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9k dWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdPbmUgb3IgbW9yZSBFUzUgc2hpbXMgZXhwZWN0ZWQg YnkgUmVhY3QgYXJlIG5vdCBhdmFpbGFibGU6ICcgKyAnaHR0cHM6Ly9mYi5tZS9yZWFjdC13YXJu aW5nLXBvbHlmaWxscycpIDogdm9pZCAwOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9 CisgIH0KK30KKworaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICB2YXIg UmVhY3RJbnN0cnVtZW50YXRpb24gPSBfZGVyZXFfKDY0KTsKKyAgdmFyIFJlYWN0RE9NVW5rbm93 blByb3BlcnR5SG9vayA9IF9kZXJlcV8oNDkpOworICB2YXIgUmVhY3RET01OdWxsSW5wdXRWYWx1 ZVByb3BIb29rID0gX2RlcmVxXyg0MSk7CisgIHZhciBSZWFjdERPTUludmFsaWRBUklBSG9vayA9 IF9kZXJlcV8oNDApOworCisgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5hZGRIb29r KFJlYWN0RE9NVW5rbm93blByb3BlcnR5SG9vayk7CisgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRl YnVnVG9vbC5hZGRIb29rKFJlYWN0RE9NTnVsbElucHV0VmFsdWVQcm9wSG9vayk7CisgIFJlYWN0 SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5hZGRIb29rKFJlYWN0RE9NSW52YWxpZEFSSUFIb29r KTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTTsKK30seyIxMDgiOjEwOCwiMTE1Ijox MTUsIjEyNiI6MTI2LCIxMzYiOjEzNiwiMTU3IjoxNTcsIjM0IjozNCwiNDAiOjQwLCI0MSI6NDEs IjQ5Ijo0OSwiNTIiOjUyLCI2NCI6NjQsIjY3Ijo2NywiNzUiOjc1LCI4MiI6ODIsIjgzIjo4M31d LDMyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0 IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg KgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxp Y2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5 IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCBy aWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0 b3J5LgorICoKKyAqLworCisvKiBnbG9iYWwgaGFzT3duUHJvcGVydHk6dHJ1ZSAqLworCisndXNl IHN0cmljdCc7CisKK3ZhciBfcHJvZEludmFyaWFudCA9IF9kZXJlcV8oMTI1KSwKKyAgICBfYXNz aWduID0gX2RlcmVxXygxNTgpOworCit2YXIgQXV0b0ZvY3VzVXRpbHMgPSBfZGVyZXFfKDIpOwor dmFyIENTU1Byb3BlcnR5T3BlcmF0aW9ucyA9IF9kZXJlcV8oNSk7Cit2YXIgRE9NTGF6eVRyZWUg PSBfZGVyZXFfKDkpOwordmFyIERPTU5hbWVzcGFjZXMgPSBfZGVyZXFfKDEwKTsKK3ZhciBET01Q cm9wZXJ0eSA9IF9kZXJlcV8oMTEpOwordmFyIERPTVByb3BlcnR5T3BlcmF0aW9ucyA9IF9kZXJl cV8oMTIpOwordmFyIEV2ZW50UGx1Z2luSHViID0gX2RlcmVxXygxNyk7Cit2YXIgRXZlbnRQbHVn aW5SZWdpc3RyeSA9IF9kZXJlcV8oMTgpOwordmFyIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlciA9 IF9kZXJlcV8oMjYpOwordmFyIFJlYWN0RE9NQ29tcG9uZW50RmxhZ3MgPSBfZGVyZXFfKDMzKTsK K3ZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSBfZGVyZXFfKDM0KTsKK3ZhciBSZWFjdERPTUlu cHV0ID0gX2RlcmVxXygzOSk7Cit2YXIgUmVhY3RET01PcHRpb24gPSBfZGVyZXFfKDQyKTsKK3Zh ciBSZWFjdERPTVNlbGVjdCA9IF9kZXJlcV8oNDMpOwordmFyIFJlYWN0RE9NVGV4dGFyZWEgPSBf ZGVyZXFfKDQ2KTsKK3ZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IF9kZXJlcV8oNjQpOwordmFy IFJlYWN0TXVsdGlDaGlsZCA9IF9kZXJlcV8oNjgpOwordmFyIFJlYWN0U2VydmVyUmVuZGVyaW5n VHJhbnNhY3Rpb24gPSBfZGVyZXFfKDc3KTsKKwordmFyIGVtcHR5RnVuY3Rpb24gPSBfZGVyZXFf KDE0Mik7Cit2YXIgZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyID0gX2RlcmVxXygxMDcpOwor dmFyIGludmFyaWFudCA9IF9kZXJlcV8oMTUwKTsKK3ZhciBpc0V2ZW50U3VwcG9ydGVkID0gX2Rl cmVxXygxMjIpOwordmFyIHNoYWxsb3dFcXVhbCA9IF9kZXJlcV8oMTU2KTsKK3ZhciB2YWxpZGF0 ZURPTU5lc3RpbmcgPSBfZGVyZXFfKDEzMSk7Cit2YXIgd2FybmluZyA9IF9kZXJlcV8oMTU3KTsK KwordmFyIEZsYWdzID0gUmVhY3RET01Db21wb25lbnRGbGFnczsKK3ZhciBkZWxldGVMaXN0ZW5l ciA9IEV2ZW50UGx1Z2luSHViLmRlbGV0ZUxpc3RlbmVyOwordmFyIGdldE5vZGUgPSBSZWFjdERP TUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZTsKK3ZhciBsaXN0ZW5UbyA9IFJlYWN0 QnJvd3NlckV2ZW50RW1pdHRlci5saXN0ZW5UbzsKK3ZhciByZWdpc3RyYXRpb25OYW1lTW9kdWxl cyA9IEV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXM7CisKKy8vIEZv ciBxdWlja2x5IG1hdGNoaW5nIGNoaWxkcmVuIHR5cGUsIHRvIHRlc3QgaWYgY2FuIGJlIHRyZWF0 ZWQgYXMgY29udGVudC4KK3ZhciBDT05URU5UX1RZUEVTID0geyAnc3RyaW5nJzogdHJ1ZSwgJ251 bWJlcic6IHRydWUgfTsKKwordmFyIFNUWUxFID0gJ3N0eWxlJzsKK3ZhciBIVE1MID0gJ19faHRt bCc7Cit2YXIgUkVTRVJWRURfUFJPUFMgPSB7CisgIGNoaWxkcmVuOiBudWxsLAorICBkYW5nZXJv dXNseVNldElubmVySFRNTDogbnVsbCwKKyAgc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5n OiBudWxsCit9OworCisvLyBOb2RlIHR5cGUgZm9yIGRvY3VtZW50IGZyYWdtZW50cyAoTm9kZS5E T0NVTUVOVF9GUkFHTUVOVF9OT0RFKS4KK3ZhciBET0NfRlJBR01FTlRfVFlQRSA9IDExOworCitm dW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oaW50ZXJuYWxJbnN0YW5jZSkgewor ICBpZiAoaW50ZXJuYWxJbnN0YW5jZSkgeworICAgIHZhciBvd25lciA9IGludGVybmFsSW5zdGFu Y2UuX2N1cnJlbnRFbGVtZW50Ll9vd25lciB8fCBudWxsOworICAgIGlmIChvd25lcikgeworICAg ICAgdmFyIG5hbWUgPSBvd25lci5nZXROYW1lKCk7CisgICAgICBpZiAobmFtZSkgeworICAgICAg ICByZXR1cm4gJyBUaGlzIERPTSBub2RlIHdhcyByZW5kZXJlZCBieSBgJyArIG5hbWUgKyAnYC4n OworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gJyc7Cit9CisKK2Z1bmN0aW9uIGZyaWVu ZGx5U3RyaW5naWZ5KG9iaikgeworICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHsKKyAg ICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7CisgICAgICByZXR1cm4gJ1snICsgb2JqLm1hcChm cmllbmRseVN0cmluZ2lmeSkuam9pbignLCAnKSArICddJzsKKyAgICB9IGVsc2UgeworICAgICAg dmFyIHBhaXJzID0gW107CisgICAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7CisgICAgICAgIGlm IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7CisgICAg ICAgICAgdmFyIGtleUVzY2FwZWQgPSAvXlthLXokX11bXHckX10qJC9pLnRlc3Qoa2V5KSA/IGtl eSA6IEpTT04uc3RyaW5naWZ5KGtleSk7CisgICAgICAgICAgcGFpcnMucHVzaChrZXlFc2NhcGVk ICsgJzogJyArIGZyaWVuZGx5U3RyaW5naWZ5KG9ialtrZXldKSk7CisgICAgICAgIH0KKyAgICAg IH0KKyAgICAgIHJldHVybiAneycgKyBwYWlycy5qb2luKCcsICcpICsgJ30nOworICAgIH0KKyAg fSBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgeworICAgIHJldHVybiBKU09OLnN0 cmluZ2lmeShvYmopOworICB9IGVsc2UgaWYgKHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHsK KyAgICByZXR1cm4gJ1tmdW5jdGlvbiBvYmplY3RdJzsKKyAgfQorICAvLyBEaWZmZXJzIGZyb20g SlNPTi5zdHJpbmdpZnkgaW4gdGhhdCB1bmRlZmluZWQgYmVjYXVzZSB1bmRlZmluZWQgYW5kIHRo YXQKKyAgLy8gaW5mIGFuZCBuYW4gZG9uJ3QgYmVjb21lIG51bGwKKyAgcmV0dXJuIFN0cmluZyhv YmopOworfQorCit2YXIgc3R5bGVNdXRhdGlvbldhcm5pbmcgPSB7fTsKKworZnVuY3Rpb24gY2hl Y2tBbmRXYXJuRm9yTXV0YXRlZFN0eWxlKHN0eWxlMSwgc3R5bGUyLCBjb21wb25lbnQpIHsKKyAg aWYgKHN0eWxlMSA9PSBudWxsIHx8IHN0eWxlMiA9PSBudWxsKSB7CisgICAgcmV0dXJuOworICB9 CisgIGlmIChzaGFsbG93RXF1YWwoc3R5bGUxLCBzdHlsZTIpKSB7CisgICAgcmV0dXJuOworICB9 CisKKyAgdmFyIGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnQuX3RhZzsKKyAgdmFyIG93bmVyID0g Y29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC5fb3duZXI7CisgIHZhciBvd25lck5hbWU7CisgIGlm IChvd25lcikgeworICAgIG93bmVyTmFtZSA9IG93bmVyLmdldE5hbWUoKTsKKyAgfQorCisgIHZh ciBoYXNoID0gb3duZXJOYW1lICsgJ3wnICsgY29tcG9uZW50TmFtZTsKKworICBpZiAoc3R5bGVN dXRhdGlvbldhcm5pbmcuaGFzT3duUHJvcGVydHkoaGFzaCkpIHsKKyAgICByZXR1cm47CisgIH0K KworICBzdHlsZU11dGF0aW9uV2FybmluZ1toYXNoXSA9IHRydWU7CisKKyAgImRldmVsb3BtZW50 IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2Alc2Agd2FzIHBhc3NlZCBhIHN0 eWxlIG9iamVjdCB0aGF0IGhhcyBwcmV2aW91c2x5IGJlZW4gbXV0YXRlZC4gJyArICdNdXRhdGlu ZyBgc3R5bGVgIGlzIGRlcHJlY2F0ZWQuIENvbnNpZGVyIGNsb25pbmcgaXQgYmVmb3JlaGFuZC4g Q2hlY2sgJyArICd0aGUgYHJlbmRlcmAgJXMuIFByZXZpb3VzIHN0eWxlOiAlcy4gTXV0YXRlZCBz dHlsZTogJXMuJywgY29tcG9uZW50TmFtZSwgb3duZXIgPyAnb2YgYCcgKyBvd25lck5hbWUgKyAn YCcgOiAndXNpbmcgPCcgKyBjb21wb25lbnROYW1lICsgJz4nLCBmcmllbmRseVN0cmluZ2lmeShz dHlsZTEpLCBmcmllbmRseVN0cmluZ2lmeShzdHlsZTIpKSA6IHZvaWQgMDsKK30KKworLyoqCisg KiBAcGFyYW0ge29iamVjdH0gY29tcG9uZW50CisgKiBAcGFyYW0gez9vYmplY3R9IHByb3BzCisg Ki8KK2Z1bmN0aW9uIGFzc2VydFZhbGlkUHJvcHMoY29tcG9uZW50LCBwcm9wcykgeworICBpZiAo IXByb3BzKSB7CisgICAgcmV0dXJuOworICB9CisgIC8vIE5vdGUgdGhlIHVzZSBvZiBgPT1gIHdo aWNoIGNoZWNrcyBmb3IgbnVsbCBvciB1bmRlZmluZWQuCisgIGlmICh2b2lkRWxlbWVudFRhZ3Nb Y29tcG9uZW50Ll90YWddKSB7CisgICAgIShwcm9wcy5jaGlsZHJlbiA9PSBudWxsICYmIHByb3Bz LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MID09IG51bGwpID8gImRldmVsb3BtZW50IiAhPT0gJ3By b2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMgaXMgYSB2b2lkIGVsZW1lbnQgdGFnIGFu ZCBtdXN0IG5laXRoZXIgaGF2ZSBgY2hpbGRyZW5gIG5vciB1c2UgYGRhbmdlcm91c2x5U2V0SW5u ZXJIVE1MYC4lcycsIGNvbXBvbmVudC5fdGFnLCBjb21wb25lbnQuX2N1cnJlbnRFbGVtZW50Ll9v d25lciA/ICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgJyArIGNvbXBvbmVudC5fY3VycmVu dEVsZW1lbnQuX293bmVyLmdldE5hbWUoKSArICcuJyA6ICcnKSA6IF9wcm9kSW52YXJpYW50KCcx MzcnLCBjb21wb25lbnQuX3RhZywgY29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC5fb3duZXIgPyAn IENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mICcgKyBjb21wb25lbnQuX2N1cnJlbnRFbGVtZW50 Ll9vd25lci5nZXROYW1lKCkgKyAnLicgOiAnJykgOiB2b2lkIDA7CisgIH0KKyAgaWYgKHByb3Bz LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9IG51bGwpIHsKKyAgICAhKHByb3BzLmNoaWxkcmVu ID09IG51bGwpID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZh bHNlLCAnQ2FuIG9ubHkgc2V0IG9uZSBvZiBgY2hpbGRyZW5gIG9yIGBwcm9wcy5kYW5nZXJvdXNs eVNldElubmVySFRNTGAuJykgOiBfcHJvZEludmFyaWFudCgnNjAnKSA6IHZvaWQgMDsKKyAgICAh KHR5cGVvZiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PT0gJ29iamVjdCcgJiYgSFRN TCBpbiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCkgPyAiZGV2ZWxvcG1lbnQiICE9PSAn cHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5l ckhUTUxgIG11c3QgYmUgaW4gdGhlIGZvcm0gYHtfX2h0bWw6IC4uLn1gLiBQbGVhc2UgdmlzaXQg aHR0cHM6Ly9mYi5tZS9yZWFjdC1pbnZhcmlhbnQtZGFuZ2Vyb3VzbHktc2V0LWlubmVyLWh0bWwg Zm9yIG1vcmUgaW5mb3JtYXRpb24uJykgOiBfcHJvZEludmFyaWFudCgnNjEnKSA6IHZvaWQgMDsK KyAgfQorICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgImRldmVs b3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhwcm9wcy5pbm5lckhUTUwgPT0gbnVs bCwgJ0RpcmVjdGx5IHNldHRpbmcgcHJvcGVydHkgYGlubmVySFRNTGAgaXMgbm90IHBlcm1pdHRl ZC4gJyArICdGb3IgbW9yZSBpbmZvcm1hdGlvbiwgbG9va3VwIGRvY3VtZW50YXRpb24gb24gYGRh bmdlcm91c2x5U2V0SW5uZXJIVE1MYC4nKSA6IHZvaWQgMDsKKyAgICAiZGV2ZWxvcG1lbnQiICE9 PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHByb3BzLnN1cHByZXNzQ29udGVudEVkaXRhYmxlV2Fy bmluZyB8fCAhcHJvcHMuY29udGVudEVkaXRhYmxlIHx8IHByb3BzLmNoaWxkcmVuID09IG51bGws ICdBIGNvbXBvbmVudCBpcyBgY29udGVudEVkaXRhYmxlYCBhbmQgY29udGFpbnMgYGNoaWxkcmVu YCBtYW5hZ2VkIGJ5ICcgKyAnUmVhY3QuIEl0IGlzIG5vdyB5b3VyIHJlc3BvbnNpYmlsaXR5IHRv IGd1YXJhbnRlZSB0aGF0IG5vbmUgb2YgJyArICd0aG9zZSBub2RlcyBhcmUgdW5leHBlY3RlZGx5 IG1vZGlmaWVkIG9yIGR1cGxpY2F0ZWQuIFRoaXMgaXMgJyArICdwcm9iYWJseSBub3QgaW50ZW50 aW9uYWwuJykgOiB2b2lkIDA7CisgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8g d2FybmluZyhwcm9wcy5vbkZvY3VzSW4gPT0gbnVsbCAmJiBwcm9wcy5vbkZvY3VzT3V0ID09IG51 bGwsICdSZWFjdCB1c2VzIG9uRm9jdXMgYW5kIG9uQmx1ciBpbnN0ZWFkIG9mIG9uRm9jdXNJbiBh bmQgb25Gb2N1c091dC4gJyArICdBbGwgUmVhY3QgZXZlbnRzIGFyZSBub3JtYWxpemVkIHRvIGJ1 YmJsZSwgc28gb25Gb2N1c0luIGFuZCBvbkZvY3VzT3V0ICcgKyAnYXJlIG5vdCBuZWVkZWQvc3Vw cG9ydGVkIGJ5IFJlYWN0LicpIDogdm9pZCAwOworICB9CisgICEocHJvcHMuc3R5bGUgPT0gbnVs bCB8fCB0eXBlb2YgcHJvcHMuc3R5bGUgPT09ICdvYmplY3QnKSA/ICJkZXZlbG9wbWVudCIgIT09 ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1RoZSBgc3R5bGVgIHByb3AgZXhwZWN0 cyBhIG1hcHBpbmcgZnJvbSBzdHlsZSBwcm9wZXJ0aWVzIHRvIHZhbHVlcywgbm90IGEgc3RyaW5n LiBGb3IgZXhhbXBsZSwgc3R5bGU9e3ttYXJnaW5SaWdodDogc3BhY2luZyArIFwnZW1cJ319IHdo ZW4gdXNpbmcgSlNYLiVzJywgZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKGNvbXBvbmVudCkp IDogX3Byb2RJbnZhcmlhbnQoJzYyJywgZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKGNvbXBv bmVudCkpIDogdm9pZCAwOworfQorCitmdW5jdGlvbiBlbnF1ZXVlUHV0TGlzdGVuZXIoaW5zdCwg cmVnaXN0cmF0aW9uTmFtZSwgbGlzdGVuZXIsIHRyYW5zYWN0aW9uKSB7CisgIGlmICh0cmFuc2Fj dGlvbiBpbnN0YW5jZW9mIFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb24pIHsKKyAgICBy ZXR1cm47CisgIH0KKyAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAg IC8vIElFOCBoYXMgbm8gQVBJIGZvciBldmVudCBjYXB0dXJpbmcgYW5kIHRoZSBgb25TY3JvbGxg IGV2ZW50IGRvZXNuJ3QKKyAgICAvLyBidWJibGUuCisgICAgImRldmVsb3BtZW50IiAhPT0gJ3By b2R1Y3Rpb24nID8gd2FybmluZyhyZWdpc3RyYXRpb25OYW1lICE9PSAnb25TY3JvbGwnIHx8IGlz RXZlbnRTdXBwb3J0ZWQoJ3Njcm9sbCcsIHRydWUpLCAnVGhpcyBicm93c2VyIGRvZXNuXCd0IHN1 cHBvcnQgdGhlIGBvblNjcm9sbGAgZXZlbnQnKSA6IHZvaWQgMDsKKyAgfQorICB2YXIgY29udGFp bmVySW5mbyA9IGluc3QuX2hvc3RDb250YWluZXJJbmZvOworICB2YXIgaXNEb2N1bWVudEZyYWdt ZW50ID0gY29udGFpbmVySW5mby5fbm9kZSAmJiBjb250YWluZXJJbmZvLl9ub2RlLm5vZGVUeXBl ID09PSBET0NfRlJBR01FTlRfVFlQRTsKKyAgdmFyIGRvYyA9IGlzRG9jdW1lbnRGcmFnbWVudCA/ IGNvbnRhaW5lckluZm8uX25vZGUgOiBjb250YWluZXJJbmZvLl9vd25lckRvY3VtZW50OworICBs aXN0ZW5UbyhyZWdpc3RyYXRpb25OYW1lLCBkb2MpOworICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1v dW50UmVhZHkoKS5lbnF1ZXVlKHB1dExpc3RlbmVyLCB7CisgICAgaW5zdDogaW5zdCwKKyAgICBy ZWdpc3RyYXRpb25OYW1lOiByZWdpc3RyYXRpb25OYW1lLAorICAgIGxpc3RlbmVyOiBsaXN0ZW5l cgorICB9KTsKK30KKworZnVuY3Rpb24gcHV0TGlzdGVuZXIoKSB7CisgIHZhciBsaXN0ZW5lclRv UHV0ID0gdGhpczsKKyAgRXZlbnRQbHVnaW5IdWIucHV0TGlzdGVuZXIobGlzdGVuZXJUb1B1dC5p bnN0LCBsaXN0ZW5lclRvUHV0LnJlZ2lzdHJhdGlvbk5hbWUsIGxpc3RlbmVyVG9QdXQubGlzdGVu ZXIpOworfQorCitmdW5jdGlvbiBpbnB1dFBvc3RNb3VudCgpIHsKKyAgdmFyIGluc3QgPSB0aGlz OworICBSZWFjdERPTUlucHV0LnBvc3RNb3VudFdyYXBwZXIoaW5zdCk7Cit9CisKK2Z1bmN0aW9u IHRleHRhcmVhUG9zdE1vdW50KCkgeworICB2YXIgaW5zdCA9IHRoaXM7CisgIFJlYWN0RE9NVGV4 dGFyZWEucG9zdE1vdW50V3JhcHBlcihpbnN0KTsKK30KKworZnVuY3Rpb24gb3B0aW9uUG9zdE1v dW50KCkgeworICB2YXIgaW5zdCA9IHRoaXM7CisgIFJlYWN0RE9NT3B0aW9uLnBvc3RNb3VudFdy YXBwZXIoaW5zdCk7Cit9CisKK3ZhciBzZXRBbmRWYWxpZGF0ZUNvbnRlbnRDaGlsZERldiA9IGVt cHR5RnVuY3Rpb247CitpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgIHNl dEFuZFZhbGlkYXRlQ29udGVudENoaWxkRGV2ID0gZnVuY3Rpb24gKGNvbnRlbnQpIHsKKyAgICB2 YXIgaGFzRXhpc3RpbmdDb250ZW50ID0gdGhpcy5fY29udGVudERlYnVnSUQgIT0gbnVsbDsKKyAg ICB2YXIgZGVidWdJRCA9IHRoaXMuX2RlYnVnSUQ7CisgICAgLy8gVGhpcyBJRCByZXByZXNlbnRz IHRoZSBpbmxpbmVkIGNoaWxkIHRoYXQgaGFzIG5vIGJhY2tpbmcgaW5zdGFuY2U6CisgICAgdmFy IGNvbnRlbnREZWJ1Z0lEID0gLWRlYnVnSUQ7CisKKyAgICBpZiAoY29udGVudCA9PSBudWxsKSB7 CisgICAgICBpZiAoaGFzRXhpc3RpbmdDb250ZW50KSB7CisgICAgICAgIFJlYWN0SW5zdHJ1bWVu dGF0aW9uLmRlYnVnVG9vbC5vblVubW91bnRDb21wb25lbnQodGhpcy5fY29udGVudERlYnVnSUQp OworICAgICAgfQorICAgICAgdGhpcy5fY29udGVudERlYnVnSUQgPSBudWxsOworICAgICAgcmV0 dXJuOworICAgIH0KKworICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCBTdHJpbmcoY29udGVu dCksIHRoaXMsIHRoaXMuX2FuY2VzdG9ySW5mbyk7CisgICAgdGhpcy5fY29udGVudERlYnVnSUQg PSBjb250ZW50RGVidWdJRDsKKyAgICBpZiAoaGFzRXhpc3RpbmdDb250ZW50KSB7CisgICAgICBS ZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWZvcmVVcGRhdGVDb21wb25lbnQoY29u dGVudERlYnVnSUQsIGNvbnRlbnQpOworICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdU b29sLm9uVXBkYXRlQ29tcG9uZW50KGNvbnRlbnREZWJ1Z0lEKTsKKyAgICB9IGVsc2UgeworICAg ICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uQmVmb3JlTW91bnRDb21wb25lbnQo Y29udGVudERlYnVnSUQsIGNvbnRlbnQsIGRlYnVnSUQpOworICAgICAgUmVhY3RJbnN0cnVtZW50 YXRpb24uZGVidWdUb29sLm9uTW91bnRDb21wb25lbnQoY29udGVudERlYnVnSUQpOworICAgICAg UmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uU2V0Q2hpbGRyZW4oZGVidWdJRCwgW2Nv bnRlbnREZWJ1Z0lEXSk7CisgICAgfQorICB9OworfQorCisvLyBUaGVyZSBhcmUgc28gbWFueSBt ZWRpYSBldmVudHMsIGl0IG1ha2VzIHNlbnNlIHRvIGp1c3QKKy8vIG1haW50YWluIGEgbGlzdCBy YXRoZXIgdGhhbiBjcmVhdGUgYSBgdHJhcEJ1YmJsZWRFdmVudGAgZm9yIGVhY2gKK3ZhciBtZWRp YUV2ZW50cyA9IHsKKyAgdG9wQWJvcnQ6ICdhYm9ydCcsCisgIHRvcENhblBsYXk6ICdjYW5wbGF5 JywKKyAgdG9wQ2FuUGxheVRocm91Z2g6ICdjYW5wbGF5dGhyb3VnaCcsCisgIHRvcER1cmF0aW9u Q2hhbmdlOiAnZHVyYXRpb25jaGFuZ2UnLAorICB0b3BFbXB0aWVkOiAnZW1wdGllZCcsCisgIHRv cEVuY3J5cHRlZDogJ2VuY3J5cHRlZCcsCisgIHRvcEVuZGVkOiAnZW5kZWQnLAorICB0b3BFcnJv cjogJ2Vycm9yJywKKyAgdG9wTG9hZGVkRGF0YTogJ2xvYWRlZGRhdGEnLAorICB0b3BMb2FkZWRN ZXRhZGF0YTogJ2xvYWRlZG1ldGFkYXRhJywKKyAgdG9wTG9hZFN0YXJ0OiAnbG9hZHN0YXJ0JywK KyAgdG9wUGF1c2U6ICdwYXVzZScsCisgIHRvcFBsYXk6ICdwbGF5JywKKyAgdG9wUGxheWluZzog J3BsYXlpbmcnLAorICB0b3BQcm9ncmVzczogJ3Byb2dyZXNzJywKKyAgdG9wUmF0ZUNoYW5nZTog J3JhdGVjaGFuZ2UnLAorICB0b3BTZWVrZWQ6ICdzZWVrZWQnLAorICB0b3BTZWVraW5nOiAnc2Vl a2luZycsCisgIHRvcFN0YWxsZWQ6ICdzdGFsbGVkJywKKyAgdG9wU3VzcGVuZDogJ3N1c3BlbmQn LAorICB0b3BUaW1lVXBkYXRlOiAndGltZXVwZGF0ZScsCisgIHRvcFZvbHVtZUNoYW5nZTogJ3Zv bHVtZWNoYW5nZScsCisgIHRvcFdhaXRpbmc6ICd3YWl0aW5nJworfTsKKworZnVuY3Rpb24gdHJh cEJ1YmJsZWRFdmVudHNMb2NhbCgpIHsKKyAgdmFyIGluc3QgPSB0aGlzOworICAvLyBJZiBhIGNv bXBvbmVudCByZW5kZXJzIHRvIG51bGwgb3IgaWYgYW5vdGhlciBjb21wb25lbnQgZmF0YWxzIGFu ZCBjYXVzZXMKKyAgLy8gdGhlIHN0YXRlIG9mIHRoZSB0cmVlIHRvIGJlIGNvcnJ1cHRlZCwgYG5v ZGVgIGhlcmUgY2FuIGJlIG51bGwuCisgICFpbnN0Ll9yb290Tm9kZUlEID8gImRldmVsb3BtZW50 IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnTXVzdCBiZSBtb3VudGVkIHRv IHRyYXAgZXZlbnRzJykgOiBfcHJvZEludmFyaWFudCgnNjMnKSA6IHZvaWQgMDsKKyAgdmFyIG5v ZGUgPSBnZXROb2RlKGluc3QpOworICAhbm9kZSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0 aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3RyYXBCdWJibGVkRXZlbnQoLi4uKTogUmVxdWlyZXMg bm9kZSB0byBiZSByZW5kZXJlZC4nKSA6IF9wcm9kSW52YXJpYW50KCc2NCcpIDogdm9pZCAwOwor CisgIHN3aXRjaCAoaW5zdC5fdGFnKSB7CisgICAgY2FzZSAnaWZyYW1lJzoKKyAgICBjYXNlICdv YmplY3QnOgorICAgICAgaW5zdC5fd3JhcHBlclN0YXRlLmxpc3RlbmVycyA9IFtSZWFjdEJyb3dz ZXJFdmVudEVtaXR0ZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wTG9hZCcsICdsb2FkJywgbm9kZSld OworICAgICAgYnJlYWs7CisgICAgY2FzZSAndmlkZW8nOgorICAgIGNhc2UgJ2F1ZGlvJzoKKwor ICAgICAgaW5zdC5fd3JhcHBlclN0YXRlLmxpc3RlbmVycyA9IFtdOworICAgICAgLy8gQ3JlYXRl IGxpc3RlbmVyIGZvciBlYWNoIG1lZGlhIGV2ZW50CisgICAgICBmb3IgKHZhciBldmVudCBpbiBt ZWRpYUV2ZW50cykgeworICAgICAgICBpZiAobWVkaWFFdmVudHMuaGFzT3duUHJvcGVydHkoZXZl bnQpKSB7CisgICAgICAgICAgaW5zdC5fd3JhcHBlclN0YXRlLmxpc3RlbmVycy5wdXNoKFJlYWN0 QnJvd3NlckV2ZW50RW1pdHRlci50cmFwQnViYmxlZEV2ZW50KGV2ZW50LCBtZWRpYUV2ZW50c1tl dmVudF0sIG5vZGUpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2Fz ZSAnc291cmNlJzoKKyAgICAgIGluc3QuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnMgPSBbUmVhY3RC cm93c2VyRXZlbnRFbWl0dGVyLnRyYXBCdWJibGVkRXZlbnQoJ3RvcEVycm9yJywgJ2Vycm9yJywg bm9kZSldOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnaW1nJzoKKyAgICAgIGluc3QuX3dyYXBw ZXJTdGF0ZS5saXN0ZW5lcnMgPSBbUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLnRyYXBCdWJibGVk RXZlbnQoJ3RvcEVycm9yJywgJ2Vycm9yJywgbm9kZSksIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRl ci50cmFwQnViYmxlZEV2ZW50KCd0b3BMb2FkJywgJ2xvYWQnLCBub2RlKV07CisgICAgICBicmVh azsKKyAgICBjYXNlICdmb3JtJzoKKyAgICAgIGluc3QuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnMg PSBbUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLnRyYXBCdWJibGVkRXZlbnQoJ3RvcFJlc2V0Jywg J3Jlc2V0Jywgbm9kZSksIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci50cmFwQnViYmxlZEV2ZW50 KCd0b3BTdWJtaXQnLCAnc3VibWl0Jywgbm9kZSldOworICAgICAgYnJlYWs7CisgICAgY2FzZSAn aW5wdXQnOgorICAgIGNhc2UgJ3NlbGVjdCc6CisgICAgY2FzZSAndGV4dGFyZWEnOgorICAgICAg aW5zdC5fd3JhcHBlclN0YXRlLmxpc3RlbmVycyA9IFtSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIu dHJhcEJ1YmJsZWRFdmVudCgndG9wSW52YWxpZCcsICdpbnZhbGlkJywgbm9kZSldOworICAgICAg YnJlYWs7CisgIH0KK30KKworZnVuY3Rpb24gcG9zdFVwZGF0ZVNlbGVjdFdyYXBwZXIoKSB7Cisg IFJlYWN0RE9NU2VsZWN0LnBvc3RVcGRhdGVXcmFwcGVyKHRoaXMpOworfQorCisvLyBGb3IgSFRN TCwgY2VydGFpbiB0YWdzIHNob3VsZCBvbWl0IHRoZWlyIGNsb3NlIHRhZy4gV2Uga2VlcCBhIHdo aXRlbGlzdCBmb3IKKy8vIHRob3NlIHNwZWNpYWwtY2FzZSB0YWdzLgorCit2YXIgb21pdHRlZENs b3NlVGFncyA9IHsKKyAgJ2FyZWEnOiB0cnVlLAorICAnYmFzZSc6IHRydWUsCisgICdicic6IHRy dWUsCisgICdjb2wnOiB0cnVlLAorICAnZW1iZWQnOiB0cnVlLAorICAnaHInOiB0cnVlLAorICAn aW1nJzogdHJ1ZSwKKyAgJ2lucHV0JzogdHJ1ZSwKKyAgJ2tleWdlbic6IHRydWUsCisgICdsaW5r JzogdHJ1ZSwKKyAgJ21ldGEnOiB0cnVlLAorICAncGFyYW0nOiB0cnVlLAorICAnc291cmNlJzog dHJ1ZSwKKyAgJ3RyYWNrJzogdHJ1ZSwKKyAgJ3dicic6IHRydWUKK307CisKK3ZhciBuZXdsaW5l RWF0aW5nVGFncyA9IHsKKyAgJ2xpc3RpbmcnOiB0cnVlLAorICAncHJlJzogdHJ1ZSwKKyAgJ3Rl eHRhcmVhJzogdHJ1ZQorfTsKKworLy8gRm9yIEhUTUwsIGNlcnRhaW4gdGFncyBjYW5ub3QgaGF2 ZSBjaGlsZHJlbi4gVGhpcyBoYXMgdGhlIHNhbWUgcHVycG9zZSBhcworLy8gYG9taXR0ZWRDbG9z ZVRhZ3NgIGV4Y2VwdCB0aGF0IGBtZW51aXRlbWAgc2hvdWxkIHN0aWxsIGhhdmUgaXRzIGNsb3Np bmcgdGFnLgorCit2YXIgdm9pZEVsZW1lbnRUYWdzID0gX2Fzc2lnbih7CisgICdtZW51aXRlbSc6 IHRydWUKK30sIG9taXR0ZWRDbG9zZVRhZ3MpOworCisvLyBXZSBhY2NlcHQgYW55IHRhZyB0byBi ZSByZW5kZXJlZCBidXQgc2luY2UgdGhpcyBnZXRzIGluamVjdGVkIGludG8gYXJiaXRyYXJ5Cisv LyBIVE1MLCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IGl0J3MgYSBzYWZlIHRhZy4KKy8vIGh0 dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwvI05ULU5hbWUKKwordmFyIFZBTElEX1RBR19SRUdF WCA9IC9eW2EtekEtWl1bYS16QS1aOl9cLlwtXGRdKiQvOyAvLyBTaW1wbGlmaWVkIHN1YnNldAor dmFyIHZhbGlkYXRlZFRhZ0NhY2hlID0ge307Cit2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNP d25Qcm9wZXJ0eTsKKworZnVuY3Rpb24gdmFsaWRhdGVEYW5nZXJvdXNUYWcodGFnKSB7CisgIGlm ICghaGFzT3duUHJvcGVydHkuY2FsbCh2YWxpZGF0ZWRUYWdDYWNoZSwgdGFnKSkgeworICAgICFW QUxJRF9UQUdfUkVHRVgudGVzdCh0YWcpID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24n ID8gaW52YXJpYW50KGZhbHNlLCAnSW52YWxpZCB0YWc6ICVzJywgdGFnKSA6IF9wcm9kSW52YXJp YW50KCc2NScsIHRhZykgOiB2b2lkIDA7CisgICAgdmFsaWRhdGVkVGFnQ2FjaGVbdGFnXSA9IHRy dWU7CisgIH0KK30KKworZnVuY3Rpb24gaXNDdXN0b21Db21wb25lbnQodGFnTmFtZSwgcHJvcHMp IHsKKyAgcmV0dXJuIHRhZ05hbWUuaW5kZXhPZignLScpID49IDAgfHwgcHJvcHMuaXMgIT0gbnVs bDsKK30KKwordmFyIGdsb2JhbElkQ291bnRlciA9IDE7CisKKy8qKgorICogQ3JlYXRlcyBhIG5l dyBSZWFjdCBjbGFzcyB0aGF0IGlzIGlkZW1wb3RlbnQgYW5kIGNhcGFibGUgb2YgY29udGFpbmlu ZyBvdGhlcgorICogUmVhY3QgY29tcG9uZW50cy4gSXQgYWNjZXB0cyBldmVudCBsaXN0ZW5lcnMg YW5kIERPTSBwcm9wZXJ0aWVzIHRoYXQgYXJlCisgKiB2YWxpZCBhY2NvcmRpbmcgdG8gYERPTVBy b3BlcnR5YC4KKyAqCisgKiAgLSBFdmVudCBsaXN0ZW5lcnM6IGBvbkNsaWNrYCwgYG9uTW91c2VE b3duYCwgZXRjLgorICogIC0gRE9NIHByb3BlcnRpZXM6IGBjbGFzc05hbWVgLCBgbmFtZWAsIGB0 aXRsZWAsIGV0Yy4KKyAqCisgKiBUaGUgYHN0eWxlYCBwcm9wZXJ0eSBmdW5jdGlvbnMgZGlmZmVy ZW50bHkgZnJvbSB0aGUgRE9NIEFQSS4gSXQgYWNjZXB0cyBhbgorICogb2JqZWN0IG1hcHBpbmcg b2Ygc3R5bGUgcHJvcGVydGllcyB0byB2YWx1ZXMuCisgKgorICogQGNvbnN0cnVjdG9yIFJlYWN0 RE9NQ29tcG9uZW50CisgKiBAZXh0ZW5kcyBSZWFjdE11bHRpQ2hpbGQKKyAqLworZnVuY3Rpb24g UmVhY3RET01Db21wb25lbnQoZWxlbWVudCkgeworICB2YXIgdGFnID0gZWxlbWVudC50eXBlOwor ICB2YWxpZGF0ZURhbmdlcm91c1RhZyh0YWcpOworICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IGVs ZW1lbnQ7CisgIHRoaXMuX3RhZyA9IHRhZy50b0xvd2VyQ2FzZSgpOworICB0aGlzLl9uYW1lc3Bh Y2VVUkkgPSBudWxsOworICB0aGlzLl9yZW5kZXJlZENoaWxkcmVuID0gbnVsbDsKKyAgdGhpcy5f cHJldmlvdXNTdHlsZSA9IG51bGw7CisgIHRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5ID0gbnVsbDsK KyAgdGhpcy5faG9zdE5vZGUgPSBudWxsOworICB0aGlzLl9ob3N0UGFyZW50ID0gbnVsbDsKKyAg dGhpcy5fcm9vdE5vZGVJRCA9IDA7CisgIHRoaXMuX2RvbUlEID0gMDsKKyAgdGhpcy5faG9zdENv bnRhaW5lckluZm8gPSBudWxsOworICB0aGlzLl93cmFwcGVyU3RhdGUgPSBudWxsOworICB0aGlz Ll90b3BMZXZlbFdyYXBwZXIgPSBudWxsOworICB0aGlzLl9mbGFncyA9IDA7CisgIGlmICgiZGV2 ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICB0aGlzLl9hbmNlc3RvckluZm8gPSBu dWxsOworICAgIHNldEFuZFZhbGlkYXRlQ29udGVudENoaWxkRGV2LmNhbGwodGhpcywgbnVsbCk7 CisgIH0KK30KKworUmVhY3RET01Db21wb25lbnQuZGlzcGxheU5hbWUgPSAnUmVhY3RET01Db21w b25lbnQnOworCitSZWFjdERPTUNvbXBvbmVudC5NaXhpbiA9IHsKKworICAvKioKKyAgICogR2Vu ZXJhdGVzIHJvb3QgdGFnIG1hcmt1cCB0aGVuIHJlY3Vyc2VzLiBUaGlzIG1ldGhvZCBoYXMgc2lk ZSBlZmZlY3RzIGFuZAorICAgKiBpcyBub3QgaWRlbXBvdGVudC4KKyAgICoKKyAgICogQGludGVy bmFsCisgICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbnxSZWFjdFNlcnZlclJl bmRlcmluZ1RyYW5zYWN0aW9ufSB0cmFuc2FjdGlvbgorICAgKiBAcGFyYW0gez9SZWFjdERPTUNv bXBvbmVudH0gdGhlIHBhcmVudCBjb21wb25lbnQgaW5zdGFuY2UKKyAgICogQHBhcmFtIHs/b2Jq ZWN0fSBpbmZvIGFib3V0IHRoZSBob3N0IGNvbnRhaW5lcgorICAgKiBAcGFyYW0ge29iamVjdH0g Y29udGV4dAorICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjb21wdXRlZCBtYXJrdXAuCisgICAq LworICBtb3VudENvbXBvbmVudDogZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBob3N0UGFyZW50LCBo b3N0Q29udGFpbmVySW5mbywgY29udGV4dCkgeworICAgIHRoaXMuX3Jvb3ROb2RlSUQgPSBnbG9i YWxJZENvdW50ZXIrKzsKKyAgICB0aGlzLl9kb21JRCA9IGhvc3RDb250YWluZXJJbmZvLl9pZENv dW50ZXIrKzsKKyAgICB0aGlzLl9ob3N0UGFyZW50ID0gaG9zdFBhcmVudDsKKyAgICB0aGlzLl9o b3N0Q29udGFpbmVySW5mbyA9IGhvc3RDb250YWluZXJJbmZvOworCisgICAgdmFyIHByb3BzID0g dGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHM7CisKKyAgICBzd2l0Y2ggKHRoaXMuX3RhZykgewor ICAgICAgY2FzZSAnYXVkaW8nOgorICAgICAgY2FzZSAnZm9ybSc6CisgICAgICBjYXNlICdpZnJh bWUnOgorICAgICAgY2FzZSAnaW1nJzoKKyAgICAgIGNhc2UgJ2xpbmsnOgorICAgICAgY2FzZSAn b2JqZWN0JzoKKyAgICAgIGNhc2UgJ3NvdXJjZSc6CisgICAgICBjYXNlICd2aWRlbyc6CisgICAg ICAgIHRoaXMuX3dyYXBwZXJTdGF0ZSA9IHsKKyAgICAgICAgICBsaXN0ZW5lcnM6IG51bGwKKyAg ICAgICAgfTsKKyAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1 ZSh0cmFwQnViYmxlZEV2ZW50c0xvY2FsLCB0aGlzKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBj YXNlICdpbnB1dCc6CisgICAgICAgIFJlYWN0RE9NSW5wdXQubW91bnRXcmFwcGVyKHRoaXMsIHBy b3BzLCBob3N0UGFyZW50KTsKKyAgICAgICAgcHJvcHMgPSBSZWFjdERPTUlucHV0LmdldEhvc3RQ cm9wcyh0aGlzLCBwcm9wcyk7CisgICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFk eSgpLmVucXVldWUodHJhcEJ1YmJsZWRFdmVudHNMb2NhbCwgdGhpcyk7CisgICAgICAgIGJyZWFr OworICAgICAgY2FzZSAnb3B0aW9uJzoKKyAgICAgICAgUmVhY3RET01PcHRpb24ubW91bnRXcmFw cGVyKHRoaXMsIHByb3BzLCBob3N0UGFyZW50KTsKKyAgICAgICAgcHJvcHMgPSBSZWFjdERPTU9w dGlvbi5nZXRIb3N0UHJvcHModGhpcywgcHJvcHMpOworICAgICAgICBicmVhazsKKyAgICAgIGNh c2UgJ3NlbGVjdCc6CisgICAgICAgIFJlYWN0RE9NU2VsZWN0Lm1vdW50V3JhcHBlcih0aGlzLCBw cm9wcywgaG9zdFBhcmVudCk7CisgICAgICAgIHByb3BzID0gUmVhY3RET01TZWxlY3QuZ2V0SG9z dFByb3BzKHRoaXMsIHByb3BzKTsKKyAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJl YWR5KCkuZW5xdWV1ZSh0cmFwQnViYmxlZEV2ZW50c0xvY2FsLCB0aGlzKTsKKyAgICAgICAgYnJl YWs7CisgICAgICBjYXNlICd0ZXh0YXJlYSc6CisgICAgICAgIFJlYWN0RE9NVGV4dGFyZWEubW91 bnRXcmFwcGVyKHRoaXMsIHByb3BzLCBob3N0UGFyZW50KTsKKyAgICAgICAgcHJvcHMgPSBSZWFj dERPTVRleHRhcmVhLmdldEhvc3RQcm9wcyh0aGlzLCBwcm9wcyk7CisgICAgICAgIHRyYW5zYWN0 aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUodHJhcEJ1YmJsZWRFdmVudHNMb2NhbCwg dGhpcyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGFzc2VydFZhbGlkUHJvcHModGhp cywgcHJvcHMpOworCisgICAgLy8gV2UgY3JlYXRlIHRhZ3MgaW4gdGhlIG5hbWVzcGFjZSBvZiB0 aGVpciBwYXJlbnQgY29udGFpbmVyLCBleGNlcHQgSFRNTAorICAgIC8vIHRhZ3MgZ2V0IG5vIG5h bWVzcGFjZS4KKyAgICB2YXIgbmFtZXNwYWNlVVJJOworICAgIHZhciBwYXJlbnRUYWc7CisgICAg aWYgKGhvc3RQYXJlbnQgIT0gbnVsbCkgeworICAgICAgbmFtZXNwYWNlVVJJID0gaG9zdFBhcmVu dC5fbmFtZXNwYWNlVVJJOworICAgICAgcGFyZW50VGFnID0gaG9zdFBhcmVudC5fdGFnOworICAg IH0gZWxzZSBpZiAoaG9zdENvbnRhaW5lckluZm8uX3RhZykgeworICAgICAgbmFtZXNwYWNlVVJJ ID0gaG9zdENvbnRhaW5lckluZm8uX25hbWVzcGFjZVVSSTsKKyAgICAgIHBhcmVudFRhZyA9IGhv c3RDb250YWluZXJJbmZvLl90YWc7CisgICAgfQorICAgIGlmIChuYW1lc3BhY2VVUkkgPT0gbnVs bCB8fCBuYW1lc3BhY2VVUkkgPT09IERPTU5hbWVzcGFjZXMuc3ZnICYmIHBhcmVudFRhZyA9PT0g J2ZvcmVpZ25vYmplY3QnKSB7CisgICAgICBuYW1lc3BhY2VVUkkgPSBET01OYW1lc3BhY2VzLmh0 bWw7CisgICAgfQorICAgIGlmIChuYW1lc3BhY2VVUkkgPT09IERPTU5hbWVzcGFjZXMuaHRtbCkg eworICAgICAgaWYgKHRoaXMuX3RhZyA9PT0gJ3N2ZycpIHsKKyAgICAgICAgbmFtZXNwYWNlVVJJ ID0gRE9NTmFtZXNwYWNlcy5zdmc7CisgICAgICB9IGVsc2UgaWYgKHRoaXMuX3RhZyA9PT0gJ21h dGgnKSB7CisgICAgICAgIG5hbWVzcGFjZVVSSSA9IERPTU5hbWVzcGFjZXMubWF0aG1sOworICAg ICAgfQorICAgIH0KKyAgICB0aGlzLl9uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7CisKKyAg ICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICB2YXIgcGFyZW50 SW5mbzsKKyAgICAgIGlmIChob3N0UGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgcGFyZW50SW5m byA9IGhvc3RQYXJlbnQuX2FuY2VzdG9ySW5mbzsKKyAgICAgIH0gZWxzZSBpZiAoaG9zdENvbnRh aW5lckluZm8uX3RhZykgeworICAgICAgICBwYXJlbnRJbmZvID0gaG9zdENvbnRhaW5lckluZm8u X2FuY2VzdG9ySW5mbzsKKyAgICAgIH0KKyAgICAgIGlmIChwYXJlbnRJbmZvKSB7CisgICAgICAg IC8vIHBhcmVudEluZm8gc2hvdWxkIGFsd2F5cyBiZSBwcmVzZW50IGV4Y2VwdCBmb3IgdGhlIHRv cC1sZXZlbAorICAgICAgICAvLyBjb21wb25lbnQgd2hlbiBzZXJ2ZXIgcmVuZGVyaW5nCisgICAg ICAgIHZhbGlkYXRlRE9NTmVzdGluZyh0aGlzLl90YWcsIG51bGwsIHRoaXMsIHBhcmVudEluZm8p OworICAgICAgfQorICAgICAgdGhpcy5fYW5jZXN0b3JJbmZvID0gdmFsaWRhdGVET01OZXN0aW5n LnVwZGF0ZWRBbmNlc3RvckluZm8ocGFyZW50SW5mbywgdGhpcy5fdGFnLCB0aGlzKTsKKyAgICB9 CisKKyAgICB2YXIgbW91bnRJbWFnZTsKKyAgICBpZiAodHJhbnNhY3Rpb24udXNlQ3JlYXRlRWxl bWVudCkgeworICAgICAgdmFyIG93bmVyRG9jdW1lbnQgPSBob3N0Q29udGFpbmVySW5mby5fb3du ZXJEb2N1bWVudDsKKyAgICAgIHZhciBlbDsKKyAgICAgIGlmIChuYW1lc3BhY2VVUkkgPT09IERP TU5hbWVzcGFjZXMuaHRtbCkgeworICAgICAgICBpZiAodGhpcy5fdGFnID09PSAnc2NyaXB0Jykg eworICAgICAgICAgIC8vIENyZWF0ZSB0aGUgc2NyaXB0IHZpYSAuaW5uZXJIVE1MIHNvIGl0cyAi cGFyc2VyLWluc2VydGVkIiBmbGFnIGlzCisgICAgICAgICAgLy8gc2V0IHRvIHRydWUgYW5kIGl0 IGRvZXMgbm90IGV4ZWN1dGUKKyAgICAgICAgICB2YXIgZGl2ID0gb3duZXJEb2N1bWVudC5jcmVh dGVFbGVtZW50KCdkaXYnKTsKKyAgICAgICAgICB2YXIgdHlwZSA9IHRoaXMuX2N1cnJlbnRFbGVt ZW50LnR5cGU7CisgICAgICAgICAgZGl2LmlubmVySFRNTCA9ICc8JyArIHR5cGUgKyAnPjwvJyAr IHR5cGUgKyAnPic7CisgICAgICAgICAgZWwgPSBkaXYucmVtb3ZlQ2hpbGQoZGl2LmZpcnN0Q2hp bGQpOworICAgICAgICB9IGVsc2UgaWYgKHByb3BzLmlzKSB7CisgICAgICAgICAgZWwgPSBvd25l ckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSwgcHJvcHMu aXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFNlcGFyYXRlIGVsc2UgYnJhbmNo IGluc3RlYWQgb2YgdXNpbmcgYHByb3BzLmlzIHx8IHVuZGVmaW5lZGAgYWJvdmUgYmVjdWFzZSBv ZiBhIEZpcmVmb3ggYnVnLgorICAgICAgICAgIC8vIFNlZSBkaXNjdXNzaW9uIGluIGh0dHBzOi8v Z2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzY4OTYKKyAgICAgICAgICAvLyBhbmQgZGlz Y3Vzc2lvbiBpbiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0x Mjc2MjQwCisgICAgICAgICAgZWwgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5f Y3VycmVudEVsZW1lbnQudHlwZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAg IGVsID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCB0aGlzLl9j dXJyZW50RWxlbWVudC50eXBlKTsKKyAgICAgIH0KKyAgICAgIFJlYWN0RE9NQ29tcG9uZW50VHJl ZS5wcmVjYWNoZU5vZGUodGhpcywgZWwpOworICAgICAgdGhpcy5fZmxhZ3MgfD0gRmxhZ3MuaGFz Q2FjaGVkQ2hpbGROb2RlczsKKyAgICAgIGlmICghdGhpcy5faG9zdFBhcmVudCkgeworICAgICAg ICBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuc2V0QXR0cmlidXRlRm9yUm9vdChlbCk7CisgICAgICB9 CisgICAgICB0aGlzLl91cGRhdGVET01Qcm9wZXJ0aWVzKG51bGwsIHByb3BzLCB0cmFuc2FjdGlv bik7CisgICAgICB2YXIgbGF6eVRyZWUgPSBET01MYXp5VHJlZShlbCk7CisgICAgICB0aGlzLl9j cmVhdGVJbml0aWFsQ2hpbGRyZW4odHJhbnNhY3Rpb24sIHByb3BzLCBjb250ZXh0LCBsYXp5VHJl ZSk7CisgICAgICBtb3VudEltYWdlID0gbGF6eVRyZWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHZh ciB0YWdPcGVuID0gdGhpcy5fY3JlYXRlT3BlblRhZ01hcmt1cEFuZFB1dExpc3RlbmVycyh0cmFu c2FjdGlvbiwgcHJvcHMpOworICAgICAgdmFyIHRhZ0NvbnRlbnQgPSB0aGlzLl9jcmVhdGVDb250 ZW50TWFya3VwKHRyYW5zYWN0aW9uLCBwcm9wcywgY29udGV4dCk7CisgICAgICBpZiAoIXRhZ0Nv bnRlbnQgJiYgb21pdHRlZENsb3NlVGFnc1t0aGlzLl90YWddKSB7CisgICAgICAgIG1vdW50SW1h Z2UgPSB0YWdPcGVuICsgJy8+JzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1vdW50SW1hZ2Ug PSB0YWdPcGVuICsgJz4nICsgdGFnQ29udGVudCArICc8LycgKyB0aGlzLl9jdXJyZW50RWxlbWVu dC50eXBlICsgJz4nOworICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAodGhpcy5fdGFnKSB7 CisgICAgICBjYXNlICdpbnB1dCc6CisgICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRS ZWFkeSgpLmVucXVldWUoaW5wdXRQb3N0TW91bnQsIHRoaXMpOworICAgICAgICBpZiAocHJvcHMu YXV0b0ZvY3VzKSB7CisgICAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCku ZW5xdWV1ZShBdXRvRm9jdXNVdGlscy5mb2N1c0RPTUNvbXBvbmVudCwgdGhpcyk7CisgICAgICAg IH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICd0ZXh0YXJlYSc6CisgICAgICAgIHRyYW5z YWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUodGV4dGFyZWFQb3N0TW91bnQsIHRo aXMpOworICAgICAgICBpZiAocHJvcHMuYXV0b0ZvY3VzKSB7CisgICAgICAgICAgdHJhbnNhY3Rp b24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShBdXRvRm9jdXNVdGlscy5mb2N1c0RPTUNv bXBvbmVudCwgdGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdz ZWxlY3QnOgorICAgICAgICBpZiAocHJvcHMuYXV0b0ZvY3VzKSB7CisgICAgICAgICAgdHJhbnNh Y3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShBdXRvRm9jdXNVdGlscy5mb2N1c0RP TUNvbXBvbmVudCwgdGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNl ICdidXR0b24nOgorICAgICAgICBpZiAocHJvcHMuYXV0b0ZvY3VzKSB7CisgICAgICAgICAgdHJh bnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShBdXRvRm9jdXNVdGlscy5mb2N1 c0RPTUNvbXBvbmVudCwgdGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBj YXNlICdvcHRpb24nOgorICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5l bnF1ZXVlKG9wdGlvblBvc3RNb3VudCwgdGhpcyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKwor ICAgIHJldHVybiBtb3VudEltYWdlOworICB9LAorCisgIC8qKgorICAgKiBDcmVhdGVzIG1hcmt1 cCBmb3IgdGhlIG9wZW4gdGFnIGFuZCBhbGwgYXR0cmlidXRlcy4KKyAgICoKKyAgICogVGhpcyBt ZXRob2QgaGFzIHNpZGUgZWZmZWN0cyBiZWNhdXNlIGV2ZW50cyBnZXQgcmVnaXN0ZXJlZC4KKyAg ICoKKyAgICogSXRlcmF0aW5nIG92ZXIgb2JqZWN0IHByb3BlcnRpZXMgaXMgZmFzdGVyIHRoYW4g aXRlcmF0aW5nIG92ZXIgYXJyYXlzLgorICAgKiBAc2VlIGh0dHA6Ly9qc3BlcmYuY29tL29iai12 cy1hcnItaXRlcmF0aW9uCisgICAqCisgICAqIEBwcml2YXRlCisgICAqIEBwYXJhbSB7UmVhY3RS ZWNvbmNpbGVUcmFuc2FjdGlvbnxSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9ufSB0cmFu c2FjdGlvbgorICAgKiBAcGFyYW0ge29iamVjdH0gcHJvcHMKKyAgICogQHJldHVybiB7c3RyaW5n fSBNYXJrdXAgb2Ygb3BlbmluZyB0YWcuCisgICAqLworICBfY3JlYXRlT3BlblRhZ01hcmt1cEFu ZFB1dExpc3RlbmVyczogZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBwcm9wcykgeworICAgIHZhciBy ZXQgPSAnPCcgKyB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlOworCisgICAgZm9yICh2YXIgcHJv cEtleSBpbiBwcm9wcykgeworICAgICAgaWYgKCFwcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5 KSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHZhciBwcm9wVmFsdWUgPSBw cm9wc1twcm9wS2V5XTsKKyAgICAgIGlmIChwcm9wVmFsdWUgPT0gbnVsbCkgeworICAgICAgICBj b250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChyZWdpc3RyYXRpb25OYW1lTW9kdWxlcy5oYXNP d25Qcm9wZXJ0eShwcm9wS2V5KSkgeworICAgICAgICBpZiAocHJvcFZhbHVlKSB7CisgICAgICAg ICAgZW5xdWV1ZVB1dExpc3RlbmVyKHRoaXMsIHByb3BLZXksIHByb3BWYWx1ZSwgdHJhbnNhY3Rp b24pOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAocHJvcEtleSA9PT0g U1RZTEUpIHsKKyAgICAgICAgICBpZiAocHJvcFZhbHVlKSB7CisgICAgICAgICAgICBpZiAoImRl dmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAgICAgICAgIC8vIFNlZSBgX3Vw ZGF0ZURPTVByb3BlcnRpZXNgLiBzdHlsZSBibG9jaworICAgICAgICAgICAgICB0aGlzLl9wcmV2 aW91c1N0eWxlID0gcHJvcFZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJvcFZh bHVlID0gdGhpcy5fcHJldmlvdXNTdHlsZUNvcHkgPSBfYXNzaWduKHt9LCBwcm9wcy5zdHlsZSk7 CisgICAgICAgICAgfQorICAgICAgICAgIHByb3BWYWx1ZSA9IENTU1Byb3BlcnR5T3BlcmF0aW9u cy5jcmVhdGVNYXJrdXBGb3JTdHlsZXMocHJvcFZhbHVlLCB0aGlzKTsKKyAgICAgICAgfQorICAg ICAgICB2YXIgbWFya3VwID0gbnVsbDsKKyAgICAgICAgaWYgKHRoaXMuX3RhZyAhPSBudWxsICYm IGlzQ3VzdG9tQ29tcG9uZW50KHRoaXMuX3RhZywgcHJvcHMpKSB7CisgICAgICAgICAgaWYgKCFS RVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkgeworICAgICAgICAgICAgbWFy a3VwID0gRE9NUHJvcGVydHlPcGVyYXRpb25zLmNyZWF0ZU1hcmt1cEZvckN1c3RvbUF0dHJpYnV0 ZShwcm9wS2V5LCBwcm9wVmFsdWUpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAg ICAgICAgICBtYXJrdXAgPSBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuY3JlYXRlTWFya3VwRm9yUHJv cGVydHkocHJvcEtleSwgcHJvcFZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWFya3Vw KSB7CisgICAgICAgICAgcmV0ICs9ICcgJyArIG1hcmt1cDsKKyAgICAgICAgfQorICAgICAgfQor ICAgIH0KKworICAgIC8vIEZvciBzdGF0aWMgcGFnZXMsIG5vIG5lZWQgdG8gcHV0IFJlYWN0IElE IGFuZCBjaGVja3N1bS4gU2F2ZXMgbG90cyBvZgorICAgIC8vIGJ5dGVzLgorICAgIGlmICh0cmFu c2FjdGlvbi5yZW5kZXJUb1N0YXRpY01hcmt1cCkgeworICAgICAgcmV0dXJuIHJldDsKKyAgICB9 CisKKyAgICBpZiAoIXRoaXMuX2hvc3RQYXJlbnQpIHsKKyAgICAgIHJldCArPSAnICcgKyBET01Q cm9wZXJ0eU9wZXJhdGlvbnMuY3JlYXRlTWFya3VwRm9yUm9vdCgpOworICAgIH0KKyAgICByZXQg Kz0gJyAnICsgRE9NUHJvcGVydHlPcGVyYXRpb25zLmNyZWF0ZU1hcmt1cEZvcklEKHRoaXMuX2Rv bUlEKTsKKyAgICByZXR1cm4gcmV0OworICB9LAorCisgIC8qKgorICAgKiBDcmVhdGVzIG1hcmt1 cCBmb3IgdGhlIGNvbnRlbnQgYmV0d2VlbiB0aGUgdGFncy4KKyAgICoKKyAgICogQHByaXZhdGUK KyAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufFJlYWN0U2VydmVyUmVuZGVy aW5nVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uCisgICAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wcwor ICAgKiBAcGFyYW0ge29iamVjdH0gY29udGV4dAorICAgKiBAcmV0dXJuIHtzdHJpbmd9IENvbnRl bnQgbWFya3VwLgorICAgKi8KKyAgX2NyZWF0ZUNvbnRlbnRNYXJrdXA6IGZ1bmN0aW9uICh0cmFu c2FjdGlvbiwgcHJvcHMsIGNvbnRleHQpIHsKKyAgICB2YXIgcmV0ID0gJyc7CisKKyAgICAvLyBJ bnRlbnRpb25hbCB1c2Ugb2YgIT0gdG8gYXZvaWQgY2F0Y2hpbmcgemVyby9mYWxzZS4KKyAgICB2 YXIgaW5uZXJIVE1MID0gcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw7CisgICAgaWYgKGlu bmVySFRNTCAhPSBudWxsKSB7CisgICAgICBpZiAoaW5uZXJIVE1MLl9faHRtbCAhPSBudWxsKSB7 CisgICAgICAgIHJldCA9IGlubmVySFRNTC5fX2h0bWw7CisgICAgICB9CisgICAgfSBlbHNlIHsK KyAgICAgIHZhciBjb250ZW50VG9Vc2UgPSBDT05URU5UX1RZUEVTW3R5cGVvZiBwcm9wcy5jaGls ZHJlbl0gPyBwcm9wcy5jaGlsZHJlbiA6IG51bGw7CisgICAgICB2YXIgY2hpbGRyZW5Ub1VzZSA9 IGNvbnRlbnRUb1VzZSAhPSBudWxsID8gbnVsbCA6IHByb3BzLmNoaWxkcmVuOworICAgICAgaWYg KGNvbnRlbnRUb1VzZSAhPSBudWxsKSB7CisgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHRoYXQg dGV4dCBpcyBhbGxvd2VkIGFzIGEgY2hpbGQgb2YgdGhpcyBub2RlCisgICAgICAgIHJldCA9IGVz Y2FwZVRleHRDb250ZW50Rm9yQnJvd3Nlcihjb250ZW50VG9Vc2UpOworICAgICAgICBpZiAoImRl dmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAgICAgc2V0QW5kVmFsaWRhdGVD b250ZW50Q2hpbGREZXYuY2FsbCh0aGlzLCBjb250ZW50VG9Vc2UpOworICAgICAgICB9CisgICAg ICB9IGVsc2UgaWYgKGNoaWxkcmVuVG9Vc2UgIT0gbnVsbCkgeworICAgICAgICB2YXIgbW91bnRJ bWFnZXMgPSB0aGlzLm1vdW50Q2hpbGRyZW4oY2hpbGRyZW5Ub1VzZSwgdHJhbnNhY3Rpb24sIGNv bnRleHQpOworICAgICAgICByZXQgPSBtb3VudEltYWdlcy5qb2luKCcnKTsKKyAgICAgIH0KKyAg ICB9CisgICAgaWYgKG5ld2xpbmVFYXRpbmdUYWdzW3RoaXMuX3RhZ10gJiYgcmV0LmNoYXJBdCgw KSA9PT0gJ1xuJykgeworICAgICAgLy8gdGV4dC9odG1sIGlnbm9yZXMgdGhlIGZpcnN0IGNoYXJh Y3RlciBpbiB0aGVzZSB0YWdzIGlmIGl0J3MgYSBuZXdsaW5lCisgICAgICAvLyBQcmVmZXIgdG8g YnJlYWsgYXBwbGljYXRpb24veG1sIG92ZXIgdGV4dC9odG1sIChmb3Igbm93KSBieSBhZGRpbmcK KyAgICAgIC8vIGEgbmV3bGluZSBzcGVjaWZpY2FsbHkgdG8gZ2V0IGVhdGVuIGJ5IHRoZSBwYXJz ZXIuIChBbHRlcm5hdGVseSBmb3IKKyAgICAgIC8vIHRleHRhcmVhcywgcmVwbGFjaW5nICJeXG4i IHdpdGggIlxyXG4iIGRvZXNuJ3QgZ2V0IGVhdGVuLCBhbmQgdGhlIGZpcnN0CisgICAgICAvLyBc ciBpcyBub3JtYWxpemVkIG91dCBieSBIVE1MVGV4dEFyZWFFbGVtZW50I3ZhbHVlLikKKyAgICAg IC8vIFNlZTogPGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWwtcG9seWdsb3QvI25ld2xpbmVzLWlu LXRleHRhcmVhLWFuZC1wcmU+CisgICAgICAvLyBTZWU6IDxodHRwOi8vd3d3LnczLm9yZy9UUi9o dG1sNS9zeW50YXguaHRtbCNlbGVtZW50LXJlc3RyaWN0aW9ucz4KKyAgICAgIC8vIFNlZTogPGh0 dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L3N5bnRheC5odG1sI25ld2xpbmVzPgorICAgICAgLy8g U2VlOiBQYXJzaW5nIG9mICJ0ZXh0YXJlYSIgImxpc3RpbmciIGFuZCAicHJlIiBlbGVtZW50cwor ICAgICAgLy8gIGZyb20gPGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L3N5bnRheC5odG1sI3Bh cnNpbmctbWFpbi1pbmJvZHk+CisgICAgICByZXR1cm4gJ1xuJyArIHJldDsKKyAgICB9IGVsc2Ug eworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgIH0sCisKKyAgX2NyZWF0ZUluaXRpYWxDaGls ZHJlbjogZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBwcm9wcywgY29udGV4dCwgbGF6eVRyZWUpIHsK KyAgICAvLyBJbnRlbnRpb25hbCB1c2Ugb2YgIT0gdG8gYXZvaWQgY2F0Y2hpbmcgemVyby9mYWxz ZS4KKyAgICB2YXIgaW5uZXJIVE1MID0gcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw7Cisg ICAgaWYgKGlubmVySFRNTCAhPSBudWxsKSB7CisgICAgICBpZiAoaW5uZXJIVE1MLl9faHRtbCAh PSBudWxsKSB7CisgICAgICAgIERPTUxhenlUcmVlLnF1ZXVlSFRNTChsYXp5VHJlZSwgaW5uZXJI VE1MLl9faHRtbCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBjb250ZW50VG9V c2UgPSBDT05URU5UX1RZUEVTW3R5cGVvZiBwcm9wcy5jaGlsZHJlbl0gPyBwcm9wcy5jaGlsZHJl biA6IG51bGw7CisgICAgICB2YXIgY2hpbGRyZW5Ub1VzZSA9IGNvbnRlbnRUb1VzZSAhPSBudWxs ID8gbnVsbCA6IHByb3BzLmNoaWxkcmVuOworICAgICAgLy8gVE9ETzogVmFsaWRhdGUgdGhhdCB0 ZXh0IGlzIGFsbG93ZWQgYXMgYSBjaGlsZCBvZiB0aGlzIG5vZGUKKyAgICAgIGlmIChjb250ZW50 VG9Vc2UgIT0gbnVsbCkgeworICAgICAgICAvLyBBdm9pZCBzZXR0aW5nIHRleHRDb250ZW50IHdo ZW4gdGhlIHRleHQgaXMgZW1wdHkuIEluIElFMTEgc2V0dGluZworICAgICAgICAvLyB0ZXh0Q29u dGVudCBvbiBhIHRleHQgYXJlYSB3aWxsIGNhdXNlIHRoZSBwbGFjZWhvbGRlciB0byBub3QKKyAg ICAgICAgLy8gc2hvdyB3aXRoaW4gdGhlIHRleHRhcmVhIHVudGlsIGl0IGhhcyBiZWVuIGZvY3Vz ZWQgYW5kIGJsdXJyZWQgYWdhaW4uCisgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNl Ym9vay9yZWFjdC9pc3N1ZXMvNjczMSNpc3N1ZWNvbW1lbnQtMjU0ODc0NTUzCisgICAgICAgIGlm IChjb250ZW50VG9Vc2UgIT09ICcnKSB7CisgICAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09 ICdwcm9kdWN0aW9uJykgeworICAgICAgICAgICAgc2V0QW5kVmFsaWRhdGVDb250ZW50Q2hpbGRE ZXYuY2FsbCh0aGlzLCBjb250ZW50VG9Vc2UpOworICAgICAgICAgIH0KKyAgICAgICAgICBET01M YXp5VHJlZS5xdWV1ZVRleHQobGF6eVRyZWUsIGNvbnRlbnRUb1VzZSk7CisgICAgICAgIH0KKyAg ICAgIH0gZWxzZSBpZiAoY2hpbGRyZW5Ub1VzZSAhPSBudWxsKSB7CisgICAgICAgIHZhciBtb3Vu dEltYWdlcyA9IHRoaXMubW91bnRDaGlsZHJlbihjaGlsZHJlblRvVXNlLCB0cmFuc2FjdGlvbiwg Y29udGV4dCk7CisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW91bnRJbWFnZXMubGVuZ3Ro OyBpKyspIHsKKyAgICAgICAgICBET01MYXp5VHJlZS5xdWV1ZUNoaWxkKGxhenlUcmVlLCBtb3Vu dEltYWdlc1tpXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0sCisKKyAgLyoqCisg ICAqIFJlY2VpdmVzIGEgbmV4dCBlbGVtZW50IGFuZCB1cGRhdGVzIHRoZSBjb21wb25lbnQuCisg ICAqCisgICAqIEBpbnRlcm5hbAorICAgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gbmV4dEVsZW1l bnQKKyAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufFJlYWN0U2VydmVyUmVu ZGVyaW5nVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uCisgICAqIEBwYXJhbSB7b2JqZWN0fSBjb250 ZXh0CisgICAqLworICByZWNlaXZlQ29tcG9uZW50OiBmdW5jdGlvbiAobmV4dEVsZW1lbnQsIHRy YW5zYWN0aW9uLCBjb250ZXh0KSB7CisgICAgdmFyIHByZXZFbGVtZW50ID0gdGhpcy5fY3VycmVu dEVsZW1lbnQ7CisgICAgdGhpcy5fY3VycmVudEVsZW1lbnQgPSBuZXh0RWxlbWVudDsKKyAgICB0 aGlzLnVwZGF0ZUNvbXBvbmVudCh0cmFuc2FjdGlvbiwgcHJldkVsZW1lbnQsIG5leHRFbGVtZW50 LCBjb250ZXh0KTsKKyAgfSwKKworICAvKioKKyAgICogVXBkYXRlcyBhIERPTSBjb21wb25lbnQg YWZ0ZXIgaXQgaGFzIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYW5kCisgICAqIGF0dGFjaGVkIHRv IHRoZSBET00uIFJlY29uY2lsZXMgdGhlIHJvb3QgRE9NIG5vZGUsIHRoZW4gcmVjdXJzZXMuCisg ICAqCisgICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24K KyAgICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IHByZXZFbGVtZW50CisgICAqIEBwYXJhbSB7UmVh Y3RFbGVtZW50fSBuZXh0RWxlbWVudAorICAgKiBAaW50ZXJuYWwKKyAgICogQG92ZXJyaWRhYmxl CisgICAqLworICB1cGRhdGVDb21wb25lbnQ6IGZ1bmN0aW9uICh0cmFuc2FjdGlvbiwgcHJldkVs ZW1lbnQsIG5leHRFbGVtZW50LCBjb250ZXh0KSB7CisgICAgdmFyIGxhc3RQcm9wcyA9IHByZXZF bGVtZW50LnByb3BzOworICAgIHZhciBuZXh0UHJvcHMgPSB0aGlzLl9jdXJyZW50RWxlbWVudC5w cm9wczsKKworICAgIHN3aXRjaCAodGhpcy5fdGFnKSB7CisgICAgICBjYXNlICdpbnB1dCc6Cisg ICAgICAgIGxhc3RQcm9wcyA9IFJlYWN0RE9NSW5wdXQuZ2V0SG9zdFByb3BzKHRoaXMsIGxhc3RQ cm9wcyk7CisgICAgICAgIG5leHRQcm9wcyA9IFJlYWN0RE9NSW5wdXQuZ2V0SG9zdFByb3BzKHRo aXMsIG5leHRQcm9wcyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnb3B0aW9uJzoKKyAg ICAgICAgbGFzdFByb3BzID0gUmVhY3RET01PcHRpb24uZ2V0SG9zdFByb3BzKHRoaXMsIGxhc3RQ cm9wcyk7CisgICAgICAgIG5leHRQcm9wcyA9IFJlYWN0RE9NT3B0aW9uLmdldEhvc3RQcm9wcyh0 aGlzLCBuZXh0UHJvcHMpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3NlbGVjdCc6Cisg ICAgICAgIGxhc3RQcm9wcyA9IFJlYWN0RE9NU2VsZWN0LmdldEhvc3RQcm9wcyh0aGlzLCBsYXN0 UHJvcHMpOworICAgICAgICBuZXh0UHJvcHMgPSBSZWFjdERPTVNlbGVjdC5nZXRIb3N0UHJvcHMo dGhpcywgbmV4dFByb3BzKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICd0ZXh0YXJlYSc6 CisgICAgICAgIGxhc3RQcm9wcyA9IFJlYWN0RE9NVGV4dGFyZWEuZ2V0SG9zdFByb3BzKHRoaXMs IGxhc3RQcm9wcyk7CisgICAgICAgIG5leHRQcm9wcyA9IFJlYWN0RE9NVGV4dGFyZWEuZ2V0SG9z dFByb3BzKHRoaXMsIG5leHRQcm9wcyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGFz c2VydFZhbGlkUHJvcHModGhpcywgbmV4dFByb3BzKTsKKyAgICB0aGlzLl91cGRhdGVET01Qcm9w ZXJ0aWVzKGxhc3RQcm9wcywgbmV4dFByb3BzLCB0cmFuc2FjdGlvbik7CisgICAgdGhpcy5fdXBk YXRlRE9NQ2hpbGRyZW4obGFzdFByb3BzLCBuZXh0UHJvcHMsIHRyYW5zYWN0aW9uLCBjb250ZXh0 KTsKKworICAgIHN3aXRjaCAodGhpcy5fdGFnKSB7CisgICAgICBjYXNlICdpbnB1dCc6CisgICAg ICAgIC8vIFVwZGF0ZSB0aGUgd3JhcHBlciBhcm91bmQgaW5wdXRzICphZnRlciogdXBkYXRpbmcg cHJvcHMuIFRoaXMgaGFzIHRvCisgICAgICAgIC8vIGhhcHBlbiBhZnRlciBgX3VwZGF0ZURPTVBy b3BlcnRpZXNgLiBPdGhlcndpc2UgSFRNTDUgaW5wdXQgdmFsaWRhdGlvbnMKKyAgICAgICAgLy8g cmFpc2Ugd2FybmluZ3MgYW5kIHByZXZlbnQgdGhlIG5ldyB2YWx1ZSBmcm9tIGJlaW5nIGFzc2ln bmVkLgorICAgICAgICBSZWFjdERPTUlucHV0LnVwZGF0ZVdyYXBwZXIodGhpcyk7CisgICAgICAg IGJyZWFrOworICAgICAgY2FzZSAndGV4dGFyZWEnOgorICAgICAgICBSZWFjdERPTVRleHRhcmVh LnVwZGF0ZVdyYXBwZXIodGhpcyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnc2VsZWN0 JzoKKyAgICAgICAgLy8gPHNlbGVjdD4gdmFsdWUgdXBkYXRlIG5lZWRzIHRvIG9jY3VyIGFmdGVy IDxvcHRpb24+IGNoaWxkcmVuCisgICAgICAgIC8vIHJlY29uY2lsaWF0aW9uCisgICAgICAgIHRy YW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUocG9zdFVwZGF0ZVNlbGVjdFdy YXBwZXIsIHRoaXMpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0sCisKKyAgLyoqCisgICAq IFJlY29uY2lsZXMgdGhlIHByb3BlcnRpZXMgYnkgZGV0ZWN0aW5nIGRpZmZlcmVuY2VzIGluIHBy b3BlcnR5IHZhbHVlcyBhbmQKKyAgICogdXBkYXRpbmcgdGhlIERPTSBhcyBuZWNlc3NhcnkuIFRo aXMgZnVuY3Rpb24gaXMgcHJvYmFibHkgdGhlIHNpbmdsZSBtb3N0CisgICAqIGNyaXRpY2FsIHBh dGggZm9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbi4KKyAgICoKKyAgICogVE9ETzogQmVuY2ht YXJrIHdoZXRoZXIgY2hlY2tpbmcgZm9yIGNoYW5nZWQgdmFsdWVzIGluIG1lbW9yeSBhY3R1YWxs eQorICAgKiAgICAgICBpbXByb3ZlcyBwZXJmb3JtYW5jZSAoZXNwZWNpYWxseSBzdGF0aWNhbGx5 IHBvc2l0aW9uZWQgZWxlbWVudHMpLgorICAgKiBUT0RPOiBCZW5jaG1hcmsgdGhlIGVmZmVjdHMg b2YgcHV0dGluZyB0aGlzIGF0IHRoZSB0b3Agc2luY2UgOTklIG9mIHByb3BzCisgICAqICAgICAg IGRvIG5vdCBjaGFuZ2UgZm9yIGEgZ2l2ZW4gcmVjb25jaWxpYXRpb24uCisgICAqIFRPRE86IEJl bmNobWFyayBhcmVhcyB0aGF0IGNhbiBiZSBpbXByb3ZlZCB3aXRoIGNhY2hpbmcuCisgICAqCisg ICAqIEBwcml2YXRlCisgICAqIEBwYXJhbSB7b2JqZWN0fSBsYXN0UHJvcHMKKyAgICogQHBhcmFt IHtvYmplY3R9IG5leHRQcm9wcworICAgKiBAcGFyYW0gez9ET01FbGVtZW50fSBub2RlCisgICAq LworICBfdXBkYXRlRE9NUHJvcGVydGllczogZnVuY3Rpb24gKGxhc3RQcm9wcywgbmV4dFByb3Bz LCB0cmFuc2FjdGlvbikgeworICAgIHZhciBwcm9wS2V5OworICAgIHZhciBzdHlsZU5hbWU7Cisg ICAgdmFyIHN0eWxlVXBkYXRlczsKKyAgICBmb3IgKHByb3BLZXkgaW4gbGFzdFByb3BzKSB7Cisg ICAgICBpZiAobmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8ICFsYXN0UHJvcHMu aGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbGFzdFByb3BzW3Byb3BLZXldID09IG51bGwpIHsK KyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUp IHsKKyAgICAgICAgdmFyIGxhc3RTdHlsZSA9IHRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5OworICAg ICAgICBmb3IgKHN0eWxlTmFtZSBpbiBsYXN0U3R5bGUpIHsKKyAgICAgICAgICBpZiAobGFzdFN0 eWxlLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIHsKKyAgICAgICAgICAgIHN0eWxlVXBkYXRl cyA9IHN0eWxlVXBkYXRlcyB8fCB7fTsKKyAgICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5h bWVdID0gJyc7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRoaXMuX3ByZXZpb3Vz U3R5bGVDb3B5ID0gbnVsbDsKKyAgICAgIH0gZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZU1vZHVs ZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHsKKyAgICAgICAgaWYgKGxhc3RQcm9wc1twcm9w S2V5XSkgeworICAgICAgICAgIC8vIE9ubHkgY2FsbCBkZWxldGVMaXN0ZW5lciBpZiB0aGVyZSB3 YXMgYSBsaXN0ZW5lciBwcmV2aW91c2x5IG9yCisgICAgICAgICAgLy8gZWxzZSB3aWxsRGVsZXRl TGlzdGVuZXIgZ2V0cyBjYWxsZWQgd2hlbiB0aGVyZSB3YXNuJ3QgYWN0dWFsbHkgYQorICAgICAg ICAgIC8vIGxpc3RlbmVyIChlLmcuLCBvbkNsaWNrPXtudWxsfSkKKyAgICAgICAgICBkZWxldGVM aXN0ZW5lcih0aGlzLCBwcm9wS2V5KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChpc0N1 c3RvbUNvbXBvbmVudCh0aGlzLl90YWcsIGxhc3RQcm9wcykpIHsKKyAgICAgICAgaWYgKCFSRVNF UlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkgeworICAgICAgICAgIERPTVByb3Bl cnR5T3BlcmF0aW9ucy5kZWxldGVWYWx1ZUZvckF0dHJpYnV0ZShnZXROb2RlKHRoaXMpLCBwcm9w S2V5KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChET01Qcm9wZXJ0eS5wcm9wZXJ0aWVz W3Byb3BLZXldIHx8IERPTVByb3BlcnR5LmlzQ3VzdG9tQXR0cmlidXRlKHByb3BLZXkpKSB7Cisg ICAgICAgIERPTVByb3BlcnR5T3BlcmF0aW9ucy5kZWxldGVWYWx1ZUZvclByb3BlcnR5KGdldE5v ZGUodGhpcyksIHByb3BLZXkpOworICAgICAgfQorICAgIH0KKyAgICBmb3IgKHByb3BLZXkgaW4g bmV4dFByb3BzKSB7CisgICAgICB2YXIgbmV4dFByb3AgPSBuZXh0UHJvcHNbcHJvcEtleV07Cisg ICAgICB2YXIgbGFzdFByb3AgPSBwcm9wS2V5ID09PSBTVFlMRSA/IHRoaXMuX3ByZXZpb3VzU3R5 bGVDb3B5IDogbGFzdFByb3BzICE9IG51bGwgPyBsYXN0UHJvcHNbcHJvcEtleV0gOiB1bmRlZmlu ZWQ7CisgICAgICBpZiAoIW5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSB8fCBuZXh0 UHJvcCA9PT0gbGFzdFByb3AgfHwgbmV4dFByb3AgPT0gbnVsbCAmJiBsYXN0UHJvcCA9PSBudWxs KSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHByb3BLZXkgPT09IFNU WUxFKSB7CisgICAgICAgIGlmIChuZXh0UHJvcCkgeworICAgICAgICAgIGlmICgiZGV2ZWxvcG1l bnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICAgICAgIGNoZWNrQW5kV2FybkZvck11dGF0 ZWRTdHlsZSh0aGlzLl9wcmV2aW91c1N0eWxlQ29weSwgdGhpcy5fcHJldmlvdXNTdHlsZSwgdGhp cyk7CisgICAgICAgICAgICB0aGlzLl9wcmV2aW91c1N0eWxlID0gbmV4dFByb3A7CisgICAgICAg ICAgfQorICAgICAgICAgIG5leHRQcm9wID0gdGhpcy5fcHJldmlvdXNTdHlsZUNvcHkgPSBfYXNz aWduKHt9LCBuZXh0UHJvcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5fcHJl dmlvdXNTdHlsZUNvcHkgPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmIChsYXN0UHJvcCkg eworICAgICAgICAgIC8vIFVuc2V0IHN0eWxlcyBvbiBgbGFzdFByb3BgIGJ1dCBub3Qgb24gYG5l eHRQcm9wYC4KKyAgICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiBsYXN0UHJvcCkgeworICAgICAg ICAgICAgaWYgKGxhc3RQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkgJiYgKCFuZXh0UHJv cCB8fCAhbmV4dFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkpIHsKKyAgICAgICAgICAg ICAgc3R5bGVVcGRhdGVzID0gc3R5bGVVcGRhdGVzIHx8IHt9OworICAgICAgICAgICAgICBzdHls ZVVwZGF0ZXNbc3R5bGVOYW1lXSA9ICcnOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAg ICAgICAgICAvLyBVcGRhdGUgc3R5bGVzIHRoYXQgY2hhbmdlZCBzaW5jZSBgbGFzdFByb3BgLgor ICAgICAgICAgIGZvciAoc3R5bGVOYW1lIGluIG5leHRQcm9wKSB7CisgICAgICAgICAgICBpZiAo bmV4dFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSAmJiBsYXN0UHJvcFtzdHlsZU5hbWVd ICE9PSBuZXh0UHJvcFtzdHlsZU5hbWVdKSB7CisgICAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9 IHN0eWxlVXBkYXRlcyB8fCB7fTsKKyAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxlTmFt ZV0gPSBuZXh0UHJvcFtzdHlsZU5hbWVdOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAg ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBSZWxpZXMgb24gYHVwZGF0ZVN0eWxlc0J5SURg IG5vdCBtdXRhdGluZyBgc3R5bGVVcGRhdGVzYC4KKyAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSBu ZXh0UHJvcDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lTW9k dWxlcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkgeworICAgICAgICBpZiAobmV4dFByb3ApIHsK KyAgICAgICAgICBlbnF1ZXVlUHV0TGlzdGVuZXIodGhpcywgcHJvcEtleSwgbmV4dFByb3AsIHRy YW5zYWN0aW9uKTsKKyAgICAgICAgfSBlbHNlIGlmIChsYXN0UHJvcCkgeworICAgICAgICAgIGRl bGV0ZUxpc3RlbmVyKHRoaXMsIHByb3BLZXkpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYg KGlzQ3VzdG9tQ29tcG9uZW50KHRoaXMuX3RhZywgbmV4dFByb3BzKSkgeworICAgICAgICBpZiAo IVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7CisgICAgICAgICAgRE9N UHJvcGVydHlPcGVyYXRpb25zLnNldFZhbHVlRm9yQXR0cmlidXRlKGdldE5vZGUodGhpcyksIHBy b3BLZXksIG5leHRQcm9wKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChET01Qcm9wZXJ0 eS5wcm9wZXJ0aWVzW3Byb3BLZXldIHx8IERPTVByb3BlcnR5LmlzQ3VzdG9tQXR0cmlidXRlKHBy b3BLZXkpKSB7CisgICAgICAgIHZhciBub2RlID0gZ2V0Tm9kZSh0aGlzKTsKKyAgICAgICAgLy8g SWYgd2UncmUgdXBkYXRpbmcgdG8gbnVsbCBvciB1bmRlZmluZWQsIHdlIHNob3VsZCByZW1vdmUg dGhlIHByb3BlcnR5CisgICAgICAgIC8vIGZyb20gdGhlIERPTSBub2RlIGluc3RlYWQgb2YgaW5h ZHZlcnRlbnRseSBzZXR0aW5nIHRvIGEgc3RyaW5nLiBUaGlzCisgICAgICAgIC8vIGJyaW5ncyB1 cyBpbiBsaW5lIHdpdGggdGhlIHNhbWUgYmVoYXZpb3Igd2UgaGF2ZSBvbiBpbml0aWFsIHJlbmRl ci4KKyAgICAgICAgaWYgKG5leHRQcm9wICE9IG51bGwpIHsKKyAgICAgICAgICBET01Qcm9wZXJ0 eU9wZXJhdGlvbnMuc2V0VmFsdWVGb3JQcm9wZXJ0eShub2RlLCBwcm9wS2V5LCBuZXh0UHJvcCk7 CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgRE9NUHJvcGVydHlPcGVyYXRpb25zLmRlbGV0 ZVZhbHVlRm9yUHJvcGVydHkobm9kZSwgcHJvcEtleSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAg ICB9CisgICAgaWYgKHN0eWxlVXBkYXRlcykgeworICAgICAgQ1NTUHJvcGVydHlPcGVyYXRpb25z LnNldFZhbHVlRm9yU3R5bGVzKGdldE5vZGUodGhpcyksIHN0eWxlVXBkYXRlcywgdGhpcyk7Cisg ICAgfQorICB9LAorCisgIC8qKgorICAgKiBSZWNvbmNpbGVzIHRoZSBjaGlsZHJlbiB3aXRoIHRo ZSB2YXJpb3VzIHByb3BlcnRpZXMgdGhhdCBhZmZlY3QgdGhlCisgICAqIGNoaWxkcmVuIGNvbnRl bnQuCisgICAqCisgICAqIEBwYXJhbSB7b2JqZWN0fSBsYXN0UHJvcHMKKyAgICogQHBhcmFtIHtv YmplY3R9IG5leHRQcm9wcworICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259 IHRyYW5zYWN0aW9uCisgICAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0CisgICAqLworICBfdXBk YXRlRE9NQ2hpbGRyZW46IGZ1bmN0aW9uIChsYXN0UHJvcHMsIG5leHRQcm9wcywgdHJhbnNhY3Rp b24sIGNvbnRleHQpIHsKKyAgICB2YXIgbGFzdENvbnRlbnQgPSBDT05URU5UX1RZUEVTW3R5cGVv ZiBsYXN0UHJvcHMuY2hpbGRyZW5dID8gbGFzdFByb3BzLmNoaWxkcmVuIDogbnVsbDsKKyAgICB2 YXIgbmV4dENvbnRlbnQgPSBDT05URU5UX1RZUEVTW3R5cGVvZiBuZXh0UHJvcHMuY2hpbGRyZW5d ID8gbmV4dFByb3BzLmNoaWxkcmVuIDogbnVsbDsKKworICAgIHZhciBsYXN0SHRtbCA9IGxhc3RQ cm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAmJiBsYXN0UHJvcHMuZGFuZ2Vyb3VzbHlTZXRJ bm5lckhUTUwuX19odG1sOworICAgIHZhciBuZXh0SHRtbCA9IG5leHRQcm9wcy5kYW5nZXJvdXNs eVNldElubmVySFRNTCAmJiBuZXh0UHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwuX19odG1s OworCisgICAgLy8gTm90ZSB0aGUgdXNlIG9mIGAhPWAgd2hpY2ggY2hlY2tzIGZvciBudWxsIG9y IHVuZGVmaW5lZC4KKyAgICB2YXIgbGFzdENoaWxkcmVuID0gbGFzdENvbnRlbnQgIT0gbnVsbCA/ IG51bGwgOiBsYXN0UHJvcHMuY2hpbGRyZW47CisgICAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRD b250ZW50ICE9IG51bGwgPyBudWxsIDogbmV4dFByb3BzLmNoaWxkcmVuOworCisgICAgLy8gSWYg d2UncmUgc3dpdGNoaW5nIGZyb20gY2hpbGRyZW4gdG8gY29udGVudC9odG1sIG9yIHZpY2UgdmVy c2EsIHJlbW92ZQorICAgIC8vIHRoZSBvbGQgY29udGVudAorICAgIHZhciBsYXN0SGFzQ29udGVu dE9ySHRtbCA9IGxhc3RDb250ZW50ICE9IG51bGwgfHwgbGFzdEh0bWwgIT0gbnVsbDsKKyAgICB2 YXIgbmV4dEhhc0NvbnRlbnRPckh0bWwgPSBuZXh0Q29udGVudCAhPSBudWxsIHx8IG5leHRIdG1s ICE9IG51bGw7CisgICAgaWYgKGxhc3RDaGlsZHJlbiAhPSBudWxsICYmIG5leHRDaGlsZHJlbiA9 PSBudWxsKSB7CisgICAgICB0aGlzLnVwZGF0ZUNoaWxkcmVuKG51bGwsIHRyYW5zYWN0aW9uLCBj b250ZXh0KTsKKyAgICB9IGVsc2UgaWYgKGxhc3RIYXNDb250ZW50T3JIdG1sICYmICFuZXh0SGFz Q29udGVudE9ySHRtbCkgeworICAgICAgdGhpcy51cGRhdGVUZXh0Q29udGVudCgnJyk7CisgICAg ICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAgIFJlYWN0SW5z dHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblNldENoaWxkcmVuKHRoaXMuX2RlYnVnSUQsIFtdKTsK KyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobmV4dENvbnRlbnQgIT0gbnVsbCkgeworICAgICAg aWYgKGxhc3RDb250ZW50ICE9PSBuZXh0Q29udGVudCkgeworICAgICAgICB0aGlzLnVwZGF0ZVRl eHRDb250ZW50KCcnICsgbmV4dENvbnRlbnQpOworICAgICAgICBpZiAoImRldmVsb3BtZW50IiAh PT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAgICAgc2V0QW5kVmFsaWRhdGVDb250ZW50Q2hpbGRE ZXYuY2FsbCh0aGlzLCBuZXh0Q29udGVudCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVs c2UgaWYgKG5leHRIdG1sICE9IG51bGwpIHsKKyAgICAgIGlmIChsYXN0SHRtbCAhPT0gbmV4dEh0 bWwpIHsKKyAgICAgICAgdGhpcy51cGRhdGVNYXJrdXAoJycgKyBuZXh0SHRtbCk7CisgICAgICB9 CisgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAgIFJl YWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblNldENoaWxkcmVuKHRoaXMuX2RlYnVnSUQs IFtdKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG5leHRDaGlsZHJlbiAhPSBudWxsKSB7Cisg ICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAgIHNldEFu ZFZhbGlkYXRlQ29udGVudENoaWxkRGV2LmNhbGwodGhpcywgbnVsbCk7CisgICAgICB9CisKKyAg ICAgIHRoaXMudXBkYXRlQ2hpbGRyZW4obmV4dENoaWxkcmVuLCB0cmFuc2FjdGlvbiwgY29udGV4 dCk7CisgICAgfQorICB9LAorCisgIGdldEhvc3ROb2RlOiBmdW5jdGlvbiAoKSB7CisgICAgcmV0 dXJuIGdldE5vZGUodGhpcyk7CisgIH0sCisKKyAgLyoqCisgICAqIERlc3Ryb3lzIGFsbCBldmVu dCByZWdpc3RyYXRpb25zIGZvciB0aGlzIGluc3RhbmNlLiBEb2VzIG5vdCByZW1vdmUgZnJvbQor ICAgKiB0aGUgRE9NLiBUaGF0IG11c3QgYmUgZG9uZSBieSB0aGUgcGFyZW50LgorICAgKgorICAg KiBAaW50ZXJuYWwKKyAgICovCisgIHVubW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChzYWZlbHkp IHsKKyAgICBzd2l0Y2ggKHRoaXMuX3RhZykgeworICAgICAgY2FzZSAnYXVkaW8nOgorICAgICAg Y2FzZSAnZm9ybSc6CisgICAgICBjYXNlICdpZnJhbWUnOgorICAgICAgY2FzZSAnaW1nJzoKKyAg ICAgIGNhc2UgJ2xpbmsnOgorICAgICAgY2FzZSAnb2JqZWN0JzoKKyAgICAgIGNhc2UgJ3NvdXJj ZSc6CisgICAgICBjYXNlICd2aWRlbyc6CisgICAgICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl93 cmFwcGVyU3RhdGUubGlzdGVuZXJzOworICAgICAgICBpZiAobGlzdGVuZXJzKSB7CisgICAgICAg ICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAg ICAgIGxpc3RlbmVyc1tpXS5yZW1vdmUoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAg ICAgYnJlYWs7CisgICAgICBjYXNlICdodG1sJzoKKyAgICAgIGNhc2UgJ2hlYWQnOgorICAgICAg Y2FzZSAnYm9keSc6CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb21wb25lbnRzIGxpa2UgPGh0 bWw+IDxoZWFkPiBhbmQgPGJvZHk+IGNhbid0IGJlIHJlbW92ZWQgb3IgYWRkZWQKKyAgICAgICAg ICogZWFzaWx5IGluIGEgY3Jvc3MtYnJvd3NlciB3YXksIGhvd2V2ZXIgaXQncyB2YWx1YWJsZSB0 byBiZSBhYmxlIHRvCisgICAgICAgICAqIHRha2UgYWR2YW50YWdlIG9mIFJlYWN0J3MgcmVjb25j aWxpYXRpb24gZm9yIHN0eWxpbmcgYW5kIDx0aXRsZT4KKyAgICAgICAgICogbWFuYWdlbWVudC4g U28gd2UganVzdCBkb2N1bWVudCBpdCBhbmQgdGhyb3cgaW4gZGFuZ2Vyb3VzIGNhc2VzLgorICAg ICAgICAgKi8KKyAgICAgICAgIWZhbHNlID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24n ID8gaW52YXJpYW50KGZhbHNlLCAnPCVzPiB0cmllZCB0byB1bm1vdW50LiBCZWNhdXNlIG9mIGNy b3NzLWJyb3dzZXIgcXVpcmtzIGl0IGlzIGltcG9zc2libGUgdG8gdW5tb3VudCBzb21lIHRvcC1s ZXZlbCBjb21wb25lbnRzIChlZyA8aHRtbD4sIDxoZWFkPiwgYW5kIDxib2R5PikgcmVsaWFibHkg YW5kIGVmZmljaWVudGx5LiBUbyBmaXggdGhpcywgaGF2ZSBhIHNpbmdsZSB0b3AtbGV2ZWwgY29t cG9uZW50IHRoYXQgbmV2ZXIgdW5tb3VudHMgcmVuZGVyIHRoZXNlIGVsZW1lbnRzLicsIHRoaXMu X3RhZykgOiBfcHJvZEludmFyaWFudCgnNjYnLCB0aGlzLl90YWcpIDogdm9pZCAwOworICAgICAg ICBicmVhazsKKyAgICB9CisKKyAgICB0aGlzLnVubW91bnRDaGlsZHJlbihzYWZlbHkpOworICAg IFJlYWN0RE9NQ29tcG9uZW50VHJlZS51bmNhY2hlTm9kZSh0aGlzKTsKKyAgICBFdmVudFBsdWdp bkh1Yi5kZWxldGVBbGxMaXN0ZW5lcnModGhpcyk7CisgICAgdGhpcy5fcm9vdE5vZGVJRCA9IDA7 CisgICAgdGhpcy5fZG9tSUQgPSAwOworICAgIHRoaXMuX3dyYXBwZXJTdGF0ZSA9IG51bGw7CisK KyAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICBzZXRBbmRW YWxpZGF0ZUNvbnRlbnRDaGlsZERldi5jYWxsKHRoaXMsIG51bGwpOworICAgIH0KKyAgfSwKKwor ICBnZXRQdWJsaWNJbnN0YW5jZTogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBnZXROb2RlKHRo aXMpOworICB9CisKK307CisKK19hc3NpZ24oUmVhY3RET01Db21wb25lbnQucHJvdG90eXBlLCBS ZWFjdERPTUNvbXBvbmVudC5NaXhpbiwgUmVhY3RNdWx0aUNoaWxkLk1peGluKTsKKworbW9kdWxl LmV4cG9ydHMgPSBSZWFjdERPTUNvbXBvbmVudDsKK30seyIxMCI6MTAsIjEwNyI6MTA3LCIxMSI6 MTEsIjEyIjoxMiwiMTIyIjoxMjIsIjEyNSI6MTI1LCIxMzEiOjEzMSwiMTQyIjoxNDIsIjE1MCI6 MTUwLCIxNTYiOjE1NiwiMTU3IjoxNTcsIjE1OCI6MTU4LCIxNyI6MTcsIjE4IjoxOCwiMiI6Miwi MjYiOjI2LCIzMyI6MzMsIjM0IjozNCwiMzkiOjM5LCI0MiI6NDIsIjQzIjo0MywiNDYiOjQ2LCI1 Ijo1LCI2NCI6NjQsIjY4Ijo2OCwiNzciOjc3LCI5Ijo5fV0sMzM6W2Z1bmN0aW9uKF9kZXJlcV8s bW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxNS1wcmVzZW50LCBGYWNlYm9v aywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2Rl IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAq IExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4g QW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4g dGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ug c3RyaWN0JzsKKwordmFyIFJlYWN0RE9NQ29tcG9uZW50RmxhZ3MgPSB7CisgIGhhc0NhY2hlZENo aWxkTm9kZXM6IDEgPDwgMAorfTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTUNvbXBvbmVu dEZsYWdzOworfSx7fV0sMzQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoq CisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0 cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRo ZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUg cm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAor ICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0 aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9wcm9k SW52YXJpYW50ID0gX2RlcmVxXygxMjUpOworCit2YXIgRE9NUHJvcGVydHkgPSBfZGVyZXFfKDEx KTsKK3ZhciBSZWFjdERPTUNvbXBvbmVudEZsYWdzID0gX2RlcmVxXygzMyk7CisKK3ZhciBpbnZh cmlhbnQgPSBfZGVyZXFfKDE1MCk7CisKK3ZhciBBVFRSX05BTUUgPSBET01Qcm9wZXJ0eS5JRF9B VFRSSUJVVEVfTkFNRTsKK3ZhciBGbGFncyA9IFJlYWN0RE9NQ29tcG9uZW50RmxhZ3M7CisKK3Zh ciBpbnRlcm5hbEluc3RhbmNlS2V5ID0gJ19fcmVhY3RJbnRlcm5hbEluc3RhbmNlJCcgKyBNYXRo LnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTsKKworLyoqCisgKiBDaGVjayBpZiBhIGdp dmVuIG5vZGUgc2hvdWxkIGJlIGNhY2hlZC4KKyAqLworZnVuY3Rpb24gc2hvdWxkUHJlY2FjaGVO b2RlKG5vZGUsIG5vZGVJRCkgeworICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBub2Rl LmdldEF0dHJpYnV0ZShBVFRSX05BTUUpID09PSBTdHJpbmcobm9kZUlEKSB8fCBub2RlLm5vZGVU eXBlID09PSA4ICYmIG5vZGUubm9kZVZhbHVlID09PSAnIHJlYWN0LXRleHQ6ICcgKyBub2RlSUQg KyAnICcgfHwgbm9kZS5ub2RlVHlwZSA9PT0gOCAmJiBub2RlLm5vZGVWYWx1ZSA9PT0gJyByZWFj dC1lbXB0eTogJyArIG5vZGVJRCArICcgJzsKK30KKworLyoqCisgKiBEcmlsbCBkb3duICh0aHJv dWdoIGNvbXBvc2l0ZXMgYW5kIGVtcHR5IGNvbXBvbmVudHMpIHVudGlsIHdlIGdldCBhIGhvc3Qg b3IKKyAqIGhvc3QgdGV4dCBjb21wb25lbnQuCisgKgorICogVGhpcyBpcyBwcmV0dHkgcG9seW1v cnBoaWMgYnV0IHVuYXZvaWRhYmxlIHdpdGggdGhlIGN1cnJlbnQgc3RydWN0dXJlIHdlIGhhdmUK KyAqIGZvciBgX3JlbmRlcmVkQ2hpbGRyZW5gLgorICovCitmdW5jdGlvbiBnZXRSZW5kZXJlZEhv c3RPclRleHRGcm9tQ29tcG9uZW50KGNvbXBvbmVudCkgeworICB2YXIgcmVuZGVyZWQ7CisgIHdo aWxlIChyZW5kZXJlZCA9IGNvbXBvbmVudC5fcmVuZGVyZWRDb21wb25lbnQpIHsKKyAgICBjb21w b25lbnQgPSByZW5kZXJlZDsKKyAgfQorICByZXR1cm4gY29tcG9uZW50OworfQorCisvKioKKyAq IFBvcHVsYXRlIGBfaG9zdE5vZGVgIG9uIHRoZSByZW5kZXJlZCBob3N0L3RleHQgY29tcG9uZW50 IHdpdGggdGhlIGdpdmVuCisgKiBET00gbm9kZS4gVGhlIHBhc3NlZCBgaW5zdGAgY2FuIGJlIGEg Y29tcG9zaXRlLgorICovCitmdW5jdGlvbiBwcmVjYWNoZU5vZGUoaW5zdCwgbm9kZSkgeworICB2 YXIgaG9zdEluc3QgPSBnZXRSZW5kZXJlZEhvc3RPclRleHRGcm9tQ29tcG9uZW50KGluc3QpOwor ICBob3N0SW5zdC5faG9zdE5vZGUgPSBub2RlOworICBub2RlW2ludGVybmFsSW5zdGFuY2VLZXld ID0gaG9zdEluc3Q7Cit9CisKK2Z1bmN0aW9uIHVuY2FjaGVOb2RlKGluc3QpIHsKKyAgdmFyIG5v ZGUgPSBpbnN0Ll9ob3N0Tm9kZTsKKyAgaWYgKG5vZGUpIHsKKyAgICBkZWxldGUgbm9kZVtpbnRl cm5hbEluc3RhbmNlS2V5XTsKKyAgICBpbnN0Ll9ob3N0Tm9kZSA9IG51bGw7CisgIH0KK30KKwor LyoqCisgKiBQb3B1bGF0ZSBgX2hvc3ROb2RlYCBvbiBlYWNoIGNoaWxkIG9mIGBpbnN0YCwgYXNz dW1pbmcgdGhhdCB0aGUgY2hpbGRyZW4KKyAqIG1hdGNoIHVwIHdpdGggdGhlIERPTSAoZWxlbWVu dCkgY2hpbGRyZW4gb2YgYG5vZGVgLgorICoKKyAqIFdlIGNhY2hlIGVudGlyZSBsZXZlbHMgYXQg b25jZSB0byBhdm9pZCBhbiBuXjIgcHJvYmxlbSB3aGVyZSB3ZSBhY2Nlc3MgdGhlCisgKiBjaGls ZHJlbiBvZiBhIG5vZGUgc2VxdWVudGlhbGx5IGFuZCBoYXZlIHRvIHdhbGsgZnJvbSB0aGUgc3Rh cnQgdG8gb3VyIHRhcmdldAorICogbm9kZSBldmVyeSB0aW1lLgorICoKKyAqIFNpbmNlIHdlIHVw ZGF0ZSBgX3JlbmRlcmVkQ2hpbGRyZW5gIGFuZCB0aGUgYWN0dWFsIERPTSBhdCAoc2xpZ2h0bHkp CisgKiBkaWZmZXJlbnQgdGltZXMsIHdlIGNvdWxkIHJhY2UgaGVyZSBhbmQgc2VlIGEgbmV3ZXIg YF9yZW5kZXJlZENoaWxkcmVuYCB0aGFuCisgKiB0aGUgRE9NIG5vZGVzIHdlIHNlZS4gVG8gYXZv aWQgdGhpcywgUmVhY3RNdWx0aUNoaWxkIGNhbGxzCisgKiBgcHJlcGFyZVRvTWFuYWdlQ2hpbGRy ZW5gIGJlZm9yZSB3ZSBjaGFuZ2UgYF9yZW5kZXJlZENoaWxkcmVuYCwgYXQgd2hpY2gKKyAqIHRp bWUgdGhlIGNvbnRhaW5lcidzIGNoaWxkIG5vZGVzIGFyZSBhbHdheXMgY2FjaGVkICh1bnRpbCBp dCB1bm1vdW50cykuCisgKi8KK2Z1bmN0aW9uIHByZWNhY2hlQ2hpbGROb2RlcyhpbnN0LCBub2Rl KSB7CisgIGlmIChpbnN0Ll9mbGFncyAmIEZsYWdzLmhhc0NhY2hlZENoaWxkTm9kZXMpIHsKKyAg ICByZXR1cm47CisgIH0KKyAgdmFyIGNoaWxkcmVuID0gaW5zdC5fcmVuZGVyZWRDaGlsZHJlbjsK KyAgdmFyIGNoaWxkTm9kZSA9IG5vZGUuZmlyc3RDaGlsZDsKKyAgb3V0ZXI6IGZvciAodmFyIG5h bWUgaW4gY2hpbGRyZW4pIHsKKyAgICBpZiAoIWNoaWxkcmVuLmhhc093blByb3BlcnR5KG5hbWUp KSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgdmFyIGNoaWxkSW5zdCA9IGNoaWxkcmVu W25hbWVdOworICAgIHZhciBjaGlsZElEID0gZ2V0UmVuZGVyZWRIb3N0T3JUZXh0RnJvbUNvbXBv bmVudChjaGlsZEluc3QpLl9kb21JRDsKKyAgICBpZiAoY2hpbGRJRCA9PT0gMCkgeworICAgICAg Ly8gV2UncmUgY3VycmVudGx5IHVubW91bnRpbmcgdGhpcyBjaGlsZCBpbiBSZWFjdE11bHRpQ2hp bGQ7IHNraXAgaXQuCisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgLy8gV2UgYXNzdW1lIHRo ZSBjaGlsZCBub2RlcyBhcmUgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGNoaWxkIGluc3RhbmNl cy4KKyAgICBmb3IgKDsgY2hpbGROb2RlICE9PSBudWxsOyBjaGlsZE5vZGUgPSBjaGlsZE5vZGUu bmV4dFNpYmxpbmcpIHsKKyAgICAgIGlmIChzaG91bGRQcmVjYWNoZU5vZGUoY2hpbGROb2RlLCBj aGlsZElEKSkgeworICAgICAgICBwcmVjYWNoZU5vZGUoY2hpbGRJbnN0LCBjaGlsZE5vZGUpOwor ICAgICAgICBjb250aW51ZSBvdXRlcjsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gV2UgcmVhY2hl ZCB0aGUgZW5kIG9mIHRoZSBET00gY2hpbGRyZW4gd2l0aG91dCBmaW5kaW5nIGFuIElEIG1hdGNo LgorICAgICFmYWxzZSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFu dChmYWxzZSwgJ1VuYWJsZSB0byBmaW5kIGVsZW1lbnQgd2l0aCBJRCAlcy4nLCBjaGlsZElEKSA6 IF9wcm9kSW52YXJpYW50KCczMicsIGNoaWxkSUQpIDogdm9pZCAwOworICB9CisgIGluc3QuX2Zs YWdzIHw9IEZsYWdzLmhhc0NhY2hlZENoaWxkTm9kZXM7Cit9CisKKy8qKgorICogR2l2ZW4gYSBE T00gbm9kZSwgcmV0dXJuIHRoZSBjbG9zZXN0IFJlYWN0RE9NQ29tcG9uZW50IG9yCisgKiBSZWFj dERPTVRleHRDb21wb25lbnQgaW5zdGFuY2UgYW5jZXN0b3IuCisgKi8KK2Z1bmN0aW9uIGdldENs b3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5vZGUpIHsKKyAgaWYgKG5vZGVbaW50ZXJuYWxJbnN0YW5j ZUtleV0pIHsKKyAgICByZXR1cm4gbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTsKKyAgfQorCisg IC8vIFdhbGsgdXAgdGhlIHRyZWUgdW50aWwgd2UgZmluZCBhbiBhbmNlc3RvciB3aG9zZSBpbnN0 YW5jZSB3ZSBoYXZlIGNhY2hlZC4KKyAgdmFyIHBhcmVudHMgPSBbXTsKKyAgd2hpbGUgKCFub2Rl W2ludGVybmFsSW5zdGFuY2VLZXldKSB7CisgICAgcGFyZW50cy5wdXNoKG5vZGUpOworICAgIGlm IChub2RlLnBhcmVudE5vZGUpIHsKKyAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7CisgICAg fSBlbHNlIHsKKyAgICAgIC8vIFRvcCBvZiB0aGUgdHJlZS4gVGhpcyBub2RlIG11c3Qgbm90IGJl IHBhcnQgb2YgYSBSZWFjdCB0cmVlIChvciBpcworICAgICAgLy8gdW5tb3VudGVkLCBwb3RlbnRp YWxseSkuCisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICB2YXIgY2xvc2VzdDsK KyAgdmFyIGluc3Q7CisgIGZvciAoOyBub2RlICYmIChpbnN0ID0gbm9kZVtpbnRlcm5hbEluc3Rh bmNlS2V5XSk7IG5vZGUgPSBwYXJlbnRzLnBvcCgpKSB7CisgICAgY2xvc2VzdCA9IGluc3Q7Cisg ICAgaWYgKHBhcmVudHMubGVuZ3RoKSB7CisgICAgICBwcmVjYWNoZUNoaWxkTm9kZXMoaW5zdCwg bm9kZSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGNsb3Nlc3Q7Cit9CisKKy8qKgorICogR2l2 ZW4gYSBET00gbm9kZSwgcmV0dXJuIHRoZSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRl eHRDb21wb25lbnQKKyAqIGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBub2RlIHdhcyBub3QgcmVu ZGVyZWQgYnkgdGhpcyBSZWFjdC4KKyAqLworZnVuY3Rpb24gZ2V0SW5zdGFuY2VGcm9tTm9kZShu b2RlKSB7CisgIHZhciBpbnN0ID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUobm9kZSk7Cisg IGlmIChpbnN0ICE9IG51bGwgJiYgaW5zdC5faG9zdE5vZGUgPT09IG5vZGUpIHsKKyAgICByZXR1 cm4gaW5zdDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorfQorCisvKioKKyAq IEdpdmVuIGEgUmVhY3RET01Db21wb25lbnQgb3IgUmVhY3RET01UZXh0Q29tcG9uZW50LCByZXR1 cm4gdGhlIGNvcnJlc3BvbmRpbmcKKyAqIERPTSBub2RlLgorICovCitmdW5jdGlvbiBnZXROb2Rl RnJvbUluc3RhbmNlKGluc3QpIHsKKyAgLy8gV2l0aG91dCB0aGlzIGZpcnN0IGludmFyaWFudCwg cGFzc2luZyBhIG5vbi1ET00tY29tcG9uZW50IHRyaWdnZXJzIHRoZSBuZXh0CisgIC8vIGludmFy aWFudCBmb3IgYSBtaXNzaW5nIHBhcmVudCwgd2hpY2ggaXMgc3VwZXIgY29uZnVzaW5nLgorICAh KGluc3QuX2hvc3ROb2RlICE9PSB1bmRlZmluZWQpID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1 Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnZ2V0Tm9kZUZyb21JbnN0YW5jZTogSW52YWxpZCBh cmd1bWVudC4nKSA6IF9wcm9kSW52YXJpYW50KCczMycpIDogdm9pZCAwOworCisgIGlmIChpbnN0 Ll9ob3N0Tm9kZSkgeworICAgIHJldHVybiBpbnN0Ll9ob3N0Tm9kZTsKKyAgfQorCisgIC8vIFdh bGsgdXAgdGhlIHRyZWUgdW50aWwgd2UgZmluZCBhbiBhbmNlc3RvciB3aG9zZSBET00gbm9kZSB3 ZSBoYXZlIGNhY2hlZC4KKyAgdmFyIHBhcmVudHMgPSBbXTsKKyAgd2hpbGUgKCFpbnN0Ll9ob3N0 Tm9kZSkgeworICAgIHBhcmVudHMucHVzaChpbnN0KTsKKyAgICAhaW5zdC5faG9zdFBhcmVudCA/ ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0 IERPTSB0cmVlIHJvb3Qgc2hvdWxkIGFsd2F5cyBoYXZlIGEgbm9kZSByZWZlcmVuY2UuJykgOiBf cHJvZEludmFyaWFudCgnMzQnKSA6IHZvaWQgMDsKKyAgICBpbnN0ID0gaW5zdC5faG9zdFBhcmVu dDsKKyAgfQorCisgIC8vIE5vdyBwYXJlbnRzIGNvbnRhaW5zIGVhY2ggYW5jZXN0b3IgdGhhdCBk b2VzICpub3QqIGhhdmUgYSBjYWNoZWQgbmF0aXZlCisgIC8vIG5vZGUsIGFuZCBgaW5zdGAgaXMg dGhlIGRlZXBlc3QgYW5jZXN0b3IgdGhhdCBkb2VzLgorICBmb3IgKDsgcGFyZW50cy5sZW5ndGg7 IGluc3QgPSBwYXJlbnRzLnBvcCgpKSB7CisgICAgcHJlY2FjaGVDaGlsZE5vZGVzKGluc3QsIGlu c3QuX2hvc3ROb2RlKTsKKyAgfQorCisgIHJldHVybiBpbnN0Ll9ob3N0Tm9kZTsKK30KKwordmFy IFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHsKKyAgZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGU6 IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlLAorICBnZXRJbnN0YW5jZUZyb21Ob2RlOiBnZXRJ bnN0YW5jZUZyb21Ob2RlLAorICBnZXROb2RlRnJvbUluc3RhbmNlOiBnZXROb2RlRnJvbUluc3Rh bmNlLAorICBwcmVjYWNoZUNoaWxkTm9kZXM6IHByZWNhY2hlQ2hpbGROb2RlcywKKyAgcHJlY2Fj aGVOb2RlOiBwcmVjYWNoZU5vZGUsCisgIHVuY2FjaGVOb2RlOiB1bmNhY2hlTm9kZQorfTsKKwor bW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTUNvbXBvbmVudFRyZWU7Cit9LHsiMTEiOjExLCIxMjUi OjEyNSwiMTUwIjoxNTAsIjMzIjozM31dLDM1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBv cnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAq IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNl ZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZp bGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9u YWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRT IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisK K3ZhciB2YWxpZGF0ZURPTU5lc3RpbmcgPSBfZGVyZXFfKDEzMSk7CisKK3ZhciBET0NfTk9ERV9U WVBFID0gOTsKKworZnVuY3Rpb24gUmVhY3RET01Db250YWluZXJJbmZvKHRvcExldmVsV3JhcHBl ciwgbm9kZSkgeworICB2YXIgaW5mbyA9IHsKKyAgICBfdG9wTGV2ZWxXcmFwcGVyOiB0b3BMZXZl bFdyYXBwZXIsCisgICAgX2lkQ291bnRlcjogMSwKKyAgICBfb3duZXJEb2N1bWVudDogbm9kZSA/ IG5vZGUubm9kZVR5cGUgPT09IERPQ19OT0RFX1RZUEUgPyBub2RlIDogbm9kZS5vd25lckRvY3Vt ZW50IDogbnVsbCwKKyAgICBfbm9kZTogbm9kZSwKKyAgICBfdGFnOiBub2RlID8gbm9kZS5ub2Rl TmFtZS50b0xvd2VyQ2FzZSgpIDogbnVsbCwKKyAgICBfbmFtZXNwYWNlVVJJOiBub2RlID8gbm9k ZS5uYW1lc3BhY2VVUkkgOiBudWxsCisgIH07CisgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJv ZHVjdGlvbicpIHsKKyAgICBpbmZvLl9hbmNlc3RvckluZm8gPSBub2RlID8gdmFsaWRhdGVET01O ZXN0aW5nLnVwZGF0ZWRBbmNlc3RvckluZm8obnVsbCwgaW5mby5fdGFnLCBudWxsKSA6IG51bGw7 CisgIH0KKyAgcmV0dXJuIGluZm87Cit9CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RET01Db250 YWluZXJJbmZvOworfSx7IjEzMSI6MTMxfV0sMzY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4 cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgor ICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vu c2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0Ug ZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRp b25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVO VFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsK KwordmFyIF9hc3NpZ24gPSBfZGVyZXFfKDE1OCk7CisKK3ZhciBET01MYXp5VHJlZSA9IF9kZXJl cV8oOSk7Cit2YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gX2RlcmVxXygzNCk7CisKK3ZhciBS ZWFjdERPTUVtcHR5Q29tcG9uZW50ID0gZnVuY3Rpb24gKGluc3RhbnRpYXRlKSB7CisgIC8vIFJl YWN0Q29tcG9zaXRlQ29tcG9uZW50IHVzZXMgdGhpczoKKyAgdGhpcy5fY3VycmVudEVsZW1lbnQg PSBudWxsOworICAvLyBSZWFjdERPTUNvbXBvbmVudFRyZWUgdXNlcyB0aGVzZToKKyAgdGhpcy5f aG9zdE5vZGUgPSBudWxsOworICB0aGlzLl9ob3N0UGFyZW50ID0gbnVsbDsKKyAgdGhpcy5faG9z dENvbnRhaW5lckluZm8gPSBudWxsOworICB0aGlzLl9kb21JRCA9IDA7Cit9OworX2Fzc2lnbihS ZWFjdERPTUVtcHR5Q29tcG9uZW50LnByb3RvdHlwZSwgeworICBtb3VudENvbXBvbmVudDogZnVu Y3Rpb24gKHRyYW5zYWN0aW9uLCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgY29udGV4 dCkgeworICAgIHZhciBkb21JRCA9IGhvc3RDb250YWluZXJJbmZvLl9pZENvdW50ZXIrKzsKKyAg ICB0aGlzLl9kb21JRCA9IGRvbUlEOworICAgIHRoaXMuX2hvc3RQYXJlbnQgPSBob3N0UGFyZW50 OworICAgIHRoaXMuX2hvc3RDb250YWluZXJJbmZvID0gaG9zdENvbnRhaW5lckluZm87CisKKyAg ICB2YXIgbm9kZVZhbHVlID0gJyByZWFjdC1lbXB0eTogJyArIHRoaXMuX2RvbUlEICsgJyAnOwor ICAgIGlmICh0cmFuc2FjdGlvbi51c2VDcmVhdGVFbGVtZW50KSB7CisgICAgICB2YXIgb3duZXJE b2N1bWVudCA9IGhvc3RDb250YWluZXJJbmZvLl9vd25lckRvY3VtZW50OworICAgICAgdmFyIG5v ZGUgPSBvd25lckRvY3VtZW50LmNyZWF0ZUNvbW1lbnQobm9kZVZhbHVlKTsKKyAgICAgIFJlYWN0 RE9NQ29tcG9uZW50VHJlZS5wcmVjYWNoZU5vZGUodGhpcywgbm9kZSk7CisgICAgICByZXR1cm4g RE9NTGF6eVRyZWUobm9kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICh0cmFuc2FjdGlvbi5y ZW5kZXJUb1N0YXRpY01hcmt1cCkgeworICAgICAgICAvLyBOb3JtYWxseSB3ZSdkIGluc2VydCBh IGNvbW1lbnQgbm9kZSwgYnV0IHNpbmNlIHRoaXMgaXMgYSBzaXR1YXRpb24KKyAgICAgICAgLy8g d2hlcmUgUmVhY3Qgd29uJ3QgdGFrZSBvdmVyIChzdGF0aWMgcGFnZXMpLCB3ZSBjYW4gc2ltcGx5 IHJldHVybgorICAgICAgICAvLyBub3RoaW5nLgorICAgICAgICByZXR1cm4gJyc7CisgICAgICB9 CisgICAgICByZXR1cm4gJzwhLS0nICsgbm9kZVZhbHVlICsgJy0tPic7CisgICAgfQorICB9LAor ICByZWNlaXZlQ29tcG9uZW50OiBmdW5jdGlvbiAoKSB7fSwKKyAgZ2V0SG9zdE5vZGU6IGZ1bmN0 aW9uICgpIHsKKyAgICByZXR1cm4gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5z dGFuY2UodGhpcyk7CisgIH0sCisgIHVubW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uICgpIHsKKyAg ICBSZWFjdERPTUNvbXBvbmVudFRyZWUudW5jYWNoZU5vZGUodGhpcyk7CisgIH0KK30pOworCitt b2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NRW1wdHlDb21wb25lbnQ7Cit9LHsiMTU4IjoxNTgsIjM0 IjozNCwiOSI6OX1dLDM3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgor ICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMg cmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUg QlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJv b3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAq IG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhl IHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBSZWFjdERP TUZlYXR1cmVGbGFncyA9IHsKKyAgdXNlQ3JlYXRlRWxlbWVudDogdHJ1ZSwKKyAgdXNlRmliZXI6 IGZhbHNlCit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NRmVhdHVyZUZsYWdzOworfSx7 fV0sMzg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmln aHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4K KyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUg bGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rv cnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50 IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJl Y3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIERPTUNoaWxkcmVuT3BlcmF0 aW9ucyA9IF9kZXJlcV8oOCk7Cit2YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gX2RlcmVxXygz NCk7CisKKy8qKgorICogT3BlcmF0aW9ucyB1c2VkIHRvIHByb2Nlc3MgdXBkYXRlcyB0byBET00g bm9kZXMuCisgKi8KK3ZhciBSZWFjdERPTUlET3BlcmF0aW9ucyA9IHsKKworICAvKioKKyAgICog VXBkYXRlcyBhIGNvbXBvbmVudCdzIGNoaWxkcmVuIGJ5IHByb2Nlc3NpbmcgYSBzZXJpZXMgb2Yg dXBkYXRlcy4KKyAgICoKKyAgICogQHBhcmFtIHthcnJheTxvYmplY3Q+fSB1cGRhdGVzIExpc3Qg b2YgdXBkYXRlIGNvbmZpZ3VyYXRpb25zLgorICAgKiBAaW50ZXJuYWwKKyAgICovCisgIGRhbmdl cm91c2x5UHJvY2Vzc0NoaWxkcmVuVXBkYXRlczogZnVuY3Rpb24gKHBhcmVudEluc3QsIHVwZGF0 ZXMpIHsKKyAgICB2YXIgbm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUlu c3RhbmNlKHBhcmVudEluc3QpOworICAgIERPTUNoaWxkcmVuT3BlcmF0aW9ucy5wcm9jZXNzVXBk YXRlcyhub2RlLCB1cGRhdGVzKTsKKyAgfQorfTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdERP TUlET3BlcmF0aW9uczsKK30seyIzNCI6MzQsIjgiOjh9XSwzOTpbZnVuY3Rpb24oX2RlcmVxXyxt b2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29r LCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUg aXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICog TElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBB biBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0 aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBz dHJpY3QnOworCit2YXIgX3Byb2RJbnZhcmlhbnQgPSBfZGVyZXFfKDEyNSksCisgICAgX2Fzc2ln biA9IF9kZXJlcV8oMTU4KTsKKwordmFyIERPTVByb3BlcnR5T3BlcmF0aW9ucyA9IF9kZXJlcV8o MTIpOwordmFyIExpbmtlZFZhbHVlVXRpbHMgPSBfZGVyZXFfKDI0KTsKK3ZhciBSZWFjdERPTUNv bXBvbmVudFRyZWUgPSBfZGVyZXFfKDM0KTsKK3ZhciBSZWFjdFVwZGF0ZXMgPSBfZGVyZXFfKDgy KTsKKwordmFyIGludmFyaWFudCA9IF9kZXJlcV8oMTUwKTsKK3ZhciB3YXJuaW5nID0gX2RlcmVx XygxNTcpOworCit2YXIgZGlkV2FyblZhbHVlTGluayA9IGZhbHNlOwordmFyIGRpZFdhcm5DaGVj a2VkTGluayA9IGZhbHNlOwordmFyIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSA9IGZhbHNlOwor dmFyIGRpZFdhcm5DaGVja2VkRGVmYXVsdENoZWNrZWQgPSBmYWxzZTsKK3ZhciBkaWRXYXJuQ29u dHJvbGxlZFRvVW5jb250cm9sbGVkID0gZmFsc2U7Cit2YXIgZGlkV2FyblVuY29udHJvbGxlZFRv Q29udHJvbGxlZCA9IGZhbHNlOworCitmdW5jdGlvbiBmb3JjZVVwZGF0ZUlmTW91bnRlZCgpIHsK KyAgaWYgKHRoaXMuX3Jvb3ROb2RlSUQpIHsKKyAgICAvLyBET00gY29tcG9uZW50IGlzIHN0aWxs IG1vdW50ZWQ7IHVwZGF0ZQorICAgIFJlYWN0RE9NSW5wdXQudXBkYXRlV3JhcHBlcih0aGlzKTsK KyAgfQorfQorCitmdW5jdGlvbiBpc0NvbnRyb2xsZWQocHJvcHMpIHsKKyAgdmFyIHVzZXNDaGVj a2VkID0gcHJvcHMudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBwcm9wcy50eXBlID09PSAncmFkaW8n OworICByZXR1cm4gdXNlc0NoZWNrZWQgPyBwcm9wcy5jaGVja2VkICE9IG51bGwgOiBwcm9wcy52 YWx1ZSAhPSBudWxsOworfQorCisvKioKKyAqIEltcGxlbWVudHMgYW4gPGlucHV0PiBob3N0IGNv bXBvbmVudCB0aGF0IGFsbG93cyBzZXR0aW5nIHRoZXNlIG9wdGlvbmFsCisgKiBwcm9wczogYGNo ZWNrZWRgLCBgdmFsdWVgLCBgZGVmYXVsdENoZWNrZWRgLCBhbmQgYGRlZmF1bHRWYWx1ZWAuCisg KgorICogSWYgYGNoZWNrZWRgIG9yIGB2YWx1ZWAgYXJlIG5vdCBzdXBwbGllZCAob3IgbnVsbC91 bmRlZmluZWQpLCB1c2VyIGFjdGlvbnMKKyAqIHRoYXQgYWZmZWN0IHRoZSBjaGVja2VkIHN0YXRl IG9yIHZhbHVlIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LgorICoKKyAqIElm IHRoZXkgYXJlIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVk IGVsZW1lbnQgd2lsbCBub3QKKyAqIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC4gSW5z dGVhZCwgdGhlIHByb3BzIG11c3QgY2hhbmdlIGluIG9yZGVyIGZvcgorICogdGhlIHJlbmRlcmVk IGVsZW1lbnQgdG8gYmUgdXBkYXRlZC4KKyAqCisgKiBUaGUgcmVuZGVyZWQgZWxlbWVudCB3aWxs IGJlIGluaXRpYWxpemVkIGFzIHVuY2hlY2tlZCAob3IgYGRlZmF1bHRDaGVja2VkYCkKKyAqIHdp dGggYW4gZW1wdHkgdmFsdWUgKG9yIGBkZWZhdWx0VmFsdWVgKS4KKyAqCisgKiBAc2VlIGh0dHA6 Ly93d3cudzMub3JnL1RSLzIwMTIvV0QtaHRtbDUtMjAxMjEwMjUvdGhlLWlucHV0LWVsZW1lbnQu aHRtbAorICovCit2YXIgUmVhY3RET01JbnB1dCA9IHsKKyAgZ2V0SG9zdFByb3BzOiBmdW5jdGlv biAoaW5zdCwgcHJvcHMpIHsKKyAgICB2YXIgdmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmdldFZh bHVlKHByb3BzKTsKKyAgICB2YXIgY2hlY2tlZCA9IExpbmtlZFZhbHVlVXRpbHMuZ2V0Q2hlY2tl ZChwcm9wcyk7CisKKyAgICB2YXIgaG9zdFByb3BzID0gX2Fzc2lnbih7CisgICAgICAvLyBNYWtl IHN1cmUgd2Ugc2V0IC50eXBlIGJlZm9yZSBhbnkgb3RoZXIgcHJvcGVydGllcyAoc2V0dGluZyAu dmFsdWUKKyAgICAgIC8vIGJlZm9yZSAudHlwZSBtZWFucyAudmFsdWUgaXMgbG9zdCBpbiBJRTEx IGFuZCBiZWxvdykKKyAgICAgIHR5cGU6IHVuZGVmaW5lZCwKKyAgICAgIC8vIE1ha2Ugc3VyZSB3 ZSBzZXQgLnN0ZXAgYmVmb3JlIC52YWx1ZSAoc2V0dGluZyAudmFsdWUgYmVmb3JlIC5zdGVwCisg ICAgICAvLyBtZWFucyAudmFsdWUgaXMgcm91bmRlZCBvbiBtb3VudCwgYmFzZWQgdXBvbiBzdGVw IHByZWNpc2lvbikKKyAgICAgIHN0ZXA6IHVuZGVmaW5lZCwKKyAgICAgIC8vIE1ha2Ugc3VyZSB3 ZSBzZXQgLm1pbiAmIC5tYXggYmVmb3JlIC52YWx1ZSAodG8gZW5zdXJlIHByb3BlciBvcmRlcgor ICAgICAgLy8gaW4gY29ybmVyIGNhc2VzIHN1Y2ggYXMgbWluIG9yIG1heCBkZXJpdmluZyBmcm9t IHZhbHVlLCBlLmcuIElzc3VlICM3MTcwKQorICAgICAgbWluOiB1bmRlZmluZWQsCisgICAgICBt YXg6IHVuZGVmaW5lZAorICAgIH0sIHByb3BzLCB7CisgICAgICBkZWZhdWx0Q2hlY2tlZDogdW5k ZWZpbmVkLAorICAgICAgZGVmYXVsdFZhbHVlOiB1bmRlZmluZWQsCisgICAgICB2YWx1ZTogdmFs dWUgIT0gbnVsbCA/IHZhbHVlIDogaW5zdC5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSwKKyAg ICAgIGNoZWNrZWQ6IGNoZWNrZWQgIT0gbnVsbCA/IGNoZWNrZWQgOiBpbnN0Ll93cmFwcGVyU3Rh dGUuaW5pdGlhbENoZWNrZWQsCisgICAgICBvbkNoYW5nZTogaW5zdC5fd3JhcHBlclN0YXRlLm9u Q2hhbmdlCisgICAgfSk7CisKKyAgICByZXR1cm4gaG9zdFByb3BzOworICB9LAorCisgIG1vdW50 V3JhcHBlcjogZnVuY3Rpb24gKGluc3QsIHByb3BzKSB7CisgICAgaWYgKCJkZXZlbG9wbWVudCIg IT09ICdwcm9kdWN0aW9uJykgeworICAgICAgTGlua2VkVmFsdWVVdGlscy5jaGVja1Byb3BUeXBl cygnaW5wdXQnLCBwcm9wcywgaW5zdC5fY3VycmVudEVsZW1lbnQuX293bmVyKTsKKworICAgICAg dmFyIG93bmVyID0gaW5zdC5fY3VycmVudEVsZW1lbnQuX293bmVyOworCisgICAgICBpZiAocHJv cHMudmFsdWVMaW5rICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZUxpbmspIHsKKyAgICAg ICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2B2YWx1 ZUxpbmtgIHByb3Agb24gYGlucHV0YCBpcyBkZXByZWNhdGVkOyBzZXQgYHZhbHVlYCBhbmQgYG9u Q2hhbmdlYCBpbnN0ZWFkLicpIDogdm9pZCAwOworICAgICAgICBkaWRXYXJuVmFsdWVMaW5rID0g dHJ1ZTsKKyAgICAgIH0KKyAgICAgIGlmIChwcm9wcy5jaGVja2VkTGluayAhPT0gdW5kZWZpbmVk ICYmICFkaWRXYXJuQ2hlY2tlZExpbmspIHsKKyAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3By b2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2BjaGVja2VkTGlua2AgcHJvcCBvbiBgaW5wdXRg IGlzIGRlcHJlY2F0ZWQ7IHNldCBgdmFsdWVgIGFuZCBgb25DaGFuZ2VgIGluc3RlYWQuJykgOiB2 b2lkIDA7CisgICAgICAgIGRpZFdhcm5DaGVja2VkTGluayA9IHRydWU7CisgICAgICB9CisgICAg ICBpZiAocHJvcHMuY2hlY2tlZCAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRDaGVja2Vk ICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5DaGVja2VkRGVmYXVsdENoZWNrZWQpIHsKKyAgICAg ICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJyVzIGNv bnRhaW5zIGFuIGlucHV0IG9mIHR5cGUgJXMgd2l0aCBib3RoIGNoZWNrZWQgYW5kIGRlZmF1bHRD aGVja2VkIHByb3BzLiAnICsgJ0lucHV0IGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xs ZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSBjaGVja2VkIHByb3As IG9yIHRoZSBkZWZhdWx0Q2hlY2tlZCBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBi ZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVt ZW50IGFuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6 Ly9mYi5tZS9yZWFjdC1jb250cm9sbGVkLWNvbXBvbmVudHMnLCBvd25lciAmJiBvd25lci5nZXRO YW1lKCkgfHwgJ0EgY29tcG9uZW50JywgcHJvcHMudHlwZSkgOiB2b2lkIDA7CisgICAgICAgIGRp ZFdhcm5DaGVja2VkRGVmYXVsdENoZWNrZWQgPSB0cnVlOworICAgICAgfQorICAgICAgaWYgKHBy b3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmlu ZWQgJiYgIWRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSkgeworICAgICAgICAiZGV2ZWxvcG1lbnQi ICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnJXMgY29udGFpbnMgYW4gaW5wdXQg b2YgdHlwZSAlcyB3aXRoIGJvdGggdmFsdWUgYW5kIGRlZmF1bHRWYWx1ZSBwcm9wcy4gJyArICdJ bnB1dCBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAn ICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBw cm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxl ZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGFuZCByZW1vdmUgb25lIG9mIHRo ZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9mYi5tZS9yZWFjdC1jb250cm9sbGVk LWNvbXBvbmVudHMnLCBvd25lciAmJiBvd25lci5nZXROYW1lKCkgfHwgJ0EgY29tcG9uZW50Jywg cHJvcHMudHlwZSkgOiB2b2lkIDA7CisgICAgICAgIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSA9 IHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRl ZmF1bHRWYWx1ZTsKKyAgICBpbnN0Ll93cmFwcGVyU3RhdGUgPSB7CisgICAgICBpbml0aWFsQ2hl Y2tlZDogcHJvcHMuY2hlY2tlZCAhPSBudWxsID8gcHJvcHMuY2hlY2tlZCA6IHByb3BzLmRlZmF1 bHRDaGVja2VkLAorICAgICAgaW5pdGlhbFZhbHVlOiBwcm9wcy52YWx1ZSAhPSBudWxsID8gcHJv cHMudmFsdWUgOiBkZWZhdWx0VmFsdWUsCisgICAgICBsaXN0ZW5lcnM6IG51bGwsCisgICAgICBv bkNoYW5nZTogX2hhbmRsZUNoYW5nZS5iaW5kKGluc3QpCisgICAgfTsKKworICAgIGlmICgiZGV2 ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIGluc3QuX3dyYXBwZXJTdGF0ZS5j b250cm9sbGVkID0gaXNDb250cm9sbGVkKHByb3BzKTsKKyAgICB9CisgIH0sCisKKyAgdXBkYXRl V3JhcHBlcjogZnVuY3Rpb24gKGluc3QpIHsKKyAgICB2YXIgcHJvcHMgPSBpbnN0Ll9jdXJyZW50 RWxlbWVudC5wcm9wczsKKworICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicp IHsKKyAgICAgIHZhciBjb250cm9sbGVkID0gaXNDb250cm9sbGVkKHByb3BzKTsKKyAgICAgIHZh ciBvd25lciA9IGluc3QuX2N1cnJlbnRFbGVtZW50Ll9vd25lcjsKKworICAgICAgaWYgKCFpbnN0 Ll93cmFwcGVyU3RhdGUuY29udHJvbGxlZCAmJiBjb250cm9sbGVkICYmICFkaWRXYXJuVW5jb250 cm9sbGVkVG9Db250cm9sbGVkKSB7CisgICAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0 aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclcyBpcyBjaGFuZ2luZyBhbiB1bmNvbnRyb2xsZWQgaW5w dXQgb2YgdHlwZSAlcyB0byBiZSBjb250cm9sbGVkLiAnICsgJ0lucHV0IGVsZW1lbnRzIHNob3Vs ZCBub3Qgc3dpdGNoIGZyb20gdW5jb250cm9sbGVkIHRvIGNvbnRyb2xsZWQgKG9yIHZpY2UgdmVy c2EpLiAnICsgJ0RlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xs ZWQgaW5wdXQgJyArICdlbGVtZW50IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBvbmVudC4g TW9yZSBpbmZvOiBodHRwczovL2ZiLm1lL3JlYWN0LWNvbnRyb2xsZWQtY29tcG9uZW50cycsIG93 bmVyICYmIG93bmVyLmdldE5hbWUoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKSA6IHZv aWQgMDsKKyAgICAgICAgZGlkV2FyblVuY29udHJvbGxlZFRvQ29udHJvbGxlZCA9IHRydWU7Cisg ICAgICB9CisgICAgICBpZiAoaW5zdC5fd3JhcHBlclN0YXRlLmNvbnRyb2xsZWQgJiYgIWNvbnRy b2xsZWQgJiYgIWRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQpIHsKKyAgICAgICAgImRl dmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJyVzIGlzIGNoYW5n aW5nIGEgY29udHJvbGxlZCBpbnB1dCBvZiB0eXBlICVzIHRvIGJlIHVuY29udHJvbGxlZC4gJyAr ICdJbnB1dCBlbGVtZW50cyBzaG91bGQgbm90IHN3aXRjaCBmcm9tIGNvbnRyb2xsZWQgdG8gdW5j b250cm9sbGVkIChvciB2aWNlIHZlcnNhKS4gJyArICdEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNv bnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBmb3IgdGhlIGxpZmV0 aW1lIG9mIHRoZSBjb21wb25lbnQuIE1vcmUgaW5mbzogaHR0cHM6Ly9mYi5tZS9yZWFjdC1jb250 cm9sbGVkLWNvbXBvbmVudHMnLCBvd25lciAmJiBvd25lci5nZXROYW1lKCkgfHwgJ0EgY29tcG9u ZW50JywgcHJvcHMudHlwZSkgOiB2b2lkIDA7CisgICAgICAgIGRpZFdhcm5Db250cm9sbGVkVG9V bmNvbnRyb2xsZWQgPSB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIC8vIFRPRE86IFNob3Vs ZG4ndCB0aGlzIGJlIGdldENoZWNrZWQocHJvcHMpPworICAgIHZhciBjaGVja2VkID0gcHJvcHMu Y2hlY2tlZDsKKyAgICBpZiAoY2hlY2tlZCAhPSBudWxsKSB7CisgICAgICBET01Qcm9wZXJ0eU9w ZXJhdGlvbnMuc2V0VmFsdWVGb3JQcm9wZXJ0eShSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9k ZUZyb21JbnN0YW5jZShpbnN0KSwgJ2NoZWNrZWQnLCBjaGVja2VkIHx8IGZhbHNlKTsKKyAgICB9 CisKKyAgICB2YXIgbm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3Rh bmNlKGluc3QpOworICAgIHZhciB2YWx1ZSA9IExpbmtlZFZhbHVlVXRpbHMuZ2V0VmFsdWUocHJv cHMpOworICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisKKyAgICAgIC8vIENhc3QgYHZhbHVlYCB0 byBhIHN0cmluZyB0byBlbnN1cmUgdGhlIHZhbHVlIGlzIHNldCBjb3JyZWN0bHkuIFdoaWxlCisg ICAgICAvLyBicm93c2VycyB0eXBpY2FsbHkgZG8gdGhpcyBhcyBuZWNlc3NhcnksIGpzZG9tIGRv ZXNuJ3QuCisgICAgICB2YXIgbmV3VmFsdWUgPSAnJyArIHZhbHVlOworCisgICAgICAvLyBUbyBh dm9pZCBzaWRlIGVmZmVjdHMgKHN1Y2ggYXMgbG9zaW5nIHRleHQgc2VsZWN0aW9uKSwgb25seSBz ZXQgdmFsdWUgaWYgY2hhbmdlZAorICAgICAgaWYgKG5ld1ZhbHVlICE9PSBub2RlLnZhbHVlKSB7 CisgICAgICAgIG5vZGUudmFsdWUgPSBuZXdWYWx1ZTsKKyAgICAgIH0KKyAgICB9IGVsc2Ugewor ICAgICAgaWYgKHByb3BzLnZhbHVlID09IG51bGwgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9IG51 bGwpIHsKKyAgICAgICAgLy8gSW4gQ2hyb21lLCBhc3NpZ25pbmcgZGVmYXVsdFZhbHVlIHRvIGNl cnRhaW4gaW5wdXQgdHlwZXMgdHJpZ2dlcnMgaW5wdXQgdmFsaWRhdGlvbi4KKyAgICAgICAgLy8g Rm9yIG51bWJlciBpbnB1dHMsIHRoZSBkaXNwbGF5IHZhbHVlIGxvc2VzIHRyYWlsaW5nIGRlY2lt YWwgcG9pbnRzLiBGb3IgZW1haWwgaW5wdXRzLAorICAgICAgICAvLyBDaHJvbWUgcmFpc2VzICJU aGUgc3BlY2lmaWVkIHZhbHVlIDx4PiBpcyBub3QgYSB2YWxpZCBlbWFpbCBhZGRyZXNzIi4KKyAg ICAgICAgLy8KKyAgICAgICAgLy8gSGVyZSB3ZSBjaGVjayB0byBzZWUgaWYgdGhlIGRlZmF1bHRW YWx1ZSBoYXMgYWN0dWFsbHkgY2hhbmdlZCwgYXZvaWRpbmcgdGhlc2UgcHJvYmxlbXMKKyAgICAg ICAgLy8gd2hlbiB0aGUgdXNlciBpcyBpbnB1dHRpbmcgdGV4dAorICAgICAgICAvLworICAgICAg ICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcyNTMKKyAgICAg ICAgaWYgKG5vZGUuZGVmYXVsdFZhbHVlICE9PSAnJyArIHByb3BzLmRlZmF1bHRWYWx1ZSkgewor ICAgICAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gJycgKyBwcm9wcy5kZWZhdWx0VmFsdWU7Cisg ICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChwcm9wcy5jaGVja2VkID09IG51bGwgJiYgcHJv cHMuZGVmYXVsdENoZWNrZWQgIT0gbnVsbCkgeworICAgICAgICBub2RlLmRlZmF1bHRDaGVja2Vk ID0gISFwcm9wcy5kZWZhdWx0Q2hlY2tlZDsKKyAgICAgIH0KKyAgICB9CisgIH0sCisKKyAgcG9z dE1vdW50V3JhcHBlcjogZnVuY3Rpb24gKGluc3QpIHsKKyAgICB2YXIgcHJvcHMgPSBpbnN0Ll9j dXJyZW50RWxlbWVudC5wcm9wczsKKworICAgIC8vIFRoaXMgaXMgaW4gcG9zdE1vdW50IGJlY2F1 c2Ugd2UgbmVlZCBhY2Nlc3MgdG8gdGhlIERPTSBub2RlLCB3aGljaCBpcyBub3QKKyAgICAvLyBh dmFpbGFibGUgdW50aWwgYWZ0ZXIgdGhlIGNvbXBvbmVudCBoYXMgbW91bnRlZC4KKyAgICB2YXIg bm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpOwor CisgICAgLy8gRGV0YWNoIHZhbHVlIGZyb20gZGVmYXVsdFZhbHVlLiBXZSB3b24ndCBkbyBhbnl0 aGluZyBpZiB3ZSdyZSB3b3JraW5nIG9uCisgICAgLy8gc3VibWl0IG9yIHJlc2V0IGlucHV0cyBh cyB0aG9zZSB2YWx1ZXMgJiBkZWZhdWx0VmFsdWVzIGFyZSBsaW5rZWQuIFRoZXkKKyAgICAvLyBh cmUgbm90IHJlc2V0YWJsZSBub2RlcyBzbyB0aGlzIG9wZXJhdGlvbiBkb2Vzbid0IG1hdHRlciBh bmQgYWN0dWFsbHkKKyAgICAvLyByZW1vdmVzIGJyb3dzZXItZGVmYXVsdCB2YWx1ZXMgKGVnICJT dWJtaXQgUXVlcnkiKSB3aGVuIG5vIHZhbHVlIGlzCisgICAgLy8gcHJvdmlkZWQuCisKKyAgICBz d2l0Y2ggKHByb3BzLnR5cGUpIHsKKyAgICAgIGNhc2UgJ3N1Ym1pdCc6CisgICAgICBjYXNlICdy ZXNldCc6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnY29sb3InOgorICAgICAgY2FzZSAn ZGF0ZSc6CisgICAgICBjYXNlICdkYXRldGltZSc6CisgICAgICBjYXNlICdkYXRldGltZS1sb2Nh bCc6CisgICAgICBjYXNlICdtb250aCc6CisgICAgICBjYXNlICd0aW1lJzoKKyAgICAgIGNhc2Ug J3dlZWsnOgorICAgICAgICAvLyBUaGlzIGZpeGVzIHRoZSBuby1zaG93IGlzc3VlIG9uIGlPUyBT YWZhcmkgYW5kIEFuZHJvaWQgQ2hyb21lOgorICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20v ZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcyMzMKKyAgICAgICAgbm9kZS52YWx1ZSA9ICcnOworICAg ICAgICBub2RlLnZhbHVlID0gbm9kZS5kZWZhdWx0VmFsdWU7CisgICAgICAgIGJyZWFrOworICAg ICAgZGVmYXVsdDoKKyAgICAgICAgbm9kZS52YWx1ZSA9IG5vZGUudmFsdWU7CisgICAgICAgIGJy ZWFrOworICAgIH0KKworICAgIC8vIE5vcm1hbGx5LCB3ZSdkIGp1c3QgZG8gYG5vZGUuY2hlY2tl ZCA9IG5vZGUuY2hlY2tlZGAgdXBvbiBpbml0aWFsIG1vdW50LCBsZXNzIHRoaXMgYnVnCisgICAg Ly8gdGhpcyBpcyBuZWVkZWQgdG8gd29yayBhcm91bmQgYSBjaHJvbWUgYnVnIHdoZXJlIHNldHRp bmcgZGVmYXVsdENoZWNrZWQKKyAgICAvLyB3aWxsIHNvbWV0aW1lcyBpbmZsdWVuY2UgdGhlIHZh bHVlIG9mIGNoZWNrZWQgKGV2ZW4gYWZ0ZXIgZGV0YWNobWVudCkuCisgICAgLy8gUmVmZXJlbmNl OiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD02 MDg0MTYKKyAgICAvLyBXZSBuZWVkIHRvIHRlbXBvcmFyaWx5IHVuc2V0IG5hbWUgdG8gYXZvaWQg ZGlzcnVwdGluZyByYWRpbyBidXR0b24gZ3JvdXBzLgorICAgIHZhciBuYW1lID0gbm9kZS5uYW1l OworICAgIGlmIChuYW1lICE9PSAnJykgeworICAgICAgbm9kZS5uYW1lID0gJyc7CisgICAgfQor ICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhbm9kZS5kZWZhdWx0Q2hlY2tlZDsKKyAgICBub2Rl LmRlZmF1bHRDaGVja2VkID0gIW5vZGUuZGVmYXVsdENoZWNrZWQ7CisgICAgaWYgKG5hbWUgIT09 ICcnKSB7CisgICAgICBub2RlLm5hbWUgPSBuYW1lOworICAgIH0KKyAgfQorfTsKKworZnVuY3Rp b24gX2hhbmRsZUNoYW5nZShldmVudCkgeworICB2YXIgcHJvcHMgPSB0aGlzLl9jdXJyZW50RWxl bWVudC5wcm9wczsKKworICB2YXIgcmV0dXJuVmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmV4ZWN1 dGVPbkNoYW5nZShwcm9wcywgZXZlbnQpOworCisgIC8vIEhlcmUgd2UgdXNlIGFzYXAgdG8gd2Fp dCB1bnRpbCBhbGwgdXBkYXRlcyBoYXZlIHByb3BhZ2F0ZWQsIHdoaWNoCisgIC8vIGlzIGltcG9y dGFudCB3aGVuIHVzaW5nIGNvbnRyb2xsZWQgY29tcG9uZW50cyB3aXRoaW4gbGF5ZXJzOgorICAv LyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE2OTgKKyAgUmVhY3RV cGRhdGVzLmFzYXAoZm9yY2VVcGRhdGVJZk1vdW50ZWQsIHRoaXMpOworCisgIHZhciBuYW1lID0g cHJvcHMubmFtZTsKKyAgaWYgKHByb3BzLnR5cGUgPT09ICdyYWRpbycgJiYgbmFtZSAhPSBudWxs KSB7CisgICAgdmFyIHJvb3ROb2RlID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9t SW5zdGFuY2UodGhpcyk7CisgICAgdmFyIHF1ZXJ5Um9vdCA9IHJvb3ROb2RlOworCisgICAgd2hp bGUgKHF1ZXJ5Um9vdC5wYXJlbnROb2RlKSB7CisgICAgICBxdWVyeVJvb3QgPSBxdWVyeVJvb3Qu cGFyZW50Tm9kZTsKKyAgICB9CisKKyAgICAvLyBJZiBgcm9vdE5vZGUuZm9ybWAgd2FzIG5vbi1u dWxsLCB0aGVuIHdlIGNvdWxkIHRyeSBgZm9ybS5lbGVtZW50c2AsCisgICAgLy8gYnV0IHRoYXQg c29tZXRpbWVzIGJlaGF2ZXMgc3RyYW5nZWx5IGluIElFOC4gV2UgY291bGQgYWxzbyB0cnkgdXNp bmcKKyAgICAvLyBgZm9ybS5nZXRFbGVtZW50c0J5TmFtZWAsIGJ1dCB0aGF0IHdpbGwgb25seSBy ZXR1cm4gZGlyZWN0IGNoaWxkcmVuCisgICAgLy8gYW5kIHdvbid0IGluY2x1ZGUgaW5wdXRzIHRo YXQgdXNlIHRoZSBIVE1MNSBgZm9ybT1gIGF0dHJpYnV0ZS4gU2luY2UKKyAgICAvLyB0aGUgaW5w dXQgbWlnaHQgbm90IGV2ZW4gYmUgaW4gYSBmb3JtLCBsZXQncyBqdXN0IHVzZSB0aGUgZ2xvYmFs CisgICAgLy8gYHF1ZXJ5U2VsZWN0b3JBbGxgIHRvIGVuc3VyZSB3ZSBkb24ndCBtaXNzIGFueXRo aW5nLgorICAgIHZhciBncm91cCA9IHF1ZXJ5Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtu YW1lPScgKyBKU09OLnN0cmluZ2lmeSgnJyArIG5hbWUpICsgJ11bdHlwZT0icmFkaW8iXScpOwor CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncm91cC5sZW5ndGg7IGkrKykgeworICAgICAgdmFy IG90aGVyTm9kZSA9IGdyb3VwW2ldOworICAgICAgaWYgKG90aGVyTm9kZSA9PT0gcm9vdE5vZGUg fHwgb3RoZXJOb2RlLmZvcm0gIT09IHJvb3ROb2RlLmZvcm0pIHsKKyAgICAgICAgY29udGludWU7 CisgICAgICB9CisgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgaWYgcmFkaW8gYnV0dG9ucyByZW5k ZXJlZCBieSBkaWZmZXJlbnQgY29waWVzIG9mIFJlYWN0CisgICAgICAvLyBhbmQgdGhlIHNhbWUg bmFtZSBhcmUgcmVuZGVyZWQgaW50byB0aGUgc2FtZSBmb3JtIChzYW1lIGFzICMxOTM5KS4KKyAg ICAgIC8vIFRoYXQncyBwcm9iYWJseSBva2F5OyB3ZSBkb24ndCBzdXBwb3J0IGl0IGp1c3QgYXMg d2UgZG9uJ3Qgc3VwcG9ydAorICAgICAgLy8gbWl4aW5nIFJlYWN0IHJhZGlvIGJ1dHRvbnMgd2l0 aCBub24tUmVhY3Qgb25lcy4KKyAgICAgIHZhciBvdGhlckluc3RhbmNlID0gUmVhY3RET01Db21w b25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUob3RoZXJOb2RlKTsKKyAgICAgICFvdGhlcklu c3RhbmNlID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNl LCAnUmVhY3RET01JbnB1dDogTWl4aW5nIFJlYWN0IGFuZCBub24tUmVhY3QgcmFkaW8gaW5wdXRz IHdpdGggdGhlIHNhbWUgYG5hbWVgIGlzIG5vdCBzdXBwb3J0ZWQuJykgOiBfcHJvZEludmFyaWFu dCgnOTAnKSA6IHZvaWQgMDsKKyAgICAgIC8vIElmIHRoaXMgaXMgYSBjb250cm9sbGVkIHJhZGlv IGJ1dHRvbiBncm91cCwgZm9yY2luZyB0aGUgaW5wdXQgdGhhdAorICAgICAgLy8gd2FzIHByZXZp b3VzbHkgY2hlY2tlZCB0byB1cGRhdGUgd2lsbCBjYXVzZSBpdCB0byBiZSBjb21lIHJlLWNoZWNr ZWQKKyAgICAgIC8vIGFzIGFwcHJvcHJpYXRlLgorICAgICAgUmVhY3RVcGRhdGVzLmFzYXAoZm9y Y2VVcGRhdGVJZk1vdW50ZWQsIG90aGVySW5zdGFuY2UpOworICAgIH0KKyAgfQorCisgIHJldHVy biByZXR1cm5WYWx1ZTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTUlucHV0OworfSx7 IjEyIjoxMiwiMTI1IjoxMjUsIjE1MCI6MTUwLCIxNTciOjE1NywiMTU4IjoxNTgsIjI0IjoyNCwi MzQiOjM0LCI4MiI6ODJ9XSw0MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7Cisv KioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmln aHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIg dGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRo ZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50 CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGlu IHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgRE9N UHJvcGVydHkgPSBfZGVyZXFfKDExKTsKK3ZhciBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gX2Rl cmVxXygxMzIpOworCit2YXIgd2FybmluZyA9IF9kZXJlcV8oMTU3KTsKKwordmFyIHdhcm5lZFBy b3BlcnRpZXMgPSB7fTsKK3ZhciByQVJJQSA9IG5ldyBSZWdFeHAoJ14oYXJpYSktWycgKyBET01Q cm9wZXJ0eS5BVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpOworCitmdW5jdGlvbiB2YWxpZGF0 ZVByb3BlcnR5KHRhZ05hbWUsIG5hbWUsIGRlYnVnSUQpIHsKKyAgaWYgKHdhcm5lZFByb3BlcnRp ZXMuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgd2FybmVkUHJvcGVydGllc1tuYW1lXSkgeworICAg IHJldHVybiB0cnVlOworICB9CisKKyAgaWYgKHJBUklBLnRlc3QobmFtZSkpIHsKKyAgICB2YXIg bG93ZXJDYXNlZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgdmFyIHN0YW5kYXJkTmFt ZSA9IERPTVByb3BlcnR5LmdldFBvc3NpYmxlU3RhbmRhcmROYW1lLmhhc093blByb3BlcnR5KGxv d2VyQ2FzZWROYW1lKSA/IERPTVByb3BlcnR5LmdldFBvc3NpYmxlU3RhbmRhcmROYW1lW2xvd2Vy Q2FzZWROYW1lXSA6IG51bGw7CisKKyAgICAvLyBJZiB0aGlzIGlzIGFuIGFyaWEtKiBhdHRyaWJ1 dGUsIGJ1dCBpcyBub3QgbGlzdGVkIGluIHRoZSBrbm93biBET00KKyAgICAvLyBET00gcHJvcGVy dGllcywgdGhlbiBpdCBpcyBhbiBpbnZhbGlkIGFyaWEtKiBhdHRyaWJ1dGUuCisgICAgaWYgKHN0 YW5kYXJkTmFtZSA9PSBudWxsKSB7CisgICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1 ZTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gYXJpYS0qIGF0dHJpYnV0ZXMg c2hvdWxkIGJlIGxvd2VyY2FzZTsgc3VnZ2VzdCB0aGUgbG93ZXJjYXNlIHZlcnNpb24uCisgICAg aWYgKG5hbWUgIT09IHN0YW5kYXJkTmFtZSkgeworICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3By b2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1Vua25vd24gQVJJQSBhdHRyaWJ1dGUgJXMuIERp ZCB5b3UgbWVhbiAlcz8lcycsIG5hbWUsIHN0YW5kYXJkTmFtZSwgUmVhY3RDb21wb25lbnRUcmVl SG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChkZWJ1Z0lEKSkgOiB2b2lkIDA7CisgICAgICB3YXJu ZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAg fQorCisgIHJldHVybiB0cnVlOworfQorCitmdW5jdGlvbiB3YXJuSW52YWxpZEFSSUFQcm9wcyhk ZWJ1Z0lELCBlbGVtZW50KSB7CisgIHZhciBpbnZhbGlkUHJvcHMgPSBbXTsKKworICBmb3IgKHZh ciBrZXkgaW4gZWxlbWVudC5wcm9wcykgeworICAgIHZhciBpc1ZhbGlkID0gdmFsaWRhdGVQcm9w ZXJ0eShlbGVtZW50LnR5cGUsIGtleSwgZGVidWdJRCk7CisgICAgaWYgKCFpc1ZhbGlkKSB7Cisg ICAgICBpbnZhbGlkUHJvcHMucHVzaChrZXkpOworICAgIH0KKyAgfQorCisgIHZhciB1bmtub3du UHJvcFN0cmluZyA9IGludmFsaWRQcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHsKKyAgICByZXR1 cm4gJ2AnICsgcHJvcCArICdgJzsKKyAgfSkuam9pbignLCAnKTsKKworICBpZiAoaW52YWxpZFBy b3BzLmxlbmd0aCA9PT0gMSkgeworICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/ IHdhcm5pbmcoZmFsc2UsICdJbnZhbGlkIGFyaWEgcHJvcCAlcyBvbiA8JXM+IHRhZy4gJyArICdG b3IgZGV0YWlscywgc2VlIGh0dHBzOi8vZmIubWUvaW52YWxpZC1hcmlhLXByb3AlcycsIHVua25v d25Qcm9wU3RyaW5nLCBlbGVtZW50LnR5cGUsIFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0U3Rh Y2tBZGRlbmR1bUJ5SUQoZGVidWdJRCkpIDogdm9pZCAwOworICB9IGVsc2UgaWYgKGludmFsaWRQ cm9wcy5sZW5ndGggPiAxKSB7CisgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8g d2FybmluZyhmYWxzZSwgJ0ludmFsaWQgYXJpYSBwcm9wcyAlcyBvbiA8JXM+IHRhZy4gJyArICdG b3IgZGV0YWlscywgc2VlIGh0dHBzOi8vZmIubWUvaW52YWxpZC1hcmlhLXByb3AlcycsIHVua25v d25Qcm9wU3RyaW5nLCBlbGVtZW50LnR5cGUsIFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0U3Rh Y2tBZGRlbmR1bUJ5SUQoZGVidWdJRCkpIDogdm9pZCAwOworICB9Cit9CisKK2Z1bmN0aW9uIGhh bmRsZUVsZW1lbnQoZGVidWdJRCwgZWxlbWVudCkgeworICBpZiAoZWxlbWVudCA9PSBudWxsIHx8 IHR5cGVvZiBlbGVtZW50LnR5cGUgIT09ICdzdHJpbmcnKSB7CisgICAgcmV0dXJuOworICB9Cisg IGlmIChlbGVtZW50LnR5cGUuaW5kZXhPZignLScpID49IDAgfHwgZWxlbWVudC5wcm9wcy5pcykg eworICAgIHJldHVybjsKKyAgfQorCisgIHdhcm5JbnZhbGlkQVJJQVByb3BzKGRlYnVnSUQsIGVs ZW1lbnQpOworfQorCit2YXIgUmVhY3RET01JbnZhbGlkQVJJQUhvb2sgPSB7CisgIG9uQmVmb3Jl TW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChkZWJ1Z0lELCBlbGVtZW50KSB7CisgICAgaWYgKCJk ZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgaGFuZGxlRWxlbWVudChkZWJ1 Z0lELCBlbGVtZW50KTsKKyAgICB9CisgIH0sCisgIG9uQmVmb3JlVXBkYXRlQ29tcG9uZW50OiBm dW5jdGlvbiAoZGVidWdJRCwgZWxlbWVudCkgeworICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAn cHJvZHVjdGlvbicpIHsKKyAgICAgIGhhbmRsZUVsZW1lbnQoZGVidWdJRCwgZWxlbWVudCk7Cisg ICAgfQorICB9Cit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NSW52YWxpZEFSSUFIb29r OworfSx7IjExIjoxMSwiMTMyIjoxMzIsIjE1NyI6MTU3fV0sNDE6W2Z1bmN0aW9uKF9kZXJlcV8s bW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9v aywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2Rl IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAq IExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4g QW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4g dGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ug c3RyaWN0JzsKKwordmFyIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSBfZGVyZXFfKDEzMik7CisK K3ZhciB3YXJuaW5nID0gX2RlcmVxXygxNTcpOworCit2YXIgZGlkV2FyblZhbHVlTnVsbCA9IGZh bHNlOworCitmdW5jdGlvbiBoYW5kbGVFbGVtZW50KGRlYnVnSUQsIGVsZW1lbnQpIHsKKyAgaWYg KGVsZW1lbnQgPT0gbnVsbCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoZWxlbWVudC50eXBl ICE9PSAnaW5wdXQnICYmIGVsZW1lbnQudHlwZSAhPT0gJ3RleHRhcmVhJyAmJiBlbGVtZW50LnR5 cGUgIT09ICdzZWxlY3QnKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChlbGVtZW50LnByb3Bz ICE9IG51bGwgJiYgZWxlbWVudC5wcm9wcy52YWx1ZSA9PT0gbnVsbCAmJiAhZGlkV2FyblZhbHVl TnVsbCkgeworICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFs c2UsICdgdmFsdWVgIHByb3Agb24gYCVzYCBzaG91bGQgbm90IGJlIG51bGwuICcgKyAnQ29uc2lk ZXIgdXNpbmcgdGhlIGVtcHR5IHN0cmluZyB0byBjbGVhciB0aGUgY29tcG9uZW50IG9yIGB1bmRl ZmluZWRgICcgKyAnZm9yIHVuY29udHJvbGxlZCBjb21wb25lbnRzLiVzJywgZWxlbWVudC50eXBl LCBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKGRlYnVnSUQpKSA6 IHZvaWQgMDsKKworICAgIGRpZFdhcm5WYWx1ZU51bGwgPSB0cnVlOworICB9Cit9CisKK3ZhciBS ZWFjdERPTU51bGxJbnB1dFZhbHVlUHJvcEhvb2sgPSB7CisgIG9uQmVmb3JlTW91bnRDb21wb25l bnQ6IGZ1bmN0aW9uIChkZWJ1Z0lELCBlbGVtZW50KSB7CisgICAgaGFuZGxlRWxlbWVudChkZWJ1 Z0lELCBlbGVtZW50KTsKKyAgfSwKKyAgb25CZWZvcmVVcGRhdGVDb21wb25lbnQ6IGZ1bmN0aW9u IChkZWJ1Z0lELCBlbGVtZW50KSB7CisgICAgaGFuZGxlRWxlbWVudChkZWJ1Z0lELCBlbGVtZW50 KTsKKyAgfQorfTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTU51bGxJbnB1dFZhbHVlUHJv cEhvb2s7Cit9LHsiMTMyIjoxMzIsIjE1NyI6MTU3fV0sNDI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9k dWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywg SW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlz IGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJ Q0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4g YWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhl IFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3Ry aWN0JzsKKwordmFyIF9hc3NpZ24gPSBfZGVyZXFfKDE1OCk7CisKK3ZhciBSZWFjdCA9IF9kZXJl cV8oMTM0KTsKK3ZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSBfZGVyZXFfKDM0KTsKK3ZhciBS ZWFjdERPTVNlbGVjdCA9IF9kZXJlcV8oNDMpOworCit2YXIgd2FybmluZyA9IF9kZXJlcV8oMTU3 KTsKK3ZhciBkaWRXYXJuSW52YWxpZE9wdGlvbkNoaWxkcmVuID0gZmFsc2U7CisKK2Z1bmN0aW9u IGZsYXR0ZW5DaGlsZHJlbihjaGlsZHJlbikgeworICB2YXIgY29udGVudCA9ICcnOworCisgIC8v IEZsYXR0ZW4gY2hpbGRyZW4gYW5kIHdhcm4gaWYgdGhleSBhcmVuJ3Qgc3RyaW5ncyBvciBudW1i ZXJzOworICAvLyBpbnZhbGlkIHR5cGVzIGFyZSBpZ25vcmVkLgorICBSZWFjdC5DaGlsZHJlbi5m b3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHsKKyAgICBpZiAoY2hpbGQgPT0gbnVs bCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAodHlwZW9mIGNoaWxkID09PSAnc3Ry aW5nJyB8fCB0eXBlb2YgY2hpbGQgPT09ICdudW1iZXInKSB7CisgICAgICBjb250ZW50ICs9IGNo aWxkOworICAgIH0gZWxzZSBpZiAoIWRpZFdhcm5JbnZhbGlkT3B0aW9uQ2hpbGRyZW4pIHsKKyAg ICAgIGRpZFdhcm5JbnZhbGlkT3B0aW9uQ2hpbGRyZW4gPSB0cnVlOworICAgICAgImRldmVsb3Bt ZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ09ubHkgc3RyaW5ncyBhbmQg bnVtYmVycyBhcmUgc3VwcG9ydGVkIGFzIDxvcHRpb24+IGNoaWxkcmVuLicpIDogdm9pZCAwOwor ICAgIH0KKyAgfSk7CisKKyAgcmV0dXJuIGNvbnRlbnQ7Cit9CisKKy8qKgorICogSW1wbGVtZW50 cyBhbiA8b3B0aW9uPiBob3N0IGNvbXBvbmVudCB0aGF0IHdhcm5zIHdoZW4gYHNlbGVjdGVkYCBp cyBzZXQuCisgKi8KK3ZhciBSZWFjdERPTU9wdGlvbiA9IHsKKyAgbW91bnRXcmFwcGVyOiBmdW5j dGlvbiAoaW5zdCwgcHJvcHMsIGhvc3RQYXJlbnQpIHsKKyAgICAvLyBUT0RPICh5dW5nc3RlcnMp OiBSZW1vdmUgc3VwcG9ydCBmb3IgYHNlbGVjdGVkYCBpbiA8b3B0aW9uPi4KKyAgICBpZiAoImRl dmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAiZGV2ZWxvcG1lbnQiICE9PSAn cHJvZHVjdGlvbicgPyB3YXJuaW5nKHByb3BzLnNlbGVjdGVkID09IG51bGwsICdVc2UgdGhlIGBk ZWZhdWx0VmFsdWVgIG9yIGB2YWx1ZWAgcHJvcHMgb24gPHNlbGVjdD4gaW5zdGVhZCBvZiAnICsg J3NldHRpbmcgYHNlbGVjdGVkYCBvbiA8b3B0aW9uPi4nKSA6IHZvaWQgMDsKKyAgICB9CisKKyAg ICAvLyBMb29rIHVwIHdoZXRoZXIgdGhpcyBvcHRpb24gaXMgJ3NlbGVjdGVkJworICAgIHZhciBz ZWxlY3RWYWx1ZSA9IG51bGw7CisgICAgaWYgKGhvc3RQYXJlbnQgIT0gbnVsbCkgeworICAgICAg dmFyIHNlbGVjdFBhcmVudCA9IGhvc3RQYXJlbnQ7CisKKyAgICAgIGlmIChzZWxlY3RQYXJlbnQu X3RhZyA9PT0gJ29wdGdyb3VwJykgeworICAgICAgICBzZWxlY3RQYXJlbnQgPSBzZWxlY3RQYXJl bnQuX2hvc3RQYXJlbnQ7CisgICAgICB9CisKKyAgICAgIGlmIChzZWxlY3RQYXJlbnQgIT0gbnVs bCAmJiBzZWxlY3RQYXJlbnQuX3RhZyA9PT0gJ3NlbGVjdCcpIHsKKyAgICAgICAgc2VsZWN0VmFs dWUgPSBSZWFjdERPTVNlbGVjdC5nZXRTZWxlY3RWYWx1ZUNvbnRleHQoc2VsZWN0UGFyZW50KTsK KyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB0aGUgdmFsdWUgaXMgbnVsbCAoZS5nLiwgbm8g c3BlY2lmaWVkIHZhbHVlIG9yIGFmdGVyIGluaXRpYWwgbW91bnQpCisgICAgLy8gb3IgbWlzc2lu ZyAoZS5nLiwgZm9yIDxkYXRhbGlzdD4pLCB3ZSBkb24ndCBjaGFuZ2UgcHJvcHMuc2VsZWN0ZWQK KyAgICB2YXIgc2VsZWN0ZWQgPSBudWxsOworICAgIGlmIChzZWxlY3RWYWx1ZSAhPSBudWxsKSB7 CisgICAgICB2YXIgdmFsdWU7CisgICAgICBpZiAocHJvcHMudmFsdWUgIT0gbnVsbCkgeworICAg ICAgICB2YWx1ZSA9IHByb3BzLnZhbHVlICsgJyc7CisgICAgICB9IGVsc2UgeworICAgICAgICB2 YWx1ZSA9IGZsYXR0ZW5DaGlsZHJlbihwcm9wcy5jaGlsZHJlbik7CisgICAgICB9CisgICAgICBz ZWxlY3RlZCA9IGZhbHNlOworICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VsZWN0VmFsdWUpKSB7 CisgICAgICAgIC8vIG11bHRpcGxlCisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0 VmFsdWUubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBpZiAoJycgKyBzZWxlY3RWYWx1ZVtpXSA9 PT0gdmFsdWUpIHsKKyAgICAgICAgICAgIHNlbGVjdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJy ZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2Vs ZWN0ZWQgPSAnJyArIHNlbGVjdFZhbHVlID09PSB2YWx1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAg ICBpbnN0Ll93cmFwcGVyU3RhdGUgPSB7IHNlbGVjdGVkOiBzZWxlY3RlZCB9OworICB9LAorCisg IHBvc3RNb3VudFdyYXBwZXI6IGZ1bmN0aW9uIChpbnN0KSB7CisgICAgLy8gdmFsdWU9IiIgc2hv dWxkIG1ha2UgYSB2YWx1ZSBhdHRyaWJ1dGUgKCM2MjE5KQorICAgIHZhciBwcm9wcyA9IGluc3Qu X2N1cnJlbnRFbGVtZW50LnByb3BzOworICAgIGlmIChwcm9wcy52YWx1ZSAhPSBudWxsKSB7Cisg ICAgICB2YXIgbm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNl KGluc3QpOworICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgcHJvcHMudmFsdWUpOwor ICAgIH0KKyAgfSwKKworICBnZXRIb3N0UHJvcHM6IGZ1bmN0aW9uIChpbnN0LCBwcm9wcykgewor ICAgIHZhciBob3N0UHJvcHMgPSBfYXNzaWduKHsgc2VsZWN0ZWQ6IHVuZGVmaW5lZCwgY2hpbGRy ZW46IHVuZGVmaW5lZCB9LCBwcm9wcyk7CisKKyAgICAvLyBSZWFkIHN0YXRlIG9ubHkgZnJvbSBp bml0aWFsIG1vdW50IGJlY2F1c2UgPHNlbGVjdD4gdXBkYXRlcyB2YWx1ZQorICAgIC8vIG1hbnVh bGx5OyB3ZSBuZWVkIHRoZSBpbml0aWFsIHN0YXRlIG9ubHkgZm9yIHNlcnZlciByZW5kZXJpbmcK KyAgICBpZiAoaW5zdC5fd3JhcHBlclN0YXRlLnNlbGVjdGVkICE9IG51bGwpIHsKKyAgICAgIGhv c3RQcm9wcy5zZWxlY3RlZCA9IGluc3QuX3dyYXBwZXJTdGF0ZS5zZWxlY3RlZDsKKyAgICB9CisK KyAgICB2YXIgY29udGVudCA9IGZsYXR0ZW5DaGlsZHJlbihwcm9wcy5jaGlsZHJlbik7CisKKyAg ICBpZiAoY29udGVudCkgeworICAgICAgaG9zdFByb3BzLmNoaWxkcmVuID0gY29udGVudDsKKyAg ICB9CisKKyAgICByZXR1cm4gaG9zdFByb3BzOworICB9CisKK307CisKK21vZHVsZS5leHBvcnRz ID0gUmVhY3RET01PcHRpb247Cit9LHsiMTM0IjoxMzQsIjE1NyI6MTU3LCIxNTgiOjE1OCwiMzQi OjM0LCI0MyI6NDN9XSw0MzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioK KyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRz IHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhl IEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSBy b290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50Cisg KiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRo ZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX2Fzc2ln biA9IF9kZXJlcV8oMTU4KTsKKwordmFyIExpbmtlZFZhbHVlVXRpbHMgPSBfZGVyZXFfKDI0KTsK K3ZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSBfZGVyZXFfKDM0KTsKK3ZhciBSZWFjdFVwZGF0 ZXMgPSBfZGVyZXFfKDgyKTsKKwordmFyIHdhcm5pbmcgPSBfZGVyZXFfKDE1Nyk7CisKK3ZhciBk aWRXYXJuVmFsdWVMaW5rID0gZmFsc2U7Cit2YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0g ZmFsc2U7CisKK2Z1bmN0aW9uIHVwZGF0ZU9wdGlvbnNJZlBlbmRpbmdVcGRhdGVBbmRNb3VudGVk KCkgeworICBpZiAodGhpcy5fcm9vdE5vZGVJRCAmJiB0aGlzLl93cmFwcGVyU3RhdGUucGVuZGlu Z1VwZGF0ZSkgeworICAgIHRoaXMuX3dyYXBwZXJTdGF0ZS5wZW5kaW5nVXBkYXRlID0gZmFsc2U7 CisKKyAgICB2YXIgcHJvcHMgPSB0aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wczsKKyAgICB2YXIg dmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmdldFZhbHVlKHByb3BzKTsKKworICAgIGlmICh2YWx1 ZSAhPSBudWxsKSB7CisgICAgICB1cGRhdGVPcHRpb25zKHRoaXMsIEJvb2xlYW4ocHJvcHMubXVs dGlwbGUpLCB2YWx1ZSk7CisgICAgfQorICB9Cit9CisKK2Z1bmN0aW9uIGdldERlY2xhcmF0aW9u RXJyb3JBZGRlbmR1bShvd25lcikgeworICBpZiAob3duZXIpIHsKKyAgICB2YXIgbmFtZSA9IG93 bmVyLmdldE5hbWUoKTsKKyAgICBpZiAobmFtZSkgeworICAgICAgcmV0dXJuICcgQ2hlY2sgdGhl IHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJzsKKyAgICB9CisgIH0KKyAgcmV0dXJu ICcnOworfQorCit2YXIgdmFsdWVQcm9wTmFtZXMgPSBbJ3ZhbHVlJywgJ2RlZmF1bHRWYWx1ZSdd OworCisvKioKKyAqIFZhbGlkYXRpb24gZnVuY3Rpb24gZm9yIGB2YWx1ZWAgYW5kIGBkZWZhdWx0 VmFsdWVgLgorICogQHByaXZhdGUKKyAqLworZnVuY3Rpb24gY2hlY2tTZWxlY3RQcm9wVHlwZXMo aW5zdCwgcHJvcHMpIHsKKyAgdmFyIG93bmVyID0gaW5zdC5fY3VycmVudEVsZW1lbnQuX293bmVy OworICBMaW5rZWRWYWx1ZVV0aWxzLmNoZWNrUHJvcFR5cGVzKCdzZWxlY3QnLCBwcm9wcywgb3du ZXIpOworCisgIGlmIChwcm9wcy52YWx1ZUxpbmsgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZh bHVlTGluaykgeworICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmco ZmFsc2UsICdgdmFsdWVMaW5rYCBwcm9wIG9uIGBzZWxlY3RgIGlzIGRlcHJlY2F0ZWQ7IHNldCBg dmFsdWVgIGFuZCBgb25DaGFuZ2VgIGluc3RlYWQuJykgOiB2b2lkIDA7CisgICAgZGlkV2FyblZh bHVlTGluayA9IHRydWU7CisgIH0KKworICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlUHJvcE5h bWVzLmxlbmd0aDsgaSsrKSB7CisgICAgdmFyIHByb3BOYW1lID0gdmFsdWVQcm9wTmFtZXNbaV07 CisgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7CisgICAgICBjb250aW51ZTsKKyAg ICB9CisgICAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KHByb3BzW3Byb3BOYW1lXSk7Cisg ICAgaWYgKHByb3BzLm11bHRpcGxlICYmICFpc0FycmF5KSB7CisgICAgICAiZGV2ZWxvcG1lbnQi ICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnVGhlIGAlc2AgcHJvcCBzdXBwbGll ZCB0byA8c2VsZWN0PiBtdXN0IGJlIGFuIGFycmF5IGlmICcgKyAnYG11bHRpcGxlYCBpcyB0cnVl LiVzJywgcHJvcE5hbWUsIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShvd25lcikpIDogdm9p ZCAwOworICAgIH0gZWxzZSBpZiAoIXByb3BzLm11bHRpcGxlICYmIGlzQXJyYXkpIHsKKyAgICAg ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdUaGUgYCVz YCBwcm9wIHN1cHBsaWVkIHRvIDxzZWxlY3Q+IG11c3QgYmUgYSBzY2FsYXIgJyArICd2YWx1ZSBp ZiBgbXVsdGlwbGVgIGlzIGZhbHNlLiVzJywgcHJvcE5hbWUsIGdldERlY2xhcmF0aW9uRXJyb3JB ZGRlbmR1bShvd25lcikpIDogdm9pZCAwOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIEBwYXJh bSB7UmVhY3RET01Db21wb25lbnR9IGluc3QKKyAqIEBwYXJhbSB7Ym9vbGVhbn0gbXVsdGlwbGUK KyAqIEBwYXJhbSB7Kn0gcHJvcFZhbHVlIEEgc3RyaW5nYWJsZSAod2l0aCBgbXVsdGlwbGVgLCBh IGxpc3Qgb2Ygc3RyaW5nYWJsZXMpLgorICogQHByaXZhdGUKKyAqLworZnVuY3Rpb24gdXBkYXRl T3B0aW9ucyhpbnN0LCBtdWx0aXBsZSwgcHJvcFZhbHVlKSB7CisgIHZhciBzZWxlY3RlZFZhbHVl LCBpOworICB2YXIgb3B0aW9ucyA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUlu c3RhbmNlKGluc3QpLm9wdGlvbnM7CisKKyAgaWYgKG11bHRpcGxlKSB7CisgICAgc2VsZWN0ZWRW YWx1ZSA9IHt9OworICAgIGZvciAoaSA9IDA7IGkgPCBwcm9wVmFsdWUubGVuZ3RoOyBpKyspIHsK KyAgICAgIHNlbGVjdGVkVmFsdWVbJycgKyBwcm9wVmFsdWVbaV1dID0gdHJ1ZTsKKyAgICB9Cisg ICAgZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciBzZWxl Y3RlZCA9IHNlbGVjdGVkVmFsdWUuaGFzT3duUHJvcGVydHkob3B0aW9uc1tpXS52YWx1ZSk7Cisg ICAgICBpZiAob3B0aW9uc1tpXS5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHsKKyAgICAgICAgb3B0 aW9uc1tpXS5zZWxlY3RlZCA9IHNlbGVjdGVkOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsK KyAgICAvLyBEbyBub3Qgc2V0IGBzZWxlY3QudmFsdWVgIGFzIGV4YWN0IGJlaGF2aW9yIGlzbid0 IGNvbnNpc3RlbnQgYWNyb3NzIGFsbAorICAgIC8vIGJyb3dzZXJzIGZvciBhbGwgY2FzZXMuCisg ICAgc2VsZWN0ZWRWYWx1ZSA9ICcnICsgcHJvcFZhbHVlOworICAgIGZvciAoaSA9IDA7IGkgPCBv cHRpb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICBpZiAob3B0aW9uc1tpXS52YWx1ZSA9PT0gc2Vs ZWN0ZWRWYWx1ZSkgeworICAgICAgICBvcHRpb25zW2ldLnNlbGVjdGVkID0gdHJ1ZTsKKyAgICAg ICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgICBpZiAob3B0aW9ucy5sZW5ndGgpIHsKKyAg ICAgIG9wdGlvbnNbMF0uc2VsZWN0ZWQgPSB0cnVlOworICAgIH0KKyAgfQorfQorCisvKioKKyAq IEltcGxlbWVudHMgYSA8c2VsZWN0PiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBvcHRpb25h bGx5IHNldHRpbmcgdGhlCisgKiBwcm9wcyBgdmFsdWVgIGFuZCBgZGVmYXVsdFZhbHVlYC4gSWYg YG11bHRpcGxlYCBpcyBmYWxzZSwgdGhlIHByb3AgbXVzdCBiZSBhCisgKiBzdHJpbmdhYmxlLiBJ ZiBgbXVsdGlwbGVgIGlzIHRydWUsIHRoZSBwcm9wIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5n YWJsZXMuCisgKgorICogSWYgYHZhbHVlYCBpcyBub3Qgc3VwcGxpZWQgKG9yIG51bGwvdW5kZWZp bmVkKSwgdXNlciBhY3Rpb25zIHRoYXQgY2hhbmdlIHRoZQorICogc2VsZWN0ZWQgb3B0aW9uIHdp bGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSByZW5kZXJlZCBvcHRpb25zLgorICoKKyAqIElmIGl0 IGlzIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIG9wdGlv bnMgd2lsbCBub3QKKyAqIHVwZGF0ZSBpbiByZXNwb25zZSB0byB1c2VyIGFjdGlvbnMuIEluc3Rl YWQsIHRoZSBgdmFsdWVgIHByb3AgbXVzdCBjaGFuZ2UgaW4KKyAqIG9yZGVyIGZvciB0aGUgcmVu ZGVyZWQgb3B0aW9ucyB0byB1cGRhdGUuCisgKgorICogSWYgYGRlZmF1bHRWYWx1ZWAgaXMgcHJv dmlkZWQsIGFueSBvcHRpb25zIHdpdGggdGhlIHN1cHBsaWVkIHZhbHVlcyB3aWxsIGJlCisgKiBz ZWxlY3RlZC4KKyAqLwordmFyIFJlYWN0RE9NU2VsZWN0ID0geworICBnZXRIb3N0UHJvcHM6IGZ1 bmN0aW9uIChpbnN0LCBwcm9wcykgeworICAgIHJldHVybiBfYXNzaWduKHt9LCBwcm9wcywgewor ICAgICAgb25DaGFuZ2U6IGluc3QuX3dyYXBwZXJTdGF0ZS5vbkNoYW5nZSwKKyAgICAgIHZhbHVl OiB1bmRlZmluZWQKKyAgICB9KTsKKyAgfSwKKworICBtb3VudFdyYXBwZXI6IGZ1bmN0aW9uIChp bnN0LCBwcm9wcykgeworICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsK KyAgICAgIGNoZWNrU2VsZWN0UHJvcFR5cGVzKGluc3QsIHByb3BzKTsKKyAgICB9CisKKyAgICB2 YXIgdmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmdldFZhbHVlKHByb3BzKTsKKyAgICBpbnN0Ll93 cmFwcGVyU3RhdGUgPSB7CisgICAgICBwZW5kaW5nVXBkYXRlOiBmYWxzZSwKKyAgICAgIGluaXRp YWxWYWx1ZTogdmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogcHJvcHMuZGVmYXVsdFZhbHVlLAorICAg ICAgbGlzdGVuZXJzOiBudWxsLAorICAgICAgb25DaGFuZ2U6IF9oYW5kbGVDaGFuZ2UuYmluZChp bnN0KSwKKyAgICAgIHdhc011bHRpcGxlOiBCb29sZWFuKHByb3BzLm11bHRpcGxlKQorICAgIH07 CisKKyAgICBpZiAocHJvcHMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0VmFs dWUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlKSB7CisgICAgICAi ZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnU2VsZWN0IGVs ZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNw ZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1 dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVu Y29udHJvbGxlZCBzZWxlY3QgJyArICdlbGVtZW50IGFuZCByZW1vdmUgb25lIG9mIHRoZXNlIHBy b3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9mYi5tZS9yZWFjdC1jb250cm9sbGVkLWNvbXBv bmVudHMnKSA6IHZvaWQgMDsKKyAgICAgIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSA9IHRydWU7 CisgICAgfQorICB9LAorCisgIGdldFNlbGVjdFZhbHVlQ29udGV4dDogZnVuY3Rpb24gKGluc3Qp IHsKKyAgICAvLyBSZWFjdERPTU9wdGlvbiBsb29rcyBhdCB0aGlzIGluaXRpYWwgdmFsdWUgc28g dGhlIGluaXRpYWwgZ2VuZXJhdGVkCisgICAgLy8gbWFya3VwIGhhcyBjb3JyZWN0IGBzZWxlY3Rl ZGAgYXR0cmlidXRlcworICAgIHJldHVybiBpbnN0Ll93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVl OworICB9LAorCisgIHBvc3RVcGRhdGVXcmFwcGVyOiBmdW5jdGlvbiAoaW5zdCkgeworICAgIHZh ciBwcm9wcyA9IGluc3QuX2N1cnJlbnRFbGVtZW50LnByb3BzOworCisgICAgLy8gQWZ0ZXIgdGhl IGluaXRpYWwgbW91bnQsIHdlIGNvbnRyb2wgc2VsZWN0ZWQtbmVzcyBtYW51YWxseSBzbyBkb24n dCBwYXNzCisgICAgLy8gdGhpcyB2YWx1ZSBkb3duCisgICAgaW5zdC5fd3JhcHBlclN0YXRlLmlu aXRpYWxWYWx1ZSA9IHVuZGVmaW5lZDsKKworICAgIHZhciB3YXNNdWx0aXBsZSA9IGluc3QuX3dy YXBwZXJTdGF0ZS53YXNNdWx0aXBsZTsKKyAgICBpbnN0Ll93cmFwcGVyU3RhdGUud2FzTXVsdGlw bGUgPSBCb29sZWFuKHByb3BzLm11bHRpcGxlKTsKKworICAgIHZhciB2YWx1ZSA9IExpbmtlZFZh bHVlVXRpbHMuZ2V0VmFsdWUocHJvcHMpOworICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAg ICBpbnN0Ll93cmFwcGVyU3RhdGUucGVuZGluZ1VwZGF0ZSA9IGZhbHNlOworICAgICAgdXBkYXRl T3B0aW9ucyhpbnN0LCBCb29sZWFuKHByb3BzLm11bHRpcGxlKSwgdmFsdWUpOworICAgIH0gZWxz ZSBpZiAod2FzTXVsdGlwbGUgIT09IEJvb2xlYW4ocHJvcHMubXVsdGlwbGUpKSB7CisgICAgICAv LyBGb3Igc2ltcGxpY2l0eSwgcmVhcHBseSBgZGVmYXVsdFZhbHVlYCBpZiBgbXVsdGlwbGVgIGlz IHRvZ2dsZWQuCisgICAgICBpZiAocHJvcHMuZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKKyAgICAg ICAgdXBkYXRlT3B0aW9ucyhpbnN0LCBCb29sZWFuKHByb3BzLm11bHRpcGxlKSwgcHJvcHMuZGVm YXVsdFZhbHVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFJldmVydCB0aGUgc2VsZWN0 IGJhY2sgdG8gaXRzIGRlZmF1bHQgdW5zZWxlY3RlZCBzdGF0ZS4KKyAgICAgICAgdXBkYXRlT3B0 aW9ucyhpbnN0LCBCb29sZWFuKHByb3BzLm11bHRpcGxlKSwgcHJvcHMubXVsdGlwbGUgPyBbXSA6 ICcnKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK307CisKK2Z1bmN0aW9uIF9oYW5kbGVDaGFuZ2Uo ZXZlbnQpIHsKKyAgdmFyIHByb3BzID0gdGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHM7CisgIHZh ciByZXR1cm5WYWx1ZSA9IExpbmtlZFZhbHVlVXRpbHMuZXhlY3V0ZU9uQ2hhbmdlKHByb3BzLCBl dmVudCk7CisKKyAgaWYgKHRoaXMuX3Jvb3ROb2RlSUQpIHsKKyAgICB0aGlzLl93cmFwcGVyU3Rh dGUucGVuZGluZ1VwZGF0ZSA9IHRydWU7CisgIH0KKyAgUmVhY3RVcGRhdGVzLmFzYXAodXBkYXRl T3B0aW9uc0lmUGVuZGluZ1VwZGF0ZUFuZE1vdW50ZWQsIHRoaXMpOworICByZXR1cm4gcmV0dXJu VmFsdWU7Cit9CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RET01TZWxlY3Q7Cit9LHsiMTU3Ijox NTcsIjE1OCI6MTU4LCIyNCI6MjQsIjM0IjozNCwiODIiOjgyfV0sNDQ6W2Z1bmN0aW9uKF9kZXJl cV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNl Ym9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBj b2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUK KyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJl ZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQg aW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1 c2Ugc3RyaWN0JzsKKwordmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0gX2RlcmVxXygxMzYpOwor Cit2YXIgZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldCA9IF9kZXJlcV8oMTE4KTsKK3ZhciBnZXRU ZXh0Q29udGVudEFjY2Vzc29yID0gX2RlcmVxXygxMTkpOworCisvKioKKyAqIFdoaWxlIGBpc0Nv bGxhcHNlZGAgaXMgYXZhaWxhYmxlIG9uIHRoZSBTZWxlY3Rpb24gb2JqZWN0IGFuZCBgY29sbGFw c2VkYAorICogaXMgYXZhaWxhYmxlIG9uIHRoZSBSYW5nZSBvYmplY3QsIElFMTEgc29tZXRpbWVz IGdldHMgdGhlbSB3cm9uZy4KKyAqIElmIHRoZSBhbmNob3IvZm9jdXMgbm9kZXMgYW5kIG9mZnNl dHMgYXJlIHRoZSBzYW1lLCB0aGUgcmFuZ2UgaXMgY29sbGFwc2VkLgorICovCitmdW5jdGlvbiBp c0NvbGxhcHNlZChhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZz ZXQpIHsKKyAgcmV0dXJuIGFuY2hvck5vZGUgPT09IGZvY3VzTm9kZSAmJiBhbmNob3JPZmZzZXQg PT09IGZvY3VzT2Zmc2V0OworfQorCisvKioKKyAqIEdldCB0aGUgYXBwcm9wcmlhdGUgYW5jaG9y IGFuZCBmb2N1cyBub2RlL29mZnNldCBwYWlycyBmb3IgSUUuCisgKgorICogVGhlIGNhdGNoIGhl cmUgaXMgdGhhdCBJRSdzIHNlbGVjdGlvbiBBUEkgZG9lc24ndCBwcm92aWRlIGluZm9ybWF0aW9u CisgKiBhYm91dCB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gaXMgZm9yd2FyZCBvciBiYWNrd2FyZCwg c28gd2UgaGF2ZSB0bworICogYmVoYXZlIGFzIHRob3VnaCBpdCdzIGFsd2F5cyBmb3J3YXJkLgor ICoKKyAqIElFIHRleHQgZGlmZmVycyBmcm9tIG1vZGVybiBzZWxlY3Rpb24gaW4gdGhhdCBpdCBi ZWhhdmVzIGFzIHRob3VnaAorICogYmxvY2sgZWxlbWVudHMgZW5kIHdpdGggYSBuZXcgbGluZS4g VGhpcyBtZWFucyBjaGFyYWN0ZXIgb2Zmc2V0cyB3aWxsCisgKiBkaWZmZXIgYmV0d2VlbiB0aGUg dHdvIEFQSXMuCisgKgorICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlCisgKiBAcmV0dXJuIHtv YmplY3R9CisgKi8KK2Z1bmN0aW9uIGdldElFT2Zmc2V0cyhub2RlKSB7CisgIHZhciBzZWxlY3Rp b24gPSBkb2N1bWVudC5zZWxlY3Rpb247CisgIHZhciBzZWxlY3RlZFJhbmdlID0gc2VsZWN0aW9u LmNyZWF0ZVJhbmdlKCk7CisgIHZhciBzZWxlY3RlZExlbmd0aCA9IHNlbGVjdGVkUmFuZ2UudGV4 dC5sZW5ndGg7CisKKyAgLy8gRHVwbGljYXRlIHNlbGVjdGlvbiBzbyB3ZSBjYW4gbW92ZSByYW5n ZSB3aXRob3V0IGJyZWFraW5nIHVzZXIgc2VsZWN0aW9uLgorICB2YXIgZnJvbVN0YXJ0ID0gc2Vs ZWN0ZWRSYW5nZS5kdXBsaWNhdGUoKTsKKyAgZnJvbVN0YXJ0Lm1vdmVUb0VsZW1lbnRUZXh0KG5v ZGUpOworICBmcm9tU3RhcnQuc2V0RW5kUG9pbnQoJ0VuZFRvU3RhcnQnLCBzZWxlY3RlZFJhbmdl KTsKKworICB2YXIgc3RhcnRPZmZzZXQgPSBmcm9tU3RhcnQudGV4dC5sZW5ndGg7CisgIHZhciBl bmRPZmZzZXQgPSBzdGFydE9mZnNldCArIHNlbGVjdGVkTGVuZ3RoOworCisgIHJldHVybiB7Cisg ICAgc3RhcnQ6IHN0YXJ0T2Zmc2V0LAorICAgIGVuZDogZW5kT2Zmc2V0CisgIH07Cit9CisKKy8q KgorICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlCisgKiBAcmV0dXJuIHs/b2JqZWN0fQorICov CitmdW5jdGlvbiBnZXRNb2Rlcm5PZmZzZXRzKG5vZGUpIHsKKyAgdmFyIHNlbGVjdGlvbiA9IHdp bmRvdy5nZXRTZWxlY3Rpb24gJiYgd2luZG93LmdldFNlbGVjdGlvbigpOworCisgIGlmICghc2Vs ZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7CisgICAgcmV0dXJuIG51bGw7 CisgIH0KKworICB2YXIgYW5jaG9yTm9kZSA9IHNlbGVjdGlvbi5hbmNob3JOb2RlOworICB2YXIg YW5jaG9yT2Zmc2V0ID0gc2VsZWN0aW9uLmFuY2hvck9mZnNldDsKKyAgdmFyIGZvY3VzTm9kZSA9 IHNlbGVjdGlvbi5mb2N1c05vZGU7CisgIHZhciBmb2N1c09mZnNldCA9IHNlbGVjdGlvbi5mb2N1 c09mZnNldDsKKworICB2YXIgY3VycmVudFJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7 CisKKyAgLy8gSW4gRmlyZWZveCwgcmFuZ2Uuc3RhcnRDb250YWluZXIgYW5kIHJhbmdlLmVuZENv bnRhaW5lciBjYW4gYmUgImFub255bW91cworICAvLyBkaXZzIiwgZS5nLiB0aGUgdXAvZG93biBi dXR0b25zIG9uIGFuIDxpbnB1dCB0eXBlPSJudW1iZXIiPi4gQW5vbnltb3VzCisgIC8vIGRpdnMg ZG8gbm90IHNlZW0gdG8gZXhwb3NlIHByb3BlcnRpZXMsIHRyaWdnZXJpbmcgYSAiUGVybWlzc2lv biBkZW5pZWQKKyAgLy8gZXJyb3IiIGlmIGFueSBvZiBpdHMgcHJvcGVydGllcyBhcmUgYWNjZXNz ZWQuIFRoZSBvbmx5IHNlZW1pbmdseSBwb3NzaWJsZQorICAvLyB3YXkgdG8gYXZvaWQgZXJyb3Jp bmcgaXMgdG8gYWNjZXNzIGEgcHJvcGVydHkgdGhhdCB0eXBpY2FsbHkgd29ya3MgZm9yCisgIC8v IG5vbi1hbm9ueW1vdXMgZGl2cyBhbmQgY2F0Y2ggYW55IGVycm9yIHRoYXQgbWF5IG90aGVyd2lz ZSBhcmlzZS4gU2VlCisgIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcu Y2dpP2lkPTIwODQyNworICB0cnkgeworICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC1l eHByZXNzaW9ucyAqLworICAgIGN1cnJlbnRSYW5nZS5zdGFydENvbnRhaW5lci5ub2RlVHlwZTsK KyAgICBjdXJyZW50UmFuZ2UuZW5kQ29udGFpbmVyLm5vZGVUeXBlOworICAgIC8qIGVzbGludC1l bmFibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovCisgIH0gY2F0Y2ggKGUpIHsKKyAgICByZXR1 cm4gbnVsbDsKKyAgfQorCisgIC8vIElmIHRoZSBub2RlIGFuZCBvZmZzZXQgdmFsdWVzIGFyZSB0 aGUgc2FtZSwgdGhlIHNlbGVjdGlvbiBpcyBjb2xsYXBzZWQuCisgIC8vIGBTZWxlY3Rpb24uaXND b2xsYXBzZWRgIGlzIGF2YWlsYWJsZSBuYXRpdmVseSwgYnV0IElFIHNvbWV0aW1lcyBnZXRzCisg IC8vIHRoaXMgdmFsdWUgd3JvbmcuCisgIHZhciBpc1NlbGVjdGlvbkNvbGxhcHNlZCA9IGlzQ29s bGFwc2VkKHNlbGVjdGlvbi5hbmNob3JOb2RlLCBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0LCBzZWxl Y3Rpb24uZm9jdXNOb2RlLCBzZWxlY3Rpb24uZm9jdXNPZmZzZXQpOworCisgIHZhciByYW5nZUxl bmd0aCA9IGlzU2VsZWN0aW9uQ29sbGFwc2VkID8gMCA6IGN1cnJlbnRSYW5nZS50b1N0cmluZygp Lmxlbmd0aDsKKworICB2YXIgdGVtcFJhbmdlID0gY3VycmVudFJhbmdlLmNsb25lUmFuZ2UoKTsK KyAgdGVtcFJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhub2RlKTsKKyAgdGVtcFJhbmdlLnNldEVu ZChjdXJyZW50UmFuZ2Uuc3RhcnRDb250YWluZXIsIGN1cnJlbnRSYW5nZS5zdGFydE9mZnNldCk7 CisKKyAgdmFyIGlzVGVtcFJhbmdlQ29sbGFwc2VkID0gaXNDb2xsYXBzZWQodGVtcFJhbmdlLnN0 YXJ0Q29udGFpbmVyLCB0ZW1wUmFuZ2Uuc3RhcnRPZmZzZXQsIHRlbXBSYW5nZS5lbmRDb250YWlu ZXIsIHRlbXBSYW5nZS5lbmRPZmZzZXQpOworCisgIHZhciBzdGFydCA9IGlzVGVtcFJhbmdlQ29s bGFwc2VkID8gMCA6IHRlbXBSYW5nZS50b1N0cmluZygpLmxlbmd0aDsKKyAgdmFyIGVuZCA9IHN0 YXJ0ICsgcmFuZ2VMZW5ndGg7CisKKyAgLy8gRGV0ZWN0IHdoZXRoZXIgdGhlIHNlbGVjdGlvbiBp cyBiYWNrd2FyZC4KKyAgdmFyIGRldGVjdGlvblJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2Uo KTsKKyAgZGV0ZWN0aW9uUmFuZ2Uuc2V0U3RhcnQoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0KTsK KyAgZGV0ZWN0aW9uUmFuZ2Uuc2V0RW5kKGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpOworICB2YXIg aXNCYWNrd2FyZCA9IGRldGVjdGlvblJhbmdlLmNvbGxhcHNlZDsKKworICByZXR1cm4geworICAg IHN0YXJ0OiBpc0JhY2t3YXJkID8gZW5kIDogc3RhcnQsCisgICAgZW5kOiBpc0JhY2t3YXJkID8g c3RhcnQgOiBlbmQKKyAgfTsKK30KKworLyoqCisgKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4 dE5vZGV9IG5vZGUKKyAqIEBwYXJhbSB7b2JqZWN0fSBvZmZzZXRzCisgKi8KK2Z1bmN0aW9uIHNl dElFT2Zmc2V0cyhub2RlLCBvZmZzZXRzKSB7CisgIHZhciByYW5nZSA9IGRvY3VtZW50LnNlbGVj dGlvbi5jcmVhdGVSYW5nZSgpLmR1cGxpY2F0ZSgpOworICB2YXIgc3RhcnQsIGVuZDsKKworICBp ZiAob2Zmc2V0cy5lbmQgPT09IHVuZGVmaW5lZCkgeworICAgIHN0YXJ0ID0gb2Zmc2V0cy5zdGFy dDsKKyAgICBlbmQgPSBzdGFydDsKKyAgfSBlbHNlIGlmIChvZmZzZXRzLnN0YXJ0ID4gb2Zmc2V0 cy5lbmQpIHsKKyAgICBzdGFydCA9IG9mZnNldHMuZW5kOworICAgIGVuZCA9IG9mZnNldHMuc3Rh cnQ7CisgIH0gZWxzZSB7CisgICAgc3RhcnQgPSBvZmZzZXRzLnN0YXJ0OworICAgIGVuZCA9IG9m ZnNldHMuZW5kOworICB9CisKKyAgcmFuZ2UubW92ZVRvRWxlbWVudFRleHQobm9kZSk7CisgIHJh bmdlLm1vdmVTdGFydCgnY2hhcmFjdGVyJywgc3RhcnQpOworICByYW5nZS5zZXRFbmRQb2ludCgn RW5kVG9TdGFydCcsIHJhbmdlKTsKKyAgcmFuZ2UubW92ZUVuZCgnY2hhcmFjdGVyJywgZW5kIC0g c3RhcnQpOworICByYW5nZS5zZWxlY3QoKTsKK30KKworLyoqCisgKiBJbiBtb2Rlcm4gbm9uLUlF IGJyb3dzZXJzLCB3ZSBjYW4gc3VwcG9ydCBib3RoIGZvcndhcmQgYW5kIGJhY2t3YXJkCisgKiBz ZWxlY3Rpb25zLgorICoKKyAqIE5vdGU6IElFMTArIHN1cHBvcnRzIHRoZSBTZWxlY3Rpb24gb2Jq ZWN0LCBidXQgaXQgZG9lcyBub3Qgc3VwcG9ydAorICogdGhlIGBleHRlbmRgIG1ldGhvZCwgd2hp Y2ggbWVhbnMgdGhhdCBldmVuIGluIG1vZGVybiBJRSwgaXQncyBub3QgcG9zc2libGUKKyAqIHRv IHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlIGEgYmFja3dhcmQgc2VsZWN0aW9uLiBUaHVzLCBmb3Ig YWxsIElFCisgKiB2ZXJzaW9ucywgd2UgdXNlIHRoZSBvbGQgSUUgQVBJIHRvIGNyZWF0ZSBvdXIg c2VsZWN0aW9ucy4KKyAqCisgKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGUK KyAqIEBwYXJhbSB7b2JqZWN0fSBvZmZzZXRzCisgKi8KK2Z1bmN0aW9uIHNldE1vZGVybk9mZnNl dHMobm9kZSwgb2Zmc2V0cykgeworICBpZiAoIXdpbmRvdy5nZXRTZWxlY3Rpb24pIHsKKyAgICBy ZXR1cm47CisgIH0KKworICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpOwor ICB2YXIgbGVuZ3RoID0gbm9kZVtnZXRUZXh0Q29udGVudEFjY2Vzc29yKCldLmxlbmd0aDsKKyAg dmFyIHN0YXJ0ID0gTWF0aC5taW4ob2Zmc2V0cy5zdGFydCwgbGVuZ3RoKTsKKyAgdmFyIGVuZCA9 IG9mZnNldHMuZW5kID09PSB1bmRlZmluZWQgPyBzdGFydCA6IE1hdGgubWluKG9mZnNldHMuZW5k LCBsZW5ndGgpOworCisgIC8vIElFIDExIHVzZXMgbW9kZXJuIHNlbGVjdGlvbiwgYnV0IGRvZXNu J3Qgc3VwcG9ydCB0aGUgZXh0ZW5kIG1ldGhvZC4KKyAgLy8gRmxpcCBiYWNrd2FyZCBzZWxlY3Rp b25zLCBzbyB3ZSBjYW4gc2V0IHdpdGggYSBzaW5nbGUgcmFuZ2UuCisgIGlmICghc2VsZWN0aW9u LmV4dGVuZCAmJiBzdGFydCA+IGVuZCkgeworICAgIHZhciB0ZW1wID0gZW5kOworICAgIGVuZCA9 IHN0YXJ0OworICAgIHN0YXJ0ID0gdGVtcDsKKyAgfQorCisgIHZhciBzdGFydE1hcmtlciA9IGdl dE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQobm9kZSwgc3RhcnQpOworICB2YXIgZW5kTWFya2VyID0g Z2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChub2RlLCBlbmQpOworCisgIGlmIChzdGFydE1hcmtl ciAmJiBlbmRNYXJrZXIpIHsKKyAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgp OworICAgIHJhbmdlLnNldFN0YXJ0KHN0YXJ0TWFya2VyLm5vZGUsIHN0YXJ0TWFya2VyLm9mZnNl dCk7CisgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpOworCisgICAgaWYgKHN0YXJ0ID4g ZW5kKSB7CisgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpOworICAgICAgc2VsZWN0aW9u LmV4dGVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNldCk7CisgICAgfSBlbHNlIHsK KyAgICAgIHJhbmdlLnNldEVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNldCk7Cisg ICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpOworICAgIH0KKyAgfQorfQorCit2YXIgdXNl SUVPZmZzZXRzID0gRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NICYmICdzZWxlY3Rpb24n IGluIGRvY3VtZW50ICYmICEoJ2dldFNlbGVjdGlvbicgaW4gd2luZG93KTsKKwordmFyIFJlYWN0 RE9NU2VsZWN0aW9uID0geworICAvKioKKyAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlCisg ICAqLworICBnZXRPZmZzZXRzOiB1c2VJRU9mZnNldHMgPyBnZXRJRU9mZnNldHMgOiBnZXRNb2Rl cm5PZmZzZXRzLAorCisgIC8qKgorICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9 IG5vZGUKKyAgICogQHBhcmFtIHtvYmplY3R9IG9mZnNldHMKKyAgICovCisgIHNldE9mZnNldHM6 IHVzZUlFT2Zmc2V0cyA/IHNldElFT2Zmc2V0cyA6IHNldE1vZGVybk9mZnNldHMKK307CisKK21v ZHVsZS5leHBvcnRzID0gUmVhY3RET01TZWxlY3Rpb247Cit9LHsiMTE4IjoxMTgsIjExOSI6MTE5 LCIxMzYiOjEzNn1dLDQ1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgor ICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMg cmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUg QlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJv b3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAq IG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhl IHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJvZElu dmFyaWFudCA9IF9kZXJlcV8oMTI1KSwKKyAgICBfYXNzaWduID0gX2RlcmVxXygxNTgpOworCit2 YXIgRE9NQ2hpbGRyZW5PcGVyYXRpb25zID0gX2RlcmVxXyg4KTsKK3ZhciBET01MYXp5VHJlZSA9 IF9kZXJlcV8oOSk7Cit2YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gX2RlcmVxXygzNCk7CisK K3ZhciBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIgPSBfZGVyZXFfKDEwNyk7Cit2YXIgaW52 YXJpYW50ID0gX2RlcmVxXygxNTApOwordmFyIHZhbGlkYXRlRE9NTmVzdGluZyA9IF9kZXJlcV8o MTMxKTsKKworLyoqCisgKiBUZXh0IG5vZGVzIHZpb2xhdGUgYSBjb3VwbGUgYXNzdW1wdGlvbnMg dGhhdCBSZWFjdCBtYWtlcyBhYm91dCBjb21wb25lbnRzOgorICoKKyAqICAtIFdoZW4gbW91bnRp bmcgdGV4dCBpbnRvIHRoZSBET00sIGFkamFjZW50IHRleHQgbm9kZXMgYXJlIG1lcmdlZC4KKyAq ICAtIFRleHQgbm9kZXMgY2Fubm90IGJlIGFzc2lnbmVkIGEgUmVhY3Qgcm9vdCBJRC4KKyAqCisg KiBUaGlzIGNvbXBvbmVudCBpcyB1c2VkIHRvIHdyYXAgc3RyaW5ncyBiZXR3ZWVuIGNvbW1lbnQg bm9kZXMgc28gdGhhdCB0aGV5CisgKiBjYW4gdW5kZXJnbyB0aGUgc2FtZSByZWNvbmNpbGlhdGlv biB0aGF0IGlzIGFwcGxpZWQgdG8gZWxlbWVudHMuCisgKgorICogVE9ETzogSW52ZXN0aWdhdGUg cmVwcmVzZW50aW5nIFJlYWN0IGNvbXBvbmVudHMgaW4gdGhlIERPTSB3aXRoIHRleHQgbm9kZXMu CisgKgorICogQGNsYXNzIFJlYWN0RE9NVGV4dENvbXBvbmVudAorICogQGV4dGVuZHMgUmVhY3RD b21wb25lbnQKKyAqIEBpbnRlcm5hbAorICovCit2YXIgUmVhY3RET01UZXh0Q29tcG9uZW50ID0g ZnVuY3Rpb24gKHRleHQpIHsKKyAgLy8gVE9ETzogVGhpcyBpcyByZWFsbHkgYSBSZWFjdFRleHQg KFJlYWN0Tm9kZSksIG5vdCBhIFJlYWN0RWxlbWVudAorICB0aGlzLl9jdXJyZW50RWxlbWVudCA9 IHRleHQ7CisgIHRoaXMuX3N0cmluZ1RleHQgPSAnJyArIHRleHQ7CisgIC8vIFJlYWN0RE9NQ29t cG9uZW50VHJlZSB1c2VzIHRoZXNlOgorICB0aGlzLl9ob3N0Tm9kZSA9IG51bGw7CisgIHRoaXMu X2hvc3RQYXJlbnQgPSBudWxsOworCisgIC8vIFByb3BlcnRpZXMKKyAgdGhpcy5fZG9tSUQgPSAw OworICB0aGlzLl9tb3VudEluZGV4ID0gMDsKKyAgdGhpcy5fY2xvc2luZ0NvbW1lbnQgPSBudWxs OworICB0aGlzLl9jb21tZW50Tm9kZXMgPSBudWxsOworfTsKKworX2Fzc2lnbihSZWFjdERPTVRl eHRDb21wb25lbnQucHJvdG90eXBlLCB7CisKKyAgLyoqCisgICAqIENyZWF0ZXMgdGhlIG1hcmt1 cCBmb3IgdGhpcyB0ZXh0IG5vZGUuIFRoaXMgbm9kZSBpcyBub3QgaW50ZW5kZWQgdG8gaGF2ZQor ICAgKiBhbnkgZmVhdHVyZXMgYmVzaWRlcyBjb250YWluaW5nIHRleHQgY29udGVudC4KKyAgICoK KyAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufFJlYWN0U2VydmVyUmVuZGVy aW5nVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uCisgICAqIEByZXR1cm4ge3N0cmluZ30gTWFya3Vw IGZvciB0aGlzIHRleHQgbm9kZS4KKyAgICogQGludGVybmFsCisgICAqLworICBtb3VudENvbXBv bmVudDogZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5m bywgY29udGV4dCkgeworICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsK KyAgICAgIHZhciBwYXJlbnRJbmZvOworICAgICAgaWYgKGhvc3RQYXJlbnQgIT0gbnVsbCkgewor ICAgICAgICBwYXJlbnRJbmZvID0gaG9zdFBhcmVudC5fYW5jZXN0b3JJbmZvOworICAgICAgfSBl bHNlIGlmIChob3N0Q29udGFpbmVySW5mbyAhPSBudWxsKSB7CisgICAgICAgIHBhcmVudEluZm8g PSBob3N0Q29udGFpbmVySW5mby5fYW5jZXN0b3JJbmZvOworICAgICAgfQorICAgICAgaWYgKHBh cmVudEluZm8pIHsKKyAgICAgICAgLy8gcGFyZW50SW5mbyBzaG91bGQgYWx3YXlzIGJlIHByZXNl bnQgZXhjZXB0IGZvciB0aGUgdG9wLWxldmVsCisgICAgICAgIC8vIGNvbXBvbmVudCB3aGVuIHNl cnZlciByZW5kZXJpbmcKKyAgICAgICAgdmFsaWRhdGVET01OZXN0aW5nKG51bGwsIHRoaXMuX3N0 cmluZ1RleHQsIHRoaXMsIHBhcmVudEluZm8pOworICAgICAgfQorICAgIH0KKworICAgIHZhciBk b21JRCA9IGhvc3RDb250YWluZXJJbmZvLl9pZENvdW50ZXIrKzsKKyAgICB2YXIgb3BlbmluZ1Zh bHVlID0gJyByZWFjdC10ZXh0OiAnICsgZG9tSUQgKyAnICc7CisgICAgdmFyIGNsb3NpbmdWYWx1 ZSA9ICcgL3JlYWN0LXRleHQgJzsKKyAgICB0aGlzLl9kb21JRCA9IGRvbUlEOworICAgIHRoaXMu X2hvc3RQYXJlbnQgPSBob3N0UGFyZW50OworICAgIGlmICh0cmFuc2FjdGlvbi51c2VDcmVhdGVF bGVtZW50KSB7CisgICAgICB2YXIgb3duZXJEb2N1bWVudCA9IGhvc3RDb250YWluZXJJbmZvLl9v d25lckRvY3VtZW50OworICAgICAgdmFyIG9wZW5pbmdDb21tZW50ID0gb3duZXJEb2N1bWVudC5j cmVhdGVDb21tZW50KG9wZW5pbmdWYWx1ZSk7CisgICAgICB2YXIgY2xvc2luZ0NvbW1lbnQgPSBv d25lckRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoY2xvc2luZ1ZhbHVlKTsKKyAgICAgIHZhciBsYXp5 VHJlZSA9IERPTUxhenlUcmVlKG93bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgp KTsKKyAgICAgIERPTUxhenlUcmVlLnF1ZXVlQ2hpbGQobGF6eVRyZWUsIERPTUxhenlUcmVlKG9w ZW5pbmdDb21tZW50KSk7CisgICAgICBpZiAodGhpcy5fc3RyaW5nVGV4dCkgeworICAgICAgICBE T01MYXp5VHJlZS5xdWV1ZUNoaWxkKGxhenlUcmVlLCBET01MYXp5VHJlZShvd25lckRvY3VtZW50 LmNyZWF0ZVRleHROb2RlKHRoaXMuX3N0cmluZ1RleHQpKSk7CisgICAgICB9CisgICAgICBET01M YXp5VHJlZS5xdWV1ZUNoaWxkKGxhenlUcmVlLCBET01MYXp5VHJlZShjbG9zaW5nQ29tbWVudCkp OworICAgICAgUmVhY3RET01Db21wb25lbnRUcmVlLnByZWNhY2hlTm9kZSh0aGlzLCBvcGVuaW5n Q29tbWVudCk7CisgICAgICB0aGlzLl9jbG9zaW5nQ29tbWVudCA9IGNsb3NpbmdDb21tZW50Owor ICAgICAgcmV0dXJuIGxhenlUcmVlOworICAgIH0gZWxzZSB7CisgICAgICB2YXIgZXNjYXBlZFRl eHQgPSBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIodGhpcy5fc3RyaW5nVGV4dCk7CisKKyAg ICAgIGlmICh0cmFuc2FjdGlvbi5yZW5kZXJUb1N0YXRpY01hcmt1cCkgeworICAgICAgICAvLyBO b3JtYWxseSB3ZSdkIHdyYXAgdGhpcyBiZXR3ZWVuIGNvbW1lbnQgbm9kZXMgZm9yIHRoZSByZWFz b25zIHN0YXRlZAorICAgICAgICAvLyBhYm92ZSwgYnV0IHNpbmNlIHRoaXMgaXMgYSBzaXR1YXRp b24gd2hlcmUgUmVhY3Qgd29uJ3QgdGFrZSBvdmVyCisgICAgICAgIC8vIChzdGF0aWMgcGFnZXMp LCB3ZSBjYW4gc2ltcGx5IHJldHVybiB0aGUgdGV4dCBhcyBpdCBpcy4KKyAgICAgICAgcmV0dXJu IGVzY2FwZWRUZXh0OworICAgICAgfQorCisgICAgICByZXR1cm4gJzwhLS0nICsgb3BlbmluZ1Zh bHVlICsgJy0tPicgKyBlc2NhcGVkVGV4dCArICc8IS0tJyArIGNsb3NpbmdWYWx1ZSArICctLT4n OworICAgIH0KKyAgfSwKKworICAvKioKKyAgICogVXBkYXRlcyB0aGlzIGNvbXBvbmVudCBieSB1 cGRhdGluZyB0aGUgdGV4dCBjb250ZW50LgorICAgKgorICAgKiBAcGFyYW0ge1JlYWN0VGV4dH0g bmV4dFRleHQgVGhlIG5leHQgdGV4dCBjb250ZW50CisgICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNp bGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24KKyAgICogQGludGVybmFsCisgICAqLworICByZWNl aXZlQ29tcG9uZW50OiBmdW5jdGlvbiAobmV4dFRleHQsIHRyYW5zYWN0aW9uKSB7CisgICAgaWYg KG5leHRUZXh0ICE9PSB0aGlzLl9jdXJyZW50RWxlbWVudCkgeworICAgICAgdGhpcy5fY3VycmVu dEVsZW1lbnQgPSBuZXh0VGV4dDsKKyAgICAgIHZhciBuZXh0U3RyaW5nVGV4dCA9ICcnICsgbmV4 dFRleHQ7CisgICAgICBpZiAobmV4dFN0cmluZ1RleHQgIT09IHRoaXMuX3N0cmluZ1RleHQpIHsK KyAgICAgICAgLy8gVE9ETzogU2F2ZSB0aGlzIGFzIHBlbmRpbmcgcHJvcHMgYW5kIHVzZSBwZXJm b3JtVXBkYXRlSWZOZWNlc3NhcnkKKyAgICAgICAgLy8gYW5kL29yIHVwZGF0ZUNvbXBvbmVudCB0 byBkbyB0aGUgYWN0dWFsIHVwZGF0ZSBmb3IgY29uc2lzdGVuY3kgd2l0aAorICAgICAgICAvLyBv dGhlciBjb21wb25lbnQgdHlwZXM/CisgICAgICAgIHRoaXMuX3N0cmluZ1RleHQgPSBuZXh0U3Ry aW5nVGV4dDsKKyAgICAgICAgdmFyIGNvbW1lbnROb2RlcyA9IHRoaXMuZ2V0SG9zdE5vZGUoKTsK KyAgICAgICAgRE9NQ2hpbGRyZW5PcGVyYXRpb25zLnJlcGxhY2VEZWxpbWl0ZWRUZXh0KGNvbW1l bnROb2Rlc1swXSwgY29tbWVudE5vZGVzWzFdLCBuZXh0U3RyaW5nVGV4dCk7CisgICAgICB9Cisg ICAgfQorICB9LAorCisgIGdldEhvc3ROb2RlOiBmdW5jdGlvbiAoKSB7CisgICAgdmFyIGhvc3RO b2RlID0gdGhpcy5fY29tbWVudE5vZGVzOworICAgIGlmIChob3N0Tm9kZSkgeworICAgICAgcmV0 dXJuIGhvc3ROb2RlOworICAgIH0KKyAgICBpZiAoIXRoaXMuX2Nsb3NpbmdDb21tZW50KSB7Cisg ICAgICB2YXIgb3BlbmluZ0NvbW1lbnQgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZy b21JbnN0YW5jZSh0aGlzKTsKKyAgICAgIHZhciBub2RlID0gb3BlbmluZ0NvbW1lbnQubmV4dFNp Ymxpbmc7CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAhKG5vZGUgIT0gbnVsbCkgPyAi ZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdNaXNzaW5n IGNsb3NpbmcgY29tbWVudCBmb3IgdGV4dCBjb21wb25lbnQgJXMnLCB0aGlzLl9kb21JRCkgOiBf cHJvZEludmFyaWFudCgnNjcnLCB0aGlzLl9kb21JRCkgOiB2b2lkIDA7CisgICAgICAgIGlmIChu b2RlLm5vZGVUeXBlID09PSA4ICYmIG5vZGUubm9kZVZhbHVlID09PSAnIC9yZWFjdC10ZXh0ICcp IHsKKyAgICAgICAgICB0aGlzLl9jbG9zaW5nQ29tbWVudCA9IG5vZGU7CisgICAgICAgICAgYnJl YWs7CisgICAgICAgIH0KKyAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7CisgICAgICB9 CisgICAgfQorICAgIGhvc3ROb2RlID0gW3RoaXMuX2hvc3ROb2RlLCB0aGlzLl9jbG9zaW5nQ29t bWVudF07CisgICAgdGhpcy5fY29tbWVudE5vZGVzID0gaG9zdE5vZGU7CisgICAgcmV0dXJuIGhv c3ROb2RlOworICB9LAorCisgIHVubW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uICgpIHsKKyAgICB0 aGlzLl9jbG9zaW5nQ29tbWVudCA9IG51bGw7CisgICAgdGhpcy5fY29tbWVudE5vZGVzID0gbnVs bDsKKyAgICBSZWFjdERPTUNvbXBvbmVudFRyZWUudW5jYWNoZU5vZGUodGhpcyk7CisgIH0KKwor fSk7CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RET01UZXh0Q29tcG9uZW50OworfSx7IjEwNyI6 MTA3LCIxMjUiOjEyNSwiMTMxIjoxMzEsIjE1MCI6MTUwLCIxNTgiOjE1OCwiMzQiOjM0LCI4Ijo4 LCI5Ijo5fV0sNDY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBD b3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNl cnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qt c3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBk aXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2Yg cGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2Ft ZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9wcm9kSW52YXJp YW50ID0gX2RlcmVxXygxMjUpLAorICAgIF9hc3NpZ24gPSBfZGVyZXFfKDE1OCk7CisKK3ZhciBM aW5rZWRWYWx1ZVV0aWxzID0gX2RlcmVxXygyNCk7Cit2YXIgUmVhY3RET01Db21wb25lbnRUcmVl ID0gX2RlcmVxXygzNCk7Cit2YXIgUmVhY3RVcGRhdGVzID0gX2RlcmVxXyg4Mik7CisKK3ZhciBp bnZhcmlhbnQgPSBfZGVyZXFfKDE1MCk7Cit2YXIgd2FybmluZyA9IF9kZXJlcV8oMTU3KTsKKwor dmFyIGRpZFdhcm5WYWx1ZUxpbmsgPSBmYWxzZTsKK3ZhciBkaWRXYXJuVmFsRGVmYXVsdFZhbCA9 IGZhbHNlOworCitmdW5jdGlvbiBmb3JjZVVwZGF0ZUlmTW91bnRlZCgpIHsKKyAgaWYgKHRoaXMu X3Jvb3ROb2RlSUQpIHsKKyAgICAvLyBET00gY29tcG9uZW50IGlzIHN0aWxsIG1vdW50ZWQ7IHVw ZGF0ZQorICAgIFJlYWN0RE9NVGV4dGFyZWEudXBkYXRlV3JhcHBlcih0aGlzKTsKKyAgfQorfQor CisvKioKKyAqIEltcGxlbWVudHMgYSA8dGV4dGFyZWE+IGhvc3QgY29tcG9uZW50IHRoYXQgYWxs b3dzIHNldHRpbmcgYHZhbHVlYCwgYW5kCisgKiBgZGVmYXVsdFZhbHVlYC4gVGhpcyBkaWZmZXJz IGZyb20gdGhlIHRyYWRpdGlvbmFsIERPTSBBUEkgYmVjYXVzZSB2YWx1ZSBpcworICogdXN1YWxs eSBzZXQgYXMgUENEQVRBIGNoaWxkcmVuLgorICoKKyAqIElmIGB2YWx1ZWAgaXMgbm90IHN1cHBs aWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9ucyB0aGF0IGFmZmVjdCB0aGUKKyAq IHZhbHVlIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LgorICoKKyAqIElmIGB2 YWx1ZWAgaXMgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVyZWQg ZWxlbWVudCB3aWxsCisgKiBub3QgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LiBJbnN0 ZWFkLCB0aGUgYHZhbHVlYCBwcm9wIG11c3QgY2hhbmdlIGluCisgKiBvcmRlciBmb3IgdGhlIHJl bmRlcmVkIGVsZW1lbnQgdG8gYmUgdXBkYXRlZC4KKyAqCisgKiBUaGUgcmVuZGVyZWQgZWxlbWVu dCB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggYW4gZW1wdHkgdmFsdWUsIHRoZSBwcm9wCisgKiBg ZGVmYXVsdFZhbHVlYCBpZiBzcGVjaWZpZWQsIG9yIHRoZSBjaGlsZHJlbiBjb250ZW50IChkZXBy ZWNhdGVkKS4KKyAqLwordmFyIFJlYWN0RE9NVGV4dGFyZWEgPSB7CisgIGdldEhvc3RQcm9wczog ZnVuY3Rpb24gKGluc3QsIHByb3BzKSB7CisgICAgIShwcm9wcy5kYW5nZXJvdXNseVNldElubmVy SFRNTCA9PSBudWxsKSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFu dChmYWxzZSwgJ2BkYW5nZXJvdXNseVNldElubmVySFRNTGAgZG9lcyBub3QgbWFrZSBzZW5zZSBv biA8dGV4dGFyZWE+LicpIDogX3Byb2RJbnZhcmlhbnQoJzkxJykgOiB2b2lkIDA7CisKKyAgICAv LyBBbHdheXMgc2V0IGNoaWxkcmVuIHRvIHRoZSBzYW1lIHRoaW5nLiBJbiBJRTksIHRoZSBzZWxl Y3Rpb24gcmFuZ2Ugd2lsbAorICAgIC8vIGdldCByZXNldCBpZiBgdGV4dENvbnRlbnRgIGlzIG11 dGF0ZWQuICBXZSBjb3VsZCBhZGQgYSBjaGVjayBpbiBzZXRUZXh0Q29udGVudAorICAgIC8vIHRv IG9ubHkgc2V0IHRoZSB2YWx1ZSBpZi93aGVuIHRoZSB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIG5v ZGUgdmFsdWUgKHdoaWNoIHdvdWxkCisgICAgLy8gY29tcGxldGVseSBzb2x2ZSB0aGlzIElFOSBi dWcpLCBidXQgU2ViYXN0aWFuK0JlbiBzZWVtZWQgdG8gbGlrZSB0aGlzIHNvbHV0aW9uLgorICAg IC8vIFRoZSB2YWx1ZSBjYW4gYmUgYSBib29sZWFuIG9yIG9iamVjdCBzbyB0aGF0J3Mgd2h5IGl0 J3MgZm9yY2VkIHRvIGJlIGEgc3RyaW5nLgorICAgIHZhciBob3N0UHJvcHMgPSBfYXNzaWduKHt9 LCBwcm9wcywgeworICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKKyAgICAgIGRlZmF1bHRWYWx1ZTog dW5kZWZpbmVkLAorICAgICAgY2hpbGRyZW46ICcnICsgaW5zdC5fd3JhcHBlclN0YXRlLmluaXRp YWxWYWx1ZSwKKyAgICAgIG9uQ2hhbmdlOiBpbnN0Ll93cmFwcGVyU3RhdGUub25DaGFuZ2UKKyAg ICB9KTsKKworICAgIHJldHVybiBob3N0UHJvcHM7CisgIH0sCisKKyAgbW91bnRXcmFwcGVyOiBm dW5jdGlvbiAoaW5zdCwgcHJvcHMpIHsKKyAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1 Y3Rpb24nKSB7CisgICAgICBMaW5rZWRWYWx1ZVV0aWxzLmNoZWNrUHJvcFR5cGVzKCd0ZXh0YXJl YScsIHByb3BzLCBpbnN0Ll9jdXJyZW50RWxlbWVudC5fb3duZXIpOworICAgICAgaWYgKHByb3Bz LnZhbHVlTGluayAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsdWVMaW5rKSB7CisgICAgICAg ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdgdmFsdWVM aW5rYCBwcm9wIG9uIGB0ZXh0YXJlYWAgaXMgZGVwcmVjYXRlZDsgc2V0IGB2YWx1ZWAgYW5kIGBv bkNoYW5nZWAgaW5zdGVhZC4nKSA6IHZvaWQgMDsKKyAgICAgICAgZGlkV2FyblZhbHVlTGluayA9 IHRydWU7CisgICAgICB9CisgICAgICBpZiAocHJvcHMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBw cm9wcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbERlZmF1bHRWYWwp IHsKKyAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxz ZSwgJ1RleHRhcmVhIGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250 cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVs dFZhbHVlIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBj b250cm9sbGVkIG9yIHVuY29udHJvbGxlZCB0ZXh0YXJlYSAnICsgJ2FuZCByZW1vdmUgb25lIG9m IHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9mYi5tZS9yZWFjdC1jb250cm9s bGVkLWNvbXBvbmVudHMnKSA6IHZvaWQgMDsKKyAgICAgICAgZGlkV2FyblZhbERlZmF1bHRWYWwg PSB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIHZhciB2YWx1ZSA9IExpbmtlZFZhbHVlVXRp bHMuZ2V0VmFsdWUocHJvcHMpOworICAgIHZhciBpbml0aWFsVmFsdWUgPSB2YWx1ZTsKKworICAg IC8vIE9ubHkgYm90aGVyIGZldGNoaW5nIGRlZmF1bHQgdmFsdWUgaWYgd2UncmUgZ29pbmcgdG8g dXNlIGl0CisgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgIHZhciBkZWZhdWx0VmFsdWUg PSBwcm9wcy5kZWZhdWx0VmFsdWU7CisgICAgICAvLyBUT0RPICh5dW5nc3RlcnMpOiBSZW1vdmUg c3VwcG9ydCBmb3IgY2hpbGRyZW4gY29udGVudCBpbiA8dGV4dGFyZWE+LgorICAgICAgdmFyIGNo aWxkcmVuID0gcHJvcHMuY2hpbGRyZW47CisgICAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewor ICAgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAgICAg ImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1VzZSB0aGUg YGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBwcm9wcyBpbnN0ZWFkIG9mIHNldHRpbmcgJyArICdj aGlsZHJlbiBvbiA8dGV4dGFyZWE+LicpIDogdm9pZCAwOworICAgICAgICB9CisgICAgICAgICEo ZGVmYXVsdFZhbHVlID09IG51bGwpID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8g aW52YXJpYW50KGZhbHNlLCAnSWYgeW91IHN1cHBseSBgZGVmYXVsdFZhbHVlYCBvbiBhIDx0ZXh0 YXJlYT4sIGRvIG5vdCBwYXNzIGNoaWxkcmVuLicpIDogX3Byb2RJbnZhcmlhbnQoJzkyJykgOiB2 b2lkIDA7CisgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgeworICAgICAgICAg ICEoY2hpbGRyZW4ubGVuZ3RoIDw9IDEpID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24n ID8gaW52YXJpYW50KGZhbHNlLCAnPHRleHRhcmVhPiBjYW4gb25seSBoYXZlIGF0IG1vc3Qgb25l IGNoaWxkLicpIDogX3Byb2RJbnZhcmlhbnQoJzkzJykgOiB2b2lkIDA7CisgICAgICAgICAgY2hp bGRyZW4gPSBjaGlsZHJlblswXTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHRWYWx1ZSA9 ICcnICsgY2hpbGRyZW47CisgICAgICB9CisgICAgICBpZiAoZGVmYXVsdFZhbHVlID09IG51bGwp IHsKKyAgICAgICAgZGVmYXVsdFZhbHVlID0gJyc7CisgICAgICB9CisgICAgICBpbml0aWFsVmFs dWUgPSBkZWZhdWx0VmFsdWU7CisgICAgfQorCisgICAgaW5zdC5fd3JhcHBlclN0YXRlID0gewor ICAgICAgaW5pdGlhbFZhbHVlOiAnJyArIGluaXRpYWxWYWx1ZSwKKyAgICAgIGxpc3RlbmVyczog bnVsbCwKKyAgICAgIG9uQ2hhbmdlOiBfaGFuZGxlQ2hhbmdlLmJpbmQoaW5zdCkKKyAgICB9Owor ICB9LAorCisgIHVwZGF0ZVdyYXBwZXI6IGZ1bmN0aW9uIChpbnN0KSB7CisgICAgdmFyIHByb3Bz ID0gaW5zdC5fY3VycmVudEVsZW1lbnQucHJvcHM7CisKKyAgICB2YXIgbm9kZSA9IFJlYWN0RE9N Q29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpOworICAgIHZhciB2YWx1ZSA9 IExpbmtlZFZhbHVlVXRpbHMuZ2V0VmFsdWUocHJvcHMpOworICAgIGlmICh2YWx1ZSAhPSBudWxs KSB7CisgICAgICAvLyBDYXN0IGB2YWx1ZWAgdG8gYSBzdHJpbmcgdG8gZW5zdXJlIHRoZSB2YWx1 ZSBpcyBzZXQgY29ycmVjdGx5LiBXaGlsZQorICAgICAgLy8gYnJvd3NlcnMgdHlwaWNhbGx5IGRv IHRoaXMgYXMgbmVjZXNzYXJ5LCBqc2RvbSBkb2Vzbid0LgorICAgICAgdmFyIG5ld1ZhbHVlID0g JycgKyB2YWx1ZTsKKworICAgICAgLy8gVG8gYXZvaWQgc2lkZSBlZmZlY3RzIChzdWNoIGFzIGxv c2luZyB0ZXh0IHNlbGVjdGlvbiksIG9ubHkgc2V0IHZhbHVlIGlmIGNoYW5nZWQKKyAgICAgIGlm IChuZXdWYWx1ZSAhPT0gbm9kZS52YWx1ZSkgeworICAgICAgICBub2RlLnZhbHVlID0gbmV3VmFs dWU7CisgICAgICB9CisgICAgICBpZiAocHJvcHMuZGVmYXVsdFZhbHVlID09IG51bGwpIHsKKyAg ICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSBuZXdWYWx1ZTsKKyAgICAgIH0KKyAgICB9CisgICAg aWYgKHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7CisgICAgICBub2RlLmRlZmF1bHRWYWx1 ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZTsKKyAgICB9CisgIH0sCisKKyAgcG9zdE1vdW50V3JhcHBl cjogZnVuY3Rpb24gKGluc3QpIHsKKyAgICAvLyBUaGlzIGlzIGluIHBvc3RNb3VudCBiZWNhdXNl IHdlIG5lZWQgYWNjZXNzIHRvIHRoZSBET00gbm9kZSwgd2hpY2ggaXMgbm90CisgICAgLy8gYXZh aWxhYmxlIHVudGlsIGFmdGVyIHRoZSBjb21wb25lbnQgaGFzIG1vdW50ZWQuCisgICAgdmFyIG5v ZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KTsKKyAg ICB2YXIgdGV4dENvbnRlbnQgPSBub2RlLnRleHRDb250ZW50OworCisgICAgLy8gT25seSBzZXQg bm9kZS52YWx1ZSBpZiB0ZXh0Q29udGVudCBpcyBlcXVhbCB0byB0aGUgZXhwZWN0ZWQKKyAgICAv LyBpbml0aWFsIHZhbHVlLiBJbiBJRTEwL0lFMTEgdGhlcmUgaXMgYSBidWcgd2hlcmUgdGhlIHBs YWNlaG9sZGVyIGF0dHJpYnV0ZQorICAgIC8vIHdpbGwgcG9wdWxhdGUgdGV4dENvbnRlbnQgYXMg d2VsbC4KKyAgICAvLyBodHRwczovL2RldmVsb3Blci5taWNyb3NvZnQuY29tL21pY3Jvc29mdC1l ZGdlL3BsYXRmb3JtL2lzc3Vlcy8xMDE1MjUvCisgICAgaWYgKHRleHRDb250ZW50ID09PSBpbnN0 Ll93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKSB7CisgICAgICBub2RlLnZhbHVlID0gdGV4dENv bnRlbnQ7CisgICAgfQorICB9Cit9OworCitmdW5jdGlvbiBfaGFuZGxlQ2hhbmdlKGV2ZW50KSB7 CisgIHZhciBwcm9wcyA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzOworICB2YXIgcmV0dXJu VmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmV4ZWN1dGVPbkNoYW5nZShwcm9wcywgZXZlbnQpOwor ICBSZWFjdFVwZGF0ZXMuYXNhcChmb3JjZVVwZGF0ZUlmTW91bnRlZCwgdGhpcyk7CisgIHJldHVy biByZXR1cm5WYWx1ZTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTVRleHRhcmVhOwor fSx7IjEyNSI6MTI1LCIxNTAiOjE1MCwiMTU3IjoxNTcsIjE1OCI6MTU4LCIyNCI6MjQsIjM0Ijoz NCwiODIiOjgyfV0sNDc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisg KiBDb3B5cmlnaHQgMjAxNS1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyBy ZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBC U0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9v dCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICog b2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUg c2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9wcm9kSW52 YXJpYW50ID0gX2RlcmVxXygxMjUpOworCit2YXIgaW52YXJpYW50ID0gX2RlcmVxXygxNTApOwor CisvKioKKyAqIFJldHVybiB0aGUgbG93ZXN0IGNvbW1vbiBhbmNlc3RvciBvZiBBIGFuZCBCLCBv ciBudWxsIGlmIHRoZXkgYXJlIGluCisgKiBkaWZmZXJlbnQgdHJlZXMuCisgKi8KK2Z1bmN0aW9u IGdldExvd2VzdENvbW1vbkFuY2VzdG9yKGluc3RBLCBpbnN0QikgeworICAhKCdfaG9zdE5vZGUn IGluIGluc3RBKSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChm YWxzZSwgJ2dldE5vZGVGcm9tSW5zdGFuY2U6IEludmFsaWQgYXJndW1lbnQuJykgOiBfcHJvZElu dmFyaWFudCgnMzMnKSA6IHZvaWQgMDsKKyAgISgnX2hvc3ROb2RlJyBpbiBpbnN0QikgPyAiZGV2 ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdnZXROb2RlRnJv bUluc3RhbmNlOiBJbnZhbGlkIGFyZ3VtZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzMzJykgOiB2 b2lkIDA7CisKKyAgdmFyIGRlcHRoQSA9IDA7CisgIGZvciAodmFyIHRlbXBBID0gaW5zdEE7IHRl bXBBOyB0ZW1wQSA9IHRlbXBBLl9ob3N0UGFyZW50KSB7CisgICAgZGVwdGhBKys7CisgIH0KKyAg dmFyIGRlcHRoQiA9IDA7CisgIGZvciAodmFyIHRlbXBCID0gaW5zdEI7IHRlbXBCOyB0ZW1wQiA9 IHRlbXBCLl9ob3N0UGFyZW50KSB7CisgICAgZGVwdGhCKys7CisgIH0KKworICAvLyBJZiBBIGlz IGRlZXBlciwgY3Jhd2wgdXAuCisgIHdoaWxlIChkZXB0aEEgLSBkZXB0aEIgPiAwKSB7CisgICAg aW5zdEEgPSBpbnN0QS5faG9zdFBhcmVudDsKKyAgICBkZXB0aEEtLTsKKyAgfQorCisgIC8vIElm IEIgaXMgZGVlcGVyLCBjcmF3bCB1cC4KKyAgd2hpbGUgKGRlcHRoQiAtIGRlcHRoQSA+IDApIHsK KyAgICBpbnN0QiA9IGluc3RCLl9ob3N0UGFyZW50OworICAgIGRlcHRoQi0tOworICB9CisKKyAg Ly8gV2FsayBpbiBsb2Nrc3RlcCB1bnRpbCB3ZSBmaW5kIGEgbWF0Y2guCisgIHZhciBkZXB0aCA9 IGRlcHRoQTsKKyAgd2hpbGUgKGRlcHRoLS0pIHsKKyAgICBpZiAoaW5zdEEgPT09IGluc3RCKSB7 CisgICAgICByZXR1cm4gaW5zdEE7CisgICAgfQorICAgIGluc3RBID0gaW5zdEEuX2hvc3RQYXJl bnQ7CisgICAgaW5zdEIgPSBpbnN0Qi5faG9zdFBhcmVudDsKKyAgfQorICByZXR1cm4gbnVsbDsK K30KKworLyoqCisgKiBSZXR1cm4gaWYgQSBpcyBhbiBhbmNlc3RvciBvZiBCLgorICovCitmdW5j dGlvbiBpc0FuY2VzdG9yKGluc3RBLCBpbnN0QikgeworICAhKCdfaG9zdE5vZGUnIGluIGluc3RB KSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2lz QW5jZXN0b3I6IEludmFsaWQgYXJndW1lbnQuJykgOiBfcHJvZEludmFyaWFudCgnMzUnKSA6IHZv aWQgMDsKKyAgISgnX2hvc3ROb2RlJyBpbiBpbnN0QikgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJv ZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdpc0FuY2VzdG9yOiBJbnZhbGlkIGFyZ3VtZW50 LicpIDogX3Byb2RJbnZhcmlhbnQoJzM1JykgOiB2b2lkIDA7CisKKyAgd2hpbGUgKGluc3RCKSB7 CisgICAgaWYgKGluc3RCID09PSBpbnN0QSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQor ICAgIGluc3RCID0gaW5zdEIuX2hvc3RQYXJlbnQ7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQor CisvKioKKyAqIFJldHVybiB0aGUgcGFyZW50IGluc3RhbmNlIG9mIHRoZSBwYXNzZWQtaW4gaW5z dGFuY2UuCisgKi8KK2Z1bmN0aW9uIGdldFBhcmVudEluc3RhbmNlKGluc3QpIHsKKyAgISgnX2hv c3ROb2RlJyBpbiBpbnN0KSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFy aWFudChmYWxzZSwgJ2dldFBhcmVudEluc3RhbmNlOiBJbnZhbGlkIGFyZ3VtZW50LicpIDogX3By b2RJbnZhcmlhbnQoJzM2JykgOiB2b2lkIDA7CisKKyAgcmV0dXJuIGluc3QuX2hvc3RQYXJlbnQ7 Cit9CisKKy8qKgorICogU2ltdWxhdGVzIHRoZSB0cmF2ZXJzYWwgb2YgYSB0d28tcGhhc2UsIGNh cHR1cmUvYnViYmxlIGV2ZW50IGRpc3BhdGNoLgorICovCitmdW5jdGlvbiB0cmF2ZXJzZVR3b1Bo YXNlKGluc3QsIGZuLCBhcmcpIHsKKyAgdmFyIHBhdGggPSBbXTsKKyAgd2hpbGUgKGluc3QpIHsK KyAgICBwYXRoLnB1c2goaW5zdCk7CisgICAgaW5zdCA9IGluc3QuX2hvc3RQYXJlbnQ7CisgIH0K KyAgdmFyIGk7CisgIGZvciAoaSA9IHBhdGgubGVuZ3RoOyBpLS0gPiAwOykgeworICAgIGZuKHBh dGhbaV0sICdjYXB0dXJlZCcsIGFyZyk7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IHBhdGgubGVu Z3RoOyBpKyspIHsKKyAgICBmbihwYXRoW2ldLCAnYnViYmxlZCcsIGFyZyk7CisgIH0KK30KKwor LyoqCisgKiBUcmF2ZXJzZXMgdGhlIElEIGhpZXJhcmNoeSBhbmQgaW52b2tlcyB0aGUgc3VwcGxp ZWQgYGNiYCBvbiBhbnkgSURzIHRoYXQKKyAqIHNob3VsZCB3b3VsZCByZWNlaXZlIGEgYG1vdXNl RW50ZXJgIG9yIGBtb3VzZUxlYXZlYCBldmVudC4KKyAqCisgKiBEb2VzIG5vdCBpbnZva2UgdGhl IGNhbGxiYWNrIG9uIHRoZSBuZWFyZXN0IGNvbW1vbiBhbmNlc3RvciBiZWNhdXNlIG5vdGhpbmcK KyAqICJlbnRlcmVkIiBvciAibGVmdCIgdGhhdCBlbGVtZW50LgorICovCitmdW5jdGlvbiB0cmF2 ZXJzZUVudGVyTGVhdmUoZnJvbSwgdG8sIGZuLCBhcmdGcm9tLCBhcmdUbykgeworICB2YXIgY29t bW9uID0gZnJvbSAmJiB0byA/IGdldExvd2VzdENvbW1vbkFuY2VzdG9yKGZyb20sIHRvKSA6IG51 bGw7CisgIHZhciBwYXRoRnJvbSA9IFtdOworICB3aGlsZSAoZnJvbSAmJiBmcm9tICE9PSBjb21t b24pIHsKKyAgICBwYXRoRnJvbS5wdXNoKGZyb20pOworICAgIGZyb20gPSBmcm9tLl9ob3N0UGFy ZW50OworICB9CisgIHZhciBwYXRoVG8gPSBbXTsKKyAgd2hpbGUgKHRvICYmIHRvICE9PSBjb21t b24pIHsKKyAgICBwYXRoVG8ucHVzaCh0byk7CisgICAgdG8gPSB0by5faG9zdFBhcmVudDsKKyAg fQorICB2YXIgaTsKKyAgZm9yIChpID0gMDsgaSA8IHBhdGhGcm9tLmxlbmd0aDsgaSsrKSB7Cisg ICAgZm4ocGF0aEZyb21baV0sICdidWJibGVkJywgYXJnRnJvbSk7CisgIH0KKyAgZm9yIChpID0g cGF0aFRvLmxlbmd0aDsgaS0tID4gMDspIHsKKyAgICBmbihwYXRoVG9baV0sICdjYXB0dXJlZCcs IGFyZ1RvKTsKKyAgfQorfQorCittb2R1bGUuZXhwb3J0cyA9IHsKKyAgaXNBbmNlc3RvcjogaXNB bmNlc3RvciwKKyAgZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3I6IGdldExvd2VzdENvbW1vbkFuY2Vz dG9yLAorICBnZXRQYXJlbnRJbnN0YW5jZTogZ2V0UGFyZW50SW5zdGFuY2UsCisgIHRyYXZlcnNl VHdvUGhhc2U6IHRyYXZlcnNlVHdvUGhhc2UsCisgIHRyYXZlcnNlRW50ZXJMZWF2ZTogdHJhdmVy c2VFbnRlckxlYXZlCit9OworfSx7IjEyNSI6MTI1LCIxNTAiOjE1MH1dLDQ4OltmdW5jdGlvbihf ZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwg RmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3Vy Y2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4g dGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNl IHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZv dW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLwor CisndXNlIHN0cmljdCc7CisKK3ZhciBSZWFjdCA9IF9kZXJlcV8oMTM0KTsKK3ZhciBSZWFjdERP TSA9IF9kZXJlcV8oMzEpOworCit2YXIgUmVhY3RET01VTURFbnRyeSA9IFJlYWN0RE9NOworCitp ZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgIFJlYWN0RE9NVU1ERW50cnku X19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQgPSB7Cisg ICAgLy8gUmVhY3RQZXJmIGFuZCBSZWFjdFRlc3RVdGlscyBjdXJyZW50bHkgb25seSB3b3JrIHdp dGggdGhlIERPTSByZW5kZXJlcgorICAgIC8vIHNvIHdlIGV4cG9zZSB0aGVtIGZyb20gaGVyZSwg YnV0IG9ubHkgaW4gREVWIG1vZGUuCisgICAgUmVhY3RQZXJmOiBfZGVyZXFfKDcxKSwKKyAgICBS ZWFjdFRlc3RVdGlsczogX2RlcmVxXyg4MCkKKyAgfTsKK30KKworLy8gSW5qZWN0IFJlYWN0RE9N IGludG8gUmVhY3QgZm9yIHRoZSBhZGRvbnMgVU1EIGJ1aWxkIHRoYXQgZGVwZW5kcyBvbiBSZWFj dERPTSAoVHJhbnNpdGlvbkdyb3VwKS4KKy8vIFdlIGNhbiByZW1vdmUgdGhpcyBhZnRlciB3ZSBk ZXByZWNhdGUgYW5kIHJlbW92ZSB0aGUgYWRkb25zIFVNRCBidWlsZC4KK2lmIChSZWFjdC5hZGRv bnMpIHsKKyAgUmVhY3QuX19TRUNSRVRfSU5KRUNURURfUkVBQ1RfRE9NX0RPX05PVF9VU0VfT1Jf WU9VX1dJTExfQkVfRklSRUQgPSBSZWFjdERPTVVNREVudHJ5OworfQorCittb2R1bGUuZXhwb3J0 cyA9IFJlYWN0RE9NVU1ERW50cnk7Cit9LHsiMTM0IjoxMzQsIjMxIjozMSwiNzEiOjcxLCI4MCI6 ODB9XSw0OTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHly aWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVk LgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHls ZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVj dG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRl bnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRp cmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgRE9NUHJvcGVydHkgPSBf ZGVyZXFfKDExKTsKK3ZhciBFdmVudFBsdWdpblJlZ2lzdHJ5ID0gX2RlcmVxXygxOCk7Cit2YXIg UmVhY3RDb21wb25lbnRUcmVlSG9vayA9IF9kZXJlcV8oMTMyKTsKKwordmFyIHdhcm5pbmcgPSBf ZGVyZXFfKDE1Nyk7CisKK2lmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAg dmFyIHJlYWN0UHJvcHMgPSB7CisgICAgY2hpbGRyZW46IHRydWUsCisgICAgZGFuZ2Vyb3VzbHlT ZXRJbm5lckhUTUw6IHRydWUsCisgICAga2V5OiB0cnVlLAorICAgIHJlZjogdHJ1ZSwKKworICAg IGF1dG9Gb2N1czogdHJ1ZSwKKyAgICBkZWZhdWx0VmFsdWU6IHRydWUsCisgICAgdmFsdWVMaW5r OiB0cnVlLAorICAgIGRlZmF1bHRDaGVja2VkOiB0cnVlLAorICAgIGNoZWNrZWRMaW5rOiB0cnVl LAorICAgIGlubmVySFRNTDogdHJ1ZSwKKyAgICBzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5p bmc6IHRydWUsCisgICAgb25Gb2N1c0luOiB0cnVlLAorICAgIG9uRm9jdXNPdXQ6IHRydWUKKyAg fTsKKyAgdmFyIHdhcm5lZFByb3BlcnRpZXMgPSB7fTsKKworICB2YXIgdmFsaWRhdGVQcm9wZXJ0 eSA9IGZ1bmN0aW9uICh0YWdOYW1lLCBuYW1lLCBkZWJ1Z0lEKSB7CisgICAgaWYgKERPTVByb3Bl cnR5LnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSkgfHwgRE9NUHJvcGVydHkuaXNDdXN0 b21BdHRyaWJ1dGUobmFtZSkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAo cmVhY3RQcm9wcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiByZWFjdFByb3BzW25hbWVdIHx8IHdh cm5lZFByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgd2FybmVkUHJvcGVydGllc1tu YW1lXSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChFdmVudFBsdWdpblJl Z2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7Cisg ICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRy dWU7CisgICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOworCisgICAg Ly8gZGF0YS0qIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGxvd2VyY2FzZTsgc3VnZ2VzdCB0aGUgbG93 ZXJjYXNlIHZlcnNpb24KKyAgICB2YXIgc3RhbmRhcmROYW1lID0gRE9NUHJvcGVydHkuaXNDdXN0 b21BdHRyaWJ1dGUobG93ZXJDYXNlZE5hbWUpID8gbG93ZXJDYXNlZE5hbWUgOiBET01Qcm9wZXJ0 eS5nZXRQb3NzaWJsZVN0YW5kYXJkTmFtZS5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkg PyBET01Qcm9wZXJ0eS5nZXRQb3NzaWJsZVN0YW5kYXJkTmFtZVtsb3dlckNhc2VkTmFtZV0gOiBu dWxsOworCisgICAgdmFyIHJlZ2lzdHJhdGlvbk5hbWUgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LnBv c3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpID8g RXZlbnRQbHVnaW5SZWdpc3RyeS5wb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzW2xvd2VyQ2FzZWRO YW1lXSA6IG51bGw7CisKKyAgICBpZiAoc3RhbmRhcmROYW1lICE9IG51bGwpIHsKKyAgICAgICJk ZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdVbmtub3duIERP TSBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuICVzPyVzJywgbmFtZSwgc3RhbmRhcmROYW1lLCBS ZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKGRlYnVnSUQpKSA6IHZv aWQgMDsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFt ZSAhPSBudWxsKSB7CisgICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJu aW5nKGZhbHNlLCAnVW5rbm93biBldmVudCBoYW5kbGVyIHByb3BlcnR5ICVzLiBEaWQgeW91IG1l YW4gYCVzYD8lcycsIG5hbWUsIHJlZ2lzdHJhdGlvbk5hbWUsIFJlYWN0Q29tcG9uZW50VHJlZUhv b2suZ2V0U3RhY2tBZGRlbmR1bUJ5SUQoZGVidWdJRCkpIDogdm9pZCAwOworICAgICAgcmV0dXJu IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFdlIHdlcmUgdW5hYmxlIHRvIGd1ZXNzIHdo aWNoIHByb3AgdGhlIHVzZXIgaW50ZW5kZWQuCisgICAgICAvLyBJdCBpcyBsaWtlbHkgdGhhdCB0 aGUgdXNlciB3YXMganVzdCBibGluZGx5IHNwcmVhZGluZy9mb3J3YXJkaW5nIHByb3BzCisgICAg ICAvLyBDb21wb25lbnRzIHNob3VsZCBiZSBjYXJlZnVsIHRvIG9ubHkgcmVuZGVyIHZhbGlkIHBy b3BzL2F0dHJpYnV0ZXMuCisgICAgICAvLyBXYXJuaW5nIHdpbGwgYmUgaW52b2tlZCBpbiB3YXJu VW5rbm93blByb3BlcnRpZXMgdG8gYWxsb3cgZ3JvdXBpbmcuCisgICAgICByZXR1cm4gZmFsc2U7 CisgICAgfQorICB9OworfQorCit2YXIgd2FyblVua25vd25Qcm9wZXJ0aWVzID0gZnVuY3Rpb24g KGRlYnVnSUQsIGVsZW1lbnQpIHsKKyAgdmFyIHVua25vd25Qcm9wcyA9IFtdOworICBmb3IgKHZh ciBrZXkgaW4gZWxlbWVudC5wcm9wcykgeworICAgIHZhciBpc1ZhbGlkID0gdmFsaWRhdGVQcm9w ZXJ0eShlbGVtZW50LnR5cGUsIGtleSwgZGVidWdJRCk7CisgICAgaWYgKCFpc1ZhbGlkKSB7Cisg ICAgICB1bmtub3duUHJvcHMucHVzaChrZXkpOworICAgIH0KKyAgfQorCisgIHZhciB1bmtub3du UHJvcFN0cmluZyA9IHVua25vd25Qcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHsKKyAgICByZXR1 cm4gJ2AnICsgcHJvcCArICdgJzsKKyAgfSkuam9pbignLCAnKTsKKworICBpZiAodW5rbm93blBy b3BzLmxlbmd0aCA9PT0gMSkgeworICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/ IHdhcm5pbmcoZmFsc2UsICdVbmtub3duIHByb3AgJXMgb24gPCVzPiB0YWcuIFJlbW92ZSB0aGlz IHByb3AgZnJvbSB0aGUgZWxlbWVudC4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vZmIu bWUvcmVhY3QtdW5rbm93bi1wcm9wJXMnLCB1bmtub3duUHJvcFN0cmluZywgZWxlbWVudC50eXBl LCBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKGRlYnVnSUQpKSA6 IHZvaWQgMDsKKyAgfSBlbHNlIGlmICh1bmtub3duUHJvcHMubGVuZ3RoID4gMSkgeworICAgICJk ZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdVbmtub3duIHBy b3BzICVzIG9uIDwlcz4gdGFnLiBSZW1vdmUgdGhlc2UgcHJvcHMgZnJvbSB0aGUgZWxlbWVudC4g JyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vZmIubWUvcmVhY3QtdW5rbm93bi1wcm9wJXMn LCB1bmtub3duUHJvcFN0cmluZywgZWxlbWVudC50eXBlLCBSZWFjdENvbXBvbmVudFRyZWVIb29r LmdldFN0YWNrQWRkZW5kdW1CeUlEKGRlYnVnSUQpKSA6IHZvaWQgMDsKKyAgfQorfTsKKworZnVu Y3Rpb24gaGFuZGxlRWxlbWVudChkZWJ1Z0lELCBlbGVtZW50KSB7CisgIGlmIChlbGVtZW50ID09 IG51bGwgfHwgdHlwZW9mIGVsZW1lbnQudHlwZSAhPT0gJ3N0cmluZycpIHsKKyAgICByZXR1cm47 CisgIH0KKyAgaWYgKGVsZW1lbnQudHlwZS5pbmRleE9mKCctJykgPj0gMCB8fCBlbGVtZW50LnBy b3BzLmlzKSB7CisgICAgcmV0dXJuOworICB9CisgIHdhcm5Vbmtub3duUHJvcGVydGllcyhkZWJ1 Z0lELCBlbGVtZW50KTsKK30KKwordmFyIFJlYWN0RE9NVW5rbm93blByb3BlcnR5SG9vayA9IHsK KyAgb25CZWZvcmVNb3VudENvbXBvbmVudDogZnVuY3Rpb24gKGRlYnVnSUQsIGVsZW1lbnQpIHsK KyAgICBoYW5kbGVFbGVtZW50KGRlYnVnSUQsIGVsZW1lbnQpOworICB9LAorICBvbkJlZm9yZVVw ZGF0ZUNvbXBvbmVudDogZnVuY3Rpb24gKGRlYnVnSUQsIGVsZW1lbnQpIHsKKyAgICBoYW5kbGVF bGVtZW50KGRlYnVnSUQsIGVsZW1lbnQpOworICB9Cit9OworCittb2R1bGUuZXhwb3J0cyA9IFJl YWN0RE9NVW5rbm93blByb3BlcnR5SG9vazsKK30seyIxMSI6MTEsIjEzMiI6MTMyLCIxNTciOjE1 NywiMTgiOjE4fV0sNTA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisg KiBDb3B5cmlnaHQgMjAxNi1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyBy ZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBC U0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9v dCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICog b2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUg c2FtZSBkaXJlY3RvcnkuCisgKgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgUmVh Y3RJbnZhbGlkU2V0U3RhdGVXYXJuaW5nSG9vayA9IF9kZXJlcV8oNjUpOwordmFyIFJlYWN0SG9z dE9wZXJhdGlvbkhpc3RvcnlIb29rID0gX2RlcmVxXyg2MCk7Cit2YXIgUmVhY3RDb21wb25lbnRU cmVlSG9vayA9IF9kZXJlcV8oMTMyKTsKK3ZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IF9kZXJl cV8oMTM2KTsKKwordmFyIHBlcmZvcm1hbmNlTm93ID0gX2RlcmVxXygxNTUpOwordmFyIHdhcm5p bmcgPSBfZGVyZXFfKDE1Nyk7CisKK3ZhciBob29rcyA9IFtdOwordmFyIGRpZEhvb2tUaHJvd0Zv ckV2ZW50ID0ge307CisKK2Z1bmN0aW9uIGNhbGxIb29rKGV2ZW50LCBmbiwgY29udGV4dCwgYXJn MSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkgeworICB0cnkgeworICAgIGZuLmNhbGwoY29udGV4 dCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CisgIH0gY2F0Y2ggKGUpIHsKKyAgICAi ZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGRpZEhvb2tUaHJvd0ZvckV2 ZW50W2V2ZW50XSwgJ0V4Y2VwdGlvbiB0aHJvd24gYnkgaG9vayB3aGlsZSBoYW5kbGluZyAlczog JXMnLCBldmVudCwgZSArICdcbicgKyBlLnN0YWNrKSA6IHZvaWQgMDsKKyAgICBkaWRIb29rVGhy b3dGb3JFdmVudFtldmVudF0gPSB0cnVlOworICB9Cit9CisKK2Z1bmN0aW9uIGVtaXRFdmVudChl dmVudCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkgeworICBmb3IgKHZhciBpID0gMDsg aSA8IGhvb2tzLmxlbmd0aDsgaSsrKSB7CisgICAgdmFyIGhvb2sgPSBob29rc1tpXTsKKyAgICB2 YXIgZm4gPSBob29rW2V2ZW50XTsKKyAgICBpZiAoZm4pIHsKKyAgICAgIGNhbGxIb29rKGV2ZW50 LCBmbiwgaG9vaywgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CisgICAgfQorICB9Cit9 CisKK3ZhciBpc1Byb2ZpbGluZyA9IGZhbHNlOwordmFyIGZsdXNoSGlzdG9yeSA9IFtdOwordmFy IGxpZmVDeWNsZVRpbWVyU3RhY2sgPSBbXTsKK3ZhciBjdXJyZW50Rmx1c2hOZXN0aW5nID0gMDsK K3ZhciBjdXJyZW50Rmx1c2hNZWFzdXJlbWVudHMgPSBbXTsKK3ZhciBjdXJyZW50Rmx1c2hTdGFy dFRpbWUgPSAwOwordmFyIGN1cnJlbnRUaW1lckRlYnVnSUQgPSBudWxsOwordmFyIGN1cnJlbnRU aW1lclN0YXJ0VGltZSA9IDA7Cit2YXIgY3VycmVudFRpbWVyTmVzdGVkRmx1c2hEdXJhdGlvbiA9 IDA7Cit2YXIgY3VycmVudFRpbWVyVHlwZSA9IG51bGw7CisKK3ZhciBsaWZlQ3ljbGVUaW1lckhh c1dhcm5lZCA9IGZhbHNlOworCitmdW5jdGlvbiBjbGVhckhpc3RvcnkoKSB7CisgIFJlYWN0Q29t cG9uZW50VHJlZUhvb2sucHVyZ2VVbm1vdW50ZWRDb21wb25lbnRzKCk7CisgIFJlYWN0SG9zdE9w ZXJhdGlvbkhpc3RvcnlIb29rLmNsZWFySGlzdG9yeSgpOworfQorCitmdW5jdGlvbiBnZXRUcmVl U25hcHNob3QocmVnaXN0ZXJlZElEcykgeworICByZXR1cm4gcmVnaXN0ZXJlZElEcy5yZWR1Y2Uo ZnVuY3Rpb24gKHRyZWUsIGlkKSB7CisgICAgdmFyIG93bmVySUQgPSBSZWFjdENvbXBvbmVudFRy ZWVIb29rLmdldE93bmVySUQoaWQpOworICAgIHZhciBwYXJlbnRJRCA9IFJlYWN0Q29tcG9uZW50 VHJlZUhvb2suZ2V0UGFyZW50SUQoaWQpOworICAgIHRyZWVbaWRdID0geworICAgICAgZGlzcGxh eU5hbWU6IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0RGlzcGxheU5hbWUoaWQpLAorICAgICAg dGV4dDogUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRUZXh0KGlkKSwKKyAgICAgIHVwZGF0ZUNv dW50OiBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFVwZGF0ZUNvdW50KGlkKSwKKyAgICAgIGNo aWxkSURzOiBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldENoaWxkSURzKGlkKSwKKyAgICAgIC8v IFRleHQgbm9kZXMgZG9uJ3QgaGF2ZSBvd25lcnMgYnV0IHRoaXMgaXMgY2xvc2UgZW5vdWdoLgor ICAgICAgb3duZXJJRDogb3duZXJJRCB8fCBwYXJlbnRJRCAmJiBSZWFjdENvbXBvbmVudFRyZWVI b29rLmdldE93bmVySUQocGFyZW50SUQpIHx8IDAsCisgICAgICBwYXJlbnRJRDogcGFyZW50SUQK KyAgICB9OworICAgIHJldHVybiB0cmVlOworICB9LCB7fSk7Cit9CisKK2Z1bmN0aW9uIHJlc2V0 TWVhc3VyZW1lbnRzKCkgeworICB2YXIgcHJldmlvdXNTdGFydFRpbWUgPSBjdXJyZW50Rmx1c2hT dGFydFRpbWU7CisgIHZhciBwcmV2aW91c01lYXN1cmVtZW50cyA9IGN1cnJlbnRGbHVzaE1lYXN1 cmVtZW50czsKKyAgdmFyIHByZXZpb3VzT3BlcmF0aW9ucyA9IFJlYWN0SG9zdE9wZXJhdGlvbkhp c3RvcnlIb29rLmdldEhpc3RvcnkoKTsKKworICBpZiAoY3VycmVudEZsdXNoTmVzdGluZyA9PT0g MCkgeworICAgIGN1cnJlbnRGbHVzaFN0YXJ0VGltZSA9IDA7CisgICAgY3VycmVudEZsdXNoTWVh c3VyZW1lbnRzID0gW107CisgICAgY2xlYXJIaXN0b3J5KCk7CisgICAgcmV0dXJuOworICB9CisK KyAgaWYgKHByZXZpb3VzTWVhc3VyZW1lbnRzLmxlbmd0aCB8fCBwcmV2aW91c09wZXJhdGlvbnMu bGVuZ3RoKSB7CisgICAgdmFyIHJlZ2lzdGVyZWRJRHMgPSBSZWFjdENvbXBvbmVudFRyZWVIb29r LmdldFJlZ2lzdGVyZWRJRHMoKTsKKyAgICBmbHVzaEhpc3RvcnkucHVzaCh7CisgICAgICBkdXJh dGlvbjogcGVyZm9ybWFuY2VOb3coKSAtIHByZXZpb3VzU3RhcnRUaW1lLAorICAgICAgbWVhc3Vy ZW1lbnRzOiBwcmV2aW91c01lYXN1cmVtZW50cyB8fCBbXSwKKyAgICAgIG9wZXJhdGlvbnM6IHBy ZXZpb3VzT3BlcmF0aW9ucyB8fCBbXSwKKyAgICAgIHRyZWVTbmFwc2hvdDogZ2V0VHJlZVNuYXBz aG90KHJlZ2lzdGVyZWRJRHMpCisgICAgfSk7CisgIH0KKworICBjbGVhckhpc3RvcnkoKTsKKyAg Y3VycmVudEZsdXNoU3RhcnRUaW1lID0gcGVyZm9ybWFuY2VOb3coKTsKKyAgY3VycmVudEZsdXNo TWVhc3VyZW1lbnRzID0gW107Cit9CisKK2Z1bmN0aW9uIGNoZWNrRGVidWdJRChkZWJ1Z0lEKSB7 CisgIHZhciBhbGxvd1Jvb3QgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0g IT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlOworCisgIGlmIChhbGxvd1Jvb3Qg JiYgZGVidWdJRCA9PT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoIWRlYnVnSUQpIHsK KyAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnUmVh Y3REZWJ1Z1Rvb2w6IGRlYnVnSUQgbWF5IG5vdCBiZSBlbXB0eS4nKSA6IHZvaWQgMDsKKyAgfQor fQorCitmdW5jdGlvbiBiZWdpbkxpZmVDeWNsZVRpbWVyKGRlYnVnSUQsIHRpbWVyVHlwZSkgewor ICBpZiAoY3VycmVudEZsdXNoTmVzdGluZyA9PT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBp ZiAoY3VycmVudFRpbWVyVHlwZSAmJiAhbGlmZUN5Y2xlVGltZXJIYXNXYXJuZWQpIHsKKyAgICAi ZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnVGhlcmUgaXMg YW4gaW50ZXJuYWwgZXJyb3IgaW4gdGhlIFJlYWN0IHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50IGNv ZGUuICcgKyAnRGlkIG5vdCBleHBlY3QgJXMgdGltZXIgdG8gc3RhcnQgd2hpbGUgJXMgdGltZXIg aXMgc3RpbGwgaW4gJyArICdwcm9ncmVzcyBmb3IgJXMgaW5zdGFuY2UuJywgdGltZXJUeXBlLCBj dXJyZW50VGltZXJUeXBlIHx8ICdubycsIGRlYnVnSUQgPT09IGN1cnJlbnRUaW1lckRlYnVnSUQg PyAndGhlIHNhbWUnIDogJ2Fub3RoZXInKSA6IHZvaWQgMDsKKyAgICBsaWZlQ3ljbGVUaW1lckhh c1dhcm5lZCA9IHRydWU7CisgIH0KKyAgY3VycmVudFRpbWVyU3RhcnRUaW1lID0gcGVyZm9ybWFu Y2VOb3coKTsKKyAgY3VycmVudFRpbWVyTmVzdGVkRmx1c2hEdXJhdGlvbiA9IDA7CisgIGN1cnJl bnRUaW1lckRlYnVnSUQgPSBkZWJ1Z0lEOworICBjdXJyZW50VGltZXJUeXBlID0gdGltZXJUeXBl OworfQorCitmdW5jdGlvbiBlbmRMaWZlQ3ljbGVUaW1lcihkZWJ1Z0lELCB0aW1lclR5cGUpIHsK KyAgaWYgKGN1cnJlbnRGbHVzaE5lc3RpbmcgPT09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAg aWYgKGN1cnJlbnRUaW1lclR5cGUgIT09IHRpbWVyVHlwZSAmJiAhbGlmZUN5Y2xlVGltZXJIYXNX YXJuZWQpIHsKKyAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZh bHNlLCAnVGhlcmUgaXMgYW4gaW50ZXJuYWwgZXJyb3IgaW4gdGhlIFJlYWN0IHBlcmZvcm1hbmNl IG1lYXN1cmVtZW50IGNvZGUuICcgKyAnV2UgZGlkIG5vdCBleHBlY3QgJXMgdGltZXIgdG8gc3Rv cCB3aGlsZSAlcyB0aW1lciBpcyBzdGlsbCBpbiAnICsgJ3Byb2dyZXNzIGZvciAlcyBpbnN0YW5j ZS4gUGxlYXNlIHJlcG9ydCB0aGlzIGFzIGEgYnVnIGluIFJlYWN0LicsIHRpbWVyVHlwZSwgY3Vy cmVudFRpbWVyVHlwZSB8fCAnbm8nLCBkZWJ1Z0lEID09PSBjdXJyZW50VGltZXJEZWJ1Z0lEID8g J3RoZSBzYW1lJyA6ICdhbm90aGVyJykgOiB2b2lkIDA7CisgICAgbGlmZUN5Y2xlVGltZXJIYXNX YXJuZWQgPSB0cnVlOworICB9CisgIGlmIChpc1Byb2ZpbGluZykgeworICAgIGN1cnJlbnRGbHVz aE1lYXN1cmVtZW50cy5wdXNoKHsKKyAgICAgIHRpbWVyVHlwZTogdGltZXJUeXBlLAorICAgICAg aW5zdGFuY2VJRDogZGVidWdJRCwKKyAgICAgIGR1cmF0aW9uOiBwZXJmb3JtYW5jZU5vdygpIC0g Y3VycmVudFRpbWVyU3RhcnRUaW1lIC0gY3VycmVudFRpbWVyTmVzdGVkRmx1c2hEdXJhdGlvbgor ICAgIH0pOworICB9CisgIGN1cnJlbnRUaW1lclN0YXJ0VGltZSA9IDA7CisgIGN1cnJlbnRUaW1l ck5lc3RlZEZsdXNoRHVyYXRpb24gPSAwOworICBjdXJyZW50VGltZXJEZWJ1Z0lEID0gbnVsbDsK KyAgY3VycmVudFRpbWVyVHlwZSA9IG51bGw7Cit9CisKK2Z1bmN0aW9uIHBhdXNlQ3VycmVudExp ZmVDeWNsZVRpbWVyKCkgeworICB2YXIgY3VycmVudFRpbWVyID0geworICAgIHN0YXJ0VGltZTog Y3VycmVudFRpbWVyU3RhcnRUaW1lLAorICAgIG5lc3RlZEZsdXNoU3RhcnRUaW1lOiBwZXJmb3Jt YW5jZU5vdygpLAorICAgIGRlYnVnSUQ6IGN1cnJlbnRUaW1lckRlYnVnSUQsCisgICAgdGltZXJU eXBlOiBjdXJyZW50VGltZXJUeXBlCisgIH07CisgIGxpZmVDeWNsZVRpbWVyU3RhY2sucHVzaChj dXJyZW50VGltZXIpOworICBjdXJyZW50VGltZXJTdGFydFRpbWUgPSAwOworICBjdXJyZW50VGlt ZXJOZXN0ZWRGbHVzaER1cmF0aW9uID0gMDsKKyAgY3VycmVudFRpbWVyRGVidWdJRCA9IG51bGw7 CisgIGN1cnJlbnRUaW1lclR5cGUgPSBudWxsOworfQorCitmdW5jdGlvbiByZXN1bWVDdXJyZW50 TGlmZUN5Y2xlVGltZXIoKSB7CisgIHZhciBfbGlmZUN5Y2xlVGltZXJTdGFjayQgPSBsaWZlQ3lj bGVUaW1lclN0YWNrLnBvcCgpLAorICAgICAgc3RhcnRUaW1lID0gX2xpZmVDeWNsZVRpbWVyU3Rh Y2skLnN0YXJ0VGltZSwKKyAgICAgIG5lc3RlZEZsdXNoU3RhcnRUaW1lID0gX2xpZmVDeWNsZVRp bWVyU3RhY2skLm5lc3RlZEZsdXNoU3RhcnRUaW1lLAorICAgICAgZGVidWdJRCA9IF9saWZlQ3lj bGVUaW1lclN0YWNrJC5kZWJ1Z0lELAorICAgICAgdGltZXJUeXBlID0gX2xpZmVDeWNsZVRpbWVy U3RhY2skLnRpbWVyVHlwZTsKKworICB2YXIgbmVzdGVkRmx1c2hEdXJhdGlvbiA9IHBlcmZvcm1h bmNlTm93KCkgLSBuZXN0ZWRGbHVzaFN0YXJ0VGltZTsKKyAgY3VycmVudFRpbWVyU3RhcnRUaW1l ID0gc3RhcnRUaW1lOworICBjdXJyZW50VGltZXJOZXN0ZWRGbHVzaER1cmF0aW9uICs9IG5lc3Rl ZEZsdXNoRHVyYXRpb247CisgIGN1cnJlbnRUaW1lckRlYnVnSUQgPSBkZWJ1Z0lEOworICBjdXJy ZW50VGltZXJUeXBlID0gdGltZXJUeXBlOworfQorCit2YXIgbGFzdE1hcmtUaW1lU3RhbXAgPSAw OwordmFyIGNhblVzZVBlcmZvcm1hbmNlTWVhc3VyZSA9CisvLyAkRmxvd0ZpeE1lIGh0dHBzOi8v Z2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8yMzQ1Cit0eXBlb2YgcGVyZm9ybWFuY2Ug IT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBwZXJmb3JtYW5jZS5tYXJrID09PSAnZnVuY3Rpb24n ICYmIHR5cGVvZiBwZXJmb3JtYW5jZS5jbGVhck1hcmtzID09PSAnZnVuY3Rpb24nICYmIHR5cGVv ZiBwZXJmb3JtYW5jZS5tZWFzdXJlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBwZXJmb3JtYW5j ZS5jbGVhck1lYXN1cmVzID09PSAnZnVuY3Rpb24nOworCitmdW5jdGlvbiBzaG91bGRNYXJrKGRl YnVnSUQpIHsKKyAgaWYgKCFpc1Byb2ZpbGluZyB8fCAhY2FuVXNlUGVyZm9ybWFuY2VNZWFzdXJl KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHZhciBlbGVtZW50ID0gUmVhY3RDb21wb25l bnRUcmVlSG9vay5nZXRFbGVtZW50KGRlYnVnSUQpOworICBpZiAoZWxlbWVudCA9PSBudWxsIHx8 IHR5cGVvZiBlbGVtZW50ICE9PSAnb2JqZWN0JykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQor ICB2YXIgaXNIb3N0RWxlbWVudCA9IHR5cGVvZiBlbGVtZW50LnR5cGUgPT09ICdzdHJpbmcnOwor ICBpZiAoaXNIb3N0RWxlbWVudCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4g dHJ1ZTsKK30KKworZnVuY3Rpb24gbWFya0JlZ2luKGRlYnVnSUQsIG1hcmtUeXBlKSB7CisgIGlm ICghc2hvdWxkTWFyayhkZWJ1Z0lEKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHZhciBtYXJr TmFtZSA9IGRlYnVnSUQgKyAnOjonICsgbWFya1R5cGU7CisgIGxhc3RNYXJrVGltZVN0YW1wID0g cGVyZm9ybWFuY2VOb3coKTsKKyAgcGVyZm9ybWFuY2UubWFyayhtYXJrTmFtZSk7Cit9CisKK2Z1 bmN0aW9uIG1hcmtFbmQoZGVidWdJRCwgbWFya1R5cGUpIHsKKyAgaWYgKCFzaG91bGRNYXJrKGRl YnVnSUQpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgdmFyIG1hcmtOYW1lID0gZGVidWdJRCAr ICc6OicgKyBtYXJrVHlwZTsKKyAgdmFyIGRpc3BsYXlOYW1lID0gUmVhY3RDb21wb25lbnRUcmVl SG9vay5nZXREaXNwbGF5TmFtZShkZWJ1Z0lEKSB8fCAnVW5rbm93bic7CisKKyAgLy8gQ2hyb21l IGhhcyBhbiBpc3N1ZSBvZiBkcm9wcGluZyBtYXJrZXJzIHJlY29yZGVkIHRvbyBmYXN0OgorICAv LyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD02 NDA2NTIKKyAgLy8gVG8gd29yayBhcm91bmQgdGhpcywgd2Ugd2lsbCBub3QgcmVwb3J0IHZlcnkg c21hbGwgbWVhc3VyZW1lbnRzLgorICAvLyBJIGRldGVybWluZWQgdGhlIG1hZ2ljIG51bWJlciBi eSB0d2Vha2luZyBpdCBiYWNrIGFuZCBmb3J0aC4KKyAgLy8gMC4wNW1zIHdhcyBlbm91Z2ggdG8g cHJldmVudCB0aGUgaXNzdWUsIGJ1dCBJIHNldCBpdCB0byAwLjFtcyB0byBiZSBzYWZlLgorICAv LyBXaGVuIHRoZSBidWcgaXMgZml4ZWQsIHdlIGNhbiBgbWVhc3VyZSgpYCB1bmNvbmRpdGlvbmFs bHkgaWYgd2Ugd2FudCB0by4KKyAgdmFyIHRpbWVTdGFtcCA9IHBlcmZvcm1hbmNlTm93KCk7Cisg IGlmICh0aW1lU3RhbXAgLSBsYXN0TWFya1RpbWVTdGFtcCA+IDAuMSkgeworICAgIHZhciBtZWFz dXJlbWVudE5hbWUgPSBkaXNwbGF5TmFtZSArICcgWycgKyBtYXJrVHlwZSArICddJzsKKyAgICBw ZXJmb3JtYW5jZS5tZWFzdXJlKG1lYXN1cmVtZW50TmFtZSwgbWFya05hbWUpOworICB9CisKKyAg cGVyZm9ybWFuY2UuY2xlYXJNYXJrcyhtYXJrTmFtZSk7CisgIHBlcmZvcm1hbmNlLmNsZWFyTWVh c3VyZXMobWVhc3VyZW1lbnROYW1lKTsKK30KKwordmFyIFJlYWN0RGVidWdUb29sID0geworICBh ZGRIb29rOiBmdW5jdGlvbiAoaG9vaykgeworICAgIGhvb2tzLnB1c2goaG9vayk7CisgIH0sCisg IHJlbW92ZUhvb2s6IGZ1bmN0aW9uIChob29rKSB7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBo b29rcy5sZW5ndGg7IGkrKykgeworICAgICAgaWYgKGhvb2tzW2ldID09PSBob29rKSB7CisgICAg ICAgIGhvb2tzLnNwbGljZShpLCAxKTsKKyAgICAgICAgaS0tOworICAgICAgfQorICAgIH0KKyAg fSwKKyAgaXNQcm9maWxpbmc6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gaXNQcm9maWxpbmc7 CisgIH0sCisgIGJlZ2luUHJvZmlsaW5nOiBmdW5jdGlvbiAoKSB7CisgICAgaWYgKGlzUHJvZmls aW5nKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaXNQcm9maWxpbmcgPSB0cnVlOwor ICAgIGZsdXNoSGlzdG9yeS5sZW5ndGggPSAwOworICAgIHJlc2V0TWVhc3VyZW1lbnRzKCk7Cisg ICAgUmVhY3REZWJ1Z1Rvb2wuYWRkSG9vayhSZWFjdEhvc3RPcGVyYXRpb25IaXN0b3J5SG9vayk7 CisgIH0sCisgIGVuZFByb2ZpbGluZzogZnVuY3Rpb24gKCkgeworICAgIGlmICghaXNQcm9maWxp bmcpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpc1Byb2ZpbGluZyA9IGZhbHNlOwor ICAgIHJlc2V0TWVhc3VyZW1lbnRzKCk7CisgICAgUmVhY3REZWJ1Z1Rvb2wucmVtb3ZlSG9vayhS ZWFjdEhvc3RPcGVyYXRpb25IaXN0b3J5SG9vayk7CisgIH0sCisgIGdldEZsdXNoSGlzdG9yeTog ZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBmbHVzaEhpc3Rvcnk7CisgIH0sCisgIG9uQmVnaW5G bHVzaDogZnVuY3Rpb24gKCkgeworICAgIGN1cnJlbnRGbHVzaE5lc3RpbmcrKzsKKyAgICByZXNl dE1lYXN1cmVtZW50cygpOworICAgIHBhdXNlQ3VycmVudExpZmVDeWNsZVRpbWVyKCk7CisgICAg ZW1pdEV2ZW50KCdvbkJlZ2luRmx1c2gnKTsKKyAgfSwKKyAgb25FbmRGbHVzaDogZnVuY3Rpb24g KCkgeworICAgIHJlc2V0TWVhc3VyZW1lbnRzKCk7CisgICAgY3VycmVudEZsdXNoTmVzdGluZy0t OworICAgIHJlc3VtZUN1cnJlbnRMaWZlQ3ljbGVUaW1lcigpOworICAgIGVtaXRFdmVudCgnb25F bmRGbHVzaCcpOworICB9LAorICBvbkJlZ2luTGlmZUN5Y2xlVGltZXI6IGZ1bmN0aW9uIChkZWJ1 Z0lELCB0aW1lclR5cGUpIHsKKyAgICBjaGVja0RlYnVnSUQoZGVidWdJRCk7CisgICAgZW1pdEV2 ZW50KCdvbkJlZ2luTGlmZUN5Y2xlVGltZXInLCBkZWJ1Z0lELCB0aW1lclR5cGUpOworICAgIG1h cmtCZWdpbihkZWJ1Z0lELCB0aW1lclR5cGUpOworICAgIGJlZ2luTGlmZUN5Y2xlVGltZXIoZGVi dWdJRCwgdGltZXJUeXBlKTsKKyAgfSwKKyAgb25FbmRMaWZlQ3ljbGVUaW1lcjogZnVuY3Rpb24g KGRlYnVnSUQsIHRpbWVyVHlwZSkgeworICAgIGNoZWNrRGVidWdJRChkZWJ1Z0lEKTsKKyAgICBl bmRMaWZlQ3ljbGVUaW1lcihkZWJ1Z0lELCB0aW1lclR5cGUpOworICAgIG1hcmtFbmQoZGVidWdJ RCwgdGltZXJUeXBlKTsKKyAgICBlbWl0RXZlbnQoJ29uRW5kTGlmZUN5Y2xlVGltZXInLCBkZWJ1 Z0lELCB0aW1lclR5cGUpOworICB9LAorICBvbkJlZ2luUHJvY2Vzc2luZ0NoaWxkQ29udGV4dDog ZnVuY3Rpb24gKCkgeworICAgIGVtaXRFdmVudCgnb25CZWdpblByb2Nlc3NpbmdDaGlsZENvbnRl eHQnKTsKKyAgfSwKKyAgb25FbmRQcm9jZXNzaW5nQ2hpbGRDb250ZXh0OiBmdW5jdGlvbiAoKSB7 CisgICAgZW1pdEV2ZW50KCdvbkVuZFByb2Nlc3NpbmdDaGlsZENvbnRleHQnKTsKKyAgfSwKKyAg b25Ib3N0T3BlcmF0aW9uOiBmdW5jdGlvbiAob3BlcmF0aW9uKSB7CisgICAgY2hlY2tEZWJ1Z0lE KG9wZXJhdGlvbi5pbnN0YW5jZUlEKTsKKyAgICBlbWl0RXZlbnQoJ29uSG9zdE9wZXJhdGlvbics IG9wZXJhdGlvbik7CisgIH0sCisgIG9uU2V0U3RhdGU6IGZ1bmN0aW9uICgpIHsKKyAgICBlbWl0 RXZlbnQoJ29uU2V0U3RhdGUnKTsKKyAgfSwKKyAgb25TZXRDaGlsZHJlbjogZnVuY3Rpb24gKGRl YnVnSUQsIGNoaWxkRGVidWdJRHMpIHsKKyAgICBjaGVja0RlYnVnSUQoZGVidWdJRCk7CisgICAg Y2hpbGREZWJ1Z0lEcy5mb3JFYWNoKGNoZWNrRGVidWdJRCk7CisgICAgZW1pdEV2ZW50KCdvblNl dENoaWxkcmVuJywgZGVidWdJRCwgY2hpbGREZWJ1Z0lEcyk7CisgIH0sCisgIG9uQmVmb3JlTW91 bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChkZWJ1Z0lELCBlbGVtZW50LCBwYXJlbnREZWJ1Z0lEKSB7 CisgICAgY2hlY2tEZWJ1Z0lEKGRlYnVnSUQpOworICAgIGNoZWNrRGVidWdJRChwYXJlbnREZWJ1 Z0lELCB0cnVlKTsKKyAgICBlbWl0RXZlbnQoJ29uQmVmb3JlTW91bnRDb21wb25lbnQnLCBkZWJ1 Z0lELCBlbGVtZW50LCBwYXJlbnREZWJ1Z0lEKTsKKyAgICBtYXJrQmVnaW4oZGVidWdJRCwgJ21v dW50Jyk7CisgIH0sCisgIG9uTW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChkZWJ1Z0lEKSB7Cisg ICAgY2hlY2tEZWJ1Z0lEKGRlYnVnSUQpOworICAgIG1hcmtFbmQoZGVidWdJRCwgJ21vdW50Jyk7 CisgICAgZW1pdEV2ZW50KCdvbk1vdW50Q29tcG9uZW50JywgZGVidWdJRCk7CisgIH0sCisgIG9u QmVmb3JlVXBkYXRlQ29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCwgZWxlbWVudCkgeworICAg IGNoZWNrRGVidWdJRChkZWJ1Z0lEKTsKKyAgICBlbWl0RXZlbnQoJ29uQmVmb3JlVXBkYXRlQ29t cG9uZW50JywgZGVidWdJRCwgZWxlbWVudCk7CisgICAgbWFya0JlZ2luKGRlYnVnSUQsICd1cGRh dGUnKTsKKyAgfSwKKyAgb25VcGRhdGVDb21wb25lbnQ6IGZ1bmN0aW9uIChkZWJ1Z0lEKSB7Cisg ICAgY2hlY2tEZWJ1Z0lEKGRlYnVnSUQpOworICAgIG1hcmtFbmQoZGVidWdJRCwgJ3VwZGF0ZScp OworICAgIGVtaXRFdmVudCgnb25VcGRhdGVDb21wb25lbnQnLCBkZWJ1Z0lEKTsKKyAgfSwKKyAg b25CZWZvcmVVbm1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCkgeworICAgIGNoZWNr RGVidWdJRChkZWJ1Z0lEKTsKKyAgICBlbWl0RXZlbnQoJ29uQmVmb3JlVW5tb3VudENvbXBvbmVu dCcsIGRlYnVnSUQpOworICAgIG1hcmtCZWdpbihkZWJ1Z0lELCAndW5tb3VudCcpOworICB9LAor ICBvblVubW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChkZWJ1Z0lEKSB7CisgICAgY2hlY2tEZWJ1 Z0lEKGRlYnVnSUQpOworICAgIG1hcmtFbmQoZGVidWdJRCwgJ3VubW91bnQnKTsKKyAgICBlbWl0 RXZlbnQoJ29uVW5tb3VudENvbXBvbmVudCcsIGRlYnVnSUQpOworICB9LAorICBvblRlc3RFdmVu dDogZnVuY3Rpb24gKCkgeworICAgIGVtaXRFdmVudCgnb25UZXN0RXZlbnQnKTsKKyAgfQorfTsK KworLy8gVE9ETyByZW1vdmUgdGhlc2Ugd2hlbiBSTi93d3cgZ2V0cyB1cGRhdGVkCitSZWFjdERl YnVnVG9vbC5hZGREZXZ0b29sID0gUmVhY3REZWJ1Z1Rvb2wuYWRkSG9vazsKK1JlYWN0RGVidWdU b29sLnJlbW92ZURldnRvb2wgPSBSZWFjdERlYnVnVG9vbC5yZW1vdmVIb29rOworCitSZWFjdERl YnVnVG9vbC5hZGRIb29rKFJlYWN0SW52YWxpZFNldFN0YXRlV2FybmluZ0hvb2spOworUmVhY3RE ZWJ1Z1Rvb2wuYWRkSG9vayhSZWFjdENvbXBvbmVudFRyZWVIb29rKTsKK3ZhciB1cmwgPSBFeGVj dXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gJiYgd2luZG93LmxvY2F0aW9uLmhyZWYgfHwgJyc7 CitpZiAoL1s/Jl1yZWFjdF9wZXJmXGIvLnRlc3QodXJsKSkgeworICBSZWFjdERlYnVnVG9vbC5i ZWdpblByb2ZpbGluZygpOworfQorCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0RGVidWdUb29sOwor fSx7IjEzMiI6MTMyLCIxMzYiOjEzNiwiMTU1IjoxNTUsIjE1NyI6MTU3LCI2MCI6NjAsIjY1Ijo2 NX1dLDUxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJp Z2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQu CisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxl IGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0 b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVu dCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGly ZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfYXNzaWduID0gX2RlcmVx XygxNTgpOworCit2YXIgUmVhY3RVcGRhdGVzID0gX2RlcmVxXyg4Mik7Cit2YXIgVHJhbnNhY3Rp b24gPSBfZGVyZXFfKDEwMCk7CisKK3ZhciBlbXB0eUZ1bmN0aW9uID0gX2RlcmVxXygxNDIpOwor Cit2YXIgUkVTRVRfQkFUQ0hFRF9VUERBVEVTID0geworICBpbml0aWFsaXplOiBlbXB0eUZ1bmN0 aW9uLAorICBjbG9zZTogZnVuY3Rpb24gKCkgeworICAgIFJlYWN0RGVmYXVsdEJhdGNoaW5nU3Ry YXRlZ3kuaXNCYXRjaGluZ1VwZGF0ZXMgPSBmYWxzZTsKKyAgfQorfTsKKwordmFyIEZMVVNIX0JB VENIRURfVVBEQVRFUyA9IHsKKyAgaW5pdGlhbGl6ZTogZW1wdHlGdW5jdGlvbiwKKyAgY2xvc2U6 IFJlYWN0VXBkYXRlcy5mbHVzaEJhdGNoZWRVcGRhdGVzLmJpbmQoUmVhY3RVcGRhdGVzKQorfTsK KwordmFyIFRSQU5TQUNUSU9OX1dSQVBQRVJTID0gW0ZMVVNIX0JBVENIRURfVVBEQVRFUywgUkVT RVRfQkFUQ0hFRF9VUERBVEVTXTsKKworZnVuY3Rpb24gUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJh dGVneVRyYW5zYWN0aW9uKCkgeworICB0aGlzLnJlaW5pdGlhbGl6ZVRyYW5zYWN0aW9uKCk7Cit9 CisKK19hc3NpZ24oUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVneVRyYW5zYWN0aW9uLnByb3Rv dHlwZSwgVHJhbnNhY3Rpb24sIHsKKyAgZ2V0VHJhbnNhY3Rpb25XcmFwcGVyczogZnVuY3Rpb24g KCkgeworICAgIHJldHVybiBUUkFOU0FDVElPTl9XUkFQUEVSUzsKKyAgfQorfSk7CisKK3ZhciB0 cmFuc2FjdGlvbiA9IG5ldyBSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5VHJhbnNhY3Rpb24o KTsKKwordmFyIFJlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3kgPSB7CisgIGlzQmF0Y2hpbmdV cGRhdGVzOiBmYWxzZSwKKworICAvKioKKyAgICogQ2FsbCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24g aW4gYSBjb250ZXh0IHdpdGhpbiB3aGljaCBjYWxscyB0byBgc2V0U3RhdGVgCisgICAqIGFuZCBm cmllbmRzIGFyZSBiYXRjaGVkIHN1Y2ggdGhhdCBjb21wb25lbnRzIGFyZW4ndCB1cGRhdGVkIHVu bmVjZXNzYXJpbHkuCisgICAqLworICBiYXRjaGVkVXBkYXRlczogZnVuY3Rpb24gKGNhbGxiYWNr LCBhLCBiLCBjLCBkLCBlKSB7CisgICAgdmFyIGFscmVhZHlCYXRjaGluZ1VwZGF0ZXMgPSBSZWFj dERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5LmlzQmF0Y2hpbmdVcGRhdGVzOworCisgICAgUmVhY3RE ZWZhdWx0QmF0Y2hpbmdTdHJhdGVneS5pc0JhdGNoaW5nVXBkYXRlcyA9IHRydWU7CisKKyAgICAv LyBUaGUgY29kZSBpcyB3cml0dGVuIHRoaXMgd2F5IHRvIGF2b2lkIGV4dHJhIGFsbG9jYXRpb25z CisgICAgaWYgKGFscmVhZHlCYXRjaGluZ1VwZGF0ZXMpIHsKKyAgICAgIHJldHVybiBjYWxsYmFj ayhhLCBiLCBjLCBkLCBlKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHRyYW5zYWN0aW9u LnBlcmZvcm0oY2FsbGJhY2ssIG51bGwsIGEsIGIsIGMsIGQsIGUpOworICAgIH0KKyAgfQorfTsK KworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5OworfSx7IjEw MCI6MTAwLCIxNDIiOjE0MiwiMTU4IjoxNTgsIjgyIjo4Mn1dLDUyOltmdW5jdGlvbihfZGVyZXFf LG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJv b2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29k ZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisg KiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUu IEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGlu IHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNl IHN0cmljdCc7CisKK3ZhciBBUklBRE9NUHJvcGVydHlDb25maWcgPSBfZGVyZXFfKDEpOwordmFy IEJlZm9yZUlucHV0RXZlbnRQbHVnaW4gPSBfZGVyZXFfKDMpOwordmFyIENoYW5nZUV2ZW50UGx1 Z2luID0gX2RlcmVxXyg3KTsKK3ZhciBEZWZhdWx0RXZlbnRQbHVnaW5PcmRlciA9IF9kZXJlcV8o MTQpOwordmFyIEVudGVyTGVhdmVFdmVudFBsdWdpbiA9IF9kZXJlcV8oMTUpOwordmFyIEhUTUxE T01Qcm9wZXJ0eUNvbmZpZyA9IF9kZXJlcV8oMjIpOwordmFyIFJlYWN0Q29tcG9uZW50QnJvd3Nl ckVudmlyb25tZW50ID0gX2RlcmVxXygyOCk7Cit2YXIgUmVhY3RET01Db21wb25lbnQgPSBfZGVy ZXFfKDMyKTsKK3ZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSBfZGVyZXFfKDM0KTsKK3ZhciBS ZWFjdERPTUVtcHR5Q29tcG9uZW50ID0gX2RlcmVxXygzNik7Cit2YXIgUmVhY3RET01UcmVlVHJh dmVyc2FsID0gX2RlcmVxXyg0Nyk7Cit2YXIgUmVhY3RET01UZXh0Q29tcG9uZW50ID0gX2RlcmVx Xyg0NSk7Cit2YXIgUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVneSA9IF9kZXJlcV8oNTEpOwor dmFyIFJlYWN0RXZlbnRMaXN0ZW5lciA9IF9kZXJlcV8oNTcpOwordmFyIFJlYWN0SW5qZWN0aW9u ID0gX2RlcmVxXyg2MSk7Cit2YXIgUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbiA9IF9kZXJlcV8o NzQpOwordmFyIFNWR0RPTVByb3BlcnR5Q29uZmlnID0gX2RlcmVxXyg4NCk7Cit2YXIgU2VsZWN0 RXZlbnRQbHVnaW4gPSBfZGVyZXFfKDg1KTsKK3ZhciBTaW1wbGVFdmVudFBsdWdpbiA9IF9kZXJl cV8oODYpOworCit2YXIgYWxyZWFkeUluamVjdGVkID0gZmFsc2U7CisKK2Z1bmN0aW9uIGluamVj dCgpIHsKKyAgaWYgKGFscmVhZHlJbmplY3RlZCkgeworICAgIC8vIFRPRE86IFRoaXMgaXMgY3Vy cmVudGx5IHRydWUgYmVjYXVzZSB0aGVzZSBpbmplY3Rpb25zIGFyZSBzaGFyZWQgYmV0d2Vlbgor ICAgIC8vIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIgcGFja2FnZS4gVGhleSBzaG91bGQgYmUg YnVpbHQgaW5kZXBlbmRlbnRseQorICAgIC8vIGFuZCBub3Qgc2hhcmUgYW55IGluamVjdGlvbiBz dGF0ZS4gVGhlbiB0aGlzIHByb2JsZW0gd2lsbCBiZSBzb2x2ZWQuCisgICAgcmV0dXJuOworICB9 CisgIGFscmVhZHlJbmplY3RlZCA9IHRydWU7CisKKyAgUmVhY3RJbmplY3Rpb24uRXZlbnRFbWl0 dGVyLmluamVjdFJlYWN0RXZlbnRMaXN0ZW5lcihSZWFjdEV2ZW50TGlzdGVuZXIpOworCisgIC8q KgorICAgKiBJbmplY3QgbW9kdWxlcyBmb3IgcmVzb2x2aW5nIERPTSBoaWVyYXJjaHkgYW5kIHBs dWdpbiBvcmRlcmluZy4KKyAgICovCisgIFJlYWN0SW5qZWN0aW9uLkV2ZW50UGx1Z2luSHViLmlu amVjdEV2ZW50UGx1Z2luT3JkZXIoRGVmYXVsdEV2ZW50UGx1Z2luT3JkZXIpOworICBSZWFjdElu amVjdGlvbi5FdmVudFBsdWdpblV0aWxzLmluamVjdENvbXBvbmVudFRyZWUoUmVhY3RET01Db21w b25lbnRUcmVlKTsKKyAgUmVhY3RJbmplY3Rpb24uRXZlbnRQbHVnaW5VdGlscy5pbmplY3RUcmVl VHJhdmVyc2FsKFJlYWN0RE9NVHJlZVRyYXZlcnNhbCk7CisKKyAgLyoqCisgICAqIFNvbWUgaW1w b3J0YW50IGV2ZW50IHBsdWdpbnMgaW5jbHVkZWQgYnkgZGVmYXVsdCAod2l0aG91dCBoYXZpbmcg dG8gcmVxdWlyZQorICAgKiB0aGVtKS4KKyAgICovCisgIFJlYWN0SW5qZWN0aW9uLkV2ZW50UGx1 Z2luSHViLmluamVjdEV2ZW50UGx1Z2luc0J5TmFtZSh7CisgICAgU2ltcGxlRXZlbnRQbHVnaW46 IFNpbXBsZUV2ZW50UGx1Z2luLAorICAgIEVudGVyTGVhdmVFdmVudFBsdWdpbjogRW50ZXJMZWF2 ZUV2ZW50UGx1Z2luLAorICAgIENoYW5nZUV2ZW50UGx1Z2luOiBDaGFuZ2VFdmVudFBsdWdpbiwK KyAgICBTZWxlY3RFdmVudFBsdWdpbjogU2VsZWN0RXZlbnRQbHVnaW4sCisgICAgQmVmb3JlSW5w dXRFdmVudFBsdWdpbjogQmVmb3JlSW5wdXRFdmVudFBsdWdpbgorICB9KTsKKworICBSZWFjdElu amVjdGlvbi5Ib3N0Q29tcG9uZW50LmluamVjdEdlbmVyaWNDb21wb25lbnRDbGFzcyhSZWFjdERP TUNvbXBvbmVudCk7CisKKyAgUmVhY3RJbmplY3Rpb24uSG9zdENvbXBvbmVudC5pbmplY3RUZXh0 Q29tcG9uZW50Q2xhc3MoUmVhY3RET01UZXh0Q29tcG9uZW50KTsKKworICBSZWFjdEluamVjdGlv bi5ET01Qcm9wZXJ0eS5pbmplY3RET01Qcm9wZXJ0eUNvbmZpZyhBUklBRE9NUHJvcGVydHlDb25m aWcpOworICBSZWFjdEluamVjdGlvbi5ET01Qcm9wZXJ0eS5pbmplY3RET01Qcm9wZXJ0eUNvbmZp ZyhIVE1MRE9NUHJvcGVydHlDb25maWcpOworICBSZWFjdEluamVjdGlvbi5ET01Qcm9wZXJ0eS5p bmplY3RET01Qcm9wZXJ0eUNvbmZpZyhTVkdET01Qcm9wZXJ0eUNvbmZpZyk7CisKKyAgUmVhY3RJ bmplY3Rpb24uRW1wdHlDb21wb25lbnQuaW5qZWN0RW1wdHlDb21wb25lbnRGYWN0b3J5KGZ1bmN0 aW9uIChpbnN0YW50aWF0ZSkgeworICAgIHJldHVybiBuZXcgUmVhY3RET01FbXB0eUNvbXBvbmVu dChpbnN0YW50aWF0ZSk7CisgIH0pOworCisgIFJlYWN0SW5qZWN0aW9uLlVwZGF0ZXMuaW5qZWN0 UmVjb25jaWxlVHJhbnNhY3Rpb24oUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbik7CisgIFJlYWN0 SW5qZWN0aW9uLlVwZGF0ZXMuaW5qZWN0QmF0Y2hpbmdTdHJhdGVneShSZWFjdERlZmF1bHRCYXRj aGluZ1N0cmF0ZWd5KTsKKworICBSZWFjdEluamVjdGlvbi5Db21wb25lbnQuaW5qZWN0RW52aXJv bm1lbnQoUmVhY3RDb21wb25lbnRCcm93c2VyRW52aXJvbm1lbnQpOworfQorCittb2R1bGUuZXhw b3J0cyA9IHsKKyAgaW5qZWN0OiBpbmplY3QKK307Cit9LHsiMSI6MSwiMTQiOjE0LCIxNSI6MTUs IjIyIjoyMiwiMjgiOjI4LCIzIjozLCIzMiI6MzIsIjM0IjozNCwiMzYiOjM2LCI0NSI6NDUsIjQ3 Ijo0NywiNTEiOjUxLCI1NyI6NTcsIjYxIjo2MSwiNyI6NywiNzQiOjc0LCI4NCI6ODQsIjg1Ijo4 NSwiODYiOjg2fV0sNTM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisg KiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyBy ZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBC U0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9v dCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICog b2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUg c2FtZSBkaXJlY3RvcnkuCisgKgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOworCisvLyBUaGUg U3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQgdHlwZS4gSWYgdGhlcmUgaXMgbm8g bmF0aXZlIFN5bWJvbAorLy8gbm9yIHBvbHlmaWxsLCB0aGVuIGEgcGxhaW4gbnVtYmVyIGlzIHVz ZWQgZm9yIHBlcmZvcm1hbmNlLgorCit2YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gdHlwZW9mIFN5 bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2xbJ2ZvciddICYmIFN5bWJvbFsnZm9yJ10oJ3Jl YWN0LmVsZW1lbnQnKSB8fCAweGVhYzc7CisKK21vZHVsZS5leHBvcnRzID0gUkVBQ1RfRUxFTUVO VF9UWVBFOworfSx7fV0sNTQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoq CisgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0 cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRo ZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUg cm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAor ICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0 aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIGVtcHR5 Q29tcG9uZW50RmFjdG9yeTsKKwordmFyIFJlYWN0RW1wdHlDb21wb25lbnRJbmplY3Rpb24gPSB7 CisgIGluamVjdEVtcHR5Q29tcG9uZW50RmFjdG9yeTogZnVuY3Rpb24gKGZhY3RvcnkpIHsKKyAg ICBlbXB0eUNvbXBvbmVudEZhY3RvcnkgPSBmYWN0b3J5OworICB9Cit9OworCit2YXIgUmVhY3RF bXB0eUNvbXBvbmVudCA9IHsKKyAgY3JlYXRlOiBmdW5jdGlvbiAoaW5zdGFudGlhdGUpIHsKKyAg ICByZXR1cm4gZW1wdHlDb21wb25lbnRGYWN0b3J5KGluc3RhbnRpYXRlKTsKKyAgfQorfTsKKwor UmVhY3RFbXB0eUNvbXBvbmVudC5pbmplY3Rpb24gPSBSZWFjdEVtcHR5Q29tcG9uZW50SW5qZWN0 aW9uOworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0RW1wdHlDb21wb25lbnQ7Cit9LHt9XSw1NTpb ZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEz LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq IFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNl IGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0 aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRz IGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4K KyAqCisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBjYXVnaHRFcnJvciA9IG51bGw7 CisKKy8qKgorICogQ2FsbCBhIGZ1bmN0aW9uIHdoaWxlIGd1YXJkaW5nIGFnYWluc3QgZXJyb3Jz IHRoYXQgaGFwcGVucyB3aXRoaW4gaXQuCisgKgorICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2Yg dGhlIGd1YXJkIHRvIHVzZSBmb3IgbG9nZ2luZyBvciBkZWJ1Z2dpbmcKKyAqIEBwYXJhbSB7RnVu Y3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZQorICogQHBhcmFtIHsqfSBhIEZpcnN0 IGFyZ3VtZW50CisgKiBAcGFyYW0geyp9IGIgU2Vjb25kIGFyZ3VtZW50CisgKi8KK2Z1bmN0aW9u IGludm9rZUd1YXJkZWRDYWxsYmFjayhuYW1lLCBmdW5jLCBhKSB7CisgIHRyeSB7CisgICAgZnVu YyhhKTsKKyAgfSBjYXRjaCAoeCkgeworICAgIGlmIChjYXVnaHRFcnJvciA9PT0gbnVsbCkgewor ICAgICAgY2F1Z2h0RXJyb3IgPSB4OworICAgIH0KKyAgfQorfQorCit2YXIgUmVhY3RFcnJvclV0 aWxzID0geworICBpbnZva2VHdWFyZGVkQ2FsbGJhY2s6IGludm9rZUd1YXJkZWRDYWxsYmFjaywK KworICAvKioKKyAgICogSW52b2tlZCBieSBSZWFjdFRlc3RVdGlscy5TaW11bGF0ZSBzbyB0aGF0 IGFueSBlcnJvcnMgdGhyb3duIGJ5IHRoZSBldmVudAorICAgKiBoYW5kbGVyIGFyZSBzdXJlIHRv IGJlIHJldGhyb3duIGJ5IHJldGhyb3dDYXVnaHRFcnJvci4KKyAgICovCisgIGludm9rZUd1YXJk ZWRDYWxsYmFja1dpdGhDYXRjaDogaW52b2tlR3VhcmRlZENhbGxiYWNrLAorCisgIC8qKgorICAg KiBEdXJpbmcgZXhlY3V0aW9uIG9mIGd1YXJkZWQgZnVuY3Rpb25zIHdlIHdpbGwgY2FwdHVyZSB0 aGUgZmlyc3QgZXJyb3Igd2hpY2gKKyAgICogd2Ugd2lsbCByZXRocm93IHRvIGJlIGhhbmRsZWQg YnkgdGhlIHRvcCBsZXZlbCBlcnJvciBoYW5kbGVyLgorICAgKi8KKyAgcmV0aHJvd0NhdWdodEVy cm9yOiBmdW5jdGlvbiAoKSB7CisgICAgaWYgKGNhdWdodEVycm9yKSB7CisgICAgICB2YXIgZXJy b3IgPSBjYXVnaHRFcnJvcjsKKyAgICAgIGNhdWdodEVycm9yID0gbnVsbDsKKyAgICAgIHRocm93 IGVycm9yOworICAgIH0KKyAgfQorfTsKKworaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0 aW9uJykgeworICAvKioKKyAgICogVG8gaGVscCBkZXZlbG9wbWVudCB3ZSBjYW4gZ2V0IGJldHRl ciBkZXZ0b29scyBpbnRlZ3JhdGlvbiBieSBzaW11bGF0aW5nIGEKKyAgICogcmVhbCBicm93c2Vy IGV2ZW50LgorICAgKi8KKyAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5 cGVvZiB3aW5kb3cuZGlzcGF0Y2hFdmVudCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZG9jdW1l bnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFdmVudCA9PT0gJ2Z1 bmN0aW9uJykgeworICAgIHZhciBmYWtlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3Jl YWN0Jyk7CisgICAgUmVhY3RFcnJvclV0aWxzLmludm9rZUd1YXJkZWRDYWxsYmFjayA9IGZ1bmN0 aW9uIChuYW1lLCBmdW5jLCBhKSB7CisgICAgICB2YXIgYm91bmRGdW5jID0gZnVuYy5iaW5kKG51 bGwsIGEpOworICAgICAgdmFyIGV2dFR5cGUgPSAncmVhY3QtJyArIG5hbWU7CisgICAgICBmYWtl Tm9kZS5hZGRFdmVudExpc3RlbmVyKGV2dFR5cGUsIGJvdW5kRnVuYywgZmFsc2UpOworICAgICAg dmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpOworICAgICAgLy8gJEZsb3dG aXhNZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvMjMzNgorICAgICAg ZXZ0LmluaXRFdmVudChldnRUeXBlLCBmYWxzZSwgZmFsc2UpOworICAgICAgZmFrZU5vZGUuZGlz cGF0Y2hFdmVudChldnQpOworICAgICAgZmFrZU5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldnRU eXBlLCBib3VuZEZ1bmMsIGZhbHNlKTsKKyAgICB9OworICB9Cit9CisKK21vZHVsZS5leHBvcnRz ID0gUmVhY3RFcnJvclV0aWxzOworfSx7fV0sNTY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4 cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgor ICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vu c2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0Ug ZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRp b25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVO VFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsK KwordmFyIEV2ZW50UGx1Z2luSHViID0gX2RlcmVxXygxNyk7CisKK2Z1bmN0aW9uIHJ1bkV2ZW50 UXVldWVJbkJhdGNoKGV2ZW50cykgeworICBFdmVudFBsdWdpbkh1Yi5lbnF1ZXVlRXZlbnRzKGV2 ZW50cyk7CisgIEV2ZW50UGx1Z2luSHViLnByb2Nlc3NFdmVudFF1ZXVlKGZhbHNlKTsKK30KKwor dmFyIFJlYWN0RXZlbnRFbWl0dGVyTWl4aW4gPSB7CisKKyAgLyoqCisgICAqIFN0cmVhbXMgYSBm aXJlZCB0b3AtbGV2ZWwgZXZlbnQgdG8gYEV2ZW50UGx1Z2luSHViYCB3aGVyZSBwbHVnaW5zIGhh dmUgdGhlCisgICAqIG9wcG9ydHVuaXR5IHRvIGNyZWF0ZSBgUmVhY3RFdmVudGBzIHRvIGJlIGRp c3BhdGNoZWQuCisgICAqLworICBoYW5kbGVUb3BMZXZlbDogZnVuY3Rpb24gKHRvcExldmVsVHlw ZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7CisgICAgdmFy IGV2ZW50cyA9IEV2ZW50UGx1Z2luSHViLmV4dHJhY3RFdmVudHModG9wTGV2ZWxUeXBlLCB0YXJn ZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpOworICAgIHJ1bkV2ZW50UXVl dWVJbkJhdGNoKGV2ZW50cyk7CisgIH0KK307CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RFdmVu dEVtaXR0ZXJNaXhpbjsKK30seyIxNyI6MTd9XSw1NzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUs ZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMu CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGlj ZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5T RSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRp dGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFU RU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3Qn OworCit2YXIgX2Fzc2lnbiA9IF9kZXJlcV8oMTU4KTsKKwordmFyIEV2ZW50TGlzdGVuZXIgPSBf ZGVyZXFfKDEzNSk7Cit2YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSBfZGVyZXFfKDEzNik7Cit2 YXIgUG9vbGVkQ2xhc3MgPSBfZGVyZXFfKDI1KTsKK3ZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUg PSBfZGVyZXFfKDM0KTsKK3ZhciBSZWFjdFVwZGF0ZXMgPSBfZGVyZXFfKDgyKTsKKwordmFyIGdl dEV2ZW50VGFyZ2V0ID0gX2RlcmVxXygxMTQpOwordmFyIGdldFVuYm91bmRlZFNjcm9sbFBvc2l0 aW9uID0gX2RlcmVxXygxNDcpOworCisvKioKKyAqIEZpbmQgdGhlIGRlZXBlc3QgUmVhY3QgY29t cG9uZW50IGNvbXBsZXRlbHkgY29udGFpbmluZyB0aGUgcm9vdCBvZiB0aGUKKyAqIHBhc3NlZC1p biBpbnN0YW5jZSAoZm9yIHVzZSB3aGVuIGVudGlyZSBSZWFjdCB0cmVlcyBhcmUgbmVzdGVkIHdp dGhpbiBlYWNoCisgKiBvdGhlcikuIElmIFJlYWN0IHRyZWVzIGFyZSBub3QgbmVzdGVkLCByZXR1 cm5zIG51bGwuCisgKi8KK2Z1bmN0aW9uIGZpbmRQYXJlbnQoaW5zdCkgeworICAvLyBUT0RPOiBJ dCBtYXkgYmUgYSBnb29kIGlkZWEgdG8gY2FjaGUgdGhpcyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5 IERPTQorICAvLyB0cmF2ZXJzYWwsIGJ1dCBjYWNoaW5nIGlzIGRpZmZpY3VsdCB0byBkbyBjb3Jy ZWN0bHkgd2l0aG91dCB1c2luZyBhCisgIC8vIG11dGF0aW9uIG9ic2VydmVyIHRvIGxpc3RlbiBm b3IgYWxsIERPTSBjaGFuZ2VzLgorICB3aGlsZSAoaW5zdC5faG9zdFBhcmVudCkgeworICAgIGlu c3QgPSBpbnN0Ll9ob3N0UGFyZW50OworICB9CisgIHZhciByb290Tm9kZSA9IFJlYWN0RE9NQ29t cG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpOworICB2YXIgY29udGFpbmVyID0g cm9vdE5vZGUucGFyZW50Tm9kZTsKKyAgcmV0dXJuIFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRD bG9zZXN0SW5zdGFuY2VGcm9tTm9kZShjb250YWluZXIpOworfQorCisvLyBVc2VkIHRvIHN0b3Jl IGFuY2VzdG9yIGhpZXJhcmNoeSBpbiB0b3AgbGV2ZWwgY2FsbGJhY2sKK2Z1bmN0aW9uIFRvcExl dmVsQ2FsbGJhY2tCb29rS2VlcGluZyh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KSB7CisgIHRo aXMudG9wTGV2ZWxUeXBlID0gdG9wTGV2ZWxUeXBlOworICB0aGlzLm5hdGl2ZUV2ZW50ID0gbmF0 aXZlRXZlbnQ7CisgIHRoaXMuYW5jZXN0b3JzID0gW107Cit9CitfYXNzaWduKFRvcExldmVsQ2Fs bGJhY2tCb29rS2VlcGluZy5wcm90b3R5cGUsIHsKKyAgZGVzdHJ1Y3RvcjogZnVuY3Rpb24gKCkg eworICAgIHRoaXMudG9wTGV2ZWxUeXBlID0gbnVsbDsKKyAgICB0aGlzLm5hdGl2ZUV2ZW50ID0g bnVsbDsKKyAgICB0aGlzLmFuY2VzdG9ycy5sZW5ndGggPSAwOworICB9Cit9KTsKK1Bvb2xlZENs YXNzLmFkZFBvb2xpbmdUbyhUb3BMZXZlbENhbGxiYWNrQm9va0tlZXBpbmcsIFBvb2xlZENsYXNz LnR3b0FyZ3VtZW50UG9vbGVyKTsKKworZnVuY3Rpb24gaGFuZGxlVG9wTGV2ZWxJbXBsKGJvb2tL ZWVwaW5nKSB7CisgIHZhciBuYXRpdmVFdmVudFRhcmdldCA9IGdldEV2ZW50VGFyZ2V0KGJvb2tL ZWVwaW5nLm5hdGl2ZUV2ZW50KTsKKyAgdmFyIHRhcmdldEluc3QgPSBSZWFjdERPTUNvbXBvbmVu dFRyZWUuZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUobmF0aXZlRXZlbnRUYXJnZXQpOworCisg IC8vIExvb3AgdGhyb3VnaCB0aGUgaGllcmFyY2h5LCBpbiBjYXNlIHRoZXJlJ3MgYW55IG5lc3Rl ZCBjb21wb25lbnRzLgorICAvLyBJdCdzIGltcG9ydGFudCB0aGF0IHdlIGJ1aWxkIHRoZSBhcnJh eSBvZiBhbmNlc3RvcnMgYmVmb3JlIGNhbGxpbmcgYW55CisgIC8vIGV2ZW50IGhhbmRsZXJzLCBi ZWNhdXNlIGV2ZW50IGhhbmRsZXJzIGNhbiBtb2RpZnkgdGhlIERPTSwgbGVhZGluZyB0bworICAv LyBpbmNvbnNpc3RlbmNpZXMgd2l0aCBSZWFjdE1vdW50J3Mgbm9kZSBjYWNoZS4gU2VlICMxMTA1 LgorICB2YXIgYW5jZXN0b3IgPSB0YXJnZXRJbnN0OworICBkbyB7CisgICAgYm9va0tlZXBpbmcu YW5jZXN0b3JzLnB1c2goYW5jZXN0b3IpOworICAgIGFuY2VzdG9yID0gYW5jZXN0b3IgJiYgZmlu ZFBhcmVudChhbmNlc3Rvcik7CisgIH0gd2hpbGUgKGFuY2VzdG9yKTsKKworICBmb3IgKHZhciBp ID0gMDsgaSA8IGJvb2tLZWVwaW5nLmFuY2VzdG9ycy5sZW5ndGg7IGkrKykgeworICAgIHRhcmdl dEluc3QgPSBib29rS2VlcGluZy5hbmNlc3RvcnNbaV07CisgICAgUmVhY3RFdmVudExpc3RlbmVy Ll9oYW5kbGVUb3BMZXZlbChib29rS2VlcGluZy50b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIGJv b2tLZWVwaW5nLm5hdGl2ZUV2ZW50LCBnZXRFdmVudFRhcmdldChib29rS2VlcGluZy5uYXRpdmVF dmVudCkpOworICB9Cit9CisKK2Z1bmN0aW9uIHNjcm9sbFZhbHVlTW9uaXRvcihjYikgeworICB2 YXIgc2Nyb2xsUG9zaXRpb24gPSBnZXRVbmJvdW5kZWRTY3JvbGxQb3NpdGlvbih3aW5kb3cpOwor ICBjYihzY3JvbGxQb3NpdGlvbik7Cit9CisKK3ZhciBSZWFjdEV2ZW50TGlzdGVuZXIgPSB7Cisg IF9lbmFibGVkOiB0cnVlLAorICBfaGFuZGxlVG9wTGV2ZWw6IG51bGwsCisKKyAgV0lORE9XX0hB TkRMRTogRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NID8gd2luZG93IDogbnVsbCwKKwor ICBzZXRIYW5kbGVUb3BMZXZlbDogZnVuY3Rpb24gKGhhbmRsZVRvcExldmVsKSB7CisgICAgUmVh Y3RFdmVudExpc3RlbmVyLl9oYW5kbGVUb3BMZXZlbCA9IGhhbmRsZVRvcExldmVsOworICB9LAor CisgIHNldEVuYWJsZWQ6IGZ1bmN0aW9uIChlbmFibGVkKSB7CisgICAgUmVhY3RFdmVudExpc3Rl bmVyLl9lbmFibGVkID0gISFlbmFibGVkOworICB9LAorCisgIGlzRW5hYmxlZDogZnVuY3Rpb24g KCkgeworICAgIHJldHVybiBSZWFjdEV2ZW50TGlzdGVuZXIuX2VuYWJsZWQ7CisgIH0sCisKKyAg LyoqCisgICAqIFRyYXBzIHRvcC1sZXZlbCBldmVudHMgYnkgdXNpbmcgZXZlbnQgYnViYmxpbmcu CisgICAqCisgICAqIEBwYXJhbSB7c3RyaW5nfSB0b3BMZXZlbFR5cGUgUmVjb3JkIGZyb20gYEV2 ZW50Q29uc3RhbnRzYC4KKyAgICogQHBhcmFtIHtzdHJpbmd9IGhhbmRsZXJCYXNlTmFtZSBFdmVu dCBuYW1lIChlLmcuICJjbGljayIpLgorICAgKiBAcGFyYW0ge29iamVjdH0gZWxlbWVudCBFbGVt ZW50IG9uIHdoaWNoIHRvIGF0dGFjaCBsaXN0ZW5lci4KKyAgICogQHJldHVybiB7P29iamVjdH0g QW4gb2JqZWN0IHdpdGggYSByZW1vdmUgZnVuY3Rpb24gd2hpY2ggd2lsbCBmb3JjZWZ1bGx5Cisg ICAqICAgICAgICAgICAgICAgICAgcmVtb3ZlIHRoZSBsaXN0ZW5lci4KKyAgICogQGludGVybmFs CisgICAqLworICB0cmFwQnViYmxlZEV2ZW50OiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCBoYW5k bGVyQmFzZU5hbWUsIGVsZW1lbnQpIHsKKyAgICBpZiAoIWVsZW1lbnQpIHsKKyAgICAgIHJldHVy biBudWxsOworICAgIH0KKyAgICByZXR1cm4gRXZlbnRMaXN0ZW5lci5saXN0ZW4oZWxlbWVudCwg aGFuZGxlckJhc2VOYW1lLCBSZWFjdEV2ZW50TGlzdGVuZXIuZGlzcGF0Y2hFdmVudC5iaW5kKG51 bGwsIHRvcExldmVsVHlwZSkpOworICB9LAorCisgIC8qKgorICAgKiBUcmFwcyBhIHRvcC1sZXZl bCBldmVudCBieSB1c2luZyBldmVudCBjYXB0dXJpbmcuCisgICAqCisgICAqIEBwYXJhbSB7c3Ry aW5nfSB0b3BMZXZlbFR5cGUgUmVjb3JkIGZyb20gYEV2ZW50Q29uc3RhbnRzYC4KKyAgICogQHBh cmFtIHtzdHJpbmd9IGhhbmRsZXJCYXNlTmFtZSBFdmVudCBuYW1lIChlLmcuICJjbGljayIpLgor ICAgKiBAcGFyYW0ge29iamVjdH0gZWxlbWVudCBFbGVtZW50IG9uIHdoaWNoIHRvIGF0dGFjaCBs aXN0ZW5lci4KKyAgICogQHJldHVybiB7P29iamVjdH0gQW4gb2JqZWN0IHdpdGggYSByZW1vdmUg ZnVuY3Rpb24gd2hpY2ggd2lsbCBmb3JjZWZ1bGx5CisgICAqICAgICAgICAgICAgICAgICAgcmVt b3ZlIHRoZSBsaXN0ZW5lci4KKyAgICogQGludGVybmFsCisgICAqLworICB0cmFwQ2FwdHVyZWRF dmVudDogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgaGFuZGxlckJhc2VOYW1lLCBlbGVtZW50KSB7 CisgICAgaWYgKCFlbGVtZW50KSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgcmV0 dXJuIEV2ZW50TGlzdGVuZXIuY2FwdHVyZShlbGVtZW50LCBoYW5kbGVyQmFzZU5hbWUsIFJlYWN0 RXZlbnRMaXN0ZW5lci5kaXNwYXRjaEV2ZW50LmJpbmQobnVsbCwgdG9wTGV2ZWxUeXBlKSk7Cisg IH0sCisKKyAgbW9uaXRvclNjcm9sbFZhbHVlOiBmdW5jdGlvbiAocmVmcmVzaCkgeworICAgIHZh ciBjYWxsYmFjayA9IHNjcm9sbFZhbHVlTW9uaXRvci5iaW5kKG51bGwsIHJlZnJlc2gpOworICAg IEV2ZW50TGlzdGVuZXIubGlzdGVuKHdpbmRvdywgJ3Njcm9sbCcsIGNhbGxiYWNrKTsKKyAgfSwK KworICBkaXNwYXRjaEV2ZW50OiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkg eworICAgIGlmICghUmVhY3RFdmVudExpc3RlbmVyLl9lbmFibGVkKSB7CisgICAgICByZXR1cm47 CisgICAgfQorCisgICAgdmFyIGJvb2tLZWVwaW5nID0gVG9wTGV2ZWxDYWxsYmFja0Jvb2tLZWVw aW5nLmdldFBvb2xlZCh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KTsKKyAgICB0cnkgeworICAg ICAgLy8gRXZlbnQgcXVldWUgYmVpbmcgcHJvY2Vzc2VkIGluIHRoZSBzYW1lIGN5Y2xlIGFsbG93 cworICAgICAgLy8gYHByZXZlbnREZWZhdWx0YC4KKyAgICAgIFJlYWN0VXBkYXRlcy5iYXRjaGVk VXBkYXRlcyhoYW5kbGVUb3BMZXZlbEltcGwsIGJvb2tLZWVwaW5nKTsKKyAgICB9IGZpbmFsbHkg eworICAgICAgVG9wTGV2ZWxDYWxsYmFja0Jvb2tLZWVwaW5nLnJlbGVhc2UoYm9va0tlZXBpbmcp OworICAgIH0KKyAgfQorfTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdEV2ZW50TGlzdGVuZXI7 Cit9LHsiMTE0IjoxMTQsIjEzNSI6MTM1LCIxMzYiOjEzNiwiMTQ3IjoxNDcsIjE1OCI6MTU4LCIy NSI6MjUsIjM0IjozNCwiODIiOjgyfV0sNTg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9y dHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICog QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2Vk IHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmls ZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25h bCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMg ZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogCisgKi8KKworJ3VzZSBzdHJpY3Qn OworCit2YXIgUmVhY3RGZWF0dXJlRmxhZ3MgPSB7CisgIC8vIFdoZW4gdHJ1ZSwgY2FsbCBjb25z b2xlLnRpbWUoKSBiZWZvcmUgYW5kIC50aW1lRW5kKCkgYWZ0ZXIgZWFjaCB0b3AtbGV2ZWwKKyAg Ly8gcmVuZGVyIChib3RoIGluaXRpYWwgcmVuZGVycyBhbmQgdXBkYXRlcykuIFVzZWZ1bCB3aGVu IGxvb2tpbmcgYXQgcHJvZC1tb2RlCisgIC8vIHRpbWVsaW5lIHByb2ZpbGVzIGluIENocm9tZSwg Zm9yIGV4YW1wbGUuCisgIGxvZ1RvcExldmVsUmVuZGVyczogZmFsc2UKK307CisKK21vZHVsZS5l eHBvcnRzID0gUmVhY3RGZWF0dXJlRmxhZ3M7Cit9LHt9XSw1OTpbZnVuY3Rpb24oX2RlcmVxXyxt b2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQsIEZhY2Vib29r LCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUg aXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICog TElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBB biBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0 aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBz dHJpY3QnOworCit2YXIgX3Byb2RJbnZhcmlhbnQgPSBfZGVyZXFfKDEyNSk7CisKK3ZhciBpbnZh cmlhbnQgPSBfZGVyZXFfKDE1MCk7CisKK3ZhciBnZW5lcmljQ29tcG9uZW50Q2xhc3MgPSBudWxs OwordmFyIHRleHRDb21wb25lbnRDbGFzcyA9IG51bGw7CisKK3ZhciBSZWFjdEhvc3RDb21wb25l bnRJbmplY3Rpb24gPSB7CisgIC8vIFRoaXMgYWNjZXB0cyBhIGNsYXNzIHRoYXQgcmVjZWl2ZXMg dGhlIHRhZyBzdHJpbmcuIFRoaXMgaXMgYSBjYXRjaCBhbGwKKyAgLy8gdGhhdCBjYW4gcmVuZGVy IGFueSBraW5kIG9mIHRhZy4KKyAgaW5qZWN0R2VuZXJpY0NvbXBvbmVudENsYXNzOiBmdW5jdGlv biAoY29tcG9uZW50Q2xhc3MpIHsKKyAgICBnZW5lcmljQ29tcG9uZW50Q2xhc3MgPSBjb21wb25l bnRDbGFzczsKKyAgfSwKKyAgLy8gVGhpcyBhY2NlcHRzIGEgdGV4dCBjb21wb25lbnQgY2xhc3Mg dGhhdCB0YWtlcyB0aGUgdGV4dCBzdHJpbmcgdG8gYmUKKyAgLy8gcmVuZGVyZWQgYXMgcHJvcHMu CisgIGluamVjdFRleHRDb21wb25lbnRDbGFzczogZnVuY3Rpb24gKGNvbXBvbmVudENsYXNzKSB7 CisgICAgdGV4dENvbXBvbmVudENsYXNzID0gY29tcG9uZW50Q2xhc3M7CisgIH0KK307CisKKy8q KgorICogR2V0IGEgaG9zdCBpbnRlcm5hbCBjb21wb25lbnQgY2xhc3MgZm9yIGEgc3BlY2lmaWMg dGFnLgorICoKKyAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50IFRoZSBlbGVtZW50IHRv IGNyZWF0ZS4KKyAqIEByZXR1cm4ge2Z1bmN0aW9ufSBUaGUgaW50ZXJuYWwgY2xhc3MgY29uc3Ry dWN0b3IgZnVuY3Rpb24uCisgKi8KK2Z1bmN0aW9uIGNyZWF0ZUludGVybmFsQ29tcG9uZW50KGVs ZW1lbnQpIHsKKyAgIWdlbmVyaWNDb21wb25lbnRDbGFzcyA/ICJkZXZlbG9wbWVudCIgIT09ICdw cm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1RoZXJlIGlzIG5vIHJlZ2lzdGVyZWQgY29t cG9uZW50IGZvciB0aGUgdGFnICVzJywgZWxlbWVudC50eXBlKSA6IF9wcm9kSW52YXJpYW50KCcx MTEnLCBlbGVtZW50LnR5cGUpIDogdm9pZCAwOworICByZXR1cm4gbmV3IGdlbmVyaWNDb21wb25l bnRDbGFzcyhlbGVtZW50KTsKK30KKworLyoqCisgKiBAcGFyYW0ge1JlYWN0VGV4dH0gdGV4dAor ICogQHJldHVybiB7UmVhY3RDb21wb25lbnR9CisgKi8KK2Z1bmN0aW9uIGNyZWF0ZUluc3RhbmNl Rm9yVGV4dCh0ZXh0KSB7CisgIHJldHVybiBuZXcgdGV4dENvbXBvbmVudENsYXNzKHRleHQpOwor fQorCisvKioKKyAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGNvbXBvbmVudAorICogQHJldHVy biB7Ym9vbGVhbn0KKyAqLworZnVuY3Rpb24gaXNUZXh0Q29tcG9uZW50KGNvbXBvbmVudCkgewor ICByZXR1cm4gY29tcG9uZW50IGluc3RhbmNlb2YgdGV4dENvbXBvbmVudENsYXNzOworfQorCit2 YXIgUmVhY3RIb3N0Q29tcG9uZW50ID0geworICBjcmVhdGVJbnRlcm5hbENvbXBvbmVudDogY3Jl YXRlSW50ZXJuYWxDb21wb25lbnQsCisgIGNyZWF0ZUluc3RhbmNlRm9yVGV4dDogY3JlYXRlSW5z dGFuY2VGb3JUZXh0LAorICBpc1RleHRDb21wb25lbnQ6IGlzVGV4dENvbXBvbmVudCwKKyAgaW5q ZWN0aW9uOiBSZWFjdEhvc3RDb21wb25lbnRJbmplY3Rpb24KK307CisKK21vZHVsZS5leHBvcnRz ID0gUmVhY3RIb3N0Q29tcG9uZW50OworfSx7IjEyNSI6MTI1LCIxNTAiOjE1MH1dLDYwOltmdW5j dGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTYtcHJl c2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhp cyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91 bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMg c291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2Fu IGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoK KyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIGhpc3RvcnkgPSBbXTsKKwordmFyIFJl YWN0SG9zdE9wZXJhdGlvbkhpc3RvcnlIb29rID0geworICBvbkhvc3RPcGVyYXRpb246IGZ1bmN0 aW9uIChvcGVyYXRpb24pIHsKKyAgICBoaXN0b3J5LnB1c2gob3BlcmF0aW9uKTsKKyAgfSwKKyAg Y2xlYXJIaXN0b3J5OiBmdW5jdGlvbiAoKSB7CisgICAgaWYgKFJlYWN0SG9zdE9wZXJhdGlvbkhp c3RvcnlIb29rLl9wcmV2ZW50Q2xlYXJpbmcpIHsKKyAgICAgIC8vIFNob3VsZCBvbmx5IGJlIHVz ZWQgZm9yIHRlc3RzLgorICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGhpc3RvcnkgPSBbXTsK KyAgfSwKKyAgZ2V0SGlzdG9yeTogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBoaXN0b3J5Owor ICB9Cit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0SG9zdE9wZXJhdGlvbkhpc3RvcnlIb29r OworfSx7fV0sNjE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBD b3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNl cnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qt c3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBk aXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2Yg cGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2Ft ZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIERPTVByb3BlcnR5 ID0gX2RlcmVxXygxMSk7Cit2YXIgRXZlbnRQbHVnaW5IdWIgPSBfZGVyZXFfKDE3KTsKK3ZhciBF dmVudFBsdWdpblV0aWxzID0gX2RlcmVxXygxOSk7Cit2YXIgUmVhY3RDb21wb25lbnRFbnZpcm9u bWVudCA9IF9kZXJlcV8oMjkpOwordmFyIFJlYWN0RW1wdHlDb21wb25lbnQgPSBfZGVyZXFfKDU0 KTsKK3ZhciBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIgPSBfZGVyZXFfKDI2KTsKK3ZhciBSZWFj dEhvc3RDb21wb25lbnQgPSBfZGVyZXFfKDU5KTsKK3ZhciBSZWFjdFVwZGF0ZXMgPSBfZGVyZXFf KDgyKTsKKwordmFyIFJlYWN0SW5qZWN0aW9uID0geworICBDb21wb25lbnQ6IFJlYWN0Q29tcG9u ZW50RW52aXJvbm1lbnQuaW5qZWN0aW9uLAorICBET01Qcm9wZXJ0eTogRE9NUHJvcGVydHkuaW5q ZWN0aW9uLAorICBFbXB0eUNvbXBvbmVudDogUmVhY3RFbXB0eUNvbXBvbmVudC5pbmplY3Rpb24s CisgIEV2ZW50UGx1Z2luSHViOiBFdmVudFBsdWdpbkh1Yi5pbmplY3Rpb24sCisgIEV2ZW50UGx1 Z2luVXRpbHM6IEV2ZW50UGx1Z2luVXRpbHMuaW5qZWN0aW9uLAorICBFdmVudEVtaXR0ZXI6IFJl YWN0QnJvd3NlckV2ZW50RW1pdHRlci5pbmplY3Rpb24sCisgIEhvc3RDb21wb25lbnQ6IFJlYWN0 SG9zdENvbXBvbmVudC5pbmplY3Rpb24sCisgIFVwZGF0ZXM6IFJlYWN0VXBkYXRlcy5pbmplY3Rp b24KK307CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RJbmplY3Rpb247Cit9LHsiMTEiOjExLCIx NyI6MTcsIjE5IjoxOSwiMjYiOjI2LCIyOSI6MjksIjU0Ijo1NCwiNTkiOjU5LCI4MiI6ODJ9XSw2 MjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAy MDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK KyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNl bnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBv ZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmln aHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9y eS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgUmVhY3RET01TZWxlY3Rpb24gPSBf ZGVyZXFfKDQ0KTsKKwordmFyIGNvbnRhaW5zTm9kZSA9IF9kZXJlcV8oMTM5KTsKK3ZhciBmb2N1 c05vZGUgPSBfZGVyZXFfKDE0NCk7Cit2YXIgZ2V0QWN0aXZlRWxlbWVudCA9IF9kZXJlcV8oMTQ1 KTsKKworZnVuY3Rpb24gaXNJbkRvY3VtZW50KG5vZGUpIHsKKyAgcmV0dXJuIGNvbnRhaW5zTm9k ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIG5vZGUpOworfQorCisvKioKKyAqIEBSZWFjdElu cHV0U2VsZWN0aW9uOiBSZWFjdCBpbnB1dCBzZWxlY3Rpb24gbW9kdWxlLiBCYXNlZCBvbiBTZWxl Y3Rpb24uanMsCisgKiBidXQgbW9kaWZpZWQgdG8gYmUgc3VpdGFibGUgZm9yIHJlYWN0IGFuZCBo YXMgYSBjb3VwbGUgb2YgYnVnIGZpeGVzIChkb2Vzbid0CisgKiBhc3N1bWUgYnV0dG9ucyBoYXZl IHJhbmdlIHNlbGVjdGlvbnMgYWxsb3dlZCkuCisgKiBJbnB1dCBzZWxlY3Rpb24gbW9kdWxlIGZv ciBSZWFjdC4KKyAqLwordmFyIFJlYWN0SW5wdXRTZWxlY3Rpb24gPSB7CisKKyAgaGFzU2VsZWN0 aW9uQ2FwYWJpbGl0aWVzOiBmdW5jdGlvbiAoZWxlbSkgeworICAgIHZhciBub2RlTmFtZSA9IGVs ZW0gJiYgZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CisgICAg cmV0dXJuIG5vZGVOYW1lICYmIChub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiBlbGVtLnR5cGUgPT09 ICd0ZXh0JyB8fCBub2RlTmFtZSA9PT0gJ3RleHRhcmVhJyB8fCBlbGVtLmNvbnRlbnRFZGl0YWJs ZSA9PT0gJ3RydWUnKTsKKyAgfSwKKworICBnZXRTZWxlY3Rpb25JbmZvcm1hdGlvbjogZnVuY3Rp b24gKCkgeworICAgIHZhciBmb2N1c2VkRWxlbSA9IGdldEFjdGl2ZUVsZW1lbnQoKTsKKyAgICBy ZXR1cm4geworICAgICAgZm9jdXNlZEVsZW06IGZvY3VzZWRFbGVtLAorICAgICAgc2VsZWN0aW9u UmFuZ2U6IFJlYWN0SW5wdXRTZWxlY3Rpb24uaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKGZvY3Vz ZWRFbGVtKSA/IFJlYWN0SW5wdXRTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uKGZvY3VzZWRFbGVtKSA6 IG51bGwKKyAgICB9OworICB9LAorCisgIC8qKgorICAgKiBAcmVzdG9yZVNlbGVjdGlvbjogSWYg YW55IHNlbGVjdGlvbiBpbmZvcm1hdGlvbiB3YXMgcG90ZW50aWFsbHkgbG9zdCwKKyAgICogcmVz dG9yZSBpdC4gVGhpcyBpcyB1c2VmdWwgd2hlbiBwZXJmb3JtaW5nIG9wZXJhdGlvbnMgdGhhdCBj b3VsZCByZW1vdmUgZG9tCisgICAqIG5vZGVzIGFuZCBwbGFjZSB0aGVtIGJhY2sgaW4sIHJlc3Vs dGluZyBpbiBmb2N1cyBiZWluZyBsb3N0LgorICAgKi8KKyAgcmVzdG9yZVNlbGVjdGlvbjogZnVu Y3Rpb24gKHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24pIHsKKyAgICB2YXIgY3VyRm9jdXNlZEVs ZW0gPSBnZXRBY3RpdmVFbGVtZW50KCk7CisgICAgdmFyIHByaW9yRm9jdXNlZEVsZW0gPSBwcmlv clNlbGVjdGlvbkluZm9ybWF0aW9uLmZvY3VzZWRFbGVtOworICAgIHZhciBwcmlvclNlbGVjdGlv blJhbmdlID0gcHJpb3JTZWxlY3Rpb25JbmZvcm1hdGlvbi5zZWxlY3Rpb25SYW5nZTsKKyAgICBp ZiAoY3VyRm9jdXNlZEVsZW0gIT09IHByaW9yRm9jdXNlZEVsZW0gJiYgaXNJbkRvY3VtZW50KHBy aW9yRm9jdXNlZEVsZW0pKSB7CisgICAgICBpZiAoUmVhY3RJbnB1dFNlbGVjdGlvbi5oYXNTZWxl Y3Rpb25DYXBhYmlsaXRpZXMocHJpb3JGb2N1c2VkRWxlbSkpIHsKKyAgICAgICAgUmVhY3RJbnB1 dFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24ocHJpb3JGb2N1c2VkRWxlbSwgcHJpb3JTZWxlY3Rpb25S YW5nZSk7CisgICAgICB9CisgICAgICBmb2N1c05vZGUocHJpb3JGb2N1c2VkRWxlbSk7CisgICAg fQorICB9LAorCisgIC8qKgorICAgKiBAZ2V0U2VsZWN0aW9uOiBHZXRzIHRoZSBzZWxlY3Rpb24g Ym91bmRzIG9mIGEgZm9jdXNlZCB0ZXh0YXJlYSwgaW5wdXQgb3IKKyAgICogY29udGVudEVkaXRh YmxlIG5vZGUuCisgICAqIC1AaW5wdXQ6IExvb2sgdXAgc2VsZWN0aW9uIGJvdW5kcyBvZiB0aGlz IGlucHV0CisgICAqIC1AcmV0dXJuIHtzdGFydDogc2VsZWN0aW9uU3RhcnQsIGVuZDogc2VsZWN0 aW9uRW5kfQorICAgKi8KKyAgZ2V0U2VsZWN0aW9uOiBmdW5jdGlvbiAoaW5wdXQpIHsKKyAgICB2 YXIgc2VsZWN0aW9uOworCisgICAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gaW5wdXQpIHsKKyAg ICAgIC8vIE1vZGVybiBicm93c2VyIHdpdGggaW5wdXQgb3IgdGV4dGFyZWEuCisgICAgICBzZWxl Y3Rpb24gPSB7CisgICAgICAgIHN0YXJ0OiBpbnB1dC5zZWxlY3Rpb25TdGFydCwKKyAgICAgICAg ZW5kOiBpbnB1dC5zZWxlY3Rpb25FbmQKKyAgICAgIH07CisgICAgfSBlbHNlIGlmIChkb2N1bWVu dC5zZWxlY3Rpb24gJiYgaW5wdXQubm9kZU5hbWUgJiYgaW5wdXQubm9kZU5hbWUudG9Mb3dlckNh c2UoKSA9PT0gJ2lucHV0JykgeworICAgICAgLy8gSUU4IGlucHV0LgorICAgICAgdmFyIHJhbmdl ID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7CisgICAgICAvLyBUaGVyZSBjYW4g b25seSBiZSBvbmUgc2VsZWN0aW9uIHBlciBkb2N1bWVudCBpbiBJRSwgc28gaXQgbXVzdAorICAg ICAgLy8gYmUgaW4gb3VyIGVsZW1lbnQuCisgICAgICBpZiAocmFuZ2UucGFyZW50RWxlbWVudCgp ID09PSBpbnB1dCkgeworICAgICAgICBzZWxlY3Rpb24gPSB7CisgICAgICAgICAgc3RhcnQ6IC1y YW5nZS5tb3ZlU3RhcnQoJ2NoYXJhY3RlcicsIC1pbnB1dC52YWx1ZS5sZW5ndGgpLAorICAgICAg ICAgIGVuZDogLXJhbmdlLm1vdmVFbmQoJ2NoYXJhY3RlcicsIC1pbnB1dC52YWx1ZS5sZW5ndGgp CisgICAgICAgIH07CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIENvbnRlbnQgZWRp dGFibGUgb3Igb2xkIElFIHRleHRhcmVhLgorICAgICAgc2VsZWN0aW9uID0gUmVhY3RET01TZWxl Y3Rpb24uZ2V0T2Zmc2V0cyhpbnB1dCk7CisgICAgfQorCisgICAgcmV0dXJuIHNlbGVjdGlvbiB8 fCB7IHN0YXJ0OiAwLCBlbmQ6IDAgfTsKKyAgfSwKKworICAvKioKKyAgICogQHNldFNlbGVjdGlv bjogU2V0cyB0aGUgc2VsZWN0aW9uIGJvdW5kcyBvZiBhIHRleHRhcmVhIG9yIGlucHV0IGFuZCBm b2N1c2VzCisgICAqIHRoZSBpbnB1dC4KKyAgICogLUBpbnB1dCAgICAgU2V0IHNlbGVjdGlvbiBi b3VuZHMgb2YgdGhpcyBpbnB1dCBvciB0ZXh0YXJlYQorICAgKiAtQG9mZnNldHMgICBPYmplY3Qg b2Ygc2FtZSBmb3JtIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSBnZXQqCisgICAqLworICBzZXRTZWxl Y3Rpb246IGZ1bmN0aW9uIChpbnB1dCwgb2Zmc2V0cykgeworICAgIHZhciBzdGFydCA9IG9mZnNl dHMuc3RhcnQ7CisgICAgdmFyIGVuZCA9IG9mZnNldHMuZW5kOworICAgIGlmIChlbmQgPT09IHVu ZGVmaW5lZCkgeworICAgICAgZW5kID0gc3RhcnQ7CisgICAgfQorCisgICAgaWYgKCdzZWxlY3Rp b25TdGFydCcgaW4gaW5wdXQpIHsKKyAgICAgIGlucHV0LnNlbGVjdGlvblN0YXJ0ID0gc3RhcnQ7 CisgICAgICBpbnB1dC5zZWxlY3Rpb25FbmQgPSBNYXRoLm1pbihlbmQsIGlucHV0LnZhbHVlLmxl bmd0aCk7CisgICAgfSBlbHNlIGlmIChkb2N1bWVudC5zZWxlY3Rpb24gJiYgaW5wdXQubm9kZU5h bWUgJiYgaW5wdXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JykgeworICAgICAg dmFyIHJhbmdlID0gaW5wdXQuY3JlYXRlVGV4dFJhbmdlKCk7CisgICAgICByYW5nZS5jb2xsYXBz ZSh0cnVlKTsKKyAgICAgIHJhbmdlLm1vdmVTdGFydCgnY2hhcmFjdGVyJywgc3RhcnQpOworICAg ICAgcmFuZ2UubW92ZUVuZCgnY2hhcmFjdGVyJywgZW5kIC0gc3RhcnQpOworICAgICAgcmFuZ2Uu c2VsZWN0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIFJlYWN0RE9NU2VsZWN0aW9uLnNldE9mZnNl dHMoaW5wdXQsIG9mZnNldHMpOworICAgIH0KKyAgfQorfTsKKworbW9kdWxlLmV4cG9ydHMgPSBS ZWFjdElucHV0U2VsZWN0aW9uOworfSx7IjEzOSI6MTM5LCIxNDQiOjE0NCwiMTQ1IjoxNDUsIjQ0 Ijo0NH1dLDYzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29w eXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2 ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0 eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGly ZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBh dGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUg ZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKKy8qKgorICogYFJlYWN0SW5z dGFuY2VNYXBgIG1haW50YWlucyBhIG1hcHBpbmcgZnJvbSBhIHB1YmxpYyBmYWNpbmcgc3RhdGVm dWwKKyAqIGluc3RhbmNlIChrZXkpIGFuZCB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gKHZh bHVlKS4gVGhpcyBhbGxvd3MgcHVibGljCisgKiBtZXRob2RzIHRvIGFjY2VwdCB0aGUgdXNlciBm YWNpbmcgaW5zdGFuY2UgYXMgYW4gYXJndW1lbnQgYW5kIG1hcCB0aGVtIGJhY2sKKyAqIHRvIGlu dGVybmFsIG1ldGhvZHMuCisgKi8KKworLy8gVE9ETzogUmVwbGFjZSB0aGlzIHdpdGggRVM2OiB2 YXIgUmVhY3RJbnN0YW5jZU1hcCA9IG5ldyBNYXAoKTsKKwordmFyIFJlYWN0SW5zdGFuY2VNYXAg PSB7CisKKyAgLyoqCisgICAqIFRoaXMgQVBJIHNob3VsZCBiZSBjYWxsZWQgYGRlbGV0ZWAgYnV0 IHdlJ2QgaGF2ZSB0byBtYWtlIHN1cmUgdG8gYWx3YXlzCisgICAqIHRyYW5zZm9ybSB0aGVzZSB0 byBzdHJpbmdzIGZvciBJRSBzdXBwb3J0LiBXaGVuIHRoaXMgdHJhbnNmb3JtIGlzIGZ1bGx5Cisg ICAqIHN1cHBvcnRlZCB3ZSBjYW4gcmVuYW1lIGl0LgorICAgKi8KKyAgcmVtb3ZlOiBmdW5jdGlv biAoa2V5KSB7CisgICAga2V5Ll9yZWFjdEludGVybmFsSW5zdGFuY2UgPSB1bmRlZmluZWQ7Cisg IH0sCisKKyAgZ2V0OiBmdW5jdGlvbiAoa2V5KSB7CisgICAgcmV0dXJuIGtleS5fcmVhY3RJbnRl cm5hbEluc3RhbmNlOworICB9LAorCisgIGhhczogZnVuY3Rpb24gKGtleSkgeworICAgIHJldHVy biBrZXkuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSAhPT0gdW5kZWZpbmVkOworICB9LAorCisgIHNl dDogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKKyAgICBrZXkuX3JlYWN0SW50ZXJuYWxJbnN0YW5j ZSA9IHZhbHVlOworICB9CisKK307CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RJbnN0YW5jZU1h cDsKK30se31dLDY0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICog Q29weXJpZ2h0IDIwMTYtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVz ZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNE LXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qg ZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9m IHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNh bWUgZGlyZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKKworLy8gVHJ1c3Qg dGhlIGRldmVsb3BlciB0byBvbmx5IHVzZSBSZWFjdEluc3RydW1lbnRhdGlvbiB3aXRoIGEgX19E RVZfXyBjaGVjaworCit2YXIgZGVidWdUb29sID0gbnVsbDsKKworaWYgKCJkZXZlbG9wbWVudCIg IT09ICdwcm9kdWN0aW9uJykgeworICB2YXIgUmVhY3REZWJ1Z1Rvb2wgPSBfZGVyZXFfKDUwKTsK KyAgZGVidWdUb29sID0gUmVhY3REZWJ1Z1Rvb2w7Cit9CisKK21vZHVsZS5leHBvcnRzID0geyBk ZWJ1Z1Rvb2w6IGRlYnVnVG9vbCB9OworfSx7IjUwIjo1MH1dLDY1OltmdW5jdGlvbihfZGVyZXFf LG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTYtcHJlc2VudCwgRmFjZWJv b2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29k ZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisg KiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUu IEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGlu IHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAorICovCisK Kyd1c2Ugc3RyaWN0JzsKKwordmFyIHdhcm5pbmcgPSBfZGVyZXFfKDE1Nyk7CisKK2lmICgiZGV2 ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgdmFyIHByb2Nlc3NpbmdDaGlsZENvbnRl eHQgPSBmYWxzZTsKKworICB2YXIgd2FybkludmFsaWRTZXRTdGF0ZSA9IGZ1bmN0aW9uICgpIHsK KyAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFwcm9jZXNzaW5n Q2hpbGRDb250ZXh0LCAnc2V0U3RhdGUoLi4uKTogQ2Fubm90IGNhbGwgc2V0U3RhdGUoKSBpbnNp ZGUgZ2V0Q2hpbGRDb250ZXh0KCknKSA6IHZvaWQgMDsKKyAgfTsKK30KKwordmFyIFJlYWN0SW52 YWxpZFNldFN0YXRlV2FybmluZ0hvb2sgPSB7CisgIG9uQmVnaW5Qcm9jZXNzaW5nQ2hpbGRDb250 ZXh0OiBmdW5jdGlvbiAoKSB7CisgICAgcHJvY2Vzc2luZ0NoaWxkQ29udGV4dCA9IHRydWU7Cisg IH0sCisgIG9uRW5kUHJvY2Vzc2luZ0NoaWxkQ29udGV4dDogZnVuY3Rpb24gKCkgeworICAgIHBy b2Nlc3NpbmdDaGlsZENvbnRleHQgPSBmYWxzZTsKKyAgfSwKKyAgb25TZXRTdGF0ZTogZnVuY3Rp b24gKCkgeworICAgIHdhcm5JbnZhbGlkU2V0U3RhdGUoKTsKKyAgfQorfTsKKworbW9kdWxlLmV4 cG9ydHMgPSBSZWFjdEludmFsaWRTZXRTdGF0ZVdhcm5pbmdIb29rOworfSx7IjE1NyI6MTU3fV0s NjY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQg MjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq CisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGlj ZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkg b2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJp Z2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3Rv cnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIGFkbGVyMzIgPSBfZGVyZXFfKDEw Myk7CisKK3ZhciBUQUdfRU5EID0gL1wvPz4vOwordmFyIENPTU1FTlRfU1RBUlQgPSAvXjxcIVwt XC0vOworCit2YXIgUmVhY3RNYXJrdXBDaGVja3N1bSA9IHsKKyAgQ0hFQ0tTVU1fQVRUUl9OQU1F OiAnZGF0YS1yZWFjdC1jaGVja3N1bScsCisKKyAgLyoqCisgICAqIEBwYXJhbSB7c3RyaW5nfSBt YXJrdXAgTWFya3VwIHN0cmluZworICAgKiBAcmV0dXJuIHtzdHJpbmd9IE1hcmt1cCBzdHJpbmcg d2l0aCBjaGVja3N1bSBhdHRyaWJ1dGUgYXR0YWNoZWQKKyAgICovCisgIGFkZENoZWNrc3VtVG9N YXJrdXA6IGZ1bmN0aW9uIChtYXJrdXApIHsKKyAgICB2YXIgY2hlY2tzdW0gPSBhZGxlcjMyKG1h cmt1cCk7CisKKyAgICAvLyBBZGQgY2hlY2tzdW0gKGhhbmRsZSBib3RoIHBhcmVudCB0YWdzLCBj b21tZW50cyBhbmQgc2VsZi1jbG9zaW5nIHRhZ3MpCisgICAgaWYgKENPTU1FTlRfU1RBUlQudGVz dChtYXJrdXApKSB7CisgICAgICByZXR1cm4gbWFya3VwOworICAgIH0gZWxzZSB7CisgICAgICBy ZXR1cm4gbWFya3VwLnJlcGxhY2UoVEFHX0VORCwgJyAnICsgUmVhY3RNYXJrdXBDaGVja3N1bS5D SEVDS1NVTV9BVFRSX05BTUUgKyAnPSInICsgY2hlY2tzdW0gKyAnIiQmJyk7CisgICAgfQorICB9 LAorCisgIC8qKgorICAgKiBAcGFyYW0ge3N0cmluZ30gbWFya3VwIHRvIHVzZQorICAgKiBAcGFy YW0ge0RPTUVsZW1lbnR9IGVsZW1lbnQgcm9vdCBSZWFjdCBlbGVtZW50CisgICAqIEByZXR1cm5z IHtib29sZWFufSB3aGV0aGVyIG9yIG5vdCB0aGUgbWFya3VwIGlzIHRoZSBzYW1lCisgICAqLwor ICBjYW5SZXVzZU1hcmt1cDogZnVuY3Rpb24gKG1hcmt1cCwgZWxlbWVudCkgeworICAgIHZhciBl eGlzdGluZ0NoZWNrc3VtID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoUmVhY3RNYXJrdXBDaGVja3N1 bS5DSEVDS1NVTV9BVFRSX05BTUUpOworICAgIGV4aXN0aW5nQ2hlY2tzdW0gPSBleGlzdGluZ0No ZWNrc3VtICYmIHBhcnNlSW50KGV4aXN0aW5nQ2hlY2tzdW0sIDEwKTsKKyAgICB2YXIgbWFya3Vw Q2hlY2tzdW0gPSBhZGxlcjMyKG1hcmt1cCk7CisgICAgcmV0dXJuIG1hcmt1cENoZWNrc3VtID09 PSBleGlzdGluZ0NoZWNrc3VtOworICB9Cit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0TWFy a3VwQ2hlY2tzdW07Cit9LHsiMTAzIjoxMDN9XSw2NzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUs ZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMu CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGlj ZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5T RSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRp dGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFU RU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3Qn OworCit2YXIgX3Byb2RJbnZhcmlhbnQgPSBfZGVyZXFfKDEyNSk7CisKK3ZhciBET01MYXp5VHJl ZSA9IF9kZXJlcV8oOSk7Cit2YXIgRE9NUHJvcGVydHkgPSBfZGVyZXFfKDExKTsKK3ZhciBSZWFj dCA9IF9kZXJlcV8oMTM0KTsKK3ZhciBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIgPSBfZGVyZXFf KDI2KTsKK3ZhciBSZWFjdEN1cnJlbnRPd25lciA9IF9kZXJlcV8oMTMzKTsKK3ZhciBSZWFjdERP TUNvbXBvbmVudFRyZWUgPSBfZGVyZXFfKDM0KTsKK3ZhciBSZWFjdERPTUNvbnRhaW5lckluZm8g PSBfZGVyZXFfKDM1KTsKK3ZhciBSZWFjdERPTUZlYXR1cmVGbGFncyA9IF9kZXJlcV8oMzcpOwor dmFyIFJlYWN0RmVhdHVyZUZsYWdzID0gX2RlcmVxXyg1OCk7Cit2YXIgUmVhY3RJbnN0YW5jZU1h cCA9IF9kZXJlcV8oNjMpOwordmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gX2RlcmVxXyg2NCk7 Cit2YXIgUmVhY3RNYXJrdXBDaGVja3N1bSA9IF9kZXJlcV8oNjYpOwordmFyIFJlYWN0UmVjb25j aWxlciA9IF9kZXJlcV8oNzUpOwordmFyIFJlYWN0VXBkYXRlUXVldWUgPSBfZGVyZXFfKDgxKTsK K3ZhciBSZWFjdFVwZGF0ZXMgPSBfZGVyZXFfKDgyKTsKKwordmFyIGVtcHR5T2JqZWN0ID0gX2Rl cmVxXygxNDMpOwordmFyIGluc3RhbnRpYXRlUmVhY3RDb21wb25lbnQgPSBfZGVyZXFfKDEyMSk7 Cit2YXIgaW52YXJpYW50ID0gX2RlcmVxXygxNTApOwordmFyIHNldElubmVySFRNTCA9IF9kZXJl cV8oMTI3KTsKK3ZhciBzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudCA9IF9kZXJlcV8oMTI5KTsK K3ZhciB3YXJuaW5nID0gX2RlcmVxXygxNTcpOworCit2YXIgQVRUUl9OQU1FID0gRE9NUHJvcGVy dHkuSURfQVRUUklCVVRFX05BTUU7Cit2YXIgUk9PVF9BVFRSX05BTUUgPSBET01Qcm9wZXJ0eS5S T09UX0FUVFJJQlVURV9OQU1FOworCit2YXIgRUxFTUVOVF9OT0RFX1RZUEUgPSAxOwordmFyIERP Q19OT0RFX1RZUEUgPSA5OwordmFyIERPQ1VNRU5UX0ZSQUdNRU5UX05PREVfVFlQRSA9IDExOwor Cit2YXIgaW5zdGFuY2VzQnlSZWFjdFJvb3RJRCA9IHt9OworCisvKioKKyAqIEZpbmRzIHRoZSBp bmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCisgKiB0aGF0J3Mgbm90IGNvbW1vbiBiZXR3ZWVu IHRoZSB0d28gZ2l2ZW4gc3RyaW5ncy4KKyAqCisgKiBAcmV0dXJuIHtudW1iZXJ9IHRoZSBpbmRl eCBvZiB0aGUgY2hhcmFjdGVyIHdoZXJlIHRoZSBzdHJpbmdzIGRpdmVyZ2UKKyAqLworZnVuY3Rp b24gZmlyc3REaWZmZXJlbmNlSW5kZXgoc3RyaW5nMSwgc3RyaW5nMikgeworICB2YXIgbWluTGVu ID0gTWF0aC5taW4oc3RyaW5nMS5sZW5ndGgsIHN0cmluZzIubGVuZ3RoKTsKKyAgZm9yICh2YXIg aSA9IDA7IGkgPCBtaW5MZW47IGkrKykgeworICAgIGlmIChzdHJpbmcxLmNoYXJBdChpKSAhPT0g c3RyaW5nMi5jaGFyQXQoaSkpIHsKKyAgICAgIHJldHVybiBpOworICAgIH0KKyAgfQorICByZXR1 cm4gc3RyaW5nMS5sZW5ndGggPT09IHN0cmluZzIubGVuZ3RoID8gLTEgOiBtaW5MZW47Cit9CisK Ky8qKgorICogQHBhcmFtIHtET01FbGVtZW50fERPTURvY3VtZW50fSBjb250YWluZXIgRE9NIGVs ZW1lbnQgdGhhdCBtYXkgY29udGFpbgorICogYSBSZWFjdCBjb21wb25lbnQKKyAqIEByZXR1cm4g ez8qfSBET00gZWxlbWVudCB0aGF0IG1heSBoYXZlIHRoZSByZWFjdFJvb3QgSUQsIG9yIG51bGwu CisgKi8KK2Z1bmN0aW9uIGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIp IHsKKyAgaWYgKCFjb250YWluZXIpIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIGlmIChj b250YWluZXIubm9kZVR5cGUgPT09IERPQ19OT0RFX1RZUEUpIHsKKyAgICByZXR1cm4gY29udGFp bmVyLmRvY3VtZW50RWxlbWVudDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gY29udGFpbmVyLmZp cnN0Q2hpbGQ7CisgIH0KK30KKworZnVuY3Rpb24gaW50ZXJuYWxHZXRJRChub2RlKSB7CisgIC8v IElmIG5vZGUgaXMgc29tZXRoaW5nIGxpa2UgYSB3aW5kb3csIGRvY3VtZW50LCBvciB0ZXh0IG5v ZGUsIG5vbmUgb2YKKyAgLy8gd2hpY2ggc3VwcG9ydCBhdHRyaWJ1dGVzIG9yIGEgLmdldEF0dHJp YnV0ZSBtZXRob2QsIGdyYWNlZnVsbHkgcmV0dXJuCisgIC8vIHRoZSBlbXB0eSBzdHJpbmcsIGFz IGlmIHRoZSBhdHRyaWJ1dGUgd2VyZSBtaXNzaW5nLgorICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1 dGUgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKSB8fCAnJzsKK30KKworLyoqCisgKiBN b3VudHMgdGhpcyBjb21wb25lbnQgYW5kIGluc2VydHMgaXQgaW50byB0aGUgRE9NLgorICoKKyAq IEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGNvbXBvbmVudEluc3RhbmNlIFRoZSBpbnN0YW5jZSB0 byBtb3VudC4KKyAqIEBwYXJhbSB7RE9NRWxlbWVudH0gY29udGFpbmVyIERPTSBlbGVtZW50IHRv IG1vdW50IGludG8uCisgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5z YWN0aW9uCisgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZFJldXNlTWFya3VwIElmIHRydWUsIGRv IG5vdCBpbnNlcnQgbWFya3VwCisgKi8KK2Z1bmN0aW9uIG1vdW50Q29tcG9uZW50SW50b05vZGUo d3JhcHBlckluc3RhbmNlLCBjb250YWluZXIsIHRyYW5zYWN0aW9uLCBzaG91bGRSZXVzZU1hcmt1 cCwgY29udGV4dCkgeworICB2YXIgbWFya2VyTmFtZTsKKyAgaWYgKFJlYWN0RmVhdHVyZUZsYWdz LmxvZ1RvcExldmVsUmVuZGVycykgeworICAgIHZhciB3cmFwcGVkRWxlbWVudCA9IHdyYXBwZXJJ bnN0YW5jZS5fY3VycmVudEVsZW1lbnQucHJvcHMuY2hpbGQ7CisgICAgdmFyIHR5cGUgPSB3cmFw cGVkRWxlbWVudC50eXBlOworICAgIG1hcmtlck5hbWUgPSAnUmVhY3QgbW91bnQ6ICcgKyAodHlw ZW9mIHR5cGUgPT09ICdzdHJpbmcnID8gdHlwZSA6IHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5u YW1lKTsKKyAgICBjb25zb2xlLnRpbWUobWFya2VyTmFtZSk7CisgIH0KKworICB2YXIgbWFya3Vw ID0gUmVhY3RSZWNvbmNpbGVyLm1vdW50Q29tcG9uZW50KHdyYXBwZXJJbnN0YW5jZSwgdHJhbnNh Y3Rpb24sIG51bGwsIFJlYWN0RE9NQ29udGFpbmVySW5mbyh3cmFwcGVySW5zdGFuY2UsIGNvbnRh aW5lciksIGNvbnRleHQsIDAgLyogcGFyZW50RGVidWdJRCAqLworICApOworCisgIGlmIChtYXJr ZXJOYW1lKSB7CisgICAgY29uc29sZS50aW1lRW5kKG1hcmtlck5hbWUpOworICB9CisKKyAgd3Jh cHBlckluc3RhbmNlLl9yZW5kZXJlZENvbXBvbmVudC5fdG9wTGV2ZWxXcmFwcGVyID0gd3JhcHBl ckluc3RhbmNlOworICBSZWFjdE1vdW50Ll9tb3VudEltYWdlSW50b05vZGUobWFya3VwLCBjb250 YWluZXIsIHdyYXBwZXJJbnN0YW5jZSwgc2hvdWxkUmV1c2VNYXJrdXAsIHRyYW5zYWN0aW9uKTsK K30KKworLyoqCisgKiBCYXRjaGVkIG1vdW50LgorICoKKyAqIEBwYXJhbSB7UmVhY3RDb21wb25l bnR9IGNvbXBvbmVudEluc3RhbmNlIFRoZSBpbnN0YW5jZSB0byBtb3VudC4KKyAqIEBwYXJhbSB7 RE9NRWxlbWVudH0gY29udGFpbmVyIERPTSBlbGVtZW50IHRvIG1vdW50IGludG8uCisgKiBAcGFy YW0ge2Jvb2xlYW59IHNob3VsZFJldXNlTWFya3VwIElmIHRydWUsIGRvIG5vdCBpbnNlcnQgbWFy a3VwCisgKi8KK2Z1bmN0aW9uIGJhdGNoZWRNb3VudENvbXBvbmVudEludG9Ob2RlKGNvbXBvbmVu dEluc3RhbmNlLCBjb250YWluZXIsIHNob3VsZFJldXNlTWFya3VwLCBjb250ZXh0KSB7CisgIHZh ciB0cmFuc2FjdGlvbiA9IFJlYWN0VXBkYXRlcy5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uLmdl dFBvb2xlZCgKKyAgLyogdXNlQ3JlYXRlRWxlbWVudCAqLworICAhc2hvdWxkUmV1c2VNYXJrdXAg JiYgUmVhY3RET01GZWF0dXJlRmxhZ3MudXNlQ3JlYXRlRWxlbWVudCk7CisgIHRyYW5zYWN0aW9u LnBlcmZvcm0obW91bnRDb21wb25lbnRJbnRvTm9kZSwgbnVsbCwgY29tcG9uZW50SW5zdGFuY2Us IGNvbnRhaW5lciwgdHJhbnNhY3Rpb24sIHNob3VsZFJldXNlTWFya3VwLCBjb250ZXh0KTsKKyAg UmVhY3RVcGRhdGVzLlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24ucmVsZWFzZSh0cmFuc2FjdGlv bik7Cit9CisKKy8qKgorICogVW5tb3VudHMgYSBjb21wb25lbnQgYW5kIHJlbW92ZXMgaXQgZnJv bSB0aGUgRE9NLgorICoKKyAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGluc3RhbmNlIFJlYWN0 IGNvbXBvbmVudCBpbnN0YW5jZS4KKyAqIEBwYXJhbSB7RE9NRWxlbWVudH0gY29udGFpbmVyIERP TSBlbGVtZW50IHRvIHVubW91bnQgZnJvbS4KKyAqIEBmaW5hbAorICogQGludGVybmFsCisgKiBA c2VlIHtSZWFjdE1vdW50LnVubW91bnRDb21wb25lbnRBdE5vZGV9CisgKi8KK2Z1bmN0aW9uIHVu bW91bnRDb21wb25lbnRGcm9tTm9kZShpbnN0YW5jZSwgY29udGFpbmVyLCBzYWZlbHkpIHsKKyAg aWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgIFJlYWN0SW5zdHJ1bWVu dGF0aW9uLmRlYnVnVG9vbC5vbkJlZ2luRmx1c2goKTsKKyAgfQorICBSZWFjdFJlY29uY2lsZXIu dW5tb3VudENvbXBvbmVudChpbnN0YW5jZSwgc2FmZWx5KTsKKyAgaWYgKCJkZXZlbG9wbWVudCIg IT09ICdwcm9kdWN0aW9uJykgeworICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5v bkVuZEZsdXNoKCk7CisgIH0KKworICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBET0NfTk9E RV9UWVBFKSB7CisgICAgY29udGFpbmVyID0gY29udGFpbmVyLmRvY3VtZW50RWxlbWVudDsKKyAg fQorCisgIC8vIGh0dHA6Ly9qc3BlcmYuY29tL2VtcHR5aW5nLWEtbm9kZQorICB3aGlsZSAoY29u dGFpbmVyLmxhc3RDaGlsZCkgeworICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjb250YWluZXIu bGFzdENoaWxkKTsKKyAgfQorfQorCisvKioKKyAqIFRydWUgaWYgdGhlIHN1cHBsaWVkIERPTSBu b2RlIGhhcyBhIGRpcmVjdCBSZWFjdC1yZW5kZXJlZCBjaGlsZCB0aGF0IGlzCisgKiBub3QgYSBS ZWFjdCByb290IGVsZW1lbnQuIFVzZWZ1bCBmb3Igd2FybmluZyBpbiBgcmVuZGVyYCwKKyAqIGB1 bm1vdW50Q29tcG9uZW50QXROb2RlYCwgZXRjLgorICoKKyAqIEBwYXJhbSB7P0RPTUVsZW1lbnR9 IG5vZGUgVGhlIGNhbmRpZGF0ZSBET00gbm9kZS4KKyAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUg aWYgdGhlIERPTSBlbGVtZW50IGNvbnRhaW5zIGEgZGlyZWN0IGNoaWxkIHRoYXQgd2FzCisgKiBy ZW5kZXJlZCBieSBSZWFjdCBidXQgaXMgbm90IGEgcm9vdCBlbGVtZW50LgorICogQGludGVybmFs CisgKi8KK2Z1bmN0aW9uIGhhc05vblJvb3RSZWFjdENoaWxkKGNvbnRhaW5lcikgeworICB2YXIg cm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7CisgIGlm IChyb290RWwpIHsKKyAgICB2YXIgaW5zdCA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0 YW5jZUZyb21Ob2RlKHJvb3RFbCk7CisgICAgcmV0dXJuICEhKGluc3QgJiYgaW5zdC5faG9zdFBh cmVudCk7CisgIH0KK30KKworLyoqCisgKiBUcnVlIGlmIHRoZSBzdXBwbGllZCBET00gbm9kZSBp cyBhIFJlYWN0IERPTSBlbGVtZW50IGFuZAorICogaXQgaGFzIGJlZW4gcmVuZGVyZWQgYnkgYW5v dGhlciBjb3B5IG9mIFJlYWN0LgorICoKKyAqIEBwYXJhbSB7P0RPTUVsZW1lbnR9IG5vZGUgVGhl IGNhbmRpZGF0ZSBET00gbm9kZS4KKyAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIERP TSBoYXMgYmVlbiByZW5kZXJlZCBieSBhbm90aGVyIGNvcHkgb2YgUmVhY3QKKyAqIEBpbnRlcm5h bAorICovCitmdW5jdGlvbiBub2RlSXNSZW5kZXJlZEJ5T3RoZXJJbnN0YW5jZShjb250YWluZXIp IHsKKyAgdmFyIHJvb3RFbCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWlu ZXIpOworICByZXR1cm4gISEocm9vdEVsICYmIGlzUmVhY3ROb2RlKHJvb3RFbCkgJiYgIVJlYWN0 RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKHJvb3RFbCkpOworfQorCisvKioK KyAqIFRydWUgaWYgdGhlIHN1cHBsaWVkIERPTSBub2RlIGlzIGEgdmFsaWQgbm9kZSBlbGVtZW50 LgorICoKKyAqIEBwYXJhbSB7P0RPTUVsZW1lbnR9IG5vZGUgVGhlIGNhbmRpZGF0ZSBET00gbm9k ZS4KKyAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIERPTSBpcyBhIHZhbGlkIERPTSBu b2RlLgorICogQGludGVybmFsCisgKi8KK2Z1bmN0aW9uIGlzVmFsaWRDb250YWluZXIobm9kZSkg eworICByZXR1cm4gISEobm9kZSAmJiAobm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFX1RZ UEUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DX05PREVfVFlQRSB8fCBub2RlLm5vZGVUeXBlID09 PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFX1RZUEUpKTsKK30KKworLyoqCisgKiBUcnVlIGlmIHRo ZSBzdXBwbGllZCBET00gbm9kZSBpcyBhIHZhbGlkIFJlYWN0IG5vZGUgZWxlbWVudC4KKyAqCisg KiBAcGFyYW0gez9ET01FbGVtZW50fSBub2RlIFRoZSBjYW5kaWRhdGUgRE9NIG5vZGUuCisgKiBA cmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBET00gaXMgYSB2YWxpZCBSZWFjdCBET00gbm9k ZS4KKyAqIEBpbnRlcm5hbAorICovCitmdW5jdGlvbiBpc1JlYWN0Tm9kZShub2RlKSB7CisgIHJl dHVybiBpc1ZhbGlkQ29udGFpbmVyKG5vZGUpICYmIChub2RlLmhhc0F0dHJpYnV0ZShST09UX0FU VFJfTkFNRSkgfHwgbm9kZS5oYXNBdHRyaWJ1dGUoQVRUUl9OQU1FKSk7Cit9CisKK2Z1bmN0aW9u IGdldEhvc3RSb290SW5zdGFuY2VJbkNvbnRhaW5lcihjb250YWluZXIpIHsKKyAgdmFyIHJvb3RF bCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpOworICB2YXIgcHJl dkhvc3RJbnN0YW5jZSA9IHJvb3RFbCAmJiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFu Y2VGcm9tTm9kZShyb290RWwpOworICByZXR1cm4gcHJldkhvc3RJbnN0YW5jZSAmJiAhcHJldkhv c3RJbnN0YW5jZS5faG9zdFBhcmVudCA/IHByZXZIb3N0SW5zdGFuY2UgOiBudWxsOworfQorCitm dW5jdGlvbiBnZXRUb3BMZXZlbFdyYXBwZXJJbkNvbnRhaW5lcihjb250YWluZXIpIHsKKyAgdmFy IHJvb3QgPSBnZXRIb3N0Um9vdEluc3RhbmNlSW5Db250YWluZXIoY29udGFpbmVyKTsKKyAgcmV0 dXJuIHJvb3QgPyByb290Ll9ob3N0Q29udGFpbmVySW5mby5fdG9wTGV2ZWxXcmFwcGVyIDogbnVs bDsKK30KKworLyoqCisgKiBUZW1wb3JhcnkgKD8pIGhhY2sgc28gdGhhdCB3ZSBjYW4gc3RvcmUg YWxsIHRvcC1sZXZlbCBwZW5kaW5nIHVwZGF0ZXMgb24KKyAqIGNvbXBvc2l0ZXMgaW5zdGVhZCBv ZiBoYXZpbmcgdG8gd29ycnkgYWJvdXQgZGlmZmVyZW50IHR5cGVzIG9mIGNvbXBvbmVudHMKKyAq IGhlcmUuCisgKi8KK3ZhciB0b3BMZXZlbFJvb3RDb3VudGVyID0gMTsKK3ZhciBUb3BMZXZlbFdy YXBwZXIgPSBmdW5jdGlvbiAoKSB7CisgIHRoaXMucm9vdElEID0gdG9wTGV2ZWxSb290Q291bnRl cisrOworfTsKK1RvcExldmVsV3JhcHBlci5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCA9IHt9 OworaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICBUb3BMZXZlbFdyYXBw ZXIuZGlzcGxheU5hbWUgPSAnVG9wTGV2ZWxXcmFwcGVyJzsKK30KK1RvcExldmVsV3JhcHBlci5w cm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gdGhpcy5wcm9wcy5jaGls ZDsKK307CitUb3BMZXZlbFdyYXBwZXIuaXNSZWFjdFRvcExldmVsV3JhcHBlciA9IHRydWU7CisK Ky8qKgorICogTW91bnRpbmcgaXMgdGhlIHByb2Nlc3Mgb2YgaW5pdGlhbGl6aW5nIGEgUmVhY3Qg Y29tcG9uZW50IGJ5IGNyZWF0aW5nIGl0cworICogcmVwcmVzZW50YXRpdmUgRE9NIGVsZW1lbnRz IGFuZCBpbnNlcnRpbmcgdGhlbSBpbnRvIGEgc3VwcGxpZWQgYGNvbnRhaW5lcmAuCisgKiBBbnkg cHJpb3IgY29udGVudCBpbnNpZGUgYGNvbnRhaW5lcmAgaXMgZGVzdHJveWVkIGluIHRoZSBwcm9j ZXNzLgorICoKKyAqICAgUmVhY3RNb3VudC5yZW5kZXIoCisgKiAgICAgY29tcG9uZW50LAorICog ICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250YWluZXInKQorICogICApOworICoKKyAq ICAgPGRpdiBpZD0iY29udGFpbmVyIj4gICAgICAgICAgICAgICAgICAgPC0tIFN1cHBsaWVkIGBj b250YWluZXJgLgorICogICAgIDxkaXYgZGF0YS1yZWFjdGlkPSIuMyI+ICAgICAgICAgICAgICA8 LS0gUmVuZGVyZWQgcmVhY3RSb290IG9mIFJlYWN0CisgKiAgICAgICAvLyAuLi4gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuCisgKiAgICAgPC9kaXY+CisgKiAgIDwv ZGl2PgorICoKKyAqIEluc2lkZSBvZiBgY29udGFpbmVyYCwgdGhlIGZpcnN0IGVsZW1lbnQgcmVu ZGVyZWQgaXMgdGhlICJyZWFjdFJvb3QiLgorICovCit2YXIgUmVhY3RNb3VudCA9IHsKKworICBU b3BMZXZlbFdyYXBwZXI6IFRvcExldmVsV3JhcHBlciwKKworICAvKioKKyAgICogVXNlZCBieSBk ZXZ0b29scy4gVGhlIGtleXMgYXJlIG5vdCBpbXBvcnRhbnQuCisgICAqLworICBfaW5zdGFuY2Vz QnlSZWFjdFJvb3RJRDogaW5zdGFuY2VzQnlSZWFjdFJvb3RJRCwKKworICAvKioKKyAgICogVGhp cyBpcyBhIGhvb2sgcHJvdmlkZWQgdG8gc3VwcG9ydCByZW5kZXJpbmcgUmVhY3QgY29tcG9uZW50 cyB3aGlsZQorICAgKiBlbnN1cmluZyB0aGF0IHRoZSBhcHBhcmVudCBzY3JvbGwgcG9zaXRpb24g b2YgaXRzIGBjb250YWluZXJgIGRvZXMgbm90CisgICAqIGNoYW5nZS4KKyAgICoKKyAgICogQHBh cmFtIHtET01FbGVtZW50fSBjb250YWluZXIgVGhlIGBjb250YWluZXJgIGJlaW5nIHJlbmRlcmVk IGludG8uCisgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHJlbmRlckNhbGxiYWNrIFRoaXMgbXVzdCBi ZSBjYWxsZWQgb25jZSB0byBkbyB0aGUgcmVuZGVyLgorICAgKi8KKyAgc2Nyb2xsTW9uaXRvcjog ZnVuY3Rpb24gKGNvbnRhaW5lciwgcmVuZGVyQ2FsbGJhY2spIHsKKyAgICByZW5kZXJDYWxsYmFj aygpOworICB9LAorCisgIC8qKgorICAgKiBUYWtlIGEgY29tcG9uZW50IHRoYXQncyBhbHJlYWR5 IG1vdW50ZWQgaW50byB0aGUgRE9NIGFuZCByZXBsYWNlIGl0cyBwcm9wcworICAgKiBAcGFyYW0g e1JlYWN0Q29tcG9uZW50fSBwcmV2Q29tcG9uZW50IGNvbXBvbmVudCBpbnN0YW5jZSBhbHJlYWR5 IGluIHRoZSBET00KKyAgICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IG5leHRFbGVtZW50IGNvbXBv bmVudCBpbnN0YW5jZSB0byByZW5kZXIKKyAgICogQHBhcmFtIHtET01FbGVtZW50fSBjb250YWlu ZXIgY29udGFpbmVyIHRvIHJlbmRlciBpbnRvCisgICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxs YmFjayBmdW5jdGlvbiB0cmlnZ2VyZWQgb24gY29tcGxldGlvbgorICAgKi8KKyAgX3VwZGF0ZVJv b3RDb21wb25lbnQ6IGZ1bmN0aW9uIChwcmV2Q29tcG9uZW50LCBuZXh0RWxlbWVudCwgbmV4dENv bnRleHQsIGNvbnRhaW5lciwgY2FsbGJhY2spIHsKKyAgICBSZWFjdE1vdW50LnNjcm9sbE1vbml0 b3IoY29udGFpbmVyLCBmdW5jdGlvbiAoKSB7CisgICAgICBSZWFjdFVwZGF0ZVF1ZXVlLmVucXVl dWVFbGVtZW50SW50ZXJuYWwocHJldkNvbXBvbmVudCwgbmV4dEVsZW1lbnQsIG5leHRDb250ZXh0 KTsKKyAgICAgIGlmIChjYWxsYmFjaykgeworICAgICAgICBSZWFjdFVwZGF0ZVF1ZXVlLmVucXVl dWVDYWxsYmFja0ludGVybmFsKHByZXZDb21wb25lbnQsIGNhbGxiYWNrKTsKKyAgICAgIH0KKyAg ICB9KTsKKworICAgIHJldHVybiBwcmV2Q29tcG9uZW50OworICB9LAorCisgIC8qKgorICAgKiBS ZW5kZXIgYSBuZXcgY29tcG9uZW50IGludG8gdGhlIERPTS4gSG9va2VkIGJ5IGhvb2tzIQorICAg KgorICAgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gbmV4dEVsZW1lbnQgZWxlbWVudCB0byByZW5k ZXIKKyAgICogQHBhcmFtIHtET01FbGVtZW50fSBjb250YWluZXIgY29udGFpbmVyIHRvIHJlbmRl ciBpbnRvCisgICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkUmV1c2VNYXJrdXAgaWYgd2Ugc2hv dWxkIHNraXAgdGhlIG1hcmt1cCBpbnNlcnRpb24KKyAgICogQHJldHVybiB7UmVhY3RDb21wb25l bnR9IG5leHRDb21wb25lbnQKKyAgICovCisgIF9yZW5kZXJOZXdSb290Q29tcG9uZW50OiBmdW5j dGlvbiAobmV4dEVsZW1lbnQsIGNvbnRhaW5lciwgc2hvdWxkUmV1c2VNYXJrdXAsIGNvbnRleHQp IHsKKyAgICAvLyBWYXJpb3VzIHBhcnRzIG9mIG91ciBjb2RlIChzdWNoIGFzIFJlYWN0Q29tcG9z aXRlQ29tcG9uZW50J3MKKyAgICAvLyBfcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50KSBhc3N1bWUg dGhhdCBjYWxscyB0byByZW5kZXIgYXJlbid0IG5lc3RlZDsKKyAgICAvLyB2ZXJpZnkgdGhhdCB0 aGF0J3MgdGhlIGNhc2UuCisgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2Fy bmluZyhSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ID09IG51bGwsICdfcmVuZGVyTmV3Um9vdENv bXBvbmVudCgpOiBSZW5kZXIgbWV0aG9kcyBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uICcgKyAn b2YgcHJvcHMgYW5kIHN0YXRlOyB0cmlnZ2VyaW5nIG5lc3RlZCBjb21wb25lbnQgdXBkYXRlcyBm cm9tICcgKyAncmVuZGVyIGlzIG5vdCBhbGxvd2VkLiBJZiBuZWNlc3NhcnksIHRyaWdnZXIgbmVz dGVkIHVwZGF0ZXMgaW4gJyArICdjb21wb25lbnREaWRVcGRhdGUuIENoZWNrIHRoZSByZW5kZXIg bWV0aG9kIG9mICVzLicsIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgJiYgUmVhY3RDdXJyZW50 T3duZXIuY3VycmVudC5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiB2 b2lkIDA7CisKKyAgICAhaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpID8gImRldmVsb3BtZW50 IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnX3JlZ2lzdGVyQ29tcG9uZW50 KC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJykgOiBfcHJvZElu dmFyaWFudCgnMzcnKSA6IHZvaWQgMDsKKworICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5l bnN1cmVTY3JvbGxWYWx1ZU1vbml0b3JpbmcoKTsKKyAgICB2YXIgY29tcG9uZW50SW5zdGFuY2Ug PSBpbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50KG5leHRFbGVtZW50LCBmYWxzZSk7CisKKyAgICAv LyBUaGUgaW5pdGlhbCByZW5kZXIgaXMgc3luY2hyb25vdXMgYnV0IGFueSB1cGRhdGVzIHRoYXQg aGFwcGVuIGR1cmluZworICAgIC8vIHJlbmRlcmluZywgaW4gY29tcG9uZW50V2lsbE1vdW50IG9y IGNvbXBvbmVudERpZE1vdW50LCB3aWxsIGJlIGJhdGNoZWQKKyAgICAvLyBhY2NvcmRpbmcgdG8g dGhlIGN1cnJlbnQgYmF0Y2hpbmcgc3RyYXRlZ3kuCisKKyAgICBSZWFjdFVwZGF0ZXMuYmF0Y2hl ZFVwZGF0ZXMoYmF0Y2hlZE1vdW50Q29tcG9uZW50SW50b05vZGUsIGNvbXBvbmVudEluc3RhbmNl LCBjb250YWluZXIsIHNob3VsZFJldXNlTWFya3VwLCBjb250ZXh0KTsKKworICAgIHZhciB3cmFw cGVySUQgPSBjb21wb25lbnRJbnN0YW5jZS5faW5zdGFuY2Uucm9vdElEOworICAgIGluc3RhbmNl c0J5UmVhY3RSb290SURbd3JhcHBlcklEXSA9IGNvbXBvbmVudEluc3RhbmNlOworCisgICAgcmV0 dXJuIGNvbXBvbmVudEluc3RhbmNlOworICB9LAorCisgIC8qKgorICAgKiBSZW5kZXJzIGEgUmVh Y3QgY29tcG9uZW50IGludG8gdGhlIERPTSBpbiB0aGUgc3VwcGxpZWQgYGNvbnRhaW5lcmAuCisg ICAqCisgICAqIElmIHRoZSBSZWFjdCBjb21wb25lbnQgd2FzIHByZXZpb3VzbHkgcmVuZGVyZWQg aW50byBgY29udGFpbmVyYCwgdGhpcyB3aWxsCisgICAqIHBlcmZvcm0gYW4gdXBkYXRlIG9uIGl0 IGFuZCBvbmx5IG11dGF0ZSB0aGUgRE9NIGFzIG5lY2Vzc2FyeSB0byByZWZsZWN0IHRoZQorICAg KiBsYXRlc3QgUmVhY3QgY29tcG9uZW50LgorICAgKgorICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9u ZW50fSBwYXJlbnRDb21wb25lbnQgVGhlIGNvbmNlcHR1YWwgcGFyZW50IG9mIHRoaXMgcmVuZGVy IHRyZWUuCisgICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBuZXh0RWxlbWVudCBDb21wb25lbnQg ZWxlbWVudCB0byByZW5kZXIuCisgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gY29udGFpbmVyIERP TSBlbGVtZW50IHRvIHJlbmRlciBpbnRvLgorICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJh Y2sgZnVuY3Rpb24gdHJpZ2dlcmVkIG9uIGNvbXBsZXRpb24KKyAgICogQHJldHVybiB7UmVhY3RD b21wb25lbnR9IENvbXBvbmVudCBpbnN0YW5jZSByZW5kZXJlZCBpbiBgY29udGFpbmVyYC4KKyAg ICovCisgIHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyOiBmdW5jdGlvbiAocGFyZW50Q29tcG9u ZW50LCBuZXh0RWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykgeworICAgICEocGFyZW50Q29t cG9uZW50ICE9IG51bGwgJiYgUmVhY3RJbnN0YW5jZU1hcC5oYXMocGFyZW50Q29tcG9uZW50KSkg PyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdwYXJl bnRDb21wb25lbnQgbXVzdCBiZSBhIHZhbGlkIFJlYWN0IENvbXBvbmVudCcpIDogX3Byb2RJbnZh cmlhbnQoJzM4JykgOiB2b2lkIDA7CisgICAgcmV0dXJuIFJlYWN0TW91bnQuX3JlbmRlclN1YnRy ZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgbmV4dEVsZW1lbnQsIGNvbnRhaW5lciwg Y2FsbGJhY2spOworICB9LAorCisgIF9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcjogZnVuY3Rp b24gKHBhcmVudENvbXBvbmVudCwgbmV4dEVsZW1lbnQsIGNvbnRhaW5lciwgY2FsbGJhY2spIHsK KyAgICBSZWFjdFVwZGF0ZVF1ZXVlLnZhbGlkYXRlQ2FsbGJhY2soY2FsbGJhY2ssICdSZWFjdERP TS5yZW5kZXInKTsKKyAgICAhUmVhY3QuaXNWYWxpZEVsZW1lbnQobmV4dEVsZW1lbnQpID8gImRl dmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RET00u cmVuZGVyKCk6IEludmFsaWQgY29tcG9uZW50IGVsZW1lbnQuJXMnLCB0eXBlb2YgbmV4dEVsZW1l bnQgPT09ICdzdHJpbmcnID8gJyBJbnN0ZWFkIG9mIHBhc3NpbmcgYSBzdHJpbmcgbGlrZSBcJ2Rp dlwnLCBwYXNzICcgKyAnUmVhY3QuY3JlYXRlRWxlbWVudChcJ2RpdlwnKSBvciA8ZGl2IC8+Licg OiB0eXBlb2YgbmV4dEVsZW1lbnQgPT09ICdmdW5jdGlvbicgPyAnIEluc3RlYWQgb2YgcGFzc2lu ZyBhIGNsYXNzIGxpa2UgRm9vLCBwYXNzICcgKyAnUmVhY3QuY3JlYXRlRWxlbWVudChGb28pIG9y IDxGb28gLz4uJyA6CisgICAgLy8gQ2hlY2sgaWYgaXQgcXVhY2tzIGxpa2UgYW4gZWxlbWVudAor ICAgIG5leHRFbGVtZW50ICE9IG51bGwgJiYgbmV4dEVsZW1lbnQucHJvcHMgIT09IHVuZGVmaW5l ZCA/ICcgVGhpcyBtYXkgYmUgY2F1c2VkIGJ5IHVuaW50ZW50aW9uYWxseSBsb2FkaW5nIHR3byBp bmRlcGVuZGVudCAnICsgJ2NvcGllcyBvZiBSZWFjdC4nIDogJycpIDogX3Byb2RJbnZhcmlhbnQo JzM5JywgdHlwZW9mIG5leHRFbGVtZW50ID09PSAnc3RyaW5nJyA/ICcgSW5zdGVhZCBvZiBwYXNz aW5nIGEgc3RyaW5nIGxpa2UgXCdkaXZcJywgcGFzcyAnICsgJ1JlYWN0LmNyZWF0ZUVsZW1lbnQo XCdkaXZcJykgb3IgPGRpdiAvPi4nIDogdHlwZW9mIG5leHRFbGVtZW50ID09PSAnZnVuY3Rpb24n ID8gJyBJbnN0ZWFkIG9mIHBhc3NpbmcgYSBjbGFzcyBsaWtlIEZvbywgcGFzcyAnICsgJ1JlYWN0 LmNyZWF0ZUVsZW1lbnQoRm9vKSBvciA8Rm9vIC8+LicgOiBuZXh0RWxlbWVudCAhPSBudWxsICYm IG5leHRFbGVtZW50LnByb3BzICE9PSB1bmRlZmluZWQgPyAnIFRoaXMgbWF5IGJlIGNhdXNlZCBi eSB1bmludGVudGlvbmFsbHkgbG9hZGluZyB0d28gaW5kZXBlbmRlbnQgJyArICdjb3BpZXMgb2Yg UmVhY3QuJyA6ICcnKSA6IHZvaWQgMDsKKworICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0 aW9uJyA/IHdhcm5pbmcoIWNvbnRhaW5lciB8fCAhY29udGFpbmVyLnRhZ05hbWUgfHwgY29udGFp bmVyLnRhZ05hbWUudG9VcHBlckNhc2UoKSAhPT0gJ0JPRFknLCAncmVuZGVyKCk6IFJlbmRlcmlu ZyBjb21wb25lbnRzIGRpcmVjdGx5IGludG8gZG9jdW1lbnQuYm9keSBpcyAnICsgJ2Rpc2NvdXJh Z2VkLCBzaW5jZSBpdHMgY2hpbGRyZW4gYXJlIG9mdGVuIG1hbmlwdWxhdGVkIGJ5IHRoaXJkLXBh cnR5ICcgKyAnc2NyaXB0cyBhbmQgYnJvd3NlciBleHRlbnNpb25zLiBUaGlzIG1heSBsZWFkIHRv IHN1YnRsZSAnICsgJ3JlY29uY2lsaWF0aW9uIGlzc3Vlcy4gVHJ5IHJlbmRlcmluZyBpbnRvIGEg Y29udGFpbmVyIGVsZW1lbnQgY3JlYXRlZCAnICsgJ2ZvciB5b3VyIGFwcC4nKSA6IHZvaWQgMDsK KworICAgIHZhciBuZXh0V3JhcHBlZEVsZW1lbnQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KFRvcExl dmVsV3JhcHBlciwgeyBjaGlsZDogbmV4dEVsZW1lbnQgfSk7CisKKyAgICB2YXIgbmV4dENvbnRl eHQ7CisgICAgaWYgKHBhcmVudENvbXBvbmVudCkgeworICAgICAgdmFyIHBhcmVudEluc3QgPSBS ZWFjdEluc3RhbmNlTWFwLmdldChwYXJlbnRDb21wb25lbnQpOworICAgICAgbmV4dENvbnRleHQg PSBwYXJlbnRJbnN0Ll9wcm9jZXNzQ2hpbGRDb250ZXh0KHBhcmVudEluc3QuX2NvbnRleHQpOwor ICAgIH0gZWxzZSB7CisgICAgICBuZXh0Q29udGV4dCA9IGVtcHR5T2JqZWN0OworICAgIH0KKwor ICAgIHZhciBwcmV2Q29tcG9uZW50ID0gZ2V0VG9wTGV2ZWxXcmFwcGVySW5Db250YWluZXIoY29u dGFpbmVyKTsKKworICAgIGlmIChwcmV2Q29tcG9uZW50KSB7CisgICAgICB2YXIgcHJldldyYXBw ZWRFbGVtZW50ID0gcHJldkNvbXBvbmVudC5fY3VycmVudEVsZW1lbnQ7CisgICAgICB2YXIgcHJl dkVsZW1lbnQgPSBwcmV2V3JhcHBlZEVsZW1lbnQucHJvcHMuY2hpbGQ7CisgICAgICBpZiAoc2hv dWxkVXBkYXRlUmVhY3RDb21wb25lbnQocHJldkVsZW1lbnQsIG5leHRFbGVtZW50KSkgeworICAg ICAgICB2YXIgcHVibGljSW5zdCA9IHByZXZDb21wb25lbnQuX3JlbmRlcmVkQ29tcG9uZW50Lmdl dFB1YmxpY0luc3RhbmNlKCk7CisgICAgICAgIHZhciB1cGRhdGVkQ2FsbGJhY2sgPSBjYWxsYmFj ayAmJiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgY2FsbGJhY2suY2FsbChwdWJsaWNJbnN0KTsK KyAgICAgICAgfTsKKyAgICAgICAgUmVhY3RNb3VudC5fdXBkYXRlUm9vdENvbXBvbmVudChwcmV2 Q29tcG9uZW50LCBuZXh0V3JhcHBlZEVsZW1lbnQsIG5leHRDb250ZXh0LCBjb250YWluZXIsIHVw ZGF0ZWRDYWxsYmFjayk7CisgICAgICAgIHJldHVybiBwdWJsaWNJbnN0OworICAgICAgfSBlbHNl IHsKKyAgICAgICAgUmVhY3RNb3VudC51bm1vdW50Q29tcG9uZW50QXROb2RlKGNvbnRhaW5lcik7 CisgICAgICB9CisgICAgfQorCisgICAgdmFyIHJlYWN0Um9vdEVsZW1lbnQgPSBnZXRSZWFjdFJv b3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTsKKyAgICB2YXIgY29udGFpbmVySGFzUmVh Y3RNYXJrdXAgPSByZWFjdFJvb3RFbGVtZW50ICYmICEhaW50ZXJuYWxHZXRJRChyZWFjdFJvb3RF bGVtZW50KTsKKyAgICB2YXIgY29udGFpbmVySGFzTm9uUm9vdFJlYWN0Q2hpbGQgPSBoYXNOb25S b290UmVhY3RDaGlsZChjb250YWluZXIpOworCisgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdw cm9kdWN0aW9uJykgeworICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2Fy bmluZyghY29udGFpbmVySGFzTm9uUm9vdFJlYWN0Q2hpbGQsICdyZW5kZXIoLi4uKTogUmVwbGFj aW5nIFJlYWN0LXJlbmRlcmVkIGNoaWxkcmVuIHdpdGggYSBuZXcgcm9vdCAnICsgJ2NvbXBvbmVu dC4gSWYgeW91IGludGVuZGVkIHRvIHVwZGF0ZSB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlLCAn ICsgJ3lvdSBzaG91bGQgaW5zdGVhZCBoYXZlIHRoZSBleGlzdGluZyBjaGlsZHJlbiB1cGRhdGUg dGhlaXIgc3RhdGUgJyArICdhbmQgcmVuZGVyIHRoZSBuZXcgY29tcG9uZW50cyBpbnN0ZWFkIG9m IGNhbGxpbmcgUmVhY3RET00ucmVuZGVyLicpIDogdm9pZCAwOworCisgICAgICBpZiAoIWNvbnRh aW5lckhhc1JlYWN0TWFya3VwIHx8IHJlYWN0Um9vdEVsZW1lbnQubmV4dFNpYmxpbmcpIHsKKyAg ICAgICAgdmFyIHJvb3RFbGVtZW50U2libGluZyA9IHJlYWN0Um9vdEVsZW1lbnQ7CisgICAgICAg IHdoaWxlIChyb290RWxlbWVudFNpYmxpbmcpIHsKKyAgICAgICAgICBpZiAoaW50ZXJuYWxHZXRJ RChyb290RWxlbWVudFNpYmxpbmcpKSB7CisgICAgICAgICAgICAiZGV2ZWxvcG1lbnQiICE9PSAn cHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAncmVuZGVyKCk6IFRhcmdldCBub2RlIGhhcyBt YXJrdXAgcmVuZGVyZWQgYnkgUmVhY3QsIGJ1dCB0aGVyZSAnICsgJ2FyZSB1bnJlbGF0ZWQgbm9k ZXMgYXMgd2VsbC4gVGhpcyBpcyBtb3N0IGNvbW1vbmx5IGNhdXNlZCBieSAnICsgJ3doaXRlLXNw YWNlIGluc2VydGVkIGFyb3VuZCBzZXJ2ZXItcmVuZGVyZWQgbWFya3VwLicpIDogdm9pZCAwOwor ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIHJvb3RFbGVtZW50U2li bGluZyA9IHJvb3RFbGVtZW50U2libGluZy5uZXh0U2libGluZzsKKyAgICAgICAgfQorICAgICAg fQorICAgIH0KKworICAgIHZhciBzaG91bGRSZXVzZU1hcmt1cCA9IGNvbnRhaW5lckhhc1JlYWN0 TWFya3VwICYmICFwcmV2Q29tcG9uZW50ICYmICFjb250YWluZXJIYXNOb25Sb290UmVhY3RDaGls ZDsKKyAgICB2YXIgY29tcG9uZW50ID0gUmVhY3RNb3VudC5fcmVuZGVyTmV3Um9vdENvbXBvbmVu dChuZXh0V3JhcHBlZEVsZW1lbnQsIGNvbnRhaW5lciwgc2hvdWxkUmV1c2VNYXJrdXAsIG5leHRD b250ZXh0KS5fcmVuZGVyZWRDb21wb25lbnQuZ2V0UHVibGljSW5zdGFuY2UoKTsKKyAgICBpZiAo Y2FsbGJhY2spIHsKKyAgICAgIGNhbGxiYWNrLmNhbGwoY29tcG9uZW50KTsKKyAgICB9CisgICAg cmV0dXJuIGNvbXBvbmVudDsKKyAgfSwKKworICAvKioKKyAgICogUmVuZGVycyBhIFJlYWN0IGNv bXBvbmVudCBpbnRvIHRoZSBET00gaW4gdGhlIHN1cHBsaWVkIGBjb250YWluZXJgLgorICAgKiBT ZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0 bWwjcmVhY3Rkb20ucmVuZGVyCisgICAqCisgICAqIElmIHRoZSBSZWFjdCBjb21wb25lbnQgd2Fz IHByZXZpb3VzbHkgcmVuZGVyZWQgaW50byBgY29udGFpbmVyYCwgdGhpcyB3aWxsCisgICAqIHBl cmZvcm0gYW4gdXBkYXRlIG9uIGl0IGFuZCBvbmx5IG11dGF0ZSB0aGUgRE9NIGFzIG5lY2Vzc2Fy eSB0byByZWZsZWN0IHRoZQorICAgKiBsYXRlc3QgUmVhY3QgY29tcG9uZW50LgorICAgKgorICAg KiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gbmV4dEVsZW1lbnQgQ29tcG9uZW50IGVsZW1lbnQgdG8g cmVuZGVyLgorICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNvbnRhaW5lciBET00gZWxlbWVudCB0 byByZW5kZXIgaW50by4KKyAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9u IHRyaWdnZXJlZCBvbiBjb21wbGV0aW9uCisgICAqIEByZXR1cm4ge1JlYWN0Q29tcG9uZW50fSBD b21wb25lbnQgaW5zdGFuY2UgcmVuZGVyZWQgaW4gYGNvbnRhaW5lcmAuCisgICAqLworICByZW5k ZXI6IGZ1bmN0aW9uIChuZXh0RWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykgeworICAgIHJl dHVybiBSZWFjdE1vdW50Ll9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihudWxsLCBuZXh0RWxl bWVudCwgY29udGFpbmVyLCBjYWxsYmFjayk7CisgIH0sCisKKyAgLyoqCisgICAqIFVubW91bnRz IGFuZCBkZXN0cm95cyB0aGUgUmVhY3QgY29tcG9uZW50IHJlbmRlcmVkIGluIHRoZSBgY29udGFp bmVyYC4KKyAgICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9w LWxldmVsLWFwaS5odG1sI3JlYWN0ZG9tLnVubW91bnRjb21wb25lbnRhdG5vZGUKKyAgICoKKyAg ICogQHBhcmFtIHtET01FbGVtZW50fSBjb250YWluZXIgRE9NIGVsZW1lbnQgY29udGFpbmluZyBh IFJlYWN0IGNvbXBvbmVudC4KKyAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBhIGNvbXBv bmVudCB3YXMgZm91bmQgaW4gYW5kIHVubW91bnRlZCBmcm9tCisgICAqICAgICAgICAgICAgICAg ICAgIGBjb250YWluZXJgCisgICAqLworICB1bm1vdW50Q29tcG9uZW50QXROb2RlOiBmdW5jdGlv biAoY29udGFpbmVyKSB7CisgICAgLy8gVmFyaW91cyBwYXJ0cyBvZiBvdXIgY29kZSAoc3VjaCBh cyBSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCdzCisgICAgLy8gX3JlbmRlclZhbGlkYXRlZENvbXBv bmVudCkgYXNzdW1lIHRoYXQgY2FsbHMgdG8gcmVuZGVyIGFyZW4ndCBuZXN0ZWQ7CisgICAgLy8g dmVyaWZ5IHRoYXQgdGhhdCdzIHRoZSBjYXNlLiAoU3RyaWN0bHkgc3BlYWtpbmcsIHVubW91bnRp bmcgd29uJ3QgY2F1c2UgYQorICAgIC8vIHJlbmRlciBidXQgd2Ugc3RpbGwgZG9uJ3QgZXhwZWN0 IHRvIGJlIGluIGEgcmVuZGVyIGNhbGwgaGVyZS4pCisgICAgImRldmVsb3BtZW50IiAhPT0gJ3By b2R1Y3Rpb24nID8gd2FybmluZyhSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ID09IG51bGwsICd1 bm1vdW50Q29tcG9uZW50QXROb2RlKCk6IFJlbmRlciBtZXRob2RzIHNob3VsZCBiZSBhIHB1cmUg ZnVuY3Rpb24gJyArICdvZiBwcm9wcyBhbmQgc3RhdGU7IHRyaWdnZXJpbmcgbmVzdGVkIGNvbXBv bmVudCB1cGRhdGVzIGZyb20gcmVuZGVyICcgKyAnaXMgbm90IGFsbG93ZWQuIElmIG5lY2Vzc2Fy eSwgdHJpZ2dlciBuZXN0ZWQgdXBkYXRlcyBpbiAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gQ2hl Y2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgJXMuJywgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCAm JiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVD b21wb25lbnQnKSA6IHZvaWQgMDsKKworICAgICFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikg PyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd1bm1v dW50Q29tcG9uZW50QXROb2RlKC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVs ZW1lbnQuJykgOiBfcHJvZEludmFyaWFudCgnNDAnKSA6IHZvaWQgMDsKKworICAgIGlmICgiZGV2 ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICJkZXZlbG9wbWVudCIgIT09ICdw cm9kdWN0aW9uJyA/IHdhcm5pbmcoIW5vZGVJc1JlbmRlcmVkQnlPdGhlckluc3RhbmNlKGNvbnRh aW5lciksICd1bm1vdW50Q29tcG9uZW50QXROb2RlKCk6IFRoZSBub2RlIHlvdVwncmUgYXR0ZW1w dGluZyB0byB1bm1vdW50ICcgKyAnd2FzIHJlbmRlcmVkIGJ5IGFub3RoZXIgY29weSBvZiBSZWFj dC4nKSA6IHZvaWQgMDsKKyAgICB9CisKKyAgICB2YXIgcHJldkNvbXBvbmVudCA9IGdldFRvcExl dmVsV3JhcHBlckluQ29udGFpbmVyKGNvbnRhaW5lcik7CisgICAgaWYgKCFwcmV2Q29tcG9uZW50 KSB7CisgICAgICAvLyBDaGVjayBpZiB0aGUgbm9kZSBiZWluZyB1bm1vdW50ZWQgd2FzIHJlbmRl cmVkIGJ5IFJlYWN0LCBidXQgaXNuJ3QgYQorICAgICAgLy8gcm9vdCBub2RlLgorICAgICAgdmFy IGNvbnRhaW5lckhhc05vblJvb3RSZWFjdENoaWxkID0gaGFzTm9uUm9vdFJlYWN0Q2hpbGQoY29u dGFpbmVyKTsKKworICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNvbnRhaW5lciBpdHNlbGYgaXMgYSBS ZWFjdCByb290IG5vZGUuCisgICAgICB2YXIgaXNDb250YWluZXJSZWFjdFJvb3QgPSBjb250YWlu ZXIubm9kZVR5cGUgPT09IDEgJiYgY29udGFpbmVyLmhhc0F0dHJpYnV0ZShST09UX0FUVFJfTkFN RSk7CisKKyAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAg ICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghY29udGFpbmVySGFz Tm9uUm9vdFJlYWN0Q2hpbGQsICd1bm1vdW50Q29tcG9uZW50QXROb2RlKCk6IFRoZSBub2RlIHlv dVwncmUgYXR0ZW1wdGluZyB0byB1bm1vdW50ICcgKyAnd2FzIHJlbmRlcmVkIGJ5IFJlYWN0IGFu ZCBpcyBub3QgYSB0b3AtbGV2ZWwgY29udGFpbmVyLiAlcycsIGlzQ29udGFpbmVyUmVhY3RSb290 ID8gJ1lvdSBtYXkgaGF2ZSBhY2NpZGVudGFsbHkgcGFzc2VkIGluIGEgUmVhY3Qgcm9vdCBub2Rl IGluc3RlYWQgJyArICdvZiBpdHMgY29udGFpbmVyLicgOiAnSW5zdGVhZCwgaGF2ZSB0aGUgcGFy ZW50IGNvbXBvbmVudCB1cGRhdGUgaXRzIHN0YXRlIGFuZCAnICsgJ3JlcmVuZGVyIGluIG9yZGVy IHRvIHJlbW92ZSB0aGlzIGNvbXBvbmVudC4nKSA6IHZvaWQgMDsKKyAgICAgIH0KKworICAgICAg cmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBkZWxldGUgaW5zdGFuY2VzQnlSZWFjdFJvb3RJRFtw cmV2Q29tcG9uZW50Ll9pbnN0YW5jZS5yb290SURdOworICAgIFJlYWN0VXBkYXRlcy5iYXRjaGVk VXBkYXRlcyh1bm1vdW50Q29tcG9uZW50RnJvbU5vZGUsIHByZXZDb21wb25lbnQsIGNvbnRhaW5l ciwgZmFsc2UpOworICAgIHJldHVybiB0cnVlOworICB9LAorCisgIF9tb3VudEltYWdlSW50b05v ZGU6IGZ1bmN0aW9uIChtYXJrdXAsIGNvbnRhaW5lciwgaW5zdGFuY2UsIHNob3VsZFJldXNlTWFy a3VwLCB0cmFuc2FjdGlvbikgeworICAgICFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikgPyAi ZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdtb3VudENv bXBvbmVudEludG9Ob2RlKC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IHZhbGlkLicpIDog X3Byb2RJbnZhcmlhbnQoJzQxJykgOiB2b2lkIDA7CisKKyAgICBpZiAoc2hvdWxkUmV1c2VNYXJr dXApIHsKKyAgICAgIHZhciByb290RWxlbWVudCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRh aW5lcihjb250YWluZXIpOworICAgICAgaWYgKFJlYWN0TWFya3VwQ2hlY2tzdW0uY2FuUmV1c2VN YXJrdXAobWFya3VwLCByb290RWxlbWVudCkpIHsKKyAgICAgICAgUmVhY3RET01Db21wb25lbnRU cmVlLnByZWNhY2hlTm9kZShpbnN0YW5jZSwgcm9vdEVsZW1lbnQpOworICAgICAgICByZXR1cm47 CisgICAgICB9IGVsc2UgeworICAgICAgICB2YXIgY2hlY2tzdW0gPSByb290RWxlbWVudC5nZXRB dHRyaWJ1dGUoUmVhY3RNYXJrdXBDaGVja3N1bS5DSEVDS1NVTV9BVFRSX05BTUUpOworICAgICAg ICByb290RWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoUmVhY3RNYXJrdXBDaGVja3N1bS5DSEVDS1NV TV9BVFRSX05BTUUpOworCisgICAgICAgIHZhciByb290TWFya3VwID0gcm9vdEVsZW1lbnQub3V0 ZXJIVE1MOworICAgICAgICByb290RWxlbWVudC5zZXRBdHRyaWJ1dGUoUmVhY3RNYXJrdXBDaGVj a3N1bS5DSEVDS1NVTV9BVFRSX05BTUUsIGNoZWNrc3VtKTsKKworICAgICAgICB2YXIgbm9ybWFs aXplZE1hcmt1cCA9IG1hcmt1cDsKKyAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9k dWN0aW9uJykgeworICAgICAgICAgIC8vIGJlY2F1c2Ugcm9vdE1hcmt1cCBpcyByZXRyaWV2ZWQg ZnJvbSB0aGUgRE9NLCB2YXJpb3VzIG5vcm1hbGl6YXRpb25zCisgICAgICAgICAgLy8gd2lsbCBo YXZlIG9jY3VycmVkIHdoaWNoIHdpbGwgbm90IGJlIHByZXNlbnQgaW4gYG1hcmt1cGAuIEhlcmUs CisgICAgICAgICAgLy8gaW5zZXJ0IG1hcmt1cCBpbnRvIGEgPGRpdj4gb3IgPGlmcmFtZT4gZGVw ZW5kaW5nIG9uIHRoZSBjb250YWluZXIKKyAgICAgICAgICAvLyB0eXBlIHRvIHBlcmZvcm0gdGhl IHNhbWUgbm9ybWFsaXphdGlvbnMgYmVmb3JlIGNvbXBhcmluZy4KKyAgICAgICAgICB2YXIgbm9y bWFsaXplcjsKKyAgICAgICAgICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05P REVfVFlQRSkgeworICAgICAgICAgICAgbm9ybWFsaXplciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1l bnQoJ2RpdicpOworICAgICAgICAgICAgbm9ybWFsaXplci5pbm5lckhUTUwgPSBtYXJrdXA7Cisg ICAgICAgICAgICBub3JtYWxpemVkTWFya3VwID0gbm9ybWFsaXplci5pbm5lckhUTUw7CisgICAg ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5vcm1hbGl6ZXIgPSBkb2N1bWVudC5jcmVhdGVF bGVtZW50KCdpZnJhbWUnKTsKKyAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQo bm9ybWFsaXplcik7CisgICAgICAgICAgICBub3JtYWxpemVyLmNvbnRlbnREb2N1bWVudC53cml0 ZShtYXJrdXApOworICAgICAgICAgICAgbm9ybWFsaXplZE1hcmt1cCA9IG5vcm1hbGl6ZXIuY29u dGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7CisgICAgICAgICAgICBkb2N1 bWVudC5ib2R5LnJlbW92ZUNoaWxkKG5vcm1hbGl6ZXIpOworICAgICAgICAgIH0KKyAgICAgICAg fQorCisgICAgICAgIHZhciBkaWZmSW5kZXggPSBmaXJzdERpZmZlcmVuY2VJbmRleChub3JtYWxp emVkTWFya3VwLCByb290TWFya3VwKTsKKyAgICAgICAgdmFyIGRpZmZlcmVuY2UgPSAnIChjbGll bnQpICcgKyBub3JtYWxpemVkTWFya3VwLnN1YnN0cmluZyhkaWZmSW5kZXggLSAyMCwgZGlmZklu ZGV4ICsgMjApICsgJ1xuIChzZXJ2ZXIpICcgKyByb290TWFya3VwLnN1YnN0cmluZyhkaWZmSW5k ZXggLSAyMCwgZGlmZkluZGV4ICsgMjApOworCisgICAgICAgICEoY29udGFpbmVyLm5vZGVUeXBl ICE9PSBET0NfTk9ERV9UWVBFKSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGlu dmFyaWFudChmYWxzZSwgJ1lvdVwncmUgdHJ5aW5nIHRvIHJlbmRlciBhIGNvbXBvbmVudCB0byB0 aGUgZG9jdW1lbnQgdXNpbmcgc2VydmVyIHJlbmRlcmluZyBidXQgdGhlIGNoZWNrc3VtIHdhcyBp bnZhbGlkLiBUaGlzIHVzdWFsbHkgbWVhbnMgeW91IHJlbmRlcmVkIGEgZGlmZmVyZW50IGNvbXBv bmVudCB0eXBlIG9yIHByb3BzIG9uIHRoZSBjbGllbnQgZnJvbSB0aGUgb25lIG9uIHRoZSBzZXJ2 ZXIsIG9yIHlvdXIgcmVuZGVyKCkgbWV0aG9kcyBhcmUgaW1wdXJlLiBSZWFjdCBjYW5ub3QgaGFu ZGxlIHRoaXMgY2FzZSBkdWUgdG8gY3Jvc3MtYnJvd3NlciBxdWlya3MgYnkgcmVuZGVyaW5nIGF0 IHRoZSBkb2N1bWVudCByb290LiBZb3Ugc2hvdWxkIGxvb2sgZm9yIGVudmlyb25tZW50IGRlcGVu ZGVudCBjb2RlIGluIHlvdXIgY29tcG9uZW50cyBhbmQgZW5zdXJlIHRoZSBwcm9wcyBhcmUgdGhl IHNhbWUgY2xpZW50IGFuZCBzZXJ2ZXIgc2lkZTpcbiVzJywgZGlmZmVyZW5jZSkgOiBfcHJvZElu dmFyaWFudCgnNDInLCBkaWZmZXJlbmNlKSA6IHZvaWQgMDsKKworICAgICAgICBpZiAoImRldmVs b3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAgICAgImRldmVsb3BtZW50IiAhPT0g J3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1JlYWN0IGF0dGVtcHRlZCB0byByZXVzZSBt YXJrdXAgaW4gYSBjb250YWluZXIgYnV0IHRoZSAnICsgJ2NoZWNrc3VtIHdhcyBpbnZhbGlkLiBU aGlzIGdlbmVyYWxseSBtZWFucyB0aGF0IHlvdSBhcmUgJyArICd1c2luZyBzZXJ2ZXIgcmVuZGVy aW5nIGFuZCB0aGUgbWFya3VwIGdlbmVyYXRlZCBvbiB0aGUgJyArICdzZXJ2ZXIgd2FzIG5vdCB3 aGF0IHRoZSBjbGllbnQgd2FzIGV4cGVjdGluZy4gUmVhY3QgaW5qZWN0ZWQgJyArICduZXcgbWFy a3VwIHRvIGNvbXBlbnNhdGUgd2hpY2ggd29ya3MgYnV0IHlvdSBoYXZlIGxvc3QgbWFueSAnICsg J29mIHRoZSBiZW5lZml0cyBvZiBzZXJ2ZXIgcmVuZGVyaW5nLiBJbnN0ZWFkLCBmaWd1cmUgb3V0 ICcgKyAnd2h5IHRoZSBtYXJrdXAgYmVpbmcgZ2VuZXJhdGVkIGlzIGRpZmZlcmVudCBvbiB0aGUg Y2xpZW50ICcgKyAnb3Igc2VydmVyOlxuJXMnLCBkaWZmZXJlbmNlKSA6IHZvaWQgMDsKKyAgICAg ICAgfQorICAgICAgfQorICAgIH0KKworICAgICEoY29udGFpbmVyLm5vZGVUeXBlICE9PSBET0Nf Tk9ERV9UWVBFKSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChm YWxzZSwgJ1lvdVwncmUgdHJ5aW5nIHRvIHJlbmRlciBhIGNvbXBvbmVudCB0byB0aGUgZG9jdW1l bnQgYnV0IHlvdSBkaWRuXCd0IHVzZSBzZXJ2ZXIgcmVuZGVyaW5nLiBXZSBjYW5cJ3QgZG8gdGhp cyB3aXRob3V0IHVzaW5nIHNlcnZlciByZW5kZXJpbmcgZHVlIHRvIGNyb3NzLWJyb3dzZXIgcXVp cmtzLiBTZWUgUmVhY3RET01TZXJ2ZXIucmVuZGVyVG9TdHJpbmcoKSBmb3Igc2VydmVyIHJlbmRl cmluZy4nKSA6IF9wcm9kSW52YXJpYW50KCc0MycpIDogdm9pZCAwOworCisgICAgaWYgKHRyYW5z YWN0aW9uLnVzZUNyZWF0ZUVsZW1lbnQpIHsKKyAgICAgIHdoaWxlIChjb250YWluZXIubGFzdENo aWxkKSB7CisgICAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjb250YWluZXIubGFzdENoaWxk KTsKKyAgICAgIH0KKyAgICAgIERPTUxhenlUcmVlLmluc2VydFRyZWVCZWZvcmUoY29udGFpbmVy LCBtYXJrdXAsIG51bGwpOworICAgIH0gZWxzZSB7CisgICAgICBzZXRJbm5lckhUTUwoY29udGFp bmVyLCBtYXJrdXApOworICAgICAgUmVhY3RET01Db21wb25lbnRUcmVlLnByZWNhY2hlTm9kZShp bnN0YW5jZSwgY29udGFpbmVyLmZpcnN0Q2hpbGQpOworICAgIH0KKworICAgIGlmICgiZGV2ZWxv cG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIHZhciBob3N0Tm9kZSA9IFJlYWN0RE9N Q29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKGNvbnRhaW5lci5maXJzdENoaWxkKTsK KyAgICAgIGlmIChob3N0Tm9kZS5fZGVidWdJRCAhPT0gMCkgeworICAgICAgICBSZWFjdEluc3Ry dW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHsKKyAgICAgICAgICBpbnN0YW5j ZUlEOiBob3N0Tm9kZS5fZGVidWdJRCwKKyAgICAgICAgICB0eXBlOiAnbW91bnQnLAorICAgICAg ICAgIHBheWxvYWQ6IG1hcmt1cC50b1N0cmluZygpCisgICAgICAgIH0pOworICAgICAgfQorICAg IH0KKyAgfQorfTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdE1vdW50OworfSx7IjExIjoxMSwi MTIxIjoxMjEsIjEyNSI6MTI1LCIxMjciOjEyNywiMTI5IjoxMjksIjEzMyI6MTMzLCIxMzQiOjEz NCwiMTQzIjoxNDMsIjE1MCI6MTUwLCIxNTciOjE1NywiMjYiOjI2LCIzNCI6MzQsIjM1IjozNSwi MzciOjM3LCI1OCI6NTgsIjYzIjo2MywiNjQiOjY0LCI2NiI6NjYsIjc1Ijo3NSwiODEiOjgxLCI4 MiI6ODIsIjkiOjl9XSw2ODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioK KyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRz IHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhl IEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSBy b290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50Cisg KiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRo ZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX3Byb2RJ bnZhcmlhbnQgPSBfZGVyZXFfKDEyNSk7CisKK3ZhciBSZWFjdENvbXBvbmVudEVudmlyb25tZW50 ID0gX2RlcmVxXygyOSk7Cit2YXIgUmVhY3RJbnN0YW5jZU1hcCA9IF9kZXJlcV8oNjMpOwordmFy IFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gX2RlcmVxXyg2NCk7CisKK3ZhciBSZWFjdEN1cnJlbnRP d25lciA9IF9kZXJlcV8oMTMzKTsKK3ZhciBSZWFjdFJlY29uY2lsZXIgPSBfZGVyZXFfKDc1KTsK K3ZhciBSZWFjdENoaWxkUmVjb25jaWxlciA9IF9kZXJlcV8oMjcpOworCit2YXIgZW1wdHlGdW5j dGlvbiA9IF9kZXJlcV8oMTQyKTsKK3ZhciBmbGF0dGVuQ2hpbGRyZW4gPSBfZGVyZXFfKDEwOSk7 Cit2YXIgaW52YXJpYW50ID0gX2RlcmVxXygxNTApOworCisvKioKKyAqIE1ha2UgYW4gdXBkYXRl IGZvciBtYXJrdXAgdG8gYmUgcmVuZGVyZWQgYW5kIGluc2VydGVkIGF0IGEgc3VwcGxpZWQgaW5k ZXguCisgKgorICogQHBhcmFtIHtzdHJpbmd9IG1hcmt1cCBNYXJrdXAgdGhhdCByZW5kZXJzIGlu dG8gYW4gZWxlbWVudC4KKyAqIEBwYXJhbSB7bnVtYmVyfSB0b0luZGV4IERlc3RpbmF0aW9uIGlu ZGV4LgorICogQHByaXZhdGUKKyAqLworZnVuY3Rpb24gbWFrZUluc2VydE1hcmt1cChtYXJrdXAs IGFmdGVyTm9kZSwgdG9JbmRleCkgeworICAvLyBOT1RFOiBOdWxsIHZhbHVlcyByZWR1Y2UgaGlk ZGVuIGNsYXNzZXMuCisgIHJldHVybiB7CisgICAgdHlwZTogJ0lOU0VSVF9NQVJLVVAnLAorICAg IGNvbnRlbnQ6IG1hcmt1cCwKKyAgICBmcm9tSW5kZXg6IG51bGwsCisgICAgZnJvbU5vZGU6IG51 bGwsCisgICAgdG9JbmRleDogdG9JbmRleCwKKyAgICBhZnRlck5vZGU6IGFmdGVyTm9kZQorICB9 OworfQorCisvKioKKyAqIE1ha2UgYW4gdXBkYXRlIGZvciBtb3ZpbmcgYW4gZXhpc3RpbmcgZWxl bWVudCB0byBhbm90aGVyIGluZGV4LgorICoKKyAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXgg U291cmNlIGluZGV4IG9mIHRoZSBleGlzdGluZyBlbGVtZW50LgorICogQHBhcmFtIHtudW1iZXJ9 IHRvSW5kZXggRGVzdGluYXRpb24gaW5kZXggb2YgdGhlIGVsZW1lbnQuCisgKiBAcHJpdmF0ZQor ICovCitmdW5jdGlvbiBtYWtlTW92ZShjaGlsZCwgYWZ0ZXJOb2RlLCB0b0luZGV4KSB7CisgIC8v IE5PVEU6IE51bGwgdmFsdWVzIHJlZHVjZSBoaWRkZW4gY2xhc3Nlcy4KKyAgcmV0dXJuIHsKKyAg ICB0eXBlOiAnTU9WRV9FWElTVElORycsCisgICAgY29udGVudDogbnVsbCwKKyAgICBmcm9tSW5k ZXg6IGNoaWxkLl9tb3VudEluZGV4LAorICAgIGZyb21Ob2RlOiBSZWFjdFJlY29uY2lsZXIuZ2V0 SG9zdE5vZGUoY2hpbGQpLAorICAgIHRvSW5kZXg6IHRvSW5kZXgsCisgICAgYWZ0ZXJOb2RlOiBh ZnRlck5vZGUKKyAgfTsKK30KKworLyoqCisgKiBNYWtlIGFuIHVwZGF0ZSBmb3IgcmVtb3Zpbmcg YW4gZWxlbWVudCBhdCBhbiBpbmRleC4KKyAqCisgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4 IEluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJlbW92ZS4KKyAqIEBwcml2YXRlCisgKi8KK2Z1bmN0 aW9uIG1ha2VSZW1vdmUoY2hpbGQsIG5vZGUpIHsKKyAgLy8gTk9URTogTnVsbCB2YWx1ZXMgcmVk dWNlIGhpZGRlbiBjbGFzc2VzLgorICByZXR1cm4geworICAgIHR5cGU6ICdSRU1PVkVfTk9ERScs CisgICAgY29udGVudDogbnVsbCwKKyAgICBmcm9tSW5kZXg6IGNoaWxkLl9tb3VudEluZGV4LAor ICAgIGZyb21Ob2RlOiBub2RlLAorICAgIHRvSW5kZXg6IG51bGwsCisgICAgYWZ0ZXJOb2RlOiBu dWxsCisgIH07Cit9CisKKy8qKgorICogTWFrZSBhbiB1cGRhdGUgZm9yIHNldHRpbmcgdGhlIG1h cmt1cCBvZiBhIG5vZGUuCisgKgorICogQHBhcmFtIHtzdHJpbmd9IG1hcmt1cCBNYXJrdXAgdGhh dCByZW5kZXJzIGludG8gYW4gZWxlbWVudC4KKyAqIEBwcml2YXRlCisgKi8KK2Z1bmN0aW9uIG1h a2VTZXRNYXJrdXAobWFya3VwKSB7CisgIC8vIE5PVEU6IE51bGwgdmFsdWVzIHJlZHVjZSBoaWRk ZW4gY2xhc3Nlcy4KKyAgcmV0dXJuIHsKKyAgICB0eXBlOiAnU0VUX01BUktVUCcsCisgICAgY29u dGVudDogbWFya3VwLAorICAgIGZyb21JbmRleDogbnVsbCwKKyAgICBmcm9tTm9kZTogbnVsbCwK KyAgICB0b0luZGV4OiBudWxsLAorICAgIGFmdGVyTm9kZTogbnVsbAorICB9OworfQorCisvKioK KyAqIE1ha2UgYW4gdXBkYXRlIGZvciBzZXR0aW5nIHRoZSB0ZXh0IGNvbnRlbnQuCisgKgorICog QHBhcmFtIHtzdHJpbmd9IHRleHRDb250ZW50IFRleHQgY29udGVudCB0byBzZXQuCisgKiBAcHJp dmF0ZQorICovCitmdW5jdGlvbiBtYWtlVGV4dENvbnRlbnQodGV4dENvbnRlbnQpIHsKKyAgLy8g Tk9URTogTnVsbCB2YWx1ZXMgcmVkdWNlIGhpZGRlbiBjbGFzc2VzLgorICByZXR1cm4geworICAg IHR5cGU6ICdURVhUX0NPTlRFTlQnLAorICAgIGNvbnRlbnQ6IHRleHRDb250ZW50LAorICAgIGZy b21JbmRleDogbnVsbCwKKyAgICBmcm9tTm9kZTogbnVsbCwKKyAgICB0b0luZGV4OiBudWxsLAor ICAgIGFmdGVyTm9kZTogbnVsbAorICB9OworfQorCisvKioKKyAqIFB1c2ggYW4gdXBkYXRlLCBp ZiBhbnksIG9udG8gdGhlIHF1ZXVlLiBDcmVhdGVzIGEgbmV3IHF1ZXVlIGlmIG5vbmUgaXMKKyAq IHBhc3NlZCBhbmQgYWx3YXlzIHJldHVybnMgdGhlIHF1ZXVlLiBNdXRhdGl2ZS4KKyAqLworZnVu Y3Rpb24gZW5xdWV1ZShxdWV1ZSwgdXBkYXRlKSB7CisgIGlmICh1cGRhdGUpIHsKKyAgICBxdWV1 ZSA9IHF1ZXVlIHx8IFtdOworICAgIHF1ZXVlLnB1c2godXBkYXRlKTsKKyAgfQorICByZXR1cm4g cXVldWU7Cit9CisKKy8qKgorICogUHJvY2Vzc2VzIGFueSBlbnF1ZXVlZCB1cGRhdGVzLgorICoK KyAqIEBwcml2YXRlCisgKi8KK2Z1bmN0aW9uIHByb2Nlc3NRdWV1ZShpbnN0LCB1cGRhdGVRdWV1 ZSkgeworICBSZWFjdENvbXBvbmVudEVudmlyb25tZW50LnByb2Nlc3NDaGlsZHJlblVwZGF0ZXMo aW5zdCwgdXBkYXRlUXVldWUpOworfQorCit2YXIgc2V0Q2hpbGRyZW5Gb3JJbnN0cnVtZW50YXRp b24gPSBlbXB0eUZ1bmN0aW9uOworaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykg eworICB2YXIgZ2V0RGVidWdJRCA9IGZ1bmN0aW9uIChpbnN0KSB7CisgICAgaWYgKCFpbnN0Ll9k ZWJ1Z0lEKSB7CisgICAgICAvLyBDaGVjayBmb3IgQVJULWxpa2UgaW5zdGFuY2VzLiBUT0RPOiBU aGlzIGlzIHNpbGx5L2dyb3NzLgorICAgICAgdmFyIGludGVybmFsOworICAgICAgaWYgKGludGVy bmFsID0gUmVhY3RJbnN0YW5jZU1hcC5nZXQoaW5zdCkpIHsKKyAgICAgICAgaW5zdCA9IGludGVy bmFsOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW5zdC5fZGVidWdJRDsKKyAgfTsKKyAg c2V0Q2hpbGRyZW5Gb3JJbnN0cnVtZW50YXRpb24gPSBmdW5jdGlvbiAoY2hpbGRyZW4pIHsKKyAg ICB2YXIgZGVidWdJRCA9IGdldERlYnVnSUQodGhpcyk7CisgICAgLy8gVE9ETzogUmVhY3QgTmF0 aXZlIGVtcHR5IGNvbXBvbmVudHMgYXJlIGFsc28gbXVsdGljaGlsZC4KKyAgICAvLyBUaGlzIG1l YW5zIHRoZXkgc3RpbGwgZ2V0IGludG8gdGhpcyBtZXRob2QgYnV0IGRvbid0IGhhdmUgX2RlYnVn SUQuCisgICAgaWYgKGRlYnVnSUQgIT09IDApIHsKKyAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9u LmRlYnVnVG9vbC5vblNldENoaWxkcmVuKGRlYnVnSUQsIGNoaWxkcmVuID8gT2JqZWN0LmtleXMo Y2hpbGRyZW4pLm1hcChmdW5jdGlvbiAoa2V5KSB7CisgICAgICAgIHJldHVybiBjaGlsZHJlbltr ZXldLl9kZWJ1Z0lEOworICAgICAgfSkgOiBbXSk7CisgICAgfQorICB9OworfQorCisvKioKKyAq IFJlYWN0TXVsdGlDaGlsZCBhcmUgY2FwYWJsZSBvZiByZWNvbmNpbGluZyBtdWx0aXBsZSBjaGls ZHJlbi4KKyAqCisgKiBAY2xhc3MgUmVhY3RNdWx0aUNoaWxkCisgKiBAaW50ZXJuYWwKKyAqLwor dmFyIFJlYWN0TXVsdGlDaGlsZCA9IHsKKworICAvKioKKyAgICogUHJvdmlkZXMgY29tbW9uIGZ1 bmN0aW9uYWxpdHkgZm9yIGNvbXBvbmVudHMgdGhhdCBtdXN0IHJlY29uY2lsZSBtdWx0aXBsZQor ICAgKiBjaGlsZHJlbi4gVGhpcyBpcyB1c2VkIGJ5IGBSZWFjdERPTUNvbXBvbmVudGAgdG8gbW91 bnQsIHVwZGF0ZSwgYW5kCisgICAqIHVubW91bnQgY2hpbGQgY29tcG9uZW50cy4KKyAgICoKKyAg ICogQGxlbmRzIHtSZWFjdE11bHRpQ2hpbGQucHJvdG90eXBlfQorICAgKi8KKyAgTWl4aW46IHsK KworICAgIF9yZWNvbmNpbGVySW5zdGFudGlhdGVDaGlsZHJlbjogZnVuY3Rpb24gKG5lc3RlZENo aWxkcmVuLCB0cmFuc2FjdGlvbiwgY29udGV4dCkgeworICAgICAgaWYgKCJkZXZlbG9wbWVudCIg IT09ICdwcm9kdWN0aW9uJykgeworICAgICAgICB2YXIgc2VsZkRlYnVnSUQgPSBnZXREZWJ1Z0lE KHRoaXMpOworICAgICAgICBpZiAodGhpcy5fY3VycmVudEVsZW1lbnQpIHsKKyAgICAgICAgICB0 cnkgeworICAgICAgICAgICAgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCA9IHRoaXMuX2N1cnJl bnRFbGVtZW50Ll9vd25lcjsKKyAgICAgICAgICAgIHJldHVybiBSZWFjdENoaWxkUmVjb25jaWxl ci5pbnN0YW50aWF0ZUNoaWxkcmVuKG5lc3RlZENoaWxkcmVuLCB0cmFuc2FjdGlvbiwgY29udGV4 dCwgc2VsZkRlYnVnSUQpOworICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBSZWFj dEN1cnJlbnRPd25lci5jdXJyZW50ID0gbnVsbDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAg ICAgIH0KKyAgICAgIHJldHVybiBSZWFjdENoaWxkUmVjb25jaWxlci5pbnN0YW50aWF0ZUNoaWxk cmVuKG5lc3RlZENoaWxkcmVuLCB0cmFuc2FjdGlvbiwgY29udGV4dCk7CisgICAgfSwKKworICAg IF9yZWNvbmNpbGVyVXBkYXRlQ2hpbGRyZW46IGZ1bmN0aW9uIChwcmV2Q2hpbGRyZW4sIG5leHRO ZXN0ZWRDaGlsZHJlbkVsZW1lbnRzLCBtb3VudEltYWdlcywgcmVtb3ZlZE5vZGVzLCB0cmFuc2Fj dGlvbiwgY29udGV4dCkgeworICAgICAgdmFyIG5leHRDaGlsZHJlbjsKKyAgICAgIHZhciBzZWxm RGVidWdJRCA9IDA7CisgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7 CisgICAgICAgIHNlbGZEZWJ1Z0lEID0gZ2V0RGVidWdJRCh0aGlzKTsKKyAgICAgICAgaWYgKHRo aXMuX2N1cnJlbnRFbGVtZW50KSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJlYWN0 Q3VycmVudE93bmVyLmN1cnJlbnQgPSB0aGlzLl9jdXJyZW50RWxlbWVudC5fb3duZXI7CisgICAg ICAgICAgICBuZXh0Q2hpbGRyZW4gPSBmbGF0dGVuQ2hpbGRyZW4obmV4dE5lc3RlZENoaWxkcmVu RWxlbWVudHMsIHNlbGZEZWJ1Z0lEKTsKKyAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAg ICAgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCA9IG51bGw7CisgICAgICAgICAgfQorICAgICAg ICAgIFJlYWN0Q2hpbGRSZWNvbmNpbGVyLnVwZGF0ZUNoaWxkcmVuKHByZXZDaGlsZHJlbiwgbmV4 dENoaWxkcmVuLCBtb3VudEltYWdlcywgcmVtb3ZlZE5vZGVzLCB0cmFuc2FjdGlvbiwgdGhpcywg dGhpcy5faG9zdENvbnRhaW5lckluZm8sIGNvbnRleHQsIHNlbGZEZWJ1Z0lEKTsKKyAgICAgICAg ICByZXR1cm4gbmV4dENoaWxkcmVuOworICAgICAgICB9CisgICAgICB9CisgICAgICBuZXh0Q2hp bGRyZW4gPSBmbGF0dGVuQ2hpbGRyZW4obmV4dE5lc3RlZENoaWxkcmVuRWxlbWVudHMsIHNlbGZE ZWJ1Z0lEKTsKKyAgICAgIFJlYWN0Q2hpbGRSZWNvbmNpbGVyLnVwZGF0ZUNoaWxkcmVuKHByZXZD aGlsZHJlbiwgbmV4dENoaWxkcmVuLCBtb3VudEltYWdlcywgcmVtb3ZlZE5vZGVzLCB0cmFuc2Fj dGlvbiwgdGhpcywgdGhpcy5faG9zdENvbnRhaW5lckluZm8sIGNvbnRleHQsIHNlbGZEZWJ1Z0lE KTsKKyAgICAgIHJldHVybiBuZXh0Q2hpbGRyZW47CisgICAgfSwKKworICAgIC8qKgorICAgICAq IEdlbmVyYXRlcyBhICJtb3VudCBpbWFnZSIgZm9yIGVhY2ggb2YgdGhlIHN1cHBsaWVkIGNoaWxk cmVuLiBJbiB0aGUgY2FzZQorICAgICAqIG9mIGBSZWFjdERPTUNvbXBvbmVudGAsIGEgbW91bnQg aW1hZ2UgaXMgYSBzdHJpbmcgb2YgbWFya3VwLgorICAgICAqCisgICAgICogQHBhcmFtIHs/b2Jq ZWN0fSBuZXN0ZWRDaGlsZHJlbiBOZXN0ZWQgY2hpbGQgbWFwcy4KKyAgICAgKiBAcmV0dXJuIHth cnJheX0gQW4gYXJyYXkgb2YgbW91bnRlZCByZXByZXNlbnRhdGlvbnMuCisgICAgICogQGludGVy bmFsCisgICAgICovCisgICAgbW91bnRDaGlsZHJlbjogZnVuY3Rpb24gKG5lc3RlZENoaWxkcmVu LCB0cmFuc2FjdGlvbiwgY29udGV4dCkgeworICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5fcmVj b25jaWxlckluc3RhbnRpYXRlQ2hpbGRyZW4obmVzdGVkQ2hpbGRyZW4sIHRyYW5zYWN0aW9uLCBj b250ZXh0KTsKKyAgICAgIHRoaXMuX3JlbmRlcmVkQ2hpbGRyZW4gPSBjaGlsZHJlbjsKKworICAg ICAgdmFyIG1vdW50SW1hZ2VzID0gW107CisgICAgICB2YXIgaW5kZXggPSAwOworICAgICAgZm9y ICh2YXIgbmFtZSBpbiBjaGlsZHJlbikgeworICAgICAgICBpZiAoY2hpbGRyZW4uaGFzT3duUHJv cGVydHkobmFtZSkpIHsKKyAgICAgICAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltuYW1lXTsKKyAg ICAgICAgICB2YXIgc2VsZkRlYnVnSUQgPSAwOworICAgICAgICAgIGlmICgiZGV2ZWxvcG1lbnQi ICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICAgICAgIHNlbGZEZWJ1Z0lEID0gZ2V0RGVidWdJ RCh0aGlzKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdmFyIG1vdW50SW1hZ2UgPSBSZWFjdFJl Y29uY2lsZXIubW91bnRDb21wb25lbnQoY2hpbGQsIHRyYW5zYWN0aW9uLCB0aGlzLCB0aGlzLl9o b3N0Q29udGFpbmVySW5mbywgY29udGV4dCwgc2VsZkRlYnVnSUQpOworICAgICAgICAgIGNoaWxk Ll9tb3VudEluZGV4ID0gaW5kZXgrKzsKKyAgICAgICAgICBtb3VudEltYWdlcy5wdXNoKG1vdW50 SW1hZ2UpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9 PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICAgc2V0Q2hpbGRyZW5Gb3JJbnN0cnVtZW50YXRpb24u Y2FsbCh0aGlzLCBjaGlsZHJlbik7CisgICAgICB9CisKKyAgICAgIHJldHVybiBtb3VudEltYWdl czsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogUmVwbGFjZXMgYW55IHJlbmRlcmVkIGNoaWxk cmVuIHdpdGggYSB0ZXh0IGNvbnRlbnQgc3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHtz dHJpbmd9IG5leHRDb250ZW50IFN0cmluZyBvZiBjb250ZW50LgorICAgICAqIEBpbnRlcm5hbAor ICAgICAqLworICAgIHVwZGF0ZVRleHRDb250ZW50OiBmdW5jdGlvbiAobmV4dENvbnRlbnQpIHsK KyAgICAgIHZhciBwcmV2Q2hpbGRyZW4gPSB0aGlzLl9yZW5kZXJlZENoaWxkcmVuOworICAgICAg Ly8gUmVtb3ZlIGFueSByZW5kZXJlZCBjaGlsZHJlbi4KKyAgICAgIFJlYWN0Q2hpbGRSZWNvbmNp bGVyLnVubW91bnRDaGlsZHJlbihwcmV2Q2hpbGRyZW4sIGZhbHNlKTsKKyAgICAgIGZvciAodmFy IG5hbWUgaW4gcHJldkNoaWxkcmVuKSB7CisgICAgICAgIGlmIChwcmV2Q2hpbGRyZW4uaGFzT3du UHJvcGVydHkobmFtZSkpIHsKKyAgICAgICAgICAhZmFsc2UgPyAiZGV2ZWxvcG1lbnQiICE9PSAn cHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd1cGRhdGVUZXh0Q29udGVudCBjYWxsZWQg b24gbm9uLWVtcHR5IGNvbXBvbmVudC4nKSA6IF9wcm9kSW52YXJpYW50KCcxMTgnKSA6IHZvaWQg MDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gU2V0IG5ldyB0ZXh0IGNvbnRlbnQuCisg ICAgICB2YXIgdXBkYXRlcyA9IFttYWtlVGV4dENvbnRlbnQobmV4dENvbnRlbnQpXTsKKyAgICAg IHByb2Nlc3NRdWV1ZSh0aGlzLCB1cGRhdGVzKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICog UmVwbGFjZXMgYW55IHJlbmRlcmVkIGNoaWxkcmVuIHdpdGggYSBtYXJrdXAgc3RyaW5nLgorICAg ICAqCisgICAgICogQHBhcmFtIHtzdHJpbmd9IG5leHRNYXJrdXAgU3RyaW5nIG9mIG1hcmt1cC4K KyAgICAgKiBAaW50ZXJuYWwKKyAgICAgKi8KKyAgICB1cGRhdGVNYXJrdXA6IGZ1bmN0aW9uIChu ZXh0TWFya3VwKSB7CisgICAgICB2YXIgcHJldkNoaWxkcmVuID0gdGhpcy5fcmVuZGVyZWRDaGls ZHJlbjsKKyAgICAgIC8vIFJlbW92ZSBhbnkgcmVuZGVyZWQgY2hpbGRyZW4uCisgICAgICBSZWFj dENoaWxkUmVjb25jaWxlci51bm1vdW50Q2hpbGRyZW4ocHJldkNoaWxkcmVuLCBmYWxzZSk7Cisg ICAgICBmb3IgKHZhciBuYW1lIGluIHByZXZDaGlsZHJlbikgeworICAgICAgICBpZiAocHJldkNo aWxkcmVuLmhhc093blByb3BlcnR5KG5hbWUpKSB7CisgICAgICAgICAgIWZhbHNlID8gImRldmVs b3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAndXBkYXRlVGV4dENv bnRlbnQgY2FsbGVkIG9uIG5vbi1lbXB0eSBjb21wb25lbnQuJykgOiBfcHJvZEludmFyaWFudCgn MTE4JykgOiB2b2lkIDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHZhciB1cGRhdGVzID0g W21ha2VTZXRNYXJrdXAobmV4dE1hcmt1cCldOworICAgICAgcHJvY2Vzc1F1ZXVlKHRoaXMsIHVw ZGF0ZXMpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHRoZSByZW5kZXJlZCBj aGlsZHJlbiB3aXRoIG5ldyBjaGlsZHJlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB7P29iamVj dH0gbmV4dE5lc3RlZENoaWxkcmVuRWxlbWVudHMgTmVzdGVkIGNoaWxkIGVsZW1lbnQgbWFwcy4K KyAgICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uCisg ICAgICogQGludGVybmFsCisgICAgICovCisgICAgdXBkYXRlQ2hpbGRyZW46IGZ1bmN0aW9uIChu ZXh0TmVzdGVkQ2hpbGRyZW5FbGVtZW50cywgdHJhbnNhY3Rpb24sIGNvbnRleHQpIHsKKyAgICAg IC8vIEhvb2sgdXNlZCBieSBSZWFjdCBBUlQKKyAgICAgIHRoaXMuX3VwZGF0ZUNoaWxkcmVuKG5l eHROZXN0ZWRDaGlsZHJlbkVsZW1lbnRzLCB0cmFuc2FjdGlvbiwgY29udGV4dCk7CisgICAgfSwK KworICAgIC8qKgorICAgICAqIEBwYXJhbSB7P29iamVjdH0gbmV4dE5lc3RlZENoaWxkcmVuRWxl bWVudHMgTmVzdGVkIGNoaWxkIGVsZW1lbnQgbWFwcy4KKyAgICAgKiBAcGFyYW0ge1JlYWN0UmVj b25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uCisgICAgICogQGZpbmFsCisgICAgICogQHBy b3RlY3RlZAorICAgICAqLworICAgIF91cGRhdGVDaGlsZHJlbjogZnVuY3Rpb24gKG5leHROZXN0 ZWRDaGlsZHJlbkVsZW1lbnRzLCB0cmFuc2FjdGlvbiwgY29udGV4dCkgeworICAgICAgdmFyIHBy ZXZDaGlsZHJlbiA9IHRoaXMuX3JlbmRlcmVkQ2hpbGRyZW47CisgICAgICB2YXIgcmVtb3ZlZE5v ZGVzID0ge307CisgICAgICB2YXIgbW91bnRJbWFnZXMgPSBbXTsKKyAgICAgIHZhciBuZXh0Q2hp bGRyZW4gPSB0aGlzLl9yZWNvbmNpbGVyVXBkYXRlQ2hpbGRyZW4ocHJldkNoaWxkcmVuLCBuZXh0 TmVzdGVkQ2hpbGRyZW5FbGVtZW50cywgbW91bnRJbWFnZXMsIHJlbW92ZWROb2RlcywgdHJhbnNh Y3Rpb24sIGNvbnRleHQpOworICAgICAgaWYgKCFuZXh0Q2hpbGRyZW4gJiYgIXByZXZDaGlsZHJl bikgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICB2YXIgdXBkYXRlcyA9IG51bGw7 CisgICAgICB2YXIgbmFtZTsKKyAgICAgIC8vIGBuZXh0SW5kZXhgIHdpbGwgaW5jcmVtZW50IGZv ciBlYWNoIGNoaWxkIGluIGBuZXh0Q2hpbGRyZW5gLCBidXQKKyAgICAgIC8vIGBsYXN0SW5kZXhg IHdpbGwgYmUgdGhlIGxhc3QgaW5kZXggdmlzaXRlZCBpbiBgcHJldkNoaWxkcmVuYC4KKyAgICAg IHZhciBuZXh0SW5kZXggPSAwOworICAgICAgdmFyIGxhc3RJbmRleCA9IDA7CisgICAgICAvLyBg bmV4dE1vdW50SW5kZXhgIHdpbGwgaW5jcmVtZW50IGZvciBlYWNoIG5ld2x5IG1vdW50ZWQgY2hp bGQuCisgICAgICB2YXIgbmV4dE1vdW50SW5kZXggPSAwOworICAgICAgdmFyIGxhc3RQbGFjZWRO b2RlID0gbnVsbDsKKyAgICAgIGZvciAobmFtZSBpbiBuZXh0Q2hpbGRyZW4pIHsKKyAgICAgICAg aWYgKCFuZXh0Q2hpbGRyZW4uaGFzT3duUHJvcGVydHkobmFtZSkpIHsKKyAgICAgICAgICBjb250 aW51ZTsKKyAgICAgICAgfQorICAgICAgICB2YXIgcHJldkNoaWxkID0gcHJldkNoaWxkcmVuICYm IHByZXZDaGlsZHJlbltuYW1lXTsKKyAgICAgICAgdmFyIG5leHRDaGlsZCA9IG5leHRDaGlsZHJl bltuYW1lXTsKKyAgICAgICAgaWYgKHByZXZDaGlsZCA9PT0gbmV4dENoaWxkKSB7CisgICAgICAg ICAgdXBkYXRlcyA9IGVucXVldWUodXBkYXRlcywgdGhpcy5tb3ZlQ2hpbGQocHJldkNoaWxkLCBs YXN0UGxhY2VkTm9kZSwgbmV4dEluZGV4LCBsYXN0SW5kZXgpKTsKKyAgICAgICAgICBsYXN0SW5k ZXggPSBNYXRoLm1heChwcmV2Q2hpbGQuX21vdW50SW5kZXgsIGxhc3RJbmRleCk7CisgICAgICAg ICAgcHJldkNoaWxkLl9tb3VudEluZGV4ID0gbmV4dEluZGV4OworICAgICAgICB9IGVsc2Ugewor ICAgICAgICAgIGlmIChwcmV2Q2hpbGQpIHsKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBgbGFzdElu ZGV4YCBiZWZvcmUgYF9tb3VudEluZGV4YCBnZXRzIHVuc2V0IGJ5IHVubW91bnRpbmcuCisgICAg ICAgICAgICBsYXN0SW5kZXggPSBNYXRoLm1heChwcmV2Q2hpbGQuX21vdW50SW5kZXgsIGxhc3RJ bmRleCk7CisgICAgICAgICAgICAvLyBUaGUgYHJlbW92ZWROb2Rlc2AgbG9vcCBiZWxvdyB3aWxs IGFjdHVhbGx5IHJlbW92ZSB0aGUgY2hpbGQuCisgICAgICAgICAgfQorICAgICAgICAgIC8vIFRo ZSBjaGlsZCBtdXN0IGJlIGluc3RhbnRpYXRlZCBiZWZvcmUgaXQncyBtb3VudGVkLgorICAgICAg ICAgIHVwZGF0ZXMgPSBlbnF1ZXVlKHVwZGF0ZXMsIHRoaXMuX21vdW50Q2hpbGRBdEluZGV4KG5l eHRDaGlsZCwgbW91bnRJbWFnZXNbbmV4dE1vdW50SW5kZXhdLCBsYXN0UGxhY2VkTm9kZSwgbmV4 dEluZGV4LCB0cmFuc2FjdGlvbiwgY29udGV4dCkpOworICAgICAgICAgIG5leHRNb3VudEluZGV4 Kys7CisgICAgICAgIH0KKyAgICAgICAgbmV4dEluZGV4Kys7CisgICAgICAgIGxhc3RQbGFjZWRO b2RlID0gUmVhY3RSZWNvbmNpbGVyLmdldEhvc3ROb2RlKG5leHRDaGlsZCk7CisgICAgICB9Cisg ICAgICAvLyBSZW1vdmUgY2hpbGRyZW4gdGhhdCBhcmUgbm8gbG9uZ2VyIHByZXNlbnQuCisgICAg ICBmb3IgKG5hbWUgaW4gcmVtb3ZlZE5vZGVzKSB7CisgICAgICAgIGlmIChyZW1vdmVkTm9kZXMu aGFzT3duUHJvcGVydHkobmFtZSkpIHsKKyAgICAgICAgICB1cGRhdGVzID0gZW5xdWV1ZSh1cGRh dGVzLCB0aGlzLl91bm1vdW50Q2hpbGQocHJldkNoaWxkcmVuW25hbWVdLCByZW1vdmVkTm9kZXNb bmFtZV0pKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHVwZGF0ZXMpIHsKKyAgICAg ICAgcHJvY2Vzc1F1ZXVlKHRoaXMsIHVwZGF0ZXMpOworICAgICAgfQorICAgICAgdGhpcy5fcmVu ZGVyZWRDaGlsZHJlbiA9IG5leHRDaGlsZHJlbjsKKworICAgICAgaWYgKCJkZXZlbG9wbWVudCIg IT09ICdwcm9kdWN0aW9uJykgeworICAgICAgICBzZXRDaGlsZHJlbkZvckluc3RydW1lbnRhdGlv bi5jYWxsKHRoaXMsIG5leHRDaGlsZHJlbik7CisgICAgICB9CisgICAgfSwKKworICAgIC8qKgor ICAgICAqIFVubW91bnRzIGFsbCByZW5kZXJlZCBjaGlsZHJlbi4gVGhpcyBzaG91bGQgYmUgdXNl ZCB0byBjbGVhbiB1cCBjaGlsZHJlbgorICAgICAqIHdoZW4gdGhpcyBjb21wb25lbnQgaXMgdW5t b3VudGVkLiBJdCBkb2VzIG5vdCBhY3R1YWxseSBwZXJmb3JtIGFueQorICAgICAqIGJhY2tlbmQg b3BlcmF0aW9ucy4KKyAgICAgKgorICAgICAqIEBpbnRlcm5hbAorICAgICAqLworICAgIHVubW91 bnRDaGlsZHJlbjogZnVuY3Rpb24gKHNhZmVseSkgeworICAgICAgdmFyIHJlbmRlcmVkQ2hpbGRy ZW4gPSB0aGlzLl9yZW5kZXJlZENoaWxkcmVuOworICAgICAgUmVhY3RDaGlsZFJlY29uY2lsZXIu dW5tb3VudENoaWxkcmVuKHJlbmRlcmVkQ2hpbGRyZW4sIHNhZmVseSk7CisgICAgICB0aGlzLl9y ZW5kZXJlZENoaWxkcmVuID0gbnVsbDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogTW92ZXMg YSBjaGlsZCBjb21wb25lbnQgdG8gdGhlIHN1cHBsaWVkIGluZGV4LgorICAgICAqCisgICAgICog QHBhcmFtIHtSZWFjdENvbXBvbmVudH0gY2hpbGQgQ29tcG9uZW50IHRvIG1vdmUuCisgICAgICog QHBhcmFtIHtudW1iZXJ9IHRvSW5kZXggRGVzdGluYXRpb24gaW5kZXggb2YgdGhlIGVsZW1lbnQu CisgICAgICogQHBhcmFtIHtudW1iZXJ9IGxhc3RJbmRleCBMYXN0IGluZGV4IHZpc2l0ZWQgb2Yg dGhlIHNpYmxpbmdzIG9mIGBjaGlsZGAuCisgICAgICogQHByb3RlY3RlZAorICAgICAqLworICAg IG1vdmVDaGlsZDogZnVuY3Rpb24gKGNoaWxkLCBhZnRlck5vZGUsIHRvSW5kZXgsIGxhc3RJbmRl eCkgeworICAgICAgLy8gSWYgdGhlIGluZGV4IG9mIGBjaGlsZGAgaXMgbGVzcyB0aGFuIGBsYXN0 SW5kZXhgLCB0aGVuIGl0IG5lZWRzIHRvCisgICAgICAvLyBiZSBtb3ZlZC4gT3RoZXJ3aXNlLCB3 ZSBkbyBub3QgbmVlZCB0byBtb3ZlIGl0IGJlY2F1c2UgYSBjaGlsZCB3aWxsIGJlCisgICAgICAv LyBpbnNlcnRlZCBvciBtb3ZlZCBiZWZvcmUgYGNoaWxkYC4KKyAgICAgIGlmIChjaGlsZC5fbW91 bnRJbmRleCA8IGxhc3RJbmRleCkgeworICAgICAgICByZXR1cm4gbWFrZU1vdmUoY2hpbGQsIGFm dGVyTm9kZSwgdG9JbmRleCk7CisgICAgICB9CisgICAgfSwKKworICAgIC8qKgorICAgICAqIENy ZWF0ZXMgYSBjaGlsZCBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0ge1JlYWN0Q29t cG9uZW50fSBjaGlsZCBDb21wb25lbnQgdG8gY3JlYXRlLgorICAgICAqIEBwYXJhbSB7c3RyaW5n fSBtb3VudEltYWdlIE1hcmt1cCB0byBpbnNlcnQuCisgICAgICogQHByb3RlY3RlZAorICAgICAq LworICAgIGNyZWF0ZUNoaWxkOiBmdW5jdGlvbiAoY2hpbGQsIGFmdGVyTm9kZSwgbW91bnRJbWFn ZSkgeworICAgICAgcmV0dXJuIG1ha2VJbnNlcnRNYXJrdXAobW91bnRJbWFnZSwgYWZ0ZXJOb2Rl LCBjaGlsZC5fbW91bnRJbmRleCk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMg YSBjaGlsZCBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50 fSBjaGlsZCBDaGlsZCB0byByZW1vdmUuCisgICAgICogQHByb3RlY3RlZAorICAgICAqLworICAg IHJlbW92ZUNoaWxkOiBmdW5jdGlvbiAoY2hpbGQsIG5vZGUpIHsKKyAgICAgIHJldHVybiBtYWtl UmVtb3ZlKGNoaWxkLCBub2RlKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogTW91bnRzIGEg Y2hpbGQgd2l0aCB0aGUgc3VwcGxpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIE5PVEU6IFRoaXMg aXMgcGFydCBvZiBgdXBkYXRlQ2hpbGRyZW5gIGFuZCBpcyBoZXJlIGZvciByZWFkYWJpbGl0eS4K KyAgICAgKgorICAgICAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGNoaWxkIENvbXBvbmVudCB0 byBtb3VudC4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBjaGlsZC4K KyAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0IHRo ZSBjaGlsZC4KKyAgICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5z YWN0aW9uCisgICAgICogQHByaXZhdGUKKyAgICAgKi8KKyAgICBfbW91bnRDaGlsZEF0SW5kZXg6 IGZ1bmN0aW9uIChjaGlsZCwgbW91bnRJbWFnZSwgYWZ0ZXJOb2RlLCBpbmRleCwgdHJhbnNhY3Rp b24sIGNvbnRleHQpIHsKKyAgICAgIGNoaWxkLl9tb3VudEluZGV4ID0gaW5kZXg7CisgICAgICBy ZXR1cm4gdGhpcy5jcmVhdGVDaGlsZChjaGlsZCwgYWZ0ZXJOb2RlLCBtb3VudEltYWdlKTsKKyAg ICB9LAorCisgICAgLyoqCisgICAgICogVW5tb3VudHMgYSByZW5kZXJlZCBjaGlsZC4KKyAgICAg KgorICAgICAqIE5PVEU6IFRoaXMgaXMgcGFydCBvZiBgdXBkYXRlQ2hpbGRyZW5gIGFuZCBpcyBo ZXJlIGZvciByZWFkYWJpbGl0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB7UmVhY3RDb21wb25l bnR9IGNoaWxkIENvbXBvbmVudCB0byB1bm1vdW50LgorICAgICAqIEBwcml2YXRlCisgICAgICov CisgICAgX3VubW91bnRDaGlsZDogZnVuY3Rpb24gKGNoaWxkLCBub2RlKSB7CisgICAgICB2YXIg dXBkYXRlID0gdGhpcy5yZW1vdmVDaGlsZChjaGlsZCwgbm9kZSk7CisgICAgICBjaGlsZC5fbW91 bnRJbmRleCA9IG51bGw7CisgICAgICByZXR1cm4gdXBkYXRlOworICAgIH0KKworICB9CisKK307 CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RNdWx0aUNoaWxkOworfSx7IjEwOSI6MTA5LCIxMjUi OjEyNSwiMTMzIjoxMzMsIjE0MiI6MTQyLCIxNTAiOjE1MCwiMjciOjI3LCIyOSI6MjksIjYzIjo2 MywiNjQiOjY0LCI3NSI6NzV9XSw2OTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7 CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwg cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5k ZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGlu IHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdy YW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxl IGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisK K3ZhciBfcHJvZEludmFyaWFudCA9IF9kZXJlcV8oMTI1KTsKKwordmFyIFJlYWN0ID0gX2RlcmVx XygxMzQpOworCit2YXIgaW52YXJpYW50ID0gX2RlcmVxXygxNTApOworCit2YXIgUmVhY3ROb2Rl VHlwZXMgPSB7CisgIEhPU1Q6IDAsCisgIENPTVBPU0lURTogMSwKKyAgRU1QVFk6IDIsCisKKyAg Z2V0VHlwZTogZnVuY3Rpb24gKG5vZGUpIHsKKyAgICBpZiAobm9kZSA9PT0gbnVsbCB8fCBub2Rl ID09PSBmYWxzZSkgeworICAgICAgcmV0dXJuIFJlYWN0Tm9kZVR5cGVzLkVNUFRZOworICAgIH0g ZWxzZSBpZiAoUmVhY3QuaXNWYWxpZEVsZW1lbnQobm9kZSkpIHsKKyAgICAgIGlmICh0eXBlb2Yg bm9kZS50eXBlID09PSAnZnVuY3Rpb24nKSB7CisgICAgICAgIHJldHVybiBSZWFjdE5vZGVUeXBl cy5DT01QT1NJVEU7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gUmVhY3ROb2RlVHlw ZXMuSE9TVDsKKyAgICAgIH0KKyAgICB9CisgICAgIWZhbHNlID8gImRldmVsb3BtZW50IiAhPT0g J3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnVW5leHBlY3RlZCBub2RlOiAlcycsIG5v ZGUpIDogX3Byb2RJbnZhcmlhbnQoJzI2Jywgbm9kZSkgOiB2b2lkIDA7CisgIH0KK307CisKK21v ZHVsZS5leHBvcnRzID0gUmVhY3ROb2RlVHlwZXM7Cit9LHsiMTI1IjoxMjUsIjEzNCI6MTM0LCIx NTAiOjE1MH1dLDcwOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICog Q29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVz ZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNE LXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qg ZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9m IHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNh bWUgZGlyZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9wcm9k SW52YXJpYW50ID0gX2RlcmVxXygxMjUpOworCit2YXIgaW52YXJpYW50ID0gX2RlcmVxXygxNTAp OworCisvKioKKyAqIEBwYXJhbSB7P29iamVjdH0gb2JqZWN0CisgKiBAcmV0dXJuIHtib29sZWFu fSBUcnVlIGlmIGBvYmplY3RgIGlzIGEgdmFsaWQgb3duZXIuCisgKiBAZmluYWwKKyAqLworZnVu Y3Rpb24gaXNWYWxpZE93bmVyKG9iamVjdCkgeworICByZXR1cm4gISEob2JqZWN0ICYmIHR5cGVv ZiBvYmplY3QuYXR0YWNoUmVmID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmplY3QuZGV0YWNo UmVmID09PSAnZnVuY3Rpb24nKTsKK30KKworLyoqCisgKiBSZWFjdE93bmVycyBhcmUgY2FwYWJs ZSBvZiBzdG9yaW5nIHJlZmVyZW5jZXMgdG8gb3duZWQgY29tcG9uZW50cy4KKyAqCisgKiBBbGwg Y29tcG9uZW50cyBhcmUgY2FwYWJsZSBvZiAvL2JlaW5nLy8gcmVmZXJlbmNlZCBieSBvd25lciBj b21wb25lbnRzLCBidXQKKyAqIG9ubHkgUmVhY3RPd25lciBjb21wb25lbnRzIGFyZSBjYXBhYmxl IG9mIC8vcmVmZXJlbmNpbmcvLyBvd25lZCBjb21wb25lbnRzLgorICogVGhlIG5hbWVkIHJlZmVy ZW5jZSBpcyBrbm93biBhcyBhICJyZWYiLgorICoKKyAqIFJlZnMgYXJlIGF2YWlsYWJsZSB3aGVu IG1vdW50ZWQgYW5kIHVwZGF0ZWQgZHVyaW5nIHJlY29uY2lsaWF0aW9uLgorICoKKyAqICAgdmFy IE15Q29tcG9uZW50ID0gUmVhY3QuY3JlYXRlQ2xhc3MoeworICogICAgIHJlbmRlcjogZnVuY3Rp b24oKSB7CisgKiAgICAgICByZXR1cm4gKAorICogICAgICAgICA8ZGl2IG9uQ2xpY2s9e3RoaXMu aGFuZGxlQ2xpY2t9PgorICogICAgICAgICAgIDxDdXN0b21Db21wb25lbnQgcmVmPSJjdXN0b20i IC8+CisgKiAgICAgICAgIDwvZGl2PgorICogICAgICAgKTsKKyAqICAgICB9LAorICogICAgIGhh bmRsZUNsaWNrOiBmdW5jdGlvbigpIHsKKyAqICAgICAgIHRoaXMucmVmcy5jdXN0b20uaGFuZGxl Q2xpY2soKTsKKyAqICAgICB9LAorICogICAgIGNvbXBvbmVudERpZE1vdW50OiBmdW5jdGlvbigp IHsKKyAqICAgICAgIHRoaXMucmVmcy5jdXN0b20uaW5pdGlhbGl6ZSgpOworICogICAgIH0KKyAq ICAgfSk7CisgKgorICogUmVmcyBzaG91bGQgcmFyZWx5IGJlIHVzZWQuIFdoZW4gcmVmcyBhcmUg dXNlZCwgdGhleSBzaG91bGQgb25seSBiZSBkb25lIHRvCisgKiBjb250cm9sIGRhdGEgdGhhdCBp cyBub3QgaGFuZGxlZCBieSBSZWFjdCdzIGRhdGEgZmxvdy4KKyAqCisgKiBAY2xhc3MgUmVhY3RP d25lcgorICovCit2YXIgUmVhY3RPd25lciA9IHsKKyAgLyoqCisgICAqIEFkZHMgYSBjb21wb25l bnQgYnkgcmVmIHRvIGFuIG93bmVyIGNvbXBvbmVudC4KKyAgICoKKyAgICogQHBhcmFtIHtSZWFj dENvbXBvbmVudH0gY29tcG9uZW50IENvbXBvbmVudCB0byByZWZlcmVuY2UuCisgICAqIEBwYXJh bSB7c3RyaW5nfSByZWYgTmFtZSBieSB3aGljaCB0byByZWZlciB0byB0aGUgY29tcG9uZW50Lgor ICAgKiBAcGFyYW0ge1JlYWN0T3duZXJ9IG93bmVyIENvbXBvbmVudCBvbiB3aGljaCB0byByZWNv cmQgdGhlIHJlZi4KKyAgICogQGZpbmFsCisgICAqIEBpbnRlcm5hbAorICAgKi8KKyAgYWRkQ29t cG9uZW50QXNSZWZUbzogZnVuY3Rpb24gKGNvbXBvbmVudCwgcmVmLCBvd25lcikgeworICAgICFp c1ZhbGlkT3duZXIob3duZXIpID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52 YXJpYW50KGZhbHNlLCAnYWRkQ29tcG9uZW50QXNSZWZUbyguLi4pOiBPbmx5IGEgUmVhY3RPd25l ciBjYW4gaGF2ZSByZWZzLiBZb3UgbWlnaHQgYmUgYWRkaW5nIGEgcmVmIHRvIGEgY29tcG9uZW50 IHRoYXQgd2FzIG5vdCBjcmVhdGVkIGluc2lkZSBhIGNvbXBvbmVudFwncyBgcmVuZGVyYCBtZXRo b2QsIG9yIHlvdSBoYXZlIG11bHRpcGxlIGNvcGllcyBvZiBSZWFjdCBsb2FkZWQgKGRldGFpbHM6 IGh0dHBzOi8vZmIubWUvcmVhY3QtcmVmcy1tdXN0LWhhdmUtb3duZXIpLicpIDogX3Byb2RJbnZh cmlhbnQoJzExOScpIDogdm9pZCAwOworICAgIG93bmVyLmF0dGFjaFJlZihyZWYsIGNvbXBvbmVu dCk7CisgIH0sCisKKyAgLyoqCisgICAqIFJlbW92ZXMgYSBjb21wb25lbnQgYnkgcmVmIGZyb20g YW4gb3duZXIgY29tcG9uZW50LgorICAgKgorICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBj b21wb25lbnQgQ29tcG9uZW50IHRvIGRlcmVmZXJlbmNlLgorICAgKiBAcGFyYW0ge3N0cmluZ30g cmVmIE5hbWUgb2YgdGhlIHJlZiB0byByZW1vdmUuCisgICAqIEBwYXJhbSB7UmVhY3RPd25lcn0g b3duZXIgQ29tcG9uZW50IG9uIHdoaWNoIHRoZSByZWYgaXMgcmVjb3JkZWQuCisgICAqIEBmaW5h bAorICAgKiBAaW50ZXJuYWwKKyAgICovCisgIHJlbW92ZUNvbXBvbmVudEFzUmVmRnJvbTogZnVu Y3Rpb24gKGNvbXBvbmVudCwgcmVmLCBvd25lcikgeworICAgICFpc1ZhbGlkT3duZXIob3duZXIp ID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAncmVt b3ZlQ29tcG9uZW50QXNSZWZGcm9tKC4uLik6IE9ubHkgYSBSZWFjdE93bmVyIGNhbiBoYXZlIHJl ZnMuIFlvdSBtaWdodCBiZSByZW1vdmluZyBhIHJlZiB0byBhIGNvbXBvbmVudCB0aGF0IHdhcyBu b3QgY3JlYXRlZCBpbnNpZGUgYSBjb21wb25lbnRcJ3MgYHJlbmRlcmAgbWV0aG9kLCBvciB5b3Ug aGF2ZSBtdWx0aXBsZSBjb3BpZXMgb2YgUmVhY3QgbG9hZGVkIChkZXRhaWxzOiBodHRwczovL2Zi Lm1lL3JlYWN0LXJlZnMtbXVzdC1oYXZlLW93bmVyKS4nKSA6IF9wcm9kSW52YXJpYW50KCcxMjAn KSA6IHZvaWQgMDsKKyAgICB2YXIgb3duZXJQdWJsaWNJbnN0YW5jZSA9IG93bmVyLmdldFB1Ymxp Y0luc3RhbmNlKCk7CisgICAgLy8gQ2hlY2sgdGhhdCBgY29tcG9uZW50YCdzIG93bmVyIGlzIHN0 aWxsIGFsaXZlIGFuZCB0aGF0IGBjb21wb25lbnRgIGlzIHN0aWxsIHRoZSBjdXJyZW50IHJlZgor ICAgIC8vIGJlY2F1c2Ugd2UgZG8gbm90IHdhbnQgdG8gZGV0YWNoIHRoZSByZWYgaWYgYW5vdGhl ciBjb21wb25lbnQgc3RvbGUgaXQuCisgICAgaWYgKG93bmVyUHVibGljSW5zdGFuY2UgJiYgb3du ZXJQdWJsaWNJbnN0YW5jZS5yZWZzW3JlZl0gPT09IGNvbXBvbmVudC5nZXRQdWJsaWNJbnN0YW5j ZSgpKSB7CisgICAgICBvd25lci5kZXRhY2hSZWYocmVmKTsKKyAgICB9CisgIH0KKworfTsKKwor bW9kdWxlLmV4cG9ydHMgPSBSZWFjdE93bmVyOworfSx7IjEyNSI6MTI1LCIxNTAiOjE1MH1dLDcx OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIw MTYtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor ICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vu c2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9m IHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdo dHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5 LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9hc3NpZ24gPSBfZGVyZXFf KDE1OCk7CisKK3ZhciBfZXh0ZW5kcyA9IF9hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBm b3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0g YXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90 eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291 cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07CisKK3ZhciBSZWFjdERlYnVnVG9vbCA9 IF9kZXJlcV8oNTApOwordmFyIHdhcm5pbmcgPSBfZGVyZXFfKDE1Nyk7Cit2YXIgYWxyZWFkeVdh cm5lZCA9IGZhbHNlOworCitmdW5jdGlvbiByb3VuZEZsb2F0KHZhbCkgeworICB2YXIgYmFzZSA9 IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJn dW1lbnRzWzFdIDogMjsKKworICB2YXIgbiA9IE1hdGgucG93KDEwLCBiYXNlKTsKKyAgcmV0dXJu IE1hdGguZmxvb3IodmFsICogbikgLyBuOworfQorCisvLyBGbG93IHR5cGUgZGVmaW5pdGlvbiBv ZiBjb25zb2xlLnRhYmxlIGlzIHRvbyBzdHJpY3QgcmlnaHQgbm93LCBzZWUKKy8vIGh0dHBzOi8v Z2l0aHViLmNvbS9mYWNlYm9vay9mbG93L3B1bGwvMjM1MyBmb3IgdXBkYXRlcworZnVuY3Rpb24g Y29uc29sZVRhYmxlKHRhYmxlKSB7CisgIGNvbnNvbGUudGFibGUodGFibGUpOworfQorCitmdW5j dGlvbiB3YXJuSW5Qcm9kdWN0aW9uKCkgeworICBpZiAoYWxyZWFkeVdhcm5lZCkgeworICAgIHJl dHVybjsKKyAgfQorICBhbHJlYWR5V2FybmVkID0gdHJ1ZTsKKyAgaWYgKHR5cGVvZiBjb25zb2xl ICE9PSAndW5kZWZpbmVkJykgeworICAgIGNvbnNvbGUuZXJyb3IoJ1JlYWN0UGVyZiBpcyBub3Qg c3VwcG9ydGVkIGluIHRoZSBwcm9kdWN0aW9uIGJ1aWxkcyBvZiBSZWFjdC4gJyArICdUbyBjb2xs ZWN0IG1lYXN1cmVtZW50cywgcGxlYXNlIHVzZSB0aGUgZGV2ZWxvcG1lbnQgYnVpbGQgb2YgUmVh Y3QgaW5zdGVhZC4nKTsKKyAgfQorfQorCitmdW5jdGlvbiBnZXRMYXN0TWVhc3VyZW1lbnRzKCkg eworICBpZiAoISgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpKSB7CisgICAgd2Fybklu UHJvZHVjdGlvbigpOworICAgIHJldHVybiBbXTsKKyAgfQorCisgIHJldHVybiBSZWFjdERlYnVn VG9vbC5nZXRGbHVzaEhpc3RvcnkoKTsKK30KKworZnVuY3Rpb24gZ2V0RXhjbHVzaXZlKCkgewor ICB2YXIgZmx1c2hIaXN0b3J5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBd ICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBnZXRMYXN0TWVhc3VyZW1lbnRzKCk7CisK KyAgaWYgKCEoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSkgeworICAgIHdhcm5JblBy b2R1Y3Rpb24oKTsKKyAgICByZXR1cm4gW107CisgIH0KKworICB2YXIgYWdncmVnYXRlZFN0YXRz ID0ge307CisgIHZhciBhZmZlY3RlZElEcyA9IHt9OworCisgIGZ1bmN0aW9uIHVwZGF0ZUFnZ3Jl Z2F0ZWRTdGF0cyh0cmVlU25hcHNob3QsIGluc3RhbmNlSUQsIHRpbWVyVHlwZSwgYXBwbHlVcGRh dGUpIHsKKyAgICB2YXIgZGlzcGxheU5hbWUgPSB0cmVlU25hcHNob3RbaW5zdGFuY2VJRF0uZGlz cGxheU5hbWU7CisKKyAgICB2YXIga2V5ID0gZGlzcGxheU5hbWU7CisgICAgdmFyIHN0YXRzID0g YWdncmVnYXRlZFN0YXRzW2tleV07CisgICAgaWYgKCFzdGF0cykgeworICAgICAgYWZmZWN0ZWRJ RHNba2V5XSA9IHt9OworICAgICAgc3RhdHMgPSBhZ2dyZWdhdGVkU3RhdHNba2V5XSA9IHsKKyAg ICAgICAga2V5OiBrZXksCisgICAgICAgIGluc3RhbmNlQ291bnQ6IDAsCisgICAgICAgIGNvdW50 czoge30sCisgICAgICAgIGR1cmF0aW9uczoge30sCisgICAgICAgIHRvdGFsRHVyYXRpb246IDAK KyAgICAgIH07CisgICAgfQorICAgIGlmICghc3RhdHMuZHVyYXRpb25zW3RpbWVyVHlwZV0pIHsK KyAgICAgIHN0YXRzLmR1cmF0aW9uc1t0aW1lclR5cGVdID0gMDsKKyAgICB9CisgICAgaWYgKCFz dGF0cy5jb3VudHNbdGltZXJUeXBlXSkgeworICAgICAgc3RhdHMuY291bnRzW3RpbWVyVHlwZV0g PSAwOworICAgIH0KKyAgICBhZmZlY3RlZElEc1trZXldW2luc3RhbmNlSURdID0gdHJ1ZTsKKyAg ICBhcHBseVVwZGF0ZShzdGF0cyk7CisgIH0KKworICBmbHVzaEhpc3RvcnkuZm9yRWFjaChmdW5j dGlvbiAoZmx1c2gpIHsKKyAgICB2YXIgbWVhc3VyZW1lbnRzID0gZmx1c2gubWVhc3VyZW1lbnRz LAorICAgICAgICB0cmVlU25hcHNob3QgPSBmbHVzaC50cmVlU25hcHNob3Q7CisKKyAgICBtZWFz dXJlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobWVhc3VyZW1lbnQpIHsKKyAgICAgIHZhciBkdXJh dGlvbiA9IG1lYXN1cmVtZW50LmR1cmF0aW9uLAorICAgICAgICAgIGluc3RhbmNlSUQgPSBtZWFz dXJlbWVudC5pbnN0YW5jZUlELAorICAgICAgICAgIHRpbWVyVHlwZSA9IG1lYXN1cmVtZW50LnRp bWVyVHlwZTsKKworICAgICAgdXBkYXRlQWdncmVnYXRlZFN0YXRzKHRyZWVTbmFwc2hvdCwgaW5z dGFuY2VJRCwgdGltZXJUeXBlLCBmdW5jdGlvbiAoc3RhdHMpIHsKKyAgICAgICAgc3RhdHMudG90 YWxEdXJhdGlvbiArPSBkdXJhdGlvbjsKKyAgICAgICAgc3RhdHMuZHVyYXRpb25zW3RpbWVyVHlw ZV0gKz0gZHVyYXRpb247CisgICAgICAgIHN0YXRzLmNvdW50c1t0aW1lclR5cGVdKys7CisgICAg ICB9KTsKKyAgICB9KTsKKyAgfSk7CisKKyAgcmV0dXJuIE9iamVjdC5rZXlzKGFnZ3JlZ2F0ZWRT dGF0cykubWFwKGZ1bmN0aW9uIChrZXkpIHsKKyAgICByZXR1cm4gX2V4dGVuZHMoe30sIGFnZ3Jl Z2F0ZWRTdGF0c1trZXldLCB7CisgICAgICBpbnN0YW5jZUNvdW50OiBPYmplY3Qua2V5cyhhZmZl Y3RlZElEc1trZXldKS5sZW5ndGgKKyAgICB9KTsKKyAgfSkuc29ydChmdW5jdGlvbiAoYSwgYikg eworICAgIHJldHVybiBiLnRvdGFsRHVyYXRpb24gLSBhLnRvdGFsRHVyYXRpb247CisgIH0pOwor fQorCitmdW5jdGlvbiBnZXRJbmNsdXNpdmUoKSB7CisgIHZhciBmbHVzaEhpc3RvcnkgPSBhcmd1 bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50 c1swXSA6IGdldExhc3RNZWFzdXJlbWVudHMoKTsKKworICBpZiAoISgiZGV2ZWxvcG1lbnQiICE9 PSAncHJvZHVjdGlvbicpKSB7CisgICAgd2FybkluUHJvZHVjdGlvbigpOworICAgIHJldHVybiBb XTsKKyAgfQorCisgIHZhciBhZ2dyZWdhdGVkU3RhdHMgPSB7fTsKKyAgdmFyIGFmZmVjdGVkSURz ID0ge307CisKKyAgZnVuY3Rpb24gdXBkYXRlQWdncmVnYXRlZFN0YXRzKHRyZWVTbmFwc2hvdCwg aW5zdGFuY2VJRCwgYXBwbHlVcGRhdGUpIHsKKyAgICB2YXIgX3RyZWVTbmFwc2hvdCRpbnN0YW5j ID0gdHJlZVNuYXBzaG90W2luc3RhbmNlSURdLAorICAgICAgICBkaXNwbGF5TmFtZSA9IF90cmVl U25hcHNob3QkaW5zdGFuYy5kaXNwbGF5TmFtZSwKKyAgICAgICAgb3duZXJJRCA9IF90cmVlU25h cHNob3QkaW5zdGFuYy5vd25lcklEOworCisgICAgdmFyIG93bmVyID0gdHJlZVNuYXBzaG90W293 bmVySURdOworICAgIHZhciBrZXkgPSAob3duZXIgPyBvd25lci5kaXNwbGF5TmFtZSArICcgPiAn IDogJycpICsgZGlzcGxheU5hbWU7CisgICAgdmFyIHN0YXRzID0gYWdncmVnYXRlZFN0YXRzW2tl eV07CisgICAgaWYgKCFzdGF0cykgeworICAgICAgYWZmZWN0ZWRJRHNba2V5XSA9IHt9OworICAg ICAgc3RhdHMgPSBhZ2dyZWdhdGVkU3RhdHNba2V5XSA9IHsKKyAgICAgICAga2V5OiBrZXksCisg ICAgICAgIGluc3RhbmNlQ291bnQ6IDAsCisgICAgICAgIGluY2x1c2l2ZVJlbmRlckR1cmF0aW9u OiAwLAorICAgICAgICByZW5kZXJDb3VudDogMAorICAgICAgfTsKKyAgICB9CisgICAgYWZmZWN0 ZWRJRHNba2V5XVtpbnN0YW5jZUlEXSA9IHRydWU7CisgICAgYXBwbHlVcGRhdGUoc3RhdHMpOwor ICB9CisKKyAgdmFyIGlzQ29tcG9zaXRlQnlJRCA9IHt9OworICBmbHVzaEhpc3RvcnkuZm9yRWFj aChmdW5jdGlvbiAoZmx1c2gpIHsKKyAgICB2YXIgbWVhc3VyZW1lbnRzID0gZmx1c2gubWVhc3Vy ZW1lbnRzOworCisgICAgbWVhc3VyZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG1lYXN1cmVtZW50 KSB7CisgICAgICB2YXIgaW5zdGFuY2VJRCA9IG1lYXN1cmVtZW50Lmluc3RhbmNlSUQsCisgICAg ICAgICAgdGltZXJUeXBlID0gbWVhc3VyZW1lbnQudGltZXJUeXBlOworCisgICAgICBpZiAodGlt ZXJUeXBlICE9PSAncmVuZGVyJykgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBp c0NvbXBvc2l0ZUJ5SURbaW5zdGFuY2VJRF0gPSB0cnVlOworICAgIH0pOworICB9KTsKKworICBm bHVzaEhpc3RvcnkuZm9yRWFjaChmdW5jdGlvbiAoZmx1c2gpIHsKKyAgICB2YXIgbWVhc3VyZW1l bnRzID0gZmx1c2gubWVhc3VyZW1lbnRzLAorICAgICAgICB0cmVlU25hcHNob3QgPSBmbHVzaC50 cmVlU25hcHNob3Q7CisKKyAgICBtZWFzdXJlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobWVhc3Vy ZW1lbnQpIHsKKyAgICAgIHZhciBkdXJhdGlvbiA9IG1lYXN1cmVtZW50LmR1cmF0aW9uLAorICAg ICAgICAgIGluc3RhbmNlSUQgPSBtZWFzdXJlbWVudC5pbnN0YW5jZUlELAorICAgICAgICAgIHRp bWVyVHlwZSA9IG1lYXN1cmVtZW50LnRpbWVyVHlwZTsKKworICAgICAgaWYgKHRpbWVyVHlwZSAh PT0gJ3JlbmRlcicpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgdXBkYXRlQWdn cmVnYXRlZFN0YXRzKHRyZWVTbmFwc2hvdCwgaW5zdGFuY2VJRCwgZnVuY3Rpb24gKHN0YXRzKSB7 CisgICAgICAgIHN0YXRzLnJlbmRlckNvdW50Kys7CisgICAgICB9KTsKKyAgICAgIHZhciBuZXh0 UGFyZW50SUQgPSBpbnN0YW5jZUlEOworICAgICAgd2hpbGUgKG5leHRQYXJlbnRJRCkgeworICAg ICAgICAvLyBBcyB3ZSB0cmF2ZXJzZSBwYXJlbnRzLCBvbmx5IGNvdW50IGluY2x1c2l2ZSB0aW1l IHRvd2FyZHMgY29tcG9zaXRlcy4KKyAgICAgICAgLy8gV2Uga25vdyBzb21ldGhpbmcgaXMgYSBj b21wb3NpdGUgaWYgaXRzIHJlbmRlcigpIHdhcyBjYWxsZWQuCisgICAgICAgIGlmIChpc0NvbXBv c2l0ZUJ5SURbbmV4dFBhcmVudElEXSkgeworICAgICAgICAgIHVwZGF0ZUFnZ3JlZ2F0ZWRTdGF0 cyh0cmVlU25hcHNob3QsIG5leHRQYXJlbnRJRCwgZnVuY3Rpb24gKHN0YXRzKSB7CisgICAgICAg ICAgICBzdGF0cy5pbmNsdXNpdmVSZW5kZXJEdXJhdGlvbiArPSBkdXJhdGlvbjsKKyAgICAgICAg ICB9KTsKKyAgICAgICAgfQorICAgICAgICBuZXh0UGFyZW50SUQgPSB0cmVlU25hcHNob3RbbmV4 dFBhcmVudElEXS5wYXJlbnRJRDsKKyAgICAgIH0KKyAgICB9KTsKKyAgfSk7CisKKyAgcmV0dXJu IE9iamVjdC5rZXlzKGFnZ3JlZ2F0ZWRTdGF0cykubWFwKGZ1bmN0aW9uIChrZXkpIHsKKyAgICBy ZXR1cm4gX2V4dGVuZHMoe30sIGFnZ3JlZ2F0ZWRTdGF0c1trZXldLCB7CisgICAgICBpbnN0YW5j ZUNvdW50OiBPYmplY3Qua2V5cyhhZmZlY3RlZElEc1trZXldKS5sZW5ndGgKKyAgICB9KTsKKyAg fSkuc29ydChmdW5jdGlvbiAoYSwgYikgeworICAgIHJldHVybiBiLmluY2x1c2l2ZVJlbmRlckR1 cmF0aW9uIC0gYS5pbmNsdXNpdmVSZW5kZXJEdXJhdGlvbjsKKyAgfSk7Cit9CisKK2Z1bmN0aW9u IGdldFdhc3RlZCgpIHsKKyAgdmFyIGZsdXNoSGlzdG9yeSA9IGFyZ3VtZW50cy5sZW5ndGggPiAw ICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZ2V0TGFzdE1l YXN1cmVtZW50cygpOworCisgIGlmICghKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykp IHsKKyAgICB3YXJuSW5Qcm9kdWN0aW9uKCk7CisgICAgcmV0dXJuIFtdOworICB9CisKKyAgdmFy IGFnZ3JlZ2F0ZWRTdGF0cyA9IHt9OworICB2YXIgYWZmZWN0ZWRJRHMgPSB7fTsKKworICBmdW5j dGlvbiB1cGRhdGVBZ2dyZWdhdGVkU3RhdHModHJlZVNuYXBzaG90LCBpbnN0YW5jZUlELCBhcHBs eVVwZGF0ZSkgeworICAgIHZhciBfdHJlZVNuYXBzaG90JGluc3RhbmMyID0gdHJlZVNuYXBzaG90 W2luc3RhbmNlSURdLAorICAgICAgICBkaXNwbGF5TmFtZSA9IF90cmVlU25hcHNob3QkaW5zdGFu YzIuZGlzcGxheU5hbWUsCisgICAgICAgIG93bmVySUQgPSBfdHJlZVNuYXBzaG90JGluc3RhbmMy Lm93bmVySUQ7CisKKyAgICB2YXIgb3duZXIgPSB0cmVlU25hcHNob3Rbb3duZXJJRF07CisgICAg dmFyIGtleSA9IChvd25lciA/IG93bmVyLmRpc3BsYXlOYW1lICsgJyA+ICcgOiAnJykgKyBkaXNw bGF5TmFtZTsKKyAgICB2YXIgc3RhdHMgPSBhZ2dyZWdhdGVkU3RhdHNba2V5XTsKKyAgICBpZiAo IXN0YXRzKSB7CisgICAgICBhZmZlY3RlZElEc1trZXldID0ge307CisgICAgICBzdGF0cyA9IGFn Z3JlZ2F0ZWRTdGF0c1trZXldID0geworICAgICAgICBrZXk6IGtleSwKKyAgICAgICAgaW5zdGFu Y2VDb3VudDogMCwKKyAgICAgICAgaW5jbHVzaXZlUmVuZGVyRHVyYXRpb246IDAsCisgICAgICAg IHJlbmRlckNvdW50OiAwCisgICAgICB9OworICAgIH0KKyAgICBhZmZlY3RlZElEc1trZXldW2lu c3RhbmNlSURdID0gdHJ1ZTsKKyAgICBhcHBseVVwZGF0ZShzdGF0cyk7CisgIH0KKworICBmbHVz aEhpc3RvcnkuZm9yRWFjaChmdW5jdGlvbiAoZmx1c2gpIHsKKyAgICB2YXIgbWVhc3VyZW1lbnRz ID0gZmx1c2gubWVhc3VyZW1lbnRzLAorICAgICAgICB0cmVlU25hcHNob3QgPSBmbHVzaC50cmVl U25hcHNob3QsCisgICAgICAgIG9wZXJhdGlvbnMgPSBmbHVzaC5vcGVyYXRpb25zOworCisgICAg dmFyIGlzRGVmaW5pdGVseU5vdFdhc3RlZEJ5SUQgPSB7fTsKKworICAgIC8vIEZpbmQgaG9zdCBj b21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCBhbiBvcGVyYXRpb24gaW4gdGhpcyBiYXRjaC4KKyAg ICAvLyBNYXJrIGFsbCBjb21wb25lbnRzIGluIHRoZWlyIHBhcmVudCB0cmVlIGFzIGRlZmluaXRl bHkgbm90IHdhc3RlZC4KKyAgICBvcGVyYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKG9wZXJhdGlv bikgeworICAgICAgdmFyIGluc3RhbmNlSUQgPSBvcGVyYXRpb24uaW5zdGFuY2VJRDsKKworICAg ICAgdmFyIG5leHRQYXJlbnRJRCA9IGluc3RhbmNlSUQ7CisgICAgICB3aGlsZSAobmV4dFBhcmVu dElEKSB7CisgICAgICAgIGlzRGVmaW5pdGVseU5vdFdhc3RlZEJ5SURbbmV4dFBhcmVudElEXSA9 IHRydWU7CisgICAgICAgIG5leHRQYXJlbnRJRCA9IHRyZWVTbmFwc2hvdFtuZXh0UGFyZW50SURd LnBhcmVudElEOworICAgICAgfQorICAgIH0pOworCisgICAgLy8gRmluZCBjb21wb3NpdGUgY29t cG9uZW50cyB0aGF0IHJlbmRlcmVkIGluIHRoaXMgYmF0Y2guCisgICAgLy8gVGhlc2UgYXJlIHBv dGVudGlhbCBjYW5kaWRhdGVzIGZvciBiZWluZyB3YXN0ZWQgcmVuZGVycy4KKyAgICB2YXIgcmVu ZGVyZWRDb21wb3NpdGVJRHMgPSB7fTsKKyAgICBtZWFzdXJlbWVudHMuZm9yRWFjaChmdW5jdGlv biAobWVhc3VyZW1lbnQpIHsKKyAgICAgIHZhciBpbnN0YW5jZUlEID0gbWVhc3VyZW1lbnQuaW5z dGFuY2VJRCwKKyAgICAgICAgICB0aW1lclR5cGUgPSBtZWFzdXJlbWVudC50aW1lclR5cGU7CisK KyAgICAgIGlmICh0aW1lclR5cGUgIT09ICdyZW5kZXInKSB7CisgICAgICAgIHJldHVybjsKKyAg ICAgIH0KKyAgICAgIHJlbmRlcmVkQ29tcG9zaXRlSURzW2luc3RhbmNlSURdID0gdHJ1ZTsKKyAg ICB9KTsKKworICAgIG1lYXN1cmVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtZWFzdXJlbWVudCkg eworICAgICAgdmFyIGR1cmF0aW9uID0gbWVhc3VyZW1lbnQuZHVyYXRpb24sCisgICAgICAgICAg aW5zdGFuY2VJRCA9IG1lYXN1cmVtZW50Lmluc3RhbmNlSUQsCisgICAgICAgICAgdGltZXJUeXBl ID0gbWVhc3VyZW1lbnQudGltZXJUeXBlOworCisgICAgICBpZiAodGltZXJUeXBlICE9PSAncmVu ZGVyJykgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIC8vIElmIHRoZXJlIHdh cyBhIERPTSB1cGRhdGUgYmVsb3cgdGhpcyBjb21wb25lbnQsIG9yIGl0IGhhcyBqdXN0IGJlZW4K KyAgICAgIC8vIG1vdW50ZWQsIGl0cyByZW5kZXIoKSBpcyBub3QgY29uc2lkZXJlZCB3YXN0ZWQu CisgICAgICB2YXIgdXBkYXRlQ291bnQgPSB0cmVlU25hcHNob3RbaW5zdGFuY2VJRF0udXBkYXRl Q291bnQ7CisKKyAgICAgIGlmIChpc0RlZmluaXRlbHlOb3RXYXN0ZWRCeUlEW2luc3RhbmNlSURd IHx8IHVwZGF0ZUNvdW50ID09PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAg ICAgLy8gV2UgY29uc2lkZXIgdGhpcyByZW5kZXIoKSB3YXN0ZWQuCisgICAgICB1cGRhdGVBZ2dy ZWdhdGVkU3RhdHModHJlZVNuYXBzaG90LCBpbnN0YW5jZUlELCBmdW5jdGlvbiAoc3RhdHMpIHsK KyAgICAgICAgc3RhdHMucmVuZGVyQ291bnQrKzsKKyAgICAgIH0pOworCisgICAgICB2YXIgbmV4 dFBhcmVudElEID0gaW5zdGFuY2VJRDsKKyAgICAgIHdoaWxlIChuZXh0UGFyZW50SUQpIHsKKyAg ICAgICAgLy8gQW55IHBhcmVudHMgcmVuZGVyZWQgZHVyaW5nIHRoaXMgYmF0Y2ggYXJlIGNvbnNp ZGVyZWQgd2FzdGVkCisgICAgICAgIC8vIHVubGVzcyB3ZSBwcmV2aW91c2x5IG1hcmtlZCB0aGVt IGFzIGRpcnR5LgorICAgICAgICB2YXIgaXNXYXN0ZWQgPSByZW5kZXJlZENvbXBvc2l0ZUlEc1tu ZXh0UGFyZW50SURdICYmICFpc0RlZmluaXRlbHlOb3RXYXN0ZWRCeUlEW25leHRQYXJlbnRJRF07 CisgICAgICAgIGlmIChpc1dhc3RlZCkgeworICAgICAgICAgIHVwZGF0ZUFnZ3JlZ2F0ZWRTdGF0 cyh0cmVlU25hcHNob3QsIG5leHRQYXJlbnRJRCwgZnVuY3Rpb24gKHN0YXRzKSB7CisgICAgICAg ICAgICBzdGF0cy5pbmNsdXNpdmVSZW5kZXJEdXJhdGlvbiArPSBkdXJhdGlvbjsKKyAgICAgICAg ICB9KTsKKyAgICAgICAgfQorICAgICAgICBuZXh0UGFyZW50SUQgPSB0cmVlU25hcHNob3RbbmV4 dFBhcmVudElEXS5wYXJlbnRJRDsKKyAgICAgIH0KKyAgICB9KTsKKyAgfSk7CisKKyAgcmV0dXJu IE9iamVjdC5rZXlzKGFnZ3JlZ2F0ZWRTdGF0cykubWFwKGZ1bmN0aW9uIChrZXkpIHsKKyAgICBy ZXR1cm4gX2V4dGVuZHMoe30sIGFnZ3JlZ2F0ZWRTdGF0c1trZXldLCB7CisgICAgICBpbnN0YW5j ZUNvdW50OiBPYmplY3Qua2V5cyhhZmZlY3RlZElEc1trZXldKS5sZW5ndGgKKyAgICB9KTsKKyAg fSkuc29ydChmdW5jdGlvbiAoYSwgYikgeworICAgIHJldHVybiBiLmluY2x1c2l2ZVJlbmRlckR1 cmF0aW9uIC0gYS5pbmNsdXNpdmVSZW5kZXJEdXJhdGlvbjsKKyAgfSk7Cit9CisKK2Z1bmN0aW9u IGdldE9wZXJhdGlvbnMoKSB7CisgIHZhciBmbHVzaEhpc3RvcnkgPSBhcmd1bWVudHMubGVuZ3Ro ID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGdldExh c3RNZWFzdXJlbWVudHMoKTsKKworICBpZiAoISgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlv bicpKSB7CisgICAgd2FybkluUHJvZHVjdGlvbigpOworICAgIHJldHVybiBbXTsKKyAgfQorCisg IHZhciBzdGF0cyA9IFtdOworICBmbHVzaEhpc3RvcnkuZm9yRWFjaChmdW5jdGlvbiAoZmx1c2gs IGZsdXNoSW5kZXgpIHsKKyAgICB2YXIgb3BlcmF0aW9ucyA9IGZsdXNoLm9wZXJhdGlvbnMsCisg ICAgICAgIHRyZWVTbmFwc2hvdCA9IGZsdXNoLnRyZWVTbmFwc2hvdDsKKworICAgIG9wZXJhdGlv bnMuZm9yRWFjaChmdW5jdGlvbiAob3BlcmF0aW9uKSB7CisgICAgICB2YXIgaW5zdGFuY2VJRCA9 IG9wZXJhdGlvbi5pbnN0YW5jZUlELAorICAgICAgICAgIHR5cGUgPSBvcGVyYXRpb24udHlwZSwK KyAgICAgICAgICBwYXlsb2FkID0gb3BlcmF0aW9uLnBheWxvYWQ7CisgICAgICB2YXIgX3RyZWVT bmFwc2hvdCRpbnN0YW5jMyA9IHRyZWVTbmFwc2hvdFtpbnN0YW5jZUlEXSwKKyAgICAgICAgICBk aXNwbGF5TmFtZSA9IF90cmVlU25hcHNob3QkaW5zdGFuYzMuZGlzcGxheU5hbWUsCisgICAgICAg ICAgb3duZXJJRCA9IF90cmVlU25hcHNob3QkaW5zdGFuYzMub3duZXJJRDsKKworICAgICAgdmFy IG93bmVyID0gdHJlZVNuYXBzaG90W293bmVySURdOworICAgICAgdmFyIGtleSA9IChvd25lciA/ IG93bmVyLmRpc3BsYXlOYW1lICsgJyA+ICcgOiAnJykgKyBkaXNwbGF5TmFtZTsKKworICAgICAg c3RhdHMucHVzaCh7CisgICAgICAgIGZsdXNoSW5kZXg6IGZsdXNoSW5kZXgsCisgICAgICAgIGlu c3RhbmNlSUQ6IGluc3RhbmNlSUQsCisgICAgICAgIGtleToga2V5LAorICAgICAgICB0eXBlOiB0 eXBlLAorICAgICAgICBvd25lcklEOiBvd25lcklELAorICAgICAgICBwYXlsb2FkOiBwYXlsb2Fk CisgICAgICB9KTsKKyAgICB9KTsKKyAgfSk7CisgIHJldHVybiBzdGF0czsKK30KKworZnVuY3Rp b24gcHJpbnRFeGNsdXNpdmUoZmx1c2hIaXN0b3J5KSB7CisgIGlmICghKCJkZXZlbG9wbWVudCIg IT09ICdwcm9kdWN0aW9uJykpIHsKKyAgICB3YXJuSW5Qcm9kdWN0aW9uKCk7CisgICAgcmV0dXJu OworICB9CisKKyAgdmFyIHN0YXRzID0gZ2V0RXhjbHVzaXZlKGZsdXNoSGlzdG9yeSk7CisgIHZh ciB0YWJsZSA9IHN0YXRzLm1hcChmdW5jdGlvbiAoaXRlbSkgeworICAgIHZhciBrZXkgPSBpdGVt LmtleSwKKyAgICAgICAgaW5zdGFuY2VDb3VudCA9IGl0ZW0uaW5zdGFuY2VDb3VudCwKKyAgICAg ICAgdG90YWxEdXJhdGlvbiA9IGl0ZW0udG90YWxEdXJhdGlvbjsKKworICAgIHZhciByZW5kZXJD b3VudCA9IGl0ZW0uY291bnRzLnJlbmRlciB8fCAwOworICAgIHZhciByZW5kZXJEdXJhdGlvbiA9 IGl0ZW0uZHVyYXRpb25zLnJlbmRlciB8fCAwOworICAgIHJldHVybiB7CisgICAgICAnQ29tcG9u ZW50Jzoga2V5LAorICAgICAgJ1RvdGFsIHRpbWUgKG1zKSc6IHJvdW5kRmxvYXQodG90YWxEdXJh dGlvbiksCisgICAgICAnSW5zdGFuY2UgY291bnQnOiBpbnN0YW5jZUNvdW50LAorICAgICAgJ1Rv dGFsIHJlbmRlciB0aW1lIChtcyknOiByb3VuZEZsb2F0KHJlbmRlckR1cmF0aW9uKSwKKyAgICAg ICdBdmVyYWdlIHJlbmRlciB0aW1lIChtcyknOiByZW5kZXJDb3VudCA/IHJvdW5kRmxvYXQocmVu ZGVyRHVyYXRpb24gLyByZW5kZXJDb3VudCkgOiB1bmRlZmluZWQsCisgICAgICAnUmVuZGVyIGNv dW50JzogcmVuZGVyQ291bnQsCisgICAgICAnVG90YWwgbGlmZWN5Y2xlIHRpbWUgKG1zKSc6IHJv dW5kRmxvYXQodG90YWxEdXJhdGlvbiAtIHJlbmRlckR1cmF0aW9uKQorICAgIH07CisgIH0pOwor ICBjb25zb2xlVGFibGUodGFibGUpOworfQorCitmdW5jdGlvbiBwcmludEluY2x1c2l2ZShmbHVz aEhpc3RvcnkpIHsKKyAgaWYgKCEoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSkgewor ICAgIHdhcm5JblByb2R1Y3Rpb24oKTsKKyAgICByZXR1cm47CisgIH0KKworICB2YXIgc3RhdHMg PSBnZXRJbmNsdXNpdmUoZmx1c2hIaXN0b3J5KTsKKyAgdmFyIHRhYmxlID0gc3RhdHMubWFwKGZ1 bmN0aW9uIChpdGVtKSB7CisgICAgdmFyIGtleSA9IGl0ZW0ua2V5LAorICAgICAgICBpbnN0YW5j ZUNvdW50ID0gaXRlbS5pbnN0YW5jZUNvdW50LAorICAgICAgICBpbmNsdXNpdmVSZW5kZXJEdXJh dGlvbiA9IGl0ZW0uaW5jbHVzaXZlUmVuZGVyRHVyYXRpb24sCisgICAgICAgIHJlbmRlckNvdW50 ID0gaXRlbS5yZW5kZXJDb3VudDsKKworICAgIHJldHVybiB7CisgICAgICAnT3duZXIgPiBDb21w b25lbnQnOiBrZXksCisgICAgICAnSW5jbHVzaXZlIHJlbmRlciB0aW1lIChtcyknOiByb3VuZEZs b2F0KGluY2x1c2l2ZVJlbmRlckR1cmF0aW9uKSwKKyAgICAgICdJbnN0YW5jZSBjb3VudCc6IGlu c3RhbmNlQ291bnQsCisgICAgICAnUmVuZGVyIGNvdW50JzogcmVuZGVyQ291bnQKKyAgICB9Owor ICB9KTsKKyAgY29uc29sZVRhYmxlKHRhYmxlKTsKK30KKworZnVuY3Rpb24gcHJpbnRXYXN0ZWQo Zmx1c2hIaXN0b3J5KSB7CisgIGlmICghKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykp IHsKKyAgICB3YXJuSW5Qcm9kdWN0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgdmFyIHN0 YXRzID0gZ2V0V2FzdGVkKGZsdXNoSGlzdG9yeSk7CisgIHZhciB0YWJsZSA9IHN0YXRzLm1hcChm dW5jdGlvbiAoaXRlbSkgeworICAgIHZhciBrZXkgPSBpdGVtLmtleSwKKyAgICAgICAgaW5zdGFu Y2VDb3VudCA9IGl0ZW0uaW5zdGFuY2VDb3VudCwKKyAgICAgICAgaW5jbHVzaXZlUmVuZGVyRHVy YXRpb24gPSBpdGVtLmluY2x1c2l2ZVJlbmRlckR1cmF0aW9uLAorICAgICAgICByZW5kZXJDb3Vu dCA9IGl0ZW0ucmVuZGVyQ291bnQ7CisKKyAgICByZXR1cm4geworICAgICAgJ093bmVyID4gQ29t cG9uZW50Jzoga2V5LAorICAgICAgJ0luY2x1c2l2ZSB3YXN0ZWQgdGltZSAobXMpJzogcm91bmRG bG9hdChpbmNsdXNpdmVSZW5kZXJEdXJhdGlvbiksCisgICAgICAnSW5zdGFuY2UgY291bnQnOiBp bnN0YW5jZUNvdW50LAorICAgICAgJ1JlbmRlciBjb3VudCc6IHJlbmRlckNvdW50CisgICAgfTsK KyAgfSk7CisgIGNvbnNvbGVUYWJsZSh0YWJsZSk7Cit9CisKK2Z1bmN0aW9uIHByaW50T3BlcmF0 aW9ucyhmbHVzaEhpc3RvcnkpIHsKKyAgaWYgKCEoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rp b24nKSkgeworICAgIHdhcm5JblByb2R1Y3Rpb24oKTsKKyAgICByZXR1cm47CisgIH0KKworICB2 YXIgc3RhdHMgPSBnZXRPcGVyYXRpb25zKGZsdXNoSGlzdG9yeSk7CisgIHZhciB0YWJsZSA9IHN0 YXRzLm1hcChmdW5jdGlvbiAoc3RhdCkgeworICAgIHJldHVybiB7CisgICAgICAnT3duZXIgPiBO b2RlJzogc3RhdC5rZXksCisgICAgICAnT3BlcmF0aW9uJzogc3RhdC50eXBlLAorICAgICAgJ1Bh eWxvYWQnOiB0eXBlb2Ygc3RhdC5wYXlsb2FkID09PSAnb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5 KHN0YXQucGF5bG9hZCkgOiBzdGF0LnBheWxvYWQsCisgICAgICAnRmx1c2ggaW5kZXgnOiBzdGF0 LmZsdXNoSW5kZXgsCisgICAgICAnT3duZXIgQ29tcG9uZW50IElEJzogc3RhdC5vd25lcklELAor ICAgICAgJ0RPTSBDb21wb25lbnQgSUQnOiBzdGF0Lmluc3RhbmNlSUQKKyAgICB9OworICB9KTsK KyAgY29uc29sZVRhYmxlKHRhYmxlKTsKK30KKwordmFyIHdhcm5lZEFib3V0UHJpbnRET00gPSBm YWxzZTsKK2Z1bmN0aW9uIHByaW50RE9NKG1lYXN1cmVtZW50cykgeworICAiZGV2ZWxvcG1lbnQi ICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHdhcm5lZEFib3V0UHJpbnRET00sICdgUmVhY3RQ ZXJmLnByaW50RE9NKC4uLilgIGlzIGRlcHJlY2F0ZWQuIFVzZSAnICsgJ2BSZWFjdFBlcmYucHJp bnRPcGVyYXRpb25zKC4uLilgIGluc3RlYWQuJykgOiB2b2lkIDA7CisgIHdhcm5lZEFib3V0UHJp bnRET00gPSB0cnVlOworICByZXR1cm4gcHJpbnRPcGVyYXRpb25zKG1lYXN1cmVtZW50cyk7Cit9 CisKK3ZhciB3YXJuZWRBYm91dEdldE1lYXN1cmVtZW50c1N1bW1hcnlNYXAgPSBmYWxzZTsKK2Z1 bmN0aW9uIGdldE1lYXN1cmVtZW50c1N1bW1hcnlNYXAobWVhc3VyZW1lbnRzKSB7CisgICJkZXZl bG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcod2FybmVkQWJvdXRHZXRNZWFzdXJl bWVudHNTdW1tYXJ5TWFwLCAnYFJlYWN0UGVyZi5nZXRNZWFzdXJlbWVudHNTdW1tYXJ5TWFwKC4u LilgIGlzIGRlcHJlY2F0ZWQuIFVzZSAnICsgJ2BSZWFjdFBlcmYuZ2V0V2FzdGVkKC4uLilgIGlu c3RlYWQuJykgOiB2b2lkIDA7CisgIHdhcm5lZEFib3V0R2V0TWVhc3VyZW1lbnRzU3VtbWFyeU1h cCA9IHRydWU7CisgIHJldHVybiBnZXRXYXN0ZWQobWVhc3VyZW1lbnRzKTsKK30KKworZnVuY3Rp b24gc3RhcnQoKSB7CisgIGlmICghKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykpIHsK KyAgICB3YXJuSW5Qcm9kdWN0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgUmVhY3REZWJ1 Z1Rvb2wuYmVnaW5Qcm9maWxpbmcoKTsKK30KKworZnVuY3Rpb24gc3RvcCgpIHsKKyAgaWYgKCEo ImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSkgeworICAgIHdhcm5JblByb2R1Y3Rpb24o KTsKKyAgICByZXR1cm47CisgIH0KKworICBSZWFjdERlYnVnVG9vbC5lbmRQcm9maWxpbmcoKTsK K30KKworZnVuY3Rpb24gaXNSdW5uaW5nKCkgeworICBpZiAoISgiZGV2ZWxvcG1lbnQiICE9PSAn cHJvZHVjdGlvbicpKSB7CisgICAgd2FybkluUHJvZHVjdGlvbigpOworICAgIHJldHVybiBmYWxz ZTsKKyAgfQorCisgIHJldHVybiBSZWFjdERlYnVnVG9vbC5pc1Byb2ZpbGluZygpOworfQorCit2 YXIgUmVhY3RQZXJmQW5hbHlzaXMgPSB7CisgIGdldExhc3RNZWFzdXJlbWVudHM6IGdldExhc3RN ZWFzdXJlbWVudHMsCisgIGdldEV4Y2x1c2l2ZTogZ2V0RXhjbHVzaXZlLAorICBnZXRJbmNsdXNp dmU6IGdldEluY2x1c2l2ZSwKKyAgZ2V0V2FzdGVkOiBnZXRXYXN0ZWQsCisgIGdldE9wZXJhdGlv bnM6IGdldE9wZXJhdGlvbnMsCisgIHByaW50RXhjbHVzaXZlOiBwcmludEV4Y2x1c2l2ZSwKKyAg cHJpbnRJbmNsdXNpdmU6IHByaW50SW5jbHVzaXZlLAorICBwcmludFdhc3RlZDogcHJpbnRXYXN0 ZWQsCisgIHByaW50T3BlcmF0aW9uczogcHJpbnRPcGVyYXRpb25zLAorICBzdGFydDogc3RhcnQs CisgIHN0b3A6IHN0b3AsCisgIGlzUnVubmluZzogaXNSdW5uaW5nLAorICAvLyBEZXByZWNhdGVk OgorICBwcmludERPTTogcHJpbnRET00sCisgIGdldE1lYXN1cmVtZW50c1N1bW1hcnlNYXA6IGdl dE1lYXN1cmVtZW50c1N1bW1hcnlNYXAKK307CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RQZXJm QW5hbHlzaXM7Cit9LHsiMTU3IjoxNTcsIjE1OCI6MTU4LCI1MCI6NTB9XSw3MjpbZnVuY3Rpb24o X2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQs IEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291 cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGlu IHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJj ZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBm b3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiAK KyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcyA9 IHt9OworCitpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgIFJlYWN0UHJv cFR5cGVMb2NhdGlvbk5hbWVzID0geworICAgIHByb3A6ICdwcm9wJywKKyAgICBjb250ZXh0OiAn Y29udGV4dCcsCisgICAgY2hpbGRDb250ZXh0OiAnY2hpbGQgY29udGV4dCcKKyAgfTsKK30KKwor bW9kdWxlLmV4cG9ydHMgPSBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lczsKK30se31dLDczOltm dW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMt cHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog VGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2Ug Zm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRo aXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMg Y2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5Lgor ICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0 ID0gJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJzsKKworbW9k dWxlLmV4cG9ydHMgPSBSZWFjdFByb3BUeXBlc1NlY3JldDsKK30se31dLDc0OltmdW5jdGlvbihf ZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwg RmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3Vy Y2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4g dGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNl IHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZv dW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLwor CisndXNlIHN0cmljdCc7CisKK3ZhciBfYXNzaWduID0gX2RlcmVxXygxNTgpOworCit2YXIgQ2Fs bGJhY2tRdWV1ZSA9IF9kZXJlcV8oNik7Cit2YXIgUG9vbGVkQ2xhc3MgPSBfZGVyZXFfKDI1KTsK K3ZhciBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIgPSBfZGVyZXFfKDI2KTsKK3ZhciBSZWFjdElu cHV0U2VsZWN0aW9uID0gX2RlcmVxXyg2Mik7Cit2YXIgUmVhY3RJbnN0cnVtZW50YXRpb24gPSBf ZGVyZXFfKDY0KTsKK3ZhciBUcmFuc2FjdGlvbiA9IF9kZXJlcV8oMTAwKTsKK3ZhciBSZWFjdFVw ZGF0ZVF1ZXVlID0gX2RlcmVxXyg4MSk7CisKKy8qKgorICogRW5zdXJlcyB0aGF0LCB3aGVuIHBv c3NpYmxlLCB0aGUgc2VsZWN0aW9uIHJhbmdlIChjdXJyZW50bHkgc2VsZWN0ZWQgdGV4dAorICog aW5wdXQpIGlzIG5vdCBkaXN0dXJiZWQgYnkgcGVyZm9ybWluZyB0aGUgdHJhbnNhY3Rpb24uCisg Ki8KK3ZhciBTRUxFQ1RJT05fUkVTVE9SQVRJT04gPSB7CisgIC8qKgorICAgKiBAcmV0dXJuIHtT ZWxlY3Rpb259IFNlbGVjdGlvbiBpbmZvcm1hdGlvbi4KKyAgICovCisgIGluaXRpYWxpemU6IFJl YWN0SW5wdXRTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb24sCisgIC8qKgorICAgKiBA cGFyYW0ge1NlbGVjdGlvbn0gc2VsIFNlbGVjdGlvbiBpbmZvcm1hdGlvbiByZXR1cm5lZCBmcm9t IGBpbml0aWFsaXplYC4KKyAgICovCisgIGNsb3NlOiBSZWFjdElucHV0U2VsZWN0aW9uLnJlc3Rv cmVTZWxlY3Rpb24KK307CisKKy8qKgorICogU3VwcHJlc3NlcyBldmVudHMgKGJsdXIvZm9jdXMp IHRoYXQgY291bGQgYmUgaW5hZHZlcnRlbnRseSBkaXNwYXRjaGVkIGR1ZSB0bworICogaGlnaCBs ZXZlbCBET00gbWFuaXB1bGF0aW9ucyAobGlrZSB0ZW1wb3JhcmlseSByZW1vdmluZyBhIHRleHQg aW5wdXQgZnJvbSB0aGUKKyAqIERPTSkuCisgKi8KK3ZhciBFVkVOVF9TVVBQUkVTU0lPTiA9IHsK KyAgLyoqCisgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRoZSBlbmFibGVkIHN0YXR1cyBvZiBgUmVh Y3RCcm93c2VyRXZlbnRFbWl0dGVyYCBiZWZvcmUKKyAgICogdGhlIHJlY29uY2lsaWF0aW9uLgor ICAgKi8KKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKCkgeworICAgIHZhciBjdXJyZW50bHlFbmFi bGVkID0gUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLmlzRW5hYmxlZCgpOworICAgIFJlYWN0QnJv d3NlckV2ZW50RW1pdHRlci5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICByZXR1cm4gY3VycmVudGx5 RW5hYmxlZDsKKyAgfSwKKworICAvKioKKyAgICogQHBhcmFtIHtib29sZWFufSBwcmV2aW91c2x5 RW5hYmxlZCBFbmFibGVkIHN0YXR1cyBvZgorICAgKiAgIGBSZWFjdEJyb3dzZXJFdmVudEVtaXR0 ZXJgIGJlZm9yZSB0aGUgcmVjb25jaWxpYXRpb24gb2NjdXJyZWQuIGBjbG9zZWAKKyAgICogICBy ZXN0b3JlcyB0aGUgcHJldmlvdXMgdmFsdWUuCisgICAqLworICBjbG9zZTogZnVuY3Rpb24gKHBy ZXZpb3VzbHlFbmFibGVkKSB7CisgICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLnNldEVuYWJs ZWQocHJldmlvdXNseUVuYWJsZWQpOworICB9Cit9OworCisvKioKKyAqIFByb3ZpZGVzIGEgcXVl dWUgZm9yIGNvbGxlY3RpbmcgYGNvbXBvbmVudERpZE1vdW50YCBhbmQKKyAqIGBjb21wb25lbnRE aWRVcGRhdGVgIGNhbGxiYWNrcyBkdXJpbmcgdGhlIHRyYW5zYWN0aW9uLgorICovCit2YXIgT05f RE9NX1JFQURZX1FVRVVFSU5HID0geworICAvKioKKyAgICogSW5pdGlhbGl6ZXMgdGhlIGludGVy bmFsIGBvbkRPTVJlYWR5YCBxdWV1ZS4KKyAgICovCisgIGluaXRpYWxpemU6IGZ1bmN0aW9uICgp IHsKKyAgICB0aGlzLnJlYWN0TW91bnRSZWFkeS5yZXNldCgpOworICB9LAorCisgIC8qKgorICAg KiBBZnRlciBET00gaXMgZmx1c2hlZCwgaW52b2tlIGFsbCByZWdpc3RlcmVkIGBvbkRPTVJlYWR5 YCBjYWxsYmFja3MuCisgICAqLworICBjbG9zZTogZnVuY3Rpb24gKCkgeworICAgIHRoaXMucmVh Y3RNb3VudFJlYWR5Lm5vdGlmeUFsbCgpOworICB9Cit9OworCisvKioKKyAqIEV4ZWN1dGVkIHdp dGhpbiB0aGUgc2NvcGUgb2YgdGhlIGBUcmFuc2FjdGlvbmAgaW5zdGFuY2UuIENvbnNpZGVyIHRo ZXNlIGFzCisgKiBiZWluZyBtZW1iZXIgbWV0aG9kcywgYnV0IHdpdGggYW4gaW1wbGllZCBvcmRl cmluZyB3aGlsZSBiZWluZyBpc29sYXRlZCBmcm9tCisgKiBlYWNoIG90aGVyLgorICovCit2YXIg VFJBTlNBQ1RJT05fV1JBUFBFUlMgPSBbU0VMRUNUSU9OX1JFU1RPUkFUSU9OLCBFVkVOVF9TVVBQ UkVTU0lPTiwgT05fRE9NX1JFQURZX1FVRVVFSU5HXTsKKworaWYgKCJkZXZlbG9wbWVudCIgIT09 ICdwcm9kdWN0aW9uJykgeworICBUUkFOU0FDVElPTl9XUkFQUEVSUy5wdXNoKHsKKyAgICBpbml0 aWFsaXplOiBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWdpbkZsdXNoLAorICAg IGNsb3NlOiBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25FbmRGbHVzaAorICB9KTsK K30KKworLyoqCisgKiBDdXJyZW50bHk6CisgKiAtIFRoZSBvcmRlciB0aGF0IHRoZXNlIGFyZSBs aXN0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uIGlzIGNyaXRpY2FsOgorICogLSBTdXBwcmVzc2VzIGV2 ZW50cy4KKyAqIC0gUmVzdG9yZXMgc2VsZWN0aW9uIHJhbmdlLgorICoKKyAqIEZ1dHVyZToKKyAq IC0gUmVzdG9yZSBkb2N1bWVudC9vdmVyZmxvdyBzY3JvbGwgcG9zaXRpb25zIHRoYXQgd2VyZSB1 bmludGVudGlvbmFsbHkKKyAqICAgbW9kaWZpZWQgdmlhIERPTSBpbnNlcnRpb25zIGFib3ZlIHRo ZSB0b3Agdmlld3BvcnQgYm91bmRhcnkuCisgKiAtIEltcGxlbWVudC9pbnRlZ3JhdGUgd2l0aCBj dXN0b21pemVkIGNvbnN0cmFpbnQgYmFzZWQgbGF5b3V0IHN5c3RlbSBhbmQga2VlcAorICogICB0 cmFjayBvZiB3aGljaCBkaW1lbnNpb25zIG11c3QgYmUgcmVtZWFzdXJlZC4KKyAqCisgKiBAY2xh c3MgUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbgorICovCitmdW5jdGlvbiBSZWFjdFJlY29uY2ls ZVRyYW5zYWN0aW9uKHVzZUNyZWF0ZUVsZW1lbnQpIHsKKyAgdGhpcy5yZWluaXRpYWxpemVUcmFu c2FjdGlvbigpOworICAvLyBPbmx5IHNlcnZlci1zaWRlIHJlbmRlcmluZyByZWFsbHkgbmVlZHMg dGhpcyBvcHRpb24gKHNlZQorICAvLyBgUmVhY3RTZXJ2ZXJSZW5kZXJpbmdgKSwgYnV0IHNlcnZl ci1zaWRlIHVzZXMKKyAgLy8gYFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb25gIGluc3Rl YWQuIFRoaXMgb3B0aW9uIGlzIGhlcmUgc28gdGhhdCBpdCdzCisgIC8vIGFjY2Vzc2libGUgYW5k IGRlZmF1bHRzIHRvIGZhbHNlIHdoZW4gYFJlYWN0RE9NQ29tcG9uZW50YCBhbmQKKyAgLy8gYFJl YWN0RE9NVGV4dENvbXBvbmVudGAgY2hlY2tzIGl0IGluIGBtb3VudENvbXBvbmVudGAuYAorICB0 aGlzLnJlbmRlclRvU3RhdGljTWFya3VwID0gZmFsc2U7CisgIHRoaXMucmVhY3RNb3VudFJlYWR5 ID0gQ2FsbGJhY2tRdWV1ZS5nZXRQb29sZWQobnVsbCk7CisgIHRoaXMudXNlQ3JlYXRlRWxlbWVu dCA9IHVzZUNyZWF0ZUVsZW1lbnQ7Cit9CisKK3ZhciBNaXhpbiA9IHsKKyAgLyoqCisgICAqIEBz ZWUgVHJhbnNhY3Rpb24KKyAgICogQGFic3RyYWN0CisgICAqIEBmaW5hbAorICAgKiBAcmV0dXJu IHthcnJheTxvYmplY3Q+fSBMaXN0IG9mIG9wZXJhdGlvbiB3cmFwIHByb2NlZHVyZXMuCisgICAq ICAgVE9ETzogY29udmVydCB0byBhcnJheTxUcmFuc2FjdGlvbldyYXBwZXI+CisgICAqLworICBn ZXRUcmFuc2FjdGlvbldyYXBwZXJzOiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIFRSQU5TQUNU SU9OX1dSQVBQRVJTOworICB9LAorCisgIC8qKgorICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoZSBx dWV1ZSB0byBjb2xsZWN0IGBvbkRPTVJlYWR5YCBjYWxsYmFja3Mgd2l0aC4KKyAgICovCisgIGdl dFJlYWN0TW91bnRSZWFkeTogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiB0aGlzLnJlYWN0TW91 bnRSZWFkeTsKKyAgfSwKKworICAvKioKKyAgICogQHJldHVybiB7b2JqZWN0fSBUaGUgcXVldWUg dG8gY29sbGVjdCBSZWFjdCBhc3luYyBldmVudHMuCisgICAqLworICBnZXRVcGRhdGVRdWV1ZTog ZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBSZWFjdFVwZGF0ZVF1ZXVlOworICB9LAorCisgIC8q KgorICAgKiBTYXZlIGN1cnJlbnQgdHJhbnNhY3Rpb24gc3RhdGUgLS0gaWYgdGhlIHJldHVybiB2 YWx1ZSBmcm9tIHRoaXMgbWV0aG9kIGlzCisgICAqIHBhc3NlZCB0byBgcm9sbGJhY2tgLCB0aGUg dHJhbnNhY3Rpb24gd2lsbCBiZSByZXNldCB0byB0aGF0IHN0YXRlLgorICAgKi8KKyAgY2hlY2tw b2ludDogZnVuY3Rpb24gKCkgeworICAgIC8vIHJlYWN0TW91bnRSZWFkeSBpcyB0aGUgb3VyIG9u bHkgc3RhdGVmdWwgd3JhcHBlcgorICAgIHJldHVybiB0aGlzLnJlYWN0TW91bnRSZWFkeS5jaGVj a3BvaW50KCk7CisgIH0sCisKKyAgcm9sbGJhY2s6IGZ1bmN0aW9uIChjaGVja3BvaW50KSB7Cisg ICAgdGhpcy5yZWFjdE1vdW50UmVhZHkucm9sbGJhY2soY2hlY2twb2ludCk7CisgIH0sCisKKyAg LyoqCisgICAqIGBQb29sZWRDbGFzc2AgbG9va3MgZm9yIHRoaXMsIGFuZCB3aWxsIGludm9rZSB0 aGlzIGJlZm9yZSBhbGxvd2luZyB0aGlzCisgICAqIGluc3RhbmNlIHRvIGJlIHJldXNlZC4KKyAg ICovCisgIGRlc3RydWN0b3I6IGZ1bmN0aW9uICgpIHsKKyAgICBDYWxsYmFja1F1ZXVlLnJlbGVh c2UodGhpcy5yZWFjdE1vdW50UmVhZHkpOworICAgIHRoaXMucmVhY3RNb3VudFJlYWR5ID0gbnVs bDsKKyAgfQorfTsKKworX2Fzc2lnbihSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uLnByb3RvdHlw ZSwgVHJhbnNhY3Rpb24sIE1peGluKTsKKworUG9vbGVkQ2xhc3MuYWRkUG9vbGluZ1RvKFJlYWN0 UmVjb25jaWxlVHJhbnNhY3Rpb24pOworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0UmVjb25jaWxl VHJhbnNhY3Rpb247Cit9LHsiMTAwIjoxMDAsIjE1OCI6MTU4LCIyNSI6MjUsIjI2IjoyNiwiNiI6 NiwiNjIiOjYyLCI2NCI6NjQsIjgxIjo4MX1dLDc1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxl eHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4K KyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNl bnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNF IGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0 aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRF TlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7 CisKK3ZhciBSZWFjdFJlZiA9IF9kZXJlcV8oNzYpOwordmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9u ID0gX2RlcmVxXyg2NCk7CisKK3ZhciB3YXJuaW5nID0gX2RlcmVxXygxNTcpOworCisvKioKKyAq IEhlbHBlciB0byBjYWxsIFJlYWN0UmVmLmF0dGFjaFJlZnMgd2l0aCB0aGlzIGNvbXBvc2l0ZSBj b21wb25lbnQsIHNwbGl0IG91dAorICogdG8gYXZvaWQgYWxsb2NhdGlvbnMgaW4gdGhlIHRyYW5z YWN0aW9uIG1vdW50LXJlYWR5IHF1ZXVlLgorICovCitmdW5jdGlvbiBhdHRhY2hSZWZzKCkgewor ICBSZWFjdFJlZi5hdHRhY2hSZWZzKHRoaXMsIHRoaXMuX2N1cnJlbnRFbGVtZW50KTsKK30KKwor dmFyIFJlYWN0UmVjb25jaWxlciA9IHsKKworICAvKioKKyAgICogSW5pdGlhbGl6ZXMgdGhlIGNv bXBvbmVudCwgcmVuZGVycyBtYXJrdXAsIGFuZCByZWdpc3RlcnMgZXZlbnQgbGlzdGVuZXJzLgor ICAgKgorICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBpbnRlcm5hbEluc3RhbmNlCisgICAq IEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbnxSZWFjdFNlcnZlclJlbmRlcmluZ1Ry YW5zYWN0aW9ufSB0cmFuc2FjdGlvbgorICAgKiBAcGFyYW0gez9vYmplY3R9IHRoZSBjb250YWlu aW5nIGhvc3QgY29tcG9uZW50IGluc3RhbmNlCisgICAqIEBwYXJhbSB7P29iamVjdH0gaW5mbyBh Ym91dCB0aGUgaG9zdCBjb250YWluZXIKKyAgICogQHJldHVybiB7P3N0cmluZ30gUmVuZGVyZWQg bWFya3VwIHRvIGJlIGluc2VydGVkIGludG8gdGhlIERPTS4KKyAgICogQGZpbmFsCisgICAqIEBp bnRlcm5hbAorICAgKi8KKyAgbW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChpbnRlcm5hbEluc3Rh bmNlLCB0cmFuc2FjdGlvbiwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIGNvbnRleHQs IHBhcmVudERlYnVnSUQgLy8gMCBpbiBwcm9kdWN0aW9uIGFuZCBmb3Igcm9vdHMKKyAgKSB7Cisg ICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgaWYgKGludGVy bmFsSW5zdGFuY2UuX2RlYnVnSUQgIT09IDApIHsKKyAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRp b24uZGVidWdUb29sLm9uQmVmb3JlTW91bnRDb21wb25lbnQoaW50ZXJuYWxJbnN0YW5jZS5fZGVi dWdJRCwgaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQsIHBhcmVudERlYnVnSUQpOwor ICAgICAgfQorICAgIH0KKyAgICB2YXIgbWFya3VwID0gaW50ZXJuYWxJbnN0YW5jZS5tb3VudENv bXBvbmVudCh0cmFuc2FjdGlvbiwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIGNvbnRl eHQsIHBhcmVudERlYnVnSUQpOworICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9jdXJyZW50RWxl bWVudCAmJiBpbnRlcm5hbEluc3RhbmNlLl9jdXJyZW50RWxlbWVudC5yZWYgIT0gbnVsbCkgewor ICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShhdHRhY2hSZWZz LCBpbnRlcm5hbEluc3RhbmNlKTsKKyAgICB9CisgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdw cm9kdWN0aW9uJykgeworICAgICAgaWYgKGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQgIT09IDAp IHsKKyAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uTW91bnRDb21wb25l bnQoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVy biBtYXJrdXA7CisgIH0sCisKKyAgLyoqCisgICAqIFJldHVybnMgYSB2YWx1ZSB0aGF0IGNhbiBi ZSBwYXNzZWQgdG8KKyAgICogUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudC5yZXBsYWNlTm9kZVdp dGhNYXJrdXAuCisgICAqLworICBnZXRIb3N0Tm9kZTogZnVuY3Rpb24gKGludGVybmFsSW5zdGFu Y2UpIHsKKyAgICByZXR1cm4gaW50ZXJuYWxJbnN0YW5jZS5nZXRIb3N0Tm9kZSgpOworICB9LAor CisgIC8qKgorICAgKiBSZWxlYXNlcyBhbnkgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSBgbW91bnRD b21wb25lbnRgLgorICAgKgorICAgKiBAZmluYWwKKyAgICogQGludGVybmFsCisgICAqLworICB1 bm1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoaW50ZXJuYWxJbnN0YW5jZSwgc2FmZWx5KSB7Cisg ICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgaWYgKGludGVy bmFsSW5zdGFuY2UuX2RlYnVnSUQgIT09IDApIHsKKyAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRp b24uZGVidWdUb29sLm9uQmVmb3JlVW5tb3VudENvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9k ZWJ1Z0lEKTsKKyAgICAgIH0KKyAgICB9CisgICAgUmVhY3RSZWYuZGV0YWNoUmVmcyhpbnRlcm5h bEluc3RhbmNlLCBpbnRlcm5hbEluc3RhbmNlLl9jdXJyZW50RWxlbWVudCk7CisgICAgaW50ZXJu YWxJbnN0YW5jZS51bm1vdW50Q29tcG9uZW50KHNhZmVseSk7CisgICAgaWYgKCJkZXZlbG9wbWVu dCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgaWYgKGludGVybmFsSW5zdGFuY2UuX2RlYnVn SUQgIT09IDApIHsKKyAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uVW5t b3VudENvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEKTsKKyAgICAgIH0KKyAgICB9 CisgIH0sCisKKyAgLyoqCisgICAqIFVwZGF0ZSBhIGNvbXBvbmVudCB1c2luZyBhIG5ldyBlbGVt ZW50LgorICAgKgorICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBpbnRlcm5hbEluc3RhbmNl CisgICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBuZXh0RWxlbWVudAorICAgKiBAcGFyYW0ge1Jl YWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uCisgICAqIEBwYXJhbSB7b2JqZWN0 fSBjb250ZXh0CisgICAqIEBpbnRlcm5hbAorICAgKi8KKyAgcmVjZWl2ZUNvbXBvbmVudDogZnVu Y3Rpb24gKGludGVybmFsSW5zdGFuY2UsIG5leHRFbGVtZW50LCB0cmFuc2FjdGlvbiwgY29udGV4 dCkgeworICAgIHZhciBwcmV2RWxlbWVudCA9IGludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVt ZW50OworCisgICAgaWYgKG5leHRFbGVtZW50ID09PSBwcmV2RWxlbWVudCAmJiBjb250ZXh0ID09 PSBpbnRlcm5hbEluc3RhbmNlLl9jb250ZXh0KSB7CisgICAgICAvLyBTaW5jZSBlbGVtZW50cyBh cmUgaW1tdXRhYmxlIGFmdGVyIHRoZSBvd25lciBpcyByZW5kZXJlZCwKKyAgICAgIC8vIHdlIGNh biBkbyBhIGNoZWFwIGlkZW50aXR5IGNvbXBhcmUgaGVyZSB0byBkZXRlcm1pbmUgaWYgdGhpcyBp cyBhCisgICAgICAvLyBzdXBlcmZsdW91cyByZWNvbmNpbGUuIEl0J3MgcG9zc2libGUgZm9yIHN0 YXRlIHRvIGJlIG11dGFibGUgYnV0IHN1Y2gKKyAgICAgIC8vIGNoYW5nZSBzaG91bGQgdHJpZ2dl ciBhbiB1cGRhdGUgb2YgdGhlIG93bmVyIHdoaWNoIHdvdWxkIHJlY3JlYXRlCisgICAgICAvLyB0 aGUgZWxlbWVudC4gV2UgZXhwbGljaXRseSBjaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhbiBv d25lciBzaW5jZQorICAgICAgLy8gaXQncyBwb3NzaWJsZSBmb3IgYW4gZWxlbWVudCBjcmVhdGVk IG91dHNpZGUgYSBjb21wb3NpdGUgdG8gYmUKKyAgICAgIC8vIGRlZXBseSBtdXRhdGVkIGFuZCBy ZXVzZWQuCisKKyAgICAgIC8vIFRPRE86IEJhaWxpbmcgb3V0IGVhcmx5IGlzIGp1c3QgYSBwZXJm IG9wdGltaXphdGlvbiByaWdodD8KKyAgICAgIC8vIFRPRE86IFJlbW92aW5nIHRoZSByZXR1cm4g c3RhdGVtZW50IHNob3VsZCBhZmZlY3QgY29ycmVjdG5lc3M/CisgICAgICByZXR1cm47CisgICAg fQorCisgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgaWYg KGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQgIT09IDApIHsKKyAgICAgICAgUmVhY3RJbnN0cnVt ZW50YXRpb24uZGVidWdUb29sLm9uQmVmb3JlVXBkYXRlQ29tcG9uZW50KGludGVybmFsSW5zdGFu Y2UuX2RlYnVnSUQsIG5leHRFbGVtZW50KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgcmVm c0NoYW5nZWQgPSBSZWFjdFJlZi5zaG91bGRVcGRhdGVSZWZzKHByZXZFbGVtZW50LCBuZXh0RWxl bWVudCk7CisKKyAgICBpZiAocmVmc0NoYW5nZWQpIHsKKyAgICAgIFJlYWN0UmVmLmRldGFjaFJl ZnMoaW50ZXJuYWxJbnN0YW5jZSwgcHJldkVsZW1lbnQpOworICAgIH0KKworICAgIGludGVybmFs SW5zdGFuY2UucmVjZWl2ZUNvbXBvbmVudChuZXh0RWxlbWVudCwgdHJhbnNhY3Rpb24sIGNvbnRl eHQpOworCisgICAgaWYgKHJlZnNDaGFuZ2VkICYmIGludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRF bGVtZW50ICYmIGludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50LnJlZiAhPSBudWxsKSB7 CisgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGF0dGFjaFJl ZnMsIGludGVybmFsSW5zdGFuY2UpOworICAgIH0KKworICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9 PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEICE9 PSAwKSB7CisgICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblVwZGF0ZUNv bXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEKTsKKyAgICAgIH0KKyAgICB9CisgIH0s CisKKyAgLyoqCisgICAqIEZsdXNoIGFueSBkaXJ0eSBjaGFuZ2VzIGluIGEgY29tcG9uZW50Lgor ICAgKgorICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBpbnRlcm5hbEluc3RhbmNlCisgICAq IEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24KKyAgICogQGlu dGVybmFsCisgICAqLworICBwZXJmb3JtVXBkYXRlSWZOZWNlc3Nhcnk6IGZ1bmN0aW9uIChpbnRl cm5hbEluc3RhbmNlLCB0cmFuc2FjdGlvbiwgdXBkYXRlQmF0Y2hOdW1iZXIpIHsKKyAgICBpZiAo aW50ZXJuYWxJbnN0YW5jZS5fdXBkYXRlQmF0Y2hOdW1iZXIgIT09IHVwZGF0ZUJhdGNoTnVtYmVy KSB7CisgICAgICAvLyBUaGUgY29tcG9uZW50J3MgZW5xdWV1ZWQgYmF0Y2ggbnVtYmVyIHNob3Vs ZCBhbHdheXMgYmUgdGhlIGN1cnJlbnQKKyAgICAgIC8vIGJhdGNoIG9yIHRoZSBmb2xsb3dpbmcg b25lLgorICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhpbnRl cm5hbEluc3RhbmNlLl91cGRhdGVCYXRjaE51bWJlciA9PSBudWxsIHx8IGludGVybmFsSW5zdGFu Y2UuX3VwZGF0ZUJhdGNoTnVtYmVyID09PSB1cGRhdGVCYXRjaE51bWJlciArIDEsICdwZXJmb3Jt VXBkYXRlSWZOZWNlc3Nhcnk6IFVuZXhwZWN0ZWQgYmF0Y2ggbnVtYmVyIChjdXJyZW50ICVzLCAn ICsgJ3BlbmRpbmcgJXMpJywgdXBkYXRlQmF0Y2hOdW1iZXIsIGludGVybmFsSW5zdGFuY2UuX3Vw ZGF0ZUJhdGNoTnVtYmVyKSA6IHZvaWQgMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYg KCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgaWYgKGludGVybmFsSW5z dGFuY2UuX2RlYnVnSUQgIT09IDApIHsKKyAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVi dWdUb29sLm9uQmVmb3JlVXBkYXRlQ29tcG9uZW50KGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQs IGludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50KTsKKyAgICAgIH0KKyAgICB9CisgICAg aW50ZXJuYWxJbnN0YW5jZS5wZXJmb3JtVXBkYXRlSWZOZWNlc3NhcnkodHJhbnNhY3Rpb24pOwor ICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIGlmIChpbnRl cm5hbEluc3RhbmNlLl9kZWJ1Z0lEICE9PSAwKSB7CisgICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0 aW9uLmRlYnVnVG9vbC5vblVwZGF0ZUNvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lE KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworfTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdFJl Y29uY2lsZXI7Cit9LHsiMTU3IjoxNTcsIjY0Ijo2NCwiNzYiOjc2fV0sNzY6W2Z1bmN0aW9uKF9k ZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBG YWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJj ZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0 aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2Ug dHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91 bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogCisg Ki8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgUmVhY3RPd25lciA9IF9kZXJlcV8oNzApOworCit2 YXIgUmVhY3RSZWYgPSB7fTsKKworZnVuY3Rpb24gYXR0YWNoUmVmKHJlZiwgY29tcG9uZW50LCBv d25lcikgeworICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykgeworICAgIHJlZihjb21w b25lbnQuZ2V0UHVibGljSW5zdGFuY2UoKSk7CisgIH0gZWxzZSB7CisgICAgLy8gTGVnYWN5IHJl ZgorICAgIFJlYWN0T3duZXIuYWRkQ29tcG9uZW50QXNSZWZUbyhjb21wb25lbnQsIHJlZiwgb3du ZXIpOworICB9Cit9CisKK2Z1bmN0aW9uIGRldGFjaFJlZihyZWYsIGNvbXBvbmVudCwgb3duZXIp IHsKKyAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHsKKyAgICByZWYobnVsbCk7Cisg IH0gZWxzZSB7CisgICAgLy8gTGVnYWN5IHJlZgorICAgIFJlYWN0T3duZXIucmVtb3ZlQ29tcG9u ZW50QXNSZWZGcm9tKGNvbXBvbmVudCwgcmVmLCBvd25lcik7CisgIH0KK30KKworUmVhY3RSZWYu YXR0YWNoUmVmcyA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgZWxlbWVudCkgeworICBpZiAoZWxlbWVu dCA9PT0gbnVsbCB8fCB0eXBlb2YgZWxlbWVudCAhPT0gJ29iamVjdCcpIHsKKyAgICByZXR1cm47 CisgIH0KKyAgdmFyIHJlZiA9IGVsZW1lbnQucmVmOworICBpZiAocmVmICE9IG51bGwpIHsKKyAg ICBhdHRhY2hSZWYocmVmLCBpbnN0YW5jZSwgZWxlbWVudC5fb3duZXIpOworICB9Cit9OworCitS ZWFjdFJlZi5zaG91bGRVcGRhdGVSZWZzID0gZnVuY3Rpb24gKHByZXZFbGVtZW50LCBuZXh0RWxl bWVudCkgeworICAvLyBJZiBlaXRoZXIgdGhlIG93bmVyIG9yIGEgYHJlZmAgaGFzIGNoYW5nZWQs IG1ha2Ugc3VyZSB0aGUgbmV3ZXN0IG93bmVyCisgIC8vIGhhcyBzdG9yZWQgYSByZWZlcmVuY2Ug dG8gYHRoaXNgLCBhbmQgdGhlIHByZXZpb3VzIG93bmVyIChpZiBkaWZmZXJlbnQpCisgIC8vIGhh cyBmb3Jnb3R0ZW4gdGhlIHJlZmVyZW5jZSB0byBgdGhpc2AuIFdlIHVzZSB0aGUgZWxlbWVudCBp bnN0ZWFkCisgIC8vIG9mIHRoZSBwdWJsaWMgdGhpcy5wcm9wcyBiZWNhdXNlIHRoZSBwb3N0IHBy b2Nlc3NpbmcgY2Fubm90IGRldGVybWluZQorICAvLyBhIHJlZi4gVGhlIHJlZiBjb25jZXB0dWFs bHkgbGl2ZXMgb24gdGhlIGVsZW1lbnQuCisKKyAgLy8gVE9ETzogU2hvdWxkIHRoaXMgZXZlbiBi ZSBwb3NzaWJsZT8gVGhlIG93bmVyIGNhbm5vdCBjaGFuZ2UgYmVjYXVzZQorICAvLyBpdCdzIGZv cmJpZGRlbiBieSBzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudC4gVGhlIHJlZiBjYW4gY2hhbmdl CisgIC8vIGlmIHlvdSBzd2FwIHRoZSBrZXlzIG9mIGJ1dCBub3QgdGhlIHJlZnMuIFJlY29uc2lk ZXIgd2hlcmUgdGhpcyBjaGVjaworICAvLyBpcyBtYWRlLiBJdCBwcm9iYWJseSBiZWxvbmdzIHdo ZXJlIHRoZSBrZXkgY2hlY2tpbmcgYW5kCisgIC8vIGluc3RhbnRpYXRlUmVhY3RDb21wb25lbnQg aXMgZG9uZS4KKworICB2YXIgcHJldlJlZiA9IG51bGw7CisgIHZhciBwcmV2T3duZXIgPSBudWxs OworICBpZiAocHJldkVsZW1lbnQgIT09IG51bGwgJiYgdHlwZW9mIHByZXZFbGVtZW50ID09PSAn b2JqZWN0JykgeworICAgIHByZXZSZWYgPSBwcmV2RWxlbWVudC5yZWY7CisgICAgcHJldk93bmVy ID0gcHJldkVsZW1lbnQuX293bmVyOworICB9CisKKyAgdmFyIG5leHRSZWYgPSBudWxsOworICB2 YXIgbmV4dE93bmVyID0gbnVsbDsKKyAgaWYgKG5leHRFbGVtZW50ICE9PSBudWxsICYmIHR5cGVv ZiBuZXh0RWxlbWVudCA9PT0gJ29iamVjdCcpIHsKKyAgICBuZXh0UmVmID0gbmV4dEVsZW1lbnQu cmVmOworICAgIG5leHRPd25lciA9IG5leHRFbGVtZW50Ll9vd25lcjsKKyAgfQorCisgIHJldHVy biBwcmV2UmVmICE9PSBuZXh0UmVmIHx8CisgIC8vIElmIG93bmVyIGNoYW5nZXMgYnV0IHdlIGhh dmUgYW4gdW5jaGFuZ2VkIGZ1bmN0aW9uIHJlZiwgZG9uJ3QgdXBkYXRlIHJlZnMKKyAgdHlwZW9m IG5leHRSZWYgPT09ICdzdHJpbmcnICYmIG5leHRPd25lciAhPT0gcHJldk93bmVyOworfTsKKwor UmVhY3RSZWYuZGV0YWNoUmVmcyA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgZWxlbWVudCkgeworICBp ZiAoZWxlbWVudCA9PT0gbnVsbCB8fCB0eXBlb2YgZWxlbWVudCAhPT0gJ29iamVjdCcpIHsKKyAg ICByZXR1cm47CisgIH0KKyAgdmFyIHJlZiA9IGVsZW1lbnQucmVmOworICBpZiAocmVmICE9IG51 bGwpIHsKKyAgICBkZXRhY2hSZWYocmVmLCBpbnN0YW5jZSwgZWxlbWVudC5fb3duZXIpOworICB9 Cit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0UmVmOworfSx7IjcwIjo3MH1dLDc3OltmdW5j dGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTQtcHJl c2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhp cyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91 bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMg c291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2Fu IGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoK KyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfYXNzaWduID0gX2RlcmVxXygxNTgpOworCit2 YXIgUG9vbGVkQ2xhc3MgPSBfZGVyZXFfKDI1KTsKK3ZhciBUcmFuc2FjdGlvbiA9IF9kZXJlcV8o MTAwKTsKK3ZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IF9kZXJlcV8oNjQpOwordmFyIFJlYWN0 U2VydmVyVXBkYXRlUXVldWUgPSBfZGVyZXFfKDc4KTsKKworLyoqCisgKiBFeGVjdXRlZCB3aXRo aW4gdGhlIHNjb3BlIG9mIHRoZSBgVHJhbnNhY3Rpb25gIGluc3RhbmNlLiBDb25zaWRlciB0aGVz ZSBhcworICogYmVpbmcgbWVtYmVyIG1ldGhvZHMsIGJ1dCB3aXRoIGFuIGltcGxpZWQgb3JkZXJp bmcgd2hpbGUgYmVpbmcgaXNvbGF0ZWQgZnJvbQorICogZWFjaCBvdGhlci4KKyAqLwordmFyIFRS QU5TQUNUSU9OX1dSQVBQRVJTID0gW107CisKK2lmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVj dGlvbicpIHsKKyAgVFJBTlNBQ1RJT05fV1JBUFBFUlMucHVzaCh7CisgICAgaW5pdGlhbGl6ZTog UmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uQmVnaW5GbHVzaCwKKyAgICBjbG9zZTog UmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uRW5kRmx1c2gKKyAgfSk7Cit9CisKK3Zh ciBub29wQ2FsbGJhY2tRdWV1ZSA9IHsKKyAgZW5xdWV1ZTogZnVuY3Rpb24gKCkge30KK307CisK Ky8qKgorICogQGNsYXNzIFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb24KKyAqIEBwYXJh bSB7Ym9vbGVhbn0gcmVuZGVyVG9TdGF0aWNNYXJrdXAKKyAqLworZnVuY3Rpb24gUmVhY3RTZXJ2 ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbihyZW5kZXJUb1N0YXRpY01hcmt1cCkgeworICB0aGlzLnJl aW5pdGlhbGl6ZVRyYW5zYWN0aW9uKCk7CisgIHRoaXMucmVuZGVyVG9TdGF0aWNNYXJrdXAgPSBy ZW5kZXJUb1N0YXRpY01hcmt1cDsKKyAgdGhpcy51c2VDcmVhdGVFbGVtZW50ID0gZmFsc2U7Cisg IHRoaXMudXBkYXRlUXVldWUgPSBuZXcgUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZSh0aGlzKTsKK30K KwordmFyIE1peGluID0geworICAvKioKKyAgICogQHNlZSBUcmFuc2FjdGlvbgorICAgKiBAYWJz dHJhY3QKKyAgICogQGZpbmFsCisgICAqIEByZXR1cm4ge2FycmF5fSBFbXB0eSBsaXN0IG9mIG9w ZXJhdGlvbiB3cmFwIHByb2NlZHVyZXMuCisgICAqLworICBnZXRUcmFuc2FjdGlvbldyYXBwZXJz OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIFRSQU5TQUNUSU9OX1dSQVBQRVJTOworICB9LAor CisgIC8qKgorICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoZSBxdWV1ZSB0byBjb2xsZWN0IGBvbkRP TVJlYWR5YCBjYWxsYmFja3Mgd2l0aC4KKyAgICovCisgIGdldFJlYWN0TW91bnRSZWFkeTogZnVu Y3Rpb24gKCkgeworICAgIHJldHVybiBub29wQ2FsbGJhY2tRdWV1ZTsKKyAgfSwKKworICAvKioK KyAgICogQHJldHVybiB7b2JqZWN0fSBUaGUgcXVldWUgdG8gY29sbGVjdCBSZWFjdCBhc3luYyBl dmVudHMuCisgICAqLworICBnZXRVcGRhdGVRdWV1ZTogZnVuY3Rpb24gKCkgeworICAgIHJldHVy biB0aGlzLnVwZGF0ZVF1ZXVlOworICB9LAorCisgIC8qKgorICAgKiBgUG9vbGVkQ2xhc3NgIGxv b2tzIGZvciB0aGlzLCBhbmQgd2lsbCBpbnZva2UgdGhpcyBiZWZvcmUgYWxsb3dpbmcgdGhpcwor ICAgKiBpbnN0YW5jZSB0byBiZSByZXVzZWQuCisgICAqLworICBkZXN0cnVjdG9yOiBmdW5jdGlv biAoKSB7fSwKKworICBjaGVja3BvaW50OiBmdW5jdGlvbiAoKSB7fSwKKworICByb2xsYmFjazog ZnVuY3Rpb24gKCkge30KK307CisKK19hc3NpZ24oUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2Fj dGlvbi5wcm90b3R5cGUsIFRyYW5zYWN0aW9uLCBNaXhpbik7CisKK1Bvb2xlZENsYXNzLmFkZFBv b2xpbmdUbyhSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9uKTsKKworbW9kdWxlLmV4cG9y dHMgPSBSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9uOworfSx7IjEwMCI6MTAwLCIxNTgi OjE1OCwiMjUiOjI1LCI2NCI6NjQsIjc4Ijo3OH1dLDc4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVs ZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTUtcHJlc2VudCwgRmFjZWJvb2ssIElu Yy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBs aWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNF TlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFk ZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQ QVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ug c3RyaWN0JzsKKworZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rv cikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcg VHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9CisKK3Zh ciBSZWFjdFVwZGF0ZVF1ZXVlID0gX2RlcmVxXyg4MSk7CisKK3ZhciB3YXJuaW5nID0gX2RlcmVx XygxNTcpOworCitmdW5jdGlvbiB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgY2FsbGVyTmFtZSkg eworICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgdmFyIGNvbnN0 cnVjdG9yID0gcHVibGljSW5zdGFuY2UuY29uc3RydWN0b3I7CisgICAgImRldmVsb3BtZW50IiAh PT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJyVzKC4uLik6IENhbiBvbmx5IHVwZGF0 ZSBhIG1vdW50aW5nIGNvbXBvbmVudC4gJyArICdUaGlzIHVzdWFsbHkgbWVhbnMgeW91IGNhbGxl ZCAlcygpIG91dHNpZGUgY29tcG9uZW50V2lsbE1vdW50KCkgb24gdGhlIHNlcnZlci4gJyArICdU aGlzIGlzIGEgbm8tb3AuIFBsZWFzZSBjaGVjayB0aGUgY29kZSBmb3IgdGhlICVzIGNvbXBvbmVu dC4nLCBjYWxsZXJOYW1lLCBjYWxsZXJOYW1lLCBjb25zdHJ1Y3RvciAmJiAoY29uc3RydWN0b3Iu ZGlzcGxheU5hbWUgfHwgY29uc3RydWN0b3IubmFtZSkgfHwgJ1JlYWN0Q2xhc3MnKSA6IHZvaWQg MDsKKyAgfQorfQorCisvKioKKyAqIFRoaXMgaXMgdGhlIHVwZGF0ZSBxdWV1ZSB1c2VkIGZvciBz ZXJ2ZXIgcmVuZGVyaW5nLgorICogSXQgZGVsZWdhdGVzIHRvIFJlYWN0VXBkYXRlUXVldWUgd2hp bGUgc2VydmVyIHJlbmRlcmluZyBpcyBpbiBwcm9ncmVzcyBhbmQKKyAqIHN3aXRjaGVzIHRvIFJl YWN0Tm9vcFVwZGF0ZVF1ZXVlIGFmdGVyIHRoZSB0cmFuc2FjdGlvbiBoYXMgY29tcGxldGVkLgor ICogQGNsYXNzIFJlYWN0U2VydmVyVXBkYXRlUXVldWUKKyAqIEBwYXJhbSB7VHJhbnNhY3Rpb259 IHRyYW5zYWN0aW9uCisgKi8KKwordmFyIFJlYWN0U2VydmVyVXBkYXRlUXVldWUgPSBmdW5jdGlv biAoKSB7CisgIGZ1bmN0aW9uIFJlYWN0U2VydmVyVXBkYXRlUXVldWUodHJhbnNhY3Rpb24pIHsK KyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZSk7CisKKyAg ICB0aGlzLnRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247CisgIH0KKworICAvKioKKyAgICogQ2hl Y2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCBpcyBtb3VudGVkLgor ICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB3ZSB3 YW50IHRvIHRlc3QuCisgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbW91bnRlZCwgZmFs c2Ugb3RoZXJ3aXNlLgorICAgKiBAcHJvdGVjdGVkCisgICAqIEBmaW5hbAorICAgKi8KKworCisg IFJlYWN0U2VydmVyVXBkYXRlUXVldWUucHJvdG90eXBlLmlzTW91bnRlZCA9IGZ1bmN0aW9uIGlz TW91bnRlZChwdWJsaWNJbnN0YW5jZSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfTsKKworICAv KioKKyAgICogRW5xdWV1ZSBhIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBhZnRlciBh bGwgdGhlIHBlbmRpbmcgdXBkYXRlcworICAgKiBoYXZlIHByb2Nlc3NlZC4KKyAgICoKKyAgICog QHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdG8gdXNlIGFz IGB0aGlzYCBjb250ZXh0LgorICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVk IGFmdGVyIHN0YXRlIGlzIHVwZGF0ZWQuCisgICAqIEBpbnRlcm5hbAorICAgKi8KKworCisgIFJl YWN0U2VydmVyVXBkYXRlUXVldWUucHJvdG90eXBlLmVucXVldWVDYWxsYmFjayA9IGZ1bmN0aW9u IGVucXVldWVDYWxsYmFjayhwdWJsaWNJbnN0YW5jZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHsK KyAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5pc0luVHJhbnNhY3Rpb24oKSkgeworICAgICAgUmVh Y3RVcGRhdGVRdWV1ZS5lbnF1ZXVlQ2FsbGJhY2socHVibGljSW5zdGFuY2UsIGNhbGxiYWNrLCBj YWxsZXJOYW1lKTsKKyAgICB9CisgIH07CisKKyAgLyoqCisgICAqIEZvcmNlcyBhbiB1cGRhdGUu IFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGgKKyAgICog Y2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uCisgICAq CisgICAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUg ZGVlcGVyIGFzcGVjdCBvZiB0aGUKKyAgICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQg YnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuCisgICAqCisgICAqIFRoaXMgd2lsbCBub3Qg aW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2UKKyAgICog YGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC4KKyAgICoKKyAg ICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBz aG91bGQgcmVyZW5kZXIuCisgICAqIEBpbnRlcm5hbAorICAgKi8KKworCisgIFJlYWN0U2VydmVy VXBkYXRlUXVldWUucHJvdG90eXBlLmVucXVldWVGb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uIGVucXVl dWVGb3JjZVVwZGF0ZShwdWJsaWNJbnN0YW5jZSkgeworICAgIGlmICh0aGlzLnRyYW5zYWN0aW9u LmlzSW5UcmFuc2FjdGlvbigpKSB7CisgICAgICBSZWFjdFVwZGF0ZVF1ZXVlLmVucXVldWVGb3Jj ZVVwZGF0ZShwdWJsaWNJbnN0YW5jZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdhcm5Ob29wKHB1 YmxpY0luc3RhbmNlLCAnZm9yY2VVcGRhdGUnKTsKKyAgICB9CisgIH07CisKKyAgLyoqCisgICAq IFJlcGxhY2VzIGFsbCBvZiB0aGUgc3RhdGUuIEFsd2F5cyB1c2UgdGhpcyBvciBgc2V0U3RhdGVg IHRvIG11dGF0ZSBzdGF0ZS4KKyAgICogWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMg aW1tdXRhYmxlLgorICAgKgorICAgKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5z dGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzbworICAgKiBhY2Nlc3NpbmcgYHRo aXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZh bHVlLgorICAgKgorICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBp bnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci4KKyAgICogQHBhcmFtIHtvYmplY3R8ZnVuY3Rp b259IGNvbXBsZXRlU3RhdGUgTmV4dCBzdGF0ZS4KKyAgICogQGludGVybmFsCisgICAqLworCisK KyAgUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZS5wcm90b3R5cGUuZW5xdWV1ZVJlcGxhY2VTdGF0ZSA9 IGZ1bmN0aW9uIGVucXVldWVSZXBsYWNlU3RhdGUocHVibGljSW5zdGFuY2UsIGNvbXBsZXRlU3Rh dGUpIHsKKyAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5pc0luVHJhbnNhY3Rpb24oKSkgeworICAg ICAgUmVhY3RVcGRhdGVRdWV1ZS5lbnF1ZXVlUmVwbGFjZVN0YXRlKHB1YmxpY0luc3RhbmNlLCBj b21wbGV0ZVN0YXRlKTsKKyAgICB9IGVsc2UgeworICAgICAgd2Fybk5vb3AocHVibGljSW5zdGFu Y2UsICdyZXBsYWNlU3RhdGUnKTsKKyAgICB9CisgIH07CisKKyAgLyoqCisgICAqIFNldHMgYSBz dWJzZXQgb2YgdGhlIHN0YXRlLiBUaGlzIG9ubHkgZXhpc3RzIGJlY2F1c2UgX3BlbmRpbmdTdGF0 ZSBpcworICAgKiBpbnRlcm5hbC4gVGhpcyBwcm92aWRlcyBhIG1lcmdpbmcgc3RyYXRlZ3kgdGhh dCBpcyBub3QgYXZhaWxhYmxlIHRvIGRlZXAKKyAgICogcHJvcGVydGllcyB3aGljaCBpcyBjb25m dXNpbmcuIFRPRE86IEV4cG9zZSBwZW5kaW5nU3RhdGUgb3IgZG9uJ3QgdXNlIGl0CisgICAqIGR1 cmluZyB0aGUgbWVyZ2UuCisgICAqCisgICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5z dGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLgorICAgKiBAcGFyYW0ge29i amVjdHxmdW5jdGlvbn0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJn ZWQgd2l0aCBzdGF0ZS4KKyAgICogQGludGVybmFsCisgICAqLworCisKKyAgUmVhY3RTZXJ2ZXJV cGRhdGVRdWV1ZS5wcm90b3R5cGUuZW5xdWV1ZVNldFN0YXRlID0gZnVuY3Rpb24gZW5xdWV1ZVNl dFN0YXRlKHB1YmxpY0luc3RhbmNlLCBwYXJ0aWFsU3RhdGUpIHsKKyAgICBpZiAodGhpcy50cmFu c2FjdGlvbi5pc0luVHJhbnNhY3Rpb24oKSkgeworICAgICAgUmVhY3RVcGRhdGVRdWV1ZS5lbnF1 ZXVlU2V0U3RhdGUocHVibGljSW5zdGFuY2UsIHBhcnRpYWxTdGF0ZSk7CisgICAgfSBlbHNlIHsK KyAgICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnc2V0U3RhdGUnKTsKKyAgICB9CisgIH07 CisKKyAgcmV0dXJuIFJlYWN0U2VydmVyVXBkYXRlUXVldWU7Cit9KCk7CisKK21vZHVsZS5leHBv cnRzID0gUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZTsKK30seyIxNTciOjE1NywiODEiOjgxfV0sNzk6 W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAx My1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg KiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5z ZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2Yg dGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0 cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3Rvcnku CisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9wcm9kSW52YXJpYW50ID0gX2RlcmVx XygxMjUpLAorICAgIF9hc3NpZ24gPSBfZGVyZXFfKDE1OCk7CisKK2Z1bmN0aW9uIF9jbGFzc0Nh bGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2Vv ZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFz cyBhcyBhIGZ1bmN0aW9uIik7IH0gfQorCit2YXIgUmVhY3QgPSBfZGVyZXFfKDEzNCk7Cit2YXIg UmVhY3REZWZhdWx0SW5qZWN0aW9uID0gX2RlcmVxXyg1Mik7Cit2YXIgUmVhY3RDb21wb3NpdGVD b21wb25lbnQgPSBfZGVyZXFfKDMwKTsKK3ZhciBSZWFjdFJlY29uY2lsZXIgPSBfZGVyZXFfKDc1 KTsKK3ZhciBSZWFjdFVwZGF0ZXMgPSBfZGVyZXFfKDgyKTsKKwordmFyIGVtcHR5T2JqZWN0ID0g X2RlcmVxXygxNDMpOwordmFyIGdldE5leHREZWJ1Z0lEID0gX2RlcmVxXygxMTcpOwordmFyIGlu dmFyaWFudCA9IF9kZXJlcV8oMTUwKTsKKwordmFyIE5vb3BJbnRlcm5hbENvbXBvbmVudCA9IGZ1 bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gTm9vcEludGVybmFsQ29tcG9uZW50KGVsZW1lbnQpIHsK KyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTm9vcEludGVybmFsQ29tcG9uZW50KTsKKworICAg IHRoaXMuX3JlbmRlcmVkT3V0cHV0ID0gZWxlbWVudDsKKyAgICB0aGlzLl9jdXJyZW50RWxlbWVu dCA9IGVsZW1lbnQ7CisKKyAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7 CisgICAgICB0aGlzLl9kZWJ1Z0lEID0gZ2V0TmV4dERlYnVnSUQoKTsKKyAgICB9CisgIH0KKwor ICBOb29wSW50ZXJuYWxDb21wb25lbnQucHJvdG90eXBlLm1vdW50Q29tcG9uZW50ID0gZnVuY3Rp b24gbW91bnRDb21wb25lbnQoKSB7fTsKKworICBOb29wSW50ZXJuYWxDb21wb25lbnQucHJvdG90 eXBlLnJlY2VpdmVDb21wb25lbnQgPSBmdW5jdGlvbiByZWNlaXZlQ29tcG9uZW50KGVsZW1lbnQp IHsKKyAgICB0aGlzLl9yZW5kZXJlZE91dHB1dCA9IGVsZW1lbnQ7CisgICAgdGhpcy5fY3VycmVu dEVsZW1lbnQgPSBlbGVtZW50OworICB9OworCisgIE5vb3BJbnRlcm5hbENvbXBvbmVudC5wcm90 b3R5cGUudW5tb3VudENvbXBvbmVudCA9IGZ1bmN0aW9uIHVubW91bnRDb21wb25lbnQoKSB7fTsK KworICBOb29wSW50ZXJuYWxDb21wb25lbnQucHJvdG90eXBlLmdldEhvc3ROb2RlID0gZnVuY3Rp b24gZ2V0SG9zdE5vZGUoKSB7CisgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgfTsKKworICBOb29w SW50ZXJuYWxDb21wb25lbnQucHJvdG90eXBlLmdldFB1YmxpY0luc3RhbmNlID0gZnVuY3Rpb24g Z2V0UHVibGljSW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIG51bGw7CisgIH07CisKKyAgcmV0dXJu IE5vb3BJbnRlcm5hbENvbXBvbmVudDsKK30oKTsKKwordmFyIFNoYWxsb3dDb21wb25lbnRXcmFw cGVyID0gZnVuY3Rpb24gKGVsZW1lbnQpIHsKKyAgLy8gVE9ETzogQ29uc29saWRhdGUgd2l0aCBp bnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50CisgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVj dGlvbicpIHsKKyAgICB0aGlzLl9kZWJ1Z0lEID0gZ2V0TmV4dERlYnVnSUQoKTsKKyAgfQorCisg IHRoaXMuY29uc3RydWN0KGVsZW1lbnQpOworfTsKK19hc3NpZ24oU2hhbGxvd0NvbXBvbmVudFdy YXBwZXIucHJvdG90eXBlLCBSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCwgeworICBfY29uc3RydWN0 Q29tcG9uZW50OiBSZWFjdENvbXBvc2l0ZUNvbXBvbmVudC5fY29uc3RydWN0Q29tcG9uZW50V2l0 aG91dE93bmVyLAorICBfaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudDogZnVuY3Rpb24gKGVsZW1l bnQpIHsKKyAgICByZXR1cm4gbmV3IE5vb3BJbnRlcm5hbENvbXBvbmVudChlbGVtZW50KTsKKyAg fSwKKyAgX3JlcGxhY2VOb2RlV2l0aE1hcmt1cDogZnVuY3Rpb24gKCkge30sCisgIF9yZW5kZXJW YWxpZGF0ZWRDb21wb25lbnQ6IFJlYWN0Q29tcG9zaXRlQ29tcG9uZW50Ll9yZW5kZXJWYWxpZGF0 ZWRDb21wb25lbnRXaXRob3V0T3duZXJPckNvbnRleHQKK30pOworCitmdW5jdGlvbiBfYmF0Y2hl ZFJlbmRlcihyZW5kZXJlciwgZWxlbWVudCwgY29udGV4dCkgeworICB2YXIgdHJhbnNhY3Rpb24g PSBSZWFjdFVwZGF0ZXMuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbi5nZXRQb29sZWQodHJ1ZSk7 CisgIHJlbmRlcmVyLl9yZW5kZXIoZWxlbWVudCwgdHJhbnNhY3Rpb24sIGNvbnRleHQpOworICBS ZWFjdFVwZGF0ZXMuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbi5yZWxlYXNlKHRyYW5zYWN0aW9u KTsKK30KKwordmFyIFJlYWN0U2hhbGxvd1JlbmRlcmVyID0gZnVuY3Rpb24gKCkgeworICBmdW5j dGlvbiBSZWFjdFNoYWxsb3dSZW5kZXJlcigpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywg UmVhY3RTaGFsbG93UmVuZGVyZXIpOworCisgICAgdGhpcy5faW5zdGFuY2UgPSBudWxsOworICB9 CisKKyAgUmVhY3RTaGFsbG93UmVuZGVyZXIucHJvdG90eXBlLmdldE1vdW50ZWRJbnN0YW5jZSA9 IGZ1bmN0aW9uIGdldE1vdW50ZWRJbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gdGhpcy5faW5zdGFu Y2UgPyB0aGlzLl9pbnN0YW5jZS5faW5zdGFuY2UgOiBudWxsOworICB9OworCisgIFJlYWN0U2hh bGxvd1JlbmRlcmVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoZWxlbWVudCwg Y29udGV4dCkgeworICAgIC8vIEVuc3VyZSB3ZSd2ZSBkb25lIHRoZSBkZWZhdWx0IGluamVjdGlv bnMuIFRoaXMgbWlnaHQgbm90IGJlIHRydWUgaW4gdGhlCisgICAgLy8gY2FzZSBvZiBhIHNpbXBs ZSB0ZXN0IHRoYXQgb25seSByZXF1aXJlcyBSZWFjdCBhbmQgdGhlIFRlc3RVdGlscyBpbgorICAg IC8vIGNvbmp1bmN0aW9uIHdpdGggYW4gaW5saW5lLXJlcXVpcmVzIHRyYW5zZm9ybS4KKyAgICBS ZWFjdERlZmF1bHRJbmplY3Rpb24uaW5qZWN0KCk7CisKKyAgICAhUmVhY3QuaXNWYWxpZEVsZW1l bnQoZWxlbWVudCkgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQo ZmFsc2UsICdSZWFjdFNoYWxsb3dSZW5kZXJlciByZW5kZXIoKTogSW52YWxpZCBjb21wb25lbnQg ZWxlbWVudC4lcycsIHR5cGVvZiBlbGVtZW50ID09PSAnZnVuY3Rpb24nID8gJyBJbnN0ZWFkIG9m IHBhc3NpbmcgYSBjb21wb25lbnQgY2xhc3MsIG1ha2Ugc3VyZSB0byBpbnN0YW50aWF0ZSAnICsg J2l0IGJ5IHBhc3NpbmcgaXQgdG8gUmVhY3QuY3JlYXRlRWxlbWVudC4nIDogJycpIDogX3Byb2RJ bnZhcmlhbnQoJzEyJywgdHlwZW9mIGVsZW1lbnQgPT09ICdmdW5jdGlvbicgPyAnIEluc3RlYWQg b2YgcGFzc2luZyBhIGNvbXBvbmVudCBjbGFzcywgbWFrZSBzdXJlIHRvIGluc3RhbnRpYXRlICcg KyAnaXQgYnkgcGFzc2luZyBpdCB0byBSZWFjdC5jcmVhdGVFbGVtZW50LicgOiAnJykgOiB2b2lk IDA7CisgICAgISh0eXBlb2YgZWxlbWVudC50eXBlICE9PSAnc3RyaW5nJykgPyAiZGV2ZWxvcG1l bnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdFNoYWxsb3dSZW5k ZXJlciByZW5kZXIoKTogU2hhbGxvdyByZW5kZXJpbmcgd29ya3Mgb25seSB3aXRoIGN1c3RvbSBj b21wb25lbnRzLCBub3QgcHJpbWl0aXZlcyAoJXMpLiBJbnN0ZWFkIG9mIGNhbGxpbmcgYC5yZW5k ZXIoZWwpYCBhbmQgaW5zcGVjdGluZyB0aGUgcmVuZGVyZWQgb3V0cHV0LCBsb29rIGF0IGBlbC5w cm9wc2AgZGlyZWN0bHkgaW5zdGVhZC4nLCBlbGVtZW50LnR5cGUpIDogX3Byb2RJbnZhcmlhbnQo JzEzJywgZWxlbWVudC50eXBlKSA6IHZvaWQgMDsKKworICAgIGlmICghY29udGV4dCkgeworICAg ICAgY29udGV4dCA9IGVtcHR5T2JqZWN0OworICAgIH0KKyAgICBSZWFjdFVwZGF0ZXMuYmF0Y2hl ZFVwZGF0ZXMoX2JhdGNoZWRSZW5kZXIsIHRoaXMsIGVsZW1lbnQsIGNvbnRleHQpOworCisgICAg cmV0dXJuIHRoaXMuZ2V0UmVuZGVyT3V0cHV0KCk7CisgIH07CisKKyAgUmVhY3RTaGFsbG93UmVu ZGVyZXIucHJvdG90eXBlLmdldFJlbmRlck91dHB1dCA9IGZ1bmN0aW9uIGdldFJlbmRlck91dHB1 dCgpIHsKKyAgICByZXR1cm4gdGhpcy5faW5zdGFuY2UgJiYgdGhpcy5faW5zdGFuY2UuX3JlbmRl cmVkQ29tcG9uZW50ICYmIHRoaXMuX2luc3RhbmNlLl9yZW5kZXJlZENvbXBvbmVudC5fcmVuZGVy ZWRPdXRwdXQgfHwgbnVsbDsKKyAgfTsKKworICBSZWFjdFNoYWxsb3dSZW5kZXJlci5wcm90b3R5 cGUudW5tb3VudCA9IGZ1bmN0aW9uIHVubW91bnQoKSB7CisgICAgaWYgKHRoaXMuX2luc3RhbmNl KSB7CisgICAgICBSZWFjdFJlY29uY2lsZXIudW5tb3VudENvbXBvbmVudCh0aGlzLl9pbnN0YW5j ZSwgZmFsc2UpOworICAgIH0KKyAgfTsKKworICBSZWFjdFNoYWxsb3dSZW5kZXJlci5wcm90b3R5 cGUuX3JlbmRlciA9IGZ1bmN0aW9uIF9yZW5kZXIoZWxlbWVudCwgdHJhbnNhY3Rpb24sIGNvbnRl eHQpIHsKKyAgICBpZiAodGhpcy5faW5zdGFuY2UpIHsKKyAgICAgIFJlYWN0UmVjb25jaWxlci5y ZWNlaXZlQ29tcG9uZW50KHRoaXMuX2luc3RhbmNlLCBlbGVtZW50LCB0cmFuc2FjdGlvbiwgY29u dGV4dCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBpbnN0YW5jZSA9IG5ldyBTaGFsbG93Q29t cG9uZW50V3JhcHBlcihlbGVtZW50KTsKKyAgICAgIFJlYWN0UmVjb25jaWxlci5tb3VudENvbXBv bmVudChpbnN0YW5jZSwgdHJhbnNhY3Rpb24sIG51bGwsIG51bGwsIGNvbnRleHQsIDApOworICAg ICAgdGhpcy5faW5zdGFuY2UgPSBpbnN0YW5jZTsKKyAgICB9CisgIH07CisKKyAgcmV0dXJuIFJl YWN0U2hhbGxvd1JlbmRlcmVyOworfSgpOworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0U2hhbGxv d1JlbmRlcmVyOworfSx7IjExNyI6MTE3LCIxMjUiOjEyNSwiMTM0IjoxMzQsIjE0MyI6MTQzLCIx NTAiOjE1MCwiMTU4IjoxNTgsIjMwIjozMCwiNTIiOjUyLCI3NSI6NzUsIjgyIjo4Mn1dLDgwOltm dW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMt cHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog VGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2Ug Zm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRo aXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMg Y2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5Lgor ICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJvZEludmFyaWFudCA9IF9kZXJlcV8o MTI1KSwKKyAgICBfYXNzaWduID0gX2RlcmVxXygxNTgpOworCit2YXIgRXZlbnRDb25zdGFudHMg PSBfZGVyZXFfKDE2KTsKK3ZhciBFdmVudFBsdWdpbkh1YiA9IF9kZXJlcV8oMTcpOwordmFyIEV2 ZW50UGx1Z2luUmVnaXN0cnkgPSBfZGVyZXFfKDE4KTsKK3ZhciBFdmVudFByb3BhZ2F0b3JzID0g X2RlcmVxXygyMCk7Cit2YXIgUmVhY3QgPSBfZGVyZXFfKDEzNCk7Cit2YXIgUmVhY3RET00gPSBf ZGVyZXFfKDMxKTsKK3ZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSBfZGVyZXFfKDM0KTsKK3Zh ciBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIgPSBfZGVyZXFfKDI2KTsKK3ZhciBSZWFjdEluc3Rh bmNlTWFwID0gX2RlcmVxXyg2Myk7Cit2YXIgUmVhY3RVcGRhdGVzID0gX2RlcmVxXyg4Mik7Cit2 YXIgU3ludGhldGljRXZlbnQgPSBfZGVyZXFfKDkxKTsKK3ZhciBSZWFjdFNoYWxsb3dSZW5kZXJl ciA9IF9kZXJlcV8oNzkpOworCit2YXIgZmluZERPTU5vZGUgPSBfZGVyZXFfKDEwOCk7Cit2YXIg aW52YXJpYW50ID0gX2RlcmVxXygxNTApOworCit2YXIgdG9wTGV2ZWxUeXBlcyA9IEV2ZW50Q29u c3RhbnRzLnRvcExldmVsVHlwZXM7CisKK2Z1bmN0aW9uIEV2ZW50KHN1ZmZpeCkge30KKworLyoq CisgKiBAY2xhc3MgUmVhY3RUZXN0VXRpbHMKKyAqLworCitmdW5jdGlvbiBmaW5kQWxsSW5SZW5k ZXJlZFRyZWVJbnRlcm5hbChpbnN0LCB0ZXN0KSB7CisgIGlmICghaW5zdCB8fCAhaW5zdC5nZXRQ dWJsaWNJbnN0YW5jZSkgeworICAgIHJldHVybiBbXTsKKyAgfQorICB2YXIgcHVibGljSW5zdCA9 IGluc3QuZ2V0UHVibGljSW5zdGFuY2UoKTsKKyAgdmFyIHJldCA9IHRlc3QocHVibGljSW5zdCkg PyBbcHVibGljSW5zdF0gOiBbXTsKKyAgdmFyIGN1cnJlbnRFbGVtZW50ID0gaW5zdC5fY3VycmVu dEVsZW1lbnQ7CisgIGlmIChSZWFjdFRlc3RVdGlscy5pc0RPTUNvbXBvbmVudChwdWJsaWNJbnN0 KSkgeworICAgIHZhciByZW5kZXJlZENoaWxkcmVuID0gaW5zdC5fcmVuZGVyZWRDaGlsZHJlbjsK KyAgICB2YXIga2V5OworICAgIGZvciAoa2V5IGluIHJlbmRlcmVkQ2hpbGRyZW4pIHsKKyAgICAg IGlmICghcmVuZGVyZWRDaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAgICAgIGNv bnRpbnVlOworICAgICAgfQorICAgICAgcmV0ID0gcmV0LmNvbmNhdChmaW5kQWxsSW5SZW5kZXJl ZFRyZWVJbnRlcm5hbChyZW5kZXJlZENoaWxkcmVuW2tleV0sIHRlc3QpKTsKKyAgICB9CisgIH0g ZWxzZSBpZiAoUmVhY3QuaXNWYWxpZEVsZW1lbnQoY3VycmVudEVsZW1lbnQpICYmIHR5cGVvZiBj dXJyZW50RWxlbWVudC50eXBlID09PSAnZnVuY3Rpb24nKSB7CisgICAgcmV0ID0gcmV0LmNvbmNh dChmaW5kQWxsSW5SZW5kZXJlZFRyZWVJbnRlcm5hbChpbnN0Ll9yZW5kZXJlZENvbXBvbmVudCwg dGVzdCkpOworICB9CisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogVXRpbGl0aWVzIGZvciBt YWtpbmcgaXQgZWFzeSB0byB0ZXN0IFJlYWN0IGNvbXBvbmVudHMuCisgKgorICogU2VlIGh0dHBz Oi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdGVzdC11dGlscy5odG1sCisgKgorICog VG9kbzogU3VwcG9ydCB0aGUgZW50aXJlIERPTS5zY3J5IHF1ZXJ5IHN5bnRheC4gRm9yIG5vdywg dGhlc2Ugc2ltcGxlCisgKiB1dGlsaXRpZXMgd2lsbCBzdWZmaWNlIGZvciB0ZXN0aW5nIHB1cnBv c2VzLgorICogQGxlbmRzIFJlYWN0VGVzdFV0aWxzCisgKi8KK3ZhciBSZWFjdFRlc3RVdGlscyA9 IHsKKyAgcmVuZGVySW50b0RvY3VtZW50OiBmdW5jdGlvbiAoZWxlbWVudCkgeworICAgIHZhciBk aXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKyAgICAvLyBOb25lIG9mIG91ciB0 ZXN0cyBhY3R1YWxseSByZXF1aXJlIGF0dGFjaGluZyB0aGUgY29udGFpbmVyIHRvIHRoZQorICAg IC8vIERPTSwgYW5kIGRvaW5nIHNvIGNyZWF0ZXMgYSBtZXNzIHRoYXQgd2UgcmVseSBvbiB0ZXN0 IGlzb2xhdGlvbiB0bworICAgIC8vIGNsZWFuIHVwLCBzbyB3ZSdyZSBnb2luZyB0byBzdG9wIGhv bm9yaW5nIHRoZSBuYW1lIG9mIHRoaXMgbWV0aG9kCisgICAgLy8gKGFuZCBwcm9iYWJseSByZW5h bWUgaXQgZXZlbnR1YWxseSkgaWYgbm8gcHJvYmxlbXMgYXJpc2UuCisgICAgLy8gZG9jdW1lbnQu ZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKGRpdik7CisgICAgcmV0dXJuIFJlYWN0RE9NLnJl bmRlcihlbGVtZW50LCBkaXYpOworICB9LAorCisgIGlzRWxlbWVudDogZnVuY3Rpb24gKGVsZW1l bnQpIHsKKyAgICByZXR1cm4gUmVhY3QuaXNWYWxpZEVsZW1lbnQoZWxlbWVudCk7CisgIH0sCisK KyAgaXNFbGVtZW50T2ZUeXBlOiBmdW5jdGlvbiAoaW5zdCwgY29udmVuaWVuY2VDb25zdHJ1Y3Rv cikgeworICAgIHJldHVybiBSZWFjdC5pc1ZhbGlkRWxlbWVudChpbnN0KSAmJiBpbnN0LnR5cGUg PT09IGNvbnZlbmllbmNlQ29uc3RydWN0b3I7CisgIH0sCisKKyAgaXNET01Db21wb25lbnQ6IGZ1 bmN0aW9uIChpbnN0KSB7CisgICAgcmV0dXJuICEhKGluc3QgJiYgaW5zdC5ub2RlVHlwZSA9PT0g MSAmJiBpbnN0LnRhZ05hbWUpOworICB9LAorCisgIGlzRE9NQ29tcG9uZW50RWxlbWVudDogZnVu Y3Rpb24gKGluc3QpIHsKKyAgICByZXR1cm4gISEoaW5zdCAmJiBSZWFjdC5pc1ZhbGlkRWxlbWVu dChpbnN0KSAmJiAhIWluc3QudGFnTmFtZSk7CisgIH0sCisKKyAgaXNDb21wb3NpdGVDb21wb25l bnQ6IGZ1bmN0aW9uIChpbnN0KSB7CisgICAgaWYgKFJlYWN0VGVzdFV0aWxzLmlzRE9NQ29tcG9u ZW50KGluc3QpKSB7CisgICAgICAvLyBBY2Nlc3NpbmcgaW5zdC5zZXRTdGF0ZSB3YXJuczsganVz dCByZXR1cm4gZmFsc2UgYXMgdGhhdCdsbCBiZSB3aGF0CisgICAgICAvLyB0aGlzIHJldHVybnMg d2hlbiB3ZSBoYXZlIERPTSBub2RlcyBhcyByZWZzIGRpcmVjdGx5CisgICAgICByZXR1cm4gZmFs c2U7CisgICAgfQorICAgIHJldHVybiBpbnN0ICE9IG51bGwgJiYgdHlwZW9mIGluc3QucmVuZGVy ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBpbnN0LnNldFN0YXRlID09PSAnZnVuY3Rpb24nOwor ICB9LAorCisgIGlzQ29tcG9zaXRlQ29tcG9uZW50V2l0aFR5cGU6IGZ1bmN0aW9uIChpbnN0LCB0 eXBlKSB7CisgICAgaWYgKCFSZWFjdFRlc3RVdGlscy5pc0NvbXBvc2l0ZUNvbXBvbmVudChpbnN0 KSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2YXIgaW50ZXJuYWxJbnN0YW5j ZSA9IFJlYWN0SW5zdGFuY2VNYXAuZ2V0KGluc3QpOworICAgIHZhciBjb25zdHJ1Y3RvciA9IGlu dGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50LnR5cGU7CisKKyAgICByZXR1cm4gY29uc3Ry dWN0b3IgPT09IHR5cGU7CisgIH0sCisKKyAgaXNDb21wb3NpdGVDb21wb25lbnRFbGVtZW50OiBm dW5jdGlvbiAoaW5zdCkgeworICAgIGlmICghUmVhY3QuaXNWYWxpZEVsZW1lbnQoaW5zdCkpIHsK KyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gV2UgY2hlY2sgdGhlIHByb3RvdHlw ZSBvZiB0aGUgdHlwZSB0aGF0IHdpbGwgZ2V0IG1vdW50ZWQsIG5vdCB0aGUKKyAgICAvLyBpbnN0 YW5jZSBpdHNlbGYuIFRoaXMgaXMgYSBmdXR1cmUgcHJvb2Ygd2F5IG9mIGR1Y2sgdHlwaW5nLgor ICAgIHZhciBwcm90b3R5cGUgPSBpbnN0LnR5cGUucHJvdG90eXBlOworICAgIHJldHVybiB0eXBl b2YgcHJvdG90eXBlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgcHJvdG90eXBlLnNl dFN0YXRlID09PSAnZnVuY3Rpb24nOworICB9LAorCisgIGlzQ29tcG9zaXRlQ29tcG9uZW50RWxl bWVudFdpdGhUeXBlOiBmdW5jdGlvbiAoaW5zdCwgdHlwZSkgeworICAgIHZhciBpbnRlcm5hbElu c3RhbmNlID0gUmVhY3RJbnN0YW5jZU1hcC5nZXQoaW5zdCk7CisgICAgdmFyIGNvbnN0cnVjdG9y ID0gaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQudHlwZTsKKworICAgIHJldHVybiAh IShSZWFjdFRlc3RVdGlscy5pc0NvbXBvc2l0ZUNvbXBvbmVudEVsZW1lbnQoaW5zdCkgJiYgY29u c3RydWN0b3IgPT09IHR5cGUpOworICB9LAorCisgIGdldFJlbmRlcmVkQ2hpbGRPZkNvbXBvc2l0 ZUNvbXBvbmVudDogZnVuY3Rpb24gKGluc3QpIHsKKyAgICBpZiAoIVJlYWN0VGVzdFV0aWxzLmlz Q29tcG9zaXRlQ29tcG9uZW50KGluc3QpKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cisg ICAgdmFyIGludGVybmFsSW5zdGFuY2UgPSBSZWFjdEluc3RhbmNlTWFwLmdldChpbnN0KTsKKyAg ICByZXR1cm4gaW50ZXJuYWxJbnN0YW5jZS5fcmVuZGVyZWRDb21wb25lbnQuZ2V0UHVibGljSW5z dGFuY2UoKTsKKyAgfSwKKworICBmaW5kQWxsSW5SZW5kZXJlZFRyZWU6IGZ1bmN0aW9uIChpbnN0 LCB0ZXN0KSB7CisgICAgaWYgKCFpbnN0KSB7CisgICAgICByZXR1cm4gW107CisgICAgfQorICAg ICFSZWFjdFRlc3RVdGlscy5pc0NvbXBvc2l0ZUNvbXBvbmVudChpbnN0KSA/ICJkZXZlbG9wbWVu dCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2ZpbmRBbGxJblJlbmRlcmVk VHJlZSguLi4pOiBpbnN0YW5jZSBtdXN0IGJlIGEgY29tcG9zaXRlIGNvbXBvbmVudCcpIDogX3By b2RJbnZhcmlhbnQoJzEwJykgOiB2b2lkIDA7CisgICAgcmV0dXJuIGZpbmRBbGxJblJlbmRlcmVk VHJlZUludGVybmFsKFJlYWN0SW5zdGFuY2VNYXAuZ2V0KGluc3QpLCB0ZXN0KTsKKyAgfSwKKwor ICAvKioKKyAgICogRmluZHMgYWxsIGluc3RhbmNlIG9mIGNvbXBvbmVudHMgaW4gdGhlIHJlbmRl cmVkIHRyZWUgdGhhdCBhcmUgRE9NCisgICAqIGNvbXBvbmVudHMgd2l0aCB0aGUgY2xhc3MgbmFt ZSBtYXRjaGluZyBgY2xhc3NOYW1lYC4KKyAgICogQHJldHVybiB7YXJyYXl9IGFuIGFycmF5IG9m IGFsbCB0aGUgbWF0Y2hlcy4KKyAgICovCisgIHNjcnlSZW5kZXJlZERPTUNvbXBvbmVudHNXaXRo Q2xhc3M6IGZ1bmN0aW9uIChyb290LCBjbGFzc05hbWVzKSB7CisgICAgcmV0dXJuIFJlYWN0VGVz dFV0aWxzLmZpbmRBbGxJblJlbmRlcmVkVHJlZShyb290LCBmdW5jdGlvbiAoaW5zdCkgeworICAg ICAgaWYgKFJlYWN0VGVzdFV0aWxzLmlzRE9NQ29tcG9uZW50KGluc3QpKSB7CisgICAgICAgIHZh ciBjbGFzc05hbWUgPSBpbnN0LmNsYXNzTmFtZTsKKyAgICAgICAgaWYgKHR5cGVvZiBjbGFzc05h bWUgIT09ICdzdHJpbmcnKSB7CisgICAgICAgICAgLy8gU1ZHLCBwcm9iYWJseS4KKyAgICAgICAg ICBjbGFzc05hbWUgPSBpbnN0LmdldEF0dHJpYnV0ZSgnY2xhc3MnKSB8fCAnJzsKKyAgICAgICAg fQorICAgICAgICB2YXIgY2xhc3NMaXN0ID0gY2xhc3NOYW1lLnNwbGl0KC9ccysvKTsKKworICAg ICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY2xhc3NOYW1lcykpIHsKKyAgICAgICAgICAhKGNsYXNz TmFtZXMgIT09IHVuZGVmaW5lZCkgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBp bnZhcmlhbnQoZmFsc2UsICdUZXN0VXRpbHMuc2NyeVJlbmRlcmVkRE9NQ29tcG9uZW50c1dpdGhD bGFzcyBleHBlY3RzIGEgY2xhc3NOYW1lIGFzIGEgc2Vjb25kIGFyZ3VtZW50LicpIDogX3Byb2RJ bnZhcmlhbnQoJzExJykgOiB2b2lkIDA7CisgICAgICAgICAgY2xhc3NOYW1lcyA9IGNsYXNzTmFt ZXMuc3BsaXQoL1xzKy8pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjbGFzc05hbWVzLmV2 ZXJ5KGZ1bmN0aW9uIChuYW1lKSB7CisgICAgICAgICAgcmV0dXJuIGNsYXNzTGlzdC5pbmRleE9m KG5hbWUpICE9PSAtMTsKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7 CisgICAgfSk7CisgIH0sCisKKyAgLyoqCisgICAqIExpa2Ugc2NyeVJlbmRlcmVkRE9NQ29tcG9u ZW50c1dpdGhDbGFzcyBidXQgZXhwZWN0cyB0aGVyZSB0byBiZSBvbmUgcmVzdWx0LAorICAgKiBh bmQgcmV0dXJucyB0aGF0IG9uZSByZXN1bHQsIG9yIHRocm93cyBleGNlcHRpb24gaWYgdGhlcmUg aXMgYW55IG90aGVyCisgICAqIG51bWJlciBvZiBtYXRjaGVzIGJlc2lkZXMgb25lLgorICAgKiBA cmV0dXJuIHshUmVhY3RET01Db21wb25lbnR9IFRoZSBvbmUgbWF0Y2guCisgICAqLworICBmaW5k UmVuZGVyZWRET01Db21wb25lbnRXaXRoQ2xhc3M6IGZ1bmN0aW9uIChyb290LCBjbGFzc05hbWUp IHsKKyAgICB2YXIgYWxsID0gUmVhY3RUZXN0VXRpbHMuc2NyeVJlbmRlcmVkRE9NQ29tcG9uZW50 c1dpdGhDbGFzcyhyb290LCBjbGFzc05hbWUpOworICAgIGlmIChhbGwubGVuZ3RoICE9PSAxKSB7 CisgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RpZCBub3QgZmluZCBleGFjdGx5IG9uZSBtYXRjaCAo Zm91bmQ6ICcgKyBhbGwubGVuZ3RoICsgJykgJyArICdmb3IgY2xhc3M6JyArIGNsYXNzTmFtZSk7 CisgICAgfQorICAgIHJldHVybiBhbGxbMF07CisgIH0sCisKKyAgLyoqCisgICAqIEZpbmRzIGFs bCBpbnN0YW5jZSBvZiBjb21wb25lbnRzIGluIHRoZSByZW5kZXJlZCB0cmVlIHRoYXQgYXJlIERP TQorICAgKiBjb21wb25lbnRzIHdpdGggdGhlIHRhZyBuYW1lIG1hdGNoaW5nIGB0YWdOYW1lYC4K KyAgICogQHJldHVybiB7YXJyYXl9IGFuIGFycmF5IG9mIGFsbCB0aGUgbWF0Y2hlcy4KKyAgICov CisgIHNjcnlSZW5kZXJlZERPTUNvbXBvbmVudHNXaXRoVGFnOiBmdW5jdGlvbiAocm9vdCwgdGFn TmFtZSkgeworICAgIHJldHVybiBSZWFjdFRlc3RVdGlscy5maW5kQWxsSW5SZW5kZXJlZFRyZWUo cm9vdCwgZnVuY3Rpb24gKGluc3QpIHsKKyAgICAgIHJldHVybiBSZWFjdFRlc3RVdGlscy5pc0RP TUNvbXBvbmVudChpbnN0KSAmJiBpbnN0LnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gdGFnTmFt ZS50b1VwcGVyQ2FzZSgpOworICAgIH0pOworICB9LAorCisgIC8qKgorICAgKiBMaWtlIHNjcnlS ZW5kZXJlZERPTUNvbXBvbmVudHNXaXRoVGFnIGJ1dCBleHBlY3RzIHRoZXJlIHRvIGJlIG9uZSBy ZXN1bHQsCisgICAqIGFuZCByZXR1cm5zIHRoYXQgb25lIHJlc3VsdCwgb3IgdGhyb3dzIGV4Y2Vw dGlvbiBpZiB0aGVyZSBpcyBhbnkgb3RoZXIKKyAgICogbnVtYmVyIG9mIG1hdGNoZXMgYmVzaWRl cyBvbmUuCisgICAqIEByZXR1cm4geyFSZWFjdERPTUNvbXBvbmVudH0gVGhlIG9uZSBtYXRjaC4K KyAgICovCisgIGZpbmRSZW5kZXJlZERPTUNvbXBvbmVudFdpdGhUYWc6IGZ1bmN0aW9uIChyb290 LCB0YWdOYW1lKSB7CisgICAgdmFyIGFsbCA9IFJlYWN0VGVzdFV0aWxzLnNjcnlSZW5kZXJlZERP TUNvbXBvbmVudHNXaXRoVGFnKHJvb3QsIHRhZ05hbWUpOworICAgIGlmIChhbGwubGVuZ3RoICE9 PSAxKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RpZCBub3QgZmluZCBleGFjdGx5IG9uZSBt YXRjaCAoZm91bmQ6ICcgKyBhbGwubGVuZ3RoICsgJykgJyArICdmb3IgdGFnOicgKyB0YWdOYW1l KTsKKyAgICB9CisgICAgcmV0dXJuIGFsbFswXTsKKyAgfSwKKworICAvKioKKyAgICogRmluZHMg YWxsIGluc3RhbmNlcyBvZiBjb21wb25lbnRzIHdpdGggdHlwZSBlcXVhbCB0byBgY29tcG9uZW50 VHlwZWAuCisgICAqIEByZXR1cm4ge2FycmF5fSBhbiBhcnJheSBvZiBhbGwgdGhlIG1hdGNoZXMu CisgICAqLworICBzY3J5UmVuZGVyZWRDb21wb25lbnRzV2l0aFR5cGU6IGZ1bmN0aW9uIChyb290 LCBjb21wb25lbnRUeXBlKSB7CisgICAgcmV0dXJuIFJlYWN0VGVzdFV0aWxzLmZpbmRBbGxJblJl bmRlcmVkVHJlZShyb290LCBmdW5jdGlvbiAoaW5zdCkgeworICAgICAgcmV0dXJuIFJlYWN0VGVz dFV0aWxzLmlzQ29tcG9zaXRlQ29tcG9uZW50V2l0aFR5cGUoaW5zdCwgY29tcG9uZW50VHlwZSk7 CisgICAgfSk7CisgIH0sCisKKyAgLyoqCisgICAqIFNhbWUgYXMgYHNjcnlSZW5kZXJlZENvbXBv bmVudHNXaXRoVHlwZWAgYnV0IGV4cGVjdHMgdGhlcmUgdG8gYmUgb25lIHJlc3VsdAorICAgKiBh bmQgcmV0dXJucyB0aGF0IG9uZSByZXN1bHQsIG9yIHRocm93cyBleGNlcHRpb24gaWYgdGhlcmUg aXMgYW55IG90aGVyCisgICAqIG51bWJlciBvZiBtYXRjaGVzIGJlc2lkZXMgb25lLgorICAgKiBA cmV0dXJuIHshUmVhY3RDb21wb25lbnR9IFRoZSBvbmUgbWF0Y2guCisgICAqLworICBmaW5kUmVu ZGVyZWRDb21wb25lbnRXaXRoVHlwZTogZnVuY3Rpb24gKHJvb3QsIGNvbXBvbmVudFR5cGUpIHsK KyAgICB2YXIgYWxsID0gUmVhY3RUZXN0VXRpbHMuc2NyeVJlbmRlcmVkQ29tcG9uZW50c1dpdGhU eXBlKHJvb3QsIGNvbXBvbmVudFR5cGUpOworICAgIGlmIChhbGwubGVuZ3RoICE9PSAxKSB7Cisg ICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RpZCBub3QgZmluZCBleGFjdGx5IG9uZSBtYXRjaCAoZm91 bmQ6ICcgKyBhbGwubGVuZ3RoICsgJykgJyArICdmb3IgY29tcG9uZW50VHlwZTonICsgY29tcG9u ZW50VHlwZSk7CisgICAgfQorICAgIHJldHVybiBhbGxbMF07CisgIH0sCisKKyAgLyoqCisgICAq IFBhc3MgYSBtb2NrZWQgY29tcG9uZW50IG1vZHVsZSB0byB0aGlzIG1ldGhvZCB0byBhdWdtZW50 IGl0IHdpdGgKKyAgICogdXNlZnVsIG1ldGhvZHMgdGhhdCBhbGxvdyBpdCB0byBiZSB1c2VkIGFz IGEgZHVtbXkgUmVhY3QgY29tcG9uZW50LgorICAgKiBJbnN0ZWFkIG9mIHJlbmRlcmluZyBhcyB1 c3VhbCwgdGhlIGNvbXBvbmVudCB3aWxsIGJlY29tZSBhIHNpbXBsZQorICAgKiA8ZGl2PiBjb250 YWluaW5nIGFueSBwcm92aWRlZCBjaGlsZHJlbi4KKyAgICoKKyAgICogQHBhcmFtIHtvYmplY3R9 IG1vZHVsZSB0aGUgbW9jayBmdW5jdGlvbiBvYmplY3QgZXhwb3J0ZWQgZnJvbSBhCisgICAqICAg ICAgICAgICAgICAgICAgICAgICAgbW9kdWxlIHRoYXQgZGVmaW5lcyB0aGUgY29tcG9uZW50IHRv IGJlIG1vY2tlZAorICAgKiBAcGFyYW0gez9zdHJpbmd9IG1vY2tUYWdOYW1lIG9wdGlvbmFsIGR1 bW15IHJvb3QgdGFnIG5hbWUgdG8gcmV0dXJuCisgICAqICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgZnJvbSByZW5kZXIgbWV0aG9kIChvdmVycmlkZXMKKyAgICogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBtb2R1bGUubW9ja1RhZ05hbWUgaWYgcHJvdmlkZWQpCisgICAqIEByZXR1 cm4ge29iamVjdH0gdGhlIFJlYWN0VGVzdFV0aWxzIG9iamVjdCAoZm9yIGNoYWluaW5nKQorICAg Ki8KKyAgbW9ja0NvbXBvbmVudDogZnVuY3Rpb24gKG1vZHVsZSwgbW9ja1RhZ05hbWUpIHsKKyAg ICBtb2NrVGFnTmFtZSA9IG1vY2tUYWdOYW1lIHx8IG1vZHVsZS5tb2NrVGFnTmFtZSB8fCAnZGl2 JzsKKworICAgIG1vZHVsZS5wcm90b3R5cGUucmVuZGVyLm1vY2tJbXBsZW1lbnRhdGlvbihmdW5j dGlvbiAoKSB7CisgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChtb2NrVGFnTmFtZSwg bnVsbCwgdGhpcy5wcm9wcy5jaGlsZHJlbik7CisgICAgfSk7CisKKyAgICByZXR1cm4gdGhpczsK KyAgfSwKKworICAvKioKKyAgICogU2ltdWxhdGVzIGEgdG9wIGxldmVsIGV2ZW50IGJlaW5nIGRp c3BhdGNoZWQgZnJvbSBhIHJhdyBldmVudCB0aGF0IG9jY3VycmVkCisgICAqIG9uIGFuIGBFbGVt ZW50YCBub2RlLgorICAgKiBAcGFyYW0ge09iamVjdH0gdG9wTGV2ZWxUeXBlIEEgdHlwZSBmcm9t IGBFdmVudENvbnN0YW50cy50b3BMZXZlbFR5cGVzYAorICAgKiBAcGFyYW0geyFFbGVtZW50fSBu b2RlIFRoZSBkb20gdG8gc2ltdWxhdGUgYW4gZXZlbnQgb2NjdXJyaW5nIG9uLgorICAgKiBAcGFy YW0gez9FdmVudH0gZmFrZU5hdGl2ZUV2ZW50IEZha2UgbmF0aXZlIGV2ZW50IHRvIHVzZSBpbiBT eW50aGV0aWNFdmVudC4KKyAgICovCisgIHNpbXVsYXRlTmF0aXZlRXZlbnRPbk5vZGU6IGZ1bmN0 aW9uICh0b3BMZXZlbFR5cGUsIG5vZGUsIGZha2VOYXRpdmVFdmVudCkgeworICAgIGZha2VOYXRp dmVFdmVudC50YXJnZXQgPSBub2RlOworICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFj dEV2ZW50TGlzdGVuZXIuZGlzcGF0Y2hFdmVudCh0b3BMZXZlbFR5cGUsIGZha2VOYXRpdmVFdmVu dCk7CisgIH0sCisKKyAgLyoqCisgICAqIFNpbXVsYXRlcyBhIHRvcCBsZXZlbCBldmVudCBiZWlu ZyBkaXNwYXRjaGVkIGZyb20gYSByYXcgZXZlbnQgdGhhdCBvY2N1cnJlZAorICAgKiBvbiB0aGUg YFJlYWN0RE9NQ29tcG9uZW50YCBgY29tcGAuCisgICAqIEBwYXJhbSB7T2JqZWN0fSB0b3BMZXZl bFR5cGUgQSB0eXBlIGZyb20gYEV2ZW50Q29uc3RhbnRzLnRvcExldmVsVHlwZXNgLgorICAgKiBA cGFyYW0geyFSZWFjdERPTUNvbXBvbmVudH0gY29tcAorICAgKiBAcGFyYW0gez9FdmVudH0gZmFr ZU5hdGl2ZUV2ZW50IEZha2UgbmF0aXZlIGV2ZW50IHRvIHVzZSBpbiBTeW50aGV0aWNFdmVudC4K KyAgICovCisgIHNpbXVsYXRlTmF0aXZlRXZlbnRPbkRPTUNvbXBvbmVudDogZnVuY3Rpb24gKHRv cExldmVsVHlwZSwgY29tcCwgZmFrZU5hdGl2ZUV2ZW50KSB7CisgICAgUmVhY3RUZXN0VXRpbHMu c2ltdWxhdGVOYXRpdmVFdmVudE9uTm9kZSh0b3BMZXZlbFR5cGUsIGZpbmRET01Ob2RlKGNvbXAp LCBmYWtlTmF0aXZlRXZlbnQpOworICB9LAorCisgIG5hdGl2ZVRvdWNoRGF0YTogZnVuY3Rpb24g KHgsIHkpIHsKKyAgICByZXR1cm4geworICAgICAgdG91Y2hlczogW3sgcGFnZVg6IHgsIHBhZ2VZ OiB5IH1dCisgICAgfTsKKyAgfSwKKworICBjcmVhdGVSZW5kZXJlcjogZnVuY3Rpb24gKCkgewor ICAgIHJldHVybiBuZXcgUmVhY3RTaGFsbG93UmVuZGVyZXIoKTsKKyAgfSwKKworICBTaW11bGF0 ZTogbnVsbCwKKyAgU2ltdWxhdGVOYXRpdmU6IHt9Cit9OworCisvKioKKyAqIEV4cG9ydHM6Cisg KgorICogLSBgUmVhY3RUZXN0VXRpbHMuU2ltdWxhdGUuY2xpY2soRWxlbWVudC9SZWFjdERPTUNv bXBvbmVudClgCisgKiAtIGBSZWFjdFRlc3RVdGlscy5TaW11bGF0ZS5tb3VzZU1vdmUoRWxlbWVu dC9SZWFjdERPTUNvbXBvbmVudClgCisgKiAtIGBSZWFjdFRlc3RVdGlscy5TaW11bGF0ZS5jaGFu Z2UoRWxlbWVudC9SZWFjdERPTUNvbXBvbmVudClgCisgKiAtIC4uLiAoQWxsIGtleXMgZnJvbSBl dmVudCBwbHVnaW4gYGV2ZW50VHlwZXNgIG9iamVjdHMpCisgKi8KK2Z1bmN0aW9uIG1ha2VTaW11 bGF0b3IoZXZlbnRUeXBlKSB7CisgIHJldHVybiBmdW5jdGlvbiAoZG9tQ29tcG9uZW50T3JOb2Rl LCBldmVudERhdGEpIHsKKyAgICB2YXIgbm9kZTsKKyAgICAhIVJlYWN0LmlzVmFsaWRFbGVtZW50 KGRvbUNvbXBvbmVudE9yTm9kZSkgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBp bnZhcmlhbnQoZmFsc2UsICdUZXN0VXRpbHMuU2ltdWxhdGUgZXhwZWN0cyBhIGNvbXBvbmVudCBp bnN0YW5jZSBhbmQgbm90IGEgUmVhY3RFbGVtZW50LlRlc3RVdGlscy5TaW11bGF0ZSB3aWxsIG5v dCB3b3JrIGlmIHlvdSBhcmUgdXNpbmcgc2hhbGxvdyByZW5kZXJpbmcuJykgOiBfcHJvZEludmFy aWFudCgnMTQnKSA6IHZvaWQgMDsKKyAgICBpZiAoUmVhY3RUZXN0VXRpbHMuaXNET01Db21wb25l bnQoZG9tQ29tcG9uZW50T3JOb2RlKSkgeworICAgICAgbm9kZSA9IGZpbmRET01Ob2RlKGRvbUNv bXBvbmVudE9yTm9kZSk7CisgICAgfSBlbHNlIGlmIChkb21Db21wb25lbnRPck5vZGUudGFnTmFt ZSkgeworICAgICAgbm9kZSA9IGRvbUNvbXBvbmVudE9yTm9kZTsKKyAgICB9CisKKyAgICB2YXIg ZGlzcGF0Y2hDb25maWcgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LmV2ZW50TmFtZURpc3BhdGNoQ29u Zmlnc1tldmVudFR5cGVdOworCisgICAgdmFyIGZha2VOYXRpdmVFdmVudCA9IG5ldyBFdmVudCgp OworICAgIGZha2VOYXRpdmVFdmVudC50YXJnZXQgPSBub2RlOworICAgIGZha2VOYXRpdmVFdmVu dC50eXBlID0gZXZlbnRUeXBlLnRvTG93ZXJDYXNlKCk7CisKKyAgICAvLyBXZSBkb24ndCB1c2Ug U3ludGhldGljRXZlbnQuZ2V0UG9vbGVkIGluIG9yZGVyIHRvIG5vdCBoYXZlIHRvIHdvcnJ5IGFi b3V0CisgICAgLy8gcHJvcGVybHkgZGVzdHJveWluZyBhbnkgcHJvcGVydGllcyBhc3NpZ25lZCBm cm9tIGBldmVudERhdGFgIHVwb24gcmVsZWFzZQorICAgIHZhciBldmVudCA9IG5ldyBTeW50aGV0 aWNFdmVudChkaXNwYXRjaENvbmZpZywgUmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNl RnJvbU5vZGUobm9kZSksIGZha2VOYXRpdmVFdmVudCwgbm9kZSk7CisgICAgLy8gU2luY2Ugd2Ug YXJlbid0IHVzaW5nIHBvb2xpbmcsIGFsd2F5cyBwZXJzaXN0IHRoZSBldmVudC4gVGhpcyB3aWxs IG1ha2UKKyAgICAvLyBzdXJlIGl0J3MgbWFya2VkIGFuZCB3b24ndCB3YXJuIHdoZW4gc2V0dGlu ZyBhZGRpdGlvbmFsIHByb3BlcnRpZXMuCisgICAgZXZlbnQucGVyc2lzdCgpOworICAgIF9hc3Np Z24oZXZlbnQsIGV2ZW50RGF0YSk7CisKKyAgICBpZiAoZGlzcGF0Y2hDb25maWcucGhhc2VkUmVn aXN0cmF0aW9uTmFtZXMpIHsKKyAgICAgIEV2ZW50UHJvcGFnYXRvcnMuYWNjdW11bGF0ZVR3b1Bo YXNlRGlzcGF0Y2hlcyhldmVudCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEV2ZW50UHJvcGFnYXRv cnMuYWNjdW11bGF0ZURpcmVjdERpc3BhdGNoZXMoZXZlbnQpOworICAgIH0KKworICAgIFJlYWN0 VXBkYXRlcy5iYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoKSB7CisgICAgICBFdmVudFBsdWdpbkh1 Yi5lbnF1ZXVlRXZlbnRzKGV2ZW50KTsKKyAgICAgIEV2ZW50UGx1Z2luSHViLnByb2Nlc3NFdmVu dFF1ZXVlKHRydWUpOworICAgIH0pOworICB9OworfQorCitmdW5jdGlvbiBidWlsZFNpbXVsYXRv cnMoKSB7CisgIFJlYWN0VGVzdFV0aWxzLlNpbXVsYXRlID0ge307CisKKyAgdmFyIGV2ZW50VHlw ZTsKKyAgZm9yIChldmVudFR5cGUgaW4gRXZlbnRQbHVnaW5SZWdpc3RyeS5ldmVudE5hbWVEaXNw YXRjaENvbmZpZ3MpIHsKKyAgICAvKioKKyAgICAgKiBAcGFyYW0geyFFbGVtZW50fFJlYWN0RE9N Q29tcG9uZW50fSBkb21Db21wb25lbnRPck5vZGUKKyAgICAgKiBAcGFyYW0gez9vYmplY3R9IGV2 ZW50RGF0YSBGYWtlIGV2ZW50IGRhdGEgdG8gdXNlIGluIFN5bnRoZXRpY0V2ZW50LgorICAgICAq LworICAgIFJlYWN0VGVzdFV0aWxzLlNpbXVsYXRlW2V2ZW50VHlwZV0gPSBtYWtlU2ltdWxhdG9y KGV2ZW50VHlwZSk7CisgIH0KK30KKworLy8gUmVidWlsZCBSZWFjdFRlc3RVdGlscy5TaW11bGF0 ZSB3aGVuZXZlciBldmVudCBwbHVnaW5zIGFyZSBpbmplY3RlZAordmFyIG9sZEluamVjdEV2ZW50 UGx1Z2luT3JkZXIgPSBFdmVudFBsdWdpbkh1Yi5pbmplY3Rpb24uaW5qZWN0RXZlbnRQbHVnaW5P cmRlcjsKK0V2ZW50UGx1Z2luSHViLmluamVjdGlvbi5pbmplY3RFdmVudFBsdWdpbk9yZGVyID0g ZnVuY3Rpb24gKCkgeworICBvbGRJbmplY3RFdmVudFBsdWdpbk9yZGVyLmFwcGx5KHRoaXMsIGFy Z3VtZW50cyk7CisgIGJ1aWxkU2ltdWxhdG9ycygpOworfTsKK3ZhciBvbGRJbmplY3RFdmVudFBs dWdpbnMgPSBFdmVudFBsdWdpbkh1Yi5pbmplY3Rpb24uaW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1l OworRXZlbnRQbHVnaW5IdWIuaW5qZWN0aW9uLmluamVjdEV2ZW50UGx1Z2luc0J5TmFtZSA9IGZ1 bmN0aW9uICgpIHsKKyAgb2xkSW5qZWN0RXZlbnRQbHVnaW5zLmFwcGx5KHRoaXMsIGFyZ3VtZW50 cyk7CisgIGJ1aWxkU2ltdWxhdG9ycygpOworfTsKKworYnVpbGRTaW11bGF0b3JzKCk7CisKKy8q KgorICogRXhwb3J0czoKKyAqCisgKiAtIGBSZWFjdFRlc3RVdGlscy5TaW11bGF0ZU5hdGl2ZS5j bGljayhFbGVtZW50L1JlYWN0RE9NQ29tcG9uZW50KWAKKyAqIC0gYFJlYWN0VGVzdFV0aWxzLlNp bXVsYXRlTmF0aXZlLm1vdXNlTW92ZShFbGVtZW50L1JlYWN0RE9NQ29tcG9uZW50KWAKKyAqIC0g YFJlYWN0VGVzdFV0aWxzLlNpbXVsYXRlTmF0aXZlLm1vdXNlSW4vUmVhY3RET01Db21wb25lbnQp YAorICogLSBgUmVhY3RUZXN0VXRpbHMuU2ltdWxhdGVOYXRpdmUubW91c2VPdXQoRWxlbWVudC9S ZWFjdERPTUNvbXBvbmVudClgCisgKiAtIC4uLiAoQWxsIGtleXMgZnJvbSBgRXZlbnRDb25zdGFu dHMudG9wTGV2ZWxUeXBlc2ApCisgKgorICogTm90ZTogVG9wIGxldmVsIGV2ZW50IHR5cGVzIGFy ZSBhIHN1YnNldCBvZiB0aGUgZW50aXJlIHNldCBvZiBoYW5kbGVyIHR5cGVzCisgKiAod2hpY2gg aW5jbHVkZSBhIGJyb2FkZXIgc2V0IG9mICJzeW50aGV0aWMiIGV2ZW50cykuIEZvciBleGFtcGxl LCBvbkRyYWdEb25lCisgKiBpcyBhIHN5bnRoZXRpYyBldmVudC4gRXhjZXB0IHdoZW4gdGVzdGlu ZyBhbiBldmVudCBwbHVnaW4gb3IgUmVhY3QncyBldmVudAorICogaGFuZGxpbmcgY29kZSBzcGVj aWZpY2FsbHksIHlvdSBwcm9iYWJseSB3YW50IHRvIHVzZSBSZWFjdFRlc3RVdGlscy5TaW11bGF0 ZQorICogdG8gZGlzcGF0Y2ggc3ludGhldGljIGV2ZW50cy4KKyAqLworCitmdW5jdGlvbiBtYWtl TmF0aXZlU2ltdWxhdG9yKGV2ZW50VHlwZSkgeworICByZXR1cm4gZnVuY3Rpb24gKGRvbUNvbXBv bmVudE9yTm9kZSwgbmF0aXZlRXZlbnREYXRhKSB7CisgICAgdmFyIGZha2VOYXRpdmVFdmVudCA9 IG5ldyBFdmVudChldmVudFR5cGUpOworICAgIF9hc3NpZ24oZmFrZU5hdGl2ZUV2ZW50LCBuYXRp dmVFdmVudERhdGEpOworICAgIGlmIChSZWFjdFRlc3RVdGlscy5pc0RPTUNvbXBvbmVudChkb21D b21wb25lbnRPck5vZGUpKSB7CisgICAgICBSZWFjdFRlc3RVdGlscy5zaW11bGF0ZU5hdGl2ZUV2 ZW50T25ET01Db21wb25lbnQoZXZlbnRUeXBlLCBkb21Db21wb25lbnRPck5vZGUsIGZha2VOYXRp dmVFdmVudCk7CisgICAgfSBlbHNlIGlmIChkb21Db21wb25lbnRPck5vZGUudGFnTmFtZSkgewor ICAgICAgLy8gV2lsbCBhbGxvdyBvbiBhY3R1YWwgZG9tIG5vZGVzLgorICAgICAgUmVhY3RUZXN0 VXRpbHMuc2ltdWxhdGVOYXRpdmVFdmVudE9uTm9kZShldmVudFR5cGUsIGRvbUNvbXBvbmVudE9y Tm9kZSwgZmFrZU5hdGl2ZUV2ZW50KTsKKyAgICB9CisgIH07Cit9CisKK09iamVjdC5rZXlzKHRv cExldmVsVHlwZXMpLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50VHlwZSkgeworICAvLyBFdmVudCB0 eXBlIGlzIHN0b3JlZCBhcyAndG9wQ2xpY2snIC0gd2UgdHJhbnNmb3JtIHRoYXQgdG8gJ2NsaWNr JworICB2YXIgY29udmVuaWVuY2VOYW1lID0gZXZlbnRUeXBlLmluZGV4T2YoJ3RvcCcpID09PSAw ID8gZXZlbnRUeXBlLmNoYXJBdCgzKS50b0xvd2VyQ2FzZSgpICsgZXZlbnRUeXBlLnN1YnN0cig0 KSA6IGV2ZW50VHlwZTsKKyAgLyoqCisgICAqIEBwYXJhbSB7IUVsZW1lbnR8UmVhY3RET01Db21w b25lbnR9IGRvbUNvbXBvbmVudE9yTm9kZQorICAgKiBAcGFyYW0gez9FdmVudH0gbmF0aXZlRXZl bnREYXRhIEZha2UgbmF0aXZlIGV2ZW50IHRvIHVzZSBpbiBTeW50aGV0aWNFdmVudC4KKyAgICov CisgIFJlYWN0VGVzdFV0aWxzLlNpbXVsYXRlTmF0aXZlW2NvbnZlbmllbmNlTmFtZV0gPSBtYWtl TmF0aXZlU2ltdWxhdG9yKGV2ZW50VHlwZSk7Cit9KTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFj dFRlc3RVdGlsczsKK30seyIxMDgiOjEwOCwiMTI1IjoxMjUsIjEzNCI6MTM0LCIxNTAiOjE1MCwi MTU4IjoxNTgsIjE2IjoxNiwiMTciOjE3LCIxOCI6MTgsIjIwIjoyMCwiMjYiOjI2LCIzMSI6MzEs IjM0IjozNCwiNjMiOjYzLCI3OSI6NzksIjgyIjo4MiwiOTEiOjkxfV0sODE6W2Z1bmN0aW9uKF9k ZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxNS1wcmVzZW50LCBG YWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJj ZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0 aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2Ug dHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91 bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisK Kyd1c2Ugc3RyaWN0JzsKKwordmFyIF9wcm9kSW52YXJpYW50ID0gX2RlcmVxXygxMjUpOworCit2 YXIgUmVhY3RDdXJyZW50T3duZXIgPSBfZGVyZXFfKDEzMyk7Cit2YXIgUmVhY3RJbnN0YW5jZU1h cCA9IF9kZXJlcV8oNjMpOwordmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gX2RlcmVxXyg2NCk7 Cit2YXIgUmVhY3RVcGRhdGVzID0gX2RlcmVxXyg4Mik7CisKK3ZhciBpbnZhcmlhbnQgPSBfZGVy ZXFfKDE1MCk7Cit2YXIgd2FybmluZyA9IF9kZXJlcV8oMTU3KTsKKworZnVuY3Rpb24gZW5xdWV1 ZVVwZGF0ZShpbnRlcm5hbEluc3RhbmNlKSB7CisgIFJlYWN0VXBkYXRlcy5lbnF1ZXVlVXBkYXRl KGludGVybmFsSW5zdGFuY2UpOworfQorCitmdW5jdGlvbiBmb3JtYXRVbmV4cGVjdGVkQXJndW1l bnQoYXJnKSB7CisgIHZhciB0eXBlID0gdHlwZW9mIGFyZzsKKyAgaWYgKHR5cGUgIT09ICdvYmpl Y3QnKSB7CisgICAgcmV0dXJuIHR5cGU7CisgIH0KKyAgdmFyIGRpc3BsYXlOYW1lID0gYXJnLmNv bnN0cnVjdG9yICYmIGFyZy5jb25zdHJ1Y3Rvci5uYW1lIHx8IHR5cGU7CisgIHZhciBrZXlzID0g T2JqZWN0LmtleXMoYXJnKTsKKyAgaWYgKGtleXMubGVuZ3RoID4gMCAmJiBrZXlzLmxlbmd0aCA8 IDIwKSB7CisgICAgcmV0dXJuIGRpc3BsYXlOYW1lICsgJyAoa2V5czogJyArIGtleXMuam9pbign LCAnKSArICcpJzsKKyAgfQorICByZXR1cm4gZGlzcGxheU5hbWU7Cit9CisKK2Z1bmN0aW9uIGdl dEludGVybmFsSW5zdGFuY2VSZWFkeUZvclVwZGF0ZShwdWJsaWNJbnN0YW5jZSwgY2FsbGVyTmFt ZSkgeworICB2YXIgaW50ZXJuYWxJbnN0YW5jZSA9IFJlYWN0SW5zdGFuY2VNYXAuZ2V0KHB1Ymxp Y0luc3RhbmNlKTsKKyAgaWYgKCFpbnRlcm5hbEluc3RhbmNlKSB7CisgICAgaWYgKCJkZXZlbG9w bWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgdmFyIGN0b3IgPSBwdWJsaWNJbnN0YW5j ZS5jb25zdHJ1Y3RvcjsKKyAgICAgIC8vIE9ubHkgd2FybiB3aGVuIHdlIGhhdmUgYSBjYWxsZXJO YW1lLiBPdGhlcndpc2Ugd2Ugc2hvdWxkIGJlIHNpbGVudC4KKyAgICAgIC8vIFdlJ3JlIHByb2Jh Ymx5IGNhbGxpbmcgZnJvbSBlbnF1ZXVlQ2FsbGJhY2suIFdlIGRvbid0IHdhbnQgdG8gd2Fybgor ICAgICAgLy8gdGhlcmUgYmVjYXVzZSB3ZSBhbHJlYWR5IHdhcm5lZCBmb3IgdGhlIGNvcnJlc3Bv bmRpbmcgbGlmZWN5Y2xlIG1ldGhvZC4KKyAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0 aW9uJyA/IHdhcm5pbmcoIWNhbGxlck5hbWUsICclcyguLi4pOiBDYW4gb25seSB1cGRhdGUgYSBt b3VudGVkIG9yIG1vdW50aW5nIGNvbXBvbmVudC4gJyArICdUaGlzIHVzdWFsbHkgbWVhbnMgeW91 IGNhbGxlZCAlcygpIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuICcgKyAnVGhpcyBpcyBhIG5v LW9wLiBQbGVhc2UgY2hlY2sgdGhlIGNvZGUgZm9yIHRoZSAlcyBjb21wb25lbnQuJywgY2FsbGVy TmFtZSwgY2FsbGVyTmFtZSwgY3RvciAmJiAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUp IHx8ICdSZWFjdENsYXNzJykgOiB2b2lkIDA7CisgICAgfQorICAgIHJldHVybiBudWxsOworICB9 CisKKyAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICJkZXZlbG9w bWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoUmVhY3RDdXJyZW50T3duZXIuY3VycmVu dCA9PSBudWxsLCAnJXMoLi4uKTogQ2Fubm90IHVwZGF0ZSBkdXJpbmcgYW4gZXhpc3Rpbmcgc3Rh dGUgdHJhbnNpdGlvbiAoc3VjaCBhcyAnICsgJ3dpdGhpbiBgcmVuZGVyYCBvciBhbm90aGVyIGNv bXBvbmVudFwncyBjb25zdHJ1Y3RvcikuIFJlbmRlciBtZXRob2RzICcgKyAnc2hvdWxkIGJlIGEg cHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGU7IGNvbnN0cnVjdG9yICcgKyAnc2lkZS1l ZmZlY3RzIGFyZSBhbiBhbnRpLXBhdHRlcm4sIGJ1dCBjYW4gYmUgbW92ZWQgdG8gJyArICdgY29t cG9uZW50V2lsbE1vdW50YC4nLCBjYWxsZXJOYW1lKSA6IHZvaWQgMDsKKyAgfQorCisgIHJldHVy biBpbnRlcm5hbEluc3RhbmNlOworfQorCisvKioKKyAqIFJlYWN0VXBkYXRlUXVldWUgYWxsb3dz IGZvciBzdGF0ZSB1cGRhdGVzIHRvIGJlIHNjaGVkdWxlZCBpbnRvIGEgbGF0ZXIKKyAqIHJlY29u Y2lsaWF0aW9uIHN0ZXAuCisgKi8KK3ZhciBSZWFjdFVwZGF0ZVF1ZXVlID0geworCisgIC8qKgor ICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhpcyBjb21wb3NpdGUgY29tcG9uZW50IGlzIG1v dW50ZWQuCisgICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3Rh bmNlIHdlIHdhbnQgdG8gdGVzdC4KKyAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBtb3Vu dGVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAqIEBwcm90ZWN0ZWQKKyAgICogQGZpbmFsCisgICAq LworICBpc01vdW50ZWQ6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSkgeworICAgIGlmICgiZGV2 ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIHZhciBvd25lciA9IFJlYWN0Q3Vy cmVudE93bmVyLmN1cnJlbnQ7CisgICAgICBpZiAob3duZXIgIT09IG51bGwpIHsKKyAgICAgICAg ImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhvd25lci5fd2FybmVkQWJv dXRSZWZzSW5SZW5kZXIsICclcyBpcyBhY2Nlc3NpbmcgaXNNb3VudGVkIGluc2lkZSBpdHMgcmVu ZGVyKCkgZnVuY3Rpb24uICcgKyAncmVuZGVyKCkgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBv ZiBwcm9wcyBhbmQgc3RhdGUuIEl0IHNob3VsZCAnICsgJ25ldmVyIGFjY2VzcyBzb21ldGhpbmcg dGhhdCByZXF1aXJlcyBzdGFsZSBkYXRhIGZyb20gdGhlIHByZXZpb3VzICcgKyAncmVuZGVyLCBz dWNoIGFzIHJlZnMuIE1vdmUgdGhpcyBsb2dpYyB0byBjb21wb25lbnREaWRNb3VudCBhbmQgJyAr ICdjb21wb25lbnREaWRVcGRhdGUgaW5zdGVhZC4nLCBvd25lci5nZXROYW1lKCkgfHwgJ0EgY29t cG9uZW50JykgOiB2b2lkIDA7CisgICAgICAgIG93bmVyLl93YXJuZWRBYm91dFJlZnNJblJlbmRl ciA9IHRydWU7CisgICAgICB9CisgICAgfQorICAgIHZhciBpbnRlcm5hbEluc3RhbmNlID0gUmVh Y3RJbnN0YW5jZU1hcC5nZXQocHVibGljSW5zdGFuY2UpOworICAgIGlmIChpbnRlcm5hbEluc3Rh bmNlKSB7CisgICAgICAvLyBEdXJpbmcgY29tcG9uZW50V2lsbE1vdW50IGFuZCByZW5kZXIgdGhp cyB3aWxsIHN0aWxsIGJlIG51bGwgYnV0IGFmdGVyCisgICAgICAvLyB0aGF0IHdpbGwgYWx3YXlz IHJlbmRlciB0byBzb21ldGhpbmcuIEF0IGxlYXN0IGZvciBub3cuIFNvIHdlIGNhbiB1c2UKKyAg ICAgIC8vIHRoaXMgaGFjay4KKyAgICAgIHJldHVybiAhIWludGVybmFsSW5zdGFuY2UuX3JlbmRl cmVkQ29tcG9uZW50OworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQor ICB9LAorCisgIC8qKgorICAgKiBFbnF1ZXVlIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGV4ZWN1 dGVkIGFmdGVyIGFsbCB0aGUgcGVuZGluZyB1cGRhdGVzCisgICAqIGhhdmUgcHJvY2Vzc2VkLgor ICAgKgorICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5j ZSB0byB1c2UgYXMgYHRoaXNgIGNvbnRleHQuCisgICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxs YmFjayBDYWxsZWQgYWZ0ZXIgc3RhdGUgaXMgdXBkYXRlZC4KKyAgICogQHBhcmFtIHtzdHJpbmd9 IGNhbGxlck5hbWUgTmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQ SS4KKyAgICogQGludGVybmFsCisgICAqLworICBlbnF1ZXVlQ2FsbGJhY2s6IGZ1bmN0aW9uIChw dWJsaWNJbnN0YW5jZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHsKKyAgICBSZWFjdFVwZGF0ZVF1 ZXVlLnZhbGlkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGNhbGxlck5hbWUpOworICAgIHZhciBpbnRl cm5hbEluc3RhbmNlID0gZ2V0SW50ZXJuYWxJbnN0YW5jZVJlYWR5Rm9yVXBkYXRlKHB1YmxpY0lu c3RhbmNlKTsKKworICAgIC8vIFByZXZpb3VzbHkgd2Ugd291bGQgdGhyb3cgYW4gZXJyb3IgaWYg d2UgZGlkbid0IGhhdmUgYW4gaW50ZXJuYWwKKyAgICAvLyBpbnN0YW5jZS4gU2luY2Ugd2Ugd2Fu dCB0byBtYWtlIGl0IGEgbm8tb3AgaW5zdGVhZCwgd2UgbWlycm9yIHRoZSBzYW1lCisgICAgLy8g YmVoYXZpb3Igd2UgaGF2ZSBpbiBvdGhlciBlbnF1ZXVlKiBtZXRob2RzLgorICAgIC8vIFdlIGFs c28gbmVlZCB0byBpZ25vcmUgY2FsbGJhY2tzIGluIGNvbXBvbmVudFdpbGxNb3VudC4gU2VlCisg ICAgLy8gZW5xdWV1ZVVwZGF0ZXMuCisgICAgaWYgKCFpbnRlcm5hbEluc3RhbmNlKSB7CisgICAg ICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGlu Z0NhbGxiYWNrcykgeworICAgICAgaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ0NhbGxiYWNrcy5w dXNoKGNhbGxiYWNrKTsKKyAgICB9IGVsc2UgeworICAgICAgaW50ZXJuYWxJbnN0YW5jZS5fcGVu ZGluZ0NhbGxiYWNrcyA9IFtjYWxsYmFja107CisgICAgfQorICAgIC8vIFRPRE86IFRoZSBjYWxs YmFjayBoZXJlIGlzIGlnbm9yZWQgd2hlbiBzZXRTdGF0ZSBpcyBjYWxsZWQgZnJvbQorICAgIC8v IGNvbXBvbmVudFdpbGxNb3VudC4gRWl0aGVyIGZpeCBpdCBvciBkaXNhbGxvdyBkb2luZyBzbyBj b21wbGV0ZWx5IGluCisgICAgLy8gZmF2b3Igb2YgZ2V0SW5pdGlhbFN0YXRlLiBBbHRlcm5hdGl2 ZWx5LCB3ZSBjYW4gZGlzYWxsb3cKKyAgICAvLyBjb21wb25lbnRXaWxsTW91bnQgZHVyaW5nIHNl cnZlci1zaWRlIHJlbmRlcmluZy4KKyAgICBlbnF1ZXVlVXBkYXRlKGludGVybmFsSW5zdGFuY2Up OworICB9LAorCisgIGVucXVldWVDYWxsYmFja0ludGVybmFsOiBmdW5jdGlvbiAoaW50ZXJuYWxJ bnN0YW5jZSwgY2FsbGJhY2spIHsKKyAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ0Nh bGxiYWNrcykgeworICAgICAgaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ0NhbGxiYWNrcy5wdXNo KGNhbGxiYWNrKTsKKyAgICB9IGVsc2UgeworICAgICAgaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGlu Z0NhbGxiYWNrcyA9IFtjYWxsYmFja107CisgICAgfQorICAgIGVucXVldWVVcGRhdGUoaW50ZXJu YWxJbnN0YW5jZSk7CisgIH0sCisKKyAgLyoqCisgICAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMg c2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGgKKyAgICogY2VydGFp bnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uCisgICAqCisgICAq IFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVy IGFzcGVjdCBvZiB0aGUKKyAgICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBz ZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuCisgICAqCisgICAqIFRoaXMgd2lsbCBub3QgaW52b2tl IGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2UKKyAgICogYGNvbXBv bmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC4KKyAgICoKKyAgICogQHBh cmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQg cmVyZW5kZXIuCisgICAqIEBpbnRlcm5hbAorICAgKi8KKyAgZW5xdWV1ZUZvcmNlVXBkYXRlOiBm dW5jdGlvbiAocHVibGljSW5zdGFuY2UpIHsKKyAgICB2YXIgaW50ZXJuYWxJbnN0YW5jZSA9IGdl dEludGVybmFsSW5zdGFuY2VSZWFkeUZvclVwZGF0ZShwdWJsaWNJbnN0YW5jZSwgJ2ZvcmNlVXBk YXRlJyk7CisKKyAgICBpZiAoIWludGVybmFsSW5zdGFuY2UpIHsKKyAgICAgIHJldHVybjsKKyAg ICB9CisKKyAgICBpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nRm9yY2VVcGRhdGUgPSB0cnVlOwor CisgICAgZW5xdWV1ZVVwZGF0ZShpbnRlcm5hbEluc3RhbmNlKTsKKyAgfSwKKworICAvKioKKyAg ICogUmVwbGFjZXMgYWxsIG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIG9yIGBzZXRTdGF0 ZWAgdG8gbXV0YXRlIHN0YXRlLgorICAgKiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBh cyBpbW11dGFibGUuCisgICAqCisgICAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlz LnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvCisgICAqIGFjY2Vzc2luZyBg dGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQg dmFsdWUuCisgICAqCisgICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhl IGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLgorICAgKiBAcGFyYW0ge29iamVjdH0gY29t cGxldGVTdGF0ZSBOZXh0IHN0YXRlLgorICAgKiBAaW50ZXJuYWwKKyAgICovCisgIGVucXVldWVS ZXBsYWNlU3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY29tcGxldGVTdGF0ZSkgewor ICAgIHZhciBpbnRlcm5hbEluc3RhbmNlID0gZ2V0SW50ZXJuYWxJbnN0YW5jZVJlYWR5Rm9yVXBk YXRlKHB1YmxpY0luc3RhbmNlLCAncmVwbGFjZVN0YXRlJyk7CisKKyAgICBpZiAoIWludGVybmFs SW5zdGFuY2UpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnRlcm5hbEluc3RhbmNl Ll9wZW5kaW5nU3RhdGVRdWV1ZSA9IFtjb21wbGV0ZVN0YXRlXTsKKyAgICBpbnRlcm5hbEluc3Rh bmNlLl9wZW5kaW5nUmVwbGFjZVN0YXRlID0gdHJ1ZTsKKworICAgIGVucXVldWVVcGRhdGUoaW50 ZXJuYWxJbnN0YW5jZSk7CisgIH0sCisKKyAgLyoqCisgICAqIFNldHMgYSBzdWJzZXQgb2YgdGhl IHN0YXRlLiBUaGlzIG9ubHkgZXhpc3RzIGJlY2F1c2UgX3BlbmRpbmdTdGF0ZSBpcworICAgKiBp bnRlcm5hbC4gVGhpcyBwcm92aWRlcyBhIG1lcmdpbmcgc3RyYXRlZ3kgdGhhdCBpcyBub3QgYXZh aWxhYmxlIHRvIGRlZXAKKyAgICogcHJvcGVydGllcyB3aGljaCBpcyBjb25mdXNpbmcuIFRPRE86 IEV4cG9zZSBwZW5kaW5nU3RhdGUgb3IgZG9uJ3QgdXNlIGl0CisgICAqIGR1cmluZyB0aGUgbWVy Z2UuCisgICAqCisgICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGlu c3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLgorICAgKiBAcGFyYW0ge29iamVjdH0gcGFydGlh bFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBzdGF0ZS4KKyAgICog QGludGVybmFsCisgICAqLworICBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0 YW5jZSwgcGFydGlhbFN0YXRlKSB7CisgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0 aW9uJykgeworICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uU2V0U3RhdGUo KTsKKyAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcocGFydGlh bFN0YXRlICE9IG51bGwsICdzZXRTdGF0ZSguLi4pOiBZb3UgcGFzc2VkIGFuIHVuZGVmaW5lZCBv ciBudWxsIHN0YXRlIG9iamVjdDsgJyArICdpbnN0ZWFkLCB1c2UgZm9yY2VVcGRhdGUoKS4nKSA6 IHZvaWQgMDsKKyAgICB9CisKKyAgICB2YXIgaW50ZXJuYWxJbnN0YW5jZSA9IGdldEludGVybmFs SW5zdGFuY2VSZWFkeUZvclVwZGF0ZShwdWJsaWNJbnN0YW5jZSwgJ3NldFN0YXRlJyk7CisKKyAg ICBpZiAoIWludGVybmFsSW5zdGFuY2UpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2 YXIgcXVldWUgPSBpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nU3RhdGVRdWV1ZSB8fCAoaW50ZXJu YWxJbnN0YW5jZS5fcGVuZGluZ1N0YXRlUXVldWUgPSBbXSk7CisgICAgcXVldWUucHVzaChwYXJ0 aWFsU3RhdGUpOworCisgICAgZW5xdWV1ZVVwZGF0ZShpbnRlcm5hbEluc3RhbmNlKTsKKyAgfSwK KworICBlbnF1ZXVlRWxlbWVudEludGVybmFsOiBmdW5jdGlvbiAoaW50ZXJuYWxJbnN0YW5jZSwg bmV4dEVsZW1lbnQsIG5leHRDb250ZXh0KSB7CisgICAgaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGlu Z0VsZW1lbnQgPSBuZXh0RWxlbWVudDsKKyAgICAvLyBUT0RPOiBpbnRyb2R1Y2UgX3BlbmRpbmdD b250ZXh0IGluc3RlYWQgb2Ygc2V0dGluZyBpdCBkaXJlY3RseS4KKyAgICBpbnRlcm5hbEluc3Rh bmNlLl9jb250ZXh0ID0gbmV4dENvbnRleHQ7CisgICAgZW5xdWV1ZVVwZGF0ZShpbnRlcm5hbElu c3RhbmNlKTsKKyAgfSwKKworICB2YWxpZGF0ZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ss IGNhbGxlck5hbWUpIHsKKyAgICAhKCFjYWxsYmFjayB8fCB0eXBlb2YgY2FsbGJhY2sgPT09ICdm dW5jdGlvbicpID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZh bHNlLCAnJXMoLi4uKTogRXhwZWN0ZWQgdGhlIGxhc3Qgb3B0aW9uYWwgYGNhbGxiYWNrYCBhcmd1 bWVudCB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsZXJOYW1l LCBmb3JtYXRVbmV4cGVjdGVkQXJndW1lbnQoY2FsbGJhY2spKSA6IF9wcm9kSW52YXJpYW50KCcx MjInLCBjYWxsZXJOYW1lLCBmb3JtYXRVbmV4cGVjdGVkQXJndW1lbnQoY2FsbGJhY2spKSA6IHZv aWQgMDsKKyAgfQorCit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0VXBkYXRlUXVldWU7Cit9 LHsiMTI1IjoxMjUsIjEzMyI6MTMzLCIxNTAiOjE1MCwiMTU3IjoxNTcsIjYzIjo2MywiNjQiOjY0 LCI4MiI6ODJ9XSw4MjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAq IENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJl c2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJT RC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290 IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBv ZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBz YW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX3Byb2RJbnZh cmlhbnQgPSBfZGVyZXFfKDEyNSksCisgICAgX2Fzc2lnbiA9IF9kZXJlcV8oMTU4KTsKKwordmFy IENhbGxiYWNrUXVldWUgPSBfZGVyZXFfKDYpOwordmFyIFBvb2xlZENsYXNzID0gX2RlcmVxXygy NSk7Cit2YXIgUmVhY3RGZWF0dXJlRmxhZ3MgPSBfZGVyZXFfKDU4KTsKK3ZhciBSZWFjdFJlY29u Y2lsZXIgPSBfZGVyZXFfKDc1KTsKK3ZhciBUcmFuc2FjdGlvbiA9IF9kZXJlcV8oMTAwKTsKKwor dmFyIGludmFyaWFudCA9IF9kZXJlcV8oMTUwKTsKKwordmFyIGRpcnR5Q29tcG9uZW50cyA9IFtd OwordmFyIHVwZGF0ZUJhdGNoTnVtYmVyID0gMDsKK3ZhciBhc2FwQ2FsbGJhY2tRdWV1ZSA9IENh bGxiYWNrUXVldWUuZ2V0UG9vbGVkKCk7Cit2YXIgYXNhcEVucXVldWVkID0gZmFsc2U7CisKK3Zh ciBiYXRjaGluZ1N0cmF0ZWd5ID0gbnVsbDsKKworZnVuY3Rpb24gZW5zdXJlSW5qZWN0ZWQoKSB7 CisgICEoUmVhY3RVcGRhdGVzLlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24gJiYgYmF0Y2hpbmdT dHJhdGVneSkgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFs c2UsICdSZWFjdFVwZGF0ZXM6IG11c3QgaW5qZWN0IGEgcmVjb25jaWxlIHRyYW5zYWN0aW9uIGNs YXNzIGFuZCBiYXRjaGluZyBzdHJhdGVneScpIDogX3Byb2RJbnZhcmlhbnQoJzEyMycpIDogdm9p ZCAwOworfQorCit2YXIgTkVTVEVEX1VQREFURVMgPSB7CisgIGluaXRpYWxpemU6IGZ1bmN0aW9u ICgpIHsKKyAgICB0aGlzLmRpcnR5Q29tcG9uZW50c0xlbmd0aCA9IGRpcnR5Q29tcG9uZW50cy5s ZW5ndGg7CisgIH0sCisgIGNsb3NlOiBmdW5jdGlvbiAoKSB7CisgICAgaWYgKHRoaXMuZGlydHlD b21wb25lbnRzTGVuZ3RoICE9PSBkaXJ0eUNvbXBvbmVudHMubGVuZ3RoKSB7CisgICAgICAvLyBB ZGRpdGlvbmFsIHVwZGF0ZXMgd2VyZSBlbnF1ZXVlZCBieSBjb21wb25lbnREaWRVcGRhdGUgaGFu ZGxlcnMgb3IKKyAgICAgIC8vIHNpbWlsYXI7IGJlZm9yZSBvdXIgb3duIFVQREFURV9RVUVVRUlO RyB3cmFwcGVyIGNsb3Nlcywgd2Ugd2FudCB0byBydW4KKyAgICAgIC8vIHRoZXNlIG5ldyB1cGRh dGVzIHNvIHRoYXQgaWYgQSdzIGNvbXBvbmVudERpZFVwZGF0ZSBjYWxscyBzZXRTdGF0ZSBvbgor ICAgICAgLy8gQiwgQiB3aWxsIHVwZGF0ZSBiZWZvcmUgdGhlIGNhbGxiYWNrIEEncyB1cGRhdGVy IHByb3ZpZGVkIHdoZW4gY2FsbGluZworICAgICAgLy8gc2V0U3RhdGUuCisgICAgICBkaXJ0eUNv bXBvbmVudHMuc3BsaWNlKDAsIHRoaXMuZGlydHlDb21wb25lbnRzTGVuZ3RoKTsKKyAgICAgIGZs dXNoQmF0Y2hlZFVwZGF0ZXMoKTsKKyAgICB9IGVsc2UgeworICAgICAgZGlydHlDb21wb25lbnRz Lmxlbmd0aCA9IDA7CisgICAgfQorICB9Cit9OworCit2YXIgVVBEQVRFX1FVRVVFSU5HID0gewor ICBpbml0aWFsaXplOiBmdW5jdGlvbiAoKSB7CisgICAgdGhpcy5jYWxsYmFja1F1ZXVlLnJlc2V0 KCk7CisgIH0sCisgIGNsb3NlOiBmdW5jdGlvbiAoKSB7CisgICAgdGhpcy5jYWxsYmFja1F1ZXVl Lm5vdGlmeUFsbCgpOworICB9Cit9OworCit2YXIgVFJBTlNBQ1RJT05fV1JBUFBFUlMgPSBbTkVT VEVEX1VQREFURVMsIFVQREFURV9RVUVVRUlOR107CisKK2Z1bmN0aW9uIFJlYWN0VXBkYXRlc0Zs dXNoVHJhbnNhY3Rpb24oKSB7CisgIHRoaXMucmVpbml0aWFsaXplVHJhbnNhY3Rpb24oKTsKKyAg dGhpcy5kaXJ0eUNvbXBvbmVudHNMZW5ndGggPSBudWxsOworICB0aGlzLmNhbGxiYWNrUXVldWUg PSBDYWxsYmFja1F1ZXVlLmdldFBvb2xlZCgpOworICB0aGlzLnJlY29uY2lsZVRyYW5zYWN0aW9u ID0gUmVhY3RVcGRhdGVzLlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24uZ2V0UG9vbGVkKAorICAv KiB1c2VDcmVhdGVFbGVtZW50ICovdHJ1ZSk7Cit9CisKK19hc3NpZ24oUmVhY3RVcGRhdGVzRmx1 c2hUcmFuc2FjdGlvbi5wcm90b3R5cGUsIFRyYW5zYWN0aW9uLCB7CisgIGdldFRyYW5zYWN0aW9u V3JhcHBlcnM6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gVFJBTlNBQ1RJT05fV1JBUFBFUlM7 CisgIH0sCisKKyAgZGVzdHJ1Y3RvcjogZnVuY3Rpb24gKCkgeworICAgIHRoaXMuZGlydHlDb21w b25lbnRzTGVuZ3RoID0gbnVsbDsKKyAgICBDYWxsYmFja1F1ZXVlLnJlbGVhc2UodGhpcy5jYWxs YmFja1F1ZXVlKTsKKyAgICB0aGlzLmNhbGxiYWNrUXVldWUgPSBudWxsOworICAgIFJlYWN0VXBk YXRlcy5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uLnJlbGVhc2UodGhpcy5yZWNvbmNpbGVUcmFu c2FjdGlvbik7CisgICAgdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbiA9IG51bGw7CisgIH0sCisK KyAgcGVyZm9ybTogZnVuY3Rpb24gKG1ldGhvZCwgc2NvcGUsIGEpIHsKKyAgICAvLyBFc3NlbnRp YWxseSBjYWxscyBgdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbi5wZXJmb3JtKG1ldGhvZCwgc2Nv cGUsIGEpYAorICAgIC8vIHdpdGggdGhpcyB0cmFuc2FjdGlvbidzIHdyYXBwZXJzIGFyb3VuZCBp dC4KKyAgICByZXR1cm4gVHJhbnNhY3Rpb24ucGVyZm9ybS5jYWxsKHRoaXMsIHRoaXMucmVjb25j aWxlVHJhbnNhY3Rpb24ucGVyZm9ybSwgdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbiwgbWV0aG9k LCBzY29wZSwgYSk7CisgIH0KK30pOworCitQb29sZWRDbGFzcy5hZGRQb29saW5nVG8oUmVhY3RV cGRhdGVzRmx1c2hUcmFuc2FjdGlvbik7CisKK2Z1bmN0aW9uIGJhdGNoZWRVcGRhdGVzKGNhbGxi YWNrLCBhLCBiLCBjLCBkLCBlKSB7CisgIGVuc3VyZUluamVjdGVkKCk7CisgIHJldHVybiBiYXRj aGluZ1N0cmF0ZWd5LmJhdGNoZWRVcGRhdGVzKGNhbGxiYWNrLCBhLCBiLCBjLCBkLCBlKTsKK30K KworLyoqCisgKiBBcnJheSBjb21wYXJhdG9yIGZvciBSZWFjdENvbXBvbmVudHMgYnkgbW91bnQg b3JkZXJpbmcuCisgKgorICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gYzEgZmlyc3QgY29tcG9u ZW50IHlvdSdyZSBjb21wYXJpbmcKKyAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGMyIHNlY29u ZCBjb21wb25lbnQgeW91J3JlIGNvbXBhcmluZworICogQHJldHVybiB7bnVtYmVyfSBSZXR1cm4g dmFsdWUgdXNhYmxlIGJ5IEFycmF5LnByb3RvdHlwZS5zb3J0KCkuCisgKi8KK2Z1bmN0aW9uIG1v dW50T3JkZXJDb21wYXJhdG9yKGMxLCBjMikgeworICByZXR1cm4gYzEuX21vdW50T3JkZXIgLSBj Mi5fbW91bnRPcmRlcjsKK30KKworZnVuY3Rpb24gcnVuQmF0Y2hlZFVwZGF0ZXModHJhbnNhY3Rp b24pIHsKKyAgdmFyIGxlbiA9IHRyYW5zYWN0aW9uLmRpcnR5Q29tcG9uZW50c0xlbmd0aDsKKyAg IShsZW4gPT09IGRpcnR5Q29tcG9uZW50cy5sZW5ndGgpID8gImRldmVsb3BtZW50IiAhPT0gJ3By b2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgZmx1c2ggdHJhbnNhY3Rpb25c J3Mgc3RvcmVkIGRpcnR5LWNvbXBvbmVudHMgbGVuZ3RoICglcykgdG8gbWF0Y2ggZGlydHktY29t cG9uZW50cyBhcnJheSBsZW5ndGggKCVzKS4nLCBsZW4sIGRpcnR5Q29tcG9uZW50cy5sZW5ndGgp IDogX3Byb2RJbnZhcmlhbnQoJzEyNCcsIGxlbiwgZGlydHlDb21wb25lbnRzLmxlbmd0aCkgOiB2 b2lkIDA7CisKKyAgLy8gU2luY2UgcmVjb25jaWxpbmcgYSBjb21wb25lbnQgaGlnaGVyIGluIHRo ZSBvd25lciBoaWVyYXJjaHkgdXN1YWxseSAobm90CisgIC8vIGFsd2F5cyAtLSBzZWUgc2hvdWxk Q29tcG9uZW50VXBkYXRlKCkpIHdpbGwgcmVjb25jaWxlIGNoaWxkcmVuLCByZWNvbmNpbGUKKyAg Ly8gdGhlbSBiZWZvcmUgdGhlaXIgY2hpbGRyZW4gYnkgc29ydGluZyB0aGUgYXJyYXkuCisgIGRp cnR5Q29tcG9uZW50cy5zb3J0KG1vdW50T3JkZXJDb21wYXJhdG9yKTsKKworICAvLyBBbnkgdXBk YXRlcyBlbnF1ZXVlZCB3aGlsZSByZWNvbmNpbGluZyBtdXN0IGJlIHBlcmZvcm1lZCBhZnRlciB0 aGlzIGVudGlyZQorICAvLyBiYXRjaC4gT3RoZXJ3aXNlLCBpZiBkaXJ0eUNvbXBvbmVudHMgaXMg W0EsIEJdIHdoZXJlIEEgaGFzIGNoaWxkcmVuIEIgYW5kCisgIC8vIEMsIEIgY291bGQgdXBkYXRl IHR3aWNlIGluIGEgc2luZ2xlIGJhdGNoIGlmIEMncyByZW5kZXIgZW5xdWV1ZXMgYW4gdXBkYXRl CisgIC8vIHRvIEIgKHNpbmNlIEIgd291bGQgaGF2ZSBhbHJlYWR5IHVwZGF0ZWQsIHdlIHNob3Vs ZCBza2lwIGl0LCBhbmQgdGhlIG9ubHkKKyAgLy8gd2F5IHdlIGNhbiBrbm93IHRvIGRvIHNvIGlz IGJ5IGNoZWNraW5nIHRoZSBiYXRjaCBjb3VudGVyKS4KKyAgdXBkYXRlQmF0Y2hOdW1iZXIrKzsK KworICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgLy8gSWYgYSBjb21wb25l bnQgaXMgdW5tb3VudGVkIGJlZm9yZSBwZW5kaW5nIGNoYW5nZXMgYXBwbHksIGl0IHdpbGwgc3Rp bGwKKyAgICAvLyBiZSBoZXJlLCBidXQgd2UgYXNzdW1lIHRoYXQgaXQgaGFzIGNsZWFyZWQgaXRz IF9wZW5kaW5nQ2FsbGJhY2tzIGFuZAorICAgIC8vIHRoYXQgcGVyZm9ybVVwZGF0ZUlmTmVjZXNz YXJ5IGlzIGEgbm9vcC4KKyAgICB2YXIgY29tcG9uZW50ID0gZGlydHlDb21wb25lbnRzW2ldOwor CisgICAgLy8gSWYgcGVyZm9ybVVwZGF0ZUlmTmVjZXNzYXJ5IGhhcHBlbnMgdG8gZW5xdWV1ZSBh bnkgbmV3IHVwZGF0ZXMsIHdlCisgICAgLy8gc2hvdWxkbid0IGV4ZWN1dGUgdGhlIGNhbGxiYWNr cyB1bnRpbCB0aGUgbmV4dCByZW5kZXIgaGFwcGVucywgc28KKyAgICAvLyBzdGFzaCB0aGUgY2Fs bGJhY2tzIGZpcnN0CisgICAgdmFyIGNhbGxiYWNrcyA9IGNvbXBvbmVudC5fcGVuZGluZ0NhbGxi YWNrczsKKyAgICBjb21wb25lbnQuX3BlbmRpbmdDYWxsYmFja3MgPSBudWxsOworCisgICAgdmFy IG1hcmtlck5hbWU7CisgICAgaWYgKFJlYWN0RmVhdHVyZUZsYWdzLmxvZ1RvcExldmVsUmVuZGVy cykgeworICAgICAgdmFyIG5hbWVkQ29tcG9uZW50ID0gY29tcG9uZW50OworICAgICAgLy8gRHVj ayB0eXBlIFRvcExldmVsV3JhcHBlci4gVGhpcyBpcyBwcm9iYWJseSBhbHdheXMgdHJ1ZS4KKyAg ICAgIGlmIChjb21wb25lbnQuX2N1cnJlbnRFbGVtZW50LnR5cGUuaXNSZWFjdFRvcExldmVsV3Jh cHBlcikgeworICAgICAgICBuYW1lZENvbXBvbmVudCA9IGNvbXBvbmVudC5fcmVuZGVyZWRDb21w b25lbnQ7CisgICAgICB9CisgICAgICBtYXJrZXJOYW1lID0gJ1JlYWN0IHVwZGF0ZTogJyArIG5h bWVkQ29tcG9uZW50LmdldE5hbWUoKTsKKyAgICAgIGNvbnNvbGUudGltZShtYXJrZXJOYW1lKTsK KyAgICB9CisKKyAgICBSZWFjdFJlY29uY2lsZXIucGVyZm9ybVVwZGF0ZUlmTmVjZXNzYXJ5KGNv bXBvbmVudCwgdHJhbnNhY3Rpb24ucmVjb25jaWxlVHJhbnNhY3Rpb24sIHVwZGF0ZUJhdGNoTnVt YmVyKTsKKworICAgIGlmIChtYXJrZXJOYW1lKSB7CisgICAgICBjb25zb2xlLnRpbWVFbmQobWFy a2VyTmFtZSk7CisgICAgfQorCisgICAgaWYgKGNhbGxiYWNrcykgeworICAgICAgZm9yICh2YXIg aiA9IDA7IGogPCBjYWxsYmFja3MubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgdHJhbnNhY3Rpb24u Y2FsbGJhY2tRdWV1ZS5lbnF1ZXVlKGNhbGxiYWNrc1tqXSwgY29tcG9uZW50LmdldFB1YmxpY0lu c3RhbmNlKCkpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2YXIgZmx1c2hCYXRjaGVkVXBk YXRlcyA9IGZ1bmN0aW9uICgpIHsKKyAgLy8gUmVhY3RVcGRhdGVzRmx1c2hUcmFuc2FjdGlvbidz IHdyYXBwZXJzIHdpbGwgY2xlYXIgdGhlIGRpcnR5Q29tcG9uZW50cworICAvLyBhcnJheSBhbmQg cGVyZm9ybSBhbnkgdXBkYXRlcyBlbnF1ZXVlZCBieSBtb3VudC1yZWFkeSBoYW5kbGVycyAoaS5l LiwKKyAgLy8gY29tcG9uZW50RGlkVXBkYXRlKSBidXQgd2UgbmVlZCB0byBjaGVjayBoZXJlIHRv byBpbiBvcmRlciB0byBjYXRjaAorICAvLyB1cGRhdGVzIGVucXVldWVkIGJ5IHNldFN0YXRlIGNh bGxiYWNrcyBhbmQgYXNhcCBjYWxscy4KKyAgd2hpbGUgKGRpcnR5Q29tcG9uZW50cy5sZW5ndGgg fHwgYXNhcEVucXVldWVkKSB7CisgICAgaWYgKGRpcnR5Q29tcG9uZW50cy5sZW5ndGgpIHsKKyAg ICAgIHZhciB0cmFuc2FjdGlvbiA9IFJlYWN0VXBkYXRlc0ZsdXNoVHJhbnNhY3Rpb24uZ2V0UG9v bGVkKCk7CisgICAgICB0cmFuc2FjdGlvbi5wZXJmb3JtKHJ1bkJhdGNoZWRVcGRhdGVzLCBudWxs LCB0cmFuc2FjdGlvbik7CisgICAgICBSZWFjdFVwZGF0ZXNGbHVzaFRyYW5zYWN0aW9uLnJlbGVh c2UodHJhbnNhY3Rpb24pOworICAgIH0KKworICAgIGlmIChhc2FwRW5xdWV1ZWQpIHsKKyAgICAg IGFzYXBFbnF1ZXVlZCA9IGZhbHNlOworICAgICAgdmFyIHF1ZXVlID0gYXNhcENhbGxiYWNrUXVl dWU7CisgICAgICBhc2FwQ2FsbGJhY2tRdWV1ZSA9IENhbGxiYWNrUXVldWUuZ2V0UG9vbGVkKCk7 CisgICAgICBxdWV1ZS5ub3RpZnlBbGwoKTsKKyAgICAgIENhbGxiYWNrUXVldWUucmVsZWFzZShx dWV1ZSk7CisgICAgfQorICB9Cit9OworCisvKioKKyAqIE1hcmsgYSBjb21wb25lbnQgYXMgbmVl ZGluZyBhIHJlcmVuZGVyLCBhZGRpbmcgYW4gb3B0aW9uYWwgY2FsbGJhY2sgdG8gYQorICogbGlz dCBvZiBmdW5jdGlvbnMgd2hpY2ggd2lsbCBiZSBleGVjdXRlZCBvbmNlIHRoZSByZXJlbmRlciBv Y2N1cnMuCisgKi8KK2Z1bmN0aW9uIGVucXVldWVVcGRhdGUoY29tcG9uZW50KSB7CisgIGVuc3Vy ZUluamVjdGVkKCk7CisKKyAgLy8gVmFyaW91cyBwYXJ0cyBvZiBvdXIgY29kZSAoc3VjaCBhcyBS ZWFjdENvbXBvc2l0ZUNvbXBvbmVudCdzCisgIC8vIF9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnQp IGFzc3VtZSB0aGF0IGNhbGxzIHRvIHJlbmRlciBhcmVuJ3QgbmVzdGVkOworICAvLyB2ZXJpZnkg dGhhdCB0aGF0J3MgdGhlIGNhc2UuIChUaGlzIGlzIGNhbGxlZCBieSBlYWNoIHRvcC1sZXZlbCB1 cGRhdGUKKyAgLy8gZnVuY3Rpb24sIGxpa2Ugc2V0U3RhdGUsIGZvcmNlVXBkYXRlLCBldGMuOyBj cmVhdGlvbiBhbmQKKyAgLy8gZGVzdHJ1Y3Rpb24gb2YgdG9wLWxldmVsIGNvbXBvbmVudHMgaXMg Z3VhcmRlZCBpbiBSZWFjdE1vdW50LikKKworICBpZiAoIWJhdGNoaW5nU3RyYXRlZ3kuaXNCYXRj aGluZ1VwZGF0ZXMpIHsKKyAgICBiYXRjaGluZ1N0cmF0ZWd5LmJhdGNoZWRVcGRhdGVzKGVucXVl dWVVcGRhdGUsIGNvbXBvbmVudCk7CisgICAgcmV0dXJuOworICB9CisKKyAgZGlydHlDb21wb25l bnRzLnB1c2goY29tcG9uZW50KTsKKyAgaWYgKGNvbXBvbmVudC5fdXBkYXRlQmF0Y2hOdW1iZXIg PT0gbnVsbCkgeworICAgIGNvbXBvbmVudC5fdXBkYXRlQmF0Y2hOdW1iZXIgPSB1cGRhdGVCYXRj aE51bWJlciArIDE7CisgIH0KK30KKworLyoqCisgKiBFbnF1ZXVlIGEgY2FsbGJhY2sgdG8gYmUg cnVuIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgYmF0Y2hpbmcgY3ljbGUuIFRocm93cworICog aWYgbm8gdXBkYXRlcyBhcmUgY3VycmVudGx5IGJlaW5nIHBlcmZvcm1lZC4KKyAqLworZnVuY3Rp b24gYXNhcChjYWxsYmFjaywgY29udGV4dCkgeworICAhYmF0Y2hpbmdTdHJhdGVneS5pc0JhdGNo aW5nVXBkYXRlcyA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChm YWxzZSwgJ1JlYWN0VXBkYXRlcy5hc2FwOiBDYW5cJ3QgZW5xdWV1ZSBhbiBhc2FwIGNhbGxiYWNr IGluIGEgY29udGV4dCB3aGVyZXVwZGF0ZXMgYXJlIG5vdCBiZWluZyBiYXRjaGVkLicpIDogX3By b2RJbnZhcmlhbnQoJzEyNScpIDogdm9pZCAwOworICBhc2FwQ2FsbGJhY2tRdWV1ZS5lbnF1ZXVl KGNhbGxiYWNrLCBjb250ZXh0KTsKKyAgYXNhcEVucXVldWVkID0gdHJ1ZTsKK30KKwordmFyIFJl YWN0VXBkYXRlc0luamVjdGlvbiA9IHsKKyAgaW5qZWN0UmVjb25jaWxlVHJhbnNhY3Rpb246IGZ1 bmN0aW9uIChSZWNvbmNpbGVUcmFuc2FjdGlvbikgeworICAgICFSZWNvbmNpbGVUcmFuc2FjdGlv biA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1Jl YWN0VXBkYXRlczogbXVzdCBwcm92aWRlIGEgcmVjb25jaWxlIHRyYW5zYWN0aW9uIGNsYXNzJykg OiBfcHJvZEludmFyaWFudCgnMTI2JykgOiB2b2lkIDA7CisgICAgUmVhY3RVcGRhdGVzLlJlYWN0 UmVjb25jaWxlVHJhbnNhY3Rpb24gPSBSZWNvbmNpbGVUcmFuc2FjdGlvbjsKKyAgfSwKKworICBp bmplY3RCYXRjaGluZ1N0cmF0ZWd5OiBmdW5jdGlvbiAoX2JhdGNoaW5nU3RyYXRlZ3kpIHsKKyAg ICAhX2JhdGNoaW5nU3RyYXRlZ3kgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBp bnZhcmlhbnQoZmFsc2UsICdSZWFjdFVwZGF0ZXM6IG11c3QgcHJvdmlkZSBhIGJhdGNoaW5nIHN0 cmF0ZWd5JykgOiBfcHJvZEludmFyaWFudCgnMTI3JykgOiB2b2lkIDA7CisgICAgISh0eXBlb2Yg X2JhdGNoaW5nU3RyYXRlZ3kuYmF0Y2hlZFVwZGF0ZXMgPT09ICdmdW5jdGlvbicpID8gImRldmVs b3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RVcGRhdGVz OiBtdXN0IHByb3ZpZGUgYSBiYXRjaGVkVXBkYXRlcygpIGZ1bmN0aW9uJykgOiBfcHJvZEludmFy aWFudCgnMTI4JykgOiB2b2lkIDA7CisgICAgISh0eXBlb2YgX2JhdGNoaW5nU3RyYXRlZ3kuaXNC YXRjaGluZ1VwZGF0ZXMgPT09ICdib29sZWFuJykgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVj dGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdFVwZGF0ZXM6IG11c3QgcHJvdmlkZSBhbiBp c0JhdGNoaW5nVXBkYXRlcyBib29sZWFuIGF0dHJpYnV0ZScpIDogX3Byb2RJbnZhcmlhbnQoJzEy OScpIDogdm9pZCAwOworICAgIGJhdGNoaW5nU3RyYXRlZ3kgPSBfYmF0Y2hpbmdTdHJhdGVneTsK KyAgfQorfTsKKwordmFyIFJlYWN0VXBkYXRlcyA9IHsKKyAgLyoqCisgICAqIFJlYWN0IHJlZmVy ZW5jZXMgYFJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb25gIHVzaW5nIHRoaXMgcHJvcGVydHkgaW4g b3JkZXIKKyAgICogdG8gYWxsb3cgZGVwZW5kZW5jeSBpbmplY3Rpb24uCisgICAqCisgICAqIEBp bnRlcm5hbAorICAgKi8KKyAgUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbjogbnVsbCwKKworICBi YXRjaGVkVXBkYXRlczogYmF0Y2hlZFVwZGF0ZXMsCisgIGVucXVldWVVcGRhdGU6IGVucXVldWVV cGRhdGUsCisgIGZsdXNoQmF0Y2hlZFVwZGF0ZXM6IGZsdXNoQmF0Y2hlZFVwZGF0ZXMsCisgIGlu amVjdGlvbjogUmVhY3RVcGRhdGVzSW5qZWN0aW9uLAorICBhc2FwOiBhc2FwCit9OworCittb2R1 bGUuZXhwb3J0cyA9IFJlYWN0VXBkYXRlczsKK30seyIxMDAiOjEwMCwiMTI1IjoxMjUsIjE1MCI6 MTUwLCIxNTgiOjE1OCwiMjUiOjI1LCI1OCI6NTgsIjYiOjYsIjc1Ijo3NX1dLDgzOltmdW5jdGlv bihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2Vu dCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBz b3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQg aW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291 cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJl IGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAq LworCisndXNlIHN0cmljdCc7CisKK21vZHVsZS5leHBvcnRzID0gJzE1LjQuMic7Cit9LHt9XSw4 NDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAy MDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK KyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNl bnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBv ZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmln aHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9y eS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgTlMgPSB7CisgIHhsaW5rOiAnaHR0 cDovL3d3dy53My5vcmcvMTk5OS94bGluaycsCisgIHhtbDogJ2h0dHA6Ly93d3cudzMub3JnL1hN TC8xOTk4L25hbWVzcGFjZScKK307CisKKy8vIFdlIHVzZSBhdHRyaWJ1dGVzIGZvciBldmVyeXRo aW5nIFNWRyBzbyBsZXQncyBhdm9pZCBzb21lIGR1cGxpY2F0aW9uIGFuZCBydW4KKy8vIGNvZGUg aW5zdGVhZC4KKy8vIFRoZSBmb2xsb3dpbmcgYXJlIGFsbCBzcGVjaWZpZWQgaW4gdGhlIEhUTUwg Y29uZmlnIGFscmVhZHkgc28gd2UgZXhjbHVkZSBoZXJlLgorLy8gLSBjbGFzcyAoYXMgY2xhc3NO YW1lKQorLy8gLSBjb2xvcgorLy8gLSBoZWlnaHQKKy8vIC0gaWQKKy8vIC0gbGFuZworLy8gLSBt YXgKKy8vIC0gbWVkaWEKKy8vIC0gbWV0aG9kCisvLyAtIG1pbgorLy8gLSBuYW1lCisvLyAtIHN0 eWxlCisvLyAtIHRhcmdldAorLy8gLSB0eXBlCisvLyAtIHdpZHRoCit2YXIgQVRUUlMgPSB7Cisg IGFjY2VudEhlaWdodDogJ2FjY2VudC1oZWlnaHQnLAorICBhY2N1bXVsYXRlOiAwLAorICBhZGRp dGl2ZTogMCwKKyAgYWxpZ25tZW50QmFzZWxpbmU6ICdhbGlnbm1lbnQtYmFzZWxpbmUnLAorICBh bGxvd1Jlb3JkZXI6ICdhbGxvd1Jlb3JkZXInLAorICBhbHBoYWJldGljOiAwLAorICBhbXBsaXR1 ZGU6IDAsCisgIGFyYWJpY0Zvcm06ICdhcmFiaWMtZm9ybScsCisgIGFzY2VudDogMCwKKyAgYXR0 cmlidXRlTmFtZTogJ2F0dHJpYnV0ZU5hbWUnLAorICBhdHRyaWJ1dGVUeXBlOiAnYXR0cmlidXRl VHlwZScsCisgIGF1dG9SZXZlcnNlOiAnYXV0b1JldmVyc2UnLAorICBhemltdXRoOiAwLAorICBi YXNlRnJlcXVlbmN5OiAnYmFzZUZyZXF1ZW5jeScsCisgIGJhc2VQcm9maWxlOiAnYmFzZVByb2Zp bGUnLAorICBiYXNlbGluZVNoaWZ0OiAnYmFzZWxpbmUtc2hpZnQnLAorICBiYm94OiAwLAorICBi ZWdpbjogMCwKKyAgYmlhczogMCwKKyAgYnk6IDAsCisgIGNhbGNNb2RlOiAnY2FsY01vZGUnLAor ICBjYXBIZWlnaHQ6ICdjYXAtaGVpZ2h0JywKKyAgY2xpcDogMCwKKyAgY2xpcFBhdGg6ICdjbGlw LXBhdGgnLAorICBjbGlwUnVsZTogJ2NsaXAtcnVsZScsCisgIGNsaXBQYXRoVW5pdHM6ICdjbGlw UGF0aFVuaXRzJywKKyAgY29sb3JJbnRlcnBvbGF0aW9uOiAnY29sb3ItaW50ZXJwb2xhdGlvbics CisgIGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnM6ICdjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRl cnMnLAorICBjb2xvclByb2ZpbGU6ICdjb2xvci1wcm9maWxlJywKKyAgY29sb3JSZW5kZXJpbmc6 ICdjb2xvci1yZW5kZXJpbmcnLAorICBjb250ZW50U2NyaXB0VHlwZTogJ2NvbnRlbnRTY3JpcHRU eXBlJywKKyAgY29udGVudFN0eWxlVHlwZTogJ2NvbnRlbnRTdHlsZVR5cGUnLAorICBjdXJzb3I6 IDAsCisgIGN4OiAwLAorICBjeTogMCwKKyAgZDogMCwKKyAgZGVjZWxlcmF0ZTogMCwKKyAgZGVz Y2VudDogMCwKKyAgZGlmZnVzZUNvbnN0YW50OiAnZGlmZnVzZUNvbnN0YW50JywKKyAgZGlyZWN0 aW9uOiAwLAorICBkaXNwbGF5OiAwLAorICBkaXZpc29yOiAwLAorICBkb21pbmFudEJhc2VsaW5l OiAnZG9taW5hbnQtYmFzZWxpbmUnLAorICBkdXI6IDAsCisgIGR4OiAwLAorICBkeTogMCwKKyAg ZWRnZU1vZGU6ICdlZGdlTW9kZScsCisgIGVsZXZhdGlvbjogMCwKKyAgZW5hYmxlQmFja2dyb3Vu ZDogJ2VuYWJsZS1iYWNrZ3JvdW5kJywKKyAgZW5kOiAwLAorICBleHBvbmVudDogMCwKKyAgZXh0 ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZDogJ2V4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQnLAorICBm aWxsOiAwLAorICBmaWxsT3BhY2l0eTogJ2ZpbGwtb3BhY2l0eScsCisgIGZpbGxSdWxlOiAnZmls bC1ydWxlJywKKyAgZmlsdGVyOiAwLAorICBmaWx0ZXJSZXM6ICdmaWx0ZXJSZXMnLAorICBmaWx0 ZXJVbml0czogJ2ZpbHRlclVuaXRzJywKKyAgZmxvb2RDb2xvcjogJ2Zsb29kLWNvbG9yJywKKyAg Zmxvb2RPcGFjaXR5OiAnZmxvb2Qtb3BhY2l0eScsCisgIGZvY3VzYWJsZTogMCwKKyAgZm9udEZh bWlseTogJ2ZvbnQtZmFtaWx5JywKKyAgZm9udFNpemU6ICdmb250LXNpemUnLAorICBmb250U2l6 ZUFkanVzdDogJ2ZvbnQtc2l6ZS1hZGp1c3QnLAorICBmb250U3RyZXRjaDogJ2ZvbnQtc3RyZXRj aCcsCisgIGZvbnRTdHlsZTogJ2ZvbnQtc3R5bGUnLAorICBmb250VmFyaWFudDogJ2ZvbnQtdmFy aWFudCcsCisgIGZvbnRXZWlnaHQ6ICdmb250LXdlaWdodCcsCisgIGZvcm1hdDogMCwKKyAgZnJv bTogMCwKKyAgZng6IDAsCisgIGZ5OiAwLAorICBnMTogMCwKKyAgZzI6IDAsCisgIGdseXBoTmFt ZTogJ2dseXBoLW5hbWUnLAorICBnbHlwaE9yaWVudGF0aW9uSG9yaXpvbnRhbDogJ2dseXBoLW9y aWVudGF0aW9uLWhvcml6b250YWwnLAorICBnbHlwaE9yaWVudGF0aW9uVmVydGljYWw6ICdnbHlw aC1vcmllbnRhdGlvbi12ZXJ0aWNhbCcsCisgIGdseXBoUmVmOiAnZ2x5cGhSZWYnLAorICBncmFk aWVudFRyYW5zZm9ybTogJ2dyYWRpZW50VHJhbnNmb3JtJywKKyAgZ3JhZGllbnRVbml0czogJ2dy YWRpZW50VW5pdHMnLAorICBoYW5naW5nOiAwLAorICBob3JpekFkdlg6ICdob3Jpei1hZHYteCcs CisgIGhvcml6T3JpZ2luWDogJ2hvcml6LW9yaWdpbi14JywKKyAgaWRlb2dyYXBoaWM6IDAsCisg IGltYWdlUmVuZGVyaW5nOiAnaW1hZ2UtcmVuZGVyaW5nJywKKyAgJ2luJzogMCwKKyAgaW4yOiAw LAorICBpbnRlcmNlcHQ6IDAsCisgIGs6IDAsCisgIGsxOiAwLAorICBrMjogMCwKKyAgazM6IDAs CisgIGs0OiAwLAorICBrZXJuZWxNYXRyaXg6ICdrZXJuZWxNYXRyaXgnLAorICBrZXJuZWxVbml0 TGVuZ3RoOiAna2VybmVsVW5pdExlbmd0aCcsCisgIGtlcm5pbmc6IDAsCisgIGtleVBvaW50czog J2tleVBvaW50cycsCisgIGtleVNwbGluZXM6ICdrZXlTcGxpbmVzJywKKyAga2V5VGltZXM6ICdr ZXlUaW1lcycsCisgIGxlbmd0aEFkanVzdDogJ2xlbmd0aEFkanVzdCcsCisgIGxldHRlclNwYWNp bmc6ICdsZXR0ZXItc3BhY2luZycsCisgIGxpZ2h0aW5nQ29sb3I6ICdsaWdodGluZy1jb2xvcics CisgIGxpbWl0aW5nQ29uZUFuZ2xlOiAnbGltaXRpbmdDb25lQW5nbGUnLAorICBsb2NhbDogMCwK KyAgbWFya2VyRW5kOiAnbWFya2VyLWVuZCcsCisgIG1hcmtlck1pZDogJ21hcmtlci1taWQnLAor ICBtYXJrZXJTdGFydDogJ21hcmtlci1zdGFydCcsCisgIG1hcmtlckhlaWdodDogJ21hcmtlckhl aWdodCcsCisgIG1hcmtlclVuaXRzOiAnbWFya2VyVW5pdHMnLAorICBtYXJrZXJXaWR0aDogJ21h cmtlcldpZHRoJywKKyAgbWFzazogMCwKKyAgbWFza0NvbnRlbnRVbml0czogJ21hc2tDb250ZW50 VW5pdHMnLAorICBtYXNrVW5pdHM6ICdtYXNrVW5pdHMnLAorICBtYXRoZW1hdGljYWw6IDAsCisg IG1vZGU6IDAsCisgIG51bU9jdGF2ZXM6ICdudW1PY3RhdmVzJywKKyAgb2Zmc2V0OiAwLAorICBv cGFjaXR5OiAwLAorICBvcGVyYXRvcjogMCwKKyAgb3JkZXI6IDAsCisgIG9yaWVudDogMCwKKyAg b3JpZW50YXRpb246IDAsCisgIG9yaWdpbjogMCwKKyAgb3ZlcmZsb3c6IDAsCisgIG92ZXJsaW5l UG9zaXRpb246ICdvdmVybGluZS1wb3NpdGlvbicsCisgIG92ZXJsaW5lVGhpY2tuZXNzOiAnb3Zl cmxpbmUtdGhpY2tuZXNzJywKKyAgcGFpbnRPcmRlcjogJ3BhaW50LW9yZGVyJywKKyAgcGFub3Nl MTogJ3Bhbm9zZS0xJywKKyAgcGF0aExlbmd0aDogJ3BhdGhMZW5ndGgnLAorICBwYXR0ZXJuQ29u dGVudFVuaXRzOiAncGF0dGVybkNvbnRlbnRVbml0cycsCisgIHBhdHRlcm5UcmFuc2Zvcm06ICdw YXR0ZXJuVHJhbnNmb3JtJywKKyAgcGF0dGVyblVuaXRzOiAncGF0dGVyblVuaXRzJywKKyAgcG9p bnRlckV2ZW50czogJ3BvaW50ZXItZXZlbnRzJywKKyAgcG9pbnRzOiAwLAorICBwb2ludHNBdFg6 ICdwb2ludHNBdFgnLAorICBwb2ludHNBdFk6ICdwb2ludHNBdFknLAorICBwb2ludHNBdFo6ICdw b2ludHNBdFonLAorICBwcmVzZXJ2ZUFscGhhOiAncHJlc2VydmVBbHBoYScsCisgIHByZXNlcnZl QXNwZWN0UmF0aW86ICdwcmVzZXJ2ZUFzcGVjdFJhdGlvJywKKyAgcHJpbWl0aXZlVW5pdHM6ICdw cmltaXRpdmVVbml0cycsCisgIHI6IDAsCisgIHJhZGl1czogMCwKKyAgcmVmWDogJ3JlZlgnLAor ICByZWZZOiAncmVmWScsCisgIHJlbmRlcmluZ0ludGVudDogJ3JlbmRlcmluZy1pbnRlbnQnLAor ICByZXBlYXRDb3VudDogJ3JlcGVhdENvdW50JywKKyAgcmVwZWF0RHVyOiAncmVwZWF0RHVyJywK KyAgcmVxdWlyZWRFeHRlbnNpb25zOiAncmVxdWlyZWRFeHRlbnNpb25zJywKKyAgcmVxdWlyZWRG ZWF0dXJlczogJ3JlcXVpcmVkRmVhdHVyZXMnLAorICByZXN0YXJ0OiAwLAorICByZXN1bHQ6IDAs CisgIHJvdGF0ZTogMCwKKyAgcng6IDAsCisgIHJ5OiAwLAorICBzY2FsZTogMCwKKyAgc2VlZDog MCwKKyAgc2hhcGVSZW5kZXJpbmc6ICdzaGFwZS1yZW5kZXJpbmcnLAorICBzbG9wZTogMCwKKyAg c3BhY2luZzogMCwKKyAgc3BlY3VsYXJDb25zdGFudDogJ3NwZWN1bGFyQ29uc3RhbnQnLAorICBz cGVjdWxhckV4cG9uZW50OiAnc3BlY3VsYXJFeHBvbmVudCcsCisgIHNwZWVkOiAwLAorICBzcHJl YWRNZXRob2Q6ICdzcHJlYWRNZXRob2QnLAorICBzdGFydE9mZnNldDogJ3N0YXJ0T2Zmc2V0JywK KyAgc3RkRGV2aWF0aW9uOiAnc3RkRGV2aWF0aW9uJywKKyAgc3RlbWg6IDAsCisgIHN0ZW12OiAw LAorICBzdGl0Y2hUaWxlczogJ3N0aXRjaFRpbGVzJywKKyAgc3RvcENvbG9yOiAnc3RvcC1jb2xv cicsCisgIHN0b3BPcGFjaXR5OiAnc3RvcC1vcGFjaXR5JywKKyAgc3RyaWtldGhyb3VnaFBvc2l0 aW9uOiAnc3RyaWtldGhyb3VnaC1wb3NpdGlvbicsCisgIHN0cmlrZXRocm91Z2hUaGlja25lc3M6 ICdzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcycsCisgIHN0cmluZzogMCwKKyAgc3Ryb2tlOiAwLAor ICBzdHJva2VEYXNoYXJyYXk6ICdzdHJva2UtZGFzaGFycmF5JywKKyAgc3Ryb2tlRGFzaG9mZnNl dDogJ3N0cm9rZS1kYXNob2Zmc2V0JywKKyAgc3Ryb2tlTGluZWNhcDogJ3N0cm9rZS1saW5lY2Fw JywKKyAgc3Ryb2tlTGluZWpvaW46ICdzdHJva2UtbGluZWpvaW4nLAorICBzdHJva2VNaXRlcmxp bWl0OiAnc3Ryb2tlLW1pdGVybGltaXQnLAorICBzdHJva2VPcGFjaXR5OiAnc3Ryb2tlLW9wYWNp dHknLAorICBzdHJva2VXaWR0aDogJ3N0cm9rZS13aWR0aCcsCisgIHN1cmZhY2VTY2FsZTogJ3N1 cmZhY2VTY2FsZScsCisgIHN5c3RlbUxhbmd1YWdlOiAnc3lzdGVtTGFuZ3VhZ2UnLAorICB0YWJs ZVZhbHVlczogJ3RhYmxlVmFsdWVzJywKKyAgdGFyZ2V0WDogJ3RhcmdldFgnLAorICB0YXJnZXRZ OiAndGFyZ2V0WScsCisgIHRleHRBbmNob3I6ICd0ZXh0LWFuY2hvcicsCisgIHRleHREZWNvcmF0 aW9uOiAndGV4dC1kZWNvcmF0aW9uJywKKyAgdGV4dFJlbmRlcmluZzogJ3RleHQtcmVuZGVyaW5n JywKKyAgdGV4dExlbmd0aDogJ3RleHRMZW5ndGgnLAorICB0bzogMCwKKyAgdHJhbnNmb3JtOiAw LAorICB1MTogMCwKKyAgdTI6IDAsCisgIHVuZGVybGluZVBvc2l0aW9uOiAndW5kZXJsaW5lLXBv c2l0aW9uJywKKyAgdW5kZXJsaW5lVGhpY2tuZXNzOiAndW5kZXJsaW5lLXRoaWNrbmVzcycsCisg IHVuaWNvZGU6IDAsCisgIHVuaWNvZGVCaWRpOiAndW5pY29kZS1iaWRpJywKKyAgdW5pY29kZVJh bmdlOiAndW5pY29kZS1yYW5nZScsCisgIHVuaXRzUGVyRW06ICd1bml0cy1wZXItZW0nLAorICB2 QWxwaGFiZXRpYzogJ3YtYWxwaGFiZXRpYycsCisgIHZIYW5naW5nOiAndi1oYW5naW5nJywKKyAg dklkZW9ncmFwaGljOiAndi1pZGVvZ3JhcGhpYycsCisgIHZNYXRoZW1hdGljYWw6ICd2LW1hdGhl bWF0aWNhbCcsCisgIHZhbHVlczogMCwKKyAgdmVjdG9yRWZmZWN0OiAndmVjdG9yLWVmZmVjdCcs CisgIHZlcnNpb246IDAsCisgIHZlcnRBZHZZOiAndmVydC1hZHYteScsCisgIHZlcnRPcmlnaW5Y OiAndmVydC1vcmlnaW4teCcsCisgIHZlcnRPcmlnaW5ZOiAndmVydC1vcmlnaW4teScsCisgIHZp ZXdCb3g6ICd2aWV3Qm94JywKKyAgdmlld1RhcmdldDogJ3ZpZXdUYXJnZXQnLAorICB2aXNpYmls aXR5OiAwLAorICB3aWR0aHM6IDAsCisgIHdvcmRTcGFjaW5nOiAnd29yZC1zcGFjaW5nJywKKyAg d3JpdGluZ01vZGU6ICd3cml0aW5nLW1vZGUnLAorICB4OiAwLAorICB4SGVpZ2h0OiAneC1oZWln aHQnLAorICB4MTogMCwKKyAgeDI6IDAsCisgIHhDaGFubmVsU2VsZWN0b3I6ICd4Q2hhbm5lbFNl bGVjdG9yJywKKyAgeGxpbmtBY3R1YXRlOiAneGxpbms6YWN0dWF0ZScsCisgIHhsaW5rQXJjcm9s ZTogJ3hsaW5rOmFyY3JvbGUnLAorICB4bGlua0hyZWY6ICd4bGluazpocmVmJywKKyAgeGxpbmtS b2xlOiAneGxpbms6cm9sZScsCisgIHhsaW5rU2hvdzogJ3hsaW5rOnNob3cnLAorICB4bGlua1Rp dGxlOiAneGxpbms6dGl0bGUnLAorICB4bGlua1R5cGU6ICd4bGluazp0eXBlJywKKyAgeG1sQmFz ZTogJ3htbDpiYXNlJywKKyAgeG1sbnM6IDAsCisgIHhtbG5zWGxpbms6ICd4bWxuczp4bGluaycs CisgIHhtbExhbmc6ICd4bWw6bGFuZycsCisgIHhtbFNwYWNlOiAneG1sOnNwYWNlJywKKyAgeTog MCwKKyAgeTE6IDAsCisgIHkyOiAwLAorICB5Q2hhbm5lbFNlbGVjdG9yOiAneUNoYW5uZWxTZWxl Y3RvcicsCisgIHo6IDAsCisgIHpvb21BbmRQYW46ICd6b29tQW5kUGFuJworfTsKKwordmFyIFNW R0RPTVByb3BlcnR5Q29uZmlnID0geworICBQcm9wZXJ0aWVzOiB7fSwKKyAgRE9NQXR0cmlidXRl TmFtZXNwYWNlczogeworICAgIHhsaW5rQWN0dWF0ZTogTlMueGxpbmssCisgICAgeGxpbmtBcmNy b2xlOiBOUy54bGluaywKKyAgICB4bGlua0hyZWY6IE5TLnhsaW5rLAorICAgIHhsaW5rUm9sZTog TlMueGxpbmssCisgICAgeGxpbmtTaG93OiBOUy54bGluaywKKyAgICB4bGlua1RpdGxlOiBOUy54 bGluaywKKyAgICB4bGlua1R5cGU6IE5TLnhsaW5rLAorICAgIHhtbEJhc2U6IE5TLnhtbCwKKyAg ICB4bWxMYW5nOiBOUy54bWwsCisgICAgeG1sU3BhY2U6IE5TLnhtbAorICB9LAorICBET01BdHRy aWJ1dGVOYW1lczoge30KK307CisKK09iamVjdC5rZXlzKEFUVFJTKS5mb3JFYWNoKGZ1bmN0aW9u IChrZXkpIHsKKyAgU1ZHRE9NUHJvcGVydHlDb25maWcuUHJvcGVydGllc1trZXldID0gMDsKKyAg aWYgKEFUVFJTW2tleV0pIHsKKyAgICBTVkdET01Qcm9wZXJ0eUNvbmZpZy5ET01BdHRyaWJ1dGVO YW1lc1trZXldID0gQVRUUlNba2V5XTsKKyAgfQorfSk7CisKK21vZHVsZS5leHBvcnRzID0gU1ZH RE9NUHJvcGVydHlDb25maWc7Cit9LHt9XSw4NTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhw b3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisg KiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5z ZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBm aWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlv bmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5U UyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOwor Cit2YXIgRXZlbnRQcm9wYWdhdG9ycyA9IF9kZXJlcV8oMjApOwordmFyIEV4ZWN1dGlvbkVudmly b25tZW50ID0gX2RlcmVxXygxMzYpOwordmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IF9kZXJl cV8oMzQpOwordmFyIFJlYWN0SW5wdXRTZWxlY3Rpb24gPSBfZGVyZXFfKDYyKTsKK3ZhciBTeW50 aGV0aWNFdmVudCA9IF9kZXJlcV8oOTEpOworCit2YXIgZ2V0QWN0aXZlRWxlbWVudCA9IF9kZXJl cV8oMTQ1KTsKK3ZhciBpc1RleHRJbnB1dEVsZW1lbnQgPSBfZGVyZXFfKDEyMyk7Cit2YXIgc2hh bGxvd0VxdWFsID0gX2RlcmVxXygxNTYpOworCit2YXIgc2tpcFNlbGVjdGlvbkNoYW5nZUV2ZW50 ID0gRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NICYmICdkb2N1bWVudE1vZGUnIGluIGRv Y3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSA8PSAxMTsKKwordmFyIGV2ZW50VHlwZXMg PSB7CisgIHNlbGVjdDogeworICAgIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOiB7CisgICAgICBi dWJibGVkOiAnb25TZWxlY3QnLAorICAgICAgY2FwdHVyZWQ6ICdvblNlbGVjdENhcHR1cmUnCisg ICAgfSwKKyAgICBkZXBlbmRlbmNpZXM6IFsndG9wQmx1cicsICd0b3BDb250ZXh0TWVudScsICd0 b3BGb2N1cycsICd0b3BLZXlEb3duJywgJ3RvcEtleVVwJywgJ3RvcE1vdXNlRG93bicsICd0b3BN b3VzZVVwJywgJ3RvcFNlbGVjdGlvbkNoYW5nZSddCisgIH0KK307CisKK3ZhciBhY3RpdmVFbGVt ZW50ID0gbnVsbDsKK3ZhciBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7Cit2YXIgbGFzdFNlbGVj dGlvbiA9IG51bGw7Cit2YXIgbW91c2VEb3duID0gZmFsc2U7CisKKy8vIFRyYWNrIHdoZXRoZXIg YSBsaXN0ZW5lciBleGlzdHMgZm9yIHRoaXMgcGx1Z2luLiBJZiBub25lIGV4aXN0LCB3ZSBkbwor Ly8gbm90IGV4dHJhY3QgZXZlbnRzLiBTZWUgIzM2MzkuCit2YXIgaGFzTGlzdGVuZXIgPSBmYWxz ZTsKKworLyoqCisgKiBHZXQgYW4gb2JqZWN0IHdoaWNoIGlzIGEgdW5pcXVlIHJlcHJlc2VudGF0 aW9uIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIHdp bGwgbm90IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG5vZGVzIG9yIGJyb3dzZXJzLCBidXQKKyAqIHR3 byBpZGVudGljYWwgc2VsZWN0aW9ucyBvbiB0aGUgc2FtZSBub2RlIHdpbGwgcmV0dXJuIGlkZW50 aWNhbCBvYmplY3RzLgorICoKKyAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZQorICogQHJldHVy biB7b2JqZWN0fQorICovCitmdW5jdGlvbiBnZXRTZWxlY3Rpb24obm9kZSkgeworICBpZiAoJ3Nl bGVjdGlvblN0YXJ0JyBpbiBub2RlICYmIFJlYWN0SW5wdXRTZWxlY3Rpb24uaGFzU2VsZWN0aW9u Q2FwYWJpbGl0aWVzKG5vZGUpKSB7CisgICAgcmV0dXJuIHsKKyAgICAgIHN0YXJ0OiBub2RlLnNl bGVjdGlvblN0YXJ0LAorICAgICAgZW5kOiBub2RlLnNlbGVjdGlvbkVuZAorICAgIH07CisgIH0g ZWxzZSBpZiAod2luZG93LmdldFNlbGVjdGlvbikgeworICAgIHZhciBzZWxlY3Rpb24gPSB3aW5k b3cuZ2V0U2VsZWN0aW9uKCk7CisgICAgcmV0dXJuIHsKKyAgICAgIGFuY2hvck5vZGU6IHNlbGVj dGlvbi5hbmNob3JOb2RlLAorICAgICAgYW5jaG9yT2Zmc2V0OiBzZWxlY3Rpb24uYW5jaG9yT2Zm c2V0LAorICAgICAgZm9jdXNOb2RlOiBzZWxlY3Rpb24uZm9jdXNOb2RlLAorICAgICAgZm9jdXNP ZmZzZXQ6IHNlbGVjdGlvbi5mb2N1c09mZnNldAorICAgIH07CisgIH0gZWxzZSBpZiAoZG9jdW1l bnQuc2VsZWN0aW9uKSB7CisgICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0 ZVJhbmdlKCk7CisgICAgcmV0dXJuIHsKKyAgICAgIHBhcmVudEVsZW1lbnQ6IHJhbmdlLnBhcmVu dEVsZW1lbnQoKSwKKyAgICAgIHRleHQ6IHJhbmdlLnRleHQsCisgICAgICB0b3A6IHJhbmdlLmJv dW5kaW5nVG9wLAorICAgICAgbGVmdDogcmFuZ2UuYm91bmRpbmdMZWZ0CisgICAgfTsKKyAgfQor fQorCisvKioKKyAqIFBvbGwgc2VsZWN0aW9uIHRvIHNlZSB3aGV0aGVyIGl0J3MgY2hhbmdlZC4K KyAqCisgKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQKKyAqIEByZXR1cm4gez9TeW50aGV0 aWNFdmVudH0KKyAqLworZnVuY3Rpb24gY29uc3RydWN0U2VsZWN0RXZlbnQobmF0aXZlRXZlbnQs IG5hdGl2ZUV2ZW50VGFyZ2V0KSB7CisgIC8vIEVuc3VyZSB3ZSBoYXZlIHRoZSByaWdodCBlbGVt ZW50LCBhbmQgdGhhdCB0aGUgdXNlciBpcyBub3QgZHJhZ2dpbmcgYQorICAvLyBzZWxlY3Rpb24g KHRoaXMgbWF0Y2hlcyBuYXRpdmUgYHNlbGVjdGAgZXZlbnQgYmVoYXZpb3IpLiBJbiBIVE1MNSwg c2VsZWN0CisgIC8vIGZpcmVzIG9ubHkgb24gaW5wdXQgYW5kIHRleHRhcmVhIHRodXMgaWYgdGhl cmUncyBubyBmb2N1c2VkIGVsZW1lbnQgd2UKKyAgLy8gd29uJ3QgZGlzcGF0Y2guCisgIGlmICht b3VzZURvd24gfHwgYWN0aXZlRWxlbWVudCA9PSBudWxsIHx8IGFjdGl2ZUVsZW1lbnQgIT09IGdl dEFjdGl2ZUVsZW1lbnQoKSkgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAgLy8gT25seSBm aXJlIHdoZW4gc2VsZWN0aW9uIGhhcyBhY3R1YWxseSBjaGFuZ2VkLgorICB2YXIgY3VycmVudFNl bGVjdGlvbiA9IGdldFNlbGVjdGlvbihhY3RpdmVFbGVtZW50KTsKKyAgaWYgKCFsYXN0U2VsZWN0 aW9uIHx8ICFzaGFsbG93RXF1YWwobGFzdFNlbGVjdGlvbiwgY3VycmVudFNlbGVjdGlvbikpIHsK KyAgICBsYXN0U2VsZWN0aW9uID0gY3VycmVudFNlbGVjdGlvbjsKKworICAgIHZhciBzeW50aGV0 aWNFdmVudCA9IFN5bnRoZXRpY0V2ZW50LmdldFBvb2xlZChldmVudFR5cGVzLnNlbGVjdCwgYWN0 aXZlRWxlbWVudEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7CisKKyAgICBz eW50aGV0aWNFdmVudC50eXBlID0gJ3NlbGVjdCc7CisgICAgc3ludGhldGljRXZlbnQudGFyZ2V0 ID0gYWN0aXZlRWxlbWVudDsKKworICAgIEV2ZW50UHJvcGFnYXRvcnMuYWNjdW11bGF0ZVR3b1Bo YXNlRGlzcGF0Y2hlcyhzeW50aGV0aWNFdmVudCk7CisKKyAgICByZXR1cm4gc3ludGhldGljRXZl bnQ7CisgIH0KKworICByZXR1cm4gbnVsbDsKK30KKworLyoqCisgKiBUaGlzIHBsdWdpbiBjcmVh dGVzIGFuIGBvblNlbGVjdGAgZXZlbnQgdGhhdCBub3JtYWxpemVzIHNlbGVjdCBldmVudHMKKyAq IGFjcm9zcyBmb3JtIGVsZW1lbnRzLgorICoKKyAqIFN1cHBvcnRlZCBlbGVtZW50cyBhcmU6Cisg KiAtIGlucHV0IChzZWUgYGlzVGV4dElucHV0RWxlbWVudGApCisgKiAtIHRleHRhcmVhCisgKiAt IGNvbnRlbnRFZGl0YWJsZQorICoKKyAqIFRoaXMgZGlmZmVycyBmcm9tIG5hdGl2ZSBicm93c2Vy IGltcGxlbWVudGF0aW9ucyBpbiB0aGUgZm9sbG93aW5nIHdheXM6CisgKiAtIEZpcmVzIG9uIGNv bnRlbnRFZGl0YWJsZSBmaWVsZHMgYXMgd2VsbCBhcyBpbnB1dHMuCisgKiAtIEZpcmVzIGZvciBj b2xsYXBzZWQgc2VsZWN0aW9uLgorICogLSBGaXJlcyBhZnRlciB1c2VyIGlucHV0LgorICovCit2 YXIgU2VsZWN0RXZlbnRQbHVnaW4gPSB7CisKKyAgZXZlbnRUeXBlczogZXZlbnRUeXBlcywKKwor ICBleHRyYWN0RXZlbnRzOiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRp dmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHsKKyAgICBpZiAoIWhhc0xpc3RlbmVyKSB7Cisg ICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICB2YXIgdGFyZ2V0Tm9kZSA9IHRhcmdldElu c3QgPyBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0YXJnZXRJbnN0 KSA6IHdpbmRvdzsKKworICAgIHN3aXRjaCAodG9wTGV2ZWxUeXBlKSB7CisgICAgICAvLyBUcmFj ayB0aGUgaW5wdXQgbm9kZSB0aGF0IGhhcyBmb2N1cy4KKyAgICAgIGNhc2UgJ3RvcEZvY3VzJzoK KyAgICAgICAgaWYgKGlzVGV4dElucHV0RWxlbWVudCh0YXJnZXROb2RlKSB8fCB0YXJnZXROb2Rl LmNvbnRlbnRFZGl0YWJsZSA9PT0gJ3RydWUnKSB7CisgICAgICAgICAgYWN0aXZlRWxlbWVudCA9 IHRhcmdldE5vZGU7CisgICAgICAgICAgYWN0aXZlRWxlbWVudEluc3QgPSB0YXJnZXRJbnN0Owor ICAgICAgICAgIGxhc3RTZWxlY3Rpb24gPSBudWxsOworICAgICAgICB9CisgICAgICAgIGJyZWFr OworICAgICAgY2FzZSAndG9wQmx1cic6CisgICAgICAgIGFjdGl2ZUVsZW1lbnQgPSBudWxsOwor ICAgICAgICBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7CisgICAgICAgIGxhc3RTZWxlY3Rpb24g PSBudWxsOworICAgICAgICBicmVhazsKKworICAgICAgLy8gRG9uJ3QgZmlyZSB0aGUgZXZlbnQg d2hpbGUgdGhlIHVzZXIgaXMgZHJhZ2dpbmcuIFRoaXMgbWF0Y2hlcyB0aGUKKyAgICAgIC8vIHNl bWFudGljcyBvZiB0aGUgbmF0aXZlIHNlbGVjdCBldmVudC4KKyAgICAgIGNhc2UgJ3RvcE1vdXNl RG93bic6CisgICAgICAgIG1vdXNlRG93biA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAg Y2FzZSAndG9wQ29udGV4dE1lbnUnOgorICAgICAgY2FzZSAndG9wTW91c2VVcCc6CisgICAgICAg IG1vdXNlRG93biA9IGZhbHNlOworICAgICAgICByZXR1cm4gY29uc3RydWN0U2VsZWN0RXZlbnQo bmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTsKKworICAgICAgLy8gQ2hyb21lIGFuZCBJ RSBmaXJlIG5vbi1zdGFuZGFyZCBldmVudCB3aGVuIHNlbGVjdGlvbiBpcyBjaGFuZ2VkIChhbmQK KyAgICAgIC8vIHNvbWV0aW1lcyB3aGVuIGl0IGhhc24ndCkuIElFJ3MgZXZlbnQgZmlyZXMgb3V0 IG9mIG9yZGVyIHdpdGggcmVzcGVjdAorICAgICAgLy8gdG8ga2V5IGFuZCBpbnB1dCBldmVudHMg b24gZGVsZXRpb24sIHNvIHdlIGRpc2NhcmQgaXQuCisgICAgICAvLworICAgICAgLy8gRmlyZWZv eCBkb2Vzbid0IHN1cHBvcnQgc2VsZWN0aW9uY2hhbmdlLCBzbyBjaGVjayBzZWxlY3Rpb24gc3Rh dHVzCisgICAgICAvLyBhZnRlciBlYWNoIGtleSBlbnRyeS4gVGhlIHNlbGVjdGlvbiBjaGFuZ2Vz IGFmdGVyIGtleWRvd24gYW5kIGJlZm9yZQorICAgICAgLy8ga2V5dXAsIGJ1dCB3ZSBjaGVjayBv biBrZXlkb3duIGFzIHdlbGwgaW4gdGhlIGNhc2Ugb2YgaG9sZGluZyBkb3duIGEKKyAgICAgIC8v IGtleSwgd2hlbiBtdWx0aXBsZSBrZXlkb3duIGV2ZW50cyBhcmUgZmlyZWQgYnV0IG9ubHkgb25l IGtleXVwIGlzLgorICAgICAgLy8gVGhpcyBpcyBhbHNvIG91ciBhcHByb2FjaCBmb3IgSUUgaGFu ZGxpbmcsIGZvciB0aGUgcmVhc29uIGFib3ZlLgorICAgICAgY2FzZSAndG9wU2VsZWN0aW9uQ2hh bmdlJzoKKyAgICAgICAgaWYgKHNraXBTZWxlY3Rpb25DaGFuZ2VFdmVudCkgeworICAgICAgICAg IGJyZWFrOworICAgICAgICB9CisgICAgICAvLyBmYWxscyB0aHJvdWdoCisgICAgICBjYXNlICd0 b3BLZXlEb3duJzoKKyAgICAgIGNhc2UgJ3RvcEtleVVwJzoKKyAgICAgICAgcmV0dXJuIGNvbnN0 cnVjdFNlbGVjdEV2ZW50KG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7CisgICAgfQor CisgICAgcmV0dXJuIG51bGw7CisgIH0sCisKKyAgZGlkUHV0TGlzdGVuZXI6IGZ1bmN0aW9uIChp bnN0LCByZWdpc3RyYXRpb25OYW1lLCBsaXN0ZW5lcikgeworICAgIGlmIChyZWdpc3RyYXRpb25O YW1lID09PSAnb25TZWxlY3QnKSB7CisgICAgICBoYXNMaXN0ZW5lciA9IHRydWU7CisgICAgfQor ICB9Cit9OworCittb2R1bGUuZXhwb3J0cyA9IFNlbGVjdEV2ZW50UGx1Z2luOworfSx7IjEyMyI6 MTIzLCIxMzYiOjEzNiwiMTQ1IjoxNDUsIjE1NiI6MTU2LCIyMCI6MjAsIjM0IjozNCwiNjIiOjYy LCI5MSI6OTF9XSw4NjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAq IENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJl c2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJT RC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290 IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBv ZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBz YW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJv ZEludmFyaWFudCA9IF9kZXJlcV8oMTI1KTsKKwordmFyIEV2ZW50TGlzdGVuZXIgPSBfZGVyZXFf KDEzNSk7Cit2YXIgRXZlbnRQcm9wYWdhdG9ycyA9IF9kZXJlcV8oMjApOwordmFyIFJlYWN0RE9N Q29tcG9uZW50VHJlZSA9IF9kZXJlcV8oMzQpOwordmFyIFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50 ID0gX2RlcmVxXyg4Nyk7Cit2YXIgU3ludGhldGljQ2xpcGJvYXJkRXZlbnQgPSBfZGVyZXFfKDg4 KTsKK3ZhciBTeW50aGV0aWNFdmVudCA9IF9kZXJlcV8oOTEpOwordmFyIFN5bnRoZXRpY0ZvY3Vz RXZlbnQgPSBfZGVyZXFfKDkyKTsKK3ZhciBTeW50aGV0aWNLZXlib2FyZEV2ZW50ID0gX2RlcmVx Xyg5NCk7Cit2YXIgU3ludGhldGljTW91c2VFdmVudCA9IF9kZXJlcV8oOTUpOwordmFyIFN5bnRo ZXRpY0RyYWdFdmVudCA9IF9kZXJlcV8oOTApOwordmFyIFN5bnRoZXRpY1RvdWNoRXZlbnQgPSBf ZGVyZXFfKDk2KTsKK3ZhciBTeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQgPSBfZGVyZXFfKDk3KTsK K3ZhciBTeW50aGV0aWNVSUV2ZW50ID0gX2RlcmVxXyg5OCk7Cit2YXIgU3ludGhldGljV2hlZWxF dmVudCA9IF9kZXJlcV8oOTkpOworCit2YXIgZW1wdHlGdW5jdGlvbiA9IF9kZXJlcV8oMTQyKTsK K3ZhciBnZXRFdmVudENoYXJDb2RlID0gX2RlcmVxXygxMTEpOwordmFyIGludmFyaWFudCA9IF9k ZXJlcV8oMTUwKTsKKworLyoqCisgKiBUdXJucworICogWydhYm9ydCcsIC4uLl0KKyAqIGludG8K KyAqIGV2ZW50VHlwZXMgPSB7CisgKiAgICdhYm9ydCc6IHsKKyAqICAgICBwaGFzZWRSZWdpc3Ry YXRpb25OYW1lczogeworICogICAgICAgYnViYmxlZDogJ29uQWJvcnQnLAorICogICAgICAgY2Fw dHVyZWQ6ICdvbkFib3J0Q2FwdHVyZScsCisgKiAgICAgfSwKKyAqICAgICBkZXBlbmRlbmNpZXM6 IFsndG9wQWJvcnQnXSwKKyAqICAgfSwKKyAqICAgLi4uCisgKiB9OworICogdG9wTGV2ZWxFdmVu dHNUb0Rpc3BhdGNoQ29uZmlnID0geworICogICAndG9wQWJvcnQnOiB7IHNhbWVDb25maWcgfQor ICogfTsKKyAqLwordmFyIGV2ZW50VHlwZXMgPSB7fTsKK3ZhciB0b3BMZXZlbEV2ZW50c1RvRGlz cGF0Y2hDb25maWcgPSB7fTsKK1snYWJvcnQnLCAnYW5pbWF0aW9uRW5kJywgJ2FuaW1hdGlvbkl0 ZXJhdGlvbicsICdhbmltYXRpb25TdGFydCcsICdibHVyJywgJ2NhblBsYXknLCAnY2FuUGxheVRo cm91Z2gnLCAnY2xpY2snLCAnY29udGV4dE1lbnUnLCAnY29weScsICdjdXQnLCAnZG91YmxlQ2xp Y2snLCAnZHJhZycsICdkcmFnRW5kJywgJ2RyYWdFbnRlcicsICdkcmFnRXhpdCcsICdkcmFnTGVh dmUnLCAnZHJhZ092ZXInLCAnZHJhZ1N0YXJ0JywgJ2Ryb3AnLCAnZHVyYXRpb25DaGFuZ2UnLCAn ZW1wdGllZCcsICdlbmNyeXB0ZWQnLCAnZW5kZWQnLCAnZXJyb3InLCAnZm9jdXMnLCAnaW5wdXQn LCAnaW52YWxpZCcsICdrZXlEb3duJywgJ2tleVByZXNzJywgJ2tleVVwJywgJ2xvYWQnLCAnbG9h ZGVkRGF0YScsICdsb2FkZWRNZXRhZGF0YScsICdsb2FkU3RhcnQnLCAnbW91c2VEb3duJywgJ21v dXNlTW92ZScsICdtb3VzZU91dCcsICdtb3VzZU92ZXInLCAnbW91c2VVcCcsICdwYXN0ZScsICdw YXVzZScsICdwbGF5JywgJ3BsYXlpbmcnLCAncHJvZ3Jlc3MnLCAncmF0ZUNoYW5nZScsICdyZXNl dCcsICdzY3JvbGwnLCAnc2Vla2VkJywgJ3NlZWtpbmcnLCAnc3RhbGxlZCcsICdzdWJtaXQnLCAn c3VzcGVuZCcsICd0aW1lVXBkYXRlJywgJ3RvdWNoQ2FuY2VsJywgJ3RvdWNoRW5kJywgJ3RvdWNo TW92ZScsICd0b3VjaFN0YXJ0JywgJ3RyYW5zaXRpb25FbmQnLCAndm9sdW1lQ2hhbmdlJywgJ3dh aXRpbmcnLCAnd2hlZWwnXS5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkgeworICB2YXIgY2FwaXRh bGl6ZWRFdmVudCA9IGV2ZW50WzBdLnRvVXBwZXJDYXNlKCkgKyBldmVudC5zbGljZSgxKTsKKyAg dmFyIG9uRXZlbnQgPSAnb24nICsgY2FwaXRhbGl6ZWRFdmVudDsKKyAgdmFyIHRvcEV2ZW50ID0g J3RvcCcgKyBjYXBpdGFsaXplZEV2ZW50OworCisgIHZhciB0eXBlID0geworICAgIHBoYXNlZFJl Z2lzdHJhdGlvbk5hbWVzOiB7CisgICAgICBidWJibGVkOiBvbkV2ZW50LAorICAgICAgY2FwdHVy ZWQ6IG9uRXZlbnQgKyAnQ2FwdHVyZScKKyAgICB9LAorICAgIGRlcGVuZGVuY2llczogW3RvcEV2 ZW50XQorICB9OworICBldmVudFR5cGVzW2V2ZW50XSA9IHR5cGU7CisgIHRvcExldmVsRXZlbnRz VG9EaXNwYXRjaENvbmZpZ1t0b3BFdmVudF0gPSB0eXBlOworfSk7CisKK3ZhciBvbkNsaWNrTGlz dGVuZXJzID0ge307CisKK2Z1bmN0aW9uIGdldERpY3Rpb25hcnlLZXkoaW5zdCkgeworICAvLyBQ cmV2ZW50cyBWOCBwZXJmb3JtYW5jZSBpc3N1ZToKKyAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zh Y2Vib29rL3JlYWN0L3B1bGwvNzIzMgorICByZXR1cm4gJy4nICsgaW5zdC5fcm9vdE5vZGVJRDsK K30KKworZnVuY3Rpb24gaXNJbnRlcmFjdGl2ZSh0YWcpIHsKKyAgcmV0dXJuIHRhZyA9PT0gJ2J1 dHRvbicgfHwgdGFnID09PSAnaW5wdXQnIHx8IHRhZyA9PT0gJ3NlbGVjdCcgfHwgdGFnID09PSAn dGV4dGFyZWEnOworfQorCit2YXIgU2ltcGxlRXZlbnRQbHVnaW4gPSB7CisKKyAgZXZlbnRUeXBl czogZXZlbnRUeXBlcywKKworICBleHRyYWN0RXZlbnRzOiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBl LCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHsKKyAgICB2YXIg ZGlzcGF0Y2hDb25maWcgPSB0b3BMZXZlbEV2ZW50c1RvRGlzcGF0Y2hDb25maWdbdG9wTGV2ZWxU eXBlXTsKKyAgICBpZiAoIWRpc3BhdGNoQ29uZmlnKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAg ICB9CisgICAgdmFyIEV2ZW50Q29uc3RydWN0b3I7CisgICAgc3dpdGNoICh0b3BMZXZlbFR5cGUp IHsKKyAgICAgIGNhc2UgJ3RvcEFib3J0JzoKKyAgICAgIGNhc2UgJ3RvcENhblBsYXknOgorICAg ICAgY2FzZSAndG9wQ2FuUGxheVRocm91Z2gnOgorICAgICAgY2FzZSAndG9wRHVyYXRpb25DaGFu Z2UnOgorICAgICAgY2FzZSAndG9wRW1wdGllZCc6CisgICAgICBjYXNlICd0b3BFbmNyeXB0ZWQn OgorICAgICAgY2FzZSAndG9wRW5kZWQnOgorICAgICAgY2FzZSAndG9wRXJyb3InOgorICAgICAg Y2FzZSAndG9wSW5wdXQnOgorICAgICAgY2FzZSAndG9wSW52YWxpZCc6CisgICAgICBjYXNlICd0 b3BMb2FkJzoKKyAgICAgIGNhc2UgJ3RvcExvYWRlZERhdGEnOgorICAgICAgY2FzZSAndG9wTG9h ZGVkTWV0YWRhdGEnOgorICAgICAgY2FzZSAndG9wTG9hZFN0YXJ0JzoKKyAgICAgIGNhc2UgJ3Rv cFBhdXNlJzoKKyAgICAgIGNhc2UgJ3RvcFBsYXknOgorICAgICAgY2FzZSAndG9wUGxheWluZyc6 CisgICAgICBjYXNlICd0b3BQcm9ncmVzcyc6CisgICAgICBjYXNlICd0b3BSYXRlQ2hhbmdlJzoK KyAgICAgIGNhc2UgJ3RvcFJlc2V0JzoKKyAgICAgIGNhc2UgJ3RvcFNlZWtlZCc6CisgICAgICBj YXNlICd0b3BTZWVraW5nJzoKKyAgICAgIGNhc2UgJ3RvcFN0YWxsZWQnOgorICAgICAgY2FzZSAn dG9wU3VibWl0JzoKKyAgICAgIGNhc2UgJ3RvcFN1c3BlbmQnOgorICAgICAgY2FzZSAndG9wVGlt ZVVwZGF0ZSc6CisgICAgICBjYXNlICd0b3BWb2x1bWVDaGFuZ2UnOgorICAgICAgY2FzZSAndG9w V2FpdGluZyc6CisgICAgICAgIC8vIEhUTUwgRXZlbnRzCisgICAgICAgIC8vIEBzZWUgaHR0cDov L3d3dy53My5vcmcvVFIvaHRtbDUvaW5kZXguaHRtbCNldmVudHMtMAorICAgICAgICBFdmVudENv bnN0cnVjdG9yID0gU3ludGhldGljRXZlbnQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAn dG9wS2V5UHJlc3MnOgorICAgICAgICAvLyBGaXJlZm94IGNyZWF0ZXMgYSBrZXlwcmVzcyBldmVu dCBmb3IgZnVuY3Rpb24ga2V5cyB0b28uIFRoaXMgcmVtb3ZlcworICAgICAgICAvLyB0aGUgdW53 YW50ZWQga2V5cHJlc3MgZXZlbnRzLiBFbnRlciBpcyBob3dldmVyIGJvdGggcHJpbnRhYmxlIGFu ZAorICAgICAgICAvLyBub24tcHJpbnRhYmxlLiBPbmUgd291bGQgZXhwZWN0IFRhYiB0byBiZSBh cyB3ZWxsIChidXQgaXQgaXNuJ3QpLgorICAgICAgICBpZiAoZ2V0RXZlbnRDaGFyQ29kZShuYXRp dmVFdmVudCkgPT09IDApIHsKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAg ICAgLyogZmFsbHMgdGhyb3VnaCAqLworICAgICAgY2FzZSAndG9wS2V5RG93bic6CisgICAgICBj YXNlICd0b3BLZXlVcCc6CisgICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNLZXli b2FyZEV2ZW50OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3RvcEJsdXInOgorICAgICAg Y2FzZSAndG9wRm9jdXMnOgorICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljRm9j dXNFdmVudDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICd0b3BDbGljayc6CisgICAgICAg IC8vIEZpcmVmb3ggY3JlYXRlcyBhIGNsaWNrIGV2ZW50IG9uIHJpZ2h0IG1vdXNlIGNsaWNrcy4g VGhpcyByZW1vdmVzIHRoZQorICAgICAgICAvLyB1bndhbnRlZCBjbGljayBldmVudHMuCisgICAg ICAgIGlmIChuYXRpdmVFdmVudC5idXR0b24gPT09IDIpIHsKKyAgICAgICAgICByZXR1cm4gbnVs bDsKKyAgICAgICAgfQorICAgICAgLyogZmFsbHMgdGhyb3VnaCAqLworICAgICAgY2FzZSAndG9w RG91YmxlQ2xpY2snOgorICAgICAgY2FzZSAndG9wTW91c2VEb3duJzoKKyAgICAgIGNhc2UgJ3Rv cE1vdXNlTW92ZSc6CisgICAgICBjYXNlICd0b3BNb3VzZVVwJzoKKyAgICAgIC8vIFRPRE86IERp c2FibGVkIGVsZW1lbnRzIHNob3VsZCBub3QgcmVzcG9uZCB0byBtb3VzZSBldmVudHMKKyAgICAg IC8qIGZhbGxzIHRocm91Z2ggKi8KKyAgICAgIGNhc2UgJ3RvcE1vdXNlT3V0JzoKKyAgICAgIGNh c2UgJ3RvcE1vdXNlT3Zlcic6CisgICAgICBjYXNlICd0b3BDb250ZXh0TWVudSc6CisgICAgICAg IEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNNb3VzZUV2ZW50OworICAgICAgICBicmVhazsK KyAgICAgIGNhc2UgJ3RvcERyYWcnOgorICAgICAgY2FzZSAndG9wRHJhZ0VuZCc6CisgICAgICBj YXNlICd0b3BEcmFnRW50ZXInOgorICAgICAgY2FzZSAndG9wRHJhZ0V4aXQnOgorICAgICAgY2Fz ZSAndG9wRHJhZ0xlYXZlJzoKKyAgICAgIGNhc2UgJ3RvcERyYWdPdmVyJzoKKyAgICAgIGNhc2Ug J3RvcERyYWdTdGFydCc6CisgICAgICBjYXNlICd0b3BEcm9wJzoKKyAgICAgICAgRXZlbnRDb25z dHJ1Y3RvciA9IFN5bnRoZXRpY0RyYWdFdmVudDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNl ICd0b3BUb3VjaENhbmNlbCc6CisgICAgICBjYXNlICd0b3BUb3VjaEVuZCc6CisgICAgICBjYXNl ICd0b3BUb3VjaE1vdmUnOgorICAgICAgY2FzZSAndG9wVG91Y2hTdGFydCc6CisgICAgICAgIEV2 ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNUb3VjaEV2ZW50OworICAgICAgICBicmVhazsKKyAg ICAgIGNhc2UgJ3RvcEFuaW1hdGlvbkVuZCc6CisgICAgICBjYXNlICd0b3BBbmltYXRpb25JdGVy YXRpb24nOgorICAgICAgY2FzZSAndG9wQW5pbWF0aW9uU3RhcnQnOgorICAgICAgICBFdmVudENv bnN0cnVjdG9yID0gU3ludGhldGljQW5pbWF0aW9uRXZlbnQ7CisgICAgICAgIGJyZWFrOworICAg ICAgY2FzZSAndG9wVHJhbnNpdGlvbkVuZCc6CisgICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBT eW50aGV0aWNUcmFuc2l0aW9uRXZlbnQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAndG9w U2Nyb2xsJzoKKyAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY1VJRXZlbnQ7Cisg ICAgICAgIGJyZWFrOworICAgICAgY2FzZSAndG9wV2hlZWwnOgorICAgICAgICBFdmVudENvbnN0 cnVjdG9yID0gU3ludGhldGljV2hlZWxFdmVudDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNl ICd0b3BDb3B5JzoKKyAgICAgIGNhc2UgJ3RvcEN1dCc6CisgICAgICBjYXNlICd0b3BQYXN0ZSc6 CisgICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNDbGlwYm9hcmRFdmVudDsKKyAg ICAgICAgYnJlYWs7CisgICAgfQorICAgICFFdmVudENvbnN0cnVjdG9yID8gImRldmVsb3BtZW50 IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnU2ltcGxlRXZlbnRQbHVnaW46 IFVuaGFuZGxlZCBldmVudCB0eXBlLCBgJXNgLicsIHRvcExldmVsVHlwZSkgOiBfcHJvZEludmFy aWFudCgnODYnLCB0b3BMZXZlbFR5cGUpIDogdm9pZCAwOworICAgIHZhciBldmVudCA9IEV2ZW50 Q29uc3RydWN0b3IuZ2V0UG9vbGVkKGRpc3BhdGNoQ29uZmlnLCB0YXJnZXRJbnN0LCBuYXRpdmVF dmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpOworICAgIEV2ZW50UHJvcGFnYXRvcnMuYWNjdW11bGF0 ZVR3b1BoYXNlRGlzcGF0Y2hlcyhldmVudCk7CisgICAgcmV0dXJuIGV2ZW50OworICB9LAorCisg IGRpZFB1dExpc3RlbmVyOiBmdW5jdGlvbiAoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSwgbGlzdGVu ZXIpIHsKKyAgICAvLyBNb2JpbGUgU2FmYXJpIGRvZXMgbm90IGZpcmUgcHJvcGVybHkgYnViYmxl IGNsaWNrIGV2ZW50cyBvbgorICAgIC8vIG5vbi1pbnRlcmFjdGl2ZSBlbGVtZW50cywgd2hpY2gg bWVhbnMgZGVsZWdhdGVkIGNsaWNrIGxpc3RlbmVycyBkbyBub3QKKyAgICAvLyBmaXJlLiBUaGUg d29ya2Fyb3VuZCBmb3IgdGhpcyBidWcgaW52b2x2ZXMgYXR0YWNoaW5nIGFuIGVtcHR5IGNsaWNr CisgICAgLy8gbGlzdGVuZXIgb24gdGhlIHRhcmdldCBub2RlLgorICAgIC8vIGh0dHA6Ly93d3cu cXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDEwLzA5L2NsaWNrX2V2ZW50X2RlbC5odG1s CisgICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWUgPT09ICdvbkNsaWNrJyAmJiAhaXNJbnRlcmFjdGl2 ZShpbnN0Ll90YWcpKSB7CisgICAgICB2YXIga2V5ID0gZ2V0RGljdGlvbmFyeUtleShpbnN0KTsK KyAgICAgIHZhciBub2RlID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFu Y2UoaW5zdCk7CisgICAgICBpZiAoIW9uQ2xpY2tMaXN0ZW5lcnNba2V5XSkgeworICAgICAgICBv bkNsaWNrTGlzdGVuZXJzW2tleV0gPSBFdmVudExpc3RlbmVyLmxpc3Rlbihub2RlLCAnY2xpY2sn LCBlbXB0eUZ1bmN0aW9uKTsKKyAgICAgIH0KKyAgICB9CisgIH0sCisKKyAgd2lsbERlbGV0ZUxp c3RlbmVyOiBmdW5jdGlvbiAoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSkgeworICAgIGlmIChyZWdp c3RyYXRpb25OYW1lID09PSAnb25DbGljaycgJiYgIWlzSW50ZXJhY3RpdmUoaW5zdC5fdGFnKSkg eworICAgICAgdmFyIGtleSA9IGdldERpY3Rpb25hcnlLZXkoaW5zdCk7CisgICAgICBvbkNsaWNr TGlzdGVuZXJzW2tleV0ucmVtb3ZlKCk7CisgICAgICBkZWxldGUgb25DbGlja0xpc3RlbmVyc1tr ZXldOworICAgIH0KKyAgfQorCit9OworCittb2R1bGUuZXhwb3J0cyA9IFNpbXBsZUV2ZW50UGx1 Z2luOworfSx7IjExMSI6MTExLCIxMjUiOjEyNSwiMTM1IjoxMzUsIjE0MiI6MTQyLCIxNTAiOjE1 MCwiMjAiOjIwLCIzNCI6MzQsIjg3Ijo4NywiODgiOjg4LCI5MCI6OTAsIjkxIjo5MSwiOTIiOjky LCI5NCI6OTQsIjk1Ijo5NSwiOTYiOjk2LCI5NyI6OTcsIjk4Ijo5OCwiOTkiOjk5fV0sODc6W2Z1 bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1w cmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBU aGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBm b3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhp cyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBj YW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisg KgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFN5bnRoZXRpY0V2ZW50ID0gX2RlcmVxXyg5 MSk7CisKKy8qKgorICogQGludGVyZmFjZSBFdmVudAorICogQHNlZSBodHRwOi8vd3d3LnczLm9y Zy9UUi9jc3MzLWFuaW1hdGlvbnMvI0FuaW1hdGlvbkV2ZW50LWludGVyZmFjZQorICogQHNlZSBo dHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQW5pbWF0aW9u RXZlbnQKKyAqLwordmFyIEFuaW1hdGlvbkV2ZW50SW50ZXJmYWNlID0geworICBhbmltYXRpb25O YW1lOiBudWxsLAorICBlbGFwc2VkVGltZTogbnVsbCwKKyAgcHNldWRvRWxlbWVudDogbnVsbAor fTsKKworLyoqCisgKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlv biB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgZXZlbnQuCisgKiBAcGFyYW0ge3N0cmluZ30gZGlzcGF0 Y2hNYXJrZXIgTWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuCisgKiBAcGFyYW0g e29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuCisgKiBAZXh0ZW5kcyB7 U3ludGhldGljRXZlbnR9CisgKi8KK2Z1bmN0aW9uIFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50KGRp c3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFy Z2V0KSB7CisgIHJldHVybiBTeW50aGV0aWNFdmVudC5jYWxsKHRoaXMsIGRpc3BhdGNoQ29uZmln LCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTsKK30KKwor U3ludGhldGljRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50LCBBbmlt YXRpb25FdmVudEludGVyZmFjZSk7CisKK21vZHVsZS5leHBvcnRzID0gU3ludGhldGljQW5pbWF0 aW9uRXZlbnQ7Cit9LHsiOTEiOjkxfV0sODg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9y dHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICog QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2Vk IHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmls ZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25h bCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMg ZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwor dmFyIFN5bnRoZXRpY0V2ZW50ID0gX2RlcmVxXyg5MSk7CisKKy8qKgorICogQGludGVyZmFjZSBF dmVudAorICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9jbGlwYm9hcmQtYXBpcy8KKyAqLwor dmFyIENsaXBib2FyZEV2ZW50SW50ZXJmYWNlID0geworICBjbGlwYm9hcmREYXRhOiBmdW5jdGlv biAoZXZlbnQpIHsKKyAgICByZXR1cm4gJ2NsaXBib2FyZERhdGEnIGluIGV2ZW50ID8gZXZlbnQu Y2xpcGJvYXJkRGF0YSA6IHdpbmRvdy5jbGlwYm9hcmREYXRhOworICB9Cit9OworCisvKioKKyAq IEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlz cGF0Y2ggdGhpcyBldmVudC4KKyAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJr ZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC4KKyAqIEBwYXJhbSB7b2JqZWN0fSBuYXRp dmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC4KKyAqIEBleHRlbmRzIHtTeW50aGV0aWNVSUV2 ZW50fQorICovCitmdW5jdGlvbiBTeW50aGV0aWNDbGlwYm9hcmRFdmVudChkaXNwYXRjaENvbmZp ZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkgeworICBy ZXR1cm4gU3ludGhldGljRXZlbnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hN YXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7Cit9CisKK1N5bnRoZXRpY0V2 ZW50LmF1Z21lbnRDbGFzcyhTeW50aGV0aWNDbGlwYm9hcmRFdmVudCwgQ2xpcGJvYXJkRXZlbnRJ bnRlcmZhY2UpOworCittb2R1bGUuZXhwb3J0cyA9IFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50Owor fSx7IjkxIjo5MX1dLDg5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgor ICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMg cmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUg QlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJv b3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAq IG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhl IHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBTeW50aGV0 aWNFdmVudCA9IF9kZXJlcV8oOTEpOworCisvKioKKyAqIEBpbnRlcmZhY2UgRXZlbnQKKyAqIEBz ZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtY29tcG9z aXRpb25ldmVudHMKKyAqLwordmFyIENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UgPSB7CisgIGRh dGE6IG51bGwKK307CisKKy8qKgorICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENv bmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LgorICogQHBhcmFtIHtzdHJp bmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0Lgor ICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LgorICog QGV4dGVuZHMge1N5bnRoZXRpY1VJRXZlbnR9CisgKi8KK2Z1bmN0aW9uIFN5bnRoZXRpY0NvbXBv c2l0aW9uRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwg bmF0aXZlRXZlbnRUYXJnZXQpIHsKKyAgcmV0dXJuIFN5bnRoZXRpY0V2ZW50LmNhbGwodGhpcywg ZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRU YXJnZXQpOworfQorCitTeW50aGV0aWNFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGljQ29tcG9z aXRpb25FdmVudCwgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZSk7CisKK21vZHVsZS5leHBvcnRz ID0gU3ludGhldGljQ29tcG9zaXRpb25FdmVudDsKK30seyI5MSI6OTF9XSw5MDpbZnVuY3Rpb24o X2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQs IEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291 cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGlu IHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJj ZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBm b3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8K KworJ3VzZSBzdHJpY3QnOworCit2YXIgU3ludGhldGljTW91c2VFdmVudCA9IF9kZXJlcV8oOTUp OworCisvKioKKyAqIEBpbnRlcmZhY2UgRHJhZ0V2ZW50CisgKiBAc2VlIGh0dHA6Ly93d3cudzMu b3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8KKyAqLwordmFyIERyYWdFdmVudEludGVyZmFjZSA9 IHsKKyAgZGF0YVRyYW5zZmVyOiBudWxsCit9OworCisvKioKKyAqIEBwYXJhbSB7b2JqZWN0fSBk aXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC4K KyAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJrZXIgaWRlbnRpZnlpbmcgdGhl IGV2ZW50IHRhcmdldC4KKyAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJv d3NlciBldmVudC4KKyAqIEBleHRlbmRzIHtTeW50aGV0aWNVSUV2ZW50fQorICovCitmdW5jdGlv biBTeW50aGV0aWNEcmFnRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRp dmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHsKKyAgcmV0dXJuIFN5bnRoZXRpY01vdXNlRXZl bnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50 LCBuYXRpdmVFdmVudFRhcmdldCk7Cit9CisKK1N5bnRoZXRpY01vdXNlRXZlbnQuYXVnbWVudENs YXNzKFN5bnRoZXRpY0RyYWdFdmVudCwgRHJhZ0V2ZW50SW50ZXJmYWNlKTsKKworbW9kdWxlLmV4 cG9ydHMgPSBTeW50aGV0aWNEcmFnRXZlbnQ7Cit9LHsiOTUiOjk1fV0sOTE6W2Z1bmN0aW9uKF9k ZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBG YWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJj ZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0 aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2Ug dHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91 bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisK Kyd1c2Ugc3RyaWN0JzsKKwordmFyIF9hc3NpZ24gPSBfZGVyZXFfKDE1OCk7CisKK3ZhciBQb29s ZWRDbGFzcyA9IF9kZXJlcV8oMjUpOworCit2YXIgZW1wdHlGdW5jdGlvbiA9IF9kZXJlcV8oMTQy KTsKK3ZhciB3YXJuaW5nID0gX2RlcmVxXygxNTcpOworCit2YXIgZGlkV2FybkZvckFkZGVkTmV3 UHJvcGVydHkgPSBmYWxzZTsKK3ZhciBpc1Byb3h5U3VwcG9ydGVkID0gdHlwZW9mIFByb3h5ID09 PSAnZnVuY3Rpb24nOworCit2YXIgc2hvdWxkQmVSZWxlYXNlZFByb3BlcnRpZXMgPSBbJ2Rpc3Bh dGNoQ29uZmlnJywgJ190YXJnZXRJbnN0JywgJ25hdGl2ZUV2ZW50JywgJ2lzRGVmYXVsdFByZXZl bnRlZCcsICdpc1Byb3BhZ2F0aW9uU3RvcHBlZCcsICdfZGlzcGF0Y2hMaXN0ZW5lcnMnLCAnX2Rp c3BhdGNoSW5zdGFuY2VzJ107CisKKy8qKgorICogQGludGVyZmFjZSBFdmVudAorICogQHNlZSBo dHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvCisgKi8KK3ZhciBFdmVudElu dGVyZmFjZSA9IHsKKyAgdHlwZTogbnVsbCwKKyAgdGFyZ2V0OiBudWxsLAorICAvLyBjdXJyZW50 VGFyZ2V0IGlzIHNldCB3aGVuIGRpc3BhdGNoaW5nOyBubyB1c2UgaW4gY29weWluZyBpdCBoZXJl CisgIGN1cnJlbnRUYXJnZXQ6IGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNOdWxsLAorICBldmVu dFBoYXNlOiBudWxsLAorICBidWJibGVzOiBudWxsLAorICBjYW5jZWxhYmxlOiBudWxsLAorICB0 aW1lU3RhbXA6IGZ1bmN0aW9uIChldmVudCkgeworICAgIHJldHVybiBldmVudC50aW1lU3RhbXAg fHwgRGF0ZS5ub3coKTsKKyAgfSwKKyAgZGVmYXVsdFByZXZlbnRlZDogbnVsbCwKKyAgaXNUcnVz dGVkOiBudWxsCit9OworCisvKioKKyAqIFN5bnRoZXRpYyBldmVudHMgYXJlIGRpc3BhdGNoZWQg YnkgZXZlbnQgcGx1Z2lucywgdHlwaWNhbGx5IGluIHJlc3BvbnNlIHRvIGEKKyAqIHRvcC1sZXZl bCBldmVudCBkZWxlZ2F0aW9uIGhhbmRsZXIuCisgKgorICogVGhlc2Ugc3lzdGVtcyBzaG91bGQg Z2VuZXJhbGx5IHVzZSBwb29saW5nIHRvIHJlZHVjZSB0aGUgZnJlcXVlbmN5IG9mIGdhcmJhZ2UK KyAqIGNvbGxlY3Rpb24uIFRoZSBzeXN0ZW0gc2hvdWxkIGNoZWNrIGBpc1BlcnNpc3RlbnRgIHRv IGRldGVybWluZSB3aGV0aGVyIHRoZQorICogZXZlbnQgc2hvdWxkIGJlIHJlbGVhc2VkIGludG8g dGhlIHBvb2wgYWZ0ZXIgYmVpbmcgZGlzcGF0Y2hlZC4gVXNlcnMgdGhhdAorICogbmVlZCBhIHBl cnNpc3RlZCBldmVudCBzaG91bGQgaW52b2tlIGBwZXJzaXN0YC4KKyAqCisgKiBTeW50aGV0aWMg ZXZlbnRzIChhbmQgc3ViY2xhc3NlcykgaW1wbGVtZW50IHRoZSBET00gTGV2ZWwgMyBFdmVudHMg QVBJIGJ5CisgKiBub3JtYWxpemluZyBicm93c2VyIHF1aXJrcy4gU3ViY2xhc3NlcyBkbyBub3Qg bmVjZXNzYXJpbHkgaGF2ZSB0byBpbXBsZW1lbnQgYQorICogRE9NIGludGVyZmFjZTsgY3VzdG9t IGFwcGxpY2F0aW9uLXNwZWNpZmljIGV2ZW50cyBjYW4gYWxzbyBzdWJjbGFzcyB0aGlzLgorICoK KyAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8g ZGlzcGF0Y2ggdGhpcyBldmVudC4KKyAqIEBwYXJhbSB7Kn0gdGFyZ2V0SW5zdCBNYXJrZXIgaWRl bnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC4KKyAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVu dCBOYXRpdmUgYnJvd3NlciBldmVudC4KKyAqIEBwYXJhbSB7RE9NRXZlbnRUYXJnZXR9IG5hdGl2 ZUV2ZW50VGFyZ2V0IFRhcmdldCBub2RlLgorICovCitmdW5jdGlvbiBTeW50aGV0aWNFdmVudChk aXNwYXRjaENvbmZpZywgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0 KSB7CisgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAvLyB0aGVz ZSBoYXZlIGEgZ2V0dGVyL3NldHRlciBmb3Igd2FybmluZ3MKKyAgICBkZWxldGUgdGhpcy5uYXRp dmVFdmVudDsKKyAgICBkZWxldGUgdGhpcy5wcmV2ZW50RGVmYXVsdDsKKyAgICBkZWxldGUgdGhp cy5zdG9wUHJvcGFnYXRpb247CisgIH0KKworICB0aGlzLmRpc3BhdGNoQ29uZmlnID0gZGlzcGF0 Y2hDb25maWc7CisgIHRoaXMuX3RhcmdldEluc3QgPSB0YXJnZXRJbnN0OworICB0aGlzLm5hdGl2 ZUV2ZW50ID0gbmF0aXZlRXZlbnQ7CisKKyAgdmFyIEludGVyZmFjZSA9IHRoaXMuY29uc3RydWN0 b3IuSW50ZXJmYWNlOworICBmb3IgKHZhciBwcm9wTmFtZSBpbiBJbnRlcmZhY2UpIHsKKyAgICBp ZiAoIUludGVyZmFjZS5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHsKKyAgICAgIGNvbnRpbnVl OworICAgIH0KKyAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAg ICBkZWxldGUgdGhpc1twcm9wTmFtZV07IC8vIHRoaXMgaGFzIGEgZ2V0dGVyL3NldHRlciBmb3Ig d2FybmluZ3MKKyAgICB9CisgICAgdmFyIG5vcm1hbGl6ZSA9IEludGVyZmFjZVtwcm9wTmFtZV07 CisgICAgaWYgKG5vcm1hbGl6ZSkgeworICAgICAgdGhpc1twcm9wTmFtZV0gPSBub3JtYWxpemUo bmF0aXZlRXZlbnQpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAocHJvcE5hbWUgPT09ICd0YXJn ZXQnKSB7CisgICAgICAgIHRoaXMudGFyZ2V0ID0gbmF0aXZlRXZlbnRUYXJnZXQ7CisgICAgICB9 IGVsc2UgeworICAgICAgICB0aGlzW3Byb3BOYW1lXSA9IG5hdGl2ZUV2ZW50W3Byb3BOYW1lXTsK KyAgICAgIH0KKyAgICB9CisgIH0KKworICB2YXIgZGVmYXVsdFByZXZlbnRlZCA9IG5hdGl2ZUV2 ZW50LmRlZmF1bHRQcmV2ZW50ZWQgIT0gbnVsbCA/IG5hdGl2ZUV2ZW50LmRlZmF1bHRQcmV2ZW50 ZWQgOiBuYXRpdmVFdmVudC5yZXR1cm5WYWx1ZSA9PT0gZmFsc2U7CisgIGlmIChkZWZhdWx0UHJl dmVudGVkKSB7CisgICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBlbXB0eUZ1bmN0aW9uLnRo YXRSZXR1cm5zVHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9 IGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNGYWxzZTsKKyAgfQorICB0aGlzLmlzUHJvcGFnYXRp b25TdG9wcGVkID0gZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc0ZhbHNlOworICByZXR1cm4gdGhp czsKK30KKworX2Fzc2lnbihTeW50aGV0aWNFdmVudC5wcm90b3R5cGUsIHsKKworICBwcmV2ZW50 RGVmYXVsdDogZnVuY3Rpb24gKCkgeworICAgIHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7 CisgICAgdmFyIGV2ZW50ID0gdGhpcy5uYXRpdmVFdmVudDsKKyAgICBpZiAoIWV2ZW50KSB7Cisg ICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGV2ZW50LnByZXZlbnREZWZhdWx0KSB7Cisg ICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOworICAgIH0gZWxzZSBpZiAodHlwZW9mIGV2ZW50 LnJldHVyblZhbHVlICE9PSAndW5rbm93bicpIHsKKyAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxp bmUgdmFsaWQtdHlwZW9mCisgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlOworICAgIH0K KyAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNU cnVlOworICB9LAorCisgIHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24gKCkgeworICAgIHZhciBl dmVudCA9IHRoaXMubmF0aXZlRXZlbnQ7CisgICAgaWYgKCFldmVudCkgeworICAgICAgcmV0dXJu OworICAgIH0KKworICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIHsKKyAgICAgIGV2ZW50 LnN0b3BQcm9wYWdhdGlvbigpOworICAgIH0gZWxzZSBpZiAodHlwZW9mIGV2ZW50LmNhbmNlbEJ1 YmJsZSAhPT0gJ3Vua25vd24nKSB7CisgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHZhbGlk LXR5cGVvZgorICAgICAgLy8gVGhlIENoYW5nZUV2ZW50UGx1Z2luIHJlZ2lzdGVycyBhICJwcm9w ZXJ0eWNoYW5nZSIgZXZlbnQgZm9yCisgICAgICAvLyBJRS4gVGhpcyBldmVudCBkb2VzIG5vdCBz dXBwb3J0IGJ1YmJsaW5nIG9yIGNhbmNlbGxpbmcsIGFuZAorICAgICAgLy8gYW55IHJlZmVyZW5j ZXMgdG8gY2FuY2VsQnViYmxlIHRocm93ICJNZW1iZXIgbm90IGZvdW5kIi4gIEEKKyAgICAgIC8v IHR5cGVvZiBjaGVjayBvZiAidW5rbm93biIgY2lyY3VtdmVudHMgdGhpcyBpc3N1ZSAoYW5kIGlz IGFsc28KKyAgICAgIC8vIElFIHNwZWNpZmljKS4KKyAgICAgIGV2ZW50LmNhbmNlbEJ1YmJsZSA9 IHRydWU7CisgICAgfQorCisgICAgdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IGVtcHR5RnVu Y3Rpb24udGhhdFJldHVybnNUcnVlOworICB9LAorCisgIC8qKgorICAgKiBXZSByZWxlYXNlIGFs bCBkaXNwYXRjaGVkIGBTeW50aGV0aWNFdmVudGBzIGFmdGVyIGVhY2ggZXZlbnQgbG9vcCwgYWRk aW5nCisgICAqIHRoZW0gYmFjayBpbnRvIHRoZSBwb29sLiBUaGlzIGFsbG93cyBhIHdheSB0byBo b2xkIG9udG8gYSByZWZlcmVuY2UgdGhhdAorICAgKiB3b24ndCBiZSBhZGRlZCBiYWNrIGludG8g dGhlIHBvb2wuCisgICAqLworICBwZXJzaXN0OiBmdW5jdGlvbiAoKSB7CisgICAgdGhpcy5pc1Bl cnNpc3RlbnQgPSBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zVHJ1ZTsKKyAgfSwKKworICAvKioK KyAgICogQ2hlY2tzIGlmIHRoaXMgZXZlbnQgc2hvdWxkIGJlIHJlbGVhc2VkIGJhY2sgaW50byB0 aGUgcG9vbC4KKyAgICoKKyAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGlzIHNob3Vs ZCBub3QgYmUgcmVsZWFzZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIGlzUGVyc2lzdGVu dDogZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc0ZhbHNlLAorCisgIC8qKgorICAgKiBgUG9vbGVk Q2xhc3NgIGxvb2tzIGZvciBgZGVzdHJ1Y3RvcmAgb24gZWFjaCBpbnN0YW5jZSBpdCByZWxlYXNl cy4KKyAgICovCisgIGRlc3RydWN0b3I6IGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgSW50ZXJmYWNl ID0gdGhpcy5jb25zdHJ1Y3Rvci5JbnRlcmZhY2U7CisgICAgZm9yICh2YXIgcHJvcE5hbWUgaW4g SW50ZXJmYWNlKSB7CisgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7 CisgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wTmFtZSwgZ2V0UG9vbGVk V2FybmluZ1Byb3BlcnR5RGVmaW5pdGlvbihwcm9wTmFtZSwgSW50ZXJmYWNlW3Byb3BOYW1lXSkp OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpc1twcm9wTmFtZV0gPSBudWxsOworICAgICAg fQorICAgIH0KKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNob3VsZEJlUmVsZWFzZWRQcm9wZXJ0 aWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICB0aGlzW3Nob3VsZEJlUmVsZWFzZWRQcm9wZXJ0aWVz W2ldXSA9IG51bGw7CisgICAgfQorICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlv bicpIHsKKyAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbmF0aXZlRXZlbnQnLCBn ZXRQb29sZWRXYXJuaW5nUHJvcGVydHlEZWZpbml0aW9uKCduYXRpdmVFdmVudCcsIG51bGwpKTsK KyAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncHJldmVudERlZmF1bHQnLCBnZXRQ b29sZWRXYXJuaW5nUHJvcGVydHlEZWZpbml0aW9uKCdwcmV2ZW50RGVmYXVsdCcsIGVtcHR5RnVu Y3Rpb24pKTsKKyAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnc3RvcFByb3BhZ2F0 aW9uJywgZ2V0UG9vbGVkV2FybmluZ1Byb3BlcnR5RGVmaW5pdGlvbignc3RvcFByb3BhZ2F0aW9u JywgZW1wdHlGdW5jdGlvbikpOworICAgIH0KKyAgfQorCit9KTsKKworU3ludGhldGljRXZlbnQu SW50ZXJmYWNlID0gRXZlbnRJbnRlcmZhY2U7CisKK2lmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJv ZHVjdGlvbicpIHsKKyAgaWYgKGlzUHJveHlTdXBwb3J0ZWQpIHsKKyAgICAvKmVzbGludC1kaXNh YmxlIG5vLWZ1bmMtYXNzaWduICovCisgICAgU3ludGhldGljRXZlbnQgPSBuZXcgUHJveHkoU3lu dGhldGljRXZlbnQsIHsKKyAgICAgIGNvbnN0cnVjdDogZnVuY3Rpb24gKHRhcmdldCwgYXJncykg eworICAgICAgICByZXR1cm4gdGhpcy5hcHBseSh0YXJnZXQsIE9iamVjdC5jcmVhdGUodGFyZ2V0 LnByb3RvdHlwZSksIGFyZ3MpOworICAgICAgfSwKKyAgICAgIGFwcGx5OiBmdW5jdGlvbiAoY29u c3RydWN0b3IsIHRoYXQsIGFyZ3MpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQcm94eShjb25zdHJ1 Y3Rvci5hcHBseSh0aGF0LCBhcmdzKSwgeworICAgICAgICAgIHNldDogZnVuY3Rpb24gKHRhcmdl dCwgcHJvcCwgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmIChwcm9wICE9PSAnaXNQZXJzaXN0ZW50 JyAmJiAhdGFyZ2V0LmNvbnN0cnVjdG9yLkludGVyZmFjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSAm JiBzaG91bGRCZVJlbGVhc2VkUHJvcGVydGllcy5pbmRleE9mKHByb3ApID09PSAtMSkgeworICAg ICAgICAgICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGRpZFdh cm5Gb3JBZGRlZE5ld1Byb3BlcnR5IHx8IHRhcmdldC5pc1BlcnNpc3RlbnQoKSwgJ1RoaXMgc3lu dGhldGljIGV2ZW50IGlzIHJldXNlZCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4gSWYgeW91XCdy ZSAnICsgJ3NlZWluZyB0aGlzLCB5b3VcJ3JlIGFkZGluZyBhIG5ldyBwcm9wZXJ0eSBpbiB0aGUg c3ludGhldGljIGV2ZW50IG9iamVjdC4gJyArICdUaGUgcHJvcGVydHkgaXMgbmV2ZXIgcmVsZWFz ZWQuIFNlZSAnICsgJ2h0dHBzOi8vZmIubWUvcmVhY3QtZXZlbnQtcG9vbGluZyBmb3IgbW9yZSBp bmZvcm1hdGlvbi4nKSA6IHZvaWQgMDsKKyAgICAgICAgICAgICAgZGlkV2FybkZvckFkZGVkTmV3 UHJvcGVydHkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGFyZ2V0W3Byb3Bd ID0gdmFsdWU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAg IH0pOworICAgICAgfQorICAgIH0pOworICAgIC8qZXNsaW50LWVuYWJsZSBuby1mdW5jLWFzc2ln biAqLworICB9Cit9CisvKioKKyAqIEhlbHBlciB0byByZWR1Y2UgYm9pbGVycGxhdGUgd2hlbiBj cmVhdGluZyBzdWJjbGFzc2VzLgorICoKKyAqIEBwYXJhbSB7ZnVuY3Rpb259IENsYXNzCisgKiBA cGFyYW0gez9vYmplY3R9IEludGVyZmFjZQorICovCitTeW50aGV0aWNFdmVudC5hdWdtZW50Q2xh c3MgPSBmdW5jdGlvbiAoQ2xhc3MsIEludGVyZmFjZSkgeworICB2YXIgU3VwZXIgPSB0aGlzOwor CisgIHZhciBFID0gZnVuY3Rpb24gKCkge307CisgIEUucHJvdG90eXBlID0gU3VwZXIucHJvdG90 eXBlOworICB2YXIgcHJvdG90eXBlID0gbmV3IEUoKTsKKworICBfYXNzaWduKHByb3RvdHlwZSwg Q2xhc3MucHJvdG90eXBlKTsKKyAgQ2xhc3MucHJvdG90eXBlID0gcHJvdG90eXBlOworICBDbGFz cy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDbGFzczsKKworICBDbGFzcy5JbnRlcmZhY2UgPSBf YXNzaWduKHt9LCBTdXBlci5JbnRlcmZhY2UsIEludGVyZmFjZSk7CisgIENsYXNzLmF1Z21lbnRD bGFzcyA9IFN1cGVyLmF1Z21lbnRDbGFzczsKKworICBQb29sZWRDbGFzcy5hZGRQb29saW5nVG8o Q2xhc3MsIFBvb2xlZENsYXNzLmZvdXJBcmd1bWVudFBvb2xlcik7Cit9OworCitQb29sZWRDbGFz cy5hZGRQb29saW5nVG8oU3ludGhldGljRXZlbnQsIFBvb2xlZENsYXNzLmZvdXJBcmd1bWVudFBv b2xlcik7CisKK21vZHVsZS5leHBvcnRzID0gU3ludGhldGljRXZlbnQ7CisKKy8qKgorICAqIEhl bHBlciB0byBudWxsaWZ5IHN5bnRoZXRpY0V2ZW50IGluc3RhbmNlIHByb3BlcnRpZXMgd2hlbiBk ZXN0cnVjdGluZworICAqCisgICogQHBhcmFtIHtvYmplY3R9IFN5bnRoZXRpY0V2ZW50CisgICog QHBhcmFtIHtTdHJpbmd9IHByb3BOYW1lCisgICogQHJldHVybiB7b2JqZWN0fSBkZWZpbmVQcm9w ZXJ0eSBvYmplY3QKKyAgKi8KK2Z1bmN0aW9uIGdldFBvb2xlZFdhcm5pbmdQcm9wZXJ0eURlZmlu aXRpb24ocHJvcE5hbWUsIGdldFZhbCkgeworICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiBnZXRW YWwgPT09ICdmdW5jdGlvbic7CisgIHJldHVybiB7CisgICAgY29uZmlndXJhYmxlOiB0cnVlLAor ICAgIHNldDogc2V0LAorICAgIGdldDogZ2V0CisgIH07CisKKyAgZnVuY3Rpb24gc2V0KHZhbCkg eworICAgIHZhciBhY3Rpb24gPSBpc0Z1bmN0aW9uID8gJ3NldHRpbmcgdGhlIG1ldGhvZCcgOiAn c2V0dGluZyB0aGUgcHJvcGVydHknOworICAgIHdhcm4oYWN0aW9uLCAnVGhpcyBpcyBlZmZlY3Rp dmVseSBhIG5vLW9wJyk7CisgICAgcmV0dXJuIHZhbDsKKyAgfQorCisgIGZ1bmN0aW9uIGdldCgp IHsKKyAgICB2YXIgYWN0aW9uID0gaXNGdW5jdGlvbiA/ICdhY2Nlc3NpbmcgdGhlIG1ldGhvZCcg OiAnYWNjZXNzaW5nIHRoZSBwcm9wZXJ0eSc7CisgICAgdmFyIHJlc3VsdCA9IGlzRnVuY3Rpb24g PyAnVGhpcyBpcyBhIG5vLW9wIGZ1bmN0aW9uJyA6ICdUaGlzIGlzIHNldCB0byBudWxsJzsKKyAg ICB3YXJuKGFjdGlvbiwgcmVzdWx0KTsKKyAgICByZXR1cm4gZ2V0VmFsOworICB9CisKKyAgZnVu Y3Rpb24gd2FybihhY3Rpb24sIHJlc3VsdCkgeworICAgIHZhciB3YXJuaW5nQ29uZGl0aW9uID0g ZmFsc2U7CisgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyh3YXJu aW5nQ29uZGl0aW9uLCAnVGhpcyBzeW50aGV0aWMgZXZlbnQgaXMgcmV1c2VkIGZvciBwZXJmb3Jt YW5jZSByZWFzb25zLiBJZiB5b3VcJ3JlIHNlZWluZyB0aGlzLCAnICsgJ3lvdVwncmUgJXMgYCVz YCBvbiBhIHJlbGVhc2VkL251bGxpZmllZCBzeW50aGV0aWMgZXZlbnQuICVzLiAnICsgJ0lmIHlv dSBtdXN0IGtlZXAgdGhlIG9yaWdpbmFsIHN5bnRoZXRpYyBldmVudCBhcm91bmQsIHVzZSBldmVu dC5wZXJzaXN0KCkuICcgKyAnU2VlIGh0dHBzOi8vZmIubWUvcmVhY3QtZXZlbnQtcG9vbGluZyBm b3IgbW9yZSBpbmZvcm1hdGlvbi4nLCBhY3Rpb24sIHByb3BOYW1lLCByZXN1bHQpIDogdm9pZCAw OworICB9Cit9Cit9LHsiMTQyIjoxNDIsIjE1NyI6MTU3LCIxNTgiOjE1OCwiMjUiOjI1fV0sOTI6 W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAx My1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg KiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5z ZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2Yg dGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0 cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3Rvcnku CisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFN5bnRoZXRpY1VJRXZlbnQgPSBfZGVy ZXFfKDk4KTsKKworLyoqCisgKiBAaW50ZXJmYWNlIEZvY3VzRXZlbnQKKyAqIEBzZWUgaHR0cDov L3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLworICovCit2YXIgRm9jdXNFdmVudElu dGVyZmFjZSA9IHsKKyAgcmVsYXRlZFRhcmdldDogbnVsbAorfTsKKworLyoqCisgKiBAcGFyYW0g e29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3BhdGNoIHRo aXMgZXZlbnQuCisgKiBAcGFyYW0ge3N0cmluZ30gZGlzcGF0Y2hNYXJrZXIgTWFya2VyIGlkZW50 aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuCisgKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQg TmF0aXZlIGJyb3dzZXIgZXZlbnQuCisgKiBAZXh0ZW5kcyB7U3ludGhldGljVUlFdmVudH0KKyAq LworZnVuY3Rpb24gU3ludGhldGljRm9jdXNFdmVudChkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hN YXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkgeworICByZXR1cm4gU3ludGhl dGljVUlFdmVudC5jYWxsKHRoaXMsIGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0 aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTsKK30KKworU3ludGhldGljVUlFdmVudC5hdWdt ZW50Q2xhc3MoU3ludGhldGljRm9jdXNFdmVudCwgRm9jdXNFdmVudEludGVyZmFjZSk7CisKK21v ZHVsZS5leHBvcnRzID0gU3ludGhldGljRm9jdXNFdmVudDsKK30seyI5OCI6OTh9XSw5MzpbZnVu Y3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXBy ZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRo aXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZv dW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlz IHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNh biBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAq CisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgU3ludGhldGljRXZlbnQgPSBfZGVyZXFfKDkx KTsKKworLyoqCisgKiBAaW50ZXJmYWNlIEV2ZW50CisgKiBAc2VlIGh0dHA6Ly93d3cudzMub3Jn L1RSLzIwMTMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMTMxMTA1CisgKiAgICAgIC8jZXZlbnRz LWlucHV0ZXZlbnRzCisgKi8KK3ZhciBJbnB1dEV2ZW50SW50ZXJmYWNlID0geworICBkYXRhOiBu dWxsCit9OworCisvKioKKyAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1 cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC4KKyAqIEBwYXJhbSB7c3RyaW5nfSBk aXNwYXRjaE1hcmtlciBNYXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC4KKyAqIEBw YXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC4KKyAqIEBleHRl bmRzIHtTeW50aGV0aWNVSUV2ZW50fQorICovCitmdW5jdGlvbiBTeW50aGV0aWNJbnB1dEV2ZW50 KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50 VGFyZ2V0KSB7CisgIHJldHVybiBTeW50aGV0aWNFdmVudC5jYWxsKHRoaXMsIGRpc3BhdGNoQ29u ZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTsKK30K KworU3ludGhldGljRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY0lucHV0RXZlbnQsIElucHV0 RXZlbnRJbnRlcmZhY2UpOworCittb2R1bGUuZXhwb3J0cyA9IFN5bnRoZXRpY0lucHV0RXZlbnQ7 Cit9LHsiOTEiOjkxfV0sOTQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoq CisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0 cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRo ZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUg cm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAor ICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0 aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFN5bnRo ZXRpY1VJRXZlbnQgPSBfZGVyZXFfKDk4KTsKKwordmFyIGdldEV2ZW50Q2hhckNvZGUgPSBfZGVy ZXFfKDExMSk7Cit2YXIgZ2V0RXZlbnRLZXkgPSBfZGVyZXFfKDExMik7Cit2YXIgZ2V0RXZlbnRN b2RpZmllclN0YXRlID0gX2RlcmVxXygxMTMpOworCisvKioKKyAqIEBpbnRlcmZhY2UgS2V5Ym9h cmRFdmVudAorICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMv CisgKi8KK3ZhciBLZXlib2FyZEV2ZW50SW50ZXJmYWNlID0geworICBrZXk6IGdldEV2ZW50S2V5 LAorICBsb2NhdGlvbjogbnVsbCwKKyAgY3RybEtleTogbnVsbCwKKyAgc2hpZnRLZXk6IG51bGws CisgIGFsdEtleTogbnVsbCwKKyAgbWV0YUtleTogbnVsbCwKKyAgcmVwZWF0OiBudWxsLAorICBs b2NhbGU6IG51bGwsCisgIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZSwK KyAgLy8gTGVnYWN5IEludGVyZmFjZQorICBjaGFyQ29kZTogZnVuY3Rpb24gKGV2ZW50KSB7Cisg ICAgLy8gYGNoYXJDb2RlYCBpcyB0aGUgcmVzdWx0IG9mIGEgS2V5UHJlc3MgZXZlbnQgYW5kIHJl cHJlc2VudHMgdGhlIHZhbHVlIG9mCisgICAgLy8gdGhlIGFjdHVhbCBwcmludGFibGUgY2hhcmFj dGVyLgorCisgICAgLy8gS2V5UHJlc3MgaXMgZGVwcmVjYXRlZCwgYnV0IGl0cyByZXBsYWNlbWVu dCBpcyBub3QgeWV0IGZpbmFsIGFuZCBub3QKKyAgICAvLyBpbXBsZW1lbnRlZCBpbiBhbnkgbWFq b3IgYnJvd3Nlci4gT25seSBLZXlQcmVzcyBoYXMgY2hhckNvZGUuCisgICAgaWYgKGV2ZW50LnR5 cGUgPT09ICdrZXlwcmVzcycpIHsKKyAgICAgIHJldHVybiBnZXRFdmVudENoYXJDb2RlKGV2ZW50 KTsKKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0sCisgIGtleUNvZGU6IGZ1bmN0aW9uIChldmVu dCkgeworICAgIC8vIGBrZXlDb2RlYCBpcyB0aGUgcmVzdWx0IG9mIGEgS2V5RG93bi9VcCBldmVu dCBhbmQgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2YKKyAgICAvLyBwaHlzaWNhbCBrZXlib2FyZCBr ZXkuCisKKyAgICAvLyBUaGUgYWN0dWFsIG1lYW5pbmcgb2YgdGhlIHZhbHVlIGRlcGVuZHMgb24g dGhlIHVzZXJzJyBrZXlib2FyZCBsYXlvdXQKKyAgICAvLyB3aGljaCBjYW5ub3QgYmUgZGV0ZWN0 ZWQuIEFzc3VtaW5nIHRoYXQgaXQgaXMgYSBVUyBrZXlib2FyZCBsYXlvdXQKKyAgICAvLyBwcm92 aWRlcyBhIHN1cnByaXNpbmdseSBhY2N1cmF0ZSBtYXBwaW5nIGZvciBVUyBhbmQgRXVyb3BlYW4g dXNlcnMuCisgICAgLy8gRHVlIHRvIHRoaXMsIGl0IGlzIGxlZnQgdG8gdGhlIHVzZXIgdG8gaW1w bGVtZW50IGF0IHRoaXMgdGltZS4KKyAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8 IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHsKKyAgICAgIHJldHVybiBldmVudC5rZXlDb2RlOwor ICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfSwKKyAgd2hpY2g6IGZ1bmN0aW9uIChldmVudCkgewor ICAgIC8vIGB3aGljaGAgaXMgYW4gYWxpYXMgZm9yIGVpdGhlciBga2V5Q29kZWAgb3IgYGNoYXJD b2RlYCBkZXBlbmRpbmcgb24gdGhlCisgICAgLy8gdHlwZSBvZiB0aGUgZXZlbnQuCisgICAgaWYg KGV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHsKKyAgICAgIHJldHVybiBnZXRFdmVudENoYXJD b2RlKGV2ZW50KTsKKyAgICB9CisgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBl dmVudC50eXBlID09PSAna2V5dXAnKSB7CisgICAgICByZXR1cm4gZXZlbnQua2V5Q29kZTsKKyAg ICB9CisgICAgcmV0dXJuIDA7CisgIH0KK307CisKKy8qKgorICogQHBhcmFtIHtvYmplY3R9IGRp c3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50Lgor ICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUg ZXZlbnQgdGFyZ2V0LgorICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93 c2VyIGV2ZW50LgorICogQGV4dGVuZHMge1N5bnRoZXRpY1VJRXZlbnR9CisgKi8KK2Z1bmN0aW9u IFN5bnRoZXRpY0tleWJvYXJkRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBu YXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHsKKyAgcmV0dXJuIFN5bnRoZXRpY1VJRXZl bnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50 LCBuYXRpdmVFdmVudFRhcmdldCk7Cit9CisKK1N5bnRoZXRpY1VJRXZlbnQuYXVnbWVudENsYXNz KFN5bnRoZXRpY0tleWJvYXJkRXZlbnQsIEtleWJvYXJkRXZlbnRJbnRlcmZhY2UpOworCittb2R1 bGUuZXhwb3J0cyA9IFN5bnRoZXRpY0tleWJvYXJkRXZlbnQ7Cit9LHsiMTExIjoxMTEsIjExMiI6 MTEyLCIxMTMiOjExMywiOTgiOjk4fV0sOTU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9y dHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICog QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2Vk IHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmls ZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25h bCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMg ZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwor dmFyIFN5bnRoZXRpY1VJRXZlbnQgPSBfZGVyZXFfKDk4KTsKK3ZhciBWaWV3cG9ydE1ldHJpY3Mg PSBfZGVyZXFfKDEwMSk7CisKK3ZhciBnZXRFdmVudE1vZGlmaWVyU3RhdGUgPSBfZGVyZXFfKDEx Myk7CisKKy8qKgorICogQGludGVyZmFjZSBNb3VzZUV2ZW50CisgKiBAc2VlIGh0dHA6Ly93d3cu dzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8KKyAqLwordmFyIE1vdXNlRXZlbnRJbnRlcmZh Y2UgPSB7CisgIHNjcmVlblg6IG51bGwsCisgIHNjcmVlblk6IG51bGwsCisgIGNsaWVudFg6IG51 bGwsCisgIGNsaWVudFk6IG51bGwsCisgIGN0cmxLZXk6IG51bGwsCisgIHNoaWZ0S2V5OiBudWxs LAorICBhbHRLZXk6IG51bGwsCisgIG1ldGFLZXk6IG51bGwsCisgIGdldE1vZGlmaWVyU3RhdGU6 IGdldEV2ZW50TW9kaWZpZXJTdGF0ZSwKKyAgYnV0dG9uOiBmdW5jdGlvbiAoZXZlbnQpIHsKKyAg ICAvLyBXZWJraXQsIEZpcmVmb3gsIElFOSsKKyAgICAvLyB3aGljaDogIDEgMiAzCisgICAgLy8g YnV0dG9uOiAwIDEgMiAoc3RhbmRhcmQpCisgICAgdmFyIGJ1dHRvbiA9IGV2ZW50LmJ1dHRvbjsK KyAgICBpZiAoJ3doaWNoJyBpbiBldmVudCkgeworICAgICAgcmV0dXJuIGJ1dHRvbjsKKyAgICB9 CisgICAgLy8gSUU8OQorICAgIC8vIHdoaWNoOiAgdW5kZWZpbmVkCisgICAgLy8gYnV0dG9uOiAw IDAgMAorICAgIC8vIGJ1dHRvbjogMSA0IDIgKG9ubW91c2V1cCkKKyAgICByZXR1cm4gYnV0dG9u ID09PSAyID8gMiA6IGJ1dHRvbiA9PT0gNCA/IDEgOiAwOworICB9LAorICBidXR0b25zOiBudWxs LAorICByZWxhdGVkVGFyZ2V0OiBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICByZXR1cm4gZXZlbnQu cmVsYXRlZFRhcmdldCB8fCAoZXZlbnQuZnJvbUVsZW1lbnQgPT09IGV2ZW50LnNyY0VsZW1lbnQg PyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudCk7CisgIH0sCisgIC8vICJQcm9w cmlldGFyeSIgSW50ZXJmYWNlLgorICBwYWdlWDogZnVuY3Rpb24gKGV2ZW50KSB7CisgICAgcmV0 dXJuICdwYWdlWCcgaW4gZXZlbnQgPyBldmVudC5wYWdlWCA6IGV2ZW50LmNsaWVudFggKyBWaWV3 cG9ydE1ldHJpY3MuY3VycmVudFNjcm9sbExlZnQ7CisgIH0sCisgIHBhZ2VZOiBmdW5jdGlvbiAo ZXZlbnQpIHsKKyAgICByZXR1cm4gJ3BhZ2VZJyBpbiBldmVudCA/IGV2ZW50LnBhZ2VZIDogZXZl bnQuY2xpZW50WSArIFZpZXdwb3J0TWV0cmljcy5jdXJyZW50U2Nyb2xsVG9wOworICB9Cit9Owor CisvKioKKyAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVz ZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC4KKyAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1h cmtlciBNYXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC4KKyAqIEBwYXJhbSB7b2Jq ZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC4KKyAqIEBleHRlbmRzIHtTeW50 aGV0aWNVSUV2ZW50fQorICovCitmdW5jdGlvbiBTeW50aGV0aWNNb3VzZUV2ZW50KGRpc3BhdGNo Q29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7 CisgIHJldHVybiBTeW50aGV0aWNVSUV2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRp c3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpOworfQorCitTeW50 aGV0aWNVSUV2ZW50LmF1Z21lbnRDbGFzcyhTeW50aGV0aWNNb3VzZUV2ZW50LCBNb3VzZUV2ZW50 SW50ZXJmYWNlKTsKKworbW9kdWxlLmV4cG9ydHMgPSBTeW50aGV0aWNNb3VzZUV2ZW50OworfSx7 IjEwMSI6MTAxLCIxMTMiOjExMywiOTgiOjk4fV0sOTY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxl LGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5j LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxp Y2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VO U0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRk aXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBB VEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0 JzsKKwordmFyIFN5bnRoZXRpY1VJRXZlbnQgPSBfZGVyZXFfKDk4KTsKKwordmFyIGdldEV2ZW50 TW9kaWZpZXJTdGF0ZSA9IF9kZXJlcV8oMTEzKTsKKworLyoqCisgKiBAaW50ZXJmYWNlIFRvdWNo RXZlbnQKKyAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvdG91Y2gtZXZlbnRzLworICovCit2 YXIgVG91Y2hFdmVudEludGVyZmFjZSA9IHsKKyAgdG91Y2hlczogbnVsbCwKKyAgdGFyZ2V0VG91 Y2hlczogbnVsbCwKKyAgY2hhbmdlZFRvdWNoZXM6IG51bGwsCisgIGFsdEtleTogbnVsbCwKKyAg bWV0YUtleTogbnVsbCwKKyAgY3RybEtleTogbnVsbCwKKyAgc2hpZnRLZXk6IG51bGwsCisgIGdl dE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZQorfTsKKworLyoqCisgKiBAcGFy YW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3BhdGNo IHRoaXMgZXZlbnQuCisgKiBAcGFyYW0ge3N0cmluZ30gZGlzcGF0Y2hNYXJrZXIgTWFya2VyIGlk ZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuCisgKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZl bnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuCisgKiBAZXh0ZW5kcyB7U3ludGhldGljVUlFdmVudH0K KyAqLworZnVuY3Rpb24gU3ludGhldGljVG91Y2hFdmVudChkaXNwYXRjaENvbmZpZywgZGlzcGF0 Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkgeworICByZXR1cm4gU3lu dGhldGljVUlFdmVudC5jYWxsKHRoaXMsIGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwg bmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTsKK30KKworU3ludGhldGljVUlFdmVudC5h dWdtZW50Q2xhc3MoU3ludGhldGljVG91Y2hFdmVudCwgVG91Y2hFdmVudEludGVyZmFjZSk7CisK K21vZHVsZS5leHBvcnRzID0gU3ludGhldGljVG91Y2hFdmVudDsKK30seyIxMTMiOjExMywiOTgi Ojk4fV0sOTc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5 cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZl ZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5 bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJl Y3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0 ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBk aXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFN5bnRoZXRpY0V2ZW50 ID0gX2RlcmVxXyg5MSk7CisKKy8qKgorICogQGludGVyZmFjZSBFdmVudAorICogQHNlZSBodHRw Oi8vd3d3LnczLm9yZy9UUi8yMDA5L1dELWNzczMtdHJhbnNpdGlvbnMtMjAwOTAzMjAvI3RyYW5z aXRpb24tZXZlbnRzLQorICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1V Uy9kb2NzL1dlYi9BUEkvVHJhbnNpdGlvbkV2ZW50CisgKi8KK3ZhciBUcmFuc2l0aW9uRXZlbnRJ bnRlcmZhY2UgPSB7CisgIHByb3BlcnR5TmFtZTogbnVsbCwKKyAgZWxhcHNlZFRpbWU6IG51bGws CisgIHBzZXVkb0VsZW1lbnQ6IG51bGwKK307CisKKy8qKgorICogQHBhcmFtIHtvYmplY3R9IGRp c3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50Lgor ICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUg ZXZlbnQgdGFyZ2V0LgorICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93 c2VyIGV2ZW50LgorICogQGV4dGVuZHMge1N5bnRoZXRpY0V2ZW50fQorICovCitmdW5jdGlvbiBT eW50aGV0aWNUcmFuc2l0aW9uRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBu YXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHsKKyAgcmV0dXJuIFN5bnRoZXRpY0V2ZW50 LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwg bmF0aXZlRXZlbnRUYXJnZXQpOworfQorCitTeW50aGV0aWNFdmVudC5hdWdtZW50Q2xhc3MoU3lu dGhldGljVHJhbnNpdGlvbkV2ZW50LCBUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2UpOworCittb2R1 bGUuZXhwb3J0cyA9IFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudDsKK30seyI5MSI6OTF9XSw5ODpb ZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEz LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq IFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNl IGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0 aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRz IGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4K KyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgU3ludGhldGljRXZlbnQgPSBfZGVyZXFf KDkxKTsKKwordmFyIGdldEV2ZW50VGFyZ2V0ID0gX2RlcmVxXygxMTQpOworCisvKioKKyAqIEBp bnRlcmZhY2UgVUlFdmVudAorICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwt My1FdmVudHMvCisgKi8KK3ZhciBVSUV2ZW50SW50ZXJmYWNlID0geworICB2aWV3OiBmdW5jdGlv biAoZXZlbnQpIHsKKyAgICBpZiAoZXZlbnQudmlldykgeworICAgICAgcmV0dXJuIGV2ZW50LnZp ZXc7CisgICAgfQorCisgICAgdmFyIHRhcmdldCA9IGdldEV2ZW50VGFyZ2V0KGV2ZW50KTsKKyAg ICBpZiAodGFyZ2V0LndpbmRvdyA9PT0gdGFyZ2V0KSB7CisgICAgICAvLyB0YXJnZXQgaXMgYSB3 aW5kb3cgb2JqZWN0CisgICAgICByZXR1cm4gdGFyZ2V0OworICAgIH0KKworICAgIHZhciBkb2Mg PSB0YXJnZXQub3duZXJEb2N1bWVudDsKKyAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoeSBgb3du ZXJEb2N1bWVudGAgaXMgc29tZXRpbWVzIHVuZGVmaW5lZCBpbiBJRTguCisgICAgaWYgKGRvYykg eworICAgICAgcmV0dXJuIGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93OworICAg IH0gZWxzZSB7CisgICAgICByZXR1cm4gd2luZG93OworICAgIH0KKyAgfSwKKyAgZGV0YWlsOiBm dW5jdGlvbiAoZXZlbnQpIHsKKyAgICByZXR1cm4gZXZlbnQuZGV0YWlsIHx8IDA7CisgIH0KK307 CisKKy8qKgorICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24g dXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LgorICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNo TWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LgorICogQHBhcmFtIHtv YmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LgorICogQGV4dGVuZHMge1N5 bnRoZXRpY0V2ZW50fQorICovCitmdW5jdGlvbiBTeW50aGV0aWNVSUV2ZW50KGRpc3BhdGNoQ29u ZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7Cisg IHJldHVybiBTeW50aGV0aWNFdmVudC5jYWxsKHRoaXMsIGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRj aE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTsKK30KKworU3ludGhldGlj RXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY1VJRXZlbnQsIFVJRXZlbnRJbnRlcmZhY2UpOwor Cittb2R1bGUuZXhwb3J0cyA9IFN5bnRoZXRpY1VJRXZlbnQ7Cit9LHsiMTE0IjoxMTQsIjkxIjo5 MX1dLDk5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJp Z2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQu CisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxl IGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0 b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVu dCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGly ZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBTeW50aGV0aWNNb3VzZUV2 ZW50ID0gX2RlcmVxXyg5NSk7CisKKy8qKgorICogQGludGVyZmFjZSBXaGVlbEV2ZW50CisgKiBA c2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8KKyAqLwordmFyIFdo ZWVsRXZlbnRJbnRlcmZhY2UgPSB7CisgIGRlbHRhWDogZnVuY3Rpb24gKGV2ZW50KSB7CisgICAg cmV0dXJuICdkZWx0YVgnIGluIGV2ZW50ID8gZXZlbnQuZGVsdGFYIDoKKyAgICAvLyBGYWxsYmFj ayB0byBgd2hlZWxEZWx0YVhgIGZvciBXZWJraXQgYW5kIG5vcm1hbGl6ZSAocmlnaHQgaXMgcG9z aXRpdmUpLgorICAgICd3aGVlbERlbHRhWCcgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YVgg OiAwOworICB9LAorICBkZWx0YVk6IGZ1bmN0aW9uIChldmVudCkgeworICAgIHJldHVybiAnZGVs dGFZJyBpbiBldmVudCA/IGV2ZW50LmRlbHRhWSA6CisgICAgLy8gRmFsbGJhY2sgdG8gYHdoZWVs RGVsdGFZYCBmb3IgV2Via2l0IGFuZCBub3JtYWxpemUgKGRvd24gaXMgcG9zaXRpdmUpLgorICAg ICd3aGVlbERlbHRhWScgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YVkgOgorICAgIC8vIEZh bGxiYWNrIHRvIGB3aGVlbERlbHRhYCBmb3IgSUU8OSBhbmQgbm9ybWFsaXplIChkb3duIGlzIHBv c2l0aXZlKS4KKyAgICAnd2hlZWxEZWx0YScgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YSA6 IDA7CisgIH0sCisgIGRlbHRhWjogbnVsbCwKKworICAvLyBCcm93c2VycyB3aXRob3V0ICJkZWx0 YU1vZGUiIGlzIHJlcG9ydGluZyBpbiByYXcgd2hlZWwgZGVsdGEgd2hlcmUgb25lCisgIC8vIG5v dGNoIG9uIHRoZSBzY3JvbGwgaXMgYWx3YXlzICsvLSAxMjAsIHJvdWdobHkgZXF1aXZhbGVudCB0 byBwaXhlbHMuCisgIC8vIEEgZ29vZCBhcHByb3hpbWF0aW9uIG9mIERPTV9ERUxUQV9MSU5FICgx KSBpcyA1JSBvZiB2aWV3cG9ydCBzaXplIG9yCisgIC8vIH40MCBwaXhlbHMsIGZvciBET01fREVM VEFfU0NSRUVOICgyKSBpdCBpcyA4Ny41JSBvZiB2aWV3cG9ydCBzaXplLgorICBkZWx0YU1vZGU6 IG51bGwKK307CisKKy8qKgorICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZp Z3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LgorICogQHBhcmFtIHtzdHJpbmd9 IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LgorICog QHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LgorICogQGV4 dGVuZHMge1N5bnRoZXRpY01vdXNlRXZlbnR9CisgKi8KK2Z1bmN0aW9uIFN5bnRoZXRpY1doZWVs RXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZl RXZlbnRUYXJnZXQpIHsKKyAgcmV0dXJuIFN5bnRoZXRpY01vdXNlRXZlbnQuY2FsbCh0aGlzLCBk aXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRh cmdldCk7Cit9CisKK1N5bnRoZXRpY01vdXNlRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY1do ZWVsRXZlbnQsIFdoZWVsRXZlbnRJbnRlcmZhY2UpOworCittb2R1bGUuZXhwb3J0cyA9IFN5bnRo ZXRpY1doZWVsRXZlbnQ7Cit9LHsiOTUiOjk1fV0sMTAwOltmdW5jdGlvbihfZGVyZXFfLG1vZHVs ZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIElu Yy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBs aWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNF TlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFk ZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQ QVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ug c3RyaWN0JzsKKwordmFyIF9wcm9kSW52YXJpYW50ID0gX2RlcmVxXygxMjUpOworCit2YXIgaW52 YXJpYW50ID0gX2RlcmVxXygxNTApOworCit2YXIgT0JTRVJWRURfRVJST1IgPSB7fTsKKworLyoq CisgKiBgVHJhbnNhY3Rpb25gIGNyZWF0ZXMgYSBibGFjayBib3ggdGhhdCBpcyBhYmxlIHRvIHdy YXAgYW55IG1ldGhvZCBzdWNoIHRoYXQKKyAqIGNlcnRhaW4gaW52YXJpYW50cyBhcmUgbWFpbnRh aW5lZCBiZWZvcmUgYW5kIGFmdGVyIHRoZSBtZXRob2QgaXMgaW52b2tlZAorICogKEV2ZW4gaWYg YW4gZXhjZXB0aW9uIGlzIHRocm93biB3aGlsZSBpbnZva2luZyB0aGUgd3JhcHBlZCBtZXRob2Qp LiBXaG9ldmVyCisgKiBpbnN0YW50aWF0ZXMgYSB0cmFuc2FjdGlvbiBjYW4gcHJvdmlkZSBlbmZv cmNlcnMgb2YgdGhlIGludmFyaWFudHMgYXQKKyAqIGNyZWF0aW9uIHRpbWUuIFRoZSBgVHJhbnNh Y3Rpb25gIGNsYXNzIGl0c2VsZiB3aWxsIHN1cHBseSBvbmUgYWRkaXRpb25hbAorICogYXV0b21h dGljIGludmFyaWFudCBmb3IgeW91IC0gdGhlIGludmFyaWFudCB0aGF0IGFueSB0cmFuc2FjdGlv biBpbnN0YW5jZQorICogc2hvdWxkIG5vdCBiZSBydW4gd2hpbGUgaXQgaXMgYWxyZWFkeSBiZWlu ZyBydW4uIFlvdSB3b3VsZCB0eXBpY2FsbHkgY3JlYXRlIGEKKyAqIHNpbmdsZSBpbnN0YW5jZSBv ZiBhIGBUcmFuc2FjdGlvbmAgZm9yIHJldXNlIG11bHRpcGxlIHRpbWVzLCB0aGF0IHBvdGVudGlh bGx5CisgKiBpcyB1c2VkIHRvIHdyYXAgc2V2ZXJhbCBkaWZmZXJlbnQgbWV0aG9kcy4gV3JhcHBl cnMgYXJlIGV4dHJlbWVseSBzaW1wbGUgLQorICogdGhleSBvbmx5IHJlcXVpcmUgaW1wbGVtZW50 aW5nIHR3byBtZXRob2RzLgorICoKKyAqIDxwcmU+CisgKiAgICAgICAgICAgICAgICAgICAgICAg d3JhcHBlcnMgKGluamVjdGVkIGF0IGNyZWF0aW9uIHRpbWUpCisgKiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKyAgICAgICAgKworICogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICArLS0tLS0t LS0tLS0tLS0tLS18LS0tLS0tLS18LS0tLS0tLS0tLS0tLS0rCisgKiAgICAgICAgICAgICAgICAg ICAgfCAgICAgICAgICAgICAgICAgdiAgICAgICAgfCAgICAgICAgICAgICAgfAorICogICAgICAg ICAgICAgICAgICAgIHwgICAgICArLS0tLS0tLS0tLS0tLS0tKyAgIHwgICAgICAgICAgICAgIHwK KyAqICAgICAgICAgICAgICAgICAgICB8ICAgKy0tfCAgICB3cmFwcGVyMSAgIHwtLS18LS0tLSsg ICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgfCAgIHwgICstLS0tLS0tLS0tLS0tLS0r ICAgdiAgICB8ICAgICAgICAgfAorICogICAgICAgICAgICAgICAgICAgIHwgICB8ICAgICAgICAg ICstLS0tLS0tLS0tLS0tKyAgfCAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICB8ICAg fCAgICAgKy0tLS18ICAgd3JhcHBlcjIgIHwtLS0tLS0tLSsgICB8CisgKiAgICAgICAgICAgICAg ICAgICAgfCAgIHwgICAgIHwgICAgKy0tLS0tLS0tLS0tLS0rICB8ICAgICB8ICAgfAorICogICAg ICAgICAgICAgICAgICAgIHwgICB8ICAgICB8ICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCAg IHwKKyAqICAgICAgICAgICAgICAgICAgICB8ICAgdiAgICAgdiAgICAgICAgICAgICAgICAgICAg IHYgICAgIHYgICB8IHdyYXBwZXIKKyAqICAgICAgICAgICAgICAgICAgICB8ICstLS0rICstLS0r ICAgKy0tLS0tLS0tLSsgICArLS0tKyArLS0tKyB8IGludmFyaWFudHMKKyAqIHBlcmZvcm0oYW55 TWV0aG9kKSB8IHwgICB8IHwgICB8ICAgfCAgICAgICAgIHwgICB8ICAgfCB8ICAgfCB8IG1haW50 YWluZWQKKyAqICstLS0tLS0tLS0tLS0tLS0tLT58LXwtLS18LXwtLS18LS0+fGFueU1ldGhvZHwt LS18LS0tfC18LS0tfC18LS0tLS0tLS0+CisgKiAgICAgICAgICAgICAgICAgICAgfCB8ICAgfCB8 ICAgfCAgIHwgICAgICAgICB8ICAgfCAgIHwgfCAgIHwgfAorICogICAgICAgICAgICAgICAgICAg IHwgfCAgIHwgfCAgIHwgICB8ICAgICAgICAgfCAgIHwgICB8IHwgICB8IHwKKyAqICAgICAgICAg ICAgICAgICAgICB8IHwgICB8IHwgICB8ICAgfCAgICAgICAgIHwgICB8ICAgfCB8ICAgfCB8Cisg KiAgICAgICAgICAgICAgICAgICAgfCArLS0tKyArLS0tKyAgICstLS0tLS0tLS0rICAgKy0tLSsg Ky0tLSsgfAorICogICAgICAgICAgICAgICAgICAgIHwgIGluaXRpYWxpemUgICAgICAgICAgICAg ICAgICAgIGNsb3NlICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiA8L3ByZT4KKyAqCisgKiBVc2UgY2FzZXM6 CisgKiAtIFByZXNlcnZpbmcgdGhlIGlucHV0IHNlbGVjdGlvbiByYW5nZXMgYmVmb3JlL2FmdGVy IHJlY29uY2lsaWF0aW9uLgorICogICBSZXN0b3Jpbmcgc2VsZWN0aW9uIGV2ZW4gaW4gdGhlIGV2 ZW50IG9mIGFuIHVuZXhwZWN0ZWQgZXJyb3IuCisgKiAtIERlYWN0aXZhdGluZyBldmVudHMgd2hp bGUgcmVhcnJhbmdpbmcgdGhlIERPTSwgcHJldmVudGluZyBibHVycy9mb2N1c2VzLAorICogICB3 aGlsZSBndWFyYW50ZWVpbmcgdGhhdCBhZnRlcndhcmRzLCB0aGUgZXZlbnQgc3lzdGVtIGlzIHJl YWN0aXZhdGVkLgorICogLSBGbHVzaGluZyBhIHF1ZXVlIG9mIGNvbGxlY3RlZCBET00gbXV0YXRp b25zIHRvIHRoZSBtYWluIFVJIHRocmVhZCBhZnRlciBhCisgKiAgIHJlY29uY2lsaWF0aW9uIHRh a2VzIHBsYWNlIGluIGEgd29ya2VyIHRocmVhZC4KKyAqIC0gSW52b2tpbmcgYW55IGNvbGxlY3Rl ZCBgY29tcG9uZW50RGlkVXBkYXRlYCBjYWxsYmFja3MgYWZ0ZXIgcmVuZGVyaW5nIG5ldworICog ICBjb250ZW50LgorICogLSAoRnV0dXJlIHVzZSBjYXNlKTogV3JhcHBpbmcgcGFydGljdWxhciBm bHVzaGVzIG9mIHRoZSBgUmVhY3RXb3JrZXJgIHF1ZXVlCisgKiAgIHRvIHByZXNlcnZlIHRoZSBg c2Nyb2xsVG9wYCAoYW4gYXV0b21hdGljIHNjcm9sbCBhd2FyZSBET00pLgorICogLSAoRnV0dXJl IHVzZSBjYXNlKTogTGF5b3V0IGNhbGN1bGF0aW9ucyBiZWZvcmUgYW5kIGFmdGVyIERPTSB1cGRh dGVzLgorICoKKyAqIFRyYW5zYWN0aW9uYWwgcGx1Z2luIEFQSToKKyAqIC0gQSBtb2R1bGUgdGhh dCBoYXMgYW4gYGluaXRpYWxpemVgIG1ldGhvZCB0aGF0IHJldHVybnMgYW55IHByZWNvbXB1dGF0 aW9uLgorICogLSBhbmQgYSBgY2xvc2VgIG1ldGhvZCB0aGF0IGFjY2VwdHMgdGhlIHByZWNvbXB1 dGF0aW9uLiBgY2xvc2VgIGlzIGludm9rZWQKKyAqICAgd2hlbiB0aGUgd3JhcHBlZCBwcm9jZXNz IGlzIGNvbXBsZXRlZCwgb3IgaGFzIGZhaWxlZC4KKyAqCisgKiBAcGFyYW0ge0FycmF5PFRyYW5z YWN0aW9uYWxXcmFwcGVyPn0gdHJhbnNhY3Rpb25XcmFwcGVyIFdyYXBwZXIgbW9kdWxlcworICog dGhhdCBpbXBsZW1lbnQgYGluaXRpYWxpemVgIGFuZCBgY2xvc2VgLgorICogQHJldHVybiB7VHJh bnNhY3Rpb259IFNpbmdsZSB0cmFuc2FjdGlvbiBmb3IgcmV1c2UgaW4gdGhyZWFkLgorICoKKyAq IEBjbGFzcyBUcmFuc2FjdGlvbgorICovCit2YXIgVHJhbnNhY3Rpb25JbXBsID0geworICAvKioK KyAgICogU2V0cyB1cCB0aGlzIGluc3RhbmNlIHNvIHRoYXQgaXQgaXMgcHJlcGFyZWQgZm9yIGNv bGxlY3RpbmcgbWV0cmljcy4gRG9lcworICAgKiBzbyBzdWNoIHRoYXQgdGhpcyBzZXR1cCBtZXRo b2QgbWF5IGJlIHVzZWQgb24gYW4gaW5zdGFuY2UgdGhhdCBpcyBhbHJlYWR5CisgICAqIGluaXRp YWxpemVkLCBpbiBhIHdheSB0aGF0IGRvZXMgbm90IGNvbnN1bWUgYWRkaXRpb25hbCBtZW1vcnkg dXBvbiByZXVzZS4KKyAgICogVGhhdCBjYW4gYmUgdXNlZnVsIGlmIHlvdSBkZWNpZGUgdG8gbWFr ZSB5b3VyIHN1YmNsYXNzIG9mIHRoaXMgbWl4aW4gYQorICAgKiAiUG9vbGVkQ2xhc3MiLgorICAg Ki8KKyAgcmVpbml0aWFsaXplVHJhbnNhY3Rpb246IGZ1bmN0aW9uICgpIHsKKyAgICB0aGlzLnRy YW5zYWN0aW9uV3JhcHBlcnMgPSB0aGlzLmdldFRyYW5zYWN0aW9uV3JhcHBlcnMoKTsKKyAgICBp ZiAodGhpcy53cmFwcGVySW5pdERhdGEpIHsKKyAgICAgIHRoaXMud3JhcHBlckluaXREYXRhLmxl bmd0aCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMud3JhcHBlckluaXREYXRhID0gW107 CisgICAgfQorICAgIHRoaXMuX2lzSW5UcmFuc2FjdGlvbiA9IGZhbHNlOworICB9LAorCisgIF9p c0luVHJhbnNhY3Rpb246IGZhbHNlLAorCisgIC8qKgorICAgKiBAYWJzdHJhY3QKKyAgICogQHJl dHVybiB7QXJyYXk8VHJhbnNhY3Rpb25XcmFwcGVyPn0gQXJyYXkgb2YgdHJhbnNhY3Rpb24gd3Jh cHBlcnMuCisgICAqLworICBnZXRUcmFuc2FjdGlvbldyYXBwZXJzOiBudWxsLAorCisgIGlzSW5U cmFuc2FjdGlvbjogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiAhIXRoaXMuX2lzSW5UcmFuc2Fj dGlvbjsKKyAgfSwKKworICAvKioKKyAgICogRXhlY3V0ZXMgdGhlIGZ1bmN0aW9uIHdpdGhpbiBh IHNhZmV0eSB3aW5kb3cuIFVzZSB0aGlzIGZvciB0aGUgdG9wIGxldmVsCisgICAqIG1ldGhvZHMg dGhhdCByZXN1bHQgaW4gbGFyZ2UgYW1vdW50cyBvZiBjb21wdXRhdGlvbi9tdXRhdGlvbnMgdGhh dCB3b3VsZAorICAgKiBuZWVkIHRvIGJlIHNhZmV0eSBjaGVja2VkLiBUaGUgb3B0aW9uYWwgYXJn dW1lbnRzIGhlbHBzIHByZXZlbnQgdGhlIG5lZWQKKyAgICogdG8gYmluZCBpbiBtYW55IGNhc2Vz LgorICAgKgorICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBtZXRob2QgTWVtYmVyIG9mIHNjb3BlIHRv IGNhbGwuCisgICAqIEBwYXJhbSB7T2JqZWN0fSBzY29wZSBTY29wZSB0byBpbnZva2UgZnJvbS4K KyAgICogQHBhcmFtIHtPYmplY3Q/PX0gYSBBcmd1bWVudCB0byBwYXNzIHRvIHRoZSBtZXRob2Qu CisgICAqIEBwYXJhbSB7T2JqZWN0Pz19IGIgQXJndW1lbnQgdG8gcGFzcyB0byB0aGUgbWV0aG9k LgorICAgKiBAcGFyYW0ge09iamVjdD89fSBjIEFyZ3VtZW50IHRvIHBhc3MgdG8gdGhlIG1ldGhv ZC4KKyAgICogQHBhcmFtIHtPYmplY3Q/PX0gZCBBcmd1bWVudCB0byBwYXNzIHRvIHRoZSBtZXRo b2QuCisgICAqIEBwYXJhbSB7T2JqZWN0Pz19IGUgQXJndW1lbnQgdG8gcGFzcyB0byB0aGUgbWV0 aG9kLgorICAgKiBAcGFyYW0ge09iamVjdD89fSBmIEFyZ3VtZW50IHRvIHBhc3MgdG8gdGhlIG1l dGhvZC4KKyAgICoKKyAgICogQHJldHVybiB7Kn0gUmV0dXJuIHZhbHVlIGZyb20gYG1ldGhvZGAu CisgICAqLworICBwZXJmb3JtOiBmdW5jdGlvbiAobWV0aG9kLCBzY29wZSwgYSwgYiwgYywgZCwg ZSwgZikgeworICAgICEhdGhpcy5pc0luVHJhbnNhY3Rpb24oKSA/ICJkZXZlbG9wbWVudCIgIT09 ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1RyYW5zYWN0aW9uLnBlcmZvcm0oLi4u KTogQ2Fubm90IGluaXRpYWxpemUgYSB0cmFuc2FjdGlvbiB3aGVuIHRoZXJlIGlzIGFscmVhZHkg YW4gb3V0c3RhbmRpbmcgdHJhbnNhY3Rpb24uJykgOiBfcHJvZEludmFyaWFudCgnMjcnKSA6IHZv aWQgMDsKKyAgICB2YXIgZXJyb3JUaHJvd247CisgICAgdmFyIHJldDsKKyAgICB0cnkgeworICAg ICAgdGhpcy5faXNJblRyYW5zYWN0aW9uID0gdHJ1ZTsKKyAgICAgIC8vIENhdGNoaW5nIGVycm9y cyBtYWtlcyBkZWJ1Z2dpbmcgbW9yZSBkaWZmaWN1bHQsIHNvIHdlIHN0YXJ0IHdpdGgKKyAgICAg IC8vIGVycm9yVGhyb3duIHNldCB0byB0cnVlIGJlZm9yZSBzZXR0aW5nIGl0IHRvIGZhbHNlIGFm dGVyIGNhbGxpbmcKKyAgICAgIC8vIGNsb3NlIC0tIGlmIGl0J3Mgc3RpbGwgc2V0IHRvIHRydWUg aW4gdGhlIGZpbmFsbHkgYmxvY2ssIGl0IG1lYW5zCisgICAgICAvLyBvbmUgb2YgdGhlc2UgY2Fs bHMgdGhyZXcuCisgICAgICBlcnJvclRocm93biA9IHRydWU7CisgICAgICB0aGlzLmluaXRpYWxp emVBbGwoMCk7CisgICAgICByZXQgPSBtZXRob2QuY2FsbChzY29wZSwgYSwgYiwgYywgZCwgZSwg Zik7CisgICAgICBlcnJvclRocm93biA9IGZhbHNlOworICAgIH0gZmluYWxseSB7CisgICAgICB0 cnkgeworICAgICAgICBpZiAoZXJyb3JUaHJvd24pIHsKKyAgICAgICAgICAvLyBJZiBgbWV0aG9k YCB0aHJvd3MsIHByZWZlciB0byBzaG93IHRoYXQgc3RhY2sgdHJhY2Ugb3ZlciBhbnkgdGhyb3du CisgICAgICAgICAgLy8gYnkgaW52b2tpbmcgYGNsb3NlQWxsYC4KKyAgICAgICAgICB0cnkgewor ICAgICAgICAgICAgdGhpcy5jbG9zZUFsbCgwKTsKKyAgICAgICAgICB9IGNhdGNoIChlcnIpIHt9 CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gU2luY2UgYG1ldGhvZGAgZGlkbid0IHRo cm93LCB3ZSBkb24ndCB3YW50IHRvIHNpbGVuY2UgdGhlIGV4Y2VwdGlvbgorICAgICAgICAgIC8v IGhlcmUuCisgICAgICAgICAgdGhpcy5jbG9zZUFsbCgwKTsKKyAgICAgICAgfQorICAgICAgfSBm aW5hbGx5IHsKKyAgICAgICAgdGhpcy5faXNJblRyYW5zYWN0aW9uID0gZmFsc2U7CisgICAgICB9 CisgICAgfQorICAgIHJldHVybiByZXQ7CisgIH0sCisKKyAgaW5pdGlhbGl6ZUFsbDogZnVuY3Rp b24gKHN0YXJ0SW5kZXgpIHsKKyAgICB2YXIgdHJhbnNhY3Rpb25XcmFwcGVycyA9IHRoaXMudHJh bnNhY3Rpb25XcmFwcGVyczsKKyAgICBmb3IgKHZhciBpID0gc3RhcnRJbmRleDsgaSA8IHRyYW5z YWN0aW9uV3JhcHBlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciB3cmFwcGVyID0gdHJhbnNh Y3Rpb25XcmFwcGVyc1tpXTsKKyAgICAgIHRyeSB7CisgICAgICAgIC8vIENhdGNoaW5nIGVycm9y cyBtYWtlcyBkZWJ1Z2dpbmcgbW9yZSBkaWZmaWN1bHQsIHNvIHdlIHN0YXJ0IHdpdGggdGhlCisg ICAgICAgIC8vIE9CU0VSVkVEX0VSUk9SIHN0YXRlIGJlZm9yZSBvdmVyd3JpdGluZyBpdCB3aXRo IHRoZSByZWFsIHJldHVybiB2YWx1ZQorICAgICAgICAvLyBvZiBpbml0aWFsaXplIC0tIGlmIGl0 J3Mgc3RpbGwgc2V0IHRvIE9CU0VSVkVEX0VSUk9SIGluIHRoZSBmaW5hbGx5CisgICAgICAgIC8v IGJsb2NrLCBpdCBtZWFucyB3cmFwcGVyLmluaXRpYWxpemUgdGhyZXcuCisgICAgICAgIHRoaXMu d3JhcHBlckluaXREYXRhW2ldID0gT0JTRVJWRURfRVJST1I7CisgICAgICAgIHRoaXMud3JhcHBl ckluaXREYXRhW2ldID0gd3JhcHBlci5pbml0aWFsaXplID8gd3JhcHBlci5pbml0aWFsaXplLmNh bGwodGhpcykgOiBudWxsOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgaWYgKHRoaXMud3Jh cHBlckluaXREYXRhW2ldID09PSBPQlNFUlZFRF9FUlJPUikgeworICAgICAgICAgIC8vIFRoZSBp bml0aWFsaXplciBmb3Igd3JhcHBlciBpIHRocmV3IGFuIGVycm9yOyBpbml0aWFsaXplIHRoZQor ICAgICAgICAgIC8vIHJlbWFpbmluZyB3cmFwcGVycyBidXQgc2lsZW5jZSBhbnkgZXhjZXB0aW9u cyBmcm9tIHRoZW0gdG8gZW5zdXJlCisgICAgICAgICAgLy8gdGhhdCB0aGUgZmlyc3QgZXJyb3Ig aXMgdGhlIG9uZSB0byBidWJibGUgdXAuCisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRo aXMuaW5pdGlhbGl6ZUFsbChpICsgMSk7CisgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7fQorICAg ICAgICB9CisgICAgICB9CisgICAgfQorICB9LAorCisgIC8qKgorICAgKiBJbnZva2VzIGVhY2gg b2YgYHRoaXMudHJhbnNhY3Rpb25XcmFwcGVycy5jbG9zZVtpXWAgZnVuY3Rpb25zLCBwYXNzaW5n IGludG8KKyAgICogdGhlbSB0aGUgcmVzcGVjdGl2ZSByZXR1cm4gdmFsdWVzIG9mIGB0aGlzLnRy YW5zYWN0aW9uV3JhcHBlcnMuaW5pdFtpXWAKKyAgICogKGBjbG9zZWBycyB0aGF0IGNvcnJlc3Bv bmQgdG8gaW5pdGlhbGl6ZXJzIHRoYXQgZmFpbGVkIHdpbGwgbm90IGJlCisgICAqIGludm9rZWQp LgorICAgKi8KKyAgY2xvc2VBbGw6IGZ1bmN0aW9uIChzdGFydEluZGV4KSB7CisgICAgIXRoaXMu aXNJblRyYW5zYWN0aW9uKCkgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZh cmlhbnQoZmFsc2UsICdUcmFuc2FjdGlvbi5jbG9zZUFsbCgpOiBDYW5ub3QgY2xvc2UgdHJhbnNh Y3Rpb24gd2hlbiBub25lIGFyZSBvcGVuLicpIDogX3Byb2RJbnZhcmlhbnQoJzI4JykgOiB2b2lk IDA7CisgICAgdmFyIHRyYW5zYWN0aW9uV3JhcHBlcnMgPSB0aGlzLnRyYW5zYWN0aW9uV3JhcHBl cnM7CisgICAgZm9yICh2YXIgaSA9IHN0YXJ0SW5kZXg7IGkgPCB0cmFuc2FjdGlvbldyYXBwZXJz Lmxlbmd0aDsgaSsrKSB7CisgICAgICB2YXIgd3JhcHBlciA9IHRyYW5zYWN0aW9uV3JhcHBlcnNb aV07CisgICAgICB2YXIgaW5pdERhdGEgPSB0aGlzLndyYXBwZXJJbml0RGF0YVtpXTsKKyAgICAg IHZhciBlcnJvclRocm93bjsKKyAgICAgIHRyeSB7CisgICAgICAgIC8vIENhdGNoaW5nIGVycm9y cyBtYWtlcyBkZWJ1Z2dpbmcgbW9yZSBkaWZmaWN1bHQsIHNvIHdlIHN0YXJ0IHdpdGgKKyAgICAg ICAgLy8gZXJyb3JUaHJvd24gc2V0IHRvIHRydWUgYmVmb3JlIHNldHRpbmcgaXQgdG8gZmFsc2Ug YWZ0ZXIgY2FsbGluZworICAgICAgICAvLyBjbG9zZSAtLSBpZiBpdCdzIHN0aWxsIHNldCB0byB0 cnVlIGluIHRoZSBmaW5hbGx5IGJsb2NrLCBpdCBtZWFucworICAgICAgICAvLyB3cmFwcGVyLmNs b3NlIHRocmV3LgorICAgICAgICBlcnJvclRocm93biA9IHRydWU7CisgICAgICAgIGlmIChpbml0 RGF0YSAhPT0gT0JTRVJWRURfRVJST1IgJiYgd3JhcHBlci5jbG9zZSkgeworICAgICAgICAgIHdy YXBwZXIuY2xvc2UuY2FsbCh0aGlzLCBpbml0RGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgZXJy b3JUaHJvd24gPSBmYWxzZTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIGlmIChlcnJvclRo cm93bikgeworICAgICAgICAgIC8vIFRoZSBjbG9zZXIgZm9yIHdyYXBwZXIgaSB0aHJldyBhbiBl cnJvcjsgY2xvc2UgdGhlIHJlbWFpbmluZworICAgICAgICAgIC8vIHdyYXBwZXJzIGJ1dCBzaWxl bmNlIGFueSBleGNlcHRpb25zIGZyb20gdGhlbSB0byBlbnN1cmUgdGhhdCB0aGUKKyAgICAgICAg ICAvLyBmaXJzdCBlcnJvciBpcyB0aGUgb25lIHRvIGJ1YmJsZSB1cC4KKyAgICAgICAgICB0cnkg eworICAgICAgICAgICAgdGhpcy5jbG9zZUFsbChpICsgMSk7CisgICAgICAgICAgfSBjYXRjaCAo ZSkge30KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICB0aGlzLndyYXBwZXJJbml0RGF0 YS5sZW5ndGggPSAwOworICB9Cit9OworCittb2R1bGUuZXhwb3J0cyA9IFRyYW5zYWN0aW9uSW1w bDsKK30seyIxMjUiOjEyNSwiMTUwIjoxNTB9XSwxMDE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxl LGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5j LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxp Y2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VO U0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRk aXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBB VEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0 JzsKKwordmFyIFZpZXdwb3J0TWV0cmljcyA9IHsKKworICBjdXJyZW50U2Nyb2xsTGVmdDogMCwK KworICBjdXJyZW50U2Nyb2xsVG9wOiAwLAorCisgIHJlZnJlc2hTY3JvbGxWYWx1ZXM6IGZ1bmN0 aW9uIChzY3JvbGxQb3NpdGlvbikgeworICAgIFZpZXdwb3J0TWV0cmljcy5jdXJyZW50U2Nyb2xs TGVmdCA9IHNjcm9sbFBvc2l0aW9uLng7CisgICAgVmlld3BvcnRNZXRyaWNzLmN1cnJlbnRTY3Jv bGxUb3AgPSBzY3JvbGxQb3NpdGlvbi55OworICB9CisKK307CisKK21vZHVsZS5leHBvcnRzID0g Vmlld3BvcnRNZXRyaWNzOworfSx7fV0sMTAyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBv cnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAq IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNl ZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZp bGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9u YWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRT IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0 JzsKKwordmFyIF9wcm9kSW52YXJpYW50ID0gX2RlcmVxXygxMjUpOworCit2YXIgaW52YXJpYW50 ID0gX2RlcmVxXygxNTApOworCisvKioKKyAqIEFjY3VtdWxhdGVzIGl0ZW1zIHRoYXQgbXVzdCBu b3QgYmUgbnVsbCBvciB1bmRlZmluZWQgaW50byB0aGUgZmlyc3Qgb25lLiBUaGlzCisgKiBpcyB1 c2VkIHRvIGNvbnNlcnZlIG1lbW9yeSBieSBhdm9pZGluZyBhcnJheSBhbGxvY2F0aW9ucywgYW5k IHRodXMgc2FjcmlmaWNlcworICogQVBJIGNsZWFubmVzcy4gU2luY2UgYGN1cnJlbnRgIGNhbiBi ZSBudWxsIGJlZm9yZSBiZWluZyBwYXNzZWQgaW4gYW5kIG5vdAorICogbnVsbCBhZnRlciB0aGlz IGZ1bmN0aW9uLCBtYWtlIHN1cmUgdG8gYXNzaWduIGl0IGJhY2sgdG8gYGN1cnJlbnRgOgorICoK KyAqIGBhID0gYWNjdW11bGF0ZUludG8oYSwgYik7YAorICoKKyAqIFRoaXMgQVBJIHNob3VsZCBi ZSBzcGFyaW5nbHkgdXNlZC4gVHJ5IGBhY2N1bXVsYXRlYCBmb3Igc29tZXRoaW5nIGNsZWFuZXIu CisgKgorICogQHJldHVybiB7KnxhcnJheTwqPn0gQW4gYWNjdW11bGF0aW9uIG9mIGl0ZW1zLgor ICovCisKK2Z1bmN0aW9uIGFjY3VtdWxhdGVJbnRvKGN1cnJlbnQsIG5leHQpIHsKKyAgIShuZXh0 ICE9IG51bGwpID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZh bHNlLCAnYWNjdW11bGF0ZUludG8oLi4uKTogQWNjdW11bGF0ZWQgaXRlbXMgbXVzdCBub3QgYmUg bnVsbCBvciB1bmRlZmluZWQuJykgOiBfcHJvZEludmFyaWFudCgnMzAnKSA6IHZvaWQgMDsKKwor ICBpZiAoY3VycmVudCA9PSBudWxsKSB7CisgICAgcmV0dXJuIG5leHQ7CisgIH0KKworICAvLyBC b3RoIGFyZSBub3QgZW1wdHkuIFdhcm5pbmc6IE5ldmVyIGNhbGwgeC5jb25jYXQoeSkgd2hlbiB5 b3UgYXJlIG5vdAorICAvLyBjZXJ0YWluIHRoYXQgeCBpcyBhbiBBcnJheSAoeCBjb3VsZCBiZSBh IHN0cmluZyB3aXRoIGNvbmNhdCBtZXRob2QpLgorICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50 KSkgeworICAgIGlmIChBcnJheS5pc0FycmF5KG5leHQpKSB7CisgICAgICBjdXJyZW50LnB1c2gu YXBwbHkoY3VycmVudCwgbmV4dCk7CisgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAg Y3VycmVudC5wdXNoKG5leHQpOworICAgIHJldHVybiBjdXJyZW50OworICB9CisKKyAgaWYgKEFy cmF5LmlzQXJyYXkobmV4dCkpIHsKKyAgICAvLyBBIGJpdCB0b28gZGFuZ2Vyb3VzIHRvIG11dGF0 ZSBgbmV4dGAuCisgICAgcmV0dXJuIFtjdXJyZW50XS5jb25jYXQobmV4dCk7CisgIH0KKworICBy ZXR1cm4gW2N1cnJlbnQsIG5leHRdOworfQorCittb2R1bGUuZXhwb3J0cyA9IGFjY3VtdWxhdGVJ bnRvOworfSx7IjEyNSI6MTI1LCIxNTAiOjE1MH1dLDEwMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1 bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJ bmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMg bGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElD RU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBh ZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUg UEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisndXNl IHN0cmljdCc7CisKK3ZhciBNT0QgPSA2NTUyMTsKKworLy8gYWRsZXIzMiBpcyBub3QgY3J5cHRv Z3JhcGhpY2FsbHkgc3Ryb25nLCBhbmQgaXMgb25seSB1c2VkIHRvIHNhbml0eSBjaGVjayB0aGF0 CisvLyBtYXJrdXAgZ2VuZXJhdGVkIG9uIHRoZSBzZXJ2ZXIgbWF0Y2hlcyB0aGUgbWFya3VwIGdl bmVyYXRlZCBvbiB0aGUgY2xpZW50LgorLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiAoYSBtb2RpZmll ZCB2ZXJzaW9uIG9mIHRoZSBTaGVldEpTIHZlcnNpb24pIGhhcyBiZWVuIG9wdGltaXplZAorLy8g Zm9yIG91ciB1c2UgY2FzZSwgYXQgdGhlIGV4cGVuc2Ugb2YgY29uZm9ybWluZyB0byB0aGUgYWRs ZXIzMiBzcGVjaWZpY2F0aW9uCisvLyBmb3Igbm9uLWFzY2lpIGlucHV0cy4KK2Z1bmN0aW9uIGFk bGVyMzIoZGF0YSkgeworICB2YXIgYSA9IDE7CisgIHZhciBiID0gMDsKKyAgdmFyIGkgPSAwOwor ICB2YXIgbCA9IGRhdGEubGVuZ3RoOworICB2YXIgbSA9IGwgJiB+MHgzOworICB3aGlsZSAoaSA8 IG0pIHsKKyAgICB2YXIgbiA9IE1hdGgubWluKGkgKyA0MDk2LCBtKTsKKyAgICBmb3IgKDsgaSA8 IG47IGkgKz0gNCkgeworICAgICAgYiArPSAoYSArPSBkYXRhLmNoYXJDb2RlQXQoaSkpICsgKGEg Kz0gZGF0YS5jaGFyQ29kZUF0KGkgKyAxKSkgKyAoYSArPSBkYXRhLmNoYXJDb2RlQXQoaSArIDIp KSArIChhICs9IGRhdGEuY2hhckNvZGVBdChpICsgMykpOworICAgIH0KKyAgICBhICU9IE1PRDsK KyAgICBiICU9IE1PRDsKKyAgfQorICBmb3IgKDsgaSA8IGw7IGkrKykgeworICAgIGIgKz0gYSAr PSBkYXRhLmNoYXJDb2RlQXQoaSk7CisgIH0KKyAgYSAlPSBNT0Q7CisgIGIgJT0gTU9EOworICBy ZXR1cm4gYSB8IGIgPDwgMTY7Cit9CisKK21vZHVsZS5leHBvcnRzID0gYWRsZXIzMjsKK30se31d LDEwNDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisoZnVuY3Rpb24gKHByb2Nl c3MpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICog QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2Vk IHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmls ZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25h bCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMg ZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwor dmFyIF9wcm9kSW52YXJpYW50ID0gX2RlcmVxXygxMjUpOworCit2YXIgUmVhY3RQcm9wVHlwZUxv Y2F0aW9uTmFtZXMgPSBfZGVyZXFfKDcyKTsKK3ZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9IF9k ZXJlcV8oNzMpOworCit2YXIgaW52YXJpYW50ID0gX2RlcmVxXygxNTApOwordmFyIHdhcm5pbmcg PSBfZGVyZXFfKDE1Nyk7CisKK3ZhciBSZWFjdENvbXBvbmVudFRyZWVIb29rOworCitpZiAodHlw ZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MuZW52ICYmICJkZXZlbG9wbWVu dCIgPT09ICd0ZXN0JykgeworICAvLyBUZW1wb3JhcnkgaGFjay4KKyAgLy8gSW5saW5lIHJlcXVp cmVzIGRvbid0IHdvcmsgd2VsbCB3aXRoIEplc3Q6CisgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9m YWNlYm9vay9yZWFjdC9pc3N1ZXMvNzI0MAorICAvLyBSZW1vdmUgdGhlIGlubGluZSByZXF1aXJl cyB3aGVuIHdlIGRvbid0IG5lZWQgdGhlbSBhbnltb3JlOgorICAvLyBodHRwczovL2dpdGh1Yi5j b20vZmFjZWJvb2svcmVhY3QvcHVsbC83MTc4CisgIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSBf ZGVyZXFfKDEzMik7Cit9CisKK3ZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTsKKworLyoqCisg KiBBc3NlcnQgdGhhdCB0aGUgdmFsdWVzIG1hdGNoIHdpdGggdGhlIHR5cGUgc3BlY3MuCisgKiBF cnJvciBtZXNzYWdlcyBhcmUgbWVtb3JpemVkIGFuZCB3aWxsIG9ubHkgYmUgc2hvd24gb25jZS4K KyAqCisgKiBAcGFyYW0ge29iamVjdH0gdHlwZVNwZWNzIE1hcCBvZiBuYW1lIHRvIGEgUmVhY3RQ cm9wVHlwZQorICogQHBhcmFtIHtvYmplY3R9IHZhbHVlcyBSdW50aW1lIHZhbHVlcyB0aGF0IG5l ZWQgdG8gYmUgdHlwZS1jaGVja2VkCisgKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb24gZS5nLiAi cHJvcCIsICJjb250ZXh0IiwgImNoaWxkIGNvbnRleHQiCisgKiBAcGFyYW0ge3N0cmluZ30gY29t cG9uZW50TmFtZSBOYW1lIG9mIHRoZSBjb21wb25lbnQgZm9yIGVycm9yIG1lc3NhZ2VzLgorICog QHBhcmFtIHs/b2JqZWN0fSBlbGVtZW50IFRoZSBSZWFjdCBlbGVtZW50IHRoYXQgaXMgYmVpbmcg dHlwZS1jaGVja2VkCisgKiBAcGFyYW0gez9udW1iZXJ9IGRlYnVnSUQgVGhlIFJlYWN0IGNvbXBv bmVudCBpbnN0YW5jZSB0aGF0IGlzIGJlaW5nIHR5cGUtY2hlY2tlZAorICogQHByaXZhdGUKKyAq LworZnVuY3Rpb24gY2hlY2tSZWFjdFR5cGVTcGVjKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlv biwgY29tcG9uZW50TmFtZSwgZWxlbWVudCwgZGVidWdJRCkgeworICBmb3IgKHZhciB0eXBlU3Bl Y05hbWUgaW4gdHlwZVNwZWNzKSB7CisgICAgaWYgKHR5cGVTcGVjcy5oYXNPd25Qcm9wZXJ0eSh0 eXBlU3BlY05hbWUpKSB7CisgICAgICB2YXIgZXJyb3I7CisgICAgICAvLyBQcm9wIHR5cGUgdmFs aWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0bworICAg ICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4g U28gd2UgbG9nIGl0LgorICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAs IHdlJ2xsIGxldCB0aGVtIHRocm93LgorICAgICAgdHJ5IHsKKyAgICAgICAgLy8gVGhpcyBpcyBp bnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1l CisgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdp dGggYSBiZXR0ZXIgbWVzc2FnZS4KKyAgICAgICAgISh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVj TmFtZV0gPT09ICdmdW5jdGlvbicpID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8g aW52YXJpYW50KGZhbHNlLCAnJXM6ICVzIHR5cGUgYCVzYCBpcyBpbnZhbGlkOyBpdCBtdXN0IGJl IGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSBSZWFjdC5Qcm9wVHlwZXMuJywgY29tcG9uZW50TmFt ZSB8fCAnUmVhY3QgY2xhc3MnLCBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl0s IHR5cGVTcGVjTmFtZSkgOiBfcHJvZEludmFyaWFudCgnODQnLCBjb21wb25lbnROYW1lIHx8ICdS ZWFjdCBjbGFzcycsIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXSwgdHlwZVNw ZWNOYW1lKSA6IHZvaWQgMDsKKyAgICAgICAgZXJyb3IgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1l XSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsIFJl YWN0UHJvcFR5cGVzU2VjcmV0KTsKKyAgICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICAgIGVycm9y ID0gZXg7CisgICAgICB9CisgICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3 YXJuaW5nKCFlcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIEVycm9yLCAnJXM6IHR5cGUgc3BlY2lm aWNhdGlvbiBvZiAlcyBgJXNgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArICdmdW5j dGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAlcy4g JyArICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5 cGUgY2hlY2tlciAnICsgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBv bmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCku JywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBSZWFjdFByb3BUeXBlTG9jYXRpb25O YW1lc1tsb2NhdGlvbl0sIHR5cGVTcGVjTmFtZSwgdHlwZW9mIGVycm9yKSA6IHZvaWQgMDsKKyAg ICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IubWVzc2FnZSBpbiBsb2dn ZWRUeXBlRmFpbHVyZXMpKSB7CisgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUg b25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZQorICAgICAgICAvLyBz YW1lIGVycm9yLgorICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IubWVzc2FnZV0gPSB0 cnVlOworCisgICAgICAgIHZhciBjb21wb25lbnRTdGFja0luZm8gPSAnJzsKKworICAgICAgICBp ZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAgICAgaWYgKCFSZWFj dENvbXBvbmVudFRyZWVIb29rKSB7CisgICAgICAgICAgICBSZWFjdENvbXBvbmVudFRyZWVIb29r ID0gX2RlcmVxXygxMzIpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoZGVidWdJRCAhPT0g bnVsbCkgeworICAgICAgICAgICAgY29tcG9uZW50U3RhY2tJbmZvID0gUmVhY3RDb21wb25lbnRU cmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChkZWJ1Z0lEKTsKKyAgICAgICAgICB9IGVsc2Ug aWYgKGVsZW1lbnQgIT09IG51bGwpIHsKKyAgICAgICAgICAgIGNvbXBvbmVudFN0YWNrSW5mbyA9 IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0Q3VycmVudFN0YWNrQWRkZW5kdW0oZWxlbWVudCk7 CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3By b2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ0ZhaWxlZCAlcyB0eXBlOiAlcyVzJywgbG9jYXRp b24sIGVycm9yLm1lc3NhZ2UsIGNvbXBvbmVudFN0YWNrSW5mbykgOiB2b2lkIDA7CisgICAgICB9 CisgICAgfQorICB9Cit9CisKK21vZHVsZS5leHBvcnRzID0gY2hlY2tSZWFjdFR5cGVTcGVjOwor fSkuY2FsbCh0aGlzLHVuZGVmaW5lZCkKK30seyIxMjUiOjEyNSwiMTMyIjoxMzIsIjE1MCI6MTUw LCIxNTciOjE1NywiNzIiOjcyLCI3MyI6NzN9XSwxMDU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxl LGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5j LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxp Y2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VO U0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRk aXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBB VEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKy8qIGdsb2JhbHMg TVNBcHAgKi8KKworJ3VzZSBzdHJpY3QnOworCisvKioKKyAqIENyZWF0ZSBhIGZ1bmN0aW9uIHdo aWNoIGhhcyAndW5zYWZlJyBwcml2aWxlZ2VzIChyZXF1aXJlZCBieSB3aW5kb3dzOCBhcHBzKQor ICovCisKK3ZhciBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uID0gZnVuY3Rpb24g KGZ1bmMpIHsKKyAgaWYgKHR5cGVvZiBNU0FwcCAhPT0gJ3VuZGVmaW5lZCcgJiYgTVNBcHAuZXhl Y1Vuc2FmZUxvY2FsRnVuY3Rpb24pIHsKKyAgICByZXR1cm4gZnVuY3Rpb24gKGFyZzAsIGFyZzEs IGFyZzIsIGFyZzMpIHsKKyAgICAgIE1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0 aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIGZ1bmMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Cisg ICAgICB9KTsKKyAgICB9OworICB9IGVsc2UgeworICAgIHJldHVybiBmdW5jOworICB9Cit9Owor Cittb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb247Cit9 LHt9XSwxMDY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5 cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZl ZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5 bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJl Y3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0 ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBk aXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIENTU1Byb3BlcnR5ID0g X2RlcmVxXyg0KTsKK3ZhciB3YXJuaW5nID0gX2RlcmVxXygxNTcpOworCit2YXIgaXNVbml0bGVz c051bWJlciA9IENTU1Byb3BlcnR5LmlzVW5pdGxlc3NOdW1iZXI7Cit2YXIgc3R5bGVXYXJuaW5n cyA9IHt9OworCisvKioKKyAqIENvbnZlcnQgYSB2YWx1ZSBpbnRvIHRoZSBwcm9wZXIgY3NzIHdy aXRhYmxlIHZhbHVlLiBUaGUgc3R5bGUgbmFtZSBgbmFtZWAKKyAqIHNob3VsZCBiZSBsb2dpY2Fs IChubyBoeXBoZW5zKSwgYXMgc3BlY2lmaWVkCisgKiBpbiBgQ1NTUHJvcGVydHkuaXNVbml0bGVz c051bWJlcmAuCisgKgorICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgQ1NTIHByb3BlcnR5IG5hbWUg c3VjaCBhcyBgdG9wTWFyZ2luYC4KKyAqIEBwYXJhbSB7Kn0gdmFsdWUgQ1NTIHByb3BlcnR5IHZh bHVlIHN1Y2ggYXMgYDEwcHhgLgorICogQHBhcmFtIHtSZWFjdERPTUNvbXBvbmVudH0gY29tcG9u ZW50CisgKiBAcmV0dXJuIHtzdHJpbmd9IE5vcm1hbGl6ZWQgc3R5bGUgdmFsdWUgd2l0aCBkaW1l bnNpb25zIGFwcGxpZWQuCisgKi8KK2Z1bmN0aW9uIGRhbmdlcm91c1N0eWxlVmFsdWUobmFtZSwg dmFsdWUsIGNvbXBvbmVudCkgeworICAvLyBOb3RlIHRoYXQgd2UndmUgcmVtb3ZlZCBlc2NhcGVU ZXh0Rm9yQnJvd3NlcigpIGNhbGxzIGhlcmUgc2luY2UgdGhlCisgIC8vIHdob2xlIHN0cmluZyB3 aWxsIGJlIGVzY2FwZWQgd2hlbiB0aGUgYXR0cmlidXRlIGlzIGluamVjdGVkIGludG8KKyAgLy8g dGhlIG1hcmt1cC4gSWYgeW91IHByb3ZpZGUgdW5zYWZlIHVzZXIgZGF0YSBoZXJlIHRoZXkgY2Fu IGluamVjdAorICAvLyBhcmJpdHJhcnkgQ1NTIHdoaWNoIG1heSBiZSBwcm9ibGVtYXRpYyAoSSBj b3VsZG4ndCByZXBybyB0aGlzKToKKyAgLy8gaHR0cHM6Ly93d3cub3dhc3Aub3JnL2luZGV4LnBo cC9YU1NfRmlsdGVyX0V2YXNpb25fQ2hlYXRfU2hlZXQKKyAgLy8gaHR0cDovL3d3dy50aGVzcGFu bmVyLmNvLnVrLzIwMDcvMTEvMjYvdWx0aW1hdGUteHNzLWNzcy1pbmplY3Rpb24vCisgIC8vIFRo aXMgaXMgbm90IGFuIFhTUyBob2xlIGJ1dCBpbnN0ZWFkIGEgcG90ZW50aWFsIENTUyBpbmplY3Rp b24gaXNzdWUKKyAgLy8gd2hpY2ggaGFzIGxlYWQgdG8gYSBncmVhdGVyIGRpc2N1c3Npb24gYWJv dXQgaG93IHdlJ3JlIGdvaW5nIHRvCisgIC8vIHRydXN0IFVSTHMgbW92aW5nIGZvcndhcmQuIFNl ZSAjMjExNTkwMQorCisgIHZhciBpc0VtcHR5ID0gdmFsdWUgPT0gbnVsbCB8fCB0eXBlb2YgdmFs dWUgPT09ICdib29sZWFuJyB8fCB2YWx1ZSA9PT0gJyc7CisgIGlmIChpc0VtcHR5KSB7CisgICAg cmV0dXJuICcnOworICB9CisKKyAgdmFyIGlzTm9uTnVtZXJpYyA9IGlzTmFOKHZhbHVlKTsKKyAg aWYgKGlzTm9uTnVtZXJpYyB8fCB2YWx1ZSA9PT0gMCB8fCBpc1VuaXRsZXNzTnVtYmVyLmhhc093 blByb3BlcnR5KG5hbWUpICYmIGlzVW5pdGxlc3NOdW1iZXJbbmFtZV0pIHsKKyAgICByZXR1cm4g JycgKyB2YWx1ZTsgLy8gY2FzdCB0byBzdHJpbmcKKyAgfQorCisgIGlmICh0eXBlb2YgdmFsdWUg PT09ICdzdHJpbmcnKSB7CisgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykg eworICAgICAgLy8gQWxsb3cgJzAnIHRvIHBhc3MgdGhyb3VnaCB3aXRob3V0IHdhcm5pbmcuIDAg aXMgYWxyZWFkeSBzcGVjaWFsIGFuZAorICAgICAgLy8gZG9lc24ndCByZXF1aXJlIHVuaXRzLCBz byB3ZSBkb24ndCBuZWVkIHRvIHdhcm4gYWJvdXQgaXQuCisgICAgICBpZiAoY29tcG9uZW50ICYm IHZhbHVlICE9PSAnMCcpIHsKKyAgICAgICAgdmFyIG93bmVyID0gY29tcG9uZW50Ll9jdXJyZW50 RWxlbWVudC5fb3duZXI7CisgICAgICAgIHZhciBvd25lck5hbWUgPSBvd25lciA/IG93bmVyLmdl dE5hbWUoKSA6IG51bGw7CisgICAgICAgIGlmIChvd25lck5hbWUgJiYgIXN0eWxlV2FybmluZ3Nb b3duZXJOYW1lXSkgeworICAgICAgICAgIHN0eWxlV2FybmluZ3Nbb3duZXJOYW1lXSA9IHt9Owor ICAgICAgICB9CisgICAgICAgIHZhciB3YXJuZWQgPSBmYWxzZTsKKyAgICAgICAgaWYgKG93bmVy TmFtZSkgeworICAgICAgICAgIHZhciB3YXJuaW5ncyA9IHN0eWxlV2FybmluZ3Nbb3duZXJOYW1l XTsKKyAgICAgICAgICB3YXJuZWQgPSB3YXJuaW5nc1tuYW1lXTsKKyAgICAgICAgICBpZiAoIXdh cm5lZCkgeworICAgICAgICAgICAgd2FybmluZ3NbbmFtZV0gPSB0cnVlOworICAgICAgICAgIH0K KyAgICAgICAgfQorICAgICAgICBpZiAoIXdhcm5lZCkgeworICAgICAgICAgICJkZXZlbG9wbWVu dCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdhIGAlc2AgdGFnIChvd25lcjog YCVzYCkgd2FzIHBhc3NlZCBhIG51bWVyaWMgc3RyaW5nIHZhbHVlICcgKyAnZm9yIENTUyBwcm9w ZXJ0eSBgJXNgICh2YWx1ZTogYCVzYCkgd2hpY2ggd2lsbCBiZSB0cmVhdGVkICcgKyAnYXMgYSB1 bml0bGVzcyBudW1iZXIgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBSZWFjdC4nLCBjb21wb25lbnQu X2N1cnJlbnRFbGVtZW50LnR5cGUsIG93bmVyTmFtZSB8fCAndW5rbm93bicsIG5hbWUsIHZhbHVl KSA6IHZvaWQgMDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICB2YWx1ZSA9IHZhbHVl LnRyaW0oKTsKKyAgfQorICByZXR1cm4gdmFsdWUgKyAncHgnOworfQorCittb2R1bGUuZXhwb3J0 cyA9IGRhbmdlcm91c1N0eWxlVmFsdWU7Cit9LHsiMTU3IjoxNTcsIjQiOjR9XSwxMDc6W2Z1bmN0 aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxNi1wcmVz ZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlz IHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3Vu ZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBz b3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4g YmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgor ICogQmFzZWQgb24gdGhlIGVzY2FwZS1odG1sIGxpYnJhcnksIHdoaWNoIGlzIHVzZWQgdW5kZXIg dGhlIE1JVCBMaWNlbnNlIGJlbG93OgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDEzIFRK IEhvbG93YXljaHVrCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgQW5kcmVhcyBMdWJiZQorICogQ29w eXJpZ2h0IChjKSAyMDE1IFRpYW5jaGVuZyAiVGltb3RoeSIgR3UKKyAqCisgKiBQZXJtaXNzaW9u IGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5p bmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRp b24gZmlsZXMgKHRoZQorICogJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdp dGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBy aWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0 ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRv CisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8g ZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBU aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFs bCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBv ZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycs IFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElO Q0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5U QUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdF TUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xE RVJTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJ VFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJ U0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNP RlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoK KyAqLworCisndXNlIHN0cmljdCc7CisKKy8vIGNvZGUgY29waWVkIGFuZCBtb2RpZmllZCBmcm9t IGVzY2FwZS1odG1sCisvKioKKyAqIE1vZHVsZSB2YXJpYWJsZXMuCisgKiBAcHJpdmF0ZQorICov CisKK3ZhciBtYXRjaEh0bWxSZWdFeHAgPSAvWyInJjw+XS87CisKKy8qKgorICogRXNjYXBlIHNw ZWNpYWwgY2hhcmFjdGVycyBpbiB0aGUgZ2l2ZW4gc3RyaW5nIG9mIGh0bWwuCisgKgorICogQHBh cmFtICB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBlc2NhcGUgZm9yIGluc2VydGluZyBp bnRvIEhUTUwKKyAqIEByZXR1cm4ge3N0cmluZ30KKyAqIEBwdWJsaWMKKyAqLworCitmdW5jdGlv biBlc2NhcGVIdG1sKHN0cmluZykgeworICB2YXIgc3RyID0gJycgKyBzdHJpbmc7CisgIHZhciBt YXRjaCA9IG1hdGNoSHRtbFJlZ0V4cC5leGVjKHN0cik7CisKKyAgaWYgKCFtYXRjaCkgeworICAg IHJldHVybiBzdHI7CisgIH0KKworICB2YXIgZXNjYXBlOworICB2YXIgaHRtbCA9ICcnOworICB2 YXIgaW5kZXggPSAwOworICB2YXIgbGFzdEluZGV4ID0gMDsKKworICBmb3IgKGluZGV4ID0gbWF0 Y2guaW5kZXg7IGluZGV4IDwgc3RyLmxlbmd0aDsgaW5kZXgrKykgeworICAgIHN3aXRjaCAoc3Ry LmNoYXJDb2RlQXQoaW5kZXgpKSB7CisgICAgICBjYXNlIDM0OgorICAgICAgICAvLyAiCisgICAg ICAgIGVzY2FwZSA9ICcmcXVvdDsnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzg6Cisg ICAgICAgIC8vICYKKyAgICAgICAgZXNjYXBlID0gJyZhbXA7JzsKKyAgICAgICAgYnJlYWs7Cisg ICAgICBjYXNlIDM5OgorICAgICAgICAvLyAnCisgICAgICAgIGVzY2FwZSA9ICcmI3gyNzsnOyAv LyBtb2RpZmllZCBmcm9tIGVzY2FwZS1odG1sOyB1c2VkIHRvIGJlICcmIzM5JworICAgICAgICBi cmVhazsKKyAgICAgIGNhc2UgNjA6CisgICAgICAgIC8vIDwKKyAgICAgICAgZXNjYXBlID0gJyZs dDsnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNjI6CisgICAgICAgIC8vID4KKyAgICAg ICAgZXNjYXBlID0gJyZndDsnOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAg ICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChsYXN0SW5kZXggIT09IGluZGV4KSB7Cisg ICAgICBodG1sICs9IHN0ci5zdWJzdHJpbmcobGFzdEluZGV4LCBpbmRleCk7CisgICAgfQorCisg ICAgbGFzdEluZGV4ID0gaW5kZXggKyAxOworICAgIGh0bWwgKz0gZXNjYXBlOworICB9CisKKyAg cmV0dXJuIGxhc3RJbmRleCAhPT0gaW5kZXggPyBodG1sICsgc3RyLnN1YnN0cmluZyhsYXN0SW5k ZXgsIGluZGV4KSA6IGh0bWw7Cit9CisvLyBlbmQgY29kZSBjb3BpZWQgYW5kIG1vZGlmaWVkIGZy b20gZXNjYXBlLWh0bWwKKworCisvKioKKyAqIEVzY2FwZXMgdGV4dCB0byBwcmV2ZW50IHNjcmlw dGluZyBhdHRhY2tzLgorICoKKyAqIEBwYXJhbSB7Kn0gdGV4dCBUZXh0IHZhbHVlIHRvIGVzY2Fw ZS4KKyAqIEByZXR1cm4ge3N0cmluZ30gQW4gZXNjYXBlZCBzdHJpbmcuCisgKi8KK2Z1bmN0aW9u IGVzY2FwZVRleHRDb250ZW50Rm9yQnJvd3Nlcih0ZXh0KSB7CisgIGlmICh0eXBlb2YgdGV4dCA9 PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiB0ZXh0ID09PSAnbnVtYmVyJykgeworICAgIC8vIHRoaXMg c2hvcnRjaXJjdWl0IGhlbHBzIHBlcmYgZm9yIHR5cGVzIHRoYXQgd2Uga25vdyB3aWxsIG5ldmVy IGhhdmUKKyAgICAvLyBzcGVjaWFsIGNoYXJhY3RlcnMsIGVzcGVjaWFsbHkgZ2l2ZW4gdGhhdCB0 aGlzIGZ1bmN0aW9uIGlzIHVzZWQgb2Z0ZW4KKyAgICAvLyBmb3IgbnVtZXJpYyBkb20gaWRzLgor ICAgIHJldHVybiAnJyArIHRleHQ7CisgIH0KKyAgcmV0dXJuIGVzY2FwZUh0bWwodGV4dCk7Cit9 CisKK21vZHVsZS5leHBvcnRzID0gZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyOworfSx7fV0s MTA4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0 IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg KgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxp Y2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5 IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCBy aWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0 b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJvZEludmFyaWFudCA9IF9k ZXJlcV8oMTI1KTsKKwordmFyIFJlYWN0Q3VycmVudE93bmVyID0gX2RlcmVxXygxMzMpOwordmFy IFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IF9kZXJlcV8oMzQpOwordmFyIFJlYWN0SW5zdGFuY2VN YXAgPSBfZGVyZXFfKDYzKTsKKwordmFyIGdldEhvc3RDb21wb25lbnRGcm9tQ29tcG9zaXRlID0g X2RlcmVxXygxMTUpOwordmFyIGludmFyaWFudCA9IF9kZXJlcV8oMTUwKTsKK3ZhciB3YXJuaW5n ID0gX2RlcmVxXygxNTcpOworCisvKioKKyAqIFJldHVybnMgdGhlIERPTSBub2RlIHJlbmRlcmVk IGJ5IHRoaXMgZWxlbWVudC4KKyAqCisgKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8v cmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0bWwjcmVhY3Rkb20uZmluZGRvbW5vZGUKKyAqCisg KiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fERPTUVsZW1lbnR9IGNvbXBvbmVudE9yRWxlbWVudAor ICogQHJldHVybiB7P0RPTUVsZW1lbnR9IFRoZSByb290IG5vZGUgb2YgdGhpcyBlbGVtZW50Lgor ICovCitmdW5jdGlvbiBmaW5kRE9NTm9kZShjb21wb25lbnRPckVsZW1lbnQpIHsKKyAgaWYgKCJk ZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgIHZhciBvd25lciA9IFJlYWN0Q3Vy cmVudE93bmVyLmN1cnJlbnQ7CisgICAgaWYgKG93bmVyICE9PSBudWxsKSB7CisgICAgICAiZGV2 ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKG93bmVyLl93YXJuZWRBYm91dFJl ZnNJblJlbmRlciwgJyVzIGlzIGFjY2Vzc2luZyBmaW5kRE9NTm9kZSBpbnNpZGUgaXRzIHJlbmRl cigpLiAnICsgJ3JlbmRlcigpIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5k IHN0YXRlLiBJdCBzaG91bGQgJyArICduZXZlciBhY2Nlc3Mgc29tZXRoaW5nIHRoYXQgcmVxdWly ZXMgc3RhbGUgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyAnICsgJ3JlbmRlciwgc3VjaCBhcyByZWZz LiBNb3ZlIHRoaXMgbG9naWMgdG8gY29tcG9uZW50RGlkTW91bnQgYW5kICcgKyAnY29tcG9uZW50 RGlkVXBkYXRlIGluc3RlYWQuJywgb3duZXIuZ2V0TmFtZSgpIHx8ICdBIGNvbXBvbmVudCcpIDog dm9pZCAwOworICAgICAgb3duZXIuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyID0gdHJ1ZTsKKyAg ICB9CisgIH0KKyAgaWYgKGNvbXBvbmVudE9yRWxlbWVudCA9PSBudWxsKSB7CisgICAgcmV0dXJu IG51bGw7CisgIH0KKyAgaWYgKGNvbXBvbmVudE9yRWxlbWVudC5ub2RlVHlwZSA9PT0gMSkgewor ICAgIHJldHVybiBjb21wb25lbnRPckVsZW1lbnQ7CisgIH0KKworICB2YXIgaW5zdCA9IFJlYWN0 SW5zdGFuY2VNYXAuZ2V0KGNvbXBvbmVudE9yRWxlbWVudCk7CisgIGlmIChpbnN0KSB7CisgICAg aW5zdCA9IGdldEhvc3RDb21wb25lbnRGcm9tQ29tcG9zaXRlKGluc3QpOworICAgIHJldHVybiBp bnN0ID8gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCkgOiBu dWxsOworICB9CisKKyAgaWYgKHR5cGVvZiBjb21wb25lbnRPckVsZW1lbnQucmVuZGVyID09PSAn ZnVuY3Rpb24nKSB7CisgICAgIWZhbHNlID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24n ID8gaW52YXJpYW50KGZhbHNlLCAnZmluZERPTU5vZGUgd2FzIGNhbGxlZCBvbiBhbiB1bm1vdW50 ZWQgY29tcG9uZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzQ0JykgOiB2b2lkIDA7CisgIH0gZWxz ZSB7CisgICAgIWZhbHNlID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJp YW50KGZhbHNlLCAnRWxlbWVudCBhcHBlYXJzIHRvIGJlIG5laXRoZXIgUmVhY3RDb21wb25lbnQg bm9yIERPTU5vZGUgKGtleXM6ICVzKScsIE9iamVjdC5rZXlzKGNvbXBvbmVudE9yRWxlbWVudCkp IDogX3Byb2RJbnZhcmlhbnQoJzQ1JywgT2JqZWN0LmtleXMoY29tcG9uZW50T3JFbGVtZW50KSkg OiB2b2lkIDA7CisgIH0KK30KKworbW9kdWxlLmV4cG9ydHMgPSBmaW5kRE9NTm9kZTsKK30seyIx MTUiOjExNSwiMTI1IjoxMjUsIjEzMyI6MTMzLCIxNTAiOjE1MCwiMTU3IjoxNTcsIjM0IjozNCwi NjMiOjYzfV0sMTA5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKyhmdW5jdGlv biAocHJvY2Vzcyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJ bmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMg bGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElD RU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBh ZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUg UEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisndXNl IHN0cmljdCc7CisKK3ZhciBLZXlFc2NhcGVVdGlscyA9IF9kZXJlcV8oMjMpOwordmFyIHRyYXZl cnNlQWxsQ2hpbGRyZW4gPSBfZGVyZXFfKDEzMCk7Cit2YXIgd2FybmluZyA9IF9kZXJlcV8oMTU3 KTsKKwordmFyIFJlYWN0Q29tcG9uZW50VHJlZUhvb2s7CisKK2lmICh0eXBlb2YgcHJvY2VzcyAh PT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5lbnYgJiYgImRldmVsb3BtZW50IiA9PT0gJ3Rlc3Qn KSB7CisgIC8vIFRlbXBvcmFyeSBoYWNrLgorICAvLyBJbmxpbmUgcmVxdWlyZXMgZG9uJ3Qgd29y ayB3ZWxsIHdpdGggSmVzdDoKKyAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0 L2lzc3Vlcy83MjQwCisgIC8vIFJlbW92ZSB0aGUgaW5saW5lIHJlcXVpcmVzIHdoZW4gd2UgZG9u J3QgbmVlZCB0aGVtIGFueW1vcmU6CisgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9y ZWFjdC9wdWxsLzcxNzgKKyAgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IF9kZXJlcV8oMTMyKTsK K30KKworLyoqCisgKiBAcGFyYW0ge2Z1bmN0aW9ufSB0cmF2ZXJzZUNvbnRleHQgQ29udGV4dCBw YXNzZWQgdGhyb3VnaCB0cmF2ZXJzYWwuCisgKiBAcGFyYW0gez9SZWFjdENvbXBvbmVudH0gY2hp bGQgUmVhY3QgY2hpbGQgY29tcG9uZW50LgorICogQHBhcmFtIHshc3RyaW5nfSBuYW1lIFN0cmlu ZyBuYW1lIG9mIGtleSBwYXRoIHRvIGNoaWxkLgorICogQHBhcmFtIHtudW1iZXI9fSBzZWxmRGVi dWdJRCBPcHRpb25hbCBkZWJ1Z0lEIG9mIHRoZSBjdXJyZW50IGludGVybmFsIGluc3RhbmNlLgor ICovCitmdW5jdGlvbiBmbGF0dGVuU2luZ2xlQ2hpbGRJbnRvQ29udGV4dCh0cmF2ZXJzZUNvbnRl eHQsIGNoaWxkLCBuYW1lLCBzZWxmRGVidWdJRCkgeworICAvLyBXZSBmb3VuZCBhIGNvbXBvbmVu dCBpbnN0YW5jZS4KKyAgaWYgKHRyYXZlcnNlQ29udGV4dCAmJiB0eXBlb2YgdHJhdmVyc2VDb250 ZXh0ID09PSAnb2JqZWN0JykgeworICAgIHZhciByZXN1bHQgPSB0cmF2ZXJzZUNvbnRleHQ7Cisg ICAgdmFyIGtleVVuaXF1ZSA9IHJlc3VsdFtuYW1lXSA9PT0gdW5kZWZpbmVkOworICAgIGlmICgi ZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIGlmICghUmVhY3RDb21wb25l bnRUcmVlSG9vaykgeworICAgICAgICBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gX2RlcmVxXygx MzIpOworICAgICAgfQorICAgICAgaWYgKCFrZXlVbmlxdWUpIHsKKyAgICAgICAgImRldmVsb3Bt ZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2ZsYXR0ZW5DaGlsZHJlbigu Li4pOiBFbmNvdW50ZXJlZCB0d28gY2hpbGRyZW4gd2l0aCB0aGUgc2FtZSBrZXksICcgKyAnYCVz YC4gQ2hpbGQga2V5cyBtdXN0IGJlIHVuaXF1ZTsgd2hlbiB0d28gY2hpbGRyZW4gc2hhcmUgYSBr ZXksIG9ubHkgJyArICd0aGUgZmlyc3QgY2hpbGQgd2lsbCBiZSB1c2VkLiVzJywgS2V5RXNjYXBl VXRpbHMudW5lc2NhcGUobmFtZSksIFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0U3RhY2tBZGRl bmR1bUJ5SUQoc2VsZkRlYnVnSUQpKSA6IHZvaWQgMDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYg KGtleVVuaXF1ZSAmJiBjaGlsZCAhPSBudWxsKSB7CisgICAgICByZXN1bHRbbmFtZV0gPSBjaGls ZDsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBGbGF0dGVucyBjaGlsZHJlbiB0aGF0IGFyZSB0 eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuIEFueSBudWxsCisgKiBjaGls ZHJlbiB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIG9iamVjdC4KKyAqIEBy ZXR1cm4geyFvYmplY3R9IGZsYXR0ZW5lZCBjaGlsZHJlbiBrZXllZCBieSBuYW1lLgorICovCitm dW5jdGlvbiBmbGF0dGVuQ2hpbGRyZW4oY2hpbGRyZW4sIHNlbGZEZWJ1Z0lEKSB7CisgIGlmIChj aGlsZHJlbiA9PSBudWxsKSB7CisgICAgcmV0dXJuIGNoaWxkcmVuOworICB9CisgIHZhciByZXN1 bHQgPSB7fTsKKworICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAg dHJhdmVyc2VBbGxDaGlsZHJlbihjaGlsZHJlbiwgZnVuY3Rpb24gKHRyYXZlcnNlQ29udGV4dCwg Y2hpbGQsIG5hbWUpIHsKKyAgICAgIHJldHVybiBmbGF0dGVuU2luZ2xlQ2hpbGRJbnRvQ29udGV4 dCh0cmF2ZXJzZUNvbnRleHQsIGNoaWxkLCBuYW1lLCBzZWxmRGVidWdJRCk7CisgICAgfSwgcmVz dWx0KTsKKyAgfSBlbHNlIHsKKyAgICB0cmF2ZXJzZUFsbENoaWxkcmVuKGNoaWxkcmVuLCBmbGF0 dGVuU2luZ2xlQ2hpbGRJbnRvQ29udGV4dCwgcmVzdWx0KTsKKyAgfQorICByZXR1cm4gcmVzdWx0 OworfQorCittb2R1bGUuZXhwb3J0cyA9IGZsYXR0ZW5DaGlsZHJlbjsKK30pLmNhbGwodGhpcyx1 bmRlZmluZWQpCit9LHsiMTMwIjoxMzAsIjEzMiI6MTMyLCIxNTciOjE1NywiMjMiOjIzfV0sMTEw OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIw MTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor ICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vu c2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9m IHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdo dHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5 LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKKworLyoqCisgKiBAcGFyYW0ge2FycmF5 fSBhcnIgYW4gImFjY3VtdWxhdGlvbiIgb2YgaXRlbXMgd2hpY2ggaXMgZWl0aGVyIGFuIEFycmF5 IG9yCisgKiBhIHNpbmdsZSBpdGVtLiBVc2VmdWwgd2hlbiBwYWlyZWQgd2l0aCB0aGUgYGFjY3Vt dWxhdGVgIG1vZHVsZS4gVGhpcyBpcyBhCisgKiBzaW1wbGUgdXRpbGl0eSB0aGF0IGFsbG93cyB1 cyB0byByZWFzb24gYWJvdXQgYSBjb2xsZWN0aW9uIG9mIGl0ZW1zLCBidXQKKyAqIGhhbmRsaW5n IHRoZSBjYXNlIHdoZW4gdGhlcmUgaXMgZXhhY3RseSBvbmUgaXRlbSAoYW5kIHdlIGRvIG5vdCBu ZWVkIHRvCisgKiBhbGxvY2F0ZSBhbiBhcnJheSkuCisgKi8KKworZnVuY3Rpb24gZm9yRWFjaEFj Y3VtdWxhdGVkKGFyciwgY2IsIHNjb3BlKSB7CisgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHsK KyAgICBhcnIuZm9yRWFjaChjYiwgc2NvcGUpOworICB9IGVsc2UgaWYgKGFycikgeworICAgIGNi LmNhbGwoc2NvcGUsIGFycik7CisgIH0KK30KKworbW9kdWxlLmV4cG9ydHMgPSBmb3JFYWNoQWNj dW11bGF0ZWQ7Cit9LHt9XSwxMTE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpewor LyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJp Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVy IHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0 aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFu dAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBp biB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKworLyoqCisg KiBgY2hhckNvZGVgIHJlcHJlc2VudHMgdGhlIGFjdHVhbCAiY2hhcmFjdGVyIGNvZGUiIGFuZCBp cyBzYWZlIHRvIHVzZSB3aXRoCisgKiBgU3RyaW5nLmZyb21DaGFyQ29kZWAuIEFzIHN1Y2gsIG9u bHkga2V5cyB0aGF0IGNvcnJlc3BvbmQgdG8gcHJpbnRhYmxlCisgKiBjaGFyYWN0ZXJzIHByb2R1 Y2UgYSB2YWxpZCBgY2hhckNvZGVgLCB0aGUgb25seSBleGNlcHRpb24gdG8gdGhpcyBpcyBFbnRl ci4KKyAqIFRoZSBUYWIta2V5IGlzIGNvbnNpZGVyZWQgbm9uLXByaW50YWJsZSBhbmQgZG9lcyBu b3QgaGF2ZSBhIGBjaGFyQ29kZWAsCisgKiBwcmVzdW1hYmx5IGJlY2F1c2UgaXQgZG9lcyBub3Qg cHJvZHVjZSBhIHRhYi1jaGFyYWN0ZXIgaW4gYnJvd3NlcnMuCisgKgorICogQHBhcmFtIHtvYmpl Y3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LgorICogQHJldHVybiB7bnVtYmVy fSBOb3JtYWxpemVkIGBjaGFyQ29kZWAgcHJvcGVydHkuCisgKi8KKworZnVuY3Rpb24gZ2V0RXZl bnRDaGFyQ29kZShuYXRpdmVFdmVudCkgeworICB2YXIgY2hhckNvZGU7CisgIHZhciBrZXlDb2Rl ID0gbmF0aXZlRXZlbnQua2V5Q29kZTsKKworICBpZiAoJ2NoYXJDb2RlJyBpbiBuYXRpdmVFdmVu dCkgeworICAgIGNoYXJDb2RlID0gbmF0aXZlRXZlbnQuY2hhckNvZGU7CisKKyAgICAvLyBGRiBk b2VzIG5vdCBzZXQgYGNoYXJDb2RlYCBmb3IgdGhlIEVudGVyLWtleSwgY2hlY2sgYWdhaW5zdCBg a2V5Q29kZWAuCisgICAgaWYgKGNoYXJDb2RlID09PSAwICYmIGtleUNvZGUgPT09IDEzKSB7Cisg ICAgICBjaGFyQ29kZSA9IDEzOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBJRTggZG9lcyBu b3QgaW1wbGVtZW50IGBjaGFyQ29kZWAsIGJ1dCBga2V5Q29kZWAgaGFzIHRoZSBjb3JyZWN0IHZh bHVlLgorICAgIGNoYXJDb2RlID0ga2V5Q29kZTsKKyAgfQorCisgIC8vIFNvbWUgbm9uLXByaW50 YWJsZSBrZXlzIGFyZSByZXBvcnRlZCBpbiBgY2hhckNvZGVgL2BrZXlDb2RlYCwgZGlzY2FyZCB0 aGVtLgorICAvLyBNdXN0IG5vdCBkaXNjYXJkIHRoZSAobm9uLSlwcmludGFibGUgRW50ZXIta2V5 LgorICBpZiAoY2hhckNvZGUgPj0gMzIgfHwgY2hhckNvZGUgPT09IDEzKSB7CisgICAgcmV0dXJu IGNoYXJDb2RlOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK21vZHVsZS5leHBvcnRzID0gZ2V0 RXZlbnRDaGFyQ29kZTsKK30se31dLDExMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0 cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBB bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQg dW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxl IGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFs IGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBm aWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2 YXIgZ2V0RXZlbnRDaGFyQ29kZSA9IF9kZXJlcV8oMTExKTsKKworLyoqCisgKiBOb3JtYWxpemF0 aW9uIG9mIGRlcHJlY2F0ZWQgSFRNTDUgYGtleWAgdmFsdWVzCisgKiBAc2VlIGh0dHBzOi8vZGV2 ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50I0tleV9u YW1lcworICovCit2YXIgbm9ybWFsaXplS2V5ID0geworICAnRXNjJzogJ0VzY2FwZScsCisgICdT cGFjZWJhcic6ICcgJywKKyAgJ0xlZnQnOiAnQXJyb3dMZWZ0JywKKyAgJ1VwJzogJ0Fycm93VXAn LAorICAnUmlnaHQnOiAnQXJyb3dSaWdodCcsCisgICdEb3duJzogJ0Fycm93RG93bicsCisgICdE ZWwnOiAnRGVsZXRlJywKKyAgJ1dpbic6ICdPUycsCisgICdNZW51JzogJ0NvbnRleHRNZW51JywK KyAgJ0FwcHMnOiAnQ29udGV4dE1lbnUnLAorICAnU2Nyb2xsJzogJ1Njcm9sbExvY2snLAorICAn TW96UHJpbnRhYmxlS2V5JzogJ1VuaWRlbnRpZmllZCcKK307CisKKy8qKgorICogVHJhbnNsYXRp b24gZnJvbSBsZWdhY3kgYGtleUNvZGVgIHRvIEhUTUw1IGBrZXlgCisgKiBPbmx5IHNwZWNpYWwg a2V5cyBzdXBwb3J0ZWQsIGFsbCBvdGhlcnMgZGVwZW5kIG9uIGtleWJvYXJkIGxheW91dCBvciBi cm93c2VyCisgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3Mv V2ViL0FQSS9LZXlib2FyZEV2ZW50I0tleV9uYW1lcworICovCit2YXIgdHJhbnNsYXRlVG9LZXkg PSB7CisgIDg6ICdCYWNrc3BhY2UnLAorICA5OiAnVGFiJywKKyAgMTI6ICdDbGVhcicsCisgIDEz OiAnRW50ZXInLAorICAxNjogJ1NoaWZ0JywKKyAgMTc6ICdDb250cm9sJywKKyAgMTg6ICdBbHQn LAorICAxOTogJ1BhdXNlJywKKyAgMjA6ICdDYXBzTG9jaycsCisgIDI3OiAnRXNjYXBlJywKKyAg MzI6ICcgJywKKyAgMzM6ICdQYWdlVXAnLAorICAzNDogJ1BhZ2VEb3duJywKKyAgMzU6ICdFbmQn LAorICAzNjogJ0hvbWUnLAorICAzNzogJ0Fycm93TGVmdCcsCisgIDM4OiAnQXJyb3dVcCcsCisg IDM5OiAnQXJyb3dSaWdodCcsCisgIDQwOiAnQXJyb3dEb3duJywKKyAgNDU6ICdJbnNlcnQnLAor ICA0NjogJ0RlbGV0ZScsCisgIDExMjogJ0YxJywgMTEzOiAnRjInLCAxMTQ6ICdGMycsIDExNTog J0Y0JywgMTE2OiAnRjUnLCAxMTc6ICdGNicsCisgIDExODogJ0Y3JywgMTE5OiAnRjgnLCAxMjA6 ICdGOScsIDEyMTogJ0YxMCcsIDEyMjogJ0YxMScsIDEyMzogJ0YxMicsCisgIDE0NDogJ051bUxv Y2snLAorICAxNDU6ICdTY3JvbGxMb2NrJywKKyAgMjI0OiAnTWV0YScKK307CisKKy8qKgorICog QHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LgorICogQHJl dHVybiB7c3RyaW5nfSBOb3JtYWxpemVkIGBrZXlgIHByb3BlcnR5LgorICovCitmdW5jdGlvbiBn ZXRFdmVudEtleShuYXRpdmVFdmVudCkgeworICBpZiAobmF0aXZlRXZlbnQua2V5KSB7CisgICAg Ly8gTm9ybWFsaXplIGluY29uc2lzdGVudCB2YWx1ZXMgcmVwb3J0ZWQgYnkgYnJvd3NlcnMgZHVl IHRvCisgICAgLy8gaW1wbGVtZW50YXRpb25zIG9mIGEgd29ya2luZyBkcmFmdCBzcGVjaWZpY2F0 aW9uLgorCisgICAgLy8gRmlyZUZveCBpbXBsZW1lbnRzIGBrZXlgIGJ1dCByZXR1cm5zIGBNb3pQ cmludGFibGVLZXlgIGZvciBhbGwKKyAgICAvLyBwcmludGFibGUgY2hhcmFjdGVycyAobm9ybWFs aXplZCB0byBgVW5pZGVudGlmaWVkYCksIGlnbm9yZSBpdC4KKyAgICB2YXIga2V5ID0gbm9ybWFs aXplS2V5W25hdGl2ZUV2ZW50LmtleV0gfHwgbmF0aXZlRXZlbnQua2V5OworICAgIGlmIChrZXkg IT09ICdVbmlkZW50aWZpZWQnKSB7CisgICAgICByZXR1cm4ga2V5OworICAgIH0KKyAgfQorCisg IC8vIEJyb3dzZXIgZG9lcyBub3QgaW1wbGVtZW50IGBrZXlgLCBwb2x5ZmlsbCBhcyBtdWNoIG9m IGl0IGFzIHdlIGNhbi4KKyAgaWYgKG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHsK KyAgICB2YXIgY2hhckNvZGUgPSBnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KTsKKworICAg IC8vIFRoZSBlbnRlci1rZXkgaXMgdGVjaG5pY2FsbHkgYm90aCBwcmludGFibGUgYW5kIG5vbi1w cmludGFibGUgYW5kIGNhbgorICAgIC8vIHRodXMgYmUgY2FwdHVyZWQgYnkgYGtleXByZXNzYCwg bm8gb3RoZXIgbm9uLXByaW50YWJsZSBrZXkgc2hvdWxkLgorICAgIHJldHVybiBjaGFyQ29kZSA9 PT0gMTMgPyAnRW50ZXInIDogU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSk7CisgIH0KKyAg aWYgKG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBuYXRpdmVFdmVudC50eXBlID09 PSAna2V5dXAnKSB7CisgICAgLy8gV2hpbGUgdXNlciBrZXlib2FyZCBsYXlvdXQgZGV0ZXJtaW5l cyB0aGUgYWN0dWFsIG1lYW5pbmcgb2YgZWFjaAorICAgIC8vIGBrZXlDb2RlYCB2YWx1ZSwgYWxt b3N0IGFsbCBmdW5jdGlvbiBrZXlzIGhhdmUgYSB1bml2ZXJzYWwgdmFsdWUuCisgICAgcmV0dXJu IHRyYW5zbGF0ZVRvS2V5W25hdGl2ZUV2ZW50LmtleUNvZGVdIHx8ICdVbmlkZW50aWZpZWQnOwor ICB9CisgIHJldHVybiAnJzsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBnZXRFdmVudEtleTsKK30s eyIxMTEiOjExMX1dLDExMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioK KyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRz IHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhl IEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSBy b290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50Cisg KiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRo ZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCisvKioKKyAqIFRy YW5zbGF0aW9uIGZyb20gbW9kaWZpZXIga2V5IHRvIHRoZSBhc3NvY2lhdGVkIHByb3BlcnR5IGlu IHRoZSBldmVudC4KKyAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZl bnRzLyNrZXlzLU1vZGlmaWVycworICovCisKK3ZhciBtb2RpZmllcktleVRvUHJvcCA9IHsKKyAg J0FsdCc6ICdhbHRLZXknLAorICAnQ29udHJvbCc6ICdjdHJsS2V5JywKKyAgJ01ldGEnOiAnbWV0 YUtleScsCisgICdTaGlmdCc6ICdzaGlmdEtleScKK307CisKKy8vIElFOCBkb2VzIG5vdCBpbXBs ZW1lbnQgZ2V0TW9kaWZpZXJTdGF0ZSBzbyB3ZSBzaW1wbHkgbWFwIGl0IHRvIHRoZSBvbmx5Cisv LyBtb2RpZmllciBrZXlzIGV4cG9zZWQgYnkgdGhlIGV2ZW50IGl0c2VsZiwgZG9lcyBub3Qgc3Vw cG9ydCBMb2NrLWtleXMuCisvLyBDdXJyZW50bHksIGFsbCBtYWpvciBicm93c2VycyBleGNlcHQg Q2hyb21lIHNlZW1zIHRvIHN1cHBvcnQgTG9jay1rZXlzLgorZnVuY3Rpb24gbW9kaWZpZXJTdGF0 ZUdldHRlcihrZXlBcmcpIHsKKyAgdmFyIHN5bnRoZXRpY0V2ZW50ID0gdGhpczsKKyAgdmFyIG5h dGl2ZUV2ZW50ID0gc3ludGhldGljRXZlbnQubmF0aXZlRXZlbnQ7CisgIGlmIChuYXRpdmVFdmVu dC5nZXRNb2RpZmllclN0YXRlKSB7CisgICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmdldE1vZGlmaWVy U3RhdGUoa2V5QXJnKTsKKyAgfQorICB2YXIga2V5UHJvcCA9IG1vZGlmaWVyS2V5VG9Qcm9wW2tl eUFyZ107CisgIHJldHVybiBrZXlQcm9wID8gISFuYXRpdmVFdmVudFtrZXlQcm9wXSA6IGZhbHNl OworfQorCitmdW5jdGlvbiBnZXRFdmVudE1vZGlmaWVyU3RhdGUobmF0aXZlRXZlbnQpIHsKKyAg cmV0dXJuIG1vZGlmaWVyU3RhdGVHZXR0ZXI7Cit9CisKK21vZHVsZS5leHBvcnRzID0gZ2V0RXZl bnRNb2RpZmllclN0YXRlOworfSx7fV0sMTE0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBv cnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAq IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNl ZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZp bGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9u YWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRT IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisK Ky8qKgorICogR2V0cyB0aGUgdGFyZ2V0IG5vZGUgZnJvbSBhIG5hdGl2ZSBicm93c2VyIGV2ZW50 IGJ5IGFjY291bnRpbmcgZm9yCisgKiBpbmNvbnNpc3RlbmNpZXMgaW4gYnJvd3NlciBET00gQVBJ cy4KKyAqCisgKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZl bnQuCisgKiBAcmV0dXJuIHtET01FdmVudFRhcmdldH0gVGFyZ2V0IG5vZGUuCisgKi8KKworZnVu Y3Rpb24gZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpIHsKKyAgdmFyIHRhcmdldCA9IG5hdGl2 ZUV2ZW50LnRhcmdldCB8fCBuYXRpdmVFdmVudC5zcmNFbGVtZW50IHx8IHdpbmRvdzsKKworICAv LyBOb3JtYWxpemUgU1ZHIDx1c2U+IGVsZW1lbnQgZXZlbnRzICM0OTYzCisgIGlmICh0YXJnZXQu Y29ycmVzcG9uZGluZ1VzZUVsZW1lbnQpIHsKKyAgICB0YXJnZXQgPSB0YXJnZXQuY29ycmVzcG9u ZGluZ1VzZUVsZW1lbnQ7CisgIH0KKworICAvLyBTYWZhcmkgbWF5IGZpcmUgZXZlbnRzIG9uIHRl eHQgbm9kZXMgKE5vZGUuVEVYVF9OT0RFIGlzIDMpLgorICAvLyBAc2VlIGh0dHA6Ly93d3cucXVp cmtzbW9kZS5vcmcvanMvZXZlbnRzX3Byb3BlcnRpZXMuaHRtbAorICByZXR1cm4gdGFyZ2V0Lm5v ZGVUeXBlID09PSAzID8gdGFyZ2V0LnBhcmVudE5vZGUgOiB0YXJnZXQ7Cit9CisKK21vZHVsZS5l eHBvcnRzID0gZ2V0RXZlbnRUYXJnZXQ7Cit9LHt9XSwxMTU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9k dWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywg SW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlz IGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJ Q0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4g YWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhl IFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3Ry aWN0JzsKKwordmFyIFJlYWN0Tm9kZVR5cGVzID0gX2RlcmVxXyg2OSk7CisKK2Z1bmN0aW9uIGdl dEhvc3RDb21wb25lbnRGcm9tQ29tcG9zaXRlKGluc3QpIHsKKyAgdmFyIHR5cGU7CisKKyAgd2hp bGUgKCh0eXBlID0gaW5zdC5fcmVuZGVyZWROb2RlVHlwZSkgPT09IFJlYWN0Tm9kZVR5cGVzLkNP TVBPU0lURSkgeworICAgIGluc3QgPSBpbnN0Ll9yZW5kZXJlZENvbXBvbmVudDsKKyAgfQorCisg IGlmICh0eXBlID09PSBSZWFjdE5vZGVUeXBlcy5IT1NUKSB7CisgICAgcmV0dXJuIGluc3QuX3Jl bmRlcmVkQ29tcG9uZW50OworICB9IGVsc2UgaWYgKHR5cGUgPT09IFJlYWN0Tm9kZVR5cGVzLkVN UFRZKSB7CisgICAgcmV0dXJuIG51bGw7CisgIH0KK30KKworbW9kdWxlLmV4cG9ydHMgPSBnZXRI b3N0Q29tcG9uZW50RnJvbUNvbXBvc2l0ZTsKK30seyI2OSI6Njl9XSwxMTY6W2Z1bmN0aW9uKF9k ZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBG YWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJj ZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0 aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2Ug dHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91 bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogCisg Ki8KKworJ3VzZSBzdHJpY3QnOworCisvKiBnbG9iYWwgU3ltYm9sICovCisKK3ZhciBJVEVSQVRP Ul9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5pdGVyYXRv cjsKK3ZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJzsgLy8gQmVmb3JlIFN5 bWJvbCBzcGVjLgorCisvKioKKyAqIFJldHVybnMgdGhlIGl0ZXJhdG9yIG1ldGhvZCBmdW5jdGlv biBjb250YWluZWQgb24gdGhlIGl0ZXJhYmxlIG9iamVjdC4KKyAqCisgKiBCZSBzdXJlIHRvIGlu dm9rZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgaXRlcmFibGUgYXMgY29udGV4dDoKKyAqCisgKiAg ICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG15SXRlcmFibGUpOworICogICAgIGlm IChpdGVyYXRvckZuKSB7CisgKiAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwo bXlJdGVyYWJsZSk7CisgKiAgICAgICAuLi4KKyAqICAgICB9CisgKgorICogQHBhcmFtIHs/b2Jq ZWN0fSBtYXliZUl0ZXJhYmxlCisgKiBAcmV0dXJuIHs/ZnVuY3Rpb259CisgKi8KK2Z1bmN0aW9u IGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkgeworICB2YXIgaXRlcmF0b3JGbiA9IG1heWJl SXRlcmFibGUgJiYgKElURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW0lURVJBVE9SX1NZ TUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF0pOworICBpZiAodHlw ZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHsKKyAgICByZXR1cm4gaXRlcmF0b3JGbjsK KyAgfQorfQorCittb2R1bGUuZXhwb3J0cyA9IGdldEl0ZXJhdG9yRm47Cit9LHt9XSwxMTc6W2Z1 bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1w cmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBU aGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBm b3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhp cyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBj YW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisg KgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgbmV4dERlYnVnSUQgPSAxOworCitm dW5jdGlvbiBnZXROZXh0RGVidWdJRCgpIHsKKyAgcmV0dXJuIG5leHREZWJ1Z0lEKys7Cit9CisK K21vZHVsZS5leHBvcnRzID0gZ2V0TmV4dERlYnVnSUQ7Cit9LHt9XSwxMTg6W2Z1bmN0aW9uKF9k ZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBG YWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJj ZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0 aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2Ug dHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91 bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisK Kyd1c2Ugc3RyaWN0JzsKKworLyoqCisgKiBHaXZlbiBhbnkgbm9kZSByZXR1cm4gdGhlIGZpcnN0 IGxlYWYgbm9kZSB3aXRob3V0IGNoaWxkcmVuLgorICoKKyAqIEBwYXJhbSB7RE9NRWxlbWVudHxE T01UZXh0Tm9kZX0gbm9kZQorICogQHJldHVybiB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0KKyAq LworCitmdW5jdGlvbiBnZXRMZWFmTm9kZShub2RlKSB7CisgIHdoaWxlIChub2RlICYmIG5vZGUu Zmlyc3RDaGlsZCkgeworICAgIG5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7CisgIH0KKyAgcmV0dXJu IG5vZGU7Cit9CisKKy8qKgorICogR2V0IHRoZSBuZXh0IHNpYmxpbmcgd2l0aGluIGEgY29udGFp bmVyLiBUaGlzIHdpbGwgd2FsayB1cCB0aGUKKyAqIERPTSBpZiBhIG5vZGUncyBzaWJsaW5ncyBo YXZlIGJlZW4gZXhoYXVzdGVkLgorICoKKyAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9k ZX0gbm9kZQorICogQHJldHVybiB7P0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9CisgKi8KK2Z1bmN0 aW9uIGdldFNpYmxpbmdOb2RlKG5vZGUpIHsKKyAgd2hpbGUgKG5vZGUpIHsKKyAgICBpZiAobm9k ZS5uZXh0U2libGluZykgeworICAgICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7CisgICAgfQor ICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7CisgIH0KK30KKworLyoqCisgKiBHZXQgb2JqZWN0 IGRlc2NyaWJpbmcgdGhlIG5vZGVzIHdoaWNoIGNvbnRhaW4gY2hhcmFjdGVycyBhdCBvZmZzZXQu CisgKgorICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSByb290CisgKiBAcGFyYW0g e251bWJlcn0gb2Zmc2V0CisgKiBAcmV0dXJuIHs/b2JqZWN0fQorICovCitmdW5jdGlvbiBnZXRO b2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KHJvb3QsIG9mZnNldCkgeworICB2YXIgbm9kZSA9IGdldExl YWZOb2RlKHJvb3QpOworICB2YXIgbm9kZVN0YXJ0ID0gMDsKKyAgdmFyIG5vZGVFbmQgPSAwOwor CisgIHdoaWxlIChub2RlKSB7CisgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHsKKyAgICAg IG5vZGVFbmQgPSBub2RlU3RhcnQgKyBub2RlLnRleHRDb250ZW50Lmxlbmd0aDsKKworICAgICAg aWYgKG5vZGVTdGFydCA8PSBvZmZzZXQgJiYgbm9kZUVuZCA+PSBvZmZzZXQpIHsKKyAgICAgICAg cmV0dXJuIHsKKyAgICAgICAgICBub2RlOiBub2RlLAorICAgICAgICAgIG9mZnNldDogb2Zmc2V0 IC0gbm9kZVN0YXJ0CisgICAgICAgIH07CisgICAgICB9CisKKyAgICAgIG5vZGVTdGFydCA9IG5v ZGVFbmQ7CisgICAgfQorCisgICAgbm9kZSA9IGdldExlYWZOb2RlKGdldFNpYmxpbmdOb2RlKG5v ZGUpKTsKKyAgfQorfQorCittb2R1bGUuZXhwb3J0cyA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZz ZXQ7Cit9LHt9XSwxMTk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisg KiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyBy ZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBC U0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9v dCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICog b2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUg c2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIEV4ZWN1dGlv bkVudmlyb25tZW50ID0gX2RlcmVxXygxMzYpOworCit2YXIgY29udGVudEtleSA9IG51bGw7CisK Ky8qKgorICogR2V0cyB0aGUga2V5IHVzZWQgdG8gYWNjZXNzIHRleHQgY29udGVudCBvbiBhIERP TSBub2RlLgorICoKKyAqIEByZXR1cm4gez9zdHJpbmd9IEtleSB1c2VkIHRvIGFjY2VzcyB0ZXh0 IGNvbnRlbnQuCisgKiBAaW50ZXJuYWwKKyAqLworZnVuY3Rpb24gZ2V0VGV4dENvbnRlbnRBY2Nl c3NvcigpIHsKKyAgaWYgKCFjb250ZW50S2V5ICYmIEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVz ZURPTSkgeworICAgIC8vIFByZWZlciB0ZXh0Q29udGVudCB0byBpbm5lclRleHQgYmVjYXVzZSBt YW55IGJyb3dzZXJzIHN1cHBvcnQgYm90aCBidXQKKyAgICAvLyBTVkcgPHRleHQ+IGVsZW1lbnRz IGRvbid0IHN1cHBvcnQgaW5uZXJUZXh0IGV2ZW4gd2hlbiA8ZGl2PiBkb2VzLgorICAgIGNvbnRl bnRLZXkgPSAndGV4dENvbnRlbnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCA/ICd0ZXh0 Q29udGVudCcgOiAnaW5uZXJUZXh0JzsKKyAgfQorICByZXR1cm4gY29udGVudEtleTsKK30KKwor bW9kdWxlLmV4cG9ydHMgPSBnZXRUZXh0Q29udGVudEFjY2Vzc29yOworfSx7IjEzNiI6MTM2fV0s MTIwOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0 IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg KgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxp Y2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5 IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCBy aWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0 b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBFeGVjdXRpb25FbnZpcm9ubWVu dCA9IF9kZXJlcV8oMTM2KTsKKworLyoqCisgKiBHZW5lcmF0ZSBhIG1hcHBpbmcgb2Ygc3RhbmRh cmQgdmVuZG9yIHByZWZpeGVzIHVzaW5nIHRoZSBkZWZpbmVkIHN0eWxlIHByb3BlcnR5IGFuZCBl dmVudCBuYW1lLgorICoKKyAqIEBwYXJhbSB7c3RyaW5nfSBzdHlsZVByb3AKKyAqIEBwYXJhbSB7 c3RyaW5nfSBldmVudE5hbWUKKyAqIEByZXR1cm5zIHtvYmplY3R9CisgKi8KK2Z1bmN0aW9uIG1h a2VQcmVmaXhNYXAoc3R5bGVQcm9wLCBldmVudE5hbWUpIHsKKyAgdmFyIHByZWZpeGVzID0ge307 CisKKyAgcHJlZml4ZXNbc3R5bGVQcm9wLnRvTG93ZXJDYXNlKCldID0gZXZlbnROYW1lLnRvTG93 ZXJDYXNlKCk7CisgIHByZWZpeGVzWydXZWJraXQnICsgc3R5bGVQcm9wXSA9ICd3ZWJraXQnICsg ZXZlbnROYW1lOworICBwcmVmaXhlc1snTW96JyArIHN0eWxlUHJvcF0gPSAnbW96JyArIGV2ZW50 TmFtZTsKKyAgcHJlZml4ZXNbJ21zJyArIHN0eWxlUHJvcF0gPSAnTVMnICsgZXZlbnROYW1lOwor ICBwcmVmaXhlc1snTycgKyBzdHlsZVByb3BdID0gJ28nICsgZXZlbnROYW1lLnRvTG93ZXJDYXNl KCk7CisKKyAgcmV0dXJuIHByZWZpeGVzOworfQorCisvKioKKyAqIEEgbGlzdCBvZiBldmVudCBu YW1lcyB0byBhIGNvbmZpZ3VyYWJsZSBsaXN0IG9mIHZlbmRvciBwcmVmaXhlcy4KKyAqLwordmFy IHZlbmRvclByZWZpeGVzID0geworICBhbmltYXRpb25lbmQ6IG1ha2VQcmVmaXhNYXAoJ0FuaW1h dGlvbicsICdBbmltYXRpb25FbmQnKSwKKyAgYW5pbWF0aW9uaXRlcmF0aW9uOiBtYWtlUHJlZml4 TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uSXRlcmF0aW9uJyksCisgIGFuaW1hdGlvbnN0YXJ0 OiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uU3RhcnQnKSwKKyAgdHJhbnNp dGlvbmVuZDogbWFrZVByZWZpeE1hcCgnVHJhbnNpdGlvbicsICdUcmFuc2l0aW9uRW5kJykKK307 CisKKy8qKgorICogRXZlbnQgbmFtZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBkZXRlY3RlZCBh bmQgcHJlZml4ZWQgKGlmIGFwcGxpY2FibGUpLgorICovCit2YXIgcHJlZml4ZWRFdmVudE5hbWVz ID0ge307CisKKy8qKgorICogRWxlbWVudCB0byBjaGVjayBmb3IgcHJlZml4ZXMgb24uCisgKi8K K3ZhciBzdHlsZSA9IHt9OworCisvKioKKyAqIEJvb3RzdHJhcCBpZiBhIERPTSBleGlzdHMuCisg Ki8KK2lmIChFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00pIHsKKyAgc3R5bGUgPSBkb2N1 bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5zdHlsZTsKKworICAvLyBPbiBzb21lIHBsYXRmb3Jt cywgaW4gcGFydGljdWxhciBzb21lIHJlbGVhc2VzIG9mIEFuZHJvaWQgNC54LAorICAvLyB0aGUg dW4tcHJlZml4ZWQgImFuaW1hdGlvbiIgYW5kICJ0cmFuc2l0aW9uIiBwcm9wZXJ0aWVzIGFyZSBk ZWZpbmVkIG9uIHRoZQorICAvLyBzdHlsZSBvYmplY3QgYnV0IHRoZSBldmVudHMgdGhhdCBmaXJl IHdpbGwgc3RpbGwgYmUgcHJlZml4ZWQsIHNvIHdlIG5lZWQKKyAgLy8gdG8gY2hlY2sgaWYgdGhl IHVuLXByZWZpeGVkIGV2ZW50cyBhcmUgdXNhYmxlLCBhbmQgaWYgbm90IHJlbW92ZSB0aGVtIGZy b20gdGhlIG1hcC4KKyAgaWYgKCEoJ0FuaW1hdGlvbkV2ZW50JyBpbiB3aW5kb3cpKSB7CisgICAg ZGVsZXRlIHZlbmRvclByZWZpeGVzLmFuaW1hdGlvbmVuZC5hbmltYXRpb247CisgICAgZGVsZXRl IHZlbmRvclByZWZpeGVzLmFuaW1hdGlvbml0ZXJhdGlvbi5hbmltYXRpb247CisgICAgZGVsZXRl IHZlbmRvclByZWZpeGVzLmFuaW1hdGlvbnN0YXJ0LmFuaW1hdGlvbjsKKyAgfQorCisgIC8vIFNh bWUgYXMgYWJvdmUKKyAgaWYgKCEoJ1RyYW5zaXRpb25FdmVudCcgaW4gd2luZG93KSkgeworICAg IGRlbGV0ZSB2ZW5kb3JQcmVmaXhlcy50cmFuc2l0aW9uZW5kLnRyYW5zaXRpb247CisgIH0KK30K KworLyoqCisgKiBBdHRlbXB0cyB0byBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgdmVuZG9yIHByZWZp eGVkIGV2ZW50IG5hbWUuCisgKgorICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZQorICogQHJl dHVybnMge3N0cmluZ30KKyAqLworZnVuY3Rpb24gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUo ZXZlbnROYW1lKSB7CisgIGlmIChwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXSkgeworICAg IHJldHVybiBwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXTsKKyAgfSBlbHNlIGlmICghdmVu ZG9yUHJlZml4ZXNbZXZlbnROYW1lXSkgeworICAgIHJldHVybiBldmVudE5hbWU7CisgIH0KKwor ICB2YXIgcHJlZml4TWFwID0gdmVuZG9yUHJlZml4ZXNbZXZlbnROYW1lXTsKKworICBmb3IgKHZh ciBzdHlsZVByb3AgaW4gcHJlZml4TWFwKSB7CisgICAgaWYgKHByZWZpeE1hcC5oYXNPd25Qcm9w ZXJ0eShzdHlsZVByb3ApICYmIHN0eWxlUHJvcCBpbiBzdHlsZSkgeworICAgICAgcmV0dXJuIHBy ZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdID0gcHJlZml4TWFwW3N0eWxlUHJvcF07CisgICAg fQorICB9CisKKyAgcmV0dXJuICcnOworfQorCittb2R1bGUuZXhwb3J0cyA9IGdldFZlbmRvclBy ZWZpeGVkRXZlbnROYW1lOworfSx7IjEzNiI6MTM2fV0sMTIxOltmdW5jdGlvbihfZGVyZXFfLG1v ZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ss IEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBp cyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBM SUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFu IGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRo ZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0 cmljdCc7CisKK3ZhciBfcHJvZEludmFyaWFudCA9IF9kZXJlcV8oMTI1KSwKKyAgICBfYXNzaWdu ID0gX2RlcmVxXygxNTgpOworCit2YXIgUmVhY3RDb21wb3NpdGVDb21wb25lbnQgPSBfZGVyZXFf KDMwKTsKK3ZhciBSZWFjdEVtcHR5Q29tcG9uZW50ID0gX2RlcmVxXyg1NCk7Cit2YXIgUmVhY3RI b3N0Q29tcG9uZW50ID0gX2RlcmVxXyg1OSk7CisKK3ZhciBnZXROZXh0RGVidWdJRCA9IF9kZXJl cV8oMTE3KTsKK3ZhciBpbnZhcmlhbnQgPSBfZGVyZXFfKDE1MCk7Cit2YXIgd2FybmluZyA9IF9k ZXJlcV8oMTU3KTsKKworLy8gVG8gYXZvaWQgYSBjeWNsaWMgZGVwZW5kZW5jeSwgd2UgY3JlYXRl IHRoZSBmaW5hbCBjbGFzcyBpbiB0aGlzIG1vZHVsZQordmFyIFJlYWN0Q29tcG9zaXRlQ29tcG9u ZW50V3JhcHBlciA9IGZ1bmN0aW9uIChlbGVtZW50KSB7CisgIHRoaXMuY29uc3RydWN0KGVsZW1l bnQpOworfTsKK19hc3NpZ24oUmVhY3RDb21wb3NpdGVDb21wb25lbnRXcmFwcGVyLnByb3RvdHlw ZSwgUmVhY3RDb21wb3NpdGVDb21wb25lbnQsIHsKKyAgX2luc3RhbnRpYXRlUmVhY3RDb21wb25l bnQ6IGluc3RhbnRpYXRlUmVhY3RDb21wb25lbnQKK30pOworCitmdW5jdGlvbiBnZXREZWNsYXJh dGlvbkVycm9yQWRkZW5kdW0ob3duZXIpIHsKKyAgaWYgKG93bmVyKSB7CisgICAgdmFyIG5hbWUg PSBvd25lci5nZXROYW1lKCk7CisgICAgaWYgKG5hbWUpIHsKKyAgICAgIHJldHVybiAnIENoZWNr IHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7CisgICAgfQorICB9CisgIHJl dHVybiAnJzsKK30KKworLyoqCisgKiBDaGVjayBpZiB0aGUgdHlwZSByZWZlcmVuY2UgaXMgYSBr bm93biBpbnRlcm5hbCB0eXBlLiBJLmUuIG5vdCBhIHVzZXIKKyAqIHByb3ZpZGVkIGNvbXBvc2l0 ZSB0eXBlLgorICoKKyAqIEBwYXJhbSB7ZnVuY3Rpb259IHR5cGUKKyAqIEByZXR1cm4ge2Jvb2xl YW59IFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgdmFsaWQgaW50ZXJuYWwgdHlwZS4KKyAqLwor ZnVuY3Rpb24gaXNJbnRlcm5hbENvbXBvbmVudFR5cGUodHlwZSkgeworICByZXR1cm4gdHlwZW9m IHR5cGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHR5cGUucHJvdG90eXBlICE9PSAndW5kZWZp bmVkJyAmJiB0eXBlb2YgdHlwZS5wcm90b3R5cGUubW91bnRDb21wb25lbnQgPT09ICdmdW5jdGlv bicgJiYgdHlwZW9mIHR5cGUucHJvdG90eXBlLnJlY2VpdmVDb21wb25lbnQgPT09ICdmdW5jdGlv bic7Cit9CisKKy8qKgorICogR2l2ZW4gYSBSZWFjdE5vZGUsIGNyZWF0ZSBhbiBpbnN0YW5jZSB0 aGF0IHdpbGwgYWN0dWFsbHkgYmUgbW91bnRlZC4KKyAqCisgKiBAcGFyYW0ge1JlYWN0Tm9kZX0g bm9kZQorICogQHBhcmFtIHtib29sZWFufSBzaG91bGRIYXZlRGVidWdJRAorICogQHJldHVybiB7 b2JqZWN0fSBBIG5ldyBpbnN0YW5jZSBvZiB0aGUgZWxlbWVudCdzIGNvbnN0cnVjdG9yLgorICog QHByb3RlY3RlZAorICovCitmdW5jdGlvbiBpbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50KG5vZGUs IHNob3VsZEhhdmVEZWJ1Z0lEKSB7CisgIHZhciBpbnN0YW5jZTsKKworICBpZiAobm9kZSA9PT0g bnVsbCB8fCBub2RlID09PSBmYWxzZSkgeworICAgIGluc3RhbmNlID0gUmVhY3RFbXB0eUNvbXBv bmVudC5jcmVhdGUoaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudCk7CisgIH0gZWxzZSBpZiAodHlw ZW9mIG5vZGUgPT09ICdvYmplY3QnKSB7CisgICAgdmFyIGVsZW1lbnQgPSBub2RlOworICAgIHZh ciB0eXBlID0gZWxlbWVudC50eXBlOworICAgIGlmICh0eXBlb2YgdHlwZSAhPT0gJ2Z1bmN0aW9u JyAmJiB0eXBlb2YgdHlwZSAhPT0gJ3N0cmluZycpIHsKKyAgICAgIHZhciBpbmZvID0gJyc7Cisg ICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAgIGlmICh0 eXBlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09 IG51bGwgJiYgT2JqZWN0LmtleXModHlwZSkubGVuZ3RoID09PSAwKSB7CisgICAgICAgICAgaW5m byArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRo ZSBmaWxlICcgKyAnaXRcJ3MgZGVmaW5lZCBpbi4nOworICAgICAgICB9CisgICAgICB9CisgICAg ICBpbmZvICs9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShlbGVtZW50Ll9vd25lcik7Cisg ICAgICAhZmFsc2UgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQo ZmFsc2UsICdFbGVtZW50IHR5cGUgaXMgaW52YWxpZDogZXhwZWN0ZWQgYSBzdHJpbmcgKGZvciBi dWlsdC1pbiBjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlIGNv bXBvbmVudHMpIGJ1dCBnb3Q6ICVzLiVzJywgdHlwZSA9PSBudWxsID8gdHlwZSA6IHR5cGVvZiB0 eXBlLCBpbmZvKSA6IF9wcm9kSW52YXJpYW50KCcxMzAnLCB0eXBlID09IG51bGwgPyB0eXBlIDog dHlwZW9mIHR5cGUsIGluZm8pIDogdm9pZCAwOworICAgIH0KKworICAgIC8vIFNwZWNpYWwgY2Fz ZSBzdHJpbmcgdmFsdWVzCisgICAgaWYgKHR5cGVvZiBlbGVtZW50LnR5cGUgPT09ICdzdHJpbmcn KSB7CisgICAgICBpbnN0YW5jZSA9IFJlYWN0SG9zdENvbXBvbmVudC5jcmVhdGVJbnRlcm5hbENv bXBvbmVudChlbGVtZW50KTsKKyAgICB9IGVsc2UgaWYgKGlzSW50ZXJuYWxDb21wb25lbnRUeXBl KGVsZW1lbnQudHlwZSkpIHsKKyAgICAgIC8vIFRoaXMgaXMgdGVtcG9yYXJpbHkgYXZhaWxhYmxl IGZvciBjdXN0b20gY29tcG9uZW50cyB0aGF0IGFyZSBub3Qgc3RyaW5nCisgICAgICAvLyByZXBy ZXNlbnRhdGlvbnMuIEkuZS4gQVJULiBPbmNlIHRob3NlIGFyZSB1cGRhdGVkIHRvIHVzZSB0aGUg c3RyaW5nCisgICAgICAvLyByZXByZXNlbnRhdGlvbiwgd2UgY2FuIGRyb3AgdGhpcyBjb2RlIHBh dGguCisgICAgICBpbnN0YW5jZSA9IG5ldyBlbGVtZW50LnR5cGUoZWxlbWVudCk7CisKKyAgICAg IC8vIFdlIHJlbmFtZWQgdGhpcy4gQWxsb3cgdGhlIG9sZCBuYW1lIGZvciBjb21wYXQuIDooCisg ICAgICBpZiAoIWluc3RhbmNlLmdldEhvc3ROb2RlKSB7CisgICAgICAgIGluc3RhbmNlLmdldEhv c3ROb2RlID0gaW5zdGFuY2UuZ2V0TmF0aXZlTm9kZTsKKyAgICAgIH0KKyAgICB9IGVsc2Ugewor ICAgICAgaW5zdGFuY2UgPSBuZXcgUmVhY3RDb21wb3NpdGVDb21wb25lbnRXcmFwcGVyKGVsZW1l bnQpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlb2Ygbm9kZSA9PT0gJ3N0cmluZycgfHwgdHlw ZW9mIG5vZGUgPT09ICdudW1iZXInKSB7CisgICAgaW5zdGFuY2UgPSBSZWFjdEhvc3RDb21wb25l bnQuY3JlYXRlSW5zdGFuY2VGb3JUZXh0KG5vZGUpOworICB9IGVsc2UgeworICAgICFmYWxzZSA/ ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0VuY291 bnRlcmVkIGludmFsaWQgUmVhY3Qgbm9kZSBvZiB0eXBlICVzJywgdHlwZW9mIG5vZGUpIDogX3By b2RJbnZhcmlhbnQoJzEzMScsIHR5cGVvZiBub2RlKSA6IHZvaWQgMDsKKyAgfQorCisgIGlmICgi ZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAiZGV2ZWxvcG1lbnQiICE9PSAn cHJvZHVjdGlvbicgPyB3YXJuaW5nKHR5cGVvZiBpbnN0YW5jZS5tb3VudENvbXBvbmVudCA9PT0g J2Z1bmN0aW9uJyAmJiB0eXBlb2YgaW5zdGFuY2UucmVjZWl2ZUNvbXBvbmVudCA9PT0gJ2Z1bmN0 aW9uJyAmJiB0eXBlb2YgaW5zdGFuY2UuZ2V0SG9zdE5vZGUgPT09ICdmdW5jdGlvbicgJiYgdHlw ZW9mIGluc3RhbmNlLnVubW91bnRDb21wb25lbnQgPT09ICdmdW5jdGlvbicsICdPbmx5IFJlYWN0 IENvbXBvbmVudHMgY2FuIGJlIG1vdW50ZWQuJykgOiB2b2lkIDA7CisgIH0KKworICAvLyBUaGVz ZSB0d28gZmllbGRzIGFyZSB1c2VkIGJ5IHRoZSBET00gYW5kIEFSVCBkaWZmaW5nIGFsZ29yaXRo bXMKKyAgLy8gcmVzcGVjdGl2ZWx5LiBJbnN0ZWFkIG9mIHVzaW5nIGV4cGFuZG9zIG9uIGNvbXBv bmVudHMsIHdlIHNob3VsZCBiZQorICAvLyBzdG9yaW5nIHRoZSBzdGF0ZSBuZWVkZWQgYnkgdGhl IGRpZmZpbmcgYWxnb3JpdGhtcyBlbHNld2hlcmUuCisgIGluc3RhbmNlLl9tb3VudEluZGV4ID0g MDsKKyAgaW5zdGFuY2UuX21vdW50SW1hZ2UgPSBudWxsOworCisgIGlmICgiZGV2ZWxvcG1lbnQi ICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICBpbnN0YW5jZS5fZGVidWdJRCA9IHNob3VsZEhhdmVE ZWJ1Z0lEID8gZ2V0TmV4dERlYnVnSUQoKSA6IDA7CisgIH0KKworICAvLyBJbnRlcm5hbCBpbnN0 YW5jZXMgc2hvdWxkIGZ1bGx5IGNvbnN0cnVjdGVkIGF0IHRoaXMgcG9pbnQsIHNvIHRoZXkgc2hv dWxkCisgIC8vIG5vdCBnZXQgYW55IG5ldyBmaWVsZHMgYWRkZWQgdG8gdGhlbSBhdCB0aGlzIHBv aW50LgorICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgaWYgKE9i amVjdC5wcmV2ZW50RXh0ZW5zaW9ucykgeworICAgICAgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25z KGluc3RhbmNlKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gaW5zdGFuY2U7Cit9CisKK21vZHVs ZS5leHBvcnRzID0gaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudDsKK30seyIxMTciOjExNywiMTI1 IjoxMjUsIjE1MCI6MTUwLCIxNTciOjE1NywiMTU4IjoxNTgsIjMwIjozMCwiNTQiOjU0LCI1OSI6 NTl9XSwxMjI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5 cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZl ZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5 bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJl Y3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0 ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBk aXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIEV4ZWN1dGlvbkVudmly b25tZW50ID0gX2RlcmVxXygxMzYpOworCit2YXIgdXNlSGFzRmVhdHVyZTsKK2lmIChFeGVjdXRp b25FbnZpcm9ubWVudC5jYW5Vc2VET00pIHsKKyAgdXNlSGFzRmVhdHVyZSA9IGRvY3VtZW50Lmlt cGxlbWVudGF0aW9uICYmIGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUgJiYKKyAg Ly8gYWx3YXlzIHJldHVybnMgdHJ1ZSBpbiBuZXdlciBicm93c2VycyBhcyBwZXIgdGhlIHN0YW5k YXJkLgorICAvLyBAc2VlIGh0dHA6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tZG9taW1wbGVt ZW50YXRpb24taGFzZmVhdHVyZQorICBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJl KCcnLCAnJykgIT09IHRydWU7Cit9CisKKy8qKgorICogQ2hlY2tzIGlmIGFuIGV2ZW50IGlzIHN1 cHBvcnRlZCBpbiB0aGUgY3VycmVudCBleGVjdXRpb24gZW52aXJvbm1lbnQuCisgKgorICogTk9U RTogVGhpcyB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseSBmb3Igbm9uLWdlbmVyaWMgZXZlbnRzIHN1 Y2ggYXMgYGNoYW5nZWAsCisgKiBgcmVzZXRgLCBgbG9hZGAsIGBlcnJvcmAsIGFuZCBgc2VsZWN0 YC4KKyAqCisgKiBCb3Jyb3dzIGZyb20gTW9kZXJuaXpyLgorICoKKyAqIEBwYXJhbSB7c3RyaW5n fSBldmVudE5hbWVTdWZmaXggRXZlbnQgbmFtZSwgZS5nLiAiY2xpY2siLgorICogQHBhcmFtIHs/ Ym9vbGVhbn0gY2FwdHVyZSBDaGVjayBpZiB0aGUgY2FwdHVyZSBwaGFzZSBpcyBzdXBwb3J0ZWQu CisgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBldmVudCBpcyBzdXBwb3J0ZWQuCisg KiBAaW50ZXJuYWwKKyAqIEBsaWNlbnNlIE1vZGVybml6ciAzLjAuMHByZSAoQ3VzdG9tIEJ1aWxk KSB8IE1JVAorICovCitmdW5jdGlvbiBpc0V2ZW50U3VwcG9ydGVkKGV2ZW50TmFtZVN1ZmZpeCwg Y2FwdHVyZSkgeworICBpZiAoIUV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSB8fCBjYXB0 dXJlICYmICEoJ2FkZEV2ZW50TGlzdGVuZXInIGluIGRvY3VtZW50KSkgeworICAgIHJldHVybiBm YWxzZTsKKyAgfQorCisgIHZhciBldmVudE5hbWUgPSAnb24nICsgZXZlbnROYW1lU3VmZml4Owor ICB2YXIgaXNTdXBwb3J0ZWQgPSBldmVudE5hbWUgaW4gZG9jdW1lbnQ7CisKKyAgaWYgKCFpc1N1 cHBvcnRlZCkgeworICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2 Jyk7CisgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoZXZlbnROYW1lLCAncmV0dXJuOycpOworICAg IGlzU3VwcG9ydGVkID0gdHlwZW9mIGVsZW1lbnRbZXZlbnROYW1lXSA9PT0gJ2Z1bmN0aW9uJzsK KyAgfQorCisgIGlmICghaXNTdXBwb3J0ZWQgJiYgdXNlSGFzRmVhdHVyZSAmJiBldmVudE5hbWVT dWZmaXggPT09ICd3aGVlbCcpIHsKKyAgICAvLyBUaGlzIGlzIHRoZSBvbmx5IHdheSB0byB0ZXN0 IHN1cHBvcnQgZm9yIHRoZSBgd2hlZWxgIGV2ZW50IGluIElFOSsuCisgICAgaXNTdXBwb3J0ZWQg PSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCdFdmVudHMud2hlZWwnLCAnMy4w Jyk7CisgIH0KKworICByZXR1cm4gaXNTdXBwb3J0ZWQ7Cit9CisKK21vZHVsZS5leHBvcnRzID0g aXNFdmVudFN1cHBvcnRlZDsKK30seyIxMzYiOjEzNn1dLDEyMzpbZnVuY3Rpb24oX2RlcmVxXyxt b2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29r LCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUg aXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICog TElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBB biBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0 aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisn dXNlIHN0cmljdCc7CisKKy8qKgorICogQHNlZSBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mv d2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS90aGUtaW5wdXQtZWxlbWVudC5odG1sI2lu cHV0LXR5cGUtYXR0ci1zdW1tYXJ5CisgKi8KKwordmFyIHN1cHBvcnRlZElucHV0VHlwZXMgPSB7 CisgICdjb2xvcic6IHRydWUsCisgICdkYXRlJzogdHJ1ZSwKKyAgJ2RhdGV0aW1lJzogdHJ1ZSwK KyAgJ2RhdGV0aW1lLWxvY2FsJzogdHJ1ZSwKKyAgJ2VtYWlsJzogdHJ1ZSwKKyAgJ21vbnRoJzog dHJ1ZSwKKyAgJ251bWJlcic6IHRydWUsCisgICdwYXNzd29yZCc6IHRydWUsCisgICdyYW5nZSc6 IHRydWUsCisgICdzZWFyY2gnOiB0cnVlLAorICAndGVsJzogdHJ1ZSwKKyAgJ3RleHQnOiB0cnVl LAorICAndGltZSc6IHRydWUsCisgICd1cmwnOiB0cnVlLAorICAnd2Vlayc6IHRydWUKK307CisK K2Z1bmN0aW9uIGlzVGV4dElucHV0RWxlbWVudChlbGVtKSB7CisgIHZhciBub2RlTmFtZSA9IGVs ZW0gJiYgZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CisKKyAg aWYgKG5vZGVOYW1lID09PSAnaW5wdXQnKSB7CisgICAgcmV0dXJuICEhc3VwcG9ydGVkSW5wdXRU eXBlc1tlbGVtLnR5cGVdOworICB9CisKKyAgaWYgKG5vZGVOYW1lID09PSAndGV4dGFyZWEnKSB7 CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK21vZHVsZS5l eHBvcnRzID0gaXNUZXh0SW5wdXRFbGVtZW50OworfSx7fV0sMTI0OltmdW5jdGlvbihfZGVyZXFf LG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJv b2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29k ZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisg KiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUu IEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGlu IHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNl IHN0cmljdCc7CisKK3ZhciBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIgPSBfZGVyZXFfKDEw Nyk7CisKKy8qKgorICogRXNjYXBlcyBhdHRyaWJ1dGUgdmFsdWUgdG8gcHJldmVudCBzY3JpcHRp bmcgYXR0YWNrcy4KKyAqCisgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIGVzY2FwZS4KKyAq IEByZXR1cm4ge3N0cmluZ30gQW4gZXNjYXBlZCBzdHJpbmcuCisgKi8KK2Z1bmN0aW9uIHF1b3Rl QXR0cmlidXRlVmFsdWVGb3JCcm93c2VyKHZhbHVlKSB7CisgIHJldHVybiAnIicgKyBlc2NhcGVU ZXh0Q29udGVudEZvckJyb3dzZXIodmFsdWUpICsgJyInOworfQorCittb2R1bGUuZXhwb3J0cyA9 IHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyOworfSx7IjEwNyI6MTA3fV0sMTI1OltmdW5j dGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEz LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq IFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNl IGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0 aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRz IGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4K KyAqCisgKiAKKyAqLworJ3VzZSBzdHJpY3QnOworCisvKioKKyAqIFdBUk5JTkc6IERPIE5PVCBt YW51YWxseSByZXF1aXJlIHRoaXMgbW9kdWxlLgorICogVGhpcyBpcyBhIHJlcGxhY2VtZW50IGZv ciBgaW52YXJpYW50KC4uLilgIHVzZWQgYnkgdGhlIGVycm9yIGNvZGUgc3lzdGVtCisgKiBhbmQg d2lsbCBfb25seV8gYmUgcmVxdWlyZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgYmFiZWwgcGFzcy4K KyAqIEl0IGFsd2F5cyB0aHJvd3MuCisgKi8KKworZnVuY3Rpb24gcmVhY3RQcm9kSW52YXJpYW50 KGNvZGUpIHsKKyAgdmFyIGFyZ0NvdW50ID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7CisKKyAgdmFy IG1lc3NhZ2UgPSAnTWluaWZpZWQgUmVhY3QgZXJyb3IgIycgKyBjb2RlICsgJzsgdmlzaXQgJyAr ICdodHRwOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvZXJyb3ItZGVjb2Rlci5odG1s P2ludmFyaWFudD0nICsgY29kZTsKKworICBmb3IgKHZhciBhcmdJZHggPSAwOyBhcmdJZHggPCBh cmdDb3VudDsgYXJnSWR4KyspIHsKKyAgICBtZXNzYWdlICs9ICcmYXJnc1tdPScgKyBlbmNvZGVV UklDb21wb25lbnQoYXJndW1lbnRzW2FyZ0lkeCArIDFdKTsKKyAgfQorCisgIG1lc3NhZ2UgKz0g JyBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJv bm1lbnQnICsgJyBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5n cy4nOworCisgIHZhciBlcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKTsKKyAgZXJyb3IubmFtZSA9 ICdJbnZhcmlhbnQgVmlvbGF0aW9uJzsKKyAgZXJyb3IuZnJhbWVzVG9Qb3AgPSAxOyAvLyB3ZSBk b24ndCBjYXJlIGFib3V0IHJlYWN0UHJvZEludmFyaWFudCdzIG93biBmcmFtZQorCisgIHRocm93 IGVycm9yOworfQorCittb2R1bGUuZXhwb3J0cyA9IHJlYWN0UHJvZEludmFyaWFudDsKK30se31d LDEyNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdo dCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgor ICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBs aWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9y eSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQg cmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVj dG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgUmVhY3RNb3VudCA9IF9kZXJl cV8oNjcpOworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0TW91bnQucmVuZGVyU3VidHJlZUludG9D b250YWluZXI7Cit9LHsiNjciOjY3fV0sMTI3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBv cnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAq IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNl ZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZp bGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9u YWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRT IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisK K3ZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IF9kZXJlcV8oMTM2KTsKK3ZhciBET01OYW1lc3Bh Y2VzID0gX2RlcmVxXygxMCk7CisKK3ZhciBXSElURVNQQUNFX1RFU1QgPSAvXlsgXHJcblx0XGZd LzsKK3ZhciBOT05WSVNJQkxFX1RFU1QgPSAvPCghLS18bGlua3xub3NjcmlwdHxtZXRhfHNjcmlw dHxzdHlsZSlbIFxyXG5cdFxmXC8+XS87CisKK3ZhciBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2Nh bEZ1bmN0aW9uID0gX2RlcmVxXygxMDUpOworCisvLyBTVkcgdGVtcCBjb250YWluZXIgZm9yIElF IGxhY2tpbmcgaW5uZXJIVE1MCit2YXIgcmV1c2FibGVTVkdDb250YWluZXI7CisKKy8qKgorICog U2V0IHRoZSBpbm5lckhUTUwgcHJvcGVydHkgb2YgYSBub2RlLCBlbnN1cmluZyB0aGF0IHdoaXRl c3BhY2UgaXMgcHJlc2VydmVkCisgKiBldmVuIGluIElFOC4KKyAqCisgKiBAcGFyYW0ge0RPTUVs ZW1lbnR9IG5vZGUKKyAqIEBwYXJhbSB7c3RyaW5nfSBodG1sCisgKiBAaW50ZXJuYWwKKyAqLwor dmFyIHNldElubmVySFRNTCA9IGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24oZnVu Y3Rpb24gKG5vZGUsIGh0bWwpIHsKKyAgLy8gSUUgZG9lcyBub3QgaGF2ZSBpbm5lckhUTUwgZm9y IFNWRyBub2Rlcywgc28gaW5zdGVhZCB3ZSBpbmplY3QgdGhlCisgIC8vIG5ldyBtYXJrdXAgaW4g YSB0ZW1wIG5vZGUgYW5kIHRoZW4gbW92ZSB0aGUgY2hpbGQgbm9kZXMgYWNyb3NzIGludG8KKyAg Ly8gdGhlIHRhcmdldCBub2RlCisgIGlmIChub2RlLm5hbWVzcGFjZVVSSSA9PT0gRE9NTmFtZXNw YWNlcy5zdmcgJiYgISgnaW5uZXJIVE1MJyBpbiBub2RlKSkgeworICAgIHJldXNhYmxlU1ZHQ29u dGFpbmVyID0gcmV1c2FibGVTVkdDb250YWluZXIgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgn ZGl2Jyk7CisgICAgcmV1c2FibGVTVkdDb250YWluZXIuaW5uZXJIVE1MID0gJzxzdmc+JyArIGh0 bWwgKyAnPC9zdmc+JzsKKyAgICB2YXIgc3ZnTm9kZSA9IHJldXNhYmxlU1ZHQ29udGFpbmVyLmZp cnN0Q2hpbGQ7CisgICAgd2hpbGUgKHN2Z05vZGUuZmlyc3RDaGlsZCkgeworICAgICAgbm9kZS5h cHBlbmRDaGlsZChzdmdOb2RlLmZpcnN0Q2hpbGQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBu b2RlLmlubmVySFRNTCA9IGh0bWw7CisgIH0KK30pOworCitpZiAoRXhlY3V0aW9uRW52aXJvbm1l bnQuY2FuVXNlRE9NKSB7CisgIC8vIElFODogV2hlbiB1cGRhdGluZyBhIGp1c3QgY3JlYXRlZCBu b2RlIHdpdGggaW5uZXJIVE1MIG9ubHkgbGVhZGluZworICAvLyB3aGl0ZXNwYWNlIGlzIHJlbW92 ZWQuIFdoZW4gdXBkYXRpbmcgYW4gZXhpc3Rpbmcgbm9kZSB3aXRoIGlubmVySFRNTAorICAvLyB3 aGl0ZXNwYWNlIGluIHJvb3QgVGV4dE5vZGVzIGlzIGFsc28gY29sbGFwc2VkLgorICAvLyBAc2Vl IHF1aXJrc21vZGUub3JnL2J1Z3JlcG9ydHMvYXJjaGl2ZXMvMjAwNC8xMS9pbm5lcmh0bWxfYW5k X3QuaHRtbAorCisgIC8vIEZlYXR1cmUgZGV0ZWN0aW9uOyBvbmx5IElFOCBpcyBrbm93biB0byBi ZWhhdmUgaW1wcm9wZXJseSBsaWtlIHRoaXMuCisgIHZhciB0ZXN0RWxlbWVudCA9IGRvY3VtZW50 LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworICB0ZXN0RWxlbWVudC5pbm5lckhUTUwgPSAnICc7Cisg IGlmICh0ZXN0RWxlbWVudC5pbm5lckhUTUwgPT09ICcnKSB7CisgICAgc2V0SW5uZXJIVE1MID0g ZnVuY3Rpb24gKG5vZGUsIGh0bWwpIHsKKyAgICAgIC8vIE1hZ2ljIHRoZW9yeTogSUU4IHN1cHBv c2VkbHkgZGlmZmVyZW50aWF0ZXMgYmV0d2VlbiBhZGRlZCBhbmQgdXBkYXRlZAorICAgICAgLy8g bm9kZXMgd2hlbiBwcm9jZXNzaW5nIGlubmVySFRNTCwgaW5uZXJIVE1MIG9uIHVwZGF0ZWQgbm9k ZXMgc3VmZmVycworICAgICAgLy8gZnJvbSB3b3JzZSB3aGl0ZXNwYWNlIGJlaGF2aW9yLiBSZS1h ZGRpbmcgYSBub2RlIGxpa2UgdGhpcyB0cmlnZ2VycworICAgICAgLy8gdGhlIGluaXRpYWwgYW5k IG1vcmUgZmF2b3JhYmxlIHdoaXRlc3BhY2UgYmVoYXZpb3IuCisgICAgICAvLyBUT0RPOiBXaGF0 IHRvIGRvIG9uIGEgZGV0YWNoZWQgbm9kZT8KKyAgICAgIGlmIChub2RlLnBhcmVudE5vZGUpIHsK KyAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChub2RlLCBub2RlKTsKKyAgICAg IH0KKworICAgICAgLy8gV2UgYWxzbyBpbXBsZW1lbnQgYSB3b3JrYXJvdW5kIGZvciBub24tdmlz aWJsZSB0YWdzIGRpc2FwcGVhcmluZyBpbnRvCisgICAgICAvLyB0aGluIGFpciBvbiBJRTgsIHRo aXMgb25seSBoYXBwZW5zIGlmIHRoZXJlIGlzIG5vIHZpc2libGUgdGV4dAorICAgICAgLy8gaW4t ZnJvbnQgb2YgdGhlIG5vbi12aXNpYmxlIHRhZ3MuIFBpZ2d5YmFjayBvbiB0aGUgd2hpdGVzcGFj ZSBmaXgKKyAgICAgIC8vIGFuZCBzaW1wbHkgY2hlY2sgaWYgYW55IG5vbi12aXNpYmxlIHRhZ3Mg YXBwZWFyIGluIHRoZSBzb3VyY2UuCisgICAgICBpZiAoV0hJVEVTUEFDRV9URVNULnRlc3QoaHRt bCkgfHwgaHRtbFswXSA9PT0gJzwnICYmIE5PTlZJU0lCTEVfVEVTVC50ZXN0KGh0bWwpKSB7Cisg ICAgICAgIC8vIFJlY292ZXIgbGVhZGluZyB3aGl0ZXNwYWNlIGJ5IHRlbXBvcmFyaWx5IHByZXBl bmRpbmcgYW55IGNoYXJhY3Rlci4KKyAgICAgICAgLy8gXHVGRUZGIGhhcyB0aGUgcG90ZW50aWFs IGFkdmFudGFnZSBvZiBiZWluZyB6ZXJvLXdpZHRoL2ludmlzaWJsZS4KKyAgICAgICAgLy8gVWds aWZ5SlMgZHJvcHMgVStGRUZGIGNoYXJzIHdoZW4gcGFyc2luZywgc28gdXNlIFN0cmluZy5mcm9t Q2hhckNvZGUKKyAgICAgICAgLy8gaW4gaG9wZXMgdGhhdCB0aGlzIGlzIHByZXNlcnZlZCBldmVu IGlmICJcdUZFRkYiIGlzIHRyYW5zZm9ybWVkIHRvCisgICAgICAgIC8vIHRoZSBhY3R1YWwgVW5p Y29kZSBjaGFyYWN0ZXIgKGJ5IEJhYmVsLCBmb3IgZXhhbXBsZSkuCisgICAgICAgIC8vIGh0dHBz Oi8vZ2l0aHViLmNvbS9taXNob28vVWdsaWZ5SlMyL2Jsb2IvdjIuNC4yMC9saWIvcGFyc2UuanMj TDIxNgorICAgICAgICBub2RlLmlubmVySFRNTCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhGRUZG KSArIGh0bWw7CisKKyAgICAgICAgLy8gZGVsZXRlRGF0YSBsZWF2ZXMgYW4gZW1wdHkgYFRleHRO b2RlYCB3aGljaCBvZmZzZXRzIHRoZSBpbmRleCBvZiBhbGwKKyAgICAgICAgLy8gY2hpbGRyZW4u IERlZmluaXRlbHkgd2FudCB0byBhdm9pZCB0aGlzLgorICAgICAgICB2YXIgdGV4dE5vZGUgPSBu b2RlLmZpcnN0Q2hpbGQ7CisgICAgICAgIGlmICh0ZXh0Tm9kZS5kYXRhLmxlbmd0aCA9PT0gMSkg eworICAgICAgICAgIG5vZGUucmVtb3ZlQ2hpbGQodGV4dE5vZGUpOworICAgICAgICB9IGVsc2Ug eworICAgICAgICAgIHRleHROb2RlLmRlbGV0ZURhdGEoMCwgMSk7CisgICAgICAgIH0KKyAgICAg IH0gZWxzZSB7CisgICAgICAgIG5vZGUuaW5uZXJIVE1MID0gaHRtbDsKKyAgICAgIH0KKyAgICB9 OworICB9CisgIHRlc3RFbGVtZW50ID0gbnVsbDsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBzZXRJ bm5lckhUTUw7Cit9LHsiMTAiOjEwLCIxMDUiOjEwNSwiMTM2IjoxMzZ9XSwxMjg6W2Z1bmN0aW9u KF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50 LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNv dXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBp biB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3Vy Y2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUg Zm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICov CisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0gX2RlcmVxXygx MzYpOwordmFyIGVzY2FwZVRleHRDb250ZW50Rm9yQnJvd3NlciA9IF9kZXJlcV8oMTA3KTsKK3Zh ciBzZXRJbm5lckhUTUwgPSBfZGVyZXFfKDEyNyk7CisKKy8qKgorICogU2V0IHRoZSB0ZXh0Q29u dGVudCBwcm9wZXJ0eSBvZiBhIG5vZGUsIGVuc3VyaW5nIHRoYXQgd2hpdGVzcGFjZSBpcyBwcmVz ZXJ2ZWQKKyAqIGV2ZW4gaW4gSUU4LiBpbm5lclRleHQgaXMgYSBwb29yIHN1YnN0aXR1dGUgZm9y IHRleHRDb250ZW50IGFuZCwgYW1vbmcgbWFueQorICogaXNzdWVzLCBpbnNlcnRzIDxicj4gaW5z dGVhZCBvZiB0aGUgbGl0ZXJhbCBuZXdsaW5lIGNoYXJzLiBpbm5lckhUTUwgYmVoYXZlcworICog YXMgaXQgc2hvdWxkLgorICoKKyAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZQorICogQHBhcmFt IHtzdHJpbmd9IHRleHQKKyAqIEBpbnRlcm5hbAorICovCit2YXIgc2V0VGV4dENvbnRlbnQgPSBm dW5jdGlvbiAobm9kZSwgdGV4dCkgeworICBpZiAodGV4dCkgeworICAgIHZhciBmaXJzdENoaWxk ID0gbm9kZS5maXJzdENoaWxkOworCisgICAgaWYgKGZpcnN0Q2hpbGQgJiYgZmlyc3RDaGlsZCA9 PT0gbm9kZS5sYXN0Q2hpbGQgJiYgZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gMykgeworICAgICAg Zmlyc3RDaGlsZC5ub2RlVmFsdWUgPSB0ZXh0OworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQor ICBub2RlLnRleHRDb250ZW50ID0gdGV4dDsKK307CisKK2lmIChFeGVjdXRpb25FbnZpcm9ubWVu dC5jYW5Vc2VET00pIHsKKyAgaWYgKCEoJ3RleHRDb250ZW50JyBpbiBkb2N1bWVudC5kb2N1bWVu dEVsZW1lbnQpKSB7CisgICAgc2V0VGV4dENvbnRlbnQgPSBmdW5jdGlvbiAobm9kZSwgdGV4dCkg eworICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHsKKyAgICAgICAgbm9kZS5ub2RlVmFs dWUgPSB0ZXh0OworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBzZXRJbm5lckhUTUwo bm9kZSwgZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyKHRleHQpKTsKKyAgICB9OworICB9Cit9 CisKK21vZHVsZS5leHBvcnRzID0gc2V0VGV4dENvbnRlbnQ7Cit9LHsiMTA3IjoxMDcsIjEyNyI6 MTI3LCIxMzYiOjEzNn1dLDEyOTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7Cisv KioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmln aHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIg dGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRo ZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50 CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGlu IHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCisvKioKKyAq IEdpdmVuIGEgYHByZXZFbGVtZW50YCBhbmQgYG5leHRFbGVtZW50YCwgZGV0ZXJtaW5lcyBpZiB0 aGUgZXhpc3RpbmcKKyAqIGluc3RhbmNlIHNob3VsZCBiZSB1cGRhdGVkIGFzIG9wcG9zZWQgdG8g YmVpbmcgZGVzdHJveWVkIG9yIHJlcGxhY2VkIGJ5IGEgbmV3CisgKiBpbnN0YW5jZS4gQm90aCBh cmd1bWVudHMgYXJlIGVsZW1lbnRzLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGlzIGxvZ2ljIGNhbgor ICogb3BlcmF0ZSBvbiBzdGF0ZWxlc3MgdHJlZXMgd2l0aG91dCBhbnkgYmFja2luZyBpbnN0YW5j ZS4KKyAqCisgKiBAcGFyYW0gez9vYmplY3R9IHByZXZFbGVtZW50CisgKiBAcGFyYW0gez9vYmpl Y3R9IG5leHRFbGVtZW50CisgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBleGlzdGlu ZyBpbnN0YW5jZSBzaG91bGQgYmUgdXBkYXRlZC4KKyAqIEBwcm90ZWN0ZWQKKyAqLworCitmdW5j dGlvbiBzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudChwcmV2RWxlbWVudCwgbmV4dEVsZW1lbnQp IHsKKyAgdmFyIHByZXZFbXB0eSA9IHByZXZFbGVtZW50ID09PSBudWxsIHx8IHByZXZFbGVtZW50 ID09PSBmYWxzZTsKKyAgdmFyIG5leHRFbXB0eSA9IG5leHRFbGVtZW50ID09PSBudWxsIHx8IG5l eHRFbGVtZW50ID09PSBmYWxzZTsKKyAgaWYgKHByZXZFbXB0eSB8fCBuZXh0RW1wdHkpIHsKKyAg ICByZXR1cm4gcHJldkVtcHR5ID09PSBuZXh0RW1wdHk7CisgIH0KKworICB2YXIgcHJldlR5cGUg PSB0eXBlb2YgcHJldkVsZW1lbnQ7CisgIHZhciBuZXh0VHlwZSA9IHR5cGVvZiBuZXh0RWxlbWVu dDsKKyAgaWYgKHByZXZUeXBlID09PSAnc3RyaW5nJyB8fCBwcmV2VHlwZSA9PT0gJ251bWJlcicp IHsKKyAgICByZXR1cm4gbmV4dFR5cGUgPT09ICdzdHJpbmcnIHx8IG5leHRUeXBlID09PSAnbnVt YmVyJzsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbmV4dFR5cGUgPT09ICdvYmplY3QnICYmIHBy ZXZFbGVtZW50LnR5cGUgPT09IG5leHRFbGVtZW50LnR5cGUgJiYgcHJldkVsZW1lbnQua2V5ID09 PSBuZXh0RWxlbWVudC5rZXk7CisgIH0KK30KKworbW9kdWxlLmV4cG9ydHMgPSBzaG91bGRVcGRh dGVSZWFjdENvbXBvbmVudDsKK30se31dLDEzMDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhw b3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisg KiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5z ZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBm aWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlv bmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5U UyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOwor Cit2YXIgX3Byb2RJbnZhcmlhbnQgPSBfZGVyZXFfKDEyNSk7CisKK3ZhciBSZWFjdEN1cnJlbnRP d25lciA9IF9kZXJlcV8oMTMzKTsKK3ZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBfZGVyZXFfKDUz KTsKKwordmFyIGdldEl0ZXJhdG9yRm4gPSBfZGVyZXFfKDExNik7Cit2YXIgaW52YXJpYW50ID0g X2RlcmVxXygxNTApOwordmFyIEtleUVzY2FwZVV0aWxzID0gX2RlcmVxXygyMyk7Cit2YXIgd2Fy bmluZyA9IF9kZXJlcV8oMTU3KTsKKwordmFyIFNFUEFSQVRPUiA9ICcuJzsKK3ZhciBTVUJTRVBB UkFUT1IgPSAnOic7CisKKy8qKgorICogVGhpcyBpcyBpbmxpbmVkIGZyb20gUmVhY3RFbGVtZW50 IHNpbmNlIHRoaXMgZmlsZSBpcyBzaGFyZWQgYmV0d2VlbgorICogaXNvbW9ycGhpYyBhbmQgcmVu ZGVyZXJzLiBXZSBjb3VsZCBleHRyYWN0IHRoaXMgdG8gYQorICoKKyAqLworCisvKioKKyAqIFRP RE86IFRlc3QgdGhhdCBhIHNpbmdsZSBjaGlsZCBhbmQgYW4gYXJyYXkgd2l0aCBvbmUgaXRlbSBo YXZlIHRoZSBzYW1lIGtleQorICogcGF0dGVybi4KKyAqLworCit2YXIgZGlkV2FybkFib3V0TWFw cyA9IGZhbHNlOworCisvKioKKyAqIEdlbmVyYXRlIGEga2V5IHN0cmluZyB0aGF0IGlkZW50aWZp ZXMgYSBjb21wb25lbnQgd2l0aGluIGEgc2V0LgorICoKKyAqIEBwYXJhbSB7Kn0gY29tcG9uZW50 IEEgY29tcG9uZW50IHRoYXQgY291bGQgY29udGFpbiBhIG1hbnVhbCBrZXkuCisgKiBAcGFyYW0g e251bWJlcn0gaW5kZXggSW5kZXggdGhhdCBpcyB1c2VkIGlmIGEgbWFudWFsIGtleSBpcyBub3Qg cHJvdmlkZWQuCisgKiBAcmV0dXJuIHtzdHJpbmd9CisgKi8KK2Z1bmN0aW9uIGdldENvbXBvbmVu dEtleShjb21wb25lbnQsIGluZGV4KSB7CisgIC8vIERvIHNvbWUgdHlwZWNoZWNraW5nIGhlcmUg c2luY2Ugd2UgY2FsbCB0aGlzIGJsaW5kbHkuIFdlIHdhbnQgdG8gZW5zdXJlCisgIC8vIHRoYXQg d2UgZG9uJ3QgYmxvY2sgcG90ZW50aWFsIGZ1dHVyZSBFUyBBUElzLgorICBpZiAoY29tcG9uZW50 ICYmIHR5cGVvZiBjb21wb25lbnQgPT09ICdvYmplY3QnICYmIGNvbXBvbmVudC5rZXkgIT0gbnVs bCkgeworICAgIC8vIEV4cGxpY2l0IGtleQorICAgIHJldHVybiBLZXlFc2NhcGVVdGlscy5lc2Nh cGUoY29tcG9uZW50LmtleSk7CisgIH0KKyAgLy8gSW1wbGljaXQga2V5IGRldGVybWluZWQgYnkg dGhlIGluZGV4IGluIHRoZSBzZXQKKyAgcmV0dXJuIGluZGV4LnRvU3RyaW5nKDM2KTsKK30KKwor LyoqCisgKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci4KKyAq IEBwYXJhbSB7IXN0cmluZ30gbmFtZVNvRmFyIE5hbWUgb2YgdGhlIGtleSBwYXRoIHNvIGZhci4K KyAqIEBwYXJhbSB7IWZ1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayB0byBpbnZva2Ugd2l0aCBl YWNoIGNoaWxkIGZvdW5kLgorICogQHBhcmFtIHs/Kn0gdHJhdmVyc2VDb250ZXh0IFVzZWQgdG8g cGFzcyBpbmZvcm1hdGlvbiB0aHJvdWdob3V0IHRoZSB0cmF2ZXJzYWwKKyAqIHByb2Nlc3MuCisg KiBAcmV0dXJuIHshbnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHRoaXMgc3VidHJl ZS4KKyAqLworZnVuY3Rpb24gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGRyZW4sIG5hbWVT b0ZhciwgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCkgeworICB2YXIgdHlwZSA9IHR5cGVvZiBj aGlsZHJlbjsKKworICBpZiAodHlwZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZSA9PT0gJ2Jvb2xl YW4nKSB7CisgICAgLy8gQWxsIG9mIHRoZSBhYm92ZSBhcmUgcGVyY2VpdmVkIGFzIG51bGwuCisg ICAgY2hpbGRyZW4gPSBudWxsOworICB9CisKKyAgaWYgKGNoaWxkcmVuID09PSBudWxsIHx8IHR5 cGUgPT09ICdzdHJpbmcnIHx8IHR5cGUgPT09ICdudW1iZXInIHx8CisgIC8vIFRoZSBmb2xsb3dp bmcgaXMgaW5saW5lZCBmcm9tIFJlYWN0RWxlbWVudC4gVGhpcyBtZWFucyB3ZSBjYW4gb3B0aW1p emUKKyAgLy8gc29tZSBjaGVja3MuIFJlYWN0IEZpYmVyIGFsc28gaW5saW5lcyB0aGlzIGxvZ2lj IGZvciBzaW1pbGFyIHB1cnBvc2VzLgorICB0eXBlID09PSAnb2JqZWN0JyAmJiBjaGlsZHJlbi4k JHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7CisgICAgY2FsbGJhY2sodHJhdmVyc2VD b250ZXh0LCBjaGlsZHJlbiwKKyAgICAvLyBJZiBpdCdzIHRoZSBvbmx5IGNoaWxkLCB0cmVhdCB0 aGUgbmFtZSBhcyBpZiBpdCB3YXMgd3JhcHBlZCBpbiBhbiBhcnJheQorICAgIC8vIHNvIHRoYXQg aXQncyBjb25zaXN0ZW50IGlmIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gZ3Jvd3MuCisgICAgbmFt ZVNvRmFyID09PSAnJyA/IFNFUEFSQVRPUiArIGdldENvbXBvbmVudEtleShjaGlsZHJlbiwgMCkg OiBuYW1lU29GYXIpOworICAgIHJldHVybiAxOworICB9CisKKyAgdmFyIGNoaWxkOworICB2YXIg bmV4dE5hbWU7CisgIHZhciBzdWJ0cmVlQ291bnQgPSAwOyAvLyBDb3VudCBvZiBjaGlsZHJlbiBm b3VuZCBpbiB0aGUgY3VycmVudCBzdWJ0cmVlLgorICB2YXIgbmV4dE5hbWVQcmVmaXggPSBuYW1l U29GYXIgPT09ICcnID8gU0VQQVJBVE9SIDogbmFtZVNvRmFyICsgU1VCU0VQQVJBVE9SOworCisg IGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgeworICAgIGZvciAodmFyIGkgPSAwOyBpIDwg Y2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKyAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07CisgICAg ICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkLCBpKTsK KyAgICAgIHN1YnRyZWVDb3VudCArPSB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZCwgbmV4 dE5hbWUsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAg ICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4oY2hpbGRyZW4pOworICAgIGlmIChpdGVy YXRvckZuKSB7CisgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwoY2hpbGRyZW4p OworICAgICAgdmFyIHN0ZXA7CisgICAgICBpZiAoaXRlcmF0b3JGbiAhPT0gY2hpbGRyZW4uZW50 cmllcykgeworICAgICAgICB2YXIgaWkgPSAwOworICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRl cmF0b3IubmV4dCgpKS5kb25lKSB7CisgICAgICAgICAgY2hpbGQgPSBzdGVwLnZhbHVlOworICAg ICAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBnZXRDb21wb25lbnRLZXkoY2hpbGQs IGlpKyspOworICAgICAgICAgIHN1YnRyZWVDb3VudCArPSB0cmF2ZXJzZUFsbENoaWxkcmVuSW1w bChjaGlsZCwgbmV4dE5hbWUsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpOworICAgICAgICB9 CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rp b24nKSB7CisgICAgICAgICAgdmFyIG1hcHNBc0NoaWxkcmVuQWRkZW5kdW0gPSAnJzsKKyAgICAg ICAgICBpZiAoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkgeworICAgICAgICAgICAgdmFyIG1h cHNBc0NoaWxkcmVuT3duZXJOYW1lID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5nZXROYW1l KCk7CisgICAgICAgICAgICBpZiAobWFwc0FzQ2hpbGRyZW5Pd25lck5hbWUpIHsKKyAgICAgICAg ICAgICAgbWFwc0FzQ2hpbGRyZW5BZGRlbmR1bSA9ICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qg b2YgYCcgKyBtYXBzQXNDaGlsZHJlbk93bmVyTmFtZSArICdgLic7CisgICAgICAgICAgICB9Cisg ICAgICAgICAgfQorICAgICAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdh cm5pbmcoZGlkV2FybkFib3V0TWFwcywgJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgbm90IHll dCBmdWxseSBzdXBwb3J0ZWQuIEl0IGlzIGFuICcgKyAnZXhwZXJpbWVudGFsIGZlYXR1cmUgdGhh dCBtaWdodCBiZSByZW1vdmVkLiBDb252ZXJ0IGl0IHRvIGEgJyArICdzZXF1ZW5jZSAvIGl0ZXJh YmxlIG9mIGtleWVkIFJlYWN0RWxlbWVudHMgaW5zdGVhZC4lcycsIG1hcHNBc0NoaWxkcmVuQWRk ZW5kdW0pIDogdm9pZCAwOworICAgICAgICAgIGRpZFdhcm5BYm91dE1hcHMgPSB0cnVlOworICAg ICAgICB9CisgICAgICAgIC8vIEl0ZXJhdG9yIHdpbGwgcHJvdmlkZSBlbnRyeSBbayx2XSB0dXBs ZXMgcmF0aGVyIHRoYW4gdmFsdWVzLgorICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3Iu bmV4dCgpKS5kb25lKSB7CisgICAgICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTsKKyAgICAg ICAgICBpZiAoZW50cnkpIHsKKyAgICAgICAgICAgIGNoaWxkID0gZW50cnlbMV07CisgICAgICAg ICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgS2V5RXNjYXBlVXRpbHMuZXNjYXBlKGVu dHJ5WzBdKSArIFNVQlNFUEFSQVRPUiArIGdldENvbXBvbmVudEtleShjaGlsZCwgMCk7CisgICAg ICAgICAgICBzdWJ0cmVlQ291bnQgKz0gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGQsIG5l eHROYW1lLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KTsKKyAgICAgICAgICB9CisgICAgICAg IH0KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7CisgICAgICB2 YXIgYWRkZW5kdW0gPSAnJzsKKyAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlv bicpIHsKKyAgICAgICAgYWRkZW5kdW0gPSAnIElmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xs ZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgJyArICdpbnN0ZWFkIG9yIHdyYXAgdGhl IG9iamVjdCB1c2luZyBjcmVhdGVGcmFnbWVudChvYmplY3QpIGZyb20gdGhlICcgKyAnUmVhY3Qg YWRkLW9ucy4nOworICAgICAgICBpZiAoY2hpbGRyZW4uX2lzUmVhY3RFbGVtZW50KSB7CisgICAg ICAgICAgYWRkZW5kdW0gPSAnIEl0IGxvb2tzIGxpa2UgeW91XCdyZSB1c2luZyBhbiBlbGVtZW50 IGNyZWF0ZWQgYnkgYSBkaWZmZXJlbnQgJyArICd2ZXJzaW9uIG9mIFJlYWN0LiBNYWtlIHN1cmUg dG8gdXNlIG9ubHkgb25lIGNvcHkgb2YgUmVhY3QuJzsKKyAgICAgICAgfQorICAgICAgICBpZiAo UmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkgeworICAgICAgICAgIHZhciBuYW1lID0gUmVhY3RD dXJyZW50T3duZXIuY3VycmVudC5nZXROYW1lKCk7CisgICAgICAgICAgaWYgKG5hbWUpIHsKKyAg ICAgICAgICAgIGFkZGVuZHVtICs9ICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBu YW1lICsgJ2AuJzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHZhciBj aGlsZHJlblN0cmluZyA9IFN0cmluZyhjaGlsZHJlbik7CisgICAgICAhZmFsc2UgPyAiZGV2ZWxv cG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdPYmplY3RzIGFyZSBu b3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6ICVzKS4lcycsIGNoaWxkcmVuU3RyaW5n ID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0Lmtl eXMoY2hpbGRyZW4pLmpvaW4oJywgJykgKyAnfScgOiBjaGlsZHJlblN0cmluZywgYWRkZW5kdW0p IDogX3Byb2RJbnZhcmlhbnQoJzMxJywgY2hpbGRyZW5TdHJpbmcgPT09ICdbb2JqZWN0IE9iamVj dF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjaGlsZHJlbikuam9pbign LCAnKSArICd9JyA6IGNoaWxkcmVuU3RyaW5nLCBhZGRlbmR1bSkgOiB2b2lkIDA7CisgICAgfQor ICB9CisKKyAgcmV0dXJuIHN1YnRyZWVDb3VudDsKK30KKworLyoqCisgKiBUcmF2ZXJzZXMgY2hp bGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLCBi dXQKKyAqIG1pZ2h0IGFsc28gYmUgc3BlY2lmaWVkIHRocm91Z2ggYXR0cmlidXRlczoKKyAqCisg KiAtIGB0cmF2ZXJzZUFsbENoaWxkcmVuKHRoaXMucHJvcHMuY2hpbGRyZW4sIC4uLilgCisgKiAt IGB0cmF2ZXJzZUFsbENoaWxkcmVuKHRoaXMucHJvcHMubGVmdFBhbmVsQ2hpbGRyZW4sIC4uLilg CisgKgorICogVGhlIGB0cmF2ZXJzZUNvbnRleHRgIGlzIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRo YXQgaXMgcGFzc2VkIHRocm91Z2ggdGhlCisgKiBlbnRpcmUgdHJhdmVyc2FsLiBJdCBjYW4gYmUg dXNlZCB0byBzdG9yZSBhY2N1bXVsYXRpb25zIG9yIGFueXRoaW5nIGVsc2UgdGhhdAorICogdGhl IGNhbGxiYWNrIG1pZ2h0IGZpbmQgcmVsZXZhbnQuCisgKgorICogQHBhcmFtIHs/Kn0gY2hpbGRy ZW4gQ2hpbGRyZW4gdHJlZSBvYmplY3QuCisgKiBAcGFyYW0geyFmdW5jdGlvbn0gY2FsbGJhY2sg VG8gaW52b2tlIHVwb24gdHJhdmVyc2luZyBlYWNoIGNoaWxkLgorICogQHBhcmFtIHs/Kn0gdHJh dmVyc2VDb250ZXh0IENvbnRleHQgZm9yIHRyYXZlcnNhbC4KKyAqIEByZXR1cm4geyFudW1iZXJ9 IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4gaW4gdGhpcyBzdWJ0cmVlLgorICovCitmdW5jdGlvbiB0 cmF2ZXJzZUFsbENoaWxkcmVuKGNoaWxkcmVuLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KSB7 CisgIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICByZXR1 cm4gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGRyZW4sICcnLCBjYWxsYmFjaywgdHJhdmVy c2VDb250ZXh0KTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSB0cmF2ZXJzZUFsbENoaWxkcmVuOwor fSx7IjExNiI6MTE2LCIxMjUiOjEyNSwiMTMzIjoxMzMsIjE1MCI6MTUwLCIxNTciOjE1NywiMjMi OjIzLCI1MyI6NTN9XSwxMzE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoq CisgKiBDb3B5cmlnaHQgMjAxNS1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0 cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRo ZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUg cm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAor ICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0 aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9hc3Np Z24gPSBfZGVyZXFfKDE1OCk7CisKK3ZhciBlbXB0eUZ1bmN0aW9uID0gX2RlcmVxXygxNDIpOwor dmFyIHdhcm5pbmcgPSBfZGVyZXFfKDE1Nyk7CisKK3ZhciB2YWxpZGF0ZURPTU5lc3RpbmcgPSBl bXB0eUZ1bmN0aW9uOworCitpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7Cisg IC8vIFRoaXMgdmFsaWRhdGlvbiBjb2RlIHdhcyB3cml0dGVuIGJhc2VkIG9uIHRoZSBIVE1MNSBw YXJzaW5nIHNwZWM6CisgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdl L3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLXNjb3BlCisgIC8vCisgIC8vIE5vdGU6IHRo aXMgZG9lcyBub3QgY2F0Y2ggYWxsIGludmFsaWQgbmVzdGluZywgbm9yIGRvZXMgaXQgdHJ5IHRv IChhcyBpdCdzCisgIC8vIG5vdCBjbGVhciB3aGF0IHByYWN0aWNhbCBiZW5lZml0IGRvaW5nIHNv IHByb3ZpZGVzKTsgaW5zdGVhZCwgd2Ugd2FybiBvbmx5CisgIC8vIGZvciBjYXNlcyB3aGVyZSB0 aGUgcGFyc2VyIHdpbGwgZ2l2ZSBhIHBhcnNlIHRyZWUgZGlmZmVyaW5nIGZyb20gd2hhdCBSZWFj dAorICAvLyBpbnRlbmRlZC4gRm9yIGV4YW1wbGUsIDxiPjxkaXY+PC9kaXY+PC9iPiBpcyBpbnZh bGlkIGJ1dCB3ZSBkb24ndCB3YXJuCisgIC8vIGJlY2F1c2UgaXQgc3RpbGwgcGFyc2VzIGNvcnJl Y3RseTsgd2UgZG8gd2FybiBmb3Igb3RoZXIgY2FzZXMgbGlrZSBuZXN0ZWQKKyAgLy8gPHA+IHRh Z3Mgd2hlcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2Vjb25kIGVsZW1lbnQgaW1wbGljaXRseSBj bG9zZXMgdGhlCisgIC8vIGZpcnN0LCBjYXVzaW5nIGEgY29uZnVzaW5nIG1lc3MuCisKKyAgLy8g aHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjc3BlY2lh bAorICB2YXIgc3BlY2lhbFRhZ3MgPSBbJ2FkZHJlc3MnLCAnYXBwbGV0JywgJ2FyZWEnLCAnYXJ0 aWNsZScsICdhc2lkZScsICdiYXNlJywgJ2Jhc2Vmb250JywgJ2Jnc291bmQnLCAnYmxvY2txdW90 ZScsICdib2R5JywgJ2JyJywgJ2J1dHRvbicsICdjYXB0aW9uJywgJ2NlbnRlcicsICdjb2wnLCAn Y29sZ3JvdXAnLCAnZGQnLCAnZGV0YWlscycsICdkaXInLCAnZGl2JywgJ2RsJywgJ2R0JywgJ2Vt YmVkJywgJ2ZpZWxkc2V0JywgJ2ZpZ2NhcHRpb24nLCAnZmlndXJlJywgJ2Zvb3RlcicsICdmb3Jt JywgJ2ZyYW1lJywgJ2ZyYW1lc2V0JywgJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2 JywgJ2hlYWQnLCAnaGVhZGVyJywgJ2hncm91cCcsICdocicsICdodG1sJywgJ2lmcmFtZScsICdp bWcnLCAnaW5wdXQnLCAnaXNpbmRleCcsICdsaScsICdsaW5rJywgJ2xpc3RpbmcnLCAnbWFpbics ICdtYXJxdWVlJywgJ21lbnUnLCAnbWVudWl0ZW0nLCAnbWV0YScsICduYXYnLCAnbm9lbWJlZCcs ICdub2ZyYW1lcycsICdub3NjcmlwdCcsICdvYmplY3QnLCAnb2wnLCAncCcsICdwYXJhbScsICdw bGFpbnRleHQnLCAncHJlJywgJ3NjcmlwdCcsICdzZWN0aW9uJywgJ3NlbGVjdCcsICdzb3VyY2Un LCAnc3R5bGUnLCAnc3VtbWFyeScsICd0YWJsZScsICd0Ym9keScsICd0ZCcsICd0ZW1wbGF0ZScs ICd0ZXh0YXJlYScsICd0Zm9vdCcsICd0aCcsICd0aGVhZCcsICd0aXRsZScsICd0cicsICd0cmFj aycsICd1bCcsICd3YnInLCAneG1wJ107CisKKyAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdn Lm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tc2NvcGUKKyAgdmFy IGluU2NvcGVUYWdzID0gWydhcHBsZXQnLCAnY2FwdGlvbicsICdodG1sJywgJ3RhYmxlJywgJ3Rk JywgJ3RoJywgJ21hcnF1ZWUnLCAnb2JqZWN0JywgJ3RlbXBsYXRlJywKKworICAvLyBodHRwczov L2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNodG1sLWludGVncmF0 aW9uLXBvaW50CisgIC8vIFRPRE86IERpc3Rpbmd1aXNoIGJ5IG5hbWVzcGFjZSBoZXJlIC0tIGZv ciA8dGl0bGU+LCBpbmNsdWRpbmcgaXQgaGVyZQorICAvLyBlcnJzIG9uIHRoZSBzaWRlIG9mIGZl d2VyIHdhcm5pbmdzCisgICdmb3JlaWduT2JqZWN0JywgJ2Rlc2MnLCAndGl0bGUnXTsKKworICAv LyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNoYXMt YW4tZWxlbWVudC1pbi1idXR0b24tc2NvcGUKKyAgdmFyIGJ1dHRvblNjb3BlVGFncyA9IGluU2Nv cGVUYWdzLmNvbmNhdChbJ2J1dHRvbiddKTsKKworICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0 d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNnZW5lcmF0ZS1pbXBsaWVkLWVuZC10YWdzCisg IHZhciBpbXBsaWVkRW5kVGFncyA9IFsnZGQnLCAnZHQnLCAnbGknLCAnb3B0aW9uJywgJ29wdGdy b3VwJywgJ3AnLCAncnAnLCAncnQnXTsKKworICB2YXIgZW1wdHlBbmNlc3RvckluZm8gPSB7Cisg ICAgY3VycmVudDogbnVsbCwKKworICAgIGZvcm1UYWc6IG51bGwsCisgICAgYVRhZ0luU2NvcGU6 IG51bGwsCisgICAgYnV0dG9uVGFnSW5TY29wZTogbnVsbCwKKyAgICBub2JyVGFnSW5TY29wZTog bnVsbCwKKyAgICBwVGFnSW5CdXR0b25TY29wZTogbnVsbCwKKworICAgIGxpc3RJdGVtVGFnQXV0 b2Nsb3Npbmc6IG51bGwsCisgICAgZGxJdGVtVGFnQXV0b2Nsb3Npbmc6IG51bGwKKyAgfTsKKwor ICB2YXIgdXBkYXRlZEFuY2VzdG9ySW5mbyA9IGZ1bmN0aW9uIChvbGRJbmZvLCB0YWcsIGluc3Rh bmNlKSB7CisgICAgdmFyIGFuY2VzdG9ySW5mbyA9IF9hc3NpZ24oe30sIG9sZEluZm8gfHwgZW1w dHlBbmNlc3RvckluZm8pOworICAgIHZhciBpbmZvID0geyB0YWc6IHRhZywgaW5zdGFuY2U6IGlu c3RhbmNlIH07CisKKyAgICBpZiAoaW5TY29wZVRhZ3MuaW5kZXhPZih0YWcpICE9PSAtMSkgewor ICAgICAgYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlID0gbnVsbDsKKyAgICAgIGFuY2VzdG9ySW5m by5idXR0b25UYWdJblNjb3BlID0gbnVsbDsKKyAgICAgIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5T Y29wZSA9IG51bGw7CisgICAgfQorICAgIGlmIChidXR0b25TY29wZVRhZ3MuaW5kZXhPZih0YWcp ICE9PSAtMSkgeworICAgICAgYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlID0gbnVsbDsK KyAgICB9CisKKyAgICAvLyBTZWUgcnVsZXMgZm9yICdsaScsICdkZCcsICdkdCcgc3RhcnQgdGFn cyBpbgorICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRh eC5odG1sI3BhcnNpbmctbWFpbi1pbmJvZHkKKyAgICBpZiAoc3BlY2lhbFRhZ3MuaW5kZXhPZih0 YWcpICE9PSAtMSAmJiB0YWcgIT09ICdhZGRyZXNzJyAmJiB0YWcgIT09ICdkaXYnICYmIHRhZyAh PT0gJ3AnKSB7CisgICAgICBhbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZyA9IG51 bGw7CisgICAgICBhbmNlc3RvckluZm8uZGxJdGVtVGFnQXV0b2Nsb3NpbmcgPSBudWxsOworICAg IH0KKworICAgIGFuY2VzdG9ySW5mby5jdXJyZW50ID0gaW5mbzsKKworICAgIGlmICh0YWcgPT09 ICdmb3JtJykgeworICAgICAgYW5jZXN0b3JJbmZvLmZvcm1UYWcgPSBpbmZvOworICAgIH0KKyAg ICBpZiAodGFnID09PSAnYScpIHsKKyAgICAgIGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZSA9IGlu Zm87CisgICAgfQorICAgIGlmICh0YWcgPT09ICdidXR0b24nKSB7CisgICAgICBhbmNlc3Rvcklu Zm8uYnV0dG9uVGFnSW5TY29wZSA9IGluZm87CisgICAgfQorICAgIGlmICh0YWcgPT09ICdub2Jy JykgeworICAgICAgYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlID0gaW5mbzsKKyAgICB9Cisg ICAgaWYgKHRhZyA9PT0gJ3AnKSB7CisgICAgICBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2Nv cGUgPSBpbmZvOworICAgIH0KKyAgICBpZiAodGFnID09PSAnbGknKSB7CisgICAgICBhbmNlc3Rv ckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZyA9IGluZm87CisgICAgfQorICAgIGlmICh0YWcg PT09ICdkZCcgfHwgdGFnID09PSAnZHQnKSB7CisgICAgICBhbmNlc3RvckluZm8uZGxJdGVtVGFn QXV0b2Nsb3NpbmcgPSBpbmZvOworICAgIH0KKworICAgIHJldHVybiBhbmNlc3RvckluZm87Cisg IH07CisKKyAgLyoqCisgICAqIFJldHVybnMgd2hldGhlcgorICAgKi8KKyAgdmFyIGlzVGFnVmFs aWRXaXRoUGFyZW50ID0gZnVuY3Rpb24gKHRhZywgcGFyZW50VGFnKSB7CisgICAgLy8gRmlyc3Qs IGxldCdzIGNoZWNrIGlmIHdlJ3JlIGluIGFuIHVudXN1YWwgcGFyc2luZyBtb2RlLi4uCisgICAg c3dpdGNoIChwYXJlbnRUYWcpIHsKKyAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5v cmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnNlbGVjdAorICAgICAgY2Fz ZSAnc2VsZWN0JzoKKyAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ29wdGlvbicgfHwgdGFnID09PSAn b3B0Z3JvdXAnIHx8IHRhZyA9PT0gJyN0ZXh0JzsKKyAgICAgIGNhc2UgJ29wdGdyb3VwJzoKKyAg ICAgICAgcmV0dXJuIHRhZyA9PT0gJ29wdGlvbicgfHwgdGFnID09PSAnI3RleHQnOworICAgICAg Ly8gU3RyaWN0bHkgc3BlYWtpbmcsIHNlZWluZyBhbiA8b3B0aW9uPiBkb2Vzbid0IG1lYW4gd2Un cmUgaW4gYSA8c2VsZWN0PgorICAgICAgLy8gYnV0CisgICAgICBjYXNlICdvcHRpb24nOgorICAg ICAgICByZXR1cm4gdGFnID09PSAnI3RleHQnOworCisgICAgICAvLyBodHRwczovL2h0bWwuc3Bl Yy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50ZAorICAg ICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwj cGFyc2luZy1tYWluLWluY2FwdGlvbgorICAgICAgLy8gTm8gc3BlY2lhbCBiZWhhdmlvciBzaW5j ZSB0aGVzZSBydWxlcyBmYWxsIGJhY2sgdG8gImluIGJvZHkiIG1vZGUgZm9yCisgICAgICAvLyBh bGwgZXhjZXB0IHNwZWNpYWwgdGFibGUgbm9kZXMgd2hpY2ggY2F1c2UgYmFkIHBhcnNpbmcgYmVo YXZpb3IgYW55d2F5LgorCisgICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211 bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50cgorICAgICAgY2FzZSAndHInOgor ICAgICAgICByZXR1cm4gdGFnID09PSAndGgnIHx8IHRhZyA9PT0gJ3RkJyB8fCB0YWcgPT09ICdz dHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7CisKKyAgICAg IC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3Bh cnNpbmctbWFpbi1pbnRib2R5CisgICAgICBjYXNlICd0Ym9keSc6CisgICAgICBjYXNlICd0aGVh ZCc6CisgICAgICBjYXNlICd0Zm9vdCc6CisgICAgICAgIHJldHVybiB0YWcgPT09ICd0cicgfHwg dGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUn OworCisgICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50 YXguaHRtbCNwYXJzaW5nLW1haW4taW5jb2xncm91cAorICAgICAgY2FzZSAnY29sZ3JvdXAnOgor ICAgICAgICByZXR1cm4gdGFnID09PSAnY29sJyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7CisKKyAg ICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1s I3BhcnNpbmctbWFpbi1pbnRhYmxlCisgICAgICBjYXNlICd0YWJsZSc6CisgICAgICAgIHJldHVy biB0YWcgPT09ICdjYXB0aW9uJyB8fCB0YWcgPT09ICdjb2xncm91cCcgfHwgdGFnID09PSAndGJv ZHknIHx8IHRhZyA9PT0gJ3Rmb290JyB8fCB0YWcgPT09ICd0aGVhZCcgfHwgdGFnID09PSAnc3R5 bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnOworCisgICAgICAv LyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJz aW5nLW1haW4taW5oZWFkCisgICAgICBjYXNlICdoZWFkJzoKKyAgICAgICAgcmV0dXJuIHRhZyA9 PT0gJ2Jhc2UnIHx8IHRhZyA9PT0gJ2Jhc2Vmb250JyB8fCB0YWcgPT09ICdiZ3NvdW5kJyB8fCB0 YWcgPT09ICdsaW5rJyB8fCB0YWcgPT09ICdtZXRhJyB8fCB0YWcgPT09ICd0aXRsZScgfHwgdGFn ID09PSAnbm9zY3JpcHQnIHx8IHRhZyA9PT0gJ25vZnJhbWVzJyB8fCB0YWcgPT09ICdzdHlsZScg fHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7CisKKyAgICAgIC8vIGh0 dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3NlbWFudGljcy5odG1sI3RoZS1o dG1sLWVsZW1lbnQKKyAgICAgIGNhc2UgJ2h0bWwnOgorICAgICAgICByZXR1cm4gdGFnID09PSAn aGVhZCcgfHwgdGFnID09PSAnYm9keSc7CisgICAgICBjYXNlICcjZG9jdW1lbnQnOgorICAgICAg ICByZXR1cm4gdGFnID09PSAnaHRtbCc7CisgICAgfQorCisgICAgLy8gUHJvYmFibHkgaW4gdGhl ICJpbiBib2R5IiBwYXJzaW5nIG1vZGUsIHNvIHdlIG91dGxhdyBvbmx5IHRhZyBjb21ib3MKKyAg ICAvLyB3aGVyZSB0aGUgcGFyc2luZyBydWxlcyBjYXVzZSBpbXBsaWNpdCBvcGVucyBvciBjbG9z ZXMgdG8gYmUgYWRkZWQuCisgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0 aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluYm9keQorICAgIHN3aXRjaCAodGFnKSB7 CisgICAgICBjYXNlICdoMSc6CisgICAgICBjYXNlICdoMic6CisgICAgICBjYXNlICdoMyc6Cisg ICAgICBjYXNlICdoNCc6CisgICAgICBjYXNlICdoNSc6CisgICAgICBjYXNlICdoNic6CisgICAg ICAgIHJldHVybiBwYXJlbnRUYWcgIT09ICdoMScgJiYgcGFyZW50VGFnICE9PSAnaDInICYmIHBh cmVudFRhZyAhPT0gJ2gzJyAmJiBwYXJlbnRUYWcgIT09ICdoNCcgJiYgcGFyZW50VGFnICE9PSAn aDUnICYmIHBhcmVudFRhZyAhPT0gJ2g2JzsKKworICAgICAgY2FzZSAncnAnOgorICAgICAgY2Fz ZSAncnQnOgorICAgICAgICByZXR1cm4gaW1wbGllZEVuZFRhZ3MuaW5kZXhPZihwYXJlbnRUYWcp ID09PSAtMTsKKworICAgICAgY2FzZSAnYm9keSc6CisgICAgICBjYXNlICdjYXB0aW9uJzoKKyAg ICAgIGNhc2UgJ2NvbCc6CisgICAgICBjYXNlICdjb2xncm91cCc6CisgICAgICBjYXNlICdmcmFt ZSc6CisgICAgICBjYXNlICdoZWFkJzoKKyAgICAgIGNhc2UgJ2h0bWwnOgorICAgICAgY2FzZSAn dGJvZHknOgorICAgICAgY2FzZSAndGQnOgorICAgICAgY2FzZSAndGZvb3QnOgorICAgICAgY2Fz ZSAndGgnOgorICAgICAgY2FzZSAndGhlYWQnOgorICAgICAgY2FzZSAndHInOgorICAgICAgICAv LyBUaGVzZSB0YWdzIGFyZSBvbmx5IHZhbGlkIHdpdGggYSBmZXcgcGFyZW50cyB0aGF0IGhhdmUg c3BlY2lhbCBjaGlsZAorICAgICAgICAvLyBwYXJzaW5nIHJ1bGVzIC0tIGlmIHdlJ3JlIGRvd24g aGVyZSwgdGhlbiBub25lIG9mIHRob3NlIG1hdGNoZWQgYW5kCisgICAgICAgIC8vIHNvIHdlIGFs bG93IGl0IG9ubHkgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHRoZSBwYXJlbnQgaXMsIGFzIGFsbCBv dGhlcgorICAgICAgICAvLyBjYXNlcyBhcmUgaW52YWxpZC4KKyAgICAgICAgcmV0dXJuIHBhcmVu dFRhZyA9PSBudWxsOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9OworCisgIC8qKgor ICAgKiBSZXR1cm5zIHdoZXRoZXIKKyAgICovCisgIHZhciBmaW5kSW52YWxpZEFuY2VzdG9yRm9y VGFnID0gZnVuY3Rpb24gKHRhZywgYW5jZXN0b3JJbmZvKSB7CisgICAgc3dpdGNoICh0YWcpIHsK KyAgICAgIGNhc2UgJ2FkZHJlc3MnOgorICAgICAgY2FzZSAnYXJ0aWNsZSc6CisgICAgICBjYXNl ICdhc2lkZSc6CisgICAgICBjYXNlICdibG9ja3F1b3RlJzoKKyAgICAgIGNhc2UgJ2NlbnRlcic6 CisgICAgICBjYXNlICdkZXRhaWxzJzoKKyAgICAgIGNhc2UgJ2RpYWxvZyc6CisgICAgICBjYXNl ICdkaXInOgorICAgICAgY2FzZSAnZGl2JzoKKyAgICAgIGNhc2UgJ2RsJzoKKyAgICAgIGNhc2Ug J2ZpZWxkc2V0JzoKKyAgICAgIGNhc2UgJ2ZpZ2NhcHRpb24nOgorICAgICAgY2FzZSAnZmlndXJl JzoKKyAgICAgIGNhc2UgJ2Zvb3Rlcic6CisgICAgICBjYXNlICdoZWFkZXInOgorICAgICAgY2Fz ZSAnaGdyb3VwJzoKKyAgICAgIGNhc2UgJ21haW4nOgorICAgICAgY2FzZSAnbWVudSc6CisgICAg ICBjYXNlICduYXYnOgorICAgICAgY2FzZSAnb2wnOgorICAgICAgY2FzZSAncCc6CisgICAgICBj YXNlICdzZWN0aW9uJzoKKyAgICAgIGNhc2UgJ3N1bW1hcnknOgorICAgICAgY2FzZSAndWwnOgor CisgICAgICBjYXNlICdwcmUnOgorICAgICAgY2FzZSAnbGlzdGluZyc6CisKKyAgICAgIGNhc2Ug J3RhYmxlJzoKKworICAgICAgY2FzZSAnaHInOgorCisgICAgICBjYXNlICd4bXAnOgorCisgICAg ICBjYXNlICdoMSc6CisgICAgICBjYXNlICdoMic6CisgICAgICBjYXNlICdoMyc6CisgICAgICBj YXNlICdoNCc6CisgICAgICBjYXNlICdoNSc6CisgICAgICBjYXNlICdoNic6CisgICAgICAgIHJl dHVybiBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGU7CisKKyAgICAgIGNhc2UgJ2Zvcm0n OgorICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmZvcm1UYWcgfHwgYW5jZXN0b3JJbmZvLnBU YWdJbkJ1dHRvblNjb3BlOworCisgICAgICBjYXNlICdsaSc6CisgICAgICAgIHJldHVybiBhbmNl c3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZzsKKworICAgICAgY2FzZSAnZGQnOgorICAg ICAgY2FzZSAnZHQnOgorICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9j bG9zaW5nOworCisgICAgICBjYXNlICdidXR0b24nOgorICAgICAgICByZXR1cm4gYW5jZXN0b3JJ bmZvLmJ1dHRvblRhZ0luU2NvcGU7CisKKyAgICAgIGNhc2UgJ2EnOgorICAgICAgICAvLyBTcGVj IHNheXMgc29tZXRoaW5nIGFib3V0IHN0b3JpbmcgYSBsaXN0IG9mIG1hcmtlcnMsIGJ1dCBpdCBz b3VuZHMKKyAgICAgICAgLy8gZXF1aXZhbGVudCB0byB0aGlzIGNoZWNrLgorICAgICAgICByZXR1 cm4gYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlOworCisgICAgICBjYXNlICdub2JyJzoKKyAgICAg ICAgcmV0dXJuIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZTsKKyAgICB9CisKKyAgICByZXR1 cm4gbnVsbDsKKyAgfTsKKworICAvKioKKyAgICogR2l2ZW4gYSBSZWFjdENvbXBvc2l0ZUNvbXBv bmVudCBpbnN0YW5jZSwgcmV0dXJuIGEgbGlzdCBvZiBpdHMgcmVjdXJzaXZlCisgICAqIG93bmVy cywgc3RhcnRpbmcgYXQgdGhlIHJvb3QgYW5kIGVuZGluZyB3aXRoIHRoZSBpbnN0YW5jZSBpdHNl bGYuCisgICAqLworICB2YXIgZmluZE93bmVyU3RhY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsK KyAgICBpZiAoIWluc3RhbmNlKSB7CisgICAgICByZXR1cm4gW107CisgICAgfQorCisgICAgdmFy IHN0YWNrID0gW107CisgICAgZG8geworICAgICAgc3RhY2sucHVzaChpbnN0YW5jZSk7CisgICAg fSB3aGlsZSAoaW5zdGFuY2UgPSBpbnN0YW5jZS5fY3VycmVudEVsZW1lbnQuX293bmVyKTsKKyAg ICBzdGFjay5yZXZlcnNlKCk7CisgICAgcmV0dXJuIHN0YWNrOworICB9OworCisgIHZhciBkaWRX YXJuID0ge307CisKKyAgdmFsaWRhdGVET01OZXN0aW5nID0gZnVuY3Rpb24gKGNoaWxkVGFnLCBj aGlsZFRleHQsIGNoaWxkSW5zdGFuY2UsIGFuY2VzdG9ySW5mbykgeworICAgIGFuY2VzdG9ySW5m byA9IGFuY2VzdG9ySW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbzsKKyAgICB2YXIgcGFyZW50SW5m byA9IGFuY2VzdG9ySW5mby5jdXJyZW50OworICAgIHZhciBwYXJlbnRUYWcgPSBwYXJlbnRJbmZv ICYmIHBhcmVudEluZm8udGFnOworCisgICAgaWYgKGNoaWxkVGV4dCAhPSBudWxsKSB7CisgICAg ICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGNoaWxkVGFnID09IG51 bGwsICd2YWxpZGF0ZURPTU5lc3Rpbmc6IHdoZW4gY2hpbGRUZXh0IGlzIHBhc3NlZCwgY2hpbGRU YWcgc2hvdWxkIGJlIG51bGwnKSA6IHZvaWQgMDsKKyAgICAgIGNoaWxkVGFnID0gJyN0ZXh0JzsK KyAgICB9CisKKyAgICB2YXIgaW52YWxpZFBhcmVudCA9IGlzVGFnVmFsaWRXaXRoUGFyZW50KGNo aWxkVGFnLCBwYXJlbnRUYWcpID8gbnVsbCA6IHBhcmVudEluZm87CisgICAgdmFyIGludmFsaWRB bmNlc3RvciA9IGludmFsaWRQYXJlbnQgPyBudWxsIDogZmluZEludmFsaWRBbmNlc3RvckZvclRh ZyhjaGlsZFRhZywgYW5jZXN0b3JJbmZvKTsKKyAgICB2YXIgcHJvYmxlbWF0aWMgPSBpbnZhbGlk UGFyZW50IHx8IGludmFsaWRBbmNlc3RvcjsKKworICAgIGlmIChwcm9ibGVtYXRpYykgeworICAg ICAgdmFyIGFuY2VzdG9yVGFnID0gcHJvYmxlbWF0aWMudGFnOworICAgICAgdmFyIGFuY2VzdG9y SW5zdGFuY2UgPSBwcm9ibGVtYXRpYy5pbnN0YW5jZTsKKworICAgICAgdmFyIGNoaWxkT3duZXIg PSBjaGlsZEluc3RhbmNlICYmIGNoaWxkSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50Ll9vd25lcjsK KyAgICAgIHZhciBhbmNlc3Rvck93bmVyID0gYW5jZXN0b3JJbnN0YW5jZSAmJiBhbmNlc3Rvcklu c3RhbmNlLl9jdXJyZW50RWxlbWVudC5fb3duZXI7CisKKyAgICAgIHZhciBjaGlsZE93bmVycyA9 IGZpbmRPd25lclN0YWNrKGNoaWxkT3duZXIpOworICAgICAgdmFyIGFuY2VzdG9yT3duZXJzID0g ZmluZE93bmVyU3RhY2soYW5jZXN0b3JPd25lcik7CisKKyAgICAgIHZhciBtaW5TdGFja0xlbiA9 IE1hdGgubWluKGNoaWxkT3duZXJzLmxlbmd0aCwgYW5jZXN0b3JPd25lcnMubGVuZ3RoKTsKKyAg ICAgIHZhciBpOworCisgICAgICB2YXIgZGVlcGVzdENvbW1vbiA9IC0xOworICAgICAgZm9yIChp ID0gMDsgaSA8IG1pblN0YWNrTGVuOyBpKyspIHsKKyAgICAgICAgaWYgKGNoaWxkT3duZXJzW2ld ID09PSBhbmNlc3Rvck93bmVyc1tpXSkgeworICAgICAgICAgIGRlZXBlc3RDb21tb24gPSBpOwor ICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisK KyAgICAgIHZhciBVTktOT1dOID0gJyh1bmtub3duKSc7CisgICAgICB2YXIgY2hpbGRPd25lck5h bWVzID0gY2hpbGRPd25lcnMuc2xpY2UoZGVlcGVzdENvbW1vbiArIDEpLm1hcChmdW5jdGlvbiAo aW5zdCkgeworICAgICAgICByZXR1cm4gaW5zdC5nZXROYW1lKCkgfHwgVU5LTk9XTjsKKyAgICAg IH0pOworICAgICAgdmFyIGFuY2VzdG9yT3duZXJOYW1lcyA9IGFuY2VzdG9yT3duZXJzLnNsaWNl KGRlZXBlc3RDb21tb24gKyAxKS5tYXAoZnVuY3Rpb24gKGluc3QpIHsKKyAgICAgICAgcmV0dXJu IGluc3QuZ2V0TmFtZSgpIHx8IFVOS05PV047CisgICAgICB9KTsKKyAgICAgIHZhciBvd25lcklu Zm8gPSBbXS5jb25jYXQoCisgICAgICAvLyBJZiB0aGUgcGFyZW50IGFuZCBjaGlsZCBpbnN0YW5j ZXMgaGF2ZSBhIGNvbW1vbiBvd25lciBhbmNlc3Rvciwgc3RhcnQKKyAgICAgIC8vIHdpdGggdGhh dCAtLSBvdGhlcndpc2Ugd2UganVzdCBzdGFydCB3aXRoIHRoZSBwYXJlbnQncyBvd25lcnMuCisg ICAgICBkZWVwZXN0Q29tbW9uICE9PSAtMSA/IGNoaWxkT3duZXJzW2RlZXBlc3RDb21tb25dLmdl dE5hbWUoKSB8fCBVTktOT1dOIDogW10sIGFuY2VzdG9yT3duZXJOYW1lcywgYW5jZXN0b3JUYWcs CisgICAgICAvLyBJZiB3ZSdyZSB3YXJuaW5nIGFib3V0IGFuIGludmFsaWQgKG5vbi1wYXJlbnQp IGFuY2VzdHJ5LCBhZGQgJy4uLicKKyAgICAgIGludmFsaWRBbmNlc3RvciA/IFsnLi4uJ10gOiBb XSwgY2hpbGRPd25lck5hbWVzLCBjaGlsZFRhZykuam9pbignID4gJyk7CisKKyAgICAgIHZhciB3 YXJuS2V5ID0gISFpbnZhbGlkUGFyZW50ICsgJ3wnICsgY2hpbGRUYWcgKyAnfCcgKyBhbmNlc3Rv clRhZyArICd8JyArIG93bmVySW5mbzsKKyAgICAgIGlmIChkaWRXYXJuW3dhcm5LZXldKSB7Cisg ICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGRpZFdhcm5bd2FybktleV0gPSB0cnVlOwor CisgICAgICB2YXIgdGFnRGlzcGxheU5hbWUgPSBjaGlsZFRhZzsKKyAgICAgIHZhciB3aGl0ZXNw YWNlSW5mbyA9ICcnOworICAgICAgaWYgKGNoaWxkVGFnID09PSAnI3RleHQnKSB7CisgICAgICAg IGlmICgvXFMvLnRlc3QoY2hpbGRUZXh0KSkgeworICAgICAgICAgIHRhZ0Rpc3BsYXlOYW1lID0g J1RleHQgbm9kZXMnOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRhZ0Rpc3BsYXlOYW1l ID0gJ1doaXRlc3BhY2UgdGV4dCBub2Rlcyc7CisgICAgICAgICAgd2hpdGVzcGFjZUluZm8gPSAn IE1ha2Ugc3VyZSB5b3UgZG9uXCd0IGhhdmUgYW55IGV4dHJhIHdoaXRlc3BhY2UgYmV0d2VlbiB0 YWdzIG9uICcgKyAnZWFjaCBsaW5lIG9mIHlvdXIgc291cmNlIGNvZGUuJzsKKyAgICAgICAgfQor ICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGFnRGlzcGxheU5hbWUgPSAnPCcgKyBjaGlsZFRhZyAr ICc+JzsKKyAgICAgIH0KKworICAgICAgaWYgKGludmFsaWRQYXJlbnQpIHsKKyAgICAgICAgdmFy IGluZm8gPSAnJzsKKyAgICAgICAgaWYgKGFuY2VzdG9yVGFnID09PSAndGFibGUnICYmIGNoaWxk VGFnID09PSAndHInKSB7CisgICAgICAgICAgaW5mbyArPSAnIEFkZCBhIDx0Ym9keT4gdG8geW91 ciBjb2RlIHRvIG1hdGNoIHRoZSBET00gdHJlZSBnZW5lcmF0ZWQgYnkgJyArICd0aGUgYnJvd3Nl ci4nOworICAgICAgICB9CisgICAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/ IHdhcm5pbmcoZmFsc2UsICd2YWxpZGF0ZURPTU5lc3RpbmcoLi4uKTogJXMgY2Fubm90IGFwcGVh ciBhcyBhIGNoaWxkIG9mIDwlcz4uJXMgJyArICdTZWUgJXMuJXMnLCB0YWdEaXNwbGF5TmFtZSwg YW5jZXN0b3JUYWcsIHdoaXRlc3BhY2VJbmZvLCBvd25lckluZm8sIGluZm8pIDogdm9pZCAwOwor ICAgICAgfSBlbHNlIHsKKyAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8g d2FybmluZyhmYWxzZSwgJ3ZhbGlkYXRlRE9NTmVzdGluZyguLi4pOiAlcyBjYW5ub3QgYXBwZWFy IGFzIGEgZGVzY2VuZGFudCBvZiAnICsgJzwlcz4uIFNlZSAlcy4nLCB0YWdEaXNwbGF5TmFtZSwg YW5jZXN0b3JUYWcsIG93bmVySW5mbykgOiB2b2lkIDA7CisgICAgICB9CisgICAgfQorICB9Owor CisgIHZhbGlkYXRlRE9NTmVzdGluZy51cGRhdGVkQW5jZXN0b3JJbmZvID0gdXBkYXRlZEFuY2Vz dG9ySW5mbzsKKworICAvLyBGb3IgdGVzdGluZworICB2YWxpZGF0ZURPTU5lc3RpbmcuaXNUYWdW YWxpZEluQ29udGV4dCA9IGZ1bmN0aW9uICh0YWcsIGFuY2VzdG9ySW5mbykgeworICAgIGFuY2Vz dG9ySW5mbyA9IGFuY2VzdG9ySW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbzsKKyAgICB2YXIgcGFy ZW50SW5mbyA9IGFuY2VzdG9ySW5mby5jdXJyZW50OworICAgIHZhciBwYXJlbnRUYWcgPSBwYXJl bnRJbmZvICYmIHBhcmVudEluZm8udGFnOworICAgIHJldHVybiBpc1RhZ1ZhbGlkV2l0aFBhcmVu dCh0YWcsIHBhcmVudFRhZykgJiYgIWZpbmRJbnZhbGlkQW5jZXN0b3JGb3JUYWcodGFnLCBhbmNl c3RvckluZm8pOworICB9OworfQorCittb2R1bGUuZXhwb3J0cyA9IHZhbGlkYXRlRE9NTmVzdGlu ZzsKK30seyIxNDIiOjE0MiwiMTU3IjoxNTcsIjE1OCI6MTU4fV0sMTMyOltmdW5jdGlvbihfZGVy ZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFj ZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2Ug Y29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhl CisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRy ZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5k IGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisv KiBnbG9iYWxzIFJlYWN0ICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFJlYWN0SW50ZXJuYWxz ID0gUmVhY3QuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklS RUQ7CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RJbnRlcm5hbHMuUmVhY3RDb21wb25lbnRUcmVl SG9vazsKK30se31dLDEzMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioK KyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRz IHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhl IEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSBy b290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50Cisg KiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRo ZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworLyogZ2xvYmFscyBSZWFjdCAqLworCisndXNl IHN0cmljdCc7CisKK3ZhciBSZWFjdEludGVybmFscyA9IFJlYWN0Ll9fU0VDUkVUX0lOVEVSTkFM U19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEOworCittb2R1bGUuZXhwb3J0cyA9IFJl YWN0SW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyOworfSx7fV0sMTM0OltmdW5jdGlvbihfZGVy ZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFj ZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2Ug Y29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhl CisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRy ZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5k IGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisv KiBnbG9iYWxzIFJlYWN0ICovCisKKyd1c2Ugc3RyaWN0JzsKKworbW9kdWxlLmV4cG9ydHMgPSBS ZWFjdDsKK30se31dLDEzNTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisndXNl IHN0cmljdCc7CisKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29r LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9u IDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2Vw dCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNv cHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5z ZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcg b3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0 aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9V VCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9y IGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBn b3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5z ZS4KKyAqCisgKiBAdHlwZWNoZWNrcworICovCisKK3ZhciBlbXB0eUZ1bmN0aW9uID0gX2RlcmVx XygxNDIpOworCisvKioKKyAqIFVwc3RyZWFtIHZlcnNpb24gb2YgZXZlbnQgbGlzdGVuZXIuIERv ZXMgbm90IHRha2UgaW50byBhY2NvdW50IHNwZWNpZmljCisgKiBuYXR1cmUgb2YgcGxhdGZvcm0u CisgKi8KK3ZhciBFdmVudExpc3RlbmVyID0geworICAvKioKKyAgICogTGlzdGVuIHRvIERPTSBl dmVudHMgZHVyaW5nIHRoZSBidWJibGUgcGhhc2UuCisgICAqCisgICAqIEBwYXJhbSB7RE9NRXZl bnRUYXJnZXR9IHRhcmdldCBET00gZWxlbWVudCB0byByZWdpc3RlciBsaXN0ZW5lciBvbi4KKyAg ICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50VHlwZSBFdmVudCB0eXBlLCBlLmcuICdjbGljaycgb3Ig J21vdXNlb3ZlcicuCisgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIGZ1 bmN0aW9uLgorICAgKiBAcmV0dXJuIHtvYmplY3R9IE9iamVjdCB3aXRoIGEgYHJlbW92ZWAgbWV0 aG9kLgorICAgKi8KKyAgbGlzdGVuOiBmdW5jdGlvbiBsaXN0ZW4odGFyZ2V0LCBldmVudFR5cGUs IGNhbGxiYWNrKSB7CisgICAgaWYgKHRhcmdldC5hZGRFdmVudExpc3RlbmVyKSB7CisgICAgICB0 YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGNhbGxiYWNrLCBmYWxzZSk7CisgICAg ICByZXR1cm4geworICAgICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHsKKyAgICAgICAg ICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGNhbGxiYWNrLCBmYWxzZSk7 CisgICAgICAgIH0KKyAgICAgIH07CisgICAgfSBlbHNlIGlmICh0YXJnZXQuYXR0YWNoRXZlbnQp IHsKKyAgICAgIHRhcmdldC5hdHRhY2hFdmVudCgnb24nICsgZXZlbnRUeXBlLCBjYWxsYmFjayk7 CisgICAgICByZXR1cm4geworICAgICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHsKKyAg ICAgICAgICB0YXJnZXQuZGV0YWNoRXZlbnQoJ29uJyArIGV2ZW50VHlwZSwgY2FsbGJhY2spOwor ICAgICAgICB9CisgICAgICB9OworICAgIH0KKyAgfSwKKworICAvKioKKyAgICogTGlzdGVuIHRv IERPTSBldmVudHMgZHVyaW5nIHRoZSBjYXB0dXJlIHBoYXNlLgorICAgKgorICAgKiBAcGFyYW0g e0RPTUV2ZW50VGFyZ2V0fSB0YXJnZXQgRE9NIGVsZW1lbnQgdG8gcmVnaXN0ZXIgbGlzdGVuZXIg b24uCisgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFR5cGUgRXZlbnQgdHlwZSwgZS5nLiAnY2xp Y2snIG9yICdtb3VzZW92ZXInLgorICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxs YmFjayBmdW5jdGlvbi4KKyAgICogQHJldHVybiB7b2JqZWN0fSBPYmplY3Qgd2l0aCBhIGByZW1v dmVgIG1ldGhvZC4KKyAgICovCisgIGNhcHR1cmU6IGZ1bmN0aW9uIGNhcHR1cmUodGFyZ2V0LCBl dmVudFR5cGUsIGNhbGxiYWNrKSB7CisgICAgaWYgKHRhcmdldC5hZGRFdmVudExpc3RlbmVyKSB7 CisgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGNhbGxiYWNrLCB0cnVl KTsKKyAgICAgIHJldHVybiB7CisgICAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkgewor ICAgICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgY2FsbGJhY2ss IHRydWUpOworICAgICAgICB9CisgICAgICB9OworICAgIH0gZWxzZSB7CisgICAgICBpZiAoImRl dmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0F0 dGVtcHRlZCB0byBsaXN0ZW4gdG8gZXZlbnRzIGR1cmluZyB0aGUgY2FwdHVyZSBwaGFzZSBvbiBh ICcgKyAnYnJvd3NlciB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhlIGNhcHR1cmUgcGhhc2UuIFlv dXIgYXBwbGljYXRpb24gJyArICd3aWxsIG5vdCByZWNlaXZlIHNvbWUgZXZlbnRzLicpOworICAg ICAgfQorICAgICAgcmV0dXJuIHsKKyAgICAgICAgcmVtb3ZlOiBlbXB0eUZ1bmN0aW9uCisgICAg ICB9OworICAgIH0KKyAgfSwKKworICByZWdpc3RlckRlZmF1bHQ6IGZ1bmN0aW9uIHJlZ2lzdGVy RGVmYXVsdCgpIHt9Cit9OworCittb2R1bGUuZXhwb3J0cyA9IEV2ZW50TGlzdGVuZXI7Cit9LHsi MTQyIjoxNDJ9XSwxMzY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisg KiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdo dHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0 aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhl IHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQK KyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4g dGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBjYW5V c2VET00gPSAhISh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuZG9jdW1l bnQgJiYgd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpOworCisvKioKKyAqIFNpbXBsZSwg bGlnaHR3ZWlnaHQgbW9kdWxlIGFzc2lzdGluZyB3aXRoIHRoZSBkZXRlY3Rpb24gYW5kIGNvbnRl eHQgb2YKKyAqIFdvcmtlci4gSGVscHMgYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGFuZCBh bGxvd3MgY29kZSB0byByZWFzb24gYWJvdXQKKyAqIHdoZXRoZXIgb3Igbm90IHRoZXkgYXJlIGlu IGEgV29ya2VyLCBldmVuIGlmIHRoZXkgbmV2ZXIgaW5jbHVkZSB0aGUgbWFpbgorICogYFJlYWN0 V29ya2VyYCBkZXBlbmRlbmN5LgorICovCit2YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSB7CisK KyAgY2FuVXNlRE9NOiBjYW5Vc2VET00sCisKKyAgY2FuVXNlV29ya2VyczogdHlwZW9mIFdvcmtl ciAhPT0gJ3VuZGVmaW5lZCcsCisKKyAgY2FuVXNlRXZlbnRMaXN0ZW5lcnM6IGNhblVzZURPTSAm JiAhISh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciB8fCB3aW5kb3cuYXR0YWNoRXZlbnQpLAorCisg IGNhblVzZVZpZXdwb3J0OiBjYW5Vc2VET00gJiYgISF3aW5kb3cuc2NyZWVuLAorCisgIGlzSW5X b3JrZXI6ICFjYW5Vc2VET00gLy8gRm9yIG5vdywgdGhpcyBpcyB0cnVlIC0gbWlnaHQgY2hhbmdl IGluIHRoZSBmdXR1cmUuCisKK307CisKK21vZHVsZS5leHBvcnRzID0gRXhlY3V0aW9uRW52aXJv bm1lbnQ7Cit9LHt9XSwxMzc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworInVz ZSBzdHJpY3QiOworCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9v aywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2Rl IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAq IExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4g QW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4g dGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogQHR5cGVjaGVj a3MKKyAqLworCit2YXIgX2h5cGhlblBhdHRlcm4gPSAvLSguKS9nOworCisvKioKKyAqIENhbWVs Y2FzZXMgYSBoeXBoZW5hdGVkIHN0cmluZywgZm9yIGV4YW1wbGU6CisgKgorICogICA+IGNhbWVs aXplKCdiYWNrZ3JvdW5kLWNvbG9yJykKKyAqICAgPCAiYmFja2dyb3VuZENvbG9yIgorICoKKyAq IEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcKKyAqIEByZXR1cm4ge3N0cmluZ30KKyAqLworZnVuY3Rp b24gY2FtZWxpemUoc3RyaW5nKSB7CisgIHJldHVybiBzdHJpbmcucmVwbGFjZShfaHlwaGVuUGF0 dGVybiwgZnVuY3Rpb24gKF8sIGNoYXJhY3RlcikgeworICAgIHJldHVybiBjaGFyYWN0ZXIudG9V cHBlckNhc2UoKTsKKyAgfSk7Cit9CisKK21vZHVsZS5leHBvcnRzID0gY2FtZWxpemU7Cit9LHt9 XSwxMzg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmln aHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2 ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0 eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGly ZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBh dGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUg ZGlyZWN0b3J5LgorICoKKyAqIEB0eXBlY2hlY2tzCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2 YXIgY2FtZWxpemUgPSBfZGVyZXFfKDEzNyk7CisKK3ZhciBtc1BhdHRlcm4gPSAvXi1tcy0vOwor CisvKioKKyAqIENhbWVsY2FzZXMgYSBoeXBoZW5hdGVkIENTUyBwcm9wZXJ0eSBuYW1lLCBmb3Ig ZXhhbXBsZToKKyAqCisgKiAgID4gY2FtZWxpemVTdHlsZU5hbWUoJ2JhY2tncm91bmQtY29sb3In KQorICogICA8ICJiYWNrZ3JvdW5kQ29sb3IiCisgKiAgID4gY2FtZWxpemVTdHlsZU5hbWUoJy1t b3otdHJhbnNpdGlvbicpCisgKiAgIDwgIk1velRyYW5zaXRpb24iCisgKiAgID4gY2FtZWxpemVT dHlsZU5hbWUoJy1tcy10cmFuc2l0aW9uJykKKyAqICAgPCAibXNUcmFuc2l0aW9uIgorICoKKyAq IEFzIEFuZGkgU21pdGggc3VnZ2VzdHMKKyAqIChodHRwOi8vd3d3LmFuZGlzbWl0aC5jb20vYmxv Zy8yMDEyLzAyL21vZGVybml6ci1wcmVmaXhlZC8pLCBhbiBgLW1zYCBwcmVmaXgKKyAqIGlzIGNv bnZlcnRlZCB0byBsb3dlcmNhc2UgYG1zYC4KKyAqCisgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5n CisgKiBAcmV0dXJuIHtzdHJpbmd9CisgKi8KK2Z1bmN0aW9uIGNhbWVsaXplU3R5bGVOYW1lKHN0 cmluZykgeworICByZXR1cm4gY2FtZWxpemUoc3RyaW5nLnJlcGxhY2UobXNQYXR0ZXJuLCAnbXMt JykpOworfQorCittb2R1bGUuZXhwb3J0cyA9IGNhbWVsaXplU3R5bGVOYW1lOworfSx7IjEzNyI6 MTM3fV0sMTM5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKyd1c2Ugc3RyaWN0 JzsKKworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4K KyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNl bnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNF IGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0 aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRF TlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAorICovCisKK3ZhciBpc1Rl eHROb2RlID0gX2RlcmVxXygxNTIpOworCisvKmVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UgKi8K KworLyoqCisgKiBDaGVja3MgaWYgYSBnaXZlbiBET00gbm9kZSBjb250YWlucyBvciBpcyBhbm90 aGVyIERPTSBub2RlLgorICovCitmdW5jdGlvbiBjb250YWluc05vZGUob3V0ZXJOb2RlLCBpbm5l ck5vZGUpIHsKKyAgaWYgKCFvdXRlck5vZGUgfHwgIWlubmVyTm9kZSkgeworICAgIHJldHVybiBm YWxzZTsKKyAgfSBlbHNlIGlmIChvdXRlck5vZGUgPT09IGlubmVyTm9kZSkgeworICAgIHJldHVy biB0cnVlOworICB9IGVsc2UgaWYgKGlzVGV4dE5vZGUob3V0ZXJOb2RlKSkgeworICAgIHJldHVy biBmYWxzZTsKKyAgfSBlbHNlIGlmIChpc1RleHROb2RlKGlubmVyTm9kZSkpIHsKKyAgICByZXR1 cm4gY29udGFpbnNOb2RlKG91dGVyTm9kZSwgaW5uZXJOb2RlLnBhcmVudE5vZGUpOworICB9IGVs c2UgaWYgKCdjb250YWlucycgaW4gb3V0ZXJOb2RlKSB7CisgICAgcmV0dXJuIG91dGVyTm9kZS5j b250YWlucyhpbm5lck5vZGUpOworICB9IGVsc2UgaWYgKG91dGVyTm9kZS5jb21wYXJlRG9jdW1l bnRQb3NpdGlvbikgeworICAgIHJldHVybiAhIShvdXRlck5vZGUuY29tcGFyZURvY3VtZW50UG9z aXRpb24oaW5uZXJOb2RlKSAmIDE2KTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7Cisg IH0KK30KKworbW9kdWxlLmV4cG9ydHMgPSBjb250YWluc05vZGU7Cit9LHsiMTUyIjoxNTJ9XSwx NDA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworJ3VzZSBzdHJpY3QnOworCisv KioKKyAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxs IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVu ZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBp biB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBn cmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmls ZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogQHR5cGVjaGVja3MKKyAqLworCit2YXIg aW52YXJpYW50ID0gX2RlcmVxXygxNTApOworCisvKioKKyAqIENvbnZlcnQgYXJyYXktbGlrZSBv YmplY3RzIHRvIGFycmF5cy4KKyAqCisgKiBUaGlzIEFQSSBhc3N1bWVzIHRoZSBjYWxsZXIga25v d3MgdGhlIGNvbnRlbnRzIG9mIHRoZSBkYXRhIHR5cGUuIEZvciBsZXNzCisgKiB3ZWxsIGRlZmlu ZWQgaW5wdXRzIHVzZSBjcmVhdGVBcnJheUZyb21NaXhlZC4KKyAqCisgKiBAcGFyYW0ge29iamVj dHxmdW5jdGlvbnxmaWxlbGlzdH0gb2JqCisgKiBAcmV0dXJuIHthcnJheX0KKyAqLworZnVuY3Rp b24gdG9BcnJheShvYmopIHsKKyAgdmFyIGxlbmd0aCA9IG9iai5sZW5ndGg7CisKKyAgLy8gU29t ZSBicm93c2VycyBidWlsdGluIG9iamVjdHMgY2FuIHJlcG9ydCB0eXBlb2YgJ2Z1bmN0aW9uJyAo ZS5nLiBOb2RlTGlzdAorICAvLyBpbiBvbGQgdmVyc2lvbnMgb2YgU2FmYXJpKS4KKyAgISghQXJy YXkuaXNBcnJheShvYmopICYmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyB8fCB0eXBlb2Ygb2Jq ID09PSAnZnVuY3Rpb24nKSkgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZh cmlhbnQoZmFsc2UsICd0b0FycmF5OiBBcnJheS1saWtlIG9iamVjdCBleHBlY3RlZCcpIDogaW52 YXJpYW50KGZhbHNlKSA6IHZvaWQgMDsKKworICAhKHR5cGVvZiBsZW5ndGggPT09ICdudW1iZXIn KSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3Rv QXJyYXk6IE9iamVjdCBuZWVkcyBhIGxlbmd0aCBwcm9wZXJ0eScpIDogaW52YXJpYW50KGZhbHNl KSA6IHZvaWQgMDsKKworICAhKGxlbmd0aCA9PT0gMCB8fCBsZW5ndGggLSAxIGluIG9iaikgPyAi ZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd0b0FycmF5 OiBPYmplY3Qgc2hvdWxkIGhhdmUga2V5cyBmb3IgaW5kaWNlcycpIDogaW52YXJpYW50KGZhbHNl KSA6IHZvaWQgMDsKKworICAhKHR5cGVvZiBvYmouY2FsbGVlICE9PSAnZnVuY3Rpb24nKSA/ICJk ZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3RvQXJyYXk6 IE9iamVjdCBjYW5cJ3QgYmUgYGFyZ3VtZW50c2AuIFVzZSByZXN0IHBhcmFtcyAnICsgJyhmdW5j dGlvbiguLi5hcmdzKSB7fSkgb3IgQXJyYXkuZnJvbSgpIGluc3RlYWQuJykgOiBpbnZhcmlhbnQo ZmFsc2UpIDogdm9pZCAwOworCisgIC8vIE9sZCBJRSBkb2Vzbid0IGdpdmUgY29sbGVjdGlvbnMg YWNjZXNzIHRvIGhhc093blByb3BlcnR5LiBBc3N1bWUgaW5wdXRzCisgIC8vIHdpdGhvdXQgbWV0 aG9kIHdpbGwgdGhyb3cgZHVyaW5nIHRoZSBzbGljZSBjYWxsIGFuZCBza2lwIHN0cmFpZ2h0IHRv IHRoZQorICAvLyBmYWxsYmFjay4KKyAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eSkgeworICAgIHRy eSB7CisgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwob2JqKTsKKyAgICB9 IGNhdGNoIChlKSB7CisgICAgICAvLyBJRSA8IDkgZG9lcyBub3Qgc3VwcG9ydCBBcnJheSNzbGlj ZSBvbiBjb2xsZWN0aW9ucyBvYmplY3RzCisgICAgfQorICB9CisKKyAgLy8gRmFsbCBiYWNrIHRv IGNvcHlpbmcga2V5IGJ5IGtleS4gVGhpcyBhc3N1bWVzIGFsbCBrZXlzIGhhdmUgYSB2YWx1ZSwK KyAgLy8gc28gd2lsbCBub3QgcHJlc2VydmUgc3BhcnNlbHkgcG9wdWxhdGVkIGlucHV0cy4KKyAg dmFyIHJldCA9IEFycmF5KGxlbmd0aCk7CisgIGZvciAodmFyIGlpID0gMDsgaWkgPCBsZW5ndGg7 IGlpKyspIHsKKyAgICByZXRbaWldID0gb2JqW2lpXTsKKyAgfQorICByZXR1cm4gcmV0OworfQor CisvKioKKyAqIFBlcmZvcm0gYSBoZXVyaXN0aWMgdGVzdCB0byBkZXRlcm1pbmUgaWYgYW4gb2Jq ZWN0IGlzICJhcnJheS1saWtlIi4KKyAqCisgKiAgIEEgbW9uayBhc2tlZCBKb3NodSwgYSBaZW4g bWFzdGVyLCAiSGFzIGEgZG9nIEJ1ZGRoYSBuYXR1cmU/IgorICogICBKb3NodSByZXBsaWVkOiAi TXUuIgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiBpdHMgYXJndW1lbnQgaGFz ICJhcnJheSBuYXR1cmUiOiBpdCByZXR1cm5zCisgKiB0cnVlIGlmIHRoZSBhcmd1bWVudCBpcyBh biBhY3R1YWwgYXJyYXksIGFuIGBhcmd1bWVudHMnIG9iamVjdCwgb3IgYW4KKyAqIEhUTUxDb2xs ZWN0aW9uIChlLmcuIG5vZGUuY2hpbGROb2RlcyBvciBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1l KCkpLgorICoKKyAqIEl0IHdpbGwgcmV0dXJuIGZhbHNlIGZvciBvdGhlciBhcnJheS1saWtlIG9i amVjdHMgbGlrZSBGaWxlbGlzdC4KKyAqCisgKiBAcGFyYW0geyp9IG9iagorICogQHJldHVybiB7 Ym9vbGVhbn0KKyAqLworZnVuY3Rpb24gaGFzQXJyYXlOYXR1cmUob2JqKSB7CisgIHJldHVybiAo CisgICAgLy8gbm90IG51bGwvZmFsc2UKKyAgICAhIW9iaiAmJiAoCisgICAgLy8gYXJyYXlzIGFy ZSBvYmplY3RzLCBOb2RlTGlzdHMgYXJlIGZ1bmN0aW9ucyBpbiBTYWZhcmkKKyAgICB0eXBlb2Yg b2JqID09ICdvYmplY3QnIHx8IHR5cGVvZiBvYmogPT0gJ2Z1bmN0aW9uJykgJiYKKyAgICAvLyBx dWFja3MgbGlrZSBhbiBhcnJheQorICAgICdsZW5ndGgnIGluIG9iaiAmJgorICAgIC8vIG5vdCB3 aW5kb3cKKyAgICAhKCdzZXRJbnRlcnZhbCcgaW4gb2JqKSAmJgorICAgIC8vIG5vIERPTSBub2Rl IHNob3VsZCBiZSBjb25zaWRlcmVkIGFuIGFycmF5LWxpa2UKKyAgICAvLyBhICdzZWxlY3QnIGVs ZW1lbnQgaGFzICdsZW5ndGgnIGFuZCAnaXRlbScgcHJvcGVydGllcyBvbiBJRTgKKyAgICB0eXBl b2Ygb2JqLm5vZGVUeXBlICE9ICdudW1iZXInICYmICgKKyAgICAvLyBhIHJlYWwgYXJyYXkKKyAg ICBBcnJheS5pc0FycmF5KG9iaikgfHwKKyAgICAvLyBhcmd1bWVudHMKKyAgICAnY2FsbGVlJyBp biBvYmogfHwKKyAgICAvLyBIVE1MQ29sbGVjdGlvbi9Ob2RlTGlzdAorICAgICdpdGVtJyBpbiBv YmopCisgICk7Cit9CisKKy8qKgorICogRW5zdXJlIHRoYXQgdGhlIGFyZ3VtZW50IGlzIGFuIGFy cmF5IGJ5IHdyYXBwaW5nIGl0IGluIGFuIGFycmF5IGlmIGl0IGlzIG5vdC4KKyAqIENyZWF0ZXMg YSBjb3B5IG9mIHRoZSBhcmd1bWVudCBpZiBpdCBpcyBhbHJlYWR5IGFuIGFycmF5LgorICoKKyAq IFRoaXMgaXMgbW9zdGx5IHVzZWZ1bCBpZGlvbWF0aWNhbGx5OgorICoKKyAqICAgdmFyIGNyZWF0 ZUFycmF5RnJvbU1peGVkID0gcmVxdWlyZSgnY3JlYXRlQXJyYXlGcm9tTWl4ZWQnKTsKKyAqCisg KiAgIGZ1bmN0aW9uIHRha2VzT25lT3JNb3JlVGhpbmdzKHRoaW5ncykgeworICogICAgIHRoaW5n cyA9IGNyZWF0ZUFycmF5RnJvbU1peGVkKHRoaW5ncyk7CisgKiAgICAgLi4uCisgKiAgIH0KKyAq CisgKiBUaGlzIGFsbG93cyB5b3UgdG8gdHJlYXQgYHRoaW5ncycgYXMgYW4gYXJyYXksIGJ1dCBh Y2NlcHQgc2NhbGFycyBpbiB0aGUgQVBJLgorICoKKyAqIElmIHlvdSBuZWVkIHRvIGNvbnZlcnQg YW4gYXJyYXktbGlrZSBvYmplY3QsIGxpa2UgYGFyZ3VtZW50c2AsIGludG8gYW4gYXJyYXkKKyAq IHVzZSB0b0FycmF5IGluc3RlYWQuCisgKgorICogQHBhcmFtIHsqfSBvYmoKKyAqIEByZXR1cm4g e2FycmF5fQorICovCitmdW5jdGlvbiBjcmVhdGVBcnJheUZyb21NaXhlZChvYmopIHsKKyAgaWYg KCFoYXNBcnJheU5hdHVyZShvYmopKSB7CisgICAgcmV0dXJuIFtvYmpdOworICB9IGVsc2UgaWYg KEFycmF5LmlzQXJyYXkob2JqKSkgeworICAgIHJldHVybiBvYmouc2xpY2UoKTsKKyAgfSBlbHNl IHsKKyAgICByZXR1cm4gdG9BcnJheShvYmopOworICB9Cit9CisKK21vZHVsZS5leHBvcnRzID0g Y3JlYXRlQXJyYXlGcm9tTWl4ZWQ7Cit9LHsiMTUwIjoxNTB9XSwxNDE6W2Z1bmN0aW9uKF9kZXJl cV8sbW9kdWxlLGV4cG9ydHMpeworJ3VzZSBzdHJpY3QnOworCisvKioKKyAqIENvcHlyaWdodCAo YykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4K KyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUg bGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rv cnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50 IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJl Y3RvcnkuCisgKgorICogQHR5cGVjaGVja3MKKyAqLworCisvKmVzbGludC1kaXNhYmxlIGZiLXd3 dy91bnNhZmUtaHRtbCovCisKK3ZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IF9kZXJlcV8oMTM2 KTsKKwordmFyIGNyZWF0ZUFycmF5RnJvbU1peGVkID0gX2RlcmVxXygxNDApOwordmFyIGdldE1h cmt1cFdyYXAgPSBfZGVyZXFfKDE0Nik7Cit2YXIgaW52YXJpYW50ID0gX2RlcmVxXygxNTApOwor CisvKioKKyAqIER1bW15IGNvbnRhaW5lciB1c2VkIHRvIHJlbmRlciBhbGwgbWFya3VwLgorICov Cit2YXIgZHVtbXlOb2RlID0gRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NID8gZG9jdW1l bnQuY3JlYXRlRWxlbWVudCgnZGl2JykgOiBudWxsOworCisvKioKKyAqIFBhdHRlcm4gdXNlZCBi eSBgZ2V0Tm9kZU5hbWVgLgorICovCit2YXIgbm9kZU5hbWVQYXR0ZXJuID0gL15ccyo8KFx3Kykv OworCisvKioKKyAqIEV4dHJhY3RzIHRoZSBgbm9kZU5hbWVgIG9mIHRoZSBmaXJzdCBlbGVtZW50 IGluIGEgc3RyaW5nIG9mIG1hcmt1cC4KKyAqCisgKiBAcGFyYW0ge3N0cmluZ30gbWFya3VwIFN0 cmluZyBvZiBtYXJrdXAuCisgKiBAcmV0dXJuIHs/c3RyaW5nfSBOb2RlIG5hbWUgb2YgdGhlIHN1 cHBsaWVkIG1hcmt1cC4KKyAqLworZnVuY3Rpb24gZ2V0Tm9kZU5hbWUobWFya3VwKSB7CisgIHZh ciBub2RlTmFtZU1hdGNoID0gbWFya3VwLm1hdGNoKG5vZGVOYW1lUGF0dGVybik7CisgIHJldHVy biBub2RlTmFtZU1hdGNoICYmIG5vZGVOYW1lTWF0Y2hbMV0udG9Mb3dlckNhc2UoKTsKK30KKwor LyoqCisgKiBDcmVhdGVzIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG5vZGVzIHJlbmRlcmVkIGZy b20gdGhlIHN1cHBsaWVkIG1hcmt1cC4gVGhlCisgKiBvcHRpb25hbGx5IHN1cHBsaWVkIGBoYW5k bGVTY3JpcHRgIGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZCBvbmNlIGZvciBlYWNoCisgKiA8c2Ny aXB0PiBlbGVtZW50IHRoYXQgaXMgcmVuZGVyZWQuIElmIG5vIGBoYW5kbGVTY3JpcHRgIGZ1bmN0 aW9uIGlzIHN1cHBsaWVkLAorICogYW4gZXhjZXB0aW9uIGlzIHRocm93biBpZiBhbnkgPHNjcmlw dD4gZWxlbWVudHMgYXJlIHJlbmRlcmVkLgorICoKKyAqIEBwYXJhbSB7c3RyaW5nfSBtYXJrdXAg QSBzdHJpbmcgb2YgdmFsaWQgSFRNTCBtYXJrdXAuCisgKiBAcGFyYW0gez9mdW5jdGlvbn0gaGFu ZGxlU2NyaXB0IEludm9rZWQgb25jZSBmb3IgZWFjaCByZW5kZXJlZCA8c2NyaXB0Pi4KKyAqIEBy ZXR1cm4ge2FycmF5PERPTUVsZW1lbnR8RE9NVGV4dE5vZGU+fSBBbiBhcnJheSBvZiByZW5kZXJl ZCBub2Rlcy4KKyAqLworZnVuY3Rpb24gY3JlYXRlTm9kZXNGcm9tTWFya3VwKG1hcmt1cCwgaGFu ZGxlU2NyaXB0KSB7CisgIHZhciBub2RlID0gZHVtbXlOb2RlOworICAhISFkdW1teU5vZGUgPyAi ZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdjcmVhdGVO b2Rlc0Zyb21NYXJrdXAgZHVtbXkgbm90IGluaXRpYWxpemVkJykgOiBpbnZhcmlhbnQoZmFsc2Up IDogdm9pZCAwOworICB2YXIgbm9kZU5hbWUgPSBnZXROb2RlTmFtZShtYXJrdXApOworCisgIHZh ciB3cmFwID0gbm9kZU5hbWUgJiYgZ2V0TWFya3VwV3JhcChub2RlTmFtZSk7CisgIGlmICh3cmFw KSB7CisgICAgbm9kZS5pbm5lckhUTUwgPSB3cmFwWzFdICsgbWFya3VwICsgd3JhcFsyXTsKKwor ICAgIHZhciB3cmFwRGVwdGggPSB3cmFwWzBdOworICAgIHdoaWxlICh3cmFwRGVwdGgtLSkgewor ICAgICAgbm9kZSA9IG5vZGUubGFzdENoaWxkOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBub2Rl LmlubmVySFRNTCA9IG1hcmt1cDsKKyAgfQorCisgIHZhciBzY3JpcHRzID0gbm9kZS5nZXRFbGVt ZW50c0J5VGFnTmFtZSgnc2NyaXB0Jyk7CisgIGlmIChzY3JpcHRzLmxlbmd0aCkgeworICAgICFo YW5kbGVTY3JpcHQgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQo ZmFsc2UsICdjcmVhdGVOb2Rlc0Zyb21NYXJrdXAoLi4uKTogVW5leHBlY3RlZCA8c2NyaXB0PiBl bGVtZW50IHJlbmRlcmVkLicpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDsKKyAgICBjcmVh dGVBcnJheUZyb21NaXhlZChzY3JpcHRzKS5mb3JFYWNoKGhhbmRsZVNjcmlwdCk7CisgIH0KKwor ICB2YXIgbm9kZXMgPSBBcnJheS5mcm9tKG5vZGUuY2hpbGROb2Rlcyk7CisgIHdoaWxlIChub2Rl Lmxhc3RDaGlsZCkgeworICAgIG5vZGUucmVtb3ZlQ2hpbGQobm9kZS5sYXN0Q2hpbGQpOworICB9 CisgIHJldHVybiBub2RlczsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVOb2Rlc0Zyb21N YXJrdXA7Cit9LHsiMTM2IjoxMzYsIjE0MCI6MTQwLCIxNDYiOjE0NiwiMTUwIjoxNTB9XSwxNDI6 W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworInVzZSBzdHJpY3QiOworCisvKioK KyAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJp Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVy IHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0 aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFu dAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBp biB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogCisgKi8KKworZnVuY3Rpb24gbWFrZUVtcHR5 RnVuY3Rpb24oYXJnKSB7CisgIHJldHVybiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIGFyZzsK KyAgfTsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGFjY2VwdHMgYW5kIGRpc2NhcmRzIGlu cHV0czsgaXQgaGFzIG5vIHNpZGUgZWZmZWN0cy4gVGhpcyBpcworICogcHJpbWFyaWx5IHVzZWZ1 bCBpZGlvbWF0aWNhbGx5IGZvciBvdmVycmlkYWJsZSBmdW5jdGlvbiBlbmRwb2ludHMgd2hpY2gK KyAqIGFsd2F5cyBuZWVkIHRvIGJlIGNhbGxhYmxlLCBzaW5jZSBKUyBsYWNrcyBhIG51bGwtY2Fs bCBpZGlvbSBhbGEgQ29jb2EuCisgKi8KK3ZhciBlbXB0eUZ1bmN0aW9uID0gZnVuY3Rpb24gZW1w dHlGdW5jdGlvbigpIHt9OworCitlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zID0gbWFrZUVtcHR5 RnVuY3Rpb247CitlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zRmFsc2UgPSBtYWtlRW1wdHlGdW5j dGlvbihmYWxzZSk7CitlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zVHJ1ZSA9IG1ha2VFbXB0eUZ1 bmN0aW9uKHRydWUpOworZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc051bGwgPSBtYWtlRW1wdHlG dW5jdGlvbihudWxsKTsKK2VtcHR5RnVuY3Rpb24udGhhdFJldHVybnNUaGlzID0gZnVuY3Rpb24g KCkgeworICByZXR1cm4gdGhpczsKK307CitlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zQXJndW1l bnQgPSBmdW5jdGlvbiAoYXJnKSB7CisgIHJldHVybiBhcmc7Cit9OworCittb2R1bGUuZXhwb3J0 cyA9IGVtcHR5RnVuY3Rpb247Cit9LHt9XSwxNDM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4 cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIElu Yy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBs aWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNF TlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFk ZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQ QVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmlj dCc7CisKK3ZhciBlbXB0eU9iamVjdCA9IHt9OworCitpZiAoImRldmVsb3BtZW50IiAhPT0gJ3By b2R1Y3Rpb24nKSB7CisgIE9iamVjdC5mcmVlemUoZW1wdHlPYmplY3QpOworfQorCittb2R1bGUu ZXhwb3J0cyA9IGVtcHR5T2JqZWN0OworfSx7fV0sMTQ0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVs ZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29r LCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUg aXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICog TElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBB biBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0 aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBz dHJpY3QnOworCisvKioKKyAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZSBpbnB1dC90ZXh0YXJl YSB0byBmb2N1cworICovCisKK2Z1bmN0aW9uIGZvY3VzTm9kZShub2RlKSB7CisgIC8vIElFOCBj YW4gdGhyb3cgIkNhbid0IG1vdmUgZm9jdXMgdG8gdGhlIGNvbnRyb2wgYmVjYXVzZSBpdCBpcyBp bnZpc2libGUsCisgIC8vIG5vdCBlbmFibGVkLCBvciBvZiBhIHR5cGUgdGhhdCBkb2VzIG5vdCBh Y2NlcHQgdGhlIGZvY3VzLiIgZm9yIGFsbCBraW5kcyBvZgorICAvLyByZWFzb25zIHRoYXQgYXJl IHRvbyBleHBlbnNpdmUgYW5kIGZyYWdpbGUgdG8gdGVzdC4KKyAgdHJ5IHsKKyAgICBub2RlLmZv Y3VzKCk7CisgIH0gY2F0Y2ggKGUpIHt9Cit9CisKK21vZHVsZS5leHBvcnRzID0gZm9jdXNOb2Rl OworfSx7fV0sMTQ1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKyd1c2Ugc3Ry aWN0JzsKKworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIElu Yy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBs aWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNF TlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFk ZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQ QVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIEB0eXBlY2hlY2tzCisg Ki8KKworLyogZXNsaW50LWRpc2FibGUgZmItd3d3L3R5cGVvZi11bmRlZmluZWQgKi8KKworLyoq CisgKiBTYW1lIGFzIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYnV0IHdyYXBzIGluIGEgdHJ5LWNh dGNoIGJsb2NrLiBJbiBJRSBpdCBpcworICogbm90IHNhZmUgdG8gY2FsbCBkb2N1bWVudC5hY3Rp dmVFbGVtZW50IGlmIHRoZXJlIGlzIG5vdGhpbmcgZm9jdXNlZC4KKyAqCisgKiBUaGUgYWN0aXZl RWxlbWVudCB3aWxsIGJlIG51bGwgb25seSBpZiB0aGUgZG9jdW1lbnQgb3IgZG9jdW1lbnQgYm9k eSBpcyBub3QKKyAqIHlldCBkZWZpbmVkLgorICovCitmdW5jdGlvbiBnZXRBY3RpdmVFbGVtZW50 KCkgLyo/RE9NRWxlbWVudCoveworICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVk JykgeworICAgIHJldHVybiBudWxsOworICB9CisgIHRyeSB7CisgICAgcmV0dXJuIGRvY3VtZW50 LmFjdGl2ZUVsZW1lbnQgfHwgZG9jdW1lbnQuYm9keTsKKyAgfSBjYXRjaCAoZSkgeworICAgIHJl dHVybiBkb2N1bWVudC5ib2R5OworICB9Cit9CisKK21vZHVsZS5leHBvcnRzID0gZ2V0QWN0aXZl RWxlbWVudDsKK30se31dLDE0NjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7Cisn dXNlIHN0cmljdCc7CisKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vi b29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNv ZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQor ICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVl LiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBp biB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworLypl c2xpbnQtZGlzYWJsZSBmYi13d3cvdW5zYWZlLWh0bWwgKi8KKwordmFyIEV4ZWN1dGlvbkVudmly b25tZW50ID0gX2RlcmVxXygxMzYpOworCit2YXIgaW52YXJpYW50ID0gX2RlcmVxXygxNTApOwor CisvKioKKyAqIER1bW15IGNvbnRhaW5lciB1c2VkIHRvIGRldGVjdCB3aGljaCB3cmFwcyBhcmUg bmVjZXNzYXJ5LgorICovCit2YXIgZHVtbXlOb2RlID0gRXhlY3V0aW9uRW52aXJvbm1lbnQuY2Fu VXNlRE9NID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykgOiBudWxsOworCisvKioKKyAq IFNvbWUgYnJvd3NlcnMgY2Fubm90IHVzZSBgaW5uZXJIVE1MYCB0byByZW5kZXIgY2VydGFpbiBl bGVtZW50cyBzdGFuZGFsb25lLAorICogc28gd2Ugd3JhcCB0aGVtLCByZW5kZXIgdGhlIHdyYXBw ZWQgbm9kZXMsIHRoZW4gZXh0cmFjdCB0aGUgZGVzaXJlZCBub2RlLgorICoKKyAqIEluIElFOCwg Y2VydGFpbiBlbGVtZW50cyBjYW5ub3QgcmVuZGVyIGFsb25lLCBzbyB3cmFwIGFsbCBlbGVtZW50 cyAoJyonKS4KKyAqLworCit2YXIgc2hvdWxkV3JhcCA9IHt9OworCit2YXIgc2VsZWN0V3JhcCA9 IFsxLCAnPHNlbGVjdCBtdWx0aXBsZT0idHJ1ZSI+JywgJzwvc2VsZWN0PiddOwordmFyIHRhYmxl V3JhcCA9IFsxLCAnPHRhYmxlPicsICc8L3RhYmxlPiddOwordmFyIHRyV3JhcCA9IFszLCAnPHRh YmxlPjx0Ym9keT48dHI+JywgJzwvdHI+PC90Ym9keT48L3RhYmxlPiddOworCit2YXIgc3ZnV3Jh cCA9IFsxLCAnPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPicsICc8L3N2 Zz4nXTsKKwordmFyIG1hcmt1cFdyYXAgPSB7CisgICcqJzogWzEsICc/PGRpdj4nLCAnPC9kaXY+ J10sCisKKyAgJ2FyZWEnOiBbMSwgJzxtYXA+JywgJzwvbWFwPiddLAorICAnY29sJzogWzIsICc8 dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPicsICc8L2NvbGdyb3VwPjwvdGFibGU+J10s CisgICdsZWdlbmQnOiBbMSwgJzxmaWVsZHNldD4nLCAnPC9maWVsZHNldD4nXSwKKyAgJ3BhcmFt JzogWzEsICc8b2JqZWN0PicsICc8L29iamVjdD4nXSwKKyAgJ3RyJzogWzIsICc8dGFibGU+PHRi b2R5PicsICc8L3Rib2R5PjwvdGFibGU+J10sCisKKyAgJ29wdGdyb3VwJzogc2VsZWN0V3JhcCwK KyAgJ29wdGlvbic6IHNlbGVjdFdyYXAsCisKKyAgJ2NhcHRpb24nOiB0YWJsZVdyYXAsCisgICdj b2xncm91cCc6IHRhYmxlV3JhcCwKKyAgJ3Rib2R5JzogdGFibGVXcmFwLAorICAndGZvb3QnOiB0 YWJsZVdyYXAsCisgICd0aGVhZCc6IHRhYmxlV3JhcCwKKworICAndGQnOiB0cldyYXAsCisgICd0 aCc6IHRyV3JhcAorfTsKKworLy8gSW5pdGlhbGl6ZSB0aGUgU1ZHIGVsZW1lbnRzIHNpbmNlIHdl IGtub3cgdGhleSdsbCBhbHdheXMgbmVlZCB0byBiZSB3cmFwcGVkCisvLyBjb25zaXN0ZW50bHku IElmIHRoZXkgYXJlIGNyZWF0ZWQgaW5zaWRlIGEgPGRpdj4gdGhleSB3aWxsIGJlIGluaXRpYWxp emVkIGluCisvLyB0aGUgd3JvbmcgbmFtZXNwYWNlIChhbmQgd2lsbCBub3QgZGlzcGxheSkuCit2 YXIgc3ZnRWxlbWVudHMgPSBbJ2NpcmNsZScsICdjbGlwUGF0aCcsICdkZWZzJywgJ2VsbGlwc2Un LCAnZycsICdpbWFnZScsICdsaW5lJywgJ2xpbmVhckdyYWRpZW50JywgJ21hc2snLCAncGF0aCcs ICdwYXR0ZXJuJywgJ3BvbHlnb24nLCAncG9seWxpbmUnLCAncmFkaWFsR3JhZGllbnQnLCAncmVj dCcsICdzdG9wJywgJ3RleHQnLCAndHNwYW4nXTsKK3N2Z0VsZW1lbnRzLmZvckVhY2goZnVuY3Rp b24gKG5vZGVOYW1lKSB7CisgIG1hcmt1cFdyYXBbbm9kZU5hbWVdID0gc3ZnV3JhcDsKKyAgc2hv dWxkV3JhcFtub2RlTmFtZV0gPSB0cnVlOworfSk7CisKKy8qKgorICogR2V0cyB0aGUgbWFya3Vw IHdyYXAgY29uZmlndXJhdGlvbiBmb3IgdGhlIHN1cHBsaWVkIGBub2RlTmFtZWAuCisgKgorICog Tk9URTogVGhpcyBsYXppbHkgZGV0ZWN0cyB3aGljaCB3cmFwcyBhcmUgbmVjZXNzYXJ5IGZvciB0 aGUgY3VycmVudCBicm93c2VyLgorICoKKyAqIEBwYXJhbSB7c3RyaW5nfSBub2RlTmFtZSBMb3dl cmNhc2UgYG5vZGVOYW1lYC4KKyAqIEByZXR1cm4gez9hcnJheX0gTWFya3VwIHdyYXAgY29uZmln dXJhdGlvbiwgaWYgYXBwbGljYWJsZS4KKyAqLworZnVuY3Rpb24gZ2V0TWFya3VwV3JhcChub2Rl TmFtZSkgeworICAhISFkdW1teU5vZGUgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicg PyBpbnZhcmlhbnQoZmFsc2UsICdNYXJrdXAgd3JhcHBpbmcgbm9kZSBub3QgaW5pdGlhbGl6ZWQn KSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7CisgIGlmICghbWFya3VwV3JhcC5oYXNPd25Q cm9wZXJ0eShub2RlTmFtZSkpIHsKKyAgICBub2RlTmFtZSA9ICcqJzsKKyAgfQorICBpZiAoIXNo b3VsZFdyYXAuaGFzT3duUHJvcGVydHkobm9kZU5hbWUpKSB7CisgICAgaWYgKG5vZGVOYW1lID09 PSAnKicpIHsKKyAgICAgIGR1bW15Tm9kZS5pbm5lckhUTUwgPSAnPGxpbmsgLz4nOworICAgIH0g ZWxzZSB7CisgICAgICBkdW1teU5vZGUuaW5uZXJIVE1MID0gJzwnICsgbm9kZU5hbWUgKyAnPjwv JyArIG5vZGVOYW1lICsgJz4nOworICAgIH0KKyAgICBzaG91bGRXcmFwW25vZGVOYW1lXSA9ICFk dW1teU5vZGUuZmlyc3RDaGlsZDsKKyAgfQorICByZXR1cm4gc2hvdWxkV3JhcFtub2RlTmFtZV0g PyBtYXJrdXBXcmFwW25vZGVOYW1lXSA6IG51bGw7Cit9CisKK21vZHVsZS5leHBvcnRzID0gZ2V0 TWFya3VwV3JhcDsKK30seyIxMzYiOjEzNiwiMTUwIjoxNTB9XSwxNDc6W2Z1bmN0aW9uKF9kZXJl cV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwg RmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3Vy Y2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4g dGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNl IHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZv dW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIEB0 eXBlY2hlY2tzCisgKi8KKworJ3VzZSBzdHJpY3QnOworCisvKioKKyAqIEdldHMgdGhlIHNjcm9s bCBwb3NpdGlvbiBvZiB0aGUgc3VwcGxpZWQgZWxlbWVudCBvciB3aW5kb3cuCisgKgorICogVGhl IHJldHVybiB2YWx1ZXMgYXJlIHVuYm91bmRlZCwgdW5saWtlIGBnZXRTY3JvbGxQb3NpdGlvbmAu IFRoaXMgbWVhbnMgdGhleQorICogbWF5IGJlIG5lZ2F0aXZlIG9yIGV4Y2VlZCB0aGUgZWxlbWVu dCBib3VuZGFyaWVzICh3aGljaCBpcyBwb3NzaWJsZSB1c2luZworICogaW5lcnRpYWwgc2Nyb2xs aW5nKS4KKyAqCisgKiBAcGFyYW0ge0RPTVdpbmRvd3xET01FbGVtZW50fSBzY3JvbGxhYmxlCisg KiBAcmV0dXJuIHtvYmplY3R9IE1hcCB3aXRoIGB4YCBhbmQgYHlgIGtleXMuCisgKi8KKworZnVu Y3Rpb24gZ2V0VW5ib3VuZGVkU2Nyb2xsUG9zaXRpb24oc2Nyb2xsYWJsZSkgeworICBpZiAoc2Ny b2xsYWJsZSA9PT0gd2luZG93KSB7CisgICAgcmV0dXJuIHsKKyAgICAgIHg6IHdpbmRvdy5wYWdl WE9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCwKKyAgICAgIHk6 IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9w CisgICAgfTsKKyAgfQorICByZXR1cm4geworICAgIHg6IHNjcm9sbGFibGUuc2Nyb2xsTGVmdCwK KyAgICB5OiBzY3JvbGxhYmxlLnNjcm9sbFRvcAorICB9OworfQorCittb2R1bGUuZXhwb3J0cyA9 IGdldFVuYm91bmRlZFNjcm9sbFBvc2l0aW9uOworfSx7fV0sMTQ4OltmdW5jdGlvbihfZGVyZXFf LG1vZHVsZSxleHBvcnRzKXsKKyd1c2Ugc3RyaWN0JzsKKworLyoqCisgKiBDb3B5cmlnaHQgKGMp IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg KgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxp Y2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5 IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCBy aWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0 b3J5LgorICoKKyAqIEB0eXBlY2hlY2tzCisgKi8KKwordmFyIF91cHBlcmNhc2VQYXR0ZXJuID0g LyhbQS1aXSkvZzsKKworLyoqCisgKiBIeXBoZW5hdGVzIGEgY2FtZWxjYXNlZCBzdHJpbmcsIGZv ciBleGFtcGxlOgorICoKKyAqICAgPiBoeXBoZW5hdGUoJ2JhY2tncm91bmRDb2xvcicpCisgKiAg IDwgImJhY2tncm91bmQtY29sb3IiCisgKgorICogRm9yIENTUyBzdHlsZSBuYW1lcywgdXNlIGBo eXBoZW5hdGVTdHlsZU5hbWVgIGluc3RlYWQgd2hpY2ggd29ya3MgcHJvcGVybHkKKyAqIHdpdGgg YWxsIHZlbmRvciBwcmVmaXhlcywgaW5jbHVkaW5nIGBtc2AuCisgKgorICogQHBhcmFtIHtzdHJp bmd9IHN0cmluZworICogQHJldHVybiB7c3RyaW5nfQorICovCitmdW5jdGlvbiBoeXBoZW5hdGUo c3RyaW5nKSB7CisgIHJldHVybiBzdHJpbmcucmVwbGFjZShfdXBwZXJjYXNlUGF0dGVybiwgJy0k MScpLnRvTG93ZXJDYXNlKCk7Cit9CisKK21vZHVsZS5leHBvcnRzID0gaHlwaGVuYXRlOworfSx7 fV0sMTQ5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJp Z2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2Vy dmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1z dHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRp cmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBw YXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1l IGRpcmVjdG9yeS4KKyAqCisgKiBAdHlwZWNoZWNrcworICovCisKKyd1c2Ugc3RyaWN0JzsKKwor dmFyIGh5cGhlbmF0ZSA9IF9kZXJlcV8oMTQ4KTsKKwordmFyIG1zUGF0dGVybiA9IC9ebXMtLzsK KworLyoqCisgKiBIeXBoZW5hdGVzIGEgY2FtZWxjYXNlZCBDU1MgcHJvcGVydHkgbmFtZSwgZm9y IGV4YW1wbGU6CisgKgorICogICA+IGh5cGhlbmF0ZVN0eWxlTmFtZSgnYmFja2dyb3VuZENvbG9y JykKKyAqICAgPCAiYmFja2dyb3VuZC1jb2xvciIKKyAqICAgPiBoeXBoZW5hdGVTdHlsZU5hbWUo J01velRyYW5zaXRpb24nKQorICogICA8ICItbW96LXRyYW5zaXRpb24iCisgKiAgID4gaHlwaGVu YXRlU3R5bGVOYW1lKCdtc1RyYW5zaXRpb24nKQorICogICA8ICItbXMtdHJhbnNpdGlvbiIKKyAq CisgKiBBcyBNb2Rlcm5penIgc3VnZ2VzdHMgKGh0dHA6Ly9tb2Rlcm5penIuY29tL2RvY3MvI3By ZWZpeGVkKSwgYW4gYG1zYCBwcmVmaXgKKyAqIGlzIGNvbnZlcnRlZCB0byBgLW1zLWAuCisgKgor ICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZworICogQHJldHVybiB7c3RyaW5nfQorICovCitmdW5j dGlvbiBoeXBoZW5hdGVTdHlsZU5hbWUoc3RyaW5nKSB7CisgIHJldHVybiBoeXBoZW5hdGUoc3Ry aW5nKS5yZXBsYWNlKG1zUGF0dGVybiwgJy1tcy0nKTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBo eXBoZW5hdGVTdHlsZU5hbWU7Cit9LHsiMTQ4IjoxNDh9XSwxNTA6W2Z1bmN0aW9uKF9kZXJlcV8s bW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFj ZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2Ug Y29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhl CisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRy ZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5k IGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisn dXNlIHN0cmljdCc7CisKKy8qKgorICogVXNlIGludmFyaWFudCgpIHRvIGFzc2VydCBzdGF0ZSB3 aGljaCB5b3VyIHByb2dyYW0gYXNzdW1lcyB0byBiZSB0cnVlLgorICoKKyAqIFByb3ZpZGUgc3By aW50Zi1zdHlsZSBmb3JtYXQgKG9ubHkgJXMgaXMgc3VwcG9ydGVkKSBhbmQgYXJndW1lbnRzCisg KiB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgYnJva2UgYW5kIHdoYXQgeW91IHdl cmUKKyAqIGV4cGVjdGluZy4KKyAqCisgKiBUaGUgaW52YXJpYW50IG1lc3NhZ2Ugd2lsbCBiZSBz dHJpcHBlZCBpbiBwcm9kdWN0aW9uLCBidXQgdGhlIGludmFyaWFudAorICogd2lsbCByZW1haW4g dG8gZW5zdXJlIGxvZ2ljIGRvZXMgbm90IGRpZmZlciBpbiBwcm9kdWN0aW9uLgorICovCisKK3Zh ciB2YWxpZGF0ZUZvcm1hdCA9IGZ1bmN0aW9uIHZhbGlkYXRlRm9ybWF0KGZvcm1hdCkge307CisK K2lmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgdmFsaWRhdGVGb3JtYXQg PSBmdW5jdGlvbiB2YWxpZGF0ZUZvcm1hdChmb3JtYXQpIHsKKyAgICBpZiAoZm9ybWF0ID09PSB1 bmRlZmluZWQpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcignaW52YXJpYW50IHJlcXVpcmVzIGFu IGVycm9yIG1lc3NhZ2UgYXJndW1lbnQnKTsKKyAgICB9CisgIH07Cit9CisKK2Z1bmN0aW9uIGlu dmFyaWFudChjb25kaXRpb24sIGZvcm1hdCwgYSwgYiwgYywgZCwgZSwgZikgeworICB2YWxpZGF0 ZUZvcm1hdChmb3JtYXQpOworCisgIGlmICghY29uZGl0aW9uKSB7CisgICAgdmFyIGVycm9yOwor ICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkgeworICAgICAgZXJyb3IgPSBuZXcgRXJyb3Io J01pbmlmaWVkIGV4Y2VwdGlvbiBvY2N1cnJlZDsgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVu dmlyb25tZW50ICcgKyAnZm9yIHRoZSBmdWxsIGVycm9yIG1lc3NhZ2UgYW5kIGFkZGl0aW9uYWwg aGVscGZ1bCB3YXJuaW5ncy4nKTsKKyAgICB9IGVsc2UgeworICAgICAgdmFyIGFyZ3MgPSBbYSwg YiwgYywgZCwgZSwgZl07CisgICAgICB2YXIgYXJnSW5kZXggPSAwOworICAgICAgZXJyb3IgPSBu ZXcgRXJyb3IoZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0 dXJuIGFyZ3NbYXJnSW5kZXgrK107CisgICAgICB9KSk7CisgICAgICBlcnJvci5uYW1lID0gJ0lu dmFyaWFudCBWaW9sYXRpb24nOworICAgIH0KKworICAgIGVycm9yLmZyYW1lc1RvUG9wID0gMTsg Ly8gd2UgZG9uJ3QgY2FyZSBhYm91dCBpbnZhcmlhbnQncyBvd24gZnJhbWUKKyAgICB0aHJvdyBl cnJvcjsKKyAgfQorfQorCittb2R1bGUuZXhwb3J0cyA9IGludmFyaWFudDsKK30se31dLDE1MTpb ZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisndXNlIHN0cmljdCc7CisKKy8qKgor ICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmln aHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIg dGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRo ZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50 CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGlu IHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiBAdHlwZWNoZWNrcworICovCisKKy8qKgorICog QHBhcmFtIHsqfSBvYmplY3QgVGhlIG9iamVjdCB0byBjaGVjay4KKyAqIEByZXR1cm4ge2Jvb2xl YW59IFdoZXRoZXIgb3Igbm90IHRoZSBvYmplY3QgaXMgYSBET00gbm9kZS4KKyAqLworZnVuY3Rp b24gaXNOb2RlKG9iamVjdCkgeworICByZXR1cm4gISEob2JqZWN0ICYmICh0eXBlb2YgTm9kZSA9 PT0gJ2Z1bmN0aW9uJyA/IG9iamVjdCBpbnN0YW5jZW9mIE5vZGUgOiB0eXBlb2Ygb2JqZWN0ID09 PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb2JqZWN0Lm5vZGVUeXBlID09PSAnbnVtYmVyJyAmJiB0eXBl b2Ygb2JqZWN0Lm5vZGVOYW1lID09PSAnc3RyaW5nJykpOworfQorCittb2R1bGUuZXhwb3J0cyA9 IGlzTm9kZTsKK30se31dLDE1MjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7Cisn dXNlIHN0cmljdCc7CisKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vi b29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNv ZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQor ICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVl LiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBp biB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiBAdHlwZWNo ZWNrcworICovCisKK3ZhciBpc05vZGUgPSBfZGVyZXFfKDE1MSk7CisKKy8qKgorICogQHBhcmFt IHsqfSBvYmplY3QgVGhlIG9iamVjdCB0byBjaGVjay4KKyAqIEByZXR1cm4ge2Jvb2xlYW59IFdo ZXRoZXIgb3Igbm90IHRoZSBvYmplY3QgaXMgYSBET00gdGV4dCBub2RlLgorICovCitmdW5jdGlv biBpc1RleHROb2RlKG9iamVjdCkgeworICByZXR1cm4gaXNOb2RlKG9iamVjdCkgJiYgb2JqZWN0 Lm5vZGVUeXBlID09IDM7Cit9CisKK21vZHVsZS5leHBvcnRzID0gaXNUZXh0Tm9kZTsKK30seyIx NTEiOjE1MX1dLDE1MzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAq IENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0 cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRo ZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUg cm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAor ICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0 aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogCisgKiBAdHlwZWNoZWNrcyBzdGF0aWMtb25seQor ICovCisKKyd1c2Ugc3RyaWN0JzsKKworLyoqCisgKiBNZW1vaXplcyB0aGUgcmV0dXJuIHZhbHVl IG9mIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIG9uZSBzdHJpbmcgYXJndW1lbnQuCisgKi8KKwor ZnVuY3Rpb24gbWVtb2l6ZVN0cmluZ09ubHkoY2FsbGJhY2spIHsKKyAgdmFyIGNhY2hlID0ge307 CisgIHJldHVybiBmdW5jdGlvbiAoc3RyaW5nKSB7CisgICAgaWYgKCFjYWNoZS5oYXNPd25Qcm9w ZXJ0eShzdHJpbmcpKSB7CisgICAgICBjYWNoZVtzdHJpbmddID0gY2FsbGJhY2suY2FsbCh0aGlz LCBzdHJpbmcpOworICAgIH0KKyAgICByZXR1cm4gY2FjaGVbc3RyaW5nXTsKKyAgfTsKK30KKwor bW9kdWxlLmV4cG9ydHMgPSBtZW1vaXplU3RyaW5nT25seTsKK30se31dLDE1NDpbZnVuY3Rpb24o X2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVz ZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlz IHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3Vu ZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBz b3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4g YmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgor ICogQHR5cGVjaGVja3MKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBFeGVjdXRpb25FbnZp cm9ubWVudCA9IF9kZXJlcV8oMTM2KTsKKwordmFyIHBlcmZvcm1hbmNlOworCitpZiAoRXhlY3V0 aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NKSB7CisgIHBlcmZvcm1hbmNlID0gd2luZG93LnBlcmZv cm1hbmNlIHx8IHdpbmRvdy5tc1BlcmZvcm1hbmNlIHx8IHdpbmRvdy53ZWJraXRQZXJmb3JtYW5j ZTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBwZXJmb3JtYW5jZSB8fCB7fTsKK30seyIxMzYiOjEz Nn1dLDE1NTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisndXNlIHN0cmljdCc7 CisKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisg KiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5z ZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBm aWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlv bmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5U UyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiBAdHlwZWNoZWNrcworICovCisK K3ZhciBwZXJmb3JtYW5jZSA9IF9kZXJlcV8oMTU0KTsKKwordmFyIHBlcmZvcm1hbmNlTm93Owor CisvKioKKyAqIERldGVjdCBpZiB3ZSBjYW4gdXNlIGB3aW5kb3cucGVyZm9ybWFuY2Uubm93KClg IGFuZCBncmFjZWZ1bGx5IGZhbGxiYWNrIHRvCisgKiBgRGF0ZS5ub3coKWAgaWYgaXQgZG9lc24n dCBleGlzdC4gV2UgbmVlZCB0byBzdXBwb3J0IEZpcmVmb3ggPCAxNSBmb3Igbm93CisgKiBiZWNh dXNlIG9mIEZhY2Vib29rJ3MgdGVzdGluZyBpbmZyYXN0cnVjdHVyZS4KKyAqLworaWYgKHBlcmZv cm1hbmNlLm5vdykgeworICBwZXJmb3JtYW5jZU5vdyA9IGZ1bmN0aW9uIHBlcmZvcm1hbmNlTm93 KCkgeworICAgIHJldHVybiBwZXJmb3JtYW5jZS5ub3coKTsKKyAgfTsKK30gZWxzZSB7CisgIHBl cmZvcm1hbmNlTm93ID0gZnVuY3Rpb24gcGVyZm9ybWFuY2VOb3coKSB7CisgICAgcmV0dXJuIERh dGUubm93KCk7CisgIH07Cit9CisKK21vZHVsZS5leHBvcnRzID0gcGVyZm9ybWFuY2VOb3c7Cit9 LHsiMTU0IjoxNTR9XSwxNTY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoq CisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCBy aWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRl ciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4g dGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3Jh bnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUg aW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIEB0eXBlY2hlY2tzCisgKiAKKyAqLworCisv KmVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSAqLworCisndXNlIHN0cmljdCc7CisKK3Zh ciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CisKKy8q KgorICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1 bWVycyBzaGlwIHRoZWlyIG93bgorICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4t VVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lz CisgKi8KK2Z1bmN0aW9uIGlzKHgsIHkpIHsKKyAgLy8gU2FtZVZhbHVlIGFsZ29yaXRobQorICBp ZiAoeCA9PT0geSkgeworICAgIC8vIFN0ZXBzIDEtNSwgNy0xMAorICAgIC8vIFN0ZXBzIDYuYi02 LmU6ICswICE9IC0wCisgICAgLy8gQWRkZWQgdGhlIG5vbnplcm8geSBjaGVjayB0byBtYWtlIEZs b3cgaGFwcHksIGJ1dCBpdCBpcyByZWR1bmRhbnQKKyAgICByZXR1cm4geCAhPT0gMCB8fCB5ICE9 PSAwIHx8IDEgLyB4ID09PSAxIC8geTsKKyAgfSBlbHNlIHsKKyAgICAvLyBTdGVwIDYuYTogTmFO ID09IE5hTgorICAgIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHk7CisgIH0KK30KKworLyoqCisg KiBQZXJmb3JtcyBlcXVhbGl0eSBieSBpdGVyYXRpbmcgdGhyb3VnaCBrZXlzIG9uIGFuIG9iamVj dCBhbmQgcmV0dXJuaW5nIGZhbHNlCisgKiB3aGVuIGFueSBrZXkgaGFzIHZhbHVlcyB3aGljaCBh cmUgbm90IHN0cmljdGx5IGVxdWFsIGJldHdlZW4gdGhlIGFyZ3VtZW50cy4KKyAqIFJldHVybnMg dHJ1ZSB3aGVuIHRoZSB2YWx1ZXMgb2YgYWxsIGtleXMgYXJlIHN0cmljdGx5IGVxdWFsLgorICov CitmdW5jdGlvbiBzaGFsbG93RXF1YWwob2JqQSwgb2JqQikgeworICBpZiAoaXMob2JqQSwgb2Jq QikpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGlmICh0eXBlb2Ygb2JqQSAhPT0gJ29i amVjdCcgfHwgb2JqQSA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqQiAhPT0gJ29iamVjdCcgfHwgb2Jq QiA9PT0gbnVsbCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZhciBrZXlzQSA9IE9i amVjdC5rZXlzKG9iakEpOworICB2YXIga2V5c0IgPSBPYmplY3Qua2V5cyhvYmpCKTsKKworICBp ZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHsKKyAgICByZXR1cm4gZmFsc2U7Cisg IH0KKworICAvLyBUZXN0IGZvciBBJ3Mga2V5cyBkaWZmZXJlbnQgZnJvbSBCLgorICBmb3IgKHZh ciBpID0gMDsgaSA8IGtleXNBLmxlbmd0aDsgaSsrKSB7CisgICAgaWYgKCFoYXNPd25Qcm9wZXJ0 eS5jYWxsKG9iakIsIGtleXNBW2ldKSB8fCAhaXMob2JqQVtrZXlzQVtpXV0sIG9iakJba2V5c0Fb aV1dKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVl OworfQorCittb2R1bGUuZXhwb3J0cyA9IHNoYWxsb3dFcXVhbDsKK30se31dLDE1NzpbZnVuY3Rp b24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDE0LTIwMTUs IEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291 cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGlu IHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJj ZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBm b3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8K KworJ3VzZSBzdHJpY3QnOworCit2YXIgZW1wdHlGdW5jdGlvbiA9IF9kZXJlcV8oMTQyKTsKKwor LyoqCisgKiBTaW1pbGFyIHRvIGludmFyaWFudCBidXQgb25seSBsb2dzIGEgd2FybmluZyBpZiB0 aGUgY29uZGl0aW9uIGlzIG5vdCBtZXQuCisgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGxvZyBpc3N1 ZXMgaW4gZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzIGluIGNyaXRpY2FsCisgKiBwYXRocy4gUmVt b3ZpbmcgdGhlIGxvZ2dpbmcgY29kZSBmb3IgcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMgd2lsbCBr ZWVwIHRoZQorICogc2FtZSBsb2dpYyBhbmQgZm9sbG93IHRoZSBzYW1lIGNvZGUgcGF0aHMuCisg Ki8KKwordmFyIHdhcm5pbmcgPSBlbXB0eUZ1bmN0aW9uOworCitpZiAoImRldmVsb3BtZW50IiAh PT0gJ3Byb2R1Y3Rpb24nKSB7CisgIChmdW5jdGlvbiAoKSB7CisgICAgdmFyIHByaW50V2Fybmlu ZyA9IGZ1bmN0aW9uIHByaW50V2FybmluZyhmb3JtYXQpIHsKKyAgICAgIGZvciAodmFyIF9sZW4g PSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDAp LCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykgeworICAgICAgICBhcmdzW19rZXkgLSAx XSA9IGFyZ3VtZW50c1tfa2V5XTsKKyAgICAgIH0KKworICAgICAgdmFyIGFyZ0luZGV4ID0gMDsK KyAgICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgKyBmb3JtYXQucmVwbGFjZSgvJXMvZywg ZnVuY3Rpb24gKCkgeworICAgICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTsKKyAgICAgIH0p OworICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykgeworICAgICAgICBj b25zb2xlLmVycm9yKG1lc3NhZ2UpOworICAgICAgfQorICAgICAgdHJ5IHsKKyAgICAgICAgLy8g LS0tIFdlbGNvbWUgdG8gZGVidWdnaW5nIFJlYWN0IC0tLQorICAgICAgICAvLyBUaGlzIGVycm9y IHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3Rh Y2sKKyAgICAgICAgLy8gdG8gZmluZCB0aGUgY2FsbHNpdGUgdGhhdCBjYXVzZWQgdGhpcyB3YXJu aW5nIHRvIGZpcmUuCisgICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTsKKyAgICAgIH0g Y2F0Y2ggKHgpIHt9CisgICAgfTsKKworICAgIHdhcm5pbmcgPSBmdW5jdGlvbiB3YXJuaW5nKGNv bmRpdGlvbiwgZm9ybWF0KSB7CisgICAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHsKKyAg ICAgICAgdGhyb3cgbmV3IEVycm9yKCdgd2FybmluZyhjb25kaXRpb24sIGZvcm1hdCwgLi4uYXJn cylgIHJlcXVpcmVzIGEgd2FybmluZyAnICsgJ21lc3NhZ2UgYXJndW1lbnQnKTsKKyAgICAgIH0K KworICAgICAgaWYgKGZvcm1hdC5pbmRleE9mKCdGYWlsZWQgQ29tcG9zaXRlIHByb3BUeXBlOiAn KSA9PT0gMCkgeworICAgICAgICByZXR1cm47IC8vIElnbm9yZSBDb21wb3NpdGVDb21wb25lbnQg cHJvcHR5cGUgY2hlY2suCisgICAgICB9CisKKyAgICAgIGlmICghY29uZGl0aW9uKSB7CisgICAg ICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4y ID4gMiA/IF9sZW4yIC0gMiA6IDApLCBfa2V5MiA9IDI7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKysp IHsKKyAgICAgICAgICBhcmdzW19rZXkyIC0gMl0gPSBhcmd1bWVudHNbX2tleTJdOworICAgICAg ICB9CisKKyAgICAgICAgcHJpbnRXYXJuaW5nLmFwcGx5KHVuZGVmaW5lZCwgW2Zvcm1hdF0uY29u Y2F0KGFyZ3MpKTsKKyAgICAgIH0KKyAgICB9OworICB9KSgpOworfQorCittb2R1bGUuZXhwb3J0 cyA9IHdhcm5pbmc7Cit9LHsiMTQyIjoxNDJ9XSwxNTg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxl LGV4cG9ydHMpeworJ3VzZSBzdHJpY3QnOworLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZh cnMgKi8KK3ZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVy dHk7Cit2YXIgcHJvcElzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0Vu dW1lcmFibGU7CisKK2Z1bmN0aW9uIHRvT2JqZWN0KHZhbCkgeworCWlmICh2YWwgPT09IG51bGwg fHwgdmFsID09PSB1bmRlZmluZWQpIHsKKwkJdGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmFz c2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQnKTsKKwl9CisKKwly ZXR1cm4gT2JqZWN0KHZhbCk7Cit9CisKK2Z1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHsKKwl0 cnkgeworCQlpZiAoIU9iamVjdC5hc3NpZ24pIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJ CS8vIERldGVjdCBidWdneSBwcm9wZXJ0eSBlbnVtZXJhdGlvbiBvcmRlciBpbiBvbGRlciBWOCB2 ZXJzaW9ucy4KKworCQkvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2Rl dGFpbD9pZD00MTE4CisJCXZhciB0ZXN0MSA9IG5ldyBTdHJpbmcoJ2FiYycpOyAgLy8gZXNsaW50 LWRpc2FibGUtbGluZQorCQl0ZXN0MVs1XSA9ICdkZSc7CisJCWlmIChPYmplY3QuZ2V0T3duUHJv cGVydHlOYW1lcyh0ZXN0MSlbMF0gPT09ICc1JykgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisK KwkJLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1 NgorCQl2YXIgdGVzdDIgPSB7fTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJ CQl0ZXN0MlsnXycgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7CisJCX0KKwkJdmFyIG9y ZGVyMiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QyKS5tYXAoZnVuY3Rpb24gKG4p IHsKKwkJCXJldHVybiB0ZXN0MltuXTsKKwkJfSk7CisJCWlmIChvcmRlcjIuam9pbignJykgIT09 ICcwMTIzNDU2Nzg5JykgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLy8gaHR0cHM6Ly9i dWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NgorCQl2YXIgdGVzdDMg PSB7fTsKKwkJJ2FiY2RlZmdoaWprbG1ub3BxcnN0Jy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlv biAobGV0dGVyKSB7CisJCQl0ZXN0M1tsZXR0ZXJdID0gbGV0dGVyOworCQl9KTsKKwkJaWYgKE9i amVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sIHRlc3QzKSkuam9pbignJykgIT09CisJCQkJJ2Fi Y2RlZmdoaWprbG1ub3BxcnN0JykgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJu IHRydWU7CisJfSBjYXRjaCAoZSkgeworCQkvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBh Ym92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLgorCQlyZXR1cm4gZmFsc2U7CisJ fQorfQorCittb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2ln biA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkgeworCXZhciBmcm9tOworCXZhciB0byA9IHRv T2JqZWN0KHRhcmdldCk7CisJdmFyIHN5bWJvbHM7CisKKwlmb3IgKHZhciBzID0gMTsgcyA8IGFy Z3VtZW50cy5sZW5ndGg7IHMrKykgeworCQlmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7CisK KwkJZm9yICh2YXIga2V5IGluIGZyb20pIHsKKwkJCWlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGZy b20sIGtleSkpIHsKKwkJCQl0b1trZXldID0gZnJvbVtrZXldOworCQkJfQorCQl9CisKKwkJaWYg KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsKKwkJCXN5bWJvbHMgPSBPYmplY3QuZ2V0 T3duUHJvcGVydHlTeW1ib2xzKGZyb20pOworCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzeW1ib2xz Lmxlbmd0aDsgaSsrKSB7CisJCQkJaWYgKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLCBzeW1i b2xzW2ldKSkgeworCQkJCQl0b1tzeW1ib2xzW2ldXSA9IGZyb21bc3ltYm9sc1tpXV07CisJCQkJ fQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHRvOworfTsKKworfSx7fV19LHt9LFs0OF0pKDQ4 KQorfSk7Cit9KTsKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3Qt ZG9tL2Rpc3QvcmVhY3QtZG9tLm1pbi5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVh Y3QtZG9tL2Rpc3QvcmVhY3QtZG9tLm1pbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwMC4uNDgwYzdmOWUKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMv dmVuZG9yL3JlYWN0LWRvbS9kaXN0L3JlYWN0LWRvbS5taW4uanMKQEAgLTAsMCArMSwxNSBAQAor LyoqCisgKiBSZWFjdERPTSB2MTUuNC4yCisgKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwg RmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3Vy Y2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4g dGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNl IHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZv dW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLwor IWZ1bmN0aW9uKGUpe2lmKCJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPXR5 cGVvZiBtb2R1bGUpbW9kdWxlLmV4cG9ydHM9ZShyZXF1aXJlKCJyZWFjdCIpKTtlbHNlIGlmKCJm dW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQpZGVmaW5lKFsicmVhY3QiXSxlKTtl bHNle3ZhciB0O3Q9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQi IT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp0aGlz LHQuUmVhY3RET009ZSh0LlJlYWN0KX19KGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihlKXty ZXR1cm4gZSgpfShmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBv KGEscyl7aWYoIW5bYV0pe2lmKCF0W2FdKXt2YXIgdT0iZnVuY3Rpb24iPT10eXBlb2YgcmVxdWly ZSYmcmVxdWlyZTtpZighcyYmdSlyZXR1cm4gdShhLCEwKTtpZihpKXJldHVybiBpKGEsITApO3Zh ciBsPW5ldyBFcnJvcigiQ2Fubm90IGZpbmQgbW9kdWxlICciK2ErIiciKTt0aHJvdyBsLmNvZGU9 Ik1PRFVMRV9OT1RfRk9VTkQiLGx9dmFyIGM9blthXT17ZXhwb3J0czp7fX07dFthXVswXS5jYWxs KGMuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W2FdWzFdW2VdO3JldHVybiBvKG4/bjplKX0s YyxjLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bYV0uZXhwb3J0c31mb3IodmFyIGk9ImZ1bmN0 aW9uIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsYT0wO2E8ci5sZW5ndGg7YSsrKW8oclthXSk7 cmV0dXJuIG99KHsxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXtQcm9wZXJ0 aWVzOnsiYXJpYS1jdXJyZW50IjowLCJhcmlhLWRldGFpbHMiOjAsImFyaWEtZGlzYWJsZWQiOjAs ImFyaWEtaGlkZGVuIjowLCJhcmlhLWludmFsaWQiOjAsImFyaWEta2V5c2hvcnRjdXRzIjowLCJh cmlhLWxhYmVsIjowLCJhcmlhLXJvbGVkZXNjcmlwdGlvbiI6MCwiYXJpYS1hdXRvY29tcGxldGUi OjAsImFyaWEtY2hlY2tlZCI6MCwiYXJpYS1leHBhbmRlZCI6MCwiYXJpYS1oYXNwb3B1cCI6MCwi YXJpYS1sZXZlbCI6MCwiYXJpYS1tb2RhbCI6MCwiYXJpYS1tdWx0aWxpbmUiOjAsImFyaWEtbXVs dGlzZWxlY3RhYmxlIjowLCJhcmlhLW9yaWVudGF0aW9uIjowLCJhcmlhLXBsYWNlaG9sZGVyIjow LCJhcmlhLXByZXNzZWQiOjAsImFyaWEtcmVhZG9ubHkiOjAsImFyaWEtcmVxdWlyZWQiOjAsImFy aWEtc2VsZWN0ZWQiOjAsImFyaWEtc29ydCI6MCwiYXJpYS12YWx1ZW1heCI6MCwiYXJpYS12YWx1 ZW1pbiI6MCwiYXJpYS12YWx1ZW5vdyI6MCwiYXJpYS12YWx1ZXRleHQiOjAsImFyaWEtYXRvbWlj IjowLCJhcmlhLWJ1c3kiOjAsImFyaWEtbGl2ZSI6MCwiYXJpYS1yZWxldmFudCI6MCwiYXJpYS1k cm9wZWZmZWN0IjowLCJhcmlhLWdyYWJiZWQiOjAsImFyaWEtYWN0aXZlZGVzY2VuZGFudCI6MCwi YXJpYS1jb2xjb3VudCI6MCwiYXJpYS1jb2xpbmRleCI6MCwiYXJpYS1jb2xzcGFuIjowLCJhcmlh LWNvbnRyb2xzIjowLCJhcmlhLWRlc2NyaWJlZGJ5IjowLCJhcmlhLWVycm9ybWVzc2FnZSI6MCwi YXJpYS1mbG93dG8iOjAsImFyaWEtbGFiZWxsZWRieSI6MCwiYXJpYS1vd25zIjowLCJhcmlhLXBv c2luc2V0IjowLCJhcmlhLXJvd2NvdW50IjowLCJhcmlhLXJvd2luZGV4IjowLCJhcmlhLXJvd3Nw YW4iOjAsImFyaWEtc2V0c2l6ZSI6MH0sRE9NQXR0cmlidXRlTmFtZXM6e30sRE9NUHJvcGVydHlO YW1lczp7fX07dC5leHBvcnRzPXJ9LHt9XSwyOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3Qi O3ZhciByPWUoMzMpLG89ZSgxMzEpLGk9e2ZvY3VzRE9NQ29tcG9uZW50OmZ1bmN0aW9uKCl7byhy LmdldE5vZGVGcm9tSW5zdGFuY2UodGhpcykpfX07dC5leHBvcnRzPWl9LHsxMzE6MTMxLDMzOjMz fV0sMzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7dmFyIGU9d2lu ZG93Lm9wZXJhO3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUu dmVyc2lvbiYmcGFyc2VJbnQoZS52ZXJzaW9uKCksMTApPD0xMn1mdW5jdGlvbiBvKGUpe3JldHVy bihlLmN0cmxLZXl8fGUuYWx0S2V5fHxlLm1ldGFLZXkpJiYhKGUuY3RybEtleSYmZS5hbHRLZXkp fWZ1bmN0aW9uIGkoZSl7c3dpdGNoKGUpe2Nhc2UidG9wQ29tcG9zaXRpb25TdGFydCI6cmV0dXJu IGsuY29tcG9zaXRpb25TdGFydDtjYXNlInRvcENvbXBvc2l0aW9uRW5kIjpyZXR1cm4gay5jb21w b3NpdGlvbkVuZDtjYXNlInRvcENvbXBvc2l0aW9uVXBkYXRlIjpyZXR1cm4gay5jb21wb3NpdGlv blVwZGF0ZX19ZnVuY3Rpb24gYShlLHQpe3JldHVybiJ0b3BLZXlEb3duIj09PWUmJnQua2V5Q29k ZT09PV99ZnVuY3Rpb24gcyhlLHQpe3N3aXRjaChlKXtjYXNlInRvcEtleVVwIjpyZXR1cm4geS5p bmRleE9mKHQua2V5Q29kZSkhPT0tMTtjYXNlInRvcEtleURvd24iOnJldHVybiB0LmtleUNvZGUh PT1fO2Nhc2UidG9wS2V5UHJlc3MiOmNhc2UidG9wTW91c2VEb3duIjpjYXNlInRvcEJsdXIiOnJl dHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fWZ1bmN0aW9uIHUoZSl7dmFyIHQ9ZS5kZXRhaWw7cmV0 dXJuIm9iamVjdCI9PXR5cGVvZiB0JiYiZGF0YSJpbiB0P3QuZGF0YTpudWxsfWZ1bmN0aW9uIGwo ZSx0LG4scil7dmFyIG8sbDtpZihDP289aShlKTpOP3MoZSxuKSYmKG89ay5jb21wb3NpdGlvbkVu ZCk6YShlLG4pJiYobz1rLmNvbXBvc2l0aW9uU3RhcnQpLCFvKXJldHVybiBudWxsO3gmJihOfHxv IT09ay5jb21wb3NpdGlvblN0YXJ0P289PT1rLmNvbXBvc2l0aW9uRW5kJiZOJiYobD1OLmdldERh dGEoKSk6Tj1tLmdldFBvb2xlZChyKSk7dmFyIGM9di5nZXRQb29sZWQobyx0LG4scik7aWYobClj LmRhdGE9bDtlbHNle3ZhciBwPXUobik7bnVsbCE9PXAmJihjLmRhdGE9cCl9cmV0dXJuIGYuYWNj dW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyhjKSxjfWZ1bmN0aW9uIGMoZSx0KXtzd2l0Y2goZSl7 Y2FzZSJ0b3BDb21wb3NpdGlvbkVuZCI6cmV0dXJuIHUodCk7Y2FzZSJ0b3BLZXlQcmVzcyI6dmFy IG49dC53aGljaDtyZXR1cm4gbiE9PXc/bnVsbDooUD0hMCxUKTtjYXNlInRvcFRleHRJbnB1dCI6 dmFyIHI9dC5kYXRhO3JldHVybiByPT09VCYmUD9udWxsOnI7ZGVmYXVsdDpyZXR1cm4gbnVsbH19 ZnVuY3Rpb24gcChlLHQpe2lmKE4pe2lmKCJ0b3BDb21wb3NpdGlvbkVuZCI9PT1lfHwhQyYmcyhl LHQpKXt2YXIgbj1OLmdldERhdGEoKTtyZXR1cm4gbS5yZWxlYXNlKE4pLE49bnVsbCxufXJldHVy biBudWxsfXN3aXRjaChlKXtjYXNlInRvcFBhc3RlIjpyZXR1cm4gbnVsbDtjYXNlInRvcEtleVBy ZXNzIjpyZXR1cm4gdC53aGljaCYmIW8odCk/U3RyaW5nLmZyb21DaGFyQ29kZSh0LndoaWNoKTpu dWxsO2Nhc2UidG9wQ29tcG9zaXRpb25FbmQiOnJldHVybiB4P251bGw6dC5kYXRhO2RlZmF1bHQ6 cmV0dXJuIG51bGx9fWZ1bmN0aW9uIGQoZSx0LG4scil7dmFyIG87aWYobz1FP2MoZSxuKTpwKGUs biksIW8pcmV0dXJuIG51bGw7dmFyIGk9Zy5nZXRQb29sZWQoay5iZWZvcmVJbnB1dCx0LG4scik7 cmV0dXJuIGkuZGF0YT1vLGYuYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyhpKSxpfXZhciBm PWUoMTkpLGg9ZSgxMjMpLG09ZSgyMCksdj1lKDc4KSxnPWUoODIpLHk9WzksMTMsMjcsMzJdLF89 MjI5LEM9aC5jYW5Vc2VET00mJiJDb21wb3NpdGlvbkV2ZW50ImluIHdpbmRvdyxiPW51bGw7aC5j YW5Vc2VET00mJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQmJihiPWRvY3VtZW50LmRvY3VtZW50 TW9kZSk7dmFyIEU9aC5jYW5Vc2VET00mJiJUZXh0RXZlbnQiaW4gd2luZG93JiYhYiYmIXIoKSx4 PWguY2FuVXNlRE9NJiYoIUN8fGImJmI+OCYmYjw9MTEpLHc9MzIsVD1TdHJpbmcuZnJvbUNoYXJD b2RlKHcpLGs9e2JlZm9yZUlucHV0OntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDoi b25CZWZvcmVJbnB1dCIsY2FwdHVyZWQ6Im9uQmVmb3JlSW5wdXRDYXB0dXJlIn0sZGVwZW5kZW5j aWVzOlsidG9wQ29tcG9zaXRpb25FbmQiLCJ0b3BLZXlQcmVzcyIsInRvcFRleHRJbnB1dCIsInRv cFBhc3RlIl19LGNvbXBvc2l0aW9uRW5kOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxl ZDoib25Db21wb3NpdGlvbkVuZCIsY2FwdHVyZWQ6Im9uQ29tcG9zaXRpb25FbmRDYXB0dXJlIn0s ZGVwZW5kZW5jaWVzOlsidG9wQmx1ciIsInRvcENvbXBvc2l0aW9uRW5kIiwidG9wS2V5RG93biIs InRvcEtleVByZXNzIiwidG9wS2V5VXAiLCJ0b3BNb3VzZURvd24iXX0sY29tcG9zaXRpb25TdGFy dDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Im9uQ29tcG9zaXRpb25TdGFydCIs Y2FwdHVyZWQ6Im9uQ29tcG9zaXRpb25TdGFydENhcHR1cmUifSxkZXBlbmRlbmNpZXM6WyJ0b3BC bHVyIiwidG9wQ29tcG9zaXRpb25TdGFydCIsInRvcEtleURvd24iLCJ0b3BLZXlQcmVzcyIsInRv cEtleVVwIiwidG9wTW91c2VEb3duIl19LGNvbXBvc2l0aW9uVXBkYXRlOntwaGFzZWRSZWdpc3Ry YXRpb25OYW1lczp7YnViYmxlZDoib25Db21wb3NpdGlvblVwZGF0ZSIsY2FwdHVyZWQ6Im9uQ29t cG9zaXRpb25VcGRhdGVDYXB0dXJlIn0sZGVwZW5kZW5jaWVzOlsidG9wQmx1ciIsInRvcENvbXBv c2l0aW9uVXBkYXRlIiwidG9wS2V5RG93biIsInRvcEtleVByZXNzIiwidG9wS2V5VXAiLCJ0b3BN b3VzZURvd24iXX19LFA9ITEsTj1udWxsLFM9e2V2ZW50VHlwZXM6ayxleHRyYWN0RXZlbnRzOmZ1 bmN0aW9uKGUsdCxuLHIpe3JldHVybltsKGUsdCxuLHIpLGQoZSx0LG4scildfX07dC5leHBvcnRz PVN9LHsxMjM6MTIzLDE5OjE5LDIwOjIwLDc4Ojc4LDgyOjgyfV0sNDpbZnVuY3Rpb24oZSx0LG4p eyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIGUrdC5jaGFyQXQoMCkudG9VcHBl ckNhc2UoKSt0LnN1YnN0cmluZygxKX12YXIgbz17YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAs Ym9yZGVySW1hZ2VPdXRzZXQ6ITAsYm9yZGVySW1hZ2VTbGljZTohMCxib3JkZXJJbWFnZVdpZHRo OiEwLGJveEZsZXg6ITAsYm94RmxleEdyb3VwOiEwLGJveE9yZGluYWxHcm91cDohMCxjb2x1bW5D b3VudDohMCxmbGV4OiEwLGZsZXhHcm93OiEwLGZsZXhQb3NpdGl2ZTohMCxmbGV4U2hyaW5rOiEw LGZsZXhOZWdhdGl2ZTohMCxmbGV4T3JkZXI6ITAsZ3JpZFJvdzohMCxncmlkQ29sdW1uOiEwLGZv bnRXZWlnaHQ6ITAsbGluZUNsYW1wOiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjoh MCxvcnBoYW5zOiEwLHRhYlNpemU6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwLGZpbGxP cGFjaXR5OiEwLGZsb29kT3BhY2l0eTohMCxzdG9wT3BhY2l0eTohMCxzdHJva2VEYXNoYXJyYXk6 ITAsc3Ryb2tlRGFzaG9mZnNldDohMCxzdHJva2VNaXRlcmxpbWl0OiEwLHN0cm9rZU9wYWNpdHk6 ITAsc3Ryb2tlV2lkdGg6ITB9LGk9WyJXZWJraXQiLCJtcyIsIk1veiIsIk8iXTtPYmplY3Qua2V5 cyhvKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2kuZm9yRWFjaChmdW5jdGlvbih0KXtvW3IodCxlKV09 b1tlXX0pfSk7dmFyIGE9e2JhY2tncm91bmQ6e2JhY2tncm91bmRBdHRhY2htZW50OiEwLGJhY2tn cm91bmRDb2xvcjohMCxiYWNrZ3JvdW5kSW1hZ2U6ITAsYmFja2dyb3VuZFBvc2l0aW9uWDohMCxi YWNrZ3JvdW5kUG9zaXRpb25ZOiEwLGJhY2tncm91bmRSZXBlYXQ6ITB9LGJhY2tncm91bmRQb3Np dGlvbjp7YmFja2dyb3VuZFBvc2l0aW9uWDohMCxiYWNrZ3JvdW5kUG9zaXRpb25ZOiEwfSxib3Jk ZXI6e2JvcmRlcldpZHRoOiEwLGJvcmRlclN0eWxlOiEwLGJvcmRlckNvbG9yOiEwfSxib3JkZXJC b3R0b206e2JvcmRlckJvdHRvbVdpZHRoOiEwLGJvcmRlckJvdHRvbVN0eWxlOiEwLGJvcmRlckJv dHRvbUNvbG9yOiEwfSxib3JkZXJMZWZ0Ontib3JkZXJMZWZ0V2lkdGg6ITAsYm9yZGVyTGVmdFN0 eWxlOiEwLGJvcmRlckxlZnRDb2xvcjohMH0sYm9yZGVyUmlnaHQ6e2JvcmRlclJpZ2h0V2lkdGg6 ITAsYm9yZGVyUmlnaHRTdHlsZTohMCxib3JkZXJSaWdodENvbG9yOiEwfSxib3JkZXJUb3A6e2Jv cmRlclRvcFdpZHRoOiEwLGJvcmRlclRvcFN0eWxlOiEwLGJvcmRlclRvcENvbG9yOiEwfSxmb250 Ontmb250U3R5bGU6ITAsZm9udFZhcmlhbnQ6ITAsZm9udFdlaWdodDohMCxmb250U2l6ZTohMCxs aW5lSGVpZ2h0OiEwLGZvbnRGYW1pbHk6ITB9LG91dGxpbmU6e291dGxpbmVXaWR0aDohMCxvdXRs aW5lU3R5bGU6ITAsb3V0bGluZUNvbG9yOiEwfX0scz17aXNVbml0bGVzc051bWJlcjpvLHNob3J0 aGFuZFByb3BlcnR5RXhwYW5zaW9uczphfTt0LmV4cG9ydHM9c30se31dLDU6W2Z1bmN0aW9uKGUs dCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSg0KSxvPWUoMTIzKSxpPShlKDU4KSxlKDEyNSksZSg5 NCkpLGE9ZSgxMzYpLHM9ZSgxNDApLHU9KGUoMTQyKSxzKGZ1bmN0aW9uKGUpe3JldHVybiBhKGUp fSkpLGw9ITEsYz0iY3NzRmxvYXQiO2lmKG8uY2FuVXNlRE9NKXt2YXIgcD1kb2N1bWVudC5jcmVh dGVFbGVtZW50KCJkaXYiKS5zdHlsZTt0cnl7cC5mb250PSIifWNhdGNoKGUpe2w9ITB9dm9pZCAw PT09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmNzc0Zsb2F0JiYoYz0ic3R5bGVGbG9h dCIpfXZhciBkPXtjcmVhdGVNYXJrdXBGb3JTdHlsZXM6ZnVuY3Rpb24oZSx0KXt2YXIgbj0iIjtm b3IodmFyIHIgaW4gZSlpZihlLmhhc093blByb3BlcnR5KHIpKXt2YXIgbz1lW3JdO251bGwhPW8m JihuKz11KHIpKyI6IixuKz1pKHIsbyx0KSsiOyIpfXJldHVybiBufHxudWxsfSxzZXRWYWx1ZUZv clN0eWxlczpmdW5jdGlvbihlLHQsbil7dmFyIG89ZS5zdHlsZTtmb3IodmFyIGEgaW4gdClpZih0 Lmhhc093blByb3BlcnR5KGEpKXt2YXIgcz1pKGEsdFthXSxuKTtpZigiZmxvYXQiIT09YSYmImNz c0Zsb2F0IiE9PWF8fChhPWMpLHMpb1thXT1zO2Vsc2V7dmFyIHU9bCYmci5zaG9ydGhhbmRQcm9w ZXJ0eUV4cGFuc2lvbnNbYV07aWYodSlmb3IodmFyIHAgaW4gdSlvW3BdPSIiO2Vsc2Ugb1thXT0i In19fX07dC5leHBvcnRzPWR9LHsxMjM6MTIzLDEyNToxMjUsMTM2OjEzNiwxNDA6MTQwLDE0Mjox NDIsNDo0LDU4OjU4LDk0Ojk0fV0sNjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5j dGlvbiByKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fu bm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9dmFyIG89ZSgxMTMpLGk9ZSgyNCksYT0o ZSgxMzcpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtyKHRoaXMsZSksdGhpcy5fY2FsbGJhY2tz PW51bGwsdGhpcy5fY29udGV4dHM9bnVsbCx0aGlzLl9hcmc9dH1yZXR1cm4gZS5wcm90b3R5cGUu ZW5xdWV1ZT1mdW5jdGlvbihlLHQpe3RoaXMuX2NhbGxiYWNrcz10aGlzLl9jYWxsYmFja3N8fFtd LHRoaXMuX2NhbGxiYWNrcy5wdXNoKGUpLHRoaXMuX2NvbnRleHRzPXRoaXMuX2NvbnRleHRzfHxb XSx0aGlzLl9jb250ZXh0cy5wdXNoKHQpfSxlLnByb3RvdHlwZS5ub3RpZnlBbGw9ZnVuY3Rpb24o KXt2YXIgZT10aGlzLl9jYWxsYmFja3MsdD10aGlzLl9jb250ZXh0cyxuPXRoaXMuX2FyZztpZihl JiZ0KXtlLmxlbmd0aCE9PXQubGVuZ3RoP28oIjI0Iik6dm9pZCAwLHRoaXMuX2NhbGxiYWNrcz1u dWxsLHRoaXMuX2NvbnRleHRzPW51bGw7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspZVtyXS5j YWxsKHRbcl0sbik7ZS5sZW5ndGg9MCx0Lmxlbmd0aD0wfX0sZS5wcm90b3R5cGUuY2hlY2twb2lu dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jYWxsYmFja3M/dGhpcy5fY2FsbGJhY2tzLmxlbmd0 aDowfSxlLnByb3RvdHlwZS5yb2xsYmFjaz1mdW5jdGlvbihlKXt0aGlzLl9jYWxsYmFja3MmJnRo aXMuX2NvbnRleHRzJiYodGhpcy5fY2FsbGJhY2tzLmxlbmd0aD1lLHRoaXMuX2NvbnRleHRzLmxl bmd0aD1lKX0sZS5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLl9jYWxsYmFja3M9bnVs bCx0aGlzLl9jb250ZXh0cz1udWxsfSxlLnByb3RvdHlwZS5kZXN0cnVjdG9yPWZ1bmN0aW9uKCl7 dGhpcy5yZXNldCgpfSxlfSgpKTt0LmV4cG9ydHM9aS5hZGRQb29saW5nVG8oYSl9LHsxMTM6MTEz LDEzNzoxMzcsMjQ6MjR9XSw3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9u IHIoZSl7dmFyIHQ9ZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJz ZWxlY3QiPT09dHx8ImlucHV0Ij09PXQmJiJmaWxlIj09PWUudHlwZX1mdW5jdGlvbiBvKGUpe3Zh ciB0PXguZ2V0UG9vbGVkKFAuY2hhbmdlLFMsZSx3KGUpKTtfLmFjY3VtdWxhdGVUd29QaGFzZURp c3BhdGNoZXModCksRS5iYXRjaGVkVXBkYXRlcyhpLHQpfWZ1bmN0aW9uIGkoZSl7eS5lbnF1ZXVl RXZlbnRzKGUpLHkucHJvY2Vzc0V2ZW50UXVldWUoITEpfWZ1bmN0aW9uIGEoZSx0KXtOPWUsUz10 LE4uYXR0YWNoRXZlbnQoIm9uY2hhbmdlIixvKX1mdW5jdGlvbiBzKCl7TiYmKE4uZGV0YWNoRXZl bnQoIm9uY2hhbmdlIixvKSxOPW51bGwsUz1udWxsKX1mdW5jdGlvbiB1KGUsdCl7aWYoInRvcENo YW5nZSI9PT1lKXJldHVybiB0fWZ1bmN0aW9uIGwoZSx0LG4peyJ0b3BGb2N1cyI9PT1lPyhzKCks YSh0LG4pKToidG9wQmx1ciI9PT1lJiZzKCl9ZnVuY3Rpb24gYyhlLHQpe049ZSxTPXQsTT1lLnZh bHVlLEk9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLmNvbnN0cnVjdG9yLnByb3Rv dHlwZSwidmFsdWUiKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoTiwidmFsdWUiLEEpLE4uYXR0YWNo RXZlbnQ/Ti5hdHRhY2hFdmVudCgib25wcm9wZXJ0eWNoYW5nZSIsZCk6Ti5hZGRFdmVudExpc3Rl bmVyKCJwcm9wZXJ0eWNoYW5nZSIsZCwhMSl9ZnVuY3Rpb24gcCgpe04mJihkZWxldGUgTi52YWx1 ZSxOLmRldGFjaEV2ZW50P04uZGV0YWNoRXZlbnQoIm9ucHJvcGVydHljaGFuZ2UiLGQpOk4ucmVt b3ZlRXZlbnRMaXN0ZW5lcigicHJvcGVydHljaGFuZ2UiLGQsITEpLE49bnVsbCxTPW51bGwsTT1u dWxsLEk9bnVsbCl9ZnVuY3Rpb24gZChlKXtpZigidmFsdWUiPT09ZS5wcm9wZXJ0eU5hbWUpe3Zh ciB0PWUuc3JjRWxlbWVudC52YWx1ZTt0IT09TSYmKE09dCxvKGUpKX19ZnVuY3Rpb24gZihlLHQp e2lmKCJ0b3BJbnB1dCI9PT1lKXJldHVybiB0fWZ1bmN0aW9uIGgoZSx0LG4peyJ0b3BGb2N1cyI9 PT1lPyhwKCksYyh0LG4pKToidG9wQmx1ciI9PT1lJiZwKCl9ZnVuY3Rpb24gbShlLHQpe2lmKCgi dG9wU2VsZWN0aW9uQ2hhbmdlIj09PWV8fCJ0b3BLZXlVcCI9PT1lfHwidG9wS2V5RG93biI9PT1l KSYmTiYmTi52YWx1ZSE9PU0pcmV0dXJuIE09Ti52YWx1ZSxTfWZ1bmN0aW9uIHYoZSl7cmV0dXJu IGUubm9kZU5hbWUmJiJpbnB1dCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJigiY2hlY2ti b3giPT09ZS50eXBlfHwicmFkaW8iPT09ZS50eXBlKX1mdW5jdGlvbiBnKGUsdCl7aWYoInRvcENs aWNrIj09PWUpcmV0dXJuIHR9dmFyIHk9ZSgxNiksXz1lKDE5KSxDPWUoMTIzKSxiPWUoMzMpLEU9 ZSg3MSkseD1lKDgwKSx3PWUoMTAyKSxUPWUoMTEwKSxrPWUoMTExKSxQPXtjaGFuZ2U6e3BoYXNl ZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOiJvbkNoYW5nZSIsY2FwdHVyZWQ6Im9uQ2hhbmdl Q2FwdHVyZSJ9LGRlcGVuZGVuY2llczpbInRvcEJsdXIiLCJ0b3BDaGFuZ2UiLCJ0b3BDbGljayIs InRvcEZvY3VzIiwidG9wSW5wdXQiLCJ0b3BLZXlEb3duIiwidG9wS2V5VXAiLCJ0b3BTZWxlY3Rp b25DaGFuZ2UiXX19LE49bnVsbCxTPW51bGwsTT1udWxsLEk9bnVsbCxPPSExO0MuY2FuVXNlRE9N JiYoTz1UKCJjaGFuZ2UiKSYmKCFkb2N1bWVudC5kb2N1bWVudE1vZGV8fGRvY3VtZW50LmRvY3Vt ZW50TW9kZT44KSk7dmFyIFI9ITE7Qy5jYW5Vc2VET00mJihSPVQoImlucHV0IikmJighZG9jdW1l bnQuZG9jdW1lbnRNb2RlfHxkb2N1bWVudC5kb2N1bWVudE1vZGU+MTEpKTt2YXIgQT17Z2V0OmZ1 bmN0aW9uKCl7cmV0dXJuIEkuZ2V0LmNhbGwodGhpcyl9LHNldDpmdW5jdGlvbihlKXtNPSIiK2Us SS5zZXQuY2FsbCh0aGlzLGUpfX0sRD17ZXZlbnRUeXBlczpQLGV4dHJhY3RFdmVudHM6ZnVuY3Rp b24oZSx0LG4sbyl7dmFyIGksYSxzPXQ/Yi5nZXROb2RlRnJvbUluc3RhbmNlKHQpOndpbmRvdztp ZihyKHMpP08/aT11OmE9bDprKHMpP1I/aT1mOihpPW0sYT1oKTp2KHMpJiYoaT1nKSxpKXt2YXIg Yz1pKGUsdCk7aWYoYyl7dmFyIHA9eC5nZXRQb29sZWQoUC5jaGFuZ2UsYyxuLG8pO3JldHVybiBw LnR5cGU9ImNoYW5nZSIsXy5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKHApLHB9fWEmJmEo ZSxzLHQpfX07dC5leHBvcnRzPUR9LHsxMDI6MTAyLDExMDoxMTAsMTExOjExMSwxMjM6MTIzLDE2 OjE2LDE5OjE5LDMzOjMzLDcxOjcxLDgwOjgwfV0sODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3Ry aWN0IjtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJih0PXRbMV0pLHQ/ dC5uZXh0U2libGluZzplLmZpcnN0Q2hpbGR9ZnVuY3Rpb24gbyhlLHQsbil7Yy5pbnNlcnRUcmVl QmVmb3JlKGUsdCxuKX1mdW5jdGlvbiBpKGUsdCxuKXtBcnJheS5pc0FycmF5KHQpP3MoZSx0WzBd LHRbMV0sbik6bShlLHQsbil9ZnVuY3Rpb24gYShlLHQpe2lmKEFycmF5LmlzQXJyYXkodCkpe3Zh ciBuPXRbMV07dD10WzBdLHUoZSx0LG4pLGUucmVtb3ZlQ2hpbGQobil9ZS5yZW1vdmVDaGlsZCh0 KX1mdW5jdGlvbiBzKGUsdCxuLHIpe2Zvcih2YXIgbz10Ozspe3ZhciBpPW8ubmV4dFNpYmxpbmc7 aWYobShlLG8sciksbz09PW4pYnJlYWs7bz1pfX1mdW5jdGlvbiB1KGUsdCxuKXtmb3IoOzspe3Zh ciByPXQubmV4dFNpYmxpbmc7aWYocj09PW4pYnJlYWs7ZS5yZW1vdmVDaGlsZChyKX19ZnVuY3Rp b24gbChlLHQsbil7dmFyIHI9ZS5wYXJlbnROb2RlLG89ZS5uZXh0U2libGluZztvPT09dD9uJiZt KHIsZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobiksbyk6bj8oaChvLG4pLHUocixvLHQpKTp1KHIs ZSx0KX12YXIgYz1lKDkpLHA9ZSgxMyksZD0oZSgzMyksZSg1OCksZSg5MykpLGY9ZSgxMTUpLGg9 ZSgxMTYpLG09ZChmdW5jdGlvbihlLHQsbil7ZS5pbnNlcnRCZWZvcmUodCxuKX0pLHY9cC5kYW5n ZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cCxnPXtkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0 aE1hcmt1cDp2LHJlcGxhY2VEZWxpbWl0ZWRUZXh0OmwscHJvY2Vzc1VwZGF0ZXM6ZnVuY3Rpb24o ZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHM9dFtuXTtzd2l0Y2gocy50eXBl KXtjYXNlIklOU0VSVF9NQVJLVVAiOm8oZSxzLmNvbnRlbnQscihlLHMuYWZ0ZXJOb2RlKSk7YnJl YWs7Y2FzZSJNT1ZFX0VYSVNUSU5HIjppKGUscy5mcm9tTm9kZSxyKGUscy5hZnRlck5vZGUpKTti cmVhaztjYXNlIlNFVF9NQVJLVVAiOmYoZSxzLmNvbnRlbnQpO2JyZWFrO2Nhc2UiVEVYVF9DT05U RU5UIjpoKGUscy5jb250ZW50KTticmVhaztjYXNlIlJFTU9WRV9OT0RFIjphKGUscy5mcm9tTm9k ZSl9fX19O3QuZXhwb3J0cz1nfSx7MTE1OjExNSwxMTY6MTE2LDEzOjEzLDMzOjMzLDU4OjU4LDk6 OSw5Mzo5M31dLDk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtp Zih2KXt2YXIgdD1lLm5vZGUsbj1lLmNoaWxkcmVuO2lmKG4ubGVuZ3RoKWZvcih2YXIgcj0wO3I8 bi5sZW5ndGg7cisrKWcodCxuW3JdLG51bGwpO2Vsc2UgbnVsbCE9ZS5odG1sP3AodCxlLmh0bWwp Om51bGwhPWUudGV4dCYmZih0LGUudGV4dCl9fWZ1bmN0aW9uIG8oZSx0KXtlLnBhcmVudE5vZGUu cmVwbGFjZUNoaWxkKHQubm9kZSxlKSxyKHQpfWZ1bmN0aW9uIGkoZSx0KXt2P2UuY2hpbGRyZW4u cHVzaCh0KTplLm5vZGUuYXBwZW5kQ2hpbGQodC5ub2RlKX1mdW5jdGlvbiBhKGUsdCl7dj9lLmh0 bWw9dDpwKGUubm9kZSx0KX1mdW5jdGlvbiBzKGUsdCl7dj9lLnRleHQ9dDpmKGUubm9kZSx0KX1m dW5jdGlvbiB1KCl7cmV0dXJuIHRoaXMubm9kZS5ub2RlTmFtZX1mdW5jdGlvbiBsKGUpe3JldHVy bntub2RlOmUsY2hpbGRyZW46W10saHRtbDpudWxsLHRleHQ6bnVsbCx0b1N0cmluZzp1fX12YXIg Yz1lKDEwKSxwPWUoMTE1KSxkPWUoOTMpLGY9ZSgxMTYpLGg9MSxtPTExLHY9InVuZGVmaW5lZCIh PXR5cGVvZiBkb2N1bWVudCYmIm51bWJlciI9PXR5cGVvZiBkb2N1bWVudC5kb2N1bWVudE1vZGV8 fCJ1bmRlZmluZWQiIT10eXBlb2YgbmF2aWdhdG9yJiYic3RyaW5nIj09dHlwZW9mIG5hdmlnYXRv ci51c2VyQWdlbnQmJi9cYkVkZ2VcL1xkLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLGc9ZChm dW5jdGlvbihlLHQsbil7dC5ub2RlLm5vZGVUeXBlPT09bXx8dC5ub2RlLm5vZGVUeXBlPT09aCYm Im9iamVjdCI9PT10Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmKG51bGw9PXQubm9kZS5u YW1lc3BhY2VVUkl8fHQubm9kZS5uYW1lc3BhY2VVUkk9PT1jLmh0bWwpPyhyKHQpLGUuaW5zZXJ0 QmVmb3JlKHQubm9kZSxuKSk6KGUuaW5zZXJ0QmVmb3JlKHQubm9kZSxuKSxyKHQpKX0pO2wuaW5z ZXJ0VHJlZUJlZm9yZT1nLGwucmVwbGFjZUNoaWxkV2l0aFRyZWU9byxsLnF1ZXVlQ2hpbGQ9aSxs LnF1ZXVlSFRNTD1hLGwucXVldWVUZXh0PXMsdC5leHBvcnRzPWx9LHsxMDoxMCwxMTU6MTE1LDEx NjoxMTYsOTM6OTN9XSwxMDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17aHRt bDoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsbWF0aG1sOiJodHRwOi8vd3d3LnczLm9y Zy8xOTk4L01hdGgvTWF0aE1MIixzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIn07dC5l eHBvcnRzPXJ9LHt9XSwxMTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBy KGUsdCl7cmV0dXJuKGUmdCk9PT10fXZhciBvPWUoMTEzKSxpPShlKDEzNykse01VU1RfVVNFX1BS T1BFUlRZOjEsSEFTX0JPT0xFQU5fVkFMVUU6NCxIQVNfTlVNRVJJQ19WQUxVRTo4LEhBU19QT1NJ VElWRV9OVU1FUklDX1ZBTFVFOjI0LEhBU19PVkVSTE9BREVEX0JPT0xFQU5fVkFMVUU6MzIsaW5q ZWN0RE9NUHJvcGVydHlDb25maWc6ZnVuY3Rpb24oZSl7dmFyIHQ9aSxuPWUuUHJvcGVydGllc3x8 e30sYT1lLkRPTUF0dHJpYnV0ZU5hbWVzcGFjZXN8fHt9LHU9ZS5ET01BdHRyaWJ1dGVOYW1lc3x8 e30sbD1lLkRPTVByb3BlcnR5TmFtZXN8fHt9LGM9ZS5ET01NdXRhdGlvbk1ldGhvZHN8fHt9O2Uu aXNDdXN0b21BdHRyaWJ1dGUmJnMuX2lzQ3VzdG9tQXR0cmlidXRlRnVuY3Rpb25zLnB1c2goZS5p c0N1c3RvbUF0dHJpYnV0ZSk7Zm9yKHZhciBwIGluIG4pe3MucHJvcGVydGllcy5oYXNPd25Qcm9w ZXJ0eShwKT9vKCI0OCIscCk6dm9pZCAwO3ZhciBkPXAudG9Mb3dlckNhc2UoKSxmPW5bcF0saD17 YXR0cmlidXRlTmFtZTpkLGF0dHJpYnV0ZU5hbWVzcGFjZTpudWxsLHByb3BlcnR5TmFtZTpwLG11 dGF0aW9uTWV0aG9kOm51bGwsbXVzdFVzZVByb3BlcnR5OnIoZix0Lk1VU1RfVVNFX1BST1BFUlRZ KSxoYXNCb29sZWFuVmFsdWU6cihmLHQuSEFTX0JPT0xFQU5fVkFMVUUpLGhhc051bWVyaWNWYWx1 ZTpyKGYsdC5IQVNfTlVNRVJJQ19WQUxVRSksaGFzUG9zaXRpdmVOdW1lcmljVmFsdWU6cihmLHQu SEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUUpLGhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWU6cihm LHQuSEFTX09WRVJMT0FERURfQk9PTEVBTl9WQUxVRSl9O2lmKGguaGFzQm9vbGVhblZhbHVlK2gu aGFzTnVtZXJpY1ZhbHVlK2guaGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZTw9MT92b2lkIDA6bygi NTAiLHApLHUuaGFzT3duUHJvcGVydHkocCkpe3ZhciBtPXVbcF07aC5hdHRyaWJ1dGVOYW1lPW19 YS5oYXNPd25Qcm9wZXJ0eShwKSYmKGguYXR0cmlidXRlTmFtZXNwYWNlPWFbcF0pLGwuaGFzT3du UHJvcGVydHkocCkmJihoLnByb3BlcnR5TmFtZT1sW3BdKSxjLmhhc093blByb3BlcnR5KHApJiYo aC5tdXRhdGlvbk1ldGhvZD1jW3BdKSxzLnByb3BlcnRpZXNbcF09aH19fSksYT0iOkEtWl9hLXpc XHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAz N0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxc dTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkQiLHM9e0lE X0FUVFJJQlVURV9OQU1FOiJkYXRhLXJlYWN0aWQiLFJPT1RfQVRUUklCVVRFX05BTUU6ImRhdGEt cmVhY3Ryb290IixBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSOmEsQVRUUklCVVRFX05BTUVfQ0hB UjphKyJcXC0uMC05XFx1MDBCN1xcdTAzMDAtXFx1MDM2RlxcdTIwM0YtXFx1MjA0MCIscHJvcGVy dGllczp7fSxnZXRQb3NzaWJsZVN0YW5kYXJkTmFtZTpudWxsLF9pc0N1c3RvbUF0dHJpYnV0ZUZ1 bmN0aW9uczpbXSxpc0N1c3RvbUF0dHJpYnV0ZTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PHMu X2lzQ3VzdG9tQXR0cmlidXRlRnVuY3Rpb25zLmxlbmd0aDt0Kyspe3ZhciBuPXMuX2lzQ3VzdG9t QXR0cmlidXRlRnVuY3Rpb25zW3RdO2lmKG4oZSkpcmV0dXJuITB9cmV0dXJuITF9LGluamVjdGlv bjppfTt0LmV4cG9ydHM9c30sezExMzoxMTMsMTM3OjEzN31dLDEyOltmdW5jdGlvbihlLHQsbil7 InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuISFsLmhhc093blByb3BlcnR5KGUpfHwh dS5oYXNPd25Qcm9wZXJ0eShlKSYmKHMudGVzdChlKT8obFtlXT0hMCwhMCk6KHVbZV09ITAsITEp KX1mdW5jdGlvbiBvKGUsdCl7cmV0dXJuIG51bGw9PXR8fGUuaGFzQm9vbGVhblZhbHVlJiYhdHx8 ZS5oYXNOdW1lcmljVmFsdWUmJmlzTmFOKHQpfHxlLmhhc1Bvc2l0aXZlTnVtZXJpY1ZhbHVlJiZ0 PDF8fGUuaGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZSYmdD09PSExfXZhciBpPWUoMTEpLGE9KGUo MzMpLGUoNTgpLGUoMTEyKSkscz0oZSgxNDIpLG5ldyBSZWdFeHAoIl5bIitpLkFUVFJJQlVURV9O QU1FX1NUQVJUX0NIQVIrIl1bIitpLkFUVFJJQlVURV9OQU1FX0NIQVIrIl0qJCIpKSx1PXt9LGw9 e30sYz17Y3JlYXRlTWFya3VwRm9ySUQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGkuSURfQVRUUklCVVRF X05BTUUrIj0iK2EoZSl9LHNldEF0dHJpYnV0ZUZvcklEOmZ1bmN0aW9uKGUsdCl7ZS5zZXRBdHRy aWJ1dGUoaS5JRF9BVFRSSUJVVEVfTkFNRSx0KX0sY3JlYXRlTWFya3VwRm9yUm9vdDpmdW5jdGlv bigpe3JldHVybiBpLlJPT1RfQVRUUklCVVRFX05BTUUrJz0iIid9LHNldEF0dHJpYnV0ZUZvclJv b3Q6ZnVuY3Rpb24oZSl7ZS5zZXRBdHRyaWJ1dGUoaS5ST09UX0FUVFJJQlVURV9OQU1FLCIiKX0s Y3JlYXRlTWFya3VwRm9yUHJvcGVydHk6ZnVuY3Rpb24oZSx0KXt2YXIgbj1pLnByb3BlcnRpZXMu aGFzT3duUHJvcGVydHkoZSk/aS5wcm9wZXJ0aWVzW2VdOm51bGw7aWYobil7aWYobyhuLHQpKXJl dHVybiIiO3ZhciByPW4uYXR0cmlidXRlTmFtZTtyZXR1cm4gbi5oYXNCb29sZWFuVmFsdWV8fG4u aGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZSYmdD09PSEwP3IrJz0iIic6cisiPSIrYSh0KX1yZXR1 cm4gaS5pc0N1c3RvbUF0dHJpYnV0ZShlKT9udWxsPT10PyIiOmUrIj0iK2EodCk6bnVsbH0sY3Jl YXRlTWFya3VwRm9yQ3VzdG9tQXR0cmlidXRlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIoZSkmJm51 bGwhPXQ/ZSsiPSIrYSh0KToiIn0sc2V0VmFsdWVGb3JQcm9wZXJ0eTpmdW5jdGlvbihlLHQsbil7 dmFyIHI9aS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHQpP2kucHJvcGVydGllc1t0XTpudWxs O2lmKHIpe3ZhciBhPXIubXV0YXRpb25NZXRob2Q7aWYoYSlhKGUsbik7ZWxzZXtpZihvKHIsbikp cmV0dXJuIHZvaWQgdGhpcy5kZWxldGVWYWx1ZUZvclByb3BlcnR5KGUsdCk7aWYoci5tdXN0VXNl UHJvcGVydHkpZVtyLnByb3BlcnR5TmFtZV09bjtlbHNle3ZhciBzPXIuYXR0cmlidXRlTmFtZSx1 PXIuYXR0cmlidXRlTmFtZXNwYWNlO3U/ZS5zZXRBdHRyaWJ1dGVOUyh1LHMsIiIrbik6ci5oYXNC b29sZWFuVmFsdWV8fHIuaGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZSYmbj09PSEwP2Uuc2V0QXR0 cmlidXRlKHMsIiIpOmUuc2V0QXR0cmlidXRlKHMsIiIrbil9fX1lbHNlIGlmKGkuaXNDdXN0b21B dHRyaWJ1dGUodCkpcmV0dXJuIHZvaWQgYy5zZXRWYWx1ZUZvckF0dHJpYnV0ZShlLHQsbil9LHNl dFZhbHVlRm9yQXR0cmlidXRlOmZ1bmN0aW9uKGUsdCxuKXtyKHQpJiYobnVsbD09bj9lLnJlbW92 ZUF0dHJpYnV0ZSh0KTplLnNldEF0dHJpYnV0ZSh0LCIiK24pKX0sZGVsZXRlVmFsdWVGb3JBdHRy aWJ1dGU6ZnVuY3Rpb24oZSx0KXtlLnJlbW92ZUF0dHJpYnV0ZSh0KX0sZGVsZXRlVmFsdWVGb3JQ cm9wZXJ0eTpmdW5jdGlvbihlLHQpe3ZhciBuPWkucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eSh0 KT9pLnByb3BlcnRpZXNbdF06bnVsbDtpZihuKXt2YXIgcj1uLm11dGF0aW9uTWV0aG9kO2lmKHIp cihlLHZvaWQgMCk7ZWxzZSBpZihuLm11c3RVc2VQcm9wZXJ0eSl7dmFyIG89bi5wcm9wZXJ0eU5h bWU7bi5oYXNCb29sZWFuVmFsdWU/ZVtvXT0hMTplW29dPSIifWVsc2UgZS5yZW1vdmVBdHRyaWJ1 dGUobi5hdHRyaWJ1dGVOYW1lKX1lbHNlIGkuaXNDdXN0b21BdHRyaWJ1dGUodCkmJmUucmVtb3Zl QXR0cmlidXRlKHQpfX07dC5leHBvcnRzPWN9LHsxMToxMSwxMTI6MTEyLDE0MjoxNDIsMzM6MzMs NTg6NTh9XSwxMzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDExMyksbz1l KDkpLGk9ZSgxMjMpLGE9ZSgxMjgpLHM9ZSgxMjkpLHU9KGUoMTM3KSx7ZGFuZ2Vyb3VzbHlSZXBs YWNlTm9kZVdpdGhNYXJrdXA6ZnVuY3Rpb24oZSx0KXtpZihpLmNhblVzZURPTT92b2lkIDA6cigi NTYiKSx0P3ZvaWQgMDpyKCI1NyIpLCJIVE1MIj09PWUubm9kZU5hbWU/cigiNTgiKTp2b2lkIDAs InN0cmluZyI9PXR5cGVvZiB0KXt2YXIgbj1hKHQscylbMF07ZS5wYXJlbnROb2RlLnJlcGxhY2VD aGlsZChuLGUpfWVsc2Ugby5yZXBsYWNlQ2hpbGRXaXRoVHJlZShlLHQpfX0pO3QuZXhwb3J0cz11 fSx7MTEzOjExMywxMjM6MTIzLDEyODoxMjgsMTI5OjEyOSwxMzc6MTM3LDk6OX1dLDE0OltmdW5j dGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPVsiUmVzcG9uZGVyRXZlbnRQbHVnaW4iLCJT aW1wbGVFdmVudFBsdWdpbiIsIlRhcEV2ZW50UGx1Z2luIiwiRW50ZXJMZWF2ZUV2ZW50UGx1Z2lu IiwiQ2hhbmdlRXZlbnRQbHVnaW4iLCJTZWxlY3RFdmVudFBsdWdpbiIsIkJlZm9yZUlucHV0RXZl bnRQbHVnaW4iXTt0LmV4cG9ydHM9cn0se31dLDE1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJp Y3QiO3ZhciByPWUoMTkpLG89ZSgzMyksaT1lKDg0KSxhPXttb3VzZUVudGVyOntyZWdpc3RyYXRp b25OYW1lOiJvbk1vdXNlRW50ZXIiLGRlcGVuZGVuY2llczpbInRvcE1vdXNlT3V0IiwidG9wTW91 c2VPdmVyIl19LG1vdXNlTGVhdmU6e3JlZ2lzdHJhdGlvbk5hbWU6Im9uTW91c2VMZWF2ZSIsZGVw ZW5kZW5jaWVzOlsidG9wTW91c2VPdXQiLCJ0b3BNb3VzZU92ZXIiXX19LHM9e2V2ZW50VHlwZXM6 YSxleHRyYWN0RXZlbnRzOmZ1bmN0aW9uKGUsdCxuLHMpe2lmKCJ0b3BNb3VzZU92ZXIiPT09ZSYm KG4ucmVsYXRlZFRhcmdldHx8bi5mcm9tRWxlbWVudCkpcmV0dXJuIG51bGw7aWYoInRvcE1vdXNl T3V0IiE9PWUmJiJ0b3BNb3VzZU92ZXIiIT09ZSlyZXR1cm4gbnVsbDt2YXIgdTtpZihzLndpbmRv dz09PXMpdT1zO2Vsc2V7dmFyIGw9cy5vd25lckRvY3VtZW50O3U9bD9sLmRlZmF1bHRWaWV3fHxs LnBhcmVudFdpbmRvdzp3aW5kb3d9dmFyIGMscDtpZigidG9wTW91c2VPdXQiPT09ZSl7Yz10O3Zh ciBkPW4ucmVsYXRlZFRhcmdldHx8bi50b0VsZW1lbnQ7cD1kP28uZ2V0Q2xvc2VzdEluc3RhbmNl RnJvbU5vZGUoZCk6bnVsbH1lbHNlIGM9bnVsbCxwPXQ7aWYoYz09PXApcmV0dXJuIG51bGw7dmFy IGY9bnVsbD09Yz91Om8uZ2V0Tm9kZUZyb21JbnN0YW5jZShjKSxoPW51bGw9PXA/dTpvLmdldE5v ZGVGcm9tSW5zdGFuY2UocCksbT1pLmdldFBvb2xlZChhLm1vdXNlTGVhdmUsYyxuLHMpO20udHlw ZT0ibW91c2VsZWF2ZSIsbS50YXJnZXQ9ZixtLnJlbGF0ZWRUYXJnZXQ9aDt2YXIgdj1pLmdldFBv b2xlZChhLm1vdXNlRW50ZXIscCxuLHMpO3JldHVybiB2LnR5cGU9Im1vdXNlZW50ZXIiLHYudGFy Z2V0PWgsdi5yZWxhdGVkVGFyZ2V0PWYsci5hY2N1bXVsYXRlRW50ZXJMZWF2ZURpc3BhdGNoZXMo bSx2LGMscCksW20sdl19fTt0LmV4cG9ydHM9c30sezE5OjE5LDMzOjMzLDg0Ojg0fV0sMTY6W2Z1 bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4iYnV0dG9uIj09 PWV8fCJpbnB1dCI9PT1lfHwic2VsZWN0Ij09PWV8fCJ0ZXh0YXJlYSI9PT1lfWZ1bmN0aW9uIG8o ZSx0LG4pe3N3aXRjaChlKXtjYXNlIm9uQ2xpY2siOmNhc2Uib25DbGlja0NhcHR1cmUiOmNhc2Ui b25Eb3VibGVDbGljayI6Y2FzZSJvbkRvdWJsZUNsaWNrQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlRG93 biI6Y2FzZSJvbk1vdXNlRG93bkNhcHR1cmUiOmNhc2Uib25Nb3VzZU1vdmUiOmNhc2Uib25Nb3Vz ZU1vdmVDYXB0dXJlIjpjYXNlIm9uTW91c2VVcCI6Y2FzZSJvbk1vdXNlVXBDYXB0dXJlIjpyZXR1 cm4hKCFuLmRpc2FibGVkfHwhcih0KSk7ZGVmYXVsdDpyZXR1cm4hMX19dmFyIGk9ZSgxMTMpLGE9 ZSgxNykscz1lKDE4KSx1PWUoNTApLGw9ZSg5MSksYz1lKDk4KSxwPShlKDEzNykse30pLGQ9bnVs bCxmPWZ1bmN0aW9uKGUsdCl7ZSYmKHMuZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyKGUsdCksZS5p c1BlcnNpc3RlbnQoKXx8ZS5jb25zdHJ1Y3Rvci5yZWxlYXNlKGUpKX0saD1mdW5jdGlvbihlKXty ZXR1cm4gZihlLCEwKX0sbT1mdW5jdGlvbihlKXtyZXR1cm4gZihlLCExKX0sdj1mdW5jdGlvbihl KXtyZXR1cm4iLiIrZS5fcm9vdE5vZGVJRH0sZz17aW5qZWN0aW9uOntpbmplY3RFdmVudFBsdWdp bk9yZGVyOmEuaW5qZWN0RXZlbnRQbHVnaW5PcmRlcixpbmplY3RFdmVudFBsdWdpbnNCeU5hbWU6 YS5pbmplY3RFdmVudFBsdWdpbnNCeU5hbWV9LHB1dExpc3RlbmVyOmZ1bmN0aW9uKGUsdCxuKXsi ZnVuY3Rpb24iIT10eXBlb2Ygbj9pKCI5NCIsdCx0eXBlb2Ygbik6dm9pZCAwO3ZhciByPXYoZSks bz1wW3RdfHwocFt0XT17fSk7b1tyXT1uO3ZhciBzPWEucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNb dF07cyYmcy5kaWRQdXRMaXN0ZW5lciYmcy5kaWRQdXRMaXN0ZW5lcihlLHQsbil9LGdldExpc3Rl bmVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49cFt0XTtpZihvKHQsZS5fY3VycmVudEVsZW1lbnQudHlw ZSxlLl9jdXJyZW50RWxlbWVudC5wcm9wcykpcmV0dXJuIG51bGw7dmFyIHI9dihlKTtyZXR1cm4g biYmbltyXX0sZGVsZXRlTGlzdGVuZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj1hLnJlZ2lzdHJhdGlv bk5hbWVNb2R1bGVzW3RdO24mJm4ud2lsbERlbGV0ZUxpc3RlbmVyJiZuLndpbGxEZWxldGVMaXN0 ZW5lcihlLHQpO3ZhciByPXBbdF07aWYocil7dmFyIG89dihlKTtkZWxldGUgcltvXX19LGRlbGV0 ZUFsbExpc3RlbmVyczpmdW5jdGlvbihlKXt2YXIgdD12KGUpO2Zvcih2YXIgbiBpbiBwKWlmKHAu aGFzT3duUHJvcGVydHkobikmJnBbbl1bdF0pe3ZhciByPWEucmVnaXN0cmF0aW9uTmFtZU1vZHVs ZXNbbl07ciYmci53aWxsRGVsZXRlTGlzdGVuZXImJnIud2lsbERlbGV0ZUxpc3RlbmVyKGUsbiks ZGVsZXRlIHBbbl1bdF19fSxleHRyYWN0RXZlbnRzOmZ1bmN0aW9uKGUsdCxuLHIpe2Zvcih2YXIg byxpPWEucGx1Z2lucyxzPTA7czxpLmxlbmd0aDtzKyspe3ZhciB1PWlbc107aWYodSl7dmFyIGM9 dS5leHRyYWN0RXZlbnRzKGUsdCxuLHIpO2MmJihvPWwobyxjKSl9fXJldHVybiBvfSxlbnF1ZXVl RXZlbnRzOmZ1bmN0aW9uKGUpe2UmJihkPWwoZCxlKSl9LHByb2Nlc3NFdmVudFF1ZXVlOmZ1bmN0 aW9uKGUpe3ZhciB0PWQ7ZD1udWxsLGU/Yyh0LGgpOmModCxtKSxkP2koIjk1Iik6dm9pZCAwLHUu cmV0aHJvd0NhdWdodEVycm9yKCl9LF9fcHVyZ2U6ZnVuY3Rpb24oKXtwPXt9fSxfX2dldExpc3Rl bmVyQmFuazpmdW5jdGlvbigpe3JldHVybiBwfX07dC5leHBvcnRzPWd9LHsxMTM6MTEzLDEzNzox MzcsMTc6MTcsMTg6MTgsNTA6NTAsOTE6OTEsOTg6OTh9XSwxNzpbZnVuY3Rpb24oZSx0LG4peyJ1 c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7aWYocylmb3IodmFyIGUgaW4gdSl7dmFyIHQ9dVtlXSxu PXMuaW5kZXhPZihlKTtpZihuPi0xP3ZvaWQgMDphKCI5NiIsZSksIWwucGx1Z2luc1tuXSl7dC5l eHRyYWN0RXZlbnRzP3ZvaWQgMDphKCI5NyIsZSksbC5wbHVnaW5zW25dPXQ7dmFyIHI9dC5ldmVu dFR5cGVzO2Zvcih2YXIgaSBpbiByKW8ocltpXSx0LGkpP3ZvaWQgMDphKCI5OCIsaSxlKX19fWZ1 bmN0aW9uIG8oZSx0LG4pe2wuZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzLmhhc093blByb3BlcnR5 KG4pP2EoIjk5IixuKTp2b2lkIDAsbC5ldmVudE5hbWVEaXNwYXRjaENvbmZpZ3Nbbl09ZTt2YXIg cj1lLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzO2lmKHIpe2Zvcih2YXIgbyBpbiByKWlmKHIuaGFz T3duUHJvcGVydHkobykpe3ZhciBzPXJbb107aShzLHQsbil9cmV0dXJuITB9cmV0dXJuISFlLnJl Z2lzdHJhdGlvbk5hbWUmJihpKGUucmVnaXN0cmF0aW9uTmFtZSx0LG4pLCEwKX1mdW5jdGlvbiBp KGUsdCxuKXtsLnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW2VdP2EoIjEwMCIsZSk6dm9pZCAwLGwu cmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbZV09dCxsLnJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNp ZXNbZV09dC5ldmVudFR5cGVzW25dLmRlcGVuZGVuY2llc312YXIgYT1lKDExMykscz0oZSgxMzcp LG51bGwpLHU9e30sbD17cGx1Z2luczpbXSxldmVudE5hbWVEaXNwYXRjaENvbmZpZ3M6e30scmVn aXN0cmF0aW9uTmFtZU1vZHVsZXM6e30scmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llczp7fSxw b3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzOm51bGwsaW5qZWN0RXZlbnRQbHVnaW5PcmRlcjpmdW5j dGlvbihlKXtzP2EoIjEwMSIpOnZvaWQgMCxzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUp LHIoKX0saW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lOmZ1bmN0aW9uKGUpe3ZhciB0PSExO2Zvcih2 YXIgbiBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkobikpe3ZhciBvPWVbbl07dS5oYXNPd25Qcm9w ZXJ0eShuKSYmdVtuXT09PW98fCh1W25dP2EoIjEwMiIsbik6dm9pZCAwLHVbbl09byx0PSEwKX10 JiZyKCl9LGdldFBsdWdpbk1vZHVsZUZvckV2ZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUuZGlzcGF0 Y2hDb25maWc7aWYodC5yZWdpc3RyYXRpb25OYW1lKXJldHVybiBsLnJlZ2lzdHJhdGlvbk5hbWVN b2R1bGVzW3QucmVnaXN0cmF0aW9uTmFtZV18fG51bGw7aWYodm9pZCAwIT09dC5waGFzZWRSZWdp c3RyYXRpb25OYW1lcyl7dmFyIG49dC5waGFzZWRSZWdpc3RyYXRpb25OYW1lcztmb3IodmFyIHIg aW4gbilpZihuLmhhc093blByb3BlcnR5KHIpKXt2YXIgbz1sLnJlZ2lzdHJhdGlvbk5hbWVNb2R1 bGVzW25bcl1dO2lmKG8pcmV0dXJuIG99fXJldHVybiBudWxsfSxfcmVzZXRFdmVudFBsdWdpbnM6 ZnVuY3Rpb24oKXtzPW51bGw7Zm9yKHZhciBlIGluIHUpdS5oYXNPd25Qcm9wZXJ0eShlKSYmZGVs ZXRlIHVbZV07bC5wbHVnaW5zLmxlbmd0aD0wO3ZhciB0PWwuZXZlbnROYW1lRGlzcGF0Y2hDb25m aWdzO2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJmRlbGV0ZSB0W25dO3ZhciBy PWwucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXM7Zm9yKHZhciBvIGluIHIpci5oYXNPd25Qcm9wZXJ0 eShvKSYmZGVsZXRlIHJbb119fTt0LmV4cG9ydHM9bH0sezExMzoxMTMsMTM3OjEzN31dLDE4Oltm dW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuInRvcE1vdXNl VXAiPT09ZXx8InRvcFRvdWNoRW5kIj09PWV8fCJ0b3BUb3VjaENhbmNlbCI9PT1lfWZ1bmN0aW9u IG8oZSl7cmV0dXJuInRvcE1vdXNlTW92ZSI9PT1lfHwidG9wVG91Y2hNb3ZlIj09PWV9ZnVuY3Rp b24gaShlKXtyZXR1cm4idG9wTW91c2VEb3duIj09PWV8fCJ0b3BUb3VjaFN0YXJ0Ij09PWV9ZnVu Y3Rpb24gYShlLHQsbixyKXt2YXIgbz1lLnR5cGV8fCJ1bmtub3duLWV2ZW50IjtlLmN1cnJlbnRU YXJnZXQ9Zy5nZXROb2RlRnJvbUluc3RhbmNlKHIpLHQ/bS5pbnZva2VHdWFyZGVkQ2FsbGJhY2tX aXRoQ2F0Y2gobyxuLGUpOm0uaW52b2tlR3VhcmRlZENhbGxiYWNrKG8sbixlKSxlLmN1cnJlbnRU YXJnZXQ9bnVsbH1mdW5jdGlvbiBzKGUsdCl7dmFyIG49ZS5fZGlzcGF0Y2hMaXN0ZW5lcnMscj1l Ll9kaXNwYXRjaEluc3RhbmNlcztpZihBcnJheS5pc0FycmF5KG4pKWZvcih2YXIgbz0wO288bi5s ZW5ndGgmJiFlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7bysrKWEoZSx0LG5bb10scltvXSk7ZWxz ZSBuJiZhKGUsdCxuLHIpO2UuX2Rpc3BhdGNoTGlzdGVuZXJzPW51bGwsZS5fZGlzcGF0Y2hJbnN0 YW5jZXM9bnVsbH1mdW5jdGlvbiB1KGUpe3ZhciB0PWUuX2Rpc3BhdGNoTGlzdGVuZXJzLG49ZS5f ZGlzcGF0Y2hJbnN0YW5jZXM7aWYoQXJyYXkuaXNBcnJheSh0KSl7Zm9yKHZhciByPTA7cjx0Lmxl bmd0aCYmIWUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTtyKyspaWYodFtyXShlLG5bcl0pKXJldHVy biBuW3JdfWVsc2UgaWYodCYmdChlLG4pKXJldHVybiBuO3JldHVybiBudWxsfWZ1bmN0aW9uIGwo ZSl7dmFyIHQ9dShlKTtyZXR1cm4gZS5fZGlzcGF0Y2hJbnN0YW5jZXM9bnVsbCxlLl9kaXNwYXRj aExpc3RlbmVycz1udWxsLHR9ZnVuY3Rpb24gYyhlKXt2YXIgdD1lLl9kaXNwYXRjaExpc3RlbmVy cyxuPWUuX2Rpc3BhdGNoSW5zdGFuY2VzO0FycmF5LmlzQXJyYXkodCk/aCgiMTAzIik6dm9pZCAw LGUuY3VycmVudFRhcmdldD10P2cuZ2V0Tm9kZUZyb21JbnN0YW5jZShuKTpudWxsO3ZhciByPXQ/ dChlKTpudWxsO3JldHVybiBlLmN1cnJlbnRUYXJnZXQ9bnVsbCxlLl9kaXNwYXRjaExpc3RlbmVy cz1udWxsLGUuX2Rpc3BhdGNoSW5zdGFuY2VzPW51bGwscn1mdW5jdGlvbiBwKGUpe3JldHVybiEh ZS5fZGlzcGF0Y2hMaXN0ZW5lcnN9dmFyIGQsZixoPWUoMTEzKSxtPWUoNTApLHY9KGUoMTM3KSxl KDE0Mikse2luamVjdENvbXBvbmVudFRyZWU6ZnVuY3Rpb24oZSl7ZD1lfSxpbmplY3RUcmVlVHJh dmVyc2FsOmZ1bmN0aW9uKGUpe2Y9ZX19KSxnPXtpc0VuZGlzaDpyLGlzTW92ZWlzaDpvLGlzU3Rh cnRpc2g6aSxleGVjdXRlRGlyZWN0RGlzcGF0Y2g6YyxleGVjdXRlRGlzcGF0Y2hlc0luT3JkZXI6 cyxleGVjdXRlRGlzcGF0Y2hlc0luT3JkZXJTdG9wQXRUcnVlOmwsaGFzRGlzcGF0Y2hlczpwLGdl dEluc3RhbmNlRnJvbU5vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGQuZ2V0SW5zdGFuY2VGcm9tTm9k ZShlKX0sZ2V0Tm9kZUZyb21JbnN0YW5jZTpmdW5jdGlvbihlKXtyZXR1cm4gZC5nZXROb2RlRnJv bUluc3RhbmNlKGUpfSxpc0FuY2VzdG9yOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGYuaXNBbmNlc3Rv cihlLHQpfSxnZXRMb3dlc3RDb21tb25BbmNlc3RvcjpmdW5jdGlvbihlLHQpe3JldHVybiBmLmdl dExvd2VzdENvbW1vbkFuY2VzdG9yKGUsdCl9LGdldFBhcmVudEluc3RhbmNlOmZ1bmN0aW9uKGUp e3JldHVybiBmLmdldFBhcmVudEluc3RhbmNlKGUpfSx0cmF2ZXJzZVR3b1BoYXNlOmZ1bmN0aW9u KGUsdCxuKXtyZXR1cm4gZi50cmF2ZXJzZVR3b1BoYXNlKGUsdCxuKX0sdHJhdmVyc2VFbnRlckxl YXZlOmZ1bmN0aW9uKGUsdCxuLHIsbyl7cmV0dXJuIGYudHJhdmVyc2VFbnRlckxlYXZlKGUsdCxu LHIsbyl9LGluamVjdGlvbjp2fTt0LmV4cG9ydHM9Z30sezExMzoxMTMsMTM3OjEzNywxNDI6MTQy LDUwOjUwfV0sMTk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQs bil7dmFyIHI9dC5kaXNwYXRjaENvbmZpZy5waGFzZWRSZWdpc3RyYXRpb25OYW1lc1tuXTtyZXR1 cm4gZyhlLHIpfWZ1bmN0aW9uIG8oZSx0LG4pe3ZhciBvPXIoZSxuLHQpO28mJihuLl9kaXNwYXRj aExpc3RlbmVycz1tKG4uX2Rpc3BhdGNoTGlzdGVuZXJzLG8pLG4uX2Rpc3BhdGNoSW5zdGFuY2Vz PW0obi5fZGlzcGF0Y2hJbnN0YW5jZXMsZSkpfWZ1bmN0aW9uIGkoZSl7ZSYmZS5kaXNwYXRjaENv bmZpZy5waGFzZWRSZWdpc3RyYXRpb25OYW1lcyYmaC50cmF2ZXJzZVR3b1BoYXNlKGUuX3Rhcmdl dEluc3QsbyxlKX1mdW5jdGlvbiBhKGUpe2lmKGUmJmUuZGlzcGF0Y2hDb25maWcucGhhc2VkUmVn aXN0cmF0aW9uTmFtZXMpe3ZhciB0PWUuX3RhcmdldEluc3Qsbj10P2guZ2V0UGFyZW50SW5zdGFu Y2UodCk6bnVsbDtoLnRyYXZlcnNlVHdvUGhhc2UobixvLGUpfX1mdW5jdGlvbiBzKGUsdCxuKXtp ZihuJiZuLmRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUpe3ZhciByPW4uZGlzcGF0Y2hD b25maWcucmVnaXN0cmF0aW9uTmFtZSxvPWcoZSxyKTtvJiYobi5fZGlzcGF0Y2hMaXN0ZW5lcnM9 bShuLl9kaXNwYXRjaExpc3RlbmVycyxvKSxuLl9kaXNwYXRjaEluc3RhbmNlcz1tKG4uX2Rpc3Bh dGNoSW5zdGFuY2VzLGUpKX19ZnVuY3Rpb24gdShlKXtlJiZlLmRpc3BhdGNoQ29uZmlnLnJlZ2lz dHJhdGlvbk5hbWUmJnMoZS5fdGFyZ2V0SW5zdCxudWxsLGUpfWZ1bmN0aW9uIGwoZSl7dihlLGkp fWZ1bmN0aW9uIGMoZSl7dihlLGEpfWZ1bmN0aW9uIHAoZSx0LG4scil7aC50cmF2ZXJzZUVudGVy TGVhdmUobixyLHMsZSx0KX1mdW5jdGlvbiBkKGUpe3YoZSx1KX12YXIgZj1lKDE2KSxoPWUoMTgp LG09ZSg5MSksdj1lKDk4KSxnPShlKDE0MiksZi5nZXRMaXN0ZW5lcikseT17YWNjdW11bGF0ZVR3 b1BoYXNlRGlzcGF0Y2hlczpsLGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXNTa2lwVGFyZ2V0 OmMsYWNjdW11bGF0ZURpcmVjdERpc3BhdGNoZXM6ZCxhY2N1bXVsYXRlRW50ZXJMZWF2ZURpc3Bh dGNoZXM6cH07dC5leHBvcnRzPXl9LHsxNDI6MTQyLDE2OjE2LDE4OjE4LDkxOjkxLDk4Ojk4fV0s MjA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt0aGlzLl9yb290 PWUsdGhpcy5fc3RhcnRUZXh0PXRoaXMuZ2V0VGV4dCgpLHRoaXMuX2ZhbGxiYWNrVGV4dD1udWxs fXZhciBvPWUoMTQzKSxpPWUoMjQpLGE9ZSgxMDcpO28oci5wcm90b3R5cGUse2Rlc3RydWN0b3I6 ZnVuY3Rpb24oKXt0aGlzLl9yb290PW51bGwsdGhpcy5fc3RhcnRUZXh0PW51bGwsdGhpcy5fZmFs bGJhY2tUZXh0PW51bGx9LGdldFRleHQ6ZnVuY3Rpb24oKXtyZXR1cm4idmFsdWUiaW4gdGhpcy5f cm9vdD90aGlzLl9yb290LnZhbHVlOnRoaXMuX3Jvb3RbYSgpXX0sZ2V0RGF0YTpmdW5jdGlvbigp e2lmKHRoaXMuX2ZhbGxiYWNrVGV4dClyZXR1cm4gdGhpcy5fZmFsbGJhY2tUZXh0O3ZhciBlLHQs bj10aGlzLl9zdGFydFRleHQscj1uLmxlbmd0aCxvPXRoaXMuZ2V0VGV4dCgpLGk9by5sZW5ndGg7 Zm9yKGU9MDtlPHImJm5bZV09PT1vW2VdO2UrKyk7dmFyIGE9ci1lO2Zvcih0PTE7dDw9YSYmblty LXRdPT09b1tpLXRdO3QrKyk7dmFyIHM9dD4xPzEtdDp2b2lkIDA7cmV0dXJuIHRoaXMuX2ZhbGxi YWNrVGV4dD1vLnNsaWNlKGUscyksdGhpcy5fZmFsbGJhY2tUZXh0fX0pLGkuYWRkUG9vbGluZ1Rv KHIpLHQuZXhwb3J0cz1yfSx7MTA3OjEwNywxNDM6MTQzLDI0OjI0fV0sMjE6W2Z1bmN0aW9uKGUs dCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxMSksbz1yLmluamVjdGlvbi5NVVNUX1VTRV9QUk9Q RVJUWSxpPXIuaW5qZWN0aW9uLkhBU19CT09MRUFOX1ZBTFVFLGE9ci5pbmplY3Rpb24uSEFTX05V TUVSSUNfVkFMVUUscz1yLmluamVjdGlvbi5IQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRSx1PXIu aW5qZWN0aW9uLkhBU19PVkVSTE9BREVEX0JPT0xFQU5fVkFMVUUsbD17aXNDdXN0b21BdHRyaWJ1 dGU6UmVnRXhwLnByb3RvdHlwZS50ZXN0LmJpbmQobmV3IFJlZ0V4cCgiXihkYXRhfGFyaWEpLVsi K3IuQVRUUklCVVRFX05BTUVfQ0hBUisiXSokIikpLFByb3BlcnRpZXM6e2FjY2VwdDowLGFjY2Vw dENoYXJzZXQ6MCxhY2Nlc3NLZXk6MCxhY3Rpb246MCxhbGxvd0Z1bGxTY3JlZW46aSxhbGxvd1Ry YW5zcGFyZW5jeTowLGFsdDowLGFzOjAsYXN5bmM6aSxhdXRvQ29tcGxldGU6MCxhdXRvUGxheTpp LGNhcHR1cmU6aSxjZWxsUGFkZGluZzowLGNlbGxTcGFjaW5nOjAsY2hhclNldDowLGNoYWxsZW5n ZTowLGNoZWNrZWQ6b3xpLGNpdGU6MCxjbGFzc0lEOjAsY2xhc3NOYW1lOjAsY29sczpzLGNvbFNw YW46MCxjb250ZW50OjAsY29udGVudEVkaXRhYmxlOjAsY29udGV4dE1lbnU6MCxjb250cm9sczpp LGNvb3JkczowLGNyb3NzT3JpZ2luOjAsZGF0YTowLGRhdGVUaW1lOjAsZGVmYXVsdDppLGRlZmVy OmksZGlyOjAsZGlzYWJsZWQ6aSxkb3dubG9hZDp1LGRyYWdnYWJsZTowLGVuY1R5cGU6MCxmb3Jt OjAsZm9ybUFjdGlvbjowLGZvcm1FbmNUeXBlOjAsZm9ybU1ldGhvZDowLGZvcm1Ob1ZhbGlkYXRl OmksZm9ybVRhcmdldDowLGZyYW1lQm9yZGVyOjAsaGVhZGVyczowLGhlaWdodDowLGhpZGRlbjpp LGhpZ2g6MCxocmVmOjAsaHJlZkxhbmc6MCxodG1sRm9yOjAsaHR0cEVxdWl2OjAsaWNvbjowLGlk OjAsaW5wdXRNb2RlOjAsaW50ZWdyaXR5OjAsaXM6MCxrZXlQYXJhbXM6MCxrZXlUeXBlOjAsa2lu ZDowLGxhYmVsOjAsbGFuZzowLGxpc3Q6MCxsb29wOmksbG93OjAsbWFuaWZlc3Q6MCxtYXJnaW5I ZWlnaHQ6MCxtYXJnaW5XaWR0aDowLG1heDowLG1heExlbmd0aDowLG1lZGlhOjAsbWVkaWFHcm91 cDowLG1ldGhvZDowLG1pbjowLG1pbkxlbmd0aDowLG11bHRpcGxlOm98aSxtdXRlZDpvfGksbmFt ZTowLG5vbmNlOjAsbm9WYWxpZGF0ZTppLG9wZW46aSxvcHRpbXVtOjAscGF0dGVybjowLHBsYWNl aG9sZGVyOjAscGxheXNJbmxpbmU6aSxwb3N0ZXI6MCxwcmVsb2FkOjAscHJvZmlsZTowLHJhZGlv R3JvdXA6MCxyZWFkT25seTppLHJlZmVycmVyUG9saWN5OjAscmVsOjAscmVxdWlyZWQ6aSxyZXZl cnNlZDppLHJvbGU6MCxyb3dzOnMscm93U3BhbjphLHNhbmRib3g6MCxzY29wZTowLHNjb3BlZDpp LHNjcm9sbGluZzowLHNlYW1sZXNzOmksc2VsZWN0ZWQ6b3xpLHNoYXBlOjAsc2l6ZTpzLHNpemVz OjAsc3BhbjpzLHNwZWxsQ2hlY2s6MCxzcmM6MCxzcmNEb2M6MCxzcmNMYW5nOjAsc3JjU2V0OjAs c3RhcnQ6YSxzdGVwOjAsc3R5bGU6MCxzdW1tYXJ5OjAsdGFiSW5kZXg6MCx0YXJnZXQ6MCx0aXRs ZTowLHR5cGU6MCx1c2VNYXA6MCx2YWx1ZTowLHdpZHRoOjAsd21vZGU6MCx3cmFwOjAsYWJvdXQ6 MCxkYXRhdHlwZTowLGlubGlzdDowLHByZWZpeDowLHByb3BlcnR5OjAscmVzb3VyY2U6MCx0eXBl b2Y6MCx2b2NhYjowLGF1dG9DYXBpdGFsaXplOjAsYXV0b0NvcnJlY3Q6MCxhdXRvU2F2ZTowLGNv bG9yOjAsaXRlbVByb3A6MCxpdGVtU2NvcGU6aSxpdGVtVHlwZTowLGl0ZW1JRDowLGl0ZW1SZWY6 MCxyZXN1bHRzOjAsc2VjdXJpdHk6MCx1bnNlbGVjdGFibGU6MH0sRE9NQXR0cmlidXRlTmFtZXM6 e2FjY2VwdENoYXJzZXQ6ImFjY2VwdC1jaGFyc2V0IixjbGFzc05hbWU6ImNsYXNzIixodG1sRm9y OiJmb3IiLGh0dHBFcXVpdjoiaHR0cC1lcXVpdiJ9LERPTVByb3BlcnR5TmFtZXM6e319O3QuZXhw b3J0cz1sfSx7MTE6MTF9XSwyMjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlv biByKGUpe3ZhciB0PS9bPTpdL2csbj17Ij0iOiI9MCIsIjoiOiI9MiJ9LHI9KCIiK2UpLnJlcGxh Y2UodCxmdW5jdGlvbihlKXtyZXR1cm4gbltlXX0pO3JldHVybiIkIityfWZ1bmN0aW9uIG8oZSl7 dmFyIHQ9Lyg9MHw9MikvZyxuPXsiPTAiOiI9IiwiPTIiOiI6In0scj0iLiI9PT1lWzBdJiYiJCI9 PT1lWzFdP2Uuc3Vic3RyaW5nKDIpOmUuc3Vic3RyaW5nKDEpO3JldHVybigiIityKS5yZXBsYWNl KHQsZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV19KX12YXIgaT17ZXNjYXBlOnIsdW5lc2NhcGU6b307 dC5leHBvcnRzPWl9LHt9XSwyMzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlv biByKGUpe251bGwhPWUuY2hlY2tlZExpbmsmJm51bGwhPWUudmFsdWVMaW5rP3MoIjg3Iik6dm9p ZCAwfWZ1bmN0aW9uIG8oZSl7cihlKSxudWxsIT1lLnZhbHVlfHxudWxsIT1lLm9uQ2hhbmdlP3Mo Ijg4Iik6dm9pZCAwfWZ1bmN0aW9uIGkoZSl7cihlKSxudWxsIT1lLmNoZWNrZWR8fG51bGwhPWUu b25DaGFuZ2U/cygiODkiKTp2b2lkIDB9ZnVuY3Rpb24gYShlKXtpZihlKXt2YXIgdD1lLmdldE5h bWUoKTtpZih0KXJldHVybiIgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCIrdCsiYC4ifXJl dHVybiIifXZhciBzPWUoMTEzKSx1PWUoMTIxKSxsPWUoNjQpLGM9KGUoMTM3KSxlKDE0Mikse2J1 dHRvbjohMCxjaGVja2JveDohMCxpbWFnZTohMCxoaWRkZW46ITAscmFkaW86ITAscmVzZXQ6ITAs c3VibWl0OiEwfSkscD17dmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiFlW3RdfHxjW2UudHlw ZV18fGUub25DaGFuZ2V8fGUucmVhZE9ubHl8fGUuZGlzYWJsZWQ/bnVsbDpuZXcgRXJyb3IoIllv dSBwcm92aWRlZCBhIGB2YWx1ZWAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiBgb25D aGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmIHRo ZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRWYWx1ZWAuIE90aGVyd2lzZSwg c2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuIil9LGNoZWNrZWQ6ZnVuY3Rpb24o ZSx0LG4pe3JldHVybiFlW3RdfHxlLm9uQ2hhbmdlfHxlLnJlYWRPbmx5fHxlLmRpc2FibGVkP251 bGw6bmV3IEVycm9yKCJZb3UgcHJvdmlkZWQgYSBgY2hlY2tlZGAgcHJvcCB0byBhIGZvcm0gZmll bGQgd2l0aG91dCBhbiBgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFk LW9ubHkgZmllbGQuIElmIHRoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRD aGVja2VkYC4gT3RoZXJ3aXNlLCBzZXQgZWl0aGVyIGBvbkNoYW5nZWAgb3IgYHJlYWRPbmx5YC4i KX0sb25DaGFuZ2U6dS5Qcm9wVHlwZXMuZnVuY30sZD17fSxmPXtjaGVja1Byb3BUeXBlczpmdW5j dGlvbihlLHQsbil7Zm9yKHZhciByIGluIHApe2lmKHAuaGFzT3duUHJvcGVydHkocikpdmFyIG89 cFtyXSh0LHIsZSwicHJvcCIsbnVsbCxsKTtvIGluc3RhbmNlb2YgRXJyb3ImJiEoby5tZXNzYWdl IGluIGQpJiYoZFtvLm1lc3NhZ2VdPSEwLGEobikpfX0sZ2V0VmFsdWU6ZnVuY3Rpb24oZSl7cmV0 dXJuIGUudmFsdWVMaW5rPyhvKGUpLGUudmFsdWVMaW5rLnZhbHVlKTplLnZhbHVlfSxnZXRDaGVj a2VkOmZ1bmN0aW9uKGUpe3JldHVybiBlLmNoZWNrZWRMaW5rPyhpKGUpLGUuY2hlY2tlZExpbmsu dmFsdWUpOmUuY2hlY2tlZH0sZXhlY3V0ZU9uQ2hhbmdlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUu dmFsdWVMaW5rPyhvKGUpLGUudmFsdWVMaW5rLnJlcXVlc3RDaGFuZ2UodC50YXJnZXQudmFsdWUp KTplLmNoZWNrZWRMaW5rPyhpKGUpLGUuY2hlY2tlZExpbmsucmVxdWVzdENoYW5nZSh0LnRhcmdl dC5jaGVja2VkKSk6ZS5vbkNoYW5nZT9lLm9uQ2hhbmdlLmNhbGwodm9pZCAwLHQpOnZvaWQgMH19 O3QuZXhwb3J0cz1mfSx7MTEzOjExMywxMjE6MTIxLDEzNzoxMzcsMTQyOjE0Miw2NDo2NH1dLDI0 OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTEzKSxvPShlKDEzNyksZnVu Y3Rpb24oZSl7dmFyIHQ9dGhpcztpZih0Lmluc3RhbmNlUG9vbC5sZW5ndGgpe3ZhciBuPXQuaW5z dGFuY2VQb29sLnBvcCgpO3JldHVybiB0LmNhbGwobixlKSxufXJldHVybiBuZXcgdChlKX0pLGk9 ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2lmKG4uaW5zdGFuY2VQb29sLmxlbmd0aCl7dmFyIHI9 bi5pbnN0YW5jZVBvb2wucG9wKCk7cmV0dXJuIG4uY2FsbChyLGUsdCkscn1yZXR1cm4gbmV3IG4o ZSx0KX0sYT1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcztpZihyLmluc3RhbmNlUG9vbC5sZW5n dGgpe3ZhciBvPXIuaW5zdGFuY2VQb29sLnBvcCgpO3JldHVybiByLmNhbGwobyxlLHQsbiksb31y ZXR1cm4gbmV3IHIoZSx0LG4pfSxzPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPXRoaXM7aWYoby5p bnN0YW5jZVBvb2wubGVuZ3RoKXt2YXIgaT1vLmluc3RhbmNlUG9vbC5wb3AoKTtyZXR1cm4gby5j YWxsKGksZSx0LG4sciksaX1yZXR1cm4gbmV3IG8oZSx0LG4scil9LHU9ZnVuY3Rpb24oZSl7dmFy IHQ9dGhpcztlIGluc3RhbmNlb2YgdD92b2lkIDA6cigiMjUiKSxlLmRlc3RydWN0b3IoKSx0Lmlu c3RhbmNlUG9vbC5sZW5ndGg8dC5wb29sU2l6ZSYmdC5pbnN0YW5jZVBvb2wucHVzaChlKX0sbD0x MCxjPW8scD1mdW5jdGlvbihlLHQpe3ZhciBuPWU7cmV0dXJuIG4uaW5zdGFuY2VQb29sPVtdLG4u Z2V0UG9vbGVkPXR8fGMsbi5wb29sU2l6ZXx8KG4ucG9vbFNpemU9bCksbi5yZWxlYXNlPXUsbn0s ZD17YWRkUG9vbGluZ1RvOnAsb25lQXJndW1lbnRQb29sZXI6byx0d29Bcmd1bWVudFBvb2xlcjpp LHRocmVlQXJndW1lbnRQb29sZXI6YSxmb3VyQXJndW1lbnRQb29sZXI6c307dC5leHBvcnRzPWR9 LHsxMTM6MTEzLDEzNzoxMzd9XSwyNTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5j dGlvbiByKGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxt KXx8KGVbbV09ZisrLHBbZVttXV09e30pLHBbZVttXV19dmFyIG8saT1lKDE0MyksYT1lKDE3KSxz PWUoNTEpLHU9ZSg5MCksbD1lKDEwOCksYz1lKDExMCkscD17fSxkPSExLGY9MCxoPXt0b3BBYm9y dDoiYWJvcnQiLHRvcEFuaW1hdGlvbkVuZDpsKCJhbmltYXRpb25lbmQiKXx8ImFuaW1hdGlvbmVu ZCIsdG9wQW5pbWF0aW9uSXRlcmF0aW9uOmwoImFuaW1hdGlvbml0ZXJhdGlvbiIpfHwiYW5pbWF0 aW9uaXRlcmF0aW9uIix0b3BBbmltYXRpb25TdGFydDpsKCJhbmltYXRpb25zdGFydCIpfHwiYW5p bWF0aW9uc3RhcnQiLHRvcEJsdXI6ImJsdXIiLHRvcENhblBsYXk6ImNhbnBsYXkiLHRvcENhblBs YXlUaHJvdWdoOiJjYW5wbGF5dGhyb3VnaCIsdG9wQ2hhbmdlOiJjaGFuZ2UiLHRvcENsaWNrOiJj bGljayIsdG9wQ29tcG9zaXRpb25FbmQ6ImNvbXBvc2l0aW9uZW5kIix0b3BDb21wb3NpdGlvblN0 YXJ0OiJjb21wb3NpdGlvbnN0YXJ0Iix0b3BDb21wb3NpdGlvblVwZGF0ZToiY29tcG9zaXRpb251 cGRhdGUiLHRvcENvbnRleHRNZW51OiJjb250ZXh0bWVudSIsdG9wQ29weToiY29weSIsdG9wQ3V0 OiJjdXQiLHRvcERvdWJsZUNsaWNrOiJkYmxjbGljayIsdG9wRHJhZzoiZHJhZyIsdG9wRHJhZ0Vu ZDoiZHJhZ2VuZCIsdG9wRHJhZ0VudGVyOiJkcmFnZW50ZXIiLHRvcERyYWdFeGl0OiJkcmFnZXhp dCIsdG9wRHJhZ0xlYXZlOiJkcmFnbGVhdmUiLHRvcERyYWdPdmVyOiJkcmFnb3ZlciIsdG9wRHJh Z1N0YXJ0OiJkcmFnc3RhcnQiLHRvcERyb3A6ImRyb3AiLHRvcER1cmF0aW9uQ2hhbmdlOiJkdXJh dGlvbmNoYW5nZSIsdG9wRW1wdGllZDoiZW1wdGllZCIsdG9wRW5jcnlwdGVkOiJlbmNyeXB0ZWQi LHRvcEVuZGVkOiJlbmRlZCIsdG9wRXJyb3I6ImVycm9yIix0b3BGb2N1czoiZm9jdXMiLHRvcElu cHV0OiJpbnB1dCIsdG9wS2V5RG93bjoia2V5ZG93biIsdG9wS2V5UHJlc3M6ImtleXByZXNzIix0 b3BLZXlVcDoia2V5dXAiLHRvcExvYWRlZERhdGE6ImxvYWRlZGRhdGEiLHRvcExvYWRlZE1ldGFk YXRhOiJsb2FkZWRtZXRhZGF0YSIsdG9wTG9hZFN0YXJ0OiJsb2Fkc3RhcnQiLHRvcE1vdXNlRG93 bjoibW91c2Vkb3duIix0b3BNb3VzZU1vdmU6Im1vdXNlbW92ZSIsdG9wTW91c2VPdXQ6Im1vdXNl b3V0Iix0b3BNb3VzZU92ZXI6Im1vdXNlb3ZlciIsdG9wTW91c2VVcDoibW91c2V1cCIsdG9wUGFz dGU6InBhc3RlIix0b3BQYXVzZToicGF1c2UiLAordG9wUGxheToicGxheSIsdG9wUGxheWluZzoi cGxheWluZyIsdG9wUHJvZ3Jlc3M6InByb2dyZXNzIix0b3BSYXRlQ2hhbmdlOiJyYXRlY2hhbmdl Iix0b3BTY3JvbGw6InNjcm9sbCIsdG9wU2Vla2VkOiJzZWVrZWQiLHRvcFNlZWtpbmc6InNlZWtp bmciLHRvcFNlbGVjdGlvbkNoYW5nZToic2VsZWN0aW9uY2hhbmdlIix0b3BTdGFsbGVkOiJzdGFs bGVkIix0b3BTdXNwZW5kOiJzdXNwZW5kIix0b3BUZXh0SW5wdXQ6InRleHRJbnB1dCIsdG9wVGlt ZVVwZGF0ZToidGltZXVwZGF0ZSIsdG9wVG91Y2hDYW5jZWw6InRvdWNoY2FuY2VsIix0b3BUb3Vj aEVuZDoidG91Y2hlbmQiLHRvcFRvdWNoTW92ZToidG91Y2htb3ZlIix0b3BUb3VjaFN0YXJ0OiJ0 b3VjaHN0YXJ0Iix0b3BUcmFuc2l0aW9uRW5kOmwoInRyYW5zaXRpb25lbmQiKXx8InRyYW5zaXRp b25lbmQiLHRvcFZvbHVtZUNoYW5nZToidm9sdW1lY2hhbmdlIix0b3BXYWl0aW5nOiJ3YWl0aW5n Iix0b3BXaGVlbDoid2hlZWwifSxtPSJfcmVhY3RMaXN0ZW5lcnNJRCIrU3RyaW5nKE1hdGgucmFu ZG9tKCkpLnNsaWNlKDIpLHY9aSh7fSxzLHtSZWFjdEV2ZW50TGlzdGVuZXI6bnVsbCxpbmplY3Rp b246e2luamVjdFJlYWN0RXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihlKXtlLnNldEhhbmRsZVRvcExl dmVsKHYuaGFuZGxlVG9wTGV2ZWwpLHYuUmVhY3RFdmVudExpc3RlbmVyPWV9fSxzZXRFbmFibGVk OmZ1bmN0aW9uKGUpe3YuUmVhY3RFdmVudExpc3RlbmVyJiZ2LlJlYWN0RXZlbnRMaXN0ZW5lci5z ZXRFbmFibGVkKGUpfSxpc0VuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hKCF2LlJlYWN0RXZlbnRM aXN0ZW5lcnx8IXYuUmVhY3RFdmVudExpc3RlbmVyLmlzRW5hYmxlZCgpKX0sbGlzdGVuVG86ZnVu Y3Rpb24oZSx0KXtmb3IodmFyIG49dCxvPXIobiksaT1hLnJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRl bmNpZXNbZV0scz0wO3M8aS5sZW5ndGg7cysrKXt2YXIgdT1pW3NdO28uaGFzT3duUHJvcGVydHko dSkmJm9bdV18fCgidG9wV2hlZWwiPT09dT9jKCJ3aGVlbCIpP3YuUmVhY3RFdmVudExpc3RlbmVy LnRyYXBCdWJibGVkRXZlbnQoInRvcFdoZWVsIiwid2hlZWwiLG4pOmMoIm1vdXNld2hlZWwiKT92 LlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KCJ0b3BXaGVlbCIsIm1vdXNld2hl ZWwiLG4pOnYuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQoInRvcFdoZWVsIiwi RE9NTW91c2VTY3JvbGwiLG4pOiJ0b3BTY3JvbGwiPT09dT9jKCJzY3JvbGwiLCEwKT92LlJlYWN0 RXZlbnRMaXN0ZW5lci50cmFwQ2FwdHVyZWRFdmVudCgidG9wU2Nyb2xsIiwic2Nyb2xsIixuKTp2 LlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KCJ0b3BTY3JvbGwiLCJzY3JvbGwi LHYuUmVhY3RFdmVudExpc3RlbmVyLldJTkRPV19IQU5ETEUpOiJ0b3BGb2N1cyI9PT11fHwidG9w Qmx1ciI9PT11PyhjKCJmb2N1cyIsITApPyh2LlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQ2FwdHVy ZWRFdmVudCgidG9wRm9jdXMiLCJmb2N1cyIsbiksdi5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcENh cHR1cmVkRXZlbnQoInRvcEJsdXIiLCJibHVyIixuKSk6YygiZm9jdXNpbiIpJiYodi5SZWFjdEV2 ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudCgidG9wRm9jdXMiLCJmb2N1c2luIixuKSx2LlJl YWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KCJ0b3BCbHVyIiwiZm9jdXNvdXQiLG4p KSxvLnRvcEJsdXI9ITAsby50b3BGb2N1cz0hMCk6aC5oYXNPd25Qcm9wZXJ0eSh1KSYmdi5SZWFj dEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudCh1LGhbdV0sbiksb1t1XT0hMCl9fSx0cmFw QnViYmxlZEV2ZW50OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdi5SZWFjdEV2ZW50TGlzdGVuZXIu dHJhcEJ1YmJsZWRFdmVudChlLHQsbil9LHRyYXBDYXB0dXJlZEV2ZW50OmZ1bmN0aW9uKGUsdCxu KXtyZXR1cm4gdi5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcENhcHR1cmVkRXZlbnQoZSx0LG4pfSxz dXBwb3J0c0V2ZW50UGFnZVhZOmZ1bmN0aW9uKCl7aWYoIWRvY3VtZW50LmNyZWF0ZUV2ZW50KXJl dHVybiExO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJNb3VzZUV2ZW50Iik7cmV0dXJuIG51 bGwhPWUmJiJwYWdlWCJpbiBlfSxlbnN1cmVTY3JvbGxWYWx1ZU1vbml0b3Jpbmc6ZnVuY3Rpb24o KXtpZih2b2lkIDA9PT1vJiYobz12LnN1cHBvcnRzRXZlbnRQYWdlWFkoKSksIW8mJiFkKXt2YXIg ZT11LnJlZnJlc2hTY3JvbGxWYWx1ZXM7di5SZWFjdEV2ZW50TGlzdGVuZXIubW9uaXRvclNjcm9s bFZhbHVlKGUpLGQ9ITB9fX0pO3QuZXhwb3J0cz12fSx7MTA4OjEwOCwxMTA6MTEwLDE0MzoxNDMs MTc6MTcsNTE6NTEsOTA6OTB9XSwyNjpbZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbihuKXsidXNl IHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbixyKXt2YXIgbz12b2lkIDA9PT1lW25dO251bGwhPXQm Jm8mJihlW25dPWkodCwhMCkpfXZhciBvPWUoNjYpLGk9ZSgxMDkpLGE9KGUoMjIpLGUoMTE3KSks cz1lKDExOCk7ZSgxNDIpOyJ1bmRlZmluZWQiIT10eXBlb2YgbiYmbi5lbnYsMTt2YXIgdT17aW5z dGFudGlhdGVDaGlsZHJlbjpmdW5jdGlvbihlLHQsbixvKXtpZihudWxsPT1lKXJldHVybiBudWxs O3ZhciBpPXt9O3JldHVybiBzKGUscixpKSxpfSx1cGRhdGVDaGlsZHJlbjpmdW5jdGlvbihlLHQs bixyLHMsdSxsLGMscCl7aWYodHx8ZSl7dmFyIGQsZjtmb3IoZCBpbiB0KWlmKHQuaGFzT3duUHJv cGVydHkoZCkpe2Y9ZSYmZVtkXTt2YXIgaD1mJiZmLl9jdXJyZW50RWxlbWVudCxtPXRbZF07aWYo bnVsbCE9ZiYmYShoLG0pKW8ucmVjZWl2ZUNvbXBvbmVudChmLG0scyxjKSx0W2RdPWY7ZWxzZXtm JiYocltkXT1vLmdldEhvc3ROb2RlKGYpLG8udW5tb3VudENvbXBvbmVudChmLCExKSk7dmFyIHY9 aShtLCEwKTt0W2RdPXY7dmFyIGc9by5tb3VudENvbXBvbmVudCh2LHMsdSxsLGMscCk7bi5wdXNo KGcpfX1mb3IoZCBpbiBlKSFlLmhhc093blByb3BlcnR5KGQpfHx0JiZ0Lmhhc093blByb3BlcnR5 KGQpfHwoZj1lW2RdLHJbZF09by5nZXRIb3N0Tm9kZShmKSxvLnVubW91bnRDb21wb25lbnQoZiwh MSkpfX0sdW5tb3VudENoaWxkcmVuOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIGUpaWYoZS5o YXNPd25Qcm9wZXJ0eShuKSl7dmFyIHI9ZVtuXTtvLnVubW91bnRDb21wb25lbnQocix0KX19fTt0 LmV4cG9ydHM9dX0pLmNhbGwodGhpcyx2b2lkIDApfSx7MTA5OjEwOSwxMTc6MTE3LDExODoxMTgs MTQyOjE0MiwyMjoyMiw2Njo2Nn1dLDI3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3Zh ciByPWUoOCksbz1lKDM3KSxpPXtwcm9jZXNzQ2hpbGRyZW5VcGRhdGVzOm8uZGFuZ2Vyb3VzbHlQ cm9jZXNzQ2hpbGRyZW5VcGRhdGVzLHJlcGxhY2VOb2RlV2l0aE1hcmt1cDpyLmRhbmdlcm91c2x5 UmVwbGFjZU5vZGVXaXRoTWFya3VwfTt0LmV4cG9ydHM9aX0sezM3OjM3LDg6OH1dLDI4OltmdW5j dGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTEzKSxvPShlKDEzNyksITEpLGk9e3Jl cGxhY2VOb2RlV2l0aE1hcmt1cDpudWxsLHByb2Nlc3NDaGlsZHJlblVwZGF0ZXM6bnVsbCxpbmpl Y3Rpb246e2luamVjdEVudmlyb25tZW50OmZ1bmN0aW9uKGUpe28/cigiMTA0Iik6dm9pZCAwLGku cmVwbGFjZU5vZGVXaXRoTWFya3VwPWUucmVwbGFjZU5vZGVXaXRoTWFya3VwLGkucHJvY2Vzc0No aWxkcmVuVXBkYXRlcz1lLnByb2Nlc3NDaGlsZHJlblVwZGF0ZXMsbz0hMH19fTt0LmV4cG9ydHM9 aX0sezExMzoxMTMsMTM3OjEzN31dLDI5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1 bmN0aW9uIHIoZSl7fWZ1bmN0aW9uIG8oZSx0KXt9ZnVuY3Rpb24gaShlKXtyZXR1cm4hKCFlLnBy b3RvdHlwZXx8IWUucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpfWZ1bmN0aW9uIGEoZSl7cmV0 dXJuISghZS5wcm90b3R5cGV8fCFlLnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCl9dmFy IHM9ZSgxMTMpLHU9ZSgxNDMpLGw9ZSgxMjEpLGM9ZSgyOCkscD1lKDEyMCksZD1lKDUwKSxmPWUo NTcpLGg9KGUoNTgpLGUoNjIpKSxtPWUoNjYpLHY9ZSgxMzApLGc9KGUoMTM3KSxlKDE0MSkpLHk9 ZSgxMTcpLF89KGUoMTQyKSx7SW1wdXJlQ2xhc3M6MCxQdXJlQ2xhc3M6MSxTdGF0ZWxlc3NGdW5j dGlvbmFsOjJ9KTtyLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT1mLmdldCh0aGlz KS5fY3VycmVudEVsZW1lbnQudHlwZSx0PWUodGhpcy5wcm9wcyx0aGlzLmNvbnRleHQsdGhpcy51 cGRhdGVyKTtyZXR1cm4gbyhlLHQpLHR9O3ZhciBDPTEsYj17Y29uc3RydWN0OmZ1bmN0aW9uKGUp e3RoaXMuX2N1cnJlbnRFbGVtZW50PWUsdGhpcy5fcm9vdE5vZGVJRD0wLHRoaXMuX2NvbXBvc2l0 ZVR5cGU9bnVsbCx0aGlzLl9pbnN0YW5jZT1udWxsLHRoaXMuX2hvc3RQYXJlbnQ9bnVsbCx0aGlz Ll9ob3N0Q29udGFpbmVySW5mbz1udWxsLHRoaXMuX3VwZGF0ZUJhdGNoTnVtYmVyPW51bGwsdGhp cy5fcGVuZGluZ0VsZW1lbnQ9bnVsbCx0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZT1udWxsLHRoaXMu X3BlbmRpbmdSZXBsYWNlU3RhdGU9ITEsdGhpcy5fcGVuZGluZ0ZvcmNlVXBkYXRlPSExLHRoaXMu X3JlbmRlcmVkTm9kZVR5cGU9bnVsbCx0aGlzLl9yZW5kZXJlZENvbXBvbmVudD1udWxsLHRoaXMu X2NvbnRleHQ9bnVsbCx0aGlzLl9tb3VudE9yZGVyPTAsdGhpcy5fdG9wTGV2ZWxXcmFwcGVyPW51 bGwsdGhpcy5fcGVuZGluZ0NhbGxiYWNrcz1udWxsLHRoaXMuX2NhbGxlZENvbXBvbmVudFdpbGxV bm1vdW50PSExfSxtb3VudENvbXBvbmVudDpmdW5jdGlvbihlLHQsbix1KXt0aGlzLl9jb250ZXh0 PXUsdGhpcy5fbW91bnRPcmRlcj1DKyssdGhpcy5faG9zdFBhcmVudD10LHRoaXMuX2hvc3RDb250 YWluZXJJbmZvPW47dmFyIGMscD10aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcyxkPXRoaXMuX3By b2Nlc3NDb250ZXh0KHUpLGg9dGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSxtPWUuZ2V0VXBkYXRl UXVldWUoKSxnPWkoaCkseT10aGlzLl9jb25zdHJ1Y3RDb21wb25lbnQoZyxwLGQsbSk7Z3x8bnVs bCE9eSYmbnVsbCE9eS5yZW5kZXI/YShoKT90aGlzLl9jb21wb3NpdGVUeXBlPV8uUHVyZUNsYXNz OnRoaXMuX2NvbXBvc2l0ZVR5cGU9Xy5JbXB1cmVDbGFzczooYz15LG8oaCxjKSxudWxsPT09eXx8 eT09PSExfHxsLmlzVmFsaWRFbGVtZW50KHkpP3ZvaWQgMDpzKCIxMDUiLGguZGlzcGxheU5hbWV8 fGgubmFtZXx8IkNvbXBvbmVudCIpLHk9bmV3IHIoaCksdGhpcy5fY29tcG9zaXRlVHlwZT1fLlN0 YXRlbGVzc0Z1bmN0aW9uYWwpLHkucHJvcHM9cCx5LmNvbnRleHQ9ZCx5LnJlZnM9dix5LnVwZGF0 ZXI9bSx0aGlzLl9pbnN0YW5jZT15LGYuc2V0KHksdGhpcyk7dmFyIGI9eS5zdGF0ZTt2b2lkIDA9 PT1iJiYoeS5zdGF0ZT1iPW51bGwpLCJvYmplY3QiIT10eXBlb2YgYnx8QXJyYXkuaXNBcnJheShi KT9zKCIxMDYiLHRoaXMuZ2V0TmFtZSgpfHwiUmVhY3RDb21wb3NpdGVDb21wb25lbnQiKTp2b2lk IDAsdGhpcy5fcGVuZGluZ1N0YXRlUXVldWU9bnVsbCx0aGlzLl9wZW5kaW5nUmVwbGFjZVN0YXRl PSExLHRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZT0hMTt2YXIgRTtyZXR1cm4gRT15LnVuc3RhYmxl X2hhbmRsZUVycm9yP3RoaXMucGVyZm9ybUluaXRpYWxNb3VudFdpdGhFcnJvckhhbmRsaW5nKGMs dCxuLGUsdSk6dGhpcy5wZXJmb3JtSW5pdGlhbE1vdW50KGMsdCxuLGUsdSkseS5jb21wb25lbnRE aWRNb3VudCYmZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHkuY29tcG9uZW50RGlkTW91 bnQseSksRX0sX2NvbnN0cnVjdENvbXBvbmVudDpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhp cy5fY29uc3RydWN0Q29tcG9uZW50V2l0aG91dE93bmVyKGUsdCxuLHIpfSxfY29uc3RydWN0Q29t cG9uZW50V2l0aG91dE93bmVyOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPXRoaXMuX2N1cnJlbnRF bGVtZW50LnR5cGU7cmV0dXJuIGU/bmV3IG8odCxuLHIpOm8odCxuLHIpfSxwZXJmb3JtSW5pdGlh bE1vdW50V2l0aEVycm9ySGFuZGxpbmc6ZnVuY3Rpb24oZSx0LG4scixvKXt2YXIgaSxhPXIuY2hl Y2twb2ludCgpO3RyeXtpPXRoaXMucGVyZm9ybUluaXRpYWxNb3VudChlLHQsbixyLG8pfWNhdGNo KHMpe3Iucm9sbGJhY2soYSksdGhpcy5faW5zdGFuY2UudW5zdGFibGVfaGFuZGxlRXJyb3Iocyks dGhpcy5fcGVuZGluZ1N0YXRlUXVldWUmJih0aGlzLl9pbnN0YW5jZS5zdGF0ZT10aGlzLl9wcm9j ZXNzUGVuZGluZ1N0YXRlKHRoaXMuX2luc3RhbmNlLnByb3BzLHRoaXMuX2luc3RhbmNlLmNvbnRl eHQpKSxhPXIuY2hlY2twb2ludCgpLHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50LnVubW91bnRDb21w b25lbnQoITApLHIucm9sbGJhY2soYSksaT10aGlzLnBlcmZvcm1Jbml0aWFsTW91bnQoZSx0LG4s cixvKX1yZXR1cm4gaX0scGVyZm9ybUluaXRpYWxNb3VudDpmdW5jdGlvbihlLHQsbixyLG8pe3Zh ciBpPXRoaXMuX2luc3RhbmNlLGE9MDtpLmNvbXBvbmVudFdpbGxNb3VudCYmKGkuY29tcG9uZW50 V2lsbE1vdW50KCksdGhpcy5fcGVuZGluZ1N0YXRlUXVldWUmJihpLnN0YXRlPXRoaXMuX3Byb2Nl c3NQZW5kaW5nU3RhdGUoaS5wcm9wcyxpLmNvbnRleHQpKSksdm9pZCAwPT09ZSYmKGU9dGhpcy5f cmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50KCkpO3ZhciBzPWguZ2V0VHlwZShlKTt0aGlzLl9yZW5k ZXJlZE5vZGVUeXBlPXM7dmFyIHU9dGhpcy5faW5zdGFudGlhdGVSZWFjdENvbXBvbmVudChlLHMh PT1oLkVNUFRZKTt0aGlzLl9yZW5kZXJlZENvbXBvbmVudD11O3ZhciBsPW0ubW91bnRDb21wb25l bnQodSxyLHQsbix0aGlzLl9wcm9jZXNzQ2hpbGRDb250ZXh0KG8pLGEpO3JldHVybiBsfSxnZXRI b3N0Tm9kZTpmdW5jdGlvbigpe3JldHVybiBtLmdldEhvc3ROb2RlKHRoaXMuX3JlbmRlcmVkQ29t cG9uZW50KX0sdW5tb3VudENvbXBvbmVudDpmdW5jdGlvbihlKXtpZih0aGlzLl9yZW5kZXJlZENv bXBvbmVudCl7dmFyIHQ9dGhpcy5faW5zdGFuY2U7aWYodC5jb21wb25lbnRXaWxsVW5tb3VudCYm IXQuX2NhbGxlZENvbXBvbmVudFdpbGxVbm1vdW50KWlmKHQuX2NhbGxlZENvbXBvbmVudFdpbGxV bm1vdW50PSEwLGUpe3ZhciBuPXRoaXMuZ2V0TmFtZSgpKyIuY29tcG9uZW50V2lsbFVubW91bnQo KSI7ZC5pbnZva2VHdWFyZGVkQ2FsbGJhY2sobix0LmNvbXBvbmVudFdpbGxVbm1vdW50LmJpbmQo dCkpfWVsc2UgdC5jb21wb25lbnRXaWxsVW5tb3VudCgpO3RoaXMuX3JlbmRlcmVkQ29tcG9uZW50 JiYobS51bm1vdW50Q29tcG9uZW50KHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50LGUpLHRoaXMuX3Jl bmRlcmVkTm9kZVR5cGU9bnVsbCx0aGlzLl9yZW5kZXJlZENvbXBvbmVudD1udWxsLHRoaXMuX2lu c3RhbmNlPW51bGwpLHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlPW51bGwsdGhpcy5fcGVuZGluZ1Jl cGxhY2VTdGF0ZT0hMSx0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGU9ITEsdGhpcy5fcGVuZGluZ0Nh bGxiYWNrcz1udWxsLHRoaXMuX3BlbmRpbmdFbGVtZW50PW51bGwsdGhpcy5fY29udGV4dD1udWxs LHRoaXMuX3Jvb3ROb2RlSUQ9MCx0aGlzLl90b3BMZXZlbFdyYXBwZXI9bnVsbCxmLnJlbW92ZSh0 KX19LF9tYXNrQ29udGV4dDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9jdXJyZW50RWxlbWVudC50 eXBlLG49dC5jb250ZXh0VHlwZXM7aWYoIW4pcmV0dXJuIHY7dmFyIHI9e307Zm9yKHZhciBvIGlu IG4pcltvXT1lW29dO3JldHVybiByfSxfcHJvY2Vzc0NvbnRleHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9 dGhpcy5fbWFza0NvbnRleHQoZSk7cmV0dXJuIHR9LF9wcm9jZXNzQ2hpbGRDb250ZXh0OmZ1bmN0 aW9uKGUpe3ZhciB0LG49dGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSxyPXRoaXMuX2luc3RhbmNl O2lmKHIuZ2V0Q2hpbGRDb250ZXh0JiYodD1yLmdldENoaWxkQ29udGV4dCgpKSx0KXsib2JqZWN0 IiE9dHlwZW9mIG4uY2hpbGRDb250ZXh0VHlwZXM/cygiMTA3Iix0aGlzLmdldE5hbWUoKXx8IlJl YWN0Q29tcG9zaXRlQ29tcG9uZW50Iik6dm9pZCAwO2Zvcih2YXIgbyBpbiB0KW8gaW4gbi5jaGls ZENvbnRleHRUeXBlcz92b2lkIDA6cygiMTA4Iix0aGlzLmdldE5hbWUoKXx8IlJlYWN0Q29tcG9z aXRlQ29tcG9uZW50IixvKTtyZXR1cm4gdSh7fSxlLHQpfXJldHVybiBlfSxfY2hlY2tDb250ZXh0 VHlwZXM6ZnVuY3Rpb24oZSx0LG4pe30scmVjZWl2ZUNvbXBvbmVudDpmdW5jdGlvbihlLHQsbil7 dmFyIHI9dGhpcy5fY3VycmVudEVsZW1lbnQsbz10aGlzLl9jb250ZXh0O3RoaXMuX3BlbmRpbmdF bGVtZW50PW51bGwsdGhpcy51cGRhdGVDb21wb25lbnQodCxyLGUsbyxuKX0scGVyZm9ybVVwZGF0 ZUlmTmVjZXNzYXJ5OmZ1bmN0aW9uKGUpe251bGwhPXRoaXMuX3BlbmRpbmdFbGVtZW50P20ucmVj ZWl2ZUNvbXBvbmVudCh0aGlzLHRoaXMuX3BlbmRpbmdFbGVtZW50LGUsdGhpcy5fY29udGV4dCk6 bnVsbCE9PXRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlfHx0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGU/ dGhpcy51cGRhdGVDb21wb25lbnQoZSx0aGlzLl9jdXJyZW50RWxlbWVudCx0aGlzLl9jdXJyZW50 RWxlbWVudCx0aGlzLl9jb250ZXh0LHRoaXMuX2NvbnRleHQpOnRoaXMuX3VwZGF0ZUJhdGNoTnVt YmVyPW51bGx9LHVwZGF0ZUNvbXBvbmVudDpmdW5jdGlvbihlLHQsbixyLG8pe3ZhciBpPXRoaXMu X2luc3RhbmNlO251bGw9PWk/cygiMTM2Iix0aGlzLmdldE5hbWUoKXx8IlJlYWN0Q29tcG9zaXRl Q29tcG9uZW50Iik6dm9pZCAwO3ZhciBhLHU9ITE7dGhpcy5fY29udGV4dD09PW8/YT1pLmNvbnRl eHQ6KGE9dGhpcy5fcHJvY2Vzc0NvbnRleHQobyksdT0hMCk7dmFyIGw9dC5wcm9wcyxjPW4ucHJv cHM7dCE9PW4mJih1PSEwKSx1JiZpLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMmJmkuY29tcG9u ZW50V2lsbFJlY2VpdmVQcm9wcyhjLGEpO3ZhciBwPXRoaXMuX3Byb2Nlc3NQZW5kaW5nU3RhdGUo YyxhKSxkPSEwO3RoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZXx8KGkuc2hvdWxkQ29tcG9uZW50VXBk YXRlP2Q9aS5zaG91bGRDb21wb25lbnRVcGRhdGUoYyxwLGEpOnRoaXMuX2NvbXBvc2l0ZVR5cGU9 PT1fLlB1cmVDbGFzcyYmKGQ9IWcobCxjKXx8IWcoaS5zdGF0ZSxwKSkpLHRoaXMuX3VwZGF0ZUJh dGNoTnVtYmVyPW51bGwsZD8odGhpcy5fcGVuZGluZ0ZvcmNlVXBkYXRlPSExLHRoaXMuX3BlcmZv cm1Db21wb25lbnRVcGRhdGUobixjLHAsYSxlLG8pKToodGhpcy5fY3VycmVudEVsZW1lbnQ9bix0 aGlzLl9jb250ZXh0PW8saS5wcm9wcz1jLGkuc3RhdGU9cCxpLmNvbnRleHQ9YSl9LF9wcm9jZXNz UGVuZGluZ1N0YXRlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5faW5zdGFuY2Uscj10aGlzLl9w ZW5kaW5nU3RhdGVRdWV1ZSxvPXRoaXMuX3BlbmRpbmdSZXBsYWNlU3RhdGU7aWYodGhpcy5fcGVu ZGluZ1JlcGxhY2VTdGF0ZT0hMSx0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZT1udWxsLCFyKXJldHVy biBuLnN0YXRlO2lmKG8mJjE9PT1yLmxlbmd0aClyZXR1cm4gclswXTtmb3IodmFyIGk9dSh7fSxv P3JbMF06bi5zdGF0ZSksYT1vPzE6MDthPHIubGVuZ3RoO2ErKyl7dmFyIHM9clthXTt1KGksImZ1 bmN0aW9uIj09dHlwZW9mIHM/cy5jYWxsKG4saSxlLHQpOnMpfXJldHVybiBpfSxfcGVyZm9ybUNv bXBvbmVudFVwZGF0ZTpmdW5jdGlvbihlLHQsbixyLG8saSl7dmFyIGEscyx1LGw9dGhpcy5faW5z dGFuY2UsYz1Cb29sZWFuKGwuY29tcG9uZW50RGlkVXBkYXRlKTtjJiYoYT1sLnByb3BzLHM9bC5z dGF0ZSx1PWwuY29udGV4dCksbC5jb21wb25lbnRXaWxsVXBkYXRlJiZsLmNvbXBvbmVudFdpbGxV cGRhdGUodCxuLHIpLHRoaXMuX2N1cnJlbnRFbGVtZW50PWUsdGhpcy5fY29udGV4dD1pLGwucHJv cHM9dCxsLnN0YXRlPW4sbC5jb250ZXh0PXIsdGhpcy5fdXBkYXRlUmVuZGVyZWRDb21wb25lbnQo byxpKSxjJiZvLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUobC5jb21wb25lbnREaWRVcGRh dGUuYmluZChsLGEscyx1KSxsKX0sX3VwZGF0ZVJlbmRlcmVkQ29tcG9uZW50OmZ1bmN0aW9uKGUs dCl7dmFyIG49dGhpcy5fcmVuZGVyZWRDb21wb25lbnQscj1uLl9jdXJyZW50RWxlbWVudCxvPXRo aXMuX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudCgpLGk9MDtpZih5KHIsbykpbS5yZWNlaXZlQ29t cG9uZW50KG4sbyxlLHRoaXMuX3Byb2Nlc3NDaGlsZENvbnRleHQodCkpO2Vsc2V7dmFyIGE9bS5n ZXRIb3N0Tm9kZShuKTttLnVubW91bnRDb21wb25lbnQobiwhMSk7dmFyIHM9aC5nZXRUeXBlKG8p O3RoaXMuX3JlbmRlcmVkTm9kZVR5cGU9czt2YXIgdT10aGlzLl9pbnN0YW50aWF0ZVJlYWN0Q29t cG9uZW50KG8scyE9PWguRU1QVFkpO3RoaXMuX3JlbmRlcmVkQ29tcG9uZW50PXU7dmFyIGw9bS5t b3VudENvbXBvbmVudCh1LGUsdGhpcy5faG9zdFBhcmVudCx0aGlzLl9ob3N0Q29udGFpbmVySW5m byx0aGlzLl9wcm9jZXNzQ2hpbGRDb250ZXh0KHQpLGkpO3RoaXMuX3JlcGxhY2VOb2RlV2l0aE1h cmt1cChhLGwsbil9fSxfcmVwbGFjZU5vZGVXaXRoTWFya3VwOmZ1bmN0aW9uKGUsdCxuKXtjLnJl cGxhY2VOb2RlV2l0aE1hcmt1cChlLHQsbil9LF9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnRXaXRo b3V0T3duZXJPckNvbnRleHQ6ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXMuX2luc3RhbmNlO3JldHVy biBlPXQucmVuZGVyKCl9LF9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnQ6ZnVuY3Rpb24oKXt2YXIg ZTtpZih0aGlzLl9jb21wb3NpdGVUeXBlIT09Xy5TdGF0ZWxlc3NGdW5jdGlvbmFsKXtwLmN1cnJl bnQ9dGhpczt0cnl7ZT10aGlzLl9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnRXaXRob3V0T3duZXJP ckNvbnRleHQoKX1maW5hbGx5e3AuY3VycmVudD1udWxsfX1lbHNlIGU9dGhpcy5fcmVuZGVyVmFs aWRhdGVkQ29tcG9uZW50V2l0aG91dE93bmVyT3JDb250ZXh0KCk7cmV0dXJuIG51bGw9PT1lfHxl PT09ITF8fGwuaXNWYWxpZEVsZW1lbnQoZSk/dm9pZCAwOnMoIjEwOSIsdGhpcy5nZXROYW1lKCl8 fCJSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCIpLGV9LGF0dGFjaFJlZjpmdW5jdGlvbihlLHQpe3Zh ciBuPXRoaXMuZ2V0UHVibGljSW5zdGFuY2UoKTtudWxsPT1uP3MoIjExMCIpOnZvaWQgMDt2YXIg cj10LmdldFB1YmxpY0luc3RhbmNlKCksbz1uLnJlZnM9PT12P24ucmVmcz17fTpuLnJlZnM7b1tl XT1yfSxkZXRhY2hSZWY6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXRQdWJsaWNJbnN0YW5jZSgp LnJlZnM7ZGVsZXRlIHRbZV19LGdldE5hbWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9jdXJyZW50 RWxlbWVudC50eXBlLHQ9dGhpcy5faW5zdGFuY2UmJnRoaXMuX2luc3RhbmNlLmNvbnN0cnVjdG9y O3JldHVybiBlLmRpc3BsYXlOYW1lfHx0JiZ0LmRpc3BsYXlOYW1lfHxlLm5hbWV8fHQmJnQubmFt ZXx8bnVsbH0sZ2V0UHVibGljSW5zdGFuY2U6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9pbnN0YW5j ZTtyZXR1cm4gdGhpcy5fY29tcG9zaXRlVHlwZT09PV8uU3RhdGVsZXNzRnVuY3Rpb25hbD9udWxs OmV9LF9pbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50Om51bGx9O3QuZXhwb3J0cz1ifSx7MTEzOjEx MywxMTc6MTE3LDEyMDoxMjAsMTIxOjEyMSwxMzA6MTMwLDEzNzoxMzcsMTQxOjE0MSwxNDI6MTQy LDE0MzoxNDMsMjg6MjgsNTA6NTAsNTc6NTcsNTg6NTgsNjI6NjIsNjY6NjZ9XSwzMDpbZnVuY3Rp b24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDMzKSxvPWUoNDcpLGk9ZSg2MCksYT1lKDY2 KSxzPWUoNzEpLHU9ZSg3MiksbD1lKDk2KSxjPWUoMTAzKSxwPWUoMTE0KTtlKDE0Mik7by5pbmpl Y3QoKTt2YXIgZD17ZmluZERPTU5vZGU6bCxyZW5kZXI6aS5yZW5kZXIsdW5tb3VudENvbXBvbmVu dEF0Tm9kZTppLnVubW91bnRDb21wb25lbnRBdE5vZGUsdmVyc2lvbjp1LHVuc3RhYmxlX2JhdGNo ZWRVcGRhdGVzOnMuYmF0Y2hlZFVwZGF0ZXMsdW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250 YWluZXI6cH07InVuZGVmaW5lZCIhPXR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09L X18mJiJmdW5jdGlvbiI9PXR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uaW5q ZWN0JiZfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uaW5qZWN0KHtDb21wb25lbnRUcmVl OntnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZTpyLmdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2Rl LGdldE5vZGVGcm9tSW5zdGFuY2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX3JlbmRlcmVkQ29tcG9u ZW50JiYoZT1jKGUpKSxlP3IuZ2V0Tm9kZUZyb21JbnN0YW5jZShlKTpudWxsfX0sTW91bnQ6aSxS ZWNvbmNpbGVyOmF9KTt0LmV4cG9ydHM9ZH0sezEwMzoxMDMsMTE0OjExNCwxNDI6MTQyLDMzOjMz LDQ3OjQ3LDYwOjYwLDY2OjY2LDcxOjcxLDcyOjcyLDk2Ojk2fV0sMzE6W2Z1bmN0aW9uKGUsdCxu KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtpZihlKXt2YXIgdD1lLl9jdXJyZW50RWxlbWVu dC5fb3duZXJ8fG51bGw7aWYodCl7dmFyIG49dC5nZXROYW1lKCk7aWYobilyZXR1cm4iIFRoaXMg RE9NIG5vZGUgd2FzIHJlbmRlcmVkIGJ5IGAiK24rImAuIn19cmV0dXJuIiJ9ZnVuY3Rpb24gbyhl LHQpe3QmJihYW2UuX3RhZ10mJihudWxsIT10LmNoaWxkcmVufHxudWxsIT10LmRhbmdlcm91c2x5 U2V0SW5uZXJIVE1MP20oIjEzNyIsZS5fdGFnLGUuX2N1cnJlbnRFbGVtZW50Ll9vd25lcj8iIENo ZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mICIrZS5fY3VycmVudEVsZW1lbnQuX293bmVyLmdldE5h bWUoKSsiLiI6IiIpOnZvaWQgMCksbnVsbCE9dC5kYW5nZXJvdXNseVNldElubmVySFRNTCYmKG51 bGwhPXQuY2hpbGRyZW4/bSgiNjAiKTp2b2lkIDAsIm9iamVjdCI9PXR5cGVvZiB0LmRhbmdlcm91 c2x5U2V0SW5uZXJIVE1MJiZXIGluIHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw/dm9pZCAwOm0o IjYxIikpLG51bGwhPXQuc3R5bGUmJiJvYmplY3QiIT10eXBlb2YgdC5zdHlsZT9tKCI2MiIscihl KSk6dm9pZCAwKX1mdW5jdGlvbiBpKGUsdCxuLHIpe2lmKCEociBpbnN0YW5jZW9mIFIpKXt2YXIg bz1lLl9ob3N0Q29udGFpbmVySW5mbyxpPW8uX25vZGUmJm8uX25vZGUubm9kZVR5cGU9PT1xLHM9 aT9vLl9ub2RlOm8uX293bmVyRG9jdW1lbnQ7Rih0LHMpLHIuZ2V0UmVhY3RNb3VudFJlYWR5KCku ZW5xdWV1ZShhLHtpbnN0OmUscmVnaXN0cmF0aW9uTmFtZTp0LGxpc3RlbmVyOm59KX19ZnVuY3Rp b24gYSgpe3ZhciBlPXRoaXM7eC5wdXRMaXN0ZW5lcihlLmluc3QsZS5yZWdpc3RyYXRpb25OYW1l LGUubGlzdGVuZXIpfWZ1bmN0aW9uIHMoKXt2YXIgZT10aGlzO04ucG9zdE1vdW50V3JhcHBlcihl KX1mdW5jdGlvbiB1KCl7dmFyIGU9dGhpcztJLnBvc3RNb3VudFdyYXBwZXIoZSl9ZnVuY3Rpb24g bCgpe3ZhciBlPXRoaXM7Uy5wb3N0TW91bnRXcmFwcGVyKGUpfWZ1bmN0aW9uIGMoKXt2YXIgZT10 aGlzO2UuX3Jvb3ROb2RlSUQ/dm9pZCAwOm0oIjYzIik7dmFyIHQ9VShlKTtzd2l0Y2godD92b2lk IDA6bSgiNjQiKSxlLl90YWcpe2Nhc2UiaWZyYW1lIjpjYXNlIm9iamVjdCI6ZS5fd3JhcHBlclN0 YXRlLmxpc3RlbmVycz1bVC50cmFwQnViYmxlZEV2ZW50KCJ0b3BMb2FkIiwibG9hZCIsdCldO2Jy ZWFrO2Nhc2UidmlkZW8iOmNhc2UiYXVkaW8iOmUuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM9W107 Zm9yKHZhciBuIGluIEspSy5oYXNPd25Qcm9wZXJ0eShuKSYmZS5fd3JhcHBlclN0YXRlLmxpc3Rl bmVycy5wdXNoKFQudHJhcEJ1YmJsZWRFdmVudChuLEtbbl0sdCkpO2JyZWFrO2Nhc2Uic291cmNl IjplLl93cmFwcGVyU3RhdGUubGlzdGVuZXJzPVtULnRyYXBCdWJibGVkRXZlbnQoInRvcEVycm9y IiwiZXJyb3IiLHQpXTticmVhaztjYXNlImltZyI6ZS5fd3JhcHBlclN0YXRlLmxpc3RlbmVycz1b VC50cmFwQnViYmxlZEV2ZW50KCJ0b3BFcnJvciIsImVycm9yIix0KSxULnRyYXBCdWJibGVkRXZl bnQoInRvcExvYWQiLCJsb2FkIix0KV07YnJlYWs7Y2FzZSJmb3JtIjplLl93cmFwcGVyU3RhdGUu bGlzdGVuZXJzPVtULnRyYXBCdWJibGVkRXZlbnQoInRvcFJlc2V0IiwicmVzZXQiLHQpLFQudHJh cEJ1YmJsZWRFdmVudCgidG9wU3VibWl0Iiwic3VibWl0Iix0KV07YnJlYWs7Y2FzZSJpbnB1dCI6 Y2FzZSJzZWxlY3QiOmNhc2UidGV4dGFyZWEiOmUuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM9W1Qu dHJhcEJ1YmJsZWRFdmVudCgidG9wSW52YWxpZCIsImludmFsaWQiLHQpXX19ZnVuY3Rpb24gcCgp e00ucG9zdFVwZGF0ZVdyYXBwZXIodGhpcyl9ZnVuY3Rpb24gZChlKXskLmNhbGwoRyxlKXx8KFEu dGVzdChlKT92b2lkIDA6bSgiNjUiLGUpLEdbZV09ITApfWZ1bmN0aW9uIGYoZSx0KXtyZXR1cm4g ZS5pbmRleE9mKCItIik+PTB8fG51bGwhPXQuaXN9ZnVuY3Rpb24gaChlKXt2YXIgdD1lLnR5cGU7 ZCh0KSx0aGlzLl9jdXJyZW50RWxlbWVudD1lLHRoaXMuX3RhZz10LnRvTG93ZXJDYXNlKCksdGhp cy5fbmFtZXNwYWNlVVJJPW51bGwsdGhpcy5fcmVuZGVyZWRDaGlsZHJlbj1udWxsLHRoaXMuX3By ZXZpb3VzU3R5bGU9bnVsbCx0aGlzLl9wcmV2aW91c1N0eWxlQ29weT1udWxsLHRoaXMuX2hvc3RO b2RlPW51bGwsdGhpcy5faG9zdFBhcmVudD1udWxsLHRoaXMuX3Jvb3ROb2RlSUQ9MCx0aGlzLl9k b21JRD0wLHRoaXMuX2hvc3RDb250YWluZXJJbmZvPW51bGwsdGhpcy5fd3JhcHBlclN0YXRlPW51 bGwsdGhpcy5fdG9wTGV2ZWxXcmFwcGVyPW51bGwsdGhpcy5fZmxhZ3M9MH12YXIgbT1lKDExMyks dj1lKDE0MyksZz1lKDIpLHk9ZSg1KSxfPWUoOSksQz1lKDEwKSxiPWUoMTEpLEU9ZSgxMikseD1l KDE2KSx3PWUoMTcpLFQ9ZSgyNSksaz1lKDMyKSxQPWUoMzMpLE49ZSgzOCksUz1lKDM5KSxNPWUo NDApLEk9ZSg0MyksTz0oZSg1OCksZSg2MSkpLFI9ZSg2OCksQT0oZSgxMjkpLGUoOTUpKSxEPShl KDEzNyksZSgxMTApLGUoMTQxKSxlKDExOSksZSgxNDIpLGspLEw9eC5kZWxldGVMaXN0ZW5lcixV PVAuZ2V0Tm9kZUZyb21JbnN0YW5jZSxGPVQubGlzdGVuVG8sVj13LnJlZ2lzdHJhdGlvbk5hbWVN b2R1bGVzLEI9e3N0cmluZzohMCxudW1iZXI6ITB9LGo9InN0eWxlIixXPSJfX2h0bWwiLEg9e2No aWxkcmVuOm51bGwsZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6bnVsbCxzdXBwcmVzc0NvbnRlbnRF ZGl0YWJsZVdhcm5pbmc6bnVsbH0scT0xMSxLPXt0b3BBYm9ydDoiYWJvcnQiLHRvcENhblBsYXk6 ImNhbnBsYXkiLHRvcENhblBsYXlUaHJvdWdoOiJjYW5wbGF5dGhyb3VnaCIsdG9wRHVyYXRpb25D aGFuZ2U6ImR1cmF0aW9uY2hhbmdlIix0b3BFbXB0aWVkOiJlbXB0aWVkIix0b3BFbmNyeXB0ZWQ6 ImVuY3J5cHRlZCIsdG9wRW5kZWQ6ImVuZGVkIix0b3BFcnJvcjoiZXJyb3IiLHRvcExvYWRlZERh dGE6ImxvYWRlZGRhdGEiLHRvcExvYWRlZE1ldGFkYXRhOiJsb2FkZWRtZXRhZGF0YSIsdG9wTG9h ZFN0YXJ0OiJsb2Fkc3RhcnQiLHRvcFBhdXNlOiJwYXVzZSIsdG9wUGxheToicGxheSIsdG9wUGxh eWluZzoicGxheWluZyIsdG9wUHJvZ3Jlc3M6InByb2dyZXNzIix0b3BSYXRlQ2hhbmdlOiJyYXRl Y2hhbmdlIix0b3BTZWVrZWQ6InNlZWtlZCIsdG9wU2Vla2luZzoic2Vla2luZyIsdG9wU3RhbGxl ZDoic3RhbGxlZCIsdG9wU3VzcGVuZDoic3VzcGVuZCIsdG9wVGltZVVwZGF0ZToidGltZXVwZGF0 ZSIsdG9wVm9sdW1lQ2hhbmdlOiJ2b2x1bWVjaGFuZ2UiLHRvcFdhaXRpbmc6IndhaXRpbmcifSx6 PXthcmVhOiEwLGJhc2U6ITAsYnI6ITAsY29sOiEwLGVtYmVkOiEwLGhyOiEwLGltZzohMCxpbnB1 dDohMCxrZXlnZW46ITAsbGluazohMCxtZXRhOiEwLHBhcmFtOiEwLHNvdXJjZTohMCx0cmFjazoh MCx3YnI6ITB9LFk9e2xpc3Rpbmc6ITAscHJlOiEwLHRleHRhcmVhOiEwfSxYPXYoe21lbnVpdGVt OiEwfSx6KSxRPS9eW2EtekEtWl1bYS16QS1aOl9cLlwtXGRdKiQvLEc9e30sJD17fS5oYXNPd25Q cm9wZXJ0eSxaPTE7aC5kaXNwbGF5TmFtZT0iUmVhY3RET01Db21wb25lbnQiLGguTWl4aW49e21v dW50Q29tcG9uZW50OmZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMuX3Jvb3ROb2RlSUQ9WisrLHRoaXMu X2RvbUlEPW4uX2lkQ291bnRlcisrLHRoaXMuX2hvc3RQYXJlbnQ9dCx0aGlzLl9ob3N0Q29udGFp bmVySW5mbz1uO3ZhciBpPXRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzO3N3aXRjaCh0aGlzLl90 YWcpe2Nhc2UiYXVkaW8iOmNhc2UiZm9ybSI6Y2FzZSJpZnJhbWUiOmNhc2UiaW1nIjpjYXNlImxp bmsiOmNhc2Uib2JqZWN0IjpjYXNlInNvdXJjZSI6Y2FzZSJ2aWRlbyI6dGhpcy5fd3JhcHBlclN0 YXRlPXtsaXN0ZW5lcnM6bnVsbH0sZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGMsdGhp cyk7YnJlYWs7Y2FzZSJpbnB1dCI6Ti5tb3VudFdyYXBwZXIodGhpcyxpLHQpLGk9Ti5nZXRIb3N0 UHJvcHModGhpcyxpKSxlLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoYyx0aGlzKTticmVh aztjYXNlIm9wdGlvbiI6Uy5tb3VudFdyYXBwZXIodGhpcyxpLHQpLGk9Uy5nZXRIb3N0UHJvcHMo dGhpcyxpKTticmVhaztjYXNlInNlbGVjdCI6TS5tb3VudFdyYXBwZXIodGhpcyxpLHQpLGk9TS5n ZXRIb3N0UHJvcHModGhpcyxpKSxlLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoYyx0aGlz KTticmVhaztjYXNlInRleHRhcmVhIjpJLm1vdW50V3JhcHBlcih0aGlzLGksdCksaT1JLmdldEhv c3RQcm9wcyh0aGlzLGkpLGUuZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShjLHRoaXMpfW8o dGhpcyxpKTt2YXIgYSxwO251bGwhPXQ/KGE9dC5fbmFtZXNwYWNlVVJJLHA9dC5fdGFnKTpuLl90 YWcmJihhPW4uX25hbWVzcGFjZVVSSSxwPW4uX3RhZyksKG51bGw9PWF8fGE9PT1DLnN2ZyYmImZv cmVpZ25vYmplY3QiPT09cCkmJihhPUMuaHRtbCksYT09PUMuaHRtbCYmKCJzdmciPT09dGhpcy5f dGFnP2E9Qy5zdmc6Im1hdGgiPT09dGhpcy5fdGFnJiYoYT1DLm1hdGhtbCkpLHRoaXMuX25hbWVz cGFjZVVSST1hO3ZhciBkO2lmKGUudXNlQ3JlYXRlRWxlbWVudCl7dmFyIGYsaD1uLl9vd25lckRv Y3VtZW50O2lmKGE9PT1DLmh0bWwpaWYoInNjcmlwdCI9PT10aGlzLl90YWcpe3ZhciBtPWguY3Jl YXRlRWxlbWVudCgiZGl2Iiksdj10aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO20uaW5uZXJIVE1M PSI8Iit2KyI+PC8iK3YrIj4iLGY9bS5yZW1vdmVDaGlsZChtLmZpcnN0Q2hpbGQpfWVsc2UgZj1p LmlzP2guY3JlYXRlRWxlbWVudCh0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlLGkuaXMpOmguY3Jl YXRlRWxlbWVudCh0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlKTtlbHNlIGY9aC5jcmVhdGVFbGVt ZW50TlMoYSx0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlKTtQLnByZWNhY2hlTm9kZSh0aGlzLGYp LHRoaXMuX2ZsYWdzfD1ELmhhc0NhY2hlZENoaWxkTm9kZXMsdGhpcy5faG9zdFBhcmVudHx8RS5z ZXRBdHRyaWJ1dGVGb3JSb290KGYpLHRoaXMuX3VwZGF0ZURPTVByb3BlcnRpZXMobnVsbCxpLGUp O3ZhciB5PV8oZik7dGhpcy5fY3JlYXRlSW5pdGlhbENoaWxkcmVuKGUsaSxyLHkpLGQ9eX1lbHNl e3ZhciBiPXRoaXMuX2NyZWF0ZU9wZW5UYWdNYXJrdXBBbmRQdXRMaXN0ZW5lcnMoZSxpKSx4PXRo aXMuX2NyZWF0ZUNvbnRlbnRNYXJrdXAoZSxpLHIpO2Q9IXgmJnpbdGhpcy5fdGFnXT9iKyIvPiI6 YisiPiIreCsiPC8iK3RoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGUrIj4ifXN3aXRjaCh0aGlzLl90 YWcpe2Nhc2UiaW5wdXQiOmUuZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShzLHRoaXMpLGku YXV0b0ZvY3VzJiZlLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoZy5mb2N1c0RPTUNvbXBv bmVudCx0aGlzKTticmVhaztjYXNlInRleHRhcmVhIjplLmdldFJlYWN0TW91bnRSZWFkeSgpLmVu cXVldWUodSx0aGlzKSxpLmF1dG9Gb2N1cyYmZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVl KGcuZm9jdXNET01Db21wb25lbnQsdGhpcyk7YnJlYWs7Y2FzZSJzZWxlY3QiOmkuYXV0b0ZvY3Vz JiZlLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoZy5mb2N1c0RPTUNvbXBvbmVudCx0aGlz KTticmVhaztjYXNlImJ1dHRvbiI6aS5hdXRvRm9jdXMmJmUuZ2V0UmVhY3RNb3VudFJlYWR5KCku ZW5xdWV1ZShnLmZvY3VzRE9NQ29tcG9uZW50LHRoaXMpO2JyZWFrO2Nhc2Uib3B0aW9uIjplLmdl dFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUobCx0aGlzKX1yZXR1cm4gZH0sX2NyZWF0ZU9wZW5U YWdNYXJrdXBBbmRQdXRMaXN0ZW5lcnM6ZnVuY3Rpb24oZSx0KXt2YXIgbj0iPCIrdGhpcy5fY3Vy cmVudEVsZW1lbnQudHlwZTtmb3IodmFyIHIgaW4gdClpZih0Lmhhc093blByb3BlcnR5KHIpKXt2 YXIgbz10W3JdO2lmKG51bGwhPW8paWYoVi5oYXNPd25Qcm9wZXJ0eShyKSlvJiZpKHRoaXMscixv LGUpO2Vsc2V7cj09PWomJihvJiYobz10aGlzLl9wcmV2aW91c1N0eWxlQ29weT12KHt9LHQuc3R5 bGUpKSxvPXkuY3JlYXRlTWFya3VwRm9yU3R5bGVzKG8sdGhpcykpO3ZhciBhPW51bGw7bnVsbCE9 dGhpcy5fdGFnJiZmKHRoaXMuX3RhZyx0KT9ILmhhc093blByb3BlcnR5KHIpfHwoYT1FLmNyZWF0 ZU1hcmt1cEZvckN1c3RvbUF0dHJpYnV0ZShyLG8pKTphPUUuY3JlYXRlTWFya3VwRm9yUHJvcGVy dHkocixvKSxhJiYobis9IiAiK2EpfX1yZXR1cm4gZS5yZW5kZXJUb1N0YXRpY01hcmt1cD9uOih0 aGlzLl9ob3N0UGFyZW50fHwobis9IiAiK0UuY3JlYXRlTWFya3VwRm9yUm9vdCgpKSxuKz0iICIr RS5jcmVhdGVNYXJrdXBGb3JJRCh0aGlzLl9kb21JRCkpfSxfY3JlYXRlQ29udGVudE1hcmt1cDpm dW5jdGlvbihlLHQsbil7dmFyIHI9IiIsbz10LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MO2lmKG51 bGwhPW8pbnVsbCE9by5fX2h0bWwmJihyPW8uX19odG1sKTtlbHNle3ZhciBpPUJbdHlwZW9mIHQu Y2hpbGRyZW5dP3QuY2hpbGRyZW46bnVsbCxhPW51bGwhPWk/bnVsbDp0LmNoaWxkcmVuO2lmKG51 bGwhPWkpcj1BKGkpO2Vsc2UgaWYobnVsbCE9YSl7dmFyIHM9dGhpcy5tb3VudENoaWxkcmVuKGEs ZSxuKTtyPXMuam9pbigiIil9fXJldHVybiBZW3RoaXMuX3RhZ10mJiJcbiI9PT1yLmNoYXJBdCgw KT8iXG4iK3I6cn0sX2NyZWF0ZUluaXRpYWxDaGlsZHJlbjpmdW5jdGlvbihlLHQsbixyKXt2YXIg bz10LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MO2lmKG51bGwhPW8pbnVsbCE9by5fX2h0bWwmJl8u cXVldWVIVE1MKHIsby5fX2h0bWwpO2Vsc2V7dmFyIGk9Qlt0eXBlb2YgdC5jaGlsZHJlbl0/dC5j aGlsZHJlbjpudWxsLGE9bnVsbCE9aT9udWxsOnQuY2hpbGRyZW47aWYobnVsbCE9aSkiIiE9PWkm Jl8ucXVldWVUZXh0KHIsaSk7ZWxzZSBpZihudWxsIT1hKWZvcih2YXIgcz10aGlzLm1vdW50Q2hp bGRyZW4oYSxlLG4pLHU9MDt1PHMubGVuZ3RoO3UrKylfLnF1ZXVlQ2hpbGQocixzW3VdKX19LHJl Y2VpdmVDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuX2N1cnJlbnRFbGVtZW50 O3RoaXMuX2N1cnJlbnRFbGVtZW50PWUsdGhpcy51cGRhdGVDb21wb25lbnQodCxyLGUsbil9LHVw ZGF0ZUNvbXBvbmVudDpmdW5jdGlvbihlLHQsbixyKXt2YXIgaT10LnByb3BzLGE9dGhpcy5fY3Vy cmVudEVsZW1lbnQucHJvcHM7c3dpdGNoKHRoaXMuX3RhZyl7Y2FzZSJpbnB1dCI6aT1OLmdldEhv c3RQcm9wcyh0aGlzLGkpLGE9Ti5nZXRIb3N0UHJvcHModGhpcyxhKTticmVhaztjYXNlIm9wdGlv biI6aT1TLmdldEhvc3RQcm9wcyh0aGlzLGkpLGE9Uy5nZXRIb3N0UHJvcHModGhpcyxhKTticmVh aztjYXNlInNlbGVjdCI6aT1NLmdldEhvc3RQcm9wcyh0aGlzLGkpLGE9TS5nZXRIb3N0UHJvcHMo dGhpcyxhKTticmVhaztjYXNlInRleHRhcmVhIjppPUkuZ2V0SG9zdFByb3BzKHRoaXMsaSksYT1J LmdldEhvc3RQcm9wcyh0aGlzLGEpfXN3aXRjaChvKHRoaXMsYSksdGhpcy5fdXBkYXRlRE9NUHJv cGVydGllcyhpLGEsZSksdGhpcy5fdXBkYXRlRE9NQ2hpbGRyZW4oaSxhLGUsciksdGhpcy5fdGFn KXtjYXNlImlucHV0IjpOLnVwZGF0ZVdyYXBwZXIodGhpcyk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6 SS51cGRhdGVXcmFwcGVyKHRoaXMpO2JyZWFrO2Nhc2Uic2VsZWN0IjplLmdldFJlYWN0TW91bnRS ZWFkeSgpLmVucXVldWUocCx0aGlzKX19LF91cGRhdGVET01Qcm9wZXJ0aWVzOmZ1bmN0aW9uKGUs dCxuKXt2YXIgcixvLGE7Zm9yKHIgaW4gZSlpZighdC5oYXNPd25Qcm9wZXJ0eShyKSYmZS5oYXNP d25Qcm9wZXJ0eShyKSYmbnVsbCE9ZVtyXSlpZihyPT09ail7dmFyIHM9dGhpcy5fcHJldmlvdXNT dHlsZUNvcHk7Zm9yKG8gaW4gcylzLmhhc093blByb3BlcnR5KG8pJiYoYT1hfHx7fSxhW29dPSIi KTt0aGlzLl9wcmV2aW91c1N0eWxlQ29weT1udWxsfWVsc2UgVi5oYXNPd25Qcm9wZXJ0eShyKT9l W3JdJiZMKHRoaXMscik6Zih0aGlzLl90YWcsZSk/SC5oYXNPd25Qcm9wZXJ0eShyKXx8RS5kZWxl dGVWYWx1ZUZvckF0dHJpYnV0ZShVKHRoaXMpLHIpOihiLnByb3BlcnRpZXNbcl18fGIuaXNDdXN0 b21BdHRyaWJ1dGUocikpJiZFLmRlbGV0ZVZhbHVlRm9yUHJvcGVydHkoVSh0aGlzKSxyKTtmb3Io ciBpbiB0KXt2YXIgdT10W3JdLGw9cj09PWo/dGhpcy5fcHJldmlvdXNTdHlsZUNvcHk6bnVsbCE9 ZT9lW3JdOnZvaWQgMDtpZih0Lmhhc093blByb3BlcnR5KHIpJiZ1IT09bCYmKG51bGwhPXV8fG51 bGwhPWwpKWlmKHI9PT1qKWlmKHU/dT10aGlzLl9wcmV2aW91c1N0eWxlQ29weT12KHt9LHUpOnRo aXMuX3ByZXZpb3VzU3R5bGVDb3B5PW51bGwsbCl7Zm9yKG8gaW4gbCkhbC5oYXNPd25Qcm9wZXJ0 eShvKXx8dSYmdS5oYXNPd25Qcm9wZXJ0eShvKXx8KGE9YXx8e30sYVtvXT0iIik7Zm9yKG8gaW4g dSl1Lmhhc093blByb3BlcnR5KG8pJiZsW29dIT09dVtvXSYmKGE9YXx8e30sYVtvXT11W29dKX1l bHNlIGE9dTtlbHNlIGlmKFYuaGFzT3duUHJvcGVydHkocikpdT9pKHRoaXMscix1LG4pOmwmJkwo dGhpcyxyKTtlbHNlIGlmKGYodGhpcy5fdGFnLHQpKUguaGFzT3duUHJvcGVydHkocil8fEUuc2V0 VmFsdWVGb3JBdHRyaWJ1dGUoVSh0aGlzKSxyLHUpO2Vsc2UgaWYoYi5wcm9wZXJ0aWVzW3JdfHxi LmlzQ3VzdG9tQXR0cmlidXRlKHIpKXt2YXIgYz1VKHRoaXMpO251bGwhPXU/RS5zZXRWYWx1ZUZv clByb3BlcnR5KGMscix1KTpFLmRlbGV0ZVZhbHVlRm9yUHJvcGVydHkoYyxyKX19YSYmeS5zZXRW YWx1ZUZvclN0eWxlcyhVKHRoaXMpLGEsdGhpcyl9LF91cGRhdGVET01DaGlsZHJlbjpmdW5jdGlv bihlLHQsbixyKXt2YXIgbz1CW3R5cGVvZiBlLmNoaWxkcmVuXT9lLmNoaWxkcmVuOm51bGwsaT1C W3R5cGVvZiB0LmNoaWxkcmVuXT90LmNoaWxkcmVuOm51bGwsYT1lLmRhbmdlcm91c2x5U2V0SW5u ZXJIVE1MJiZlLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRtbCxzPXQuZGFuZ2Vyb3VzbHlT ZXRJbm5lckhUTUwmJnQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwuX19odG1sLHU9bnVsbCE9bz9u dWxsOmUuY2hpbGRyZW4sbD1udWxsIT1pP251bGw6dC5jaGlsZHJlbixjPW51bGwhPW98fG51bGwh PWEscD1udWxsIT1pfHxudWxsIT1zO251bGwhPXUmJm51bGw9PWw/dGhpcy51cGRhdGVDaGlsZHJl bihudWxsLG4scik6YyYmIXAmJnRoaXMudXBkYXRlVGV4dENvbnRlbnQoIiIpLG51bGwhPWk/byE9 PWkmJnRoaXMudXBkYXRlVGV4dENvbnRlbnQoIiIraSk6bnVsbCE9cz9hIT09cyYmdGhpcy51cGRh dGVNYXJrdXAoIiIrcyk6bnVsbCE9bCYmdGhpcy51cGRhdGVDaGlsZHJlbihsLG4scil9LGdldEhv c3ROb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIFUodGhpcyl9LHVubW91bnRDb21wb25lbnQ6ZnVuY3Rp b24oZSl7c3dpdGNoKHRoaXMuX3RhZyl7Y2FzZSJhdWRpbyI6Y2FzZSJmb3JtIjpjYXNlImlmcmFt ZSI6Y2FzZSJpbWciOmNhc2UibGluayI6Y2FzZSJvYmplY3QiOmNhc2Uic291cmNlIjpjYXNlInZp ZGVvIjp2YXIgdD10aGlzLl93cmFwcGVyU3RhdGUubGlzdGVuZXJzO2lmKHQpZm9yKHZhciBuPTA7 bjx0Lmxlbmd0aDtuKyspdFtuXS5yZW1vdmUoKTticmVhaztjYXNlImh0bWwiOmNhc2UiaGVhZCI6 Y2FzZSJib2R5IjptKCI2NiIsdGhpcy5fdGFnKX10aGlzLnVubW91bnRDaGlsZHJlbihlKSxQLnVu Y2FjaGVOb2RlKHRoaXMpLHguZGVsZXRlQWxsTGlzdGVuZXJzKHRoaXMpLHRoaXMuX3Jvb3ROb2Rl SUQ9MCx0aGlzLl9kb21JRD0wLHRoaXMuX3dyYXBwZXJTdGF0ZT1udWxsfSxnZXRQdWJsaWNJbnN0 YW5jZTpmdW5jdGlvbigpe3JldHVybiBVKHRoaXMpfX0sdihoLnByb3RvdHlwZSxoLk1peGluLE8u TWl4aW4pLHQuZXhwb3J0cz1ofSx7MTA6MTAsMTE6MTEsMTEwOjExMCwxMTM6MTEzLDExOToxMTks MTI6MTIsMTI5OjEyOSwxMzc6MTM3LDE0MToxNDEsMTQyOjE0MiwxNDM6MTQzLDE2OjE2LDE3OjE3 LDI6MiwyNToyNSwzMjozMiwzMzozMywzODozOCwzOTozOSw0MDo0MCw0Mzo0Myw1OjUsNTg6NTgs NjE6NjEsNjg6NjgsOTo5LDk1Ojk1fV0sMzI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7 dmFyIHI9e2hhc0NhY2hlZENoaWxkTm9kZXM6MX07dC5leHBvcnRzPXJ9LHt9XSwzMzpbZnVuY3Rp b24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIDE9PT1lLm5vZGVU eXBlJiZlLmdldEF0dHJpYnV0ZShoKT09PVN0cmluZyh0KXx8OD09PWUubm9kZVR5cGUmJmUubm9k ZVZhbHVlPT09IiByZWFjdC10ZXh0OiAiK3QrIiAifHw4PT09ZS5ub2RlVHlwZSYmZS5ub2RlVmFs dWU9PT0iIHJlYWN0LWVtcHR5OiAiK3QrIiAifWZ1bmN0aW9uIG8oZSl7Zm9yKHZhciB0O3Q9ZS5f cmVuZGVyZWRDb21wb25lbnQ7KWU9dDtyZXR1cm4gZX1mdW5jdGlvbiBpKGUsdCl7dmFyIG49byhl KTtuLl9ob3N0Tm9kZT10LHRbdl09bn1mdW5jdGlvbiBhKGUpe3ZhciB0PWUuX2hvc3ROb2RlO3Qm JihkZWxldGUgdFt2XSxlLl9ob3N0Tm9kZT1udWxsKX1mdW5jdGlvbiBzKGUsdCl7aWYoIShlLl9m bGFncyZtLmhhc0NhY2hlZENoaWxkTm9kZXMpKXt2YXIgbj1lLl9yZW5kZXJlZENoaWxkcmVuLGE9 dC5maXJzdENoaWxkO2U6Zm9yKHZhciBzIGluIG4paWYobi5oYXNPd25Qcm9wZXJ0eShzKSl7dmFy IHU9bltzXSxsPW8odSkuX2RvbUlEO2lmKDAhPT1sKXtmb3IoO251bGwhPT1hO2E9YS5uZXh0U2li bGluZylpZihyKGEsbCkpe2kodSxhKTtjb250aW51ZSBlfXAoIjMyIixsKX19ZS5fZmxhZ3N8PW0u aGFzQ2FjaGVkQ2hpbGROb2Rlc319ZnVuY3Rpb24gdShlKXtpZihlW3ZdKXJldHVybiBlW3ZdO2Zv cih2YXIgdD1bXTshZVt2XTspe2lmKHQucHVzaChlKSwhZS5wYXJlbnROb2RlKXJldHVybiBudWxs O2U9ZS5wYXJlbnROb2RlfWZvcih2YXIgbixyO2UmJihyPWVbdl0pO2U9dC5wb3AoKSluPXIsdC5s ZW5ndGgmJnMocixlKTtyZXR1cm4gbn1mdW5jdGlvbiBsKGUpe3ZhciB0PXUoZSk7cmV0dXJuIG51 bGwhPXQmJnQuX2hvc3ROb2RlPT09ZT90Om51bGx9ZnVuY3Rpb24gYyhlKXtpZih2b2lkIDA9PT1l Ll9ob3N0Tm9kZT9wKCIzMyIpOnZvaWQgMCxlLl9ob3N0Tm9kZSlyZXR1cm4gZS5faG9zdE5vZGU7 Zm9yKHZhciB0PVtdOyFlLl9ob3N0Tm9kZTspdC5wdXNoKGUpLGUuX2hvc3RQYXJlbnQ/dm9pZCAw OnAoIjM0IiksZT1lLl9ob3N0UGFyZW50O2Zvcig7dC5sZW5ndGg7ZT10LnBvcCgpKXMoZSxlLl9o b3N0Tm9kZSk7cmV0dXJuIGUuX2hvc3ROb2RlfXZhciBwPWUoMTEzKSxkPWUoMTEpLGY9ZSgzMiks aD0oZSgxMzcpLGQuSURfQVRUUklCVVRFX05BTUUpLG09Zix2PSJfX3JlYWN0SW50ZXJuYWxJbnN0 YW5jZSQiK01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpLGc9e2dldENsb3Nlc3RJ bnN0YW5jZUZyb21Ob2RlOnUsZ2V0SW5zdGFuY2VGcm9tTm9kZTpsLGdldE5vZGVGcm9tSW5zdGFu Y2U6YyxwcmVjYWNoZUNoaWxkTm9kZXM6cyxwcmVjYWNoZU5vZGU6aSx1bmNhY2hlTm9kZTphfTt0 LmV4cG9ydHM9Z30sezExOjExLDExMzoxMTMsMTM3OjEzNywzMjozMn1dLDM0OltmdW5jdGlvbihl LHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXt2YXIgbj17X3RvcExldmVsV3JhcHBl cjplLF9pZENvdW50ZXI6MSxfb3duZXJEb2N1bWVudDp0P3Qubm9kZVR5cGU9PT1vP3Q6dC5vd25l ckRvY3VtZW50Om51bGwsX25vZGU6dCxfdGFnOnQ/dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOm51 bGwsX25hbWVzcGFjZVVSSTp0P3QubmFtZXNwYWNlVVJJOm51bGx9O3JldHVybiBufXZhciBvPShl KDExOSksOSk7dC5leHBvcnRzPXJ9LHsxMTk6MTE5fV0sMzU6W2Z1bmN0aW9uKGUsdCxuKXsidXNl IHN0cmljdCI7dmFyIHI9ZSgxNDMpLG89ZSg5KSxpPWUoMzMpLGE9ZnVuY3Rpb24oZSl7dGhpcy5f Y3VycmVudEVsZW1lbnQ9bnVsbCx0aGlzLl9ob3N0Tm9kZT1udWxsLHRoaXMuX2hvc3RQYXJlbnQ9 bnVsbCx0aGlzLl9ob3N0Q29udGFpbmVySW5mbz1udWxsLHRoaXMuX2RvbUlEPTB9O3IoYS5wcm90 b3R5cGUse21vdW50Q29tcG9uZW50OmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBhPW4uX2lkQ291bnRl cisrO3RoaXMuX2RvbUlEPWEsdGhpcy5faG9zdFBhcmVudD10LHRoaXMuX2hvc3RDb250YWluZXJJ bmZvPW47dmFyIHM9IiByZWFjdC1lbXB0eTogIit0aGlzLl9kb21JRCsiICI7aWYoZS51c2VDcmVh dGVFbGVtZW50KXt2YXIgdT1uLl9vd25lckRvY3VtZW50LGw9dS5jcmVhdGVDb21tZW50KHMpO3Jl dHVybiBpLnByZWNhY2hlTm9kZSh0aGlzLGwpLG8obCl9cmV0dXJuIGUucmVuZGVyVG9TdGF0aWNN YXJrdXA/IiI6IjwhLS0iK3MrIi0tPiJ9LHJlY2VpdmVDb21wb25lbnQ6ZnVuY3Rpb24oKXt9LGdl dEhvc3ROb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIGkuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0aGlzKX0s dW5tb3VudENvbXBvbmVudDpmdW5jdGlvbigpe2kudW5jYWNoZU5vZGUodGhpcyl9fSksdC5leHBv cnRzPWF9LHsxNDM6MTQzLDMzOjMzLDk6OX1dLDM2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJp Y3QiO3ZhciByPXt1c2VDcmVhdGVFbGVtZW50OiEwLHVzZUZpYmVyOiExfTt0LmV4cG9ydHM9cn0s e31dLDM3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoOCksbz1lKDMzKSxp PXtkYW5nZXJvdXNseVByb2Nlc3NDaGlsZHJlblVwZGF0ZXM6ZnVuY3Rpb24oZSx0KXt2YXIgbj1v LmdldE5vZGVGcm9tSW5zdGFuY2UoZSk7ci5wcm9jZXNzVXBkYXRlcyhuLHQpfX07dC5leHBvcnRz PWl9LHszMzozMyw4Ojh9XSwzODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlv biByKCl7dGhpcy5fcm9vdE5vZGVJRCYmcC51cGRhdGVXcmFwcGVyKHRoaXMpfWZ1bmN0aW9uIG8o ZSl7dmFyIHQ9dGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHMsbj11LmV4ZWN1dGVPbkNoYW5nZSh0 LGUpO2MuYXNhcChyLHRoaXMpO3ZhciBvPXQubmFtZTtpZigicmFkaW8iPT09dC50eXBlJiZudWxs IT1vKXtmb3IodmFyIGE9bC5nZXROb2RlRnJvbUluc3RhbmNlKHRoaXMpLHM9YTtzLnBhcmVudE5v ZGU7KXM9cy5wYXJlbnROb2RlO2Zvcih2YXIgcD1zLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W25h bWU9IitKU09OLnN0cmluZ2lmeSgiIitvKSsnXVt0eXBlPSJyYWRpbyJdJyksZD0wO2Q8cC5sZW5n dGg7ZCsrKXt2YXIgZj1wW2RdO2lmKGYhPT1hJiZmLmZvcm09PT1hLmZvcm0pe3ZhciBoPWwuZ2V0 SW5zdGFuY2VGcm9tTm9kZShmKTtoP3ZvaWQgMDppKCI5MCIpLGMuYXNhcChyLGgpfX19cmV0dXJu IG59dmFyIGk9ZSgxMTMpLGE9ZSgxNDMpLHM9ZSgxMiksdT1lKDIzKSxsPWUoMzMpLGM9ZSg3MSks cD0oZSgxMzcpLGUoMTQyKSx7Z2V0SG9zdFByb3BzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dS5nZXRW YWx1ZSh0KSxyPXUuZ2V0Q2hlY2tlZCh0KSxvPWEoe3R5cGU6dm9pZCAwLHN0ZXA6dm9pZCAwLG1p bjp2b2lkIDAsbWF4OnZvaWQgMH0sdCx7ZGVmYXVsdENoZWNrZWQ6dm9pZCAwLGRlZmF1bHRWYWx1 ZTp2b2lkIDAsdmFsdWU6bnVsbCE9bj9uOmUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUsY2hl Y2tlZDpudWxsIT1yP3I6ZS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkLG9uQ2hhbmdlOmUu X3dyYXBwZXJTdGF0ZS5vbkNoYW5nZX0pO3JldHVybiBvfSxtb3VudFdyYXBwZXI6ZnVuY3Rpb24o ZSx0KXt2YXIgbj10LmRlZmF1bHRWYWx1ZTtlLl93cmFwcGVyU3RhdGU9e2luaXRpYWxDaGVja2Vk Om51bGwhPXQuY2hlY2tlZD90LmNoZWNrZWQ6dC5kZWZhdWx0Q2hlY2tlZCxpbml0aWFsVmFsdWU6 bnVsbCE9dC52YWx1ZT90LnZhbHVlOm4sbGlzdGVuZXJzOm51bGwsb25DaGFuZ2U6by5iaW5kKGUp fX0sdXBkYXRlV3JhcHBlcjpmdW5jdGlvbihlKXt2YXIgdD1lLl9jdXJyZW50RWxlbWVudC5wcm9w cyxuPXQuY2hlY2tlZDtudWxsIT1uJiZzLnNldFZhbHVlRm9yUHJvcGVydHkobC5nZXROb2RlRnJv bUluc3RhbmNlKGUpLCJjaGVja2VkIixufHwhMSk7dmFyIHI9bC5nZXROb2RlRnJvbUluc3RhbmNl KGUpLG89dS5nZXRWYWx1ZSh0KTtpZihudWxsIT1vKXt2YXIgaT0iIitvO2khPT1yLnZhbHVlJiYo ci52YWx1ZT1pKX1lbHNlIG51bGw9PXQudmFsdWUmJm51bGwhPXQuZGVmYXVsdFZhbHVlJiZyLmRl ZmF1bHRWYWx1ZSE9PSIiK3QuZGVmYXVsdFZhbHVlJiYoci5kZWZhdWx0VmFsdWU9IiIrdC5kZWZh dWx0VmFsdWUpLG51bGw9PXQuY2hlY2tlZCYmbnVsbCE9dC5kZWZhdWx0Q2hlY2tlZCYmKHIuZGVm YXVsdENoZWNrZWQ9ISF0LmRlZmF1bHRDaGVja2VkKX0scG9zdE1vdW50V3JhcHBlcjpmdW5jdGlv bihlKXt2YXIgdD1lLl9jdXJyZW50RWxlbWVudC5wcm9wcyxuPWwuZ2V0Tm9kZUZyb21JbnN0YW5j ZShlKTtzd2l0Y2godC50eXBlKXtjYXNlInN1Ym1pdCI6Y2FzZSJyZXNldCI6YnJlYWs7Y2FzZSJj b2xvciI6Y2FzZSJkYXRlIjpjYXNlImRhdGV0aW1lIjpjYXNlImRhdGV0aW1lLWxvY2FsIjpjYXNl Im1vbnRoIjpjYXNlInRpbWUiOmNhc2Uid2VlayI6bi52YWx1ZT0iIixuLnZhbHVlPW4uZGVmYXVs dFZhbHVlO2JyZWFrO2RlZmF1bHQ6bi52YWx1ZT1uLnZhbHVlfXZhciByPW4ubmFtZTsiIiE9PXIm JihuLm5hbWU9IiIpLG4uZGVmYXVsdENoZWNrZWQ9IW4uZGVmYXVsdENoZWNrZWQsbi5kZWZhdWx0 Q2hlY2tlZD0hbi5kZWZhdWx0Q2hlY2tlZCwiIiE9PXImJihuLm5hbWU9cil9fSk7dC5leHBvcnRz PXB9LHsxMTM6MTEzLDEyOjEyLDEzNzoxMzcsMTQyOjE0MiwxNDM6MTQzLDIzOjIzLDMzOjMzLDcx OjcxfV0sMzk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt2YXIg dD0iIjtyZXR1cm4gaS5DaGlsZHJlbi5mb3JFYWNoKGUsZnVuY3Rpb24oZSl7bnVsbCE9ZSYmKCJz dHJpbmciPT10eXBlb2YgZXx8Im51bWJlciI9PXR5cGVvZiBlP3QrPWU6dXx8KHU9ITApKX0pLHR9 dmFyIG89ZSgxNDMpLGk9ZSgxMjEpLGE9ZSgzMykscz1lKDQwKSx1PShlKDE0MiksITEpLGw9e21v dW50V3JhcHBlcjpmdW5jdGlvbihlLHQsbil7dmFyIG89bnVsbDtpZihudWxsIT1uKXt2YXIgaT1u OyJvcHRncm91cCI9PT1pLl90YWcmJihpPWkuX2hvc3RQYXJlbnQpLG51bGwhPWkmJiJzZWxlY3Qi PT09aS5fdGFnJiYobz1zLmdldFNlbGVjdFZhbHVlQ29udGV4dChpKSl9dmFyIGE9bnVsbDtpZihu dWxsIT1vKXt2YXIgdTtpZih1PW51bGwhPXQudmFsdWU/dC52YWx1ZSsiIjpyKHQuY2hpbGRyZW4p LGE9ITEsQXJyYXkuaXNBcnJheShvKSl7Zm9yKHZhciBsPTA7bDxvLmxlbmd0aDtsKyspaWYoIiIr b1tsXT09PXUpe2E9ITA7YnJlYWt9fWVsc2UgYT0iIitvPT09dX1lLl93cmFwcGVyU3RhdGU9e3Nl bGVjdGVkOmF9fSxwb3N0TW91bnRXcmFwcGVyOmZ1bmN0aW9uKGUpe3ZhciB0PWUuX2N1cnJlbnRF bGVtZW50LnByb3BzO2lmKG51bGwhPXQudmFsdWUpe3ZhciBuPWEuZ2V0Tm9kZUZyb21JbnN0YW5j ZShlKTtuLnNldEF0dHJpYnV0ZSgidmFsdWUiLHQudmFsdWUpfX0sZ2V0SG9zdFByb3BzOmZ1bmN0 aW9uKGUsdCl7dmFyIG49byh7c2VsZWN0ZWQ6dm9pZCAwLGNoaWxkcmVuOnZvaWQgMH0sdCk7bnVs bCE9ZS5fd3JhcHBlclN0YXRlLnNlbGVjdGVkJiYobi5zZWxlY3RlZD1lLl93cmFwcGVyU3RhdGUu c2VsZWN0ZWQpO3ZhciBpPXIodC5jaGlsZHJlbik7cmV0dXJuIGkmJihuLmNoaWxkcmVuPWkpLG59 fTt0LmV4cG9ydHM9bH0sezEyMToxMjEsMTQyOjE0MiwxNDM6MTQzLDMzOjMzLDQwOjQwfV0sNDA6 W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcigpe2lmKHRoaXMuX3Jvb3RO b2RlSUQmJnRoaXMuX3dyYXBwZXJTdGF0ZS5wZW5kaW5nVXBkYXRlKXt0aGlzLl93cmFwcGVyU3Rh dGUucGVuZGluZ1VwZGF0ZT0hMTt2YXIgZT10aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcyx0PXMu Z2V0VmFsdWUoZSk7bnVsbCE9dCYmbyh0aGlzLEJvb2xlYW4oZS5tdWx0aXBsZSksdCl9fWZ1bmN0 aW9uIG8oZSx0LG4pe3ZhciByLG8saT11LmdldE5vZGVGcm9tSW5zdGFuY2UoZSkub3B0aW9ucztp Zih0KXtmb3Iocj17fSxvPTA7bzxuLmxlbmd0aDtvKyspclsiIituW29dXT0hMDtmb3Iobz0wO288 aS5sZW5ndGg7bysrKXt2YXIgYT1yLmhhc093blByb3BlcnR5KGlbb10udmFsdWUpO2lbb10uc2Vs ZWN0ZWQhPT1hJiYoaVtvXS5zZWxlY3RlZD1hKX19ZWxzZXtmb3Iocj0iIituLG89MDtvPGkubGVu Z3RoO28rKylpZihpW29dLnZhbHVlPT09cilyZXR1cm4gdm9pZChpW29dLnNlbGVjdGVkPSEwKTtp Lmxlbmd0aCYmKGlbMF0uc2VsZWN0ZWQ9ITApfX1mdW5jdGlvbiBpKGUpe3ZhciB0PXRoaXMuX2N1 cnJlbnRFbGVtZW50LnByb3BzLG49cy5leGVjdXRlT25DaGFuZ2UodCxlKTtyZXR1cm4gdGhpcy5f cm9vdE5vZGVJRCYmKHRoaXMuX3dyYXBwZXJTdGF0ZS5wZW5kaW5nVXBkYXRlPSEwKSxsLmFzYXAo cix0aGlzKSxufXZhciBhPWUoMTQzKSxzPWUoMjMpLHU9ZSgzMyksbD1lKDcxKSxjPShlKDE0Miks ITEpLHA9e2dldEhvc3RQcm9wczpmdW5jdGlvbihlLHQpe3JldHVybiBhKHt9LHQse29uQ2hhbmdl OmUuX3dyYXBwZXJTdGF0ZS5vbkNoYW5nZSx2YWx1ZTp2b2lkIDB9KX0sbW91bnRXcmFwcGVyOmZ1 bmN0aW9uKGUsdCl7dmFyIG49cy5nZXRWYWx1ZSh0KTtlLl93cmFwcGVyU3RhdGU9e3BlbmRpbmdV cGRhdGU6ITEsaW5pdGlhbFZhbHVlOm51bGwhPW4/bjp0LmRlZmF1bHRWYWx1ZSxsaXN0ZW5lcnM6 bnVsbCxvbkNoYW5nZTppLmJpbmQoZSksd2FzTXVsdGlwbGU6Qm9vbGVhbih0Lm11bHRpcGxlKX0s dm9pZCAwPT09dC52YWx1ZXx8dm9pZCAwPT09dC5kZWZhdWx0VmFsdWV8fGN8fChjPSEwKX0sZ2V0 U2VsZWN0VmFsdWVDb250ZXh0OmZ1bmN0aW9uKGUpe3JldHVybiBlLl93cmFwcGVyU3RhdGUuaW5p dGlhbFZhbHVlfSxwb3N0VXBkYXRlV3JhcHBlcjpmdW5jdGlvbihlKXt2YXIgdD1lLl9jdXJyZW50 RWxlbWVudC5wcm9wcztlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlPXZvaWQgMDt2YXIgbj1l Ll93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU7ZS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlPUJv b2xlYW4odC5tdWx0aXBsZSk7dmFyIHI9cy5nZXRWYWx1ZSh0KTtudWxsIT1yPyhlLl93cmFwcGVy U3RhdGUucGVuZGluZ1VwZGF0ZT0hMSxvKGUsQm9vbGVhbih0Lm11bHRpcGxlKSxyKSk6biE9PUJv b2xlYW4odC5tdWx0aXBsZSkmJihudWxsIT10LmRlZmF1bHRWYWx1ZT9vKGUsQm9vbGVhbih0Lm11 bHRpcGxlKSx0LmRlZmF1bHRWYWx1ZSk6byhlLEJvb2xlYW4odC5tdWx0aXBsZSksdC5tdWx0aXBs ZT9bXToiIikpfX07dC5leHBvcnRzPXB9LHsxNDI6MTQyLDE0MzoxNDMsMjM6MjMsMzM6MzMsNzE6 NzF9XSw0MTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIp e3JldHVybiBlPT09biYmdD09PXJ9ZnVuY3Rpb24gbyhlKXt2YXIgdD1kb2N1bWVudC5zZWxlY3Rp b24sbj10LmNyZWF0ZVJhbmdlKCkscj1uLnRleHQubGVuZ3RoLG89bi5kdXBsaWNhdGUoKTtvLm1v dmVUb0VsZW1lbnRUZXh0KGUpLG8uc2V0RW5kUG9pbnQoIkVuZFRvU3RhcnQiLG4pO3ZhciBpPW8u dGV4dC5sZW5ndGgsYT1pK3I7cmV0dXJue3N0YXJ0OmksZW5kOmF9fWZ1bmN0aW9uIGkoZSl7dmFy IHQ9d2luZG93LmdldFNlbGVjdGlvbiYmd2luZG93LmdldFNlbGVjdGlvbigpO2lmKCF0fHwwPT09 dC5yYW5nZUNvdW50KXJldHVybiBudWxsO3ZhciBuPXQuYW5jaG9yTm9kZSxvPXQuYW5jaG9yT2Zm c2V0LGk9dC5mb2N1c05vZGUsYT10LmZvY3VzT2Zmc2V0LHM9dC5nZXRSYW5nZUF0KDApO3RyeXtz LnN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlLHMuZW5kQ29udGFpbmVyLm5vZGVUeXBlfWNhdGNoKGUp e3JldHVybiBudWxsfXZhciB1PXIodC5hbmNob3JOb2RlLHQuYW5jaG9yT2Zmc2V0LHQuZm9jdXNO b2RlLHQuZm9jdXNPZmZzZXQpLGw9dT8wOnMudG9TdHJpbmcoKS5sZW5ndGgsYz1zLmNsb25lUmFu Z2UoKTtjLnNlbGVjdE5vZGVDb250ZW50cyhlKSxjLnNldEVuZChzLnN0YXJ0Q29udGFpbmVyLHMu c3RhcnRPZmZzZXQpO3ZhciBwPXIoYy5zdGFydENvbnRhaW5lcixjLnN0YXJ0T2Zmc2V0LGMuZW5k Q29udGFpbmVyLGMuZW5kT2Zmc2V0KSxkPXA/MDpjLnRvU3RyaW5nKCkubGVuZ3RoLGY9ZCtsLGg9 ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtoLnNldFN0YXJ0KG4sbyksaC5zZXRFbmQoaSxhKTt2YXIg bT1oLmNvbGxhcHNlZDtyZXR1cm57c3RhcnQ6bT9mOmQsZW5kOm0/ZDpmfX1mdW5jdGlvbiBhKGUs dCl7dmFyIG4scixvPWRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLmR1cGxpY2F0ZSgp O3ZvaWQgMD09PXQuZW5kPyhuPXQuc3RhcnQscj1uKTp0LnN0YXJ0PnQuZW5kPyhuPXQuZW5kLHI9 dC5zdGFydCk6KG49dC5zdGFydCxyPXQuZW5kKSxvLm1vdmVUb0VsZW1lbnRUZXh0KGUpLG8ubW92 ZVN0YXJ0KCJjaGFyYWN0ZXIiLG4pLG8uc2V0RW5kUG9pbnQoIkVuZFRvU3RhcnQiLG8pLG8ubW92 ZUVuZCgiY2hhcmFjdGVyIixyLW4pLG8uc2VsZWN0KCl9ZnVuY3Rpb24gcyhlLHQpe2lmKHdpbmRv dy5nZXRTZWxlY3Rpb24pe3ZhciBuPXdpbmRvdy5nZXRTZWxlY3Rpb24oKSxyPWVbYygpXS5sZW5n dGgsbz1NYXRoLm1pbih0LnN0YXJ0LHIpLGk9dm9pZCAwPT09dC5lbmQ/bzpNYXRoLm1pbih0LmVu ZCxyKTtpZighbi5leHRlbmQmJm8+aSl7dmFyIGE9aTtpPW8sbz1hfXZhciBzPWwoZSxvKSx1PWwo ZSxpKTtpZihzJiZ1KXt2YXIgcD1kb2N1bWVudC5jcmVhdGVSYW5nZSgpO3Auc2V0U3RhcnQocy5u b2RlLHMub2Zmc2V0KSxuLnJlbW92ZUFsbFJhbmdlcygpLG8+aT8obi5hZGRSYW5nZShwKSxuLmV4 dGVuZCh1Lm5vZGUsdS5vZmZzZXQpKToocC5zZXRFbmQodS5ub2RlLHUub2Zmc2V0KSxuLmFkZFJh bmdlKHApKX19fXZhciB1PWUoMTIzKSxsPWUoMTA2KSxjPWUoMTA3KSxwPXUuY2FuVXNlRE9NJiYi c2VsZWN0aW9uImluIGRvY3VtZW50JiYhKCJnZXRTZWxlY3Rpb24iaW4gd2luZG93KSxkPXtnZXRP ZmZzZXRzOnA/bzppLHNldE9mZnNldHM6cD9hOnN9O3QuZXhwb3J0cz1kfSx7MTA2OjEwNiwxMDc6 MTA3LDEyMzoxMjN9XSw0MjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDEx Myksbz1lKDE0MyksaT1lKDgpLGE9ZSg5KSxzPWUoMzMpLHU9ZSg5NSksbD0oZSgxMzcpLGUoMTE5 KSxmdW5jdGlvbihlKXt0aGlzLl9jdXJyZW50RWxlbWVudD1lLHRoaXMuX3N0cmluZ1RleHQ9IiIr ZSx0aGlzLl9ob3N0Tm9kZT1udWxsLHRoaXMuX2hvc3RQYXJlbnQ9bnVsbCx0aGlzLl9kb21JRD0w LHRoaXMuX21vdW50SW5kZXg9MCx0aGlzLl9jbG9zaW5nQ29tbWVudD1udWxsLHRoaXMuX2NvbW1l bnROb2Rlcz1udWxsfSk7byhsLnByb3RvdHlwZSx7bW91bnRDb21wb25lbnQ6ZnVuY3Rpb24oZSx0 LG4scil7dmFyIG89bi5faWRDb3VudGVyKyssaT0iIHJlYWN0LXRleHQ6ICIrbysiICIsbD0iIC9y ZWFjdC10ZXh0ICI7aWYodGhpcy5fZG9tSUQ9byx0aGlzLl9ob3N0UGFyZW50PXQsZS51c2VDcmVh dGVFbGVtZW50KXsKK3ZhciBjPW4uX293bmVyRG9jdW1lbnQscD1jLmNyZWF0ZUNvbW1lbnQoaSks ZD1jLmNyZWF0ZUNvbW1lbnQobCksZj1hKGMuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKTtyZXR1 cm4gYS5xdWV1ZUNoaWxkKGYsYShwKSksdGhpcy5fc3RyaW5nVGV4dCYmYS5xdWV1ZUNoaWxkKGYs YShjLmNyZWF0ZVRleHROb2RlKHRoaXMuX3N0cmluZ1RleHQpKSksYS5xdWV1ZUNoaWxkKGYsYShk KSkscy5wcmVjYWNoZU5vZGUodGhpcyxwKSx0aGlzLl9jbG9zaW5nQ29tbWVudD1kLGZ9dmFyIGg9 dSh0aGlzLl9zdHJpbmdUZXh0KTtyZXR1cm4gZS5yZW5kZXJUb1N0YXRpY01hcmt1cD9oOiI8IS0t IitpKyItLT4iK2grIjwhLS0iK2wrIi0tPiJ9LHJlY2VpdmVDb21wb25lbnQ6ZnVuY3Rpb24oZSx0 KXtpZihlIT09dGhpcy5fY3VycmVudEVsZW1lbnQpe3RoaXMuX2N1cnJlbnRFbGVtZW50PWU7dmFy IG49IiIrZTtpZihuIT09dGhpcy5fc3RyaW5nVGV4dCl7dGhpcy5fc3RyaW5nVGV4dD1uO3ZhciBy PXRoaXMuZ2V0SG9zdE5vZGUoKTtpLnJlcGxhY2VEZWxpbWl0ZWRUZXh0KHJbMF0sclsxXSxuKX19 fSxnZXRIb3N0Tm9kZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2NvbW1lbnROb2RlcztpZihlKXJl dHVybiBlO2lmKCF0aGlzLl9jbG9zaW5nQ29tbWVudClmb3IodmFyIHQ9cy5nZXROb2RlRnJvbUlu c3RhbmNlKHRoaXMpLG49dC5uZXh0U2libGluZzs7KXtpZihudWxsPT1uP3IoIjY3Iix0aGlzLl9k b21JRCk6dm9pZCAwLDg9PT1uLm5vZGVUeXBlJiYiIC9yZWFjdC10ZXh0ICI9PT1uLm5vZGVWYWx1 ZSl7dGhpcy5fY2xvc2luZ0NvbW1lbnQ9bjticmVha31uPW4ubmV4dFNpYmxpbmd9cmV0dXJuIGU9 W3RoaXMuX2hvc3ROb2RlLHRoaXMuX2Nsb3NpbmdDb21tZW50XSx0aGlzLl9jb21tZW50Tm9kZXM9 ZSxlfSx1bm1vdW50Q29tcG9uZW50OmZ1bmN0aW9uKCl7dGhpcy5fY2xvc2luZ0NvbW1lbnQ9bnVs bCx0aGlzLl9jb21tZW50Tm9kZXM9bnVsbCxzLnVuY2FjaGVOb2RlKHRoaXMpfX0pLHQuZXhwb3J0 cz1sfSx7MTEzOjExMywxMTk6MTE5LDEzNzoxMzcsMTQzOjE0MywzMzozMyw4OjgsOTo5LDk1Ojk1 fV0sNDM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcigpe3RoaXMuX3Jv b3ROb2RlSUQmJmMudXBkYXRlV3JhcHBlcih0aGlzKX1mdW5jdGlvbiBvKGUpe3ZhciB0PXRoaXMu X2N1cnJlbnRFbGVtZW50LnByb3BzLG49cy5leGVjdXRlT25DaGFuZ2UodCxlKTtyZXR1cm4gbC5h c2FwKHIsdGhpcyksbn12YXIgaT1lKDExMyksYT1lKDE0Mykscz1lKDIzKSx1PWUoMzMpLGw9ZSg3 MSksYz0oZSgxMzcpLGUoMTQyKSx7Z2V0SG9zdFByb3BzOmZ1bmN0aW9uKGUsdCl7bnVsbCE9dC5k YW5nZXJvdXNseVNldElubmVySFRNTD9pKCI5MSIpOnZvaWQgMDt2YXIgbj1hKHt9LHQse3ZhbHVl OnZvaWQgMCxkZWZhdWx0VmFsdWU6dm9pZCAwLGNoaWxkcmVuOiIiK2UuX3dyYXBwZXJTdGF0ZS5p bml0aWFsVmFsdWUsb25DaGFuZ2U6ZS5fd3JhcHBlclN0YXRlLm9uQ2hhbmdlfSk7cmV0dXJuIG59 LG1vdW50V3JhcHBlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXMuZ2V0VmFsdWUodCkscj1uO2lmKG51 bGw9PW4pe3ZhciBhPXQuZGVmYXVsdFZhbHVlLHU9dC5jaGlsZHJlbjtudWxsIT11JiYobnVsbCE9 YT9pKCI5MiIpOnZvaWQgMCxBcnJheS5pc0FycmF5KHUpJiYodS5sZW5ndGg8PTE/dm9pZCAwOmko IjkzIiksdT11WzBdKSxhPSIiK3UpLG51bGw9PWEmJihhPSIiKSxyPWF9ZS5fd3JhcHBlclN0YXRl PXtpbml0aWFsVmFsdWU6IiIrcixsaXN0ZW5lcnM6bnVsbCxvbkNoYW5nZTpvLmJpbmQoZSl9fSx1 cGRhdGVXcmFwcGVyOmZ1bmN0aW9uKGUpe3ZhciB0PWUuX2N1cnJlbnRFbGVtZW50LnByb3BzLG49 dS5nZXROb2RlRnJvbUluc3RhbmNlKGUpLHI9cy5nZXRWYWx1ZSh0KTtpZihudWxsIT1yKXt2YXIg bz0iIityO28hPT1uLnZhbHVlJiYobi52YWx1ZT1vKSxudWxsPT10LmRlZmF1bHRWYWx1ZSYmKG4u ZGVmYXVsdFZhbHVlPW8pfW51bGwhPXQuZGVmYXVsdFZhbHVlJiYobi5kZWZhdWx0VmFsdWU9dC5k ZWZhdWx0VmFsdWUpfSxwb3N0TW91bnRXcmFwcGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXUuZ2V0Tm9k ZUZyb21JbnN0YW5jZShlKSxuPXQudGV4dENvbnRlbnQ7bj09PWUuX3dyYXBwZXJTdGF0ZS5pbml0 aWFsVmFsdWUmJih0LnZhbHVlPW4pfX0pO3QuZXhwb3J0cz1jfSx7MTEzOjExMywxMzc6MTM3LDE0 MjoxNDIsMTQzOjE0MywyMzoyMywzMzozMyw3MTo3MX1dLDQ0OltmdW5jdGlvbihlLHQsbil7InVz ZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXsiX2hvc3ROb2RlImluIGU/dm9pZCAwOnUoIjMzIiks Il9ob3N0Tm9kZSJpbiB0P3ZvaWQgMDp1KCIzMyIpO2Zvcih2YXIgbj0wLHI9ZTtyO3I9ci5faG9z dFBhcmVudCluKys7Zm9yKHZhciBvPTAsaT10O2k7aT1pLl9ob3N0UGFyZW50KW8rKztmb3IoO24t bz4wOyllPWUuX2hvc3RQYXJlbnQsbi0tO2Zvcig7by1uPjA7KXQ9dC5faG9zdFBhcmVudCxvLS07 Zm9yKHZhciBhPW47YS0tOyl7aWYoZT09PXQpcmV0dXJuIGU7ZT1lLl9ob3N0UGFyZW50LHQ9dC5f aG9zdFBhcmVudH1yZXR1cm4gbnVsbH1mdW5jdGlvbiBvKGUsdCl7Il9ob3N0Tm9kZSJpbiBlP3Zv aWQgMDp1KCIzNSIpLCJfaG9zdE5vZGUiaW4gdD92b2lkIDA6dSgiMzUiKTtmb3IoO3Q7KXtpZih0 PT09ZSlyZXR1cm4hMDt0PXQuX2hvc3RQYXJlbnR9cmV0dXJuITF9ZnVuY3Rpb24gaShlKXtyZXR1 cm4iX2hvc3ROb2RlImluIGU/dm9pZCAwOnUoIjM2IiksZS5faG9zdFBhcmVudH1mdW5jdGlvbiBh KGUsdCxuKXtmb3IodmFyIHI9W107ZTspci5wdXNoKGUpLGU9ZS5faG9zdFBhcmVudDt2YXIgbztm b3Iobz1yLmxlbmd0aDtvLS0gPjA7KXQocltvXSwiY2FwdHVyZWQiLG4pO2ZvcihvPTA7bzxyLmxl bmd0aDtvKyspdChyW29dLCJidWJibGVkIixuKX1mdW5jdGlvbiBzKGUsdCxuLG8saSl7Zm9yKHZh ciBhPWUmJnQ/cihlLHQpOm51bGwscz1bXTtlJiZlIT09YTspcy5wdXNoKGUpLGU9ZS5faG9zdFBh cmVudDtmb3IodmFyIHU9W107dCYmdCE9PWE7KXUucHVzaCh0KSx0PXQuX2hvc3RQYXJlbnQ7dmFy IGw7Zm9yKGw9MDtsPHMubGVuZ3RoO2wrKyluKHNbbF0sImJ1YmJsZWQiLG8pO2ZvcihsPXUubGVu Z3RoO2wtLSA+MDspbih1W2xdLCJjYXB0dXJlZCIsaSl9dmFyIHU9ZSgxMTMpO2UoMTM3KTt0LmV4 cG9ydHM9e2lzQW5jZXN0b3I6byxnZXRMb3dlc3RDb21tb25BbmNlc3RvcjpyLGdldFBhcmVudElu c3RhbmNlOmksdHJhdmVyc2VUd29QaGFzZTphLHRyYXZlcnNlRW50ZXJMZWF2ZTpzfX0sezExMzox MTMsMTM3OjEzN31dLDQ1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTIx KSxvPWUoMzApLGk9bztyLmFkZG9ucyYmKHIuX19TRUNSRVRfSU5KRUNURURfUkVBQ1RfRE9NX0RP X05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9aSksdC5leHBvcnRzPWl9LHsxMjE6MTIxLDMw OjMwfV0sNDY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcigpe3RoaXMu cmVpbml0aWFsaXplVHJhbnNhY3Rpb24oKX12YXIgbz1lKDE0MyksaT1lKDcxKSxhPWUoODkpLHM9 ZSgxMjkpLHU9e2luaXRpYWxpemU6cyxjbG9zZTpmdW5jdGlvbigpe2QuaXNCYXRjaGluZ1VwZGF0 ZXM9ITF9fSxsPXtpbml0aWFsaXplOnMsY2xvc2U6aS5mbHVzaEJhdGNoZWRVcGRhdGVzLmJpbmQo aSl9LGM9W2wsdV07byhyLnByb3RvdHlwZSxhLHtnZXRUcmFuc2FjdGlvbldyYXBwZXJzOmZ1bmN0 aW9uKCl7cmV0dXJuIGN9fSk7dmFyIHA9bmV3IHIsZD17aXNCYXRjaGluZ1VwZGF0ZXM6ITEsYmF0 Y2hlZFVwZGF0ZXM6ZnVuY3Rpb24oZSx0LG4scixvLGkpe3ZhciBhPWQuaXNCYXRjaGluZ1VwZGF0 ZXM7cmV0dXJuIGQuaXNCYXRjaGluZ1VwZGF0ZXM9ITAsYT9lKHQsbixyLG8saSk6cC5wZXJmb3Jt KGUsbnVsbCx0LG4scixvLGkpfX07dC5leHBvcnRzPWR9LHsxMjk6MTI5LDE0MzoxNDMsNzE6NzEs ODk6ODl9XSw0NzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7eHx8 KHg9ITAseS5FdmVudEVtaXR0ZXIuaW5qZWN0UmVhY3RFdmVudExpc3RlbmVyKGcpLHkuRXZlbnRQ bHVnaW5IdWIuaW5qZWN0RXZlbnRQbHVnaW5PcmRlcihzKSx5LkV2ZW50UGx1Z2luVXRpbHMuaW5q ZWN0Q29tcG9uZW50VHJlZShkKSx5LkV2ZW50UGx1Z2luVXRpbHMuaW5qZWN0VHJlZVRyYXZlcnNh bChoKSx5LkV2ZW50UGx1Z2luSHViLmluamVjdEV2ZW50UGx1Z2luc0J5TmFtZSh7U2ltcGxlRXZl bnRQbHVnaW46RSxFbnRlckxlYXZlRXZlbnRQbHVnaW46dSxDaGFuZ2VFdmVudFBsdWdpbjphLFNl bGVjdEV2ZW50UGx1Z2luOmIsQmVmb3JlSW5wdXRFdmVudFBsdWdpbjppfSkseS5Ib3N0Q29tcG9u ZW50LmluamVjdEdlbmVyaWNDb21wb25lbnRDbGFzcyhwKSx5Lkhvc3RDb21wb25lbnQuaW5qZWN0 VGV4dENvbXBvbmVudENsYXNzKG0pLHkuRE9NUHJvcGVydHkuaW5qZWN0RE9NUHJvcGVydHlDb25m aWcobykseS5ET01Qcm9wZXJ0eS5pbmplY3RET01Qcm9wZXJ0eUNvbmZpZyhsKSx5LkRPTVByb3Bl cnR5LmluamVjdERPTVByb3BlcnR5Q29uZmlnKEMpLHkuRW1wdHlDb21wb25lbnQuaW5qZWN0RW1w dHlDb21wb25lbnRGYWN0b3J5KGZ1bmN0aW9uKGUpe3JldHVybiBuZXcgZihlKX0pLHkuVXBkYXRl cy5pbmplY3RSZWNvbmNpbGVUcmFuc2FjdGlvbihfKSx5LlVwZGF0ZXMuaW5qZWN0QmF0Y2hpbmdT dHJhdGVneSh2KSx5LkNvbXBvbmVudC5pbmplY3RFbnZpcm9ubWVudChjKSl9dmFyIG89ZSgxKSxp PWUoMyksYT1lKDcpLHM9ZSgxNCksdT1lKDE1KSxsPWUoMjEpLGM9ZSgyNykscD1lKDMxKSxkPWUo MzMpLGY9ZSgzNSksaD1lKDQ0KSxtPWUoNDIpLHY9ZSg0NiksZz1lKDUyKSx5PWUoNTUpLF89ZSg2 NSksQz1lKDczKSxiPWUoNzQpLEU9ZSg3NSkseD0hMTt0LmV4cG9ydHM9e2luamVjdDpyfX0sezE6 MSwxNDoxNCwxNToxNSwyMToyMSwyNzoyNywzOjMsMzE6MzEsMzM6MzMsMzU6MzUsNDI6NDIsNDQ6 NDQsNDY6NDYsNTI6NTIsNTU6NTUsNjU6NjUsNzo3LDczOjczLDc0Ojc0LDc1Ojc1fV0sNDg6W2Z1 bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJv bCYmU3ltYm9sLmZvciYmU3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpfHw2MDEwMzt0LmV4cG9y dHM9cn0se31dLDQ5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByLG89e2luamVj dEVtcHR5Q29tcG9uZW50RmFjdG9yeTpmdW5jdGlvbihlKXtyPWV9fSxpPXtjcmVhdGU6ZnVuY3Rp b24oZSl7cmV0dXJuIHIoZSl9fTtpLmluamVjdGlvbj1vLHQuZXhwb3J0cz1pfSx7fV0sNTA6W2Z1 bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbil7dHJ5e3Qobil9Y2F0 Y2goZSl7bnVsbD09PW8mJihvPWUpfX12YXIgbz1udWxsLGk9e2ludm9rZUd1YXJkZWRDYWxsYmFj azpyLGludm9rZUd1YXJkZWRDYWxsYmFja1dpdGhDYXRjaDpyLHJldGhyb3dDYXVnaHRFcnJvcjpm dW5jdGlvbigpe2lmKG8pe3ZhciBlPW87dGhyb3cgbz1udWxsLGV9fX07dC5leHBvcnRzPWl9LHt9 XSw1MTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe28uZW5xdWV1 ZUV2ZW50cyhlKSxvLnByb2Nlc3NFdmVudFF1ZXVlKCExKX12YXIgbz1lKDE2KSxpPXtoYW5kbGVU b3BMZXZlbDpmdW5jdGlvbihlLHQsbixpKXt2YXIgYT1vLmV4dHJhY3RFdmVudHMoZSx0LG4saSk7 cihhKX19O3QuZXhwb3J0cz1pfSx7MTY6MTZ9XSw1MjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3Ry aWN0IjtmdW5jdGlvbiByKGUpe2Zvcig7ZS5faG9zdFBhcmVudDspZT1lLl9ob3N0UGFyZW50O3Zh ciB0PXAuZ2V0Tm9kZUZyb21JbnN0YW5jZShlKSxuPXQucGFyZW50Tm9kZTtyZXR1cm4gcC5nZXRD bG9zZXN0SW5zdGFuY2VGcm9tTm9kZShuKX1mdW5jdGlvbiBvKGUsdCl7dGhpcy50b3BMZXZlbFR5 cGU9ZSx0aGlzLm5hdGl2ZUV2ZW50PXQsdGhpcy5hbmNlc3RvcnM9W119ZnVuY3Rpb24gaShlKXt2 YXIgdD1mKGUubmF0aXZlRXZlbnQpLG49cC5nZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSh0KSxv PW47ZG8gZS5hbmNlc3RvcnMucHVzaChvKSxvPW8mJnIobyk7d2hpbGUobyk7Zm9yKHZhciBpPTA7 aTxlLmFuY2VzdG9ycy5sZW5ndGg7aSsrKW49ZS5hbmNlc3RvcnNbaV0sbS5faGFuZGxlVG9wTGV2 ZWwoZS50b3BMZXZlbFR5cGUsbixlLm5hdGl2ZUV2ZW50LGYoZS5uYXRpdmVFdmVudCkpfWZ1bmN0 aW9uIGEoZSl7dmFyIHQ9aCh3aW5kb3cpO2UodCl9dmFyIHM9ZSgxNDMpLHU9ZSgxMjIpLGw9ZSgx MjMpLGM9ZSgyNCkscD1lKDMzKSxkPWUoNzEpLGY9ZSgxMDIpLGg9ZSgxMzQpO3Moby5wcm90b3R5 cGUse2Rlc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLnRvcExldmVsVHlwZT1udWxsLHRoaXMubmF0 aXZlRXZlbnQ9bnVsbCx0aGlzLmFuY2VzdG9ycy5sZW5ndGg9MH19KSxjLmFkZFBvb2xpbmdUbyhv LGMudHdvQXJndW1lbnRQb29sZXIpO3ZhciBtPXtfZW5hYmxlZDohMCxfaGFuZGxlVG9wTGV2ZWw6 bnVsbCxXSU5ET1dfSEFORExFOmwuY2FuVXNlRE9NP3dpbmRvdzpudWxsLHNldEhhbmRsZVRvcExl dmVsOmZ1bmN0aW9uKGUpe20uX2hhbmRsZVRvcExldmVsPWV9LHNldEVuYWJsZWQ6ZnVuY3Rpb24o ZSl7bS5fZW5hYmxlZD0hIWV9LGlzRW5hYmxlZDpmdW5jdGlvbigpe3JldHVybiBtLl9lbmFibGVk fSx0cmFwQnViYmxlZEV2ZW50OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj91Lmxpc3RlbihuLHQs bS5kaXNwYXRjaEV2ZW50LmJpbmQobnVsbCxlKSk6bnVsbH0sdHJhcENhcHR1cmVkRXZlbnQ6ZnVu Y3Rpb24oZSx0LG4pe3JldHVybiBuP3UuY2FwdHVyZShuLHQsbS5kaXNwYXRjaEV2ZW50LmJpbmQo bnVsbCxlKSk6bnVsbH0sbW9uaXRvclNjcm9sbFZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWEuYmlu ZChudWxsLGUpO3UubGlzdGVuKHdpbmRvdywic2Nyb2xsIix0KX0sZGlzcGF0Y2hFdmVudDpmdW5j dGlvbihlLHQpe2lmKG0uX2VuYWJsZWQpe3ZhciBuPW8uZ2V0UG9vbGVkKGUsdCk7dHJ5e2QuYmF0 Y2hlZFVwZGF0ZXMoaSxuKX1maW5hbGx5e28ucmVsZWFzZShuKX19fX07dC5leHBvcnRzPW19LHsx MDI6MTAyLDEyMjoxMjIsMTIzOjEyMywxMzQ6MTM0LDE0MzoxNDMsMjQ6MjQsMzM6MzMsNzE6NzF9 XSw1MzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17bG9nVG9wTGV2ZWxSZW5k ZXJzOiExfTt0LmV4cG9ydHM9cn0se31dLDU0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3Qi O2Z1bmN0aW9uIHIoZSl7cmV0dXJuIHM/dm9pZCAwOmEoIjExMSIsZS50eXBlKSxuZXcgcyhlKX1m dW5jdGlvbiBvKGUpe3JldHVybiBuZXcgdShlKX1mdW5jdGlvbiBpKGUpe3JldHVybiBlIGluc3Rh bmNlb2YgdX12YXIgYT1lKDExMykscz0oZSgxMzcpLG51bGwpLHU9bnVsbCxsPXtpbmplY3RHZW5l cmljQ29tcG9uZW50Q2xhc3M6ZnVuY3Rpb24oZSl7cz1lfSxpbmplY3RUZXh0Q29tcG9uZW50Q2xh c3M6ZnVuY3Rpb24oZSl7dT1lfX0sYz17Y3JlYXRlSW50ZXJuYWxDb21wb25lbnQ6cixjcmVhdGVJ bnN0YW5jZUZvclRleHQ6byxpc1RleHRDb21wb25lbnQ6aSxpbmplY3Rpb246bH07dC5leHBvcnRz PWN9LHsxMTM6MTEzLDEzNzoxMzd9XSw1NTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2 YXIgcj1lKDExKSxvPWUoMTYpLGk9ZSgxOCksYT1lKDI4KSxzPWUoNDkpLHU9ZSgyNSksbD1lKDU0 KSxjPWUoNzEpLHA9e0NvbXBvbmVudDphLmluamVjdGlvbixET01Qcm9wZXJ0eTpyLmluamVjdGlv bixFbXB0eUNvbXBvbmVudDpzLmluamVjdGlvbixFdmVudFBsdWdpbkh1YjpvLmluamVjdGlvbixF dmVudFBsdWdpblV0aWxzOmkuaW5qZWN0aW9uLEV2ZW50RW1pdHRlcjp1LmluamVjdGlvbixIb3N0 Q29tcG9uZW50OmwuaW5qZWN0aW9uLFVwZGF0ZXM6Yy5pbmplY3Rpb259O3QuZXhwb3J0cz1wfSx7 MTE6MTEsMTY6MTYsMTg6MTgsMjU6MjUsMjg6MjgsNDk6NDksNTQ6NTQsNzE6NzF9XSw1NjpbZnVu Y3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBpKGRvY3VtZW50 LmRvY3VtZW50RWxlbWVudCxlKX12YXIgbz1lKDQxKSxpPWUoMTI2KSxhPWUoMTMxKSxzPWUoMTMy KSx1PXtoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5ub2Rl TmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiB0JiYoImlucHV0Ij09PXQmJiJ0 ZXh0Ij09PWUudHlwZXx8InRleHRhcmVhIj09PXR8fCJ0cnVlIj09PWUuY29udGVudEVkaXRhYmxl KX0sZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb246ZnVuY3Rpb24oKXt2YXIgZT1zKCk7cmV0dXJue2Zv Y3VzZWRFbGVtOmUsc2VsZWN0aW9uUmFuZ2U6dS5oYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMoZSk/ dS5nZXRTZWxlY3Rpb24oZSk6bnVsbH19LHJlc3RvcmVTZWxlY3Rpb246ZnVuY3Rpb24oZSl7dmFy IHQ9cygpLG49ZS5mb2N1c2VkRWxlbSxvPWUuc2VsZWN0aW9uUmFuZ2U7dCE9PW4mJnIobikmJih1 Lmhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhuKSYmdS5zZXRTZWxlY3Rpb24obixvKSxhKG4pKX0s Z2V0U2VsZWN0aW9uOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKCJzZWxlY3Rpb25TdGFydCJpbiBlKXQ9 e3N0YXJ0OmUuc2VsZWN0aW9uU3RhcnQsZW5kOmUuc2VsZWN0aW9uRW5kfTtlbHNlIGlmKGRvY3Vt ZW50LnNlbGVjdGlvbiYmZS5ub2RlTmFtZSYmImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNh c2UoKSl7dmFyIG49ZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7bi5wYXJlbnRFbGVt ZW50KCk9PT1lJiYodD17c3RhcnQ6LW4ubW92ZVN0YXJ0KCJjaGFyYWN0ZXIiLC1lLnZhbHVlLmxl bmd0aCksZW5kOi1uLm1vdmVFbmQoImNoYXJhY3RlciIsLWUudmFsdWUubGVuZ3RoKX0pfWVsc2Ug dD1vLmdldE9mZnNldHMoZSk7cmV0dXJuIHR8fHtzdGFydDowLGVuZDowfX0sc2V0U2VsZWN0aW9u OmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5zdGFydCxyPXQuZW5kO2lmKHZvaWQgMD09PXImJihyPW4p LCJzZWxlY3Rpb25TdGFydCJpbiBlKWUuc2VsZWN0aW9uU3RhcnQ9bixlLnNlbGVjdGlvbkVuZD1N YXRoLm1pbihyLGUudmFsdWUubGVuZ3RoKTtlbHNlIGlmKGRvY3VtZW50LnNlbGVjdGlvbiYmZS5u b2RlTmFtZSYmImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7dmFyIGk9ZS5jcmVh dGVUZXh0UmFuZ2UoKTtpLmNvbGxhcHNlKCEwKSxpLm1vdmVTdGFydCgiY2hhcmFjdGVyIixuKSxp Lm1vdmVFbmQoImNoYXJhY3RlciIsci1uKSxpLnNlbGVjdCgpfWVsc2Ugby5zZXRPZmZzZXRzKGUs dCl9fTt0LmV4cG9ydHM9dX0sezEyNjoxMjYsMTMxOjEzMSwxMzI6MTMyLDQxOjQxfV0sNTc6W2Z1 bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9e3JlbW92ZTpmdW5jdGlvbihlKXtlLl9y ZWFjdEludGVybmFsSW5zdGFuY2U9dm9pZCAwfSxnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX3Jl YWN0SW50ZXJuYWxJbnN0YW5jZX0saGFzOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDAhPT1lLl9y ZWFjdEludGVybmFsSW5zdGFuY2V9LHNldDpmdW5jdGlvbihlLHQpe2UuX3JlYWN0SW50ZXJuYWxJ bnN0YW5jZT10fX07dC5leHBvcnRzPXJ9LHt9XSw1ODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3Ry aWN0Ijt2YXIgcj1udWxsO3QuZXhwb3J0cz17ZGVidWdUb29sOnJ9fSx7fV0sNTk6W2Z1bmN0aW9u KGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSg5Miksbz0vXC8/Pi8saT0vXjxcIVwtXC0vLGE9 e0NIRUNLU1VNX0FUVFJfTkFNRToiZGF0YS1yZWFjdC1jaGVja3N1bSIsYWRkQ2hlY2tzdW1Ub01h cmt1cDpmdW5jdGlvbihlKXt2YXIgdD1yKGUpO3JldHVybiBpLnRlc3QoZSk/ZTplLnJlcGxhY2Uo bywiICIrYS5DSEVDS1NVTV9BVFRSX05BTUUrJz0iJyt0KyciJCYnKX0sY2FuUmV1c2VNYXJrdXA6 ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmdldEF0dHJpYnV0ZShhLkNIRUNLU1VNX0FUVFJfTkFNRSk7 bj1uJiZwYXJzZUludChuLDEwKTt2YXIgbz1yKGUpO3JldHVybiBvPT09bn19O3QuZXhwb3J0cz1h fSx7OTI6OTJ9XSw2MDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUs dCl7Zm9yKHZhciBuPU1hdGgubWluKGUubGVuZ3RoLHQubGVuZ3RoKSxyPTA7cjxuO3IrKylpZihl LmNoYXJBdChyKSE9PXQuY2hhckF0KHIpKXJldHVybiByO3JldHVybiBlLmxlbmd0aD09PXQubGVu Z3RoPy0xOm59ZnVuY3Rpb24gbyhlKXtyZXR1cm4gZT9lLm5vZGVUeXBlPT09QT9lLmRvY3VtZW50 RWxlbWVudDplLmZpcnN0Q2hpbGQ6bnVsbH1mdW5jdGlvbiBpKGUpe3JldHVybiBlLmdldEF0dHJp YnV0ZSYmZS5nZXRBdHRyaWJ1dGUoSSl8fCIifWZ1bmN0aW9uIGEoZSx0LG4scixvKXt2YXIgaTtp ZihiLmxvZ1RvcExldmVsUmVuZGVycyl7dmFyIGE9ZS5fY3VycmVudEVsZW1lbnQucHJvcHMuY2hp bGQscz1hLnR5cGU7aT0iUmVhY3QgbW91bnQ6ICIrKCJzdHJpbmciPT10eXBlb2Ygcz9zOnMuZGlz cGxheU5hbWV8fHMubmFtZSksY29uc29sZS50aW1lKGkpfXZhciB1PXcubW91bnRDb21wb25lbnQo ZSxuLG51bGwsXyhlLHQpLG8sMCk7aSYmY29uc29sZS50aW1lRW5kKGkpLGUuX3JlbmRlcmVkQ29t cG9uZW50Ll90b3BMZXZlbFdyYXBwZXI9ZSxWLl9tb3VudEltYWdlSW50b05vZGUodSx0LGUscixu KX1mdW5jdGlvbiBzKGUsdCxuLHIpe3ZhciBvPWsuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbi5n ZXRQb29sZWQoIW4mJkMudXNlQ3JlYXRlRWxlbWVudCk7by5wZXJmb3JtKGEsbnVsbCxlLHQsbyxu LHIpLGsuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbi5yZWxlYXNlKG8pfWZ1bmN0aW9uIHUoZSx0 LG4pe2Zvcih3LnVubW91bnRDb21wb25lbnQoZSxuKSx0Lm5vZGVUeXBlPT09QSYmKHQ9dC5kb2N1 bWVudEVsZW1lbnQpO3QubGFzdENoaWxkOyl0LnJlbW92ZUNoaWxkKHQubGFzdENoaWxkKX1mdW5j dGlvbiBsKGUpe3ZhciB0PW8oZSk7aWYodCl7dmFyIG49eS5nZXRJbnN0YW5jZUZyb21Ob2RlKHQp O3JldHVybiEoIW58fCFuLl9ob3N0UGFyZW50KX19ZnVuY3Rpb24gYyhlKXtyZXR1cm4hKCFlfHxl Lm5vZGVUeXBlIT09UiYmZS5ub2RlVHlwZSE9PUEmJmUubm9kZVR5cGUhPT1EKX1mdW5jdGlvbiBw KGUpe3ZhciB0PW8oZSksbj10JiZ5LmdldEluc3RhbmNlRnJvbU5vZGUodCk7cmV0dXJuIG4mJiFu Ll9ob3N0UGFyZW50P246bnVsbH1mdW5jdGlvbiBkKGUpe3ZhciB0PXAoZSk7cmV0dXJuIHQ/dC5f aG9zdENvbnRhaW5lckluZm8uX3RvcExldmVsV3JhcHBlcjpudWxsfXZhciBmPWUoMTEzKSxoPWUo OSksbT1lKDExKSx2PWUoMTIxKSxnPWUoMjUpLHk9KGUoMTIwKSxlKDMzKSksXz1lKDM0KSxDPWUo MzYpLGI9ZSg1MyksRT1lKDU3KSx4PShlKDU4KSxlKDU5KSksdz1lKDY2KSxUPWUoNzApLGs9ZSg3 MSksUD1lKDEzMCksTj1lKDEwOSksUz0oZSgxMzcpLGUoMTE1KSksTT1lKDExNyksST0oZSgxNDIp LG0uSURfQVRUUklCVVRFX05BTUUpLE89bS5ST09UX0FUVFJJQlVURV9OQU1FLFI9MSxBPTksRD0x MSxMPXt9LFU9MSxGPWZ1bmN0aW9uKCl7dGhpcy5yb290SUQ9VSsrfTtGLnByb3RvdHlwZS5pc1Jl YWN0Q29tcG9uZW50PXt9LEYucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlz LnByb3BzLmNoaWxkfSxGLmlzUmVhY3RUb3BMZXZlbFdyYXBwZXI9ITA7dmFyIFY9e1RvcExldmVs V3JhcHBlcjpGLF9pbnN0YW5jZXNCeVJlYWN0Um9vdElEOkwsc2Nyb2xsTW9uaXRvcjpmdW5jdGlv bihlLHQpe3QoKX0sX3VwZGF0ZVJvb3RDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4scixvKXtyZXR1 cm4gVi5zY3JvbGxNb25pdG9yKHIsZnVuY3Rpb24oKXtULmVucXVldWVFbGVtZW50SW50ZXJuYWwo ZSx0LG4pLG8mJlQuZW5xdWV1ZUNhbGxiYWNrSW50ZXJuYWwoZSxvKX0pLGV9LF9yZW5kZXJOZXdS b290Q29tcG9uZW50OmZ1bmN0aW9uKGUsdCxuLHIpe2ModCk/dm9pZCAwOmYoIjM3IiksZy5lbnN1 cmVTY3JvbGxWYWx1ZU1vbml0b3JpbmcoKTt2YXIgbz1OKGUsITEpO2suYmF0Y2hlZFVwZGF0ZXMo cyxvLHQsbixyKTt2YXIgaT1vLl9pbnN0YW5jZS5yb290SUQ7cmV0dXJuIExbaV09byxvfSxyZW5k ZXJTdWJ0cmVlSW50b0NvbnRhaW5lcjpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbnVsbCE9ZSYm RS5oYXMoZSk/dm9pZCAwOmYoIjM4IiksVi5fcmVuZGVyU3VidHJlZUludG9Db250YWluZXIoZSx0 LG4scil9LF9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcjpmdW5jdGlvbihlLHQsbixyKXtULnZh bGlkYXRlQ2FsbGJhY2sociwiUmVhY3RET00ucmVuZGVyIiksdi5pc1ZhbGlkRWxlbWVudCh0KT92 b2lkIDA6ZigiMzkiLCJzdHJpbmciPT10eXBlb2YgdD8iIEluc3RlYWQgb2YgcGFzc2luZyBhIHN0 cmluZyBsaWtlICdkaXYnLCBwYXNzIFJlYWN0LmNyZWF0ZUVsZW1lbnQoJ2RpdicpIG9yIDxkaXYg Lz4uIjoiZnVuY3Rpb24iPT10eXBlb2YgdD8iIEluc3RlYWQgb2YgcGFzc2luZyBhIGNsYXNzIGxp a2UgRm9vLCBwYXNzIFJlYWN0LmNyZWF0ZUVsZW1lbnQoRm9vKSBvciA8Rm9vIC8+LiI6bnVsbCE9 dCYmdm9pZCAwIT09dC5wcm9wcz8iIFRoaXMgbWF5IGJlIGNhdXNlZCBieSB1bmludGVudGlvbmFs bHkgbG9hZGluZyB0d28gaW5kZXBlbmRlbnQgY29waWVzIG9mIFJlYWN0LiI6IiIpO3ZhciBhLHM9 di5jcmVhdGVFbGVtZW50KEYse2NoaWxkOnR9KTtpZihlKXt2YXIgdT1FLmdldChlKTthPXUuX3By b2Nlc3NDaGlsZENvbnRleHQodS5fY29udGV4dCl9ZWxzZSBhPVA7dmFyIGM9ZChuKTtpZihjKXt2 YXIgcD1jLl9jdXJyZW50RWxlbWVudCxoPXAucHJvcHMuY2hpbGQ7aWYoTShoLHQpKXt2YXIgbT1j Ll9yZW5kZXJlZENvbXBvbmVudC5nZXRQdWJsaWNJbnN0YW5jZSgpLGc9ciYmZnVuY3Rpb24oKXty LmNhbGwobSl9O3JldHVybiBWLl91cGRhdGVSb290Q29tcG9uZW50KGMscyxhLG4sZyksbX1WLnVu bW91bnRDb21wb25lbnRBdE5vZGUobil9dmFyIHk9byhuKSxfPXkmJiEhaSh5KSxDPWwobiksYj1f JiYhYyYmIUMseD1WLl9yZW5kZXJOZXdSb290Q29tcG9uZW50KHMsbixiLGEpLl9yZW5kZXJlZENv bXBvbmVudC5nZXRQdWJsaWNJbnN0YW5jZSgpO3JldHVybiByJiZyLmNhbGwoeCkseH0scmVuZGVy OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gVi5fcmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVs bCxlLHQsbil9LHVubW91bnRDb21wb25lbnRBdE5vZGU6ZnVuY3Rpb24oZSl7YyhlKT92b2lkIDA6 ZigiNDAiKTt2YXIgdD1kKGUpO3JldHVybiB0PyhkZWxldGUgTFt0Ll9pbnN0YW5jZS5yb290SURd LGsuYmF0Y2hlZFVwZGF0ZXModSx0LGUsITEpLCEwKToobChlKSwxPT09ZS5ub2RlVHlwZSYmZS5o YXNBdHRyaWJ1dGUoTyksITEpfSxfbW91bnRJbWFnZUludG9Ob2RlOmZ1bmN0aW9uKGUsdCxuLGks YSl7aWYoYyh0KT92b2lkIDA6ZigiNDEiKSxpKXt2YXIgcz1vKHQpO2lmKHguY2FuUmV1c2VNYXJr dXAoZSxzKSlyZXR1cm4gdm9pZCB5LnByZWNhY2hlTm9kZShuLHMpO3ZhciB1PXMuZ2V0QXR0cmli dXRlKHguQ0hFQ0tTVU1fQVRUUl9OQU1FKTtzLnJlbW92ZUF0dHJpYnV0ZSh4LkNIRUNLU1VNX0FU VFJfTkFNRSk7dmFyIGw9cy5vdXRlckhUTUw7cy5zZXRBdHRyaWJ1dGUoeC5DSEVDS1NVTV9BVFRS X05BTUUsdSk7dmFyIHA9ZSxkPXIocCxsKSxtPSIgKGNsaWVudCkgIitwLnN1YnN0cmluZyhkLTIw LGQrMjApKyJcbiAoc2VydmVyKSAiK2wuc3Vic3RyaW5nKGQtMjAsZCsyMCk7dC5ub2RlVHlwZT09 PUE/ZigiNDIiLG0pOnZvaWQgMH1pZih0Lm5vZGVUeXBlPT09QT9mKCI0MyIpOnZvaWQgMCxhLnVz ZUNyZWF0ZUVsZW1lbnQpe2Zvcig7dC5sYXN0Q2hpbGQ7KXQucmVtb3ZlQ2hpbGQodC5sYXN0Q2hp bGQpO2guaW5zZXJ0VHJlZUJlZm9yZSh0LGUsbnVsbCl9ZWxzZSBTKHQsZSkseS5wcmVjYWNoZU5v ZGUobix0LmZpcnN0Q2hpbGQpfX07dC5leHBvcnRzPVZ9LHsxMDk6MTA5LDExOjExLDExMzoxMTMs MTE1OjExNSwxMTc6MTE3LDEyMDoxMjAsMTIxOjEyMSwxMzA6MTMwLDEzNzoxMzcsMTQyOjE0Miwy NToyNSwzMzozMywzNDozNCwzNjozNiw1Mzo1Myw1Nzo1Nyw1ODo1OCw1OTo1OSw2Njo2Niw3MDo3 MCw3MTo3MSw5Ojl9XSw2MTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBy KGUsdCxuKXtyZXR1cm57dHlwZToiSU5TRVJUX01BUktVUCIsY29udGVudDplLGZyb21JbmRleDpu dWxsLGZyb21Ob2RlOm51bGwsdG9JbmRleDpuLGFmdGVyTm9kZTp0fX1mdW5jdGlvbiBvKGUsdCxu KXtyZXR1cm57dHlwZToiTU9WRV9FWElTVElORyIsY29udGVudDpudWxsLGZyb21JbmRleDplLl9t b3VudEluZGV4LGZyb21Ob2RlOmQuZ2V0SG9zdE5vZGUoZSksdG9JbmRleDpuLGFmdGVyTm9kZTp0 fX1mdW5jdGlvbiBpKGUsdCl7cmV0dXJue3R5cGU6IlJFTU9WRV9OT0RFIixjb250ZW50Om51bGws ZnJvbUluZGV4OmUuX21vdW50SW5kZXgsZnJvbU5vZGU6dCx0b0luZGV4Om51bGwsYWZ0ZXJOb2Rl Om51bGx9fWZ1bmN0aW9uIGEoZSl7cmV0dXJue3R5cGU6IlNFVF9NQVJLVVAiLGNvbnRlbnQ6ZSxm cm9tSW5kZXg6bnVsbCxmcm9tTm9kZTpudWxsLHRvSW5kZXg6bnVsbCxhZnRlck5vZGU6bnVsbH19 ZnVuY3Rpb24gcyhlKXtyZXR1cm57dHlwZToiVEVYVF9DT05URU5UIixjb250ZW50OmUsZnJvbUlu ZGV4Om51bGwsZnJvbU5vZGU6bnVsbCx0b0luZGV4Om51bGwsYWZ0ZXJOb2RlOm51bGx9fWZ1bmN0 aW9uIHUoZSx0KXtyZXR1cm4gdCYmKGU9ZXx8W10sZS5wdXNoKHQpKSxlfWZ1bmN0aW9uIGwoZSx0 KXtwLnByb2Nlc3NDaGlsZHJlblVwZGF0ZXMoZSx0KX12YXIgYz1lKDExMykscD1lKDI4KSxkPShl KDU3KSxlKDU4KSxlKDEyMCksZSg2NikpLGY9ZSgyNiksaD0oZSgxMjkpLGUoOTcpKSxtPShlKDEz Nykse01peGluOntfcmVjb25jaWxlckluc3RhbnRpYXRlQ2hpbGRyZW46ZnVuY3Rpb24oZSx0LG4p e3JldHVybiBmLmluc3RhbnRpYXRlQ2hpbGRyZW4oZSx0LG4pfSxfcmVjb25jaWxlclVwZGF0ZUNo aWxkcmVuOmZ1bmN0aW9uKGUsdCxuLHIsbyxpKXt2YXIgYSxzPTA7cmV0dXJuIGE9aCh0LHMpLGYu dXBkYXRlQ2hpbGRyZW4oZSxhLG4scixvLHRoaXMsdGhpcy5faG9zdENvbnRhaW5lckluZm8saSxz KSxhfSxtb3VudENoaWxkcmVuOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLl9yZWNvbmNpbGVy SW5zdGFudGlhdGVDaGlsZHJlbihlLHQsbik7dGhpcy5fcmVuZGVyZWRDaGlsZHJlbj1yO3ZhciBv PVtdLGk9MDtmb3IodmFyIGEgaW4gcilpZihyLmhhc093blByb3BlcnR5KGEpKXt2YXIgcz1yW2Fd LHU9MCxsPWQubW91bnRDb21wb25lbnQocyx0LHRoaXMsdGhpcy5faG9zdENvbnRhaW5lckluZm8s bix1KTtzLl9tb3VudEluZGV4PWkrKyxvLnB1c2gobCl9cmV0dXJuIG99LHVwZGF0ZVRleHRDb250 ZW50OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX3JlbmRlcmVkQ2hpbGRyZW47Zi51bm1vdW50Q2hp bGRyZW4odCwhMSk7Zm9yKHZhciBuIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmYygiMTE4Iik7 dmFyIHI9W3MoZSldO2wodGhpcyxyKX0sdXBkYXRlTWFya3VwOmZ1bmN0aW9uKGUpe3ZhciB0PXRo aXMuX3JlbmRlcmVkQ2hpbGRyZW47Zi51bm1vdW50Q2hpbGRyZW4odCwhMSk7Zm9yKHZhciBuIGlu IHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmYygiMTE4Iik7dmFyIHI9W2EoZSldO2wodGhpcyxyKX0s dXBkYXRlQ2hpbGRyZW46ZnVuY3Rpb24oZSx0LG4pe3RoaXMuX3VwZGF0ZUNoaWxkcmVuKGUsdCxu KX0sX3VwZGF0ZUNoaWxkcmVuOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLl9yZW5kZXJlZENo aWxkcmVuLG89e30saT1bXSxhPXRoaXMuX3JlY29uY2lsZXJVcGRhdGVDaGlsZHJlbihyLGUsaSxv LHQsbik7aWYoYXx8cil7dmFyIHMsYz1udWxsLHA9MCxmPTAsaD0wLG09bnVsbDtmb3IocyBpbiBh KWlmKGEuaGFzT3duUHJvcGVydHkocykpe3ZhciB2PXImJnJbc10sZz1hW3NdO3Y9PT1nPyhjPXUo Yyx0aGlzLm1vdmVDaGlsZCh2LG0scCxmKSksZj1NYXRoLm1heCh2Ll9tb3VudEluZGV4LGYpLHYu X21vdW50SW5kZXg9cCk6KHYmJihmPU1hdGgubWF4KHYuX21vdW50SW5kZXgsZikpLGM9dShjLHRo aXMuX21vdW50Q2hpbGRBdEluZGV4KGcsaVtoXSxtLHAsdCxuKSksaCsrKSxwKyssbT1kLmdldEhv c3ROb2RlKGcpfWZvcihzIGluIG8pby5oYXNPd25Qcm9wZXJ0eShzKSYmKGM9dShjLHRoaXMuX3Vu bW91bnRDaGlsZChyW3NdLG9bc10pKSk7YyYmbCh0aGlzLGMpLHRoaXMuX3JlbmRlcmVkQ2hpbGRy ZW49YX19LHVubW91bnRDaGlsZHJlbjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9yZW5kZXJlZENo aWxkcmVuO2YudW5tb3VudENoaWxkcmVuKHQsZSksdGhpcy5fcmVuZGVyZWRDaGlsZHJlbj1udWxs fSxtb3ZlQ2hpbGQ6ZnVuY3Rpb24oZSx0LG4scil7aWYoZS5fbW91bnRJbmRleDxyKXJldHVybiBv KGUsdCxuKX0sY3JlYXRlQ2hpbGQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiByKG4sdCxlLl9tb3Vu dEluZGV4KX0scmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaShlLHQpfSxfbW91bnRD aGlsZEF0SW5kZXg6ZnVuY3Rpb24oZSx0LG4scixvLGkpe3JldHVybiBlLl9tb3VudEluZGV4PXIs dGhpcy5jcmVhdGVDaGlsZChlLG4sdCl9LF91bm1vdW50Q2hpbGQ6ZnVuY3Rpb24oZSx0KXt2YXIg bj10aGlzLnJlbW92ZUNoaWxkKGUsdCk7cmV0dXJuIGUuX21vdW50SW5kZXg9bnVsbCxufX19KTt0 LmV4cG9ydHM9bX0sezExMzoxMTMsMTIwOjEyMCwxMjk6MTI5LDEzNzoxMzcsMjY6MjYsMjg6Mjgs NTc6NTcsNTg6NTgsNjY6NjYsOTc6OTd9XSw2MjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0 Ijt2YXIgcj1lKDExMyksbz1lKDEyMSksaT0oZSgxMzcpLHtIT1NUOjAsQ09NUE9TSVRFOjEsRU1Q VFk6MixnZXRUeXBlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZXx8ZT09PSExP2kuRU1QVFk6 by5pc1ZhbGlkRWxlbWVudChlKT8iZnVuY3Rpb24iPT10eXBlb2YgZS50eXBlP2kuQ09NUE9TSVRF OmkuSE9TVDp2b2lkIHIoIjI2IixlKX19KTt0LmV4cG9ydHM9aX0sezExMzoxMTMsMTIxOjEyMSwx Mzc6MTM3fV0sNjM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXty ZXR1cm4hKCFlfHwiZnVuY3Rpb24iIT10eXBlb2YgZS5hdHRhY2hSZWZ8fCJmdW5jdGlvbiIhPXR5 cGVvZiBlLmRldGFjaFJlZil9dmFyIG89ZSgxMTMpLGk9KGUoMTM3KSx7YWRkQ29tcG9uZW50QXNS ZWZUbzpmdW5jdGlvbihlLHQsbil7cihuKT92b2lkIDA6bygiMTE5Iiksbi5hdHRhY2hSZWYodCxl KX0scmVtb3ZlQ29tcG9uZW50QXNSZWZGcm9tOmZ1bmN0aW9uKGUsdCxuKXtyKG4pP3ZvaWQgMDpv KCIxMjAiKTt2YXIgaT1uLmdldFB1YmxpY0luc3RhbmNlKCk7aSYmaS5yZWZzW3RdPT09ZS5nZXRQ dWJsaWNJbnN0YW5jZSgpJiZuLmRldGFjaFJlZih0KX19KTt0LmV4cG9ydHM9aX0sezExMzoxMTMs MTM3OjEzN31dLDY0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPSJTRUNSRVRf RE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCI7dC5leHBvcnRzPXJ9LHt9XSw2 NTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3RoaXMucmVpbml0 aWFsaXplVHJhbnNhY3Rpb24oKSx0aGlzLnJlbmRlclRvU3RhdGljTWFya3VwPSExLHRoaXMucmVh Y3RNb3VudFJlYWR5PWkuZ2V0UG9vbGVkKG51bGwpLHRoaXMudXNlQ3JlYXRlRWxlbWVudD1lfXZh ciBvPWUoMTQzKSxpPWUoNiksYT1lKDI0KSxzPWUoMjUpLHU9ZSg1NiksbD0oZSg1OCksZSg4OSkp LGM9ZSg3MCkscD17aW5pdGlhbGl6ZTp1LmdldFNlbGVjdGlvbkluZm9ybWF0aW9uLGNsb3NlOnUu cmVzdG9yZVNlbGVjdGlvbn0sZD17aW5pdGlhbGl6ZTpmdW5jdGlvbigpe3ZhciBlPXMuaXNFbmFi bGVkKCk7cmV0dXJuIHMuc2V0RW5hYmxlZCghMSksZX0sY2xvc2U6ZnVuY3Rpb24oZSl7cy5zZXRF bmFibGVkKGUpfX0sZj17aW5pdGlhbGl6ZTpmdW5jdGlvbigpe3RoaXMucmVhY3RNb3VudFJlYWR5 LnJlc2V0KCl9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy5yZWFjdE1vdW50UmVhZHkubm90aWZ5QWxs KCl9fSxoPVtwLGQsZl0sbT17Z2V0VHJhbnNhY3Rpb25XcmFwcGVyczpmdW5jdGlvbigpe3JldHVy biBofSxnZXRSZWFjdE1vdW50UmVhZHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFjdE1vdW50 UmVhZHl9LGdldFVwZGF0ZVF1ZXVlOmZ1bmN0aW9uKCl7cmV0dXJuIGN9LGNoZWNrcG9pbnQ6ZnVu Y3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFjdE1vdW50UmVhZHkuY2hlY2twb2ludCgpfSxyb2xsYmFj azpmdW5jdGlvbihlKXt0aGlzLnJlYWN0TW91bnRSZWFkeS5yb2xsYmFjayhlKX0sZGVzdHJ1Y3Rv cjpmdW5jdGlvbigpe2kucmVsZWFzZSh0aGlzLnJlYWN0TW91bnRSZWFkeSksdGhpcy5yZWFjdE1v dW50UmVhZHk9bnVsbH19O28oci5wcm90b3R5cGUsbCxtKSxhLmFkZFBvb2xpbmdUbyhyKSx0LmV4 cG9ydHM9cn0sezE0MzoxNDMsMjQ6MjQsMjU6MjUsNTY6NTYsNTg6NTgsNjo2LDcwOjcwLDg5Ojg5 fV0sNjY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcigpe28uYXR0YWNo UmVmcyh0aGlzLHRoaXMuX2N1cnJlbnRFbGVtZW50KX12YXIgbz1lKDY3KSxpPShlKDU4KSxlKDE0 Mikse21vdW50Q29tcG9uZW50OmZ1bmN0aW9uKGUsdCxuLG8saSxhKXt2YXIgcz1lLm1vdW50Q29t cG9uZW50KHQsbixvLGksYSk7cmV0dXJuIGUuX2N1cnJlbnRFbGVtZW50JiZudWxsIT1lLl9jdXJy ZW50RWxlbWVudC5yZWYmJnQuZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShyLGUpLHN9LGdl dEhvc3ROb2RlOmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEhvc3ROb2RlKCl9LHVubW91bnRDb21w b25lbnQ6ZnVuY3Rpb24oZSx0KXtvLmRldGFjaFJlZnMoZSxlLl9jdXJyZW50RWxlbWVudCksZS51 bm1vdW50Q29tcG9uZW50KHQpfSxyZWNlaXZlQ29tcG9uZW50OmZ1bmN0aW9uKGUsdCxuLGkpe3Zh ciBhPWUuX2N1cnJlbnRFbGVtZW50O2lmKHQhPT1hfHxpIT09ZS5fY29udGV4dCl7dmFyIHM9by5z aG91bGRVcGRhdGVSZWZzKGEsdCk7cyYmby5kZXRhY2hSZWZzKGUsYSksZS5yZWNlaXZlQ29tcG9u ZW50KHQsbixpKSxzJiZlLl9jdXJyZW50RWxlbWVudCYmbnVsbCE9ZS5fY3VycmVudEVsZW1lbnQu cmVmJiZuLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUocixlKX19LHBlcmZvcm1VcGRhdGVJ Zk5lY2Vzc2FyeTpmdW5jdGlvbihlLHQsbil7ZS5fdXBkYXRlQmF0Y2hOdW1iZXI9PT1uJiZlLnBl cmZvcm1VcGRhdGVJZk5lY2Vzc2FyeSh0KX19KTt0LmV4cG9ydHM9aX0sezE0MjoxNDIsNTg6NTgs Njc6Njd9XSw2NzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxu KXsiZnVuY3Rpb24iPT10eXBlb2YgZT9lKHQuZ2V0UHVibGljSW5zdGFuY2UoKSk6aS5hZGRDb21w b25lbnRBc1JlZlRvKHQsZSxuKX1mdW5jdGlvbiBvKGUsdCxuKXsiZnVuY3Rpb24iPT10eXBlb2Yg ZT9lKG51bGwpOmkucmVtb3ZlQ29tcG9uZW50QXNSZWZGcm9tKHQsZSxuKX12YXIgaT1lKDYzKSxh PXt9O2EuYXR0YWNoUmVmcz1mdW5jdGlvbihlLHQpe2lmKG51bGwhPT10JiYib2JqZWN0Ij09dHlw ZW9mIHQpe3ZhciBuPXQucmVmO251bGwhPW4mJnIobixlLHQuX293bmVyKX19LGEuc2hvdWxkVXBk YXRlUmVmcz1mdW5jdGlvbihlLHQpe3ZhciBuPW51bGwscj1udWxsO251bGwhPT1lJiYib2JqZWN0 Ij09dHlwZW9mIGUmJihuPWUucmVmLHI9ZS5fb3duZXIpO3ZhciBvPW51bGwsaT1udWxsO3JldHVy biBudWxsIT09dCYmIm9iamVjdCI9PXR5cGVvZiB0JiYobz10LnJlZixpPXQuX293bmVyKSxuIT09 b3x8InN0cmluZyI9PXR5cGVvZiBvJiZpIT09cn0sYS5kZXRhY2hSZWZzPWZ1bmN0aW9uKGUsdCl7 aWYobnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdCl7dmFyIG49dC5yZWY7bnVsbCE9biYmbyhu LGUsdC5fb3duZXIpfX0sdC5leHBvcnRzPWF9LHs2Mzo2M31dLDY4OltmdW5jdGlvbihlLHQsbil7 InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dGhpcy5yZWluaXRpYWxpemVUcmFuc2FjdGlvbigp LHRoaXMucmVuZGVyVG9TdGF0aWNNYXJrdXA9ZSx0aGlzLnVzZUNyZWF0ZUVsZW1lbnQ9ITEsdGhp cy51cGRhdGVRdWV1ZT1uZXcgcyh0aGlzKX12YXIgbz1lKDE0MyksaT1lKDI0KSxhPWUoODkpLHM9 KGUoNTgpLGUoNjkpKSx1PVtdLGw9e2VucXVldWU6ZnVuY3Rpb24oKXt9fSxjPXtnZXRUcmFuc2Fj dGlvbldyYXBwZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHV9LGdldFJlYWN0TW91bnRSZWFkeTpmdW5j dGlvbigpe3JldHVybiBsfSxnZXRVcGRhdGVRdWV1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVw ZGF0ZVF1ZXVlfSxkZXN0cnVjdG9yOmZ1bmN0aW9uKCl7fSxjaGVja3BvaW50OmZ1bmN0aW9uKCl7 fSxyb2xsYmFjazpmdW5jdGlvbigpe319O28oci5wcm90b3R5cGUsYSxjKSxpLmFkZFBvb2xpbmdU byhyKSx0LmV4cG9ydHM9cn0sezE0MzoxNDMsMjQ6MjQsNTg6NTgsNjk6NjksODk6ODl9XSw2OTpb ZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7aWYoIShlIGluc3Rh bmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1 bmN0aW9uIil9ZnVuY3Rpb24gbyhlLHQpe312YXIgaT1lKDcwKSxhPShlKDE0MiksZnVuY3Rpb24o KXtmdW5jdGlvbiBlKHQpe3IodGhpcyxlKSx0aGlzLnRyYW5zYWN0aW9uPXR9cmV0dXJuIGUucHJv dG90eXBlLmlzTW91bnRlZD1mdW5jdGlvbihlKXtyZXR1cm4hMX0sZS5wcm90b3R5cGUuZW5xdWV1 ZUNhbGxiYWNrPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLnRyYW5zYWN0aW9uLmlzSW5UcmFuc2FjdGlv bigpJiZpLmVucXVldWVDYWxsYmFjayhlLHQsbil9LGUucHJvdG90eXBlLmVucXVldWVGb3JjZVVw ZGF0ZT1mdW5jdGlvbihlKXt0aGlzLnRyYW5zYWN0aW9uLmlzSW5UcmFuc2FjdGlvbigpP2kuZW5x dWV1ZUZvcmNlVXBkYXRlKGUpOm8oZSwiZm9yY2VVcGRhdGUiKX0sZS5wcm90b3R5cGUuZW5xdWV1 ZVJlcGxhY2VTdGF0ZT1mdW5jdGlvbihlLHQpe3RoaXMudHJhbnNhY3Rpb24uaXNJblRyYW5zYWN0 aW9uKCk/aS5lbnF1ZXVlUmVwbGFjZVN0YXRlKGUsdCk6byhlLCJyZXBsYWNlU3RhdGUiKX0sZS5w cm90b3R5cGUuZW5xdWV1ZVNldFN0YXRlPWZ1bmN0aW9uKGUsdCl7dGhpcy50cmFuc2FjdGlvbi5p c0luVHJhbnNhY3Rpb24oKT9pLmVucXVldWVTZXRTdGF0ZShlLHQpOm8oZSwic2V0U3RhdGUiKX0s ZX0oKSk7dC5leHBvcnRzPWF9LHsxNDI6MTQyLDcwOjcwfV0sNzA6W2Z1bmN0aW9uKGUsdCxuKXsi dXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt1LmVucXVldWVVcGRhdGUoZSl9ZnVuY3Rpb24gbyhl KXt2YXIgdD10eXBlb2YgZTtpZigib2JqZWN0IiE9PXQpcmV0dXJuIHQ7dmFyIG49ZS5jb25zdHJ1 Y3RvciYmZS5jb25zdHJ1Y3Rvci5uYW1lfHx0LHI9T2JqZWN0LmtleXMoZSk7cmV0dXJuIHIubGVu Z3RoPjAmJnIubGVuZ3RoPDIwP24rIiAoa2V5czogIityLmpvaW4oIiwgIikrIikiOm59ZnVuY3Rp b24gaShlLHQpe3ZhciBuPXMuZ2V0KGUpO3JldHVybiBuP246bnVsbH12YXIgYT1lKDExMykscz0o ZSgxMjApLGUoNTcpKSx1PShlKDU4KSxlKDcxKSksbD0oZSgxMzcpLGUoMTQyKSx7aXNNb3VudGVk OmZ1bmN0aW9uKGUpe3ZhciB0PXMuZ2V0KGUpO3JldHVybiEhdCYmISF0Ll9yZW5kZXJlZENvbXBv bmVudH0sZW5xdWV1ZUNhbGxiYWNrOmZ1bmN0aW9uKGUsdCxuKXtsLnZhbGlkYXRlQ2FsbGJhY2so dCxuKTt2YXIgbz1pKGUpO3JldHVybiBvPyhvLl9wZW5kaW5nQ2FsbGJhY2tzP28uX3BlbmRpbmdD YWxsYmFja3MucHVzaCh0KTpvLl9wZW5kaW5nQ2FsbGJhY2tzPVt0XSx2b2lkIHIobykpOm51bGx9 LGVucXVldWVDYWxsYmFja0ludGVybmFsOmZ1bmN0aW9uKGUsdCl7ZS5fcGVuZGluZ0NhbGxiYWNr cz9lLl9wZW5kaW5nQ2FsbGJhY2tzLnB1c2godCk6ZS5fcGVuZGluZ0NhbGxiYWNrcz1bdF0scihl KX0sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKGUpe3ZhciB0PWkoZSwiZm9yY2VVcGRhdGUi KTt0JiYodC5fcGVuZGluZ0ZvcmNlVXBkYXRlPSEwLHIodCkpfSxlbnF1ZXVlUmVwbGFjZVN0YXRl OmZ1bmN0aW9uKGUsdCl7dmFyIG49aShlLCJyZXBsYWNlU3RhdGUiKTtuJiYobi5fcGVuZGluZ1N0 YXRlUXVldWU9W3RdLG4uX3BlbmRpbmdSZXBsYWNlU3RhdGU9ITAscihuKSl9LGVucXVldWVTZXRT dGF0ZTpmdW5jdGlvbihlLHQpe3ZhciBuPWkoZSwic2V0U3RhdGUiKTtpZihuKXt2YXIgbz1uLl9w ZW5kaW5nU3RhdGVRdWV1ZXx8KG4uX3BlbmRpbmdTdGF0ZVF1ZXVlPVtdKTtvLnB1c2godCkscihu KX19LGVucXVldWVFbGVtZW50SW50ZXJuYWw6ZnVuY3Rpb24oZSx0LG4pe2UuX3BlbmRpbmdFbGVt ZW50PXQsZS5fY29udGV4dD1uLHIoZSl9LHZhbGlkYXRlQ2FsbGJhY2s6ZnVuY3Rpb24oZSx0KXtl JiYiZnVuY3Rpb24iIT10eXBlb2YgZT9hKCIxMjIiLHQsbyhlKSk6dm9pZCAwfX0pO3QuZXhwb3J0 cz1sfSx7MTEzOjExMywxMjA6MTIwLDEzNzoxMzcsMTQyOjE0Miw1Nzo1Nyw1ODo1OCw3MTo3MX1d LDcxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoKXtQLlJlYWN0UmVj b25jaWxlVHJhbnNhY3Rpb24mJmI/dm9pZCAwOmMoIjEyMyIpfWZ1bmN0aW9uIG8oKXt0aGlzLnJl aW5pdGlhbGl6ZVRyYW5zYWN0aW9uKCksdGhpcy5kaXJ0eUNvbXBvbmVudHNMZW5ndGg9bnVsbCx0 aGlzLmNhbGxiYWNrUXVldWU9ZC5nZXRQb29sZWQoKSx0aGlzLnJlY29uY2lsZVRyYW5zYWN0aW9u PVAuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbi5nZXRQb29sZWQoITApfWZ1bmN0aW9uIGkoZSx0 LG4sbyxpLGEpe3JldHVybiByKCksYi5iYXRjaGVkVXBkYXRlcyhlLHQsbixvLGksYSl9ZnVuY3Rp b24gYShlLHQpe3JldHVybiBlLl9tb3VudE9yZGVyLXQuX21vdW50T3JkZXJ9ZnVuY3Rpb24gcyhl KXt2YXIgdD1lLmRpcnR5Q29tcG9uZW50c0xlbmd0aDt0IT09Zy5sZW5ndGg/YygiMTI0Iix0LGcu bGVuZ3RoKTp2b2lkIDAsZy5zb3J0KGEpLHkrKztmb3IodmFyIG49MDtuPHQ7bisrKXt2YXIgcj1n W25dLG89ci5fcGVuZGluZ0NhbGxiYWNrcztyLl9wZW5kaW5nQ2FsbGJhY2tzPW51bGw7dmFyIGk7 aWYoaC5sb2dUb3BMZXZlbFJlbmRlcnMpe3ZhciBzPXI7ci5fY3VycmVudEVsZW1lbnQudHlwZS5p c1JlYWN0VG9wTGV2ZWxXcmFwcGVyJiYocz1yLl9yZW5kZXJlZENvbXBvbmVudCksaT0iUmVhY3Qg dXBkYXRlOiAiK3MuZ2V0TmFtZSgpLGNvbnNvbGUudGltZShpKX1pZihtLnBlcmZvcm1VcGRhdGVJ Zk5lY2Vzc2FyeShyLGUucmVjb25jaWxlVHJhbnNhY3Rpb24seSksaSYmY29uc29sZS50aW1lRW5k KGkpLG8pZm9yKHZhciB1PTA7dTxvLmxlbmd0aDt1KyspZS5jYWxsYmFja1F1ZXVlLmVucXVldWUo b1t1XSxyLmdldFB1YmxpY0luc3RhbmNlKCkpfX1mdW5jdGlvbiB1KGUpe3JldHVybiByKCksYi5p c0JhdGNoaW5nVXBkYXRlcz8oZy5wdXNoKGUpLHZvaWQobnVsbD09ZS5fdXBkYXRlQmF0Y2hOdW1i ZXImJihlLl91cGRhdGVCYXRjaE51bWJlcj15KzEpKSk6dm9pZCBiLmJhdGNoZWRVcGRhdGVzKHUs ZSl9ZnVuY3Rpb24gbChlLHQpe2IuaXNCYXRjaGluZ1VwZGF0ZXM/dm9pZCAwOmMoIjEyNSIpLF8u ZW5xdWV1ZShlLHQpLEM9ITB9dmFyIGM9ZSgxMTMpLHA9ZSgxNDMpLGQ9ZSg2KSxmPWUoMjQpLGg9 ZSg1MyksbT1lKDY2KSx2PWUoODkpLGc9KGUoMTM3KSxbXSkseT0wLF89ZC5nZXRQb29sZWQoKSxD PSExLGI9bnVsbCxFPXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7dGhpcy5kaXJ0eUNvbXBvbmVudHNM ZW5ndGg9Zy5sZW5ndGh9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy5kaXJ0eUNvbXBvbmVudHNMZW5n dGghPT1nLmxlbmd0aD8oZy5zcGxpY2UoMCx0aGlzLmRpcnR5Q29tcG9uZW50c0xlbmd0aCksVCgp KTpnLmxlbmd0aD0wfX0seD17aW5pdGlhbGl6ZTpmdW5jdGlvbigpe3RoaXMuY2FsbGJhY2tRdWV1 ZS5yZXNldCgpfSxjbG9zZTpmdW5jdGlvbigpe3RoaXMuY2FsbGJhY2tRdWV1ZS5ub3RpZnlBbGwo KX19LHc9W0UseF07cChvLnByb3RvdHlwZSx2LHtnZXRUcmFuc2FjdGlvbldyYXBwZXJzOmZ1bmN0 aW9uKCl7cmV0dXJuIHd9LGRlc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLmRpcnR5Q29tcG9uZW50 c0xlbmd0aD1udWxsLGQucmVsZWFzZSh0aGlzLmNhbGxiYWNrUXVldWUpLHRoaXMuY2FsbGJhY2tR dWV1ZT1udWxsLFAuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbi5yZWxlYXNlKHRoaXMucmVjb25j aWxlVHJhbnNhY3Rpb24pLHRoaXMucmVjb25jaWxlVHJhbnNhY3Rpb249bnVsbH0scGVyZm9ybTpm dW5jdGlvbihlLHQsbil7cmV0dXJuIHYucGVyZm9ybS5jYWxsKHRoaXMsdGhpcy5yZWNvbmNpbGVU cmFuc2FjdGlvbi5wZXJmb3JtLHRoaXMucmVjb25jaWxlVHJhbnNhY3Rpb24sZSx0LG4pfX0pLGYu YWRkUG9vbGluZ1RvKG8pO3ZhciBUPWZ1bmN0aW9uKCl7Zm9yKDtnLmxlbmd0aHx8Qzspe2lmKGcu bGVuZ3RoKXt2YXIgZT1vLmdldFBvb2xlZCgpO2UucGVyZm9ybShzLG51bGwsZSksby5yZWxlYXNl KGUpfWlmKEMpe0M9ITE7dmFyIHQ9XztfPWQuZ2V0UG9vbGVkKCksdC5ub3RpZnlBbGwoKSxkLnJl bGVhc2UodCl9fX0saz17aW5qZWN0UmVjb25jaWxlVHJhbnNhY3Rpb246ZnVuY3Rpb24oZSl7ZT92 b2lkIDA6YygiMTI2IiksUC5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uPWV9LGluamVjdEJhdGNo aW5nU3RyYXRlZ3k6ZnVuY3Rpb24oZSl7ZT92b2lkIDA6YygiMTI3IiksImZ1bmN0aW9uIiE9dHlw ZW9mIGUuYmF0Y2hlZFVwZGF0ZXM/YygiMTI4Iik6dm9pZCAwLCJib29sZWFuIiE9dHlwZW9mIGUu aXNCYXRjaGluZ1VwZGF0ZXM/YygiMTI5Iik6dm9pZCAwLGI9ZX19LFA9e1JlYWN0UmVjb25jaWxl VHJhbnNhY3Rpb246bnVsbCxiYXRjaGVkVXBkYXRlczppLGVucXVldWVVcGRhdGU6dSxmbHVzaEJh dGNoZWRVcGRhdGVzOlQsaW5qZWN0aW9uOmssYXNhcDpsfTt0LmV4cG9ydHM9UH0sezExMzoxMTMs MTM3OjEzNywxNDM6MTQzLDI0OjI0LDUzOjUzLDY6Niw2Njo2Niw4OTo4OX1dLDcyOltmdW5jdGlv bihlLHQsbil7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz0iMTUuNC4yIn0se31dLDczOltmdW5jdGlv bihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXt4bGluazoiaHR0cDovL3d3dy53My5vcmcvMTk5 OS94bGluayIseG1sOiJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UifSxvPXth Y2NlbnRIZWlnaHQ6ImFjY2VudC1oZWlnaHQiLGFjY3VtdWxhdGU6MCxhZGRpdGl2ZTowLGFsaWdu bWVudEJhc2VsaW5lOiJhbGlnbm1lbnQtYmFzZWxpbmUiLGFsbG93UmVvcmRlcjoiYWxsb3dSZW9y ZGVyIixhbHBoYWJldGljOjAsYW1wbGl0dWRlOjAsYXJhYmljRm9ybToiYXJhYmljLWZvcm0iLGFz Y2VudDowLGF0dHJpYnV0ZU5hbWU6ImF0dHJpYnV0ZU5hbWUiLGF0dHJpYnV0ZVR5cGU6ImF0dHJp YnV0ZVR5cGUiLGF1dG9SZXZlcnNlOiJhdXRvUmV2ZXJzZSIsYXppbXV0aDowLGJhc2VGcmVxdWVu Y3k6ImJhc2VGcmVxdWVuY3kiLGJhc2VQcm9maWxlOiJiYXNlUHJvZmlsZSIsYmFzZWxpbmVTaGlm dDoiYmFzZWxpbmUtc2hpZnQiLGJib3g6MCxiZWdpbjowLGJpYXM6MCxieTowLGNhbGNNb2RlOiJj YWxjTW9kZSIsY2FwSGVpZ2h0OiJjYXAtaGVpZ2h0IixjbGlwOjAsY2xpcFBhdGg6ImNsaXAtcGF0 aCIsY2xpcFJ1bGU6ImNsaXAtcnVsZSIsY2xpcFBhdGhVbml0czoiY2xpcFBhdGhVbml0cyIsY29s b3JJbnRlcnBvbGF0aW9uOiJjb2xvci1pbnRlcnBvbGF0aW9uIixjb2xvckludGVycG9sYXRpb25G aWx0ZXJzOiJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMiLGNvbG9yUHJvZmlsZToiY29sb3It cHJvZmlsZSIsY29sb3JSZW5kZXJpbmc6ImNvbG9yLXJlbmRlcmluZyIsY29udGVudFNjcmlwdFR5 cGU6ImNvbnRlbnRTY3JpcHRUeXBlIixjb250ZW50U3R5bGVUeXBlOiJjb250ZW50U3R5bGVUeXBl IixjdXJzb3I6MCxjeDowLGN5OjAsZDowLGRlY2VsZXJhdGU6MCxkZXNjZW50OjAsZGlmZnVzZUNv bnN0YW50OiJkaWZmdXNlQ29uc3RhbnQiLGRpcmVjdGlvbjowLGRpc3BsYXk6MCxkaXZpc29yOjAs ZG9taW5hbnRCYXNlbGluZToiZG9taW5hbnQtYmFzZWxpbmUiLGR1cjowLGR4OjAsZHk6MCxlZGdl TW9kZToiZWRnZU1vZGUiLGVsZXZhdGlvbjowLGVuYWJsZUJhY2tncm91bmQ6ImVuYWJsZS1iYWNr Z3JvdW5kIixlbmQ6MCxleHBvbmVudDowLGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQ6ImV4dGVy bmFsUmVzb3VyY2VzUmVxdWlyZWQiLGZpbGw6MCxmaWxsT3BhY2l0eToiZmlsbC1vcGFjaXR5Iixm aWxsUnVsZToiZmlsbC1ydWxlIixmaWx0ZXI6MCxmaWx0ZXJSZXM6ImZpbHRlclJlcyIsZmlsdGVy VW5pdHM6ImZpbHRlclVuaXRzIixmbG9vZENvbG9yOiJmbG9vZC1jb2xvciIsZmxvb2RPcGFjaXR5 OiJmbG9vZC1vcGFjaXR5Iixmb2N1c2FibGU6MCxmb250RmFtaWx5OiJmb250LWZhbWlseSIsZm9u dFNpemU6ImZvbnQtc2l6ZSIsZm9udFNpemVBZGp1c3Q6ImZvbnQtc2l6ZS1hZGp1c3QiLGZvbnRT dHJldGNoOiJmb250LXN0cmV0Y2giLGZvbnRTdHlsZToiZm9udC1zdHlsZSIsZm9udFZhcmlhbnQ6 ImZvbnQtdmFyaWFudCIsZm9udFdlaWdodDoiZm9udC13ZWlnaHQiLGZvcm1hdDowLGZyb206MCxm eDowLGZ5OjAsZzE6MCxnMjowLGdseXBoTmFtZToiZ2x5cGgtbmFtZSIsZ2x5cGhPcmllbnRhdGlv bkhvcml6b250YWw6ImdseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwiLGdseXBoT3JpZW50YXRp b25WZXJ0aWNhbDoiZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwiLGdseXBoUmVmOiJnbHlwaFJl ZiIsZ3JhZGllbnRUcmFuc2Zvcm06ImdyYWRpZW50VHJhbnNmb3JtIixncmFkaWVudFVuaXRzOiJn cmFkaWVudFVuaXRzIixoYW5naW5nOjAsaG9yaXpBZHZYOiJob3Jpei1hZHYteCIsaG9yaXpPcmln aW5YOiJob3Jpei1vcmlnaW4teCIsaWRlb2dyYXBoaWM6MCxpbWFnZVJlbmRlcmluZzoiaW1hZ2Ut cmVuZGVyaW5nIixpbjowLGluMjowLGludGVyY2VwdDowLGs6MCxrMTowLGsyOjAsazM6MCxrNDow LGtlcm5lbE1hdHJpeDoia2VybmVsTWF0cml4IixrZXJuZWxVbml0TGVuZ3RoOiJrZXJuZWxVbml0 TGVuZ3RoIixrZXJuaW5nOjAsa2V5UG9pbnRzOiJrZXlQb2ludHMiLGtleVNwbGluZXM6ImtleVNw bGluZXMiLGtleVRpbWVzOiJrZXlUaW1lcyIsbGVuZ3RoQWRqdXN0OiJsZW5ndGhBZGp1c3QiLGxl dHRlclNwYWNpbmc6ImxldHRlci1zcGFjaW5nIixsaWdodGluZ0NvbG9yOiJsaWdodGluZy1jb2xv ciIsbGltaXRpbmdDb25lQW5nbGU6ImxpbWl0aW5nQ29uZUFuZ2xlIixsb2NhbDowLG1hcmtlckVu ZDoibWFya2VyLWVuZCIsbWFya2VyTWlkOiJtYXJrZXItbWlkIixtYXJrZXJTdGFydDoibWFya2Vy LXN0YXJ0IixtYXJrZXJIZWlnaHQ6Im1hcmtlckhlaWdodCIsbWFya2VyVW5pdHM6Im1hcmtlclVu aXRzIixtYXJrZXJXaWR0aDoibWFya2VyV2lkdGgiLG1hc2s6MCxtYXNrQ29udGVudFVuaXRzOiJt YXNrQ29udGVudFVuaXRzIixtYXNrVW5pdHM6Im1hc2tVbml0cyIsbWF0aGVtYXRpY2FsOjAsbW9k ZTowLG51bU9jdGF2ZXM6Im51bU9jdGF2ZXMiLG9mZnNldDowLG9wYWNpdHk6MCxvcGVyYXRvcjow LG9yZGVyOjAsb3JpZW50OjAsb3JpZW50YXRpb246MCxvcmlnaW46MCxvdmVyZmxvdzowLG92ZXJs aW5lUG9zaXRpb246Im92ZXJsaW5lLXBvc2l0aW9uIixvdmVybGluZVRoaWNrbmVzczoib3Zlcmxp bmUtdGhpY2tuZXNzIixwYWludE9yZGVyOiJwYWludC1vcmRlciIscGFub3NlMToicGFub3NlLTEi LHBhdGhMZW5ndGg6InBhdGhMZW5ndGgiLHBhdHRlcm5Db250ZW50VW5pdHM6InBhdHRlcm5Db250 ZW50VW5pdHMiLHBhdHRlcm5UcmFuc2Zvcm06InBhdHRlcm5UcmFuc2Zvcm0iLHBhdHRlcm5Vbml0 czoicGF0dGVyblVuaXRzIixwb2ludGVyRXZlbnRzOiJwb2ludGVyLWV2ZW50cyIscG9pbnRzOjAs cG9pbnRzQXRYOiJwb2ludHNBdFgiLHBvaW50c0F0WToicG9pbnRzQXRZIixwb2ludHNBdFo6InBv aW50c0F0WiIscHJlc2VydmVBbHBoYToicHJlc2VydmVBbHBoYSIscHJlc2VydmVBc3BlY3RSYXRp bzoicHJlc2VydmVBc3BlY3RSYXRpbyIscHJpbWl0aXZlVW5pdHM6InByaW1pdGl2ZVVuaXRzIixy OjAscmFkaXVzOjAscmVmWDoicmVmWCIscmVmWToicmVmWSIscmVuZGVyaW5nSW50ZW50OiJyZW5k ZXJpbmctaW50ZW50IixyZXBlYXRDb3VudDoicmVwZWF0Q291bnQiLHJlcGVhdER1cjoicmVwZWF0 RHVyIixyZXF1aXJlZEV4dGVuc2lvbnM6InJlcXVpcmVkRXh0ZW5zaW9ucyIscmVxdWlyZWRGZWF0 dXJlczoicmVxdWlyZWRGZWF0dXJlcyIscmVzdGFydDowLHJlc3VsdDowLHJvdGF0ZTowLHJ4OjAs cnk6MCxzY2FsZTowLHNlZWQ6MCxzaGFwZVJlbmRlcmluZzoic2hhcGUtcmVuZGVyaW5nIixzbG9w ZTowLHNwYWNpbmc6MCxzcGVjdWxhckNvbnN0YW50OiJzcGVjdWxhckNvbnN0YW50IixzcGVjdWxh ckV4cG9uZW50OiJzcGVjdWxhckV4cG9uZW50IixzcGVlZDowLHNwcmVhZE1ldGhvZDoic3ByZWFk TWV0aG9kIixzdGFydE9mZnNldDoic3RhcnRPZmZzZXQiLHN0ZERldmlhdGlvbjoic3RkRGV2aWF0 aW9uIixzdGVtaDowLHN0ZW12OjAsc3RpdGNoVGlsZXM6InN0aXRjaFRpbGVzIixzdG9wQ29sb3I6 InN0b3AtY29sb3IiLHN0b3BPcGFjaXR5OiJzdG9wLW9wYWNpdHkiLHN0cmlrZXRocm91Z2hQb3Np dGlvbjoic3RyaWtldGhyb3VnaC1wb3NpdGlvbiIsc3RyaWtldGhyb3VnaFRoaWNrbmVzczoic3Ry aWtldGhyb3VnaC10aGlja25lc3MiLHN0cmluZzowLHN0cm9rZTowLHN0cm9rZURhc2hhcnJheToi c3Ryb2tlLWRhc2hhcnJheSIsc3Ryb2tlRGFzaG9mZnNldDoic3Ryb2tlLWRhc2hvZmZzZXQiLHN0 cm9rZUxpbmVjYXA6InN0cm9rZS1saW5lY2FwIixzdHJva2VMaW5lam9pbjoic3Ryb2tlLWxpbmVq b2luIixzdHJva2VNaXRlcmxpbWl0OiJzdHJva2UtbWl0ZXJsaW1pdCIsc3Ryb2tlT3BhY2l0eToi c3Ryb2tlLW9wYWNpdHkiLHN0cm9rZVdpZHRoOiJzdHJva2Utd2lkdGgiLHN1cmZhY2VTY2FsZToi c3VyZmFjZVNjYWxlIixzeXN0ZW1MYW5ndWFnZToic3lzdGVtTGFuZ3VhZ2UiLHRhYmxlVmFsdWVz OiJ0YWJsZVZhbHVlcyIsdGFyZ2V0WDoidGFyZ2V0WCIsdGFyZ2V0WToidGFyZ2V0WSIsdGV4dEFu Y2hvcjoidGV4dC1hbmNob3IiLHRleHREZWNvcmF0aW9uOiJ0ZXh0LWRlY29yYXRpb24iLHRleHRS ZW5kZXJpbmc6InRleHQtcmVuZGVyaW5nIix0ZXh0TGVuZ3RoOiJ0ZXh0TGVuZ3RoIix0bzowLHRy YW5zZm9ybTowLHUxOjAsdTI6MCx1bmRlcmxpbmVQb3NpdGlvbjoidW5kZXJsaW5lLXBvc2l0aW9u Iix1bmRlcmxpbmVUaGlja25lc3M6InVuZGVybGluZS10aGlja25lc3MiLHVuaWNvZGU6MCx1bmlj b2RlQmlkaToidW5pY29kZS1iaWRpIix1bmljb2RlUmFuZ2U6InVuaWNvZGUtcmFuZ2UiLHVuaXRz UGVyRW06InVuaXRzLXBlci1lbSIsdkFscGhhYmV0aWM6InYtYWxwaGFiZXRpYyIsdkhhbmdpbmc6 InYtaGFuZ2luZyIsdklkZW9ncmFwaGljOiJ2LWlkZW9ncmFwaGljIix2TWF0aGVtYXRpY2FsOiJ2 LW1hdGhlbWF0aWNhbCIsdmFsdWVzOjAsdmVjdG9yRWZmZWN0OiJ2ZWN0b3ItZWZmZWN0Iix2ZXJz aW9uOjAsdmVydEFkdlk6InZlcnQtYWR2LXkiLHZlcnRPcmlnaW5YOiJ2ZXJ0LW9yaWdpbi14Iix2 ZXJ0T3JpZ2luWToidmVydC1vcmlnaW4teSIsdmlld0JveDoidmlld0JveCIsdmlld1RhcmdldDoi dmlld1RhcmdldCIsdmlzaWJpbGl0eTowLHdpZHRoczowLHdvcmRTcGFjaW5nOiJ3b3JkLXNwYWNp bmciLHdyaXRpbmdNb2RlOiJ3cml0aW5nLW1vZGUiLHg6MCx4SGVpZ2h0OiJ4LWhlaWdodCIseDE6 MCx4MjowLHhDaGFubmVsU2VsZWN0b3I6InhDaGFubmVsU2VsZWN0b3IiLHhsaW5rQWN0dWF0ZToi eGxpbms6YWN0dWF0ZSIseGxpbmtBcmNyb2xlOiJ4bGluazphcmNyb2xlIix4bGlua0hyZWY6Inhs aW5rOmhyZWYiLHhsaW5rUm9sZToieGxpbms6cm9sZSIseGxpbmtTaG93OiJ4bGluazpzaG93Iix4 bGlua1RpdGxlOiJ4bGluazp0aXRsZSIseGxpbmtUeXBlOiJ4bGluazp0eXBlIix4bWxCYXNlOiJ4 bWw6YmFzZSIseG1sbnM6MCx4bWxuc1hsaW5rOiJ4bWxuczp4bGluayIseG1sTGFuZzoieG1sOmxh bmciLHhtbFNwYWNlOiJ4bWw6c3BhY2UiLHk6MCx5MTowLHkyOjAseUNoYW5uZWxTZWxlY3Rvcjoi eUNoYW5uZWxTZWxlY3RvciIsejowLHpvb21BbmRQYW46Inpvb21BbmRQYW4ifSxpPXtQcm9wZXJ0 aWVzOnt9LERPTUF0dHJpYnV0ZU5hbWVzcGFjZXM6e3hsaW5rQWN0dWF0ZTpyLnhsaW5rLHhsaW5r QXJjcm9sZTpyLnhsaW5rLHhsaW5rSHJlZjpyLnhsaW5rLHhsaW5rUm9sZTpyLnhsaW5rLHhsaW5r U2hvdzpyLnhsaW5rLHhsaW5rVGl0bGU6ci54bGluayx4bGlua1R5cGU6ci54bGluayx4bWxCYXNl OnIueG1sLHhtbExhbmc6ci54bWwseG1sU3BhY2U6ci54bWx9LERPTUF0dHJpYnV0ZU5hbWVzOnt9 fTtPYmplY3Qua2V5cyhvKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2kuUHJvcGVydGllc1tlXT0wLG9b ZV0mJihpLkRPTUF0dHJpYnV0ZU5hbWVzW2VdPW9bZV0pfSksdC5leHBvcnRzPWl9LHt9XSw3NDpb ZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe2lmKCJzZWxlY3Rpb25T dGFydCJpbiBlJiZ1Lmhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhlKSlyZXR1cm57c3RhcnQ6ZS5z ZWxlY3Rpb25TdGFydCxlbmQ6ZS5zZWxlY3Rpb25FbmR9O2lmKHdpbmRvdy5nZXRTZWxlY3Rpb24p e3ZhciB0PXdpbmRvdy5nZXRTZWxlY3Rpb24oKTtyZXR1cm57YW5jaG9yTm9kZTp0LmFuY2hvck5v ZGUsYW5jaG9yT2Zmc2V0OnQuYW5jaG9yT2Zmc2V0LGZvY3VzTm9kZTp0LmZvY3VzTm9kZSxmb2N1 c09mZnNldDp0LmZvY3VzT2Zmc2V0fX1pZihkb2N1bWVudC5zZWxlY3Rpb24pe3ZhciBuPWRvY3Vt ZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpO3JldHVybntwYXJlbnRFbGVtZW50Om4ucGFyZW50 RWxlbWVudCgpLHRleHQ6bi50ZXh0LHRvcDpuLmJvdW5kaW5nVG9wLGxlZnQ6bi5ib3VuZGluZ0xl ZnR9fX1mdW5jdGlvbiBvKGUsdCl7aWYoeXx8bnVsbD09bXx8bSE9PWMoKSlyZXR1cm4gbnVsbDt2 YXIgbj1yKG0pO2lmKCFnfHwhZChnLG4pKXtnPW47dmFyIG89bC5nZXRQb29sZWQoaC5zZWxlY3Qs dixlLHQpO3JldHVybiBvLnR5cGU9InNlbGVjdCIsby50YXJnZXQ9bSxpLmFjY3VtdWxhdGVUd29Q aGFzZURpc3BhdGNoZXMobyksb31yZXR1cm4gbnVsbH12YXIgaT1lKDE5KSxhPWUoMTIzKSxzPWUo MzMpLHU9ZSg1NiksbD1lKDgwKSxjPWUoMTMyKSxwPWUoMTExKSxkPWUoMTQxKSxmPWEuY2FuVXNl RE9NJiYiZG9jdW1lbnRNb2RlImluIGRvY3VtZW50JiZkb2N1bWVudC5kb2N1bWVudE1vZGU8PTEx LGg9e3NlbGVjdDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Im9uU2VsZWN0Iixj YXB0dXJlZDoib25TZWxlY3RDYXB0dXJlIn0sZGVwZW5kZW5jaWVzOlsidG9wQmx1ciIsInRvcENv bnRleHRNZW51IiwidG9wRm9jdXMiLCJ0b3BLZXlEb3duIiwidG9wS2V5VXAiLCJ0b3BNb3VzZURv d24iLCJ0b3BNb3VzZVVwIiwidG9wU2VsZWN0aW9uQ2hhbmdlIl19fSxtPW51bGwsdj1udWxsLGc9 bnVsbCx5PSExLF89ITEsQz17ZXZlbnRUeXBlczpoLGV4dHJhY3RFdmVudHM6ZnVuY3Rpb24oZSx0 LG4scil7aWYoIV8pcmV0dXJuIG51bGw7dmFyIGk9dD9zLmdldE5vZGVGcm9tSW5zdGFuY2UodCk6 d2luZG93O3N3aXRjaChlKXtjYXNlInRvcEZvY3VzIjoocChpKXx8InRydWUiPT09aS5jb250ZW50 RWRpdGFibGUpJiYobT1pLHY9dCxnPW51bGwpO2JyZWFrO2Nhc2UidG9wQmx1ciI6bT1udWxsLHY9 bnVsbCxnPW51bGw7YnJlYWs7Y2FzZSJ0b3BNb3VzZURvd24iOnk9ITA7YnJlYWs7Y2FzZSJ0b3BD b250ZXh0TWVudSI6Y2FzZSJ0b3BNb3VzZVVwIjpyZXR1cm4geT0hMSwKK28obixyKTtjYXNlInRv cFNlbGVjdGlvbkNoYW5nZSI6aWYoZilicmVhaztjYXNlInRvcEtleURvd24iOmNhc2UidG9wS2V5 VXAiOnJldHVybiBvKG4scil9cmV0dXJuIG51bGx9LGRpZFB1dExpc3RlbmVyOmZ1bmN0aW9uKGUs dCxuKXsib25TZWxlY3QiPT09dCYmKF89ITApfX07dC5leHBvcnRzPUN9LHsxMTE6MTExLDEyMzox MjMsMTMyOjEzMiwxNDE6MTQxLDE5OjE5LDMzOjMzLDU2OjU2LDgwOjgwfV0sNzU6W2Z1bmN0aW9u KGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4iLiIrZS5fcm9vdE5vZGVJ RH1mdW5jdGlvbiBvKGUpe3JldHVybiJidXR0b24iPT09ZXx8ImlucHV0Ij09PWV8fCJzZWxlY3Qi PT09ZXx8InRleHRhcmVhIj09PWV9dmFyIGk9ZSgxMTMpLGE9ZSgxMjIpLHM9ZSgxOSksdT1lKDMz KSxsPWUoNzYpLGM9ZSg3NykscD1lKDgwKSxkPWUoODEpLGY9ZSg4MyksaD1lKDg0KSxtPWUoNzkp LHY9ZSg4NSksZz1lKDg2KSx5PWUoODcpLF89ZSg4OCksQz1lKDEyOSksYj1lKDk5KSxFPShlKDEz Nykse30pLHg9e307WyJhYm9ydCIsImFuaW1hdGlvbkVuZCIsImFuaW1hdGlvbkl0ZXJhdGlvbiIs ImFuaW1hdGlvblN0YXJ0IiwiYmx1ciIsImNhblBsYXkiLCJjYW5QbGF5VGhyb3VnaCIsImNsaWNr IiwiY29udGV4dE1lbnUiLCJjb3B5IiwiY3V0IiwiZG91YmxlQ2xpY2siLCJkcmFnIiwiZHJhZ0Vu ZCIsImRyYWdFbnRlciIsImRyYWdFeGl0IiwiZHJhZ0xlYXZlIiwiZHJhZ092ZXIiLCJkcmFnU3Rh cnQiLCJkcm9wIiwiZHVyYXRpb25DaGFuZ2UiLCJlbXB0aWVkIiwiZW5jcnlwdGVkIiwiZW5kZWQi LCJlcnJvciIsImZvY3VzIiwiaW5wdXQiLCJpbnZhbGlkIiwia2V5RG93biIsImtleVByZXNzIiwi a2V5VXAiLCJsb2FkIiwibG9hZGVkRGF0YSIsImxvYWRlZE1ldGFkYXRhIiwibG9hZFN0YXJ0Iiwi bW91c2VEb3duIiwibW91c2VNb3ZlIiwibW91c2VPdXQiLCJtb3VzZU92ZXIiLCJtb3VzZVVwIiwi cGFzdGUiLCJwYXVzZSIsInBsYXkiLCJwbGF5aW5nIiwicHJvZ3Jlc3MiLCJyYXRlQ2hhbmdlIiwi cmVzZXQiLCJzY3JvbGwiLCJzZWVrZWQiLCJzZWVraW5nIiwic3RhbGxlZCIsInN1Ym1pdCIsInN1 c3BlbmQiLCJ0aW1lVXBkYXRlIiwidG91Y2hDYW5jZWwiLCJ0b3VjaEVuZCIsInRvdWNoTW92ZSIs InRvdWNoU3RhcnQiLCJ0cmFuc2l0aW9uRW5kIiwidm9sdW1lQ2hhbmdlIiwid2FpdGluZyIsIndo ZWVsIl0uZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGlj ZSgxKSxuPSJvbiIrdCxyPSJ0b3AiK3Qsbz17cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJs ZWQ6bixjYXB0dXJlZDpuKyJDYXB0dXJlIn0sZGVwZW5kZW5jaWVzOltyXX07RVtlXT1vLHhbcl09 b30pO3ZhciB3PXt9LFQ9e2V2ZW50VHlwZXM6RSxleHRyYWN0RXZlbnRzOmZ1bmN0aW9uKGUsdCxu LHIpe3ZhciBvPXhbZV07aWYoIW8pcmV0dXJuIG51bGw7dmFyIGE7c3dpdGNoKGUpe2Nhc2UidG9w QWJvcnQiOmNhc2UidG9wQ2FuUGxheSI6Y2FzZSJ0b3BDYW5QbGF5VGhyb3VnaCI6Y2FzZSJ0b3BE dXJhdGlvbkNoYW5nZSI6Y2FzZSJ0b3BFbXB0aWVkIjpjYXNlInRvcEVuY3J5cHRlZCI6Y2FzZSJ0 b3BFbmRlZCI6Y2FzZSJ0b3BFcnJvciI6Y2FzZSJ0b3BJbnB1dCI6Y2FzZSJ0b3BJbnZhbGlkIjpj YXNlInRvcExvYWQiOmNhc2UidG9wTG9hZGVkRGF0YSI6Y2FzZSJ0b3BMb2FkZWRNZXRhZGF0YSI6 Y2FzZSJ0b3BMb2FkU3RhcnQiOmNhc2UidG9wUGF1c2UiOmNhc2UidG9wUGxheSI6Y2FzZSJ0b3BQ bGF5aW5nIjpjYXNlInRvcFByb2dyZXNzIjpjYXNlInRvcFJhdGVDaGFuZ2UiOmNhc2UidG9wUmVz ZXQiOmNhc2UidG9wU2Vla2VkIjpjYXNlInRvcFNlZWtpbmciOmNhc2UidG9wU3RhbGxlZCI6Y2Fz ZSJ0b3BTdWJtaXQiOmNhc2UidG9wU3VzcGVuZCI6Y2FzZSJ0b3BUaW1lVXBkYXRlIjpjYXNlInRv cFZvbHVtZUNoYW5nZSI6Y2FzZSJ0b3BXYWl0aW5nIjphPXA7YnJlYWs7Y2FzZSJ0b3BLZXlQcmVz cyI6aWYoMD09PWIobikpcmV0dXJuIG51bGw7Y2FzZSJ0b3BLZXlEb3duIjpjYXNlInRvcEtleVVw IjphPWY7YnJlYWs7Y2FzZSJ0b3BCbHVyIjpjYXNlInRvcEZvY3VzIjphPWQ7YnJlYWs7Y2FzZSJ0 b3BDbGljayI6aWYoMj09PW4uYnV0dG9uKXJldHVybiBudWxsO2Nhc2UidG9wRG91YmxlQ2xpY2si OmNhc2UidG9wTW91c2VEb3duIjpjYXNlInRvcE1vdXNlTW92ZSI6Y2FzZSJ0b3BNb3VzZVVwIjpj YXNlInRvcE1vdXNlT3V0IjpjYXNlInRvcE1vdXNlT3ZlciI6Y2FzZSJ0b3BDb250ZXh0TWVudSI6 YT1oO2JyZWFrO2Nhc2UidG9wRHJhZyI6Y2FzZSJ0b3BEcmFnRW5kIjpjYXNlInRvcERyYWdFbnRl ciI6Y2FzZSJ0b3BEcmFnRXhpdCI6Y2FzZSJ0b3BEcmFnTGVhdmUiOmNhc2UidG9wRHJhZ092ZXIi OmNhc2UidG9wRHJhZ1N0YXJ0IjpjYXNlInRvcERyb3AiOmE9bTticmVhaztjYXNlInRvcFRvdWNo Q2FuY2VsIjpjYXNlInRvcFRvdWNoRW5kIjpjYXNlInRvcFRvdWNoTW92ZSI6Y2FzZSJ0b3BUb3Vj aFN0YXJ0IjphPXY7YnJlYWs7Y2FzZSJ0b3BBbmltYXRpb25FbmQiOmNhc2UidG9wQW5pbWF0aW9u SXRlcmF0aW9uIjpjYXNlInRvcEFuaW1hdGlvblN0YXJ0IjphPWw7YnJlYWs7Y2FzZSJ0b3BUcmFu c2l0aW9uRW5kIjphPWc7YnJlYWs7Y2FzZSJ0b3BTY3JvbGwiOmE9eTticmVhaztjYXNlInRvcFdo ZWVsIjphPV87YnJlYWs7Y2FzZSJ0b3BDb3B5IjpjYXNlInRvcEN1dCI6Y2FzZSJ0b3BQYXN0ZSI6 YT1jfWE/dm9pZCAwOmkoIjg2IixlKTt2YXIgdT1hLmdldFBvb2xlZChvLHQsbixyKTtyZXR1cm4g cy5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKHUpLHV9LGRpZFB1dExpc3RlbmVyOmZ1bmN0 aW9uKGUsdCxuKXtpZigib25DbGljayI9PT10JiYhbyhlLl90YWcpKXt2YXIgaT1yKGUpLHM9dS5n ZXROb2RlRnJvbUluc3RhbmNlKGUpO3dbaV18fCh3W2ldPWEubGlzdGVuKHMsImNsaWNrIixDKSl9 fSx3aWxsRGVsZXRlTGlzdGVuZXI6ZnVuY3Rpb24oZSx0KXtpZigib25DbGljayI9PT10JiYhbyhl Ll90YWcpKXt2YXIgbj1yKGUpO3dbbl0ucmVtb3ZlKCksZGVsZXRlIHdbbl19fX07dC5leHBvcnRz PVR9LHsxMTM6MTEzLDEyMjoxMjIsMTI5OjEyOSwxMzc6MTM3LDE5OjE5LDMzOjMzLDc2Ojc2LDc3 Ojc3LDc5Ojc5LDgwOjgwLDgxOjgxLDgzOjgzLDg0Ojg0LDg1Ojg1LDg2Ojg2LDg3Ojg3LDg4Ojg4 LDk5Ojk5fV0sNzY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQs bixyKXtyZXR1cm4gby5jYWxsKHRoaXMsZSx0LG4scil9dmFyIG89ZSg4MCksaT17YW5pbWF0aW9u TmFtZTpudWxsLGVsYXBzZWRUaW1lOm51bGwscHNldWRvRWxlbWVudDpudWxsfTtvLmF1Z21lbnRD bGFzcyhyLGkpLHQuZXhwb3J0cz1yfSx7ODA6ODB9XSw3NzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ug c3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12 YXIgbz1lKDgwKSxpPXtjbGlwYm9hcmREYXRhOmZ1bmN0aW9uKGUpe3JldHVybiJjbGlwYm9hcmRE YXRhImluIGU/ZS5jbGlwYm9hcmREYXRhOndpbmRvdy5jbGlwYm9hcmREYXRhfX07by5hdWdtZW50 Q2xhc3MocixpKSx0LmV4cG9ydHM9cn0sezgwOjgwfV0sNzg6W2Z1bmN0aW9uKGUsdCxuKXsidXNl IHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbixyKXtyZXR1cm4gby5jYWxsKHRoaXMsZSx0LG4scil9 dmFyIG89ZSg4MCksaT17ZGF0YTpudWxsfTtvLmF1Z21lbnRDbGFzcyhyLGkpLHQuZXhwb3J0cz1y fSx7ODA6ODB9XSw3OTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUs dCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDg0KSxpPXtkYXRhVHJh bnNmZXI6bnVsbH07by5hdWdtZW50Q2xhc3MocixpKSx0LmV4cG9ydHM9cn0sezg0Ojg0fV0sODA6 W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbixyKXt0aGlzLmRp c3BhdGNoQ29uZmlnPWUsdGhpcy5fdGFyZ2V0SW5zdD10LHRoaXMubmF0aXZlRXZlbnQ9bjt2YXIg bz10aGlzLmNvbnN0cnVjdG9yLkludGVyZmFjZTtmb3IodmFyIGkgaW4gbylpZihvLmhhc093blBy b3BlcnR5KGkpKXt2YXIgcz1vW2ldO3M/dGhpc1tpXT1zKG4pOiJ0YXJnZXQiPT09aT90aGlzLnRh cmdldD1yOnRoaXNbaV09bltpXX12YXIgdT1udWxsIT1uLmRlZmF1bHRQcmV2ZW50ZWQ/bi5kZWZh dWx0UHJldmVudGVkOm4ucmV0dXJuVmFsdWU9PT0hMTtyZXR1cm4gdT90aGlzLmlzRGVmYXVsdFBy ZXZlbnRlZD1hLnRoYXRSZXR1cm5zVHJ1ZTp0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1hLnRoYXRS ZXR1cm5zRmFsc2UsdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1hLnRoYXRSZXR1cm5zRmFsc2Us dGhpc312YXIgbz1lKDE0MyksaT1lKDI0KSxhPWUoMTI5KSxzPShlKDE0MiksImZ1bmN0aW9uIj09 dHlwZW9mIFByb3h5LFsiZGlzcGF0Y2hDb25maWciLCJfdGFyZ2V0SW5zdCIsIm5hdGl2ZUV2ZW50 IiwiaXNEZWZhdWx0UHJldmVudGVkIiwiaXNQcm9wYWdhdGlvblN0b3BwZWQiLCJfZGlzcGF0Y2hM aXN0ZW5lcnMiLCJfZGlzcGF0Y2hJbnN0YW5jZXMiXSksdT17dHlwZTpudWxsLHRhcmdldDpudWxs LGN1cnJlbnRUYXJnZXQ6YS50aGF0UmV0dXJuc051bGwsZXZlbnRQaGFzZTpudWxsLGJ1YmJsZXM6 bnVsbCxjYW5jZWxhYmxlOm51bGwsdGltZVN0YW1wOmZ1bmN0aW9uKGUpe3JldHVybiBlLnRpbWVT dGFtcHx8RGF0ZS5ub3coKX0sZGVmYXVsdFByZXZlbnRlZDpudWxsLGlzVHJ1c3RlZDpudWxsfTtv KHIucHJvdG90eXBlLHtwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZl bnRlZD0hMDt2YXIgZT10aGlzLm5hdGl2ZUV2ZW50O2UmJihlLnByZXZlbnREZWZhdWx0P2UucHJl dmVudERlZmF1bHQoKToidW5rbm93biIhPXR5cGVvZiBlLnJldHVyblZhbHVlJiYoZS5yZXR1cm5W YWx1ZT0hMSksdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9YS50aGF0UmV0dXJuc1RydWUpfSxzdG9w UHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm5hdGl2ZUV2ZW50O2UmJihlLnN0b3BQ cm9wYWdhdGlvbj9lLnN0b3BQcm9wYWdhdGlvbigpOiJ1bmtub3duIiE9dHlwZW9mIGUuY2FuY2Vs QnViYmxlJiYoZS5jYW5jZWxCdWJibGU9ITApLHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9YS50 aGF0UmV0dXJuc1RydWUpfSxwZXJzaXN0OmZ1bmN0aW9uKCl7dGhpcy5pc1BlcnNpc3RlbnQ9YS50 aGF0UmV0dXJuc1RydWV9LGlzUGVyc2lzdGVudDphLnRoYXRSZXR1cm5zRmFsc2UsZGVzdHJ1Y3Rv cjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuY29uc3RydWN0b3IuSW50ZXJmYWNlO2Zvcih2YXIgdCBp biBlKXRoaXNbdF09bnVsbDtmb3IodmFyIG49MDtuPHMubGVuZ3RoO24rKyl0aGlzW3Nbbl1dPW51 bGx9fSksci5JbnRlcmZhY2U9dSxyLmF1Z21lbnRDbGFzcz1mdW5jdGlvbihlLHQpe3ZhciBuPXRo aXMscj1mdW5jdGlvbigpe307ci5wcm90b3R5cGU9bi5wcm90b3R5cGU7dmFyIGE9bmV3IHI7byhh LGUucHJvdG90eXBlKSxlLnByb3RvdHlwZT1hLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5J bnRlcmZhY2U9byh7fSxuLkludGVyZmFjZSx0KSxlLmF1Z21lbnRDbGFzcz1uLmF1Z21lbnRDbGFz cyxpLmFkZFBvb2xpbmdUbyhlLGkuZm91ckFyZ3VtZW50UG9vbGVyKX0saS5hZGRQb29saW5nVG8o cixpLmZvdXJBcmd1bWVudFBvb2xlciksdC5leHBvcnRzPXJ9LHsxMjk6MTI5LDE0MjoxNDIsMTQz OjE0MywyNDoyNH1dLDgxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIo ZSx0LG4scil7cmV0dXJuIG8uY2FsbCh0aGlzLGUsdCxuLHIpfXZhciBvPWUoODcpLGk9e3JlbGF0 ZWRUYXJnZXQ6bnVsbH07by5hdWdtZW50Q2xhc3MocixpKSx0LmV4cG9ydHM9cn0sezg3Ojg3fV0s ODI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbixyKXtyZXR1 cm4gby5jYWxsKHRoaXMsZSx0LG4scil9dmFyIG89ZSg4MCksaT17ZGF0YTpudWxsfTtvLmF1Z21l bnRDbGFzcyhyLGkpLHQuZXhwb3J0cz1yfSx7ODA6ODB9XSw4MzpbZnVuY3Rpb24oZSx0LG4peyJ1 c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixy KX12YXIgbz1lKDg3KSxpPWUoOTkpLGE9ZSgxMDApLHM9ZSgxMDEpLHU9e2tleTphLGxvY2F0aW9u Om51bGwsY3RybEtleTpudWxsLHNoaWZ0S2V5Om51bGwsYWx0S2V5Om51bGwsbWV0YUtleTpudWxs LHJlcGVhdDpudWxsLGxvY2FsZTpudWxsLGdldE1vZGlmaWVyU3RhdGU6cyxjaGFyQ29kZTpmdW5j dGlvbihlKXtyZXR1cm4ia2V5cHJlc3MiPT09ZS50eXBlP2koZSk6MH0sa2V5Q29kZTpmdW5jdGlv bihlKXtyZXR1cm4ia2V5ZG93biI9PT1lLnR5cGV8fCJrZXl1cCI9PT1lLnR5cGU/ZS5rZXlDb2Rl OjB9LHdoaWNoOmZ1bmN0aW9uKGUpe3JldHVybiJrZXlwcmVzcyI9PT1lLnR5cGU/aShlKToia2V5 ZG93biI9PT1lLnR5cGV8fCJrZXl1cCI9PT1lLnR5cGU/ZS5rZXlDb2RlOjB9fTtvLmF1Z21lbnRD bGFzcyhyLHUpLHQuZXhwb3J0cz1yfSx7MTAwOjEwMCwxMDE6MTAxLDg3Ojg3LDk5Ojk5fV0sODQ6 W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbixyKXtyZXR1cm4g by5jYWxsKHRoaXMsZSx0LG4scil9dmFyIG89ZSg4NyksaT1lKDkwKSxhPWUoMTAxKSxzPXtzY3Jl ZW5YOm51bGwsc2NyZWVuWTpudWxsLGNsaWVudFg6bnVsbCxjbGllbnRZOm51bGwsY3RybEtleTpu dWxsLHNoaWZ0S2V5Om51bGwsYWx0S2V5Om51bGwsbWV0YUtleTpudWxsLGdldE1vZGlmaWVyU3Rh dGU6YSxidXR0b246ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5idXR0b247cmV0dXJuIndoaWNoImluIGU/ dDoyPT09dD8yOjQ9PT10PzE6MH0sYnV0dG9uczpudWxsLHJlbGF0ZWRUYXJnZXQ6ZnVuY3Rpb24o ZSl7cmV0dXJuIGUucmVsYXRlZFRhcmdldHx8KGUuZnJvbUVsZW1lbnQ9PT1lLnNyY0VsZW1lbnQ/ ZS50b0VsZW1lbnQ6ZS5mcm9tRWxlbWVudCl9LHBhZ2VYOmZ1bmN0aW9uKGUpe3JldHVybiJwYWdl WCJpbiBlP2UucGFnZVg6ZS5jbGllbnRYK2kuY3VycmVudFNjcm9sbExlZnR9LHBhZ2VZOmZ1bmN0 aW9uKGUpe3JldHVybiJwYWdlWSJpbiBlP2UucGFnZVk6ZS5jbGllbnRZK2kuY3VycmVudFNjcm9s bFRvcH19O28uYXVnbWVudENsYXNzKHIscyksdC5leHBvcnRzPXJ9LHsxMDE6MTAxLDg3Ojg3LDkw OjkwfV0sODU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbixy KXtyZXR1cm4gby5jYWxsKHRoaXMsZSx0LG4scil9dmFyIG89ZSg4NyksaT1lKDEwMSksYT17dG91 Y2hlczpudWxsLHRhcmdldFRvdWNoZXM6bnVsbCxjaGFuZ2VkVG91Y2hlczpudWxsLGFsdEtleTpu dWxsLG1ldGFLZXk6bnVsbCxjdHJsS2V5Om51bGwsc2hpZnRLZXk6bnVsbCxnZXRNb2RpZmllclN0 YXRlOml9O28uYXVnbWVudENsYXNzKHIsYSksdC5leHBvcnRzPXJ9LHsxMDE6MTAxLDg3Ojg3fV0s ODY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbixyKXtyZXR1 cm4gby5jYWxsKHRoaXMsZSx0LG4scil9dmFyIG89ZSg4MCksaT17cHJvcGVydHlOYW1lOm51bGws ZWxhcHNlZFRpbWU6bnVsbCxwc2V1ZG9FbGVtZW50Om51bGx9O28uYXVnbWVudENsYXNzKHIsaSks dC5leHBvcnRzPXJ9LHs4MDo4MH1dLDg3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1 bmN0aW9uIHIoZSx0LG4scil7cmV0dXJuIG8uY2FsbCh0aGlzLGUsdCxuLHIpfXZhciBvPWUoODAp LGk9ZSgxMDIpLGE9e3ZpZXc6ZnVuY3Rpb24oZSl7aWYoZS52aWV3KXJldHVybiBlLnZpZXc7dmFy IHQ9aShlKTtpZih0LndpbmRvdz09PXQpcmV0dXJuIHQ7dmFyIG49dC5vd25lckRvY3VtZW50O3Jl dHVybiBuP24uZGVmYXVsdFZpZXd8fG4ucGFyZW50V2luZG93OndpbmRvd30sZGV0YWlsOmZ1bmN0 aW9uKGUpe3JldHVybiBlLmRldGFpbHx8MH19O28uYXVnbWVudENsYXNzKHIsYSksdC5leHBvcnRz PXJ9LHsxMDI6MTAyLDgwOjgwfV0sODg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVu Y3Rpb24gcihlLHQsbixyKXtyZXR1cm4gby5jYWxsKHRoaXMsZSx0LG4scil9dmFyIG89ZSg4NCks aT17ZGVsdGFYOmZ1bmN0aW9uKGUpe3JldHVybiJkZWx0YVgiaW4gZT9lLmRlbHRhWDoid2hlZWxE ZWx0YVgiaW4gZT8tZS53aGVlbERlbHRhWDowfSxkZWx0YVk6ZnVuY3Rpb24oZSl7cmV0dXJuImRl bHRhWSJpbiBlP2UuZGVsdGFZOiJ3aGVlbERlbHRhWSJpbiBlPy1lLndoZWVsRGVsdGFZOiJ3aGVl bERlbHRhImluIGU/LWUud2hlZWxEZWx0YTowfSxkZWx0YVo6bnVsbCxkZWx0YU1vZGU6bnVsbH07 by5hdWdtZW50Q2xhc3MocixpKSx0LmV4cG9ydHM9cn0sezg0Ojg0fV0sODk6W2Z1bmN0aW9uKGUs dCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxMTMpLG89KGUoMTM3KSx7fSksaT17cmVpbml0aWFs aXplVHJhbnNhY3Rpb246ZnVuY3Rpb24oKXt0aGlzLnRyYW5zYWN0aW9uV3JhcHBlcnM9dGhpcy5n ZXRUcmFuc2FjdGlvbldyYXBwZXJzKCksdGhpcy53cmFwcGVySW5pdERhdGE/dGhpcy53cmFwcGVy SW5pdERhdGEubGVuZ3RoPTA6dGhpcy53cmFwcGVySW5pdERhdGE9W10sdGhpcy5faXNJblRyYW5z YWN0aW9uPSExfSxfaXNJblRyYW5zYWN0aW9uOiExLGdldFRyYW5zYWN0aW9uV3JhcHBlcnM6bnVs bCxpc0luVHJhbnNhY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuX2lzSW5UcmFuc2FjdGlv bn0scGVyZm9ybTpmdW5jdGlvbihlLHQsbixvLGksYSxzLHUpe3RoaXMuaXNJblRyYW5zYWN0aW9u KCk/cigiMjciKTp2b2lkIDA7dmFyIGwsYzt0cnl7dGhpcy5faXNJblRyYW5zYWN0aW9uPSEwLGw9 ITAsdGhpcy5pbml0aWFsaXplQWxsKDApLGM9ZS5jYWxsKHQsbixvLGksYSxzLHUpLGw9ITF9Zmlu YWxseXt0cnl7aWYobCl0cnl7dGhpcy5jbG9zZUFsbCgwKX1jYXRjaChlKXt9ZWxzZSB0aGlzLmNs b3NlQWxsKDApfWZpbmFsbHl7dGhpcy5faXNJblRyYW5zYWN0aW9uPSExfX1yZXR1cm4gY30saW5p dGlhbGl6ZUFsbDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy50cmFuc2FjdGlvbldyYXBwZXJz LG49ZTtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTt0cnl7dGhpcy53cmFwcGVySW5pdERhdGFb bl09byx0aGlzLndyYXBwZXJJbml0RGF0YVtuXT1yLmluaXRpYWxpemU/ci5pbml0aWFsaXplLmNh bGwodGhpcyk6bnVsbH1maW5hbGx5e2lmKHRoaXMud3JhcHBlckluaXREYXRhW25dPT09byl0cnl7 dGhpcy5pbml0aWFsaXplQWxsKG4rMSl9Y2F0Y2goZSl7fX19fSxjbG9zZUFsbDpmdW5jdGlvbihl KXt0aGlzLmlzSW5UcmFuc2FjdGlvbigpP3ZvaWQgMDpyKCIyOCIpO2Zvcih2YXIgdD10aGlzLnRy YW5zYWN0aW9uV3JhcHBlcnMsbj1lO248dC5sZW5ndGg7bisrKXt2YXIgaSxhPXRbbl0scz10aGlz LndyYXBwZXJJbml0RGF0YVtuXTt0cnl7aT0hMCxzIT09byYmYS5jbG9zZSYmYS5jbG9zZS5jYWxs KHRoaXMscyksaT0hMX1maW5hbGx5e2lmKGkpdHJ5e3RoaXMuY2xvc2VBbGwobisxKX1jYXRjaChl KXt9fX10aGlzLndyYXBwZXJJbml0RGF0YS5sZW5ndGg9MH19O3QuZXhwb3J0cz1pfSx7MTEzOjEx MywxMzc6MTM3fV0sOTA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9e2N1cnJl bnRTY3JvbGxMZWZ0OjAsY3VycmVudFNjcm9sbFRvcDowLHJlZnJlc2hTY3JvbGxWYWx1ZXM6ZnVu Y3Rpb24oZSl7ci5jdXJyZW50U2Nyb2xsTGVmdD1lLngsci5jdXJyZW50U2Nyb2xsVG9wPWUueX19 O3QuZXhwb3J0cz1yfSx7fV0sOTE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rp b24gcihlLHQpe3JldHVybiBudWxsPT10P28oIjMwIik6dm9pZCAwLG51bGw9PWU/dDpBcnJheS5p c0FycmF5KGUpP0FycmF5LmlzQXJyYXkodCk/KGUucHVzaC5hcHBseShlLHQpLGUpOihlLnB1c2go dCksZSk6QXJyYXkuaXNBcnJheSh0KT9bZV0uY29uY2F0KHQpOltlLHRdfXZhciBvPWUoMTEzKTtl KDEzNyk7dC5leHBvcnRzPXJ9LHsxMTM6MTEzLDEzNzoxMzd9XSw5MjpbZnVuY3Rpb24oZSx0LG4p eyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe2Zvcih2YXIgdD0xLG49MCxyPTAsaT1lLmxlbmd0 aCxhPWkmLTQ7cjxhOyl7Zm9yKHZhciBzPU1hdGgubWluKHIrNDA5NixhKTtyPHM7cis9NCluKz0o dCs9ZS5jaGFyQ29kZUF0KHIpKSsodCs9ZS5jaGFyQ29kZUF0KHIrMSkpKyh0Kz1lLmNoYXJDb2Rl QXQocisyKSkrKHQrPWUuY2hhckNvZGVBdChyKzMpKTt0JT1vLG4lPW99Zm9yKDtyPGk7cisrKW4r PXQrPWUuY2hhckNvZGVBdChyKTtyZXR1cm4gdCU9byxuJT1vLHR8bjw8MTZ9dmFyIG89NjU1MjE7 dC5leHBvcnRzPXJ9LHt9XSw5MzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1m dW5jdGlvbihlKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIE1TQXBwJiZNU0FwcC5leGVjVW5z YWZlTG9jYWxGdW5jdGlvbj9mdW5jdGlvbih0LG4scixvKXtNU0FwcC5leGVjVW5zYWZlTG9jYWxG dW5jdGlvbihmdW5jdGlvbigpe3JldHVybiBlKHQsbixyLG8pfSl9OmV9O3QuZXhwb3J0cz1yfSx7 fV0sOTQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbil7dmFy IHI9bnVsbD09dHx8ImJvb2xlYW4iPT10eXBlb2YgdHx8IiI9PT10O2lmKHIpcmV0dXJuIiI7dmFy IG89aXNOYU4odCk7cmV0dXJuIG98fDA9PT10fHxpLmhhc093blByb3BlcnR5KGUpJiZpW2VdPyIi K3Q6KCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dC50cmltKCkpLHQrInB4Iil9dmFyIG89ZSg0KSxp PShlKDE0Miksby5pc1VuaXRsZXNzTnVtYmVyKTt0LmV4cG9ydHM9cn0sezE0MjoxNDIsNDo0fV0s OTU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt2YXIgdD0iIitl LG49aS5leGVjKHQpO2lmKCFuKXJldHVybiB0O3ZhciByLG89IiIsYT0wLHM9MDtmb3IoYT1uLmlu ZGV4O2E8dC5sZW5ndGg7YSsrKXtzd2l0Y2godC5jaGFyQ29kZUF0KGEpKXtjYXNlIDM0OnI9IiZx dW90OyI7YnJlYWs7Y2FzZSAzODpyPSImYW1wOyI7YnJlYWs7Y2FzZSAzOTpyPSImI3gyNzsiO2Jy ZWFrO2Nhc2UgNjA6cj0iJmx0OyI7YnJlYWs7Y2FzZSA2MjpyPSImZ3Q7IjticmVhaztkZWZhdWx0 OmNvbnRpbnVlfXMhPT1hJiYobys9dC5zdWJzdHJpbmcocyxhKSkscz1hKzEsbys9cn1yZXR1cm4g cyE9PWE/byt0LnN1YnN0cmluZyhzLGEpOm99ZnVuY3Rpb24gbyhlKXtyZXR1cm4iYm9vbGVhbiI9 PXR5cGVvZiBlfHwibnVtYmVyIj09dHlwZW9mIGU/IiIrZTpyKGUpfXZhciBpPS9bIicmPD5dLzt0 LmV4cG9ydHM9b30se31dLDk2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9u IHIoZSl7aWYobnVsbD09ZSlyZXR1cm4gbnVsbDtpZigxPT09ZS5ub2RlVHlwZSlyZXR1cm4gZTt2 YXIgdD1hLmdldChlKTtyZXR1cm4gdD8odD1zKHQpLHQ/aS5nZXROb2RlRnJvbUluc3RhbmNlKHQp Om51bGwpOnZvaWQoImZ1bmN0aW9uIj09dHlwZW9mIGUucmVuZGVyP28oIjQ0Iik6bygiNDUiLE9i amVjdC5rZXlzKGUpKSl9dmFyIG89ZSgxMTMpLGk9KGUoMTIwKSxlKDMzKSksYT1lKDU3KSxzPWUo MTAzKTtlKDEzNyksZSgxNDIpO3QuZXhwb3J0cz1yfSx7MTAzOjEwMywxMTM6MTEzLDEyMDoxMjAs MTM3OjEzNywxNDI6MTQyLDMzOjMzLDU3OjU3fV0sOTc6W2Z1bmN0aW9uKGUsdCxuKXsoZnVuY3Rp b24obil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4scil7aWYoZSYmIm9iamVjdCI9PXR5 cGVvZiBlKXt2YXIgbz1lLGk9dm9pZCAwPT09b1tuXTtpJiZudWxsIT10JiYob1tuXT10KX19ZnVu Y3Rpb24gbyhlLHQpe2lmKG51bGw9PWUpcmV0dXJuIGU7dmFyIG49e307cmV0dXJuIGkoZSxyLG4p LG59dmFyIGk9KGUoMjIpLGUoMTE4KSk7ZSgxNDIpOyJ1bmRlZmluZWQiIT10eXBlb2YgbiYmbi5l bnYsdC5leHBvcnRzPW99KS5jYWxsKHRoaXMsdm9pZCAwKX0sezExODoxMTgsMTQyOjE0MiwyMjoy Mn1dLDk4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4pe0Fy cmF5LmlzQXJyYXkoZSk/ZS5mb3JFYWNoKHQsbik6ZSYmdC5jYWxsKG4sZSl9dC5leHBvcnRzPXJ9 LHt9XSw5OTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3ZhciB0 LG49ZS5rZXlDb2RlO3JldHVybiJjaGFyQ29kZSJpbiBlPyh0PWUuY2hhckNvZGUsMD09PXQmJjEz PT09biYmKHQ9MTMpKTp0PW4sdD49MzJ8fDEzPT09dD90OjB9dC5leHBvcnRzPXJ9LHt9XSwxMDA6 W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtpZihlLmtleSl7dmFy IHQ9aVtlLmtleV18fGUua2V5O2lmKCJVbmlkZW50aWZpZWQiIT09dClyZXR1cm4gdH1pZigia2V5 cHJlc3MiPT09ZS50eXBlKXt2YXIgbj1vKGUpO3JldHVybiAxMz09PW4/IkVudGVyIjpTdHJpbmcu ZnJvbUNoYXJDb2RlKG4pfXJldHVybiJrZXlkb3duIj09PWUudHlwZXx8ImtleXVwIj09PWUudHlw ZT9hW2Uua2V5Q29kZV18fCJVbmlkZW50aWZpZWQiOiIifXZhciBvPWUoOTkpLGk9e0VzYzoiRXNj YXBlIixTcGFjZWJhcjoiICIsTGVmdDoiQXJyb3dMZWZ0IixVcDoiQXJyb3dVcCIsUmlnaHQ6IkFy cm93UmlnaHQiLERvd246IkFycm93RG93biIsRGVsOiJEZWxldGUiLFdpbjoiT1MiLE1lbnU6IkNv bnRleHRNZW51IixBcHBzOiJDb250ZXh0TWVudSIsU2Nyb2xsOiJTY3JvbGxMb2NrIixNb3pQcmlu dGFibGVLZXk6IlVuaWRlbnRpZmllZCJ9LGE9ezg6IkJhY2tzcGFjZSIsOToiVGFiIiwxMjoiQ2xl YXIiLDEzOiJFbnRlciIsMTY6IlNoaWZ0IiwxNzoiQ29udHJvbCIsMTg6IkFsdCIsMTk6IlBhdXNl IiwyMDoiQ2Fwc0xvY2siLDI3OiJFc2NhcGUiLDMyOiIgIiwzMzoiUGFnZVVwIiwzNDoiUGFnZURv d24iLDM1OiJFbmQiLDM2OiJIb21lIiwzNzoiQXJyb3dMZWZ0IiwzODoiQXJyb3dVcCIsMzk6IkFy cm93UmlnaHQiLDQwOiJBcnJvd0Rvd24iLDQ1OiJJbnNlcnQiLDQ2OiJEZWxldGUiLDExMjoiRjEi LDExMzoiRjIiLDExNDoiRjMiLDExNToiRjQiLDExNjoiRjUiLDExNzoiRjYiLDExODoiRjciLDEx OToiRjgiLDEyMDoiRjkiLDEyMToiRjEwIiwxMjI6IkYxMSIsMTIzOiJGMTIiLDE0NDoiTnVtTG9j ayIsMTQ1OiJTY3JvbGxMb2NrIiwyMjQ6Ik1ldGEifTt0LmV4cG9ydHM9cn0sezk5Ojk5fV0sMTAx OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dmFyIHQ9dGhpcyxu PXQubmF0aXZlRXZlbnQ7aWYobi5nZXRNb2RpZmllclN0YXRlKXJldHVybiBuLmdldE1vZGlmaWVy U3RhdGUoZSk7dmFyIHI9aVtlXTtyZXR1cm4hIXImJiEhbltyXX1mdW5jdGlvbiBvKGUpe3JldHVy biByfXZhciBpPXtBbHQ6ImFsdEtleSIsQ29udHJvbDoiY3RybEtleSIsTWV0YToibWV0YUtleSIs U2hpZnQ6InNoaWZ0S2V5In07dC5leHBvcnRzPW99LHt9XSwxMDI6W2Z1bmN0aW9uKGUsdCxuKXsi dXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt2YXIgdD1lLnRhcmdldHx8ZS5zcmNFbGVtZW50fHx3 aW5kb3c7cmV0dXJuIHQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQmJih0PXQuY29ycmVzcG9uZGlu Z1VzZUVsZW1lbnQpLDM9PT10Lm5vZGVUeXBlP3QucGFyZW50Tm9kZTp0fXQuZXhwb3J0cz1yfSx7 fV0sMTAzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7Zm9yKHZh ciB0Oyh0PWUuX3JlbmRlcmVkTm9kZVR5cGUpPT09by5DT01QT1NJVEU7KWU9ZS5fcmVuZGVyZWRD b21wb25lbnQ7cmV0dXJuIHQ9PT1vLkhPU1Q/ZS5fcmVuZGVyZWRDb21wb25lbnQ6dD09PW8uRU1Q VFk/bnVsbDp2b2lkIDB9dmFyIG89ZSg2Mik7dC5leHBvcnRzPXJ9LHs2Mjo2Mn1dLDEwNDpbZnVu Y3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3ZhciB0PWUmJihvJiZlW29d fHxlW2ldKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdClyZXR1cm4gdH12YXIgbz0iZnVuY3Rpb24i PT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3IsaT0iQEBpdGVyYXRvciI7dC5leHBvcnRz PXJ9LHt9XSwxMDU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcigpe3Jl dHVybiBvKyt9dmFyIG89MTt0LmV4cG9ydHM9cn0se31dLDEwNjpbZnVuY3Rpb24oZSx0LG4peyJ1 c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe2Zvcig7ZSYmZS5maXJzdENoaWxkOyllPWUuZmlyc3RD aGlsZDtyZXR1cm4gZX1mdW5jdGlvbiBvKGUpe2Zvcig7ZTspe2lmKGUubmV4dFNpYmxpbmcpcmV0 dXJuIGUubmV4dFNpYmxpbmc7ZT1lLnBhcmVudE5vZGV9fWZ1bmN0aW9uIGkoZSx0KXtmb3IodmFy IG49cihlKSxpPTAsYT0wO247KXtpZigzPT09bi5ub2RlVHlwZSl7aWYoYT1pK24udGV4dENvbnRl bnQubGVuZ3RoLGk8PXQmJmE+PXQpcmV0dXJue25vZGU6bixvZmZzZXQ6dC1pfTtpPWF9bj1yKG8o bikpfX10LmV4cG9ydHM9aX0se31dLDEwNzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijtm dW5jdGlvbiByKCl7cmV0dXJuIWkmJm8uY2FuVXNlRE9NJiYoaT0idGV4dENvbnRlbnQiaW4gZG9j dW1lbnQuZG9jdW1lbnRFbGVtZW50PyJ0ZXh0Q29udGVudCI6ImlubmVyVGV4dCIpLGl9dmFyIG89 ZSgxMjMpLGk9bnVsbDt0LmV4cG9ydHM9cn0sezEyMzoxMjN9XSwxMDg6W2Z1bmN0aW9uKGUsdCxu KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3ZhciBuPXt9O3JldHVybiBuW2UudG9Mb3dl ckNhc2UoKV09dC50b0xvd2VyQ2FzZSgpLG5bIldlYmtpdCIrZV09IndlYmtpdCIrdCxuWyJNb3oi K2VdPSJtb3oiK3QsblsibXMiK2VdPSJNUyIrdCxuWyJPIitlXT0ibyIrdC50b0xvd2VyQ2FzZSgp LG59ZnVuY3Rpb24gbyhlKXtpZihzW2VdKXJldHVybiBzW2VdO2lmKCFhW2VdKXJldHVybiBlO3Zh ciB0PWFbZV07Zm9yKHZhciBuIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShuKSYmbiBpbiB1KXJl dHVybiBzW2VdPXRbbl07cmV0dXJuIiJ9dmFyIGk9ZSgxMjMpLGE9e2FuaW1hdGlvbmVuZDpyKCJB bmltYXRpb24iLCJBbmltYXRpb25FbmQiKSxhbmltYXRpb25pdGVyYXRpb246cigiQW5pbWF0aW9u IiwiQW5pbWF0aW9uSXRlcmF0aW9uIiksYW5pbWF0aW9uc3RhcnQ6cigiQW5pbWF0aW9uIiwiQW5p bWF0aW9uU3RhcnQiKSx0cmFuc2l0aW9uZW5kOnIoIlRyYW5zaXRpb24iLCJUcmFuc2l0aW9uRW5k Iil9LHM9e30sdT17fTtpLmNhblVzZURPTSYmKHU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2 Iikuc3R5bGUsIkFuaW1hdGlvbkV2ZW50ImluIHdpbmRvd3x8KGRlbGV0ZSBhLmFuaW1hdGlvbmVu ZC5hbmltYXRpb24sZGVsZXRlIGEuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbixkZWxldGUg YS5hbmltYXRpb25zdGFydC5hbmltYXRpb24pLCJUcmFuc2l0aW9uRXZlbnQiaW4gd2luZG93fHxk ZWxldGUgYS50cmFuc2l0aW9uZW5kLnRyYW5zaXRpb24pLHQuZXhwb3J0cz1vfSx7MTIzOjEyM31d LDEwOTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe2lmKGUpe3Zh ciB0PWUuZ2V0TmFtZSgpO2lmKHQpcmV0dXJuIiBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBg Iit0KyJgLiJ9cmV0dXJuIiJ9ZnVuY3Rpb24gbyhlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Yg ZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBlLnByb3RvdHlwZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUu cHJvdG90eXBlLm1vdW50Q29tcG9uZW50JiYiZnVuY3Rpb24iPT10eXBlb2YgZS5wcm90b3R5cGUu cmVjZWl2ZUNvbXBvbmVudH1mdW5jdGlvbiBpKGUsdCl7dmFyIG47aWYobnVsbD09PWV8fGU9PT0h MSluPWwuY3JlYXRlKGkpO2Vsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiBlKXt2YXIgcz1lLHU9cy50 eXBlO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB1JiYic3RyaW5nIiE9dHlwZW9mIHUpe3ZhciBkPSIi O2QrPXIocy5fb3duZXIpLGEoIjEzMCIsbnVsbD09dT91OnR5cGVvZiB1LGQpfSJzdHJpbmciPT10 eXBlb2Ygcy50eXBlP249Yy5jcmVhdGVJbnRlcm5hbENvbXBvbmVudChzKTpvKHMudHlwZSk/KG49 bmV3IHMudHlwZShzKSxuLmdldEhvc3ROb2RlfHwobi5nZXRIb3N0Tm9kZT1uLmdldE5hdGl2ZU5v ZGUpKTpuPW5ldyBwKHMpfWVsc2Uic3RyaW5nIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2Yg ZT9uPWMuY3JlYXRlSW5zdGFuY2VGb3JUZXh0KGUpOmEoIjEzMSIsdHlwZW9mIGUpO3JldHVybiBu Ll9tb3VudEluZGV4PTAsbi5fbW91bnRJbWFnZT1udWxsLG59dmFyIGE9ZSgxMTMpLHM9ZSgxNDMp LHU9ZSgyOSksbD1lKDQ5KSxjPWUoNTQpLHA9KGUoMTA1KSxlKDEzNyksZSgxNDIpLGZ1bmN0aW9u KGUpe3RoaXMuY29uc3RydWN0KGUpfSk7cyhwLnByb3RvdHlwZSx1LHtfaW5zdGFudGlhdGVSZWFj dENvbXBvbmVudDppfSksdC5leHBvcnRzPWl9LHsxMDU6MTA1LDExMzoxMTMsMTM3OjEzNywxNDI6 MTQyLDE0MzoxNDMsMjk6MjksNDk6NDksNTQ6NTR9XSwxMTA6W2Z1bmN0aW9uKGUsdCxuKXsidXNl IHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe2lmKCFpLmNhblVzZURPTXx8dCYmISgiYWRkRXZlbnRM aXN0ZW5lciJpbiBkb2N1bWVudCkpcmV0dXJuITE7dmFyIG49Im9uIitlLHI9biBpbiBkb2N1bWVu dDtpZighcil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5zZXRBdHRyaWJ1 dGUobiwicmV0dXJuOyIpLHI9ImZ1bmN0aW9uIj09dHlwZW9mIGFbbl19cmV0dXJuIXImJm8mJiJ3 aGVlbCI9PT1lJiYocj1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCJFdmVudHMu d2hlZWwiLCIzLjAiKSkscn12YXIgbyxpPWUoMTIzKTtpLmNhblVzZURPTSYmKG89ZG9jdW1lbnQu aW1wbGVtZW50YXRpb24mJmRvY3VtZW50LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUmJmRvY3Vt ZW50LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoIiIsIiIpIT09ITApLHQuZXhwb3J0cz1yfSx7 MTIzOjEyM31dLDExMTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUp e3ZhciB0PWUmJmUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5w dXQiPT09dD8hIW9bZS50eXBlXToidGV4dGFyZWEiPT09dH12YXIgbz17Y29sb3I6ITAsZGF0ZToh MCxkYXRldGltZTohMCwiZGF0ZXRpbWUtbG9jYWwiOiEwLGVtYWlsOiEwLG1vbnRoOiEwLG51bWJl cjohMCxwYXNzd29yZDohMCxyYW5nZTohMCxzZWFyY2g6ITAsdGVsOiEwLHRleHQ6ITAsdGltZToh MCx1cmw6ITAsd2VlazohMH07dC5leHBvcnRzPXJ9LHt9XSwxMTI6W2Z1bmN0aW9uKGUsdCxuKXsi dXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4nIicrbyhlKSsnIid9dmFyIG89ZSg5NSk7 dC5leHBvcnRzPXJ9LHs5NTo5NX1dLDExMzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijtm dW5jdGlvbiByKGUpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLTEsbj0iTWluaWZpZWQgUmVh Y3QgZXJyb3IgIyIrZSsiOyB2aXNpdCBodHRwOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2Rv Y3MvZXJyb3ItZGVjb2Rlci5odG1sP2ludmFyaWFudD0iK2Uscj0wO3I8dDtyKyspbis9IiZhcmdz W109IitlbmNvZGVVUklDb21wb25lbnQoYXJndW1lbnRzW3IrMV0pO24rPSIgZm9yIHRoZSBmdWxs IG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxs IGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLiI7dmFyIG89bmV3IEVycm9y KG4pO3Rocm93IG8ubmFtZT0iSW52YXJpYW50IFZpb2xhdGlvbiIsby5mcmFtZXNUb1BvcD0xLG99 dC5leHBvcnRzPXJ9LHt9XSwxMTQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9 ZSg2MCk7dC5leHBvcnRzPXIucmVuZGVyU3VidHJlZUludG9Db250YWluZXJ9LHs2MDo2MH1dLDEx NTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcixvPWUoMTIzKSxpPWUoMTApLGE9 L15bIFxyXG5cdFxmXS8scz0vPCghLS18bGlua3xub3NjcmlwdHxtZXRhfHNjcmlwdHxzdHlsZSlb IFxyXG5cdFxmXC8+XS8sdT1lKDkzKSxsPXUoZnVuY3Rpb24oZSx0KXtpZihlLm5hbWVzcGFjZVVS SSE9PWkuc3ZnfHwiaW5uZXJIVE1MImluIGUpZS5pbm5lckhUTUw9dDtlbHNle3I9cnx8ZG9jdW1l bnQuY3JlYXRlRWxlbWVudCgiZGl2Iiksci5pbm5lckhUTUw9Ijxzdmc+Iit0KyI8L3N2Zz4iO2Zv cih2YXIgbj1yLmZpcnN0Q2hpbGQ7bi5maXJzdENoaWxkOyllLmFwcGVuZENoaWxkKG4uZmlyc3RD aGlsZCl9fSk7aWYoby5jYW5Vc2VET00pe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRp diIpO2MuaW5uZXJIVE1MPSIgIiwiIj09PWMuaW5uZXJIVE1MJiYobD1mdW5jdGlvbihlLHQpe2lm KGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlLGUpLGEudGVzdCh0KXx8 IjwiPT09dFswXSYmcy50ZXN0KHQpKXtlLmlubmVySFRNTD1TdHJpbmcuZnJvbUNoYXJDb2RlKDY1 Mjc5KSt0O3ZhciBuPWUuZmlyc3RDaGlsZDsxPT09bi5kYXRhLmxlbmd0aD9lLnJlbW92ZUNoaWxk KG4pOm4uZGVsZXRlRGF0YSgwLDEpfWVsc2UgZS5pbm5lckhUTUw9dH0pLGM9bnVsbH10LmV4cG9y dHM9bH0sezEwOjEwLDEyMzoxMjMsOTM6OTN9XSwxMTY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0 cmljdCI7dmFyIHI9ZSgxMjMpLG89ZSg5NSksaT1lKDExNSksYT1mdW5jdGlvbihlLHQpe2lmKHQp e3ZhciBuPWUuZmlyc3RDaGlsZDtpZihuJiZuPT09ZS5sYXN0Q2hpbGQmJjM9PT1uLm5vZGVUeXBl KXJldHVybiB2b2lkKG4ubm9kZVZhbHVlPXQpfWUudGV4dENvbnRlbnQ9dH07ci5jYW5Vc2VET00m JigidGV4dENvbnRlbnQiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHwoYT1mdW5jdGlvbihl LHQpe3JldHVybiAzPT09ZS5ub2RlVHlwZT92b2lkKGUubm9kZVZhbHVlPXQpOnZvaWQgaShlLG8o dCkpfSkpLHQuZXhwb3J0cz1hfSx7MTE1OjExNSwxMjM6MTIzLDk1Ojk1fV0sMTE3OltmdW5jdGlv bihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXt2YXIgbj1udWxsPT09ZXx8ZT09 PSExLHI9bnVsbD09PXR8fHQ9PT0hMTtpZihufHxyKXJldHVybiBuPT09cjt2YXIgbz10eXBlb2Yg ZSxpPXR5cGVvZiB0O3JldHVybiJzdHJpbmciPT09b3x8Im51bWJlciI9PT1vPyJzdHJpbmciPT09 aXx8Im51bWJlciI9PT1pOiJvYmplY3QiPT09aSYmZS50eXBlPT09dC50eXBlJiZlLmtleT09PXQu a2V5fXQuZXhwb3J0cz1yfSx7fV0sMTE4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1 bmN0aW9uIHIoZSx0KXtyZXR1cm4gZSYmIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT1lLmtleT9s LmVzY2FwZShlLmtleSk6dC50b1N0cmluZygzNil9ZnVuY3Rpb24gbyhlLHQsbixpKXt2YXIgZD10 eXBlb2YgZTtpZigidW5kZWZpbmVkIiE9PWQmJiJib29sZWFuIiE9PWR8fChlPW51bGwpLG51bGw9 PT1lfHwic3RyaW5nIj09PWR8fCJudW1iZXIiPT09ZHx8Im9iamVjdCI9PT1kJiZlLiQkdHlwZW9m PT09cylyZXR1cm4gbihpLGUsIiI9PT10P2MrcihlLDApOnQpLDE7dmFyIGYsaCxtPTAsdj0iIj09 PXQ/Yzp0K3A7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIGc9MDtnPGUubGVuZ3RoO2crKylm PWVbZ10saD12K3IoZixnKSxtKz1vKGYsaCxuLGkpO2Vsc2V7dmFyIHk9dShlKTtpZih5KXt2YXIg XyxDPXkuY2FsbChlKTtpZih5IT09ZS5lbnRyaWVzKWZvcih2YXIgYj0wOyEoXz1DLm5leHQoKSku ZG9uZTspZj1fLnZhbHVlLGg9dityKGYsYisrKSxtKz1vKGYsaCxuLGkpO2Vsc2UgZm9yKDshKF89 Qy5uZXh0KCkpLmRvbmU7KXt2YXIgRT1fLnZhbHVlO0UmJihmPUVbMV0saD12K2wuZXNjYXBlKEVb MF0pK3ArcihmLDApLG0rPW8oZixoLG4saSkpfX1lbHNlIGlmKCJvYmplY3QiPT09ZCl7dmFyIHg9 IiIsdz1TdHJpbmcoZSk7YSgiMzEiLCJbb2JqZWN0IE9iamVjdF0iPT09dz8ib2JqZWN0IHdpdGgg a2V5cyB7IitPYmplY3Qua2V5cyhlKS5qb2luKCIsICIpKyJ9Ijp3LHgpfX1yZXR1cm4gbX1mdW5j dGlvbiBpKGUsdCxuKXtyZXR1cm4gbnVsbD09ZT8wOm8oZSwiIix0LG4pfXZhciBhPWUoMTEzKSxz PShlKDEyMCksZSg0OCkpLHU9ZSgxMDQpLGw9KGUoMTM3KSxlKDIyKSksYz0oZSgxNDIpLCIuIiks cD0iOiI7dC5leHBvcnRzPWl9LHsxMDQ6MTA0LDExMzoxMTMsMTIwOjEyMCwxMzc6MTM3LDE0Mjox NDIsMjI6MjIsNDg6NDh9XSwxMTk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9 KGUoMTQzKSxlKDEyOSkpLG89KGUoMTQyKSxyKTt0LmV4cG9ydHM9b30sezEyOToxMjksMTQyOjE0 MiwxNDM6MTQzfV0sMTIwOltmdW5jdGlvbih0LG4scil7InVzZSBzdHJpY3QiO3ZhciBvPWUuX19T RUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ7bi5leHBvcnRz PW8uUmVhY3RDdXJyZW50T3duZXJ9LHt9XSwxMjE6W2Z1bmN0aW9uKHQsbixyKXsidXNlIHN0cmlj dCI7bi5leHBvcnRzPWV9LHt9XSwxMjI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFy IHI9ZSgxMjkpLG89e2xpc3RlbjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGUuYWRkRXZlbnRMaXN0 ZW5lcj8oZS5hZGRFdmVudExpc3RlbmVyKHQsbiwhMSkse3JlbW92ZTpmdW5jdGlvbigpe2UucmVt b3ZlRXZlbnRMaXN0ZW5lcih0LG4sITEpfX0pOmUuYXR0YWNoRXZlbnQ/KGUuYXR0YWNoRXZlbnQo Im9uIit0LG4pLHtyZW1vdmU6ZnVuY3Rpb24oKXtlLmRldGFjaEV2ZW50KCJvbiIrdCxuKX19KTp2 b2lkIDB9LGNhcHR1cmU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLmFkZEV2ZW50TGlzdGVuZXI/ KGUuYWRkRXZlbnRMaXN0ZW5lcih0LG4sITApLHtyZW1vdmU6ZnVuY3Rpb24oKXtlLnJlbW92ZUV2 ZW50TGlzdGVuZXIodCxuLCEwKX19KTp7cmVtb3ZlOnJ9fSxyZWdpc3RlckRlZmF1bHQ6ZnVuY3Rp b24oKXt9fTt0LmV4cG9ydHM9b30sezEyOToxMjl9XSwxMjM6W2Z1bmN0aW9uKGUsdCxuKXsidXNl IHN0cmljdCI7dmFyIHI9ISgidW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvd3x8IXdpbmRvdy5kb2N1 bWVudHx8IXdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KSxvPXtjYW5Vc2VET006cixjYW5V c2VXb3JrZXJzOiJ1bmRlZmluZWQiIT10eXBlb2YgV29ya2VyLGNhblVzZUV2ZW50TGlzdGVuZXJz OnImJiEoIXdpbmRvdy5hZGRFdmVudExpc3RlbmVyJiYhd2luZG93LmF0dGFjaEV2ZW50KSxjYW5V c2VWaWV3cG9ydDpyJiYhIXdpbmRvdy5zY3JlZW4saXNJbldvcmtlcjohcn07dC5leHBvcnRzPW99 LHt9XSwxMjQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1 cm4gZS5yZXBsYWNlKG8sZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpfSl9dmFy IG89Ly0oLikvZzt0LmV4cG9ydHM9cn0se31dLDEyNTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3Ry aWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBvKGUucmVwbGFjZShpLCJtcy0iKSl9dmFyIG89ZSgx MjQpLGk9L14tbXMtLzt0LmV4cG9ydHM9cn0sezEyNDoxMjR9XSwxMjY6W2Z1bmN0aW9uKGUsdCxu KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3JldHVybiEoIWV8fCF0KSYmKGU9PT10fHwh byhlKSYmKG8odCk/cihlLHQucGFyZW50Tm9kZSk6ImNvbnRhaW5zImluIGU/ZS5jb250YWlucyh0 KTohIWUuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJiEhKDE2JmUuY29tcGFyZURvY3VtZW50UG9z aXRpb24odCkpKSl9dmFyIG89ZSgxMzkpO3QuZXhwb3J0cz1yfSx7MTM5OjEzOX1dLDEyNzpbZnVu Y3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3ZhciB0PWUubGVuZ3RoO2lm KEFycmF5LmlzQXJyYXkoZSl8fCJvYmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9m IGU/YSghMSk6dm9pZCAwLCJudW1iZXIiIT10eXBlb2YgdD9hKCExKTp2b2lkIDAsMD09PXR8fHQt MSBpbiBlP3ZvaWQgMDphKCExKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5jYWxsZWU/YSghMSk6dm9p ZCAwLGUuaGFzT3duUHJvcGVydHkpdHJ5e3JldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2Fs bChlKX1jYXRjaChlKXt9Zm9yKHZhciBuPUFycmF5KHQpLHI9MDtyPHQ7cisrKW5bcl09ZVtyXTty ZXR1cm4gbn1mdW5jdGlvbiBvKGUpe3JldHVybiEhZSYmKCJvYmplY3QiPT10eXBlb2YgZXx8ImZ1 bmN0aW9uIj09dHlwZW9mIGUpJiYibGVuZ3RoImluIGUmJiEoInNldEludGVydmFsImluIGUpJiYi bnVtYmVyIiE9dHlwZW9mIGUubm9kZVR5cGUmJihBcnJheS5pc0FycmF5KGUpfHwiY2FsbGVlImlu IGV8fCJpdGVtImluIGUpfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIG8oZSk/QXJyYXkuaXNBcnJheShl KT9lLnNsaWNlKCk6cihlKTpbZV19dmFyIGE9ZSgxMzcpO3QuZXhwb3J0cz1pfSx7MTM3OjEzN31d LDEyODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3ZhciB0PWUu bWF0Y2goYyk7cmV0dXJuIHQmJnRbMV0udG9Mb3dlckNhc2UoKX1mdW5jdGlvbiBvKGUsdCl7dmFy IG49bDtsP3ZvaWQgMDp1KCExKTt2YXIgbz1yKGUpLGk9byYmcyhvKTtpZihpKXtuLmlubmVySFRN TD1pWzFdK2UraVsyXTtmb3IodmFyIGM9aVswXTtjLS07KW49bi5sYXN0Q2hpbGR9ZWxzZSBuLmlu bmVySFRNTD1lO3ZhciBwPW4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpO3AubGVuZ3Ro JiYodD92b2lkIDA6dSghMSksYShwKS5mb3JFYWNoKHQpKTtmb3IodmFyIGQ9QXJyYXkuZnJvbShu LmNoaWxkTm9kZXMpO24ubGFzdENoaWxkOyluLnJlbW92ZUNoaWxkKG4ubGFzdENoaWxkKTtyZXR1 cm4gZH12YXIgaT1lKDEyMyksYT1lKDEyNykscz1lKDEzMyksdT1lKDEzNyksbD1pLmNhblVzZURP TT9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTpudWxsLGM9L15ccyo8KFx3KykvO3QuZXhw b3J0cz1vfSx7MTIzOjEyMywxMjc6MTI3LDEzMzoxMzMsMTM3OjEzN31dLDEyOTpbZnVuY3Rpb24o ZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVy biBlfX12YXIgbz1mdW5jdGlvbigpe307by50aGF0UmV0dXJucz1yLG8udGhhdFJldHVybnNGYWxz ZT1yKCExKSxvLnRoYXRSZXR1cm5zVHJ1ZT1yKCEwKSxvLnRoYXRSZXR1cm5zTnVsbD1yKG51bGwp LG8udGhhdFJldHVybnNUaGlzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LG8udGhhdFJldHVybnNB cmd1bWVudD1mdW5jdGlvbihlKXtyZXR1cm4gZX0sdC5leHBvcnRzPW99LHt9XSwxMzA6W2Z1bmN0 aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9e307dC5leHBvcnRzPXJ9LHt9XSwxMzE6W2Z1 bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt0cnl7ZS5mb2N1cygpfWNh dGNoKGUpe319dC5leHBvcnRzPXJ9LHt9XSwxMzI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmlj dCI7ZnVuY3Rpb24gcigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgZG9jdW1lbnQpcmV0dXJuIG51 bGw7dHJ5e3JldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50fHxkb2N1bWVudC5ib2R5fWNhdGNo KGUpe3JldHVybiBkb2N1bWVudC5ib2R5fX10LmV4cG9ydHM9cn0se31dLDEzMzpbZnVuY3Rpb24o ZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBhP3ZvaWQgMDppKCExKSxk Lmhhc093blByb3BlcnR5KGUpfHwoZT0iKiIpLHMuaGFzT3duUHJvcGVydHkoZSl8fCgiKiI9PT1l P2EuaW5uZXJIVE1MPSI8bGluayAvPiI6YS5pbm5lckhUTUw9IjwiK2UrIj48LyIrZSsiPiIsc1tl XT0hYS5maXJzdENoaWxkKSxzW2VdP2RbZV06bnVsbH12YXIgbz1lKDEyMyksaT1lKDEzNyksYT1v LmNhblVzZURPTT9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTpudWxsLHM9e30sdT1bMSwn PHNlbGVjdCBtdWx0aXBsZT0idHJ1ZSI+JywiPC9zZWxlY3Q+Il0sbD1bMSwiPHRhYmxlPiIsIjwv dGFibGU+Il0sYz1bMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+ Il0scD1bMSwnPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPicsIjwvc3Zn PiJdLGQ9eyIqIjpbMSwiPzxkaXY+IiwiPC9kaXY+Il0sYXJlYTpbMSwiPG1hcD4iLCI8L21hcD4i XSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48 L3RhYmxlPiJdLGxlZ2VuZDpbMSwiPGZpZWxkc2V0PiIsIjwvZmllbGRzZXQ+Il0scGFyYW06WzEs IjxvYmplY3Q+IiwiPC9vYmplY3Q+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48 L3RhYmxlPiJdLG9wdGdyb3VwOnUsb3B0aW9uOnUsY2FwdGlvbjpsLGNvbGdyb3VwOmwsdGJvZHk6 bCx0Zm9vdDpsLHRoZWFkOmwsdGQ6Yyx0aDpjfSxmPVsiY2lyY2xlIiwiY2xpcFBhdGgiLCJkZWZz IiwiZWxsaXBzZSIsImciLCJpbWFnZSIsImxpbmUiLCJsaW5lYXJHcmFkaWVudCIsIm1hc2siLCJw YXRoIiwicGF0dGVybiIsInBvbHlnb24iLCJwb2x5bGluZSIsInJhZGlhbEdyYWRpZW50IiwicmVj dCIsInN0b3AiLCJ0ZXh0IiwidHNwYW4iXTtmLmZvckVhY2goZnVuY3Rpb24oZSl7ZFtlXT1wLHNb ZV09ITB9KSx0LmV4cG9ydHM9cn0sezEyMzoxMjMsMTM3OjEzN31dLDEzNDpbZnVuY3Rpb24oZSx0 LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlPT09d2luZG93P3t4OndpbmRv dy5wYWdlWE9mZnNldHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQseTp3aW5k b3cucGFnZVlPZmZzZXR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B9Ont4OmUu c2Nyb2xsTGVmdCx5OmUuc2Nyb2xsVG9wfX10LmV4cG9ydHM9cn0se31dLDEzNTpbZnVuY3Rpb24o ZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlLnJlcGxhY2UobywiLSQx IikudG9Mb3dlckNhc2UoKX12YXIgbz0vKFtBLVpdKS9nO3QuZXhwb3J0cz1yfSx7fV0sMTM2Oltm dW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIG8oZSkucmVw bGFjZShpLCItbXMtIil9dmFyIG89ZSgxMzUpLGk9L15tcy0vO3QuZXhwb3J0cz1yfSx7MTM1OjEz NX1dLDEzNzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIs aSxhLHMsdSl7aWYobyh0KSwhZSl7dmFyIGw7aWYodm9pZCAwPT09dClsPW5ldyBFcnJvcigiTWlu aWZpZWQgZXhjZXB0aW9uIG9jY3VycmVkOyB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJv bm1lbnQgZm9yIHRoZSBmdWxsIGVycm9yIG1lc3NhZ2UgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3 YXJuaW5ncy4iKTtlbHNle3ZhciBjPVtuLHIsaSxhLHMsdV0scD0wO2w9bmV3IEVycm9yKHQucmVw bGFjZSgvJXMvZyxmdW5jdGlvbigpe3JldHVybiBjW3ArK119KSksbC5uYW1lPSJJbnZhcmlhbnQg VmlvbGF0aW9uIn10aHJvdyBsLmZyYW1lc1RvUG9wPTEsbH19dmFyIG89ZnVuY3Rpb24oZSl7fTt0 LmV4cG9ydHM9cn0se31dLDEzODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlv biByKGUpe3JldHVybiEoIWV8fCEoImZ1bmN0aW9uIj09dHlwZW9mIE5vZGU/ZSBpbnN0YW5jZW9m IE5vZGU6Im9iamVjdCI9PXR5cGVvZiBlJiYibnVtYmVyIj09dHlwZW9mIGUubm9kZVR5cGUmJiJz dHJpbmciPT10eXBlb2YgZS5ub2RlTmFtZSkpfXQuZXhwb3J0cz1yfSx7fV0sMTM5OltmdW5jdGlv bihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIG8oZSkmJjM9PWUubm9k ZVR5cGV9dmFyIG89ZSgxMzgpO3QuZXhwb3J0cz1yfSx7MTM4OjEzOH1dLDE0MDpbZnVuY3Rpb24o ZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3ZhciB0PXt9O3JldHVybiBmdW5jdGlv bihuKXtyZXR1cm4gdC5oYXNPd25Qcm9wZXJ0eShuKXx8KHRbbl09ZS5jYWxsKHRoaXMsbikpLHRb bl19fXQuZXhwb3J0cz1yfSx7fV0sMTQxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1 bmN0aW9uIHIoZSx0KXtyZXR1cm4gZT09PXQ/MCE9PWV8fDAhPT10fHwxL2U9PT0xL3Q6ZSE9PWUm JnQhPT10fWZ1bmN0aW9uIG8oZSx0KXtpZihyKGUsdCkpcmV0dXJuITA7aWYoIm9iamVjdCIhPXR5 cGVvZiBlfHxudWxsPT09ZXx8Im9iamVjdCIhPXR5cGVvZiB0fHxudWxsPT09dClyZXR1cm4hMTt2 YXIgbj1PYmplY3Qua2V5cyhlKSxvPU9iamVjdC5rZXlzKHQpO2lmKG4ubGVuZ3RoIT09by5sZW5n dGgpcmV0dXJuITE7Zm9yKHZhciBhPTA7YTxuLmxlbmd0aDthKyspaWYoIWkuY2FsbCh0LG5bYV0p fHwhcihlW25bYV1dLHRbblthXV0pKXJldHVybiExO3JldHVybiEwfXZhciBpPU9iamVjdC5wcm90 b3R5cGUuaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPW99LHt9XSwxNDI6W2Z1bmN0aW9uKGUsdCxu KXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxMjkpLG89cjt0LmV4cG9ydHM9b30sezEyOToxMjl9XSwx NDM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtpZihudWxsPT09 ZXx8dm9pZCAwPT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QuYXNzaWduIGNhbm5vdCBi ZSBjYWxsZWQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCIpO3JldHVybiBPYmplY3QoZSl9ZnVuY3Rp b24gbygpe3RyeXtpZighT2JqZWN0LmFzc2lnbilyZXR1cm4hMTt2YXIgZT1uZXcgU3RyaW5nKCJh YmMiKTtpZihlWzVdPSJkZSIsIjUiPT09T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSlbMF0p cmV0dXJuITE7Zm9yKHZhciB0PXt9LG49MDtuPDEwO24rKyl0WyJfIitTdHJpbmcuZnJvbUNoYXJD b2RlKG4pXT1uO3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHQpLm1hcChmdW5jdGlv bihlKXtyZXR1cm4gdFtlXX0pO2lmKCIwMTIzNDU2Nzg5IiE9PXIuam9pbigiIikpcmV0dXJuITE7 dmFyIG89e307cmV0dXJuImFiY2RlZmdoaWprbG1ub3BxcnN0Ii5zcGxpdCgiIikuZm9yRWFjaChm dW5jdGlvbihlKXtvW2VdPWV9KSwiYWJjZGVmZ2hpamtsbW5vcHFyc3QiPT09T2JqZWN0LmtleXMo T2JqZWN0LmFzc2lnbih7fSxvKSkuam9pbigiIil9Y2F0Y2goZSl7cmV0dXJuITF9fXZhciBpPU9i amVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksYT1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5 SXNFbnVtZXJhYmxlO3QuZXhwb3J0cz1vKCk/T2JqZWN0LmFzc2lnbjpmdW5jdGlvbihlLHQpe2Zv cih2YXIgbixvLHM9cihlKSx1PTE7dTxhcmd1bWVudHMubGVuZ3RoO3UrKyl7bj1PYmplY3QoYXJn dW1lbnRzW3VdKTtmb3IodmFyIGwgaW4gbilpLmNhbGwobixsKSYmKHNbbF09bltsXSk7aWYoT2Jq ZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7bz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xz KG4pO2Zvcih2YXIgYz0wO2M8by5sZW5ndGg7YysrKWEuY2FsbChuLG9bY10pJiYoc1tvW2NdXT1u W29bY11dKX19cmV0dXJuIHN9fSx7fV19LHt9LFs0NV0pKDQ1KX0pfSk7ClwgTm8gbmV3bGluZSBh dCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFj dC1kb20vaW5kZXguanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9pbmRl eC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uMmJmOTQxNzkKLS0tIC9k ZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9pbmRleC5q cwpAQCAtMCwwICsxLDMgQEAKKyd1c2Ugc3RyaWN0JzsKKworbW9kdWxlLmV4cG9ydHMgPSByZXF1 aXJlKCcuL2xpYi9SZWFjdERPTScpOwpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3Zl bmRvci9yZWFjdC1kb20vbGliL0FSSUFET01Qcm9wZXJ0eUNvbmZpZy5qcyBiL3dlYi9wZ2FkbWlu L3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9BUklBRE9NUHJvcGVydHlDb25maWcuanMKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLmI2ZDhhM2Y5Ci0tLSAvZGV2L251bGwK KysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL0FSSUFET01Qcm9w ZXJ0eUNvbmZpZy5qcwpAQCAtMCwwICsxLDczIEBACisvKioKKyAqIENvcHlyaWdodCAyMDEzLXBy ZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRo aXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZv dW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlz IHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNh biBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAq CisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgQVJJQURPTVByb3BlcnR5Q29uZmlnID0gewor ICBQcm9wZXJ0aWVzOiB7CisgICAgLy8gR2xvYmFsIFN0YXRlcyBhbmQgUHJvcGVydGllcworICAg ICdhcmlhLWN1cnJlbnQnOiAwLCAvLyBzdGF0ZQorICAgICdhcmlhLWRldGFpbHMnOiAwLAorICAg ICdhcmlhLWRpc2FibGVkJzogMCwgLy8gc3RhdGUKKyAgICAnYXJpYS1oaWRkZW4nOiAwLCAvLyBz dGF0ZQorICAgICdhcmlhLWludmFsaWQnOiAwLCAvLyBzdGF0ZQorICAgICdhcmlhLWtleXNob3J0 Y3V0cyc6IDAsCisgICAgJ2FyaWEtbGFiZWwnOiAwLAorICAgICdhcmlhLXJvbGVkZXNjcmlwdGlv bic6IDAsCisgICAgLy8gV2lkZ2V0IEF0dHJpYnV0ZXMKKyAgICAnYXJpYS1hdXRvY29tcGxldGUn OiAwLAorICAgICdhcmlhLWNoZWNrZWQnOiAwLAorICAgICdhcmlhLWV4cGFuZGVkJzogMCwKKyAg ICAnYXJpYS1oYXNwb3B1cCc6IDAsCisgICAgJ2FyaWEtbGV2ZWwnOiAwLAorICAgICdhcmlhLW1v ZGFsJzogMCwKKyAgICAnYXJpYS1tdWx0aWxpbmUnOiAwLAorICAgICdhcmlhLW11bHRpc2VsZWN0 YWJsZSc6IDAsCisgICAgJ2FyaWEtb3JpZW50YXRpb24nOiAwLAorICAgICdhcmlhLXBsYWNlaG9s ZGVyJzogMCwKKyAgICAnYXJpYS1wcmVzc2VkJzogMCwKKyAgICAnYXJpYS1yZWFkb25seSc6IDAs CisgICAgJ2FyaWEtcmVxdWlyZWQnOiAwLAorICAgICdhcmlhLXNlbGVjdGVkJzogMCwKKyAgICAn YXJpYS1zb3J0JzogMCwKKyAgICAnYXJpYS12YWx1ZW1heCc6IDAsCisgICAgJ2FyaWEtdmFsdWVt aW4nOiAwLAorICAgICdhcmlhLXZhbHVlbm93JzogMCwKKyAgICAnYXJpYS12YWx1ZXRleHQnOiAw LAorICAgIC8vIExpdmUgUmVnaW9uIEF0dHJpYnV0ZXMKKyAgICAnYXJpYS1hdG9taWMnOiAwLAor ICAgICdhcmlhLWJ1c3knOiAwLAorICAgICdhcmlhLWxpdmUnOiAwLAorICAgICdhcmlhLXJlbGV2 YW50JzogMCwKKyAgICAvLyBEcmFnLWFuZC1Ecm9wIEF0dHJpYnV0ZXMKKyAgICAnYXJpYS1kcm9w ZWZmZWN0JzogMCwKKyAgICAnYXJpYS1ncmFiYmVkJzogMCwKKyAgICAvLyBSZWxhdGlvbnNoaXAg QXR0cmlidXRlcworICAgICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnOiAwLAorICAgICdhcmlhLWNv bGNvdW50JzogMCwKKyAgICAnYXJpYS1jb2xpbmRleCc6IDAsCisgICAgJ2FyaWEtY29sc3Bhbic6 IDAsCisgICAgJ2FyaWEtY29udHJvbHMnOiAwLAorICAgICdhcmlhLWRlc2NyaWJlZGJ5JzogMCwK KyAgICAnYXJpYS1lcnJvcm1lc3NhZ2UnOiAwLAorICAgICdhcmlhLWZsb3d0byc6IDAsCisgICAg J2FyaWEtbGFiZWxsZWRieSc6IDAsCisgICAgJ2FyaWEtb3ducyc6IDAsCisgICAgJ2FyaWEtcG9z aW5zZXQnOiAwLAorICAgICdhcmlhLXJvd2NvdW50JzogMCwKKyAgICAnYXJpYS1yb3dpbmRleCc6 IDAsCisgICAgJ2FyaWEtcm93c3Bhbic6IDAsCisgICAgJ2FyaWEtc2V0c2l6ZSc6IDAKKyAgfSwK KyAgRE9NQXR0cmlidXRlTmFtZXM6IHt9LAorICBET01Qcm9wZXJ0eU5hbWVzOiB7fQorfTsKKwor bW9kdWxlLmV4cG9ydHMgPSBBUklBRE9NUHJvcGVydHlDb25maWc7ClwgTm8gbmV3bGluZSBhdCBl bmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1k b20vbGliL0F1dG9Gb2N1c1V0aWxzLmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFj dC1kb20vbGliL0F1dG9Gb2N1c1V0aWxzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw MDAwMDAwLi4zMWU2NDY5MAotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92 ZW5kb3IvcmVhY3QtZG9tL2xpYi9BdXRvRm9jdXNVdGlscy5qcwpAQCAtMCwwICsxLDIzIEBACisv KioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmln aHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIg dGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRo ZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50 CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGlu IHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgUmVh Y3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTsK KwordmFyIGZvY3VzTm9kZSA9IHJlcXVpcmUoJ2ZianMvbGliL2ZvY3VzTm9kZScpOworCit2YXIg QXV0b0ZvY3VzVXRpbHMgPSB7CisgIGZvY3VzRE9NQ29tcG9uZW50OiBmdW5jdGlvbiAoKSB7Cisg ICAgZm9jdXNOb2RlKFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKHRo aXMpKTsKKyAgfQorfTsKKworbW9kdWxlLmV4cG9ydHMgPSBBdXRvRm9jdXNVdGlsczsKXCBObyBu ZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVu ZG9yL3JlYWN0LWRvbS9saWIvQmVmb3JlSW5wdXRFdmVudFBsdWdpbi5qcyBiL3dlYi9wZ2FkbWlu L3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9CZWZvcmVJbnB1dEV2ZW50UGx1Z2luLmpzCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi42MWVmMDBhMAotLS0gL2Rldi9udWxs CisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9CZWZvcmVJbnB1 dEV2ZW50UGx1Z2luLmpzCkBAIC0wLDAgKzEsMzg0IEBACisvKioKKyAqIENvcHlyaWdodCAyMDEz LXByZXNlbnQgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog VGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2Ug Zm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRo aXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMg Y2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5Lgor ICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBFdmVudFByb3BhZ2F0b3JzID0gcmVxdWly ZSgnLi9FdmVudFByb3BhZ2F0b3JzJyk7Cit2YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1 aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpOwordmFyIEZhbGxiYWNrQ29tcG9z aXRpb25TdGF0ZSA9IHJlcXVpcmUoJy4vRmFsbGJhY2tDb21wb3NpdGlvblN0YXRlJyk7Cit2YXIg U3ludGhldGljQ29tcG9zaXRpb25FdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljQ29tcG9zaXRp b25FdmVudCcpOwordmFyIFN5bnRoZXRpY0lucHV0RXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRp Y0lucHV0RXZlbnQnKTsKKwordmFyIEVORF9LRVlDT0RFUyA9IFs5LCAxMywgMjcsIDMyXTsgLy8g VGFiLCBSZXR1cm4sIEVzYywgU3BhY2UKK3ZhciBTVEFSVF9LRVlDT0RFID0gMjI5OworCit2YXIg Y2FuVXNlQ29tcG9zaXRpb25FdmVudCA9IEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSAm JiAnQ29tcG9zaXRpb25FdmVudCcgaW4gd2luZG93OworCit2YXIgZG9jdW1lbnRNb2RlID0gbnVs bDsKK2lmIChFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gJiYgJ2RvY3VtZW50TW9kZScg aW4gZG9jdW1lbnQpIHsKKyAgZG9jdW1lbnRNb2RlID0gZG9jdW1lbnQuZG9jdW1lbnRNb2RlOwor fQorCisvLyBXZWJraXQgb2ZmZXJzIGEgdmVyeSB1c2VmdWwgYHRleHRJbnB1dGAgZXZlbnQgdGhh dCBjYW4gYmUgdXNlZCB0bworLy8gZGlyZWN0bHkgcmVwcmVzZW50IGBiZWZvcmVJbnB1dGAuIFRo ZSBJRSBgdGV4dGlucHV0YCBldmVudCBpcyBub3QgYXMKKy8vIHVzZWZ1bCwgc28gd2UgZG9uJ3Qg dXNlIGl0LgordmFyIGNhblVzZVRleHRJbnB1dEV2ZW50ID0gRXhlY3V0aW9uRW52aXJvbm1lbnQu Y2FuVXNlRE9NICYmICdUZXh0RXZlbnQnIGluIHdpbmRvdyAmJiAhZG9jdW1lbnRNb2RlICYmICFp c1ByZXN0bygpOworCisvLyBJbiBJRTkrLCB3ZSBoYXZlIGFjY2VzcyB0byBjb21wb3NpdGlvbiBl dmVudHMsIGJ1dCB0aGUgZGF0YSBzdXBwbGllZAorLy8gYnkgdGhlIG5hdGl2ZSBjb21wb3NpdGlv bmVuZCBldmVudCBtYXkgYmUgaW5jb3JyZWN0LiBKYXBhbmVzZSBpZGVvZ3JhcGhpYworLy8gc3Bh Y2VzLCBmb3IgaW5zdGFuY2UgKFx1MzAwMCkgYXJlIG5vdCByZWNvcmRlZCBjb3JyZWN0bHkuCit2 YXIgdXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgPSBFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5V c2VET00gJiYgKCFjYW5Vc2VDb21wb3NpdGlvbkV2ZW50IHx8IGRvY3VtZW50TW9kZSAmJiBkb2N1 bWVudE1vZGUgPiA4ICYmIGRvY3VtZW50TW9kZSA8PSAxMSk7CisKKy8qKgorICogT3BlcmEgPD0g MTIgaW5jbHVkZXMgVGV4dEV2ZW50IGluIHdpbmRvdywgYnV0IGRvZXMgbm90IGZpcmUKKyAqIHRl eHQgaW5wdXQgZXZlbnRzLiBSZWx5IG9uIGtleXByZXNzIGluc3RlYWQuCisgKi8KK2Z1bmN0aW9u IGlzUHJlc3RvKCkgeworICB2YXIgb3BlcmEgPSB3aW5kb3cub3BlcmE7CisgIHJldHVybiB0eXBl b2Ygb3BlcmEgPT09ICdvYmplY3QnICYmIHR5cGVvZiBvcGVyYS52ZXJzaW9uID09PSAnZnVuY3Rp b24nICYmIHBhcnNlSW50KG9wZXJhLnZlcnNpb24oKSwgMTApIDw9IDEyOworfQorCit2YXIgU1BB Q0VCQVJfQ09ERSA9IDMyOwordmFyIFNQQUNFQkFSX0NIQVIgPSBTdHJpbmcuZnJvbUNoYXJDb2Rl KFNQQUNFQkFSX0NPREUpOworCisvLyBFdmVudHMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgcHJv cGVydHkgbmFtZXMuCit2YXIgZXZlbnRUeXBlcyA9IHsKKyAgYmVmb3JlSW5wdXQ6IHsKKyAgICBw aGFzZWRSZWdpc3RyYXRpb25OYW1lczogeworICAgICAgYnViYmxlZDogJ29uQmVmb3JlSW5wdXQn LAorICAgICAgY2FwdHVyZWQ6ICdvbkJlZm9yZUlucHV0Q2FwdHVyZScKKyAgICB9LAorICAgIGRl cGVuZGVuY2llczogWyd0b3BDb21wb3NpdGlvbkVuZCcsICd0b3BLZXlQcmVzcycsICd0b3BUZXh0 SW5wdXQnLCAndG9wUGFzdGUnXQorICB9LAorICBjb21wb3NpdGlvbkVuZDogeworICAgIHBoYXNl ZFJlZ2lzdHJhdGlvbk5hbWVzOiB7CisgICAgICBidWJibGVkOiAnb25Db21wb3NpdGlvbkVuZCcs CisgICAgICBjYXB0dXJlZDogJ29uQ29tcG9zaXRpb25FbmRDYXB0dXJlJworICAgIH0sCisgICAg ZGVwZW5kZW5jaWVzOiBbJ3RvcEJsdXInLCAndG9wQ29tcG9zaXRpb25FbmQnLCAndG9wS2V5RG93 bicsICd0b3BLZXlQcmVzcycsICd0b3BLZXlVcCcsICd0b3BNb3VzZURvd24nXQorICB9LAorICBj b21wb3NpdGlvblN0YXJ0OiB7CisgICAgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6IHsKKyAgICAg IGJ1YmJsZWQ6ICdvbkNvbXBvc2l0aW9uU3RhcnQnLAorICAgICAgY2FwdHVyZWQ6ICdvbkNvbXBv c2l0aW9uU3RhcnRDYXB0dXJlJworICAgIH0sCisgICAgZGVwZW5kZW5jaWVzOiBbJ3RvcEJsdXIn LCAndG9wQ29tcG9zaXRpb25TdGFydCcsICd0b3BLZXlEb3duJywgJ3RvcEtleVByZXNzJywgJ3Rv cEtleVVwJywgJ3RvcE1vdXNlRG93biddCisgIH0sCisgIGNvbXBvc2l0aW9uVXBkYXRlOiB7Cisg ICAgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6IHsKKyAgICAgIGJ1YmJsZWQ6ICdvbkNvbXBvc2l0 aW9uVXBkYXRlJywKKyAgICAgIGNhcHR1cmVkOiAnb25Db21wb3NpdGlvblVwZGF0ZUNhcHR1cmUn CisgICAgfSwKKyAgICBkZXBlbmRlbmNpZXM6IFsndG9wQmx1cicsICd0b3BDb21wb3NpdGlvblVw ZGF0ZScsICd0b3BLZXlEb3duJywgJ3RvcEtleVByZXNzJywgJ3RvcEtleVVwJywgJ3RvcE1vdXNl RG93biddCisgIH0KK307CisKKy8vIFRyYWNrIHdoZXRoZXIgd2UndmUgZXZlciBoYW5kbGVkIGEg a2V5cHJlc3Mgb24gdGhlIHNwYWNlIGtleS4KK3ZhciBoYXNTcGFjZUtleXByZXNzID0gZmFsc2U7 CisKKy8qKgorICogUmV0dXJuIHdoZXRoZXIgYSBuYXRpdmUga2V5cHJlc3MgZXZlbnQgaXMgYXNz dW1lZCB0byBiZSBhIGNvbW1hbmQuCisgKiBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgRmlyZWZv eCBmaXJlcyBga2V5cHJlc3NgIGV2ZW50cyBmb3Iga2V5IGNvbW1hbmRzCisgKiAoY3V0LCBjb3B5 LCBzZWxlY3QtYWxsLCBldGMuKSBldmVuIHRob3VnaCBubyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQu CisgKi8KK2Z1bmN0aW9uIGlzS2V5cHJlc3NDb21tYW5kKG5hdGl2ZUV2ZW50KSB7CisgIHJldHVy biAobmF0aXZlRXZlbnQuY3RybEtleSB8fCBuYXRpdmVFdmVudC5hbHRLZXkgfHwgbmF0aXZlRXZl bnQubWV0YUtleSkgJiYKKyAgLy8gY3RybEtleSAmJiBhbHRLZXkgaXMgZXF1aXZhbGVudCB0byBB bHRHciwgYW5kIGlzIG5vdCBhIGNvbW1hbmQuCisgICEobmF0aXZlRXZlbnQuY3RybEtleSAmJiBu YXRpdmVFdmVudC5hbHRLZXkpOworfQorCisvKioKKyAqIFRyYW5zbGF0ZSBuYXRpdmUgdG9wIGxl dmVsIGV2ZW50cyBpbnRvIGV2ZW50IHR5cGVzLgorICoKKyAqIEBwYXJhbSB7c3RyaW5nfSB0b3BM ZXZlbFR5cGUKKyAqIEByZXR1cm4ge29iamVjdH0KKyAqLworZnVuY3Rpb24gZ2V0Q29tcG9zaXRp b25FdmVudFR5cGUodG9wTGV2ZWxUeXBlKSB7CisgIHN3aXRjaCAodG9wTGV2ZWxUeXBlKSB7Cisg ICAgY2FzZSAndG9wQ29tcG9zaXRpb25TdGFydCc6CisgICAgICByZXR1cm4gZXZlbnRUeXBlcy5j b21wb3NpdGlvblN0YXJ0OworICAgIGNhc2UgJ3RvcENvbXBvc2l0aW9uRW5kJzoKKyAgICAgIHJl dHVybiBldmVudFR5cGVzLmNvbXBvc2l0aW9uRW5kOworICAgIGNhc2UgJ3RvcENvbXBvc2l0aW9u VXBkYXRlJzoKKyAgICAgIHJldHVybiBldmVudFR5cGVzLmNvbXBvc2l0aW9uVXBkYXRlOworICB9 Cit9CisKKy8qKgorICogRG9lcyBvdXIgZmFsbGJhY2sgYmVzdC1ndWVzcyBtb2RlbCB0aGluayB0 aGlzIGV2ZW50IHNpZ25pZmllcyB0aGF0CisgKiBjb21wb3NpdGlvbiBoYXMgYmVndW4/CisgKgor ICogQHBhcmFtIHtzdHJpbmd9IHRvcExldmVsVHlwZQorICogQHBhcmFtIHtvYmplY3R9IG5hdGl2 ZUV2ZW50CisgKiBAcmV0dXJuIHtib29sZWFufQorICovCitmdW5jdGlvbiBpc0ZhbGxiYWNrQ29t cG9zaXRpb25TdGFydCh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KSB7CisgIHJldHVybiB0b3BM ZXZlbFR5cGUgPT09ICd0b3BLZXlEb3duJyAmJiBuYXRpdmVFdmVudC5rZXlDb2RlID09PSBTVEFS VF9LRVlDT0RFOworfQorCisvKioKKyAqIERvZXMgb3VyIGZhbGxiYWNrIG1vZGUgdGhpbmsgdGhh dCB0aGlzIGV2ZW50IGlzIHRoZSBlbmQgb2YgY29tcG9zaXRpb24/CisgKgorICogQHBhcmFtIHtz dHJpbmd9IHRvcExldmVsVHlwZQorICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50CisgKiBA cmV0dXJuIHtib29sZWFufQorICovCitmdW5jdGlvbiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQo dG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkgeworICBzd2l0Y2ggKHRvcExldmVsVHlwZSkgewor ICAgIGNhc2UgJ3RvcEtleVVwJzoKKyAgICAgIC8vIENvbW1hbmQga2V5cyBpbnNlcnQgb3IgY2xl YXIgSU1FIGlucHV0LgorICAgICAgcmV0dXJuIEVORF9LRVlDT0RFUy5pbmRleE9mKG5hdGl2ZUV2 ZW50LmtleUNvZGUpICE9PSAtMTsKKyAgICBjYXNlICd0b3BLZXlEb3duJzoKKyAgICAgIC8vIEV4 cGVjdCBJTUUga2V5Q29kZSBvbiBlYWNoIGtleWRvd24uIElmIHdlIGdldCBhbnkgb3RoZXIKKyAg ICAgIC8vIGNvZGUgd2UgbXVzdCBoYXZlIGV4aXRlZCBlYXJsaWVyLgorICAgICAgcmV0dXJuIG5h dGl2ZUV2ZW50LmtleUNvZGUgIT09IFNUQVJUX0tFWUNPREU7CisgICAgY2FzZSAndG9wS2V5UHJl c3MnOgorICAgIGNhc2UgJ3RvcE1vdXNlRG93bic6CisgICAgY2FzZSAndG9wQmx1cic6CisgICAg ICAvLyBFdmVudHMgYXJlIG5vdCBwb3NzaWJsZSB3aXRob3V0IGNhbmNlbGxpbmcgSU1FLgorICAg ICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQor fQorCisvKioKKyAqIEdvb2dsZSBJbnB1dCBUb29scyBwcm92aWRlcyBjb21wb3NpdGlvbiBkYXRh IHZpYSBhIEN1c3RvbUV2ZW50LAorICogd2l0aCB0aGUgYGRhdGFgIHByb3BlcnR5IHBvcHVsYXRl ZCBpbiB0aGUgYGRldGFpbGAgb2JqZWN0LiBJZiB0aGlzCisgKiBpcyBhdmFpbGFibGUgb24gdGhl IGV2ZW50IG9iamVjdCwgdXNlIGl0LiBJZiBub3QsIHRoaXMgaXMgYSBwbGFpbgorICogY29tcG9z aXRpb24gZXZlbnQgYW5kIHdlIGhhdmUgbm90aGluZyBzcGVjaWFsIHRvIGV4dHJhY3QuCisgKgor ICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50CisgKiBAcmV0dXJuIHs/c3RyaW5nfQorICov CitmdW5jdGlvbiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KSB7CisgIHZhciBk ZXRhaWwgPSBuYXRpdmVFdmVudC5kZXRhaWw7CisgIGlmICh0eXBlb2YgZGV0YWlsID09PSAnb2Jq ZWN0JyAmJiAnZGF0YScgaW4gZGV0YWlsKSB7CisgICAgcmV0dXJuIGRldGFpbC5kYXRhOworICB9 CisgIHJldHVybiBudWxsOworfQorCisvLyBUcmFjayB0aGUgY3VycmVudCBJTUUgY29tcG9zaXRp b24gZmFsbGJhY2sgb2JqZWN0LCBpZiBhbnkuCit2YXIgY3VycmVudENvbXBvc2l0aW9uID0gbnVs bDsKKworLyoqCisgKiBAcmV0dXJuIHs/b2JqZWN0fSBBIFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZl bnQuCisgKi8KK2Z1bmN0aW9uIGV4dHJhY3RDb21wb3NpdGlvbkV2ZW50KHRvcExldmVsVHlwZSwg dGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7CisgIHZhciBldmVu dFR5cGU7CisgIHZhciBmYWxsYmFja0RhdGE7CisKKyAgaWYgKGNhblVzZUNvbXBvc2l0aW9uRXZl bnQpIHsKKyAgICBldmVudFR5cGUgPSBnZXRDb21wb3NpdGlvbkV2ZW50VHlwZSh0b3BMZXZlbFR5 cGUpOworICB9IGVsc2UgaWYgKCFjdXJyZW50Q29tcG9zaXRpb24pIHsKKyAgICBpZiAoaXNGYWxs YmFja0NvbXBvc2l0aW9uU3RhcnQodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkpIHsKKyAgICAg IGV2ZW50VHlwZSA9IGV2ZW50VHlwZXMuY29tcG9zaXRpb25TdGFydDsKKyAgICB9CisgIH0gZWxz ZSBpZiAoaXNGYWxsYmFja0NvbXBvc2l0aW9uRW5kKHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQp KSB7CisgICAgZXZlbnRUeXBlID0gZXZlbnRUeXBlcy5jb21wb3NpdGlvbkVuZDsKKyAgfQorCisg IGlmICghZXZlbnRUeXBlKSB7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBpZiAodXNlRmFs bGJhY2tDb21wb3NpdGlvbkRhdGEpIHsKKyAgICAvLyBUaGUgY3VycmVudCBjb21wb3NpdGlvbiBp cyBzdG9yZWQgc3RhdGljYWxseSBhbmQgbXVzdCBub3QgYmUKKyAgICAvLyBvdmVyd3JpdHRlbiB3 aGlsZSBjb21wb3NpdGlvbiBjb250aW51ZXMuCisgICAgaWYgKCFjdXJyZW50Q29tcG9zaXRpb24g JiYgZXZlbnRUeXBlID09PSBldmVudFR5cGVzLmNvbXBvc2l0aW9uU3RhcnQpIHsKKyAgICAgIGN1 cnJlbnRDb21wb3NpdGlvbiA9IEZhbGxiYWNrQ29tcG9zaXRpb25TdGF0ZS5nZXRQb29sZWQobmF0 aXZlRXZlbnRUYXJnZXQpOworICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSBldmVudFR5cGVz LmNvbXBvc2l0aW9uRW5kKSB7CisgICAgICBpZiAoY3VycmVudENvbXBvc2l0aW9uKSB7CisgICAg ICAgIGZhbGxiYWNrRGF0YSA9IGN1cnJlbnRDb21wb3NpdGlvbi5nZXREYXRhKCk7CisgICAgICB9 CisgICAgfQorICB9CisKKyAgdmFyIGV2ZW50ID0gU3ludGhldGljQ29tcG9zaXRpb25FdmVudC5n ZXRQb29sZWQoZXZlbnRUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRU YXJnZXQpOworCisgIGlmIChmYWxsYmFja0RhdGEpIHsKKyAgICAvLyBJbmplY3QgZGF0YSBnZW5l cmF0ZWQgZnJvbSBmYWxsYmFjayBwYXRoIGludG8gdGhlIHN5bnRoZXRpYyBldmVudC4KKyAgICAv LyBUaGlzIG1hdGNoZXMgdGhlIHByb3BlcnR5IG9mIG5hdGl2ZSBDb21wb3NpdGlvbkV2ZW50SW50 ZXJmYWNlLgorICAgIGV2ZW50LmRhdGEgPSBmYWxsYmFja0RhdGE7CisgIH0gZWxzZSB7CisgICAg dmFyIGN1c3RvbURhdGEgPSBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KTsKKyAg ICBpZiAoY3VzdG9tRGF0YSAhPT0gbnVsbCkgeworICAgICAgZXZlbnQuZGF0YSA9IGN1c3RvbURh dGE7CisgICAgfQorICB9CisKKyAgRXZlbnRQcm9wYWdhdG9ycy5hY2N1bXVsYXRlVHdvUGhhc2VE aXNwYXRjaGVzKGV2ZW50KTsKKyAgcmV0dXJuIGV2ZW50OworfQorCisvKioKKyAqIEBwYXJhbSB7 c3RyaW5nfSB0b3BMZXZlbFR5cGUgUmVjb3JkIGZyb20gYEV2ZW50Q29uc3RhbnRzYC4KKyAqIEBw YXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC4KKyAqIEByZXR1 cm4gez9zdHJpbmd9IFRoZSBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGlzIGBiZWZvcmVJbnB1 dGAgZXZlbnQuCisgKi8KK2Z1bmN0aW9uIGdldE5hdGl2ZUJlZm9yZUlucHV0Q2hhcnModG9wTGV2 ZWxUeXBlLCBuYXRpdmVFdmVudCkgeworICBzd2l0Y2ggKHRvcExldmVsVHlwZSkgeworICAgIGNh c2UgJ3RvcENvbXBvc2l0aW9uRW5kJzoKKyAgICAgIHJldHVybiBnZXREYXRhRnJvbUN1c3RvbUV2 ZW50KG5hdGl2ZUV2ZW50KTsKKyAgICBjYXNlICd0b3BLZXlQcmVzcyc6CisgICAgICAvKioKKyAg ICAgICAqIElmIG5hdGl2ZSBgdGV4dElucHV0YCBldmVudHMgYXJlIGF2YWlsYWJsZSwgb3VyIGdv YWwgaXMgdG8gbWFrZQorICAgICAgICogdXNlIG9mIHRoZW0uIEhvd2V2ZXIsIHRoZXJlIGlzIGEg c3BlY2lhbCBjYXNlOiB0aGUgc3BhY2ViYXIga2V5LgorICAgICAgICogSW4gV2Via2l0LCBwcmV2 ZW50aW5nIGRlZmF1bHQgb24gYSBzcGFjZWJhciBgdGV4dElucHV0YCBldmVudAorICAgICAgICog Y2FuY2VscyBjaGFyYWN0ZXIgaW5zZXJ0aW9uLCBidXQgaXQgKmFsc28qIGNhdXNlcyB0aGUgYnJv d3NlcgorICAgICAgICogdG8gZmFsbCBiYWNrIHRvIGl0cyBkZWZhdWx0IHNwYWNlYmFyIGJlaGF2 aW9yIG9mIHNjcm9sbGluZyB0aGUKKyAgICAgICAqIHBhZ2UuCisgICAgICAgKgorICAgICAgICog VHJhY2tpbmcgYXQ6CisgICAgICAgKiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVt L2lzc3Vlcy9kZXRhaWw/aWQ9MzU1MTAzCisgICAgICAgKgorICAgICAgICogVG8gYXZvaWQgdGhp cyBpc3N1ZSwgdXNlIHRoZSBrZXlwcmVzcyBldmVudCBhcyBpZiBubyBgdGV4dElucHV0YAorICAg ICAgICogZXZlbnQgaXMgYXZhaWxhYmxlLgorICAgICAgICovCisgICAgICB2YXIgd2hpY2ggPSBu YXRpdmVFdmVudC53aGljaDsKKyAgICAgIGlmICh3aGljaCAhPT0gU1BBQ0VCQVJfQ09ERSkgewor ICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgaGFzU3BhY2VLZXlwcmVzcyA9 IHRydWU7CisgICAgICByZXR1cm4gU1BBQ0VCQVJfQ0hBUjsKKworICAgIGNhc2UgJ3RvcFRleHRJ bnB1dCc6CisgICAgICAvLyBSZWNvcmQgdGhlIGNoYXJhY3RlcnMgdG8gYmUgYWRkZWQgdG8gdGhl IERPTS4KKyAgICAgIHZhciBjaGFycyA9IG5hdGl2ZUV2ZW50LmRhdGE7CisKKyAgICAgIC8vIElm IGl0J3MgYSBzcGFjZWJhciBjaGFyYWN0ZXIsIGFzc3VtZSB0aGF0IHdlIGhhdmUgYWxyZWFkeSBo YW5kbGVkCisgICAgICAvLyBpdCBhdCB0aGUga2V5cHJlc3MgbGV2ZWwgYW5kIGJhaWwgaW1tZWRp YXRlbHkuIEFuZHJvaWQgQ2hyb21lCisgICAgICAvLyBkb2Vzbid0IGdpdmUgdXMga2V5Y29kZXMs IHNvIHdlIG5lZWQgdG8gYmxhY2tsaXN0IGl0LgorICAgICAgaWYgKGNoYXJzID09PSBTUEFDRUJB Ul9DSEFSICYmIGhhc1NwYWNlS2V5cHJlc3MpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAg ICB9CisKKyAgICAgIHJldHVybiBjaGFyczsKKworICAgIGRlZmF1bHQ6CisgICAgICAvLyBGb3Ig b3RoZXIgbmF0aXZlIGV2ZW50IHR5cGVzLCBkbyBub3RoaW5nLgorICAgICAgcmV0dXJuIG51bGw7 CisgIH0KK30KKworLyoqCisgKiBGb3IgYnJvd3NlcnMgdGhhdCBkbyBub3QgcHJvdmlkZSB0aGUg YHRleHRJbnB1dGAgZXZlbnQsIGV4dHJhY3QgdGhlCisgKiBhcHByb3ByaWF0ZSBzdHJpbmcgdG8g dXNlIGZvciBTeW50aGV0aWNJbnB1dEV2ZW50LgorICoKKyAqIEBwYXJhbSB7c3RyaW5nfSB0b3BM ZXZlbFR5cGUgUmVjb3JkIGZyb20gYEV2ZW50Q29uc3RhbnRzYC4KKyAqIEBwYXJhbSB7b2JqZWN0 fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC4KKyAqIEByZXR1cm4gez9zdHJpbmd9 IFRoZSBmYWxsYmFjayBzdHJpbmcgZm9yIHRoaXMgYGJlZm9yZUlucHV0YCBldmVudC4KKyAqLwor ZnVuY3Rpb24gZ2V0RmFsbGJhY2tCZWZvcmVJbnB1dENoYXJzKHRvcExldmVsVHlwZSwgbmF0aXZl RXZlbnQpIHsKKyAgLy8gSWYgd2UgYXJlIGN1cnJlbnRseSBjb21wb3NpbmcgKElNRSkgYW5kIHVz aW5nIGEgZmFsbGJhY2sgdG8gZG8gc28sCisgIC8vIHRyeSB0byBleHRyYWN0IHRoZSBjb21wb3Nl ZCBjaGFyYWN0ZXJzIGZyb20gdGhlIGZhbGxiYWNrIG9iamVjdC4KKyAgLy8gSWYgY29tcG9zaXRp b24gZXZlbnQgaXMgYXZhaWxhYmxlLCB3ZSBleHRyYWN0IGEgc3RyaW5nIG9ubHkgYXQKKyAgLy8g Y29tcG9zaXRpb25ldmVudCwgb3RoZXJ3aXNlIGV4dHJhY3QgaXQgYXQgZmFsbGJhY2sgZXZlbnRz LgorICBpZiAoY3VycmVudENvbXBvc2l0aW9uKSB7CisgICAgaWYgKHRvcExldmVsVHlwZSA9PT0g J3RvcENvbXBvc2l0aW9uRW5kJyB8fCAhY2FuVXNlQ29tcG9zaXRpb25FdmVudCAmJiBpc0ZhbGxi YWNrQ29tcG9zaXRpb25FbmQodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkpIHsKKyAgICAgIHZh ciBjaGFycyA9IGN1cnJlbnRDb21wb3NpdGlvbi5nZXREYXRhKCk7CisgICAgICBGYWxsYmFja0Nv bXBvc2l0aW9uU3RhdGUucmVsZWFzZShjdXJyZW50Q29tcG9zaXRpb24pOworICAgICAgY3VycmVu dENvbXBvc2l0aW9uID0gbnVsbDsKKyAgICAgIHJldHVybiBjaGFyczsKKyAgICB9CisgICAgcmV0 dXJuIG51bGw7CisgIH0KKworICBzd2l0Y2ggKHRvcExldmVsVHlwZSkgeworICAgIGNhc2UgJ3Rv cFBhc3RlJzoKKyAgICAgIC8vIElmIGEgcGFzdGUgZXZlbnQgb2NjdXJzIGFmdGVyIGEga2V5cHJl c3MsIHRocm93IG91dCB0aGUgaW5wdXQKKyAgICAgIC8vIGNoYXJzLiBQYXN0ZSBldmVudHMgc2hv dWxkIG5vdCBsZWFkIHRvIEJlZm9yZUlucHV0IGV2ZW50cy4KKyAgICAgIHJldHVybiBudWxsOwor ICAgIGNhc2UgJ3RvcEtleVByZXNzJzoKKyAgICAgIC8qKgorICAgICAgICogQXMgb2YgdjI3LCBG aXJlZm94IG1heSBmaXJlIGtleXByZXNzIGV2ZW50cyBldmVuIHdoZW4gbm8gY2hhcmFjdGVyCisg ICAgICAgKiB3aWxsIGJlIGluc2VydGVkLiBBIGZldyBwb3NzaWJpbGl0aWVzOgorICAgICAgICoK KyAgICAgICAqIC0gYHdoaWNoYCBpcyBgMGAuIEFycm93IGtleXMsIEVzYyBrZXksIGV0Yy4KKyAg ICAgICAqCisgICAgICAgKiAtIGB3aGljaGAgaXMgdGhlIHByZXNzZWQga2V5IGNvZGUsIGJ1dCBu byBjaGFyIGlzIGF2YWlsYWJsZS4KKyAgICAgICAqICAgRXg6ICdBbHRHciArIGRgIGluIFBvbGlz aC4gVGhlcmUgaXMgbm8gbW9kaWZpZWQgY2hhcmFjdGVyIGZvcgorICAgICAgICogICB0aGlzIGtl eSBjb21iaW5hdGlvbiBhbmQgbm8gY2hhcmFjdGVyIGlzIGluc2VydGVkIGludG8gdGhlCisgICAg ICAgKiAgIGRvY3VtZW50LCBidXQgRkYgZmlyZXMgdGhlIGtleXByZXNzIGZvciBjaGFyIGNvZGUg YDEwMGAgYW55d2F5LgorICAgICAgICogICBObyBgaW5wdXRgIGV2ZW50IHdpbGwgb2NjdXIuCisg ICAgICAgKgorICAgICAgICogLSBgd2hpY2hgIGlzIHRoZSBwcmVzc2VkIGtleSBjb2RlLCBidXQg YSBjb21tYW5kIGNvbWJpbmF0aW9uIGlzCisgICAgICAgKiAgIGJlaW5nIHVzZWQuIEV4OiBgQ21k K0NgLiBObyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQsIGFuZCBubworICAgICAgICogICBgaW5wdXRg IGV2ZW50IHdpbGwgb2NjdXIuCisgICAgICAgKi8KKyAgICAgIGlmIChuYXRpdmVFdmVudC53aGlj aCAmJiAhaXNLZXlwcmVzc0NvbW1hbmQobmF0aXZlRXZlbnQpKSB7CisgICAgICAgIHJldHVybiBT dHJpbmcuZnJvbUNoYXJDb2RlKG5hdGl2ZUV2ZW50LndoaWNoKTsKKyAgICAgIH0KKyAgICAgIHJl dHVybiBudWxsOworICAgIGNhc2UgJ3RvcENvbXBvc2l0aW9uRW5kJzoKKyAgICAgIHJldHVybiB1 c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSA/IG51bGwgOiBuYXRpdmVFdmVudC5kYXRhOworICAg IGRlZmF1bHQ6CisgICAgICByZXR1cm4gbnVsbDsKKyAgfQorfQorCisvKioKKyAqIEV4dHJhY3Qg YSBTeW50aGV0aWNJbnB1dEV2ZW50IGZvciBgYmVmb3JlSW5wdXRgLCBiYXNlZCBvbiBlaXRoZXIg bmF0aXZlCisgKiBgdGV4dElucHV0YCBvciBmYWxsYmFjayBiZWhhdmlvci4KKyAqCisgKiBAcmV0 dXJuIHs/b2JqZWN0fSBBIFN5bnRoZXRpY0lucHV0RXZlbnQuCisgKi8KK2Z1bmN0aW9uIGV4dHJh Y3RCZWZvcmVJbnB1dEV2ZW50KHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQs IG5hdGl2ZUV2ZW50VGFyZ2V0KSB7CisgIHZhciBjaGFyczsKKworICBpZiAoY2FuVXNlVGV4dElu cHV0RXZlbnQpIHsKKyAgICBjaGFycyA9IGdldE5hdGl2ZUJlZm9yZUlucHV0Q2hhcnModG9wTGV2 ZWxUeXBlLCBuYXRpdmVFdmVudCk7CisgIH0gZWxzZSB7CisgICAgY2hhcnMgPSBnZXRGYWxsYmFj a0JlZm9yZUlucHV0Q2hhcnModG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCk7CisgIH0KKworICAv LyBJZiBubyBjaGFyYWN0ZXJzIGFyZSBiZWluZyBpbnNlcnRlZCwgbm8gQmVmb3JlSW5wdXQgZXZl bnQgc2hvdWxkCisgIC8vIGJlIGZpcmVkLgorICBpZiAoIWNoYXJzKSB7CisgICAgcmV0dXJuIG51 bGw7CisgIH0KKworICB2YXIgZXZlbnQgPSBTeW50aGV0aWNJbnB1dEV2ZW50LmdldFBvb2xlZChl dmVudFR5cGVzLmJlZm9yZUlucHV0LCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZl bnRUYXJnZXQpOworCisgIGV2ZW50LmRhdGEgPSBjaGFyczsKKyAgRXZlbnRQcm9wYWdhdG9ycy5h Y2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGV2ZW50KTsKKyAgcmV0dXJuIGV2ZW50OworfQor CisvKioKKyAqIENyZWF0ZSBhbiBgb25CZWZvcmVJbnB1dGAgZXZlbnQgdG8gbWF0Y2gKKyAqIGh0 dHA6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMTMxMTA1LyNl dmVudHMtaW5wdXRldmVudHMuCisgKgorICogVGhpcyBldmVudCBwbHVnaW4gaXMgYmFzZWQgb24g dGhlIG5hdGl2ZSBgdGV4dElucHV0YCBldmVudAorICogYXZhaWxhYmxlIGluIENocm9tZSwgU2Fm YXJpLCBPcGVyYSwgYW5kIElFLiBUaGlzIGV2ZW50IGZpcmVzIGFmdGVyCisgKiBgb25LZXlQcmVz c2AgYW5kIGBvbkNvbXBvc2l0aW9uRW5kYCwgYnV0IGJlZm9yZSBgb25JbnB1dGAuCisgKgorICog YGJlZm9yZUlucHV0YCBpcyBzcGVjJ2QgYnV0IG5vdCBpbXBsZW1lbnRlZCBpbiBhbnkgYnJvd3Nl cnMsIGFuZAorICogdGhlIGBpbnB1dGAgZXZlbnQgZG9lcyBub3QgcHJvdmlkZSBhbnkgdXNlZnVs IGluZm9ybWF0aW9uIGFib3V0IHdoYXQgaGFzCisgKiBhY3R1YWxseSBiZWVuIGFkZGVkLCBjb250 cmFyeSB0byB0aGUgc3BlYy4gVGh1cywgYHRleHRJbnB1dGAgaXMgdGhlIGJlc3QKKyAqIGF2YWls YWJsZSBldmVudCB0byBpZGVudGlmeSB0aGUgY2hhcmFjdGVycyB0aGF0IGhhdmUgYWN0dWFsbHkg YmVlbiBpbnNlcnRlZAorICogaW50byB0aGUgdGFyZ2V0IG5vZGUuCisgKgorICogVGhpcyBwbHVn aW4gaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgZW1pdHRpbmcgYGNvbXBvc2l0aW9uYCBldmVudHMs IHRodXMKKyAqIGFsbG93aW5nIHVzIHRvIHNoYXJlIGNvbXBvc2l0aW9uIGZhbGxiYWNrIGNvZGUg Zm9yIGJvdGggYGJlZm9yZUlucHV0YCBhbmQKKyAqIGBjb21wb3NpdGlvbmAgZXZlbnQgdHlwZXMu CisgKi8KK3ZhciBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luID0geworCisgIGV2ZW50VHlwZXM6IGV2 ZW50VHlwZXMsCisKKyAgZXh0cmFjdEV2ZW50czogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgdGFy Z2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7CisgICAgcmV0dXJuIFtl eHRyYWN0Q29tcG9zaXRpb25FdmVudCh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2 ZW50LCBuYXRpdmVFdmVudFRhcmdldCksIGV4dHJhY3RCZWZvcmVJbnB1dEV2ZW50KHRvcExldmVs VHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KV07CisgIH0K K307CisKK21vZHVsZS5leHBvcnRzID0gQmVmb3JlSW5wdXRFdmVudFBsdWdpbjsKXCBObyBuZXds aW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9y L3JlYWN0LWRvbS9saWIvQ1NTUHJvcGVydHkuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9y L3JlYWN0LWRvbS9saWIvQ1NTUHJvcGVydHkuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAuLjRjMzE5ODcwCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGlj L3ZlbmRvci9yZWFjdC1kb20vbGliL0NTU1Byb3BlcnR5LmpzCkBAIC0wLDAgKzEsMTQ3IEBACisv KioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmln aHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIg dGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRo ZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50 CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGlu IHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCisvKioKKyAq IENTUyBwcm9wZXJ0aWVzIHdoaWNoIGFjY2VwdCBudW1iZXJzIGJ1dCBhcmUgbm90IGluIHVuaXRz IG9mICJweCIuCisgKi8KKwordmFyIGlzVW5pdGxlc3NOdW1iZXIgPSB7CisgIGFuaW1hdGlvbkl0 ZXJhdGlvbkNvdW50OiB0cnVlLAorICBib3JkZXJJbWFnZU91dHNldDogdHJ1ZSwKKyAgYm9yZGVy SW1hZ2VTbGljZTogdHJ1ZSwKKyAgYm9yZGVySW1hZ2VXaWR0aDogdHJ1ZSwKKyAgYm94RmxleDog dHJ1ZSwKKyAgYm94RmxleEdyb3VwOiB0cnVlLAorICBib3hPcmRpbmFsR3JvdXA6IHRydWUsCisg IGNvbHVtbkNvdW50OiB0cnVlLAorICBmbGV4OiB0cnVlLAorICBmbGV4R3JvdzogdHJ1ZSwKKyAg ZmxleFBvc2l0aXZlOiB0cnVlLAorICBmbGV4U2hyaW5rOiB0cnVlLAorICBmbGV4TmVnYXRpdmU6 IHRydWUsCisgIGZsZXhPcmRlcjogdHJ1ZSwKKyAgZ3JpZFJvdzogdHJ1ZSwKKyAgZ3JpZENvbHVt bjogdHJ1ZSwKKyAgZm9udFdlaWdodDogdHJ1ZSwKKyAgbGluZUNsYW1wOiB0cnVlLAorICBsaW5l SGVpZ2h0OiB0cnVlLAorICBvcGFjaXR5OiB0cnVlLAorICBvcmRlcjogdHJ1ZSwKKyAgb3JwaGFu czogdHJ1ZSwKKyAgdGFiU2l6ZTogdHJ1ZSwKKyAgd2lkb3dzOiB0cnVlLAorICB6SW5kZXg6IHRy dWUsCisgIHpvb206IHRydWUsCisKKyAgLy8gU1ZHLXJlbGF0ZWQgcHJvcGVydGllcworICBmaWxs T3BhY2l0eTogdHJ1ZSwKKyAgZmxvb2RPcGFjaXR5OiB0cnVlLAorICBzdG9wT3BhY2l0eTogdHJ1 ZSwKKyAgc3Ryb2tlRGFzaGFycmF5OiB0cnVlLAorICBzdHJva2VEYXNob2Zmc2V0OiB0cnVlLAor ICBzdHJva2VNaXRlcmxpbWl0OiB0cnVlLAorICBzdHJva2VPcGFjaXR5OiB0cnVlLAorICBzdHJv a2VXaWR0aDogdHJ1ZQorfTsKKworLyoqCisgKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4IHZlbmRv ci1zcGVjaWZpYyBwcmVmaXgsIGVnOiBXZWJraXQKKyAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgc3R5 bGUgbmFtZSwgZWc6IHRyYW5zaXRpb25EdXJhdGlvbgorICogQHJldHVybiB7c3RyaW5nfSBzdHls ZSBuYW1lIHByZWZpeGVkIHdpdGggYHByZWZpeGAsIHByb3Blcmx5IGNhbWVsQ2FzZWQsIGVnOgor ICogV2Via2l0VHJhbnNpdGlvbkR1cmF0aW9uCisgKi8KK2Z1bmN0aW9uIHByZWZpeEtleShwcmVm aXgsIGtleSkgeworICByZXR1cm4gcHJlZml4ICsga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgp ICsga2V5LnN1YnN0cmluZygxKTsKK30KKworLyoqCisgKiBTdXBwb3J0IHN0eWxlIG5hbWVzIHRo YXQgbWF5IGNvbWUgcGFzc2VkIGluIHByZWZpeGVkIGJ5IGFkZGluZyBwZXJtdXRhdGlvbnMKKyAq IG9mIHZlbmRvciBwcmVmaXhlcy4KKyAqLwordmFyIHByZWZpeGVzID0gWydXZWJraXQnLCAnbXMn LCAnTW96JywgJ08nXTsKKworLy8gVXNpbmcgT2JqZWN0LmtleXMgaGVyZSwgb3IgZWxzZSB0aGUg dmFuaWxsYSBmb3ItaW4gbG9vcCBtYWtlcyBJRTggZ28gaW50byBhbgorLy8gaW5maW5pdGUgbG9v cCwgYmVjYXVzZSBpdCBpdGVyYXRlcyBvdmVyIHRoZSBuZXdseSBhZGRlZCBwcm9wcyB0b28uCitP YmplY3Qua2V5cyhpc1VuaXRsZXNzTnVtYmVyKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7Cisg IHByZWZpeGVzLmZvckVhY2goZnVuY3Rpb24gKHByZWZpeCkgeworICAgIGlzVW5pdGxlc3NOdW1i ZXJbcHJlZml4S2V5KHByZWZpeCwgcHJvcCldID0gaXNVbml0bGVzc051bWJlcltwcm9wXTsKKyAg fSk7Cit9KTsKKworLyoqCisgKiBNb3N0IHN0eWxlIHByb3BlcnRpZXMgY2FuIGJlIHVuc2V0IGJ5 IGRvaW5nIC5zdHlsZVtwcm9wXSA9ICcnIGJ1dCBJRTgKKyAqIGRvZXNuJ3QgbGlrZSBkb2luZyB0 aGF0IHdpdGggc2hvcnRoYW5kIHByb3BlcnRpZXMgc28gZm9yIHRoZSBwcm9wZXJ0aWVzIHRoYXQK KyAqIElFOCBicmVha3Mgb24sIHdoaWNoIGFyZSBsaXN0ZWQgaGVyZSwgd2UgaW5zdGVhZCB1bnNl dCBlYWNoIG9mIHRoZQorICogaW5kaXZpZHVhbCBwcm9wZXJ0aWVzLiBTZWUgaHR0cDovL2J1Z3Mu anF1ZXJ5LmNvbS90aWNrZXQvMTIzODUuCisgKiBUaGUgNC12YWx1ZSAnY2xvY2snIHByb3BlcnRp ZXMgbGlrZSBtYXJnaW4sIHBhZGRpbmcsIGJvcmRlci13aWR0aCBzZWVtIHRvCisgKiBiZWhhdmUg d2l0aG91dCBhbnkgcHJvYmxlbXMuIEN1cmlvdXNseSwgbGlzdC1zdHlsZSB3b3JrcyB0b28gd2l0 aG91dCBhbnkKKyAqIHNwZWNpYWwgcHJvZGRpbmcuCisgKi8KK3ZhciBzaG9ydGhhbmRQcm9wZXJ0 eUV4cGFuc2lvbnMgPSB7CisgIGJhY2tncm91bmQ6IHsKKyAgICBiYWNrZ3JvdW5kQXR0YWNobWVu dDogdHJ1ZSwKKyAgICBiYWNrZ3JvdW5kQ29sb3I6IHRydWUsCisgICAgYmFja2dyb3VuZEltYWdl OiB0cnVlLAorICAgIGJhY2tncm91bmRQb3NpdGlvblg6IHRydWUsCisgICAgYmFja2dyb3VuZFBv c2l0aW9uWTogdHJ1ZSwKKyAgICBiYWNrZ3JvdW5kUmVwZWF0OiB0cnVlCisgIH0sCisgIGJhY2tn cm91bmRQb3NpdGlvbjogeworICAgIGJhY2tncm91bmRQb3NpdGlvblg6IHRydWUsCisgICAgYmFj a2dyb3VuZFBvc2l0aW9uWTogdHJ1ZQorICB9LAorICBib3JkZXI6IHsKKyAgICBib3JkZXJXaWR0 aDogdHJ1ZSwKKyAgICBib3JkZXJTdHlsZTogdHJ1ZSwKKyAgICBib3JkZXJDb2xvcjogdHJ1ZQor ICB9LAorICBib3JkZXJCb3R0b206IHsKKyAgICBib3JkZXJCb3R0b21XaWR0aDogdHJ1ZSwKKyAg ICBib3JkZXJCb3R0b21TdHlsZTogdHJ1ZSwKKyAgICBib3JkZXJCb3R0b21Db2xvcjogdHJ1ZQor ICB9LAorICBib3JkZXJMZWZ0OiB7CisgICAgYm9yZGVyTGVmdFdpZHRoOiB0cnVlLAorICAgIGJv cmRlckxlZnRTdHlsZTogdHJ1ZSwKKyAgICBib3JkZXJMZWZ0Q29sb3I6IHRydWUKKyAgfSwKKyAg Ym9yZGVyUmlnaHQ6IHsKKyAgICBib3JkZXJSaWdodFdpZHRoOiB0cnVlLAorICAgIGJvcmRlclJp Z2h0U3R5bGU6IHRydWUsCisgICAgYm9yZGVyUmlnaHRDb2xvcjogdHJ1ZQorICB9LAorICBib3Jk ZXJUb3A6IHsKKyAgICBib3JkZXJUb3BXaWR0aDogdHJ1ZSwKKyAgICBib3JkZXJUb3BTdHlsZTog dHJ1ZSwKKyAgICBib3JkZXJUb3BDb2xvcjogdHJ1ZQorICB9LAorICBmb250OiB7CisgICAgZm9u dFN0eWxlOiB0cnVlLAorICAgIGZvbnRWYXJpYW50OiB0cnVlLAorICAgIGZvbnRXZWlnaHQ6IHRy dWUsCisgICAgZm9udFNpemU6IHRydWUsCisgICAgbGluZUhlaWdodDogdHJ1ZSwKKyAgICBmb250 RmFtaWx5OiB0cnVlCisgIH0sCisgIG91dGxpbmU6IHsKKyAgICBvdXRsaW5lV2lkdGg6IHRydWUs CisgICAgb3V0bGluZVN0eWxlOiB0cnVlLAorICAgIG91dGxpbmVDb2xvcjogdHJ1ZQorICB9Cit9 OworCit2YXIgQ1NTUHJvcGVydHkgPSB7CisgIGlzVW5pdGxlc3NOdW1iZXI6IGlzVW5pdGxlc3NO dW1iZXIsCisgIHNob3J0aGFuZFByb3BlcnR5RXhwYW5zaW9uczogc2hvcnRoYW5kUHJvcGVydHlF eHBhbnNpb25zCit9OworCittb2R1bGUuZXhwb3J0cyA9IENTU1Byb3BlcnR5OwpcIE5vIG5ld2xp bmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3Iv cmVhY3QtZG9tL2xpYi9DU1NQcm9wZXJ0eU9wZXJhdGlvbnMuanMgYi93ZWIvcGdhZG1pbi9zdGF0 aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvQ1NTUHJvcGVydHlPcGVyYXRpb25zLmpzCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi4wMzgzN2Q4YwotLS0gL2Rldi9udWxsCisrKyBi L3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9DU1NQcm9wZXJ0eU9wZXJh dGlvbnMuanMKQEAgLTAsMCArMSwyMDggQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2Vu dCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBz b3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQg aW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291 cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJl IGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAq LworCisndXNlIHN0cmljdCc7CisKK3ZhciBDU1NQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vQ1NTUHJv cGVydHknKTsKK3ZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4 ZWN1dGlvbkVudmlyb25tZW50Jyk7Cit2YXIgUmVhY3RJbnN0cnVtZW50YXRpb24gPSByZXF1aXJl KCcuL1JlYWN0SW5zdHJ1bWVudGF0aW9uJyk7CisKK3ZhciBjYW1lbGl6ZVN0eWxlTmFtZSA9IHJl cXVpcmUoJ2ZianMvbGliL2NhbWVsaXplU3R5bGVOYW1lJyk7Cit2YXIgZGFuZ2Vyb3VzU3R5bGVW YWx1ZSA9IHJlcXVpcmUoJy4vZGFuZ2Vyb3VzU3R5bGVWYWx1ZScpOwordmFyIGh5cGhlbmF0ZVN0 eWxlTmFtZSA9IHJlcXVpcmUoJ2ZianMvbGliL2h5cGhlbmF0ZVN0eWxlTmFtZScpOwordmFyIG1l bW9pemVTdHJpbmdPbmx5ID0gcmVxdWlyZSgnZmJqcy9saWIvbWVtb2l6ZVN0cmluZ09ubHknKTsK K3ZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpOworCit2YXIgcHJvY2Vz c1N0eWxlTmFtZSA9IG1lbW9pemVTdHJpbmdPbmx5KGZ1bmN0aW9uIChzdHlsZU5hbWUpIHsKKyAg cmV0dXJuIGh5cGhlbmF0ZVN0eWxlTmFtZShzdHlsZU5hbWUpOworfSk7CisKK3ZhciBoYXNTaG9y dGhhbmRQcm9wZXJ0eUJ1ZyA9IGZhbHNlOwordmFyIHN0eWxlRmxvYXRBY2Nlc3NvciA9ICdjc3NG bG9hdCc7CitpZiAoRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NKSB7CisgIHZhciB0ZW1w U3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5zdHlsZTsKKyAgdHJ5IHsKKyAg ICAvLyBJRTggdGhyb3dzICJJbnZhbGlkIGFyZ3VtZW50LiIgaWYgcmVzZXR0aW5nIHNob3J0aGFu ZCBzdHlsZSBwcm9wZXJ0aWVzLgorICAgIHRlbXBTdHlsZS5mb250ID0gJyc7CisgIH0gY2F0Y2gg KGUpIHsKKyAgICBoYXNTaG9ydGhhbmRQcm9wZXJ0eUJ1ZyA9IHRydWU7CisgIH0KKyAgLy8gSUU4 IG9ubHkgc3VwcG9ydHMgYWNjZXNzaW5nIGNzc0Zsb2F0IChzdGFuZGFyZCkgYXMgc3R5bGVGbG9h dAorICBpZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmNzc0Zsb2F0ID09PSB1bmRl ZmluZWQpIHsKKyAgICBzdHlsZUZsb2F0QWNjZXNzb3IgPSAnc3R5bGVGbG9hdCc7CisgIH0KK30K KworaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgLy8gJ21z VHJhbnNmb3JtJyBpcyBjb3JyZWN0LCBidXQgdGhlIG90aGVyIHByZWZpeGVzIHNob3VsZCBiZSBj YXBpdGFsaXplZAorICB2YXIgYmFkVmVuZG9yZWRTdHlsZU5hbWVQYXR0ZXJuID0gL14oPzp3ZWJr aXR8bW96fG8pW0EtWl0vOworCisgIC8vIHN0eWxlIHZhbHVlcyBzaG91bGRuJ3QgY29udGFpbiBh IHNlbWljb2xvbgorICB2YXIgYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuID0gLztc cyokLzsKKworICB2YXIgd2FybmVkU3R5bGVOYW1lcyA9IHt9OworICB2YXIgd2FybmVkU3R5bGVW YWx1ZXMgPSB7fTsKKyAgdmFyIHdhcm5lZEZvck5hTlZhbHVlID0gZmFsc2U7CisKKyAgdmFyIHdh cm5IeXBoZW5hdGVkU3R5bGVOYW1lID0gZnVuY3Rpb24gKG5hbWUsIG93bmVyKSB7CisgICAgaWYg KHdhcm5lZFN0eWxlTmFtZXMuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgd2FybmVkU3R5bGVOYW1l c1tuYW1lXSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdhcm5lZFN0eWxlTmFtZXNb bmFtZV0gPSB0cnVlOworICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicg PyB3YXJuaW5nKGZhbHNlLCAnVW5zdXBwb3J0ZWQgc3R5bGUgcHJvcGVydHkgJXMuIERpZCB5b3Ug bWVhbiAlcz8lcycsIG5hbWUsIGNhbWVsaXplU3R5bGVOYW1lKG5hbWUpLCBjaGVja1JlbmRlck1l c3NhZ2Uob3duZXIpKSA6IHZvaWQgMDsKKyAgfTsKKworICB2YXIgd2FybkJhZFZlbmRvcmVkU3R5 bGVOYW1lID0gZnVuY3Rpb24gKG5hbWUsIG93bmVyKSB7CisgICAgaWYgKHdhcm5lZFN0eWxlTmFt ZXMuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSkgeworICAg ICAgcmV0dXJuOworICAgIH0KKworICAgIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0gPSB0cnVlOwor ICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNl LCAnVW5zdXBwb3J0ZWQgdmVuZG9yLXByZWZpeGVkIHN0eWxlIHByb3BlcnR5ICVzLiBEaWQgeW91 IG1lYW4gJXM/JXMnLCBuYW1lLCBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5z bGljZSgxKSwgY2hlY2tSZW5kZXJNZXNzYWdlKG93bmVyKSkgOiB2b2lkIDA7CisgIH07CisKKyAg dmFyIHdhcm5TdHlsZVZhbHVlV2l0aFNlbWljb2xvbiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwg b3duZXIpIHsKKyAgICBpZiAod2FybmVkU3R5bGVWYWx1ZXMuaGFzT3duUHJvcGVydHkodmFsdWUp ICYmIHdhcm5lZFN0eWxlVmFsdWVzW3ZhbHVlXSkgeworICAgICAgcmV0dXJuOworICAgIH0KKwor ICAgIHdhcm5lZFN0eWxlVmFsdWVzW3ZhbHVlXSA9IHRydWU7CisgICAgcHJvY2Vzcy5lbnYuTk9E RV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdTdHlsZSBwcm9wZXJ0eSB2 YWx1ZXMgc2hvdWxkblwndCBjb250YWluIGEgc2VtaWNvbG9uLiVzICcgKyAnVHJ5ICIlczogJXMi IGluc3RlYWQuJywgY2hlY2tSZW5kZXJNZXNzYWdlKG93bmVyKSwgbmFtZSwgdmFsdWUucmVwbGFj ZShiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4sICcnKSkgOiB2b2lkIDA7CisgIH07 CisKKyAgdmFyIHdhcm5TdHlsZVZhbHVlSXNOYU4gPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIG93 bmVyKSB7CisgICAgaWYgKHdhcm5lZEZvck5hTlZhbHVlKSB7CisgICAgICByZXR1cm47CisgICAg fQorCisgICAgd2FybmVkRm9yTmFOVmFsdWUgPSB0cnVlOworICAgIHByb2Nlc3MuZW52Lk5PREVf RU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnYE5hTmAgaXMgYW4gaW52YWxp ZCB2YWx1ZSBmb3IgdGhlIGAlc2AgY3NzIHN0eWxlIHByb3BlcnR5LiVzJywgbmFtZSwgY2hlY2tS ZW5kZXJNZXNzYWdlKG93bmVyKSkgOiB2b2lkIDA7CisgIH07CisKKyAgdmFyIGNoZWNrUmVuZGVy TWVzc2FnZSA9IGZ1bmN0aW9uIChvd25lcikgeworICAgIGlmIChvd25lcikgeworICAgICAgdmFy IG5hbWUgPSBvd25lci5nZXROYW1lKCk7CisgICAgICBpZiAobmFtZSkgeworICAgICAgICByZXR1 cm4gJyBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nOworICAgICAg fQorICAgIH0KKyAgICByZXR1cm4gJyc7CisgIH07CisKKyAgLyoqCisgICAqIEBwYXJhbSB7c3Ry aW5nfSBuYW1lCisgICAqIEBwYXJhbSB7Kn0gdmFsdWUKKyAgICogQHBhcmFtIHtSZWFjdERPTUNv bXBvbmVudH0gY29tcG9uZW50CisgICAqLworICB2YXIgd2FyblZhbGlkU3R5bGUgPSBmdW5jdGlv biAobmFtZSwgdmFsdWUsIGNvbXBvbmVudCkgeworICAgIHZhciBvd25lcjsKKyAgICBpZiAoY29t cG9uZW50KSB7CisgICAgICBvd25lciA9IGNvbXBvbmVudC5fY3VycmVudEVsZW1lbnQuX293bmVy OworICAgIH0KKyAgICBpZiAobmFtZS5pbmRleE9mKCctJykgPiAtMSkgeworICAgICAgd2Fybkh5 cGhlbmF0ZWRTdHlsZU5hbWUobmFtZSwgb3duZXIpOworICAgIH0gZWxzZSBpZiAoYmFkVmVuZG9y ZWRTdHlsZU5hbWVQYXR0ZXJuLnRlc3QobmFtZSkpIHsKKyAgICAgIHdhcm5CYWRWZW5kb3JlZFN0 eWxlTmFtZShuYW1lLCBvd25lcik7CisgICAgfSBlbHNlIGlmIChiYWRTdHlsZVZhbHVlV2l0aFNl bWljb2xvblBhdHRlcm4udGVzdCh2YWx1ZSkpIHsKKyAgICAgIHdhcm5TdHlsZVZhbHVlV2l0aFNl bWljb2xvbihuYW1lLCB2YWx1ZSwgb3duZXIpOworICAgIH0KKworICAgIGlmICh0eXBlb2YgdmFs dWUgPT09ICdudW1iZXInICYmIGlzTmFOKHZhbHVlKSkgeworICAgICAgd2FyblN0eWxlVmFsdWVJ c05hTihuYW1lLCB2YWx1ZSwgb3duZXIpOworICAgIH0KKyAgfTsKK30KKworLyoqCisgKiBPcGVy YXRpb25zIGZvciBkZWFsaW5nIHdpdGggQ1NTIHByb3BlcnRpZXMuCisgKi8KK3ZhciBDU1NQcm9w ZXJ0eU9wZXJhdGlvbnMgPSB7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6ZXMgYSBtYXBwaW5nIG9m IHN0eWxlIHByb3BlcnRpZXMgZm9yIHVzZSBhcyBpbmxpbmUgc3R5bGVzOgorICAgKgorICAgKiAg ID4gY3JlYXRlTWFya3VwRm9yU3R5bGVzKHt3aWR0aDogJzIwMHB4JywgaGVpZ2h0OiAwfSkKKyAg ICogICAid2lkdGg6MjAwcHg7aGVpZ2h0OjA7IgorICAgKgorICAgKiBVbmRlZmluZWQgdmFsdWVz IGFyZSBpZ25vcmVkIHNvIHRoYXQgZGVjbGFyYXRpdmUgcHJvZ3JhbW1pbmcgaXMgZWFzaWVyLgor ICAgKiBUaGUgcmVzdWx0IHNob3VsZCBiZSBIVE1MLWVzY2FwZWQgYmVmb3JlIGluc2VydGlvbiBp bnRvIHRoZSBET00uCisgICAqCisgICAqIEBwYXJhbSB7b2JqZWN0fSBzdHlsZXMKKyAgICogQHBh cmFtIHtSZWFjdERPTUNvbXBvbmVudH0gY29tcG9uZW50CisgICAqIEByZXR1cm4gez9zdHJpbmd9 CisgICAqLworICBjcmVhdGVNYXJrdXBGb3JTdHlsZXM6IGZ1bmN0aW9uIChzdHlsZXMsIGNvbXBv bmVudCkgeworICAgIHZhciBzZXJpYWxpemVkID0gJyc7CisgICAgZm9yICh2YXIgc3R5bGVOYW1l IGluIHN0eWxlcykgeworICAgICAgaWYgKCFzdHlsZXMuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1l KSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHZhciBzdHlsZVZhbHVlID0g c3R5bGVzW3N0eWxlTmFtZV07CisgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdw cm9kdWN0aW9uJykgeworICAgICAgICB3YXJuVmFsaWRTdHlsZShzdHlsZU5hbWUsIHN0eWxlVmFs dWUsIGNvbXBvbmVudCk7CisgICAgICB9CisgICAgICBpZiAoc3R5bGVWYWx1ZSAhPSBudWxsKSB7 CisgICAgICAgIHNlcmlhbGl6ZWQgKz0gcHJvY2Vzc1N0eWxlTmFtZShzdHlsZU5hbWUpICsgJzon OworICAgICAgICBzZXJpYWxpemVkICs9IGRhbmdlcm91c1N0eWxlVmFsdWUoc3R5bGVOYW1lLCBz dHlsZVZhbHVlLCBjb21wb25lbnQpICsgJzsnOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4g c2VyaWFsaXplZCB8fCBudWxsOworICB9LAorCisgIC8qKgorICAgKiBTZXRzIHRoZSB2YWx1ZSBm b3IgbXVsdGlwbGUgc3R5bGVzIG9uIGEgbm9kZS4gIElmIGEgdmFsdWUgaXMgc3BlY2lmaWVkIGFz CisgICAqICcnIChlbXB0eSBzdHJpbmcpLCB0aGUgY29ycmVzcG9uZGluZyBzdHlsZSBwcm9wZXJ0 eSB3aWxsIGJlIHVuc2V0LgorICAgKgorICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGUKKyAg ICogQHBhcmFtIHtvYmplY3R9IHN0eWxlcworICAgKiBAcGFyYW0ge1JlYWN0RE9NQ29tcG9uZW50 fSBjb21wb25lbnQKKyAgICovCisgIHNldFZhbHVlRm9yU3R5bGVzOiBmdW5jdGlvbiAobm9kZSwg c3R5bGVzLCBjb21wb25lbnQpIHsKKyAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdw cm9kdWN0aW9uJykgeworICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9z dE9wZXJhdGlvbih7CisgICAgICAgIGluc3RhbmNlSUQ6IGNvbXBvbmVudC5fZGVidWdJRCwKKyAg ICAgICAgdHlwZTogJ3VwZGF0ZSBzdHlsZXMnLAorICAgICAgICBwYXlsb2FkOiBzdHlsZXMKKyAg ICAgIH0pOworICAgIH0KKworICAgIHZhciBzdHlsZSA9IG5vZGUuc3R5bGU7CisgICAgZm9yICh2 YXIgc3R5bGVOYW1lIGluIHN0eWxlcykgeworICAgICAgaWYgKCFzdHlsZXMuaGFzT3duUHJvcGVy dHkoc3R5bGVOYW1lKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChw cm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAgIHdhcm5WYWxp ZFN0eWxlKHN0eWxlTmFtZSwgc3R5bGVzW3N0eWxlTmFtZV0sIGNvbXBvbmVudCk7CisgICAgICB9 CisgICAgICB2YXIgc3R5bGVWYWx1ZSA9IGRhbmdlcm91c1N0eWxlVmFsdWUoc3R5bGVOYW1lLCBz dHlsZXNbc3R5bGVOYW1lXSwgY29tcG9uZW50KTsKKyAgICAgIGlmIChzdHlsZU5hbWUgPT09ICdm bG9hdCcgfHwgc3R5bGVOYW1lID09PSAnY3NzRmxvYXQnKSB7CisgICAgICAgIHN0eWxlTmFtZSA9 IHN0eWxlRmxvYXRBY2Nlc3NvcjsKKyAgICAgIH0KKyAgICAgIGlmIChzdHlsZVZhbHVlKSB7Cisg ICAgICAgIHN0eWxlW3N0eWxlTmFtZV0gPSBzdHlsZVZhbHVlOworICAgICAgfSBlbHNlIHsKKyAg ICAgICAgdmFyIGV4cGFuc2lvbiA9IGhhc1Nob3J0aGFuZFByb3BlcnR5QnVnICYmIENTU1Byb3Bl cnR5LnNob3J0aGFuZFByb3BlcnR5RXhwYW5zaW9uc1tzdHlsZU5hbWVdOworICAgICAgICBpZiAo ZXhwYW5zaW9uKSB7CisgICAgICAgICAgLy8gU2hvcnRoYW5kIHByb3BlcnR5IHRoYXQgSUU4IHdv bid0IGxpa2UgdW5zZXR0aW5nLCBzbyB1bnNldCBlYWNoCisgICAgICAgICAgLy8gY29tcG9uZW50 IHRvIHBsYWNhdGUgaXQKKyAgICAgICAgICBmb3IgKHZhciBpbmRpdmlkdWFsU3R5bGVOYW1lIGlu IGV4cGFuc2lvbikgeworICAgICAgICAgICAgc3R5bGVbaW5kaXZpZHVhbFN0eWxlTmFtZV0gPSAn JzsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3R5bGVbc3R5bGVO YW1lXSA9ICcnOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKK307CisKK21vZHVs ZS5leHBvcnRzID0gQ1NTUHJvcGVydHlPcGVyYXRpb25zOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9m IGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xp Yi9DYWxsYmFja1F1ZXVlLmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20v bGliL0NhbGxiYWNrUXVldWUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAu LjQ0MDVjNWY0Ci0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9y ZWFjdC1kb20vbGliL0NhbGxiYWNrUXVldWUuanMKQEAgLTAsMCArMSwxMTggQEAKKy8qKgorICog Q29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVz ZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNE LXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qg ZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9m IHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNh bWUgZGlyZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9wcm9k SW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTsKKworZnVuY3Rpb24g X2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBp bnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2Fs bCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9CisKK3ZhciBQb29sZWRDbGFzcyA9IHJlcXVp cmUoJy4vUG9vbGVkQ2xhc3MnKTsKKwordmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGli L2ludmFyaWFudCcpOworCisvKioKKyAqIEEgc3BlY2lhbGl6ZWQgcHNldWRvLWV2ZW50IG1vZHVs ZSB0byBoZWxwIGtlZXAgdHJhY2sgb2YgY29tcG9uZW50cyB3YWl0aW5nIHRvCisgKiBiZSBub3Rp ZmllZCB3aGVuIHRoZWlyIERPTSByZXByZXNlbnRhdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgdXNl LgorICoKKyAqIFRoaXMgaW1wbGVtZW50cyBgUG9vbGVkQ2xhc3NgLCBzbyB5b3Ugc2hvdWxkIG5l dmVyIG5lZWQgdG8gaW5zdGFudGlhdGUgdGhpcy4KKyAqIEluc3RlYWQsIHVzZSBgQ2FsbGJhY2tR dWV1ZS5nZXRQb29sZWQoKWAuCisgKgorICogQGNsYXNzIFJlYWN0TW91bnRSZWFkeQorICogQGlt cGxlbWVudHMgUG9vbGVkQ2xhc3MKKyAqIEBpbnRlcm5hbAorICovCisKK3ZhciBDYWxsYmFja1F1 ZXVlID0gZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBDYWxsYmFja1F1ZXVlKGFyZykgeworICAg IF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDYWxsYmFja1F1ZXVlKTsKKworICAgIHRoaXMuX2NhbGxi YWNrcyA9IG51bGw7CisgICAgdGhpcy5fY29udGV4dHMgPSBudWxsOworICAgIHRoaXMuX2FyZyA9 IGFyZzsKKyAgfQorCisgIC8qKgorICAgKiBFbnF1ZXVlcyBhIGNhbGxiYWNrIHRvIGJlIGludm9r ZWQgd2hlbiBgbm90aWZ5QWxsYCBpcyBpbnZva2VkLgorICAgKgorICAgKiBAcGFyYW0ge2Z1bmN0 aW9ufSBjYWxsYmFjayBJbnZva2VkIHdoZW4gYG5vdGlmeUFsbGAgaXMgaW52b2tlZC4KKyAgICog QHBhcmFtIHs/b2JqZWN0fSBjb250ZXh0IENvbnRleHQgdG8gY2FsbCBgY2FsbGJhY2tgIHdpdGgu CisgICAqIEBpbnRlcm5hbAorICAgKi8KKworCisgIENhbGxiYWNrUXVldWUucHJvdG90eXBlLmVu cXVldWUgPSBmdW5jdGlvbiBlbnF1ZXVlKGNhbGxiYWNrLCBjb250ZXh0KSB7CisgICAgdGhpcy5f Y2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IFtdOworICAgIHRoaXMuX2NhbGxiYWNrcy5w dXNoKGNhbGxiYWNrKTsKKyAgICB0aGlzLl9jb250ZXh0cyA9IHRoaXMuX2NvbnRleHRzIHx8IFtd OworICAgIHRoaXMuX2NvbnRleHRzLnB1c2goY29udGV4dCk7CisgIH07CisKKyAgLyoqCisgICAq IEludm9rZXMgYWxsIGVucXVldWVkIGNhbGxiYWNrcyBhbmQgY2xlYXJzIHRoZSBxdWV1ZS4gVGhp cyBpcyBpbnZva2VkIGFmdGVyCisgICAqIHRoZSBET00gcmVwcmVzZW50YXRpb24gb2YgYSBjb21w b25lbnQgaGFzIGJlZW4gY3JlYXRlZCBvciB1cGRhdGVkLgorICAgKgorICAgKiBAaW50ZXJuYWwK KyAgICovCisKKworICBDYWxsYmFja1F1ZXVlLnByb3RvdHlwZS5ub3RpZnlBbGwgPSBmdW5jdGlv biBub3RpZnlBbGwoKSB7CisgICAgdmFyIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrczsKKyAg ICB2YXIgY29udGV4dHMgPSB0aGlzLl9jb250ZXh0czsKKyAgICB2YXIgYXJnID0gdGhpcy5fYXJn OworICAgIGlmIChjYWxsYmFja3MgJiYgY29udGV4dHMpIHsKKyAgICAgICEoY2FsbGJhY2tzLmxl bmd0aCA9PT0gY29udGV4dHMubGVuZ3RoKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJv ZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdNaXNtYXRjaGVkIGxpc3Qgb2YgY29udGV4dHMg aW4gY2FsbGJhY2sgcXVldWUnKSA6IF9wcm9kSW52YXJpYW50KCcyNCcpIDogdm9pZCAwOworICAg ICAgdGhpcy5fY2FsbGJhY2tzID0gbnVsbDsKKyAgICAgIHRoaXMuX2NvbnRleHRzID0gbnVsbDsK KyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7CisgICAg ICAgIGNhbGxiYWNrc1tpXS5jYWxsKGNvbnRleHRzW2ldLCBhcmcpOworICAgICAgfQorICAgICAg Y2FsbGJhY2tzLmxlbmd0aCA9IDA7CisgICAgICBjb250ZXh0cy5sZW5ndGggPSAwOworICAgIH0K KyAgfTsKKworICBDYWxsYmFja1F1ZXVlLnByb3RvdHlwZS5jaGVja3BvaW50ID0gZnVuY3Rpb24g Y2hlY2twb2ludCgpIHsKKyAgICByZXR1cm4gdGhpcy5fY2FsbGJhY2tzID8gdGhpcy5fY2FsbGJh Y2tzLmxlbmd0aCA6IDA7CisgIH07CisKKyAgQ2FsbGJhY2tRdWV1ZS5wcm90b3R5cGUucm9sbGJh Y2sgPSBmdW5jdGlvbiByb2xsYmFjayhsZW4pIHsKKyAgICBpZiAodGhpcy5fY2FsbGJhY2tzICYm IHRoaXMuX2NvbnRleHRzKSB7CisgICAgICB0aGlzLl9jYWxsYmFja3MubGVuZ3RoID0gbGVuOwor ICAgICAgdGhpcy5fY29udGV4dHMubGVuZ3RoID0gbGVuOworICAgIH0KKyAgfTsKKworICAvKioK KyAgICogUmVzZXRzIHRoZSBpbnRlcm5hbCBxdWV1ZS4KKyAgICoKKyAgICogQGludGVybmFsCisg ICAqLworCisKKyAgQ2FsbGJhY2tRdWV1ZS5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiByZXNl dCgpIHsKKyAgICB0aGlzLl9jYWxsYmFja3MgPSBudWxsOworICAgIHRoaXMuX2NvbnRleHRzID0g bnVsbDsKKyAgfTsKKworICAvKioKKyAgICogYFBvb2xlZENsYXNzYCBsb29rcyBmb3IgdGhpcy4K KyAgICovCisKKworICBDYWxsYmFja1F1ZXVlLnByb3RvdHlwZS5kZXN0cnVjdG9yID0gZnVuY3Rp b24gZGVzdHJ1Y3RvcigpIHsKKyAgICB0aGlzLnJlc2V0KCk7CisgIH07CisKKyAgcmV0dXJuIENh bGxiYWNrUXVldWU7Cit9KCk7CisKK21vZHVsZS5leHBvcnRzID0gUG9vbGVkQ2xhc3MuYWRkUG9v bGluZ1RvKENhbGxiYWNrUXVldWUpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAt LWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9DaGFuZ2VFdmVu dFBsdWdpbi5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9DaGFu Z2VFdmVudFBsdWdpbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uNGZl ZWE1NjIKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0 LWRvbS9saWIvQ2hhbmdlRXZlbnRQbHVnaW4uanMKQEAgLTAsMCArMSwzMjAgQEAKKy8qKgorICog Q29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVz ZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNE LXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qg ZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9m IHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNh bWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBFdmVudFBsdWdp bkh1YiA9IHJlcXVpcmUoJy4vRXZlbnRQbHVnaW5IdWInKTsKK3ZhciBFdmVudFByb3BhZ2F0b3Jz ID0gcmVxdWlyZSgnLi9FdmVudFByb3BhZ2F0b3JzJyk7Cit2YXIgRXhlY3V0aW9uRW52aXJvbm1l bnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpOwordmFyIFJlYWN0 RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7Cit2 YXIgUmVhY3RVcGRhdGVzID0gcmVxdWlyZSgnLi9SZWFjdFVwZGF0ZXMnKTsKK3ZhciBTeW50aGV0 aWNFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljRXZlbnQnKTsKKwordmFyIGdldEV2ZW50VGFy Z2V0ID0gcmVxdWlyZSgnLi9nZXRFdmVudFRhcmdldCcpOwordmFyIGlzRXZlbnRTdXBwb3J0ZWQg PSByZXF1aXJlKCcuL2lzRXZlbnRTdXBwb3J0ZWQnKTsKK3ZhciBpc1RleHRJbnB1dEVsZW1lbnQg PSByZXF1aXJlKCcuL2lzVGV4dElucHV0RWxlbWVudCcpOworCit2YXIgZXZlbnRUeXBlcyA9IHsK KyAgY2hhbmdlOiB7CisgICAgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6IHsKKyAgICAgIGJ1YmJs ZWQ6ICdvbkNoYW5nZScsCisgICAgICBjYXB0dXJlZDogJ29uQ2hhbmdlQ2FwdHVyZScKKyAgICB9 LAorICAgIGRlcGVuZGVuY2llczogWyd0b3BCbHVyJywgJ3RvcENoYW5nZScsICd0b3BDbGljaycs ICd0b3BGb2N1cycsICd0b3BJbnB1dCcsICd0b3BLZXlEb3duJywgJ3RvcEtleVVwJywgJ3RvcFNl bGVjdGlvbkNoYW5nZSddCisgIH0KK307CisKKy8qKgorICogRm9yIElFIHNoaW1zCisgKi8KK3Zh ciBhY3RpdmVFbGVtZW50ID0gbnVsbDsKK3ZhciBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7Cit2 YXIgYWN0aXZlRWxlbWVudFZhbHVlID0gbnVsbDsKK3ZhciBhY3RpdmVFbGVtZW50VmFsdWVQcm9w ID0gbnVsbDsKKworLyoqCisgKiBTRUNUSU9OOiBoYW5kbGUgYGNoYW5nZWAgZXZlbnQKKyAqLwor ZnVuY3Rpb24gc2hvdWxkVXNlQ2hhbmdlRXZlbnQoZWxlbSkgeworICB2YXIgbm9kZU5hbWUgPSBl bGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKKyAgcmV0dXJuIG5v ZGVOYW1lID09PSAnc2VsZWN0JyB8fCBub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiBlbGVtLnR5cGUg PT09ICdmaWxlJzsKK30KKwordmFyIGRvZXNDaGFuZ2VFdmVudEJ1YmJsZSA9IGZhbHNlOworaWYg KEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSkgeworICAvLyBTZWUgYGhhbmRsZUNoYW5n ZWAgY29tbWVudCBiZWxvdworICBkb2VzQ2hhbmdlRXZlbnRCdWJibGUgPSBpc0V2ZW50U3VwcG9y dGVkKCdjaGFuZ2UnKSAmJiAoIWRvY3VtZW50LmRvY3VtZW50TW9kZSB8fCBkb2N1bWVudC5kb2N1 bWVudE1vZGUgPiA4KTsKK30KKworZnVuY3Rpb24gbWFudWFsRGlzcGF0Y2hDaGFuZ2VFdmVudChu YXRpdmVFdmVudCkgeworICB2YXIgZXZlbnQgPSBTeW50aGV0aWNFdmVudC5nZXRQb29sZWQoZXZl bnRUeXBlcy5jaGFuZ2UsIGFjdGl2ZUVsZW1lbnRJbnN0LCBuYXRpdmVFdmVudCwgZ2V0RXZlbnRU YXJnZXQobmF0aXZlRXZlbnQpKTsKKyAgRXZlbnRQcm9wYWdhdG9ycy5hY2N1bXVsYXRlVHdvUGhh c2VEaXNwYXRjaGVzKGV2ZW50KTsKKworICAvLyBJZiBjaGFuZ2UgYW5kIHByb3BlcnR5Y2hhbmdl IGJ1YmJsZWQsIHdlJ2QganVzdCBiaW5kIHRvIGl0IGxpa2UgYWxsIHRoZQorICAvLyBvdGhlciBl dmVudHMgYW5kIGhhdmUgaXQgZ28gdGhyb3VnaCBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuIFNp bmNlIGl0CisgIC8vIGRvZXNuJ3QsIHdlIG1hbnVhbGx5IGxpc3RlbiBmb3IgdGhlIGV2ZW50cyBh bmQgc28gd2UgaGF2ZSB0byBlbnF1ZXVlIGFuZAorICAvLyBwcm9jZXNzIHRoZSBhYnN0cmFjdCBl dmVudCBtYW51YWxseS4KKyAgLy8KKyAgLy8gQmF0Y2hpbmcgaXMgbmVjZXNzYXJ5IGhlcmUgaW4g b3JkZXIgdG8gZW5zdXJlIHRoYXQgYWxsIGV2ZW50IGhhbmRsZXJzIHJ1bgorICAvLyBiZWZvcmUg dGhlIG5leHQgcmVyZW5kZXIgKGluY2x1ZGluZyBldmVudCBoYW5kbGVycyBhdHRhY2hlZCB0byBh bmNlc3RvcgorICAvLyBlbGVtZW50cyBpbnN0ZWFkIG9mIGRpcmVjdGx5IG9uIHRoZSBpbnB1dCku IFdpdGhvdXQgdGhpcywgY29udHJvbGxlZAorICAvLyBjb21wb25lbnRzIGRvbid0IHdvcmsgcHJv cGVybHkgaW4gY29uanVuY3Rpb24gd2l0aCBldmVudCBidWJibGluZyBiZWNhdXNlCisgIC8vIHRo ZSBjb21wb25lbnQgaXMgcmVyZW5kZXJlZCBhbmQgdGhlIHZhbHVlIHJldmVydGVkIGJlZm9yZSBh bGwgdGhlIGV2ZW50CisgIC8vIGhhbmRsZXJzIGNhbiBydW4uIFNlZSBodHRwczovL2dpdGh1Yi5j b20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcwOC4KKyAgUmVhY3RVcGRhdGVzLmJhdGNoZWRVcGRh dGVzKHJ1bkV2ZW50SW5CYXRjaCwgZXZlbnQpOworfQorCitmdW5jdGlvbiBydW5FdmVudEluQmF0 Y2goZXZlbnQpIHsKKyAgRXZlbnRQbHVnaW5IdWIuZW5xdWV1ZUV2ZW50cyhldmVudCk7CisgIEV2 ZW50UGx1Z2luSHViLnByb2Nlc3NFdmVudFF1ZXVlKGZhbHNlKTsKK30KKworZnVuY3Rpb24gc3Rh cnRXYXRjaGluZ0ZvckNoYW5nZUV2ZW50SUU4KHRhcmdldCwgdGFyZ2V0SW5zdCkgeworICBhY3Rp dmVFbGVtZW50ID0gdGFyZ2V0OworICBhY3RpdmVFbGVtZW50SW5zdCA9IHRhcmdldEluc3Q7Cisg IGFjdGl2ZUVsZW1lbnQuYXR0YWNoRXZlbnQoJ29uY2hhbmdlJywgbWFudWFsRGlzcGF0Y2hDaGFu Z2VFdmVudCk7Cit9CisKK2Z1bmN0aW9uIHN0b3BXYXRjaGluZ0ZvckNoYW5nZUV2ZW50SUU4KCkg eworICBpZiAoIWFjdGl2ZUVsZW1lbnQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgYWN0aXZlRWxl bWVudC5kZXRhY2hFdmVudCgnb25jaGFuZ2UnLCBtYW51YWxEaXNwYXRjaENoYW5nZUV2ZW50KTsK KyAgYWN0aXZlRWxlbWVudCA9IG51bGw7CisgIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDsKK30K KworZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvckNoYW5nZUV2ZW50KHRvcExldmVsVHlwZSwgdGFy Z2V0SW5zdCkgeworICBpZiAodG9wTGV2ZWxUeXBlID09PSAndG9wQ2hhbmdlJykgeworICAgIHJl dHVybiB0YXJnZXRJbnN0OworICB9Cit9CitmdW5jdGlvbiBoYW5kbGVFdmVudHNGb3JDaGFuZ2VF dmVudElFOCh0b3BMZXZlbFR5cGUsIHRhcmdldCwgdGFyZ2V0SW5zdCkgeworICBpZiAodG9wTGV2 ZWxUeXBlID09PSAndG9wRm9jdXMnKSB7CisgICAgLy8gc3RvcFdhdGNoaW5nKCkgc2hvdWxkIGJl IGEgbm9vcCBoZXJlIGJ1dCB3ZSBjYWxsIGl0IGp1c3QgaW4gY2FzZSB3ZQorICAgIC8vIG1pc3Nl ZCBhIGJsdXIgZXZlbnQgc29tZWhvdy4KKyAgICBzdG9wV2F0Y2hpbmdGb3JDaGFuZ2VFdmVudElF OCgpOworICAgIHN0YXJ0V2F0Y2hpbmdGb3JDaGFuZ2VFdmVudElFOCh0YXJnZXQsIHRhcmdldElu c3QpOworICB9IGVsc2UgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcEJsdXInKSB7CisgICAgc3Rv cFdhdGNoaW5nRm9yQ2hhbmdlRXZlbnRJRTgoKTsKKyAgfQorfQorCisvKioKKyAqIFNFQ1RJT046 IGhhbmRsZSBgaW5wdXRgIGV2ZW50CisgKi8KK3ZhciBpc0lucHV0RXZlbnRTdXBwb3J0ZWQgPSBm YWxzZTsKK2lmIChFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00pIHsKKyAgLy8gSUU5IGNs YWltcyB0byBzdXBwb3J0IHRoZSBpbnB1dCBldmVudCBidXQgZmFpbHMgdG8gdHJpZ2dlciBpdCB3 aGVuCisgIC8vIGRlbGV0aW5nIHRleHQsIHNvIHdlIGlnbm9yZSBpdHMgaW5wdXQgZXZlbnRzLgor ICAvLyBJRTEwKyBmaXJlIGlucHV0IGV2ZW50cyB0byBvZnRlbiwgc3VjaCB3aGVuIGEgcGxhY2Vo b2xkZXIKKyAgLy8gY2hhbmdlcyBvciB3aGVuIGFuIGlucHV0IHdpdGggYSBwbGFjZWhvbGRlciBp cyBmb2N1c2VkLgorICBpc0lucHV0RXZlbnRTdXBwb3J0ZWQgPSBpc0V2ZW50U3VwcG9ydGVkKCdp bnB1dCcpICYmICghZG9jdW1lbnQuZG9jdW1lbnRNb2RlIHx8IGRvY3VtZW50LmRvY3VtZW50TW9k ZSA+IDExKTsKK30KKworLyoqCisgKiAoRm9yIElFIDw9MTEpIFJlcGxhY2VtZW50IGdldHRlci9z ZXR0ZXIgZm9yIHRoZSBgdmFsdWVgIHByb3BlcnR5IHRoYXQgZ2V0cworICogc2V0IG9uIHRoZSBh Y3RpdmUgZWxlbWVudC4KKyAqLwordmFyIG5ld1ZhbHVlUHJvcCA9IHsKKyAgZ2V0OiBmdW5jdGlv biAoKSB7CisgICAgcmV0dXJuIGFjdGl2ZUVsZW1lbnRWYWx1ZVByb3AuZ2V0LmNhbGwodGhpcyk7 CisgIH0sCisgIHNldDogZnVuY3Rpb24gKHZhbCkgeworICAgIC8vIENhc3QgdG8gYSBzdHJpbmcg c28gd2UgY2FuIGRvIGVxdWFsaXR5IGNoZWNrcy4KKyAgICBhY3RpdmVFbGVtZW50VmFsdWUgPSAn JyArIHZhbDsKKyAgICBhY3RpdmVFbGVtZW50VmFsdWVQcm9wLnNldC5jYWxsKHRoaXMsIHZhbCk7 CisgIH0KK307CisKKy8qKgorICogKEZvciBJRSA8PTExKSBTdGFydHMgdHJhY2tpbmcgcHJvcGVy dHljaGFuZ2UgZXZlbnRzIG9uIHRoZSBwYXNzZWQtaW4gZWxlbWVudAorICogYW5kIG92ZXJyaWRl IHRoZSB2YWx1ZSBwcm9wZXJ0eSBzbyB0aGF0IHdlIGNhbiBkaXN0aW5ndWlzaCB1c2VyIGV2ZW50 cyBmcm9tCisgKiB2YWx1ZSBjaGFuZ2VzIGluIEpTLgorICovCitmdW5jdGlvbiBzdGFydFdhdGNo aW5nRm9yVmFsdWVDaGFuZ2UodGFyZ2V0LCB0YXJnZXRJbnN0KSB7CisgIGFjdGl2ZUVsZW1lbnQg PSB0YXJnZXQ7CisgIGFjdGl2ZUVsZW1lbnRJbnN0ID0gdGFyZ2V0SW5zdDsKKyAgYWN0aXZlRWxl bWVudFZhbHVlID0gdGFyZ2V0LnZhbHVlOworICBhY3RpdmVFbGVtZW50VmFsdWVQcm9wID0gT2Jq ZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQuY29uc3RydWN0b3IucHJvdG90eXBl LCAndmFsdWUnKTsKKworICAvLyBOb3QgZ3VhcmRlZCBpbiBhIGNhbkRlZmluZVByb3BlcnR5IGNo ZWNrOiBJRTggc3VwcG9ydHMgZGVmaW5lUHJvcGVydHkgb25seQorICAvLyBvbiBET00gZWxlbWVu dHMKKyAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFjdGl2ZUVsZW1lbnQsICd2YWx1ZScsIG5ld1Zh bHVlUHJvcCk7CisgIGlmIChhY3RpdmVFbGVtZW50LmF0dGFjaEV2ZW50KSB7CisgICAgYWN0aXZl RWxlbWVudC5hdHRhY2hFdmVudCgnb25wcm9wZXJ0eWNoYW5nZScsIGhhbmRsZVByb3BlcnR5Q2hh bmdlKTsKKyAgfSBlbHNlIHsKKyAgICBhY3RpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3By b3BlcnR5Y2hhbmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2UsIGZhbHNlKTsKKyAgfQorfQorCisv KioKKyAqIChGb3IgSUUgPD0xMSkgUmVtb3ZlcyB0aGUgZXZlbnQgbGlzdGVuZXJzIGZyb20gdGhl IGN1cnJlbnRseS10cmFja2VkIGVsZW1lbnQsCisgKiBpZiBhbnkgZXhpc3RzLgorICovCitmdW5j dGlvbiBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpIHsKKyAgaWYgKCFhY3RpdmVFbGVtZW50 KSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gZGVsZXRlIHJlc3RvcmVzIHRoZSBvcmlnaW5h bCBwcm9wZXJ0eSBkZWZpbml0aW9uCisgIGRlbGV0ZSBhY3RpdmVFbGVtZW50LnZhbHVlOworCisg IGlmIChhY3RpdmVFbGVtZW50LmRldGFjaEV2ZW50KSB7CisgICAgYWN0aXZlRWxlbWVudC5kZXRh Y2hFdmVudCgnb25wcm9wZXJ0eWNoYW5nZScsIGhhbmRsZVByb3BlcnR5Q2hhbmdlKTsKKyAgfSBl bHNlIHsKKyAgICBhY3RpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Byb3BlcnR5Y2hh bmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2UsIGZhbHNlKTsKKyAgfQorCisgIGFjdGl2ZUVsZW1l bnQgPSBudWxsOworICBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7CisgIGFjdGl2ZUVsZW1lbnRW YWx1ZSA9IG51bGw7CisgIGFjdGl2ZUVsZW1lbnRWYWx1ZVByb3AgPSBudWxsOworfQorCisvKioK KyAqIChGb3IgSUUgPD0xMSkgSGFuZGxlcyBhIHByb3BlcnR5Y2hhbmdlIGV2ZW50LCBzZW5kaW5n IGEgYGNoYW5nZWAgZXZlbnQgaWYKKyAqIHRoZSB2YWx1ZSBvZiB0aGUgYWN0aXZlIGVsZW1lbnQg aGFzIGNoYW5nZWQuCisgKi8KK2Z1bmN0aW9uIGhhbmRsZVByb3BlcnR5Q2hhbmdlKG5hdGl2ZUV2 ZW50KSB7CisgIGlmIChuYXRpdmVFdmVudC5wcm9wZXJ0eU5hbWUgIT09ICd2YWx1ZScpIHsKKyAg ICByZXR1cm47CisgIH0KKyAgdmFyIHZhbHVlID0gbmF0aXZlRXZlbnQuc3JjRWxlbWVudC52YWx1 ZTsKKyAgaWYgKHZhbHVlID09PSBhY3RpdmVFbGVtZW50VmFsdWUpIHsKKyAgICByZXR1cm47Cisg IH0KKyAgYWN0aXZlRWxlbWVudFZhbHVlID0gdmFsdWU7CisKKyAgbWFudWFsRGlzcGF0Y2hDaGFu Z2VFdmVudChuYXRpdmVFdmVudCk7Cit9CisKKy8qKgorICogSWYgYSBgY2hhbmdlYCBldmVudCBz aG91bGQgYmUgZmlyZWQsIHJldHVybnMgdGhlIHRhcmdldCdzIElELgorICovCitmdW5jdGlvbiBn ZXRUYXJnZXRJbnN0Rm9ySW5wdXRFdmVudCh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QpIHsKKyAg aWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcElucHV0JykgeworICAgIC8vIEluIG1vZGVybiBicm93 c2VycyAoaS5lLiwgbm90IElFOCBvciBJRTkpLCB0aGUgaW5wdXQgZXZlbnQgaXMgZXhhY3RseQor ICAgIC8vIHdoYXQgd2Ugd2FudCBzbyBmYWxsIHRocm91Z2ggaGVyZSBhbmQgdHJpZ2dlciBhbiBh YnN0cmFjdCBldmVudAorICAgIHJldHVybiB0YXJnZXRJbnN0OworICB9Cit9CisKK2Z1bmN0aW9u IGhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRJRSh0b3BMZXZlbFR5cGUsIHRhcmdldCwgdGFyZ2V0 SW5zdCkgeworICBpZiAodG9wTGV2ZWxUeXBlID09PSAndG9wRm9jdXMnKSB7CisgICAgLy8gSW4g SUU4LCB3ZSBjYW4gY2FwdHVyZSBhbG1vc3QgYWxsIC52YWx1ZSBjaGFuZ2VzIGJ5IGFkZGluZyBh CisgICAgLy8gcHJvcGVydHljaGFuZ2UgaGFuZGxlciBhbmQgbG9va2luZyBmb3IgZXZlbnRzIHdp dGggcHJvcGVydHlOYW1lCisgICAgLy8gZXF1YWwgdG8gJ3ZhbHVlJworICAgIC8vIEluIElFOS0x MSwgcHJvcGVydHljaGFuZ2UgZmlyZXMgZm9yIG1vc3QgaW5wdXQgZXZlbnRzIGJ1dCBpcyBidWdn eSBhbmQKKyAgICAvLyBkb2Vzbid0IGZpcmUgd2hlbiB0ZXh0IGlzIGRlbGV0ZWQsIGJ1dCBjb252 ZW5pZW50bHksIHNlbGVjdGlvbmNoYW5nZQorICAgIC8vIGFwcGVhcnMgdG8gZmlyZSBpbiBhbGwg b2YgdGhlIHJlbWFpbmluZyBjYXNlcyBzbyB3ZSBjYXRjaCB0aG9zZSBhbmQKKyAgICAvLyBmb3J3 YXJkIHRoZSBldmVudCBpZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWQKKyAgICAvLyBJbiBlaXRoZXIg Y2FzZSwgd2UgZG9uJ3Qgd2FudCB0byBjYWxsIHRoZSBldmVudCBoYW5kbGVyIGlmIHRoZSB2YWx1 ZQorICAgIC8vIGlzIGNoYW5nZWQgZnJvbSBKUyBzbyB3ZSByZWRlZmluZSBhIHNldHRlciBmb3Ig YC52YWx1ZWAgdGhhdCB1cGRhdGVzCisgICAgLy8gb3VyIGFjdGl2ZUVsZW1lbnRWYWx1ZSB2YXJp YWJsZSwgYWxsb3dpbmcgdXMgdG8gaWdub3JlIHRob3NlIGNoYW5nZXMKKyAgICAvLworICAgIC8v IHN0b3BXYXRjaGluZygpIHNob3VsZCBiZSBhIG5vb3AgaGVyZSBidXQgd2UgY2FsbCBpdCBqdXN0 IGluIGNhc2Ugd2UKKyAgICAvLyBtaXNzZWQgYSBibHVyIGV2ZW50IHNvbWVob3cuCisgICAgc3Rv cFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKTsKKyAgICBzdGFydFdhdGNoaW5nRm9yVmFsdWVDaGFu Z2UodGFyZ2V0LCB0YXJnZXRJbnN0KTsKKyAgfSBlbHNlIGlmICh0b3BMZXZlbFR5cGUgPT09ICd0 b3BCbHVyJykgeworICAgIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCk7CisgIH0KK30KKwor Ly8gRm9yIElFOCBhbmQgSUU5LgorZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvcklucHV0RXZlbnRJ RSh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QpIHsKKyAgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3Rv cFNlbGVjdGlvbkNoYW5nZScgfHwgdG9wTGV2ZWxUeXBlID09PSAndG9wS2V5VXAnIHx8IHRvcExl dmVsVHlwZSA9PT0gJ3RvcEtleURvd24nKSB7CisgICAgLy8gT24gdGhlIHNlbGVjdGlvbmNoYW5n ZSBldmVudCwgdGhlIHRhcmdldCBpcyBqdXN0IGRvY3VtZW50IHdoaWNoIGlzbid0CisgICAgLy8g aGVscGZ1bCBmb3IgdXMgc28ganVzdCBjaGVjayBhY3RpdmVFbGVtZW50IGluc3RlYWQuCisgICAg Ly8KKyAgICAvLyA5OSUgb2YgdGhlIHRpbWUsIGtleWRvd24gYW5kIGtleXVwIGFyZW4ndCBuZWNl c3NhcnkuIElFOCBmYWlscyB0byBmaXJlCisgICAgLy8gcHJvcGVydHljaGFuZ2Ugb24gdGhlIGZp cnN0IGlucHV0IGV2ZW50IGFmdGVyIHNldHRpbmcgYHZhbHVlYCBmcm9tIGEKKyAgICAvLyBzY3Jp cHQgYW5kIGZpcmVzIG9ubHkga2V5ZG93biwga2V5cHJlc3MsIGtleXVwLiBDYXRjaGluZyBrZXl1 cCB1c3VhbGx5CisgICAgLy8gZ2V0cyBpdCBhbmQgY2F0Y2hpbmcga2V5ZG93biBsZXRzIHVzIGZp cmUgYW4gZXZlbnQgZm9yIHRoZSBmaXJzdAorICAgIC8vIGtleXN0cm9rZSBpZiB1c2VyIGRvZXMg YSBrZXkgcmVwZWF0IChpdCdsbCBiZSBhIGxpdHRsZSBkZWxheWVkOiByaWdodAorICAgIC8vIGJl Zm9yZSB0aGUgc2Vjb25kIGtleXN0cm9rZSkuIE90aGVyIGlucHV0IG1ldGhvZHMgKGUuZy4sIHBh c3RlKSBzZWVtIHRvCisgICAgLy8gZmlyZSBzZWxlY3Rpb25jaGFuZ2Ugbm9ybWFsbHkuCisgICAg aWYgKGFjdGl2ZUVsZW1lbnQgJiYgYWN0aXZlRWxlbWVudC52YWx1ZSAhPT0gYWN0aXZlRWxlbWVu dFZhbHVlKSB7CisgICAgICBhY3RpdmVFbGVtZW50VmFsdWUgPSBhY3RpdmVFbGVtZW50LnZhbHVl OworICAgICAgcmV0dXJuIGFjdGl2ZUVsZW1lbnRJbnN0OworICAgIH0KKyAgfQorfQorCisvKioK KyAqIFNFQ1RJT046IGhhbmRsZSBgY2xpY2tgIGV2ZW50CisgKi8KK2Z1bmN0aW9uIHNob3VsZFVz ZUNsaWNrRXZlbnQoZWxlbSkgeworICAvLyBVc2UgdGhlIGBjbGlja2AgZXZlbnQgdG8gZGV0ZWN0 IGNoYW5nZXMgdG8gY2hlY2tib3ggYW5kIHJhZGlvIGlucHV0cy4KKyAgLy8gVGhpcyBhcHByb2Fj aCB3b3JrcyBhY3Jvc3MgYWxsIGJyb3dzZXJzLCB3aGVyZWFzIGBjaGFuZ2VgIGRvZXMgbm90IGZp cmUKKyAgLy8gdW50aWwgYGJsdXJgIGluIElFOC4KKyAgcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYg ZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmIChlbGVtLnR5cGUgPT09 ICdjaGVja2JveCcgfHwgZWxlbS50eXBlID09PSAncmFkaW8nKTsKK30KKworZnVuY3Rpb24gZ2V0 VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0KSB7CisgIGlm ICh0b3BMZXZlbFR5cGUgPT09ICd0b3BDbGljaycpIHsKKyAgICByZXR1cm4gdGFyZ2V0SW5zdDsK KyAgfQorfQorCisvKioKKyAqIFRoaXMgcGx1Z2luIGNyZWF0ZXMgYW4gYG9uQ2hhbmdlYCBldmVu dCB0aGF0IG5vcm1hbGl6ZXMgY2hhbmdlIGV2ZW50cworICogYWNyb3NzIGZvcm0gZWxlbWVudHMu IFRoaXMgZXZlbnQgZmlyZXMgYXQgYSB0aW1lIHdoZW4gaXQncyBwb3NzaWJsZSB0bworICogY2hh bmdlIHRoZSBlbGVtZW50J3MgdmFsdWUgd2l0aG91dCBzZWVpbmcgYSBmbGlja2VyLgorICoKKyAq IFN1cHBvcnRlZCBlbGVtZW50cyBhcmU6CisgKiAtIGlucHV0IChzZWUgYGlzVGV4dElucHV0RWxl bWVudGApCisgKiAtIHRleHRhcmVhCisgKiAtIHNlbGVjdAorICovCit2YXIgQ2hhbmdlRXZlbnRQ bHVnaW4gPSB7CisKKyAgZXZlbnRUeXBlczogZXZlbnRUeXBlcywKKworICBleHRyYWN0RXZlbnRz OiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZl RXZlbnRUYXJnZXQpIHsKKyAgICB2YXIgdGFyZ2V0Tm9kZSA9IHRhcmdldEluc3QgPyBSZWFjdERP TUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0YXJnZXRJbnN0KSA6IHdpbmRvdzsK KworICAgIHZhciBnZXRUYXJnZXRJbnN0RnVuYywgaGFuZGxlRXZlbnRGdW5jOworICAgIGlmIChz aG91bGRVc2VDaGFuZ2VFdmVudCh0YXJnZXROb2RlKSkgeworICAgICAgaWYgKGRvZXNDaGFuZ2VF dmVudEJ1YmJsZSkgeworICAgICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RG b3JDaGFuZ2VFdmVudDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhhbmRsZUV2ZW50RnVuYyA9 IGhhbmRsZUV2ZW50c0ZvckNoYW5nZUV2ZW50SUU4OworICAgICAgfQorICAgIH0gZWxzZSBpZiAo aXNUZXh0SW5wdXRFbGVtZW50KHRhcmdldE5vZGUpKSB7CisgICAgICBpZiAoaXNJbnB1dEV2ZW50 U3VwcG9ydGVkKSB7CisgICAgICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZv cklucHV0RXZlbnQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9 IGdldFRhcmdldEluc3RGb3JJbnB1dEV2ZW50SUU7CisgICAgICAgIGhhbmRsZUV2ZW50RnVuYyA9 IGhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRJRTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHNo b3VsZFVzZUNsaWNrRXZlbnQodGFyZ2V0Tm9kZSkpIHsKKyAgICAgIGdldFRhcmdldEluc3RGdW5j ID0gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQ7CisgICAgfQorCisgICAgaWYgKGdldFRhcmdl dEluc3RGdW5jKSB7CisgICAgICB2YXIgaW5zdCA9IGdldFRhcmdldEluc3RGdW5jKHRvcExldmVs VHlwZSwgdGFyZ2V0SW5zdCk7CisgICAgICBpZiAoaW5zdCkgeworICAgICAgICB2YXIgZXZlbnQg PSBTeW50aGV0aWNFdmVudC5nZXRQb29sZWQoZXZlbnRUeXBlcy5jaGFuZ2UsIGluc3QsIG5hdGl2 ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7CisgICAgICAgIGV2ZW50LnR5cGUgPSAnY2hhbmdl JzsKKyAgICAgICAgRXZlbnRQcm9wYWdhdG9ycy5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVz KGV2ZW50KTsKKyAgICAgICAgcmV0dXJuIGV2ZW50OworICAgICAgfQorICAgIH0KKworICAgIGlm IChoYW5kbGVFdmVudEZ1bmMpIHsKKyAgICAgIGhhbmRsZUV2ZW50RnVuYyh0b3BMZXZlbFR5cGUs IHRhcmdldE5vZGUsIHRhcmdldEluc3QpOworICAgIH0KKyAgfQorCit9OworCittb2R1bGUuZXhw b3J0cyA9IENoYW5nZUV2ZW50UGx1Z2luOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlm ZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9ET01DaGls ZHJlbk9wZXJhdGlvbnMuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9s aWIvRE9NQ2hpbGRyZW5PcGVyYXRpb25zLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw MDAwMDAwLi45MDVkYzNlYwotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92 ZW5kb3IvcmVhY3QtZG9tL2xpYi9ET01DaGlsZHJlbk9wZXJhdGlvbnMuanMKQEAgLTAsMCArMSwy MjQgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAq IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNl ZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZp bGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9u YWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRT IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisK K3ZhciBET01MYXp5VHJlZSA9IHJlcXVpcmUoJy4vRE9NTGF6eVRyZWUnKTsKK3ZhciBEYW5nZXIg PSByZXF1aXJlKCcuL0RhbmdlcicpOwordmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVp cmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7Cit2YXIgUmVhY3RJbnN0cnVtZW50YXRpb24g PSByZXF1aXJlKCcuL1JlYWN0SW5zdHJ1bWVudGF0aW9uJyk7CisKK3ZhciBjcmVhdGVNaWNyb3Nv ZnRVbnNhZmVMb2NhbEZ1bmN0aW9uID0gcmVxdWlyZSgnLi9jcmVhdGVNaWNyb3NvZnRVbnNhZmVM b2NhbEZ1bmN0aW9uJyk7Cit2YXIgc2V0SW5uZXJIVE1MID0gcmVxdWlyZSgnLi9zZXRJbm5lckhU TUwnKTsKK3ZhciBzZXRUZXh0Q29udGVudCA9IHJlcXVpcmUoJy4vc2V0VGV4dENvbnRlbnQnKTsK KworZnVuY3Rpb24gZ2V0Tm9kZUFmdGVyKHBhcmVudE5vZGUsIG5vZGUpIHsKKyAgLy8gU3BlY2lh bCBjYXNlIGZvciB0ZXh0IGNvbXBvbmVudHMsIHdoaWNoIHJldHVybiBbb3BlbiwgY2xvc2VdIGNv bW1lbnRzCisgIC8vIGZyb20gZ2V0SG9zdE5vZGUuCisgIGlmIChBcnJheS5pc0FycmF5KG5vZGUp KSB7CisgICAgbm9kZSA9IG5vZGVbMV07CisgIH0KKyAgcmV0dXJuIG5vZGUgPyBub2RlLm5leHRT aWJsaW5nIDogcGFyZW50Tm9kZS5maXJzdENoaWxkOworfQorCisvKioKKyAqIEluc2VydHMgYGNo aWxkTm9kZWAgYXMgYSBjaGlsZCBvZiBgcGFyZW50Tm9kZWAgYXQgdGhlIGBpbmRleGAuCisgKgor ICogQHBhcmFtIHtET01FbGVtZW50fSBwYXJlbnROb2RlIFBhcmVudCBub2RlIGluIHdoaWNoIHRv IGluc2VydC4KKyAqIEBwYXJhbSB7RE9NRWxlbWVudH0gY2hpbGROb2RlIENoaWxkIG5vZGUgdG8g aW5zZXJ0LgorICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IEluZGV4IGF0IHdoaWNoIHRvIGluc2Vy dCB0aGUgY2hpbGQuCisgKiBAaW50ZXJuYWwKKyAqLwordmFyIGluc2VydENoaWxkQXQgPSBjcmVh dGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uIChwYXJlbnROb2RlLCBjaGls ZE5vZGUsIHJlZmVyZW5jZU5vZGUpIHsKKyAgLy8gV2UgcmVseSBleGNsdXNpdmVseSBvbiBgaW5z ZXJ0QmVmb3JlKG5vZGUsIG51bGwpYCBpbnN0ZWFkIG9mIGFsc28gdXNpbmcKKyAgLy8gYGFwcGVu ZENoaWxkKG5vZGUpYC4gKFVzaW5nIGB1bmRlZmluZWRgIGlzIG5vdCBhbGxvd2VkIGJ5IGFsbCBi cm93c2VycyBzbworICAvLyB3ZSBhcmUgY2FyZWZ1bCB0byB1c2UgYG51bGxgLikKKyAgcGFyZW50 Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGROb2RlLCByZWZlcmVuY2VOb2RlKTsKK30pOworCitmdW5j dGlvbiBpbnNlcnRMYXp5VHJlZUNoaWxkQXQocGFyZW50Tm9kZSwgY2hpbGRUcmVlLCByZWZlcmVu Y2VOb2RlKSB7CisgIERPTUxhenlUcmVlLmluc2VydFRyZWVCZWZvcmUocGFyZW50Tm9kZSwgY2hp bGRUcmVlLCByZWZlcmVuY2VOb2RlKTsKK30KKworZnVuY3Rpb24gbW92ZUNoaWxkKHBhcmVudE5v ZGUsIGNoaWxkTm9kZSwgcmVmZXJlbmNlTm9kZSkgeworICBpZiAoQXJyYXkuaXNBcnJheShjaGls ZE5vZGUpKSB7CisgICAgbW92ZURlbGltaXRlZFRleHQocGFyZW50Tm9kZSwgY2hpbGROb2RlWzBd LCBjaGlsZE5vZGVbMV0sIHJlZmVyZW5jZU5vZGUpOworICB9IGVsc2UgeworICAgIGluc2VydENo aWxkQXQocGFyZW50Tm9kZSwgY2hpbGROb2RlLCByZWZlcmVuY2VOb2RlKTsKKyAgfQorfQorCitm dW5jdGlvbiByZW1vdmVDaGlsZChwYXJlbnROb2RlLCBjaGlsZE5vZGUpIHsKKyAgaWYgKEFycmF5 LmlzQXJyYXkoY2hpbGROb2RlKSkgeworICAgIHZhciBjbG9zaW5nQ29tbWVudCA9IGNoaWxkTm9k ZVsxXTsKKyAgICBjaGlsZE5vZGUgPSBjaGlsZE5vZGVbMF07CisgICAgcmVtb3ZlRGVsaW1pdGVk VGV4dChwYXJlbnROb2RlLCBjaGlsZE5vZGUsIGNsb3NpbmdDb21tZW50KTsKKyAgICBwYXJlbnRO b2RlLnJlbW92ZUNoaWxkKGNsb3NpbmdDb21tZW50KTsKKyAgfQorICBwYXJlbnROb2RlLnJlbW92 ZUNoaWxkKGNoaWxkTm9kZSk7Cit9CisKK2Z1bmN0aW9uIG1vdmVEZWxpbWl0ZWRUZXh0KHBhcmVu dE5vZGUsIG9wZW5pbmdDb21tZW50LCBjbG9zaW5nQ29tbWVudCwgcmVmZXJlbmNlTm9kZSkgewor ICB2YXIgbm9kZSA9IG9wZW5pbmdDb21tZW50OworICB3aGlsZSAodHJ1ZSkgeworICAgIHZhciBu ZXh0Tm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7CisgICAgaW5zZXJ0Q2hpbGRBdChwYXJlbnROb2Rl LCBub2RlLCByZWZlcmVuY2VOb2RlKTsKKyAgICBpZiAobm9kZSA9PT0gY2xvc2luZ0NvbW1lbnQp IHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBub2RlID0gbmV4dE5vZGU7CisgIH0KK30KKwor ZnVuY3Rpb24gcmVtb3ZlRGVsaW1pdGVkVGV4dChwYXJlbnROb2RlLCBzdGFydE5vZGUsIGNsb3Np bmdDb21tZW50KSB7CisgIHdoaWxlICh0cnVlKSB7CisgICAgdmFyIG5vZGUgPSBzdGFydE5vZGUu bmV4dFNpYmxpbmc7CisgICAgaWYgKG5vZGUgPT09IGNsb3NpbmdDb21tZW50KSB7CisgICAgICAv LyBUaGUgY2xvc2luZyBjb21tZW50IGlzIHJlbW92ZWQgYnkgUmVhY3RNdWx0aUNoaWxkLgorICAg ICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIHBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9k ZSk7CisgICAgfQorICB9Cit9CisKK2Z1bmN0aW9uIHJlcGxhY2VEZWxpbWl0ZWRUZXh0KG9wZW5p bmdDb21tZW50LCBjbG9zaW5nQ29tbWVudCwgc3RyaW5nVGV4dCkgeworICB2YXIgcGFyZW50Tm9k ZSA9IG9wZW5pbmdDb21tZW50LnBhcmVudE5vZGU7CisgIHZhciBub2RlQWZ0ZXJDb21tZW50ID0g b3BlbmluZ0NvbW1lbnQubmV4dFNpYmxpbmc7CisgIGlmIChub2RlQWZ0ZXJDb21tZW50ID09PSBj bG9zaW5nQ29tbWVudCkgeworICAgIC8vIFRoZXJlIGFyZSBubyB0ZXh0IG5vZGVzIGJldHdlZW4g dGhlIG9wZW5pbmcgYW5kIGNsb3NpbmcgY29tbWVudHM7IGluc2VydAorICAgIC8vIGEgbmV3IG9u ZSBpZiBzdHJpbmdUZXh0IGlzbid0IGVtcHR5LgorICAgIGlmIChzdHJpbmdUZXh0KSB7CisgICAg ICBpbnNlcnRDaGlsZEF0KHBhcmVudE5vZGUsIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHN0cmlu Z1RleHQpLCBub2RlQWZ0ZXJDb21tZW50KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKHN0 cmluZ1RleHQpIHsKKyAgICAgIC8vIFNldCB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBmaXJzdCBu b2RlIGFmdGVyIHRoZSBvcGVuaW5nIGNvbW1lbnQsIGFuZAorICAgICAgLy8gcmVtb3ZlIGFsbCBm b2xsb3dpbmcgbm9kZXMgdXAgdW50aWwgdGhlIGNsb3NpbmcgY29tbWVudC4KKyAgICAgIHNldFRl eHRDb250ZW50KG5vZGVBZnRlckNvbW1lbnQsIHN0cmluZ1RleHQpOworICAgICAgcmVtb3ZlRGVs aW1pdGVkVGV4dChwYXJlbnROb2RlLCBub2RlQWZ0ZXJDb21tZW50LCBjbG9zaW5nQ29tbWVudCk7 CisgICAgfSBlbHNlIHsKKyAgICAgIHJlbW92ZURlbGltaXRlZFRleHQocGFyZW50Tm9kZSwgb3Bl bmluZ0NvbW1lbnQsIGNsb3NpbmdDb21tZW50KTsKKyAgICB9CisgIH0KKworICBpZiAocHJvY2Vz cy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgeworICAgIFJlYWN0SW5zdHJ1bWVudGF0 aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oeworICAgICAgaW5zdGFuY2VJRDogUmVhY3RE T01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUob3BlbmluZ0NvbW1lbnQpLl9kZWJ1 Z0lELAorICAgICAgdHlwZTogJ3JlcGxhY2UgdGV4dCcsCisgICAgICBwYXlsb2FkOiBzdHJpbmdU ZXh0CisgICAgfSk7CisgIH0KK30KKwordmFyIGRhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFy a3VwID0gRGFuZ2VyLmRhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwOworaWYgKHByb2Nl c3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgZGFuZ2Vyb3VzbHlSZXBsYWNl Tm9kZVdpdGhNYXJrdXAgPSBmdW5jdGlvbiAob2xkQ2hpbGQsIG1hcmt1cCwgcHJldkluc3RhbmNl KSB7CisgICAgRGFuZ2VyLmRhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwKG9sZENoaWxk LCBtYXJrdXApOworICAgIGlmIChwcmV2SW5zdGFuY2UuX2RlYnVnSUQgIT09IDApIHsKKyAgICAg IFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oeworICAgICAg ICBpbnN0YW5jZUlEOiBwcmV2SW5zdGFuY2UuX2RlYnVnSUQsCisgICAgICAgIHR5cGU6ICdyZXBs YWNlIHdpdGgnLAorICAgICAgICBwYXlsb2FkOiBtYXJrdXAudG9TdHJpbmcoKQorICAgICAgfSk7 CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBuZXh0SW5zdGFuY2UgPSBSZWFjdERPTUNvbXBvbmVu dFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShtYXJrdXAubm9kZSk7CisgICAgICBpZiAobmV4dElu c3RhbmNlLl9kZWJ1Z0lEICE9PSAwKSB7CisgICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRl YnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oeworICAgICAgICAgIGluc3RhbmNlSUQ6IG5leHRJbnN0 YW5jZS5fZGVidWdJRCwKKyAgICAgICAgICB0eXBlOiAnbW91bnQnLAorICAgICAgICAgIHBheWxv YWQ6IG1hcmt1cC50b1N0cmluZygpCisgICAgICAgIH0pOworICAgICAgfQorICAgIH0KKyAgfTsK K30KKworLyoqCisgKiBPcGVyYXRpb25zIGZvciB1cGRhdGluZyB3aXRoIERPTSBjaGlsZHJlbi4K KyAqLwordmFyIERPTUNoaWxkcmVuT3BlcmF0aW9ucyA9IHsKKworICBkYW5nZXJvdXNseVJlcGxh Y2VOb2RlV2l0aE1hcmt1cDogZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXAsCisKKyAg cmVwbGFjZURlbGltaXRlZFRleHQ6IHJlcGxhY2VEZWxpbWl0ZWRUZXh0LAorCisgIC8qKgorICAg KiBVcGRhdGVzIGEgY29tcG9uZW50J3MgY2hpbGRyZW4gYnkgcHJvY2Vzc2luZyBhIHNlcmllcyBv ZiB1cGRhdGVzLiBUaGUKKyAgICogdXBkYXRlIGNvbmZpZ3VyYXRpb25zIGFyZSBlYWNoIGV4cGVj dGVkIHRvIGhhdmUgYSBgcGFyZW50Tm9kZWAgcHJvcGVydHkuCisgICAqCisgICAqIEBwYXJhbSB7 YXJyYXk8b2JqZWN0Pn0gdXBkYXRlcyBMaXN0IG9mIHVwZGF0ZSBjb25maWd1cmF0aW9ucy4KKyAg ICogQGludGVybmFsCisgICAqLworICBwcm9jZXNzVXBkYXRlczogZnVuY3Rpb24gKHBhcmVudE5v ZGUsIHVwZGF0ZXMpIHsKKyAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0 aW9uJykgeworICAgICAgdmFyIHBhcmVudE5vZGVEZWJ1Z0lEID0gUmVhY3RET01Db21wb25lbnRU cmVlLmdldEluc3RhbmNlRnJvbU5vZGUocGFyZW50Tm9kZSkuX2RlYnVnSUQ7CisgICAgfQorCisg ICAgZm9yICh2YXIgayA9IDA7IGsgPCB1cGRhdGVzLmxlbmd0aDsgaysrKSB7CisgICAgICB2YXIg dXBkYXRlID0gdXBkYXRlc1trXTsKKyAgICAgIHN3aXRjaCAodXBkYXRlLnR5cGUpIHsKKyAgICAg ICAgY2FzZSAnSU5TRVJUX01BUktVUCc6CisgICAgICAgICAgaW5zZXJ0TGF6eVRyZWVDaGlsZEF0 KHBhcmVudE5vZGUsIHVwZGF0ZS5jb250ZW50LCBnZXROb2RlQWZ0ZXIocGFyZW50Tm9kZSwgdXBk YXRlLmFmdGVyTm9kZSkpOworICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0g J3Byb2R1Y3Rpb24nKSB7CisgICAgICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rv b2wub25Ib3N0T3BlcmF0aW9uKHsKKyAgICAgICAgICAgICAgaW5zdGFuY2VJRDogcGFyZW50Tm9k ZURlYnVnSUQsCisgICAgICAgICAgICAgIHR5cGU6ICdpbnNlcnQgY2hpbGQnLAorICAgICAgICAg ICAgICBwYXlsb2FkOiB7IHRvSW5kZXg6IHVwZGF0ZS50b0luZGV4LCBjb250ZW50OiB1cGRhdGUu Y29udGVudC50b1N0cmluZygpIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH0KKyAgICAg ICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnTU9WRV9FWElTVElORyc6CisgICAgICAgICAgbW92 ZUNoaWxkKHBhcmVudE5vZGUsIHVwZGF0ZS5mcm9tTm9kZSwgZ2V0Tm9kZUFmdGVyKHBhcmVudE5v ZGUsIHVwZGF0ZS5hZnRlck5vZGUpKTsKKyAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9F TlYgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24u ZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7CisgICAgICAgICAgICAgIGluc3RhbmNlSUQ6IHBh cmVudE5vZGVEZWJ1Z0lELAorICAgICAgICAgICAgICB0eXBlOiAnbW92ZSBjaGlsZCcsCisgICAg ICAgICAgICAgIHBheWxvYWQ6IHsgZnJvbUluZGV4OiB1cGRhdGUuZnJvbUluZGV4LCB0b0luZGV4 OiB1cGRhdGUudG9JbmRleCB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9CisgICAgICAg ICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1NFVF9NQVJLVVAnOgorICAgICAgICAgIHNldElubmVy SFRNTChwYXJlbnROb2RlLCB1cGRhdGUuY29udGVudCk7CisgICAgICAgICAgaWYgKHByb2Nlc3Mu ZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICAgICAgIFJlYWN0SW5zdHJ1 bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oeworICAgICAgICAgICAgICBpbnN0 YW5jZUlEOiBwYXJlbnROb2RlRGVidWdJRCwKKyAgICAgICAgICAgICAgdHlwZTogJ3JlcGxhY2Ug Y2hpbGRyZW4nLAorICAgICAgICAgICAgICBwYXlsb2FkOiB1cGRhdGUuY29udGVudC50b1N0cmlu ZygpCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAg ICAgIGNhc2UgJ1RFWFRfQ09OVEVOVCc6CisgICAgICAgICAgc2V0VGV4dENvbnRlbnQocGFyZW50 Tm9kZSwgdXBkYXRlLmNvbnRlbnQpOworICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VO ViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5k ZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHsKKyAgICAgICAgICAgICAgaW5zdGFuY2VJRDogcGFy ZW50Tm9kZURlYnVnSUQsCisgICAgICAgICAgICAgIHR5cGU6ICdyZXBsYWNlIHRleHQnLAorICAg ICAgICAgICAgICBwYXlsb2FkOiB1cGRhdGUuY29udGVudC50b1N0cmluZygpCisgICAgICAgICAg ICB9KTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1JFTU9W RV9OT0RFJzoKKyAgICAgICAgICByZW1vdmVDaGlsZChwYXJlbnROb2RlLCB1cGRhdGUuZnJvbU5v ZGUpOworICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24n KSB7CisgICAgICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3Bl cmF0aW9uKHsKKyAgICAgICAgICAgICAgaW5zdGFuY2VJRDogcGFyZW50Tm9kZURlYnVnSUQsCisg ICAgICAgICAgICAgIHR5cGU6ICdyZW1vdmUgY2hpbGQnLAorICAgICAgICAgICAgICBwYXlsb2Fk OiB7IGZyb21JbmRleDogdXBkYXRlLmZyb21JbmRleCB9CisgICAgICAgICAgICB9KTsKKyAgICAg ICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKK307CisKK21v ZHVsZS5leHBvcnRzID0gRE9NQ2hpbGRyZW5PcGVyYXRpb25zOwpcIE5vIG5ld2xpbmUgYXQgZW5k IG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9t L2xpYi9ET01MYXp5VHJlZS5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9t L2xpYi9ET01MYXp5VHJlZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4u ZjJmNjRkNWIKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3Jl YWN0LWRvbS9saWIvRE9NTGF6eVRyZWUuanMKQEAgLTAsMCArMSwxMTcgQEAKKy8qKgorICogQ29w eXJpZ2h0IDIwMTUtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2 ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0 eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGly ZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBh dGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUg ZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBET01OYW1lc3BhY2Vz ID0gcmVxdWlyZSgnLi9ET01OYW1lc3BhY2VzJyk7Cit2YXIgc2V0SW5uZXJIVE1MID0gcmVxdWly ZSgnLi9zZXRJbm5lckhUTUwnKTsKKwordmFyIGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVu Y3Rpb24gPSByZXF1aXJlKCcuL2NyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24nKTsK K3ZhciBzZXRUZXh0Q29udGVudCA9IHJlcXVpcmUoJy4vc2V0VGV4dENvbnRlbnQnKTsKKwordmFy IEVMRU1FTlRfTk9ERV9UWVBFID0gMTsKK3ZhciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFX1RZUEUg PSAxMTsKKworLyoqCisgKiBJbiBJRSAoOC0xMSkgYW5kIEVkZ2UsIGFwcGVuZGluZyBub2RlcyB3 aXRoIG5vIGNoaWxkcmVuIGlzIGRyYW1hdGljYWxseQorICogZmFzdGVyIHRoYW4gYXBwZW5kaW5n IGEgZnVsbCBzdWJ0cmVlLCBzbyB3ZSBlc3NlbnRpYWxseSBxdWV1ZSB1cCB0aGUKKyAqIC5hcHBl bmRDaGlsZCBjYWxscyBoZXJlIGFuZCBhcHBseSB0aGVtIHNvIGVhY2ggbm9kZSBpcyBhZGRlZCB0 byBpdHMgcGFyZW50CisgKiBiZWZvcmUgYW55IGNoaWxkcmVuIGFyZSBhZGRlZC4KKyAqCisgKiBJ biBvdGhlciBicm93c2VycywgZG9pbmcgc28gaXMgc2xvd2VyIG9yIG5ldXRyYWwgY29tcGFyZWQg dG8gdGhlIG90aGVyIG9yZGVyCisgKiAoaW4gRmlyZWZveCwgdHdpY2UgYXMgc2xvdykgc28gd2Ug b25seSBkbyB0aGlzIGludmVyc2lvbiBpbiBJRS4KKyAqCisgKiBTZWUgaHR0cHM6Ly9naXRodWIu Y29tL3NwaWN5ai9pbm5lcmh0bWwtdnMtY3JlYXRlZWxlbWVudC12cy1jbG9uZW5vZGUuCisgKi8K K3ZhciBlbmFibGVMYXp5ID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBl b2YgZG9jdW1lbnQuZG9jdW1lbnRNb2RlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgbmF2aWdhdG9y ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbmF2aWdhdG9yLnVzZXJBZ2VudCA9PT0gJ3N0cmlu ZycgJiYgL1xiRWRnZVwvXGQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CisKK2Z1bmN0aW9u IGluc2VydFRyZWVDaGlsZHJlbih0cmVlKSB7CisgIGlmICghZW5hYmxlTGF6eSkgeworICAgIHJl dHVybjsKKyAgfQorICB2YXIgbm9kZSA9IHRyZWUubm9kZTsKKyAgdmFyIGNoaWxkcmVuID0gdHJl ZS5jaGlsZHJlbjsKKyAgaWYgKGNoaWxkcmVuLmxlbmd0aCkgeworICAgIGZvciAodmFyIGkgPSAw OyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKyAgICAgIGluc2VydFRyZWVCZWZvcmUobm9k ZSwgY2hpbGRyZW5baV0sIG51bGwpOworICAgIH0KKyAgfSBlbHNlIGlmICh0cmVlLmh0bWwgIT0g bnVsbCkgeworICAgIHNldElubmVySFRNTChub2RlLCB0cmVlLmh0bWwpOworICB9IGVsc2UgaWYg KHRyZWUudGV4dCAhPSBudWxsKSB7CisgICAgc2V0VGV4dENvbnRlbnQobm9kZSwgdHJlZS50ZXh0 KTsKKyAgfQorfQorCit2YXIgaW5zZXJ0VHJlZUJlZm9yZSA9IGNyZWF0ZU1pY3Jvc29mdFVuc2Fm ZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKHBhcmVudE5vZGUsIHRyZWUsIHJlZmVyZW5jZU5vZGUp IHsKKyAgLy8gRG9jdW1lbnRGcmFnbWVudHMgYXJlbid0IGFjdHVhbGx5IHBhcnQgb2YgdGhlIERP TSBhZnRlciBpbnNlcnRpb24gc28KKyAgLy8gYXBwZW5kaW5nIGNoaWxkcmVuIHdvbid0IHVwZGF0 ZSB0aGUgRE9NLiBXZSBuZWVkIHRvIGVuc3VyZSB0aGUgZnJhZ21lbnQKKyAgLy8gaXMgcHJvcGVy bHkgcG9wdWxhdGVkIGZpcnN0LCBicmVha2luZyBvdXQgb2Ygb3VyIGxhenkgYXBwcm9hY2ggZm9y IGp1c3QKKyAgLy8gdGhpcyBsZXZlbC4gQWxzbywgc29tZSA8b2JqZWN0PiBwbHVnaW5zIChsaWtl IEZsYXNoIFBsYXllcikgd2lsbCByZWFkCisgIC8vIDxwYXJhbT4gbm9kZXMgaW1tZWRpYXRlbHkg dXBvbiBpbnNlcnRpb24gaW50byB0aGUgRE9NLCBzbyA8b2JqZWN0PgorICAvLyBtdXN0IGFsc28g YmUgcG9wdWxhdGVkIHByaW9yIHRvIGluc2VydGlvbiBpbnRvIHRoZSBET00uCisgIGlmICh0cmVl Lm5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREVfVFlQRSB8fCB0cmVlLm5v ZGUubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERV9UWVBFICYmIHRyZWUubm9kZS5ub2RlTmFtZS50 b0xvd2VyQ2FzZSgpID09PSAnb2JqZWN0JyAmJiAodHJlZS5ub2RlLm5hbWVzcGFjZVVSSSA9PSBu dWxsIHx8IHRyZWUubm9kZS5uYW1lc3BhY2VVUkkgPT09IERPTU5hbWVzcGFjZXMuaHRtbCkpIHsK KyAgICBpbnNlcnRUcmVlQ2hpbGRyZW4odHJlZSk7CisgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZv cmUodHJlZS5ub2RlLCByZWZlcmVuY2VOb2RlKTsKKyAgfSBlbHNlIHsKKyAgICBwYXJlbnROb2Rl Lmluc2VydEJlZm9yZSh0cmVlLm5vZGUsIHJlZmVyZW5jZU5vZGUpOworICAgIGluc2VydFRyZWVD aGlsZHJlbih0cmVlKTsKKyAgfQorfSk7CisKK2Z1bmN0aW9uIHJlcGxhY2VDaGlsZFdpdGhUcmVl KG9sZE5vZGUsIG5ld1RyZWUpIHsKKyAgb2xkTm9kZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChu ZXdUcmVlLm5vZGUsIG9sZE5vZGUpOworICBpbnNlcnRUcmVlQ2hpbGRyZW4obmV3VHJlZSk7Cit9 CisKK2Z1bmN0aW9uIHF1ZXVlQ2hpbGQocGFyZW50VHJlZSwgY2hpbGRUcmVlKSB7CisgIGlmIChl bmFibGVMYXp5KSB7CisgICAgcGFyZW50VHJlZS5jaGlsZHJlbi5wdXNoKGNoaWxkVHJlZSk7Cisg IH0gZWxzZSB7CisgICAgcGFyZW50VHJlZS5ub2RlLmFwcGVuZENoaWxkKGNoaWxkVHJlZS5ub2Rl KTsKKyAgfQorfQorCitmdW5jdGlvbiBxdWV1ZUhUTUwodHJlZSwgaHRtbCkgeworICBpZiAoZW5h YmxlTGF6eSkgeworICAgIHRyZWUuaHRtbCA9IGh0bWw7CisgIH0gZWxzZSB7CisgICAgc2V0SW5u ZXJIVE1MKHRyZWUubm9kZSwgaHRtbCk7CisgIH0KK30KKworZnVuY3Rpb24gcXVldWVUZXh0KHRy ZWUsIHRleHQpIHsKKyAgaWYgKGVuYWJsZUxhenkpIHsKKyAgICB0cmVlLnRleHQgPSB0ZXh0Owor ICB9IGVsc2UgeworICAgIHNldFRleHRDb250ZW50KHRyZWUubm9kZSwgdGV4dCk7CisgIH0KK30K KworZnVuY3Rpb24gdG9TdHJpbmcoKSB7CisgIHJldHVybiB0aGlzLm5vZGUubm9kZU5hbWU7Cit9 CisKK2Z1bmN0aW9uIERPTUxhenlUcmVlKG5vZGUpIHsKKyAgcmV0dXJuIHsKKyAgICBub2RlOiBu b2RlLAorICAgIGNoaWxkcmVuOiBbXSwKKyAgICBodG1sOiBudWxsLAorICAgIHRleHQ6IG51bGws CisgICAgdG9TdHJpbmc6IHRvU3RyaW5nCisgIH07Cit9CisKK0RPTUxhenlUcmVlLmluc2VydFRy ZWVCZWZvcmUgPSBpbnNlcnRUcmVlQmVmb3JlOworRE9NTGF6eVRyZWUucmVwbGFjZUNoaWxkV2l0 aFRyZWUgPSByZXBsYWNlQ2hpbGRXaXRoVHJlZTsKK0RPTUxhenlUcmVlLnF1ZXVlQ2hpbGQgPSBx dWV1ZUNoaWxkOworRE9NTGF6eVRyZWUucXVldWVIVE1MID0gcXVldWVIVE1MOworRE9NTGF6eVRy ZWUucXVldWVUZXh0ID0gcXVldWVUZXh0OworCittb2R1bGUuZXhwb3J0cyA9IERPTUxhenlUcmVl OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0 YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9ET01OYW1lc3BhY2VzLmpzIGIvd2ViL3BnYWRtaW4v c3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL0RPTU5hbWVzcGFjZXMuanMKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLmExNGVmOGFhCi0tLSAvZGV2L251bGwKKysrIGIvd2Vi L3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL0RPTU5hbWVzcGFjZXMuanMKQEAg LTAsMCArMSwxOSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywg SW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlz IGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJ Q0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4g YWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhl IFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3Ry aWN0JzsKKwordmFyIERPTU5hbWVzcGFjZXMgPSB7CisgIGh0bWw6ICdodHRwOi8vd3d3LnczLm9y Zy8xOTk5L3hodG1sJywKKyAgbWF0aG1sOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01h dGhNTCcsCisgIHN2ZzogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJworfTsKKworbW9kdWxl LmV4cG9ydHMgPSBET01OYW1lc3BhY2VzOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlm ZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9ET01Qcm9w ZXJ0eS5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9ET01Qcm9w ZXJ0eS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uODdmN2U3M2MKLS0t IC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIv RE9NUHJvcGVydHkuanMKQEAgLTAsMCArMSwyMDkgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMt cHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog VGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2Ug Zm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRo aXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMg Y2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5Lgor ICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUo Jy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7CisKK3ZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpz L2xpYi9pbnZhcmlhbnQnKTsKKworZnVuY3Rpb24gY2hlY2tNYXNrKHZhbHVlLCBiaXRtYXNrKSB7 CisgIHJldHVybiAodmFsdWUgJiBiaXRtYXNrKSA9PT0gYml0bWFzazsKK30KKwordmFyIERPTVBy b3BlcnR5SW5qZWN0aW9uID0geworICAvKioKKyAgICogTWFwcGluZyBmcm9tIG5vcm1hbGl6ZWQs IGNhbWVsY2FzZWQgcHJvcGVydHkgbmFtZXMgdG8gYSBjb25maWd1cmF0aW9uIHRoYXQKKyAgICog c3BlY2lmaWVzIGhvdyB0aGUgYXNzb2NpYXRlZCBET00gcHJvcGVydHkgc2hvdWxkIGJlIGFjY2Vz c2VkIG9yIHJlbmRlcmVkLgorICAgKi8KKyAgTVVTVF9VU0VfUFJPUEVSVFk6IDB4MSwKKyAgSEFT X0JPT0xFQU5fVkFMVUU6IDB4NCwKKyAgSEFTX05VTUVSSUNfVkFMVUU6IDB4OCwKKyAgSEFTX1BP U0lUSVZFX05VTUVSSUNfVkFMVUU6IDB4MTAgfCAweDgsCisgIEhBU19PVkVSTE9BREVEX0JPT0xF QU5fVkFMVUU6IDB4MjAsCisKKyAgLyoqCisgICAqIEluamVjdCBzb21lIHNwZWNpYWxpemVkIGtu b3dsZWRnZSBhYm91dCB0aGUgRE9NLiBUaGlzIHRha2VzIGEgY29uZmlnIG9iamVjdAorICAgKiB3 aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICoKKyAgICogaXNDdXN0b21BdHRyaWJ1 dGU6IGZ1bmN0aW9uIHRoYXQgZ2l2ZW4gYW4gYXR0cmlidXRlIG5hbWUgd2lsbCByZXR1cm4gdHJ1 ZQorICAgKiBpZiBpdCBjYW4gYmUgaW5zZXJ0ZWQgaW50byB0aGUgRE9NIHZlcmJhdGltLiBVc2Vm dWwgZm9yIGRhdGEtKiBvciBhcmlhLSoKKyAgICogYXR0cmlidXRlcyB3aGVyZSBpdCdzIGltcG9z c2libGUgdG8gZW51bWVyYXRlIGFsbCBvZiB0aGUgcG9zc2libGUKKyAgICogYXR0cmlidXRlIG5h bWVzLAorICAgKgorICAgKiBQcm9wZXJ0aWVzOiBvYmplY3QgbWFwcGluZyBET00gcHJvcGVydHkg bmFtZSB0byBvbmUgb2YgdGhlCisgICAqIERPTVByb3BlcnR5SW5qZWN0aW9uIGNvbnN0YW50cyBv ciBudWxsLiBJZiB5b3VyIGF0dHJpYnV0ZSBpc24ndCBpbiBoZXJlLAorICAgKiBpdCB3b24ndCBn ZXQgd3JpdHRlbiB0byB0aGUgRE9NLgorICAgKgorICAgKiBET01BdHRyaWJ1dGVOYW1lczogb2Jq ZWN0IG1hcHBpbmcgUmVhY3QgYXR0cmlidXRlIG5hbWUgdG8gdGhlIERPTQorICAgKiBhdHRyaWJ1 dGUgbmFtZS4gQXR0cmlidXRlIG5hbWVzIG5vdCBzcGVjaWZpZWQgdXNlIHRoZSAqKmxvd2VyY2Fz ZSoqCisgICAqIG5vcm1hbGl6ZWQgbmFtZS4KKyAgICoKKyAgICogRE9NQXR0cmlidXRlTmFtZXNw YWNlczogb2JqZWN0IG1hcHBpbmcgUmVhY3QgYXR0cmlidXRlIG5hbWUgdG8gdGhlIERPTQorICAg KiBhdHRyaWJ1dGUgbmFtZXNwYWNlIFVSTC4gKEF0dHJpYnV0ZSBuYW1lcyBub3Qgc3BlY2lmaWVk IHVzZSBubyBuYW1lc3BhY2UuKQorICAgKgorICAgKiBET01Qcm9wZXJ0eU5hbWVzOiBzaW1pbGFy IHRvIERPTUF0dHJpYnV0ZU5hbWVzIGJ1dCBmb3IgRE9NIHByb3BlcnRpZXMuCisgICAqIFByb3Bl cnR5IG5hbWVzIG5vdCBzcGVjaWZpZWQgdXNlIHRoZSBub3JtYWxpemVkIG5hbWUuCisgICAqCisg ICAqIERPTU11dGF0aW9uTWV0aG9kczogUHJvcGVydGllcyB0aGF0IHJlcXVpcmUgc3BlY2lhbCBt dXRhdGlvbiBtZXRob2RzLiBJZgorICAgKiBgdmFsdWVgIGlzIHVuZGVmaW5lZCwgdGhlIG11dGF0 aW9uIG1ldGhvZCBzaG91bGQgdW5zZXQgdGhlIHByb3BlcnR5LgorICAgKgorICAgKiBAcGFyYW0g e29iamVjdH0gZG9tUHJvcGVydHlDb25maWcgdGhlIGNvbmZpZyBhcyBkZXNjcmliZWQgYWJvdmUu CisgICAqLworICBpbmplY3RET01Qcm9wZXJ0eUNvbmZpZzogZnVuY3Rpb24gKGRvbVByb3BlcnR5 Q29uZmlnKSB7CisgICAgdmFyIEluamVjdGlvbiA9IERPTVByb3BlcnR5SW5qZWN0aW9uOworICAg IHZhciBQcm9wZXJ0aWVzID0gZG9tUHJvcGVydHlDb25maWcuUHJvcGVydGllcyB8fCB7fTsKKyAg ICB2YXIgRE9NQXR0cmlidXRlTmFtZXNwYWNlcyA9IGRvbVByb3BlcnR5Q29uZmlnLkRPTUF0dHJp YnV0ZU5hbWVzcGFjZXMgfHwge307CisgICAgdmFyIERPTUF0dHJpYnV0ZU5hbWVzID0gZG9tUHJv cGVydHlDb25maWcuRE9NQXR0cmlidXRlTmFtZXMgfHwge307CisgICAgdmFyIERPTVByb3BlcnR5 TmFtZXMgPSBkb21Qcm9wZXJ0eUNvbmZpZy5ET01Qcm9wZXJ0eU5hbWVzIHx8IHt9OworICAgIHZh ciBET01NdXRhdGlvbk1ldGhvZHMgPSBkb21Qcm9wZXJ0eUNvbmZpZy5ET01NdXRhdGlvbk1ldGhv ZHMgfHwge307CisKKyAgICBpZiAoZG9tUHJvcGVydHlDb25maWcuaXNDdXN0b21BdHRyaWJ1dGUp IHsKKyAgICAgIERPTVByb3BlcnR5Ll9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9ucy5wdXNoKGRv bVByb3BlcnR5Q29uZmlnLmlzQ3VzdG9tQXR0cmlidXRlKTsKKyAgICB9CisKKyAgICBmb3IgKHZh ciBwcm9wTmFtZSBpbiBQcm9wZXJ0aWVzKSB7CisgICAgICAhIURPTVByb3BlcnR5LnByb3BlcnRp ZXMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdw cm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2luamVjdERPTVByb3BlcnR5Q29uZmlnKC4u Lik6IFlvdVwncmUgdHJ5aW5nIHRvIGluamVjdCBET00gcHJvcGVydHkgXCclc1wnIHdoaWNoIGhh cyBhbHJlYWR5IGJlZW4gaW5qZWN0ZWQuIFlvdSBtYXkgYmUgYWNjaWRlbnRhbGx5IGluamVjdGlu ZyB0aGUgc2FtZSBET00gcHJvcGVydHkgY29uZmlnIHR3aWNlLCBvciB5b3UgbWF5IGJlIGluamVj dGluZyB0d28gY29uZmlncyB0aGF0IGhhdmUgY29uZmxpY3RpbmcgcHJvcGVydHkgbmFtZXMuJywg cHJvcE5hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzQ4JywgcHJvcE5hbWUpIDogdm9pZCAwOworCisg ICAgICB2YXIgbG93ZXJDYXNlZCA9IHByb3BOYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgICB2YXIg cHJvcENvbmZpZyA9IFByb3BlcnRpZXNbcHJvcE5hbWVdOworCisgICAgICB2YXIgcHJvcGVydHlJ bmZvID0geworICAgICAgICBhdHRyaWJ1dGVOYW1lOiBsb3dlckNhc2VkLAorICAgICAgICBhdHRy aWJ1dGVOYW1lc3BhY2U6IG51bGwsCisgICAgICAgIHByb3BlcnR5TmFtZTogcHJvcE5hbWUsCisg ICAgICAgIG11dGF0aW9uTWV0aG9kOiBudWxsLAorCisgICAgICAgIG11c3RVc2VQcm9wZXJ0eTog Y2hlY2tNYXNrKHByb3BDb25maWcsIEluamVjdGlvbi5NVVNUX1VTRV9QUk9QRVJUWSksCisgICAg ICAgIGhhc0Jvb2xlYW5WYWx1ZTogY2hlY2tNYXNrKHByb3BDb25maWcsIEluamVjdGlvbi5IQVNf Qk9PTEVBTl9WQUxVRSksCisgICAgICAgIGhhc051bWVyaWNWYWx1ZTogY2hlY2tNYXNrKHByb3BD b25maWcsIEluamVjdGlvbi5IQVNfTlVNRVJJQ19WQUxVRSksCisgICAgICAgIGhhc1Bvc2l0aXZl TnVtZXJpY1ZhbHVlOiBjaGVja01hc2socHJvcENvbmZpZywgSW5qZWN0aW9uLkhBU19QT1NJVElW RV9OVU1FUklDX1ZBTFVFKSwKKyAgICAgICAgaGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZTogY2hl Y2tNYXNrKHByb3BDb25maWcsIEluamVjdGlvbi5IQVNfT1ZFUkxPQURFRF9CT09MRUFOX1ZBTFVF KQorICAgICAgfTsKKyAgICAgICEocHJvcGVydHlJbmZvLmhhc0Jvb2xlYW5WYWx1ZSArIHByb3Bl cnR5SW5mby5oYXNOdW1lcmljVmFsdWUgKyBwcm9wZXJ0eUluZm8uaGFzT3ZlcmxvYWRlZEJvb2xl YW5WYWx1ZSA8PSAxKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBp bnZhcmlhbnQoZmFsc2UsICdET01Qcm9wZXJ0eTogVmFsdWUgY2FuIGJlIG9uZSBvZiBib29sZWFu LCBvdmVybG9hZGVkIGJvb2xlYW4sIG9yIG51bWVyaWMgdmFsdWUsIGJ1dCBub3QgYSBjb21iaW5h dGlvbjogJXMnLCBwcm9wTmFtZSkgOiBfcHJvZEludmFyaWFudCgnNTAnLCBwcm9wTmFtZSkgOiB2 b2lkIDA7CisKKyAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24n KSB7CisgICAgICAgIERPTVByb3BlcnR5LmdldFBvc3NpYmxlU3RhbmRhcmROYW1lW2xvd2VyQ2Fz ZWRdID0gcHJvcE5hbWU7CisgICAgICB9CisKKyAgICAgIGlmIChET01BdHRyaWJ1dGVOYW1lcy5o YXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHsKKyAgICAgICAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBE T01BdHRyaWJ1dGVOYW1lc1twcm9wTmFtZV07CisgICAgICAgIHByb3BlcnR5SW5mby5hdHRyaWJ1 dGVOYW1lID0gYXR0cmlidXRlTmFtZTsKKyAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5W ICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICAgICBET01Qcm9wZXJ0eS5nZXRQb3NzaWJsZVN0 YW5kYXJkTmFtZVthdHRyaWJ1dGVOYW1lXSA9IHByb3BOYW1lOworICAgICAgICB9CisgICAgICB9 CisKKyAgICAgIGlmIChET01BdHRyaWJ1dGVOYW1lc3BhY2VzLmhhc093blByb3BlcnR5KHByb3BO YW1lKSkgeworICAgICAgICBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZXNwYWNlID0gRE9NQXR0 cmlidXRlTmFtZXNwYWNlc1twcm9wTmFtZV07CisgICAgICB9CisKKyAgICAgIGlmIChET01Qcm9w ZXJ0eU5hbWVzLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkgeworICAgICAgICBwcm9wZXJ0eUlu Zm8ucHJvcGVydHlOYW1lID0gRE9NUHJvcGVydHlOYW1lc1twcm9wTmFtZV07CisgICAgICB9CisK KyAgICAgIGlmIChET01NdXRhdGlvbk1ldGhvZHMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7 CisgICAgICAgIHByb3BlcnR5SW5mby5tdXRhdGlvbk1ldGhvZCA9IERPTU11dGF0aW9uTWV0aG9k c1twcm9wTmFtZV07CisgICAgICB9CisKKyAgICAgIERPTVByb3BlcnR5LnByb3BlcnRpZXNbcHJv cE5hbWVdID0gcHJvcGVydHlJbmZvOworICAgIH0KKyAgfQorfTsKKworLyogZXNsaW50LWRpc2Fi bGUgbWF4LWxlbiAqLwordmFyIEFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIgPSAnOkEtWl9hLXpc XHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAz N0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxc dTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkQnOworLyog ZXNsaW50LWVuYWJsZSBtYXgtbGVuICovCisKKy8qKgorICogRE9NUHJvcGVydHkgZXhwb3J0cyBs b29rdXAgb2JqZWN0cyB0aGF0IGNhbiBiZSB1c2VkIGxpa2UgZnVuY3Rpb25zOgorICoKKyAqICAg PiBET01Qcm9wZXJ0eS5pc1ZhbGlkWydpZCddCisgKiAgIHRydWUKKyAqICAgPiBET01Qcm9wZXJ0 eS5pc1ZhbGlkWydmb29iYXInXQorICogICB1bmRlZmluZWQKKyAqCisgKiBBbHRob3VnaCB0aGlz IG1heSBiZSBjb25mdXNpbmcsIGl0IHBlcmZvcm1zIGJldHRlciBpbiBnZW5lcmFsLgorICoKKyAq IEBzZWUgaHR0cDovL2pzcGVyZi5jb20va2V5LWV4aXN0cworICogQHNlZSBodHRwOi8vanNwZXJm LmNvbS9rZXktbWlzc2luZworICovCit2YXIgRE9NUHJvcGVydHkgPSB7CisKKyAgSURfQVRUUklC VVRFX05BTUU6ICdkYXRhLXJlYWN0aWQnLAorICBST09UX0FUVFJJQlVURV9OQU1FOiAnZGF0YS1y ZWFjdHJvb3QnLAorCisgIEFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVI6IEFUVFJJQlVURV9OQU1F X1NUQVJUX0NIQVIsCisgIEFUVFJJQlVURV9OQU1FX0NIQVI6IEFUVFJJQlVURV9OQU1FX1NUQVJU X0NIQVIgKyAnXFwtLjAtOVxcdTAwQjdcXHUwMzAwLVxcdTAzNkZcXHUyMDNGLVxcdTIwNDAnLAor CisgIC8qKgorICAgKiBNYXAgZnJvbSBwcm9wZXJ0eSAic3RhbmRhcmQgbmFtZSIgdG8gYW4gb2Jq ZWN0IHdpdGggaW5mbyBhYm91dCBob3cgdG8gc2V0CisgICAqIHRoZSBwcm9wZXJ0eSBpbiB0aGUg RE9NLiBFYWNoIG9iamVjdCBjb250YWluczoKKyAgICoKKyAgICogYXR0cmlidXRlTmFtZToKKyAg ICogICBVc2VkIHdoZW4gcmVuZGVyaW5nIG1hcmt1cCBvciB3aXRoIGAqQXR0cmlidXRlKClgLgor ICAgKiBhdHRyaWJ1dGVOYW1lc3BhY2UKKyAgICogcHJvcGVydHlOYW1lOgorICAgKiAgIFVzZWQg b24gRE9NIG5vZGUgaW5zdGFuY2VzLiAoVGhpcyBpbmNsdWRlcyBwcm9wZXJ0aWVzIHRoYXQgbXV0 YXRlIGR1ZSB0bworICAgKiAgIGV4dGVybmFsIGZhY3RvcnMuKQorICAgKiBtdXRhdGlvbk1ldGhv ZDoKKyAgICogICBJZiBub24tbnVsbCwgdXNlZCBpbnN0ZWFkIG9mIHRoZSBwcm9wZXJ0eSBvciBg c2V0QXR0cmlidXRlKClgIGFmdGVyCisgICAqICAgaW5pdGlhbCByZW5kZXIuCisgICAqIG11c3RV c2VQcm9wZXJ0eToKKyAgICogICBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBtdXN0IGJlIGFjY2Vzc2Vk IGFuZCBtdXRhdGVkIGFzIGFuIG9iamVjdCBwcm9wZXJ0eS4KKyAgICogaGFzQm9vbGVhblZhbHVl OgorICAgKiAgIFdoZXRoZXIgdGhlIHByb3BlcnR5IHNob3VsZCBiZSByZW1vdmVkIHdoZW4gc2V0 IHRvIGEgZmFsc2V5IHZhbHVlLgorICAgKiBoYXNOdW1lcmljVmFsdWU6CisgICAqICAgV2hldGhl ciB0aGUgcHJvcGVydHkgbXVzdCBiZSBudW1lcmljIG9yIHBhcnNlIGFzIGEgbnVtZXJpYyBhbmQg c2hvdWxkIGJlCisgICAqICAgcmVtb3ZlZCB3aGVuIHNldCB0byBhIGZhbHNleSB2YWx1ZS4KKyAg ICogaGFzUG9zaXRpdmVOdW1lcmljVmFsdWU6CisgICAqICAgV2hldGhlciB0aGUgcHJvcGVydHkg bXVzdCBiZSBwb3NpdGl2ZSBudW1lcmljIG9yIHBhcnNlIGFzIGEgcG9zaXRpdmUKKyAgICogICBu dW1lcmljIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIHNldCB0byBhIGZhbHNleSB2YWx1ZS4K KyAgICogaGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZToKKyAgICogICBXaGV0aGVyIHRoZSBwcm9w ZXJ0eSBjYW4gYmUgdXNlZCBhcyBhIGZsYWcgYXMgd2VsbCBhcyB3aXRoIGEgdmFsdWUuCisgICAq ICAgUmVtb3ZlZCB3aGVuIHN0cmljdGx5IGVxdWFsIHRvIGZhbHNlOyBwcmVzZW50IHdpdGhvdXQg YSB2YWx1ZSB3aGVuCisgICAqICAgc3RyaWN0bHkgZXF1YWwgdG8gdHJ1ZTsgcHJlc2VudCB3aXRo IGEgdmFsdWUgb3RoZXJ3aXNlLgorICAgKi8KKyAgcHJvcGVydGllczoge30sCisKKyAgLyoqCisg ICAqIE1hcHBpbmcgZnJvbSBsb3dlcmNhc2UgcHJvcGVydHkgbmFtZXMgdG8gdGhlIHByb3Blcmx5 IGNhc2VkIHZlcnNpb24sIHVzZWQKKyAgICogdG8gd2FybiBpbiB0aGUgY2FzZSBvZiBtaXNzaW5n IHByb3BlcnRpZXMuIEF2YWlsYWJsZSBvbmx5IGluIF9fREVWX18uCisgICAqCisgICAqIGF1dG9m b2N1cyBpcyBwcmVkZWZpbmVkLCBiZWNhdXNlIGFkZGluZyBpdCB0byB0aGUgcHJvcGVydHkgd2hp dGVsaXN0CisgICAqIGNhdXNlcyB1bmludGVuZGVkIHNpZGUgZWZmZWN0cy4KKyAgICoKKyAgICog QHR5cGUge09iamVjdH0KKyAgICovCisgIGdldFBvc3NpYmxlU3RhbmRhcmROYW1lOiBwcm9jZXNz LmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8geyBhdXRvZm9jdXM6ICdhdXRvRm9jdXMn IH0gOiBudWxsLAorCisgIC8qKgorICAgKiBBbGwgb2YgdGhlIGlzQ3VzdG9tQXR0cmlidXRlKCkg ZnVuY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIGluamVjdGVkLgorICAgKi8KKyAgX2lzQ3VzdG9tQXR0 cmlidXRlRnVuY3Rpb25zOiBbXSwKKworICAvKioKKyAgICogQ2hlY2tzIHdoZXRoZXIgYSBwcm9w ZXJ0eSBuYW1lIGlzIGEgY3VzdG9tIGF0dHJpYnV0ZS4KKyAgICogQG1ldGhvZAorICAgKi8KKyAg aXNDdXN0b21BdHRyaWJ1dGU6IGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7CisgICAgZm9yICh2 YXIgaSA9IDA7IGkgPCBET01Qcm9wZXJ0eS5faXNDdXN0b21BdHRyaWJ1dGVGdW5jdGlvbnMubGVu Z3RoOyBpKyspIHsKKyAgICAgIHZhciBpc0N1c3RvbUF0dHJpYnV0ZUZuID0gRE9NUHJvcGVydHku X2lzQ3VzdG9tQXR0cmlidXRlRnVuY3Rpb25zW2ldOworICAgICAgaWYgKGlzQ3VzdG9tQXR0cmli dXRlRm4oYXR0cmlidXRlTmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9Cisg ICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfSwKKworICBpbmplY3Rpb246IERPTVByb3BlcnR5 SW5qZWN0aW9uCit9OworCittb2R1bGUuZXhwb3J0cyA9IERPTVByb3BlcnR5OwpcIE5vIG5ld2xp bmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3Iv cmVhY3QtZG9tL2xpYi9ET01Qcm9wZXJ0eU9wZXJhdGlvbnMuanMgYi93ZWIvcGdhZG1pbi9zdGF0 aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvRE9NUHJvcGVydHlPcGVyYXRpb25zLmpzCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi45NGIxMTA5MwotLS0gL2Rldi9udWxsCisrKyBi L3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9ET01Qcm9wZXJ0eU9wZXJh dGlvbnMuanMKQEAgLTAsMCArMSwyMzYgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2Vu dCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBz b3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQg aW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291 cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJl IGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAq LworCisndXNlIHN0cmljdCc7CisKK3ZhciBET01Qcm9wZXJ0eSA9IHJlcXVpcmUoJy4vRE9NUHJv cGVydHknKTsKK3ZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9N Q29tcG9uZW50VHJlZScpOwordmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9S ZWFjdEluc3RydW1lbnRhdGlvbicpOworCit2YXIgcXVvdGVBdHRyaWJ1dGVWYWx1ZUZvckJyb3dz ZXIgPSByZXF1aXJlKCcuL3F1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyJyk7Cit2YXIgd2Fy bmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTsKKwordmFyIFZBTElEX0FUVFJJQlVU RV9OQU1FX1JFR0VYID0gbmV3IFJlZ0V4cCgnXlsnICsgRE9NUHJvcGVydHkuQVRUUklCVVRFX05B TUVfU1RBUlRfQ0hBUiArICddWycgKyBET01Qcm9wZXJ0eS5BVFRSSUJVVEVfTkFNRV9DSEFSICsg J10qJCcpOwordmFyIGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGUgPSB7fTsKK3ZhciB2YWxpZGF0 ZWRBdHRyaWJ1dGVOYW1lQ2FjaGUgPSB7fTsKKworZnVuY3Rpb24gaXNBdHRyaWJ1dGVOYW1lU2Fm ZShhdHRyaWJ1dGVOYW1lKSB7CisgIGlmICh2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGUuaGFz T3duUHJvcGVydHkoYXR0cmlidXRlTmFtZSkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBp ZiAoaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZS5oYXNPd25Qcm9wZXJ0eShhdHRyaWJ1dGVOYW1l KSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoVkFMSURfQVRUUklCVVRFX05BTUVf UkVHRVgudGVzdChhdHRyaWJ1dGVOYW1lKSkgeworICAgIHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVD YWNoZVthdHRyaWJ1dGVOYW1lXSA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgaWxs ZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZVthdHRyaWJ1dGVOYW1lXSA9IHRydWU7CisgIHByb2Nlc3Mu ZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnSW52YWxpZCBh dHRyaWJ1dGUgbmFtZTogYCVzYCcsIGF0dHJpYnV0ZU5hbWUpIDogdm9pZCAwOworICByZXR1cm4g ZmFsc2U7Cit9CisKK2Z1bmN0aW9uIHNob3VsZElnbm9yZVZhbHVlKHByb3BlcnR5SW5mbywgdmFs dWUpIHsKKyAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgcHJvcGVydHlJbmZvLmhhc0Jvb2xlYW5W YWx1ZSAmJiAhdmFsdWUgfHwgcHJvcGVydHlJbmZvLmhhc051bWVyaWNWYWx1ZSAmJiBpc05hTih2 YWx1ZSkgfHwgcHJvcGVydHlJbmZvLmhhc1Bvc2l0aXZlTnVtZXJpY1ZhbHVlICYmIHZhbHVlIDwg MSB8fCBwcm9wZXJ0eUluZm8uaGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZSAmJiB2YWx1ZSA9PT0g ZmFsc2U7Cit9CisKKy8qKgorICogT3BlcmF0aW9ucyBmb3IgZGVhbGluZyB3aXRoIERPTSBwcm9w ZXJ0aWVzLgorICovCit2YXIgRE9NUHJvcGVydHlPcGVyYXRpb25zID0geworCisgIC8qKgorICAg KiBDcmVhdGVzIG1hcmt1cCBmb3IgdGhlIElEIHByb3BlcnR5LgorICAgKgorICAgKiBAcGFyYW0g e3N0cmluZ30gaWQgVW5lc2NhcGVkIElELgorICAgKiBAcmV0dXJuIHtzdHJpbmd9IE1hcmt1cCBz dHJpbmcuCisgICAqLworICBjcmVhdGVNYXJrdXBGb3JJRDogZnVuY3Rpb24gKGlkKSB7CisgICAg cmV0dXJuIERPTVByb3BlcnR5LklEX0FUVFJJQlVURV9OQU1FICsgJz0nICsgcXVvdGVBdHRyaWJ1 dGVWYWx1ZUZvckJyb3dzZXIoaWQpOworICB9LAorCisgIHNldEF0dHJpYnV0ZUZvcklEOiBmdW5j dGlvbiAobm9kZSwgaWQpIHsKKyAgICBub2RlLnNldEF0dHJpYnV0ZShET01Qcm9wZXJ0eS5JRF9B VFRSSUJVVEVfTkFNRSwgaWQpOworICB9LAorCisgIGNyZWF0ZU1hcmt1cEZvclJvb3Q6IGZ1bmN0 aW9uICgpIHsKKyAgICByZXR1cm4gRE9NUHJvcGVydHkuUk9PVF9BVFRSSUJVVEVfTkFNRSArICc9 IiInOworICB9LAorCisgIHNldEF0dHJpYnV0ZUZvclJvb3Q6IGZ1bmN0aW9uIChub2RlKSB7Cisg ICAgbm9kZS5zZXRBdHRyaWJ1dGUoRE9NUHJvcGVydHkuUk9PVF9BVFRSSUJVVEVfTkFNRSwgJycp OworICB9LAorCisgIC8qKgorICAgKiBDcmVhdGVzIG1hcmt1cCBmb3IgYSBwcm9wZXJ0eS4KKyAg ICoKKyAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUKKyAgICogQHBhcmFtIHsqfSB2YWx1ZQorICAg KiBAcmV0dXJuIHs/c3RyaW5nfSBNYXJrdXAgc3RyaW5nLCBvciBudWxsIGlmIHRoZSBwcm9wZXJ0 eSB3YXMgaW52YWxpZC4KKyAgICovCisgIGNyZWF0ZU1hcmt1cEZvclByb3BlcnR5OiBmdW5jdGlv biAobmFtZSwgdmFsdWUpIHsKKyAgICB2YXIgcHJvcGVydHlJbmZvID0gRE9NUHJvcGVydHkucHJv cGVydGllcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IERPTVByb3BlcnR5LnByb3BlcnRpZXNbbmFt ZV0gOiBudWxsOworICAgIGlmIChwcm9wZXJ0eUluZm8pIHsKKyAgICAgIGlmIChzaG91bGRJZ25v cmVWYWx1ZShwcm9wZXJ0eUluZm8sIHZhbHVlKSkgeworICAgICAgICByZXR1cm4gJyc7CisgICAg ICB9CisgICAgICB2YXIgYXR0cmlidXRlTmFtZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1l OworICAgICAgaWYgKHByb3BlcnR5SW5mby5oYXNCb29sZWFuVmFsdWUgfHwgcHJvcGVydHlJbmZv Lmhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWUgJiYgdmFsdWUgPT09IHRydWUpIHsKKyAgICAgICAg cmV0dXJuIGF0dHJpYnV0ZU5hbWUgKyAnPSIiJzsKKyAgICAgIH0KKyAgICAgIHJldHVybiBhdHRy aWJ1dGVOYW1lICsgJz0nICsgcXVvdGVBdHRyaWJ1dGVWYWx1ZUZvckJyb3dzZXIodmFsdWUpOwor ICAgIH0gZWxzZSBpZiAoRE9NUHJvcGVydHkuaXNDdXN0b21BdHRyaWJ1dGUobmFtZSkpIHsKKyAg ICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHJldHVybiAnJzsKKyAgICAgIH0KKyAg ICAgIHJldHVybiBuYW1lICsgJz0nICsgcXVvdGVBdHRyaWJ1dGVWYWx1ZUZvckJyb3dzZXIodmFs dWUpOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfSwKKworICAvKioKKyAgICogQ3JlYXRl cyBtYXJrdXAgZm9yIGEgY3VzdG9tIHByb3BlcnR5LgorICAgKgorICAgKiBAcGFyYW0ge3N0cmlu Z30gbmFtZQorICAgKiBAcGFyYW0geyp9IHZhbHVlCisgICAqIEByZXR1cm4ge3N0cmluZ30gTWFy a3VwIHN0cmluZywgb3IgZW1wdHkgc3RyaW5nIGlmIHRoZSBwcm9wZXJ0eSB3YXMgaW52YWxpZC4K KyAgICovCisgIGNyZWF0ZU1hcmt1cEZvckN1c3RvbUF0dHJpYnV0ZTogZnVuY3Rpb24gKG5hbWUs IHZhbHVlKSB7CisgICAgaWYgKCFpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpIHx8IHZhbHVlID09 IG51bGwpIHsKKyAgICAgIHJldHVybiAnJzsKKyAgICB9CisgICAgcmV0dXJuIG5hbWUgKyAnPScg KyBxdW90ZUF0dHJpYnV0ZVZhbHVlRm9yQnJvd3Nlcih2YWx1ZSk7CisgIH0sCisKKyAgLyoqCisg ICAqIFNldHMgdGhlIHZhbHVlIGZvciBhIHByb3BlcnR5IG9uIGEgbm9kZS4KKyAgICoKKyAgICog QHBhcmFtIHtET01FbGVtZW50fSBub2RlCisgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCisgICAq IEBwYXJhbSB7Kn0gdmFsdWUKKyAgICovCisgIHNldFZhbHVlRm9yUHJvcGVydHk6IGZ1bmN0aW9u IChub2RlLCBuYW1lLCB2YWx1ZSkgeworICAgIHZhciBwcm9wZXJ0eUluZm8gPSBET01Qcm9wZXJ0 eS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KG5hbWUpID8gRE9NUHJvcGVydHkucHJvcGVydGll c1tuYW1lXSA6IG51bGw7CisgICAgaWYgKHByb3BlcnR5SW5mbykgeworICAgICAgdmFyIG11dGF0 aW9uTWV0aG9kID0gcHJvcGVydHlJbmZvLm11dGF0aW9uTWV0aG9kOworICAgICAgaWYgKG11dGF0 aW9uTWV0aG9kKSB7CisgICAgICAgIG11dGF0aW9uTWV0aG9kKG5vZGUsIHZhbHVlKTsKKyAgICAg IH0gZWxzZSBpZiAoc2hvdWxkSWdub3JlVmFsdWUocHJvcGVydHlJbmZvLCB2YWx1ZSkpIHsKKyAg ICAgICAgdGhpcy5kZWxldGVWYWx1ZUZvclByb3BlcnR5KG5vZGUsIG5hbWUpOworICAgICAgICBy ZXR1cm47CisgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5SW5mby5tdXN0VXNlUHJvcGVydHkpIHsK KyAgICAgICAgLy8gQ29udHJhcnkgdG8gYHNldEF0dHJpYnV0ZWAsIG9iamVjdCBwcm9wZXJ0aWVz IGFyZSBwcm9wZXJseQorICAgICAgICAvLyBgdG9TdHJpbmdgZWQgYnkgSUU4LzkuCisgICAgICAg IG5vZGVbcHJvcGVydHlJbmZvLnByb3BlcnR5TmFtZV0gPSB2YWx1ZTsKKyAgICAgIH0gZWxzZSB7 CisgICAgICAgIHZhciBhdHRyaWJ1dGVOYW1lID0gcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWU7 CisgICAgICAgIHZhciBuYW1lc3BhY2UgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZXNwYWNl OworICAgICAgICAvLyBgc2V0QXR0cmlidXRlYCB3aXRoIG9iamVjdHMgYmVjb21lcyBvbmx5IGBb b2JqZWN0XWAgaW4gSUU4LzksCisgICAgICAgIC8vICgnJyArIHZhbHVlKSBtYWtlcyBpdCBvdXRw dXQgdGhlIGNvcnJlY3QgdG9TdHJpbmcoKS12YWx1ZS4KKyAgICAgICAgaWYgKG5hbWVzcGFjZSkg eworICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlTlMobmFtZXNwYWNlLCBhdHRyaWJ1dGVOYW1l LCAnJyArIHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eUluZm8uaGFzQm9vbGVh blZhbHVlIHx8IHByb3BlcnR5SW5mby5oYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlICYmIHZhbHVl ID09PSB0cnVlKSB7CisgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwg JycpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGF0dHJp YnV0ZU5hbWUsICcnICsgdmFsdWUpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlm IChET01Qcm9wZXJ0eS5pc0N1c3RvbUF0dHJpYnV0ZShuYW1lKSkgeworICAgICAgRE9NUHJvcGVy dHlPcGVyYXRpb25zLnNldFZhbHVlRm9yQXR0cmlidXRlKG5vZGUsIG5hbWUsIHZhbHVlKTsKKyAg ICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdw cm9kdWN0aW9uJykgeworICAgICAgdmFyIHBheWxvYWQgPSB7fTsKKyAgICAgIHBheWxvYWRbbmFt ZV0gPSB2YWx1ZTsKKyAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RP cGVyYXRpb24oeworICAgICAgICBpbnN0YW5jZUlEOiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0 SW5zdGFuY2VGcm9tTm9kZShub2RlKS5fZGVidWdJRCwKKyAgICAgICAgdHlwZTogJ3VwZGF0ZSBh dHRyaWJ1dGUnLAorICAgICAgICBwYXlsb2FkOiBwYXlsb2FkCisgICAgICB9KTsKKyAgICB9Cisg IH0sCisKKyAgc2V0VmFsdWVGb3JBdHRyaWJ1dGU6IGZ1bmN0aW9uIChub2RlLCBuYW1lLCB2YWx1 ZSkgeworICAgIGlmICghaXNBdHRyaWJ1dGVOYW1lU2FmZShuYW1lKSkgeworICAgICAgcmV0dXJu OworICAgIH0KKyAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgbm9kZS5yZW1vdmVBdHRy aWJ1dGUobmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG5vZGUuc2V0QXR0cmlidXRlKG5hbWUs ICcnICsgdmFsdWUpOworICAgIH0KKworICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0g J3Byb2R1Y3Rpb24nKSB7CisgICAgICB2YXIgcGF5bG9hZCA9IHt9OworICAgICAgcGF5bG9hZFtu YW1lXSA9IHZhbHVlOworICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9z dE9wZXJhdGlvbih7CisgICAgICAgIGluc3RhbmNlSUQ6IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5n ZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpLl9kZWJ1Z0lELAorICAgICAgICB0eXBlOiAndXBkYXRl IGF0dHJpYnV0ZScsCisgICAgICAgIHBheWxvYWQ6IHBheWxvYWQKKyAgICAgIH0pOworICAgIH0K KyAgfSwKKworICAvKioKKyAgICogRGVsZXRlcyBhbiBhdHRyaWJ1dGVzIGZyb20gYSBub2RlLgor ICAgKgorICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGUKKyAgICogQHBhcmFtIHtzdHJpbmd9 IG5hbWUKKyAgICovCisgIGRlbGV0ZVZhbHVlRm9yQXR0cmlidXRlOiBmdW5jdGlvbiAobm9kZSwg bmFtZSkgeworICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpOworICAgIGlmIChwcm9jZXNz LmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICBSZWFjdEluc3RydW1lbnRh dGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHsKKyAgICAgICAgaW5zdGFuY2VJRDogUmVh Y3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUobm9kZSkuX2RlYnVnSUQsCisg ICAgICAgIHR5cGU6ICdyZW1vdmUgYXR0cmlidXRlJywKKyAgICAgICAgcGF5bG9hZDogbmFtZQor ICAgICAgfSk7CisgICAgfQorICB9LAorCisgIC8qKgorICAgKiBEZWxldGVzIHRoZSB2YWx1ZSBm b3IgYSBwcm9wZXJ0eSBvbiBhIG5vZGUuCisgICAqCisgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0g bm9kZQorICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZQorICAgKi8KKyAgZGVsZXRlVmFsdWVGb3JQ cm9wZXJ0eTogZnVuY3Rpb24gKG5vZGUsIG5hbWUpIHsKKyAgICB2YXIgcHJvcGVydHlJbmZvID0g RE9NUHJvcGVydHkucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IERPTVByb3BlcnR5 LnByb3BlcnRpZXNbbmFtZV0gOiBudWxsOworICAgIGlmIChwcm9wZXJ0eUluZm8pIHsKKyAgICAg IHZhciBtdXRhdGlvbk1ldGhvZCA9IHByb3BlcnR5SW5mby5tdXRhdGlvbk1ldGhvZDsKKyAgICAg IGlmIChtdXRhdGlvbk1ldGhvZCkgeworICAgICAgICBtdXRhdGlvbk1ldGhvZChub2RlLCB1bmRl ZmluZWQpOworICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eUluZm8ubXVzdFVzZVByb3BlcnR5KSB7 CisgICAgICAgIHZhciBwcm9wTmFtZSA9IHByb3BlcnR5SW5mby5wcm9wZXJ0eU5hbWU7CisgICAg ICAgIGlmIChwcm9wZXJ0eUluZm8uaGFzQm9vbGVhblZhbHVlKSB7CisgICAgICAgICAgbm9kZVtw cm9wTmFtZV0gPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBub2RlW3Byb3BO YW1lXSA9ICcnOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBub2RlLnJlbW92 ZUF0dHJpYnV0ZShwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZSk7CisgICAgICB9CisgICAgfSBl bHNlIGlmIChET01Qcm9wZXJ0eS5pc0N1c3RvbUF0dHJpYnV0ZShuYW1lKSkgeworICAgICAgbm9k ZS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgfQorCisgICAgaWYgKHByb2Nlc3MuZW52Lk5P REVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRl YnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oeworICAgICAgICBpbnN0YW5jZUlEOiBSZWFjdERPTUNv bXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShub2RlKS5fZGVidWdJRCwKKyAgICAgICAg dHlwZTogJ3JlbW92ZSBhdHRyaWJ1dGUnLAorICAgICAgICBwYXlsb2FkOiBuYW1lCisgICAgICB9 KTsKKyAgICB9CisgIH0KKworfTsKKworbW9kdWxlLmV4cG9ydHMgPSBET01Qcm9wZXJ0eU9wZXJh dGlvbnM7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRt aW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL0Rhbmdlci5qcyBiL3dlYi9wZ2FkbWluL3N0 YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9EYW5nZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMDAuLmNlM2U0OTFjCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4v c3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL0Rhbmdlci5qcwpAQCAtMCwwICsxLDQ3IEBACisv KioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmln aHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIg dGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRo ZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50 CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGlu IHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX3By b2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpOworCit2YXIgRE9N TGF6eVRyZWUgPSByZXF1aXJlKCcuL0RPTUxhenlUcmVlJyk7Cit2YXIgRXhlY3V0aW9uRW52aXJv bm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpOworCit2YXIg Y3JlYXRlTm9kZXNGcm9tTWFya3VwID0gcmVxdWlyZSgnZmJqcy9saWIvY3JlYXRlTm9kZXNGcm9t TWFya3VwJyk7Cit2YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5RnVu Y3Rpb24nKTsKK3ZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTsK KwordmFyIERhbmdlciA9IHsKKworICAvKioKKyAgICogUmVwbGFjZXMgYSBub2RlIHdpdGggYSBz dHJpbmcgb2YgbWFya3VwIGF0IGl0cyBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiBpdHMKKyAgICog cGFyZW50LiBUaGUgbWFya3VwIG11c3QgcmVuZGVyIGludG8gYSBzaW5nbGUgcm9vdCBub2RlLgor ICAgKgorICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG9sZENoaWxkIENoaWxkIG5vZGUgdG8gcmVw bGFjZS4KKyAgICogQHBhcmFtIHtzdHJpbmd9IG1hcmt1cCBNYXJrdXAgdG8gcmVuZGVyIGluIHBs YWNlIG9mIHRoZSBjaGlsZCBub2RlLgorICAgKiBAaW50ZXJuYWwKKyAgICovCisgIGRhbmdlcm91 c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwOiBmdW5jdGlvbiAob2xkQ2hpbGQsIG1hcmt1cCkgewor ICAgICFFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gPyBwcm9jZXNzLmVudi5OT0RFX0VO ViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnZGFuZ2Vyb3VzbHlSZXBsYWNl Tm9kZVdpdGhNYXJrdXAoLi4uKTogQ2Fubm90IHJlbmRlciBtYXJrdXAgaW4gYSB3b3JrZXIgdGhy ZWFkLiBNYWtlIHN1cmUgYHdpbmRvd2AgYW5kIGBkb2N1bWVudGAgYXJlIGF2YWlsYWJsZSBnbG9i YWxseSBiZWZvcmUgcmVxdWlyaW5nIFJlYWN0IHdoZW4gdW5pdCB0ZXN0aW5nIG9yIHVzZSBSZWFj dERPTVNlcnZlci5yZW5kZXJUb1N0cmluZygpIGZvciBzZXJ2ZXIgcmVuZGVyaW5nLicpIDogX3By b2RJbnZhcmlhbnQoJzU2JykgOiB2b2lkIDA7CisgICAgIW1hcmt1cCA/IHByb2Nlc3MuZW52Lk5P REVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdkYW5nZXJvdXNseVJl cGxhY2VOb2RlV2l0aE1hcmt1cCguLi4pOiBNaXNzaW5nIG1hcmt1cC4nKSA6IF9wcm9kSW52YXJp YW50KCc1NycpIDogdm9pZCAwOworICAgICEob2xkQ2hpbGQubm9kZU5hbWUgIT09ICdIVE1MJykg PyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNl LCAnZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXAoLi4uKTogQ2Fubm90IHJlcGxhY2Ug bWFya3VwIG9mIHRoZSA8aHRtbD4gbm9kZS4gVGhpcyBpcyBiZWNhdXNlIGJyb3dzZXIgcXVpcmtz IG1ha2UgdGhpcyB1bnJlbGlhYmxlIGFuZC9vciBzbG93LiBJZiB5b3Ugd2FudCB0byByZW5kZXIg dG8gdGhlIHJvb3QgeW91IG11c3QgdXNlIHNlcnZlciByZW5kZXJpbmcuIFNlZSBSZWFjdERPTVNl cnZlci5yZW5kZXJUb1N0cmluZygpLicpIDogX3Byb2RJbnZhcmlhbnQoJzU4JykgOiB2b2lkIDA7 CisKKyAgICBpZiAodHlwZW9mIG1hcmt1cCA9PT0gJ3N0cmluZycpIHsKKyAgICAgIHZhciBuZXdD aGlsZCA9IGNyZWF0ZU5vZGVzRnJvbU1hcmt1cChtYXJrdXAsIGVtcHR5RnVuY3Rpb24pWzBdOwor ICAgICAgb2xkQ2hpbGQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobmV3Q2hpbGQsIG9sZENoaWxk KTsKKyAgICB9IGVsc2UgeworICAgICAgRE9NTGF6eVRyZWUucmVwbGFjZUNoaWxkV2l0aFRyZWUo b2xkQ2hpbGQsIG1hcmt1cCk7CisgICAgfQorICB9CisKK307CisKK21vZHVsZS5leHBvcnRzID0g RGFuZ2VyOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2Fk bWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9EZWZhdWx0RXZlbnRQbHVnaW5PcmRlci5q cyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9EZWZhdWx0RXZlbnRQ bHVnaW5PcmRlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uMjcyMzE4 Y2IKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRv bS9saWIvRGVmYXVsdEV2ZW50UGx1Z2luT3JkZXIuanMKQEAgLTAsMCArMSwyNSBAQAorLyoqCisg KiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyBy ZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBC U0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9v dCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICog b2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUg c2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKworLyoqCisgKiBNb2R1 bGUgdGhhdCBpcyBpbmplY3RhYmxlIGludG8gYEV2ZW50UGx1Z2luSHViYCwgdGhhdCBzcGVjaWZp ZXMgYQorICogZGV0ZXJtaW5pc3RpYyBvcmRlcmluZyBvZiBgRXZlbnRQbHVnaW5gcy4gQSBjb252 ZW5pZW50IHdheSB0byByZWFzb24gYWJvdXQKKyAqIHBsdWdpbnMsIHdpdGhvdXQgaGF2aW5nIHRv IHBhY2thZ2UgZXZlcnkgb25lIG9mIHRoZW0uIFRoaXMgaXMgYmV0dGVyIHRoYW4KKyAqIGhhdmlu ZyBwbHVnaW5zIGJlIG9yZGVyZWQgaW4gdGhlIHNhbWUgb3JkZXIgdGhhdCB0aGV5IGFyZSBpbmpl Y3RlZCBiZWNhdXNlCisgKiB0aGF0IG9yZGVyaW5nIHdvdWxkIGJlIGluZmx1ZW5jZWQgYnkgdGhl IHBhY2thZ2luZyBvcmRlci4KKyAqIGBSZXNwb25kZXJFdmVudFBsdWdpbmAgbXVzdCBvY2N1ciBi ZWZvcmUgYFNpbXBsZUV2ZW50UGx1Z2luYCBzbyB0aGF0CisgKiBwcmV2ZW50aW5nIGRlZmF1bHQg b24gZXZlbnRzIGlzIGNvbnZlbmllbnQgaW4gYFNpbXBsZUV2ZW50UGx1Z2luYCBoYW5kbGVycy4K KyAqLworCit2YXIgRGVmYXVsdEV2ZW50UGx1Z2luT3JkZXIgPSBbJ1Jlc3BvbmRlckV2ZW50UGx1 Z2luJywgJ1NpbXBsZUV2ZW50UGx1Z2luJywgJ1RhcEV2ZW50UGx1Z2luJywgJ0VudGVyTGVhdmVF dmVudFBsdWdpbicsICdDaGFuZ2VFdmVudFBsdWdpbicsICdTZWxlY3RFdmVudFBsdWdpbicsICdC ZWZvcmVJbnB1dEV2ZW50UGx1Z2luJ107CisKK21vZHVsZS5leHBvcnRzID0gRGVmYXVsdEV2ZW50 UGx1Z2luT3JkZXI7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2Vi L3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL0VudGVyTGVhdmVFdmVudFBsdWdp bi5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9FbnRlckxlYXZl RXZlbnRQbHVnaW4uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjliMDdk MDhhCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1k b20vbGliL0VudGVyTGVhdmVFdmVudFBsdWdpbi5qcwpAQCAtMCwwICsxLDk5IEBACisvKioKKyAq IENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJl c2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJT RC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290 IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBv ZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBz YW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgRXZlbnRQcm9w YWdhdG9ycyA9IHJlcXVpcmUoJy4vRXZlbnRQcm9wYWdhdG9ycycpOwordmFyIFJlYWN0RE9NQ29t cG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7Cit2YXIgU3lu dGhldGljTW91c2VFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljTW91c2VFdmVudCcpOworCit2 YXIgZXZlbnRUeXBlcyA9IHsKKyAgbW91c2VFbnRlcjogeworICAgIHJlZ2lzdHJhdGlvbk5hbWU6 ICdvbk1vdXNlRW50ZXInLAorICAgIGRlcGVuZGVuY2llczogWyd0b3BNb3VzZU91dCcsICd0b3BN b3VzZU92ZXInXQorICB9LAorICBtb3VzZUxlYXZlOiB7CisgICAgcmVnaXN0cmF0aW9uTmFtZTog J29uTW91c2VMZWF2ZScsCisgICAgZGVwZW5kZW5jaWVzOiBbJ3RvcE1vdXNlT3V0JywgJ3RvcE1v dXNlT3ZlciddCisgIH0KK307CisKK3ZhciBFbnRlckxlYXZlRXZlbnRQbHVnaW4gPSB7CisKKyAg ZXZlbnRUeXBlczogZXZlbnRUeXBlcywKKworICAvKioKKyAgICogRm9yIGFsbW9zdCBldmVyeSBp bnRlcmFjdGlvbiB3ZSBjYXJlIGFib3V0LCB0aGVyZSB3aWxsIGJlIGJvdGggYSB0b3AtbGV2ZWwK KyAgICogYG1vdXNlb3ZlcmAgYW5kIGBtb3VzZW91dGAgZXZlbnQgdGhhdCBvY2N1cnMuIE9ubHkg dXNlIGBtb3VzZW91dGAgc28gdGhhdAorICAgKiB3ZSBkbyBub3QgZXh0cmFjdCBkdXBsaWNhdGUg ZXZlbnRzLiBIb3dldmVyLCBtb3ZpbmcgdGhlIG1vdXNlIGludG8gdGhlCisgICAqIGJyb3dzZXIg ZnJvbSBvdXRzaWRlIHdpbGwgbm90IGZpcmUgYSBgbW91c2VvdXRgIGV2ZW50LiBJbiB0aGlzIGNh c2UsIHdlIHVzZQorICAgKiB0aGUgYG1vdXNlb3ZlcmAgdG9wLWxldmVsIGV2ZW50LgorICAgKi8K KyAgZXh0cmFjdEV2ZW50czogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0 aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7CisgICAgaWYgKHRvcExldmVsVHlwZSA9PT0g J3RvcE1vdXNlT3ZlcicgJiYgKG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZl bnQuZnJvbUVsZW1lbnQpKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgaWYgKHRv cExldmVsVHlwZSAhPT0gJ3RvcE1vdXNlT3V0JyAmJiB0b3BMZXZlbFR5cGUgIT09ICd0b3BNb3Vz ZU92ZXInKSB7CisgICAgICAvLyBNdXN0IG5vdCBiZSBhIG1vdXNlIGluIG9yIG1vdXNlIG91dCAt IGlnbm9yaW5nLgorICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgdmFyIHdpbjsKKyAg ICBpZiAobmF0aXZlRXZlbnRUYXJnZXQud2luZG93ID09PSBuYXRpdmVFdmVudFRhcmdldCkgewor ICAgICAgLy8gYG5hdGl2ZUV2ZW50VGFyZ2V0YCBpcyBwcm9iYWJseSBhIHdpbmRvdyBvYmplY3Qu CisgICAgICB3aW4gPSBuYXRpdmVFdmVudFRhcmdldDsKKyAgICB9IGVsc2UgeworICAgICAgLy8g VE9ETzogRmlndXJlIG91dCB3aHkgYG93bmVyRG9jdW1lbnRgIGlzIHNvbWV0aW1lcyB1bmRlZmlu ZWQgaW4gSUU4LgorICAgICAgdmFyIGRvYyA9IG5hdGl2ZUV2ZW50VGFyZ2V0Lm93bmVyRG9jdW1l bnQ7CisgICAgICBpZiAoZG9jKSB7CisgICAgICAgIHdpbiA9IGRvYy5kZWZhdWx0VmlldyB8fCBk b2MucGFyZW50V2luZG93OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgd2luID0gd2luZG93Owor ICAgICAgfQorICAgIH0KKworICAgIHZhciBmcm9tOworICAgIHZhciB0bzsKKyAgICBpZiAodG9w TGV2ZWxUeXBlID09PSAndG9wTW91c2VPdXQnKSB7CisgICAgICBmcm9tID0gdGFyZ2V0SW5zdDsK KyAgICAgIHZhciByZWxhdGVkID0gbmF0aXZlRXZlbnQucmVsYXRlZFRhcmdldCB8fCBuYXRpdmVF dmVudC50b0VsZW1lbnQ7CisgICAgICB0byA9IHJlbGF0ZWQgPyBSZWFjdERPTUNvbXBvbmVudFRy ZWUuZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUocmVsYXRlZCkgOiBudWxsOworICAgIH0gZWxz ZSB7CisgICAgICAvLyBNb3ZpbmcgdG8gYSBub2RlIGZyb20gb3V0c2lkZSB0aGUgd2luZG93Lgor ICAgICAgZnJvbSA9IG51bGw7CisgICAgICB0byA9IHRhcmdldEluc3Q7CisgICAgfQorCisgICAg aWYgKGZyb20gPT09IHRvKSB7CisgICAgICAvLyBOb3RoaW5nIHBlcnRhaW5zIHRvIG91ciBtYW5h Z2VkIGNvbXBvbmVudHMuCisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICB2YXIgZnJv bU5vZGUgPSBmcm9tID09IG51bGwgPyB3aW4gOiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9k ZUZyb21JbnN0YW5jZShmcm9tKTsKKyAgICB2YXIgdG9Ob2RlID0gdG8gPT0gbnVsbCA/IHdpbiA6 IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKHRvKTsKKworICAgIHZh ciBsZWF2ZSA9IFN5bnRoZXRpY01vdXNlRXZlbnQuZ2V0UG9vbGVkKGV2ZW50VHlwZXMubW91c2VM ZWF2ZSwgZnJvbSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTsKKyAgICBsZWF2ZS50 eXBlID0gJ21vdXNlbGVhdmUnOworICAgIGxlYXZlLnRhcmdldCA9IGZyb21Ob2RlOworICAgIGxl YXZlLnJlbGF0ZWRUYXJnZXQgPSB0b05vZGU7CisKKyAgICB2YXIgZW50ZXIgPSBTeW50aGV0aWNN b3VzZUV2ZW50LmdldFBvb2xlZChldmVudFR5cGVzLm1vdXNlRW50ZXIsIHRvLCBuYXRpdmVFdmVu dCwgbmF0aXZlRXZlbnRUYXJnZXQpOworICAgIGVudGVyLnR5cGUgPSAnbW91c2VlbnRlcic7Cisg ICAgZW50ZXIudGFyZ2V0ID0gdG9Ob2RlOworICAgIGVudGVyLnJlbGF0ZWRUYXJnZXQgPSBmcm9t Tm9kZTsKKworICAgIEV2ZW50UHJvcGFnYXRvcnMuYWNjdW11bGF0ZUVudGVyTGVhdmVEaXNwYXRj aGVzKGxlYXZlLCBlbnRlciwgZnJvbSwgdG8pOworCisgICAgcmV0dXJuIFtsZWF2ZSwgZW50ZXJd OworICB9CisKK307CisKK21vZHVsZS5leHBvcnRzID0gRW50ZXJMZWF2ZUV2ZW50UGx1Z2luOwpc IE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRp Yy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9FdmVudENvbnN0YW50cy5qcyBiL3dlYi9wZ2FkbWluL3N0 YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9FdmVudENvbnN0YW50cy5qcwpuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMC4uNTg4NjgwM2QKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIv cGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvRXZlbnRDb25zdGFudHMuanMKQEAg LTAsMCArMSw5MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywg SW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlz IGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJ Q0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4g YWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhl IFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3Ry aWN0JzsKKworLyoqCisgKiBUeXBlcyBvZiByYXcgc2lnbmFscyBmcm9tIHRoZSBicm93c2VyIGNh dWdodCBhdCB0aGUgdG9wIGxldmVsLgorICovCit2YXIgdG9wTGV2ZWxUeXBlcyA9IHsKKyAgdG9w QWJvcnQ6IG51bGwsCisgIHRvcEFuaW1hdGlvbkVuZDogbnVsbCwKKyAgdG9wQW5pbWF0aW9uSXRl cmF0aW9uOiBudWxsLAorICB0b3BBbmltYXRpb25TdGFydDogbnVsbCwKKyAgdG9wQmx1cjogbnVs bCwKKyAgdG9wQ2FuUGxheTogbnVsbCwKKyAgdG9wQ2FuUGxheVRocm91Z2g6IG51bGwsCisgIHRv cENoYW5nZTogbnVsbCwKKyAgdG9wQ2xpY2s6IG51bGwsCisgIHRvcENvbXBvc2l0aW9uRW5kOiBu dWxsLAorICB0b3BDb21wb3NpdGlvblN0YXJ0OiBudWxsLAorICB0b3BDb21wb3NpdGlvblVwZGF0 ZTogbnVsbCwKKyAgdG9wQ29udGV4dE1lbnU6IG51bGwsCisgIHRvcENvcHk6IG51bGwsCisgIHRv cEN1dDogbnVsbCwKKyAgdG9wRG91YmxlQ2xpY2s6IG51bGwsCisgIHRvcERyYWc6IG51bGwsCisg IHRvcERyYWdFbmQ6IG51bGwsCisgIHRvcERyYWdFbnRlcjogbnVsbCwKKyAgdG9wRHJhZ0V4aXQ6 IG51bGwsCisgIHRvcERyYWdMZWF2ZTogbnVsbCwKKyAgdG9wRHJhZ092ZXI6IG51bGwsCisgIHRv cERyYWdTdGFydDogbnVsbCwKKyAgdG9wRHJvcDogbnVsbCwKKyAgdG9wRHVyYXRpb25DaGFuZ2U6 IG51bGwsCisgIHRvcEVtcHRpZWQ6IG51bGwsCisgIHRvcEVuY3J5cHRlZDogbnVsbCwKKyAgdG9w RW5kZWQ6IG51bGwsCisgIHRvcEVycm9yOiBudWxsLAorICB0b3BGb2N1czogbnVsbCwKKyAgdG9w SW5wdXQ6IG51bGwsCisgIHRvcEludmFsaWQ6IG51bGwsCisgIHRvcEtleURvd246IG51bGwsCisg IHRvcEtleVByZXNzOiBudWxsLAorICB0b3BLZXlVcDogbnVsbCwKKyAgdG9wTG9hZDogbnVsbCwK KyAgdG9wTG9hZGVkRGF0YTogbnVsbCwKKyAgdG9wTG9hZGVkTWV0YWRhdGE6IG51bGwsCisgIHRv cExvYWRTdGFydDogbnVsbCwKKyAgdG9wTW91c2VEb3duOiBudWxsLAorICB0b3BNb3VzZU1vdmU6 IG51bGwsCisgIHRvcE1vdXNlT3V0OiBudWxsLAorICB0b3BNb3VzZU92ZXI6IG51bGwsCisgIHRv cE1vdXNlVXA6IG51bGwsCisgIHRvcFBhc3RlOiBudWxsLAorICB0b3BQYXVzZTogbnVsbCwKKyAg dG9wUGxheTogbnVsbCwKKyAgdG9wUGxheWluZzogbnVsbCwKKyAgdG9wUHJvZ3Jlc3M6IG51bGws CisgIHRvcFJhdGVDaGFuZ2U6IG51bGwsCisgIHRvcFJlc2V0OiBudWxsLAorICB0b3BTY3JvbGw6 IG51bGwsCisgIHRvcFNlZWtlZDogbnVsbCwKKyAgdG9wU2Vla2luZzogbnVsbCwKKyAgdG9wU2Vs ZWN0aW9uQ2hhbmdlOiBudWxsLAorICB0b3BTdGFsbGVkOiBudWxsLAorICB0b3BTdWJtaXQ6IG51 bGwsCisgIHRvcFN1c3BlbmQ6IG51bGwsCisgIHRvcFRleHRJbnB1dDogbnVsbCwKKyAgdG9wVGlt ZVVwZGF0ZTogbnVsbCwKKyAgdG9wVG91Y2hDYW5jZWw6IG51bGwsCisgIHRvcFRvdWNoRW5kOiBu dWxsLAorICB0b3BUb3VjaE1vdmU6IG51bGwsCisgIHRvcFRvdWNoU3RhcnQ6IG51bGwsCisgIHRv cFRyYW5zaXRpb25FbmQ6IG51bGwsCisgIHRvcFZvbHVtZUNoYW5nZTogbnVsbCwKKyAgdG9wV2Fp dGluZzogbnVsbCwKKyAgdG9wV2hlZWw6IG51bGwKK307CisKK3ZhciBFdmVudENvbnN0YW50cyA9 IHsKKyAgdG9wTGV2ZWxUeXBlczogdG9wTGV2ZWxUeXBlcworfTsKKworbW9kdWxlLmV4cG9ydHMg PSBFdmVudENvbnN0YW50czsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQg YS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvRXZlbnRQbHVnaW5IdWIu anMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvRXZlbnRQbHVnaW5I dWIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLmVlOTViMTI1Ci0tLSAv ZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL0V2 ZW50UGx1Z2luSHViLmpzCkBAIC0wLDAgKzEsMjc3IEBACisvKioKKyAqIENvcHlyaWdodCAyMDEz LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq IFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNl IGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0 aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRz IGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4K KyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJl KCcuL3JlYWN0UHJvZEludmFyaWFudCcpOworCit2YXIgRXZlbnRQbHVnaW5SZWdpc3RyeSA9IHJl cXVpcmUoJy4vRXZlbnRQbHVnaW5SZWdpc3RyeScpOwordmFyIEV2ZW50UGx1Z2luVXRpbHMgPSBy ZXF1aXJlKCcuL0V2ZW50UGx1Z2luVXRpbHMnKTsKK3ZhciBSZWFjdEVycm9yVXRpbHMgPSByZXF1 aXJlKCcuL1JlYWN0RXJyb3JVdGlscycpOworCit2YXIgYWNjdW11bGF0ZUludG8gPSByZXF1aXJl KCcuL2FjY3VtdWxhdGVJbnRvJyk7Cit2YXIgZm9yRWFjaEFjY3VtdWxhdGVkID0gcmVxdWlyZSgn Li9mb3JFYWNoQWNjdW11bGF0ZWQnKTsKK3ZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xp Yi9pbnZhcmlhbnQnKTsKKworLyoqCisgKiBJbnRlcm5hbCBzdG9yZSBmb3IgZXZlbnQgbGlzdGVu ZXJzCisgKi8KK3ZhciBsaXN0ZW5lckJhbmsgPSB7fTsKKworLyoqCisgKiBJbnRlcm5hbCBxdWV1 ZSBvZiBldmVudHMgdGhhdCBoYXZlIGFjY3VtdWxhdGVkIHRoZWlyIGRpc3BhdGNoZXMgYW5kIGFy ZQorICogd2FpdGluZyB0byBoYXZlIHRoZWlyIGRpc3BhdGNoZXMgZXhlY3V0ZWQuCisgKi8KK3Zh ciBldmVudFF1ZXVlID0gbnVsbDsKKworLyoqCisgKiBEaXNwYXRjaGVzIGFuIGV2ZW50IGFuZCBy ZWxlYXNlcyBpdCBiYWNrIGludG8gdGhlIHBvb2wsIHVubGVzcyBwZXJzaXN0ZW50LgorICoKKyAq IEBwYXJhbSB7P29iamVjdH0gZXZlbnQgU3ludGhldGljIGV2ZW50IHRvIGJlIGRpc3BhdGNoZWQu CisgKiBAcGFyYW0ge2Jvb2xlYW59IHNpbXVsYXRlZCBJZiB0aGUgZXZlbnQgaXMgc2ltdWxhdGVk IChjaGFuZ2VzIGV4biBiZWhhdmlvcikKKyAqIEBwcml2YXRlCisgKi8KK3ZhciBleGVjdXRlRGlz cGF0Y2hlc0FuZFJlbGVhc2UgPSBmdW5jdGlvbiAoZXZlbnQsIHNpbXVsYXRlZCkgeworICBpZiAo ZXZlbnQpIHsKKyAgICBFdmVudFBsdWdpblV0aWxzLmV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlcihl dmVudCwgc2ltdWxhdGVkKTsKKworICAgIGlmICghZXZlbnQuaXNQZXJzaXN0ZW50KCkpIHsKKyAg ICAgIGV2ZW50LmNvbnN0cnVjdG9yLnJlbGVhc2UoZXZlbnQpOworICAgIH0KKyAgfQorfTsKK3Zh ciBleGVjdXRlRGlzcGF0Y2hlc0FuZFJlbGVhc2VTaW11bGF0ZWQgPSBmdW5jdGlvbiAoZSkgewor ICByZXR1cm4gZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlKGUsIHRydWUpOworfTsKK3ZhciBl eGVjdXRlRGlzcGF0Y2hlc0FuZFJlbGVhc2VUb3BMZXZlbCA9IGZ1bmN0aW9uIChlKSB7CisgIHJl dHVybiBleGVjdXRlRGlzcGF0Y2hlc0FuZFJlbGVhc2UoZSwgZmFsc2UpOworfTsKKwordmFyIGdl dERpY3Rpb25hcnlLZXkgPSBmdW5jdGlvbiAoaW5zdCkgeworICAvLyBQcmV2ZW50cyBWOCBwZXJm b3JtYW5jZSBpc3N1ZToKKyAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1 bGwvNzIzMgorICByZXR1cm4gJy4nICsgaW5zdC5fcm9vdE5vZGVJRDsKK307CisKK2Z1bmN0aW9u IGlzSW50ZXJhY3RpdmUodGFnKSB7CisgIHJldHVybiB0YWcgPT09ICdidXR0b24nIHx8IHRhZyA9 PT0gJ2lucHV0JyB8fCB0YWcgPT09ICdzZWxlY3QnIHx8IHRhZyA9PT0gJ3RleHRhcmVhJzsKK30K KworZnVuY3Rpb24gc2hvdWxkUHJldmVudE1vdXNlRXZlbnQobmFtZSwgdHlwZSwgcHJvcHMpIHsK KyAgc3dpdGNoIChuYW1lKSB7CisgICAgY2FzZSAnb25DbGljayc6CisgICAgY2FzZSAnb25DbGlj a0NhcHR1cmUnOgorICAgIGNhc2UgJ29uRG91YmxlQ2xpY2snOgorICAgIGNhc2UgJ29uRG91Ymxl Q2xpY2tDYXB0dXJlJzoKKyAgICBjYXNlICdvbk1vdXNlRG93bic6CisgICAgY2FzZSAnb25Nb3Vz ZURvd25DYXB0dXJlJzoKKyAgICBjYXNlICdvbk1vdXNlTW92ZSc6CisgICAgY2FzZSAnb25Nb3Vz ZU1vdmVDYXB0dXJlJzoKKyAgICBjYXNlICdvbk1vdXNlVXAnOgorICAgIGNhc2UgJ29uTW91c2VV cENhcHR1cmUnOgorICAgICAgcmV0dXJuICEhKHByb3BzLmRpc2FibGVkICYmIGlzSW50ZXJhY3Rp dmUodHlwZSkpOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKwor LyoqCisgKiBUaGlzIGlzIGEgdW5pZmllZCBpbnRlcmZhY2UgZm9yIGV2ZW50IHBsdWdpbnMgdG8g YmUgaW5zdGFsbGVkIGFuZCBjb25maWd1cmVkLgorICoKKyAqIEV2ZW50IHBsdWdpbnMgY2FuIGlt cGxlbWVudCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CisgKgorICogICBgZXh0cmFjdEV2ZW50 c2Age2Z1bmN0aW9uKHN0cmluZywgRE9NRXZlbnRUYXJnZXQsIHN0cmluZywgb2JqZWN0KTogKn0K KyAqICAgICBSZXF1aXJlZC4gV2hlbiBhIHRvcC1sZXZlbCBldmVudCBpcyBmaXJlZCwgdGhpcyBt ZXRob2QgaXMgZXhwZWN0ZWQgdG8KKyAqICAgICBleHRyYWN0IHN5bnRoZXRpYyBldmVudHMgdGhh dCB3aWxsIGluIHR1cm4gYmUgcXVldWVkIGFuZCBkaXNwYXRjaGVkLgorICoKKyAqICAgYGV2ZW50 VHlwZXNgIHtvYmplY3R9CisgKiAgICAgT3B0aW9uYWwsIHBsdWdpbnMgdGhhdCBmaXJlIGV2ZW50 cyBtdXN0IHB1Ymxpc2ggYSBtYXBwaW5nIG9mIHJlZ2lzdHJhdGlvbgorICogICAgIG5hbWVzIHRo YXQgYXJlIHVzZWQgdG8gcmVnaXN0ZXIgbGlzdGVuZXJzLiBWYWx1ZXMgb2YgdGhpcyBtYXBwaW5n IG11c3QKKyAqICAgICBiZSBvYmplY3RzIHRoYXQgY29udGFpbiBgcmVnaXN0cmF0aW9uTmFtZWAg b3IgYHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzYC4KKyAqCisgKiAgIGBleGVjdXRlRGlzcGF0Y2hg IHtmdW5jdGlvbihvYmplY3QsIGZ1bmN0aW9uLCBzdHJpbmcpfQorICogICAgIE9wdGlvbmFsLCBh bGxvd3MgcGx1Z2lucyB0byBvdmVycmlkZSBob3cgYW4gZXZlbnQgZ2V0cyBkaXNwYXRjaGVkLiBC eQorICogICAgIGRlZmF1bHQsIHRoZSBsaXN0ZW5lciBpcyBzaW1wbHkgaW52b2tlZC4KKyAqCisg KiBFYWNoIHBsdWdpbiB0aGF0IGlzIGluamVjdGVkIGludG8gYEV2ZW50c1BsdWdpbkh1YmAgaXMg aW1tZWRpYXRlbHkgb3BlcmFibGUuCisgKgorICogQHB1YmxpYworICovCit2YXIgRXZlbnRQbHVn aW5IdWIgPSB7CisKKyAgLyoqCisgICAqIE1ldGhvZHMgZm9yIGluamVjdGluZyBkZXBlbmRlbmNp ZXMuCisgICAqLworICBpbmplY3Rpb246IHsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSB7YXJy YXl9IEluamVjdGVkRXZlbnRQbHVnaW5PcmRlcgorICAgICAqIEBwdWJsaWMKKyAgICAgKi8KKyAg ICBpbmplY3RFdmVudFBsdWdpbk9yZGVyOiBFdmVudFBsdWdpblJlZ2lzdHJ5LmluamVjdEV2ZW50 UGx1Z2luT3JkZXIsCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0ge29iamVjdH0gaW5qZWN0ZWRO YW1lc1RvUGx1Z2lucyBNYXAgZnJvbSBuYW1lcyB0byBwbHVnaW4gbW9kdWxlcy4KKyAgICAgKi8K KyAgICBpbmplY3RFdmVudFBsdWdpbnNCeU5hbWU6IEV2ZW50UGx1Z2luUmVnaXN0cnkuaW5qZWN0 RXZlbnRQbHVnaW5zQnlOYW1lCisKKyAgfSwKKworICAvKioKKyAgICogU3RvcmVzIGBsaXN0ZW5l cmAgYXQgYGxpc3RlbmVyQmFua1tyZWdpc3RyYXRpb25OYW1lXVtrZXldYC4gSXMgaWRlbXBvdGVu dC4KKyAgICoKKyAgICogQHBhcmFtIHtvYmplY3R9IGluc3QgVGhlIGluc3RhbmNlLCB3aGljaCBp cyB0aGUgc291cmNlIG9mIGV2ZW50cy4KKyAgICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlv bk5hbWUgTmFtZSBvZiBsaXN0ZW5lciAoZS5nLiBgb25DbGlja2ApLgorICAgKiBAcGFyYW0ge2Z1 bmN0aW9ufSBsaXN0ZW5lciBUaGUgY2FsbGJhY2sgdG8gc3RvcmUuCisgICAqLworICBwdXRMaXN0 ZW5lcjogZnVuY3Rpb24gKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUsIGxpc3RlbmVyKSB7CisgICAg ISh0eXBlb2YgbGlzdGVuZXIgPT09ICdmdW5jdGlvbicpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYg IT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V4cGVjdGVkICVzIGxpc3RlbmVy IHRvIGJlIGEgZnVuY3Rpb24sIGluc3RlYWQgZ290IHR5cGUgJXMnLCByZWdpc3RyYXRpb25OYW1l LCB0eXBlb2YgbGlzdGVuZXIpIDogX3Byb2RJbnZhcmlhbnQoJzk0JywgcmVnaXN0cmF0aW9uTmFt ZSwgdHlwZW9mIGxpc3RlbmVyKSA6IHZvaWQgMDsKKworICAgIHZhciBrZXkgPSBnZXREaWN0aW9u YXJ5S2V5KGluc3QpOworICAgIHZhciBiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZSA9IGxpc3RlbmVy QmFua1tyZWdpc3RyYXRpb25OYW1lXSB8fCAobGlzdGVuZXJCYW5rW3JlZ2lzdHJhdGlvbk5hbWVd ID0ge30pOworICAgIGJhbmtGb3JSZWdpc3RyYXRpb25OYW1lW2tleV0gPSBsaXN0ZW5lcjsKKwor ICAgIHZhciBQbHVnaW5Nb2R1bGUgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5h bWVNb2R1bGVzW3JlZ2lzdHJhdGlvbk5hbWVdOworICAgIGlmIChQbHVnaW5Nb2R1bGUgJiYgUGx1 Z2luTW9kdWxlLmRpZFB1dExpc3RlbmVyKSB7CisgICAgICBQbHVnaW5Nb2R1bGUuZGlkUHV0TGlz dGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSwgbGlzdGVuZXIpOworICAgIH0KKyAgfSwKKwor ICAvKioKKyAgICogQHBhcmFtIHtvYmplY3R9IGluc3QgVGhlIGluc3RhbmNlLCB3aGljaCBpcyB0 aGUgc291cmNlIG9mIGV2ZW50cy4KKyAgICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbk5h bWUgTmFtZSBvZiBsaXN0ZW5lciAoZS5nLiBgb25DbGlja2ApLgorICAgKiBAcmV0dXJuIHs/ZnVu Y3Rpb259IFRoZSBzdG9yZWQgY2FsbGJhY2suCisgICAqLworICBnZXRMaXN0ZW5lcjogZnVuY3Rp b24gKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUpIHsKKyAgICAvLyBUT0RPOiBzaG91bGRQcmV2ZW50 TW91c2VFdmVudCBpcyBET00tc3BlY2lmaWMgYW5kIGRlZmluaXRlbHkgc2hvdWxkIG5vdAorICAg IC8vIGxpdmUgaGVyZTsgbmVlZHMgdG8gYmUgbW92ZWQgdG8gYSBiZXR0ZXIgcGxhY2Ugc29vbgor ICAgIHZhciBiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZSA9IGxpc3RlbmVyQmFua1tyZWdpc3RyYXRp b25OYW1lXTsKKyAgICBpZiAoc2hvdWxkUHJldmVudE1vdXNlRXZlbnQocmVnaXN0cmF0aW9uTmFt ZSwgaW5zdC5fY3VycmVudEVsZW1lbnQudHlwZSwgaW5zdC5fY3VycmVudEVsZW1lbnQucHJvcHMp KSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgdmFyIGtleSA9IGdldERpY3Rpb25h cnlLZXkoaW5zdCk7CisgICAgcmV0dXJuIGJhbmtGb3JSZWdpc3RyYXRpb25OYW1lICYmIGJhbmtG b3JSZWdpc3RyYXRpb25OYW1lW2tleV07CisgIH0sCisKKyAgLyoqCisgICAqIERlbGV0ZXMgYSBs aXN0ZW5lciBmcm9tIHRoZSByZWdpc3RyYXRpb24gYmFuay4KKyAgICoKKyAgICogQHBhcmFtIHtv YmplY3R9IGluc3QgVGhlIGluc3RhbmNlLCB3aGljaCBpcyB0aGUgc291cmNlIG9mIGV2ZW50cy4K KyAgICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbk5hbWUgTmFtZSBvZiBsaXN0ZW5lciAo ZS5nLiBgb25DbGlja2ApLgorICAgKi8KKyAgZGVsZXRlTGlzdGVuZXI6IGZ1bmN0aW9uIChpbnN0 LCByZWdpc3RyYXRpb25OYW1lKSB7CisgICAgdmFyIFBsdWdpbk1vZHVsZSA9IEV2ZW50UGx1Z2lu UmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbcmVnaXN0cmF0aW9uTmFtZV07CisgICAg aWYgKFBsdWdpbk1vZHVsZSAmJiBQbHVnaW5Nb2R1bGUud2lsbERlbGV0ZUxpc3RlbmVyKSB7Cisg ICAgICBQbHVnaW5Nb2R1bGUud2lsbERlbGV0ZUxpc3RlbmVyKGluc3QsIHJlZ2lzdHJhdGlvbk5h bWUpOworICAgIH0KKworICAgIHZhciBiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZSA9IGxpc3RlbmVy QmFua1tyZWdpc3RyYXRpb25OYW1lXTsKKyAgICAvLyBUT0RPOiBUaGlzIHNob3VsZCBuZXZlciBi ZSBudWxsIC0tIHdoZW4gaXMgaXQ/CisgICAgaWYgKGJhbmtGb3JSZWdpc3RyYXRpb25OYW1lKSB7 CisgICAgICB2YXIga2V5ID0gZ2V0RGljdGlvbmFyeUtleShpbnN0KTsKKyAgICAgIGRlbGV0ZSBi YW5rRm9yUmVnaXN0cmF0aW9uTmFtZVtrZXldOworICAgIH0KKyAgfSwKKworICAvKioKKyAgICog RGVsZXRlcyBhbGwgbGlzdGVuZXJzIGZvciB0aGUgRE9NIGVsZW1lbnQgd2l0aCB0aGUgc3VwcGxp ZWQgSUQuCisgICAqCisgICAqIEBwYXJhbSB7b2JqZWN0fSBpbnN0IFRoZSBpbnN0YW5jZSwgd2hp Y2ggaXMgdGhlIHNvdXJjZSBvZiBldmVudHMuCisgICAqLworICBkZWxldGVBbGxMaXN0ZW5lcnM6 IGZ1bmN0aW9uIChpbnN0KSB7CisgICAgdmFyIGtleSA9IGdldERpY3Rpb25hcnlLZXkoaW5zdCk7 CisgICAgZm9yICh2YXIgcmVnaXN0cmF0aW9uTmFtZSBpbiBsaXN0ZW5lckJhbmspIHsKKyAgICAg IGlmICghbGlzdGVuZXJCYW5rLmhhc093blByb3BlcnR5KHJlZ2lzdHJhdGlvbk5hbWUpKSB7Cisg ICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoIWxpc3RlbmVyQmFua1tyZWdp c3RyYXRpb25OYW1lXVtrZXldKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAg ICB2YXIgUGx1Z2luTW9kdWxlID0gRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1l TW9kdWxlc1tyZWdpc3RyYXRpb25OYW1lXTsKKyAgICAgIGlmIChQbHVnaW5Nb2R1bGUgJiYgUGx1 Z2luTW9kdWxlLndpbGxEZWxldGVMaXN0ZW5lcikgeworICAgICAgICBQbHVnaW5Nb2R1bGUud2ls bERlbGV0ZUxpc3RlbmVyKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUpOworICAgICAgfQorCisgICAg ICBkZWxldGUgbGlzdGVuZXJCYW5rW3JlZ2lzdHJhdGlvbk5hbWVdW2tleV07CisgICAgfQorICB9 LAorCisgIC8qKgorICAgKiBBbGxvd3MgcmVnaXN0ZXJlZCBwbHVnaW5zIGFuIG9wcG9ydHVuaXR5 IHRvIGV4dHJhY3QgZXZlbnRzIGZyb20gdG9wLWxldmVsCisgICAqIG5hdGl2ZSBicm93c2VyIGV2 ZW50cy4KKyAgICoKKyAgICogQHJldHVybiB7Kn0gQW4gYWNjdW11bGF0aW9uIG9mIHN5bnRoZXRp YyBldmVudHMuCisgICAqIEBpbnRlcm5hbAorICAgKi8KKyAgZXh0cmFjdEV2ZW50czogZnVuY3Rp b24gKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFy Z2V0KSB7CisgICAgdmFyIGV2ZW50czsKKyAgICB2YXIgcGx1Z2lucyA9IEV2ZW50UGx1Z2luUmVn aXN0cnkucGx1Z2luczsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBp KyspIHsKKyAgICAgIC8vIE5vdCBldmVyeSBwbHVnaW4gaW4gdGhlIG9yZGVyaW5nIG1heSBiZSBs b2FkZWQgYXQgcnVudGltZS4KKyAgICAgIHZhciBwb3NzaWJsZVBsdWdpbiA9IHBsdWdpbnNbaV07 CisgICAgICBpZiAocG9zc2libGVQbHVnaW4pIHsKKyAgICAgICAgdmFyIGV4dHJhY3RlZEV2ZW50 cyA9IHBvc3NpYmxlUGx1Z2luLmV4dHJhY3RFdmVudHModG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0 LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpOworICAgICAgICBpZiAoZXh0cmFjdGVk RXZlbnRzKSB7CisgICAgICAgICAgZXZlbnRzID0gYWNjdW11bGF0ZUludG8oZXZlbnRzLCBleHRy YWN0ZWRFdmVudHMpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBldmVu dHM7CisgIH0sCisKKyAgLyoqCisgICAqIEVucXVldWVzIGEgc3ludGhldGljIGV2ZW50IHRoYXQg c2hvdWxkIGJlIGRpc3BhdGNoZWQgd2hlbgorICAgKiBgcHJvY2Vzc0V2ZW50UXVldWVgIGlzIGlu dm9rZWQuCisgICAqCisgICAqIEBwYXJhbSB7Kn0gZXZlbnRzIEFuIGFjY3VtdWxhdGlvbiBvZiBz eW50aGV0aWMgZXZlbnRzLgorICAgKiBAaW50ZXJuYWwKKyAgICovCisgIGVucXVldWVFdmVudHM6 IGZ1bmN0aW9uIChldmVudHMpIHsKKyAgICBpZiAoZXZlbnRzKSB7CisgICAgICBldmVudFF1ZXVl ID0gYWNjdW11bGF0ZUludG8oZXZlbnRRdWV1ZSwgZXZlbnRzKTsKKyAgICB9CisgIH0sCisKKyAg LyoqCisgICAqIERpc3BhdGNoZXMgYWxsIHN5bnRoZXRpYyBldmVudHMgb24gdGhlIGV2ZW50IHF1 ZXVlLgorICAgKgorICAgKiBAaW50ZXJuYWwKKyAgICovCisgIHByb2Nlc3NFdmVudFF1ZXVlOiBm dW5jdGlvbiAoc2ltdWxhdGVkKSB7CisgICAgLy8gU2V0IGBldmVudFF1ZXVlYCB0byBudWxsIGJl Zm9yZSBwcm9jZXNzaW5nIGl0IHNvIHRoYXQgd2UgY2FuIHRlbGwgaWYgbW9yZQorICAgIC8vIGV2 ZW50cyBnZXQgZW5xdWV1ZWQgd2hpbGUgcHJvY2Vzc2luZy4KKyAgICB2YXIgcHJvY2Vzc2luZ0V2 ZW50UXVldWUgPSBldmVudFF1ZXVlOworICAgIGV2ZW50UXVldWUgPSBudWxsOworICAgIGlmIChz aW11bGF0ZWQpIHsKKyAgICAgIGZvckVhY2hBY2N1bXVsYXRlZChwcm9jZXNzaW5nRXZlbnRRdWV1 ZSwgZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlU2ltdWxhdGVkKTsKKyAgICB9IGVsc2Ugewor ICAgICAgZm9yRWFjaEFjY3VtdWxhdGVkKHByb2Nlc3NpbmdFdmVudFF1ZXVlLCBleGVjdXRlRGlz cGF0Y2hlc0FuZFJlbGVhc2VUb3BMZXZlbCk7CisgICAgfQorICAgICEhZXZlbnRRdWV1ZSA/IHBy b2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdw cm9jZXNzRXZlbnRRdWV1ZSgpOiBBZGRpdGlvbmFsIGV2ZW50cyB3ZXJlIGVucXVldWVkIHdoaWxl IHByb2Nlc3NpbmcgYW4gZXZlbnQgcXVldWUuIFN1cHBvcnQgZm9yIHRoaXMgaGFzIG5vdCB5ZXQg YmVlbiBpbXBsZW1lbnRlZC4nKSA6IF9wcm9kSW52YXJpYW50KCc5NScpIDogdm9pZCAwOworICAg IC8vIFRoaXMgd291bGQgYmUgYSBnb29kIHRpbWUgdG8gcmV0aHJvdyBpZiBhbnkgb2YgdGhlIGV2 ZW50IGhhbmRsZXJzIHRocmV3LgorICAgIFJlYWN0RXJyb3JVdGlscy5yZXRocm93Q2F1Z2h0RXJy b3IoKTsKKyAgfSwKKworICAvKioKKyAgICogVGhlc2UgYXJlIG5lZWRlZCBmb3IgdGVzdHMgb25s eS4gRG8gbm90IHVzZSEKKyAgICovCisgIF9fcHVyZ2U6IGZ1bmN0aW9uICgpIHsKKyAgICBsaXN0 ZW5lckJhbmsgPSB7fTsKKyAgfSwKKworICBfX2dldExpc3RlbmVyQmFuazogZnVuY3Rpb24gKCkg eworICAgIHJldHVybiBsaXN0ZW5lckJhbms7CisgIH0KKworfTsKKworbW9kdWxlLmV4cG9ydHMg PSBFdmVudFBsdWdpbkh1YjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQg YS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvRXZlbnRQbHVnaW5SZWdp c3RyeS5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9FdmVudFBs dWdpblJlZ2lzdHJ5LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi4zNzhk ZGQ0YgotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3Qt ZG9tL2xpYi9FdmVudFBsdWdpblJlZ2lzdHJ5LmpzCkBAIC0wLDAgKzEsMjU0IEBACisvKioKKyAq IENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJl c2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJT RC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290 IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBv ZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBz YW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJv ZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7CisKK3ZhciBpbnZh cmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTsKKworLyoqCisgKiBJbmplY3Rh YmxlIG9yZGVyaW5nIG9mIGV2ZW50IHBsdWdpbnMuCisgKi8KK3ZhciBldmVudFBsdWdpbk9yZGVy ID0gbnVsbDsKKworLyoqCisgKiBJbmplY3RhYmxlIG1hcHBpbmcgZnJvbSBuYW1lcyB0byBldmVu dCBwbHVnaW4gbW9kdWxlcy4KKyAqLwordmFyIG5hbWVzVG9QbHVnaW5zID0ge307CisKKy8qKgor ICogUmVjb21wdXRlcyB0aGUgcGx1Z2luIGxpc3QgdXNpbmcgdGhlIGluamVjdGVkIHBsdWdpbnMg YW5kIHBsdWdpbiBvcmRlcmluZy4KKyAqCisgKiBAcHJpdmF0ZQorICovCitmdW5jdGlvbiByZWNv bXB1dGVQbHVnaW5PcmRlcmluZygpIHsKKyAgaWYgKCFldmVudFBsdWdpbk9yZGVyKSB7CisgICAg Ly8gV2FpdCB1bnRpbCBhbiBgZXZlbnRQbHVnaW5PcmRlcmAgaXMgaW5qZWN0ZWQuCisgICAgcmV0 dXJuOworICB9CisgIGZvciAodmFyIHBsdWdpbk5hbWUgaW4gbmFtZXNUb1BsdWdpbnMpIHsKKyAg ICB2YXIgcGx1Z2luTW9kdWxlID0gbmFtZXNUb1BsdWdpbnNbcGx1Z2luTmFtZV07CisgICAgdmFy IHBsdWdpbkluZGV4ID0gZXZlbnRQbHVnaW5PcmRlci5pbmRleE9mKHBsdWdpbk5hbWUpOworICAg ICEocGx1Z2luSW5kZXggPiAtMSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rp b24nID8gaW52YXJpYW50KGZhbHNlLCAnRXZlbnRQbHVnaW5SZWdpc3RyeTogQ2Fubm90IGluamVj dCBldmVudCBwbHVnaW5zIHRoYXQgZG8gbm90IGV4aXN0IGluIHRoZSBwbHVnaW4gb3JkZXJpbmcs IGAlc2AuJywgcGx1Z2luTmFtZSkgOiBfcHJvZEludmFyaWFudCgnOTYnLCBwbHVnaW5OYW1lKSA6 IHZvaWQgMDsKKyAgICBpZiAoRXZlbnRQbHVnaW5SZWdpc3RyeS5wbHVnaW5zW3BsdWdpbkluZGV4 XSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgICFwbHVnaW5Nb2R1bGUuZXh0cmFjdEV2 ZW50cyA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQo ZmFsc2UsICdFdmVudFBsdWdpblJlZ2lzdHJ5OiBFdmVudCBwbHVnaW5zIG11c3QgaW1wbGVtZW50 IGFuIGBleHRyYWN0RXZlbnRzYCBtZXRob2QsIGJ1dCBgJXNgIGRvZXMgbm90LicsIHBsdWdpbk5h bWUpIDogX3Byb2RJbnZhcmlhbnQoJzk3JywgcGx1Z2luTmFtZSkgOiB2b2lkIDA7CisgICAgRXZl bnRQbHVnaW5SZWdpc3RyeS5wbHVnaW5zW3BsdWdpbkluZGV4XSA9IHBsdWdpbk1vZHVsZTsKKyAg ICB2YXIgcHVibGlzaGVkRXZlbnRzID0gcGx1Z2luTW9kdWxlLmV2ZW50VHlwZXM7CisgICAgZm9y ICh2YXIgZXZlbnROYW1lIGluIHB1Ymxpc2hlZEV2ZW50cykgeworICAgICAgIXB1Ymxpc2hFdmVu dEZvclBsdWdpbihwdWJsaXNoZWRFdmVudHNbZXZlbnROYW1lXSwgcGx1Z2luTW9kdWxlLCBldmVu dE5hbWUpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFu dChmYWxzZSwgJ0V2ZW50UGx1Z2luUmVnaXN0cnk6IEZhaWxlZCB0byBwdWJsaXNoIGV2ZW50IGAl c2AgZm9yIHBsdWdpbiBgJXNgLicsIGV2ZW50TmFtZSwgcGx1Z2luTmFtZSkgOiBfcHJvZEludmFy aWFudCgnOTgnLCBldmVudE5hbWUsIHBsdWdpbk5hbWUpIDogdm9pZCAwOworICAgIH0KKyAgfQor fQorCisvKioKKyAqIFB1Ymxpc2hlcyBhbiBldmVudCBzbyB0aGF0IGl0IGNhbiBiZSBkaXNwYXRj aGVkIGJ5IHRoZSBzdXBwbGllZCBwbHVnaW4uCisgKgorICogQHBhcmFtIHtvYmplY3R9IGRpc3Bh dGNoQ29uZmlnIERpc3BhdGNoIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBldmVudC4KKyAqIEBwYXJh bSB7b2JqZWN0fSBQbHVnaW5Nb2R1bGUgUGx1Z2luIHB1Ymxpc2hpbmcgdGhlIGV2ZW50LgorICog QHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIHN1Y2Nlc3NmdWxseSBwdWJs aXNoZWQuCisgKiBAcHJpdmF0ZQorICovCitmdW5jdGlvbiBwdWJsaXNoRXZlbnRGb3JQbHVnaW4o ZGlzcGF0Y2hDb25maWcsIHBsdWdpbk1vZHVsZSwgZXZlbnROYW1lKSB7CisgICEhRXZlbnRQbHVn aW5SZWdpc3RyeS5ldmVudE5hbWVEaXNwYXRjaENvbmZpZ3MuaGFzT3duUHJvcGVydHkoZXZlbnRO YW1lKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQo ZmFsc2UsICdFdmVudFBsdWdpbkh1YjogTW9yZSB0aGFuIG9uZSBwbHVnaW4gYXR0ZW1wdGVkIHRv IHB1Ymxpc2ggdGhlIHNhbWUgZXZlbnQgbmFtZSwgYCVzYC4nLCBldmVudE5hbWUpIDogX3Byb2RJ bnZhcmlhbnQoJzk5JywgZXZlbnROYW1lKSA6IHZvaWQgMDsKKyAgRXZlbnRQbHVnaW5SZWdpc3Ry eS5ldmVudE5hbWVEaXNwYXRjaENvbmZpZ3NbZXZlbnROYW1lXSA9IGRpc3BhdGNoQ29uZmlnOwor CisgIHZhciBwaGFzZWRSZWdpc3RyYXRpb25OYW1lcyA9IGRpc3BhdGNoQ29uZmlnLnBoYXNlZFJl Z2lzdHJhdGlvbk5hbWVzOworICBpZiAocGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMpIHsKKyAgICBm b3IgKHZhciBwaGFzZU5hbWUgaW4gcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMpIHsKKyAgICAgIGlm IChwaGFzZWRSZWdpc3RyYXRpb25OYW1lcy5oYXNPd25Qcm9wZXJ0eShwaGFzZU5hbWUpKSB7Cisg ICAgICAgIHZhciBwaGFzZWRSZWdpc3RyYXRpb25OYW1lID0gcGhhc2VkUmVnaXN0cmF0aW9uTmFt ZXNbcGhhc2VOYW1lXTsKKyAgICAgICAgcHVibGlzaFJlZ2lzdHJhdGlvbk5hbWUocGhhc2VkUmVn aXN0cmF0aW9uTmFtZSwgcGx1Z2luTW9kdWxlLCBldmVudE5hbWUpOworICAgICAgfQorICAgIH0K KyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIGlmIChkaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRp b25OYW1lKSB7CisgICAgcHVibGlzaFJlZ2lzdHJhdGlvbk5hbWUoZGlzcGF0Y2hDb25maWcucmVn aXN0cmF0aW9uTmFtZSwgcGx1Z2luTW9kdWxlLCBldmVudE5hbWUpOworICAgIHJldHVybiB0cnVl OworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBQdWJsaXNoZXMgYSByZWdpc3Ry YXRpb24gbmFtZSB0aGF0IGlzIHVzZWQgdG8gaWRlbnRpZnkgZGlzcGF0Y2hlZCBldmVudHMgYW5k CisgKiBjYW4gYmUgdXNlZCB3aXRoIGBFdmVudFBsdWdpbkh1Yi5wdXRMaXN0ZW5lcmAgdG8gcmVn aXN0ZXIgbGlzdGVuZXJzLgorICoKKyAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb25OYW1l IFJlZ2lzdHJhdGlvbiBuYW1lIHRvIGFkZC4KKyAqIEBwYXJhbSB7b2JqZWN0fSBQbHVnaW5Nb2R1 bGUgUGx1Z2luIHB1Ymxpc2hpbmcgdGhlIGV2ZW50LgorICogQHByaXZhdGUKKyAqLworZnVuY3Rp b24gcHVibGlzaFJlZ2lzdHJhdGlvbk5hbWUocmVnaXN0cmF0aW9uTmFtZSwgcGx1Z2luTW9kdWxl LCBldmVudE5hbWUpIHsKKyAgISFFdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVN b2R1bGVzW3JlZ2lzdHJhdGlvbk5hbWVdID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9k dWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V2ZW50UGx1Z2luSHViOiBNb3JlIHRoYW4gb25l IHBsdWdpbiBhdHRlbXB0ZWQgdG8gcHVibGlzaCB0aGUgc2FtZSByZWdpc3RyYXRpb24gbmFtZSwg YCVzYC4nLCByZWdpc3RyYXRpb25OYW1lKSA6IF9wcm9kSW52YXJpYW50KCcxMDAnLCByZWdpc3Ry YXRpb25OYW1lKSA6IHZvaWQgMDsKKyAgRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25O YW1lTW9kdWxlc1tyZWdpc3RyYXRpb25OYW1lXSA9IHBsdWdpbk1vZHVsZTsKKyAgRXZlbnRQbHVn aW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVd ID0gcGx1Z2luTW9kdWxlLmV2ZW50VHlwZXNbZXZlbnROYW1lXS5kZXBlbmRlbmNpZXM7CisKKyAg aWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICB2YXIgbG93 ZXJDYXNlZE5hbWUgPSByZWdpc3RyYXRpb25OYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgRXZlbnRQ bHVnaW5SZWdpc3RyeS5wb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzW2xvd2VyQ2FzZWROYW1lXSA9 IHJlZ2lzdHJhdGlvbk5hbWU7CisKKyAgICBpZiAocmVnaXN0cmF0aW9uTmFtZSA9PT0gJ29uRG91 YmxlQ2xpY2snKSB7CisgICAgICBFdmVudFBsdWdpblJlZ2lzdHJ5LnBvc3NpYmxlUmVnaXN0cmF0 aW9uTmFtZXMub25kYmxjbGljayA9IHJlZ2lzdHJhdGlvbk5hbWU7CisgICAgfQorICB9Cit9CisK Ky8qKgorICogUmVnaXN0ZXJzIHBsdWdpbnMgc28gdGhhdCB0aGV5IGNhbiBleHRyYWN0IGFuZCBk aXNwYXRjaCBldmVudHMuCisgKgorICogQHNlZSB7RXZlbnRQbHVnaW5IdWJ9CisgKi8KK3ZhciBF dmVudFBsdWdpblJlZ2lzdHJ5ID0geworCisgIC8qKgorICAgKiBPcmRlcmVkIGxpc3Qgb2YgaW5q ZWN0ZWQgcGx1Z2lucy4KKyAgICovCisgIHBsdWdpbnM6IFtdLAorCisgIC8qKgorICAgKiBNYXBw aW5nIGZyb20gZXZlbnQgbmFtZSB0byBkaXNwYXRjaCBjb25maWcKKyAgICovCisgIGV2ZW50TmFt ZURpc3BhdGNoQ29uZmlnczoge30sCisKKyAgLyoqCisgICAqIE1hcHBpbmcgZnJvbSByZWdpc3Ry YXRpb24gbmFtZSB0byBwbHVnaW4gbW9kdWxlCisgICAqLworICByZWdpc3RyYXRpb25OYW1lTW9k dWxlczoge30sCisKKyAgLyoqCisgICAqIE1hcHBpbmcgZnJvbSByZWdpc3RyYXRpb24gbmFtZSB0 byBldmVudCBuYW1lCisgICAqLworICByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzOiB7fSwK KworICAvKioKKyAgICogTWFwcGluZyBmcm9tIGxvd2VyY2FzZSByZWdpc3RyYXRpb24gbmFtZXMg dG8gdGhlIHByb3Blcmx5IGNhc2VkIHZlcnNpb24sCisgICAqIHVzZWQgdG8gd2FybiBpbiB0aGUg Y2FzZSBvZiBtaXNzaW5nIGV2ZW50IGhhbmRsZXJzLiBBdmFpbGFibGUKKyAgICogb25seSBpbiBf X0RFVl9fLgorICAgKiBAdHlwZSB7T2JqZWN0fQorICAgKi8KKyAgcG9zc2libGVSZWdpc3RyYXRp b25OYW1lczogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHt9IDogbnVs bCwKKyAgLy8gVHJ1c3QgdGhlIGRldmVsb3BlciB0byBvbmx5IHVzZSBwb3NzaWJsZVJlZ2lzdHJh dGlvbk5hbWVzIGluIF9fREVWX18KKworICAvKioKKyAgICogSW5qZWN0cyBhbiBvcmRlcmluZyBv ZiBwbHVnaW5zIChieSBwbHVnaW4gbmFtZSkuIFRoaXMgYWxsb3dzIHRoZSBvcmRlcmluZworICAg KiB0byBiZSBkZWNvdXBsZWQgZnJvbSBpbmplY3Rpb24gb2YgdGhlIGFjdHVhbCBwbHVnaW5zIHNv IHRoYXQgb3JkZXJpbmcgaXMKKyAgICogYWx3YXlzIGRldGVybWluaXN0aWMgcmVnYXJkbGVzcyBv ZiBwYWNrYWdpbmcsIG9uLXRoZS1mbHkgaW5qZWN0aW9uLCBldGMuCisgICAqCisgICAqIEBwYXJh bSB7YXJyYXl9IEluamVjdGVkRXZlbnRQbHVnaW5PcmRlcgorICAgKiBAaW50ZXJuYWwKKyAgICog QHNlZSB7RXZlbnRQbHVnaW5IdWIuaW5qZWN0aW9uLmluamVjdEV2ZW50UGx1Z2luT3JkZXJ9Cisg ICAqLworICBpbmplY3RFdmVudFBsdWdpbk9yZGVyOiBmdW5jdGlvbiAoaW5qZWN0ZWRFdmVudFBs dWdpbk9yZGVyKSB7CisgICAgISFldmVudFBsdWdpbk9yZGVyID8gcHJvY2Vzcy5lbnYuTk9ERV9F TlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V2ZW50UGx1Z2luUmVnaXN0 cnk6IENhbm5vdCBpbmplY3QgZXZlbnQgcGx1Z2luIG9yZGVyaW5nIG1vcmUgdGhhbiBvbmNlLiBZ b3UgYXJlIGxpa2VseSB0cnlpbmcgdG8gbG9hZCBtb3JlIHRoYW4gb25lIGNvcHkgb2YgUmVhY3Qu JykgOiBfcHJvZEludmFyaWFudCgnMTAxJykgOiB2b2lkIDA7CisgICAgLy8gQ2xvbmUgdGhlIG9y ZGVyaW5nIHNvIGl0IGNhbm5vdCBiZSBkeW5hbWljYWxseSBtdXRhdGVkLgorICAgIGV2ZW50UGx1 Z2luT3JkZXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChpbmplY3RlZEV2ZW50UGx1Z2lu T3JkZXIpOworICAgIHJlY29tcHV0ZVBsdWdpbk9yZGVyaW5nKCk7CisgIH0sCisKKyAgLyoqCisg ICAqIEluamVjdHMgcGx1Z2lucyB0byBiZSB1c2VkIGJ5IGBFdmVudFBsdWdpbkh1YmAuIFRoZSBw bHVnaW4gbmFtZXMgbXVzdCBiZQorICAgKiBpbiB0aGUgb3JkZXJpbmcgaW5qZWN0ZWQgYnkgYGlu amVjdEV2ZW50UGx1Z2luT3JkZXJgLgorICAgKgorICAgKiBQbHVnaW5zIGNhbiBiZSBpbmplY3Rl ZCBhcyBwYXJ0IG9mIHBhZ2UgaW5pdGlhbGl6YXRpb24gb3Igb24tdGhlLWZseS4KKyAgICoKKyAg ICogQHBhcmFtIHtvYmplY3R9IGluamVjdGVkTmFtZXNUb1BsdWdpbnMgTWFwIGZyb20gbmFtZXMg dG8gcGx1Z2luIG1vZHVsZXMuCisgICAqIEBpbnRlcm5hbAorICAgKiBAc2VlIHtFdmVudFBsdWdp bkh1Yi5pbmplY3Rpb24uaW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lfQorICAgKi8KKyAgaW5qZWN0 RXZlbnRQbHVnaW5zQnlOYW1lOiBmdW5jdGlvbiAoaW5qZWN0ZWROYW1lc1RvUGx1Z2lucykgewor ICAgIHZhciBpc09yZGVyaW5nRGlydHkgPSBmYWxzZTsKKyAgICBmb3IgKHZhciBwbHVnaW5OYW1l IGluIGluamVjdGVkTmFtZXNUb1BsdWdpbnMpIHsKKyAgICAgIGlmICghaW5qZWN0ZWROYW1lc1Rv UGx1Z2lucy5oYXNPd25Qcm9wZXJ0eShwbHVnaW5OYW1lKSkgeworICAgICAgICBjb250aW51ZTsK KyAgICAgIH0KKyAgICAgIHZhciBwbHVnaW5Nb2R1bGUgPSBpbmplY3RlZE5hbWVzVG9QbHVnaW5z W3BsdWdpbk5hbWVdOworICAgICAgaWYgKCFuYW1lc1RvUGx1Z2lucy5oYXNPd25Qcm9wZXJ0eShw bHVnaW5OYW1lKSB8fCBuYW1lc1RvUGx1Z2luc1twbHVnaW5OYW1lXSAhPT0gcGx1Z2luTW9kdWxl KSB7CisgICAgICAgICEhbmFtZXNUb1BsdWdpbnNbcGx1Z2luTmFtZV0gPyBwcm9jZXNzLmVudi5O T0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXZlbnRQbHVnaW5S ZWdpc3RyeTogQ2Fubm90IGluamVjdCB0d28gZGlmZmVyZW50IGV2ZW50IHBsdWdpbnMgdXNpbmcg dGhlIHNhbWUgbmFtZSwgYCVzYC4nLCBwbHVnaW5OYW1lKSA6IF9wcm9kSW52YXJpYW50KCcxMDIn LCBwbHVnaW5OYW1lKSA6IHZvaWQgMDsKKyAgICAgICAgbmFtZXNUb1BsdWdpbnNbcGx1Z2luTmFt ZV0gPSBwbHVnaW5Nb2R1bGU7CisgICAgICAgIGlzT3JkZXJpbmdEaXJ0eSA9IHRydWU7CisgICAg ICB9CisgICAgfQorICAgIGlmIChpc09yZGVyaW5nRGlydHkpIHsKKyAgICAgIHJlY29tcHV0ZVBs dWdpbk9yZGVyaW5nKCk7CisgICAgfQorICB9LAorCisgIC8qKgorICAgKiBMb29rcyB1cCB0aGUg cGx1Z2luIGZvciB0aGUgc3VwcGxpZWQgZXZlbnQuCisgICAqCisgICAqIEBwYXJhbSB7b2JqZWN0 fSBldmVudCBBIHN5bnRoZXRpYyBldmVudC4KKyAgICogQHJldHVybiB7P29iamVjdH0gVGhlIHBs dWdpbiB0aGF0IGNyZWF0ZWQgdGhlIHN1cHBsaWVkIGV2ZW50LgorICAgKiBAaW50ZXJuYWwKKyAg ICovCisgIGdldFBsdWdpbk1vZHVsZUZvckV2ZW50OiBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICB2 YXIgZGlzcGF0Y2hDb25maWcgPSBldmVudC5kaXNwYXRjaENvbmZpZzsKKyAgICBpZiAoZGlzcGF0 Y2hDb25maWcucmVnaXN0cmF0aW9uTmFtZSkgeworICAgICAgcmV0dXJuIEV2ZW50UGx1Z2luUmVn aXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbZGlzcGF0Y2hDb25maWcucmVnaXN0cmF0aW9u TmFtZV0gfHwgbnVsbDsKKyAgICB9CisgICAgaWYgKGRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lz dHJhdGlvbk5hbWVzICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIC8vIHB1bGxpbmcgcGhhc2VkUmVn aXN0cmF0aW9uTmFtZXMgb3V0IG9mIGRpc3BhdGNoQ29uZmlnIGhlbHBzIEZsb3cgc2VlCisgICAg ICAvLyB0aGF0IGl0IGlzIG5vdCB1bmRlZmluZWQuCisgICAgICB2YXIgcGhhc2VkUmVnaXN0cmF0 aW9uTmFtZXMgPSBkaXNwYXRjaENvbmZpZy5waGFzZWRSZWdpc3RyYXRpb25OYW1lczsKKworICAg ICAgZm9yICh2YXIgcGhhc2UgaW4gcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMpIHsKKyAgICAgICAg aWYgKCFwaGFzZWRSZWdpc3RyYXRpb25OYW1lcy5oYXNPd25Qcm9wZXJ0eShwaGFzZSkpIHsKKyAg ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB2YXIgcGx1Z2luTW9kdWxlID0g RXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1twaGFzZWRSZWdpc3Ry YXRpb25OYW1lc1twaGFzZV1dOworICAgICAgICBpZiAocGx1Z2luTW9kdWxlKSB7CisgICAgICAg ICAgcmV0dXJuIHBsdWdpbk1vZHVsZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBy ZXR1cm4gbnVsbDsKKyAgfSwKKworICAvKioKKyAgICogRXhwb3NlZCBmb3IgdW5pdCB0ZXN0aW5n LgorICAgKiBAcHJpdmF0ZQorICAgKi8KKyAgX3Jlc2V0RXZlbnRQbHVnaW5zOiBmdW5jdGlvbiAo KSB7CisgICAgZXZlbnRQbHVnaW5PcmRlciA9IG51bGw7CisgICAgZm9yICh2YXIgcGx1Z2luTmFt ZSBpbiBuYW1lc1RvUGx1Z2lucykgeworICAgICAgaWYgKG5hbWVzVG9QbHVnaW5zLmhhc093blBy b3BlcnR5KHBsdWdpbk5hbWUpKSB7CisgICAgICAgIGRlbGV0ZSBuYW1lc1RvUGx1Z2luc1twbHVn aW5OYW1lXTsKKyAgICAgIH0KKyAgICB9CisgICAgRXZlbnRQbHVnaW5SZWdpc3RyeS5wbHVnaW5z Lmxlbmd0aCA9IDA7CisKKyAgICB2YXIgZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzID0gRXZlbnRQ bHVnaW5SZWdpc3RyeS5ldmVudE5hbWVEaXNwYXRjaENvbmZpZ3M7CisgICAgZm9yICh2YXIgZXZl bnROYW1lIGluIGV2ZW50TmFtZURpc3BhdGNoQ29uZmlncykgeworICAgICAgaWYgKGV2ZW50TmFt ZURpc3BhdGNoQ29uZmlncy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpKSB7CisgICAgICAgIGRl bGV0ZSBldmVudE5hbWVEaXNwYXRjaENvbmZpZ3NbZXZlbnROYW1lXTsKKyAgICAgIH0KKyAgICB9 CisKKyAgICB2YXIgcmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMgPSBFdmVudFBsdWdpblJlZ2lzdHJ5 LnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzOworICAgIGZvciAodmFyIHJlZ2lzdHJhdGlvbk5hbWUg aW4gcmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMpIHsKKyAgICAgIGlmIChyZWdpc3RyYXRpb25OYW1l TW9kdWxlcy5oYXNPd25Qcm9wZXJ0eShyZWdpc3RyYXRpb25OYW1lKSkgeworICAgICAgICBkZWxl dGUgcmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbcmVnaXN0cmF0aW9uTmFtZV07CisgICAgICB9Cisg ICAgfQorCisgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsK KyAgICAgIHZhciBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzID0gRXZlbnRQbHVnaW5SZWdpc3Ry eS5wb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzOworICAgICAgZm9yICh2YXIgbG93ZXJDYXNlZE5h bWUgaW4gcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcykgeworICAgICAgICBpZiAocG9zc2libGVS ZWdpc3RyYXRpb25OYW1lcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkpIHsKKyAgICAg ICAgICBkZWxldGUgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV07Cisg ICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworfTsKKworbW9kdWxlLmV4cG9ydHMgPSBF dmVudFBsdWdpblJlZ2lzdHJ5OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdp dCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9FdmVudFBsdWdpblV0 aWxzLmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL0V2ZW50UGx1 Z2luVXRpbHMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLmMzOTI5ZGI2 Ci0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20v bGliL0V2ZW50UGx1Z2luVXRpbHMuanMKQEAgLTAsMCArMSwyMjUgQEAKKy8qKgorICogQ29weXJp Z2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQu CisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxl IGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0 b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVu dCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGly ZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJvZEludmFyaWFudCA9 IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7CisKK3ZhciBSZWFjdEVycm9yVXRpbHMg PSByZXF1aXJlKCcuL1JlYWN0RXJyb3JVdGlscycpOworCit2YXIgaW52YXJpYW50ID0gcmVxdWly ZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7Cit2YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGli L3dhcm5pbmcnKTsKKworLyoqCisgKiBJbmplY3RlZCBkZXBlbmRlbmNpZXM6CisgKi8KKworLyoq CisgKiAtIGBDb21wb25lbnRUcmVlYDogW3JlcXVpcmVkXSBNb2R1bGUgdGhhdCBjYW4gY29udmVy dCBiZXR3ZWVuIFJlYWN0IGluc3RhbmNlcworICogICBhbmQgYWN0dWFsIG5vZGUgcmVmZXJlbmNl cy4KKyAqLwordmFyIENvbXBvbmVudFRyZWU7Cit2YXIgVHJlZVRyYXZlcnNhbDsKK3ZhciBpbmpl Y3Rpb24gPSB7CisgIGluamVjdENvbXBvbmVudFRyZWU6IGZ1bmN0aW9uIChJbmplY3RlZCkgewor ICAgIENvbXBvbmVudFRyZWUgPSBJbmplY3RlZDsKKyAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9F TlYgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdw cm9kdWN0aW9uJyA/IHdhcm5pbmcoSW5qZWN0ZWQgJiYgSW5qZWN0ZWQuZ2V0Tm9kZUZyb21JbnN0 YW5jZSAmJiBJbmplY3RlZC5nZXRJbnN0YW5jZUZyb21Ob2RlLCAnRXZlbnRQbHVnaW5VdGlscy5p bmplY3Rpb24uaW5qZWN0Q29tcG9uZW50VHJlZSguLi4pOiBJbmplY3RlZCAnICsgJ21vZHVsZSBp cyBtaXNzaW5nIGdldE5vZGVGcm9tSW5zdGFuY2Ugb3IgZ2V0SW5zdGFuY2VGcm9tTm9kZS4nKSA6 IHZvaWQgMDsKKyAgICB9CisgIH0sCisgIGluamVjdFRyZWVUcmF2ZXJzYWw6IGZ1bmN0aW9uIChJ bmplY3RlZCkgeworICAgIFRyZWVUcmF2ZXJzYWwgPSBJbmplY3RlZDsKKyAgICBpZiAocHJvY2Vz cy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgcHJvY2Vzcy5lbnYuTk9E RV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoSW5qZWN0ZWQgJiYgSW5qZWN0ZWQuaXNB bmNlc3RvciAmJiBJbmplY3RlZC5nZXRMb3dlc3RDb21tb25BbmNlc3RvciwgJ0V2ZW50UGx1Z2lu VXRpbHMuaW5qZWN0aW9uLmluamVjdFRyZWVUcmF2ZXJzYWwoLi4uKTogSW5qZWN0ZWQgJyArICdt b2R1bGUgaXMgbWlzc2luZyBpc0FuY2VzdG9yIG9yIGdldExvd2VzdENvbW1vbkFuY2VzdG9yLicp IDogdm9pZCAwOworICAgIH0KKyAgfQorfTsKKworZnVuY3Rpb24gaXNFbmRpc2godG9wTGV2ZWxU eXBlKSB7CisgIHJldHVybiB0b3BMZXZlbFR5cGUgPT09ICd0b3BNb3VzZVVwJyB8fCB0b3BMZXZl bFR5cGUgPT09ICd0b3BUb3VjaEVuZCcgfHwgdG9wTGV2ZWxUeXBlID09PSAndG9wVG91Y2hDYW5j ZWwnOworfQorCitmdW5jdGlvbiBpc01vdmVpc2godG9wTGV2ZWxUeXBlKSB7CisgIHJldHVybiB0 b3BMZXZlbFR5cGUgPT09ICd0b3BNb3VzZU1vdmUnIHx8IHRvcExldmVsVHlwZSA9PT0gJ3RvcFRv dWNoTW92ZSc7Cit9CitmdW5jdGlvbiBpc1N0YXJ0aXNoKHRvcExldmVsVHlwZSkgeworICByZXR1 cm4gdG9wTGV2ZWxUeXBlID09PSAndG9wTW91c2VEb3duJyB8fCB0b3BMZXZlbFR5cGUgPT09ICd0 b3BUb3VjaFN0YXJ0JzsKK30KKwordmFyIHZhbGlkYXRlRXZlbnREaXNwYXRjaGVzOworaWYgKHBy b2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgdmFsaWRhdGVFdmVudERp c3BhdGNoZXMgPSBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICB2YXIgZGlzcGF0Y2hMaXN0ZW5lcnMg PSBldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnM7CisgICAgdmFyIGRpc3BhdGNoSW5zdGFuY2VzID0g ZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzOworCisgICAgdmFyIGxpc3RlbmVyc0lzQXJyID0gQXJy YXkuaXNBcnJheShkaXNwYXRjaExpc3RlbmVycyk7CisgICAgdmFyIGxpc3RlbmVyc0xlbiA9IGxp c3RlbmVyc0lzQXJyID8gZGlzcGF0Y2hMaXN0ZW5lcnMubGVuZ3RoIDogZGlzcGF0Y2hMaXN0ZW5l cnMgPyAxIDogMDsKKworICAgIHZhciBpbnN0YW5jZXNJc0FyciA9IEFycmF5LmlzQXJyYXkoZGlz cGF0Y2hJbnN0YW5jZXMpOworICAgIHZhciBpbnN0YW5jZXNMZW4gPSBpbnN0YW5jZXNJc0FyciA/ IGRpc3BhdGNoSW5zdGFuY2VzLmxlbmd0aCA6IGRpc3BhdGNoSW5zdGFuY2VzID8gMSA6IDA7CisK KyAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhpbnN0 YW5jZXNJc0FyciA9PT0gbGlzdGVuZXJzSXNBcnIgJiYgaW5zdGFuY2VzTGVuID09PSBsaXN0ZW5l cnNMZW4sICdFdmVudFBsdWdpblV0aWxzOiBJbnZhbGlkIGBldmVudGAuJykgOiB2b2lkIDA7Cisg IH07Cit9CisKKy8qKgorICogRGlzcGF0Y2ggdGhlIGV2ZW50IHRvIHRoZSBsaXN0ZW5lci4KKyAq IEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IFN5bnRoZXRpY0V2ZW50IHRvIGhhbmRsZQor ICogQHBhcmFtIHtib29sZWFufSBzaW11bGF0ZWQgSWYgdGhlIGV2ZW50IGlzIHNpbXVsYXRlZCAo Y2hhbmdlcyBleG4gYmVoYXZpb3IpCisgKiBAcGFyYW0ge2Z1bmN0aW9ufSBsaXN0ZW5lciBBcHBs aWNhdGlvbi1sZXZlbCBjYWxsYmFjaworICogQHBhcmFtIHsqfSBpbnN0IEludGVybmFsIGNvbXBv bmVudCBpbnN0YW5jZQorICovCitmdW5jdGlvbiBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIHNpbXVs YXRlZCwgbGlzdGVuZXIsIGluc3QpIHsKKyAgdmFyIHR5cGUgPSBldmVudC50eXBlIHx8ICd1bmtu b3duLWV2ZW50JzsKKyAgZXZlbnQuY3VycmVudFRhcmdldCA9IEV2ZW50UGx1Z2luVXRpbHMuZ2V0 Tm9kZUZyb21JbnN0YW5jZShpbnN0KTsKKyAgaWYgKHNpbXVsYXRlZCkgeworICAgIFJlYWN0RXJy b3JVdGlscy5pbnZva2VHdWFyZGVkQ2FsbGJhY2tXaXRoQ2F0Y2godHlwZSwgbGlzdGVuZXIsIGV2 ZW50KTsKKyAgfSBlbHNlIHsKKyAgICBSZWFjdEVycm9yVXRpbHMuaW52b2tlR3VhcmRlZENhbGxi YWNrKHR5cGUsIGxpc3RlbmVyLCBldmVudCk7CisgIH0KKyAgZXZlbnQuY3VycmVudFRhcmdldCA9 IG51bGw7Cit9CisKKy8qKgorICogU3RhbmRhcmQvc2ltcGxlIGl0ZXJhdGlvbiB0aHJvdWdoIGFu IGV2ZW50J3MgY29sbGVjdGVkIGRpc3BhdGNoZXMuCisgKi8KK2Z1bmN0aW9uIGV4ZWN1dGVEaXNw YXRjaGVzSW5PcmRlcihldmVudCwgc2ltdWxhdGVkKSB7CisgIHZhciBkaXNwYXRjaExpc3RlbmVy cyA9IGV2ZW50Ll9kaXNwYXRjaExpc3RlbmVyczsKKyAgdmFyIGRpc3BhdGNoSW5zdGFuY2VzID0g ZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzOworICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09 ICdwcm9kdWN0aW9uJykgeworICAgIHZhbGlkYXRlRXZlbnREaXNwYXRjaGVzKGV2ZW50KTsKKyAg fQorICBpZiAoQXJyYXkuaXNBcnJheShkaXNwYXRjaExpc3RlbmVycykpIHsKKyAgICBmb3IgKHZh ciBpID0gMDsgaSA8IGRpc3BhdGNoTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICBpZiAo ZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0K KyAgICAgIC8vIExpc3RlbmVycyBhbmQgSW5zdGFuY2VzIGFyZSB0d28gcGFyYWxsZWwgYXJyYXlz IHRoYXQgYXJlIGFsd2F5cyBpbiBzeW5jLgorICAgICAgZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBz aW11bGF0ZWQsIGRpc3BhdGNoTGlzdGVuZXJzW2ldLCBkaXNwYXRjaEluc3RhbmNlc1tpXSk7Cisg ICAgfQorICB9IGVsc2UgaWYgKGRpc3BhdGNoTGlzdGVuZXJzKSB7CisgICAgZXhlY3V0ZURpc3Bh dGNoKGV2ZW50LCBzaW11bGF0ZWQsIGRpc3BhdGNoTGlzdGVuZXJzLCBkaXNwYXRjaEluc3RhbmNl cyk7CisgIH0KKyAgZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzID0gbnVsbDsKKyAgZXZlbnQuX2Rp c3BhdGNoSW5zdGFuY2VzID0gbnVsbDsKK30KKworLyoqCisgKiBTdGFuZGFyZC9zaW1wbGUgaXRl cmF0aW9uIHRocm91Z2ggYW4gZXZlbnQncyBjb2xsZWN0ZWQgZGlzcGF0Y2hlcywgYnV0IHN0b3Bz CisgKiBhdCB0aGUgZmlyc3QgZGlzcGF0Y2ggZXhlY3V0aW9uIHJldHVybmluZyB0cnVlLCBhbmQg cmV0dXJucyB0aGF0IGlkLgorICoKKyAqIEByZXR1cm4gez9zdHJpbmd9IGlkIG9mIHRoZSBmaXJz dCBkaXNwYXRjaCBleGVjdXRpb24gd2hvJ3MgbGlzdGVuZXIgcmV0dXJucworICogdHJ1ZSwgb3Ig bnVsbCBpZiBubyBsaXN0ZW5lciByZXR1cm5lZCB0cnVlLgorICovCitmdW5jdGlvbiBleGVjdXRl RGlzcGF0Y2hlc0luT3JkZXJTdG9wQXRUcnVlSW1wbChldmVudCkgeworICB2YXIgZGlzcGF0Y2hM aXN0ZW5lcnMgPSBldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnM7CisgIHZhciBkaXNwYXRjaEluc3Rh bmNlcyA9IGV2ZW50Ll9kaXNwYXRjaEluc3RhbmNlczsKKyAgaWYgKHByb2Nlc3MuZW52Lk5PREVf RU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICB2YWxpZGF0ZUV2ZW50RGlzcGF0Y2hlcyhldmVu dCk7CisgIH0KKyAgaWYgKEFycmF5LmlzQXJyYXkoZGlzcGF0Y2hMaXN0ZW5lcnMpKSB7CisgICAg Zm9yICh2YXIgaSA9IDA7IGkgPCBkaXNwYXRjaExpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAg ICAgaWYgKGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHsKKyAgICAgICAgYnJlYWs7Cisg ICAgICB9CisgICAgICAvLyBMaXN0ZW5lcnMgYW5kIEluc3RhbmNlcyBhcmUgdHdvIHBhcmFsbGVs IGFycmF5cyB0aGF0IGFyZSBhbHdheXMgaW4gc3luYy4KKyAgICAgIGlmIChkaXNwYXRjaExpc3Rl bmVyc1tpXShldmVudCwgZGlzcGF0Y2hJbnN0YW5jZXNbaV0pKSB7CisgICAgICAgIHJldHVybiBk aXNwYXRjaEluc3RhbmNlc1tpXTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAoZGlzcGF0 Y2hMaXN0ZW5lcnMpIHsKKyAgICBpZiAoZGlzcGF0Y2hMaXN0ZW5lcnMoZXZlbnQsIGRpc3BhdGNo SW5zdGFuY2VzKSkgeworICAgICAgcmV0dXJuIGRpc3BhdGNoSW5zdGFuY2VzOworICAgIH0KKyAg fQorICByZXR1cm4gbnVsbDsKK30KKworLyoqCisgKiBAc2VlIGV4ZWN1dGVEaXNwYXRjaGVzSW5P cmRlclN0b3BBdFRydWVJbXBsCisgKi8KK2Z1bmN0aW9uIGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRl clN0b3BBdFRydWUoZXZlbnQpIHsKKyAgdmFyIHJldCA9IGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRl clN0b3BBdFRydWVJbXBsKGV2ZW50KTsKKyAgZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzID0gbnVs bDsKKyAgZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzID0gbnVsbDsKKyAgcmV0dXJuIHJldDsKK30K KworLyoqCisgKiBFeGVjdXRpb24gb2YgYSAiZGlyZWN0IiBkaXNwYXRjaCAtIHRoZXJlIG11c3Qg YmUgYXQgbW9zdCBvbmUgZGlzcGF0Y2gKKyAqIGFjY3VtdWxhdGVkIG9uIHRoZSBldmVudCBvciBp dCBpcyBjb25zaWRlcmVkIGFuIGVycm9yLiBJdCBkb2Vzbid0IHJlYWxseSBtYWtlCisgKiBzZW5z ZSBmb3IgYW4gZXZlbnQgd2l0aCBtdWx0aXBsZSBkaXNwYXRjaGVzIChidWJibGVkKSB0byBrZWVw IHRyYWNrIG9mIHRoZQorICogcmV0dXJuIHZhbHVlcyBhdCBlYWNoIGRpc3BhdGNoIGV4ZWN1dGlv biwgYnV0IGl0IGRvZXMgdGVuZCB0byBtYWtlIHNlbnNlIHdoZW4KKyAqIGRlYWxpbmcgd2l0aCAi ZGlyZWN0IiBkaXNwYXRjaGVzLgorICoKKyAqIEByZXR1cm4geyp9IFRoZSByZXR1cm4gdmFsdWUg b2YgZXhlY3V0aW5nIHRoZSBzaW5nbGUgZGlzcGF0Y2guCisgKi8KK2Z1bmN0aW9uIGV4ZWN1dGVE aXJlY3REaXNwYXRjaChldmVudCkgeworICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdw cm9kdWN0aW9uJykgeworICAgIHZhbGlkYXRlRXZlbnREaXNwYXRjaGVzKGV2ZW50KTsKKyAgfQor ICB2YXIgZGlzcGF0Y2hMaXN0ZW5lciA9IGV2ZW50Ll9kaXNwYXRjaExpc3RlbmVyczsKKyAgdmFy IGRpc3BhdGNoSW5zdGFuY2UgPSBldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXM7CisgICEhQXJyYXku aXNBcnJheShkaXNwYXRjaExpc3RlbmVyKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJv ZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdleGVjdXRlRGlyZWN0RGlzcGF0Y2goLi4uKTog SW52YWxpZCBgZXZlbnRgLicpIDogX3Byb2RJbnZhcmlhbnQoJzEwMycpIDogdm9pZCAwOworICBl dmVudC5jdXJyZW50VGFyZ2V0ID0gZGlzcGF0Y2hMaXN0ZW5lciA/IEV2ZW50UGx1Z2luVXRpbHMu Z2V0Tm9kZUZyb21JbnN0YW5jZShkaXNwYXRjaEluc3RhbmNlKSA6IG51bGw7CisgIHZhciByZXMg PSBkaXNwYXRjaExpc3RlbmVyID8gZGlzcGF0Y2hMaXN0ZW5lcihldmVudCkgOiBudWxsOworICBl dmVudC5jdXJyZW50VGFyZ2V0ID0gbnVsbDsKKyAgZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzID0g bnVsbDsKKyAgZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzID0gbnVsbDsKKyAgcmV0dXJuIHJlczsK K30KKworLyoqCisgKiBAcGFyYW0ge1N5bnRoZXRpY0V2ZW50fSBldmVudAorICogQHJldHVybiB7 Ym9vbGVhbn0gVHJ1ZSBpZmYgbnVtYmVyIG9mIGRpc3BhdGNoZXMgYWNjdW11bGF0ZWQgaXMgZ3Jl YXRlciB0aGFuIDAuCisgKi8KK2Z1bmN0aW9uIGhhc0Rpc3BhdGNoZXMoZXZlbnQpIHsKKyAgcmV0 dXJuICEhZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzOworfQorCisvKioKKyAqIEdlbmVyYWwgdXRp bGl0aWVzIHRoYXQgYXJlIHVzZWZ1bCBpbiBjcmVhdGluZyBjdXN0b20gRXZlbnQgUGx1Z2lucy4K KyAqLwordmFyIEV2ZW50UGx1Z2luVXRpbHMgPSB7CisgIGlzRW5kaXNoOiBpc0VuZGlzaCwKKyAg aXNNb3ZlaXNoOiBpc01vdmVpc2gsCisgIGlzU3RhcnRpc2g6IGlzU3RhcnRpc2gsCisKKyAgZXhl Y3V0ZURpcmVjdERpc3BhdGNoOiBleGVjdXRlRGlyZWN0RGlzcGF0Y2gsCisgIGV4ZWN1dGVEaXNw YXRjaGVzSW5PcmRlcjogZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyLAorICBleGVjdXRlRGlzcGF0 Y2hlc0luT3JkZXJTdG9wQXRUcnVlOiBleGVjdXRlRGlzcGF0Y2hlc0luT3JkZXJTdG9wQXRUcnVl LAorICBoYXNEaXNwYXRjaGVzOiBoYXNEaXNwYXRjaGVzLAorCisgIGdldEluc3RhbmNlRnJvbU5v ZGU6IGZ1bmN0aW9uIChub2RlKSB7CisgICAgcmV0dXJuIENvbXBvbmVudFRyZWUuZ2V0SW5zdGFu Y2VGcm9tTm9kZShub2RlKTsKKyAgfSwKKyAgZ2V0Tm9kZUZyb21JbnN0YW5jZTogZnVuY3Rpb24g KG5vZGUpIHsKKyAgICByZXR1cm4gQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKG5v ZGUpOworICB9LAorICBpc0FuY2VzdG9yOiBmdW5jdGlvbiAoYSwgYikgeworICAgIHJldHVybiBU cmVlVHJhdmVyc2FsLmlzQW5jZXN0b3IoYSwgYik7CisgIH0sCisgIGdldExvd2VzdENvbW1vbkFu Y2VzdG9yOiBmdW5jdGlvbiAoYSwgYikgeworICAgIHJldHVybiBUcmVlVHJhdmVyc2FsLmdldExv d2VzdENvbW1vbkFuY2VzdG9yKGEsIGIpOworICB9LAorICBnZXRQYXJlbnRJbnN0YW5jZTogZnVu Y3Rpb24gKGluc3QpIHsKKyAgICByZXR1cm4gVHJlZVRyYXZlcnNhbC5nZXRQYXJlbnRJbnN0YW5j ZShpbnN0KTsKKyAgfSwKKyAgdHJhdmVyc2VUd29QaGFzZTogZnVuY3Rpb24gKHRhcmdldCwgZm4s IGFyZykgeworICAgIHJldHVybiBUcmVlVHJhdmVyc2FsLnRyYXZlcnNlVHdvUGhhc2UodGFyZ2V0 LCBmbiwgYXJnKTsKKyAgfSwKKyAgdHJhdmVyc2VFbnRlckxlYXZlOiBmdW5jdGlvbiAoZnJvbSwg dG8sIGZuLCBhcmdGcm9tLCBhcmdUbykgeworICAgIHJldHVybiBUcmVlVHJhdmVyc2FsLnRyYXZl cnNlRW50ZXJMZWF2ZShmcm9tLCB0bywgZm4sIGFyZ0Zyb20sIGFyZ1RvKTsKKyAgfSwKKworICBp bmplY3Rpb246IGluamVjdGlvbgorfTsKKworbW9kdWxlLmV4cG9ydHMgPSBFdmVudFBsdWdpblV0 aWxzOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWlu L3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9FdmVudFByb3BhZ2F0b3JzLmpzIGIvd2ViL3Bn YWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL0V2ZW50UHJvcGFnYXRvcnMuanMKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjQ3MDRlMzdiCi0tLSAvZGV2L251bGwK KysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL0V2ZW50UHJvcGFn YXRvcnMuanMKQEAgLTAsMCArMSwxMzMgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2Vu dCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBz b3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQg aW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291 cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJl IGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAq LworCisndXNlIHN0cmljdCc7CisKK3ZhciBFdmVudFBsdWdpbkh1YiA9IHJlcXVpcmUoJy4vRXZl bnRQbHVnaW5IdWInKTsKK3ZhciBFdmVudFBsdWdpblV0aWxzID0gcmVxdWlyZSgnLi9FdmVudFBs dWdpblV0aWxzJyk7CisKK3ZhciBhY2N1bXVsYXRlSW50byA9IHJlcXVpcmUoJy4vYWNjdW11bGF0 ZUludG8nKTsKK3ZhciBmb3JFYWNoQWNjdW11bGF0ZWQgPSByZXF1aXJlKCcuL2ZvckVhY2hBY2N1 bXVsYXRlZCcpOwordmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7CisK K3ZhciBnZXRMaXN0ZW5lciA9IEV2ZW50UGx1Z2luSHViLmdldExpc3RlbmVyOworCisvKioKKyAq IFNvbWUgZXZlbnQgdHlwZXMgaGF2ZSBhIG5vdGlvbiBvZiBkaWZmZXJlbnQgcmVnaXN0cmF0aW9u IG5hbWVzIGZvciBkaWZmZXJlbnQKKyAqICJwaGFzZXMiIG9mIHByb3BhZ2F0aW9uLiBUaGlzIGZp bmRzIGxpc3RlbmVycyBieSBhIGdpdmVuIHBoYXNlLgorICovCitmdW5jdGlvbiBsaXN0ZW5lckF0 UGhhc2UoaW5zdCwgZXZlbnQsIHByb3BhZ2F0aW9uUGhhc2UpIHsKKyAgdmFyIHJlZ2lzdHJhdGlv bk5hbWUgPSBldmVudC5kaXNwYXRjaENvbmZpZy5waGFzZWRSZWdpc3RyYXRpb25OYW1lc1twcm9w YWdhdGlvblBoYXNlXTsKKyAgcmV0dXJuIGdldExpc3RlbmVyKGluc3QsIHJlZ2lzdHJhdGlvbk5h bWUpOworfQorCisvKioKKyAqIFRhZ3MgYSBgU3ludGhldGljRXZlbnRgIHdpdGggZGlzcGF0Y2hl ZCBsaXN0ZW5lcnMuIENyZWF0aW5nIHRoaXMgZnVuY3Rpb24KKyAqIGhlcmUsIGFsbG93cyB1cyB0 byBub3QgaGF2ZSB0byBiaW5kIG9yIGNyZWF0ZSBmdW5jdGlvbnMgZm9yIGVhY2ggZXZlbnQuCisg KiBNdXRhdGluZyB0aGUgZXZlbnQncyBtZW1iZXJzIGFsbG93cyB1cyB0byBub3QgaGF2ZSB0byBj cmVhdGUgYSB3cmFwcGluZworICogImRpc3BhdGNoIiBvYmplY3QgdGhhdCBwYWlycyB0aGUgZXZl bnQgd2l0aCB0aGUgbGlzdGVuZXIuCisgKi8KK2Z1bmN0aW9uIGFjY3VtdWxhdGVEaXJlY3Rpb25h bERpc3BhdGNoZXMoaW5zdCwgcGhhc2UsIGV2ZW50KSB7CisgIGlmIChwcm9jZXNzLmVudi5OT0RF X0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdw cm9kdWN0aW9uJyA/IHdhcm5pbmcoaW5zdCwgJ0Rpc3BhdGNoaW5nIGluc3QgbXVzdCBub3QgYmUg bnVsbCcpIDogdm9pZCAwOworICB9CisgIHZhciBsaXN0ZW5lciA9IGxpc3RlbmVyQXRQaGFzZShp bnN0LCBldmVudCwgcGhhc2UpOworICBpZiAobGlzdGVuZXIpIHsKKyAgICBldmVudC5fZGlzcGF0 Y2hMaXN0ZW5lcnMgPSBhY2N1bXVsYXRlSW50byhldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnMsIGxp c3RlbmVyKTsKKyAgICBldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXMgPSBhY2N1bXVsYXRlSW50byhl dmVudC5fZGlzcGF0Y2hJbnN0YW5jZXMsIGluc3QpOworICB9Cit9CisKKy8qKgorICogQ29sbGVj dCBkaXNwYXRjaGVzIChtdXN0IGJlIGVudGlyZWx5IGNvbGxlY3RlZCBiZWZvcmUgZGlzcGF0Y2hp bmcgLSBzZWUgdW5pdAorICogdGVzdHMpLiBMYXppbHkgYWxsb2NhdGUgdGhlIGFycmF5IHRvIGNv bnNlcnZlIG1lbW9yeS4gIFdlIG11c3QgbG9vcCB0aHJvdWdoCisgKiBlYWNoIGV2ZW50IGFuZCBw ZXJmb3JtIHRoZSB0cmF2ZXJzYWwgZm9yIGVhY2ggb25lLiBXZSBjYW5ub3QgcGVyZm9ybSBhCisg KiBzaW5nbGUgdHJhdmVyc2FsIGZvciB0aGUgZW50aXJlIGNvbGxlY3Rpb24gb2YgZXZlbnRzIGJl Y2F1c2UgZWFjaCBldmVudCBtYXkKKyAqIGhhdmUgYSBkaWZmZXJlbnQgdGFyZ2V0LgorICovCitm dW5jdGlvbiBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzU2luZ2xlKGV2ZW50KSB7CisgIGlm IChldmVudCAmJiBldmVudC5kaXNwYXRjaENvbmZpZy5waGFzZWRSZWdpc3RyYXRpb25OYW1lcykg eworICAgIEV2ZW50UGx1Z2luVXRpbHMudHJhdmVyc2VUd29QaGFzZShldmVudC5fdGFyZ2V0SW5z dCwgYWNjdW11bGF0ZURpcmVjdGlvbmFsRGlzcGF0Y2hlcywgZXZlbnQpOworICB9Cit9CisKKy8q KgorICogU2FtZSBhcyBgYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1NpbmdsZWAsIGJ1dCBz a2lwcyBvdmVyIHRoZSB0YXJnZXRJRC4KKyAqLworZnVuY3Rpb24gYWNjdW11bGF0ZVR3b1BoYXNl RGlzcGF0Y2hlc1NpbmdsZVNraXBUYXJnZXQoZXZlbnQpIHsKKyAgaWYgKGV2ZW50ICYmIGV2ZW50 LmRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzKSB7CisgICAgdmFyIHRhcmdl dEluc3QgPSBldmVudC5fdGFyZ2V0SW5zdDsKKyAgICB2YXIgcGFyZW50SW5zdCA9IHRhcmdldElu c3QgPyBFdmVudFBsdWdpblV0aWxzLmdldFBhcmVudEluc3RhbmNlKHRhcmdldEluc3QpIDogbnVs bDsKKyAgICBFdmVudFBsdWdpblV0aWxzLnRyYXZlcnNlVHdvUGhhc2UocGFyZW50SW5zdCwgYWNj dW11bGF0ZURpcmVjdGlvbmFsRGlzcGF0Y2hlcywgZXZlbnQpOworICB9Cit9CisKKy8qKgorICog QWNjdW11bGF0ZXMgd2l0aG91dCByZWdhcmQgdG8gZGlyZWN0aW9uLCBkb2VzIG5vdCBsb29rIGZv ciBwaGFzZWQKKyAqIHJlZ2lzdHJhdGlvbiBuYW1lcy4gU2FtZSBhcyBgYWNjdW11bGF0ZURpcmVj dERpc3BhdGNoZXNTaW5nbGVgIGJ1dCB3aXRob3V0CisgKiByZXF1aXJpbmcgdGhhdCB0aGUgYGRp c3BhdGNoTWFya2VyYCBiZSB0aGUgc2FtZSBhcyB0aGUgZGlzcGF0Y2hlZCBJRC4KKyAqLworZnVu Y3Rpb24gYWNjdW11bGF0ZURpc3BhdGNoZXMoaW5zdCwgaWdub3JlZERpcmVjdGlvbiwgZXZlbnQp IHsKKyAgaWYgKGV2ZW50ICYmIGV2ZW50LmRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUp IHsKKyAgICB2YXIgcmVnaXN0cmF0aW9uTmFtZSA9IGV2ZW50LmRpc3BhdGNoQ29uZmlnLnJlZ2lz dHJhdGlvbk5hbWU7CisgICAgdmFyIGxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdCwgcmVnaXN0 cmF0aW9uTmFtZSk7CisgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICBldmVudC5fZGlzcGF0Y2hM aXN0ZW5lcnMgPSBhY2N1bXVsYXRlSW50byhldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnMsIGxpc3Rl bmVyKTsKKyAgICAgIGV2ZW50Ll9kaXNwYXRjaEluc3RhbmNlcyA9IGFjY3VtdWxhdGVJbnRvKGV2 ZW50Ll9kaXNwYXRjaEluc3RhbmNlcywgaW5zdCk7CisgICAgfQorICB9Cit9CisKKy8qKgorICog QWNjdW11bGF0ZXMgZGlzcGF0Y2hlcyBvbiBhbiBgU3ludGhldGljRXZlbnRgLCBidXQgb25seSBm b3IgdGhlCisgKiBgZGlzcGF0Y2hNYXJrZXJgLgorICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0g ZXZlbnQKKyAqLworZnVuY3Rpb24gYWNjdW11bGF0ZURpcmVjdERpc3BhdGNoZXNTaW5nbGUoZXZl bnQpIHsKKyAgaWYgKGV2ZW50ICYmIGV2ZW50LmRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5h bWUpIHsKKyAgICBhY2N1bXVsYXRlRGlzcGF0Y2hlcyhldmVudC5fdGFyZ2V0SW5zdCwgbnVsbCwg ZXZlbnQpOworICB9Cit9CisKK2Z1bmN0aW9uIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMo ZXZlbnRzKSB7CisgIGZvckVhY2hBY2N1bXVsYXRlZChldmVudHMsIGFjY3VtdWxhdGVUd29QaGFz ZURpc3BhdGNoZXNTaW5nbGUpOworfQorCitmdW5jdGlvbiBhY2N1bXVsYXRlVHdvUGhhc2VEaXNw YXRjaGVzU2tpcFRhcmdldChldmVudHMpIHsKKyAgZm9yRWFjaEFjY3VtdWxhdGVkKGV2ZW50cywg YWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1NpbmdsZVNraXBUYXJnZXQpOworfQorCitmdW5j dGlvbiBhY2N1bXVsYXRlRW50ZXJMZWF2ZURpc3BhdGNoZXMobGVhdmUsIGVudGVyLCBmcm9tLCB0 bykgeworICBFdmVudFBsdWdpblV0aWxzLnRyYXZlcnNlRW50ZXJMZWF2ZShmcm9tLCB0bywgYWNj dW11bGF0ZURpc3BhdGNoZXMsIGxlYXZlLCBlbnRlcik7Cit9CisKK2Z1bmN0aW9uIGFjY3VtdWxh dGVEaXJlY3REaXNwYXRjaGVzKGV2ZW50cykgeworICBmb3JFYWNoQWNjdW11bGF0ZWQoZXZlbnRz LCBhY2N1bXVsYXRlRGlyZWN0RGlzcGF0Y2hlc1NpbmdsZSk7Cit9CisKKy8qKgorICogQSBzbWFs bCBzZXQgb2YgcHJvcGFnYXRpb24gcGF0dGVybnMsIGVhY2ggb2Ygd2hpY2ggd2lsbCBhY2NlcHQg YSBzbWFsbCBhbW91bnQKKyAqIG9mIGluZm9ybWF0aW9uLCBhbmQgZ2VuZXJhdGUgYSBzZXQgb2Yg ImRpc3BhdGNoIHJlYWR5IGV2ZW50IG9iamVjdHMiIC0gd2hpY2gKKyAqIGFyZSBzZXRzIG9mIGV2 ZW50cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGFubm90YXRlZCB3aXRoIGEgc2V0IG9mIGRpc3Bh dGNoZWQKKyAqIGxpc3RlbmVyIGZ1bmN0aW9ucy9pZHMuIFRoZSBBUEkgaXMgZGVzaWduZWQgdGhp cyB3YXkgdG8gZGlzY291cmFnZSB0aGVzZQorICogcHJvcGFnYXRpb24gc3RyYXRlZ2llcyBmcm9t IGFjdHVhbGx5IGV4ZWN1dGluZyB0aGUgZGlzcGF0Y2hlcywgc2luY2Ugd2UKKyAqIGFsd2F5cyB3 YW50IHRvIGNvbGxlY3QgdGhlIGVudGlyZSBzZXQgb2YgZGlzcGF0Y2hlcyBiZWZvcmUgZXhlY3V0 aW5nIGV2ZW50IGEKKyAqIHNpbmdsZSBvbmUuCisgKgorICogQGNvbnN0cnVjdG9yIEV2ZW50UHJv cGFnYXRvcnMKKyAqLwordmFyIEV2ZW50UHJvcGFnYXRvcnMgPSB7CisgIGFjY3VtdWxhdGVUd29Q aGFzZURpc3BhdGNoZXM6IGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMsCisgIGFjY3VtdWxh dGVUd29QaGFzZURpc3BhdGNoZXNTa2lwVGFyZ2V0OiBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRj aGVzU2tpcFRhcmdldCwKKyAgYWNjdW11bGF0ZURpcmVjdERpc3BhdGNoZXM6IGFjY3VtdWxhdGVE aXJlY3REaXNwYXRjaGVzLAorICBhY2N1bXVsYXRlRW50ZXJMZWF2ZURpc3BhdGNoZXM6IGFjY3Vt dWxhdGVFbnRlckxlYXZlRGlzcGF0Y2hlcworfTsKKworbW9kdWxlLmV4cG9ydHMgPSBFdmVudFBy b3BhZ2F0b3JzOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9w Z2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9GYWxsYmFja0NvbXBvc2l0aW9uU3Rh dGUuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvRmFsbGJhY2tD b21wb3NpdGlvblN0YXRlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi40 M2MwYTFjOQotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVh Y3QtZG9tL2xpYi9GYWxsYmFja0NvbXBvc2l0aW9uU3RhdGUuanMKQEAgLTAsMCArMSw5NCBAQAor LyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJp Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVy IHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0 aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFu dAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBp biB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9h c3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7CisKK3ZhciBQb29sZWRDbGFzcyA9IHJl cXVpcmUoJy4vUG9vbGVkQ2xhc3MnKTsKKwordmFyIGdldFRleHRDb250ZW50QWNjZXNzb3IgPSBy ZXF1aXJlKCcuL2dldFRleHRDb250ZW50QWNjZXNzb3InKTsKKworLyoqCisgKiBUaGlzIGhlbHBl ciBjbGFzcyBzdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgdGV4dCBjb250ZW50IG9mIGEgdGFyZ2V0 IG5vZGUsCisgKiBhbGxvd2luZyBjb21wYXJpc29uIG9mIGNvbnRlbnQgYmVmb3JlIGFuZCBhZnRl ciBhIGdpdmVuIGV2ZW50LgorICoKKyAqIElkZW50aWZ5IHRoZSBub2RlIHdoZXJlIHNlbGVjdGlv biBjdXJyZW50bHkgYmVnaW5zLCB0aGVuIG9ic2VydmUKKyAqIGJvdGggaXRzIHRleHQgY29udGVu dCBhbmQgaXRzIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIERPTS4gU2luY2UgdGhlCisgKiBicm93 c2VyIG1heSBuYXRpdmVseSByZXBsYWNlIHRoZSB0YXJnZXQgbm9kZSBkdXJpbmcgY29tcG9zaXRp b24sIHdlIGNhbgorICogdXNlIGl0cyBwb3NpdGlvbiB0byBmaW5kIGl0cyByZXBsYWNlbWVudC4K KyAqCisgKiBAcGFyYW0ge0RPTUV2ZW50VGFyZ2V0fSByb290CisgKi8KK2Z1bmN0aW9uIEZhbGxi YWNrQ29tcG9zaXRpb25TdGF0ZShyb290KSB7CisgIHRoaXMuX3Jvb3QgPSByb290OworICB0aGlz Ll9zdGFydFRleHQgPSB0aGlzLmdldFRleHQoKTsKKyAgdGhpcy5fZmFsbGJhY2tUZXh0ID0gbnVs bDsKK30KKworX2Fzc2lnbihGYWxsYmFja0NvbXBvc2l0aW9uU3RhdGUucHJvdG90eXBlLCB7Cisg IGRlc3RydWN0b3I6IGZ1bmN0aW9uICgpIHsKKyAgICB0aGlzLl9yb290ID0gbnVsbDsKKyAgICB0 aGlzLl9zdGFydFRleHQgPSBudWxsOworICAgIHRoaXMuX2ZhbGxiYWNrVGV4dCA9IG51bGw7Cisg IH0sCisKKyAgLyoqCisgICAqIEdldCBjdXJyZW50IHRleHQgb2YgaW5wdXQuCisgICAqCisgICAq IEByZXR1cm4ge3N0cmluZ30KKyAgICovCisgIGdldFRleHQ6IGZ1bmN0aW9uICgpIHsKKyAgICBp ZiAoJ3ZhbHVlJyBpbiB0aGlzLl9yb290KSB7CisgICAgICByZXR1cm4gdGhpcy5fcm9vdC52YWx1 ZTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXMuX3Jvb3RbZ2V0VGV4dENvbnRlbnRBY2Nlc3Nvcigp XTsKKyAgfSwKKworICAvKioKKyAgICogRGV0ZXJtaW5lIHRoZSBkaWZmZXJpbmcgc3Vic3RyaW5n IGJldHdlZW4gdGhlIGluaXRpYWxseSBzdG9yZWQKKyAgICogdGV4dCBjb250ZW50IGFuZCB0aGUg Y3VycmVudCBjb250ZW50LgorICAgKgorICAgKiBAcmV0dXJuIHtzdHJpbmd9CisgICAqLworICBn ZXREYXRhOiBmdW5jdGlvbiAoKSB7CisgICAgaWYgKHRoaXMuX2ZhbGxiYWNrVGV4dCkgeworICAg ICAgcmV0dXJuIHRoaXMuX2ZhbGxiYWNrVGV4dDsKKyAgICB9CisKKyAgICB2YXIgc3RhcnQ7Cisg ICAgdmFyIHN0YXJ0VmFsdWUgPSB0aGlzLl9zdGFydFRleHQ7CisgICAgdmFyIHN0YXJ0TGVuZ3Ro ID0gc3RhcnRWYWx1ZS5sZW5ndGg7CisgICAgdmFyIGVuZDsKKyAgICB2YXIgZW5kVmFsdWUgPSB0 aGlzLmdldFRleHQoKTsKKyAgICB2YXIgZW5kTGVuZ3RoID0gZW5kVmFsdWUubGVuZ3RoOworCisg ICAgZm9yIChzdGFydCA9IDA7IHN0YXJ0IDwgc3RhcnRMZW5ndGg7IHN0YXJ0KyspIHsKKyAgICAg IGlmIChzdGFydFZhbHVlW3N0YXJ0XSAhPT0gZW5kVmFsdWVbc3RhcnRdKSB7CisgICAgICAgIGJy ZWFrOworICAgICAgfQorICAgIH0KKworICAgIHZhciBtaW5FbmQgPSBzdGFydExlbmd0aCAtIHN0 YXJ0OworICAgIGZvciAoZW5kID0gMTsgZW5kIDw9IG1pbkVuZDsgZW5kKyspIHsKKyAgICAgIGlm IChzdGFydFZhbHVlW3N0YXJ0TGVuZ3RoIC0gZW5kXSAhPT0gZW5kVmFsdWVbZW5kTGVuZ3RoIC0g ZW5kXSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgc2xpY2VU YWlsID0gZW5kID4gMSA/IDEgLSBlbmQgOiB1bmRlZmluZWQ7CisgICAgdGhpcy5fZmFsbGJhY2tU ZXh0ID0gZW5kVmFsdWUuc2xpY2Uoc3RhcnQsIHNsaWNlVGFpbCk7CisgICAgcmV0dXJuIHRoaXMu X2ZhbGxiYWNrVGV4dDsKKyAgfQorfSk7CisKK1Bvb2xlZENsYXNzLmFkZFBvb2xpbmdUbyhGYWxs YmFja0NvbXBvc2l0aW9uU3RhdGUpOworCittb2R1bGUuZXhwb3J0cyA9IEZhbGxiYWNrQ29tcG9z aXRpb25TdGF0ZTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIv cGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvSFRNTERPTVByb3BlcnR5Q29uZmln LmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL0hUTUxET01Qcm9w ZXJ0eUNvbmZpZy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uMjU4N2Yz ZTAKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRv bS9saWIvSFRNTERPTVByb3BlcnR5Q29uZmlnLmpzCkBAIC0wLDAgKzEsMjExIEBACisvKioKKyAq IENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJl c2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJT RC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290 IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBv ZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBz YW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgRE9NUHJvcGVy dHkgPSByZXF1aXJlKCcuL0RPTVByb3BlcnR5Jyk7CisKK3ZhciBNVVNUX1VTRV9QUk9QRVJUWSA9 IERPTVByb3BlcnR5LmluamVjdGlvbi5NVVNUX1VTRV9QUk9QRVJUWTsKK3ZhciBIQVNfQk9PTEVB Tl9WQUxVRSA9IERPTVByb3BlcnR5LmluamVjdGlvbi5IQVNfQk9PTEVBTl9WQUxVRTsKK3ZhciBI QVNfTlVNRVJJQ19WQUxVRSA9IERPTVByb3BlcnR5LmluamVjdGlvbi5IQVNfTlVNRVJJQ19WQUxV RTsKK3ZhciBIQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRSA9IERPTVByb3BlcnR5LmluamVjdGlv bi5IQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRTsKK3ZhciBIQVNfT1ZFUkxPQURFRF9CT09MRUFO X1ZBTFVFID0gRE9NUHJvcGVydHkuaW5qZWN0aW9uLkhBU19PVkVSTE9BREVEX0JPT0xFQU5fVkFM VUU7CisKK3ZhciBIVE1MRE9NUHJvcGVydHlDb25maWcgPSB7CisgIGlzQ3VzdG9tQXR0cmlidXRl OiBSZWdFeHAucHJvdG90eXBlLnRlc3QuYmluZChuZXcgUmVnRXhwKCdeKGRhdGF8YXJpYSktWycg KyBET01Qcm9wZXJ0eS5BVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpKSwKKyAgUHJvcGVydGll czogeworICAgIC8qKgorICAgICAqIFN0YW5kYXJkIFByb3BlcnRpZXMKKyAgICAgKi8KKyAgICBh Y2NlcHQ6IDAsCisgICAgYWNjZXB0Q2hhcnNldDogMCwKKyAgICBhY2Nlc3NLZXk6IDAsCisgICAg YWN0aW9uOiAwLAorICAgIGFsbG93RnVsbFNjcmVlbjogSEFTX0JPT0xFQU5fVkFMVUUsCisgICAg YWxsb3dUcmFuc3BhcmVuY3k6IDAsCisgICAgYWx0OiAwLAorICAgIC8vIHNwZWNpZmllcyB0YXJn ZXQgY29udGV4dCBmb3IgbGlua3Mgd2l0aCBgcHJlbG9hZGAgdHlwZQorICAgIGFzOiAwLAorICAg IGFzeW5jOiBIQVNfQk9PTEVBTl9WQUxVRSwKKyAgICBhdXRvQ29tcGxldGU6IDAsCisgICAgLy8g YXV0b0ZvY3VzIGlzIHBvbHlmaWxsZWQvbm9ybWFsaXplZCBieSBBdXRvRm9jdXNVdGlscworICAg IC8vIGF1dG9Gb2N1czogSEFTX0JPT0xFQU5fVkFMVUUsCisgICAgYXV0b1BsYXk6IEhBU19CT09M RUFOX1ZBTFVFLAorICAgIGNhcHR1cmU6IEhBU19CT09MRUFOX1ZBTFVFLAorICAgIGNlbGxQYWRk aW5nOiAwLAorICAgIGNlbGxTcGFjaW5nOiAwLAorICAgIGNoYXJTZXQ6IDAsCisgICAgY2hhbGxl bmdlOiAwLAorICAgIGNoZWNrZWQ6IE1VU1RfVVNFX1BST1BFUlRZIHwgSEFTX0JPT0xFQU5fVkFM VUUsCisgICAgY2l0ZTogMCwKKyAgICBjbGFzc0lEOiAwLAorICAgIGNsYXNzTmFtZTogMCwKKyAg ICBjb2xzOiBIQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRSwKKyAgICBjb2xTcGFuOiAwLAorICAg IGNvbnRlbnQ6IDAsCisgICAgY29udGVudEVkaXRhYmxlOiAwLAorICAgIGNvbnRleHRNZW51OiAw LAorICAgIGNvbnRyb2xzOiBIQVNfQk9PTEVBTl9WQUxVRSwKKyAgICBjb29yZHM6IDAsCisgICAg Y3Jvc3NPcmlnaW46IDAsCisgICAgZGF0YTogMCwgLy8gRm9yIGA8b2JqZWN0IC8+YCBhY3RzIGFz IGBzcmNgLgorICAgIGRhdGVUaW1lOiAwLAorICAgICdkZWZhdWx0JzogSEFTX0JPT0xFQU5fVkFM VUUsCisgICAgZGVmZXI6IEhBU19CT09MRUFOX1ZBTFVFLAorICAgIGRpcjogMCwKKyAgICBkaXNh YmxlZDogSEFTX0JPT0xFQU5fVkFMVUUsCisgICAgZG93bmxvYWQ6IEhBU19PVkVSTE9BREVEX0JP T0xFQU5fVkFMVUUsCisgICAgZHJhZ2dhYmxlOiAwLAorICAgIGVuY1R5cGU6IDAsCisgICAgZm9y bTogMCwKKyAgICBmb3JtQWN0aW9uOiAwLAorICAgIGZvcm1FbmNUeXBlOiAwLAorICAgIGZvcm1N ZXRob2Q6IDAsCisgICAgZm9ybU5vVmFsaWRhdGU6IEhBU19CT09MRUFOX1ZBTFVFLAorICAgIGZv cm1UYXJnZXQ6IDAsCisgICAgZnJhbWVCb3JkZXI6IDAsCisgICAgaGVhZGVyczogMCwKKyAgICBo ZWlnaHQ6IDAsCisgICAgaGlkZGVuOiBIQVNfQk9PTEVBTl9WQUxVRSwKKyAgICBoaWdoOiAwLAor ICAgIGhyZWY6IDAsCisgICAgaHJlZkxhbmc6IDAsCisgICAgaHRtbEZvcjogMCwKKyAgICBodHRw RXF1aXY6IDAsCisgICAgaWNvbjogMCwKKyAgICBpZDogMCwKKyAgICBpbnB1dE1vZGU6IDAsCisg ICAgaW50ZWdyaXR5OiAwLAorICAgIGlzOiAwLAorICAgIGtleVBhcmFtczogMCwKKyAgICBrZXlU eXBlOiAwLAorICAgIGtpbmQ6IDAsCisgICAgbGFiZWw6IDAsCisgICAgbGFuZzogMCwKKyAgICBs aXN0OiAwLAorICAgIGxvb3A6IEhBU19CT09MRUFOX1ZBTFVFLAorICAgIGxvdzogMCwKKyAgICBt YW5pZmVzdDogMCwKKyAgICBtYXJnaW5IZWlnaHQ6IDAsCisgICAgbWFyZ2luV2lkdGg6IDAsCisg ICAgbWF4OiAwLAorICAgIG1heExlbmd0aDogMCwKKyAgICBtZWRpYTogMCwKKyAgICBtZWRpYUdy b3VwOiAwLAorICAgIG1ldGhvZDogMCwKKyAgICBtaW46IDAsCisgICAgbWluTGVuZ3RoOiAwLAor ICAgIC8vIENhdXRpb247IGBvcHRpb24uc2VsZWN0ZWRgIGlzIG5vdCB1cGRhdGVkIGlmIGBzZWxl Y3QubXVsdGlwbGVgIGlzCisgICAgLy8gZGlzYWJsZWQgd2l0aCBgcmVtb3ZlQXR0cmlidXRlYC4K KyAgICBtdWx0aXBsZTogTVVTVF9VU0VfUFJPUEVSVFkgfCBIQVNfQk9PTEVBTl9WQUxVRSwKKyAg ICBtdXRlZDogTVVTVF9VU0VfUFJPUEVSVFkgfCBIQVNfQk9PTEVBTl9WQUxVRSwKKyAgICBuYW1l OiAwLAorICAgIG5vbmNlOiAwLAorICAgIG5vVmFsaWRhdGU6IEhBU19CT09MRUFOX1ZBTFVFLAor ICAgIG9wZW46IEhBU19CT09MRUFOX1ZBTFVFLAorICAgIG9wdGltdW06IDAsCisgICAgcGF0dGVy bjogMCwKKyAgICBwbGFjZWhvbGRlcjogMCwKKyAgICBwbGF5c0lubGluZTogSEFTX0JPT0xFQU5f VkFMVUUsCisgICAgcG9zdGVyOiAwLAorICAgIHByZWxvYWQ6IDAsCisgICAgcHJvZmlsZTogMCwK KyAgICByYWRpb0dyb3VwOiAwLAorICAgIHJlYWRPbmx5OiBIQVNfQk9PTEVBTl9WQUxVRSwKKyAg ICByZWZlcnJlclBvbGljeTogMCwKKyAgICByZWw6IDAsCisgICAgcmVxdWlyZWQ6IEhBU19CT09M RUFOX1ZBTFVFLAorICAgIHJldmVyc2VkOiBIQVNfQk9PTEVBTl9WQUxVRSwKKyAgICByb2xlOiAw LAorICAgIHJvd3M6IEhBU19QT1NJVElWRV9OVU1FUklDX1ZBTFVFLAorICAgIHJvd1NwYW46IEhB U19OVU1FUklDX1ZBTFVFLAorICAgIHNhbmRib3g6IDAsCisgICAgc2NvcGU6IDAsCisgICAgc2Nv cGVkOiBIQVNfQk9PTEVBTl9WQUxVRSwKKyAgICBzY3JvbGxpbmc6IDAsCisgICAgc2VhbWxlc3M6 IEhBU19CT09MRUFOX1ZBTFVFLAorICAgIHNlbGVjdGVkOiBNVVNUX1VTRV9QUk9QRVJUWSB8IEhB U19CT09MRUFOX1ZBTFVFLAorICAgIHNoYXBlOiAwLAorICAgIHNpemU6IEhBU19QT1NJVElWRV9O VU1FUklDX1ZBTFVFLAorICAgIHNpemVzOiAwLAorICAgIHNwYW46IEhBU19QT1NJVElWRV9OVU1F UklDX1ZBTFVFLAorICAgIHNwZWxsQ2hlY2s6IDAsCisgICAgc3JjOiAwLAorICAgIHNyY0RvYzog MCwKKyAgICBzcmNMYW5nOiAwLAorICAgIHNyY1NldDogMCwKKyAgICBzdGFydDogSEFTX05VTUVS SUNfVkFMVUUsCisgICAgc3RlcDogMCwKKyAgICBzdHlsZTogMCwKKyAgICBzdW1tYXJ5OiAwLAor ICAgIHRhYkluZGV4OiAwLAorICAgIHRhcmdldDogMCwKKyAgICB0aXRsZTogMCwKKyAgICAvLyBT ZXR0aW5nIC50eXBlIHRocm93cyBvbiBub24tPGlucHV0PiB0YWdzCisgICAgdHlwZTogMCwKKyAg ICB1c2VNYXA6IDAsCisgICAgdmFsdWU6IDAsCisgICAgd2lkdGg6IDAsCisgICAgd21vZGU6IDAs CisgICAgd3JhcDogMCwKKworICAgIC8qKgorICAgICAqIFJERmEgUHJvcGVydGllcworICAgICAq LworICAgIGFib3V0OiAwLAorICAgIGRhdGF0eXBlOiAwLAorICAgIGlubGlzdDogMCwKKyAgICBw cmVmaXg6IDAsCisgICAgLy8gcHJvcGVydHkgaXMgYWxzbyBzdXBwb3J0ZWQgZm9yIE9wZW5HcmFw aCBpbiBtZXRhIHRhZ3MuCisgICAgcHJvcGVydHk6IDAsCisgICAgcmVzb3VyY2U6IDAsCisgICAg J3R5cGVvZic6IDAsCisgICAgdm9jYWI6IDAsCisKKyAgICAvKioKKyAgICAgKiBOb24tc3RhbmRh cmQgUHJvcGVydGllcworICAgICAqLworICAgIC8vIGF1dG9DYXBpdGFsaXplIGFuZCBhdXRvQ29y cmVjdCBhcmUgc3VwcG9ydGVkIGluIE1vYmlsZSBTYWZhcmkgZm9yCisgICAgLy8ga2V5Ym9hcmQg aGludHMuCisgICAgYXV0b0NhcGl0YWxpemU6IDAsCisgICAgYXV0b0NvcnJlY3Q6IDAsCisgICAg Ly8gYXV0b1NhdmUgYWxsb3dzIFdlYktpdC9CbGluayB0byBwZXJzaXN0IHZhbHVlcyBvZiBpbnB1 dCBmaWVsZHMgb24gcGFnZSByZWxvYWRzCisgICAgYXV0b1NhdmU6IDAsCisgICAgLy8gY29sb3Ig aXMgZm9yIFNhZmFyaSBtYXNrLWljb24gbGluaworICAgIGNvbG9yOiAwLAorICAgIC8vIGl0ZW1Q cm9wLCBpdGVtU2NvcGUsIGl0ZW1UeXBlIGFyZSBmb3IKKyAgICAvLyBNaWNyb2RhdGEgc3VwcG9y dC4gU2VlIGh0dHA6Ly9zY2hlbWEub3JnL2RvY3MvZ3MuaHRtbAorICAgIGl0ZW1Qcm9wOiAwLAor ICAgIGl0ZW1TY29wZTogSEFTX0JPT0xFQU5fVkFMVUUsCisgICAgaXRlbVR5cGU6IDAsCisgICAg Ly8gaXRlbUlEIGFuZCBpdGVtUmVmIGFyZSBmb3IgTWljcm9kYXRhIHN1cHBvcnQgYXMgd2VsbCBi dXQKKyAgICAvLyBvbmx5IHNwZWNpZmllZCBpbiB0aGUgV0hBVFdHIHNwZWMgZG9jdW1lbnQuIFNl ZQorICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL21pY3JvZGF0 YS5odG1sI21pY3JvZGF0YS1kb20tYXBpCisgICAgaXRlbUlEOiAwLAorICAgIGl0ZW1SZWY6IDAs CisgICAgLy8gcmVzdWx0cyBzaG93IGxvb2tpbmcgZ2xhc3MgaWNvbiBhbmQgcmVjZW50IHNlYXJj aGVzIG9uIGlucHV0CisgICAgLy8gc2VhcmNoIGZpZWxkcyBpbiBXZWJLaXQvQmxpbmsKKyAgICBy ZXN1bHRzOiAwLAorICAgIC8vIElFLW9ubHkgYXR0cmlidXRlIHRoYXQgc3BlY2lmaWVzIHNlY3Vy aXR5IHJlc3RyaWN0aW9ucyBvbiBhbiBpZnJhbWUKKyAgICAvLyBhcyBhbiBhbHRlcm5hdGl2ZSB0 byB0aGUgc2FuZGJveCBhdHRyaWJ1dGUgb24gSUU8MTAKKyAgICBzZWN1cml0eTogMCwKKyAgICAv LyBJRS1vbmx5IGF0dHJpYnV0ZSB0aGF0IGNvbnRyb2xzIGZvY3VzIGJlaGF2aW9yCisgICAgdW5z ZWxlY3RhYmxlOiAwCisgIH0sCisgIERPTUF0dHJpYnV0ZU5hbWVzOiB7CisgICAgYWNjZXB0Q2hh cnNldDogJ2FjY2VwdC1jaGFyc2V0JywKKyAgICBjbGFzc05hbWU6ICdjbGFzcycsCisgICAgaHRt bEZvcjogJ2ZvcicsCisgICAgaHR0cEVxdWl2OiAnaHR0cC1lcXVpdicKKyAgfSwKKyAgRE9NUHJv cGVydHlOYW1lczoge30KK307CisKK21vZHVsZS5leHBvcnRzID0gSFRNTERPTVByb3BlcnR5Q29u ZmlnOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWlu L3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9LZXlFc2NhcGVVdGlscy5qcyBiL3dlYi9wZ2Fk bWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9LZXlFc2NhcGVVdGlscy5qcwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uMGFiZjFhMjIKLS0tIC9kZXYvbnVsbAorKysg Yi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvS2V5RXNjYXBlVXRpbHMu anMKQEAgLTAsMCArMSw1OCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNl Ym9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBj b2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUK KyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJl ZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQg aW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogCisgKi8K KworJ3VzZSBzdHJpY3QnOworCisvKioKKyAqIEVzY2FwZSBhbmQgd3JhcCBrZXkgc28gaXQgaXMg c2FmZSB0byB1c2UgYXMgYSByZWFjdGlkCisgKgorICogQHBhcmFtIHtzdHJpbmd9IGtleSB0byBi ZSBlc2NhcGVkLgorICogQHJldHVybiB7c3RyaW5nfSB0aGUgZXNjYXBlZCBrZXkuCisgKi8KKwor ZnVuY3Rpb24gZXNjYXBlKGtleSkgeworICB2YXIgZXNjYXBlUmVnZXggPSAvWz06XS9nOworICB2 YXIgZXNjYXBlckxvb2t1cCA9IHsKKyAgICAnPSc6ICc9MCcsCisgICAgJzonOiAnPTInCisgIH07 CisgIHZhciBlc2NhcGVkU3RyaW5nID0gKCcnICsga2V5KS5yZXBsYWNlKGVzY2FwZVJlZ2V4LCBm dW5jdGlvbiAobWF0Y2gpIHsKKyAgICByZXR1cm4gZXNjYXBlckxvb2t1cFttYXRjaF07CisgIH0p OworCisgIHJldHVybiAnJCcgKyBlc2NhcGVkU3RyaW5nOworfQorCisvKioKKyAqIFVuZXNjYXBl IGFuZCB1bndyYXAga2V5IGZvciBodW1hbi1yZWFkYWJsZSBkaXNwbGF5CisgKgorICogQHBhcmFt IHtzdHJpbmd9IGtleSB0byB1bmVzY2FwZS4KKyAqIEByZXR1cm4ge3N0cmluZ30gdGhlIHVuZXNj YXBlZCBrZXkuCisgKi8KK2Z1bmN0aW9uIHVuZXNjYXBlKGtleSkgeworICB2YXIgdW5lc2NhcGVS ZWdleCA9IC8oPTB8PTIpL2c7CisgIHZhciB1bmVzY2FwZXJMb29rdXAgPSB7CisgICAgJz0wJzog Jz0nLAorICAgICc9Mic6ICc6JworICB9OworICB2YXIga2V5U3Vic3RyaW5nID0ga2V5WzBdID09 PSAnLicgJiYga2V5WzFdID09PSAnJCcgPyBrZXkuc3Vic3RyaW5nKDIpIDoga2V5LnN1YnN0cmlu ZygxKTsKKworICByZXR1cm4gKCcnICsga2V5U3Vic3RyaW5nKS5yZXBsYWNlKHVuZXNjYXBlUmVn ZXgsIGZ1bmN0aW9uIChtYXRjaCkgeworICAgIHJldHVybiB1bmVzY2FwZXJMb29rdXBbbWF0Y2hd OworICB9KTsKK30KKwordmFyIEtleUVzY2FwZVV0aWxzID0geworICBlc2NhcGU6IGVzY2FwZSwK KyAgdW5lc2NhcGU6IHVuZXNjYXBlCit9OworCittb2R1bGUuZXhwb3J0cyA9IEtleUVzY2FwZVV0 aWxzOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWlu L3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9MaW5rZWRWYWx1ZVV0aWxzLmpzIGIvd2ViL3Bn YWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL0xpbmtlZFZhbHVlVXRpbHMuanMKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLmEzMmQ0Y2E5Ci0tLSAvZGV2L251bGwK KysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL0xpbmtlZFZhbHVl VXRpbHMuanMKQEAgLTAsMCArMSwxMzQgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2Vu dCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBz b3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQg aW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291 cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJl IGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAq LworCisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVh Y3RQcm9kSW52YXJpYW50Jyk7CisKK3ZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFj dCcpOwordmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9SZWFjdFByb3BUeXBl c1NlY3JldCcpOworCit2YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50 Jyk7Cit2YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTsKKwordmFyIGhh c1JlYWRPbmx5VmFsdWUgPSB7CisgICdidXR0b24nOiB0cnVlLAorICAnY2hlY2tib3gnOiB0cnVl LAorICAnaW1hZ2UnOiB0cnVlLAorICAnaGlkZGVuJzogdHJ1ZSwKKyAgJ3JhZGlvJzogdHJ1ZSwK KyAgJ3Jlc2V0JzogdHJ1ZSwKKyAgJ3N1Ym1pdCc6IHRydWUKK307CisKK2Z1bmN0aW9uIF9hc3Nl cnRTaW5nbGVMaW5rKGlucHV0UHJvcHMpIHsKKyAgIShpbnB1dFByb3BzLmNoZWNrZWRMaW5rID09 IG51bGwgfHwgaW5wdXRQcm9wcy52YWx1ZUxpbmsgPT0gbnVsbCkgPyBwcm9jZXNzLmVudi5OT0RF X0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnQ2Fubm90IHByb3ZpZGUg YSBjaGVja2VkTGluayBhbmQgYSB2YWx1ZUxpbmsuIElmIHlvdSB3YW50IHRvIHVzZSBjaGVja2Vk TGluaywgeW91IHByb2JhYmx5IGRvblwndCB3YW50IHRvIHVzZSB2YWx1ZUxpbmsgYW5kIHZpY2Ug dmVyc2EuJykgOiBfcHJvZEludmFyaWFudCgnODcnKSA6IHZvaWQgMDsKK30KK2Z1bmN0aW9uIF9h c3NlcnRWYWx1ZUxpbmsoaW5wdXRQcm9wcykgeworICBfYXNzZXJ0U2luZ2xlTGluayhpbnB1dFBy b3BzKTsKKyAgIShpbnB1dFByb3BzLnZhbHVlID09IG51bGwgJiYgaW5wdXRQcm9wcy5vbkNoYW5n ZSA9PSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZh cmlhbnQoZmFsc2UsICdDYW5ub3QgcHJvdmlkZSBhIHZhbHVlTGluayBhbmQgYSB2YWx1ZSBvciBv bkNoYW5nZSBldmVudC4gSWYgeW91IHdhbnQgdG8gdXNlIHZhbHVlIG9yIG9uQ2hhbmdlLCB5b3Ug cHJvYmFibHkgZG9uXCd0IHdhbnQgdG8gdXNlIHZhbHVlTGluay4nKSA6IF9wcm9kSW52YXJpYW50 KCc4OCcpIDogdm9pZCAwOworfQorCitmdW5jdGlvbiBfYXNzZXJ0Q2hlY2tlZExpbmsoaW5wdXRQ cm9wcykgeworICBfYXNzZXJ0U2luZ2xlTGluayhpbnB1dFByb3BzKTsKKyAgIShpbnB1dFByb3Bz LmNoZWNrZWQgPT0gbnVsbCAmJiBpbnB1dFByb3BzLm9uQ2hhbmdlID09IG51bGwpID8gcHJvY2Vz cy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0Nhbm5v dCBwcm92aWRlIGEgY2hlY2tlZExpbmsgYW5kIGEgY2hlY2tlZCBwcm9wZXJ0eSBvciBvbkNoYW5n ZSBldmVudC4gSWYgeW91IHdhbnQgdG8gdXNlIGNoZWNrZWQgb3Igb25DaGFuZ2UsIHlvdSBwcm9i YWJseSBkb25cJ3Qgd2FudCB0byB1c2UgY2hlY2tlZExpbmsnKSA6IF9wcm9kSW52YXJpYW50KCc4 OScpIDogdm9pZCAwOworfQorCit2YXIgcHJvcFR5cGVzID0geworICB2YWx1ZTogZnVuY3Rpb24g KHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkgeworICAgIGlmICghcHJvcHNbcHJvcE5h bWVdIHx8IGhhc1JlYWRPbmx5VmFsdWVbcHJvcHMudHlwZV0gfHwgcHJvcHMub25DaGFuZ2UgfHwg cHJvcHMucmVhZE9ubHkgfHwgcHJvcHMuZGlzYWJsZWQpIHsKKyAgICAgIHJldHVybiBudWxsOwor ICAgIH0KKyAgICByZXR1cm4gbmV3IEVycm9yKCdZb3UgcHJvdmlkZWQgYSBgdmFsdWVgIHByb3Ag dG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gJyArICdgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMg d2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmICcgKyAndGhlIGZpZWxkIHNob3VsZCBi ZSBtdXRhYmxlIHVzZSBgZGVmYXVsdFZhbHVlYC4gT3RoZXJ3aXNlLCAnICsgJ3NldCBlaXRoZXIg YG9uQ2hhbmdlYCBvciBgcmVhZE9ubHlgLicpOworICB9LAorICBjaGVja2VkOiBmdW5jdGlvbiAo cHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lKSB7CisgICAgaWYgKCFwcm9wc1twcm9wTmFt ZV0gfHwgcHJvcHMub25DaGFuZ2UgfHwgcHJvcHMucmVhZE9ubHkgfHwgcHJvcHMuZGlzYWJsZWQp IHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICByZXR1cm4gbmV3IEVycm9yKCdZb3Ug cHJvdmlkZWQgYSBgY2hlY2tlZGAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiAnICsg J2BvbkNoYW5nZWAgaGFuZGxlci4gVGhpcyB3aWxsIHJlbmRlciBhIHJlYWQtb25seSBmaWVsZC4g SWYgJyArICd0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGBkZWZhdWx0Q2hlY2tlZGAu IE90aGVyd2lzZSwgJyArICdzZXQgZWl0aGVyIGBvbkNoYW5nZWAgb3IgYHJlYWRPbmx5YC4nKTsK KyAgfSwKKyAgb25DaGFuZ2U6IFJlYWN0LlByb3BUeXBlcy5mdW5jCit9OworCit2YXIgbG9nZ2Vk VHlwZUZhaWx1cmVzID0ge307CitmdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0o b3duZXIpIHsKKyAgaWYgKG93bmVyKSB7CisgICAgdmFyIG5hbWUgPSBvd25lci5nZXROYW1lKCk7 CisgICAgaWYgKG5hbWUpIHsKKyAgICAgIHJldHVybiAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9k IG9mIGAnICsgbmFtZSArICdgLic7CisgICAgfQorICB9CisgIHJldHVybiAnJzsKK30KKworLyoq CisgKiBQcm92aWRlIGEgbGlua2VkIGB2YWx1ZWAgYXR0cmlidXRlIGZvciBjb250cm9sbGVkIGZv cm1zLiBZb3Ugc2hvdWxkIG5vdCB1c2UKKyAqIHRoaXMgb3V0c2lkZSBvZiB0aGUgUmVhY3RET00g Y29udHJvbGxlZCBmb3JtIGNvbXBvbmVudHMuCisgKi8KK3ZhciBMaW5rZWRWYWx1ZVV0aWxzID0g eworICBjaGVja1Byb3BUeXBlczogZnVuY3Rpb24gKHRhZ05hbWUsIHByb3BzLCBvd25lcikgewor ICAgIGZvciAodmFyIHByb3BOYW1lIGluIHByb3BUeXBlcykgeworICAgICAgaWYgKHByb3BUeXBl cy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHsKKyAgICAgICAgdmFyIGVycm9yID0gcHJvcFR5 cGVzW3Byb3BOYW1lXShwcm9wcywgcHJvcE5hbWUsIHRhZ05hbWUsICdwcm9wJywgbnVsbCwgUmVh Y3RQcm9wVHlwZXNTZWNyZXQpOworICAgICAgfQorICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2Yg RXJyb3IgJiYgIShlcnJvci5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHsKKyAgICAg ICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMg dG8gYmUgYSBsb3Qgb2YgdGhlCisgICAgICAgIC8vIHNhbWUgZXJyb3IuCisgICAgICAgIGxvZ2dl ZFR5cGVGYWlsdXJlc1tlcnJvci5tZXNzYWdlXSA9IHRydWU7CisKKyAgICAgICAgdmFyIGFkZGVu ZHVtID0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKG93bmVyKTsKKyAgICAgICAgcHJvY2Vz cy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdGYWlsZWQg Zm9ybSBwcm9wVHlwZTogJXMlcycsIGVycm9yLm1lc3NhZ2UsIGFkZGVuZHVtKSA6IHZvaWQgMDsK KyAgICAgIH0KKyAgICB9CisgIH0sCisKKyAgLyoqCisgICAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1 dFByb3BzIFByb3BzIGZvciBmb3JtIGNvbXBvbmVudAorICAgKiBAcmV0dXJuIHsqfSBjdXJyZW50 IHZhbHVlIG9mIHRoZSBpbnB1dCBlaXRoZXIgZnJvbSB2YWx1ZSBwcm9wIG9yIGxpbmsuCisgICAq LworICBnZXRWYWx1ZTogZnVuY3Rpb24gKGlucHV0UHJvcHMpIHsKKyAgICBpZiAoaW5wdXRQcm9w cy52YWx1ZUxpbmspIHsKKyAgICAgIF9hc3NlcnRWYWx1ZUxpbmsoaW5wdXRQcm9wcyk7CisgICAg ICByZXR1cm4gaW5wdXRQcm9wcy52YWx1ZUxpbmsudmFsdWU7CisgICAgfQorICAgIHJldHVybiBp bnB1dFByb3BzLnZhbHVlOworICB9LAorCisgIC8qKgorICAgKiBAcGFyYW0ge29iamVjdH0gaW5w dXRQcm9wcyBQcm9wcyBmb3IgZm9ybSBjb21wb25lbnQKKyAgICogQHJldHVybiB7Kn0gY3VycmVu dCBjaGVja2VkIHN0YXR1cyBvZiB0aGUgaW5wdXQgZWl0aGVyIGZyb20gY2hlY2tlZCBwcm9wCisg ICAqICAgICAgICAgICAgIG9yIGxpbmsuCisgICAqLworICBnZXRDaGVja2VkOiBmdW5jdGlvbiAo aW5wdXRQcm9wcykgeworICAgIGlmIChpbnB1dFByb3BzLmNoZWNrZWRMaW5rKSB7CisgICAgICBf YXNzZXJ0Q2hlY2tlZExpbmsoaW5wdXRQcm9wcyk7CisgICAgICByZXR1cm4gaW5wdXRQcm9wcy5j aGVja2VkTGluay52YWx1ZTsKKyAgICB9CisgICAgcmV0dXJuIGlucHV0UHJvcHMuY2hlY2tlZDsK KyAgfSwKKworICAvKioKKyAgICogQHBhcmFtIHtvYmplY3R9IGlucHV0UHJvcHMgUHJvcHMgZm9y IGZvcm0gY29tcG9uZW50CisgICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IGNoYW5n ZSBldmVudCB0byBoYW5kbGUKKyAgICovCisgIGV4ZWN1dGVPbkNoYW5nZTogZnVuY3Rpb24gKGlu cHV0UHJvcHMsIGV2ZW50KSB7CisgICAgaWYgKGlucHV0UHJvcHMudmFsdWVMaW5rKSB7CisgICAg ICBfYXNzZXJ0VmFsdWVMaW5rKGlucHV0UHJvcHMpOworICAgICAgcmV0dXJuIGlucHV0UHJvcHMu dmFsdWVMaW5rLnJlcXVlc3RDaGFuZ2UoZXZlbnQudGFyZ2V0LnZhbHVlKTsKKyAgICB9IGVsc2Ug aWYgKGlucHV0UHJvcHMuY2hlY2tlZExpbmspIHsKKyAgICAgIF9hc3NlcnRDaGVja2VkTGluayhp bnB1dFByb3BzKTsKKyAgICAgIHJldHVybiBpbnB1dFByb3BzLmNoZWNrZWRMaW5rLnJlcXVlc3RD aGFuZ2UoZXZlbnQudGFyZ2V0LmNoZWNrZWQpOworICAgIH0gZWxzZSBpZiAoaW5wdXRQcm9wcy5v bkNoYW5nZSkgeworICAgICAgcmV0dXJuIGlucHV0UHJvcHMub25DaGFuZ2UuY2FsbCh1bmRlZmlu ZWQsIGV2ZW50KTsKKyAgICB9CisgIH0KK307CisKK21vZHVsZS5leHBvcnRzID0gTGlua2VkVmFs dWVVdGlsczsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdh ZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUGx1Z2luTW9kdWxlVHlwZS5qcyBiL3dl Yi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9QbHVnaW5Nb2R1bGVUeXBlLmpz Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi42ZDk0Y2E4MQotLS0gL2Rldi9u dWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9QbHVnaW5N b2R1bGVUeXBlLmpzCkBAIC0wLDAgKzEsMTIgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJl c2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhp cyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91 bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMg c291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2Fu IGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoK KyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRp ZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUG9vbGVk Q2xhc3MuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUG9vbGVk Q2xhc3MuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjFkMTBlYWYxCi0t LSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGli L1Bvb2xlZENsYXNzLmpzCkBAIC0wLDAgKzEsMTExIEBACisvKioKKyAqIENvcHlyaWdodCAyMDEz LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq IFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNl IGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0 aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRz IGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4K KyAqCisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJvZEludmFyaWFudCA9IHJl cXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7CisKK3ZhciBpbnZhcmlhbnQgPSByZXF1aXJl KCdmYmpzL2xpYi9pbnZhcmlhbnQnKTsKKworLyoqCisgKiBTdGF0aWMgcG9vbGVycy4gU2V2ZXJh bCBjdXN0b20gdmVyc2lvbnMgZm9yIGVhY2ggcG90ZW50aWFsIG51bWJlciBvZgorICogYXJndW1l bnRzLiBBIGNvbXBsZXRlbHkgZ2VuZXJpYyBwb29sZXIgaXMgZWFzeSB0byBpbXBsZW1lbnQsIGJ1 dCB3b3VsZAorICogcmVxdWlyZSBhY2Nlc3NpbmcgdGhlIGBhcmd1bWVudHNgIG9iamVjdC4gSW4g ZWFjaCBvZiB0aGVzZSwgYHRoaXNgIHJlZmVycyB0bworICogdGhlIENsYXNzIGl0c2VsZiwgbm90 IGFuIGluc3RhbmNlLiBJZiBhbnkgb3RoZXJzIGFyZSBuZWVkZWQsIHNpbXBseSBhZGQgdGhlbQor ICogaGVyZSwgb3IgaW4gdGhlaXIgb3duIGZpbGVzLgorICovCit2YXIgb25lQXJndW1lbnRQb29s ZXIgPSBmdW5jdGlvbiAoY29weUZpZWxkc0Zyb20pIHsKKyAgdmFyIEtsYXNzID0gdGhpczsKKyAg aWYgKEtsYXNzLmluc3RhbmNlUG9vbC5sZW5ndGgpIHsKKyAgICB2YXIgaW5zdGFuY2UgPSBLbGFz cy5pbnN0YW5jZVBvb2wucG9wKCk7CisgICAgS2xhc3MuY2FsbChpbnN0YW5jZSwgY29weUZpZWxk c0Zyb20pOworICAgIHJldHVybiBpbnN0YW5jZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbmV3 IEtsYXNzKGNvcHlGaWVsZHNGcm9tKTsKKyAgfQorfTsKKwordmFyIHR3b0FyZ3VtZW50UG9vbGVy ID0gZnVuY3Rpb24gKGExLCBhMikgeworICB2YXIgS2xhc3MgPSB0aGlzOworICBpZiAoS2xhc3Mu aW5zdGFuY2VQb29sLmxlbmd0aCkgeworICAgIHZhciBpbnN0YW5jZSA9IEtsYXNzLmluc3RhbmNl UG9vbC5wb3AoKTsKKyAgICBLbGFzcy5jYWxsKGluc3RhbmNlLCBhMSwgYTIpOworICAgIHJldHVy biBpbnN0YW5jZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbmV3IEtsYXNzKGExLCBhMik7Cisg IH0KK307CisKK3ZhciB0aHJlZUFyZ3VtZW50UG9vbGVyID0gZnVuY3Rpb24gKGExLCBhMiwgYTMp IHsKKyAgdmFyIEtsYXNzID0gdGhpczsKKyAgaWYgKEtsYXNzLmluc3RhbmNlUG9vbC5sZW5ndGgp IHsKKyAgICB2YXIgaW5zdGFuY2UgPSBLbGFzcy5pbnN0YW5jZVBvb2wucG9wKCk7CisgICAgS2xh c3MuY2FsbChpbnN0YW5jZSwgYTEsIGEyLCBhMyk7CisgICAgcmV0dXJuIGluc3RhbmNlOworICB9 IGVsc2UgeworICAgIHJldHVybiBuZXcgS2xhc3MoYTEsIGEyLCBhMyk7CisgIH0KK307CisKK3Zh ciBmb3VyQXJndW1lbnRQb29sZXIgPSBmdW5jdGlvbiAoYTEsIGEyLCBhMywgYTQpIHsKKyAgdmFy IEtsYXNzID0gdGhpczsKKyAgaWYgKEtsYXNzLmluc3RhbmNlUG9vbC5sZW5ndGgpIHsKKyAgICB2 YXIgaW5zdGFuY2UgPSBLbGFzcy5pbnN0YW5jZVBvb2wucG9wKCk7CisgICAgS2xhc3MuY2FsbChp bnN0YW5jZSwgYTEsIGEyLCBhMywgYTQpOworICAgIHJldHVybiBpbnN0YW5jZTsKKyAgfSBlbHNl IHsKKyAgICByZXR1cm4gbmV3IEtsYXNzKGExLCBhMiwgYTMsIGE0KTsKKyAgfQorfTsKKwordmFy IHN0YW5kYXJkUmVsZWFzZXIgPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKKyAgdmFyIEtsYXNzID0g dGhpczsKKyAgIShpbnN0YW5jZSBpbnN0YW5jZW9mIEtsYXNzKSA/IHByb2Nlc3MuZW52Lk5PREVf RU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdUcnlpbmcgdG8gcmVsZWFz ZSBhbiBpbnN0YW5jZSBpbnRvIGEgcG9vbCBvZiBhIGRpZmZlcmVudCB0eXBlLicpIDogX3Byb2RJ bnZhcmlhbnQoJzI1JykgOiB2b2lkIDA7CisgIGluc3RhbmNlLmRlc3RydWN0b3IoKTsKKyAgaWYg KEtsYXNzLmluc3RhbmNlUG9vbC5sZW5ndGggPCBLbGFzcy5wb29sU2l6ZSkgeworICAgIEtsYXNz Lmluc3RhbmNlUG9vbC5wdXNoKGluc3RhbmNlKTsKKyAgfQorfTsKKwordmFyIERFRkFVTFRfUE9P TF9TSVpFID0gMTA7Cit2YXIgREVGQVVMVF9QT09MRVIgPSBvbmVBcmd1bWVudFBvb2xlcjsKKwor LyoqCisgKiBBdWdtZW50cyBgQ29weUNvbnN0cnVjdG9yYCB0byBiZSBhIHBvb2xhYmxlIGNsYXNz LCBhdWdtZW50aW5nIG9ubHkgdGhlIGNsYXNzCisgKiBpdHNlbGYgKHN0YXRpY2FsbHkpIG5vdCBh ZGRpbmcgYW55IHByb3RvdHlwaWNhbCBmaWVsZHMuIEFueSBDb3B5Q29uc3RydWN0b3IKKyAqIHlv dSBnaXZlIHRoaXMgbWF5IGhhdmUgYSBgcG9vbFNpemVgIHByb3BlcnR5LCBhbmQgd2lsbCBsb29r IGZvciBhCisgKiBwcm90b3R5cGljYWwgYGRlc3RydWN0b3JgIG9uIGluc3RhbmNlcy4KKyAqCisg KiBAcGFyYW0ge0Z1bmN0aW9ufSBDb3B5Q29uc3RydWN0b3IgQ29uc3RydWN0b3IgdGhhdCBjYW4g YmUgdXNlZCB0byByZXNldC4KKyAqIEBwYXJhbSB7RnVuY3Rpb259IHBvb2xlciBDdXN0b21pemFi bGUgcG9vbGVyLgorICovCit2YXIgYWRkUG9vbGluZ1RvID0gZnVuY3Rpb24gKENvcHlDb25zdHJ1 Y3RvciwgcG9vbGVyKSB7CisgIC8vIENhc3RpbmcgYXMgYW55IHNvIHRoYXQgZmxvdyBpZ25vcmVz IHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gYW5kIHRydXN0cworICAvLyBpdCB0byBtYXRjaCB0 aGUgdHlwZSB3ZSBkZWNsYXJlZAorICB2YXIgTmV3S2xhc3MgPSBDb3B5Q29uc3RydWN0b3I7Cisg IE5ld0tsYXNzLmluc3RhbmNlUG9vbCA9IFtdOworICBOZXdLbGFzcy5nZXRQb29sZWQgPSBwb29s ZXIgfHwgREVGQVVMVF9QT09MRVI7CisgIGlmICghTmV3S2xhc3MucG9vbFNpemUpIHsKKyAgICBO ZXdLbGFzcy5wb29sU2l6ZSA9IERFRkFVTFRfUE9PTF9TSVpFOworICB9CisgIE5ld0tsYXNzLnJl bGVhc2UgPSBzdGFuZGFyZFJlbGVhc2VyOworICByZXR1cm4gTmV3S2xhc3M7Cit9OworCit2YXIg UG9vbGVkQ2xhc3MgPSB7CisgIGFkZFBvb2xpbmdUbzogYWRkUG9vbGluZ1RvLAorICBvbmVBcmd1 bWVudFBvb2xlcjogb25lQXJndW1lbnRQb29sZXIsCisgIHR3b0FyZ3VtZW50UG9vbGVyOiB0d29B cmd1bWVudFBvb2xlciwKKyAgdGhyZWVBcmd1bWVudFBvb2xlcjogdGhyZWVBcmd1bWVudFBvb2xl ciwKKyAgZm91ckFyZ3VtZW50UG9vbGVyOiBmb3VyQXJndW1lbnRQb29sZXIKK307CisKK21vZHVs ZS5leHBvcnRzID0gUG9vbGVkQ2xhc3M7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZm IC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0QnJv d3NlckV2ZW50RW1pdHRlci5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9t L2xpYi9SZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAuLjBiODNiYzAyCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3Rh dGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5qcwpAQCAt MCwwICsxLDMyNyBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywg SW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlz IGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJ Q0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4g YWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhl IFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3Ry aWN0JzsKKwordmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7CisKK3ZhciBF dmVudFBsdWdpblJlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpblJlZ2lzdHJ5Jyk7Cit2 YXIgUmVhY3RFdmVudEVtaXR0ZXJNaXhpbiA9IHJlcXVpcmUoJy4vUmVhY3RFdmVudEVtaXR0ZXJN aXhpbicpOwordmFyIFZpZXdwb3J0TWV0cmljcyA9IHJlcXVpcmUoJy4vVmlld3BvcnRNZXRyaWNz Jyk7CisKK3ZhciBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSA9IHJlcXVpcmUoJy4vZ2V0VmVu ZG9yUHJlZml4ZWRFdmVudE5hbWUnKTsKK3ZhciBpc0V2ZW50U3VwcG9ydGVkID0gcmVxdWlyZSgn Li9pc0V2ZW50U3VwcG9ydGVkJyk7CisKKy8qKgorICogU3VtbWFyeSBvZiBgUmVhY3RCcm93c2Vy RXZlbnRFbWl0dGVyYCBldmVudCBoYW5kbGluZzoKKyAqCisgKiAgLSBUb3AtbGV2ZWwgZGVsZWdh dGlvbiBpcyB1c2VkIHRvIHRyYXAgbW9zdCBuYXRpdmUgYnJvd3NlciBldmVudHMuIFRoaXMKKyAq ICAgIG1heSBvbmx5IG9jY3VyIGluIHRoZSBtYWluIHRocmVhZCBhbmQgaXMgdGhlIHJlc3BvbnNp YmlsaXR5IG9mCisgKiAgICBSZWFjdEV2ZW50TGlzdGVuZXIsIHdoaWNoIGlzIGluamVjdGVkIGFu ZCBjYW4gdGhlcmVmb3JlIHN1cHBvcnQgcGx1Z2dhYmxlCisgKiAgICBldmVudCBzb3VyY2VzLiBU aGlzIGlzIHRoZSBvbmx5IHdvcmsgdGhhdCBvY2N1cnMgaW4gdGhlIG1haW4gdGhyZWFkLgorICoK KyAqICAtIFdlIG5vcm1hbGl6ZSBhbmQgZGUtZHVwbGljYXRlIGV2ZW50cyB0byBhY2NvdW50IGZv ciBicm93c2VyIHF1aXJrcy4gVGhpcworICogICAgbWF5IGJlIGRvbmUgaW4gdGhlIHdvcmtlciB0 aHJlYWQuCisgKgorICogIC0gRm9yd2FyZCB0aGVzZSBuYXRpdmUgZXZlbnRzICh3aXRoIHRoZSBh c3NvY2lhdGVkIHRvcC1sZXZlbCB0eXBlIHVzZWQgdG8KKyAqICAgIHRyYXAgaXQpIHRvIGBFdmVu dFBsdWdpbkh1YmAsIHdoaWNoIGluIHR1cm4gd2lsbCBhc2sgcGx1Z2lucyBpZiB0aGV5IHdhbnQK KyAqICAgIHRvIGV4dHJhY3QgYW55IHN5bnRoZXRpYyBldmVudHMuCisgKgorICogIC0gVGhlIGBF dmVudFBsdWdpbkh1YmAgd2lsbCB0aGVuIHByb2Nlc3MgZWFjaCBldmVudCBieSBhbm5vdGF0aW5n IHRoZW0gd2l0aAorICogICAgImRpc3BhdGNoZXMiLCBhIHNlcXVlbmNlIG9mIGxpc3RlbmVycyBh bmQgSURzIHRoYXQgY2FyZSBhYm91dCB0aGF0IGV2ZW50LgorICoKKyAqICAtIFRoZSBgRXZlbnRQ bHVnaW5IdWJgIHRoZW4gZGlzcGF0Y2hlcyB0aGUgZXZlbnRzLgorICoKKyAqIE92ZXJ2aWV3IG9m IFJlYWN0IGFuZCB0aGUgZXZlbnQgc3lzdGVtOgorICoKKyAqICstLS0tLS0tLS0tLS0rICAgIC4K KyAqIHwgICAgRE9NICAgICB8ICAgIC4KKyAqICstLS0tLS0tLS0tLS0rICAgIC4KKyAqICAgICAg IHwgICAgICAgICAgIC4KKyAqICAgICAgIHYgICAgICAgICAgIC4KKyAqICstLS0tLS0tLS0tLS0r ICAgIC4KKyAqIHwgUmVhY3RFdmVudCB8ICAgIC4KKyAqIHwgIExpc3RlbmVyICB8ICAgIC4KKyAq ICstLS0tLS0tLS0tLS0rICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0t KworICogICAgICAgfCAgICAgICAgICAgLiAgICAgICAgICAgICAgICstLS0tLS0tLSt8U2ltcGxl RXZlbnR8CisgKiAgICAgICB8ICAgICAgICAgICAuICAgICAgICAgICAgICAgfCAgICAgICAgIHxQ bHVnaW4gICAgIHwKKyAqICstLS0tLXwtLS0tLS0rICAgIC4gICAgICAgICAgICAgICB2ICAgICAg ICAgKy0tLS0tLS0tLS0tKworICogfCAgICAgfCAgICAgIHwgICAgLiAgICArLS0tLS0tLS0tLS0t LS0rICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tKworICogfCAgICAgKy0tLS0tLS0t LS0tLi0tLT58RXZlbnRQbHVnaW5IdWJ8ICAgICAgICAgICAgICAgICAgICB8ICAgIEV2ZW50ICAg fAorICogfCAgICAgICAgICAgIHwgICAgLiAgICB8ICAgICAgICAgICAgICB8ICAgICArLS0tLS0t LS0tLS0rICB8IFByb3BhZ2F0b3JzfAorICogfCBSZWFjdEV2ZW50IHwgICAgLiAgICB8ICAgICAg ICAgICAgICB8ICAgICB8VGFwRXZlbnQgICB8ICB8LS0tLS0tLS0tLS0tfAorICogfCAgRW1pdHRl ciAgIHwgICAgLiAgICB8ICAgICAgICAgICAgICB8PC0tLSt8UGx1Z2luICAgICB8ICB8b3RoZXIg cGx1Z2lufAorICogfCAgICAgICAgICAgIHwgICAgLiAgICB8ICAgICAgICAgICAgICB8ICAgICAr LS0tLS0tLS0tLS0rICB8ICB1dGlsaXRpZXMgfAorICogfCAgICAgKy0tLS0tLS0tLS0tLi0tLT58 ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tKworICogfCAg ICAgfCAgICAgIHwgICAgLiAgICArLS0tLS0tLS0tLS0tLS0rCisgKiArLS0tLS18LS0tLS0tKyAg ICAuICAgICAgICAgICAgICAgIF4gICAgICAgICstLS0tLS0tLS0tLSsKKyAqICAgICAgIHwgICAg ICAgICAgIC4gICAgICAgICAgICAgICAgfCAgICAgICAgfEVudGVyL0xlYXZlfAorICogICAgICAg KyAgICAgICAgICAgLiAgICAgICAgICAgICAgICArLS0tLS0tLSt8UGx1Z2luICAgICB8CisgKiAr LS0tLS0tLS0tLS0tLSsgICAuICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsK KyAqIHwgYXBwbGljYXRpb24gfCAgIC4KKyAqIHwtLS0tLS0tLS0tLS0tfCAgIC4KKyAqIHwgICAg ICAgICAgICAgfCAgIC4KKyAqIHwgICAgICAgICAgICAgfCAgIC4KKyAqICstLS0tLS0tLS0tLS0t KyAgIC4KKyAqICAgICAgICAgICAgICAgICAgIC4KKyAqICAgIFJlYWN0IENvcmUgICAgIC4gIEdl bmVyYWwgUHVycG9zZSBFdmVudCBQbHVnaW4gU3lzdGVtCisgKi8KKwordmFyIGhhc0V2ZW50UGFn ZVhZOwordmFyIGFscmVhZHlMaXN0ZW5pbmdUbyA9IHt9OwordmFyIGlzTW9uaXRvcmluZ1Njcm9s bFZhbHVlID0gZmFsc2U7Cit2YXIgcmVhY3RUb3BMaXN0ZW5lcnNDb3VudGVyID0gMDsKKworLy8g Rm9yIGV2ZW50cyBsaWtlICdzdWJtaXQnIHdoaWNoIGRvbid0IGNvbnNpc3RlbnRseSBidWJibGUg KHdoaWNoIHdlIHRyYXAgYXQgYQorLy8gbG93ZXIgbm9kZSB0aGFuIGBkb2N1bWVudGApLCBiaW5k aW5nIGF0IGBkb2N1bWVudGAgd291bGQgY2F1c2UgZHVwbGljYXRlCisvLyBldmVudHMgc28gd2Ug ZG9uJ3QgaW5jbHVkZSB0aGVtIGhlcmUKK3ZhciB0b3BFdmVudE1hcHBpbmcgPSB7CisgIHRvcEFi b3J0OiAnYWJvcnQnLAorICB0b3BBbmltYXRpb25FbmQ6IGdldFZlbmRvclByZWZpeGVkRXZlbnRO YW1lKCdhbmltYXRpb25lbmQnKSB8fCAnYW5pbWF0aW9uZW5kJywKKyAgdG9wQW5pbWF0aW9uSXRl cmF0aW9uOiBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uaXRlcmF0aW9uJykg fHwgJ2FuaW1hdGlvbml0ZXJhdGlvbicsCisgIHRvcEFuaW1hdGlvblN0YXJ0OiBnZXRWZW5kb3JQ cmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uc3RhcnQnKSB8fCAnYW5pbWF0aW9uc3RhcnQnLAor ICB0b3BCbHVyOiAnYmx1cicsCisgIHRvcENhblBsYXk6ICdjYW5wbGF5JywKKyAgdG9wQ2FuUGxh eVRocm91Z2g6ICdjYW5wbGF5dGhyb3VnaCcsCisgIHRvcENoYW5nZTogJ2NoYW5nZScsCisgIHRv cENsaWNrOiAnY2xpY2snLAorICB0b3BDb21wb3NpdGlvbkVuZDogJ2NvbXBvc2l0aW9uZW5kJywK KyAgdG9wQ29tcG9zaXRpb25TdGFydDogJ2NvbXBvc2l0aW9uc3RhcnQnLAorICB0b3BDb21wb3Np dGlvblVwZGF0ZTogJ2NvbXBvc2l0aW9udXBkYXRlJywKKyAgdG9wQ29udGV4dE1lbnU6ICdjb250 ZXh0bWVudScsCisgIHRvcENvcHk6ICdjb3B5JywKKyAgdG9wQ3V0OiAnY3V0JywKKyAgdG9wRG91 YmxlQ2xpY2s6ICdkYmxjbGljaycsCisgIHRvcERyYWc6ICdkcmFnJywKKyAgdG9wRHJhZ0VuZDog J2RyYWdlbmQnLAorICB0b3BEcmFnRW50ZXI6ICdkcmFnZW50ZXInLAorICB0b3BEcmFnRXhpdDog J2RyYWdleGl0JywKKyAgdG9wRHJhZ0xlYXZlOiAnZHJhZ2xlYXZlJywKKyAgdG9wRHJhZ092ZXI6 ICdkcmFnb3ZlcicsCisgIHRvcERyYWdTdGFydDogJ2RyYWdzdGFydCcsCisgIHRvcERyb3A6ICdk cm9wJywKKyAgdG9wRHVyYXRpb25DaGFuZ2U6ICdkdXJhdGlvbmNoYW5nZScsCisgIHRvcEVtcHRp ZWQ6ICdlbXB0aWVkJywKKyAgdG9wRW5jcnlwdGVkOiAnZW5jcnlwdGVkJywKKyAgdG9wRW5kZWQ6 ICdlbmRlZCcsCisgIHRvcEVycm9yOiAnZXJyb3InLAorICB0b3BGb2N1czogJ2ZvY3VzJywKKyAg dG9wSW5wdXQ6ICdpbnB1dCcsCisgIHRvcEtleURvd246ICdrZXlkb3duJywKKyAgdG9wS2V5UHJl c3M6ICdrZXlwcmVzcycsCisgIHRvcEtleVVwOiAna2V5dXAnLAorICB0b3BMb2FkZWREYXRhOiAn bG9hZGVkZGF0YScsCisgIHRvcExvYWRlZE1ldGFkYXRhOiAnbG9hZGVkbWV0YWRhdGEnLAorICB0 b3BMb2FkU3RhcnQ6ICdsb2Fkc3RhcnQnLAorICB0b3BNb3VzZURvd246ICdtb3VzZWRvd24nLAor ICB0b3BNb3VzZU1vdmU6ICdtb3VzZW1vdmUnLAorICB0b3BNb3VzZU91dDogJ21vdXNlb3V0JywK KyAgdG9wTW91c2VPdmVyOiAnbW91c2VvdmVyJywKKyAgdG9wTW91c2VVcDogJ21vdXNldXAnLAor ICB0b3BQYXN0ZTogJ3Bhc3RlJywKKyAgdG9wUGF1c2U6ICdwYXVzZScsCisgIHRvcFBsYXk6ICdw bGF5JywKKyAgdG9wUGxheWluZzogJ3BsYXlpbmcnLAorICB0b3BQcm9ncmVzczogJ3Byb2dyZXNz JywKKyAgdG9wUmF0ZUNoYW5nZTogJ3JhdGVjaGFuZ2UnLAorICB0b3BTY3JvbGw6ICdzY3JvbGwn LAorICB0b3BTZWVrZWQ6ICdzZWVrZWQnLAorICB0b3BTZWVraW5nOiAnc2Vla2luZycsCisgIHRv cFNlbGVjdGlvbkNoYW5nZTogJ3NlbGVjdGlvbmNoYW5nZScsCisgIHRvcFN0YWxsZWQ6ICdzdGFs bGVkJywKKyAgdG9wU3VzcGVuZDogJ3N1c3BlbmQnLAorICB0b3BUZXh0SW5wdXQ6ICd0ZXh0SW5w dXQnLAorICB0b3BUaW1lVXBkYXRlOiAndGltZXVwZGF0ZScsCisgIHRvcFRvdWNoQ2FuY2VsOiAn dG91Y2hjYW5jZWwnLAorICB0b3BUb3VjaEVuZDogJ3RvdWNoZW5kJywKKyAgdG9wVG91Y2hNb3Zl OiAndG91Y2htb3ZlJywKKyAgdG9wVG91Y2hTdGFydDogJ3RvdWNoc3RhcnQnLAorICB0b3BUcmFu c2l0aW9uRW5kOiBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgndHJhbnNpdGlvbmVuZCcpIHx8 ICd0cmFuc2l0aW9uZW5kJywKKyAgdG9wVm9sdW1lQ2hhbmdlOiAndm9sdW1lY2hhbmdlJywKKyAg dG9wV2FpdGluZzogJ3dhaXRpbmcnLAorICB0b3BXaGVlbDogJ3doZWVsJworfTsKKworLyoqCisg KiBUbyBlbnN1cmUgbm8gY29uZmxpY3RzIHdpdGggb3RoZXIgcG90ZW50aWFsIFJlYWN0IGluc3Rh bmNlcyBvbiB0aGUgcGFnZQorICovCit2YXIgdG9wTGlzdGVuZXJzSURLZXkgPSAnX3JlYWN0TGlz dGVuZXJzSUQnICsgU3RyaW5nKE1hdGgucmFuZG9tKCkpLnNsaWNlKDIpOworCitmdW5jdGlvbiBn ZXRMaXN0ZW5pbmdGb3JEb2N1bWVudChtb3VudEF0KSB7CisgIC8vIEluIElFOCwgYG1vdW50QXRg IGlzIGEgaG9zdCBvYmplY3QgYW5kIGRvZXNuJ3QgaGF2ZSBgaGFzT3duUHJvcGVydHlgCisgIC8v IGRpcmVjdGx5LgorICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCht b3VudEF0LCB0b3BMaXN0ZW5lcnNJREtleSkpIHsKKyAgICBtb3VudEF0W3RvcExpc3RlbmVyc0lE S2V5XSA9IHJlYWN0VG9wTGlzdGVuZXJzQ291bnRlcisrOworICAgIGFscmVhZHlMaXN0ZW5pbmdU b1ttb3VudEF0W3RvcExpc3RlbmVyc0lES2V5XV0gPSB7fTsKKyAgfQorICByZXR1cm4gYWxyZWFk eUxpc3RlbmluZ1RvW21vdW50QXRbdG9wTGlzdGVuZXJzSURLZXldXTsKK30KKworLyoqCisgKiBg UmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyYCBpcyB1c2VkIHRvIGF0dGFjaCB0b3AtbGV2ZWwgZXZl bnQgbGlzdGVuZXJzLiBGb3IKKyAqIGV4YW1wbGU6CisgKgorICogICBFdmVudFBsdWdpbkh1Yi5w dXRMaXN0ZW5lcignbXlJRCcsICdvbkNsaWNrJywgbXlGdW5jdGlvbik7CisgKgorICogVGhpcyB3 b3VsZCBhbGxvY2F0ZSBhICJyZWdpc3RyYXRpb24iIG9mIGAoJ29uQ2xpY2snLCBteUZ1bmN0aW9u KWAgb24gJ215SUQnLgorICoKKyAqIEBpbnRlcm5hbAorICovCit2YXIgUmVhY3RCcm93c2VyRXZl bnRFbWl0dGVyID0gX2Fzc2lnbih7fSwgUmVhY3RFdmVudEVtaXR0ZXJNaXhpbiwgeworCisgIC8q KgorICAgKiBJbmplY3RhYmxlIGV2ZW50IGJhY2tlbmQKKyAgICovCisgIFJlYWN0RXZlbnRMaXN0 ZW5lcjogbnVsbCwKKworICBpbmplY3Rpb246IHsKKyAgICAvKioKKyAgICAgKiBAcGFyYW0ge29i amVjdH0gUmVhY3RFdmVudExpc3RlbmVyCisgICAgICovCisgICAgaW5qZWN0UmVhY3RFdmVudExp c3RlbmVyOiBmdW5jdGlvbiAoUmVhY3RFdmVudExpc3RlbmVyKSB7CisgICAgICBSZWFjdEV2ZW50 TGlzdGVuZXIuc2V0SGFuZGxlVG9wTGV2ZWwoUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLmhhbmRs ZVRvcExldmVsKTsKKyAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlz dGVuZXIgPSBSZWFjdEV2ZW50TGlzdGVuZXI7CisgICAgfQorICB9LAorCisgIC8qKgorICAgKiBT ZXRzIHdoZXRoZXIgb3Igbm90IGFueSBjcmVhdGVkIGNhbGxiYWNrcyBzaG91bGQgYmUgZW5hYmxl ZC4KKyAgICoKKyAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkIFRydWUgaWYgY2FsbGJhY2tz IHNob3VsZCBiZSBlbmFibGVkLgorICAgKi8KKyAgc2V0RW5hYmxlZDogZnVuY3Rpb24gKGVuYWJs ZWQpIHsKKyAgICBpZiAoUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5l cikgeworICAgICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci5z ZXRFbmFibGVkKGVuYWJsZWQpOworICAgIH0KKyAgfSwKKworICAvKioKKyAgICogQHJldHVybiB7 Ym9vbGVhbn0gVHJ1ZSBpZiBjYWxsYmFja3MgYXJlIGVuYWJsZWQuCisgICAqLworICBpc0VuYWJs ZWQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gISEoUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVy LlJlYWN0RXZlbnRMaXN0ZW5lciAmJiBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVu dExpc3RlbmVyLmlzRW5hYmxlZCgpKTsKKyAgfSwKKworICAvKioKKyAgICogV2UgbGlzdGVuIGZv ciBidWJibGVkIHRvdWNoIGV2ZW50cyBvbiB0aGUgZG9jdW1lbnQgb2JqZWN0LgorICAgKgorICAg KiBGaXJlZm94IHY4LjAxIChhbmQgcG9zc2libHkgb3RoZXJzKSBleGhpYml0ZWQgc3RyYW5nZSBi ZWhhdmlvciB3aGVuCisgICAqIG1vdW50aW5nIGBvbm1vdXNlbW92ZWAgZXZlbnRzIGF0IHNvbWUg bm9kZSB0aGF0IHdhcyBub3QgdGhlIGRvY3VtZW50CisgICAqIGVsZW1lbnQuIFRoZSBzeW1wdG9t cyB3ZXJlIHRoYXQgaWYgeW91ciBtb3VzZSBpcyBub3QgbW92aW5nIG92ZXIgc29tZXRoaW5nCisg ICAqIGNvbnRhaW5lZCB3aXRoaW4gdGhhdCBtb3VudCBwb2ludCAoZm9yIGV4YW1wbGUgb24gdGhl IGJhY2tncm91bmQpIHRoZQorICAgKiB0b3AtbGV2ZWwgbGlzdGVuZXJzIGZvciBgb25tb3VzZW1v dmVgIHdvbid0IGJlIGNhbGxlZC4gSG93ZXZlciwgaWYgeW91CisgICAqIHJlZ2lzdGVyIHRoZSBg bW91c2Vtb3ZlYCBvbiB0aGUgZG9jdW1lbnQgb2JqZWN0LCB0aGVuIGl0IHdpbGwgb2YgY291cnNl CisgICAqIGNhdGNoIGFsbCBgbW91c2Vtb3ZlYHMuIFRoaXMgYWxvbmcgd2l0aCBpT1MgcXVpcmtz LCBqdXN0aWZpZXMgcmVzdHJpY3RpbmcKKyAgICogdG9wLWxldmVsIGxpc3RlbmVycyB0byB0aGUg ZG9jdW1lbnQgb2JqZWN0IG9ubHksIGF0IGxlYXN0IGZvciB0aGVzZQorICAgKiBtb3ZlbWVudCB0 eXBlcyBvZiBldmVudHMgYW5kIHBvc3NpYmx5IGFsbCBldmVudHMuCisgICAqCisgICAqIEBzZWUg aHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTAvMDkvY2xpY2tfZXZl bnRfZGVsLmh0bWwKKyAgICoKKyAgICogQWxzbywgYGtleXVwYC9ga2V5cHJlc3NgL2BrZXlkb3du YCBkbyBub3QgYnViYmxlIHRvIHRoZSB3aW5kb3cgb24gSUUsIGJ1dAorICAgKiB0aGV5IGJ1YmJs ZSB0byBkb2N1bWVudC4KKyAgICoKKyAgICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbk5h bWUgTmFtZSBvZiBsaXN0ZW5lciAoZS5nLiBgb25DbGlja2ApLgorICAgKiBAcGFyYW0ge29iamVj dH0gY29udGVudERvY3VtZW50SGFuZGxlIERvY3VtZW50IHdoaWNoIG93bnMgdGhlIGNvbnRhaW5l cgorICAgKi8KKyAgbGlzdGVuVG86IGZ1bmN0aW9uIChyZWdpc3RyYXRpb25OYW1lLCBjb250ZW50 RG9jdW1lbnRIYW5kbGUpIHsKKyAgICB2YXIgbW91bnRBdCA9IGNvbnRlbnREb2N1bWVudEhhbmRs ZTsKKyAgICB2YXIgaXNMaXN0ZW5pbmcgPSBnZXRMaXN0ZW5pbmdGb3JEb2N1bWVudChtb3VudEF0 KTsKKyAgICB2YXIgZGVwZW5kZW5jaWVzID0gRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRp b25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdOworCisgICAgZm9yICh2YXIgaSA9 IDA7IGkgPCBkZXBlbmRlbmNpZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciBkZXBlbmRlbmN5 ID0gZGVwZW5kZW5jaWVzW2ldOworICAgICAgaWYgKCEoaXNMaXN0ZW5pbmcuaGFzT3duUHJvcGVy dHkoZGVwZW5kZW5jeSkgJiYgaXNMaXN0ZW5pbmdbZGVwZW5kZW5jeV0pKSB7CisgICAgICAgIGlm IChkZXBlbmRlbmN5ID09PSAndG9wV2hlZWwnKSB7CisgICAgICAgICAgaWYgKGlzRXZlbnRTdXBw b3J0ZWQoJ3doZWVsJykpIHsKKyAgICAgICAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5S ZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wV2hlZWwnLCAnd2hlZWwnLCBt b3VudEF0KTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGlzRXZlbnRTdXBwb3J0ZWQoJ21vdXNld2hl ZWwnKSkgeworICAgICAgICAgICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRM aXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KCd0b3BXaGVlbCcsICdtb3VzZXdoZWVsJywgbW91bnRB dCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEZpcmVmb3ggbmVlZHMgdG8g Y2FwdHVyZSBhIGRpZmZlcmVudCBtb3VzZSBzY3JvbGwgZXZlbnQuCisgICAgICAgICAgICAvLyBA c2VlIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvZG9tL2V2ZW50cy90ZXN0cy9zY3JvbGwuaHRt bAorICAgICAgICAgICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5l ci50cmFwQnViYmxlZEV2ZW50KCd0b3BXaGVlbCcsICdET01Nb3VzZVNjcm9sbCcsIG1vdW50QXQp OworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChkZXBlbmRlbmN5ID09PSAndG9wU2Ny b2xsJykgeworCisgICAgICAgICAgaWYgKGlzRXZlbnRTdXBwb3J0ZWQoJ3Njcm9sbCcsIHRydWUp KSB7CisgICAgICAgICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3Rl bmVyLnRyYXBDYXB0dXJlZEV2ZW50KCd0b3BTY3JvbGwnLCAnc2Nyb2xsJywgbW91bnRBdCk7Cisg ICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5S ZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wU2Nyb2xsJywgJ3Njcm9sbCcs IFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIuV0lORE9XX0hBTkRM RSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGRlcGVuZGVuY3kgPT09ICd0b3BG b2N1cycgfHwgZGVwZW5kZW5jeSA9PT0gJ3RvcEJsdXInKSB7CisKKyAgICAgICAgICBpZiAoaXNF dmVudFN1cHBvcnRlZCgnZm9jdXMnLCB0cnVlKSkgeworICAgICAgICAgICAgUmVhY3RCcm93c2Vy RXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQ2FwdHVyZWRFdmVudCgndG9wRm9j dXMnLCAnZm9jdXMnLCBtb3VudEF0KTsKKyAgICAgICAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1p dHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcENhcHR1cmVkRXZlbnQoJ3RvcEJsdXInLCAnYmx1 cicsIG1vdW50QXQpOworICAgICAgICAgIH0gZWxzZSBpZiAoaXNFdmVudFN1cHBvcnRlZCgnZm9j dXNpbicpKSB7CisgICAgICAgICAgICAvLyBJRSBoYXMgYGZvY3VzaW5gIGFuZCBgZm9jdXNvdXRg IGV2ZW50cyB3aGljaCBidWJibGUuCisgICAgICAgICAgICAvLyBAc2VlIGh0dHA6Ly93d3cucXVp cmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDA4LzA0L2RlbGVnYXRpbmdfdGhlLmh0bWwKKyAg ICAgICAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJh cEJ1YmJsZWRFdmVudCgndG9wRm9jdXMnLCAnZm9jdXNpbicsIG1vdW50QXQpOworICAgICAgICAg ICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxl ZEV2ZW50KCd0b3BCbHVyJywgJ2ZvY3Vzb3V0JywgbW91bnRBdCk7CisgICAgICAgICAgfQorCisg ICAgICAgICAgLy8gdG8gbWFrZSBzdXJlIGJsdXIgYW5kIGZvY3VzIGV2ZW50IGxpc3RlbmVycyBh cmUgb25seSBhdHRhY2hlZCBvbmNlCisgICAgICAgICAgaXNMaXN0ZW5pbmcudG9wQmx1ciA9IHRy dWU7CisgICAgICAgICAgaXNMaXN0ZW5pbmcudG9wRm9jdXMgPSB0cnVlOworICAgICAgICB9IGVs c2UgaWYgKHRvcEV2ZW50TWFwcGluZy5oYXNPd25Qcm9wZXJ0eShkZXBlbmRlbmN5KSkgeworICAg ICAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1 YmJsZWRFdmVudChkZXBlbmRlbmN5LCB0b3BFdmVudE1hcHBpbmdbZGVwZW5kZW5jeV0sIG1vdW50 QXQpOworICAgICAgICB9CisKKyAgICAgICAgaXNMaXN0ZW5pbmdbZGVwZW5kZW5jeV0gPSB0cnVl OworICAgICAgfQorICAgIH0KKyAgfSwKKworICB0cmFwQnViYmxlZEV2ZW50OiBmdW5jdGlvbiAo dG9wTGV2ZWxUeXBlLCBoYW5kbGVyQmFzZU5hbWUsIGhhbmRsZSkgeworICAgIHJldHVybiBSZWFj dEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQo dG9wTGV2ZWxUeXBlLCBoYW5kbGVyQmFzZU5hbWUsIGhhbmRsZSk7CisgIH0sCisKKyAgdHJhcENh cHR1cmVkRXZlbnQ6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIGhhbmRsZXJCYXNlTmFtZSwgaGFu ZGxlKSB7CisgICAgcmV0dXJuIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlz dGVuZXIudHJhcENhcHR1cmVkRXZlbnQodG9wTGV2ZWxUeXBlLCBoYW5kbGVyQmFzZU5hbWUsIGhh bmRsZSk7CisgIH0sCisKKyAgLyoqCisgICAqIFByb3RlY3QgYWdhaW5zdCBkb2N1bWVudC5jcmVh dGVFdmVudCgpIHJldHVybmluZyBudWxsCisgICAqIFNvbWUgcG9wdXAgYmxvY2tlciBleHRlbnNp b25zIGFwcGVhciB0byBkbyB0aGlzOgorICAgKiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2sv cmVhY3QvaXNzdWVzLzY4ODcKKyAgICovCisgIHN1cHBvcnRzRXZlbnRQYWdlWFk6IGZ1bmN0aW9u ICgpIHsKKyAgICBpZiAoIWRvY3VtZW50LmNyZWF0ZUV2ZW50KSB7CisgICAgICByZXR1cm4gZmFs c2U7CisgICAgfQorICAgIHZhciBldiA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50 Jyk7CisgICAgcmV0dXJuIGV2ICE9IG51bGwgJiYgJ3BhZ2VYJyBpbiBldjsKKyAgfSwKKworICAv KioKKyAgICogTGlzdGVucyB0byB3aW5kb3cgc2Nyb2xsIGFuZCByZXNpemUgZXZlbnRzLiBXZSBj YWNoZSBzY3JvbGwgdmFsdWVzIHNvIHRoYXQKKyAgICogYXBwbGljYXRpb24gY29kZSBjYW4gYWNj ZXNzIHRoZW0gd2l0aG91dCB0cmlnZ2VyaW5nIHJlZmxvd3MuCisgICAqCisgICAqIFZpZXdwb3J0 TWV0cmljcyBpcyBvbmx5IHVzZWQgYnkgU3ludGhldGljTW91c2UvVG91Y2hFdmVudCBhbmQgb25s eSB3aGVuCisgICAqIHBhZ2VYL3BhZ2VZIGlzbid0IHN1cHBvcnRlZCAobGVnYWN5IGJyb3dzZXJz KS4KKyAgICoKKyAgICogTk9URTogU2Nyb2xsIGV2ZW50cyBkbyBub3QgYnViYmxlLgorICAgKgor ICAgKiBAc2VlIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvZG9tL2V2ZW50cy9zY3JvbGwuaHRt bAorICAgKi8KKyAgZW5zdXJlU2Nyb2xsVmFsdWVNb25pdG9yaW5nOiBmdW5jdGlvbiAoKSB7Cisg ICAgaWYgKGhhc0V2ZW50UGFnZVhZID09PSB1bmRlZmluZWQpIHsKKyAgICAgIGhhc0V2ZW50UGFn ZVhZID0gUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLnN1cHBvcnRzRXZlbnRQYWdlWFkoKTsKKyAg ICB9CisgICAgaWYgKCFoYXNFdmVudFBhZ2VYWSAmJiAhaXNNb25pdG9yaW5nU2Nyb2xsVmFsdWUp IHsKKyAgICAgIHZhciByZWZyZXNoID0gVmlld3BvcnRNZXRyaWNzLnJlZnJlc2hTY3JvbGxWYWx1 ZXM7CisgICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLm1v bml0b3JTY3JvbGxWYWx1ZShyZWZyZXNoKTsKKyAgICAgIGlzTW9uaXRvcmluZ1Njcm9sbFZhbHVl ID0gdHJ1ZTsKKyAgICB9CisgIH0KKworfSk7CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RCcm93 c2VyRXZlbnRFbWl0dGVyOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBh L3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdENoaWxkRmliZXIu anMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RDaGlsZEZp YmVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi5jNzhjNjM4MAotLS0g L2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9S ZWFjdENoaWxkRmliZXIuanMKQEAgLTAsMCArMSwyNDMgQEAKKy8qKgorICogQ29weXJpZ2h0IDIw MTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor ICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vu c2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9m IHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdo dHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5 LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFJFQUNUX0VMRU1FTlRfVFlQ RSA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50U3ltYm9sJyk7CisKK3ZhciBfcmVxdWlyZSA9IHJl cXVpcmUoJy4vUmVhY3RDb3JvdXRpbmUnKSwKKyAgICBSRUFDVF9DT1JPVVRJTkVfVFlQRSA9IF9y ZXF1aXJlLlJFQUNUX0NPUk9VVElORV9UWVBFLAorICAgIFJFQUNUX1lJRUxEX1RZUEUgPSBfcmVx dWlyZS5SRUFDVF9ZSUVMRF9UWVBFOworCit2YXIgUmVhY3RGaWJlciA9IHJlcXVpcmUoJy4vUmVh Y3RGaWJlcicpOwordmFyIFJlYWN0UmVpZmllZFlpZWxkID0gcmVxdWlyZSgnLi9SZWFjdFJlaWZp ZWRZaWVsZCcpOworCit2YXIgY2xvbmVGaWJlciA9IFJlYWN0RmliZXIuY2xvbmVGaWJlciwKKyAg ICBjcmVhdGVGaWJlckZyb21FbGVtZW50ID0gUmVhY3RGaWJlci5jcmVhdGVGaWJlckZyb21FbGVt ZW50LAorICAgIGNyZWF0ZUZpYmVyRnJvbUNvcm91dGluZSA9IFJlYWN0RmliZXIuY3JlYXRlRmli ZXJGcm9tQ29yb3V0aW5lLAorICAgIGNyZWF0ZUZpYmVyRnJvbVlpZWxkID0gUmVhY3RGaWJlci5j cmVhdGVGaWJlckZyb21ZaWVsZDsKK3ZhciBjcmVhdGVSZWlmaWVkWWllbGQgPSBSZWFjdFJlaWZp ZWRZaWVsZC5jcmVhdGVSZWlmaWVkWWllbGQ7CisKKwordmFyIGlzQXJyYXkgPSBBcnJheS5pc0Fy cmF5OworCitmdW5jdGlvbiBDaGlsZFJlY29uY2lsZXIoc2hvdWxkQ2xvbmUpIHsKKworICBmdW5j dGlvbiBjcmVhdGVTdWJzZXF1ZW50Q2hpbGQocmV0dXJuRmliZXIsIGV4aXN0aW5nQ2hpbGQsIHBy ZXZpb3VzU2libGluZywgbmV3Q2hpbGRyZW4sIHByaW9yaXR5KSB7CisgICAgaWYgKHR5cGVvZiBu ZXdDaGlsZHJlbiAhPT0gJ29iamVjdCcgfHwgbmV3Q2hpbGRyZW4gPT09IG51bGwpIHsKKyAgICAg IHJldHVybiBwcmV2aW91c1NpYmxpbmc7CisgICAgfQorCisgICAgc3dpdGNoIChuZXdDaGlsZHJl bi4kJHR5cGVvZikgeworICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6CisgICAgICAgIHsK KyAgICAgICAgICB2YXIgZWxlbWVudCA9IG5ld0NoaWxkcmVuOworICAgICAgICAgIGlmIChleGlz dGluZ0NoaWxkICYmIGVsZW1lbnQudHlwZSA9PT0gZXhpc3RpbmdDaGlsZC50eXBlICYmIGVsZW1l bnQua2V5ID09PSBleGlzdGluZ0NoaWxkLmtleSkgeworICAgICAgICAgICAgLy8gVE9ETzogVGhp cyBpcyBub3Qgc3VmZmljaWVudCBzaW5jZSBwcmV2aW91cyBzaWJsaW5ncyBjb3VsZCBiZSBuZXcu CisgICAgICAgICAgICAvLyBXaWxsIGZpeCByZWNvbmNpbGlhdGlvbiBwcm9wZXJseSBsYXRlci4K KyAgICAgICAgICAgIHZhciBjbG9uZSA9IHNob3VsZENsb25lID8gY2xvbmVGaWJlcihleGlzdGlu Z0NoaWxkLCBwcmlvcml0eSkgOiBleGlzdGluZ0NoaWxkOworICAgICAgICAgICAgaWYgKCFzaG91 bGRDbG9uZSkgeworICAgICAgICAgICAgICAvLyBUT0RPOiBUaGlzIG1pZ2h0IGJlIGxvd2VyaW5n IHRoZSBwcmlvcml0eSBvZiBuZXN0ZWQgdW5maW5pc2hlZCB3b3JrLgorICAgICAgICAgICAgICBj bG9uZS5wZW5kaW5nV29ya1ByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgICAgICAgICB9CisgICAg ICAgICAgICBjbG9uZS5wZW5kaW5nUHJvcHMgPSBlbGVtZW50LnByb3BzOworICAgICAgICAgICAg Y2xvbmUuc2libGluZyA9IG51bGw7CisgICAgICAgICAgICBjbG9uZVsncmV0dXJuJ10gPSByZXR1 cm5GaWJlcjsKKyAgICAgICAgICAgIHByZXZpb3VzU2libGluZy5zaWJsaW5nID0gY2xvbmU7Cisg ICAgICAgICAgICByZXR1cm4gY2xvbmU7CisgICAgICAgICAgfQorICAgICAgICAgIHZhciBjaGls ZCA9IGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQoZWxlbWVudCwgcHJpb3JpdHkpOworICAgICAgICAg IHByZXZpb3VzU2libGluZy5zaWJsaW5nID0gY2hpbGQ7CisgICAgICAgICAgY2hpbGRbJ3JldHVy biddID0gcmV0dXJuRmliZXI7CisgICAgICAgICAgcmV0dXJuIGNoaWxkOworICAgICAgICB9CisK KyAgICAgIGNhc2UgUkVBQ1RfQ09ST1VUSU5FX1RZUEU6CisgICAgICAgIHsKKyAgICAgICAgICB2 YXIgY29yb3V0aW5lID0gbmV3Q2hpbGRyZW47CisgICAgICAgICAgdmFyIF9jaGlsZCA9IGNyZWF0 ZUZpYmVyRnJvbUNvcm91dGluZShjb3JvdXRpbmUsIHByaW9yaXR5KTsKKyAgICAgICAgICBwcmV2 aW91c1NpYmxpbmcuc2libGluZyA9IF9jaGlsZDsKKyAgICAgICAgICBfY2hpbGRbJ3JldHVybidd ID0gcmV0dXJuRmliZXI7CisgICAgICAgICAgcmV0dXJuIF9jaGlsZDsKKyAgICAgICAgfQorCisg ICAgICBjYXNlIFJFQUNUX1lJRUxEX1RZUEU6CisgICAgICAgIHsKKyAgICAgICAgICB2YXIgeWll bGROb2RlID0gbmV3Q2hpbGRyZW47CisgICAgICAgICAgdmFyIHJlaWZpZWRZaWVsZCA9IGNyZWF0 ZVJlaWZpZWRZaWVsZCh5aWVsZE5vZGUpOworICAgICAgICAgIHZhciBfY2hpbGQyID0gY3JlYXRl RmliZXJGcm9tWWllbGQoeWllbGROb2RlLCBwcmlvcml0eSk7CisgICAgICAgICAgX2NoaWxkMi5v dXRwdXQgPSByZWlmaWVkWWllbGQ7CisgICAgICAgICAgcHJldmlvdXNTaWJsaW5nLnNpYmxpbmcg PSBfY2hpbGQyOworICAgICAgICAgIF9jaGlsZDJbJ3JldHVybiddID0gcmV0dXJuRmliZXI7Cisg ICAgICAgICAgcmV0dXJuIF9jaGlsZDI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaXNB cnJheShuZXdDaGlsZHJlbikpIHsKKyAgICAgIHZhciBwcmV2ID0gcHJldmlvdXNTaWJsaW5nOwor ICAgICAgdmFyIGV4aXN0aW5nID0gZXhpc3RpbmdDaGlsZDsKKyAgICAgIGZvciAodmFyIGkgPSAw OyBpIDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdmFyIG5leHRFeGlzdGlu ZyA9IGV4aXN0aW5nICYmIGV4aXN0aW5nLnNpYmxpbmc7CisgICAgICAgIHByZXYgPSBjcmVhdGVT dWJzZXF1ZW50Q2hpbGQocmV0dXJuRmliZXIsIGV4aXN0aW5nLCBwcmV2LCBuZXdDaGlsZHJlbltp XSwgcHJpb3JpdHkpOworICAgICAgICBpZiAocHJldiAmJiBleGlzdGluZykgeworICAgICAgICAg IC8vIFRPRE86IFRoaXMgaXMgbm90IGNvcnJlY3QgYmVjYXVzZSB0aGVyZSBjb3VsZCd2ZSBiZWVu IG1vcmUKKyAgICAgICAgICAvLyB0aGFuIG9uZSBzaWJsaW5nIGNvbnN1bWVkIGJ1dCBJIGRvbid0 IHdhbnQgdG8gcmV0dXJuIGEgdHVwbGUuCisgICAgICAgICAgZXhpc3RpbmcgPSBuZXh0RXhpc3Rp bmc7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBwcmV2OworICAgIH0gZWxzZSB7 CisgICAgICAvLyBUT0RPOiBUaHJvdyBmb3IgdW5rbm93biBjaGlsZHJlbi4KKyAgICAgIHJldHVy biBwcmV2aW91c1NpYmxpbmc7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gY3JlYXRlRmlyc3RD aGlsZChyZXR1cm5GaWJlciwgZXhpc3RpbmdDaGlsZCwgbmV3Q2hpbGRyZW4sIHByaW9yaXR5KSB7 CisgICAgaWYgKHR5cGVvZiBuZXdDaGlsZHJlbiAhPT0gJ29iamVjdCcgfHwgbmV3Q2hpbGRyZW4g PT09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHN3aXRjaCAobmV3 Q2hpbGRyZW4uJCR0eXBlb2YpIHsKKyAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOgorICAg ICAgICB7CisgICAgICAgICAgLyogJEZsb3dGaXhNZSg+PTAuMzEuMCk6IFRoaXMgaXMgYW4gdW5z YWZlIGNhc3QuIENvbnNpZGVyIGFkZGluZyBhIHR5cGUKKyAgICAgICAgICAgKiAgICAgICAgICAg ICAgICAgICAgICAgYW5ub3RhdGlvbiB0byB0aGUgYG5ld0NoaWxkcmVuYCBwYXJhbSBvZiB0aGlz CisgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLgorICAgICAgICAg ICAqLworICAgICAgICAgIHZhciBlbGVtZW50ID0gbmV3Q2hpbGRyZW47CisgICAgICAgICAgaWYg KGV4aXN0aW5nQ2hpbGQgJiYgZWxlbWVudC50eXBlID09PSBleGlzdGluZ0NoaWxkLnR5cGUgJiYg ZWxlbWVudC5rZXkgPT09IGV4aXN0aW5nQ2hpbGQua2V5KSB7CisgICAgICAgICAgICAvLyBHZXQg dGhlIGNsb25lIG9mIHRoZSBleGlzdGluZyBmaWJlci4KKyAgICAgICAgICAgIHZhciBjbG9uZSA9 IHNob3VsZENsb25lID8gY2xvbmVGaWJlcihleGlzdGluZ0NoaWxkLCBwcmlvcml0eSkgOiBleGlz dGluZ0NoaWxkOworICAgICAgICAgICAgaWYgKCFzaG91bGRDbG9uZSkgeworICAgICAgICAgICAg ICAvLyBUT0RPOiBUaGlzIG1pZ2h0IGJlIGxvd2VyaW5nIHRoZSBwcmlvcml0eSBvZiBuZXN0ZWQg dW5maW5pc2hlZCB3b3JrLgorICAgICAgICAgICAgICBjbG9uZS5wZW5kaW5nV29ya1ByaW9yaXR5 ID0gcHJpb3JpdHk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbG9uZS5wZW5kaW5nUHJv cHMgPSBlbGVtZW50LnByb3BzOworICAgICAgICAgICAgY2xvbmUuc2libGluZyA9IG51bGw7Cisg ICAgICAgICAgICBjbG9uZVsncmV0dXJuJ10gPSByZXR1cm5GaWJlcjsKKyAgICAgICAgICAgIHJl dHVybiBjbG9uZTsKKyAgICAgICAgICB9CisgICAgICAgICAgdmFyIGNoaWxkID0gY3JlYXRlRmli ZXJGcm9tRWxlbWVudChlbGVtZW50LCBwcmlvcml0eSk7CisgICAgICAgICAgY2hpbGRbJ3JldHVy biddID0gcmV0dXJuRmliZXI7CisgICAgICAgICAgcmV0dXJuIGNoaWxkOworICAgICAgICB9CisK KyAgICAgIGNhc2UgUkVBQ1RfQ09ST1VUSU5FX1RZUEU6CisgICAgICAgIHsKKyAgICAgICAgICAv KiAkRmxvd0ZpeE1lKD49MC4zMS4wKTogTm8gJ2hhbmRsZXInIHByb3BlcnR5IGZvdW5kIGluIG9i amVjdCB0eXBlCisgICAgICAgICAgICovCisgICAgICAgICAgdmFyIGNvcm91dGluZSA9IG5ld0No aWxkcmVuOworICAgICAgICAgIHZhciBfY2hpbGQzID0gY3JlYXRlRmliZXJGcm9tQ29yb3V0aW5l KGNvcm91dGluZSwgcHJpb3JpdHkpOworICAgICAgICAgIF9jaGlsZDNbJ3JldHVybiddID0gcmV0 dXJuRmliZXI7CisgICAgICAgICAgcmV0dXJuIF9jaGlsZDM7CisgICAgICAgIH0KKworICAgICAg Y2FzZSBSRUFDVF9ZSUVMRF9UWVBFOgorICAgICAgICB7CisgICAgICAgICAgLy8gQSB5aWVsZCBy ZXN1bHRzIGluIGEgZnJhZ21lbnQgZmliZXIgd2hvc2Ugb3V0cHV0IGlzIHRoZSBjb250aW51YXRp b24uCisgICAgICAgICAgLy8gVE9ETzogV2hlbiB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIGNoaWxk LCB3ZSBjYW4gb3B0aW1pemUgdGhpcyB0byBhdm9pZAorICAgICAgICAgIC8vIHRoZSBmcmFnbWVu dC4KKyAgICAgICAgICAvKiAkRmxvd0ZpeE1lKD49MC4zMS4wKTogTm8gJ2NvbnRpbnVhdGlvbicg cHJvcGVydHkgZm91bmQgaW4gb2JqZWN0CisgICAgICAgICAgICogdHlwZQorICAgICAgICAgICAq LworICAgICAgICAgIHZhciB5aWVsZE5vZGUgPSBuZXdDaGlsZHJlbjsKKyAgICAgICAgICB2YXIg cmVpZmllZFlpZWxkID0gY3JlYXRlUmVpZmllZFlpZWxkKHlpZWxkTm9kZSk7CisgICAgICAgICAg dmFyIF9jaGlsZDQgPSBjcmVhdGVGaWJlckZyb21ZaWVsZCh5aWVsZE5vZGUsIHByaW9yaXR5KTsK KyAgICAgICAgICBfY2hpbGQ0Lm91dHB1dCA9IHJlaWZpZWRZaWVsZDsKKyAgICAgICAgICBfY2hp bGQ0WydyZXR1cm4nXSA9IHJldHVybkZpYmVyOworICAgICAgICAgIHJldHVybiBfY2hpbGQ0Owor ICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGlzQXJyYXkobmV3Q2hpbGRyZW4pKSB7CisgICAg ICB2YXIgZmlyc3QgPSBudWxsOworICAgICAgdmFyIHByZXYgPSBudWxsOworICAgICAgdmFyIGV4 aXN0aW5nID0gZXhpc3RpbmdDaGlsZDsKKyAgICAgIC8qICRGbG93SXNzdWUoPj0wLjMxLjApICMx Mjc0NzcwOQorICAgICAgICoKKyAgICAgICAqIGBBcnJheS5pc0FycmF5YCBpcyBtYXRjaGVkIHN5 bnRhY3RpY2FsbHkgZm9yIG5vdyB1bnRpbCBwcmVkaWNhdGUKKyAgICAgICAqIHN1cHBvcnQgaXMg Y29tcGxldGUuCisgICAgICAgKi8KKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3Q2hpbGRy ZW4ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdmFyIG5leHRFeGlzdGluZyA9IGV4aXN0aW5nICYm IGV4aXN0aW5nLnNpYmxpbmc7CisgICAgICAgIGlmIChwcmV2ID09IG51bGwpIHsKKyAgICAgICAg ICBwcmV2ID0gY3JlYXRlRmlyc3RDaGlsZChyZXR1cm5GaWJlciwgZXhpc3RpbmcsIG5ld0NoaWxk cmVuW2ldLCBwcmlvcml0eSk7CisgICAgICAgICAgZmlyc3QgPSBwcmV2OworICAgICAgICB9IGVs c2UgeworICAgICAgICAgIHByZXYgPSBjcmVhdGVTdWJzZXF1ZW50Q2hpbGQocmV0dXJuRmliZXIs IGV4aXN0aW5nLCBwcmV2LCBuZXdDaGlsZHJlbltpXSwgcHJpb3JpdHkpOworICAgICAgICB9Cisg ICAgICAgIGlmIChwcmV2ICYmIGV4aXN0aW5nKSB7CisgICAgICAgICAgLy8gVE9ETzogVGhpcyBp cyBub3QgY29ycmVjdCBiZWNhdXNlIHRoZXJlIGNvdWxkJ3ZlIGJlZW4gbW9yZQorICAgICAgICAg IC8vIHRoYW4gb25lIHNpYmxpbmcgY29uc3VtZWQgYnV0IEkgZG9uJ3Qgd2FudCB0byByZXR1cm4g YSB0dXBsZS4KKyAgICAgICAgICBleGlzdGluZyA9IG5leHRFeGlzdGluZzsKKyAgICAgICAgfQor ICAgICAgfQorICAgICAgcmV0dXJuIGZpcnN0OworICAgIH0gZWxzZSB7CisgICAgICAvLyBUT0RP OiBUaHJvdyBmb3IgdW5rbm93biBjaGlsZHJlbi4KKyAgICAgIHJldHVybiBudWxsOworICAgIH0K KyAgfQorCisgIC8vIFRPRE86IFRoaXMgQVBJIHdvbid0IHdvcmsgYmVjYXVzZSB3ZSdsbCBuZWVk IHRvIHRyYW5zZmVyIHRoZSBzaWRlLWVmZmVjdHMgb2YKKyAgLy8gdW5tb3VudGluZyBjaGlsZHJl biB0byB0aGUgcmV0dXJuRmliZXIuCisgIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkRmliZXJzKHJl dHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGRyZW4sIHByaW9yaXR5KSB7Cisg ICAgcmV0dXJuIGNyZWF0ZUZpcnN0Q2hpbGQocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxk LCBuZXdDaGlsZHJlbiwgcHJpb3JpdHkpOworICB9CisKKyAgcmV0dXJuIHJlY29uY2lsZUNoaWxk RmliZXJzOworfQorCitleHBvcnRzLnJlY29uY2lsZUNoaWxkRmliZXJzID0gQ2hpbGRSZWNvbmNp bGVyKHRydWUpOworCitleHBvcnRzLnJlY29uY2lsZUNoaWxkRmliZXJzSW5QbGFjZSA9IENoaWxk UmVjb25jaWxlcihmYWxzZSk7CisKK2Z1bmN0aW9uIGNsb25lU2libGluZ3MoY3VycmVudCwgd29y a0luUHJvZ3Jlc3MsIHJldHVybkZpYmVyKSB7CisgIHdvcmtJblByb2dyZXNzWydyZXR1cm4nXSA9 IHJldHVybkZpYmVyOworICB3aGlsZSAoY3VycmVudC5zaWJsaW5nKSB7CisgICAgY3VycmVudCA9 IGN1cnJlbnQuc2libGluZzsKKyAgICB3b3JrSW5Qcm9ncmVzcyA9IHdvcmtJblByb2dyZXNzLnNp YmxpbmcgPSBjbG9uZUZpYmVyKGN1cnJlbnQsIGN1cnJlbnQucGVuZGluZ1dvcmtQcmlvcml0eSk7 CisgICAgd29ya0luUHJvZ3Jlc3NbJ3JldHVybiddID0gcmV0dXJuRmliZXI7CisgIH0KKyAgd29y a0luUHJvZ3Jlc3Muc2libGluZyA9IG51bGw7Cit9CisKK2V4cG9ydHMuY2xvbmVDaGlsZEZpYmVy cyA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykgeworICBpZiAoIXdvcmtJblBy b2dyZXNzLmNoaWxkKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChjdXJyZW50ICYmIHdvcmtJ blByb2dyZXNzLmNoaWxkID09PSBjdXJyZW50LmNoaWxkKSB7CisgICAgLy8gV2UgdXNlIHdvcmtJ blByb2dyZXNzLmNoaWxkIHNpbmNlIHRoYXQgbGV0cyBGbG93IGtub3cgdGhhdCBpdCBjYW4ndCBi ZQorICAgIC8vIG51bGwgc2luY2Ugd2UgdmFsaWRhdGVkIHRoYXQgYWxyZWFkeS4gSG93ZXZlciwg YXMgdGhlIGxpbmUgYWJvdmUgc3VnZ2VzdHMKKyAgICAvLyB0aGV5J3JlIGFjdHVhbGx5IHRoZSBz YW1lIHRoaW5nLgorICAgIHZhciBjdXJyZW50Q2hpbGQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDsK KyAgICAvLyBUT0RPOiBUaGlzIHVzZWQgdG8gcmVzZXQgdGhlIHBlbmRpbmcgcHJpb3JpdHkuIE5v dCBzdXJlIGlmIHRoYXQgaXMgbmVlZGVkLgorICAgIC8vIHdvcmtJblByb2dyZXNzLnBlbmRpbmdX b3JrUHJpb3JpdHkgPSBjdXJyZW50LnBlbmRpbmdXb3JrUHJpb3JpdHk7CisgICAgLy8gVE9ETzog VGhlIGJlbG93IHByaW9yaXR5IHVzZWQgdG8gYmUgc2V0IHRvIE5vV29yayB3aGljaCB3b3VsZCd2 ZQorICAgIC8vIGRyb3BwZWQgd29yay4gVGhpcyBpcyBjdXJyZW50bHkgdW5vYnNlcnZhYmxlIGJ1 dCB3aWxsIGJlY29tZQorICAgIC8vIG9ic2VydmFibGUgd2hlbiB0aGUgZmlyc3Qgc2libGluZyBo YXMgbG93ZXIgcHJpb3JpdHkgd29yayByZW1haW5pbmcKKyAgICAvLyB0aGFuIHRoZSBuZXh0IHNp YmxpbmcuIEF0IHRoYXQgcG9pbnQgd2Ugc2hvdWxkIGFkZCB0ZXN0cyB0aGF0IGNhdGNoZXMKKyAg ICAvLyB0aGlzLgorICAgIHZhciBuZXdDaGlsZCA9IGNsb25lRmliZXIoY3VycmVudENoaWxkLCBj dXJyZW50Q2hpbGQucGVuZGluZ1dvcmtQcmlvcml0eSk7CisgICAgd29ya0luUHJvZ3Jlc3MuY2hp bGQgPSBuZXdDaGlsZDsKKyAgICBjbG9uZVNpYmxpbmdzKGN1cnJlbnRDaGlsZCwgbmV3Q2hpbGQs IHdvcmtJblByb2dyZXNzKTsKKyAgfQorCisgIC8vIElmIHRoZXJlIGlzIG5vIGFsdGVybmF0ZSwg dGhlbiB3ZSBkb24ndCBuZWVkIHRvIGNsb25lIHRoZSBjaGlsZHJlbi4KKyAgLy8gSWYgdGhlIGNo aWxkcmVuIG9mIHRoZSBhbHRlcm5hdGUgZmliZXIgaXMgYSBkaWZmZXJlbnQgc2V0LCB0aGVuIHdl IGRvbid0CisgIC8vIG5lZWQgdG8gY2xvbmUuIFdlIG5lZWQgdG8gcmVzZXQgdGhlIHJldHVybiBm aWJlciB0aG91Z2ggc2luY2Ugd2UnbGwKKyAgLy8gdHJhdmVyc2UgZG93biBpbnRvIHRoZW0uCisg IHZhciBjaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkOworICB3aGlsZSAoY2hpbGQpIHsKKyAg ICBjaGlsZFsncmV0dXJuJ10gPSB3b3JrSW5Qcm9ncmVzczsKKyAgICBjaGlsZCA9IGNoaWxkLnNp Ymxpbmc7CisgIH0KK307ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEv d2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0Q2hpbGRSZWNvbmNp bGVyLmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0Q2hp bGRSZWNvbmNpbGVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi5jZjM3 YmQ2MwotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3Qt ZG9tL2xpYi9SZWFjdENoaWxkUmVjb25jaWxlci5qcwpAQCAtMCwwICsxLDE1MyBAQAorLyoqCisg KiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyBy ZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBC U0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9v dCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICog b2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUg c2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFJlYWN0UmVj b25jaWxlciA9IHJlcXVpcmUoJy4vUmVhY3RSZWNvbmNpbGVyJyk7CisKK3ZhciBpbnN0YW50aWF0 ZVJlYWN0Q29tcG9uZW50ID0gcmVxdWlyZSgnLi9pbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50Jyk7 Cit2YXIgS2V5RXNjYXBlVXRpbHMgPSByZXF1aXJlKCcuL0tleUVzY2FwZVV0aWxzJyk7Cit2YXIg c2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQgPSByZXF1aXJlKCcuL3Nob3VsZFVwZGF0ZVJlYWN0 Q29tcG9uZW50Jyk7Cit2YXIgdHJhdmVyc2VBbGxDaGlsZHJlbiA9IHJlcXVpcmUoJy4vdHJhdmVy c2VBbGxDaGlsZHJlbicpOwordmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5n Jyk7CisKK3ZhciBSZWFjdENvbXBvbmVudFRyZWVIb29rOworCitpZiAodHlwZW9mIHByb2Nlc3Mg IT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MuZW52ICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WID09 PSAndGVzdCcpIHsKKyAgLy8gVGVtcG9yYXJ5IGhhY2suCisgIC8vIElubGluZSByZXF1aXJlcyBk b24ndCB3b3JrIHdlbGwgd2l0aCBKZXN0OgorICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJv b2svcmVhY3QvaXNzdWVzLzcyNDAKKyAgLy8gUmVtb3ZlIHRoZSBpbmxpbmUgcmVxdWlyZXMgd2hl biB3ZSBkb24ndCBuZWVkIHRoZW0gYW55bW9yZToKKyAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zh Y2Vib29rL3JlYWN0L3B1bGwvNzE3OAorICBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWly ZSgncmVhY3QvbGliL1JlYWN0Q29tcG9uZW50VHJlZUhvb2snKTsKK30KKworZnVuY3Rpb24gaW5z dGFudGlhdGVDaGlsZChjaGlsZEluc3RhbmNlcywgY2hpbGQsIG5hbWUsIHNlbGZEZWJ1Z0lEKSB7 CisgIC8vIFdlIGZvdW5kIGEgY29tcG9uZW50IGluc3RhbmNlLgorICB2YXIga2V5VW5pcXVlID0g Y2hpbGRJbnN0YW5jZXNbbmFtZV0gPT09IHVuZGVmaW5lZDsKKyAgaWYgKHByb2Nlc3MuZW52Lk5P REVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICBpZiAoIVJlYWN0Q29tcG9uZW50VHJlZUhv b2spIHsKKyAgICAgIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSByZXF1aXJlKCdyZWFjdC9saWIv UmVhY3RDb21wb25lbnRUcmVlSG9vaycpOworICAgIH0KKyAgICBpZiAoIWtleVVuaXF1ZSkgewor ICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFs c2UsICdmbGF0dGVuQ2hpbGRyZW4oLi4uKTogRW5jb3VudGVyZWQgdHdvIGNoaWxkcmVuIHdpdGgg dGhlIHNhbWUga2V5LCAnICsgJ2Alc2AuIENoaWxkIGtleXMgbXVzdCBiZSB1bmlxdWU7IHdoZW4g dHdvIGNoaWxkcmVuIHNoYXJlIGEga2V5LCBvbmx5ICcgKyAndGhlIGZpcnN0IGNoaWxkIHdpbGwg YmUgdXNlZC4lcycsIEtleUVzY2FwZVV0aWxzLnVuZXNjYXBlKG5hbWUpLCBSZWFjdENvbXBvbmVu dFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKHNlbGZEZWJ1Z0lEKSkgOiB2b2lkIDA7Cisg ICAgfQorICB9CisgIGlmIChjaGlsZCAhPSBudWxsICYmIGtleVVuaXF1ZSkgeworICAgIGNoaWxk SW5zdGFuY2VzW25hbWVdID0gaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudChjaGlsZCwgdHJ1ZSk7 CisgIH0KK30KKworLyoqCisgKiBSZWFjdENoaWxkUmVjb25jaWxlciBwcm92aWRlcyBoZWxwZXJz IGZvciBpbml0aWFsaXppbmcgb3IgdXBkYXRpbmcgYSBzZXQgb2YKKyAqIGNoaWxkcmVuLiBJdHMg b3V0cHV0IGlzIHN1aXRhYmxlIGZvciBwYXNzaW5nIGl0IG9udG8gUmVhY3RNdWx0aUNoaWxkIHdo aWNoCisgKiBkb2VzIGRpZmZlZCByZW9yZGVyaW5nIGFuZCBpbnNlcnRpb24uCisgKi8KK3ZhciBS ZWFjdENoaWxkUmVjb25jaWxlciA9IHsKKyAgLyoqCisgICAqIEdlbmVyYXRlcyBhICJtb3VudCBp bWFnZSIgZm9yIGVhY2ggb2YgdGhlIHN1cHBsaWVkIGNoaWxkcmVuLiBJbiB0aGUgY2FzZQorICAg KiBvZiBgUmVhY3RET01Db21wb25lbnRgLCBhIG1vdW50IGltYWdlIGlzIGEgc3RyaW5nIG9mIG1h cmt1cC4KKyAgICoKKyAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXN0ZWRDaGlsZE5vZGVzIE5lc3Rl ZCBjaGlsZCBtYXBzLgorICAgKiBAcmV0dXJuIHs/b2JqZWN0fSBBIHNldCBvZiBjaGlsZCBpbnN0 YW5jZXMuCisgICAqIEBpbnRlcm5hbAorICAgKi8KKyAgaW5zdGFudGlhdGVDaGlsZHJlbjogZnVu Y3Rpb24gKG5lc3RlZENoaWxkTm9kZXMsIHRyYW5zYWN0aW9uLCBjb250ZXh0LCBzZWxmRGVidWdJ RCAvLyAwIGluIHByb2R1Y3Rpb24gYW5kIGZvciByb290cworICApIHsKKyAgICBpZiAobmVzdGVk Q2hpbGROb2RlcyA9PSBudWxsKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgdmFy IGNoaWxkSW5zdGFuY2VzID0ge307CisKKyAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09 ICdwcm9kdWN0aW9uJykgeworICAgICAgdHJhdmVyc2VBbGxDaGlsZHJlbihuZXN0ZWRDaGlsZE5v ZGVzLCBmdW5jdGlvbiAoY2hpbGRJbnN0cywgY2hpbGQsIG5hbWUpIHsKKyAgICAgICAgcmV0dXJu IGluc3RhbnRpYXRlQ2hpbGQoY2hpbGRJbnN0cywgY2hpbGQsIG5hbWUsIHNlbGZEZWJ1Z0lEKTsK KyAgICAgIH0sIGNoaWxkSW5zdGFuY2VzKTsKKyAgICB9IGVsc2UgeworICAgICAgdHJhdmVyc2VB bGxDaGlsZHJlbihuZXN0ZWRDaGlsZE5vZGVzLCBpbnN0YW50aWF0ZUNoaWxkLCBjaGlsZEluc3Rh bmNlcyk7CisgICAgfQorICAgIHJldHVybiBjaGlsZEluc3RhbmNlczsKKyAgfSwKKworICAvKioK KyAgICogVXBkYXRlcyB0aGUgcmVuZGVyZWQgY2hpbGRyZW4gYW5kIHJldHVybnMgYSBuZXcgc2V0 IG9mIGNoaWxkcmVuLgorICAgKgorICAgKiBAcGFyYW0gez9vYmplY3R9IHByZXZDaGlsZHJlbiBQ cmV2aW91c2x5IGluaXRpYWxpemVkIHNldCBvZiBjaGlsZHJlbi4KKyAgICogQHBhcmFtIHs/b2Jq ZWN0fSBuZXh0Q2hpbGRyZW4gRmxhdCBjaGlsZCBlbGVtZW50IG1hcHMuCisgICAqIEBwYXJhbSB7 UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24KKyAgICogQHBhcmFtIHtvYmpl Y3R9IGNvbnRleHQKKyAgICogQHJldHVybiB7P29iamVjdH0gQSBuZXcgc2V0IG9mIGNoaWxkIGlu c3RhbmNlcy4KKyAgICogQGludGVybmFsCisgICAqLworICB1cGRhdGVDaGlsZHJlbjogZnVuY3Rp b24gKHByZXZDaGlsZHJlbiwgbmV4dENoaWxkcmVuLCBtb3VudEltYWdlcywgcmVtb3ZlZE5vZGVz LCB0cmFuc2FjdGlvbiwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIGNvbnRleHQsIHNl bGZEZWJ1Z0lEIC8vIDAgaW4gcHJvZHVjdGlvbiBhbmQgZm9yIHJvb3RzCisgICkgeworICAgIC8v IFdlIGN1cnJlbnRseSBkb24ndCBoYXZlIGEgd2F5IHRvIHRyYWNrIG1vdmVzIGhlcmUgYnV0IGlm IHdlIHVzZSBpdGVyYXRvcnMKKyAgICAvLyBpbnN0ZWFkIG9mIGZvci4uaW4gd2UgY2FuIHppcCB0 aGUgaXRlcmF0b3JzIGFuZCBjaGVjayBpZiBhbiBpdGVtIGhhcworICAgIC8vIG1vdmVkLgorICAg IC8vIFRPRE86IElmIG5vdGhpbmcgaGFzIGNoYW5nZWQsIHJldHVybiB0aGUgcHJldkNoaWxkcmVu IG9iamVjdCBzbyB0aGF0IHdlCisgICAgLy8gY2FuIHF1aWNrbHkgYmFpbG91dCBpZiBub3RoaW5n IGhhcyBjaGFuZ2VkLgorICAgIGlmICghbmV4dENoaWxkcmVuICYmICFwcmV2Q2hpbGRyZW4pIHsK KyAgICAgIHJldHVybjsKKyAgICB9CisgICAgdmFyIG5hbWU7CisgICAgdmFyIHByZXZDaGlsZDsK KyAgICBmb3IgKG5hbWUgaW4gbmV4dENoaWxkcmVuKSB7CisgICAgICBpZiAoIW5leHRDaGlsZHJl bi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAg ICAgIHByZXZDaGlsZCA9IHByZXZDaGlsZHJlbiAmJiBwcmV2Q2hpbGRyZW5bbmFtZV07CisgICAg ICB2YXIgcHJldkVsZW1lbnQgPSBwcmV2Q2hpbGQgJiYgcHJldkNoaWxkLl9jdXJyZW50RWxlbWVu dDsKKyAgICAgIHZhciBuZXh0RWxlbWVudCA9IG5leHRDaGlsZHJlbltuYW1lXTsKKyAgICAgIGlm IChwcmV2Q2hpbGQgIT0gbnVsbCAmJiBzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudChwcmV2RWxl bWVudCwgbmV4dEVsZW1lbnQpKSB7CisgICAgICAgIFJlYWN0UmVjb25jaWxlci5yZWNlaXZlQ29t cG9uZW50KHByZXZDaGlsZCwgbmV4dEVsZW1lbnQsIHRyYW5zYWN0aW9uLCBjb250ZXh0KTsKKyAg ICAgICAgbmV4dENoaWxkcmVuW25hbWVdID0gcHJldkNoaWxkOworICAgICAgfSBlbHNlIHsKKyAg ICAgICAgaWYgKHByZXZDaGlsZCkgeworICAgICAgICAgIHJlbW92ZWROb2Rlc1tuYW1lXSA9IFJl YWN0UmVjb25jaWxlci5nZXRIb3N0Tm9kZShwcmV2Q2hpbGQpOworICAgICAgICAgIFJlYWN0UmVj b25jaWxlci51bm1vdW50Q29tcG9uZW50KHByZXZDaGlsZCwgZmFsc2UpOworICAgICAgICB9Cisg ICAgICAgIC8vIFRoZSBjaGlsZCBtdXN0IGJlIGluc3RhbnRpYXRlZCBiZWZvcmUgaXQncyBtb3Vu dGVkLgorICAgICAgICB2YXIgbmV4dENoaWxkSW5zdGFuY2UgPSBpbnN0YW50aWF0ZVJlYWN0Q29t cG9uZW50KG5leHRFbGVtZW50LCB0cnVlKTsKKyAgICAgICAgbmV4dENoaWxkcmVuW25hbWVdID0g bmV4dENoaWxkSW5zdGFuY2U7CisgICAgICAgIC8vIENyZWF0aW5nIG1vdW50IGltYWdlIG5vdyBl bnN1cmVzIHJlZnMgYXJlIHJlc29sdmVkIGluIHJpZ2h0IG9yZGVyCisgICAgICAgIC8vIChzZWUg aHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNzEwMSBmb3IgZXhwbGFuYXRp b24pLgorICAgICAgICB2YXIgbmV4dENoaWxkTW91bnRJbWFnZSA9IFJlYWN0UmVjb25jaWxlci5t b3VudENvbXBvbmVudChuZXh0Q2hpbGRJbnN0YW5jZSwgdHJhbnNhY3Rpb24sIGhvc3RQYXJlbnQs IGhvc3RDb250YWluZXJJbmZvLCBjb250ZXh0LCBzZWxmRGVidWdJRCk7CisgICAgICAgIG1vdW50 SW1hZ2VzLnB1c2gobmV4dENoaWxkTW91bnRJbWFnZSk7CisgICAgICB9CisgICAgfQorICAgIC8v IFVubW91bnQgY2hpbGRyZW4gdGhhdCBhcmUgbm8gbG9uZ2VyIHByZXNlbnQuCisgICAgZm9yIChu YW1lIGluIHByZXZDaGlsZHJlbikgeworICAgICAgaWYgKHByZXZDaGlsZHJlbi5oYXNPd25Qcm9w ZXJ0eShuYW1lKSAmJiAhKG5leHRDaGlsZHJlbiAmJiBuZXh0Q2hpbGRyZW4uaGFzT3duUHJvcGVy dHkobmFtZSkpKSB7CisgICAgICAgIHByZXZDaGlsZCA9IHByZXZDaGlsZHJlbltuYW1lXTsKKyAg ICAgICAgcmVtb3ZlZE5vZGVzW25hbWVdID0gUmVhY3RSZWNvbmNpbGVyLmdldEhvc3ROb2RlKHBy ZXZDaGlsZCk7CisgICAgICAgIFJlYWN0UmVjb25jaWxlci51bm1vdW50Q29tcG9uZW50KHByZXZD aGlsZCwgZmFsc2UpOworICAgICAgfQorICAgIH0KKyAgfSwKKworICAvKioKKyAgICogVW5tb3Vu dHMgYWxsIHJlbmRlcmVkIGNoaWxkcmVuLiBUaGlzIHNob3VsZCBiZSB1c2VkIHRvIGNsZWFuIHVw IGNoaWxkcmVuCisgICAqIHdoZW4gdGhpcyBjb21wb25lbnQgaXMgdW5tb3VudGVkLgorICAgKgor ICAgKiBAcGFyYW0gez9vYmplY3R9IHJlbmRlcmVkQ2hpbGRyZW4gUHJldmlvdXNseSBpbml0aWFs aXplZCBzZXQgb2YgY2hpbGRyZW4uCisgICAqIEBpbnRlcm5hbAorICAgKi8KKyAgdW5tb3VudENo aWxkcmVuOiBmdW5jdGlvbiAocmVuZGVyZWRDaGlsZHJlbiwgc2FmZWx5KSB7CisgICAgZm9yICh2 YXIgbmFtZSBpbiByZW5kZXJlZENoaWxkcmVuKSB7CisgICAgICBpZiAocmVuZGVyZWRDaGlsZHJl bi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgeworICAgICAgICB2YXIgcmVuZGVyZWRDaGlsZCA9IHJl bmRlcmVkQ2hpbGRyZW5bbmFtZV07CisgICAgICAgIFJlYWN0UmVjb25jaWxlci51bm1vdW50Q29t cG9uZW50KHJlbmRlcmVkQ2hpbGQsIHNhZmVseSk7CisgICAgICB9CisgICAgfQorICB9CisKK307 CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RDaGlsZFJlY29uY2lsZXI7ClwgTm8gbmV3bGluZSBh dCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFj dC1kb20vbGliL1JlYWN0Q29tcG9uZW50QnJvd3NlckVudmlyb25tZW50LmpzIGIvd2ViL3BnYWRt aW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0Q29tcG9uZW50QnJvd3NlckVudmly b25tZW50LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi4wOTQ4YzAxZAot LS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xp Yi9SZWFjdENvbXBvbmVudEJyb3dzZXJFbnZpcm9ubWVudC5qcwpAQCAtMCwwICsxLDI5IEBACisv KioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmln aHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIg dGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRo ZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50 CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGlu IHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgRE9N Q2hpbGRyZW5PcGVyYXRpb25zID0gcmVxdWlyZSgnLi9ET01DaGlsZHJlbk9wZXJhdGlvbnMnKTsK K3ZhciBSZWFjdERPTUlET3BlcmF0aW9ucyA9IHJlcXVpcmUoJy4vUmVhY3RET01JRE9wZXJhdGlv bnMnKTsKKworLyoqCisgKiBBYnN0cmFjdHMgYXdheSBhbGwgZnVuY3Rpb25hbGl0eSBvZiB0aGUg cmVjb25jaWxlciB0aGF0IHJlcXVpcmVzIGtub3dsZWRnZSBvZgorICogdGhlIGJyb3dzZXIgY29u dGV4dC4gVE9ETzogVGhlc2UgY2FsbGVycyBzaG91bGQgYmUgcmVmYWN0b3JlZCB0byBhdm9pZCB0 aGUKKyAqIG5lZWQgZm9yIHRoaXMgaW5qZWN0aW9uLgorICovCit2YXIgUmVhY3RDb21wb25lbnRC cm93c2VyRW52aXJvbm1lbnQgPSB7CisKKyAgcHJvY2Vzc0NoaWxkcmVuVXBkYXRlczogUmVhY3RE T01JRE9wZXJhdGlvbnMuZGFuZ2Vyb3VzbHlQcm9jZXNzQ2hpbGRyZW5VcGRhdGVzLAorCisgIHJl cGxhY2VOb2RlV2l0aE1hcmt1cDogRE9NQ2hpbGRyZW5PcGVyYXRpb25zLmRhbmdlcm91c2x5UmVw bGFjZU5vZGVXaXRoTWFya3VwCisKK307CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RDb21wb25l bnRCcm93c2VyRW52aXJvbm1lbnQ7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0t Z2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0Q29tcG9u ZW50RW52aXJvbm1lbnQuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9s aWIvUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMC4uMTUyMTU5NGEKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0 aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudC5qcwpAQCAt MCwwICsxLDQ1IEBACisvKioKKyAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJ bmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMg bGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElD RU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBh ZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUg UEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisndXNl IHN0cmljdCc7CisKK3ZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52 YXJpYW50Jyk7CisKK3ZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQn KTsKKwordmFyIGluamVjdGVkID0gZmFsc2U7CisKK3ZhciBSZWFjdENvbXBvbmVudEVudmlyb25t ZW50ID0geworCisgIC8qKgorICAgKiBPcHRpb25hbGx5IGluamVjdGFibGUgaG9vayBmb3Igc3dh cHBpbmcgb3V0IG1vdW50IGltYWdlcyBpbiB0aGUgbWlkZGxlIG9mCisgICAqIHRoZSB0cmVlLgor ICAgKi8KKyAgcmVwbGFjZU5vZGVXaXRoTWFya3VwOiBudWxsLAorCisgIC8qKgorICAgKiBPcHRp b25hbGx5IGluamVjdGFibGUgaG9vayBmb3IgcHJvY2Vzc2luZyBhIHF1ZXVlIG9mIGNoaWxkIHVw ZGF0ZXMuIFdpbGwKKyAgICogbGF0ZXIgbW92ZSBpbnRvIE11bHRpQ2hpbGRDb21wb25lbnRzLgor ICAgKi8KKyAgcHJvY2Vzc0NoaWxkcmVuVXBkYXRlczogbnVsbCwKKworICBpbmplY3Rpb246IHsK KyAgICBpbmplY3RFbnZpcm9ubWVudDogZnVuY3Rpb24gKGVudmlyb25tZW50KSB7CisgICAgICAh IWluamVjdGVkID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFy aWFudChmYWxzZSwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50OiBpbmplY3RFbnZpcm9ubWVudCgp IGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLicpIDogX3Byb2RJbnZhcmlhbnQoJzEwNCcpIDogdm9p ZCAwOworICAgICAgUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudC5yZXBsYWNlTm9kZVdpdGhNYXJr dXAgPSBlbnZpcm9ubWVudC5yZXBsYWNlTm9kZVdpdGhNYXJrdXA7CisgICAgICBSZWFjdENvbXBv bmVudEVudmlyb25tZW50LnByb2Nlc3NDaGlsZHJlblVwZGF0ZXMgPSBlbnZpcm9ubWVudC5wcm9j ZXNzQ2hpbGRyZW5VcGRhdGVzOworICAgICAgaW5qZWN0ZWQgPSB0cnVlOworICAgIH0KKyAgfQor Cit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQ7ClwgTm8g bmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3Zl bmRvci9yZWFjdC1kb20vbGliL1JlYWN0Q29tcG9uZW50VHJlZVRlc3RVdGlscy5qcyBiL3dlYi9w Z2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdENvbXBvbmVudFRyZWVUZXN0 VXRpbHMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjM0MDgxMTAyCi0t LSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGli L1JlYWN0Q29tcG9uZW50VHJlZVRlc3RVdGlscy5qcwpAQCAtMCwwICsxLDg2IEBACisvKioKKyAq IENvcHlyaWdodCAyMDE2LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJl c2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJT RC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290 IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBv ZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBz YW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX2Fzc2lnbiA9 IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTsKKwordmFyIF9leHRlbmRzID0gX2Fzc2lnbiB8fCBm dW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsg aSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2Up IHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkp IHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsKKwor ZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9i aikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVt ZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVs c2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH0KKwordmFyIFJlYWN0Q29tcG9u ZW50VHJlZUhvb2sgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3RDb21wb25lbnRUcmVlSG9vaycp OworCitmdW5jdGlvbiBnZXRSb290RGlzcGxheU5hbWVzKCkgeworICByZXR1cm4gUmVhY3RDb21w b25lbnRUcmVlSG9vay5nZXRSb290SURzKCkubWFwKFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0 RGlzcGxheU5hbWUpOworfQorCitmdW5jdGlvbiBnZXRSZWdpc3RlcmVkRGlzcGxheU5hbWVzKCkg eworICByZXR1cm4gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRSZWdpc3RlcmVkSURzKCkubWFw KFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0RGlzcGxheU5hbWUpOworfQorCitmdW5jdGlvbiBl eHBlY3RUcmVlKHJvb3RJRCwgZXhwZWN0ZWRUcmVlLCBwYXJlbnRQYXRoKSB7CisgIHZhciBkaXNw bGF5TmFtZSA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0RGlzcGxheU5hbWUocm9vdElEKTsK KyAgdmFyIG93bmVySUQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldE93bmVySUQocm9vdElE KTsKKyAgdmFyIHBhcmVudElEID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRQYXJlbnRJRChy b290SUQpOworICB2YXIgY2hpbGRJRHMgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldENoaWxk SURzKHJvb3RJRCk7CisgIHZhciB0ZXh0ID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRUZXh0 KHJvb3RJRCk7CisgIHZhciBlbGVtZW50ID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRFbGVt ZW50KHJvb3RJRCk7CisgIHZhciBwYXRoID0gcGFyZW50UGF0aCA/IHBhcmVudFBhdGggKyAnID4g JyArIGRpc3BsYXlOYW1lIDogZGlzcGxheU5hbWU7CisKKyAgZnVuY3Rpb24gZXhwZWN0RXF1YWwo YWN0dWFsLCBleHBlY3RlZCwgbmFtZSkgeworICAgIC8vIEdldCBKYXNtaW5lIHRvIHByaW50IGRl c2NyaXB0aXZlIGVycm9yIG1lc3NhZ2VzLgorICAgIC8vIFdlIHBhc3MgcGF0aCBzbyB0aGF0IHdl IGtub3cgd2hlcmUgdGhlIG1pc21hdGNoIG9jY3VycmVkLgorICAgIGV4cGVjdChfZGVmaW5lUHJv cGVydHkoeworICAgICAgcGF0aDogcGF0aAorICAgIH0sIG5hbWUsIGFjdHVhbCkpLnRvRXF1YWwo X2RlZmluZVByb3BlcnR5KHsKKyAgICAgIHBhdGg6IHBhdGgKKyAgICB9LCBuYW1lLCBleHBlY3Rl ZCkpOworICB9CisKKyAgaWYgKGV4cGVjdGVkVHJlZS5wYXJlbnREaXNwbGF5TmFtZSAhPT0gdW5k ZWZpbmVkKSB7CisgICAgZXhwZWN0RXF1YWwoUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXREaXNw bGF5TmFtZShwYXJlbnRJRCksIGV4cGVjdGVkVHJlZS5wYXJlbnREaXNwbGF5TmFtZSwgJ3BhcmVu dERpc3BsYXlOYW1lJyk7CisgIH0KKyAgaWYgKGV4cGVjdGVkVHJlZS5vd25lckRpc3BsYXlOYW1l ICE9PSB1bmRlZmluZWQpIHsKKyAgICBleHBlY3RFcXVhbChSZWFjdENvbXBvbmVudFRyZWVIb29r LmdldERpc3BsYXlOYW1lKG93bmVySUQpLCBleHBlY3RlZFRyZWUub3duZXJEaXNwbGF5TmFtZSwg J293bmVyRGlzcGxheU5hbWUnKTsKKyAgfQorICBpZiAoZXhwZWN0ZWRUcmVlLnBhcmVudElEICE9 PSB1bmRlZmluZWQpIHsKKyAgICBleHBlY3RFcXVhbChwYXJlbnRJRCwgZXhwZWN0ZWRUcmVlLnBh cmVudElELCAncGFyZW50SUQnKTsKKyAgfQorICBpZiAoZXhwZWN0ZWRUcmVlLnRleHQgIT09IHVu ZGVmaW5lZCkgeworICAgIGV4cGVjdEVxdWFsKHRleHQsIGV4cGVjdGVkVHJlZS50ZXh0LCAndGV4 dCcpOworICAgIGV4cGVjdEVxdWFsKCcnICsgZWxlbWVudCwgZXhwZWN0ZWRUcmVlLnRleHQsICdl bGVtZW50LnRvU3RyaW5nKCknKTsKKyAgfSBlbHNlIHsKKyAgICBleHBlY3RFcXVhbCh0ZXh0LCBu dWxsLCAndGV4dCcpOworICB9CisgIGlmIChleHBlY3RlZFRyZWUuZWxlbWVudCAhPT0gdW5kZWZp bmVkKSB7CisgICAgLy8gVE9ETzogQ29tcGFyaW5nIGVsZW1lbnRzIG1ha2VzIHRlc3RzIHJ1biBv dXQgb2YgbWVtb3J5IG9uIGVycm9ycy4KKyAgICAvLyBGb3Igbm93LCBjb21wYXJlIGp1c3QgdHlw ZXMuCisgICAgZXhwZWN0RXF1YWwoZWxlbWVudCAmJiBlbGVtZW50LnR5cGUsIGV4cGVjdGVkVHJl ZS5lbGVtZW50ICYmIGV4cGVjdGVkVHJlZS5lbGVtZW50LnR5cGUsICdlbGVtZW50LnR5cGUnKTsK KyAgfSBlbHNlIGlmICh0ZXh0ID09IG51bGwpIHsKKyAgICBleHBlY3RFcXVhbCh0eXBlb2YgZWxl bWVudCwgJ29iamVjdCcsICd0eXBlb2YgZWxlbWVudCcpOworICB9CisgIGlmIChleHBlY3RlZFRy ZWUuY2hpbGRyZW4gIT09IHVuZGVmaW5lZCkgeworICAgIGV4cGVjdEVxdWFsKGNoaWxkSURzLmxl bmd0aCwgZXhwZWN0ZWRUcmVlLmNoaWxkcmVuLmxlbmd0aCwgJ2NoaWxkcmVuLmxlbmd0aCcpOwor ICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRJRHMubGVuZ3RoOyBpKyspIHsKKyAgICAgIGV4 cGVjdFRyZWUoY2hpbGRJRHNbaV0sIF9leHRlbmRzKHsgcGFyZW50SUQ6IHJvb3RJRCB9LCBleHBl Y3RlZFRyZWUuY2hpbGRyZW5baV0pLCBwYXRoKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZXhw ZWN0RXF1YWwoY2hpbGRJRHMsIFtdLCAnY2hpbGRJRHMnKTsKKyAgfQorfQorCit2YXIgUmVhY3RD b21wb25lbnRUcmVlVGVzdFV0aWxzID0geworICBleHBlY3RUcmVlOiBleHBlY3RUcmVlLAorICBn ZXRSb290RGlzcGxheU5hbWVzOiBnZXRSb290RGlzcGxheU5hbWVzLAorICBnZXRSZWdpc3RlcmVk RGlzcGxheU5hbWVzOiBnZXRSZWdpc3RlcmVkRGlzcGxheU5hbWVzCit9OworCittb2R1bGUuZXhw b3J0cyA9IFJlYWN0Q29tcG9uZW50VHJlZVRlc3RVdGlsczsKXCBObyBuZXdsaW5lIGF0IGVuZCBv ZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9s aWIvUmVhY3RDb21wb3NpdGVDb21wb25lbnQuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9y L3JlYWN0LWRvbS9saWIvUmVhY3RDb21wb3NpdGVDb21wb25lbnQuanMKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMDAuLmNjMzMyNjRiCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL3Bn YWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50 LmpzCkBAIC0wLDAgKzEsOTAxIEBACisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZh Y2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNl IGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRo ZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0 cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3Vu ZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKwor J3VzZSBzdHJpY3QnOworCit2YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJv ZEludmFyaWFudCcpLAorICAgIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7CisK K3ZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdCcpOwordmFyIFJlYWN0Q29tcG9u ZW50RW52aXJvbm1lbnQgPSByZXF1aXJlKCcuL1JlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQnKTsK K3ZhciBSZWFjdEN1cnJlbnRPd25lciA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdEN1cnJlbnRP d25lcicpOwordmFyIFJlYWN0RXJyb3JVdGlscyA9IHJlcXVpcmUoJy4vUmVhY3RFcnJvclV0aWxz Jyk7Cit2YXIgUmVhY3RJbnN0YW5jZU1hcCA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0YW5jZU1hcCcp OwordmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdEluc3RydW1lbnRh dGlvbicpOwordmFyIFJlYWN0Tm9kZVR5cGVzID0gcmVxdWlyZSgnLi9SZWFjdE5vZGVUeXBlcycp OwordmFyIFJlYWN0UmVjb25jaWxlciA9IHJlcXVpcmUoJy4vUmVhY3RSZWNvbmNpbGVyJyk7CisK K2lmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgIHZhciBjaGVj a1JlYWN0VHlwZVNwZWMgPSByZXF1aXJlKCcuL2NoZWNrUmVhY3RUeXBlU3BlYycpOworfQorCit2 YXIgZW1wdHlPYmplY3QgPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eU9iamVjdCcpOwordmFyIGlu dmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpOwordmFyIHNoYWxsb3dFcXVh bCA9IHJlcXVpcmUoJ2ZianMvbGliL3NoYWxsb3dFcXVhbCcpOwordmFyIHNob3VsZFVwZGF0ZVJl YWN0Q29tcG9uZW50ID0gcmVxdWlyZSgnLi9zaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudCcpOwor dmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7CisKK3ZhciBDb21wb3Np dGVUeXBlcyA9IHsKKyAgSW1wdXJlQ2xhc3M6IDAsCisgIFB1cmVDbGFzczogMSwKKyAgU3RhdGVs ZXNzRnVuY3Rpb25hbDogMgorfTsKKworZnVuY3Rpb24gU3RhdGVsZXNzQ29tcG9uZW50KENvbXBv bmVudCkge30KK1N0YXRlbGVzc0NvbXBvbmVudC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24g KCkgeworICB2YXIgQ29tcG9uZW50ID0gUmVhY3RJbnN0YW5jZU1hcC5nZXQodGhpcykuX2N1cnJl bnRFbGVtZW50LnR5cGU7CisgIHZhciBlbGVtZW50ID0gQ29tcG9uZW50KHRoaXMucHJvcHMsIHRo aXMuY29udGV4dCwgdGhpcy51cGRhdGVyKTsKKyAgd2FybklmSW52YWxpZEVsZW1lbnQoQ29tcG9u ZW50LCBlbGVtZW50KTsKKyAgcmV0dXJuIGVsZW1lbnQ7Cit9OworCitmdW5jdGlvbiB3YXJuSWZJ bnZhbGlkRWxlbWVudChDb21wb25lbnQsIGVsZW1lbnQpIHsKKyAgaWYgKHByb2Nlc3MuZW52Lk5P REVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0g J3Byb2R1Y3Rpb24nID8gd2FybmluZyhlbGVtZW50ID09PSBudWxsIHx8IGVsZW1lbnQgPT09IGZh bHNlIHx8IFJlYWN0LmlzVmFsaWRFbGVtZW50KGVsZW1lbnQpLCAnJXMoLi4uKTogQSB2YWxpZCBS ZWFjdCBlbGVtZW50IChvciBudWxsKSBtdXN0IGJlIHJldHVybmVkLiBZb3UgbWF5IGhhdmUgJyAr ICdyZXR1cm5lZCB1bmRlZmluZWQsIGFuIGFycmF5IG9yIHNvbWUgb3RoZXIgaW52YWxpZCBvYmpl Y3QuJywgQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25l bnQnKSA6IHZvaWQgMDsKKyAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24n ID8gd2FybmluZyghQ29tcG9uZW50LmNoaWxkQ29udGV4dFR5cGVzLCAnJXMoLi4uKTogY2hpbGRD b250ZXh0VHlwZXMgY2Fubm90IGJlIGRlZmluZWQgb24gYSBmdW5jdGlvbmFsIGNvbXBvbmVudC4n LCBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCcp IDogdm9pZCAwOworICB9Cit9CisKK2Z1bmN0aW9uIHNob3VsZENvbnN0cnVjdChDb21wb25lbnQp IHsKKyAgcmV0dXJuICEhKENvbXBvbmVudC5wcm90b3R5cGUgJiYgQ29tcG9uZW50LnByb3RvdHlw ZS5pc1JlYWN0Q29tcG9uZW50KTsKK30KKworZnVuY3Rpb24gaXNQdXJlQ29tcG9uZW50KENvbXBv bmVudCkgeworICByZXR1cm4gISEoQ29tcG9uZW50LnByb3RvdHlwZSAmJiBDb21wb25lbnQucHJv dG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50KTsKK30KKworLy8gU2VwYXJhdGVkIGludG8gYSBm dW5jdGlvbiB0byBjb250YWluIGRlb3B0aW1pemF0aW9ucyBjYXVzZWQgYnkgdHJ5L2ZpbmFsbHku CitmdW5jdGlvbiBtZWFzdXJlTGlmZUN5Y2xlUGVyZihmbiwgZGVidWdJRCwgdGltZXJUeXBlKSB7 CisgIGlmIChkZWJ1Z0lEID09PSAwKSB7CisgICAgLy8gVG9wLWxldmVsIHdyYXBwZXJzIChzZWUg UmVhY3RNb3VudCkgYW5kIGVtcHR5IGNvbXBvbmVudHMgKHNlZQorICAgIC8vIFJlYWN0RE9NRW1w dHlDb21wb25lbnQpIGFyZSBpbnZpc2libGUgdG8gaG9va3MgYW5kIGRldnRvb2xzLgorICAgIC8v IEJvdGggYXJlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgdGhhdCBzaG91bGQgZ28gYXdheSBpbiB0 aGUgZnV0dXJlLgorICAgIHJldHVybiBmbigpOworICB9CisKKyAgUmVhY3RJbnN0cnVtZW50YXRp b24uZGVidWdUb29sLm9uQmVnaW5MaWZlQ3ljbGVUaW1lcihkZWJ1Z0lELCB0aW1lclR5cGUpOwor ICB0cnkgeworICAgIHJldHVybiBmbigpOworICB9IGZpbmFsbHkgeworICAgIFJlYWN0SW5zdHJ1 bWVudGF0aW9uLmRlYnVnVG9vbC5vbkVuZExpZmVDeWNsZVRpbWVyKGRlYnVnSUQsIHRpbWVyVHlw ZSk7CisgIH0KK30KKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0gVGhlIExpZmUtQ3ljbGUg b2YgYSBDb21wb3NpdGUgQ29tcG9uZW50IC0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIC0gY29u c3RydWN0b3I6IEluaXRpYWxpemF0aW9uIG9mIHN0YXRlLiBUaGUgaW5zdGFuY2UgaXMgbm93IHJl dGFpbmVkLgorICogICAtIGNvbXBvbmVudFdpbGxNb3VudAorICogICAtIHJlbmRlcgorICogICAt IFtjaGlsZHJlbidzIGNvbnN0cnVjdG9yc10KKyAqICAgICAtIFtjaGlsZHJlbidzIGNvbXBvbmVu dFdpbGxNb3VudCBhbmQgcmVuZGVyXQorICogICAgIC0gW2NoaWxkcmVuJ3MgY29tcG9uZW50RGlk TW91bnRdCisgKiAgICAgLSBjb21wb25lbnREaWRNb3VudAorICoKKyAqICAgICAgIFVwZGF0ZSBQ aGFzZXM6CisgKiAgICAgICAtIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgKG9ubHkgY2FsbGVk IGlmIHBhcmVudCB1cGRhdGVkKQorICogICAgICAgLSBzaG91bGRDb21wb25lbnRVcGRhdGUKKyAq ICAgICAgICAgLSBjb21wb25lbnRXaWxsVXBkYXRlCisgKiAgICAgICAgICAgLSByZW5kZXIKKyAq ICAgICAgICAgICAtIFtjaGlsZHJlbidzIGNvbnN0cnVjdG9ycyBvciByZWNlaXZlIHByb3BzIHBo YXNlc10KKyAqICAgICAgICAgLSBjb21wb25lbnREaWRVcGRhdGUKKyAqCisgKiAgICAgLSBjb21w b25lbnRXaWxsVW5tb3VudAorICogICAgIC0gW2NoaWxkcmVuJ3MgY29tcG9uZW50V2lsbFVubW91 bnRdCisgKiAgIC0gW2NoaWxkcmVuIGRlc3Ryb3llZF0KKyAqIC0gKGRlc3Ryb3llZCk6IFRoZSBp bnN0YW5jZSBpcyBub3cgYmxhbmssIHJlbGVhc2VkIGJ5IFJlYWN0IGFuZCByZWFkeSBmb3IgR0Mu CisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKioKKyAqIEFuIGluY3JlbWVu dGluZyBJRCBhc3NpZ25lZCB0byBlYWNoIGNvbXBvbmVudCB3aGVuIGl0IGlzIG1vdW50ZWQuIFRo aXMgaXMKKyAqIHVzZWQgdG8gZW5mb3JjZSB0aGUgb3JkZXIgaW4gd2hpY2ggYFJlYWN0VXBkYXRl c2AgdXBkYXRlcyBkaXJ0eSBjb21wb25lbnRzLgorICoKKyAqIEBwcml2YXRlCisgKi8KK3ZhciBu ZXh0TW91bnRJRCA9IDE7CisKKy8qKgorICogQGxlbmRzIHtSZWFjdENvbXBvc2l0ZUNvbXBvbmVu dC5wcm90b3R5cGV9CisgKi8KK3ZhciBSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCA9IHsKKworICAv KioKKyAgICogQmFzZSBjb25zdHJ1Y3RvciBmb3IgYWxsIGNvbXBvc2l0ZSBjb21wb25lbnQuCisg ICAqCisgICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50CisgICAqIEBmaW5hbAorICAg KiBAaW50ZXJuYWwKKyAgICovCisgIGNvbnN0cnVjdDogZnVuY3Rpb24gKGVsZW1lbnQpIHsKKyAg ICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IGVsZW1lbnQ7CisgICAgdGhpcy5fcm9vdE5vZGVJRCA9 IDA7CisgICAgdGhpcy5fY29tcG9zaXRlVHlwZSA9IG51bGw7CisgICAgdGhpcy5faW5zdGFuY2Ug PSBudWxsOworICAgIHRoaXMuX2hvc3RQYXJlbnQgPSBudWxsOworICAgIHRoaXMuX2hvc3RDb250 YWluZXJJbmZvID0gbnVsbDsKKworICAgIC8vIFNlZSBSZWFjdFVwZGF0ZVF1ZXVlCisgICAgdGhp cy5fdXBkYXRlQmF0Y2hOdW1iZXIgPSBudWxsOworICAgIHRoaXMuX3BlbmRpbmdFbGVtZW50ID0g bnVsbDsKKyAgICB0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSA9IG51bGw7CisgICAgdGhpcy5fcGVu ZGluZ1JlcGxhY2VTdGF0ZSA9IGZhbHNlOworICAgIHRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZSA9 IGZhbHNlOworCisgICAgdGhpcy5fcmVuZGVyZWROb2RlVHlwZSA9IG51bGw7CisgICAgdGhpcy5f cmVuZGVyZWRDb21wb25lbnQgPSBudWxsOworICAgIHRoaXMuX2NvbnRleHQgPSBudWxsOworICAg IHRoaXMuX21vdW50T3JkZXIgPSAwOworICAgIHRoaXMuX3RvcExldmVsV3JhcHBlciA9IG51bGw7 CisKKyAgICAvLyBTZWUgUmVhY3RVcGRhdGVzIGFuZCBSZWFjdFVwZGF0ZVF1ZXVlLgorICAgIHRo aXMuX3BlbmRpbmdDYWxsYmFja3MgPSBudWxsOworCisgICAgLy8gQ29tcG9uZW50V2lsbFVubW91 bnQgc2hhbGwgb25seSBiZSBjYWxsZWQgb25jZQorICAgIHRoaXMuX2NhbGxlZENvbXBvbmVudFdp bGxVbm1vdW50ID0gZmFsc2U7CisKKyAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdw cm9kdWN0aW9uJykgeworICAgICAgdGhpcy5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSBmYWxz ZTsKKyAgICB9CisgIH0sCisKKyAgLyoqCisgICAqIEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQs IHJlbmRlcnMgbWFya3VwLCBhbmQgcmVnaXN0ZXJzIGV2ZW50IGxpc3RlbmVycy4KKyAgICoKKyAg ICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufFJlYWN0U2VydmVyUmVuZGVyaW5n VHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uCisgICAqIEBwYXJhbSB7P29iamVjdH0gaG9zdFBhcmVu dAorICAgKiBAcGFyYW0gez9vYmplY3R9IGhvc3RDb250YWluZXJJbmZvCisgICAqIEBwYXJhbSB7 P29iamVjdH0gY29udGV4dAorICAgKiBAcmV0dXJuIHs/c3RyaW5nfSBSZW5kZXJlZCBtYXJrdXAg dG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgRE9NLgorICAgKiBAZmluYWwKKyAgICogQGludGVybmFs CisgICAqLworICBtb3VudENvbXBvbmVudDogZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBob3N0UGFy ZW50LCBob3N0Q29udGFpbmVySW5mbywgY29udGV4dCkgeworICAgIHZhciBfdGhpcyA9IHRoaXM7 CisKKyAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKKyAgICB0aGlzLl9tb3VudE9yZGVyID0g bmV4dE1vdW50SUQrKzsKKyAgICB0aGlzLl9ob3N0UGFyZW50ID0gaG9zdFBhcmVudDsKKyAgICB0 aGlzLl9ob3N0Q29udGFpbmVySW5mbyA9IGhvc3RDb250YWluZXJJbmZvOworCisgICAgdmFyIHB1 YmxpY1Byb3BzID0gdGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHM7CisgICAgdmFyIHB1YmxpY0Nv bnRleHQgPSB0aGlzLl9wcm9jZXNzQ29udGV4dChjb250ZXh0KTsKKworICAgIHZhciBDb21wb25l bnQgPSB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlOworCisgICAgdmFyIHVwZGF0ZVF1ZXVlID0g dHJhbnNhY3Rpb24uZ2V0VXBkYXRlUXVldWUoKTsKKworICAgIC8vIEluaXRpYWxpemUgdGhlIHB1 YmxpYyBjbGFzcworICAgIHZhciBkb0NvbnN0cnVjdCA9IHNob3VsZENvbnN0cnVjdChDb21wb25l bnQpOworICAgIHZhciBpbnN0ID0gdGhpcy5fY29uc3RydWN0Q29tcG9uZW50KGRvQ29uc3RydWN0 LCBwdWJsaWNQcm9wcywgcHVibGljQ29udGV4dCwgdXBkYXRlUXVldWUpOworICAgIHZhciByZW5k ZXJlZEVsZW1lbnQ7CisKKyAgICAvLyBTdXBwb3J0IGZ1bmN0aW9uYWwgY29tcG9uZW50cworICAg IGlmICghZG9Db25zdHJ1Y3QgJiYgKGluc3QgPT0gbnVsbCB8fCBpbnN0LnJlbmRlciA9PSBudWxs KSkgeworICAgICAgcmVuZGVyZWRFbGVtZW50ID0gaW5zdDsKKyAgICAgIHdhcm5JZkludmFsaWRF bGVtZW50KENvbXBvbmVudCwgcmVuZGVyZWRFbGVtZW50KTsKKyAgICAgICEoaW5zdCA9PT0gbnVs bCB8fCBpbnN0ID09PSBmYWxzZSB8fCBSZWFjdC5pc1ZhbGlkRWxlbWVudChpbnN0KSkgPyBwcm9j ZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMo Li4uKTogQSB2YWxpZCBSZWFjdCBlbGVtZW50IChvciBudWxsKSBtdXN0IGJlIHJldHVybmVkLiBZ b3UgbWF5IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLCBhbiBhcnJheSBvciBzb21lIG90aGVyIGlu dmFsaWQgb2JqZWN0LicsIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8 fCAnQ29tcG9uZW50JykgOiBfcHJvZEludmFyaWFudCgnMTA1JywgQ29tcG9uZW50LmRpc3BsYXlO YW1lIHx8IENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnKSA6IHZvaWQgMDsKKyAgICAgIGlu c3QgPSBuZXcgU3RhdGVsZXNzQ29tcG9uZW50KENvbXBvbmVudCk7CisgICAgICB0aGlzLl9jb21w b3NpdGVUeXBlID0gQ29tcG9zaXRlVHlwZXMuU3RhdGVsZXNzRnVuY3Rpb25hbDsKKyAgICB9IGVs c2UgeworICAgICAgaWYgKGlzUHVyZUNvbXBvbmVudChDb21wb25lbnQpKSB7CisgICAgICAgIHRo aXMuX2NvbXBvc2l0ZVR5cGUgPSBDb21wb3NpdGVUeXBlcy5QdXJlQ2xhc3M7CisgICAgICB9IGVs c2UgeworICAgICAgICB0aGlzLl9jb21wb3NpdGVUeXBlID0gQ29tcG9zaXRlVHlwZXMuSW1wdXJl Q2xhc3M7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9 PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBsYXRlciBpbiBfcmVu ZGVyVmFsaWRhdGVkQ29tcG9uZW50LCBidXQgYWRkIGFuIGVhcmx5CisgICAgICAvLyB3YXJuaW5n IG5vdyB0byBoZWxwIGRlYnVnZ2luZworICAgICAgaWYgKGluc3QucmVuZGVyID09IG51bGwpIHsK KyAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmco ZmFsc2UsICclcyguLi4pOiBObyBgcmVuZGVyYCBtZXRob2QgZm91bmQgb24gdGhlIHJldHVybmVk IGNvbXBvbmVudCAnICsgJ2luc3RhbmNlOiB5b3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIGRlZmlu ZSBgcmVuZGVyYC4nLCBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwg J0NvbXBvbmVudCcpIDogdm9pZCAwOworICAgICAgfQorCisgICAgICB2YXIgcHJvcHNNdXRhdGVk ID0gaW5zdC5wcm9wcyAhPT0gcHVibGljUHJvcHM7CisgICAgICB2YXIgY29tcG9uZW50TmFtZSA9 IENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JzsK KworICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmco aW5zdC5wcm9wcyA9PT0gdW5kZWZpbmVkIHx8ICFwcm9wc011dGF0ZWQsICclcyguLi4pOiBXaGVu IGNhbGxpbmcgc3VwZXIoKSBpbiBgJXNgLCBtYWtlIHN1cmUgdG8gcGFzcyAnICsgJ3VwIHRoZSBz YW1lIHByb3BzIHRoYXQgeW91ciBjb21wb25lbnRcJ3MgY29uc3RydWN0b3Igd2FzIHBhc3NlZC4n LCBjb21wb25lbnROYW1lLCBjb21wb25lbnROYW1lKSA6IHZvaWQgMDsKKyAgICB9CisKKyAgICAv LyBUaGVzZSBzaG91bGQgYmUgc2V0IHVwIGluIHRoZSBjb25zdHJ1Y3RvciwgYnV0IGFzIGEgY29u dmVuaWVuY2UgZm9yCisgICAgLy8gc2ltcGxlciBjbGFzcyBhYnN0cmFjdGlvbnMsIHdlIHNldCB0 aGVtIHVwIGFmdGVyIHRoZSBmYWN0LgorICAgIGluc3QucHJvcHMgPSBwdWJsaWNQcm9wczsKKyAg ICBpbnN0LmNvbnRleHQgPSBwdWJsaWNDb250ZXh0OworICAgIGluc3QucmVmcyA9IGVtcHR5T2Jq ZWN0OworICAgIGluc3QudXBkYXRlciA9IHVwZGF0ZVF1ZXVlOworCisgICAgdGhpcy5faW5zdGFu Y2UgPSBpbnN0OworCisgICAgLy8gU3RvcmUgYSByZWZlcmVuY2UgZnJvbSB0aGUgaW5zdGFuY2Ug YmFjayB0byB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24KKyAgICBSZWFjdEluc3RhbmNlTWFw LnNldChpbnN0LCB0aGlzKTsKKworICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3By b2R1Y3Rpb24nKSB7CisgICAgICAvLyBTaW5jZSBwbGFpbiBKUyBjbGFzc2VzIGFyZSBkZWZpbmVk IHdpdGhvdXQgYW55IHNwZWNpYWwgaW5pdGlhbGl6YXRpb24KKyAgICAgIC8vIGxvZ2ljLCB3ZSBj YW4gbm90IGNhdGNoIGNvbW1vbiBlcnJvcnMgZWFybHkuIFRoZXJlZm9yZSwgd2UgaGF2ZSB0bwor ICAgICAgLy8gY2F0Y2ggdGhlbSBoZXJlLCBhdCBpbml0aWFsaXphdGlvbiB0aW1lLCBpbnN0ZWFk LgorICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmco IWluc3QuZ2V0SW5pdGlhbFN0YXRlIHx8IGluc3QuZ2V0SW5pdGlhbFN0YXRlLmlzUmVhY3RDbGFz c0FwcHJvdmVkIHx8IGluc3Quc3RhdGUsICdnZXRJbml0aWFsU3RhdGUgd2FzIGRlZmluZWQgb24g JXMsIGEgcGxhaW4gSmF2YVNjcmlwdCBjbGFzcy4gJyArICdUaGlzIGlzIG9ubHkgc3VwcG9ydGVk IGZvciBjbGFzc2VzIGNyZWF0ZWQgdXNpbmcgUmVhY3QuY3JlYXRlQ2xhc3MuICcgKyAnRGlkIHlv dSBtZWFuIHRvIGRlZmluZSBhIHN0YXRlIHByb3BlcnR5IGluc3RlYWQ/JywgdGhpcy5nZXROYW1l KCkgfHwgJ2EgY29tcG9uZW50JykgOiB2b2lkIDA7CisgICAgICBwcm9jZXNzLmVudi5OT0RFX0VO ViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghaW5zdC5nZXREZWZhdWx0UHJvcHMgfHwgaW5z dC5nZXREZWZhdWx0UHJvcHMuaXNSZWFjdENsYXNzQXBwcm92ZWQsICdnZXREZWZhdWx0UHJvcHMg d2FzIGRlZmluZWQgb24gJXMsIGEgcGxhaW4gSmF2YVNjcmlwdCBjbGFzcy4gJyArICdUaGlzIGlz IG9ubHkgc3VwcG9ydGVkIGZvciBjbGFzc2VzIGNyZWF0ZWQgdXNpbmcgUmVhY3QuY3JlYXRlQ2xh c3MuICcgKyAnVXNlIGEgc3RhdGljIHByb3BlcnR5IHRvIGRlZmluZSBkZWZhdWx0UHJvcHMgaW5z dGVhZC4nLCB0aGlzLmdldE5hbWUoKSB8fCAnYSBjb21wb25lbnQnKSA6IHZvaWQgMDsKKyAgICAg IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFpbnN0LnBy b3BUeXBlcywgJ3Byb3BUeXBlcyB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBv biAlcy4gVXNlIGEgc3RhdGljICcgKyAncHJvcGVydHkgdG8gZGVmaW5lIHByb3BUeXBlcyBpbnN0 ZWFkLicsIHRoaXMuZ2V0TmFtZSgpIHx8ICdhIGNvbXBvbmVudCcpIDogdm9pZCAwOworICAgICAg cHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIWluc3QuY29u dGV4dFR5cGVzLCAnY29udGV4dFR5cGVzIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3Bl cnR5IG9uICVzLiBVc2UgYSAnICsgJ3N0YXRpYyBwcm9wZXJ0eSB0byBkZWZpbmUgY29udGV4dFR5 cGVzIGluc3RlYWQuJywgdGhpcy5nZXROYW1lKCkgfHwgJ2EgY29tcG9uZW50JykgOiB2b2lkIDA7 CisgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyh0 eXBlb2YgaW5zdC5jb21wb25lbnRTaG91bGRVcGRhdGUgIT09ICdmdW5jdGlvbicsICclcyBoYXMg YSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50U2hvdWxkVXBkYXRlKCkuIERpZCB5b3UgbWVh biBzaG91bGRDb21wb25lbnRVcGRhdGUoKT8gJyArICdUaGUgbmFtZSBpcyBwaHJhc2VkIGFzIGEg cXVlc3Rpb24gYmVjYXVzZSB0aGUgZnVuY3Rpb24gaXMgJyArICdleHBlY3RlZCB0byByZXR1cm4g YSB2YWx1ZS4nLCB0aGlzLmdldE5hbWUoKSB8fCAnQSBjb21wb25lbnQnKSA6IHZvaWQgMDsKKyAg ICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHR5cGVv ZiBpbnN0LmNvbXBvbmVudERpZFVubW91bnQgIT09ICdmdW5jdGlvbicsICclcyBoYXMgYSBtZXRo b2QgY2FsbGVkICcgKyAnY29tcG9uZW50RGlkVW5tb3VudCgpLiBCdXQgdGhlcmUgaXMgbm8gc3Vj aCBsaWZlY3ljbGUgbWV0aG9kLiAnICsgJ0RpZCB5b3UgbWVhbiBjb21wb25lbnRXaWxsVW5tb3Vu dCgpPycsIHRoaXMuZ2V0TmFtZSgpIHx8ICdBIGNvbXBvbmVudCcpIDogdm9pZCAwOworICAgICAg cHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcodHlwZW9mIGlu c3QuY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcyAhPT0gJ2Z1bmN0aW9uJywgJyVzIGhhcyBhIG1l dGhvZCBjYWxsZWQgJyArICdjb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzKCkuIERpZCB5b3UgbWVh biBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk/JywgdGhpcy5nZXROYW1lKCkgfHwgJ0EgY29t cG9uZW50JykgOiB2b2lkIDA7CisgICAgfQorCisgICAgdmFyIGluaXRpYWxTdGF0ZSA9IGluc3Qu c3RhdGU7CisgICAgaWYgKGluaXRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICBpbnN0 LnN0YXRlID0gaW5pdGlhbFN0YXRlID0gbnVsbDsKKyAgICB9CisgICAgISh0eXBlb2YgaW5pdGlh bFN0YXRlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShpbml0aWFsU3RhdGUpKSA/IHBy b2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICcl cy5zdGF0ZTogbXVzdCBiZSBzZXQgdG8gYW4gb2JqZWN0IG9yIG51bGwnLCB0aGlzLmdldE5hbWUo KSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IF9wcm9kSW52YXJpYW50KCcxMDYnLCB0 aGlzLmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IHZvaWQgMDsKKwor ICAgIHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlID0gbnVsbDsKKyAgICB0aGlzLl9wZW5kaW5nUmVw bGFjZVN0YXRlID0gZmFsc2U7CisgICAgdGhpcy5fcGVuZGluZ0ZvcmNlVXBkYXRlID0gZmFsc2U7 CisKKyAgICB2YXIgbWFya3VwOworICAgIGlmIChpbnN0LnVuc3RhYmxlX2hhbmRsZUVycm9yKSB7 CisgICAgICBtYXJrdXAgPSB0aGlzLnBlcmZvcm1Jbml0aWFsTW91bnRXaXRoRXJyb3JIYW5kbGlu ZyhyZW5kZXJlZEVsZW1lbnQsIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCB0cmFuc2Fj dGlvbiwgY29udGV4dCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1hcmt1cCA9IHRoaXMucGVyZm9y bUluaXRpYWxNb3VudChyZW5kZXJlZEVsZW1lbnQsIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJ bmZvLCB0cmFuc2FjdGlvbiwgY29udGV4dCk7CisgICAgfQorCisgICAgaWYgKGluc3QuY29tcG9u ZW50RGlkTW91bnQpIHsKKyAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1 Y3Rpb24nKSB7CisgICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVl dWUoZnVuY3Rpb24gKCkgeworICAgICAgICAgIG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0aW9u ICgpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnN0LmNvbXBvbmVudERpZE1vdW50KCk7CisgICAg ICAgICAgfSwgX3RoaXMuX2RlYnVnSUQsICdjb21wb25lbnREaWRNb3VudCcpOworICAgICAgICB9 KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFk eSgpLmVucXVldWUoaW5zdC5jb21wb25lbnREaWRNb3VudCwgaW5zdCk7CisgICAgICB9CisgICAg fQorCisgICAgcmV0dXJuIG1hcmt1cDsKKyAgfSwKKworICBfY29uc3RydWN0Q29tcG9uZW50OiBm dW5jdGlvbiAoZG9Db25zdHJ1Y3QsIHB1YmxpY1Byb3BzLCBwdWJsaWNDb250ZXh0LCB1cGRhdGVR dWV1ZSkgeworICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7 CisgICAgICBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ID0gdGhpczsKKyAgICAgIHRyeSB7Cisg ICAgICAgIHJldHVybiB0aGlzLl9jb25zdHJ1Y3RDb21wb25lbnRXaXRob3V0T3duZXIoZG9Db25z dHJ1Y3QsIHB1YmxpY1Byb3BzLCBwdWJsaWNDb250ZXh0LCB1cGRhdGVRdWV1ZSk7CisgICAgICB9 IGZpbmFsbHkgeworICAgICAgICBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ID0gbnVsbDsKKyAg ICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHRoaXMuX2NvbnN0cnVjdENvbXBvbmVu dFdpdGhvdXRPd25lcihkb0NvbnN0cnVjdCwgcHVibGljUHJvcHMsIHB1YmxpY0NvbnRleHQsIHVw ZGF0ZVF1ZXVlKTsKKyAgICB9CisgIH0sCisKKyAgX2NvbnN0cnVjdENvbXBvbmVudFdpdGhvdXRP d25lcjogZnVuY3Rpb24gKGRvQ29uc3RydWN0LCBwdWJsaWNQcm9wcywgcHVibGljQ29udGV4dCwg dXBkYXRlUXVldWUpIHsKKyAgICB2YXIgQ29tcG9uZW50ID0gdGhpcy5fY3VycmVudEVsZW1lbnQu dHlwZTsKKworICAgIGlmIChkb0NvbnN0cnVjdCkgeworICAgICAgaWYgKHByb2Nlc3MuZW52Lk5P REVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICAgcmV0dXJuIG1lYXN1cmVMaWZlQ3lj bGVQZXJmKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudChwdWJs aWNQcm9wcywgcHVibGljQ29udGV4dCwgdXBkYXRlUXVldWUpOworICAgICAgICB9LCB0aGlzLl9k ZWJ1Z0lELCAnY3RvcicpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb21w b25lbnQocHVibGljUHJvcHMsIHB1YmxpY0NvbnRleHQsIHVwZGF0ZVF1ZXVlKTsKKyAgICAgIH0K KyAgICB9CisKKyAgICAvLyBUaGlzIGNhbiBzdGlsbCBiZSBhbiBpbnN0YW5jZSBpbiBjYXNlIG9m IGZhY3RvcnkgY29tcG9uZW50cworICAgIC8vIGJ1dCB3ZSdsbCBjb3VudCB0aGlzIGFzIHRpbWUg c3BlbnQgcmVuZGVyaW5nIGFzIHRoZSBtb3JlIGNvbW1vbiBjYXNlLgorICAgIGlmIChwcm9jZXNz LmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICByZXR1cm4gbWVhc3VyZUxp ZmVDeWNsZVBlcmYoZnVuY3Rpb24gKCkgeworICAgICAgICByZXR1cm4gQ29tcG9uZW50KHB1Ymxp Y1Byb3BzLCBwdWJsaWNDb250ZXh0LCB1cGRhdGVRdWV1ZSk7CisgICAgICB9LCB0aGlzLl9kZWJ1 Z0lELCAncmVuZGVyJyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBDb21wb25lbnQocHVi bGljUHJvcHMsIHB1YmxpY0NvbnRleHQsIHVwZGF0ZVF1ZXVlKTsKKyAgICB9CisgIH0sCisKKyAg cGVyZm9ybUluaXRpYWxNb3VudFdpdGhFcnJvckhhbmRsaW5nOiBmdW5jdGlvbiAocmVuZGVyZWRF bGVtZW50LCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgdHJhbnNhY3Rpb24sIGNvbnRl eHQpIHsKKyAgICB2YXIgbWFya3VwOworICAgIHZhciBjaGVja3BvaW50ID0gdHJhbnNhY3Rpb24u Y2hlY2twb2ludCgpOworICAgIHRyeSB7CisgICAgICBtYXJrdXAgPSB0aGlzLnBlcmZvcm1Jbml0 aWFsTW91bnQocmVuZGVyZWRFbGVtZW50LCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywg dHJhbnNhY3Rpb24sIGNvbnRleHQpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIC8vIFJvbGwg YmFjayB0byBjaGVja3BvaW50LCBoYW5kbGUgZXJyb3IgKHdoaWNoIG1heSBhZGQgaXRlbXMgdG8g dGhlIHRyYW5zYWN0aW9uKSwgYW5kIHRha2UgYSBuZXcgY2hlY2twb2ludAorICAgICAgdHJhbnNh Y3Rpb24ucm9sbGJhY2soY2hlY2twb2ludCk7CisgICAgICB0aGlzLl9pbnN0YW5jZS51bnN0YWJs ZV9oYW5kbGVFcnJvcihlKTsKKyAgICAgIGlmICh0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSkgewor ICAgICAgICB0aGlzLl9pbnN0YW5jZS5zdGF0ZSA9IHRoaXMuX3Byb2Nlc3NQZW5kaW5nU3RhdGUo dGhpcy5faW5zdGFuY2UucHJvcHMsIHRoaXMuX2luc3RhbmNlLmNvbnRleHQpOworICAgICAgfQor ICAgICAgY2hlY2twb2ludCA9IHRyYW5zYWN0aW9uLmNoZWNrcG9pbnQoKTsKKworICAgICAgdGhp cy5fcmVuZGVyZWRDb21wb25lbnQudW5tb3VudENvbXBvbmVudCh0cnVlKTsKKyAgICAgIHRyYW5z YWN0aW9uLnJvbGxiYWNrKGNoZWNrcG9pbnQpOworCisgICAgICAvLyBUcnkgYWdhaW4gLSB3ZSd2 ZSBpbmZvcm1lZCB0aGUgY29tcG9uZW50IGFib3V0IHRoZSBlcnJvciwgc28gdGhleSBjYW4gcmVu ZGVyIGFuIGVycm9yIG1lc3NhZ2UgdGhpcyB0aW1lLgorICAgICAgLy8gSWYgdGhpcyB0aHJvd3Mg YWdhaW4sIHRoZSBlcnJvciB3aWxsIGJ1YmJsZSB1cCAoYW5kIGNhbiBiZSBjYXVnaHQgYnkgYSBo aWdoZXIgZXJyb3IgYm91bmRhcnkpLgorICAgICAgbWFya3VwID0gdGhpcy5wZXJmb3JtSW5pdGlh bE1vdW50KHJlbmRlcmVkRWxlbWVudCwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIHRy YW5zYWN0aW9uLCBjb250ZXh0KTsKKyAgICB9CisgICAgcmV0dXJuIG1hcmt1cDsKKyAgfSwKKwor ICBwZXJmb3JtSW5pdGlhbE1vdW50OiBmdW5jdGlvbiAocmVuZGVyZWRFbGVtZW50LCBob3N0UGFy ZW50LCBob3N0Q29udGFpbmVySW5mbywgdHJhbnNhY3Rpb24sIGNvbnRleHQpIHsKKyAgICB2YXIg aW5zdCA9IHRoaXMuX2luc3RhbmNlOworCisgICAgdmFyIGRlYnVnSUQgPSAwOworICAgIGlmIChw cm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICBkZWJ1Z0lEID0g dGhpcy5fZGVidWdJRDsKKyAgICB9CisKKyAgICBpZiAoaW5zdC5jb21wb25lbnRXaWxsTW91bnQp IHsKKyAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7Cisg ICAgICAgIG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICByZXR1 cm4gaW5zdC5jb21wb25lbnRXaWxsTW91bnQoKTsKKyAgICAgICAgfSwgZGVidWdJRCwgJ2NvbXBv bmVudFdpbGxNb3VudCcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5zdC5jb21wb25lbnRX aWxsTW91bnQoKTsKKyAgICAgIH0KKyAgICAgIC8vIFdoZW4gbW91bnRpbmcsIGNhbGxzIHRvIGBz ZXRTdGF0ZWAgYnkgYGNvbXBvbmVudFdpbGxNb3VudGAgd2lsbCBzZXQKKyAgICAgIC8vIGB0aGlz Ll9wZW5kaW5nU3RhdGVRdWV1ZWAgd2l0aG91dCB0cmlnZ2VyaW5nIGEgcmUtcmVuZGVyLgorICAg ICAgaWYgKHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlKSB7CisgICAgICAgIGluc3Quc3RhdGUgPSB0 aGlzLl9wcm9jZXNzUGVuZGluZ1N0YXRlKGluc3QucHJvcHMsIGluc3QuY29udGV4dCk7CisgICAg ICB9CisgICAgfQorCisgICAgLy8gSWYgbm90IGEgc3RhdGVsZXNzIGNvbXBvbmVudCwgd2Ugbm93 IHJlbmRlcgorICAgIGlmIChyZW5kZXJlZEVsZW1lbnQgPT09IHVuZGVmaW5lZCkgeworICAgICAg cmVuZGVyZWRFbGVtZW50ID0gdGhpcy5fcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50KCk7CisgICAg fQorCisgICAgdmFyIG5vZGVUeXBlID0gUmVhY3ROb2RlVHlwZXMuZ2V0VHlwZShyZW5kZXJlZEVs ZW1lbnQpOworICAgIHRoaXMuX3JlbmRlcmVkTm9kZVR5cGUgPSBub2RlVHlwZTsKKyAgICB2YXIg Y2hpbGQgPSB0aGlzLl9pbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50KHJlbmRlcmVkRWxlbWVudCwg bm9kZVR5cGUgIT09IFJlYWN0Tm9kZVR5cGVzLkVNUFRZIC8qIHNob3VsZEhhdmVEZWJ1Z0lEICov CisgICAgKTsKKyAgICB0aGlzLl9yZW5kZXJlZENvbXBvbmVudCA9IGNoaWxkOworCisgICAgdmFy IG1hcmt1cCA9IFJlYWN0UmVjb25jaWxlci5tb3VudENvbXBvbmVudChjaGlsZCwgdHJhbnNhY3Rp b24sIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCB0aGlzLl9wcm9jZXNzQ2hpbGRDb250 ZXh0KGNvbnRleHQpLCBkZWJ1Z0lEKTsKKworICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAh PT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICBpZiAoZGVidWdJRCAhPT0gMCkgeworICAgICAgICB2 YXIgY2hpbGREZWJ1Z0lEcyA9IGNoaWxkLl9kZWJ1Z0lEICE9PSAwID8gW2NoaWxkLl9kZWJ1Z0lE XSA6IFtdOworICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25TZXRDaGls ZHJlbihkZWJ1Z0lELCBjaGlsZERlYnVnSURzKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1 cm4gbWFya3VwOworICB9LAorCisgIGdldEhvc3ROb2RlOiBmdW5jdGlvbiAoKSB7CisgICAgcmV0 dXJuIFJlYWN0UmVjb25jaWxlci5nZXRIb3N0Tm9kZSh0aGlzLl9yZW5kZXJlZENvbXBvbmVudCk7 CisgIH0sCisKKyAgLyoqCisgICAqIFJlbGVhc2VzIGFueSByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5 IGBtb3VudENvbXBvbmVudGAuCisgICAqCisgICAqIEBmaW5hbAorICAgKiBAaW50ZXJuYWwKKyAg ICovCisgIHVubW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChzYWZlbHkpIHsKKyAgICBpZiAoIXRo aXMuX3JlbmRlcmVkQ29tcG9uZW50KSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFy IGluc3QgPSB0aGlzLl9pbnN0YW5jZTsKKworICAgIGlmIChpbnN0LmNvbXBvbmVudFdpbGxVbm1v dW50ICYmICFpbnN0Ll9jYWxsZWRDb21wb25lbnRXaWxsVW5tb3VudCkgeworICAgICAgaW5zdC5f Y2FsbGVkQ29tcG9uZW50V2lsbFVubW91bnQgPSB0cnVlOworCisgICAgICBpZiAoc2FmZWx5KSB7 CisgICAgICAgIHZhciBuYW1lID0gdGhpcy5nZXROYW1lKCkgKyAnLmNvbXBvbmVudFdpbGxVbm1v dW50KCknOworICAgICAgICBSZWFjdEVycm9yVXRpbHMuaW52b2tlR3VhcmRlZENhbGxiYWNrKG5h bWUsIGluc3QuY29tcG9uZW50V2lsbFVubW91bnQuYmluZChpbnN0KSk7CisgICAgICB9IGVsc2Ug eworICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgewor ICAgICAgICAgIG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAg IHJldHVybiBpbnN0LmNvbXBvbmVudFdpbGxVbm1vdW50KCk7CisgICAgICAgICAgfSwgdGhpcy5f ZGVidWdJRCwgJ2NvbXBvbmVudFdpbGxVbm1vdW50Jyk7CisgICAgICAgIH0gZWxzZSB7CisgICAg ICAgICAgaW5zdC5jb21wb25lbnRXaWxsVW5tb3VudCgpOworICAgICAgICB9CisgICAgICB9Cisg ICAgfQorCisgICAgaWYgKHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50KSB7CisgICAgICBSZWFjdFJl Y29uY2lsZXIudW5tb3VudENvbXBvbmVudCh0aGlzLl9yZW5kZXJlZENvbXBvbmVudCwgc2FmZWx5 KTsKKyAgICAgIHRoaXMuX3JlbmRlcmVkTm9kZVR5cGUgPSBudWxsOworICAgICAgdGhpcy5fcmVu ZGVyZWRDb21wb25lbnQgPSBudWxsOworICAgICAgdGhpcy5faW5zdGFuY2UgPSBudWxsOworICAg IH0KKworICAgIC8vIFJlc2V0IHBlbmRpbmcgZmllbGRzCisgICAgLy8gRXZlbiBpZiB0aGlzIGNv bXBvbmVudCBpcyBzY2hlZHVsZWQgZm9yIGFub3RoZXIgdXBkYXRlIGluIFJlYWN0VXBkYXRlcywK KyAgICAvLyBpdCB3b3VsZCBzdGlsbCBiZSBpZ25vcmVkIGJlY2F1c2UgdGhlc2UgZmllbGRzIGFy ZSByZXNldC4KKyAgICB0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSA9IG51bGw7CisgICAgdGhpcy5f cGVuZGluZ1JlcGxhY2VTdGF0ZSA9IGZhbHNlOworICAgIHRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0 ZSA9IGZhbHNlOworICAgIHRoaXMuX3BlbmRpbmdDYWxsYmFja3MgPSBudWxsOworICAgIHRoaXMu X3BlbmRpbmdFbGVtZW50ID0gbnVsbDsKKworICAgIC8vIFRoZXNlIGZpZWxkcyBkbyBub3QgcmVh bGx5IG5lZWQgdG8gYmUgcmVzZXQgc2luY2UgdGhpcyBvYmplY3QgaXMgbm8KKyAgICAvLyBsb25n ZXIgYWNjZXNzaWJsZS4KKyAgICB0aGlzLl9jb250ZXh0ID0gbnVsbDsKKyAgICB0aGlzLl9yb290 Tm9kZUlEID0gMDsKKyAgICB0aGlzLl90b3BMZXZlbFdyYXBwZXIgPSBudWxsOworCisgICAgLy8g RGVsZXRlIHRoZSByZWZlcmVuY2UgZnJvbSB0aGUgaW5zdGFuY2UgdG8gdGhpcyBpbnRlcm5hbCBy ZXByZXNlbnRhdGlvbgorICAgIC8vIHdoaWNoIGFsbG93IHRoZSBpbnRlcm5hbHMgdG8gYmUgcHJv cGVybHkgY2xlYW5lZCB1cCBldmVuIGlmIHRoZSB1c2VyCisgICAgLy8gbGVha3MgYSByZWZlcmVu Y2UgdG8gdGhlIHB1YmxpYyBpbnN0YW5jZS4KKyAgICBSZWFjdEluc3RhbmNlTWFwLnJlbW92ZShp bnN0KTsKKworICAgIC8vIFNvbWUgZXhpc3RpbmcgY29tcG9uZW50cyByZWx5IG9uIGluc3QucHJv cHMgZXZlbiBhZnRlciB0aGV5J3ZlIGJlZW4KKyAgICAvLyBkZXN0cm95ZWQgKGluIGV2ZW50IGhh bmRsZXJzKS4KKyAgICAvLyBUT0RPOiBpbnN0LnByb3BzID0gbnVsbDsKKyAgICAvLyBUT0RPOiBp bnN0LnN0YXRlID0gbnVsbDsKKyAgICAvLyBUT0RPOiBpbnN0LmNvbnRleHQgPSBudWxsOworICB9 LAorCisgIC8qKgorICAgKiBGaWx0ZXJzIHRoZSBjb250ZXh0IG9iamVjdCB0byBvbmx5IGNvbnRh aW4ga2V5cyBzcGVjaWZpZWQgaW4KKyAgICogYGNvbnRleHRUeXBlc2AKKyAgICoKKyAgICogQHBh cmFtIHtvYmplY3R9IGNvbnRleHQKKyAgICogQHJldHVybiB7P29iamVjdH0KKyAgICogQHByaXZh dGUKKyAgICovCisgIF9tYXNrQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHsKKyAgICB2YXIg Q29tcG9uZW50ID0gdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTsKKyAgICB2YXIgY29udGV4dFR5 cGVzID0gQ29tcG9uZW50LmNvbnRleHRUeXBlczsKKyAgICBpZiAoIWNvbnRleHRUeXBlcykgewor ICAgICAgcmV0dXJuIGVtcHR5T2JqZWN0OworICAgIH0KKyAgICB2YXIgbWFza2VkQ29udGV4dCA9 IHt9OworICAgIGZvciAodmFyIGNvbnRleHROYW1lIGluIGNvbnRleHRUeXBlcykgeworICAgICAg bWFza2VkQ29udGV4dFtjb250ZXh0TmFtZV0gPSBjb250ZXh0W2NvbnRleHROYW1lXTsKKyAgICB9 CisgICAgcmV0dXJuIG1hc2tlZENvbnRleHQ7CisgIH0sCisKKyAgLyoqCisgICAqIEZpbHRlcnMg dGhlIGNvbnRleHQgb2JqZWN0IHRvIG9ubHkgY29udGFpbiBrZXlzIHNwZWNpZmllZCBpbgorICAg KiBgY29udGV4dFR5cGVzYCwgYW5kIGFzc2VydHMgdGhhdCB0aGV5IGFyZSB2YWxpZC4KKyAgICoK KyAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHQKKyAgICogQHJldHVybiB7P29iamVjdH0KKyAg ICogQHByaXZhdGUKKyAgICovCisgIF9wcm9jZXNzQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQp IHsKKyAgICB2YXIgbWFza2VkQ29udGV4dCA9IHRoaXMuX21hc2tDb250ZXh0KGNvbnRleHQpOwor ICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICB2 YXIgQ29tcG9uZW50ID0gdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTsKKyAgICAgIGlmIChDb21w b25lbnQuY29udGV4dFR5cGVzKSB7CisgICAgICAgIHRoaXMuX2NoZWNrQ29udGV4dFR5cGVzKENv bXBvbmVudC5jb250ZXh0VHlwZXMsIG1hc2tlZENvbnRleHQsICdjb250ZXh0Jyk7CisgICAgICB9 CisgICAgfQorICAgIHJldHVybiBtYXNrZWRDb250ZXh0OworICB9LAorCisgIC8qKgorICAgKiBA cGFyYW0ge29iamVjdH0gY3VycmVudENvbnRleHQKKyAgICogQHJldHVybiB7b2JqZWN0fQorICAg KiBAcHJpdmF0ZQorICAgKi8KKyAgX3Byb2Nlc3NDaGlsZENvbnRleHQ6IGZ1bmN0aW9uIChjdXJy ZW50Q29udGV4dCkgeworICAgIHZhciBDb21wb25lbnQgPSB0aGlzLl9jdXJyZW50RWxlbWVudC50 eXBlOworICAgIHZhciBpbnN0ID0gdGhpcy5faW5zdGFuY2U7CisgICAgdmFyIGNoaWxkQ29udGV4 dDsKKworICAgIGlmIChpbnN0LmdldENoaWxkQ29udGV4dCkgeworICAgICAgaWYgKHByb2Nlc3Mu ZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICAgUmVhY3RJbnN0cnVtZW50 YXRpb24uZGVidWdUb29sLm9uQmVnaW5Qcm9jZXNzaW5nQ2hpbGRDb250ZXh0KCk7CisgICAgICAg IHRyeSB7CisgICAgICAgICAgY2hpbGRDb250ZXh0ID0gaW5zdC5nZXRDaGlsZENvbnRleHQoKTsK KyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1 Z1Rvb2wub25FbmRQcm9jZXNzaW5nQ2hpbGRDb250ZXh0KCk7CisgICAgICAgIH0KKyAgICAgIH0g ZWxzZSB7CisgICAgICAgIGNoaWxkQ29udGV4dCA9IGluc3QuZ2V0Q2hpbGRDb250ZXh0KCk7Cisg ICAgICB9CisgICAgfQorCisgICAgaWYgKGNoaWxkQ29udGV4dCkgeworICAgICAgISh0eXBlb2Yg Q29tcG9uZW50LmNoaWxkQ29udGV4dFR5cGVzID09PSAnb2JqZWN0JykgPyBwcm9jZXNzLmVudi5O T0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMuZ2V0Q2hpbGRD b250ZXh0KCk6IGNoaWxkQ29udGV4dFR5cGVzIG11c3QgYmUgZGVmaW5lZCBpbiBvcmRlciB0byB1 c2UgZ2V0Q2hpbGRDb250ZXh0KCkuJywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRl Q29tcG9uZW50JykgOiBfcHJvZEludmFyaWFudCgnMTA3JywgdGhpcy5nZXROYW1lKCkgfHwgJ1Jl YWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiB2b2lkIDA7CisgICAgICBpZiAocHJvY2Vzcy5lbnYu Tk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgICB0aGlzLl9jaGVja0NvbnRleHRU eXBlcyhDb21wb25lbnQuY2hpbGRDb250ZXh0VHlwZXMsIGNoaWxkQ29udGV4dCwgJ2NoaWxkQ29u dGV4dCcpOworICAgICAgfQorICAgICAgZm9yICh2YXIgbmFtZSBpbiBjaGlsZENvbnRleHQpIHsK KyAgICAgICAgIShuYW1lIGluIENvbXBvbmVudC5jaGlsZENvbnRleHRUeXBlcykgPyBwcm9jZXNz LmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMuZ2V0 Q2hpbGRDb250ZXh0KCk6IGtleSAiJXMiIGlzIG5vdCBkZWZpbmVkIGluIGNoaWxkQ29udGV4dFR5 cGVzLicsIHRoaXMuZ2V0TmFtZSgpIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcsIG5hbWUp IDogX3Byb2RJbnZhcmlhbnQoJzEwOCcsIHRoaXMuZ2V0TmFtZSgpIHx8ICdSZWFjdENvbXBvc2l0 ZUNvbXBvbmVudCcsIG5hbWUpIDogdm9pZCAwOworICAgICAgfQorICAgICAgcmV0dXJuIF9hc3Np Z24oe30sIGN1cnJlbnRDb250ZXh0LCBjaGlsZENvbnRleHQpOworICAgIH0KKyAgICByZXR1cm4g Y3VycmVudENvbnRleHQ7CisgIH0sCisKKyAgLyoqCisgICAqIEFzc2VydCB0aGF0IHRoZSBjb250 ZXh0IHR5cGVzIGFyZSB2YWxpZAorICAgKgorICAgKiBAcGFyYW0ge29iamVjdH0gdHlwZVNwZWNz IE1hcCBvZiBjb250ZXh0IGZpZWxkIHRvIGEgUmVhY3RQcm9wVHlwZQorICAgKiBAcGFyYW0ge29i amVjdH0gdmFsdWVzIFJ1bnRpbWUgdmFsdWVzIHRoYXQgbmVlZCB0byBiZSB0eXBlLWNoZWNrZWQK KyAgICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uIGUuZy4gInByb3AiLCAiY29udGV4dCIsICJj aGlsZCBjb250ZXh0IgorICAgKiBAcHJpdmF0ZQorICAgKi8KKyAgX2NoZWNrQ29udGV4dFR5cGVz OiBmdW5jdGlvbiAodHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uKSB7CisgICAgaWYgKHByb2Nl c3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIGNoZWNrUmVhY3RUeXBl U3BlYyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIHRoaXMuZ2V0TmFtZSgpLCBudWxsLCB0 aGlzLl9kZWJ1Z0lEKTsKKyAgICB9CisgIH0sCisKKyAgcmVjZWl2ZUNvbXBvbmVudDogZnVuY3Rp b24gKG5leHRFbGVtZW50LCB0cmFuc2FjdGlvbiwgbmV4dENvbnRleHQpIHsKKyAgICB2YXIgcHJl dkVsZW1lbnQgPSB0aGlzLl9jdXJyZW50RWxlbWVudDsKKyAgICB2YXIgcHJldkNvbnRleHQgPSB0 aGlzLl9jb250ZXh0OworCisgICAgdGhpcy5fcGVuZGluZ0VsZW1lbnQgPSBudWxsOworCisgICAg dGhpcy51cGRhdGVDb21wb25lbnQodHJhbnNhY3Rpb24sIHByZXZFbGVtZW50LCBuZXh0RWxlbWVu dCwgcHJldkNvbnRleHQsIG5leHRDb250ZXh0KTsKKyAgfSwKKworICAvKioKKyAgICogSWYgYW55 IG9mIGBfcGVuZGluZ0VsZW1lbnRgLCBgX3BlbmRpbmdTdGF0ZVF1ZXVlYCwgb3IgYF9wZW5kaW5n Rm9yY2VVcGRhdGVgCisgICAqIGlzIHNldCwgdXBkYXRlIHRoZSBjb21wb25lbnQuCisgICAqCisg ICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24KKyAgICog QGludGVybmFsCisgICAqLworICBwZXJmb3JtVXBkYXRlSWZOZWNlc3Nhcnk6IGZ1bmN0aW9uICh0 cmFuc2FjdGlvbikgeworICAgIGlmICh0aGlzLl9wZW5kaW5nRWxlbWVudCAhPSBudWxsKSB7Cisg ICAgICBSZWFjdFJlY29uY2lsZXIucmVjZWl2ZUNvbXBvbmVudCh0aGlzLCB0aGlzLl9wZW5kaW5n RWxlbWVudCwgdHJhbnNhY3Rpb24sIHRoaXMuX2NvbnRleHQpOworICAgIH0gZWxzZSBpZiAodGhp cy5fcGVuZGluZ1N0YXRlUXVldWUgIT09IG51bGwgfHwgdGhpcy5fcGVuZGluZ0ZvcmNlVXBkYXRl KSB7CisgICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudCh0cmFuc2FjdGlvbiwgdGhpcy5fY3VycmVu dEVsZW1lbnQsIHRoaXMuX2N1cnJlbnRFbGVtZW50LCB0aGlzLl9jb250ZXh0LCB0aGlzLl9jb250 ZXh0KTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5fdXBkYXRlQmF0Y2hOdW1iZXIgPSBudWxs OworICAgIH0KKyAgfSwKKworICAvKioKKyAgICogUGVyZm9ybSBhbiB1cGRhdGUgdG8gYSBtb3Vu dGVkIGNvbXBvbmVudC4gVGhlIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgYW5kCisgICAqIHNo b3VsZENvbXBvbmVudFVwZGF0ZSBtZXRob2RzIGFyZSBjYWxsZWQsIHRoZW4gKGFzc3VtaW5nIHRo ZSB1cGRhdGUgaXNuJ3QKKyAgICogc2tpcHBlZCkgdGhlIHJlbWFpbmluZyB1cGRhdGUgbGlmZWN5 Y2xlIG1ldGhvZHMgYXJlIGNhbGxlZCBhbmQgdGhlIERPTQorICAgKiByZXByZXNlbnRhdGlvbiBp cyB1cGRhdGVkLgorICAgKgorICAgKiBCeSBkZWZhdWx0LCB0aGlzIGltcGxlbWVudHMgUmVhY3Qn cyByZW5kZXJpbmcgYW5kIHJlY29uY2lsaWF0aW9uIGFsZ29yaXRobS4KKyAgICogU29waGlzdGlj YXRlZCBjbGllbnRzIG1heSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMuCisgICAqCisgICAqIEBwYXJh bSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24KKyAgICogQHBhcmFtIHtS ZWFjdEVsZW1lbnR9IHByZXZQYXJlbnRFbGVtZW50CisgICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50 fSBuZXh0UGFyZW50RWxlbWVudAorICAgKiBAaW50ZXJuYWwKKyAgICogQG92ZXJyaWRhYmxlCisg ICAqLworICB1cGRhdGVDb21wb25lbnQ6IGZ1bmN0aW9uICh0cmFuc2FjdGlvbiwgcHJldlBhcmVu dEVsZW1lbnQsIG5leHRQYXJlbnRFbGVtZW50LCBwcmV2VW5tYXNrZWRDb250ZXh0LCBuZXh0VW5t YXNrZWRDb250ZXh0KSB7CisgICAgdmFyIGluc3QgPSB0aGlzLl9pbnN0YW5jZTsKKyAgICAhKGlu c3QgIT0gbnVsbCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52 YXJpYW50KGZhbHNlLCAnQXR0ZW1wdGVkIHRvIHVwZGF0ZSBjb21wb25lbnQgYCVzYCB0aGF0IGhh cyBhbHJlYWR5IGJlZW4gdW5tb3VudGVkIChvciBmYWlsZWQgdG8gbW91bnQpLicsIHRoaXMuZ2V0 TmFtZSgpIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcpIDogX3Byb2RJbnZhcmlhbnQoJzEz NicsIHRoaXMuZ2V0TmFtZSgpIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcpIDogdm9pZCAw OworCisgICAgdmFyIHdpbGxSZWNlaXZlID0gZmFsc2U7CisgICAgdmFyIG5leHRDb250ZXh0Owor CisgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBjb250ZXh0IGhhcyBjaGFuZ2VkIG9yIG5vdAorICAg IGlmICh0aGlzLl9jb250ZXh0ID09PSBuZXh0VW5tYXNrZWRDb250ZXh0KSB7CisgICAgICBuZXh0 Q29udGV4dCA9IGluc3QuY29udGV4dDsKKyAgICB9IGVsc2UgeworICAgICAgbmV4dENvbnRleHQg PSB0aGlzLl9wcm9jZXNzQ29udGV4dChuZXh0VW5tYXNrZWRDb250ZXh0KTsKKyAgICAgIHdpbGxS ZWNlaXZlID0gdHJ1ZTsKKyAgICB9CisKKyAgICB2YXIgcHJldlByb3BzID0gcHJldlBhcmVudEVs ZW1lbnQucHJvcHM7CisgICAgdmFyIG5leHRQcm9wcyA9IG5leHRQYXJlbnRFbGVtZW50LnByb3Bz OworCisgICAgLy8gTm90IGEgc2ltcGxlIHN0YXRlIHVwZGF0ZSBidXQgYSBwcm9wcyB1cGRhdGUK KyAgICBpZiAocHJldlBhcmVudEVsZW1lbnQgIT09IG5leHRQYXJlbnRFbGVtZW50KSB7CisgICAg ICB3aWxsUmVjZWl2ZSA9IHRydWU7CisgICAgfQorCisgICAgLy8gQW4gdXBkYXRlIGhlcmUgd2ls bCBzY2hlZHVsZSBhbiB1cGRhdGUgYnV0IGltbWVkaWF0ZWx5IHNldAorICAgIC8vIF9wZW5kaW5n U3RhdGVRdWV1ZSB3aGljaCB3aWxsIGVuc3VyZSB0aGF0IGFueSBzdGF0ZSB1cGRhdGVzIGdldHMK KyAgICAvLyBpbW1lZGlhdGVseSByZWNvbmNpbGVkIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgdGhl IG5leHQgYmF0Y2guCisgICAgaWYgKHdpbGxSZWNlaXZlICYmIGluc3QuY29tcG9uZW50V2lsbFJl Y2VpdmVQcm9wcykgeworICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVj dGlvbicpIHsKKyAgICAgICAgbWVhc3VyZUxpZmVDeWNsZVBlcmYoZnVuY3Rpb24gKCkgeworICAg ICAgICAgIHJldHVybiBpbnN0LmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzLCBu ZXh0Q29udGV4dCk7CisgICAgICAgIH0sIHRoaXMuX2RlYnVnSUQsICdjb21wb25lbnRXaWxsUmVj ZWl2ZVByb3BzJyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnN0LmNvbXBvbmVudFdpbGxS ZWNlaXZlUHJvcHMobmV4dFByb3BzLCBuZXh0Q29udGV4dCk7CisgICAgICB9CisgICAgfQorCisg ICAgdmFyIG5leHRTdGF0ZSA9IHRoaXMuX3Byb2Nlc3NQZW5kaW5nU3RhdGUobmV4dFByb3BzLCBu ZXh0Q29udGV4dCk7CisgICAgdmFyIHNob3VsZFVwZGF0ZSA9IHRydWU7CisKKyAgICBpZiAoIXRo aXMuX3BlbmRpbmdGb3JjZVVwZGF0ZSkgeworICAgICAgaWYgKGluc3Quc2hvdWxkQ29tcG9uZW50 VXBkYXRlKSB7CisgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rp b24nKSB7CisgICAgICAgICAgc2hvdWxkVXBkYXRlID0gbWVhc3VyZUxpZmVDeWNsZVBlcmYoZnVu Y3Rpb24gKCkgeworICAgICAgICAgICAgcmV0dXJuIGluc3Quc2hvdWxkQ29tcG9uZW50VXBkYXRl KG5leHRQcm9wcywgbmV4dFN0YXRlLCBuZXh0Q29udGV4dCk7CisgICAgICAgICAgfSwgdGhpcy5f ZGVidWdJRCwgJ3Nob3VsZENvbXBvbmVudFVwZGF0ZScpOworICAgICAgICB9IGVsc2UgeworICAg ICAgICAgIHNob3VsZFVwZGF0ZSA9IGluc3Quc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9w cywgbmV4dFN0YXRlLCBuZXh0Q29udGV4dCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7Cisg ICAgICAgIGlmICh0aGlzLl9jb21wb3NpdGVUeXBlID09PSBDb21wb3NpdGVUeXBlcy5QdXJlQ2xh c3MpIHsKKyAgICAgICAgICBzaG91bGRVcGRhdGUgPSAhc2hhbGxvd0VxdWFsKHByZXZQcm9wcywg bmV4dFByb3BzKSB8fCAhc2hhbGxvd0VxdWFsKGluc3Quc3RhdGUsIG5leHRTdGF0ZSk7CisgICAg ICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09 ICdwcm9kdWN0aW9uJykgeworICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0 aW9uJyA/IHdhcm5pbmcoc2hvdWxkVXBkYXRlICE9PSB1bmRlZmluZWQsICclcy5zaG91bGRDb21w b25lbnRVcGRhdGUoKTogUmV0dXJuZWQgdW5kZWZpbmVkIGluc3RlYWQgb2YgYSAnICsgJ2Jvb2xl YW4gdmFsdWUuIE1ha2Ugc3VyZSB0byByZXR1cm4gdHJ1ZSBvciBmYWxzZS4nLCB0aGlzLmdldE5h bWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IHZvaWQgMDsKKyAgICB9CisKKyAg ICB0aGlzLl91cGRhdGVCYXRjaE51bWJlciA9IG51bGw7CisgICAgaWYgKHNob3VsZFVwZGF0ZSkg eworICAgICAgdGhpcy5fcGVuZGluZ0ZvcmNlVXBkYXRlID0gZmFsc2U7CisgICAgICAvLyBXaWxs IHNldCBgdGhpcy5wcm9wc2AsIGB0aGlzLnN0YXRlYCBhbmQgYHRoaXMuY29udGV4dGAuCisgICAg ICB0aGlzLl9wZXJmb3JtQ29tcG9uZW50VXBkYXRlKG5leHRQYXJlbnRFbGVtZW50LCBuZXh0UHJv cHMsIG5leHRTdGF0ZSwgbmV4dENvbnRleHQsIHRyYW5zYWN0aW9uLCBuZXh0VW5tYXNrZWRDb250 ZXh0KTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gSWYgaXQncyBkZXRlcm1pbmVkIHRoYXQgYSBj b21wb25lbnQgc2hvdWxkIG5vdCB1cGRhdGUsIHdlIHN0aWxsIHdhbnQKKyAgICAgIC8vIHRvIHNl dCBwcm9wcyBhbmQgc3RhdGUgYnV0IHdlIHNob3J0Y3V0IHRoZSByZXN0IG9mIHRoZSB1cGRhdGUu CisgICAgICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IG5leHRQYXJlbnRFbGVtZW50OworICAgICAg dGhpcy5fY29udGV4dCA9IG5leHRVbm1hc2tlZENvbnRleHQ7CisgICAgICBpbnN0LnByb3BzID0g bmV4dFByb3BzOworICAgICAgaW5zdC5zdGF0ZSA9IG5leHRTdGF0ZTsKKyAgICAgIGluc3QuY29u dGV4dCA9IG5leHRDb250ZXh0OworICAgIH0KKyAgfSwKKworICBfcHJvY2Vzc1BlbmRpbmdTdGF0 ZTogZnVuY3Rpb24gKHByb3BzLCBjb250ZXh0KSB7CisgICAgdmFyIGluc3QgPSB0aGlzLl9pbnN0 YW5jZTsKKyAgICB2YXIgcXVldWUgPSB0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZTsKKyAgICB2YXIg cmVwbGFjZSA9IHRoaXMuX3BlbmRpbmdSZXBsYWNlU3RhdGU7CisgICAgdGhpcy5fcGVuZGluZ1Jl cGxhY2VTdGF0ZSA9IGZhbHNlOworICAgIHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlID0gbnVsbDsK KworICAgIGlmICghcXVldWUpIHsKKyAgICAgIHJldHVybiBpbnN0LnN0YXRlOworICAgIH0KKwor ICAgIGlmIChyZXBsYWNlICYmIHF1ZXVlLmxlbmd0aCA9PT0gMSkgeworICAgICAgcmV0dXJuIHF1 ZXVlWzBdOworICAgIH0KKworICAgIHZhciBuZXh0U3RhdGUgPSBfYXNzaWduKHt9LCByZXBsYWNl ID8gcXVldWVbMF0gOiBpbnN0LnN0YXRlKTsKKyAgICBmb3IgKHZhciBpID0gcmVwbGFjZSA/IDEg OiAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciBwYXJ0aWFsID0gcXVldWVb aV07CisgICAgICBfYXNzaWduKG5leHRTdGF0ZSwgdHlwZW9mIHBhcnRpYWwgPT09ICdmdW5jdGlv bicgPyBwYXJ0aWFsLmNhbGwoaW5zdCwgbmV4dFN0YXRlLCBwcm9wcywgY29udGV4dCkgOiBwYXJ0 aWFsKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV4dFN0YXRlOworICB9LAorCisgIC8qKgorICAg KiBNZXJnZXMgbmV3IHByb3BzIGFuZCBzdGF0ZSwgbm90aWZpZXMgZGVsZWdhdGUgbWV0aG9kcyBv ZiB1cGRhdGUgYW5kCisgICAqIHBlcmZvcm1zIHVwZGF0ZS4KKyAgICoKKyAgICogQHBhcmFtIHtS ZWFjdEVsZW1lbnR9IG5leHRFbGVtZW50IE5leHQgZWxlbWVudAorICAgKiBAcGFyYW0ge29iamVj dH0gbmV4dFByb3BzIE5leHQgcHVibGljIG9iamVjdCB0byBzZXQgYXMgcHJvcGVydGllcy4KKyAg ICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0U3RhdGUgTmV4dCBvYmplY3QgdG8gc2V0IGFzIHN0YXRl LgorICAgKiBAcGFyYW0gez9vYmplY3R9IG5leHRDb250ZXh0IE5leHQgcHVibGljIG9iamVjdCB0 byBzZXQgYXMgY29udGV4dC4KKyAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9u fSB0cmFuc2FjdGlvbgorICAgKiBAcGFyYW0gez9vYmplY3R9IHVubWFza2VkQ29udGV4dAorICAg KiBAcHJpdmF0ZQorICAgKi8KKyAgX3BlcmZvcm1Db21wb25lbnRVcGRhdGU6IGZ1bmN0aW9uIChu ZXh0RWxlbWVudCwgbmV4dFByb3BzLCBuZXh0U3RhdGUsIG5leHRDb250ZXh0LCB0cmFuc2FjdGlv biwgdW5tYXNrZWRDb250ZXh0KSB7CisgICAgdmFyIF90aGlzMiA9IHRoaXM7CisKKyAgICB2YXIg aW5zdCA9IHRoaXMuX2luc3RhbmNlOworCisgICAgdmFyIGhhc0NvbXBvbmVudERpZFVwZGF0ZSA9 IEJvb2xlYW4oaW5zdC5jb21wb25lbnREaWRVcGRhdGUpOworICAgIHZhciBwcmV2UHJvcHM7Cisg ICAgdmFyIHByZXZTdGF0ZTsKKyAgICB2YXIgcHJldkNvbnRleHQ7CisgICAgaWYgKGhhc0NvbXBv bmVudERpZFVwZGF0ZSkgeworICAgICAgcHJldlByb3BzID0gaW5zdC5wcm9wczsKKyAgICAgIHBy ZXZTdGF0ZSA9IGluc3Quc3RhdGU7CisgICAgICBwcmV2Q29udGV4dCA9IGluc3QuY29udGV4dDsK KyAgICB9CisKKyAgICBpZiAoaW5zdC5jb21wb25lbnRXaWxsVXBkYXRlKSB7CisgICAgICBpZiAo cHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgICBtZWFzdXJl TGlmZUN5Y2xlUGVyZihmdW5jdGlvbiAoKSB7CisgICAgICAgICAgcmV0dXJuIGluc3QuY29tcG9u ZW50V2lsbFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSwgbmV4dENvbnRleHQpOworICAgICAg ICB9LCB0aGlzLl9kZWJ1Z0lELCAnY29tcG9uZW50V2lsbFVwZGF0ZScpOworICAgICAgfSBlbHNl IHsKKyAgICAgICAgaW5zdC5jb21wb25lbnRXaWxsVXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRl LCBuZXh0Q29udGV4dCk7CisgICAgICB9CisgICAgfQorCisgICAgdGhpcy5fY3VycmVudEVsZW1l bnQgPSBuZXh0RWxlbWVudDsKKyAgICB0aGlzLl9jb250ZXh0ID0gdW5tYXNrZWRDb250ZXh0Owor ICAgIGluc3QucHJvcHMgPSBuZXh0UHJvcHM7CisgICAgaW5zdC5zdGF0ZSA9IG5leHRTdGF0ZTsK KyAgICBpbnN0LmNvbnRleHQgPSBuZXh0Q29udGV4dDsKKworICAgIHRoaXMuX3VwZGF0ZVJlbmRl cmVkQ29tcG9uZW50KHRyYW5zYWN0aW9uLCB1bm1hc2tlZENvbnRleHQpOworCisgICAgaWYgKGhh c0NvbXBvbmVudERpZFVwZGF0ZSkgeworICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9 PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5 KCkuZW5xdWV1ZShmdW5jdGlvbiAoKSB7CisgICAgICAgICAgbWVhc3VyZUxpZmVDeWNsZVBlcmYo aW5zdC5jb21wb25lbnREaWRVcGRhdGUuYmluZChpbnN0LCBwcmV2UHJvcHMsIHByZXZTdGF0ZSwg cHJldkNvbnRleHQpLCBfdGhpczIuX2RlYnVnSUQsICdjb21wb25lbnREaWRVcGRhdGUnKTsKKyAg ICAgICAgfSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1v dW50UmVhZHkoKS5lbnF1ZXVlKGluc3QuY29tcG9uZW50RGlkVXBkYXRlLmJpbmQoaW5zdCwgcHJl dlByb3BzLCBwcmV2U3RhdGUsIHByZXZDb250ZXh0KSwgaW5zdCk7CisgICAgICB9CisgICAgfQor ICB9LAorCisgIC8qKgorICAgKiBDYWxsIHRoZSBjb21wb25lbnQncyBgcmVuZGVyYCBtZXRob2Qg YW5kIHVwZGF0ZSB0aGUgRE9NIGFjY29yZGluZ2x5LgorICAgKgorICAgKiBAcGFyYW0ge1JlYWN0 UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uCisgICAqIEBpbnRlcm5hbAorICAgKi8K KyAgX3VwZGF0ZVJlbmRlcmVkQ29tcG9uZW50OiBmdW5jdGlvbiAodHJhbnNhY3Rpb24sIGNvbnRl eHQpIHsKKyAgICB2YXIgcHJldkNvbXBvbmVudEluc3RhbmNlID0gdGhpcy5fcmVuZGVyZWRDb21w b25lbnQ7CisgICAgdmFyIHByZXZSZW5kZXJlZEVsZW1lbnQgPSBwcmV2Q29tcG9uZW50SW5zdGFu Y2UuX2N1cnJlbnRFbGVtZW50OworICAgIHZhciBuZXh0UmVuZGVyZWRFbGVtZW50ID0gdGhpcy5f cmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50KCk7CisKKyAgICB2YXIgZGVidWdJRCA9IDA7CisgICAg aWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIGRlYnVn SUQgPSB0aGlzLl9kZWJ1Z0lEOworICAgIH0KKworICAgIGlmIChzaG91bGRVcGRhdGVSZWFjdENv bXBvbmVudChwcmV2UmVuZGVyZWRFbGVtZW50LCBuZXh0UmVuZGVyZWRFbGVtZW50KSkgeworICAg ICAgUmVhY3RSZWNvbmNpbGVyLnJlY2VpdmVDb21wb25lbnQocHJldkNvbXBvbmVudEluc3RhbmNl LCBuZXh0UmVuZGVyZWRFbGVtZW50LCB0cmFuc2FjdGlvbiwgdGhpcy5fcHJvY2Vzc0NoaWxkQ29u dGV4dChjb250ZXh0KSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBvbGRIb3N0Tm9kZSA9IFJl YWN0UmVjb25jaWxlci5nZXRIb3N0Tm9kZShwcmV2Q29tcG9uZW50SW5zdGFuY2UpOworICAgICAg UmVhY3RSZWNvbmNpbGVyLnVubW91bnRDb21wb25lbnQocHJldkNvbXBvbmVudEluc3RhbmNlLCBm YWxzZSk7CisKKyAgICAgIHZhciBub2RlVHlwZSA9IFJlYWN0Tm9kZVR5cGVzLmdldFR5cGUobmV4 dFJlbmRlcmVkRWxlbWVudCk7CisgICAgICB0aGlzLl9yZW5kZXJlZE5vZGVUeXBlID0gbm9kZVR5 cGU7CisgICAgICB2YXIgY2hpbGQgPSB0aGlzLl9pbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50KG5l eHRSZW5kZXJlZEVsZW1lbnQsIG5vZGVUeXBlICE9PSBSZWFjdE5vZGVUeXBlcy5FTVBUWSAvKiBz aG91bGRIYXZlRGVidWdJRCAqLworICAgICAgKTsKKyAgICAgIHRoaXMuX3JlbmRlcmVkQ29tcG9u ZW50ID0gY2hpbGQ7CisKKyAgICAgIHZhciBuZXh0TWFya3VwID0gUmVhY3RSZWNvbmNpbGVyLm1v dW50Q29tcG9uZW50KGNoaWxkLCB0cmFuc2FjdGlvbiwgdGhpcy5faG9zdFBhcmVudCwgdGhpcy5f aG9zdENvbnRhaW5lckluZm8sIHRoaXMuX3Byb2Nlc3NDaGlsZENvbnRleHQoY29udGV4dCksIGRl YnVnSUQpOworCisgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9u JykgeworICAgICAgICBpZiAoZGVidWdJRCAhPT0gMCkgeworICAgICAgICAgIHZhciBjaGlsZERl YnVnSURzID0gY2hpbGQuX2RlYnVnSUQgIT09IDAgPyBbY2hpbGQuX2RlYnVnSURdIDogW107Cisg ICAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uU2V0Q2hpbGRyZW4oZGVi dWdJRCwgY2hpbGREZWJ1Z0lEcyk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGhpcy5f cmVwbGFjZU5vZGVXaXRoTWFya3VwKG9sZEhvc3ROb2RlLCBuZXh0TWFya3VwLCBwcmV2Q29tcG9u ZW50SW5zdGFuY2UpOworICAgIH0KKyAgfSwKKworICAvKioKKyAgICogT3ZlcnJpZGRlbiBpbiBz aGFsbG93IHJlbmRlcmluZy4KKyAgICoKKyAgICogQHByb3RlY3RlZAorICAgKi8KKyAgX3JlcGxh Y2VOb2RlV2l0aE1hcmt1cDogZnVuY3Rpb24gKG9sZEhvc3ROb2RlLCBuZXh0TWFya3VwLCBwcmV2 SW5zdGFuY2UpIHsKKyAgICBSZWFjdENvbXBvbmVudEVudmlyb25tZW50LnJlcGxhY2VOb2RlV2l0 aE1hcmt1cChvbGRIb3N0Tm9kZSwgbmV4dE1hcmt1cCwgcHJldkluc3RhbmNlKTsKKyAgfSwKKwor ICAvKioKKyAgICogQHByb3RlY3RlZAorICAgKi8KKyAgX3JlbmRlclZhbGlkYXRlZENvbXBvbmVu dFdpdGhvdXRPd25lck9yQ29udGV4dDogZnVuY3Rpb24gKCkgeworICAgIHZhciBpbnN0ID0gdGhp cy5faW5zdGFuY2U7CisgICAgdmFyIHJlbmRlcmVkRWxlbWVudDsKKworICAgIGlmIChwcm9jZXNz LmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICByZW5kZXJlZEVsZW1lbnQg PSBtZWFzdXJlTGlmZUN5Y2xlUGVyZihmdW5jdGlvbiAoKSB7CisgICAgICAgIHJldHVybiBpbnN0 LnJlbmRlcigpOworICAgICAgfSwgdGhpcy5fZGVidWdJRCwgJ3JlbmRlcicpOworICAgIH0gZWxz ZSB7CisgICAgICByZW5kZXJlZEVsZW1lbnQgPSBpbnN0LnJlbmRlcigpOworICAgIH0KKworICAg IGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAvLyBX ZSBhbGxvdyBhdXRvLW1vY2tzIHRvIHByb2NlZWQgYXMgaWYgdGhleSdyZSByZXR1cm5pbmcgbnVs bC4KKyAgICAgIGlmIChyZW5kZXJlZEVsZW1lbnQgPT09IHVuZGVmaW5lZCAmJiBpbnN0LnJlbmRl ci5faXNNb2NrRnVuY3Rpb24pIHsKKyAgICAgICAgLy8gVGhpcyBpcyBwcm9iYWJseSBiYWQgcHJh Y3RpY2UuIENvbnNpZGVyIHdhcm5pbmcgaGVyZSBhbmQKKyAgICAgICAgLy8gZGVwcmVjYXRpbmcg dGhpcyBjb252ZW5pZW5jZS4KKyAgICAgICAgcmVuZGVyZWRFbGVtZW50ID0gbnVsbDsKKyAgICAg IH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVuZGVyZWRFbGVtZW50OworICB9LAorCisgIC8qKgor ICAgKiBAcHJpdmF0ZQorICAgKi8KKyAgX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudDogZnVuY3Rp b24gKCkgeworICAgIHZhciByZW5kZXJlZEVsZW1lbnQ7CisgICAgaWYgKHByb2Nlc3MuZW52Lk5P REVfRU5WICE9PSAncHJvZHVjdGlvbicgfHwgdGhpcy5fY29tcG9zaXRlVHlwZSAhPT0gQ29tcG9z aXRlVHlwZXMuU3RhdGVsZXNzRnVuY3Rpb25hbCkgeworICAgICAgUmVhY3RDdXJyZW50T3duZXIu Y3VycmVudCA9IHRoaXM7CisgICAgICB0cnkgeworICAgICAgICByZW5kZXJlZEVsZW1lbnQgPSB0 aGlzLl9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnRXaXRob3V0T3duZXJPckNvbnRleHQoKTsKKyAg ICAgIH0gZmluYWxseSB7CisgICAgICAgIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgPSBudWxs OworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZW5kZXJlZEVsZW1lbnQgPSB0aGlzLl9y ZW5kZXJWYWxpZGF0ZWRDb21wb25lbnRXaXRob3V0T3duZXJPckNvbnRleHQoKTsKKyAgICB9Cisg ICAgISgKKyAgICAvLyBUT0RPOiBBbiBgaXNWYWxpZE5vZGVgIGZ1bmN0aW9uIHdvdWxkIHByb2Jh Ymx5IGJlIG1vcmUgYXBwcm9wcmlhdGUKKyAgICByZW5kZXJlZEVsZW1lbnQgPT09IG51bGwgfHwg cmVuZGVyZWRFbGVtZW50ID09PSBmYWxzZSB8fCBSZWFjdC5pc1ZhbGlkRWxlbWVudChyZW5kZXJl ZEVsZW1lbnQpKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZh cmlhbnQoZmFsc2UsICclcy5yZW5kZXIoKTogQSB2YWxpZCBSZWFjdCBlbGVtZW50IChvciBudWxs KSBtdXN0IGJlIHJldHVybmVkLiBZb3UgbWF5IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLCBhbiBh cnJheSBvciBzb21lIG90aGVyIGludmFsaWQgb2JqZWN0LicsIHRoaXMuZ2V0TmFtZSgpIHx8ICdS ZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcpIDogX3Byb2RJbnZhcmlhbnQoJzEwOScsIHRoaXMuZ2V0 TmFtZSgpIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcpIDogdm9pZCAwOworCisgICAgcmV0 dXJuIHJlbmRlcmVkRWxlbWVudDsKKyAgfSwKKworICAvKioKKyAgICogTGF6aWx5IGFsbG9jYXRl cyB0aGUgcmVmcyBvYmplY3QgYW5kIHN0b3JlcyBgY29tcG9uZW50YCBhcyBgcmVmYC4KKyAgICoK KyAgICogQHBhcmFtIHtzdHJpbmd9IHJlZiBSZWZlcmVuY2UgbmFtZS4KKyAgICogQHBhcmFtIHtj b21wb25lbnR9IGNvbXBvbmVudCBDb21wb25lbnQgdG8gc3RvcmUgYXMgYHJlZmAuCisgICAqIEBm aW5hbAorICAgKiBAcHJpdmF0ZQorICAgKi8KKyAgYXR0YWNoUmVmOiBmdW5jdGlvbiAocmVmLCBj b21wb25lbnQpIHsKKyAgICB2YXIgaW5zdCA9IHRoaXMuZ2V0UHVibGljSW5zdGFuY2UoKTsKKyAg ICAhKGluc3QgIT0gbnVsbCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24n ID8gaW52YXJpYW50KGZhbHNlLCAnU3RhdGVsZXNzIGZ1bmN0aW9uIGNvbXBvbmVudHMgY2Fubm90 IGhhdmUgcmVmcy4nKSA6IF9wcm9kSW52YXJpYW50KCcxMTAnKSA6IHZvaWQgMDsKKyAgICB2YXIg cHVibGljQ29tcG9uZW50SW5zdGFuY2UgPSBjb21wb25lbnQuZ2V0UHVibGljSW5zdGFuY2UoKTsK KyAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAg dmFyIGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnQgJiYgY29tcG9uZW50LmdldE5hbWUgPyBjb21w b25lbnQuZ2V0TmFtZSgpIDogJ2EgY29tcG9uZW50JzsKKyAgICAgIHByb2Nlc3MuZW52Lk5PREVf RU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHB1YmxpY0NvbXBvbmVudEluc3RhbmNlICE9 IG51bGwgfHwgY29tcG9uZW50Ll9jb21wb3NpdGVUeXBlICE9PSBDb21wb3NpdGVUeXBlcy5TdGF0 ZWxlc3NGdW5jdGlvbmFsLCAnU3RhdGVsZXNzIGZ1bmN0aW9uIGNvbXBvbmVudHMgY2Fubm90IGJl IGdpdmVuIHJlZnMgJyArICcoU2VlIHJlZiAiJXMiIGluICVzIGNyZWF0ZWQgYnkgJXMpLiAnICsg J0F0dGVtcHRzIHRvIGFjY2VzcyB0aGlzIHJlZiB3aWxsIGZhaWwuJywgcmVmLCBjb21wb25lbnRO YW1lLCB0aGlzLmdldE5hbWUoKSkgOiB2b2lkIDA7CisgICAgfQorICAgIHZhciByZWZzID0gaW5z dC5yZWZzID09PSBlbXB0eU9iamVjdCA/IGluc3QucmVmcyA9IHt9IDogaW5zdC5yZWZzOworICAg IHJlZnNbcmVmXSA9IHB1YmxpY0NvbXBvbmVudEluc3RhbmNlOworICB9LAorCisgIC8qKgorICAg KiBEZXRhY2hlcyBhIHJlZmVyZW5jZSBuYW1lLgorICAgKgorICAgKiBAcGFyYW0ge3N0cmluZ30g cmVmIE5hbWUgdG8gZGVyZWZlcmVuY2UuCisgICAqIEBmaW5hbAorICAgKiBAcHJpdmF0ZQorICAg Ki8KKyAgZGV0YWNoUmVmOiBmdW5jdGlvbiAocmVmKSB7CisgICAgdmFyIHJlZnMgPSB0aGlzLmdl dFB1YmxpY0luc3RhbmNlKCkucmVmczsKKyAgICBkZWxldGUgcmVmc1tyZWZdOworICB9LAorCisg IC8qKgorICAgKiBHZXQgYSB0ZXh0IGRlc2NyaXB0aW9uIG9mIHRoZSBjb21wb25lbnQgdGhhdCBj YW4gYmUgdXNlZCB0byBpZGVudGlmeSBpdAorICAgKiBpbiBlcnJvciBtZXNzYWdlcy4KKyAgICog QHJldHVybiB7c3RyaW5nfSBUaGUgbmFtZSBvciBudWxsLgorICAgKiBAaW50ZXJuYWwKKyAgICov CisgIGdldE5hbWU6IGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgdHlwZSA9IHRoaXMuX2N1cnJlbnRF bGVtZW50LnR5cGU7CisgICAgdmFyIGNvbnN0cnVjdG9yID0gdGhpcy5faW5zdGFuY2UgJiYgdGhp cy5faW5zdGFuY2UuY29uc3RydWN0b3I7CisgICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwg Y29uc3RydWN0b3IgJiYgY29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IGNv bnN0cnVjdG9yICYmIGNvbnN0cnVjdG9yLm5hbWUgfHwgbnVsbDsKKyAgfSwKKworICAvKioKKyAg ICogR2V0IHRoZSBwdWJsaWNseSBhY2Nlc3NpYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29t cG9uZW50IC0gaS5lLiB3aGF0CisgICAqIGlzIGV4cG9zZWQgYnkgcmVmcyBhbmQgcmV0dXJuZWQg YnkgcmVuZGVyLiBDYW4gYmUgbnVsbCBmb3Igc3RhdGVsZXNzCisgICAqIGNvbXBvbmVudHMuCisg ICAqCisgICAqIEByZXR1cm4ge1JlYWN0Q29tcG9uZW50fSB0aGUgcHVibGljIGNvbXBvbmVudCBp bnN0YW5jZS4KKyAgICogQGludGVybmFsCisgICAqLworICBnZXRQdWJsaWNJbnN0YW5jZTogZnVu Y3Rpb24gKCkgeworICAgIHZhciBpbnN0ID0gdGhpcy5faW5zdGFuY2U7CisgICAgaWYgKHRoaXMu X2NvbXBvc2l0ZVR5cGUgPT09IENvbXBvc2l0ZVR5cGVzLlN0YXRlbGVzc0Z1bmN0aW9uYWwpIHsK KyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICByZXR1cm4gaW5zdDsKKyAgfSwKKworICAv LyBTdHViCisgIF9pbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50OiBudWxsCisKK307CisKK21vZHVs ZS5leHBvcnRzID0gUmVhY3RDb21wb3NpdGVDb21wb25lbnQ7ClwgTm8gbmV3bGluZSBhdCBlbmQg b2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20v bGliL1JlYWN0Q29yb3V0aW5lLmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1k b20vbGliL1JlYWN0Q29yb3V0aW5lLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAwLi43MjgxMTI2MwotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5k b3IvcmVhY3QtZG9tL2xpYi9SZWFjdENvcm91dGluZS5qcwpAQCAtMCwwICsxLDgwIEBACisvKioK KyAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRz IHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhl IEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSBy b290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50Cisg KiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRo ZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisKKy8vIFRo ZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIHNwZWNpYWwgUmVhY3QgdHlwZXMuIElmIHRoZXJlIGlz IG5vIG5hdGl2ZSBTeW1ib2wKKy8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJlciBp cyB1c2VkIGZvciBwZXJmb3JtYW5jZS4KK3ZhciBSRUFDVF9DT1JPVVRJTkVfVFlQRSA9IHR5cGVv ZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sWydmb3InXSAmJiBTeW1ib2xbJ2Zvcidd KCdyZWFjdC5jb3JvdXRpbmUnKSB8fCAweGVhYzg7CisKK3ZhciBSRUFDVF9ZSUVMRF9UWVBFID0g dHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2xbJ2ZvciddICYmIFN5bWJvbFsn Zm9yJ10oJ3JlYWN0LnlpZWxkJykgfHwgMHhlYWM5OworCitleHBvcnRzLmNyZWF0ZUNvcm91dGlu ZSA9IGZ1bmN0aW9uIChjaGlsZHJlbiwgaGFuZGxlciwgcHJvcHMpIHsKKyAgdmFyIGtleSA9IGFy Z3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1l bnRzWzNdIDogbnVsbDsKKworICB2YXIgY29yb3V0aW5lID0geworICAgIC8vIFRoaXMgdGFnIGFs bG93IHVzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgYXMgYSBSZWFjdCBDb3JvdXRpbmUKKyAg ICAkJHR5cGVvZjogUkVBQ1RfQ09ST1VUSU5FX1RZUEUsCisgICAga2V5OiBrZXkgPT0gbnVsbCA/ IG51bGwgOiAnJyArIGtleSwKKyAgICBjaGlsZHJlbjogY2hpbGRyZW4sCisgICAgaGFuZGxlcjog aGFuZGxlciwKKyAgICBwcm9wczogcHJvcHMKKyAgfTsKKworICBpZiAocHJvY2Vzcy5lbnYuTk9E RV9FTlYgIT09ICdwcm9kdWN0aW9uJykgeworICAgIC8vIFRPRE86IEFkZCBfc3RvcmUgcHJvcGVy dHkgZm9yIG1hcmtpbmcgdGhpcyBhcyB2YWxpZGF0ZWQuCisgICAgaWYgKE9iamVjdC5mcmVlemUp IHsKKyAgICAgIE9iamVjdC5mcmVlemUoY29yb3V0aW5lLnByb3BzKTsKKyAgICAgIE9iamVjdC5m cmVlemUoY29yb3V0aW5lKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gY29yb3V0aW5lOworfTsK KworZXhwb3J0cy5jcmVhdGVZaWVsZCA9IGZ1bmN0aW9uIChwcm9wcywgY29udGludWF0aW9uKSB7 CisgIHZhciBrZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVu ZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7CisKKyAgdmFyIHlpZWxkTm9kZSA9IHsKKyAg ICAvLyBUaGlzIHRhZyBhbGxvdyB1cyB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIGFzIGEgUmVh Y3QgWWllbGQKKyAgICAkJHR5cGVvZjogUkVBQ1RfWUlFTERfVFlQRSwKKyAgICBrZXk6IGtleSA9 PSBudWxsID8gbnVsbCA6ICcnICsga2V5LAorICAgIHByb3BzOiBwcm9wcywKKyAgICBjb250aW51 YXRpb246IGNvbnRpbnVhdGlvbgorICB9OworCisgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAh PT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgLy8gVE9ETzogQWRkIF9zdG9yZSBwcm9wZXJ0eSBmb3Ig bWFya2luZyB0aGlzIGFzIHZhbGlkYXRlZC4KKyAgICBpZiAoT2JqZWN0LmZyZWV6ZSkgeworICAg ICAgT2JqZWN0LmZyZWV6ZSh5aWVsZE5vZGUucHJvcHMpOworICAgICAgT2JqZWN0LmZyZWV6ZSh5 aWVsZE5vZGUpOworICAgIH0KKyAgfQorCisgIHJldHVybiB5aWVsZE5vZGU7Cit9OworCisvKioK KyAqIFZlcmlmaWVzIHRoZSBvYmplY3QgaXMgYSBjb3JvdXRpbmUgb2JqZWN0LgorICovCitleHBv cnRzLmlzQ29yb3V0aW5lID0gZnVuY3Rpb24gKG9iamVjdCkgeworICByZXR1cm4gdHlwZW9mIG9i amVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9 PT0gUkVBQ1RfQ09ST1VUSU5FX1RZUEU7Cit9OworCisvKioKKyAqIFZlcmlmaWVzIHRoZSBvYmpl Y3QgaXMgYSB5aWVsZCBvYmplY3QuCisgKi8KK2V4cG9ydHMuaXNZaWVsZCA9IGZ1bmN0aW9uIChv YmplY3QpIHsKKyAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAh PT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX1lJRUxEX1RZUEU7Cit9OworCitl eHBvcnRzLlJFQUNUX1lJRUxEX1RZUEUgPSBSRUFDVF9ZSUVMRF9UWVBFOworZXhwb3J0cy5SRUFD VF9DT1JPVVRJTkVfVFlQRSA9IFJFQUNUX0NPUk9VVElORV9UWVBFOwpcIE5vIG5ld2xpbmUgYXQg ZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3Qt ZG9tL2xpYi9SZWFjdERPTS5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9t L2xpYi9SZWFjdERPTS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uMTA1 Y2FlMTQKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0 LWRvbS9saWIvUmVhY3RET00uanMKQEAgLTAsMCArMSwxMTAgQEAKKy8qKgorICogQ29weXJpZ2h0 IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg KgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxp Y2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5 IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCBy aWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0 b3J5LgorICoKKyAqLworCisvKiBnbG9iYWxzIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tf XyovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVp cmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7Cit2YXIgUmVhY3REZWZhdWx0SW5qZWN0aW9u ID0gcmVxdWlyZSgnLi9SZWFjdERlZmF1bHRJbmplY3Rpb24nKTsKK3ZhciBSZWFjdE1vdW50ID0g cmVxdWlyZSgnLi9SZWFjdE1vdW50Jyk7Cit2YXIgUmVhY3RSZWNvbmNpbGVyID0gcmVxdWlyZSgn Li9SZWFjdFJlY29uY2lsZXInKTsKK3ZhciBSZWFjdFVwZGF0ZXMgPSByZXF1aXJlKCcuL1JlYWN0 VXBkYXRlcycpOwordmFyIFJlYWN0VmVyc2lvbiA9IHJlcXVpcmUoJy4vUmVhY3RWZXJzaW9uJyk7 CisKK3ZhciBmaW5kRE9NTm9kZSA9IHJlcXVpcmUoJy4vZmluZERPTU5vZGUnKTsKK3ZhciBnZXRI b3N0Q29tcG9uZW50RnJvbUNvbXBvc2l0ZSA9IHJlcXVpcmUoJy4vZ2V0SG9zdENvbXBvbmVudEZy b21Db21wb3NpdGUnKTsKK3ZhciByZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lciA9IHJlcXVpcmUo Jy4vcmVuZGVyU3VidHJlZUludG9Db250YWluZXInKTsKK3ZhciB3YXJuaW5nID0gcmVxdWlyZSgn ZmJqcy9saWIvd2FybmluZycpOworCitSZWFjdERlZmF1bHRJbmplY3Rpb24uaW5qZWN0KCk7CisK K3ZhciBSZWFjdERPTSA9IHsKKyAgZmluZERPTU5vZGU6IGZpbmRET01Ob2RlLAorICByZW5kZXI6 IFJlYWN0TW91bnQucmVuZGVyLAorICB1bm1vdW50Q29tcG9uZW50QXROb2RlOiBSZWFjdE1vdW50 LnVubW91bnRDb21wb25lbnRBdE5vZGUsCisgIHZlcnNpb246IFJlYWN0VmVyc2lvbiwKKworICAv KiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi8KKyAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXM6 IFJlYWN0VXBkYXRlcy5iYXRjaGVkVXBkYXRlcywKKyAgdW5zdGFibGVfcmVuZGVyU3VidHJlZUlu dG9Db250YWluZXI6IHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyCit9OworCisvLyBJbmplY3Qg dGhlIHJ1bnRpbWUgaW50byBhIGRldnRvb2xzIGdsb2JhbCBob29rIHJlZ2FyZGxlc3Mgb2YgYnJv d3Nlci4KKy8vIEFsbG93cyBmb3IgZGVidWdnaW5nIHdoZW4gdGhlIGhvb2sgaXMgaW5qZWN0ZWQg b24gdGhlIHBhZ2UuCitpZiAodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAh PT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5p bmplY3QgPT09ICdmdW5jdGlvbicpIHsKKyAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19f LmluamVjdCh7CisgICAgQ29tcG9uZW50VHJlZTogeworICAgICAgZ2V0Q2xvc2VzdEluc3RhbmNl RnJvbU5vZGU6IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9k ZSwKKyAgICAgIGdldE5vZGVGcm9tSW5zdGFuY2U6IGZ1bmN0aW9uIChpbnN0KSB7CisgICAgICAg IC8vIGluc3QgaXMgYW4gaW50ZXJuYWwgaW5zdGFuY2UgKGJ1dCBjb3VsZCBiZSBhIGNvbXBvc2l0 ZSkKKyAgICAgICAgaWYgKGluc3QuX3JlbmRlcmVkQ29tcG9uZW50KSB7CisgICAgICAgICAgaW5z dCA9IGdldEhvc3RDb21wb25lbnRGcm9tQ29tcG9zaXRlKGluc3QpOworICAgICAgICB9CisgICAg ICAgIGlmIChpbnN0KSB7CisgICAgICAgICAgcmV0dXJuIFJlYWN0RE9NQ29tcG9uZW50VHJlZS5n ZXROb2RlRnJvbUluc3RhbmNlKGluc3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJl dHVybiBudWxsOworICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICBNb3VudDogUmVhY3RN b3VudCwKKyAgICBSZWNvbmNpbGVyOiBSZWFjdFJlY29uY2lsZXIKKyAgfSk7Cit9CisKK2lmIChw cm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgIHZhciBFeGVjdXRpb25F bnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7Cisg IGlmIChFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gJiYgd2luZG93LnRvcCA9PT0gd2lu ZG93LnNlbGYpIHsKKworICAgIC8vIEZpcnN0IGNoZWNrIGlmIGRldnRvb2xzIGlzIG5vdCBpbnN0 YWxsZWQKKyAgICBpZiAodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyA9PT0g J3VuZGVmaW5lZCcpIHsKKyAgICAgIC8vIElmIHdlJ3JlIGluIENocm9tZSBvciBGaXJlZm94LCBw cm92aWRlIGEgZG93bmxvYWQgbGluayBpZiBub3QgaW5zdGFsbGVkLgorICAgICAgaWYgKG5hdmln YXRvci51c2VyQWdlbnQuaW5kZXhPZignQ2hyb21lJykgPiAtMSAmJiBuYXZpZ2F0b3IudXNlckFn ZW50LmluZGV4T2YoJ0VkZ2UnKSA9PT0gLTEgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9m KCdGaXJlZm94JykgPiAtMSkgeworICAgICAgICAvLyBGaXJlZm94IGRvZXMgbm90IGhhdmUgdGhl IGlzc3VlIHdpdGggZGV2dG9vbHMgbG9hZGVkIG92ZXIgZmlsZTovLworICAgICAgICB2YXIgc2hv d0ZpbGVVcmxNZXNzYWdlID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sLmluZGV4T2YoJ2h0dHAn KSA9PT0gLTEgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdGaXJlZm94JykgPT09IC0x OworICAgICAgICBjb25zb2xlLmRlYnVnKCdEb3dubG9hZCB0aGUgUmVhY3QgRGV2VG9vbHMgJyAr IChzaG93RmlsZVVybE1lc3NhZ2UgPyAnYW5kIHVzZSBhbiBIVFRQIHNlcnZlciAoaW5zdGVhZCBv ZiBhIGZpbGU6IFVSTCkgJyA6ICcnKSArICdmb3IgYSBiZXR0ZXIgZGV2ZWxvcG1lbnQgZXhwZXJp ZW5jZTogJyArICdodHRwczovL2ZiLm1lL3JlYWN0LWRldnRvb2xzJyk7CisgICAgICB9CisgICAg fQorCisgICAgdmFyIHRlc3RGdW5jID0gZnVuY3Rpb24gdGVzdEZuKCkge307CisgICAgcHJvY2Vz cy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoKHRlc3RGdW5jLm5hbWUg fHwgdGVzdEZ1bmMudG9TdHJpbmcoKSkuaW5kZXhPZigndGVzdEZuJykgIT09IC0xLCAnSXQgbG9v a3MgbGlrZSB5b3VcJ3JlIHVzaW5nIGEgbWluaWZpZWQgY29weSBvZiB0aGUgZGV2ZWxvcG1lbnQg YnVpbGQgJyArICdvZiBSZWFjdC4gV2hlbiBkZXBsb3lpbmcgUmVhY3QgYXBwcyB0byBwcm9kdWN0 aW9uLCBtYWtlIHN1cmUgdG8gdXNlICcgKyAndGhlIHByb2R1Y3Rpb24gYnVpbGQgd2hpY2ggc2tp cHMgZGV2ZWxvcG1lbnQgd2FybmluZ3MgYW5kIGlzIGZhc3Rlci4gJyArICdTZWUgaHR0cHM6Ly9m Yi5tZS9yZWFjdC1taW5pZmljYXRpb24gZm9yIG1vcmUgZGV0YWlscy4nKSA6IHZvaWQgMDsKKwor ICAgIC8vIElmIHdlJ3JlIGluIElFOCwgY2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBpbiBjb21wYXRp YmlsaXR5IG1vZGUgYW5kIHByb3ZpZGUKKyAgICAvLyBpbmZvcm1hdGlvbiBvbiBwcmV2ZW50aW5n IGNvbXBhdGliaWxpdHkgbW9kZQorICAgIHZhciBpZUNvbXBhdGliaWxpdHlNb2RlID0gZG9jdW1l bnQuZG9jdW1lbnRNb2RlICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSA8IDg7CisKKyAgICBwcm9j ZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghaWVDb21wYXRpYmls aXR5TW9kZSwgJ0ludGVybmV0IEV4cGxvcmVyIGlzIHJ1bm5pbmcgaW4gY29tcGF0aWJpbGl0eSBt b2RlOyBwbGVhc2UgYWRkIHRoZSAnICsgJ2ZvbGxvd2luZyB0YWcgdG8geW91ciBIVE1MIHRvIHBy ZXZlbnQgdGhpcyBmcm9tIGhhcHBlbmluZzogJyArICc8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNv bXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiIC8+JykgOiB2b2lkIDA7CisKKyAgICB2YXIgZXhw ZWN0ZWRGZWF0dXJlcyA9IFsKKyAgICAvLyBzaGltcworICAgIEFycmF5LmlzQXJyYXksIEFycmF5 LnByb3RvdHlwZS5ldmVyeSwgQXJyYXkucHJvdG90eXBlLmZvckVhY2gsIEFycmF5LnByb3RvdHlw ZS5pbmRleE9mLCBBcnJheS5wcm90b3R5cGUubWFwLCBEYXRlLm5vdywgRnVuY3Rpb24ucHJvdG90 eXBlLmJpbmQsIE9iamVjdC5rZXlzLCBTdHJpbmcucHJvdG90eXBlLnRyaW1dOworCisgICAgZm9y ICh2YXIgaSA9IDA7IGkgPCBleHBlY3RlZEZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7CisgICAgICBp ZiAoIWV4cGVjdGVkRmVhdHVyZXNbaV0pIHsKKyAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYg IT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdPbmUgb3IgbW9yZSBFUzUgc2hpbXMg ZXhwZWN0ZWQgYnkgUmVhY3QgYXJlIG5vdCBhdmFpbGFibGU6ICcgKyAnaHR0cHM6Ly9mYi5tZS9y ZWFjdC13YXJuaW5nLXBvbHlmaWxscycpIDogdm9pZCAwOworICAgICAgICBicmVhazsKKyAgICAg IH0KKyAgICB9CisgIH0KK30KKworaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVj dGlvbicpIHsKKyAgdmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdElu c3RydW1lbnRhdGlvbicpOworICB2YXIgUmVhY3RET01Vbmtub3duUHJvcGVydHlIb29rID0gcmVx dWlyZSgnLi9SZWFjdERPTVVua25vd25Qcm9wZXJ0eUhvb2snKTsKKyAgdmFyIFJlYWN0RE9NTnVs bElucHV0VmFsdWVQcm9wSG9vayA9IHJlcXVpcmUoJy4vUmVhY3RET01OdWxsSW5wdXRWYWx1ZVBy b3BIb29rJyk7CisgIHZhciBSZWFjdERPTUludmFsaWRBUklBSG9vayA9IHJlcXVpcmUoJy4vUmVh Y3RET01JbnZhbGlkQVJJQUhvb2snKTsKKworICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rv b2wuYWRkSG9vayhSZWFjdERPTVVua25vd25Qcm9wZXJ0eUhvb2spOworICBSZWFjdEluc3RydW1l bnRhdGlvbi5kZWJ1Z1Rvb2wuYWRkSG9vayhSZWFjdERPTU51bGxJbnB1dFZhbHVlUHJvcEhvb2sp OworICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wuYWRkSG9vayhSZWFjdERPTUludmFs aWRBUklBSG9vayk7Cit9CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RET007ClwgTm8gbmV3bGlu ZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9y ZWFjdC1kb20vbGliL1JlYWN0RE9NQ29tcG9uZW50LmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3Zl bmRvci9yZWFjdC1kb20vbGliL1JlYWN0RE9NQ29tcG9uZW50LmpzCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAwLi43MjU5MThjYQotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2Fk bWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdERPTUNvbXBvbmVudC5qcwpAQCAt MCwwICsxLDEwMDAgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ss IEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBp cyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBM SUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFu IGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRo ZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisvKiBnbG9i YWwgaGFzT3duUHJvcGVydHk6dHJ1ZSAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJvZElu dmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50JyksCisgICAgX2Fzc2lnbiA9 IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTsKKwordmFyIEF1dG9Gb2N1c1V0aWxzID0gcmVxdWly ZSgnLi9BdXRvRm9jdXNVdGlscycpOwordmFyIENTU1Byb3BlcnR5T3BlcmF0aW9ucyA9IHJlcXVp cmUoJy4vQ1NTUHJvcGVydHlPcGVyYXRpb25zJyk7Cit2YXIgRE9NTGF6eVRyZWUgPSByZXF1aXJl KCcuL0RPTUxhenlUcmVlJyk7Cit2YXIgRE9NTmFtZXNwYWNlcyA9IHJlcXVpcmUoJy4vRE9NTmFt ZXNwYWNlcycpOwordmFyIERPTVByb3BlcnR5ID0gcmVxdWlyZSgnLi9ET01Qcm9wZXJ0eScpOwor dmFyIERPTVByb3BlcnR5T3BlcmF0aW9ucyA9IHJlcXVpcmUoJy4vRE9NUHJvcGVydHlPcGVyYXRp b25zJyk7Cit2YXIgRXZlbnRQbHVnaW5IdWIgPSByZXF1aXJlKCcuL0V2ZW50UGx1Z2luSHViJyk7 Cit2YXIgRXZlbnRQbHVnaW5SZWdpc3RyeSA9IHJlcXVpcmUoJy4vRXZlbnRQbHVnaW5SZWdpc3Ry eScpOwordmFyIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJy4vUmVhY3RCcm93 c2VyRXZlbnRFbWl0dGVyJyk7Cit2YXIgUmVhY3RET01Db21wb25lbnRGbGFncyA9IHJlcXVpcmUo Jy4vUmVhY3RET01Db21wb25lbnRGbGFncycpOwordmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9 IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7Cit2YXIgUmVhY3RET01JbnB1dCA9 IHJlcXVpcmUoJy4vUmVhY3RET01JbnB1dCcpOwordmFyIFJlYWN0RE9NT3B0aW9uID0gcmVxdWly ZSgnLi9SZWFjdERPTU9wdGlvbicpOwordmFyIFJlYWN0RE9NU2VsZWN0ID0gcmVxdWlyZSgnLi9S ZWFjdERPTVNlbGVjdCcpOwordmFyIFJlYWN0RE9NVGV4dGFyZWEgPSByZXF1aXJlKCcuL1JlYWN0 RE9NVGV4dGFyZWEnKTsKK3ZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vUmVh Y3RJbnN0cnVtZW50YXRpb24nKTsKK3ZhciBSZWFjdE11bHRpQ2hpbGQgPSByZXF1aXJlKCcuL1Jl YWN0TXVsdGlDaGlsZCcpOwordmFyIFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb24gPSBy ZXF1aXJlKCcuL1JlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb24nKTsKKwordmFyIGVtcHR5 RnVuY3Rpb24gPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eUZ1bmN0aW9uJyk7Cit2YXIgZXNjYXBl VGV4dENvbnRlbnRGb3JCcm93c2VyID0gcmVxdWlyZSgnLi9lc2NhcGVUZXh0Q29udGVudEZvckJy b3dzZXInKTsKK3ZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTsK K3ZhciBpc0V2ZW50U3VwcG9ydGVkID0gcmVxdWlyZSgnLi9pc0V2ZW50U3VwcG9ydGVkJyk7Cit2 YXIgc2hhbGxvd0VxdWFsID0gcmVxdWlyZSgnZmJqcy9saWIvc2hhbGxvd0VxdWFsJyk7Cit2YXIg dmFsaWRhdGVET01OZXN0aW5nID0gcmVxdWlyZSgnLi92YWxpZGF0ZURPTU5lc3RpbmcnKTsKK3Zh ciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpOworCit2YXIgRmxhZ3MgPSBS ZWFjdERPTUNvbXBvbmVudEZsYWdzOwordmFyIGRlbGV0ZUxpc3RlbmVyID0gRXZlbnRQbHVnaW5I dWIuZGVsZXRlTGlzdGVuZXI7Cit2YXIgZ2V0Tm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5n ZXROb2RlRnJvbUluc3RhbmNlOwordmFyIGxpc3RlblRvID0gUmVhY3RCcm93c2VyRXZlbnRFbWl0 dGVyLmxpc3RlblRvOwordmFyIHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzID0gRXZlbnRQbHVnaW5S ZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlczsKKworLy8gRm9yIHF1aWNrbHkgbWF0Y2hp bmcgY2hpbGRyZW4gdHlwZSwgdG8gdGVzdCBpZiBjYW4gYmUgdHJlYXRlZCBhcyBjb250ZW50Lgor dmFyIENPTlRFTlRfVFlQRVMgPSB7ICdzdHJpbmcnOiB0cnVlLCAnbnVtYmVyJzogdHJ1ZSB9Owor Cit2YXIgU1RZTEUgPSAnc3R5bGUnOwordmFyIEhUTUwgPSAnX19odG1sJzsKK3ZhciBSRVNFUlZF RF9QUk9QUyA9IHsKKyAgY2hpbGRyZW46IG51bGwsCisgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1M OiBudWxsLAorICBzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmc6IG51bGwKK307CisKKy8v IE5vZGUgdHlwZSBmb3IgZG9jdW1lbnQgZnJhZ21lbnRzIChOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5U X05PREUpLgordmFyIERPQ19GUkFHTUVOVF9UWVBFID0gMTE7CisKK2Z1bmN0aW9uIGdldERlY2xh cmF0aW9uRXJyb3JBZGRlbmR1bShpbnRlcm5hbEluc3RhbmNlKSB7CisgIGlmIChpbnRlcm5hbElu c3RhbmNlKSB7CisgICAgdmFyIG93bmVyID0gaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1l bnQuX293bmVyIHx8IG51bGw7CisgICAgaWYgKG93bmVyKSB7CisgICAgICB2YXIgbmFtZSA9IG93 bmVyLmdldE5hbWUoKTsKKyAgICAgIGlmIChuYW1lKSB7CisgICAgICAgIHJldHVybiAnIFRoaXMg RE9NIG5vZGUgd2FzIHJlbmRlcmVkIGJ5IGAnICsgbmFtZSArICdgLic7CisgICAgICB9CisgICAg fQorICB9CisgIHJldHVybiAnJzsKK30KKworZnVuY3Rpb24gZnJpZW5kbHlTdHJpbmdpZnkob2Jq KSB7CisgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JykgeworICAgIGlmIChBcnJheS5pc0Fy cmF5KG9iaikpIHsKKyAgICAgIHJldHVybiAnWycgKyBvYmoubWFwKGZyaWVuZGx5U3RyaW5naWZ5 KS5qb2luKCcsICcpICsgJ10nOworICAgIH0gZWxzZSB7CisgICAgICB2YXIgcGFpcnMgPSBbXTsK KyAgICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKKyAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5 cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHsKKyAgICAgICAgICB2YXIga2V5RXNj YXBlZCA9IC9eW2EteiRfXVtcdyRfXSokL2kudGVzdChrZXkpID8ga2V5IDogSlNPTi5zdHJpbmdp Znkoa2V5KTsKKyAgICAgICAgICBwYWlycy5wdXNoKGtleUVzY2FwZWQgKyAnOiAnICsgZnJpZW5k bHlTdHJpbmdpZnkob2JqW2tleV0pKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJu ICd7JyArIHBhaXJzLmpvaW4oJywgJykgKyAnfSc7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGVv ZiBvYmogPT09ICdzdHJpbmcnKSB7CisgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaik7Cisg IH0gZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykgeworICAgIHJldHVybiAnW2Z1 bmN0aW9uIG9iamVjdF0nOworICB9CisgIC8vIERpZmZlcnMgZnJvbSBKU09OLnN0cmluZ2lmeSBp biB0aGF0IHVuZGVmaW5lZCBiZWNhdXNlIHVuZGVmaW5lZCBhbmQgdGhhdAorICAvLyBpbmYgYW5k IG5hbiBkb24ndCBiZWNvbWUgbnVsbAorICByZXR1cm4gU3RyaW5nKG9iaik7Cit9CisKK3ZhciBz dHlsZU11dGF0aW9uV2FybmluZyA9IHt9OworCitmdW5jdGlvbiBjaGVja0FuZFdhcm5Gb3JNdXRh dGVkU3R5bGUoc3R5bGUxLCBzdHlsZTIsIGNvbXBvbmVudCkgeworICBpZiAoc3R5bGUxID09IG51 bGwgfHwgc3R5bGUyID09IG51bGwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHNoYWxsb3dF cXVhbChzdHlsZTEsIHN0eWxlMikpIHsKKyAgICByZXR1cm47CisgIH0KKworICB2YXIgY29tcG9u ZW50TmFtZSA9IGNvbXBvbmVudC5fdGFnOworICB2YXIgb3duZXIgPSBjb21wb25lbnQuX2N1cnJl bnRFbGVtZW50Ll9vd25lcjsKKyAgdmFyIG93bmVyTmFtZTsKKyAgaWYgKG93bmVyKSB7CisgICAg b3duZXJOYW1lID0gb3duZXIuZ2V0TmFtZSgpOworICB9CisKKyAgdmFyIGhhc2ggPSBvd25lck5h bWUgKyAnfCcgKyBjb21wb25lbnROYW1lOworCisgIGlmIChzdHlsZU11dGF0aW9uV2FybmluZy5o YXNPd25Qcm9wZXJ0eShoYXNoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHN0eWxlTXV0YXRp b25XYXJuaW5nW2hhc2hdID0gdHJ1ZTsKKworICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3By b2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2Alc2Agd2FzIHBhc3NlZCBhIHN0eWxlIG9iamVj dCB0aGF0IGhhcyBwcmV2aW91c2x5IGJlZW4gbXV0YXRlZC4gJyArICdNdXRhdGluZyBgc3R5bGVg IGlzIGRlcHJlY2F0ZWQuIENvbnNpZGVyIGNsb25pbmcgaXQgYmVmb3JlaGFuZC4gQ2hlY2sgJyAr ICd0aGUgYHJlbmRlcmAgJXMuIFByZXZpb3VzIHN0eWxlOiAlcy4gTXV0YXRlZCBzdHlsZTogJXMu JywgY29tcG9uZW50TmFtZSwgb3duZXIgPyAnb2YgYCcgKyBvd25lck5hbWUgKyAnYCcgOiAndXNp bmcgPCcgKyBjb21wb25lbnROYW1lICsgJz4nLCBmcmllbmRseVN0cmluZ2lmeShzdHlsZTEpLCBm cmllbmRseVN0cmluZ2lmeShzdHlsZTIpKSA6IHZvaWQgMDsKK30KKworLyoqCisgKiBAcGFyYW0g e29iamVjdH0gY29tcG9uZW50CisgKiBAcGFyYW0gez9vYmplY3R9IHByb3BzCisgKi8KK2Z1bmN0 aW9uIGFzc2VydFZhbGlkUHJvcHMoY29tcG9uZW50LCBwcm9wcykgeworICBpZiAoIXByb3BzKSB7 CisgICAgcmV0dXJuOworICB9CisgIC8vIE5vdGUgdGhlIHVzZSBvZiBgPT1gIHdoaWNoIGNoZWNr cyBmb3IgbnVsbCBvciB1bmRlZmluZWQuCisgIGlmICh2b2lkRWxlbWVudFRhZ3NbY29tcG9uZW50 Ll90YWddKSB7CisgICAgIShwcm9wcy5jaGlsZHJlbiA9PSBudWxsICYmIHByb3BzLmRhbmdlcm91 c2x5U2V0SW5uZXJIVE1MID09IG51bGwpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9k dWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJyVzIGlzIGEgdm9pZCBlbGVtZW50IHRhZyBhbmQg bXVzdCBuZWl0aGVyIGhhdmUgYGNoaWxkcmVuYCBub3IgdXNlIGBkYW5nZXJvdXNseVNldElubmVy SFRNTGAuJXMnLCBjb21wb25lbnQuX3RhZywgY29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC5fb3du ZXIgPyAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mICcgKyBjb21wb25lbnQuX2N1cnJlbnRF bGVtZW50Ll9vd25lci5nZXROYW1lKCkgKyAnLicgOiAnJykgOiBfcHJvZEludmFyaWFudCgnMTM3 JywgY29tcG9uZW50Ll90YWcsIGNvbXBvbmVudC5fY3VycmVudEVsZW1lbnQuX293bmVyID8gJyBD aGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiAnICsgY29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC5f b3duZXIuZ2V0TmFtZSgpICsgJy4nIDogJycpIDogdm9pZCAwOworICB9CisgIGlmIChwcm9wcy5k YW5nZXJvdXNseVNldElubmVySFRNTCAhPSBudWxsKSB7CisgICAgIShwcm9wcy5jaGlsZHJlbiA9 PSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlh bnQoZmFsc2UsICdDYW4gb25seSBzZXQgb25lIG9mIGBjaGlsZHJlbmAgb3IgYHByb3BzLmRhbmdl cm91c2x5U2V0SW5uZXJIVE1MYC4nKSA6IF9wcm9kSW52YXJpYW50KCc2MCcpIDogdm9pZCAwOwor ICAgICEodHlwZW9mIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MID09PSAnb2JqZWN0JyAm JiBIVE1MIGluIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSA/IHByb2Nlc3MuZW52Lk5P REVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdgcHJvcHMuZGFuZ2Vy b3VzbHlTZXRJbm5lckhUTUxgIG11c3QgYmUgaW4gdGhlIGZvcm0gYHtfX2h0bWw6IC4uLn1gLiBQ bGVhc2UgdmlzaXQgaHR0cHM6Ly9mYi5tZS9yZWFjdC1pbnZhcmlhbnQtZGFuZ2Vyb3VzbHktc2V0 LWlubmVyLWh0bWwgZm9yIG1vcmUgaW5mb3JtYXRpb24uJykgOiBfcHJvZEludmFyaWFudCgnNjEn KSA6IHZvaWQgMDsKKyAgfQorICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0 aW9uJykgeworICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJu aW5nKHByb3BzLmlubmVySFRNTCA9PSBudWxsLCAnRGlyZWN0bHkgc2V0dGluZyBwcm9wZXJ0eSBg aW5uZXJIVE1MYCBpcyBub3QgcGVybWl0dGVkLiAnICsgJ0ZvciBtb3JlIGluZm9ybWF0aW9uLCBs b29rdXAgZG9jdW1lbnRhdGlvbiBvbiBgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLicpIDogdm9p ZCAwOworICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5n KHByb3BzLnN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyB8fCAhcHJvcHMuY29udGVudEVk aXRhYmxlIHx8IHByb3BzLmNoaWxkcmVuID09IG51bGwsICdBIGNvbXBvbmVudCBpcyBgY29udGVu dEVkaXRhYmxlYCBhbmQgY29udGFpbnMgYGNoaWxkcmVuYCBtYW5hZ2VkIGJ5ICcgKyAnUmVhY3Qu IEl0IGlzIG5vdyB5b3VyIHJlc3BvbnNpYmlsaXR5IHRvIGd1YXJhbnRlZSB0aGF0IG5vbmUgb2Yg JyArICd0aG9zZSBub2RlcyBhcmUgdW5leHBlY3RlZGx5IG1vZGlmaWVkIG9yIGR1cGxpY2F0ZWQu IFRoaXMgaXMgJyArICdwcm9iYWJseSBub3QgaW50ZW50aW9uYWwuJykgOiB2b2lkIDA7CisgICAg cHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcocHJvcHMub25G b2N1c0luID09IG51bGwgJiYgcHJvcHMub25Gb2N1c091dCA9PSBudWxsLCAnUmVhY3QgdXNlcyBv bkZvY3VzIGFuZCBvbkJsdXIgaW5zdGVhZCBvZiBvbkZvY3VzSW4gYW5kIG9uRm9jdXNPdXQuICcg KyAnQWxsIFJlYWN0IGV2ZW50cyBhcmUgbm9ybWFsaXplZCB0byBidWJibGUsIHNvIG9uRm9jdXNJ biBhbmQgb25Gb2N1c091dCAnICsgJ2FyZSBub3QgbmVlZGVkL3N1cHBvcnRlZCBieSBSZWFjdC4n KSA6IHZvaWQgMDsKKyAgfQorICAhKHByb3BzLnN0eWxlID09IG51bGwgfHwgdHlwZW9mIHByb3Bz LnN0eWxlID09PSAnb2JqZWN0JykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rp b24nID8gaW52YXJpYW50KGZhbHNlLCAnVGhlIGBzdHlsZWAgcHJvcCBleHBlY3RzIGEgbWFwcGlu ZyBmcm9tIHN0eWxlIHByb3BlcnRpZXMgdG8gdmFsdWVzLCBub3QgYSBzdHJpbmcuIEZvciBleGFt cGxlLCBzdHlsZT17e21hcmdpblJpZ2h0OiBzcGFjaW5nICsgXCdlbVwnfX0gd2hlbiB1c2luZyBK U1guJXMnLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oY29tcG9uZW50KSkgOiBfcHJvZElu dmFyaWFudCgnNjInLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oY29tcG9uZW50KSkgOiB2 b2lkIDA7Cit9CisKK2Z1bmN0aW9uIGVucXVldWVQdXRMaXN0ZW5lcihpbnN0LCByZWdpc3RyYXRp b25OYW1lLCBsaXN0ZW5lciwgdHJhbnNhY3Rpb24pIHsKKyAgaWYgKHRyYW5zYWN0aW9uIGluc3Rh bmNlb2YgUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbikgeworICAgIHJldHVybjsKKyAg fQorICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgeworICAgIC8v IElFOCBoYXMgbm8gQVBJIGZvciBldmVudCBjYXB0dXJpbmcgYW5kIHRoZSBgb25TY3JvbGxgIGV2 ZW50IGRvZXNuJ3QKKyAgICAvLyBidWJibGUuCisgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09 ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcocmVnaXN0cmF0aW9uTmFtZSAhPT0gJ29uU2Nyb2xsJyB8 fCBpc0V2ZW50U3VwcG9ydGVkKCdzY3JvbGwnLCB0cnVlKSwgJ1RoaXMgYnJvd3NlciBkb2Vzblwn dCBzdXBwb3J0IHRoZSBgb25TY3JvbGxgIGV2ZW50JykgOiB2b2lkIDA7CisgIH0KKyAgdmFyIGNv bnRhaW5lckluZm8gPSBpbnN0Ll9ob3N0Q29udGFpbmVySW5mbzsKKyAgdmFyIGlzRG9jdW1lbnRG cmFnbWVudCA9IGNvbnRhaW5lckluZm8uX25vZGUgJiYgY29udGFpbmVySW5mby5fbm9kZS5ub2Rl VHlwZSA9PT0gRE9DX0ZSQUdNRU5UX1RZUEU7CisgIHZhciBkb2MgPSBpc0RvY3VtZW50RnJhZ21l bnQgPyBjb250YWluZXJJbmZvLl9ub2RlIDogY29udGFpbmVySW5mby5fb3duZXJEb2N1bWVudDsK KyAgbGlzdGVuVG8ocmVnaXN0cmF0aW9uTmFtZSwgZG9jKTsKKyAgdHJhbnNhY3Rpb24uZ2V0UmVh Y3RNb3VudFJlYWR5KCkuZW5xdWV1ZShwdXRMaXN0ZW5lciwgeworICAgIGluc3Q6IGluc3QsCisg ICAgcmVnaXN0cmF0aW9uTmFtZTogcmVnaXN0cmF0aW9uTmFtZSwKKyAgICBsaXN0ZW5lcjogbGlz dGVuZXIKKyAgfSk7Cit9CisKK2Z1bmN0aW9uIHB1dExpc3RlbmVyKCkgeworICB2YXIgbGlzdGVu ZXJUb1B1dCA9IHRoaXM7CisgIEV2ZW50UGx1Z2luSHViLnB1dExpc3RlbmVyKGxpc3RlbmVyVG9Q dXQuaW5zdCwgbGlzdGVuZXJUb1B1dC5yZWdpc3RyYXRpb25OYW1lLCBsaXN0ZW5lclRvUHV0Lmxp c3RlbmVyKTsKK30KKworZnVuY3Rpb24gaW5wdXRQb3N0TW91bnQoKSB7CisgIHZhciBpbnN0ID0g dGhpczsKKyAgUmVhY3RET01JbnB1dC5wb3N0TW91bnRXcmFwcGVyKGluc3QpOworfQorCitmdW5j dGlvbiB0ZXh0YXJlYVBvc3RNb3VudCgpIHsKKyAgdmFyIGluc3QgPSB0aGlzOworICBSZWFjdERP TVRleHRhcmVhLnBvc3RNb3VudFdyYXBwZXIoaW5zdCk7Cit9CisKK2Z1bmN0aW9uIG9wdGlvblBv c3RNb3VudCgpIHsKKyAgdmFyIGluc3QgPSB0aGlzOworICBSZWFjdERPTU9wdGlvbi5wb3N0TW91 bnRXcmFwcGVyKGluc3QpOworfQorCit2YXIgc2V0QW5kVmFsaWRhdGVDb250ZW50Q2hpbGREZXYg PSBlbXB0eUZ1bmN0aW9uOworaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlv bicpIHsKKyAgc2V0QW5kVmFsaWRhdGVDb250ZW50Q2hpbGREZXYgPSBmdW5jdGlvbiAoY29udGVu dCkgeworICAgIHZhciBoYXNFeGlzdGluZ0NvbnRlbnQgPSB0aGlzLl9jb250ZW50RGVidWdJRCAh PSBudWxsOworICAgIHZhciBkZWJ1Z0lEID0gdGhpcy5fZGVidWdJRDsKKyAgICAvLyBUaGlzIElE IHJlcHJlc2VudHMgdGhlIGlubGluZWQgY2hpbGQgdGhhdCBoYXMgbm8gYmFja2luZyBpbnN0YW5j ZToKKyAgICB2YXIgY29udGVudERlYnVnSUQgPSAtZGVidWdJRDsKKworICAgIGlmIChjb250ZW50 ID09IG51bGwpIHsKKyAgICAgIGlmIChoYXNFeGlzdGluZ0NvbnRlbnQpIHsKKyAgICAgICAgUmVh Y3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uVW5tb3VudENvbXBvbmVudCh0aGlzLl9jb250 ZW50RGVidWdJRCk7CisgICAgICB9CisgICAgICB0aGlzLl9jb250ZW50RGVidWdJRCA9IG51bGw7 CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFsaWRhdGVET01OZXN0aW5nKG51bGwsIFN0 cmluZyhjb250ZW50KSwgdGhpcywgdGhpcy5fYW5jZXN0b3JJbmZvKTsKKyAgICB0aGlzLl9jb250 ZW50RGVidWdJRCA9IGNvbnRlbnREZWJ1Z0lEOworICAgIGlmIChoYXNFeGlzdGluZ0NvbnRlbnQp IHsKKyAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkJlZm9yZVVwZGF0ZUNv bXBvbmVudChjb250ZW50RGVidWdJRCwgY29udGVudCk7CisgICAgICBSZWFjdEluc3RydW1lbnRh dGlvbi5kZWJ1Z1Rvb2wub25VcGRhdGVDb21wb25lbnQoY29udGVudERlYnVnSUQpOworICAgIH0g ZWxzZSB7CisgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWZvcmVNb3Vu dENvbXBvbmVudChjb250ZW50RGVidWdJRCwgY29udGVudCwgZGVidWdJRCk7CisgICAgICBSZWFj dEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Nb3VudENvbXBvbmVudChjb250ZW50RGVidWdJ RCk7CisgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25TZXRDaGlsZHJlbihk ZWJ1Z0lELCBbY29udGVudERlYnVnSURdKTsKKyAgICB9CisgIH07Cit9CisKKy8vIFRoZXJlIGFy ZSBzbyBtYW55IG1lZGlhIGV2ZW50cywgaXQgbWFrZXMgc2Vuc2UgdG8ganVzdAorLy8gbWFpbnRh aW4gYSBsaXN0IHJhdGhlciB0aGFuIGNyZWF0ZSBhIGB0cmFwQnViYmxlZEV2ZW50YCBmb3IgZWFj aAordmFyIG1lZGlhRXZlbnRzID0geworICB0b3BBYm9ydDogJ2Fib3J0JywKKyAgdG9wQ2FuUGxh eTogJ2NhbnBsYXknLAorICB0b3BDYW5QbGF5VGhyb3VnaDogJ2NhbnBsYXl0aHJvdWdoJywKKyAg dG9wRHVyYXRpb25DaGFuZ2U6ICdkdXJhdGlvbmNoYW5nZScsCisgIHRvcEVtcHRpZWQ6ICdlbXB0 aWVkJywKKyAgdG9wRW5jcnlwdGVkOiAnZW5jcnlwdGVkJywKKyAgdG9wRW5kZWQ6ICdlbmRlZCcs CisgIHRvcEVycm9yOiAnZXJyb3InLAorICB0b3BMb2FkZWREYXRhOiAnbG9hZGVkZGF0YScsCisg IHRvcExvYWRlZE1ldGFkYXRhOiAnbG9hZGVkbWV0YWRhdGEnLAorICB0b3BMb2FkU3RhcnQ6ICds b2Fkc3RhcnQnLAorICB0b3BQYXVzZTogJ3BhdXNlJywKKyAgdG9wUGxheTogJ3BsYXknLAorICB0 b3BQbGF5aW5nOiAncGxheWluZycsCisgIHRvcFByb2dyZXNzOiAncHJvZ3Jlc3MnLAorICB0b3BS YXRlQ2hhbmdlOiAncmF0ZWNoYW5nZScsCisgIHRvcFNlZWtlZDogJ3NlZWtlZCcsCisgIHRvcFNl ZWtpbmc6ICdzZWVraW5nJywKKyAgdG9wU3RhbGxlZDogJ3N0YWxsZWQnLAorICB0b3BTdXNwZW5k OiAnc3VzcGVuZCcsCisgIHRvcFRpbWVVcGRhdGU6ICd0aW1ldXBkYXRlJywKKyAgdG9wVm9sdW1l Q2hhbmdlOiAndm9sdW1lY2hhbmdlJywKKyAgdG9wV2FpdGluZzogJ3dhaXRpbmcnCit9OworCitm dW5jdGlvbiB0cmFwQnViYmxlZEV2ZW50c0xvY2FsKCkgeworICB2YXIgaW5zdCA9IHRoaXM7Cisg IC8vIElmIGEgY29tcG9uZW50IHJlbmRlcnMgdG8gbnVsbCBvciBpZiBhbm90aGVyIGNvbXBvbmVu dCBmYXRhbHMgYW5kIGNhdXNlcworICAvLyB0aGUgc3RhdGUgb2YgdGhlIHRyZWUgdG8gYmUgY29y cnVwdGVkLCBgbm9kZWAgaGVyZSBjYW4gYmUgbnVsbC4KKyAgIWluc3QuX3Jvb3ROb2RlSUQgPyBw cm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAn TXVzdCBiZSBtb3VudGVkIHRvIHRyYXAgZXZlbnRzJykgOiBfcHJvZEludmFyaWFudCgnNjMnKSA6 IHZvaWQgMDsKKyAgdmFyIG5vZGUgPSBnZXROb2RlKGluc3QpOworICAhbm9kZSA/IHByb2Nlc3Mu ZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd0cmFwQnVi YmxlZEV2ZW50KC4uLik6IFJlcXVpcmVzIG5vZGUgdG8gYmUgcmVuZGVyZWQuJykgOiBfcHJvZElu dmFyaWFudCgnNjQnKSA6IHZvaWQgMDsKKworICBzd2l0Y2ggKGluc3QuX3RhZykgeworICAgIGNh c2UgJ2lmcmFtZSc6CisgICAgY2FzZSAnb2JqZWN0JzoKKyAgICAgIGluc3QuX3dyYXBwZXJTdGF0 ZS5saXN0ZW5lcnMgPSBbUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLnRyYXBCdWJibGVkRXZlbnQo J3RvcExvYWQnLCAnbG9hZCcsIG5vZGUpXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3ZpZGVv JzoKKyAgICBjYXNlICdhdWRpbyc6CisKKyAgICAgIGluc3QuX3dyYXBwZXJTdGF0ZS5saXN0ZW5l cnMgPSBbXTsKKyAgICAgIC8vIENyZWF0ZSBsaXN0ZW5lciBmb3IgZWFjaCBtZWRpYSBldmVudAor ICAgICAgZm9yICh2YXIgZXZlbnQgaW4gbWVkaWFFdmVudHMpIHsKKyAgICAgICAgaWYgKG1lZGlh RXZlbnRzLmhhc093blByb3BlcnR5KGV2ZW50KSkgeworICAgICAgICAgIGluc3QuX3dyYXBwZXJT dGF0ZS5saXN0ZW5lcnMucHVzaChSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIudHJhcEJ1YmJsZWRF dmVudChldmVudCwgbWVkaWFFdmVudHNbZXZlbnRdLCBub2RlKSk7CisgICAgICAgIH0KKyAgICAg IH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3NvdXJjZSc6CisgICAgICBpbnN0Ll93cmFwcGVy U3RhdGUubGlzdGVuZXJzID0gW1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci50cmFwQnViYmxlZEV2 ZW50KCd0b3BFcnJvcicsICdlcnJvcicsIG5vZGUpXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ug J2ltZyc6CisgICAgICBpbnN0Ll93cmFwcGVyU3RhdGUubGlzdGVuZXJzID0gW1JlYWN0QnJvd3Nl ckV2ZW50RW1pdHRlci50cmFwQnViYmxlZEV2ZW50KCd0b3BFcnJvcicsICdlcnJvcicsIG5vZGUp LCBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wTG9hZCcsICds b2FkJywgbm9kZSldOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnZm9ybSc6CisgICAgICBpbnN0 Ll93cmFwcGVyU3RhdGUubGlzdGVuZXJzID0gW1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci50cmFw QnViYmxlZEV2ZW50KCd0b3BSZXNldCcsICdyZXNldCcsIG5vZGUpLCBSZWFjdEJyb3dzZXJFdmVu dEVtaXR0ZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wU3VibWl0JywgJ3N1Ym1pdCcsIG5vZGUpXTsK KyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2lucHV0JzoKKyAgICBjYXNlICdzZWxlY3QnOgorICAg IGNhc2UgJ3RleHRhcmVhJzoKKyAgICAgIGluc3QuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnMgPSBb UmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLnRyYXBCdWJibGVkRXZlbnQoJ3RvcEludmFsaWQnLCAn aW52YWxpZCcsIG5vZGUpXTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK2Z1bmN0aW9uIHBvc3RV cGRhdGVTZWxlY3RXcmFwcGVyKCkgeworICBSZWFjdERPTVNlbGVjdC5wb3N0VXBkYXRlV3JhcHBl cih0aGlzKTsKK30KKworLy8gRm9yIEhUTUwsIGNlcnRhaW4gdGFncyBzaG91bGQgb21pdCB0aGVp ciBjbG9zZSB0YWcuIFdlIGtlZXAgYSB3aGl0ZWxpc3QgZm9yCisvLyB0aG9zZSBzcGVjaWFsLWNh c2UgdGFncy4KKwordmFyIG9taXR0ZWRDbG9zZVRhZ3MgPSB7CisgICdhcmVhJzogdHJ1ZSwKKyAg J2Jhc2UnOiB0cnVlLAorICAnYnInOiB0cnVlLAorICAnY29sJzogdHJ1ZSwKKyAgJ2VtYmVkJzog dHJ1ZSwKKyAgJ2hyJzogdHJ1ZSwKKyAgJ2ltZyc6IHRydWUsCisgICdpbnB1dCc6IHRydWUsCisg ICdrZXlnZW4nOiB0cnVlLAorICAnbGluayc6IHRydWUsCisgICdtZXRhJzogdHJ1ZSwKKyAgJ3Bh cmFtJzogdHJ1ZSwKKyAgJ3NvdXJjZSc6IHRydWUsCisgICd0cmFjayc6IHRydWUsCisgICd3YnIn OiB0cnVlCit9OworCit2YXIgbmV3bGluZUVhdGluZ1RhZ3MgPSB7CisgICdsaXN0aW5nJzogdHJ1 ZSwKKyAgJ3ByZSc6IHRydWUsCisgICd0ZXh0YXJlYSc6IHRydWUKK307CisKKy8vIEZvciBIVE1M LCBjZXJ0YWluIHRhZ3MgY2Fubm90IGhhdmUgY2hpbGRyZW4uIFRoaXMgaGFzIHRoZSBzYW1lIHB1 cnBvc2UgYXMKKy8vIGBvbWl0dGVkQ2xvc2VUYWdzYCBleGNlcHQgdGhhdCBgbWVudWl0ZW1gIHNo b3VsZCBzdGlsbCBoYXZlIGl0cyBjbG9zaW5nIHRhZy4KKwordmFyIHZvaWRFbGVtZW50VGFncyA9 IF9hc3NpZ24oeworICAnbWVudWl0ZW0nOiB0cnVlCit9LCBvbWl0dGVkQ2xvc2VUYWdzKTsKKwor Ly8gV2UgYWNjZXB0IGFueSB0YWcgdG8gYmUgcmVuZGVyZWQgYnV0IHNpbmNlIHRoaXMgZ2V0cyBp bmplY3RlZCBpbnRvIGFyYml0cmFyeQorLy8gSFRNTCwgd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhh dCBpdCdzIGEgc2FmZSB0YWcuCisvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sLyNOVC1O YW1lCisKK3ZhciBWQUxJRF9UQUdfUkVHRVggPSAvXlthLXpBLVpdW2EtekEtWjpfXC5cLVxkXSok LzsgLy8gU2ltcGxpZmllZCBzdWJzZXQKK3ZhciB2YWxpZGF0ZWRUYWdDYWNoZSA9IHt9OwordmFy IGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7CisKK2Z1bmN0aW9uIHZhbGlkYXRl RGFuZ2Vyb3VzVGFnKHRhZykgeworICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwodmFsaWRhdGVk VGFnQ2FjaGUsIHRhZykpIHsKKyAgICAhVkFMSURfVEFHX1JFR0VYLnRlc3QodGFnKSA/IHByb2Nl c3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdJbnZh bGlkIHRhZzogJXMnLCB0YWcpIDogX3Byb2RJbnZhcmlhbnQoJzY1JywgdGFnKSA6IHZvaWQgMDsK KyAgICB2YWxpZGF0ZWRUYWdDYWNoZVt0YWddID0gdHJ1ZTsKKyAgfQorfQorCitmdW5jdGlvbiBp c0N1c3RvbUNvbXBvbmVudCh0YWdOYW1lLCBwcm9wcykgeworICByZXR1cm4gdGFnTmFtZS5pbmRl eE9mKCctJykgPj0gMCB8fCBwcm9wcy5pcyAhPSBudWxsOworfQorCit2YXIgZ2xvYmFsSWRDb3Vu dGVyID0gMTsKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IFJlYWN0IGNsYXNzIHRoYXQgaXMgaWRl bXBvdGVudCBhbmQgY2FwYWJsZSBvZiBjb250YWluaW5nIG90aGVyCisgKiBSZWFjdCBjb21wb25l bnRzLiBJdCBhY2NlcHRzIGV2ZW50IGxpc3RlbmVycyBhbmQgRE9NIHByb3BlcnRpZXMgdGhhdCBh cmUKKyAqIHZhbGlkIGFjY29yZGluZyB0byBgRE9NUHJvcGVydHlgLgorICoKKyAqICAtIEV2ZW50 IGxpc3RlbmVyczogYG9uQ2xpY2tgLCBgb25Nb3VzZURvd25gLCBldGMuCisgKiAgLSBET00gcHJv cGVydGllczogYGNsYXNzTmFtZWAsIGBuYW1lYCwgYHRpdGxlYCwgZXRjLgorICoKKyAqIFRoZSBg c3R5bGVgIHByb3BlcnR5IGZ1bmN0aW9ucyBkaWZmZXJlbnRseSBmcm9tIHRoZSBET00gQVBJLiBJ dCBhY2NlcHRzIGFuCisgKiBvYmplY3QgbWFwcGluZyBvZiBzdHlsZSBwcm9wZXJ0aWVzIHRvIHZh bHVlcy4KKyAqCisgKiBAY29uc3RydWN0b3IgUmVhY3RET01Db21wb25lbnQKKyAqIEBleHRlbmRz IFJlYWN0TXVsdGlDaGlsZAorICovCitmdW5jdGlvbiBSZWFjdERPTUNvbXBvbmVudChlbGVtZW50 KSB7CisgIHZhciB0YWcgPSBlbGVtZW50LnR5cGU7CisgIHZhbGlkYXRlRGFuZ2Vyb3VzVGFnKHRh Zyk7CisgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gZWxlbWVudDsKKyAgdGhpcy5fdGFnID0gdGFn LnRvTG93ZXJDYXNlKCk7CisgIHRoaXMuX25hbWVzcGFjZVVSSSA9IG51bGw7CisgIHRoaXMuX3Jl bmRlcmVkQ2hpbGRyZW4gPSBudWxsOworICB0aGlzLl9wcmV2aW91c1N0eWxlID0gbnVsbDsKKyAg dGhpcy5fcHJldmlvdXNTdHlsZUNvcHkgPSBudWxsOworICB0aGlzLl9ob3N0Tm9kZSA9IG51bGw7 CisgIHRoaXMuX2hvc3RQYXJlbnQgPSBudWxsOworICB0aGlzLl9yb290Tm9kZUlEID0gMDsKKyAg dGhpcy5fZG9tSUQgPSAwOworICB0aGlzLl9ob3N0Q29udGFpbmVySW5mbyA9IG51bGw7CisgIHRo aXMuX3dyYXBwZXJTdGF0ZSA9IG51bGw7CisgIHRoaXMuX3RvcExldmVsV3JhcHBlciA9IG51bGw7 CisgIHRoaXMuX2ZsYWdzID0gMDsKKyAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJv ZHVjdGlvbicpIHsKKyAgICB0aGlzLl9hbmNlc3RvckluZm8gPSBudWxsOworICAgIHNldEFuZFZh bGlkYXRlQ29udGVudENoaWxkRGV2LmNhbGwodGhpcywgbnVsbCk7CisgIH0KK30KKworUmVhY3RE T01Db21wb25lbnQuZGlzcGxheU5hbWUgPSAnUmVhY3RET01Db21wb25lbnQnOworCitSZWFjdERP TUNvbXBvbmVudC5NaXhpbiA9IHsKKworICAvKioKKyAgICogR2VuZXJhdGVzIHJvb3QgdGFnIG1h cmt1cCB0aGVuIHJlY3Vyc2VzLiBUaGlzIG1ldGhvZCBoYXMgc2lkZSBlZmZlY3RzIGFuZAorICAg KiBpcyBub3QgaWRlbXBvdGVudC4KKyAgICoKKyAgICogQGludGVybmFsCisgICAqIEBwYXJhbSB7 UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbnxSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9u fSB0cmFuc2FjdGlvbgorICAgKiBAcGFyYW0gez9SZWFjdERPTUNvbXBvbmVudH0gdGhlIHBhcmVu dCBjb21wb25lbnQgaW5zdGFuY2UKKyAgICogQHBhcmFtIHs/b2JqZWN0fSBpbmZvIGFib3V0IHRo ZSBob3N0IGNvbnRhaW5lcgorICAgKiBAcGFyYW0ge29iamVjdH0gY29udGV4dAorICAgKiBAcmV0 dXJuIHtzdHJpbmd9IFRoZSBjb21wdXRlZCBtYXJrdXAuCisgICAqLworICBtb3VudENvbXBvbmVu dDogZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywg Y29udGV4dCkgeworICAgIHRoaXMuX3Jvb3ROb2RlSUQgPSBnbG9iYWxJZENvdW50ZXIrKzsKKyAg ICB0aGlzLl9kb21JRCA9IGhvc3RDb250YWluZXJJbmZvLl9pZENvdW50ZXIrKzsKKyAgICB0aGlz Ll9ob3N0UGFyZW50ID0gaG9zdFBhcmVudDsKKyAgICB0aGlzLl9ob3N0Q29udGFpbmVySW5mbyA9 IGhvc3RDb250YWluZXJJbmZvOworCisgICAgdmFyIHByb3BzID0gdGhpcy5fY3VycmVudEVsZW1l bnQucHJvcHM7CisKKyAgICBzd2l0Y2ggKHRoaXMuX3RhZykgeworICAgICAgY2FzZSAnYXVkaW8n OgorICAgICAgY2FzZSAnZm9ybSc6CisgICAgICBjYXNlICdpZnJhbWUnOgorICAgICAgY2FzZSAn aW1nJzoKKyAgICAgIGNhc2UgJ2xpbmsnOgorICAgICAgY2FzZSAnb2JqZWN0JzoKKyAgICAgIGNh c2UgJ3NvdXJjZSc6CisgICAgICBjYXNlICd2aWRlbyc6CisgICAgICAgIHRoaXMuX3dyYXBwZXJT dGF0ZSA9IHsKKyAgICAgICAgICBsaXN0ZW5lcnM6IG51bGwKKyAgICAgICAgfTsKKyAgICAgICAg dHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZSh0cmFwQnViYmxlZEV2ZW50 c0xvY2FsLCB0aGlzKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdpbnB1dCc6CisgICAg ICAgIFJlYWN0RE9NSW5wdXQubW91bnRXcmFwcGVyKHRoaXMsIHByb3BzLCBob3N0UGFyZW50KTsK KyAgICAgICAgcHJvcHMgPSBSZWFjdERPTUlucHV0LmdldEhvc3RQcm9wcyh0aGlzLCBwcm9wcyk7 CisgICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUodHJhcEJ1 YmJsZWRFdmVudHNMb2NhbCwgdGhpcyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnb3B0 aW9uJzoKKyAgICAgICAgUmVhY3RET01PcHRpb24ubW91bnRXcmFwcGVyKHRoaXMsIHByb3BzLCBo b3N0UGFyZW50KTsKKyAgICAgICAgcHJvcHMgPSBSZWFjdERPTU9wdGlvbi5nZXRIb3N0UHJvcHMo dGhpcywgcHJvcHMpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3NlbGVjdCc6CisgICAg ICAgIFJlYWN0RE9NU2VsZWN0Lm1vdW50V3JhcHBlcih0aGlzLCBwcm9wcywgaG9zdFBhcmVudCk7 CisgICAgICAgIHByb3BzID0gUmVhY3RET01TZWxlY3QuZ2V0SG9zdFByb3BzKHRoaXMsIHByb3Bz KTsKKyAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZSh0cmFw QnViYmxlZEV2ZW50c0xvY2FsLCB0aGlzKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICd0 ZXh0YXJlYSc6CisgICAgICAgIFJlYWN0RE9NVGV4dGFyZWEubW91bnRXcmFwcGVyKHRoaXMsIHBy b3BzLCBob3N0UGFyZW50KTsKKyAgICAgICAgcHJvcHMgPSBSZWFjdERPTVRleHRhcmVhLmdldEhv c3RQcm9wcyh0aGlzLCBwcm9wcyk7CisgICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRS ZWFkeSgpLmVucXVldWUodHJhcEJ1YmJsZWRFdmVudHNMb2NhbCwgdGhpcyk7CisgICAgICAgIGJy ZWFrOworICAgIH0KKworICAgIGFzc2VydFZhbGlkUHJvcHModGhpcywgcHJvcHMpOworCisgICAg Ly8gV2UgY3JlYXRlIHRhZ3MgaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGVpciBwYXJlbnQgY29udGFp bmVyLCBleGNlcHQgSFRNTAorICAgIC8vIHRhZ3MgZ2V0IG5vIG5hbWVzcGFjZS4KKyAgICB2YXIg bmFtZXNwYWNlVVJJOworICAgIHZhciBwYXJlbnRUYWc7CisgICAgaWYgKGhvc3RQYXJlbnQgIT0g bnVsbCkgeworICAgICAgbmFtZXNwYWNlVVJJID0gaG9zdFBhcmVudC5fbmFtZXNwYWNlVVJJOwor ICAgICAgcGFyZW50VGFnID0gaG9zdFBhcmVudC5fdGFnOworICAgIH0gZWxzZSBpZiAoaG9zdENv bnRhaW5lckluZm8uX3RhZykgeworICAgICAgbmFtZXNwYWNlVVJJID0gaG9zdENvbnRhaW5lcklu Zm8uX25hbWVzcGFjZVVSSTsKKyAgICAgIHBhcmVudFRhZyA9IGhvc3RDb250YWluZXJJbmZvLl90 YWc7CisgICAgfQorICAgIGlmIChuYW1lc3BhY2VVUkkgPT0gbnVsbCB8fCBuYW1lc3BhY2VVUkkg PT09IERPTU5hbWVzcGFjZXMuc3ZnICYmIHBhcmVudFRhZyA9PT0gJ2ZvcmVpZ25vYmplY3QnKSB7 CisgICAgICBuYW1lc3BhY2VVUkkgPSBET01OYW1lc3BhY2VzLmh0bWw7CisgICAgfQorICAgIGlm IChuYW1lc3BhY2VVUkkgPT09IERPTU5hbWVzcGFjZXMuaHRtbCkgeworICAgICAgaWYgKHRoaXMu X3RhZyA9PT0gJ3N2ZycpIHsKKyAgICAgICAgbmFtZXNwYWNlVVJJID0gRE9NTmFtZXNwYWNlcy5z dmc7CisgICAgICB9IGVsc2UgaWYgKHRoaXMuX3RhZyA9PT0gJ21hdGgnKSB7CisgICAgICAgIG5h bWVzcGFjZVVSSSA9IERPTU5hbWVzcGFjZXMubWF0aG1sOworICAgICAgfQorICAgIH0KKyAgICB0 aGlzLl9uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7CisKKyAgICBpZiAocHJvY2Vzcy5lbnYu Tk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgdmFyIHBhcmVudEluZm87CisgICAg ICBpZiAoaG9zdFBhcmVudCAhPSBudWxsKSB7CisgICAgICAgIHBhcmVudEluZm8gPSBob3N0UGFy ZW50Ll9hbmNlc3RvckluZm87CisgICAgICB9IGVsc2UgaWYgKGhvc3RDb250YWluZXJJbmZvLl90 YWcpIHsKKyAgICAgICAgcGFyZW50SW5mbyA9IGhvc3RDb250YWluZXJJbmZvLl9hbmNlc3Rvcklu Zm87CisgICAgICB9CisgICAgICBpZiAocGFyZW50SW5mbykgeworICAgICAgICAvLyBwYXJlbnRJ bmZvIHNob3VsZCBhbHdheXMgYmUgcHJlc2VudCBleGNlcHQgZm9yIHRoZSB0b3AtbGV2ZWwKKyAg ICAgICAgLy8gY29tcG9uZW50IHdoZW4gc2VydmVyIHJlbmRlcmluZworICAgICAgICB2YWxpZGF0 ZURPTU5lc3RpbmcodGhpcy5fdGFnLCBudWxsLCB0aGlzLCBwYXJlbnRJbmZvKTsKKyAgICAgIH0K KyAgICAgIHRoaXMuX2FuY2VzdG9ySW5mbyA9IHZhbGlkYXRlRE9NTmVzdGluZy51cGRhdGVkQW5j ZXN0b3JJbmZvKHBhcmVudEluZm8sIHRoaXMuX3RhZywgdGhpcyk7CisgICAgfQorCisgICAgdmFy IG1vdW50SW1hZ2U7CisgICAgaWYgKHRyYW5zYWN0aW9uLnVzZUNyZWF0ZUVsZW1lbnQpIHsKKyAg ICAgIHZhciBvd25lckRvY3VtZW50ID0gaG9zdENvbnRhaW5lckluZm8uX293bmVyRG9jdW1lbnQ7 CisgICAgICB2YXIgZWw7CisgICAgICBpZiAobmFtZXNwYWNlVVJJID09PSBET01OYW1lc3BhY2Vz Lmh0bWwpIHsKKyAgICAgICAgaWYgKHRoaXMuX3RhZyA9PT0gJ3NjcmlwdCcpIHsKKyAgICAgICAg ICAvLyBDcmVhdGUgdGhlIHNjcmlwdCB2aWEgLmlubmVySFRNTCBzbyBpdHMgInBhcnNlci1pbnNl cnRlZCIgZmxhZyBpcworICAgICAgICAgIC8vIHNldCB0byB0cnVlIGFuZCBpdCBkb2VzIG5vdCBl eGVjdXRlCisgICAgICAgICAgdmFyIGRpdiA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgn ZGl2Jyk7CisgICAgICAgICAgdmFyIHR5cGUgPSB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlOwor ICAgICAgICAgIGRpdi5pbm5lckhUTUwgPSAnPCcgKyB0eXBlICsgJz48LycgKyB0eXBlICsgJz4n OworICAgICAgICAgIGVsID0gZGl2LnJlbW92ZUNoaWxkKGRpdi5maXJzdENoaWxkKTsKKyAgICAg ICAgfSBlbHNlIGlmIChwcm9wcy5pcykgeworICAgICAgICAgIGVsID0gb3duZXJEb2N1bWVudC5j cmVhdGVFbGVtZW50KHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGUsIHByb3BzLmlzKTsKKyAgICAg ICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBTZXBhcmF0ZSBlbHNlIGJyYW5jaCBpbnN0ZWFkIG9m IHVzaW5nIGBwcm9wcy5pcyB8fCB1bmRlZmluZWRgIGFib3ZlIGJlY3Vhc2Ugb2YgYSBGaXJlZm94 IGJ1Zy4KKyAgICAgICAgICAvLyBTZWUgZGlzY3Vzc2lvbiBpbiBodHRwczovL2dpdGh1Yi5jb20v ZmFjZWJvb2svcmVhY3QvcHVsbC82ODk2CisgICAgICAgICAgLy8gYW5kIGRpc2N1c3Npb24gaW4g aHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTI3NjI0MAorICAg ICAgICAgIGVsID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KHRoaXMuX2N1cnJlbnRFbGVt ZW50LnR5cGUpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBlbCA9IG93bmVy RG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZVVSSSwgdGhpcy5fY3VycmVudEVsZW1l bnQudHlwZSk7CisgICAgICB9CisgICAgICBSZWFjdERPTUNvbXBvbmVudFRyZWUucHJlY2FjaGVO b2RlKHRoaXMsIGVsKTsKKyAgICAgIHRoaXMuX2ZsYWdzIHw9IEZsYWdzLmhhc0NhY2hlZENoaWxk Tm9kZXM7CisgICAgICBpZiAoIXRoaXMuX2hvc3RQYXJlbnQpIHsKKyAgICAgICAgRE9NUHJvcGVy dHlPcGVyYXRpb25zLnNldEF0dHJpYnV0ZUZvclJvb3QoZWwpOworICAgICAgfQorICAgICAgdGhp cy5fdXBkYXRlRE9NUHJvcGVydGllcyhudWxsLCBwcm9wcywgdHJhbnNhY3Rpb24pOworICAgICAg dmFyIGxhenlUcmVlID0gRE9NTGF6eVRyZWUoZWwpOworICAgICAgdGhpcy5fY3JlYXRlSW5pdGlh bENoaWxkcmVuKHRyYW5zYWN0aW9uLCBwcm9wcywgY29udGV4dCwgbGF6eVRyZWUpOworICAgICAg bW91bnRJbWFnZSA9IGxhenlUcmVlOworICAgIH0gZWxzZSB7CisgICAgICB2YXIgdGFnT3BlbiA9 IHRoaXMuX2NyZWF0ZU9wZW5UYWdNYXJrdXBBbmRQdXRMaXN0ZW5lcnModHJhbnNhY3Rpb24sIHBy b3BzKTsKKyAgICAgIHZhciB0YWdDb250ZW50ID0gdGhpcy5fY3JlYXRlQ29udGVudE1hcmt1cCh0 cmFuc2FjdGlvbiwgcHJvcHMsIGNvbnRleHQpOworICAgICAgaWYgKCF0YWdDb250ZW50ICYmIG9t aXR0ZWRDbG9zZVRhZ3NbdGhpcy5fdGFnXSkgeworICAgICAgICBtb3VudEltYWdlID0gdGFnT3Bl biArICcvPic7CisgICAgICB9IGVsc2UgeworICAgICAgICBtb3VudEltYWdlID0gdGFnT3BlbiAr ICc+JyArIHRhZ0NvbnRlbnQgKyAnPC8nICsgdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSArICc+ JzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMuX3RhZykgeworICAgICAgY2Fz ZSAnaW5wdXQnOgorICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1 ZXVlKGlucHV0UG9zdE1vdW50LCB0aGlzKTsKKyAgICAgICAgaWYgKHByb3BzLmF1dG9Gb2N1cykg eworICAgICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoQXV0 b0ZvY3VzVXRpbHMuZm9jdXNET01Db21wb25lbnQsIHRoaXMpOworICAgICAgICB9CisgICAgICAg IGJyZWFrOworICAgICAgY2FzZSAndGV4dGFyZWEnOgorICAgICAgICB0cmFuc2FjdGlvbi5nZXRS ZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHRleHRhcmVhUG9zdE1vdW50LCB0aGlzKTsKKyAgICAg ICAgaWYgKHByb3BzLmF1dG9Gb2N1cykgeworICAgICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0 TW91bnRSZWFkeSgpLmVucXVldWUoQXV0b0ZvY3VzVXRpbHMuZm9jdXNET01Db21wb25lbnQsIHRo aXMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnc2VsZWN0JzoKKyAg ICAgICAgaWYgKHByb3BzLmF1dG9Gb2N1cykgeworICAgICAgICAgIHRyYW5zYWN0aW9uLmdldFJl YWN0TW91bnRSZWFkeSgpLmVucXVldWUoQXV0b0ZvY3VzVXRpbHMuZm9jdXNET01Db21wb25lbnQs IHRoaXMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnYnV0dG9uJzoK KyAgICAgICAgaWYgKHByb3BzLmF1dG9Gb2N1cykgeworICAgICAgICAgIHRyYW5zYWN0aW9uLmdl dFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoQXV0b0ZvY3VzVXRpbHMuZm9jdXNET01Db21wb25l bnQsIHRoaXMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnb3B0aW9u JzoKKyAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShvcHRp b25Qb3N0TW91bnQsIHRoaXMpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4g bW91bnRJbWFnZTsKKyAgfSwKKworICAvKioKKyAgICogQ3JlYXRlcyBtYXJrdXAgZm9yIHRoZSBv cGVuIHRhZyBhbmQgYWxsIGF0dHJpYnV0ZXMuCisgICAqCisgICAqIFRoaXMgbWV0aG9kIGhhcyBz aWRlIGVmZmVjdHMgYmVjYXVzZSBldmVudHMgZ2V0IHJlZ2lzdGVyZWQuCisgICAqCisgICAqIEl0 ZXJhdGluZyBvdmVyIG9iamVjdCBwcm9wZXJ0aWVzIGlzIGZhc3RlciB0aGFuIGl0ZXJhdGluZyBv dmVyIGFycmF5cy4KKyAgICogQHNlZSBodHRwOi8vanNwZXJmLmNvbS9vYmotdnMtYXJyLWl0ZXJh dGlvbgorICAgKgorICAgKiBAcHJpdmF0ZQorICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJh bnNhY3Rpb258UmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24KKyAg ICogQHBhcmFtIHtvYmplY3R9IHByb3BzCisgICAqIEByZXR1cm4ge3N0cmluZ30gTWFya3VwIG9m IG9wZW5pbmcgdGFnLgorICAgKi8KKyAgX2NyZWF0ZU9wZW5UYWdNYXJrdXBBbmRQdXRMaXN0ZW5l cnM6IGZ1bmN0aW9uICh0cmFuc2FjdGlvbiwgcHJvcHMpIHsKKyAgICB2YXIgcmV0ID0gJzwnICsg dGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTsKKworICAgIGZvciAodmFyIHByb3BLZXkgaW4gcHJv cHMpIHsKKyAgICAgIGlmICghcHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHsKKyAgICAg ICAgY29udGludWU7CisgICAgICB9CisgICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcEtl eV07CisgICAgICBpZiAocHJvcFZhbHVlID09IG51bGwpIHsKKyAgICAgICAgY29udGludWU7Cisg ICAgICB9CisgICAgICBpZiAocmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMuaGFzT3duUHJvcGVydHko cHJvcEtleSkpIHsKKyAgICAgICAgaWYgKHByb3BWYWx1ZSkgeworICAgICAgICAgIGVucXVldWVQ dXRMaXN0ZW5lcih0aGlzLCBwcm9wS2V5LCBwcm9wVmFsdWUsIHRyYW5zYWN0aW9uKTsKKyAgICAg ICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7Cisg ICAgICAgICAgaWYgKHByb3BWYWx1ZSkgeworICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5P REVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICAgICAgICAgLy8gU2VlIGBfdXBkYXRl RE9NUHJvcGVydGllc2AuIHN0eWxlIGJsb2NrCisgICAgICAgICAgICAgIHRoaXMuX3ByZXZpb3Vz U3R5bGUgPSBwcm9wVmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm9wVmFsdWUg PSB0aGlzLl9wcmV2aW91c1N0eWxlQ29weSA9IF9hc3NpZ24oe30sIHByb3BzLnN0eWxlKTsKKyAg ICAgICAgICB9CisgICAgICAgICAgcHJvcFZhbHVlID0gQ1NTUHJvcGVydHlPcGVyYXRpb25zLmNy ZWF0ZU1hcmt1cEZvclN0eWxlcyhwcm9wVmFsdWUsIHRoaXMpOworICAgICAgICB9CisgICAgICAg IHZhciBtYXJrdXAgPSBudWxsOworICAgICAgICBpZiAodGhpcy5fdGFnICE9IG51bGwgJiYgaXND dXN0b21Db21wb25lbnQodGhpcy5fdGFnLCBwcm9wcykpIHsKKyAgICAgICAgICBpZiAoIVJFU0VS VkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7CisgICAgICAgICAgICBtYXJrdXAg PSBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuY3JlYXRlTWFya3VwRm9yQ3VzdG9tQXR0cmlidXRlKHBy b3BLZXksIHByb3BWYWx1ZSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAg ICAgIG1hcmt1cCA9IERPTVByb3BlcnR5T3BlcmF0aW9ucy5jcmVhdGVNYXJrdXBGb3JQcm9wZXJ0 eShwcm9wS2V5LCBwcm9wVmFsdWUpOworICAgICAgICB9CisgICAgICAgIGlmIChtYXJrdXApIHsK KyAgICAgICAgICByZXQgKz0gJyAnICsgbWFya3VwOworICAgICAgICB9CisgICAgICB9CisgICAg fQorCisgICAgLy8gRm9yIHN0YXRpYyBwYWdlcywgbm8gbmVlZCB0byBwdXQgUmVhY3QgSUQgYW5k IGNoZWNrc3VtLiBTYXZlcyBsb3RzIG9mCisgICAgLy8gYnl0ZXMuCisgICAgaWYgKHRyYW5zYWN0 aW9uLnJlbmRlclRvU3RhdGljTWFya3VwKSB7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKwor ICAgIGlmICghdGhpcy5faG9zdFBhcmVudCkgeworICAgICAgcmV0ICs9ICcgJyArIERPTVByb3Bl cnR5T3BlcmF0aW9ucy5jcmVhdGVNYXJrdXBGb3JSb290KCk7CisgICAgfQorICAgIHJldCArPSAn ICcgKyBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuY3JlYXRlTWFya3VwRm9ySUQodGhpcy5fZG9tSUQp OworICAgIHJldHVybiByZXQ7CisgIH0sCisKKyAgLyoqCisgICAqIENyZWF0ZXMgbWFya3VwIGZv ciB0aGUgY29udGVudCBiZXR3ZWVuIHRoZSB0YWdzLgorICAgKgorICAgKiBAcHJpdmF0ZQorICAg KiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb258UmVhY3RTZXJ2ZXJSZW5kZXJpbmdU cmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24KKyAgICogQHBhcmFtIHtvYmplY3R9IHByb3BzCisgICAq IEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0CisgICAqIEByZXR1cm4ge3N0cmluZ30gQ29udGVudCBt YXJrdXAuCisgICAqLworICBfY3JlYXRlQ29udGVudE1hcmt1cDogZnVuY3Rpb24gKHRyYW5zYWN0 aW9uLCBwcm9wcywgY29udGV4dCkgeworICAgIHZhciByZXQgPSAnJzsKKworICAgIC8vIEludGVu dGlvbmFsIHVzZSBvZiAhPSB0byBhdm9pZCBjYXRjaGluZyB6ZXJvL2ZhbHNlLgorICAgIHZhciBp bm5lckhUTUwgPSBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTDsKKyAgICBpZiAoaW5uZXJI VE1MICE9IG51bGwpIHsKKyAgICAgIGlmIChpbm5lckhUTUwuX19odG1sICE9IG51bGwpIHsKKyAg ICAgICAgcmV0ID0gaW5uZXJIVE1MLl9faHRtbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAg ICAgdmFyIGNvbnRlbnRUb1VzZSA9IENPTlRFTlRfVFlQRVNbdHlwZW9mIHByb3BzLmNoaWxkcmVu XSA/IHByb3BzLmNoaWxkcmVuIDogbnVsbDsKKyAgICAgIHZhciBjaGlsZHJlblRvVXNlID0gY29u dGVudFRvVXNlICE9IG51bGwgPyBudWxsIDogcHJvcHMuY2hpbGRyZW47CisgICAgICBpZiAoY29u dGVudFRvVXNlICE9IG51bGwpIHsKKyAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgdGhhdCB0ZXh0 IGlzIGFsbG93ZWQgYXMgYSBjaGlsZCBvZiB0aGlzIG5vZGUKKyAgICAgICAgcmV0ID0gZXNjYXBl VGV4dENvbnRlbnRGb3JCcm93c2VyKGNvbnRlbnRUb1VzZSk7CisgICAgICAgIGlmIChwcm9jZXNz LmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAgICAgc2V0QW5kVmFsaWRh dGVDb250ZW50Q2hpbGREZXYuY2FsbCh0aGlzLCBjb250ZW50VG9Vc2UpOworICAgICAgICB9Cisg ICAgICB9IGVsc2UgaWYgKGNoaWxkcmVuVG9Vc2UgIT0gbnVsbCkgeworICAgICAgICB2YXIgbW91 bnRJbWFnZXMgPSB0aGlzLm1vdW50Q2hpbGRyZW4oY2hpbGRyZW5Ub1VzZSwgdHJhbnNhY3Rpb24s IGNvbnRleHQpOworICAgICAgICByZXQgPSBtb3VudEltYWdlcy5qb2luKCcnKTsKKyAgICAgIH0K KyAgICB9CisgICAgaWYgKG5ld2xpbmVFYXRpbmdUYWdzW3RoaXMuX3RhZ10gJiYgcmV0LmNoYXJB dCgwKSA9PT0gJ1xuJykgeworICAgICAgLy8gdGV4dC9odG1sIGlnbm9yZXMgdGhlIGZpcnN0IGNo YXJhY3RlciBpbiB0aGVzZSB0YWdzIGlmIGl0J3MgYSBuZXdsaW5lCisgICAgICAvLyBQcmVmZXIg dG8gYnJlYWsgYXBwbGljYXRpb24veG1sIG92ZXIgdGV4dC9odG1sIChmb3Igbm93KSBieSBhZGRp bmcKKyAgICAgIC8vIGEgbmV3bGluZSBzcGVjaWZpY2FsbHkgdG8gZ2V0IGVhdGVuIGJ5IHRoZSBw YXJzZXIuIChBbHRlcm5hdGVseSBmb3IKKyAgICAgIC8vIHRleHRhcmVhcywgcmVwbGFjaW5nICJe XG4iIHdpdGggIlxyXG4iIGRvZXNuJ3QgZ2V0IGVhdGVuLCBhbmQgdGhlIGZpcnN0CisgICAgICAv LyBcciBpcyBub3JtYWxpemVkIG91dCBieSBIVE1MVGV4dEFyZWFFbGVtZW50I3ZhbHVlLikKKyAg ICAgIC8vIFNlZTogPGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWwtcG9seWdsb3QvI25ld2xpbmVz LWluLXRleHRhcmVhLWFuZC1wcmU+CisgICAgICAvLyBTZWU6IDxodHRwOi8vd3d3LnczLm9yZy9U Ui9odG1sNS9zeW50YXguaHRtbCNlbGVtZW50LXJlc3RyaWN0aW9ucz4KKyAgICAgIC8vIFNlZTog PGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L3N5bnRheC5odG1sI25ld2xpbmVzPgorICAgICAg Ly8gU2VlOiBQYXJzaW5nIG9mICJ0ZXh0YXJlYSIgImxpc3RpbmciIGFuZCAicHJlIiBlbGVtZW50 cworICAgICAgLy8gIGZyb20gPGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L3N5bnRheC5odG1s I3BhcnNpbmctbWFpbi1pbmJvZHk+CisgICAgICByZXR1cm4gJ1xuJyArIHJldDsKKyAgICB9IGVs c2UgeworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgIH0sCisKKyAgX2NyZWF0ZUluaXRpYWxD aGlsZHJlbjogZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBwcm9wcywgY29udGV4dCwgbGF6eVRyZWUp IHsKKyAgICAvLyBJbnRlbnRpb25hbCB1c2Ugb2YgIT0gdG8gYXZvaWQgY2F0Y2hpbmcgemVyby9m YWxzZS4KKyAgICB2YXIgaW5uZXJIVE1MID0gcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw7 CisgICAgaWYgKGlubmVySFRNTCAhPSBudWxsKSB7CisgICAgICBpZiAoaW5uZXJIVE1MLl9faHRt bCAhPSBudWxsKSB7CisgICAgICAgIERPTUxhenlUcmVlLnF1ZXVlSFRNTChsYXp5VHJlZSwgaW5u ZXJIVE1MLl9faHRtbCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBjb250ZW50 VG9Vc2UgPSBDT05URU5UX1RZUEVTW3R5cGVvZiBwcm9wcy5jaGlsZHJlbl0gPyBwcm9wcy5jaGls ZHJlbiA6IG51bGw7CisgICAgICB2YXIgY2hpbGRyZW5Ub1VzZSA9IGNvbnRlbnRUb1VzZSAhPSBu dWxsID8gbnVsbCA6IHByb3BzLmNoaWxkcmVuOworICAgICAgLy8gVE9ETzogVmFsaWRhdGUgdGhh dCB0ZXh0IGlzIGFsbG93ZWQgYXMgYSBjaGlsZCBvZiB0aGlzIG5vZGUKKyAgICAgIGlmIChjb250 ZW50VG9Vc2UgIT0gbnVsbCkgeworICAgICAgICAvLyBBdm9pZCBzZXR0aW5nIHRleHRDb250ZW50 IHdoZW4gdGhlIHRleHQgaXMgZW1wdHkuIEluIElFMTEgc2V0dGluZworICAgICAgICAvLyB0ZXh0 Q29udGVudCBvbiBhIHRleHQgYXJlYSB3aWxsIGNhdXNlIHRoZSBwbGFjZWhvbGRlciB0byBub3QK KyAgICAgICAgLy8gc2hvdyB3aXRoaW4gdGhlIHRleHRhcmVhIHVudGlsIGl0IGhhcyBiZWVuIGZv Y3VzZWQgYW5kIGJsdXJyZWQgYWdhaW4uCisgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9m YWNlYm9vay9yZWFjdC9pc3N1ZXMvNjczMSNpc3N1ZWNvbW1lbnQtMjU0ODc0NTUzCisgICAgICAg IGlmIChjb250ZW50VG9Vc2UgIT09ICcnKSB7CisgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5P REVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICAgICAgIHNldEFuZFZhbGlkYXRlQ29u dGVudENoaWxkRGV2LmNhbGwodGhpcywgY29udGVudFRvVXNlKTsKKyAgICAgICAgICB9CisgICAg ICAgICAgRE9NTGF6eVRyZWUucXVldWVUZXh0KGxhenlUcmVlLCBjb250ZW50VG9Vc2UpOworICAg ICAgICB9CisgICAgICB9IGVsc2UgaWYgKGNoaWxkcmVuVG9Vc2UgIT0gbnVsbCkgeworICAgICAg ICB2YXIgbW91bnRJbWFnZXMgPSB0aGlzLm1vdW50Q2hpbGRyZW4oY2hpbGRyZW5Ub1VzZSwgdHJh bnNhY3Rpb24sIGNvbnRleHQpOworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vdW50SW1h Z2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgRE9NTGF6eVRyZWUucXVldWVDaGlsZChsYXp5 VHJlZSwgbW91bnRJbWFnZXNbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9LAor CisgIC8qKgorICAgKiBSZWNlaXZlcyBhIG5leHQgZWxlbWVudCBhbmQgdXBkYXRlcyB0aGUgY29t cG9uZW50LgorICAgKgorICAgKiBAaW50ZXJuYWwKKyAgICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9 IG5leHRFbGVtZW50CisgICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbnxSZWFj dFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9ufSB0cmFuc2FjdGlvbgorICAgKiBAcGFyYW0ge29i amVjdH0gY29udGV4dAorICAgKi8KKyAgcmVjZWl2ZUNvbXBvbmVudDogZnVuY3Rpb24gKG5leHRF bGVtZW50LCB0cmFuc2FjdGlvbiwgY29udGV4dCkgeworICAgIHZhciBwcmV2RWxlbWVudCA9IHRo aXMuX2N1cnJlbnRFbGVtZW50OworICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbmV4dEVsZW1l bnQ7CisgICAgdGhpcy51cGRhdGVDb21wb25lbnQodHJhbnNhY3Rpb24sIHByZXZFbGVtZW50LCBu ZXh0RWxlbWVudCwgY29udGV4dCk7CisgIH0sCisKKyAgLyoqCisgICAqIFVwZGF0ZXMgYSBET00g Y29tcG9uZW50IGFmdGVyIGl0IGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGFuZAorICAgKiBh dHRhY2hlZCB0byB0aGUgRE9NLiBSZWNvbmNpbGVzIHRoZSByb290IERPTSBub2RlLCB0aGVuIHJl Y3Vyc2VzLgorICAgKgorICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRy YW5zYWN0aW9uCisgICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBwcmV2RWxlbWVudAorICAgKiBA cGFyYW0ge1JlYWN0RWxlbWVudH0gbmV4dEVsZW1lbnQKKyAgICogQGludGVybmFsCisgICAqIEBv dmVycmlkYWJsZQorICAgKi8KKyAgdXBkYXRlQ29tcG9uZW50OiBmdW5jdGlvbiAodHJhbnNhY3Rp b24sIHByZXZFbGVtZW50LCBuZXh0RWxlbWVudCwgY29udGV4dCkgeworICAgIHZhciBsYXN0UHJv cHMgPSBwcmV2RWxlbWVudC5wcm9wczsKKyAgICB2YXIgbmV4dFByb3BzID0gdGhpcy5fY3VycmVu dEVsZW1lbnQucHJvcHM7CisKKyAgICBzd2l0Y2ggKHRoaXMuX3RhZykgeworICAgICAgY2FzZSAn aW5wdXQnOgorICAgICAgICBsYXN0UHJvcHMgPSBSZWFjdERPTUlucHV0LmdldEhvc3RQcm9wcyh0 aGlzLCBsYXN0UHJvcHMpOworICAgICAgICBuZXh0UHJvcHMgPSBSZWFjdERPTUlucHV0LmdldEhv c3RQcm9wcyh0aGlzLCBuZXh0UHJvcHMpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ29w dGlvbic6CisgICAgICAgIGxhc3RQcm9wcyA9IFJlYWN0RE9NT3B0aW9uLmdldEhvc3RQcm9wcyh0 aGlzLCBsYXN0UHJvcHMpOworICAgICAgICBuZXh0UHJvcHMgPSBSZWFjdERPTU9wdGlvbi5nZXRI b3N0UHJvcHModGhpcywgbmV4dFByb3BzKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdz ZWxlY3QnOgorICAgICAgICBsYXN0UHJvcHMgPSBSZWFjdERPTVNlbGVjdC5nZXRIb3N0UHJvcHMo dGhpcywgbGFzdFByb3BzKTsKKyAgICAgICAgbmV4dFByb3BzID0gUmVhY3RET01TZWxlY3QuZ2V0 SG9zdFByb3BzKHRoaXMsIG5leHRQcm9wcyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAn dGV4dGFyZWEnOgorICAgICAgICBsYXN0UHJvcHMgPSBSZWFjdERPTVRleHRhcmVhLmdldEhvc3RQ cm9wcyh0aGlzLCBsYXN0UHJvcHMpOworICAgICAgICBuZXh0UHJvcHMgPSBSZWFjdERPTVRleHRh cmVhLmdldEhvc3RQcm9wcyh0aGlzLCBuZXh0UHJvcHMpOworICAgICAgICBicmVhazsKKyAgICB9 CisKKyAgICBhc3NlcnRWYWxpZFByb3BzKHRoaXMsIG5leHRQcm9wcyk7CisgICAgdGhpcy5fdXBk YXRlRE9NUHJvcGVydGllcyhsYXN0UHJvcHMsIG5leHRQcm9wcywgdHJhbnNhY3Rpb24pOworICAg IHRoaXMuX3VwZGF0ZURPTUNoaWxkcmVuKGxhc3RQcm9wcywgbmV4dFByb3BzLCB0cmFuc2FjdGlv biwgY29udGV4dCk7CisKKyAgICBzd2l0Y2ggKHRoaXMuX3RhZykgeworICAgICAgY2FzZSAnaW5w dXQnOgorICAgICAgICAvLyBVcGRhdGUgdGhlIHdyYXBwZXIgYXJvdW5kIGlucHV0cyAqYWZ0ZXIq IHVwZGF0aW5nIHByb3BzLiBUaGlzIGhhcyB0bworICAgICAgICAvLyBoYXBwZW4gYWZ0ZXIgYF91 cGRhdGVET01Qcm9wZXJ0aWVzYC4gT3RoZXJ3aXNlIEhUTUw1IGlucHV0IHZhbGlkYXRpb25zCisg ICAgICAgIC8vIHJhaXNlIHdhcm5pbmdzIGFuZCBwcmV2ZW50IHRoZSBuZXcgdmFsdWUgZnJvbSBi ZWluZyBhc3NpZ25lZC4KKyAgICAgICAgUmVhY3RET01JbnB1dC51cGRhdGVXcmFwcGVyKHRoaXMp OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3RleHRhcmVhJzoKKyAgICAgICAgUmVhY3RE T01UZXh0YXJlYS51cGRhdGVXcmFwcGVyKHRoaXMpOworICAgICAgICBicmVhazsKKyAgICAgIGNh c2UgJ3NlbGVjdCc6CisgICAgICAgIC8vIDxzZWxlY3Q+IHZhbHVlIHVwZGF0ZSBuZWVkcyB0byBv Y2N1ciBhZnRlciA8b3B0aW9uPiBjaGlsZHJlbgorICAgICAgICAvLyByZWNvbmNpbGlhdGlvbgor ICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHBvc3RVcGRh dGVTZWxlY3RXcmFwcGVyLCB0aGlzKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9LAorCisg IC8qKgorICAgKiBSZWNvbmNpbGVzIHRoZSBwcm9wZXJ0aWVzIGJ5IGRldGVjdGluZyBkaWZmZXJl bmNlcyBpbiBwcm9wZXJ0eSB2YWx1ZXMgYW5kCisgICAqIHVwZGF0aW5nIHRoZSBET00gYXMgbmVj ZXNzYXJ5LiBUaGlzIGZ1bmN0aW9uIGlzIHByb2JhYmx5IHRoZSBzaW5nbGUgbW9zdAorICAgKiBj cml0aWNhbCBwYXRoIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uCisgICAqCisgICAqIFRP RE86IEJlbmNobWFyayB3aGV0aGVyIGNoZWNraW5nIGZvciBjaGFuZ2VkIHZhbHVlcyBpbiBtZW1v cnkgYWN0dWFsbHkKKyAgICogICAgICAgaW1wcm92ZXMgcGVyZm9ybWFuY2UgKGVzcGVjaWFsbHkg c3RhdGljYWxseSBwb3NpdGlvbmVkIGVsZW1lbnRzKS4KKyAgICogVE9ETzogQmVuY2htYXJrIHRo ZSBlZmZlY3RzIG9mIHB1dHRpbmcgdGhpcyBhdCB0aGUgdG9wIHNpbmNlIDk5JSBvZiBwcm9wcwor ICAgKiAgICAgICBkbyBub3QgY2hhbmdlIGZvciBhIGdpdmVuIHJlY29uY2lsaWF0aW9uLgorICAg KiBUT0RPOiBCZW5jaG1hcmsgYXJlYXMgdGhhdCBjYW4gYmUgaW1wcm92ZWQgd2l0aCBjYWNoaW5n LgorICAgKgorICAgKiBAcHJpdmF0ZQorICAgKiBAcGFyYW0ge29iamVjdH0gbGFzdFByb3BzCisg ICAqIEBwYXJhbSB7b2JqZWN0fSBuZXh0UHJvcHMKKyAgICogQHBhcmFtIHs/RE9NRWxlbWVudH0g bm9kZQorICAgKi8KKyAgX3VwZGF0ZURPTVByb3BlcnRpZXM6IGZ1bmN0aW9uIChsYXN0UHJvcHMs IG5leHRQcm9wcywgdHJhbnNhY3Rpb24pIHsKKyAgICB2YXIgcHJvcEtleTsKKyAgICB2YXIgc3R5 bGVOYW1lOworICAgIHZhciBzdHlsZVVwZGF0ZXM7CisgICAgZm9yIChwcm9wS2V5IGluIGxhc3RQ cm9wcykgeworICAgICAgaWYgKG5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSB8fCAh bGFzdFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8IGxhc3RQcm9wc1twcm9wS2V5XSA9 PSBudWxsKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHByb3BLZXkg PT09IFNUWUxFKSB7CisgICAgICAgIHZhciBsYXN0U3R5bGUgPSB0aGlzLl9wcmV2aW91c1N0eWxl Q29weTsKKyAgICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbGFzdFN0eWxlKSB7CisgICAgICAgICAg aWYgKGxhc3RTdHlsZS5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7CisgICAgICAgICAgICBz dHlsZVVwZGF0ZXMgPSBzdHlsZVVwZGF0ZXMgfHwge307CisgICAgICAgICAgICBzdHlsZVVwZGF0 ZXNbc3R5bGVOYW1lXSA9ICcnOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aGlz Ll9wcmV2aW91c1N0eWxlQ29weSA9IG51bGw7CisgICAgICB9IGVsc2UgaWYgKHJlZ2lzdHJhdGlv bk5hbWVNb2R1bGVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7CisgICAgICAgIGlmIChsYXN0 UHJvcHNbcHJvcEtleV0pIHsKKyAgICAgICAgICAvLyBPbmx5IGNhbGwgZGVsZXRlTGlzdGVuZXIg aWYgdGhlcmUgd2FzIGEgbGlzdGVuZXIgcHJldmlvdXNseSBvcgorICAgICAgICAgIC8vIGVsc2Ug d2lsbERlbGV0ZUxpc3RlbmVyIGdldHMgY2FsbGVkIHdoZW4gdGhlcmUgd2Fzbid0IGFjdHVhbGx5 IGEKKyAgICAgICAgICAvLyBsaXN0ZW5lciAoZS5nLiwgb25DbGljaz17bnVsbH0pCisgICAgICAg ICAgZGVsZXRlTGlzdGVuZXIodGhpcywgcHJvcEtleSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxz ZSBpZiAoaXNDdXN0b21Db21wb25lbnQodGhpcy5fdGFnLCBsYXN0UHJvcHMpKSB7CisgICAgICAg IGlmICghUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHsKKyAgICAgICAg ICBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuZGVsZXRlVmFsdWVGb3JBdHRyaWJ1dGUoZ2V0Tm9kZSh0 aGlzKSwgcHJvcEtleSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoRE9NUHJvcGVydHku cHJvcGVydGllc1twcm9wS2V5XSB8fCBET01Qcm9wZXJ0eS5pc0N1c3RvbUF0dHJpYnV0ZShwcm9w S2V5KSkgeworICAgICAgICBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuZGVsZXRlVmFsdWVGb3JQcm9w ZXJ0eShnZXROb2RlKHRoaXMpLCBwcm9wS2V5KTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yIChw cm9wS2V5IGluIG5leHRQcm9wcykgeworICAgICAgdmFyIG5leHRQcm9wID0gbmV4dFByb3BzW3By b3BLZXldOworICAgICAgdmFyIGxhc3RQcm9wID0gcHJvcEtleSA9PT0gU1RZTEUgPyB0aGlzLl9w cmV2aW91c1N0eWxlQ29weSA6IGxhc3RQcm9wcyAhPSBudWxsID8gbGFzdFByb3BzW3Byb3BLZXld IDogdW5kZWZpbmVkOworICAgICAgaWYgKCFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtl eSkgfHwgbmV4dFByb3AgPT09IGxhc3RQcm9wIHx8IG5leHRQcm9wID09IG51bGwgJiYgbGFzdFBy b3AgPT0gbnVsbCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChwcm9w S2V5ID09PSBTVFlMRSkgeworICAgICAgICBpZiAobmV4dFByb3ApIHsKKyAgICAgICAgICBpZiAo cHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgICAgICAgY2hl Y2tBbmRXYXJuRm9yTXV0YXRlZFN0eWxlKHRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5LCB0aGlzLl9w cmV2aW91c1N0eWxlLCB0aGlzKTsKKyAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzU3R5bGUgPSBu ZXh0UHJvcDsKKyAgICAgICAgICB9CisgICAgICAgICAgbmV4dFByb3AgPSB0aGlzLl9wcmV2aW91 c1N0eWxlQ29weSA9IF9hc3NpZ24oe30sIG5leHRQcm9wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAg ICAgICAgICB0aGlzLl9wcmV2aW91c1N0eWxlQ29weSA9IG51bGw7CisgICAgICAgIH0KKyAgICAg ICAgaWYgKGxhc3RQcm9wKSB7CisgICAgICAgICAgLy8gVW5zZXQgc3R5bGVzIG9uIGBsYXN0UHJv cGAgYnV0IG5vdCBvbiBgbmV4dFByb3BgLgorICAgICAgICAgIGZvciAoc3R5bGVOYW1lIGluIGxh c3RQcm9wKSB7CisgICAgICAgICAgICBpZiAobGFzdFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVO YW1lKSAmJiAoIW5leHRQcm9wIHx8ICFuZXh0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUp KSkgeworICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSBzdHlsZVVwZGF0ZXMgfHwge307Cisg ICAgICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gJyc7CisgICAgICAgICAgICB9 CisgICAgICAgICAgfQorICAgICAgICAgIC8vIFVwZGF0ZSBzdHlsZXMgdGhhdCBjaGFuZ2VkIHNp bmNlIGBsYXN0UHJvcGAuCisgICAgICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbmV4dFByb3ApIHsK KyAgICAgICAgICAgIGlmIChuZXh0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpICYmIGxh c3RQcm9wW3N0eWxlTmFtZV0gIT09IG5leHRQcm9wW3N0eWxlTmFtZV0pIHsKKyAgICAgICAgICAg ICAgc3R5bGVVcGRhdGVzID0gc3R5bGVVcGRhdGVzIHx8IHt9OworICAgICAgICAgICAgICBzdHls ZVVwZGF0ZXNbc3R5bGVOYW1lXSA9IG5leHRQcm9wW3N0eWxlTmFtZV07CisgICAgICAgICAgICB9 CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFJlbGllcyBvbiBg dXBkYXRlU3R5bGVzQnlJRGAgbm90IG11dGF0aW5nIGBzdHlsZVVwZGF0ZXNgLgorICAgICAgICAg IHN0eWxlVXBkYXRlcyA9IG5leHRQcm9wOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKHJl Z2lzdHJhdGlvbk5hbWVNb2R1bGVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7CisgICAgICAg IGlmIChuZXh0UHJvcCkgeworICAgICAgICAgIGVucXVldWVQdXRMaXN0ZW5lcih0aGlzLCBwcm9w S2V5LCBuZXh0UHJvcCwgdHJhbnNhY3Rpb24pOworICAgICAgICB9IGVsc2UgaWYgKGxhc3RQcm9w KSB7CisgICAgICAgICAgZGVsZXRlTGlzdGVuZXIodGhpcywgcHJvcEtleSk7CisgICAgICAgIH0K KyAgICAgIH0gZWxzZSBpZiAoaXNDdXN0b21Db21wb25lbnQodGhpcy5fdGFnLCBuZXh0UHJvcHMp KSB7CisgICAgICAgIGlmICghUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcEtleSkp IHsKKyAgICAgICAgICBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuc2V0VmFsdWVGb3JBdHRyaWJ1dGUo Z2V0Tm9kZSh0aGlzKSwgcHJvcEtleSwgbmV4dFByb3ApOworICAgICAgICB9CisgICAgICB9IGVs c2UgaWYgKERPTVByb3BlcnR5LnByb3BlcnRpZXNbcHJvcEtleV0gfHwgRE9NUHJvcGVydHkuaXND dXN0b21BdHRyaWJ1dGUocHJvcEtleSkpIHsKKyAgICAgICAgdmFyIG5vZGUgPSBnZXROb2RlKHRo aXMpOworICAgICAgICAvLyBJZiB3ZSdyZSB1cGRhdGluZyB0byBudWxsIG9yIHVuZGVmaW5lZCwg d2Ugc2hvdWxkIHJlbW92ZSB0aGUgcHJvcGVydHkKKyAgICAgICAgLy8gZnJvbSB0aGUgRE9NIG5v ZGUgaW5zdGVhZCBvZiBpbmFkdmVydGVudGx5IHNldHRpbmcgdG8gYSBzdHJpbmcuIFRoaXMKKyAg ICAgICAgLy8gYnJpbmdzIHVzIGluIGxpbmUgd2l0aCB0aGUgc2FtZSBiZWhhdmlvciB3ZSBoYXZl IG9uIGluaXRpYWwgcmVuZGVyLgorICAgICAgICBpZiAobmV4dFByb3AgIT0gbnVsbCkgeworICAg ICAgICAgIERPTVByb3BlcnR5T3BlcmF0aW9ucy5zZXRWYWx1ZUZvclByb3BlcnR5KG5vZGUsIHBy b3BLZXksIG5leHRQcm9wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBET01Qcm9wZXJ0 eU9wZXJhdGlvbnMuZGVsZXRlVmFsdWVGb3JQcm9wZXJ0eShub2RlLCBwcm9wS2V5KTsKKyAgICAg ICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoc3R5bGVVcGRhdGVzKSB7CisgICAgICBDU1NQ cm9wZXJ0eU9wZXJhdGlvbnMuc2V0VmFsdWVGb3JTdHlsZXMoZ2V0Tm9kZSh0aGlzKSwgc3R5bGVV cGRhdGVzLCB0aGlzKTsKKyAgICB9CisgIH0sCisKKyAgLyoqCisgICAqIFJlY29uY2lsZXMgdGhl IGNoaWxkcmVuIHdpdGggdGhlIHZhcmlvdXMgcHJvcGVydGllcyB0aGF0IGFmZmVjdCB0aGUKKyAg ICogY2hpbGRyZW4gY29udGVudC4KKyAgICoKKyAgICogQHBhcmFtIHtvYmplY3R9IGxhc3RQcm9w cworICAgKiBAcGFyYW0ge29iamVjdH0gbmV4dFByb3BzCisgICAqIEBwYXJhbSB7UmVhY3RSZWNv bmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24KKyAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRl eHQKKyAgICovCisgIF91cGRhdGVET01DaGlsZHJlbjogZnVuY3Rpb24gKGxhc3RQcm9wcywgbmV4 dFByb3BzLCB0cmFuc2FjdGlvbiwgY29udGV4dCkgeworICAgIHZhciBsYXN0Q29udGVudCA9IENP TlRFTlRfVFlQRVNbdHlwZW9mIGxhc3RQcm9wcy5jaGlsZHJlbl0gPyBsYXN0UHJvcHMuY2hpbGRy ZW4gOiBudWxsOworICAgIHZhciBuZXh0Q29udGVudCA9IENPTlRFTlRfVFlQRVNbdHlwZW9mIG5l eHRQcm9wcy5jaGlsZHJlbl0gPyBuZXh0UHJvcHMuY2hpbGRyZW4gOiBudWxsOworCisgICAgdmFy IGxhc3RIdG1sID0gbGFzdFByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICYmIGxhc3RQcm9w cy5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWw7CisgICAgdmFyIG5leHRIdG1sID0gbmV4 dFByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICYmIG5leHRQcm9wcy5kYW5nZXJvdXNseVNl dElubmVySFRNTC5fX2h0bWw7CisKKyAgICAvLyBOb3RlIHRoZSB1c2Ugb2YgYCE9YCB3aGljaCBj aGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkLgorICAgIHZhciBsYXN0Q2hpbGRyZW4gPSBsYXN0 Q29udGVudCAhPSBudWxsID8gbnVsbCA6IGxhc3RQcm9wcy5jaGlsZHJlbjsKKyAgICB2YXIgbmV4 dENoaWxkcmVuID0gbmV4dENvbnRlbnQgIT0gbnVsbCA/IG51bGwgOiBuZXh0UHJvcHMuY2hpbGRy ZW47CisKKyAgICAvLyBJZiB3ZSdyZSBzd2l0Y2hpbmcgZnJvbSBjaGlsZHJlbiB0byBjb250ZW50 L2h0bWwgb3IgdmljZSB2ZXJzYSwgcmVtb3ZlCisgICAgLy8gdGhlIG9sZCBjb250ZW50CisgICAg dmFyIGxhc3RIYXNDb250ZW50T3JIdG1sID0gbGFzdENvbnRlbnQgIT0gbnVsbCB8fCBsYXN0SHRt bCAhPSBudWxsOworICAgIHZhciBuZXh0SGFzQ29udGVudE9ySHRtbCA9IG5leHRDb250ZW50ICE9 IG51bGwgfHwgbmV4dEh0bWwgIT0gbnVsbDsKKyAgICBpZiAobGFzdENoaWxkcmVuICE9IG51bGwg JiYgbmV4dENoaWxkcmVuID09IG51bGwpIHsKKyAgICAgIHRoaXMudXBkYXRlQ2hpbGRyZW4obnVs bCwgdHJhbnNhY3Rpb24sIGNvbnRleHQpOworICAgIH0gZWxzZSBpZiAobGFzdEhhc0NvbnRlbnRP ckh0bWwgJiYgIW5leHRIYXNDb250ZW50T3JIdG1sKSB7CisgICAgICB0aGlzLnVwZGF0ZVRleHRD b250ZW50KCcnKTsKKyAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rp b24nKSB7CisgICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblNldENoaWxk cmVuKHRoaXMuX2RlYnVnSUQsIFtdKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobmV4dENv bnRlbnQgIT0gbnVsbCkgeworICAgICAgaWYgKGxhc3RDb250ZW50ICE9PSBuZXh0Q29udGVudCkg eworICAgICAgICB0aGlzLnVwZGF0ZVRleHRDb250ZW50KCcnICsgbmV4dENvbnRlbnQpOworICAg ICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAg ICAgIHNldEFuZFZhbGlkYXRlQ29udGVudENoaWxkRGV2LmNhbGwodGhpcywgbmV4dENvbnRlbnQp OworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChuZXh0SHRtbCAhPSBudWxsKSB7 CisgICAgICBpZiAobGFzdEh0bWwgIT09IG5leHRIdG1sKSB7CisgICAgICAgIHRoaXMudXBkYXRl TWFya3VwKCcnICsgbmV4dEh0bWwpOworICAgICAgfQorICAgICAgaWYgKHByb2Nlc3MuZW52Lk5P REVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24u ZGVidWdUb29sLm9uU2V0Q2hpbGRyZW4odGhpcy5fZGVidWdJRCwgW10pOworICAgICAgfQorICAg IH0gZWxzZSBpZiAobmV4dENoaWxkcmVuICE9IG51bGwpIHsKKyAgICAgIGlmIChwcm9jZXNzLmVu di5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAgIHNldEFuZFZhbGlkYXRlQ29u dGVudENoaWxkRGV2LmNhbGwodGhpcywgbnVsbCk7CisgICAgICB9CisKKyAgICAgIHRoaXMudXBk YXRlQ2hpbGRyZW4obmV4dENoaWxkcmVuLCB0cmFuc2FjdGlvbiwgY29udGV4dCk7CisgICAgfQor ICB9LAorCisgIGdldEhvc3ROb2RlOiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIGdldE5vZGUo dGhpcyk7CisgIH0sCisKKyAgLyoqCisgICAqIERlc3Ryb3lzIGFsbCBldmVudCByZWdpc3RyYXRp b25zIGZvciB0aGlzIGluc3RhbmNlLiBEb2VzIG5vdCByZW1vdmUgZnJvbQorICAgKiB0aGUgRE9N LiBUaGF0IG11c3QgYmUgZG9uZSBieSB0aGUgcGFyZW50LgorICAgKgorICAgKiBAaW50ZXJuYWwK KyAgICovCisgIHVubW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChzYWZlbHkpIHsKKyAgICBzd2l0 Y2ggKHRoaXMuX3RhZykgeworICAgICAgY2FzZSAnYXVkaW8nOgorICAgICAgY2FzZSAnZm9ybSc6 CisgICAgICBjYXNlICdpZnJhbWUnOgorICAgICAgY2FzZSAnaW1nJzoKKyAgICAgIGNhc2UgJ2xp bmsnOgorICAgICAgY2FzZSAnb2JqZWN0JzoKKyAgICAgIGNhc2UgJ3NvdXJjZSc6CisgICAgICBj YXNlICd2aWRlbyc6CisgICAgICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl93cmFwcGVyU3RhdGUu bGlzdGVuZXJzOworICAgICAgICBpZiAobGlzdGVuZXJzKSB7CisgICAgICAgICAgZm9yICh2YXIg aSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGxpc3RlbmVy c1tpXS5yZW1vdmUoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7Cisg ICAgICBjYXNlICdodG1sJzoKKyAgICAgIGNhc2UgJ2hlYWQnOgorICAgICAgY2FzZSAnYm9keSc6 CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb21wb25lbnRzIGxpa2UgPGh0bWw+IDxoZWFkPiBh bmQgPGJvZHk+IGNhbid0IGJlIHJlbW92ZWQgb3IgYWRkZWQKKyAgICAgICAgICogZWFzaWx5IGlu IGEgY3Jvc3MtYnJvd3NlciB3YXksIGhvd2V2ZXIgaXQncyB2YWx1YWJsZSB0byBiZSBhYmxlIHRv CisgICAgICAgICAqIHRha2UgYWR2YW50YWdlIG9mIFJlYWN0J3MgcmVjb25jaWxpYXRpb24gZm9y IHN0eWxpbmcgYW5kIDx0aXRsZT4KKyAgICAgICAgICogbWFuYWdlbWVudC4gU28gd2UganVzdCBk b2N1bWVudCBpdCBhbmQgdGhyb3cgaW4gZGFuZ2Vyb3VzIGNhc2VzLgorICAgICAgICAgKi8KKyAg ICAgICAgIWZhbHNlID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGlu dmFyaWFudChmYWxzZSwgJzwlcz4gdHJpZWQgdG8gdW5tb3VudC4gQmVjYXVzZSBvZiBjcm9zcy1i cm93c2VyIHF1aXJrcyBpdCBpcyBpbXBvc3NpYmxlIHRvIHVubW91bnQgc29tZSB0b3AtbGV2ZWwg Y29tcG9uZW50cyAoZWcgPGh0bWw+LCA8aGVhZD4sIGFuZCA8Ym9keT4pIHJlbGlhYmx5IGFuZCBl ZmZpY2llbnRseS4gVG8gZml4IHRoaXMsIGhhdmUgYSBzaW5nbGUgdG9wLWxldmVsIGNvbXBvbmVu dCB0aGF0IG5ldmVyIHVubW91bnRzIHJlbmRlciB0aGVzZSBlbGVtZW50cy4nLCB0aGlzLl90YWcp IDogX3Byb2RJbnZhcmlhbnQoJzY2JywgdGhpcy5fdGFnKSA6IHZvaWQgMDsKKyAgICAgICAgYnJl YWs7CisgICAgfQorCisgICAgdGhpcy51bm1vdW50Q2hpbGRyZW4oc2FmZWx5KTsKKyAgICBSZWFj dERPTUNvbXBvbmVudFRyZWUudW5jYWNoZU5vZGUodGhpcyk7CisgICAgRXZlbnRQbHVnaW5IdWIu ZGVsZXRlQWxsTGlzdGVuZXJzKHRoaXMpOworICAgIHRoaXMuX3Jvb3ROb2RlSUQgPSAwOworICAg IHRoaXMuX2RvbUlEID0gMDsKKyAgICB0aGlzLl93cmFwcGVyU3RhdGUgPSBudWxsOworCisgICAg aWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIHNldEFu ZFZhbGlkYXRlQ29udGVudENoaWxkRGV2LmNhbGwodGhpcywgbnVsbCk7CisgICAgfQorICB9LAor CisgIGdldFB1YmxpY0luc3RhbmNlOiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIGdldE5vZGUo dGhpcyk7CisgIH0KKworfTsKKworX2Fzc2lnbihSZWFjdERPTUNvbXBvbmVudC5wcm90b3R5cGUs IFJlYWN0RE9NQ29tcG9uZW50Lk1peGluLCBSZWFjdE11bHRpQ2hpbGQuTWl4aW4pOworCittb2R1 bGUuZXhwb3J0cyA9IFJlYWN0RE9NQ29tcG9uZW50OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZp bGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9S ZWFjdERPTUNvbXBvbmVudEZsYWdzLmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFj dC1kb20vbGliL1JlYWN0RE9NQ29tcG9uZW50RmxhZ3MuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMDAuLjg0ZjJkMTk5Ci0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4v c3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0RE9NQ29tcG9uZW50RmxhZ3MuanMKQEAg LTAsMCArMSwxNyBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxNS1wcmVzZW50LCBGYWNlYm9vaywg SW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlz IGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJ Q0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4g YWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhl IFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3Ry aWN0JzsKKwordmFyIFJlYWN0RE9NQ29tcG9uZW50RmxhZ3MgPSB7CisgIGhhc0NhY2hlZENoaWxk Tm9kZXM6IDEgPDwgMAorfTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTUNvbXBvbmVudEZs YWdzOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWlu L3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdERPTUNvbXBvbmVudFRyZWUuanMgYi93 ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RET01Db21wb25lbnRU cmVlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi4yYjM0ZGRmNwotLS0g L2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9S ZWFjdERPTUNvbXBvbmVudFRyZWUuanMKQEAgLTAsMCArMSwxOTQgQEAKKy8qKgorICogQ29weXJp Z2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQu CisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxl IGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0 b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVu dCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGly ZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJvZEludmFyaWFudCA9 IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7CisKK3ZhciBET01Qcm9wZXJ0eSA9IHJl cXVpcmUoJy4vRE9NUHJvcGVydHknKTsKK3ZhciBSZWFjdERPTUNvbXBvbmVudEZsYWdzID0gcmVx dWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudEZsYWdzJyk7CisKK3ZhciBpbnZhcmlhbnQgPSByZXF1 aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTsKKwordmFyIEFUVFJfTkFNRSA9IERPTVByb3BlcnR5 LklEX0FUVFJJQlVURV9OQU1FOwordmFyIEZsYWdzID0gUmVhY3RET01Db21wb25lbnRGbGFnczsK KwordmFyIGludGVybmFsSW5zdGFuY2VLZXkgPSAnX19yZWFjdEludGVybmFsSW5zdGFuY2UkJyAr IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpOworCisvKioKKyAqIENoZWNrIGlm IGEgZ2l2ZW4gbm9kZSBzaG91bGQgYmUgY2FjaGVkLgorICovCitmdW5jdGlvbiBzaG91bGRQcmVj YWNoZU5vZGUobm9kZSwgbm9kZUlEKSB7CisgIHJldHVybiBub2RlLm5vZGVUeXBlID09PSAxICYm IG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSkgPT09IFN0cmluZyhub2RlSUQpIHx8IG5vZGUu bm9kZVR5cGUgPT09IDggJiYgbm9kZS5ub2RlVmFsdWUgPT09ICcgcmVhY3QtdGV4dDogJyArIG5v ZGVJRCArICcgJyB8fCBub2RlLm5vZGVUeXBlID09PSA4ICYmIG5vZGUubm9kZVZhbHVlID09PSAn IHJlYWN0LWVtcHR5OiAnICsgbm9kZUlEICsgJyAnOworfQorCisvKioKKyAqIERyaWxsIGRvd24g KHRocm91Z2ggY29tcG9zaXRlcyBhbmQgZW1wdHkgY29tcG9uZW50cykgdW50aWwgd2UgZ2V0IGEg aG9zdCBvcgorICogaG9zdCB0ZXh0IGNvbXBvbmVudC4KKyAqCisgKiBUaGlzIGlzIHByZXR0eSBw b2x5bW9ycGhpYyBidXQgdW5hdm9pZGFibGUgd2l0aCB0aGUgY3VycmVudCBzdHJ1Y3R1cmUgd2Ug aGF2ZQorICogZm9yIGBfcmVuZGVyZWRDaGlsZHJlbmAuCisgKi8KK2Z1bmN0aW9uIGdldFJlbmRl cmVkSG9zdE9yVGV4dEZyb21Db21wb25lbnQoY29tcG9uZW50KSB7CisgIHZhciByZW5kZXJlZDsK KyAgd2hpbGUgKHJlbmRlcmVkID0gY29tcG9uZW50Ll9yZW5kZXJlZENvbXBvbmVudCkgeworICAg IGNvbXBvbmVudCA9IHJlbmRlcmVkOworICB9CisgIHJldHVybiBjb21wb25lbnQ7Cit9CisKKy8q KgorICogUG9wdWxhdGUgYF9ob3N0Tm9kZWAgb24gdGhlIHJlbmRlcmVkIGhvc3QvdGV4dCBjb21w b25lbnQgd2l0aCB0aGUgZ2l2ZW4KKyAqIERPTSBub2RlLiBUaGUgcGFzc2VkIGBpbnN0YCBjYW4g YmUgYSBjb21wb3NpdGUuCisgKi8KK2Z1bmN0aW9uIHByZWNhY2hlTm9kZShpbnN0LCBub2RlKSB7 CisgIHZhciBob3N0SW5zdCA9IGdldFJlbmRlcmVkSG9zdE9yVGV4dEZyb21Db21wb25lbnQoaW5z dCk7CisgIGhvc3RJbnN0Ll9ob3N0Tm9kZSA9IG5vZGU7CisgIG5vZGVbaW50ZXJuYWxJbnN0YW5j ZUtleV0gPSBob3N0SW5zdDsKK30KKworZnVuY3Rpb24gdW5jYWNoZU5vZGUoaW5zdCkgeworICB2 YXIgbm9kZSA9IGluc3QuX2hvc3ROb2RlOworICBpZiAobm9kZSkgeworICAgIGRlbGV0ZSBub2Rl W2ludGVybmFsSW5zdGFuY2VLZXldOworICAgIGluc3QuX2hvc3ROb2RlID0gbnVsbDsKKyAgfQor fQorCisvKioKKyAqIFBvcHVsYXRlIGBfaG9zdE5vZGVgIG9uIGVhY2ggY2hpbGQgb2YgYGluc3Rg LCBhc3N1bWluZyB0aGF0IHRoZSBjaGlsZHJlbgorICogbWF0Y2ggdXAgd2l0aCB0aGUgRE9NIChl bGVtZW50KSBjaGlsZHJlbiBvZiBgbm9kZWAuCisgKgorICogV2UgY2FjaGUgZW50aXJlIGxldmVs cyBhdCBvbmNlIHRvIGF2b2lkIGFuIG5eMiBwcm9ibGVtIHdoZXJlIHdlIGFjY2VzcyB0aGUKKyAq IGNoaWxkcmVuIG9mIGEgbm9kZSBzZXF1ZW50aWFsbHkgYW5kIGhhdmUgdG8gd2FsayBmcm9tIHRo ZSBzdGFydCB0byBvdXIgdGFyZ2V0CisgKiBub2RlIGV2ZXJ5IHRpbWUuCisgKgorICogU2luY2Ug d2UgdXBkYXRlIGBfcmVuZGVyZWRDaGlsZHJlbmAgYW5kIHRoZSBhY3R1YWwgRE9NIGF0IChzbGln aHRseSkKKyAqIGRpZmZlcmVudCB0aW1lcywgd2UgY291bGQgcmFjZSBoZXJlIGFuZCBzZWUgYSBu ZXdlciBgX3JlbmRlcmVkQ2hpbGRyZW5gIHRoYW4KKyAqIHRoZSBET00gbm9kZXMgd2Ugc2VlLiBU byBhdm9pZCB0aGlzLCBSZWFjdE11bHRpQ2hpbGQgY2FsbHMKKyAqIGBwcmVwYXJlVG9NYW5hZ2VD aGlsZHJlbmAgYmVmb3JlIHdlIGNoYW5nZSBgX3JlbmRlcmVkQ2hpbGRyZW5gLCBhdCB3aGljaAor ICogdGltZSB0aGUgY29udGFpbmVyJ3MgY2hpbGQgbm9kZXMgYXJlIGFsd2F5cyBjYWNoZWQgKHVu dGlsIGl0IHVubW91bnRzKS4KKyAqLworZnVuY3Rpb24gcHJlY2FjaGVDaGlsZE5vZGVzKGluc3Qs IG5vZGUpIHsKKyAgaWYgKGluc3QuX2ZsYWdzICYgRmxhZ3MuaGFzQ2FjaGVkQ2hpbGROb2Rlcykg eworICAgIHJldHVybjsKKyAgfQorICB2YXIgY2hpbGRyZW4gPSBpbnN0Ll9yZW5kZXJlZENoaWxk cmVuOworICB2YXIgY2hpbGROb2RlID0gbm9kZS5maXJzdENoaWxkOworICBvdXRlcjogZm9yICh2 YXIgbmFtZSBpbiBjaGlsZHJlbikgeworICAgIGlmICghY2hpbGRyZW4uaGFzT3duUHJvcGVydHko bmFtZSkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICB2YXIgY2hpbGRJbnN0ID0gY2hp bGRyZW5bbmFtZV07CisgICAgdmFyIGNoaWxkSUQgPSBnZXRSZW5kZXJlZEhvc3RPclRleHRGcm9t Q29tcG9uZW50KGNoaWxkSW5zdCkuX2RvbUlEOworICAgIGlmIChjaGlsZElEID09PSAwKSB7Cisg ICAgICAvLyBXZSdyZSBjdXJyZW50bHkgdW5tb3VudGluZyB0aGlzIGNoaWxkIGluIFJlYWN0TXVs dGlDaGlsZDsgc2tpcCBpdC4KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAvLyBXZSBhc3N1 bWUgdGhlIGNoaWxkIG5vZGVzIGFyZSBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgY2hpbGQgaW5z dGFuY2VzLgorICAgIGZvciAoOyBjaGlsZE5vZGUgIT09IG51bGw7IGNoaWxkTm9kZSA9IGNoaWxk Tm9kZS5uZXh0U2libGluZykgeworICAgICAgaWYgKHNob3VsZFByZWNhY2hlTm9kZShjaGlsZE5v ZGUsIGNoaWxkSUQpKSB7CisgICAgICAgIHByZWNhY2hlTm9kZShjaGlsZEluc3QsIGNoaWxkTm9k ZSk7CisgICAgICAgIGNvbnRpbnVlIG91dGVyOworICAgICAgfQorICAgIH0KKyAgICAvLyBXZSBy ZWFjaGVkIHRoZSBlbmQgb2YgdGhlIERPTSBjaGlsZHJlbiB3aXRob3V0IGZpbmRpbmcgYW4gSUQg bWF0Y2guCisgICAgIWZhbHNlID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9u JyA/IGludmFyaWFudChmYWxzZSwgJ1VuYWJsZSB0byBmaW5kIGVsZW1lbnQgd2l0aCBJRCAlcy4n LCBjaGlsZElEKSA6IF9wcm9kSW52YXJpYW50KCczMicsIGNoaWxkSUQpIDogdm9pZCAwOworICB9 CisgIGluc3QuX2ZsYWdzIHw9IEZsYWdzLmhhc0NhY2hlZENoaWxkTm9kZXM7Cit9CisKKy8qKgor ICogR2l2ZW4gYSBET00gbm9kZSwgcmV0dXJuIHRoZSBjbG9zZXN0IFJlYWN0RE9NQ29tcG9uZW50 IG9yCisgKiBSZWFjdERPTVRleHRDb21wb25lbnQgaW5zdGFuY2UgYW5jZXN0b3IuCisgKi8KK2Z1 bmN0aW9uIGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5vZGUpIHsKKyAgaWYgKG5vZGVbaW50 ZXJuYWxJbnN0YW5jZUtleV0pIHsKKyAgICByZXR1cm4gbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5 XTsKKyAgfQorCisgIC8vIFdhbGsgdXAgdGhlIHRyZWUgdW50aWwgd2UgZmluZCBhbiBhbmNlc3Rv ciB3aG9zZSBpbnN0YW5jZSB3ZSBoYXZlIGNhY2hlZC4KKyAgdmFyIHBhcmVudHMgPSBbXTsKKyAg d2hpbGUgKCFub2RlW2ludGVybmFsSW5zdGFuY2VLZXldKSB7CisgICAgcGFyZW50cy5wdXNoKG5v ZGUpOworICAgIGlmIChub2RlLnBhcmVudE5vZGUpIHsKKyAgICAgIG5vZGUgPSBub2RlLnBhcmVu dE5vZGU7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRvcCBvZiB0aGUgdHJlZS4gVGhpcyBub2Rl IG11c3Qgbm90IGJlIHBhcnQgb2YgYSBSZWFjdCB0cmVlIChvciBpcworICAgICAgLy8gdW5tb3Vu dGVkLCBwb3RlbnRpYWxseSkuCisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICB2 YXIgY2xvc2VzdDsKKyAgdmFyIGluc3Q7CisgIGZvciAoOyBub2RlICYmIChpbnN0ID0gbm9kZVtp bnRlcm5hbEluc3RhbmNlS2V5XSk7IG5vZGUgPSBwYXJlbnRzLnBvcCgpKSB7CisgICAgY2xvc2Vz dCA9IGluc3Q7CisgICAgaWYgKHBhcmVudHMubGVuZ3RoKSB7CisgICAgICBwcmVjYWNoZUNoaWxk Tm9kZXMoaW5zdCwgbm9kZSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGNsb3Nlc3Q7Cit9CisK Ky8qKgorICogR2l2ZW4gYSBET00gbm9kZSwgcmV0dXJuIHRoZSBSZWFjdERPTUNvbXBvbmVudCBv ciBSZWFjdERPTVRleHRDb21wb25lbnQKKyAqIGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBub2Rl IHdhcyBub3QgcmVuZGVyZWQgYnkgdGhpcyBSZWFjdC4KKyAqLworZnVuY3Rpb24gZ2V0SW5zdGFu Y2VGcm9tTm9kZShub2RlKSB7CisgIHZhciBpbnN0ID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5v ZGUobm9kZSk7CisgIGlmIChpbnN0ICE9IG51bGwgJiYgaW5zdC5faG9zdE5vZGUgPT09IG5vZGUp IHsKKyAgICByZXR1cm4gaW5zdDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQor fQorCisvKioKKyAqIEdpdmVuIGEgUmVhY3RET01Db21wb25lbnQgb3IgUmVhY3RET01UZXh0Q29t cG9uZW50LCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcKKyAqIERPTSBub2RlLgorICovCitmdW5j dGlvbiBnZXROb2RlRnJvbUluc3RhbmNlKGluc3QpIHsKKyAgLy8gV2l0aG91dCB0aGlzIGZpcnN0 IGludmFyaWFudCwgcGFzc2luZyBhIG5vbi1ET00tY29tcG9uZW50IHRyaWdnZXJzIHRoZSBuZXh0 CisgIC8vIGludmFyaWFudCBmb3IgYSBtaXNzaW5nIHBhcmVudCwgd2hpY2ggaXMgc3VwZXIgY29u ZnVzaW5nLgorICAhKGluc3QuX2hvc3ROb2RlICE9PSB1bmRlZmluZWQpID8gcHJvY2Vzcy5lbnYu Tk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2dldE5vZGVGcm9t SW5zdGFuY2U6IEludmFsaWQgYXJndW1lbnQuJykgOiBfcHJvZEludmFyaWFudCgnMzMnKSA6IHZv aWQgMDsKKworICBpZiAoaW5zdC5faG9zdE5vZGUpIHsKKyAgICByZXR1cm4gaW5zdC5faG9zdE5v ZGU7CisgIH0KKworICAvLyBXYWxrIHVwIHRoZSB0cmVlIHVudGlsIHdlIGZpbmQgYW4gYW5jZXN0 b3Igd2hvc2UgRE9NIG5vZGUgd2UgaGF2ZSBjYWNoZWQuCisgIHZhciBwYXJlbnRzID0gW107Cisg IHdoaWxlICghaW5zdC5faG9zdE5vZGUpIHsKKyAgICBwYXJlbnRzLnB1c2goaW5zdCk7CisgICAg IWluc3QuX2hvc3RQYXJlbnQgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24n ID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3QgRE9NIHRyZWUgcm9vdCBzaG91bGQgYWx3YXlzIGhh dmUgYSBub2RlIHJlZmVyZW5jZS4nKSA6IF9wcm9kSW52YXJpYW50KCczNCcpIDogdm9pZCAwOwor ICAgIGluc3QgPSBpbnN0Ll9ob3N0UGFyZW50OworICB9CisKKyAgLy8gTm93IHBhcmVudHMgY29u dGFpbnMgZWFjaCBhbmNlc3RvciB0aGF0IGRvZXMgKm5vdCogaGF2ZSBhIGNhY2hlZCBuYXRpdmUK KyAgLy8gbm9kZSwgYW5kIGBpbnN0YCBpcyB0aGUgZGVlcGVzdCBhbmNlc3RvciB0aGF0IGRvZXMu CisgIGZvciAoOyBwYXJlbnRzLmxlbmd0aDsgaW5zdCA9IHBhcmVudHMucG9wKCkpIHsKKyAgICBw cmVjYWNoZUNoaWxkTm9kZXMoaW5zdCwgaW5zdC5faG9zdE5vZGUpOworICB9CisKKyAgcmV0dXJu IGluc3QuX2hvc3ROb2RlOworfQorCit2YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0geworICBn ZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZTogZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUsCisg IGdldEluc3RhbmNlRnJvbU5vZGU6IGdldEluc3RhbmNlRnJvbU5vZGUsCisgIGdldE5vZGVGcm9t SW5zdGFuY2U6IGdldE5vZGVGcm9tSW5zdGFuY2UsCisgIHByZWNhY2hlQ2hpbGROb2RlczogcHJl Y2FjaGVDaGlsZE5vZGVzLAorICBwcmVjYWNoZU5vZGU6IHByZWNhY2hlTm9kZSwKKyAgdW5jYWNo ZU5vZGU6IHVuY2FjaGVOb2RlCit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NQ29tcG9u ZW50VHJlZTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdh ZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RET01Db250YWluZXJJbmZvLmpz IGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0RE9NQ29udGFp bmVySW5mby5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uMDE1MjhhNGEK LS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9s aWIvUmVhY3RET01Db250YWluZXJJbmZvLmpzCkBAIC0wLDAgKzEsMzIgQEAKKy8qKgorICogQ29w eXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2 ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0 eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGly ZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBh dGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUg ZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciB2YWxpZGF0ZURPTU5l c3RpbmcgPSByZXF1aXJlKCcuL3ZhbGlkYXRlRE9NTmVzdGluZycpOworCit2YXIgRE9DX05PREVf VFlQRSA9IDk7CisKK2Z1bmN0aW9uIFJlYWN0RE9NQ29udGFpbmVySW5mbyh0b3BMZXZlbFdyYXBw ZXIsIG5vZGUpIHsKKyAgdmFyIGluZm8gPSB7CisgICAgX3RvcExldmVsV3JhcHBlcjogdG9wTGV2 ZWxXcmFwcGVyLAorICAgIF9pZENvdW50ZXI6IDEsCisgICAgX293bmVyRG9jdW1lbnQ6IG5vZGUg PyBub2RlLm5vZGVUeXBlID09PSBET0NfTk9ERV9UWVBFID8gbm9kZSA6IG5vZGUub3duZXJEb2N1 bWVudCA6IG51bGwsCisgICAgX25vZGU6IG5vZGUsCisgICAgX3RhZzogbm9kZSA/IG5vZGUubm9k ZU5hbWUudG9Mb3dlckNhc2UoKSA6IG51bGwsCisgICAgX25hbWVzcGFjZVVSSTogbm9kZSA/IG5v ZGUubmFtZXNwYWNlVVJJIDogbnVsbAorICB9OworICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYg IT09ICdwcm9kdWN0aW9uJykgeworICAgIGluZm8uX2FuY2VzdG9ySW5mbyA9IG5vZGUgPyB2YWxp ZGF0ZURPTU5lc3RpbmcudXBkYXRlZEFuY2VzdG9ySW5mbyhudWxsLCBpbmZvLl90YWcsIG51bGwp IDogbnVsbDsKKyAgfQorICByZXR1cm4gaW5mbzsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBSZWFj dERPTUNvbnRhaW5lckluZm87ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0 IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0RE9NRW1wdHlD b21wb25lbnQuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVh Y3RET01FbXB0eUNvbXBvbmVudC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw MC4uODllZWNjNTYKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9y L3JlYWN0LWRvbS9saWIvUmVhY3RET01FbXB0eUNvbXBvbmVudC5qcwpAQCAtMCwwICsxLDU5IEBA CisvKioKKyAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwg cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5k ZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGlu IHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdy YW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxl IGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIg X2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTsKKwordmFyIERPTUxhenlUcmVlID0g cmVxdWlyZSgnLi9ET01MYXp5VHJlZScpOwordmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJl cXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7CisKK3ZhciBSZWFjdERPTUVtcHR5Q29t cG9uZW50ID0gZnVuY3Rpb24gKGluc3RhbnRpYXRlKSB7CisgIC8vIFJlYWN0Q29tcG9zaXRlQ29t cG9uZW50IHVzZXMgdGhpczoKKyAgdGhpcy5fY3VycmVudEVsZW1lbnQgPSBudWxsOworICAvLyBS ZWFjdERPTUNvbXBvbmVudFRyZWUgdXNlcyB0aGVzZToKKyAgdGhpcy5faG9zdE5vZGUgPSBudWxs OworICB0aGlzLl9ob3N0UGFyZW50ID0gbnVsbDsKKyAgdGhpcy5faG9zdENvbnRhaW5lckluZm8g PSBudWxsOworICB0aGlzLl9kb21JRCA9IDA7Cit9OworX2Fzc2lnbihSZWFjdERPTUVtcHR5Q29t cG9uZW50LnByb3RvdHlwZSwgeworICBtb3VudENvbXBvbmVudDogZnVuY3Rpb24gKHRyYW5zYWN0 aW9uLCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgY29udGV4dCkgeworICAgIHZhciBk b21JRCA9IGhvc3RDb250YWluZXJJbmZvLl9pZENvdW50ZXIrKzsKKyAgICB0aGlzLl9kb21JRCA9 IGRvbUlEOworICAgIHRoaXMuX2hvc3RQYXJlbnQgPSBob3N0UGFyZW50OworICAgIHRoaXMuX2hv c3RDb250YWluZXJJbmZvID0gaG9zdENvbnRhaW5lckluZm87CisKKyAgICB2YXIgbm9kZVZhbHVl ID0gJyByZWFjdC1lbXB0eTogJyArIHRoaXMuX2RvbUlEICsgJyAnOworICAgIGlmICh0cmFuc2Fj dGlvbi51c2VDcmVhdGVFbGVtZW50KSB7CisgICAgICB2YXIgb3duZXJEb2N1bWVudCA9IGhvc3RD b250YWluZXJJbmZvLl9vd25lckRvY3VtZW50OworICAgICAgdmFyIG5vZGUgPSBvd25lckRvY3Vt ZW50LmNyZWF0ZUNvbW1lbnQobm9kZVZhbHVlKTsKKyAgICAgIFJlYWN0RE9NQ29tcG9uZW50VHJl ZS5wcmVjYWNoZU5vZGUodGhpcywgbm9kZSk7CisgICAgICByZXR1cm4gRE9NTGF6eVRyZWUobm9k ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICh0cmFuc2FjdGlvbi5yZW5kZXJUb1N0YXRpY01h cmt1cCkgeworICAgICAgICAvLyBOb3JtYWxseSB3ZSdkIGluc2VydCBhIGNvbW1lbnQgbm9kZSwg YnV0IHNpbmNlIHRoaXMgaXMgYSBzaXR1YXRpb24KKyAgICAgICAgLy8gd2hlcmUgUmVhY3Qgd29u J3QgdGFrZSBvdmVyIChzdGF0aWMgcGFnZXMpLCB3ZSBjYW4gc2ltcGx5IHJldHVybgorICAgICAg ICAvLyBub3RoaW5nLgorICAgICAgICByZXR1cm4gJyc7CisgICAgICB9CisgICAgICByZXR1cm4g JzwhLS0nICsgbm9kZVZhbHVlICsgJy0tPic7CisgICAgfQorICB9LAorICByZWNlaXZlQ29tcG9u ZW50OiBmdW5jdGlvbiAoKSB7fSwKKyAgZ2V0SG9zdE5vZGU6IGZ1bmN0aW9uICgpIHsKKyAgICBy ZXR1cm4gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UodGhpcyk7Cisg IH0sCisgIHVubW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uICgpIHsKKyAgICBSZWFjdERPTUNvbXBv bmVudFRyZWUudW5jYWNoZU5vZGUodGhpcyk7CisgIH0KK30pOworCittb2R1bGUuZXhwb3J0cyA9 IFJlYWN0RE9NRW1wdHlDb21wb25lbnQ7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZm IC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0RE9N RmVhdHVyZUZsYWdzLmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGli L1JlYWN0RE9NRmVhdHVyZUZsYWdzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAwLi43M2IzMzAxOQotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5k b3IvcmVhY3QtZG9tL2xpYi9SZWFjdERPTUZlYXR1cmVGbGFncy5qcwpAQCAtMCwwICsxLDE4IEBA CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwg cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5k ZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGlu IHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdy YW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxl IGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIg UmVhY3RET01GZWF0dXJlRmxhZ3MgPSB7CisgIHVzZUNyZWF0ZUVsZW1lbnQ6IHRydWUsCisgIHVz ZUZpYmVyOiBmYWxzZQorfTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTUZlYXR1cmVGbGFn czsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9z dGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RET01GaWJlci5qcyBiL3dlYi9wZ2FkbWlu L3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdERPTUZpYmVyLmpzCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi5hYzlhMjE4MAotLS0gL2Rldi9udWxsCisrKyBiL3dl Yi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdERPTUZpYmVyLmpzCkBA IC0wLDAgKzEsOTcgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ss IEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBp cyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBM SUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFu IGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRo ZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1 c2Ugc3RyaWN0JzsKKwordmFyIFJlYWN0RmliZXJSZWNvbmNpbGVyID0gcmVxdWlyZSgnLi9SZWFj dEZpYmVyUmVjb25jaWxlcicpOworCit2YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dh cm5pbmcnKTsKKworZnVuY3Rpb24gcmVjdXJzaXZlbHlBcHBlbmRDaGlsZHJlbihwYXJlbnQsIGNo aWxkKSB7CisgIGlmICghY2hpbGQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgLyogJEZsb3dGaXhN ZTogRWxlbWVudCBzaG91bGQgaGF2ZSB0aGlzIHByb3BlcnR5LiAqLworICBpZiAoY2hpbGQubm9k ZVR5cGUgPT09IDEpIHsKKyAgICAvKiAkRmxvd0ZpeE1lOiBSZWZpbmVtZW50IGlzc3VlLiBJIGRv bid0IGtub3cgaG93IHRvIGV4cHJlc3MgZGlmZmVyZW50LiAqLworICAgIHBhcmVudC5hcHBlbmRD aGlsZChjaGlsZCk7CisgIH0gZWxzZSB7CisgICAgLyogQXMgYSByZXN1bHQgb2YgdGhlIHJlZmlu ZW1lbnQgaXNzdWUgdGhpcyB0eXBlIGlzbid0IGtub3duLiAqLworICAgIHZhciBub2RlID0gY2hp bGQ7CisgICAgZG8geworICAgICAgcmVjdXJzaXZlbHlBcHBlbmRDaGlsZHJlbihwYXJlbnQsIG5v ZGUub3V0cHV0KTsKKyAgICB9IHdoaWxlIChub2RlID0gbm9kZS5zaWJsaW5nKTsKKyAgfQorfQor Cit2YXIgRE9NUmVuZGVyZXIgPSBSZWFjdEZpYmVyUmVjb25jaWxlcih7CisgIHVwZGF0ZUNvbnRh aW5lcjogZnVuY3Rpb24gKGNvbnRhaW5lciwgY2hpbGRyZW4pIHsKKyAgICBjb250YWluZXIuaW5u ZXJIVE1MID0gJyc7CisgICAgcmVjdXJzaXZlbHlBcHBlbmRDaGlsZHJlbihjb250YWluZXIsIGNo aWxkcmVuKTsKKyAgfSwKKyAgY3JlYXRlSW5zdGFuY2U6IGZ1bmN0aW9uICh0eXBlLCBwcm9wcywg Y2hpbGRyZW4pIHsKKyAgICB2YXIgZG9tRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQo dHlwZSk7CisgICAgcmVjdXJzaXZlbHlBcHBlbmRDaGlsZHJlbihkb21FbGVtZW50LCBjaGlsZHJl bik7CisgICAgaWYgKHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycpIHsKKyAgICAg IGRvbUVsZW1lbnQudGV4dENvbnRlbnQgPSBwcm9wcy5jaGlsZHJlbjsKKyAgICB9CisgICAgcmV0 dXJuIGRvbUVsZW1lbnQ7CisgIH0sCisgIHByZXBhcmVVcGRhdGU6IGZ1bmN0aW9uIChkb21FbGVt ZW50LCBvbGRQcm9wcywgbmV3UHJvcHMsIGNoaWxkcmVuKSB7CisgICAgcmV0dXJuIHRydWU7Cisg IH0sCisgIGNvbW1pdFVwZGF0ZTogZnVuY3Rpb24gKGRvbUVsZW1lbnQsIG9sZFByb3BzLCBuZXdQ cm9wcywgY2hpbGRyZW4pIHsKKyAgICBkb21FbGVtZW50LmlubmVySFRNTCA9ICcnOworICAgIHJl Y3Vyc2l2ZWx5QXBwZW5kQ2hpbGRyZW4oZG9tRWxlbWVudCwgY2hpbGRyZW4pOworICAgIGlmICh0 eXBlb2YgbmV3UHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnKSB7CisgICAgICBkb21FbGVtZW50 LnRleHRDb250ZW50ID0gbmV3UHJvcHMuY2hpbGRyZW47CisgICAgfQorICB9LAorICBkZWxldGVJ bnN0YW5jZTogZnVuY3Rpb24gKGluc3RhbmNlKSB7CisgICAgLy8gTm9vcAorICB9LAorCisKKyAg c2NoZWR1bGVBbmltYXRpb25DYWxsYmFjazogd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSwK KworICBzY2hlZHVsZURlZmVycmVkQ2FsbGJhY2s6IHdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNr CisKK30pOworCit2YXIgd2FybmVkID0gZmFsc2U7CisKK2Z1bmN0aW9uIHdhcm5BYm91dFVuc3Rh YmxlVXNlKCkgeworICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2Fy bmluZyh3YXJuZWQsICdZb3UgYXJlIHVzaW5nIFJlYWN0IERPTSBGaWJlciB3aGljaCBpcyBhbiBl eHBlcmltZW50YWwgcmVuZGVyZXIuICcgKyAnSXQgaXMgbGlrZWx5IHRvIGhhdmUgYnVncywgYnJl YWtpbmcgY2hhbmdlcyBhbmQgaXMgdW5zdXBwb3J0ZWQuJykgOiB2b2lkIDA7CisgIHdhcm5lZCA9 IHRydWU7Cit9CisKK3ZhciBSZWFjdERPTSA9IHsKKyAgcmVuZGVyOiBmdW5jdGlvbiAoZWxlbWVu dCwgY29udGFpbmVyKSB7CisgICAgd2FybkFib3V0VW5zdGFibGVVc2UoKTsKKyAgICBpZiAoIWNv bnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyKSB7CisgICAgICBjb250YWluZXIuX3JlYWN0Um9v dENvbnRhaW5lciA9IERPTVJlbmRlcmVyLm1vdW50Q29udGFpbmVyKGVsZW1lbnQsIGNvbnRhaW5l cik7CisgICAgfSBlbHNlIHsKKyAgICAgIERPTVJlbmRlcmVyLnVwZGF0ZUNvbnRhaW5lcihlbGVt ZW50LCBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcik7CisgICAgfQorICB9LAorICB1bm1v dW50Q29tcG9uZW50QXROb2RlOiBmdW5jdGlvbiAoY29udGFpbmVyKSB7CisgICAgd2FybkFib3V0 VW5zdGFibGVVc2UoKTsKKyAgICB2YXIgcm9vdCA9IGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFp bmVyOworICAgIGlmIChyb290KSB7CisgICAgICAvLyBUT0RPOiBJcyBpdCBzYWZlIHRvIHJlc2V0 IHRoaXMgbm93IG9yIHNob3VsZCBJIHdhaXQgc2luY2UgdGhpcworICAgICAgLy8gdW5tb3VudCBj b3VsZCBiZSBkZWZlcnJlZD8KKyAgICAgIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID0g bnVsbDsKKyAgICAgIERPTVJlbmRlcmVyLnVubW91bnRDb250YWluZXIocm9vdCk7CisgICAgfQor ICB9Cit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NOwpcIE5vIG5ld2xpbmUgYXQgZW5k IG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9t L2xpYi9SZWFjdERPTUlET3BlcmF0aW9ucy5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3Iv cmVhY3QtZG9tL2xpYi9SZWFjdERPTUlET3BlcmF0aW9ucy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwMC4uMTFjNjE1OTgKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1p bi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RET01JRE9wZXJhdGlvbnMuanMKQEAg LTAsMCArMSwzMyBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywg SW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlz IGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJ Q0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4g YWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhl IFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3Ry aWN0JzsKKwordmFyIERPTUNoaWxkcmVuT3BlcmF0aW9ucyA9IHJlcXVpcmUoJy4vRE9NQ2hpbGRy ZW5PcGVyYXRpb25zJyk7Cit2YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9S ZWFjdERPTUNvbXBvbmVudFRyZWUnKTsKKworLyoqCisgKiBPcGVyYXRpb25zIHVzZWQgdG8gcHJv Y2VzcyB1cGRhdGVzIHRvIERPTSBub2Rlcy4KKyAqLwordmFyIFJlYWN0RE9NSURPcGVyYXRpb25z ID0geworCisgIC8qKgorICAgKiBVcGRhdGVzIGEgY29tcG9uZW50J3MgY2hpbGRyZW4gYnkgcHJv Y2Vzc2luZyBhIHNlcmllcyBvZiB1cGRhdGVzLgorICAgKgorICAgKiBAcGFyYW0ge2FycmF5PG9i amVjdD59IHVwZGF0ZXMgTGlzdCBvZiB1cGRhdGUgY29uZmlndXJhdGlvbnMuCisgICAqIEBpbnRl cm5hbAorICAgKi8KKyAgZGFuZ2Vyb3VzbHlQcm9jZXNzQ2hpbGRyZW5VcGRhdGVzOiBmdW5jdGlv biAocGFyZW50SW5zdCwgdXBkYXRlcykgeworICAgIHZhciBub2RlID0gUmVhY3RET01Db21wb25l bnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UocGFyZW50SW5zdCk7CisgICAgRE9NQ2hpbGRyZW5P cGVyYXRpb25zLnByb2Nlc3NVcGRhdGVzKG5vZGUsIHVwZGF0ZXMpOworICB9Cit9OworCittb2R1 bGUuZXhwb3J0cyA9IFJlYWN0RE9NSURPcGVyYXRpb25zOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9m IGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xp Yi9SZWFjdERPTUlucHV0LmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20v bGliL1JlYWN0RE9NSW5wdXQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAu LjJiYmQ4OGQzCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9y ZWFjdC1kb20vbGliL1JlYWN0RE9NSW5wdXQuanMKQEAgLTAsMCArMSwyNzcgQEAKKy8qKgorICog Q29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVz ZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNE LXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qg ZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9m IHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNh bWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJvZEludmFy aWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50JyksCisgICAgX2Fzc2lnbiA9IHJl cXVpcmUoJ29iamVjdC1hc3NpZ24nKTsKKwordmFyIERPTVByb3BlcnR5T3BlcmF0aW9ucyA9IHJl cXVpcmUoJy4vRE9NUHJvcGVydHlPcGVyYXRpb25zJyk7Cit2YXIgTGlua2VkVmFsdWVVdGlscyA9 IHJlcXVpcmUoJy4vTGlua2VkVmFsdWVVdGlscycpOwordmFyIFJlYWN0RE9NQ29tcG9uZW50VHJl ZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7Cit2YXIgUmVhY3RVcGRhdGVz ID0gcmVxdWlyZSgnLi9SZWFjdFVwZGF0ZXMnKTsKKwordmFyIGludmFyaWFudCA9IHJlcXVpcmUo J2ZianMvbGliL2ludmFyaWFudCcpOwordmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93 YXJuaW5nJyk7CisKK3ZhciBkaWRXYXJuVmFsdWVMaW5rID0gZmFsc2U7Cit2YXIgZGlkV2FybkNo ZWNrZWRMaW5rID0gZmFsc2U7Cit2YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gZmFsc2U7 Cit2YXIgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9IGZhbHNlOwordmFyIGRpZFdhcm5D b250cm9sbGVkVG9VbmNvbnRyb2xsZWQgPSBmYWxzZTsKK3ZhciBkaWRXYXJuVW5jb250cm9sbGVk VG9Db250cm9sbGVkID0gZmFsc2U7CisKK2Z1bmN0aW9uIGZvcmNlVXBkYXRlSWZNb3VudGVkKCkg eworICBpZiAodGhpcy5fcm9vdE5vZGVJRCkgeworICAgIC8vIERPTSBjb21wb25lbnQgaXMgc3Rp bGwgbW91bnRlZDsgdXBkYXRlCisgICAgUmVhY3RET01JbnB1dC51cGRhdGVXcmFwcGVyKHRoaXMp OworICB9Cit9CisKK2Z1bmN0aW9uIGlzQ29udHJvbGxlZChwcm9wcykgeworICB2YXIgdXNlc0No ZWNrZWQgPSBwcm9wcy50eXBlID09PSAnY2hlY2tib3gnIHx8IHByb3BzLnR5cGUgPT09ICdyYWRp byc7CisgIHJldHVybiB1c2VzQ2hlY2tlZCA/IHByb3BzLmNoZWNrZWQgIT0gbnVsbCA6IHByb3Bz LnZhbHVlICE9IG51bGw7Cit9CisKKy8qKgorICogSW1wbGVtZW50cyBhbiA8aW5wdXQ+IGhvc3Qg Y29tcG9uZW50IHRoYXQgYWxsb3dzIHNldHRpbmcgdGhlc2Ugb3B0aW9uYWwKKyAqIHByb3BzOiBg Y2hlY2tlZGAsIGB2YWx1ZWAsIGBkZWZhdWx0Q2hlY2tlZGAsIGFuZCBgZGVmYXVsdFZhbHVlYC4K KyAqCisgKiBJZiBgY2hlY2tlZGAgb3IgYHZhbHVlYCBhcmUgbm90IHN1cHBsaWVkIChvciBudWxs L3VuZGVmaW5lZCksIHVzZXIgYWN0aW9ucworICogdGhhdCBhZmZlY3QgdGhlIGNoZWNrZWQgc3Rh dGUgb3IgdmFsdWUgd2lsbCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuCisgKgorICog SWYgdGhleSBhcmUgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVy ZWQgZWxlbWVudCB3aWxsIG5vdAorICogdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LiBJ bnN0ZWFkLCB0aGUgcHJvcHMgbXVzdCBjaGFuZ2UgaW4gb3JkZXIgZm9yCisgKiB0aGUgcmVuZGVy ZWQgZWxlbWVudCB0byBiZSB1cGRhdGVkLgorICoKKyAqIFRoZSByZW5kZXJlZCBlbGVtZW50IHdp bGwgYmUgaW5pdGlhbGl6ZWQgYXMgdW5jaGVja2VkIChvciBgZGVmYXVsdENoZWNrZWRgKQorICog d2l0aCBhbiBlbXB0eSB2YWx1ZSAob3IgYGRlZmF1bHRWYWx1ZWApLgorICoKKyAqIEBzZWUgaHR0 cDovL3d3dy53My5vcmcvVFIvMjAxMi9XRC1odG1sNS0yMDEyMTAyNS90aGUtaW5wdXQtZWxlbWVu dC5odG1sCisgKi8KK3ZhciBSZWFjdERPTUlucHV0ID0geworICBnZXRIb3N0UHJvcHM6IGZ1bmN0 aW9uIChpbnN0LCBwcm9wcykgeworICAgIHZhciB2YWx1ZSA9IExpbmtlZFZhbHVlVXRpbHMuZ2V0 VmFsdWUocHJvcHMpOworICAgIHZhciBjaGVja2VkID0gTGlua2VkVmFsdWVVdGlscy5nZXRDaGVj a2VkKHByb3BzKTsKKworICAgIHZhciBob3N0UHJvcHMgPSBfYXNzaWduKHsKKyAgICAgIC8vIE1h a2Ugc3VyZSB3ZSBzZXQgLnR5cGUgYmVmb3JlIGFueSBvdGhlciBwcm9wZXJ0aWVzIChzZXR0aW5n IC52YWx1ZQorICAgICAgLy8gYmVmb3JlIC50eXBlIG1lYW5zIC52YWx1ZSBpcyBsb3N0IGluIElF MTEgYW5kIGJlbG93KQorICAgICAgdHlwZTogdW5kZWZpbmVkLAorICAgICAgLy8gTWFrZSBzdXJl IHdlIHNldCAuc3RlcCBiZWZvcmUgLnZhbHVlIChzZXR0aW5nIC52YWx1ZSBiZWZvcmUgLnN0ZXAK KyAgICAgIC8vIG1lYW5zIC52YWx1ZSBpcyByb3VuZGVkIG9uIG1vdW50LCBiYXNlZCB1cG9uIHN0 ZXAgcHJlY2lzaW9uKQorICAgICAgc3RlcDogdW5kZWZpbmVkLAorICAgICAgLy8gTWFrZSBzdXJl IHdlIHNldCAubWluICYgLm1heCBiZWZvcmUgLnZhbHVlICh0byBlbnN1cmUgcHJvcGVyIG9yZGVy CisgICAgICAvLyBpbiBjb3JuZXIgY2FzZXMgc3VjaCBhcyBtaW4gb3IgbWF4IGRlcml2aW5nIGZy b20gdmFsdWUsIGUuZy4gSXNzdWUgIzcxNzApCisgICAgICBtaW46IHVuZGVmaW5lZCwKKyAgICAg IG1heDogdW5kZWZpbmVkCisgICAgfSwgcHJvcHMsIHsKKyAgICAgIGRlZmF1bHRDaGVja2VkOiB1 bmRlZmluZWQsCisgICAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCwKKyAgICAgIHZhbHVlOiB2 YWx1ZSAhPSBudWxsID8gdmFsdWUgOiBpbnN0Ll93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlLAor ICAgICAgY2hlY2tlZDogY2hlY2tlZCAhPSBudWxsID8gY2hlY2tlZCA6IGluc3QuX3dyYXBwZXJT dGF0ZS5pbml0aWFsQ2hlY2tlZCwKKyAgICAgIG9uQ2hhbmdlOiBpbnN0Ll93cmFwcGVyU3RhdGUu b25DaGFuZ2UKKyAgICB9KTsKKworICAgIHJldHVybiBob3N0UHJvcHM7CisgIH0sCisKKyAgbW91 bnRXcmFwcGVyOiBmdW5jdGlvbiAoaW5zdCwgcHJvcHMpIHsKKyAgICBpZiAocHJvY2Vzcy5lbnYu Tk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgTGlua2VkVmFsdWVVdGlscy5jaGVj a1Byb3BUeXBlcygnaW5wdXQnLCBwcm9wcywgaW5zdC5fY3VycmVudEVsZW1lbnQuX293bmVyKTsK KworICAgICAgdmFyIG93bmVyID0gaW5zdC5fY3VycmVudEVsZW1lbnQuX293bmVyOworCisgICAg ICBpZiAocHJvcHMudmFsdWVMaW5rICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZUxpbmsp IHsKKyAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5p bmcoZmFsc2UsICdgdmFsdWVMaW5rYCBwcm9wIG9uIGBpbnB1dGAgaXMgZGVwcmVjYXRlZDsgc2V0 IGB2YWx1ZWAgYW5kIGBvbkNoYW5nZWAgaW5zdGVhZC4nKSA6IHZvaWQgMDsKKyAgICAgICAgZGlk V2FyblZhbHVlTGluayA9IHRydWU7CisgICAgICB9CisgICAgICBpZiAocHJvcHMuY2hlY2tlZExp bmsgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FybkNoZWNrZWRMaW5rKSB7CisgICAgICAgIHByb2Nl c3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnYGNoZWNr ZWRMaW5rYCBwcm9wIG9uIGBpbnB1dGAgaXMgZGVwcmVjYXRlZDsgc2V0IGB2YWx1ZWAgYW5kIGBv bkNoYW5nZWAgaW5zdGVhZC4nKSA6IHZvaWQgMDsKKyAgICAgICAgZGlkV2FybkNoZWNrZWRMaW5r ID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGlmIChwcm9wcy5jaGVja2VkICE9PSB1bmRlZmluZWQg JiYgcHJvcHMuZGVmYXVsdENoZWNrZWQgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FybkNoZWNrZWRE ZWZhdWx0Q2hlY2tlZCkgeworICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1 Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJyVzIGNvbnRhaW5zIGFuIGlucHV0IG9mIHR5cGUgJXMg d2l0aCBib3RoIGNoZWNrZWQgYW5kIGRlZmF1bHRDaGVja2VkIHByb3BzLiAnICsgJ0lucHV0IGVs ZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNw ZWNpZnkgZWl0aGVyIHRoZSBjaGVja2VkIHByb3AsIG9yIHRoZSBkZWZhdWx0Q2hlY2tlZCBwcm9w LCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBv ciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGFuZCByZW1vdmUgb25lIG9mIHRoZXNl IHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9mYi5tZS9yZWFjdC1jb250cm9sbGVkLWNv bXBvbmVudHMnLCBvd25lciAmJiBvd25lci5nZXROYW1lKCkgfHwgJ0EgY29tcG9uZW50JywgcHJv cHMudHlwZSkgOiB2b2lkIDA7CisgICAgICAgIGRpZFdhcm5DaGVja2VkRGVmYXVsdENoZWNrZWQg PSB0cnVlOworICAgICAgfQorICAgICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYg cHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZURlZmF1bHRW YWx1ZSkgeworICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8g d2FybmluZyhmYWxzZSwgJyVzIGNvbnRhaW5zIGFuIGlucHV0IG9mIHR5cGUgJXMgd2l0aCBib3Ro IHZhbHVlIGFuZCBkZWZhdWx0VmFsdWUgcHJvcHMuICcgKyAnSW5wdXQgZWxlbWVudHMgbXVzdCBi ZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIg dGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2Jv dGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlu cHV0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZv OiAnICsgJ2h0dHBzOi8vZmIubWUvcmVhY3QtY29udHJvbGxlZC1jb21wb25lbnRzJywgb3duZXIg JiYgb3duZXIuZ2V0TmFtZSgpIHx8ICdBIGNvbXBvbmVudCcsIHByb3BzLnR5cGUpIDogdm9pZCAw OworICAgICAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgPSB0cnVlOworICAgICAgfQorICAg IH0KKworICAgIHZhciBkZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWU7CisgICAgaW5z dC5fd3JhcHBlclN0YXRlID0geworICAgICAgaW5pdGlhbENoZWNrZWQ6IHByb3BzLmNoZWNrZWQg IT0gbnVsbCA/IHByb3BzLmNoZWNrZWQgOiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCwKKyAgICAgIGlu aXRpYWxWYWx1ZTogcHJvcHMudmFsdWUgIT0gbnVsbCA/IHByb3BzLnZhbHVlIDogZGVmYXVsdFZh bHVlLAorICAgICAgbGlzdGVuZXJzOiBudWxsLAorICAgICAgb25DaGFuZ2U6IF9oYW5kbGVDaGFu Z2UuYmluZChpbnN0KQorICAgIH07CisKKyAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09 ICdwcm9kdWN0aW9uJykgeworICAgICAgaW5zdC5fd3JhcHBlclN0YXRlLmNvbnRyb2xsZWQgPSBp c0NvbnRyb2xsZWQocHJvcHMpOworICAgIH0KKyAgfSwKKworICB1cGRhdGVXcmFwcGVyOiBmdW5j dGlvbiAoaW5zdCkgeworICAgIHZhciBwcm9wcyA9IGluc3QuX2N1cnJlbnRFbGVtZW50LnByb3Bz OworCisgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAg ICAgIHZhciBjb250cm9sbGVkID0gaXNDb250cm9sbGVkKHByb3BzKTsKKyAgICAgIHZhciBvd25l ciA9IGluc3QuX2N1cnJlbnRFbGVtZW50Ll9vd25lcjsKKworICAgICAgaWYgKCFpbnN0Ll93cmFw cGVyU3RhdGUuY29udHJvbGxlZCAmJiBjb250cm9sbGVkICYmICFkaWRXYXJuVW5jb250cm9sbGVk VG9Db250cm9sbGVkKSB7CisgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVj dGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnJXMgaXMgY2hhbmdpbmcgYW4gdW5jb250cm9sbGVkIGlu cHV0IG9mIHR5cGUgJXMgdG8gYmUgY29udHJvbGxlZC4gJyArICdJbnB1dCBlbGVtZW50cyBzaG91 bGQgbm90IHN3aXRjaCBmcm9tIHVuY29udHJvbGxlZCB0byBjb250cm9sbGVkIChvciB2aWNlIHZl cnNhKS4gJyArICdEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9s bGVkIGlucHV0ICcgKyAnZWxlbWVudCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb21wb25lbnQu IE1vcmUgaW5mbzogaHR0cHM6Ly9mYi5tZS9yZWFjdC1jb250cm9sbGVkLWNvbXBvbmVudHMnLCBv d25lciAmJiBvd25lci5nZXROYW1lKCkgfHwgJ0EgY29tcG9uZW50JywgcHJvcHMudHlwZSkgOiB2 b2lkIDA7CisgICAgICAgIGRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQgPSB0cnVlOwor ICAgICAgfQorICAgICAgaWYgKGluc3QuX3dyYXBwZXJTdGF0ZS5jb250cm9sbGVkICYmICFjb250 cm9sbGVkICYmICFkaWRXYXJuQ29udHJvbGxlZFRvVW5jb250cm9sbGVkKSB7CisgICAgICAgIHBy b2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnJXMg aXMgY2hhbmdpbmcgYSBjb250cm9sbGVkIGlucHV0IG9mIHR5cGUgJXMgdG8gYmUgdW5jb250cm9s bGVkLiAnICsgJ0lucHV0IGVsZW1lbnRzIHNob3VsZCBub3Qgc3dpdGNoIGZyb20gY29udHJvbGxl ZCB0byB1bmNvbnRyb2xsZWQgKG9yIHZpY2UgdmVyc2EpLiAnICsgJ0RlY2lkZSBiZXR3ZWVuIHVz aW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGZvciB0 aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBvbmVudC4gTW9yZSBpbmZvOiBodHRwczovL2ZiLm1lL3Jl YWN0LWNvbnRyb2xsZWQtY29tcG9uZW50cycsIG93bmVyICYmIG93bmVyLmdldE5hbWUoKSB8fCAn QSBjb21wb25lbnQnLCBwcm9wcy50eXBlKSA6IHZvaWQgMDsKKyAgICAgICAgZGlkV2FybkNvbnRy b2xsZWRUb1VuY29udHJvbGxlZCA9IHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgLy8gVE9E TzogU2hvdWxkbid0IHRoaXMgYmUgZ2V0Q2hlY2tlZChwcm9wcyk/CisgICAgdmFyIGNoZWNrZWQg PSBwcm9wcy5jaGVja2VkOworICAgIGlmIChjaGVja2VkICE9IG51bGwpIHsKKyAgICAgIERPTVBy b3BlcnR5T3BlcmF0aW9ucy5zZXRWYWx1ZUZvclByb3BlcnR5KFJlYWN0RE9NQ29tcG9uZW50VHJl ZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpLCAnY2hlY2tlZCcsIGNoZWNrZWQgfHwgZmFsc2Up OworICAgIH0KKworICAgIHZhciBub2RlID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVG cm9tSW5zdGFuY2UoaW5zdCk7CisgICAgdmFyIHZhbHVlID0gTGlua2VkVmFsdWVVdGlscy5nZXRW YWx1ZShwcm9wcyk7CisgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKworICAgICAgLy8gQ2FzdCBg dmFsdWVgIHRvIGEgc3RyaW5nIHRvIGVuc3VyZSB0aGUgdmFsdWUgaXMgc2V0IGNvcnJlY3RseS4g V2hpbGUKKyAgICAgIC8vIGJyb3dzZXJzIHR5cGljYWxseSBkbyB0aGlzIGFzIG5lY2Vzc2FyeSwg anNkb20gZG9lc24ndC4KKyAgICAgIHZhciBuZXdWYWx1ZSA9ICcnICsgdmFsdWU7CisKKyAgICAg IC8vIFRvIGF2b2lkIHNpZGUgZWZmZWN0cyAoc3VjaCBhcyBsb3NpbmcgdGV4dCBzZWxlY3Rpb24p LCBvbmx5IHNldCB2YWx1ZSBpZiBjaGFuZ2VkCisgICAgICBpZiAobmV3VmFsdWUgIT09IG5vZGUu dmFsdWUpIHsKKyAgICAgICAgbm9kZS52YWx1ZSA9IG5ld1ZhbHVlOworICAgICAgfQorICAgIH0g ZWxzZSB7CisgICAgICBpZiAocHJvcHMudmFsdWUgPT0gbnVsbCAmJiBwcm9wcy5kZWZhdWx0VmFs dWUgIT0gbnVsbCkgeworICAgICAgICAvLyBJbiBDaHJvbWUsIGFzc2lnbmluZyBkZWZhdWx0VmFs dWUgdG8gY2VydGFpbiBpbnB1dCB0eXBlcyB0cmlnZ2VycyBpbnB1dCB2YWxpZGF0aW9uLgorICAg ICAgICAvLyBGb3IgbnVtYmVyIGlucHV0cywgdGhlIGRpc3BsYXkgdmFsdWUgbG9zZXMgdHJhaWxp bmcgZGVjaW1hbCBwb2ludHMuIEZvciBlbWFpbCBpbnB1dHMsCisgICAgICAgIC8vIENocm9tZSBy YWlzZXMgIlRoZSBzcGVjaWZpZWQgdmFsdWUgPHg+IGlzIG5vdCBhIHZhbGlkIGVtYWlsIGFkZHJl c3MiLgorICAgICAgICAvLworICAgICAgICAvLyBIZXJlIHdlIGNoZWNrIHRvIHNlZSBpZiB0aGUg ZGVmYXVsdFZhbHVlIGhhcyBhY3R1YWxseSBjaGFuZ2VkLCBhdm9pZGluZyB0aGVzZSBwcm9ibGVt cworICAgICAgICAvLyB3aGVuIHRoZSB1c2VyIGlzIGlucHV0dGluZyB0ZXh0CisgICAgICAgIC8v CisgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzI1 MworICAgICAgICBpZiAobm9kZS5kZWZhdWx0VmFsdWUgIT09ICcnICsgcHJvcHMuZGVmYXVsdFZh bHVlKSB7CisgICAgICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSAnJyArIHByb3BzLmRlZmF1bHRW YWx1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHByb3BzLmNoZWNrZWQgPT0gbnVs bCAmJiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCAhPSBudWxsKSB7CisgICAgICAgIG5vZGUuZGVmYXVs dENoZWNrZWQgPSAhIXByb3BzLmRlZmF1bHRDaGVja2VkOworICAgICAgfQorICAgIH0KKyAgfSwK KworICBwb3N0TW91bnRXcmFwcGVyOiBmdW5jdGlvbiAoaW5zdCkgeworICAgIHZhciBwcm9wcyA9 IGluc3QuX2N1cnJlbnRFbGVtZW50LnByb3BzOworCisgICAgLy8gVGhpcyBpcyBpbiBwb3N0TW91 bnQgYmVjYXVzZSB3ZSBuZWVkIGFjY2VzcyB0byB0aGUgRE9NIG5vZGUsIHdoaWNoIGlzIG5vdAor ICAgIC8vIGF2YWlsYWJsZSB1bnRpbCBhZnRlciB0aGUgY29tcG9uZW50IGhhcyBtb3VudGVkLgor ICAgIHZhciBub2RlID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2Uo aW5zdCk7CisKKyAgICAvLyBEZXRhY2ggdmFsdWUgZnJvbSBkZWZhdWx0VmFsdWUuIFdlIHdvbid0 IGRvIGFueXRoaW5nIGlmIHdlJ3JlIHdvcmtpbmcgb24KKyAgICAvLyBzdWJtaXQgb3IgcmVzZXQg aW5wdXRzIGFzIHRob3NlIHZhbHVlcyAmIGRlZmF1bHRWYWx1ZXMgYXJlIGxpbmtlZC4gVGhleQor ICAgIC8vIGFyZSBub3QgcmVzZXRhYmxlIG5vZGVzIHNvIHRoaXMgb3BlcmF0aW9uIGRvZXNuJ3Qg bWF0dGVyIGFuZCBhY3R1YWxseQorICAgIC8vIHJlbW92ZXMgYnJvd3Nlci1kZWZhdWx0IHZhbHVl cyAoZWcgIlN1Ym1pdCBRdWVyeSIpIHdoZW4gbm8gdmFsdWUgaXMKKyAgICAvLyBwcm92aWRlZC4K KworICAgIHN3aXRjaCAocHJvcHMudHlwZSkgeworICAgICAgY2FzZSAnc3VibWl0JzoKKyAgICAg IGNhc2UgJ3Jlc2V0JzoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdjb2xvcic6CisgICAg ICBjYXNlICdkYXRlJzoKKyAgICAgIGNhc2UgJ2RhdGV0aW1lJzoKKyAgICAgIGNhc2UgJ2RhdGV0 aW1lLWxvY2FsJzoKKyAgICAgIGNhc2UgJ21vbnRoJzoKKyAgICAgIGNhc2UgJ3RpbWUnOgorICAg ICAgY2FzZSAnd2Vlayc6CisgICAgICAgIC8vIFRoaXMgZml4ZXMgdGhlIG5vLXNob3cgaXNzdWUg b24gaU9TIFNhZmFyaSBhbmQgQW5kcm9pZCBDaHJvbWU6CisgICAgICAgIC8vIGh0dHBzOi8vZ2l0 aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzIzMworICAgICAgICBub2RlLnZhbHVlID0g Jyc7CisgICAgICAgIG5vZGUudmFsdWUgPSBub2RlLmRlZmF1bHRWYWx1ZTsKKyAgICAgICAgYnJl YWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBub2RlLnZhbHVlID0gbm9kZS52YWx1ZTsKKyAg ICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gTm9ybWFsbHksIHdlJ2QganVzdCBkbyBgbm9k ZS5jaGVja2VkID0gbm9kZS5jaGVja2VkYCB1cG9uIGluaXRpYWwgbW91bnQsIGxlc3MgdGhpcyBi dWcKKyAgICAvLyB0aGlzIGlzIG5lZWRlZCB0byB3b3JrIGFyb3VuZCBhIGNocm9tZSBidWcgd2hl cmUgc2V0dGluZyBkZWZhdWx0Q2hlY2tlZAorICAgIC8vIHdpbGwgc29tZXRpbWVzIGluZmx1ZW5j ZSB0aGUgdmFsdWUgb2YgY2hlY2tlZCAoZXZlbiBhZnRlciBkZXRhY2htZW50KS4KKyAgICAvLyBS ZWZlcmVuY2U6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0 YWlsP2lkPTYwODQxNgorICAgIC8vIFdlIG5lZWQgdG8gdGVtcG9yYXJpbHkgdW5zZXQgbmFtZSB0 byBhdm9pZCBkaXNydXB0aW5nIHJhZGlvIGJ1dHRvbiBncm91cHMuCisgICAgdmFyIG5hbWUgPSBu b2RlLm5hbWU7CisgICAgaWYgKG5hbWUgIT09ICcnKSB7CisgICAgICBub2RlLm5hbWUgPSAnJzsK KyAgICB9CisgICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICFub2RlLmRlZmF1bHRDaGVja2VkOwor ICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhbm9kZS5kZWZhdWx0Q2hlY2tlZDsKKyAgICBpZiAo bmFtZSAhPT0gJycpIHsKKyAgICAgIG5vZGUubmFtZSA9IG5hbWU7CisgICAgfQorICB9Cit9Owor CitmdW5jdGlvbiBfaGFuZGxlQ2hhbmdlKGV2ZW50KSB7CisgIHZhciBwcm9wcyA9IHRoaXMuX2N1 cnJlbnRFbGVtZW50LnByb3BzOworCisgIHZhciByZXR1cm5WYWx1ZSA9IExpbmtlZFZhbHVlVXRp bHMuZXhlY3V0ZU9uQ2hhbmdlKHByb3BzLCBldmVudCk7CisKKyAgLy8gSGVyZSB3ZSB1c2UgYXNh cCB0byB3YWl0IHVudGlsIGFsbCB1cGRhdGVzIGhhdmUgcHJvcGFnYXRlZCwgd2hpY2gKKyAgLy8g aXMgaW1wb3J0YW50IHdoZW4gdXNpbmcgY29udHJvbGxlZCBjb21wb25lbnRzIHdpdGhpbiBsYXll cnM6CisgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTY5OAor ICBSZWFjdFVwZGF0ZXMuYXNhcChmb3JjZVVwZGF0ZUlmTW91bnRlZCwgdGhpcyk7CisKKyAgdmFy IG5hbWUgPSBwcm9wcy5uYW1lOworICBpZiAocHJvcHMudHlwZSA9PT0gJ3JhZGlvJyAmJiBuYW1l ICE9IG51bGwpIHsKKyAgICB2YXIgcm9vdE5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0 Tm9kZUZyb21JbnN0YW5jZSh0aGlzKTsKKyAgICB2YXIgcXVlcnlSb290ID0gcm9vdE5vZGU7CisK KyAgICB3aGlsZSAocXVlcnlSb290LnBhcmVudE5vZGUpIHsKKyAgICAgIHF1ZXJ5Um9vdCA9IHF1 ZXJ5Um9vdC5wYXJlbnROb2RlOworICAgIH0KKworICAgIC8vIElmIGByb290Tm9kZS5mb3JtYCB3 YXMgbm9uLW51bGwsIHRoZW4gd2UgY291bGQgdHJ5IGBmb3JtLmVsZW1lbnRzYCwKKyAgICAvLyBi dXQgdGhhdCBzb21ldGltZXMgYmVoYXZlcyBzdHJhbmdlbHkgaW4gSUU4LiBXZSBjb3VsZCBhbHNv IHRyeSB1c2luZworICAgIC8vIGBmb3JtLmdldEVsZW1lbnRzQnlOYW1lYCwgYnV0IHRoYXQgd2ls bCBvbmx5IHJldHVybiBkaXJlY3QgY2hpbGRyZW4KKyAgICAvLyBhbmQgd29uJ3QgaW5jbHVkZSBp bnB1dHMgdGhhdCB1c2UgdGhlIEhUTUw1IGBmb3JtPWAgYXR0cmlidXRlLiBTaW5jZQorICAgIC8v IHRoZSBpbnB1dCBtaWdodCBub3QgZXZlbiBiZSBpbiBhIGZvcm0sIGxldCdzIGp1c3QgdXNlIHRo ZSBnbG9iYWwKKyAgICAvLyBgcXVlcnlTZWxlY3RvckFsbGAgdG8gZW5zdXJlIHdlIGRvbid0IG1p c3MgYW55dGhpbmcuCisgICAgdmFyIGdyb3VwID0gcXVlcnlSb290LnF1ZXJ5U2VsZWN0b3JBbGwo J2lucHV0W25hbWU9JyArIEpTT04uc3RyaW5naWZ5KCcnICsgbmFtZSkgKyAnXVt0eXBlPSJyYWRp byJdJyk7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdyb3VwLmxlbmd0aDsgaSsrKSB7Cisg ICAgICB2YXIgb3RoZXJOb2RlID0gZ3JvdXBbaV07CisgICAgICBpZiAob3RoZXJOb2RlID09PSBy b290Tm9kZSB8fCBvdGhlck5vZGUuZm9ybSAhPT0gcm9vdE5vZGUuZm9ybSkgeworICAgICAgICBj b250aW51ZTsKKyAgICAgIH0KKyAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBpZiByYWRpbyBidXR0 b25zIHJlbmRlcmVkIGJ5IGRpZmZlcmVudCBjb3BpZXMgb2YgUmVhY3QKKyAgICAgIC8vIGFuZCB0 aGUgc2FtZSBuYW1lIGFyZSByZW5kZXJlZCBpbnRvIHRoZSBzYW1lIGZvcm0gKHNhbWUgYXMgIzE5 MzkpLgorICAgICAgLy8gVGhhdCdzIHByb2JhYmx5IG9rYXk7IHdlIGRvbid0IHN1cHBvcnQgaXQg anVzdCBhcyB3ZSBkb24ndCBzdXBwb3J0CisgICAgICAvLyBtaXhpbmcgUmVhY3QgcmFkaW8gYnV0 dG9ucyB3aXRoIG5vbi1SZWFjdCBvbmVzLgorICAgICAgdmFyIG90aGVySW5zdGFuY2UgPSBSZWFj dERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShvdGhlck5vZGUpOworICAgICAg IW90aGVySW5zdGFuY2UgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8g aW52YXJpYW50KGZhbHNlLCAnUmVhY3RET01JbnB1dDogTWl4aW5nIFJlYWN0IGFuZCBub24tUmVh Y3QgcmFkaW8gaW5wdXRzIHdpdGggdGhlIHNhbWUgYG5hbWVgIGlzIG5vdCBzdXBwb3J0ZWQuJykg OiBfcHJvZEludmFyaWFudCgnOTAnKSA6IHZvaWQgMDsKKyAgICAgIC8vIElmIHRoaXMgaXMgYSBj b250cm9sbGVkIHJhZGlvIGJ1dHRvbiBncm91cCwgZm9yY2luZyB0aGUgaW5wdXQgdGhhdAorICAg ICAgLy8gd2FzIHByZXZpb3VzbHkgY2hlY2tlZCB0byB1cGRhdGUgd2lsbCBjYXVzZSBpdCB0byBi ZSBjb21lIHJlLWNoZWNrZWQKKyAgICAgIC8vIGFzIGFwcHJvcHJpYXRlLgorICAgICAgUmVhY3RV cGRhdGVzLmFzYXAoZm9yY2VVcGRhdGVJZk1vdW50ZWQsIG90aGVySW5zdGFuY2UpOworICAgIH0K KyAgfQorCisgIHJldHVybiByZXR1cm5WYWx1ZTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBSZWFj dERPTUlucHV0OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9w Z2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdERPTUludmFsaWRBUklBSG9v ay5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdERPTUlu dmFsaWRBUklBSG9vay5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uYWE4 YmE3NWQKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0 LWRvbS9saWIvUmVhY3RET01JbnZhbGlkQVJJQUhvb2suanMKQEAgLTAsMCArMSw5MiBAQAorLyoq CisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0 cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRo ZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUg cm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAor ICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0 aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIERPTVBy b3BlcnR5ID0gcmVxdWlyZSgnLi9ET01Qcm9wZXJ0eScpOwordmFyIFJlYWN0Q29tcG9uZW50VHJl ZUhvb2sgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3RDb21wb25lbnRUcmVlSG9vaycpOworCit2 YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTsKKwordmFyIHdhcm5lZFBy b3BlcnRpZXMgPSB7fTsKK3ZhciByQVJJQSA9IG5ldyBSZWdFeHAoJ14oYXJpYSktWycgKyBET01Q cm9wZXJ0eS5BVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpOworCitmdW5jdGlvbiB2YWxpZGF0 ZVByb3BlcnR5KHRhZ05hbWUsIG5hbWUsIGRlYnVnSUQpIHsKKyAgaWYgKHdhcm5lZFByb3BlcnRp ZXMuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgd2FybmVkUHJvcGVydGllc1tuYW1lXSkgeworICAg IHJldHVybiB0cnVlOworICB9CisKKyAgaWYgKHJBUklBLnRlc3QobmFtZSkpIHsKKyAgICB2YXIg bG93ZXJDYXNlZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgdmFyIHN0YW5kYXJkTmFt ZSA9IERPTVByb3BlcnR5LmdldFBvc3NpYmxlU3RhbmRhcmROYW1lLmhhc093blByb3BlcnR5KGxv d2VyQ2FzZWROYW1lKSA/IERPTVByb3BlcnR5LmdldFBvc3NpYmxlU3RhbmRhcmROYW1lW2xvd2Vy Q2FzZWROYW1lXSA6IG51bGw7CisKKyAgICAvLyBJZiB0aGlzIGlzIGFuIGFyaWEtKiBhdHRyaWJ1 dGUsIGJ1dCBpcyBub3QgbGlzdGVkIGluIHRoZSBrbm93biBET00KKyAgICAvLyBET00gcHJvcGVy dGllcywgdGhlbiBpdCBpcyBhbiBpbnZhbGlkIGFyaWEtKiBhdHRyaWJ1dGUuCisgICAgaWYgKHN0 YW5kYXJkTmFtZSA9PSBudWxsKSB7CisgICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1 ZTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gYXJpYS0qIGF0dHJpYnV0ZXMg c2hvdWxkIGJlIGxvd2VyY2FzZTsgc3VnZ2VzdCB0aGUgbG93ZXJjYXNlIHZlcnNpb24uCisgICAg aWYgKG5hbWUgIT09IHN0YW5kYXJkTmFtZSkgeworICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYg IT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdVbmtub3duIEFSSUEgYXR0cmlidXRl ICVzLiBEaWQgeW91IG1lYW4gJXM/JXMnLCBuYW1lLCBzdGFuZGFyZE5hbWUsIFJlYWN0Q29tcG9u ZW50VHJlZUhvb2suZ2V0U3RhY2tBZGRlbmR1bUJ5SUQoZGVidWdJRCkpIDogdm9pZCAwOworICAg ICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAg ICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworZnVuY3Rpb24gd2FybkludmFsaWRBUklB UHJvcHMoZGVidWdJRCwgZWxlbWVudCkgeworICB2YXIgaW52YWxpZFByb3BzID0gW107CisKKyAg Zm9yICh2YXIga2V5IGluIGVsZW1lbnQucHJvcHMpIHsKKyAgICB2YXIgaXNWYWxpZCA9IHZhbGlk YXRlUHJvcGVydHkoZWxlbWVudC50eXBlLCBrZXksIGRlYnVnSUQpOworICAgIGlmICghaXNWYWxp ZCkgeworICAgICAgaW52YWxpZFByb3BzLnB1c2goa2V5KTsKKyAgICB9CisgIH0KKworICB2YXIg dW5rbm93blByb3BTdHJpbmcgPSBpbnZhbGlkUHJvcHMubWFwKGZ1bmN0aW9uIChwcm9wKSB7Cisg ICAgcmV0dXJuICdgJyArIHByb3AgKyAnYCc7CisgIH0pLmpvaW4oJywgJyk7CisKKyAgaWYgKGlu dmFsaWRQcm9wcy5sZW5ndGggPT09IDEpIHsKKyAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0g J3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ0ludmFsaWQgYXJpYSBwcm9wICVzIG9uIDwl cz4gdGFnLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9mYi5tZS9pbnZhbGlkLWFyaWEt cHJvcCVzJywgdW5rbm93blByb3BTdHJpbmcsIGVsZW1lbnQudHlwZSwgUmVhY3RDb21wb25lbnRU cmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChkZWJ1Z0lEKSkgOiB2b2lkIDA7CisgIH0gZWxz ZSBpZiAoaW52YWxpZFByb3BzLmxlbmd0aCA+IDEpIHsKKyAgICBwcm9jZXNzLmVudi5OT0RFX0VO ViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ0ludmFsaWQgYXJpYSBwcm9wcyAl cyBvbiA8JXM+IHRhZy4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vZmIubWUvaW52YWxp ZC1hcmlhLXByb3AlcycsIHVua25vd25Qcm9wU3RyaW5nLCBlbGVtZW50LnR5cGUsIFJlYWN0Q29t cG9uZW50VHJlZUhvb2suZ2V0U3RhY2tBZGRlbmR1bUJ5SUQoZGVidWdJRCkpIDogdm9pZCAwOwor ICB9Cit9CisKK2Z1bmN0aW9uIGhhbmRsZUVsZW1lbnQoZGVidWdJRCwgZWxlbWVudCkgeworICBp ZiAoZWxlbWVudCA9PSBudWxsIHx8IHR5cGVvZiBlbGVtZW50LnR5cGUgIT09ICdzdHJpbmcnKSB7 CisgICAgcmV0dXJuOworICB9CisgIGlmIChlbGVtZW50LnR5cGUuaW5kZXhPZignLScpID49IDAg fHwgZWxlbWVudC5wcm9wcy5pcykgeworICAgIHJldHVybjsKKyAgfQorCisgIHdhcm5JbnZhbGlk QVJJQVByb3BzKGRlYnVnSUQsIGVsZW1lbnQpOworfQorCit2YXIgUmVhY3RET01JbnZhbGlkQVJJ QUhvb2sgPSB7CisgIG9uQmVmb3JlTW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChkZWJ1Z0lELCBl bGVtZW50KSB7CisgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicp IHsKKyAgICAgIGhhbmRsZUVsZW1lbnQoZGVidWdJRCwgZWxlbWVudCk7CisgICAgfQorICB9LAor ICBvbkJlZm9yZVVwZGF0ZUNvbXBvbmVudDogZnVuY3Rpb24gKGRlYnVnSUQsIGVsZW1lbnQpIHsK KyAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAg aGFuZGxlRWxlbWVudChkZWJ1Z0lELCBlbGVtZW50KTsKKyAgICB9CisgIH0KK307CisKK21vZHVs ZS5leHBvcnRzID0gUmVhY3RET01JbnZhbGlkQVJJQUhvb2s7ClwgTm8gbmV3bGluZSBhdCBlbmQg b2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20v bGliL1JlYWN0RE9NTnVsbElucHV0VmFsdWVQcm9wSG9vay5qcyBiL3dlYi9wZ2FkbWluL3N0YXRp Yy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdERPTU51bGxJbnB1dFZhbHVlUHJvcEhvb2suanMK bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLmU1YzVmMjJlCi0tLSAvZGV2L251 bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0RE9N TnVsbElucHV0VmFsdWVQcm9wSG9vay5qcwpAQCAtMCwwICsxLDQyIEBACisvKioKKyAqIENvcHly aWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVk LgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHls ZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVj dG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRl bnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRp cmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgUmVhY3RDb21wb25lbnRU cmVlSG9vayA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7CisK K3ZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpOworCit2YXIgZGlkV2Fy blZhbHVlTnVsbCA9IGZhbHNlOworCitmdW5jdGlvbiBoYW5kbGVFbGVtZW50KGRlYnVnSUQsIGVs ZW1lbnQpIHsKKyAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgeworICAgIHJldHVybjsKKyAgfQorICBp ZiAoZWxlbWVudC50eXBlICE9PSAnaW5wdXQnICYmIGVsZW1lbnQudHlwZSAhPT0gJ3RleHRhcmVh JyAmJiBlbGVtZW50LnR5cGUgIT09ICdzZWxlY3QnKSB7CisgICAgcmV0dXJuOworICB9CisgIGlm IChlbGVtZW50LnByb3BzICE9IG51bGwgJiYgZWxlbWVudC5wcm9wcy52YWx1ZSA9PT0gbnVsbCAm JiAhZGlkV2FyblZhbHVlTnVsbCkgeworICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJv ZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnYHZhbHVlYCBwcm9wIG9uIGAlc2Agc2hvdWxkIG5v dCBiZSBudWxsLiAnICsgJ0NvbnNpZGVyIHVzaW5nIHRoZSBlbXB0eSBzdHJpbmcgdG8gY2xlYXIg dGhlIGNvbXBvbmVudCBvciBgdW5kZWZpbmVkYCAnICsgJ2ZvciB1bmNvbnRyb2xsZWQgY29tcG9u ZW50cy4lcycsIGVsZW1lbnQudHlwZSwgUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRTdGFja0Fk ZGVuZHVtQnlJRChkZWJ1Z0lEKSkgOiB2b2lkIDA7CisKKyAgICBkaWRXYXJuVmFsdWVOdWxsID0g dHJ1ZTsKKyAgfQorfQorCit2YXIgUmVhY3RET01OdWxsSW5wdXRWYWx1ZVByb3BIb29rID0gewor ICBvbkJlZm9yZU1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCwgZWxlbWVudCkgewor ICAgIGhhbmRsZUVsZW1lbnQoZGVidWdJRCwgZWxlbWVudCk7CisgIH0sCisgIG9uQmVmb3JlVXBk YXRlQ29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCwgZWxlbWVudCkgeworICAgIGhhbmRsZUVs ZW1lbnQoZGVidWdJRCwgZWxlbWVudCk7CisgIH0KK307CisKK21vZHVsZS5leHBvcnRzID0gUmVh Y3RET01OdWxsSW5wdXRWYWx1ZVByb3BIb29rOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK ZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFj dERPTU9wdGlvbi5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9S ZWFjdERPTU9wdGlvbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uNDg0 NmU5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0 LWRvbS9saWIvUmVhY3RET01PcHRpb24uanMKQEAgLTAsMCArMSwxMjIgQEAKKy8qKgorICogQ29w eXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2 ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0 eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGly ZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBh dGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUg ZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfYXNzaWduID0gcmVx dWlyZSgnb2JqZWN0LWFzc2lnbicpOworCit2YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdC9saWIv UmVhY3QnKTsKK3ZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9N Q29tcG9uZW50VHJlZScpOwordmFyIFJlYWN0RE9NU2VsZWN0ID0gcmVxdWlyZSgnLi9SZWFjdERP TVNlbGVjdCcpOworCit2YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTsK K3ZhciBkaWRXYXJuSW52YWxpZE9wdGlvbkNoaWxkcmVuID0gZmFsc2U7CisKK2Z1bmN0aW9uIGZs YXR0ZW5DaGlsZHJlbihjaGlsZHJlbikgeworICB2YXIgY29udGVudCA9ICcnOworCisgIC8vIEZs YXR0ZW4gY2hpbGRyZW4gYW5kIHdhcm4gaWYgdGhleSBhcmVuJ3Qgc3RyaW5ncyBvciBudW1iZXJz OworICAvLyBpbnZhbGlkIHR5cGVzIGFyZSBpZ25vcmVkLgorICBSZWFjdC5DaGlsZHJlbi5mb3JF YWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHsKKyAgICBpZiAoY2hpbGQgPT0gbnVsbCkg eworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAodHlwZW9mIGNoaWxkID09PSAnc3RyaW5n JyB8fCB0eXBlb2YgY2hpbGQgPT09ICdudW1iZXInKSB7CisgICAgICBjb250ZW50ICs9IGNoaWxk OworICAgIH0gZWxzZSBpZiAoIWRpZFdhcm5JbnZhbGlkT3B0aW9uQ2hpbGRyZW4pIHsKKyAgICAg IGRpZFdhcm5JbnZhbGlkT3B0aW9uQ2hpbGRyZW4gPSB0cnVlOworICAgICAgcHJvY2Vzcy5lbnYu Tk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdPbmx5IHN0cmluZ3Mg YW5kIG51bWJlcnMgYXJlIHN1cHBvcnRlZCBhcyA8b3B0aW9uPiBjaGlsZHJlbi4nKSA6IHZvaWQg MDsKKyAgICB9CisgIH0pOworCisgIHJldHVybiBjb250ZW50OworfQorCisvKioKKyAqIEltcGxl bWVudHMgYW4gPG9wdGlvbj4gaG9zdCBjb21wb25lbnQgdGhhdCB3YXJucyB3aGVuIGBzZWxlY3Rl ZGAgaXMgc2V0LgorICovCit2YXIgUmVhY3RET01PcHRpb24gPSB7CisgIG1vdW50V3JhcHBlcjog ZnVuY3Rpb24gKGluc3QsIHByb3BzLCBob3N0UGFyZW50KSB7CisgICAgLy8gVE9ETyAoeXVuZ3N0 ZXJzKTogUmVtb3ZlIHN1cHBvcnQgZm9yIGBzZWxlY3RlZGAgaW4gPG9wdGlvbj4uCisgICAgaWYg KHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIHByb2Nlc3Mu ZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHByb3BzLnNlbGVjdGVkID09 IG51bGwsICdVc2UgdGhlIGBkZWZhdWx0VmFsdWVgIG9yIGB2YWx1ZWAgcHJvcHMgb24gPHNlbGVj dD4gaW5zdGVhZCBvZiAnICsgJ3NldHRpbmcgYHNlbGVjdGVkYCBvbiA8b3B0aW9uPi4nKSA6IHZv aWQgMDsKKyAgICB9CisKKyAgICAvLyBMb29rIHVwIHdoZXRoZXIgdGhpcyBvcHRpb24gaXMgJ3Nl bGVjdGVkJworICAgIHZhciBzZWxlY3RWYWx1ZSA9IG51bGw7CisgICAgaWYgKGhvc3RQYXJlbnQg IT0gbnVsbCkgeworICAgICAgdmFyIHNlbGVjdFBhcmVudCA9IGhvc3RQYXJlbnQ7CisKKyAgICAg IGlmIChzZWxlY3RQYXJlbnQuX3RhZyA9PT0gJ29wdGdyb3VwJykgeworICAgICAgICBzZWxlY3RQ YXJlbnQgPSBzZWxlY3RQYXJlbnQuX2hvc3RQYXJlbnQ7CisgICAgICB9CisKKyAgICAgIGlmIChz ZWxlY3RQYXJlbnQgIT0gbnVsbCAmJiBzZWxlY3RQYXJlbnQuX3RhZyA9PT0gJ3NlbGVjdCcpIHsK KyAgICAgICAgc2VsZWN0VmFsdWUgPSBSZWFjdERPTVNlbGVjdC5nZXRTZWxlY3RWYWx1ZUNvbnRl eHQoc2VsZWN0UGFyZW50KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB0aGUgdmFsdWUg aXMgbnVsbCAoZS5nLiwgbm8gc3BlY2lmaWVkIHZhbHVlIG9yIGFmdGVyIGluaXRpYWwgbW91bnQp CisgICAgLy8gb3IgbWlzc2luZyAoZS5nLiwgZm9yIDxkYXRhbGlzdD4pLCB3ZSBkb24ndCBjaGFu Z2UgcHJvcHMuc2VsZWN0ZWQKKyAgICB2YXIgc2VsZWN0ZWQgPSBudWxsOworICAgIGlmIChzZWxl Y3RWYWx1ZSAhPSBudWxsKSB7CisgICAgICB2YXIgdmFsdWU7CisgICAgICBpZiAocHJvcHMudmFs dWUgIT0gbnVsbCkgeworICAgICAgICB2YWx1ZSA9IHByb3BzLnZhbHVlICsgJyc7CisgICAgICB9 IGVsc2UgeworICAgICAgICB2YWx1ZSA9IGZsYXR0ZW5DaGlsZHJlbihwcm9wcy5jaGlsZHJlbik7 CisgICAgICB9CisgICAgICBzZWxlY3RlZCA9IGZhbHNlOworICAgICAgaWYgKEFycmF5LmlzQXJy YXkoc2VsZWN0VmFsdWUpKSB7CisgICAgICAgIC8vIG11bHRpcGxlCisgICAgICAgIGZvciAodmFy IGkgPSAwOyBpIDwgc2VsZWN0VmFsdWUubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBpZiAoJycg KyBzZWxlY3RWYWx1ZVtpXSA9PT0gdmFsdWUpIHsKKyAgICAgICAgICAgIHNlbGVjdGVkID0gdHJ1 ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBl bHNlIHsKKyAgICAgICAgc2VsZWN0ZWQgPSAnJyArIHNlbGVjdFZhbHVlID09PSB2YWx1ZTsKKyAg ICAgIH0KKyAgICB9CisKKyAgICBpbnN0Ll93cmFwcGVyU3RhdGUgPSB7IHNlbGVjdGVkOiBzZWxl Y3RlZCB9OworICB9LAorCisgIHBvc3RNb3VudFdyYXBwZXI6IGZ1bmN0aW9uIChpbnN0KSB7Cisg ICAgLy8gdmFsdWU9IiIgc2hvdWxkIG1ha2UgYSB2YWx1ZSBhdHRyaWJ1dGUgKCM2MjE5KQorICAg IHZhciBwcm9wcyA9IGluc3QuX2N1cnJlbnRFbGVtZW50LnByb3BzOworICAgIGlmIChwcm9wcy52 YWx1ZSAhPSBudWxsKSB7CisgICAgICB2YXIgbm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5n ZXROb2RlRnJvbUluc3RhbmNlKGluc3QpOworICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ3ZhbHVl JywgcHJvcHMudmFsdWUpOworICAgIH0KKyAgfSwKKworICBnZXRIb3N0UHJvcHM6IGZ1bmN0aW9u IChpbnN0LCBwcm9wcykgeworICAgIHZhciBob3N0UHJvcHMgPSBfYXNzaWduKHsgc2VsZWN0ZWQ6 IHVuZGVmaW5lZCwgY2hpbGRyZW46IHVuZGVmaW5lZCB9LCBwcm9wcyk7CisKKyAgICAvLyBSZWFk IHN0YXRlIG9ubHkgZnJvbSBpbml0aWFsIG1vdW50IGJlY2F1c2UgPHNlbGVjdD4gdXBkYXRlcyB2 YWx1ZQorICAgIC8vIG1hbnVhbGx5OyB3ZSBuZWVkIHRoZSBpbml0aWFsIHN0YXRlIG9ubHkgZm9y IHNlcnZlciByZW5kZXJpbmcKKyAgICBpZiAoaW5zdC5fd3JhcHBlclN0YXRlLnNlbGVjdGVkICE9 IG51bGwpIHsKKyAgICAgIGhvc3RQcm9wcy5zZWxlY3RlZCA9IGluc3QuX3dyYXBwZXJTdGF0ZS5z ZWxlY3RlZDsKKyAgICB9CisKKyAgICB2YXIgY29udGVudCA9IGZsYXR0ZW5DaGlsZHJlbihwcm9w cy5jaGlsZHJlbik7CisKKyAgICBpZiAoY29udGVudCkgeworICAgICAgaG9zdFByb3BzLmNoaWxk cmVuID0gY29udGVudDsKKyAgICB9CisKKyAgICByZXR1cm4gaG9zdFByb3BzOworICB9CisKK307 CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RET01PcHRpb247ClwgTm8gbmV3bGluZSBhdCBlbmQg b2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20v bGliL1JlYWN0RE9NU2VsZWN0LmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1k b20vbGliL1JlYWN0RE9NU2VsZWN0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAwLi41NzE4MGFkNwotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5k b3IvcmVhY3QtZG9tL2xpYi9SZWFjdERPTVNlbGVjdC5qcwpAQCAtMCwwICsxLDE5OSBAQAorLyoq CisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0 cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRo ZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUg cm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAor ICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0 aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9hc3Np Z24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7CisKK3ZhciBMaW5rZWRWYWx1ZVV0aWxzID0g cmVxdWlyZSgnLi9MaW5rZWRWYWx1ZVV0aWxzJyk7Cit2YXIgUmVhY3RET01Db21wb25lbnRUcmVl ID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTsKK3ZhciBSZWFjdFVwZGF0ZXMg PSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlcycpOworCit2YXIgd2FybmluZyA9IHJlcXVpcmUoJ2Zi anMvbGliL3dhcm5pbmcnKTsKKwordmFyIGRpZFdhcm5WYWx1ZUxpbmsgPSBmYWxzZTsKK3ZhciBk aWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgPSBmYWxzZTsKKworZnVuY3Rpb24gdXBkYXRlT3B0aW9u c0lmUGVuZGluZ1VwZGF0ZUFuZE1vdW50ZWQoKSB7CisgIGlmICh0aGlzLl9yb290Tm9kZUlEICYm IHRoaXMuX3dyYXBwZXJTdGF0ZS5wZW5kaW5nVXBkYXRlKSB7CisgICAgdGhpcy5fd3JhcHBlclN0 YXRlLnBlbmRpbmdVcGRhdGUgPSBmYWxzZTsKKworICAgIHZhciBwcm9wcyA9IHRoaXMuX2N1cnJl bnRFbGVtZW50LnByb3BzOworICAgIHZhciB2YWx1ZSA9IExpbmtlZFZhbHVlVXRpbHMuZ2V0VmFs dWUocHJvcHMpOworCisgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgIHVwZGF0ZU9wdGlv bnModGhpcywgQm9vbGVhbihwcm9wcy5tdWx0aXBsZSksIHZhbHVlKTsKKyAgICB9CisgIH0KK30K KworZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKG93bmVyKSB7CisgIGlmIChv d25lcikgeworICAgIHZhciBuYW1lID0gb3duZXIuZ2V0TmFtZSgpOworICAgIGlmIChuYW1lKSB7 CisgICAgICByZXR1cm4gJyBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAn YC4nOworICAgIH0KKyAgfQorICByZXR1cm4gJyc7Cit9CisKK3ZhciB2YWx1ZVByb3BOYW1lcyA9 IFsndmFsdWUnLCAnZGVmYXVsdFZhbHVlJ107CisKKy8qKgorICogVmFsaWRhdGlvbiBmdW5jdGlv biBmb3IgYHZhbHVlYCBhbmQgYGRlZmF1bHRWYWx1ZWAuCisgKiBAcHJpdmF0ZQorICovCitmdW5j dGlvbiBjaGVja1NlbGVjdFByb3BUeXBlcyhpbnN0LCBwcm9wcykgeworICB2YXIgb3duZXIgPSBp bnN0Ll9jdXJyZW50RWxlbWVudC5fb3duZXI7CisgIExpbmtlZFZhbHVlVXRpbHMuY2hlY2tQcm9w VHlwZXMoJ3NlbGVjdCcsIHByb3BzLCBvd25lcik7CisKKyAgaWYgKHByb3BzLnZhbHVlTGluayAh PT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsdWVMaW5rKSB7CisgICAgcHJvY2Vzcy5lbnYuTk9E RV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdgdmFsdWVMaW5rYCBwcm9w IG9uIGBzZWxlY3RgIGlzIGRlcHJlY2F0ZWQ7IHNldCBgdmFsdWVgIGFuZCBgb25DaGFuZ2VgIGlu c3RlYWQuJykgOiB2b2lkIDA7CisgICAgZGlkV2FyblZhbHVlTGluayA9IHRydWU7CisgIH0KKwor ICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlUHJvcE5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAg dmFyIHByb3BOYW1lID0gdmFsdWVQcm9wTmFtZXNbaV07CisgICAgaWYgKHByb3BzW3Byb3BOYW1l XSA9PSBudWxsKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgdmFyIGlzQXJyYXkgPSBB cnJheS5pc0FycmF5KHByb3BzW3Byb3BOYW1lXSk7CisgICAgaWYgKHByb3BzLm11bHRpcGxlICYm ICFpc0FycmF5KSB7CisgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24n ID8gd2FybmluZyhmYWxzZSwgJ1RoZSBgJXNgIHByb3Agc3VwcGxpZWQgdG8gPHNlbGVjdD4gbXVz dCBiZSBhbiBhcnJheSBpZiAnICsgJ2BtdWx0aXBsZWAgaXMgdHJ1ZS4lcycsIHByb3BOYW1lLCBn ZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0ob3duZXIpKSA6IHZvaWQgMDsKKyAgICB9IGVsc2Ug aWYgKCFwcm9wcy5tdWx0aXBsZSAmJiBpc0FycmF5KSB7CisgICAgICBwcm9jZXNzLmVudi5OT0RF X0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1RoZSBgJXNgIHByb3Agc3Vw cGxpZWQgdG8gPHNlbGVjdD4gbXVzdCBiZSBhIHNjYWxhciAnICsgJ3ZhbHVlIGlmIGBtdWx0aXBs ZWAgaXMgZmFsc2UuJXMnLCBwcm9wTmFtZSwgZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKG93 bmVyKSkgOiB2b2lkIDA7CisgICAgfQorICB9Cit9CisKKy8qKgorICogQHBhcmFtIHtSZWFjdERP TUNvbXBvbmVudH0gaW5zdAorICogQHBhcmFtIHtib29sZWFufSBtdWx0aXBsZQorICogQHBhcmFt IHsqfSBwcm9wVmFsdWUgQSBzdHJpbmdhYmxlICh3aXRoIGBtdWx0aXBsZWAsIGEgbGlzdCBvZiBz dHJpbmdhYmxlcykuCisgKiBAcHJpdmF0ZQorICovCitmdW5jdGlvbiB1cGRhdGVPcHRpb25zKGlu c3QsIG11bHRpcGxlLCBwcm9wVmFsdWUpIHsKKyAgdmFyIHNlbGVjdGVkVmFsdWUsIGk7CisgIHZh ciBvcHRpb25zID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoaW5z dCkub3B0aW9uczsKKworICBpZiAobXVsdGlwbGUpIHsKKyAgICBzZWxlY3RlZFZhbHVlID0ge307 CisgICAgZm9yIChpID0gMDsgaSA8IHByb3BWYWx1ZS5sZW5ndGg7IGkrKykgeworICAgICAgc2Vs ZWN0ZWRWYWx1ZVsnJyArIHByb3BWYWx1ZVtpXV0gPSB0cnVlOworICAgIH0KKyAgICBmb3IgKGkg PSAwOyBpIDwgb3B0aW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgdmFyIHNlbGVjdGVkID0gc2Vs ZWN0ZWRWYWx1ZS5oYXNPd25Qcm9wZXJ0eShvcHRpb25zW2ldLnZhbHVlKTsKKyAgICAgIGlmIChv cHRpb25zW2ldLnNlbGVjdGVkICE9PSBzZWxlY3RlZCkgeworICAgICAgICBvcHRpb25zW2ldLnNl bGVjdGVkID0gc2VsZWN0ZWQ7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIERv IG5vdCBzZXQgYHNlbGVjdC52YWx1ZWAgYXMgZXhhY3QgYmVoYXZpb3IgaXNuJ3QgY29uc2lzdGVu dCBhY3Jvc3MgYWxsCisgICAgLy8gYnJvd3NlcnMgZm9yIGFsbCBjYXNlcy4KKyAgICBzZWxlY3Rl ZFZhbHVlID0gJycgKyBwcm9wVmFsdWU7CisgICAgZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubGVu Z3RoOyBpKyspIHsKKyAgICAgIGlmIChvcHRpb25zW2ldLnZhbHVlID09PSBzZWxlY3RlZFZhbHVl KSB7CisgICAgICAgIG9wdGlvbnNbaV0uc2VsZWN0ZWQgPSB0cnVlOworICAgICAgICByZXR1cm47 CisgICAgICB9CisgICAgfQorICAgIGlmIChvcHRpb25zLmxlbmd0aCkgeworICAgICAgb3B0aW9u c1swXS5zZWxlY3RlZCA9IHRydWU7CisgICAgfQorICB9Cit9CisKKy8qKgorICogSW1wbGVtZW50 cyBhIDxzZWxlY3Q+IGhvc3QgY29tcG9uZW50IHRoYXQgYWxsb3dzIG9wdGlvbmFsbHkgc2V0dGlu ZyB0aGUKKyAqIHByb3BzIGB2YWx1ZWAgYW5kIGBkZWZhdWx0VmFsdWVgLiBJZiBgbXVsdGlwbGVg IGlzIGZhbHNlLCB0aGUgcHJvcCBtdXN0IGJlIGEKKyAqIHN0cmluZ2FibGUuIElmIGBtdWx0aXBs ZWAgaXMgdHJ1ZSwgdGhlIHByb3AgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdhYmxlcy4KKyAq CisgKiBJZiBgdmFsdWVgIGlzIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2Vy IGFjdGlvbnMgdGhhdCBjaGFuZ2UgdGhlCisgKiBzZWxlY3RlZCBvcHRpb24gd2lsbCB0cmlnZ2Vy IHVwZGF0ZXMgdG8gdGhlIHJlbmRlcmVkIG9wdGlvbnMuCisgKgorICogSWYgaXQgaXMgc3VwcGxp ZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVyZWQgb3B0aW9ucyB3aWxsIG5v dAorICogdXBkYXRlIGluIHJlc3BvbnNlIHRvIHVzZXIgYWN0aW9ucy4gSW5zdGVhZCwgdGhlIGB2 YWx1ZWAgcHJvcCBtdXN0IGNoYW5nZSBpbgorICogb3JkZXIgZm9yIHRoZSByZW5kZXJlZCBvcHRp b25zIHRvIHVwZGF0ZS4KKyAqCisgKiBJZiBgZGVmYXVsdFZhbHVlYCBpcyBwcm92aWRlZCwgYW55 IG9wdGlvbnMgd2l0aCB0aGUgc3VwcGxpZWQgdmFsdWVzIHdpbGwgYmUKKyAqIHNlbGVjdGVkLgor ICovCit2YXIgUmVhY3RET01TZWxlY3QgPSB7CisgIGdldEhvc3RQcm9wczogZnVuY3Rpb24gKGlu c3QsIHByb3BzKSB7CisgICAgcmV0dXJuIF9hc3NpZ24oe30sIHByb3BzLCB7CisgICAgICBvbkNo YW5nZTogaW5zdC5fd3JhcHBlclN0YXRlLm9uQ2hhbmdlLAorICAgICAgdmFsdWU6IHVuZGVmaW5l ZAorICAgIH0pOworICB9LAorCisgIG1vdW50V3JhcHBlcjogZnVuY3Rpb24gKGluc3QsIHByb3Bz KSB7CisgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAg ICAgIGNoZWNrU2VsZWN0UHJvcFR5cGVzKGluc3QsIHByb3BzKTsKKyAgICB9CisKKyAgICB2YXIg dmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmdldFZhbHVlKHByb3BzKTsKKyAgICBpbnN0Ll93cmFw cGVyU3RhdGUgPSB7CisgICAgICBwZW5kaW5nVXBkYXRlOiBmYWxzZSwKKyAgICAgIGluaXRpYWxW YWx1ZTogdmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogcHJvcHMuZGVmYXVsdFZhbHVlLAorICAgICAg bGlzdGVuZXJzOiBudWxsLAorICAgICAgb25DaGFuZ2U6IF9oYW5kbGVDaGFuZ2UuYmluZChpbnN0 KSwKKyAgICAgIHdhc011bHRpcGxlOiBCb29sZWFuKHByb3BzLm11bHRpcGxlKQorICAgIH07CisK KyAgICBpZiAocHJvcHMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUg IT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlKSB7CisgICAgICBwcm9j ZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1NlbGVj dCBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsg JyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9w LCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBv ciB1bmNvbnRyb2xsZWQgc2VsZWN0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVz ZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vZmIubWUvcmVhY3QtY29udHJvbGxlZC1j b21wb25lbnRzJykgOiB2b2lkIDA7CisgICAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgPSB0 cnVlOworICAgIH0KKyAgfSwKKworICBnZXRTZWxlY3RWYWx1ZUNvbnRleHQ6IGZ1bmN0aW9uIChp bnN0KSB7CisgICAgLy8gUmVhY3RET01PcHRpb24gbG9va3MgYXQgdGhpcyBpbml0aWFsIHZhbHVl IHNvIHRoZSBpbml0aWFsIGdlbmVyYXRlZAorICAgIC8vIG1hcmt1cCBoYXMgY29ycmVjdCBgc2Vs ZWN0ZWRgIGF0dHJpYnV0ZXMKKyAgICByZXR1cm4gaW5zdC5fd3JhcHBlclN0YXRlLmluaXRpYWxW YWx1ZTsKKyAgfSwKKworICBwb3N0VXBkYXRlV3JhcHBlcjogZnVuY3Rpb24gKGluc3QpIHsKKyAg ICB2YXIgcHJvcHMgPSBpbnN0Ll9jdXJyZW50RWxlbWVudC5wcm9wczsKKworICAgIC8vIEFmdGVy IHRoZSBpbml0aWFsIG1vdW50LCB3ZSBjb250cm9sIHNlbGVjdGVkLW5lc3MgbWFudWFsbHkgc28g ZG9uJ3QgcGFzcworICAgIC8vIHRoaXMgdmFsdWUgZG93bgorICAgIGluc3QuX3dyYXBwZXJTdGF0 ZS5pbml0aWFsVmFsdWUgPSB1bmRlZmluZWQ7CisKKyAgICB2YXIgd2FzTXVsdGlwbGUgPSBpbnN0 Ll93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU7CisgICAgaW5zdC5fd3JhcHBlclN0YXRlLndhc011 bHRpcGxlID0gQm9vbGVhbihwcm9wcy5tdWx0aXBsZSk7CisKKyAgICB2YXIgdmFsdWUgPSBMaW5r ZWRWYWx1ZVV0aWxzLmdldFZhbHVlKHByb3BzKTsKKyAgICBpZiAodmFsdWUgIT0gbnVsbCkgewor ICAgICAgaW5zdC5fd3JhcHBlclN0YXRlLnBlbmRpbmdVcGRhdGUgPSBmYWxzZTsKKyAgICAgIHVw ZGF0ZU9wdGlvbnMoaW5zdCwgQm9vbGVhbihwcm9wcy5tdWx0aXBsZSksIHZhbHVlKTsKKyAgICB9 IGVsc2UgaWYgKHdhc011bHRpcGxlICE9PSBCb29sZWFuKHByb3BzLm11bHRpcGxlKSkgeworICAg ICAgLy8gRm9yIHNpbXBsaWNpdHksIHJlYXBwbHkgYGRlZmF1bHRWYWx1ZWAgaWYgYG11bHRpcGxl YCBpcyB0b2dnbGVkLgorICAgICAgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Cisg ICAgICAgIHVwZGF0ZU9wdGlvbnMoaW5zdCwgQm9vbGVhbihwcm9wcy5tdWx0aXBsZSksIHByb3Bz LmRlZmF1bHRWYWx1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBSZXZlcnQgdGhlIHNl bGVjdCBiYWNrIHRvIGl0cyBkZWZhdWx0IHVuc2VsZWN0ZWQgc3RhdGUuCisgICAgICAgIHVwZGF0 ZU9wdGlvbnMoaW5zdCwgQm9vbGVhbihwcm9wcy5tdWx0aXBsZSksIHByb3BzLm11bHRpcGxlID8g W10gOiAnJyk7CisgICAgICB9CisgICAgfQorICB9Cit9OworCitmdW5jdGlvbiBfaGFuZGxlQ2hh bmdlKGV2ZW50KSB7CisgIHZhciBwcm9wcyA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzOwor ICB2YXIgcmV0dXJuVmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmV4ZWN1dGVPbkNoYW5nZShwcm9w cywgZXZlbnQpOworCisgIGlmICh0aGlzLl9yb290Tm9kZUlEKSB7CisgICAgdGhpcy5fd3JhcHBl clN0YXRlLnBlbmRpbmdVcGRhdGUgPSB0cnVlOworICB9CisgIFJlYWN0VXBkYXRlcy5hc2FwKHVw ZGF0ZU9wdGlvbnNJZlBlbmRpbmdVcGRhdGVBbmRNb3VudGVkLCB0aGlzKTsKKyAgcmV0dXJuIHJl dHVyblZhbHVlOworfQorCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NU2VsZWN0OwpcIE5vIG5l d2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5k b3IvcmVhY3QtZG9tL2xpYi9SZWFjdERPTVNlbGVjdGlvbi5qcyBiL3dlYi9wZ2FkbWluL3N0YXRp Yy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdERPTVNlbGVjdGlvbi5qcwpuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMC4uYzI0MDRlZjAKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIv cGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RET01TZWxlY3Rpb24uanMK QEAgLTAsMCArMSwyMTEgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJv b2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29k ZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisg KiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUu IEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGlu IHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNl IHN0cmljdCc7CisKK3ZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGli L0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7CisKK3ZhciBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0 ID0gcmVxdWlyZSgnLi9nZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0Jyk7Cit2YXIgZ2V0VGV4dENv bnRlbnRBY2Nlc3NvciA9IHJlcXVpcmUoJy4vZ2V0VGV4dENvbnRlbnRBY2Nlc3NvcicpOworCisv KioKKyAqIFdoaWxlIGBpc0NvbGxhcHNlZGAgaXMgYXZhaWxhYmxlIG9uIHRoZSBTZWxlY3Rpb24g b2JqZWN0IGFuZCBgY29sbGFwc2VkYAorICogaXMgYXZhaWxhYmxlIG9uIHRoZSBSYW5nZSBvYmpl Y3QsIElFMTEgc29tZXRpbWVzIGdldHMgdGhlbSB3cm9uZy4KKyAqIElmIHRoZSBhbmNob3IvZm9j dXMgbm9kZXMgYW5kIG9mZnNldHMgYXJlIHRoZSBzYW1lLCB0aGUgcmFuZ2UgaXMgY29sbGFwc2Vk LgorICovCitmdW5jdGlvbiBpc0NvbGxhcHNlZChhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZv Y3VzTm9kZSwgZm9jdXNPZmZzZXQpIHsKKyAgcmV0dXJuIGFuY2hvck5vZGUgPT09IGZvY3VzTm9k ZSAmJiBhbmNob3JPZmZzZXQgPT09IGZvY3VzT2Zmc2V0OworfQorCisvKioKKyAqIEdldCB0aGUg YXBwcm9wcmlhdGUgYW5jaG9yIGFuZCBmb2N1cyBub2RlL29mZnNldCBwYWlycyBmb3IgSUUuCisg KgorICogVGhlIGNhdGNoIGhlcmUgaXMgdGhhdCBJRSdzIHNlbGVjdGlvbiBBUEkgZG9lc24ndCBw cm92aWRlIGluZm9ybWF0aW9uCisgKiBhYm91dCB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gaXMgZm9y d2FyZCBvciBiYWNrd2FyZCwgc28gd2UgaGF2ZSB0bworICogYmVoYXZlIGFzIHRob3VnaCBpdCdz IGFsd2F5cyBmb3J3YXJkLgorICoKKyAqIElFIHRleHQgZGlmZmVycyBmcm9tIG1vZGVybiBzZWxl Y3Rpb24gaW4gdGhhdCBpdCBiZWhhdmVzIGFzIHRob3VnaAorICogYmxvY2sgZWxlbWVudHMgZW5k IHdpdGggYSBuZXcgbGluZS4gVGhpcyBtZWFucyBjaGFyYWN0ZXIgb2Zmc2V0cyB3aWxsCisgKiBk aWZmZXIgYmV0d2VlbiB0aGUgdHdvIEFQSXMuCisgKgorICogQHBhcmFtIHtET01FbGVtZW50fSBu b2RlCisgKiBAcmV0dXJuIHtvYmplY3R9CisgKi8KK2Z1bmN0aW9uIGdldElFT2Zmc2V0cyhub2Rl KSB7CisgIHZhciBzZWxlY3Rpb24gPSBkb2N1bWVudC5zZWxlY3Rpb247CisgIHZhciBzZWxlY3Rl ZFJhbmdlID0gc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7CisgIHZhciBzZWxlY3RlZExlbmd0aCA9 IHNlbGVjdGVkUmFuZ2UudGV4dC5sZW5ndGg7CisKKyAgLy8gRHVwbGljYXRlIHNlbGVjdGlvbiBz byB3ZSBjYW4gbW92ZSByYW5nZSB3aXRob3V0IGJyZWFraW5nIHVzZXIgc2VsZWN0aW9uLgorICB2 YXIgZnJvbVN0YXJ0ID0gc2VsZWN0ZWRSYW5nZS5kdXBsaWNhdGUoKTsKKyAgZnJvbVN0YXJ0Lm1v dmVUb0VsZW1lbnRUZXh0KG5vZGUpOworICBmcm9tU3RhcnQuc2V0RW5kUG9pbnQoJ0VuZFRvU3Rh cnQnLCBzZWxlY3RlZFJhbmdlKTsKKworICB2YXIgc3RhcnRPZmZzZXQgPSBmcm9tU3RhcnQudGV4 dC5sZW5ndGg7CisgIHZhciBlbmRPZmZzZXQgPSBzdGFydE9mZnNldCArIHNlbGVjdGVkTGVuZ3Ro OworCisgIHJldHVybiB7CisgICAgc3RhcnQ6IHN0YXJ0T2Zmc2V0LAorICAgIGVuZDogZW5kT2Zm c2V0CisgIH07Cit9CisKKy8qKgorICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlCisgKiBAcmV0 dXJuIHs/b2JqZWN0fQorICovCitmdW5jdGlvbiBnZXRNb2Rlcm5PZmZzZXRzKG5vZGUpIHsKKyAg dmFyIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24gJiYgd2luZG93LmdldFNlbGVjdGlv bigpOworCisgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7 CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICB2YXIgYW5jaG9yTm9kZSA9IHNlbGVjdGlvbi5h bmNob3JOb2RlOworICB2YXIgYW5jaG9yT2Zmc2V0ID0gc2VsZWN0aW9uLmFuY2hvck9mZnNldDsK KyAgdmFyIGZvY3VzTm9kZSA9IHNlbGVjdGlvbi5mb2N1c05vZGU7CisgIHZhciBmb2N1c09mZnNl dCA9IHNlbGVjdGlvbi5mb2N1c09mZnNldDsKKworICB2YXIgY3VycmVudFJhbmdlID0gc2VsZWN0 aW9uLmdldFJhbmdlQXQoMCk7CisKKyAgLy8gSW4gRmlyZWZveCwgcmFuZ2Uuc3RhcnRDb250YWlu ZXIgYW5kIHJhbmdlLmVuZENvbnRhaW5lciBjYW4gYmUgImFub255bW91cworICAvLyBkaXZzIiwg ZS5nLiB0aGUgdXAvZG93biBidXR0b25zIG9uIGFuIDxpbnB1dCB0eXBlPSJudW1iZXIiPi4gQW5v bnltb3VzCisgIC8vIGRpdnMgZG8gbm90IHNlZW0gdG8gZXhwb3NlIHByb3BlcnRpZXMsIHRyaWdn ZXJpbmcgYSAiUGVybWlzc2lvbiBkZW5pZWQKKyAgLy8gZXJyb3IiIGlmIGFueSBvZiBpdHMgcHJv cGVydGllcyBhcmUgYWNjZXNzZWQuIFRoZSBvbmx5IHNlZW1pbmdseSBwb3NzaWJsZQorICAvLyB3 YXkgdG8gYXZvaWQgZXJyb3JpbmcgaXMgdG8gYWNjZXNzIGEgcHJvcGVydHkgdGhhdCB0eXBpY2Fs bHkgd29ya3MgZm9yCisgIC8vIG5vbi1hbm9ueW1vdXMgZGl2cyBhbmQgY2F0Y2ggYW55IGVycm9y IHRoYXQgbWF5IG90aGVyd2lzZSBhcmlzZS4gU2VlCisgIC8vIGh0dHBzOi8vYnVnemlsbGEubW96 aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTIwODQyNworICB0cnkgeworICAgIC8qIGVzbGludC1k aXNhYmxlIG5vLXVudXNlZC1leHByZXNzaW9ucyAqLworICAgIGN1cnJlbnRSYW5nZS5zdGFydENv bnRhaW5lci5ub2RlVHlwZTsKKyAgICBjdXJyZW50UmFuZ2UuZW5kQ29udGFpbmVyLm5vZGVUeXBl OworICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovCisgIH0gY2F0 Y2ggKGUpIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8vIElmIHRoZSBub2RlIGFuZCBv ZmZzZXQgdmFsdWVzIGFyZSB0aGUgc2FtZSwgdGhlIHNlbGVjdGlvbiBpcyBjb2xsYXBzZWQuCisg IC8vIGBTZWxlY3Rpb24uaXNDb2xsYXBzZWRgIGlzIGF2YWlsYWJsZSBuYXRpdmVseSwgYnV0IElF IHNvbWV0aW1lcyBnZXRzCisgIC8vIHRoaXMgdmFsdWUgd3JvbmcuCisgIHZhciBpc1NlbGVjdGlv bkNvbGxhcHNlZCA9IGlzQ29sbGFwc2VkKHNlbGVjdGlvbi5hbmNob3JOb2RlLCBzZWxlY3Rpb24u YW5jaG9yT2Zmc2V0LCBzZWxlY3Rpb24uZm9jdXNOb2RlLCBzZWxlY3Rpb24uZm9jdXNPZmZzZXQp OworCisgIHZhciByYW5nZUxlbmd0aCA9IGlzU2VsZWN0aW9uQ29sbGFwc2VkID8gMCA6IGN1cnJl bnRSYW5nZS50b1N0cmluZygpLmxlbmd0aDsKKworICB2YXIgdGVtcFJhbmdlID0gY3VycmVudFJh bmdlLmNsb25lUmFuZ2UoKTsKKyAgdGVtcFJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhub2RlKTsK KyAgdGVtcFJhbmdlLnNldEVuZChjdXJyZW50UmFuZ2Uuc3RhcnRDb250YWluZXIsIGN1cnJlbnRS YW5nZS5zdGFydE9mZnNldCk7CisKKyAgdmFyIGlzVGVtcFJhbmdlQ29sbGFwc2VkID0gaXNDb2xs YXBzZWQodGVtcFJhbmdlLnN0YXJ0Q29udGFpbmVyLCB0ZW1wUmFuZ2Uuc3RhcnRPZmZzZXQsIHRl bXBSYW5nZS5lbmRDb250YWluZXIsIHRlbXBSYW5nZS5lbmRPZmZzZXQpOworCisgIHZhciBzdGFy dCA9IGlzVGVtcFJhbmdlQ29sbGFwc2VkID8gMCA6IHRlbXBSYW5nZS50b1N0cmluZygpLmxlbmd0 aDsKKyAgdmFyIGVuZCA9IHN0YXJ0ICsgcmFuZ2VMZW5ndGg7CisKKyAgLy8gRGV0ZWN0IHdoZXRo ZXIgdGhlIHNlbGVjdGlvbiBpcyBiYWNrd2FyZC4KKyAgdmFyIGRldGVjdGlvblJhbmdlID0gZG9j dW1lbnQuY3JlYXRlUmFuZ2UoKTsKKyAgZGV0ZWN0aW9uUmFuZ2Uuc2V0U3RhcnQoYW5jaG9yTm9k ZSwgYW5jaG9yT2Zmc2V0KTsKKyAgZGV0ZWN0aW9uUmFuZ2Uuc2V0RW5kKGZvY3VzTm9kZSwgZm9j dXNPZmZzZXQpOworICB2YXIgaXNCYWNrd2FyZCA9IGRldGVjdGlvblJhbmdlLmNvbGxhcHNlZDsK KworICByZXR1cm4geworICAgIHN0YXJ0OiBpc0JhY2t3YXJkID8gZW5kIDogc3RhcnQsCisgICAg ZW5kOiBpc0JhY2t3YXJkID8gc3RhcnQgOiBlbmQKKyAgfTsKK30KKworLyoqCisgKiBAcGFyYW0g e0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGUKKyAqIEBwYXJhbSB7b2JqZWN0fSBvZmZzZXRz CisgKi8KK2Z1bmN0aW9uIHNldElFT2Zmc2V0cyhub2RlLCBvZmZzZXRzKSB7CisgIHZhciByYW5n ZSA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLmR1cGxpY2F0ZSgpOworICB2YXIg c3RhcnQsIGVuZDsKKworICBpZiAob2Zmc2V0cy5lbmQgPT09IHVuZGVmaW5lZCkgeworICAgIHN0 YXJ0ID0gb2Zmc2V0cy5zdGFydDsKKyAgICBlbmQgPSBzdGFydDsKKyAgfSBlbHNlIGlmIChvZmZz ZXRzLnN0YXJ0ID4gb2Zmc2V0cy5lbmQpIHsKKyAgICBzdGFydCA9IG9mZnNldHMuZW5kOworICAg IGVuZCA9IG9mZnNldHMuc3RhcnQ7CisgIH0gZWxzZSB7CisgICAgc3RhcnQgPSBvZmZzZXRzLnN0 YXJ0OworICAgIGVuZCA9IG9mZnNldHMuZW5kOworICB9CisKKyAgcmFuZ2UubW92ZVRvRWxlbWVu dFRleHQobm9kZSk7CisgIHJhbmdlLm1vdmVTdGFydCgnY2hhcmFjdGVyJywgc3RhcnQpOworICBy YW5nZS5zZXRFbmRQb2ludCgnRW5kVG9TdGFydCcsIHJhbmdlKTsKKyAgcmFuZ2UubW92ZUVuZCgn Y2hhcmFjdGVyJywgZW5kIC0gc3RhcnQpOworICByYW5nZS5zZWxlY3QoKTsKK30KKworLyoqCisg KiBJbiBtb2Rlcm4gbm9uLUlFIGJyb3dzZXJzLCB3ZSBjYW4gc3VwcG9ydCBib3RoIGZvcndhcmQg YW5kIGJhY2t3YXJkCisgKiBzZWxlY3Rpb25zLgorICoKKyAqIE5vdGU6IElFMTArIHN1cHBvcnRz IHRoZSBTZWxlY3Rpb24gb2JqZWN0LCBidXQgaXQgZG9lcyBub3Qgc3VwcG9ydAorICogdGhlIGBl eHRlbmRgIG1ldGhvZCwgd2hpY2ggbWVhbnMgdGhhdCBldmVuIGluIG1vZGVybiBJRSwgaXQncyBu b3QgcG9zc2libGUKKyAqIHRvIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlIGEgYmFja3dhcmQgc2Vs ZWN0aW9uLiBUaHVzLCBmb3IgYWxsIElFCisgKiB2ZXJzaW9ucywgd2UgdXNlIHRoZSBvbGQgSUUg QVBJIHRvIGNyZWF0ZSBvdXIgc2VsZWN0aW9ucy4KKyAqCisgKiBAcGFyYW0ge0RPTUVsZW1lbnR8 RE9NVGV4dE5vZGV9IG5vZGUKKyAqIEBwYXJhbSB7b2JqZWN0fSBvZmZzZXRzCisgKi8KK2Z1bmN0 aW9uIHNldE1vZGVybk9mZnNldHMobm9kZSwgb2Zmc2V0cykgeworICBpZiAoIXdpbmRvdy5nZXRT ZWxlY3Rpb24pIHsKKyAgICByZXR1cm47CisgIH0KKworICB2YXIgc2VsZWN0aW9uID0gd2luZG93 LmdldFNlbGVjdGlvbigpOworICB2YXIgbGVuZ3RoID0gbm9kZVtnZXRUZXh0Q29udGVudEFjY2Vz c29yKCldLmxlbmd0aDsKKyAgdmFyIHN0YXJ0ID0gTWF0aC5taW4ob2Zmc2V0cy5zdGFydCwgbGVu Z3RoKTsKKyAgdmFyIGVuZCA9IG9mZnNldHMuZW5kID09PSB1bmRlZmluZWQgPyBzdGFydCA6IE1h dGgubWluKG9mZnNldHMuZW5kLCBsZW5ndGgpOworCisgIC8vIElFIDExIHVzZXMgbW9kZXJuIHNl bGVjdGlvbiwgYnV0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgZXh0ZW5kIG1ldGhvZC4KKyAgLy8gRmxp cCBiYWNrd2FyZCBzZWxlY3Rpb25zLCBzbyB3ZSBjYW4gc2V0IHdpdGggYSBzaW5nbGUgcmFuZ2Uu CisgIGlmICghc2VsZWN0aW9uLmV4dGVuZCAmJiBzdGFydCA+IGVuZCkgeworICAgIHZhciB0ZW1w ID0gZW5kOworICAgIGVuZCA9IHN0YXJ0OworICAgIHN0YXJ0ID0gdGVtcDsKKyAgfQorCisgIHZh ciBzdGFydE1hcmtlciA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQobm9kZSwgc3RhcnQpOwor ICB2YXIgZW5kTWFya2VyID0gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChub2RlLCBlbmQpOwor CisgIGlmIChzdGFydE1hcmtlciAmJiBlbmRNYXJrZXIpIHsKKyAgICB2YXIgcmFuZ2UgPSBkb2N1 bWVudC5jcmVhdGVSYW5nZSgpOworICAgIHJhbmdlLnNldFN0YXJ0KHN0YXJ0TWFya2VyLm5vZGUs IHN0YXJ0TWFya2VyLm9mZnNldCk7CisgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpOwor CisgICAgaWYgKHN0YXJ0ID4gZW5kKSB7CisgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2Up OworICAgICAgc2VsZWN0aW9uLmV4dGVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNl dCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJhbmdlLnNldEVuZChlbmRNYXJrZXIubm9kZSwgZW5k TWFya2VyLm9mZnNldCk7CisgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpOworICAgIH0K KyAgfQorfQorCit2YXIgdXNlSUVPZmZzZXRzID0gRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNl RE9NICYmICdzZWxlY3Rpb24nIGluIGRvY3VtZW50ICYmICEoJ2dldFNlbGVjdGlvbicgaW4gd2lu ZG93KTsKKwordmFyIFJlYWN0RE9NU2VsZWN0aW9uID0geworICAvKioKKyAgICogQHBhcmFtIHtE T01FbGVtZW50fSBub2RlCisgICAqLworICBnZXRPZmZzZXRzOiB1c2VJRU9mZnNldHMgPyBnZXRJ RU9mZnNldHMgOiBnZXRNb2Rlcm5PZmZzZXRzLAorCisgIC8qKgorICAgKiBAcGFyYW0ge0RPTUVs ZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGUKKyAgICogQHBhcmFtIHtvYmplY3R9IG9mZnNldHMKKyAg ICovCisgIHNldE9mZnNldHM6IHVzZUlFT2Zmc2V0cyA/IHNldElFT2Zmc2V0cyA6IHNldE1vZGVy bk9mZnNldHMKK307CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RET01TZWxlY3Rpb247ClwgTm8g bmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3Zl bmRvci9yZWFjdC1kb20vbGliL1JlYWN0RE9NU2VydmVyLmpzIGIvd2ViL3BnYWRtaW4vc3RhdGlj L3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0RE9NU2VydmVyLmpzCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAwLi40OWRjMDI5YQotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2Fk bWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdERPTVNlcnZlci5qcwpAQCAtMCww ICsxLDI1IEBACisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMu CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGlj ZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5T RSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRp dGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFU RU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3Qn OworCit2YXIgUmVhY3REZWZhdWx0SW5qZWN0aW9uID0gcmVxdWlyZSgnLi9SZWFjdERlZmF1bHRJ bmplY3Rpb24nKTsKK3ZhciBSZWFjdFNlcnZlclJlbmRlcmluZyA9IHJlcXVpcmUoJy4vUmVhY3RT ZXJ2ZXJSZW5kZXJpbmcnKTsKK3ZhciBSZWFjdFZlcnNpb24gPSByZXF1aXJlKCcuL1JlYWN0VmVy c2lvbicpOworCitSZWFjdERlZmF1bHRJbmplY3Rpb24uaW5qZWN0KCk7CisKK3ZhciBSZWFjdERP TVNlcnZlciA9IHsKKyAgcmVuZGVyVG9TdHJpbmc6IFJlYWN0U2VydmVyUmVuZGVyaW5nLnJlbmRl clRvU3RyaW5nLAorICByZW5kZXJUb1N0YXRpY01hcmt1cDogUmVhY3RTZXJ2ZXJSZW5kZXJpbmcu cmVuZGVyVG9TdGF0aWNNYXJrdXAsCisgIHZlcnNpb246IFJlYWN0VmVyc2lvbgorfTsKKworbW9k dWxlLmV4cG9ydHMgPSBSZWFjdERPTVNlcnZlcjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxl CmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVh Y3RET01TZXJ2ZXJVTURFbnRyeS5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3Qt ZG9tL2xpYi9SZWFjdERPTVNlcnZlclVNREVudHJ5LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAwLi44MGE4ZWFlMAotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0 YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdERPTVNlcnZlclVNREVudHJ5LmpzCkBAIC0w LDAgKzEsMTUgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIElu Yy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBs aWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNF TlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFk ZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQ QVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmlj dCc7CisKK3ZhciBSZWFjdERPTVNlcnZlciA9IHJlcXVpcmUoJy4vUmVhY3RET01TZXJ2ZXInKTsK KworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTVNlcnZlcjsKXCBObyBuZXdsaW5lIGF0IGVuZCBv ZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9s aWIvUmVhY3RET01UZXh0Q29tcG9uZW50LmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9y ZWFjdC1kb20vbGliL1JlYWN0RE9NVGV4dENvbXBvbmVudC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwMC4uNzNiNDAyNmYKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1p bi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RET01UZXh0Q29tcG9uZW50LmpzCkBA IC0wLDAgKzEsMTYzIEBACisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29r LCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUg aXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICog TElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBB biBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0 aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBz dHJpY3QnOworCit2YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFy aWFudCcpLAorICAgIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7CisKK3ZhciBE T01DaGlsZHJlbk9wZXJhdGlvbnMgPSByZXF1aXJlKCcuL0RPTUNoaWxkcmVuT3BlcmF0aW9ucycp OwordmFyIERPTUxhenlUcmVlID0gcmVxdWlyZSgnLi9ET01MYXp5VHJlZScpOwordmFyIFJlYWN0 RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7CisK K3ZhciBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIgPSByZXF1aXJlKCcuL2VzY2FwZVRleHRD b250ZW50Rm9yQnJvd3NlcicpOwordmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2lu dmFyaWFudCcpOwordmFyIHZhbGlkYXRlRE9NTmVzdGluZyA9IHJlcXVpcmUoJy4vdmFsaWRhdGVE T01OZXN0aW5nJyk7CisKKy8qKgorICogVGV4dCBub2RlcyB2aW9sYXRlIGEgY291cGxlIGFzc3Vt cHRpb25zIHRoYXQgUmVhY3QgbWFrZXMgYWJvdXQgY29tcG9uZW50czoKKyAqCisgKiAgLSBXaGVu IG1vdW50aW5nIHRleHQgaW50byB0aGUgRE9NLCBhZGphY2VudCB0ZXh0IG5vZGVzIGFyZSBtZXJn ZWQuCisgKiAgLSBUZXh0IG5vZGVzIGNhbm5vdCBiZSBhc3NpZ25lZCBhIFJlYWN0IHJvb3QgSUQu CisgKgorICogVGhpcyBjb21wb25lbnQgaXMgdXNlZCB0byB3cmFwIHN0cmluZ3MgYmV0d2VlbiBj b21tZW50IG5vZGVzIHNvIHRoYXQgdGhleQorICogY2FuIHVuZGVyZ28gdGhlIHNhbWUgcmVjb25j aWxpYXRpb24gdGhhdCBpcyBhcHBsaWVkIHRvIGVsZW1lbnRzLgorICoKKyAqIFRPRE86IEludmVz dGlnYXRlIHJlcHJlc2VudGluZyBSZWFjdCBjb21wb25lbnRzIGluIHRoZSBET00gd2l0aCB0ZXh0 IG5vZGVzLgorICoKKyAqIEBjbGFzcyBSZWFjdERPTVRleHRDb21wb25lbnQKKyAqIEBleHRlbmRz IFJlYWN0Q29tcG9uZW50CisgKiBAaW50ZXJuYWwKKyAqLwordmFyIFJlYWN0RE9NVGV4dENvbXBv bmVudCA9IGZ1bmN0aW9uICh0ZXh0KSB7CisgIC8vIFRPRE86IFRoaXMgaXMgcmVhbGx5IGEgUmVh Y3RUZXh0IChSZWFjdE5vZGUpLCBub3QgYSBSZWFjdEVsZW1lbnQKKyAgdGhpcy5fY3VycmVudEVs ZW1lbnQgPSB0ZXh0OworICB0aGlzLl9zdHJpbmdUZXh0ID0gJycgKyB0ZXh0OworICAvLyBSZWFj dERPTUNvbXBvbmVudFRyZWUgdXNlcyB0aGVzZToKKyAgdGhpcy5faG9zdE5vZGUgPSBudWxsOwor ICB0aGlzLl9ob3N0UGFyZW50ID0gbnVsbDsKKworICAvLyBQcm9wZXJ0aWVzCisgIHRoaXMuX2Rv bUlEID0gMDsKKyAgdGhpcy5fbW91bnRJbmRleCA9IDA7CisgIHRoaXMuX2Nsb3NpbmdDb21tZW50 ID0gbnVsbDsKKyAgdGhpcy5fY29tbWVudE5vZGVzID0gbnVsbDsKK307CisKK19hc3NpZ24oUmVh Y3RET01UZXh0Q29tcG9uZW50LnByb3RvdHlwZSwgeworCisgIC8qKgorICAgKiBDcmVhdGVzIHRo ZSBtYXJrdXAgZm9yIHRoaXMgdGV4dCBub2RlLiBUaGlzIG5vZGUgaXMgbm90IGludGVuZGVkIHRv IGhhdmUKKyAgICogYW55IGZlYXR1cmVzIGJlc2lkZXMgY29udGFpbmluZyB0ZXh0IGNvbnRlbnQu CisgICAqCisgICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbnxSZWFjdFNlcnZl clJlbmRlcmluZ1RyYW5zYWN0aW9ufSB0cmFuc2FjdGlvbgorICAgKiBAcmV0dXJuIHtzdHJpbmd9 IE1hcmt1cCBmb3IgdGhpcyB0ZXh0IG5vZGUuCisgICAqIEBpbnRlcm5hbAorICAgKi8KKyAgbW91 bnRDb21wb25lbnQ6IGZ1bmN0aW9uICh0cmFuc2FjdGlvbiwgaG9zdFBhcmVudCwgaG9zdENvbnRh aW5lckluZm8sIGNvbnRleHQpIHsKKyAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdw cm9kdWN0aW9uJykgeworICAgICAgdmFyIHBhcmVudEluZm87CisgICAgICBpZiAoaG9zdFBhcmVu dCAhPSBudWxsKSB7CisgICAgICAgIHBhcmVudEluZm8gPSBob3N0UGFyZW50Ll9hbmNlc3Rvcklu Zm87CisgICAgICB9IGVsc2UgaWYgKGhvc3RDb250YWluZXJJbmZvICE9IG51bGwpIHsKKyAgICAg ICAgcGFyZW50SW5mbyA9IGhvc3RDb250YWluZXJJbmZvLl9hbmNlc3RvckluZm87CisgICAgICB9 CisgICAgICBpZiAocGFyZW50SW5mbykgeworICAgICAgICAvLyBwYXJlbnRJbmZvIHNob3VsZCBh bHdheXMgYmUgcHJlc2VudCBleGNlcHQgZm9yIHRoZSB0b3AtbGV2ZWwKKyAgICAgICAgLy8gY29t cG9uZW50IHdoZW4gc2VydmVyIHJlbmRlcmluZworICAgICAgICB2YWxpZGF0ZURPTU5lc3Rpbmco bnVsbCwgdGhpcy5fc3RyaW5nVGV4dCwgdGhpcywgcGFyZW50SW5mbyk7CisgICAgICB9CisgICAg fQorCisgICAgdmFyIGRvbUlEID0gaG9zdENvbnRhaW5lckluZm8uX2lkQ291bnRlcisrOworICAg IHZhciBvcGVuaW5nVmFsdWUgPSAnIHJlYWN0LXRleHQ6ICcgKyBkb21JRCArICcgJzsKKyAgICB2 YXIgY2xvc2luZ1ZhbHVlID0gJyAvcmVhY3QtdGV4dCAnOworICAgIHRoaXMuX2RvbUlEID0gZG9t SUQ7CisgICAgdGhpcy5faG9zdFBhcmVudCA9IGhvc3RQYXJlbnQ7CisgICAgaWYgKHRyYW5zYWN0 aW9uLnVzZUNyZWF0ZUVsZW1lbnQpIHsKKyAgICAgIHZhciBvd25lckRvY3VtZW50ID0gaG9zdENv bnRhaW5lckluZm8uX293bmVyRG9jdW1lbnQ7CisgICAgICB2YXIgb3BlbmluZ0NvbW1lbnQgPSBv d25lckRvY3VtZW50LmNyZWF0ZUNvbW1lbnQob3BlbmluZ1ZhbHVlKTsKKyAgICAgIHZhciBjbG9z aW5nQ29tbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlQ29tbWVudChjbG9zaW5nVmFsdWUpOwor ICAgICAgdmFyIGxhenlUcmVlID0gRE9NTGF6eVRyZWUob3duZXJEb2N1bWVudC5jcmVhdGVEb2N1 bWVudEZyYWdtZW50KCkpOworICAgICAgRE9NTGF6eVRyZWUucXVldWVDaGlsZChsYXp5VHJlZSwg RE9NTGF6eVRyZWUob3BlbmluZ0NvbW1lbnQpKTsKKyAgICAgIGlmICh0aGlzLl9zdHJpbmdUZXh0 KSB7CisgICAgICAgIERPTUxhenlUcmVlLnF1ZXVlQ2hpbGQobGF6eVRyZWUsIERPTUxhenlUcmVl KG93bmVyRG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5fc3RyaW5nVGV4dCkpKTsKKyAgICAg IH0KKyAgICAgIERPTUxhenlUcmVlLnF1ZXVlQ2hpbGQobGF6eVRyZWUsIERPTUxhenlUcmVlKGNs b3NpbmdDb21tZW50KSk7CisgICAgICBSZWFjdERPTUNvbXBvbmVudFRyZWUucHJlY2FjaGVOb2Rl KHRoaXMsIG9wZW5pbmdDb21tZW50KTsKKyAgICAgIHRoaXMuX2Nsb3NpbmdDb21tZW50ID0gY2xv c2luZ0NvbW1lbnQ7CisgICAgICByZXR1cm4gbGF6eVRyZWU7CisgICAgfSBlbHNlIHsKKyAgICAg IHZhciBlc2NhcGVkVGV4dCA9IGVzY2FwZVRleHRDb250ZW50Rm9yQnJvd3Nlcih0aGlzLl9zdHJp bmdUZXh0KTsKKworICAgICAgaWYgKHRyYW5zYWN0aW9uLnJlbmRlclRvU3RhdGljTWFya3VwKSB7 CisgICAgICAgIC8vIE5vcm1hbGx5IHdlJ2Qgd3JhcCB0aGlzIGJldHdlZW4gY29tbWVudCBub2Rl cyBmb3IgdGhlIHJlYXNvbnMgc3RhdGVkCisgICAgICAgIC8vIGFib3ZlLCBidXQgc2luY2UgdGhp cyBpcyBhIHNpdHVhdGlvbiB3aGVyZSBSZWFjdCB3b24ndCB0YWtlIG92ZXIKKyAgICAgICAgLy8g KHN0YXRpYyBwYWdlcyksIHdlIGNhbiBzaW1wbHkgcmV0dXJuIHRoZSB0ZXh0IGFzIGl0IGlzLgor ICAgICAgICByZXR1cm4gZXNjYXBlZFRleHQ7CisgICAgICB9CisKKyAgICAgIHJldHVybiAnPCEt LScgKyBvcGVuaW5nVmFsdWUgKyAnLS0+JyArIGVzY2FwZWRUZXh0ICsgJzwhLS0nICsgY2xvc2lu Z1ZhbHVlICsgJy0tPic7CisgICAgfQorICB9LAorCisgIC8qKgorICAgKiBVcGRhdGVzIHRoaXMg Y29tcG9uZW50IGJ5IHVwZGF0aW5nIHRoZSB0ZXh0IGNvbnRlbnQuCisgICAqCisgICAqIEBwYXJh bSB7UmVhY3RUZXh0fSBuZXh0VGV4dCBUaGUgbmV4dCB0ZXh0IGNvbnRlbnQKKyAgICogQHBhcmFt IHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvbgorICAgKiBAaW50ZXJuYWwK KyAgICovCisgIHJlY2VpdmVDb21wb25lbnQ6IGZ1bmN0aW9uIChuZXh0VGV4dCwgdHJhbnNhY3Rp b24pIHsKKyAgICBpZiAobmV4dFRleHQgIT09IHRoaXMuX2N1cnJlbnRFbGVtZW50KSB7CisgICAg ICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IG5leHRUZXh0OworICAgICAgdmFyIG5leHRTdHJpbmdU ZXh0ID0gJycgKyBuZXh0VGV4dDsKKyAgICAgIGlmIChuZXh0U3RyaW5nVGV4dCAhPT0gdGhpcy5f c3RyaW5nVGV4dCkgeworICAgICAgICAvLyBUT0RPOiBTYXZlIHRoaXMgYXMgcGVuZGluZyBwcm9w cyBhbmQgdXNlIHBlcmZvcm1VcGRhdGVJZk5lY2Vzc2FyeQorICAgICAgICAvLyBhbmQvb3IgdXBk YXRlQ29tcG9uZW50IHRvIGRvIHRoZSBhY3R1YWwgdXBkYXRlIGZvciBjb25zaXN0ZW5jeSB3aXRo CisgICAgICAgIC8vIG90aGVyIGNvbXBvbmVudCB0eXBlcz8KKyAgICAgICAgdGhpcy5fc3RyaW5n VGV4dCA9IG5leHRTdHJpbmdUZXh0OworICAgICAgICB2YXIgY29tbWVudE5vZGVzID0gdGhpcy5n ZXRIb3N0Tm9kZSgpOworICAgICAgICBET01DaGlsZHJlbk9wZXJhdGlvbnMucmVwbGFjZURlbGlt aXRlZFRleHQoY29tbWVudE5vZGVzWzBdLCBjb21tZW50Tm9kZXNbMV0sIG5leHRTdHJpbmdUZXh0 KTsKKyAgICAgIH0KKyAgICB9CisgIH0sCisKKyAgZ2V0SG9zdE5vZGU6IGZ1bmN0aW9uICgpIHsK KyAgICB2YXIgaG9zdE5vZGUgPSB0aGlzLl9jb21tZW50Tm9kZXM7CisgICAgaWYgKGhvc3ROb2Rl KSB7CisgICAgICByZXR1cm4gaG9zdE5vZGU7CisgICAgfQorICAgIGlmICghdGhpcy5fY2xvc2lu Z0NvbW1lbnQpIHsKKyAgICAgIHZhciBvcGVuaW5nQ29tbWVudCA9IFJlYWN0RE9NQ29tcG9uZW50 VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKHRoaXMpOworICAgICAgdmFyIG5vZGUgPSBvcGVuaW5n Q29tbWVudC5uZXh0U2libGluZzsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICEobm9k ZSAhPSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZh cmlhbnQoZmFsc2UsICdNaXNzaW5nIGNsb3NpbmcgY29tbWVudCBmb3IgdGV4dCBjb21wb25lbnQg JXMnLCB0aGlzLl9kb21JRCkgOiBfcHJvZEludmFyaWFudCgnNjcnLCB0aGlzLl9kb21JRCkgOiB2 b2lkIDA7CisgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSA4ICYmIG5vZGUubm9kZVZhbHVl ID09PSAnIC9yZWFjdC10ZXh0ICcpIHsKKyAgICAgICAgICB0aGlzLl9jbG9zaW5nQ29tbWVudCA9 IG5vZGU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbm9kZSA9IG5vZGUu bmV4dFNpYmxpbmc7CisgICAgICB9CisgICAgfQorICAgIGhvc3ROb2RlID0gW3RoaXMuX2hvc3RO b2RlLCB0aGlzLl9jbG9zaW5nQ29tbWVudF07CisgICAgdGhpcy5fY29tbWVudE5vZGVzID0gaG9z dE5vZGU7CisgICAgcmV0dXJuIGhvc3ROb2RlOworICB9LAorCisgIHVubW91bnRDb21wb25lbnQ6 IGZ1bmN0aW9uICgpIHsKKyAgICB0aGlzLl9jbG9zaW5nQ29tbWVudCA9IG51bGw7CisgICAgdGhp cy5fY29tbWVudE5vZGVzID0gbnVsbDsKKyAgICBSZWFjdERPTUNvbXBvbmVudFRyZWUudW5jYWNo ZU5vZGUodGhpcyk7CisgIH0KKworfSk7CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RET01UZXh0 Q29tcG9uZW50OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9w Z2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdERPTVRleHRhcmVhLmpzIGIv d2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0RE9NVGV4dGFyZWEu anMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLmQ4NDQyNzIzCi0tLSAvZGV2 L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0 RE9NVGV4dGFyZWEuanMKQEAgLTAsMCArMSwxNTkgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMt cHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog VGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2Ug Zm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRo aXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMg Y2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5Lgor ICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUo Jy4vcmVhY3RQcm9kSW52YXJpYW50JyksCisgICAgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1h c3NpZ24nKTsKKwordmFyIExpbmtlZFZhbHVlVXRpbHMgPSByZXF1aXJlKCcuL0xpbmtlZFZhbHVl VXRpbHMnKTsKK3ZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9N Q29tcG9uZW50VHJlZScpOwordmFyIFJlYWN0VXBkYXRlcyA9IHJlcXVpcmUoJy4vUmVhY3RVcGRh dGVzJyk7CisKK3ZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTsK K3ZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpOworCit2YXIgZGlkV2Fy blZhbHVlTGluayA9IGZhbHNlOwordmFyIGRpZFdhcm5WYWxEZWZhdWx0VmFsID0gZmFsc2U7CisK K2Z1bmN0aW9uIGZvcmNlVXBkYXRlSWZNb3VudGVkKCkgeworICBpZiAodGhpcy5fcm9vdE5vZGVJ RCkgeworICAgIC8vIERPTSBjb21wb25lbnQgaXMgc3RpbGwgbW91bnRlZDsgdXBkYXRlCisgICAg UmVhY3RET01UZXh0YXJlYS51cGRhdGVXcmFwcGVyKHRoaXMpOworICB9Cit9CisKKy8qKgorICog SW1wbGVtZW50cyBhIDx0ZXh0YXJlYT4gaG9zdCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgc2V0dGlu ZyBgdmFsdWVgLCBhbmQKKyAqIGBkZWZhdWx0VmFsdWVgLiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUg dHJhZGl0aW9uYWwgRE9NIEFQSSBiZWNhdXNlIHZhbHVlIGlzCisgKiB1c3VhbGx5IHNldCBhcyBQ Q0RBVEEgY2hpbGRyZW4uCisgKgorICogSWYgYHZhbHVlYCBpcyBub3Qgc3VwcGxpZWQgKG9yIG51 bGwvdW5kZWZpbmVkKSwgdXNlciBhY3Rpb25zIHRoYXQgYWZmZWN0IHRoZQorICogdmFsdWUgd2ls bCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuCisgKgorICogSWYgYHZhbHVlYCBpcyBz dXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBlbGVtZW50IHdp bGwKKyAqIG5vdCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuIEluc3RlYWQsIHRoZSBg dmFsdWVgIHByb3AgbXVzdCBjaGFuZ2UgaW4KKyAqIG9yZGVyIGZvciB0aGUgcmVuZGVyZWQgZWxl bWVudCB0byBiZSB1cGRhdGVkLgorICoKKyAqIFRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGwgYmUg aW5pdGlhbGl6ZWQgd2l0aCBhbiBlbXB0eSB2YWx1ZSwgdGhlIHByb3AKKyAqIGBkZWZhdWx0VmFs dWVgIGlmIHNwZWNpZmllZCwgb3IgdGhlIGNoaWxkcmVuIGNvbnRlbnQgKGRlcHJlY2F0ZWQpLgor ICovCit2YXIgUmVhY3RET01UZXh0YXJlYSA9IHsKKyAgZ2V0SG9zdFByb3BzOiBmdW5jdGlvbiAo aW5zdCwgcHJvcHMpIHsKKyAgICAhKHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MID09IG51 bGwpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChm YWxzZSwgJ2BkYW5nZXJvdXNseVNldElubmVySFRNTGAgZG9lcyBub3QgbWFrZSBzZW5zZSBvbiA8 dGV4dGFyZWE+LicpIDogX3Byb2RJbnZhcmlhbnQoJzkxJykgOiB2b2lkIDA7CisKKyAgICAvLyBB bHdheXMgc2V0IGNoaWxkcmVuIHRvIHRoZSBzYW1lIHRoaW5nLiBJbiBJRTksIHRoZSBzZWxlY3Rp b24gcmFuZ2Ugd2lsbAorICAgIC8vIGdldCByZXNldCBpZiBgdGV4dENvbnRlbnRgIGlzIG11dGF0 ZWQuICBXZSBjb3VsZCBhZGQgYSBjaGVjayBpbiBzZXRUZXh0Q29udGVudAorICAgIC8vIHRvIG9u bHkgc2V0IHRoZSB2YWx1ZSBpZi93aGVuIHRoZSB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIG5vZGUg dmFsdWUgKHdoaWNoIHdvdWxkCisgICAgLy8gY29tcGxldGVseSBzb2x2ZSB0aGlzIElFOSBidWcp LCBidXQgU2ViYXN0aWFuK0JlbiBzZWVtZWQgdG8gbGlrZSB0aGlzIHNvbHV0aW9uLgorICAgIC8v IFRoZSB2YWx1ZSBjYW4gYmUgYSBib29sZWFuIG9yIG9iamVjdCBzbyB0aGF0J3Mgd2h5IGl0J3Mg Zm9yY2VkIHRvIGJlIGEgc3RyaW5nLgorICAgIHZhciBob3N0UHJvcHMgPSBfYXNzaWduKHt9LCBw cm9wcywgeworICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKKyAgICAgIGRlZmF1bHRWYWx1ZTogdW5k ZWZpbmVkLAorICAgICAgY2hpbGRyZW46ICcnICsgaW5zdC5fd3JhcHBlclN0YXRlLmluaXRpYWxW YWx1ZSwKKyAgICAgIG9uQ2hhbmdlOiBpbnN0Ll93cmFwcGVyU3RhdGUub25DaGFuZ2UKKyAgICB9 KTsKKworICAgIHJldHVybiBob3N0UHJvcHM7CisgIH0sCisKKyAgbW91bnRXcmFwcGVyOiBmdW5j dGlvbiAoaW5zdCwgcHJvcHMpIHsKKyAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdw cm9kdWN0aW9uJykgeworICAgICAgTGlua2VkVmFsdWVVdGlscy5jaGVja1Byb3BUeXBlcygndGV4 dGFyZWEnLCBwcm9wcywgaW5zdC5fY3VycmVudEVsZW1lbnQuX293bmVyKTsKKyAgICAgIGlmIChw cm9wcy52YWx1ZUxpbmsgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbHVlTGluaykgeworICAg ICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxz ZSwgJ2B2YWx1ZUxpbmtgIHByb3Agb24gYHRleHRhcmVhYCBpcyBkZXByZWNhdGVkOyBzZXQgYHZh bHVlYCBhbmQgYG9uQ2hhbmdlYCBpbnN0ZWFkLicpIDogdm9pZCAwOworICAgICAgICBkaWRXYXJu VmFsdWVMaW5rID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGlmIChwcm9wcy52YWx1ZSAhPT0gdW5k ZWZpbmVkICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFs RGVmYXVsdFZhbCkgeworICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rp b24nID8gd2FybmluZyhmYWxzZSwgJ1RleHRhcmVhIGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNv bnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBw cm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRl IGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCB0ZXh0YXJlYSAnICsg J2FuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9m Yi5tZS9yZWFjdC1jb250cm9sbGVkLWNvbXBvbmVudHMnKSA6IHZvaWQgMDsKKyAgICAgICAgZGlk V2FyblZhbERlZmF1bHRWYWwgPSB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIHZhciB2YWx1 ZSA9IExpbmtlZFZhbHVlVXRpbHMuZ2V0VmFsdWUocHJvcHMpOworICAgIHZhciBpbml0aWFsVmFs dWUgPSB2YWx1ZTsKKworICAgIC8vIE9ubHkgYm90aGVyIGZldGNoaW5nIGRlZmF1bHQgdmFsdWUg aWYgd2UncmUgZ29pbmcgdG8gdXNlIGl0CisgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAg IHZhciBkZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWU7CisgICAgICAvLyBUT0RPICh5 dW5nc3RlcnMpOiBSZW1vdmUgc3VwcG9ydCBmb3IgY2hpbGRyZW4gY29udGVudCBpbiA8dGV4dGFy ZWE+LgorICAgICAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW47CisgICAgICBpZiAoY2hp bGRyZW4gIT0gbnVsbCkgeworICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdw cm9kdWN0aW9uJykgeworICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVj dGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnVXNlIHRoZSBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVg IHByb3BzIGluc3RlYWQgb2Ygc2V0dGluZyAnICsgJ2NoaWxkcmVuIG9uIDx0ZXh0YXJlYT4uJykg OiB2b2lkIDA7CisgICAgICAgIH0KKyAgICAgICAgIShkZWZhdWx0VmFsdWUgPT0gbnVsbCkgPyBw cm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAn SWYgeW91IHN1cHBseSBgZGVmYXVsdFZhbHVlYCBvbiBhIDx0ZXh0YXJlYT4sIGRvIG5vdCBwYXNz IGNoaWxkcmVuLicpIDogX3Byb2RJbnZhcmlhbnQoJzkyJykgOiB2b2lkIDA7CisgICAgICAgIGlm IChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgeworICAgICAgICAgICEoY2hpbGRyZW4ubGVuZ3Ro IDw9IDEpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFu dChmYWxzZSwgJzx0ZXh0YXJlYT4gY2FuIG9ubHkgaGF2ZSBhdCBtb3N0IG9uZSBjaGlsZC4nKSA6 IF9wcm9kSW52YXJpYW50KCc5MycpIDogdm9pZCAwOworICAgICAgICAgIGNoaWxkcmVuID0gY2hp bGRyZW5bMF07CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0VmFsdWUgPSAnJyArIGNoaWxk cmVuOworICAgICAgfQorICAgICAgaWYgKGRlZmF1bHRWYWx1ZSA9PSBudWxsKSB7CisgICAgICAg IGRlZmF1bHRWYWx1ZSA9ICcnOworICAgICAgfQorICAgICAgaW5pdGlhbFZhbHVlID0gZGVmYXVs dFZhbHVlOworICAgIH0KKworICAgIGluc3QuX3dyYXBwZXJTdGF0ZSA9IHsKKyAgICAgIGluaXRp YWxWYWx1ZTogJycgKyBpbml0aWFsVmFsdWUsCisgICAgICBsaXN0ZW5lcnM6IG51bGwsCisgICAg ICBvbkNoYW5nZTogX2hhbmRsZUNoYW5nZS5iaW5kKGluc3QpCisgICAgfTsKKyAgfSwKKworICB1 cGRhdGVXcmFwcGVyOiBmdW5jdGlvbiAoaW5zdCkgeworICAgIHZhciBwcm9wcyA9IGluc3QuX2N1 cnJlbnRFbGVtZW50LnByb3BzOworCisgICAgdmFyIG5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRy ZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KTsKKyAgICB2YXIgdmFsdWUgPSBMaW5rZWRWYWx1 ZVV0aWxzLmdldFZhbHVlKHByb3BzKTsKKyAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAg Ly8gQ2FzdCBgdmFsdWVgIHRvIGEgc3RyaW5nIHRvIGVuc3VyZSB0aGUgdmFsdWUgaXMgc2V0IGNv cnJlY3RseS4gV2hpbGUKKyAgICAgIC8vIGJyb3dzZXJzIHR5cGljYWxseSBkbyB0aGlzIGFzIG5l Y2Vzc2FyeSwganNkb20gZG9lc24ndC4KKyAgICAgIHZhciBuZXdWYWx1ZSA9ICcnICsgdmFsdWU7 CisKKyAgICAgIC8vIFRvIGF2b2lkIHNpZGUgZWZmZWN0cyAoc3VjaCBhcyBsb3NpbmcgdGV4dCBz ZWxlY3Rpb24pLCBvbmx5IHNldCB2YWx1ZSBpZiBjaGFuZ2VkCisgICAgICBpZiAobmV3VmFsdWUg IT09IG5vZGUudmFsdWUpIHsKKyAgICAgICAgbm9kZS52YWx1ZSA9IG5ld1ZhbHVlOworICAgICAg fQorICAgICAgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSA9PSBudWxsKSB7CisgICAgICAgIG5vZGUu ZGVmYXVsdFZhbHVlID0gbmV3VmFsdWU7CisgICAgICB9CisgICAgfQorICAgIGlmIChwcm9wcy5k ZWZhdWx0VmFsdWUgIT0gbnVsbCkgeworICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSBwcm9wcy5k ZWZhdWx0VmFsdWU7CisgICAgfQorICB9LAorCisgIHBvc3RNb3VudFdyYXBwZXI6IGZ1bmN0aW9u IChpbnN0KSB7CisgICAgLy8gVGhpcyBpcyBpbiBwb3N0TW91bnQgYmVjYXVzZSB3ZSBuZWVkIGFj Y2VzcyB0byB0aGUgRE9NIG5vZGUsIHdoaWNoIGlzIG5vdAorICAgIC8vIGF2YWlsYWJsZSB1bnRp bCBhZnRlciB0aGUgY29tcG9uZW50IGhhcyBtb3VudGVkLgorICAgIHZhciBub2RlID0gUmVhY3RE T01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCk7CisgICAgdmFyIHRleHRD b250ZW50ID0gbm9kZS50ZXh0Q29udGVudDsKKworICAgIC8vIE9ubHkgc2V0IG5vZGUudmFsdWUg aWYgdGV4dENvbnRlbnQgaXMgZXF1YWwgdG8gdGhlIGV4cGVjdGVkCisgICAgLy8gaW5pdGlhbCB2 YWx1ZS4gSW4gSUUxMC9JRTExIHRoZXJlIGlzIGEgYnVnIHdoZXJlIHRoZSBwbGFjZWhvbGRlciBh dHRyaWJ1dGUKKyAgICAvLyB3aWxsIHBvcHVsYXRlIHRleHRDb250ZW50IGFzIHdlbGwuCisgICAg Ly8gaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9taWNyb3NvZnQtZWRnZS9wbGF0Zm9y bS9pc3N1ZXMvMTAxNTI1LworICAgIGlmICh0ZXh0Q29udGVudCA9PT0gaW5zdC5fd3JhcHBlclN0 YXRlLmluaXRpYWxWYWx1ZSkgeworICAgICAgbm9kZS52YWx1ZSA9IHRleHRDb250ZW50OworICAg IH0KKyAgfQorfTsKKworZnVuY3Rpb24gX2hhbmRsZUNoYW5nZShldmVudCkgeworICB2YXIgcHJv cHMgPSB0aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wczsKKyAgdmFyIHJldHVyblZhbHVlID0gTGlu a2VkVmFsdWVVdGlscy5leGVjdXRlT25DaGFuZ2UocHJvcHMsIGV2ZW50KTsKKyAgUmVhY3RVcGRh dGVzLmFzYXAoZm9yY2VVcGRhdGVJZk1vdW50ZWQsIHRoaXMpOworICByZXR1cm4gcmV0dXJuVmFs dWU7Cit9CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RET01UZXh0YXJlYTsKXCBObyBuZXdsaW5l IGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3Jl YWN0LWRvbS9saWIvUmVhY3RET01UcmVlVHJhdmVyc2FsLmpzIGIvd2ViL3BnYWRtaW4vc3RhdGlj L3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0RE9NVHJlZVRyYXZlcnNhbC5qcwpuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uZDliZGVmM2YKLS0tIC9kZXYvbnVsbAorKysgYi93 ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RET01UcmVlVHJhdmVy c2FsLmpzCkBAIC0wLDAgKzEsMTM1IEBACisvKioKKyAqIENvcHlyaWdodCAyMDE1LXByZXNlbnQs IEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291 cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGlu IHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJj ZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBm b3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8K KworJ3VzZSBzdHJpY3QnOworCit2YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0 UHJvZEludmFyaWFudCcpOworCit2YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52 YXJpYW50Jyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBsb3dlc3QgY29tbW9uIGFuY2VzdG9yIG9m IEEgYW5kIEIsIG9yIG51bGwgaWYgdGhleSBhcmUgaW4KKyAqIGRpZmZlcmVudCB0cmVlcy4KKyAq LworZnVuY3Rpb24gZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoaW5zdEEsIGluc3RCKSB7CisgICEo J19ob3N0Tm9kZScgaW4gaW5zdEEpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0 aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2dldE5vZGVGcm9tSW5zdGFuY2U6IEludmFsaWQgYXJn dW1lbnQuJykgOiBfcHJvZEludmFyaWFudCgnMzMnKSA6IHZvaWQgMDsKKyAgISgnX2hvc3ROb2Rl JyBpbiBpbnN0QikgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52 YXJpYW50KGZhbHNlLCAnZ2V0Tm9kZUZyb21JbnN0YW5jZTogSW52YWxpZCBhcmd1bWVudC4nKSA6 IF9wcm9kSW52YXJpYW50KCczMycpIDogdm9pZCAwOworCisgIHZhciBkZXB0aEEgPSAwOworICBm b3IgKHZhciB0ZW1wQSA9IGluc3RBOyB0ZW1wQTsgdGVtcEEgPSB0ZW1wQS5faG9zdFBhcmVudCkg eworICAgIGRlcHRoQSsrOworICB9CisgIHZhciBkZXB0aEIgPSAwOworICBmb3IgKHZhciB0ZW1w QiA9IGluc3RCOyB0ZW1wQjsgdGVtcEIgPSB0ZW1wQi5faG9zdFBhcmVudCkgeworICAgIGRlcHRo QisrOworICB9CisKKyAgLy8gSWYgQSBpcyBkZWVwZXIsIGNyYXdsIHVwLgorICB3aGlsZSAoZGVw dGhBIC0gZGVwdGhCID4gMCkgeworICAgIGluc3RBID0gaW5zdEEuX2hvc3RQYXJlbnQ7CisgICAg ZGVwdGhBLS07CisgIH0KKworICAvLyBJZiBCIGlzIGRlZXBlciwgY3Jhd2wgdXAuCisgIHdoaWxl IChkZXB0aEIgLSBkZXB0aEEgPiAwKSB7CisgICAgaW5zdEIgPSBpbnN0Qi5faG9zdFBhcmVudDsK KyAgICBkZXB0aEItLTsKKyAgfQorCisgIC8vIFdhbGsgaW4gbG9ja3N0ZXAgdW50aWwgd2UgZmlu ZCBhIG1hdGNoLgorICB2YXIgZGVwdGggPSBkZXB0aEE7CisgIHdoaWxlIChkZXB0aC0tKSB7Cisg ICAgaWYgKGluc3RBID09PSBpbnN0QikgeworICAgICAgcmV0dXJuIGluc3RBOworICAgIH0KKyAg ICBpbnN0QSA9IGluc3RBLl9ob3N0UGFyZW50OworICAgIGluc3RCID0gaW5zdEIuX2hvc3RQYXJl bnQ7CisgIH0KKyAgcmV0dXJuIG51bGw7Cit9CisKKy8qKgorICogUmV0dXJuIGlmIEEgaXMgYW4g YW5jZXN0b3Igb2YgQi4KKyAqLworZnVuY3Rpb24gaXNBbmNlc3RvcihpbnN0QSwgaW5zdEIpIHsK KyAgISgnX2hvc3ROb2RlJyBpbiBpbnN0QSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3By b2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnaXNBbmNlc3RvcjogSW52YWxpZCBhcmd1bWVu dC4nKSA6IF9wcm9kSW52YXJpYW50KCczNScpIDogdm9pZCAwOworICAhKCdfaG9zdE5vZGUnIGlu IGluc3RCKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlh bnQoZmFsc2UsICdpc0FuY2VzdG9yOiBJbnZhbGlkIGFyZ3VtZW50LicpIDogX3Byb2RJbnZhcmlh bnQoJzM1JykgOiB2b2lkIDA7CisKKyAgd2hpbGUgKGluc3RCKSB7CisgICAgaWYgKGluc3RCID09 PSBpbnN0QSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGluc3RCID0gaW5zdEIu X2hvc3RQYXJlbnQ7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIFJldHVybiB0 aGUgcGFyZW50IGluc3RhbmNlIG9mIHRoZSBwYXNzZWQtaW4gaW5zdGFuY2UuCisgKi8KK2Z1bmN0 aW9uIGdldFBhcmVudEluc3RhbmNlKGluc3QpIHsKKyAgISgnX2hvc3ROb2RlJyBpbiBpbnN0KSA/ IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2Us ICdnZXRQYXJlbnRJbnN0YW5jZTogSW52YWxpZCBhcmd1bWVudC4nKSA6IF9wcm9kSW52YXJpYW50 KCczNicpIDogdm9pZCAwOworCisgIHJldHVybiBpbnN0Ll9ob3N0UGFyZW50OworfQorCisvKioK KyAqIFNpbXVsYXRlcyB0aGUgdHJhdmVyc2FsIG9mIGEgdHdvLXBoYXNlLCBjYXB0dXJlL2J1YmJs ZSBldmVudCBkaXNwYXRjaC4KKyAqLworZnVuY3Rpb24gdHJhdmVyc2VUd29QaGFzZShpbnN0LCBm biwgYXJnKSB7CisgIHZhciBwYXRoID0gW107CisgIHdoaWxlIChpbnN0KSB7CisgICAgcGF0aC5w dXNoKGluc3QpOworICAgIGluc3QgPSBpbnN0Ll9ob3N0UGFyZW50OworICB9CisgIHZhciBpOwor ICBmb3IgKGkgPSBwYXRoLmxlbmd0aDsgaS0tID4gMDspIHsKKyAgICBmbihwYXRoW2ldLCAnY2Fw dHVyZWQnLCBhcmcpOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7 CisgICAgZm4ocGF0aFtpXSwgJ2J1YmJsZWQnLCBhcmcpOworICB9Cit9CisKKy8qKgorICogVHJh dmVyc2VzIHRoZSBJRCBoaWVyYXJjaHkgYW5kIGludm9rZXMgdGhlIHN1cHBsaWVkIGBjYmAgb24g YW55IElEcyB0aGF0CisgKiBzaG91bGQgd291bGQgcmVjZWl2ZSBhIGBtb3VzZUVudGVyYCBvciBg bW91c2VMZWF2ZWAgZXZlbnQuCisgKgorICogRG9lcyBub3QgaW52b2tlIHRoZSBjYWxsYmFjayBv biB0aGUgbmVhcmVzdCBjb21tb24gYW5jZXN0b3IgYmVjYXVzZSBub3RoaW5nCisgKiAiZW50ZXJl ZCIgb3IgImxlZnQiIHRoYXQgZWxlbWVudC4KKyAqLworZnVuY3Rpb24gdHJhdmVyc2VFbnRlckxl YXZlKGZyb20sIHRvLCBmbiwgYXJnRnJvbSwgYXJnVG8pIHsKKyAgdmFyIGNvbW1vbiA9IGZyb20g JiYgdG8gPyBnZXRMb3dlc3RDb21tb25BbmNlc3Rvcihmcm9tLCB0bykgOiBudWxsOworICB2YXIg cGF0aEZyb20gPSBbXTsKKyAgd2hpbGUgKGZyb20gJiYgZnJvbSAhPT0gY29tbW9uKSB7CisgICAg cGF0aEZyb20ucHVzaChmcm9tKTsKKyAgICBmcm9tID0gZnJvbS5faG9zdFBhcmVudDsKKyAgfQor ICB2YXIgcGF0aFRvID0gW107CisgIHdoaWxlICh0byAmJiB0byAhPT0gY29tbW9uKSB7CisgICAg cGF0aFRvLnB1c2godG8pOworICAgIHRvID0gdG8uX2hvc3RQYXJlbnQ7CisgIH0KKyAgdmFyIGk7 CisgIGZvciAoaSA9IDA7IGkgPCBwYXRoRnJvbS5sZW5ndGg7IGkrKykgeworICAgIGZuKHBhdGhG cm9tW2ldLCAnYnViYmxlZCcsIGFyZ0Zyb20pOworICB9CisgIGZvciAoaSA9IHBhdGhUby5sZW5n dGg7IGktLSA+IDA7KSB7CisgICAgZm4ocGF0aFRvW2ldLCAnY2FwdHVyZWQnLCBhcmdUbyk7Cisg IH0KK30KKworbW9kdWxlLmV4cG9ydHMgPSB7CisgIGlzQW5jZXN0b3I6IGlzQW5jZXN0b3IsCisg IGdldExvd2VzdENvbW1vbkFuY2VzdG9yOiBnZXRMb3dlc3RDb21tb25BbmNlc3RvciwKKyAgZ2V0 UGFyZW50SW5zdGFuY2U6IGdldFBhcmVudEluc3RhbmNlLAorICB0cmF2ZXJzZVR3b1BoYXNlOiB0 cmF2ZXJzZVR3b1BoYXNlLAorICB0cmF2ZXJzZUVudGVyTGVhdmU6IHRyYXZlcnNlRW50ZXJMZWF2 ZQorfTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1p bi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RET01VTURFbnRyeS5qcyBiL3dlYi9w Z2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdERPTVVNREVudHJ5LmpzCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi5iYTNhMTA3ZQotLS0gL2Rldi9udWxs CisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdERPTVVN REVudHJ5LmpzCkBAIC0wLDAgKzEsMzMgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2Vu dCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBz b3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQg aW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291 cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJl IGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAq LworCisndXNlIHN0cmljdCc7CisKK3ZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFj dCcpOwordmFyIFJlYWN0RE9NID0gcmVxdWlyZSgnLi9SZWFjdERPTScpOworCit2YXIgUmVhY3RE T01VTURFbnRyeSA9IFJlYWN0RE9NOworCitpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdw cm9kdWN0aW9uJykgeworICBSZWFjdERPTVVNREVudHJ5Ll9fU0VDUkVUX0lOVEVSTkFMU19ET19O T1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEID0geworICAgIC8vIFJlYWN0UGVyZiBhbmQgUmVh Y3RUZXN0VXRpbHMgY3VycmVudGx5IG9ubHkgd29yayB3aXRoIHRoZSBET00gcmVuZGVyZXIKKyAg ICAvLyBzbyB3ZSBleHBvc2UgdGhlbSBmcm9tIGhlcmUsIGJ1dCBvbmx5IGluIERFViBtb2RlLgor ICAgIFJlYWN0UGVyZjogcmVxdWlyZSgnLi9SZWFjdFBlcmYnKSwKKyAgICBSZWFjdFRlc3RVdGls czogcmVxdWlyZSgnLi9SZWFjdFRlc3RVdGlscycpCisgIH07Cit9CisKKy8vIEluamVjdCBSZWFj dERPTSBpbnRvIFJlYWN0IGZvciB0aGUgYWRkb25zIFVNRCBidWlsZCB0aGF0IGRlcGVuZHMgb24g UmVhY3RET00gKFRyYW5zaXRpb25Hcm91cCkuCisvLyBXZSBjYW4gcmVtb3ZlIHRoaXMgYWZ0ZXIg d2UgZGVwcmVjYXRlIGFuZCByZW1vdmUgdGhlIGFkZG9ucyBVTUQgYnVpbGQuCitpZiAoUmVhY3Qu YWRkb25zKSB7CisgIFJlYWN0Ll9fU0VDUkVUX0lOSkVDVEVEX1JFQUNUX0RPTV9ET19OT1RfVVNF X09SX1lPVV9XSUxMX0JFX0ZJUkVEID0gUmVhY3RET01VTURFbnRyeTsKK30KKworbW9kdWxlLmV4 cG9ydHMgPSBSZWFjdERPTVVNREVudHJ5OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlm ZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdERP TVVua25vd25Qcm9wZXJ0eUhvb2suanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0 LWRvbS9saWIvUmVhY3RET01Vbmtub3duUHJvcGVydHlIb29rLmpzCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAwLi5hYjZhOTE0ZgotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2Fk bWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdERPTVVua25vd25Qcm9wZXJ0eUhv b2suanMKQEAgLTAsMCArMSwxMTEgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwg RmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3Vy Y2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4g dGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNl IHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZv dW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLwor CisndXNlIHN0cmljdCc7CisKK3ZhciBET01Qcm9wZXJ0eSA9IHJlcXVpcmUoJy4vRE9NUHJvcGVy dHknKTsKK3ZhciBFdmVudFBsdWdpblJlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpblJl Z2lzdHJ5Jyk7Cit2YXIgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHJlcXVpcmUoJ3JlYWN0L2xp Yi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7CisKK3ZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJq cy9saWIvd2FybmluZycpOworCitpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0 aW9uJykgeworICB2YXIgcmVhY3RQcm9wcyA9IHsKKyAgICBjaGlsZHJlbjogdHJ1ZSwKKyAgICBk YW5nZXJvdXNseVNldElubmVySFRNTDogdHJ1ZSwKKyAgICBrZXk6IHRydWUsCisgICAgcmVmOiB0 cnVlLAorCisgICAgYXV0b0ZvY3VzOiB0cnVlLAorICAgIGRlZmF1bHRWYWx1ZTogdHJ1ZSwKKyAg ICB2YWx1ZUxpbms6IHRydWUsCisgICAgZGVmYXVsdENoZWNrZWQ6IHRydWUsCisgICAgY2hlY2tl ZExpbms6IHRydWUsCisgICAgaW5uZXJIVE1MOiB0cnVlLAorICAgIHN1cHByZXNzQ29udGVudEVk aXRhYmxlV2FybmluZzogdHJ1ZSwKKyAgICBvbkZvY3VzSW46IHRydWUsCisgICAgb25Gb2N1c091 dDogdHJ1ZQorICB9OworICB2YXIgd2FybmVkUHJvcGVydGllcyA9IHt9OworCisgIHZhciB2YWxp ZGF0ZVByb3BlcnR5ID0gZnVuY3Rpb24gKHRhZ05hbWUsIG5hbWUsIGRlYnVnSUQpIHsKKyAgICBp ZiAoRE9NUHJvcGVydHkucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSB8fCBET01Qcm9w ZXJ0eS5pc0N1c3RvbUF0dHJpYnV0ZShuYW1lKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAg fQorICAgIGlmIChyZWFjdFByb3BzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHJlYWN0UHJvcHNb bmFtZV0gfHwgd2FybmVkUHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiB3YXJuZWRQ cm9wZXJ0aWVzW25hbWVdKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKEV2 ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMuaGFzT3duUHJvcGVydHko bmFtZSkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB3YXJuZWRQcm9wZXJ0aWVz W25hbWVdID0gdHJ1ZTsKKyAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNl KCk7CisKKyAgICAvLyBkYXRhLSogYXR0cmlidXRlcyBzaG91bGQgYmUgbG93ZXJjYXNlOyBzdWdn ZXN0IHRoZSBsb3dlcmNhc2UgdmVyc2lvbgorICAgIHZhciBzdGFuZGFyZE5hbWUgPSBET01Qcm9w ZXJ0eS5pc0N1c3RvbUF0dHJpYnV0ZShsb3dlckNhc2VkTmFtZSkgPyBsb3dlckNhc2VkTmFtZSA6 IERPTVByb3BlcnR5LmdldFBvc3NpYmxlU3RhbmRhcmROYW1lLmhhc093blByb3BlcnR5KGxvd2Vy Q2FzZWROYW1lKSA/IERPTVByb3BlcnR5LmdldFBvc3NpYmxlU3RhbmRhcmROYW1lW2xvd2VyQ2Fz ZWROYW1lXSA6IG51bGw7CisKKyAgICB2YXIgcmVnaXN0cmF0aW9uTmFtZSA9IEV2ZW50UGx1Z2lu UmVnaXN0cnkucG9zc2libGVSZWdpc3RyYXRpb25OYW1lcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNh c2VkTmFtZSkgPyBFdmVudFBsdWdpblJlZ2lzdHJ5LnBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXNb bG93ZXJDYXNlZE5hbWVdIDogbnVsbDsKKworICAgIGlmIChzdGFuZGFyZE5hbWUgIT0gbnVsbCkg eworICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmco ZmFsc2UsICdVbmtub3duIERPTSBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuICVzPyVzJywgbmFt ZSwgc3RhbmRhcmROYW1lLCBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1C eUlEKGRlYnVnSUQpKSA6IHZvaWQgMDsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBp ZiAocmVnaXN0cmF0aW9uTmFtZSAhPSBudWxsKSB7CisgICAgICBwcm9jZXNzLmVudi5OT0RFX0VO ViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1Vua25vd24gZXZlbnQgaGFuZGxl ciBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuIGAlc2A/JXMnLCBuYW1lLCByZWdpc3RyYXRpb25O YW1lLCBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKGRlYnVnSUQp KSA6IHZvaWQgMDsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAvLyBX ZSB3ZXJlIHVuYWJsZSB0byBndWVzcyB3aGljaCBwcm9wIHRoZSB1c2VyIGludGVuZGVkLgorICAg ICAgLy8gSXQgaXMgbGlrZWx5IHRoYXQgdGhlIHVzZXIgd2FzIGp1c3QgYmxpbmRseSBzcHJlYWRp bmcvZm9yd2FyZGluZyBwcm9wcworICAgICAgLy8gQ29tcG9uZW50cyBzaG91bGQgYmUgY2FyZWZ1 bCB0byBvbmx5IHJlbmRlciB2YWxpZCBwcm9wcy9hdHRyaWJ1dGVzLgorICAgICAgLy8gV2Fybmlu ZyB3aWxsIGJlIGludm9rZWQgaW4gd2FyblVua25vd25Qcm9wZXJ0aWVzIHRvIGFsbG93IGdyb3Vw aW5nLgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfTsKK30KKwordmFyIHdhcm5Vbmtu b3duUHJvcGVydGllcyA9IGZ1bmN0aW9uIChkZWJ1Z0lELCBlbGVtZW50KSB7CisgIHZhciB1bmtu b3duUHJvcHMgPSBbXTsKKyAgZm9yICh2YXIga2V5IGluIGVsZW1lbnQucHJvcHMpIHsKKyAgICB2 YXIgaXNWYWxpZCA9IHZhbGlkYXRlUHJvcGVydHkoZWxlbWVudC50eXBlLCBrZXksIGRlYnVnSUQp OworICAgIGlmICghaXNWYWxpZCkgeworICAgICAgdW5rbm93blByb3BzLnB1c2goa2V5KTsKKyAg ICB9CisgIH0KKworICB2YXIgdW5rbm93blByb3BTdHJpbmcgPSB1bmtub3duUHJvcHMubWFwKGZ1 bmN0aW9uIChwcm9wKSB7CisgICAgcmV0dXJuICdgJyArIHByb3AgKyAnYCc7CisgIH0pLmpvaW4o JywgJyk7CisKKyAgaWYgKHVua25vd25Qcm9wcy5sZW5ndGggPT09IDEpIHsKKyAgICBwcm9jZXNz LmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1Vua25vd24g cHJvcCAlcyBvbiA8JXM+IHRhZy4gUmVtb3ZlIHRoaXMgcHJvcCBmcm9tIHRoZSBlbGVtZW50LiAn ICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9mYi5tZS9yZWFjdC11bmtub3duLXByb3Alcycs IHVua25vd25Qcm9wU3RyaW5nLCBlbGVtZW50LnR5cGUsIFJlYWN0Q29tcG9uZW50VHJlZUhvb2su Z2V0U3RhY2tBZGRlbmR1bUJ5SUQoZGVidWdJRCkpIDogdm9pZCAwOworICB9IGVsc2UgaWYgKHVu a25vd25Qcm9wcy5sZW5ndGggPiAxKSB7CisgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdw cm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdVbmtub3duIHByb3BzICVzIG9uIDwlcz4gdGFn LiBSZW1vdmUgdGhlc2UgcHJvcHMgZnJvbSB0aGUgZWxlbWVudC4gJyArICdGb3IgZGV0YWlscywg c2VlIGh0dHBzOi8vZmIubWUvcmVhY3QtdW5rbm93bi1wcm9wJXMnLCB1bmtub3duUHJvcFN0cmlu ZywgZWxlbWVudC50eXBlLCBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1C eUlEKGRlYnVnSUQpKSA6IHZvaWQgMDsKKyAgfQorfTsKKworZnVuY3Rpb24gaGFuZGxlRWxlbWVu dChkZWJ1Z0lELCBlbGVtZW50KSB7CisgIGlmIChlbGVtZW50ID09IG51bGwgfHwgdHlwZW9mIGVs ZW1lbnQudHlwZSAhPT0gJ3N0cmluZycpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGVsZW1l bnQudHlwZS5pbmRleE9mKCctJykgPj0gMCB8fCBlbGVtZW50LnByb3BzLmlzKSB7CisgICAgcmV0 dXJuOworICB9CisgIHdhcm5Vbmtub3duUHJvcGVydGllcyhkZWJ1Z0lELCBlbGVtZW50KTsKK30K KwordmFyIFJlYWN0RE9NVW5rbm93blByb3BlcnR5SG9vayA9IHsKKyAgb25CZWZvcmVNb3VudENv bXBvbmVudDogZnVuY3Rpb24gKGRlYnVnSUQsIGVsZW1lbnQpIHsKKyAgICBoYW5kbGVFbGVtZW50 KGRlYnVnSUQsIGVsZW1lbnQpOworICB9LAorICBvbkJlZm9yZVVwZGF0ZUNvbXBvbmVudDogZnVu Y3Rpb24gKGRlYnVnSUQsIGVsZW1lbnQpIHsKKyAgICBoYW5kbGVFbGVtZW50KGRlYnVnSUQsIGVs ZW1lbnQpOworICB9Cit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NVW5rbm93blByb3Bl cnR5SG9vazsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdh ZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3REZWJ1Z1Rvb2wuanMgYi93ZWIv cGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3REZWJ1Z1Rvb2wuanMKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjc0YTVkZjBhCi0tLSAvZGV2L251bGwK KysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0RGVidWdU b29sLmpzCkBAIC0wLDAgKzEsMzYwIEBACisvKioKKyAqIENvcHlyaWdodCAyMDE2LXByZXNlbnQs IEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291 cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGlu IHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJj ZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBm b3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiAK KyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBSZWFjdEludmFsaWRTZXRTdGF0ZVdhcm5pbmdI b29rID0gcmVxdWlyZSgnLi9SZWFjdEludmFsaWRTZXRTdGF0ZVdhcm5pbmdIb29rJyk7Cit2YXIg UmVhY3RIb3N0T3BlcmF0aW9uSGlzdG9yeUhvb2sgPSByZXF1aXJlKCcuL1JlYWN0SG9zdE9wZXJh dGlvbkhpc3RvcnlIb29rJyk7Cit2YXIgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHJlcXVpcmUo J3JlYWN0L2xpYi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7Cit2YXIgRXhlY3V0aW9uRW52aXJv bm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpOworCit2YXIg cGVyZm9ybWFuY2VOb3cgPSByZXF1aXJlKCdmYmpzL2xpYi9wZXJmb3JtYW5jZU5vdycpOwordmFy IHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7CisKK3ZhciBob29rcyA9IFtd OwordmFyIGRpZEhvb2tUaHJvd0ZvckV2ZW50ID0ge307CisKK2Z1bmN0aW9uIGNhbGxIb29rKGV2 ZW50LCBmbiwgY29udGV4dCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkgeworICB0cnkg eworICAgIGZuLmNhbGwoY29udGV4dCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7Cisg IH0gY2F0Y2ggKGUpIHsKKyAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24n ID8gd2FybmluZyhkaWRIb29rVGhyb3dGb3JFdmVudFtldmVudF0sICdFeGNlcHRpb24gdGhyb3du IGJ5IGhvb2sgd2hpbGUgaGFuZGxpbmcgJXM6ICVzJywgZXZlbnQsIGUgKyAnXG4nICsgZS5zdGFj aykgOiB2b2lkIDA7CisgICAgZGlkSG9va1Rocm93Rm9yRXZlbnRbZXZlbnRdID0gdHJ1ZTsKKyAg fQorfQorCitmdW5jdGlvbiBlbWl0RXZlbnQoZXZlbnQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQs IGFyZzUpIHsKKyAgZm9yICh2YXIgaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7IGkrKykgeworICAg IHZhciBob29rID0gaG9va3NbaV07CisgICAgdmFyIGZuID0gaG9va1tldmVudF07CisgICAgaWYg KGZuKSB7CisgICAgICBjYWxsSG9vayhldmVudCwgZm4sIGhvb2ssIGFyZzEsIGFyZzIsIGFyZzMs IGFyZzQsIGFyZzUpOworICAgIH0KKyAgfQorfQorCit2YXIgaXNQcm9maWxpbmcgPSBmYWxzZTsK K3ZhciBmbHVzaEhpc3RvcnkgPSBbXTsKK3ZhciBsaWZlQ3ljbGVUaW1lclN0YWNrID0gW107Cit2 YXIgY3VycmVudEZsdXNoTmVzdGluZyA9IDA7Cit2YXIgY3VycmVudEZsdXNoTWVhc3VyZW1lbnRz ID0gW107Cit2YXIgY3VycmVudEZsdXNoU3RhcnRUaW1lID0gMDsKK3ZhciBjdXJyZW50VGltZXJE ZWJ1Z0lEID0gbnVsbDsKK3ZhciBjdXJyZW50VGltZXJTdGFydFRpbWUgPSAwOwordmFyIGN1cnJl bnRUaW1lck5lc3RlZEZsdXNoRHVyYXRpb24gPSAwOwordmFyIGN1cnJlbnRUaW1lclR5cGUgPSBu dWxsOworCit2YXIgbGlmZUN5Y2xlVGltZXJIYXNXYXJuZWQgPSBmYWxzZTsKKworZnVuY3Rpb24g Y2xlYXJIaXN0b3J5KCkgeworICBSZWFjdENvbXBvbmVudFRyZWVIb29rLnB1cmdlVW5tb3VudGVk Q29tcG9uZW50cygpOworICBSZWFjdEhvc3RPcGVyYXRpb25IaXN0b3J5SG9vay5jbGVhckhpc3Rv cnkoKTsKK30KKworZnVuY3Rpb24gZ2V0VHJlZVNuYXBzaG90KHJlZ2lzdGVyZWRJRHMpIHsKKyAg cmV0dXJuIHJlZ2lzdGVyZWRJRHMucmVkdWNlKGZ1bmN0aW9uICh0cmVlLCBpZCkgeworICAgIHZh ciBvd25lcklEID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRPd25lcklEKGlkKTsKKyAgICB2 YXIgcGFyZW50SUQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFBhcmVudElEKGlkKTsKKyAg ICB0cmVlW2lkXSA9IHsKKyAgICAgIGRpc3BsYXlOYW1lOiBSZWFjdENvbXBvbmVudFRyZWVIb29r LmdldERpc3BsYXlOYW1lKGlkKSwKKyAgICAgIHRleHQ6IFJlYWN0Q29tcG9uZW50VHJlZUhvb2su Z2V0VGV4dChpZCksCisgICAgICB1cGRhdGVDb3VudDogUmVhY3RDb21wb25lbnRUcmVlSG9vay5n ZXRVcGRhdGVDb3VudChpZCksCisgICAgICBjaGlsZElEczogUmVhY3RDb21wb25lbnRUcmVlSG9v ay5nZXRDaGlsZElEcyhpZCksCisgICAgICAvLyBUZXh0IG5vZGVzIGRvbid0IGhhdmUgb3duZXJz IGJ1dCB0aGlzIGlzIGNsb3NlIGVub3VnaC4KKyAgICAgIG93bmVySUQ6IG93bmVySUQgfHwgcGFy ZW50SUQgJiYgUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRPd25lcklEKHBhcmVudElEKSB8fCAw LAorICAgICAgcGFyZW50SUQ6IHBhcmVudElECisgICAgfTsKKyAgICByZXR1cm4gdHJlZTsKKyAg fSwge30pOworfQorCitmdW5jdGlvbiByZXNldE1lYXN1cmVtZW50cygpIHsKKyAgdmFyIHByZXZp b3VzU3RhcnRUaW1lID0gY3VycmVudEZsdXNoU3RhcnRUaW1lOworICB2YXIgcHJldmlvdXNNZWFz dXJlbWVudHMgPSBjdXJyZW50Rmx1c2hNZWFzdXJlbWVudHM7CisgIHZhciBwcmV2aW91c09wZXJh dGlvbnMgPSBSZWFjdEhvc3RPcGVyYXRpb25IaXN0b3J5SG9vay5nZXRIaXN0b3J5KCk7CisKKyAg aWYgKGN1cnJlbnRGbHVzaE5lc3RpbmcgPT09IDApIHsKKyAgICBjdXJyZW50Rmx1c2hTdGFydFRp bWUgPSAwOworICAgIGN1cnJlbnRGbHVzaE1lYXN1cmVtZW50cyA9IFtdOworICAgIGNsZWFySGlz dG9yeSgpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChwcmV2aW91c01lYXN1cmVtZW50cy5s ZW5ndGggfHwgcHJldmlvdXNPcGVyYXRpb25zLmxlbmd0aCkgeworICAgIHZhciByZWdpc3RlcmVk SURzID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRSZWdpc3RlcmVkSURzKCk7CisgICAgZmx1 c2hIaXN0b3J5LnB1c2goeworICAgICAgZHVyYXRpb246IHBlcmZvcm1hbmNlTm93KCkgLSBwcmV2 aW91c1N0YXJ0VGltZSwKKyAgICAgIG1lYXN1cmVtZW50czogcHJldmlvdXNNZWFzdXJlbWVudHMg fHwgW10sCisgICAgICBvcGVyYXRpb25zOiBwcmV2aW91c09wZXJhdGlvbnMgfHwgW10sCisgICAg ICB0cmVlU25hcHNob3Q6IGdldFRyZWVTbmFwc2hvdChyZWdpc3RlcmVkSURzKQorICAgIH0pOwor ICB9CisKKyAgY2xlYXJIaXN0b3J5KCk7CisgIGN1cnJlbnRGbHVzaFN0YXJ0VGltZSA9IHBlcmZv cm1hbmNlTm93KCk7CisgIGN1cnJlbnRGbHVzaE1lYXN1cmVtZW50cyA9IFtdOworfQorCitmdW5j dGlvbiBjaGVja0RlYnVnSUQoZGVidWdJRCkgeworICB2YXIgYWxsb3dSb290ID0gYXJndW1lbnRz Lmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0g OiBmYWxzZTsKKworICBpZiAoYWxsb3dSb290ICYmIGRlYnVnSUQgPT09IDApIHsKKyAgICByZXR1 cm47CisgIH0KKyAgaWYgKCFkZWJ1Z0lEKSB7CisgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09 ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdSZWFjdERlYnVnVG9vbDogZGVidWdJRCBt YXkgbm90IGJlIGVtcHR5LicpIDogdm9pZCAwOworICB9Cit9CisKK2Z1bmN0aW9uIGJlZ2luTGlm ZUN5Y2xlVGltZXIoZGVidWdJRCwgdGltZXJUeXBlKSB7CisgIGlmIChjdXJyZW50Rmx1c2hOZXN0 aW5nID09PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChjdXJyZW50VGltZXJUeXBlICYm ICFsaWZlQ3ljbGVUaW1lckhhc1dhcm5lZCkgeworICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9 PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnVGhlcmUgaXMgYW4gaW50ZXJuYWwgZXJy b3IgaW4gdGhlIFJlYWN0IHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50IGNvZGUuICcgKyAnRGlkIG5v dCBleHBlY3QgJXMgdGltZXIgdG8gc3RhcnQgd2hpbGUgJXMgdGltZXIgaXMgc3RpbGwgaW4gJyAr ICdwcm9ncmVzcyBmb3IgJXMgaW5zdGFuY2UuJywgdGltZXJUeXBlLCBjdXJyZW50VGltZXJUeXBl IHx8ICdubycsIGRlYnVnSUQgPT09IGN1cnJlbnRUaW1lckRlYnVnSUQgPyAndGhlIHNhbWUnIDog J2Fub3RoZXInKSA6IHZvaWQgMDsKKyAgICBsaWZlQ3ljbGVUaW1lckhhc1dhcm5lZCA9IHRydWU7 CisgIH0KKyAgY3VycmVudFRpbWVyU3RhcnRUaW1lID0gcGVyZm9ybWFuY2VOb3coKTsKKyAgY3Vy cmVudFRpbWVyTmVzdGVkRmx1c2hEdXJhdGlvbiA9IDA7CisgIGN1cnJlbnRUaW1lckRlYnVnSUQg PSBkZWJ1Z0lEOworICBjdXJyZW50VGltZXJUeXBlID0gdGltZXJUeXBlOworfQorCitmdW5jdGlv biBlbmRMaWZlQ3ljbGVUaW1lcihkZWJ1Z0lELCB0aW1lclR5cGUpIHsKKyAgaWYgKGN1cnJlbnRG bHVzaE5lc3RpbmcgPT09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGN1cnJlbnRUaW1l clR5cGUgIT09IHRpbWVyVHlwZSAmJiAhbGlmZUN5Y2xlVGltZXJIYXNXYXJuZWQpIHsKKyAgICBw cm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1Ro ZXJlIGlzIGFuIGludGVybmFsIGVycm9yIGluIHRoZSBSZWFjdCBwZXJmb3JtYW5jZSBtZWFzdXJl bWVudCBjb2RlLiAnICsgJ1dlIGRpZCBub3QgZXhwZWN0ICVzIHRpbWVyIHRvIHN0b3Agd2hpbGUg JXMgdGltZXIgaXMgc3RpbGwgaW4gJyArICdwcm9ncmVzcyBmb3IgJXMgaW5zdGFuY2UuIFBsZWFz ZSByZXBvcnQgdGhpcyBhcyBhIGJ1ZyBpbiBSZWFjdC4nLCB0aW1lclR5cGUsIGN1cnJlbnRUaW1l clR5cGUgfHwgJ25vJywgZGVidWdJRCA9PT0gY3VycmVudFRpbWVyRGVidWdJRCA/ICd0aGUgc2Ft ZScgOiAnYW5vdGhlcicpIDogdm9pZCAwOworICAgIGxpZmVDeWNsZVRpbWVySGFzV2FybmVkID0g dHJ1ZTsKKyAgfQorICBpZiAoaXNQcm9maWxpbmcpIHsKKyAgICBjdXJyZW50Rmx1c2hNZWFzdXJl bWVudHMucHVzaCh7CisgICAgICB0aW1lclR5cGU6IHRpbWVyVHlwZSwKKyAgICAgIGluc3RhbmNl SUQ6IGRlYnVnSUQsCisgICAgICBkdXJhdGlvbjogcGVyZm9ybWFuY2VOb3coKSAtIGN1cnJlbnRU aW1lclN0YXJ0VGltZSAtIGN1cnJlbnRUaW1lck5lc3RlZEZsdXNoRHVyYXRpb24KKyAgICB9KTsK KyAgfQorICBjdXJyZW50VGltZXJTdGFydFRpbWUgPSAwOworICBjdXJyZW50VGltZXJOZXN0ZWRG bHVzaER1cmF0aW9uID0gMDsKKyAgY3VycmVudFRpbWVyRGVidWdJRCA9IG51bGw7CisgIGN1cnJl bnRUaW1lclR5cGUgPSBudWxsOworfQorCitmdW5jdGlvbiBwYXVzZUN1cnJlbnRMaWZlQ3ljbGVU aW1lcigpIHsKKyAgdmFyIGN1cnJlbnRUaW1lciA9IHsKKyAgICBzdGFydFRpbWU6IGN1cnJlbnRU aW1lclN0YXJ0VGltZSwKKyAgICBuZXN0ZWRGbHVzaFN0YXJ0VGltZTogcGVyZm9ybWFuY2VOb3co KSwKKyAgICBkZWJ1Z0lEOiBjdXJyZW50VGltZXJEZWJ1Z0lELAorICAgIHRpbWVyVHlwZTogY3Vy cmVudFRpbWVyVHlwZQorICB9OworICBsaWZlQ3ljbGVUaW1lclN0YWNrLnB1c2goY3VycmVudFRp bWVyKTsKKyAgY3VycmVudFRpbWVyU3RhcnRUaW1lID0gMDsKKyAgY3VycmVudFRpbWVyTmVzdGVk Rmx1c2hEdXJhdGlvbiA9IDA7CisgIGN1cnJlbnRUaW1lckRlYnVnSUQgPSBudWxsOworICBjdXJy ZW50VGltZXJUeXBlID0gbnVsbDsKK30KKworZnVuY3Rpb24gcmVzdW1lQ3VycmVudExpZmVDeWNs ZVRpbWVyKCkgeworICB2YXIgX2xpZmVDeWNsZVRpbWVyU3RhY2skID0gbGlmZUN5Y2xlVGltZXJT dGFjay5wb3AoKSwKKyAgICAgIHN0YXJ0VGltZSA9IF9saWZlQ3ljbGVUaW1lclN0YWNrJC5zdGFy dFRpbWUsCisgICAgICBuZXN0ZWRGbHVzaFN0YXJ0VGltZSA9IF9saWZlQ3ljbGVUaW1lclN0YWNr JC5uZXN0ZWRGbHVzaFN0YXJ0VGltZSwKKyAgICAgIGRlYnVnSUQgPSBfbGlmZUN5Y2xlVGltZXJT dGFjayQuZGVidWdJRCwKKyAgICAgIHRpbWVyVHlwZSA9IF9saWZlQ3ljbGVUaW1lclN0YWNrJC50 aW1lclR5cGU7CisKKyAgdmFyIG5lc3RlZEZsdXNoRHVyYXRpb24gPSBwZXJmb3JtYW5jZU5vdygp IC0gbmVzdGVkRmx1c2hTdGFydFRpbWU7CisgIGN1cnJlbnRUaW1lclN0YXJ0VGltZSA9IHN0YXJ0 VGltZTsKKyAgY3VycmVudFRpbWVyTmVzdGVkRmx1c2hEdXJhdGlvbiArPSBuZXN0ZWRGbHVzaER1 cmF0aW9uOworICBjdXJyZW50VGltZXJEZWJ1Z0lEID0gZGVidWdJRDsKKyAgY3VycmVudFRpbWVy VHlwZSA9IHRpbWVyVHlwZTsKK30KKwordmFyIGxhc3RNYXJrVGltZVN0YW1wID0gMDsKK3ZhciBj YW5Vc2VQZXJmb3JtYW5jZU1lYXN1cmUgPQorLy8gJEZsb3dGaXhNZSBodHRwczovL2dpdGh1Yi5j b20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvMjM0NQordHlwZW9mIHBlcmZvcm1hbmNlICE9PSAndW5k ZWZpbmVkJyAmJiB0eXBlb2YgcGVyZm9ybWFuY2UubWFyayA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBl b2YgcGVyZm9ybWFuY2UuY2xlYXJNYXJrcyA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgcGVyZm9y bWFuY2UubWVhc3VyZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgcGVyZm9ybWFuY2UuY2xlYXJN ZWFzdXJlcyA9PT0gJ2Z1bmN0aW9uJzsKKworZnVuY3Rpb24gc2hvdWxkTWFyayhkZWJ1Z0lEKSB7 CisgIGlmICghaXNQcm9maWxpbmcgfHwgIWNhblVzZVBlcmZvcm1hbmNlTWVhc3VyZSkgeworICAg IHJldHVybiBmYWxzZTsKKyAgfQorICB2YXIgZWxlbWVudCA9IFJlYWN0Q29tcG9uZW50VHJlZUhv b2suZ2V0RWxlbWVudChkZWJ1Z0lEKTsKKyAgaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCB0eXBlb2Yg ZWxlbWVudCAhPT0gJ29iamVjdCcpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgdmFyIGlz SG9zdEVsZW1lbnQgPSB0eXBlb2YgZWxlbWVudC50eXBlID09PSAnc3RyaW5nJzsKKyAgaWYgKGlz SG9zdEVsZW1lbnQpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9 CisKK2Z1bmN0aW9uIG1hcmtCZWdpbihkZWJ1Z0lELCBtYXJrVHlwZSkgeworICBpZiAoIXNob3Vs ZE1hcmsoZGVidWdJRCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICB2YXIgbWFya05hbWUgPSBk ZWJ1Z0lEICsgJzo6JyArIG1hcmtUeXBlOworICBsYXN0TWFya1RpbWVTdGFtcCA9IHBlcmZvcm1h bmNlTm93KCk7CisgIHBlcmZvcm1hbmNlLm1hcmsobWFya05hbWUpOworfQorCitmdW5jdGlvbiBt YXJrRW5kKGRlYnVnSUQsIG1hcmtUeXBlKSB7CisgIGlmICghc2hvdWxkTWFyayhkZWJ1Z0lEKSkg eworICAgIHJldHVybjsKKyAgfQorCisgIHZhciBtYXJrTmFtZSA9IGRlYnVnSUQgKyAnOjonICsg bWFya1R5cGU7CisgIHZhciBkaXNwbGF5TmFtZSA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0 RGlzcGxheU5hbWUoZGVidWdJRCkgfHwgJ1Vua25vd24nOworCisgIC8vIENocm9tZSBoYXMgYW4g aXNzdWUgb2YgZHJvcHBpbmcgbWFya2VycyByZWNvcmRlZCB0b28gZmFzdDoKKyAgLy8gaHR0cHM6 Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NjQwNjUyCisg IC8vIFRvIHdvcmsgYXJvdW5kIHRoaXMsIHdlIHdpbGwgbm90IHJlcG9ydCB2ZXJ5IHNtYWxsIG1l YXN1cmVtZW50cy4KKyAgLy8gSSBkZXRlcm1pbmVkIHRoZSBtYWdpYyBudW1iZXIgYnkgdHdlYWtp bmcgaXQgYmFjayBhbmQgZm9ydGguCisgIC8vIDAuMDVtcyB3YXMgZW5vdWdoIHRvIHByZXZlbnQg dGhlIGlzc3VlLCBidXQgSSBzZXQgaXQgdG8gMC4xbXMgdG8gYmUgc2FmZS4KKyAgLy8gV2hlbiB0 aGUgYnVnIGlzIGZpeGVkLCB3ZSBjYW4gYG1lYXN1cmUoKWAgdW5jb25kaXRpb25hbGx5IGlmIHdl IHdhbnQgdG8uCisgIHZhciB0aW1lU3RhbXAgPSBwZXJmb3JtYW5jZU5vdygpOworICBpZiAodGlt ZVN0YW1wIC0gbGFzdE1hcmtUaW1lU3RhbXAgPiAwLjEpIHsKKyAgICB2YXIgbWVhc3VyZW1lbnRO YW1lID0gZGlzcGxheU5hbWUgKyAnIFsnICsgbWFya1R5cGUgKyAnXSc7CisgICAgcGVyZm9ybWFu Y2UubWVhc3VyZShtZWFzdXJlbWVudE5hbWUsIG1hcmtOYW1lKTsKKyAgfQorCisgIHBlcmZvcm1h bmNlLmNsZWFyTWFya3MobWFya05hbWUpOworICBwZXJmb3JtYW5jZS5jbGVhck1lYXN1cmVzKG1l YXN1cmVtZW50TmFtZSk7Cit9CisKK3ZhciBSZWFjdERlYnVnVG9vbCA9IHsKKyAgYWRkSG9vazog ZnVuY3Rpb24gKGhvb2spIHsKKyAgICBob29rcy5wdXNoKGhvb2spOworICB9LAorICByZW1vdmVI b29rOiBmdW5jdGlvbiAoaG9vaykgeworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaG9va3MubGVu Z3RoOyBpKyspIHsKKyAgICAgIGlmIChob29rc1tpXSA9PT0gaG9vaykgeworICAgICAgICBob29r cy5zcGxpY2UoaSwgMSk7CisgICAgICAgIGktLTsKKyAgICAgIH0KKyAgICB9CisgIH0sCisgIGlz UHJvZmlsaW5nOiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIGlzUHJvZmlsaW5nOworICB9LAor ICBiZWdpblByb2ZpbGluZzogZnVuY3Rpb24gKCkgeworICAgIGlmIChpc1Byb2ZpbGluZykgewor ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlzUHJvZmlsaW5nID0gdHJ1ZTsKKyAgICBmbHVz aEhpc3RvcnkubGVuZ3RoID0gMDsKKyAgICByZXNldE1lYXN1cmVtZW50cygpOworICAgIFJlYWN0 RGVidWdUb29sLmFkZEhvb2soUmVhY3RIb3N0T3BlcmF0aW9uSGlzdG9yeUhvb2spOworICB9LAor ICBlbmRQcm9maWxpbmc6IGZ1bmN0aW9uICgpIHsKKyAgICBpZiAoIWlzUHJvZmlsaW5nKSB7Cisg ICAgICByZXR1cm47CisgICAgfQorCisgICAgaXNQcm9maWxpbmcgPSBmYWxzZTsKKyAgICByZXNl dE1lYXN1cmVtZW50cygpOworICAgIFJlYWN0RGVidWdUb29sLnJlbW92ZUhvb2soUmVhY3RIb3N0 T3BlcmF0aW9uSGlzdG9yeUhvb2spOworICB9LAorICBnZXRGbHVzaEhpc3Rvcnk6IGZ1bmN0aW9u ICgpIHsKKyAgICByZXR1cm4gZmx1c2hIaXN0b3J5OworICB9LAorICBvbkJlZ2luRmx1c2g6IGZ1 bmN0aW9uICgpIHsKKyAgICBjdXJyZW50Rmx1c2hOZXN0aW5nKys7CisgICAgcmVzZXRNZWFzdXJl bWVudHMoKTsKKyAgICBwYXVzZUN1cnJlbnRMaWZlQ3ljbGVUaW1lcigpOworICAgIGVtaXRFdmVu dCgnb25CZWdpbkZsdXNoJyk7CisgIH0sCisgIG9uRW5kRmx1c2g6IGZ1bmN0aW9uICgpIHsKKyAg ICByZXNldE1lYXN1cmVtZW50cygpOworICAgIGN1cnJlbnRGbHVzaE5lc3RpbmctLTsKKyAgICBy ZXN1bWVDdXJyZW50TGlmZUN5Y2xlVGltZXIoKTsKKyAgICBlbWl0RXZlbnQoJ29uRW5kRmx1c2gn KTsKKyAgfSwKKyAgb25CZWdpbkxpZmVDeWNsZVRpbWVyOiBmdW5jdGlvbiAoZGVidWdJRCwgdGlt ZXJUeXBlKSB7CisgICAgY2hlY2tEZWJ1Z0lEKGRlYnVnSUQpOworICAgIGVtaXRFdmVudCgnb25C ZWdpbkxpZmVDeWNsZVRpbWVyJywgZGVidWdJRCwgdGltZXJUeXBlKTsKKyAgICBtYXJrQmVnaW4o ZGVidWdJRCwgdGltZXJUeXBlKTsKKyAgICBiZWdpbkxpZmVDeWNsZVRpbWVyKGRlYnVnSUQsIHRp bWVyVHlwZSk7CisgIH0sCisgIG9uRW5kTGlmZUN5Y2xlVGltZXI6IGZ1bmN0aW9uIChkZWJ1Z0lE LCB0aW1lclR5cGUpIHsKKyAgICBjaGVja0RlYnVnSUQoZGVidWdJRCk7CisgICAgZW5kTGlmZUN5 Y2xlVGltZXIoZGVidWdJRCwgdGltZXJUeXBlKTsKKyAgICBtYXJrRW5kKGRlYnVnSUQsIHRpbWVy VHlwZSk7CisgICAgZW1pdEV2ZW50KCdvbkVuZExpZmVDeWNsZVRpbWVyJywgZGVidWdJRCwgdGlt ZXJUeXBlKTsKKyAgfSwKKyAgb25CZWdpblByb2Nlc3NpbmdDaGlsZENvbnRleHQ6IGZ1bmN0aW9u ICgpIHsKKyAgICBlbWl0RXZlbnQoJ29uQmVnaW5Qcm9jZXNzaW5nQ2hpbGRDb250ZXh0Jyk7Cisg IH0sCisgIG9uRW5kUHJvY2Vzc2luZ0NoaWxkQ29udGV4dDogZnVuY3Rpb24gKCkgeworICAgIGVt aXRFdmVudCgnb25FbmRQcm9jZXNzaW5nQ2hpbGRDb250ZXh0Jyk7CisgIH0sCisgIG9uSG9zdE9w ZXJhdGlvbjogZnVuY3Rpb24gKG9wZXJhdGlvbikgeworICAgIGNoZWNrRGVidWdJRChvcGVyYXRp b24uaW5zdGFuY2VJRCk7CisgICAgZW1pdEV2ZW50KCdvbkhvc3RPcGVyYXRpb24nLCBvcGVyYXRp b24pOworICB9LAorICBvblNldFN0YXRlOiBmdW5jdGlvbiAoKSB7CisgICAgZW1pdEV2ZW50KCdv blNldFN0YXRlJyk7CisgIH0sCisgIG9uU2V0Q2hpbGRyZW46IGZ1bmN0aW9uIChkZWJ1Z0lELCBj aGlsZERlYnVnSURzKSB7CisgICAgY2hlY2tEZWJ1Z0lEKGRlYnVnSUQpOworICAgIGNoaWxkRGVi dWdJRHMuZm9yRWFjaChjaGVja0RlYnVnSUQpOworICAgIGVtaXRFdmVudCgnb25TZXRDaGlsZHJl bicsIGRlYnVnSUQsIGNoaWxkRGVidWdJRHMpOworICB9LAorICBvbkJlZm9yZU1vdW50Q29tcG9u ZW50OiBmdW5jdGlvbiAoZGVidWdJRCwgZWxlbWVudCwgcGFyZW50RGVidWdJRCkgeworICAgIGNo ZWNrRGVidWdJRChkZWJ1Z0lEKTsKKyAgICBjaGVja0RlYnVnSUQocGFyZW50RGVidWdJRCwgdHJ1 ZSk7CisgICAgZW1pdEV2ZW50KCdvbkJlZm9yZU1vdW50Q29tcG9uZW50JywgZGVidWdJRCwgZWxl bWVudCwgcGFyZW50RGVidWdJRCk7CisgICAgbWFya0JlZ2luKGRlYnVnSUQsICdtb3VudCcpOwor ICB9LAorICBvbk1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCkgeworICAgIGNoZWNr RGVidWdJRChkZWJ1Z0lEKTsKKyAgICBtYXJrRW5kKGRlYnVnSUQsICdtb3VudCcpOworICAgIGVt aXRFdmVudCgnb25Nb3VudENvbXBvbmVudCcsIGRlYnVnSUQpOworICB9LAorICBvbkJlZm9yZVVw ZGF0ZUNvbXBvbmVudDogZnVuY3Rpb24gKGRlYnVnSUQsIGVsZW1lbnQpIHsKKyAgICBjaGVja0Rl YnVnSUQoZGVidWdJRCk7CisgICAgZW1pdEV2ZW50KCdvbkJlZm9yZVVwZGF0ZUNvbXBvbmVudCcs IGRlYnVnSUQsIGVsZW1lbnQpOworICAgIG1hcmtCZWdpbihkZWJ1Z0lELCAndXBkYXRlJyk7Cisg IH0sCisgIG9uVXBkYXRlQ29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCkgeworICAgIGNoZWNr RGVidWdJRChkZWJ1Z0lEKTsKKyAgICBtYXJrRW5kKGRlYnVnSUQsICd1cGRhdGUnKTsKKyAgICBl bWl0RXZlbnQoJ29uVXBkYXRlQ29tcG9uZW50JywgZGVidWdJRCk7CisgIH0sCisgIG9uQmVmb3Jl VW5tb3VudENvbXBvbmVudDogZnVuY3Rpb24gKGRlYnVnSUQpIHsKKyAgICBjaGVja0RlYnVnSUQo ZGVidWdJRCk7CisgICAgZW1pdEV2ZW50KCdvbkJlZm9yZVVubW91bnRDb21wb25lbnQnLCBkZWJ1 Z0lEKTsKKyAgICBtYXJrQmVnaW4oZGVidWdJRCwgJ3VubW91bnQnKTsKKyAgfSwKKyAgb25Vbm1v dW50Q29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCkgeworICAgIGNoZWNrRGVidWdJRChkZWJ1 Z0lEKTsKKyAgICBtYXJrRW5kKGRlYnVnSUQsICd1bm1vdW50Jyk7CisgICAgZW1pdEV2ZW50KCdv blVubW91bnRDb21wb25lbnQnLCBkZWJ1Z0lEKTsKKyAgfSwKKyAgb25UZXN0RXZlbnQ6IGZ1bmN0 aW9uICgpIHsKKyAgICBlbWl0RXZlbnQoJ29uVGVzdEV2ZW50Jyk7CisgIH0KK307CisKKy8vIFRP RE8gcmVtb3ZlIHRoZXNlIHdoZW4gUk4vd3d3IGdldHMgdXBkYXRlZAorUmVhY3REZWJ1Z1Rvb2wu YWRkRGV2dG9vbCA9IFJlYWN0RGVidWdUb29sLmFkZEhvb2s7CitSZWFjdERlYnVnVG9vbC5yZW1v dmVEZXZ0b29sID0gUmVhY3REZWJ1Z1Rvb2wucmVtb3ZlSG9vazsKKworUmVhY3REZWJ1Z1Rvb2wu YWRkSG9vayhSZWFjdEludmFsaWRTZXRTdGF0ZVdhcm5pbmdIb29rKTsKK1JlYWN0RGVidWdUb29s LmFkZEhvb2soUmVhY3RDb21wb25lbnRUcmVlSG9vayk7Cit2YXIgdXJsID0gRXhlY3V0aW9uRW52 aXJvbm1lbnQuY2FuVXNlRE9NICYmIHdpbmRvdy5sb2NhdGlvbi5ocmVmIHx8ICcnOworaWYgKC9b PyZdcmVhY3RfcGVyZlxiLy50ZXN0KHVybCkpIHsKKyAgUmVhY3REZWJ1Z1Rvb2wuYmVnaW5Qcm9m aWxpbmcoKTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdERlYnVnVG9vbDsKXCBObyBuZXds aW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9y L3JlYWN0LWRvbS9saWIvUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVneS5qcyBiL3dlYi9wZ2Fk bWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0 ZWd5LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi41ZTE0OWYwNgotLS0g L2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9S ZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5LmpzCkBAIC0wLDAgKzEsNjcgQEAKKy8qKgorICog Q29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVz ZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNE LXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qg ZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9m IHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNh bWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfYXNzaWduID0g cmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpOworCit2YXIgUmVhY3RVcGRhdGVzID0gcmVxdWlyZSgn Li9SZWFjdFVwZGF0ZXMnKTsKK3ZhciBUcmFuc2FjdGlvbiA9IHJlcXVpcmUoJy4vVHJhbnNhY3Rp b24nKTsKKwordmFyIGVtcHR5RnVuY3Rpb24gPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eUZ1bmN0 aW9uJyk7CisKK3ZhciBSRVNFVF9CQVRDSEVEX1VQREFURVMgPSB7CisgIGluaXRpYWxpemU6IGVt cHR5RnVuY3Rpb24sCisgIGNsb3NlOiBmdW5jdGlvbiAoKSB7CisgICAgUmVhY3REZWZhdWx0QmF0 Y2hpbmdTdHJhdGVneS5pc0JhdGNoaW5nVXBkYXRlcyA9IGZhbHNlOworICB9Cit9OworCit2YXIg RkxVU0hfQkFUQ0hFRF9VUERBVEVTID0geworICBpbml0aWFsaXplOiBlbXB0eUZ1bmN0aW9uLAor ICBjbG9zZTogUmVhY3RVcGRhdGVzLmZsdXNoQmF0Y2hlZFVwZGF0ZXMuYmluZChSZWFjdFVwZGF0 ZXMpCit9OworCit2YXIgVFJBTlNBQ1RJT05fV1JBUFBFUlMgPSBbRkxVU0hfQkFUQ0hFRF9VUERB VEVTLCBSRVNFVF9CQVRDSEVEX1VQREFURVNdOworCitmdW5jdGlvbiBSZWFjdERlZmF1bHRCYXRj aGluZ1N0cmF0ZWd5VHJhbnNhY3Rpb24oKSB7CisgIHRoaXMucmVpbml0aWFsaXplVHJhbnNhY3Rp b24oKTsKK30KKworX2Fzc2lnbihSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5VHJhbnNhY3Rp b24ucHJvdG90eXBlLCBUcmFuc2FjdGlvbiwgeworICBnZXRUcmFuc2FjdGlvbldyYXBwZXJzOiBm dW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIFRSQU5TQUNUSU9OX1dSQVBQRVJTOworICB9Cit9KTsK KwordmFyIHRyYW5zYWN0aW9uID0gbmV3IFJlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3lUcmFu c2FjdGlvbigpOworCit2YXIgUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVneSA9IHsKKyAgaXNC YXRjaGluZ1VwZGF0ZXM6IGZhbHNlLAorCisgIC8qKgorICAgKiBDYWxsIHRoZSBwcm92aWRlZCBm dW5jdGlvbiBpbiBhIGNvbnRleHQgd2l0aGluIHdoaWNoIGNhbGxzIHRvIGBzZXRTdGF0ZWAKKyAg ICogYW5kIGZyaWVuZHMgYXJlIGJhdGNoZWQgc3VjaCB0aGF0IGNvbXBvbmVudHMgYXJlbid0IHVw ZGF0ZWQgdW5uZWNlc3NhcmlseS4KKyAgICovCisgIGJhdGNoZWRVcGRhdGVzOiBmdW5jdGlvbiAo Y2FsbGJhY2ssIGEsIGIsIGMsIGQsIGUpIHsKKyAgICB2YXIgYWxyZWFkeUJhdGNoaW5nVXBkYXRl cyA9IFJlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3kuaXNCYXRjaGluZ1VwZGF0ZXM7CisKKyAg ICBSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5LmlzQmF0Y2hpbmdVcGRhdGVzID0gdHJ1ZTsK KworICAgIC8vIFRoZSBjb2RlIGlzIHdyaXR0ZW4gdGhpcyB3YXkgdG8gYXZvaWQgZXh0cmEgYWxs b2NhdGlvbnMKKyAgICBpZiAoYWxyZWFkeUJhdGNoaW5nVXBkYXRlcykgeworICAgICAgcmV0dXJu IGNhbGxiYWNrKGEsIGIsIGMsIGQsIGUpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gdHJh bnNhY3Rpb24ucGVyZm9ybShjYWxsYmFjaywgbnVsbCwgYSwgYiwgYywgZCwgZSk7CisgICAgfQor ICB9Cit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3k7 ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3Rh dGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0RGVmYXVsdEluamVjdGlvbi5qcyBiL3dlYi9w Z2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdERlZmF1bHRJbmplY3Rpb24u anMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLmJmZWQwZjE1Ci0tLSAvZGV2 L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0 RGVmYXVsdEluamVjdGlvbi5qcwpAQCAtMCwwICsxLDg1IEBACisvKioKKyAqIENvcHlyaWdodCAy MDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK KyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNl bnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBv ZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmln aHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9y eS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgQVJJQURPTVByb3BlcnR5Q29uZmln ID0gcmVxdWlyZSgnLi9BUklBRE9NUHJvcGVydHlDb25maWcnKTsKK3ZhciBCZWZvcmVJbnB1dEV2 ZW50UGx1Z2luID0gcmVxdWlyZSgnLi9CZWZvcmVJbnB1dEV2ZW50UGx1Z2luJyk7Cit2YXIgQ2hh bmdlRXZlbnRQbHVnaW4gPSByZXF1aXJlKCcuL0NoYW5nZUV2ZW50UGx1Z2luJyk7Cit2YXIgRGVm YXVsdEV2ZW50UGx1Z2luT3JkZXIgPSByZXF1aXJlKCcuL0RlZmF1bHRFdmVudFBsdWdpbk9yZGVy Jyk7Cit2YXIgRW50ZXJMZWF2ZUV2ZW50UGx1Z2luID0gcmVxdWlyZSgnLi9FbnRlckxlYXZlRXZl bnRQbHVnaW4nKTsKK3ZhciBIVE1MRE9NUHJvcGVydHlDb25maWcgPSByZXF1aXJlKCcuL0hUTUxE T01Qcm9wZXJ0eUNvbmZpZycpOwordmFyIFJlYWN0Q29tcG9uZW50QnJvd3NlckVudmlyb25tZW50 ID0gcmVxdWlyZSgnLi9SZWFjdENvbXBvbmVudEJyb3dzZXJFbnZpcm9ubWVudCcpOwordmFyIFJl YWN0RE9NQ29tcG9uZW50ID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudCcpOwordmFyIFJl YWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7 Cit2YXIgUmVhY3RET01FbXB0eUNvbXBvbmVudCA9IHJlcXVpcmUoJy4vUmVhY3RET01FbXB0eUNv bXBvbmVudCcpOwordmFyIFJlYWN0RE9NVHJlZVRyYXZlcnNhbCA9IHJlcXVpcmUoJy4vUmVhY3RE T01UcmVlVHJhdmVyc2FsJyk7Cit2YXIgUmVhY3RET01UZXh0Q29tcG9uZW50ID0gcmVxdWlyZSgn Li9SZWFjdERPTVRleHRDb21wb25lbnQnKTsKK3ZhciBSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0 ZWd5ID0gcmVxdWlyZSgnLi9SZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5Jyk7Cit2YXIgUmVh Y3RFdmVudExpc3RlbmVyID0gcmVxdWlyZSgnLi9SZWFjdEV2ZW50TGlzdGVuZXInKTsKK3ZhciBS ZWFjdEluamVjdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbmplY3Rpb24nKTsKK3ZhciBSZWFjdFJl Y29uY2lsZVRyYW5zYWN0aW9uID0gcmVxdWlyZSgnLi9SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9u Jyk7Cit2YXIgU1ZHRE9NUHJvcGVydHlDb25maWcgPSByZXF1aXJlKCcuL1NWR0RPTVByb3BlcnR5 Q29uZmlnJyk7Cit2YXIgU2VsZWN0RXZlbnRQbHVnaW4gPSByZXF1aXJlKCcuL1NlbGVjdEV2ZW50 UGx1Z2luJyk7Cit2YXIgU2ltcGxlRXZlbnRQbHVnaW4gPSByZXF1aXJlKCcuL1NpbXBsZUV2ZW50 UGx1Z2luJyk7CisKK3ZhciBhbHJlYWR5SW5qZWN0ZWQgPSBmYWxzZTsKKworZnVuY3Rpb24gaW5q ZWN0KCkgeworICBpZiAoYWxyZWFkeUluamVjdGVkKSB7CisgICAgLy8gVE9ETzogVGhpcyBpcyBj dXJyZW50bHkgdHJ1ZSBiZWNhdXNlIHRoZXNlIGluamVjdGlvbnMgYXJlIHNoYXJlZCBiZXR3ZWVu CisgICAgLy8gdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlciBwYWNrYWdlLiBUaGV5IHNob3VsZCBi ZSBidWlsdCBpbmRlcGVuZGVudGx5CisgICAgLy8gYW5kIG5vdCBzaGFyZSBhbnkgaW5qZWN0aW9u IHN0YXRlLiBUaGVuIHRoaXMgcHJvYmxlbSB3aWxsIGJlIHNvbHZlZC4KKyAgICByZXR1cm47Cisg IH0KKyAgYWxyZWFkeUluamVjdGVkID0gdHJ1ZTsKKworICBSZWFjdEluamVjdGlvbi5FdmVudEVt aXR0ZXIuaW5qZWN0UmVhY3RFdmVudExpc3RlbmVyKFJlYWN0RXZlbnRMaXN0ZW5lcik7CisKKyAg LyoqCisgICAqIEluamVjdCBtb2R1bGVzIGZvciByZXNvbHZpbmcgRE9NIGhpZXJhcmNoeSBhbmQg cGx1Z2luIG9yZGVyaW5nLgorICAgKi8KKyAgUmVhY3RJbmplY3Rpb24uRXZlbnRQbHVnaW5IdWIu aW5qZWN0RXZlbnRQbHVnaW5PcmRlcihEZWZhdWx0RXZlbnRQbHVnaW5PcmRlcik7CisgIFJlYWN0 SW5qZWN0aW9uLkV2ZW50UGx1Z2luVXRpbHMuaW5qZWN0Q29tcG9uZW50VHJlZShSZWFjdERPTUNv bXBvbmVudFRyZWUpOworICBSZWFjdEluamVjdGlvbi5FdmVudFBsdWdpblV0aWxzLmluamVjdFRy ZWVUcmF2ZXJzYWwoUmVhY3RET01UcmVlVHJhdmVyc2FsKTsKKworICAvKioKKyAgICogU29tZSBp bXBvcnRhbnQgZXZlbnQgcGx1Z2lucyBpbmNsdWRlZCBieSBkZWZhdWx0ICh3aXRob3V0IGhhdmlu ZyB0byByZXF1aXJlCisgICAqIHRoZW0pLgorICAgKi8KKyAgUmVhY3RJbmplY3Rpb24uRXZlbnRQ bHVnaW5IdWIuaW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lKHsKKyAgICBTaW1wbGVFdmVudFBsdWdp bjogU2ltcGxlRXZlbnRQbHVnaW4sCisgICAgRW50ZXJMZWF2ZUV2ZW50UGx1Z2luOiBFbnRlckxl YXZlRXZlbnRQbHVnaW4sCisgICAgQ2hhbmdlRXZlbnRQbHVnaW46IENoYW5nZUV2ZW50UGx1Z2lu LAorICAgIFNlbGVjdEV2ZW50UGx1Z2luOiBTZWxlY3RFdmVudFBsdWdpbiwKKyAgICBCZWZvcmVJ bnB1dEV2ZW50UGx1Z2luOiBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luCisgIH0pOworCisgIFJlYWN0 SW5qZWN0aW9uLkhvc3RDb21wb25lbnQuaW5qZWN0R2VuZXJpY0NvbXBvbmVudENsYXNzKFJlYWN0 RE9NQ29tcG9uZW50KTsKKworICBSZWFjdEluamVjdGlvbi5Ib3N0Q29tcG9uZW50LmluamVjdFRl eHRDb21wb25lbnRDbGFzcyhSZWFjdERPTVRleHRDb21wb25lbnQpOworCisgIFJlYWN0SW5qZWN0 aW9uLkRPTVByb3BlcnR5LmluamVjdERPTVByb3BlcnR5Q29uZmlnKEFSSUFET01Qcm9wZXJ0eUNv bmZpZyk7CisgIFJlYWN0SW5qZWN0aW9uLkRPTVByb3BlcnR5LmluamVjdERPTVByb3BlcnR5Q29u ZmlnKEhUTUxET01Qcm9wZXJ0eUNvbmZpZyk7CisgIFJlYWN0SW5qZWN0aW9uLkRPTVByb3BlcnR5 LmluamVjdERPTVByb3BlcnR5Q29uZmlnKFNWR0RPTVByb3BlcnR5Q29uZmlnKTsKKworICBSZWFj dEluamVjdGlvbi5FbXB0eUNvbXBvbmVudC5pbmplY3RFbXB0eUNvbXBvbmVudEZhY3RvcnkoZnVu Y3Rpb24gKGluc3RhbnRpYXRlKSB7CisgICAgcmV0dXJuIG5ldyBSZWFjdERPTUVtcHR5Q29tcG9u ZW50KGluc3RhbnRpYXRlKTsKKyAgfSk7CisKKyAgUmVhY3RJbmplY3Rpb24uVXBkYXRlcy5pbmpl Y3RSZWNvbmNpbGVUcmFuc2FjdGlvbihSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uKTsKKyAgUmVh Y3RJbmplY3Rpb24uVXBkYXRlcy5pbmplY3RCYXRjaGluZ1N0cmF0ZWd5KFJlYWN0RGVmYXVsdEJh dGNoaW5nU3RyYXRlZ3kpOworCisgIFJlYWN0SW5qZWN0aW9uLkNvbXBvbmVudC5pbmplY3RFbnZp cm9ubWVudChSZWFjdENvbXBvbmVudEJyb3dzZXJFbnZpcm9ubWVudCk7Cit9CisKK21vZHVsZS5l eHBvcnRzID0geworICBpbmplY3Q6IGluamVjdAorfTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBm aWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIv UmVhY3RFbGVtZW50U3ltYm9sLmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1k b20vbGliL1JlYWN0RWxlbWVudFN5bWJvbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwMC4uYzEzNzY1YjkKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMv dmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RFbGVtZW50U3ltYm9sLmpzCkBAIC0wLDAgKzEsMTkg QEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFs bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1 bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUg aW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwg Z3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZp bGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsK KworLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50IHR5cGUuIElmIHRo ZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2wKKy8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51 bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS4KKwordmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9 IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sWydmb3InXSAmJiBTeW1ib2xb J2ZvciddKCdyZWFjdC5lbGVtZW50JykgfHwgMHhlYWM3OworCittb2R1bGUuZXhwb3J0cyA9IFJF QUNUX0VMRU1FTlRfVFlQRTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQg YS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RFbXB0eUNvbXBv bmVudC5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdEVt cHR5Q29tcG9uZW50LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi5mYmVh OTQwOQotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3Qt ZG9tL2xpYi9SZWFjdEVtcHR5Q29tcG9uZW50LmpzCkBAIC0wLDAgKzEsMjkgQEAKKy8qKgorICog Q29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVz ZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNE LXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qg ZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9m IHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNh bWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBlbXB0eUNvbXBv bmVudEZhY3Rvcnk7CisKK3ZhciBSZWFjdEVtcHR5Q29tcG9uZW50SW5qZWN0aW9uID0geworICBp bmplY3RFbXB0eUNvbXBvbmVudEZhY3Rvcnk6IGZ1bmN0aW9uIChmYWN0b3J5KSB7CisgICAgZW1w dHlDb21wb25lbnRGYWN0b3J5ID0gZmFjdG9yeTsKKyAgfQorfTsKKwordmFyIFJlYWN0RW1wdHlD b21wb25lbnQgPSB7CisgIGNyZWF0ZTogZnVuY3Rpb24gKGluc3RhbnRpYXRlKSB7CisgICAgcmV0 dXJuIGVtcHR5Q29tcG9uZW50RmFjdG9yeShpbnN0YW50aWF0ZSk7CisgIH0KK307CisKK1JlYWN0 RW1wdHlDb21wb25lbnQuaW5qZWN0aW9uID0gUmVhY3RFbXB0eUNvbXBvbmVudEluamVjdGlvbjsK KworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdEVtcHR5Q29tcG9uZW50OwpcIE5vIG5ld2xpbmUgYXQg ZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3Qt ZG9tL2xpYi9SZWFjdEVycm9yVXRpbHMuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3Jl YWN0LWRvbS9saWIvUmVhY3RFcnJvclV0aWxzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAwLi44YTViM2Y0NQotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRp Yy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdEVycm9yVXRpbHMuanMKQEAgLTAsMCArMSw3NiBA QAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxs IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVu ZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBp biB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBn cmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmls ZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOwor Cit2YXIgY2F1Z2h0RXJyb3IgPSBudWxsOworCisvKioKKyAqIENhbGwgYSBmdW5jdGlvbiB3aGls ZSBndWFyZGluZyBhZ2FpbnN0IGVycm9ycyB0aGF0IGhhcHBlbnMgd2l0aGluIGl0LgorICoKKyAq IEBwYXJhbSB7U3RyaW5nfSBuYW1lIG9mIHRoZSBndWFyZCB0byB1c2UgZm9yIGxvZ2dpbmcgb3Ig ZGVidWdnaW5nCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZv a2UKKyAqIEBwYXJhbSB7Kn0gYSBGaXJzdCBhcmd1bWVudAorICogQHBhcmFtIHsqfSBiIFNlY29u ZCBhcmd1bWVudAorICovCitmdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobmFtZSwgZnVu YywgYSkgeworICB0cnkgeworICAgIGZ1bmMoYSk7CisgIH0gY2F0Y2ggKHgpIHsKKyAgICBpZiAo Y2F1Z2h0RXJyb3IgPT09IG51bGwpIHsKKyAgICAgIGNhdWdodEVycm9yID0geDsKKyAgICB9Cisg IH0KK30KKwordmFyIFJlYWN0RXJyb3JVdGlscyA9IHsKKyAgaW52b2tlR3VhcmRlZENhbGxiYWNr OiBpbnZva2VHdWFyZGVkQ2FsbGJhY2ssCisKKyAgLyoqCisgICAqIEludm9rZWQgYnkgUmVhY3RU ZXN0VXRpbHMuU2ltdWxhdGUgc28gdGhhdCBhbnkgZXJyb3JzIHRocm93biBieSB0aGUgZXZlbnQK KyAgICogaGFuZGxlciBhcmUgc3VyZSB0byBiZSByZXRocm93biBieSByZXRocm93Q2F1Z2h0RXJy b3IuCisgICAqLworICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tXaXRoQ2F0Y2g6IGludm9rZUd1YXJk ZWRDYWxsYmFjaywKKworICAvKioKKyAgICogRHVyaW5nIGV4ZWN1dGlvbiBvZiBndWFyZGVkIGZ1 bmN0aW9ucyB3ZSB3aWxsIGNhcHR1cmUgdGhlIGZpcnN0IGVycm9yIHdoaWNoCisgICAqIHdlIHdp bGwgcmV0aHJvdyB0byBiZSBoYW5kbGVkIGJ5IHRoZSB0b3AgbGV2ZWwgZXJyb3IgaGFuZGxlci4K KyAgICovCisgIHJldGhyb3dDYXVnaHRFcnJvcjogZnVuY3Rpb24gKCkgeworICAgIGlmIChjYXVn aHRFcnJvcikgeworICAgICAgdmFyIGVycm9yID0gY2F1Z2h0RXJyb3I7CisgICAgICBjYXVnaHRF cnJvciA9IG51bGw7CisgICAgICB0aHJvdyBlcnJvcjsKKyAgICB9CisgIH0KK307CisKK2lmIChw cm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgIC8qKgorICAgKiBUbyBo ZWxwIGRldmVsb3BtZW50IHdlIGNhbiBnZXQgYmV0dGVyIGRldnRvb2xzIGludGVncmF0aW9uIGJ5 IHNpbXVsYXRpbmcgYQorICAgKiByZWFsIGJyb3dzZXIgZXZlbnQuCisgICAqLworICBpZiAodHlw ZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kaXNwYXRjaEV2ZW50 ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlw ZW9mIGRvY3VtZW50LmNyZWF0ZUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7CisgICAgdmFyIGZha2VO b2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncmVhY3QnKTsKKyAgICBSZWFjdEVycm9yVXRp bHMuaW52b2tlR3VhcmRlZENhbGxiYWNrID0gZnVuY3Rpb24gKG5hbWUsIGZ1bmMsIGEpIHsKKyAg ICAgIHZhciBib3VuZEZ1bmMgPSBmdW5jLmJpbmQobnVsbCwgYSk7CisgICAgICB2YXIgZXZ0VHlw ZSA9ICdyZWFjdC0nICsgbmFtZTsKKyAgICAgIGZha2VOb2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZ0 VHlwZSwgYm91bmRGdW5jLCBmYWxzZSk7CisgICAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRl RXZlbnQoJ0V2ZW50Jyk7CisgICAgICAvLyAkRmxvd0ZpeE1lIGh0dHBzOi8vZ2l0aHViLmNvbS9m YWNlYm9vay9mbG93L2lzc3Vlcy8yMzM2CisgICAgICBldnQuaW5pdEV2ZW50KGV2dFR5cGUsIGZh bHNlLCBmYWxzZSk7CisgICAgICBmYWtlTm9kZS5kaXNwYXRjaEV2ZW50KGV2dCk7CisgICAgICBm YWtlTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2dFR5cGUsIGJvdW5kRnVuYywgZmFsc2UpOwor ICAgIH07CisgIH0KK30KKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdEVycm9yVXRpbHM7ClwgTm8g bmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3Zl bmRvci9yZWFjdC1kb20vbGliL1JlYWN0RXZlbnRFbWl0dGVyTWl4aW4uanMgYi93ZWIvcGdhZG1p bi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RFdmVudEVtaXR0ZXJNaXhpbi5qcwpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uZmM5YzBjZDUKLS0tIC9kZXYvbnVs bAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RFdmVu dEVtaXR0ZXJNaXhpbi5qcwpAQCAtMCwwICsxLDMyIEBACisvKioKKyAqIENvcHlyaWdodCAyMDEz LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq IFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNl IGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0 aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRz IGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4K KyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgRXZlbnRQbHVnaW5IdWIgPSByZXF1aXJl KCcuL0V2ZW50UGx1Z2luSHViJyk7CisKK2Z1bmN0aW9uIHJ1bkV2ZW50UXVldWVJbkJhdGNoKGV2 ZW50cykgeworICBFdmVudFBsdWdpbkh1Yi5lbnF1ZXVlRXZlbnRzKGV2ZW50cyk7CisgIEV2ZW50 UGx1Z2luSHViLnByb2Nlc3NFdmVudFF1ZXVlKGZhbHNlKTsKK30KKwordmFyIFJlYWN0RXZlbnRF bWl0dGVyTWl4aW4gPSB7CisKKyAgLyoqCisgICAqIFN0cmVhbXMgYSBmaXJlZCB0b3AtbGV2ZWwg ZXZlbnQgdG8gYEV2ZW50UGx1Z2luSHViYCB3aGVyZSBwbHVnaW5zIGhhdmUgdGhlCisgICAqIG9w cG9ydHVuaXR5IHRvIGNyZWF0ZSBgUmVhY3RFdmVudGBzIHRvIGJlIGRpc3BhdGNoZWQuCisgICAq LworICBoYW5kbGVUb3BMZXZlbDogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwg bmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7CisgICAgdmFyIGV2ZW50cyA9IEV2ZW50 UGx1Z2luSHViLmV4dHJhY3RFdmVudHModG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVF dmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpOworICAgIHJ1bkV2ZW50UXVldWVJbkJhdGNoKGV2ZW50 cyk7CisgIH0KK307CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RFdmVudEVtaXR0ZXJNaXhpbjsK XCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0 aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RFdmVudExpc3RlbmVyLmpzIGIvd2ViL3BnYWRt aW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0RXZlbnRMaXN0ZW5lci5qcwpuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uZTgxYjE0ZDIKLS0tIC9kZXYvbnVsbAor KysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RFdmVudExp c3RlbmVyLmpzCkBAIC0wLDAgKzEsMTU0IEBACisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNl bnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMg c291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5k IGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNv dXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBi ZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisg Ki8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3Np Z24nKTsKKwordmFyIEV2ZW50TGlzdGVuZXIgPSByZXF1aXJlKCdmYmpzL2xpYi9FdmVudExpc3Rl bmVyJyk7Cit2YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVj dXRpb25FbnZpcm9ubWVudCcpOwordmFyIFBvb2xlZENsYXNzID0gcmVxdWlyZSgnLi9Qb29sZWRD bGFzcycpOwordmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01D b21wb25lbnRUcmVlJyk7Cit2YXIgUmVhY3RVcGRhdGVzID0gcmVxdWlyZSgnLi9SZWFjdFVwZGF0 ZXMnKTsKKwordmFyIGdldEV2ZW50VGFyZ2V0ID0gcmVxdWlyZSgnLi9nZXRFdmVudFRhcmdldCcp OwordmFyIGdldFVuYm91bmRlZFNjcm9sbFBvc2l0aW9uID0gcmVxdWlyZSgnZmJqcy9saWIvZ2V0 VW5ib3VuZGVkU2Nyb2xsUG9zaXRpb24nKTsKKworLyoqCisgKiBGaW5kIHRoZSBkZWVwZXN0IFJl YWN0IGNvbXBvbmVudCBjb21wbGV0ZWx5IGNvbnRhaW5pbmcgdGhlIHJvb3Qgb2YgdGhlCisgKiBw YXNzZWQtaW4gaW5zdGFuY2UgKGZvciB1c2Ugd2hlbiBlbnRpcmUgUmVhY3QgdHJlZXMgYXJlIG5l c3RlZCB3aXRoaW4gZWFjaAorICogb3RoZXIpLiBJZiBSZWFjdCB0cmVlcyBhcmUgbm90IG5lc3Rl ZCwgcmV0dXJucyBudWxsLgorICovCitmdW5jdGlvbiBmaW5kUGFyZW50KGluc3QpIHsKKyAgLy8g VE9ETzogSXQgbWF5IGJlIGEgZ29vZCBpZGVhIHRvIGNhY2hlIHRoaXMgdG8gcHJldmVudCB1bm5l Y2Vzc2FyeSBET00KKyAgLy8gdHJhdmVyc2FsLCBidXQgY2FjaGluZyBpcyBkaWZmaWN1bHQgdG8g ZG8gY29ycmVjdGx5IHdpdGhvdXQgdXNpbmcgYQorICAvLyBtdXRhdGlvbiBvYnNlcnZlciB0byBs aXN0ZW4gZm9yIGFsbCBET00gY2hhbmdlcy4KKyAgd2hpbGUgKGluc3QuX2hvc3RQYXJlbnQpIHsK KyAgICBpbnN0ID0gaW5zdC5faG9zdFBhcmVudDsKKyAgfQorICB2YXIgcm9vdE5vZGUgPSBSZWFj dERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KTsKKyAgdmFyIGNvbnRh aW5lciA9IHJvb3ROb2RlLnBhcmVudE5vZGU7CisgIHJldHVybiBSZWFjdERPTUNvbXBvbmVudFRy ZWUuZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUoY29udGFpbmVyKTsKK30KKworLy8gVXNlZCB0 byBzdG9yZSBhbmNlc3RvciBoaWVyYXJjaHkgaW4gdG9wIGxldmVsIGNhbGxiYWNrCitmdW5jdGlv biBUb3BMZXZlbENhbGxiYWNrQm9va0tlZXBpbmcodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkg eworICB0aGlzLnRvcExldmVsVHlwZSA9IHRvcExldmVsVHlwZTsKKyAgdGhpcy5uYXRpdmVFdmVu dCA9IG5hdGl2ZUV2ZW50OworICB0aGlzLmFuY2VzdG9ycyA9IFtdOworfQorX2Fzc2lnbihUb3BM ZXZlbENhbGxiYWNrQm9va0tlZXBpbmcucHJvdG90eXBlLCB7CisgIGRlc3RydWN0b3I6IGZ1bmN0 aW9uICgpIHsKKyAgICB0aGlzLnRvcExldmVsVHlwZSA9IG51bGw7CisgICAgdGhpcy5uYXRpdmVF dmVudCA9IG51bGw7CisgICAgdGhpcy5hbmNlc3RvcnMubGVuZ3RoID0gMDsKKyAgfQorfSk7CitQ b29sZWRDbGFzcy5hZGRQb29saW5nVG8oVG9wTGV2ZWxDYWxsYmFja0Jvb2tLZWVwaW5nLCBQb29s ZWRDbGFzcy50d29Bcmd1bWVudFBvb2xlcik7CisKK2Z1bmN0aW9uIGhhbmRsZVRvcExldmVsSW1w bChib29rS2VlcGluZykgeworICB2YXIgbmF0aXZlRXZlbnRUYXJnZXQgPSBnZXRFdmVudFRhcmdl dChib29rS2VlcGluZy5uYXRpdmVFdmVudCk7CisgIHZhciB0YXJnZXRJbnN0ID0gUmVhY3RET01D b21wb25lbnRUcmVlLmdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5hdGl2ZUV2ZW50VGFyZ2V0 KTsKKworICAvLyBMb29wIHRocm91Z2ggdGhlIGhpZXJhcmNoeSwgaW4gY2FzZSB0aGVyZSdzIGFu eSBuZXN0ZWQgY29tcG9uZW50cy4KKyAgLy8gSXQncyBpbXBvcnRhbnQgdGhhdCB3ZSBidWlsZCB0 aGUgYXJyYXkgb2YgYW5jZXN0b3JzIGJlZm9yZSBjYWxsaW5nIGFueQorICAvLyBldmVudCBoYW5k bGVycywgYmVjYXVzZSBldmVudCBoYW5kbGVycyBjYW4gbW9kaWZ5IHRoZSBET00sIGxlYWRpbmcg dG8KKyAgLy8gaW5jb25zaXN0ZW5jaWVzIHdpdGggUmVhY3RNb3VudCdzIG5vZGUgY2FjaGUuIFNl ZSAjMTEwNS4KKyAgdmFyIGFuY2VzdG9yID0gdGFyZ2V0SW5zdDsKKyAgZG8geworICAgIGJvb2tL ZWVwaW5nLmFuY2VzdG9ycy5wdXNoKGFuY2VzdG9yKTsKKyAgICBhbmNlc3RvciA9IGFuY2VzdG9y ICYmIGZpbmRQYXJlbnQoYW5jZXN0b3IpOworICB9IHdoaWxlIChhbmNlc3Rvcik7CisKKyAgZm9y ICh2YXIgaSA9IDA7IGkgPCBib29rS2VlcGluZy5hbmNlc3RvcnMubGVuZ3RoOyBpKyspIHsKKyAg ICB0YXJnZXRJbnN0ID0gYm9va0tlZXBpbmcuYW5jZXN0b3JzW2ldOworICAgIFJlYWN0RXZlbnRM aXN0ZW5lci5faGFuZGxlVG9wTGV2ZWwoYm9va0tlZXBpbmcudG9wTGV2ZWxUeXBlLCB0YXJnZXRJ bnN0LCBib29rS2VlcGluZy5uYXRpdmVFdmVudCwgZ2V0RXZlbnRUYXJnZXQoYm9va0tlZXBpbmcu bmF0aXZlRXZlbnQpKTsKKyAgfQorfQorCitmdW5jdGlvbiBzY3JvbGxWYWx1ZU1vbml0b3IoY2Ip IHsKKyAgdmFyIHNjcm9sbFBvc2l0aW9uID0gZ2V0VW5ib3VuZGVkU2Nyb2xsUG9zaXRpb24od2lu ZG93KTsKKyAgY2Ioc2Nyb2xsUG9zaXRpb24pOworfQorCit2YXIgUmVhY3RFdmVudExpc3RlbmVy ID0geworICBfZW5hYmxlZDogdHJ1ZSwKKyAgX2hhbmRsZVRvcExldmVsOiBudWxsLAorCisgIFdJ TkRPV19IQU5ETEU6IEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSA/IHdpbmRvdyA6IG51 bGwsCisKKyAgc2V0SGFuZGxlVG9wTGV2ZWw6IGZ1bmN0aW9uIChoYW5kbGVUb3BMZXZlbCkgewor ICAgIFJlYWN0RXZlbnRMaXN0ZW5lci5faGFuZGxlVG9wTGV2ZWwgPSBoYW5kbGVUb3BMZXZlbDsK KyAgfSwKKworICBzZXRFbmFibGVkOiBmdW5jdGlvbiAoZW5hYmxlZCkgeworICAgIFJlYWN0RXZl bnRMaXN0ZW5lci5fZW5hYmxlZCA9ICEhZW5hYmxlZDsKKyAgfSwKKworICBpc0VuYWJsZWQ6IGZ1 bmN0aW9uICgpIHsKKyAgICByZXR1cm4gUmVhY3RFdmVudExpc3RlbmVyLl9lbmFibGVkOworICB9 LAorCisgIC8qKgorICAgKiBUcmFwcyB0b3AtbGV2ZWwgZXZlbnRzIGJ5IHVzaW5nIGV2ZW50IGJ1 YmJsaW5nLgorICAgKgorICAgKiBAcGFyYW0ge3N0cmluZ30gdG9wTGV2ZWxUeXBlIFJlY29yZCBm cm9tIGBFdmVudENvbnN0YW50c2AuCisgICAqIEBwYXJhbSB7c3RyaW5nfSBoYW5kbGVyQmFzZU5h bWUgRXZlbnQgbmFtZSAoZS5nLiAiY2xpY2siKS4KKyAgICogQHBhcmFtIHtvYmplY3R9IGVsZW1l bnQgRWxlbWVudCBvbiB3aGljaCB0byBhdHRhY2ggbGlzdGVuZXIuCisgICAqIEByZXR1cm4gez9v YmplY3R9IEFuIG9iamVjdCB3aXRoIGEgcmVtb3ZlIGZ1bmN0aW9uIHdoaWNoIHdpbGwgZm9yY2Vm dWxseQorICAgKiAgICAgICAgICAgICAgICAgIHJlbW92ZSB0aGUgbGlzdGVuZXIuCisgICAqIEBp bnRlcm5hbAorICAgKi8KKyAgdHJhcEJ1YmJsZWRFdmVudDogZnVuY3Rpb24gKHRvcExldmVsVHlw ZSwgaGFuZGxlckJhc2VOYW1lLCBlbGVtZW50KSB7CisgICAgaWYgKCFlbGVtZW50KSB7CisgICAg ICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgcmV0dXJuIEV2ZW50TGlzdGVuZXIubGlzdGVuKGVs ZW1lbnQsIGhhbmRsZXJCYXNlTmFtZSwgUmVhY3RFdmVudExpc3RlbmVyLmRpc3BhdGNoRXZlbnQu YmluZChudWxsLCB0b3BMZXZlbFR5cGUpKTsKKyAgfSwKKworICAvKioKKyAgICogVHJhcHMgYSB0 b3AtbGV2ZWwgZXZlbnQgYnkgdXNpbmcgZXZlbnQgY2FwdHVyaW5nLgorICAgKgorICAgKiBAcGFy YW0ge3N0cmluZ30gdG9wTGV2ZWxUeXBlIFJlY29yZCBmcm9tIGBFdmVudENvbnN0YW50c2AuCisg ICAqIEBwYXJhbSB7c3RyaW5nfSBoYW5kbGVyQmFzZU5hbWUgRXZlbnQgbmFtZSAoZS5nLiAiY2xp Y2siKS4KKyAgICogQHBhcmFtIHtvYmplY3R9IGVsZW1lbnQgRWxlbWVudCBvbiB3aGljaCB0byBh dHRhY2ggbGlzdGVuZXIuCisgICAqIEByZXR1cm4gez9vYmplY3R9IEFuIG9iamVjdCB3aXRoIGEg cmVtb3ZlIGZ1bmN0aW9uIHdoaWNoIHdpbGwgZm9yY2VmdWxseQorICAgKiAgICAgICAgICAgICAg ICAgIHJlbW92ZSB0aGUgbGlzdGVuZXIuCisgICAqIEBpbnRlcm5hbAorICAgKi8KKyAgdHJhcENh cHR1cmVkRXZlbnQ6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIGhhbmRsZXJCYXNlTmFtZSwgZWxl bWVudCkgeworICAgIGlmICghZWxlbWVudCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQor ICAgIHJldHVybiBFdmVudExpc3RlbmVyLmNhcHR1cmUoZWxlbWVudCwgaGFuZGxlckJhc2VOYW1l LCBSZWFjdEV2ZW50TGlzdGVuZXIuZGlzcGF0Y2hFdmVudC5iaW5kKG51bGwsIHRvcExldmVsVHlw ZSkpOworICB9LAorCisgIG1vbml0b3JTY3JvbGxWYWx1ZTogZnVuY3Rpb24gKHJlZnJlc2gpIHsK KyAgICB2YXIgY2FsbGJhY2sgPSBzY3JvbGxWYWx1ZU1vbml0b3IuYmluZChudWxsLCByZWZyZXNo KTsKKyAgICBFdmVudExpc3RlbmVyLmxpc3Rlbih3aW5kb3csICdzY3JvbGwnLCBjYWxsYmFjayk7 CisgIH0sCisKKyAgZGlzcGF0Y2hFdmVudDogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgbmF0aXZl RXZlbnQpIHsKKyAgICBpZiAoIVJlYWN0RXZlbnRMaXN0ZW5lci5fZW5hYmxlZCkgeworICAgICAg cmV0dXJuOworICAgIH0KKworICAgIHZhciBib29rS2VlcGluZyA9IFRvcExldmVsQ2FsbGJhY2tC b29rS2VlcGluZy5nZXRQb29sZWQodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCk7CisgICAgdHJ5 IHsKKyAgICAgIC8vIEV2ZW50IHF1ZXVlIGJlaW5nIHByb2Nlc3NlZCBpbiB0aGUgc2FtZSBjeWNs ZSBhbGxvd3MKKyAgICAgIC8vIGBwcmV2ZW50RGVmYXVsdGAuCisgICAgICBSZWFjdFVwZGF0ZXMu YmF0Y2hlZFVwZGF0ZXMoaGFuZGxlVG9wTGV2ZWxJbXBsLCBib29rS2VlcGluZyk7CisgICAgfSBm aW5hbGx5IHsKKyAgICAgIFRvcExldmVsQ2FsbGJhY2tCb29rS2VlcGluZy5yZWxlYXNlKGJvb2tL ZWVwaW5nKTsKKyAgICB9CisgIH0KK307CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RFdmVudExp c3RlbmVyOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2Fk bWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdEZlYXR1cmVGbGFncy5qcyBiL3dl Yi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdEZlYXR1cmVGbGFncy5q cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uMjdiOGNhZjUKLS0tIC9kZXYv bnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RG ZWF0dXJlRmxhZ3MuanMKQEAgLTAsMCArMSwyMSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1w cmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBU aGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBm b3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhp cyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBj YW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisg KgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgUmVhY3RGZWF0dXJlRmxhZ3MgPSB7 CisgIC8vIFdoZW4gdHJ1ZSwgY2FsbCBjb25zb2xlLnRpbWUoKSBiZWZvcmUgYW5kIC50aW1lRW5k KCkgYWZ0ZXIgZWFjaCB0b3AtbGV2ZWwKKyAgLy8gcmVuZGVyIChib3RoIGluaXRpYWwgcmVuZGVy cyBhbmQgdXBkYXRlcykuIFVzZWZ1bCB3aGVuIGxvb2tpbmcgYXQgcHJvZC1tb2RlCisgIC8vIHRp bWVsaW5lIHByb2ZpbGVzIGluIENocm9tZSwgZm9yIGV4YW1wbGUuCisgIGxvZ1RvcExldmVsUmVu ZGVyczogZmFsc2UKK307CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RGZWF0dXJlRmxhZ3M7Clwg Tm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGlj L3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0RmliZXIuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMv dmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RGaWJlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMC4uMDc3MzdlY2MKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9z dGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RGaWJlci5qcwpAQCAtMCwwICsxLDE5MCBA QAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxs IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVu ZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBp biB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBn cmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmls ZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOwor Cit2YXIgUmVhY3RUeXBlT2ZXb3JrID0gcmVxdWlyZSgnLi9SZWFjdFR5cGVPZldvcmsnKTsKK3Zh ciBJbmRldGVybWluYXRlQ29tcG9uZW50ID0gUmVhY3RUeXBlT2ZXb3JrLkluZGV0ZXJtaW5hdGVD b21wb25lbnQsCisgICAgQ2xhc3NDb21wb25lbnQgPSBSZWFjdFR5cGVPZldvcmsuQ2xhc3NDb21w b25lbnQsCisgICAgSG9zdENvbnRhaW5lciA9IFJlYWN0VHlwZU9mV29yay5Ib3N0Q29udGFpbmVy LAorICAgIEhvc3RDb21wb25lbnQgPSBSZWFjdFR5cGVPZldvcmsuSG9zdENvbXBvbmVudCwKKyAg ICBDb3JvdXRpbmVDb21wb25lbnQgPSBSZWFjdFR5cGVPZldvcmsuQ29yb3V0aW5lQ29tcG9uZW50 LAorICAgIFlpZWxkQ29tcG9uZW50ID0gUmVhY3RUeXBlT2ZXb3JrLllpZWxkQ29tcG9uZW50Owor Cit2YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuL1JlYWN0UHJpb3JpdHlMZXZlbCcpLAorICAgIE5v V29yayA9IF9yZXF1aXJlLk5vV29yazsKKworLy8gQW4gSW5zdGFuY2UgaXMgc2hhcmVkIGJldHdl ZW4gYWxsIHZlcnNpb25zIG9mIGEgY29tcG9uZW50LiBXZSBjYW4gZWFzaWx5CisvLyBicmVhayB0 aGlzIG91dCBpbnRvIGEgc2VwYXJhdGUgb2JqZWN0IHRvIGF2b2lkIGNvcHlpbmcgc28gbXVjaCB0 byB0aGUKKy8vIGFsdGVybmF0ZSB2ZXJzaW9ucyBvZiB0aGUgdHJlZS4gV2UgcHV0IHRoaXMgb24g YSBzaW5nbGUgb2JqZWN0IGZvciBub3cgdG8KKy8vIG1pbmltaXplIHRoZSBudW1iZXIgb2Ygb2Jq ZWN0cyBjcmVhdGVkIGR1cmluZyB0aGUgaW5pdGlhbCByZW5kZXIuCisKKworLy8gQSBGaWJlciBp cyB3b3JrIG9uIGEgQ29tcG9uZW50IHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBvciB3YXMgZG9uZS4g VGhlcmUgY2FuCisvLyBiZSBtb3JlIHRoYW4gb25lIHBlciBjb21wb25lbnQuCisKKworLy8gVGhp cyBpcyBhIGNvbnN0cnVjdG9yIG9mIGEgUE9KTyBpbnN0ZWFkIG9mIGEgY29uc3RydWN0b3IgZnVu Y3Rpb24gZm9yIGEgZmV3CisvLyByZWFzb25zOgorLy8gMSkgTm9ib2R5IHNob3VsZCBhZGQgYW55 IGluc3RhbmNlIG1ldGhvZHMgb24gdGhpcy4gSW5zdGFuY2UgbWV0aG9kcyBjYW4gYmUKKy8vICAg IG1vcmUgZGlmZmljdWx0IHRvIHByZWRpY3Qgd2hlbiB0aGV5IGdldCBvcHRpbWl6ZWQgYW5kIHRo ZXkgYXJlIGFsbW9zdAorLy8gICAgbmV2ZXIgaW5saW5lZCBwcm9wZXJseSBpbiBzdGF0aWMgY29t cGlsZXJzLgorLy8gMikgTm9ib2R5IHNob3VsZCByZWx5IG9uIGBpbnN0YW5jZW9mIEZpYmVyYCBm b3IgdHlwZSB0ZXN0aW5nLiBXZSBzaG91bGQKKy8vICAgIGFsd2F5cyBrbm93IHdoZW4gaXQgaXMg YSBmaWJlci4KKy8vIDMpIFdlIGNhbiBlYXNpbHkgZ28gZnJvbSBhIGNyZWF0ZUZpYmVyIGNhbGwg dG8gY2FsbGluZyBhIGNvbnN0cnVjdG9yIGlmIHRoYXQKKy8vICAgIGlzIGZhc3Rlci4gVGhlIG9w cG9zaXRlIGlzIG5vdCB0cnVlLgorLy8gNCkgV2UgbWlnaHQgd2FudCB0byBleHBlcmltZW50IHdp dGggdXNpbmcgbnVtZXJpYyBrZXlzIHNpbmNlIHRoZXkgYXJlIGVhc2llcgorLy8gICAgdG8gb3B0 aW1pemUgaW4gYSBub24tSklUIGVudmlyb25tZW50LgorLy8gNSkgSXQgc2hvdWxkIGJlIGVhc3kg dG8gcG9ydCB0aGlzIHRvIGEgQyBzdHJ1Y3QgYW5kIGtlZXAgYSBDIGltcGxlbWVudGF0aW9uCisv LyAgICBjb21wYXRpYmxlLgordmFyIGNyZWF0ZUZpYmVyID0gZnVuY3Rpb24gKHRhZywga2V5KSB7 CisgIHJldHVybiB7CisKKyAgICAvLyBJbnN0YW5jZQorCisgICAgdGFnOiB0YWcsCisKKyAgICBr ZXk6IGtleSwKKworICAgIHR5cGU6IG51bGwsCisKKyAgICBzdGF0ZU5vZGU6IG51bGwsCisKKyAg ICAvLyBGaWJlcgorCisgICAgJ3JldHVybic6IG51bGwsCisKKyAgICBjaGlsZDogbnVsbCwKKyAg ICBzaWJsaW5nOiBudWxsLAorCisgICAgcmVmOiBudWxsLAorCisgICAgcGVuZGluZ1Byb3BzOiBu dWxsLAorICAgIG1lbW9pemVkUHJvcHM6IG51bGwsCisgICAgdXBkYXRlUXVldWU6IG51bGwsCisg ICAgbWVtb2l6ZWRTdGF0ZTogbnVsbCwKKyAgICBjYWxsYmFja0xpc3Q6IG51bGwsCisgICAgb3V0 cHV0OiBudWxsLAorCisgICAgbmV4dEVmZmVjdDogbnVsbCwKKyAgICBmaXJzdEVmZmVjdDogbnVs bCwKKyAgICBsYXN0RWZmZWN0OiBudWxsLAorCisgICAgcGVuZGluZ1dvcmtQcmlvcml0eTogTm9X b3JrLAorICAgIHByb2dyZXNzZWRQcmlvcml0eTogTm9Xb3JrLAorICAgIHByb2dyZXNzZWRDaGls ZDogbnVsbCwKKworICAgIGFsdGVybmF0ZTogbnVsbAorCisgIH07Cit9OworCitmdW5jdGlvbiBz aG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7CisgIHJldHVybiAhIShDb21wb25lbnQucHJvdG90 eXBlICYmIENvbXBvbmVudC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7Cit9CisKKy8vIFRo aXMgaXMgdXNlZCB0byBjcmVhdGUgYW4gYWx0ZXJuYXRlIGZpYmVyIHRvIGRvIHdvcmsgb24uCisv LyBUT0RPOiBSZW5hbWUgdG8gY3JlYXRlV29ya0luUHJvZ3Jlc3NGaWJlciBvciBzb21ldGhpbmcg bGlrZSB0aGF0LgorZXhwb3J0cy5jbG9uZUZpYmVyID0gZnVuY3Rpb24gKGZpYmVyLCBwcmlvcml0 eUxldmVsKSB7CisgIC8vIFdlIGNsb25lIHRvIGdldCBhIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoYXQg bWVhbnMgdGhhdCB0aGlzIGZpYmVyIGlzIHRoZQorICAvLyBjdXJyZW50LiBUbyBtYWtlIGl0IHNh ZmUgdG8gcmV1c2UgdGhhdCBmaWJlciBsYXRlciBvbiBhcyB3b3JrIGluIHByb2dyZXNzCisgIC8v IHdlIG5lZWQgdG8gcmVzZXQgaXRzIHdvcmsgaW4gcHJvZ3Jlc3MgZmxhZyBub3cuIFdlIGRvbid0 IGhhdmUgYW4KKyAgLy8gb3Bwb3J0dW5pdHkgdG8gZG8gdGhpcyBlYXJsaWVyIHNpbmNlIHdlIGRv bid0IHRyYXZlcnNlIHRoZSB0cmVlIHdoZW4KKyAgLy8gdGhlIHdvcmsgaW4gcHJvZ3Jlc3MgdHJl ZSBiZWNvbWVzIHRoZSBjdXJyZW50IHRyZWUuCisgIC8vIGZpYmVyLnByb2dyZXNzZWRQcmlvcml0 eSA9IE5vV29yazsKKyAgLy8gZmliZXIucHJvZ3Jlc3NlZENoaWxkID0gbnVsbDsKKworICAvLyBX ZSB1c2UgYSBkb3VibGUgYnVmZmVyaW5nIHBvb2xpbmcgdGVjaG5pcXVlIGJlY2F1c2Ugd2Uga25v dyB0aGF0IHdlJ2xsIG9ubHkKKyAgLy8gZXZlciBuZWVkIGF0IG1vc3QgdHdvIHZlcnNpb25zIG9m IGEgdHJlZS4gV2UgcG9vbCB0aGUgIm90aGVyIiB1bnVzZWQgbm9kZQorICAvLyB0aGF0IHdlJ3Jl IGZyZWUgdG8gcmV1c2UuIFRoaXMgaXMgbGF6aWx5IGNyZWF0ZWQgdG8gYXZvaWQgYWxsb2NhdGlu ZyBleHRyYQorICAvLyBvYmplY3RzIGZvciB0aGluZ3MgdGhhdCBhcmUgbmV2ZXIgdXBkYXRlZC4g SXQgYWxzbyBhbGxvdyB1cyB0byByZWNsYWltIHRoZQorICAvLyBleHRyYSBtZW1vcnkgaWYgbmVl ZGVkLgorICB2YXIgYWx0ID0gZmliZXIuYWx0ZXJuYXRlOworICBpZiAoYWx0KSB7CisgICAgLy8g V2hlbmV2ZXIgd2UgY2xvbmUsIHdlIGRvIHNvIHRvIGdldCBhIG5ldyB3b3JrIGluIHByb2dyZXNz LgorICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHdlJ3ZlIHJlc2V0IHRoZXNlIGluIHRoZSBuZXcg dHJlZS4KKyAgICBhbHQubmV4dEVmZmVjdCA9IG51bGw7CisgICAgYWx0LmZpcnN0RWZmZWN0ID0g bnVsbDsKKyAgICBhbHQubGFzdEVmZmVjdCA9IG51bGw7CisgIH0gZWxzZSB7CisgICAgLy8gVGhp cyBzaG91bGQgbm90IGhhdmUgYW4gYWx0ZXJuYXRlIGFscmVhZHkKKyAgICBhbHQgPSBjcmVhdGVG aWJlcihmaWJlci50YWcsIGZpYmVyLmtleSk7CisgICAgYWx0LnR5cGUgPSBmaWJlci50eXBlOwor CisgICAgYWx0LnByb2dyZXNzZWRDaGlsZCA9IGZpYmVyLnByb2dyZXNzZWRDaGlsZDsKKyAgICBh bHQucHJvZ3Jlc3NlZFByaW9yaXR5ID0gZmliZXIucHJvZ3Jlc3NlZFByaW9yaXR5OworCisgICAg YWx0LmFsdGVybmF0ZSA9IGZpYmVyOworICAgIGZpYmVyLmFsdGVybmF0ZSA9IGFsdDsKKyAgfQor CisgIGFsdC5zdGF0ZU5vZGUgPSBmaWJlci5zdGF0ZU5vZGU7CisgIGFsdC5jaGlsZCA9IGZpYmVy LmNoaWxkOworICBhbHQuc2libGluZyA9IGZpYmVyLnNpYmxpbmc7IC8vIFRoaXMgc2hvdWxkIGFs d2F5cyBiZSBvdmVycmlkZGVuLiBUT0RPOiBudWxsCisgIGFsdC5yZWYgPSBmaWJlci5yZWY7Cisg IC8vIHBlbmRpbmdQcm9wcyBpcyBoZXJlIGZvciBzeW1tZXRyeSBidXQgaXMgdW5uZWNlc3Nhcnkg aW4gcHJhY3RpY2UgZm9yIG5vdy4KKyAgLy8gVE9ETzogUGFzcyBpbiB0aGUgbmV3IHBlbmRpbmdQ cm9wcyBhcyBhbiBhcmd1bWVudCBtYXliZT8KKyAgYWx0LnBlbmRpbmdQcm9wcyA9IGZpYmVyLnBl bmRpbmdQcm9wczsKKyAgYWx0LnVwZGF0ZVF1ZXVlID0gZmliZXIudXBkYXRlUXVldWU7CisgIGFs dC5jYWxsYmFja0xpc3QgPSBmaWJlci5jYWxsYmFja0xpc3Q7CisgIGFsdC5wZW5kaW5nV29ya1By aW9yaXR5ID0gcHJpb3JpdHlMZXZlbDsKKworICBhbHQubWVtb2l6ZWRQcm9wcyA9IGZpYmVyLm1l bW9pemVkUHJvcHM7CisgIGFsdC5vdXRwdXQgPSBmaWJlci5vdXRwdXQ7CisKKyAgcmV0dXJuIGFs dDsKK307CisKK2V4cG9ydHMuY3JlYXRlSG9zdENvbnRhaW5lckZpYmVyID0gZnVuY3Rpb24gKCkg eworICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihIb3N0Q29udGFpbmVyLCBudWxsKTsKKyAgcmV0 dXJuIGZpYmVyOworfTsKKworZXhwb3J0cy5jcmVhdGVGaWJlckZyb21FbGVtZW50ID0gZnVuY3Rp b24gKGVsZW1lbnQsIHByaW9yaXR5TGV2ZWwpIHsKKyAgLy8gJEZsb3dGaXhNZTogUmVhY3RFbGVt ZW50LmtleSBpcyBjdXJyZW50bHkgZGVmaW5lZCBhcyA/c3RyaW5nIGJ1dCBzaG91bGQgYmUgZGVm aW5lZCBhcyBudWxsIHwgc3RyaW5nIGluIEZsb3cuCisgIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVy RnJvbUVsZW1lbnRUeXBlKGVsZW1lbnQudHlwZSwgZWxlbWVudC5rZXkpOworICBmaWJlci5wZW5k aW5nUHJvcHMgPSBlbGVtZW50LnByb3BzOworICBmaWJlci5wZW5kaW5nV29ya1ByaW9yaXR5ID0g cHJpb3JpdHlMZXZlbDsKKyAgcmV0dXJuIGZpYmVyOworfTsKKworZnVuY3Rpb24gY3JlYXRlRmli ZXJGcm9tRWxlbWVudFR5cGUodHlwZSwga2V5KSB7CisgIHZhciBmaWJlciA9IHZvaWQgMDsKKyAg aWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7CisgICAgZmliZXIgPSBzaG91bGRDb25z dHJ1Y3QodHlwZSkgPyBjcmVhdGVGaWJlcihDbGFzc0NvbXBvbmVudCwga2V5KSA6IGNyZWF0ZUZp YmVyKEluZGV0ZXJtaW5hdGVDb21wb25lbnQsIGtleSk7CisgICAgZmliZXIudHlwZSA9IHR5cGU7 CisgIH0gZWxzZSBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7CisgICAgZmliZXIgPSBj cmVhdGVGaWJlcihIb3N0Q29tcG9uZW50LCBrZXkpOworICAgIGZpYmVyLnR5cGUgPSB0eXBlOwor ICB9IGVsc2UgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7 CisgICAgLy8gQ3VycmVudGx5IGFzc3VtZWQgdG8gYmUgYSBjb250aW51YXRpb24gYW5kIHRoZXJl Zm9yZSBpcyBhIGZpYmVyIGFscmVhZHkuCisgICAgZmliZXIgPSB0eXBlOworICB9IGVsc2Ugewor ICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBjb21wb25lbnQgdHlwZTogJyArIHR5cGVvZiB0 eXBlKTsKKyAgfQorICByZXR1cm4gZmliZXI7Cit9CisKK2V4cG9ydHMuY3JlYXRlRmliZXJGcm9t RWxlbWVudFR5cGUgPSBjcmVhdGVGaWJlckZyb21FbGVtZW50VHlwZTsKKworZXhwb3J0cy5jcmVh dGVGaWJlckZyb21Db3JvdXRpbmUgPSBmdW5jdGlvbiAoY29yb3V0aW5lLCBwcmlvcml0eUxldmVs KSB7CisgIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKENvcm91dGluZUNvbXBvbmVudCwgY29yb3V0 aW5lLmtleSk7CisgIGZpYmVyLnR5cGUgPSBjb3JvdXRpbmUuaGFuZGxlcjsKKyAgZmliZXIucGVu ZGluZ1Byb3BzID0gY29yb3V0aW5lOworICBmaWJlci5wZW5kaW5nV29ya1ByaW9yaXR5ID0gcHJp b3JpdHlMZXZlbDsKKyAgcmV0dXJuIGZpYmVyOworfTsKKworZXhwb3J0cy5jcmVhdGVGaWJlckZy b21ZaWVsZCA9IGZ1bmN0aW9uICh5aWVsZE5vZGUsIHByaW9yaXR5TGV2ZWwpIHsKKyAgdmFyIGZp YmVyID0gY3JlYXRlRmliZXIoWWllbGRDb21wb25lbnQsIHlpZWxkTm9kZS5rZXkpOworICBmaWJl ci5wZW5kaW5nUHJvcHMgPSB7fTsKKyAgcmV0dXJuIGZpYmVyOworfTsKXCBObyBuZXdsaW5lIGF0 IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0 LWRvbS9saWIvUmVhY3RGaWJlckJlZ2luV29yay5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5k b3IvcmVhY3QtZG9tL2xpYi9SZWFjdEZpYmVyQmVnaW5Xb3JrLmpzCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAwLi45NTlhMWQzMwotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2Fk bWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdEZpYmVyQmVnaW5Xb3JrLmpzCkBA IC0wLDAgKzEsMzgwIEBACisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29r LCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUg aXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICog TElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBB biBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0 aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisn dXNlIHN0cmljdCc7CisKK3ZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4vUmVhY3RDaGlsZEZpYmVy JyksCisgICAgcmVjb25jaWxlQ2hpbGRGaWJlcnMgPSBfcmVxdWlyZS5yZWNvbmNpbGVDaGlsZEZp YmVycywKKyAgICByZWNvbmNpbGVDaGlsZEZpYmVyc0luUGxhY2UgPSBfcmVxdWlyZS5yZWNvbmNp bGVDaGlsZEZpYmVyc0luUGxhY2UsCisgICAgY2xvbmVDaGlsZEZpYmVycyA9IF9yZXF1aXJlLmNs b25lQ2hpbGRGaWJlcnM7CisKK3ZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuL1JlYWN0UHJpb3Jp dHlMZXZlbCcpLAorICAgIExvd1ByaW9yaXR5ID0gX3JlcXVpcmUyLkxvd1ByaW9yaXR5OworCit2 YXIgUmVhY3RUeXBlT2ZXb3JrID0gcmVxdWlyZSgnLi9SZWFjdFR5cGVPZldvcmsnKTsKK3ZhciBJ bmRldGVybWluYXRlQ29tcG9uZW50ID0gUmVhY3RUeXBlT2ZXb3JrLkluZGV0ZXJtaW5hdGVDb21w b25lbnQsCisgICAgRnVuY3Rpb25hbENvbXBvbmVudCA9IFJlYWN0VHlwZU9mV29yay5GdW5jdGlv bmFsQ29tcG9uZW50LAorICAgIENsYXNzQ29tcG9uZW50ID0gUmVhY3RUeXBlT2ZXb3JrLkNsYXNz Q29tcG9uZW50LAorICAgIEhvc3RDb250YWluZXIgPSBSZWFjdFR5cGVPZldvcmsuSG9zdENvbnRh aW5lciwKKyAgICBIb3N0Q29tcG9uZW50ID0gUmVhY3RUeXBlT2ZXb3JrLkhvc3RDb21wb25lbnQs CisgICAgQ29yb3V0aW5lQ29tcG9uZW50ID0gUmVhY3RUeXBlT2ZXb3JrLkNvcm91dGluZUNvbXBv bmVudCwKKyAgICBDb3JvdXRpbmVIYW5kbGVyUGhhc2UgPSBSZWFjdFR5cGVPZldvcmsuQ29yb3V0 aW5lSGFuZGxlclBoYXNlLAorICAgIFlpZWxkQ29tcG9uZW50ID0gUmVhY3RUeXBlT2ZXb3JrLllp ZWxkQ29tcG9uZW50OworCit2YXIgX3JlcXVpcmUzID0gcmVxdWlyZSgnLi9SZWFjdFByaW9yaXR5 TGV2ZWwnKSwKKyAgICBOb1dvcmsgPSBfcmVxdWlyZTMuTm9Xb3JrLAorICAgIE9mZnNjcmVlblBy aW9yaXR5ID0gX3JlcXVpcmUzLk9mZnNjcmVlblByaW9yaXR5OworCit2YXIgX3JlcXVpcmU0ID0g cmVxdWlyZSgnLi9SZWFjdEZpYmVyVXBkYXRlUXVldWUnKSwKKyAgICBjcmVhdGVVcGRhdGVRdWV1 ZSA9IF9yZXF1aXJlNC5jcmVhdGVVcGRhdGVRdWV1ZSwKKyAgICBhZGRUb1F1ZXVlID0gX3JlcXVp cmU0LmFkZFRvUXVldWUsCisgICAgYWRkQ2FsbGJhY2tUb1F1ZXVlID0gX3JlcXVpcmU0LmFkZENh bGxiYWNrVG9RdWV1ZSwKKyAgICBtZXJnZVVwZGF0ZVF1ZXVlID0gX3JlcXVpcmU0Lm1lcmdlVXBk YXRlUXVldWU7CisKK3ZhciBSZWFjdEluc3RhbmNlTWFwID0gcmVxdWlyZSgnLi9SZWFjdEluc3Rh bmNlTWFwJyk7CisKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNvbmZpZywgZ2V0U2NoZWR1 bGVyKSB7CisKKyAgZnVuY3Rpb24gbWFya0NoaWxkQXNQcm9ncmVzc2VkKGN1cnJlbnQsIHdvcmtJ blByb2dyZXNzLCBwcmlvcml0eUxldmVsKSB7CisgICAgLy8gV2Ugbm93IGhhdmUgY2xvbmVzLiBM ZXQncyBzdG9yZSB0aGVtIGFzIHRoZSBjdXJyZW50bHkgcHJvZ3Jlc3NlZCB3b3JrLgorICAgIHdv cmtJblByb2dyZXNzLnByb2dyZXNzZWRDaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkOworICAg IHdvcmtJblByb2dyZXNzLnByb2dyZXNzZWRQcmlvcml0eSA9IHByaW9yaXR5TGV2ZWw7CisgICAg aWYgKGN1cnJlbnQpIHsKKyAgICAgIC8vIFdlIGFsc28gc3RvcmUgaXQgb24gdGhlIGN1cnJlbnQu IFdoZW4gdGhlIGFsdGVybmF0ZSBzd2FwcyBpbiB3ZSBjYW4KKyAgICAgIC8vIGNvbnRpbnVlIGZy b20gdGhpcyBwb2ludC4KKyAgICAgIGN1cnJlbnQucHJvZ3Jlc3NlZENoaWxkID0gd29ya0luUHJv Z3Jlc3MucHJvZ3Jlc3NlZENoaWxkOworICAgICAgY3VycmVudC5wcm9ncmVzc2VkUHJpb3JpdHkg PSB3b3JrSW5Qcm9ncmVzcy5wcm9ncmVzc2VkUHJpb3JpdHk7CisgICAgfQorICB9CisKKyAgZnVu Y3Rpb24gcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGls ZHJlbikgeworICAgIHZhciBwcmlvcml0eUxldmVsID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1dv cmtQcmlvcml0eTsKKyAgICByZWNvbmNpbGVDaGlsZHJlbkF0UHJpb3JpdHkoY3VycmVudCwgd29y a0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcHJpb3JpdHlMZXZlbCk7CisgIH0KKworICBmdW5j dGlvbiByZWNvbmNpbGVDaGlsZHJlbkF0UHJpb3JpdHkoY3VycmVudCwgd29ya0luUHJvZ3Jlc3Ms IG5leHRDaGlsZHJlbiwgcHJpb3JpdHlMZXZlbCkgeworICAgIC8vIEF0IHRoaXMgcG9pbnQgYW55 IG1lbW9pemF0aW9uIGlzIG5vIGxvbmdlciB2YWxpZCBzaW5jZSB3ZSdsbCBoYXZlIGNoYW5nZWQK KyAgICAvLyB0aGUgY2hpbGRyZW4uCisgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9 IG51bGw7CisgICAgaWYgKGN1cnJlbnQgJiYgY3VycmVudC5jaGlsZCA9PT0gd29ya0luUHJvZ3Jl c3MuY2hpbGQpIHsKKyAgICAgIC8vIElmIHRoZSBjdXJyZW50IGNoaWxkIGlzIHRoZSBzYW1lIGFz IHRoZSB3b3JrIGluIHByb2dyZXNzLCBpdCBtZWFucyB0aGF0CisgICAgICAvLyB3ZSBoYXZlbid0 IHlldCBzdGFydGVkIGFueSB3b3JrIG9uIHRoZXNlIGNoaWxkcmVuLiBUaGVyZWZvcmUsIHdlIHVz ZQorICAgICAgLy8gdGhlIGNsb25lIGFsZ29yaXRobSB0byBjcmVhdGUgYSBjb3B5IG9mIGFsbCB0 aGUgY3VycmVudCBjaGlsZHJlbi4KKyAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVjb25j aWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLmNoaWxkLCBuZXh0 Q2hpbGRyZW4sIHByaW9yaXR5TGV2ZWwpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBJZiwgb24g dGhlIG90aGVyIGhhbmQsIHdlIGRvbid0IGhhdmUgYSBjdXJyZW50IGZpYmVyIG9yIGlmIGl0IGlz CisgICAgICAvLyBhbHJlYWR5IHVzaW5nIGEgY2xvbmUsIHRoYXQgbWVhbnMgd2UndmUgYWxyZWFk eSBiZWd1biBzb21lIHdvcmsgb24gdGhpcworICAgICAgLy8gdHJlZSBhbmQgd2UgY2FuIGNvbnRp bnVlIHdoZXJlIHdlIGxlZnQgb2ZmIGJ5IHJlY29uY2lsaW5nIGFnYWluc3QgdGhlCisgICAgICAv LyBleGlzdGluZyBjaGlsZHJlbi4KKyAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVjb25j aWxlQ2hpbGRGaWJlcnNJblBsYWNlKHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy5jaGls ZCwgbmV4dENoaWxkcmVuLCBwcmlvcml0eUxldmVsKTsKKyAgICB9CisgICAgbWFya0NoaWxkQXNQ cm9ncmVzc2VkKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmlvcml0eUxldmVsKTsKKyAgfQor CisgIGZ1bmN0aW9uIHVwZGF0ZUZ1bmN0aW9uYWxDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJv Z3Jlc3MpIHsKKyAgICB2YXIgZm4gPSB3b3JrSW5Qcm9ncmVzcy50eXBlOworICAgIHZhciBwcm9w cyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsKKworICAgIC8vIFRPRE86IERpc2FibGUg dGhpcyBiZWZvcmUgcmVsZWFzZSwgc2luY2UgaXQgaXMgbm90IHBhcnQgb2YgdGhlIHB1YmxpYyBB UEkKKyAgICAvLyBJIHVzZSB0aGlzIGZvciB0ZXN0aW5nIHRvIGNvbXBhcmUgdGhlIHJlbGF0aXZl IG92ZXJoZWFkIG9mIGNsYXNzZXMuCisgICAgaWYgKHR5cGVvZiBmbi5zaG91bGRDb21wb25lbnRV cGRhdGUgPT09ICdmdW5jdGlvbicpIHsKKyAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5tZW1vaXpl ZFByb3BzICE9PSBudWxsKSB7CisgICAgICAgIGlmICghZm4uc2hvdWxkQ29tcG9uZW50VXBkYXRl KHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMsIHByb3BzKSkgeworICAgICAgICAgIHJldHVy biBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTsK KyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHZhciBuZXh0Q2hpbGRyZW4gPSBmbihw cm9wcyk7CisgICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5l eHRDaGlsZHJlbik7CisgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkOworICB9CisKKyAg ZnVuY3Rpb24gc2NoZWR1bGVVcGRhdGUoZmliZXIsIHVwZGF0ZVF1ZXVlLCBwcmlvcml0eUxldmVs KSB7CisgICAgdmFyIF9nZXRTY2hlZHVsZXIgPSBnZXRTY2hlZHVsZXIoKSwKKyAgICAgICAgc2No ZWR1bGVEZWZlcnJlZFdvcmsgPSBfZ2V0U2NoZWR1bGVyLnNjaGVkdWxlRGVmZXJyZWRXb3JrOwor CisgICAgZmliZXIudXBkYXRlUXVldWUgPSB1cGRhdGVRdWV1ZTsKKyAgICAvLyBTY2hlZHVsZSB1 cGRhdGUgb24gdGhlIGFsdGVybmF0ZSBhcyB3ZWxsLCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoaWNo IHRyZWUKKyAgICAvLyBpcyBjdXJyZW50LgorICAgIGlmIChmaWJlci5hbHRlcm5hdGUpIHsKKyAg ICAgIGZpYmVyLmFsdGVybmF0ZS51cGRhdGVRdWV1ZSA9IHVwZGF0ZVF1ZXVlOworICAgIH0KKyAg ICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKGZpYmVyLnBlbmRpbmdXb3JrUHJpb3JpdHkgPT09 IE5vV29yayB8fCBmaWJlci5wZW5kaW5nV29ya1ByaW9yaXR5ID49IHByaW9yaXR5TGV2ZWwpIHsK KyAgICAgICAgZmliZXIucGVuZGluZ1dvcmtQcmlvcml0eSA9IHByaW9yaXR5TGV2ZWw7CisgICAg ICB9CisgICAgICBpZiAoZmliZXIuYWx0ZXJuYXRlKSB7CisgICAgICAgIGlmIChmaWJlci5hbHRl cm5hdGUucGVuZGluZ1dvcmtQcmlvcml0eSA9PT0gTm9Xb3JrIHx8IGZpYmVyLmFsdGVybmF0ZS5w ZW5kaW5nV29ya1ByaW9yaXR5ID49IHByaW9yaXR5TGV2ZWwpIHsKKyAgICAgICAgICBmaWJlci5h bHRlcm5hdGUucGVuZGluZ1dvcmtQcmlvcml0eSA9IHByaW9yaXR5TGV2ZWw7CisgICAgICAgIH0K KyAgICAgIH0KKyAgICAgIC8vIER1Y2sgdHlwZSByb290CisgICAgICBpZiAoZmliZXIuc3RhdGVO b2RlICYmIGZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKSB7CisgICAgICAgIHZhciByb290 ID0gZmliZXIuc3RhdGVOb2RlOworICAgICAgICBzY2hlZHVsZURlZmVycmVkV29yayhyb290LCBw cmlvcml0eUxldmVsKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaWYgKCFmaWJl clsncmV0dXJuJ10pIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyByb290IScpOworICAg ICAgfQorICAgICAgZmliZXIgPSBmaWJlclsncmV0dXJuJ107CisgICAgfQorICB9CisKKyAgLy8g Q2xhc3MgY29tcG9uZW50IHN0YXRlIHVwZGF0ZXIKKyAgdmFyIHVwZGF0ZXIgPSB7CisgICAgZW5x dWV1ZVNldFN0YXRlOiBmdW5jdGlvbiAoaW5zdGFuY2UsIHBhcnRpYWxTdGF0ZSkgeworICAgICAg dmFyIGZpYmVyID0gUmVhY3RJbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpOworICAgICAgdmFyIHVw ZGF0ZVF1ZXVlID0gZmliZXIudXBkYXRlUXVldWUgPyBhZGRUb1F1ZXVlKGZpYmVyLnVwZGF0ZVF1 ZXVlLCBwYXJ0aWFsU3RhdGUpIDogY3JlYXRlVXBkYXRlUXVldWUocGFydGlhbFN0YXRlKTsKKyAg ICAgIHNjaGVkdWxlVXBkYXRlKGZpYmVyLCB1cGRhdGVRdWV1ZSwgTG93UHJpb3JpdHkpOworICAg IH0sCisgICAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKGluc3RhbmNlLCBzdGF0ZSkg eworICAgICAgdmFyIGZpYmVyID0gUmVhY3RJbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpOworICAg ICAgdmFyIHVwZGF0ZVF1ZXVlID0gY3JlYXRlVXBkYXRlUXVldWUoc3RhdGUpOworICAgICAgdXBk YXRlUXVldWUuaXNSZXBsYWNlID0gdHJ1ZTsKKyAgICAgIHNjaGVkdWxlVXBkYXRlKGZpYmVyLCB1 cGRhdGVRdWV1ZSwgTG93UHJpb3JpdHkpOworICAgIH0sCisgICAgZW5xdWV1ZUZvcmNlVXBkYXRl OiBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKKyAgICAgIHZhciBmaWJlciA9IFJlYWN0SW5zdGFuY2VN YXAuZ2V0KGluc3RhbmNlKTsKKyAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGZpYmVyLnVwZGF0ZVF1 ZXVlIHx8IGNyZWF0ZVVwZGF0ZVF1ZXVlKG51bGwpOworICAgICAgdXBkYXRlUXVldWUuaXNGb3Jj ZWQgPSB0cnVlOworICAgICAgc2NoZWR1bGVVcGRhdGUoZmliZXIsIHVwZGF0ZVF1ZXVlLCBMb3dQ cmlvcml0eSk7CisgICAgfSwKKyAgICBlbnF1ZXVlQ2FsbGJhY2s6IGZ1bmN0aW9uIChpbnN0YW5j ZSwgY2FsbGJhY2spIHsKKyAgICAgIHZhciBmaWJlciA9IFJlYWN0SW5zdGFuY2VNYXAuZ2V0KGlu c3RhbmNlKTsKKyAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGZpYmVyLnVwZGF0ZVF1ZXVlID8gZmli ZXIudXBkYXRlUXVldWUgOiBjcmVhdGVVcGRhdGVRdWV1ZShudWxsKTsKKyAgICAgIGFkZENhbGxi YWNrVG9RdWV1ZSh1cGRhdGVRdWV1ZSwgY2FsbGJhY2spOworICAgICAgZmliZXIudXBkYXRlUXVl dWUgPSB1cGRhdGVRdWV1ZTsKKyAgICAgIGlmIChmaWJlci5hbHRlcm5hdGUpIHsKKyAgICAgICAg ZmliZXIuYWx0ZXJuYXRlLnVwZGF0ZVF1ZXVlID0gdXBkYXRlUXVldWU7CisgICAgICB9CisgICAg fQorICB9OworCisgIGZ1bmN0aW9uIHVwZGF0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJ blByb2dyZXNzKSB7CisgICAgLy8gQSBjbGFzcyBjb21wb25lbnQgdXBkYXRlIGlzIHRoZSByZXN1 bHQgb2YgZWl0aGVyIG5ldyBwcm9wcyBvciBuZXcgc3RhdGUuCisgICAgLy8gQWNjb3VudCBmb3Ig dGhlIHBvc3NpYmx5IG9mIG1pc3NpbmcgcGVuZGluZyBwcm9wcyBieSBmYWxsaW5nIGJhY2sgdG8g dGhlCisgICAgLy8gbWVtb2l6ZWQgcHJvcHMuCisgICAgdmFyIHByb3BzID0gd29ya0luUHJvZ3Jl c3MucGVuZGluZ1Byb3BzOworICAgIGlmICghcHJvcHMgJiYgY3VycmVudCkgeworICAgICAgcHJv cHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7CisgICAgfQorICAgIC8vIENvbXB1dGUgdGhlIHN0 YXRlIHVzaW5nIHRoZSBtZW1vaXplZCBzdGF0ZSBhbmQgdGhlIHVwZGF0ZSBxdWV1ZS4KKyAgICB2 YXIgdXBkYXRlUXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTsKKyAgICB2YXIgcHJl dmlvdXNTdGF0ZSA9IGN1cnJlbnQgPyBjdXJyZW50Lm1lbW9pemVkU3RhdGUgOiBudWxsOworICAg IHZhciBzdGF0ZSA9IHVwZGF0ZVF1ZXVlID8gbWVyZ2VVcGRhdGVRdWV1ZSh1cGRhdGVRdWV1ZSwg cHJldmlvdXNTdGF0ZSwgcHJvcHMpIDogcHJldmlvdXNTdGF0ZTsKKworICAgIHZhciBpbnN0YW5j ZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTsKKyAgICBpZiAoIWluc3RhbmNlKSB7CisgICAg ICB2YXIgY3RvciA9IHdvcmtJblByb2dyZXNzLnR5cGU7CisgICAgICB3b3JrSW5Qcm9ncmVzcy5z dGF0ZU5vZGUgPSBpbnN0YW5jZSA9IG5ldyBjdG9yKHByb3BzKTsKKyAgICAgIHN0YXRlID0gaW5z dGFuY2Uuc3RhdGUgfHwgbnVsbDsKKyAgICAgIC8vIFRoZSBpbml0aWFsIHN0YXRlIG11c3QgYmUg YWRkZWQgdG8gdGhlIHVwZGF0ZSBxdWV1ZSBpbiBjYXNlCisgICAgICAvLyBzZXRTdGF0ZSBpcyBj YWxsZWQgYmVmb3JlIHRoZSBpbml0aWFsIHJlbmRlci4KKyAgICAgIGlmIChzdGF0ZSAhPT0gbnVs bCkgeworICAgICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGNyZWF0ZVVwZGF0ZVF1 ZXVlKHN0YXRlKTsKKyAgICAgIH0KKyAgICAgIC8vIFRoZSBpbnN0YW5jZSBuZWVkcyBhY2Nlc3Mg dG8gdGhlIGZpYmVyIHNvIHRoYXQgaXQgY2FuIHNjaGVkdWxlIHVwZGF0ZXMKKyAgICAgIFJlYWN0 SW5zdGFuY2VNYXAuc2V0KGluc3RhbmNlLCB3b3JrSW5Qcm9ncmVzcyk7CisgICAgICBpbnN0YW5j ZS51cGRhdGVyID0gdXBkYXRlcjsKKyAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnN0YW5jZS5zaG91 bGRDb21wb25lbnRVcGRhdGUgPT09ICdmdW5jdGlvbicgJiYgISh1cGRhdGVRdWV1ZSAmJiB1cGRh dGVRdWV1ZS5pc0ZvcmNlZCkpIHsKKyAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFBy b3BzICE9PSBudWxsKSB7CisgICAgICAgIC8vIFJlc2V0IHRoZSBwcm9wcywgaW4gY2FzZSB0aGlz IGlzIGEgcGluZy1wb25nIGNhc2UgcmF0aGVyIHRoYW4gYQorICAgICAgICAvLyBjb21wbGV0ZWQg dXBkYXRlIGNhc2UuIEZvciB0aGUgY29tcGxldGVkIHVwZGF0ZSBjYXNlLCB0aGUgaW5zdGFuY2UK KyAgICAgICAgLy8gcHJvcHMgd2lsbCBhbHJlYWR5IGJlIHRoZSBtZW1vaXplZFByb3BzLgorICAg ICAgICBpbnN0YW5jZS5wcm9wcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7CisgICAg ICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTsKKyAgICAg ICAgaWYgKCFpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUocHJvcHMsIHN0YXRlKSkgewor ICAgICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdv cmtJblByb2dyZXNzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGluc3RhbmNl LnByb3BzID0gcHJvcHM7CisgICAgaW5zdGFuY2Uuc3RhdGUgPSBzdGF0ZTsKKyAgICB2YXIgbmV4 dENoaWxkcmVuID0gaW5zdGFuY2UucmVuZGVyKCk7CisgICAgcmVjb25jaWxlQ2hpbGRyZW4oY3Vy cmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbik7CisKKyAgICByZXR1cm4gd29ya0lu UHJvZ3Jlc3MuY2hpbGQ7CisgIH0KKworICBmdW5jdGlvbiB1cGRhdGVIb3N0Q29tcG9uZW50KGN1 cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7CisgICAgdmFyIG5leHRDaGlsZHJlbiA9IHdvcmtJblBy b2dyZXNzLnBlbmRpbmdQcm9wcy5jaGlsZHJlbjsKKyAgICBpZiAod29ya0luUHJvZ3Jlc3MucGVu ZGluZ1Byb3BzLmhpZGRlbiAmJiB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nV29ya1ByaW9yaXR5ICE9 PSBPZmZzY3JlZW5Qcmlvcml0eSkgeworICAgICAgLy8gSWYgdGhpcyBob3N0IGNvbXBvbmVudCBp cyBoaWRkZW4sIHdlIGNhbiBiYWlsIG91dCBvbiB0aGUgY2hpbGRyZW4uCisgICAgICAvLyBXZSds bCByZXJlbmRlciB0aGUgY2hpbGRyZW4gbGF0ZXIgYXQgdGhlIGxvd2VyIHByaW9yaXR5LgorCisg ICAgICAvLyBJdCBpcyB1bmZvcnR1bmF0ZSB0aGF0IHdlIGhhdmUgdG8gZG8gdGhlIHJlY29uY2ls aWF0aW9uIG9mIHRoZXNlCisgICAgICAvLyBjaGlsZHJlbiBhbHJlYWR5IHNpbmNlIHRoYXQgd2ls bCBhZGQgdGhlbSB0byB0aGUgdHJlZSBldmVuIHRob3VnaAorICAgICAgLy8gdGhleSBhcmUgbm90 IGFjdHVhbGx5IGRvbmUgeWV0LiBJZiB0aGlzIGlzIGEgbGFyZ2Ugc2V0IGl0IGlzIGFsc28KKyAg ICAgIC8vIGNvbmZ1c2luZyB0aGF0IHRoaXMgdGFrZXMgdGltZSB0byBkbyByaWdodCBub3cgaW5z dGVhZCBvZiBsYXRlci4KKworICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnByb2dyZXNzZWRQcmlv cml0eSA9PT0gT2Zmc2NyZWVuUHJpb3JpdHkpIHsKKyAgICAgICAgLy8gSWYgd2UgYWxyZWFkeSBt YWRlIHNvbWUgcHJvZ3Jlc3Mgb24gdGhlIG9mZnNjcmVlbiBwcmlvcml0eSBiZWZvcmUsCisgICAg ICAgIC8vIHRoZW4gd2Ugc2hvdWxkIGNvbnRpbnVlIGZyb20gd2hlcmUgd2UgbGVmdCBvZmYuCisg ICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gd29ya0luUHJvZ3Jlc3MucHJvZ3Jlc3NlZENo aWxkOworICAgICAgfQorCisgICAgICAvLyBSZWNvbmNpbGUgdGhlIGNoaWxkcmVuIGFuZCBzdGFz aCB0aGVtIGZvciBsYXRlciB3b3JrLgorICAgICAgcmVjb25jaWxlQ2hpbGRyZW5BdFByaW9yaXR5 KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIE9mZnNjcmVlblByaW9yaXR5 KTsKKyAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudCA/IGN1cnJlbnQuY2hpbGQg OiBudWxsOworICAgICAgLy8gQWJvcnQgYW5kIGRvbid0IHByb2Nlc3MgY2hpbGRyZW4geWV0Lgor ICAgICAgcmV0dXJuIG51bGw7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlY29uY2lsZUNoaWxkcmVu KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4pOworICAgICAgcmV0dXJuIHdv cmtJblByb2dyZXNzLmNoaWxkOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIG1vdW50SW5kZXRl cm1pbmF0ZUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykgeworICAgIHZhciBmbiA9 IHdvcmtJblByb2dyZXNzLnR5cGU7CisgICAgdmFyIHByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVu ZGluZ1Byb3BzOworICAgIHZhciB2YWx1ZSA9IGZuKHByb3BzKTsKKyAgICBpZiAodHlwZW9mIHZh bHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUucmVuZGVyID09PSAnZnVu Y3Rpb24nKSB7CisgICAgICAvLyBQcm9jZWVkIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhp cyBpcyBhIGNsYXNzIGluc3RhbmNlCisgICAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBDbGFzc0Nv bXBvbmVudDsKKyAgICAgIGlmIChjdXJyZW50KSB7CisgICAgICAgIGN1cnJlbnQudGFnID0gQ2xh c3NDb21wb25lbnQ7CisgICAgICB9CisgICAgICB2YWx1ZSA9IHZhbHVlLnJlbmRlcigpOworICAg IH0gZWxzZSB7CisgICAgICAvLyBQcm9jZWVkIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhp cyBpcyBhIGZ1bmN0aW9uYWwgY29tcG9uZW50CisgICAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBG dW5jdGlvbmFsQ29tcG9uZW50OworICAgICAgaWYgKGN1cnJlbnQpIHsKKyAgICAgICAgY3VycmVu dC50YWcgPSBGdW5jdGlvbmFsQ29tcG9uZW50OworICAgICAgfQorICAgIH0KKyAgICByZWNvbmNp bGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdmFsdWUpOworICAgIHJldHVybiB3 b3JrSW5Qcm9ncmVzcy5jaGlsZDsKKyAgfQorCisgIGZ1bmN0aW9uIHVwZGF0ZUNvcm91dGluZUNv bXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykgeworICAgIHZhciBjb3JvdXRpbmUgPSB3 b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7CisgICAgaWYgKCFjb3JvdXRpbmUpIHsKKyAgICAg IHRocm93IG5ldyBFcnJvcignU2hvdWxkIGJlIHJlc29sdmVkIGJ5IG5vdycpOworICAgIH0KKyAg ICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgY29yb3V0aW5lLmNo aWxkcmVuKTsKKyAgfQorCisgIC8qCisgIGZ1bmN0aW9uIHJldXNlQ2hpbGRyZW5FZmZlY3RzKHJl dHVybkZpYmVyIDogRmliZXIsIGZpcnN0Q2hpbGQgOiBGaWJlcikgeworICAgIGxldCBjaGlsZCA9 IGZpcnN0Q2hpbGQ7CisgICAgZG8geworICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIGZpcnN0IGFu ZCBsYXN0IGVmZmVjdCBvZiB0aGUgcGFyZW50IGNvcnJlc3BvbmRzCisgICAgICAvLyB0byB0aGUg Y2hpbGRyZW4ncyBmaXJzdCBhbmQgbGFzdCBlZmZlY3QuCisgICAgICBpZiAoIXJldHVybkZpYmVy LmZpcnN0RWZmZWN0KSB7CisgICAgICAgIHJldHVybkZpYmVyLmZpcnN0RWZmZWN0ID0gY2hpbGQu Zmlyc3RFZmZlY3Q7CisgICAgICB9CisgICAgICBpZiAoY2hpbGQubGFzdEVmZmVjdCkgeworICAg ICAgICBpZiAocmV0dXJuRmliZXIubGFzdEVmZmVjdCkgeworICAgICAgICAgIHJldHVybkZpYmVy Lmxhc3RFZmZlY3QubmV4dEVmZmVjdCA9IGNoaWxkLmZpcnN0RWZmZWN0OworICAgICAgICB9Cisg ICAgICAgIHJldHVybkZpYmVyLmxhc3RFZmZlY3QgPSBjaGlsZC5sYXN0RWZmZWN0OworICAgICAg fQorICAgIH0gd2hpbGUgKGNoaWxkID0gY2hpbGQuc2libGluZyk7CisgIH0KKyAgKi8KKworICBm dW5jdGlvbiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dy ZXNzKSB7CisgICAgdmFyIHByaW9yaXR5TGV2ZWwgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nV29y a1ByaW9yaXR5OworCisgICAgLy8gVE9ETzogV2Ugc2hvdWxkIGlkZWFsbHkgYmUgYWJsZSB0byBi YWlsIG91dCBlYXJseSBpZiB0aGUgY2hpbGRyZW4gaGF2ZSBubworICAgIC8vIG1vcmUgd29yayB0 byBkby4gSG93ZXZlciwgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIHNlcGFyYXRpb24gb2YgdGhpcwor ICAgIC8vIEZpYmVyJ3MgcHJpb3JpdHkgYW5kIGl0cyBjaGlsZHJlbiB5ZXQgLSB3ZSBkb24ndCBr bm93IHdpdGhvdXQgZG9pbmcgbG90cworICAgIC8vIG9mIHRoZSBzYW1lIHdvcmsgd2UgZG8gYW55 d2F5LiBPbmNlIHdlIGhhdmUgdGhhdCBzZXBhcmF0aW9uIHdlIGNhbiBqdXN0CisgICAgLy8gYmFp bCBvdXQgaGVyZSBpZiB0aGUgY2hpbGRyZW4gaGFzIG5vIG1vcmUgd29yayBhdCB0aGlzIHByaW9y aXR5IGxldmVsLgorICAgIC8vIGlmICh3b3JrSW5Qcm9ncmVzcy5wcmlvcml0eU9mQ2hpbGRyZW4g PD0gcHJpb3JpdHlMZXZlbCkgeworICAgIC8vICAgLy8gSWYgdGhlcmUgYXJlIHNpZGUtZWZmZWN0 cyBpbiB0aGVzZSBjaGlsZHJlbiB0aGF0IGhhdmUgbm90IHlldCBiZWVuCisgICAgLy8gICAvLyBj b21taXR0ZWQgd2UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGV5IGdldCBwcm9wZXJseSB0cmFuc2Zl cnJlZCB1cC4KKyAgICAvLyAgIGlmIChjdXJyZW50ICYmIGN1cnJlbnQuY2hpbGQgIT09IHdvcmtJ blByb2dyZXNzLmNoaWxkKSB7CisgICAgLy8gICAgIHJldXNlQ2hpbGRyZW5FZmZlY3RzKHdvcmtJ blByb2dyZXNzLCBjaGlsZCk7CisgICAgLy8gICB9CisgICAgLy8gICByZXR1cm4gbnVsbDsKKyAg ICAvLyB9CisKKyAgICBjbG9uZUNoaWxkRmliZXJzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTsK KyAgICBtYXJrQ2hpbGRBc1Byb2dyZXNzZWQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHByaW9y aXR5TGV2ZWwpOworICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDsKKyAgfQorCisgIGZ1 bmN0aW9uIGJhaWxvdXRPbkxvd1ByaW9yaXR5KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7Cisg ICAgaWYgKGN1cnJlbnQpIHsKKyAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5j aGlsZDsKKyAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBjdXJyZW50Lm1lbW9p emVkUHJvcHM7CisgICAgICB3b3JrSW5Qcm9ncmVzcy5vdXRwdXQgPSBjdXJyZW50Lm91dHB1dDsK KyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBmdW5jdGlvbiBiZWdpbldvcmsoY3Vy cmVudCwgd29ya0luUHJvZ3Jlc3MsIHByaW9yaXR5TGV2ZWwpIHsKKyAgICBpZiAod29ya0luUHJv Z3Jlc3MucGVuZGluZ1dvcmtQcmlvcml0eSA9PT0gTm9Xb3JrIHx8IHdvcmtJblByb2dyZXNzLnBl bmRpbmdXb3JrUHJpb3JpdHkgPiBwcmlvcml0eUxldmVsKSB7CisgICAgICByZXR1cm4gYmFpbG91 dE9uTG93UHJpb3JpdHkoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpOworICAgIH0KKworICAgIGlm ICh3b3JrSW5Qcm9ncmVzcy5wcm9ncmVzc2VkUHJpb3JpdHkgPT09IHByaW9yaXR5TGV2ZWwpIHsK KyAgICAgIC8vIElmIHdlIGhhdmUgcHJvZ3Jlc3NlZCB3b3JrIG9uIHRoaXMgcHJpb3JpdHkgbGV2 ZWwgYWxyZWFkeSwgd2UgY2FuCisgICAgICAvLyBwcm9jZWVkIHRoaXMgdGhhdCBhcyB0aGUgY2hp bGQuCisgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHdvcmtJblByb2dyZXNzLnByb2dyZXNz ZWRDaGlsZDsKKyAgICB9CisKKyAgICBpZiAoKHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyA9 PT0gbnVsbCB8fCB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzICE9PSBudWxsICYmIHdvcmtJ blByb2dyZXNzLnBlbmRpbmdQcm9wcyA9PT0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcykg JiYgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPT09IG51bGwpIHsKKyAgICAgIHJldHVybiBi YWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTsKKyAg ICB9CisKKyAgICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykgeworICAgICAgY2FzZSBJbmRl dGVybWluYXRlQ29tcG9uZW50OgorICAgICAgICByZXR1cm4gbW91bnRJbmRldGVybWluYXRlQ29t cG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTsKKyAgICAgIGNhc2UgRnVuY3Rpb25hbENv bXBvbmVudDoKKyAgICAgICAgcmV0dXJuIHVwZGF0ZUZ1bmN0aW9uYWxDb21wb25lbnQoY3VycmVu dCwgd29ya0luUHJvZ3Jlc3MpOworICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDoKKyAgICAgICAg cmV0dXJuIHVwZGF0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTsKKyAg ICAgIGNhc2UgSG9zdENvbnRhaW5lcjoKKyAgICAgICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVu dCwgd29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyk7CisgICAgICAg IC8vIEEgeWllbGQgY29tcG9uZW50IGlzIGp1c3QgYSBwbGFjZWhvbGRlciwgd2UgY2FuIGp1c3Qg cnVuIHRocm91Z2ggdGhlCisgICAgICAgIC8vIG5leHQgb25lIGltbWVkaWF0ZWx5LgorICAgICAg ICBpZiAod29ya0luUHJvZ3Jlc3MuY2hpbGQpIHsKKyAgICAgICAgICByZXR1cm4gYmVnaW5Xb3Jr KHdvcmtJblByb2dyZXNzLmNoaWxkLmFsdGVybmF0ZSwgd29ya0luUHJvZ3Jlc3MuY2hpbGQsIHBy aW9yaXR5TGV2ZWwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgY2Fz ZSBIb3N0Q29tcG9uZW50OgorICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlICYm IGNvbmZpZy5iZWdpblVwZGF0ZSkgeworICAgICAgICAgIGNvbmZpZy5iZWdpblVwZGF0ZSh3b3Jr SW5Qcm9ncmVzcy5zdGF0ZU5vZGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB1cGRhdGVI b3N0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTsKKyAgICAgIGNhc2UgQ29yb3V0 aW5lSGFuZGxlclBoYXNlOgorICAgICAgICAvLyBUaGlzIGlzIGEgcmVzdGFydC4gUmVzZXQgdGhl IHRhZyB0byB0aGUgaW5pdGlhbCBwaGFzZS4KKyAgICAgICAgd29ya0luUHJvZ3Jlc3MudGFnID0g Q29yb3V0aW5lQ29tcG9uZW50OworICAgICAgLy8gSW50ZW50aW9uYWxseSBmYWxsIHRocm91Z2gg c2luY2UgdGhpcyBpcyBub3cgdGhlIHNhbWUuCisgICAgICBjYXNlIENvcm91dGluZUNvbXBvbmVu dDoKKyAgICAgICAgdXBkYXRlQ29yb3V0aW5lQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dy ZXNzKTsKKyAgICAgICAgLy8gVGhpcyBkb2Vzbid0IHRha2UgYXJiaXRyYXJ5IHRpbWUgc28gd2Ug Y291bGQgc3luY2hyb25vdXNseSBqdXN0IGJlZ2luCisgICAgICAgIC8vIGVhZ2VybHkgZG8gdGhl IHdvcmsgb2Ygd29ya0luUHJvZ3Jlc3MuY2hpbGQgYXMgYW4gb3B0aW1pemF0aW9uLgorICAgICAg ICBpZiAod29ya0luUHJvZ3Jlc3MuY2hpbGQpIHsKKyAgICAgICAgICByZXR1cm4gYmVnaW5Xb3Jr KHdvcmtJblByb2dyZXNzLmNoaWxkLmFsdGVybmF0ZSwgd29ya0luUHJvZ3Jlc3MuY2hpbGQsIHBy aW9yaXR5TGV2ZWwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5j aGlsZDsKKyAgICAgIGNhc2UgWWllbGRDb21wb25lbnQ6CisgICAgICAgIC8vIEEgeWllbGQgY29t cG9uZW50IGlzIGp1c3QgYSBwbGFjZWhvbGRlciwgd2UgY2FuIGp1c3QgcnVuIHRocm91Z2ggdGhl CisgICAgICAgIC8vIG5leHQgb25lIGltbWVkaWF0ZWx5LgorICAgICAgICBpZiAod29ya0luUHJv Z3Jlc3Muc2libGluZykgeworICAgICAgICAgIHJldHVybiBiZWdpbldvcmsod29ya0luUHJvZ3Jl c3Muc2libGluZy5hbHRlcm5hdGUsIHdvcmtJblByb2dyZXNzLnNpYmxpbmcsIHByaW9yaXR5TGV2 ZWwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgZGVmYXVsdDoKKyAg ICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHVuaXQgb2Ygd29yayB0YWcnKTsKKyAgICB9 CisgIH0KKworICByZXR1cm4geworICAgIGJlZ2luV29yazogYmVnaW5Xb3JrCisgIH07Cit9Owpc IE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRp Yy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdEZpYmVyQ29tbWl0V29yay5qcyBiL3dlYi9wZ2Fk bWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdEZpYmVyQ29tbWl0V29yay5qcwpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uN2U1MTMyZjMKLS0tIC9kZXYvbnVs bAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RGaWJl ckNvbW1pdFdvcmsuanMKQEAgLTAsMCArMSw3OCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1w cmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBU aGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBm b3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhp cyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBj YW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisg KgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgUmVhY3RUeXBlT2ZXb3JrID0gcmVx dWlyZSgnLi9SZWFjdFR5cGVPZldvcmsnKTsKK3ZhciBDbGFzc0NvbXBvbmVudCA9IFJlYWN0VHlw ZU9mV29yay5DbGFzc0NvbXBvbmVudCwKKyAgICBIb3N0Q29udGFpbmVyID0gUmVhY3RUeXBlT2ZX b3JrLkhvc3RDb250YWluZXIsCisgICAgSG9zdENvbXBvbmVudCA9IFJlYWN0VHlwZU9mV29yay5I b3N0Q29tcG9uZW50OworCit2YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuL1JlYWN0RmliZXJVcGRh dGVRdWV1ZScpLAorICAgIGNhbGxDYWxsYmFja3MgPSBfcmVxdWlyZS5jYWxsQ2FsbGJhY2tzOwor Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjb25maWcpIHsKKworICB2YXIgdXBkYXRlQ29u dGFpbmVyID0gY29uZmlnLnVwZGF0ZUNvbnRhaW5lcjsKKyAgdmFyIGNvbW1pdFVwZGF0ZSA9IGNv bmZpZy5jb21taXRVcGRhdGU7CisKKyAgZnVuY3Rpb24gY29tbWl0V29yayhjdXJyZW50LCBmaW5p c2hlZFdvcmspIHsKKyAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHsKKyAgICAgIGNhc2Ug Q2xhc3NDb21wb25lbnQ6CisgICAgICAgIHsKKyAgICAgICAgICAvLyBDbGVhciB1cGRhdGVzIGZy b20gY3VycmVudCBmaWJlci4gVGhpcyBtdXN0IGdvIGJlZm9yZSB0aGUgY2FsbGJhY2tzCisgICAg ICAgICAgLy8gYXJlIHJlc2V0LCBpbiBjYXNlIGFuIHVwZGF0ZSBpcyB0cmlnZ2VyZWQgZnJvbSBp bnNpZGUgYSBjYWxsYmFjay4gSXMKKyAgICAgICAgICAvLyB0aGlzIHNhZmU/IFJlbGllcyBvbiB0 aGUgYXNzdW1wdGlvbiB0aGF0IHdvcmsgaXMgb25seSBjb21taXR0ZWQgaWYKKyAgICAgICAgICAv LyB0aGUgdXBkYXRlIHF1ZXVlIGlzIGVtcHR5LgorICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsu YWx0ZXJuYXRlKSB7CisgICAgICAgICAgICBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlLnVwZGF0ZVF1 ZXVlID0gbnVsbDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay5jYWxs YmFja0xpc3QpIHsKKyAgICAgICAgICAgIHZhciBjYWxsYmFja0xpc3QgPSBmaW5pc2hlZFdvcmsu Y2FsbGJhY2tMaXN0OworCisgICAgICAgICAgICBmaW5pc2hlZFdvcmsuY2FsbGJhY2tMaXN0ID0g bnVsbDsKKyAgICAgICAgICAgIGNhbGxDYWxsYmFja3MoY2FsbGJhY2tMaXN0LCBmaW5pc2hlZFdv cmsuc3RhdGVOb2RlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgLy8gVE9ETzogRmlyZSBjb21w b25lbnREaWRNb3VudC9jb21wb25lbnREaWRVcGRhdGUsIHVwZGF0ZSByZWZzCisgICAgICAgICAg cmV0dXJuOworICAgICAgICB9CisgICAgICBjYXNlIEhvc3RDb250YWluZXI6CisgICAgICAgIHsK KyAgICAgICAgICAvLyBUT0RPOiBBdHRhY2ggY2hpbGRyZW4gdG8gcm9vdCBjb250YWluZXIuCisg ICAgICAgICAgdmFyIGNoaWxkcmVuID0gZmluaXNoZWRXb3JrLm91dHB1dDsKKyAgICAgICAgICB2 YXIgcm9vdCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7CisgICAgICAgICAgdmFyIGNvbnRhaW5l ckluZm8gPSByb290LmNvbnRhaW5lckluZm87CisgICAgICAgICAgdXBkYXRlQ29udGFpbmVyKGNv bnRhaW5lckluZm8sIGNoaWxkcmVuKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAg ICAgIGNhc2UgSG9zdENvbXBvbmVudDoKKyAgICAgICAgeworICAgICAgICAgIGlmIChmaW5pc2hl ZFdvcmsuc3RhdGVOb2RlID09IG51bGwgfHwgIWN1cnJlbnQpIHsKKyAgICAgICAgICAgIHRocm93 IG5ldyBFcnJvcignVGhpcyBzaG91bGQgb25seSBiZSBkb25lIGR1cmluZyB1cGRhdGVzLicpOwor ICAgICAgICAgIH0KKyAgICAgICAgICAvLyBDb21taXQgdGhlIHdvcmsgcHJlcGFyZWQgZWFybGll ci4KKyAgICAgICAgICB2YXIgY2hpbGQgPSBmaW5pc2hlZFdvcmsuY2hpbGQ7CisgICAgICAgICAg dmFyIF9jaGlsZHJlbiA9IGNoaWxkICYmICFjaGlsZC5zaWJsaW5nID8gY2hpbGQub3V0cHV0IDog Y2hpbGQ7CisgICAgICAgICAgdmFyIG5ld1Byb3BzID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJv cHM7CisgICAgICAgICAgdmFyIG9sZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzOworICAg ICAgICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7CisgICAgICAgICAg Y29tbWl0VXBkYXRlKGluc3RhbmNlLCBvbGRQcm9wcywgbmV3UHJvcHMsIF9jaGlsZHJlbik7Cisg ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJv dyBuZXcgRXJyb3IoJ1RoaXMgdW5pdCBvZiB3b3JrIHRhZyBzaG91bGQgbm90IGhhdmUgc2lkZS1l ZmZlY3RzLicpOworICAgIH0KKyAgfQorCisgIHJldHVybiB7CisgICAgY29tbWl0V29yazogY29t bWl0V29yaworICB9OworfTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQg YS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RGaWJlckNvbXBs ZXRlV29yay5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFj dEZpYmVyQ29tcGxldGVXb3JrLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw Li5hNjgzNjc1NQotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3Iv cmVhY3QtZG9tL2xpYi9SZWFjdEZpYmVyQ29tcGxldGVXb3JrLmpzCkBAIC0wLDAgKzEsMjA4IEBA CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwg cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5k ZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGlu IHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdy YW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxl IGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisK K3ZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4vUmVhY3RDaGlsZEZpYmVyJyksCisgICAgcmVjb25j aWxlQ2hpbGRGaWJlcnMgPSBfcmVxdWlyZS5yZWNvbmNpbGVDaGlsZEZpYmVyczsKKwordmFyIFJl YWN0VHlwZU9mV29yayA9IHJlcXVpcmUoJy4vUmVhY3RUeXBlT2ZXb3JrJyk7Cit2YXIgSW5kZXRl cm1pbmF0ZUNvbXBvbmVudCA9IFJlYWN0VHlwZU9mV29yay5JbmRldGVybWluYXRlQ29tcG9uZW50 LAorICAgIEZ1bmN0aW9uYWxDb21wb25lbnQgPSBSZWFjdFR5cGVPZldvcmsuRnVuY3Rpb25hbENv bXBvbmVudCwKKyAgICBDbGFzc0NvbXBvbmVudCA9IFJlYWN0VHlwZU9mV29yay5DbGFzc0NvbXBv bmVudCwKKyAgICBIb3N0Q29udGFpbmVyID0gUmVhY3RUeXBlT2ZXb3JrLkhvc3RDb250YWluZXIs CisgICAgSG9zdENvbXBvbmVudCA9IFJlYWN0VHlwZU9mV29yay5Ib3N0Q29tcG9uZW50LAorICAg IENvcm91dGluZUNvbXBvbmVudCA9IFJlYWN0VHlwZU9mV29yay5Db3JvdXRpbmVDb21wb25lbnQs CisgICAgQ29yb3V0aW5lSGFuZGxlclBoYXNlID0gUmVhY3RUeXBlT2ZXb3JrLkNvcm91dGluZUhh bmRsZXJQaGFzZSwKKyAgICBZaWVsZENvbXBvbmVudCA9IFJlYWN0VHlwZU9mV29yay5ZaWVsZENv bXBvbmVudDsKKworCittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjb25maWcpIHsKKworICB2 YXIgY3JlYXRlSW5zdGFuY2UgPSBjb25maWcuY3JlYXRlSW5zdGFuY2U7CisgIHZhciBwcmVwYXJl VXBkYXRlID0gY29uZmlnLnByZXBhcmVVcGRhdGU7CisKKyAgZnVuY3Rpb24gbWFya0ZvclByZUVm ZmVjdCh3b3JrSW5Qcm9ncmVzcykgeworICAgIC8vIFNjaGVkdWxlIGEgc2lkZS1lZmZlY3Qgb24g dGhpcyBmaWJlciwgQkVGT1JFIHRoZSBjaGlsZHJlbidzIHNpZGUtZWZmZWN0cy4KKyAgICBpZiAo d29ya0luUHJvZ3Jlc3MuZmlyc3RFZmZlY3QpIHsKKyAgICAgIHdvcmtJblByb2dyZXNzLm5leHRF ZmZlY3QgPSB3b3JrSW5Qcm9ncmVzcy5maXJzdEVmZmVjdDsKKyAgICAgIHdvcmtJblByb2dyZXNz LmZpcnN0RWZmZWN0ID0gd29ya0luUHJvZ3Jlc3M7CisgICAgfSBlbHNlIHsKKyAgICAgIHdvcmtJ blByb2dyZXNzLmZpcnN0RWZmZWN0ID0gd29ya0luUHJvZ3Jlc3M7CisgICAgICB3b3JrSW5Qcm9n cmVzcy5sYXN0RWZmZWN0ID0gd29ya0luUHJvZ3Jlc3M7CisgICAgfQorICB9CisKKyAgLy8gVE9E TzogSXQncyBwb3NzaWJsZSB0aGlzIHdpbGwgY3JlYXRlIGxheW91dCB0aHJhc2ggaXNzdWVzIGJl Y2F1c2UgbXV0YXRpb25zCisgIC8vIG9mIHRoZSBET00gYW5kIGxpZmUtY3ljbGVzIGFyZSBpbnRl cmxlYXZlZC4gRS5nLiBpZiBhIGNvbXBvbmVudERpZE1vdW50CisgIC8vIG9mIGEgc2libGluZyBy ZWFkcywgdGhlbiB0aGUgbmV4dCBzaWJsaW5nIHVwZGF0ZXMgYW5kIHJlYWRzIGV0Yy4KKyAgZnVu Y3Rpb24gbWFya0ZvclBvc3RFZmZlY3Qod29ya0luUHJvZ3Jlc3MpIHsKKyAgICAvLyBTY2hlZHVs ZSBhIHNpZGUtZWZmZWN0IG9uIHRoaXMgZmliZXIsIEFGVEVSIHRoZSBjaGlsZHJlbidzIHNpZGUt ZWZmZWN0cy4KKyAgICBpZiAod29ya0luUHJvZ3Jlc3MubGFzdEVmZmVjdCkgeworICAgICAgd29y a0luUHJvZ3Jlc3MubGFzdEVmZmVjdC5uZXh0RWZmZWN0ID0gd29ya0luUHJvZ3Jlc3M7CisgICAg fSBlbHNlIHsKKyAgICAgIHdvcmtJblByb2dyZXNzLmZpcnN0RWZmZWN0ID0gd29ya0luUHJvZ3Jl c3M7CisgICAgfQorICAgIHdvcmtJblByb2dyZXNzLmxhc3RFZmZlY3QgPSB3b3JrSW5Qcm9ncmVz czsKKyAgfQorCisgIGZ1bmN0aW9uIHRyYW5zZmVyT3V0cHV0KGNoaWxkLCByZXR1cm5GaWJlcikg eworICAgIC8vIElmIHdlIGhhdmUgYSBzaW5nbGUgcmVzdWx0LCB3ZSBqdXN0IHBhc3MgdGhhdCB0 aHJvdWdoIGFzIHRoZSBvdXRwdXQgdG8KKyAgICAvLyBhdm9pZCB1bm5lY2Vzc2FyeSB0cmF2ZXJz YWwuIFdoZW4gd2UgaGF2ZSBtdWx0aXBsZSBvdXRwdXQsIHdlIGp1c3QgcGFzcworICAgIC8vIHRo ZSBsaW5rZWQgbGlzdCBvZiBmaWJlcnMgdGhhdCBoYXMgdGhlIGluZGl2aWR1YWwgb3V0cHV0IHZh bHVlcy4KKyAgICByZXR1cm5GaWJlci5vdXRwdXQgPSBjaGlsZCAmJiAhY2hpbGQuc2libGluZyA/ IGNoaWxkLm91dHB1dCA6IGNoaWxkOworICAgIHJldHVybkZpYmVyLm1lbW9pemVkUHJvcHMgPSBy ZXR1cm5GaWJlci5wZW5kaW5nUHJvcHM7CisgIH0KKworICBmdW5jdGlvbiByZWN1cnNpdmVseUZp bGxZaWVsZHMoeWllbGRzLCBvdXRwdXQpIHsKKyAgICBpZiAoIW91dHB1dCkgeworICAgICAgLy8g SWdub3JlIG51bGxzIGV0Yy4KKyAgICB9IGVsc2UgaWYgKG91dHB1dC50YWcgIT09IHVuZGVmaW5l ZCkgeworICAgICAgLy8gVE9ETzogRml4IHRoaXMgZnJhZ2lsZSBkdWNrIHRlc3QuCisgICAgICAv LyBEZXRlY3QgaWYgdGhpcyBpcyBhIGZpYmVyLCBpZiBzbyBpdCBpcyBhIGZyYWdtZW50IHJlc3Vs dC4KKyAgICAgIC8vICRGbG93Rml4TWU6IFJlZmluZW1lbnQgaXNzdWUuCisgICAgICB2YXIgaXRl bSA9IG91dHB1dDsKKyAgICAgIGRvIHsKKyAgICAgICAgcmVjdXJzaXZlbHlGaWxsWWllbGRzKHlp ZWxkcywgaXRlbS5vdXRwdXQpOworICAgICAgICBpdGVtID0gaXRlbS5zaWJsaW5nOworICAgICAg fSB3aGlsZSAoaXRlbSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vICRGbG93Rml4TWU6IFJlZmlu ZW1lbnQgaXNzdWUuIElmIGl0IGlzIG5vdCBhIEZpYmVyIG9yIG51bGwsIGl0IGlzIGEgeWllbGQK KyAgICAgIHlpZWxkcy5wdXNoKG91dHB1dCk7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gbW92 ZUNvcm91dGluZVRvSGFuZGxlclBoYXNlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7CisgICAg dmFyIGNvcm91dGluZSA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsKKyAgICBpZiAoIWNv cm91dGluZSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgYmUgcmVzb2x2ZWQgYnkg bm93Jyk7CisgICAgfQorCisgICAgLy8gRmlyc3Qgc3RlcCBvZiB0aGUgY29yb3V0aW5lIGhhcyBj b21wbGV0ZWQuIE5vdyB3ZSBuZWVkIHRvIGRvIHRoZSBzZWNvbmQuCisgICAgLy8gVE9ETzogSXQg d291bGQgYmUgbmljZSB0byBoYXZlIGEgbXVsdGkgc3RhZ2UgY29yb3V0aW5lIHJlcHJlc2VudGVk IGJ5IGEKKyAgICAvLyBzaW5nbGUgY29tcG9uZW50LCBvciBhdCBsZWFzdCB0YWlsIGNhbGwgb3B0 aW1pemUgbmVzdGVkIG9uZXMuIEN1cnJlbnRseQorICAgIC8vIHRoYXQgcmVxdWlyZXMgYWRkaXRp b25hbCBmaWVsZHMgdGhhdCB3ZSBkb24ndCB3YW50IHRvIGFkZCB0byB0aGUgZmliZXIuCisgICAg Ly8gU28gdGhpcyByZXF1aXJlcyBuZXN0ZWQgaGFuZGxlcnMuCisgICAgLy8gTm90ZTogVGhpcyBk b2Vzbid0IG11dGF0ZSB0aGUgYWx0ZXJuYXRlIG5vZGUuIEkgZG9uJ3QgdGhpbmsgaXQgbmVlZHMg dG8KKyAgICAvLyBzaW5jZSB0aGlzIHN0YWdlIGlzIHJlc2V0IGZvciBldmVyeSBwYXNzLgorICAg IHdvcmtJblByb2dyZXNzLnRhZyA9IENvcm91dGluZUhhbmRsZXJQaGFzZTsKKworICAgIC8vIEJ1 aWxkIHVwIHRoZSB5aWVsZHMuCisgICAgLy8gVE9ETzogQ29tcGFyZSB0aGlzIHRvIGEgZ2VuZXJh dG9yIG9yIG9wYXF1ZSBoZWxwZXJzIGxpa2UgQ2hpbGRyZW4uCisgICAgdmFyIHlpZWxkcyA9IFtd OworICAgIHZhciBjaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkOworICAgIHdoaWxlIChjaGls ZCkgeworICAgICAgcmVjdXJzaXZlbHlGaWxsWWllbGRzKHlpZWxkcywgY2hpbGQub3V0cHV0KTsK KyAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZzsKKyAgICB9CisgICAgdmFyIGZuID0gY29yb3V0 aW5lLmhhbmRsZXI7CisgICAgdmFyIHByb3BzID0gY29yb3V0aW5lLnByb3BzOworICAgIHZhciBu ZXh0Q2hpbGRyZW4gPSBmbihwcm9wcywgeWllbGRzKTsKKworICAgIHZhciBjdXJyZW50Rmlyc3RD aGlsZCA9IGN1cnJlbnQgPyBjdXJyZW50LnN0YXRlTm9kZSA6IG51bGw7CisgICAgLy8gSW5oZXJp dCB0aGUgcHJpb3JpdHkgb2YgdGhlIHJldHVybkZpYmVyLgorICAgIHZhciBwcmlvcml0eSA9IHdv cmtJblByb2dyZXNzLnBlbmRpbmdXb3JrUHJpb3JpdHk7CisgICAgd29ya0luUHJvZ3Jlc3Muc3Rh dGVOb2RlID0gcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGN1cnJlbnRGaXJz dENoaWxkLCBuZXh0Q2hpbGRyZW4sIHByaW9yaXR5KTsKKyAgICByZXR1cm4gd29ya0luUHJvZ3Jl c3Muc3RhdGVOb2RlOworICB9CisKKyAgZnVuY3Rpb24gY29tcGxldGVXb3JrKGN1cnJlbnQsIHdv cmtJblByb2dyZXNzKSB7CisgICAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHsKKyAgICAg IGNhc2UgRnVuY3Rpb25hbENvbXBvbmVudDoKKyAgICAgICAgdHJhbnNmZXJPdXRwdXQod29ya0lu UHJvZ3Jlc3MuY2hpbGQsIHdvcmtJblByb2dyZXNzKTsKKyAgICAgICAgcmV0dXJuIG51bGw7Cisg ICAgICBjYXNlIENsYXNzQ29tcG9uZW50OgorICAgICAgICB0cmFuc2Zlck91dHB1dCh3b3JrSW5Q cm9ncmVzcy5jaGlsZCwgd29ya0luUHJvZ3Jlc3MpOworICAgICAgICAvLyBEb24ndCB1c2UgdGhl IHN0YXRlIHF1ZXVlIHRvIGNvbXB1dGUgdGhlIG1lbW9pemVkIHN0YXRlLiBXZSBhbHJlYWR5Cisg ICAgICAgIC8vIG1lcmdlZCBpdCBhbmQgYXNzaWduZWQgaXQgdG8gdGhlIGluc3RhbmNlLiBUcmFu c2ZlciBpdCBmcm9tIHRoZXJlLgorICAgICAgICAvLyBBbHNvIG5lZWQgdG8gdHJhbnNmZXIgdGhl IHByb3BzLCBiZWNhdXNlIHBlbmRpbmdQcm9wcyB3aWxsIGJlIG51bGwKKyAgICAgICAgLy8gaW4g dGhlIGNhc2Ugb2YgYW4gdXBkYXRlCisgICAgICAgIHZhciBfd29ya0luUHJvZ3Jlc3Mkc3RhdGUg PSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUsCisgICAgICAgICAgICBzdGF0ZSA9IF93b3JrSW5Q cm9ncmVzcyRzdGF0ZS5zdGF0ZSwKKyAgICAgICAgICAgIHByb3BzID0gX3dvcmtJblByb2dyZXNz JHN0YXRlLnByb3BzOworCisgICAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBz dGF0ZTsKKyAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IHByb3BzOworICAg ICAgICAvLyBUcmFuc2ZlciB1cGRhdGUgcXVldWUgdG8gY2FsbGJhY2tMaXN0IGZpZWxkIHNvIGNh bGxiYWNrcyBjYW4gYmUKKyAgICAgICAgLy8gY2FsbGVkIGR1cmluZyBjb21taXQgcGhhc2UuCisg ICAgICAgIHdvcmtJblByb2dyZXNzLmNhbGxiYWNrTGlzdCA9IHdvcmtJblByb2dyZXNzLnVwZGF0 ZVF1ZXVlOworICAgICAgICBtYXJrRm9yUG9zdEVmZmVjdCh3b3JrSW5Qcm9ncmVzcyk7CisgICAg ICAgIHJldHVybiBudWxsOworICAgICAgY2FzZSBIb3N0Q29udGFpbmVyOgorICAgICAgICB0cmFu c2Zlck91dHB1dCh3b3JrSW5Qcm9ncmVzcy5jaGlsZCwgd29ya0luUHJvZ3Jlc3MpOworICAgICAg ICAvLyBXZSBkb24ndCBrbm93IGlmIGEgY29udGFpbmVyIGhhcyB1cGRhdGVkIGFueSBjaGlsZHJl biBzbyB3ZSBhbHdheXMKKyAgICAgICAgLy8gbmVlZCB0byB1cGRhdGUgaXQgcmlnaHQgbm93LiBX ZSBzY2hlZHVsZSB0aGlzIHNpZGUtZWZmZWN0IGJlZm9yZQorICAgICAgICAvLyBhbGwgdGhlIG90 aGVyIHNpZGUtZWZmZWN0cyBpbiB0aGUgc3VidHJlZS4gV2UgbmVlZCB0byBzY2hlZHVsZSBpdAor ICAgICAgICAvLyBiZWZvcmUgc28gdGhhdCB0aGUgZW50aXJlIHRyZWUgaXMgdXAtdG8tZGF0ZSBi ZWZvcmUgdGhlIGxpZmUtY3ljbGVzCisgICAgICAgIC8vIGFyZSBpbnZva2VkLgorICAgICAgICBt YXJrRm9yUHJlRWZmZWN0KHdvcmtJblByb2dyZXNzKTsKKyAgICAgICAgcmV0dXJuIG51bGw7Cisg ICAgICBjYXNlIEhvc3RDb21wb25lbnQ6CisgICAgICAgIHZhciBuZXdQcm9wcyA9IHdvcmtJblBy b2dyZXNzLnBlbmRpbmdQcm9wczsKKyAgICAgICAgdmFyIGNoaWxkID0gd29ya0luUHJvZ3Jlc3Mu Y2hpbGQ7CisgICAgICAgIHZhciBjaGlsZHJlbiA9IGNoaWxkICYmICFjaGlsZC5zaWJsaW5nID8g Y2hpbGQub3V0cHV0IDogY2hpbGQ7CisgICAgICAgIGlmIChjdXJyZW50ICYmIHdvcmtJblByb2dy ZXNzLnN0YXRlTm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBhbHRl cm5hdGUsIHRoYXQgbWVhbnMgdGhpcyBpcyBhbiB1cGRhdGUgYW5kIHdlIG5lZWQgdG8KKyAgICAg ICAgICAvLyBzY2hlZHVsZSBhIHNpZGUtZWZmZWN0IHRvIGRvIHRoZSB1cGRhdGVzLgorICAgICAg ICAgIHZhciBvbGRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wczsKKyAgICAgICAgICAvLyBJ ZiB3ZSBnZXQgdXBkYXRlZCBiZWNhdXNlIG9uZSBvZiBvdXIgY2hpbGRyZW4gdXBkYXRlZCwgd2Ug ZG9uJ3QKKyAgICAgICAgICAvLyBoYXZlIG5ld1Byb3BzIHNvIHdlJ2xsIGhhdmUgdG8gcmV1c2Ug dGhlbS4KKyAgICAgICAgICAvLyBUT0RPOiBTcGxpdCB0aGUgdXBkYXRlIEFQSSBhcyBzZXBhcmF0 ZSBmb3IgdGhlIHByb3BzIHZzLiBjaGlsZHJlbi4KKyAgICAgICAgICAvLyBFdmVuIGJldHRlciB3 b3VsZCBiZSBpZiBjaGlsZHJlbiB3ZXJlbid0IHNwZWNpYWwgY2FzZWQgYXQgYWxsIHRoby4KKyAg ICAgICAgICBpZiAoIW5ld1Byb3BzKSB7CisgICAgICAgICAgICBuZXdQcm9wcyA9IG9sZFByb3Bz OworICAgICAgICAgIH0KKyAgICAgICAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5z dGF0ZU5vZGU7CisgICAgICAgICAgaWYgKHByZXBhcmVVcGRhdGUoaW5zdGFuY2UsIG9sZFByb3Bz LCBuZXdQcm9wcywgY2hpbGRyZW4pKSB7CisgICAgICAgICAgICAvLyBUaGlzIHJldHVybnMgdHJ1 ZSBpZiB0aGVyZSB3YXMgc29tZXRoaW5nIHRvIHVwZGF0ZS4KKyAgICAgICAgICAgIG1hcmtGb3JQ cmVFZmZlY3Qod29ya0luUHJvZ3Jlc3MpOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBUT0RP OiBJcyB0aGlzIGFjdHVhbGx5IGV2ZXIgZ29pbmcgdG8gY2hhbmdlPyBXaHkgc2V0IGl0IGV2ZXJ5 IHRpbWU/CisgICAgICAgICAgd29ya0luUHJvZ3Jlc3Mub3V0cHV0ID0gaW5zdGFuY2U7CisgICAg ICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKCFuZXdQcm9wcykgeworICAgICAgICAgICAgaWYg KHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9PT0gbnVsbCkgeworICAgICAgICAgICAgICB0aHJv dyBuZXcgRXJyb3IoJ1dlIG11c3QgaGF2ZSBuZXcgcHJvcHMgZm9yIG5ldyBtb3VudHMuJyk7Cisg ICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gd2hl biB3ZSBhYm9ydCB3b3JrLgorICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAg IH0KKyAgICAgICAgICB9CisgICAgICAgICAgdmFyIF9pbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNl KHdvcmtJblByb2dyZXNzLnR5cGUsIG5ld1Byb3BzLCBjaGlsZHJlbik7CisgICAgICAgICAgLy8g VE9ETzogVGhpcyBzZWVtcyBsaWtlIHVubmVjZXNzYXJ5IGR1cGxpY2F0aW9uLgorICAgICAgICAg IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IF9pbnN0YW5jZTsKKyAgICAgICAgICB3b3JrSW5Q cm9ncmVzcy5vdXRwdXQgPSBfaW5zdGFuY2U7CisgICAgICAgIH0KKyAgICAgICAgd29ya0luUHJv Z3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG5ld1Byb3BzOworICAgICAgICByZXR1cm4gbnVsbDsKKyAg ICAgIGNhc2UgQ29yb3V0aW5lQ29tcG9uZW50OgorICAgICAgICByZXR1cm4gbW92ZUNvcm91dGlu ZVRvSGFuZGxlclBoYXNlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTsKKyAgICAgIGNhc2UgQ29y b3V0aW5lSGFuZGxlclBoYXNlOgorICAgICAgICB0cmFuc2Zlck91dHB1dCh3b3JrSW5Qcm9ncmVz cy5zdGF0ZU5vZGUsIHdvcmtJblByb2dyZXNzKTsKKyAgICAgICAgLy8gUmVzZXQgdGhlIHRhZyB0 byBub3cgYmUgYSBmaXJzdCBwaGFzZSBjb3JvdXRpbmUuCisgICAgICAgIHdvcmtJblByb2dyZXNz LnRhZyA9IENvcm91dGluZUNvbXBvbmVudDsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICBj YXNlIFlpZWxkQ29tcG9uZW50OgorICAgICAgICAvLyBEb2VzIG5vdGhpbmcuCisgICAgICAgIHJl dHVybiBudWxsOworCisgICAgICAvLyBFcnJvciBjYXNlcworICAgICAgY2FzZSBJbmRldGVybWlu YXRlQ29tcG9uZW50OgorICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIGluZGV0ZXJtaW5hdGUg Y29tcG9uZW50IHNob3VsZCBoYXZlIGJlY29tZSBkZXRlcm1pbmF0ZSBiZWZvcmUgY29tcGxldGlu Zy4nKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biB1 bml0IG9mIHdvcmsgdGFnJyk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHsKKyAgICBjb21wbGV0 ZVdvcms6IGNvbXBsZXRlV29yaworICB9OworfTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxl CmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVh Y3RGaWJlclJlY29uY2lsZXIuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRv bS9saWIvUmVhY3RGaWJlclJlY29uY2lsZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAuLjNhNjU1ZDkxCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGlj L3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0RmliZXJSZWNvbmNpbGVyLmpzCkBAIC0wLDAgKzEs NjQgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAq IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNl ZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZp bGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9u YWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRT IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0 JzsKKwordmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi9SZWFjdEZpYmVyUm9vdCcpLAorICAgIGNy ZWF0ZUZpYmVyUm9vdCA9IF9yZXF1aXJlLmNyZWF0ZUZpYmVyUm9vdDsKKwordmFyIFJlYWN0Rmli ZXJTY2hlZHVsZXIgPSByZXF1aXJlKCcuL1JlYWN0RmliZXJTY2hlZHVsZXInKTsKKworbW9kdWxl LmV4cG9ydHMgPSBmdW5jdGlvbiAoY29uZmlnKSB7CisgIHZhciBfUmVhY3RGaWJlclNjaGVkdWxl ciA9IFJlYWN0RmliZXJTY2hlZHVsZXIoY29uZmlnKSwKKyAgICAgIHNjaGVkdWxlV29yayA9IF9S ZWFjdEZpYmVyU2NoZWR1bGVyLnNjaGVkdWxlV29yaywKKyAgICAgIHBlcmZvcm1XaXRoUHJpb3Jp dHkgPSBfUmVhY3RGaWJlclNjaGVkdWxlci5wZXJmb3JtV2l0aFByaW9yaXR5OworCisgIHJldHVy biB7CisgICAgbW91bnRDb250YWluZXI6IGZ1bmN0aW9uIChlbGVtZW50LCBjb250YWluZXJJbmZv KSB7CisgICAgICB2YXIgcm9vdCA9IGNyZWF0ZUZpYmVyUm9vdChjb250YWluZXJJbmZvKTsKKyAg ICAgIHZhciBjb250YWluZXIgPSByb290LmN1cnJlbnQ7CisgICAgICAvLyBUT0RPOiBVc2UgcGVu ZGluZyB3b3JrL3N0YXRlIGluc3RlYWQgb2YgcHJvcHMuCisgICAgICAvLyBUT0RPOiBUaGlzIHNo b3VsZCBub3Qgb3ZlcnJpZGUgdGhlIHBlbmRpbmdXb3JrUHJpb3JpdHkgaWYgdGhlcmUgaXMKKyAg ICAgIC8vIGhpZ2hlciBwcmlvcml0eSB3b3JrIGluIHRoZSBzdWJ0cmVlLgorICAgICAgY29udGFp bmVyLnBlbmRpbmdQcm9wcyA9IGVsZW1lbnQ7CisKKyAgICAgIHNjaGVkdWxlV29yayhyb290KTsK KworICAgICAgLy8gSXQgbWF5IHNlZW0gc3RyYW5nZSB0aGF0IHdlIGRvbid0IHJldHVybiB0aGUg cm9vdCBoZXJlLCBidXQgdGhhdCB3aWxsCisgICAgICAvLyBhbGxvdyB1cyB0byBoYXZlIGNvbnRh aW5lcnMgdGhhdCBhcmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgdHJlZSBpbnN0ZWFkCisgICAgICAv LyBvZiBiZWluZyByb290cy4KKyAgICAgIHJldHVybiBjb250YWluZXI7CisgICAgfSwKKyAgICB1 cGRhdGVDb250YWluZXI6IGZ1bmN0aW9uIChlbGVtZW50LCBjb250YWluZXIpIHsKKyAgICAgIC8v IFRPRE86IElmIHRoaXMgaXMgYSBuZXN0ZWQgY29udGFpbmVyLCB0aGlzIHdvbid0IGJlIHRoZSBy b290LgorICAgICAgdmFyIHJvb3QgPSBjb250YWluZXIuc3RhdGVOb2RlOworICAgICAgLy8gVE9E TzogVXNlIHBlbmRpbmcgd29yay9zdGF0ZSBpbnN0ZWFkIG9mIHByb3BzLgorICAgICAgcm9vdC5j dXJyZW50LnBlbmRpbmdQcm9wcyA9IGVsZW1lbnQ7CisKKyAgICAgIHNjaGVkdWxlV29yayhyb290 KTsKKyAgICB9LAorICAgIHVubW91bnRDb250YWluZXI6IGZ1bmN0aW9uIChjb250YWluZXIpIHsK KyAgICAgIC8vIFRPRE86IElmIHRoaXMgaXMgYSBuZXN0ZWQgY29udGFpbmVyLCB0aGlzIHdvbid0 IGJlIHRoZSByb290LgorICAgICAgdmFyIHJvb3QgPSBjb250YWluZXIuc3RhdGVOb2RlOworICAg ICAgLy8gVE9ETzogVXNlIHBlbmRpbmcgd29yay9zdGF0ZSBpbnN0ZWFkIG9mIHByb3BzLgorICAg ICAgcm9vdC5jdXJyZW50LnBlbmRpbmdQcm9wcyA9IFtdOworCisgICAgICBzY2hlZHVsZVdvcmso cm9vdCk7CisgICAgfSwKKworCisgICAgcGVyZm9ybVdpdGhQcmlvcml0eTogcGVyZm9ybVdpdGhQ cmlvcml0eSwKKworICAgIGdldFB1YmxpY1Jvb3RJbnN0YW5jZTogZnVuY3Rpb24gKGNvbnRhaW5l cikgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9OworfTsKXCBObyBuZXdsaW5lIGF0 IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0 LWRvbS9saWIvUmVhY3RGaWJlclJvb3QuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3Jl YWN0LWRvbS9saWIvUmVhY3RGaWJlclJvb3QuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAuLmYyYmVkODY0Ci0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGlj L3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0RmliZXJSb290LmpzCkBAIC0wLDAgKzEsMjkgQEAK Ky8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCBy aWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRl ciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4g dGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3Jh bnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUg aW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKKwor dmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi9SZWFjdEZpYmVyJyksCisgICAgY3JlYXRlSG9zdENv bnRhaW5lckZpYmVyID0gX3JlcXVpcmUuY3JlYXRlSG9zdENvbnRhaW5lckZpYmVyOworCitleHBv cnRzLmNyZWF0ZUZpYmVyUm9vdCA9IGZ1bmN0aW9uIChjb250YWluZXJJbmZvKSB7CisgIC8vIEN5 Y2xpYyBjb25zdHJ1Y3Rpb24uIFRoaXMgY2hlYXRzIHRoZSB0eXBlIHN5c3RlbSByaWdodCBub3cg YmVjYXVzZQorICAvLyBzdGF0ZU5vZGUgaXMgYW55LgorICB2YXIgdW5pbml0aWFsaXplZEZpYmVy ID0gY3JlYXRlSG9zdENvbnRhaW5lckZpYmVyKCk7CisgIHZhciByb290ID0geworICAgIGN1cnJl bnQ6IHVuaW5pdGlhbGl6ZWRGaWJlciwKKyAgICBjb250YWluZXJJbmZvOiBjb250YWluZXJJbmZv LAorICAgIGlzU2NoZWR1bGVkOiBmYWxzZSwKKyAgICBuZXh0U2NoZWR1bGVkUm9vdDogbnVsbAor ICB9OworICB1bmluaXRpYWxpemVkRmliZXIuc3RhdGVOb2RlID0gcm9vdDsKKyAgcmV0dXJuIHJv b3Q7Cit9OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2Fk bWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdEZpYmVyU2NoZWR1bGVyLmpzIGIv d2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0RmliZXJTY2hlZHVs ZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjBiMTQ5MDYwCi0tLSAv ZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1Jl YWN0RmliZXJTY2hlZHVsZXIuanMKQEAgLTAsMCArMSwzMzEgQEAKKy8qKgorICogQ29weXJpZ2h0 IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg KgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxp Y2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5 IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCBy aWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0 b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFJlYWN0RmliZXJCZWdp bldvcmsgPSByZXF1aXJlKCcuL1JlYWN0RmliZXJCZWdpbldvcmsnKTsKK3ZhciBSZWFjdEZpYmVy Q29tcGxldGVXb3JrID0gcmVxdWlyZSgnLi9SZWFjdEZpYmVyQ29tcGxldGVXb3JrJyk7Cit2YXIg UmVhY3RGaWJlckNvbW1pdFdvcmsgPSByZXF1aXJlKCcuL1JlYWN0RmliZXJDb21taXRXb3JrJyk7 CisKK3ZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4vUmVhY3RGaWJlcicpLAorICAgIGNsb25lRmli ZXIgPSBfcmVxdWlyZS5jbG9uZUZpYmVyOworCit2YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi9S ZWFjdFByaW9yaXR5TGV2ZWwnKSwKKyAgICBOb1dvcmsgPSBfcmVxdWlyZTIuTm9Xb3JrLAorICAg IExvd1ByaW9yaXR5ID0gX3JlcXVpcmUyLkxvd1ByaW9yaXR5LAorICAgIEFuaW1hdGlvblByaW9y aXR5ID0gX3JlcXVpcmUyLkFuaW1hdGlvblByaW9yaXR5LAorICAgIFN5bmNocm9ub3VzUHJpb3Jp dHkgPSBfcmVxdWlyZTIuU3luY2hyb25vdXNQcmlvcml0eTsKKwordmFyIHRpbWVIZXVyaXN0aWNG b3JVbml0T2ZXb3JrID0gMTsKKworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY29uZmlnKSB7 CisgIC8vIFVzZSBhIGNsb3N1cmUgdG8gY2lyY3VtdmVudCB0aGUgY2lyY3VsYXIgZGVwZW5kZW5j eSBiZXR3ZWVuIHRoZSBzY2hlZHVsZXIKKyAgLy8gYW5kIFJlYWN0RmliZXJCZWdpbldvcmsuIERv bid0IGtub3cgaWYgdGhlcmUncyBhIGJldHRlciB3YXkgdG8gZG8gdGhpcy4KKyAgdmFyIHNjaGVk dWxlciA9IHZvaWQgMDsKKyAgZnVuY3Rpb24gZ2V0U2NoZWR1bGVyKCkgeworICAgIHJldHVybiBz Y2hlZHVsZXI7CisgIH0KKworICB2YXIgX1JlYWN0RmliZXJCZWdpbldvcmsgPSBSZWFjdEZpYmVy QmVnaW5Xb3JrKGNvbmZpZywgZ2V0U2NoZWR1bGVyKSwKKyAgICAgIGJlZ2luV29yayA9IF9SZWFj dEZpYmVyQmVnaW5Xb3JrLmJlZ2luV29yazsKKworICB2YXIgX1JlYWN0RmliZXJDb21wbGV0ZVdv ID0gUmVhY3RGaWJlckNvbXBsZXRlV29yayhjb25maWcpLAorICAgICAgY29tcGxldGVXb3JrID0g X1JlYWN0RmliZXJDb21wbGV0ZVdvLmNvbXBsZXRlV29yazsKKworICB2YXIgX1JlYWN0RmliZXJD b21taXRXb3JrID0gUmVhY3RGaWJlckNvbW1pdFdvcmsoY29uZmlnKSwKKyAgICAgIGNvbW1pdFdv cmsgPSBfUmVhY3RGaWJlckNvbW1pdFdvcmsuY29tbWl0V29yazsKKworICB2YXIgc2NoZWR1bGVB bmltYXRpb25DYWxsYmFjayA9IGNvbmZpZy5zY2hlZHVsZUFuaW1hdGlvbkNhbGxiYWNrOworICB2 YXIgc2NoZWR1bGVEZWZlcnJlZENhbGxiYWNrID0gY29uZmlnLnNjaGVkdWxlRGVmZXJyZWRDYWxs YmFjazsKKworICAvLyBUaGUgZGVmYXVsdCBwcmlvcml0eSB0byB1c2UgZm9yIHVwZGF0ZXMuCisg IHZhciBkZWZhdWx0UHJpb3JpdHkgPSBMb3dQcmlvcml0eTsKKworICAvLyBUaGUgbmV4dCB3b3Jr IGluIHByb2dyZXNzIGZpYmVyIHRoYXQgd2UncmUgY3VycmVudGx5IHdvcmtpbmcgb24uCisgIHZh ciBuZXh0VW5pdE9mV29yayA9IG51bGw7CisgIHZhciBuZXh0UHJpb3JpdHlMZXZlbCA9IE5vV29y azsKKworICAvLyBMaW5rZWQgbGlzdCBvZiByb290cyB3aXRoIHNjaGVkdWxlZCB3b3JrIG9uIHRo ZW0uCisgIHZhciBuZXh0U2NoZWR1bGVkUm9vdCA9IG51bGw7CisgIHZhciBsYXN0U2NoZWR1bGVk Um9vdCA9IG51bGw7CisKKyAgZnVuY3Rpb24gZmluZE5leHRVbml0T2ZXb3JrKCkgeworICAgIC8v IENsZWFyIG91dCByb290cyB3aXRoIG5vIG1vcmUgd29yayBvbiB0aGVtLgorICAgIHdoaWxlIChu ZXh0U2NoZWR1bGVkUm9vdCAmJiBuZXh0U2NoZWR1bGVkUm9vdC5jdXJyZW50LnBlbmRpbmdXb3Jr UHJpb3JpdHkgPT09IE5vV29yaykgeworICAgICAgbmV4dFNjaGVkdWxlZFJvb3QuaXNTY2hlZHVs ZWQgPSBmYWxzZTsKKyAgICAgIGlmIChuZXh0U2NoZWR1bGVkUm9vdCA9PT0gbGFzdFNjaGVkdWxl ZFJvb3QpIHsKKyAgICAgICAgbmV4dFNjaGVkdWxlZFJvb3QgPSBudWxsOworICAgICAgICBsYXN0 U2NoZWR1bGVkUm9vdCA9IG51bGw7CisgICAgICAgIG5leHRQcmlvcml0eUxldmVsID0gTm9Xb3Jr OworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIG5leHRTY2hlZHVsZWRSb290 ID0gbmV4dFNjaGVkdWxlZFJvb3QubmV4dFNjaGVkdWxlZFJvb3Q7CisgICAgfQorICAgIC8vIFRP RE86IFRoaXMgaXMgc2Nhbm5pbmcgb25lIHJvb3QgYXQgYSB0aW1lLiBJdCBzaG91bGQgYmUgc2Nh bm5pbmcgYWxsCisgICAgLy8gcm9vdHMgZm9yIGhpZ2ggcHJpb3JpdHkgd29yayBiZWZvcmUgbW92 aW5nIG9uIHRvIGxvd2VyIHByaW9yaXRpZXMuCisgICAgdmFyIHJvb3QgPSBuZXh0U2NoZWR1bGVk Um9vdDsKKyAgICB2YXIgaGlnaGVzdFByaW9yaXR5Um9vdCA9IG51bGw7CisgICAgdmFyIGhpZ2hl c3RQcmlvcml0eUxldmVsID0gTm9Xb3JrOworICAgIHdoaWxlIChyb290KSB7CisgICAgICBpZiAo aGlnaGVzdFByaW9yaXR5TGV2ZWwgPT09IE5vV29yayB8fCBoaWdoZXN0UHJpb3JpdHlMZXZlbCA+ IHJvb3QuY3VycmVudC5wZW5kaW5nV29ya1ByaW9yaXR5KSB7CisgICAgICAgIGhpZ2hlc3RQcmlv cml0eUxldmVsID0gcm9vdC5jdXJyZW50LnBlbmRpbmdXb3JrUHJpb3JpdHk7CisgICAgICAgIGhp Z2hlc3RQcmlvcml0eVJvb3QgPSByb290OworICAgICAgfQorICAgICAgLy8gV2UgZGlkbid0IGZp bmQgYW55dGhpbmcgdG8gZG8gaW4gdGhpcyByb290LCBzbyBsZXQncyB0cnkgdGhlIG5leHQgb25l LgorICAgICAgcm9vdCA9IHJvb3QubmV4dFNjaGVkdWxlZFJvb3Q7CisgICAgfQorICAgIGlmICho aWdoZXN0UHJpb3JpdHlSb290KSB7CisgICAgICBuZXh0UHJpb3JpdHlMZXZlbCA9IGhpZ2hlc3RQ cmlvcml0eUxldmVsOworICAgICAgcmV0dXJuIGNsb25lRmliZXIoaGlnaGVzdFByaW9yaXR5Um9v dC5jdXJyZW50LCBoaWdoZXN0UHJpb3JpdHlMZXZlbCk7CisgICAgfQorCisgICAgbmV4dFByaW9y aXR5TGV2ZWwgPSBOb1dvcms7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBmdW5jdGlvbiBj b21taXRBbGxXb3JrKGZpbmlzaGVkV29yaykgeworICAgIC8vIENvbW1pdCBhbGwgdGhlIHNpZGUt ZWZmZWN0cyB3aXRoaW4gYSB0cmVlLgorICAgIC8vIFRPRE86IEVycm9yIGhhbmRsaW5nLgorICAg IHZhciBlZmZlY3RmdWxGaWJlciA9IGZpbmlzaGVkV29yay5maXJzdEVmZmVjdDsKKyAgICB3aGls ZSAoZWZmZWN0ZnVsRmliZXIpIHsKKyAgICAgIHZhciBjdXJyZW50ID0gZWZmZWN0ZnVsRmliZXIu YWx0ZXJuYXRlOworICAgICAgY29tbWl0V29yayhjdXJyZW50LCBlZmZlY3RmdWxGaWJlcik7Cisg ICAgICB2YXIgbmV4dCA9IGVmZmVjdGZ1bEZpYmVyLm5leHRFZmZlY3Q7CisgICAgICAvLyBFbnN1 cmUgdGhhdCB3ZSBjbGVhbiB0aGVzZSB1cCBzbyB0aGF0IHdlIGRvbid0IGFjY2lkZW50YWxseSBr ZWVwIHRoZW0uCisgICAgICAvLyBJJ20gbm90IGFjdHVhbGx5IHN1cmUgdGhpcyBtYXR0ZXJzIGJl Y2F1c2Ugd2UgY2FuJ3QgcmVzZXQgZmlyc3RFZmZlY3QKKyAgICAgIC8vIGFuZCBsYXN0RWZmZWN0 IHNpbmNlIHRoZXkncmUgb24gZXZlcnkgbm9kZSwgbm90IGp1c3QgdGhlIGVmZmVjdGZ1bAorICAg ICAgLy8gb25lcy4gU28gd2UgaGF2ZSB0byBjbGVhbiBldmVyeXRoaW5nIGFzIHdlIHJldXNlIG5v ZGVzIGFueXdheS4KKyAgICAgIGVmZmVjdGZ1bEZpYmVyLm5leHRFZmZlY3QgPSBudWxsOworICAg ICAgZWZmZWN0ZnVsRmliZXIgPSBuZXh0OworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHJlc2V0 V29ya1ByaW9yaXR5KHdvcmtJblByb2dyZXNzKSB7CisgICAgdmFyIG5ld1ByaW9yaXR5ID0gTm9X b3JrOworICAgIC8vIHByb2dyZXNzZWRDaGlsZCBpcyBnb2luZyB0byBiZSB0aGUgY2hpbGQgc2V0 IHdpdGggdGhlIGhpZ2hlc3QgcHJpb3JpdHkuCisgICAgLy8gRWl0aGVyIGl0IGlzIHRoZSBzYW1l IGFzIGNoaWxkLCBvciBpdCBqdXN0IGJhaWxlZCBvdXQgYmVjYXVzZSBpdCBjaG9vc2UKKyAgICAv LyBub3QgdG8gZG8gdGhlIHdvcmsuCisgICAgdmFyIGNoaWxkID0gd29ya0luUHJvZ3Jlc3MucHJv Z3Jlc3NlZENoaWxkOworICAgIHdoaWxlIChjaGlsZCkgeworICAgICAgLy8gRW5zdXJlIHRoYXQg cmVtYWluaW5nIHdvcmsgcHJpb3JpdHkgYnViYmxlcyB1cC4KKyAgICAgIGlmIChjaGlsZC5wZW5k aW5nV29ya1ByaW9yaXR5ICE9PSBOb1dvcmsgJiYgKG5ld1ByaW9yaXR5ID09PSBOb1dvcmsgfHwg bmV3UHJpb3JpdHkgPiBjaGlsZC5wZW5kaW5nV29ya1ByaW9yaXR5KSkgeworICAgICAgICBuZXdQ cmlvcml0eSA9IGNoaWxkLnBlbmRpbmdXb3JrUHJpb3JpdHk7CisgICAgICB9CisgICAgICBjaGls ZCA9IGNoaWxkLnNpYmxpbmc7CisgICAgfQorICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdXb3Jr UHJpb3JpdHkgPSBuZXdQcmlvcml0eTsKKyAgfQorCisgIGZ1bmN0aW9uIGNvbXBsZXRlVW5pdE9m V29yayh3b3JrSW5Qcm9ncmVzcykgeworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAvLyBUaGUg Y3VycmVudCwgZmx1c2hlZCwgc3RhdGUgb2YgdGhpcyBmaWJlciBpcyB0aGUgYWx0ZXJuYXRlLgor ICAgICAgLy8gSWRlYWxseSBub3RoaW5nIHNob3VsZCByZWx5IG9uIHRoaXMsIGJ1dCByZWx5aW5n IG9uIGl0IGhlcmUKKyAgICAgIC8vIG1lYW5zIHRoYXQgd2UgZG9uJ3QgbmVlZCBhbiBhZGRpdGlv bmFsIGZpZWxkIG9uIHRoZSB3b3JrIGluCisgICAgICAvLyBwcm9ncmVzcy4KKyAgICAgIHZhciBj dXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlOworICAgICAgdmFyIG5leHQgPSBjb21w bGV0ZVdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpOworCisgICAgICByZXNldFdvcmtQcmlv cml0eSh3b3JrSW5Qcm9ncmVzcyk7CisKKyAgICAgIC8vIFRoZSB3b3JrIGlzIG5vdyBkb25lLiBX ZSBkb24ndCBuZWVkIHRoaXMgYW55bW9yZS4gVGhpcyBmbGFncworICAgICAgLy8gdG8gdGhlIHN5 c3RlbSBub3QgdG8gcmVkbyBhbnkgd29yayBoZXJlLgorICAgICAgd29ya0luUHJvZ3Jlc3MucGVu ZGluZ1Byb3BzID0gbnVsbDsKKyAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVs bDsKKworICAgICAgdmFyIHJldHVybkZpYmVyID0gd29ya0luUHJvZ3Jlc3NbJ3JldHVybiddOwor CisgICAgICBpZiAocmV0dXJuRmliZXIpIHsKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIGZp cnN0IGFuZCBsYXN0IGVmZmVjdCBvZiB0aGUgcGFyZW50IGNvcnJlc3BvbmRzCisgICAgICAgIC8v IHRvIHRoZSBjaGlsZHJlbidzIGZpcnN0IGFuZCBsYXN0IGVmZmVjdC4gVGhpcyBwcm9iYWJseSBy ZWxpZXMgb24KKyAgICAgICAgLy8gY2hpbGRyZW4gY29tcGxldGluZyBpbiBvcmRlci4KKyAgICAg ICAgaWYgKCFyZXR1cm5GaWJlci5maXJzdEVmZmVjdCkgeworICAgICAgICAgIHJldHVybkZpYmVy LmZpcnN0RWZmZWN0ID0gd29ya0luUHJvZ3Jlc3MuZmlyc3RFZmZlY3Q7CisgICAgICAgIH0KKyAg ICAgICAgaWYgKHdvcmtJblByb2dyZXNzLmxhc3RFZmZlY3QpIHsKKyAgICAgICAgICBpZiAocmV0 dXJuRmliZXIubGFzdEVmZmVjdCkgeworICAgICAgICAgICAgcmV0dXJuRmliZXIubGFzdEVmZmVj dC5uZXh0RWZmZWN0ID0gd29ya0luUHJvZ3Jlc3MuZmlyc3RFZmZlY3Q7CisgICAgICAgICAgfQor ICAgICAgICAgIHJldHVybkZpYmVyLmxhc3RFZmZlY3QgPSB3b3JrSW5Qcm9ncmVzcy5sYXN0RWZm ZWN0OworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChuZXh0KSB7CisgICAgICAgIC8v IElmIGNvbXBsZXRpbmcgdGhpcyB3b3JrIHNwYXduZWQgbmV3IHdvcmssIGRvIHRoYXQgbmV4dC4K KyAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgICB9IGVsc2UgaWYgKHdvcmtJblByb2dyZXNzLnNp YmxpbmcpIHsKKyAgICAgICAgLy8gSWYgdGhlcmUgaXMgbW9yZSB3b3JrIHRvIGRvIGluIHRoaXMg cmV0dXJuRmliZXIsIGRvIHRoYXQgbmV4dC4KKyAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNz LnNpYmxpbmc7CisgICAgICB9IGVsc2UgaWYgKHJldHVybkZpYmVyKSB7CisgICAgICAgIC8vIElm IHRoZXJlJ3Mgbm8gbW9yZSB3b3JrIGluIHRoaXMgcmV0dXJuRmliZXIuIENvbXBsZXRlIHRoZSBy ZXR1cm5GaWJlci4KKyAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSByZXR1cm5GaWJlcjsKKyAgICAg ICAgY29udGludWU7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBJZiB3ZSdyZSBhdCB0aGUg cm9vdCwgdGhlcmUncyBubyBtb3JlIHdvcmsgdG8gZG8uIFdlIGNhbiBmbHVzaCBpdC4KKyAgICAg ICAgdmFyIF9yb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlOworICAgICAgICBpZiAoX3Jv b3QuY3VycmVudCA9PT0gd29ya0luUHJvZ3Jlc3MpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRXJy b3IoJ0Nhbm5vdCBjb21taXQgdGhlIHNhbWUgdHJlZSBhcyBiZWZvcmUuIFRoaXMgaXMgcHJvYmFi bHkgYSBidWcgJyArICdyZWxhdGVkIHRvIHRoZSByZXR1cm4gZmllbGQuJyk7CisgICAgICAgIH0K KyAgICAgICAgX3Jvb3QuY3VycmVudCA9IHdvcmtJblByb2dyZXNzOworICAgICAgICAvLyBUT0RP OiBXZSBjYW4gYmUgc21hcnRlciBoZXJlIGFuZCBvbmx5IGxvb2sgZm9yIG1vcmUgd29yayBpbiB0 aGUKKyAgICAgICAgLy8gIm5leHQiIHNjaGVkdWxlZCB3b3JrIHNpbmNlIHdlJ3ZlIGFscmVhZHkg c2Nhbm5lZCBwYXNzZWQuIFRoYXQKKyAgICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgd29yayBz Y2hlZHVsZWQgZHVyaW5nIHJlY29uY2lsaWF0aW9uIGdldHMgZGVmZXJyZWQuCisgICAgICAgIC8v IGNvbnN0IGhhc01vcmVXb3JrID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1dvcmtQcmlvcml0eSAh PT0gTm9Xb3JrOworICAgICAgICBjb21taXRBbGxXb3JrKHdvcmtJblByb2dyZXNzKTsKKyAgICAg ICAgdmFyIG5leHRXb3JrID0gZmluZE5leHRVbml0T2ZXb3JrKCk7CisgICAgICAgIC8vIGlmICgh bmV4dFdvcmsgJiYgaGFzTW9yZVdvcmspIHsKKyAgICAgICAgLy8gVE9ETzogVGhpcyBjYW4gaGFw cGVuIHdoZW4gc29tZSBkZWVwIHdvcmsgY29tcGxldGVzIGFuZCB3ZSBkb24ndAorICAgICAgICAv LyBrbm93IGlmIHRoaXMgd2FzIHRoZSBsYXN0IG9uZS4gV2Ugc2hvdWxkIGJlIGFibGUgdG8ga2Vl cCB0cmFjayBvZgorICAgICAgICAvLyB0aGUgaGlnaGVzdCBwcmlvcml0eSBzdGlsbCBpbiB0aGUg dHJlZSBmb3Igb25lIHBhc3MuIEJ1dCBpZiB3ZQorICAgICAgICAvLyB0ZXJtaW5hdGUgYW4gdXBk YXRlIHdlIGRvbid0IGtub3cuCisgICAgICAgIC8vIHRocm93IG5ldyBFcnJvcignRmliZXJSb290 cyBzaG91bGQgbm90IGhhdmUgZmxhZ2dlZCBtb3JlIHdvcmsgaWYgdGhlcmUgaXMgbm9uZS4nKTsK KyAgICAgICAgLy8gfQorICAgICAgICByZXR1cm4gbmV4dFdvcms7CisgICAgICB9CisgICAgfQor ICB9CisKKyAgZnVuY3Rpb24gcGVyZm9ybVVuaXRPZldvcmsod29ya0luUHJvZ3Jlc3MpIHsKKyAg ICAvLyBUaGUgY3VycmVudCwgZmx1c2hlZCwgc3RhdGUgb2YgdGhpcyBmaWJlciBpcyB0aGUgYWx0 ZXJuYXRlLgorICAgIC8vIElkZWFsbHkgbm90aGluZyBzaG91bGQgcmVseSBvbiB0aGlzLCBidXQg cmVseWluZyBvbiBpdCBoZXJlCisgICAgLy8gbWVhbnMgdGhhdCB3ZSBkb24ndCBuZWVkIGFuIGFk ZGl0aW9uYWwgZmllbGQgb24gdGhlIHdvcmsgaW4KKyAgICAvLyBwcm9ncmVzcy4KKyAgICB2YXIg Y3VycmVudCA9IHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZTsKKyAgICB2YXIgbmV4dCA9IGJlZ2lu V29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dFByaW9yaXR5TGV2ZWwpOworCisgICAg aWYgKG5leHQpIHsKKyAgICAgIC8vIElmIHRoaXMgc3Bhd25zIG5ldyB3b3JrLCBkbyB0aGF0IG5l eHQuCisgICAgICByZXR1cm4gbmV4dDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gT3RoZXJ3aXNl LCBjb21wbGV0ZSB0aGUgY3VycmVudCB3b3JrLgorICAgICAgcmV0dXJuIGNvbXBsZXRlVW5pdE9m V29yayh3b3JrSW5Qcm9ncmVzcyk7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gcGVyZm9ybURl ZmVycmVkV29yayhkZWFkbGluZSkgeworICAgIGlmICghbmV4dFVuaXRPZldvcmspIHsKKyAgICAg IG5leHRVbml0T2ZXb3JrID0gZmluZE5leHRVbml0T2ZXb3JrKCk7CisgICAgfQorICAgIHdoaWxl IChuZXh0VW5pdE9mV29yaykgeworICAgICAgaWYgKGRlYWRsaW5lLnRpbWVSZW1haW5pbmcoKSA+ IHRpbWVIZXVyaXN0aWNGb3JVbml0T2ZXb3JrKSB7CisgICAgICAgIG5leHRVbml0T2ZXb3JrID0g cGVyZm9ybVVuaXRPZldvcmsobmV4dFVuaXRPZldvcmspOworICAgICAgICBpZiAoIW5leHRVbml0 T2ZXb3JrKSB7CisgICAgICAgICAgLy8gRmluZCBtb3JlIHdvcmsuIFdlIG1pZ2h0IGhhdmUgdGlt ZSB0byBjb21wbGV0ZSBzb21lIG1vcmUuCisgICAgICAgICAgbmV4dFVuaXRPZldvcmsgPSBmaW5k TmV4dFVuaXRPZldvcmsoKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2No ZWR1bGVEZWZlcnJlZENhbGxiYWNrKHBlcmZvcm1EZWZlcnJlZFdvcmspOworICAgICAgICByZXR1 cm47CisgICAgICB9CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gc2NoZWR1bGVEZWZlcnJlZFdv cmsocm9vdCwgcHJpb3JpdHkpIHsKKyAgICAvLyBXZSBtdXN0IHJlc2V0IHRoZSBjdXJyZW50IHVu aXQgb2Ygd29yayBwb2ludGVyIHNvIHRoYXQgd2UgcmVzdGFydCB0aGUKKyAgICAvLyBzZWFyY2gg ZnJvbSB0aGUgcm9vdCBkdXJpbmcgdGhlIG5leHQgdGljaywgaW4gY2FzZSB0aGVyZSBpcyBub3cg aGlnaGVyCisgICAgLy8gcHJpb3JpdHkgd29yayBzb21ld2hlcmUgZWFybGllciB0aGFuIGJlZm9y ZS4KKyAgICBpZiAocHJpb3JpdHkgPD0gbmV4dFByaW9yaXR5TGV2ZWwpIHsKKyAgICAgIG5leHRV bml0T2ZXb3JrID0gbnVsbDsKKyAgICB9CisKKyAgICAvLyBTZXQgdGhlIHByaW9yaXR5IG9uIHRo ZSByb290LCB3aXRob3V0IGRlcHJpb3JpdGl6aW5nCisgICAgaWYgKHJvb3QuY3VycmVudC5wZW5k aW5nV29ya1ByaW9yaXR5ID09PSBOb1dvcmsgfHwgcHJpb3JpdHkgPD0gcm9vdC5jdXJyZW50LnBl bmRpbmdXb3JrUHJpb3JpdHkpIHsKKyAgICAgIHJvb3QuY3VycmVudC5wZW5kaW5nV29ya1ByaW9y aXR5ID0gcHJpb3JpdHk7CisgICAgfQorCisgICAgaWYgKHJvb3QuaXNTY2hlZHVsZWQpIHsKKyAg ICAgIC8vIElmIHdlJ3JlIGFscmVhZHkgc2NoZWR1bGVkLCB3ZSBjYW4gYmFpbCBvdXQuCisgICAg ICByZXR1cm47CisgICAgfQorICAgIHJvb3QuaXNTY2hlZHVsZWQgPSB0cnVlOworICAgIGlmIChs YXN0U2NoZWR1bGVkUm9vdCkgeworICAgICAgLy8gU2NoZWR1bGUgb3Vyc2VsdmVzIHRvIHRoZSBl bmQuCisgICAgICBsYXN0U2NoZWR1bGVkUm9vdC5uZXh0U2NoZWR1bGVkUm9vdCA9IHJvb3Q7Cisg ICAgICBsYXN0U2NoZWR1bGVkUm9vdCA9IHJvb3Q7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFdl J3JlIHRoZSBvbmx5IHdvcmsgc2NoZWR1bGVkLgorICAgICAgbmV4dFNjaGVkdWxlZFJvb3QgPSBy b290OworICAgICAgbGFzdFNjaGVkdWxlZFJvb3QgPSByb290OworICAgICAgc2NoZWR1bGVEZWZl cnJlZENhbGxiYWNrKHBlcmZvcm1EZWZlcnJlZFdvcmspOworICAgIH0KKyAgfQorCisgIGZ1bmN0 aW9uIHBlcmZvcm1BbmltYXRpb25Xb3JrKCkgeworICAgIC8vIEFsd2F5cyBzdGFydCBmcm9tIHRo ZSByb290CisgICAgbmV4dFVuaXRPZldvcmsgPSBmaW5kTmV4dFVuaXRPZldvcmsoKTsKKyAgICB3 aGlsZSAobmV4dFVuaXRPZldvcmsgJiYgbmV4dFByaW9yaXR5TGV2ZWwgIT09IE5vV29yaykgewor ICAgICAgbmV4dFVuaXRPZldvcmsgPSBwZXJmb3JtVW5pdE9mV29yayhuZXh0VW5pdE9mV29yayk7 CisgICAgICBpZiAoIW5leHRVbml0T2ZXb3JrKSB7CisgICAgICAgIC8vIEtlZXAgc2VhcmNoaW5n IGZvciBhbmltYXRpb24gd29yayB1bnRpbCB0aGVyZSdzIG5vIG1vcmUgbGVmdAorICAgICAgICBu ZXh0VW5pdE9mV29yayA9IGZpbmROZXh0VW5pdE9mV29yaygpOworICAgICAgfQorICAgICAgLy8g U3RvcCBpZiB0aGUgbmV4dCB1bml0IG9mIHdvcmsgaXMgbG93IHByaW9yaXR5CisgICAgICBpZiAo bmV4dFByaW9yaXR5TGV2ZWwgPiBBbmltYXRpb25Qcmlvcml0eSkgeworICAgICAgICBzY2hlZHVs ZURlZmVycmVkQ2FsbGJhY2socGVyZm9ybURlZmVycmVkV29yayk7CisgICAgICAgIHJldHVybjsK KyAgICAgIH0KKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBzY2hlZHVsZUFuaW1hdGlvbldvcmso cm9vdCwgcHJpb3JpdHlMZXZlbCkgeworICAgIC8vIFNldCB0aGUgcHJpb3JpdHkgb24gdGhlIHJv b3QsIHdpdGhvdXQgZGVwcmlvcml0aXppbmcKKyAgICBpZiAocm9vdC5jdXJyZW50LnBlbmRpbmdX b3JrUHJpb3JpdHkgPT09IE5vV29yayB8fCBwcmlvcml0eUxldmVsIDw9IHJvb3QuY3VycmVudC5w ZW5kaW5nV29ya1ByaW9yaXR5KSB7CisgICAgICByb290LmN1cnJlbnQucGVuZGluZ1dvcmtQcmlv cml0eSA9IHByaW9yaXR5TGV2ZWw7CisgICAgfQorCisgICAgaWYgKHJvb3QuaXNTY2hlZHVsZWQp IHsKKyAgICAgIC8vIElmIHdlJ3JlIGFscmVhZHkgc2NoZWR1bGVkLCB3ZSBjYW4gYmFpbCBvdXQu CisgICAgICByZXR1cm47CisgICAgfQorICAgIHJvb3QuaXNTY2hlZHVsZWQgPSB0cnVlOworICAg IGlmIChsYXN0U2NoZWR1bGVkUm9vdCkgeworICAgICAgLy8gU2NoZWR1bGUgb3Vyc2VsdmVzIHRv IHRoZSBlbmQuCisgICAgICBsYXN0U2NoZWR1bGVkUm9vdC5uZXh0U2NoZWR1bGVkUm9vdCA9IHJv b3Q7CisgICAgICBsYXN0U2NoZWR1bGVkUm9vdCA9IHJvb3Q7CisgICAgfSBlbHNlIHsKKyAgICAg IC8vIFdlJ3JlIHRoZSBvbmx5IHdvcmsgc2NoZWR1bGVkLgorICAgICAgbmV4dFNjaGVkdWxlZFJv b3QgPSByb290OworICAgICAgbGFzdFNjaGVkdWxlZFJvb3QgPSByb290OworICAgICAgc2NoZWR1 bGVBbmltYXRpb25DYWxsYmFjayhwZXJmb3JtQW5pbWF0aW9uV29yayk7CisgICAgfQorICB9CisK KyAgZnVuY3Rpb24gc2NoZWR1bGVXb3JrKHJvb3QpIHsKKyAgICBpZiAoZGVmYXVsdFByaW9yaXR5 ID09PSBTeW5jaHJvbm91c1ByaW9yaXR5KSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBp bXBsZW1lbnRlZCB5ZXQnKTsKKyAgICB9CisKKyAgICBpZiAoZGVmYXVsdFByaW9yaXR5ID09PSBO b1dvcmspIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGRlZmF1bHRQcmlvcml0eSA+ IEFuaW1hdGlvblByaW9yaXR5KSB7CisgICAgICBzY2hlZHVsZURlZmVycmVkV29yayhyb290LCBk ZWZhdWx0UHJpb3JpdHkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzY2hlZHVsZUFuaW1h dGlvbldvcmsocm9vdCwgZGVmYXVsdFByaW9yaXR5KTsKKyAgfQorCisgIGZ1bmN0aW9uIHBlcmZv cm1XaXRoUHJpb3JpdHkocHJpb3JpdHlMZXZlbCwgZm4pIHsKKyAgICB2YXIgcHJldmlvdXNEZWZh dWx0UHJpb3JpdHkgPSBkZWZhdWx0UHJpb3JpdHk7CisgICAgZGVmYXVsdFByaW9yaXR5ID0gcHJp b3JpdHlMZXZlbDsKKyAgICB0cnkgeworICAgICAgZm4oKTsKKyAgICB9IGZpbmFsbHkgeworICAg ICAgZGVmYXVsdFByaW9yaXR5ID0gcHJldmlvdXNEZWZhdWx0UHJpb3JpdHk7CisgICAgfQorICB9 CisKKyAgc2NoZWR1bGVyID0geworICAgIHNjaGVkdWxlV29yazogc2NoZWR1bGVXb3JrLAorICAg IHNjaGVkdWxlRGVmZXJyZWRXb3JrOiBzY2hlZHVsZURlZmVycmVkV29yaywKKyAgICBwZXJmb3Jt V2l0aFByaW9yaXR5OiBwZXJmb3JtV2l0aFByaW9yaXR5CisgIH07CisgIHJldHVybiBzY2hlZHVs ZXI7Cit9OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2Fk bWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdEZpYmVyVXBkYXRlUXVldWUuanMg Yi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RGaWJlclVwZGF0 ZVF1ZXVlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi5mMTA0YTVhMwot LS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xp Yi9SZWFjdEZpYmVyVXBkYXRlUXVldWUuanMKQEAgLTAsMCArMSw3NyBAQAorLyoqCisgKiBDb3B5 cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZl ZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5 bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJl Y3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0 ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBk aXJlY3RvcnkuCisgKgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX2Fzc2lnbiA9 IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTsKKworZXhwb3J0cy5jcmVhdGVVcGRhdGVRdWV1ZSA9 IGZ1bmN0aW9uIChwYXJ0aWFsU3RhdGUpIHsKKyAgdmFyIHF1ZXVlID0geworICAgIHBhcnRpYWxT dGF0ZTogcGFydGlhbFN0YXRlLAorICAgIGNhbGxiYWNrOiBudWxsLAorICAgIGNhbGxiYWNrV2Fz Q2FsbGVkOiBmYWxzZSwKKyAgICBuZXh0OiBudWxsLAorICAgIGlzUmVwbGFjZTogZmFsc2UsCisg ICAgaXNGb3JjZWQ6IGZhbHNlLAorICAgIHRhaWw6IG51bGwKKyAgfTsKKyAgcXVldWUudGFpbCA9 IHF1ZXVlOworICByZXR1cm4gcXVldWU7Cit9OworCitleHBvcnRzLmFkZFRvUXVldWUgPSBmdW5j dGlvbiAocXVldWUsIHBhcnRpYWxTdGF0ZSkgeworICB2YXIgbm9kZSA9IHsKKyAgICBwYXJ0aWFs U3RhdGU6IHBhcnRpYWxTdGF0ZSwKKyAgICBjYWxsYmFjazogbnVsbCwKKyAgICBjYWxsYmFja1dh c0NhbGxlZDogZmFsc2UsCisgICAgbmV4dDogbnVsbAorICB9OworICBxdWV1ZS50YWlsLm5leHQg PSBub2RlOworICBxdWV1ZS50YWlsID0gbm9kZTsKKyAgcmV0dXJuIHF1ZXVlOworfTsKKworZXhw b3J0cy5hZGRDYWxsYmFja1RvUXVldWUgPSBmdW5jdGlvbiAocXVldWUsIGNhbGxiYWNrKSB7Cisg IGlmIChxdWV1ZS50YWlsLmNhbGxiYWNrKSB7CisgICAgLy8gSWYgdGhlIHRhaWwgYWxyZWFkeSBh cyBhIGNhbGxiYWNrLCBhZGQgYW4gZW1wdHkgbm9kZSB0byBxdWV1ZQorICAgIGV4cG9ydHMuYWRk VG9RdWV1ZShxdWV1ZSwgbnVsbCk7CisgIH0KKyAgcXVldWUudGFpbC5jYWxsYmFjayA9IGNhbGxi YWNrOworICByZXR1cm4gcXVldWU7Cit9OworCitleHBvcnRzLmNhbGxDYWxsYmFja3MgPSBmdW5j dGlvbiAocXVldWUsIGNvbnRleHQpIHsKKyAgdmFyIG5vZGUgPSBxdWV1ZTsKKyAgd2hpbGUgKG5v ZGUpIHsKKyAgICBpZiAobm9kZS5jYWxsYmFjayAmJiAhbm9kZS5jYWxsYmFja1dhc0NhbGxlZCkg eworICAgICAgbm9kZS5jYWxsYmFja1dhc0NhbGxlZCA9IHRydWU7CisgICAgICBub2RlLmNhbGxi YWNrLmNhbGwoY29udGV4dCk7CisgICAgfQorICAgIG5vZGUgPSBub2RlLm5leHQ7CisgIH0KK307 CisKK2V4cG9ydHMubWVyZ2VVcGRhdGVRdWV1ZSA9IGZ1bmN0aW9uIChxdWV1ZSwgcHJldlN0YXRl LCBwcm9wcykgeworICB2YXIgbm9kZSA9IHF1ZXVlOworICB2YXIgc3RhdGUgPSBxdWV1ZS5pc1Jl cGxhY2UgPyBudWxsIDogX2Fzc2lnbih7fSwgcHJldlN0YXRlKTsKKyAgd2hpbGUgKG5vZGUpIHsK KyAgICB2YXIgX3BhcnRpYWxTdGF0ZSA9IHZvaWQgMDsKKyAgICBpZiAodHlwZW9mIG5vZGUucGFy dGlhbFN0YXRlID09PSAnZnVuY3Rpb24nKSB7CisgICAgICB2YXIgdXBkYXRlRm4gPSBub2RlLnBh cnRpYWxTdGF0ZTsKKyAgICAgIF9wYXJ0aWFsU3RhdGUgPSB1cGRhdGVGbihzdGF0ZSwgcHJvcHMp OworICAgIH0gZWxzZSB7CisgICAgICBfcGFydGlhbFN0YXRlID0gbm9kZS5wYXJ0aWFsU3RhdGU7 CisgICAgfQorICAgIHN0YXRlID0gX2Fzc2lnbihzdGF0ZSB8fCB7fSwgX3BhcnRpYWxTdGF0ZSk7 CisgICAgbm9kZSA9IG5vZGUubmV4dDsKKyAgfQorICByZXR1cm4gc3RhdGU7Cit9OwpcIE5vIG5l d2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5k b3IvcmVhY3QtZG9tL2xpYi9SZWFjdEhvc3RDb21wb25lbnQuanMgYi93ZWIvcGdhZG1pbi9zdGF0 aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RIb3N0Q29tcG9uZW50LmpzCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi40YmI2YzAwNQotLS0gL2Rldi9udWxsCisrKyBiL3dl Yi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdEhvc3RDb21wb25lbnQu anMKQEAgLTAsMCArMSw2NyBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNl Ym9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBj b2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUK KyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJl ZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQg aW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1 c2Ugc3RyaWN0JzsKKwordmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJ bnZhcmlhbnQnKTsKKwordmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFu dCcpOworCit2YXIgZ2VuZXJpY0NvbXBvbmVudENsYXNzID0gbnVsbDsKK3ZhciB0ZXh0Q29tcG9u ZW50Q2xhc3MgPSBudWxsOworCit2YXIgUmVhY3RIb3N0Q29tcG9uZW50SW5qZWN0aW9uID0gewor ICAvLyBUaGlzIGFjY2VwdHMgYSBjbGFzcyB0aGF0IHJlY2VpdmVzIHRoZSB0YWcgc3RyaW5nLiBU aGlzIGlzIGEgY2F0Y2ggYWxsCisgIC8vIHRoYXQgY2FuIHJlbmRlciBhbnkga2luZCBvZiB0YWcu CisgIGluamVjdEdlbmVyaWNDb21wb25lbnRDbGFzczogZnVuY3Rpb24gKGNvbXBvbmVudENsYXNz KSB7CisgICAgZ2VuZXJpY0NvbXBvbmVudENsYXNzID0gY29tcG9uZW50Q2xhc3M7CisgIH0sCisg IC8vIFRoaXMgYWNjZXB0cyBhIHRleHQgY29tcG9uZW50IGNsYXNzIHRoYXQgdGFrZXMgdGhlIHRl eHQgc3RyaW5nIHRvIGJlCisgIC8vIHJlbmRlcmVkIGFzIHByb3BzLgorICBpbmplY3RUZXh0Q29t cG9uZW50Q2xhc3M6IGZ1bmN0aW9uIChjb21wb25lbnRDbGFzcykgeworICAgIHRleHRDb21wb25l bnRDbGFzcyA9IGNvbXBvbmVudENsYXNzOworICB9Cit9OworCisvKioKKyAqIEdldCBhIGhvc3Qg aW50ZXJuYWwgY29tcG9uZW50IGNsYXNzIGZvciBhIHNwZWNpZmljIHRhZy4KKyAqCisgKiBAcGFy YW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudCBUaGUgZWxlbWVudCB0byBjcmVhdGUuCisgKiBAcmV0 dXJuIHtmdW5jdGlvbn0gVGhlIGludGVybmFsIGNsYXNzIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLgor ICovCitmdW5jdGlvbiBjcmVhdGVJbnRlcm5hbENvbXBvbmVudChlbGVtZW50KSB7CisgICFnZW5l cmljQ29tcG9uZW50Q2xhc3MgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24n ID8gaW52YXJpYW50KGZhbHNlLCAnVGhlcmUgaXMgbm8gcmVnaXN0ZXJlZCBjb21wb25lbnQgZm9y IHRoZSB0YWcgJXMnLCBlbGVtZW50LnR5cGUpIDogX3Byb2RJbnZhcmlhbnQoJzExMScsIGVsZW1l bnQudHlwZSkgOiB2b2lkIDA7CisgIHJldHVybiBuZXcgZ2VuZXJpY0NvbXBvbmVudENsYXNzKGVs ZW1lbnQpOworfQorCisvKioKKyAqIEBwYXJhbSB7UmVhY3RUZXh0fSB0ZXh0CisgKiBAcmV0dXJu IHtSZWFjdENvbXBvbmVudH0KKyAqLworZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VGb3JUZXh0KHRl eHQpIHsKKyAgcmV0dXJuIG5ldyB0ZXh0Q29tcG9uZW50Q2xhc3ModGV4dCk7Cit9CisKKy8qKgor ICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gY29tcG9uZW50CisgKiBAcmV0dXJuIHtib29sZWFu fQorICovCitmdW5jdGlvbiBpc1RleHRDb21wb25lbnQoY29tcG9uZW50KSB7CisgIHJldHVybiBj b21wb25lbnQgaW5zdGFuY2VvZiB0ZXh0Q29tcG9uZW50Q2xhc3M7Cit9CisKK3ZhciBSZWFjdEhv c3RDb21wb25lbnQgPSB7CisgIGNyZWF0ZUludGVybmFsQ29tcG9uZW50OiBjcmVhdGVJbnRlcm5h bENvbXBvbmVudCwKKyAgY3JlYXRlSW5zdGFuY2VGb3JUZXh0OiBjcmVhdGVJbnN0YW5jZUZvclRl eHQsCisgIGlzVGV4dENvbXBvbmVudDogaXNUZXh0Q29tcG9uZW50LAorICBpbmplY3Rpb246IFJl YWN0SG9zdENvbXBvbmVudEluamVjdGlvbgorfTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdEhv c3RDb21wb25lbnQ7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2Vi L3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0SG9zdE9wZXJhdGlvbkhp c3RvcnlIb29rLmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1Jl YWN0SG9zdE9wZXJhdGlvbkhpc3RvcnlIb29rLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAwLi4yN2QzZjkzNAotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRp Yy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdEhvc3RPcGVyYXRpb25IaXN0b3J5SG9vay5qcwpA QCAtMCwwICsxLDMzIEBACisvKioKKyAqIENvcHlyaWdodCAyMDE2LXByZXNlbnQsIEZhY2Vib29r LCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUg aXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICog TElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBB biBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0 aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisn dXNlIHN0cmljdCc7CisKK3ZhciBoaXN0b3J5ID0gW107CisKK3ZhciBSZWFjdEhvc3RPcGVyYXRp b25IaXN0b3J5SG9vayA9IHsKKyAgb25Ib3N0T3BlcmF0aW9uOiBmdW5jdGlvbiAob3BlcmF0aW9u KSB7CisgICAgaGlzdG9yeS5wdXNoKG9wZXJhdGlvbik7CisgIH0sCisgIGNsZWFySGlzdG9yeTog ZnVuY3Rpb24gKCkgeworICAgIGlmIChSZWFjdEhvc3RPcGVyYXRpb25IaXN0b3J5SG9vay5fcHJl dmVudENsZWFyaW5nKSB7CisgICAgICAvLyBTaG91bGQgb25seSBiZSB1c2VkIGZvciB0ZXN0cy4K KyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBoaXN0b3J5ID0gW107CisgIH0sCisgIGdldEhp c3Rvcnk6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gaGlzdG9yeTsKKyAgfQorfTsKKworbW9k dWxlLmV4cG9ydHMgPSBSZWFjdEhvc3RPcGVyYXRpb25IaXN0b3J5SG9vazsKXCBObyBuZXdsaW5l IGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3Jl YWN0LWRvbS9saWIvUmVhY3RJbmplY3Rpb24uanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9y L3JlYWN0LWRvbS9saWIvUmVhY3RJbmplY3Rpb24uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAuLjZhMmJiZDEwCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3Rh dGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0SW5qZWN0aW9uLmpzCkBAIC0wLDAgKzEsMzMg QEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFs bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1 bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUg aW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwg Z3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZp bGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3Zh ciBET01Qcm9wZXJ0eSA9IHJlcXVpcmUoJy4vRE9NUHJvcGVydHknKTsKK3ZhciBFdmVudFBsdWdp bkh1YiA9IHJlcXVpcmUoJy4vRXZlbnRQbHVnaW5IdWInKTsKK3ZhciBFdmVudFBsdWdpblV0aWxz ID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpblV0aWxzJyk7Cit2YXIgUmVhY3RDb21wb25lbnRFbnZp cm9ubWVudCA9IHJlcXVpcmUoJy4vUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudCcpOwordmFyIFJl YWN0RW1wdHlDb21wb25lbnQgPSByZXF1aXJlKCcuL1JlYWN0RW1wdHlDb21wb25lbnQnKTsKK3Zh ciBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCcuL1JlYWN0QnJvd3NlckV2ZW50 RW1pdHRlcicpOwordmFyIFJlYWN0SG9zdENvbXBvbmVudCA9IHJlcXVpcmUoJy4vUmVhY3RIb3N0 Q29tcG9uZW50Jyk7Cit2YXIgUmVhY3RVcGRhdGVzID0gcmVxdWlyZSgnLi9SZWFjdFVwZGF0ZXMn KTsKKwordmFyIFJlYWN0SW5qZWN0aW9uID0geworICBDb21wb25lbnQ6IFJlYWN0Q29tcG9uZW50 RW52aXJvbm1lbnQuaW5qZWN0aW9uLAorICBET01Qcm9wZXJ0eTogRE9NUHJvcGVydHkuaW5qZWN0 aW9uLAorICBFbXB0eUNvbXBvbmVudDogUmVhY3RFbXB0eUNvbXBvbmVudC5pbmplY3Rpb24sCisg IEV2ZW50UGx1Z2luSHViOiBFdmVudFBsdWdpbkh1Yi5pbmplY3Rpb24sCisgIEV2ZW50UGx1Z2lu VXRpbHM6IEV2ZW50UGx1Z2luVXRpbHMuaW5qZWN0aW9uLAorICBFdmVudEVtaXR0ZXI6IFJlYWN0 QnJvd3NlckV2ZW50RW1pdHRlci5pbmplY3Rpb24sCisgIEhvc3RDb21wb25lbnQ6IFJlYWN0SG9z dENvbXBvbmVudC5pbmplY3Rpb24sCisgIFVwZGF0ZXM6IFJlYWN0VXBkYXRlcy5pbmplY3Rpb24K K307CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RJbmplY3Rpb247ClwgTm8gbmV3bGluZSBhdCBl bmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1k b20vbGliL1JlYWN0SW5wdXRTZWxlY3Rpb24uanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9y L3JlYWN0LWRvbS9saWIvUmVhY3RJbnB1dFNlbGVjdGlvbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwMC4uOTEzMDg2NDYKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1p bi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RJbnB1dFNlbGVjdGlvbi5qcwpAQCAt MCwwICsxLDEyMyBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywg SW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlz IGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJ Q0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4g YWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhl IFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3Ry aWN0JzsKKwordmFyIFJlYWN0RE9NU2VsZWN0aW9uID0gcmVxdWlyZSgnLi9SZWFjdERPTVNlbGVj dGlvbicpOworCit2YXIgY29udGFpbnNOb2RlID0gcmVxdWlyZSgnZmJqcy9saWIvY29udGFpbnNO b2RlJyk7Cit2YXIgZm9jdXNOb2RlID0gcmVxdWlyZSgnZmJqcy9saWIvZm9jdXNOb2RlJyk7Cit2 YXIgZ2V0QWN0aXZlRWxlbWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL2dldEFjdGl2ZUVsZW1lbnQn KTsKKworZnVuY3Rpb24gaXNJbkRvY3VtZW50KG5vZGUpIHsKKyAgcmV0dXJuIGNvbnRhaW5zTm9k ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIG5vZGUpOworfQorCisvKioKKyAqIEBSZWFjdElu cHV0U2VsZWN0aW9uOiBSZWFjdCBpbnB1dCBzZWxlY3Rpb24gbW9kdWxlLiBCYXNlZCBvbiBTZWxl Y3Rpb24uanMsCisgKiBidXQgbW9kaWZpZWQgdG8gYmUgc3VpdGFibGUgZm9yIHJlYWN0IGFuZCBo YXMgYSBjb3VwbGUgb2YgYnVnIGZpeGVzIChkb2Vzbid0CisgKiBhc3N1bWUgYnV0dG9ucyBoYXZl IHJhbmdlIHNlbGVjdGlvbnMgYWxsb3dlZCkuCisgKiBJbnB1dCBzZWxlY3Rpb24gbW9kdWxlIGZv ciBSZWFjdC4KKyAqLwordmFyIFJlYWN0SW5wdXRTZWxlY3Rpb24gPSB7CisKKyAgaGFzU2VsZWN0 aW9uQ2FwYWJpbGl0aWVzOiBmdW5jdGlvbiAoZWxlbSkgeworICAgIHZhciBub2RlTmFtZSA9IGVs ZW0gJiYgZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CisgICAg cmV0dXJuIG5vZGVOYW1lICYmIChub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiBlbGVtLnR5cGUgPT09 ICd0ZXh0JyB8fCBub2RlTmFtZSA9PT0gJ3RleHRhcmVhJyB8fCBlbGVtLmNvbnRlbnRFZGl0YWJs ZSA9PT0gJ3RydWUnKTsKKyAgfSwKKworICBnZXRTZWxlY3Rpb25JbmZvcm1hdGlvbjogZnVuY3Rp b24gKCkgeworICAgIHZhciBmb2N1c2VkRWxlbSA9IGdldEFjdGl2ZUVsZW1lbnQoKTsKKyAgICBy ZXR1cm4geworICAgICAgZm9jdXNlZEVsZW06IGZvY3VzZWRFbGVtLAorICAgICAgc2VsZWN0aW9u UmFuZ2U6IFJlYWN0SW5wdXRTZWxlY3Rpb24uaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKGZvY3Vz ZWRFbGVtKSA/IFJlYWN0SW5wdXRTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uKGZvY3VzZWRFbGVtKSA6 IG51bGwKKyAgICB9OworICB9LAorCisgIC8qKgorICAgKiBAcmVzdG9yZVNlbGVjdGlvbjogSWYg YW55IHNlbGVjdGlvbiBpbmZvcm1hdGlvbiB3YXMgcG90ZW50aWFsbHkgbG9zdCwKKyAgICogcmVz dG9yZSBpdC4gVGhpcyBpcyB1c2VmdWwgd2hlbiBwZXJmb3JtaW5nIG9wZXJhdGlvbnMgdGhhdCBj b3VsZCByZW1vdmUgZG9tCisgICAqIG5vZGVzIGFuZCBwbGFjZSB0aGVtIGJhY2sgaW4sIHJlc3Vs dGluZyBpbiBmb2N1cyBiZWluZyBsb3N0LgorICAgKi8KKyAgcmVzdG9yZVNlbGVjdGlvbjogZnVu Y3Rpb24gKHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24pIHsKKyAgICB2YXIgY3VyRm9jdXNlZEVs ZW0gPSBnZXRBY3RpdmVFbGVtZW50KCk7CisgICAgdmFyIHByaW9yRm9jdXNlZEVsZW0gPSBwcmlv clNlbGVjdGlvbkluZm9ybWF0aW9uLmZvY3VzZWRFbGVtOworICAgIHZhciBwcmlvclNlbGVjdGlv blJhbmdlID0gcHJpb3JTZWxlY3Rpb25JbmZvcm1hdGlvbi5zZWxlY3Rpb25SYW5nZTsKKyAgICBp ZiAoY3VyRm9jdXNlZEVsZW0gIT09IHByaW9yRm9jdXNlZEVsZW0gJiYgaXNJbkRvY3VtZW50KHBy aW9yRm9jdXNlZEVsZW0pKSB7CisgICAgICBpZiAoUmVhY3RJbnB1dFNlbGVjdGlvbi5oYXNTZWxl Y3Rpb25DYXBhYmlsaXRpZXMocHJpb3JGb2N1c2VkRWxlbSkpIHsKKyAgICAgICAgUmVhY3RJbnB1 dFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24ocHJpb3JGb2N1c2VkRWxlbSwgcHJpb3JTZWxlY3Rpb25S YW5nZSk7CisgICAgICB9CisgICAgICBmb2N1c05vZGUocHJpb3JGb2N1c2VkRWxlbSk7CisgICAg fQorICB9LAorCisgIC8qKgorICAgKiBAZ2V0U2VsZWN0aW9uOiBHZXRzIHRoZSBzZWxlY3Rpb24g Ym91bmRzIG9mIGEgZm9jdXNlZCB0ZXh0YXJlYSwgaW5wdXQgb3IKKyAgICogY29udGVudEVkaXRh YmxlIG5vZGUuCisgICAqIC1AaW5wdXQ6IExvb2sgdXAgc2VsZWN0aW9uIGJvdW5kcyBvZiB0aGlz IGlucHV0CisgICAqIC1AcmV0dXJuIHtzdGFydDogc2VsZWN0aW9uU3RhcnQsIGVuZDogc2VsZWN0 aW9uRW5kfQorICAgKi8KKyAgZ2V0U2VsZWN0aW9uOiBmdW5jdGlvbiAoaW5wdXQpIHsKKyAgICB2 YXIgc2VsZWN0aW9uOworCisgICAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gaW5wdXQpIHsKKyAg ICAgIC8vIE1vZGVybiBicm93c2VyIHdpdGggaW5wdXQgb3IgdGV4dGFyZWEuCisgICAgICBzZWxl Y3Rpb24gPSB7CisgICAgICAgIHN0YXJ0OiBpbnB1dC5zZWxlY3Rpb25TdGFydCwKKyAgICAgICAg ZW5kOiBpbnB1dC5zZWxlY3Rpb25FbmQKKyAgICAgIH07CisgICAgfSBlbHNlIGlmIChkb2N1bWVu dC5zZWxlY3Rpb24gJiYgaW5wdXQubm9kZU5hbWUgJiYgaW5wdXQubm9kZU5hbWUudG9Mb3dlckNh c2UoKSA9PT0gJ2lucHV0JykgeworICAgICAgLy8gSUU4IGlucHV0LgorICAgICAgdmFyIHJhbmdl ID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7CisgICAgICAvLyBUaGVyZSBjYW4g b25seSBiZSBvbmUgc2VsZWN0aW9uIHBlciBkb2N1bWVudCBpbiBJRSwgc28gaXQgbXVzdAorICAg ICAgLy8gYmUgaW4gb3VyIGVsZW1lbnQuCisgICAgICBpZiAocmFuZ2UucGFyZW50RWxlbWVudCgp ID09PSBpbnB1dCkgeworICAgICAgICBzZWxlY3Rpb24gPSB7CisgICAgICAgICAgc3RhcnQ6IC1y YW5nZS5tb3ZlU3RhcnQoJ2NoYXJhY3RlcicsIC1pbnB1dC52YWx1ZS5sZW5ndGgpLAorICAgICAg ICAgIGVuZDogLXJhbmdlLm1vdmVFbmQoJ2NoYXJhY3RlcicsIC1pbnB1dC52YWx1ZS5sZW5ndGgp CisgICAgICAgIH07CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIENvbnRlbnQgZWRp dGFibGUgb3Igb2xkIElFIHRleHRhcmVhLgorICAgICAgc2VsZWN0aW9uID0gUmVhY3RET01TZWxl Y3Rpb24uZ2V0T2Zmc2V0cyhpbnB1dCk7CisgICAgfQorCisgICAgcmV0dXJuIHNlbGVjdGlvbiB8 fCB7IHN0YXJ0OiAwLCBlbmQ6IDAgfTsKKyAgfSwKKworICAvKioKKyAgICogQHNldFNlbGVjdGlv bjogU2V0cyB0aGUgc2VsZWN0aW9uIGJvdW5kcyBvZiBhIHRleHRhcmVhIG9yIGlucHV0IGFuZCBm b2N1c2VzCisgICAqIHRoZSBpbnB1dC4KKyAgICogLUBpbnB1dCAgICAgU2V0IHNlbGVjdGlvbiBi b3VuZHMgb2YgdGhpcyBpbnB1dCBvciB0ZXh0YXJlYQorICAgKiAtQG9mZnNldHMgICBPYmplY3Qg b2Ygc2FtZSBmb3JtIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSBnZXQqCisgICAqLworICBzZXRTZWxl Y3Rpb246IGZ1bmN0aW9uIChpbnB1dCwgb2Zmc2V0cykgeworICAgIHZhciBzdGFydCA9IG9mZnNl dHMuc3RhcnQ7CisgICAgdmFyIGVuZCA9IG9mZnNldHMuZW5kOworICAgIGlmIChlbmQgPT09IHVu ZGVmaW5lZCkgeworICAgICAgZW5kID0gc3RhcnQ7CisgICAgfQorCisgICAgaWYgKCdzZWxlY3Rp b25TdGFydCcgaW4gaW5wdXQpIHsKKyAgICAgIGlucHV0LnNlbGVjdGlvblN0YXJ0ID0gc3RhcnQ7 CisgICAgICBpbnB1dC5zZWxlY3Rpb25FbmQgPSBNYXRoLm1pbihlbmQsIGlucHV0LnZhbHVlLmxl bmd0aCk7CisgICAgfSBlbHNlIGlmIChkb2N1bWVudC5zZWxlY3Rpb24gJiYgaW5wdXQubm9kZU5h bWUgJiYgaW5wdXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JykgeworICAgICAg dmFyIHJhbmdlID0gaW5wdXQuY3JlYXRlVGV4dFJhbmdlKCk7CisgICAgICByYW5nZS5jb2xsYXBz ZSh0cnVlKTsKKyAgICAgIHJhbmdlLm1vdmVTdGFydCgnY2hhcmFjdGVyJywgc3RhcnQpOworICAg ICAgcmFuZ2UubW92ZUVuZCgnY2hhcmFjdGVyJywgZW5kIC0gc3RhcnQpOworICAgICAgcmFuZ2Uu c2VsZWN0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIFJlYWN0RE9NU2VsZWN0aW9uLnNldE9mZnNl dHMoaW5wdXQsIG9mZnNldHMpOworICAgIH0KKyAgfQorfTsKKworbW9kdWxlLmV4cG9ydHMgPSBS ZWFjdElucHV0U2VsZWN0aW9uOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdp dCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdEluc3RhbmNl TWFwLmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0SW5z dGFuY2VNYXAuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjYzMDNiYjUx Ci0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20v bGliL1JlYWN0SW5zdGFuY2VNYXAuanMKQEAgLTAsMCArMSw0NyBAQAorLyoqCisgKiBDb3B5cmln aHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4K KyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUg bGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rv cnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50 IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJl Y3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKworLyoqCisgKiBgUmVhY3RJbnN0YW5j ZU1hcGAgbWFpbnRhaW5zIGEgbWFwcGluZyBmcm9tIGEgcHVibGljIGZhY2luZyBzdGF0ZWZ1bAor ICogaW5zdGFuY2UgKGtleSkgYW5kIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiAodmFsdWUp LiBUaGlzIGFsbG93cyBwdWJsaWMKKyAqIG1ldGhvZHMgdG8gYWNjZXB0IHRoZSB1c2VyIGZhY2lu ZyBpbnN0YW5jZSBhcyBhbiBhcmd1bWVudCBhbmQgbWFwIHRoZW0gYmFjaworICogdG8gaW50ZXJu YWwgbWV0aG9kcy4KKyAqLworCisvLyBUT0RPOiBSZXBsYWNlIHRoaXMgd2l0aCBFUzY6IHZhciBS ZWFjdEluc3RhbmNlTWFwID0gbmV3IE1hcCgpOworCit2YXIgUmVhY3RJbnN0YW5jZU1hcCA9IHsK KworICAvKioKKyAgICogVGhpcyBBUEkgc2hvdWxkIGJlIGNhbGxlZCBgZGVsZXRlYCBidXQgd2Un ZCBoYXZlIHRvIG1ha2Ugc3VyZSB0byBhbHdheXMKKyAgICogdHJhbnNmb3JtIHRoZXNlIHRvIHN0 cmluZ3MgZm9yIElFIHN1cHBvcnQuIFdoZW4gdGhpcyB0cmFuc2Zvcm0gaXMgZnVsbHkKKyAgICog c3VwcG9ydGVkIHdlIGNhbiByZW5hbWUgaXQuCisgICAqLworICByZW1vdmU6IGZ1bmN0aW9uIChr ZXkpIHsKKyAgICBrZXkuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSA9IHVuZGVmaW5lZDsKKyAgfSwK KworICBnZXQ6IGZ1bmN0aW9uIChrZXkpIHsKKyAgICByZXR1cm4ga2V5Ll9yZWFjdEludGVybmFs SW5zdGFuY2U7CisgIH0sCisKKyAgaGFzOiBmdW5jdGlvbiAoa2V5KSB7CisgICAgcmV0dXJuIGtl eS5fcmVhY3RJbnRlcm5hbEluc3RhbmNlICE9PSB1bmRlZmluZWQ7CisgIH0sCisKKyAgc2V0OiBm dW5jdGlvbiAoa2V5LCB2YWx1ZSkgeworICAgIGtleS5fcmVhY3RJbnRlcm5hbEluc3RhbmNlID0g dmFsdWU7CisgIH0KKworfTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdEluc3RhbmNlTWFwOwpc IE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRp Yy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdEluc3RhbmNlVHlwZS5qcyBiL3dlYi9wZ2FkbWlu L3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdEluc3RhbmNlVHlwZS5qcwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uMmIyZTdiYmMKLS0tIC9kZXYvbnVsbAorKysg Yi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RJbnN0YW5jZVR5 cGUuanMKQEAgLTAsMCArMSwxMiBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxNi1wcmVzZW50LCBG YWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJj ZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0 aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2Ug dHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91 bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogCisg Ki8KKworJ3VzZSBzdHJpY3QnOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdp dCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdEluc3RydW1l bnRhdGlvbi5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFj dEluc3RydW1lbnRhdGlvbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4u NjMyYTI2M2EKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3Jl YWN0LWRvbS9saWIvUmVhY3RJbnN0cnVtZW50YXRpb24uanMKQEAgLTAsMCArMSwyMyBAQAorLyoq CisgKiBDb3B5cmlnaHQgMjAxNi1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0 cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRo ZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUg cm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAor ICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0 aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOworCisvLyBU cnVzdCB0aGUgZGV2ZWxvcGVyIHRvIG9ubHkgdXNlIFJlYWN0SW5zdHJ1bWVudGF0aW9uIHdpdGgg YSBfX0RFVl9fIGNoZWNrCisKK3ZhciBkZWJ1Z1Rvb2wgPSBudWxsOworCitpZiAocHJvY2Vzcy5l bnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgeworICB2YXIgUmVhY3REZWJ1Z1Rvb2wgPSBy ZXF1aXJlKCcuL1JlYWN0RGVidWdUb29sJyk7CisgIGRlYnVnVG9vbCA9IFJlYWN0RGVidWdUb29s OworfQorCittb2R1bGUuZXhwb3J0cyA9IHsgZGVidWdUb29sOiBkZWJ1Z1Rvb2wgfTsKXCBObyBu ZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVu ZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RJbnZhbGlkU2V0U3RhdGVXYXJuaW5nSG9vay5qcyBiL3dl Yi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdEludmFsaWRTZXRTdGF0 ZVdhcm5pbmdIb29rLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi4xYjE3 YTM4YwotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3Qt ZG9tL2xpYi9SZWFjdEludmFsaWRTZXRTdGF0ZVdhcm5pbmdIb29rLmpzCkBAIC0wLDAgKzEsMzYg QEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTYtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFs bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1 bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUg aW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwg Z3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZp bGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsK KwordmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7CisKK2lmIChwcm9j ZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgIHZhciBwcm9jZXNzaW5nQ2hp bGRDb250ZXh0ID0gZmFsc2U7CisKKyAgdmFyIHdhcm5JbnZhbGlkU2V0U3RhdGUgPSBmdW5jdGlv biAoKSB7CisgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5p bmcoIXByb2Nlc3NpbmdDaGlsZENvbnRleHQsICdzZXRTdGF0ZSguLi4pOiBDYW5ub3QgY2FsbCBz ZXRTdGF0ZSgpIGluc2lkZSBnZXRDaGlsZENvbnRleHQoKScpIDogdm9pZCAwOworICB9OworfQor Cit2YXIgUmVhY3RJbnZhbGlkU2V0U3RhdGVXYXJuaW5nSG9vayA9IHsKKyAgb25CZWdpblByb2Nl c3NpbmdDaGlsZENvbnRleHQ6IGZ1bmN0aW9uICgpIHsKKyAgICBwcm9jZXNzaW5nQ2hpbGRDb250 ZXh0ID0gdHJ1ZTsKKyAgfSwKKyAgb25FbmRQcm9jZXNzaW5nQ2hpbGRDb250ZXh0OiBmdW5jdGlv biAoKSB7CisgICAgcHJvY2Vzc2luZ0NoaWxkQ29udGV4dCA9IGZhbHNlOworICB9LAorICBvblNl dFN0YXRlOiBmdW5jdGlvbiAoKSB7CisgICAgd2FybkludmFsaWRTZXRTdGF0ZSgpOworICB9Cit9 OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0SW52YWxpZFNldFN0YXRlV2FybmluZ0hvb2s7Clwg Tm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGlj L3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0TWFya3VwQ2hlY2tzdW0uanMgYi93ZWIvcGdhZG1p bi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RNYXJrdXBDaGVja3N1bS5qcwpuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uZmRhNDk1YmQKLS0tIC9kZXYvbnVsbAor KysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RNYXJrdXBD aGVja3N1bS5qcwpAQCAtMCwwICsxLDQ5IEBACisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNl bnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMg c291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5k IGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNv dXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBi ZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisg Ki8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgYWRsZXIzMiA9IHJlcXVpcmUoJy4vYWRsZXIzMicp OworCit2YXIgVEFHX0VORCA9IC9cLz8+LzsKK3ZhciBDT01NRU5UX1NUQVJUID0gL148XCFcLVwt LzsKKwordmFyIFJlYWN0TWFya3VwQ2hlY2tzdW0gPSB7CisgIENIRUNLU1VNX0FUVFJfTkFNRTog J2RhdGEtcmVhY3QtY2hlY2tzdW0nLAorCisgIC8qKgorICAgKiBAcGFyYW0ge3N0cmluZ30gbWFy a3VwIE1hcmt1cCBzdHJpbmcKKyAgICogQHJldHVybiB7c3RyaW5nfSBNYXJrdXAgc3RyaW5nIHdp dGggY2hlY2tzdW0gYXR0cmlidXRlIGF0dGFjaGVkCisgICAqLworICBhZGRDaGVja3N1bVRvTWFy a3VwOiBmdW5jdGlvbiAobWFya3VwKSB7CisgICAgdmFyIGNoZWNrc3VtID0gYWRsZXIzMihtYXJr dXApOworCisgICAgLy8gQWRkIGNoZWNrc3VtIChoYW5kbGUgYm90aCBwYXJlbnQgdGFncywgY29t bWVudHMgYW5kIHNlbGYtY2xvc2luZyB0YWdzKQorICAgIGlmIChDT01NRU5UX1NUQVJULnRlc3Qo bWFya3VwKSkgeworICAgICAgcmV0dXJuIG1hcmt1cDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0 dXJuIG1hcmt1cC5yZXBsYWNlKFRBR19FTkQsICcgJyArIFJlYWN0TWFya3VwQ2hlY2tzdW0uQ0hF Q0tTVU1fQVRUUl9OQU1FICsgJz0iJyArIGNoZWNrc3VtICsgJyIkJicpOworICAgIH0KKyAgfSwK KworICAvKioKKyAgICogQHBhcmFtIHtzdHJpbmd9IG1hcmt1cCB0byB1c2UKKyAgICogQHBhcmFt IHtET01FbGVtZW50fSBlbGVtZW50IHJvb3QgUmVhY3QgZWxlbWVudAorICAgKiBAcmV0dXJucyB7 Ym9vbGVhbn0gd2hldGhlciBvciBub3QgdGhlIG1hcmt1cCBpcyB0aGUgc2FtZQorICAgKi8KKyAg Y2FuUmV1c2VNYXJrdXA6IGZ1bmN0aW9uIChtYXJrdXAsIGVsZW1lbnQpIHsKKyAgICB2YXIgZXhp c3RpbmdDaGVja3N1bSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFJlYWN0TWFya3VwQ2hlY2tzdW0u Q0hFQ0tTVU1fQVRUUl9OQU1FKTsKKyAgICBleGlzdGluZ0NoZWNrc3VtID0gZXhpc3RpbmdDaGVj a3N1bSAmJiBwYXJzZUludChleGlzdGluZ0NoZWNrc3VtLCAxMCk7CisgICAgdmFyIG1hcmt1cENo ZWNrc3VtID0gYWRsZXIzMihtYXJrdXApOworICAgIHJldHVybiBtYXJrdXBDaGVja3N1bSA9PT0g ZXhpc3RpbmdDaGVja3N1bTsKKyAgfQorfTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdE1hcmt1 cENoZWNrc3VtOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9w Z2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdE1vdW50LmpzIGIvd2ViL3Bn YWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0TW91bnQuanMKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLmJiN2Q1YmY4Ci0tLSAvZGV2L251bGwKKysrIGIv d2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0TW91bnQuanMKQEAg LTAsMCArMSw1MzcgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ss IEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBp cyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBM SUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFu IGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRo ZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0 cmljdCc7CisKK3ZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJp YW50Jyk7CisKK3ZhciBET01MYXp5VHJlZSA9IHJlcXVpcmUoJy4vRE9NTGF6eVRyZWUnKTsKK3Zh ciBET01Qcm9wZXJ0eSA9IHJlcXVpcmUoJy4vRE9NUHJvcGVydHknKTsKK3ZhciBSZWFjdCA9IHJl cXVpcmUoJ3JlYWN0L2xpYi9SZWFjdCcpOwordmFyIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlciA9 IHJlcXVpcmUoJy4vUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyJyk7Cit2YXIgUmVhY3RDdXJyZW50 T3duZXIgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3RDdXJyZW50T3duZXInKTsKK3ZhciBSZWFj dERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpOwor dmFyIFJlYWN0RE9NQ29udGFpbmVySW5mbyA9IHJlcXVpcmUoJy4vUmVhY3RET01Db250YWluZXJJ bmZvJyk7Cit2YXIgUmVhY3RET01GZWF0dXJlRmxhZ3MgPSByZXF1aXJlKCcuL1JlYWN0RE9NRmVh dHVyZUZsYWdzJyk7Cit2YXIgUmVhY3RGZWF0dXJlRmxhZ3MgPSByZXF1aXJlKCcuL1JlYWN0RmVh dHVyZUZsYWdzJyk7Cit2YXIgUmVhY3RJbnN0YW5jZU1hcCA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0 YW5jZU1hcCcpOwordmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdElu c3RydW1lbnRhdGlvbicpOwordmFyIFJlYWN0TWFya3VwQ2hlY2tzdW0gPSByZXF1aXJlKCcuL1Jl YWN0TWFya3VwQ2hlY2tzdW0nKTsKK3ZhciBSZWFjdFJlY29uY2lsZXIgPSByZXF1aXJlKCcuL1Jl YWN0UmVjb25jaWxlcicpOwordmFyIFJlYWN0VXBkYXRlUXVldWUgPSByZXF1aXJlKCcuL1JlYWN0 VXBkYXRlUXVldWUnKTsKK3ZhciBSZWFjdFVwZGF0ZXMgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRl cycpOworCit2YXIgZW1wdHlPYmplY3QgPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eU9iamVjdCcp OwordmFyIGluc3RhbnRpYXRlUmVhY3RDb21wb25lbnQgPSByZXF1aXJlKCcuL2luc3RhbnRpYXRl UmVhY3RDb21wb25lbnQnKTsKK3ZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZh cmlhbnQnKTsKK3ZhciBzZXRJbm5lckhUTUwgPSByZXF1aXJlKCcuL3NldElubmVySFRNTCcpOwor dmFyIHNob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50ID0gcmVxdWlyZSgnLi9zaG91bGRVcGRhdGVS ZWFjdENvbXBvbmVudCcpOwordmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5n Jyk7CisKK3ZhciBBVFRSX05BTUUgPSBET01Qcm9wZXJ0eS5JRF9BVFRSSUJVVEVfTkFNRTsKK3Zh ciBST09UX0FUVFJfTkFNRSA9IERPTVByb3BlcnR5LlJPT1RfQVRUUklCVVRFX05BTUU7CisKK3Zh ciBFTEVNRU5UX05PREVfVFlQRSA9IDE7Cit2YXIgRE9DX05PREVfVFlQRSA9IDk7Cit2YXIgRE9D VU1FTlRfRlJBR01FTlRfTk9ERV9UWVBFID0gMTE7CisKK3ZhciBpbnN0YW5jZXNCeVJlYWN0Um9v dElEID0ge307CisKKy8qKgorICogRmluZHMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0 ZXIKKyAqIHRoYXQncyBub3QgY29tbW9uIGJldHdlZW4gdGhlIHR3byBnaXZlbiBzdHJpbmdzLgor ICoKKyAqIEByZXR1cm4ge251bWJlcn0gdGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgd2hlcmUg dGhlIHN0cmluZ3MgZGl2ZXJnZQorICovCitmdW5jdGlvbiBmaXJzdERpZmZlcmVuY2VJbmRleChz dHJpbmcxLCBzdHJpbmcyKSB7CisgIHZhciBtaW5MZW4gPSBNYXRoLm1pbihzdHJpbmcxLmxlbmd0 aCwgc3RyaW5nMi5sZW5ndGgpOworICBmb3IgKHZhciBpID0gMDsgaSA8IG1pbkxlbjsgaSsrKSB7 CisgICAgaWYgKHN0cmluZzEuY2hhckF0KGkpICE9PSBzdHJpbmcyLmNoYXJBdChpKSkgeworICAg ICAgcmV0dXJuIGk7CisgICAgfQorICB9CisgIHJldHVybiBzdHJpbmcxLmxlbmd0aCA9PT0gc3Ry aW5nMi5sZW5ndGggPyAtMSA6IG1pbkxlbjsKK30KKworLyoqCisgKiBAcGFyYW0ge0RPTUVsZW1l bnR8RE9NRG9jdW1lbnR9IGNvbnRhaW5lciBET00gZWxlbWVudCB0aGF0IG1heSBjb250YWluCisg KiBhIFJlYWN0IGNvbXBvbmVudAorICogQHJldHVybiB7Pyp9IERPTSBlbGVtZW50IHRoYXQgbWF5 IGhhdmUgdGhlIHJlYWN0Um9vdCBJRCwgb3IgbnVsbC4KKyAqLworZnVuY3Rpb24gZ2V0UmVhY3RS b290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcikgeworICBpZiAoIWNvbnRhaW5lcikgewor ICAgIHJldHVybiBudWxsOworICB9CisKKyAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRE9D X05PREVfVFlQRSkgeworICAgIHJldHVybiBjb250YWluZXIuZG9jdW1lbnRFbGVtZW50OworICB9 IGVsc2UgeworICAgIHJldHVybiBjb250YWluZXIuZmlyc3RDaGlsZDsKKyAgfQorfQorCitmdW5j dGlvbiBpbnRlcm5hbEdldElEKG5vZGUpIHsKKyAgLy8gSWYgbm9kZSBpcyBzb21ldGhpbmcgbGlr ZSBhIHdpbmRvdywgZG9jdW1lbnQsIG9yIHRleHQgbm9kZSwgbm9uZSBvZgorICAvLyB3aGljaCBz dXBwb3J0IGF0dHJpYnV0ZXMgb3IgYSAuZ2V0QXR0cmlidXRlIG1ldGhvZCwgZ3JhY2VmdWxseSBy ZXR1cm4KKyAgLy8gdGhlIGVtcHR5IHN0cmluZywgYXMgaWYgdGhlIGF0dHJpYnV0ZSB3ZXJlIG1p c3NpbmcuCisgIHJldHVybiBub2RlLmdldEF0dHJpYnV0ZSAmJiBub2RlLmdldEF0dHJpYnV0ZShB VFRSX05BTUUpIHx8ICcnOworfQorCisvKioKKyAqIE1vdW50cyB0aGlzIGNvbXBvbmVudCBhbmQg aW5zZXJ0cyBpdCBpbnRvIHRoZSBET00uCisgKgorICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0g Y29tcG9uZW50SW5zdGFuY2UgVGhlIGluc3RhbmNlIHRvIG1vdW50LgorICogQHBhcmFtIHtET01F bGVtZW50fSBjb250YWluZXIgRE9NIGVsZW1lbnQgdG8gbW91bnQgaW50by4KKyAqIEBwYXJhbSB7 UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24KKyAqIEBwYXJhbSB7Ym9vbGVh bn0gc2hvdWxkUmV1c2VNYXJrdXAgSWYgdHJ1ZSwgZG8gbm90IGluc2VydCBtYXJrdXAKKyAqLwor ZnVuY3Rpb24gbW91bnRDb21wb25lbnRJbnRvTm9kZSh3cmFwcGVySW5zdGFuY2UsIGNvbnRhaW5l ciwgdHJhbnNhY3Rpb24sIHNob3VsZFJldXNlTWFya3VwLCBjb250ZXh0KSB7CisgIHZhciBtYXJr ZXJOYW1lOworICBpZiAoUmVhY3RGZWF0dXJlRmxhZ3MubG9nVG9wTGV2ZWxSZW5kZXJzKSB7Cisg ICAgdmFyIHdyYXBwZWRFbGVtZW50ID0gd3JhcHBlckluc3RhbmNlLl9jdXJyZW50RWxlbWVudC5w cm9wcy5jaGlsZDsKKyAgICB2YXIgdHlwZSA9IHdyYXBwZWRFbGVtZW50LnR5cGU7CisgICAgbWFy a2VyTmFtZSA9ICdSZWFjdCBtb3VudDogJyArICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgPyB0 eXBlIDogdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUpOworICAgIGNvbnNvbGUudGltZSht YXJrZXJOYW1lKTsKKyAgfQorCisgIHZhciBtYXJrdXAgPSBSZWFjdFJlY29uY2lsZXIubW91bnRD b21wb25lbnQod3JhcHBlckluc3RhbmNlLCB0cmFuc2FjdGlvbiwgbnVsbCwgUmVhY3RET01Db250 YWluZXJJbmZvKHdyYXBwZXJJbnN0YW5jZSwgY29udGFpbmVyKSwgY29udGV4dCwgMCAvKiBwYXJl bnREZWJ1Z0lEICovCisgICk7CisKKyAgaWYgKG1hcmtlck5hbWUpIHsKKyAgICBjb25zb2xlLnRp bWVFbmQobWFya2VyTmFtZSk7CisgIH0KKworICB3cmFwcGVySW5zdGFuY2UuX3JlbmRlcmVkQ29t cG9uZW50Ll90b3BMZXZlbFdyYXBwZXIgPSB3cmFwcGVySW5zdGFuY2U7CisgIFJlYWN0TW91bnQu X21vdW50SW1hZ2VJbnRvTm9kZShtYXJrdXAsIGNvbnRhaW5lciwgd3JhcHBlckluc3RhbmNlLCBz aG91bGRSZXVzZU1hcmt1cCwgdHJhbnNhY3Rpb24pOworfQorCisvKioKKyAqIEJhdGNoZWQgbW91 bnQuCisgKgorICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gY29tcG9uZW50SW5zdGFuY2UgVGhl IGluc3RhbmNlIHRvIG1vdW50LgorICogQHBhcmFtIHtET01FbGVtZW50fSBjb250YWluZXIgRE9N IGVsZW1lbnQgdG8gbW91bnQgaW50by4KKyAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkUmV1c2VN YXJrdXAgSWYgdHJ1ZSwgZG8gbm90IGluc2VydCBtYXJrdXAKKyAqLworZnVuY3Rpb24gYmF0Y2hl ZE1vdW50Q29tcG9uZW50SW50b05vZGUoY29tcG9uZW50SW5zdGFuY2UsIGNvbnRhaW5lciwgc2hv dWxkUmV1c2VNYXJrdXAsIGNvbnRleHQpIHsKKyAgdmFyIHRyYW5zYWN0aW9uID0gUmVhY3RVcGRh dGVzLlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24uZ2V0UG9vbGVkKAorICAvKiB1c2VDcmVhdGVF bGVtZW50ICovCisgICFzaG91bGRSZXVzZU1hcmt1cCAmJiBSZWFjdERPTUZlYXR1cmVGbGFncy51 c2VDcmVhdGVFbGVtZW50KTsKKyAgdHJhbnNhY3Rpb24ucGVyZm9ybShtb3VudENvbXBvbmVudElu dG9Ob2RlLCBudWxsLCBjb21wb25lbnRJbnN0YW5jZSwgY29udGFpbmVyLCB0cmFuc2FjdGlvbiwg c2hvdWxkUmV1c2VNYXJrdXAsIGNvbnRleHQpOworICBSZWFjdFVwZGF0ZXMuUmVhY3RSZWNvbmNp bGVUcmFuc2FjdGlvbi5yZWxlYXNlKHRyYW5zYWN0aW9uKTsKK30KKworLyoqCisgKiBVbm1vdW50 cyBhIGNvbXBvbmVudCBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZSBET00uCisgKgorICogQHBhcmFt IHtSZWFjdENvbXBvbmVudH0gaW5zdGFuY2UgUmVhY3QgY29tcG9uZW50IGluc3RhbmNlLgorICog QHBhcmFtIHtET01FbGVtZW50fSBjb250YWluZXIgRE9NIGVsZW1lbnQgdG8gdW5tb3VudCBmcm9t LgorICogQGZpbmFsCisgKiBAaW50ZXJuYWwKKyAqIEBzZWUge1JlYWN0TW91bnQudW5tb3VudENv bXBvbmVudEF0Tm9kZX0KKyAqLworZnVuY3Rpb24gdW5tb3VudENvbXBvbmVudEZyb21Ob2RlKGlu c3RhbmNlLCBjb250YWluZXIsIHNhZmVseSkgeworICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYg IT09ICdwcm9kdWN0aW9uJykgeworICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5v bkJlZ2luRmx1c2goKTsKKyAgfQorICBSZWFjdFJlY29uY2lsZXIudW5tb3VudENvbXBvbmVudChp bnN0YW5jZSwgc2FmZWx5KTsKKyAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVj dGlvbicpIHsKKyAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25FbmRGbHVzaCgp OworICB9CisKKyAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRE9DX05PREVfVFlQRSkgewor ICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lci5kb2N1bWVudEVsZW1lbnQ7CisgIH0KKworICAvLyBo dHRwOi8vanNwZXJmLmNvbS9lbXB0eWluZy1hLW5vZGUKKyAgd2hpbGUgKGNvbnRhaW5lci5sYXN0 Q2hpbGQpIHsKKyAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQoY29udGFpbmVyLmxhc3RDaGlsZCk7 CisgIH0KK30KKworLyoqCisgKiBUcnVlIGlmIHRoZSBzdXBwbGllZCBET00gbm9kZSBoYXMgYSBk aXJlY3QgUmVhY3QtcmVuZGVyZWQgY2hpbGQgdGhhdCBpcworICogbm90IGEgUmVhY3Qgcm9vdCBl bGVtZW50LiBVc2VmdWwgZm9yIHdhcm5pbmcgaW4gYHJlbmRlcmAsCisgKiBgdW5tb3VudENvbXBv bmVudEF0Tm9kZWAsIGV0Yy4KKyAqCisgKiBAcGFyYW0gez9ET01FbGVtZW50fSBub2RlIFRoZSBj YW5kaWRhdGUgRE9NIG5vZGUuCisgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBET00g ZWxlbWVudCBjb250YWlucyBhIGRpcmVjdCBjaGlsZCB0aGF0IHdhcworICogcmVuZGVyZWQgYnkg UmVhY3QgYnV0IGlzIG5vdCBhIHJvb3QgZWxlbWVudC4KKyAqIEBpbnRlcm5hbAorICovCitmdW5j dGlvbiBoYXNOb25Sb290UmVhY3RDaGlsZChjb250YWluZXIpIHsKKyAgdmFyIHJvb3RFbCA9IGdl dFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpOworICBpZiAocm9vdEVsKSB7 CisgICAgdmFyIGluc3QgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9k ZShyb290RWwpOworICAgIHJldHVybiAhIShpbnN0ICYmIGluc3QuX2hvc3RQYXJlbnQpOworICB9 Cit9CisKKy8qKgorICogVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgRE9NIG5vZGUgaXMgYSBSZWFjdCBE T00gZWxlbWVudCBhbmQKKyAqIGl0IGhhcyBiZWVuIHJlbmRlcmVkIGJ5IGFub3RoZXIgY29weSBv ZiBSZWFjdC4KKyAqCisgKiBAcGFyYW0gez9ET01FbGVtZW50fSBub2RlIFRoZSBjYW5kaWRhdGUg RE9NIG5vZGUuCisgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBET00gaGFzIGJlZW4g cmVuZGVyZWQgYnkgYW5vdGhlciBjb3B5IG9mIFJlYWN0CisgKiBAaW50ZXJuYWwKKyAqLworZnVu Y3Rpb24gbm9kZUlzUmVuZGVyZWRCeU90aGVySW5zdGFuY2UoY29udGFpbmVyKSB7CisgIHZhciBy b290RWwgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTsKKyAgcmV0 dXJuICEhKHJvb3RFbCAmJiBpc1JlYWN0Tm9kZShyb290RWwpICYmICFSZWFjdERPTUNvbXBvbmVu dFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShyb290RWwpKTsKK30KKworLyoqCisgKiBUcnVlIGlm IHRoZSBzdXBwbGllZCBET00gbm9kZSBpcyBhIHZhbGlkIG5vZGUgZWxlbWVudC4KKyAqCisgKiBA cGFyYW0gez9ET01FbGVtZW50fSBub2RlIFRoZSBjYW5kaWRhdGUgRE9NIG5vZGUuCisgKiBAcmV0 dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBET00gaXMgYSB2YWxpZCBET00gbm9kZS4KKyAqIEBp bnRlcm5hbAorICovCitmdW5jdGlvbiBpc1ZhbGlkQ29udGFpbmVyKG5vZGUpIHsKKyAgcmV0dXJu ICEhKG5vZGUgJiYgKG5vZGUubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERV9UWVBFIHx8IG5vZGUu bm9kZVR5cGUgPT09IERPQ19OT0RFX1RZUEUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRf RlJBR01FTlRfTk9ERV9UWVBFKSk7Cit9CisKKy8qKgorICogVHJ1ZSBpZiB0aGUgc3VwcGxpZWQg RE9NIG5vZGUgaXMgYSB2YWxpZCBSZWFjdCBub2RlIGVsZW1lbnQuCisgKgorICogQHBhcmFtIHs/ RE9NRWxlbWVudH0gbm9kZSBUaGUgY2FuZGlkYXRlIERPTSBub2RlLgorICogQHJldHVybiB7Ym9v bGVhbn0gVHJ1ZSBpZiB0aGUgRE9NIGlzIGEgdmFsaWQgUmVhY3QgRE9NIG5vZGUuCisgKiBAaW50 ZXJuYWwKKyAqLworZnVuY3Rpb24gaXNSZWFjdE5vZGUobm9kZSkgeworICByZXR1cm4gaXNWYWxp ZENvbnRhaW5lcihub2RlKSAmJiAobm9kZS5oYXNBdHRyaWJ1dGUoUk9PVF9BVFRSX05BTUUpIHx8 IG5vZGUuaGFzQXR0cmlidXRlKEFUVFJfTkFNRSkpOworfQorCitmdW5jdGlvbiBnZXRIb3N0Um9v dEluc3RhbmNlSW5Db250YWluZXIoY29udGFpbmVyKSB7CisgIHZhciByb290RWwgPSBnZXRSZWFj dFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTsKKyAgdmFyIHByZXZIb3N0SW5zdGFu Y2UgPSByb290RWwgJiYgUmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUo cm9vdEVsKTsKKyAgcmV0dXJuIHByZXZIb3N0SW5zdGFuY2UgJiYgIXByZXZIb3N0SW5zdGFuY2Uu X2hvc3RQYXJlbnQgPyBwcmV2SG9zdEluc3RhbmNlIDogbnVsbDsKK30KKworZnVuY3Rpb24gZ2V0 VG9wTGV2ZWxXcmFwcGVySW5Db250YWluZXIoY29udGFpbmVyKSB7CisgIHZhciByb290ID0gZ2V0 SG9zdFJvb3RJbnN0YW5jZUluQ29udGFpbmVyKGNvbnRhaW5lcik7CisgIHJldHVybiByb290ID8g cm9vdC5faG9zdENvbnRhaW5lckluZm8uX3RvcExldmVsV3JhcHBlciA6IG51bGw7Cit9CisKKy8q KgorICogVGVtcG9yYXJ5ICg/KSBoYWNrIHNvIHRoYXQgd2UgY2FuIHN0b3JlIGFsbCB0b3AtbGV2 ZWwgcGVuZGluZyB1cGRhdGVzIG9uCisgKiBjb21wb3NpdGVzIGluc3RlYWQgb2YgaGF2aW5nIHRv IHdvcnJ5IGFib3V0IGRpZmZlcmVudCB0eXBlcyBvZiBjb21wb25lbnRzCisgKiBoZXJlLgorICov Cit2YXIgdG9wTGV2ZWxSb290Q291bnRlciA9IDE7Cit2YXIgVG9wTGV2ZWxXcmFwcGVyID0gZnVu Y3Rpb24gKCkgeworICB0aGlzLnJvb3RJRCA9IHRvcExldmVsUm9vdENvdW50ZXIrKzsKK307CitU b3BMZXZlbFdyYXBwZXIucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQgPSB7fTsKK2lmIChwcm9j ZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgIFRvcExldmVsV3JhcHBlci5k aXNwbGF5TmFtZSA9ICdUb3BMZXZlbFdyYXBwZXInOworfQorVG9wTGV2ZWxXcmFwcGVyLnByb3Rv dHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiB0aGlzLnByb3BzLmNoaWxkOwor fTsKK1RvcExldmVsV3JhcHBlci5pc1JlYWN0VG9wTGV2ZWxXcmFwcGVyID0gdHJ1ZTsKKworLyoq CisgKiBNb3VudGluZyBpcyB0aGUgcHJvY2VzcyBvZiBpbml0aWFsaXppbmcgYSBSZWFjdCBjb21w b25lbnQgYnkgY3JlYXRpbmcgaXRzCisgKiByZXByZXNlbnRhdGl2ZSBET00gZWxlbWVudHMgYW5k IGluc2VydGluZyB0aGVtIGludG8gYSBzdXBwbGllZCBgY29udGFpbmVyYC4KKyAqIEFueSBwcmlv ciBjb250ZW50IGluc2lkZSBgY29udGFpbmVyYCBpcyBkZXN0cm95ZWQgaW4gdGhlIHByb2Nlc3Mu CisgKgorICogICBSZWFjdE1vdW50LnJlbmRlcigKKyAqICAgICBjb21wb25lbnQsCisgKiAgICAg ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRhaW5lcicpCisgKiAgICk7CisgKgorICogICA8 ZGl2IGlkPSJjb250YWluZXIiPiAgICAgICAgICAgICAgICAgICA8LS0gU3VwcGxpZWQgYGNvbnRh aW5lcmAuCisgKiAgICAgPGRpdiBkYXRhLXJlYWN0aWQ9Ii4zIj4gICAgICAgICAgICAgIDwtLSBS ZW5kZXJlZCByZWFjdFJvb3Qgb2YgUmVhY3QKKyAqICAgICAgIC8vIC4uLiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC4KKyAqICAgICA8L2Rpdj4KKyAqICAgPC9kaXY+ CisgKgorICogSW5zaWRlIG9mIGBjb250YWluZXJgLCB0aGUgZmlyc3QgZWxlbWVudCByZW5kZXJl ZCBpcyB0aGUgInJlYWN0Um9vdCIuCisgKi8KK3ZhciBSZWFjdE1vdW50ID0geworCisgIFRvcExl dmVsV3JhcHBlcjogVG9wTGV2ZWxXcmFwcGVyLAorCisgIC8qKgorICAgKiBVc2VkIGJ5IGRldnRv b2xzLiBUaGUga2V5cyBhcmUgbm90IGltcG9ydGFudC4KKyAgICovCisgIF9pbnN0YW5jZXNCeVJl YWN0Um9vdElEOiBpbnN0YW5jZXNCeVJlYWN0Um9vdElELAorCisgIC8qKgorICAgKiBUaGlzIGlz IGEgaG9vayBwcm92aWRlZCB0byBzdXBwb3J0IHJlbmRlcmluZyBSZWFjdCBjb21wb25lbnRzIHdo aWxlCisgICAqIGVuc3VyaW5nIHRoYXQgdGhlIGFwcGFyZW50IHNjcm9sbCBwb3NpdGlvbiBvZiBp dHMgYGNvbnRhaW5lcmAgZG9lcyBub3QKKyAgICogY2hhbmdlLgorICAgKgorICAgKiBAcGFyYW0g e0RPTUVsZW1lbnR9IGNvbnRhaW5lciBUaGUgYGNvbnRhaW5lcmAgYmVpbmcgcmVuZGVyZWQgaW50 by4KKyAgICogQHBhcmFtIHtmdW5jdGlvbn0gcmVuZGVyQ2FsbGJhY2sgVGhpcyBtdXN0IGJlIGNh bGxlZCBvbmNlIHRvIGRvIHRoZSByZW5kZXIuCisgICAqLworICBzY3JvbGxNb25pdG9yOiBmdW5j dGlvbiAoY29udGFpbmVyLCByZW5kZXJDYWxsYmFjaykgeworICAgIHJlbmRlckNhbGxiYWNrKCk7 CisgIH0sCisKKyAgLyoqCisgICAqIFRha2UgYSBjb21wb25lbnQgdGhhdCdzIGFscmVhZHkgbW91 bnRlZCBpbnRvIHRoZSBET00gYW5kIHJlcGxhY2UgaXRzIHByb3BzCisgICAqIEBwYXJhbSB7UmVh Y3RDb21wb25lbnR9IHByZXZDb21wb25lbnQgY29tcG9uZW50IGluc3RhbmNlIGFscmVhZHkgaW4g dGhlIERPTQorICAgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gbmV4dEVsZW1lbnQgY29tcG9uZW50 IGluc3RhbmNlIHRvIHJlbmRlcgorICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNvbnRhaW5lciBj b250YWluZXIgdG8gcmVuZGVyIGludG8KKyAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNr IGZ1bmN0aW9uIHRyaWdnZXJlZCBvbiBjb21wbGV0aW9uCisgICAqLworICBfdXBkYXRlUm9vdENv bXBvbmVudDogZnVuY3Rpb24gKHByZXZDb21wb25lbnQsIG5leHRFbGVtZW50LCBuZXh0Q29udGV4 dCwgY29udGFpbmVyLCBjYWxsYmFjaykgeworICAgIFJlYWN0TW91bnQuc2Nyb2xsTW9uaXRvcihj b250YWluZXIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIFJlYWN0VXBkYXRlUXVldWUuZW5xdWV1ZUVs ZW1lbnRJbnRlcm5hbChwcmV2Q29tcG9uZW50LCBuZXh0RWxlbWVudCwgbmV4dENvbnRleHQpOwor ICAgICAgaWYgKGNhbGxiYWNrKSB7CisgICAgICAgIFJlYWN0VXBkYXRlUXVldWUuZW5xdWV1ZUNh bGxiYWNrSW50ZXJuYWwocHJldkNvbXBvbmVudCwgY2FsbGJhY2spOworICAgICAgfQorICAgIH0p OworCisgICAgcmV0dXJuIHByZXZDb21wb25lbnQ7CisgIH0sCisKKyAgLyoqCisgICAqIFJlbmRl ciBhIG5ldyBjb21wb25lbnQgaW50byB0aGUgRE9NLiBIb29rZWQgYnkgaG9va3MhCisgICAqCisg ICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBuZXh0RWxlbWVudCBlbGVtZW50IHRvIHJlbmRlcgor ICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNvbnRhaW5lciBjb250YWluZXIgdG8gcmVuZGVyIGlu dG8KKyAgICogQHBhcmFtIHtib29sZWFufSBzaG91bGRSZXVzZU1hcmt1cCBpZiB3ZSBzaG91bGQg c2tpcCB0aGUgbWFya3VwIGluc2VydGlvbgorICAgKiBAcmV0dXJuIHtSZWFjdENvbXBvbmVudH0g bmV4dENvbXBvbmVudAorICAgKi8KKyAgX3JlbmRlck5ld1Jvb3RDb21wb25lbnQ6IGZ1bmN0aW9u IChuZXh0RWxlbWVudCwgY29udGFpbmVyLCBzaG91bGRSZXVzZU1hcmt1cCwgY29udGV4dCkgewor ICAgIC8vIFZhcmlvdXMgcGFydHMgb2Ygb3VyIGNvZGUgKHN1Y2ggYXMgUmVhY3RDb21wb3NpdGVD b21wb25lbnQncworICAgIC8vIF9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnQpIGFzc3VtZSB0aGF0 IGNhbGxzIHRvIHJlbmRlciBhcmVuJ3QgbmVzdGVkOworICAgIC8vIHZlcmlmeSB0aGF0IHRoYXQn cyB0aGUgY2FzZS4KKyAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8g d2FybmluZyhSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ID09IG51bGwsICdfcmVuZGVyTmV3Um9v dENvbXBvbmVudCgpOiBSZW5kZXIgbWV0aG9kcyBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uICcg KyAnb2YgcHJvcHMgYW5kIHN0YXRlOyB0cmlnZ2VyaW5nIG5lc3RlZCBjb21wb25lbnQgdXBkYXRl cyBmcm9tICcgKyAncmVuZGVyIGlzIG5vdCBhbGxvd2VkLiBJZiBuZWNlc3NhcnksIHRyaWdnZXIg bmVzdGVkIHVwZGF0ZXMgaW4gJyArICdjb21wb25lbnREaWRVcGRhdGUuIENoZWNrIHRoZSByZW5k ZXIgbWV0aG9kIG9mICVzLicsIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgJiYgUmVhY3RDdXJy ZW50T3duZXIuY3VycmVudC5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50Jykg OiB2b2lkIDA7CisKKyAgICAhaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpID8gcHJvY2Vzcy5l bnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ19yZWdpc3Rl ckNvbXBvbmVudCguLi4pOiBUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50Licp IDogX3Byb2RJbnZhcmlhbnQoJzM3JykgOiB2b2lkIDA7CisKKyAgICBSZWFjdEJyb3dzZXJFdmVu dEVtaXR0ZXIuZW5zdXJlU2Nyb2xsVmFsdWVNb25pdG9yaW5nKCk7CisgICAgdmFyIGNvbXBvbmVu dEluc3RhbmNlID0gaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudChuZXh0RWxlbWVudCwgZmFsc2Up OworCisgICAgLy8gVGhlIGluaXRpYWwgcmVuZGVyIGlzIHN5bmNocm9ub3VzIGJ1dCBhbnkgdXBk YXRlcyB0aGF0IGhhcHBlbiBkdXJpbmcKKyAgICAvLyByZW5kZXJpbmcsIGluIGNvbXBvbmVudFdp bGxNb3VudCBvciBjb21wb25lbnREaWRNb3VudCwgd2lsbCBiZSBiYXRjaGVkCisgICAgLy8gYWNj b3JkaW5nIHRvIHRoZSBjdXJyZW50IGJhdGNoaW5nIHN0cmF0ZWd5LgorCisgICAgUmVhY3RVcGRh dGVzLmJhdGNoZWRVcGRhdGVzKGJhdGNoZWRNb3VudENvbXBvbmVudEludG9Ob2RlLCBjb21wb25l bnRJbnN0YW5jZSwgY29udGFpbmVyLCBzaG91bGRSZXVzZU1hcmt1cCwgY29udGV4dCk7CisKKyAg ICB2YXIgd3JhcHBlcklEID0gY29tcG9uZW50SW5zdGFuY2UuX2luc3RhbmNlLnJvb3RJRDsKKyAg ICBpbnN0YW5jZXNCeVJlYWN0Um9vdElEW3dyYXBwZXJJRF0gPSBjb21wb25lbnRJbnN0YW5jZTsK KworICAgIHJldHVybiBjb21wb25lbnRJbnN0YW5jZTsKKyAgfSwKKworICAvKioKKyAgICogUmVu ZGVycyBhIFJlYWN0IGNvbXBvbmVudCBpbnRvIHRoZSBET00gaW4gdGhlIHN1cHBsaWVkIGBjb250 YWluZXJgLgorICAgKgorICAgKiBJZiB0aGUgUmVhY3QgY29tcG9uZW50IHdhcyBwcmV2aW91c2x5 IHJlbmRlcmVkIGludG8gYGNvbnRhaW5lcmAsIHRoaXMgd2lsbAorICAgKiBwZXJmb3JtIGFuIHVw ZGF0ZSBvbiBpdCBhbmQgb25seSBtdXRhdGUgdGhlIERPTSBhcyBuZWNlc3NhcnkgdG8gcmVmbGVj dCB0aGUKKyAgICogbGF0ZXN0IFJlYWN0IGNvbXBvbmVudC4KKyAgICoKKyAgICogQHBhcmFtIHtS ZWFjdENvbXBvbmVudH0gcGFyZW50Q29tcG9uZW50IFRoZSBjb25jZXB0dWFsIHBhcmVudCBvZiB0 aGlzIHJlbmRlciB0cmVlLgorICAgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gbmV4dEVsZW1lbnQg Q29tcG9uZW50IGVsZW1lbnQgdG8gcmVuZGVyLgorICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNv bnRhaW5lciBET00gZWxlbWVudCB0byByZW5kZXIgaW50by4KKyAgICogQHBhcmFtIHs/ZnVuY3Rp b259IGNhbGxiYWNrIGZ1bmN0aW9uIHRyaWdnZXJlZCBvbiBjb21wbGV0aW9uCisgICAqIEByZXR1 cm4ge1JlYWN0Q29tcG9uZW50fSBDb21wb25lbnQgaW5zdGFuY2UgcmVuZGVyZWQgaW4gYGNvbnRh aW5lcmAuCisgICAqLworICByZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcjogZnVuY3Rpb24gKHBh cmVudENvbXBvbmVudCwgbmV4dEVsZW1lbnQsIGNvbnRhaW5lciwgY2FsbGJhY2spIHsKKyAgICAh KHBhcmVudENvbXBvbmVudCAhPSBudWxsICYmIFJlYWN0SW5zdGFuY2VNYXAuaGFzKHBhcmVudENv bXBvbmVudCkpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFy aWFudChmYWxzZSwgJ3BhcmVudENvbXBvbmVudCBtdXN0IGJlIGEgdmFsaWQgUmVhY3QgQ29tcG9u ZW50JykgOiBfcHJvZEludmFyaWFudCgnMzgnKSA6IHZvaWQgMDsKKyAgICByZXR1cm4gUmVhY3RN b3VudC5fcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBuZXh0RWxl bWVudCwgY29udGFpbmVyLCBjYWxsYmFjayk7CisgIH0sCisKKyAgX3JlbmRlclN1YnRyZWVJbnRv Q29udGFpbmVyOiBmdW5jdGlvbiAocGFyZW50Q29tcG9uZW50LCBuZXh0RWxlbWVudCwgY29udGFp bmVyLCBjYWxsYmFjaykgeworICAgIFJlYWN0VXBkYXRlUXVldWUudmFsaWRhdGVDYWxsYmFjayhj YWxsYmFjaywgJ1JlYWN0RE9NLnJlbmRlcicpOworICAgICFSZWFjdC5pc1ZhbGlkRWxlbWVudChu ZXh0RWxlbWVudCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52 YXJpYW50KGZhbHNlLCAnUmVhY3RET00ucmVuZGVyKCk6IEludmFsaWQgY29tcG9uZW50IGVsZW1l bnQuJXMnLCB0eXBlb2YgbmV4dEVsZW1lbnQgPT09ICdzdHJpbmcnID8gJyBJbnN0ZWFkIG9mIHBh c3NpbmcgYSBzdHJpbmcgbGlrZSBcJ2RpdlwnLCBwYXNzICcgKyAnUmVhY3QuY3JlYXRlRWxlbWVu dChcJ2RpdlwnKSBvciA8ZGl2IC8+LicgOiB0eXBlb2YgbmV4dEVsZW1lbnQgPT09ICdmdW5jdGlv bicgPyAnIEluc3RlYWQgb2YgcGFzc2luZyBhIGNsYXNzIGxpa2UgRm9vLCBwYXNzICcgKyAnUmVh Y3QuY3JlYXRlRWxlbWVudChGb28pIG9yIDxGb28gLz4uJyA6CisgICAgLy8gQ2hlY2sgaWYgaXQg cXVhY2tzIGxpa2UgYW4gZWxlbWVudAorICAgIG5leHRFbGVtZW50ICE9IG51bGwgJiYgbmV4dEVs ZW1lbnQucHJvcHMgIT09IHVuZGVmaW5lZCA/ICcgVGhpcyBtYXkgYmUgY2F1c2VkIGJ5IHVuaW50 ZW50aW9uYWxseSBsb2FkaW5nIHR3byBpbmRlcGVuZGVudCAnICsgJ2NvcGllcyBvZiBSZWFjdC4n IDogJycpIDogX3Byb2RJbnZhcmlhbnQoJzM5JywgdHlwZW9mIG5leHRFbGVtZW50ID09PSAnc3Ry aW5nJyA/ICcgSW5zdGVhZCBvZiBwYXNzaW5nIGEgc3RyaW5nIGxpa2UgXCdkaXZcJywgcGFzcyAn ICsgJ1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCdkaXZcJykgb3IgPGRpdiAvPi4nIDogdHlwZW9mIG5l eHRFbGVtZW50ID09PSAnZnVuY3Rpb24nID8gJyBJbnN0ZWFkIG9mIHBhc3NpbmcgYSBjbGFzcyBs aWtlIEZvbywgcGFzcyAnICsgJ1JlYWN0LmNyZWF0ZUVsZW1lbnQoRm9vKSBvciA8Rm9vIC8+Licg OiBuZXh0RWxlbWVudCAhPSBudWxsICYmIG5leHRFbGVtZW50LnByb3BzICE9PSB1bmRlZmluZWQg PyAnIFRoaXMgbWF5IGJlIGNhdXNlZCBieSB1bmludGVudGlvbmFsbHkgbG9hZGluZyB0d28gaW5k ZXBlbmRlbnQgJyArICdjb3BpZXMgb2YgUmVhY3QuJyA6ICcnKSA6IHZvaWQgMDsKKworICAgIHBy b2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFjb250YWluZXIg fHwgIWNvbnRhaW5lci50YWdOYW1lIHx8IGNvbnRhaW5lci50YWdOYW1lLnRvVXBwZXJDYXNlKCkg IT09ICdCT0RZJywgJ3JlbmRlcigpOiBSZW5kZXJpbmcgY29tcG9uZW50cyBkaXJlY3RseSBpbnRv IGRvY3VtZW50LmJvZHkgaXMgJyArICdkaXNjb3VyYWdlZCwgc2luY2UgaXRzIGNoaWxkcmVuIGFy ZSBvZnRlbiBtYW5pcHVsYXRlZCBieSB0aGlyZC1wYXJ0eSAnICsgJ3NjcmlwdHMgYW5kIGJyb3dz ZXIgZXh0ZW5zaW9ucy4gVGhpcyBtYXkgbGVhZCB0byBzdWJ0bGUgJyArICdyZWNvbmNpbGlhdGlv biBpc3N1ZXMuIFRyeSByZW5kZXJpbmcgaW50byBhIGNvbnRhaW5lciBlbGVtZW50IGNyZWF0ZWQg JyArICdmb3IgeW91ciBhcHAuJykgOiB2b2lkIDA7CisKKyAgICB2YXIgbmV4dFdyYXBwZWRFbGVt ZW50ID0gUmVhY3QuY3JlYXRlRWxlbWVudChUb3BMZXZlbFdyYXBwZXIsIHsgY2hpbGQ6IG5leHRF bGVtZW50IH0pOworCisgICAgdmFyIG5leHRDb250ZXh0OworICAgIGlmIChwYXJlbnRDb21wb25l bnQpIHsKKyAgICAgIHZhciBwYXJlbnRJbnN0ID0gUmVhY3RJbnN0YW5jZU1hcC5nZXQocGFyZW50 Q29tcG9uZW50KTsKKyAgICAgIG5leHRDb250ZXh0ID0gcGFyZW50SW5zdC5fcHJvY2Vzc0NoaWxk Q29udGV4dChwYXJlbnRJbnN0Ll9jb250ZXh0KTsKKyAgICB9IGVsc2UgeworICAgICAgbmV4dENv bnRleHQgPSBlbXB0eU9iamVjdDsKKyAgICB9CisKKyAgICB2YXIgcHJldkNvbXBvbmVudCA9IGdl dFRvcExldmVsV3JhcHBlckluQ29udGFpbmVyKGNvbnRhaW5lcik7CisKKyAgICBpZiAocHJldkNv bXBvbmVudCkgeworICAgICAgdmFyIHByZXZXcmFwcGVkRWxlbWVudCA9IHByZXZDb21wb25lbnQu X2N1cnJlbnRFbGVtZW50OworICAgICAgdmFyIHByZXZFbGVtZW50ID0gcHJldldyYXBwZWRFbGVt ZW50LnByb3BzLmNoaWxkOworICAgICAgaWYgKHNob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50KHBy ZXZFbGVtZW50LCBuZXh0RWxlbWVudCkpIHsKKyAgICAgICAgdmFyIHB1YmxpY0luc3QgPSBwcmV2 Q29tcG9uZW50Ll9yZW5kZXJlZENvbXBvbmVudC5nZXRQdWJsaWNJbnN0YW5jZSgpOworICAgICAg ICB2YXIgdXBkYXRlZENhbGxiYWNrID0gY2FsbGJhY2sgJiYgZnVuY3Rpb24gKCkgeworICAgICAg ICAgIGNhbGxiYWNrLmNhbGwocHVibGljSW5zdCk7CisgICAgICAgIH07CisgICAgICAgIFJlYWN0 TW91bnQuX3VwZGF0ZVJvb3RDb21wb25lbnQocHJldkNvbXBvbmVudCwgbmV4dFdyYXBwZWRFbGVt ZW50LCBuZXh0Q29udGV4dCwgY29udGFpbmVyLCB1cGRhdGVkQ2FsbGJhY2spOworICAgICAgICBy ZXR1cm4gcHVibGljSW5zdDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFJlYWN0TW91bnQudW5t b3VudENvbXBvbmVudEF0Tm9kZShjb250YWluZXIpOworICAgICAgfQorICAgIH0KKworICAgIHZh ciByZWFjdFJvb3RFbGVtZW50ID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRh aW5lcik7CisgICAgdmFyIGNvbnRhaW5lckhhc1JlYWN0TWFya3VwID0gcmVhY3RSb290RWxlbWVu dCAmJiAhIWludGVybmFsR2V0SUQocmVhY3RSb290RWxlbWVudCk7CisgICAgdmFyIGNvbnRhaW5l ckhhc05vblJvb3RSZWFjdENoaWxkID0gaGFzTm9uUm9vdFJlYWN0Q2hpbGQoY29udGFpbmVyKTsK KworICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAg ICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghY29udGFp bmVySGFzTm9uUm9vdFJlYWN0Q2hpbGQsICdyZW5kZXIoLi4uKTogUmVwbGFjaW5nIFJlYWN0LXJl bmRlcmVkIGNoaWxkcmVuIHdpdGggYSBuZXcgcm9vdCAnICsgJ2NvbXBvbmVudC4gSWYgeW91IGlu dGVuZGVkIHRvIHVwZGF0ZSB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlLCAnICsgJ3lvdSBzaG91 bGQgaW5zdGVhZCBoYXZlIHRoZSBleGlzdGluZyBjaGlsZHJlbiB1cGRhdGUgdGhlaXIgc3RhdGUg JyArICdhbmQgcmVuZGVyIHRoZSBuZXcgY29tcG9uZW50cyBpbnN0ZWFkIG9mIGNhbGxpbmcgUmVh Y3RET00ucmVuZGVyLicpIDogdm9pZCAwOworCisgICAgICBpZiAoIWNvbnRhaW5lckhhc1JlYWN0 TWFya3VwIHx8IHJlYWN0Um9vdEVsZW1lbnQubmV4dFNpYmxpbmcpIHsKKyAgICAgICAgdmFyIHJv b3RFbGVtZW50U2libGluZyA9IHJlYWN0Um9vdEVsZW1lbnQ7CisgICAgICAgIHdoaWxlIChyb290 RWxlbWVudFNpYmxpbmcpIHsKKyAgICAgICAgICBpZiAoaW50ZXJuYWxHZXRJRChyb290RWxlbWVu dFNpYmxpbmcpKSB7CisgICAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1 Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ3JlbmRlcigpOiBUYXJnZXQgbm9kZSBoYXMgbWFya3Vw IHJlbmRlcmVkIGJ5IFJlYWN0LCBidXQgdGhlcmUgJyArICdhcmUgdW5yZWxhdGVkIG5vZGVzIGFz IHdlbGwuIFRoaXMgaXMgbW9zdCBjb21tb25seSBjYXVzZWQgYnkgJyArICd3aGl0ZS1zcGFjZSBp bnNlcnRlZCBhcm91bmQgc2VydmVyLXJlbmRlcmVkIG1hcmt1cC4nKSA6IHZvaWQgMDsKKyAgICAg ICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICByb290RWxlbWVudFNpYmxpbmcg PSByb290RWxlbWVudFNpYmxpbmcubmV4dFNpYmxpbmc7CisgICAgICAgIH0KKyAgICAgIH0KKyAg ICB9CisKKyAgICB2YXIgc2hvdWxkUmV1c2VNYXJrdXAgPSBjb250YWluZXJIYXNSZWFjdE1hcmt1 cCAmJiAhcHJldkNvbXBvbmVudCAmJiAhY29udGFpbmVySGFzTm9uUm9vdFJlYWN0Q2hpbGQ7Cisg ICAgdmFyIGNvbXBvbmVudCA9IFJlYWN0TW91bnQuX3JlbmRlck5ld1Jvb3RDb21wb25lbnQobmV4 dFdyYXBwZWRFbGVtZW50LCBjb250YWluZXIsIHNob3VsZFJldXNlTWFya3VwLCBuZXh0Q29udGV4 dCkuX3JlbmRlcmVkQ29tcG9uZW50LmdldFB1YmxpY0luc3RhbmNlKCk7CisgICAgaWYgKGNhbGxi YWNrKSB7CisgICAgICBjYWxsYmFjay5jYWxsKGNvbXBvbmVudCk7CisgICAgfQorICAgIHJldHVy biBjb21wb25lbnQ7CisgIH0sCisKKyAgLyoqCisgICAqIFJlbmRlcnMgYSBSZWFjdCBjb21wb25l bnQgaW50byB0aGUgRE9NIGluIHRoZSBzdXBwbGllZCBgY29udGFpbmVyYC4KKyAgICogU2VlIGh0 dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3Jl YWN0ZG9tLnJlbmRlcgorICAgKgorICAgKiBJZiB0aGUgUmVhY3QgY29tcG9uZW50IHdhcyBwcmV2 aW91c2x5IHJlbmRlcmVkIGludG8gYGNvbnRhaW5lcmAsIHRoaXMgd2lsbAorICAgKiBwZXJmb3Jt IGFuIHVwZGF0ZSBvbiBpdCBhbmQgb25seSBtdXRhdGUgdGhlIERPTSBhcyBuZWNlc3NhcnkgdG8g cmVmbGVjdCB0aGUKKyAgICogbGF0ZXN0IFJlYWN0IGNvbXBvbmVudC4KKyAgICoKKyAgICogQHBh cmFtIHtSZWFjdEVsZW1lbnR9IG5leHRFbGVtZW50IENvbXBvbmVudCBlbGVtZW50IHRvIHJlbmRl ci4KKyAgICogQHBhcmFtIHtET01FbGVtZW50fSBjb250YWluZXIgRE9NIGVsZW1lbnQgdG8gcmVu ZGVyIGludG8uCisgICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBmdW5jdGlvbiB0cmln Z2VyZWQgb24gY29tcGxldGlvbgorICAgKiBAcmV0dXJuIHtSZWFjdENvbXBvbmVudH0gQ29tcG9u ZW50IGluc3RhbmNlIHJlbmRlcmVkIGluIGBjb250YWluZXJgLgorICAgKi8KKyAgcmVuZGVyOiBm dW5jdGlvbiAobmV4dEVsZW1lbnQsIGNvbnRhaW5lciwgY2FsbGJhY2spIHsKKyAgICByZXR1cm4g UmVhY3RNb3VudC5fcmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgbmV4dEVsZW1lbnQs IGNvbnRhaW5lciwgY2FsbGJhY2spOworICB9LAorCisgIC8qKgorICAgKiBVbm1vdW50cyBhbmQg ZGVzdHJveXMgdGhlIFJlYWN0IGNvbXBvbmVudCByZW5kZXJlZCBpbiB0aGUgYGNvbnRhaW5lcmAu CisgICAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZl bC1hcGkuaHRtbCNyZWFjdGRvbS51bm1vdW50Y29tcG9uZW50YXRub2RlCisgICAqCisgICAqIEBw YXJhbSB7RE9NRWxlbWVudH0gY29udGFpbmVyIERPTSBlbGVtZW50IGNvbnRhaW5pbmcgYSBSZWFj dCBjb21wb25lbnQuCisgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYSBjb21wb25lbnQg d2FzIGZvdW5kIGluIGFuZCB1bm1vdW50ZWQgZnJvbQorICAgKiAgICAgICAgICAgICAgICAgICBg Y29udGFpbmVyYAorICAgKi8KKyAgdW5tb3VudENvbXBvbmVudEF0Tm9kZTogZnVuY3Rpb24gKGNv bnRhaW5lcikgeworICAgIC8vIFZhcmlvdXMgcGFydHMgb2Ygb3VyIGNvZGUgKHN1Y2ggYXMgUmVh Y3RDb21wb3NpdGVDb21wb25lbnQncworICAgIC8vIF9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnQp IGFzc3VtZSB0aGF0IGNhbGxzIHRvIHJlbmRlciBhcmVuJ3QgbmVzdGVkOworICAgIC8vIHZlcmlm eSB0aGF0IHRoYXQncyB0aGUgY2FzZS4gKFN0cmljdGx5IHNwZWFraW5nLCB1bm1vdW50aW5nIHdv bid0IGNhdXNlIGEKKyAgICAvLyByZW5kZXIgYnV0IHdlIHN0aWxsIGRvbid0IGV4cGVjdCB0byBi ZSBpbiBhIHJlbmRlciBjYWxsIGhlcmUuKQorICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAn cHJvZHVjdGlvbicgPyB3YXJuaW5nKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgPT0gbnVsbCwg J3VubW91bnRDb21wb25lbnRBdE5vZGUoKTogUmVuZGVyIG1ldGhvZHMgc2hvdWxkIGJlIGEgcHVy ZSBmdW5jdGlvbiAnICsgJ29mIHByb3BzIGFuZCBzdGF0ZTsgdHJpZ2dlcmluZyBuZXN0ZWQgY29t cG9uZW50IHVwZGF0ZXMgZnJvbSByZW5kZXIgJyArICdpcyBub3QgYWxsb3dlZC4gSWYgbmVjZXNz YXJ5LCB0cmlnZ2VyIG5lc3RlZCB1cGRhdGVzIGluICcgKyAnY29tcG9uZW50RGlkVXBkYXRlLiBD aGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiAlcy4nLCBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50 ICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQuZ2V0TmFtZSgpIHx8ICdSZWFjdENvbXBvc2l0 ZUNvbXBvbmVudCcpIDogdm9pZCAwOworCisgICAgIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVy KSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFs c2UsICd1bm1vdW50Q29tcG9uZW50QXROb2RlKC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90 IGEgRE9NIGVsZW1lbnQuJykgOiBfcHJvZEludmFyaWFudCgnNDAnKSA6IHZvaWQgMDsKKworICAg IGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICBwcm9j ZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghbm9kZUlzUmVuZGVy ZWRCeU90aGVySW5zdGFuY2UoY29udGFpbmVyKSwgJ3VubW91bnRDb21wb25lbnRBdE5vZGUoKTog VGhlIG5vZGUgeW91XCdyZSBhdHRlbXB0aW5nIHRvIHVubW91bnQgJyArICd3YXMgcmVuZGVyZWQg YnkgYW5vdGhlciBjb3B5IG9mIFJlYWN0LicpIDogdm9pZCAwOworICAgIH0KKworICAgIHZhciBw cmV2Q29tcG9uZW50ID0gZ2V0VG9wTGV2ZWxXcmFwcGVySW5Db250YWluZXIoY29udGFpbmVyKTsK KyAgICBpZiAoIXByZXZDb21wb25lbnQpIHsKKyAgICAgIC8vIENoZWNrIGlmIHRoZSBub2RlIGJl aW5nIHVubW91bnRlZCB3YXMgcmVuZGVyZWQgYnkgUmVhY3QsIGJ1dCBpc24ndCBhCisgICAgICAv LyByb290IG5vZGUuCisgICAgICB2YXIgY29udGFpbmVySGFzTm9uUm9vdFJlYWN0Q2hpbGQgPSBo YXNOb25Sb290UmVhY3RDaGlsZChjb250YWluZXIpOworCisgICAgICAvLyBDaGVjayBpZiB0aGUg Y29udGFpbmVyIGl0c2VsZiBpcyBhIFJlYWN0IHJvb3Qgbm9kZS4KKyAgICAgIHZhciBpc0NvbnRh aW5lclJlYWN0Um9vdCA9IGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gMSAmJiBjb250YWluZXIuaGFz QXR0cmlidXRlKFJPT1RfQVRUUl9OQU1FKTsKKworICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVf RU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09 ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIWNvbnRhaW5lckhhc05vblJvb3RSZWFjdENoaWxkLCAn dW5tb3VudENvbXBvbmVudEF0Tm9kZSgpOiBUaGUgbm9kZSB5b3VcJ3JlIGF0dGVtcHRpbmcgdG8g dW5tb3VudCAnICsgJ3dhcyByZW5kZXJlZCBieSBSZWFjdCBhbmQgaXMgbm90IGEgdG9wLWxldmVs IGNvbnRhaW5lci4gJXMnLCBpc0NvbnRhaW5lclJlYWN0Um9vdCA/ICdZb3UgbWF5IGhhdmUgYWNj aWRlbnRhbGx5IHBhc3NlZCBpbiBhIFJlYWN0IHJvb3Qgbm9kZSBpbnN0ZWFkICcgKyAnb2YgaXRz IGNvbnRhaW5lci4nIDogJ0luc3RlYWQsIGhhdmUgdGhlIHBhcmVudCBjb21wb25lbnQgdXBkYXRl IGl0cyBzdGF0ZSBhbmQgJyArICdyZXJlbmRlciBpbiBvcmRlciB0byByZW1vdmUgdGhpcyBjb21w b25lbnQuJykgOiB2b2lkIDA7CisgICAgICB9CisKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9 CisgICAgZGVsZXRlIGluc3RhbmNlc0J5UmVhY3RSb290SURbcHJldkNvbXBvbmVudC5faW5zdGFu Y2Uucm9vdElEXTsKKyAgICBSZWFjdFVwZGF0ZXMuYmF0Y2hlZFVwZGF0ZXModW5tb3VudENvbXBv bmVudEZyb21Ob2RlLCBwcmV2Q29tcG9uZW50LCBjb250YWluZXIsIGZhbHNlKTsKKyAgICByZXR1 cm4gdHJ1ZTsKKyAgfSwKKworICBfbW91bnRJbWFnZUludG9Ob2RlOiBmdW5jdGlvbiAobWFya3Vw LCBjb250YWluZXIsIGluc3RhbmNlLCBzaG91bGRSZXVzZU1hcmt1cCwgdHJhbnNhY3Rpb24pIHsK KyAgICAhaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYg IT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ21vdW50Q29tcG9uZW50SW50b05v ZGUoLi4uKTogVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgdmFsaWQuJykgOiBfcHJvZEludmFyaWFu dCgnNDEnKSA6IHZvaWQgMDsKKworICAgIGlmIChzaG91bGRSZXVzZU1hcmt1cCkgeworICAgICAg dmFyIHJvb3RFbGVtZW50ID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5l cik7CisgICAgICBpZiAoUmVhY3RNYXJrdXBDaGVja3N1bS5jYW5SZXVzZU1hcmt1cChtYXJrdXAs IHJvb3RFbGVtZW50KSkgeworICAgICAgICBSZWFjdERPTUNvbXBvbmVudFRyZWUucHJlY2FjaGVO b2RlKGluc3RhbmNlLCByb290RWxlbWVudCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0gZWxz ZSB7CisgICAgICAgIHZhciBjaGVja3N1bSA9IHJvb3RFbGVtZW50LmdldEF0dHJpYnV0ZShSZWFj dE1hcmt1cENoZWNrc3VtLkNIRUNLU1VNX0FUVFJfTkFNRSk7CisgICAgICAgIHJvb3RFbGVtZW50 LnJlbW92ZUF0dHJpYnV0ZShSZWFjdE1hcmt1cENoZWNrc3VtLkNIRUNLU1VNX0FUVFJfTkFNRSk7 CisKKyAgICAgICAgdmFyIHJvb3RNYXJrdXAgPSByb290RWxlbWVudC5vdXRlckhUTUw7CisgICAg ICAgIHJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZShSZWFjdE1hcmt1cENoZWNrc3VtLkNIRUNLU1VN X0FUVFJfTkFNRSwgY2hlY2tzdW0pOworCisgICAgICAgIHZhciBub3JtYWxpemVkTWFya3VwID0g bWFya3VwOworICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9u JykgeworICAgICAgICAgIC8vIGJlY2F1c2Ugcm9vdE1hcmt1cCBpcyByZXRyaWV2ZWQgZnJvbSB0 aGUgRE9NLCB2YXJpb3VzIG5vcm1hbGl6YXRpb25zCisgICAgICAgICAgLy8gd2lsbCBoYXZlIG9j Y3VycmVkIHdoaWNoIHdpbGwgbm90IGJlIHByZXNlbnQgaW4gYG1hcmt1cGAuIEhlcmUsCisgICAg ICAgICAgLy8gaW5zZXJ0IG1hcmt1cCBpbnRvIGEgPGRpdj4gb3IgPGlmcmFtZT4gZGVwZW5kaW5n IG9uIHRoZSBjb250YWluZXIKKyAgICAgICAgICAvLyB0eXBlIHRvIHBlcmZvcm0gdGhlIHNhbWUg bm9ybWFsaXphdGlvbnMgYmVmb3JlIGNvbXBhcmluZy4KKyAgICAgICAgICB2YXIgbm9ybWFsaXpl cjsKKyAgICAgICAgICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREVfVFlQ RSkgeworICAgICAgICAgICAgbm9ybWFsaXplciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Rp dicpOworICAgICAgICAgICAgbm9ybWFsaXplci5pbm5lckhUTUwgPSBtYXJrdXA7CisgICAgICAg ICAgICBub3JtYWxpemVkTWFya3VwID0gbm9ybWFsaXplci5pbm5lckhUTUw7CisgICAgICAgICAg fSBlbHNlIHsKKyAgICAgICAgICAgIG5vcm1hbGl6ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50 KCdpZnJhbWUnKTsKKyAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobm9ybWFs aXplcik7CisgICAgICAgICAgICBub3JtYWxpemVyLmNvbnRlbnREb2N1bWVudC53cml0ZShtYXJr dXApOworICAgICAgICAgICAgbm9ybWFsaXplZE1hcmt1cCA9IG5vcm1hbGl6ZXIuY29udGVudERv Y3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7CisgICAgICAgICAgICBkb2N1bWVudC5i b2R5LnJlbW92ZUNoaWxkKG5vcm1hbGl6ZXIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisg ICAgICAgIHZhciBkaWZmSW5kZXggPSBmaXJzdERpZmZlcmVuY2VJbmRleChub3JtYWxpemVkTWFy a3VwLCByb290TWFya3VwKTsKKyAgICAgICAgdmFyIGRpZmZlcmVuY2UgPSAnIChjbGllbnQpICcg KyBub3JtYWxpemVkTWFya3VwLnN1YnN0cmluZyhkaWZmSW5kZXggLSAyMCwgZGlmZkluZGV4ICsg MjApICsgJ1xuIChzZXJ2ZXIpICcgKyByb290TWFya3VwLnN1YnN0cmluZyhkaWZmSW5kZXggLSAy MCwgZGlmZkluZGV4ICsgMjApOworCisgICAgICAgICEoY29udGFpbmVyLm5vZGVUeXBlICE9PSBE T0NfTk9ERV9UWVBFKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBp bnZhcmlhbnQoZmFsc2UsICdZb3VcJ3JlIHRyeWluZyB0byByZW5kZXIgYSBjb21wb25lbnQgdG8g dGhlIGRvY3VtZW50IHVzaW5nIHNlcnZlciByZW5kZXJpbmcgYnV0IHRoZSBjaGVja3N1bSB3YXMg aW52YWxpZC4gVGhpcyB1c3VhbGx5IG1lYW5zIHlvdSByZW5kZXJlZCBhIGRpZmZlcmVudCBjb21w b25lbnQgdHlwZSBvciBwcm9wcyBvbiB0aGUgY2xpZW50IGZyb20gdGhlIG9uZSBvbiB0aGUgc2Vy dmVyLCBvciB5b3VyIHJlbmRlcigpIG1ldGhvZHMgYXJlIGltcHVyZS4gUmVhY3QgY2Fubm90IGhh bmRsZSB0aGlzIGNhc2UgZHVlIHRvIGNyb3NzLWJyb3dzZXIgcXVpcmtzIGJ5IHJlbmRlcmluZyBh dCB0aGUgZG9jdW1lbnQgcm9vdC4gWW91IHNob3VsZCBsb29rIGZvciBlbnZpcm9ubWVudCBkZXBl bmRlbnQgY29kZSBpbiB5b3VyIGNvbXBvbmVudHMgYW5kIGVuc3VyZSB0aGUgcHJvcHMgYXJlIHRo ZSBzYW1lIGNsaWVudCBhbmQgc2VydmVyIHNpZGU6XG4lcycsIGRpZmZlcmVuY2UpIDogX3Byb2RJ bnZhcmlhbnQoJzQyJywgZGlmZmVyZW5jZSkgOiB2b2lkIDA7CisKKyAgICAgICAgaWYgKHByb2Nl c3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICAgICBwcm9jZXNzLmVu di5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1JlYWN0IGF0dGVt cHRlZCB0byByZXVzZSBtYXJrdXAgaW4gYSBjb250YWluZXIgYnV0IHRoZSAnICsgJ2NoZWNrc3Vt IHdhcyBpbnZhbGlkLiBUaGlzIGdlbmVyYWxseSBtZWFucyB0aGF0IHlvdSBhcmUgJyArICd1c2lu ZyBzZXJ2ZXIgcmVuZGVyaW5nIGFuZCB0aGUgbWFya3VwIGdlbmVyYXRlZCBvbiB0aGUgJyArICdz ZXJ2ZXIgd2FzIG5vdCB3aGF0IHRoZSBjbGllbnQgd2FzIGV4cGVjdGluZy4gUmVhY3QgaW5qZWN0 ZWQgJyArICduZXcgbWFya3VwIHRvIGNvbXBlbnNhdGUgd2hpY2ggd29ya3MgYnV0IHlvdSBoYXZl IGxvc3QgbWFueSAnICsgJ29mIHRoZSBiZW5lZml0cyBvZiBzZXJ2ZXIgcmVuZGVyaW5nLiBJbnN0 ZWFkLCBmaWd1cmUgb3V0ICcgKyAnd2h5IHRoZSBtYXJrdXAgYmVpbmcgZ2VuZXJhdGVkIGlzIGRp ZmZlcmVudCBvbiB0aGUgY2xpZW50ICcgKyAnb3Igc2VydmVyOlxuJXMnLCBkaWZmZXJlbmNlKSA6 IHZvaWQgMDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgICEoY29udGFpbmVyLm5v ZGVUeXBlICE9PSBET0NfTk9ERV9UWVBFKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJv ZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdZb3VcJ3JlIHRyeWluZyB0byByZW5kZXIgYSBj b21wb25lbnQgdG8gdGhlIGRvY3VtZW50IGJ1dCB5b3UgZGlkblwndCB1c2Ugc2VydmVyIHJlbmRl cmluZy4gV2UgY2FuXCd0IGRvIHRoaXMgd2l0aG91dCB1c2luZyBzZXJ2ZXIgcmVuZGVyaW5nIGR1 ZSB0byBjcm9zcy1icm93c2VyIHF1aXJrcy4gU2VlIFJlYWN0RE9NU2VydmVyLnJlbmRlclRvU3Ry aW5nKCkgZm9yIHNlcnZlciByZW5kZXJpbmcuJykgOiBfcHJvZEludmFyaWFudCgnNDMnKSA6IHZv aWQgMDsKKworICAgIGlmICh0cmFuc2FjdGlvbi51c2VDcmVhdGVFbGVtZW50KSB7CisgICAgICB3 aGlsZSAoY29udGFpbmVyLmxhc3RDaGlsZCkgeworICAgICAgICBjb250YWluZXIucmVtb3ZlQ2hp bGQoY29udGFpbmVyLmxhc3RDaGlsZCk7CisgICAgICB9CisgICAgICBET01MYXp5VHJlZS5pbnNl cnRUcmVlQmVmb3JlKGNvbnRhaW5lciwgbWFya3VwLCBudWxsKTsKKyAgICB9IGVsc2UgeworICAg ICAgc2V0SW5uZXJIVE1MKGNvbnRhaW5lciwgbWFya3VwKTsKKyAgICAgIFJlYWN0RE9NQ29tcG9u ZW50VHJlZS5wcmVjYWNoZU5vZGUoaW5zdGFuY2UsIGNvbnRhaW5lci5maXJzdENoaWxkKTsKKyAg ICB9CisKKyAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgewor ICAgICAgdmFyIGhvc3ROb2RlID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJv bU5vZGUoY29udGFpbmVyLmZpcnN0Q2hpbGQpOworICAgICAgaWYgKGhvc3ROb2RlLl9kZWJ1Z0lE ICE9PSAwKSB7CisgICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RP cGVyYXRpb24oeworICAgICAgICAgIGluc3RhbmNlSUQ6IGhvc3ROb2RlLl9kZWJ1Z0lELAorICAg ICAgICAgIHR5cGU6ICdtb3VudCcsCisgICAgICAgICAgcGF5bG9hZDogbWFya3VwLnRvU3RyaW5n KCkKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorICB9Cit9OworCittb2R1bGUuZXhwb3J0 cyA9IFJlYWN0TW91bnQ7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEv d2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0TXVsdGlDaGlsZC5q cyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdE11bHRpQ2hp bGQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLmU1MjAwNWZmCi0tLSAv ZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1Jl YWN0TXVsdGlDaGlsZC5qcwpAQCAtMCwwICsxLDQ0OSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAx My1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg KiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5z ZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2Yg dGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0 cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3Rvcnku CisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWly ZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTsKKwordmFyIFJlYWN0Q29tcG9uZW50RW52aXJvbm1l bnQgPSByZXF1aXJlKCcuL1JlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQnKTsKK3ZhciBSZWFjdElu c3RhbmNlTWFwID0gcmVxdWlyZSgnLi9SZWFjdEluc3RhbmNlTWFwJyk7Cit2YXIgUmVhY3RJbnN0 cnVtZW50YXRpb24gPSByZXF1aXJlKCcuL1JlYWN0SW5zdHJ1bWVudGF0aW9uJyk7CisKK3ZhciBS ZWFjdEN1cnJlbnRPd25lciA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdEN1cnJlbnRPd25lcicp OwordmFyIFJlYWN0UmVjb25jaWxlciA9IHJlcXVpcmUoJy4vUmVhY3RSZWNvbmNpbGVyJyk7Cit2 YXIgUmVhY3RDaGlsZFJlY29uY2lsZXIgPSByZXF1aXJlKCcuL1JlYWN0Q2hpbGRSZWNvbmNpbGVy Jyk7CisKK3ZhciBlbXB0eUZ1bmN0aW9uID0gcmVxdWlyZSgnZmJqcy9saWIvZW1wdHlGdW5jdGlv bicpOwordmFyIGZsYXR0ZW5DaGlsZHJlbiA9IHJlcXVpcmUoJy4vZmxhdHRlbkNoaWxkcmVuJyk7 Cit2YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7CisKKy8qKgor ICogTWFrZSBhbiB1cGRhdGUgZm9yIG1hcmt1cCB0byBiZSByZW5kZXJlZCBhbmQgaW5zZXJ0ZWQg YXQgYSBzdXBwbGllZCBpbmRleC4KKyAqCisgKiBAcGFyYW0ge3N0cmluZ30gbWFya3VwIE1hcmt1 cCB0aGF0IHJlbmRlcnMgaW50byBhbiBlbGVtZW50LgorICogQHBhcmFtIHtudW1iZXJ9IHRvSW5k ZXggRGVzdGluYXRpb24gaW5kZXguCisgKiBAcHJpdmF0ZQorICovCitmdW5jdGlvbiBtYWtlSW5z ZXJ0TWFya3VwKG1hcmt1cCwgYWZ0ZXJOb2RlLCB0b0luZGV4KSB7CisgIC8vIE5PVEU6IE51bGwg dmFsdWVzIHJlZHVjZSBoaWRkZW4gY2xhc3Nlcy4KKyAgcmV0dXJuIHsKKyAgICB0eXBlOiAnSU5T RVJUX01BUktVUCcsCisgICAgY29udGVudDogbWFya3VwLAorICAgIGZyb21JbmRleDogbnVsbCwK KyAgICBmcm9tTm9kZTogbnVsbCwKKyAgICB0b0luZGV4OiB0b0luZGV4LAorICAgIGFmdGVyTm9k ZTogYWZ0ZXJOb2RlCisgIH07Cit9CisKKy8qKgorICogTWFrZSBhbiB1cGRhdGUgZm9yIG1vdmlu ZyBhbiBleGlzdGluZyBlbGVtZW50IHRvIGFub3RoZXIgaW5kZXguCisgKgorICogQHBhcmFtIHtu dW1iZXJ9IGZyb21JbmRleCBTb3VyY2UgaW5kZXggb2YgdGhlIGV4aXN0aW5nIGVsZW1lbnQuCisg KiBAcGFyYW0ge251bWJlcn0gdG9JbmRleCBEZXN0aW5hdGlvbiBpbmRleCBvZiB0aGUgZWxlbWVu dC4KKyAqIEBwcml2YXRlCisgKi8KK2Z1bmN0aW9uIG1ha2VNb3ZlKGNoaWxkLCBhZnRlck5vZGUs IHRvSW5kZXgpIHsKKyAgLy8gTk9URTogTnVsbCB2YWx1ZXMgcmVkdWNlIGhpZGRlbiBjbGFzc2Vz LgorICByZXR1cm4geworICAgIHR5cGU6ICdNT1ZFX0VYSVNUSU5HJywKKyAgICBjb250ZW50OiBu dWxsLAorICAgIGZyb21JbmRleDogY2hpbGQuX21vdW50SW5kZXgsCisgICAgZnJvbU5vZGU6IFJl YWN0UmVjb25jaWxlci5nZXRIb3N0Tm9kZShjaGlsZCksCisgICAgdG9JbmRleDogdG9JbmRleCwK KyAgICBhZnRlck5vZGU6IGFmdGVyTm9kZQorICB9OworfQorCisvKioKKyAqIE1ha2UgYW4gdXBk YXRlIGZvciByZW1vdmluZyBhbiBlbGVtZW50IGF0IGFuIGluZGV4LgorICoKKyAqIEBwYXJhbSB7 bnVtYmVyfSBmcm9tSW5kZXggSW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmVtb3ZlLgorICogQHBy aXZhdGUKKyAqLworZnVuY3Rpb24gbWFrZVJlbW92ZShjaGlsZCwgbm9kZSkgeworICAvLyBOT1RF OiBOdWxsIHZhbHVlcyByZWR1Y2UgaGlkZGVuIGNsYXNzZXMuCisgIHJldHVybiB7CisgICAgdHlw ZTogJ1JFTU9WRV9OT0RFJywKKyAgICBjb250ZW50OiBudWxsLAorICAgIGZyb21JbmRleDogY2hp bGQuX21vdW50SW5kZXgsCisgICAgZnJvbU5vZGU6IG5vZGUsCisgICAgdG9JbmRleDogbnVsbCwK KyAgICBhZnRlck5vZGU6IG51bGwKKyAgfTsKK30KKworLyoqCisgKiBNYWtlIGFuIHVwZGF0ZSBm b3Igc2V0dGluZyB0aGUgbWFya3VwIG9mIGEgbm9kZS4KKyAqCisgKiBAcGFyYW0ge3N0cmluZ30g bWFya3VwIE1hcmt1cCB0aGF0IHJlbmRlcnMgaW50byBhbiBlbGVtZW50LgorICogQHByaXZhdGUK KyAqLworZnVuY3Rpb24gbWFrZVNldE1hcmt1cChtYXJrdXApIHsKKyAgLy8gTk9URTogTnVsbCB2 YWx1ZXMgcmVkdWNlIGhpZGRlbiBjbGFzc2VzLgorICByZXR1cm4geworICAgIHR5cGU6ICdTRVRf TUFSS1VQJywKKyAgICBjb250ZW50OiBtYXJrdXAsCisgICAgZnJvbUluZGV4OiBudWxsLAorICAg IGZyb21Ob2RlOiBudWxsLAorICAgIHRvSW5kZXg6IG51bGwsCisgICAgYWZ0ZXJOb2RlOiBudWxs CisgIH07Cit9CisKKy8qKgorICogTWFrZSBhbiB1cGRhdGUgZm9yIHNldHRpbmcgdGhlIHRleHQg Y29udGVudC4KKyAqCisgKiBAcGFyYW0ge3N0cmluZ30gdGV4dENvbnRlbnQgVGV4dCBjb250ZW50 IHRvIHNldC4KKyAqIEBwcml2YXRlCisgKi8KK2Z1bmN0aW9uIG1ha2VUZXh0Q29udGVudCh0ZXh0 Q29udGVudCkgeworICAvLyBOT1RFOiBOdWxsIHZhbHVlcyByZWR1Y2UgaGlkZGVuIGNsYXNzZXMu CisgIHJldHVybiB7CisgICAgdHlwZTogJ1RFWFRfQ09OVEVOVCcsCisgICAgY29udGVudDogdGV4 dENvbnRlbnQsCisgICAgZnJvbUluZGV4OiBudWxsLAorICAgIGZyb21Ob2RlOiBudWxsLAorICAg IHRvSW5kZXg6IG51bGwsCisgICAgYWZ0ZXJOb2RlOiBudWxsCisgIH07Cit9CisKKy8qKgorICog UHVzaCBhbiB1cGRhdGUsIGlmIGFueSwgb250byB0aGUgcXVldWUuIENyZWF0ZXMgYSBuZXcgcXVl dWUgaWYgbm9uZSBpcworICogcGFzc2VkIGFuZCBhbHdheXMgcmV0dXJucyB0aGUgcXVldWUuIE11 dGF0aXZlLgorICovCitmdW5jdGlvbiBlbnF1ZXVlKHF1ZXVlLCB1cGRhdGUpIHsKKyAgaWYgKHVw ZGF0ZSkgeworICAgIHF1ZXVlID0gcXVldWUgfHwgW107CisgICAgcXVldWUucHVzaCh1cGRhdGUp OworICB9CisgIHJldHVybiBxdWV1ZTsKK30KKworLyoqCisgKiBQcm9jZXNzZXMgYW55IGVucXVl dWVkIHVwZGF0ZXMuCisgKgorICogQHByaXZhdGUKKyAqLworZnVuY3Rpb24gcHJvY2Vzc1F1ZXVl KGluc3QsIHVwZGF0ZVF1ZXVlKSB7CisgIFJlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQucHJvY2Vz c0NoaWxkcmVuVXBkYXRlcyhpbnN0LCB1cGRhdGVRdWV1ZSk7Cit9CisKK3ZhciBzZXRDaGlsZHJl bkZvckluc3RydW1lbnRhdGlvbiA9IGVtcHR5RnVuY3Rpb247CitpZiAocHJvY2Vzcy5lbnYuTk9E RV9FTlYgIT09ICdwcm9kdWN0aW9uJykgeworICB2YXIgZ2V0RGVidWdJRCA9IGZ1bmN0aW9uIChp bnN0KSB7CisgICAgaWYgKCFpbnN0Ll9kZWJ1Z0lEKSB7CisgICAgICAvLyBDaGVjayBmb3IgQVJU LWxpa2UgaW5zdGFuY2VzLiBUT0RPOiBUaGlzIGlzIHNpbGx5L2dyb3NzLgorICAgICAgdmFyIGlu dGVybmFsOworICAgICAgaWYgKGludGVybmFsID0gUmVhY3RJbnN0YW5jZU1hcC5nZXQoaW5zdCkp IHsKKyAgICAgICAgaW5zdCA9IGludGVybmFsOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4g aW5zdC5fZGVidWdJRDsKKyAgfTsKKyAgc2V0Q2hpbGRyZW5Gb3JJbnN0cnVtZW50YXRpb24gPSBm dW5jdGlvbiAoY2hpbGRyZW4pIHsKKyAgICB2YXIgZGVidWdJRCA9IGdldERlYnVnSUQodGhpcyk7 CisgICAgLy8gVE9ETzogUmVhY3QgTmF0aXZlIGVtcHR5IGNvbXBvbmVudHMgYXJlIGFsc28gbXVs dGljaGlsZC4KKyAgICAvLyBUaGlzIG1lYW5zIHRoZXkgc3RpbGwgZ2V0IGludG8gdGhpcyBtZXRo b2QgYnV0IGRvbid0IGhhdmUgX2RlYnVnSUQuCisgICAgaWYgKGRlYnVnSUQgIT09IDApIHsKKyAg ICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblNldENoaWxkcmVuKGRlYnVnSUQs IGNoaWxkcmVuID8gT2JqZWN0LmtleXMoY2hpbGRyZW4pLm1hcChmdW5jdGlvbiAoa2V5KSB7Cisg ICAgICAgIHJldHVybiBjaGlsZHJlbltrZXldLl9kZWJ1Z0lEOworICAgICAgfSkgOiBbXSk7Cisg ICAgfQorICB9OworfQorCisvKioKKyAqIFJlYWN0TXVsdGlDaGlsZCBhcmUgY2FwYWJsZSBvZiBy ZWNvbmNpbGluZyBtdWx0aXBsZSBjaGlsZHJlbi4KKyAqCisgKiBAY2xhc3MgUmVhY3RNdWx0aUNo aWxkCisgKiBAaW50ZXJuYWwKKyAqLwordmFyIFJlYWN0TXVsdGlDaGlsZCA9IHsKKworICAvKioK KyAgICogUHJvdmlkZXMgY29tbW9uIGZ1bmN0aW9uYWxpdHkgZm9yIGNvbXBvbmVudHMgdGhhdCBt dXN0IHJlY29uY2lsZSBtdWx0aXBsZQorICAgKiBjaGlsZHJlbi4gVGhpcyBpcyB1c2VkIGJ5IGBS ZWFjdERPTUNvbXBvbmVudGAgdG8gbW91bnQsIHVwZGF0ZSwgYW5kCisgICAqIHVubW91bnQgY2hp bGQgY29tcG9uZW50cy4KKyAgICoKKyAgICogQGxlbmRzIHtSZWFjdE11bHRpQ2hpbGQucHJvdG90 eXBlfQorICAgKi8KKyAgTWl4aW46IHsKKworICAgIF9yZWNvbmNpbGVySW5zdGFudGlhdGVDaGls ZHJlbjogZnVuY3Rpb24gKG5lc3RlZENoaWxkcmVuLCB0cmFuc2FjdGlvbiwgY29udGV4dCkgewor ICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAg ICAgdmFyIHNlbGZEZWJ1Z0lEID0gZ2V0RGVidWdJRCh0aGlzKTsKKyAgICAgICAgaWYgKHRoaXMu X2N1cnJlbnRFbGVtZW50KSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJlYWN0Q3Vy cmVudE93bmVyLmN1cnJlbnQgPSB0aGlzLl9jdXJyZW50RWxlbWVudC5fb3duZXI7CisgICAgICAg ICAgICByZXR1cm4gUmVhY3RDaGlsZFJlY29uY2lsZXIuaW5zdGFudGlhdGVDaGlsZHJlbihuZXN0 ZWRDaGlsZHJlbiwgdHJhbnNhY3Rpb24sIGNvbnRleHQsIHNlbGZEZWJ1Z0lEKTsKKyAgICAgICAg ICB9IGZpbmFsbHkgeworICAgICAgICAgICAgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCA9IG51 bGw7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gUmVhY3RD aGlsZFJlY29uY2lsZXIuaW5zdGFudGlhdGVDaGlsZHJlbihuZXN0ZWRDaGlsZHJlbiwgdHJhbnNh Y3Rpb24sIGNvbnRleHQpOworICAgIH0sCisKKyAgICBfcmVjb25jaWxlclVwZGF0ZUNoaWxkcmVu OiBmdW5jdGlvbiAocHJldkNoaWxkcmVuLCBuZXh0TmVzdGVkQ2hpbGRyZW5FbGVtZW50cywgbW91 bnRJbWFnZXMsIHJlbW92ZWROb2RlcywgdHJhbnNhY3Rpb24sIGNvbnRleHQpIHsKKyAgICAgIHZh ciBuZXh0Q2hpbGRyZW47CisgICAgICB2YXIgc2VsZkRlYnVnSUQgPSAwOworICAgICAgaWYgKHBy b2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICAgc2VsZkRlYnVn SUQgPSBnZXREZWJ1Z0lEKHRoaXMpOworICAgICAgICBpZiAodGhpcy5fY3VycmVudEVsZW1lbnQp IHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgUmVhY3RDdXJyZW50T3duZXIuY3VycmVu dCA9IHRoaXMuX2N1cnJlbnRFbGVtZW50Ll9vd25lcjsKKyAgICAgICAgICAgIG5leHRDaGlsZHJl biA9IGZsYXR0ZW5DaGlsZHJlbihuZXh0TmVzdGVkQ2hpbGRyZW5FbGVtZW50cywgc2VsZkRlYnVn SUQpOworICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBSZWFjdEN1cnJlbnRPd25l ci5jdXJyZW50ID0gbnVsbDsKKyAgICAgICAgICB9CisgICAgICAgICAgUmVhY3RDaGlsZFJlY29u Y2lsZXIudXBkYXRlQ2hpbGRyZW4ocHJldkNoaWxkcmVuLCBuZXh0Q2hpbGRyZW4sIG1vdW50SW1h Z2VzLCByZW1vdmVkTm9kZXMsIHRyYW5zYWN0aW9uLCB0aGlzLCB0aGlzLl9ob3N0Q29udGFpbmVy SW5mbywgY29udGV4dCwgc2VsZkRlYnVnSUQpOworICAgICAgICAgIHJldHVybiBuZXh0Q2hpbGRy ZW47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG5leHRDaGlsZHJlbiA9IGZsYXR0ZW5DaGls ZHJlbihuZXh0TmVzdGVkQ2hpbGRyZW5FbGVtZW50cywgc2VsZkRlYnVnSUQpOworICAgICAgUmVh Y3RDaGlsZFJlY29uY2lsZXIudXBkYXRlQ2hpbGRyZW4ocHJldkNoaWxkcmVuLCBuZXh0Q2hpbGRy ZW4sIG1vdW50SW1hZ2VzLCByZW1vdmVkTm9kZXMsIHRyYW5zYWN0aW9uLCB0aGlzLCB0aGlzLl9o b3N0Q29udGFpbmVySW5mbywgY29udGV4dCwgc2VsZkRlYnVnSUQpOworICAgICAgcmV0dXJuIG5l eHRDaGlsZHJlbjsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIGEgIm1vdW50 IGltYWdlIiBmb3IgZWFjaCBvZiB0aGUgc3VwcGxpZWQgY2hpbGRyZW4uIEluIHRoZSBjYXNlCisg ICAgICogb2YgYFJlYWN0RE9NQ29tcG9uZW50YCwgYSBtb3VudCBpbWFnZSBpcyBhIHN0cmluZyBv ZiBtYXJrdXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gez9vYmplY3R9IG5lc3RlZENoaWxkcmVu IE5lc3RlZCBjaGlsZCBtYXBzLgorICAgICAqIEByZXR1cm4ge2FycmF5fSBBbiBhcnJheSBvZiBt b3VudGVkIHJlcHJlc2VudGF0aW9ucy4KKyAgICAgKiBAaW50ZXJuYWwKKyAgICAgKi8KKyAgICBt b3VudENoaWxkcmVuOiBmdW5jdGlvbiAobmVzdGVkQ2hpbGRyZW4sIHRyYW5zYWN0aW9uLCBjb250 ZXh0KSB7CisgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLl9yZWNvbmNpbGVySW5zdGFudGlhdGVD aGlsZHJlbihuZXN0ZWRDaGlsZHJlbiwgdHJhbnNhY3Rpb24sIGNvbnRleHQpOworICAgICAgdGhp cy5fcmVuZGVyZWRDaGlsZHJlbiA9IGNoaWxkcmVuOworCisgICAgICB2YXIgbW91bnRJbWFnZXMg PSBbXTsKKyAgICAgIHZhciBpbmRleCA9IDA7CisgICAgICBmb3IgKHZhciBuYW1lIGluIGNoaWxk cmVuKSB7CisgICAgICAgIGlmIChjaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgeworICAg ICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW25hbWVdOworICAgICAgICAgIHZhciBzZWxmRGVi dWdJRCA9IDA7CisgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVj dGlvbicpIHsKKyAgICAgICAgICAgIHNlbGZEZWJ1Z0lEID0gZ2V0RGVidWdJRCh0aGlzKTsKKyAg ICAgICAgICB9CisgICAgICAgICAgdmFyIG1vdW50SW1hZ2UgPSBSZWFjdFJlY29uY2lsZXIubW91 bnRDb21wb25lbnQoY2hpbGQsIHRyYW5zYWN0aW9uLCB0aGlzLCB0aGlzLl9ob3N0Q29udGFpbmVy SW5mbywgY29udGV4dCwgc2VsZkRlYnVnSUQpOworICAgICAgICAgIGNoaWxkLl9tb3VudEluZGV4 ID0gaW5kZXgrKzsKKyAgICAgICAgICBtb3VudEltYWdlcy5wdXNoKG1vdW50SW1hZ2UpOworICAg ICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3By b2R1Y3Rpb24nKSB7CisgICAgICAgIHNldENoaWxkcmVuRm9ySW5zdHJ1bWVudGF0aW9uLmNhbGwo dGhpcywgY2hpbGRyZW4pOworICAgICAgfQorCisgICAgICByZXR1cm4gbW91bnRJbWFnZXM7Cisg ICAgfSwKKworICAgIC8qKgorICAgICAqIFJlcGxhY2VzIGFueSByZW5kZXJlZCBjaGlsZHJlbiB3 aXRoIGEgdGV4dCBjb250ZW50IHN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB7c3RyaW5n fSBuZXh0Q29udGVudCBTdHJpbmcgb2YgY29udGVudC4KKyAgICAgKiBAaW50ZXJuYWwKKyAgICAg Ki8KKyAgICB1cGRhdGVUZXh0Q29udGVudDogZnVuY3Rpb24gKG5leHRDb250ZW50KSB7CisgICAg ICB2YXIgcHJldkNoaWxkcmVuID0gdGhpcy5fcmVuZGVyZWRDaGlsZHJlbjsKKyAgICAgIC8vIFJl bW92ZSBhbnkgcmVuZGVyZWQgY2hpbGRyZW4uCisgICAgICBSZWFjdENoaWxkUmVjb25jaWxlci51 bm1vdW50Q2hpbGRyZW4ocHJldkNoaWxkcmVuLCBmYWxzZSk7CisgICAgICBmb3IgKHZhciBuYW1l IGluIHByZXZDaGlsZHJlbikgeworICAgICAgICBpZiAocHJldkNoaWxkcmVuLmhhc093blByb3Bl cnR5KG5hbWUpKSB7CisgICAgICAgICAgIWZhbHNlID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09 ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3VwZGF0ZVRleHRDb250ZW50IGNhbGxl ZCBvbiBub24tZW1wdHkgY29tcG9uZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzExOCcpIDogdm9p ZCAwOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBTZXQgbmV3IHRleHQgY29udGVudC4K KyAgICAgIHZhciB1cGRhdGVzID0gW21ha2VUZXh0Q29udGVudChuZXh0Q29udGVudCldOworICAg ICAgcHJvY2Vzc1F1ZXVlKHRoaXMsIHVwZGF0ZXMpOworICAgIH0sCisKKyAgICAvKioKKyAgICAg KiBSZXBsYWNlcyBhbnkgcmVuZGVyZWQgY2hpbGRyZW4gd2l0aCBhIG1hcmt1cCBzdHJpbmcuCisg ICAgICoKKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmV4dE1hcmt1cCBTdHJpbmcgb2YgbWFya3Vw LgorICAgICAqIEBpbnRlcm5hbAorICAgICAqLworICAgIHVwZGF0ZU1hcmt1cDogZnVuY3Rpb24g KG5leHRNYXJrdXApIHsKKyAgICAgIHZhciBwcmV2Q2hpbGRyZW4gPSB0aGlzLl9yZW5kZXJlZENo aWxkcmVuOworICAgICAgLy8gUmVtb3ZlIGFueSByZW5kZXJlZCBjaGlsZHJlbi4KKyAgICAgIFJl YWN0Q2hpbGRSZWNvbmNpbGVyLnVubW91bnRDaGlsZHJlbihwcmV2Q2hpbGRyZW4sIGZhbHNlKTsK KyAgICAgIGZvciAodmFyIG5hbWUgaW4gcHJldkNoaWxkcmVuKSB7CisgICAgICAgIGlmIChwcmV2 Q2hpbGRyZW4uaGFzT3duUHJvcGVydHkobmFtZSkpIHsKKyAgICAgICAgICAhZmFsc2UgPyBwcm9j ZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAndXBk YXRlVGV4dENvbnRlbnQgY2FsbGVkIG9uIG5vbi1lbXB0eSBjb21wb25lbnQuJykgOiBfcHJvZElu dmFyaWFudCgnMTE4JykgOiB2b2lkIDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHZhciB1 cGRhdGVzID0gW21ha2VTZXRNYXJrdXAobmV4dE1hcmt1cCldOworICAgICAgcHJvY2Vzc1F1ZXVl KHRoaXMsIHVwZGF0ZXMpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHRoZSBy ZW5kZXJlZCBjaGlsZHJlbiB3aXRoIG5ldyBjaGlsZHJlbi4KKyAgICAgKgorICAgICAqIEBwYXJh bSB7P29iamVjdH0gbmV4dE5lc3RlZENoaWxkcmVuRWxlbWVudHMgTmVzdGVkIGNoaWxkIGVsZW1l bnQgbWFwcy4KKyAgICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5z YWN0aW9uCisgICAgICogQGludGVybmFsCisgICAgICovCisgICAgdXBkYXRlQ2hpbGRyZW46IGZ1 bmN0aW9uIChuZXh0TmVzdGVkQ2hpbGRyZW5FbGVtZW50cywgdHJhbnNhY3Rpb24sIGNvbnRleHQp IHsKKyAgICAgIC8vIEhvb2sgdXNlZCBieSBSZWFjdCBBUlQKKyAgICAgIHRoaXMuX3VwZGF0ZUNo aWxkcmVuKG5leHROZXN0ZWRDaGlsZHJlbkVsZW1lbnRzLCB0cmFuc2FjdGlvbiwgY29udGV4dCk7 CisgICAgfSwKKworICAgIC8qKgorICAgICAqIEBwYXJhbSB7P29iamVjdH0gbmV4dE5lc3RlZENo aWxkcmVuRWxlbWVudHMgTmVzdGVkIGNoaWxkIGVsZW1lbnQgbWFwcy4KKyAgICAgKiBAcGFyYW0g e1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uCisgICAgICogQGZpbmFsCisg ICAgICogQHByb3RlY3RlZAorICAgICAqLworICAgIF91cGRhdGVDaGlsZHJlbjogZnVuY3Rpb24g KG5leHROZXN0ZWRDaGlsZHJlbkVsZW1lbnRzLCB0cmFuc2FjdGlvbiwgY29udGV4dCkgeworICAg ICAgdmFyIHByZXZDaGlsZHJlbiA9IHRoaXMuX3JlbmRlcmVkQ2hpbGRyZW47CisgICAgICB2YXIg cmVtb3ZlZE5vZGVzID0ge307CisgICAgICB2YXIgbW91bnRJbWFnZXMgPSBbXTsKKyAgICAgIHZh ciBuZXh0Q2hpbGRyZW4gPSB0aGlzLl9yZWNvbmNpbGVyVXBkYXRlQ2hpbGRyZW4ocHJldkNoaWxk cmVuLCBuZXh0TmVzdGVkQ2hpbGRyZW5FbGVtZW50cywgbW91bnRJbWFnZXMsIHJlbW92ZWROb2Rl cywgdHJhbnNhY3Rpb24sIGNvbnRleHQpOworICAgICAgaWYgKCFuZXh0Q2hpbGRyZW4gJiYgIXBy ZXZDaGlsZHJlbikgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICB2YXIgdXBkYXRl cyA9IG51bGw7CisgICAgICB2YXIgbmFtZTsKKyAgICAgIC8vIGBuZXh0SW5kZXhgIHdpbGwgaW5j cmVtZW50IGZvciBlYWNoIGNoaWxkIGluIGBuZXh0Q2hpbGRyZW5gLCBidXQKKyAgICAgIC8vIGBs YXN0SW5kZXhgIHdpbGwgYmUgdGhlIGxhc3QgaW5kZXggdmlzaXRlZCBpbiBgcHJldkNoaWxkcmVu YC4KKyAgICAgIHZhciBuZXh0SW5kZXggPSAwOworICAgICAgdmFyIGxhc3RJbmRleCA9IDA7Cisg ICAgICAvLyBgbmV4dE1vdW50SW5kZXhgIHdpbGwgaW5jcmVtZW50IGZvciBlYWNoIG5ld2x5IG1v dW50ZWQgY2hpbGQuCisgICAgICB2YXIgbmV4dE1vdW50SW5kZXggPSAwOworICAgICAgdmFyIGxh c3RQbGFjZWROb2RlID0gbnVsbDsKKyAgICAgIGZvciAobmFtZSBpbiBuZXh0Q2hpbGRyZW4pIHsK KyAgICAgICAgaWYgKCFuZXh0Q2hpbGRyZW4uaGFzT3duUHJvcGVydHkobmFtZSkpIHsKKyAgICAg ICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB2YXIgcHJldkNoaWxkID0gcHJldkNo aWxkcmVuICYmIHByZXZDaGlsZHJlbltuYW1lXTsKKyAgICAgICAgdmFyIG5leHRDaGlsZCA9IG5l eHRDaGlsZHJlbltuYW1lXTsKKyAgICAgICAgaWYgKHByZXZDaGlsZCA9PT0gbmV4dENoaWxkKSB7 CisgICAgICAgICAgdXBkYXRlcyA9IGVucXVldWUodXBkYXRlcywgdGhpcy5tb3ZlQ2hpbGQocHJl dkNoaWxkLCBsYXN0UGxhY2VkTm9kZSwgbmV4dEluZGV4LCBsYXN0SW5kZXgpKTsKKyAgICAgICAg ICBsYXN0SW5kZXggPSBNYXRoLm1heChwcmV2Q2hpbGQuX21vdW50SW5kZXgsIGxhc3RJbmRleCk7 CisgICAgICAgICAgcHJldkNoaWxkLl9tb3VudEluZGV4ID0gbmV4dEluZGV4OworICAgICAgICB9 IGVsc2UgeworICAgICAgICAgIGlmIChwcmV2Q2hpbGQpIHsKKyAgICAgICAgICAgIC8vIFVwZGF0 ZSBgbGFzdEluZGV4YCBiZWZvcmUgYF9tb3VudEluZGV4YCBnZXRzIHVuc2V0IGJ5IHVubW91bnRp bmcuCisgICAgICAgICAgICBsYXN0SW5kZXggPSBNYXRoLm1heChwcmV2Q2hpbGQuX21vdW50SW5k ZXgsIGxhc3RJbmRleCk7CisgICAgICAgICAgICAvLyBUaGUgYHJlbW92ZWROb2Rlc2AgbG9vcCBi ZWxvdyB3aWxsIGFjdHVhbGx5IHJlbW92ZSB0aGUgY2hpbGQuCisgICAgICAgICAgfQorICAgICAg ICAgIC8vIFRoZSBjaGlsZCBtdXN0IGJlIGluc3RhbnRpYXRlZCBiZWZvcmUgaXQncyBtb3VudGVk LgorICAgICAgICAgIHVwZGF0ZXMgPSBlbnF1ZXVlKHVwZGF0ZXMsIHRoaXMuX21vdW50Q2hpbGRB dEluZGV4KG5leHRDaGlsZCwgbW91bnRJbWFnZXNbbmV4dE1vdW50SW5kZXhdLCBsYXN0UGxhY2Vk Tm9kZSwgbmV4dEluZGV4LCB0cmFuc2FjdGlvbiwgY29udGV4dCkpOworICAgICAgICAgIG5leHRN b3VudEluZGV4Kys7CisgICAgICAgIH0KKyAgICAgICAgbmV4dEluZGV4Kys7CisgICAgICAgIGxh c3RQbGFjZWROb2RlID0gUmVhY3RSZWNvbmNpbGVyLmdldEhvc3ROb2RlKG5leHRDaGlsZCk7Cisg ICAgICB9CisgICAgICAvLyBSZW1vdmUgY2hpbGRyZW4gdGhhdCBhcmUgbm8gbG9uZ2VyIHByZXNl bnQuCisgICAgICBmb3IgKG5hbWUgaW4gcmVtb3ZlZE5vZGVzKSB7CisgICAgICAgIGlmIChyZW1v dmVkTm9kZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKKyAgICAgICAgICB1cGRhdGVzID0gZW5x dWV1ZSh1cGRhdGVzLCB0aGlzLl91bm1vdW50Q2hpbGQocHJldkNoaWxkcmVuW25hbWVdLCByZW1v dmVkTm9kZXNbbmFtZV0pKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHVwZGF0ZXMp IHsKKyAgICAgICAgcHJvY2Vzc1F1ZXVlKHRoaXMsIHVwZGF0ZXMpOworICAgICAgfQorICAgICAg dGhpcy5fcmVuZGVyZWRDaGlsZHJlbiA9IG5leHRDaGlsZHJlbjsKKworICAgICAgaWYgKHByb2Nl c3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICAgc2V0Q2hpbGRyZW5G b3JJbnN0cnVtZW50YXRpb24uY2FsbCh0aGlzLCBuZXh0Q2hpbGRyZW4pOworICAgICAgfQorICAg IH0sCisKKyAgICAvKioKKyAgICAgKiBVbm1vdW50cyBhbGwgcmVuZGVyZWQgY2hpbGRyZW4uIFRo aXMgc2hvdWxkIGJlIHVzZWQgdG8gY2xlYW4gdXAgY2hpbGRyZW4KKyAgICAgKiB3aGVuIHRoaXMg Y29tcG9uZW50IGlzIHVubW91bnRlZC4gSXQgZG9lcyBub3QgYWN0dWFsbHkgcGVyZm9ybSBhbnkK KyAgICAgKiBiYWNrZW5kIG9wZXJhdGlvbnMuCisgICAgICoKKyAgICAgKiBAaW50ZXJuYWwKKyAg ICAgKi8KKyAgICB1bm1vdW50Q2hpbGRyZW46IGZ1bmN0aW9uIChzYWZlbHkpIHsKKyAgICAgIHZh ciByZW5kZXJlZENoaWxkcmVuID0gdGhpcy5fcmVuZGVyZWRDaGlsZHJlbjsKKyAgICAgIFJlYWN0 Q2hpbGRSZWNvbmNpbGVyLnVubW91bnRDaGlsZHJlbihyZW5kZXJlZENoaWxkcmVuLCBzYWZlbHkp OworICAgICAgdGhpcy5fcmVuZGVyZWRDaGlsZHJlbiA9IG51bGw7CisgICAgfSwKKworICAgIC8q KgorICAgICAqIE1vdmVzIGEgY2hpbGQgY29tcG9uZW50IHRvIHRoZSBzdXBwbGllZCBpbmRleC4K KyAgICAgKgorICAgICAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGNoaWxkIENvbXBvbmVudCB0 byBtb3ZlLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0b0luZGV4IERlc3RpbmF0aW9uIGluZGV4 IG9mIHRoZSBlbGVtZW50LgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsYXN0SW5kZXggTGFzdCBp bmRleCB2aXNpdGVkIG9mIHRoZSBzaWJsaW5ncyBvZiBgY2hpbGRgLgorICAgICAqIEBwcm90ZWN0 ZWQKKyAgICAgKi8KKyAgICBtb3ZlQ2hpbGQ6IGZ1bmN0aW9uIChjaGlsZCwgYWZ0ZXJOb2RlLCB0 b0luZGV4LCBsYXN0SW5kZXgpIHsKKyAgICAgIC8vIElmIHRoZSBpbmRleCBvZiBgY2hpbGRgIGlz IGxlc3MgdGhhbiBgbGFzdEluZGV4YCwgdGhlbiBpdCBuZWVkcyB0bworICAgICAgLy8gYmUgbW92 ZWQuIE90aGVyd2lzZSwgd2UgZG8gbm90IG5lZWQgdG8gbW92ZSBpdCBiZWNhdXNlIGEgY2hpbGQg d2lsbCBiZQorICAgICAgLy8gaW5zZXJ0ZWQgb3IgbW92ZWQgYmVmb3JlIGBjaGlsZGAuCisgICAg ICBpZiAoY2hpbGQuX21vdW50SW5kZXggPCBsYXN0SW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIG1h a2VNb3ZlKGNoaWxkLCBhZnRlck5vZGUsIHRvSW5kZXgpOworICAgICAgfQorICAgIH0sCisKKyAg ICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY2hpbGQgY29tcG9uZW50LgorICAgICAqCisgICAgICog QHBhcmFtIHtSZWFjdENvbXBvbmVudH0gY2hpbGQgQ29tcG9uZW50IHRvIGNyZWF0ZS4KKyAgICAg KiBAcGFyYW0ge3N0cmluZ30gbW91bnRJbWFnZSBNYXJrdXAgdG8gaW5zZXJ0LgorICAgICAqIEBw cm90ZWN0ZWQKKyAgICAgKi8KKyAgICBjcmVhdGVDaGlsZDogZnVuY3Rpb24gKGNoaWxkLCBhZnRl ck5vZGUsIG1vdW50SW1hZ2UpIHsKKyAgICAgIHJldHVybiBtYWtlSW5zZXJ0TWFya3VwKG1vdW50 SW1hZ2UsIGFmdGVyTm9kZSwgY2hpbGQuX21vdW50SW5kZXgpOworICAgIH0sCisKKyAgICAvKioK KyAgICAgKiBSZW1vdmVzIGEgY2hpbGQgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFt IHtSZWFjdENvbXBvbmVudH0gY2hpbGQgQ2hpbGQgdG8gcmVtb3ZlLgorICAgICAqIEBwcm90ZWN0 ZWQKKyAgICAgKi8KKyAgICByZW1vdmVDaGlsZDogZnVuY3Rpb24gKGNoaWxkLCBub2RlKSB7Cisg ICAgICByZXR1cm4gbWFrZVJlbW92ZShjaGlsZCwgbm9kZSk7CisgICAgfSwKKworICAgIC8qKgor ICAgICAqIE1vdW50cyBhIGNoaWxkIHdpdGggdGhlIHN1cHBsaWVkIG5hbWUuCisgICAgICoKKyAg ICAgKiBOT1RFOiBUaGlzIGlzIHBhcnQgb2YgYHVwZGF0ZUNoaWxkcmVuYCBhbmQgaXMgaGVyZSBm b3IgcmVhZGFiaWxpdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBj aGlsZCBDb21wb25lbnQgdG8gbW91bnQuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFt ZSBvZiB0aGUgY2hpbGQuCisgICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IEluZGV4IGF0IHdo aWNoIHRvIGluc2VydCB0aGUgY2hpbGQuCisgICAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRy YW5zYWN0aW9ufSB0cmFuc2FjdGlvbgorICAgICAqIEBwcml2YXRlCisgICAgICovCisgICAgX21v dW50Q2hpbGRBdEluZGV4OiBmdW5jdGlvbiAoY2hpbGQsIG1vdW50SW1hZ2UsIGFmdGVyTm9kZSwg aW5kZXgsIHRyYW5zYWN0aW9uLCBjb250ZXh0KSB7CisgICAgICBjaGlsZC5fbW91bnRJbmRleCA9 IGluZGV4OworICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQ2hpbGQoY2hpbGQsIGFmdGVyTm9kZSwg bW91bnRJbWFnZSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFVubW91bnRzIGEgcmVuZGVy ZWQgY2hpbGQuCisgICAgICoKKyAgICAgKiBOT1RFOiBUaGlzIGlzIHBhcnQgb2YgYHVwZGF0ZUNo aWxkcmVuYCBhbmQgaXMgaGVyZSBmb3IgcmVhZGFiaWxpdHkuCisgICAgICoKKyAgICAgKiBAcGFy YW0ge1JlYWN0Q29tcG9uZW50fSBjaGlsZCBDb21wb25lbnQgdG8gdW5tb3VudC4KKyAgICAgKiBA cHJpdmF0ZQorICAgICAqLworICAgIF91bm1vdW50Q2hpbGQ6IGZ1bmN0aW9uIChjaGlsZCwgbm9k ZSkgeworICAgICAgdmFyIHVwZGF0ZSA9IHRoaXMucmVtb3ZlQ2hpbGQoY2hpbGQsIG5vZGUpOwor ICAgICAgY2hpbGQuX21vdW50SW5kZXggPSBudWxsOworICAgICAgcmV0dXJuIHVwZGF0ZTsKKyAg ICB9CisKKyAgfQorCit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0TXVsdGlDaGlsZDsKXCBO byBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMv dmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RNdWx0aUNoaWxkVXBkYXRlVHlwZXMuanMgYi93ZWIv cGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RNdWx0aUNoaWxkVXBkYXRl VHlwZXMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjA3YzIzNTMyCi0t LSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGli L1JlYWN0TXVsdGlDaGlsZFVwZGF0ZVR5cGVzLmpzCkBAIC0wLDAgKzEsMTggQEAKKy8qKgorICog Q29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVz ZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNE LXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qg ZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9m IHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNh bWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKKy8qKgorICogV2hlbiBh IGNvbXBvbmVudCdzIGNoaWxkcmVuIGFyZSB1cGRhdGVkLCBhIHNlcmllcyBvZiB1cGRhdGUgY29u ZmlndXJhdGlvbgorICogb2JqZWN0cyBhcmUgY3JlYXRlZCBpbiBvcmRlciB0byBiYXRjaCBhbmQg c2VyaWFsaXplIHRoZSByZXF1aXJlZCBjaGFuZ2VzLgorICoKKyAqIEVudW1lcmF0ZXMgYWxsIHRo ZSBwb3NzaWJsZSB0eXBlcyBvZiB1cGRhdGUgY29uZmlndXJhdGlvbnMuCisgKi8KXCBObyBuZXds aW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9y L3JlYWN0LWRvbS9saWIvUmVhY3ROb2RlVHlwZXMuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVu ZG9yL3JlYWN0LWRvbS9saWIvUmVhY3ROb2RlVHlwZXMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMDAuLjE4YWE3NTAxCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4v c3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0Tm9kZVR5cGVzLmpzCkBAIC0wLDAgKzEs MzkgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAq IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNl ZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZp bGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9u YWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRT IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0 JzsKKwordmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQn KTsKKwordmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Jyk7CisKK3ZhciBpbnZh cmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTsKKwordmFyIFJlYWN0Tm9kZVR5 cGVzID0geworICBIT1NUOiAwLAorICBDT01QT1NJVEU6IDEsCisgIEVNUFRZOiAyLAorCisgIGdl dFR5cGU6IGZ1bmN0aW9uIChub2RlKSB7CisgICAgaWYgKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9 PT0gZmFsc2UpIHsKKyAgICAgIHJldHVybiBSZWFjdE5vZGVUeXBlcy5FTVBUWTsKKyAgICB9IGVs c2UgaWYgKFJlYWN0LmlzVmFsaWRFbGVtZW50KG5vZGUpKSB7CisgICAgICBpZiAodHlwZW9mIG5v ZGUudHlwZSA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgICByZXR1cm4gUmVhY3ROb2RlVHlwZXMu Q09NUE9TSVRFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFJlYWN0Tm9kZVR5cGVz LkhPU1Q7CisgICAgICB9CisgICAgfQorICAgICFmYWxzZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5W ICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdVbmV4cGVjdGVkIG5vZGU6ICVz Jywgbm9kZSkgOiBfcHJvZEludmFyaWFudCgnMjYnLCBub2RlKSA6IHZvaWQgMDsKKyAgfQorfTsK KworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdE5vZGVUeXBlczsKXCBObyBuZXdsaW5lIGF0IGVuZCBv ZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9s aWIvUmVhY3RPd25lci5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xp Yi9SZWFjdE93bmVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi42YTZm YmI5MgotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3Qt ZG9tL2xpYi9SZWFjdE93bmVyLmpzCkBAIC0wLDAgKzEsOTMgQEAKKy8qKgorICogQ29weXJpZ2h0 IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg KgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxp Y2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5 IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCBy aWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0 b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9wcm9kSW52YXJpYW50 ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTsKKwordmFyIGludmFyaWFudCA9IHJl cXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpOworCisvKioKKyAqIEBwYXJhbSB7P29iamVjdH0g b2JqZWN0CisgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBvYmplY3RgIGlzIGEgdmFsaWQg b3duZXIuCisgKiBAZmluYWwKKyAqLworZnVuY3Rpb24gaXNWYWxpZE93bmVyKG9iamVjdCkgewor ICByZXR1cm4gISEob2JqZWN0ICYmIHR5cGVvZiBvYmplY3QuYXR0YWNoUmVmID09PSAnZnVuY3Rp b24nICYmIHR5cGVvZiBvYmplY3QuZGV0YWNoUmVmID09PSAnZnVuY3Rpb24nKTsKK30KKworLyoq CisgKiBSZWFjdE93bmVycyBhcmUgY2FwYWJsZSBvZiBzdG9yaW5nIHJlZmVyZW5jZXMgdG8gb3du ZWQgY29tcG9uZW50cy4KKyAqCisgKiBBbGwgY29tcG9uZW50cyBhcmUgY2FwYWJsZSBvZiAvL2Jl aW5nLy8gcmVmZXJlbmNlZCBieSBvd25lciBjb21wb25lbnRzLCBidXQKKyAqIG9ubHkgUmVhY3RP d25lciBjb21wb25lbnRzIGFyZSBjYXBhYmxlIG9mIC8vcmVmZXJlbmNpbmcvLyBvd25lZCBjb21w b25lbnRzLgorICogVGhlIG5hbWVkIHJlZmVyZW5jZSBpcyBrbm93biBhcyBhICJyZWYiLgorICoK KyAqIFJlZnMgYXJlIGF2YWlsYWJsZSB3aGVuIG1vdW50ZWQgYW5kIHVwZGF0ZWQgZHVyaW5nIHJl Y29uY2lsaWF0aW9uLgorICoKKyAqICAgdmFyIE15Q29tcG9uZW50ID0gUmVhY3QuY3JlYXRlQ2xh c3MoeworICogICAgIHJlbmRlcjogZnVuY3Rpb24oKSB7CisgKiAgICAgICByZXR1cm4gKAorICog ICAgICAgICA8ZGl2IG9uQ2xpY2s9e3RoaXMuaGFuZGxlQ2xpY2t9PgorICogICAgICAgICAgIDxD dXN0b21Db21wb25lbnQgcmVmPSJjdXN0b20iIC8+CisgKiAgICAgICAgIDwvZGl2PgorICogICAg ICAgKTsKKyAqICAgICB9LAorICogICAgIGhhbmRsZUNsaWNrOiBmdW5jdGlvbigpIHsKKyAqICAg ICAgIHRoaXMucmVmcy5jdXN0b20uaGFuZGxlQ2xpY2soKTsKKyAqICAgICB9LAorICogICAgIGNv bXBvbmVudERpZE1vdW50OiBmdW5jdGlvbigpIHsKKyAqICAgICAgIHRoaXMucmVmcy5jdXN0b20u aW5pdGlhbGl6ZSgpOworICogICAgIH0KKyAqICAgfSk7CisgKgorICogUmVmcyBzaG91bGQgcmFy ZWx5IGJlIHVzZWQuIFdoZW4gcmVmcyBhcmUgdXNlZCwgdGhleSBzaG91bGQgb25seSBiZSBkb25l IHRvCisgKiBjb250cm9sIGRhdGEgdGhhdCBpcyBub3QgaGFuZGxlZCBieSBSZWFjdCdzIGRhdGEg Zmxvdy4KKyAqCisgKiBAY2xhc3MgUmVhY3RPd25lcgorICovCit2YXIgUmVhY3RPd25lciA9IHsK KyAgLyoqCisgICAqIEFkZHMgYSBjb21wb25lbnQgYnkgcmVmIHRvIGFuIG93bmVyIGNvbXBvbmVu dC4KKyAgICoKKyAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gY29tcG9uZW50IENvbXBvbmVu dCB0byByZWZlcmVuY2UuCisgICAqIEBwYXJhbSB7c3RyaW5nfSByZWYgTmFtZSBieSB3aGljaCB0 byByZWZlciB0byB0aGUgY29tcG9uZW50LgorICAgKiBAcGFyYW0ge1JlYWN0T3duZXJ9IG93bmVy IENvbXBvbmVudCBvbiB3aGljaCB0byByZWNvcmQgdGhlIHJlZi4KKyAgICogQGZpbmFsCisgICAq IEBpbnRlcm5hbAorICAgKi8KKyAgYWRkQ29tcG9uZW50QXNSZWZUbzogZnVuY3Rpb24gKGNvbXBv bmVudCwgcmVmLCBvd25lcikgeworICAgICFpc1ZhbGlkT3duZXIob3duZXIpID8gcHJvY2Vzcy5l bnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2FkZENvbXBv bmVudEFzUmVmVG8oLi4uKTogT25seSBhIFJlYWN0T3duZXIgY2FuIGhhdmUgcmVmcy4gWW91IG1p Z2h0IGJlIGFkZGluZyBhIHJlZiB0byBhIGNvbXBvbmVudCB0aGF0IHdhcyBub3QgY3JlYXRlZCBp bnNpZGUgYSBjb21wb25lbnRcJ3MgYHJlbmRlcmAgbWV0aG9kLCBvciB5b3UgaGF2ZSBtdWx0aXBs ZSBjb3BpZXMgb2YgUmVhY3QgbG9hZGVkIChkZXRhaWxzOiBodHRwczovL2ZiLm1lL3JlYWN0LXJl ZnMtbXVzdC1oYXZlLW93bmVyKS4nKSA6IF9wcm9kSW52YXJpYW50KCcxMTknKSA6IHZvaWQgMDsK KyAgICBvd25lci5hdHRhY2hSZWYocmVmLCBjb21wb25lbnQpOworICB9LAorCisgIC8qKgorICAg KiBSZW1vdmVzIGEgY29tcG9uZW50IGJ5IHJlZiBmcm9tIGFuIG93bmVyIGNvbXBvbmVudC4KKyAg ICoKKyAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gY29tcG9uZW50IENvbXBvbmVudCB0byBk ZXJlZmVyZW5jZS4KKyAgICogQHBhcmFtIHtzdHJpbmd9IHJlZiBOYW1lIG9mIHRoZSByZWYgdG8g cmVtb3ZlLgorICAgKiBAcGFyYW0ge1JlYWN0T3duZXJ9IG93bmVyIENvbXBvbmVudCBvbiB3aGlj aCB0aGUgcmVmIGlzIHJlY29yZGVkLgorICAgKiBAZmluYWwKKyAgICogQGludGVybmFsCisgICAq LworICByZW1vdmVDb21wb25lbnRBc1JlZkZyb206IGZ1bmN0aW9uIChjb21wb25lbnQsIHJlZiwg b3duZXIpIHsKKyAgICAhaXNWYWxpZE93bmVyKG93bmVyKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5W ICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdyZW1vdmVDb21wb25lbnRBc1Jl ZkZyb20oLi4uKTogT25seSBhIFJlYWN0T3duZXIgY2FuIGhhdmUgcmVmcy4gWW91IG1pZ2h0IGJl IHJlbW92aW5nIGEgcmVmIHRvIGEgY29tcG9uZW50IHRoYXQgd2FzIG5vdCBjcmVhdGVkIGluc2lk ZSBhIGNvbXBvbmVudFwncyBgcmVuZGVyYCBtZXRob2QsIG9yIHlvdSBoYXZlIG11bHRpcGxlIGNv cGllcyBvZiBSZWFjdCBsb2FkZWQgKGRldGFpbHM6IGh0dHBzOi8vZmIubWUvcmVhY3QtcmVmcy1t dXN0LWhhdmUtb3duZXIpLicpIDogX3Byb2RJbnZhcmlhbnQoJzEyMCcpIDogdm9pZCAwOworICAg IHZhciBvd25lclB1YmxpY0luc3RhbmNlID0gb3duZXIuZ2V0UHVibGljSW5zdGFuY2UoKTsKKyAg ICAvLyBDaGVjayB0aGF0IGBjb21wb25lbnRgJ3Mgb3duZXIgaXMgc3RpbGwgYWxpdmUgYW5kIHRo YXQgYGNvbXBvbmVudGAgaXMgc3RpbGwgdGhlIGN1cnJlbnQgcmVmCisgICAgLy8gYmVjYXVzZSB3 ZSBkbyBub3Qgd2FudCB0byBkZXRhY2ggdGhlIHJlZiBpZiBhbm90aGVyIGNvbXBvbmVudCBzdG9s ZSBpdC4KKyAgICBpZiAob3duZXJQdWJsaWNJbnN0YW5jZSAmJiBvd25lclB1YmxpY0luc3RhbmNl LnJlZnNbcmVmXSA9PT0gY29tcG9uZW50LmdldFB1YmxpY0luc3RhbmNlKCkpIHsKKyAgICAgIG93 bmVyLmRldGFjaFJlZihyZWYpOworICAgIH0KKyAgfQorCit9OworCittb2R1bGUuZXhwb3J0cyA9 IFJlYWN0T3duZXI7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2Vi L3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0UGVyZi5qcyBiL3dlYi9w Z2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdFBlcmYuanMKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLmE3ZTEyMDFiCi0tLSAvZGV2L251bGwKKysrIGIv d2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0UGVyZi5qcwpAQCAt MCwwICsxLDUwMCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxNi1wcmVzZW50LCBGYWNlYm9vaywg SW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlz IGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJ Q0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4g YWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhl IFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogCisgKi8KKworJ3Vz ZSBzdHJpY3QnOworCit2YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTsKKwor dmFyIF9leHRlbmRzID0gX2Fzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkg PSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNb aV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3du UHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsg fSB9IH0gcmV0dXJuIHRhcmdldDsgfTsKKwordmFyIFJlYWN0RGVidWdUb29sID0gcmVxdWlyZSgn Li9SZWFjdERlYnVnVG9vbCcpOwordmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJu aW5nJyk7Cit2YXIgYWxyZWFkeVdhcm5lZCA9IGZhbHNlOworCitmdW5jdGlvbiByb3VuZEZsb2F0 KHZhbCkgeworICB2YXIgYmFzZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sx XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMjsKKworICB2YXIgbiA9IE1hdGgucG93 KDEwLCBiYXNlKTsKKyAgcmV0dXJuIE1hdGguZmxvb3IodmFsICogbikgLyBuOworfQorCisvLyBG bG93IHR5cGUgZGVmaW5pdGlvbiBvZiBjb25zb2xlLnRhYmxlIGlzIHRvbyBzdHJpY3QgcmlnaHQg bm93LCBzZWUKKy8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L3B1bGwvMjM1MyBm b3IgdXBkYXRlcworZnVuY3Rpb24gY29uc29sZVRhYmxlKHRhYmxlKSB7CisgIGNvbnNvbGUudGFi bGUodGFibGUpOworfQorCitmdW5jdGlvbiB3YXJuSW5Qcm9kdWN0aW9uKCkgeworICBpZiAoYWxy ZWFkeVdhcm5lZCkgeworICAgIHJldHVybjsKKyAgfQorICBhbHJlYWR5V2FybmVkID0gdHJ1ZTsK KyAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykgeworICAgIGNvbnNvbGUuZXJy b3IoJ1JlYWN0UGVyZiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBwcm9kdWN0aW9uIGJ1aWxkcyBv ZiBSZWFjdC4gJyArICdUbyBjb2xsZWN0IG1lYXN1cmVtZW50cywgcGxlYXNlIHVzZSB0aGUgZGV2 ZWxvcG1lbnQgYnVpbGQgb2YgUmVhY3QgaW5zdGVhZC4nKTsKKyAgfQorfQorCitmdW5jdGlvbiBn ZXRMYXN0TWVhc3VyZW1lbnRzKCkgeworICBpZiAoIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0g J3Byb2R1Y3Rpb24nKSkgeworICAgIHdhcm5JblByb2R1Y3Rpb24oKTsKKyAgICByZXR1cm4gW107 CisgIH0KKworICByZXR1cm4gUmVhY3REZWJ1Z1Rvb2wuZ2V0Rmx1c2hIaXN0b3J5KCk7Cit9CisK K2Z1bmN0aW9uIGdldEV4Y2x1c2l2ZSgpIHsKKyAgdmFyIGZsdXNoSGlzdG9yeSA9IGFyZ3VtZW50 cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBd IDogZ2V0TGFzdE1lYXN1cmVtZW50cygpOworCisgIGlmICghKHByb2Nlc3MuZW52Lk5PREVfRU5W ICE9PSAncHJvZHVjdGlvbicpKSB7CisgICAgd2FybkluUHJvZHVjdGlvbigpOworICAgIHJldHVy biBbXTsKKyAgfQorCisgIHZhciBhZ2dyZWdhdGVkU3RhdHMgPSB7fTsKKyAgdmFyIGFmZmVjdGVk SURzID0ge307CisKKyAgZnVuY3Rpb24gdXBkYXRlQWdncmVnYXRlZFN0YXRzKHRyZWVTbmFwc2hv dCwgaW5zdGFuY2VJRCwgdGltZXJUeXBlLCBhcHBseVVwZGF0ZSkgeworICAgIHZhciBkaXNwbGF5 TmFtZSA9IHRyZWVTbmFwc2hvdFtpbnN0YW5jZUlEXS5kaXNwbGF5TmFtZTsKKworICAgIHZhciBr ZXkgPSBkaXNwbGF5TmFtZTsKKyAgICB2YXIgc3RhdHMgPSBhZ2dyZWdhdGVkU3RhdHNba2V5XTsK KyAgICBpZiAoIXN0YXRzKSB7CisgICAgICBhZmZlY3RlZElEc1trZXldID0ge307CisgICAgICBz dGF0cyA9IGFnZ3JlZ2F0ZWRTdGF0c1trZXldID0geworICAgICAgICBrZXk6IGtleSwKKyAgICAg ICAgaW5zdGFuY2VDb3VudDogMCwKKyAgICAgICAgY291bnRzOiB7fSwKKyAgICAgICAgZHVyYXRp b25zOiB7fSwKKyAgICAgICAgdG90YWxEdXJhdGlvbjogMAorICAgICAgfTsKKyAgICB9CisgICAg aWYgKCFzdGF0cy5kdXJhdGlvbnNbdGltZXJUeXBlXSkgeworICAgICAgc3RhdHMuZHVyYXRpb25z W3RpbWVyVHlwZV0gPSAwOworICAgIH0KKyAgICBpZiAoIXN0YXRzLmNvdW50c1t0aW1lclR5cGVd KSB7CisgICAgICBzdGF0cy5jb3VudHNbdGltZXJUeXBlXSA9IDA7CisgICAgfQorICAgIGFmZmVj dGVkSURzW2tleV1baW5zdGFuY2VJRF0gPSB0cnVlOworICAgIGFwcGx5VXBkYXRlKHN0YXRzKTsK KyAgfQorCisgIGZsdXNoSGlzdG9yeS5mb3JFYWNoKGZ1bmN0aW9uIChmbHVzaCkgeworICAgIHZh ciBtZWFzdXJlbWVudHMgPSBmbHVzaC5tZWFzdXJlbWVudHMsCisgICAgICAgIHRyZWVTbmFwc2hv dCA9IGZsdXNoLnRyZWVTbmFwc2hvdDsKKworICAgIG1lYXN1cmVtZW50cy5mb3JFYWNoKGZ1bmN0 aW9uIChtZWFzdXJlbWVudCkgeworICAgICAgdmFyIGR1cmF0aW9uID0gbWVhc3VyZW1lbnQuZHVy YXRpb24sCisgICAgICAgICAgaW5zdGFuY2VJRCA9IG1lYXN1cmVtZW50Lmluc3RhbmNlSUQsCisg ICAgICAgICAgdGltZXJUeXBlID0gbWVhc3VyZW1lbnQudGltZXJUeXBlOworCisgICAgICB1cGRh dGVBZ2dyZWdhdGVkU3RhdHModHJlZVNuYXBzaG90LCBpbnN0YW5jZUlELCB0aW1lclR5cGUsIGZ1 bmN0aW9uIChzdGF0cykgeworICAgICAgICBzdGF0cy50b3RhbER1cmF0aW9uICs9IGR1cmF0aW9u OworICAgICAgICBzdGF0cy5kdXJhdGlvbnNbdGltZXJUeXBlXSArPSBkdXJhdGlvbjsKKyAgICAg ICAgc3RhdHMuY291bnRzW3RpbWVyVHlwZV0rKzsKKyAgICAgIH0pOworICAgIH0pOworICB9KTsK KworICByZXR1cm4gT2JqZWN0LmtleXMoYWdncmVnYXRlZFN0YXRzKS5tYXAoZnVuY3Rpb24gKGtl eSkgeworICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgYWdncmVnYXRlZFN0YXRzW2tleV0sIHsKKyAg ICAgIGluc3RhbmNlQ291bnQ6IE9iamVjdC5rZXlzKGFmZmVjdGVkSURzW2tleV0pLmxlbmd0aAor ICAgIH0pOworICB9KS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CisgICAgcmV0dXJuIGIudG90YWxE dXJhdGlvbiAtIGEudG90YWxEdXJhdGlvbjsKKyAgfSk7Cit9CisKK2Z1bmN0aW9uIGdldEluY2x1 c2l2ZSgpIHsKKyAgdmFyIGZsdXNoSGlzdG9yeSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFy Z3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZ2V0TGFzdE1lYXN1cmVt ZW50cygpOworCisgIGlmICghKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicp KSB7CisgICAgd2FybkluUHJvZHVjdGlvbigpOworICAgIHJldHVybiBbXTsKKyAgfQorCisgIHZh ciBhZ2dyZWdhdGVkU3RhdHMgPSB7fTsKKyAgdmFyIGFmZmVjdGVkSURzID0ge307CisKKyAgZnVu Y3Rpb24gdXBkYXRlQWdncmVnYXRlZFN0YXRzKHRyZWVTbmFwc2hvdCwgaW5zdGFuY2VJRCwgYXBw bHlVcGRhdGUpIHsKKyAgICB2YXIgX3RyZWVTbmFwc2hvdCRpbnN0YW5jID0gdHJlZVNuYXBzaG90 W2luc3RhbmNlSURdLAorICAgICAgICBkaXNwbGF5TmFtZSA9IF90cmVlU25hcHNob3QkaW5zdGFu Yy5kaXNwbGF5TmFtZSwKKyAgICAgICAgb3duZXJJRCA9IF90cmVlU25hcHNob3QkaW5zdGFuYy5v d25lcklEOworCisgICAgdmFyIG93bmVyID0gdHJlZVNuYXBzaG90W293bmVySURdOworICAgIHZh ciBrZXkgPSAob3duZXIgPyBvd25lci5kaXNwbGF5TmFtZSArICcgPiAnIDogJycpICsgZGlzcGxh eU5hbWU7CisgICAgdmFyIHN0YXRzID0gYWdncmVnYXRlZFN0YXRzW2tleV07CisgICAgaWYgKCFz dGF0cykgeworICAgICAgYWZmZWN0ZWRJRHNba2V5XSA9IHt9OworICAgICAgc3RhdHMgPSBhZ2dy ZWdhdGVkU3RhdHNba2V5XSA9IHsKKyAgICAgICAga2V5OiBrZXksCisgICAgICAgIGluc3RhbmNl Q291bnQ6IDAsCisgICAgICAgIGluY2x1c2l2ZVJlbmRlckR1cmF0aW9uOiAwLAorICAgICAgICBy ZW5kZXJDb3VudDogMAorICAgICAgfTsKKyAgICB9CisgICAgYWZmZWN0ZWRJRHNba2V5XVtpbnN0 YW5jZUlEXSA9IHRydWU7CisgICAgYXBwbHlVcGRhdGUoc3RhdHMpOworICB9CisKKyAgdmFyIGlz Q29tcG9zaXRlQnlJRCA9IHt9OworICBmbHVzaEhpc3RvcnkuZm9yRWFjaChmdW5jdGlvbiAoZmx1 c2gpIHsKKyAgICB2YXIgbWVhc3VyZW1lbnRzID0gZmx1c2gubWVhc3VyZW1lbnRzOworCisgICAg bWVhc3VyZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG1lYXN1cmVtZW50KSB7CisgICAgICB2YXIg aW5zdGFuY2VJRCA9IG1lYXN1cmVtZW50Lmluc3RhbmNlSUQsCisgICAgICAgICAgdGltZXJUeXBl ID0gbWVhc3VyZW1lbnQudGltZXJUeXBlOworCisgICAgICBpZiAodGltZXJUeXBlICE9PSAncmVu ZGVyJykgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpc0NvbXBvc2l0ZUJ5SURb aW5zdGFuY2VJRF0gPSB0cnVlOworICAgIH0pOworICB9KTsKKworICBmbHVzaEhpc3RvcnkuZm9y RWFjaChmdW5jdGlvbiAoZmx1c2gpIHsKKyAgICB2YXIgbWVhc3VyZW1lbnRzID0gZmx1c2gubWVh c3VyZW1lbnRzLAorICAgICAgICB0cmVlU25hcHNob3QgPSBmbHVzaC50cmVlU25hcHNob3Q7CisK KyAgICBtZWFzdXJlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobWVhc3VyZW1lbnQpIHsKKyAgICAg IHZhciBkdXJhdGlvbiA9IG1lYXN1cmVtZW50LmR1cmF0aW9uLAorICAgICAgICAgIGluc3RhbmNl SUQgPSBtZWFzdXJlbWVudC5pbnN0YW5jZUlELAorICAgICAgICAgIHRpbWVyVHlwZSA9IG1lYXN1 cmVtZW50LnRpbWVyVHlwZTsKKworICAgICAgaWYgKHRpbWVyVHlwZSAhPT0gJ3JlbmRlcicpIHsK KyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgdXBkYXRlQWdncmVnYXRlZFN0YXRzKHRy ZWVTbmFwc2hvdCwgaW5zdGFuY2VJRCwgZnVuY3Rpb24gKHN0YXRzKSB7CisgICAgICAgIHN0YXRz LnJlbmRlckNvdW50Kys7CisgICAgICB9KTsKKyAgICAgIHZhciBuZXh0UGFyZW50SUQgPSBpbnN0 YW5jZUlEOworICAgICAgd2hpbGUgKG5leHRQYXJlbnRJRCkgeworICAgICAgICAvLyBBcyB3ZSB0 cmF2ZXJzZSBwYXJlbnRzLCBvbmx5IGNvdW50IGluY2x1c2l2ZSB0aW1lIHRvd2FyZHMgY29tcG9z aXRlcy4KKyAgICAgICAgLy8gV2Uga25vdyBzb21ldGhpbmcgaXMgYSBjb21wb3NpdGUgaWYgaXRz IHJlbmRlcigpIHdhcyBjYWxsZWQuCisgICAgICAgIGlmIChpc0NvbXBvc2l0ZUJ5SURbbmV4dFBh cmVudElEXSkgeworICAgICAgICAgIHVwZGF0ZUFnZ3JlZ2F0ZWRTdGF0cyh0cmVlU25hcHNob3Qs IG5leHRQYXJlbnRJRCwgZnVuY3Rpb24gKHN0YXRzKSB7CisgICAgICAgICAgICBzdGF0cy5pbmNs dXNpdmVSZW5kZXJEdXJhdGlvbiArPSBkdXJhdGlvbjsKKyAgICAgICAgICB9KTsKKyAgICAgICAg fQorICAgICAgICBuZXh0UGFyZW50SUQgPSB0cmVlU25hcHNob3RbbmV4dFBhcmVudElEXS5wYXJl bnRJRDsKKyAgICAgIH0KKyAgICB9KTsKKyAgfSk7CisKKyAgcmV0dXJuIE9iamVjdC5rZXlzKGFn Z3JlZ2F0ZWRTdGF0cykubWFwKGZ1bmN0aW9uIChrZXkpIHsKKyAgICByZXR1cm4gX2V4dGVuZHMo e30sIGFnZ3JlZ2F0ZWRTdGF0c1trZXldLCB7CisgICAgICBpbnN0YW5jZUNvdW50OiBPYmplY3Qu a2V5cyhhZmZlY3RlZElEc1trZXldKS5sZW5ndGgKKyAgICB9KTsKKyAgfSkuc29ydChmdW5jdGlv biAoYSwgYikgeworICAgIHJldHVybiBiLmluY2x1c2l2ZVJlbmRlckR1cmF0aW9uIC0gYS5pbmNs dXNpdmVSZW5kZXJEdXJhdGlvbjsKKyAgfSk7Cit9CisKK2Z1bmN0aW9uIGdldFdhc3RlZCgpIHsK KyAgdmFyIGZsdXNoSGlzdG9yeSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1sw XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZ2V0TGFzdE1lYXN1cmVtZW50cygpOwor CisgIGlmICghKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7CisgICAg d2FybkluUHJvZHVjdGlvbigpOworICAgIHJldHVybiBbXTsKKyAgfQorCisgIHZhciBhZ2dyZWdh dGVkU3RhdHMgPSB7fTsKKyAgdmFyIGFmZmVjdGVkSURzID0ge307CisKKyAgZnVuY3Rpb24gdXBk YXRlQWdncmVnYXRlZFN0YXRzKHRyZWVTbmFwc2hvdCwgaW5zdGFuY2VJRCwgYXBwbHlVcGRhdGUp IHsKKyAgICB2YXIgX3RyZWVTbmFwc2hvdCRpbnN0YW5jMiA9IHRyZWVTbmFwc2hvdFtpbnN0YW5j ZUlEXSwKKyAgICAgICAgZGlzcGxheU5hbWUgPSBfdHJlZVNuYXBzaG90JGluc3RhbmMyLmRpc3Bs YXlOYW1lLAorICAgICAgICBvd25lcklEID0gX3RyZWVTbmFwc2hvdCRpbnN0YW5jMi5vd25lcklE OworCisgICAgdmFyIG93bmVyID0gdHJlZVNuYXBzaG90W293bmVySURdOworICAgIHZhciBrZXkg PSAob3duZXIgPyBvd25lci5kaXNwbGF5TmFtZSArICcgPiAnIDogJycpICsgZGlzcGxheU5hbWU7 CisgICAgdmFyIHN0YXRzID0gYWdncmVnYXRlZFN0YXRzW2tleV07CisgICAgaWYgKCFzdGF0cykg eworICAgICAgYWZmZWN0ZWRJRHNba2V5XSA9IHt9OworICAgICAgc3RhdHMgPSBhZ2dyZWdhdGVk U3RhdHNba2V5XSA9IHsKKyAgICAgICAga2V5OiBrZXksCisgICAgICAgIGluc3RhbmNlQ291bnQ6 IDAsCisgICAgICAgIGluY2x1c2l2ZVJlbmRlckR1cmF0aW9uOiAwLAorICAgICAgICByZW5kZXJD b3VudDogMAorICAgICAgfTsKKyAgICB9CisgICAgYWZmZWN0ZWRJRHNba2V5XVtpbnN0YW5jZUlE XSA9IHRydWU7CisgICAgYXBwbHlVcGRhdGUoc3RhdHMpOworICB9CisKKyAgZmx1c2hIaXN0b3J5 LmZvckVhY2goZnVuY3Rpb24gKGZsdXNoKSB7CisgICAgdmFyIG1lYXN1cmVtZW50cyA9IGZsdXNo Lm1lYXN1cmVtZW50cywKKyAgICAgICAgdHJlZVNuYXBzaG90ID0gZmx1c2gudHJlZVNuYXBzaG90 LAorICAgICAgICBvcGVyYXRpb25zID0gZmx1c2gub3BlcmF0aW9uczsKKworICAgIHZhciBpc0Rl ZmluaXRlbHlOb3RXYXN0ZWRCeUlEID0ge307CisKKyAgICAvLyBGaW5kIGhvc3QgY29tcG9uZW50 cyBhc3NvY2lhdGVkIHdpdGggYW4gb3BlcmF0aW9uIGluIHRoaXMgYmF0Y2guCisgICAgLy8gTWFy ayBhbGwgY29tcG9uZW50cyBpbiB0aGVpciBwYXJlbnQgdHJlZSBhcyBkZWZpbml0ZWx5IG5vdCB3 YXN0ZWQuCisgICAgb3BlcmF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvcGVyYXRpb24pIHsKKyAg ICAgIHZhciBpbnN0YW5jZUlEID0gb3BlcmF0aW9uLmluc3RhbmNlSUQ7CisKKyAgICAgIHZhciBu ZXh0UGFyZW50SUQgPSBpbnN0YW5jZUlEOworICAgICAgd2hpbGUgKG5leHRQYXJlbnRJRCkgewor ICAgICAgICBpc0RlZmluaXRlbHlOb3RXYXN0ZWRCeUlEW25leHRQYXJlbnRJRF0gPSB0cnVlOwor ICAgICAgICBuZXh0UGFyZW50SUQgPSB0cmVlU25hcHNob3RbbmV4dFBhcmVudElEXS5wYXJlbnRJ RDsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIC8vIEZpbmQgY29tcG9zaXRlIGNvbXBvbmVudHMg dGhhdCByZW5kZXJlZCBpbiB0aGlzIGJhdGNoLgorICAgIC8vIFRoZXNlIGFyZSBwb3RlbnRpYWwg Y2FuZGlkYXRlcyBmb3IgYmVpbmcgd2FzdGVkIHJlbmRlcnMuCisgICAgdmFyIHJlbmRlcmVkQ29t cG9zaXRlSURzID0ge307CisgICAgbWVhc3VyZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG1lYXN1 cmVtZW50KSB7CisgICAgICB2YXIgaW5zdGFuY2VJRCA9IG1lYXN1cmVtZW50Lmluc3RhbmNlSUQs CisgICAgICAgICAgdGltZXJUeXBlID0gbWVhc3VyZW1lbnQudGltZXJUeXBlOworCisgICAgICBp ZiAodGltZXJUeXBlICE9PSAncmVuZGVyJykgeworICAgICAgICByZXR1cm47CisgICAgICB9Cisg ICAgICByZW5kZXJlZENvbXBvc2l0ZUlEc1tpbnN0YW5jZUlEXSA9IHRydWU7CisgICAgfSk7CisK KyAgICBtZWFzdXJlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobWVhc3VyZW1lbnQpIHsKKyAgICAg IHZhciBkdXJhdGlvbiA9IG1lYXN1cmVtZW50LmR1cmF0aW9uLAorICAgICAgICAgIGluc3RhbmNl SUQgPSBtZWFzdXJlbWVudC5pbnN0YW5jZUlELAorICAgICAgICAgIHRpbWVyVHlwZSA9IG1lYXN1 cmVtZW50LnRpbWVyVHlwZTsKKworICAgICAgaWYgKHRpbWVyVHlwZSAhPT0gJ3JlbmRlcicpIHsK KyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICAvLyBJZiB0aGVyZSB3YXMgYSBET00g dXBkYXRlIGJlbG93IHRoaXMgY29tcG9uZW50LCBvciBpdCBoYXMganVzdCBiZWVuCisgICAgICAv LyBtb3VudGVkLCBpdHMgcmVuZGVyKCkgaXMgbm90IGNvbnNpZGVyZWQgd2FzdGVkLgorICAgICAg dmFyIHVwZGF0ZUNvdW50ID0gdHJlZVNuYXBzaG90W2luc3RhbmNlSURdLnVwZGF0ZUNvdW50Owor CisgICAgICBpZiAoaXNEZWZpbml0ZWx5Tm90V2FzdGVkQnlJRFtpbnN0YW5jZUlEXSB8fCB1cGRh dGVDb3VudCA9PT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIC8vIFdl IGNvbnNpZGVyIHRoaXMgcmVuZGVyKCkgd2FzdGVkLgorICAgICAgdXBkYXRlQWdncmVnYXRlZFN0 YXRzKHRyZWVTbmFwc2hvdCwgaW5zdGFuY2VJRCwgZnVuY3Rpb24gKHN0YXRzKSB7CisgICAgICAg IHN0YXRzLnJlbmRlckNvdW50Kys7CisgICAgICB9KTsKKworICAgICAgdmFyIG5leHRQYXJlbnRJ RCA9IGluc3RhbmNlSUQ7CisgICAgICB3aGlsZSAobmV4dFBhcmVudElEKSB7CisgICAgICAgIC8v IEFueSBwYXJlbnRzIHJlbmRlcmVkIGR1cmluZyB0aGlzIGJhdGNoIGFyZSBjb25zaWRlcmVkIHdh c3RlZAorICAgICAgICAvLyB1bmxlc3Mgd2UgcHJldmlvdXNseSBtYXJrZWQgdGhlbSBhcyBkaXJ0 eS4KKyAgICAgICAgdmFyIGlzV2FzdGVkID0gcmVuZGVyZWRDb21wb3NpdGVJRHNbbmV4dFBhcmVu dElEXSAmJiAhaXNEZWZpbml0ZWx5Tm90V2FzdGVkQnlJRFtuZXh0UGFyZW50SURdOworICAgICAg ICBpZiAoaXNXYXN0ZWQpIHsKKyAgICAgICAgICB1cGRhdGVBZ2dyZWdhdGVkU3RhdHModHJlZVNu YXBzaG90LCBuZXh0UGFyZW50SUQsIGZ1bmN0aW9uIChzdGF0cykgeworICAgICAgICAgICAgc3Rh dHMuaW5jbHVzaXZlUmVuZGVyRHVyYXRpb24gKz0gZHVyYXRpb247CisgICAgICAgICAgfSk7Cisg ICAgICAgIH0KKyAgICAgICAgbmV4dFBhcmVudElEID0gdHJlZVNuYXBzaG90W25leHRQYXJlbnRJ RF0ucGFyZW50SUQ7CisgICAgICB9CisgICAgfSk7CisgIH0pOworCisgIHJldHVybiBPYmplY3Qu a2V5cyhhZ2dyZWdhdGVkU3RhdHMpLm1hcChmdW5jdGlvbiAoa2V5KSB7CisgICAgcmV0dXJuIF9l eHRlbmRzKHt9LCBhZ2dyZWdhdGVkU3RhdHNba2V5XSwgeworICAgICAgaW5zdGFuY2VDb3VudDog T2JqZWN0LmtleXMoYWZmZWN0ZWRJRHNba2V5XSkubGVuZ3RoCisgICAgfSk7CisgIH0pLnNvcnQo ZnVuY3Rpb24gKGEsIGIpIHsKKyAgICByZXR1cm4gYi5pbmNsdXNpdmVSZW5kZXJEdXJhdGlvbiAt IGEuaW5jbHVzaXZlUmVuZGVyRHVyYXRpb247CisgIH0pOworfQorCitmdW5jdGlvbiBnZXRPcGVy YXRpb25zKCkgeworICB2YXIgZmx1c2hIaXN0b3J5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYg YXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBnZXRMYXN0TWVhc3Vy ZW1lbnRzKCk7CisKKyAgaWYgKCEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9u JykpIHsKKyAgICB3YXJuSW5Qcm9kdWN0aW9uKCk7CisgICAgcmV0dXJuIFtdOworICB9CisKKyAg dmFyIHN0YXRzID0gW107CisgIGZsdXNoSGlzdG9yeS5mb3JFYWNoKGZ1bmN0aW9uIChmbHVzaCwg Zmx1c2hJbmRleCkgeworICAgIHZhciBvcGVyYXRpb25zID0gZmx1c2gub3BlcmF0aW9ucywKKyAg ICAgICAgdHJlZVNuYXBzaG90ID0gZmx1c2gudHJlZVNuYXBzaG90OworCisgICAgb3BlcmF0aW9u cy5mb3JFYWNoKGZ1bmN0aW9uIChvcGVyYXRpb24pIHsKKyAgICAgIHZhciBpbnN0YW5jZUlEID0g b3BlcmF0aW9uLmluc3RhbmNlSUQsCisgICAgICAgICAgdHlwZSA9IG9wZXJhdGlvbi50eXBlLAor ICAgICAgICAgIHBheWxvYWQgPSBvcGVyYXRpb24ucGF5bG9hZDsKKyAgICAgIHZhciBfdHJlZVNu YXBzaG90JGluc3RhbmMzID0gdHJlZVNuYXBzaG90W2luc3RhbmNlSURdLAorICAgICAgICAgIGRp c3BsYXlOYW1lID0gX3RyZWVTbmFwc2hvdCRpbnN0YW5jMy5kaXNwbGF5TmFtZSwKKyAgICAgICAg ICBvd25lcklEID0gX3RyZWVTbmFwc2hvdCRpbnN0YW5jMy5vd25lcklEOworCisgICAgICB2YXIg b3duZXIgPSB0cmVlU25hcHNob3Rbb3duZXJJRF07CisgICAgICB2YXIga2V5ID0gKG93bmVyID8g b3duZXIuZGlzcGxheU5hbWUgKyAnID4gJyA6ICcnKSArIGRpc3BsYXlOYW1lOworCisgICAgICBz dGF0cy5wdXNoKHsKKyAgICAgICAgZmx1c2hJbmRleDogZmx1c2hJbmRleCwKKyAgICAgICAgaW5z dGFuY2VJRDogaW5zdGFuY2VJRCwKKyAgICAgICAga2V5OiBrZXksCisgICAgICAgIHR5cGU6IHR5 cGUsCisgICAgICAgIG93bmVySUQ6IG93bmVySUQsCisgICAgICAgIHBheWxvYWQ6IHBheWxvYWQK KyAgICAgIH0pOworICAgIH0pOworICB9KTsKKyAgcmV0dXJuIHN0YXRzOworfQorCitmdW5jdGlv biBwcmludEV4Y2x1c2l2ZShmbHVzaEhpc3RvcnkpIHsKKyAgaWYgKCEocHJvY2Vzcy5lbnYuTk9E RV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHsKKyAgICB3YXJuSW5Qcm9kdWN0aW9uKCk7CisgICAg cmV0dXJuOworICB9CisKKyAgdmFyIHN0YXRzID0gZ2V0RXhjbHVzaXZlKGZsdXNoSGlzdG9yeSk7 CisgIHZhciB0YWJsZSA9IHN0YXRzLm1hcChmdW5jdGlvbiAoaXRlbSkgeworICAgIHZhciBrZXkg PSBpdGVtLmtleSwKKyAgICAgICAgaW5zdGFuY2VDb3VudCA9IGl0ZW0uaW5zdGFuY2VDb3VudCwK KyAgICAgICAgdG90YWxEdXJhdGlvbiA9IGl0ZW0udG90YWxEdXJhdGlvbjsKKworICAgIHZhciBy ZW5kZXJDb3VudCA9IGl0ZW0uY291bnRzLnJlbmRlciB8fCAwOworICAgIHZhciByZW5kZXJEdXJh dGlvbiA9IGl0ZW0uZHVyYXRpb25zLnJlbmRlciB8fCAwOworICAgIHJldHVybiB7CisgICAgICAn Q29tcG9uZW50Jzoga2V5LAorICAgICAgJ1RvdGFsIHRpbWUgKG1zKSc6IHJvdW5kRmxvYXQodG90 YWxEdXJhdGlvbiksCisgICAgICAnSW5zdGFuY2UgY291bnQnOiBpbnN0YW5jZUNvdW50LAorICAg ICAgJ1RvdGFsIHJlbmRlciB0aW1lIChtcyknOiByb3VuZEZsb2F0KHJlbmRlckR1cmF0aW9uKSwK KyAgICAgICdBdmVyYWdlIHJlbmRlciB0aW1lIChtcyknOiByZW5kZXJDb3VudCA/IHJvdW5kRmxv YXQocmVuZGVyRHVyYXRpb24gLyByZW5kZXJDb3VudCkgOiB1bmRlZmluZWQsCisgICAgICAnUmVu ZGVyIGNvdW50JzogcmVuZGVyQ291bnQsCisgICAgICAnVG90YWwgbGlmZWN5Y2xlIHRpbWUgKG1z KSc6IHJvdW5kRmxvYXQodG90YWxEdXJhdGlvbiAtIHJlbmRlckR1cmF0aW9uKQorICAgIH07Cisg IH0pOworICBjb25zb2xlVGFibGUodGFibGUpOworfQorCitmdW5jdGlvbiBwcmludEluY2x1c2l2 ZShmbHVzaEhpc3RvcnkpIHsKKyAgaWYgKCEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9k dWN0aW9uJykpIHsKKyAgICB3YXJuSW5Qcm9kdWN0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisK KyAgdmFyIHN0YXRzID0gZ2V0SW5jbHVzaXZlKGZsdXNoSGlzdG9yeSk7CisgIHZhciB0YWJsZSA9 IHN0YXRzLm1hcChmdW5jdGlvbiAoaXRlbSkgeworICAgIHZhciBrZXkgPSBpdGVtLmtleSwKKyAg ICAgICAgaW5zdGFuY2VDb3VudCA9IGl0ZW0uaW5zdGFuY2VDb3VudCwKKyAgICAgICAgaW5jbHVz aXZlUmVuZGVyRHVyYXRpb24gPSBpdGVtLmluY2x1c2l2ZVJlbmRlckR1cmF0aW9uLAorICAgICAg ICByZW5kZXJDb3VudCA9IGl0ZW0ucmVuZGVyQ291bnQ7CisKKyAgICByZXR1cm4geworICAgICAg J093bmVyID4gQ29tcG9uZW50Jzoga2V5LAorICAgICAgJ0luY2x1c2l2ZSByZW5kZXIgdGltZSAo bXMpJzogcm91bmRGbG9hdChpbmNsdXNpdmVSZW5kZXJEdXJhdGlvbiksCisgICAgICAnSW5zdGFu Y2UgY291bnQnOiBpbnN0YW5jZUNvdW50LAorICAgICAgJ1JlbmRlciBjb3VudCc6IHJlbmRlckNv dW50CisgICAgfTsKKyAgfSk7CisgIGNvbnNvbGVUYWJsZSh0YWJsZSk7Cit9CisKK2Z1bmN0aW9u IHByaW50V2FzdGVkKGZsdXNoSGlzdG9yeSkgeworICBpZiAoIShwcm9jZXNzLmVudi5OT0RFX0VO ViAhPT0gJ3Byb2R1Y3Rpb24nKSkgeworICAgIHdhcm5JblByb2R1Y3Rpb24oKTsKKyAgICByZXR1 cm47CisgIH0KKworICB2YXIgc3RhdHMgPSBnZXRXYXN0ZWQoZmx1c2hIaXN0b3J5KTsKKyAgdmFy IHRhYmxlID0gc3RhdHMubWFwKGZ1bmN0aW9uIChpdGVtKSB7CisgICAgdmFyIGtleSA9IGl0ZW0u a2V5LAorICAgICAgICBpbnN0YW5jZUNvdW50ID0gaXRlbS5pbnN0YW5jZUNvdW50LAorICAgICAg ICBpbmNsdXNpdmVSZW5kZXJEdXJhdGlvbiA9IGl0ZW0uaW5jbHVzaXZlUmVuZGVyRHVyYXRpb24s CisgICAgICAgIHJlbmRlckNvdW50ID0gaXRlbS5yZW5kZXJDb3VudDsKKworICAgIHJldHVybiB7 CisgICAgICAnT3duZXIgPiBDb21wb25lbnQnOiBrZXksCisgICAgICAnSW5jbHVzaXZlIHdhc3Rl ZCB0aW1lIChtcyknOiByb3VuZEZsb2F0KGluY2x1c2l2ZVJlbmRlckR1cmF0aW9uKSwKKyAgICAg ICdJbnN0YW5jZSBjb3VudCc6IGluc3RhbmNlQ291bnQsCisgICAgICAnUmVuZGVyIGNvdW50Jzog cmVuZGVyQ291bnQKKyAgICB9OworICB9KTsKKyAgY29uc29sZVRhYmxlKHRhYmxlKTsKK30KKwor ZnVuY3Rpb24gcHJpbnRPcGVyYXRpb25zKGZsdXNoSGlzdG9yeSkgeworICBpZiAoIShwcm9jZXNz LmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkgeworICAgIHdhcm5JblByb2R1Y3Rpb24o KTsKKyAgICByZXR1cm47CisgIH0KKworICB2YXIgc3RhdHMgPSBnZXRPcGVyYXRpb25zKGZsdXNo SGlzdG9yeSk7CisgIHZhciB0YWJsZSA9IHN0YXRzLm1hcChmdW5jdGlvbiAoc3RhdCkgeworICAg IHJldHVybiB7CisgICAgICAnT3duZXIgPiBOb2RlJzogc3RhdC5rZXksCisgICAgICAnT3BlcmF0 aW9uJzogc3RhdC50eXBlLAorICAgICAgJ1BheWxvYWQnOiB0eXBlb2Ygc3RhdC5wYXlsb2FkID09 PSAnb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KHN0YXQucGF5bG9hZCkgOiBzdGF0LnBheWxvYWQs CisgICAgICAnRmx1c2ggaW5kZXgnOiBzdGF0LmZsdXNoSW5kZXgsCisgICAgICAnT3duZXIgQ29t cG9uZW50IElEJzogc3RhdC5vd25lcklELAorICAgICAgJ0RPTSBDb21wb25lbnQgSUQnOiBzdGF0 Lmluc3RhbmNlSUQKKyAgICB9OworICB9KTsKKyAgY29uc29sZVRhYmxlKHRhYmxlKTsKK30KKwor dmFyIHdhcm5lZEFib3V0UHJpbnRET00gPSBmYWxzZTsKK2Z1bmN0aW9uIHByaW50RE9NKG1lYXN1 cmVtZW50cykgeworICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2Fy bmluZyh3YXJuZWRBYm91dFByaW50RE9NLCAnYFJlYWN0UGVyZi5wcmludERPTSguLi4pYCBpcyBk ZXByZWNhdGVkLiBVc2UgJyArICdgUmVhY3RQZXJmLnByaW50T3BlcmF0aW9ucyguLi4pYCBpbnN0 ZWFkLicpIDogdm9pZCAwOworICB3YXJuZWRBYm91dFByaW50RE9NID0gdHJ1ZTsKKyAgcmV0dXJu IHByaW50T3BlcmF0aW9ucyhtZWFzdXJlbWVudHMpOworfQorCit2YXIgd2FybmVkQWJvdXRHZXRN ZWFzdXJlbWVudHNTdW1tYXJ5TWFwID0gZmFsc2U7CitmdW5jdGlvbiBnZXRNZWFzdXJlbWVudHNT dW1tYXJ5TWFwKG1lYXN1cmVtZW50cykgeworICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3By b2R1Y3Rpb24nID8gd2FybmluZyh3YXJuZWRBYm91dEdldE1lYXN1cmVtZW50c1N1bW1hcnlNYXAs ICdgUmVhY3RQZXJmLmdldE1lYXN1cmVtZW50c1N1bW1hcnlNYXAoLi4uKWAgaXMgZGVwcmVjYXRl ZC4gVXNlICcgKyAnYFJlYWN0UGVyZi5nZXRXYXN0ZWQoLi4uKWAgaW5zdGVhZC4nKSA6IHZvaWQg MDsKKyAgd2FybmVkQWJvdXRHZXRNZWFzdXJlbWVudHNTdW1tYXJ5TWFwID0gdHJ1ZTsKKyAgcmV0 dXJuIGdldFdhc3RlZChtZWFzdXJlbWVudHMpOworfQorCitmdW5jdGlvbiBzdGFydCgpIHsKKyAg aWYgKCEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHsKKyAgICB3YXJu SW5Qcm9kdWN0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgUmVhY3REZWJ1Z1Rvb2wuYmVn aW5Qcm9maWxpbmcoKTsKK30KKworZnVuY3Rpb24gc3RvcCgpIHsKKyAgaWYgKCEocHJvY2Vzcy5l bnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHsKKyAgICB3YXJuSW5Qcm9kdWN0aW9uKCk7 CisgICAgcmV0dXJuOworICB9CisKKyAgUmVhY3REZWJ1Z1Rvb2wuZW5kUHJvZmlsaW5nKCk7Cit9 CisKK2Z1bmN0aW9uIGlzUnVubmluZygpIHsKKyAgaWYgKCEocHJvY2Vzcy5lbnYuTk9ERV9FTlYg IT09ICdwcm9kdWN0aW9uJykpIHsKKyAgICB3YXJuSW5Qcm9kdWN0aW9uKCk7CisgICAgcmV0dXJu IGZhbHNlOworICB9CisKKyAgcmV0dXJuIFJlYWN0RGVidWdUb29sLmlzUHJvZmlsaW5nKCk7Cit9 CisKK3ZhciBSZWFjdFBlcmZBbmFseXNpcyA9IHsKKyAgZ2V0TGFzdE1lYXN1cmVtZW50czogZ2V0 TGFzdE1lYXN1cmVtZW50cywKKyAgZ2V0RXhjbHVzaXZlOiBnZXRFeGNsdXNpdmUsCisgIGdldElu Y2x1c2l2ZTogZ2V0SW5jbHVzaXZlLAorICBnZXRXYXN0ZWQ6IGdldFdhc3RlZCwKKyAgZ2V0T3Bl cmF0aW9uczogZ2V0T3BlcmF0aW9ucywKKyAgcHJpbnRFeGNsdXNpdmU6IHByaW50RXhjbHVzaXZl LAorICBwcmludEluY2x1c2l2ZTogcHJpbnRJbmNsdXNpdmUsCisgIHByaW50V2FzdGVkOiBwcmlu dFdhc3RlZCwKKyAgcHJpbnRPcGVyYXRpb25zOiBwcmludE9wZXJhdGlvbnMsCisgIHN0YXJ0OiBz dGFydCwKKyAgc3RvcDogc3RvcCwKKyAgaXNSdW5uaW5nOiBpc1J1bm5pbmcsCisgIC8vIERlcHJl Y2F0ZWQ6CisgIHByaW50RE9NOiBwcmludERPTSwKKyAgZ2V0TWVhc3VyZW1lbnRzU3VtbWFyeU1h cDogZ2V0TWVhc3VyZW1lbnRzU3VtbWFyeU1hcAorfTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFj dFBlcmZBbmFseXNpczsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93 ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RQcmlvcml0eUxldmVs LmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0UHJpb3Jp dHlMZXZlbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uZTg0YmE4OTIK LS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9s aWIvUmVhY3RQcmlvcml0eUxldmVsLmpzCkBAIC0wLDAgKzEsMjAgQEAKKy8qKgorICogQ29weXJp Z2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQu CisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxl IGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0 b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVu dCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGly ZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKKworbW9kdWxlLmV4cG9ydHMg PSB7CisgIE5vV29yazogMCwgLy8gTm8gd29yayBpcyBwZW5kaW5nLgorICBTeW5jaHJvbm91c1By aW9yaXR5OiAxLCAvLyBGb3IgY29udHJvbGxlZCB0ZXh0IGlucHV0cy4gU3luY2hyb25vdXMgc2lk ZS1lZmZlY3RzLgorICBBbmltYXRpb25Qcmlvcml0eTogMiwgLy8gTmVlZHMgdG8gY29tcGxldGUg YmVmb3JlIHRoZSBuZXh0IGZyYW1lLgorICBIaWdoUHJpb3JpdHk6IDMsIC8vIEludGVyYWN0aW9u IHRoYXQgbmVlZHMgdG8gY29tcGxldGUgcHJldHR5IHNvb24gdG8gZmVlbCByZXNwb25zaXZlLgor ICBMb3dQcmlvcml0eTogNCwgLy8gRGF0YSBmZXRjaGluZywgb3IgcmVzdWx0IGZyb20gdXBkYXRp bmcgc3RvcmVzLgorICBPZmZzY3JlZW5Qcmlvcml0eTogNSB9OwpcIE5vIG5ld2xpbmUgYXQgZW5k IG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9t L2xpYi9SZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcy5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92 ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcy5qcwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uZGIwMzNjZGEKLS0tIC9kZXYvbnVsbAorKysg Yi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RQcm9wVHlwZUxv Y2F0aW9uTmFtZXMuanMKQEAgLTAsMCArMSwyNCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1w cmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBU aGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBm b3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhp cyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBj YW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisg KgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgUmVhY3RQcm9wVHlwZUxvY2F0aW9u TmFtZXMgPSB7fTsKKworaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicp IHsKKyAgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMgPSB7CisgICAgcHJvcDogJ3Byb3AnLAor ICAgIGNvbnRleHQ6ICdjb250ZXh0JywKKyAgICBjaGlsZENvbnRleHQ6ICdjaGlsZCBjb250ZXh0 JworICB9OworfQorCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVz OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0 YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdFByb3BUeXBlTG9jYXRpb25zLmpzIGIvd2Vi L3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0UHJvcFR5cGVMb2NhdGlv bnMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjZkOTRjYTgxCi0tLSAv ZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1Jl YWN0UHJvcFR5cGVMb2NhdGlvbnMuanMKQEAgLTAsMCArMSwxMiBAQAorLyoqCisgKiBDb3B5cmln aHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4K KyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUg bGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rv cnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50 IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJl Y3RvcnkuCisgKgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOwpcIE5vIG5ld2xpbmUgYXQgZW5k IG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9t L2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldC5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3Iv cmVhY3QtZG9tL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwMC4uMzNkM2ZhYzAKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1p bi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMKQEAg LTAsMCArMSwxNiBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywg SW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlz IGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJ Q0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4g YWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhl IFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogCisgKi8KKworJ3Vz ZSBzdHJpY3QnOworCit2YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSAnU0VDUkVUX0RPX05PVF9Q QVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnOworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0 UHJvcFR5cGVzU2VjcmV0OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBh L3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdFJlY29uY2lsZVRy YW5zYWN0aW9uLmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1Jl YWN0UmVjb25jaWxlVHJhbnNhY3Rpb24uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMDAuLmZiMWFiYWY5Ci0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3Zl bmRvci9yZWFjdC1kb20vbGliL1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24uanMKQEAgLTAsMCAr MSwxNzcgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4K KyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNl bnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNF IGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0 aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRF TlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7 CisKK3ZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpOworCit2YXIgQ2FsbGJh Y2tRdWV1ZSA9IHJlcXVpcmUoJy4vQ2FsbGJhY2tRdWV1ZScpOwordmFyIFBvb2xlZENsYXNzID0g cmVxdWlyZSgnLi9Qb29sZWRDbGFzcycpOwordmFyIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlciA9 IHJlcXVpcmUoJy4vUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyJyk7Cit2YXIgUmVhY3RJbnB1dFNl bGVjdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnB1dFNlbGVjdGlvbicpOwordmFyIFJlYWN0SW5z dHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdEluc3RydW1lbnRhdGlvbicpOwordmFyIFRy YW5zYWN0aW9uID0gcmVxdWlyZSgnLi9UcmFuc2FjdGlvbicpOwordmFyIFJlYWN0VXBkYXRlUXVl dWUgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlUXVldWUnKTsKKworLyoqCisgKiBFbnN1cmVzIHRo YXQsIHdoZW4gcG9zc2libGUsIHRoZSBzZWxlY3Rpb24gcmFuZ2UgKGN1cnJlbnRseSBzZWxlY3Rl ZCB0ZXh0CisgKiBpbnB1dCkgaXMgbm90IGRpc3R1cmJlZCBieSBwZXJmb3JtaW5nIHRoZSB0cmFu c2FjdGlvbi4KKyAqLwordmFyIFNFTEVDVElPTl9SRVNUT1JBVElPTiA9IHsKKyAgLyoqCisgICAq IEByZXR1cm4ge1NlbGVjdGlvbn0gU2VsZWN0aW9uIGluZm9ybWF0aW9uLgorICAgKi8KKyAgaW5p dGlhbGl6ZTogUmVhY3RJbnB1dFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25JbmZvcm1hdGlvbiwKKyAg LyoqCisgICAqIEBwYXJhbSB7U2VsZWN0aW9ufSBzZWwgU2VsZWN0aW9uIGluZm9ybWF0aW9uIHJl dHVybmVkIGZyb20gYGluaXRpYWxpemVgLgorICAgKi8KKyAgY2xvc2U6IFJlYWN0SW5wdXRTZWxl Y3Rpb24ucmVzdG9yZVNlbGVjdGlvbgorfTsKKworLyoqCisgKiBTdXBwcmVzc2VzIGV2ZW50cyAo Ymx1ci9mb2N1cykgdGhhdCBjb3VsZCBiZSBpbmFkdmVydGVudGx5IGRpc3BhdGNoZWQgZHVlIHRv CisgKiBoaWdoIGxldmVsIERPTSBtYW5pcHVsYXRpb25zIChsaWtlIHRlbXBvcmFyaWx5IHJlbW92 aW5nIGEgdGV4dCBpbnB1dCBmcm9tIHRoZQorICogRE9NKS4KKyAqLwordmFyIEVWRU5UX1NVUFBS RVNTSU9OID0geworICAvKioKKyAgICogQHJldHVybiB7Ym9vbGVhbn0gVGhlIGVuYWJsZWQgc3Rh dHVzIG9mIGBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXJgIGJlZm9yZQorICAgKiB0aGUgcmVjb25j aWxpYXRpb24uCisgICAqLworICBpbml0aWFsaXplOiBmdW5jdGlvbiAoKSB7CisgICAgdmFyIGN1 cnJlbnRseUVuYWJsZWQgPSBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuaXNFbmFibGVkKCk7Cisg ICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLnNldEVuYWJsZWQoZmFsc2UpOworICAgIHJldHVy biBjdXJyZW50bHlFbmFibGVkOworICB9LAorCisgIC8qKgorICAgKiBAcGFyYW0ge2Jvb2xlYW59 IHByZXZpb3VzbHlFbmFibGVkIEVuYWJsZWQgc3RhdHVzIG9mCisgICAqICAgYFJlYWN0QnJvd3Nl ckV2ZW50RW1pdHRlcmAgYmVmb3JlIHRoZSByZWNvbmNpbGlhdGlvbiBvY2N1cnJlZC4gYGNsb3Nl YAorICAgKiAgIHJlc3RvcmVzIHRoZSBwcmV2aW91cyB2YWx1ZS4KKyAgICovCisgIGNsb3NlOiBm dW5jdGlvbiAocHJldmlvdXNseUVuYWJsZWQpIHsKKyAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0 ZXIuc2V0RW5hYmxlZChwcmV2aW91c2x5RW5hYmxlZCk7CisgIH0KK307CisKKy8qKgorICogUHJv dmlkZXMgYSBxdWV1ZSBmb3IgY29sbGVjdGluZyBgY29tcG9uZW50RGlkTW91bnRgIGFuZAorICog YGNvbXBvbmVudERpZFVwZGF0ZWAgY2FsbGJhY2tzIGR1cmluZyB0aGUgdHJhbnNhY3Rpb24uCisg Ki8KK3ZhciBPTl9ET01fUkVBRFlfUVVFVUVJTkcgPSB7CisgIC8qKgorICAgKiBJbml0aWFsaXpl cyB0aGUgaW50ZXJuYWwgYG9uRE9NUmVhZHlgIHF1ZXVlLgorICAgKi8KKyAgaW5pdGlhbGl6ZTog ZnVuY3Rpb24gKCkgeworICAgIHRoaXMucmVhY3RNb3VudFJlYWR5LnJlc2V0KCk7CisgIH0sCisK KyAgLyoqCisgICAqIEFmdGVyIERPTSBpcyBmbHVzaGVkLCBpbnZva2UgYWxsIHJlZ2lzdGVyZWQg YG9uRE9NUmVhZHlgIGNhbGxiYWNrcy4KKyAgICovCisgIGNsb3NlOiBmdW5jdGlvbiAoKSB7Cisg ICAgdGhpcy5yZWFjdE1vdW50UmVhZHkubm90aWZ5QWxsKCk7CisgIH0KK307CisKKy8qKgorICog RXhlY3V0ZWQgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgYFRyYW5zYWN0aW9uYCBpbnN0YW5jZS4g Q29uc2lkZXIgdGhlc2UgYXMKKyAqIGJlaW5nIG1lbWJlciBtZXRob2RzLCBidXQgd2l0aCBhbiBp bXBsaWVkIG9yZGVyaW5nIHdoaWxlIGJlaW5nIGlzb2xhdGVkIGZyb20KKyAqIGVhY2ggb3RoZXIu CisgKi8KK3ZhciBUUkFOU0FDVElPTl9XUkFQUEVSUyA9IFtTRUxFQ1RJT05fUkVTVE9SQVRJT04s IEVWRU5UX1NVUFBSRVNTSU9OLCBPTl9ET01fUkVBRFlfUVVFVUVJTkddOworCitpZiAocHJvY2Vz cy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgeworICBUUkFOU0FDVElPTl9XUkFQUEVS Uy5wdXNoKHsKKyAgICBpbml0aWFsaXplOiBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wu b25CZWdpbkZsdXNoLAorICAgIGNsb3NlOiBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wu b25FbmRGbHVzaAorICB9KTsKK30KKworLyoqCisgKiBDdXJyZW50bHk6CisgKiAtIFRoZSBvcmRl ciB0aGF0IHRoZXNlIGFyZSBsaXN0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uIGlzIGNyaXRpY2FsOgor ICogLSBTdXBwcmVzc2VzIGV2ZW50cy4KKyAqIC0gUmVzdG9yZXMgc2VsZWN0aW9uIHJhbmdlLgor ICoKKyAqIEZ1dHVyZToKKyAqIC0gUmVzdG9yZSBkb2N1bWVudC9vdmVyZmxvdyBzY3JvbGwgcG9z aXRpb25zIHRoYXQgd2VyZSB1bmludGVudGlvbmFsbHkKKyAqICAgbW9kaWZpZWQgdmlhIERPTSBp bnNlcnRpb25zIGFib3ZlIHRoZSB0b3Agdmlld3BvcnQgYm91bmRhcnkuCisgKiAtIEltcGxlbWVu dC9pbnRlZ3JhdGUgd2l0aCBjdXN0b21pemVkIGNvbnN0cmFpbnQgYmFzZWQgbGF5b3V0IHN5c3Rl bSBhbmQga2VlcAorICogICB0cmFjayBvZiB3aGljaCBkaW1lbnNpb25zIG11c3QgYmUgcmVtZWFz dXJlZC4KKyAqCisgKiBAY2xhc3MgUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbgorICovCitmdW5j dGlvbiBSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uKHVzZUNyZWF0ZUVsZW1lbnQpIHsKKyAgdGhp cy5yZWluaXRpYWxpemVUcmFuc2FjdGlvbigpOworICAvLyBPbmx5IHNlcnZlci1zaWRlIHJlbmRl cmluZyByZWFsbHkgbmVlZHMgdGhpcyBvcHRpb24gKHNlZQorICAvLyBgUmVhY3RTZXJ2ZXJSZW5k ZXJpbmdgKSwgYnV0IHNlcnZlci1zaWRlIHVzZXMKKyAgLy8gYFJlYWN0U2VydmVyUmVuZGVyaW5n VHJhbnNhY3Rpb25gIGluc3RlYWQuIFRoaXMgb3B0aW9uIGlzIGhlcmUgc28gdGhhdCBpdCdzCisg IC8vIGFjY2Vzc2libGUgYW5kIGRlZmF1bHRzIHRvIGZhbHNlIHdoZW4gYFJlYWN0RE9NQ29tcG9u ZW50YCBhbmQKKyAgLy8gYFJlYWN0RE9NVGV4dENvbXBvbmVudGAgY2hlY2tzIGl0IGluIGBtb3Vu dENvbXBvbmVudGAuYAorICB0aGlzLnJlbmRlclRvU3RhdGljTWFya3VwID0gZmFsc2U7CisgIHRo aXMucmVhY3RNb3VudFJlYWR5ID0gQ2FsbGJhY2tRdWV1ZS5nZXRQb29sZWQobnVsbCk7CisgIHRo aXMudXNlQ3JlYXRlRWxlbWVudCA9IHVzZUNyZWF0ZUVsZW1lbnQ7Cit9CisKK3ZhciBNaXhpbiA9 IHsKKyAgLyoqCisgICAqIEBzZWUgVHJhbnNhY3Rpb24KKyAgICogQGFic3RyYWN0CisgICAqIEBm aW5hbAorICAgKiBAcmV0dXJuIHthcnJheTxvYmplY3Q+fSBMaXN0IG9mIG9wZXJhdGlvbiB3cmFw IHByb2NlZHVyZXMuCisgICAqICAgVE9ETzogY29udmVydCB0byBhcnJheTxUcmFuc2FjdGlvbldy YXBwZXI+CisgICAqLworICBnZXRUcmFuc2FjdGlvbldyYXBwZXJzOiBmdW5jdGlvbiAoKSB7Cisg ICAgcmV0dXJuIFRSQU5TQUNUSU9OX1dSQVBQRVJTOworICB9LAorCisgIC8qKgorICAgKiBAcmV0 dXJuIHtvYmplY3R9IFRoZSBxdWV1ZSB0byBjb2xsZWN0IGBvbkRPTVJlYWR5YCBjYWxsYmFja3Mg d2l0aC4KKyAgICovCisgIGdldFJlYWN0TW91bnRSZWFkeTogZnVuY3Rpb24gKCkgeworICAgIHJl dHVybiB0aGlzLnJlYWN0TW91bnRSZWFkeTsKKyAgfSwKKworICAvKioKKyAgICogQHJldHVybiB7 b2JqZWN0fSBUaGUgcXVldWUgdG8gY29sbGVjdCBSZWFjdCBhc3luYyBldmVudHMuCisgICAqLwor ICBnZXRVcGRhdGVRdWV1ZTogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBSZWFjdFVwZGF0ZVF1 ZXVlOworICB9LAorCisgIC8qKgorICAgKiBTYXZlIGN1cnJlbnQgdHJhbnNhY3Rpb24gc3RhdGUg LS0gaWYgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoaXMgbWV0aG9kIGlzCisgICAqIHBhc3NlZCB0 byBgcm9sbGJhY2tgLCB0aGUgdHJhbnNhY3Rpb24gd2lsbCBiZSByZXNldCB0byB0aGF0IHN0YXRl LgorICAgKi8KKyAgY2hlY2twb2ludDogZnVuY3Rpb24gKCkgeworICAgIC8vIHJlYWN0TW91bnRS ZWFkeSBpcyB0aGUgb3VyIG9ubHkgc3RhdGVmdWwgd3JhcHBlcgorICAgIHJldHVybiB0aGlzLnJl YWN0TW91bnRSZWFkeS5jaGVja3BvaW50KCk7CisgIH0sCisKKyAgcm9sbGJhY2s6IGZ1bmN0aW9u IChjaGVja3BvaW50KSB7CisgICAgdGhpcy5yZWFjdE1vdW50UmVhZHkucm9sbGJhY2soY2hlY2tw b2ludCk7CisgIH0sCisKKyAgLyoqCisgICAqIGBQb29sZWRDbGFzc2AgbG9va3MgZm9yIHRoaXMs IGFuZCB3aWxsIGludm9rZSB0aGlzIGJlZm9yZSBhbGxvd2luZyB0aGlzCisgICAqIGluc3RhbmNl IHRvIGJlIHJldXNlZC4KKyAgICovCisgIGRlc3RydWN0b3I6IGZ1bmN0aW9uICgpIHsKKyAgICBD YWxsYmFja1F1ZXVlLnJlbGVhc2UodGhpcy5yZWFjdE1vdW50UmVhZHkpOworICAgIHRoaXMucmVh Y3RNb3VudFJlYWR5ID0gbnVsbDsKKyAgfQorfTsKKworX2Fzc2lnbihSZWFjdFJlY29uY2lsZVRy YW5zYWN0aW9uLnByb3RvdHlwZSwgVHJhbnNhY3Rpb24sIE1peGluKTsKKworUG9vbGVkQ2xhc3Mu YWRkUG9vbGluZ1RvKFJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24pOworCittb2R1bGUuZXhwb3J0 cyA9IFJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb247ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmls ZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1Jl YWN0UmVjb25jaWxlci5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xp Yi9SZWFjdFJlY29uY2lsZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAu LjdiM2NkZmRjCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9y ZWFjdC1kb20vbGliL1JlYWN0UmVjb25jaWxlci5qcwpAQCAtMCwwICsxLDE2NyBAQAorLyoqCisg KiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyBy ZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBC U0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9v dCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICog b2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUg c2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFJlYWN0UmVm ID0gcmVxdWlyZSgnLi9SZWFjdFJlZicpOwordmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVx dWlyZSgnLi9SZWFjdEluc3RydW1lbnRhdGlvbicpOworCit2YXIgd2FybmluZyA9IHJlcXVpcmUo J2ZianMvbGliL3dhcm5pbmcnKTsKKworLyoqCisgKiBIZWxwZXIgdG8gY2FsbCBSZWFjdFJlZi5h dHRhY2hSZWZzIHdpdGggdGhpcyBjb21wb3NpdGUgY29tcG9uZW50LCBzcGxpdCBvdXQKKyAqIHRv IGF2b2lkIGFsbG9jYXRpb25zIGluIHRoZSB0cmFuc2FjdGlvbiBtb3VudC1yZWFkeSBxdWV1ZS4K KyAqLworZnVuY3Rpb24gYXR0YWNoUmVmcygpIHsKKyAgUmVhY3RSZWYuYXR0YWNoUmVmcyh0aGlz LCB0aGlzLl9jdXJyZW50RWxlbWVudCk7Cit9CisKK3ZhciBSZWFjdFJlY29uY2lsZXIgPSB7CisK KyAgLyoqCisgICAqIEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQsIHJlbmRlcnMgbWFya3VwLCBh bmQgcmVnaXN0ZXJzIGV2ZW50IGxpc3RlbmVycy4KKyAgICoKKyAgICogQHBhcmFtIHtSZWFjdENv bXBvbmVudH0gaW50ZXJuYWxJbnN0YW5jZQorICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJh bnNhY3Rpb258UmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24KKyAg ICogQHBhcmFtIHs/b2JqZWN0fSB0aGUgY29udGFpbmluZyBob3N0IGNvbXBvbmVudCBpbnN0YW5j ZQorICAgKiBAcGFyYW0gez9vYmplY3R9IGluZm8gYWJvdXQgdGhlIGhvc3QgY29udGFpbmVyCisg ICAqIEByZXR1cm4gez9zdHJpbmd9IFJlbmRlcmVkIG1hcmt1cCB0byBiZSBpbnNlcnRlZCBpbnRv IHRoZSBET00uCisgICAqIEBmaW5hbAorICAgKiBAaW50ZXJuYWwKKyAgICovCisgIG1vdW50Q29t cG9uZW50OiBmdW5jdGlvbiAoaW50ZXJuYWxJbnN0YW5jZSwgdHJhbnNhY3Rpb24sIGhvc3RQYXJl bnQsIGhvc3RDb250YWluZXJJbmZvLCBjb250ZXh0LCBwYXJlbnREZWJ1Z0lEIC8vIDAgaW4gcHJv ZHVjdGlvbiBhbmQgZm9yIHJvb3RzCisgICkgeworICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VO ViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJ RCAhPT0gMCkgeworICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWZv cmVNb3VudENvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lELCBpbnRlcm5hbEluc3Rh bmNlLl9jdXJyZW50RWxlbWVudCwgcGFyZW50RGVidWdJRCk7CisgICAgICB9CisgICAgfQorICAg IHZhciBtYXJrdXAgPSBpbnRlcm5hbEluc3RhbmNlLm1vdW50Q29tcG9uZW50KHRyYW5zYWN0aW9u LCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgY29udGV4dCwgcGFyZW50RGVidWdJRCk7 CisgICAgaWYgKGludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50ICYmIGludGVybmFsSW5z dGFuY2UuX2N1cnJlbnRFbGVtZW50LnJlZiAhPSBudWxsKSB7CisgICAgICB0cmFuc2FjdGlvbi5n ZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGF0dGFjaFJlZnMsIGludGVybmFsSW5zdGFuY2Up OworICAgIH0KKyAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykg eworICAgICAgaWYgKGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQgIT09IDApIHsKKyAgICAgICAg UmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uTW91bnRDb21wb25lbnQoaW50ZXJuYWxJ bnN0YW5jZS5fZGVidWdJRCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBtYXJrdXA7Cisg IH0sCisKKyAgLyoqCisgICAqIFJldHVybnMgYSB2YWx1ZSB0aGF0IGNhbiBiZSBwYXNzZWQgdG8K KyAgICogUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudC5yZXBsYWNlTm9kZVdpdGhNYXJrdXAuCisg ICAqLworICBnZXRIb3N0Tm9kZTogZnVuY3Rpb24gKGludGVybmFsSW5zdGFuY2UpIHsKKyAgICBy ZXR1cm4gaW50ZXJuYWxJbnN0YW5jZS5nZXRIb3N0Tm9kZSgpOworICB9LAorCisgIC8qKgorICAg KiBSZWxlYXNlcyBhbnkgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSBgbW91bnRDb21wb25lbnRgLgor ICAgKgorICAgKiBAZmluYWwKKyAgICogQGludGVybmFsCisgICAqLworICB1bm1vdW50Q29tcG9u ZW50OiBmdW5jdGlvbiAoaW50ZXJuYWxJbnN0YW5jZSwgc2FmZWx5KSB7CisgICAgaWYgKHByb2Nl c3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIGlmIChpbnRlcm5hbElu c3RhbmNlLl9kZWJ1Z0lEICE9PSAwKSB7CisgICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRl YnVnVG9vbC5vbkJlZm9yZVVubW91bnRDb21wb25lbnQoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJ RCk7CisgICAgICB9CisgICAgfQorICAgIFJlYWN0UmVmLmRldGFjaFJlZnMoaW50ZXJuYWxJbnN0 YW5jZSwgaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQpOworICAgIGludGVybmFsSW5z dGFuY2UudW5tb3VudENvbXBvbmVudChzYWZlbHkpOworICAgIGlmIChwcm9jZXNzLmVudi5OT0RF X0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fZGVi dWdJRCAhPT0gMCkgeworICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25V bm1vdW50Q29tcG9uZW50KGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQpOworICAgICAgfQorICAg IH0KKyAgfSwKKworICAvKioKKyAgICogVXBkYXRlIGEgY29tcG9uZW50IHVzaW5nIGEgbmV3IGVs ZW1lbnQuCisgICAqCisgICAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGludGVybmFsSW5zdGFu Y2UKKyAgICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IG5leHRFbGVtZW50CisgICAqIEBwYXJhbSB7 UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24KKyAgICogQHBhcmFtIHtvYmpl Y3R9IGNvbnRleHQKKyAgICogQGludGVybmFsCisgICAqLworICByZWNlaXZlQ29tcG9uZW50OiBm dW5jdGlvbiAoaW50ZXJuYWxJbnN0YW5jZSwgbmV4dEVsZW1lbnQsIHRyYW5zYWN0aW9uLCBjb250 ZXh0KSB7CisgICAgdmFyIHByZXZFbGVtZW50ID0gaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVs ZW1lbnQ7CisKKyAgICBpZiAobmV4dEVsZW1lbnQgPT09IHByZXZFbGVtZW50ICYmIGNvbnRleHQg PT09IGludGVybmFsSW5zdGFuY2UuX2NvbnRleHQpIHsKKyAgICAgIC8vIFNpbmNlIGVsZW1lbnRz IGFyZSBpbW11dGFibGUgYWZ0ZXIgdGhlIG93bmVyIGlzIHJlbmRlcmVkLAorICAgICAgLy8gd2Ug Y2FuIGRvIGEgY2hlYXAgaWRlbnRpdHkgY29tcGFyZSBoZXJlIHRvIGRldGVybWluZSBpZiB0aGlz IGlzIGEKKyAgICAgIC8vIHN1cGVyZmx1b3VzIHJlY29uY2lsZS4gSXQncyBwb3NzaWJsZSBmb3Ig c3RhdGUgdG8gYmUgbXV0YWJsZSBidXQgc3VjaAorICAgICAgLy8gY2hhbmdlIHNob3VsZCB0cmln Z2VyIGFuIHVwZGF0ZSBvZiB0aGUgb3duZXIgd2hpY2ggd291bGQgcmVjcmVhdGUKKyAgICAgIC8v IHRoZSBlbGVtZW50LiBXZSBleHBsaWNpdGx5IGNoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFu IG93bmVyIHNpbmNlCisgICAgICAvLyBpdCdzIHBvc3NpYmxlIGZvciBhbiBlbGVtZW50IGNyZWF0 ZWQgb3V0c2lkZSBhIGNvbXBvc2l0ZSB0byBiZQorICAgICAgLy8gZGVlcGx5IG11dGF0ZWQgYW5k IHJldXNlZC4KKworICAgICAgLy8gVE9ETzogQmFpbGluZyBvdXQgZWFybHkgaXMganVzdCBhIHBl cmYgb3B0aW1pemF0aW9uIHJpZ2h0PworICAgICAgLy8gVE9ETzogUmVtb3ZpbmcgdGhlIHJldHVy biBzdGF0ZW1lbnQgc2hvdWxkIGFmZmVjdCBjb3JyZWN0bmVzcz8KKyAgICAgIHJldHVybjsKKyAg ICB9CisKKyAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgewor ICAgICAgaWYgKGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQgIT09IDApIHsKKyAgICAgICAgUmVh Y3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uQmVmb3JlVXBkYXRlQ29tcG9uZW50KGludGVy bmFsSW5zdGFuY2UuX2RlYnVnSUQsIG5leHRFbGVtZW50KTsKKyAgICAgIH0KKyAgICB9CisKKyAg ICB2YXIgcmVmc0NoYW5nZWQgPSBSZWFjdFJlZi5zaG91bGRVcGRhdGVSZWZzKHByZXZFbGVtZW50 LCBuZXh0RWxlbWVudCk7CisKKyAgICBpZiAocmVmc0NoYW5nZWQpIHsKKyAgICAgIFJlYWN0UmVm LmRldGFjaFJlZnMoaW50ZXJuYWxJbnN0YW5jZSwgcHJldkVsZW1lbnQpOworICAgIH0KKworICAg IGludGVybmFsSW5zdGFuY2UucmVjZWl2ZUNvbXBvbmVudChuZXh0RWxlbWVudCwgdHJhbnNhY3Rp b24sIGNvbnRleHQpOworCisgICAgaWYgKHJlZnNDaGFuZ2VkICYmIGludGVybmFsSW5zdGFuY2Uu X2N1cnJlbnRFbGVtZW50ICYmIGludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50LnJlZiAh PSBudWxsKSB7CisgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVl KGF0dGFjaFJlZnMsIGludGVybmFsSW5zdGFuY2UpOworICAgIH0KKworICAgIGlmIChwcm9jZXNz LmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICBpZiAoaW50ZXJuYWxJbnN0 YW5jZS5fZGVidWdJRCAhPT0gMCkgeworICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1 Z1Rvb2wub25VcGRhdGVDb21wb25lbnQoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCk7CisgICAg ICB9CisgICAgfQorICB9LAorCisgIC8qKgorICAgKiBGbHVzaCBhbnkgZGlydHkgY2hhbmdlcyBp biBhIGNvbXBvbmVudC4KKyAgICoKKyAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gaW50ZXJu YWxJbnN0YW5jZQorICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5z YWN0aW9uCisgICAqIEBpbnRlcm5hbAorICAgKi8KKyAgcGVyZm9ybVVwZGF0ZUlmTmVjZXNzYXJ5 OiBmdW5jdGlvbiAoaW50ZXJuYWxJbnN0YW5jZSwgdHJhbnNhY3Rpb24sIHVwZGF0ZUJhdGNoTnVt YmVyKSB7CisgICAgaWYgKGludGVybmFsSW5zdGFuY2UuX3VwZGF0ZUJhdGNoTnVtYmVyICE9PSB1 cGRhdGVCYXRjaE51bWJlcikgeworICAgICAgLy8gVGhlIGNvbXBvbmVudCdzIGVucXVldWVkIGJh dGNoIG51bWJlciBzaG91bGQgYWx3YXlzIGJlIHRoZSBjdXJyZW50CisgICAgICAvLyBiYXRjaCBv ciB0aGUgZm9sbG93aW5nIG9uZS4KKyAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJv ZHVjdGlvbicgPyB3YXJuaW5nKGludGVybmFsSW5zdGFuY2UuX3VwZGF0ZUJhdGNoTnVtYmVyID09 IG51bGwgfHwgaW50ZXJuYWxJbnN0YW5jZS5fdXBkYXRlQmF0Y2hOdW1iZXIgPT09IHVwZGF0ZUJh dGNoTnVtYmVyICsgMSwgJ3BlcmZvcm1VcGRhdGVJZk5lY2Vzc2FyeTogVW5leHBlY3RlZCBiYXRj aCBudW1iZXIgKGN1cnJlbnQgJXMsICcgKyAncGVuZGluZyAlcyknLCB1cGRhdGVCYXRjaE51bWJl ciwgaW50ZXJuYWxJbnN0YW5jZS5fdXBkYXRlQmF0Y2hOdW1iZXIpIDogdm9pZCAwOworICAgICAg cmV0dXJuOworICAgIH0KKyAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0 aW9uJykgeworICAgICAgaWYgKGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQgIT09IDApIHsKKyAg ICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uQmVmb3JlVXBkYXRlQ29tcG9u ZW50KGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQsIGludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRF bGVtZW50KTsKKyAgICAgIH0KKyAgICB9CisgICAgaW50ZXJuYWxJbnN0YW5jZS5wZXJmb3JtVXBk YXRlSWZOZWNlc3NhcnkodHJhbnNhY3Rpb24pOworICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VO ViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJ RCAhPT0gMCkgeworICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25VcGRh dGVDb21wb25lbnQoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCk7CisgICAgICB9CisgICAgfQor ICB9CisKK307CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RSZWNvbmNpbGVyOwpcIE5vIG5ld2xp bmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3Iv cmVhY3QtZG9tL2xpYi9SZWFjdFJlZi5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVh Y3QtZG9tL2xpYi9SZWFjdFJlZi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw MC4uMDU1ZTYzMmMKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9y L3JlYWN0LWRvbS9saWIvUmVhY3RSZWYuanMKQEAgLTAsMCArMSw4OCBAQAorLyoqCisgKiBDb3B5 cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZl ZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5 bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJl Y3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0 ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBk aXJlY3RvcnkuCisgKgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgUmVhY3RPd25l ciA9IHJlcXVpcmUoJy4vUmVhY3RPd25lcicpOworCit2YXIgUmVhY3RSZWYgPSB7fTsKKworZnVu Y3Rpb24gYXR0YWNoUmVmKHJlZiwgY29tcG9uZW50LCBvd25lcikgeworICBpZiAodHlwZW9mIHJl ZiA9PT0gJ2Z1bmN0aW9uJykgeworICAgIHJlZihjb21wb25lbnQuZ2V0UHVibGljSW5zdGFuY2Uo KSk7CisgIH0gZWxzZSB7CisgICAgLy8gTGVnYWN5IHJlZgorICAgIFJlYWN0T3duZXIuYWRkQ29t cG9uZW50QXNSZWZUbyhjb21wb25lbnQsIHJlZiwgb3duZXIpOworICB9Cit9CisKK2Z1bmN0aW9u IGRldGFjaFJlZihyZWYsIGNvbXBvbmVudCwgb3duZXIpIHsKKyAgaWYgKHR5cGVvZiByZWYgPT09 ICdmdW5jdGlvbicpIHsKKyAgICByZWYobnVsbCk7CisgIH0gZWxzZSB7CisgICAgLy8gTGVnYWN5 IHJlZgorICAgIFJlYWN0T3duZXIucmVtb3ZlQ29tcG9uZW50QXNSZWZGcm9tKGNvbXBvbmVudCwg cmVmLCBvd25lcik7CisgIH0KK30KKworUmVhY3RSZWYuYXR0YWNoUmVmcyA9IGZ1bmN0aW9uIChp bnN0YW5jZSwgZWxlbWVudCkgeworICBpZiAoZWxlbWVudCA9PT0gbnVsbCB8fCB0eXBlb2YgZWxl bWVudCAhPT0gJ29iamVjdCcpIHsKKyAgICByZXR1cm47CisgIH0KKyAgdmFyIHJlZiA9IGVsZW1l bnQucmVmOworICBpZiAocmVmICE9IG51bGwpIHsKKyAgICBhdHRhY2hSZWYocmVmLCBpbnN0YW5j ZSwgZWxlbWVudC5fb3duZXIpOworICB9Cit9OworCitSZWFjdFJlZi5zaG91bGRVcGRhdGVSZWZz ID0gZnVuY3Rpb24gKHByZXZFbGVtZW50LCBuZXh0RWxlbWVudCkgeworICAvLyBJZiBlaXRoZXIg dGhlIG93bmVyIG9yIGEgYHJlZmAgaGFzIGNoYW5nZWQsIG1ha2Ugc3VyZSB0aGUgbmV3ZXN0IG93 bmVyCisgIC8vIGhhcyBzdG9yZWQgYSByZWZlcmVuY2UgdG8gYHRoaXNgLCBhbmQgdGhlIHByZXZp b3VzIG93bmVyIChpZiBkaWZmZXJlbnQpCisgIC8vIGhhcyBmb3Jnb3R0ZW4gdGhlIHJlZmVyZW5j ZSB0byBgdGhpc2AuIFdlIHVzZSB0aGUgZWxlbWVudCBpbnN0ZWFkCisgIC8vIG9mIHRoZSBwdWJs aWMgdGhpcy5wcm9wcyBiZWNhdXNlIHRoZSBwb3N0IHByb2Nlc3NpbmcgY2Fubm90IGRldGVybWlu ZQorICAvLyBhIHJlZi4gVGhlIHJlZiBjb25jZXB0dWFsbHkgbGl2ZXMgb24gdGhlIGVsZW1lbnQu CisKKyAgLy8gVE9ETzogU2hvdWxkIHRoaXMgZXZlbiBiZSBwb3NzaWJsZT8gVGhlIG93bmVyIGNh bm5vdCBjaGFuZ2UgYmVjYXVzZQorICAvLyBpdCdzIGZvcmJpZGRlbiBieSBzaG91bGRVcGRhdGVS ZWFjdENvbXBvbmVudC4gVGhlIHJlZiBjYW4gY2hhbmdlCisgIC8vIGlmIHlvdSBzd2FwIHRoZSBr ZXlzIG9mIGJ1dCBub3QgdGhlIHJlZnMuIFJlY29uc2lkZXIgd2hlcmUgdGhpcyBjaGVjaworICAv LyBpcyBtYWRlLiBJdCBwcm9iYWJseSBiZWxvbmdzIHdoZXJlIHRoZSBrZXkgY2hlY2tpbmcgYW5k CisgIC8vIGluc3RhbnRpYXRlUmVhY3RDb21wb25lbnQgaXMgZG9uZS4KKworICB2YXIgcHJldlJl ZiA9IG51bGw7CisgIHZhciBwcmV2T3duZXIgPSBudWxsOworICBpZiAocHJldkVsZW1lbnQgIT09 IG51bGwgJiYgdHlwZW9mIHByZXZFbGVtZW50ID09PSAnb2JqZWN0JykgeworICAgIHByZXZSZWYg PSBwcmV2RWxlbWVudC5yZWY7CisgICAgcHJldk93bmVyID0gcHJldkVsZW1lbnQuX293bmVyOwor ICB9CisKKyAgdmFyIG5leHRSZWYgPSBudWxsOworICB2YXIgbmV4dE93bmVyID0gbnVsbDsKKyAg aWYgKG5leHRFbGVtZW50ICE9PSBudWxsICYmIHR5cGVvZiBuZXh0RWxlbWVudCA9PT0gJ29iamVj dCcpIHsKKyAgICBuZXh0UmVmID0gbmV4dEVsZW1lbnQucmVmOworICAgIG5leHRPd25lciA9IG5l eHRFbGVtZW50Ll9vd25lcjsKKyAgfQorCisgIHJldHVybiBwcmV2UmVmICE9PSBuZXh0UmVmIHx8 CisgIC8vIElmIG93bmVyIGNoYW5nZXMgYnV0IHdlIGhhdmUgYW4gdW5jaGFuZ2VkIGZ1bmN0aW9u IHJlZiwgZG9uJ3QgdXBkYXRlIHJlZnMKKyAgdHlwZW9mIG5leHRSZWYgPT09ICdzdHJpbmcnICYm IG5leHRPd25lciAhPT0gcHJldk93bmVyOworfTsKKworUmVhY3RSZWYuZGV0YWNoUmVmcyA9IGZ1 bmN0aW9uIChpbnN0YW5jZSwgZWxlbWVudCkgeworICBpZiAoZWxlbWVudCA9PT0gbnVsbCB8fCB0 eXBlb2YgZWxlbWVudCAhPT0gJ29iamVjdCcpIHsKKyAgICByZXR1cm47CisgIH0KKyAgdmFyIHJl ZiA9IGVsZW1lbnQucmVmOworICBpZiAocmVmICE9IG51bGwpIHsKKyAgICBkZXRhY2hSZWYocmVm LCBpbnN0YW5jZSwgZWxlbWVudC5fb3duZXIpOworICB9Cit9OworCittb2R1bGUuZXhwb3J0cyA9 IFJlYWN0UmVmOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9w Z2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdFJlaWZpZWRZaWVsZC5qcyBi L3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdFJlaWZpZWRZaWVs ZC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uN2M5OTJhNTgKLS0tIC9k ZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVh Y3RSZWlmaWVkWWllbGQuanMKQEAgLTAsMCArMSwzMCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAx My1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg KiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5z ZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2Yg dGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0 cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3Rvcnku CisgKgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX3JlcXVpcmUgPSByZXF1aXJl KCcuL1JlYWN0RmliZXInKSwKKyAgICBjcmVhdGVGaWJlckZyb21FbGVtZW50VHlwZSA9IF9yZXF1 aXJlLmNyZWF0ZUZpYmVyRnJvbUVsZW1lbnRUeXBlOworCitleHBvcnRzLmNyZWF0ZVJlaWZpZWRZ aWVsZCA9IGZ1bmN0aW9uICh5aWVsZE5vZGUpIHsKKyAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXJG cm9tRWxlbWVudFR5cGUoeWllbGROb2RlLmNvbnRpbnVhdGlvbiwgeWllbGROb2RlLmtleSk7Cisg IHJldHVybiB7CisgICAgY29udGludWF0aW9uOiBmaWJlciwKKyAgICBwcm9wczogeWllbGROb2Rl LnByb3BzCisgIH07Cit9OworCitleHBvcnRzLmNyZWF0ZVVwZGF0ZWRSZWlmaWVkWWllbGQgPSBm dW5jdGlvbiAocHJldmlvdXNZaWVsZCwgeWllbGROb2RlKSB7CisgIHJldHVybiB7CisgICAgY29u dGludWF0aW9uOiBwcmV2aW91c1lpZWxkLmNvbnRpbnVhdGlvbiwKKyAgICBwcm9wczogeWllbGRO b2RlLnByb3BzCisgIH07Cit9OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdp dCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdFNlcnZlckJh dGNoaW5nU3RyYXRlZ3kuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9s aWIvUmVhY3RTZXJ2ZXJCYXRjaGluZ1N0cmF0ZWd5LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAwLi4wZjA4MmE0MgotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0 YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdFNlcnZlckJhdGNoaW5nU3RyYXRlZ3kuanMK QEAgLTAsMCArMSwyMSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9v aywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2Rl IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAq IExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4g QW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4g dGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ug c3RyaWN0JzsKKwordmFyIFJlYWN0U2VydmVyQmF0Y2hpbmdTdHJhdGVneSA9IHsKKyAgaXNCYXRj aGluZ1VwZGF0ZXM6IGZhbHNlLAorICBiYXRjaGVkVXBkYXRlczogZnVuY3Rpb24gKGNhbGxiYWNr KSB7CisgICAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgaGVyZS4gRHVyaW5nIHRoZSBzZXJ2ZXIgcmVu ZGVyaW5nIHdlIGRvbid0IHdhbnQgdG8KKyAgICAvLyBzY2hlZHVsZSBhbnkgdXBkYXRlcy4gV2Ug d2lsbCBzaW1wbHkgaWdub3JlIHRoZW0uCisgIH0KK307CisKK21vZHVsZS5leHBvcnRzID0gUmVh Y3RTZXJ2ZXJCYXRjaGluZ1N0cmF0ZWd5OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlm ZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdFNl cnZlclJlbmRlcmluZy5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xp Yi9SZWFjdFNlcnZlclJlbmRlcmluZy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw MDAwMC4uMWY4ZTMwZTUKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVu ZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RTZXJ2ZXJSZW5kZXJpbmcuanMKQEAgLTAsMCArMSw4OSBA QAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxs IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVu ZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBp biB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBn cmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmls ZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisndXNlIHN0cmljdCc7CisKK3ZhciBf cHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7CisKK3ZhciBS ZWFjdCA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdCcpOwordmFyIFJlYWN0RE9NQ29udGFpbmVy SW5mbyA9IHJlcXVpcmUoJy4vUmVhY3RET01Db250YWluZXJJbmZvJyk7Cit2YXIgUmVhY3REZWZh dWx0QmF0Y2hpbmdTdHJhdGVneSA9IHJlcXVpcmUoJy4vUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJh dGVneScpOwordmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdEluc3Ry dW1lbnRhdGlvbicpOwordmFyIFJlYWN0TWFya3VwQ2hlY2tzdW0gPSByZXF1aXJlKCcuL1JlYWN0 TWFya3VwQ2hlY2tzdW0nKTsKK3ZhciBSZWFjdFJlY29uY2lsZXIgPSByZXF1aXJlKCcuL1JlYWN0 UmVjb25jaWxlcicpOwordmFyIFJlYWN0U2VydmVyQmF0Y2hpbmdTdHJhdGVneSA9IHJlcXVpcmUo Jy4vUmVhY3RTZXJ2ZXJCYXRjaGluZ1N0cmF0ZWd5Jyk7Cit2YXIgUmVhY3RTZXJ2ZXJSZW5kZXJp bmdUcmFuc2FjdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlv bicpOwordmFyIFJlYWN0VXBkYXRlcyA9IHJlcXVpcmUoJy4vUmVhY3RVcGRhdGVzJyk7CisKK3Zh ciBlbXB0eU9iamVjdCA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5T2JqZWN0Jyk7Cit2YXIgaW5z dGFudGlhdGVSZWFjdENvbXBvbmVudCA9IHJlcXVpcmUoJy4vaW5zdGFudGlhdGVSZWFjdENvbXBv bmVudCcpOwordmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpOwor Cit2YXIgcGVuZGluZ1RyYW5zYWN0aW9ucyA9IDA7CisKKy8qKgorICogQHBhcmFtIHtSZWFjdEVs ZW1lbnR9IGVsZW1lbnQKKyAqIEByZXR1cm4ge3N0cmluZ30gdGhlIEhUTUwgbWFya3VwCisgKi8K K2Z1bmN0aW9uIHJlbmRlclRvU3RyaW5nSW1wbChlbGVtZW50LCBtYWtlU3RhdGljTWFya3VwKSB7 CisgIHZhciB0cmFuc2FjdGlvbjsKKyAgdHJ5IHsKKyAgICBSZWFjdFVwZGF0ZXMuaW5qZWN0aW9u LmluamVjdEJhdGNoaW5nU3RyYXRlZ3koUmVhY3RTZXJ2ZXJCYXRjaGluZ1N0cmF0ZWd5KTsKKwor ICAgIHRyYW5zYWN0aW9uID0gUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbi5nZXRQb29s ZWQobWFrZVN0YXRpY01hcmt1cCk7CisKKyAgICBwZW5kaW5nVHJhbnNhY3Rpb25zKys7CisKKyAg ICByZXR1cm4gdHJhbnNhY3Rpb24ucGVyZm9ybShmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgY29t cG9uZW50SW5zdGFuY2UgPSBpbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50KGVsZW1lbnQsIHRydWUp OworICAgICAgdmFyIG1hcmt1cCA9IFJlYWN0UmVjb25jaWxlci5tb3VudENvbXBvbmVudChjb21w b25lbnRJbnN0YW5jZSwgdHJhbnNhY3Rpb24sIG51bGwsIFJlYWN0RE9NQ29udGFpbmVySW5mbygp LCBlbXB0eU9iamVjdCwgMCAvKiBwYXJlbnREZWJ1Z0lEICovCisgICAgICApOworICAgICAgaWYg KHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICAgUmVhY3RJ bnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uVW5tb3VudENvbXBvbmVudChjb21wb25lbnRJbnN0 YW5jZS5fZGVidWdJRCk7CisgICAgICB9CisgICAgICBpZiAoIW1ha2VTdGF0aWNNYXJrdXApIHsK KyAgICAgICAgbWFya3VwID0gUmVhY3RNYXJrdXBDaGVja3N1bS5hZGRDaGVja3N1bVRvTWFya3Vw KG1hcmt1cCk7CisgICAgICB9CisgICAgICByZXR1cm4gbWFya3VwOworICAgIH0sIG51bGwpOwor ICB9IGZpbmFsbHkgeworICAgIHBlbmRpbmdUcmFuc2FjdGlvbnMtLTsKKyAgICBSZWFjdFNlcnZl clJlbmRlcmluZ1RyYW5zYWN0aW9uLnJlbGVhc2UodHJhbnNhY3Rpb24pOworICAgIC8vIFJldmVy dCB0byB0aGUgRE9NIGJhdGNoaW5nIHN0cmF0ZWd5IHNpbmNlIHRoZXNlIHR3byByZW5kZXJlcnMK KyAgICAvLyBjdXJyZW50bHkgc2hhcmUgdGhlc2Ugc3RhdGVmdWwgbW9kdWxlcy4KKyAgICBpZiAo IXBlbmRpbmdUcmFuc2FjdGlvbnMpIHsKKyAgICAgIFJlYWN0VXBkYXRlcy5pbmplY3Rpb24uaW5q ZWN0QmF0Y2hpbmdTdHJhdGVneShSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5KTsKKyAgICB9 CisgIH0KK30KKworLyoqCisgKiBSZW5kZXIgYSBSZWFjdEVsZW1lbnQgdG8gaXRzIGluaXRpYWwg SFRNTC4gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIG9uIHRoZQorICogc2VydmVyLgorICogU2Vl IGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1s I3JlYWN0ZG9tc2VydmVyLnJlbmRlcnRvc3RyaW5nCisgKi8KK2Z1bmN0aW9uIHJlbmRlclRvU3Ry aW5nKGVsZW1lbnQpIHsKKyAgIVJlYWN0LmlzVmFsaWRFbGVtZW50KGVsZW1lbnQpID8gcHJvY2Vz cy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3JlbmRl clRvU3RyaW5nKCk6IFlvdSBtdXN0IHBhc3MgYSB2YWxpZCBSZWFjdEVsZW1lbnQuJykgOiBfcHJv ZEludmFyaWFudCgnNDYnKSA6IHZvaWQgMDsKKyAgcmV0dXJuIHJlbmRlclRvU3RyaW5nSW1wbChl bGVtZW50LCBmYWxzZSk7Cit9CisKKy8qKgorICogU2ltaWxhciB0byByZW5kZXJUb1N0cmluZywg ZXhjZXB0IHRoaXMgZG9lc24ndCBjcmVhdGUgZXh0cmEgRE9NIGF0dHJpYnV0ZXMKKyAqIHN1Y2gg YXMgZGF0YS1yZWFjdC1pZCB0aGF0IFJlYWN0IHVzZXMgaW50ZXJuYWxseS4KKyAqIFNlZSBodHRw czovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFj dGRvbXNlcnZlci5yZW5kZXJ0b3N0YXRpY21hcmt1cAorICovCitmdW5jdGlvbiByZW5kZXJUb1N0 YXRpY01hcmt1cChlbGVtZW50KSB7CisgICFSZWFjdC5pc1ZhbGlkRWxlbWVudChlbGVtZW50KSA/ IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2Us ICdyZW5kZXJUb1N0YXRpY01hcmt1cCgpOiBZb3UgbXVzdCBwYXNzIGEgdmFsaWQgUmVhY3RFbGVt ZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzQ3JykgOiB2b2lkIDA7CisgIHJldHVybiByZW5kZXJU b1N0cmluZ0ltcGwoZWxlbWVudCwgdHJ1ZSk7Cit9CisKK21vZHVsZS5leHBvcnRzID0geworICBy ZW5kZXJUb1N0cmluZzogcmVuZGVyVG9TdHJpbmcsCisgIHJlbmRlclRvU3RhdGljTWFya3VwOiBy ZW5kZXJUb1N0YXRpY01hcmt1cAorfTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYg LS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RTZXJ2 ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbi5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVh Y3QtZG9tL2xpYi9SZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9uLmpzCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi4xNTU0NDk5MQotLS0gL2Rldi9udWxsCisrKyBiL3dl Yi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdFNlcnZlclJlbmRlcmlu Z1RyYW5zYWN0aW9uLmpzCkBAIC0wLDAgKzEsODkgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTQt cHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog VGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2Ug Zm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRo aXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMg Y2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5Lgor ICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0 LWFzc2lnbicpOworCit2YXIgUG9vbGVkQ2xhc3MgPSByZXF1aXJlKCcuL1Bvb2xlZENsYXNzJyk7 Cit2YXIgVHJhbnNhY3Rpb24gPSByZXF1aXJlKCcuL1RyYW5zYWN0aW9uJyk7Cit2YXIgUmVhY3RJ bnN0cnVtZW50YXRpb24gPSByZXF1aXJlKCcuL1JlYWN0SW5zdHJ1bWVudGF0aW9uJyk7Cit2YXIg UmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZSA9IHJlcXVpcmUoJy4vUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1 ZScpOworCisvKioKKyAqIEV4ZWN1dGVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIGBUcmFuc2Fj dGlvbmAgaW5zdGFuY2UuIENvbnNpZGVyIHRoZXNlIGFzCisgKiBiZWluZyBtZW1iZXIgbWV0aG9k cywgYnV0IHdpdGggYW4gaW1wbGllZCBvcmRlcmluZyB3aGlsZSBiZWluZyBpc29sYXRlZCBmcm9t CisgKiBlYWNoIG90aGVyLgorICovCit2YXIgVFJBTlNBQ1RJT05fV1JBUFBFUlMgPSBbXTsKKwor aWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgVFJBTlNBQ1RJ T05fV1JBUFBFUlMucHVzaCh7CisgICAgaW5pdGlhbGl6ZTogUmVhY3RJbnN0cnVtZW50YXRpb24u ZGVidWdUb29sLm9uQmVnaW5GbHVzaCwKKyAgICBjbG9zZTogUmVhY3RJbnN0cnVtZW50YXRpb24u ZGVidWdUb29sLm9uRW5kRmx1c2gKKyAgfSk7Cit9CisKK3ZhciBub29wQ2FsbGJhY2tRdWV1ZSA9 IHsKKyAgZW5xdWV1ZTogZnVuY3Rpb24gKCkge30KK307CisKKy8qKgorICogQGNsYXNzIFJlYWN0 U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb24KKyAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVuZGVyVG9T dGF0aWNNYXJrdXAKKyAqLworZnVuY3Rpb24gUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlv bihyZW5kZXJUb1N0YXRpY01hcmt1cCkgeworICB0aGlzLnJlaW5pdGlhbGl6ZVRyYW5zYWN0aW9u KCk7CisgIHRoaXMucmVuZGVyVG9TdGF0aWNNYXJrdXAgPSByZW5kZXJUb1N0YXRpY01hcmt1cDsK KyAgdGhpcy51c2VDcmVhdGVFbGVtZW50ID0gZmFsc2U7CisgIHRoaXMudXBkYXRlUXVldWUgPSBu ZXcgUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZSh0aGlzKTsKK30KKwordmFyIE1peGluID0geworICAv KioKKyAgICogQHNlZSBUcmFuc2FjdGlvbgorICAgKiBAYWJzdHJhY3QKKyAgICogQGZpbmFsCisg ICAqIEByZXR1cm4ge2FycmF5fSBFbXB0eSBsaXN0IG9mIG9wZXJhdGlvbiB3cmFwIHByb2NlZHVy ZXMuCisgICAqLworICBnZXRUcmFuc2FjdGlvbldyYXBwZXJzOiBmdW5jdGlvbiAoKSB7CisgICAg cmV0dXJuIFRSQU5TQUNUSU9OX1dSQVBQRVJTOworICB9LAorCisgIC8qKgorICAgKiBAcmV0dXJu IHtvYmplY3R9IFRoZSBxdWV1ZSB0byBjb2xsZWN0IGBvbkRPTVJlYWR5YCBjYWxsYmFja3Mgd2l0 aC4KKyAgICovCisgIGdldFJlYWN0TW91bnRSZWFkeTogZnVuY3Rpb24gKCkgeworICAgIHJldHVy biBub29wQ2FsbGJhY2tRdWV1ZTsKKyAgfSwKKworICAvKioKKyAgICogQHJldHVybiB7b2JqZWN0 fSBUaGUgcXVldWUgdG8gY29sbGVjdCBSZWFjdCBhc3luYyBldmVudHMuCisgICAqLworICBnZXRV cGRhdGVRdWV1ZTogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiB0aGlzLnVwZGF0ZVF1ZXVlOwor ICB9LAorCisgIC8qKgorICAgKiBgUG9vbGVkQ2xhc3NgIGxvb2tzIGZvciB0aGlzLCBhbmQgd2ls bCBpbnZva2UgdGhpcyBiZWZvcmUgYWxsb3dpbmcgdGhpcworICAgKiBpbnN0YW5jZSB0byBiZSBy ZXVzZWQuCisgICAqLworICBkZXN0cnVjdG9yOiBmdW5jdGlvbiAoKSB7fSwKKworICBjaGVja3Bv aW50OiBmdW5jdGlvbiAoKSB7fSwKKworICByb2xsYmFjazogZnVuY3Rpb24gKCkge30KK307CisK K19hc3NpZ24oUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbi5wcm90b3R5cGUsIFRyYW5z YWN0aW9uLCBNaXhpbik7CisKK1Bvb2xlZENsYXNzLmFkZFBvb2xpbmdUbyhSZWFjdFNlcnZlclJl bmRlcmluZ1RyYW5zYWN0aW9uKTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdFNlcnZlclJlbmRl cmluZ1RyYW5zYWN0aW9uOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBh L3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdFNlcnZlclVwZGF0 ZVF1ZXVlLmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0 U2VydmVyVXBkYXRlUXVldWUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAu LmNhYjY2OTkyCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9y ZWFjdC1kb20vbGliL1JlYWN0U2VydmVyVXBkYXRlUXVldWUuanMKQEAgLTAsMCArMSwxMzggQEAK Ky8qKgorICogQ29weXJpZ2h0IDIwMTUtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCBy aWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRl ciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4g dGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3Jh bnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUg aW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKKwor ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShp bnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJD YW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9CisKK3ZhciBSZWFjdFVwZGF0 ZVF1ZXVlID0gcmVxdWlyZSgnLi9SZWFjdFVwZGF0ZVF1ZXVlJyk7CisKK3ZhciB3YXJuaW5nID0g cmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpOworCitmdW5jdGlvbiB3YXJuTm9vcChwdWJsaWNJ bnN0YW5jZSwgY2FsbGVyTmFtZSkgeworICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdw cm9kdWN0aW9uJykgeworICAgIHZhciBjb25zdHJ1Y3RvciA9IHB1YmxpY0luc3RhbmNlLmNvbnN0 cnVjdG9yOworICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJu aW5nKGZhbHNlLCAnJXMoLi4uKTogQ2FuIG9ubHkgdXBkYXRlIGEgbW91bnRpbmcgY29tcG9uZW50 LiAnICsgJ1RoaXMgdXN1YWxseSBtZWFucyB5b3UgY2FsbGVkICVzKCkgb3V0c2lkZSBjb21wb25l bnRXaWxsTW91bnQoKSBvbiB0aGUgc2VydmVyLiAnICsgJ1RoaXMgaXMgYSBuby1vcC4gUGxlYXNl IGNoZWNrIHRoZSBjb2RlIGZvciB0aGUgJXMgY29tcG9uZW50LicsIGNhbGxlck5hbWUsIGNhbGxl ck5hbWUsIGNvbnN0cnVjdG9yICYmIChjb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCBjb25zdHJ1 Y3Rvci5uYW1lKSB8fCAnUmVhY3RDbGFzcycpIDogdm9pZCAwOworICB9Cit9CisKKy8qKgorICog VGhpcyBpcyB0aGUgdXBkYXRlIHF1ZXVlIHVzZWQgZm9yIHNlcnZlciByZW5kZXJpbmcuCisgKiBJ dCBkZWxlZ2F0ZXMgdG8gUmVhY3RVcGRhdGVRdWV1ZSB3aGlsZSBzZXJ2ZXIgcmVuZGVyaW5nIGlz IGluIHByb2dyZXNzIGFuZAorICogc3dpdGNoZXMgdG8gUmVhY3ROb29wVXBkYXRlUXVldWUgYWZ0 ZXIgdGhlIHRyYW5zYWN0aW9uIGhhcyBjb21wbGV0ZWQuCisgKiBAY2xhc3MgUmVhY3RTZXJ2ZXJV cGRhdGVRdWV1ZQorICogQHBhcmFtIHtUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24KKyAqLworCit2 YXIgUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZSA9IGZ1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gUmVh Y3RTZXJ2ZXJVcGRhdGVRdWV1ZSh0cmFuc2FjdGlvbikgeworICAgIF9jbGFzc0NhbGxDaGVjayh0 aGlzLCBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlKTsKKworICAgIHRoaXMudHJhbnNhY3Rpb24gPSB0 cmFuc2FjdGlvbjsKKyAgfQorCisgIC8qKgorICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhp cyBjb21wb3NpdGUgY29tcG9uZW50IGlzIG1vdW50ZWQuCisgICAqIEBwYXJhbSB7UmVhY3RDbGFz c30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHdlIHdhbnQgdG8gdGVzdC4KKyAgICogQHJl dHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBtb3VudGVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAqIEBw cm90ZWN0ZWQKKyAgICogQGZpbmFsCisgICAqLworCisKKyAgUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1 ZS5wcm90b3R5cGUuaXNNb3VudGVkID0gZnVuY3Rpb24gaXNNb3VudGVkKHB1YmxpY0luc3RhbmNl KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9OworCisgIC8qKgorICAgKiBFbnF1ZXVlIGEgY2Fs bGJhY2sgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGFmdGVyIGFsbCB0aGUgcGVuZGluZyB1cGRhdGVz CisgICAqIGhhdmUgcHJvY2Vzc2VkLgorICAgKgorICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1 YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0byB1c2UgYXMgYHRoaXNgIGNvbnRleHQuCisgICAq IEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgc3RhdGUgaXMgdXBkYXRl ZC4KKyAgICogQGludGVybmFsCisgICAqLworCisKKyAgUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZS5w cm90b3R5cGUuZW5xdWV1ZUNhbGxiYWNrID0gZnVuY3Rpb24gZW5xdWV1ZUNhbGxiYWNrKHB1Ymxp Y0luc3RhbmNlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkgeworICAgIGlmICh0aGlzLnRyYW5zYWN0 aW9uLmlzSW5UcmFuc2FjdGlvbigpKSB7CisgICAgICBSZWFjdFVwZGF0ZVF1ZXVlLmVucXVldWVD YWxsYmFjayhwdWJsaWNJbnN0YW5jZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpOworICAgIH0KKyAg fTsKKworICAvKioKKyAgICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBp bnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aAorICAgKiBjZXJ0YWludHkgdGhhdCB3ZSBhcmUg Kipub3QqKiBpbiBhIERPTSB0cmFuc2FjdGlvbi4KKyAgICoKKyAgICogWW91IG1heSB3YW50IHRv IGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZQor ICAgKiBjb21wb25lbnQncyBzdGF0ZSBoYXMgY2hhbmdlZCBidXQgYHNldFN0YXRlYCB3YXMgbm90 IGNhbGxlZC4KKyAgICoKKyAgICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVu dFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZQorICAgKiBgY29tcG9uZW50V2lsbFVwZGF0ZWAg YW5kIGBjb21wb25lbnREaWRVcGRhdGVgLgorICAgKgorICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9 IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci4KKyAgICog QGludGVybmFsCisgICAqLworCisKKyAgUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZS5wcm90b3R5cGUu ZW5xdWV1ZUZvcmNlVXBkYXRlID0gZnVuY3Rpb24gZW5xdWV1ZUZvcmNlVXBkYXRlKHB1YmxpY0lu c3RhbmNlKSB7CisgICAgaWYgKHRoaXMudHJhbnNhY3Rpb24uaXNJblRyYW5zYWN0aW9uKCkpIHsK KyAgICAgIFJlYWN0VXBkYXRlUXVldWUuZW5xdWV1ZUZvcmNlVXBkYXRlKHB1YmxpY0luc3RhbmNl KTsKKyAgICB9IGVsc2UgeworICAgICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdmb3JjZVVw ZGF0ZScpOworICAgIH0KKyAgfTsKKworICAvKioKKyAgICogUmVwbGFjZXMgYWxsIG9mIHRoZSBz dGF0ZS4gQWx3YXlzIHVzZSB0aGlzIG9yIGBzZXRTdGF0ZWAgdG8gbXV0YXRlIHN0YXRlLgorICAg KiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuCisgICAqCisgICAq IFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0 ZWx5IHVwZGF0ZWQsIHNvCisgICAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGlu ZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuCisgICAqCisgICAqIEBwYXJh bSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJl cmVuZGVyLgorICAgKiBAcGFyYW0ge29iamVjdHxmdW5jdGlvbn0gY29tcGxldGVTdGF0ZSBOZXh0 IHN0YXRlLgorICAgKiBAaW50ZXJuYWwKKyAgICovCisKKworICBSZWFjdFNlcnZlclVwZGF0ZVF1 ZXVlLnByb3RvdHlwZS5lbnF1ZXVlUmVwbGFjZVN0YXRlID0gZnVuY3Rpb24gZW5xdWV1ZVJlcGxh Y2VTdGF0ZShwdWJsaWNJbnN0YW5jZSwgY29tcGxldGVTdGF0ZSkgeworICAgIGlmICh0aGlzLnRy YW5zYWN0aW9uLmlzSW5UcmFuc2FjdGlvbigpKSB7CisgICAgICBSZWFjdFVwZGF0ZVF1ZXVlLmVu cXVldWVSZXBsYWNlU3RhdGUocHVibGljSW5zdGFuY2UsIGNvbXBsZXRlU3RhdGUpOworICAgIH0g ZWxzZSB7CisgICAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ3JlcGxhY2VTdGF0ZScpOwor ICAgIH0KKyAgfTsKKworICAvKioKKyAgICogU2V0cyBhIHN1YnNldCBvZiB0aGUgc3RhdGUuIFRo aXMgb25seSBleGlzdHMgYmVjYXVzZSBfcGVuZGluZ1N0YXRlIGlzCisgICAqIGludGVybmFsLiBU aGlzIHByb3ZpZGVzIGEgbWVyZ2luZyBzdHJhdGVneSB0aGF0IGlzIG5vdCBhdmFpbGFibGUgdG8g ZGVlcAorICAgKiBwcm9wZXJ0aWVzIHdoaWNoIGlzIGNvbmZ1c2luZy4gVE9ETzogRXhwb3NlIHBl bmRpbmdTdGF0ZSBvciBkb24ndCB1c2UgaXQKKyAgICogZHVyaW5nIHRoZSBtZXJnZS4KKyAgICoK KyAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhh dCBzaG91bGQgcmVyZW5kZXIuCisgICAqIEBwYXJhbSB7b2JqZWN0fGZ1bmN0aW9ufSBwYXJ0aWFs U3RhdGUgTmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIHN0YXRlLgorICAgKiBA aW50ZXJuYWwKKyAgICovCisKKworICBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlLnByb3RvdHlwZS5l bnF1ZXVlU2V0U3RhdGUgPSBmdW5jdGlvbiBlbnF1ZXVlU2V0U3RhdGUocHVibGljSW5zdGFuY2Us IHBhcnRpYWxTdGF0ZSkgeworICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uLmlzSW5UcmFuc2FjdGlv bigpKSB7CisgICAgICBSZWFjdFVwZGF0ZVF1ZXVlLmVucXVldWVTZXRTdGF0ZShwdWJsaWNJbnN0 YW5jZSwgcGFydGlhbFN0YXRlKTsKKyAgICB9IGVsc2UgeworICAgICAgd2Fybk5vb3AocHVibGlj SW5zdGFuY2UsICdzZXRTdGF0ZScpOworICAgIH0KKyAgfTsKKworICByZXR1cm4gUmVhY3RTZXJ2 ZXJVcGRhdGVRdWV1ZTsKK30oKTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdFNlcnZlclVwZGF0 ZVF1ZXVlOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2Fk bWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdFNoYWxsb3dSZW5kZXJlci5qcyBi L3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdFNoYWxsb3dSZW5k ZXJlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uMTUwZmYzNzcKLS0t IC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIv UmVhY3RTaGFsbG93UmVuZGVyZXIuanMKQEAgLTAsMCArMSwxMzQgQEAKKy8qKgorICogQ29weXJp Z2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQu CisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxl IGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0 b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVu dCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGly ZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJvZEludmFyaWFudCA9 IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50JyksCisgICAgX2Fzc2lnbiA9IHJlcXVpcmUo J29iamVjdC1hc3NpZ24nKTsKKworZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBD b25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0 aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsg fSB9CisKK3ZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdCcpOwordmFyIFJlYWN0 RGVmYXVsdEluamVjdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3REZWZhdWx0SW5qZWN0aW9uJyk7Cit2 YXIgUmVhY3RDb21wb3NpdGVDb21wb25lbnQgPSByZXF1aXJlKCcuL1JlYWN0Q29tcG9zaXRlQ29t cG9uZW50Jyk7Cit2YXIgUmVhY3RSZWNvbmNpbGVyID0gcmVxdWlyZSgnLi9SZWFjdFJlY29uY2ls ZXInKTsKK3ZhciBSZWFjdFVwZGF0ZXMgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlcycpOworCit2 YXIgZW1wdHlPYmplY3QgPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eU9iamVjdCcpOwordmFyIGdl dE5leHREZWJ1Z0lEID0gcmVxdWlyZSgnLi9nZXROZXh0RGVidWdJRCcpOwordmFyIGludmFyaWFu dCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpOworCit2YXIgTm9vcEludGVybmFsQ29t cG9uZW50ID0gZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBOb29wSW50ZXJuYWxDb21wb25lbnQo ZWxlbWVudCkgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBOb29wSW50ZXJuYWxDb21wb25l bnQpOworCisgICAgdGhpcy5fcmVuZGVyZWRPdXRwdXQgPSBlbGVtZW50OworICAgIHRoaXMuX2N1 cnJlbnRFbGVtZW50ID0gZWxlbWVudDsKKworICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAh PT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICB0aGlzLl9kZWJ1Z0lEID0gZ2V0TmV4dERlYnVnSUQo KTsKKyAgICB9CisgIH0KKworICBOb29wSW50ZXJuYWxDb21wb25lbnQucHJvdG90eXBlLm1vdW50 Q29tcG9uZW50ID0gZnVuY3Rpb24gbW91bnRDb21wb25lbnQoKSB7fTsKKworICBOb29wSW50ZXJu YWxDb21wb25lbnQucHJvdG90eXBlLnJlY2VpdmVDb21wb25lbnQgPSBmdW5jdGlvbiByZWNlaXZl Q29tcG9uZW50KGVsZW1lbnQpIHsKKyAgICB0aGlzLl9yZW5kZXJlZE91dHB1dCA9IGVsZW1lbnQ7 CisgICAgdGhpcy5fY3VycmVudEVsZW1lbnQgPSBlbGVtZW50OworICB9OworCisgIE5vb3BJbnRl cm5hbENvbXBvbmVudC5wcm90b3R5cGUudW5tb3VudENvbXBvbmVudCA9IGZ1bmN0aW9uIHVubW91 bnRDb21wb25lbnQoKSB7fTsKKworICBOb29wSW50ZXJuYWxDb21wb25lbnQucHJvdG90eXBlLmdl dEhvc3ROb2RlID0gZnVuY3Rpb24gZ2V0SG9zdE5vZGUoKSB7CisgICAgcmV0dXJuIHVuZGVmaW5l ZDsKKyAgfTsKKworICBOb29wSW50ZXJuYWxDb21wb25lbnQucHJvdG90eXBlLmdldFB1YmxpY0lu c3RhbmNlID0gZnVuY3Rpb24gZ2V0UHVibGljSW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIG51bGw7 CisgIH07CisKKyAgcmV0dXJuIE5vb3BJbnRlcm5hbENvbXBvbmVudDsKK30oKTsKKwordmFyIFNo YWxsb3dDb21wb25lbnRXcmFwcGVyID0gZnVuY3Rpb24gKGVsZW1lbnQpIHsKKyAgLy8gVE9ETzog Q29uc29saWRhdGUgd2l0aCBpbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50CisgIGlmIChwcm9jZXNz LmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgdGhpcy5fZGVidWdJRCA9IGdl dE5leHREZWJ1Z0lEKCk7CisgIH0KKworICB0aGlzLmNvbnN0cnVjdChlbGVtZW50KTsKK307Citf YXNzaWduKFNoYWxsb3dDb21wb25lbnRXcmFwcGVyLnByb3RvdHlwZSwgUmVhY3RDb21wb3NpdGVD b21wb25lbnQsIHsKKyAgX2NvbnN0cnVjdENvbXBvbmVudDogUmVhY3RDb21wb3NpdGVDb21wb25l bnQuX2NvbnN0cnVjdENvbXBvbmVudFdpdGhvdXRPd25lciwKKyAgX2luc3RhbnRpYXRlUmVhY3RD b21wb25lbnQ6IGZ1bmN0aW9uIChlbGVtZW50KSB7CisgICAgcmV0dXJuIG5ldyBOb29wSW50ZXJu YWxDb21wb25lbnQoZWxlbWVudCk7CisgIH0sCisgIF9yZXBsYWNlTm9kZVdpdGhNYXJrdXA6IGZ1 bmN0aW9uICgpIHt9LAorICBfcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50OiBSZWFjdENvbXBvc2l0 ZUNvbXBvbmVudC5fcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50V2l0aG91dE93bmVyT3JDb250ZXh0 Cit9KTsKKworZnVuY3Rpb24gX2JhdGNoZWRSZW5kZXIocmVuZGVyZXIsIGVsZW1lbnQsIGNvbnRl eHQpIHsKKyAgdmFyIHRyYW5zYWN0aW9uID0gUmVhY3RVcGRhdGVzLlJlYWN0UmVjb25jaWxlVHJh bnNhY3Rpb24uZ2V0UG9vbGVkKHRydWUpOworICByZW5kZXJlci5fcmVuZGVyKGVsZW1lbnQsIHRy YW5zYWN0aW9uLCBjb250ZXh0KTsKKyAgUmVhY3RVcGRhdGVzLlJlYWN0UmVjb25jaWxlVHJhbnNh Y3Rpb24ucmVsZWFzZSh0cmFuc2FjdGlvbik7Cit9CisKK3ZhciBSZWFjdFNoYWxsb3dSZW5kZXJl ciA9IGZ1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gUmVhY3RTaGFsbG93UmVuZGVyZXIoKSB7Cisg ICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJlYWN0U2hhbGxvd1JlbmRlcmVyKTsKKworICAgIHRo aXMuX2luc3RhbmNlID0gbnVsbDsKKyAgfQorCisgIFJlYWN0U2hhbGxvd1JlbmRlcmVyLnByb3Rv dHlwZS5nZXRNb3VudGVkSW5zdGFuY2UgPSBmdW5jdGlvbiBnZXRNb3VudGVkSW5zdGFuY2UoKSB7 CisgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlID8gdGhpcy5faW5zdGFuY2UuX2luc3RhbmNlIDog bnVsbDsKKyAgfTsKKworICBSZWFjdFNoYWxsb3dSZW5kZXJlci5wcm90b3R5cGUucmVuZGVyID0g ZnVuY3Rpb24gcmVuZGVyKGVsZW1lbnQsIGNvbnRleHQpIHsKKyAgICAvLyBFbnN1cmUgd2UndmUg ZG9uZSB0aGUgZGVmYXVsdCBpbmplY3Rpb25zLiBUaGlzIG1pZ2h0IG5vdCBiZSB0cnVlIGluIHRo ZQorICAgIC8vIGNhc2Ugb2YgYSBzaW1wbGUgdGVzdCB0aGF0IG9ubHkgcmVxdWlyZXMgUmVhY3Qg YW5kIHRoZSBUZXN0VXRpbHMgaW4KKyAgICAvLyBjb25qdW5jdGlvbiB3aXRoIGFuIGlubGluZS1y ZXF1aXJlcyB0cmFuc2Zvcm0uCisgICAgUmVhY3REZWZhdWx0SW5qZWN0aW9uLmluamVjdCgpOwor CisgICAgIVJlYWN0LmlzVmFsaWRFbGVtZW50KGVsZW1lbnQpID8gcHJvY2Vzcy5lbnYuTk9ERV9F TlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0U2hhbGxvd1JlbmRl cmVyIHJlbmRlcigpOiBJbnZhbGlkIGNvbXBvbmVudCBlbGVtZW50LiVzJywgdHlwZW9mIGVsZW1l bnQgPT09ICdmdW5jdGlvbicgPyAnIEluc3RlYWQgb2YgcGFzc2luZyBhIGNvbXBvbmVudCBjbGFz cywgbWFrZSBzdXJlIHRvIGluc3RhbnRpYXRlICcgKyAnaXQgYnkgcGFzc2luZyBpdCB0byBSZWFj dC5jcmVhdGVFbGVtZW50LicgOiAnJykgOiBfcHJvZEludmFyaWFudCgnMTInLCB0eXBlb2YgZWxl bWVudCA9PT0gJ2Z1bmN0aW9uJyA/ICcgSW5zdGVhZCBvZiBwYXNzaW5nIGEgY29tcG9uZW50IGNs YXNzLCBtYWtlIHN1cmUgdG8gaW5zdGFudGlhdGUgJyArICdpdCBieSBwYXNzaW5nIGl0IHRvIFJl YWN0LmNyZWF0ZUVsZW1lbnQuJyA6ICcnKSA6IHZvaWQgMDsKKyAgICAhKHR5cGVvZiBlbGVtZW50 LnR5cGUgIT09ICdzdHJpbmcnKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlv bicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdFNoYWxsb3dSZW5kZXJlciByZW5kZXIoKTogU2hh bGxvdyByZW5kZXJpbmcgd29ya3Mgb25seSB3aXRoIGN1c3RvbSBjb21wb25lbnRzLCBub3QgcHJp bWl0aXZlcyAoJXMpLiBJbnN0ZWFkIG9mIGNhbGxpbmcgYC5yZW5kZXIoZWwpYCBhbmQgaW5zcGVj dGluZyB0aGUgcmVuZGVyZWQgb3V0cHV0LCBsb29rIGF0IGBlbC5wcm9wc2AgZGlyZWN0bHkgaW5z dGVhZC4nLCBlbGVtZW50LnR5cGUpIDogX3Byb2RJbnZhcmlhbnQoJzEzJywgZWxlbWVudC50eXBl KSA6IHZvaWQgMDsKKworICAgIGlmICghY29udGV4dCkgeworICAgICAgY29udGV4dCA9IGVtcHR5 T2JqZWN0OworICAgIH0KKyAgICBSZWFjdFVwZGF0ZXMuYmF0Y2hlZFVwZGF0ZXMoX2JhdGNoZWRS ZW5kZXIsIHRoaXMsIGVsZW1lbnQsIGNvbnRleHQpOworCisgICAgcmV0dXJuIHRoaXMuZ2V0UmVu ZGVyT3V0cHV0KCk7CisgIH07CisKKyAgUmVhY3RTaGFsbG93UmVuZGVyZXIucHJvdG90eXBlLmdl dFJlbmRlck91dHB1dCA9IGZ1bmN0aW9uIGdldFJlbmRlck91dHB1dCgpIHsKKyAgICByZXR1cm4g dGhpcy5faW5zdGFuY2UgJiYgdGhpcy5faW5zdGFuY2UuX3JlbmRlcmVkQ29tcG9uZW50ICYmIHRo aXMuX2luc3RhbmNlLl9yZW5kZXJlZENvbXBvbmVudC5fcmVuZGVyZWRPdXRwdXQgfHwgbnVsbDsK KyAgfTsKKworICBSZWFjdFNoYWxsb3dSZW5kZXJlci5wcm90b3R5cGUudW5tb3VudCA9IGZ1bmN0 aW9uIHVubW91bnQoKSB7CisgICAgaWYgKHRoaXMuX2luc3RhbmNlKSB7CisgICAgICBSZWFjdFJl Y29uY2lsZXIudW5tb3VudENvbXBvbmVudCh0aGlzLl9pbnN0YW5jZSwgZmFsc2UpOworICAgIH0K KyAgfTsKKworICBSZWFjdFNoYWxsb3dSZW5kZXJlci5wcm90b3R5cGUuX3JlbmRlciA9IGZ1bmN0 aW9uIF9yZW5kZXIoZWxlbWVudCwgdHJhbnNhY3Rpb24sIGNvbnRleHQpIHsKKyAgICBpZiAodGhp cy5faW5zdGFuY2UpIHsKKyAgICAgIFJlYWN0UmVjb25jaWxlci5yZWNlaXZlQ29tcG9uZW50KHRo aXMuX2luc3RhbmNlLCBlbGVtZW50LCB0cmFuc2FjdGlvbiwgY29udGV4dCk7CisgICAgfSBlbHNl IHsKKyAgICAgIHZhciBpbnN0YW5jZSA9IG5ldyBTaGFsbG93Q29tcG9uZW50V3JhcHBlcihlbGVt ZW50KTsKKyAgICAgIFJlYWN0UmVjb25jaWxlci5tb3VudENvbXBvbmVudChpbnN0YW5jZSwgdHJh bnNhY3Rpb24sIG51bGwsIG51bGwsIGNvbnRleHQsIDApOworICAgICAgdGhpcy5faW5zdGFuY2Ug PSBpbnN0YW5jZTsKKyAgICB9CisgIH07CisKKyAgcmV0dXJuIFJlYWN0U2hhbGxvd1JlbmRlcmVy OworfSgpOworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0U2hhbGxvd1JlbmRlcmVyOwpcIE5vIG5l d2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5k b3IvcmVhY3QtZG9tL2xpYi9SZWFjdFNpbXBsZUVtcHR5Q29tcG9uZW50LmpzIGIvd2ViL3BnYWRt aW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0U2ltcGxlRW1wdHlDb21wb25lbnQu anMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLmQzYzA0ZWZiCi0tLSAvZGV2 L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0 U2ltcGxlRW1wdHlDb21wb25lbnQuanMKQEAgLTAsMCArMSwzNiBAQAorLyoqCisgKiBDb3B5cmln aHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4K KyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUg bGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rv cnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50 IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJl Y3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9hc3NpZ24gPSByZXF1aXJl KCdvYmplY3QtYXNzaWduJyk7CisKK3ZhciBSZWFjdFJlY29uY2lsZXIgPSByZXF1aXJlKCcuL1Jl YWN0UmVjb25jaWxlcicpOworCit2YXIgUmVhY3RTaW1wbGVFbXB0eUNvbXBvbmVudCA9IGZ1bmN0 aW9uIChwbGFjZWhvbGRlckVsZW1lbnQsIGluc3RhbnRpYXRlKSB7CisgIHRoaXMuX2N1cnJlbnRF bGVtZW50ID0gbnVsbDsKKyAgdGhpcy5fcmVuZGVyZWRDb21wb25lbnQgPSBpbnN0YW50aWF0ZShw bGFjZWhvbGRlckVsZW1lbnQpOworfTsKK19hc3NpZ24oUmVhY3RTaW1wbGVFbXB0eUNvbXBvbmVu dC5wcm90b3R5cGUsIHsKKyAgbW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uICh0cmFuc2FjdGlvbiwg aG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIGNvbnRleHQsIHBhcmVudERlYnVnSUQgLy8g MCBpbiBwcm9kdWN0aW9uIGFuZCBmb3Igcm9vdHMKKyAgKSB7CisgICAgcmV0dXJuIFJlYWN0UmVj b25jaWxlci5tb3VudENvbXBvbmVudCh0aGlzLl9yZW5kZXJlZENvbXBvbmVudCwgdHJhbnNhY3Rp b24sIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCBjb250ZXh0LCBwYXJlbnREZWJ1Z0lE KTsKKyAgfSwKKyAgcmVjZWl2ZUNvbXBvbmVudDogZnVuY3Rpb24gKCkge30sCisgIGdldEhvc3RO b2RlOiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIFJlYWN0UmVjb25jaWxlci5nZXRIb3N0Tm9k ZSh0aGlzLl9yZW5kZXJlZENvbXBvbmVudCk7CisgIH0sCisgIHVubW91bnRDb21wb25lbnQ6IGZ1 bmN0aW9uICgpIHsKKyAgICBSZWFjdFJlY29uY2lsZXIudW5tb3VudENvbXBvbmVudCh0aGlzLl9y ZW5kZXJlZENvbXBvbmVudCk7CisgICAgdGhpcy5fcmVuZGVyZWRDb21wb25lbnQgPSBudWxsOwor ICB9Cit9KTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdFNpbXBsZUVtcHR5Q29tcG9uZW50Owpc IE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRp Yy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdFN5bnRoZXRpY0V2ZW50VHlwZS5qcyBiL3dlYi9w Z2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdFN5bnRoZXRpY0V2ZW50VHlw ZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uYTVhY2ExYzQKLS0tIC9k ZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVh Y3RTeW50aGV0aWNFdmVudFR5cGUuanMKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIENvcHlyaWdo dCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgor ICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBs aWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9y eSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQg cmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVj dG9yeS4KKyAqCisgKiBGbG93IHR5cGUgZm9yIFN5bnRoZXRpY0V2ZW50IGNsYXNzIHRoYXQgaW5j bHVkZXMgcHJpdmF0ZSBwcm9wZXJ0aWVzCisgKgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOwpc IE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRp Yy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdFRlc3RVdGlscy5qcyBiL3dlYi9wZ2FkbWluL3N0 YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdFRlc3RVdGlscy5qcwpuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMC4uNWI5NTA1NDUKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIv cGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RUZXN0VXRpbHMuanMKQEAg LTAsMCArMSw0MTEgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ss IEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBp cyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBM SUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFu IGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRo ZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0 cmljdCc7CisKK3ZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJp YW50JyksCisgICAgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTsKKwordmFyIEV2 ZW50Q29uc3RhbnRzID0gcmVxdWlyZSgnLi9FdmVudENvbnN0YW50cycpOwordmFyIEV2ZW50UGx1 Z2luSHViID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpbkh1YicpOwordmFyIEV2ZW50UGx1Z2luUmVn aXN0cnkgPSByZXF1aXJlKCcuL0V2ZW50UGx1Z2luUmVnaXN0cnknKTsKK3ZhciBFdmVudFByb3Bh Z2F0b3JzID0gcmVxdWlyZSgnLi9FdmVudFByb3BhZ2F0b3JzJyk7Cit2YXIgUmVhY3QgPSByZXF1 aXJlKCdyZWFjdC9saWIvUmVhY3QnKTsKK3ZhciBSZWFjdERPTSA9IHJlcXVpcmUoJy4vUmVhY3RE T00nKTsKK3ZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29t cG9uZW50VHJlZScpOwordmFyIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJy4v UmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyJyk7Cit2YXIgUmVhY3RJbnN0YW5jZU1hcCA9IHJlcXVp cmUoJy4vUmVhY3RJbnN0YW5jZU1hcCcpOwordmFyIFJlYWN0VXBkYXRlcyA9IHJlcXVpcmUoJy4v UmVhY3RVcGRhdGVzJyk7Cit2YXIgU3ludGhldGljRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRp Y0V2ZW50Jyk7Cit2YXIgUmVhY3RTaGFsbG93UmVuZGVyZXIgPSByZXF1aXJlKCcuL1JlYWN0U2hh bGxvd1JlbmRlcmVyJyk7CisKK3ZhciBmaW5kRE9NTm9kZSA9IHJlcXVpcmUoJy4vZmluZERPTU5v ZGUnKTsKK3ZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTsKKwor dmFyIHRvcExldmVsVHlwZXMgPSBFdmVudENvbnN0YW50cy50b3BMZXZlbFR5cGVzOworCitmdW5j dGlvbiBFdmVudChzdWZmaXgpIHt9CisKKy8qKgorICogQGNsYXNzIFJlYWN0VGVzdFV0aWxzCisg Ki8KKworZnVuY3Rpb24gZmluZEFsbEluUmVuZGVyZWRUcmVlSW50ZXJuYWwoaW5zdCwgdGVzdCkg eworICBpZiAoIWluc3QgfHwgIWluc3QuZ2V0UHVibGljSW5zdGFuY2UpIHsKKyAgICByZXR1cm4g W107CisgIH0KKyAgdmFyIHB1YmxpY0luc3QgPSBpbnN0LmdldFB1YmxpY0luc3RhbmNlKCk7Cisg IHZhciByZXQgPSB0ZXN0KHB1YmxpY0luc3QpID8gW3B1YmxpY0luc3RdIDogW107CisgIHZhciBj dXJyZW50RWxlbWVudCA9IGluc3QuX2N1cnJlbnRFbGVtZW50OworICBpZiAoUmVhY3RUZXN0VXRp bHMuaXNET01Db21wb25lbnQocHVibGljSW5zdCkpIHsKKyAgICB2YXIgcmVuZGVyZWRDaGlsZHJl biA9IGluc3QuX3JlbmRlcmVkQ2hpbGRyZW47CisgICAgdmFyIGtleTsKKyAgICBmb3IgKGtleSBp biByZW5kZXJlZENoaWxkcmVuKSB7CisgICAgICBpZiAoIXJlbmRlcmVkQ2hpbGRyZW4uaGFzT3du UHJvcGVydHkoa2V5KSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHJldCA9 IHJldC5jb25jYXQoZmluZEFsbEluUmVuZGVyZWRUcmVlSW50ZXJuYWwocmVuZGVyZWRDaGlsZHJl bltrZXldLCB0ZXN0KSk7CisgICAgfQorICB9IGVsc2UgaWYgKFJlYWN0LmlzVmFsaWRFbGVtZW50 KGN1cnJlbnRFbGVtZW50KSAmJiB0eXBlb2YgY3VycmVudEVsZW1lbnQudHlwZSA9PT0gJ2Z1bmN0 aW9uJykgeworICAgIHJldCA9IHJldC5jb25jYXQoZmluZEFsbEluUmVuZGVyZWRUcmVlSW50ZXJu YWwoaW5zdC5fcmVuZGVyZWRDb21wb25lbnQsIHRlc3QpKTsKKyAgfQorICByZXR1cm4gcmV0Owor fQorCisvKioKKyAqIFV0aWxpdGllcyBmb3IgbWFraW5nIGl0IGVhc3kgdG8gdGVzdCBSZWFjdCBj b21wb25lbnRzLgorICoKKyAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9k b2NzL3Rlc3QtdXRpbHMuaHRtbAorICoKKyAqIFRvZG86IFN1cHBvcnQgdGhlIGVudGlyZSBET00u c2NyeSBxdWVyeSBzeW50YXguIEZvciBub3csIHRoZXNlIHNpbXBsZQorICogdXRpbGl0aWVzIHdp bGwgc3VmZmljZSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKyAqIEBsZW5kcyBSZWFjdFRlc3RVdGls cworICovCit2YXIgUmVhY3RUZXN0VXRpbHMgPSB7CisgIHJlbmRlckludG9Eb2N1bWVudDogZnVu Y3Rpb24gKGVsZW1lbnQpIHsKKyAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgn ZGl2Jyk7CisgICAgLy8gTm9uZSBvZiBvdXIgdGVzdHMgYWN0dWFsbHkgcmVxdWlyZSBhdHRhY2hp bmcgdGhlIGNvbnRhaW5lciB0byB0aGUKKyAgICAvLyBET00sIGFuZCBkb2luZyBzbyBjcmVhdGVz IGEgbWVzcyB0aGF0IHdlIHJlbHkgb24gdGVzdCBpc29sYXRpb24gdG8KKyAgICAvLyBjbGVhbiB1 cCwgc28gd2UncmUgZ29pbmcgdG8gc3RvcCBob25vcmluZyB0aGUgbmFtZSBvZiB0aGlzIG1ldGhv ZAorICAgIC8vIChhbmQgcHJvYmFibHkgcmVuYW1lIGl0IGV2ZW50dWFsbHkpIGlmIG5vIHByb2Js ZW1zIGFyaXNlLgorICAgIC8vIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZChk aXYpOworICAgIHJldHVybiBSZWFjdERPTS5yZW5kZXIoZWxlbWVudCwgZGl2KTsKKyAgfSwKKwor ICBpc0VsZW1lbnQ6IGZ1bmN0aW9uIChlbGVtZW50KSB7CisgICAgcmV0dXJuIFJlYWN0LmlzVmFs aWRFbGVtZW50KGVsZW1lbnQpOworICB9LAorCisgIGlzRWxlbWVudE9mVHlwZTogZnVuY3Rpb24g KGluc3QsIGNvbnZlbmllbmNlQ29uc3RydWN0b3IpIHsKKyAgICByZXR1cm4gUmVhY3QuaXNWYWxp ZEVsZW1lbnQoaW5zdCkgJiYgaW5zdC50eXBlID09PSBjb252ZW5pZW5jZUNvbnN0cnVjdG9yOwor ICB9LAorCisgIGlzRE9NQ29tcG9uZW50OiBmdW5jdGlvbiAoaW5zdCkgeworICAgIHJldHVybiAh IShpbnN0ICYmIGluc3Qubm9kZVR5cGUgPT09IDEgJiYgaW5zdC50YWdOYW1lKTsKKyAgfSwKKwor ICBpc0RPTUNvbXBvbmVudEVsZW1lbnQ6IGZ1bmN0aW9uIChpbnN0KSB7CisgICAgcmV0dXJuICEh KGluc3QgJiYgUmVhY3QuaXNWYWxpZEVsZW1lbnQoaW5zdCkgJiYgISFpbnN0LnRhZ05hbWUpOwor ICB9LAorCisgIGlzQ29tcG9zaXRlQ29tcG9uZW50OiBmdW5jdGlvbiAoaW5zdCkgeworICAgIGlm IChSZWFjdFRlc3RVdGlscy5pc0RPTUNvbXBvbmVudChpbnN0KSkgeworICAgICAgLy8gQWNjZXNz aW5nIGluc3Quc2V0U3RhdGUgd2FybnM7IGp1c3QgcmV0dXJuIGZhbHNlIGFzIHRoYXQnbGwgYmUg d2hhdAorICAgICAgLy8gdGhpcyByZXR1cm5zIHdoZW4gd2UgaGF2ZSBET00gbm9kZXMgYXMgcmVm cyBkaXJlY3RseQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gaW5zdCAh PSBudWxsICYmIHR5cGVvZiBpbnN0LnJlbmRlciA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgaW5z dC5zZXRTdGF0ZSA9PT0gJ2Z1bmN0aW9uJzsKKyAgfSwKKworICBpc0NvbXBvc2l0ZUNvbXBvbmVu dFdpdGhUeXBlOiBmdW5jdGlvbiAoaW5zdCwgdHlwZSkgeworICAgIGlmICghUmVhY3RUZXN0VXRp bHMuaXNDb21wb3NpdGVDb21wb25lbnQoaW5zdCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAg ICB9CisgICAgdmFyIGludGVybmFsSW5zdGFuY2UgPSBSZWFjdEluc3RhbmNlTWFwLmdldChpbnN0 KTsKKyAgICB2YXIgY29uc3RydWN0b3IgPSBpbnRlcm5hbEluc3RhbmNlLl9jdXJyZW50RWxlbWVu dC50eXBlOworCisgICAgcmV0dXJuIGNvbnN0cnVjdG9yID09PSB0eXBlOworICB9LAorCisgIGlz Q29tcG9zaXRlQ29tcG9uZW50RWxlbWVudDogZnVuY3Rpb24gKGluc3QpIHsKKyAgICBpZiAoIVJl YWN0LmlzVmFsaWRFbGVtZW50KGluc3QpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQor ICAgIC8vIFdlIGNoZWNrIHRoZSBwcm90b3R5cGUgb2YgdGhlIHR5cGUgdGhhdCB3aWxsIGdldCBt b3VudGVkLCBub3QgdGhlCisgICAgLy8gaW5zdGFuY2UgaXRzZWxmLiBUaGlzIGlzIGEgZnV0dXJl IHByb29mIHdheSBvZiBkdWNrIHR5cGluZy4KKyAgICB2YXIgcHJvdG90eXBlID0gaW5zdC50eXBl LnByb3RvdHlwZTsKKyAgICByZXR1cm4gdHlwZW9mIHByb3RvdHlwZS5yZW5kZXIgPT09ICdmdW5j dGlvbicgJiYgdHlwZW9mIHByb3RvdHlwZS5zZXRTdGF0ZSA9PT0gJ2Z1bmN0aW9uJzsKKyAgfSwK KworICBpc0NvbXBvc2l0ZUNvbXBvbmVudEVsZW1lbnRXaXRoVHlwZTogZnVuY3Rpb24gKGluc3Qs IHR5cGUpIHsKKyAgICB2YXIgaW50ZXJuYWxJbnN0YW5jZSA9IFJlYWN0SW5zdGFuY2VNYXAuZ2V0 KGluc3QpOworICAgIHZhciBjb25zdHJ1Y3RvciA9IGludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRF bGVtZW50LnR5cGU7CisKKyAgICByZXR1cm4gISEoUmVhY3RUZXN0VXRpbHMuaXNDb21wb3NpdGVD b21wb25lbnRFbGVtZW50KGluc3QpICYmIGNvbnN0cnVjdG9yID09PSB0eXBlKTsKKyAgfSwKKwor ICBnZXRSZW5kZXJlZENoaWxkT2ZDb21wb3NpdGVDb21wb25lbnQ6IGZ1bmN0aW9uIChpbnN0KSB7 CisgICAgaWYgKCFSZWFjdFRlc3RVdGlscy5pc0NvbXBvc2l0ZUNvbXBvbmVudChpbnN0KSkgewor ICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIHZhciBpbnRlcm5hbEluc3RhbmNlID0gUmVh Y3RJbnN0YW5jZU1hcC5nZXQoaW5zdCk7CisgICAgcmV0dXJuIGludGVybmFsSW5zdGFuY2UuX3Jl bmRlcmVkQ29tcG9uZW50LmdldFB1YmxpY0luc3RhbmNlKCk7CisgIH0sCisKKyAgZmluZEFsbElu UmVuZGVyZWRUcmVlOiBmdW5jdGlvbiAoaW5zdCwgdGVzdCkgeworICAgIGlmICghaW5zdCkgewor ICAgICAgcmV0dXJuIFtdOworICAgIH0KKyAgICAhUmVhY3RUZXN0VXRpbHMuaXNDb21wb3NpdGVD b21wb25lbnQoaW5zdCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8g aW52YXJpYW50KGZhbHNlLCAnZmluZEFsbEluUmVuZGVyZWRUcmVlKC4uLik6IGluc3RhbmNlIG11 c3QgYmUgYSBjb21wb3NpdGUgY29tcG9uZW50JykgOiBfcHJvZEludmFyaWFudCgnMTAnKSA6IHZv aWQgMDsKKyAgICByZXR1cm4gZmluZEFsbEluUmVuZGVyZWRUcmVlSW50ZXJuYWwoUmVhY3RJbnN0 YW5jZU1hcC5nZXQoaW5zdCksIHRlc3QpOworICB9LAorCisgIC8qKgorICAgKiBGaW5kcyBhbGwg aW5zdGFuY2Ugb2YgY29tcG9uZW50cyBpbiB0aGUgcmVuZGVyZWQgdHJlZSB0aGF0IGFyZSBET00K KyAgICogY29tcG9uZW50cyB3aXRoIHRoZSBjbGFzcyBuYW1lIG1hdGNoaW5nIGBjbGFzc05hbWVg LgorICAgKiBAcmV0dXJuIHthcnJheX0gYW4gYXJyYXkgb2YgYWxsIHRoZSBtYXRjaGVzLgorICAg Ki8KKyAgc2NyeVJlbmRlcmVkRE9NQ29tcG9uZW50c1dpdGhDbGFzczogZnVuY3Rpb24gKHJvb3Qs IGNsYXNzTmFtZXMpIHsKKyAgICByZXR1cm4gUmVhY3RUZXN0VXRpbHMuZmluZEFsbEluUmVuZGVy ZWRUcmVlKHJvb3QsIGZ1bmN0aW9uIChpbnN0KSB7CisgICAgICBpZiAoUmVhY3RUZXN0VXRpbHMu aXNET01Db21wb25lbnQoaW5zdCkpIHsKKyAgICAgICAgdmFyIGNsYXNzTmFtZSA9IGluc3QuY2xh c3NOYW1lOworICAgICAgICBpZiAodHlwZW9mIGNsYXNzTmFtZSAhPT0gJ3N0cmluZycpIHsKKyAg ICAgICAgICAvLyBTVkcsIHByb2JhYmx5LgorICAgICAgICAgIGNsYXNzTmFtZSA9IGluc3QuZ2V0 QXR0cmlidXRlKCdjbGFzcycpIHx8ICcnOworICAgICAgICB9CisgICAgICAgIHZhciBjbGFzc0xp c3QgPSBjbGFzc05hbWUuc3BsaXQoL1xzKy8pOworCisgICAgICAgIGlmICghQXJyYXkuaXNBcnJh eShjbGFzc05hbWVzKSkgeworICAgICAgICAgICEoY2xhc3NOYW1lcyAhPT0gdW5kZWZpbmVkKSA/ IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2Us ICdUZXN0VXRpbHMuc2NyeVJlbmRlcmVkRE9NQ29tcG9uZW50c1dpdGhDbGFzcyBleHBlY3RzIGEg Y2xhc3NOYW1lIGFzIGEgc2Vjb25kIGFyZ3VtZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzExJykg OiB2b2lkIDA7CisgICAgICAgICAgY2xhc3NOYW1lcyA9IGNsYXNzTmFtZXMuc3BsaXQoL1xzKy8p OworICAgICAgICB9CisgICAgICAgIHJldHVybiBjbGFzc05hbWVzLmV2ZXJ5KGZ1bmN0aW9uIChu YW1lKSB7CisgICAgICAgICAgcmV0dXJuIGNsYXNzTGlzdC5pbmRleE9mKG5hbWUpICE9PSAtMTsK KyAgICAgICAgfSk7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSk7CisgIH0s CisKKyAgLyoqCisgICAqIExpa2Ugc2NyeVJlbmRlcmVkRE9NQ29tcG9uZW50c1dpdGhDbGFzcyBi dXQgZXhwZWN0cyB0aGVyZSB0byBiZSBvbmUgcmVzdWx0LAorICAgKiBhbmQgcmV0dXJucyB0aGF0 IG9uZSByZXN1bHQsIG9yIHRocm93cyBleGNlcHRpb24gaWYgdGhlcmUgaXMgYW55IG90aGVyCisg ICAqIG51bWJlciBvZiBtYXRjaGVzIGJlc2lkZXMgb25lLgorICAgKiBAcmV0dXJuIHshUmVhY3RE T01Db21wb25lbnR9IFRoZSBvbmUgbWF0Y2guCisgICAqLworICBmaW5kUmVuZGVyZWRET01Db21w b25lbnRXaXRoQ2xhc3M6IGZ1bmN0aW9uIChyb290LCBjbGFzc05hbWUpIHsKKyAgICB2YXIgYWxs ID0gUmVhY3RUZXN0VXRpbHMuc2NyeVJlbmRlcmVkRE9NQ29tcG9uZW50c1dpdGhDbGFzcyhyb290 LCBjbGFzc05hbWUpOworICAgIGlmIChhbGwubGVuZ3RoICE9PSAxKSB7CisgICAgICB0aHJvdyBu ZXcgRXJyb3IoJ0RpZCBub3QgZmluZCBleGFjdGx5IG9uZSBtYXRjaCAoZm91bmQ6ICcgKyBhbGwu bGVuZ3RoICsgJykgJyArICdmb3IgY2xhc3M6JyArIGNsYXNzTmFtZSk7CisgICAgfQorICAgIHJl dHVybiBhbGxbMF07CisgIH0sCisKKyAgLyoqCisgICAqIEZpbmRzIGFsbCBpbnN0YW5jZSBvZiBj b21wb25lbnRzIGluIHRoZSByZW5kZXJlZCB0cmVlIHRoYXQgYXJlIERPTQorICAgKiBjb21wb25l bnRzIHdpdGggdGhlIHRhZyBuYW1lIG1hdGNoaW5nIGB0YWdOYW1lYC4KKyAgICogQHJldHVybiB7 YXJyYXl9IGFuIGFycmF5IG9mIGFsbCB0aGUgbWF0Y2hlcy4KKyAgICovCisgIHNjcnlSZW5kZXJl ZERPTUNvbXBvbmVudHNXaXRoVGFnOiBmdW5jdGlvbiAocm9vdCwgdGFnTmFtZSkgeworICAgIHJl dHVybiBSZWFjdFRlc3RVdGlscy5maW5kQWxsSW5SZW5kZXJlZFRyZWUocm9vdCwgZnVuY3Rpb24g KGluc3QpIHsKKyAgICAgIHJldHVybiBSZWFjdFRlc3RVdGlscy5pc0RPTUNvbXBvbmVudChpbnN0 KSAmJiBpbnN0LnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gdGFnTmFtZS50b1VwcGVyQ2FzZSgp OworICAgIH0pOworICB9LAorCisgIC8qKgorICAgKiBMaWtlIHNjcnlSZW5kZXJlZERPTUNvbXBv bmVudHNXaXRoVGFnIGJ1dCBleHBlY3RzIHRoZXJlIHRvIGJlIG9uZSByZXN1bHQsCisgICAqIGFu ZCByZXR1cm5zIHRoYXQgb25lIHJlc3VsdCwgb3IgdGhyb3dzIGV4Y2VwdGlvbiBpZiB0aGVyZSBp cyBhbnkgb3RoZXIKKyAgICogbnVtYmVyIG9mIG1hdGNoZXMgYmVzaWRlcyBvbmUuCisgICAqIEBy ZXR1cm4geyFSZWFjdERPTUNvbXBvbmVudH0gVGhlIG9uZSBtYXRjaC4KKyAgICovCisgIGZpbmRS ZW5kZXJlZERPTUNvbXBvbmVudFdpdGhUYWc6IGZ1bmN0aW9uIChyb290LCB0YWdOYW1lKSB7Cisg ICAgdmFyIGFsbCA9IFJlYWN0VGVzdFV0aWxzLnNjcnlSZW5kZXJlZERPTUNvbXBvbmVudHNXaXRo VGFnKHJvb3QsIHRhZ05hbWUpOworICAgIGlmIChhbGwubGVuZ3RoICE9PSAxKSB7CisgICAgICB0 aHJvdyBuZXcgRXJyb3IoJ0RpZCBub3QgZmluZCBleGFjdGx5IG9uZSBtYXRjaCAoZm91bmQ6ICcg KyBhbGwubGVuZ3RoICsgJykgJyArICdmb3IgdGFnOicgKyB0YWdOYW1lKTsKKyAgICB9CisgICAg cmV0dXJuIGFsbFswXTsKKyAgfSwKKworICAvKioKKyAgICogRmluZHMgYWxsIGluc3RhbmNlcyBv ZiBjb21wb25lbnRzIHdpdGggdHlwZSBlcXVhbCB0byBgY29tcG9uZW50VHlwZWAuCisgICAqIEBy ZXR1cm4ge2FycmF5fSBhbiBhcnJheSBvZiBhbGwgdGhlIG1hdGNoZXMuCisgICAqLworICBzY3J5 UmVuZGVyZWRDb21wb25lbnRzV2l0aFR5cGU6IGZ1bmN0aW9uIChyb290LCBjb21wb25lbnRUeXBl KSB7CisgICAgcmV0dXJuIFJlYWN0VGVzdFV0aWxzLmZpbmRBbGxJblJlbmRlcmVkVHJlZShyb290 LCBmdW5jdGlvbiAoaW5zdCkgeworICAgICAgcmV0dXJuIFJlYWN0VGVzdFV0aWxzLmlzQ29tcG9z aXRlQ29tcG9uZW50V2l0aFR5cGUoaW5zdCwgY29tcG9uZW50VHlwZSk7CisgICAgfSk7CisgIH0s CisKKyAgLyoqCisgICAqIFNhbWUgYXMgYHNjcnlSZW5kZXJlZENvbXBvbmVudHNXaXRoVHlwZWAg YnV0IGV4cGVjdHMgdGhlcmUgdG8gYmUgb25lIHJlc3VsdAorICAgKiBhbmQgcmV0dXJucyB0aGF0 IG9uZSByZXN1bHQsIG9yIHRocm93cyBleGNlcHRpb24gaWYgdGhlcmUgaXMgYW55IG90aGVyCisg ICAqIG51bWJlciBvZiBtYXRjaGVzIGJlc2lkZXMgb25lLgorICAgKiBAcmV0dXJuIHshUmVhY3RD b21wb25lbnR9IFRoZSBvbmUgbWF0Y2guCisgICAqLworICBmaW5kUmVuZGVyZWRDb21wb25lbnRX aXRoVHlwZTogZnVuY3Rpb24gKHJvb3QsIGNvbXBvbmVudFR5cGUpIHsKKyAgICB2YXIgYWxsID0g UmVhY3RUZXN0VXRpbHMuc2NyeVJlbmRlcmVkQ29tcG9uZW50c1dpdGhUeXBlKHJvb3QsIGNvbXBv bmVudFR5cGUpOworICAgIGlmIChhbGwubGVuZ3RoICE9PSAxKSB7CisgICAgICB0aHJvdyBuZXcg RXJyb3IoJ0RpZCBub3QgZmluZCBleGFjdGx5IG9uZSBtYXRjaCAoZm91bmQ6ICcgKyBhbGwubGVu Z3RoICsgJykgJyArICdmb3IgY29tcG9uZW50VHlwZTonICsgY29tcG9uZW50VHlwZSk7CisgICAg fQorICAgIHJldHVybiBhbGxbMF07CisgIH0sCisKKyAgLyoqCisgICAqIFBhc3MgYSBtb2NrZWQg Y29tcG9uZW50IG1vZHVsZSB0byB0aGlzIG1ldGhvZCB0byBhdWdtZW50IGl0IHdpdGgKKyAgICog dXNlZnVsIG1ldGhvZHMgdGhhdCBhbGxvdyBpdCB0byBiZSB1c2VkIGFzIGEgZHVtbXkgUmVhY3Qg Y29tcG9uZW50LgorICAgKiBJbnN0ZWFkIG9mIHJlbmRlcmluZyBhcyB1c3VhbCwgdGhlIGNvbXBv bmVudCB3aWxsIGJlY29tZSBhIHNpbXBsZQorICAgKiA8ZGl2PiBjb250YWluaW5nIGFueSBwcm92 aWRlZCBjaGlsZHJlbi4KKyAgICoKKyAgICogQHBhcmFtIHtvYmplY3R9IG1vZHVsZSB0aGUgbW9j ayBmdW5jdGlvbiBvYmplY3QgZXhwb3J0ZWQgZnJvbSBhCisgICAqICAgICAgICAgICAgICAgICAg ICAgICAgbW9kdWxlIHRoYXQgZGVmaW5lcyB0aGUgY29tcG9uZW50IHRvIGJlIG1vY2tlZAorICAg KiBAcGFyYW0gez9zdHJpbmd9IG1vY2tUYWdOYW1lIG9wdGlvbmFsIGR1bW15IHJvb3QgdGFnIG5h bWUgdG8gcmV0dXJuCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSByZW5k ZXIgbWV0aG9kIChvdmVycmlkZXMKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBt b2R1bGUubW9ja1RhZ05hbWUgaWYgcHJvdmlkZWQpCisgICAqIEByZXR1cm4ge29iamVjdH0gdGhl IFJlYWN0VGVzdFV0aWxzIG9iamVjdCAoZm9yIGNoYWluaW5nKQorICAgKi8KKyAgbW9ja0NvbXBv bmVudDogZnVuY3Rpb24gKG1vZHVsZSwgbW9ja1RhZ05hbWUpIHsKKyAgICBtb2NrVGFnTmFtZSA9 IG1vY2tUYWdOYW1lIHx8IG1vZHVsZS5tb2NrVGFnTmFtZSB8fCAnZGl2JzsKKworICAgIG1vZHVs ZS5wcm90b3R5cGUucmVuZGVyLm1vY2tJbXBsZW1lbnRhdGlvbihmdW5jdGlvbiAoKSB7CisgICAg ICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChtb2NrVGFnTmFtZSwgbnVsbCwgdGhpcy5wcm9w cy5jaGlsZHJlbik7CisgICAgfSk7CisKKyAgICByZXR1cm4gdGhpczsKKyAgfSwKKworICAvKioK KyAgICogU2ltdWxhdGVzIGEgdG9wIGxldmVsIGV2ZW50IGJlaW5nIGRpc3BhdGNoZWQgZnJvbSBh IHJhdyBldmVudCB0aGF0IG9jY3VycmVkCisgICAqIG9uIGFuIGBFbGVtZW50YCBub2RlLgorICAg KiBAcGFyYW0ge09iamVjdH0gdG9wTGV2ZWxUeXBlIEEgdHlwZSBmcm9tIGBFdmVudENvbnN0YW50 cy50b3BMZXZlbFR5cGVzYAorICAgKiBAcGFyYW0geyFFbGVtZW50fSBub2RlIFRoZSBkb20gdG8g c2ltdWxhdGUgYW4gZXZlbnQgb2NjdXJyaW5nIG9uLgorICAgKiBAcGFyYW0gez9FdmVudH0gZmFr ZU5hdGl2ZUV2ZW50IEZha2UgbmF0aXZlIGV2ZW50IHRvIHVzZSBpbiBTeW50aGV0aWNFdmVudC4K KyAgICovCisgIHNpbXVsYXRlTmF0aXZlRXZlbnRPbk5vZGU6IGZ1bmN0aW9uICh0b3BMZXZlbFR5 cGUsIG5vZGUsIGZha2VOYXRpdmVFdmVudCkgeworICAgIGZha2VOYXRpdmVFdmVudC50YXJnZXQg PSBub2RlOworICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIu ZGlzcGF0Y2hFdmVudCh0b3BMZXZlbFR5cGUsIGZha2VOYXRpdmVFdmVudCk7CisgIH0sCisKKyAg LyoqCisgICAqIFNpbXVsYXRlcyBhIHRvcCBsZXZlbCBldmVudCBiZWluZyBkaXNwYXRjaGVkIGZy b20gYSByYXcgZXZlbnQgdGhhdCBvY2N1cnJlZAorICAgKiBvbiB0aGUgYFJlYWN0RE9NQ29tcG9u ZW50YCBgY29tcGAuCisgICAqIEBwYXJhbSB7T2JqZWN0fSB0b3BMZXZlbFR5cGUgQSB0eXBlIGZy b20gYEV2ZW50Q29uc3RhbnRzLnRvcExldmVsVHlwZXNgLgorICAgKiBAcGFyYW0geyFSZWFjdERP TUNvbXBvbmVudH0gY29tcAorICAgKiBAcGFyYW0gez9FdmVudH0gZmFrZU5hdGl2ZUV2ZW50IEZh a2UgbmF0aXZlIGV2ZW50IHRvIHVzZSBpbiBTeW50aGV0aWNFdmVudC4KKyAgICovCisgIHNpbXVs YXRlTmF0aXZlRXZlbnRPbkRPTUNvbXBvbmVudDogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgY29t cCwgZmFrZU5hdGl2ZUV2ZW50KSB7CisgICAgUmVhY3RUZXN0VXRpbHMuc2ltdWxhdGVOYXRpdmVF dmVudE9uTm9kZSh0b3BMZXZlbFR5cGUsIGZpbmRET01Ob2RlKGNvbXApLCBmYWtlTmF0aXZlRXZl bnQpOworICB9LAorCisgIG5hdGl2ZVRvdWNoRGF0YTogZnVuY3Rpb24gKHgsIHkpIHsKKyAgICBy ZXR1cm4geworICAgICAgdG91Y2hlczogW3sgcGFnZVg6IHgsIHBhZ2VZOiB5IH1dCisgICAgfTsK KyAgfSwKKworICBjcmVhdGVSZW5kZXJlcjogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBuZXcg UmVhY3RTaGFsbG93UmVuZGVyZXIoKTsKKyAgfSwKKworICBTaW11bGF0ZTogbnVsbCwKKyAgU2lt dWxhdGVOYXRpdmU6IHt9Cit9OworCisvKioKKyAqIEV4cG9ydHM6CisgKgorICogLSBgUmVhY3RU ZXN0VXRpbHMuU2ltdWxhdGUuY2xpY2soRWxlbWVudC9SZWFjdERPTUNvbXBvbmVudClgCisgKiAt IGBSZWFjdFRlc3RVdGlscy5TaW11bGF0ZS5tb3VzZU1vdmUoRWxlbWVudC9SZWFjdERPTUNvbXBv bmVudClgCisgKiAtIGBSZWFjdFRlc3RVdGlscy5TaW11bGF0ZS5jaGFuZ2UoRWxlbWVudC9SZWFj dERPTUNvbXBvbmVudClgCisgKiAtIC4uLiAoQWxsIGtleXMgZnJvbSBldmVudCBwbHVnaW4gYGV2 ZW50VHlwZXNgIG9iamVjdHMpCisgKi8KK2Z1bmN0aW9uIG1ha2VTaW11bGF0b3IoZXZlbnRUeXBl KSB7CisgIHJldHVybiBmdW5jdGlvbiAoZG9tQ29tcG9uZW50T3JOb2RlLCBldmVudERhdGEpIHsK KyAgICB2YXIgbm9kZTsKKyAgICAhIVJlYWN0LmlzVmFsaWRFbGVtZW50KGRvbUNvbXBvbmVudE9y Tm9kZSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50 KGZhbHNlLCAnVGVzdFV0aWxzLlNpbXVsYXRlIGV4cGVjdHMgYSBjb21wb25lbnQgaW5zdGFuY2Ug YW5kIG5vdCBhIFJlYWN0RWxlbWVudC5UZXN0VXRpbHMuU2ltdWxhdGUgd2lsbCBub3Qgd29yayBp ZiB5b3UgYXJlIHVzaW5nIHNoYWxsb3cgcmVuZGVyaW5nLicpIDogX3Byb2RJbnZhcmlhbnQoJzE0 JykgOiB2b2lkIDA7CisgICAgaWYgKFJlYWN0VGVzdFV0aWxzLmlzRE9NQ29tcG9uZW50KGRvbUNv bXBvbmVudE9yTm9kZSkpIHsKKyAgICAgIG5vZGUgPSBmaW5kRE9NTm9kZShkb21Db21wb25lbnRP ck5vZGUpOworICAgIH0gZWxzZSBpZiAoZG9tQ29tcG9uZW50T3JOb2RlLnRhZ05hbWUpIHsKKyAg ICAgIG5vZGUgPSBkb21Db21wb25lbnRPck5vZGU7CisgICAgfQorCisgICAgdmFyIGRpc3BhdGNo Q29uZmlnID0gRXZlbnRQbHVnaW5SZWdpc3RyeS5ldmVudE5hbWVEaXNwYXRjaENvbmZpZ3NbZXZl bnRUeXBlXTsKKworICAgIHZhciBmYWtlTmF0aXZlRXZlbnQgPSBuZXcgRXZlbnQoKTsKKyAgICBm YWtlTmF0aXZlRXZlbnQudGFyZ2V0ID0gbm9kZTsKKyAgICBmYWtlTmF0aXZlRXZlbnQudHlwZSA9 IGV2ZW50VHlwZS50b0xvd2VyQ2FzZSgpOworCisgICAgLy8gV2UgZG9uJ3QgdXNlIFN5bnRoZXRp Y0V2ZW50LmdldFBvb2xlZCBpbiBvcmRlciB0byBub3QgaGF2ZSB0byB3b3JyeSBhYm91dAorICAg IC8vIHByb3Blcmx5IGRlc3Ryb3lpbmcgYW55IHByb3BlcnRpZXMgYXNzaWduZWQgZnJvbSBgZXZl bnREYXRhYCB1cG9uIHJlbGVhc2UKKyAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnQo ZGlzcGF0Y2hDb25maWcsIFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2Rl KG5vZGUpLCBmYWtlTmF0aXZlRXZlbnQsIG5vZGUpOworICAgIC8vIFNpbmNlIHdlIGFyZW4ndCB1 c2luZyBwb29saW5nLCBhbHdheXMgcGVyc2lzdCB0aGUgZXZlbnQuIFRoaXMgd2lsbCBtYWtlCisg ICAgLy8gc3VyZSBpdCdzIG1hcmtlZCBhbmQgd29uJ3Qgd2FybiB3aGVuIHNldHRpbmcgYWRkaXRp b25hbCBwcm9wZXJ0aWVzLgorICAgIGV2ZW50LnBlcnNpc3QoKTsKKyAgICBfYXNzaWduKGV2ZW50 LCBldmVudERhdGEpOworCisgICAgaWYgKGRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJhdGlv bk5hbWVzKSB7CisgICAgICBFdmVudFByb3BhZ2F0b3JzLmFjY3VtdWxhdGVUd29QaGFzZURpc3Bh dGNoZXMoZXZlbnQpOworICAgIH0gZWxzZSB7CisgICAgICBFdmVudFByb3BhZ2F0b3JzLmFjY3Vt dWxhdGVEaXJlY3REaXNwYXRjaGVzKGV2ZW50KTsKKyAgICB9CisKKyAgICBSZWFjdFVwZGF0ZXMu YmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKCkgeworICAgICAgRXZlbnRQbHVnaW5IdWIuZW5xdWV1 ZUV2ZW50cyhldmVudCk7CisgICAgICBFdmVudFBsdWdpbkh1Yi5wcm9jZXNzRXZlbnRRdWV1ZSh0 cnVlKTsKKyAgICB9KTsKKyAgfTsKK30KKworZnVuY3Rpb24gYnVpbGRTaW11bGF0b3JzKCkgewor ICBSZWFjdFRlc3RVdGlscy5TaW11bGF0ZSA9IHt9OworCisgIHZhciBldmVudFR5cGU7CisgIGZv ciAoZXZlbnRUeXBlIGluIEV2ZW50UGx1Z2luUmVnaXN0cnkuZXZlbnROYW1lRGlzcGF0Y2hDb25m aWdzKSB7CisgICAgLyoqCisgICAgICogQHBhcmFtIHshRWxlbWVudHxSZWFjdERPTUNvbXBvbmVu dH0gZG9tQ29tcG9uZW50T3JOb2RlCisgICAgICogQHBhcmFtIHs/b2JqZWN0fSBldmVudERhdGEg RmFrZSBldmVudCBkYXRhIHRvIHVzZSBpbiBTeW50aGV0aWNFdmVudC4KKyAgICAgKi8KKyAgICBS ZWFjdFRlc3RVdGlscy5TaW11bGF0ZVtldmVudFR5cGVdID0gbWFrZVNpbXVsYXRvcihldmVudFR5 cGUpOworICB9Cit9CisKKy8vIFJlYnVpbGQgUmVhY3RUZXN0VXRpbHMuU2ltdWxhdGUgd2hlbmV2 ZXIgZXZlbnQgcGx1Z2lucyBhcmUgaW5qZWN0ZWQKK3ZhciBvbGRJbmplY3RFdmVudFBsdWdpbk9y ZGVyID0gRXZlbnRQbHVnaW5IdWIuaW5qZWN0aW9uLmluamVjdEV2ZW50UGx1Z2luT3JkZXI7CitF dmVudFBsdWdpbkh1Yi5pbmplY3Rpb24uaW5qZWN0RXZlbnRQbHVnaW5PcmRlciA9IGZ1bmN0aW9u ICgpIHsKKyAgb2xkSW5qZWN0RXZlbnRQbHVnaW5PcmRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMp OworICBidWlsZFNpbXVsYXRvcnMoKTsKK307Cit2YXIgb2xkSW5qZWN0RXZlbnRQbHVnaW5zID0g RXZlbnRQbHVnaW5IdWIuaW5qZWN0aW9uLmluamVjdEV2ZW50UGx1Z2luc0J5TmFtZTsKK0V2ZW50 UGx1Z2luSHViLmluamVjdGlvbi5pbmplY3RFdmVudFBsdWdpbnNCeU5hbWUgPSBmdW5jdGlvbiAo KSB7CisgIG9sZEluamVjdEV2ZW50UGx1Z2lucy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICBi dWlsZFNpbXVsYXRvcnMoKTsKK307CisKK2J1aWxkU2ltdWxhdG9ycygpOworCisvKioKKyAqIEV4 cG9ydHM6CisgKgorICogLSBgUmVhY3RUZXN0VXRpbHMuU2ltdWxhdGVOYXRpdmUuY2xpY2soRWxl bWVudC9SZWFjdERPTUNvbXBvbmVudClgCisgKiAtIGBSZWFjdFRlc3RVdGlscy5TaW11bGF0ZU5h dGl2ZS5tb3VzZU1vdmUoRWxlbWVudC9SZWFjdERPTUNvbXBvbmVudClgCisgKiAtIGBSZWFjdFRl c3RVdGlscy5TaW11bGF0ZU5hdGl2ZS5tb3VzZUluL1JlYWN0RE9NQ29tcG9uZW50KWAKKyAqIC0g YFJlYWN0VGVzdFV0aWxzLlNpbXVsYXRlTmF0aXZlLm1vdXNlT3V0KEVsZW1lbnQvUmVhY3RET01D b21wb25lbnQpYAorICogLSAuLi4gKEFsbCBrZXlzIGZyb20gYEV2ZW50Q29uc3RhbnRzLnRvcExl dmVsVHlwZXNgKQorICoKKyAqIE5vdGU6IFRvcCBsZXZlbCBldmVudCB0eXBlcyBhcmUgYSBzdWJz ZXQgb2YgdGhlIGVudGlyZSBzZXQgb2YgaGFuZGxlciB0eXBlcworICogKHdoaWNoIGluY2x1ZGUg YSBicm9hZGVyIHNldCBvZiAic3ludGhldGljIiBldmVudHMpLiBGb3IgZXhhbXBsZSwgb25EcmFn RG9uZQorICogaXMgYSBzeW50aGV0aWMgZXZlbnQuIEV4Y2VwdCB3aGVuIHRlc3RpbmcgYW4gZXZl bnQgcGx1Z2luIG9yIFJlYWN0J3MgZXZlbnQKKyAqIGhhbmRsaW5nIGNvZGUgc3BlY2lmaWNhbGx5 LCB5b3UgcHJvYmFibHkgd2FudCB0byB1c2UgUmVhY3RUZXN0VXRpbHMuU2ltdWxhdGUKKyAqIHRv IGRpc3BhdGNoIHN5bnRoZXRpYyBldmVudHMuCisgKi8KKworZnVuY3Rpb24gbWFrZU5hdGl2ZVNp bXVsYXRvcihldmVudFR5cGUpIHsKKyAgcmV0dXJuIGZ1bmN0aW9uIChkb21Db21wb25lbnRPck5v ZGUsIG5hdGl2ZUV2ZW50RGF0YSkgeworICAgIHZhciBmYWtlTmF0aXZlRXZlbnQgPSBuZXcgRXZl bnQoZXZlbnRUeXBlKTsKKyAgICBfYXNzaWduKGZha2VOYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRE YXRhKTsKKyAgICBpZiAoUmVhY3RUZXN0VXRpbHMuaXNET01Db21wb25lbnQoZG9tQ29tcG9uZW50 T3JOb2RlKSkgeworICAgICAgUmVhY3RUZXN0VXRpbHMuc2ltdWxhdGVOYXRpdmVFdmVudE9uRE9N Q29tcG9uZW50KGV2ZW50VHlwZSwgZG9tQ29tcG9uZW50T3JOb2RlLCBmYWtlTmF0aXZlRXZlbnQp OworICAgIH0gZWxzZSBpZiAoZG9tQ29tcG9uZW50T3JOb2RlLnRhZ05hbWUpIHsKKyAgICAgIC8v IFdpbGwgYWxsb3cgb24gYWN0dWFsIGRvbSBub2Rlcy4KKyAgICAgIFJlYWN0VGVzdFV0aWxzLnNp bXVsYXRlTmF0aXZlRXZlbnRPbk5vZGUoZXZlbnRUeXBlLCBkb21Db21wb25lbnRPck5vZGUsIGZh a2VOYXRpdmVFdmVudCk7CisgICAgfQorICB9OworfQorCitPYmplY3Qua2V5cyh0b3BMZXZlbFR5 cGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChldmVudFR5cGUpIHsKKyAgLy8gRXZlbnQgdHlwZSBpcyBz dG9yZWQgYXMgJ3RvcENsaWNrJyAtIHdlIHRyYW5zZm9ybSB0aGF0IHRvICdjbGljaycKKyAgdmFy IGNvbnZlbmllbmNlTmFtZSA9IGV2ZW50VHlwZS5pbmRleE9mKCd0b3AnKSA9PT0gMCA/IGV2ZW50 VHlwZS5jaGFyQXQoMykudG9Mb3dlckNhc2UoKSArIGV2ZW50VHlwZS5zdWJzdHIoNCkgOiBldmVu dFR5cGU7CisgIC8qKgorICAgKiBAcGFyYW0geyFFbGVtZW50fFJlYWN0RE9NQ29tcG9uZW50fSBk b21Db21wb25lbnRPck5vZGUKKyAgICogQHBhcmFtIHs/RXZlbnR9IG5hdGl2ZUV2ZW50RGF0YSBG YWtlIG5hdGl2ZSBldmVudCB0byB1c2UgaW4gU3ludGhldGljRXZlbnQuCisgICAqLworICBSZWFj dFRlc3RVdGlscy5TaW11bGF0ZU5hdGl2ZVtjb252ZW5pZW5jZU5hbWVdID0gbWFrZU5hdGl2ZVNp bXVsYXRvcihldmVudFR5cGUpOworfSk7CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RUZXN0VXRp bHM7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4v c3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0VHlwZU9mV29yay5qcyBiL3dlYi9wZ2Fk bWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZWFjdFR5cGVPZldvcmsuanMKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjc5NDE1ZDlkCi0tLSAvZGV2L251bGwKKysr IGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0VHlwZU9mV29y ay5qcwpAQCAtMCwwICsxLDIzIEBACisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZh Y2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNl IGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRo ZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0 cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3Vu ZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAq LworCisndXNlIHN0cmljdCc7CisKK21vZHVsZS5leHBvcnRzID0geworICBJbmRldGVybWluYXRl Q29tcG9uZW50OiAwLCAvLyBCZWZvcmUgd2Uga25vdyB3aGV0aGVyIGl0IGlzIGZ1bmN0aW9uYWwg b3IgY2xhc3MKKyAgRnVuY3Rpb25hbENvbXBvbmVudDogMSwKKyAgQ2xhc3NDb21wb25lbnQ6IDIs CisgIEhvc3RDb250YWluZXI6IDMsIC8vIFJvb3Qgb2YgYSBob3N0IHRyZWUuIENvdWxkIGJlIG5l c3RlZCBpbnNpZGUgYW5vdGhlciBub2RlLgorICBIb3N0Q29tcG9uZW50OiA0LAorICBDb3JvdXRp bmVDb21wb25lbnQ6IDUsCisgIENvcm91dGluZUhhbmRsZXJQaGFzZTogNiwKKyAgWWllbGRDb21w b25lbnQ6IDcKK307ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2Vi L3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0VHlwZXMuanMgYi93ZWIv cGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RUeXBlcy5qcwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uOWIwMTNkZmIKLS0tIC9kZXYvbnVsbAorKysg Yi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RUeXBlcy5qcwpA QCAtMCwwICsxLDEyIEBACisvKioKKyAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQsIEZhY2Vib29r LCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUg aXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICog TElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBB biBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0 aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisn dXNlIHN0cmljdCc7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2Vi L3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0VXBkYXRlUXVldWUuanMg Yi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RVcGRhdGVRdWV1 ZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uYzBmMmE1NzEKLS0tIC9k ZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVh Y3RVcGRhdGVRdWV1ZS5qcwpAQCAtMCwwICsxLDIyNSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAx NS1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg KiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5z ZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2Yg dGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0 cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3Rvcnku CisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWly ZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTsKKwordmFyIFJlYWN0Q3VycmVudE93bmVyID0gcmVx dWlyZSgncmVhY3QvbGliL1JlYWN0Q3VycmVudE93bmVyJyk7Cit2YXIgUmVhY3RJbnN0YW5jZU1h cCA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0YW5jZU1hcCcpOwordmFyIFJlYWN0SW5zdHJ1bWVudGF0 aW9uID0gcmVxdWlyZSgnLi9SZWFjdEluc3RydW1lbnRhdGlvbicpOwordmFyIFJlYWN0VXBkYXRl cyA9IHJlcXVpcmUoJy4vUmVhY3RVcGRhdGVzJyk7CisKK3ZhciBpbnZhcmlhbnQgPSByZXF1aXJl KCdmYmpzL2xpYi9pbnZhcmlhbnQnKTsKK3ZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIv d2FybmluZycpOworCitmdW5jdGlvbiBlbnF1ZXVlVXBkYXRlKGludGVybmFsSW5zdGFuY2UpIHsK KyAgUmVhY3RVcGRhdGVzLmVucXVldWVVcGRhdGUoaW50ZXJuYWxJbnN0YW5jZSk7Cit9CisKK2Z1 bmN0aW9uIGZvcm1hdFVuZXhwZWN0ZWRBcmd1bWVudChhcmcpIHsKKyAgdmFyIHR5cGUgPSB0eXBl b2YgYXJnOworICBpZiAodHlwZSAhPT0gJ29iamVjdCcpIHsKKyAgICByZXR1cm4gdHlwZTsKKyAg fQorICB2YXIgZGlzcGxheU5hbWUgPSBhcmcuY29uc3RydWN0b3IgJiYgYXJnLmNvbnN0cnVjdG9y Lm5hbWUgfHwgdHlwZTsKKyAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhcmcpOworICBpZiAoa2V5 cy5sZW5ndGggPiAwICYmIGtleXMubGVuZ3RoIDwgMjApIHsKKyAgICByZXR1cm4gZGlzcGxheU5h bWUgKyAnIChrZXlzOiAnICsga2V5cy5qb2luKCcsICcpICsgJyknOworICB9CisgIHJldHVybiBk aXNwbGF5TmFtZTsKK30KKworZnVuY3Rpb24gZ2V0SW50ZXJuYWxJbnN0YW5jZVJlYWR5Rm9yVXBk YXRlKHB1YmxpY0luc3RhbmNlLCBjYWxsZXJOYW1lKSB7CisgIHZhciBpbnRlcm5hbEluc3RhbmNl ID0gUmVhY3RJbnN0YW5jZU1hcC5nZXQocHVibGljSW5zdGFuY2UpOworICBpZiAoIWludGVybmFs SW5zdGFuY2UpIHsKKyAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9u JykgeworICAgICAgdmFyIGN0b3IgPSBwdWJsaWNJbnN0YW5jZS5jb25zdHJ1Y3RvcjsKKyAgICAg IC8vIE9ubHkgd2FybiB3aGVuIHdlIGhhdmUgYSBjYWxsZXJOYW1lLiBPdGhlcndpc2Ugd2Ugc2hv dWxkIGJlIHNpbGVudC4KKyAgICAgIC8vIFdlJ3JlIHByb2JhYmx5IGNhbGxpbmcgZnJvbSBlbnF1 ZXVlQ2FsbGJhY2suIFdlIGRvbid0IHdhbnQgdG8gd2FybgorICAgICAgLy8gdGhlcmUgYmVjYXVz ZSB3ZSBhbHJlYWR5IHdhcm5lZCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgbGlmZWN5Y2xlIG1ldGhv ZC4KKyAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5n KCFjYWxsZXJOYW1lLCAnJXMoLi4uKTogQ2FuIG9ubHkgdXBkYXRlIGEgbW91bnRlZCBvciBtb3Vu dGluZyBjb21wb25lbnQuICcgKyAnVGhpcyB1c3VhbGx5IG1lYW5zIHlvdSBjYWxsZWQgJXMoKSBv biBhbiB1bm1vdW50ZWQgY29tcG9uZW50LiAnICsgJ1RoaXMgaXMgYSBuby1vcC4gUGxlYXNlIGNo ZWNrIHRoZSBjb2RlIGZvciB0aGUgJXMgY29tcG9uZW50LicsIGNhbGxlck5hbWUsIGNhbGxlck5h bWUsIGN0b3IgJiYgKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSB8fCAnUmVhY3RDbGFz cycpIDogdm9pZCAwOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIGlmIChwcm9j ZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgcHJvY2Vzcy5lbnYuTk9E RV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoUmVhY3RDdXJyZW50T3duZXIuY3VycmVu dCA9PSBudWxsLCAnJXMoLi4uKTogQ2Fubm90IHVwZGF0ZSBkdXJpbmcgYW4gZXhpc3Rpbmcgc3Rh dGUgdHJhbnNpdGlvbiAoc3VjaCBhcyAnICsgJ3dpdGhpbiBgcmVuZGVyYCBvciBhbm90aGVyIGNv bXBvbmVudFwncyBjb25zdHJ1Y3RvcikuIFJlbmRlciBtZXRob2RzICcgKyAnc2hvdWxkIGJlIGEg cHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGU7IGNvbnN0cnVjdG9yICcgKyAnc2lkZS1l ZmZlY3RzIGFyZSBhbiBhbnRpLXBhdHRlcm4sIGJ1dCBjYW4gYmUgbW92ZWQgdG8gJyArICdgY29t cG9uZW50V2lsbE1vdW50YC4nLCBjYWxsZXJOYW1lKSA6IHZvaWQgMDsKKyAgfQorCisgIHJldHVy biBpbnRlcm5hbEluc3RhbmNlOworfQorCisvKioKKyAqIFJlYWN0VXBkYXRlUXVldWUgYWxsb3dz IGZvciBzdGF0ZSB1cGRhdGVzIHRvIGJlIHNjaGVkdWxlZCBpbnRvIGEgbGF0ZXIKKyAqIHJlY29u Y2lsaWF0aW9uIHN0ZXAuCisgKi8KK3ZhciBSZWFjdFVwZGF0ZVF1ZXVlID0geworCisgIC8qKgor ICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhpcyBjb21wb3NpdGUgY29tcG9uZW50IGlzIG1v dW50ZWQuCisgICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3Rh bmNlIHdlIHdhbnQgdG8gdGVzdC4KKyAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBtb3Vu dGVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAqIEBwcm90ZWN0ZWQKKyAgICogQGZpbmFsCisgICAq LworICBpc01vdW50ZWQ6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSkgeworICAgIGlmIChwcm9j ZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICB2YXIgb3duZXIgPSBS ZWFjdEN1cnJlbnRPd25lci5jdXJyZW50OworICAgICAgaWYgKG93bmVyICE9PSBudWxsKSB7Cisg ICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKG93 bmVyLl93YXJuZWRBYm91dFJlZnNJblJlbmRlciwgJyVzIGlzIGFjY2Vzc2luZyBpc01vdW50ZWQg aW5zaWRlIGl0cyByZW5kZXIoKSBmdW5jdGlvbi4gJyArICdyZW5kZXIoKSBzaG91bGQgYmUgYSBw dXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZS4gSXQgc2hvdWxkICcgKyAnbmV2ZXIgYWNj ZXNzIHNvbWV0aGluZyB0aGF0IHJlcXVpcmVzIHN0YWxlIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMg JyArICdyZW5kZXIsIHN1Y2ggYXMgcmVmcy4gTW92ZSB0aGlzIGxvZ2ljIHRvIGNvbXBvbmVudERp ZE1vdW50IGFuZCAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZSBpbnN0ZWFkLicsIG93bmVyLmdldE5h bWUoKSB8fCAnQSBjb21wb25lbnQnKSA6IHZvaWQgMDsKKyAgICAgICAgb3duZXIuX3dhcm5lZEFi b3V0UmVmc0luUmVuZGVyID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgdmFyIGludGVybmFs SW5zdGFuY2UgPSBSZWFjdEluc3RhbmNlTWFwLmdldChwdWJsaWNJbnN0YW5jZSk7CisgICAgaWYg KGludGVybmFsSW5zdGFuY2UpIHsKKyAgICAgIC8vIER1cmluZyBjb21wb25lbnRXaWxsTW91bnQg YW5kIHJlbmRlciB0aGlzIHdpbGwgc3RpbGwgYmUgbnVsbCBidXQgYWZ0ZXIKKyAgICAgIC8vIHRo YXQgd2lsbCBhbHdheXMgcmVuZGVyIHRvIHNvbWV0aGluZy4gQXQgbGVhc3QgZm9yIG5vdy4gU28g d2UgY2FuIHVzZQorICAgICAgLy8gdGhpcyBoYWNrLgorICAgICAgcmV0dXJuICEhaW50ZXJuYWxJ bnN0YW5jZS5fcmVuZGVyZWRDb21wb25lbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBm YWxzZTsKKyAgICB9CisgIH0sCisKKyAgLyoqCisgICAqIEVucXVldWUgYSBjYWxsYmFjayB0aGF0 IHdpbGwgYmUgZXhlY3V0ZWQgYWZ0ZXIgYWxsIHRoZSBwZW5kaW5nIHVwZGF0ZXMKKyAgICogaGF2 ZSBwcm9jZXNzZWQuCisgICAqCisgICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFu Y2UgVGhlIGluc3RhbmNlIHRvIHVzZSBhcyBgdGhpc2AgY29udGV4dC4KKyAgICogQHBhcmFtIHs/ ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBzdGF0ZSBpcyB1cGRhdGVkLgorICAgKiBA cGFyYW0ge3N0cmluZ30gY2FsbGVyTmFtZSBOYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGlu IHRoZSBwdWJsaWMgQVBJLgorICAgKiBAaW50ZXJuYWwKKyAgICovCisgIGVucXVldWVDYWxsYmFj azogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkgeworICAg IFJlYWN0VXBkYXRlUXVldWUudmFsaWRhdGVDYWxsYmFjayhjYWxsYmFjaywgY2FsbGVyTmFtZSk7 CisgICAgdmFyIGludGVybmFsSW5zdGFuY2UgPSBnZXRJbnRlcm5hbEluc3RhbmNlUmVhZHlGb3JV cGRhdGUocHVibGljSW5zdGFuY2UpOworCisgICAgLy8gUHJldmlvdXNseSB3ZSB3b3VsZCB0aHJv dyBhbiBlcnJvciBpZiB3ZSBkaWRuJ3QgaGF2ZSBhbiBpbnRlcm5hbAorICAgIC8vIGluc3RhbmNl LiBTaW5jZSB3ZSB3YW50IHRvIG1ha2UgaXQgYSBuby1vcCBpbnN0ZWFkLCB3ZSBtaXJyb3IgdGhl IHNhbWUKKyAgICAvLyBiZWhhdmlvciB3ZSBoYXZlIGluIG90aGVyIGVucXVldWUqIG1ldGhvZHMu CisgICAgLy8gV2UgYWxzbyBuZWVkIHRvIGlnbm9yZSBjYWxsYmFja3MgaW4gY29tcG9uZW50V2ls bE1vdW50LiBTZWUKKyAgICAvLyBlbnF1ZXVlVXBkYXRlcy4KKyAgICBpZiAoIWludGVybmFsSW5z dGFuY2UpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIGlmIChpbnRlcm5hbElu c3RhbmNlLl9wZW5kaW5nQ2FsbGJhY2tzKSB7CisgICAgICBpbnRlcm5hbEluc3RhbmNlLl9wZW5k aW5nQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spOworICAgIH0gZWxzZSB7CisgICAgICBpbnRlcm5h bEluc3RhbmNlLl9wZW5kaW5nQ2FsbGJhY2tzID0gW2NhbGxiYWNrXTsKKyAgICB9CisgICAgLy8g VE9ETzogVGhlIGNhbGxiYWNrIGhlcmUgaXMgaWdub3JlZCB3aGVuIHNldFN0YXRlIGlzIGNhbGxl ZCBmcm9tCisgICAgLy8gY29tcG9uZW50V2lsbE1vdW50LiBFaXRoZXIgZml4IGl0IG9yIGRpc2Fs bG93IGRvaW5nIHNvIGNvbXBsZXRlbHkgaW4KKyAgICAvLyBmYXZvciBvZiBnZXRJbml0aWFsU3Rh dGUuIEFsdGVybmF0aXZlbHksIHdlIGNhbiBkaXNhbGxvdworICAgIC8vIGNvbXBvbmVudFdpbGxN b3VudCBkdXJpbmcgc2VydmVyLXNpZGUgcmVuZGVyaW5nLgorICAgIGVucXVldWVVcGRhdGUoaW50 ZXJuYWxJbnN0YW5jZSk7CisgIH0sCisKKyAgZW5xdWV1ZUNhbGxiYWNrSW50ZXJuYWw6IGZ1bmN0 aW9uIChpbnRlcm5hbEluc3RhbmNlLCBjYWxsYmFjaykgeworICAgIGlmIChpbnRlcm5hbEluc3Rh bmNlLl9wZW5kaW5nQ2FsbGJhY2tzKSB7CisgICAgICBpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5n Q2FsbGJhY2tzLnB1c2goY2FsbGJhY2spOworICAgIH0gZWxzZSB7CisgICAgICBpbnRlcm5hbElu c3RhbmNlLl9wZW5kaW5nQ2FsbGJhY2tzID0gW2NhbGxiYWNrXTsKKyAgICB9CisgICAgZW5xdWV1 ZVVwZGF0ZShpbnRlcm5hbEluc3RhbmNlKTsKKyAgfSwKKworICAvKioKKyAgICogRm9yY2VzIGFu IHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0 aAorICAgKiBjZXJ0YWludHkgdGhhdCB3ZSBhcmUgKipub3QqKiBpbiBhIERPTSB0cmFuc2FjdGlv bi4KKyAgICoKKyAgICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRo YXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZQorICAgKiBjb21wb25lbnQncyBzdGF0ZSBoYXMg Y2hhbmdlZCBidXQgYHNldFN0YXRlYCB3YXMgbm90IGNhbGxlZC4KKyAgICoKKyAgICogVGhpcyB3 aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9r ZQorICAgKiBgY29tcG9uZW50V2lsbFVwZGF0ZWAgYW5kIGBjb21wb25lbnREaWRVcGRhdGVgLgor ICAgKgorICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5j ZSB0aGF0IHNob3VsZCByZXJlbmRlci4KKyAgICogQGludGVybmFsCisgICAqLworICBlbnF1ZXVl Rm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSkgeworICAgIHZhciBpbnRlcm5h bEluc3RhbmNlID0gZ2V0SW50ZXJuYWxJbnN0YW5jZVJlYWR5Rm9yVXBkYXRlKHB1YmxpY0luc3Rh bmNlLCAnZm9yY2VVcGRhdGUnKTsKKworICAgIGlmICghaW50ZXJuYWxJbnN0YW5jZSkgeworICAg ICAgcmV0dXJuOworICAgIH0KKworICAgIGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdGb3JjZVVw ZGF0ZSA9IHRydWU7CisKKyAgICBlbnF1ZXVlVXBkYXRlKGludGVybmFsSW5zdGFuY2UpOworICB9 LAorCisgIC8qKgorICAgKiBSZXBsYWNlcyBhbGwgb2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRo aXMgb3IgYHNldFN0YXRlYCB0byBtdXRhdGUgc3RhdGUuCisgICAqIFlvdSBzaG91bGQgdHJlYXQg YHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS4KKyAgICoKKyAgICogVGhlcmUgaXMgbm8gZ3VhcmFu dGVlIHRoYXQgYHRoaXMuc3RhdGVgIHdpbGwgYmUgaW1tZWRpYXRlbHkgdXBkYXRlZCwgc28KKyAg ICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSBy ZXR1cm4gdGhlIG9sZCB2YWx1ZS4KKyAgICoKKyAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJs aWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuCisgICAqIEBwYXJh bSB7b2JqZWN0fSBjb21wbGV0ZVN0YXRlIE5leHQgc3RhdGUuCisgICAqIEBpbnRlcm5hbAorICAg Ki8KKyAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjb21w bGV0ZVN0YXRlKSB7CisgICAgdmFyIGludGVybmFsSW5zdGFuY2UgPSBnZXRJbnRlcm5hbEluc3Rh bmNlUmVhZHlGb3JVcGRhdGUocHVibGljSW5zdGFuY2UsICdyZXBsYWNlU3RhdGUnKTsKKworICAg IGlmICghaW50ZXJuYWxJbnN0YW5jZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlu dGVybmFsSW5zdGFuY2UuX3BlbmRpbmdTdGF0ZVF1ZXVlID0gW2NvbXBsZXRlU3RhdGVdOworICAg IGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdSZXBsYWNlU3RhdGUgPSB0cnVlOworCisgICAgZW5x dWV1ZVVwZGF0ZShpbnRlcm5hbEluc3RhbmNlKTsKKyAgfSwKKworICAvKioKKyAgICogU2V0cyBh IHN1YnNldCBvZiB0aGUgc3RhdGUuIFRoaXMgb25seSBleGlzdHMgYmVjYXVzZSBfcGVuZGluZ1N0 YXRlIGlzCisgICAqIGludGVybmFsLiBUaGlzIHByb3ZpZGVzIGEgbWVyZ2luZyBzdHJhdGVneSB0 aGF0IGlzIG5vdCBhdmFpbGFibGUgdG8gZGVlcAorICAgKiBwcm9wZXJ0aWVzIHdoaWNoIGlzIGNv bmZ1c2luZy4gVE9ETzogRXhwb3NlIHBlbmRpbmdTdGF0ZSBvciBkb24ndCB1c2UgaXQKKyAgICog ZHVyaW5nIHRoZSBtZXJnZS4KKyAgICoKKyAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJ bnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuCisgICAqIEBwYXJhbSB7 b2JqZWN0fSBwYXJ0aWFsU3RhdGUgTmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRo IHN0YXRlLgorICAgKiBAaW50ZXJuYWwKKyAgICovCisgIGVucXVldWVTZXRTdGF0ZTogZnVuY3Rp b24gKHB1YmxpY0luc3RhbmNlLCBwYXJ0aWFsU3RhdGUpIHsKKyAgICBpZiAocHJvY2Vzcy5lbnYu Tk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24u ZGVidWdUb29sLm9uU2V0U3RhdGUoKTsKKyAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAn cHJvZHVjdGlvbicgPyB3YXJuaW5nKHBhcnRpYWxTdGF0ZSAhPSBudWxsLCAnc2V0U3RhdGUoLi4u KTogWW91IHBhc3NlZCBhbiB1bmRlZmluZWQgb3IgbnVsbCBzdGF0ZSBvYmplY3Q7ICcgKyAnaW5z dGVhZCwgdXNlIGZvcmNlVXBkYXRlKCkuJykgOiB2b2lkIDA7CisgICAgfQorCisgICAgdmFyIGlu dGVybmFsSW5zdGFuY2UgPSBnZXRJbnRlcm5hbEluc3RhbmNlUmVhZHlGb3JVcGRhdGUocHVibGlj SW5zdGFuY2UsICdzZXRTdGF0ZScpOworCisgICAgaWYgKCFpbnRlcm5hbEluc3RhbmNlKSB7Cisg ICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIHF1ZXVlID0gaW50ZXJuYWxJbnN0YW5jZS5f cGVuZGluZ1N0YXRlUXVldWUgfHwgKGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdTdGF0ZVF1ZXVl ID0gW10pOworICAgIHF1ZXVlLnB1c2gocGFydGlhbFN0YXRlKTsKKworICAgIGVucXVldWVVcGRh dGUoaW50ZXJuYWxJbnN0YW5jZSk7CisgIH0sCisKKyAgZW5xdWV1ZUVsZW1lbnRJbnRlcm5hbDog ZnVuY3Rpb24gKGludGVybmFsSW5zdGFuY2UsIG5leHRFbGVtZW50LCBuZXh0Q29udGV4dCkgewor ICAgIGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdFbGVtZW50ID0gbmV4dEVsZW1lbnQ7CisgICAg Ly8gVE9ETzogaW50cm9kdWNlIF9wZW5kaW5nQ29udGV4dCBpbnN0ZWFkIG9mIHNldHRpbmcgaXQg ZGlyZWN0bHkuCisgICAgaW50ZXJuYWxJbnN0YW5jZS5fY29udGV4dCA9IG5leHRDb250ZXh0Owor ICAgIGVucXVldWVVcGRhdGUoaW50ZXJuYWxJbnN0YW5jZSk7CisgIH0sCisKKyAgdmFsaWRhdGVD YWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7CisgICAgISghY2FsbGJh Y2sgfHwgdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSA/IHByb2Nlc3MuZW52Lk5PREVf RU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICclcyguLi4pOiBFeHBlY3Rl ZCB0aGUgbGFzdCBvcHRpb25hbCBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGJlIGEgZnVuY3Rpb24u IEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNhbGxlck5hbWUsIGZvcm1hdFVuZXhwZWN0ZWRBcmd1 bWVudChjYWxsYmFjaykpIDogX3Byb2RJbnZhcmlhbnQoJzEyMicsIGNhbGxlck5hbWUsIGZvcm1h dFVuZXhwZWN0ZWRBcmd1bWVudChjYWxsYmFjaykpIDogdm9pZCAwOworICB9CisKK307CisKK21v ZHVsZS5leHBvcnRzID0gUmVhY3RVcGRhdGVRdWV1ZTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBm aWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIv UmVhY3RVcGRhdGVzLmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGli L1JlYWN0VXBkYXRlcy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uNDJm NGE3MDMKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0 LWRvbS9saWIvUmVhY3RVcGRhdGVzLmpzCkBAIC0wLDAgKzEsMjUwIEBACisvKioKKyAqIENvcHly aWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVk LgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHls ZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVj dG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRl bnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRp cmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX3Byb2RJbnZhcmlhbnQg PSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpLAorICAgIF9hc3NpZ24gPSByZXF1aXJl KCdvYmplY3QtYXNzaWduJyk7CisKK3ZhciBDYWxsYmFja1F1ZXVlID0gcmVxdWlyZSgnLi9DYWxs YmFja1F1ZXVlJyk7Cit2YXIgUG9vbGVkQ2xhc3MgPSByZXF1aXJlKCcuL1Bvb2xlZENsYXNzJyk7 Cit2YXIgUmVhY3RGZWF0dXJlRmxhZ3MgPSByZXF1aXJlKCcuL1JlYWN0RmVhdHVyZUZsYWdzJyk7 Cit2YXIgUmVhY3RSZWNvbmNpbGVyID0gcmVxdWlyZSgnLi9SZWFjdFJlY29uY2lsZXInKTsKK3Zh ciBUcmFuc2FjdGlvbiA9IHJlcXVpcmUoJy4vVHJhbnNhY3Rpb24nKTsKKwordmFyIGludmFyaWFu dCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpOworCit2YXIgZGlydHlDb21wb25lbnRz ID0gW107Cit2YXIgdXBkYXRlQmF0Y2hOdW1iZXIgPSAwOwordmFyIGFzYXBDYWxsYmFja1F1ZXVl ID0gQ2FsbGJhY2tRdWV1ZS5nZXRQb29sZWQoKTsKK3ZhciBhc2FwRW5xdWV1ZWQgPSBmYWxzZTsK KwordmFyIGJhdGNoaW5nU3RyYXRlZ3kgPSBudWxsOworCitmdW5jdGlvbiBlbnN1cmVJbmplY3Rl ZCgpIHsKKyAgIShSZWFjdFVwZGF0ZXMuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbiAmJiBiYXRj aGluZ1N0cmF0ZWd5KSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBp bnZhcmlhbnQoZmFsc2UsICdSZWFjdFVwZGF0ZXM6IG11c3QgaW5qZWN0IGEgcmVjb25jaWxlIHRy YW5zYWN0aW9uIGNsYXNzIGFuZCBiYXRjaGluZyBzdHJhdGVneScpIDogX3Byb2RJbnZhcmlhbnQo JzEyMycpIDogdm9pZCAwOworfQorCit2YXIgTkVTVEVEX1VQREFURVMgPSB7CisgIGluaXRpYWxp emU6IGZ1bmN0aW9uICgpIHsKKyAgICB0aGlzLmRpcnR5Q29tcG9uZW50c0xlbmd0aCA9IGRpcnR5 Q29tcG9uZW50cy5sZW5ndGg7CisgIH0sCisgIGNsb3NlOiBmdW5jdGlvbiAoKSB7CisgICAgaWYg KHRoaXMuZGlydHlDb21wb25lbnRzTGVuZ3RoICE9PSBkaXJ0eUNvbXBvbmVudHMubGVuZ3RoKSB7 CisgICAgICAvLyBBZGRpdGlvbmFsIHVwZGF0ZXMgd2VyZSBlbnF1ZXVlZCBieSBjb21wb25lbnRE aWRVcGRhdGUgaGFuZGxlcnMgb3IKKyAgICAgIC8vIHNpbWlsYXI7IGJlZm9yZSBvdXIgb3duIFVQ REFURV9RVUVVRUlORyB3cmFwcGVyIGNsb3Nlcywgd2Ugd2FudCB0byBydW4KKyAgICAgIC8vIHRo ZXNlIG5ldyB1cGRhdGVzIHNvIHRoYXQgaWYgQSdzIGNvbXBvbmVudERpZFVwZGF0ZSBjYWxscyBz ZXRTdGF0ZSBvbgorICAgICAgLy8gQiwgQiB3aWxsIHVwZGF0ZSBiZWZvcmUgdGhlIGNhbGxiYWNr IEEncyB1cGRhdGVyIHByb3ZpZGVkIHdoZW4gY2FsbGluZworICAgICAgLy8gc2V0U3RhdGUuCisg ICAgICBkaXJ0eUNvbXBvbmVudHMuc3BsaWNlKDAsIHRoaXMuZGlydHlDb21wb25lbnRzTGVuZ3Ro KTsKKyAgICAgIGZsdXNoQmF0Y2hlZFVwZGF0ZXMoKTsKKyAgICB9IGVsc2UgeworICAgICAgZGly dHlDb21wb25lbnRzLmxlbmd0aCA9IDA7CisgICAgfQorICB9Cit9OworCit2YXIgVVBEQVRFX1FV RVVFSU5HID0geworICBpbml0aWFsaXplOiBmdW5jdGlvbiAoKSB7CisgICAgdGhpcy5jYWxsYmFj a1F1ZXVlLnJlc2V0KCk7CisgIH0sCisgIGNsb3NlOiBmdW5jdGlvbiAoKSB7CisgICAgdGhpcy5j YWxsYmFja1F1ZXVlLm5vdGlmeUFsbCgpOworICB9Cit9OworCit2YXIgVFJBTlNBQ1RJT05fV1JB UFBFUlMgPSBbTkVTVEVEX1VQREFURVMsIFVQREFURV9RVUVVRUlOR107CisKK2Z1bmN0aW9uIFJl YWN0VXBkYXRlc0ZsdXNoVHJhbnNhY3Rpb24oKSB7CisgIHRoaXMucmVpbml0aWFsaXplVHJhbnNh Y3Rpb24oKTsKKyAgdGhpcy5kaXJ0eUNvbXBvbmVudHNMZW5ndGggPSBudWxsOworICB0aGlzLmNh bGxiYWNrUXVldWUgPSBDYWxsYmFja1F1ZXVlLmdldFBvb2xlZCgpOworICB0aGlzLnJlY29uY2ls ZVRyYW5zYWN0aW9uID0gUmVhY3RVcGRhdGVzLlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24uZ2V0 UG9vbGVkKAorICAvKiB1c2VDcmVhdGVFbGVtZW50ICovdHJ1ZSk7Cit9CisKK19hc3NpZ24oUmVh Y3RVcGRhdGVzRmx1c2hUcmFuc2FjdGlvbi5wcm90b3R5cGUsIFRyYW5zYWN0aW9uLCB7CisgIGdl dFRyYW5zYWN0aW9uV3JhcHBlcnM6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gVFJBTlNBQ1RJ T05fV1JBUFBFUlM7CisgIH0sCisKKyAgZGVzdHJ1Y3RvcjogZnVuY3Rpb24gKCkgeworICAgIHRo aXMuZGlydHlDb21wb25lbnRzTGVuZ3RoID0gbnVsbDsKKyAgICBDYWxsYmFja1F1ZXVlLnJlbGVh c2UodGhpcy5jYWxsYmFja1F1ZXVlKTsKKyAgICB0aGlzLmNhbGxiYWNrUXVldWUgPSBudWxsOwor ICAgIFJlYWN0VXBkYXRlcy5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uLnJlbGVhc2UodGhpcy5y ZWNvbmNpbGVUcmFuc2FjdGlvbik7CisgICAgdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbiA9IG51 bGw7CisgIH0sCisKKyAgcGVyZm9ybTogZnVuY3Rpb24gKG1ldGhvZCwgc2NvcGUsIGEpIHsKKyAg ICAvLyBFc3NlbnRpYWxseSBjYWxscyBgdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbi5wZXJmb3Jt KG1ldGhvZCwgc2NvcGUsIGEpYAorICAgIC8vIHdpdGggdGhpcyB0cmFuc2FjdGlvbidzIHdyYXBw ZXJzIGFyb3VuZCBpdC4KKyAgICByZXR1cm4gVHJhbnNhY3Rpb24ucGVyZm9ybS5jYWxsKHRoaXMs IHRoaXMucmVjb25jaWxlVHJhbnNhY3Rpb24ucGVyZm9ybSwgdGhpcy5yZWNvbmNpbGVUcmFuc2Fj dGlvbiwgbWV0aG9kLCBzY29wZSwgYSk7CisgIH0KK30pOworCitQb29sZWRDbGFzcy5hZGRQb29s aW5nVG8oUmVhY3RVcGRhdGVzRmx1c2hUcmFuc2FjdGlvbik7CisKK2Z1bmN0aW9uIGJhdGNoZWRV cGRhdGVzKGNhbGxiYWNrLCBhLCBiLCBjLCBkLCBlKSB7CisgIGVuc3VyZUluamVjdGVkKCk7Cisg IHJldHVybiBiYXRjaGluZ1N0cmF0ZWd5LmJhdGNoZWRVcGRhdGVzKGNhbGxiYWNrLCBhLCBiLCBj LCBkLCBlKTsKK30KKworLyoqCisgKiBBcnJheSBjb21wYXJhdG9yIGZvciBSZWFjdENvbXBvbmVu dHMgYnkgbW91bnQgb3JkZXJpbmcuCisgKgorICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gYzEg Zmlyc3QgY29tcG9uZW50IHlvdSdyZSBjb21wYXJpbmcKKyAqIEBwYXJhbSB7UmVhY3RDb21wb25l bnR9IGMyIHNlY29uZCBjb21wb25lbnQgeW91J3JlIGNvbXBhcmluZworICogQHJldHVybiB7bnVt YmVyfSBSZXR1cm4gdmFsdWUgdXNhYmxlIGJ5IEFycmF5LnByb3RvdHlwZS5zb3J0KCkuCisgKi8K K2Z1bmN0aW9uIG1vdW50T3JkZXJDb21wYXJhdG9yKGMxLCBjMikgeworICByZXR1cm4gYzEuX21v dW50T3JkZXIgLSBjMi5fbW91bnRPcmRlcjsKK30KKworZnVuY3Rpb24gcnVuQmF0Y2hlZFVwZGF0 ZXModHJhbnNhY3Rpb24pIHsKKyAgdmFyIGxlbiA9IHRyYW5zYWN0aW9uLmRpcnR5Q29tcG9uZW50 c0xlbmd0aDsKKyAgIShsZW4gPT09IGRpcnR5Q29tcG9uZW50cy5sZW5ndGgpID8gcHJvY2Vzcy5l bnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V4cGVjdGVk IGZsdXNoIHRyYW5zYWN0aW9uXCdzIHN0b3JlZCBkaXJ0eS1jb21wb25lbnRzIGxlbmd0aCAoJXMp IHRvIG1hdGNoIGRpcnR5LWNvbXBvbmVudHMgYXJyYXkgbGVuZ3RoICglcykuJywgbGVuLCBkaXJ0 eUNvbXBvbmVudHMubGVuZ3RoKSA6IF9wcm9kSW52YXJpYW50KCcxMjQnLCBsZW4sIGRpcnR5Q29t cG9uZW50cy5sZW5ndGgpIDogdm9pZCAwOworCisgIC8vIFNpbmNlIHJlY29uY2lsaW5nIGEgY29t cG9uZW50IGhpZ2hlciBpbiB0aGUgb3duZXIgaGllcmFyY2h5IHVzdWFsbHkgKG5vdAorICAvLyBh bHdheXMgLS0gc2VlIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpKSB3aWxsIHJlY29uY2lsZSBjaGls ZHJlbiwgcmVjb25jaWxlCisgIC8vIHRoZW0gYmVmb3JlIHRoZWlyIGNoaWxkcmVuIGJ5IHNvcnRp bmcgdGhlIGFycmF5LgorICBkaXJ0eUNvbXBvbmVudHMuc29ydChtb3VudE9yZGVyQ29tcGFyYXRv cik7CisKKyAgLy8gQW55IHVwZGF0ZXMgZW5xdWV1ZWQgd2hpbGUgcmVjb25jaWxpbmcgbXVzdCBi ZSBwZXJmb3JtZWQgYWZ0ZXIgdGhpcyBlbnRpcmUKKyAgLy8gYmF0Y2guIE90aGVyd2lzZSwgaWYg ZGlydHlDb21wb25lbnRzIGlzIFtBLCBCXSB3aGVyZSBBIGhhcyBjaGlsZHJlbiBCIGFuZAorICAv LyBDLCBCIGNvdWxkIHVwZGF0ZSB0d2ljZSBpbiBhIHNpbmdsZSBiYXRjaCBpZiBDJ3MgcmVuZGVy IGVucXVldWVzIGFuIHVwZGF0ZQorICAvLyB0byBCIChzaW5jZSBCIHdvdWxkIGhhdmUgYWxyZWFk eSB1cGRhdGVkLCB3ZSBzaG91bGQgc2tpcCBpdCwgYW5kIHRoZSBvbmx5CisgIC8vIHdheSB3ZSBj YW4ga25vdyB0byBkbyBzbyBpcyBieSBjaGVja2luZyB0aGUgYmF0Y2ggY291bnRlcikuCisgIHVw ZGF0ZUJhdGNoTnVtYmVyKys7CisKKyAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgewor ICAgIC8vIElmIGEgY29tcG9uZW50IGlzIHVubW91bnRlZCBiZWZvcmUgcGVuZGluZyBjaGFuZ2Vz IGFwcGx5LCBpdCB3aWxsIHN0aWxsCisgICAgLy8gYmUgaGVyZSwgYnV0IHdlIGFzc3VtZSB0aGF0 IGl0IGhhcyBjbGVhcmVkIGl0cyBfcGVuZGluZ0NhbGxiYWNrcyBhbmQKKyAgICAvLyB0aGF0IHBl cmZvcm1VcGRhdGVJZk5lY2Vzc2FyeSBpcyBhIG5vb3AuCisgICAgdmFyIGNvbXBvbmVudCA9IGRp cnR5Q29tcG9uZW50c1tpXTsKKworICAgIC8vIElmIHBlcmZvcm1VcGRhdGVJZk5lY2Vzc2FyeSBo YXBwZW5zIHRvIGVucXVldWUgYW55IG5ldyB1cGRhdGVzLCB3ZQorICAgIC8vIHNob3VsZG4ndCBl eGVjdXRlIHRoZSBjYWxsYmFja3MgdW50aWwgdGhlIG5leHQgcmVuZGVyIGhhcHBlbnMsIHNvCisg ICAgLy8gc3Rhc2ggdGhlIGNhbGxiYWNrcyBmaXJzdAorICAgIHZhciBjYWxsYmFja3MgPSBjb21w b25lbnQuX3BlbmRpbmdDYWxsYmFja3M7CisgICAgY29tcG9uZW50Ll9wZW5kaW5nQ2FsbGJhY2tz ID0gbnVsbDsKKworICAgIHZhciBtYXJrZXJOYW1lOworICAgIGlmIChSZWFjdEZlYXR1cmVGbGFn cy5sb2dUb3BMZXZlbFJlbmRlcnMpIHsKKyAgICAgIHZhciBuYW1lZENvbXBvbmVudCA9IGNvbXBv bmVudDsKKyAgICAgIC8vIER1Y2sgdHlwZSBUb3BMZXZlbFdyYXBwZXIuIFRoaXMgaXMgcHJvYmFi bHkgYWx3YXlzIHRydWUuCisgICAgICBpZiAoY29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC50eXBl LmlzUmVhY3RUb3BMZXZlbFdyYXBwZXIpIHsKKyAgICAgICAgbmFtZWRDb21wb25lbnQgPSBjb21w b25lbnQuX3JlbmRlcmVkQ29tcG9uZW50OworICAgICAgfQorICAgICAgbWFya2VyTmFtZSA9ICdS ZWFjdCB1cGRhdGU6ICcgKyBuYW1lZENvbXBvbmVudC5nZXROYW1lKCk7CisgICAgICBjb25zb2xl LnRpbWUobWFya2VyTmFtZSk7CisgICAgfQorCisgICAgUmVhY3RSZWNvbmNpbGVyLnBlcmZvcm1V cGRhdGVJZk5lY2Vzc2FyeShjb21wb25lbnQsIHRyYW5zYWN0aW9uLnJlY29uY2lsZVRyYW5zYWN0 aW9uLCB1cGRhdGVCYXRjaE51bWJlcik7CisKKyAgICBpZiAobWFya2VyTmFtZSkgeworICAgICAg Y29uc29sZS50aW1lRW5kKG1hcmtlck5hbWUpOworICAgIH0KKworICAgIGlmIChjYWxsYmFja3Mp IHsKKyAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2FsbGJhY2tzLmxlbmd0aDsgaisrKSB7Cisg ICAgICAgIHRyYW5zYWN0aW9uLmNhbGxiYWNrUXVldWUuZW5xdWV1ZShjYWxsYmFja3Nbal0sIGNv bXBvbmVudC5nZXRQdWJsaWNJbnN0YW5jZSgpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwor dmFyIGZsdXNoQmF0Y2hlZFVwZGF0ZXMgPSBmdW5jdGlvbiAoKSB7CisgIC8vIFJlYWN0VXBkYXRl c0ZsdXNoVHJhbnNhY3Rpb24ncyB3cmFwcGVycyB3aWxsIGNsZWFyIHRoZSBkaXJ0eUNvbXBvbmVu dHMKKyAgLy8gYXJyYXkgYW5kIHBlcmZvcm0gYW55IHVwZGF0ZXMgZW5xdWV1ZWQgYnkgbW91bnQt cmVhZHkgaGFuZGxlcnMgKGkuZS4sCisgIC8vIGNvbXBvbmVudERpZFVwZGF0ZSkgYnV0IHdlIG5l ZWQgdG8gY2hlY2sgaGVyZSB0b28gaW4gb3JkZXIgdG8gY2F0Y2gKKyAgLy8gdXBkYXRlcyBlbnF1 ZXVlZCBieSBzZXRTdGF0ZSBjYWxsYmFja3MgYW5kIGFzYXAgY2FsbHMuCisgIHdoaWxlIChkaXJ0 eUNvbXBvbmVudHMubGVuZ3RoIHx8IGFzYXBFbnF1ZXVlZCkgeworICAgIGlmIChkaXJ0eUNvbXBv bmVudHMubGVuZ3RoKSB7CisgICAgICB2YXIgdHJhbnNhY3Rpb24gPSBSZWFjdFVwZGF0ZXNGbHVz aFRyYW5zYWN0aW9uLmdldFBvb2xlZCgpOworICAgICAgdHJhbnNhY3Rpb24ucGVyZm9ybShydW5C YXRjaGVkVXBkYXRlcywgbnVsbCwgdHJhbnNhY3Rpb24pOworICAgICAgUmVhY3RVcGRhdGVzRmx1 c2hUcmFuc2FjdGlvbi5yZWxlYXNlKHRyYW5zYWN0aW9uKTsKKyAgICB9CisKKyAgICBpZiAoYXNh cEVucXVldWVkKSB7CisgICAgICBhc2FwRW5xdWV1ZWQgPSBmYWxzZTsKKyAgICAgIHZhciBxdWV1 ZSA9IGFzYXBDYWxsYmFja1F1ZXVlOworICAgICAgYXNhcENhbGxiYWNrUXVldWUgPSBDYWxsYmFj a1F1ZXVlLmdldFBvb2xlZCgpOworICAgICAgcXVldWUubm90aWZ5QWxsKCk7CisgICAgICBDYWxs YmFja1F1ZXVlLnJlbGVhc2UocXVldWUpOworICAgIH0KKyAgfQorfTsKKworLyoqCisgKiBNYXJr IGEgY29tcG9uZW50IGFzIG5lZWRpbmcgYSByZXJlbmRlciwgYWRkaW5nIGFuIG9wdGlvbmFsIGNh bGxiYWNrIHRvIGEKKyAqIGxpc3Qgb2YgZnVuY3Rpb25zIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQg b25jZSB0aGUgcmVyZW5kZXIgb2NjdXJzLgorICovCitmdW5jdGlvbiBlbnF1ZXVlVXBkYXRlKGNv bXBvbmVudCkgeworICBlbnN1cmVJbmplY3RlZCgpOworCisgIC8vIFZhcmlvdXMgcGFydHMgb2Yg b3VyIGNvZGUgKHN1Y2ggYXMgUmVhY3RDb21wb3NpdGVDb21wb25lbnQncworICAvLyBfcmVuZGVy VmFsaWRhdGVkQ29tcG9uZW50KSBhc3N1bWUgdGhhdCBjYWxscyB0byByZW5kZXIgYXJlbid0IG5l c3RlZDsKKyAgLy8gdmVyaWZ5IHRoYXQgdGhhdCdzIHRoZSBjYXNlLiAoVGhpcyBpcyBjYWxsZWQg YnkgZWFjaCB0b3AtbGV2ZWwgdXBkYXRlCisgIC8vIGZ1bmN0aW9uLCBsaWtlIHNldFN0YXRlLCBm b3JjZVVwZGF0ZSwgZXRjLjsgY3JlYXRpb24gYW5kCisgIC8vIGRlc3RydWN0aW9uIG9mIHRvcC1s ZXZlbCBjb21wb25lbnRzIGlzIGd1YXJkZWQgaW4gUmVhY3RNb3VudC4pCisKKyAgaWYgKCFiYXRj aGluZ1N0cmF0ZWd5LmlzQmF0Y2hpbmdVcGRhdGVzKSB7CisgICAgYmF0Y2hpbmdTdHJhdGVneS5i YXRjaGVkVXBkYXRlcyhlbnF1ZXVlVXBkYXRlLCBjb21wb25lbnQpOworICAgIHJldHVybjsKKyAg fQorCisgIGRpcnR5Q29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7CisgIGlmIChjb21wb25lbnQu X3VwZGF0ZUJhdGNoTnVtYmVyID09IG51bGwpIHsKKyAgICBjb21wb25lbnQuX3VwZGF0ZUJhdGNo TnVtYmVyID0gdXBkYXRlQmF0Y2hOdW1iZXIgKyAxOworICB9Cit9CisKKy8qKgorICogRW5xdWV1 ZSBhIGNhbGxiYWNrIHRvIGJlIHJ1biBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGJhdGNoaW5n IGN5Y2xlLiBUaHJvd3MKKyAqIGlmIG5vIHVwZGF0ZXMgYXJlIGN1cnJlbnRseSBiZWluZyBwZXJm b3JtZWQuCisgKi8KK2Z1bmN0aW9uIGFzYXAoY2FsbGJhY2ssIGNvbnRleHQpIHsKKyAgIWJhdGNo aW5nU3RyYXRlZ3kuaXNCYXRjaGluZ1VwZGF0ZXMgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0g J3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RVcGRhdGVzLmFzYXA6IENhblwn dCBlbnF1ZXVlIGFuIGFzYXAgY2FsbGJhY2sgaW4gYSBjb250ZXh0IHdoZXJldXBkYXRlcyBhcmUg bm90IGJlaW5nIGJhdGNoZWQuJykgOiBfcHJvZEludmFyaWFudCgnMTI1JykgOiB2b2lkIDA7Cisg IGFzYXBDYWxsYmFja1F1ZXVlLmVucXVldWUoY2FsbGJhY2ssIGNvbnRleHQpOworICBhc2FwRW5x dWV1ZWQgPSB0cnVlOworfQorCit2YXIgUmVhY3RVcGRhdGVzSW5qZWN0aW9uID0geworICBpbmpl Y3RSZWNvbmNpbGVUcmFuc2FjdGlvbjogZnVuY3Rpb24gKFJlY29uY2lsZVRyYW5zYWN0aW9uKSB7 CisgICAgIVJlY29uY2lsZVRyYW5zYWN0aW9uID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdw cm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0VXBkYXRlczogbXVzdCBwcm92aWRl IGEgcmVjb25jaWxlIHRyYW5zYWN0aW9uIGNsYXNzJykgOiBfcHJvZEludmFyaWFudCgnMTI2Jykg OiB2b2lkIDA7CisgICAgUmVhY3RVcGRhdGVzLlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24gPSBS ZWNvbmNpbGVUcmFuc2FjdGlvbjsKKyAgfSwKKworICBpbmplY3RCYXRjaGluZ1N0cmF0ZWd5OiBm dW5jdGlvbiAoX2JhdGNoaW5nU3RyYXRlZ3kpIHsKKyAgICAhX2JhdGNoaW5nU3RyYXRlZ3kgPyBw cm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAn UmVhY3RVcGRhdGVzOiBtdXN0IHByb3ZpZGUgYSBiYXRjaGluZyBzdHJhdGVneScpIDogX3Byb2RJ bnZhcmlhbnQoJzEyNycpIDogdm9pZCAwOworICAgICEodHlwZW9mIF9iYXRjaGluZ1N0cmF0ZWd5 LmJhdGNoZWRVcGRhdGVzID09PSAnZnVuY3Rpb24nKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9 PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdFVwZGF0ZXM6IG11c3QgcHJv dmlkZSBhIGJhdGNoZWRVcGRhdGVzKCkgZnVuY3Rpb24nKSA6IF9wcm9kSW52YXJpYW50KCcxMjgn KSA6IHZvaWQgMDsKKyAgICAhKHR5cGVvZiBfYmF0Y2hpbmdTdHJhdGVneS5pc0JhdGNoaW5nVXBk YXRlcyA9PT0gJ2Jvb2xlYW4nKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlv bicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdFVwZGF0ZXM6IG11c3QgcHJvdmlkZSBhbiBpc0Jh dGNoaW5nVXBkYXRlcyBib29sZWFuIGF0dHJpYnV0ZScpIDogX3Byb2RJbnZhcmlhbnQoJzEyOScp IDogdm9pZCAwOworICAgIGJhdGNoaW5nU3RyYXRlZ3kgPSBfYmF0Y2hpbmdTdHJhdGVneTsKKyAg fQorfTsKKwordmFyIFJlYWN0VXBkYXRlcyA9IHsKKyAgLyoqCisgICAqIFJlYWN0IHJlZmVyZW5j ZXMgYFJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb25gIHVzaW5nIHRoaXMgcHJvcGVydHkgaW4gb3Jk ZXIKKyAgICogdG8gYWxsb3cgZGVwZW5kZW5jeSBpbmplY3Rpb24uCisgICAqCisgICAqIEBpbnRl cm5hbAorICAgKi8KKyAgUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbjogbnVsbCwKKworICBiYXRj aGVkVXBkYXRlczogYmF0Y2hlZFVwZGF0ZXMsCisgIGVucXVldWVVcGRhdGU6IGVucXVldWVVcGRh dGUsCisgIGZsdXNoQmF0Y2hlZFVwZGF0ZXM6IGZsdXNoQmF0Y2hlZFVwZGF0ZXMsCisgIGluamVj dGlvbjogUmVhY3RVcGRhdGVzSW5qZWN0aW9uLAorICBhc2FwOiBhc2FwCit9OworCittb2R1bGUu ZXhwb3J0cyA9IFJlYWN0VXBkYXRlczsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYg LS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVhY3RWZXJz aW9uLmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1JlYWN0VmVy c2lvbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uNTEyMWI4YjcKLS0t IC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIv UmVhY3RWZXJzaW9uLmpzCkBAIC0wLDAgKzEsMTMgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMt cHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog VGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2Ug Zm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRo aXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMg Y2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5Lgor ICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK21vZHVsZS5leHBvcnRzID0gJzE1LjQuMic7Clwg Tm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGlj L3ZlbmRvci9yZWFjdC1kb20vbGliL1Jlc3BvbmRlckV2ZW50UGx1Z2luLmpzIGIvd2ViL3BnYWRt aW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1Jlc3BvbmRlckV2ZW50UGx1Z2luLmpzCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi5kMmI5YmVmYwotLS0gL2Rldi9udWxs CisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZXNwb25kZXJF dmVudFBsdWdpbi5qcwpAQCAtMCwwICsxLDUwNyBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1w cmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBU aGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBm b3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhp cyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBj YW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisg KgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIEV2ZW50UGx1Z2luVXRpbHMgPSByZXF1aXJl KCcuL0V2ZW50UGx1Z2luVXRpbHMnKTsKK3ZhciBFdmVudFByb3BhZ2F0b3JzID0gcmVxdWlyZSgn Li9FdmVudFByb3BhZ2F0b3JzJyk7Cit2YXIgUmVzcG9uZGVyU3ludGhldGljRXZlbnQgPSByZXF1 aXJlKCcuL1Jlc3BvbmRlclN5bnRoZXRpY0V2ZW50Jyk7Cit2YXIgUmVzcG9uZGVyVG91Y2hIaXN0 b3J5U3RvcmUgPSByZXF1aXJlKCcuL1Jlc3BvbmRlclRvdWNoSGlzdG9yeVN0b3JlJyk7CisKK3Zh ciBhY2N1bXVsYXRlID0gcmVxdWlyZSgnLi9hY2N1bXVsYXRlJyk7CisKK3ZhciBpc1N0YXJ0aXNo ID0gRXZlbnRQbHVnaW5VdGlscy5pc1N0YXJ0aXNoOwordmFyIGlzTW92ZWlzaCA9IEV2ZW50UGx1 Z2luVXRpbHMuaXNNb3ZlaXNoOwordmFyIGlzRW5kaXNoID0gRXZlbnRQbHVnaW5VdGlscy5pc0Vu ZGlzaDsKK3ZhciBleGVjdXRlRGlyZWN0RGlzcGF0Y2ggPSBFdmVudFBsdWdpblV0aWxzLmV4ZWN1 dGVEaXJlY3REaXNwYXRjaDsKK3ZhciBoYXNEaXNwYXRjaGVzID0gRXZlbnRQbHVnaW5VdGlscy5o YXNEaXNwYXRjaGVzOwordmFyIGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlclN0b3BBdFRydWUgPSBF dmVudFBsdWdpblV0aWxzLmV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlclN0b3BBdFRydWU7CisKKy8q KgorICogSW5zdGFuY2Ugb2YgZWxlbWVudCB0aGF0IHNob3VsZCByZXNwb25kIHRvIHRvdWNoL21v dmUgdHlwZXMgb2YgaW50ZXJhY3Rpb25zLAorICogYXMgaW5kaWNhdGVkIGV4cGxpY2l0bHkgYnkg cmVsZXZhbnQgY2FsbGJhY2tzLgorICovCit2YXIgcmVzcG9uZGVySW5zdCA9IG51bGw7CisKKy8q KgorICogQ291bnQgb2YgY3VycmVudCB0b3VjaGVzLiBBIHRleHRJbnB1dCBzaG91bGQgYmVjb21l IHJlc3BvbmRlciBpZmYgdGhlCisgKiBzZWxlY3Rpb24gY2hhbmdlcyB3aGlsZSB0aGVyZSBpcyBh IHRvdWNoIG9uIHRoZSBzY3JlZW4uCisgKi8KK3ZhciB0cmFja2VkVG91Y2hDb3VudCA9IDA7CisK Ky8qKgorICogTGFzdCByZXBvcnRlZCBudW1iZXIgb2YgYWN0aXZlIHRvdWNoZXMuCisgKi8KK3Zh ciBwcmV2aW91c0FjdGl2ZVRvdWNoZXMgPSAwOworCit2YXIgY2hhbmdlUmVzcG9uZGVyID0gZnVu Y3Rpb24gKG5leHRSZXNwb25kZXJJbnN0LCBibG9ja0hvc3RSZXNwb25kZXIpIHsKKyAgdmFyIG9s ZFJlc3BvbmRlckluc3QgPSByZXNwb25kZXJJbnN0OworICByZXNwb25kZXJJbnN0ID0gbmV4dFJl c3BvbmRlckluc3Q7CisgIGlmIChSZXNwb25kZXJFdmVudFBsdWdpbi5HbG9iYWxSZXNwb25kZXJI YW5kbGVyICE9PSBudWxsKSB7CisgICAgUmVzcG9uZGVyRXZlbnRQbHVnaW4uR2xvYmFsUmVzcG9u ZGVySGFuZGxlci5vbkNoYW5nZShvbGRSZXNwb25kZXJJbnN0LCBuZXh0UmVzcG9uZGVySW5zdCwg YmxvY2tIb3N0UmVzcG9uZGVyKTsKKyAgfQorfTsKKwordmFyIGV2ZW50VHlwZXMgPSB7CisgIC8q KgorICAgKiBPbiBhIGB0b3VjaFN0YXJ0YC9gbW91c2VEb3duYCwgaXMgaXQgZGVzaXJlZCB0aGF0 IHRoaXMgZWxlbWVudCBiZWNvbWUgdGhlCisgICAqIHJlc3BvbmRlcj8KKyAgICovCisgIHN0YXJ0 U2hvdWxkU2V0UmVzcG9uZGVyOiB7CisgICAgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6IHsKKyAg ICAgIGJ1YmJsZWQ6ICdvblN0YXJ0U2hvdWxkU2V0UmVzcG9uZGVyJywKKyAgICAgIGNhcHR1cmVk OiAnb25TdGFydFNob3VsZFNldFJlc3BvbmRlckNhcHR1cmUnCisgICAgfQorICB9LAorCisgIC8q KgorICAgKiBPbiBhIGBzY3JvbGxgLCBpcyBpdCBkZXNpcmVkIHRoYXQgdGhpcyBlbGVtZW50IGJl Y29tZSB0aGUgcmVzcG9uZGVyPyBUaGlzCisgICAqIGlzIHVzdWFsbHkgbm90IG5lZWRlZCwgYnV0 IHNob3VsZCBiZSB1c2VkIHRvIHJldHJvYWN0aXZlbHkgaW5mZXIgdGhhdCBhCisgICAqIGB0b3Vj aFN0YXJ0YCBoYWQgb2NjdXJyZWQgZHVyaW5nIG1vbWVudHVtIHNjcm9sbC4gRHVyaW5nIGEgbW9t ZW50dW0gc2Nyb2xsLAorICAgKiBhIHRvdWNoIHN0YXJ0IHdpbGwgYmUgaW1tZWRpYXRlbHkgZm9s bG93ZWQgYnkgYSBzY3JvbGwgZXZlbnQgaWYgdGhlIHZpZXcgaXMKKyAgICogY3VycmVudGx5IHNj cm9sbGluZy4KKyAgICoKKyAgICogVE9ETzogVGhpcyBzaG91bGRuJ3QgYnViYmxlLgorICAgKi8K KyAgc2Nyb2xsU2hvdWxkU2V0UmVzcG9uZGVyOiB7CisgICAgcGhhc2VkUmVnaXN0cmF0aW9uTmFt ZXM6IHsKKyAgICAgIGJ1YmJsZWQ6ICdvblNjcm9sbFNob3VsZFNldFJlc3BvbmRlcicsCisgICAg ICBjYXB0dXJlZDogJ29uU2Nyb2xsU2hvdWxkU2V0UmVzcG9uZGVyQ2FwdHVyZScKKyAgICB9Cisg IH0sCisKKyAgLyoqCisgICAqIE9uIHRleHQgc2VsZWN0aW9uIGNoYW5nZSwgc2hvdWxkIHRoaXMg ZWxlbWVudCBiZWNvbWUgdGhlIHJlc3BvbmRlcj8gVGhpcworICAgKiBpcyBuZWVkZWQgZm9yIHRl eHQgaW5wdXRzIG9yIG90aGVyIHZpZXdzIHdpdGggbmF0aXZlIHNlbGVjdGlvbiwgc28gdGhlCisg ICAqIEpTIHZpZXcgY2FuIGNsYWltIHRoZSByZXNwb25kZXIuCisgICAqCisgICAqIFRPRE86IFRo aXMgc2hvdWxkbid0IGJ1YmJsZS4KKyAgICovCisgIHNlbGVjdGlvbkNoYW5nZVNob3VsZFNldFJl c3BvbmRlcjogeworICAgIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOiB7CisgICAgICBidWJibGVk OiAnb25TZWxlY3Rpb25DaGFuZ2VTaG91bGRTZXRSZXNwb25kZXInLAorICAgICAgY2FwdHVyZWQ6 ICdvblNlbGVjdGlvbkNoYW5nZVNob3VsZFNldFJlc3BvbmRlckNhcHR1cmUnCisgICAgfQorICB9 LAorCisgIC8qKgorICAgKiBPbiBhIGB0b3VjaE1vdmVgL2Btb3VzZU1vdmVgLCBpcyBpdCBkZXNp cmVkIHRoYXQgdGhpcyBlbGVtZW50IGJlY29tZSB0aGUKKyAgICogcmVzcG9uZGVyPworICAgKi8K KyAgbW92ZVNob3VsZFNldFJlc3BvbmRlcjogeworICAgIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVz OiB7CisgICAgICBidWJibGVkOiAnb25Nb3ZlU2hvdWxkU2V0UmVzcG9uZGVyJywKKyAgICAgIGNh cHR1cmVkOiAnb25Nb3ZlU2hvdWxkU2V0UmVzcG9uZGVyQ2FwdHVyZScKKyAgICB9CisgIH0sCisK KyAgLyoqCisgICAqIERpcmVjdCByZXNwb25kZXIgZXZlbnRzIGRpc3BhdGNoZWQgZGlyZWN0bHkg dG8gcmVzcG9uZGVyLiBEbyBub3QgYnViYmxlLgorICAgKi8KKyAgcmVzcG9uZGVyU3RhcnQ6IHsg cmVnaXN0cmF0aW9uTmFtZTogJ29uUmVzcG9uZGVyU3RhcnQnIH0sCisgIHJlc3BvbmRlck1vdmU6 IHsgcmVnaXN0cmF0aW9uTmFtZTogJ29uUmVzcG9uZGVyTW92ZScgfSwKKyAgcmVzcG9uZGVyRW5k OiB7IHJlZ2lzdHJhdGlvbk5hbWU6ICdvblJlc3BvbmRlckVuZCcgfSwKKyAgcmVzcG9uZGVyUmVs ZWFzZTogeyByZWdpc3RyYXRpb25OYW1lOiAnb25SZXNwb25kZXJSZWxlYXNlJyB9LAorICByZXNw b25kZXJUZXJtaW5hdGlvblJlcXVlc3Q6IHsKKyAgICByZWdpc3RyYXRpb25OYW1lOiAnb25SZXNw b25kZXJUZXJtaW5hdGlvblJlcXVlc3QnCisgIH0sCisgIHJlc3BvbmRlckdyYW50OiB7IHJlZ2lz dHJhdGlvbk5hbWU6ICdvblJlc3BvbmRlckdyYW50JyB9LAorICByZXNwb25kZXJSZWplY3Q6IHsg cmVnaXN0cmF0aW9uTmFtZTogJ29uUmVzcG9uZGVyUmVqZWN0JyB9LAorICByZXNwb25kZXJUZXJt aW5hdGU6IHsgcmVnaXN0cmF0aW9uTmFtZTogJ29uUmVzcG9uZGVyVGVybWluYXRlJyB9Cit9Owor CisvKioKKyAqCisgKiBSZXNwb25kZXIgU3lzdGVtOgorICogLS0tLS0tLS0tLS0tLS0tLQorICoK KyAqIC0gQSBnbG9iYWwsIHNvbGl0YXJ5ICJpbnRlcmFjdGlvbiBsb2NrIiBvbiBhIHZpZXcuCisg KiAtIElmIGEgbm9kZSBiZWNvbWVzIHRoZSByZXNwb25kZXIsIGl0IHNob3VsZCBjb252ZXkgdmlz dWFsIGZlZWRiYWNrCisgKiAgIGltbWVkaWF0ZWx5IHRvIGluZGljYXRlIHNvLCBlaXRoZXIgYnkg aGlnaGxpZ2h0aW5nIG9yIG1vdmluZyBhY2NvcmRpbmdseS4KKyAqIC0gVG8gYmUgdGhlIHJlc3Bv bmRlciBtZWFucywgdGhhdCB0b3VjaGVzIGFyZSBleGNsdXNpdmVseSBpbXBvcnRhbnQgdG8gdGhh dAorICogICByZXNwb25kZXIgdmlldywgYW5kIG5vIG90aGVyIHZpZXcuCisgKiAtIFdoaWxlIHRv dWNoZXMgYXJlIHN0aWxsIG9jY3VycmluZywgdGhlIHJlc3BvbmRlciBsb2NrIGNhbiBiZSB0cmFu c2ZlcnJlZCB0bworICogICBhIG5ldyB2aWV3LCBidXQgb25seSB0byBpbmNyZWFzaW5nbHkgImhp Z2hlciIgdmlld3MgKG1lYW5pbmcgYW5jZXN0b3JzIG9mCisgKiAgIHRoZSBjdXJyZW50IHJlc3Bv bmRlcikuCisgKgorICogUmVzcG9uZGVyIGJlaW5nIGdyYW50ZWQ6CisgKiAtLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyAqCisgKiAtIFRvdWNoIHN0YXJ0cywgbW92ZXMsIGFuZCBzY3JvbGxzIGNh biBjYXVzZSBhbiBJRCB0byBiZWNvbWUgdGhlIHJlc3BvbmRlci4KKyAqIC0gV2UgY2FwdHVyZS9i dWJibGUgYHN0YXJ0U2hvdWxkU2V0UmVzcG9uZGVyYC9gbW92ZVNob3VsZFNldFJlc3BvbmRlcmAg dG8KKyAqICAgdGhlICJhcHByb3ByaWF0ZSBwbGFjZSIuCisgKiAtIElmIG5vdGhpbmcgaXMgY3Vy cmVudGx5IHRoZSByZXNwb25kZXIsIHRoZSAiYXBwcm9wcmlhdGUgcGxhY2UiIGlzIHRoZQorICog ICBpbml0aWF0aW5nIGV2ZW50J3MgYHRhcmdldElEYC4KKyAqIC0gSWYgc29tZXRoaW5nICppcyog YWxyZWFkeSB0aGUgcmVzcG9uZGVyLCB0aGUgImFwcHJvcHJpYXRlIHBsYWNlIiBpcyB0aGUKKyAq ICAgZmlyc3QgY29tbW9uIGFuY2VzdG9yIG9mIHRoZSBldmVudCB0YXJnZXQgYW5kIHRoZSBjdXJy ZW50IGByZXNwb25kZXJJbnN0YC4KKyAqIC0gU29tZSBuZWdvdGlhdGlvbiBoYXBwZW5zOiBTZWUg dGhlIHRpbWluZyBkaWFncmFtIGJlbG93LgorICogLSBTY3JvbGxlZCB2aWV3cyBhdXRvbWF0aWNh bGx5IGJlY29tZSByZXNwb25kZXIuIFRoZSByZWFzb25pbmcgaXMgdGhhdCBhCisgKiAgIHBsYXRm b3JtIHNjcm9sbCB2aWV3IHRoYXQgaXNuJ3QgYnVpbHQgb24gdG9wIG9mIHRoZSByZXNwb25kZXIg c3lzdGVtIGhhcworICogICBiZWdhbiBzY3JvbGxpbmcsIGFuZCB0aGUgYWN0aXZlIHJlc3BvbmRl ciBtdXN0IG5vdyBiZSBub3RpZmllZCB0aGF0IHRoZQorICogICBpbnRlcmFjdGlvbiBpcyBubyBs b25nZXIgbG9ja2VkIHRvIGl0IC0gdGhlIHN5c3RlbSBoYXMgdGFrZW4gb3Zlci4KKyAqCisgKiAt IFJlc3BvbmRlciBiZWluZyByZWxlYXNlZDoKKyAqICAgQXMgc29vbiBhcyBubyBtb3JlIHRvdWNo ZXMgdGhhdCAqc3RhcnRlZCogaW5zaWRlIG9mIGRlc2NlbmRhbnRzIG9mIHRoZQorICogICAqY3Vy cmVudCogcmVzcG9uZGVySW5zdCwgYW4gYG9uUmVzcG9uZGVyUmVsZWFzZWAgZXZlbnQgaXMgZGlz cGF0Y2hlZCB0byB0aGUKKyAqICAgY3VycmVudCByZXNwb25kZXIsIGFuZCB0aGUgcmVzcG9uZGVy IGxvY2sgaXMgcmVsZWFzZWQuCisgKgorICogVE9ETzoKKyAqIC0gb24gImVuZCIsIGEgY2FsbGJh Y2sgaG9vayBmb3IgYG9uUmVzcG9uZGVyRW5kU2hvdWxkUmVtYWluUmVzcG9uZGVyYCB0aGF0Cisg KiAgIGRldGVybWluZXMgaWYgdGhlIHJlc3BvbmRlciBsb2NrIHNob3VsZCByZW1haW4uCisgKiAt IElmIGEgdmlldyBzaG91bGRuJ3QgInJlbWFpbiIgdGhlIHJlc3BvbmRlciwgYW55IGFjdGl2ZSB0 b3VjaGVzIHNob3VsZCBieQorICogICBkZWZhdWx0IGJlIGNvbnNpZGVyZWQgImRlYWQiIGFuZCBk byBub3QgaW5mbHVlbmNlIGZ1dHVyZSBuZWdvdGlhdGlvbnMgb3IKKyAqICAgYnViYmxlIHBhdGhz LiBJdCBzaG91bGQgYmUgYXMgaWYgdGhvc2UgdG91Y2hlcyBkbyBub3QgZXhpc3QuCisgKiAtLSBG b3IgbXVsdGl0b3VjaDogVXN1YWxseSBhIHRyYW5zbGF0ZS16IHdpbGwgY2hvb3NlIHRvICJyZW1h aW4iIHJlc3BvbmRlcgorICogIGFmdGVyIG9uZSBvdXQgb2YgbWFueSB0b3VjaGVzIGVuZGVkLiBG b3IgdHJhbnNsYXRlLXksIHVzdWFsbHkgdGhlIHZpZXcKKyAqICBkb2Vzbid0IHdpc2ggdG8gInJl bWFpbiIgcmVzcG9uZGVyIGFmdGVyIG9uZSBvZiBtYW55IHRvdWNoZXMgZW5kLgorICogLSBDb25z aWRlciBidWlsZGluZyB0aGlzIG9uIHRvcCBvZiBhIGBzdG9wUHJvcGFnYXRpb25gIG1vZGVsIHNp bWlsYXIgdG8KKyAqICAgYFczQ2AgZXZlbnRzLgorICogLSBFbnN1cmUgdGhhdCBgb25SZXNwb25k ZXJUZXJtaW5hdGVgIGlzIGNhbGxlZCBvbiB0b3VjaCBjYW5jZWxzLCB3aGV0aGVyIG9yCisgKiAg IG5vdCBgb25SZXNwb25kZXJUZXJtaW5hdGlvblJlcXVlc3RgIHJldHVybnMgYHRydWVgIG9yIGBm YWxzZWAuCisgKgorICovCisKKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgTmVnb3RpYXRpb24gUGVyZm9ybWVkCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgICAgICAg ICAgXAorUHJvY2VzcyBsb3cgbGV2ZWwgZXZlbnRzIHRvICAgICsgICAgIEN1cnJlbnQgUmVzcG9u ZGVyICAgICAgKyAgIHdhbnRzUmVzcG9uZGVySUQKK2RldGVybWluZSB3aG8gdG8gcGVyZm9ybSBu ZWdvdC18ICAgKGlmIGFueSBleGlzdHMgYXQgYWxsKSAgIHwKK2lhdGlvbi90cmFuc2l0aW9uICAg ICAgICAgICAgICB8IE90aGVyd2lzZSBqdXN0IHBhc3MgdGhyb3VnaHwKKy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tLS0rCitCdWJibGUgdG8gZmluZCBmaXJzdCBJRCAgICAgICAgfCAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8Cit0byByZXR1cm4gdHJ1ZTp3YW50c1Jlc3BvbmRlcklEfCAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICstLS0tLS0tLS0tLS0tKyAgICAgICAg ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHwgb25Ub3VjaFN0YXJ0fCAg ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICstLS0tLS0rLS0t LS0tKyAgICAgbm9uZSAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAg ICB8ICAgICAgICAgICAgcmV0dXJufCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisrLS0t LS0tLS0tLS12LS0tLS0tLS0tLS0tLSt0cnVlfCArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyB8 Cit8b25TdGFydFNob3VsZFNldFJlc3BvbmRlcnwtLS0tLT58b25SZXNwb25kZXJTdGFydCAoY3Vy KSAgfDwtLS0tLS0tLS0tLSsKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKyAgICB8ICstLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0rIHwgICAgICAgICAgfAorICAgICAgICAgICAgfCAgICAgICAg ICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCArLS0tLS0tLS0rLS0tLS0t LSsKKyAgICAgICAgICAgIHwgcmV0dXJuZWQgdHJ1ZSBmb3J8ICAgICAgIGZhbHNlOlJFSkVDVCAr LS0tLS0tLS0+fG9uUmVzcG9uZGVyUmVqZWN0CisgICAgICAgICAgICB8IHdhbnRzUmVzcG9uZGVy SUQgfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8ICstLS0tLS0tLS0tLS0tLS0tKworICAg ICAgICAgICAgfCAobm93IGF0dGVtcHQgICAgIHwgKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLSsg fAorICAgICAgICAgICAgfCAgaGFuZG9mZikgICAgICAgIHwgfCAgIG9uUmVzcG9uZGVyICAgICAg ICAgIHwgfAorICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0+fCAgICAgIFRlcm1pbmF0 aW9uUmVxdWVzdHwgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKy0tLS0tLS0t LS0tLS0tLS0tLSstLS0tLSsgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg ICAgICAgICAgICAgICAgIHwgICAgICAgfCArLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgdHJ1ZTpHUkFOVCArLS0tLS0tLS0+fG9uUmVz cG9uZGVyR3JhbnR8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8ICstLS0tLS0tLSstLS0tLS0tKworICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgfCAgICAgICAgICB8Cisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8ICAgb25SZXNwb25kZXJUZXJtaW5hdGUg fDwtLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICstLS0tLS0t LS0tLS0tLS0tLS0rLS0tLS0rIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAg ICAgICAgICAgICAgICAgICB8ICAgICAgIHwgKy0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tPnxvblJl c3BvbmRlclN0YXJ0fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCArLS0tLS0tLS0tLS0tLS0tLSsKK0J1YmJsZSB0byBmaW5kIGZp cnN0IElEICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3RvIHJldHVybiB0 cnVlOndhbnRzUmVzcG9uZGVySUR8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwK KyAgICAgKy0tLS0tLS0tLS0tLS0rICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwKKyAgICAgfCBvblRvdWNoTW92ZSB8ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwKKyAgICAgKy0tLS0tLSstLS0tLS0rICAgICBub25lICB8ICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgIHwgICAgICAgICAgICByZXR1cm58ICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLXYtLS0tLS0tLS0tLS0tK3RydWV8 ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIHwKK3xvbk1vdmVTaG91bGRTZXRSZXNwb25kZXIg fC0tLS0tPnxvblJlc3BvbmRlck1vdmUgKGN1cikgICB8PC0tLS0tLS0tLS0tKworKy0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0rICAgIHwgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgfCAgICAg ICAgICB8CisgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8ICstLS0tLS0tLSstLS0tLS0tKworICAgICAgICAgICAgfCByZXR1cm5lZCB0 cnVlIGZvcnwgICAgICAgZmFsc2U6UkVKRUNUICstLS0tLS0tLT58b25SZXNwb25kZXJSZWplY3wK KyAgICAgICAgICAgIHwgd2FudHNSZXNwb25kZXJJRCB8ICAgICAgICAgICAgICAgICAgICB8ICAg ICAgIHwgKy0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgICB8IChub3cgYXR0ZW1wdCAgICAg fCArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tKyB8CisgICAgICAgICAgICB8ICBoYW5kb2ZmKSAg ICAgICAgfCB8ICAgb25SZXNwb25kZXIgICAgICAgICAgfCB8CisgICAgICAgICAgICArLS0tLS0t LS0tLS0tLS0tLS0tLT58ICAgICAgVGVybWluYXRpb25SZXF1ZXN0fCB8CisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tKyB8CisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8ICst LS0tLS0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAg ICB0cnVlOkdSQU5UICstLS0tLS0tLT58b25SZXNwb25kZXJHcmFudHwKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKy0tLS0tLS0t Ky0tLS0tLS0rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCArLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tKyB8ICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8IHwgICBvblJlc3BvbmRlclRlcm1pbmF0ZSB8PC0tLS0tLS0tLS0tKworICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLSsgfAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfCAr LS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAg ICAgICAgICAgICAgICArLS0tLS0tLS0+fG9uUmVzcG9uZGVyTW92ZSB8CisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICstLS0tLS0t LS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgU29tZSBhY3RpdmUgdG91Y2ggc3RhcnRlZHwg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgaW5zaWRlIGN1cnJlbnQgcmVzcG9u ZGVyIHwgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgfAorICAgICAgKy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0+fCAgICAgIG9uUmVzcG9uZGVyRW5kICAgIHwgfAorICAgICAgfCAgICAgICAg ICAgICAgICAgICAgICAgIHwgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgfAorICArLS0tKy0t LS0tLS0tLSsgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICB8 IG9uVG91Y2hFbmQgIHwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAg fAorICArLS0tKy0tLS0tLS0tLSsgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgKy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLSsgfAorICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+fCAgICAgb25S ZXNwb25kZXJFbmQgICAgIHwgfAorICAgICAgTm8gYWN0aXZlIHRvdWNoZXMgc3RhcnRlZHwgKy0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsgfAorICAgICAgaW5zaWRlIGN1cnJlbnQgcmVzcG9uZGVy IHwgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAgICAgICAgICAgdiAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgfAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgfCAgICBvblJlc3BvbmRlclJlbGVhc2UgIHwgfAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgfAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKyAqLworCisvKioKKyAqIEEgbm90ZSBhYm91dCBldmVudCBvcmRlcmluZyBpbiB0 aGUgYEV2ZW50UGx1Z2luSHViYC4KKyAqCisgKiBTdXBwb3NlIHBsdWdpbnMgYXJlIGluamVjdGVk IGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CisgKgorICogYFtSLCBTLCBDXWAKKyAqCisgKiBUbyBo ZWxwIGlsbHVzdHJhdGUgdGhlIGV4YW1wbGUsIGFzc3VtZSBgU2AgaXMgYFNpbXBsZUV2ZW50UGx1 Z2luYCAoZm9yCisgKiBgb25DbGlja2AgZXRjKSBhbmQgYFJgIGlzIGBSZXNwb25kZXJFdmVudFBs dWdpbmAuCisgKgorICogIkRlZmVycmVkLURpc3BhdGNoZWQgRXZlbnRzIjoKKyAqCisgKiAtIFRo ZSBjdXJyZW50IGV2ZW50IHBsdWdpbiBzeXN0ZW0gd2lsbCB0cmF2ZXJzZSB0aGUgbGlzdCBvZiBp bmplY3RlZCBwbHVnaW5zLAorICogICBpbiBvcmRlciwgYW5kIGV4dHJhY3QgZXZlbnRzIGJ5IGNv bGxlY3RpbmcgdGhlIHBsdWdpbidzIHJldHVybiB2YWx1ZSBvZgorICogICBgZXh0cmFjdEV2ZW50 cygpYC4KKyAqIC0gVGhlc2UgZXZlbnRzIHRoYXQgYXJlIHJldHVybmVkIGZyb20gYGV4dHJhY3RF dmVudHNgIGFyZSAiZGVmZXJyZWQKKyAqICAgZGlzcGF0Y2hlZCBldmVudHMiLgorICogLSBXaGVu IHJldHVybmVkIGZyb20gYGV4dHJhY3RFdmVudHNgLCBkZWZlcnJlZC1kaXNwYXRjaGVkIGV2ZW50 cyBjb250YWluIGFuCisgKiAgICJhY2N1bXVsYXRpb24iIG9mIGRlZmVycmVkIGRpc3BhdGNoZXMu CisgKiAtIFRoZXNlIGRlZmVycmVkIGRpc3BhdGNoZXMgYXJlIGFjY3VtdWxhdGVkL2NvbGxlY3Rl ZCBiZWZvcmUgdGhleSBhcmUKKyAqICAgcmV0dXJuZWQsIGJ1dCBwcm9jZXNzZWQgYXQgYSBsYXRl ciB0aW1lIGJ5IHRoZSBgRXZlbnRQbHVnaW5IdWJgIChoZW5jZSB0aGUKKyAqICAgbmFtZSBkZWZl cnJlZCkuCisgKgorICogSW4gdGhlIHByb2Nlc3Mgb2YgcmV0dXJuaW5nIHRoZWlyIGRlZmVycmVk LWRpc3BhdGNoZWQgZXZlbnRzLCBldmVudCBwbHVnaW5zCisgKiB0aGVtc2VsdmVzIGNhbiBkaXNw YXRjaCBldmVudHMgb24tZGVtYW5kIHdpdGhvdXQgcmV0dXJuaW5nIHRoZW0gZnJvbQorICogYGV4 dHJhY3RFdmVudHNgLiBQbHVnaW5zIG1pZ2h0IHdhbnQgdG8gZG8gdGhpcywgc28gdGhhdCB0aGV5 IGNhbiB1c2UgZXZlbnQKKyAqIGRpc3BhdGNoaW5nIGFzIGEgdG9vbCB0aGF0IGhlbHBzIHRoZW0g ZGVjaWRlIHdoaWNoIGV2ZW50cyBzaG91bGQgYmUgZXh0cmFjdGVkCisgKiBpbiB0aGUgZmlyc3Qg cGxhY2UuCisgKgorICogIk9uLURlbWFuZC1EaXNwYXRjaGVkIEV2ZW50cyI6CisgKgorICogLSBP bi1kZW1hbmQtZGlzcGF0Y2hlZCBldmVudHMgYXJlIG5vdCByZXR1cm5lZCBmcm9tIGBleHRyYWN0 RXZlbnRzYC4KKyAqIC0gT24tZGVtYW5kLWRpc3BhdGNoZWQgZXZlbnRzIGFyZSBkaXNwYXRjaGVk IGR1cmluZyB0aGUgcHJvY2VzcyBvZiByZXR1cm5pbmcKKyAqICAgdGhlIGRlZmVycmVkLWRpc3Bh dGNoZWQgZXZlbnRzLgorICogLSBUaGV5IHNob3VsZCBub3QgaGF2ZSBzaWRlIGVmZmVjdHMuCisg KiAtIFRoZXkgc2hvdWxkIGJlIGF2b2lkZWQsIGFuZC9vciBldmVudHVhbGx5IGJlIHJlcGxhY2Vk IHdpdGggYW5vdGhlcgorICogICBhYnN0cmFjdGlvbiB0aGF0IGFsbG93cyBldmVudCBwbHVnaW5z IHRvIHBlcmZvcm0gbXVsdGlwbGUgInJvdW5kcyIgb2YgZXZlbnQKKyAqICAgZXh0cmFjdGlvbi4K KyAqCisgKiBUaGVyZWZvcmUsIHRoZSBzZXF1ZW5jZSBvZiBldmVudCBkaXNwYXRjaGVzIGJlY29t ZXM6CisgKgorICogLSBgUmBzIG9uLWRlbWFuZCBldmVudHMgKGlmIGFueSkgICAoZGlzcGF0Y2hl ZCBieSBgUmAgb24tZGVtYW5kKQorICogLSBgU2BzIG9uLWRlbWFuZCBldmVudHMgKGlmIGFueSkg ICAoZGlzcGF0Y2hlZCBieSBgU2Agb24tZGVtYW5kKQorICogLSBgQ2BzIG9uLWRlbWFuZCBldmVu dHMgKGlmIGFueSkgICAoZGlzcGF0Y2hlZCBieSBgQ2Agb24tZGVtYW5kKQorICogLSBgUmBzIGV4 dHJhY3RlZCBldmVudHMgKGlmIGFueSkgICAoZGlzcGF0Y2hlZCBieSBgRXZlbnRQbHVnaW5IdWJg KQorICogLSBgU2BzIGV4dHJhY3RlZCBldmVudHMgKGlmIGFueSkgICAoZGlzcGF0Y2hlZCBieSBg RXZlbnRQbHVnaW5IdWJgKQorICogLSBgQ2BzIGV4dHJhY3RlZCBldmVudHMgKGlmIGFueSkgICAo ZGlzcGF0Y2hlZCBieSBgRXZlbnRQbHVnaW5IdWJgKQorICoKKyAqIEluIHRoZSBjYXNlIG9mIGBS ZXNwb25kZXJFdmVudFBsdWdpbmA6IElmIHRoZSBgc3RhcnRTaG91bGRTZXRSZXNwb25kZXJgCisg KiBvbi1kZW1hbmQgZGlzcGF0Y2ggcmV0dXJucyBgdHJ1ZWAgKGFuZCBzb21lIG90aGVyIGRldGFp bHMgYXJlIHNhdGlzZmllZCkgdGhlCisgKiBgb25SZXNwb25kZXJHcmFudGAgZGVmZXJyZWQgZGlz cGF0Y2hlZCBldmVudCBpcyByZXR1cm5lZCBmcm9tCisgKiBgZXh0cmFjdEV2ZW50c2AuIFRoZSBz ZXF1ZW5jZSBvZiBkaXNwYXRjaCBleGVjdXRpb25zIGluIHRoaXMgY2FzZQorICogd2lsbCBhcHBl YXIgYXMgZm9sbG93czoKKyAqCisgKiAtIGBzdGFydFNob3VsZFNldFJlc3BvbmRlcmAgKGBSZXNw b25kZXJFdmVudFBsdWdpbmAgZGlzcGF0Y2hlcyBvbi1kZW1hbmQpCisgKiAtIGB0b3VjaFN0YXJ0 Q2FwdHVyZWAgICAgICAgKGBFdmVudFBsdWdpbkh1YmAgZGlzcGF0Y2hlcyBhcyB1c3VhbCkKKyAq IC0gYHRvdWNoU3RhcnRgICAgICAgICAgICAgICAoYEV2ZW50UGx1Z2luSHViYCBkaXNwYXRjaGVz IGFzIHVzdWFsKQorICogLSBgcmVzcG9uZGVyR3JhbnQvUmVqZWN0YCAgIChgRXZlbnRQbHVnaW5I dWJgIGRpc3BhdGNoZXMgYXMgdXN1YWwpCisgKi8KKworZnVuY3Rpb24gc2V0UmVzcG9uZGVyQW5k RXh0cmFjdFRyYW5zZmVyKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5h dGl2ZUV2ZW50VGFyZ2V0KSB7CisgIHZhciBzaG91bGRTZXRFdmVudFR5cGUgPSBpc1N0YXJ0aXNo KHRvcExldmVsVHlwZSkgPyBldmVudFR5cGVzLnN0YXJ0U2hvdWxkU2V0UmVzcG9uZGVyIDogaXNN b3ZlaXNoKHRvcExldmVsVHlwZSkgPyBldmVudFR5cGVzLm1vdmVTaG91bGRTZXRSZXNwb25kZXIg OiB0b3BMZXZlbFR5cGUgPT09ICd0b3BTZWxlY3Rpb25DaGFuZ2UnID8gZXZlbnRUeXBlcy5zZWxl Y3Rpb25DaGFuZ2VTaG91bGRTZXRSZXNwb25kZXIgOiBldmVudFR5cGVzLnNjcm9sbFNob3VsZFNl dFJlc3BvbmRlcjsKKworICAvLyBUT0RPOiBzdG9wIG9uZSBzaG9ydCBvZiB0aGUgY3VycmVudCBy ZXNwb25kZXIuCisgIHZhciBidWJibGVTaG91bGRTZXRGcm9tID0gIXJlc3BvbmRlckluc3QgPyB0 YXJnZXRJbnN0IDogRXZlbnRQbHVnaW5VdGlscy5nZXRMb3dlc3RDb21tb25BbmNlc3RvcihyZXNw b25kZXJJbnN0LCB0YXJnZXRJbnN0KTsKKworICAvLyBXaGVuIGNhcHR1cmluZy9idWJibGluZyB0 aGUgInNob3VsZFNldCIgZXZlbnQsIHdlIHdhbnQgdG8gc2tpcCB0aGUgdGFyZ2V0CisgIC8vIChk ZWVwZXN0IElEKSBpZiBpdCBoYXBwZW5zIHRvIGJlIHRoZSBjdXJyZW50IHJlc3BvbmRlci4gVGhl IHJlYXNvbmluZzoKKyAgLy8gSXQncyBzdHJhbmdlIHRvIGdldCBhbiBgb25Nb3ZlU2hvdWxkU2V0 UmVzcG9uZGVyYCB3aGVuIHlvdSdyZSAqYWxyZWFkeSoKKyAgLy8gdGhlIHJlc3BvbmRlci4KKyAg dmFyIHNraXBPdmVyQnViYmxlU2hvdWxkU2V0RnJvbSA9IGJ1YmJsZVNob3VsZFNldEZyb20gPT09 IHJlc3BvbmRlckluc3Q7CisgIHZhciBzaG91bGRTZXRFdmVudCA9IFJlc3BvbmRlclN5bnRoZXRp Y0V2ZW50LmdldFBvb2xlZChzaG91bGRTZXRFdmVudFR5cGUsIGJ1YmJsZVNob3VsZFNldEZyb20s IG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7CisgIHNob3VsZFNldEV2ZW50LnRvdWNo SGlzdG9yeSA9IFJlc3BvbmRlclRvdWNoSGlzdG9yeVN0b3JlLnRvdWNoSGlzdG9yeTsKKyAgaWYg KHNraXBPdmVyQnViYmxlU2hvdWxkU2V0RnJvbSkgeworICAgIEV2ZW50UHJvcGFnYXRvcnMuYWNj dW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1NraXBUYXJnZXQoc2hvdWxkU2V0RXZlbnQpOworICB9 IGVsc2UgeworICAgIEV2ZW50UHJvcGFnYXRvcnMuYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hl cyhzaG91bGRTZXRFdmVudCk7CisgIH0KKyAgdmFyIHdhbnRzUmVzcG9uZGVySW5zdCA9IGV4ZWN1 dGVEaXNwYXRjaGVzSW5PcmRlclN0b3BBdFRydWUoc2hvdWxkU2V0RXZlbnQpOworICBpZiAoIXNo b3VsZFNldEV2ZW50LmlzUGVyc2lzdGVudCgpKSB7CisgICAgc2hvdWxkU2V0RXZlbnQuY29uc3Ry dWN0b3IucmVsZWFzZShzaG91bGRTZXRFdmVudCk7CisgIH0KKworICBpZiAoIXdhbnRzUmVzcG9u ZGVySW5zdCB8fCB3YW50c1Jlc3BvbmRlckluc3QgPT09IHJlc3BvbmRlckluc3QpIHsKKyAgICBy ZXR1cm4gbnVsbDsKKyAgfQorICB2YXIgZXh0cmFjdGVkOworICB2YXIgZ3JhbnRFdmVudCA9IFJl c3BvbmRlclN5bnRoZXRpY0V2ZW50LmdldFBvb2xlZChldmVudFR5cGVzLnJlc3BvbmRlckdyYW50 LCB3YW50c1Jlc3BvbmRlckluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7Cisg IGdyYW50RXZlbnQudG91Y2hIaXN0b3J5ID0gUmVzcG9uZGVyVG91Y2hIaXN0b3J5U3RvcmUudG91 Y2hIaXN0b3J5OworCisgIEV2ZW50UHJvcGFnYXRvcnMuYWNjdW11bGF0ZURpcmVjdERpc3BhdGNo ZXMoZ3JhbnRFdmVudCk7CisgIHZhciBibG9ja0hvc3RSZXNwb25kZXIgPSBleGVjdXRlRGlyZWN0 RGlzcGF0Y2goZ3JhbnRFdmVudCkgPT09IHRydWU7CisgIGlmIChyZXNwb25kZXJJbnN0KSB7CisK KyAgICB2YXIgdGVybWluYXRpb25SZXF1ZXN0RXZlbnQgPSBSZXNwb25kZXJTeW50aGV0aWNFdmVu dC5nZXRQb29sZWQoZXZlbnRUeXBlcy5yZXNwb25kZXJUZXJtaW5hdGlvblJlcXVlc3QsIHJlc3Bv bmRlckluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7CisgICAgdGVybWluYXRp b25SZXF1ZXN0RXZlbnQudG91Y2hIaXN0b3J5ID0gUmVzcG9uZGVyVG91Y2hIaXN0b3J5U3RvcmUu dG91Y2hIaXN0b3J5OworICAgIEV2ZW50UHJvcGFnYXRvcnMuYWNjdW11bGF0ZURpcmVjdERpc3Bh dGNoZXModGVybWluYXRpb25SZXF1ZXN0RXZlbnQpOworICAgIHZhciBzaG91bGRTd2l0Y2ggPSAh aGFzRGlzcGF0Y2hlcyh0ZXJtaW5hdGlvblJlcXVlc3RFdmVudCkgfHwgZXhlY3V0ZURpcmVjdERp c3BhdGNoKHRlcm1pbmF0aW9uUmVxdWVzdEV2ZW50KTsKKyAgICBpZiAoIXRlcm1pbmF0aW9uUmVx dWVzdEV2ZW50LmlzUGVyc2lzdGVudCgpKSB7CisgICAgICB0ZXJtaW5hdGlvblJlcXVlc3RFdmVu dC5jb25zdHJ1Y3Rvci5yZWxlYXNlKHRlcm1pbmF0aW9uUmVxdWVzdEV2ZW50KTsKKyAgICB9CisK KyAgICBpZiAoc2hvdWxkU3dpdGNoKSB7CisgICAgICB2YXIgdGVybWluYXRlRXZlbnQgPSBSZXNw b25kZXJTeW50aGV0aWNFdmVudC5nZXRQb29sZWQoZXZlbnRUeXBlcy5yZXNwb25kZXJUZXJtaW5h dGUsIHJlc3BvbmRlckluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7CisgICAg ICB0ZXJtaW5hdGVFdmVudC50b3VjaEhpc3RvcnkgPSBSZXNwb25kZXJUb3VjaEhpc3RvcnlTdG9y ZS50b3VjaEhpc3Rvcnk7CisgICAgICBFdmVudFByb3BhZ2F0b3JzLmFjY3VtdWxhdGVEaXJlY3RE aXNwYXRjaGVzKHRlcm1pbmF0ZUV2ZW50KTsKKyAgICAgIGV4dHJhY3RlZCA9IGFjY3VtdWxhdGUo ZXh0cmFjdGVkLCBbZ3JhbnRFdmVudCwgdGVybWluYXRlRXZlbnRdKTsKKyAgICAgIGNoYW5nZVJl c3BvbmRlcih3YW50c1Jlc3BvbmRlckluc3QsIGJsb2NrSG9zdFJlc3BvbmRlcik7CisgICAgfSBl bHNlIHsKKyAgICAgIHZhciByZWplY3RFdmVudCA9IFJlc3BvbmRlclN5bnRoZXRpY0V2ZW50Lmdl dFBvb2xlZChldmVudFR5cGVzLnJlc3BvbmRlclJlamVjdCwgd2FudHNSZXNwb25kZXJJbnN0LCBu YXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpOworICAgICAgcmVqZWN0RXZlbnQudG91Y2hI aXN0b3J5ID0gUmVzcG9uZGVyVG91Y2hIaXN0b3J5U3RvcmUudG91Y2hIaXN0b3J5OworICAgICAg RXZlbnRQcm9wYWdhdG9ycy5hY2N1bXVsYXRlRGlyZWN0RGlzcGF0Y2hlcyhyZWplY3RFdmVudCk7 CisgICAgICBleHRyYWN0ZWQgPSBhY2N1bXVsYXRlKGV4dHJhY3RlZCwgcmVqZWN0RXZlbnQpOwor ICAgIH0KKyAgfSBlbHNlIHsKKyAgICBleHRyYWN0ZWQgPSBhY2N1bXVsYXRlKGV4dHJhY3RlZCwg Z3JhbnRFdmVudCk7CisgICAgY2hhbmdlUmVzcG9uZGVyKHdhbnRzUmVzcG9uZGVySW5zdCwgYmxv Y2tIb3N0UmVzcG9uZGVyKTsKKyAgfQorICByZXR1cm4gZXh0cmFjdGVkOworfQorCisvKioKKyAq IEEgdHJhbnNmZXIgaXMgYSBuZWdvdGlhdGlvbiBiZXR3ZWVuIGEgY3VycmVudGx5IHNldCByZXNw b25kZXIgYW5kIHRoZSBuZXh0CisgKiBlbGVtZW50IHRvIGNsYWltIHJlc3BvbmRlciBzdGF0dXMu IEFueSBzdGFydCBldmVudCBjb3VsZCB0cmlnZ2VyIGEgdHJhbnNmZXIKKyAqIG9mIHJlc3BvbmRl ckluc3QuIEFueSBtb3ZlIGV2ZW50IGNvdWxkIHRyaWdnZXIgYSB0cmFuc2Zlci4KKyAqCisgKiBA cGFyYW0ge3N0cmluZ30gdG9wTGV2ZWxUeXBlIFJlY29yZCBmcm9tIGBFdmVudENvbnN0YW50c2Au CisgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGEgdHJhbnNmZXIgb2YgcmVzcG9uZGVyIGNv dWxkIHBvc3NpYmx5IG9jY3VyLgorICovCitmdW5jdGlvbiBjYW5UcmlnZ2VyVHJhbnNmZXIodG9w TGV2ZWxUeXBlLCB0b3BMZXZlbEluc3QsIG5hdGl2ZUV2ZW50KSB7CisgIHJldHVybiB0b3BMZXZl bEluc3QgJiYgKAorICAvLyByZXNwb25kZXJJZ25vcmVTY3JvbGw6IFdlIGFyZSB0cnlpbmcgdG8g bWlncmF0ZSBhd2F5IGZyb20gc3BlY2lmaWNhbGx5CisgIC8vIHRyYWNraW5nIG5hdGl2ZSBzY3Jv bGwgZXZlbnRzIGhlcmUgYW5kIHJlc3BvbmRlcklnbm9yZVNjcm9sbCBpbmRpY2F0ZXMgd2UKKyAg Ly8gd2lsbCBzZW5kIHRvcFRvdWNoQ2FuY2VsIHRvIGhhbmRsZSBjYW5jZWxpbmcgdG91Y2ggZXZl bnRzIGluc3RlYWQKKyAgdG9wTGV2ZWxUeXBlID09PSAndG9wU2Nyb2xsJyAmJiAhbmF0aXZlRXZl bnQucmVzcG9uZGVySWdub3JlU2Nyb2xsIHx8IHRyYWNrZWRUb3VjaENvdW50ID4gMCAmJiB0b3BM ZXZlbFR5cGUgPT09ICd0b3BTZWxlY3Rpb25DaGFuZ2UnIHx8IGlzU3RhcnRpc2godG9wTGV2ZWxU eXBlKSB8fCBpc01vdmVpc2godG9wTGV2ZWxUeXBlKSk7Cit9CisKKy8qKgorICogUmV0dXJucyB3 aGV0aGVyIG9yIG5vdCB0aGlzIHRvdWNoIGVuZCBldmVudCBtYWtlcyBpdCBzdWNoIHRoYXQgdGhl cmUgYXJlIG5vCisgKiBsb25nZXIgYW55IHRvdWNoZXMgdGhhdCBzdGFydGVkIGluc2lkZSBvZiB0 aGUgY3VycmVudCBgcmVzcG9uZGVySW5zdGAuCisgKgorICogQHBhcmFtIHtOYXRpdmVFdmVudH0g bmF0aXZlRXZlbnQgTmF0aXZlIHRvdWNoIGVuZCBldmVudC4KKyAqIEByZXR1cm4ge2Jvb2xlYW59 IFdoZXRoZXIgb3Igbm90IHRoaXMgdG91Y2ggZW5kIGV2ZW50IGVuZHMgdGhlIHJlc3BvbmRlci4K KyAqLworZnVuY3Rpb24gbm9SZXNwb25kZXJUb3VjaGVzKG5hdGl2ZUV2ZW50KSB7CisgIHZhciB0 b3VjaGVzID0gbmF0aXZlRXZlbnQudG91Y2hlczsKKyAgaWYgKCF0b3VjaGVzIHx8IHRvdWNoZXMu bGVuZ3RoID09PSAwKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgZm9yICh2YXIgaSA9IDA7 IGkgPCB0b3VjaGVzLmxlbmd0aDsgaSsrKSB7CisgICAgdmFyIGFjdGl2ZVRvdWNoID0gdG91Y2hl c1tpXTsKKyAgICB2YXIgdGFyZ2V0ID0gYWN0aXZlVG91Y2gudGFyZ2V0OworICAgIGlmICh0YXJn ZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0ICE9PSAwKSB7Cisg ICAgICAvLyBJcyB0aGUgb3JpZ2luYWwgdG91Y2ggbG9jYXRpb24gaW5zaWRlIG9mIHRoZSBjdXJy ZW50IHJlc3BvbmRlcj8KKyAgICAgIHZhciB0YXJnZXRJbnN0ID0gRXZlbnRQbHVnaW5VdGlscy5n ZXRJbnN0YW5jZUZyb21Ob2RlKHRhcmdldCk7CisgICAgICBpZiAoRXZlbnRQbHVnaW5VdGlscy5p c0FuY2VzdG9yKHJlc3BvbmRlckluc3QsIHRhcmdldEluc3QpKSB7CisgICAgICAgIHJldHVybiBm YWxzZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZhciBSZXNw b25kZXJFdmVudFBsdWdpbiA9IHsKKworICAvKiBGb3IgdW5pdCB0ZXN0aW5nIG9ubHkgKi8KKyAg X2dldFJlc3BvbmRlcklEOiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIHJlc3BvbmRlckluc3Qg PyByZXNwb25kZXJJbnN0Ll9yb290Tm9kZUlEIDogbnVsbDsKKyAgfSwKKworICBldmVudFR5cGVz OiBldmVudFR5cGVzLAorCisgIC8qKgorICAgKiBXZSBtdXN0IGJlIHJlc2lsaWVudCB0byBgdGFy Z2V0SW5zdGAgYmVpbmcgYG51bGxgIG9uIGB0b3VjaE1vdmVgIG9yCisgICAqIGB0b3VjaEVuZGAu IE9uIGNlcnRhaW4gcGxhdGZvcm1zLCB0aGlzIG1lYW5zIHRoYXQgYSBuYXRpdmUgc2Nyb2xsIGhh cworICAgKiBhc3N1bWVkIGNvbnRyb2wgYW5kIHRoZSBvcmlnaW5hbCB0b3VjaCB0YXJnZXRzIGFy ZSBkZXN0cm95ZWQuCisgICAqLworICBleHRyYWN0RXZlbnRzOiBmdW5jdGlvbiAodG9wTGV2ZWxU eXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHsKKyAgICBp ZiAoaXNTdGFydGlzaCh0b3BMZXZlbFR5cGUpKSB7CisgICAgICB0cmFja2VkVG91Y2hDb3VudCAr PSAxOworICAgIH0gZWxzZSBpZiAoaXNFbmRpc2godG9wTGV2ZWxUeXBlKSkgeworICAgICAgaWYg KHRyYWNrZWRUb3VjaENvdW50ID49IDApIHsKKyAgICAgICAgdHJhY2tlZFRvdWNoQ291bnQgLT0g MTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0VuZGVkIGEgdG91Y2gg ZXZlbnQgd2hpY2ggd2FzIG5vdCBjb3VudGVkIGluIGB0cmFja2VkVG91Y2hDb3VudGAuJyk7Cisg ICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKworICAgIFJlc3BvbmRlclRvdWNo SGlzdG9yeVN0b3JlLnJlY29yZFRvdWNoVHJhY2sodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCk7 CisKKyAgICB2YXIgZXh0cmFjdGVkID0gY2FuVHJpZ2dlclRyYW5zZmVyKHRvcExldmVsVHlwZSwg dGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQpID8gc2V0UmVzcG9uZGVyQW5kRXh0cmFjdFRyYW5zZmVy KHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0 KSA6IG51bGw7CisgICAgLy8gUmVzcG9uZGVyIG1heSBvciBtYXkgbm90IGhhdmUgdHJhbnNmZXJy ZWQgb24gYSBuZXcgdG91Y2ggc3RhcnQvbW92ZS4KKyAgICAvLyBSZWdhcmRsZXNzLCB3aG9ldmVy IGlzIHRoZSByZXNwb25kZXIgYWZ0ZXIgYW55IHBvdGVudGlhbCB0cmFuc2Zlciwgd2UKKyAgICAv LyBkaXJlY3QgYWxsIHRvdWNoIHN0YXJ0L21vdmUvZW5kcyB0byB0aGVtIGluIHRoZSBmb3JtIG9m CisgICAgLy8gYG9uUmVzcG9uZGVyTW92ZS9TdGFydC9FbmRgLiBUaGVzZSB3aWxsIGJlIGNhbGxl ZCBmb3IgKmV2ZXJ5KiBhZGRpdGlvbmFsCisgICAgLy8gZmluZ2VyIHRoYXQgbW92ZS9zdGFydC9l bmQsIGRpc3BhdGNoZWQgZGlyZWN0bHkgdG8gd2hvZXZlciBpcyB0aGUKKyAgICAvLyBjdXJyZW50 IHJlc3BvbmRlciBhdCB0aGF0IG1vbWVudCwgdW50aWwgdGhlIHJlc3BvbmRlciBpcyAicmVsZWFz ZWQiLgorICAgIC8vCisgICAgLy8gVGhlc2UgbXVsdGlwbGUgaW5kaXZpZHVhbCBjaGFuZ2UgdG91 Y2ggZXZlbnRzIGFyZSBhcmUgYWx3YXlzIGJvb2tlbmRlZAorICAgIC8vIGJ5IGBvblJlc3BvbmRl ckdyYW50YCwgYW5kIG9uZSBvZgorICAgIC8vIChgb25SZXNwb25kZXJSZWxlYXNlL29uUmVzcG9u ZGVyVGVybWluYXRlYCkuCisgICAgdmFyIGlzUmVzcG9uZGVyVG91Y2hTdGFydCA9IHJlc3BvbmRl ckluc3QgJiYgaXNTdGFydGlzaCh0b3BMZXZlbFR5cGUpOworICAgIHZhciBpc1Jlc3BvbmRlclRv dWNoTW92ZSA9IHJlc3BvbmRlckluc3QgJiYgaXNNb3ZlaXNoKHRvcExldmVsVHlwZSk7CisgICAg dmFyIGlzUmVzcG9uZGVyVG91Y2hFbmQgPSByZXNwb25kZXJJbnN0ICYmIGlzRW5kaXNoKHRvcExl dmVsVHlwZSk7CisgICAgdmFyIGluY3JlbWVudGFsVG91Y2ggPSBpc1Jlc3BvbmRlclRvdWNoU3Rh cnQgPyBldmVudFR5cGVzLnJlc3BvbmRlclN0YXJ0IDogaXNSZXNwb25kZXJUb3VjaE1vdmUgPyBl dmVudFR5cGVzLnJlc3BvbmRlck1vdmUgOiBpc1Jlc3BvbmRlclRvdWNoRW5kID8gZXZlbnRUeXBl cy5yZXNwb25kZXJFbmQgOiBudWxsOworCisgICAgaWYgKGluY3JlbWVudGFsVG91Y2gpIHsKKyAg ICAgIHZhciBnZXN0dXJlID0gUmVzcG9uZGVyU3ludGhldGljRXZlbnQuZ2V0UG9vbGVkKGluY3Jl bWVudGFsVG91Y2gsIHJlc3BvbmRlckluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdl dCk7CisgICAgICBnZXN0dXJlLnRvdWNoSGlzdG9yeSA9IFJlc3BvbmRlclRvdWNoSGlzdG9yeVN0 b3JlLnRvdWNoSGlzdG9yeTsKKyAgICAgIEV2ZW50UHJvcGFnYXRvcnMuYWNjdW11bGF0ZURpcmVj dERpc3BhdGNoZXMoZ2VzdHVyZSk7CisgICAgICBleHRyYWN0ZWQgPSBhY2N1bXVsYXRlKGV4dHJh Y3RlZCwgZ2VzdHVyZSk7CisgICAgfQorCisgICAgdmFyIGlzUmVzcG9uZGVyVGVybWluYXRlID0g cmVzcG9uZGVySW5zdCAmJiB0b3BMZXZlbFR5cGUgPT09ICd0b3BUb3VjaENhbmNlbCc7CisgICAg dmFyIGlzUmVzcG9uZGVyUmVsZWFzZSA9IHJlc3BvbmRlckluc3QgJiYgIWlzUmVzcG9uZGVyVGVy bWluYXRlICYmIGlzRW5kaXNoKHRvcExldmVsVHlwZSkgJiYgbm9SZXNwb25kZXJUb3VjaGVzKG5h dGl2ZUV2ZW50KTsKKyAgICB2YXIgZmluYWxUb3VjaCA9IGlzUmVzcG9uZGVyVGVybWluYXRlID8g ZXZlbnRUeXBlcy5yZXNwb25kZXJUZXJtaW5hdGUgOiBpc1Jlc3BvbmRlclJlbGVhc2UgPyBldmVu dFR5cGVzLnJlc3BvbmRlclJlbGVhc2UgOiBudWxsOworICAgIGlmIChmaW5hbFRvdWNoKSB7Cisg ICAgICB2YXIgZmluYWxFdmVudCA9IFJlc3BvbmRlclN5bnRoZXRpY0V2ZW50LmdldFBvb2xlZChm aW5hbFRvdWNoLCByZXNwb25kZXJJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQp OworICAgICAgZmluYWxFdmVudC50b3VjaEhpc3RvcnkgPSBSZXNwb25kZXJUb3VjaEhpc3RvcnlT dG9yZS50b3VjaEhpc3Rvcnk7CisgICAgICBFdmVudFByb3BhZ2F0b3JzLmFjY3VtdWxhdGVEaXJl Y3REaXNwYXRjaGVzKGZpbmFsRXZlbnQpOworICAgICAgZXh0cmFjdGVkID0gYWNjdW11bGF0ZShl eHRyYWN0ZWQsIGZpbmFsRXZlbnQpOworICAgICAgY2hhbmdlUmVzcG9uZGVyKG51bGwpOworICAg IH0KKworICAgIHZhciBudW1iZXJBY3RpdmVUb3VjaGVzID0gUmVzcG9uZGVyVG91Y2hIaXN0b3J5 U3RvcmUudG91Y2hIaXN0b3J5Lm51bWJlckFjdGl2ZVRvdWNoZXM7CisgICAgaWYgKFJlc3BvbmRl ckV2ZW50UGx1Z2luLkdsb2JhbEludGVyYWN0aW9uSGFuZGxlciAmJiBudW1iZXJBY3RpdmVUb3Vj aGVzICE9PSBwcmV2aW91c0FjdGl2ZVRvdWNoZXMpIHsKKyAgICAgIFJlc3BvbmRlckV2ZW50UGx1 Z2luLkdsb2JhbEludGVyYWN0aW9uSGFuZGxlci5vbkNoYW5nZShudW1iZXJBY3RpdmVUb3VjaGVz KTsKKyAgICB9CisgICAgcHJldmlvdXNBY3RpdmVUb3VjaGVzID0gbnVtYmVyQWN0aXZlVG91Y2hl czsKKworICAgIHJldHVybiBleHRyYWN0ZWQ7CisgIH0sCisKKyAgR2xvYmFsUmVzcG9uZGVySGFu ZGxlcjogbnVsbCwKKyAgR2xvYmFsSW50ZXJhY3Rpb25IYW5kbGVyOiBudWxsLAorCisgIGluamVj dGlvbjogeworICAgIC8qKgorICAgICAqIEBwYXJhbSB7e29uQ2hhbmdlOiAoUmVhY3RJRCwgUmVh Y3RJRCkgPT4gdm9pZH0gR2xvYmFsUmVzcG9uZGVySGFuZGxlcgorICAgICAqIE9iamVjdCB0aGF0 IGhhbmRsZXMgYW55IGNoYW5nZSBpbiByZXNwb25kZXIuIFVzZSB0aGlzIHRvIGluamVjdAorICAg ICAqIGludGVncmF0aW9uIHdpdGggYW4gZXhpc3RpbmcgdG91Y2ggaGFuZGxpbmcgc3lzdGVtIGV0 Yy4KKyAgICAgKi8KKyAgICBpbmplY3RHbG9iYWxSZXNwb25kZXJIYW5kbGVyOiBmdW5jdGlvbiAo R2xvYmFsUmVzcG9uZGVySGFuZGxlcikgeworICAgICAgUmVzcG9uZGVyRXZlbnRQbHVnaW4uR2xv YmFsUmVzcG9uZGVySGFuZGxlciA9IEdsb2JhbFJlc3BvbmRlckhhbmRsZXI7CisgICAgfSwKKwor ICAgIC8qKgorICAgICAqIEBwYXJhbSB7e29uQ2hhbmdlOiAobnVtYmVyQWN0aXZlVG91Y2hlcykg PT4gdm9pZH0gR2xvYmFsSW50ZXJhY3Rpb25IYW5kbGVyCisgICAgICogT2JqZWN0IHRoYXQgaGFu ZGxlcyBhbnkgY2hhbmdlIGluIHRoZSBudW1iZXIgb2YgYWN0aXZlIHRvdWNoZXMuCisgICAgICov CisgICAgaW5qZWN0R2xvYmFsSW50ZXJhY3Rpb25IYW5kbGVyOiBmdW5jdGlvbiAoR2xvYmFsSW50 ZXJhY3Rpb25IYW5kbGVyKSB7CisgICAgICBSZXNwb25kZXJFdmVudFBsdWdpbi5HbG9iYWxJbnRl cmFjdGlvbkhhbmRsZXIgPSBHbG9iYWxJbnRlcmFjdGlvbkhhbmRsZXI7CisgICAgfQorICB9Cit9 OworCittb2R1bGUuZXhwb3J0cyA9IFJlc3BvbmRlckV2ZW50UGx1Z2luOwpcIE5vIG5ld2xpbmUg YXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVh Y3QtZG9tL2xpYi9SZXNwb25kZXJTeW50aGV0aWNFdmVudC5qcyBiL3dlYi9wZ2FkbWluL3N0YXRp Yy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZXNwb25kZXJTeW50aGV0aWNFdmVudC5qcwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uMDE2NGQ2ZjMKLS0tIC9kZXYvbnVsbAorKysg Yi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVzcG9uZGVyU3ludGhl dGljRXZlbnQuanMKQEAgLTAsMCArMSwzOCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVz ZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlz IHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3Vu ZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBz b3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4g YmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgor ICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFN5bnRoZXRpY0V2ZW50ID0gcmVxdWlyZSgnLi9T eW50aGV0aWNFdmVudCcpOworCisvKioKKyAqIGB0b3VjaEhpc3RvcnlgIGlzbid0IGFjdHVhbGx5 IG9uIHRoZSBuYXRpdmUgZXZlbnQsIGJ1dCBwdXR0aW5nIGl0IGluIHRoZQorICogaW50ZXJmYWNl IHdpbGwgZW5zdXJlIHRoYXQgaXQgaXMgY2xlYW5lZCB1cCB3aGVuIHBvb2xlZC9kZXN0cm95ZWQu IFRoZQorICogYFJlc3BvbmRlckV2ZW50UGx1Z2luYCB3aWxsIHBvcHVsYXRlIGl0IGFwcHJvcHJp YXRlbHkuCisgKi8KK3ZhciBSZXNwb25kZXJFdmVudEludGVyZmFjZSA9IHsKKyAgdG91Y2hIaXN0 b3J5OiBmdW5jdGlvbiAobmF0aXZlRXZlbnQpIHsKKyAgICByZXR1cm4gbnVsbDsgLy8gQWN0dWFs bHkgZG9lc24ndCBldmVuIGxvb2sgYXQgdGhlIG5hdGl2ZSBldmVudC4KKyAgfQorfTsKKworLyoq CisgKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRv IGRpc3BhdGNoIHRoaXMgZXZlbnQuCisgKiBAcGFyYW0ge3N0cmluZ30gZGlzcGF0Y2hNYXJrZXIg TWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuCisgKiBAcGFyYW0ge29iamVjdH0g bmF0aXZlRXZlbnQgTmF0aXZlIGV2ZW50LgorICogQGV4dGVuZHMge1N5bnRoZXRpY0V2ZW50fQor ICovCitmdW5jdGlvbiBSZXNwb25kZXJTeW50aGV0aWNFdmVudChkaXNwYXRjaENvbmZpZywgZGlz cGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkgeworICByZXR1cm4g U3ludGhldGljRXZlbnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIs IG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7Cit9CisKK1N5bnRoZXRpY0V2ZW50LmF1 Z21lbnRDbGFzcyhSZXNwb25kZXJTeW50aGV0aWNFdmVudCwgUmVzcG9uZGVyRXZlbnRJbnRlcmZh Y2UpOworCittb2R1bGUuZXhwb3J0cyA9IFJlc3BvbmRlclN5bnRoZXRpY0V2ZW50OwpcIE5vIG5l d2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5k b3IvcmVhY3QtZG9tL2xpYi9SZXNwb25kZXJUb3VjaEhpc3RvcnlTdG9yZS5qcyBiL3dlYi9wZ2Fk bWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9SZXNwb25kZXJUb3VjaEhpc3RvcnlTdG9y ZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uMzgxM2JkYWMKLS0tIC9k ZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvUmVz cG9uZGVyVG91Y2hIaXN0b3J5U3RvcmUuanMKQEAgLTAsMCArMSwxODMgQEAKKy8qKgorICogQ29w eXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2 ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0 eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGly ZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBh dGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUg ZGlyZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9wcm9kSW52 YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTsKKwordmFyIEV2ZW50UGx1 Z2luVXRpbHMgPSByZXF1aXJlKCcuL0V2ZW50UGx1Z2luVXRpbHMnKTsKKwordmFyIGludmFyaWFu dCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpOwordmFyIHdhcm5pbmcgPSByZXF1aXJl KCdmYmpzL2xpYi93YXJuaW5nJyk7CisKK3ZhciBpc0VuZGlzaCA9IEV2ZW50UGx1Z2luVXRpbHMu aXNFbmRpc2gsCisgICAgaXNNb3ZlaXNoID0gRXZlbnRQbHVnaW5VdGlscy5pc01vdmVpc2gsCisg ICAgaXNTdGFydGlzaCA9IEV2ZW50UGx1Z2luVXRpbHMuaXNTdGFydGlzaDsKKworLyoqCisgKiBU cmFja3MgdGhlIHBvc2l0aW9uIGFuZCB0aW1lIG9mIGVhY2ggYWN0aXZlIHRvdWNoIGJ5IGB0b3Vj aC5pZGVudGlmaWVyYC4gV2UKKyAqIHNob3VsZCB0eXBpY2FsbHkgb25seSBzZWUgSURzIGluIHRo ZSByYW5nZSBvZiAxLTIwIGJlY2F1c2UgSURzIGdldCByZWN5Y2xlZAorICogd2hlbiB0b3VjaGVz IGVuZCBhbmQgc3RhcnQgYWdhaW4uCisgKi8KKwordmFyIE1BWF9UT1VDSF9CQU5LID0gMjA7Cit2 YXIgdG91Y2hCYW5rID0gW107Cit2YXIgdG91Y2hIaXN0b3J5ID0geworICB0b3VjaEJhbms6IHRv dWNoQmFuaywKKyAgbnVtYmVyQWN0aXZlVG91Y2hlczogMCwKKyAgLy8gSWYgdGhlcmUgaXMgb25s eSBvbmUgYWN0aXZlIHRvdWNoLCB3ZSByZW1lbWJlciBpdHMgbG9jYXRpb24uIFRoaXMgcHJldmVu dHMKKyAgLy8gdXMgaGF2aW5nIHRvIGxvb3AgdGhyb3VnaCBhbGwgb2YgdGhlIHRvdWNoZXMgYWxs IHRoZSB0aW1lIGluIHRoZSBtb3N0CisgIC8vIGNvbW1vbiBjYXNlLgorICBpbmRleE9mU2luZ2xl QWN0aXZlVG91Y2g6IC0xLAorICBtb3N0UmVjZW50VGltZVN0YW1wOiAwCit9OworCitmdW5jdGlv biB0aW1lc3RhbXBGb3JUb3VjaCh0b3VjaCkgeworICAvLyBUaGUgbGVnYWN5IGludGVybmFsIGlt cGxlbWVudGF0aW9uIHByb3ZpZGVzICJ0aW1lU3RhbXAiLCB3aGljaCBoYXMgYmVlbgorICAvLyBy ZW5hbWVkIHRvICJ0aW1lc3RhbXAiLiBMZXQgYm90aCB3b3JrIGZvciBub3cgd2hpbGUgd2UgaXJv biBpdCBvdXQKKyAgLy8gVE9ETyAoZXZ2KTogcmVuYW1lIHRpbWVTdGFtcCB0byB0aW1lc3RhbXAg aW4gaW50ZXJuYWwgY29kZQorICByZXR1cm4gdG91Y2gudGltZVN0YW1wIHx8IHRvdWNoLnRpbWVz dGFtcDsKK30KKworLyoqCisgKiBUT0RPOiBJbnN0ZWFkIG9mIG1ha2luZyBnZXN0dXJlcyByZWNv bXB1dGUgZmlsdGVyZWQgdmVsb2NpdHksIHdlIGNvdWxkCisgKiBpbmNsdWRlIGEgYnVpbHQgaW4g dmVsb2NpdHkgY29tcHV0YXRpb24gdGhhdCBjYW4gYmUgcmV1c2VkIGdsb2JhbGx5LgorICovCitm dW5jdGlvbiBjcmVhdGVUb3VjaFJlY29yZCh0b3VjaCkgeworICByZXR1cm4geworICAgIHRvdWNo QWN0aXZlOiB0cnVlLAorICAgIHN0YXJ0UGFnZVg6IHRvdWNoLnBhZ2VYLAorICAgIHN0YXJ0UGFn ZVk6IHRvdWNoLnBhZ2VZLAorICAgIHN0YXJ0VGltZVN0YW1wOiB0aW1lc3RhbXBGb3JUb3VjaCh0 b3VjaCksCisgICAgY3VycmVudFBhZ2VYOiB0b3VjaC5wYWdlWCwKKyAgICBjdXJyZW50UGFnZVk6 IHRvdWNoLnBhZ2VZLAorICAgIGN1cnJlbnRUaW1lU3RhbXA6IHRpbWVzdGFtcEZvclRvdWNoKHRv dWNoKSwKKyAgICBwcmV2aW91c1BhZ2VYOiB0b3VjaC5wYWdlWCwKKyAgICBwcmV2aW91c1BhZ2VZ OiB0b3VjaC5wYWdlWSwKKyAgICBwcmV2aW91c1RpbWVTdGFtcDogdGltZXN0YW1wRm9yVG91Y2go dG91Y2gpCisgIH07Cit9CisKK2Z1bmN0aW9uIHJlc2V0VG91Y2hSZWNvcmQodG91Y2hSZWNvcmQs IHRvdWNoKSB7CisgIHRvdWNoUmVjb3JkLnRvdWNoQWN0aXZlID0gdHJ1ZTsKKyAgdG91Y2hSZWNv cmQuc3RhcnRQYWdlWCA9IHRvdWNoLnBhZ2VYOworICB0b3VjaFJlY29yZC5zdGFydFBhZ2VZID0g dG91Y2gucGFnZVk7CisgIHRvdWNoUmVjb3JkLnN0YXJ0VGltZVN0YW1wID0gdGltZXN0YW1wRm9y VG91Y2godG91Y2gpOworICB0b3VjaFJlY29yZC5jdXJyZW50UGFnZVggPSB0b3VjaC5wYWdlWDsK KyAgdG91Y2hSZWNvcmQuY3VycmVudFBhZ2VZID0gdG91Y2gucGFnZVk7CisgIHRvdWNoUmVjb3Jk LmN1cnJlbnRUaW1lU3RhbXAgPSB0aW1lc3RhbXBGb3JUb3VjaCh0b3VjaCk7CisgIHRvdWNoUmVj b3JkLnByZXZpb3VzUGFnZVggPSB0b3VjaC5wYWdlWDsKKyAgdG91Y2hSZWNvcmQucHJldmlvdXNQ YWdlWSA9IHRvdWNoLnBhZ2VZOworICB0b3VjaFJlY29yZC5wcmV2aW91c1RpbWVTdGFtcCA9IHRp bWVzdGFtcEZvclRvdWNoKHRvdWNoKTsKK30KKworZnVuY3Rpb24gZ2V0VG91Y2hJZGVudGlmaWVy KF9yZWYpIHsKKyAgdmFyIGlkZW50aWZpZXIgPSBfcmVmLmlkZW50aWZpZXI7CisKKyAgIShpZGVu dGlmaWVyICE9IG51bGwpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/ IGludmFyaWFudChmYWxzZSwgJ1RvdWNoIG9iamVjdCBpcyBtaXNzaW5nIGlkZW50aWZpZXIuJykg OiBfcHJvZEludmFyaWFudCgnMTM4JykgOiB2b2lkIDA7CisgIHByb2Nlc3MuZW52Lk5PREVfRU5W ICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGlkZW50aWZpZXIgPD0gTUFYX1RPVUNIX0JBTkss ICdUb3VjaCBpZGVudGlmaWVyICVzIGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIHN1cHBvcnRlZCAl cyB3aGljaCBjYXVzZXMgJyArICdwZXJmb3JtYW5jZSBpc3N1ZXMgYmFja2ZpbGxpbmcgYXJyYXkg bG9jYXRpb25zIGZvciBhbGwgb2YgdGhlIGluZGljZXMuJywgaWRlbnRpZmllciwgTUFYX1RPVUNI X0JBTkspIDogdm9pZCAwOworICByZXR1cm4gaWRlbnRpZmllcjsKK30KKworZnVuY3Rpb24gcmVj b3JkVG91Y2hTdGFydCh0b3VjaCkgeworICB2YXIgaWRlbnRpZmllciA9IGdldFRvdWNoSWRlbnRp Zmllcih0b3VjaCk7CisgIHZhciB0b3VjaFJlY29yZCA9IHRvdWNoQmFua1tpZGVudGlmaWVyXTsK KyAgaWYgKHRvdWNoUmVjb3JkKSB7CisgICAgcmVzZXRUb3VjaFJlY29yZCh0b3VjaFJlY29yZCwg dG91Y2gpOworICB9IGVsc2UgeworICAgIHRvdWNoQmFua1tpZGVudGlmaWVyXSA9IGNyZWF0ZVRv dWNoUmVjb3JkKHRvdWNoKTsKKyAgfQorICB0b3VjaEhpc3RvcnkubW9zdFJlY2VudFRpbWVTdGFt cCA9IHRpbWVzdGFtcEZvclRvdWNoKHRvdWNoKTsKK30KKworZnVuY3Rpb24gcmVjb3JkVG91Y2hN b3ZlKHRvdWNoKSB7CisgIHZhciB0b3VjaFJlY29yZCA9IHRvdWNoQmFua1tnZXRUb3VjaElkZW50 aWZpZXIodG91Y2gpXTsKKyAgaWYgKHRvdWNoUmVjb3JkKSB7CisgICAgdG91Y2hSZWNvcmQudG91 Y2hBY3RpdmUgPSB0cnVlOworICAgIHRvdWNoUmVjb3JkLnByZXZpb3VzUGFnZVggPSB0b3VjaFJl Y29yZC5jdXJyZW50UGFnZVg7CisgICAgdG91Y2hSZWNvcmQucHJldmlvdXNQYWdlWSA9IHRvdWNo UmVjb3JkLmN1cnJlbnRQYWdlWTsKKyAgICB0b3VjaFJlY29yZC5wcmV2aW91c1RpbWVTdGFtcCA9 IHRvdWNoUmVjb3JkLmN1cnJlbnRUaW1lU3RhbXA7CisgICAgdG91Y2hSZWNvcmQuY3VycmVudFBh Z2VYID0gdG91Y2gucGFnZVg7CisgICAgdG91Y2hSZWNvcmQuY3VycmVudFBhZ2VZID0gdG91Y2gu cGFnZVk7CisgICAgdG91Y2hSZWNvcmQuY3VycmVudFRpbWVTdGFtcCA9IHRpbWVzdGFtcEZvclRv dWNoKHRvdWNoKTsKKyAgICB0b3VjaEhpc3RvcnkubW9zdFJlY2VudFRpbWVTdGFtcCA9IHRpbWVz dGFtcEZvclRvdWNoKHRvdWNoKTsKKyAgfSBlbHNlIHsKKyAgICBjb25zb2xlLmVycm9yKCdDYW5u b3QgcmVjb3JkIHRvdWNoIG1vdmUgd2l0aG91dCBhIHRvdWNoIHN0YXJ0LlxuJyArICdUb3VjaCBN b3ZlOiAlc1xuJywgJ1RvdWNoIEJhbms6ICVzJywgcHJpbnRUb3VjaCh0b3VjaCksIHByaW50VG91 Y2hCYW5rKCkpOworICB9Cit9CisKK2Z1bmN0aW9uIHJlY29yZFRvdWNoRW5kKHRvdWNoKSB7Cisg IHZhciB0b3VjaFJlY29yZCA9IHRvdWNoQmFua1tnZXRUb3VjaElkZW50aWZpZXIodG91Y2gpXTsK KyAgaWYgKHRvdWNoUmVjb3JkKSB7CisgICAgdG91Y2hSZWNvcmQudG91Y2hBY3RpdmUgPSBmYWxz ZTsKKyAgICB0b3VjaFJlY29yZC5wcmV2aW91c1BhZ2VYID0gdG91Y2hSZWNvcmQuY3VycmVudFBh Z2VYOworICAgIHRvdWNoUmVjb3JkLnByZXZpb3VzUGFnZVkgPSB0b3VjaFJlY29yZC5jdXJyZW50 UGFnZVk7CisgICAgdG91Y2hSZWNvcmQucHJldmlvdXNUaW1lU3RhbXAgPSB0b3VjaFJlY29yZC5j dXJyZW50VGltZVN0YW1wOworICAgIHRvdWNoUmVjb3JkLmN1cnJlbnRQYWdlWCA9IHRvdWNoLnBh Z2VYOworICAgIHRvdWNoUmVjb3JkLmN1cnJlbnRQYWdlWSA9IHRvdWNoLnBhZ2VZOworICAgIHRv dWNoUmVjb3JkLmN1cnJlbnRUaW1lU3RhbXAgPSB0aW1lc3RhbXBGb3JUb3VjaCh0b3VjaCk7Cisg ICAgdG91Y2hIaXN0b3J5Lm1vc3RSZWNlbnRUaW1lU3RhbXAgPSB0aW1lc3RhbXBGb3JUb3VjaCh0 b3VjaCk7CisgIH0gZWxzZSB7CisgICAgY29uc29sZS5lcnJvcignQ2Fubm90IHJlY29yZCB0b3Vj aCBlbmQgd2l0aG91dCBhIHRvdWNoIHN0YXJ0LlxuJyArICdUb3VjaCBFbmQ6ICVzXG4nLCAnVG91 Y2ggQmFuazogJXMnLCBwcmludFRvdWNoKHRvdWNoKSwgcHJpbnRUb3VjaEJhbmsoKSk7CisgIH0K K30KKworZnVuY3Rpb24gcHJpbnRUb3VjaCh0b3VjaCkgeworICByZXR1cm4gSlNPTi5zdHJpbmdp ZnkoeworICAgIGlkZW50aWZpZXI6IHRvdWNoLmlkZW50aWZpZXIsCisgICAgcGFnZVg6IHRvdWNo LnBhZ2VYLAorICAgIHBhZ2VZOiB0b3VjaC5wYWdlWSwKKyAgICB0aW1lc3RhbXA6IHRpbWVzdGFt cEZvclRvdWNoKHRvdWNoKQorICB9KTsKK30KKworZnVuY3Rpb24gcHJpbnRUb3VjaEJhbmsoKSB7 CisgIHZhciBwcmludGVkID0gSlNPTi5zdHJpbmdpZnkodG91Y2hCYW5rLnNsaWNlKDAsIE1BWF9U T1VDSF9CQU5LKSk7CisgIGlmICh0b3VjaEJhbmsubGVuZ3RoID4gTUFYX1RPVUNIX0JBTkspIHsK KyAgICBwcmludGVkICs9ICcgKG9yaWdpbmFsIHNpemU6ICcgKyB0b3VjaEJhbmsubGVuZ3RoICsg JyknOworICB9CisgIHJldHVybiBwcmludGVkOworfQorCit2YXIgUmVzcG9uZGVyVG91Y2hIaXN0 b3J5U3RvcmUgPSB7CisgIHJlY29yZFRvdWNoVHJhY2s6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUs IG5hdGl2ZUV2ZW50KSB7CisgICAgaWYgKGlzTW92ZWlzaCh0b3BMZXZlbFR5cGUpKSB7CisgICAg ICBuYXRpdmVFdmVudC5jaGFuZ2VkVG91Y2hlcy5mb3JFYWNoKHJlY29yZFRvdWNoTW92ZSk7Cisg ICAgfSBlbHNlIGlmIChpc1N0YXJ0aXNoKHRvcExldmVsVHlwZSkpIHsKKyAgICAgIG5hdGl2ZUV2 ZW50LmNoYW5nZWRUb3VjaGVzLmZvckVhY2gocmVjb3JkVG91Y2hTdGFydCk7CisgICAgICB0b3Vj aEhpc3RvcnkubnVtYmVyQWN0aXZlVG91Y2hlcyA9IG5hdGl2ZUV2ZW50LnRvdWNoZXMubGVuZ3Ro OworICAgICAgaWYgKHRvdWNoSGlzdG9yeS5udW1iZXJBY3RpdmVUb3VjaGVzID09PSAxKSB7Cisg ICAgICAgIHRvdWNoSGlzdG9yeS5pbmRleE9mU2luZ2xlQWN0aXZlVG91Y2ggPSBuYXRpdmVFdmVu dC50b3VjaGVzWzBdLmlkZW50aWZpZXI7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChpc0VuZGlz aCh0b3BMZXZlbFR5cGUpKSB7CisgICAgICBuYXRpdmVFdmVudC5jaGFuZ2VkVG91Y2hlcy5mb3JF YWNoKHJlY29yZFRvdWNoRW5kKTsKKyAgICAgIHRvdWNoSGlzdG9yeS5udW1iZXJBY3RpdmVUb3Vj aGVzID0gbmF0aXZlRXZlbnQudG91Y2hlcy5sZW5ndGg7CisgICAgICBpZiAodG91Y2hIaXN0b3J5 Lm51bWJlckFjdGl2ZVRvdWNoZXMgPT09IDEpIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkg PCB0b3VjaEJhbmsubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICB2YXIgdG91Y2hUcmFja1RvQ2hl Y2sgPSB0b3VjaEJhbmtbaV07CisgICAgICAgICAgaWYgKHRvdWNoVHJhY2tUb0NoZWNrICE9IG51 bGwgJiYgdG91Y2hUcmFja1RvQ2hlY2sudG91Y2hBY3RpdmUpIHsKKyAgICAgICAgICAgIHRvdWNo SGlzdG9yeS5pbmRleE9mU2luZ2xlQWN0aXZlVG91Y2ggPSBpOworICAgICAgICAgICAgYnJlYWs7 CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VO ViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAgICAgdmFyIGFjdGl2ZVJlY29yZCA9IHRvdWNo QmFua1t0b3VjaEhpc3RvcnkuaW5kZXhPZlNpbmdsZUFjdGl2ZVRvdWNoXTsKKyAgICAgICAgICBw cm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhhY3RpdmVSZWNv cmQgIT0gbnVsbCAmJiBhY3RpdmVSZWNvcmQudG91Y2hBY3RpdmUsICdDYW5ub3QgZmluZCBzaW5n bGUgYWN0aXZlIHRvdWNoLicpIDogdm9pZCAwOworICAgICAgICB9CisgICAgICB9CisgICAgfQor ICB9LAorCisKKyAgdG91Y2hIaXN0b3J5OiB0b3VjaEhpc3RvcnkKK307CisKK21vZHVsZS5leHBv cnRzID0gUmVzcG9uZGVyVG91Y2hIaXN0b3J5U3RvcmU7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2Yg ZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGli L1NWR0RPTVByb3BlcnR5Q29uZmlnLmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFj dC1kb20vbGliL1NWR0RPTVByb3BlcnR5Q29uZmlnLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAwLi45M2RmNzg5NwotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0 YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9TVkdET01Qcm9wZXJ0eUNvbmZpZy5qcwpAQCAtMCww ICsxLDMwMSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5j LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxp Y2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VO U0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRk aXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBB VEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0 JzsKKwordmFyIE5TID0geworICB4bGluazogJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsn LAorICB4bWw6ICdodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UnCit9OworCisv LyBXZSB1c2UgYXR0cmlidXRlcyBmb3IgZXZlcnl0aGluZyBTVkcgc28gbGV0J3MgYXZvaWQgc29t ZSBkdXBsaWNhdGlvbiBhbmQgcnVuCisvLyBjb2RlIGluc3RlYWQuCisvLyBUaGUgZm9sbG93aW5n IGFyZSBhbGwgc3BlY2lmaWVkIGluIHRoZSBIVE1MIGNvbmZpZyBhbHJlYWR5IHNvIHdlIGV4Y2x1 ZGUgaGVyZS4KKy8vIC0gY2xhc3MgKGFzIGNsYXNzTmFtZSkKKy8vIC0gY29sb3IKKy8vIC0gaGVp Z2h0CisvLyAtIGlkCisvLyAtIGxhbmcKKy8vIC0gbWF4CisvLyAtIG1lZGlhCisvLyAtIG1ldGhv ZAorLy8gLSBtaW4KKy8vIC0gbmFtZQorLy8gLSBzdHlsZQorLy8gLSB0YXJnZXQKKy8vIC0gdHlw ZQorLy8gLSB3aWR0aAordmFyIEFUVFJTID0geworICBhY2NlbnRIZWlnaHQ6ICdhY2NlbnQtaGVp Z2h0JywKKyAgYWNjdW11bGF0ZTogMCwKKyAgYWRkaXRpdmU6IDAsCisgIGFsaWdubWVudEJhc2Vs aW5lOiAnYWxpZ25tZW50LWJhc2VsaW5lJywKKyAgYWxsb3dSZW9yZGVyOiAnYWxsb3dSZW9yZGVy JywKKyAgYWxwaGFiZXRpYzogMCwKKyAgYW1wbGl0dWRlOiAwLAorICBhcmFiaWNGb3JtOiAnYXJh YmljLWZvcm0nLAorICBhc2NlbnQ6IDAsCisgIGF0dHJpYnV0ZU5hbWU6ICdhdHRyaWJ1dGVOYW1l JywKKyAgYXR0cmlidXRlVHlwZTogJ2F0dHJpYnV0ZVR5cGUnLAorICBhdXRvUmV2ZXJzZTogJ2F1 dG9SZXZlcnNlJywKKyAgYXppbXV0aDogMCwKKyAgYmFzZUZyZXF1ZW5jeTogJ2Jhc2VGcmVxdWVu Y3knLAorICBiYXNlUHJvZmlsZTogJ2Jhc2VQcm9maWxlJywKKyAgYmFzZWxpbmVTaGlmdDogJ2Jh c2VsaW5lLXNoaWZ0JywKKyAgYmJveDogMCwKKyAgYmVnaW46IDAsCisgIGJpYXM6IDAsCisgIGJ5 OiAwLAorICBjYWxjTW9kZTogJ2NhbGNNb2RlJywKKyAgY2FwSGVpZ2h0OiAnY2FwLWhlaWdodCcs CisgIGNsaXA6IDAsCisgIGNsaXBQYXRoOiAnY2xpcC1wYXRoJywKKyAgY2xpcFJ1bGU6ICdjbGlw LXJ1bGUnLAorICBjbGlwUGF0aFVuaXRzOiAnY2xpcFBhdGhVbml0cycsCisgIGNvbG9ySW50ZXJw b2xhdGlvbjogJ2NvbG9yLWludGVycG9sYXRpb24nLAorICBjb2xvckludGVycG9sYXRpb25GaWx0 ZXJzOiAnY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzJywKKyAgY29sb3JQcm9maWxlOiAnY29s b3ItcHJvZmlsZScsCisgIGNvbG9yUmVuZGVyaW5nOiAnY29sb3ItcmVuZGVyaW5nJywKKyAgY29u dGVudFNjcmlwdFR5cGU6ICdjb250ZW50U2NyaXB0VHlwZScsCisgIGNvbnRlbnRTdHlsZVR5cGU6 ICdjb250ZW50U3R5bGVUeXBlJywKKyAgY3Vyc29yOiAwLAorICBjeDogMCwKKyAgY3k6IDAsCisg IGQ6IDAsCisgIGRlY2VsZXJhdGU6IDAsCisgIGRlc2NlbnQ6IDAsCisgIGRpZmZ1c2VDb25zdGFu dDogJ2RpZmZ1c2VDb25zdGFudCcsCisgIGRpcmVjdGlvbjogMCwKKyAgZGlzcGxheTogMCwKKyAg ZGl2aXNvcjogMCwKKyAgZG9taW5hbnRCYXNlbGluZTogJ2RvbWluYW50LWJhc2VsaW5lJywKKyAg ZHVyOiAwLAorICBkeDogMCwKKyAgZHk6IDAsCisgIGVkZ2VNb2RlOiAnZWRnZU1vZGUnLAorICBl bGV2YXRpb246IDAsCisgIGVuYWJsZUJhY2tncm91bmQ6ICdlbmFibGUtYmFja2dyb3VuZCcsCisg IGVuZDogMCwKKyAgZXhwb25lbnQ6IDAsCisgIGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQ6ICdl eHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJywKKyAgZmlsbDogMCwKKyAgZmlsbE9wYWNpdHk6ICdm aWxsLW9wYWNpdHknLAorICBmaWxsUnVsZTogJ2ZpbGwtcnVsZScsCisgIGZpbHRlcjogMCwKKyAg ZmlsdGVyUmVzOiAnZmlsdGVyUmVzJywKKyAgZmlsdGVyVW5pdHM6ICdmaWx0ZXJVbml0cycsCisg IGZsb29kQ29sb3I6ICdmbG9vZC1jb2xvcicsCisgIGZsb29kT3BhY2l0eTogJ2Zsb29kLW9wYWNp dHknLAorICBmb2N1c2FibGU6IDAsCisgIGZvbnRGYW1pbHk6ICdmb250LWZhbWlseScsCisgIGZv bnRTaXplOiAnZm9udC1zaXplJywKKyAgZm9udFNpemVBZGp1c3Q6ICdmb250LXNpemUtYWRqdXN0 JywKKyAgZm9udFN0cmV0Y2g6ICdmb250LXN0cmV0Y2gnLAorICBmb250U3R5bGU6ICdmb250LXN0 eWxlJywKKyAgZm9udFZhcmlhbnQ6ICdmb250LXZhcmlhbnQnLAorICBmb250V2VpZ2h0OiAnZm9u dC13ZWlnaHQnLAorICBmb3JtYXQ6IDAsCisgIGZyb206IDAsCisgIGZ4OiAwLAorICBmeTogMCwK KyAgZzE6IDAsCisgIGcyOiAwLAorICBnbHlwaE5hbWU6ICdnbHlwaC1uYW1lJywKKyAgZ2x5cGhP cmllbnRhdGlvbkhvcml6b250YWw6ICdnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsJywKKyAg Z2x5cGhPcmllbnRhdGlvblZlcnRpY2FsOiAnZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwnLAor ICBnbHlwaFJlZjogJ2dseXBoUmVmJywKKyAgZ3JhZGllbnRUcmFuc2Zvcm06ICdncmFkaWVudFRy YW5zZm9ybScsCisgIGdyYWRpZW50VW5pdHM6ICdncmFkaWVudFVuaXRzJywKKyAgaGFuZ2luZzog MCwKKyAgaG9yaXpBZHZYOiAnaG9yaXotYWR2LXgnLAorICBob3Jpek9yaWdpblg6ICdob3Jpei1v cmlnaW4teCcsCisgIGlkZW9ncmFwaGljOiAwLAorICBpbWFnZVJlbmRlcmluZzogJ2ltYWdlLXJl bmRlcmluZycsCisgICdpbic6IDAsCisgIGluMjogMCwKKyAgaW50ZXJjZXB0OiAwLAorICBrOiAw LAorICBrMTogMCwKKyAgazI6IDAsCisgIGszOiAwLAorICBrNDogMCwKKyAga2VybmVsTWF0cml4 OiAna2VybmVsTWF0cml4JywKKyAga2VybmVsVW5pdExlbmd0aDogJ2tlcm5lbFVuaXRMZW5ndGgn LAorICBrZXJuaW5nOiAwLAorICBrZXlQb2ludHM6ICdrZXlQb2ludHMnLAorICBrZXlTcGxpbmVz OiAna2V5U3BsaW5lcycsCisgIGtleVRpbWVzOiAna2V5VGltZXMnLAorICBsZW5ndGhBZGp1c3Q6 ICdsZW5ndGhBZGp1c3QnLAorICBsZXR0ZXJTcGFjaW5nOiAnbGV0dGVyLXNwYWNpbmcnLAorICBs aWdodGluZ0NvbG9yOiAnbGlnaHRpbmctY29sb3InLAorICBsaW1pdGluZ0NvbmVBbmdsZTogJ2xp bWl0aW5nQ29uZUFuZ2xlJywKKyAgbG9jYWw6IDAsCisgIG1hcmtlckVuZDogJ21hcmtlci1lbmQn LAorICBtYXJrZXJNaWQ6ICdtYXJrZXItbWlkJywKKyAgbWFya2VyU3RhcnQ6ICdtYXJrZXItc3Rh cnQnLAorICBtYXJrZXJIZWlnaHQ6ICdtYXJrZXJIZWlnaHQnLAorICBtYXJrZXJVbml0czogJ21h cmtlclVuaXRzJywKKyAgbWFya2VyV2lkdGg6ICdtYXJrZXJXaWR0aCcsCisgIG1hc2s6IDAsCisg IG1hc2tDb250ZW50VW5pdHM6ICdtYXNrQ29udGVudFVuaXRzJywKKyAgbWFza1VuaXRzOiAnbWFz a1VuaXRzJywKKyAgbWF0aGVtYXRpY2FsOiAwLAorICBtb2RlOiAwLAorICBudW1PY3RhdmVzOiAn bnVtT2N0YXZlcycsCisgIG9mZnNldDogMCwKKyAgb3BhY2l0eTogMCwKKyAgb3BlcmF0b3I6IDAs CisgIG9yZGVyOiAwLAorICBvcmllbnQ6IDAsCisgIG9yaWVudGF0aW9uOiAwLAorICBvcmlnaW46 IDAsCisgIG92ZXJmbG93OiAwLAorICBvdmVybGluZVBvc2l0aW9uOiAnb3ZlcmxpbmUtcG9zaXRp b24nLAorICBvdmVybGluZVRoaWNrbmVzczogJ292ZXJsaW5lLXRoaWNrbmVzcycsCisgIHBhaW50 T3JkZXI6ICdwYWludC1vcmRlcicsCisgIHBhbm9zZTE6ICdwYW5vc2UtMScsCisgIHBhdGhMZW5n dGg6ICdwYXRoTGVuZ3RoJywKKyAgcGF0dGVybkNvbnRlbnRVbml0czogJ3BhdHRlcm5Db250ZW50 VW5pdHMnLAorICBwYXR0ZXJuVHJhbnNmb3JtOiAncGF0dGVyblRyYW5zZm9ybScsCisgIHBhdHRl cm5Vbml0czogJ3BhdHRlcm5Vbml0cycsCisgIHBvaW50ZXJFdmVudHM6ICdwb2ludGVyLWV2ZW50 cycsCisgIHBvaW50czogMCwKKyAgcG9pbnRzQXRYOiAncG9pbnRzQXRYJywKKyAgcG9pbnRzQXRZ OiAncG9pbnRzQXRZJywKKyAgcG9pbnRzQXRaOiAncG9pbnRzQXRaJywKKyAgcHJlc2VydmVBbHBo YTogJ3ByZXNlcnZlQWxwaGEnLAorICBwcmVzZXJ2ZUFzcGVjdFJhdGlvOiAncHJlc2VydmVBc3Bl Y3RSYXRpbycsCisgIHByaW1pdGl2ZVVuaXRzOiAncHJpbWl0aXZlVW5pdHMnLAorICByOiAwLAor ICByYWRpdXM6IDAsCisgIHJlZlg6ICdyZWZYJywKKyAgcmVmWTogJ3JlZlknLAorICByZW5kZXJp bmdJbnRlbnQ6ICdyZW5kZXJpbmctaW50ZW50JywKKyAgcmVwZWF0Q291bnQ6ICdyZXBlYXRDb3Vu dCcsCisgIHJlcGVhdER1cjogJ3JlcGVhdER1cicsCisgIHJlcXVpcmVkRXh0ZW5zaW9uczogJ3Jl cXVpcmVkRXh0ZW5zaW9ucycsCisgIHJlcXVpcmVkRmVhdHVyZXM6ICdyZXF1aXJlZEZlYXR1cmVz JywKKyAgcmVzdGFydDogMCwKKyAgcmVzdWx0OiAwLAorICByb3RhdGU6IDAsCisgIHJ4OiAwLAor ICByeTogMCwKKyAgc2NhbGU6IDAsCisgIHNlZWQ6IDAsCisgIHNoYXBlUmVuZGVyaW5nOiAnc2hh cGUtcmVuZGVyaW5nJywKKyAgc2xvcGU6IDAsCisgIHNwYWNpbmc6IDAsCisgIHNwZWN1bGFyQ29u c3RhbnQ6ICdzcGVjdWxhckNvbnN0YW50JywKKyAgc3BlY3VsYXJFeHBvbmVudDogJ3NwZWN1bGFy RXhwb25lbnQnLAorICBzcGVlZDogMCwKKyAgc3ByZWFkTWV0aG9kOiAnc3ByZWFkTWV0aG9kJywK KyAgc3RhcnRPZmZzZXQ6ICdzdGFydE9mZnNldCcsCisgIHN0ZERldmlhdGlvbjogJ3N0ZERldmlh dGlvbicsCisgIHN0ZW1oOiAwLAorICBzdGVtdjogMCwKKyAgc3RpdGNoVGlsZXM6ICdzdGl0Y2hU aWxlcycsCisgIHN0b3BDb2xvcjogJ3N0b3AtY29sb3InLAorICBzdG9wT3BhY2l0eTogJ3N0b3At b3BhY2l0eScsCisgIHN0cmlrZXRocm91Z2hQb3NpdGlvbjogJ3N0cmlrZXRocm91Z2gtcG9zaXRp b24nLAorICBzdHJpa2V0aHJvdWdoVGhpY2tuZXNzOiAnc3RyaWtldGhyb3VnaC10aGlja25lc3Mn LAorICBzdHJpbmc6IDAsCisgIHN0cm9rZTogMCwKKyAgc3Ryb2tlRGFzaGFycmF5OiAnc3Ryb2tl LWRhc2hhcnJheScsCisgIHN0cm9rZURhc2hvZmZzZXQ6ICdzdHJva2UtZGFzaG9mZnNldCcsCisg IHN0cm9rZUxpbmVjYXA6ICdzdHJva2UtbGluZWNhcCcsCisgIHN0cm9rZUxpbmVqb2luOiAnc3Ry b2tlLWxpbmVqb2luJywKKyAgc3Ryb2tlTWl0ZXJsaW1pdDogJ3N0cm9rZS1taXRlcmxpbWl0JywK KyAgc3Ryb2tlT3BhY2l0eTogJ3N0cm9rZS1vcGFjaXR5JywKKyAgc3Ryb2tlV2lkdGg6ICdzdHJv a2Utd2lkdGgnLAorICBzdXJmYWNlU2NhbGU6ICdzdXJmYWNlU2NhbGUnLAorICBzeXN0ZW1MYW5n dWFnZTogJ3N5c3RlbUxhbmd1YWdlJywKKyAgdGFibGVWYWx1ZXM6ICd0YWJsZVZhbHVlcycsCisg IHRhcmdldFg6ICd0YXJnZXRYJywKKyAgdGFyZ2V0WTogJ3RhcmdldFknLAorICB0ZXh0QW5jaG9y OiAndGV4dC1hbmNob3InLAorICB0ZXh0RGVjb3JhdGlvbjogJ3RleHQtZGVjb3JhdGlvbicsCisg IHRleHRSZW5kZXJpbmc6ICd0ZXh0LXJlbmRlcmluZycsCisgIHRleHRMZW5ndGg6ICd0ZXh0TGVu Z3RoJywKKyAgdG86IDAsCisgIHRyYW5zZm9ybTogMCwKKyAgdTE6IDAsCisgIHUyOiAwLAorICB1 bmRlcmxpbmVQb3NpdGlvbjogJ3VuZGVybGluZS1wb3NpdGlvbicsCisgIHVuZGVybGluZVRoaWNr bmVzczogJ3VuZGVybGluZS10aGlja25lc3MnLAorICB1bmljb2RlOiAwLAorICB1bmljb2RlQmlk aTogJ3VuaWNvZGUtYmlkaScsCisgIHVuaWNvZGVSYW5nZTogJ3VuaWNvZGUtcmFuZ2UnLAorICB1 bml0c1BlckVtOiAndW5pdHMtcGVyLWVtJywKKyAgdkFscGhhYmV0aWM6ICd2LWFscGhhYmV0aWMn LAorICB2SGFuZ2luZzogJ3YtaGFuZ2luZycsCisgIHZJZGVvZ3JhcGhpYzogJ3YtaWRlb2dyYXBo aWMnLAorICB2TWF0aGVtYXRpY2FsOiAndi1tYXRoZW1hdGljYWwnLAorICB2YWx1ZXM6IDAsCisg IHZlY3RvckVmZmVjdDogJ3ZlY3Rvci1lZmZlY3QnLAorICB2ZXJzaW9uOiAwLAorICB2ZXJ0QWR2 WTogJ3ZlcnQtYWR2LXknLAorICB2ZXJ0T3JpZ2luWDogJ3ZlcnQtb3JpZ2luLXgnLAorICB2ZXJ0 T3JpZ2luWTogJ3ZlcnQtb3JpZ2luLXknLAorICB2aWV3Qm94OiAndmlld0JveCcsCisgIHZpZXdU YXJnZXQ6ICd2aWV3VGFyZ2V0JywKKyAgdmlzaWJpbGl0eTogMCwKKyAgd2lkdGhzOiAwLAorICB3 b3JkU3BhY2luZzogJ3dvcmQtc3BhY2luZycsCisgIHdyaXRpbmdNb2RlOiAnd3JpdGluZy1tb2Rl JywKKyAgeDogMCwKKyAgeEhlaWdodDogJ3gtaGVpZ2h0JywKKyAgeDE6IDAsCisgIHgyOiAwLAor ICB4Q2hhbm5lbFNlbGVjdG9yOiAneENoYW5uZWxTZWxlY3RvcicsCisgIHhsaW5rQWN0dWF0ZTog J3hsaW5rOmFjdHVhdGUnLAorICB4bGlua0FyY3JvbGU6ICd4bGluazphcmNyb2xlJywKKyAgeGxp bmtIcmVmOiAneGxpbms6aHJlZicsCisgIHhsaW5rUm9sZTogJ3hsaW5rOnJvbGUnLAorICB4bGlu a1Nob3c6ICd4bGluazpzaG93JywKKyAgeGxpbmtUaXRsZTogJ3hsaW5rOnRpdGxlJywKKyAgeGxp bmtUeXBlOiAneGxpbms6dHlwZScsCisgIHhtbEJhc2U6ICd4bWw6YmFzZScsCisgIHhtbG5zOiAw LAorICB4bWxuc1hsaW5rOiAneG1sbnM6eGxpbmsnLAorICB4bWxMYW5nOiAneG1sOmxhbmcnLAor ICB4bWxTcGFjZTogJ3htbDpzcGFjZScsCisgIHk6IDAsCisgIHkxOiAwLAorICB5MjogMCwKKyAg eUNoYW5uZWxTZWxlY3RvcjogJ3lDaGFubmVsU2VsZWN0b3InLAorICB6OiAwLAorICB6b29tQW5k UGFuOiAnem9vbUFuZFBhbicKK307CisKK3ZhciBTVkdET01Qcm9wZXJ0eUNvbmZpZyA9IHsKKyAg UHJvcGVydGllczoge30sCisgIERPTUF0dHJpYnV0ZU5hbWVzcGFjZXM6IHsKKyAgICB4bGlua0Fj dHVhdGU6IE5TLnhsaW5rLAorICAgIHhsaW5rQXJjcm9sZTogTlMueGxpbmssCisgICAgeGxpbmtI cmVmOiBOUy54bGluaywKKyAgICB4bGlua1JvbGU6IE5TLnhsaW5rLAorICAgIHhsaW5rU2hvdzog TlMueGxpbmssCisgICAgeGxpbmtUaXRsZTogTlMueGxpbmssCisgICAgeGxpbmtUeXBlOiBOUy54 bGluaywKKyAgICB4bWxCYXNlOiBOUy54bWwsCisgICAgeG1sTGFuZzogTlMueG1sLAorICAgIHht bFNwYWNlOiBOUy54bWwKKyAgfSwKKyAgRE9NQXR0cmlidXRlTmFtZXM6IHt9Cit9OworCitPYmpl Y3Qua2V5cyhBVFRSUykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7CisgIFNWR0RPTVByb3BlcnR5 Q29uZmlnLlByb3BlcnRpZXNba2V5XSA9IDA7CisgIGlmIChBVFRSU1trZXldKSB7CisgICAgU1ZH RE9NUHJvcGVydHlDb25maWcuRE9NQXR0cmlidXRlTmFtZXNba2V5XSA9IEFUVFJTW2tleV07Cisg IH0KK30pOworCittb2R1bGUuZXhwb3J0cyA9IFNWR0RPTVByb3BlcnR5Q29uZmlnOwpcIE5vIG5l d2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5k b3IvcmVhY3QtZG9tL2xpYi9TZWxlY3RFdmVudFBsdWdpbi5qcyBiL3dlYi9wZ2FkbWluL3N0YXRp Yy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9TZWxlY3RFdmVudFBsdWdpbi5qcwpuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMC4uMGQwYWYyMTEKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIv cGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvU2VsZWN0RXZlbnRQbHVnaW4uanMK QEAgLTAsMCArMSwxOTAgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJv b2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29k ZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisg KiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUu IEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGlu IHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNl IHN0cmljdCc7CisKK3ZhciBFdmVudFByb3BhZ2F0b3JzID0gcmVxdWlyZSgnLi9FdmVudFByb3Bh Z2F0b3JzJyk7Cit2YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9F eGVjdXRpb25FbnZpcm9ubWVudCcpOwordmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVp cmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7Cit2YXIgUmVhY3RJbnB1dFNlbGVjdGlvbiA9 IHJlcXVpcmUoJy4vUmVhY3RJbnB1dFNlbGVjdGlvbicpOwordmFyIFN5bnRoZXRpY0V2ZW50ID0g cmVxdWlyZSgnLi9TeW50aGV0aWNFdmVudCcpOworCit2YXIgZ2V0QWN0aXZlRWxlbWVudCA9IHJl cXVpcmUoJ2ZianMvbGliL2dldEFjdGl2ZUVsZW1lbnQnKTsKK3ZhciBpc1RleHRJbnB1dEVsZW1l bnQgPSByZXF1aXJlKCcuL2lzVGV4dElucHV0RWxlbWVudCcpOwordmFyIHNoYWxsb3dFcXVhbCA9 IHJlcXVpcmUoJ2ZianMvbGliL3NoYWxsb3dFcXVhbCcpOworCit2YXIgc2tpcFNlbGVjdGlvbkNo YW5nZUV2ZW50ID0gRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NICYmICdkb2N1bWVudE1v ZGUnIGluIGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSA8PSAxMTsKKwordmFyIGV2 ZW50VHlwZXMgPSB7CisgIHNlbGVjdDogeworICAgIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOiB7 CisgICAgICBidWJibGVkOiAnb25TZWxlY3QnLAorICAgICAgY2FwdHVyZWQ6ICdvblNlbGVjdENh cHR1cmUnCisgICAgfSwKKyAgICBkZXBlbmRlbmNpZXM6IFsndG9wQmx1cicsICd0b3BDb250ZXh0 TWVudScsICd0b3BGb2N1cycsICd0b3BLZXlEb3duJywgJ3RvcEtleVVwJywgJ3RvcE1vdXNlRG93 bicsICd0b3BNb3VzZVVwJywgJ3RvcFNlbGVjdGlvbkNoYW5nZSddCisgIH0KK307CisKK3ZhciBh Y3RpdmVFbGVtZW50ID0gbnVsbDsKK3ZhciBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7Cit2YXIg bGFzdFNlbGVjdGlvbiA9IG51bGw7Cit2YXIgbW91c2VEb3duID0gZmFsc2U7CisKKy8vIFRyYWNr IHdoZXRoZXIgYSBsaXN0ZW5lciBleGlzdHMgZm9yIHRoaXMgcGx1Z2luLiBJZiBub25lIGV4aXN0 LCB3ZSBkbworLy8gbm90IGV4dHJhY3QgZXZlbnRzLiBTZWUgIzM2MzkuCit2YXIgaGFzTGlzdGVu ZXIgPSBmYWxzZTsKKworLyoqCisgKiBHZXQgYW4gb2JqZWN0IHdoaWNoIGlzIGEgdW5pcXVlIHJl cHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KKyAqCisgKiBUaGUgcmV0dXJu IHZhbHVlIHdpbGwgbm90IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG5vZGVzIG9yIGJyb3dzZXJzLCBi dXQKKyAqIHR3byBpZGVudGljYWwgc2VsZWN0aW9ucyBvbiB0aGUgc2FtZSBub2RlIHdpbGwgcmV0 dXJuIGlkZW50aWNhbCBvYmplY3RzLgorICoKKyAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZQor ICogQHJldHVybiB7b2JqZWN0fQorICovCitmdW5jdGlvbiBnZXRTZWxlY3Rpb24obm9kZSkgewor ICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBub2RlICYmIFJlYWN0SW5wdXRTZWxlY3Rpb24uaGFz U2VsZWN0aW9uQ2FwYWJpbGl0aWVzKG5vZGUpKSB7CisgICAgcmV0dXJuIHsKKyAgICAgIHN0YXJ0 OiBub2RlLnNlbGVjdGlvblN0YXJ0LAorICAgICAgZW5kOiBub2RlLnNlbGVjdGlvbkVuZAorICAg IH07CisgIH0gZWxzZSBpZiAod2luZG93LmdldFNlbGVjdGlvbikgeworICAgIHZhciBzZWxlY3Rp b24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CisgICAgcmV0dXJuIHsKKyAgICAgIGFuY2hvck5v ZGU6IHNlbGVjdGlvbi5hbmNob3JOb2RlLAorICAgICAgYW5jaG9yT2Zmc2V0OiBzZWxlY3Rpb24u YW5jaG9yT2Zmc2V0LAorICAgICAgZm9jdXNOb2RlOiBzZWxlY3Rpb24uZm9jdXNOb2RlLAorICAg ICAgZm9jdXNPZmZzZXQ6IHNlbGVjdGlvbi5mb2N1c09mZnNldAorICAgIH07CisgIH0gZWxzZSBp ZiAoZG9jdW1lbnQuc2VsZWN0aW9uKSB7CisgICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuc2VsZWN0 aW9uLmNyZWF0ZVJhbmdlKCk7CisgICAgcmV0dXJuIHsKKyAgICAgIHBhcmVudEVsZW1lbnQ6IHJh bmdlLnBhcmVudEVsZW1lbnQoKSwKKyAgICAgIHRleHQ6IHJhbmdlLnRleHQsCisgICAgICB0b3A6 IHJhbmdlLmJvdW5kaW5nVG9wLAorICAgICAgbGVmdDogcmFuZ2UuYm91bmRpbmdMZWZ0CisgICAg fTsKKyAgfQorfQorCisvKioKKyAqIFBvbGwgc2VsZWN0aW9uIHRvIHNlZSB3aGV0aGVyIGl0J3Mg Y2hhbmdlZC4KKyAqCisgKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQKKyAqIEByZXR1cm4g ez9TeW50aGV0aWNFdmVudH0KKyAqLworZnVuY3Rpb24gY29uc3RydWN0U2VsZWN0RXZlbnQobmF0 aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7CisgIC8vIEVuc3VyZSB3ZSBoYXZlIHRoZSBy aWdodCBlbGVtZW50LCBhbmQgdGhhdCB0aGUgdXNlciBpcyBub3QgZHJhZ2dpbmcgYQorICAvLyBz ZWxlY3Rpb24gKHRoaXMgbWF0Y2hlcyBuYXRpdmUgYHNlbGVjdGAgZXZlbnQgYmVoYXZpb3IpLiBJ biBIVE1MNSwgc2VsZWN0CisgIC8vIGZpcmVzIG9ubHkgb24gaW5wdXQgYW5kIHRleHRhcmVhIHRo dXMgaWYgdGhlcmUncyBubyBmb2N1c2VkIGVsZW1lbnQgd2UKKyAgLy8gd29uJ3QgZGlzcGF0Y2gu CisgIGlmIChtb3VzZURvd24gfHwgYWN0aXZlRWxlbWVudCA9PSBudWxsIHx8IGFjdGl2ZUVsZW1l bnQgIT09IGdldEFjdGl2ZUVsZW1lbnQoKSkgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAg Ly8gT25seSBmaXJlIHdoZW4gc2VsZWN0aW9uIGhhcyBhY3R1YWxseSBjaGFuZ2VkLgorICB2YXIg Y3VycmVudFNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbihhY3RpdmVFbGVtZW50KTsKKyAgaWYgKCFs YXN0U2VsZWN0aW9uIHx8ICFzaGFsbG93RXF1YWwobGFzdFNlbGVjdGlvbiwgY3VycmVudFNlbGVj dGlvbikpIHsKKyAgICBsYXN0U2VsZWN0aW9uID0gY3VycmVudFNlbGVjdGlvbjsKKworICAgIHZh ciBzeW50aGV0aWNFdmVudCA9IFN5bnRoZXRpY0V2ZW50LmdldFBvb2xlZChldmVudFR5cGVzLnNl bGVjdCwgYWN0aXZlRWxlbWVudEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7 CisKKyAgICBzeW50aGV0aWNFdmVudC50eXBlID0gJ3NlbGVjdCc7CisgICAgc3ludGhldGljRXZl bnQudGFyZ2V0ID0gYWN0aXZlRWxlbWVudDsKKworICAgIEV2ZW50UHJvcGFnYXRvcnMuYWNjdW11 bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyhzeW50aGV0aWNFdmVudCk7CisKKyAgICByZXR1cm4gc3lu dGhldGljRXZlbnQ7CisgIH0KKworICByZXR1cm4gbnVsbDsKK30KKworLyoqCisgKiBUaGlzIHBs dWdpbiBjcmVhdGVzIGFuIGBvblNlbGVjdGAgZXZlbnQgdGhhdCBub3JtYWxpemVzIHNlbGVjdCBl dmVudHMKKyAqIGFjcm9zcyBmb3JtIGVsZW1lbnRzLgorICoKKyAqIFN1cHBvcnRlZCBlbGVtZW50 cyBhcmU6CisgKiAtIGlucHV0IChzZWUgYGlzVGV4dElucHV0RWxlbWVudGApCisgKiAtIHRleHRh cmVhCisgKiAtIGNvbnRlbnRFZGl0YWJsZQorICoKKyAqIFRoaXMgZGlmZmVycyBmcm9tIG5hdGl2 ZSBicm93c2VyIGltcGxlbWVudGF0aW9ucyBpbiB0aGUgZm9sbG93aW5nIHdheXM6CisgKiAtIEZp cmVzIG9uIGNvbnRlbnRFZGl0YWJsZSBmaWVsZHMgYXMgd2VsbCBhcyBpbnB1dHMuCisgKiAtIEZp cmVzIGZvciBjb2xsYXBzZWQgc2VsZWN0aW9uLgorICogLSBGaXJlcyBhZnRlciB1c2VyIGlucHV0 LgorICovCit2YXIgU2VsZWN0RXZlbnRQbHVnaW4gPSB7CisKKyAgZXZlbnRUeXBlczogZXZlbnRU eXBlcywKKworICBleHRyYWN0RXZlbnRzOiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCB0YXJnZXRJ bnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHsKKyAgICBpZiAoIWhhc0xpc3Rl bmVyKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICB2YXIgdGFyZ2V0Tm9kZSA9 IHRhcmdldEluc3QgPyBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0 YXJnZXRJbnN0KSA6IHdpbmRvdzsKKworICAgIHN3aXRjaCAodG9wTGV2ZWxUeXBlKSB7CisgICAg ICAvLyBUcmFjayB0aGUgaW5wdXQgbm9kZSB0aGF0IGhhcyBmb2N1cy4KKyAgICAgIGNhc2UgJ3Rv cEZvY3VzJzoKKyAgICAgICAgaWYgKGlzVGV4dElucHV0RWxlbWVudCh0YXJnZXROb2RlKSB8fCB0 YXJnZXROb2RlLmNvbnRlbnRFZGl0YWJsZSA9PT0gJ3RydWUnKSB7CisgICAgICAgICAgYWN0aXZl RWxlbWVudCA9IHRhcmdldE5vZGU7CisgICAgICAgICAgYWN0aXZlRWxlbWVudEluc3QgPSB0YXJn ZXRJbnN0OworICAgICAgICAgIGxhc3RTZWxlY3Rpb24gPSBudWxsOworICAgICAgICB9CisgICAg ICAgIGJyZWFrOworICAgICAgY2FzZSAndG9wQmx1cic6CisgICAgICAgIGFjdGl2ZUVsZW1lbnQg PSBudWxsOworICAgICAgICBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7CisgICAgICAgIGxhc3RT ZWxlY3Rpb24gPSBudWxsOworICAgICAgICBicmVhazsKKworICAgICAgLy8gRG9uJ3QgZmlyZSB0 aGUgZXZlbnQgd2hpbGUgdGhlIHVzZXIgaXMgZHJhZ2dpbmcuIFRoaXMgbWF0Y2hlcyB0aGUKKyAg ICAgIC8vIHNlbWFudGljcyBvZiB0aGUgbmF0aXZlIHNlbGVjdCBldmVudC4KKyAgICAgIGNhc2Ug J3RvcE1vdXNlRG93bic6CisgICAgICAgIG1vdXNlRG93biA9IHRydWU7CisgICAgICAgIGJyZWFr OworICAgICAgY2FzZSAndG9wQ29udGV4dE1lbnUnOgorICAgICAgY2FzZSAndG9wTW91c2VVcCc6 CisgICAgICAgIG1vdXNlRG93biA9IGZhbHNlOworICAgICAgICByZXR1cm4gY29uc3RydWN0U2Vs ZWN0RXZlbnQobmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTsKKworICAgICAgLy8gQ2hy b21lIGFuZCBJRSBmaXJlIG5vbi1zdGFuZGFyZCBldmVudCB3aGVuIHNlbGVjdGlvbiBpcyBjaGFu Z2VkIChhbmQKKyAgICAgIC8vIHNvbWV0aW1lcyB3aGVuIGl0IGhhc24ndCkuIElFJ3MgZXZlbnQg ZmlyZXMgb3V0IG9mIG9yZGVyIHdpdGggcmVzcGVjdAorICAgICAgLy8gdG8ga2V5IGFuZCBpbnB1 dCBldmVudHMgb24gZGVsZXRpb24sIHNvIHdlIGRpc2NhcmQgaXQuCisgICAgICAvLworICAgICAg Ly8gRmlyZWZveCBkb2Vzbid0IHN1cHBvcnQgc2VsZWN0aW9uY2hhbmdlLCBzbyBjaGVjayBzZWxl Y3Rpb24gc3RhdHVzCisgICAgICAvLyBhZnRlciBlYWNoIGtleSBlbnRyeS4gVGhlIHNlbGVjdGlv biBjaGFuZ2VzIGFmdGVyIGtleWRvd24gYW5kIGJlZm9yZQorICAgICAgLy8ga2V5dXAsIGJ1dCB3 ZSBjaGVjayBvbiBrZXlkb3duIGFzIHdlbGwgaW4gdGhlIGNhc2Ugb2YgaG9sZGluZyBkb3duIGEK KyAgICAgIC8vIGtleSwgd2hlbiBtdWx0aXBsZSBrZXlkb3duIGV2ZW50cyBhcmUgZmlyZWQgYnV0 IG9ubHkgb25lIGtleXVwIGlzLgorICAgICAgLy8gVGhpcyBpcyBhbHNvIG91ciBhcHByb2FjaCBm b3IgSUUgaGFuZGxpbmcsIGZvciB0aGUgcmVhc29uIGFib3ZlLgorICAgICAgY2FzZSAndG9wU2Vs ZWN0aW9uQ2hhbmdlJzoKKyAgICAgICAgaWYgKHNraXBTZWxlY3Rpb25DaGFuZ2VFdmVudCkgewor ICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAvLyBmYWxscyB0aHJvdWdoCisgICAg ICBjYXNlICd0b3BLZXlEb3duJzoKKyAgICAgIGNhc2UgJ3RvcEtleVVwJzoKKyAgICAgICAgcmV0 dXJuIGNvbnN0cnVjdFNlbGVjdEV2ZW50KG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7 CisgICAgfQorCisgICAgcmV0dXJuIG51bGw7CisgIH0sCisKKyAgZGlkUHV0TGlzdGVuZXI6IGZ1 bmN0aW9uIChpbnN0LCByZWdpc3RyYXRpb25OYW1lLCBsaXN0ZW5lcikgeworICAgIGlmIChyZWdp c3RyYXRpb25OYW1lID09PSAnb25TZWxlY3QnKSB7CisgICAgICBoYXNMaXN0ZW5lciA9IHRydWU7 CisgICAgfQorICB9Cit9OworCittb2R1bGUuZXhwb3J0cyA9IFNlbGVjdEV2ZW50UGx1Z2luOwpc IE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRp Yy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9TaW1wbGVFdmVudFBsdWdpbi5qcyBiL3dlYi9wZ2FkbWlu L3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9TaW1wbGVFdmVudFBsdWdpbi5qcwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uNjAwYmVlZDcKLS0tIC9kZXYvbnVsbAorKysg Yi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvU2ltcGxlRXZlbnRQbHVn aW4uanMKQEAgLTAsMCArMSwyMjcgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwg RmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3Vy Y2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4g dGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNl IHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZv dW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAor ICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9y ZWFjdFByb2RJbnZhcmlhbnQnKTsKKwordmFyIEV2ZW50TGlzdGVuZXIgPSByZXF1aXJlKCdmYmpz L2xpYi9FdmVudExpc3RlbmVyJyk7Cit2YXIgRXZlbnRQcm9wYWdhdG9ycyA9IHJlcXVpcmUoJy4v RXZlbnRQcm9wYWdhdG9ycycpOwordmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUo Jy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7Cit2YXIgU3ludGhldGljQW5pbWF0aW9uRXZlbnQg PSByZXF1aXJlKCcuL1N5bnRoZXRpY0FuaW1hdGlvbkV2ZW50Jyk7Cit2YXIgU3ludGhldGljQ2xp cGJvYXJkRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0NsaXBib2FyZEV2ZW50Jyk7Cit2YXIg U3ludGhldGljRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0V2ZW50Jyk7Cit2YXIgU3ludGhl dGljRm9jdXNFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljRm9jdXNFdmVudCcpOwordmFyIFN5 bnRoZXRpY0tleWJvYXJkRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0tleWJvYXJkRXZlbnQn KTsKK3ZhciBTeW50aGV0aWNNb3VzZUV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNNb3VzZUV2 ZW50Jyk7Cit2YXIgU3ludGhldGljRHJhZ0V2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNEcmFn RXZlbnQnKTsKK3ZhciBTeW50aGV0aWNUb3VjaEV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNU b3VjaEV2ZW50Jyk7Cit2YXIgU3ludGhldGljVHJhbnNpdGlvbkV2ZW50ID0gcmVxdWlyZSgnLi9T eW50aGV0aWNUcmFuc2l0aW9uRXZlbnQnKTsKK3ZhciBTeW50aGV0aWNVSUV2ZW50ID0gcmVxdWly ZSgnLi9TeW50aGV0aWNVSUV2ZW50Jyk7Cit2YXIgU3ludGhldGljV2hlZWxFdmVudCA9IHJlcXVp cmUoJy4vU3ludGhldGljV2hlZWxFdmVudCcpOworCit2YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVp cmUoJ2ZianMvbGliL2VtcHR5RnVuY3Rpb24nKTsKK3ZhciBnZXRFdmVudENoYXJDb2RlID0gcmVx dWlyZSgnLi9nZXRFdmVudENoYXJDb2RlJyk7Cit2YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJq cy9saWIvaW52YXJpYW50Jyk7CisKKy8qKgorICogVHVybnMKKyAqIFsnYWJvcnQnLCAuLi5dCisg KiBpbnRvCisgKiBldmVudFR5cGVzID0geworICogICAnYWJvcnQnOiB7CisgKiAgICAgcGhhc2Vk UmVnaXN0cmF0aW9uTmFtZXM6IHsKKyAqICAgICAgIGJ1YmJsZWQ6ICdvbkFib3J0JywKKyAqICAg ICAgIGNhcHR1cmVkOiAnb25BYm9ydENhcHR1cmUnLAorICogICAgIH0sCisgKiAgICAgZGVwZW5k ZW5jaWVzOiBbJ3RvcEFib3J0J10sCisgKiAgIH0sCisgKiAgIC4uLgorICogfTsKKyAqIHRvcExl dmVsRXZlbnRzVG9EaXNwYXRjaENvbmZpZyA9IHsKKyAqICAgJ3RvcEFib3J0JzogeyBzYW1lQ29u ZmlnIH0KKyAqIH07CisgKi8KK3ZhciBldmVudFR5cGVzID0ge307Cit2YXIgdG9wTGV2ZWxFdmVu dHNUb0Rpc3BhdGNoQ29uZmlnID0ge307CitbJ2Fib3J0JywgJ2FuaW1hdGlvbkVuZCcsICdhbmlt YXRpb25JdGVyYXRpb24nLCAnYW5pbWF0aW9uU3RhcnQnLCAnYmx1cicsICdjYW5QbGF5JywgJ2Nh blBsYXlUaHJvdWdoJywgJ2NsaWNrJywgJ2NvbnRleHRNZW51JywgJ2NvcHknLCAnY3V0JywgJ2Rv dWJsZUNsaWNrJywgJ2RyYWcnLCAnZHJhZ0VuZCcsICdkcmFnRW50ZXInLCAnZHJhZ0V4aXQnLCAn ZHJhZ0xlYXZlJywgJ2RyYWdPdmVyJywgJ2RyYWdTdGFydCcsICdkcm9wJywgJ2R1cmF0aW9uQ2hh bmdlJywgJ2VtcHRpZWQnLCAnZW5jcnlwdGVkJywgJ2VuZGVkJywgJ2Vycm9yJywgJ2ZvY3VzJywg J2lucHV0JywgJ2ludmFsaWQnLCAna2V5RG93bicsICdrZXlQcmVzcycsICdrZXlVcCcsICdsb2Fk JywgJ2xvYWRlZERhdGEnLCAnbG9hZGVkTWV0YWRhdGEnLCAnbG9hZFN0YXJ0JywgJ21vdXNlRG93 bicsICdtb3VzZU1vdmUnLCAnbW91c2VPdXQnLCAnbW91c2VPdmVyJywgJ21vdXNlVXAnLCAncGFz dGUnLCAncGF1c2UnLCAncGxheScsICdwbGF5aW5nJywgJ3Byb2dyZXNzJywgJ3JhdGVDaGFuZ2Un LCAncmVzZXQnLCAnc2Nyb2xsJywgJ3NlZWtlZCcsICdzZWVraW5nJywgJ3N0YWxsZWQnLCAnc3Vi bWl0JywgJ3N1c3BlbmQnLCAndGltZVVwZGF0ZScsICd0b3VjaENhbmNlbCcsICd0b3VjaEVuZCcs ICd0b3VjaE1vdmUnLCAndG91Y2hTdGFydCcsICd0cmFuc2l0aW9uRW5kJywgJ3ZvbHVtZUNoYW5n ZScsICd3YWl0aW5nJywgJ3doZWVsJ10uZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHsKKyAgdmFy IGNhcGl0YWxpemVkRXZlbnQgPSBldmVudFswXS50b1VwcGVyQ2FzZSgpICsgZXZlbnQuc2xpY2Uo MSk7CisgIHZhciBvbkV2ZW50ID0gJ29uJyArIGNhcGl0YWxpemVkRXZlbnQ7CisgIHZhciB0b3BF dmVudCA9ICd0b3AnICsgY2FwaXRhbGl6ZWRFdmVudDsKKworICB2YXIgdHlwZSA9IHsKKyAgICBw aGFzZWRSZWdpc3RyYXRpb25OYW1lczogeworICAgICAgYnViYmxlZDogb25FdmVudCwKKyAgICAg IGNhcHR1cmVkOiBvbkV2ZW50ICsgJ0NhcHR1cmUnCisgICAgfSwKKyAgICBkZXBlbmRlbmNpZXM6 IFt0b3BFdmVudF0KKyAgfTsKKyAgZXZlbnRUeXBlc1tldmVudF0gPSB0eXBlOworICB0b3BMZXZl bEV2ZW50c1RvRGlzcGF0Y2hDb25maWdbdG9wRXZlbnRdID0gdHlwZTsKK30pOworCit2YXIgb25D bGlja0xpc3RlbmVycyA9IHt9OworCitmdW5jdGlvbiBnZXREaWN0aW9uYXJ5S2V5KGluc3QpIHsK KyAgLy8gUHJldmVudHMgVjggcGVyZm9ybWFuY2UgaXNzdWU6CisgIC8vIGh0dHBzOi8vZ2l0aHVi LmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzcyMzIKKyAgcmV0dXJuICcuJyArIGluc3QuX3Jvb3RO b2RlSUQ7Cit9CisKK2Z1bmN0aW9uIGlzSW50ZXJhY3RpdmUodGFnKSB7CisgIHJldHVybiB0YWcg PT09ICdidXR0b24nIHx8IHRhZyA9PT0gJ2lucHV0JyB8fCB0YWcgPT09ICdzZWxlY3QnIHx8IHRh ZyA9PT0gJ3RleHRhcmVhJzsKK30KKwordmFyIFNpbXBsZUV2ZW50UGx1Z2luID0geworCisgIGV2 ZW50VHlwZXM6IGV2ZW50VHlwZXMsCisKKyAgZXh0cmFjdEV2ZW50czogZnVuY3Rpb24gKHRvcExl dmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7Cisg ICAgdmFyIGRpc3BhdGNoQ29uZmlnID0gdG9wTGV2ZWxFdmVudHNUb0Rpc3BhdGNoQ29uZmlnW3Rv cExldmVsVHlwZV07CisgICAgaWYgKCFkaXNwYXRjaENvbmZpZykgeworICAgICAgcmV0dXJuIG51 bGw7CisgICAgfQorICAgIHZhciBFdmVudENvbnN0cnVjdG9yOworICAgIHN3aXRjaCAodG9wTGV2 ZWxUeXBlKSB7CisgICAgICBjYXNlICd0b3BBYm9ydCc6CisgICAgICBjYXNlICd0b3BDYW5QbGF5 JzoKKyAgICAgIGNhc2UgJ3RvcENhblBsYXlUaHJvdWdoJzoKKyAgICAgIGNhc2UgJ3RvcER1cmF0 aW9uQ2hhbmdlJzoKKyAgICAgIGNhc2UgJ3RvcEVtcHRpZWQnOgorICAgICAgY2FzZSAndG9wRW5j cnlwdGVkJzoKKyAgICAgIGNhc2UgJ3RvcEVuZGVkJzoKKyAgICAgIGNhc2UgJ3RvcEVycm9yJzoK KyAgICAgIGNhc2UgJ3RvcElucHV0JzoKKyAgICAgIGNhc2UgJ3RvcEludmFsaWQnOgorICAgICAg Y2FzZSAndG9wTG9hZCc6CisgICAgICBjYXNlICd0b3BMb2FkZWREYXRhJzoKKyAgICAgIGNhc2Ug J3RvcExvYWRlZE1ldGFkYXRhJzoKKyAgICAgIGNhc2UgJ3RvcExvYWRTdGFydCc6CisgICAgICBj YXNlICd0b3BQYXVzZSc6CisgICAgICBjYXNlICd0b3BQbGF5JzoKKyAgICAgIGNhc2UgJ3RvcFBs YXlpbmcnOgorICAgICAgY2FzZSAndG9wUHJvZ3Jlc3MnOgorICAgICAgY2FzZSAndG9wUmF0ZUNo YW5nZSc6CisgICAgICBjYXNlICd0b3BSZXNldCc6CisgICAgICBjYXNlICd0b3BTZWVrZWQnOgor ICAgICAgY2FzZSAndG9wU2Vla2luZyc6CisgICAgICBjYXNlICd0b3BTdGFsbGVkJzoKKyAgICAg IGNhc2UgJ3RvcFN1Ym1pdCc6CisgICAgICBjYXNlICd0b3BTdXNwZW5kJzoKKyAgICAgIGNhc2Ug J3RvcFRpbWVVcGRhdGUnOgorICAgICAgY2FzZSAndG9wVm9sdW1lQ2hhbmdlJzoKKyAgICAgIGNh c2UgJ3RvcFdhaXRpbmcnOgorICAgICAgICAvLyBIVE1MIEV2ZW50cworICAgICAgICAvLyBAc2Vl IGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L2luZGV4Lmh0bWwjZXZlbnRzLTAKKyAgICAgICAg RXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY0V2ZW50OworICAgICAgICBicmVhazsKKyAgICAg IGNhc2UgJ3RvcEtleVByZXNzJzoKKyAgICAgICAgLy8gRmlyZWZveCBjcmVhdGVzIGEga2V5cHJl c3MgZXZlbnQgZm9yIGZ1bmN0aW9uIGtleXMgdG9vLiBUaGlzIHJlbW92ZXMKKyAgICAgICAgLy8g dGhlIHVud2FudGVkIGtleXByZXNzIGV2ZW50cy4gRW50ZXIgaXMgaG93ZXZlciBib3RoIHByaW50 YWJsZSBhbmQKKyAgICAgICAgLy8gbm9uLXByaW50YWJsZS4gT25lIHdvdWxkIGV4cGVjdCBUYWIg dG8gYmUgYXMgd2VsbCAoYnV0IGl0IGlzbid0KS4KKyAgICAgICAgaWYgKGdldEV2ZW50Q2hhckNv ZGUobmF0aXZlRXZlbnQpID09PSAwKSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAg IH0KKyAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi8KKyAgICAgIGNhc2UgJ3RvcEtleURvd24nOgor ICAgICAgY2FzZSAndG9wS2V5VXAnOgorICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhl dGljS2V5Ym9hcmRFdmVudDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICd0b3BCbHVyJzoK KyAgICAgIGNhc2UgJ3RvcEZvY3VzJzoKKyAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRo ZXRpY0ZvY3VzRXZlbnQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAndG9wQ2xpY2snOgor ICAgICAgICAvLyBGaXJlZm94IGNyZWF0ZXMgYSBjbGljayBldmVudCBvbiByaWdodCBtb3VzZSBj bGlja3MuIFRoaXMgcmVtb3ZlcyB0aGUKKyAgICAgICAgLy8gdW53YW50ZWQgY2xpY2sgZXZlbnRz LgorICAgICAgICBpZiAobmF0aXZlRXZlbnQuYnV0dG9uID09PSAyKSB7CisgICAgICAgICAgcmV0 dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi8KKyAgICAgIGNh c2UgJ3RvcERvdWJsZUNsaWNrJzoKKyAgICAgIGNhc2UgJ3RvcE1vdXNlRG93bic6CisgICAgICBj YXNlICd0b3BNb3VzZU1vdmUnOgorICAgICAgY2FzZSAndG9wTW91c2VVcCc6CisgICAgICAvLyBU T0RPOiBEaXNhYmxlZCBlbGVtZW50cyBzaG91bGQgbm90IHJlc3BvbmQgdG8gbW91c2UgZXZlbnRz CisgICAgICAvKiBmYWxscyB0aHJvdWdoICovCisgICAgICBjYXNlICd0b3BNb3VzZU91dCc6Cisg ICAgICBjYXNlICd0b3BNb3VzZU92ZXInOgorICAgICAgY2FzZSAndG9wQ29udGV4dE1lbnUnOgor ICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljTW91c2VFdmVudDsKKyAgICAgICAg YnJlYWs7CisgICAgICBjYXNlICd0b3BEcmFnJzoKKyAgICAgIGNhc2UgJ3RvcERyYWdFbmQnOgor ICAgICAgY2FzZSAndG9wRHJhZ0VudGVyJzoKKyAgICAgIGNhc2UgJ3RvcERyYWdFeGl0JzoKKyAg ICAgIGNhc2UgJ3RvcERyYWdMZWF2ZSc6CisgICAgICBjYXNlICd0b3BEcmFnT3Zlcic6CisgICAg ICBjYXNlICd0b3BEcmFnU3RhcnQnOgorICAgICAgY2FzZSAndG9wRHJvcCc6CisgICAgICAgIEV2 ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNEcmFnRXZlbnQ7CisgICAgICAgIGJyZWFrOworICAg ICAgY2FzZSAndG9wVG91Y2hDYW5jZWwnOgorICAgICAgY2FzZSAndG9wVG91Y2hFbmQnOgorICAg ICAgY2FzZSAndG9wVG91Y2hNb3ZlJzoKKyAgICAgIGNhc2UgJ3RvcFRvdWNoU3RhcnQnOgorICAg ICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljVG91Y2hFdmVudDsKKyAgICAgICAgYnJl YWs7CisgICAgICBjYXNlICd0b3BBbmltYXRpb25FbmQnOgorICAgICAgY2FzZSAndG9wQW5pbWF0 aW9uSXRlcmF0aW9uJzoKKyAgICAgIGNhc2UgJ3RvcEFuaW1hdGlvblN0YXJ0JzoKKyAgICAgICAg RXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50OworICAgICAgICBicmVh azsKKyAgICAgIGNhc2UgJ3RvcFRyYW5zaXRpb25FbmQnOgorICAgICAgICBFdmVudENvbnN0cnVj dG9yID0gU3ludGhldGljVHJhbnNpdGlvbkV2ZW50OworICAgICAgICBicmVhazsKKyAgICAgIGNh c2UgJ3RvcFNjcm9sbCc6CisgICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNVSUV2 ZW50OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3RvcFdoZWVsJzoKKyAgICAgICAgRXZl bnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY1doZWVsRXZlbnQ7CisgICAgICAgIGJyZWFrOworICAg ICAgY2FzZSAndG9wQ29weSc6CisgICAgICBjYXNlICd0b3BDdXQnOgorICAgICAgY2FzZSAndG9w UGFzdGUnOgorICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljQ2xpcGJvYXJkRXZl bnQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAhRXZlbnRDb25zdHJ1Y3RvciA/IHByb2Nl c3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdTaW1w bGVFdmVudFBsdWdpbjogVW5oYW5kbGVkIGV2ZW50IHR5cGUsIGAlc2AuJywgdG9wTGV2ZWxUeXBl KSA6IF9wcm9kSW52YXJpYW50KCc4NicsIHRvcExldmVsVHlwZSkgOiB2b2lkIDA7CisgICAgdmFy IGV2ZW50ID0gRXZlbnRDb25zdHJ1Y3Rvci5nZXRQb29sZWQoZGlzcGF0Y2hDb25maWcsIHRhcmdl dEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7CisgICAgRXZlbnRQcm9wYWdh dG9ycy5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGV2ZW50KTsKKyAgICByZXR1cm4gZXZl bnQ7CisgIH0sCisKKyAgZGlkUHV0TGlzdGVuZXI6IGZ1bmN0aW9uIChpbnN0LCByZWdpc3RyYXRp b25OYW1lLCBsaXN0ZW5lcikgeworICAgIC8vIE1vYmlsZSBTYWZhcmkgZG9lcyBub3QgZmlyZSBw cm9wZXJseSBidWJibGUgY2xpY2sgZXZlbnRzIG9uCisgICAgLy8gbm9uLWludGVyYWN0aXZlIGVs ZW1lbnRzLCB3aGljaCBtZWFucyBkZWxlZ2F0ZWQgY2xpY2sgbGlzdGVuZXJzIGRvIG5vdAorICAg IC8vIGZpcmUuIFRoZSB3b3JrYXJvdW5kIGZvciB0aGlzIGJ1ZyBpbnZvbHZlcyBhdHRhY2hpbmcg YW4gZW1wdHkgY2xpY2sKKyAgICAvLyBsaXN0ZW5lciBvbiB0aGUgdGFyZ2V0IG5vZGUuCisgICAg Ly8gaHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTAvMDkvY2xpY2tf ZXZlbnRfZGVsLmh0bWwKKyAgICBpZiAocmVnaXN0cmF0aW9uTmFtZSA9PT0gJ29uQ2xpY2snICYm ICFpc0ludGVyYWN0aXZlKGluc3QuX3RhZykpIHsKKyAgICAgIHZhciBrZXkgPSBnZXREaWN0aW9u YXJ5S2V5KGluc3QpOworICAgICAgdmFyIG5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0 Tm9kZUZyb21JbnN0YW5jZShpbnN0KTsKKyAgICAgIGlmICghb25DbGlja0xpc3RlbmVyc1trZXld KSB7CisgICAgICAgIG9uQ2xpY2tMaXN0ZW5lcnNba2V5XSA9IEV2ZW50TGlzdGVuZXIubGlzdGVu KG5vZGUsICdjbGljaycsIGVtcHR5RnVuY3Rpb24pOworICAgICAgfQorICAgIH0KKyAgfSwKKwor ICB3aWxsRGVsZXRlTGlzdGVuZXI6IGZ1bmN0aW9uIChpbnN0LCByZWdpc3RyYXRpb25OYW1lKSB7 CisgICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWUgPT09ICdvbkNsaWNrJyAmJiAhaXNJbnRlcmFjdGl2 ZShpbnN0Ll90YWcpKSB7CisgICAgICB2YXIga2V5ID0gZ2V0RGljdGlvbmFyeUtleShpbnN0KTsK KyAgICAgIG9uQ2xpY2tMaXN0ZW5lcnNba2V5XS5yZW1vdmUoKTsKKyAgICAgIGRlbGV0ZSBvbkNs aWNrTGlzdGVuZXJzW2tleV07CisgICAgfQorICB9CisKK307CisKK21vZHVsZS5leHBvcnRzID0g U2ltcGxlRXZlbnRQbHVnaW47ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0 IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1N5bnRoZXRpY0FuaW1h dGlvbkV2ZW50LmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1N5 bnRoZXRpY0FuaW1hdGlvbkV2ZW50LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAwLi5lYjhkNDEwMgotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5k b3IvcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNBbmltYXRpb25FdmVudC5qcwpAQCAtMCwwICsxLDM4 IEBACisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBB bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQg dW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxl IGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFs IGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBm aWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2 YXIgU3ludGhldGljRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0V2ZW50Jyk7CisKKy8qKgor ICogQGludGVyZmFjZSBFdmVudAorICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWFu aW1hdGlvbnMvI0FuaW1hdGlvbkV2ZW50LWludGVyZmFjZQorICogQHNlZSBodHRwczovL2RldmVs b3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQW5pbWF0aW9uRXZlbnQKKyAqLwor dmFyIEFuaW1hdGlvbkV2ZW50SW50ZXJmYWNlID0geworICBhbmltYXRpb25OYW1lOiBudWxsLAor ICBlbGFwc2VkVGltZTogbnVsbCwKKyAgcHNldWRvRWxlbWVudDogbnVsbAorfTsKKworLyoqCisg KiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRp c3BhdGNoIHRoaXMgZXZlbnQuCisgKiBAcGFyYW0ge3N0cmluZ30gZGlzcGF0Y2hNYXJrZXIgTWFy a2VyIGlkZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuCisgKiBAcGFyYW0ge29iamVjdH0gbmF0 aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuCisgKiBAZXh0ZW5kcyB7U3ludGhldGljRXZl bnR9CisgKi8KK2Z1bmN0aW9uIFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50KGRpc3BhdGNoQ29uZmln LCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7CisgIHJl dHVybiBTeW50aGV0aWNFdmVudC5jYWxsKHRoaXMsIGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1h cmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTsKK30KKworU3ludGhldGljRXZl bnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50LCBBbmltYXRpb25FdmVudElu dGVyZmFjZSk7CisKK21vZHVsZS5leHBvcnRzID0gU3ludGhldGljQW5pbWF0aW9uRXZlbnQ7Clwg Tm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGlj L3ZlbmRvci9yZWFjdC1kb20vbGliL1N5bnRoZXRpY0NsaXBib2FyZEV2ZW50LmpzIGIvd2ViL3Bn YWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1N5bnRoZXRpY0NsaXBib2FyZEV2ZW50 LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi43NTM3NTQ1YgotLS0gL2Rl di9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9TeW50 aGV0aWNDbGlwYm9hcmRFdmVudC5qcwpAQCAtMCwwICsxLDM3IEBACisvKioKKyAqIENvcHlyaWdo dCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgor ICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBs aWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9y eSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQg cmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVj dG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgU3ludGhldGljRXZlbnQgPSBy ZXF1aXJlKCcuL1N5bnRoZXRpY0V2ZW50Jyk7CisKKy8qKgorICogQGludGVyZmFjZSBFdmVudAor ICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9jbGlwYm9hcmQtYXBpcy8KKyAqLwordmFyIENs aXBib2FyZEV2ZW50SW50ZXJmYWNlID0geworICBjbGlwYm9hcmREYXRhOiBmdW5jdGlvbiAoZXZl bnQpIHsKKyAgICByZXR1cm4gJ2NsaXBib2FyZERhdGEnIGluIGV2ZW50ID8gZXZlbnQuY2xpcGJv YXJkRGF0YSA6IHdpbmRvdy5jbGlwYm9hcmREYXRhOworICB9Cit9OworCisvKioKKyAqIEBwYXJh bSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2gg dGhpcyBldmVudC4KKyAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJrZXIgaWRl bnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC4KKyAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVu dCBOYXRpdmUgYnJvd3NlciBldmVudC4KKyAqIEBleHRlbmRzIHtTeW50aGV0aWNVSUV2ZW50fQor ICovCitmdW5jdGlvbiBTeW50aGV0aWNDbGlwYm9hcmRFdmVudChkaXNwYXRjaENvbmZpZywgZGlz cGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkgeworICByZXR1cm4g U3ludGhldGljRXZlbnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIs IG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7Cit9CisKK1N5bnRoZXRpY0V2ZW50LmF1 Z21lbnRDbGFzcyhTeW50aGV0aWNDbGlwYm9hcmRFdmVudCwgQ2xpcGJvYXJkRXZlbnRJbnRlcmZh Y2UpOworCittb2R1bGUuZXhwb3J0cyA9IFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50OwpcIE5vIG5l d2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5k b3IvcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50LmpzIGIvd2ViL3BnYWRt aW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1N5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQu anMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjk2Y2MzZDM2Ci0tLSAvZGV2 L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1N5bnRo ZXRpY0NvbXBvc2l0aW9uRXZlbnQuanMKQEAgLTAsMCArMSwzNSBAQAorLyoqCisgKiBDb3B5cmln aHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4K KyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUg bGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rv cnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50 IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJl Y3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFN5bnRoZXRpY0V2ZW50ID0g cmVxdWlyZSgnLi9TeW50aGV0aWNFdmVudCcpOworCisvKioKKyAqIEBpbnRlcmZhY2UgRXZlbnQK KyAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMt Y29tcG9zaXRpb25ldmVudHMKKyAqLwordmFyIENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UgPSB7 CisgIGRhdGE6IG51bGwKK307CisKKy8qKgorICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29u ZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LgorICogQHBhcmFt IHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFy Z2V0LgorICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50 LgorICogQGV4dGVuZHMge1N5bnRoZXRpY1VJRXZlbnR9CisgKi8KK2Z1bmN0aW9uIFN5bnRoZXRp Y0NvbXBvc2l0aW9uRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVF dmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHsKKyAgcmV0dXJuIFN5bnRoZXRpY0V2ZW50LmNhbGwo dGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZl RXZlbnRUYXJnZXQpOworfQorCitTeW50aGV0aWNFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGlj Q29tcG9zaXRpb25FdmVudCwgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZSk7CisKK21vZHVsZS5l eHBvcnRzID0gU3ludGhldGljQ29tcG9zaXRpb25FdmVudDsKXCBObyBuZXdsaW5lIGF0IGVuZCBv ZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9s aWIvU3ludGhldGljRHJhZ0V2ZW50LmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFj dC1kb20vbGliL1N5bnRoZXRpY0RyYWdFdmVudC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMC4uN2I1ZTk4ODIKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0 aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvU3ludGhldGljRHJhZ0V2ZW50LmpzCkBAIC0wLDAgKzEs MzUgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAq IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNl ZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZp bGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9u YWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRT IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisK K3ZhciBTeW50aGV0aWNNb3VzZUV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNNb3VzZUV2ZW50 Jyk7CisKKy8qKgorICogQGludGVyZmFjZSBEcmFnRXZlbnQKKyAqIEBzZWUgaHR0cDovL3d3dy53 My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLworICovCit2YXIgRHJhZ0V2ZW50SW50ZXJmYWNl ID0geworICBkYXRhVHJhbnNmZXI6IG51bGwKK307CisKKy8qKgorICogQHBhcmFtIHtvYmplY3R9 IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50 LgorICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0 aGUgZXZlbnQgdGFyZ2V0LgorICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBi cm93c2VyIGV2ZW50LgorICogQGV4dGVuZHMge1N5bnRoZXRpY1VJRXZlbnR9CisgKi8KK2Z1bmN0 aW9uIFN5bnRoZXRpY0RyYWdFdmVudChkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5h dGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkgeworICByZXR1cm4gU3ludGhldGljTW91c2VF dmVudC5jYWxsKHRoaXMsIGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZl bnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTsKK30KKworU3ludGhldGljTW91c2VFdmVudC5hdWdtZW50 Q2xhc3MoU3ludGhldGljRHJhZ0V2ZW50LCBEcmFnRXZlbnRJbnRlcmZhY2UpOworCittb2R1bGUu ZXhwb3J0cyA9IFN5bnRoZXRpY0RyYWdFdmVudDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxl CmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvU3lu dGhldGljRXZlbnQuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIv U3ludGhldGljRXZlbnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjZi NzQ1Y2NjCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFj dC1kb20vbGliL1N5bnRoZXRpY0V2ZW50LmpzCkBAIC0wLDAgKzEsMjY3IEBACisvKioKKyAqIENv cHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2Vy dmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1z dHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRp cmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBw YXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1l IGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX2Fzc2lnbiA9IHJl cXVpcmUoJ29iamVjdC1hc3NpZ24nKTsKKwordmFyIFBvb2xlZENsYXNzID0gcmVxdWlyZSgnLi9Q b29sZWRDbGFzcycpOworCit2YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJ2ZianMvbGliL2Vt cHR5RnVuY3Rpb24nKTsKK3ZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycp OworCit2YXIgZGlkV2FybkZvckFkZGVkTmV3UHJvcGVydHkgPSBmYWxzZTsKK3ZhciBpc1Byb3h5 U3VwcG9ydGVkID0gdHlwZW9mIFByb3h5ID09PSAnZnVuY3Rpb24nOworCit2YXIgc2hvdWxkQmVS ZWxlYXNlZFByb3BlcnRpZXMgPSBbJ2Rpc3BhdGNoQ29uZmlnJywgJ190YXJnZXRJbnN0JywgJ25h dGl2ZUV2ZW50JywgJ2lzRGVmYXVsdFByZXZlbnRlZCcsICdpc1Byb3BhZ2F0aW9uU3RvcHBlZCcs ICdfZGlzcGF0Y2hMaXN0ZW5lcnMnLCAnX2Rpc3BhdGNoSW5zdGFuY2VzJ107CisKKy8qKgorICog QGludGVyZmFjZSBFdmVudAorICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwt My1FdmVudHMvCisgKi8KK3ZhciBFdmVudEludGVyZmFjZSA9IHsKKyAgdHlwZTogbnVsbCwKKyAg dGFyZ2V0OiBudWxsLAorICAvLyBjdXJyZW50VGFyZ2V0IGlzIHNldCB3aGVuIGRpc3BhdGNoaW5n OyBubyB1c2UgaW4gY29weWluZyBpdCBoZXJlCisgIGN1cnJlbnRUYXJnZXQ6IGVtcHR5RnVuY3Rp b24udGhhdFJldHVybnNOdWxsLAorICBldmVudFBoYXNlOiBudWxsLAorICBidWJibGVzOiBudWxs LAorICBjYW5jZWxhYmxlOiBudWxsLAorICB0aW1lU3RhbXA6IGZ1bmN0aW9uIChldmVudCkgewor ICAgIHJldHVybiBldmVudC50aW1lU3RhbXAgfHwgRGF0ZS5ub3coKTsKKyAgfSwKKyAgZGVmYXVs dFByZXZlbnRlZDogbnVsbCwKKyAgaXNUcnVzdGVkOiBudWxsCit9OworCisvKioKKyAqIFN5bnRo ZXRpYyBldmVudHMgYXJlIGRpc3BhdGNoZWQgYnkgZXZlbnQgcGx1Z2lucywgdHlwaWNhbGx5IGlu IHJlc3BvbnNlIHRvIGEKKyAqIHRvcC1sZXZlbCBldmVudCBkZWxlZ2F0aW9uIGhhbmRsZXIuCisg KgorICogVGhlc2Ugc3lzdGVtcyBzaG91bGQgZ2VuZXJhbGx5IHVzZSBwb29saW5nIHRvIHJlZHVj ZSB0aGUgZnJlcXVlbmN5IG9mIGdhcmJhZ2UKKyAqIGNvbGxlY3Rpb24uIFRoZSBzeXN0ZW0gc2hv dWxkIGNoZWNrIGBpc1BlcnNpc3RlbnRgIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZQorICogZXZl bnQgc2hvdWxkIGJlIHJlbGVhc2VkIGludG8gdGhlIHBvb2wgYWZ0ZXIgYmVpbmcgZGlzcGF0Y2hl ZC4gVXNlcnMgdGhhdAorICogbmVlZCBhIHBlcnNpc3RlZCBldmVudCBzaG91bGQgaW52b2tlIGBw ZXJzaXN0YC4KKyAqCisgKiBTeW50aGV0aWMgZXZlbnRzIChhbmQgc3ViY2xhc3NlcykgaW1wbGVt ZW50IHRoZSBET00gTGV2ZWwgMyBFdmVudHMgQVBJIGJ5CisgKiBub3JtYWxpemluZyBicm93c2Vy IHF1aXJrcy4gU3ViY2xhc3NlcyBkbyBub3QgbmVjZXNzYXJpbHkgaGF2ZSB0byBpbXBsZW1lbnQg YQorICogRE9NIGludGVyZmFjZTsgY3VzdG9tIGFwcGxpY2F0aW9uLXNwZWNpZmljIGV2ZW50cyBj YW4gYWxzbyBzdWJjbGFzcyB0aGlzLgorICoKKyAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENv bmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC4KKyAqIEBwYXJh bSB7Kn0gdGFyZ2V0SW5zdCBNYXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC4KKyAq IEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC4KKyAqIEBw YXJhbSB7RE9NRXZlbnRUYXJnZXR9IG5hdGl2ZUV2ZW50VGFyZ2V0IFRhcmdldCBub2RlLgorICov CitmdW5jdGlvbiBTeW50aGV0aWNFdmVudChkaXNwYXRjaENvbmZpZywgdGFyZ2V0SW5zdCwgbmF0 aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7CisgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VO ViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgLy8gdGhlc2UgaGF2ZSBhIGdldHRlci9zZXR0ZXIg Zm9yIHdhcm5pbmdzCisgICAgZGVsZXRlIHRoaXMubmF0aXZlRXZlbnQ7CisgICAgZGVsZXRlIHRo aXMucHJldmVudERlZmF1bHQ7CisgICAgZGVsZXRlIHRoaXMuc3RvcFByb3BhZ2F0aW9uOworICB9 CisKKyAgdGhpcy5kaXNwYXRjaENvbmZpZyA9IGRpc3BhdGNoQ29uZmlnOworICB0aGlzLl90YXJn ZXRJbnN0ID0gdGFyZ2V0SW5zdDsKKyAgdGhpcy5uYXRpdmVFdmVudCA9IG5hdGl2ZUV2ZW50Owor CisgIHZhciBJbnRlcmZhY2UgPSB0aGlzLmNvbnN0cnVjdG9yLkludGVyZmFjZTsKKyAgZm9yICh2 YXIgcHJvcE5hbWUgaW4gSW50ZXJmYWNlKSB7CisgICAgaWYgKCFJbnRlcmZhY2UuaGFzT3duUHJv cGVydHkocHJvcE5hbWUpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHByb2Nl c3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIGRlbGV0ZSB0aGlzW3By b3BOYW1lXTsgLy8gdGhpcyBoYXMgYSBnZXR0ZXIvc2V0dGVyIGZvciB3YXJuaW5ncworICAgIH0K KyAgICB2YXIgbm9ybWFsaXplID0gSW50ZXJmYWNlW3Byb3BOYW1lXTsKKyAgICBpZiAobm9ybWFs aXplKSB7CisgICAgICB0aGlzW3Byb3BOYW1lXSA9IG5vcm1hbGl6ZShuYXRpdmVFdmVudCk7Cisg ICAgfSBlbHNlIHsKKyAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ3RhcmdldCcpIHsKKyAgICAgICAg dGhpcy50YXJnZXQgPSBuYXRpdmVFdmVudFRhcmdldDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAg IHRoaXNbcHJvcE5hbWVdID0gbmF0aXZlRXZlbnRbcHJvcE5hbWVdOworICAgICAgfQorICAgIH0K KyAgfQorCisgIHZhciBkZWZhdWx0UHJldmVudGVkID0gbmF0aXZlRXZlbnQuZGVmYXVsdFByZXZl bnRlZCAhPSBudWxsID8gbmF0aXZlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCA6IG5hdGl2ZUV2ZW50 LnJldHVyblZhbHVlID09PSBmYWxzZTsKKyAgaWYgKGRlZmF1bHRQcmV2ZW50ZWQpIHsKKyAgICB0 aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNUcnVlOwor ICB9IGVsc2UgeworICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZW1wdHlGdW5jdGlvbi50 aGF0UmV0dXJuc0ZhbHNlOworICB9CisgIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBlbXB0 eUZ1bmN0aW9uLnRoYXRSZXR1cm5zRmFsc2U7CisgIHJldHVybiB0aGlzOworfQorCitfYXNzaWdu KFN5bnRoZXRpY0V2ZW50LnByb3RvdHlwZSwgeworCisgIHByZXZlbnREZWZhdWx0OiBmdW5jdGlv biAoKSB7CisgICAgdGhpcy5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTsKKyAgICB2YXIgZXZlbnQg PSB0aGlzLm5hdGl2ZUV2ZW50OworICAgIGlmICghZXZlbnQpIHsKKyAgICAgIHJldHVybjsKKyAg ICB9CisKKyAgICBpZiAoZXZlbnQucHJldmVudERlZmF1bHQpIHsKKyAgICAgIGV2ZW50LnByZXZl bnREZWZhdWx0KCk7CisgICAgfSBlbHNlIGlmICh0eXBlb2YgZXZlbnQucmV0dXJuVmFsdWUgIT09 ICd1bmtub3duJykgeworICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSB2YWxpZC10eXBlb2YK KyAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7CisgICAgfQorICAgIHRoaXMuaXNEZWZh dWx0UHJldmVudGVkID0gZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc1RydWU7CisgIH0sCisKKyAg c3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbiAoKSB7CisgICAgdmFyIGV2ZW50ID0gdGhpcy5uYXRp dmVFdmVudDsKKyAgICBpZiAoIWV2ZW50KSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAg aWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikgeworICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9u KCk7CisgICAgfSBlbHNlIGlmICh0eXBlb2YgZXZlbnQuY2FuY2VsQnViYmxlICE9PSAndW5rbm93 bicpIHsKKyAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgdmFsaWQtdHlwZW9mCisgICAgICAv LyBUaGUgQ2hhbmdlRXZlbnRQbHVnaW4gcmVnaXN0ZXJzIGEgInByb3BlcnR5Y2hhbmdlIiBldmVu dCBmb3IKKyAgICAgIC8vIElFLiBUaGlzIGV2ZW50IGRvZXMgbm90IHN1cHBvcnQgYnViYmxpbmcg b3IgY2FuY2VsbGluZywgYW5kCisgICAgICAvLyBhbnkgcmVmZXJlbmNlcyB0byBjYW5jZWxCdWJi bGUgdGhyb3cgIk1lbWJlciBub3QgZm91bmQiLiAgQQorICAgICAgLy8gdHlwZW9mIGNoZWNrIG9m ICJ1bmtub3duIiBjaXJjdW12ZW50cyB0aGlzIGlzc3VlIChhbmQgaXMgYWxzbworICAgICAgLy8g SUUgc3BlY2lmaWMpLgorICAgICAgZXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTsKKyAgICB9CisK KyAgICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJu c1RydWU7CisgIH0sCisKKyAgLyoqCisgICAqIFdlIHJlbGVhc2UgYWxsIGRpc3BhdGNoZWQgYFN5 bnRoZXRpY0V2ZW50YHMgYWZ0ZXIgZWFjaCBldmVudCBsb29wLCBhZGRpbmcKKyAgICogdGhlbSBi YWNrIGludG8gdGhlIHBvb2wuIFRoaXMgYWxsb3dzIGEgd2F5IHRvIGhvbGQgb250byBhIHJlZmVy ZW5jZSB0aGF0CisgICAqIHdvbid0IGJlIGFkZGVkIGJhY2sgaW50byB0aGUgcG9vbC4KKyAgICov CisgIHBlcnNpc3Q6IGZ1bmN0aW9uICgpIHsKKyAgICB0aGlzLmlzUGVyc2lzdGVudCA9IGVtcHR5 RnVuY3Rpb24udGhhdFJldHVybnNUcnVlOworICB9LAorCisgIC8qKgorICAgKiBDaGVja3MgaWYg dGhpcyBldmVudCBzaG91bGQgYmUgcmVsZWFzZWQgYmFjayBpbnRvIHRoZSBwb29sLgorICAgKgor ICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoaXMgc2hvdWxkIG5vdCBiZSByZWxlYXNl ZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgaXNQZXJzaXN0ZW50OiBlbXB0eUZ1bmN0aW9u LnRoYXRSZXR1cm5zRmFsc2UsCisKKyAgLyoqCisgICAqIGBQb29sZWRDbGFzc2AgbG9va3MgZm9y IGBkZXN0cnVjdG9yYCBvbiBlYWNoIGluc3RhbmNlIGl0IHJlbGVhc2VzLgorICAgKi8KKyAgZGVz dHJ1Y3RvcjogZnVuY3Rpb24gKCkgeworICAgIHZhciBJbnRlcmZhY2UgPSB0aGlzLmNvbnN0cnVj dG9yLkludGVyZmFjZTsKKyAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBJbnRlcmZhY2UpIHsKKyAg ICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAg IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wTmFtZSwgZ2V0UG9vbGVkV2FybmluZ1By b3BlcnR5RGVmaW5pdGlvbihwcm9wTmFtZSwgSW50ZXJmYWNlW3Byb3BOYW1lXSkpOworICAgICAg fSBlbHNlIHsKKyAgICAgICAgdGhpc1twcm9wTmFtZV0gPSBudWxsOworICAgICAgfQorICAgIH0K KyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNob3VsZEJlUmVsZWFzZWRQcm9wZXJ0aWVzLmxlbmd0 aDsgaSsrKSB7CisgICAgICB0aGlzW3Nob3VsZEJlUmVsZWFzZWRQcm9wZXJ0aWVzW2ldXSA9IG51 bGw7CisgICAgfQorICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24n KSB7CisgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ25hdGl2ZUV2ZW50JywgZ2V0 UG9vbGVkV2FybmluZ1Byb3BlcnR5RGVmaW5pdGlvbignbmF0aXZlRXZlbnQnLCBudWxsKSk7Cisg ICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3ByZXZlbnREZWZhdWx0JywgZ2V0UG9v bGVkV2FybmluZ1Byb3BlcnR5RGVmaW5pdGlvbigncHJldmVudERlZmF1bHQnLCBlbXB0eUZ1bmN0 aW9uKSk7CisgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3N0b3BQcm9wYWdhdGlv bicsIGdldFBvb2xlZFdhcm5pbmdQcm9wZXJ0eURlZmluaXRpb24oJ3N0b3BQcm9wYWdhdGlvbics IGVtcHR5RnVuY3Rpb24pKTsKKyAgICB9CisgIH0KKworfSk7CisKK1N5bnRoZXRpY0V2ZW50Lklu dGVyZmFjZSA9IEV2ZW50SW50ZXJmYWNlOworCitpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09 ICdwcm9kdWN0aW9uJykgeworICBpZiAoaXNQcm94eVN1cHBvcnRlZCkgeworICAgIC8qZXNsaW50 LWRpc2FibGUgbm8tZnVuYy1hc3NpZ24gKi8KKyAgICBTeW50aGV0aWNFdmVudCA9IG5ldyBQcm94 eShTeW50aGV0aWNFdmVudCwgeworICAgICAgY29uc3RydWN0OiBmdW5jdGlvbiAodGFyZ2V0LCBh cmdzKSB7CisgICAgICAgIHJldHVybiB0aGlzLmFwcGx5KHRhcmdldCwgT2JqZWN0LmNyZWF0ZSh0 YXJnZXQucHJvdG90eXBlKSwgYXJncyk7CisgICAgICB9LAorICAgICAgYXBwbHk6IGZ1bmN0aW9u IChjb25zdHJ1Y3RvciwgdGhhdCwgYXJncykgeworICAgICAgICByZXR1cm4gbmV3IFByb3h5KGNv bnN0cnVjdG9yLmFwcGx5KHRoYXQsIGFyZ3MpLCB7CisgICAgICAgICAgc2V0OiBmdW5jdGlvbiAo dGFyZ2V0LCBwcm9wLCB2YWx1ZSkgeworICAgICAgICAgICAgaWYgKHByb3AgIT09ICdpc1BlcnNp c3RlbnQnICYmICF0YXJnZXQuY29uc3RydWN0b3IuSW50ZXJmYWNlLmhhc093blByb3BlcnR5KHBy b3ApICYmIHNob3VsZEJlUmVsZWFzZWRQcm9wZXJ0aWVzLmluZGV4T2YocHJvcCkgPT09IC0xKSB7 CisgICAgICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3 YXJuaW5nKGRpZFdhcm5Gb3JBZGRlZE5ld1Byb3BlcnR5IHx8IHRhcmdldC5pc1BlcnNpc3RlbnQo KSwgJ1RoaXMgc3ludGhldGljIGV2ZW50IGlzIHJldXNlZCBmb3IgcGVyZm9ybWFuY2UgcmVhc29u cy4gSWYgeW91XCdyZSAnICsgJ3NlZWluZyB0aGlzLCB5b3VcJ3JlIGFkZGluZyBhIG5ldyBwcm9w ZXJ0eSBpbiB0aGUgc3ludGhldGljIGV2ZW50IG9iamVjdC4gJyArICdUaGUgcHJvcGVydHkgaXMg bmV2ZXIgcmVsZWFzZWQuIFNlZSAnICsgJ2h0dHBzOi8vZmIubWUvcmVhY3QtZXZlbnQtcG9vbGlu ZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKSA6IHZvaWQgMDsKKyAgICAgICAgICAgICAgZGlkV2Fy bkZvckFkZGVkTmV3UHJvcGVydHkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAg dGFyZ2V0W3Byb3BdID0gdmFsdWU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAg ICB9CisgICAgICAgIH0pOworICAgICAgfQorICAgIH0pOworICAgIC8qZXNsaW50LWVuYWJsZSBu by1mdW5jLWFzc2lnbiAqLworICB9Cit9CisvKioKKyAqIEhlbHBlciB0byByZWR1Y2UgYm9pbGVy cGxhdGUgd2hlbiBjcmVhdGluZyBzdWJjbGFzc2VzLgorICoKKyAqIEBwYXJhbSB7ZnVuY3Rpb259 IENsYXNzCisgKiBAcGFyYW0gez9vYmplY3R9IEludGVyZmFjZQorICovCitTeW50aGV0aWNFdmVu dC5hdWdtZW50Q2xhc3MgPSBmdW5jdGlvbiAoQ2xhc3MsIEludGVyZmFjZSkgeworICB2YXIgU3Vw ZXIgPSB0aGlzOworCisgIHZhciBFID0gZnVuY3Rpb24gKCkge307CisgIEUucHJvdG90eXBlID0g U3VwZXIucHJvdG90eXBlOworICB2YXIgcHJvdG90eXBlID0gbmV3IEUoKTsKKworICBfYXNzaWdu KHByb3RvdHlwZSwgQ2xhc3MucHJvdG90eXBlKTsKKyAgQ2xhc3MucHJvdG90eXBlID0gcHJvdG90 eXBlOworICBDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDbGFzczsKKworICBDbGFzcy5J bnRlcmZhY2UgPSBfYXNzaWduKHt9LCBTdXBlci5JbnRlcmZhY2UsIEludGVyZmFjZSk7CisgIENs YXNzLmF1Z21lbnRDbGFzcyA9IFN1cGVyLmF1Z21lbnRDbGFzczsKKworICBQb29sZWRDbGFzcy5h ZGRQb29saW5nVG8oQ2xhc3MsIFBvb2xlZENsYXNzLmZvdXJBcmd1bWVudFBvb2xlcik7Cit9Owor CitQb29sZWRDbGFzcy5hZGRQb29saW5nVG8oU3ludGhldGljRXZlbnQsIFBvb2xlZENsYXNzLmZv dXJBcmd1bWVudFBvb2xlcik7CisKK21vZHVsZS5leHBvcnRzID0gU3ludGhldGljRXZlbnQ7CisK Ky8qKgorICAqIEhlbHBlciB0byBudWxsaWZ5IHN5bnRoZXRpY0V2ZW50IGluc3RhbmNlIHByb3Bl cnRpZXMgd2hlbiBkZXN0cnVjdGluZworICAqCisgICogQHBhcmFtIHtvYmplY3R9IFN5bnRoZXRp Y0V2ZW50CisgICogQHBhcmFtIHtTdHJpbmd9IHByb3BOYW1lCisgICogQHJldHVybiB7b2JqZWN0 fSBkZWZpbmVQcm9wZXJ0eSBvYmplY3QKKyAgKi8KK2Z1bmN0aW9uIGdldFBvb2xlZFdhcm5pbmdQ cm9wZXJ0eURlZmluaXRpb24ocHJvcE5hbWUsIGdldFZhbCkgeworICB2YXIgaXNGdW5jdGlvbiA9 IHR5cGVvZiBnZXRWYWwgPT09ICdmdW5jdGlvbic7CisgIHJldHVybiB7CisgICAgY29uZmlndXJh YmxlOiB0cnVlLAorICAgIHNldDogc2V0LAorICAgIGdldDogZ2V0CisgIH07CisKKyAgZnVuY3Rp b24gc2V0KHZhbCkgeworICAgIHZhciBhY3Rpb24gPSBpc0Z1bmN0aW9uID8gJ3NldHRpbmcgdGhl IG1ldGhvZCcgOiAnc2V0dGluZyB0aGUgcHJvcGVydHknOworICAgIHdhcm4oYWN0aW9uLCAnVGhp cyBpcyBlZmZlY3RpdmVseSBhIG5vLW9wJyk7CisgICAgcmV0dXJuIHZhbDsKKyAgfQorCisgIGZ1 bmN0aW9uIGdldCgpIHsKKyAgICB2YXIgYWN0aW9uID0gaXNGdW5jdGlvbiA/ICdhY2Nlc3Npbmcg dGhlIG1ldGhvZCcgOiAnYWNjZXNzaW5nIHRoZSBwcm9wZXJ0eSc7CisgICAgdmFyIHJlc3VsdCA9 IGlzRnVuY3Rpb24gPyAnVGhpcyBpcyBhIG5vLW9wIGZ1bmN0aW9uJyA6ICdUaGlzIGlzIHNldCB0 byBudWxsJzsKKyAgICB3YXJuKGFjdGlvbiwgcmVzdWx0KTsKKyAgICByZXR1cm4gZ2V0VmFsOwor ICB9CisKKyAgZnVuY3Rpb24gd2FybihhY3Rpb24sIHJlc3VsdCkgeworICAgIHZhciB3YXJuaW5n Q29uZGl0aW9uID0gZmFsc2U7CisgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0 aW9uJyA/IHdhcm5pbmcod2FybmluZ0NvbmRpdGlvbiwgJ1RoaXMgc3ludGhldGljIGV2ZW50IGlz IHJldXNlZCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4gSWYgeW91XCdyZSBzZWVpbmcgdGhpcywg JyArICd5b3VcJ3JlICVzIGAlc2Agb24gYSByZWxlYXNlZC9udWxsaWZpZWQgc3ludGhldGljIGV2 ZW50LiAlcy4gJyArICdJZiB5b3UgbXVzdCBrZWVwIHRoZSBvcmlnaW5hbCBzeW50aGV0aWMgZXZl bnQgYXJvdW5kLCB1c2UgZXZlbnQucGVyc2lzdCgpLiAnICsgJ1NlZSBodHRwczovL2ZiLm1lL3Jl YWN0LWV2ZW50LXBvb2xpbmcgZm9yIG1vcmUgaW5mb3JtYXRpb24uJywgYWN0aW9uLCBwcm9wTmFt ZSwgcmVzdWx0KSA6IHZvaWQgMDsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK ZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9TeW50 aGV0aWNGb2N1c0V2ZW50LmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20v bGliL1N5bnRoZXRpY0ZvY3VzRXZlbnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMDAuLjk2ZTRkNmMzCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3Zl bmRvci9yZWFjdC1kb20vbGliL1N5bnRoZXRpY0ZvY3VzRXZlbnQuanMKQEAgLTAsMCArMSwzNSBA QAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxs IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVu ZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBp biB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBn cmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmls ZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFy IFN5bnRoZXRpY1VJRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY1VJRXZlbnQnKTsKKworLyoq CisgKiBAaW50ZXJmYWNlIEZvY3VzRXZlbnQKKyAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIv RE9NLUxldmVsLTMtRXZlbnRzLworICovCit2YXIgRm9jdXNFdmVudEludGVyZmFjZSA9IHsKKyAg cmVsYXRlZFRhcmdldDogbnVsbAorfTsKKworLyoqCisgKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0 Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgZXZlbnQuCisgKiBA cGFyYW0ge3N0cmluZ30gZGlzcGF0Y2hNYXJrZXIgTWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVu dCB0YXJnZXQuCisgKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIg ZXZlbnQuCisgKiBAZXh0ZW5kcyB7U3ludGhldGljVUlFdmVudH0KKyAqLworZnVuY3Rpb24gU3lu dGhldGljRm9jdXNFdmVudChkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2 ZW50LCBuYXRpdmVFdmVudFRhcmdldCkgeworICByZXR1cm4gU3ludGhldGljVUlFdmVudC5jYWxs KHRoaXMsIGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2 ZUV2ZW50VGFyZ2V0KTsKK30KKworU3ludGhldGljVUlFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhl dGljRm9jdXNFdmVudCwgRm9jdXNFdmVudEludGVyZmFjZSk7CisKK21vZHVsZS5leHBvcnRzID0g U3ludGhldGljRm9jdXNFdmVudDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1n aXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvU3ludGhldGljSW5w dXRFdmVudC5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9TeW50 aGV0aWNJbnB1dEV2ZW50LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi42 MGYzZWQ2OAotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVh Y3QtZG9tL2xpYi9TeW50aGV0aWNJbnB1dEV2ZW50LmpzCkBAIC0wLDAgKzEsMzYgQEAKKy8qKgor ICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMg cmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUg QlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJv b3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAq IG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhl IHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBTeW50aGV0 aWNFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljRXZlbnQnKTsKKworLyoqCisgKiBAaW50ZXJm YWNlIEV2ZW50CisgKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtRE9NLUxldmVs LTMtRXZlbnRzLTIwMTMxMTA1CisgKiAgICAgIC8jZXZlbnRzLWlucHV0ZXZlbnRzCisgKi8KK3Zh ciBJbnB1dEV2ZW50SW50ZXJmYWNlID0geworICBkYXRhOiBudWxsCit9OworCisvKioKKyAqIEBw YXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0 Y2ggdGhpcyBldmVudC4KKyAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJrZXIg aWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC4KKyAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVF dmVudCBOYXRpdmUgYnJvd3NlciBldmVudC4KKyAqIEBleHRlbmRzIHtTeW50aGV0aWNVSUV2ZW50 fQorICovCitmdW5jdGlvbiBTeW50aGV0aWNJbnB1dEV2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNw YXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7CisgIHJldHVybiBT eW50aGV0aWNFdmVudC5jYWxsKHRoaXMsIGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwg bmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTsKK30KKworU3ludGhldGljRXZlbnQuYXVn bWVudENsYXNzKFN5bnRoZXRpY0lucHV0RXZlbnQsIElucHV0RXZlbnRJbnRlcmZhY2UpOworCitt b2R1bGUuZXhwb3J0cyA9IFN5bnRoZXRpY0lucHV0RXZlbnQ7ClwgTm8gbmV3bGluZSBhdCBlbmQg b2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20v bGliL1N5bnRoZXRpY0tleWJvYXJkRXZlbnQuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9y L3JlYWN0LWRvbS9saWIvU3ludGhldGljS2V5Ym9hcmRFdmVudC5qcwpuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwMC4uYzliZTJiYzQKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdh ZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvU3ludGhldGljS2V5Ym9hcmRFdmVudC5q cwpAQCAtMCwwICsxLDgzIEBACisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vi b29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNv ZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQor ICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVl LiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBp biB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3Vz ZSBzdHJpY3QnOworCit2YXIgU3ludGhldGljVUlFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGlj VUlFdmVudCcpOworCit2YXIgZ2V0RXZlbnRDaGFyQ29kZSA9IHJlcXVpcmUoJy4vZ2V0RXZlbnRD aGFyQ29kZScpOwordmFyIGdldEV2ZW50S2V5ID0gcmVxdWlyZSgnLi9nZXRFdmVudEtleScpOwor dmFyIGdldEV2ZW50TW9kaWZpZXJTdGF0ZSA9IHJlcXVpcmUoJy4vZ2V0RXZlbnRNb2RpZmllclN0 YXRlJyk7CisKKy8qKgorICogQGludGVyZmFjZSBLZXlib2FyZEV2ZW50CisgKiBAc2VlIGh0dHA6 Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8KKyAqLwordmFyIEtleWJvYXJkRXZl bnRJbnRlcmZhY2UgPSB7CisgIGtleTogZ2V0RXZlbnRLZXksCisgIGxvY2F0aW9uOiBudWxsLAor ICBjdHJsS2V5OiBudWxsLAorICBzaGlmdEtleTogbnVsbCwKKyAgYWx0S2V5OiBudWxsLAorICBt ZXRhS2V5OiBudWxsLAorICByZXBlYXQ6IG51bGwsCisgIGxvY2FsZTogbnVsbCwKKyAgZ2V0TW9k aWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlLAorICAvLyBMZWdhY3kgSW50ZXJmYWNl CisgIGNoYXJDb2RlOiBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICAvLyBgY2hhckNvZGVgIGlzIHRo ZSByZXN1bHQgb2YgYSBLZXlQcmVzcyBldmVudCBhbmQgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2YK KyAgICAvLyB0aGUgYWN0dWFsIHByaW50YWJsZSBjaGFyYWN0ZXIuCisKKyAgICAvLyBLZXlQcmVz cyBpcyBkZXByZWNhdGVkLCBidXQgaXRzIHJlcGxhY2VtZW50IGlzIG5vdCB5ZXQgZmluYWwgYW5k IG5vdAorICAgIC8vIGltcGxlbWVudGVkIGluIGFueSBtYWpvciBicm93c2VyLiBPbmx5IEtleVBy ZXNzIGhhcyBjaGFyQ29kZS4KKyAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleXByZXNzJykgewor ICAgICAgcmV0dXJuIGdldEV2ZW50Q2hhckNvZGUoZXZlbnQpOworICAgIH0KKyAgICByZXR1cm4g MDsKKyAgfSwKKyAga2V5Q29kZTogZnVuY3Rpb24gKGV2ZW50KSB7CisgICAgLy8gYGtleUNvZGVg IGlzIHRoZSByZXN1bHQgb2YgYSBLZXlEb3duL1VwIGV2ZW50IGFuZCByZXByZXNlbnRzIHRoZSB2 YWx1ZSBvZgorICAgIC8vIHBoeXNpY2FsIGtleWJvYXJkIGtleS4KKworICAgIC8vIFRoZSBhY3R1 YWwgbWVhbmluZyBvZiB0aGUgdmFsdWUgZGVwZW5kcyBvbiB0aGUgdXNlcnMnIGtleWJvYXJkIGxh eW91dAorICAgIC8vIHdoaWNoIGNhbm5vdCBiZSBkZXRlY3RlZC4gQXNzdW1pbmcgdGhhdCBpdCBp cyBhIFVTIGtleWJvYXJkIGxheW91dAorICAgIC8vIHByb3ZpZGVzIGEgc3VycHJpc2luZ2x5IGFj Y3VyYXRlIG1hcHBpbmcgZm9yIFVTIGFuZCBFdXJvcGVhbiB1c2Vycy4KKyAgICAvLyBEdWUgdG8g dGhpcywgaXQgaXMgbGVmdCB0byB0aGUgdXNlciB0byBpbXBsZW1lbnQgYXQgdGhpcyB0aW1lLgor ICAgIGlmIChldmVudC50eXBlID09PSAna2V5ZG93bicgfHwgZXZlbnQudHlwZSA9PT0gJ2tleXVw JykgeworICAgICAgcmV0dXJuIGV2ZW50LmtleUNvZGU7CisgICAgfQorICAgIHJldHVybiAwOwor ICB9LAorICB3aGljaDogZnVuY3Rpb24gKGV2ZW50KSB7CisgICAgLy8gYHdoaWNoYCBpcyBhbiBh bGlhcyBmb3IgZWl0aGVyIGBrZXlDb2RlYCBvciBgY2hhckNvZGVgIGRlcGVuZGluZyBvbiB0aGUK KyAgICAvLyB0eXBlIG9mIHRoZSBldmVudC4KKyAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleXBy ZXNzJykgeworICAgICAgcmV0dXJuIGdldEV2ZW50Q2hhckNvZGUoZXZlbnQpOworICAgIH0KKyAg ICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcp IHsKKyAgICAgIHJldHVybiBldmVudC5rZXlDb2RlOworICAgIH0KKyAgICByZXR1cm4gMDsKKyAg fQorfTsKKworLyoqCisgKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJh dGlvbiB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgZXZlbnQuCisgKiBAcGFyYW0ge3N0cmluZ30gZGlz cGF0Y2hNYXJrZXIgTWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuCisgKiBAcGFy YW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuCisgKiBAZXh0ZW5k cyB7U3ludGhldGljVUlFdmVudH0KKyAqLworZnVuY3Rpb24gU3ludGhldGljS2V5Ym9hcmRFdmVu dChkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVu dFRhcmdldCkgeworICByZXR1cm4gU3ludGhldGljVUlFdmVudC5jYWxsKHRoaXMsIGRpc3BhdGNo Q29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTsK K30KKworU3ludGhldGljVUlFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGljS2V5Ym9hcmRFdmVu dCwgS2V5Ym9hcmRFdmVudEludGVyZmFjZSk7CisKK21vZHVsZS5leHBvcnRzID0gU3ludGhldGlj S2V5Ym9hcmRFdmVudDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93 ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvU3ludGhldGljTW91c2VFdmVu dC5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNN b3VzZUV2ZW50LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi5lMDdlMGU1 YwotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9t L2xpYi9TeW50aGV0aWNNb3VzZUV2ZW50LmpzCkBAIC0wLDAgKzEsNzEgQEAKKy8qKgorICogQ29w eXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2 ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0 eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGly ZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBh dGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUg ZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBTeW50aGV0aWNVSUV2 ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNVSUV2ZW50Jyk7Cit2YXIgVmlld3BvcnRNZXRyaWNz ID0gcmVxdWlyZSgnLi9WaWV3cG9ydE1ldHJpY3MnKTsKKwordmFyIGdldEV2ZW50TW9kaWZpZXJT dGF0ZSA9IHJlcXVpcmUoJy4vZ2V0RXZlbnRNb2RpZmllclN0YXRlJyk7CisKKy8qKgorICogQGlu dGVyZmFjZSBNb3VzZUV2ZW50CisgKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZl bC0zLUV2ZW50cy8KKyAqLwordmFyIE1vdXNlRXZlbnRJbnRlcmZhY2UgPSB7CisgIHNjcmVlblg6 IG51bGwsCisgIHNjcmVlblk6IG51bGwsCisgIGNsaWVudFg6IG51bGwsCisgIGNsaWVudFk6IG51 bGwsCisgIGN0cmxLZXk6IG51bGwsCisgIHNoaWZ0S2V5OiBudWxsLAorICBhbHRLZXk6IG51bGws CisgIG1ldGFLZXk6IG51bGwsCisgIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJT dGF0ZSwKKyAgYnV0dG9uOiBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICAvLyBXZWJraXQsIEZpcmVm b3gsIElFOSsKKyAgICAvLyB3aGljaDogIDEgMiAzCisgICAgLy8gYnV0dG9uOiAwIDEgMiAoc3Rh bmRhcmQpCisgICAgdmFyIGJ1dHRvbiA9IGV2ZW50LmJ1dHRvbjsKKyAgICBpZiAoJ3doaWNoJyBp biBldmVudCkgeworICAgICAgcmV0dXJuIGJ1dHRvbjsKKyAgICB9CisgICAgLy8gSUU8OQorICAg IC8vIHdoaWNoOiAgdW5kZWZpbmVkCisgICAgLy8gYnV0dG9uOiAwIDAgMAorICAgIC8vIGJ1dHRv bjogMSA0IDIgKG9ubW91c2V1cCkKKyAgICByZXR1cm4gYnV0dG9uID09PSAyID8gMiA6IGJ1dHRv biA9PT0gNCA/IDEgOiAwOworICB9LAorICBidXR0b25zOiBudWxsLAorICByZWxhdGVkVGFyZ2V0 OiBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICByZXR1cm4gZXZlbnQucmVsYXRlZFRhcmdldCB8fCAo ZXZlbnQuZnJvbUVsZW1lbnQgPT09IGV2ZW50LnNyY0VsZW1lbnQgPyBldmVudC50b0VsZW1lbnQg OiBldmVudC5mcm9tRWxlbWVudCk7CisgIH0sCisgIC8vICJQcm9wcmlldGFyeSIgSW50ZXJmYWNl LgorICBwYWdlWDogZnVuY3Rpb24gKGV2ZW50KSB7CisgICAgcmV0dXJuICdwYWdlWCcgaW4gZXZl bnQgPyBldmVudC5wYWdlWCA6IGV2ZW50LmNsaWVudFggKyBWaWV3cG9ydE1ldHJpY3MuY3VycmVu dFNjcm9sbExlZnQ7CisgIH0sCisgIHBhZ2VZOiBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICByZXR1 cm4gJ3BhZ2VZJyBpbiBldmVudCA/IGV2ZW50LnBhZ2VZIDogZXZlbnQuY2xpZW50WSArIFZpZXdw b3J0TWV0cmljcy5jdXJyZW50U2Nyb2xsVG9wOworICB9Cit9OworCisvKioKKyAqIEBwYXJhbSB7 b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhp cyBldmVudC4KKyAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJrZXIgaWRlbnRp ZnlpbmcgdGhlIGV2ZW50IHRhcmdldC4KKyAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBO YXRpdmUgYnJvd3NlciBldmVudC4KKyAqIEBleHRlbmRzIHtTeW50aGV0aWNVSUV2ZW50fQorICov CitmdW5jdGlvbiBTeW50aGV0aWNNb3VzZUV2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1h cmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7CisgIHJldHVybiBTeW50aGV0 aWNVSUV2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRp dmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpOworfQorCitTeW50aGV0aWNVSUV2ZW50LmF1Z21l bnRDbGFzcyhTeW50aGV0aWNNb3VzZUV2ZW50LCBNb3VzZUV2ZW50SW50ZXJmYWNlKTsKKworbW9k dWxlLmV4cG9ydHMgPSBTeW50aGV0aWNNb3VzZUV2ZW50OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9m IGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xp Yi9TeW50aGV0aWNUb3VjaEV2ZW50LmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFj dC1kb20vbGliL1N5bnRoZXRpY1RvdWNoRXZlbnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAuLmIzYmIzNGQyCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3Rh dGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1N5bnRoZXRpY1RvdWNoRXZlbnQuanMKQEAgLTAsMCAr MSw0NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgor ICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vu c2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0Ug ZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRp b25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVO VFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsK KwordmFyIFN5bnRoZXRpY1VJRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY1VJRXZlbnQnKTsK KwordmFyIGdldEV2ZW50TW9kaWZpZXJTdGF0ZSA9IHJlcXVpcmUoJy4vZ2V0RXZlbnRNb2RpZmll clN0YXRlJyk7CisKKy8qKgorICogQGludGVyZmFjZSBUb3VjaEV2ZW50CisgKiBAc2VlIGh0dHA6 Ly93d3cudzMub3JnL1RSL3RvdWNoLWV2ZW50cy8KKyAqLwordmFyIFRvdWNoRXZlbnRJbnRlcmZh Y2UgPSB7CisgIHRvdWNoZXM6IG51bGwsCisgIHRhcmdldFRvdWNoZXM6IG51bGwsCisgIGNoYW5n ZWRUb3VjaGVzOiBudWxsLAorICBhbHRLZXk6IG51bGwsCisgIG1ldGFLZXk6IG51bGwsCisgIGN0 cmxLZXk6IG51bGwsCisgIHNoaWZ0S2V5OiBudWxsLAorICBnZXRNb2RpZmllclN0YXRlOiBnZXRF dmVudE1vZGlmaWVyU3RhdGUKK307CisKKy8qKgorICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNo Q29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LgorICogQHBh cmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQg dGFyZ2V0LgorICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2 ZW50LgorICogQGV4dGVuZHMge1N5bnRoZXRpY1VJRXZlbnR9CisgKi8KK2Z1bmN0aW9uIFN5bnRo ZXRpY1RvdWNoRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVu dCwgbmF0aXZlRXZlbnRUYXJnZXQpIHsKKyAgcmV0dXJuIFN5bnRoZXRpY1VJRXZlbnQuY2FsbCh0 aGlzLCBkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVF dmVudFRhcmdldCk7Cit9CisKK1N5bnRoZXRpY1VJRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRp Y1RvdWNoRXZlbnQsIFRvdWNoRXZlbnRJbnRlcmZhY2UpOworCittb2R1bGUuZXhwb3J0cyA9IFN5 bnRoZXRpY1RvdWNoRXZlbnQ7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0 IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1N5bnRoZXRpY1RyYW5z aXRpb25FdmVudC5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9T eW50aGV0aWNUcmFuc2l0aW9uRXZlbnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMDAuLjE2ZWMzNmZlCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3Zl bmRvci9yZWFjdC1kb20vbGliL1N5bnRoZXRpY1RyYW5zaXRpb25FdmVudC5qcwpAQCAtMCwwICsx LDM4IEBACisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisg KiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5z ZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBm aWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlv bmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5U UyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOwor Cit2YXIgU3ludGhldGljRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0V2ZW50Jyk7CisKKy8q KgorICogQGludGVyZmFjZSBFdmVudAorICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA5 L1dELWNzczMtdHJhbnNpdGlvbnMtMjAwOTAzMjAvI3RyYW5zaXRpb24tZXZlbnRzLQorICogQHNl ZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvVHJhbnNp dGlvbkV2ZW50CisgKi8KK3ZhciBUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2UgPSB7CisgIHByb3Bl cnR5TmFtZTogbnVsbCwKKyAgZWxhcHNlZFRpbWU6IG51bGwsCisgIHBzZXVkb0VsZW1lbnQ6IG51 bGwKK307CisKKy8qKgorICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3Vy YXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LgorICogQHBhcmFtIHtzdHJpbmd9IGRp c3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LgorICogQHBh cmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LgorICogQGV4dGVu ZHMge1N5bnRoZXRpY0V2ZW50fQorICovCitmdW5jdGlvbiBTeW50aGV0aWNUcmFuc2l0aW9uRXZl bnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZl bnRUYXJnZXQpIHsKKyAgcmV0dXJuIFN5bnRoZXRpY0V2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hD b25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpOwor fQorCitTeW50aGV0aWNFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGljVHJhbnNpdGlvbkV2ZW50 LCBUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2UpOworCittb2R1bGUuZXhwb3J0cyA9IFN5bnRoZXRp Y1RyYW5zaXRpb25FdmVudDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQg YS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvU3ludGhldGljVUlFdmVu dC5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNV SUV2ZW50LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi4xNTNmOTIwZAot LS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xp Yi9TeW50aGV0aWNVSUV2ZW50LmpzCkBAIC0wLDAgKzEsNTggQEAKKy8qKgorICogQ29weXJpZ2h0 IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg KgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxp Y2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5 IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCBy aWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0 b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBTeW50aGV0aWNFdmVudCA9IHJl cXVpcmUoJy4vU3ludGhldGljRXZlbnQnKTsKKwordmFyIGdldEV2ZW50VGFyZ2V0ID0gcmVxdWly ZSgnLi9nZXRFdmVudFRhcmdldCcpOworCisvKioKKyAqIEBpbnRlcmZhY2UgVUlFdmVudAorICog QHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvCisgKi8KK3ZhciBV SUV2ZW50SW50ZXJmYWNlID0geworICB2aWV3OiBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICBpZiAo ZXZlbnQudmlldykgeworICAgICAgcmV0dXJuIGV2ZW50LnZpZXc7CisgICAgfQorCisgICAgdmFy IHRhcmdldCA9IGdldEV2ZW50VGFyZ2V0KGV2ZW50KTsKKyAgICBpZiAodGFyZ2V0LndpbmRvdyA9 PT0gdGFyZ2V0KSB7CisgICAgICAvLyB0YXJnZXQgaXMgYSB3aW5kb3cgb2JqZWN0CisgICAgICBy ZXR1cm4gdGFyZ2V0OworICAgIH0KKworICAgIHZhciBkb2MgPSB0YXJnZXQub3duZXJEb2N1bWVu dDsKKyAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoeSBgb3duZXJEb2N1bWVudGAgaXMgc29tZXRp bWVzIHVuZGVmaW5lZCBpbiBJRTguCisgICAgaWYgKGRvYykgeworICAgICAgcmV0dXJuIGRvYy5k ZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93OworICAgIH0gZWxzZSB7CisgICAgICByZXR1 cm4gd2luZG93OworICAgIH0KKyAgfSwKKyAgZGV0YWlsOiBmdW5jdGlvbiAoZXZlbnQpIHsKKyAg ICByZXR1cm4gZXZlbnQuZGV0YWlsIHx8IDA7CisgIH0KK307CisKKy8qKgorICogQHBhcmFtIHtv YmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlz IGV2ZW50LgorICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlm eWluZyB0aGUgZXZlbnQgdGFyZ2V0LgorICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5h dGl2ZSBicm93c2VyIGV2ZW50LgorICogQGV4dGVuZHMge1N5bnRoZXRpY0V2ZW50fQorICovCitm dW5jdGlvbiBTeW50aGV0aWNVSUV2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwg bmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7CisgIHJldHVybiBTeW50aGV0aWNFdmVu dC5jYWxsKHRoaXMsIGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQs IG5hdGl2ZUV2ZW50VGFyZ2V0KTsKK30KKworU3ludGhldGljRXZlbnQuYXVnbWVudENsYXNzKFN5 bnRoZXRpY1VJRXZlbnQsIFVJRXZlbnRJbnRlcmZhY2UpOworCittb2R1bGUuZXhwb3J0cyA9IFN5 bnRoZXRpY1VJRXZlbnQ7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEv d2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1N5bnRoZXRpY1doZWVsRXZl bnQuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvU3ludGhldGlj V2hlZWxFdmVudC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uZTNhYzhm OWYKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRv bS9saWIvU3ludGhldGljV2hlZWxFdmVudC5qcwpAQCAtMCwwICsxLDUzIEBACisvKioKKyAqIENv cHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2Vy dmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1z dHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRp cmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBw YXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1l IGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgU3ludGhldGljTW91 c2VFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljTW91c2VFdmVudCcpOworCisvKioKKyAqIEBp bnRlcmZhY2UgV2hlZWxFdmVudAorICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2 ZWwtMy1FdmVudHMvCisgKi8KK3ZhciBXaGVlbEV2ZW50SW50ZXJmYWNlID0geworICBkZWx0YVg6 IGZ1bmN0aW9uIChldmVudCkgeworICAgIHJldHVybiAnZGVsdGFYJyBpbiBldmVudCA/IGV2ZW50 LmRlbHRhWCA6CisgICAgLy8gRmFsbGJhY2sgdG8gYHdoZWVsRGVsdGFYYCBmb3IgV2Via2l0IGFu ZCBub3JtYWxpemUgKHJpZ2h0IGlzIHBvc2l0aXZlKS4KKyAgICAnd2hlZWxEZWx0YVgnIGluIGV2 ZW50ID8gLWV2ZW50LndoZWVsRGVsdGFYIDogMDsKKyAgfSwKKyAgZGVsdGFZOiBmdW5jdGlvbiAo ZXZlbnQpIHsKKyAgICByZXR1cm4gJ2RlbHRhWScgaW4gZXZlbnQgPyBldmVudC5kZWx0YVkgOgor ICAgIC8vIEZhbGxiYWNrIHRvIGB3aGVlbERlbHRhWWAgZm9yIFdlYmtpdCBhbmQgbm9ybWFsaXpl IChkb3duIGlzIHBvc2l0aXZlKS4KKyAgICAnd2hlZWxEZWx0YVknIGluIGV2ZW50ID8gLWV2ZW50 LndoZWVsRGVsdGFZIDoKKyAgICAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YWAgZm9yIElFPDkg YW5kIG5vcm1hbGl6ZSAoZG93biBpcyBwb3NpdGl2ZSkuCisgICAgJ3doZWVsRGVsdGEnIGluIGV2 ZW50ID8gLWV2ZW50LndoZWVsRGVsdGEgOiAwOworICB9LAorICBkZWx0YVo6IG51bGwsCisKKyAg Ly8gQnJvd3NlcnMgd2l0aG91dCAiZGVsdGFNb2RlIiBpcyByZXBvcnRpbmcgaW4gcmF3IHdoZWVs IGRlbHRhIHdoZXJlIG9uZQorICAvLyBub3RjaCBvbiB0aGUgc2Nyb2xsIGlzIGFsd2F5cyArLy0g MTIwLCByb3VnaGx5IGVxdWl2YWxlbnQgdG8gcGl4ZWxzLgorICAvLyBBIGdvb2QgYXBwcm94aW1h dGlvbiBvZiBET01fREVMVEFfTElORSAoMSkgaXMgNSUgb2Ygdmlld3BvcnQgc2l6ZSBvcgorICAv LyB+NDAgcGl4ZWxzLCBmb3IgRE9NX0RFTFRBX1NDUkVFTiAoMikgaXQgaXMgODcuNSUgb2Ygdmll d3BvcnQgc2l6ZS4KKyAgZGVsdGFNb2RlOiBudWxsCit9OworCisvKioKKyAqIEBwYXJhbSB7b2Jq ZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBl dmVudC4KKyAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJrZXIgaWRlbnRpZnlp bmcgdGhlIGV2ZW50IHRhcmdldC4KKyAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRp dmUgYnJvd3NlciBldmVudC4KKyAqIEBleHRlbmRzIHtTeW50aGV0aWNNb3VzZUV2ZW50fQorICov CitmdW5jdGlvbiBTeW50aGV0aWNXaGVlbEV2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1h cmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7CisgIHJldHVybiBTeW50aGV0 aWNNb3VzZUV2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBu YXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpOworfQorCitTeW50aGV0aWNNb3VzZUV2ZW50 LmF1Z21lbnRDbGFzcyhTeW50aGV0aWNXaGVlbEV2ZW50LCBXaGVlbEV2ZW50SW50ZXJmYWNlKTsK KworbW9kdWxlLmV4cG9ydHMgPSBTeW50aGV0aWNXaGVlbEV2ZW50OwpcIE5vIG5ld2xpbmUgYXQg ZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3Qt ZG9tL2xpYi9UYXBFdmVudFBsdWdpbi5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVh Y3QtZG9tL2xpYi9UYXBFdmVudFBsdWdpbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwMC4uNDYzZmU5ODUKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMv dmVuZG9yL3JlYWN0LWRvbS9saWIvVGFwRXZlbnRQbHVnaW4uanMKQEAgLTAsMCArMSwxMTUgQEAK Ky8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCBy aWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRl ciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4g dGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3Jh bnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUg aW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKKwor dmFyIEV2ZW50UGx1Z2luVXRpbHMgPSByZXF1aXJlKCcuL0V2ZW50UGx1Z2luVXRpbHMnKTsKK3Zh ciBFdmVudFByb3BhZ2F0b3JzID0gcmVxdWlyZSgnLi9FdmVudFByb3BhZ2F0b3JzJyk7Cit2YXIg U3ludGhldGljVUlFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljVUlFdmVudCcpOwordmFyIFRv dWNoRXZlbnRVdGlscyA9IHJlcXVpcmUoJ2ZianMvbGliL1RvdWNoRXZlbnRVdGlscycpOwordmFy IFZpZXdwb3J0TWV0cmljcyA9IHJlcXVpcmUoJy4vVmlld3BvcnRNZXRyaWNzJyk7CisKK3ZhciBp c1N0YXJ0aXNoID0gRXZlbnRQbHVnaW5VdGlscy5pc1N0YXJ0aXNoOwordmFyIGlzRW5kaXNoID0g RXZlbnRQbHVnaW5VdGlscy5pc0VuZGlzaDsKKworLyoqCisgKiBXZSBhcmUgZXh0ZW5kaW5nIHRo ZSBGbG93ICdUb3VjaCcgZGVjbGFyYXRpb24gdG8gZW5hYmxlIHVzaW5nIGJyYWNrZXQKKyAqIG5v dGF0aW9uIHRvIGFjY2VzcyBwcm9wZXJ0aWVzLgorICogV2l0aG91dCB0aGlzIGFkanVzdG1lbnQg RmxvdyB0aHJvd3MKKyAqICJJbmRleGFibGUgc2lnbmF0dXJlIG5vdCBmb3VuZCBpbiBUb3VjaCIu CisgKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzEzMjMKKyAq LworCisKKy8qKgorICogTnVtYmVyIG9mIHBpeGVscyB0aGF0IGFyZSB0b2xlcmF0ZWQgaW4gYmV0 d2VlbiBhIGB0b3VjaFN0YXJ0YCBhbmQgYHRvdWNoRW5kYAorICogaW4gb3JkZXIgdG8gc3RpbGwg YmUgY29uc2lkZXJlZCBhICd0YXAnIGV2ZW50LgorICovCit2YXIgdGFwTW92ZVRocmVzaG9sZCA9 IDEwOwordmFyIHN0YXJ0Q29vcmRzID0geyB4OiAwLCB5OiAwIH07CisKK3ZhciBBeGlzID0gewor ICB4OiB7IHBhZ2U6ICdwYWdlWCcsIGNsaWVudDogJ2NsaWVudFgnLCBlbnZTY3JvbGw6ICdjdXJy ZW50UGFnZVNjcm9sbExlZnQnIH0sCisgIHk6IHsgcGFnZTogJ3BhZ2VZJywgY2xpZW50OiAnY2xp ZW50WScsIGVudlNjcm9sbDogJ2N1cnJlbnRQYWdlU2Nyb2xsVG9wJyB9Cit9OworCitmdW5jdGlv biBnZXRBeGlzQ29vcmRPZkV2ZW50KGF4aXMsIG5hdGl2ZUV2ZW50KSB7CisgIHZhciBzaW5nbGVU b3VjaCA9IFRvdWNoRXZlbnRVdGlscy5leHRyYWN0U2luZ2xlVG91Y2gobmF0aXZlRXZlbnQpOwor ICBpZiAoc2luZ2xlVG91Y2gpIHsKKyAgICByZXR1cm4gc2luZ2xlVG91Y2hbYXhpcy5wYWdlXTsK KyAgfQorICByZXR1cm4gYXhpcy5wYWdlIGluIG5hdGl2ZUV2ZW50ID8gbmF0aXZlRXZlbnRbYXhp cy5wYWdlXSA6IG5hdGl2ZUV2ZW50W2F4aXMuY2xpZW50XSArIFZpZXdwb3J0TWV0cmljc1theGlz LmVudlNjcm9sbF07Cit9CisKK2Z1bmN0aW9uIGdldERpc3RhbmNlKGNvb3JkcywgbmF0aXZlRXZl bnQpIHsKKyAgdmFyIHBhZ2VYID0gZ2V0QXhpc0Nvb3JkT2ZFdmVudChBeGlzLngsIG5hdGl2ZUV2 ZW50KTsKKyAgdmFyIHBhZ2VZID0gZ2V0QXhpc0Nvb3JkT2ZFdmVudChBeGlzLnksIG5hdGl2ZUV2 ZW50KTsKKyAgcmV0dXJuIE1hdGgucG93KE1hdGgucG93KHBhZ2VYIC0gY29vcmRzLngsIDIpICsg TWF0aC5wb3cocGFnZVkgLSBjb29yZHMueSwgMiksIDAuNSk7Cit9CisKK3ZhciB0b3VjaEV2ZW50 cyA9IFsndG9wVG91Y2hTdGFydCcsICd0b3BUb3VjaENhbmNlbCcsICd0b3BUb3VjaEVuZCcsICd0 b3BUb3VjaE1vdmUnXTsKKwordmFyIGRlcGVuZGVuY2llcyA9IFsndG9wTW91c2VEb3duJywgJ3Rv cE1vdXNlTW92ZScsICd0b3BNb3VzZVVwJ10uY29uY2F0KHRvdWNoRXZlbnRzKTsKKwordmFyIGV2 ZW50VHlwZXMgPSB7CisgIHRvdWNoVGFwOiB7CisgICAgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6 IHsKKyAgICAgIGJ1YmJsZWQ6ICdvblRvdWNoVGFwJywKKyAgICAgIGNhcHR1cmVkOiAnb25Ub3Vj aFRhcENhcHR1cmUnCisgICAgfSwKKyAgICBkZXBlbmRlbmNpZXM6IGRlcGVuZGVuY2llcworICB9 Cit9OworCit2YXIgdXNlZFRvdWNoID0gZmFsc2U7Cit2YXIgdXNlZFRvdWNoVGltZSA9IDA7Cit2 YXIgVE9VQ0hfREVMQVkgPSAxMDAwOworCit2YXIgVGFwRXZlbnRQbHVnaW4gPSB7CisKKyAgdGFw TW92ZVRocmVzaG9sZDogdGFwTW92ZVRocmVzaG9sZCwKKworICBldmVudFR5cGVzOiBldmVudFR5 cGVzLAorCisgIGV4dHJhY3RFdmVudHM6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIHRhcmdldElu c3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkgeworICAgIGlmICghaXNTdGFydGlz aCh0b3BMZXZlbFR5cGUpICYmICFpc0VuZGlzaCh0b3BMZXZlbFR5cGUpKSB7CisgICAgICByZXR1 cm4gbnVsbDsKKyAgICB9CisgICAgLy8gb24gaW9zLCB0aGVyZSBpcyBhIGRlbGF5IGFmdGVyIHRv dWNoIGV2ZW50IGFuZCBzeW50aGV0aWMKKyAgICAvLyBtb3VzZSBldmVudHMsIHNvIHRoYXQgdXNl ciBjYW4gcGVyZm9ybSBkb3VibGUgdGFwCisgICAgLy8gc29sdXRpb246IGlnbm9yZSBtb3VzZSBl dmVudHMgZm9sbG93aW5nIHRvdWNoZXZlbnQgd2l0aGluIHNtYWxsIHRpbWVmcmFtZQorICAgIGlm ICh0b3VjaEV2ZW50cy5pbmRleE9mKHRvcExldmVsVHlwZSkgIT09IC0xKSB7CisgICAgICB1c2Vk VG91Y2ggPSB0cnVlOworICAgICAgdXNlZFRvdWNoVGltZSA9IERhdGUubm93KCk7CisgICAgfSBl bHNlIHsKKyAgICAgIGlmICh1c2VkVG91Y2ggJiYgRGF0ZS5ub3coKSAtIHVzZWRUb3VjaFRpbWUg PCBUT1VDSF9ERUxBWSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9Cisg ICAgdmFyIGV2ZW50ID0gbnVsbDsKKyAgICB2YXIgZGlzdGFuY2UgPSBnZXREaXN0YW5jZShzdGFy dENvb3JkcywgbmF0aXZlRXZlbnQpOworICAgIGlmIChpc0VuZGlzaCh0b3BMZXZlbFR5cGUpICYm IGRpc3RhbmNlIDwgdGFwTW92ZVRocmVzaG9sZCkgeworICAgICAgZXZlbnQgPSBTeW50aGV0aWNV SUV2ZW50LmdldFBvb2xlZChldmVudFR5cGVzLnRvdWNoVGFwLCB0YXJnZXRJbnN0LCBuYXRpdmVF dmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpOworICAgIH0KKyAgICBpZiAoaXNTdGFydGlzaCh0b3BM ZXZlbFR5cGUpKSB7CisgICAgICBzdGFydENvb3Jkcy54ID0gZ2V0QXhpc0Nvb3JkT2ZFdmVudChB eGlzLngsIG5hdGl2ZUV2ZW50KTsKKyAgICAgIHN0YXJ0Q29vcmRzLnkgPSBnZXRBeGlzQ29vcmRP ZkV2ZW50KEF4aXMueSwgbmF0aXZlRXZlbnQpOworICAgIH0gZWxzZSBpZiAoaXNFbmRpc2godG9w TGV2ZWxUeXBlKSkgeworICAgICAgc3RhcnRDb29yZHMueCA9IDA7CisgICAgICBzdGFydENvb3Jk cy55ID0gMDsKKyAgICB9CisgICAgRXZlbnRQcm9wYWdhdG9ycy5hY2N1bXVsYXRlVHdvUGhhc2VE aXNwYXRjaGVzKGV2ZW50KTsKKyAgICByZXR1cm4gZXZlbnQ7CisgIH0KKworfTsKKworbW9kdWxl LmV4cG9ydHMgPSBUYXBFdmVudFBsdWdpbjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRp ZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvVG91Y2hI aXN0b3J5TWF0aC5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9U b3VjaEhpc3RvcnlNYXRoLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi4w NzU1YjBmOQotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVh Y3QtZG9tL2xpYi9Ub3VjaEhpc3RvcnlNYXRoLmpzCkBAIC0wLDAgKzEsOTggQEAKKy8qKgorICov CisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFRvdWNoSGlzdG9yeU1hdGggPSB7CisgIC8qKgorICAg KiBUaGlzIGNvZGUgaXMgb3B0aW1pemVkIGFuZCBub3QgaW50ZW5kZWQgdG8gbG9vayBiZWF1dGlm dWwuIFRoaXMgYWxsb3dzCisgICAqIGNvbXB1dGluZyBvZiB0b3VjaCBjZW50cm9pZHMgdGhhdCBo YXZlIG1vdmVkIGFmdGVyIGB0b3VjaGVzQ2hhbmdlZEFmdGVyYAorICAgKiB0aW1lU3RhbXAuIFlv dSBjYW4gY29tcHV0ZSB0aGUgY3VycmVudCBjZW50cm9pZCBpbnZvbHZpbmcgYWxsIHRvdWNoZXMK KyAgICogbW92ZXMgYWZ0ZXIgYHRvdWNoZXNDaGFuZ2VkQWZ0ZXJgLCBvciB5b3UgY2FuIGNvbXB1 dGUgdGhlIHByZXZpb3VzCisgICAqIGNlbnRyb2lkIG9mIGFsbCB0b3VjaGVzIHRoYXQgd2VyZSBt b3ZlZCBhZnRlciBgdG91Y2hlc0NoYW5nZWRBZnRlcmAuCisgICAqCisgICAqIEBwYXJhbSB7VG91 Y2hIaXN0b3J5TWF0aH0gdG91Y2hIaXN0b3J5IFN0YW5kYXJkIFJlc3BvbmRlciB0b3VjaCB0cmFj aworICAgKiBkYXRhLgorICAgKiBAcGFyYW0ge251bWJlcn0gdG91Y2hlc0NoYW5nZWRBZnRlciB0 aW1lU3RhbXAgYWZ0ZXIgd2hpY2ggbW92ZWQgdG91Y2hlcworICAgKiBhcmUgY29uc2lkZXJlZCAi YWN0aXZlbHkgbW92aW5nIiAtIG5vdCBqdXN0ICJhY3RpdmUiLgorICAgKiBAcGFyYW0ge2Jvb2xl YW59IGlzWEF4aXMgQ29uc2lkZXIgYHhgIGRpbWVuc2lvbiB2cy4gYHlgIGRpbWVuc2lvbi4KKyAg ICogQHBhcmFtIHtib29sZWFufSBvZkN1cnJlbnQgQ29tcHV0ZSBjdXJyZW50IGNlbnRyb2lkIGZv ciBhY3RpdmVseSBtb3ZpbmcKKyAgICogdG91Y2hlcyB2cy4gcHJldmlvdXMgY2VudHJvaWQgb2Yg bm93IGFjdGl2ZWx5IG1vdmluZyB0b3VjaGVzLgorICAgKiBAcmV0dXJuIHtudW1iZXJ9IHZhbHVl IG9mIGNlbnRyb2lkIGluIHNwZWNpZmllZCBkaW1lbnNpb24uCisgICAqLworICBjZW50cm9pZERp bWVuc2lvbjogZnVuY3Rpb24gKHRvdWNoSGlzdG9yeSwgdG91Y2hlc0NoYW5nZWRBZnRlciwgaXNY QXhpcywgb2ZDdXJyZW50KSB7CisgICAgdmFyIHRvdWNoQmFuayA9IHRvdWNoSGlzdG9yeS50b3Vj aEJhbms7CisgICAgdmFyIHRvdGFsID0gMDsKKyAgICB2YXIgY291bnQgPSAwOworCisgICAgdmFy IG9uZVRvdWNoRGF0YSA9IHRvdWNoSGlzdG9yeS5udW1iZXJBY3RpdmVUb3VjaGVzID09PSAxID8g dG91Y2hIaXN0b3J5LnRvdWNoQmFua1t0b3VjaEhpc3RvcnkuaW5kZXhPZlNpbmdsZUFjdGl2ZVRv dWNoXSA6IG51bGw7CisKKyAgICBpZiAob25lVG91Y2hEYXRhICE9PSBudWxsKSB7CisgICAgICBp ZiAob25lVG91Y2hEYXRhLnRvdWNoQWN0aXZlICYmIG9uZVRvdWNoRGF0YS5jdXJyZW50VGltZVN0 YW1wID4gdG91Y2hlc0NoYW5nZWRBZnRlcikgeworICAgICAgICB0b3RhbCArPSBvZkN1cnJlbnQg JiYgaXNYQXhpcyA/IG9uZVRvdWNoRGF0YS5jdXJyZW50UGFnZVggOiBvZkN1cnJlbnQgJiYgIWlz WEF4aXMgPyBvbmVUb3VjaERhdGEuY3VycmVudFBhZ2VZIDogIW9mQ3VycmVudCAmJiBpc1hBeGlz ID8gb25lVG91Y2hEYXRhLnByZXZpb3VzUGFnZVggOiBvbmVUb3VjaERhdGEucHJldmlvdXNQYWdl WTsKKyAgICAgICAgY291bnQgPSAxOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3Ig KHZhciBpID0gMDsgaSA8IHRvdWNoQmFuay5sZW5ndGg7IGkrKykgeworICAgICAgICB2YXIgdG91 Y2hUcmFjayA9IHRvdWNoQmFua1tpXTsKKyAgICAgICAgaWYgKHRvdWNoVHJhY2sgIT09IG51bGwg JiYgdG91Y2hUcmFjayAhPT0gdW5kZWZpbmVkICYmIHRvdWNoVHJhY2sudG91Y2hBY3RpdmUgJiYg dG91Y2hUcmFjay5jdXJyZW50VGltZVN0YW1wID49IHRvdWNoZXNDaGFuZ2VkQWZ0ZXIpIHsKKyAg ICAgICAgICB2YXIgdG9BZGQ7IC8vIFl1Y2ssIHByb2dyYW0gdGVtcG9yYXJpbHkgaW4gaW52YWxp ZCBzdGF0ZS4KKyAgICAgICAgICBpZiAob2ZDdXJyZW50ICYmIGlzWEF4aXMpIHsKKyAgICAgICAg ICAgIHRvQWRkID0gdG91Y2hUcmFjay5jdXJyZW50UGFnZVg7CisgICAgICAgICAgfSBlbHNlIGlm IChvZkN1cnJlbnQgJiYgIWlzWEF4aXMpIHsKKyAgICAgICAgICAgIHRvQWRkID0gdG91Y2hUcmFj ay5jdXJyZW50UGFnZVk7CisgICAgICAgICAgfSBlbHNlIGlmICghb2ZDdXJyZW50ICYmIGlzWEF4 aXMpIHsKKyAgICAgICAgICAgIHRvQWRkID0gdG91Y2hUcmFjay5wcmV2aW91c1BhZ2VYOworICAg ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0b0FkZCA9IHRvdWNoVHJhY2sucHJldmlvdXNQ YWdlWTsKKyAgICAgICAgICB9CisgICAgICAgICAgdG90YWwgKz0gdG9BZGQ7CisgICAgICAgICAg Y291bnQrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY291bnQgPiAw ID8gdG90YWwgLyBjb3VudCA6IFRvdWNoSGlzdG9yeU1hdGgubm9DZW50cm9pZDsKKyAgfSwKKwor ICBjdXJyZW50Q2VudHJvaWRYT2ZUb3VjaGVzQ2hhbmdlZEFmdGVyOiBmdW5jdGlvbiAodG91Y2hI aXN0b3J5LCB0b3VjaGVzQ2hhbmdlZEFmdGVyKSB7CisgICAgcmV0dXJuIFRvdWNoSGlzdG9yeU1h dGguY2VudHJvaWREaW1lbnNpb24odG91Y2hIaXN0b3J5LCB0b3VjaGVzQ2hhbmdlZEFmdGVyLCB0 cnVlLCAvLyBpc1hBeGlzCisgICAgdHJ1ZSAvLyBvZkN1cnJlbnQKKyAgICApOworICB9LAorCisg IGN1cnJlbnRDZW50cm9pZFlPZlRvdWNoZXNDaGFuZ2VkQWZ0ZXI6IGZ1bmN0aW9uICh0b3VjaEhp c3RvcnksIHRvdWNoZXNDaGFuZ2VkQWZ0ZXIpIHsKKyAgICByZXR1cm4gVG91Y2hIaXN0b3J5TWF0 aC5jZW50cm9pZERpbWVuc2lvbih0b3VjaEhpc3RvcnksIHRvdWNoZXNDaGFuZ2VkQWZ0ZXIsIGZh bHNlLCAvLyBpc1hBeGlzCisgICAgdHJ1ZSAvLyBvZkN1cnJlbnQKKyAgICApOworICB9LAorCisg IHByZXZpb3VzQ2VudHJvaWRYT2ZUb3VjaGVzQ2hhbmdlZEFmdGVyOiBmdW5jdGlvbiAodG91Y2hI aXN0b3J5LCB0b3VjaGVzQ2hhbmdlZEFmdGVyKSB7CisgICAgcmV0dXJuIFRvdWNoSGlzdG9yeU1h dGguY2VudHJvaWREaW1lbnNpb24odG91Y2hIaXN0b3J5LCB0b3VjaGVzQ2hhbmdlZEFmdGVyLCB0 cnVlLCAvLyBpc1hBeGlzCisgICAgZmFsc2UgLy8gb2ZDdXJyZW50CisgICAgKTsKKyAgfSwKKwor ICBwcmV2aW91c0NlbnRyb2lkWU9mVG91Y2hlc0NoYW5nZWRBZnRlcjogZnVuY3Rpb24gKHRvdWNo SGlzdG9yeSwgdG91Y2hlc0NoYW5nZWRBZnRlcikgeworICAgIHJldHVybiBUb3VjaEhpc3RvcnlN YXRoLmNlbnRyb2lkRGltZW5zaW9uKHRvdWNoSGlzdG9yeSwgdG91Y2hlc0NoYW5nZWRBZnRlciwg ZmFsc2UsIC8vIGlzWEF4aXMKKyAgICBmYWxzZSAvLyBvZkN1cnJlbnQKKyAgICApOworICB9LAor CisgIGN1cnJlbnRDZW50cm9pZFg6IGZ1bmN0aW9uICh0b3VjaEhpc3RvcnkpIHsKKyAgICByZXR1 cm4gVG91Y2hIaXN0b3J5TWF0aC5jZW50cm9pZERpbWVuc2lvbih0b3VjaEhpc3RvcnksIDAsIC8v IHRvdWNoZXNDaGFuZ2VkQWZ0ZXIKKyAgICB0cnVlLCAvLyBpc1hBeGlzCisgICAgdHJ1ZSAvLyBv ZkN1cnJlbnQKKyAgICApOworICB9LAorCisgIGN1cnJlbnRDZW50cm9pZFk6IGZ1bmN0aW9uICh0 b3VjaEhpc3RvcnkpIHsKKyAgICByZXR1cm4gVG91Y2hIaXN0b3J5TWF0aC5jZW50cm9pZERpbWVu c2lvbih0b3VjaEhpc3RvcnksIDAsIC8vIHRvdWNoZXNDaGFuZ2VkQWZ0ZXIKKyAgICBmYWxzZSwg Ly8gaXNYQXhpcworICAgIHRydWUgLy8gb2ZDdXJyZW50CisgICAgKTsKKyAgfSwKKworICBub0Nl bnRyb2lkOiAtMQorfTsKKworbW9kdWxlLmV4cG9ydHMgPSBUb3VjaEhpc3RvcnlNYXRoOwpcIE5v IG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92 ZW5kb3IvcmVhY3QtZG9tL2xpYi9UcmFuc2FjdGlvbi5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92 ZW5kb3IvcmVhY3QtZG9tL2xpYi9UcmFuc2FjdGlvbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMC4uNTY1ZTU1YTAKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9z dGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvVHJhbnNhY3Rpb24uanMKQEAgLTAsMCArMSwyMjQg QEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFs bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1 bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUg aW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwg Z3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZp bGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsK KwordmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTsK KwordmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpOworCit2YXIg T0JTRVJWRURfRVJST1IgPSB7fTsKKworLyoqCisgKiBgVHJhbnNhY3Rpb25gIGNyZWF0ZXMgYSBi bGFjayBib3ggdGhhdCBpcyBhYmxlIHRvIHdyYXAgYW55IG1ldGhvZCBzdWNoIHRoYXQKKyAqIGNl cnRhaW4gaW52YXJpYW50cyBhcmUgbWFpbnRhaW5lZCBiZWZvcmUgYW5kIGFmdGVyIHRoZSBtZXRo b2QgaXMgaW52b2tlZAorICogKEV2ZW4gaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biB3aGlsZSBp bnZva2luZyB0aGUgd3JhcHBlZCBtZXRob2QpLiBXaG9ldmVyCisgKiBpbnN0YW50aWF0ZXMgYSB0 cmFuc2FjdGlvbiBjYW4gcHJvdmlkZSBlbmZvcmNlcnMgb2YgdGhlIGludmFyaWFudHMgYXQKKyAq IGNyZWF0aW9uIHRpbWUuIFRoZSBgVHJhbnNhY3Rpb25gIGNsYXNzIGl0c2VsZiB3aWxsIHN1cHBs eSBvbmUgYWRkaXRpb25hbAorICogYXV0b21hdGljIGludmFyaWFudCBmb3IgeW91IC0gdGhlIGlu dmFyaWFudCB0aGF0IGFueSB0cmFuc2FjdGlvbiBpbnN0YW5jZQorICogc2hvdWxkIG5vdCBiZSBy dW4gd2hpbGUgaXQgaXMgYWxyZWFkeSBiZWluZyBydW4uIFlvdSB3b3VsZCB0eXBpY2FsbHkgY3Jl YXRlIGEKKyAqIHNpbmdsZSBpbnN0YW5jZSBvZiBhIGBUcmFuc2FjdGlvbmAgZm9yIHJldXNlIG11 bHRpcGxlIHRpbWVzLCB0aGF0IHBvdGVudGlhbGx5CisgKiBpcyB1c2VkIHRvIHdyYXAgc2V2ZXJh bCBkaWZmZXJlbnQgbWV0aG9kcy4gV3JhcHBlcnMgYXJlIGV4dHJlbWVseSBzaW1wbGUgLQorICog dGhleSBvbmx5IHJlcXVpcmUgaW1wbGVtZW50aW5nIHR3byBtZXRob2RzLgorICoKKyAqIDxwcmU+ CisgKiAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlcnMgKGluamVjdGVkIGF0IGNyZWF0aW9u IHRpbWUpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgICAgICAg KworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgIHwKKyAq ICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS18LS0tLS0tLS0t LS0tLS0rCisgKiAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgdiAgICAgICAg fCAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICAgICAgIHwgICAgICArLS0tLS0tLS0t LS0tLS0tKyAgIHwgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICB8ICAgKy0t fCAgICB3cmFwcGVyMSAgIHwtLS18LS0tLSsgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAg ICAgfCAgIHwgICstLS0tLS0tLS0tLS0tLS0rICAgdiAgICB8ICAgICAgICAgfAorICogICAgICAg ICAgICAgICAgICAgIHwgICB8ICAgICAgICAgICstLS0tLS0tLS0tLS0tKyAgfCAgICAgICAgIHwK KyAqICAgICAgICAgICAgICAgICAgICB8ICAgfCAgICAgKy0tLS18ICAgd3JhcHBlcjIgIHwtLS0t LS0tLSsgICB8CisgKiAgICAgICAgICAgICAgICAgICAgfCAgIHwgICAgIHwgICAgKy0tLS0tLS0t LS0tLS0rICB8ICAgICB8ICAgfAorICogICAgICAgICAgICAgICAgICAgIHwgICB8ICAgICB8ICAg ICAgICAgICAgICAgICAgICAgfCAgICAgfCAgIHwKKyAqICAgICAgICAgICAgICAgICAgICB8ICAg diAgICAgdiAgICAgICAgICAgICAgICAgICAgIHYgICAgIHYgICB8IHdyYXBwZXIKKyAqICAgICAg ICAgICAgICAgICAgICB8ICstLS0rICstLS0rICAgKy0tLS0tLS0tLSsgICArLS0tKyArLS0tKyB8 IGludmFyaWFudHMKKyAqIHBlcmZvcm0oYW55TWV0aG9kKSB8IHwgICB8IHwgICB8ICAgfCAgICAg ICAgIHwgICB8ICAgfCB8ICAgfCB8IG1haW50YWluZWQKKyAqICstLS0tLS0tLS0tLS0tLS0tLT58 LXwtLS18LXwtLS18LS0+fGFueU1ldGhvZHwtLS18LS0tfC18LS0tfC18LS0tLS0tLS0+CisgKiAg ICAgICAgICAgICAgICAgICAgfCB8ICAgfCB8ICAgfCAgIHwgICAgICAgICB8ICAgfCAgIHwgfCAg IHwgfAorICogICAgICAgICAgICAgICAgICAgIHwgfCAgIHwgfCAgIHwgICB8ICAgICAgICAgfCAg IHwgICB8IHwgICB8IHwKKyAqICAgICAgICAgICAgICAgICAgICB8IHwgICB8IHwgICB8ICAgfCAg ICAgICAgIHwgICB8ICAgfCB8ICAgfCB8CisgKiAgICAgICAgICAgICAgICAgICAgfCArLS0tKyAr LS0tKyAgICstLS0tLS0tLS0rICAgKy0tLSsgKy0tLSsgfAorICogICAgICAgICAgICAgICAgICAg IHwgIGluaXRpYWxpemUgICAgICAgICAgICAgICAgICAgIGNsb3NlICAgIHwKKyAqICAgICAgICAg ICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisg KiA8L3ByZT4KKyAqCisgKiBVc2UgY2FzZXM6CisgKiAtIFByZXNlcnZpbmcgdGhlIGlucHV0IHNl bGVjdGlvbiByYW5nZXMgYmVmb3JlL2FmdGVyIHJlY29uY2lsaWF0aW9uLgorICogICBSZXN0b3Jp bmcgc2VsZWN0aW9uIGV2ZW4gaW4gdGhlIGV2ZW50IG9mIGFuIHVuZXhwZWN0ZWQgZXJyb3IuCisg KiAtIERlYWN0aXZhdGluZyBldmVudHMgd2hpbGUgcmVhcnJhbmdpbmcgdGhlIERPTSwgcHJldmVu dGluZyBibHVycy9mb2N1c2VzLAorICogICB3aGlsZSBndWFyYW50ZWVpbmcgdGhhdCBhZnRlcndh cmRzLCB0aGUgZXZlbnQgc3lzdGVtIGlzIHJlYWN0aXZhdGVkLgorICogLSBGbHVzaGluZyBhIHF1 ZXVlIG9mIGNvbGxlY3RlZCBET00gbXV0YXRpb25zIHRvIHRoZSBtYWluIFVJIHRocmVhZCBhZnRl ciBhCisgKiAgIHJlY29uY2lsaWF0aW9uIHRha2VzIHBsYWNlIGluIGEgd29ya2VyIHRocmVhZC4K KyAqIC0gSW52b2tpbmcgYW55IGNvbGxlY3RlZCBgY29tcG9uZW50RGlkVXBkYXRlYCBjYWxsYmFj a3MgYWZ0ZXIgcmVuZGVyaW5nIG5ldworICogICBjb250ZW50LgorICogLSAoRnV0dXJlIHVzZSBj YXNlKTogV3JhcHBpbmcgcGFydGljdWxhciBmbHVzaGVzIG9mIHRoZSBgUmVhY3RXb3JrZXJgIHF1 ZXVlCisgKiAgIHRvIHByZXNlcnZlIHRoZSBgc2Nyb2xsVG9wYCAoYW4gYXV0b21hdGljIHNjcm9s bCBhd2FyZSBET00pLgorICogLSAoRnV0dXJlIHVzZSBjYXNlKTogTGF5b3V0IGNhbGN1bGF0aW9u cyBiZWZvcmUgYW5kIGFmdGVyIERPTSB1cGRhdGVzLgorICoKKyAqIFRyYW5zYWN0aW9uYWwgcGx1 Z2luIEFQSToKKyAqIC0gQSBtb2R1bGUgdGhhdCBoYXMgYW4gYGluaXRpYWxpemVgIG1ldGhvZCB0 aGF0IHJldHVybnMgYW55IHByZWNvbXB1dGF0aW9uLgorICogLSBhbmQgYSBgY2xvc2VgIG1ldGhv ZCB0aGF0IGFjY2VwdHMgdGhlIHByZWNvbXB1dGF0aW9uLiBgY2xvc2VgIGlzIGludm9rZWQKKyAq ICAgd2hlbiB0aGUgd3JhcHBlZCBwcm9jZXNzIGlzIGNvbXBsZXRlZCwgb3IgaGFzIGZhaWxlZC4K KyAqCisgKiBAcGFyYW0ge0FycmF5PFRyYW5zYWN0aW9uYWxXcmFwcGVyPn0gdHJhbnNhY3Rpb25X cmFwcGVyIFdyYXBwZXIgbW9kdWxlcworICogdGhhdCBpbXBsZW1lbnQgYGluaXRpYWxpemVgIGFu ZCBgY2xvc2VgLgorICogQHJldHVybiB7VHJhbnNhY3Rpb259IFNpbmdsZSB0cmFuc2FjdGlvbiBm b3IgcmV1c2UgaW4gdGhyZWFkLgorICoKKyAqIEBjbGFzcyBUcmFuc2FjdGlvbgorICovCit2YXIg VHJhbnNhY3Rpb25JbXBsID0geworICAvKioKKyAgICogU2V0cyB1cCB0aGlzIGluc3RhbmNlIHNv IHRoYXQgaXQgaXMgcHJlcGFyZWQgZm9yIGNvbGxlY3RpbmcgbWV0cmljcy4gRG9lcworICAgKiBz byBzdWNoIHRoYXQgdGhpcyBzZXR1cCBtZXRob2QgbWF5IGJlIHVzZWQgb24gYW4gaW5zdGFuY2Ug dGhhdCBpcyBhbHJlYWR5CisgICAqIGluaXRpYWxpemVkLCBpbiBhIHdheSB0aGF0IGRvZXMgbm90 IGNvbnN1bWUgYWRkaXRpb25hbCBtZW1vcnkgdXBvbiByZXVzZS4KKyAgICogVGhhdCBjYW4gYmUg dXNlZnVsIGlmIHlvdSBkZWNpZGUgdG8gbWFrZSB5b3VyIHN1YmNsYXNzIG9mIHRoaXMgbWl4aW4g YQorICAgKiAiUG9vbGVkQ2xhc3MiLgorICAgKi8KKyAgcmVpbml0aWFsaXplVHJhbnNhY3Rpb246 IGZ1bmN0aW9uICgpIHsKKyAgICB0aGlzLnRyYW5zYWN0aW9uV3JhcHBlcnMgPSB0aGlzLmdldFRy YW5zYWN0aW9uV3JhcHBlcnMoKTsKKyAgICBpZiAodGhpcy53cmFwcGVySW5pdERhdGEpIHsKKyAg ICAgIHRoaXMud3JhcHBlckluaXREYXRhLmxlbmd0aCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAg IHRoaXMud3JhcHBlckluaXREYXRhID0gW107CisgICAgfQorICAgIHRoaXMuX2lzSW5UcmFuc2Fj dGlvbiA9IGZhbHNlOworICB9LAorCisgIF9pc0luVHJhbnNhY3Rpb246IGZhbHNlLAorCisgIC8q KgorICAgKiBAYWJzdHJhY3QKKyAgICogQHJldHVybiB7QXJyYXk8VHJhbnNhY3Rpb25XcmFwcGVy Pn0gQXJyYXkgb2YgdHJhbnNhY3Rpb24gd3JhcHBlcnMuCisgICAqLworICBnZXRUcmFuc2FjdGlv bldyYXBwZXJzOiBudWxsLAorCisgIGlzSW5UcmFuc2FjdGlvbjogZnVuY3Rpb24gKCkgeworICAg IHJldHVybiAhIXRoaXMuX2lzSW5UcmFuc2FjdGlvbjsKKyAgfSwKKworICAvKioKKyAgICogRXhl Y3V0ZXMgdGhlIGZ1bmN0aW9uIHdpdGhpbiBhIHNhZmV0eSB3aW5kb3cuIFVzZSB0aGlzIGZvciB0 aGUgdG9wIGxldmVsCisgICAqIG1ldGhvZHMgdGhhdCByZXN1bHQgaW4gbGFyZ2UgYW1vdW50cyBv ZiBjb21wdXRhdGlvbi9tdXRhdGlvbnMgdGhhdCB3b3VsZAorICAgKiBuZWVkIHRvIGJlIHNhZmV0 eSBjaGVja2VkLiBUaGUgb3B0aW9uYWwgYXJndW1lbnRzIGhlbHBzIHByZXZlbnQgdGhlIG5lZWQK KyAgICogdG8gYmluZCBpbiBtYW55IGNhc2VzLgorICAgKgorICAgKiBAcGFyYW0ge2Z1bmN0aW9u fSBtZXRob2QgTWVtYmVyIG9mIHNjb3BlIHRvIGNhbGwuCisgICAqIEBwYXJhbSB7T2JqZWN0fSBz Y29wZSBTY29wZSB0byBpbnZva2UgZnJvbS4KKyAgICogQHBhcmFtIHtPYmplY3Q/PX0gYSBBcmd1 bWVudCB0byBwYXNzIHRvIHRoZSBtZXRob2QuCisgICAqIEBwYXJhbSB7T2JqZWN0Pz19IGIgQXJn dW1lbnQgdG8gcGFzcyB0byB0aGUgbWV0aG9kLgorICAgKiBAcGFyYW0ge09iamVjdD89fSBjIEFy Z3VtZW50IHRvIHBhc3MgdG8gdGhlIG1ldGhvZC4KKyAgICogQHBhcmFtIHtPYmplY3Q/PX0gZCBB cmd1bWVudCB0byBwYXNzIHRvIHRoZSBtZXRob2QuCisgICAqIEBwYXJhbSB7T2JqZWN0Pz19IGUg QXJndW1lbnQgdG8gcGFzcyB0byB0aGUgbWV0aG9kLgorICAgKiBAcGFyYW0ge09iamVjdD89fSBm IEFyZ3VtZW50IHRvIHBhc3MgdG8gdGhlIG1ldGhvZC4KKyAgICoKKyAgICogQHJldHVybiB7Kn0g UmV0dXJuIHZhbHVlIGZyb20gYG1ldGhvZGAuCisgICAqLworICBwZXJmb3JtOiBmdW5jdGlvbiAo bWV0aG9kLCBzY29wZSwgYSwgYiwgYywgZCwgZSwgZikgeworICAgICEhdGhpcy5pc0luVHJhbnNh Y3Rpb24oKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlh bnQoZmFsc2UsICdUcmFuc2FjdGlvbi5wZXJmb3JtKC4uLik6IENhbm5vdCBpbml0aWFsaXplIGEg dHJhbnNhY3Rpb24gd2hlbiB0aGVyZSBpcyBhbHJlYWR5IGFuIG91dHN0YW5kaW5nIHRyYW5zYWN0 aW9uLicpIDogX3Byb2RJbnZhcmlhbnQoJzI3JykgOiB2b2lkIDA7CisgICAgdmFyIGVycm9yVGhy b3duOworICAgIHZhciByZXQ7CisgICAgdHJ5IHsKKyAgICAgIHRoaXMuX2lzSW5UcmFuc2FjdGlv biA9IHRydWU7CisgICAgICAvLyBDYXRjaGluZyBlcnJvcnMgbWFrZXMgZGVidWdnaW5nIG1vcmUg ZGlmZmljdWx0LCBzbyB3ZSBzdGFydCB3aXRoCisgICAgICAvLyBlcnJvclRocm93biBzZXQgdG8g dHJ1ZSBiZWZvcmUgc2V0dGluZyBpdCB0byBmYWxzZSBhZnRlciBjYWxsaW5nCisgICAgICAvLyBj bG9zZSAtLSBpZiBpdCdzIHN0aWxsIHNldCB0byB0cnVlIGluIHRoZSBmaW5hbGx5IGJsb2NrLCBp dCBtZWFucworICAgICAgLy8gb25lIG9mIHRoZXNlIGNhbGxzIHRocmV3LgorICAgICAgZXJyb3JU aHJvd24gPSB0cnVlOworICAgICAgdGhpcy5pbml0aWFsaXplQWxsKDApOworICAgICAgcmV0ID0g bWV0aG9kLmNhbGwoc2NvcGUsIGEsIGIsIGMsIGQsIGUsIGYpOworICAgICAgZXJyb3JUaHJvd24g PSBmYWxzZTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKGVycm9y VGhyb3duKSB7CisgICAgICAgICAgLy8gSWYgYG1ldGhvZGAgdGhyb3dzLCBwcmVmZXIgdG8gc2hv dyB0aGF0IHN0YWNrIHRyYWNlIG92ZXIgYW55IHRocm93bgorICAgICAgICAgIC8vIGJ5IGludm9r aW5nIGBjbG9zZUFsbGAuCisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRoaXMuY2xvc2VB bGwoMCk7CisgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7fQorICAgICAgICB9IGVsc2UgeworICAg ICAgICAgIC8vIFNpbmNlIGBtZXRob2RgIGRpZG4ndCB0aHJvdywgd2UgZG9uJ3Qgd2FudCB0byBz aWxlbmNlIHRoZSBleGNlcHRpb24KKyAgICAgICAgICAvLyBoZXJlLgorICAgICAgICAgIHRoaXMu Y2xvc2VBbGwoMCk7CisgICAgICAgIH0KKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIHRoaXMu X2lzSW5UcmFuc2FjdGlvbiA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0 OworICB9LAorCisgIGluaXRpYWxpemVBbGw6IGZ1bmN0aW9uIChzdGFydEluZGV4KSB7CisgICAg dmFyIHRyYW5zYWN0aW9uV3JhcHBlcnMgPSB0aGlzLnRyYW5zYWN0aW9uV3JhcHBlcnM7CisgICAg Zm9yICh2YXIgaSA9IHN0YXJ0SW5kZXg7IGkgPCB0cmFuc2FjdGlvbldyYXBwZXJzLmxlbmd0aDsg aSsrKSB7CisgICAgICB2YXIgd3JhcHBlciA9IHRyYW5zYWN0aW9uV3JhcHBlcnNbaV07CisgICAg ICB0cnkgeworICAgICAgICAvLyBDYXRjaGluZyBlcnJvcnMgbWFrZXMgZGVidWdnaW5nIG1vcmUg ZGlmZmljdWx0LCBzbyB3ZSBzdGFydCB3aXRoIHRoZQorICAgICAgICAvLyBPQlNFUlZFRF9FUlJP UiBzdGF0ZSBiZWZvcmUgb3ZlcndyaXRpbmcgaXQgd2l0aCB0aGUgcmVhbCByZXR1cm4gdmFsdWUK KyAgICAgICAgLy8gb2YgaW5pdGlhbGl6ZSAtLSBpZiBpdCdzIHN0aWxsIHNldCB0byBPQlNFUlZF RF9FUlJPUiBpbiB0aGUgZmluYWxseQorICAgICAgICAvLyBibG9jaywgaXQgbWVhbnMgd3JhcHBl ci5pbml0aWFsaXplIHRocmV3LgorICAgICAgICB0aGlzLndyYXBwZXJJbml0RGF0YVtpXSA9IE9C U0VSVkVEX0VSUk9SOworICAgICAgICB0aGlzLndyYXBwZXJJbml0RGF0YVtpXSA9IHdyYXBwZXIu aW5pdGlhbGl6ZSA/IHdyYXBwZXIuaW5pdGlhbGl6ZS5jYWxsKHRoaXMpIDogbnVsbDsKKyAgICAg IH0gZmluYWxseSB7CisgICAgICAgIGlmICh0aGlzLndyYXBwZXJJbml0RGF0YVtpXSA9PT0gT0JT RVJWRURfRVJST1IpIHsKKyAgICAgICAgICAvLyBUaGUgaW5pdGlhbGl6ZXIgZm9yIHdyYXBwZXIg aSB0aHJldyBhbiBlcnJvcjsgaW5pdGlhbGl6ZSB0aGUKKyAgICAgICAgICAvLyByZW1haW5pbmcg d3JhcHBlcnMgYnV0IHNpbGVuY2UgYW55IGV4Y2VwdGlvbnMgZnJvbSB0aGVtIHRvIGVuc3VyZQor ICAgICAgICAgIC8vIHRoYXQgdGhlIGZpcnN0IGVycm9yIGlzIHRoZSBvbmUgdG8gYnViYmxlIHVw LgorICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aGlzLmluaXRpYWxpemVBbGwoaSArIDEp OworICAgICAgICAgIH0gY2F0Y2ggKGVycikge30KKyAgICAgICAgfQorICAgICAgfQorICAgIH0K KyAgfSwKKworICAvKioKKyAgICogSW52b2tlcyBlYWNoIG9mIGB0aGlzLnRyYW5zYWN0aW9uV3Jh cHBlcnMuY2xvc2VbaV1gIGZ1bmN0aW9ucywgcGFzc2luZyBpbnRvCisgICAqIHRoZW0gdGhlIHJl c3BlY3RpdmUgcmV0dXJuIHZhbHVlcyBvZiBgdGhpcy50cmFuc2FjdGlvbldyYXBwZXJzLmluaXRb aV1gCisgICAqIChgY2xvc2VgcnMgdGhhdCBjb3JyZXNwb25kIHRvIGluaXRpYWxpemVycyB0aGF0 IGZhaWxlZCB3aWxsIG5vdCBiZQorICAgKiBpbnZva2VkKS4KKyAgICovCisgIGNsb3NlQWxsOiBm dW5jdGlvbiAoc3RhcnRJbmRleCkgeworICAgICF0aGlzLmlzSW5UcmFuc2FjdGlvbigpID8gcHJv Y2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1Ry YW5zYWN0aW9uLmNsb3NlQWxsKCk6IENhbm5vdCBjbG9zZSB0cmFuc2FjdGlvbiB3aGVuIG5vbmUg YXJlIG9wZW4uJykgOiBfcHJvZEludmFyaWFudCgnMjgnKSA6IHZvaWQgMDsKKyAgICB2YXIgdHJh bnNhY3Rpb25XcmFwcGVycyA9IHRoaXMudHJhbnNhY3Rpb25XcmFwcGVyczsKKyAgICBmb3IgKHZh ciBpID0gc3RhcnRJbmRleDsgaSA8IHRyYW5zYWN0aW9uV3JhcHBlcnMubGVuZ3RoOyBpKyspIHsK KyAgICAgIHZhciB3cmFwcGVyID0gdHJhbnNhY3Rpb25XcmFwcGVyc1tpXTsKKyAgICAgIHZhciBp bml0RGF0YSA9IHRoaXMud3JhcHBlckluaXREYXRhW2ldOworICAgICAgdmFyIGVycm9yVGhyb3du OworICAgICAgdHJ5IHsKKyAgICAgICAgLy8gQ2F0Y2hpbmcgZXJyb3JzIG1ha2VzIGRlYnVnZ2lu ZyBtb3JlIGRpZmZpY3VsdCwgc28gd2Ugc3RhcnQgd2l0aAorICAgICAgICAvLyBlcnJvclRocm93 biBzZXQgdG8gdHJ1ZSBiZWZvcmUgc2V0dGluZyBpdCB0byBmYWxzZSBhZnRlciBjYWxsaW5nCisg ICAgICAgIC8vIGNsb3NlIC0tIGlmIGl0J3Mgc3RpbGwgc2V0IHRvIHRydWUgaW4gdGhlIGZpbmFs bHkgYmxvY2ssIGl0IG1lYW5zCisgICAgICAgIC8vIHdyYXBwZXIuY2xvc2UgdGhyZXcuCisgICAg ICAgIGVycm9yVGhyb3duID0gdHJ1ZTsKKyAgICAgICAgaWYgKGluaXREYXRhICE9PSBPQlNFUlZF RF9FUlJPUiAmJiB3cmFwcGVyLmNsb3NlKSB7CisgICAgICAgICAgd3JhcHBlci5jbG9zZS5jYWxs KHRoaXMsIGluaXREYXRhKTsKKyAgICAgICAgfQorICAgICAgICBlcnJvclRocm93biA9IGZhbHNl OworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgaWYgKGVycm9yVGhyb3duKSB7CisgICAgICAg ICAgLy8gVGhlIGNsb3NlciBmb3Igd3JhcHBlciBpIHRocmV3IGFuIGVycm9yOyBjbG9zZSB0aGUg cmVtYWluaW5nCisgICAgICAgICAgLy8gd3JhcHBlcnMgYnV0IHNpbGVuY2UgYW55IGV4Y2VwdGlv bnMgZnJvbSB0aGVtIHRvIGVuc3VyZSB0aGF0IHRoZQorICAgICAgICAgIC8vIGZpcnN0IGVycm9y IGlzIHRoZSBvbmUgdG8gYnViYmxlIHVwLgorICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0 aGlzLmNsb3NlQWxsKGkgKyAxKTsKKyAgICAgICAgICB9IGNhdGNoIChlKSB7fQorICAgICAgICB9 CisgICAgICB9CisgICAgfQorICAgIHRoaXMud3JhcHBlckluaXREYXRhLmxlbmd0aCA9IDA7Cisg IH0KK307CisKK21vZHVsZS5leHBvcnRzID0gVHJhbnNhY3Rpb25JbXBsOwpcIE5vIG5ld2xpbmUg YXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVh Y3QtZG9tL2xpYi9WaWV3cG9ydE1ldHJpY3MuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9y L3JlYWN0LWRvbS9saWIvVmlld3BvcnRNZXRyaWNzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAwLi5jZmM5NDVhZQotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0 YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9WaWV3cG9ydE1ldHJpY3MuanMKQEAgLTAsMCArMSwy NiBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICog QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2Vk IHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmls ZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25h bCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMg ZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwor dmFyIFZpZXdwb3J0TWV0cmljcyA9IHsKKworICBjdXJyZW50U2Nyb2xsTGVmdDogMCwKKworICBj dXJyZW50U2Nyb2xsVG9wOiAwLAorCisgIHJlZnJlc2hTY3JvbGxWYWx1ZXM6IGZ1bmN0aW9uIChz Y3JvbGxQb3NpdGlvbikgeworICAgIFZpZXdwb3J0TWV0cmljcy5jdXJyZW50U2Nyb2xsTGVmdCA9 IHNjcm9sbFBvc2l0aW9uLng7CisgICAgVmlld3BvcnRNZXRyaWNzLmN1cnJlbnRTY3JvbGxUb3Ag PSBzY3JvbGxQb3NpdGlvbi55OworICB9CisKK307CisKK21vZHVsZS5leHBvcnRzID0gVmlld3Bv cnRNZXRyaWNzOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9w Z2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9hY2N1bXVsYXRlLmpzIGIvd2ViL3Bn YWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL2FjY3VtdWxhdGUuanMKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLmE0Yzc2M2ZlCi0tLSAvZGV2L251bGwKKysrIGIv d2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL2FjY3VtdWxhdGUuanMKQEAg LTAsMCArMSw0NSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywg SW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlz IGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJ Q0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4g YWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhl IFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogCisgKi8KKworJ3Vz ZSBzdHJpY3QnOworCit2YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZElu dmFyaWFudCcpOworCit2YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50 Jyk7CisKKy8qKgorICogQWNjdW11bGF0ZXMgaXRlbXMgdGhhdCBtdXN0IG5vdCBiZSBudWxsIG9y IHVuZGVmaW5lZC4KKyAqCisgKiBUaGlzIGlzIHVzZWQgdG8gY29uc2VydmUgbWVtb3J5IGJ5IGF2 b2lkaW5nIGFycmF5IGFsbG9jYXRpb25zLgorICoKKyAqIEByZXR1cm4geyp8YXJyYXk8Kj59IEFu IGFjY3VtdWxhdGlvbiBvZiBpdGVtcy4KKyAqLworZnVuY3Rpb24gYWNjdW11bGF0ZShjdXJyZW50 LCBuZXh0KSB7CisgICEobmV4dCAhPSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAn cHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdhY2N1bXVsYXRlKC4uLik6IEFjY3VtdWxh dGVkIGl0ZW1zIG11c3QgYmUgbm90IGJlIG51bGwgb3IgdW5kZWZpbmVkLicpIDogX3Byb2RJbnZh cmlhbnQoJzI5JykgOiB2b2lkIDA7CisKKyAgaWYgKGN1cnJlbnQgPT0gbnVsbCkgeworICAgIHJl dHVybiBuZXh0OworICB9CisKKyAgLy8gQm90aCBhcmUgbm90IGVtcHR5LiBXYXJuaW5nOiBOZXZl ciBjYWxsIHguY29uY2F0KHkpIHdoZW4geW91IGFyZSBub3QKKyAgLy8gY2VydGFpbiB0aGF0IHgg aXMgYW4gQXJyYXkgKHggY291bGQgYmUgYSBzdHJpbmcgd2l0aCBjb25jYXQgbWV0aG9kKS4KKyAg aWYgKEFycmF5LmlzQXJyYXkoY3VycmVudCkpIHsKKyAgICByZXR1cm4gY3VycmVudC5jb25jYXQo bmV4dCk7CisgIH0KKworICBpZiAoQXJyYXkuaXNBcnJheShuZXh0KSkgeworICAgIHJldHVybiBb Y3VycmVudF0uY29uY2F0KG5leHQpOworICB9CisKKyAgcmV0dXJuIFtjdXJyZW50LCBuZXh0XTsK K30KKworbW9kdWxlLmV4cG9ydHMgPSBhY2N1bXVsYXRlOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9m IGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xp Yi9hY2N1bXVsYXRlSW50by5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9t L2xpYi9hY2N1bXVsYXRlSW50by5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw MC4uOGVhOGY5ZTEKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9y L3JlYWN0LWRvbS9saWIvYWNjdW11bGF0ZUludG8uanMKQEAgLTAsMCArMSw1NyBAQAorLyoqCisg KiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyBy ZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBC U0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9v dCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICog b2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUg c2FtZSBkaXJlY3RvcnkuCisgKgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX3By b2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpOworCit2YXIgaW52 YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7CisKKy8qKgorICogQWNjdW11 bGF0ZXMgaXRlbXMgdGhhdCBtdXN0IG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZCBpbnRvIHRoZSBm aXJzdCBvbmUuIFRoaXMKKyAqIGlzIHVzZWQgdG8gY29uc2VydmUgbWVtb3J5IGJ5IGF2b2lkaW5n IGFycmF5IGFsbG9jYXRpb25zLCBhbmQgdGh1cyBzYWNyaWZpY2VzCisgKiBBUEkgY2xlYW5uZXNz LiBTaW5jZSBgY3VycmVudGAgY2FuIGJlIG51bGwgYmVmb3JlIGJlaW5nIHBhc3NlZCBpbiBhbmQg bm90CisgKiBudWxsIGFmdGVyIHRoaXMgZnVuY3Rpb24sIG1ha2Ugc3VyZSB0byBhc3NpZ24gaXQg YmFjayB0byBgY3VycmVudGA6CisgKgorICogYGEgPSBhY2N1bXVsYXRlSW50byhhLCBiKTtgCisg KgorICogVGhpcyBBUEkgc2hvdWxkIGJlIHNwYXJpbmdseSB1c2VkLiBUcnkgYGFjY3VtdWxhdGVg IGZvciBzb21ldGhpbmcgY2xlYW5lci4KKyAqCisgKiBAcmV0dXJuIHsqfGFycmF5PCo+fSBBbiBh Y2N1bXVsYXRpb24gb2YgaXRlbXMuCisgKi8KKworZnVuY3Rpb24gYWNjdW11bGF0ZUludG8oY3Vy cmVudCwgbmV4dCkgeworICAhKG5leHQgIT0gbnVsbCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAh PT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnYWNjdW11bGF0ZUludG8oLi4uKTog QWNjdW11bGF0ZWQgaXRlbXMgbXVzdCBub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuJykgOiBfcHJv ZEludmFyaWFudCgnMzAnKSA6IHZvaWQgMDsKKworICBpZiAoY3VycmVudCA9PSBudWxsKSB7Cisg ICAgcmV0dXJuIG5leHQ7CisgIH0KKworICAvLyBCb3RoIGFyZSBub3QgZW1wdHkuIFdhcm5pbmc6 IE5ldmVyIGNhbGwgeC5jb25jYXQoeSkgd2hlbiB5b3UgYXJlIG5vdAorICAvLyBjZXJ0YWluIHRo YXQgeCBpcyBhbiBBcnJheSAoeCBjb3VsZCBiZSBhIHN0cmluZyB3aXRoIGNvbmNhdCBtZXRob2Qp LgorICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50KSkgeworICAgIGlmIChBcnJheS5pc0FycmF5 KG5leHQpKSB7CisgICAgICBjdXJyZW50LnB1c2guYXBwbHkoY3VycmVudCwgbmV4dCk7CisgICAg ICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgY3VycmVudC5wdXNoKG5leHQpOworICAgIHJl dHVybiBjdXJyZW50OworICB9CisKKyAgaWYgKEFycmF5LmlzQXJyYXkobmV4dCkpIHsKKyAgICAv LyBBIGJpdCB0b28gZGFuZ2Vyb3VzIHRvIG11dGF0ZSBgbmV4dGAuCisgICAgcmV0dXJuIFtjdXJy ZW50XS5jb25jYXQobmV4dCk7CisgIH0KKworICByZXR1cm4gW2N1cnJlbnQsIG5leHRdOworfQor Cittb2R1bGUuZXhwb3J0cyA9IGFjY3VtdWxhdGVJbnRvOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9m IGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xp Yi9hZGxlcjMyLmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL2Fk bGVyMzIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLmUxNTNhZGNiCi0t LSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGli L2FkbGVyMzIuanMKQEAgLTAsMCArMSw0MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVz ZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlz IHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3Vu ZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBz b3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4g YmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgor ICogCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgTU9EID0gNjU1MjE7CisKKy8vIGFkbGVy MzIgaXMgbm90IGNyeXB0b2dyYXBoaWNhbGx5IHN0cm9uZywgYW5kIGlzIG9ubHkgdXNlZCB0byBz YW5pdHkgY2hlY2sgdGhhdAorLy8gbWFya3VwIGdlbmVyYXRlZCBvbiB0aGUgc2VydmVyIG1hdGNo ZXMgdGhlIG1hcmt1cCBnZW5lcmF0ZWQgb24gdGhlIGNsaWVudC4KKy8vIFRoaXMgaW1wbGVtZW50 YXRpb24gKGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgU2hlZXRKUyB2ZXJzaW9uKSBoYXMgYmVl biBvcHRpbWl6ZWQKKy8vIGZvciBvdXIgdXNlIGNhc2UsIGF0IHRoZSBleHBlbnNlIG9mIGNvbmZv cm1pbmcgdG8gdGhlIGFkbGVyMzIgc3BlY2lmaWNhdGlvbgorLy8gZm9yIG5vbi1hc2NpaSBpbnB1 dHMuCitmdW5jdGlvbiBhZGxlcjMyKGRhdGEpIHsKKyAgdmFyIGEgPSAxOworICB2YXIgYiA9IDA7 CisgIHZhciBpID0gMDsKKyAgdmFyIGwgPSBkYXRhLmxlbmd0aDsKKyAgdmFyIG0gPSBsICYgfjB4 MzsKKyAgd2hpbGUgKGkgPCBtKSB7CisgICAgdmFyIG4gPSBNYXRoLm1pbihpICsgNDA5NiwgbSk7 CisgICAgZm9yICg7IGkgPCBuOyBpICs9IDQpIHsKKyAgICAgIGIgKz0gKGEgKz0gZGF0YS5jaGFy Q29kZUF0KGkpKSArIChhICs9IGRhdGEuY2hhckNvZGVBdChpICsgMSkpICsgKGEgKz0gZGF0YS5j aGFyQ29kZUF0KGkgKyAyKSkgKyAoYSArPSBkYXRhLmNoYXJDb2RlQXQoaSArIDMpKTsKKyAgICB9 CisgICAgYSAlPSBNT0Q7CisgICAgYiAlPSBNT0Q7CisgIH0KKyAgZm9yICg7IGkgPCBsOyBpKysp IHsKKyAgICBiICs9IGEgKz0gZGF0YS5jaGFyQ29kZUF0KGkpOworICB9CisgIGEgJT0gTU9EOwor ICBiICU9IE1PRDsKKyAgcmV0dXJuIGEgfCBiIDw8IDE2OworfQorCittb2R1bGUuZXhwb3J0cyA9 IGFkbGVyMzI7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3Bn YWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL2NhbkRlZmluZVByb3BlcnR5LmpzIGIv d2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL2NhbkRlZmluZVByb3BlcnR5 LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi5jZGU5ZjVjNQotLS0gL2Rl di9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9jYW5E ZWZpbmVQcm9wZXJ0eS5qcwpAQCAtMCwwICsxLDI1IEBACisvKioKKyAqIENvcHlyaWdodCAyMDEz LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq IFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNl IGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0 aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRz IGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4K KyAqCisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBjYW5EZWZpbmVQcm9wZXJ0eSA9 IGZhbHNlOworaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAg dHJ5IHsKKyAgICAvLyAkRmxvd0ZpeE1lIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93 L2lzc3Vlcy8yODUKKyAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICd4JywgeyBnZXQ6IGZ1 bmN0aW9uICgpIHt9IH0pOworICAgIGNhbkRlZmluZVByb3BlcnR5ID0gdHJ1ZTsKKyAgfSBjYXRj aCAoeCkgeworICAgIC8vIElFIHdpbGwgZmFpbCBvbiBkZWZpbmVQcm9wZXJ0eQorICB9Cit9CisK K21vZHVsZS5leHBvcnRzID0gY2FuRGVmaW5lUHJvcGVydHk7ClwgTm8gbmV3bGluZSBhdCBlbmQg b2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20v bGliL2NoZWNrUmVhY3RUeXBlU3BlYy5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVh Y3QtZG9tL2xpYi9jaGVja1JlYWN0VHlwZVNwZWMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAuLjYzYzI3ZDY0Ci0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3Rh dGljL3ZlbmRvci9yZWFjdC1kb20vbGliL2NoZWNrUmVhY3RUeXBlU3BlYy5qcwpAQCAtMCwwICsx LDg2IEBACisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisg KiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5z ZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBm aWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlv bmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5U UyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOwor Cit2YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpOwor Cit2YXIgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMgPSByZXF1aXJlKCcuL1JlYWN0UHJvcFR5 cGVMb2NhdGlvbk5hbWVzJyk7Cit2YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcu L1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7CisKK3ZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpz L2xpYi9pbnZhcmlhbnQnKTsKK3ZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2Fybmlu ZycpOworCit2YXIgUmVhY3RDb21wb25lbnRUcmVlSG9vazsKKworaWYgKHR5cGVvZiBwcm9jZXNz ICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViA9 PT0gJ3Rlc3QnKSB7CisgIC8vIFRlbXBvcmFyeSBoYWNrLgorICAvLyBJbmxpbmUgcmVxdWlyZXMg ZG9uJ3Qgd29yayB3ZWxsIHdpdGggSmVzdDoKKyAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vi b29rL3JlYWN0L2lzc3Vlcy83MjQwCisgIC8vIFJlbW92ZSB0aGUgaW5saW5lIHJlcXVpcmVzIHdo ZW4gd2UgZG9uJ3QgbmVlZCB0aGVtIGFueW1vcmU6CisgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9m YWNlYm9vay9yZWFjdC9wdWxsLzcxNzgKKyAgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHJlcXVp cmUoJ3JlYWN0L2xpYi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7Cit9CisKK3ZhciBsb2dnZWRU eXBlRmFpbHVyZXMgPSB7fTsKKworLyoqCisgKiBBc3NlcnQgdGhhdCB0aGUgdmFsdWVzIG1hdGNo IHdpdGggdGhlIHR5cGUgc3BlY3MuCisgKiBFcnJvciBtZXNzYWdlcyBhcmUgbWVtb3JpemVkIGFu ZCB3aWxsIG9ubHkgYmUgc2hvd24gb25jZS4KKyAqCisgKiBAcGFyYW0ge29iamVjdH0gdHlwZVNw ZWNzIE1hcCBvZiBuYW1lIHRvIGEgUmVhY3RQcm9wVHlwZQorICogQHBhcmFtIHtvYmplY3R9IHZh bHVlcyBSdW50aW1lIHZhbHVlcyB0aGF0IG5lZWQgdG8gYmUgdHlwZS1jaGVja2VkCisgKiBAcGFy YW0ge3N0cmluZ30gbG9jYXRpb24gZS5nLiAicHJvcCIsICJjb250ZXh0IiwgImNoaWxkIGNvbnRl eHQiCisgKiBAcGFyYW0ge3N0cmluZ30gY29tcG9uZW50TmFtZSBOYW1lIG9mIHRoZSBjb21wb25l bnQgZm9yIGVycm9yIG1lc3NhZ2VzLgorICogQHBhcmFtIHs/b2JqZWN0fSBlbGVtZW50IFRoZSBS ZWFjdCBlbGVtZW50IHRoYXQgaXMgYmVpbmcgdHlwZS1jaGVja2VkCisgKiBAcGFyYW0gez9udW1i ZXJ9IGRlYnVnSUQgVGhlIFJlYWN0IGNvbXBvbmVudCBpbnN0YW5jZSB0aGF0IGlzIGJlaW5nIHR5 cGUtY2hlY2tlZAorICogQHByaXZhdGUKKyAqLworZnVuY3Rpb24gY2hlY2tSZWFjdFR5cGVTcGVj KHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgY29tcG9uZW50TmFtZSwgZWxlbWVudCwgZGVi dWdJRCkgeworICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7CisgICAgaWYg KHR5cGVTcGVjcy5oYXNPd25Qcm9wZXJ0eSh0eXBlU3BlY05hbWUpKSB7CisgICAgICB2YXIgZXJy b3I7CisgICAgICAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhl eSBkbywgd2UgZG9uJ3Qgd2FudCB0bworICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdo ZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LgorICAgICAgLy8gQWZ0ZXIg dGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LgorICAgICAg dHJ5IHsKKyAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0 IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lCisgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhv dXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS4KKyAgICAgICAg ISh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gPT09ICdmdW5jdGlvbicpID8gcHJvY2Vz cy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJyVzOiAl cyB0eXBlIGAlc2AgaXMgaW52YWxpZDsgaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZy b20gUmVhY3QuUHJvcFR5cGVzLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgUmVh Y3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dLCB0eXBlU3BlY05hbWUpIDogX3Byb2RJ bnZhcmlhbnQoJzg0JywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBSZWFjdFByb3BU eXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl0sIHR5cGVTcGVjTmFtZSkgOiB2b2lkIDA7CisgICAg ICAgIGVycm9yID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUs IGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7Cisg ICAgICB9IGNhdGNoIChleCkgeworICAgICAgICBlcnJvciA9IGV4OworICAgICAgfQorICAgICAg cHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIWVycm9yIHx8 IGVycm9yIGluc3RhbmNlb2YgRXJyb3IsICclczogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICVzIGAl c2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICsgJ2Z1bmN0aW9uIG11c3QgcmV0dXJu IGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICVzLiAnICsgJ1lvdSBtYXkgaGF2 ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgKyAn Y3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUs IGFuZCAnICsgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nLCBjb21wb25lbnROYW1l IHx8ICdSZWFjdCBjbGFzcycsIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXSwg dHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IpIDogdm9pZCAwOworICAgICAgaWYgKGVycm9yIGlu c3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvci5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykp IHsKKyAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhl cmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlCisgICAgICAgIC8vIHNhbWUgZXJyb3IuCisgICAg ICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvci5tZXNzYWdlXSA9IHRydWU7CisKKyAgICAgICAg dmFyIGNvbXBvbmVudFN0YWNrSW5mbyA9ICcnOworCisgICAgICAgIGlmIChwcm9jZXNzLmVudi5O T0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAgICAgaWYgKCFSZWFjdENvbXBvbmVu dFRyZWVIb29rKSB7CisgICAgICAgICAgICBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWly ZSgncmVhY3QvbGliL1JlYWN0Q29tcG9uZW50VHJlZUhvb2snKTsKKyAgICAgICAgICB9CisgICAg ICAgICAgaWYgKGRlYnVnSUQgIT09IG51bGwpIHsKKyAgICAgICAgICAgIGNvbXBvbmVudFN0YWNr SW5mbyA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0U3RhY2tBZGRlbmR1bUJ5SUQoZGVidWdJ RCk7CisgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50ICE9PSBudWxsKSB7CisgICAgICAgICAg ICBjb21wb25lbnRTdGFja0luZm8gPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldEN1cnJlbnRT dGFja0FkZGVuZHVtKGVsZW1lbnQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAg IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAn RmFpbGVkICVzIHR5cGU6ICVzJXMnLCBsb2NhdGlvbiwgZXJyb3IubWVzc2FnZSwgY29tcG9uZW50 U3RhY2tJbmZvKSA6IHZvaWQgMDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworbW9kdWxlLmV4 cG9ydHMgPSBjaGVja1JlYWN0VHlwZVNwZWM7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpk aWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL2NyZWF0 ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24uanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVu ZG9yL3JlYWN0LWRvbS9saWIvY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbi5qcwpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uMWVkNzZmY2YKLS0tIC9kZXYvbnVs bAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvY3JlYXRlTWlj cm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbi5qcwpAQCAtMCwwICsxLDMxIEBACisvKioKKyAqIENv cHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2Vy dmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1z dHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRp cmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBw YXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1l IGRpcmVjdG9yeS4KKyAqCisgKi8KKworLyogZ2xvYmFscyBNU0FwcCAqLworCisndXNlIHN0cmlj dCc7CisKKy8qKgorICogQ3JlYXRlIGEgZnVuY3Rpb24gd2hpY2ggaGFzICd1bnNhZmUnIHByaXZp bGVnZXMgKHJlcXVpcmVkIGJ5IHdpbmRvd3M4IGFwcHMpCisgKi8KKwordmFyIGNyZWF0ZU1pY3Jv c29mdFVuc2FmZUxvY2FsRnVuY3Rpb24gPSBmdW5jdGlvbiAoZnVuYykgeworICBpZiAodHlwZW9m IE1TQXBwICE9PSAndW5kZWZpbmVkJyAmJiBNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbikg eworICAgIHJldHVybiBmdW5jdGlvbiAoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMykgeworICAgICAg TVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKCkgeworICAgICAgICByZXR1 cm4gZnVuYyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKKyAgICAgIH0pOworICAgIH07CisgIH0g ZWxzZSB7CisgICAgcmV0dXJuIGZ1bmM7CisgIH0KK307CisKK21vZHVsZS5leHBvcnRzID0gY3Jl YXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBm aWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIv ZGFuZ2Vyb3VzU3R5bGVWYWx1ZS5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3Qt ZG9tL2xpYi9kYW5nZXJvdXNTdHlsZVZhbHVlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAwLi42OTk2ZGYyZgotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRp Yy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9kYW5nZXJvdXNTdHlsZVZhbHVlLmpzCkBAIC0wLDAgKzEs NzggQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAq IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNl ZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZp bGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9u YWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRT IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisK K3ZhciBDU1NQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vQ1NTUHJvcGVydHknKTsKK3ZhciB3YXJuaW5n ID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpOworCit2YXIgaXNVbml0bGVzc051bWJlciA9 IENTU1Byb3BlcnR5LmlzVW5pdGxlc3NOdW1iZXI7Cit2YXIgc3R5bGVXYXJuaW5ncyA9IHt9Owor CisvKioKKyAqIENvbnZlcnQgYSB2YWx1ZSBpbnRvIHRoZSBwcm9wZXIgY3NzIHdyaXRhYmxlIHZh bHVlLiBUaGUgc3R5bGUgbmFtZSBgbmFtZWAKKyAqIHNob3VsZCBiZSBsb2dpY2FsIChubyBoeXBo ZW5zKSwgYXMgc3BlY2lmaWVkCisgKiBpbiBgQ1NTUHJvcGVydHkuaXNVbml0bGVzc051bWJlcmAu CisgKgorICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgQ1NTIHByb3BlcnR5IG5hbWUgc3VjaCBhcyBg dG9wTWFyZ2luYC4KKyAqIEBwYXJhbSB7Kn0gdmFsdWUgQ1NTIHByb3BlcnR5IHZhbHVlIHN1Y2gg YXMgYDEwcHhgLgorICogQHBhcmFtIHtSZWFjdERPTUNvbXBvbmVudH0gY29tcG9uZW50CisgKiBA cmV0dXJuIHtzdHJpbmd9IE5vcm1hbGl6ZWQgc3R5bGUgdmFsdWUgd2l0aCBkaW1lbnNpb25zIGFw cGxpZWQuCisgKi8KK2Z1bmN0aW9uIGRhbmdlcm91c1N0eWxlVmFsdWUobmFtZSwgdmFsdWUsIGNv bXBvbmVudCkgeworICAvLyBOb3RlIHRoYXQgd2UndmUgcmVtb3ZlZCBlc2NhcGVUZXh0Rm9yQnJv d3NlcigpIGNhbGxzIGhlcmUgc2luY2UgdGhlCisgIC8vIHdob2xlIHN0cmluZyB3aWxsIGJlIGVz Y2FwZWQgd2hlbiB0aGUgYXR0cmlidXRlIGlzIGluamVjdGVkIGludG8KKyAgLy8gdGhlIG1hcmt1 cC4gSWYgeW91IHByb3ZpZGUgdW5zYWZlIHVzZXIgZGF0YSBoZXJlIHRoZXkgY2FuIGluamVjdAor ICAvLyBhcmJpdHJhcnkgQ1NTIHdoaWNoIG1heSBiZSBwcm9ibGVtYXRpYyAoSSBjb3VsZG4ndCBy ZXBybyB0aGlzKToKKyAgLy8gaHR0cHM6Ly93d3cub3dhc3Aub3JnL2luZGV4LnBocC9YU1NfRmls dGVyX0V2YXNpb25fQ2hlYXRfU2hlZXQKKyAgLy8gaHR0cDovL3d3dy50aGVzcGFubmVyLmNvLnVr LzIwMDcvMTEvMjYvdWx0aW1hdGUteHNzLWNzcy1pbmplY3Rpb24vCisgIC8vIFRoaXMgaXMgbm90 IGFuIFhTUyBob2xlIGJ1dCBpbnN0ZWFkIGEgcG90ZW50aWFsIENTUyBpbmplY3Rpb24gaXNzdWUK KyAgLy8gd2hpY2ggaGFzIGxlYWQgdG8gYSBncmVhdGVyIGRpc2N1c3Npb24gYWJvdXQgaG93IHdl J3JlIGdvaW5nIHRvCisgIC8vIHRydXN0IFVSTHMgbW92aW5nIGZvcndhcmQuIFNlZSAjMjExNTkw MQorCisgIHZhciBpc0VtcHR5ID0gdmFsdWUgPT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdi b29sZWFuJyB8fCB2YWx1ZSA9PT0gJyc7CisgIGlmIChpc0VtcHR5KSB7CisgICAgcmV0dXJuICcn OworICB9CisKKyAgdmFyIGlzTm9uTnVtZXJpYyA9IGlzTmFOKHZhbHVlKTsKKyAgaWYgKGlzTm9u TnVtZXJpYyB8fCB2YWx1ZSA9PT0gMCB8fCBpc1VuaXRsZXNzTnVtYmVyLmhhc093blByb3BlcnR5 KG5hbWUpICYmIGlzVW5pdGxlc3NOdW1iZXJbbmFtZV0pIHsKKyAgICByZXR1cm4gJycgKyB2YWx1 ZTsgLy8gY2FzdCB0byBzdHJpbmcKKyAgfQorCisgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJp bmcnKSB7CisgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsK KyAgICAgIC8vIEFsbG93ICcwJyB0byBwYXNzIHRocm91Z2ggd2l0aG91dCB3YXJuaW5nLiAwIGlz IGFscmVhZHkgc3BlY2lhbCBhbmQKKyAgICAgIC8vIGRvZXNuJ3QgcmVxdWlyZSB1bml0cywgc28g d2UgZG9uJ3QgbmVlZCB0byB3YXJuIGFib3V0IGl0LgorICAgICAgaWYgKGNvbXBvbmVudCAmJiB2 YWx1ZSAhPT0gJzAnKSB7CisgICAgICAgIHZhciBvd25lciA9IGNvbXBvbmVudC5fY3VycmVudEVs ZW1lbnQuX293bmVyOworICAgICAgICB2YXIgb3duZXJOYW1lID0gb3duZXIgPyBvd25lci5nZXRO YW1lKCkgOiBudWxsOworICAgICAgICBpZiAob3duZXJOYW1lICYmICFzdHlsZVdhcm5pbmdzW293 bmVyTmFtZV0pIHsKKyAgICAgICAgICBzdHlsZVdhcm5pbmdzW293bmVyTmFtZV0gPSB7fTsKKyAg ICAgICAgfQorICAgICAgICB2YXIgd2FybmVkID0gZmFsc2U7CisgICAgICAgIGlmIChvd25lck5h bWUpIHsKKyAgICAgICAgICB2YXIgd2FybmluZ3MgPSBzdHlsZVdhcm5pbmdzW293bmVyTmFtZV07 CisgICAgICAgICAgd2FybmVkID0gd2FybmluZ3NbbmFtZV07CisgICAgICAgICAgaWYgKCF3YXJu ZWQpIHsKKyAgICAgICAgICAgIHdhcm5pbmdzW25hbWVdID0gdHJ1ZTsKKyAgICAgICAgICB9Cisg ICAgICAgIH0KKyAgICAgICAgaWYgKCF3YXJuZWQpIHsKKyAgICAgICAgICBwcm9jZXNzLmVudi5O T0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2EgYCVzYCB0YWcgKG93 bmVyOiBgJXNgKSB3YXMgcGFzc2VkIGEgbnVtZXJpYyBzdHJpbmcgdmFsdWUgJyArICdmb3IgQ1NT IHByb3BlcnR5IGAlc2AgKHZhbHVlOiBgJXNgKSB3aGljaCB3aWxsIGJlIHRyZWF0ZWQgJyArICdh cyBhIHVuaXRsZXNzIG51bWJlciBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIFJlYWN0LicsIGNvbXBv bmVudC5fY3VycmVudEVsZW1lbnQudHlwZSwgb3duZXJOYW1lIHx8ICd1bmtub3duJywgbmFtZSwg dmFsdWUpIDogdm9pZCAwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHZhbHVlID0g dmFsdWUudHJpbSgpOworICB9CisgIHJldHVybiB2YWx1ZSArICdweCc7Cit9CisKK21vZHVsZS5l eHBvcnRzID0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxl CmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvZGVw cmVjYXRlZC5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9kZXBy ZWNhdGVkLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi5hYTBiNDlmYwot LS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xp Yi9kZXByZWNhdGVkLmpzCkBAIC0wLDAgKzEsNTYgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMt cHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog VGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2Ug Zm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRo aXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMg Y2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5Lgor ICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9hc3NpZ24gPSByZXF1aXJlKCdv YmplY3QtYXNzaWduJyk7CisKK3ZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2Fybmlu ZycpOworCisvKioKKyAqIFRoaXMgd2lsbCBsb2cgYSBzaW5nbGUgZGVwcmVjYXRpb24gbm90aWNl IHBlciBmdW5jdGlvbiBhbmQgZm9yd2FyZCB0aGUgY2FsbAorICogb24gdG8gdGhlIG5ldyBBUEku CisgKgorICogQHBhcmFtIHtzdHJpbmd9IGZuTmFtZSBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24K KyAqIEBwYXJhbSB7c3RyaW5nfSBuZXdNb2R1bGUgVGhlIG1vZHVsZSB0aGF0IGZuIHdpbGwgZXhp c3QgaW4KKyAqIEBwYXJhbSB7c3RyaW5nfSBuZXdQYWNrYWdlIFRoZSBtb2R1bGUgdGhhdCBmbiB3 aWxsIGV4aXN0IGluCisgKiBAcGFyYW0geyp9IGN0eCBUaGUgY29udGV4dCB0aGlzIGZvcndhcmRl ZCBjYWxsIHNob3VsZCBydW4gaW4KKyAqIEBwYXJhbSB7ZnVuY3Rpb259IGZuIFRoZSBmdW5jdGlv biB0byBmb3J3YXJkIG9uIHRvCisgKiBAcmV0dXJuIHtmdW5jdGlvbn0gVGhlIGZ1bmN0aW9uIHRo YXQgd2lsbCB3YXJuIG9uY2UgYW5kIHRoZW4gY2FsbCBmbgorICovCitmdW5jdGlvbiBkZXByZWNh dGVkKGZuTmFtZSwgbmV3TW9kdWxlLCBuZXdQYWNrYWdlLCBjdHgsIGZuKSB7CisgIHZhciB3YXJu ZWQgPSBmYWxzZTsKKyAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicp IHsKKyAgICB2YXIgbmV3Rm4gPSBmdW5jdGlvbiAoKSB7CisgICAgICBwcm9jZXNzLmVudi5OT0RF X0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyh3YXJuZWQsCisgICAgICAvKiBlc2xpbnQt ZGlzYWJsZSBuby11c2VsZXNzLWNvbmNhdCAqLworICAgICAgLy8gUmVxdWlyZSBleGFtcGxlcyBp biB0aGlzIHN0cmluZyBtdXN0IGJlIHNwbGl0IHRvIHByZXZlbnQgUmVhY3QncworICAgICAgLy8g YnVpbGQgdG9vbHMgZnJvbSBtaXN0YWtpbmcgdGhlbSBmb3IgcmVhbCByZXF1aXJlcy4KKyAgICAg IC8vIE90aGVyd2lzZSB0aGUgYnVpbGQgdG9vbHMgd2lsbCBhdHRlbXB0IHRvIGJ1aWxkIGEgJyVz JyBtb2R1bGUuCisgICAgICAnUmVhY3QuJXMgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSAlcy4l cyBmcm9tIHJlcXVpcmUnICsgJyhcJyVzXCcpICcgKyAnaW5zdGVhZC4nLCBmbk5hbWUsIG5ld01v ZHVsZSwgZm5OYW1lLCBuZXdQYWNrYWdlKSA6IHZvaWQgMDsKKyAgICAgIC8qIGVzbGludC1lbmFi bGUgbm8tdXNlbGVzcy1jb25jYXQgKi8KKyAgICAgIHdhcm5lZCA9IHRydWU7CisgICAgICByZXR1 cm4gZm4uYXBwbHkoY3R4LCBhcmd1bWVudHMpOworICAgIH07CisgICAgLy8gV2UgbmVlZCB0byBt YWtlIHN1cmUgYWxsIHByb3BlcnRpZXMgb2YgdGhlIG9yaWdpbmFsIGZuIGFyZSBjb3BpZWQgb3Zl ci4KKyAgICAvLyBJbiBwYXJ0aWN1bGFyLCB0aGlzIGlzIG5lZWRlZCB0byBzdXBwb3J0IFByb3BU eXBlcworICAgIF9hc3NpZ24obmV3Rm4sIGZuKTsKKworICAgIC8vIEZsb3cgaXMgbm90IHNtYXJ0 IGVub3VnaCB0byBmaWd1cmUgb3V0IHRoYXQgbmV3Rm4gaXMgb2YgdGhlIHNhbWUgdHlwZSBhcwor ICAgIC8vIGZuLiBTaW5jZSB3ZSBkb24ndCB3YW50IHRvIGxvc2Ugb3V0IHRoZSB0eXBlIG9mIHRo ZSBmdW5jdGlvbiwgY2FzdGluZworICAgIC8vIHRvIGFueSBhbmQgZm9yY2UgZmxvdyB0byB1c2Ug VC4KKyAgICByZXR1cm4gbmV3Rm47CisgIH0KKworICByZXR1cm4gZm47Cit9CisKK21vZHVsZS5l eHBvcnRzID0gZGVwcmVjYXRlZDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1n aXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvZXNjYXBlVGV4dENv bnRlbnRGb3JCcm93c2VyLmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20v bGliL2VzY2FwZVRleHRDb250ZW50Rm9yQnJvd3Nlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMC4uZWMyOTgxOGQKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9z dGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyLmpz CkBAIC0wLDAgKzEsMTIyIEBACisvKioKKyAqIENvcHlyaWdodCAyMDE2LXByZXNlbnQsIEZhY2Vi b29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNv ZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQor ICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVl LiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBp biB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiBCYXNlZCBv biB0aGUgZXNjYXBlLWh0bWwgbGlicmFyeSwgd2hpY2ggaXMgdXNlZCB1bmRlciB0aGUgTUlUIExp Y2Vuc2UgYmVsb3c6CisgKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMgVEogSG9sb3dheWNo dWsKKyAqIENvcHlyaWdodCAoYykgMjAxNSBBbmRyZWFzIEx1YmJlCisgKiBDb3B5cmlnaHQgKGMp IDIwMTUgVGlhbmNoZW5nICJUaW1vdGh5IiBHdQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5 IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBj b3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAo dGhlCisgKiAnU29mdHdhcmUnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0 cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1 c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNl bnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1p dCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3Vi amVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBj b3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBp bmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0 d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBX QVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJV VCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBG SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICog SU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElB QkxFIEZPUiBBTlkKKyAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhF UiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lO RyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1Ig VEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyd1 c2Ugc3RyaWN0JzsKKworLy8gY29kZSBjb3BpZWQgYW5kIG1vZGlmaWVkIGZyb20gZXNjYXBlLWh0 bWwKKy8qKgorICogTW9kdWxlIHZhcmlhYmxlcy4KKyAqIEBwcml2YXRlCisgKi8KKwordmFyIG1h dGNoSHRtbFJlZ0V4cCA9IC9bIicmPD5dLzsKKworLyoqCisgKiBFc2NhcGUgc3BlY2lhbCBjaGFy YWN0ZXJzIGluIHRoZSBnaXZlbiBzdHJpbmcgb2YgaHRtbC4KKyAqCisgKiBAcGFyYW0gIHtzdHJp bmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGVzY2FwZSBmb3IgaW5zZXJ0aW5nIGludG8gSFRNTAor ICogQHJldHVybiB7c3RyaW5nfQorICogQHB1YmxpYworICovCisKK2Z1bmN0aW9uIGVzY2FwZUh0 bWwoc3RyaW5nKSB7CisgIHZhciBzdHIgPSAnJyArIHN0cmluZzsKKyAgdmFyIG1hdGNoID0gbWF0 Y2hIdG1sUmVnRXhwLmV4ZWMoc3RyKTsKKworICBpZiAoIW1hdGNoKSB7CisgICAgcmV0dXJuIHN0 cjsKKyAgfQorCisgIHZhciBlc2NhcGU7CisgIHZhciBodG1sID0gJyc7CisgIHZhciBpbmRleCA9 IDA7CisgIHZhciBsYXN0SW5kZXggPSAwOworCisgIGZvciAoaW5kZXggPSBtYXRjaC5pbmRleDsg aW5kZXggPCBzdHIubGVuZ3RoOyBpbmRleCsrKSB7CisgICAgc3dpdGNoIChzdHIuY2hhckNvZGVB dChpbmRleCkpIHsKKyAgICAgIGNhc2UgMzQ6CisgICAgICAgIC8vICIKKyAgICAgICAgZXNjYXBl ID0gJyZxdW90Oyc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzODoKKyAgICAgICAgLy8g JgorICAgICAgICBlc2NhcGUgPSAnJmFtcDsnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Ug Mzk6CisgICAgICAgIC8vICcKKyAgICAgICAgZXNjYXBlID0gJyYjeDI3Oyc7IC8vIG1vZGlmaWVk IGZyb20gZXNjYXBlLWh0bWw7IHVzZWQgdG8gYmUgJyYjMzknCisgICAgICAgIGJyZWFrOworICAg ICAgY2FzZSA2MDoKKyAgICAgICAgLy8gPAorICAgICAgICBlc2NhcGUgPSAnJmx0Oyc7CisgICAg ICAgIGJyZWFrOworICAgICAgY2FzZSA2MjoKKyAgICAgICAgLy8gPgorICAgICAgICBlc2NhcGUg PSAnJmd0Oyc7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgY29udGlu dWU7CisgICAgfQorCisgICAgaWYgKGxhc3RJbmRleCAhPT0gaW5kZXgpIHsKKyAgICAgIGh0bWwg Kz0gc3RyLnN1YnN0cmluZyhsYXN0SW5kZXgsIGluZGV4KTsKKyAgICB9CisKKyAgICBsYXN0SW5k ZXggPSBpbmRleCArIDE7CisgICAgaHRtbCArPSBlc2NhcGU7CisgIH0KKworICByZXR1cm4gbGFz dEluZGV4ICE9PSBpbmRleCA/IGh0bWwgKyBzdHIuc3Vic3RyaW5nKGxhc3RJbmRleCwgaW5kZXgp IDogaHRtbDsKK30KKy8vIGVuZCBjb2RlIGNvcGllZCBhbmQgbW9kaWZpZWQgZnJvbSBlc2NhcGUt aHRtbAorCisKKy8qKgorICogRXNjYXBlcyB0ZXh0IHRvIHByZXZlbnQgc2NyaXB0aW5nIGF0dGFj a3MuCisgKgorICogQHBhcmFtIHsqfSB0ZXh0IFRleHQgdmFsdWUgdG8gZXNjYXBlLgorICogQHJl dHVybiB7c3RyaW5nfSBBbiBlc2NhcGVkIHN0cmluZy4KKyAqLworZnVuY3Rpb24gZXNjYXBlVGV4 dENvbnRlbnRGb3JCcm93c2VyKHRleHQpIHsKKyAgaWYgKHR5cGVvZiB0ZXh0ID09PSAnYm9vbGVh bicgfHwgdHlwZW9mIHRleHQgPT09ICdudW1iZXInKSB7CisgICAgLy8gdGhpcyBzaG9ydGNpcmN1 aXQgaGVscHMgcGVyZiBmb3IgdHlwZXMgdGhhdCB3ZSBrbm93IHdpbGwgbmV2ZXIgaGF2ZQorICAg IC8vIHNwZWNpYWwgY2hhcmFjdGVycywgZXNwZWNpYWxseSBnaXZlbiB0aGF0IHRoaXMgZnVuY3Rp b24gaXMgdXNlZCBvZnRlbgorICAgIC8vIGZvciBudW1lcmljIGRvbSBpZHMuCisgICAgcmV0dXJu ICcnICsgdGV4dDsKKyAgfQorICByZXR1cm4gZXNjYXBlSHRtbCh0ZXh0KTsKK30KKworbW9kdWxl LmV4cG9ydHMgPSBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXI7ClwgTm8gbmV3bGluZSBhdCBl bmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1k b20vbGliL2ZpbmRET01Ob2RlLmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1k b20vbGliL2ZpbmRET01Ob2RlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw Li4yYjBkZjllYgotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3Iv cmVhY3QtZG9tL2xpYi9maW5kRE9NTm9kZS5qcwpAQCAtMCwwICsxLDU5IEBACisvKioKKyAqIENv cHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2Vy dmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1z dHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRp cmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBw YXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1l IGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX3Byb2RJbnZhcmlh bnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpOworCit2YXIgUmVhY3RDdXJyZW50 T3duZXIgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3RDdXJyZW50T3duZXInKTsKK3ZhciBSZWFj dERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpOwor dmFyIFJlYWN0SW5zdGFuY2VNYXAgPSByZXF1aXJlKCcuL1JlYWN0SW5zdGFuY2VNYXAnKTsKKwor dmFyIGdldEhvc3RDb21wb25lbnRGcm9tQ29tcG9zaXRlID0gcmVxdWlyZSgnLi9nZXRIb3N0Q29t cG9uZW50RnJvbUNvbXBvc2l0ZScpOwordmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGli L2ludmFyaWFudCcpOwordmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7 CisKKy8qKgorICogUmV0dXJucyB0aGUgRE9NIG5vZGUgcmVuZGVyZWQgYnkgdGhpcyBlbGVtZW50 LgorICoKKyAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1s ZXZlbC1hcGkuaHRtbCNyZWFjdGRvbS5maW5kZG9tbm9kZQorICoKKyAqIEBwYXJhbSB7UmVhY3RD b21wb25lbnR8RE9NRWxlbWVudH0gY29tcG9uZW50T3JFbGVtZW50CisgKiBAcmV0dXJuIHs/RE9N RWxlbWVudH0gVGhlIHJvb3Qgbm9kZSBvZiB0aGlzIGVsZW1lbnQuCisgKi8KK2Z1bmN0aW9uIGZp bmRET01Ob2RlKGNvbXBvbmVudE9yRWxlbWVudCkgeworICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9F TlYgIT09ICdwcm9kdWN0aW9uJykgeworICAgIHZhciBvd25lciA9IFJlYWN0Q3VycmVudE93bmVy LmN1cnJlbnQ7CisgICAgaWYgKG93bmVyICE9PSBudWxsKSB7CisgICAgICBwcm9jZXNzLmVudi5O T0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhvd25lci5fd2FybmVkQWJvdXRSZWZz SW5SZW5kZXIsICclcyBpcyBhY2Nlc3NpbmcgZmluZERPTU5vZGUgaW5zaWRlIGl0cyByZW5kZXIo KS4gJyArICdyZW5kZXIoKSBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBz dGF0ZS4gSXQgc2hvdWxkICcgKyAnbmV2ZXIgYWNjZXNzIHNvbWV0aGluZyB0aGF0IHJlcXVpcmVz IHN0YWxlIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgJyArICdyZW5kZXIsIHN1Y2ggYXMgcmVmcy4g TW92ZSB0aGlzIGxvZ2ljIHRvIGNvbXBvbmVudERpZE1vdW50IGFuZCAnICsgJ2NvbXBvbmVudERp ZFVwZGF0ZSBpbnN0ZWFkLicsIG93bmVyLmdldE5hbWUoKSB8fCAnQSBjb21wb25lbnQnKSA6IHZv aWQgMDsKKyAgICAgIG93bmVyLl93YXJuZWRBYm91dFJlZnNJblJlbmRlciA9IHRydWU7CisgICAg fQorICB9CisgIGlmIChjb21wb25lbnRPckVsZW1lbnQgPT0gbnVsbCkgeworICAgIHJldHVybiBu dWxsOworICB9CisgIGlmIChjb21wb25lbnRPckVsZW1lbnQubm9kZVR5cGUgPT09IDEpIHsKKyAg ICByZXR1cm4gY29tcG9uZW50T3JFbGVtZW50OworICB9CisKKyAgdmFyIGluc3QgPSBSZWFjdElu c3RhbmNlTWFwLmdldChjb21wb25lbnRPckVsZW1lbnQpOworICBpZiAoaW5zdCkgeworICAgIGlu c3QgPSBnZXRIb3N0Q29tcG9uZW50RnJvbUNvbXBvc2l0ZShpbnN0KTsKKyAgICByZXR1cm4gaW5z dCA/IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpIDogbnVs bDsKKyAgfQorCisgIGlmICh0eXBlb2YgY29tcG9uZW50T3JFbGVtZW50LnJlbmRlciA9PT0gJ2Z1 bmN0aW9uJykgeworICAgICFmYWxzZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVj dGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdmaW5kRE9NTm9kZSB3YXMgY2FsbGVkIG9uIGFuIHVu bW91bnRlZCBjb21wb25lbnQuJykgOiBfcHJvZEludmFyaWFudCgnNDQnKSA6IHZvaWQgMDsKKyAg fSBlbHNlIHsKKyAgICAhZmFsc2UgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rp b24nID8gaW52YXJpYW50KGZhbHNlLCAnRWxlbWVudCBhcHBlYXJzIHRvIGJlIG5laXRoZXIgUmVh Y3RDb21wb25lbnQgbm9yIERPTU5vZGUgKGtleXM6ICVzKScsIE9iamVjdC5rZXlzKGNvbXBvbmVu dE9yRWxlbWVudCkpIDogX3Byb2RJbnZhcmlhbnQoJzQ1JywgT2JqZWN0LmtleXMoY29tcG9uZW50 T3JFbGVtZW50KSkgOiB2b2lkIDA7CisgIH0KK30KKworbW9kdWxlLmV4cG9ydHMgPSBmaW5kRE9N Tm9kZTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1p bi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvZmxhdHRlbkNoaWxkcmVuLmpzIGIvd2ViL3Bn YWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL2ZsYXR0ZW5DaGlsZHJlbi5qcwpuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uMzhiOWVhZGMKLS0tIC9kZXYvbnVsbAor KysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvZmxhdHRlbkNoaWxk cmVuLmpzCkBAIC0wLDAgKzEsNzUgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwg RmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3Vy Y2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4g dGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNl IHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZv dW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAor ICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIEtleUVzY2FwZVV0aWxzID0gcmVxdWlyZSgnLi9L ZXlFc2NhcGVVdGlscycpOwordmFyIHRyYXZlcnNlQWxsQ2hpbGRyZW4gPSByZXF1aXJlKCcuL3Ry YXZlcnNlQWxsQ2hpbGRyZW4nKTsKK3ZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2Fy bmluZycpOworCit2YXIgUmVhY3RDb21wb25lbnRUcmVlSG9vazsKKworaWYgKHR5cGVvZiBwcm9j ZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudiAmJiBwcm9jZXNzLmVudi5OT0RFX0VO ViA9PT0gJ3Rlc3QnKSB7CisgIC8vIFRlbXBvcmFyeSBoYWNrLgorICAvLyBJbmxpbmUgcmVxdWly ZXMgZG9uJ3Qgd29yayB3ZWxsIHdpdGggSmVzdDoKKyAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zh Y2Vib29rL3JlYWN0L2lzc3Vlcy83MjQwCisgIC8vIFJlbW92ZSB0aGUgaW5saW5lIHJlcXVpcmVz IHdoZW4gd2UgZG9uJ3QgbmVlZCB0aGVtIGFueW1vcmU6CisgIC8vIGh0dHBzOi8vZ2l0aHViLmNv bS9mYWNlYm9vay9yZWFjdC9wdWxsLzcxNzgKKyAgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHJl cXVpcmUoJ3JlYWN0L2xpYi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7Cit9CisKKy8qKgorICog QHBhcmFtIHtmdW5jdGlvbn0gdHJhdmVyc2VDb250ZXh0IENvbnRleHQgcGFzc2VkIHRocm91Z2gg dHJhdmVyc2FsLgorICogQHBhcmFtIHs/UmVhY3RDb21wb25lbnR9IGNoaWxkIFJlYWN0IGNoaWxk IGNvbXBvbmVudC4KKyAqIEBwYXJhbSB7IXN0cmluZ30gbmFtZSBTdHJpbmcgbmFtZSBvZiBrZXkg cGF0aCB0byBjaGlsZC4KKyAqIEBwYXJhbSB7bnVtYmVyPX0gc2VsZkRlYnVnSUQgT3B0aW9uYWwg ZGVidWdJRCBvZiB0aGUgY3VycmVudCBpbnRlcm5hbCBpbnN0YW5jZS4KKyAqLworZnVuY3Rpb24g ZmxhdHRlblNpbmdsZUNoaWxkSW50b0NvbnRleHQodHJhdmVyc2VDb250ZXh0LCBjaGlsZCwgbmFt ZSwgc2VsZkRlYnVnSUQpIHsKKyAgLy8gV2UgZm91bmQgYSBjb21wb25lbnQgaW5zdGFuY2UuCisg IGlmICh0cmF2ZXJzZUNvbnRleHQgJiYgdHlwZW9mIHRyYXZlcnNlQ29udGV4dCA9PT0gJ29iamVj dCcpIHsKKyAgICB2YXIgcmVzdWx0ID0gdHJhdmVyc2VDb250ZXh0OworICAgIHZhciBrZXlVbmlx dWUgPSByZXN1bHRbbmFtZV0gPT09IHVuZGVmaW5lZDsKKyAgICBpZiAocHJvY2Vzcy5lbnYuTk9E RV9FTlYgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgaWYgKCFSZWFjdENvbXBvbmVudFRyZWVI b29rKSB7CisgICAgICAgIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSByZXF1aXJlKCdyZWFjdC9s aWIvUmVhY3RDb21wb25lbnRUcmVlSG9vaycpOworICAgICAgfQorICAgICAgaWYgKCFrZXlVbmlx dWUpIHsKKyAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdh cm5pbmcoZmFsc2UsICdmbGF0dGVuQ2hpbGRyZW4oLi4uKTogRW5jb3VudGVyZWQgdHdvIGNoaWxk cmVuIHdpdGggdGhlIHNhbWUga2V5LCAnICsgJ2Alc2AuIENoaWxkIGtleXMgbXVzdCBiZSB1bmlx dWU7IHdoZW4gdHdvIGNoaWxkcmVuIHNoYXJlIGEga2V5LCBvbmx5ICcgKyAndGhlIGZpcnN0IGNo aWxkIHdpbGwgYmUgdXNlZC4lcycsIEtleUVzY2FwZVV0aWxzLnVuZXNjYXBlKG5hbWUpLCBSZWFj dENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKHNlbGZEZWJ1Z0lEKSkgOiB2 b2lkIDA7CisgICAgICB9CisgICAgfQorICAgIGlmIChrZXlVbmlxdWUgJiYgY2hpbGQgIT0gbnVs bCkgeworICAgICAgcmVzdWx0W25hbWVdID0gY2hpbGQ7CisgICAgfQorICB9Cit9CisKKy8qKgor ICogRmxhdHRlbnMgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJv cHMuY2hpbGRyZW5gLiBBbnkgbnVsbAorICogY2hpbGRyZW4gd2lsbCBub3QgYmUgaW5jbHVkZWQg aW4gdGhlIHJlc3VsdGluZyBvYmplY3QuCisgKiBAcmV0dXJuIHshb2JqZWN0fSBmbGF0dGVuZWQg Y2hpbGRyZW4ga2V5ZWQgYnkgbmFtZS4KKyAqLworZnVuY3Rpb24gZmxhdHRlbkNoaWxkcmVuKGNo aWxkcmVuLCBzZWxmRGVidWdJRCkgeworICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgeworICAgIHJl dHVybiBjaGlsZHJlbjsKKyAgfQorICB2YXIgcmVzdWx0ID0ge307CisKKyAgaWYgKHByb2Nlc3Mu ZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICB0cmF2ZXJzZUFsbENoaWxkcmVu KGNoaWxkcmVuLCBmdW5jdGlvbiAodHJhdmVyc2VDb250ZXh0LCBjaGlsZCwgbmFtZSkgeworICAg ICAgcmV0dXJuIGZsYXR0ZW5TaW5nbGVDaGlsZEludG9Db250ZXh0KHRyYXZlcnNlQ29udGV4dCwg Y2hpbGQsIG5hbWUsIHNlbGZEZWJ1Z0lEKTsKKyAgICB9LCByZXN1bHQpOworICB9IGVsc2Ugewor ICAgIHRyYXZlcnNlQWxsQ2hpbGRyZW4oY2hpbGRyZW4sIGZsYXR0ZW5TaW5nbGVDaGlsZEludG9D b250ZXh0LCByZXN1bHQpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK21vZHVsZS5leHBv cnRzID0gZmxhdHRlbkNoaWxkcmVuOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAt LWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9mb3JFYWNoQWNj dW11bGF0ZWQuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvZm9y RWFjaEFjY3VtdWxhdGVkLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi4z N2IxMjY2MAotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVh Y3QtZG9tL2xpYi9mb3JFYWNoQWNjdW11bGF0ZWQuanMKQEAgLTAsMCArMSwzMCBAQAorLyoqCisg KiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyBy ZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBC U0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9v dCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICog b2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUg c2FtZSBkaXJlY3RvcnkuCisgKgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOworCisvKioKKyAq IEBwYXJhbSB7YXJyYXl9IGFyciBhbiAiYWNjdW11bGF0aW9uIiBvZiBpdGVtcyB3aGljaCBpcyBl aXRoZXIgYW4gQXJyYXkgb3IKKyAqIGEgc2luZ2xlIGl0ZW0uIFVzZWZ1bCB3aGVuIHBhaXJlZCB3 aXRoIHRoZSBgYWNjdW11bGF0ZWAgbW9kdWxlLiBUaGlzIGlzIGEKKyAqIHNpbXBsZSB1dGlsaXR5 IHRoYXQgYWxsb3dzIHVzIHRvIHJlYXNvbiBhYm91dCBhIGNvbGxlY3Rpb24gb2YgaXRlbXMsIGJ1 dAorICogaGFuZGxpbmcgdGhlIGNhc2Ugd2hlbiB0aGVyZSBpcyBleGFjdGx5IG9uZSBpdGVtIChh bmQgd2UgZG8gbm90IG5lZWQgdG8KKyAqIGFsbG9jYXRlIGFuIGFycmF5KS4KKyAqLworCitmdW5j dGlvbiBmb3JFYWNoQWNjdW11bGF0ZWQoYXJyLCBjYiwgc2NvcGUpIHsKKyAgaWYgKEFycmF5Lmlz QXJyYXkoYXJyKSkgeworICAgIGFyci5mb3JFYWNoKGNiLCBzY29wZSk7CisgIH0gZWxzZSBpZiAo YXJyKSB7CisgICAgY2IuY2FsbChzY29wZSwgYXJyKTsKKyAgfQorfQorCittb2R1bGUuZXhwb3J0 cyA9IGZvckVhY2hBY2N1bXVsYXRlZDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYg LS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvZ2V0RXZlbnRD aGFyQ29kZS5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9nZXRF dmVudENoYXJDb2RlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi4wZmZm ODZiOAotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3Qt ZG9tL2xpYi9nZXRFdmVudENoYXJDb2RlLmpzCkBAIC0wLDAgKzEsNDkgQEAKKy8qKgorICogQ29w eXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2 ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0 eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGly ZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBh dGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUg ZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKKy8qKgorICogYGNoYXJDb2Rl YCByZXByZXNlbnRzIHRoZSBhY3R1YWwgImNoYXJhY3RlciBjb2RlIiBhbmQgaXMgc2FmZSB0byB1 c2Ugd2l0aAorICogYFN0cmluZy5mcm9tQ2hhckNvZGVgLiBBcyBzdWNoLCBvbmx5IGtleXMgdGhh dCBjb3JyZXNwb25kIHRvIHByaW50YWJsZQorICogY2hhcmFjdGVycyBwcm9kdWNlIGEgdmFsaWQg YGNoYXJDb2RlYCwgdGhlIG9ubHkgZXhjZXB0aW9uIHRvIHRoaXMgaXMgRW50ZXIuCisgKiBUaGUg VGFiLWtleSBpcyBjb25zaWRlcmVkIG5vbi1wcmludGFibGUgYW5kIGRvZXMgbm90IGhhdmUgYSBg Y2hhckNvZGVgLAorICogcHJlc3VtYWJseSBiZWNhdXNlIGl0IGRvZXMgbm90IHByb2R1Y2UgYSB0 YWItY2hhcmFjdGVyIGluIGJyb3dzZXJzLgorICoKKyAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVF dmVudCBOYXRpdmUgYnJvd3NlciBldmVudC4KKyAqIEByZXR1cm4ge251bWJlcn0gTm9ybWFsaXpl ZCBgY2hhckNvZGVgIHByb3BlcnR5LgorICovCisKK2Z1bmN0aW9uIGdldEV2ZW50Q2hhckNvZGUo bmF0aXZlRXZlbnQpIHsKKyAgdmFyIGNoYXJDb2RlOworICB2YXIga2V5Q29kZSA9IG5hdGl2ZUV2 ZW50LmtleUNvZGU7CisKKyAgaWYgKCdjaGFyQ29kZScgaW4gbmF0aXZlRXZlbnQpIHsKKyAgICBj aGFyQ29kZSA9IG5hdGl2ZUV2ZW50LmNoYXJDb2RlOworCisgICAgLy8gRkYgZG9lcyBub3Qgc2V0 IGBjaGFyQ29kZWAgZm9yIHRoZSBFbnRlci1rZXksIGNoZWNrIGFnYWluc3QgYGtleUNvZGVgLgor ICAgIGlmIChjaGFyQ29kZSA9PT0gMCAmJiBrZXlDb2RlID09PSAxMykgeworICAgICAgY2hhckNv ZGUgPSAxMzsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gSUU4IGRvZXMgbm90IGltcGxlbWVu dCBgY2hhckNvZGVgLCBidXQgYGtleUNvZGVgIGhhcyB0aGUgY29ycmVjdCB2YWx1ZS4KKyAgICBj aGFyQ29kZSA9IGtleUNvZGU7CisgIH0KKworICAvLyBTb21lIG5vbi1wcmludGFibGUga2V5cyBh cmUgcmVwb3J0ZWQgaW4gYGNoYXJDb2RlYC9ga2V5Q29kZWAsIGRpc2NhcmQgdGhlbS4KKyAgLy8g TXVzdCBub3QgZGlzY2FyZCB0aGUgKG5vbi0pcHJpbnRhYmxlIEVudGVyLWtleS4KKyAgaWYgKGNo YXJDb2RlID49IDMyIHx8IGNoYXJDb2RlID09PSAxMykgeworICAgIHJldHVybiBjaGFyQ29kZTsK KyAgfQorCisgIHJldHVybiAwOworfQorCittb2R1bGUuZXhwb3J0cyA9IGdldEV2ZW50Q2hhckNv ZGU7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4v c3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL2dldEV2ZW50S2V5LmpzIGIvd2ViL3BnYWRtaW4v c3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL2dldEV2ZW50S2V5LmpzCm5ldyBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDAwMDAwMDAwLi5hZDkyYmJkNAotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9w Z2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9nZXRFdmVudEtleS5qcwpAQCAtMCww ICsxLDEwMSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5j LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxp Y2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VO U0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRk aXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBB VEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0 JzsKKwordmFyIGdldEV2ZW50Q2hhckNvZGUgPSByZXF1aXJlKCcuL2dldEV2ZW50Q2hhckNvZGUn KTsKKworLyoqCisgKiBOb3JtYWxpemF0aW9uIG9mIGRlcHJlY2F0ZWQgSFRNTDUgYGtleWAgdmFs dWVzCisgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2Vi L0FQSS9LZXlib2FyZEV2ZW50I0tleV9uYW1lcworICovCit2YXIgbm9ybWFsaXplS2V5ID0gewor ICAnRXNjJzogJ0VzY2FwZScsCisgICdTcGFjZWJhcic6ICcgJywKKyAgJ0xlZnQnOiAnQXJyb3dM ZWZ0JywKKyAgJ1VwJzogJ0Fycm93VXAnLAorICAnUmlnaHQnOiAnQXJyb3dSaWdodCcsCisgICdE b3duJzogJ0Fycm93RG93bicsCisgICdEZWwnOiAnRGVsZXRlJywKKyAgJ1dpbic6ICdPUycsCisg ICdNZW51JzogJ0NvbnRleHRNZW51JywKKyAgJ0FwcHMnOiAnQ29udGV4dE1lbnUnLAorICAnU2Ny b2xsJzogJ1Njcm9sbExvY2snLAorICAnTW96UHJpbnRhYmxlS2V5JzogJ1VuaWRlbnRpZmllZCcK K307CisKKy8qKgorICogVHJhbnNsYXRpb24gZnJvbSBsZWdhY3kgYGtleUNvZGVgIHRvIEhUTUw1 IGBrZXlgCisgKiBPbmx5IHNwZWNpYWwga2V5cyBzdXBwb3J0ZWQsIGFsbCBvdGhlcnMgZGVwZW5k IG9uIGtleWJvYXJkIGxheW91dCBvciBicm93c2VyCisgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVy Lm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50I0tleV9uYW1lcwor ICovCit2YXIgdHJhbnNsYXRlVG9LZXkgPSB7CisgIDg6ICdCYWNrc3BhY2UnLAorICA5OiAnVGFi JywKKyAgMTI6ICdDbGVhcicsCisgIDEzOiAnRW50ZXInLAorICAxNjogJ1NoaWZ0JywKKyAgMTc6 ICdDb250cm9sJywKKyAgMTg6ICdBbHQnLAorICAxOTogJ1BhdXNlJywKKyAgMjA6ICdDYXBzTG9j aycsCisgIDI3OiAnRXNjYXBlJywKKyAgMzI6ICcgJywKKyAgMzM6ICdQYWdlVXAnLAorICAzNDog J1BhZ2VEb3duJywKKyAgMzU6ICdFbmQnLAorICAzNjogJ0hvbWUnLAorICAzNzogJ0Fycm93TGVm dCcsCisgIDM4OiAnQXJyb3dVcCcsCisgIDM5OiAnQXJyb3dSaWdodCcsCisgIDQwOiAnQXJyb3dE b3duJywKKyAgNDU6ICdJbnNlcnQnLAorICA0NjogJ0RlbGV0ZScsCisgIDExMjogJ0YxJywgMTEz OiAnRjInLCAxMTQ6ICdGMycsIDExNTogJ0Y0JywgMTE2OiAnRjUnLCAxMTc6ICdGNicsCisgIDEx ODogJ0Y3JywgMTE5OiAnRjgnLCAxMjA6ICdGOScsIDEyMTogJ0YxMCcsIDEyMjogJ0YxMScsIDEy MzogJ0YxMicsCisgIDE0NDogJ051bUxvY2snLAorICAxNDU6ICdTY3JvbGxMb2NrJywKKyAgMjI0 OiAnTWV0YScKK307CisKKy8qKgorICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2 ZSBicm93c2VyIGV2ZW50LgorICogQHJldHVybiB7c3RyaW5nfSBOb3JtYWxpemVkIGBrZXlgIHBy b3BlcnR5LgorICovCitmdW5jdGlvbiBnZXRFdmVudEtleShuYXRpdmVFdmVudCkgeworICBpZiAo bmF0aXZlRXZlbnQua2V5KSB7CisgICAgLy8gTm9ybWFsaXplIGluY29uc2lzdGVudCB2YWx1ZXMg cmVwb3J0ZWQgYnkgYnJvd3NlcnMgZHVlIHRvCisgICAgLy8gaW1wbGVtZW50YXRpb25zIG9mIGEg d29ya2luZyBkcmFmdCBzcGVjaWZpY2F0aW9uLgorCisgICAgLy8gRmlyZUZveCBpbXBsZW1lbnRz IGBrZXlgIGJ1dCByZXR1cm5zIGBNb3pQcmludGFibGVLZXlgIGZvciBhbGwKKyAgICAvLyBwcmlu dGFibGUgY2hhcmFjdGVycyAobm9ybWFsaXplZCB0byBgVW5pZGVudGlmaWVkYCksIGlnbm9yZSBp dC4KKyAgICB2YXIga2V5ID0gbm9ybWFsaXplS2V5W25hdGl2ZUV2ZW50LmtleV0gfHwgbmF0aXZl RXZlbnQua2V5OworICAgIGlmIChrZXkgIT09ICdVbmlkZW50aWZpZWQnKSB7CisgICAgICByZXR1 cm4ga2V5OworICAgIH0KKyAgfQorCisgIC8vIEJyb3dzZXIgZG9lcyBub3QgaW1wbGVtZW50IGBr ZXlgLCBwb2x5ZmlsbCBhcyBtdWNoIG9mIGl0IGFzIHdlIGNhbi4KKyAgaWYgKG5hdGl2ZUV2ZW50 LnR5cGUgPT09ICdrZXlwcmVzcycpIHsKKyAgICB2YXIgY2hhckNvZGUgPSBnZXRFdmVudENoYXJD b2RlKG5hdGl2ZUV2ZW50KTsKKworICAgIC8vIFRoZSBlbnRlci1rZXkgaXMgdGVjaG5pY2FsbHkg Ym90aCBwcmludGFibGUgYW5kIG5vbi1wcmludGFibGUgYW5kIGNhbgorICAgIC8vIHRodXMgYmUg Y2FwdHVyZWQgYnkgYGtleXByZXNzYCwgbm8gb3RoZXIgbm9uLXByaW50YWJsZSBrZXkgc2hvdWxk LgorICAgIHJldHVybiBjaGFyQ29kZSA9PT0gMTMgPyAnRW50ZXInIDogU3RyaW5nLmZyb21DaGFy Q29kZShjaGFyQ29kZSk7CisgIH0KKyAgaWYgKG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXlkb3du JyB8fCBuYXRpdmVFdmVudC50eXBlID09PSAna2V5dXAnKSB7CisgICAgLy8gV2hpbGUgdXNlciBr ZXlib2FyZCBsYXlvdXQgZGV0ZXJtaW5lcyB0aGUgYWN0dWFsIG1lYW5pbmcgb2YgZWFjaAorICAg IC8vIGBrZXlDb2RlYCB2YWx1ZSwgYWxtb3N0IGFsbCBmdW5jdGlvbiBrZXlzIGhhdmUgYSB1bml2 ZXJzYWwgdmFsdWUuCisgICAgcmV0dXJuIHRyYW5zbGF0ZVRvS2V5W25hdGl2ZUV2ZW50LmtleUNv ZGVdIHx8ICdVbmlkZW50aWZpZWQnOworICB9CisgIHJldHVybiAnJzsKK30KKworbW9kdWxlLmV4 cG9ydHMgPSBnZXRFdmVudEtleTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1n aXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvZ2V0RXZlbnRNb2Rp ZmllclN0YXRlLmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL2dl dEV2ZW50TW9kaWZpZXJTdGF0ZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw MC4uYzhhNjhmY2IKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9y L3JlYWN0LWRvbS9saWIvZ2V0RXZlbnRNb2RpZmllclN0YXRlLmpzCkBAIC0wLDAgKzEsNDIgQEAK Ky8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCBy aWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRl ciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4g dGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3Jh bnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUg aW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKKy8qKgor ICogVHJhbnNsYXRpb24gZnJvbSBtb2RpZmllciBrZXkgdG8gdGhlIGFzc29jaWF0ZWQgcHJvcGVy dHkgaW4gdGhlIGV2ZW50LgorICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwt My1FdmVudHMvI2tleXMtTW9kaWZpZXJzCisgKi8KKwordmFyIG1vZGlmaWVyS2V5VG9Qcm9wID0g eworICAnQWx0JzogJ2FsdEtleScsCisgICdDb250cm9sJzogJ2N0cmxLZXknLAorICAnTWV0YSc6 ICdtZXRhS2V5JywKKyAgJ1NoaWZ0JzogJ3NoaWZ0S2V5JworfTsKKworLy8gSUU4IGRvZXMgbm90 IGltcGxlbWVudCBnZXRNb2RpZmllclN0YXRlIHNvIHdlIHNpbXBseSBtYXAgaXQgdG8gdGhlIG9u bHkKKy8vIG1vZGlmaWVyIGtleXMgZXhwb3NlZCBieSB0aGUgZXZlbnQgaXRzZWxmLCBkb2VzIG5v dCBzdXBwb3J0IExvY2sta2V5cy4KKy8vIEN1cnJlbnRseSwgYWxsIG1ham9yIGJyb3dzZXJzIGV4 Y2VwdCBDaHJvbWUgc2VlbXMgdG8gc3VwcG9ydCBMb2NrLWtleXMuCitmdW5jdGlvbiBtb2RpZmll clN0YXRlR2V0dGVyKGtleUFyZykgeworICB2YXIgc3ludGhldGljRXZlbnQgPSB0aGlzOworICB2 YXIgbmF0aXZlRXZlbnQgPSBzeW50aGV0aWNFdmVudC5uYXRpdmVFdmVudDsKKyAgaWYgKG5hdGl2 ZUV2ZW50LmdldE1vZGlmaWVyU3RhdGUpIHsKKyAgICByZXR1cm4gbmF0aXZlRXZlbnQuZ2V0TW9k aWZpZXJTdGF0ZShrZXlBcmcpOworICB9CisgIHZhciBrZXlQcm9wID0gbW9kaWZpZXJLZXlUb1By b3Bba2V5QXJnXTsKKyAgcmV0dXJuIGtleVByb3AgPyAhIW5hdGl2ZUV2ZW50W2tleVByb3BdIDog ZmFsc2U7Cit9CisKK2Z1bmN0aW9uIGdldEV2ZW50TW9kaWZpZXJTdGF0ZShuYXRpdmVFdmVudCkg eworICByZXR1cm4gbW9kaWZpZXJTdGF0ZUdldHRlcjsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBn ZXRFdmVudE1vZGlmaWVyU3RhdGU7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0t Z2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL2dldEV2ZW50VGFy Z2V0LmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL2dldEV2ZW50 VGFyZ2V0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi4zN2ZkM2FkOQot LS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xp Yi9nZXRFdmVudFRhcmdldC5qcwpAQCAtMCwwICsxLDM0IEBACisvKioKKyAqIENvcHlyaWdodCAy MDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK KyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNl bnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBv ZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmln aHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9y eS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCisvKioKKyAqIEdldHMgdGhlIHRhcmdldCBu b2RlIGZyb20gYSBuYXRpdmUgYnJvd3NlciBldmVudCBieSBhY2NvdW50aW5nIGZvcgorICogaW5j b25zaXN0ZW5jaWVzIGluIGJyb3dzZXIgRE9NIEFQSXMuCisgKgorICogQHBhcmFtIHtvYmplY3R9 IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LgorICogQHJldHVybiB7RE9NRXZlbnRU YXJnZXR9IFRhcmdldCBub2RlLgorICovCisKK2Z1bmN0aW9uIGdldEV2ZW50VGFyZ2V0KG5hdGl2 ZUV2ZW50KSB7CisgIHZhciB0YXJnZXQgPSBuYXRpdmVFdmVudC50YXJnZXQgfHwgbmF0aXZlRXZl bnQuc3JjRWxlbWVudCB8fCB3aW5kb3c7CisKKyAgLy8gTm9ybWFsaXplIFNWRyA8dXNlPiBlbGVt ZW50IGV2ZW50cyAjNDk2MworICBpZiAodGFyZ2V0LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KSB7 CisgICAgdGFyZ2V0ID0gdGFyZ2V0LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50OworICB9CisKKyAg Ly8gU2FmYXJpIG1heSBmaXJlIGV2ZW50cyBvbiB0ZXh0IG5vZGVzIChOb2RlLlRFWFRfTk9ERSBp cyAzKS4KKyAgLy8gQHNlZSBodHRwOi8vd3d3LnF1aXJrc21vZGUub3JnL2pzL2V2ZW50c19wcm9w ZXJ0aWVzLmh0bWwKKyAgcmV0dXJuIHRhcmdldC5ub2RlVHlwZSA9PT0gMyA/IHRhcmdldC5wYXJl bnROb2RlIDogdGFyZ2V0OworfQorCittb2R1bGUuZXhwb3J0cyA9IGdldEV2ZW50VGFyZ2V0Owpc IE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRp Yy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9nZXRIb3N0Q29tcG9uZW50RnJvbUNvbXBvc2l0ZS5qcyBi L3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9nZXRIb3N0Q29tcG9uZW50 RnJvbUNvbXBvc2l0ZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uNzIy Y2RmYjcKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0 LWRvbS9saWIvZ2V0SG9zdENvbXBvbmVudEZyb21Db21wb3NpdGUuanMKQEAgLTAsMCArMSwyOSBA QAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxs IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVu ZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBp biB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBn cmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmls ZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFy IFJlYWN0Tm9kZVR5cGVzID0gcmVxdWlyZSgnLi9SZWFjdE5vZGVUeXBlcycpOworCitmdW5jdGlv biBnZXRIb3N0Q29tcG9uZW50RnJvbUNvbXBvc2l0ZShpbnN0KSB7CisgIHZhciB0eXBlOworCisg IHdoaWxlICgodHlwZSA9IGluc3QuX3JlbmRlcmVkTm9kZVR5cGUpID09PSBSZWFjdE5vZGVUeXBl cy5DT01QT1NJVEUpIHsKKyAgICBpbnN0ID0gaW5zdC5fcmVuZGVyZWRDb21wb25lbnQ7CisgIH0K KworICBpZiAodHlwZSA9PT0gUmVhY3ROb2RlVHlwZXMuSE9TVCkgeworICAgIHJldHVybiBpbnN0 Ll9yZW5kZXJlZENvbXBvbmVudDsKKyAgfSBlbHNlIGlmICh0eXBlID09PSBSZWFjdE5vZGVUeXBl cy5FTVBUWSkgeworICAgIHJldHVybiBudWxsOworICB9Cit9CisKK21vZHVsZS5leHBvcnRzID0g Z2V0SG9zdENvbXBvbmVudEZyb21Db21wb3NpdGU7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmls ZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL2dl dEl0ZXJhdG9yRm4uanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIv Z2V0SXRlcmF0b3JGbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uOTVl ZWQ0MjIKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0 LWRvbS9saWIvZ2V0SXRlcmF0b3JGbi5qcwpAQCAtMCwwICsxLDQwIEBACisvKioKKyAqIENvcHly aWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVk LgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHls ZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVj dG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRl bnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRp cmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisKKy8qIGdsb2JhbCBTeW1i b2wgKi8KKwordmFyIElURVJBVE9SX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlv bicgJiYgU3ltYm9sLml0ZXJhdG9yOwordmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRl cmF0b3InOyAvLyBCZWZvcmUgU3ltYm9sIHNwZWMuCisKKy8qKgorICogUmV0dXJucyB0aGUgaXRl cmF0b3IgbWV0aG9kIGZ1bmN0aW9uIGNvbnRhaW5lZCBvbiB0aGUgaXRlcmFibGUgb2JqZWN0Lgor ICoKKyAqIEJlIHN1cmUgdG8gaW52b2tlIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBpdGVyYWJsZSBh cyBjb250ZXh0OgorICoKKyAqICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obXlJ dGVyYWJsZSk7CisgKiAgICAgaWYgKGl0ZXJhdG9yRm4pIHsKKyAqICAgICAgIHZhciBpdGVyYXRv ciA9IGl0ZXJhdG9yRm4uY2FsbChteUl0ZXJhYmxlKTsKKyAqICAgICAgIC4uLgorICogICAgIH0K KyAqCisgKiBAcGFyYW0gez9vYmplY3R9IG1heWJlSXRlcmFibGUKKyAqIEByZXR1cm4gez9mdW5j dGlvbn0KKyAqLworZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7CisgIHZh ciBpdGVyYXRvckZuID0gbWF5YmVJdGVyYWJsZSAmJiAoSVRFUkFUT1JfU1lNQk9MICYmIG1heWJl SXRlcmFibGVbSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1Jf U1lNQk9MXSk7CisgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykgeworICAg IHJldHVybiBpdGVyYXRvckZuOworICB9Cit9CisKK21vZHVsZS5leHBvcnRzID0gZ2V0SXRlcmF0 b3JGbjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1p bi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvZ2V0TmV4dERlYnVnSUQuanMgYi93ZWIvcGdh ZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvZ2V0TmV4dERlYnVnSUQuanMKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjI4Y2Q3OGE3Ci0tLSAvZGV2L251bGwKKysr IGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL2dldE5leHREZWJ1Z0lE LmpzCkBAIC0wLDAgKzEsMjAgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFj ZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2Ug Y29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhl CisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRy ZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5k IGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAorICov CisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIG5leHREZWJ1Z0lEID0gMTsKKworZnVuY3Rpb24gZ2V0 TmV4dERlYnVnSUQoKSB7CisgIHJldHVybiBuZXh0RGVidWdJRCsrOworfQorCittb2R1bGUuZXhw b3J0cyA9IGdldE5leHREZWJ1Z0lEOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAt LWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9nZXROb2RlRm9y Q2hhcmFjdGVyT2Zmc2V0LmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20v bGliL2dldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAuLjM0Y2EzMzc1Ci0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3Rh dGljL3ZlbmRvci9yZWFjdC1kb20vbGliL2dldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQuanMKQEAg LTAsMCArMSw3MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywg SW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlz IGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJ Q0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4g YWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhl IFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3Ry aWN0JzsKKworLyoqCisgKiBHaXZlbiBhbnkgbm9kZSByZXR1cm4gdGhlIGZpcnN0IGxlYWYgbm9k ZSB3aXRob3V0IGNoaWxkcmVuLgorICoKKyAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9k ZX0gbm9kZQorICogQHJldHVybiB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0KKyAqLworCitmdW5j dGlvbiBnZXRMZWFmTm9kZShub2RlKSB7CisgIHdoaWxlIChub2RlICYmIG5vZGUuZmlyc3RDaGls ZCkgeworICAgIG5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7CisgIH0KKyAgcmV0dXJuIG5vZGU7Cit9 CisKKy8qKgorICogR2V0IHRoZSBuZXh0IHNpYmxpbmcgd2l0aGluIGEgY29udGFpbmVyLiBUaGlz IHdpbGwgd2FsayB1cCB0aGUKKyAqIERPTSBpZiBhIG5vZGUncyBzaWJsaW5ncyBoYXZlIGJlZW4g ZXhoYXVzdGVkLgorICoKKyAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZQor ICogQHJldHVybiB7P0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9CisgKi8KK2Z1bmN0aW9uIGdldFNp YmxpbmdOb2RlKG5vZGUpIHsKKyAgd2hpbGUgKG5vZGUpIHsKKyAgICBpZiAobm9kZS5uZXh0U2li bGluZykgeworICAgICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7CisgICAgfQorICAgIG5vZGUg PSBub2RlLnBhcmVudE5vZGU7CisgIH0KK30KKworLyoqCisgKiBHZXQgb2JqZWN0IGRlc2NyaWJp bmcgdGhlIG5vZGVzIHdoaWNoIGNvbnRhaW4gY2hhcmFjdGVycyBhdCBvZmZzZXQuCisgKgorICog QHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSByb290CisgKiBAcGFyYW0ge251bWJlcn0g b2Zmc2V0CisgKiBAcmV0dXJuIHs/b2JqZWN0fQorICovCitmdW5jdGlvbiBnZXROb2RlRm9yQ2hh cmFjdGVyT2Zmc2V0KHJvb3QsIG9mZnNldCkgeworICB2YXIgbm9kZSA9IGdldExlYWZOb2RlKHJv b3QpOworICB2YXIgbm9kZVN0YXJ0ID0gMDsKKyAgdmFyIG5vZGVFbmQgPSAwOworCisgIHdoaWxl IChub2RlKSB7CisgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHsKKyAgICAgIG5vZGVFbmQg PSBub2RlU3RhcnQgKyBub2RlLnRleHRDb250ZW50Lmxlbmd0aDsKKworICAgICAgaWYgKG5vZGVT dGFydCA8PSBvZmZzZXQgJiYgbm9kZUVuZCA+PSBvZmZzZXQpIHsKKyAgICAgICAgcmV0dXJuIHsK KyAgICAgICAgICBub2RlOiBub2RlLAorICAgICAgICAgIG9mZnNldDogb2Zmc2V0IC0gbm9kZVN0 YXJ0CisgICAgICAgIH07CisgICAgICB9CisKKyAgICAgIG5vZGVTdGFydCA9IG5vZGVFbmQ7Cisg ICAgfQorCisgICAgbm9kZSA9IGdldExlYWZOb2RlKGdldFNpYmxpbmdOb2RlKG5vZGUpKTsKKyAg fQorfQorCittb2R1bGUuZXhwb3J0cyA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQ7ClwgTm8g bmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3Zl bmRvci9yZWFjdC1kb20vbGliL2dldFRlc3REb2N1bWVudC5qcyBiL3dlYi9wZ2FkbWluL3N0YXRp Yy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9nZXRUZXN0RG9jdW1lbnQuanMKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMDAuLjJkNWM1NzM3Ci0tLSAvZGV2L251bGwKKysrIGIvd2ViL3Bn YWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL2dldFRlc3REb2N1bWVudC5qcwpAQCAt MCwwICsxLDIwIEBACisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJ bmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMg bGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElD RU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBh ZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUg UEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJp Y3QnOworCitmdW5jdGlvbiBnZXRUZXN0RG9jdW1lbnQobWFya3VwKSB7CisgIGRvY3VtZW50Lm9w ZW4oKTsKKyAgZG9jdW1lbnQud3JpdGUobWFya3VwIHx8ICc8IWRvY3R5cGUgaHRtbD48aHRtbD48 bWV0YSBjaGFyc2V0PXV0Zi04Pjx0aXRsZT50ZXN0IGRvYzwvdGl0bGU+Jyk7CisgIGRvY3VtZW50 LmNsb3NlKCk7CisgIHJldHVybiBkb2N1bWVudDsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBnZXRU ZXN0RG9jdW1lbnQ7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2Vi L3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL2dldFRleHRDb250ZW50QWNjZXNz b3IuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvZ2V0VGV4dENv bnRlbnRBY2Nlc3Nvci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uYjIy Njc2OTkKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0 LWRvbS9saWIvZ2V0VGV4dENvbnRlbnRBY2Nlc3Nvci5qcwpAQCAtMCwwICsxLDMyIEBACisvKioK KyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRz IHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhl IEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSBy b290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50Cisg KiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRo ZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgRXhlY3V0 aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcp OworCit2YXIgY29udGVudEtleSA9IG51bGw7CisKKy8qKgorICogR2V0cyB0aGUga2V5IHVzZWQg dG8gYWNjZXNzIHRleHQgY29udGVudCBvbiBhIERPTSBub2RlLgorICoKKyAqIEByZXR1cm4gez9z dHJpbmd9IEtleSB1c2VkIHRvIGFjY2VzcyB0ZXh0IGNvbnRlbnQuCisgKiBAaW50ZXJuYWwKKyAq LworZnVuY3Rpb24gZ2V0VGV4dENvbnRlbnRBY2Nlc3NvcigpIHsKKyAgaWYgKCFjb250ZW50S2V5 ICYmIEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSkgeworICAgIC8vIFByZWZlciB0ZXh0 Q29udGVudCB0byBpbm5lclRleHQgYmVjYXVzZSBtYW55IGJyb3dzZXJzIHN1cHBvcnQgYm90aCBi dXQKKyAgICAvLyBTVkcgPHRleHQ+IGVsZW1lbnRzIGRvbid0IHN1cHBvcnQgaW5uZXJUZXh0IGV2 ZW4gd2hlbiA8ZGl2PiBkb2VzLgorICAgIGNvbnRlbnRLZXkgPSAndGV4dENvbnRlbnQnIGluIGRv Y3VtZW50LmRvY3VtZW50RWxlbWVudCA/ICd0ZXh0Q29udGVudCcgOiAnaW5uZXJUZXh0JzsKKyAg fQorICByZXR1cm4gY29udGVudEtleTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBnZXRUZXh0Q29u dGVudEFjY2Vzc29yOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dl Yi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9nZXRWZW5kb3JQcmVmaXhlZEV2 ZW50TmFtZS5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9nZXRW ZW5kb3JQcmVmaXhlZEV2ZW50TmFtZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw MDAwMC4uNGIwNTE0NDIKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVu ZG9yL3JlYWN0LWRvbS9saWIvZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUuanMKQEAgLTAsMCAr MSwxMDAgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4K KyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNl bnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNF IGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0 aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRF TlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7 CisKK3ZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlv bkVudmlyb25tZW50Jyk7CisKKy8qKgorICogR2VuZXJhdGUgYSBtYXBwaW5nIG9mIHN0YW5kYXJk IHZlbmRvciBwcmVmaXhlcyB1c2luZyB0aGUgZGVmaW5lZCBzdHlsZSBwcm9wZXJ0eSBhbmQgZXZl bnQgbmFtZS4KKyAqCisgKiBAcGFyYW0ge3N0cmluZ30gc3R5bGVQcm9wCisgKiBAcGFyYW0ge3N0 cmluZ30gZXZlbnROYW1lCisgKiBAcmV0dXJucyB7b2JqZWN0fQorICovCitmdW5jdGlvbiBtYWtl UHJlZml4TWFwKHN0eWxlUHJvcCwgZXZlbnROYW1lKSB7CisgIHZhciBwcmVmaXhlcyA9IHt9Owor CisgIHByZWZpeGVzW3N0eWxlUHJvcC50b0xvd2VyQ2FzZSgpXSA9IGV2ZW50TmFtZS50b0xvd2Vy Q2FzZSgpOworICBwcmVmaXhlc1snV2Via2l0JyArIHN0eWxlUHJvcF0gPSAnd2Via2l0JyArIGV2 ZW50TmFtZTsKKyAgcHJlZml4ZXNbJ01veicgKyBzdHlsZVByb3BdID0gJ21veicgKyBldmVudE5h bWU7CisgIHByZWZpeGVzWydtcycgKyBzdHlsZVByb3BdID0gJ01TJyArIGV2ZW50TmFtZTsKKyAg cHJlZml4ZXNbJ08nICsgc3R5bGVQcm9wXSA9ICdvJyArIGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgp OworCisgIHJldHVybiBwcmVmaXhlczsKK30KKworLyoqCisgKiBBIGxpc3Qgb2YgZXZlbnQgbmFt ZXMgdG8gYSBjb25maWd1cmFibGUgbGlzdCBvZiB2ZW5kb3IgcHJlZml4ZXMuCisgKi8KK3ZhciB2 ZW5kb3JQcmVmaXhlcyA9IHsKKyAgYW5pbWF0aW9uZW5kOiBtYWtlUHJlZml4TWFwKCdBbmltYXRp b24nLCAnQW5pbWF0aW9uRW5kJyksCisgIGFuaW1hdGlvbml0ZXJhdGlvbjogbWFrZVByZWZpeE1h cCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvbkl0ZXJhdGlvbicpLAorICBhbmltYXRpb25zdGFydDog bWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvblN0YXJ0JyksCisgIHRyYW5zaXRp b25lbmQ6IG1ha2VQcmVmaXhNYXAoJ1RyYW5zaXRpb24nLCAnVHJhbnNpdGlvbkVuZCcpCit9Owor CisvKioKKyAqIEV2ZW50IG5hbWVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gZGV0ZWN0ZWQgYW5k IHByZWZpeGVkIChpZiBhcHBsaWNhYmxlKS4KKyAqLwordmFyIHByZWZpeGVkRXZlbnROYW1lcyA9 IHt9OworCisvKioKKyAqIEVsZW1lbnQgdG8gY2hlY2sgZm9yIHByZWZpeGVzIG9uLgorICovCit2 YXIgc3R5bGUgPSB7fTsKKworLyoqCisgKiBCb290c3RyYXAgaWYgYSBET00gZXhpc3RzLgorICov CitpZiAoRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NKSB7CisgIHN0eWxlID0gZG9jdW1l bnQuY3JlYXRlRWxlbWVudCgnZGl2Jykuc3R5bGU7CisKKyAgLy8gT24gc29tZSBwbGF0Zm9ybXMs IGluIHBhcnRpY3VsYXIgc29tZSByZWxlYXNlcyBvZiBBbmRyb2lkIDQueCwKKyAgLy8gdGhlIHVu LXByZWZpeGVkICJhbmltYXRpb24iIGFuZCAidHJhbnNpdGlvbiIgcHJvcGVydGllcyBhcmUgZGVm aW5lZCBvbiB0aGUKKyAgLy8gc3R5bGUgb2JqZWN0IGJ1dCB0aGUgZXZlbnRzIHRoYXQgZmlyZSB3 aWxsIHN0aWxsIGJlIHByZWZpeGVkLCBzbyB3ZSBuZWVkCisgIC8vIHRvIGNoZWNrIGlmIHRoZSB1 bi1wcmVmaXhlZCBldmVudHMgYXJlIHVzYWJsZSwgYW5kIGlmIG5vdCByZW1vdmUgdGhlbSBmcm9t IHRoZSBtYXAuCisgIGlmICghKCdBbmltYXRpb25FdmVudCcgaW4gd2luZG93KSkgeworICAgIGRl bGV0ZSB2ZW5kb3JQcmVmaXhlcy5hbmltYXRpb25lbmQuYW5pbWF0aW9uOworICAgIGRlbGV0ZSB2 ZW5kb3JQcmVmaXhlcy5hbmltYXRpb25pdGVyYXRpb24uYW5pbWF0aW9uOworICAgIGRlbGV0ZSB2 ZW5kb3JQcmVmaXhlcy5hbmltYXRpb25zdGFydC5hbmltYXRpb247CisgIH0KKworICAvLyBTYW1l IGFzIGFib3ZlCisgIGlmICghKCdUcmFuc2l0aW9uRXZlbnQnIGluIHdpbmRvdykpIHsKKyAgICBk ZWxldGUgdmVuZG9yUHJlZml4ZXMudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uOworICB9Cit9CisK Ky8qKgorICogQXR0ZW1wdHMgdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHZlbmRvciBwcmVmaXhl ZCBldmVudCBuYW1lLgorICoKKyAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUKKyAqIEByZXR1 cm5zIHtzdHJpbmd9CisgKi8KK2Z1bmN0aW9uIGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKGV2 ZW50TmFtZSkgeworICBpZiAocHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV0pIHsKKyAgICBy ZXR1cm4gcHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV07CisgIH0gZWxzZSBpZiAoIXZlbmRv clByZWZpeGVzW2V2ZW50TmFtZV0pIHsKKyAgICByZXR1cm4gZXZlbnROYW1lOworICB9CisKKyAg dmFyIHByZWZpeE1hcCA9IHZlbmRvclByZWZpeGVzW2V2ZW50TmFtZV07CisKKyAgZm9yICh2YXIg c3R5bGVQcm9wIGluIHByZWZpeE1hcCkgeworICAgIGlmIChwcmVmaXhNYXAuaGFzT3duUHJvcGVy dHkoc3R5bGVQcm9wKSAmJiBzdHlsZVByb3AgaW4gc3R5bGUpIHsKKyAgICAgIHJldHVybiBwcmVm aXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXSA9IHByZWZpeE1hcFtzdHlsZVByb3BdOworICAgIH0K KyAgfQorCisgIHJldHVybiAnJzsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBnZXRWZW5kb3JQcmVm aXhlZEV2ZW50TmFtZTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93 ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvaW5zdGFudGlhdGVSZWFjdENv bXBvbmVudC5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9pbnN0 YW50aWF0ZVJlYWN0Q29tcG9uZW50LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAwLi43ZjM2MGYyYQotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5k b3IvcmVhY3QtZG9tL2xpYi9pbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50LmpzCkBAIC0wLDAgKzEs MTI3IEBACisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisg KiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5z ZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBm aWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlv bmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5U UyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOwor Cit2YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpLAor ICAgIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7CisKK3ZhciBSZWFjdENvbXBv c2l0ZUNvbXBvbmVudCA9IHJlcXVpcmUoJy4vUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKTsKK3Zh ciBSZWFjdEVtcHR5Q29tcG9uZW50ID0gcmVxdWlyZSgnLi9SZWFjdEVtcHR5Q29tcG9uZW50Jyk7 Cit2YXIgUmVhY3RIb3N0Q29tcG9uZW50ID0gcmVxdWlyZSgnLi9SZWFjdEhvc3RDb21wb25lbnQn KTsKKwordmFyIGdldE5leHREZWJ1Z0lEID0gcmVxdWlyZSgnLi9nZXROZXh0RGVidWdJRCcpOwor dmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpOwordmFyIHdhcm5p bmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7CisKKy8vIFRvIGF2b2lkIGEgY3ljbGlj IGRlcGVuZGVuY3ksIHdlIGNyZWF0ZSB0aGUgZmluYWwgY2xhc3MgaW4gdGhpcyBtb2R1bGUKK3Zh ciBSZWFjdENvbXBvc2l0ZUNvbXBvbmVudFdyYXBwZXIgPSBmdW5jdGlvbiAoZWxlbWVudCkgewor ICB0aGlzLmNvbnN0cnVjdChlbGVtZW50KTsKK307CitfYXNzaWduKFJlYWN0Q29tcG9zaXRlQ29t cG9uZW50V3JhcHBlci5wcm90b3R5cGUsIFJlYWN0Q29tcG9zaXRlQ29tcG9uZW50LCB7CisgIF9p bnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50OiBpbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50Cit9KTsK KworZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKG93bmVyKSB7CisgIGlmIChv d25lcikgeworICAgIHZhciBuYW1lID0gb3duZXIuZ2V0TmFtZSgpOworICAgIGlmIChuYW1lKSB7 CisgICAgICByZXR1cm4gJyBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAn YC4nOworICAgIH0KKyAgfQorICByZXR1cm4gJyc7Cit9CisKKy8qKgorICogQ2hlY2sgaWYgdGhl IHR5cGUgcmVmZXJlbmNlIGlzIGEga25vd24gaW50ZXJuYWwgdHlwZS4gSS5lLiBub3QgYSB1c2Vy CisgKiBwcm92aWRlZCBjb21wb3NpdGUgdHlwZS4KKyAqCisgKiBAcGFyYW0ge2Z1bmN0aW9ufSB0 eXBlCisgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIHZhbGlk IGludGVybmFsIHR5cGUuCisgKi8KK2Z1bmN0aW9uIGlzSW50ZXJuYWxDb21wb25lbnRUeXBlKHR5 cGUpIHsKKyAgcmV0dXJuIHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB0eXBl LnByb3RvdHlwZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHR5cGUucHJvdG90eXBlLm1vdW50 Q29tcG9uZW50ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB0eXBlLnByb3RvdHlwZS5yZWNlaXZl Q29tcG9uZW50ID09PSAnZnVuY3Rpb24nOworfQorCisvKioKKyAqIEdpdmVuIGEgUmVhY3ROb2Rl LCBjcmVhdGUgYW4gaW5zdGFuY2UgdGhhdCB3aWxsIGFjdHVhbGx5IGJlIG1vdW50ZWQuCisgKgor ICogQHBhcmFtIHtSZWFjdE5vZGV9IG5vZGUKKyAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkSGF2 ZURlYnVnSUQKKyAqIEByZXR1cm4ge29iamVjdH0gQSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGVsZW1l bnQncyBjb25zdHJ1Y3Rvci4KKyAqIEBwcm90ZWN0ZWQKKyAqLworZnVuY3Rpb24gaW5zdGFudGlh dGVSZWFjdENvbXBvbmVudChub2RlLCBzaG91bGRIYXZlRGVidWdJRCkgeworICB2YXIgaW5zdGFu Y2U7CisKKyAgaWYgKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gZmFsc2UpIHsKKyAgICBpbnN0 YW5jZSA9IFJlYWN0RW1wdHlDb21wb25lbnQuY3JlYXRlKGluc3RhbnRpYXRlUmVhY3RDb21wb25l bnQpOworICB9IGVsc2UgaWYgKHR5cGVvZiBub2RlID09PSAnb2JqZWN0JykgeworICAgIHZhciBl bGVtZW50ID0gbm9kZTsKKyAgICB2YXIgdHlwZSA9IGVsZW1lbnQudHlwZTsKKyAgICBpZiAodHlw ZW9mIHR5cGUgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHR5cGUgIT09ICdzdHJpbmcnKSB7Cisg ICAgICB2YXIgaW5mbyA9ICcnOworICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAn cHJvZHVjdGlvbicpIHsKKyAgICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2Yg dHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5s ZW5ndGggPT09IDApIHsKKyAgICAgICAgICBpbmZvICs9ICcgWW91IGxpa2VseSBmb3Jnb3QgdG8g ZXhwb3J0IHlvdXIgY29tcG9uZW50IGZyb20gdGhlIGZpbGUgJyArICdpdFwncyBkZWZpbmVkIGlu Lic7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGluZm8gKz0gZ2V0RGVjbGFyYXRpb25FcnJv ckFkZGVuZHVtKGVsZW1lbnQuX293bmVyKTsKKyAgICAgICFmYWxzZSA/IHByb2Nlc3MuZW52Lk5P REVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFbGVtZW50IHR5cGUg aXMgaW52YWxpZDogZXhwZWN0ZWQgYSBzdHJpbmcgKGZvciBidWlsdC1pbiBjb21wb25lbnRzKSBv ciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlIGNvbXBvbmVudHMpIGJ1dCBnb3Q6ICVz LiVzJywgdHlwZSA9PSBudWxsID8gdHlwZSA6IHR5cGVvZiB0eXBlLCBpbmZvKSA6IF9wcm9kSW52 YXJpYW50KCcxMzAnLCB0eXBlID09IG51bGwgPyB0eXBlIDogdHlwZW9mIHR5cGUsIGluZm8pIDog dm9pZCAwOworICAgIH0KKworICAgIC8vIFNwZWNpYWwgY2FzZSBzdHJpbmcgdmFsdWVzCisgICAg aWYgKHR5cGVvZiBlbGVtZW50LnR5cGUgPT09ICdzdHJpbmcnKSB7CisgICAgICBpbnN0YW5jZSA9 IFJlYWN0SG9zdENvbXBvbmVudC5jcmVhdGVJbnRlcm5hbENvbXBvbmVudChlbGVtZW50KTsKKyAg ICB9IGVsc2UgaWYgKGlzSW50ZXJuYWxDb21wb25lbnRUeXBlKGVsZW1lbnQudHlwZSkpIHsKKyAg ICAgIC8vIFRoaXMgaXMgdGVtcG9yYXJpbHkgYXZhaWxhYmxlIGZvciBjdXN0b20gY29tcG9uZW50 cyB0aGF0IGFyZSBub3Qgc3RyaW5nCisgICAgICAvLyByZXByZXNlbnRhdGlvbnMuIEkuZS4gQVJU LiBPbmNlIHRob3NlIGFyZSB1cGRhdGVkIHRvIHVzZSB0aGUgc3RyaW5nCisgICAgICAvLyByZXBy ZXNlbnRhdGlvbiwgd2UgY2FuIGRyb3AgdGhpcyBjb2RlIHBhdGguCisgICAgICBpbnN0YW5jZSA9 IG5ldyBlbGVtZW50LnR5cGUoZWxlbWVudCk7CisKKyAgICAgIC8vIFdlIHJlbmFtZWQgdGhpcy4g QWxsb3cgdGhlIG9sZCBuYW1lIGZvciBjb21wYXQuIDooCisgICAgICBpZiAoIWluc3RhbmNlLmdl dEhvc3ROb2RlKSB7CisgICAgICAgIGluc3RhbmNlLmdldEhvc3ROb2RlID0gaW5zdGFuY2UuZ2V0 TmF0aXZlTm9kZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaW5zdGFuY2UgPSBuZXcg UmVhY3RDb21wb3NpdGVDb21wb25lbnRXcmFwcGVyKGVsZW1lbnQpOworICAgIH0KKyAgfSBlbHNl IGlmICh0eXBlb2Ygbm9kZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG5vZGUgPT09ICdudW1iZXIn KSB7CisgICAgaW5zdGFuY2UgPSBSZWFjdEhvc3RDb21wb25lbnQuY3JlYXRlSW5zdGFuY2VGb3JU ZXh0KG5vZGUpOworICB9IGVsc2UgeworICAgICFmYWxzZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5W ICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFbmNvdW50ZXJlZCBpbnZhbGlk IFJlYWN0IG5vZGUgb2YgdHlwZSAlcycsIHR5cGVvZiBub2RlKSA6IF9wcm9kSW52YXJpYW50KCcx MzEnLCB0eXBlb2Ygbm9kZSkgOiB2b2lkIDA7CisgIH0KKworICBpZiAocHJvY2Vzcy5lbnYuTk9E RV9FTlYgIT09ICdwcm9kdWN0aW9uJykgeworICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAn cHJvZHVjdGlvbicgPyB3YXJuaW5nKHR5cGVvZiBpbnN0YW5jZS5tb3VudENvbXBvbmVudCA9PT0g J2Z1bmN0aW9uJyAmJiB0eXBlb2YgaW5zdGFuY2UucmVjZWl2ZUNvbXBvbmVudCA9PT0gJ2Z1bmN0 aW9uJyAmJiB0eXBlb2YgaW5zdGFuY2UuZ2V0SG9zdE5vZGUgPT09ICdmdW5jdGlvbicgJiYgdHlw ZW9mIGluc3RhbmNlLnVubW91bnRDb21wb25lbnQgPT09ICdmdW5jdGlvbicsICdPbmx5IFJlYWN0 IENvbXBvbmVudHMgY2FuIGJlIG1vdW50ZWQuJykgOiB2b2lkIDA7CisgIH0KKworICAvLyBUaGVz ZSB0d28gZmllbGRzIGFyZSB1c2VkIGJ5IHRoZSBET00gYW5kIEFSVCBkaWZmaW5nIGFsZ29yaXRo bXMKKyAgLy8gcmVzcGVjdGl2ZWx5LiBJbnN0ZWFkIG9mIHVzaW5nIGV4cGFuZG9zIG9uIGNvbXBv bmVudHMsIHdlIHNob3VsZCBiZQorICAvLyBzdG9yaW5nIHRoZSBzdGF0ZSBuZWVkZWQgYnkgdGhl IGRpZmZpbmcgYWxnb3JpdGhtcyBlbHNld2hlcmUuCisgIGluc3RhbmNlLl9tb3VudEluZGV4ID0g MDsKKyAgaW5zdGFuY2UuX21vdW50SW1hZ2UgPSBudWxsOworCisgIGlmIChwcm9jZXNzLmVudi5O T0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgaW5zdGFuY2UuX2RlYnVnSUQgPSBzaG91 bGRIYXZlRGVidWdJRCA/IGdldE5leHREZWJ1Z0lEKCkgOiAwOworICB9CisKKyAgLy8gSW50ZXJu YWwgaW5zdGFuY2VzIHNob3VsZCBmdWxseSBjb25zdHJ1Y3RlZCBhdCB0aGlzIHBvaW50LCBzbyB0 aGV5IHNob3VsZAorICAvLyBub3QgZ2V0IGFueSBuZXcgZmllbGRzIGFkZGVkIHRvIHRoZW0gYXQg dGhpcyBwb2ludC4KKyAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicp IHsKKyAgICBpZiAoT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKSB7CisgICAgICBPYmplY3QucHJl dmVudEV4dGVuc2lvbnMoaW5zdGFuY2UpOworICAgIH0KKyAgfQorCisgIHJldHVybiBpbnN0YW5j ZTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBpbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50OwpcIE5v IG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92 ZW5kb3IvcmVhY3QtZG9tL2xpYi9pc0V2ZW50U3VwcG9ydGVkLmpzIGIvd2ViL3BnYWRtaW4vc3Rh dGljL3ZlbmRvci9yZWFjdC1kb20vbGliL2lzRXZlbnRTdXBwb3J0ZWQuanMKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLmY4MGQ3ZWJlCi0tLSAvZGV2L251bGwKKysrIGIvd2Vi L3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL2lzRXZlbnRTdXBwb3J0ZWQuanMK QEAgLTAsMCArMSw1OSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9v aywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2Rl IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAq IExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4g QW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4g dGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ug c3RyaWN0JzsKKwordmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0gcmVxdWlyZSgnZmJqcy9saWIv RXhlY3V0aW9uRW52aXJvbm1lbnQnKTsKKwordmFyIHVzZUhhc0ZlYXR1cmU7CitpZiAoRXhlY3V0 aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NKSB7CisgIHVzZUhhc0ZlYXR1cmUgPSBkb2N1bWVudC5p bXBsZW1lbnRhdGlvbiAmJiBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlICYmCisg IC8vIGFsd2F5cyByZXR1cm5zIHRydWUgaW4gbmV3ZXIgYnJvd3NlcnMgYXMgcGVyIHRoZSBzdGFu ZGFyZC4KKyAgLy8gQHNlZSBodHRwOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLWRvbWltcGxl bWVudGF0aW9uLWhhc2ZlYXR1cmUKKyAgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVy ZSgnJywgJycpICE9PSB0cnVlOworfQorCisvKioKKyAqIENoZWNrcyBpZiBhbiBldmVudCBpcyBz dXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGVudmlyb25tZW50LgorICoKKyAqIE5P VEU6IFRoaXMgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkgZm9yIG5vbi1nZW5lcmljIGV2ZW50cyBz dWNoIGFzIGBjaGFuZ2VgLAorICogYHJlc2V0YCwgYGxvYWRgLCBgZXJyb3JgLCBhbmQgYHNlbGVj dGAuCisgKgorICogQm9ycm93cyBmcm9tIE1vZGVybml6ci4KKyAqCisgKiBAcGFyYW0ge3N0cmlu Z30gZXZlbnROYW1lU3VmZml4IEV2ZW50IG5hbWUsIGUuZy4gImNsaWNrIi4KKyAqIEBwYXJhbSB7 P2Jvb2xlYW59IGNhcHR1cmUgQ2hlY2sgaWYgdGhlIGNhcHR1cmUgcGhhc2UgaXMgc3VwcG9ydGVk LgorICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZXZlbnQgaXMgc3VwcG9ydGVkLgor ICogQGludGVybmFsCisgKiBAbGljZW5zZSBNb2Rlcm5penIgMy4wLjBwcmUgKEN1c3RvbSBCdWls ZCkgfCBNSVQKKyAqLworZnVuY3Rpb24gaXNFdmVudFN1cHBvcnRlZChldmVudE5hbWVTdWZmaXgs IGNhcHR1cmUpIHsKKyAgaWYgKCFFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gfHwgY2Fw dHVyZSAmJiAhKCdhZGRFdmVudExpc3RlbmVyJyBpbiBkb2N1bWVudCkpIHsKKyAgICByZXR1cm4g ZmFsc2U7CisgIH0KKworICB2YXIgZXZlbnROYW1lID0gJ29uJyArIGV2ZW50TmFtZVN1ZmZpeDsK KyAgdmFyIGlzU3VwcG9ydGVkID0gZXZlbnROYW1lIGluIGRvY3VtZW50OworCisgIGlmICghaXNT dXBwb3J0ZWQpIHsKKyAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Rp dicpOworICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGV2ZW50TmFtZSwgJ3JldHVybjsnKTsKKyAg ICBpc1N1cHBvcnRlZCA9IHR5cGVvZiBlbGVtZW50W2V2ZW50TmFtZV0gPT09ICdmdW5jdGlvbic7 CisgIH0KKworICBpZiAoIWlzU3VwcG9ydGVkICYmIHVzZUhhc0ZlYXR1cmUgJiYgZXZlbnROYW1l U3VmZml4ID09PSAnd2hlZWwnKSB7CisgICAgLy8gVGhpcyBpcyB0aGUgb25seSB3YXkgdG8gdGVz dCBzdXBwb3J0IGZvciB0aGUgYHdoZWVsYCBldmVudCBpbiBJRTkrLgorICAgIGlzU3VwcG9ydGVk ID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZSgnRXZlbnRzLndoZWVsJywgJzMu MCcpOworICB9CisKKyAgcmV0dXJuIGlzU3VwcG9ydGVkOworfQorCittb2R1bGUuZXhwb3J0cyA9 IGlzRXZlbnRTdXBwb3J0ZWQ7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0 IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL2lzVGV4dElucHV0RWxl bWVudC5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9pc1RleHRJ bnB1dEVsZW1lbnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjFiNjE5 M2U1Ci0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1k b20vbGliL2lzVGV4dElucHV0RWxlbWVudC5qcwpAQCAtMCwwICsxLDUwIEBACisvKioKKyAqIENv cHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2Vy dmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1z dHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRp cmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBw YXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1l IGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisKKy8qKgorICogQHNl ZSBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRp cGFnZS90aGUtaW5wdXQtZWxlbWVudC5odG1sI2lucHV0LXR5cGUtYXR0ci1zdW1tYXJ5CisgKi8K KwordmFyIHN1cHBvcnRlZElucHV0VHlwZXMgPSB7CisgICdjb2xvcic6IHRydWUsCisgICdkYXRl JzogdHJ1ZSwKKyAgJ2RhdGV0aW1lJzogdHJ1ZSwKKyAgJ2RhdGV0aW1lLWxvY2FsJzogdHJ1ZSwK KyAgJ2VtYWlsJzogdHJ1ZSwKKyAgJ21vbnRoJzogdHJ1ZSwKKyAgJ251bWJlcic6IHRydWUsCisg ICdwYXNzd29yZCc6IHRydWUsCisgICdyYW5nZSc6IHRydWUsCisgICdzZWFyY2gnOiB0cnVlLAor ICAndGVsJzogdHJ1ZSwKKyAgJ3RleHQnOiB0cnVlLAorICAndGltZSc6IHRydWUsCisgICd1cmwn OiB0cnVlLAorICAnd2Vlayc6IHRydWUKK307CisKK2Z1bmN0aW9uIGlzVGV4dElucHV0RWxlbWVu dChlbGVtKSB7CisgIHZhciBub2RlTmFtZSA9IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSAmJiBlbGVt Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CisKKyAgaWYgKG5vZGVOYW1lID09PSAnaW5wdXQnKSB7 CisgICAgcmV0dXJuICEhc3VwcG9ydGVkSW5wdXRUeXBlc1tlbGVtLnR5cGVdOworICB9CisKKyAg aWYgKG5vZGVOYW1lID09PSAndGV4dGFyZWEnKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKwor ICByZXR1cm4gZmFsc2U7Cit9CisKK21vZHVsZS5leHBvcnRzID0gaXNUZXh0SW5wdXRFbGVtZW50 OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0 YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9xdW90ZUF0dHJpYnV0ZVZhbHVlRm9yQnJvd3Nlci5q cyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9xdW90ZUF0dHJpYnV0 ZVZhbHVlRm9yQnJvd3Nlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4u Y2U3ODE1MmMKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3Jl YWN0LWRvbS9saWIvcXVvdGVBdHRyaWJ1dGVWYWx1ZUZvckJyb3dzZXIuanMKQEAgLTAsMCArMSwy NSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICog QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2Vk IHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmls ZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25h bCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMg ZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwor dmFyIGVzY2FwZVRleHRDb250ZW50Rm9yQnJvd3NlciA9IHJlcXVpcmUoJy4vZXNjYXBlVGV4dENv bnRlbnRGb3JCcm93c2VyJyk7CisKKy8qKgorICogRXNjYXBlcyBhdHRyaWJ1dGUgdmFsdWUgdG8g cHJldmVudCBzY3JpcHRpbmcgYXR0YWNrcy4KKyAqCisgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVl IHRvIGVzY2FwZS4KKyAqIEByZXR1cm4ge3N0cmluZ30gQW4gZXNjYXBlZCBzdHJpbmcuCisgKi8K K2Z1bmN0aW9uIHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyKHZhbHVlKSB7CisgIHJldHVy biAnIicgKyBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIodmFsdWUpICsgJyInOworfQorCitt b2R1bGUuZXhwb3J0cyA9IHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyOwpcIE5vIG5ld2xp bmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3Iv cmVhY3QtZG9tL2xpYi9yZWFjdENvbXBvbmVudEV4cGVjdC5qcyBiL3dlYi9wZ2FkbWluL3N0YXRp Yy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9yZWFjdENvbXBvbmVudEV4cGVjdC5qcwpuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uYWYzYmE5MWMKLS0tIC9kZXYvbnVsbAorKysgYi93 ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvcmVhY3RDb21wb25lbnRFeHBl Y3QuanMKQEAgLTAsMCArMSwyMTYgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwg RmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3Vy Y2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4g dGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNl IHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZv dW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLwor CisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQ cm9kSW52YXJpYW50JyksCisgICAgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTsK KwordmFyIFJlYWN0SW5zdGFuY2VNYXAgPSByZXF1aXJlKCcuL1JlYWN0SW5zdGFuY2VNYXAnKTsK K3ZhciBSZWFjdFRlc3RVdGlscyA9IHJlcXVpcmUoJy4vUmVhY3RUZXN0VXRpbHMnKTsKKwordmFy IGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpOworCitmdW5jdGlvbiBy ZWFjdENvbXBvbmVudEV4cGVjdChpbnN0YW5jZSkgeworICBpZiAoaW5zdGFuY2UgaW5zdGFuY2Vv ZiByZWFjdENvbXBvbmVudEV4cGVjdEludGVybmFsKSB7CisgICAgcmV0dXJuIGluc3RhbmNlOwor ICB9CisKKyAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIHJlYWN0Q29tcG9uZW50RXhwZWN0KSkgewor ICAgIHJldHVybiBuZXcgcmVhY3RDb21wb25lbnRFeHBlY3QoaW5zdGFuY2UpOworICB9CisKKyAg ZXhwZWN0KGluc3RhbmNlKS5ub3QudG9CZU51bGwoKTsKKyAgZXhwZWN0KGluc3RhbmNlKS5ub3Qu dG9CZVVuZGVmaW5lZCgpOworCisgICFSZWFjdFRlc3RVdGlscy5pc0NvbXBvc2l0ZUNvbXBvbmVu dChpbnN0YW5jZSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52 YXJpYW50KGZhbHNlLCAncmVhY3RDb21wb25lbnRFeHBlY3QoLi4uKTogaW5zdGFuY2UgbXVzdCBi ZSBhIGNvbXBvc2l0ZSBjb21wb25lbnQnKSA6IF9wcm9kSW52YXJpYW50KCcxNScpIDogdm9pZCAw OworICB2YXIgaW50ZXJuYWxJbnN0YW5jZSA9IFJlYWN0SW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNl KTsKKworICBleHBlY3QodHlwZW9mIGludGVybmFsSW5zdGFuY2UpLnRvQmUoJ29iamVjdCcpOwor ICBleHBlY3QodHlwZW9mIGludGVybmFsSW5zdGFuY2UuY29uc3RydWN0b3IpLnRvQmUoJ2Z1bmN0 aW9uJyk7CisgIGV4cGVjdChSZWFjdFRlc3RVdGlscy5pc0VsZW1lbnQoaW50ZXJuYWxJbnN0YW5j ZSkpLnRvQmUoZmFsc2UpOworCisgIHJldHVybiBuZXcgcmVhY3RDb21wb25lbnRFeHBlY3RJbnRl cm5hbChpbnRlcm5hbEluc3RhbmNlKTsKK30KKworZnVuY3Rpb24gcmVhY3RDb21wb25lbnRFeHBl Y3RJbnRlcm5hbChpbnRlcm5hbEluc3RhbmNlKSB7CisgIHRoaXMuX2luc3RhbmNlID0gaW50ZXJu YWxJbnN0YW5jZTsKK30KKworX2Fzc2lnbihyZWFjdENvbXBvbmVudEV4cGVjdEludGVybmFsLnBy b3RvdHlwZSwgeworICAvLyBHZXR0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvKioKKyAgICogQGluc3Rh bmNlOiBSZXRyaWV2ZXMgdGhlIGJhY2tpbmcgaW5zdGFuY2UuCisgICAqLworICBpbnN0YW5jZTog ZnVuY3Rpb24gKCkgeworICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZS5nZXRQdWJsaWNJbnN0YW5j ZSgpOworICB9LAorCisgIC8qKgorICAgKiBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIGNvbXBvbmVu dHMgaW4gdGhlIHdvcmxkLgorICAgKiAtIEEgY29tcG9uZW50IGNyZWF0ZWQgdmlhIFJlYWN0LmNy ZWF0ZUNsYXNzKCkgLSBIYXMgYSBzaW5nbGUgY2hpbGQKKyAgICogICBzdWJDb21wb25lbnQgLSB0 aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIC5yZW5kZXIoKSBmdW5jdGlvbi4gVGhpcworICAgKiAg IGZ1bmN0aW9uIEBzdWJDb21wb25lbnQgZXhwZWN0cyB0aGF0IHRoaXMuX2luc3RhbmNlIGlzIGNv bXBvbmVudCBjcmVhdGVkCisgICAqICAgd2l0aCBSZWFjdC5jcmVhdGVDbGFzcygpLgorICAgKiAt IEEgcHJpbWl0aXZlIERPTSBjb21wb25lbnQgLSB3aGljaCBoYXMgbWFueSByZW5kZXJlZENoaWxk cmVuLCBlYWNoIG9mCisgICAqICAgd2hpY2ggbWF5IGhhdmUgYSBuYW1lIHRoYXQgaXMgdW5pcXVl IHdpdGggcmVzcGVjdCB0byBpdHMgc2libGluZ3MuIFRoaXMKKyAgICogICBtZXRob2Qgd2lsbCBm YWlsIGlmIHRoaXMuX2luc3RhbmNlIGlzIGEgcHJpbWl0aXZlIGNvbXBvbmVudC4KKyAgICoKKyAg ICogVEw7RFI6IEFuIGluc3RhbmNlIG1heSBoYXZlIGEgc3ViQ29tcG9uZW50ICh0aGlzLl9yZW5k ZXJlZENvbXBvbmVudCkgb3IKKyAgICogcmVuZGVyZWRDaGlsZHJlbiwgYnV0IG5ldmVyIGJvdGgu IE5laXRoZXIgd2lsbCBhY3R1YWxseSBzaG93IHVwIHVudGlsIHlvdQorICAgKiByZW5kZXIgdGhl IGNvbXBvbmVudCAoc2ltcGx5IGluc3RhbnRpYXRpbmcgaXMgbm90IGVub3VnaCkuCisgICAqLwor ICBleHBlY3RSZW5kZXJlZENoaWxkOiBmdW5jdGlvbiAoKSB7CisgICAgdGhpcy50b0JlQ29tcG9z aXRlQ29tcG9uZW50KCk7CisgICAgdmFyIGNoaWxkID0gdGhpcy5faW5zdGFuY2UuX3JlbmRlcmVk Q29tcG9uZW50OworICAgIC8vIFRPRE86IEhpZGUgUmVhY3RFbXB0eUNvbXBvbmVudCBpbnN0YW5j ZXMgaGVyZT8KKyAgICByZXR1cm4gbmV3IHJlYWN0Q29tcG9uZW50RXhwZWN0SW50ZXJuYWwoY2hp bGQpOworICB9LAorCisgIC8qKgorICAgKiBUaGUgbnRoIGNoaWxkIG9mIGEgRE9NaXNoIGNvbXBv bmVudCBpbnN0YW5jZSB0aGF0IGlzIG5vdCBmYWxzeS4KKyAgICovCisgIGV4cGVjdFJlbmRlcmVk Q2hpbGRBdDogZnVuY3Rpb24gKGNoaWxkSW5kZXgpIHsKKyAgICAvLyBDdXJyZW50bHkgb25seSBk b20gY29tcG9uZW50cyBoYXZlIGFycmF5cyBvZiBjaGlsZHJlbiwgYnV0IHRoYXQgd2lsbAorICAg IC8vIGNoYW5nZSBzb29uLgorICAgIHRoaXMudG9CZURPTUNvbXBvbmVudCgpOworICAgIHZhciBy ZW5kZXJlZENoaWxkcmVuID0gdGhpcy5faW5zdGFuY2UuX3JlbmRlcmVkQ2hpbGRyZW4gfHwge307 CisgICAgZm9yICh2YXIgbmFtZSBpbiByZW5kZXJlZENoaWxkcmVuKSB7CisgICAgICBpZiAoIXJl bmRlcmVkQ2hpbGRyZW4uaGFzT3duUHJvcGVydHkobmFtZSkpIHsKKyAgICAgICAgY29udGludWU7 CisgICAgICB9CisgICAgICBpZiAocmVuZGVyZWRDaGlsZHJlbltuYW1lXSkgeworICAgICAgICBp ZiAocmVuZGVyZWRDaGlsZHJlbltuYW1lXS5fbW91bnRJbmRleCA9PT0gY2hpbGRJbmRleCkgewor ICAgICAgICAgIHJldHVybiBuZXcgcmVhY3RDb21wb25lbnRFeHBlY3RJbnRlcm5hbChyZW5kZXJl ZENoaWxkcmVuW25hbWVdKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICB0aHJvdyBu ZXcgRXJyb3IoJ0NoaWxkOicgKyBjaGlsZEluZGV4ICsgJyBpcyBub3QgZm91bmQnKTsKKyAgfSwK KworICB0b0JlRE9NQ29tcG9uZW50V2l0aENoaWxkQ291bnQ6IGZ1bmN0aW9uIChjb3VudCkgewor ICAgIHRoaXMudG9CZURPTUNvbXBvbmVudCgpOworICAgIHZhciByZW5kZXJlZENoaWxkcmVuID0g dGhpcy5faW5zdGFuY2UuX3JlbmRlcmVkQ2hpbGRyZW47CisgICAgZXhwZWN0KHJlbmRlcmVkQ2hp bGRyZW4pLnRvQmVUcnV0aHkoKTsKKyAgICBleHBlY3QoT2JqZWN0LmtleXMocmVuZGVyZWRDaGls ZHJlbikubGVuZ3RoKS50b0JlKGNvdW50KTsKKyAgICByZXR1cm4gdGhpczsKKyAgfSwKKworICB0 b0JlRE9NQ29tcG9uZW50V2l0aE5vQ2hpbGRyZW46IGZ1bmN0aW9uICgpIHsKKyAgICB0aGlzLnRv QmVET01Db21wb25lbnQoKTsKKyAgICBleHBlY3QodGhpcy5faW5zdGFuY2UuX3JlbmRlcmVkQ2hp bGRyZW4pLnRvQmVGYWxzeSgpOworICAgIHJldHVybiB0aGlzOworICB9LAorCisgIC8vIE1hdGNo ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorCisgIHRvQmVDb21wb25lbnRPZlR5cGU6IGZ1bmN0aW9uIChjb25zdHJ1 Y3RvcikgeworICAgIGV4cGVjdCh0aGlzLl9pbnN0YW5jZS5fY3VycmVudEVsZW1lbnQudHlwZSA9 PT0gY29uc3RydWN0b3IpLnRvQmUodHJ1ZSk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAg LyoqCisgICAqIEEgY29tcG9uZW50IHRoYXQgaXMgY3JlYXRlZCB3aXRoIFJlYWN0LmNyZWF0ZUNs YXNzLiBKdXN0IGR1Y2sgdHlwaW5nCisgICAqIGhlcmUuCisgICAqLworICB0b0JlQ29tcG9zaXRl Q29tcG9uZW50OiBmdW5jdGlvbiAoKSB7CisgICAgZXhwZWN0KHR5cGVvZiB0aGlzLmluc3RhbmNl KCkgPT09ICdvYmplY3QnICYmIHR5cGVvZiB0aGlzLmluc3RhbmNlKCkucmVuZGVyID09PSAnZnVu Y3Rpb24nKS50b0JlKHRydWUpOworICAgIHJldHVybiB0aGlzOworICB9LAorCisgIHRvQmVDb21w b3NpdGVDb21wb25lbnRXaXRoVHlwZTogZnVuY3Rpb24gKGNvbnN0cnVjdG9yKSB7CisgICAgdGhp cy50b0JlQ29tcG9zaXRlQ29tcG9uZW50KCk7CisgICAgZXhwZWN0KHRoaXMuX2luc3RhbmNlLl9j dXJyZW50RWxlbWVudC50eXBlID09PSBjb25zdHJ1Y3RvcikudG9CZSh0cnVlKTsKKyAgICByZXR1 cm4gdGhpczsKKyAgfSwKKworICB0b0JlVGV4dENvbXBvbmVudFdpdGhWYWx1ZTogZnVuY3Rpb24g KHZhbCkgeworICAgIHZhciBlbGVtZW50VHlwZSA9IHR5cGVvZiB0aGlzLl9pbnN0YW5jZS5fY3Vy cmVudEVsZW1lbnQ7CisgICAgZXhwZWN0KGVsZW1lbnRUeXBlID09PSAnc3RyaW5nJyB8fCBlbGVt ZW50VHlwZSA9PT0gJ251bWJlcicpLnRvQmUodHJ1ZSk7CisgICAgZXhwZWN0KHRoaXMuX2luc3Rh bmNlLl9zdHJpbmdUZXh0KS50b0JlKHZhbCk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAg dG9CZUVtcHR5Q29tcG9uZW50OiBmdW5jdGlvbiAoKSB7CisgICAgdmFyIGVsZW1lbnQgPSB0aGlz Ll9pbnN0YW5jZS5fY3VycmVudEVsZW1lbnQ7CisgICAgcmV0dXJuIGVsZW1lbnQgPT09IG51bGwg fHwgZWxlbWVudCA9PT0gZmFsc2U7CisgIH0sCisKKyAgdG9CZVByZXNlbnQ6IGZ1bmN0aW9uICgp IHsKKyAgICBleHBlY3QodGhpcy5pbnN0YW5jZSgpKS50b0JlVHJ1dGh5KCk7CisgICAgcmV0dXJu IHRoaXM7CisgIH0sCisKKyAgLyoqCisgICAqIEEgdGVybWluYWwgdHlwZSBvZiBjb21wb25lbnQg cmVwcmVzZW50aW5nIHNvbWUgdmlydHVhbCBkb20gbm9kZS4gSnVzdCBkdWNrCisgICAqIHR5cGlu ZyBoZXJlLgorICAgKi8KKyAgdG9CZURPTUNvbXBvbmVudDogZnVuY3Rpb24gKCkgeworICAgIGV4 cGVjdChSZWFjdFRlc3RVdGlscy5pc0RPTUNvbXBvbmVudCh0aGlzLmluc3RhbmNlKCkpKS50b0Jl KHRydWUpOworICAgIHJldHVybiB0aGlzOworICB9LAorCisgIC8qKgorICAgKiBAZGVwcmVjYXRl ZAorICAgKiBAc2VlIHRvQmVDb21wb25lbnRPZlR5cGUKKyAgICovCisgIHRvQmVET01Db21wb25l bnRXaXRoVGFnOiBmdW5jdGlvbiAodGFnKSB7CisgICAgdGhpcy50b0JlRE9NQ29tcG9uZW50KCk7 CisgICAgZXhwZWN0KHRoaXMuaW5zdGFuY2UoKS50YWdOYW1lKS50b0JlKHRhZy50b1VwcGVyQ2Fz ZSgpKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfSwKKworICAvKioKKyAgICogQ2hlY2sgdGhhdCBp bnRlcm5hbCBzdGF0ZSB2YWx1ZXMgYXJlIGVxdWFsIHRvIGEgc3RhdGUgb2YgZXhwZWN0ZWQgdmFs dWVzLgorICAgKi8KKyAgc2NhbGFyU3RhdGVFcXVhbDogZnVuY3Rpb24gKHN0YXRlTmFtZVRvRXhw ZWN0ZWRWYWx1ZSkgeworICAgIGV4cGVjdCh0aGlzLmluc3RhbmNlKCkpLnRvQmVUcnV0aHkoKTsK KyAgICBmb3IgKHZhciBzdGF0ZU5hbWUgaW4gc3RhdGVOYW1lVG9FeHBlY3RlZFZhbHVlKSB7Cisg ICAgICBpZiAoIXN0YXRlTmFtZVRvRXhwZWN0ZWRWYWx1ZS5oYXNPd25Qcm9wZXJ0eShzdGF0ZU5h bWUpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgZXhwZWN0KHRoaXMuaW5z dGFuY2UoKS5zdGF0ZVtzdGF0ZU5hbWVdKS50b0VxdWFsKHN0YXRlTmFtZVRvRXhwZWN0ZWRWYWx1 ZVtzdGF0ZU5hbWVdKTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgLyoqCisg ICAqIENoZWNrIGEgc2V0IG9mIHByb3BzIGFyZSBlcXVhbCB0byBhIHNldCBvZiBleHBlY3RlZCB2 YWx1ZXMgLSBvbmx5IHdvcmtzCisgICAqIHdpdGggc2NhbGFycy4KKyAgICovCisgIHNjYWxhclBy b3BzRXF1YWw6IGZ1bmN0aW9uIChwcm9wTmFtZVRvRXhwZWN0ZWRWYWx1ZSkgeworICAgIGV4cGVj dCh0aGlzLmluc3RhbmNlKCkpLnRvQmVUcnV0aHkoKTsKKyAgICBmb3IgKHZhciBwcm9wTmFtZSBp biBwcm9wTmFtZVRvRXhwZWN0ZWRWYWx1ZSkgeworICAgICAgaWYgKCFwcm9wTmFtZVRvRXhwZWN0 ZWRWYWx1ZS5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHsKKyAgICAgICAgY29udGludWU7Cisg ICAgICB9CisgICAgICBleHBlY3QodGhpcy5pbnN0YW5jZSgpLnByb3BzW3Byb3BOYW1lXSkudG9F cXVhbChwcm9wTmFtZVRvRXhwZWN0ZWRWYWx1ZVtwcm9wTmFtZV0pOworICAgIH0KKyAgICByZXR1 cm4gdGhpczsKKyAgfSwKKworICAvKioKKyAgICogQ2hlY2sgYSBzZXQgb2YgcHJvcHMgYXJlIGVx dWFsIHRvIGEgc2V0IG9mIGV4cGVjdGVkIHZhbHVlcyAtIG9ubHkgd29ya3MKKyAgICogd2l0aCBz Y2FsYXJzLgorICAgKi8KKyAgc2NhbGFyQ29udGV4dEVxdWFsOiBmdW5jdGlvbiAoY29udGV4dE5h bWVUb0V4cGVjdGVkVmFsdWUpIHsKKyAgICBleHBlY3QodGhpcy5pbnN0YW5jZSgpKS50b0JlVHJ1 dGh5KCk7CisgICAgZm9yICh2YXIgY29udGV4dE5hbWUgaW4gY29udGV4dE5hbWVUb0V4cGVjdGVk VmFsdWUpIHsKKyAgICAgIGlmICghY29udGV4dE5hbWVUb0V4cGVjdGVkVmFsdWUuaGFzT3duUHJv cGVydHkoY29udGV4dE5hbWUpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAg ZXhwZWN0KHRoaXMuaW5zdGFuY2UoKS5jb250ZXh0W2NvbnRleHROYW1lXSkudG9FcXVhbChjb250 ZXh0TmFtZVRvRXhwZWN0ZWRWYWx1ZVtjb250ZXh0TmFtZV0pOworICAgIH0KKyAgICByZXR1cm4g dGhpczsKKyAgfQorfSk7CisKK21vZHVsZS5leHBvcnRzID0gcmVhY3RDb21wb25lbnRFeHBlY3Q7 ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3Rh dGljL3ZlbmRvci9yZWFjdC1kb20vbGliL3JlYWN0UHJvZEludmFyaWFudC5qcyBiL3dlYi9wZ2Fk bWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9yZWFjdFByb2RJbnZhcmlhbnQuanMKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLmI5MGY5ZWIwCi0tLSAvZGV2L251bGwK KysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL3JlYWN0UHJvZElu dmFyaWFudC5qcwpAQCAtMCwwICsxLDM4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMy1w cmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBU aGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBm b3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhp cyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBj YW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisg KgorICogCisgKi8KKyd1c2Ugc3RyaWN0JzsKKworLyoqCisgKiBXQVJOSU5HOiBETyBOT1QgbWFu dWFsbHkgcmVxdWlyZSB0aGlzIG1vZHVsZS4KKyAqIFRoaXMgaXMgYSByZXBsYWNlbWVudCBmb3Ig YGludmFyaWFudCguLi4pYCB1c2VkIGJ5IHRoZSBlcnJvciBjb2RlIHN5c3RlbQorICogYW5kIHdp bGwgX29ubHlfIGJlIHJlcXVpcmVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGJhYmVsIHBhc3MuCisg KiBJdCBhbHdheXMgdGhyb3dzLgorICovCisKK2Z1bmN0aW9uIHJlYWN0UHJvZEludmFyaWFudChj b2RlKSB7CisgIHZhciBhcmdDb3VudCA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOworCisgIHZhciBt ZXNzYWdlID0gJ01pbmlmaWVkIFJlYWN0IGVycm9yICMnICsgY29kZSArICc7IHZpc2l0ICcgKyAn aHR0cDovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL2Vycm9yLWRlY29kZXIuaHRtbD9p bnZhcmlhbnQ9JyArIGNvZGU7CisKKyAgZm9yICh2YXIgYXJnSWR4ID0gMDsgYXJnSWR4IDwgYXJn Q291bnQ7IGFyZ0lkeCsrKSB7CisgICAgbWVzc2FnZSArPSAnJmFyZ3NbXT0nICsgZW5jb2RlVVJJ Q29tcG9uZW50KGFyZ3VtZW50c1thcmdJZHggKyAxXSk7CisgIH0KKworICBtZXNzYWdlICs9ICcg Zm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25t ZW50JyArICcgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3Mu JzsKKworICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7CisgIGVycm9yLm5hbWUgPSAn SW52YXJpYW50IFZpb2xhdGlvbic7CisgIGVycm9yLmZyYW1lc1RvUG9wID0gMTsgLy8gd2UgZG9u J3QgY2FyZSBhYm91dCByZWFjdFByb2RJbnZhcmlhbnQncyBvd24gZnJhbWUKKworICB0aHJvdyBl cnJvcjsKK30KKworbW9kdWxlLmV4cG9ydHMgPSByZWFjdFByb2RJbnZhcmlhbnQ7ClwgTm8gbmV3 bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRv ci9yZWFjdC1kb20vbGliL3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyLmpzIGIvd2ViL3BnYWRt aW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVy LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi4xMWU5MjYzZgotLS0gL2Rl di9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9yZW5k ZXJTdWJ0cmVlSW50b0NvbnRhaW5lci5qcwpAQCAtMCwwICsxLDE1IEBACisvKioKKyAqIENvcHly aWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVk LgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHls ZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVj dG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRl bnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRp cmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgUmVhY3RNb3VudCA9IHJl cXVpcmUoJy4vUmVhY3RNb3VudCcpOworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0TW91bnQucmVu ZGVyU3VidHJlZUludG9Db250YWluZXI7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZm IC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL3NldElubmVy SFRNTC5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9zZXRJbm5l ckhUTUwuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjZjNWYzZDMwCi0t LSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGli L3NldElubmVySFRNTC5qcwpAQCAtMCwwICsxLDk3IEBACisvKioKKyAqIENvcHlyaWdodCAyMDEz LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq IFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNl IGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0 aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRz IGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4K KyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSBy ZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpOwordmFyIERPTU5hbWVzcGFj ZXMgPSByZXF1aXJlKCcuL0RPTU5hbWVzcGFjZXMnKTsKKwordmFyIFdISVRFU1BBQ0VfVEVTVCA9 IC9eWyBcclxuXHRcZl0vOwordmFyIE5PTlZJU0lCTEVfVEVTVCA9IC88KCEtLXxsaW5rfG5vc2Ny aXB0fG1ldGF8c2NyaXB0fHN0eWxlKVsgXHJcblx0XGZcLz5dLzsKKwordmFyIGNyZWF0ZU1pY3Jv c29mdFVuc2FmZUxvY2FsRnVuY3Rpb24gPSByZXF1aXJlKCcuL2NyZWF0ZU1pY3Jvc29mdFVuc2Fm ZUxvY2FsRnVuY3Rpb24nKTsKKworLy8gU1ZHIHRlbXAgY29udGFpbmVyIGZvciBJRSBsYWNraW5n IGlubmVySFRNTAordmFyIHJldXNhYmxlU1ZHQ29udGFpbmVyOworCisvKioKKyAqIFNldCB0aGUg aW5uZXJIVE1MIHByb3BlcnR5IG9mIGEgbm9kZSwgZW5zdXJpbmcgdGhhdCB3aGl0ZXNwYWNlIGlz IHByZXNlcnZlZAorICogZXZlbiBpbiBJRTguCisgKgorICogQHBhcmFtIHtET01FbGVtZW50fSBu b2RlCisgKiBAcGFyYW0ge3N0cmluZ30gaHRtbAorICogQGludGVybmFsCisgKi8KK3ZhciBzZXRJ bm5lckhUTUwgPSBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uIChu b2RlLCBodG1sKSB7CisgIC8vIElFIGRvZXMgbm90IGhhdmUgaW5uZXJIVE1MIGZvciBTVkcgbm9k ZXMsIHNvIGluc3RlYWQgd2UgaW5qZWN0IHRoZQorICAvLyBuZXcgbWFya3VwIGluIGEgdGVtcCBu b2RlIGFuZCB0aGVuIG1vdmUgdGhlIGNoaWxkIG5vZGVzIGFjcm9zcyBpbnRvCisgIC8vIHRoZSB0 YXJnZXQgbm9kZQorICBpZiAobm9kZS5uYW1lc3BhY2VVUkkgPT09IERPTU5hbWVzcGFjZXMuc3Zn ICYmICEoJ2lubmVySFRNTCcgaW4gbm9kZSkpIHsKKyAgICByZXVzYWJsZVNWR0NvbnRhaW5lciA9 IHJldXNhYmxlU1ZHQ29udGFpbmVyIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwor ICAgIHJldXNhYmxlU1ZHQ29udGFpbmVyLmlubmVySFRNTCA9ICc8c3ZnPicgKyBodG1sICsgJzwv c3ZnPic7CisgICAgdmFyIHN2Z05vZGUgPSByZXVzYWJsZVNWR0NvbnRhaW5lci5maXJzdENoaWxk OworICAgIHdoaWxlIChzdmdOb2RlLmZpcnN0Q2hpbGQpIHsKKyAgICAgIG5vZGUuYXBwZW5kQ2hp bGQoc3ZnTm9kZS5maXJzdENoaWxkKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbm9kZS5pbm5l ckhUTUwgPSBodG1sOworICB9Cit9KTsKKworaWYgKEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVz ZURPTSkgeworICAvLyBJRTg6IFdoZW4gdXBkYXRpbmcgYSBqdXN0IGNyZWF0ZWQgbm9kZSB3aXRo IGlubmVySFRNTCBvbmx5IGxlYWRpbmcKKyAgLy8gd2hpdGVzcGFjZSBpcyByZW1vdmVkLiBXaGVu IHVwZGF0aW5nIGFuIGV4aXN0aW5nIG5vZGUgd2l0aCBpbm5lckhUTUwKKyAgLy8gd2hpdGVzcGFj ZSBpbiByb290IFRleHROb2RlcyBpcyBhbHNvIGNvbGxhcHNlZC4KKyAgLy8gQHNlZSBxdWlya3Nt b2RlLm9yZy9idWdyZXBvcnRzL2FyY2hpdmVzLzIwMDQvMTEvaW5uZXJodG1sX2FuZF90Lmh0bWwK KworICAvLyBGZWF0dXJlIGRldGVjdGlvbjsgb25seSBJRTggaXMga25vd24gdG8gYmVoYXZlIGlt cHJvcGVybHkgbGlrZSB0aGlzLgorICB2YXIgdGVzdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVF bGVtZW50KCdkaXYnKTsKKyAgdGVzdEVsZW1lbnQuaW5uZXJIVE1MID0gJyAnOworICBpZiAodGVz dEVsZW1lbnQuaW5uZXJIVE1MID09PSAnJykgeworICAgIHNldElubmVySFRNTCA9IGZ1bmN0aW9u IChub2RlLCBodG1sKSB7CisgICAgICAvLyBNYWdpYyB0aGVvcnk6IElFOCBzdXBwb3NlZGx5IGRp ZmZlcmVudGlhdGVzIGJldHdlZW4gYWRkZWQgYW5kIHVwZGF0ZWQKKyAgICAgIC8vIG5vZGVzIHdo ZW4gcHJvY2Vzc2luZyBpbm5lckhUTUwsIGlubmVySFRNTCBvbiB1cGRhdGVkIG5vZGVzIHN1ZmZl cnMKKyAgICAgIC8vIGZyb20gd29yc2Ugd2hpdGVzcGFjZSBiZWhhdmlvci4gUmUtYWRkaW5nIGEg bm9kZSBsaWtlIHRoaXMgdHJpZ2dlcnMKKyAgICAgIC8vIHRoZSBpbml0aWFsIGFuZCBtb3JlIGZh dm9yYWJsZSB3aGl0ZXNwYWNlIGJlaGF2aW9yLgorICAgICAgLy8gVE9ETzogV2hhdCB0byBkbyBv biBhIGRldGFjaGVkIG5vZGU/CisgICAgICBpZiAobm9kZS5wYXJlbnROb2RlKSB7CisgICAgICAg IG5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobm9kZSwgbm9kZSk7CisgICAgICB9CisKKyAg ICAgIC8vIFdlIGFsc28gaW1wbGVtZW50IGEgd29ya2Fyb3VuZCBmb3Igbm9uLXZpc2libGUgdGFn cyBkaXNhcHBlYXJpbmcgaW50bworICAgICAgLy8gdGhpbiBhaXIgb24gSUU4LCB0aGlzIG9ubHkg aGFwcGVucyBpZiB0aGVyZSBpcyBubyB2aXNpYmxlIHRleHQKKyAgICAgIC8vIGluLWZyb250IG9m IHRoZSBub24tdmlzaWJsZSB0YWdzLiBQaWdneWJhY2sgb24gdGhlIHdoaXRlc3BhY2UgZml4Cisg ICAgICAvLyBhbmQgc2ltcGx5IGNoZWNrIGlmIGFueSBub24tdmlzaWJsZSB0YWdzIGFwcGVhciBp biB0aGUgc291cmNlLgorICAgICAgaWYgKFdISVRFU1BBQ0VfVEVTVC50ZXN0KGh0bWwpIHx8IGh0 bWxbMF0gPT09ICc8JyAmJiBOT05WSVNJQkxFX1RFU1QudGVzdChodG1sKSkgeworICAgICAgICAv LyBSZWNvdmVyIGxlYWRpbmcgd2hpdGVzcGFjZSBieSB0ZW1wb3JhcmlseSBwcmVwZW5kaW5nIGFu eSBjaGFyYWN0ZXIuCisgICAgICAgIC8vIFx1RkVGRiBoYXMgdGhlIHBvdGVudGlhbCBhZHZhbnRh Z2Ugb2YgYmVpbmcgemVyby13aWR0aC9pbnZpc2libGUuCisgICAgICAgIC8vIFVnbGlmeUpTIGRy b3BzIFUrRkVGRiBjaGFycyB3aGVuIHBhcnNpbmcsIHNvIHVzZSBTdHJpbmcuZnJvbUNoYXJDb2Rl CisgICAgICAgIC8vIGluIGhvcGVzIHRoYXQgdGhpcyBpcyBwcmVzZXJ2ZWQgZXZlbiBpZiAiXHVG RUZGIiBpcyB0cmFuc2Zvcm1lZCB0bworICAgICAgICAvLyB0aGUgYWN0dWFsIFVuaWNvZGUgY2hh cmFjdGVyIChieSBCYWJlbCwgZm9yIGV4YW1wbGUpLgorICAgICAgICAvLyBodHRwczovL2dpdGh1 Yi5jb20vbWlzaG9vL1VnbGlmeUpTMi9ibG9iL3YyLjQuMjAvbGliL3BhcnNlLmpzI0wyMTYKKyAg ICAgICAgbm9kZS5pbm5lckhUTUwgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RkVGRikgKyBodG1s OworCisgICAgICAgIC8vIGRlbGV0ZURhdGEgbGVhdmVzIGFuIGVtcHR5IGBUZXh0Tm9kZWAgd2hp Y2ggb2Zmc2V0cyB0aGUgaW5kZXggb2YgYWxsCisgICAgICAgIC8vIGNoaWxkcmVuLiBEZWZpbml0 ZWx5IHdhbnQgdG8gYXZvaWQgdGhpcy4KKyAgICAgICAgdmFyIHRleHROb2RlID0gbm9kZS5maXJz dENoaWxkOworICAgICAgICBpZiAodGV4dE5vZGUuZGF0YS5sZW5ndGggPT09IDEpIHsKKyAgICAg ICAgICBub2RlLnJlbW92ZUNoaWxkKHRleHROb2RlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAg ICAgICB0ZXh0Tm9kZS5kZWxldGVEYXRhKDAsIDEpOworICAgICAgICB9CisgICAgICB9IGVsc2Ug eworICAgICAgICBub2RlLmlubmVySFRNTCA9IGh0bWw7CisgICAgICB9CisgICAgfTsKKyAgfQor ICB0ZXN0RWxlbWVudCA9IG51bGw7Cit9CisKK21vZHVsZS5leHBvcnRzID0gc2V0SW5uZXJIVE1M OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0 YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9zZXRUZXh0Q29udGVudC5qcyBiL3dlYi9wZ2FkbWlu L3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9zZXRUZXh0Q29udGVudC5qcwpuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uZjYzMzA5MzkKLS0tIC9kZXYvbnVsbAorKysgYi93 ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9saWIvc2V0VGV4dENvbnRlbnQuanMK QEAgLTAsMCArMSw1MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9v aywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2Rl IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAq IExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4g QW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4g dGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ug c3RyaWN0JzsKKwordmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0gcmVxdWlyZSgnZmJqcy9saWIv RXhlY3V0aW9uRW52aXJvbm1lbnQnKTsKK3ZhciBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIg PSByZXF1aXJlKCcuL2VzY2FwZVRleHRDb250ZW50Rm9yQnJvd3NlcicpOwordmFyIHNldElubmVy SFRNTCA9IHJlcXVpcmUoJy4vc2V0SW5uZXJIVE1MJyk7CisKKy8qKgorICogU2V0IHRoZSB0ZXh0 Q29udGVudCBwcm9wZXJ0eSBvZiBhIG5vZGUsIGVuc3VyaW5nIHRoYXQgd2hpdGVzcGFjZSBpcyBw cmVzZXJ2ZWQKKyAqIGV2ZW4gaW4gSUU4LiBpbm5lclRleHQgaXMgYSBwb29yIHN1YnN0aXR1dGUg Zm9yIHRleHRDb250ZW50IGFuZCwgYW1vbmcgbWFueQorICogaXNzdWVzLCBpbnNlcnRzIDxicj4g aW5zdGVhZCBvZiB0aGUgbGl0ZXJhbCBuZXdsaW5lIGNoYXJzLiBpbm5lckhUTUwgYmVoYXZlcwor ICogYXMgaXQgc2hvdWxkLgorICoKKyAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZQorICogQHBh cmFtIHtzdHJpbmd9IHRleHQKKyAqIEBpbnRlcm5hbAorICovCit2YXIgc2V0VGV4dENvbnRlbnQg PSBmdW5jdGlvbiAobm9kZSwgdGV4dCkgeworICBpZiAodGV4dCkgeworICAgIHZhciBmaXJzdENo aWxkID0gbm9kZS5maXJzdENoaWxkOworCisgICAgaWYgKGZpcnN0Q2hpbGQgJiYgZmlyc3RDaGls ZCA9PT0gbm9kZS5sYXN0Q2hpbGQgJiYgZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gMykgeworICAg ICAgZmlyc3RDaGlsZC5ub2RlVmFsdWUgPSB0ZXh0OworICAgICAgcmV0dXJuOworICAgIH0KKyAg fQorICBub2RlLnRleHRDb250ZW50ID0gdGV4dDsKK307CisKK2lmIChFeGVjdXRpb25FbnZpcm9u bWVudC5jYW5Vc2VET00pIHsKKyAgaWYgKCEoJ3RleHRDb250ZW50JyBpbiBkb2N1bWVudC5kb2N1 bWVudEVsZW1lbnQpKSB7CisgICAgc2V0VGV4dENvbnRlbnQgPSBmdW5jdGlvbiAobm9kZSwgdGV4 dCkgeworICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHsKKyAgICAgICAgbm9kZS5ub2Rl VmFsdWUgPSB0ZXh0OworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBzZXRJbm5lckhU TUwobm9kZSwgZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyKHRleHQpKTsKKyAgICB9OworICB9 Cit9CisKK21vZHVsZS5leHBvcnRzID0gc2V0VGV4dENvbnRlbnQ7ClwgTm8gbmV3bGluZSBhdCBl bmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1k b20vbGliL3Nob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50LmpzIGIvd2ViL3BnYWRtaW4vc3RhdGlj L3ZlbmRvci9yZWFjdC1kb20vbGliL3Nob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50LmpzCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi5kMzliOTQ4YgotLS0gL2Rldi9udWxsCisr KyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9zaG91bGRVcGRhdGVS ZWFjdENvbXBvbmVudC5qcwpAQCAtMCwwICsxLDQxIEBACisvKioKKyAqIENvcHlyaWdodCAyMDEz LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq IFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNl IGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0 aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRz IGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4K KyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCisvKioKKyAqIEdpdmVuIGEgYHByZXZFbGVtZW50 YCBhbmQgYG5leHRFbGVtZW50YCwgZGV0ZXJtaW5lcyBpZiB0aGUgZXhpc3RpbmcKKyAqIGluc3Rh bmNlIHNob3VsZCBiZSB1cGRhdGVkIGFzIG9wcG9zZWQgdG8gYmVpbmcgZGVzdHJveWVkIG9yIHJl cGxhY2VkIGJ5IGEgbmV3CisgKiBpbnN0YW5jZS4gQm90aCBhcmd1bWVudHMgYXJlIGVsZW1lbnRz LiBUaGlzIGVuc3VyZXMgdGhhdCB0aGlzIGxvZ2ljIGNhbgorICogb3BlcmF0ZSBvbiBzdGF0ZWxl c3MgdHJlZXMgd2l0aG91dCBhbnkgYmFja2luZyBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gez9v YmplY3R9IHByZXZFbGVtZW50CisgKiBAcGFyYW0gez9vYmplY3R9IG5leHRFbGVtZW50CisgKiBA cmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBleGlzdGluZyBpbnN0YW5jZSBzaG91bGQgYmUg dXBkYXRlZC4KKyAqIEBwcm90ZWN0ZWQKKyAqLworCitmdW5jdGlvbiBzaG91bGRVcGRhdGVSZWFj dENvbXBvbmVudChwcmV2RWxlbWVudCwgbmV4dEVsZW1lbnQpIHsKKyAgdmFyIHByZXZFbXB0eSA9 IHByZXZFbGVtZW50ID09PSBudWxsIHx8IHByZXZFbGVtZW50ID09PSBmYWxzZTsKKyAgdmFyIG5l eHRFbXB0eSA9IG5leHRFbGVtZW50ID09PSBudWxsIHx8IG5leHRFbGVtZW50ID09PSBmYWxzZTsK KyAgaWYgKHByZXZFbXB0eSB8fCBuZXh0RW1wdHkpIHsKKyAgICByZXR1cm4gcHJldkVtcHR5ID09 PSBuZXh0RW1wdHk7CisgIH0KKworICB2YXIgcHJldlR5cGUgPSB0eXBlb2YgcHJldkVsZW1lbnQ7 CisgIHZhciBuZXh0VHlwZSA9IHR5cGVvZiBuZXh0RWxlbWVudDsKKyAgaWYgKHByZXZUeXBlID09 PSAnc3RyaW5nJyB8fCBwcmV2VHlwZSA9PT0gJ251bWJlcicpIHsKKyAgICByZXR1cm4gbmV4dFR5 cGUgPT09ICdzdHJpbmcnIHx8IG5leHRUeXBlID09PSAnbnVtYmVyJzsKKyAgfSBlbHNlIHsKKyAg ICByZXR1cm4gbmV4dFR5cGUgPT09ICdvYmplY3QnICYmIHByZXZFbGVtZW50LnR5cGUgPT09IG5l eHRFbGVtZW50LnR5cGUgJiYgcHJldkVsZW1lbnQua2V5ID09PSBuZXh0RWxlbWVudC5rZXk7Cisg IH0KK30KKworbW9kdWxlLmV4cG9ydHMgPSBzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudDsKXCBO byBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMv dmVuZG9yL3JlYWN0LWRvbS9saWIvdHJhdmVyc2VBbGxDaGlsZHJlbi5qcyBiL3dlYi9wZ2FkbWlu L3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi90cmF2ZXJzZUFsbENoaWxkcmVuLmpzCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi4wMDhhYjA4OAotLS0gL2Rldi9udWxsCisr KyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi90cmF2ZXJzZUFsbENo aWxkcmVuLmpzCkBAIC0wLDAgKzEsMTc1IEBACisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNl bnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMg c291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5k IGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNv dXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBi ZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisg Ki8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3Jl YWN0UHJvZEludmFyaWFudCcpOworCit2YXIgUmVhY3RDdXJyZW50T3duZXIgPSByZXF1aXJlKCdy ZWFjdC9saWIvUmVhY3RDdXJyZW50T3duZXInKTsKK3ZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBy ZXF1aXJlKCcuL1JlYWN0RWxlbWVudFN5bWJvbCcpOworCit2YXIgZ2V0SXRlcmF0b3JGbiA9IHJl cXVpcmUoJy4vZ2V0SXRlcmF0b3JGbicpOwordmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMv bGliL2ludmFyaWFudCcpOwordmFyIEtleUVzY2FwZVV0aWxzID0gcmVxdWlyZSgnLi9LZXlFc2Nh cGVVdGlscycpOwordmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7CisK K3ZhciBTRVBBUkFUT1IgPSAnLic7Cit2YXIgU1VCU0VQQVJBVE9SID0gJzonOworCisvKioKKyAq IFRoaXMgaXMgaW5saW5lZCBmcm9tIFJlYWN0RWxlbWVudCBzaW5jZSB0aGlzIGZpbGUgaXMgc2hh cmVkIGJldHdlZW4KKyAqIGlzb21vcnBoaWMgYW5kIHJlbmRlcmVycy4gV2UgY291bGQgZXh0cmFj dCB0aGlzIHRvIGEKKyAqCisgKi8KKworLyoqCisgKiBUT0RPOiBUZXN0IHRoYXQgYSBzaW5nbGUg Y2hpbGQgYW5kIGFuIGFycmF5IHdpdGggb25lIGl0ZW0gaGF2ZSB0aGUgc2FtZSBrZXkKKyAqIHBh dHRlcm4uCisgKi8KKwordmFyIGRpZFdhcm5BYm91dE1hcHMgPSBmYWxzZTsKKworLyoqCisgKiBH ZW5lcmF0ZSBhIGtleSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIGEgY29tcG9uZW50IHdpdGhpbiBh IHNldC4KKyAqCisgKiBAcGFyYW0geyp9IGNvbXBvbmVudCBBIGNvbXBvbmVudCB0aGF0IGNvdWxk IGNvbnRhaW4gYSBtYW51YWwga2V5LgorICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IEluZGV4IHRo YXQgaXMgdXNlZCBpZiBhIG1hbnVhbCBrZXkgaXMgbm90IHByb3ZpZGVkLgorICogQHJldHVybiB7 c3RyaW5nfQorICovCitmdW5jdGlvbiBnZXRDb21wb25lbnRLZXkoY29tcG9uZW50LCBpbmRleCkg eworICAvLyBEbyBzb21lIHR5cGVjaGVja2luZyBoZXJlIHNpbmNlIHdlIGNhbGwgdGhpcyBibGlu ZGx5LiBXZSB3YW50IHRvIGVuc3VyZQorICAvLyB0aGF0IHdlIGRvbid0IGJsb2NrIHBvdGVudGlh bCBmdXR1cmUgRVMgQVBJcy4KKyAgaWYgKGNvbXBvbmVudCAmJiB0eXBlb2YgY29tcG9uZW50ID09 PSAnb2JqZWN0JyAmJiBjb21wb25lbnQua2V5ICE9IG51bGwpIHsKKyAgICAvLyBFeHBsaWNpdCBr ZXkKKyAgICByZXR1cm4gS2V5RXNjYXBlVXRpbHMuZXNjYXBlKGNvbXBvbmVudC5rZXkpOworICB9 CisgIC8vIEltcGxpY2l0IGtleSBkZXRlcm1pbmVkIGJ5IHRoZSBpbmRleCBpbiB0aGUgc2V0Cisg IHJldHVybiBpbmRleC50b1N0cmluZygzNik7Cit9CisKKy8qKgorICogQHBhcmFtIHs/Kn0gY2hp bGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuCisgKiBAcGFyYW0geyFzdHJpbmd9IG5hbWVT b0ZhciBOYW1lIG9mIHRoZSBrZXkgcGF0aCBzbyBmYXIuCisgKiBAcGFyYW0geyFmdW5jdGlvbn0g Y2FsbGJhY2sgQ2FsbGJhY2sgdG8gaW52b2tlIHdpdGggZWFjaCBjaGlsZCBmb3VuZC4KKyAqIEBw YXJhbSB7Pyp9IHRyYXZlcnNlQ29udGV4dCBVc2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdGhyb3Vn aG91dCB0aGUgdHJhdmVyc2FsCisgKiBwcm9jZXNzLgorICogQHJldHVybiB7IW51bWJlcn0gVGhl IG51bWJlciBvZiBjaGlsZHJlbiBpbiB0aGlzIHN1YnRyZWUuCisgKi8KK2Z1bmN0aW9uIHRyYXZl cnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkcmVuLCBuYW1lU29GYXIsIGNhbGxiYWNrLCB0cmF2ZXJz ZUNvbnRleHQpIHsKKyAgdmFyIHR5cGUgPSB0eXBlb2YgY2hpbGRyZW47CisKKyAgaWYgKHR5cGUg PT09ICd1bmRlZmluZWQnIHx8IHR5cGUgPT09ICdib29sZWFuJykgeworICAgIC8vIEFsbCBvZiB0 aGUgYWJvdmUgYXJlIHBlcmNlaXZlZCBhcyBudWxsLgorICAgIGNoaWxkcmVuID0gbnVsbDsKKyAg fQorCisgIGlmIChjaGlsZHJlbiA9PT0gbnVsbCB8fCB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBl ID09PSAnbnVtYmVyJyB8fAorICAvLyBUaGUgZm9sbG93aW5nIGlzIGlubGluZWQgZnJvbSBSZWFj dEVsZW1lbnQuIFRoaXMgbWVhbnMgd2UgY2FuIG9wdGltaXplCisgIC8vIHNvbWUgY2hlY2tzLiBS ZWFjdCBGaWJlciBhbHNvIGlubGluZXMgdGhpcyBsb2dpYyBmb3Igc2ltaWxhciBwdXJwb3Nlcy4K KyAgdHlwZSA9PT0gJ29iamVjdCcgJiYgY2hpbGRyZW4uJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1F TlRfVFlQRSkgeworICAgIGNhbGxiYWNrKHRyYXZlcnNlQ29udGV4dCwgY2hpbGRyZW4sCisgICAg Ly8gSWYgaXQncyB0aGUgb25seSBjaGlsZCwgdHJlYXQgdGhlIG5hbWUgYXMgaWYgaXQgd2FzIHdy YXBwZWQgaW4gYW4gYXJyYXkKKyAgICAvLyBzbyB0aGF0IGl0J3MgY29uc2lzdGVudCBpZiB0aGUg bnVtYmVyIG9mIGNoaWxkcmVuIGdyb3dzLgorICAgIG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFU T1IgKyBnZXRDb21wb25lbnRLZXkoY2hpbGRyZW4sIDApIDogbmFtZVNvRmFyKTsKKyAgICByZXR1 cm4gMTsKKyAgfQorCisgIHZhciBjaGlsZDsKKyAgdmFyIG5leHROYW1lOworICB2YXIgc3VidHJl ZUNvdW50ID0gMDsgLy8gQ291bnQgb2YgY2hpbGRyZW4gZm91bmQgaW4gdGhlIGN1cnJlbnQgc3Vi dHJlZS4KKyAgdmFyIG5leHROYW1lUHJlZml4ID0gbmFtZVNvRmFyID09PSAnJyA/IFNFUEFSQVRP UiA6IG5hbWVTb0ZhciArIFNVQlNFUEFSQVRPUjsKKworICBpZiAoQXJyYXkuaXNBcnJheShjaGls ZHJlbikpIHsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7 CisgICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldOworICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVBy ZWZpeCArIGdldENvbXBvbmVudEtleShjaGlsZCwgaSk7CisgICAgICBzdWJ0cmVlQ291bnQgKz0g dHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGQsIG5leHROYW1lLCBjYWxsYmFjaywgdHJhdmVy c2VDb250ZXh0KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJ dGVyYXRvckZuKGNoaWxkcmVuKTsKKyAgICBpZiAoaXRlcmF0b3JGbikgeworICAgICAgdmFyIGl0 ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKGNoaWxkcmVuKTsKKyAgICAgIHZhciBzdGVwOworICAg ICAgaWYgKGl0ZXJhdG9yRm4gIT09IGNoaWxkcmVuLmVudHJpZXMpIHsKKyAgICAgICAgdmFyIGlp ID0gMDsKKyAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkgewor ICAgICAgICAgIGNoaWxkID0gc3RlcC52YWx1ZTsKKyAgICAgICAgICBuZXh0TmFtZSA9IG5leHRO YW1lUHJlZml4ICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkLCBpaSsrKTsKKyAgICAgICAgICBzdWJ0 cmVlQ291bnQgKz0gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGQsIG5leHROYW1lLCBjYWxs YmFjaywgdHJhdmVyc2VDb250ZXh0KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAg ICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICAg ICB2YXIgbWFwc0FzQ2hpbGRyZW5BZGRlbmR1bSA9ICcnOworICAgICAgICAgIGlmIChSZWFjdEN1 cnJlbnRPd25lci5jdXJyZW50KSB7CisgICAgICAgICAgICB2YXIgbWFwc0FzQ2hpbGRyZW5Pd25l ck5hbWUgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LmdldE5hbWUoKTsKKyAgICAgICAgICAg IGlmIChtYXBzQXNDaGlsZHJlbk93bmVyTmFtZSkgeworICAgICAgICAgICAgICBtYXBzQXNDaGls ZHJlbkFkZGVuZHVtID0gJyBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG1hcHNBc0No aWxkcmVuT3duZXJOYW1lICsgJ2AuJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAg ICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZGlk V2FybkFib3V0TWFwcywgJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgbm90IHlldCBmdWxseSBz dXBwb3J0ZWQuIEl0IGlzIGFuICcgKyAnZXhwZXJpbWVudGFsIGZlYXR1cmUgdGhhdCBtaWdodCBi ZSByZW1vdmVkLiBDb252ZXJ0IGl0IHRvIGEgJyArICdzZXF1ZW5jZSAvIGl0ZXJhYmxlIG9mIGtl eWVkIFJlYWN0RWxlbWVudHMgaW5zdGVhZC4lcycsIG1hcHNBc0NoaWxkcmVuQWRkZW5kdW0pIDog dm9pZCAwOworICAgICAgICAgIGRpZFdhcm5BYm91dE1hcHMgPSB0cnVlOworICAgICAgICB9Cisg ICAgICAgIC8vIEl0ZXJhdG9yIHdpbGwgcHJvdmlkZSBlbnRyeSBbayx2XSB0dXBsZXMgcmF0aGVy IHRoYW4gdmFsdWVzLgorICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5k b25lKSB7CisgICAgICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTsKKyAgICAgICAgICBpZiAo ZW50cnkpIHsKKyAgICAgICAgICAgIGNoaWxkID0gZW50cnlbMV07CisgICAgICAgICAgICBuZXh0 TmFtZSA9IG5leHROYW1lUHJlZml4ICsgS2V5RXNjYXBlVXRpbHMuZXNjYXBlKGVudHJ5WzBdKSAr IFNVQlNFUEFSQVRPUiArIGdldENvbXBvbmVudEtleShjaGlsZCwgMCk7CisgICAgICAgICAgICBz dWJ0cmVlQ291bnQgKz0gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGQsIG5leHROYW1lLCBj YWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAg IH0KKyAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7CisgICAgICB2YXIgYWRkZW5k dW0gPSAnJzsKKyAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24n KSB7CisgICAgICAgIGFkZGVuZHVtID0gJyBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVj dGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5ICcgKyAnaW5zdGVhZCBvciB3cmFwIHRoZSBv YmplY3QgdXNpbmcgY3JlYXRlRnJhZ21lbnQob2JqZWN0KSBmcm9tIHRoZSAnICsgJ1JlYWN0IGFk ZC1vbnMuJzsKKyAgICAgICAgaWYgKGNoaWxkcmVuLl9pc1JlYWN0RWxlbWVudCkgeworICAgICAg ICAgIGFkZGVuZHVtID0gJyBJdCBsb29rcyBsaWtlIHlvdVwncmUgdXNpbmcgYW4gZWxlbWVudCBj cmVhdGVkIGJ5IGEgZGlmZmVyZW50ICcgKyAndmVyc2lvbiBvZiBSZWFjdC4gTWFrZSBzdXJlIHRv IHVzZSBvbmx5IG9uZSBjb3B5IG9mIFJlYWN0Lic7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFJl YWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHsKKyAgICAgICAgICB2YXIgbmFtZSA9IFJlYWN0Q3Vy cmVudE93bmVyLmN1cnJlbnQuZ2V0TmFtZSgpOworICAgICAgICAgIGlmIChuYW1lKSB7CisgICAg ICAgICAgICBhZGRlbmR1bSArPSAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFt ZSArICdgLic7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICB2YXIgY2hp bGRyZW5TdHJpbmcgPSBTdHJpbmcoY2hpbGRyZW4pOworICAgICAgIWZhbHNlID8gcHJvY2Vzcy5l bnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ09iamVjdHMg YXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogJXMpLiVzJywgY2hpbGRyZW5T dHJpbmcgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmpl Y3Qua2V5cyhjaGlsZHJlbikuam9pbignLCAnKSArICd9JyA6IGNoaWxkcmVuU3RyaW5nLCBhZGRl bmR1bSkgOiBfcHJvZEludmFyaWFudCgnMzEnLCBjaGlsZHJlblN0cmluZyA9PT0gJ1tvYmplY3Qg T2JqZWN0XScgPyAnb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKGNoaWxkcmVuKS5q b2luKCcsICcpICsgJ30nIDogY2hpbGRyZW5TdHJpbmcsIGFkZGVuZHVtKSA6IHZvaWQgMDsKKyAg ICB9CisgIH0KKworICByZXR1cm4gc3VidHJlZUNvdW50OworfQorCisvKioKKyAqIFRyYXZlcnNl cyBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJl bmAsIGJ1dAorICogbWlnaHQgYWxzbyBiZSBzcGVjaWZpZWQgdGhyb3VnaCBhdHRyaWJ1dGVzOgor ICoKKyAqIC0gYHRyYXZlcnNlQWxsQ2hpbGRyZW4odGhpcy5wcm9wcy5jaGlsZHJlbiwgLi4uKWAK KyAqIC0gYHRyYXZlcnNlQWxsQ2hpbGRyZW4odGhpcy5wcm9wcy5sZWZ0UGFuZWxDaGlsZHJlbiwg Li4uKWAKKyAqCisgKiBUaGUgYHRyYXZlcnNlQ29udGV4dGAgaXMgYW4gb3B0aW9uYWwgYXJndW1l bnQgdGhhdCBpcyBwYXNzZWQgdGhyb3VnaCB0aGUKKyAqIGVudGlyZSB0cmF2ZXJzYWwuIEl0IGNh biBiZSB1c2VkIHRvIHN0b3JlIGFjY3VtdWxhdGlvbnMgb3IgYW55dGhpbmcgZWxzZSB0aGF0Cisg KiB0aGUgY2FsbGJhY2sgbWlnaHQgZmluZCByZWxldmFudC4KKyAqCisgKiBAcGFyYW0gez8qfSBj aGlsZHJlbiBDaGlsZHJlbiB0cmVlIG9iamVjdC4KKyAqIEBwYXJhbSB7IWZ1bmN0aW9ufSBjYWxs YmFjayBUbyBpbnZva2UgdXBvbiB0cmF2ZXJzaW5nIGVhY2ggY2hpbGQuCisgKiBAcGFyYW0gez8q fSB0cmF2ZXJzZUNvbnRleHQgQ29udGV4dCBmb3IgdHJhdmVyc2FsLgorICogQHJldHVybiB7IW51 bWJlcn0gVGhlIG51bWJlciBvZiBjaGlsZHJlbiBpbiB0aGlzIHN1YnRyZWUuCisgKi8KK2Z1bmN0 aW9uIHRyYXZlcnNlQWxsQ2hpbGRyZW4oY2hpbGRyZW4sIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRl eHQpIHsKKyAgaWYgKGNoaWxkcmVuID09IG51bGwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisg IHJldHVybiB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZHJlbiwgJycsIGNhbGxiYWNrLCB0 cmF2ZXJzZUNvbnRleHQpOworfQorCittb2R1bGUuZXhwb3J0cyA9IHRyYXZlcnNlQWxsQ2hpbGRy ZW47ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4v c3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL3ZhbGlkYXRlRE9NTmVzdGluZy5qcyBiL3dlYi9w Z2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi92YWxpZGF0ZURPTU5lc3RpbmcuanMK bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLmZiMzdhYmQ2Ci0tLSAvZGV2L251 bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL3ZhbGlkYXRl RE9NTmVzdGluZy5qcwpAQCAtMCwwICsxLDM4MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxNS1w cmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBU aGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBm b3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhp cyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBj YW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisg KgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3Qt YXNzaWduJyk7CisKK3ZhciBlbXB0eUZ1bmN0aW9uID0gcmVxdWlyZSgnZmJqcy9saWIvZW1wdHlG dW5jdGlvbicpOwordmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7CisK K3ZhciB2YWxpZGF0ZURPTU5lc3RpbmcgPSBlbXB0eUZ1bmN0aW9uOworCitpZiAocHJvY2Vzcy5l bnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgeworICAvLyBUaGlzIHZhbGlkYXRpb24gY29k ZSB3YXMgd3JpdHRlbiBiYXNlZCBvbiB0aGUgSFRNTDUgcGFyc2luZyBzcGVjOgorICAvLyBodHRw czovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNoYXMtYW4tZWxl bWVudC1pbi1zY29wZQorICAvLworICAvLyBOb3RlOiB0aGlzIGRvZXMgbm90IGNhdGNoIGFsbCBp bnZhbGlkIG5lc3RpbmcsIG5vciBkb2VzIGl0IHRyeSB0byAoYXMgaXQncworICAvLyBub3QgY2xl YXIgd2hhdCBwcmFjdGljYWwgYmVuZWZpdCBkb2luZyBzbyBwcm92aWRlcyk7IGluc3RlYWQsIHdl IHdhcm4gb25seQorICAvLyBmb3IgY2FzZXMgd2hlcmUgdGhlIHBhcnNlciB3aWxsIGdpdmUgYSBw YXJzZSB0cmVlIGRpZmZlcmluZyBmcm9tIHdoYXQgUmVhY3QKKyAgLy8gaW50ZW5kZWQuIEZvciBl eGFtcGxlLCA8Yj48ZGl2PjwvZGl2PjwvYj4gaXMgaW52YWxpZCBidXQgd2UgZG9uJ3Qgd2Fybgor ICAvLyBiZWNhdXNlIGl0IHN0aWxsIHBhcnNlcyBjb3JyZWN0bHk7IHdlIGRvIHdhcm4gZm9yIG90 aGVyIGNhc2VzIGxpa2UgbmVzdGVkCisgIC8vIDxwPiB0YWdzIHdoZXJlIHRoZSBiZWdpbm5pbmcg b2YgdGhlIHNlY29uZCBlbGVtZW50IGltcGxpY2l0bHkgY2xvc2VzIHRoZQorICAvLyBmaXJzdCwg Y2F1c2luZyBhIGNvbmZ1c2luZyBtZXNzLgorCisgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3 Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3NwZWNpYWwKKyAgdmFyIHNwZWNpYWxUYWdzID0g WydhZGRyZXNzJywgJ2FwcGxldCcsICdhcmVhJywgJ2FydGljbGUnLCAnYXNpZGUnLCAnYmFzZScs ICdiYXNlZm9udCcsICdiZ3NvdW5kJywgJ2Jsb2NrcXVvdGUnLCAnYm9keScsICdicicsICdidXR0 b24nLCAnY2FwdGlvbicsICdjZW50ZXInLCAnY29sJywgJ2NvbGdyb3VwJywgJ2RkJywgJ2RldGFp bHMnLCAnZGlyJywgJ2RpdicsICdkbCcsICdkdCcsICdlbWJlZCcsICdmaWVsZHNldCcsICdmaWdj YXB0aW9uJywgJ2ZpZ3VyZScsICdmb290ZXInLCAnZm9ybScsICdmcmFtZScsICdmcmFtZXNldCcs ICdoMScsICdoMicsICdoMycsICdoNCcsICdoNScsICdoNicsICdoZWFkJywgJ2hlYWRlcicsICdo Z3JvdXAnLCAnaHInLCAnaHRtbCcsICdpZnJhbWUnLCAnaW1nJywgJ2lucHV0JywgJ2lzaW5kZXgn LCAnbGknLCAnbGluaycsICdsaXN0aW5nJywgJ21haW4nLCAnbWFycXVlZScsICdtZW51JywgJ21l bnVpdGVtJywgJ21ldGEnLCAnbmF2JywgJ25vZW1iZWQnLCAnbm9mcmFtZXMnLCAnbm9zY3JpcHQn LCAnb2JqZWN0JywgJ29sJywgJ3AnLCAncGFyYW0nLCAncGxhaW50ZXh0JywgJ3ByZScsICdzY3Jp cHQnLCAnc2VjdGlvbicsICdzZWxlY3QnLCAnc291cmNlJywgJ3N0eWxlJywgJ3N1bW1hcnknLCAn dGFibGUnLCAndGJvZHknLCAndGQnLCAndGVtcGxhdGUnLCAndGV4dGFyZWEnLCAndGZvb3QnLCAn dGgnLCAndGhlYWQnLCAndGl0bGUnLCAndHInLCAndHJhY2snLCAndWwnLCAnd2JyJywgJ3htcCdd OworCisgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5o dG1sI2hhcy1hbi1lbGVtZW50LWluLXNjb3BlCisgIHZhciBpblNjb3BlVGFncyA9IFsnYXBwbGV0 JywgJ2NhcHRpb24nLCAnaHRtbCcsICd0YWJsZScsICd0ZCcsICd0aCcsICdtYXJxdWVlJywgJ29i amVjdCcsICd0ZW1wbGF0ZScsCisKKyAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9t dWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaHRtbC1pbnRlZ3JhdGlvbi1wb2ludAorICAvLyBUT0RPOiBE aXN0aW5ndWlzaCBieSBuYW1lc3BhY2UgaGVyZSAtLSBmb3IgPHRpdGxlPiwgaW5jbHVkaW5nIGl0 IGhlcmUKKyAgLy8gZXJycyBvbiB0aGUgc2lkZSBvZiBmZXdlciB3YXJuaW5ncworICAnZm9yZWln bk9iamVjdCcsICdkZXNjJywgJ3RpdGxlJ107CisKKyAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hh dHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tYnV0dG9uLXNj b3BlCisgIHZhciBidXR0b25TY29wZVRhZ3MgPSBpblNjb3BlVGFncy5jb25jYXQoWydidXR0b24n XSk7CisKKyAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4 Lmh0bWwjZ2VuZXJhdGUtaW1wbGllZC1lbmQtdGFncworICB2YXIgaW1wbGllZEVuZFRhZ3MgPSBb J2RkJywgJ2R0JywgJ2xpJywgJ29wdGlvbicsICdvcHRncm91cCcsICdwJywgJ3JwJywgJ3J0J107 CisKKyAgdmFyIGVtcHR5QW5jZXN0b3JJbmZvID0geworICAgIGN1cnJlbnQ6IG51bGwsCisKKyAg ICBmb3JtVGFnOiBudWxsLAorICAgIGFUYWdJblNjb3BlOiBudWxsLAorICAgIGJ1dHRvblRhZ0lu U2NvcGU6IG51bGwsCisgICAgbm9iclRhZ0luU2NvcGU6IG51bGwsCisgICAgcFRhZ0luQnV0dG9u U2NvcGU6IG51bGwsCisKKyAgICBsaXN0SXRlbVRhZ0F1dG9jbG9zaW5nOiBudWxsLAorICAgIGRs SXRlbVRhZ0F1dG9jbG9zaW5nOiBudWxsCisgIH07CisKKyAgdmFyIHVwZGF0ZWRBbmNlc3Rvcklu Zm8gPSBmdW5jdGlvbiAob2xkSW5mbywgdGFnLCBpbnN0YW5jZSkgeworICAgIHZhciBhbmNlc3Rv ckluZm8gPSBfYXNzaWduKHt9LCBvbGRJbmZvIHx8IGVtcHR5QW5jZXN0b3JJbmZvKTsKKyAgICB2 YXIgaW5mbyA9IHsgdGFnOiB0YWcsIGluc3RhbmNlOiBpbnN0YW5jZSB9OworCisgICAgaWYgKGlu U2NvcGVUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEpIHsKKyAgICAgIGFuY2VzdG9ySW5mby5hVGFn SW5TY29wZSA9IG51bGw7CisgICAgICBhbmNlc3RvckluZm8uYnV0dG9uVGFnSW5TY29wZSA9IG51 bGw7CisgICAgICBhbmNlc3RvckluZm8ubm9iclRhZ0luU2NvcGUgPSBudWxsOworICAgIH0KKyAg ICBpZiAoYnV0dG9uU2NvcGVUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEpIHsKKyAgICAgIGFuY2Vz dG9ySW5mby5wVGFnSW5CdXR0b25TY29wZSA9IG51bGw7CisgICAgfQorCisgICAgLy8gU2VlIHJ1 bGVzIGZvciAnbGknLCAnZGQnLCAnZHQnIHN0YXJ0IHRhZ3MgaW4KKyAgICAvLyBodHRwczovL2h0 bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5i b2R5CisgICAgaWYgKHNwZWNpYWxUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEgJiYgdGFnICE9PSAn YWRkcmVzcycgJiYgdGFnICE9PSAnZGl2JyAmJiB0YWcgIT09ICdwJykgeworICAgICAgYW5jZXN0 b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3NpbmcgPSBudWxsOworICAgICAgYW5jZXN0b3JJbmZv LmRsSXRlbVRhZ0F1dG9jbG9zaW5nID0gbnVsbDsKKyAgICB9CisKKyAgICBhbmNlc3RvckluZm8u Y3VycmVudCA9IGluZm87CisKKyAgICBpZiAodGFnID09PSAnZm9ybScpIHsKKyAgICAgIGFuY2Vz dG9ySW5mby5mb3JtVGFnID0gaW5mbzsKKyAgICB9CisgICAgaWYgKHRhZyA9PT0gJ2EnKSB7Cisg ICAgICBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGUgPSBpbmZvOworICAgIH0KKyAgICBpZiAodGFn ID09PSAnYnV0dG9uJykgeworICAgICAgYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGUgPSBp bmZvOworICAgIH0KKyAgICBpZiAodGFnID09PSAnbm9icicpIHsKKyAgICAgIGFuY2VzdG9ySW5m by5ub2JyVGFnSW5TY29wZSA9IGluZm87CisgICAgfQorICAgIGlmICh0YWcgPT09ICdwJykgewor ICAgICAgYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlID0gaW5mbzsKKyAgICB9CisgICAg aWYgKHRhZyA9PT0gJ2xpJykgeworICAgICAgYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Ns b3NpbmcgPSBpbmZvOworICAgIH0KKyAgICBpZiAodGFnID09PSAnZGQnIHx8IHRhZyA9PT0gJ2R0 JykgeworICAgICAgYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nID0gaW5mbzsKKyAg ICB9CisKKyAgICByZXR1cm4gYW5jZXN0b3JJbmZvOworICB9OworCisgIC8qKgorICAgKiBSZXR1 cm5zIHdoZXRoZXIKKyAgICovCisgIHZhciBpc1RhZ1ZhbGlkV2l0aFBhcmVudCA9IGZ1bmN0aW9u ICh0YWcsIHBhcmVudFRhZykgeworICAgIC8vIEZpcnN0LCBsZXQncyBjaGVjayBpZiB3ZSdyZSBp biBhbiB1bnVzdWFsIHBhcnNpbmcgbW9kZS4uLgorICAgIHN3aXRjaCAocGFyZW50VGFnKSB7Cisg ICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRt bCNwYXJzaW5nLW1haW4taW5zZWxlY3QKKyAgICAgIGNhc2UgJ3NlbGVjdCc6CisgICAgICAgIHJl dHVybiB0YWcgPT09ICdvcHRpb24nIHx8IHRhZyA9PT0gJ29wdGdyb3VwJyB8fCB0YWcgPT09ICcj dGV4dCc7CisgICAgICBjYXNlICdvcHRncm91cCc6CisgICAgICAgIHJldHVybiB0YWcgPT09ICdv cHRpb24nIHx8IHRhZyA9PT0gJyN0ZXh0JzsKKyAgICAgIC8vIFN0cmljdGx5IHNwZWFraW5nLCBz ZWVpbmcgYW4gPG9wdGlvbj4gZG9lc24ndCBtZWFuIHdlJ3JlIGluIGEgPHNlbGVjdD4KKyAgICAg IC8vIGJ1dAorICAgICAgY2FzZSAnb3B0aW9uJzoKKyAgICAgICAgcmV0dXJuIHRhZyA9PT0gJyN0 ZXh0JzsKKworICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uv c3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGQKKyAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVj LndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmNhcHRpb24K KyAgICAgIC8vIE5vIHNwZWNpYWwgYmVoYXZpb3Igc2luY2UgdGhlc2UgcnVsZXMgZmFsbCBiYWNr IHRvICJpbiBib2R5IiBtb2RlIGZvcgorICAgICAgLy8gYWxsIGV4Y2VwdCBzcGVjaWFsIHRhYmxl IG5vZGVzIHdoaWNoIGNhdXNlIGJhZCBwYXJzaW5nIGJlaGF2aW9yIGFueXdheS4KKworICAgICAg Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFy c2luZy1tYWluLWludHIKKyAgICAgIGNhc2UgJ3RyJzoKKyAgICAgICAgcmV0dXJuIHRhZyA9PT0g J3RoJyB8fCB0YWcgPT09ICd0ZCcgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3Njcmlw dCcgfHwgdGFnID09PSAndGVtcGxhdGUnOworCisgICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53 aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50Ym9keQorICAg ICAgY2FzZSAndGJvZHknOgorICAgICAgY2FzZSAndGhlYWQnOgorICAgICAgY2FzZSAndGZvb3Qn OgorICAgICAgICByZXR1cm4gdGFnID09PSAndHInIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcg PT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJzsKKworICAgICAgLy8gaHR0cHM6Ly9o dG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWlu Y29sZ3JvdXAKKyAgICAgIGNhc2UgJ2NvbGdyb3VwJzoKKyAgICAgICAgcmV0dXJuIHRhZyA9PT0g J2NvbCcgfHwgdGFnID09PSAndGVtcGxhdGUnOworCisgICAgICAvLyBodHRwczovL2h0bWwuc3Bl Yy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50YWJsZQor ICAgICAgY2FzZSAndGFibGUnOgorICAgICAgICByZXR1cm4gdGFnID09PSAnY2FwdGlvbicgfHwg dGFnID09PSAnY29sZ3JvdXAnIHx8IHRhZyA9PT0gJ3Rib2R5JyB8fCB0YWcgPT09ICd0Zm9vdCcg fHwgdGFnID09PSAndGhlYWQnIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQn IHx8IHRhZyA9PT0gJ3RlbXBsYXRlJzsKKworICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hh dHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluaGVhZAorICAgICAg Y2FzZSAnaGVhZCc6CisgICAgICAgIHJldHVybiB0YWcgPT09ICdiYXNlJyB8fCB0YWcgPT09ICdi YXNlZm9udCcgfHwgdGFnID09PSAnYmdzb3VuZCcgfHwgdGFnID09PSAnbGluaycgfHwgdGFnID09 PSAnbWV0YScgfHwgdGFnID09PSAndGl0bGUnIHx8IHRhZyA9PT0gJ25vc2NyaXB0JyB8fCB0YWcg PT09ICdub2ZyYW1lcycgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwg dGFnID09PSAndGVtcGxhdGUnOworCisgICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cu b3JnL211bHRpcGFnZS9zZW1hbnRpY3MuaHRtbCN0aGUtaHRtbC1lbGVtZW50CisgICAgICBjYXNl ICdodG1sJzoKKyAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2hlYWQnIHx8IHRhZyA9PT0gJ2JvZHkn OworICAgICAgY2FzZSAnI2RvY3VtZW50JzoKKyAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2h0bWwn OworICAgIH0KKworICAgIC8vIFByb2JhYmx5IGluIHRoZSAiaW4gYm9keSIgcGFyc2luZyBtb2Rl LCBzbyB3ZSBvdXRsYXcgb25seSB0YWcgY29tYm9zCisgICAgLy8gd2hlcmUgdGhlIHBhcnNpbmcg cnVsZXMgY2F1c2UgaW1wbGljaXQgb3BlbnMgb3IgY2xvc2VzIHRvIGJlIGFkZGVkLgorICAgIC8v IGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNp bmctbWFpbi1pbmJvZHkKKyAgICBzd2l0Y2ggKHRhZykgeworICAgICAgY2FzZSAnaDEnOgorICAg ICAgY2FzZSAnaDInOgorICAgICAgY2FzZSAnaDMnOgorICAgICAgY2FzZSAnaDQnOgorICAgICAg Y2FzZSAnaDUnOgorICAgICAgY2FzZSAnaDYnOgorICAgICAgICByZXR1cm4gcGFyZW50VGFnICE9 PSAnaDEnICYmIHBhcmVudFRhZyAhPT0gJ2gyJyAmJiBwYXJlbnRUYWcgIT09ICdoMycgJiYgcGFy ZW50VGFnICE9PSAnaDQnICYmIHBhcmVudFRhZyAhPT0gJ2g1JyAmJiBwYXJlbnRUYWcgIT09ICdo Nic7CisKKyAgICAgIGNhc2UgJ3JwJzoKKyAgICAgIGNhc2UgJ3J0JzoKKyAgICAgICAgcmV0dXJu IGltcGxpZWRFbmRUYWdzLmluZGV4T2YocGFyZW50VGFnKSA9PT0gLTE7CisKKyAgICAgIGNhc2Ug J2JvZHknOgorICAgICAgY2FzZSAnY2FwdGlvbic6CisgICAgICBjYXNlICdjb2wnOgorICAgICAg Y2FzZSAnY29sZ3JvdXAnOgorICAgICAgY2FzZSAnZnJhbWUnOgorICAgICAgY2FzZSAnaGVhZCc6 CisgICAgICBjYXNlICdodG1sJzoKKyAgICAgIGNhc2UgJ3Rib2R5JzoKKyAgICAgIGNhc2UgJ3Rk JzoKKyAgICAgIGNhc2UgJ3Rmb290JzoKKyAgICAgIGNhc2UgJ3RoJzoKKyAgICAgIGNhc2UgJ3Ro ZWFkJzoKKyAgICAgIGNhc2UgJ3RyJzoKKyAgICAgICAgLy8gVGhlc2UgdGFncyBhcmUgb25seSB2 YWxpZCB3aXRoIGEgZmV3IHBhcmVudHMgdGhhdCBoYXZlIHNwZWNpYWwgY2hpbGQKKyAgICAgICAg Ly8gcGFyc2luZyBydWxlcyAtLSBpZiB3ZSdyZSBkb3duIGhlcmUsIHRoZW4gbm9uZSBvZiB0aG9z ZSBtYXRjaGVkIGFuZAorICAgICAgICAvLyBzbyB3ZSBhbGxvdyBpdCBvbmx5IGlmIHdlIGRvbid0 IGtub3cgd2hhdCB0aGUgcGFyZW50IGlzLCBhcyBhbGwgb3RoZXIKKyAgICAgICAgLy8gY2FzZXMg YXJlIGludmFsaWQuCisgICAgICAgIHJldHVybiBwYXJlbnRUYWcgPT0gbnVsbDsKKyAgICB9CisK KyAgICByZXR1cm4gdHJ1ZTsKKyAgfTsKKworICAvKioKKyAgICogUmV0dXJucyB3aGV0aGVyCisg ICAqLworICB2YXIgZmluZEludmFsaWRBbmNlc3RvckZvclRhZyA9IGZ1bmN0aW9uICh0YWcsIGFu Y2VzdG9ySW5mbykgeworICAgIHN3aXRjaCAodGFnKSB7CisgICAgICBjYXNlICdhZGRyZXNzJzoK KyAgICAgIGNhc2UgJ2FydGljbGUnOgorICAgICAgY2FzZSAnYXNpZGUnOgorICAgICAgY2FzZSAn YmxvY2txdW90ZSc6CisgICAgICBjYXNlICdjZW50ZXInOgorICAgICAgY2FzZSAnZGV0YWlscyc6 CisgICAgICBjYXNlICdkaWFsb2cnOgorICAgICAgY2FzZSAnZGlyJzoKKyAgICAgIGNhc2UgJ2Rp dic6CisgICAgICBjYXNlICdkbCc6CisgICAgICBjYXNlICdmaWVsZHNldCc6CisgICAgICBjYXNl ICdmaWdjYXB0aW9uJzoKKyAgICAgIGNhc2UgJ2ZpZ3VyZSc6CisgICAgICBjYXNlICdmb290ZXIn OgorICAgICAgY2FzZSAnaGVhZGVyJzoKKyAgICAgIGNhc2UgJ2hncm91cCc6CisgICAgICBjYXNl ICdtYWluJzoKKyAgICAgIGNhc2UgJ21lbnUnOgorICAgICAgY2FzZSAnbmF2JzoKKyAgICAgIGNh c2UgJ29sJzoKKyAgICAgIGNhc2UgJ3AnOgorICAgICAgY2FzZSAnc2VjdGlvbic6CisgICAgICBj YXNlICdzdW1tYXJ5JzoKKyAgICAgIGNhc2UgJ3VsJzoKKworICAgICAgY2FzZSAncHJlJzoKKyAg ICAgIGNhc2UgJ2xpc3RpbmcnOgorCisgICAgICBjYXNlICd0YWJsZSc6CisKKyAgICAgIGNhc2Ug J2hyJzoKKworICAgICAgY2FzZSAneG1wJzoKKworICAgICAgY2FzZSAnaDEnOgorICAgICAgY2Fz ZSAnaDInOgorICAgICAgY2FzZSAnaDMnOgorICAgICAgY2FzZSAnaDQnOgorICAgICAgY2FzZSAn aDUnOgorICAgICAgY2FzZSAnaDYnOgorICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLnBUYWdJ bkJ1dHRvblNjb3BlOworCisgICAgICBjYXNlICdmb3JtJzoKKyAgICAgICAgcmV0dXJuIGFuY2Vz dG9ySW5mby5mb3JtVGFnIHx8IGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZTsKKworICAg ICAgY2FzZSAnbGknOgorICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0 b2Nsb3Npbmc7CisKKyAgICAgIGNhc2UgJ2RkJzoKKyAgICAgIGNhc2UgJ2R0JzoKKyAgICAgICAg cmV0dXJuIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZzsKKworICAgICAgY2FzZSAn YnV0dG9uJzoKKyAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlOwor CisgICAgICBjYXNlICdhJzoKKyAgICAgICAgLy8gU3BlYyBzYXlzIHNvbWV0aGluZyBhYm91dCBz dG9yaW5nIGEgbGlzdCBvZiBtYXJrZXJzLCBidXQgaXQgc291bmRzCisgICAgICAgIC8vIGVxdWl2 YWxlbnQgdG8gdGhpcyBjaGVjay4KKyAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5hVGFnSW5T Y29wZTsKKworICAgICAgY2FzZSAnbm9icic6CisgICAgICAgIHJldHVybiBhbmNlc3RvckluZm8u bm9iclRhZ0luU2NvcGU7CisgICAgfQorCisgICAgcmV0dXJuIG51bGw7CisgIH07CisKKyAgLyoq CisgICAqIEdpdmVuIGEgUmVhY3RDb21wb3NpdGVDb21wb25lbnQgaW5zdGFuY2UsIHJldHVybiBh IGxpc3Qgb2YgaXRzIHJlY3Vyc2l2ZQorICAgKiBvd25lcnMsIHN0YXJ0aW5nIGF0IHRoZSByb290 IGFuZCBlbmRpbmcgd2l0aCB0aGUgaW5zdGFuY2UgaXRzZWxmLgorICAgKi8KKyAgdmFyIGZpbmRP d25lclN0YWNrID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7CisgICAgaWYgKCFpbnN0YW5jZSkgewor ICAgICAgcmV0dXJuIFtdOworICAgIH0KKworICAgIHZhciBzdGFjayA9IFtdOworICAgIGRvIHsK KyAgICAgIHN0YWNrLnB1c2goaW5zdGFuY2UpOworICAgIH0gd2hpbGUgKGluc3RhbmNlID0gaW5z dGFuY2UuX2N1cnJlbnRFbGVtZW50Ll9vd25lcik7CisgICAgc3RhY2sucmV2ZXJzZSgpOworICAg IHJldHVybiBzdGFjazsKKyAgfTsKKworICB2YXIgZGlkV2FybiA9IHt9OworCisgIHZhbGlkYXRl RE9NTmVzdGluZyA9IGZ1bmN0aW9uIChjaGlsZFRhZywgY2hpbGRUZXh0LCBjaGlsZEluc3RhbmNl LCBhbmNlc3RvckluZm8pIHsKKyAgICBhbmNlc3RvckluZm8gPSBhbmNlc3RvckluZm8gfHwgZW1w dHlBbmNlc3RvckluZm87CisgICAgdmFyIHBhcmVudEluZm8gPSBhbmNlc3RvckluZm8uY3VycmVu dDsKKyAgICB2YXIgcGFyZW50VGFnID0gcGFyZW50SW5mbyAmJiBwYXJlbnRJbmZvLnRhZzsKKwor ICAgIGlmIChjaGlsZFRleHQgIT0gbnVsbCkgeworICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYg IT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoY2hpbGRUYWcgPT0gbnVsbCwgJ3ZhbGlkYXRlRE9N TmVzdGluZzogd2hlbiBjaGlsZFRleHQgaXMgcGFzc2VkLCBjaGlsZFRhZyBzaG91bGQgYmUgbnVs bCcpIDogdm9pZCAwOworICAgICAgY2hpbGRUYWcgPSAnI3RleHQnOworICAgIH0KKworICAgIHZh ciBpbnZhbGlkUGFyZW50ID0gaXNUYWdWYWxpZFdpdGhQYXJlbnQoY2hpbGRUYWcsIHBhcmVudFRh ZykgPyBudWxsIDogcGFyZW50SW5mbzsKKyAgICB2YXIgaW52YWxpZEFuY2VzdG9yID0gaW52YWxp ZFBhcmVudCA/IG51bGwgOiBmaW5kSW52YWxpZEFuY2VzdG9yRm9yVGFnKGNoaWxkVGFnLCBhbmNl c3RvckluZm8pOworICAgIHZhciBwcm9ibGVtYXRpYyA9IGludmFsaWRQYXJlbnQgfHwgaW52YWxp ZEFuY2VzdG9yOworCisgICAgaWYgKHByb2JsZW1hdGljKSB7CisgICAgICB2YXIgYW5jZXN0b3JU YWcgPSBwcm9ibGVtYXRpYy50YWc7CisgICAgICB2YXIgYW5jZXN0b3JJbnN0YW5jZSA9IHByb2Js ZW1hdGljLmluc3RhbmNlOworCisgICAgICB2YXIgY2hpbGRPd25lciA9IGNoaWxkSW5zdGFuY2Ug JiYgY2hpbGRJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQuX293bmVyOworICAgICAgdmFyIGFuY2Vz dG9yT3duZXIgPSBhbmNlc3Rvckluc3RhbmNlICYmIGFuY2VzdG9ySW5zdGFuY2UuX2N1cnJlbnRF bGVtZW50Ll9vd25lcjsKKworICAgICAgdmFyIGNoaWxkT3duZXJzID0gZmluZE93bmVyU3RhY2so Y2hpbGRPd25lcik7CisgICAgICB2YXIgYW5jZXN0b3JPd25lcnMgPSBmaW5kT3duZXJTdGFjayhh bmNlc3Rvck93bmVyKTsKKworICAgICAgdmFyIG1pblN0YWNrTGVuID0gTWF0aC5taW4oY2hpbGRP d25lcnMubGVuZ3RoLCBhbmNlc3Rvck93bmVycy5sZW5ndGgpOworICAgICAgdmFyIGk7CisKKyAg ICAgIHZhciBkZWVwZXN0Q29tbW9uID0gLTE7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbWluU3Rh Y2tMZW47IGkrKykgeworICAgICAgICBpZiAoY2hpbGRPd25lcnNbaV0gPT09IGFuY2VzdG9yT3du ZXJzW2ldKSB7CisgICAgICAgICAgZGVlcGVzdENvbW1vbiA9IGk7CisgICAgICAgIH0gZWxzZSB7 CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdmFyIFVOS05P V04gPSAnKHVua25vd24pJzsKKyAgICAgIHZhciBjaGlsZE93bmVyTmFtZXMgPSBjaGlsZE93bmVy cy5zbGljZShkZWVwZXN0Q29tbW9uICsgMSkubWFwKGZ1bmN0aW9uIChpbnN0KSB7CisgICAgICAg IHJldHVybiBpbnN0LmdldE5hbWUoKSB8fCBVTktOT1dOOworICAgICAgfSk7CisgICAgICB2YXIg YW5jZXN0b3JPd25lck5hbWVzID0gYW5jZXN0b3JPd25lcnMuc2xpY2UoZGVlcGVzdENvbW1vbiAr IDEpLm1hcChmdW5jdGlvbiAoaW5zdCkgeworICAgICAgICByZXR1cm4gaW5zdC5nZXROYW1lKCkg fHwgVU5LTk9XTjsKKyAgICAgIH0pOworICAgICAgdmFyIG93bmVySW5mbyA9IFtdLmNvbmNhdCgK KyAgICAgIC8vIElmIHRoZSBwYXJlbnQgYW5kIGNoaWxkIGluc3RhbmNlcyBoYXZlIGEgY29tbW9u IG93bmVyIGFuY2VzdG9yLCBzdGFydAorICAgICAgLy8gd2l0aCB0aGF0IC0tIG90aGVyd2lzZSB3 ZSBqdXN0IHN0YXJ0IHdpdGggdGhlIHBhcmVudCdzIG93bmVycy4KKyAgICAgIGRlZXBlc3RDb21t b24gIT09IC0xID8gY2hpbGRPd25lcnNbZGVlcGVzdENvbW1vbl0uZ2V0TmFtZSgpIHx8IFVOS05P V04gOiBbXSwgYW5jZXN0b3JPd25lck5hbWVzLCBhbmNlc3RvclRhZywKKyAgICAgIC8vIElmIHdl J3JlIHdhcm5pbmcgYWJvdXQgYW4gaW52YWxpZCAobm9uLXBhcmVudCkgYW5jZXN0cnksIGFkZCAn Li4uJworICAgICAgaW52YWxpZEFuY2VzdG9yID8gWycuLi4nXSA6IFtdLCBjaGlsZE93bmVyTmFt ZXMsIGNoaWxkVGFnKS5qb2luKCcgPiAnKTsKKworICAgICAgdmFyIHdhcm5LZXkgPSAhIWludmFs aWRQYXJlbnQgKyAnfCcgKyBjaGlsZFRhZyArICd8JyArIGFuY2VzdG9yVGFnICsgJ3wnICsgb3du ZXJJbmZvOworICAgICAgaWYgKGRpZFdhcm5bd2FybktleV0pIHsKKyAgICAgICAgcmV0dXJuOwor ICAgICAgfQorICAgICAgZGlkV2Fyblt3YXJuS2V5XSA9IHRydWU7CisKKyAgICAgIHZhciB0YWdE aXNwbGF5TmFtZSA9IGNoaWxkVGFnOworICAgICAgdmFyIHdoaXRlc3BhY2VJbmZvID0gJyc7Cisg ICAgICBpZiAoY2hpbGRUYWcgPT09ICcjdGV4dCcpIHsKKyAgICAgICAgaWYgKC9cUy8udGVzdChj aGlsZFRleHQpKSB7CisgICAgICAgICAgdGFnRGlzcGxheU5hbWUgPSAnVGV4dCBub2Rlcyc7Cisg ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGFnRGlzcGxheU5hbWUgPSAnV2hpdGVzcGFjZSB0 ZXh0IG5vZGVzJzsKKyAgICAgICAgICB3aGl0ZXNwYWNlSW5mbyA9ICcgTWFrZSBzdXJlIHlvdSBk b25cJ3QgaGF2ZSBhbnkgZXh0cmEgd2hpdGVzcGFjZSBiZXR3ZWVuIHRhZ3Mgb24gJyArICdlYWNo IGxpbmUgb2YgeW91ciBzb3VyY2UgY29kZS4nOworICAgICAgICB9CisgICAgICB9IGVsc2Ugewor ICAgICAgICB0YWdEaXNwbGF5TmFtZSA9ICc8JyArIGNoaWxkVGFnICsgJz4nOworICAgICAgfQor CisgICAgICBpZiAoaW52YWxpZFBhcmVudCkgeworICAgICAgICB2YXIgaW5mbyA9ICcnOworICAg ICAgICBpZiAoYW5jZXN0b3JUYWcgPT09ICd0YWJsZScgJiYgY2hpbGRUYWcgPT09ICd0cicpIHsK KyAgICAgICAgICBpbmZvICs9ICcgQWRkIGEgPHRib2R5PiB0byB5b3VyIGNvZGUgdG8gbWF0Y2gg dGhlIERPTSB0cmVlIGdlbmVyYXRlZCBieSAnICsgJ3RoZSBicm93c2VyLic7CisgICAgICAgIH0K KyAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmco ZmFsc2UsICd2YWxpZGF0ZURPTU5lc3RpbmcoLi4uKTogJXMgY2Fubm90IGFwcGVhciBhcyBhIGNo aWxkIG9mIDwlcz4uJXMgJyArICdTZWUgJXMuJXMnLCB0YWdEaXNwbGF5TmFtZSwgYW5jZXN0b3JU YWcsIHdoaXRlc3BhY2VJbmZvLCBvd25lckluZm8sIGluZm8pIDogdm9pZCAwOworICAgICAgfSBl bHNlIHsKKyAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdh cm5pbmcoZmFsc2UsICd2YWxpZGF0ZURPTU5lc3RpbmcoLi4uKTogJXMgY2Fubm90IGFwcGVhciBh cyBhIGRlc2NlbmRhbnQgb2YgJyArICc8JXM+LiBTZWUgJXMuJywgdGFnRGlzcGxheU5hbWUsIGFu Y2VzdG9yVGFnLCBvd25lckluZm8pIDogdm9pZCAwOworICAgICAgfQorICAgIH0KKyAgfTsKKwor ICB2YWxpZGF0ZURPTU5lc3RpbmcudXBkYXRlZEFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3Rv ckluZm87CisKKyAgLy8gRm9yIHRlc3RpbmcKKyAgdmFsaWRhdGVET01OZXN0aW5nLmlzVGFnVmFs aWRJbkNvbnRleHQgPSBmdW5jdGlvbiAodGFnLCBhbmNlc3RvckluZm8pIHsKKyAgICBhbmNlc3Rv ckluZm8gPSBhbmNlc3RvckluZm8gfHwgZW1wdHlBbmNlc3RvckluZm87CisgICAgdmFyIHBhcmVu dEluZm8gPSBhbmNlc3RvckluZm8uY3VycmVudDsKKyAgICB2YXIgcGFyZW50VGFnID0gcGFyZW50 SW5mbyAmJiBwYXJlbnRJbmZvLnRhZzsKKyAgICByZXR1cm4gaXNUYWdWYWxpZFdpdGhQYXJlbnQo dGFnLCBwYXJlbnRUYWcpICYmICFmaW5kSW52YWxpZEFuY2VzdG9yRm9yVGFnKHRhZywgYW5jZXN0 b3JJbmZvKTsKKyAgfTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSB2YWxpZGF0ZURPTU5lc3Rpbmc7 ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3Rh dGljL3ZlbmRvci9yZWFjdC1kb20vcGFja2FnZS5qc29uIGIvd2ViL3BnYWRtaW4vc3RhdGljL3Zl bmRvci9yZWFjdC1kb20vcGFja2FnZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw MDAwMDAwLi5mYzA5NDQ3MAotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92 ZW5kb3IvcmVhY3QtZG9tL3BhY2thZ2UuanNvbgpAQCAtMCwwICsxLDM3IEBACit7CisgICJuYW1l IjogInJlYWN0LWRvbSIsCisgICJ2ZXJzaW9uIjogIjE1LjQuMiIsCisgICJkZXNjcmlwdGlvbiI6 ICJSZWFjdCBwYWNrYWdlIGZvciB3b3JraW5nIHdpdGggdGhlIERPTS4iLAorICAibWFpbiI6ICJp bmRleC5qcyIsCisgICJyZXBvc2l0b3J5IjogImZhY2Vib29rL3JlYWN0IiwKKyAgImtleXdvcmRz IjogWworICAgICJyZWFjdCIKKyAgXSwKKyAgImxpY2Vuc2UiOiAiQlNELTMtQ2xhdXNlIiwKKyAg ImJ1Z3MiOiB7CisgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3Qv aXNzdWVzIgorICB9LAorICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8v cmVhY3QvIiwKKyAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAiZmJqcyI6ICJeMC44LjEiLAorICAg ICJsb29zZS1lbnZpZnkiOiAiXjEuMS4wIiwKKyAgICAib2JqZWN0LWFzc2lnbiI6ICJeNC4xLjAi CisgIH0sCisgICJwZWVyRGVwZW5kZW5jaWVzIjogeworICAgICJyZWFjdCI6ICJeMTUuNC4yIgor ICB9LAorICAiZmlsZXMiOiBbCisgICAgIkxJQ0VOU0UiLAorICAgICJQQVRFTlRTIiwKKyAgICAi UkVBRE1FLm1kIiwKKyAgICAiZGlzdC8iLAorICAgICJsaWIvIiwKKyAgICAiaW5kZXguanMiLAor ICAgICJzZXJ2ZXIuanMiCisgIF0sCisgICJicm93c2VyaWZ5IjogeworICAgICJ0cmFuc2Zvcm0i OiBbCisgICAgICAibG9vc2UtZW52aWZ5IgorICAgIF0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvd2Vi L3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vc2VydmVyLmpzIGIvd2ViL3BnYWRtaW4v c3RhdGljL3ZlbmRvci9yZWFjdC1kb20vc2VydmVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAwLi41NTk2NzYxMAotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0 YXRpYy92ZW5kb3IvcmVhY3QtZG9tL3NlcnZlci5qcwpAQCAtMCwwICsxLDMgQEAKKyd1c2Ugc3Ry aWN0JzsKKworbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9SZWFjdERPTVNlcnZlcicp OwpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9MSUNFTlNFIGIv d2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAwLi45MWI4ZjZmNwotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2Fk bWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvTElDRU5TRQpAQCAtMCwwICsxLDMxIEBACitCU0QgTGlj ZW5zZQorCitGb3IgUmVhY3Qgc29mdHdhcmUKKworQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQs IEZhY2Vib29rLCBJbmMuCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBh bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZp Y2F0aW9uLAorYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0 aW9ucyBhcmUgbWV0OgorCisgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAgIGxpc3Qgb2YgY29uZGl0 aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgKiBSZWRpc3RyaWJ1dGlvbnMg aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2Us CisgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy IGluIHRoZSBkb2N1bWVudGF0aW9uCisgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICogTmVpdGhlciB0aGUgbmFtZSBGYWNlYm9vayBu b3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8KKyAgIGVuZG9y c2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0 IHNwZWNpZmljCisgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUg SVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFT IElTIiBBTkQKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC VVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCitESVNDTEFJTUVE LiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMg QkUgTElBQkxFIEZPUgorQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisoSU5DTFVESU5HLCBCVVQgTk9U IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7 CitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O KSBIT1dFVkVSIENBVVNFRCBBTkQgT04KK0FOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJ R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0Yg VEhJUworU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD SCBEQU1BR0UuCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0L1BB VEVOVFMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0L1BBVEVOVFMKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjljOWY4ZTg3Ci0tLSAvZGV2L251bGwKKysrIGIv d2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9QQVRFTlRTCkBAIC0wLDAgKzEsMzMgQEAK K0FkZGl0aW9uYWwgR3JhbnQgb2YgUGF0ZW50IFJpZ2h0cyBWZXJzaW9uIDIKKworIlNvZnR3YXJl IiBtZWFucyB0aGUgUmVhY3Qgc29mdHdhcmUgZGlzdHJpYnV0ZWQgYnkgRmFjZWJvb2ssIEluYy4K KworRmFjZWJvb2ssIEluYy4gKCJGYWNlYm9vayIpIGhlcmVieSBncmFudHMgdG8gZWFjaCByZWNp cGllbnQgb2YgdGhlIFNvZnR3YXJlCisoInlvdSIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIHJv eWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSwgaXJyZXZvY2FibGUKKyhzdWJqZWN0IHRvIHRoZSB0 ZXJtaW5hdGlvbiBwcm92aXNpb24gYmVsb3cpIGxpY2Vuc2UgdW5kZXIgYW55IE5lY2Vzc2FyeQor Q2xhaW1zLCB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1w b3J0LCBhbmQgb3RoZXJ3aXNlCit0cmFuc2ZlciB0aGUgU29mdHdhcmUuIEZvciBhdm9pZGFuY2Ug b2YgZG91YnQsIG5vIGxpY2Vuc2UgaXMgZ3JhbnRlZCB1bmRlcgorRmFjZWJvb2sncyByaWdodHMg aW4gYW55IHBhdGVudCBjbGFpbXMgdGhhdCBhcmUgaW5mcmluZ2VkIGJ5IChpKSBtb2RpZmljYXRp b25zCit0byB0aGUgU29mdHdhcmUgbWFkZSBieSB5b3Ugb3IgYW55IHRoaXJkIHBhcnR5IG9yIChp aSkgdGhlIFNvZnR3YXJlIGluCitjb21iaW5hdGlvbiB3aXRoIGFueSBzb2Z0d2FyZSBvciBvdGhl ciB0ZWNobm9sb2d5LgorCitUaGUgbGljZW5zZSBncmFudGVkIGhlcmV1bmRlciB3aWxsIHRlcm1p bmF0ZSwgYXV0b21hdGljYWxseSBhbmQgd2l0aG91dCBub3RpY2UsCitpZiB5b3UgKG9yIGFueSBv ZiB5b3VyIHN1YnNpZGlhcmllcywgY29ycG9yYXRlIGFmZmlsaWF0ZXMgb3IgYWdlbnRzKSBpbml0 aWF0ZQorZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgb3IgdGFrZSBhIGRpcmVjdCBmaW5hbmNpYWwg aW50ZXJlc3QgaW4sIGFueSBQYXRlbnQKK0Fzc2VydGlvbjogKGkpIGFnYWluc3QgRmFjZWJvb2sg b3IgYW55IG9mIGl0cyBzdWJzaWRpYXJpZXMgb3IgY29ycG9yYXRlCithZmZpbGlhdGVzLCAoaWkp IGFnYWluc3QgYW55IHBhcnR5IGlmIHN1Y2ggUGF0ZW50IEFzc2VydGlvbiBhcmlzZXMgaW4gd2hv bGUgb3IKK2luIHBhcnQgZnJvbSBhbnkgc29mdHdhcmUsIHRlY2hub2xvZ3ksIHByb2R1Y3Qgb3Ig c2VydmljZSBvZiBGYWNlYm9vayBvciBhbnkgb2YKK2l0cyBzdWJzaWRpYXJpZXMgb3IgY29ycG9y YXRlIGFmZmlsaWF0ZXMsIG9yIChpaWkpIGFnYWluc3QgYW55IHBhcnR5IHJlbGF0aW5nCit0byB0 aGUgU29mdHdhcmUuIE5vdHdpdGhzdGFuZGluZyB0aGUgZm9yZWdvaW5nLCBpZiBGYWNlYm9vayBv ciBhbnkgb2YgaXRzCitzdWJzaWRpYXJpZXMgb3IgY29ycG9yYXRlIGFmZmlsaWF0ZXMgZmlsZXMg YSBsYXdzdWl0IGFsbGVnaW5nIHBhdGVudAoraW5mcmluZ2VtZW50IGFnYWluc3QgeW91IGluIHRo ZSBmaXJzdCBpbnN0YW5jZSwgYW5kIHlvdSByZXNwb25kIGJ5IGZpbGluZyBhCitwYXRlbnQgaW5m cmluZ2VtZW50IGNvdW50ZXJjbGFpbSBpbiB0aGF0IGxhd3N1aXQgYWdhaW5zdCB0aGF0IHBhcnR5 IHRoYXQgaXMKK3VucmVsYXRlZCB0byB0aGUgU29mdHdhcmUsIHRoZSBsaWNlbnNlIGdyYW50ZWQg aGVyZXVuZGVyIHdpbGwgbm90IHRlcm1pbmF0ZQordW5kZXIgc2VjdGlvbiAoaSkgb2YgdGhpcyBw YXJhZ3JhcGggZHVlIHRvIHN1Y2ggY291bnRlcmNsYWltLgorCitBICJOZWNlc3NhcnkgQ2xhaW0i IGlzIGEgY2xhaW0gb2YgYSBwYXRlbnQgb3duZWQgYnkgRmFjZWJvb2sgdGhhdCBpcworbmVjZXNz YXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSBTb2Z0d2FyZSBzdGFuZGluZyBhbG9uZS4KKworQSAiUGF0 ZW50IEFzc2VydGlvbiIgaXMgYW55IGxhd3N1aXQgb3Igb3RoZXIgYWN0aW9uIGFsbGVnaW5nIGRp cmVjdCwgaW5kaXJlY3QsCitvciBjb250cmlidXRvcnkgaW5mcmluZ2VtZW50IG9yIGluZHVjZW1l bnQgdG8gaW5mcmluZ2UgYW55IHBhdGVudCwgaW5jbHVkaW5nIGEKK2Nyb3NzLWNsYWltIG9yIGNv dW50ZXJjbGFpbS4KZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3Qv UkVBRE1FLm1kIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9SRUFETUUubWQKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjk4NzU0ZTcyCi0tLSAvZGV2L251bGwK KysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9SRUFETUUubWQKQEAgLTAsMCAr MSwyMyBAQAorIyByZWFjdAorCitBbiBucG0gcGFja2FnZSB0byBnZXQgeW91IGltbWVkaWF0ZSBh Y2Nlc3MgdG8gW1JlYWN0XShodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC8pLAord2l0 aG91dCBhbHNvIHJlcXVpcmluZyB0aGUgSlNYIHRyYW5zZm9ybWVyLiBUaGlzIGlzIGVzcGVjaWFs bHkgdXNlZnVsIGZvciBjYXNlcyB3aGVyZSB5b3UKK3dhbnQgdG8gW2Bicm93c2VyaWZ5YF0oaHR0 cHM6Ly9naXRodWIuY29tL3N1YnN0YWNrL25vZGUtYnJvd3NlcmlmeSkgeW91ciBtb2R1bGUgdXNp bmcKK2BSZWFjdGAuCisKKyoqTm90ZToqKiBieSBkZWZhdWx0LCBSZWFjdCB3aWxsIGJlIGluIGRl dmVsb3BtZW50IG1vZGUuIFRoZSBkZXZlbG9wbWVudCB2ZXJzaW9uIGluY2x1ZGVzIGV4dHJhIHdh cm5pbmdzIGFib3V0IGNvbW1vbiBtaXN0YWtlcywgd2hlcmVhcyB0aGUgcHJvZHVjdGlvbiB2ZXJz aW9uIGluY2x1ZGVzIGV4dHJhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMgYW5kIHN0cmlwcyBh bGwgZXJyb3IgbWVzc2FnZXMuCisKK1RvIHVzZSBSZWFjdCBpbiBwcm9kdWN0aW9uIG1vZGUsIHNl dCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgYE5PREVfRU5WYCB0byBgcHJvZHVjdGlvbmAuIEEg bWluaWZpZXIgdGhhdCBwZXJmb3JtcyBkZWFkLWNvZGUgZWxpbWluYXRpb24gc3VjaCBhcyBbVWds aWZ5SlNdKGh0dHBzOi8vZ2l0aHViLmNvbS9taXNob28vVWdsaWZ5SlMyKSBpcyByZWNvbW1lbmRl ZCB0byBjb21wbGV0ZWx5IHJlbW92ZSB0aGUgZXh0cmEgY29kZSBwcmVzZW50IGluIGRldmVsb3Bt ZW50IG1vZGUuCisKKyMjIEV4YW1wbGUgVXNhZ2UKKworYGBganMKK3ZhciBSZWFjdCA9IHJlcXVp cmUoJ3JlYWN0Jyk7CisKKy8vIEFkZG9ucyBhcmUgaW4gc2VwYXJhdGUgcGFja2FnZXM6Cit2YXIg Y3JlYXRlRnJhZ21lbnQgPSByZXF1aXJlKCdyZWFjdC1hZGRvbnMtY3JlYXRlLWZyYWdtZW50Jyk7 Cit2YXIgaW1tdXRhYmlsaXR5SGVscGVycyA9IHJlcXVpcmUoJ3JlYWN0LWFkZG9ucy11cGRhdGUn KTsKK3ZhciBDU1NUcmFuc2l0aW9uR3JvdXAgPSByZXF1aXJlKCdyZWFjdC1hZGRvbnMtY3NzLXRy YW5zaXRpb24tZ3JvdXAnKTsKK2BgYAorCitGb3IgYSBjb21wbGV0ZSBsaXN0IG9mIGFkZG9ucyB2 aXNpdCB0aGUgW2FkZG9ucyBkb2N1bWVudGF0aW9uIHBhZ2VdKGh0dHBzOi8vZmFjZWJvb2suZ2l0 aHViLmlvL3JlYWN0L2RvY3MvYWRkb25zLmh0bWwpLgpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4v c3RhdGljL3ZlbmRvci9yZWFjdC9kaXN0L3JlYWN0LXdpdGgtYWRkb25zLmpzIGIvd2ViL3BnYWRt aW4vc3RhdGljL3ZlbmRvci9yZWFjdC9kaXN0L3JlYWN0LXdpdGgtYWRkb25zLmpzCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi5jNzU5ZGI1YwotLS0gL2Rldi9udWxsCisrKyBi L3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvZGlzdC9yZWFjdC13aXRoLWFkZG9ucy5q cwpAQCAtMCwwICsxLDUzOTMgQEAKKyAvKioKKyAgKiBSZWFjdCAod2l0aCBhZGRvbnMpIHYxNS40 LjIKKyAgKi8KKyhmdW5jdGlvbihmKXtpZih0eXBlb2YgZXhwb3J0cz09PSJvYmplY3QiJiZ0eXBl b2YgbW9kdWxlIT09InVuZGVmaW5lZCIpe21vZHVsZS5leHBvcnRzPWYoKX1lbHNlIGlmKHR5cGVv ZiBkZWZpbmU9PT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kKXtkZWZpbmUoW10sZil9ZWxzZXt2YXIg ZztpZih0eXBlb2Ygd2luZG93IT09InVuZGVmaW5lZCIpe2c9d2luZG93fWVsc2UgaWYodHlwZW9m IGdsb2JhbCE9PSJ1bmRlZmluZWQiKXtnPWdsb2JhbH1lbHNlIGlmKHR5cGVvZiBzZWxmIT09InVu ZGVmaW5lZCIpe2c9c2VsZn1lbHNle2c9dGhpc31nLlJlYWN0ID0gZigpfX0pKGZ1bmN0aW9uKCl7 dmFyIGRlZmluZSxtb2R1bGUsZXhwb3J0cztyZXR1cm4gKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0 aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT0iZnVu Y3Rpb24iJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywh MCk7dmFyIGY9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrbysiJyIpO3Rocm93IGYu Y29kZT0iTU9EVUxFX05PVF9GT1VORCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBd LmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9u OmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVv ZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysr KXMocltvXSk7cmV0dXJuIHN9KSh7MTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7 CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwg cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5k ZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGlu IHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdy YW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxl IGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIg RXhlY3V0aW9uRW52aXJvbm1lbnQgPSBfZGVyZXFfKDQzKTsKKworLyoqCisgKiBHZW5lcmF0ZSBh IG1hcHBpbmcgb2Ygc3RhbmRhcmQgdmVuZG9yIHByZWZpeGVzIHVzaW5nIHRoZSBkZWZpbmVkIHN0 eWxlIHByb3BlcnR5IGFuZCBldmVudCBuYW1lLgorICoKKyAqIEBwYXJhbSB7c3RyaW5nfSBzdHls ZVByb3AKKyAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUKKyAqIEByZXR1cm5zIHtvYmplY3R9 CisgKi8KK2Z1bmN0aW9uIG1ha2VQcmVmaXhNYXAoc3R5bGVQcm9wLCBldmVudE5hbWUpIHsKKyAg dmFyIHByZWZpeGVzID0ge307CisKKyAgcHJlZml4ZXNbc3R5bGVQcm9wLnRvTG93ZXJDYXNlKCld ID0gZXZlbnROYW1lLnRvTG93ZXJDYXNlKCk7CisgIHByZWZpeGVzWydXZWJraXQnICsgc3R5bGVQ cm9wXSA9ICd3ZWJraXQnICsgZXZlbnROYW1lOworICBwcmVmaXhlc1snTW96JyArIHN0eWxlUHJv cF0gPSAnbW96JyArIGV2ZW50TmFtZTsKKyAgcHJlZml4ZXNbJ21zJyArIHN0eWxlUHJvcF0gPSAn TVMnICsgZXZlbnROYW1lOworICBwcmVmaXhlc1snTycgKyBzdHlsZVByb3BdID0gJ28nICsgZXZl bnROYW1lLnRvTG93ZXJDYXNlKCk7CisKKyAgcmV0dXJuIHByZWZpeGVzOworfQorCisvKioKKyAq IEEgbGlzdCBvZiBldmVudCBuYW1lcyB0byBhIGNvbmZpZ3VyYWJsZSBsaXN0IG9mIHZlbmRvciBw cmVmaXhlcy4KKyAqLwordmFyIHZlbmRvclByZWZpeGVzID0geworICBhbmltYXRpb25lbmQ6IG1h a2VQcmVmaXhNYXAoJ0FuaW1hdGlvbicsICdBbmltYXRpb25FbmQnKSwKKyAgYW5pbWF0aW9uaXRl cmF0aW9uOiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uSXRlcmF0aW9uJyks CisgIGFuaW1hdGlvbnN0YXJ0OiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9u U3RhcnQnKSwKKyAgdHJhbnNpdGlvbmVuZDogbWFrZVByZWZpeE1hcCgnVHJhbnNpdGlvbicsICdU cmFuc2l0aW9uRW5kJykKK307CisKKy8qKgorICogRXZlbnQgbmFtZXMgdGhhdCBoYXZlIGFscmVh ZHkgYmVlbiBkZXRlY3RlZCBhbmQgcHJlZml4ZWQgKGlmIGFwcGxpY2FibGUpLgorICovCit2YXIg cHJlZml4ZWRFdmVudE5hbWVzID0ge307CisKKy8qKgorICogRWxlbWVudCB0byBjaGVjayBmb3Ig cHJlZml4ZXMgb24uCisgKi8KK3ZhciBzdHlsZSA9IHt9OworCisvKioKKyAqIEJvb3RzdHJhcCBp ZiBhIERPTSBleGlzdHMuCisgKi8KK2lmIChFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00p IHsKKyAgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5zdHlsZTsKKworICAv LyBPbiBzb21lIHBsYXRmb3JtcywgaW4gcGFydGljdWxhciBzb21lIHJlbGVhc2VzIG9mIEFuZHJv aWQgNC54LAorICAvLyB0aGUgdW4tcHJlZml4ZWQgImFuaW1hdGlvbiIgYW5kICJ0cmFuc2l0aW9u IiBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIG9uIHRoZQorICAvLyBzdHlsZSBvYmplY3QgYnV0IHRo ZSBldmVudHMgdGhhdCBmaXJlIHdpbGwgc3RpbGwgYmUgcHJlZml4ZWQsIHNvIHdlIG5lZWQKKyAg Ly8gdG8gY2hlY2sgaWYgdGhlIHVuLXByZWZpeGVkIGV2ZW50cyBhcmUgdXNhYmxlLCBhbmQgaWYg bm90IHJlbW92ZSB0aGVtIGZyb20gdGhlIG1hcC4KKyAgaWYgKCEoJ0FuaW1hdGlvbkV2ZW50JyBp biB3aW5kb3cpKSB7CisgICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLmFuaW1hdGlvbmVuZC5hbmlt YXRpb247CisgICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLmFuaW1hdGlvbml0ZXJhdGlvbi5hbmlt YXRpb247CisgICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLmFuaW1hdGlvbnN0YXJ0LmFuaW1hdGlv bjsKKyAgfQorCisgIC8vIFNhbWUgYXMgYWJvdmUKKyAgaWYgKCEoJ1RyYW5zaXRpb25FdmVudCcg aW4gd2luZG93KSkgeworICAgIGRlbGV0ZSB2ZW5kb3JQcmVmaXhlcy50cmFuc2l0aW9uZW5kLnRy YW5zaXRpb247CisgIH0KK30KKworLyoqCisgKiBBdHRlbXB0cyB0byBkZXRlcm1pbmUgdGhlIGNv cnJlY3QgdmVuZG9yIHByZWZpeGVkIGV2ZW50IG5hbWUuCisgKgorICogQHBhcmFtIHtzdHJpbmd9 IGV2ZW50TmFtZQorICogQHJldHVybnMge3N0cmluZ30KKyAqLworZnVuY3Rpb24gZ2V0VmVuZG9y UHJlZml4ZWRFdmVudE5hbWUoZXZlbnROYW1lKSB7CisgIGlmIChwcmVmaXhlZEV2ZW50TmFtZXNb ZXZlbnROYW1lXSkgeworICAgIHJldHVybiBwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXTsK KyAgfSBlbHNlIGlmICghdmVuZG9yUHJlZml4ZXNbZXZlbnROYW1lXSkgeworICAgIHJldHVybiBl dmVudE5hbWU7CisgIH0KKworICB2YXIgcHJlZml4TWFwID0gdmVuZG9yUHJlZml4ZXNbZXZlbnRO YW1lXTsKKworICBmb3IgKHZhciBzdHlsZVByb3AgaW4gcHJlZml4TWFwKSB7CisgICAgaWYgKHBy ZWZpeE1hcC5oYXNPd25Qcm9wZXJ0eShzdHlsZVByb3ApICYmIHN0eWxlUHJvcCBpbiBzdHlsZSkg eworICAgICAgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdID0gcHJlZml4TWFw W3N0eWxlUHJvcF07CisgICAgfQorICB9CisKKyAgcmV0dXJuICcnOworfQorCittb2R1bGUuZXhw b3J0cyA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lOworfSx7IjQzIjo0M31dLDI6W2Z1bmN0 aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVz ZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlz IHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3Vu ZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBz b3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4g YmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgor ICogCisgKi8KKworJ3VzZSBzdHJpY3QnOworCisvKioKKyAqIEVzY2FwZSBhbmQgd3JhcCBrZXkg c28gaXQgaXMgc2FmZSB0byB1c2UgYXMgYSByZWFjdGlkCisgKgorICogQHBhcmFtIHtzdHJpbmd9 IGtleSB0byBiZSBlc2NhcGVkLgorICogQHJldHVybiB7c3RyaW5nfSB0aGUgZXNjYXBlZCBrZXku CisgKi8KKworZnVuY3Rpb24gZXNjYXBlKGtleSkgeworICB2YXIgZXNjYXBlUmVnZXggPSAvWz06 XS9nOworICB2YXIgZXNjYXBlckxvb2t1cCA9IHsKKyAgICAnPSc6ICc9MCcsCisgICAgJzonOiAn PTInCisgIH07CisgIHZhciBlc2NhcGVkU3RyaW5nID0gKCcnICsga2V5KS5yZXBsYWNlKGVzY2Fw ZVJlZ2V4LCBmdW5jdGlvbiAobWF0Y2gpIHsKKyAgICByZXR1cm4gZXNjYXBlckxvb2t1cFttYXRj aF07CisgIH0pOworCisgIHJldHVybiAnJCcgKyBlc2NhcGVkU3RyaW5nOworfQorCisvKioKKyAq IFVuZXNjYXBlIGFuZCB1bndyYXAga2V5IGZvciBodW1hbi1yZWFkYWJsZSBkaXNwbGF5CisgKgor ICogQHBhcmFtIHtzdHJpbmd9IGtleSB0byB1bmVzY2FwZS4KKyAqIEByZXR1cm4ge3N0cmluZ30g dGhlIHVuZXNjYXBlZCBrZXkuCisgKi8KK2Z1bmN0aW9uIHVuZXNjYXBlKGtleSkgeworICB2YXIg dW5lc2NhcGVSZWdleCA9IC8oPTB8PTIpL2c7CisgIHZhciB1bmVzY2FwZXJMb29rdXAgPSB7Cisg ICAgJz0wJzogJz0nLAorICAgICc9Mic6ICc6JworICB9OworICB2YXIga2V5U3Vic3RyaW5nID0g a2V5WzBdID09PSAnLicgJiYga2V5WzFdID09PSAnJCcgPyBrZXkuc3Vic3RyaW5nKDIpIDoga2V5 LnN1YnN0cmluZygxKTsKKworICByZXR1cm4gKCcnICsga2V5U3Vic3RyaW5nKS5yZXBsYWNlKHVu ZXNjYXBlUmVnZXgsIGZ1bmN0aW9uIChtYXRjaCkgeworICAgIHJldHVybiB1bmVzY2FwZXJMb29r dXBbbWF0Y2hdOworICB9KTsKK30KKwordmFyIEtleUVzY2FwZVV0aWxzID0geworICBlc2NhcGU6 IGVzY2FwZSwKKyAgdW5lc2NhcGU6IHVuZXNjYXBlCit9OworCittb2R1bGUuZXhwb3J0cyA9IEtl eUVzY2FwZVV0aWxzOworfSx7fV0sMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7 CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwg cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5k ZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGlu IHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdy YW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxl IGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIg UmVhY3RMaW5rID0gX2RlcmVxXygyMCk7Cit2YXIgUmVhY3RTdGF0ZVNldHRlcnMgPSBfZGVyZXFf KDI2KTsKKworLyoqCisgKiBBIHNpbXBsZSBtaXhpbiBhcm91bmQgUmVhY3RMaW5rLmZvclN0YXRl KCkuCisgKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90d28td2F5 LWJpbmRpbmctaGVscGVycy5odG1sCisgKi8KK3ZhciBMaW5rZWRTdGF0ZU1peGluID0geworICAv KioKKyAgICogQ3JlYXRlIGEgUmVhY3RMaW5rIHRoYXQncyBsaW5rZWQgdG8gcGFydCBvZiB0aGlz IGNvbXBvbmVudCdzIHN0YXRlLiBUaGUKKyAgICogUmVhY3RMaW5rIHdpbGwgaGF2ZSB0aGUgY3Vy cmVudCB2YWx1ZSBvZiB0aGlzLnN0YXRlW2tleV0gYW5kIHdpbGwgY2FsbAorICAgKiBzZXRTdGF0 ZSgpIHdoZW4gYSBjaGFuZ2UgaXMgcmVxdWVzdGVkLgorICAgKgorICAgKiBAcGFyYW0ge3N0cmlu Z30ga2V5IHN0YXRlIGtleSB0byB1cGRhdGUuCisgICAqIEByZXR1cm4ge1JlYWN0TGlua30gUmVh Y3RMaW5rIGluc3RhbmNlIGxpbmtpbmcgdG8gdGhlIHN0YXRlLgorICAgKi8KKyAgbGlua1N0YXRl OiBmdW5jdGlvbiAoa2V5KSB7CisgICAgcmV0dXJuIG5ldyBSZWFjdExpbmsodGhpcy5zdGF0ZVtr ZXldLCBSZWFjdFN0YXRlU2V0dGVycy5jcmVhdGVTdGF0ZUtleVNldHRlcih0aGlzLCBrZXkpKTsK KyAgfQorfTsKKworbW9kdWxlLmV4cG9ydHMgPSBMaW5rZWRTdGF0ZU1peGluOworfSx7IjIwIjoy MCwiMjYiOjI2fV0sNDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAq IENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJl c2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJT RC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290 IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBv ZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBz YW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJv ZEludmFyaWFudCA9IF9kZXJlcV8oMzgpOworCit2YXIgaW52YXJpYW50ID0gX2RlcmVxXyg0Nik7 CisKKy8qKgorICogU3RhdGljIHBvb2xlcnMuIFNldmVyYWwgY3VzdG9tIHZlcnNpb25zIGZvciBl YWNoIHBvdGVudGlhbCBudW1iZXIgb2YKKyAqIGFyZ3VtZW50cy4gQSBjb21wbGV0ZWx5IGdlbmVy aWMgcG9vbGVyIGlzIGVhc3kgdG8gaW1wbGVtZW50LCBidXQgd291bGQKKyAqIHJlcXVpcmUgYWNj ZXNzaW5nIHRoZSBgYXJndW1lbnRzYCBvYmplY3QuIEluIGVhY2ggb2YgdGhlc2UsIGB0aGlzYCBy ZWZlcnMgdG8KKyAqIHRoZSBDbGFzcyBpdHNlbGYsIG5vdCBhbiBpbnN0YW5jZS4gSWYgYW55IG90 aGVycyBhcmUgbmVlZGVkLCBzaW1wbHkgYWRkIHRoZW0KKyAqIGhlcmUsIG9yIGluIHRoZWlyIG93 biBmaWxlcy4KKyAqLwordmFyIG9uZUFyZ3VtZW50UG9vbGVyID0gZnVuY3Rpb24gKGNvcHlGaWVs ZHNGcm9tKSB7CisgIHZhciBLbGFzcyA9IHRoaXM7CisgIGlmIChLbGFzcy5pbnN0YW5jZVBvb2wu bGVuZ3RoKSB7CisgICAgdmFyIGluc3RhbmNlID0gS2xhc3MuaW5zdGFuY2VQb29sLnBvcCgpOwor ICAgIEtsYXNzLmNhbGwoaW5zdGFuY2UsIGNvcHlGaWVsZHNGcm9tKTsKKyAgICByZXR1cm4gaW5z dGFuY2U7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5ldyBLbGFzcyhjb3B5RmllbGRzRnJvbSk7 CisgIH0KK307CisKK3ZhciB0d29Bcmd1bWVudFBvb2xlciA9IGZ1bmN0aW9uIChhMSwgYTIpIHsK KyAgdmFyIEtsYXNzID0gdGhpczsKKyAgaWYgKEtsYXNzLmluc3RhbmNlUG9vbC5sZW5ndGgpIHsK KyAgICB2YXIgaW5zdGFuY2UgPSBLbGFzcy5pbnN0YW5jZVBvb2wucG9wKCk7CisgICAgS2xhc3Mu Y2FsbChpbnN0YW5jZSwgYTEsIGEyKTsKKyAgICByZXR1cm4gaW5zdGFuY2U7CisgIH0gZWxzZSB7 CisgICAgcmV0dXJuIG5ldyBLbGFzcyhhMSwgYTIpOworICB9Cit9OworCit2YXIgdGhyZWVBcmd1 bWVudFBvb2xlciA9IGZ1bmN0aW9uIChhMSwgYTIsIGEzKSB7CisgIHZhciBLbGFzcyA9IHRoaXM7 CisgIGlmIChLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoKSB7CisgICAgdmFyIGluc3RhbmNlID0g S2xhc3MuaW5zdGFuY2VQb29sLnBvcCgpOworICAgIEtsYXNzLmNhbGwoaW5zdGFuY2UsIGExLCBh MiwgYTMpOworICAgIHJldHVybiBpbnN0YW5jZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbmV3 IEtsYXNzKGExLCBhMiwgYTMpOworICB9Cit9OworCit2YXIgZm91ckFyZ3VtZW50UG9vbGVyID0g ZnVuY3Rpb24gKGExLCBhMiwgYTMsIGE0KSB7CisgIHZhciBLbGFzcyA9IHRoaXM7CisgIGlmIChL bGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoKSB7CisgICAgdmFyIGluc3RhbmNlID0gS2xhc3MuaW5z dGFuY2VQb29sLnBvcCgpOworICAgIEtsYXNzLmNhbGwoaW5zdGFuY2UsIGExLCBhMiwgYTMsIGE0 KTsKKyAgICByZXR1cm4gaW5zdGFuY2U7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5ldyBLbGFz cyhhMSwgYTIsIGEzLCBhNCk7CisgIH0KK307CisKK3ZhciBzdGFuZGFyZFJlbGVhc2VyID0gZnVu Y3Rpb24gKGluc3RhbmNlKSB7CisgIHZhciBLbGFzcyA9IHRoaXM7CisgICEoaW5zdGFuY2UgaW5z dGFuY2VvZiBLbGFzcykgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlh bnQoZmFsc2UsICdUcnlpbmcgdG8gcmVsZWFzZSBhbiBpbnN0YW5jZSBpbnRvIGEgcG9vbCBvZiBh IGRpZmZlcmVudCB0eXBlLicpIDogX3Byb2RJbnZhcmlhbnQoJzI1JykgOiB2b2lkIDA7CisgIGlu c3RhbmNlLmRlc3RydWN0b3IoKTsKKyAgaWYgKEtsYXNzLmluc3RhbmNlUG9vbC5sZW5ndGggPCBL bGFzcy5wb29sU2l6ZSkgeworICAgIEtsYXNzLmluc3RhbmNlUG9vbC5wdXNoKGluc3RhbmNlKTsK KyAgfQorfTsKKwordmFyIERFRkFVTFRfUE9PTF9TSVpFID0gMTA7Cit2YXIgREVGQVVMVF9QT09M RVIgPSBvbmVBcmd1bWVudFBvb2xlcjsKKworLyoqCisgKiBBdWdtZW50cyBgQ29weUNvbnN0cnVj dG9yYCB0byBiZSBhIHBvb2xhYmxlIGNsYXNzLCBhdWdtZW50aW5nIG9ubHkgdGhlIGNsYXNzCisg KiBpdHNlbGYgKHN0YXRpY2FsbHkpIG5vdCBhZGRpbmcgYW55IHByb3RvdHlwaWNhbCBmaWVsZHMu IEFueSBDb3B5Q29uc3RydWN0b3IKKyAqIHlvdSBnaXZlIHRoaXMgbWF5IGhhdmUgYSBgcG9vbFNp emVgIHByb3BlcnR5LCBhbmQgd2lsbCBsb29rIGZvciBhCisgKiBwcm90b3R5cGljYWwgYGRlc3Ry dWN0b3JgIG9uIGluc3RhbmNlcy4KKyAqCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBDb3B5Q29uc3Ry dWN0b3IgQ29uc3RydWN0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byByZXNldC4KKyAqIEBwYXJhbSB7 RnVuY3Rpb259IHBvb2xlciBDdXN0b21pemFibGUgcG9vbGVyLgorICovCit2YXIgYWRkUG9vbGlu Z1RvID0gZnVuY3Rpb24gKENvcHlDb25zdHJ1Y3RvciwgcG9vbGVyKSB7CisgIC8vIENhc3Rpbmcg YXMgYW55IHNvIHRoYXQgZmxvdyBpZ25vcmVzIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gYW5k IHRydXN0cworICAvLyBpdCB0byBtYXRjaCB0aGUgdHlwZSB3ZSBkZWNsYXJlZAorICB2YXIgTmV3 S2xhc3MgPSBDb3B5Q29uc3RydWN0b3I7CisgIE5ld0tsYXNzLmluc3RhbmNlUG9vbCA9IFtdOwor ICBOZXdLbGFzcy5nZXRQb29sZWQgPSBwb29sZXIgfHwgREVGQVVMVF9QT09MRVI7CisgIGlmICgh TmV3S2xhc3MucG9vbFNpemUpIHsKKyAgICBOZXdLbGFzcy5wb29sU2l6ZSA9IERFRkFVTFRfUE9P TF9TSVpFOworICB9CisgIE5ld0tsYXNzLnJlbGVhc2UgPSBzdGFuZGFyZFJlbGVhc2VyOworICBy ZXR1cm4gTmV3S2xhc3M7Cit9OworCit2YXIgUG9vbGVkQ2xhc3MgPSB7CisgIGFkZFBvb2xpbmdU bzogYWRkUG9vbGluZ1RvLAorICBvbmVBcmd1bWVudFBvb2xlcjogb25lQXJndW1lbnRQb29sZXIs CisgIHR3b0FyZ3VtZW50UG9vbGVyOiB0d29Bcmd1bWVudFBvb2xlciwKKyAgdGhyZWVBcmd1bWVu dFBvb2xlcjogdGhyZWVBcmd1bWVudFBvb2xlciwKKyAgZm91ckFyZ3VtZW50UG9vbGVyOiBmb3Vy QXJndW1lbnRQb29sZXIKK307CisKK21vZHVsZS5leHBvcnRzID0gUG9vbGVkQ2xhc3M7Cit9LHsi MzgiOjM4LCI0NiI6NDZ9XSw1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8q KgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdo dHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0 aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhl IHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQK KyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4g dGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfYXNz aWduID0gX2RlcmVxXyg0OSk7CisKK3ZhciBSZWFjdENoaWxkcmVuID0gX2RlcmVxXyg5KTsKK3Zh ciBSZWFjdENvbXBvbmVudCA9IF9kZXJlcV8oMTEpOwordmFyIFJlYWN0UHVyZUNvbXBvbmVudCA9 IF9kZXJlcV8oMjUpOwordmFyIFJlYWN0Q2xhc3MgPSBfZGVyZXFfKDEwKTsKK3ZhciBSZWFjdERP TUZhY3RvcmllcyA9IF9kZXJlcV8oMTUpOwordmFyIFJlYWN0RWxlbWVudCA9IF9kZXJlcV8oMTYp OwordmFyIFJlYWN0UHJvcFR5cGVzID0gX2RlcmVxXygyMyk7Cit2YXIgUmVhY3RWZXJzaW9uID0g X2RlcmVxXygzMCk7CisKK3ZhciBvbmx5Q2hpbGQgPSBfZGVyZXFfKDM3KTsKK3ZhciB3YXJuaW5n ID0gX2RlcmVxXyg0OCk7CisKK3ZhciBjcmVhdGVFbGVtZW50ID0gUmVhY3RFbGVtZW50LmNyZWF0 ZUVsZW1lbnQ7Cit2YXIgY3JlYXRlRmFjdG9yeSA9IFJlYWN0RWxlbWVudC5jcmVhdGVGYWN0b3J5 OwordmFyIGNsb25lRWxlbWVudCA9IFJlYWN0RWxlbWVudC5jbG9uZUVsZW1lbnQ7CisKK2lmICgi ZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgdmFyIFJlYWN0RWxlbWVudFZhbGlk YXRvciA9IF9kZXJlcV8oMTgpOworICBjcmVhdGVFbGVtZW50ID0gUmVhY3RFbGVtZW50VmFsaWRh dG9yLmNyZWF0ZUVsZW1lbnQ7CisgIGNyZWF0ZUZhY3RvcnkgPSBSZWFjdEVsZW1lbnRWYWxpZGF0 b3IuY3JlYXRlRmFjdG9yeTsKKyAgY2xvbmVFbGVtZW50ID0gUmVhY3RFbGVtZW50VmFsaWRhdG9y LmNsb25lRWxlbWVudDsKK30KKwordmFyIF9fc3ByZWFkID0gX2Fzc2lnbjsKKworaWYgKCJkZXZl bG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICB2YXIgd2FybmVkID0gZmFsc2U7CisgIF9f c3ByZWFkID0gZnVuY3Rpb24gKCkgeworICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9u JyA/IHdhcm5pbmcod2FybmVkLCAnUmVhY3QuX19zcHJlYWQgaXMgZGVwcmVjYXRlZCBhbmQgc2hv dWxkIG5vdCBiZSB1c2VkLiBVc2UgJyArICdPYmplY3QuYXNzaWduIGRpcmVjdGx5IG9yIGFub3Ro ZXIgaGVscGVyIGZ1bmN0aW9uIHdpdGggc2ltaWxhciAnICsgJ3NlbWFudGljcy4gWW91IG1heSBi ZSBzZWVpbmcgdGhpcyB3YXJuaW5nIGR1ZSB0byB5b3VyIGNvbXBpbGVyLiAnICsgJ1NlZSBodHRw czovL2ZiLm1lL3JlYWN0LXNwcmVhZC1kZXByZWNhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLicpIDog dm9pZCAwOworICAgIHdhcm5lZCA9IHRydWU7CisgICAgcmV0dXJuIF9hc3NpZ24uYXBwbHkobnVs bCwgYXJndW1lbnRzKTsKKyAgfTsKK30KKwordmFyIFJlYWN0ID0geworCisgIC8vIE1vZGVybgor CisgIENoaWxkcmVuOiB7CisgICAgbWFwOiBSZWFjdENoaWxkcmVuLm1hcCwKKyAgICBmb3JFYWNo OiBSZWFjdENoaWxkcmVuLmZvckVhY2gsCisgICAgY291bnQ6IFJlYWN0Q2hpbGRyZW4uY291bnQs CisgICAgdG9BcnJheTogUmVhY3RDaGlsZHJlbi50b0FycmF5LAorICAgIG9ubHk6IG9ubHlDaGls ZAorICB9LAorCisgIENvbXBvbmVudDogUmVhY3RDb21wb25lbnQsCisgIFB1cmVDb21wb25lbnQ6 IFJlYWN0UHVyZUNvbXBvbmVudCwKKworICBjcmVhdGVFbGVtZW50OiBjcmVhdGVFbGVtZW50LAor ICBjbG9uZUVsZW1lbnQ6IGNsb25lRWxlbWVudCwKKyAgaXNWYWxpZEVsZW1lbnQ6IFJlYWN0RWxl bWVudC5pc1ZhbGlkRWxlbWVudCwKKworICAvLyBDbGFzc2ljCisKKyAgUHJvcFR5cGVzOiBSZWFj dFByb3BUeXBlcywKKyAgY3JlYXRlQ2xhc3M6IFJlYWN0Q2xhc3MuY3JlYXRlQ2xhc3MsCisgIGNy ZWF0ZUZhY3Rvcnk6IGNyZWF0ZUZhY3RvcnksCisgIGNyZWF0ZU1peGluOiBmdW5jdGlvbiAobWl4 aW4pIHsKKyAgICAvLyBDdXJyZW50bHkgYSBub29wLiBXaWxsIGJlIHVzZWQgdG8gdmFsaWRhdGUg YW5kIHRyYWNlIG1peGlucy4KKyAgICByZXR1cm4gbWl4aW47CisgIH0sCisKKyAgLy8gVGhpcyBs b29rcyBET00gc3BlY2lmaWMgYnV0IHRoZXNlIGFyZSBhY3R1YWxseSBpc29tb3JwaGljIGhlbHBl cnMKKyAgLy8gc2luY2UgdGhleSBhcmUganVzdCBnZW5lcmF0aW5nIERPTSBzdHJpbmdzLgorICBE T006IFJlYWN0RE9NRmFjdG9yaWVzLAorCisgIHZlcnNpb246IFJlYWN0VmVyc2lvbiwKKworICAv LyBEZXByZWNhdGVkIGhvb2sgZm9yIEpTWCBzcHJlYWQsIGRvbid0IHVzZSB0aGlzIGZvciBhbnl0 aGluZy4KKyAgX19zcHJlYWQ6IF9fc3ByZWFkCit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0 OworfSx7IjEwIjoxMCwiMTEiOjExLCIxNSI6MTUsIjE2IjoxNiwiMTgiOjE4LCIyMyI6MjMsIjI1 IjoyNSwiMzAiOjMwLCIzNyI6MzcsIjQ4Ijo0OCwiNDkiOjQ5LCI5Ijo5fV0sNjpbZnVuY3Rpb24o X2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQs IEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291 cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGlu IHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJj ZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBm b3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8K KworJ3VzZSBzdHJpY3QnOworCit2YXIgUmVhY3RET007CisKK2Z1bmN0aW9uIGdldFJlYWN0RE9N KCkgeworICBpZiAoIVJlYWN0RE9NKSB7CisgICAgLy8gVGhpcyBpcyBzYWZlIHRvIHVzZSBiZWNh dXNlIGN1cnJlbnQgbW9kdWxlIG9ubHkgZXhpc3RzIGluIHRoZSBhZGRvbnMgYnVpbGQ6CisgICAg dmFyIFJlYWN0V2l0aEFkZG9uc1VNREVudHJ5ID0gX2RlcmVxXygzMik7CisgICAgLy8gVGhpcyBp cyBpbmplY3RlZCBieSB0aGUgUmVhY3RET00gVU1EIGJ1aWxkOgorICAgIFJlYWN0RE9NID0gUmVh Y3RXaXRoQWRkb25zVU1ERW50cnkuX19TRUNSRVRfSU5KRUNURURfUkVBQ1RfRE9NX0RPX05PVF9V U0VfT1JfWU9VX1dJTExfQkVfRklSRUQ7CisgIH0KKyAgcmV0dXJuIFJlYWN0RE9NOworfQorCitl eHBvcnRzLmdldFJlYWN0RE9NID0gZ2V0UmVhY3RET007CisKK2lmICgiZGV2ZWxvcG1lbnQiICE9 PSAncHJvZHVjdGlvbicpIHsKKyAgZXhwb3J0cy5nZXRSZWFjdFBlcmYgPSBmdW5jdGlvbiAoKSB7 CisgICAgcmV0dXJuIGdldFJlYWN0RE9NKCkuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0Vf T1JfWU9VX1dJTExfQkVfRklSRUQuUmVhY3RQZXJmOworICB9OworCisgIGV4cG9ydHMuZ2V0UmVh Y3RUZXN0VXRpbHMgPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIGdldFJlYWN0RE9NKCkuX19T RUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQuUmVhY3RUZXN0 VXRpbHM7CisgIH07Cit9Cit9LHsiMzIiOjMyfV0sNzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUs ZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMu CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGlj ZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5T RSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRp dGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFU RU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3Qn OworCit2YXIgX2Fzc2lnbiA9IF9kZXJlcV8oNDkpOworCitmdW5jdGlvbiBfY2xhc3NDYWxsQ2hl Y2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29u c3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMg YSBmdW5jdGlvbiIpOyB9IH0KKworZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4o c2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlz IGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTsg fSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBjYWxs ID09PSAiZnVuY3Rpb24iKSA/IGNhbGwgOiBzZWxmOyB9CisKK2Z1bmN0aW9uIF9pbmhlcml0cyhz dWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICJmdW5jdGlv biIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBl eHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIgKyB0eXBl b2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBl ckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBz dWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6 IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVj dC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3Rv X18gPSBzdXBlckNsYXNzOyB9CisKK3ZhciBSZWFjdCA9IF9kZXJlcV8oNSk7CisKK3ZhciBSZWFj dFRyYW5zaXRpb25Hcm91cCA9IF9kZXJlcV8oMjkpOwordmFyIFJlYWN0Q1NTVHJhbnNpdGlvbkdy b3VwQ2hpbGQgPSBfZGVyZXFfKDgpOworCitmdW5jdGlvbiBjcmVhdGVUcmFuc2l0aW9uVGltZW91 dFByb3BWYWxpZGF0b3IodHJhbnNpdGlvblR5cGUpIHsKKyAgdmFyIHRpbWVvdXRQcm9wTmFtZSA9 ICd0cmFuc2l0aW9uJyArIHRyYW5zaXRpb25UeXBlICsgJ1RpbWVvdXQnOworICB2YXIgZW5hYmxl ZFByb3BOYW1lID0gJ3RyYW5zaXRpb24nICsgdHJhbnNpdGlvblR5cGU7CisKKyAgcmV0dXJuIGZ1 bmN0aW9uIChwcm9wcykgeworICAgIC8vIElmIHRoZSB0cmFuc2l0aW9uIGlzIGVuYWJsZWQKKyAg ICBpZiAocHJvcHNbZW5hYmxlZFByb3BOYW1lXSkgeworICAgICAgLy8gSWYgbm8gdGltZW91dCBk dXJhdGlvbiBpcyBwcm92aWRlZAorICAgICAgaWYgKHByb3BzW3RpbWVvdXRQcm9wTmFtZV0gPT0g bnVsbCkgeworICAgICAgICByZXR1cm4gbmV3IEVycm9yKHRpbWVvdXRQcm9wTmFtZSArICcgd2Fz blwndCBzdXBwbGllZCB0byBSZWFjdENTU1RyYW5zaXRpb25Hcm91cDogJyArICd0aGlzIGNhbiBj YXVzZSB1bnJlbGlhYmxlIGFuaW1hdGlvbnMgYW5kIHdvblwndCBiZSBzdXBwb3J0ZWQgaW4gJyAr ICdhIGZ1dHVyZSB2ZXJzaW9uIG9mIFJlYWN0LiBTZWUgJyArICdodHRwczovL2ZiLm1lL3JlYWN0 LWFuaW1hdGlvbi10cmFuc2l0aW9uLWdyb3VwLXRpbWVvdXQgZm9yIG1vcmUgJyArICdpbmZvcm1h dGlvbi4nKTsKKworICAgICAgICAvLyBJZiB0aGUgZHVyYXRpb24gaXNuJ3QgYSBudW1iZXIKKyAg ICAgIH0gZWxzZSBpZiAodHlwZW9mIHByb3BzW3RpbWVvdXRQcm9wTmFtZV0gIT09ICdudW1iZXIn KSB7CisgICAgICAgIHJldHVybiBuZXcgRXJyb3IodGltZW91dFByb3BOYW1lICsgJyBtdXN0IGJl IGEgbnVtYmVyIChpbiBtaWxsaXNlY29uZHMpJyk7CisgICAgICB9CisgICAgfQorICB9OworfQor CisvKioKKyAqIEFuIGVhc3kgd2F5IHRvIHBlcmZvcm0gQ1NTIHRyYW5zaXRpb25zIGFuZCBhbmlt YXRpb25zIHdoZW4gYSBSZWFjdCBjb21wb25lbnQKKyAqIGVudGVycyBvciBsZWF2ZXMgdGhlIERP TS4KKyAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL2FuaW1hdGlv bi5odG1sI2hpZ2gtbGV2ZWwtYXBpLXJlYWN0Y3NzdHJhbnNpdGlvbmdyb3VwCisgKi8KKwordmFy IFJlYWN0Q1NTVHJhbnNpdGlvbkdyb3VwID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHsK KyAgX2luaGVyaXRzKFJlYWN0Q1NTVHJhbnNpdGlvbkdyb3VwLCBfUmVhY3QkQ29tcG9uZW50KTsK KworICBmdW5jdGlvbiBSZWFjdENTU1RyYW5zaXRpb25Hcm91cCgpIHsKKyAgICB2YXIgX3RlbXAs IF90aGlzLCBfcmV0OworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJlYWN0Q1NTVHJhbnNp dGlvbkdyb3VwKTsKKworICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdz ID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CisgICAgICBh cmdzW19rZXldID0gYXJndW1lbnRzW19rZXldOworICAgIH0KKworICAgIHJldHVybiBfcmV0ID0g KF90ZW1wID0gKF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0 JENvbXBvbmVudC5jYWxsLmFwcGx5KF9SZWFjdCRDb21wb25lbnQsIFt0aGlzXS5jb25jYXQoYXJn cykpKSwgX3RoaXMpLCBfdGhpcy5fd3JhcENoaWxkID0gZnVuY3Rpb24gKGNoaWxkKSB7CisgICAg ICAvLyBXZSBuZWVkIHRvIHByb3ZpZGUgdGhpcyBjaGlsZEZhY3Rvcnkgc28gdGhhdAorICAgICAg Ly8gUmVhY3RDU1NUcmFuc2l0aW9uR3JvdXBDaGlsZCBjYW4gcmVjZWl2ZSB1cGRhdGVzIHRvIG5h bWUsIGVudGVyLCBhbmQKKyAgICAgIC8vIGxlYXZlIHdoaWxlIGl0IGlzIGxlYXZpbmcuCisgICAg ICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdENTU1RyYW5zaXRpb25Hcm91cENoaWxk LCB7CisgICAgICAgIG5hbWU6IF90aGlzLnByb3BzLnRyYW5zaXRpb25OYW1lLAorICAgICAgICBh cHBlYXI6IF90aGlzLnByb3BzLnRyYW5zaXRpb25BcHBlYXIsCisgICAgICAgIGVudGVyOiBfdGhp cy5wcm9wcy50cmFuc2l0aW9uRW50ZXIsCisgICAgICAgIGxlYXZlOiBfdGhpcy5wcm9wcy50cmFu c2l0aW9uTGVhdmUsCisgICAgICAgIGFwcGVhclRpbWVvdXQ6IF90aGlzLnByb3BzLnRyYW5zaXRp b25BcHBlYXJUaW1lb3V0LAorICAgICAgICBlbnRlclRpbWVvdXQ6IF90aGlzLnByb3BzLnRyYW5z aXRpb25FbnRlclRpbWVvdXQsCisgICAgICAgIGxlYXZlVGltZW91dDogX3RoaXMucHJvcHMudHJh bnNpdGlvbkxlYXZlVGltZW91dAorICAgICAgfSwgY2hpbGQpOworICAgIH0sIF90ZW1wKSwgX3Bv c3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsIF9yZXQpOworICB9CisKKyAgUmVhY3RDU1NU cmFuc2l0aW9uR3JvdXAucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHsKKyAg ICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdFRyYW5zaXRpb25Hcm91cCwgX2Fzc2ln bih7fSwgdGhpcy5wcm9wcywgeyBjaGlsZEZhY3Rvcnk6IHRoaXMuX3dyYXBDaGlsZCB9KSk7Cisg IH07CisKKyAgcmV0dXJuIFJlYWN0Q1NTVHJhbnNpdGlvbkdyb3VwOworfShSZWFjdC5Db21wb25l bnQpOworCitSZWFjdENTU1RyYW5zaXRpb25Hcm91cC5kaXNwbGF5TmFtZSA9ICdSZWFjdENTU1Ry YW5zaXRpb25Hcm91cCc7CitSZWFjdENTU1RyYW5zaXRpb25Hcm91cC5wcm9wVHlwZXMgPSB7Cisg IHRyYW5zaXRpb25OYW1lOiBSZWFjdENTU1RyYW5zaXRpb25Hcm91cENoaWxkLnByb3BUeXBlcy5u YW1lLAorCisgIHRyYW5zaXRpb25BcHBlYXI6IFJlYWN0LlByb3BUeXBlcy5ib29sLAorICB0cmFu c2l0aW9uRW50ZXI6IFJlYWN0LlByb3BUeXBlcy5ib29sLAorICB0cmFuc2l0aW9uTGVhdmU6IFJl YWN0LlByb3BUeXBlcy5ib29sLAorICB0cmFuc2l0aW9uQXBwZWFyVGltZW91dDogY3JlYXRlVHJh bnNpdGlvblRpbWVvdXRQcm9wVmFsaWRhdG9yKCdBcHBlYXInKSwKKyAgdHJhbnNpdGlvbkVudGVy VGltZW91dDogY3JlYXRlVHJhbnNpdGlvblRpbWVvdXRQcm9wVmFsaWRhdG9yKCdFbnRlcicpLAor ICB0cmFuc2l0aW9uTGVhdmVUaW1lb3V0OiBjcmVhdGVUcmFuc2l0aW9uVGltZW91dFByb3BWYWxp ZGF0b3IoJ0xlYXZlJykKK307CitSZWFjdENTU1RyYW5zaXRpb25Hcm91cC5kZWZhdWx0UHJvcHMg PSB7CisgIHRyYW5zaXRpb25BcHBlYXI6IGZhbHNlLAorICB0cmFuc2l0aW9uRW50ZXI6IHRydWUs CisgIHRyYW5zaXRpb25MZWF2ZTogdHJ1ZQorfTsKKworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0 Q1NTVHJhbnNpdGlvbkdyb3VwOworfSx7IjI5IjoyOSwiNDkiOjQ5LCI1Ijo1LCI4Ijo4fV0sODpb ZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEz LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq IFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNl IGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0 aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRz IGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4K KyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgUmVhY3QgPSBfZGVyZXFfKDUpOwordmFy IFJlYWN0QWRkb25zRE9NRGVwZW5kZW5jaWVzID0gX2RlcmVxXyg2KTsKKwordmFyIENTU0NvcmUg PSBfZGVyZXFfKDQyKTsKK3ZhciBSZWFjdFRyYW5zaXRpb25FdmVudHMgPSBfZGVyZXFfKDI4KTsK KwordmFyIG9ubHlDaGlsZCA9IF9kZXJlcV8oMzcpOworCit2YXIgVElDSyA9IDE3OworCit2YXIg UmVhY3RDU1NUcmFuc2l0aW9uR3JvdXBDaGlsZCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHsKKyAgZGlz cGxheU5hbWU6ICdSZWFjdENTU1RyYW5zaXRpb25Hcm91cENoaWxkJywKKworICBwcm9wVHlwZXM6 IHsKKyAgICBuYW1lOiBSZWFjdC5Qcm9wVHlwZXMub25lT2ZUeXBlKFtSZWFjdC5Qcm9wVHlwZXMu c3RyaW5nLCBSZWFjdC5Qcm9wVHlwZXMuc2hhcGUoeworICAgICAgZW50ZXI6IFJlYWN0LlByb3BU eXBlcy5zdHJpbmcsCisgICAgICBsZWF2ZTogUmVhY3QuUHJvcFR5cGVzLnN0cmluZywKKyAgICAg IGFjdGl2ZTogUmVhY3QuUHJvcFR5cGVzLnN0cmluZworICAgIH0pLCBSZWFjdC5Qcm9wVHlwZXMu c2hhcGUoeworICAgICAgZW50ZXI6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsCisgICAgICBlbnRl ckFjdGl2ZTogUmVhY3QuUHJvcFR5cGVzLnN0cmluZywKKyAgICAgIGxlYXZlOiBSZWFjdC5Qcm9w VHlwZXMuc3RyaW5nLAorICAgICAgbGVhdmVBY3RpdmU6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcs CisgICAgICBhcHBlYXI6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsCisgICAgICBhcHBlYXJBY3Rp dmU6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcKKyAgICB9KV0pLmlzUmVxdWlyZWQsCisKKyAgICAv LyBPbmNlIHdlIHJlcXVpcmUgdGltZW91dHMgdG8gYmUgc3BlY2lmaWVkLCB3ZSBjYW4gcmVtb3Zl IHRoZQorICAgIC8vIGJvb2xlYW4gZmxhZ3MgKGFwcGVhciBldGMuKSBhbmQganVzdCBhY2NlcHQg YSBudW1iZXIKKyAgICAvLyBvciBhIGJvb2wgZm9yIHRoZSB0aW1lb3V0IGZsYWdzIChhcHBlYXJU aW1lb3V0IGV0Yy4pCisgICAgYXBwZWFyOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCwKKyAgICBlbnRl cjogUmVhY3QuUHJvcFR5cGVzLmJvb2wsCisgICAgbGVhdmU6IFJlYWN0LlByb3BUeXBlcy5ib29s LAorICAgIGFwcGVhclRpbWVvdXQ6IFJlYWN0LlByb3BUeXBlcy5udW1iZXIsCisgICAgZW50ZXJU aW1lb3V0OiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLAorICAgIGxlYXZlVGltZW91dDogUmVhY3Qu UHJvcFR5cGVzLm51bWJlcgorICB9LAorCisgIHRyYW5zaXRpb246IGZ1bmN0aW9uIChhbmltYXRp b25UeXBlLCBmaW5pc2hDYWxsYmFjaywgdXNlclNwZWNpZmllZERlbGF5KSB7CisgICAgdmFyIG5v ZGUgPSBSZWFjdEFkZG9uc0RPTURlcGVuZGVuY2llcy5nZXRSZWFjdERPTSgpLmZpbmRET01Ob2Rl KHRoaXMpOworCisgICAgaWYgKCFub2RlKSB7CisgICAgICBpZiAoZmluaXNoQ2FsbGJhY2spIHsK KyAgICAgICAgZmluaXNoQ2FsbGJhY2soKTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9 CisKKyAgICB2YXIgY2xhc3NOYW1lID0gdGhpcy5wcm9wcy5uYW1lW2FuaW1hdGlvblR5cGVdIHx8 IHRoaXMucHJvcHMubmFtZSArICctJyArIGFuaW1hdGlvblR5cGU7CisgICAgdmFyIGFjdGl2ZUNs YXNzTmFtZSA9IHRoaXMucHJvcHMubmFtZVthbmltYXRpb25UeXBlICsgJ0FjdGl2ZSddIHx8IGNs YXNzTmFtZSArICctYWN0aXZlJzsKKyAgICB2YXIgdGltZW91dCA9IG51bGw7CisKKyAgICB2YXIg ZW5kTGlzdGVuZXIgPSBmdW5jdGlvbiAoZSkgeworICAgICAgaWYgKGUgJiYgZS50YXJnZXQgIT09 IG5vZGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBjbGVhclRpbWVvdXQo dGltZW91dCk7CisKKyAgICAgIENTU0NvcmUucmVtb3ZlQ2xhc3Mobm9kZSwgY2xhc3NOYW1lKTsK KyAgICAgIENTU0NvcmUucmVtb3ZlQ2xhc3Mobm9kZSwgYWN0aXZlQ2xhc3NOYW1lKTsKKworICAg ICAgUmVhY3RUcmFuc2l0aW9uRXZlbnRzLnJlbW92ZUVuZEV2ZW50TGlzdGVuZXIobm9kZSwgZW5k TGlzdGVuZXIpOworCisgICAgICAvLyBVc3VhbGx5IHRoaXMgb3B0aW9uYWwgY2FsbGJhY2sgaXMg dXNlZCBmb3IgaW5mb3JtaW5nIGFuIG93bmVyIG9mCisgICAgICAvLyBhIGxlYXZlIGFuaW1hdGlv biBhbmQgdGVsbGluZyBpdCB0byByZW1vdmUgdGhlIGNoaWxkLgorICAgICAgaWYgKGZpbmlzaENh bGxiYWNrKSB7CisgICAgICAgIGZpbmlzaENhbGxiYWNrKCk7CisgICAgICB9CisgICAgfTsKKwor ICAgIENTU0NvcmUuYWRkQ2xhc3Mobm9kZSwgY2xhc3NOYW1lKTsKKworICAgIC8vIE5lZWQgdG8g ZG8gdGhpcyB0byBhY3R1YWxseSB0cmlnZ2VyIGEgdHJhbnNpdGlvbi4KKyAgICB0aGlzLnF1ZXVl Q2xhc3NBbmROb2RlKGFjdGl2ZUNsYXNzTmFtZSwgbm9kZSk7CisKKyAgICAvLyBJZiB0aGUgdXNl ciBzcGVjaWZpZWQgYSB0aW1lb3V0IGRlbGF5LgorICAgIGlmICh1c2VyU3BlY2lmaWVkRGVsYXkp IHsKKyAgICAgIC8vIENsZWFuLXVwIHRoZSBhbmltYXRpb24gYWZ0ZXIgdGhlIHNwZWNpZmllZCBk ZWxheQorICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoZW5kTGlzdGVuZXIsIHVzZXJTcGVjaWZp ZWREZWxheSk7CisgICAgICB0aGlzLnRyYW5zaXRpb25UaW1lb3V0cy5wdXNoKHRpbWVvdXQpOwor ICAgIH0gZWxzZSB7CisgICAgICAvLyBERVBSRUNBVEVEOiB0aGlzIGxpc3RlbmVyIHdpbGwgYmUg cmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIHJlYWN0CisgICAgICBSZWFjdFRyYW5zaXRp b25FdmVudHMuYWRkRW5kRXZlbnRMaXN0ZW5lcihub2RlLCBlbmRMaXN0ZW5lcik7CisgICAgfQor ICB9LAorCisgIHF1ZXVlQ2xhc3NBbmROb2RlOiBmdW5jdGlvbiAoY2xhc3NOYW1lLCBub2RlKSB7 CisgICAgdGhpcy5jbGFzc05hbWVBbmROb2RlUXVldWUucHVzaCh7CisgICAgICBjbGFzc05hbWU6 IGNsYXNzTmFtZSwKKyAgICAgIG5vZGU6IG5vZGUKKyAgICB9KTsKKworICAgIGlmICghdGhpcy50 aW1lb3V0KSB7CisgICAgICB0aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KHRoaXMuZmx1c2hDbGFz c05hbWVBbmROb2RlUXVldWUsIFRJQ0spOworICAgIH0KKyAgfSwKKworICBmbHVzaENsYXNzTmFt ZUFuZE5vZGVRdWV1ZTogZnVuY3Rpb24gKCkgeworICAgIGlmICh0aGlzLmlzTW91bnRlZCgpKSB7 CisgICAgICB0aGlzLmNsYXNzTmFtZUFuZE5vZGVRdWV1ZS5mb3JFYWNoKGZ1bmN0aW9uIChvYmop IHsKKyAgICAgICAgQ1NTQ29yZS5hZGRDbGFzcyhvYmoubm9kZSwgb2JqLmNsYXNzTmFtZSk7Cisg ICAgICB9KTsKKyAgICB9CisgICAgdGhpcy5jbGFzc05hbWVBbmROb2RlUXVldWUubGVuZ3RoID0g MDsKKyAgICB0aGlzLnRpbWVvdXQgPSBudWxsOworICB9LAorCisgIGNvbXBvbmVudFdpbGxNb3Vu dDogZnVuY3Rpb24gKCkgeworICAgIHRoaXMuY2xhc3NOYW1lQW5kTm9kZVF1ZXVlID0gW107Cisg ICAgdGhpcy50cmFuc2l0aW9uVGltZW91dHMgPSBbXTsKKyAgfSwKKworICBjb21wb25lbnRXaWxs VW5tb3VudDogZnVuY3Rpb24gKCkgeworICAgIGlmICh0aGlzLnRpbWVvdXQpIHsKKyAgICAgIGNs ZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpOworICAgIH0KKyAgICB0aGlzLnRyYW5zaXRpb25UaW1l b3V0cy5mb3JFYWNoKGZ1bmN0aW9uICh0aW1lb3V0KSB7CisgICAgICBjbGVhclRpbWVvdXQodGlt ZW91dCk7CisgICAgfSk7CisKKyAgICB0aGlzLmNsYXNzTmFtZUFuZE5vZGVRdWV1ZS5sZW5ndGgg PSAwOworICB9LAorCisgIGNvbXBvbmVudFdpbGxBcHBlYXI6IGZ1bmN0aW9uIChkb25lKSB7Cisg ICAgaWYgKHRoaXMucHJvcHMuYXBwZWFyKSB7CisgICAgICB0aGlzLnRyYW5zaXRpb24oJ2FwcGVh cicsIGRvbmUsIHRoaXMucHJvcHMuYXBwZWFyVGltZW91dCk7CisgICAgfSBlbHNlIHsKKyAgICAg IGRvbmUoKTsKKyAgICB9CisgIH0sCisKKyAgY29tcG9uZW50V2lsbEVudGVyOiBmdW5jdGlvbiAo ZG9uZSkgeworICAgIGlmICh0aGlzLnByb3BzLmVudGVyKSB7CisgICAgICB0aGlzLnRyYW5zaXRp b24oJ2VudGVyJywgZG9uZSwgdGhpcy5wcm9wcy5lbnRlclRpbWVvdXQpOworICAgIH0gZWxzZSB7 CisgICAgICBkb25lKCk7CisgICAgfQorICB9LAorCisgIGNvbXBvbmVudFdpbGxMZWF2ZTogZnVu Y3Rpb24gKGRvbmUpIHsKKyAgICBpZiAodGhpcy5wcm9wcy5sZWF2ZSkgeworICAgICAgdGhpcy50 cmFuc2l0aW9uKCdsZWF2ZScsIGRvbmUsIHRoaXMucHJvcHMubGVhdmVUaW1lb3V0KTsKKyAgICB9 IGVsc2UgeworICAgICAgZG9uZSgpOworICAgIH0KKyAgfSwKKworICByZW5kZXI6IGZ1bmN0aW9u ICgpIHsKKyAgICByZXR1cm4gb25seUNoaWxkKHRoaXMucHJvcHMuY2hpbGRyZW4pOworICB9Cit9 KTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdENTU1RyYW5zaXRpb25Hcm91cENoaWxkOworfSx7 IjI4IjoyOCwiMzciOjM3LCI0MiI6NDIsIjUiOjUsIjYiOjZ9XSw5OltmdW5jdGlvbihfZGVyZXFf LG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJv b2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29k ZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisg KiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUu IEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGlu IHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNl IHN0cmljdCc7CisKK3ZhciBQb29sZWRDbGFzcyA9IF9kZXJlcV8oNCk7Cit2YXIgUmVhY3RFbGVt ZW50ID0gX2RlcmVxXygxNik7CisKK3ZhciBlbXB0eUZ1bmN0aW9uID0gX2RlcmVxXyg0NCk7Cit2 YXIgdHJhdmVyc2VBbGxDaGlsZHJlbiA9IF9kZXJlcV8oNDApOworCit2YXIgdHdvQXJndW1lbnRQ b29sZXIgPSBQb29sZWRDbGFzcy50d29Bcmd1bWVudFBvb2xlcjsKK3ZhciBmb3VyQXJndW1lbnRQ b29sZXIgPSBQb29sZWRDbGFzcy5mb3VyQXJndW1lbnRQb29sZXI7CisKK3ZhciB1c2VyUHJvdmlk ZWRLZXlFc2NhcGVSZWdleCA9IC9cLysvZzsKK2Z1bmN0aW9uIGVzY2FwZVVzZXJQcm92aWRlZEtl eSh0ZXh0KSB7CisgIHJldHVybiAoJycgKyB0ZXh0KS5yZXBsYWNlKHVzZXJQcm92aWRlZEtleUVz Y2FwZVJlZ2V4LCAnJCYvJyk7Cit9CisKKy8qKgorICogUG9vbGVkQ2xhc3MgcmVwcmVzZW50aW5n IHRoZSBib29ra2VlcGluZyBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyBhIGNoaWxkCisgKiB0 cmF2ZXJzYWwuIEFsbG93cyBhdm9pZGluZyBiaW5kaW5nIGNhbGxiYWNrcy4KKyAqCisgKiBAY29u c3RydWN0b3IgRm9yRWFjaEJvb2tLZWVwaW5nCisgKiBAcGFyYW0geyFmdW5jdGlvbn0gZm9yRWFj aEZ1bmN0aW9uIEZ1bmN0aW9uIHRvIHBlcmZvcm0gdHJhdmVyc2FsIHdpdGguCisgKiBAcGFyYW0g ez8qfSBmb3JFYWNoQ29udGV4dCBDb250ZXh0IHRvIHBlcmZvcm0gY29udGV4dCB3aXRoLgorICov CitmdW5jdGlvbiBGb3JFYWNoQm9va0tlZXBpbmcoZm9yRWFjaEZ1bmN0aW9uLCBmb3JFYWNoQ29u dGV4dCkgeworICB0aGlzLmZ1bmMgPSBmb3JFYWNoRnVuY3Rpb247CisgIHRoaXMuY29udGV4dCA9 IGZvckVhY2hDb250ZXh0OworICB0aGlzLmNvdW50ID0gMDsKK30KK0ZvckVhY2hCb29rS2VlcGlu Zy5wcm90b3R5cGUuZGVzdHJ1Y3RvciA9IGZ1bmN0aW9uICgpIHsKKyAgdGhpcy5mdW5jID0gbnVs bDsKKyAgdGhpcy5jb250ZXh0ID0gbnVsbDsKKyAgdGhpcy5jb3VudCA9IDA7Cit9OworUG9vbGVk Q2xhc3MuYWRkUG9vbGluZ1RvKEZvckVhY2hCb29rS2VlcGluZywgdHdvQXJndW1lbnRQb29sZXIp OworCitmdW5jdGlvbiBmb3JFYWNoU2luZ2xlQ2hpbGQoYm9va0tlZXBpbmcsIGNoaWxkLCBuYW1l KSB7CisgIHZhciBmdW5jID0gYm9va0tlZXBpbmcuZnVuYywKKyAgICAgIGNvbnRleHQgPSBib29r S2VlcGluZy5jb250ZXh0OworCisgIGZ1bmMuY2FsbChjb250ZXh0LCBjaGlsZCwgYm9va0tlZXBp bmcuY291bnQrKyk7Cit9CisKKy8qKgorICogSXRlcmF0ZXMgdGhyb3VnaCBjaGlsZHJlbiB0aGF0 IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuCisgKgorICogU2Vl IGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1s I3JlYWN0LmNoaWxkcmVuLmZvcmVhY2gKKyAqCisgKiBUaGUgcHJvdmlkZWQgZm9yRWFjaEZ1bmMo Y2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaAorICogbGVhZiBjaGlsZC4KKyAq CisgKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci4KKyAqIEBw YXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZm9yRWFjaEZ1bmMKKyAqIEBwYXJhbSB7Kn0gZm9yRWFj aENvbnRleHQgQ29udGV4dCBmb3IgZm9yRWFjaENvbnRleHQuCisgKi8KK2Z1bmN0aW9uIGZvckVh Y2hDaGlsZHJlbihjaGlsZHJlbiwgZm9yRWFjaEZ1bmMsIGZvckVhY2hDb250ZXh0KSB7CisgIGlm IChjaGlsZHJlbiA9PSBudWxsKSB7CisgICAgcmV0dXJuIGNoaWxkcmVuOworICB9CisgIHZhciB0 cmF2ZXJzZUNvbnRleHQgPSBGb3JFYWNoQm9va0tlZXBpbmcuZ2V0UG9vbGVkKGZvckVhY2hGdW5j LCBmb3JFYWNoQ29udGV4dCk7CisgIHRyYXZlcnNlQWxsQ2hpbGRyZW4oY2hpbGRyZW4sIGZvckVh Y2hTaW5nbGVDaGlsZCwgdHJhdmVyc2VDb250ZXh0KTsKKyAgRm9yRWFjaEJvb2tLZWVwaW5nLnJl bGVhc2UodHJhdmVyc2VDb250ZXh0KTsKK30KKworLyoqCisgKiBQb29sZWRDbGFzcyByZXByZXNl bnRpbmcgdGhlIGJvb2trZWVwaW5nIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIGEgY2hpbGQK KyAqIG1hcHBpbmcuIEFsbG93cyBhdm9pZGluZyBiaW5kaW5nIGNhbGxiYWNrcy4KKyAqCisgKiBA Y29uc3RydWN0b3IgTWFwQm9va0tlZXBpbmcKKyAqIEBwYXJhbSB7ISp9IG1hcFJlc3VsdCBPYmpl Y3QgY29udGFpbmluZyB0aGUgb3JkZXJlZCBtYXAgb2YgcmVzdWx0cy4KKyAqIEBwYXJhbSB7IWZ1 bmN0aW9ufSBtYXBGdW5jdGlvbiBGdW5jdGlvbiB0byBwZXJmb3JtIG1hcHBpbmcgd2l0aC4KKyAq IEBwYXJhbSB7Pyp9IG1hcENvbnRleHQgQ29udGV4dCB0byBwZXJmb3JtIG1hcHBpbmcgd2l0aC4K KyAqLworZnVuY3Rpb24gTWFwQm9va0tlZXBpbmcobWFwUmVzdWx0LCBrZXlQcmVmaXgsIG1hcEZ1 bmN0aW9uLCBtYXBDb250ZXh0KSB7CisgIHRoaXMucmVzdWx0ID0gbWFwUmVzdWx0OworICB0aGlz LmtleVByZWZpeCA9IGtleVByZWZpeDsKKyAgdGhpcy5mdW5jID0gbWFwRnVuY3Rpb247CisgIHRo aXMuY29udGV4dCA9IG1hcENvbnRleHQ7CisgIHRoaXMuY291bnQgPSAwOworfQorTWFwQm9va0tl ZXBpbmcucHJvdG90eXBlLmRlc3RydWN0b3IgPSBmdW5jdGlvbiAoKSB7CisgIHRoaXMucmVzdWx0 ID0gbnVsbDsKKyAgdGhpcy5rZXlQcmVmaXggPSBudWxsOworICB0aGlzLmZ1bmMgPSBudWxsOwor ICB0aGlzLmNvbnRleHQgPSBudWxsOworICB0aGlzLmNvdW50ID0gMDsKK307CitQb29sZWRDbGFz cy5hZGRQb29saW5nVG8oTWFwQm9va0tlZXBpbmcsIGZvdXJBcmd1bWVudFBvb2xlcik7CisKK2Z1 bmN0aW9uIG1hcFNpbmdsZUNoaWxkSW50b0NvbnRleHQoYm9va0tlZXBpbmcsIGNoaWxkLCBjaGls ZEtleSkgeworICB2YXIgcmVzdWx0ID0gYm9va0tlZXBpbmcucmVzdWx0LAorICAgICAga2V5UHJl Zml4ID0gYm9va0tlZXBpbmcua2V5UHJlZml4LAorICAgICAgZnVuYyA9IGJvb2tLZWVwaW5nLmZ1 bmMsCisgICAgICBjb250ZXh0ID0gYm9va0tlZXBpbmcuY29udGV4dDsKKworCisgIHZhciBtYXBw ZWRDaGlsZCA9IGZ1bmMuY2FsbChjb250ZXh0LCBjaGlsZCwgYm9va0tlZXBpbmcuY291bnQrKyk7 CisgIGlmIChBcnJheS5pc0FycmF5KG1hcHBlZENoaWxkKSkgeworICAgIG1hcEludG9XaXRoS2V5 UHJlZml4SW50ZXJuYWwobWFwcGVkQ2hpbGQsIHJlc3VsdCwgY2hpbGRLZXksIGVtcHR5RnVuY3Rp b24udGhhdFJldHVybnNBcmd1bWVudCk7CisgIH0gZWxzZSBpZiAobWFwcGVkQ2hpbGQgIT0gbnVs bCkgeworICAgIGlmIChSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQobWFwcGVkQ2hpbGQpKSB7 CisgICAgICBtYXBwZWRDaGlsZCA9IFJlYWN0RWxlbWVudC5jbG9uZUFuZFJlcGxhY2VLZXkobWFw cGVkQ2hpbGQsCisgICAgICAvLyBLZWVwIGJvdGggdGhlIChtYXBwZWQpIGFuZCBvbGQga2V5cyBp ZiB0aGV5IGRpZmZlciwganVzdCBhcworICAgICAgLy8gdHJhdmVyc2VBbGxDaGlsZHJlbiB1c2Vk IHRvIGRvIGZvciBvYmplY3RzIGFzIGNoaWxkcmVuCisgICAgICBrZXlQcmVmaXggKyAobWFwcGVk Q2hpbGQua2V5ICYmICghY2hpbGQgfHwgY2hpbGQua2V5ICE9PSBtYXBwZWRDaGlsZC5rZXkpID8g ZXNjYXBlVXNlclByb3ZpZGVkS2V5KG1hcHBlZENoaWxkLmtleSkgKyAnLycgOiAnJykgKyBjaGls ZEtleSk7CisgICAgfQorICAgIHJlc3VsdC5wdXNoKG1hcHBlZENoaWxkKTsKKyAgfQorfQorCitm dW5jdGlvbiBtYXBJbnRvV2l0aEtleVByZWZpeEludGVybmFsKGNoaWxkcmVuLCBhcnJheSwgcHJl Zml4LCBmdW5jLCBjb250ZXh0KSB7CisgIHZhciBlc2NhcGVkUHJlZml4ID0gJyc7CisgIGlmIChw cmVmaXggIT0gbnVsbCkgeworICAgIGVzY2FwZWRQcmVmaXggPSBlc2NhcGVVc2VyUHJvdmlkZWRL ZXkocHJlZml4KSArICcvJzsKKyAgfQorICB2YXIgdHJhdmVyc2VDb250ZXh0ID0gTWFwQm9va0tl ZXBpbmcuZ2V0UG9vbGVkKGFycmF5LCBlc2NhcGVkUHJlZml4LCBmdW5jLCBjb250ZXh0KTsKKyAg dHJhdmVyc2VBbGxDaGlsZHJlbihjaGlsZHJlbiwgbWFwU2luZ2xlQ2hpbGRJbnRvQ29udGV4dCwg dHJhdmVyc2VDb250ZXh0KTsKKyAgTWFwQm9va0tlZXBpbmcucmVsZWFzZSh0cmF2ZXJzZUNvbnRl eHQpOworfQorCisvKioKKyAqIE1hcHMgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNp ZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLgorICoKKyAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdp dGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jaGlsZHJlbi5tYXAK KyAqCisgKiBUaGUgcHJvdmlkZWQgbWFwRnVuY3Rpb24oY2hpbGQsIGtleSwgaW5kZXgpIHdpbGwg YmUgY2FsbGVkIGZvciBlYWNoCisgKiBsZWFmIGNoaWxkLgorICoKKyAqIEBwYXJhbSB7Pyp9IGNo aWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLgorICogQHBhcmFtIHtmdW5jdGlvbigqLCBp bnQpfSBmdW5jIFRoZSBtYXAgZnVuY3Rpb24uCisgKiBAcGFyYW0geyp9IGNvbnRleHQgQ29udGV4 dCBmb3IgbWFwRnVuY3Rpb24uCisgKiBAcmV0dXJuIHtvYmplY3R9IE9iamVjdCBjb250YWluaW5n IHRoZSBvcmRlcmVkIG1hcCBvZiByZXN1bHRzLgorICovCitmdW5jdGlvbiBtYXBDaGlsZHJlbihj aGlsZHJlbiwgZnVuYywgY29udGV4dCkgeworICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgeworICAg IHJldHVybiBjaGlsZHJlbjsKKyAgfQorICB2YXIgcmVzdWx0ID0gW107CisgIG1hcEludG9XaXRo S2V5UHJlZml4SW50ZXJuYWwoY2hpbGRyZW4sIHJlc3VsdCwgbnVsbCwgZnVuYywgY29udGV4dCk7 CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2Z1bmN0aW9uIGZvckVhY2hTaW5nbGVDaGlsZER1bW15 KHRyYXZlcnNlQ29udGV4dCwgY2hpbGQsIG5hbWUpIHsKKyAgcmV0dXJuIG51bGw7Cit9CisKKy8q KgorICogQ291bnQgdGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3Bl Y2lmaWVkIGFzCisgKiBgcHJvcHMuY2hpbGRyZW5gLgorICoKKyAqIFNlZSBodHRwczovL2ZhY2Vi b29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jaGlsZHJl bi5jb3VudAorICoKKyAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFp bmVyLgorICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuLgorICovCitm dW5jdGlvbiBjb3VudENoaWxkcmVuKGNoaWxkcmVuLCBjb250ZXh0KSB7CisgIHJldHVybiB0cmF2 ZXJzZUFsbENoaWxkcmVuKGNoaWxkcmVuLCBmb3JFYWNoU2luZ2xlQ2hpbGREdW1teSwgbnVsbCk7 Cit9CisKKy8qKgorICogRmxhdHRlbiBhIGNoaWxkcmVuIG9iamVjdCAodHlwaWNhbGx5IHNwZWNp ZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gKSBhbmQKKyAqIHJldHVybiBhbiBhcnJheSB3aXRoIGFw cHJvcHJpYXRlbHkgcmUta2V5ZWQgY2hpbGRyZW4uCisgKgorICogU2VlIGh0dHBzOi8vZmFjZWJv b2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNoaWxkcmVu LnRvYXJyYXkKKyAqLworZnVuY3Rpb24gdG9BcnJheShjaGlsZHJlbikgeworICB2YXIgcmVzdWx0 ID0gW107CisgIG1hcEludG9XaXRoS2V5UHJlZml4SW50ZXJuYWwoY2hpbGRyZW4sIHJlc3VsdCwg bnVsbCwgZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc0FyZ3VtZW50KTsKKyAgcmV0dXJuIHJlc3Vs dDsKK30KKwordmFyIFJlYWN0Q2hpbGRyZW4gPSB7CisgIGZvckVhY2g6IGZvckVhY2hDaGlsZHJl biwKKyAgbWFwOiBtYXBDaGlsZHJlbiwKKyAgbWFwSW50b1dpdGhLZXlQcmVmaXhJbnRlcm5hbDog bWFwSW50b1dpdGhLZXlQcmVmaXhJbnRlcm5hbCwKKyAgY291bnQ6IGNvdW50Q2hpbGRyZW4sCisg IHRvQXJyYXk6IHRvQXJyYXkKK307CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RDaGlsZHJlbjsK K30seyIxNiI6MTYsIjQiOjQsIjQwIjo0MCwiNDQiOjQ0fV0sMTA6W2Z1bmN0aW9uKF9kZXJlcV8s bW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9v aywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2Rl IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAq IExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4g QW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4g dGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ug c3RyaWN0JzsKKwordmFyIF9wcm9kSW52YXJpYW50ID0gX2RlcmVxXygzOCksCisgICAgX2Fzc2ln biA9IF9kZXJlcV8oNDkpOworCit2YXIgUmVhY3RDb21wb25lbnQgPSBfZGVyZXFfKDExKTsKK3Zh ciBSZWFjdEVsZW1lbnQgPSBfZGVyZXFfKDE2KTsKK3ZhciBSZWFjdFByb3BUeXBlTG9jYXRpb25O YW1lcyA9IF9kZXJlcV8oMjIpOwordmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0gX2RlcmVxXygy MSk7CisKK3ZhciBlbXB0eU9iamVjdCA9IF9kZXJlcV8oNDUpOwordmFyIGludmFyaWFudCA9IF9k ZXJlcV8oNDYpOwordmFyIHdhcm5pbmcgPSBfZGVyZXFfKDQ4KTsKKwordmFyIE1JWElOU19LRVkg PSAnbWl4aW5zJzsKKworLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGFsbG93IHRoZSBjcmVhdGlvbiBv ZiBhbm9ueW1vdXMgZnVuY3Rpb25zIHdoaWNoIGRvIG5vdAorLy8gaGF2ZSAubmFtZSBzZXQgdG8g dGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIGJlaW5nIGFzc2lnbmVkIHRvLgorZnVuY3Rpb24gaWRl bnRpdHkoZm4pIHsKKyAgcmV0dXJuIGZuOworfQorCisvKioKKyAqIFBvbGljaWVzIHRoYXQgZGVz Y3JpYmUgbWV0aG9kcyBpbiBgUmVhY3RDbGFzc0ludGVyZmFjZWAuCisgKi8KKworCit2YXIgaW5q ZWN0ZWRNaXhpbnMgPSBbXTsKKworLyoqCisgKiBDb21wb3NpdGUgY29tcG9uZW50cyBhcmUgaGln aGVyLWxldmVsIGNvbXBvbmVudHMgdGhhdCBjb21wb3NlIG90aGVyIGNvbXBvc2l0ZQorICogb3Ig aG9zdCBjb21wb25lbnRzLgorICoKKyAqIFRvIGNyZWF0ZSBhIG5ldyB0eXBlIG9mIGBSZWFjdENs YXNzYCwgcGFzcyBhIHNwZWNpZmljYXRpb24gb2YKKyAqIHlvdXIgbmV3IGNsYXNzIHRvIGBSZWFj dC5jcmVhdGVDbGFzc2AuIFRoZSBvbmx5IHJlcXVpcmVtZW50IG9mIHlvdXIgY2xhc3MKKyAqIHNw ZWNpZmljYXRpb24gaXMgdGhhdCB5b3UgaW1wbGVtZW50IGEgYHJlbmRlcmAgbWV0aG9kLgorICoK KyAqICAgdmFyIE15Q29tcG9uZW50ID0gUmVhY3QuY3JlYXRlQ2xhc3MoeworICogICAgIHJlbmRl cjogZnVuY3Rpb24oKSB7CisgKiAgICAgICByZXR1cm4gPGRpdj5IZWxsbyBXb3JsZDwvZGl2PjsK KyAqICAgICB9CisgKiAgIH0pOworICoKKyAqIFRoZSBjbGFzcyBzcGVjaWZpY2F0aW9uIHN1cHBv cnRzIGEgc3BlY2lmaWMgcHJvdG9jb2wgb2YgbWV0aG9kcyB0aGF0IGhhdmUKKyAqIHNwZWNpYWwg bWVhbmluZyAoZS5nLiBgcmVuZGVyYCkuIFNlZSBgUmVhY3RDbGFzc0ludGVyZmFjZWAgZm9yCisg KiBtb3JlIHRoZSBjb21wcmVoZW5zaXZlIHByb3RvY29sLiBBbnkgb3RoZXIgcHJvcGVydGllcyBh bmQgbWV0aG9kcyBpbiB0aGUKKyAqIGNsYXNzIHNwZWNpZmljYXRpb24gd2lsbCBiZSBhdmFpbGFi bGUgb24gdGhlIHByb3RvdHlwZS4KKyAqCisgKiBAaW50ZXJmYWNlIFJlYWN0Q2xhc3NJbnRlcmZh Y2UKKyAqIEBpbnRlcm5hbAorICovCit2YXIgUmVhY3RDbGFzc0ludGVyZmFjZSA9IHsKKworICAv KioKKyAgICogQW4gYXJyYXkgb2YgTWl4aW4gb2JqZWN0cyB0byBpbmNsdWRlIHdoZW4gZGVmaW5p bmcgeW91ciBjb21wb25lbnQuCisgICAqCisgICAqIEB0eXBlIHthcnJheX0KKyAgICogQG9wdGlv bmFsCisgICAqLworICBtaXhpbnM6ICdERUZJTkVfTUFOWScsCisKKyAgLyoqCisgICAqIEFuIG9i amVjdCBjb250YWluaW5nIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgdGhhdCBzaG91bGQgYmUgZGVm aW5lZCBvbgorICAgKiB0aGUgY29tcG9uZW50J3MgY29uc3RydWN0b3IgaW5zdGVhZCBvZiBpdHMg cHJvdG90eXBlIChzdGF0aWMgbWV0aG9kcykuCisgICAqCisgICAqIEB0eXBlIHtvYmplY3R9Cisg ICAqIEBvcHRpb25hbAorICAgKi8KKyAgc3RhdGljczogJ0RFRklORV9NQU5ZJywKKworICAvKioK KyAgICogRGVmaW5pdGlvbiBvZiBwcm9wIHR5cGVzIGZvciB0aGlzIGNvbXBvbmVudC4KKyAgICoK KyAgICogQHR5cGUge29iamVjdH0KKyAgICogQG9wdGlvbmFsCisgICAqLworICBwcm9wVHlwZXM6 ICdERUZJTkVfTUFOWScsCisKKyAgLyoqCisgICAqIERlZmluaXRpb24gb2YgY29udGV4dCB0eXBl cyBmb3IgdGhpcyBjb21wb25lbnQuCisgICAqCisgICAqIEB0eXBlIHtvYmplY3R9CisgICAqIEBv cHRpb25hbAorICAgKi8KKyAgY29udGV4dFR5cGVzOiAnREVGSU5FX01BTlknLAorCisgIC8qKgor ICAgKiBEZWZpbml0aW9uIG9mIGNvbnRleHQgdHlwZXMgdGhpcyBjb21wb25lbnQgc2V0cyBmb3Ig aXRzIGNoaWxkcmVuLgorICAgKgorICAgKiBAdHlwZSB7b2JqZWN0fQorICAgKiBAb3B0aW9uYWwK KyAgICovCisgIGNoaWxkQ29udGV4dFR5cGVzOiAnREVGSU5FX01BTlknLAorCisgIC8vID09PT0g RGVmaW5pdGlvbiBtZXRob2RzID09PT0KKworICAvKioKKyAgICogSW52b2tlZCB3aGVuIHRoZSBj b21wb25lbnQgaXMgbW91bnRlZC4gVmFsdWVzIGluIHRoZSBtYXBwaW5nIHdpbGwgYmUgc2V0IG9u CisgICAqIGB0aGlzLnByb3BzYCBpZiB0aGF0IHByb3AgaXMgbm90IHNwZWNpZmllZCAoaS5lLiB1 c2luZyBhbiBgaW5gIGNoZWNrKS4KKyAgICoKKyAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBi ZWZvcmUgYGdldEluaXRpYWxTdGF0ZWAgYW5kIHRoZXJlZm9yZSBjYW5ub3QgcmVseQorICAgKiBv biBgdGhpcy5zdGF0ZWAgb3IgdXNlIGB0aGlzLnNldFN0YXRlYC4KKyAgICoKKyAgICogQHJldHVy biB7b2JqZWN0fQorICAgKiBAb3B0aW9uYWwKKyAgICovCisgIGdldERlZmF1bHRQcm9wczogJ0RF RklORV9NQU5ZX01FUkdFRCcsCisKKyAgLyoqCisgICAqIEludm9rZWQgb25jZSBiZWZvcmUgdGhl IGNvbXBvbmVudCBpcyBtb3VudGVkLiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdXNlZAorICAg KiBhcyB0aGUgaW5pdGlhbCB2YWx1ZSBvZiBgdGhpcy5zdGF0ZWAuCisgICAqCisgICAqICAgZ2V0 SW5pdGlhbFN0YXRlOiBmdW5jdGlvbigpIHsKKyAgICogICAgIHJldHVybiB7CisgICAqICAgICAg IGlzT246IGZhbHNlLAorICAgKiAgICAgICBmb29CYXo6IG5ldyBCYXpGb28oKQorICAgKiAgICAg fQorICAgKiAgIH0KKyAgICoKKyAgICogQHJldHVybiB7b2JqZWN0fQorICAgKiBAb3B0aW9uYWwK KyAgICovCisgIGdldEluaXRpYWxTdGF0ZTogJ0RFRklORV9NQU5ZX01FUkdFRCcsCisKKyAgLyoq CisgICAqIEByZXR1cm4ge29iamVjdH0KKyAgICogQG9wdGlvbmFsCisgICAqLworICBnZXRDaGls ZENvbnRleHQ6ICdERUZJTkVfTUFOWV9NRVJHRUQnLAorCisgIC8qKgorICAgKiBVc2VzIHByb3Bz IGZyb20gYHRoaXMucHJvcHNgIGFuZCBzdGF0ZSBmcm9tIGB0aGlzLnN0YXRlYCB0byByZW5kZXIg dGhlCisgICAqIHN0cnVjdHVyZSBvZiB0aGUgY29tcG9uZW50LgorICAgKgorICAgKiBObyBndWFy YW50ZWVzIGFyZSBtYWRlIGFib3V0IHdoZW4gb3IgaG93IG9mdGVuIHRoaXMgbWV0aG9kIGlzIGlu dm9rZWQsIHNvCisgICAqIGl0IG11c3Qgbm90IGhhdmUgc2lkZSBlZmZlY3RzLgorICAgKgorICAg KiAgIHJlbmRlcjogZnVuY3Rpb24oKSB7CisgICAqICAgICB2YXIgbmFtZSA9IHRoaXMucHJvcHMu bmFtZTsKKyAgICogICAgIHJldHVybiA8ZGl2PkhlbGxvLCB7bmFtZX0hPC9kaXY+OworICAgKiAg IH0KKyAgICoKKyAgICogQHJldHVybiB7UmVhY3RDb21wb25lbnR9CisgICAqIEBub3NpZGVlZmZl Y3RzCisgICAqIEByZXF1aXJlZAorICAgKi8KKyAgcmVuZGVyOiAnREVGSU5FX09OQ0UnLAorCisg IC8vID09PT0gRGVsZWdhdGUgbWV0aG9kcyA9PT09CisKKyAgLyoqCisgICAqIEludm9rZWQgd2hl biB0aGUgY29tcG9uZW50IGlzIGluaXRpYWxseSBjcmVhdGVkIGFuZCBhYm91dCB0byBiZSBtb3Vu dGVkLgorICAgKiBUaGlzIG1heSBoYXZlIHNpZGUgZWZmZWN0cywgYnV0IGFueSBleHRlcm5hbCBz dWJzY3JpcHRpb25zIG9yIGRhdGEgY3JlYXRlZAorICAgKiBieSB0aGlzIG1ldGhvZCBtdXN0IGJl IGNsZWFuZWQgdXAgaW4gYGNvbXBvbmVudFdpbGxVbm1vdW50YC4KKyAgICoKKyAgICogQG9wdGlv bmFsCisgICAqLworICBjb21wb25lbnRXaWxsTW91bnQ6ICdERUZJTkVfTUFOWScsCisKKyAgLyoq CisgICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50IGhhcyBiZWVuIG1vdW50ZWQgYW5kIGhh cyBhIERPTSByZXByZXNlbnRhdGlvbi4KKyAgICogSG93ZXZlciwgdGhlcmUgaXMgbm8gZ3VhcmFu dGVlIHRoYXQgdGhlIERPTSBub2RlIGlzIGluIHRoZSBkb2N1bWVudC4KKyAgICoKKyAgICogVXNl IHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gb3BlcmF0ZSBvbiB0aGUgRE9NIHdoZW4gdGhlIGNv bXBvbmVudCBoYXMKKyAgICogYmVlbiBtb3VudGVkIChpbml0aWFsaXplZCBhbmQgcmVuZGVyZWQp IGZvciB0aGUgZmlyc3QgdGltZS4KKyAgICoKKyAgICogQHBhcmFtIHtET01FbGVtZW50fSByb290 Tm9kZSBET00gZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGNvbXBvbmVudC4KKyAgICogQG9wdGlv bmFsCisgICAqLworICBjb21wb25lbnREaWRNb3VudDogJ0RFRklORV9NQU5ZJywKKworICAvKioK KyAgICogSW52b2tlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCByZWNlaXZlcyBuZXcgcHJvcHMuCisg ICAqCisgICAqIFVzZSB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIHJlYWN0IHRvIGEgcHJvcCB0 cmFuc2l0aW9uIGJ5IHVwZGF0aW5nIHRoZQorICAgKiBzdGF0ZSB1c2luZyBgdGhpcy5zZXRTdGF0 ZWAuIEN1cnJlbnQgcHJvcHMgYXJlIGFjY2Vzc2VkIHZpYSBgdGhpcy5wcm9wc2AuCisgICAqCisg ICAqICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wczogZnVuY3Rpb24obmV4dFByb3BzLCBuZXh0 Q29udGV4dCkgeworICAgKiAgICAgdGhpcy5zZXRTdGF0ZSh7CisgICAqICAgICAgIGxpa2VzSW5j cmVhc2luZzogbmV4dFByb3BzLmxpa2VDb3VudCA+IHRoaXMucHJvcHMubGlrZUNvdW50CisgICAq ICAgICB9KTsKKyAgICogICB9CisgICAqCisgICAqIE5PVEU6IFRoZXJlIGlzIG5vIGVxdWl2YWxl bnQgYGNvbXBvbmVudFdpbGxSZWNlaXZlU3RhdGVgLiBBbiBpbmNvbWluZyBwcm9wCisgICAqIHRy YW5zaXRpb24gbWF5IGNhdXNlIGEgc3RhdGUgY2hhbmdlLCBidXQgdGhlIG9wcG9zaXRlIGlzIG5v dCB0cnVlLiBJZiB5b3UKKyAgICogbmVlZCBpdCwgeW91IGFyZSBwcm9iYWJseSBsb29raW5nIGZv ciBgY29tcG9uZW50V2lsbFVwZGF0ZWAuCisgICAqCisgICAqIEBwYXJhbSB7b2JqZWN0fSBuZXh0 UHJvcHMKKyAgICogQG9wdGlvbmFsCisgICAqLworICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3Bz OiAnREVGSU5FX01BTlknLAorCisgIC8qKgorICAgKiBJbnZva2VkIHdoaWxlIGRlY2lkaW5nIGlm IHRoZSBjb21wb25lbnQgc2hvdWxkIGJlIHVwZGF0ZWQgYXMgYSByZXN1bHQgb2YKKyAgICogcmVj ZWl2aW5nIG5ldyBwcm9wcywgc3RhdGUgYW5kL29yIGNvbnRleHQuCisgICAqCisgICAqIFVzZSB0 aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIGByZXR1cm4gZmFsc2VgIHdoZW4geW91J3JlIGNlcnRh aW4gdGhhdCB0aGUKKyAgICogdHJhbnNpdGlvbiB0byB0aGUgbmV3IHByb3BzL3N0YXRlL2NvbnRl eHQgd2lsbCBub3QgcmVxdWlyZSBhIGNvbXBvbmVudAorICAgKiB1cGRhdGUuCisgICAqCisgICAq ICAgc2hvdWxkQ29tcG9uZW50VXBkYXRlOiBmdW5jdGlvbihuZXh0UHJvcHMsIG5leHRTdGF0ZSwg bmV4dENvbnRleHQpIHsKKyAgICogICAgIHJldHVybiAhZXF1YWwobmV4dFByb3BzLCB0aGlzLnBy b3BzKSB8fAorICAgKiAgICAgICAhZXF1YWwobmV4dFN0YXRlLCB0aGlzLnN0YXRlKSB8fAorICAg KiAgICAgICAhZXF1YWwobmV4dENvbnRleHQsIHRoaXMuY29udGV4dCk7CisgICAqICAgfQorICAg KgorICAgKiBAcGFyYW0ge29iamVjdH0gbmV4dFByb3BzCisgICAqIEBwYXJhbSB7P29iamVjdH0g bmV4dFN0YXRlCisgICAqIEBwYXJhbSB7P29iamVjdH0gbmV4dENvbnRleHQKKyAgICogQHJldHVy biB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgY29tcG9uZW50IHNob3VsZCB1cGRhdGUuCisgICAqIEBv cHRpb25hbAorICAgKi8KKyAgc2hvdWxkQ29tcG9uZW50VXBkYXRlOiAnREVGSU5FX09OQ0UnLAor CisgIC8qKgorICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBhYm91dCB0byB1cGRh dGUgZHVlIHRvIGEgdHJhbnNpdGlvbiBmcm9tCisgICAqIGB0aGlzLnByb3BzYCwgYHRoaXMuc3Rh dGVgIGFuZCBgdGhpcy5jb250ZXh0YCB0byBgbmV4dFByb3BzYCwgYG5leHRTdGF0ZWAKKyAgICog YW5kIGBuZXh0Q29udGV4dGAuCisgICAqCisgICAqIFVzZSB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5 IHRvIHBlcmZvcm0gcHJlcGFyYXRpb24gYmVmb3JlIGFuIHVwZGF0ZSBvY2N1cnMuCisgICAqCisg ICAqIE5PVEU6IFlvdSAqKmNhbm5vdCoqIHVzZSBgdGhpcy5zZXRTdGF0ZSgpYCBpbiB0aGlzIG1l dGhvZC4KKyAgICoKKyAgICogQHBhcmFtIHtvYmplY3R9IG5leHRQcm9wcworICAgKiBAcGFyYW0g ez9vYmplY3R9IG5leHRTdGF0ZQorICAgKiBAcGFyYW0gez9vYmplY3R9IG5leHRDb250ZXh0Cisg ICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24KKyAgICog QG9wdGlvbmFsCisgICAqLworICBjb21wb25lbnRXaWxsVXBkYXRlOiAnREVGSU5FX01BTlknLAor CisgIC8qKgorICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCdzIERPTSByZXByZXNlbnRh dGlvbiBoYXMgYmVlbiB1cGRhdGVkLgorICAgKgorICAgKiBVc2UgdGhpcyBhcyBhbiBvcHBvcnR1 bml0eSB0byBvcGVyYXRlIG9uIHRoZSBET00gd2hlbiB0aGUgY29tcG9uZW50IGhhcworICAgKiBi ZWVuIHVwZGF0ZWQuCisgICAqCisgICAqIEBwYXJhbSB7b2JqZWN0fSBwcmV2UHJvcHMKKyAgICog QHBhcmFtIHs/b2JqZWN0fSBwcmV2U3RhdGUKKyAgICogQHBhcmFtIHs/b2JqZWN0fSBwcmV2Q29u dGV4dAorICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IHJvb3ROb2RlIERPTSBlbGVtZW50IHJlcHJl c2VudGluZyB0aGUgY29tcG9uZW50LgorICAgKiBAb3B0aW9uYWwKKyAgICovCisgIGNvbXBvbmVu dERpZFVwZGF0ZTogJ0RFRklORV9NQU5ZJywKKworICAvKioKKyAgICogSW52b2tlZCB3aGVuIHRo ZSBjb21wb25lbnQgaXMgYWJvdXQgdG8gYmUgcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQgYW5kIGhh dmUKKyAgICogaXRzIERPTSByZXByZXNlbnRhdGlvbiBkZXN0cm95ZWQuCisgICAqCisgICAqIFVz ZSB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIGRlYWxsb2NhdGUgYW55IGV4dGVybmFsIHJlc291 cmNlcy4KKyAgICoKKyAgICogTk9URTogVGhlcmUgaXMgbm8gYGNvbXBvbmVudERpZFVubW91bnRg IHNpbmNlIHlvdXIgY29tcG9uZW50IHdpbGwgaGF2ZSBiZWVuCisgICAqIGRlc3Ryb3llZCBieSB0 aGF0IHBvaW50LgorICAgKgorICAgKiBAb3B0aW9uYWwKKyAgICovCisgIGNvbXBvbmVudFdpbGxV bm1vdW50OiAnREVGSU5FX01BTlknLAorCisgIC8vID09PT0gQWR2YW5jZWQgbWV0aG9kcyA9PT09 CisKKyAgLyoqCisgICAqIFVwZGF0ZXMgdGhlIGNvbXBvbmVudCdzIGN1cnJlbnRseSBtb3VudGVk IERPTSByZXByZXNlbnRhdGlvbi4KKyAgICoKKyAgICogQnkgZGVmYXVsdCwgdGhpcyBpbXBsZW1l bnRzIFJlYWN0J3MgcmVuZGVyaW5nIGFuZCByZWNvbmNpbGlhdGlvbiBhbGdvcml0aG0uCisgICAq IFNvcGhpc3RpY2F0ZWQgY2xpZW50cyBtYXkgd2lzaCB0byBvdmVycmlkZSB0aGlzLgorICAgKgor ICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uCisgICAq IEBpbnRlcm5hbAorICAgKiBAb3ZlcnJpZGFibGUKKyAgICovCisgIHVwZGF0ZUNvbXBvbmVudDog J09WRVJSSURFX0JBU0UnCisKK307CisKKy8qKgorICogTWFwcGluZyBmcm9tIGNsYXNzIHNwZWNp ZmljYXRpb24ga2V5cyB0byBzcGVjaWFsIHByb2Nlc3NpbmcgZnVuY3Rpb25zLgorICoKKyAqIEFs dGhvdWdoIHRoZXNlIGFyZSBkZWNsYXJlZCBsaWtlIGluc3RhbmNlIHByb3BlcnRpZXMgaW4gdGhl IHNwZWNpZmljYXRpb24KKyAqIHdoZW4gZGVmaW5pbmcgY2xhc3NlcyB1c2luZyBgUmVhY3QuY3Jl YXRlQ2xhc3NgLCB0aGV5IGFyZSBhY3R1YWxseSBzdGF0aWMKKyAqIGFuZCBhcmUgYWNjZXNzaWJs ZSBvbiB0aGUgY29uc3RydWN0b3IgaW5zdGVhZCBvZiB0aGUgcHJvdG90eXBlLiBEZXNwaXRlCisg KiBiZWluZyBzdGF0aWMsIHRoZXkgbXVzdCBiZSBkZWZpbmVkIG91dHNpZGUgb2YgdGhlICJzdGF0 aWNzIiBrZXkgdW5kZXIKKyAqIHdoaWNoIGFsbCBvdGhlciBzdGF0aWMgbWV0aG9kcyBhcmUgZGVm aW5lZC4KKyAqLwordmFyIFJFU0VSVkVEX1NQRUNfS0VZUyA9IHsKKyAgZGlzcGxheU5hbWU6IGZ1 bmN0aW9uIChDb25zdHJ1Y3RvciwgZGlzcGxheU5hbWUpIHsKKyAgICBDb25zdHJ1Y3Rvci5kaXNw bGF5TmFtZSA9IGRpc3BsYXlOYW1lOworICB9LAorICBtaXhpbnM6IGZ1bmN0aW9uIChDb25zdHJ1 Y3RvciwgbWl4aW5zKSB7CisgICAgaWYgKG1peGlucykgeworICAgICAgZm9yICh2YXIgaSA9IDA7 IGkgPCBtaXhpbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgbWl4U3BlY0ludG9Db21wb25lbnQo Q29uc3RydWN0b3IsIG1peGluc1tpXSk7CisgICAgICB9CisgICAgfQorICB9LAorICBjaGlsZENv bnRleHRUeXBlczogZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBjaGlsZENvbnRleHRUeXBlcykgewor ICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIHZhbGlkYXRl VHlwZURlZihDb25zdHJ1Y3RvciwgY2hpbGRDb250ZXh0VHlwZXMsICdjaGlsZENvbnRleHQnKTsK KyAgICB9CisgICAgQ29uc3RydWN0b3IuY2hpbGRDb250ZXh0VHlwZXMgPSBfYXNzaWduKHt9LCBD b25zdHJ1Y3Rvci5jaGlsZENvbnRleHRUeXBlcywgY2hpbGRDb250ZXh0VHlwZXMpOworICB9LAor ICBjb250ZXh0VHlwZXM6IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgY29udGV4dFR5cGVzKSB7Cisg ICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgdmFsaWRhdGVU eXBlRGVmKENvbnN0cnVjdG9yLCBjb250ZXh0VHlwZXMsICdjb250ZXh0Jyk7CisgICAgfQorICAg IENvbnN0cnVjdG9yLmNvbnRleHRUeXBlcyA9IF9hc3NpZ24oe30sIENvbnN0cnVjdG9yLmNvbnRl eHRUeXBlcywgY29udGV4dFR5cGVzKTsKKyAgfSwKKyAgLyoqCisgICAqIFNwZWNpYWwgY2FzZSBn ZXREZWZhdWx0UHJvcHMgd2hpY2ggc2hvdWxkIG1vdmUgaW50byBzdGF0aWNzIGJ1dCByZXF1aXJl cworICAgKiBhdXRvbWF0aWMgbWVyZ2luZy4KKyAgICovCisgIGdldERlZmF1bHRQcm9wczogZnVu Y3Rpb24gKENvbnN0cnVjdG9yLCBnZXREZWZhdWx0UHJvcHMpIHsKKyAgICBpZiAoQ29uc3RydWN0 b3IuZ2V0RGVmYXVsdFByb3BzKSB7CisgICAgICBDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMg PSBjcmVhdGVNZXJnZWRSZXN1bHRGdW5jdGlvbihDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMs IGdldERlZmF1bHRQcm9wcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIENvbnN0cnVjdG9yLmdldERl ZmF1bHRQcm9wcyA9IGdldERlZmF1bHRQcm9wczsKKyAgICB9CisgIH0sCisgIHByb3BUeXBlczog ZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm9wVHlwZXMpIHsKKyAgICBpZiAoImRldmVsb3BtZW50 IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICB2YWxpZGF0ZVR5cGVEZWYoQ29uc3RydWN0b3Is IHByb3BUeXBlcywgJ3Byb3AnKTsKKyAgICB9CisgICAgQ29uc3RydWN0b3IucHJvcFR5cGVzID0g X2Fzc2lnbih7fSwgQ29uc3RydWN0b3IucHJvcFR5cGVzLCBwcm9wVHlwZXMpOworICB9LAorICBz dGF0aWNzOiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHN0YXRpY3MpIHsKKyAgICBtaXhTdGF0aWNT cGVjSW50b0NvbXBvbmVudChDb25zdHJ1Y3Rvciwgc3RhdGljcyk7CisgIH0sCisgIGF1dG9iaW5k OiBmdW5jdGlvbiAoKSB7fSB9OworCitmdW5jdGlvbiB2YWxpZGF0ZVR5cGVEZWYoQ29uc3RydWN0 b3IsIHR5cGVEZWYsIGxvY2F0aW9uKSB7CisgIGZvciAodmFyIHByb3BOYW1lIGluIHR5cGVEZWYp IHsKKyAgICBpZiAodHlwZURlZi5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHsKKyAgICAgIC8v IHVzZSBhIHdhcm5pbmcgaW5zdGVhZCBvZiBhbiBpbnZhcmlhbnQgc28gY29tcG9uZW50cworICAg ICAgLy8gZG9uJ3Qgc2hvdyB1cCBpbiBwcm9kIGJ1dCBvbmx5IGluIF9fREVWX18KKyAgICAgICJk ZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcodHlwZW9mIHR5cGVEZWZbcHJv cE5hbWVdID09PSAnZnVuY3Rpb24nLCAnJXM6ICVzIHR5cGUgYCVzYCBpcyBpbnZhbGlkOyBpdCBt dXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSAnICsgJ1JlYWN0LlByb3BUeXBlcy4nLCBD b25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCAnUmVhY3RDbGFzcycsIFJlYWN0UHJvcFR5cGVMb2Nh dGlvbk5hbWVzW2xvY2F0aW9uXSwgcHJvcE5hbWUpIDogdm9pZCAwOworICAgIH0KKyAgfQorfQor CitmdW5jdGlvbiB2YWxpZGF0ZU1ldGhvZE92ZXJyaWRlKGlzQWxyZWFkeURlZmluZWQsIG5hbWUp IHsKKyAgdmFyIHNwZWNQb2xpY3kgPSBSZWFjdENsYXNzSW50ZXJmYWNlLmhhc093blByb3BlcnR5 KG5hbWUpID8gUmVhY3RDbGFzc0ludGVyZmFjZVtuYW1lXSA6IG51bGw7CisKKyAgLy8gRGlzYWxs b3cgb3ZlcnJpZGluZyBvZiBiYXNlIGNsYXNzIG1ldGhvZHMgdW5sZXNzIGV4cGxpY2l0bHkgYWxs b3dlZC4KKyAgaWYgKFJlYWN0Q2xhc3NNaXhpbi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgeworICAg ICEoc3BlY1BvbGljeSA9PT0gJ09WRVJSSURFX0JBU0UnKSA/ICJkZXZlbG9wbWVudCIgIT09ICdw cm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0Q2xhc3NJbnRlcmZhY2U6IFlvdSBh cmUgYXR0ZW1wdGluZyB0byBvdmVycmlkZSBgJXNgIGZyb20geW91ciBjbGFzcyBzcGVjaWZpY2F0 aW9uLiBFbnN1cmUgdGhhdCB5b3VyIG1ldGhvZCBuYW1lcyBkbyBub3Qgb3ZlcmxhcCB3aXRoIFJl YWN0IG1ldGhvZHMuJywgbmFtZSkgOiBfcHJvZEludmFyaWFudCgnNzMnLCBuYW1lKSA6IHZvaWQg MDsKKyAgfQorCisgIC8vIERpc2FsbG93IGRlZmluaW5nIG1ldGhvZHMgbW9yZSB0aGFuIG9uY2Ug dW5sZXNzIGV4cGxpY2l0bHkgYWxsb3dlZC4KKyAgaWYgKGlzQWxyZWFkeURlZmluZWQpIHsKKyAg ICAhKHNwZWNQb2xpY3kgPT09ICdERUZJTkVfTUFOWScgfHwgc3BlY1BvbGljeSA9PT0gJ0RFRklO RV9NQU5ZX01FUkdFRCcpID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJp YW50KGZhbHNlLCAnUmVhY3RDbGFzc0ludGVyZmFjZTogWW91IGFyZSBhdHRlbXB0aW5nIHRvIGRl ZmluZSBgJXNgIG9uIHlvdXIgY29tcG9uZW50IG1vcmUgdGhhbiBvbmNlLiBUaGlzIGNvbmZsaWN0 IG1heSBiZSBkdWUgdG8gYSBtaXhpbi4nLCBuYW1lKSA6IF9wcm9kSW52YXJpYW50KCc3NCcsIG5h bWUpIDogdm9pZCAwOworICB9Cit9CisKKy8qKgorICogTWl4aW4gaGVscGVyIHdoaWNoIGhhbmRs ZXMgcG9saWN5IHZhbGlkYXRpb24gYW5kIHJlc2VydmVkCisgKiBzcGVjaWZpY2F0aW9uIGtleXMg d2hlbiBidWlsZGluZyBSZWFjdCBjbGFzc2VzLgorICovCitmdW5jdGlvbiBtaXhTcGVjSW50b0Nv bXBvbmVudChDb25zdHJ1Y3Rvciwgc3BlYykgeworICBpZiAoIXNwZWMpIHsKKyAgICBpZiAoImRl dmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICB2YXIgdHlwZW9mU3BlYyA9IHR5 cGVvZiBzcGVjOworICAgICAgdmFyIGlzTWl4aW5WYWxpZCA9IHR5cGVvZlNwZWMgPT09ICdvYmpl Y3QnICYmIHNwZWMgIT09IG51bGw7CisKKyAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0 aW9uJyA/IHdhcm5pbmcoaXNNaXhpblZhbGlkLCAnJXM6IFlvdVwncmUgYXR0ZW1wdGluZyB0byBp bmNsdWRlIGEgbWl4aW4gdGhhdCBpcyBlaXRoZXIgbnVsbCAnICsgJ29yIG5vdCBhbiBvYmplY3Qu IENoZWNrIHRoZSBtaXhpbnMgaW5jbHVkZWQgYnkgdGhlIGNvbXBvbmVudCwgJyArICdhcyB3ZWxs IGFzIGFueSBtaXhpbnMgdGhleSBpbmNsdWRlIHRoZW1zZWx2ZXMuICcgKyAnRXhwZWN0ZWQgb2Jq ZWN0IGJ1dCBnb3QgJXMuJywgQ29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgJ1JlYWN0Q2xhc3Mn LCBzcGVjID09PSBudWxsID8gbnVsbCA6IHR5cGVvZlNwZWMpIDogdm9pZCAwOworICAgIH0KKwor ICAgIHJldHVybjsKKyAgfQorCisgICEodHlwZW9mIHNwZWMgIT09ICdmdW5jdGlvbicpID8gImRl dmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RDbGFz czogWW91XCdyZSBhdHRlbXB0aW5nIHRvIHVzZSBhIGNvbXBvbmVudCBjbGFzcyBvciBmdW5jdGlv biBhcyBhIG1peGluLiBJbnN0ZWFkLCBqdXN0IHVzZSBhIHJlZ3VsYXIgb2JqZWN0LicpIDogX3By b2RJbnZhcmlhbnQoJzc1JykgOiB2b2lkIDA7CisgICEhUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVt ZW50KHNwZWMpID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZh bHNlLCAnUmVhY3RDbGFzczogWW91XCdyZSBhdHRlbXB0aW5nIHRvIHVzZSBhIGNvbXBvbmVudCBh cyBhIG1peGluLiBJbnN0ZWFkLCBqdXN0IHVzZSBhIHJlZ3VsYXIgb2JqZWN0LicpIDogX3Byb2RJ bnZhcmlhbnQoJzc2JykgOiB2b2lkIDA7CisKKyAgdmFyIHByb3RvID0gQ29uc3RydWN0b3IucHJv dG90eXBlOworICB2YXIgYXV0b0JpbmRQYWlycyA9IHByb3RvLl9fcmVhY3RBdXRvQmluZFBhaXJz OworCisgIC8vIEJ5IGhhbmRsaW5nIG1peGlucyBiZWZvcmUgYW55IG90aGVyIHByb3BlcnRpZXMs IHdlIGVuc3VyZSB0aGUgc2FtZQorICAvLyBjaGFpbmluZyBvcmRlciBpcyBhcHBsaWVkIHRvIG1l dGhvZHMgd2l0aCBERUZJTkVfTUFOWSBwb2xpY3ksIHdoZXRoZXIKKyAgLy8gbWl4aW5zIGFyZSBs aXN0ZWQgYmVmb3JlIG9yIGFmdGVyIHRoZXNlIG1ldGhvZHMgaW4gdGhlIHNwZWMuCisgIGlmIChz cGVjLmhhc093blByb3BlcnR5KE1JWElOU19LRVkpKSB7CisgICAgUkVTRVJWRURfU1BFQ19LRVlT Lm1peGlucyhDb25zdHJ1Y3Rvciwgc3BlYy5taXhpbnMpOworICB9CisKKyAgZm9yICh2YXIgbmFt ZSBpbiBzcGVjKSB7CisgICAgaWYgKCFzcGVjLmhhc093blByb3BlcnR5KG5hbWUpKSB7CisgICAg ICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAobmFtZSA9PT0gTUlYSU5TX0tFWSkgeworICAg ICAgLy8gV2UgaGF2ZSBhbHJlYWR5IGhhbmRsZWQgbWl4aW5zIGluIGEgc3BlY2lhbCBjYXNlIGFi b3ZlLgorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgdmFyIHByb3BlcnR5ID0gc3BlY1tu YW1lXTsKKyAgICB2YXIgaXNBbHJlYWR5RGVmaW5lZCA9IHByb3RvLmhhc093blByb3BlcnR5KG5h bWUpOworICAgIHZhbGlkYXRlTWV0aG9kT3ZlcnJpZGUoaXNBbHJlYWR5RGVmaW5lZCwgbmFtZSk7 CisKKyAgICBpZiAoUkVTRVJWRURfU1BFQ19LRVlTLmhhc093blByb3BlcnR5KG5hbWUpKSB7Cisg ICAgICBSRVNFUlZFRF9TUEVDX0tFWVNbbmFtZV0oQ29uc3RydWN0b3IsIHByb3BlcnR5KTsKKyAg ICB9IGVsc2UgeworICAgICAgLy8gU2V0dXAgbWV0aG9kcyBvbiBwcm90b3R5cGU6CisgICAgICAv LyBUaGUgZm9sbG93aW5nIG1lbWJlciBtZXRob2RzIHNob3VsZCBub3QgYmUgYXV0b21hdGljYWxs eSBib3VuZDoKKyAgICAgIC8vIDEuIEV4cGVjdGVkIFJlYWN0Q2xhc3MgbWV0aG9kcyAoaW4gdGhl ICJpbnRlcmZhY2UiKS4KKyAgICAgIC8vIDIuIE92ZXJyaWRkZW4gbWV0aG9kcyAodGhhdCB3ZXJl IG1peGVkIGluKS4KKyAgICAgIHZhciBpc1JlYWN0Q2xhc3NNZXRob2QgPSBSZWFjdENsYXNzSW50 ZXJmYWNlLmhhc093blByb3BlcnR5KG5hbWUpOworICAgICAgdmFyIGlzRnVuY3Rpb24gPSB0eXBl b2YgcHJvcGVydHkgPT09ICdmdW5jdGlvbic7CisgICAgICB2YXIgc2hvdWxkQXV0b0JpbmQgPSBp c0Z1bmN0aW9uICYmICFpc1JlYWN0Q2xhc3NNZXRob2QgJiYgIWlzQWxyZWFkeURlZmluZWQgJiYg c3BlYy5hdXRvYmluZCAhPT0gZmFsc2U7CisKKyAgICAgIGlmIChzaG91bGRBdXRvQmluZCkgewor ICAgICAgICBhdXRvQmluZFBhaXJzLnB1c2gobmFtZSwgcHJvcGVydHkpOworICAgICAgICBwcm90 b1tuYW1lXSA9IHByb3BlcnR5OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGlzQWxyZWFk eURlZmluZWQpIHsKKyAgICAgICAgICB2YXIgc3BlY1BvbGljeSA9IFJlYWN0Q2xhc3NJbnRlcmZh Y2VbbmFtZV07CisKKyAgICAgICAgICAvLyBUaGVzZSBjYXNlcyBzaG91bGQgYWxyZWFkeSBiZSBj YXVnaHQgYnkgdmFsaWRhdGVNZXRob2RPdmVycmlkZS4KKyAgICAgICAgICAhKGlzUmVhY3RDbGFz c01ldGhvZCAmJiAoc3BlY1BvbGljeSA9PT0gJ0RFRklORV9NQU5ZX01FUkdFRCcgfHwgc3BlY1Bv bGljeSA9PT0gJ0RFRklORV9NQU5ZJykpID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24n ID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RDbGFzczogVW5leHBlY3RlZCBzcGVjIHBvbGljeSAl cyBmb3Iga2V5ICVzIHdoZW4gbWl4aW5nIGluIGNvbXBvbmVudCBzcGVjcy4nLCBzcGVjUG9saWN5 LCBuYW1lKSA6IF9wcm9kSW52YXJpYW50KCc3NycsIHNwZWNQb2xpY3ksIG5hbWUpIDogdm9pZCAw OworCisgICAgICAgICAgLy8gRm9yIG1ldGhvZHMgd2hpY2ggYXJlIGRlZmluZWQgbW9yZSB0aGFu IG9uY2UsIGNhbGwgdGhlIGV4aXN0aW5nCisgICAgICAgICAgLy8gbWV0aG9kcyBiZWZvcmUgY2Fs bGluZyB0aGUgbmV3IHByb3BlcnR5LCBtZXJnaW5nIGlmIGFwcHJvcHJpYXRlLgorICAgICAgICAg IGlmIChzcGVjUG9saWN5ID09PSAnREVGSU5FX01BTllfTUVSR0VEJykgeworICAgICAgICAgICAg cHJvdG9bbmFtZV0gPSBjcmVhdGVNZXJnZWRSZXN1bHRGdW5jdGlvbihwcm90b1tuYW1lXSwgcHJv cGVydHkpOworICAgICAgICAgIH0gZWxzZSBpZiAoc3BlY1BvbGljeSA9PT0gJ0RFRklORV9NQU5Z JykgeworICAgICAgICAgICAgcHJvdG9bbmFtZV0gPSBjcmVhdGVDaGFpbmVkRnVuY3Rpb24ocHJv dG9bbmFtZV0sIHByb3BlcnR5KTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAg ICAgICAgcHJvdG9bbmFtZV0gPSBwcm9wZXJ0eTsKKyAgICAgICAgICBpZiAoImRldmVsb3BtZW50 IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAgICAgICAvLyBBZGQgdmVyYm9zZSBkaXNwbGF5 TmFtZSB0byB0aGUgZnVuY3Rpb24sIHdoaWNoIGhlbHBzIHdoZW4gbG9va2luZworICAgICAgICAg ICAgLy8gYXQgcHJvZmlsaW5nIHRvb2xzLgorICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0 eSA9PT0gJ2Z1bmN0aW9uJyAmJiBzcGVjLmRpc3BsYXlOYW1lKSB7CisgICAgICAgICAgICAgIHBy b3RvW25hbWVdLmRpc3BsYXlOYW1lID0gc3BlYy5kaXNwbGF5TmFtZSArICdfJyArIG5hbWU7Cisg ICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9 Cit9CisKK2Z1bmN0aW9uIG1peFN0YXRpY1NwZWNJbnRvQ29tcG9uZW50KENvbnN0cnVjdG9yLCBz dGF0aWNzKSB7CisgIGlmICghc3RhdGljcykgeworICAgIHJldHVybjsKKyAgfQorICBmb3IgKHZh ciBuYW1lIGluIHN0YXRpY3MpIHsKKyAgICB2YXIgcHJvcGVydHkgPSBzdGF0aWNzW25hbWVdOwor ICAgIGlmICghc3RhdGljcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgeworICAgICAgY29udGludWU7 CisgICAgfQorCisgICAgdmFyIGlzUmVzZXJ2ZWQgPSBuYW1lIGluIFJFU0VSVkVEX1NQRUNfS0VZ UzsKKyAgICAhIWlzUmVzZXJ2ZWQgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBp bnZhcmlhbnQoZmFsc2UsICdSZWFjdENsYXNzOiBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gZGVmaW5l IGEgcmVzZXJ2ZWQgcHJvcGVydHksIGAlc2AsIHRoYXQgc2hvdWxkblwndCBiZSBvbiB0aGUgInN0 YXRpY3MiIGtleS4gRGVmaW5lIGl0IGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IGluc3RlYWQ7IGl0 IHdpbGwgc3RpbGwgYmUgYWNjZXNzaWJsZSBvbiB0aGUgY29uc3RydWN0b3IuJywgbmFtZSkgOiBf cHJvZEludmFyaWFudCgnNzgnLCBuYW1lKSA6IHZvaWQgMDsKKworICAgIHZhciBpc0luaGVyaXRl ZCA9IG5hbWUgaW4gQ29uc3RydWN0b3I7CisgICAgISFpc0luaGVyaXRlZCA/ICJkZXZlbG9wbWVu dCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0Q2xhc3M6IFlvdSBh cmUgYXR0ZW1wdGluZyB0byBkZWZpbmUgYCVzYCBvbiB5b3VyIGNvbXBvbmVudCBtb3JlIHRoYW4g b25jZS4gVGhpcyBjb25mbGljdCBtYXkgYmUgZHVlIHRvIGEgbWl4aW4uJywgbmFtZSkgOiBfcHJv ZEludmFyaWFudCgnNzknLCBuYW1lKSA6IHZvaWQgMDsKKyAgICBDb25zdHJ1Y3RvcltuYW1lXSA9 IHByb3BlcnR5OworICB9Cit9CisKKy8qKgorICogTWVyZ2UgdHdvIG9iamVjdHMsIGJ1dCB0aHJv dyBpZiBib3RoIGNvbnRhaW4gdGhlIHNhbWUga2V5LgorICoKKyAqIEBwYXJhbSB7b2JqZWN0fSBv bmUgVGhlIGZpcnN0IG9iamVjdCwgd2hpY2ggaXMgbXV0YXRlZC4KKyAqIEBwYXJhbSB7b2JqZWN0 fSB0d28gVGhlIHNlY29uZCBvYmplY3QKKyAqIEByZXR1cm4ge29iamVjdH0gb25lIGFmdGVyIGl0 IGhhcyBiZWVuIG11dGF0ZWQgdG8gY29udGFpbiBldmVyeXRoaW5nIGluIHR3by4KKyAqLworZnVu Y3Rpb24gbWVyZ2VJbnRvV2l0aE5vRHVwbGljYXRlS2V5cyhvbmUsIHR3bykgeworICAhKG9uZSAm JiB0d28gJiYgdHlwZW9mIG9uZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHR3byA9PT0gJ29iamVj dCcpID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAn bWVyZ2VJbnRvV2l0aE5vRHVwbGljYXRlS2V5cygpOiBDYW5ub3QgbWVyZ2Ugbm9uLW9iamVjdHMu JykgOiBfcHJvZEludmFyaWFudCgnODAnKSA6IHZvaWQgMDsKKworICBmb3IgKHZhciBrZXkgaW4g dHdvKSB7CisgICAgaWYgKHR3by5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAgICAhKG9uZVtr ZXldID09PSB1bmRlZmluZWQpID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52 YXJpYW50KGZhbHNlLCAnbWVyZ2VJbnRvV2l0aE5vRHVwbGljYXRlS2V5cygpOiBUcmllZCB0byBt ZXJnZSB0d28gb2JqZWN0cyB3aXRoIHRoZSBzYW1lIGtleTogYCVzYC4gVGhpcyBjb25mbGljdCBt YXkgYmUgZHVlIHRvIGEgbWl4aW47IGluIHBhcnRpY3VsYXIsIHRoaXMgbWF5IGJlIGNhdXNlZCBi eSB0d28gZ2V0SW5pdGlhbFN0YXRlKCkgb3IgZ2V0RGVmYXVsdFByb3BzKCkgbWV0aG9kcyByZXR1 cm5pbmcgb2JqZWN0cyB3aXRoIGNsYXNoaW5nIGtleXMuJywga2V5KSA6IF9wcm9kSW52YXJpYW50 KCc4MScsIGtleSkgOiB2b2lkIDA7CisgICAgICBvbmVba2V5XSA9IHR3b1trZXldOworICAgIH0K KyAgfQorICByZXR1cm4gb25lOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0 IGludm9rZXMgdHdvIGZ1bmN0aW9ucyBhbmQgbWVyZ2VzIHRoZWlyIHJldHVybiB2YWx1ZXMuCisg KgorICogQHBhcmFtIHtmdW5jdGlvbn0gb25lIEZ1bmN0aW9uIHRvIGludm9rZSBmaXJzdC4KKyAq IEBwYXJhbSB7ZnVuY3Rpb259IHR3byBGdW5jdGlvbiB0byBpbnZva2Ugc2Vjb25kLgorICogQHJl dHVybiB7ZnVuY3Rpb259IEZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0aGUgdHdvIGFyZ3VtZW50IGZ1 bmN0aW9ucy4KKyAqIEBwcml2YXRlCisgKi8KK2Z1bmN0aW9uIGNyZWF0ZU1lcmdlZFJlc3VsdEZ1 bmN0aW9uKG9uZSwgdHdvKSB7CisgIHJldHVybiBmdW5jdGlvbiBtZXJnZWRSZXN1bHQoKSB7Cisg ICAgdmFyIGEgPSBvbmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB2YXIgYiA9IHR3by5h cHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIGlmIChhID09IG51bGwpIHsKKyAgICAgIHJldHVy biBiOworICAgIH0gZWxzZSBpZiAoYiA9PSBudWxsKSB7CisgICAgICByZXR1cm4gYTsKKyAgICB9 CisgICAgdmFyIGMgPSB7fTsKKyAgICBtZXJnZUludG9XaXRoTm9EdXBsaWNhdGVLZXlzKGMsIGEp OworICAgIG1lcmdlSW50b1dpdGhOb0R1cGxpY2F0ZUtleXMoYywgYik7CisgICAgcmV0dXJuIGM7 CisgIH07Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0d28g ZnVuY3Rpb25zIGFuZCBpZ25vcmVzIHRoZWlyIHJldHVybiB2YWxlcy4KKyAqCisgKiBAcGFyYW0g e2Z1bmN0aW9ufSBvbmUgRnVuY3Rpb24gdG8gaW52b2tlIGZpcnN0LgorICogQHBhcmFtIHtmdW5j dGlvbn0gdHdvIEZ1bmN0aW9uIHRvIGludm9rZSBzZWNvbmQuCisgKiBAcmV0dXJuIHtmdW5jdGlv bn0gRnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSB0d28gYXJndW1lbnQgZnVuY3Rpb25zLgorICog QHByaXZhdGUKKyAqLworZnVuY3Rpb24gY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKG9uZSwgdHdvKSB7 CisgIHJldHVybiBmdW5jdGlvbiBjaGFpbmVkRnVuY3Rpb24oKSB7CisgICAgb25lLmFwcGx5KHRo aXMsIGFyZ3VtZW50cyk7CisgICAgdHdvLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgIH07Cit9 CisKKy8qKgorICogQmluZHMgYSBtZXRob2QgdG8gdGhlIGNvbXBvbmVudC4KKyAqCisgKiBAcGFy YW0ge29iamVjdH0gY29tcG9uZW50IENvbXBvbmVudCB3aG9zZSBtZXRob2QgaXMgZ29pbmcgdG8g YmUgYm91bmQuCisgKiBAcGFyYW0ge2Z1bmN0aW9ufSBtZXRob2QgTWV0aG9kIHRvIGJlIGJvdW5k LgorICogQHJldHVybiB7ZnVuY3Rpb259IFRoZSBib3VuZCBtZXRob2QuCisgKi8KK2Z1bmN0aW9u IGJpbmRBdXRvQmluZE1ldGhvZChjb21wb25lbnQsIG1ldGhvZCkgeworICB2YXIgYm91bmRNZXRo b2QgPSBtZXRob2QuYmluZChjb21wb25lbnQpOworICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3By b2R1Y3Rpb24nKSB7CisgICAgYm91bmRNZXRob2QuX19yZWFjdEJvdW5kQ29udGV4dCA9IGNvbXBv bmVudDsKKyAgICBib3VuZE1ldGhvZC5fX3JlYWN0Qm91bmRNZXRob2QgPSBtZXRob2Q7CisgICAg Ym91bmRNZXRob2QuX19yZWFjdEJvdW5kQXJndW1lbnRzID0gbnVsbDsKKyAgICB2YXIgY29tcG9u ZW50TmFtZSA9IGNvbXBvbmVudC5jb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZTsKKyAgICB2YXIgX2Jp bmQgPSBib3VuZE1ldGhvZC5iaW5kOworICAgIGJvdW5kTWV0aG9kLmJpbmQgPSBmdW5jdGlvbiAo bmV3VGhpcykgeworICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3Mg PSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsg X2tleSsrKSB7CisgICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldOworICAg ICAgfQorCisgICAgICAvLyBVc2VyIGlzIHRyeWluZyB0byBiaW5kKCkgYW4gYXV0b2JvdW5kIG1l dGhvZDsgd2UgZWZmZWN0aXZlbHkgd2lsbAorICAgICAgLy8gaWdub3JlIHRoZSB2YWx1ZSBvZiAi dGhpcyIgdGhhdCB0aGUgdXNlciBpcyB0cnlpbmcgdG8gdXNlLCBzbworICAgICAgLy8gbGV0J3Mg d2Fybi4KKyAgICAgIGlmIChuZXdUaGlzICE9PSBjb21wb25lbnQgJiYgbmV3VGhpcyAhPT0gbnVs bCkgeworICAgICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZh bHNlLCAnYmluZCgpOiBSZWFjdCBjb21wb25lbnQgbWV0aG9kcyBtYXkgb25seSBiZSBib3VuZCB0 byB0aGUgJyArICdjb21wb25lbnQgaW5zdGFuY2UuIFNlZSAlcycsIGNvbXBvbmVudE5hbWUpIDog dm9pZCAwOworICAgICAgfSBlbHNlIGlmICghYXJncy5sZW5ndGgpIHsKKyAgICAgICAgImRldmVs b3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2JpbmQoKTogWW91IGFy ZSBiaW5kaW5nIGEgY29tcG9uZW50IG1ldGhvZCB0byB0aGUgY29tcG9uZW50LiAnICsgJ1JlYWN0 IGRvZXMgdGhpcyBmb3IgeW91IGF1dG9tYXRpY2FsbHkgaW4gYSBoaWdoLXBlcmZvcm1hbmNlICcg KyAnd2F5LCBzbyB5b3UgY2FuIHNhZmVseSByZW1vdmUgdGhpcyBjYWxsLiBTZWUgJXMnLCBjb21w b25lbnROYW1lKSA6IHZvaWQgMDsKKyAgICAgICAgcmV0dXJuIGJvdW5kTWV0aG9kOworICAgICAg fQorICAgICAgdmFyIHJlYm91bmRNZXRob2QgPSBfYmluZC5hcHBseShib3VuZE1ldGhvZCwgYXJn dW1lbnRzKTsKKyAgICAgIHJlYm91bmRNZXRob2QuX19yZWFjdEJvdW5kQ29udGV4dCA9IGNvbXBv bmVudDsKKyAgICAgIHJlYm91bmRNZXRob2QuX19yZWFjdEJvdW5kTWV0aG9kID0gbWV0aG9kOwor ICAgICAgcmVib3VuZE1ldGhvZC5fX3JlYWN0Qm91bmRBcmd1bWVudHMgPSBhcmdzOworICAgICAg cmV0dXJuIHJlYm91bmRNZXRob2Q7CisgICAgfTsKKyAgfQorICByZXR1cm4gYm91bmRNZXRob2Q7 Cit9CisKKy8qKgorICogQmluZHMgYWxsIGF1dG8tYm91bmQgbWV0aG9kcyBpbiBhIGNvbXBvbmVu dC4KKyAqCisgKiBAcGFyYW0ge29iamVjdH0gY29tcG9uZW50IENvbXBvbmVudCB3aG9zZSBtZXRo b2QgaXMgZ29pbmcgdG8gYmUgYm91bmQuCisgKi8KK2Z1bmN0aW9uIGJpbmRBdXRvQmluZE1ldGhv ZHMoY29tcG9uZW50KSB7CisgIHZhciBwYWlycyA9IGNvbXBvbmVudC5fX3JlYWN0QXV0b0JpbmRQ YWlyczsKKyAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkgKz0gMikgeworICAg IHZhciBhdXRvQmluZEtleSA9IHBhaXJzW2ldOworICAgIHZhciBtZXRob2QgPSBwYWlyc1tpICsg MV07CisgICAgY29tcG9uZW50W2F1dG9CaW5kS2V5XSA9IGJpbmRBdXRvQmluZE1ldGhvZChjb21w b25lbnQsIG1ldGhvZCk7CisgIH0KK30KKworLyoqCisgKiBBZGQgbW9yZSB0byB0aGUgUmVhY3RD bGFzcyBiYXNlIGNsYXNzLiBUaGVzZSBhcmUgYWxsIGxlZ2FjeSBmZWF0dXJlcyBhbmQKKyAqIHRo ZXJlZm9yZSBub3QgYWxyZWFkeSBwYXJ0IG9mIHRoZSBtb2Rlcm4gUmVhY3RDb21wb25lbnQuCisg Ki8KK3ZhciBSZWFjdENsYXNzTWl4aW4gPSB7CisKKyAgLyoqCisgICAqIFRPRE86IFRoaXMgd2ls bCBiZSBkZXByZWNhdGVkIGJlY2F1c2Ugc3RhdGUgc2hvdWxkIGFsd2F5cyBrZWVwIGEgY29uc2lz dGVudAorICAgKiB0eXBlIHNpZ25hdHVyZSBhbmQgdGhlIG9ubHkgdXNlIGNhc2UgZm9yIHRoaXMs IGlzIHRvIGF2b2lkIHRoYXQuCisgICAqLworICByZXBsYWNlU3RhdGU6IGZ1bmN0aW9uIChuZXdT dGF0ZSwgY2FsbGJhY2spIHsKKyAgICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZVJlcGxhY2VTdGF0ZSh0 aGlzLCBuZXdTdGF0ZSk7CisgICAgaWYgKGNhbGxiYWNrKSB7CisgICAgICB0aGlzLnVwZGF0ZXIu ZW5xdWV1ZUNhbGxiYWNrKHRoaXMsIGNhbGxiYWNrLCAncmVwbGFjZVN0YXRlJyk7CisgICAgfQor ICB9LAorCisgIC8qKgorICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhpcyBjb21wb3NpdGUg Y29tcG9uZW50IGlzIG1vdW50ZWQuCisgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbW91 bnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKiBAcHJvdGVjdGVkCisgICAqIEBmaW5hbAorICAg Ki8KKyAgaXNNb3VudGVkOiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIHRoaXMudXBkYXRlci5p c01vdW50ZWQodGhpcyk7CisgIH0KK307CisKK3ZhciBSZWFjdENsYXNzQ29tcG9uZW50ID0gZnVu Y3Rpb24gKCkge307CitfYXNzaWduKFJlYWN0Q2xhc3NDb21wb25lbnQucHJvdG90eXBlLCBSZWFj dENvbXBvbmVudC5wcm90b3R5cGUsIFJlYWN0Q2xhc3NNaXhpbik7CisKKy8qKgorICogTW9kdWxl IGZvciBjcmVhdGluZyBjb21wb3NpdGUgY29tcG9uZW50cy4KKyAqCisgKiBAY2xhc3MgUmVhY3RD bGFzcworICovCit2YXIgUmVhY3RDbGFzcyA9IHsKKworICAvKioKKyAgICogQ3JlYXRlcyBhIGNv bXBvc2l0ZSBjb21wb25lbnQgY2xhc3MgZ2l2ZW4gYSBjbGFzcyBzcGVjaWZpY2F0aW9uLgorICAg KiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBp Lmh0bWwjcmVhY3QuY3JlYXRlY2xhc3MKKyAgICoKKyAgICogQHBhcmFtIHtvYmplY3R9IHNwZWMg Q2xhc3Mgc3BlY2lmaWNhdGlvbiAod2hpY2ggbXVzdCBkZWZpbmUgYHJlbmRlcmApLgorICAgKiBA cmV0dXJuIHtmdW5jdGlvbn0gQ29tcG9uZW50IGNvbnN0cnVjdG9yIGZ1bmN0aW9uLgorICAgKiBA cHVibGljCisgICAqLworICBjcmVhdGVDbGFzczogZnVuY3Rpb24gKHNwZWMpIHsKKyAgICAvLyBU byBrZWVwIG91ciB3YXJuaW5ncyBtb3JlIHVuZGVyc3RhbmRhYmxlLCB3ZSdsbCB1c2UgYSBsaXR0 bGUgaGFjayBoZXJlIHRvCisgICAgLy8gZW5zdXJlIHRoYXQgQ29uc3RydWN0b3IubmFtZSAhPT0g J0NvbnN0cnVjdG9yJy4gVGhpcyBtYWtlcyBzdXJlIHdlIGRvbid0CisgICAgLy8gdW5uZWNlc3Nh cmlseSBpZGVudGlmeSBhIGNsYXNzIHdpdGhvdXQgZGlzcGxheU5hbWUgYXMgJ0NvbnN0cnVjdG9y Jy4KKyAgICB2YXIgQ29uc3RydWN0b3IgPSBpZGVudGl0eShmdW5jdGlvbiAocHJvcHMsIGNvbnRl eHQsIHVwZGF0ZXIpIHsKKyAgICAgIC8vIFRoaXMgY29uc3RydWN0b3IgZ2V0cyBvdmVycmlkZGVu IGJ5IG1vY2tzLiBUaGUgYXJndW1lbnQgaXMgdXNlZAorICAgICAgLy8gYnkgbW9ja3MgdG8gYXNz ZXJ0IG9uIHdoYXQgZ2V0cyBtb3VudGVkLgorCisgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0g J3Byb2R1Y3Rpb24nKSB7CisgICAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/ IHdhcm5pbmcodGhpcyBpbnN0YW5jZW9mIENvbnN0cnVjdG9yLCAnU29tZXRoaW5nIGlzIGNhbGxp bmcgYSBSZWFjdCBjb21wb25lbnQgZGlyZWN0bHkuIFVzZSBhIGZhY3Rvcnkgb3IgJyArICdKU1gg aW5zdGVhZC4gU2VlOiBodHRwczovL2ZiLm1lL3JlYWN0LWxlZ2FjeWZhY3RvcnknKSA6IHZvaWQg MDsKKyAgICAgIH0KKworICAgICAgLy8gV2lyZSB1cCBhdXRvLWJpbmRpbmcKKyAgICAgIGlmICh0 aGlzLl9fcmVhY3RBdXRvQmluZFBhaXJzLmxlbmd0aCkgeworICAgICAgICBiaW5kQXV0b0JpbmRN ZXRob2RzKHRoaXMpOworICAgICAgfQorCisgICAgICB0aGlzLnByb3BzID0gcHJvcHM7CisgICAg ICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OworICAgICAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7 CisgICAgICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlOwor CisgICAgICB0aGlzLnN0YXRlID0gbnVsbDsKKworICAgICAgLy8gUmVhY3RDbGFzc2VzIGRvZXNu J3QgaGF2ZSBjb25zdHJ1Y3RvcnMuIEluc3RlYWQsIHRoZXkgdXNlIHRoZQorICAgICAgLy8gZ2V0 SW5pdGlhbFN0YXRlIGFuZCBjb21wb25lbnRXaWxsTW91bnQgbWV0aG9kcyBmb3IgaW5pdGlhbGl6 YXRpb24uCisKKyAgICAgIHZhciBpbml0aWFsU3RhdGUgPSB0aGlzLmdldEluaXRpYWxTdGF0ZSA/ IHRoaXMuZ2V0SW5pdGlhbFN0YXRlKCkgOiBudWxsOworICAgICAgaWYgKCJkZXZlbG9wbWVudCIg IT09ICdwcm9kdWN0aW9uJykgeworICAgICAgICAvLyBXZSBhbGxvdyBhdXRvLW1vY2tzIHRvIHBy b2NlZWQgYXMgaWYgdGhleSdyZSByZXR1cm5pbmcgbnVsbC4KKyAgICAgICAgaWYgKGluaXRpYWxT dGF0ZSA9PT0gdW5kZWZpbmVkICYmIHRoaXMuZ2V0SW5pdGlhbFN0YXRlLl9pc01vY2tGdW5jdGlv bikgeworICAgICAgICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgYmFkIHByYWN0aWNlLiBDb25zaWRl ciB3YXJuaW5nIGhlcmUgYW5kCisgICAgICAgICAgLy8gZGVwcmVjYXRpbmcgdGhpcyBjb252ZW5p ZW5jZS4KKyAgICAgICAgICBpbml0aWFsU3RhdGUgPSBudWxsOworICAgICAgICB9CisgICAgICB9 CisgICAgICAhKHR5cGVvZiBpbml0aWFsU3RhdGUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0Fy cmF5KGluaXRpYWxTdGF0ZSkpID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52 YXJpYW50KGZhbHNlLCAnJXMuZ2V0SW5pdGlhbFN0YXRlKCk6IG11c3QgcmV0dXJuIGFuIG9iamVj dCBvciBudWxsJywgQ29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgJ1JlYWN0Q29tcG9zaXRlQ29t cG9uZW50JykgOiBfcHJvZEludmFyaWFudCgnODInLCBDb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8 fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IHZvaWQgMDsKKworICAgICAgdGhpcy5zdGF0 ZSA9IGluaXRpYWxTdGF0ZTsKKyAgICB9KTsKKyAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBu ZXcgUmVhY3RDbGFzc0NvbXBvbmVudCgpOworICAgIENvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25z dHJ1Y3RvciA9IENvbnN0cnVjdG9yOworICAgIENvbnN0cnVjdG9yLnByb3RvdHlwZS5fX3JlYWN0 QXV0b0JpbmRQYWlycyA9IFtdOworCisgICAgaW5qZWN0ZWRNaXhpbnMuZm9yRWFjaChtaXhTcGVj SW50b0NvbXBvbmVudC5iaW5kKG51bGwsIENvbnN0cnVjdG9yKSk7CisKKyAgICBtaXhTcGVjSW50 b0NvbXBvbmVudChDb25zdHJ1Y3Rvciwgc3BlYyk7CisKKyAgICAvLyBJbml0aWFsaXplIHRoZSBk ZWZhdWx0UHJvcHMgcHJvcGVydHkgYWZ0ZXIgYWxsIG1peGlucyBoYXZlIGJlZW4gbWVyZ2VkLgor ICAgIGlmIChDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMpIHsKKyAgICAgIENvbnN0cnVjdG9y LmRlZmF1bHRQcm9wcyA9IENvbnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcygpOworICAgIH0KKwor ICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIC8vIFRoaXMg aXMgYSB0YWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdXNlIG9mIHRoZXNlIG1ldGhvZCBuYW1lcyBp cyBvaywKKyAgICAgIC8vIHNpbmNlIGl0J3MgdXNlZCB3aXRoIGNyZWF0ZUNsYXNzLiBJZiBpdCdz IG5vdCwgdGhlbiBpdCdzIGxpa2VseSBhCisgICAgICAvLyBtaXN0YWtlIHNvIHdlJ2xsIHdhcm4g eW91IHRvIHVzZSB0aGUgc3RhdGljIHByb3BlcnR5LCBwcm9wZXJ0eQorICAgICAgLy8gaW5pdGlh bGl6ZXIgb3IgY29uc3RydWN0b3IgcmVzcGVjdGl2ZWx5LgorICAgICAgaWYgKENvbnN0cnVjdG9y LmdldERlZmF1bHRQcm9wcykgeworICAgICAgICBDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMu aXNSZWFjdENsYXNzQXBwcm92ZWQgPSB7fTsKKyAgICAgIH0KKyAgICAgIGlmIChDb25zdHJ1Y3Rv ci5wcm90b3R5cGUuZ2V0SW5pdGlhbFN0YXRlKSB7CisgICAgICAgIENvbnN0cnVjdG9yLnByb3Rv dHlwZS5nZXRJbml0aWFsU3RhdGUuaXNSZWFjdENsYXNzQXBwcm92ZWQgPSB7fTsKKyAgICAgIH0K KyAgICB9CisKKyAgICAhQ29uc3RydWN0b3IucHJvdG90eXBlLnJlbmRlciA/ICJkZXZlbG9wbWVu dCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2NyZWF0ZUNsYXNzKC4uLik6 IENsYXNzIHNwZWNpZmljYXRpb24gbXVzdCBpbXBsZW1lbnQgYSBgcmVuZGVyYCBtZXRob2QuJykg OiBfcHJvZEludmFyaWFudCgnODMnKSA6IHZvaWQgMDsKKworICAgIGlmICgiZGV2ZWxvcG1lbnQi ICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9u JyA/IHdhcm5pbmcoIUNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb21wb25lbnRTaG91bGRVcGRhdGUs ICclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50U2hvdWxkVXBkYXRlKCkuIERp ZCB5b3UgbWVhbiBzaG91bGRDb21wb25lbnRVcGRhdGUoKT8gJyArICdUaGUgbmFtZSBpcyBwaHJh c2VkIGFzIGEgcXVlc3Rpb24gYmVjYXVzZSB0aGUgZnVuY3Rpb24gaXMgJyArICdleHBlY3RlZCB0 byByZXR1cm4gYSB2YWx1ZS4nLCBzcGVjLmRpc3BsYXlOYW1lIHx8ICdBIGNvbXBvbmVudCcpIDog dm9pZCAwOworICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZygh Q29uc3RydWN0b3IucHJvdG90eXBlLmNvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMsICclcyBoYXMg YSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91 IG1lYW4gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpPycsIHNwZWMuZGlzcGxheU5hbWUgfHwg J0EgY29tcG9uZW50JykgOiB2b2lkIDA7CisgICAgfQorCisgICAgLy8gUmVkdWNlIHRpbWUgc3Bl bnQgZG9pbmcgbG9va3VwcyBieSBzZXR0aW5nIHRoZXNlIG9uIHRoZSBwcm90b3R5cGUuCisgICAg Zm9yICh2YXIgbWV0aG9kTmFtZSBpbiBSZWFjdENsYXNzSW50ZXJmYWNlKSB7CisgICAgICBpZiAo IUNvbnN0cnVjdG9yLnByb3RvdHlwZVttZXRob2ROYW1lXSkgeworICAgICAgICBDb25zdHJ1Y3Rv ci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBudWxsOworICAgICAgfQorICAgIH0KKworICAgIHJl dHVybiBDb25zdHJ1Y3RvcjsKKyAgfSwKKworICBpbmplY3Rpb246IHsKKyAgICBpbmplY3RNaXhp bjogZnVuY3Rpb24gKG1peGluKSB7CisgICAgICBpbmplY3RlZE1peGlucy5wdXNoKG1peGluKTsK KyAgICB9CisgIH0KKworfTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdENsYXNzOworfSx7IjEx IjoxMSwiMTYiOjE2LCIyMSI6MjEsIjIyIjoyMiwiMzgiOjM4LCI0NSI6NDUsIjQ2Ijo0NiwiNDgi OjQ4LCI0OSI6NDl9XSwxMTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioK KyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRz IHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhl IEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSBy b290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50Cisg KiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRo ZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX3Byb2RJ bnZhcmlhbnQgPSBfZGVyZXFfKDM4KTsKKwordmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0gX2Rl cmVxXygyMSk7CisKK3ZhciBjYW5EZWZpbmVQcm9wZXJ0eSA9IF9kZXJlcV8oMzMpOwordmFyIGVt cHR5T2JqZWN0ID0gX2RlcmVxXyg0NSk7Cit2YXIgaW52YXJpYW50ID0gX2RlcmVxXyg0Nik7Cit2 YXIgd2FybmluZyA9IF9kZXJlcV8oNDgpOworCisvKioKKyAqIEJhc2UgY2xhc3MgaGVscGVycyBm b3IgdGhlIHVwZGF0aW5nIHN0YXRlIG9mIGEgY29tcG9uZW50LgorICovCitmdW5jdGlvbiBSZWFj dENvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikgeworICB0aGlzLnByb3BzID0gcHJv cHM7CisgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisgIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0 OworICAvLyBXZSBpbml0aWFsaXplIHRoZSBkZWZhdWx0IHVwZGF0ZXIgYnV0IHRoZSByZWFsIG9u ZSBnZXRzIGluamVjdGVkIGJ5IHRoZQorICAvLyByZW5kZXJlci4KKyAgdGhpcy51cGRhdGVyID0g dXBkYXRlciB8fCBSZWFjdE5vb3BVcGRhdGVRdWV1ZTsKK30KKworUmVhY3RDb21wb25lbnQucHJv dG90eXBlLmlzUmVhY3RDb21wb25lbnQgPSB7fTsKKworLyoqCisgKiBTZXRzIGEgc3Vic2V0IG9m IHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIHRvIG11dGF0ZQorICogc3RhdGUuIFlvdSBzaG91 bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS4KKyAqCisgKiBUaGVyZSBpcyBubyBn dWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBz bworICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1h eSByZXR1cm4gdGhlIG9sZCB2YWx1ZS4KKyAqCisgKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhh dCBjYWxscyB0byBgc2V0U3RhdGVgIHdpbGwgcnVuIHN5bmNocm9ub3VzbHksCisgKiBhcyB0aGV5 IG1heSBldmVudHVhbGx5IGJlIGJhdGNoZWQgdG9nZXRoZXIuICBZb3UgY2FuIHByb3ZpZGUgYW4g b3B0aW9uYWwKKyAqIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBjYWxs IHRvIHNldFN0YXRlIGlzIGFjdHVhbGx5CisgKiBjb21wbGV0ZWQuCisgKgorICogV2hlbiBhIGZ1 bmN0aW9uIGlzIHByb3ZpZGVkIHRvIHNldFN0YXRlLCBpdCB3aWxsIGJlIGNhbGxlZCBhdCBzb21l IHBvaW50IGluCisgKiB0aGUgZnV0dXJlIChub3Qgc3luY2hyb25vdXNseSkuIEl0IHdpbGwgYmUg Y2FsbGVkIHdpdGggdGhlIHVwIHRvIGRhdGUKKyAqIGNvbXBvbmVudCBhcmd1bWVudHMgKHN0YXRl LCBwcm9wcywgY29udGV4dCkuIFRoZXNlIHZhbHVlcyBjYW4gYmUgZGlmZmVyZW50CisgKiBmcm9t IHRoaXMuKiBiZWNhdXNlIHlvdXIgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBhZnRlciByZWNlaXZl UHJvcHMgYnV0IGJlZm9yZQorICogc2hvdWxkQ29tcG9uZW50VXBkYXRlLCBhbmQgdGhpcyBuZXcg c3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCB3aWxsIG5vdCB5ZXQgYmUKKyAqIGFzc2lnbmVkIHRv IHRoaXMuCisgKgorICogQHBhcmFtIHtvYmplY3R8ZnVuY3Rpb259IHBhcnRpYWxTdGF0ZSBOZXh0 IHBhcnRpYWwgc3RhdGUgb3IgZnVuY3Rpb24gdG8KKyAqICAgICAgICBwcm9kdWNlIG5leHQgcGFy dGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBjdXJyZW50IHN0YXRlLgorICogQHBhcmFtIHs/ ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBzdGF0ZSBpcyB1cGRhdGVkLgorICogQGZp bmFsCisgKiBAcHJvdGVjdGVkCisgKi8KK1JlYWN0Q29tcG9uZW50LnByb3RvdHlwZS5zZXRTdGF0 ZSA9IGZ1bmN0aW9uIChwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrKSB7CisgICEodHlwZW9mIHBhcnRp YWxTdGF0ZSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHBhcnRpYWxTdGF0ZSA9PT0gJ2Z1bmN0aW9u JyB8fCBwYXJ0aWFsU3RhdGUgPT0gbnVsbCkgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlv bicgPyBpbnZhcmlhbnQoZmFsc2UsICdzZXRTdGF0ZSguLi4pOiB0YWtlcyBhbiBvYmplY3Qgb2Yg c3RhdGUgdmFyaWFibGVzIHRvIHVwZGF0ZSBvciBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYW4g b2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcy4nKSA6IF9wcm9kSW52YXJpYW50KCc4NScpIDogdm9p ZCAwOworICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKHRoaXMsIHBhcnRpYWxTdGF0ZSk7 CisgIGlmIChjYWxsYmFjaykgeworICAgIHRoaXMudXBkYXRlci5lbnF1ZXVlQ2FsbGJhY2sodGhp cywgY2FsbGJhY2ssICdzZXRTdGF0ZScpOworICB9Cit9OworCisvKioKKyAqIEZvcmNlcyBhbiB1 cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGgK KyAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLgor ICoKKyAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUg ZGVlcGVyIGFzcGVjdCBvZiB0aGUKKyAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1 dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLgorICoKKyAqIFRoaXMgd2lsbCBub3QgaW52b2tl IGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2UKKyAqIGBjb21wb25l bnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuCisgKgorICogQHBhcmFtIHs/ ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciB1cGRhdGUgaXMgY29tcGxldGUuCisgKiBA ZmluYWwKKyAqIEBwcm90ZWN0ZWQKKyAqLworUmVhY3RDb21wb25lbnQucHJvdG90eXBlLmZvcmNl VXBkYXRlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CisgIHRoaXMudXBkYXRlci5lbnF1ZXVlRm9y Y2VVcGRhdGUodGhpcyk7CisgIGlmIChjYWxsYmFjaykgeworICAgIHRoaXMudXBkYXRlci5lbnF1 ZXVlQ2FsbGJhY2sodGhpcywgY2FsbGJhY2ssICdmb3JjZVVwZGF0ZScpOworICB9Cit9OworCisv KioKKyAqIERlcHJlY2F0ZWQgQVBJcy4gVGhlc2UgQVBJcyB1c2VkIHRvIGV4aXN0IG9uIGNsYXNz aWMgUmVhY3QgY2xhc3NlcyBidXQgc2luY2UKKyAqIHdlIHdvdWxkIGxpa2UgdG8gZGVwcmVjYXRl IHRoZW0sIHdlJ3JlIG5vdCBnb2luZyB0byBtb3ZlIHRoZW0gb3ZlciB0byB0aGlzCisgKiBtb2Rl cm4gYmFzZSBjbGFzcy4gSW5zdGVhZCwgd2UgZGVmaW5lIGEgZ2V0dGVyIHRoYXQgd2FybnMgaWYg aXQncyBhY2Nlc3NlZC4KKyAqLworaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykg eworICB2YXIgZGVwcmVjYXRlZEFQSXMgPSB7CisgICAgaXNNb3VudGVkOiBbJ2lzTW91bnRlZCcs ICdJbnN0ZWFkLCBtYWtlIHN1cmUgdG8gY2xlYW4gdXAgc3Vic2NyaXB0aW9ucyBhbmQgcGVuZGlu ZyByZXF1ZXN0cyBpbiAnICsgJ2NvbXBvbmVudFdpbGxVbm1vdW50IHRvIHByZXZlbnQgbWVtb3J5 IGxlYWtzLiddLAorICAgIHJlcGxhY2VTdGF0ZTogWydyZXBsYWNlU3RhdGUnLCAnUmVmYWN0b3Ig eW91ciBjb2RlIHRvIHVzZSBzZXRTdGF0ZSBpbnN0ZWFkIChzZWUgJyArICdodHRwczovL2dpdGh1 Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzMyMzYpLiddCisgIH07CisgIHZhciBkZWZpbmVE ZXByZWNhdGlvbldhcm5pbmcgPSBmdW5jdGlvbiAobWV0aG9kTmFtZSwgaW5mbykgeworICAgIGlm IChjYW5EZWZpbmVQcm9wZXJ0eSkgeworICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWN0 Q29tcG9uZW50LnByb3RvdHlwZSwgbWV0aG9kTmFtZSwgeworICAgICAgICBnZXQ6IGZ1bmN0aW9u ICgpIHsKKyAgICAgICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5n KGZhbHNlLCAnJXMoLi4uKSBpcyBkZXByZWNhdGVkIGluIHBsYWluIEphdmFTY3JpcHQgUmVhY3Qg Y2xhc3Nlcy4gJXMnLCBpbmZvWzBdLCBpbmZvWzFdKSA6IHZvaWQgMDsKKyAgICAgICAgICByZXR1 cm4gdW5kZWZpbmVkOworICAgICAgICB9CisgICAgICB9KTsKKyAgICB9CisgIH07CisgIGZvciAo dmFyIGZuTmFtZSBpbiBkZXByZWNhdGVkQVBJcykgeworICAgIGlmIChkZXByZWNhdGVkQVBJcy5o YXNPd25Qcm9wZXJ0eShmbk5hbWUpKSB7CisgICAgICBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmco Zm5OYW1lLCBkZXByZWNhdGVkQVBJc1tmbk5hbWVdKTsKKyAgICB9CisgIH0KK30KKworbW9kdWxl LmV4cG9ydHMgPSBSZWFjdENvbXBvbmVudDsKK30seyIyMSI6MjEsIjMzIjozMywiMzgiOjM4LCI0 NSI6NDUsIjQ2Ijo0NiwiNDgiOjQ4fV0sMTI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9y dHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxNi1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICog QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2Vk IHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmls ZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25h bCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMg ZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogCisgKi8KKworJ3VzZSBzdHJpY3Qn OworCit2YXIgX3Byb2RJbnZhcmlhbnQgPSBfZGVyZXFfKDM4KTsKKwordmFyIFJlYWN0Q3VycmVu dE93bmVyID0gX2RlcmVxXygxNCk7CisKK3ZhciBpbnZhcmlhbnQgPSBfZGVyZXFfKDQ2KTsKK3Zh ciB3YXJuaW5nID0gX2RlcmVxXyg0OCk7CisKK2Z1bmN0aW9uIGlzTmF0aXZlKGZuKSB7CisgIC8v IEJhc2VkIG9uIGlzTmF0aXZlKCkgZnJvbSBMb2Rhc2gKKyAgdmFyIGZ1bmNUb1N0cmluZyA9IEZ1 bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZzsKKyAgdmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0 LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKKyAgdmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14n ICsgZnVuY1RvU3RyaW5nCisgIC8vIFRha2UgYW4gZXhhbXBsZSBuYXRpdmUgZnVuY3Rpb24gc291 cmNlIGZvciBjb21wYXJpc29uCisgIC5jYWxsKGhhc093blByb3BlcnR5KQorICAvLyBTdHJpcCBy ZWdleCBjaGFyYWN0ZXJzIHNvIHdlIGNhbiB1c2UgaXQgZm9yIHJlZ2V4CisgIC5yZXBsYWNlKC9b XFxeJC4qKz8oKVtcXXt9fF0vZywgJ1xcJCYnKQorICAvLyBSZW1vdmUgaGFzT3duUHJvcGVydHkg ZnJvbSB0aGUgdGVtcGxhdGUgdG8gbWFrZSBpdCBnZW5lcmljCisgIC5yZXBsYWNlKC9oYXNPd25Q cm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCAnJDEuKj8n KSArICckJyk7CisgIHRyeSB7CisgICAgdmFyIHNvdXJjZSA9IGZ1bmNUb1N0cmluZy5jYWxsKGZu KTsKKyAgICByZXR1cm4gcmVJc05hdGl2ZS50ZXN0KHNvdXJjZSk7CisgIH0gY2F0Y2ggKGVycikg eworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCit2YXIgY2FuVXNlQ29sbGVjdGlvbnMgPQor Ly8gQXJyYXkuZnJvbQordHlwZW9mIEFycmF5LmZyb20gPT09ICdmdW5jdGlvbicgJiYKKy8vIE1h cAordHlwZW9mIE1hcCA9PT0gJ2Z1bmN0aW9uJyAmJiBpc05hdGl2ZShNYXApICYmCisvLyBNYXAu cHJvdG90eXBlLmtleXMKK01hcC5wcm90b3R5cGUgIT0gbnVsbCAmJiB0eXBlb2YgTWFwLnByb3Rv dHlwZS5rZXlzID09PSAnZnVuY3Rpb24nICYmIGlzTmF0aXZlKE1hcC5wcm90b3R5cGUua2V5cykg JiYKKy8vIFNldAordHlwZW9mIFNldCA9PT0gJ2Z1bmN0aW9uJyAmJiBpc05hdGl2ZShTZXQpICYm CisvLyBTZXQucHJvdG90eXBlLmtleXMKK1NldC5wcm90b3R5cGUgIT0gbnVsbCAmJiB0eXBlb2Yg U2V0LnByb3RvdHlwZS5rZXlzID09PSAnZnVuY3Rpb24nICYmIGlzTmF0aXZlKFNldC5wcm90b3R5 cGUua2V5cyk7CisKK3ZhciBzZXRJdGVtOwordmFyIGdldEl0ZW07Cit2YXIgcmVtb3ZlSXRlbTsK K3ZhciBnZXRJdGVtSURzOwordmFyIGFkZFJvb3Q7Cit2YXIgcmVtb3ZlUm9vdDsKK3ZhciBnZXRS b290SURzOworCitpZiAoY2FuVXNlQ29sbGVjdGlvbnMpIHsKKyAgdmFyIGl0ZW1NYXAgPSBuZXcg TWFwKCk7CisgIHZhciByb290SURTZXQgPSBuZXcgU2V0KCk7CisKKyAgc2V0SXRlbSA9IGZ1bmN0 aW9uIChpZCwgaXRlbSkgeworICAgIGl0ZW1NYXAuc2V0KGlkLCBpdGVtKTsKKyAgfTsKKyAgZ2V0 SXRlbSA9IGZ1bmN0aW9uIChpZCkgeworICAgIHJldHVybiBpdGVtTWFwLmdldChpZCk7CisgIH07 CisgIHJlbW92ZUl0ZW0gPSBmdW5jdGlvbiAoaWQpIHsKKyAgICBpdGVtTWFwWydkZWxldGUnXShp ZCk7CisgIH07CisgIGdldEl0ZW1JRHMgPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIEFycmF5 LmZyb20oaXRlbU1hcC5rZXlzKCkpOworICB9OworCisgIGFkZFJvb3QgPSBmdW5jdGlvbiAoaWQp IHsKKyAgICByb290SURTZXQuYWRkKGlkKTsKKyAgfTsKKyAgcmVtb3ZlUm9vdCA9IGZ1bmN0aW9u IChpZCkgeworICAgIHJvb3RJRFNldFsnZGVsZXRlJ10oaWQpOworICB9OworICBnZXRSb290SURz ID0gZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBBcnJheS5mcm9tKHJvb3RJRFNldC5rZXlzKCkp OworICB9OworfSBlbHNlIHsKKyAgdmFyIGl0ZW1CeUtleSA9IHt9OworICB2YXIgcm9vdEJ5S2V5 ID0ge307CisKKyAgLy8gVXNlIG5vbi1udW1lcmljIGtleXMgdG8gcHJldmVudCBWOCBwZXJmb3Jt YW5jZSBpc3N1ZXM6CisgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxs LzcyMzIKKyAgdmFyIGdldEtleUZyb21JRCA9IGZ1bmN0aW9uIChpZCkgeworICAgIHJldHVybiAn LicgKyBpZDsKKyAgfTsKKyAgdmFyIGdldElERnJvbUtleSA9IGZ1bmN0aW9uIChrZXkpIHsKKyAg ICByZXR1cm4gcGFyc2VJbnQoa2V5LnN1YnN0cigxKSwgMTApOworICB9OworCisgIHNldEl0ZW0g PSBmdW5jdGlvbiAoaWQsIGl0ZW0pIHsKKyAgICB2YXIga2V5ID0gZ2V0S2V5RnJvbUlEKGlkKTsK KyAgICBpdGVtQnlLZXlba2V5XSA9IGl0ZW07CisgIH07CisgIGdldEl0ZW0gPSBmdW5jdGlvbiAo aWQpIHsKKyAgICB2YXIga2V5ID0gZ2V0S2V5RnJvbUlEKGlkKTsKKyAgICByZXR1cm4gaXRlbUJ5 S2V5W2tleV07CisgIH07CisgIHJlbW92ZUl0ZW0gPSBmdW5jdGlvbiAoaWQpIHsKKyAgICB2YXIg a2V5ID0gZ2V0S2V5RnJvbUlEKGlkKTsKKyAgICBkZWxldGUgaXRlbUJ5S2V5W2tleV07CisgIH07 CisgIGdldEl0ZW1JRHMgPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIE9iamVjdC5rZXlzKGl0 ZW1CeUtleSkubWFwKGdldElERnJvbUtleSk7CisgIH07CisKKyAgYWRkUm9vdCA9IGZ1bmN0aW9u IChpZCkgeworICAgIHZhciBrZXkgPSBnZXRLZXlGcm9tSUQoaWQpOworICAgIHJvb3RCeUtleVtr ZXldID0gdHJ1ZTsKKyAgfTsKKyAgcmVtb3ZlUm9vdCA9IGZ1bmN0aW9uIChpZCkgeworICAgIHZh ciBrZXkgPSBnZXRLZXlGcm9tSUQoaWQpOworICAgIGRlbGV0ZSByb290QnlLZXlba2V5XTsKKyAg fTsKKyAgZ2V0Um9vdElEcyA9IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gT2JqZWN0LmtleXMo cm9vdEJ5S2V5KS5tYXAoZ2V0SURGcm9tS2V5KTsKKyAgfTsKK30KKwordmFyIHVubW91bnRlZElE cyA9IFtdOworCitmdW5jdGlvbiBwdXJnZURlZXAoaWQpIHsKKyAgdmFyIGl0ZW0gPSBnZXRJdGVt KGlkKTsKKyAgaWYgKGl0ZW0pIHsKKyAgICB2YXIgY2hpbGRJRHMgPSBpdGVtLmNoaWxkSURzOwor CisgICAgcmVtb3ZlSXRlbShpZCk7CisgICAgY2hpbGRJRHMuZm9yRWFjaChwdXJnZURlZXApOwor ICB9Cit9CisKK2Z1bmN0aW9uIGRlc2NyaWJlQ29tcG9uZW50RnJhbWUobmFtZSwgc291cmNlLCBv d25lck5hbWUpIHsKKyAgcmV0dXJuICdcbiAgICBpbiAnICsgKG5hbWUgfHwgJ1Vua25vd24nKSAr IChzb3VyY2UgPyAnIChhdCAnICsgc291cmNlLmZpbGVOYW1lLnJlcGxhY2UoL14uKltcXFwvXS8s ICcnKSArICc6JyArIHNvdXJjZS5saW5lTnVtYmVyICsgJyknIDogb3duZXJOYW1lID8gJyAoY3Jl YXRlZCBieSAnICsgb3duZXJOYW1lICsgJyknIDogJycpOworfQorCitmdW5jdGlvbiBnZXREaXNw bGF5TmFtZShlbGVtZW50KSB7CisgIGlmIChlbGVtZW50ID09IG51bGwpIHsKKyAgICByZXR1cm4g JyNlbXB0eSc7CisgIH0gZWxzZSBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnIHx8IHR5 cGVvZiBlbGVtZW50ID09PSAnbnVtYmVyJykgeworICAgIHJldHVybiAnI3RleHQnOworICB9IGVs c2UgaWYgKHR5cGVvZiBlbGVtZW50LnR5cGUgPT09ICdzdHJpbmcnKSB7CisgICAgcmV0dXJuIGVs ZW1lbnQudHlwZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZWxlbWVudC50eXBlLmRpc3BsYXlO YW1lIHx8IGVsZW1lbnQudHlwZS5uYW1lIHx8ICdVbmtub3duJzsKKyAgfQorfQorCitmdW5jdGlv biBkZXNjcmliZUlEKGlkKSB7CisgIHZhciBuYW1lID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5n ZXREaXNwbGF5TmFtZShpZCk7CisgIHZhciBlbGVtZW50ID0gUmVhY3RDb21wb25lbnRUcmVlSG9v ay5nZXRFbGVtZW50KGlkKTsKKyAgdmFyIG93bmVySUQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29r LmdldE93bmVySUQoaWQpOworICB2YXIgb3duZXJOYW1lOworICBpZiAob3duZXJJRCkgeworICAg IG93bmVyTmFtZSA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0RGlzcGxheU5hbWUob3duZXJJ RCk7CisgIH0KKyAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhlbGVt ZW50LCAnUmVhY3RDb21wb25lbnRUcmVlSG9vazogTWlzc2luZyBSZWFjdCBlbGVtZW50IGZvciBk ZWJ1Z0lEICVzIHdoZW4gJyArICdidWlsZGluZyBzdGFjaycsIGlkKSA6IHZvaWQgMDsKKyAgcmV0 dXJuIGRlc2NyaWJlQ29tcG9uZW50RnJhbWUobmFtZSwgZWxlbWVudCAmJiBlbGVtZW50Ll9zb3Vy Y2UsIG93bmVyTmFtZSk7Cit9CisKK3ZhciBSZWFjdENvbXBvbmVudFRyZWVIb29rID0geworICBv blNldENoaWxkcmVuOiBmdW5jdGlvbiAoaWQsIG5leHRDaGlsZElEcykgeworICAgIHZhciBpdGVt ID0gZ2V0SXRlbShpZCk7CisgICAgIWl0ZW0gPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlv bicgPyBpbnZhcmlhbnQoZmFsc2UsICdJdGVtIG11c3QgaGF2ZSBiZWVuIHNldCcpIDogX3Byb2RJ bnZhcmlhbnQoJzE0NCcpIDogdm9pZCAwOworICAgIGl0ZW0uY2hpbGRJRHMgPSBuZXh0Q2hpbGRJ RHM7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5leHRDaGlsZElEcy5sZW5ndGg7IGkrKykg eworICAgICAgdmFyIG5leHRDaGlsZElEID0gbmV4dENoaWxkSURzW2ldOworICAgICAgdmFyIG5l eHRDaGlsZCA9IGdldEl0ZW0obmV4dENoaWxkSUQpOworICAgICAgIW5leHRDaGlsZCA/ICJkZXZl bG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V4cGVjdGVkIGhv b2sgZXZlbnRzIHRvIGZpcmUgZm9yIHRoZSBjaGlsZCBiZWZvcmUgaXRzIHBhcmVudCBpbmNsdWRl cyBpdCBpbiBvblNldENoaWxkcmVuKCkuJykgOiBfcHJvZEludmFyaWFudCgnMTQwJykgOiB2b2lk IDA7CisgICAgICAhKG5leHRDaGlsZC5jaGlsZElEcyAhPSBudWxsIHx8IHR5cGVvZiBuZXh0Q2hp bGQuZWxlbWVudCAhPT0gJ29iamVjdCcgfHwgbmV4dENoaWxkLmVsZW1lbnQgPT0gbnVsbCkgPyAi ZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3Rl ZCBvblNldENoaWxkcmVuKCkgdG8gZmlyZSBmb3IgYSBjb250YWluZXIgY2hpbGQgYmVmb3JlIGl0 cyBwYXJlbnQgaW5jbHVkZXMgaXQgaW4gb25TZXRDaGlsZHJlbigpLicpIDogX3Byb2RJbnZhcmlh bnQoJzE0MScpIDogdm9pZCAwOworICAgICAgIW5leHRDaGlsZC5pc01vdW50ZWQgPyAiZGV2ZWxv cG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCBvbk1v dW50Q29tcG9uZW50KCkgdG8gZmlyZSBmb3IgdGhlIGNoaWxkIGJlZm9yZSBpdHMgcGFyZW50IGlu Y2x1ZGVzIGl0IGluIG9uU2V0Q2hpbGRyZW4oKS4nKSA6IF9wcm9kSW52YXJpYW50KCc3MScpIDog dm9pZCAwOworICAgICAgaWYgKG5leHRDaGlsZC5wYXJlbnRJRCA9PSBudWxsKSB7CisgICAgICAg IG5leHRDaGlsZC5wYXJlbnRJRCA9IGlkOworICAgICAgICAvLyBUT0RPOiBUaGlzIHNob3VsZG4n dCBiZSBuZWNlc3NhcnkgYnV0IG1vdW50aW5nIGEgbmV3IHJvb3QgZHVyaW5nIGluCisgICAgICAg IC8vIGNvbXBvbmVudFdpbGxNb3VudCBjdXJyZW50bHkgY2F1c2VzIG5vdC15ZXQtbW91bnRlZCBj b21wb25lbnRzIHRvCisgICAgICAgIC8vIGJlIHB1cmdlZCBmcm9tIG91ciB0cmVlIGRhdGEgc28g dGhlaXIgcGFyZW50IGlkIGlzIG1pc3NpbmcuCisgICAgICB9CisgICAgICAhKG5leHRDaGlsZC5w YXJlbnRJRCA9PT0gaWQpID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJp YW50KGZhbHNlLCAnRXhwZWN0ZWQgb25CZWZvcmVNb3VudENvbXBvbmVudCgpIHBhcmVudCBhbmQg b25TZXRDaGlsZHJlbigpIHRvIGJlIGNvbnNpc3RlbnQgKCVzIGhhcyBwYXJlbnRzICVzIGFuZCAl cykuJywgbmV4dENoaWxkSUQsIG5leHRDaGlsZC5wYXJlbnRJRCwgaWQpIDogX3Byb2RJbnZhcmlh bnQoJzE0MicsIG5leHRDaGlsZElELCBuZXh0Q2hpbGQucGFyZW50SUQsIGlkKSA6IHZvaWQgMDsK KyAgICB9CisgIH0sCisgIG9uQmVmb3JlTW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChpZCwgZWxl bWVudCwgcGFyZW50SUQpIHsKKyAgICB2YXIgaXRlbSA9IHsKKyAgICAgIGVsZW1lbnQ6IGVsZW1l bnQsCisgICAgICBwYXJlbnRJRDogcGFyZW50SUQsCisgICAgICB0ZXh0OiBudWxsLAorICAgICAg Y2hpbGRJRHM6IFtdLAorICAgICAgaXNNb3VudGVkOiBmYWxzZSwKKyAgICAgIHVwZGF0ZUNvdW50 OiAwCisgICAgfTsKKyAgICBzZXRJdGVtKGlkLCBpdGVtKTsKKyAgfSwKKyAgb25CZWZvcmVVcGRh dGVDb21wb25lbnQ6IGZ1bmN0aW9uIChpZCwgZWxlbWVudCkgeworICAgIHZhciBpdGVtID0gZ2V0 SXRlbShpZCk7CisgICAgaWYgKCFpdGVtIHx8ICFpdGVtLmlzTW91bnRlZCkgeworICAgICAgLy8g V2UgbWF5IGVuZCB1cCBoZXJlIGFzIGEgcmVzdWx0IG9mIHNldFN0YXRlKCkgaW4gY29tcG9uZW50 V2lsbFVubW91bnQoKS4KKyAgICAgIC8vIEluIHRoaXMgY2FzZSwgaWdub3JlIHRoZSBlbGVtZW50 LgorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpdGVtLmVsZW1lbnQgPSBlbGVtZW50OworICB9 LAorICBvbk1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoaWQpIHsKKyAgICB2YXIgaXRlbSA9IGdl dEl0ZW0oaWQpOworICAgICFpdGVtID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8g aW52YXJpYW50KGZhbHNlLCAnSXRlbSBtdXN0IGhhdmUgYmVlbiBzZXQnKSA6IF9wcm9kSW52YXJp YW50KCcxNDQnKSA6IHZvaWQgMDsKKyAgICBpdGVtLmlzTW91bnRlZCA9IHRydWU7CisgICAgdmFy IGlzUm9vdCA9IGl0ZW0ucGFyZW50SUQgPT09IDA7CisgICAgaWYgKGlzUm9vdCkgeworICAgICAg YWRkUm9vdChpZCk7CisgICAgfQorICB9LAorICBvblVwZGF0ZUNvbXBvbmVudDogZnVuY3Rpb24g KGlkKSB7CisgICAgdmFyIGl0ZW0gPSBnZXRJdGVtKGlkKTsKKyAgICBpZiAoIWl0ZW0gfHwgIWl0 ZW0uaXNNb3VudGVkKSB7CisgICAgICAvLyBXZSBtYXkgZW5kIHVwIGhlcmUgYXMgYSByZXN1bHQg b2Ygc2V0U3RhdGUoKSBpbiBjb21wb25lbnRXaWxsVW5tb3VudCgpLgorICAgICAgLy8gSW4gdGhp cyBjYXNlLCBpZ25vcmUgdGhlIGVsZW1lbnQuCisgICAgICByZXR1cm47CisgICAgfQorICAgIGl0 ZW0udXBkYXRlQ291bnQrKzsKKyAgfSwKKyAgb25Vbm1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAo aWQpIHsKKyAgICB2YXIgaXRlbSA9IGdldEl0ZW0oaWQpOworICAgIGlmIChpdGVtKSB7CisgICAg ICAvLyBXZSBuZWVkIHRvIGNoZWNrIGlmIGl0IGV4aXN0cy4KKyAgICAgIC8vIGBpdGVtYCBtaWdo dCBub3QgZXhpc3QgaWYgaXQgaXMgaW5zaWRlIGFuIGVycm9yIGJvdW5kYXJ5LCBhbmQgYSBzaWJs aW5nCisgICAgICAvLyBlcnJvciBib3VuZGFyeSBjaGlsZCB0aHJldyB3aGlsZSBtb3VudGluZy4g VGhlbiB0aGlzIGluc3RhbmNlIG5ldmVyCisgICAgICAvLyBnb3QgYSBjaGFuY2UgdG8gbW91bnQs IGJ1dCBpdCBzdGlsbCBnZXRzIGFuIHVubW91bnRpbmcgZXZlbnQgZHVyaW5nCisgICAgICAvLyB0 aGUgZXJyb3IgYm91bmRhcnkgY2xlYW51cC4KKyAgICAgIGl0ZW0uaXNNb3VudGVkID0gZmFsc2U7 CisgICAgICB2YXIgaXNSb290ID0gaXRlbS5wYXJlbnRJRCA9PT0gMDsKKyAgICAgIGlmIChpc1Jv b3QpIHsKKyAgICAgICAgcmVtb3ZlUm9vdChpZCk7CisgICAgICB9CisgICAgfQorICAgIHVubW91 bnRlZElEcy5wdXNoKGlkKTsKKyAgfSwKKyAgcHVyZ2VVbm1vdW50ZWRDb21wb25lbnRzOiBmdW5j dGlvbiAoKSB7CisgICAgaWYgKFJlYWN0Q29tcG9uZW50VHJlZUhvb2suX3ByZXZlbnRQdXJnaW5n KSB7CisgICAgICAvLyBTaG91bGQgb25seSBiZSB1c2VkIGZvciB0ZXN0aW5nLgorICAgICAgcmV0 dXJuOworICAgIH0KKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdW5tb3VudGVkSURzLmxlbmd0 aDsgaSsrKSB7CisgICAgICB2YXIgaWQgPSB1bm1vdW50ZWRJRHNbaV07CisgICAgICBwdXJnZURl ZXAoaWQpOworICAgIH0KKyAgICB1bm1vdW50ZWRJRHMubGVuZ3RoID0gMDsKKyAgfSwKKyAgaXNN b3VudGVkOiBmdW5jdGlvbiAoaWQpIHsKKyAgICB2YXIgaXRlbSA9IGdldEl0ZW0oaWQpOworICAg IHJldHVybiBpdGVtID8gaXRlbS5pc01vdW50ZWQgOiBmYWxzZTsKKyAgfSwKKyAgZ2V0Q3VycmVu dFN0YWNrQWRkZW5kdW06IGZ1bmN0aW9uICh0b3BFbGVtZW50KSB7CisgICAgdmFyIGluZm8gPSAn JzsKKyAgICBpZiAodG9wRWxlbWVudCkgeworICAgICAgdmFyIG5hbWUgPSBnZXREaXNwbGF5TmFt ZSh0b3BFbGVtZW50KTsKKyAgICAgIHZhciBvd25lciA9IHRvcEVsZW1lbnQuX293bmVyOworICAg ICAgaW5mbyArPSBkZXNjcmliZUNvbXBvbmVudEZyYW1lKG5hbWUsIHRvcEVsZW1lbnQuX3NvdXJj ZSwgb3duZXIgJiYgb3duZXIuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICB2YXIgY3VycmVudE93 bmVyID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudDsKKyAgICB2YXIgaWQgPSBjdXJyZW50T3du ZXIgJiYgY3VycmVudE93bmVyLl9kZWJ1Z0lEOworCisgICAgaW5mbyArPSBSZWFjdENvbXBvbmVu dFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKGlkKTsKKyAgICByZXR1cm4gaW5mbzsKKyAg fSwKKyAgZ2V0U3RhY2tBZGRlbmR1bUJ5SUQ6IGZ1bmN0aW9uIChpZCkgeworICAgIHZhciBpbmZv ID0gJyc7CisgICAgd2hpbGUgKGlkKSB7CisgICAgICBpbmZvICs9IGRlc2NyaWJlSUQoaWQpOwor ICAgICAgaWQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFBhcmVudElEKGlkKTsKKyAgICB9 CisgICAgcmV0dXJuIGluZm87CisgIH0sCisgIGdldENoaWxkSURzOiBmdW5jdGlvbiAoaWQpIHsK KyAgICB2YXIgaXRlbSA9IGdldEl0ZW0oaWQpOworICAgIHJldHVybiBpdGVtID8gaXRlbS5jaGls ZElEcyA6IFtdOworICB9LAorICBnZXREaXNwbGF5TmFtZTogZnVuY3Rpb24gKGlkKSB7CisgICAg dmFyIGVsZW1lbnQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldEVsZW1lbnQoaWQpOworICAg IGlmICghZWxlbWVudCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIHJldHVybiBn ZXREaXNwbGF5TmFtZShlbGVtZW50KTsKKyAgfSwKKyAgZ2V0RWxlbWVudDogZnVuY3Rpb24gKGlk KSB7CisgICAgdmFyIGl0ZW0gPSBnZXRJdGVtKGlkKTsKKyAgICByZXR1cm4gaXRlbSA/IGl0ZW0u ZWxlbWVudCA6IG51bGw7CisgIH0sCisgIGdldE93bmVySUQ6IGZ1bmN0aW9uIChpZCkgeworICAg IHZhciBlbGVtZW50ID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRFbGVtZW50KGlkKTsKKyAg ICBpZiAoIWVsZW1lbnQgfHwgIWVsZW1lbnQuX293bmVyKSB7CisgICAgICByZXR1cm4gbnVsbDsK KyAgICB9CisgICAgcmV0dXJuIGVsZW1lbnQuX293bmVyLl9kZWJ1Z0lEOworICB9LAorICBnZXRQ YXJlbnRJRDogZnVuY3Rpb24gKGlkKSB7CisgICAgdmFyIGl0ZW0gPSBnZXRJdGVtKGlkKTsKKyAg ICByZXR1cm4gaXRlbSA/IGl0ZW0ucGFyZW50SUQgOiBudWxsOworICB9LAorICBnZXRTb3VyY2U6 IGZ1bmN0aW9uIChpZCkgeworICAgIHZhciBpdGVtID0gZ2V0SXRlbShpZCk7CisgICAgdmFyIGVs ZW1lbnQgPSBpdGVtID8gaXRlbS5lbGVtZW50IDogbnVsbDsKKyAgICB2YXIgc291cmNlID0gZWxl bWVudCAhPSBudWxsID8gZWxlbWVudC5fc291cmNlIDogbnVsbDsKKyAgICByZXR1cm4gc291cmNl OworICB9LAorICBnZXRUZXh0OiBmdW5jdGlvbiAoaWQpIHsKKyAgICB2YXIgZWxlbWVudCA9IFJl YWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0RWxlbWVudChpZCk7CisgICAgaWYgKHR5cGVvZiBlbGVt ZW50ID09PSAnc3RyaW5nJykgeworICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgfSBlbHNlIGlm ICh0eXBlb2YgZWxlbWVudCA9PT0gJ251bWJlcicpIHsKKyAgICAgIHJldHVybiAnJyArIGVsZW1l bnQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfSwKKyAgZ2V0 VXBkYXRlQ291bnQ6IGZ1bmN0aW9uIChpZCkgeworICAgIHZhciBpdGVtID0gZ2V0SXRlbShpZCk7 CisgICAgcmV0dXJuIGl0ZW0gPyBpdGVtLnVwZGF0ZUNvdW50IDogMDsKKyAgfSwKKworCisgIGdl dFJvb3RJRHM6IGdldFJvb3RJRHMsCisgIGdldFJlZ2lzdGVyZWRJRHM6IGdldEl0ZW1JRHMKK307 CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RDb21wb25lbnRUcmVlSG9vazsKK30seyIxNCI6MTQs IjM4IjozOCwiNDYiOjQ2LCI0OCI6NDh9XSwxMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhw b3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisg KiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5z ZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBm aWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlv bmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5U UyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOwor Cit2YXIgc2hhbGxvd0NvbXBhcmUgPSBfZGVyZXFfKDM5KTsKKworLyoqCisgKiBJZiB5b3VyIFJl YWN0IGNvbXBvbmVudCdzIHJlbmRlciBmdW5jdGlvbiBpcyAicHVyZSIsIGUuZy4gaXQgd2lsbCBy ZW5kZXIgdGhlCisgKiBzYW1lIHJlc3VsdCBnaXZlbiB0aGUgc2FtZSBwcm9wcyBhbmQgc3RhdGUs IHByb3ZpZGUgdGhpcyBtaXhpbiBmb3IgYQorICogY29uc2lkZXJhYmxlIHBlcmZvcm1hbmNlIGJv b3N0LgorICoKKyAqIE1vc3QgUmVhY3QgY29tcG9uZW50cyBoYXZlIHB1cmUgcmVuZGVyIGZ1bmN0 aW9ucy4KKyAqCisgKiBFeGFtcGxlOgorICoKKyAqICAgdmFyIFJlYWN0Q29tcG9uZW50V2l0aFB1 cmVSZW5kZXJNaXhpbiA9CisgKiAgICAgcmVxdWlyZSgnUmVhY3RDb21wb25lbnRXaXRoUHVyZVJl bmRlck1peGluJyk7CisgKiAgIFJlYWN0LmNyZWF0ZUNsYXNzKHsKKyAqICAgICBtaXhpbnM6IFtS ZWFjdENvbXBvbmVudFdpdGhQdXJlUmVuZGVyTWl4aW5dLAorICoKKyAqICAgICByZW5kZXI6IGZ1 bmN0aW9uKCkgeworICogICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNs YXNzTmFtZX0+Zm9vPC9kaXY+OworICogICAgIH0KKyAqICAgfSk7CisgKgorICogTm90ZTogVGhp cyBvbmx5IGNoZWNrcyBzaGFsbG93IGVxdWFsaXR5IGZvciBwcm9wcyBhbmQgc3RhdGUuIElmIHRo ZXNlIGNvbnRhaW4KKyAqIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHRoaXMgbWl4aW4gbWF5IGhh dmUgZmFsc2UtbmVnYXRpdmVzIGZvciBkZWVwZXIKKyAqIGRpZmZlcmVuY2VzLiBPbmx5IG1peGlu IHRvIGNvbXBvbmVudHMgd2hpY2ggaGF2ZSBzaW1wbGUgcHJvcHMgYW5kIHN0YXRlLCBvcgorICog dXNlIGBmb3JjZVVwZGF0ZSgpYCB3aGVuIHlvdSBrbm93IGRlZXAgZGF0YSBzdHJ1Y3R1cmVzIGhh dmUgY2hhbmdlZC4KKyAqCisgKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3Qv ZG9jcy9wdXJlLXJlbmRlci1taXhpbi5odG1sCisgKi8KK3ZhciBSZWFjdENvbXBvbmVudFdpdGhQ dXJlUmVuZGVyTWl4aW4gPSB7CisgIHNob3VsZENvbXBvbmVudFVwZGF0ZTogZnVuY3Rpb24gKG5l eHRQcm9wcywgbmV4dFN0YXRlKSB7CisgICAgcmV0dXJuIHNoYWxsb3dDb21wYXJlKHRoaXMsIG5l eHRQcm9wcywgbmV4dFN0YXRlKTsKKyAgfQorfTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdENv bXBvbmVudFdpdGhQdXJlUmVuZGVyTWl4aW47Cit9LHsiMzkiOjM5fV0sMTQ6W2Z1bmN0aW9uKF9k ZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBG YWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJj ZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0 aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2Ug dHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91 bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogCisg Ki8KKworJ3VzZSBzdHJpY3QnOworCisvKioKKyAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50 IG93bmVyLgorICoKKyAqIFRoZSBjdXJyZW50IG93bmVyIGlzIHRoZSBjb21wb25lbnQgd2hvIHNo b3VsZCBvd24gYW55IGNvbXBvbmVudHMgdGhhdCBhcmUKKyAqIGN1cnJlbnRseSBiZWluZyBjb25z dHJ1Y3RlZC4KKyAqLwordmFyIFJlYWN0Q3VycmVudE93bmVyID0geworCisgIC8qKgorICAgKiBA aW50ZXJuYWwKKyAgICogQHR5cGUge1JlYWN0Q29tcG9uZW50fQorICAgKi8KKyAgY3VycmVudDog bnVsbAorCit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q3VycmVudE93bmVyOworfSx7fV0s MTU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQg MjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq CisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGlj ZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkg b2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJp Z2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3Rv cnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFJlYWN0RWxlbWVudCA9IF9kZXJl cV8oMTYpOworCisvKioKKyAqIENyZWF0ZSBhIGZhY3RvcnkgdGhhdCBjcmVhdGVzIEhUTUwgdGFn IGVsZW1lbnRzLgorICoKKyAqIEBwcml2YXRlCisgKi8KK3ZhciBjcmVhdGVET01GYWN0b3J5ID0g UmVhY3RFbGVtZW50LmNyZWF0ZUZhY3Rvcnk7CitpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1 Y3Rpb24nKSB7CisgIHZhciBSZWFjdEVsZW1lbnRWYWxpZGF0b3IgPSBfZGVyZXFfKDE4KTsKKyAg Y3JlYXRlRE9NRmFjdG9yeSA9IFJlYWN0RWxlbWVudFZhbGlkYXRvci5jcmVhdGVGYWN0b3J5Owor fQorCisvKioKKyAqIENyZWF0ZXMgYSBtYXBwaW5nIGZyb20gc3VwcG9ydGVkIEhUTUwgdGFncyB0 byBgUmVhY3RET01Db21wb25lbnRgIGNsYXNzZXMuCisgKiBUaGlzIGlzIGFsc28gYWNjZXNzaWJs ZSB2aWEgYFJlYWN0LkRPTWAuCisgKgorICogQHB1YmxpYworICovCit2YXIgUmVhY3RET01GYWN0 b3JpZXMgPSB7CisgIGE6IGNyZWF0ZURPTUZhY3RvcnkoJ2EnKSwKKyAgYWJicjogY3JlYXRlRE9N RmFjdG9yeSgnYWJicicpLAorICBhZGRyZXNzOiBjcmVhdGVET01GYWN0b3J5KCdhZGRyZXNzJyks CisgIGFyZWE6IGNyZWF0ZURPTUZhY3RvcnkoJ2FyZWEnKSwKKyAgYXJ0aWNsZTogY3JlYXRlRE9N RmFjdG9yeSgnYXJ0aWNsZScpLAorICBhc2lkZTogY3JlYXRlRE9NRmFjdG9yeSgnYXNpZGUnKSwK KyAgYXVkaW86IGNyZWF0ZURPTUZhY3RvcnkoJ2F1ZGlvJyksCisgIGI6IGNyZWF0ZURPTUZhY3Rv cnkoJ2InKSwKKyAgYmFzZTogY3JlYXRlRE9NRmFjdG9yeSgnYmFzZScpLAorICBiZGk6IGNyZWF0 ZURPTUZhY3RvcnkoJ2JkaScpLAorICBiZG86IGNyZWF0ZURPTUZhY3RvcnkoJ2JkbycpLAorICBi aWc6IGNyZWF0ZURPTUZhY3RvcnkoJ2JpZycpLAorICBibG9ja3F1b3RlOiBjcmVhdGVET01GYWN0 b3J5KCdibG9ja3F1b3RlJyksCisgIGJvZHk6IGNyZWF0ZURPTUZhY3RvcnkoJ2JvZHknKSwKKyAg YnI6IGNyZWF0ZURPTUZhY3RvcnkoJ2JyJyksCisgIGJ1dHRvbjogY3JlYXRlRE9NRmFjdG9yeSgn YnV0dG9uJyksCisgIGNhbnZhczogY3JlYXRlRE9NRmFjdG9yeSgnY2FudmFzJyksCisgIGNhcHRp b246IGNyZWF0ZURPTUZhY3RvcnkoJ2NhcHRpb24nKSwKKyAgY2l0ZTogY3JlYXRlRE9NRmFjdG9y eSgnY2l0ZScpLAorICBjb2RlOiBjcmVhdGVET01GYWN0b3J5KCdjb2RlJyksCisgIGNvbDogY3Jl YXRlRE9NRmFjdG9yeSgnY29sJyksCisgIGNvbGdyb3VwOiBjcmVhdGVET01GYWN0b3J5KCdjb2xn cm91cCcpLAorICBkYXRhOiBjcmVhdGVET01GYWN0b3J5KCdkYXRhJyksCisgIGRhdGFsaXN0OiBj cmVhdGVET01GYWN0b3J5KCdkYXRhbGlzdCcpLAorICBkZDogY3JlYXRlRE9NRmFjdG9yeSgnZGQn KSwKKyAgZGVsOiBjcmVhdGVET01GYWN0b3J5KCdkZWwnKSwKKyAgZGV0YWlsczogY3JlYXRlRE9N RmFjdG9yeSgnZGV0YWlscycpLAorICBkZm46IGNyZWF0ZURPTUZhY3RvcnkoJ2RmbicpLAorICBk aWFsb2c6IGNyZWF0ZURPTUZhY3RvcnkoJ2RpYWxvZycpLAorICBkaXY6IGNyZWF0ZURPTUZhY3Rv cnkoJ2RpdicpLAorICBkbDogY3JlYXRlRE9NRmFjdG9yeSgnZGwnKSwKKyAgZHQ6IGNyZWF0ZURP TUZhY3RvcnkoJ2R0JyksCisgIGVtOiBjcmVhdGVET01GYWN0b3J5KCdlbScpLAorICBlbWJlZDog Y3JlYXRlRE9NRmFjdG9yeSgnZW1iZWQnKSwKKyAgZmllbGRzZXQ6IGNyZWF0ZURPTUZhY3Rvcnko J2ZpZWxkc2V0JyksCisgIGZpZ2NhcHRpb246IGNyZWF0ZURPTUZhY3RvcnkoJ2ZpZ2NhcHRpb24n KSwKKyAgZmlndXJlOiBjcmVhdGVET01GYWN0b3J5KCdmaWd1cmUnKSwKKyAgZm9vdGVyOiBjcmVh dGVET01GYWN0b3J5KCdmb290ZXInKSwKKyAgZm9ybTogY3JlYXRlRE9NRmFjdG9yeSgnZm9ybScp LAorICBoMTogY3JlYXRlRE9NRmFjdG9yeSgnaDEnKSwKKyAgaDI6IGNyZWF0ZURPTUZhY3Rvcnko J2gyJyksCisgIGgzOiBjcmVhdGVET01GYWN0b3J5KCdoMycpLAorICBoNDogY3JlYXRlRE9NRmFj dG9yeSgnaDQnKSwKKyAgaDU6IGNyZWF0ZURPTUZhY3RvcnkoJ2g1JyksCisgIGg2OiBjcmVhdGVE T01GYWN0b3J5KCdoNicpLAorICBoZWFkOiBjcmVhdGVET01GYWN0b3J5KCdoZWFkJyksCisgIGhl YWRlcjogY3JlYXRlRE9NRmFjdG9yeSgnaGVhZGVyJyksCisgIGhncm91cDogY3JlYXRlRE9NRmFj dG9yeSgnaGdyb3VwJyksCisgIGhyOiBjcmVhdGVET01GYWN0b3J5KCdocicpLAorICBodG1sOiBj cmVhdGVET01GYWN0b3J5KCdodG1sJyksCisgIGk6IGNyZWF0ZURPTUZhY3RvcnkoJ2knKSwKKyAg aWZyYW1lOiBjcmVhdGVET01GYWN0b3J5KCdpZnJhbWUnKSwKKyAgaW1nOiBjcmVhdGVET01GYWN0 b3J5KCdpbWcnKSwKKyAgaW5wdXQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2lucHV0JyksCisgIGluczog Y3JlYXRlRE9NRmFjdG9yeSgnaW5zJyksCisgIGtiZDogY3JlYXRlRE9NRmFjdG9yeSgna2JkJyks CisgIGtleWdlbjogY3JlYXRlRE9NRmFjdG9yeSgna2V5Z2VuJyksCisgIGxhYmVsOiBjcmVhdGVE T01GYWN0b3J5KCdsYWJlbCcpLAorICBsZWdlbmQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2xlZ2VuZCcp LAorICBsaTogY3JlYXRlRE9NRmFjdG9yeSgnbGknKSwKKyAgbGluazogY3JlYXRlRE9NRmFjdG9y eSgnbGluaycpLAorICBtYWluOiBjcmVhdGVET01GYWN0b3J5KCdtYWluJyksCisgIG1hcDogY3Jl YXRlRE9NRmFjdG9yeSgnbWFwJyksCisgIG1hcms6IGNyZWF0ZURPTUZhY3RvcnkoJ21hcmsnKSwK KyAgbWVudTogY3JlYXRlRE9NRmFjdG9yeSgnbWVudScpLAorICBtZW51aXRlbTogY3JlYXRlRE9N RmFjdG9yeSgnbWVudWl0ZW0nKSwKKyAgbWV0YTogY3JlYXRlRE9NRmFjdG9yeSgnbWV0YScpLAor ICBtZXRlcjogY3JlYXRlRE9NRmFjdG9yeSgnbWV0ZXInKSwKKyAgbmF2OiBjcmVhdGVET01GYWN0 b3J5KCduYXYnKSwKKyAgbm9zY3JpcHQ6IGNyZWF0ZURPTUZhY3RvcnkoJ25vc2NyaXB0JyksCisg IG9iamVjdDogY3JlYXRlRE9NRmFjdG9yeSgnb2JqZWN0JyksCisgIG9sOiBjcmVhdGVET01GYWN0 b3J5KCdvbCcpLAorICBvcHRncm91cDogY3JlYXRlRE9NRmFjdG9yeSgnb3B0Z3JvdXAnKSwKKyAg b3B0aW9uOiBjcmVhdGVET01GYWN0b3J5KCdvcHRpb24nKSwKKyAgb3V0cHV0OiBjcmVhdGVET01G YWN0b3J5KCdvdXRwdXQnKSwKKyAgcDogY3JlYXRlRE9NRmFjdG9yeSgncCcpLAorICBwYXJhbTog Y3JlYXRlRE9NRmFjdG9yeSgncGFyYW0nKSwKKyAgcGljdHVyZTogY3JlYXRlRE9NRmFjdG9yeSgn cGljdHVyZScpLAorICBwcmU6IGNyZWF0ZURPTUZhY3RvcnkoJ3ByZScpLAorICBwcm9ncmVzczog Y3JlYXRlRE9NRmFjdG9yeSgncHJvZ3Jlc3MnKSwKKyAgcTogY3JlYXRlRE9NRmFjdG9yeSgncScp LAorICBycDogY3JlYXRlRE9NRmFjdG9yeSgncnAnKSwKKyAgcnQ6IGNyZWF0ZURPTUZhY3Rvcnko J3J0JyksCisgIHJ1Ynk6IGNyZWF0ZURPTUZhY3RvcnkoJ3J1YnknKSwKKyAgczogY3JlYXRlRE9N RmFjdG9yeSgncycpLAorICBzYW1wOiBjcmVhdGVET01GYWN0b3J5KCdzYW1wJyksCisgIHNjcmlw dDogY3JlYXRlRE9NRmFjdG9yeSgnc2NyaXB0JyksCisgIHNlY3Rpb246IGNyZWF0ZURPTUZhY3Rv cnkoJ3NlY3Rpb24nKSwKKyAgc2VsZWN0OiBjcmVhdGVET01GYWN0b3J5KCdzZWxlY3QnKSwKKyAg c21hbGw6IGNyZWF0ZURPTUZhY3RvcnkoJ3NtYWxsJyksCisgIHNvdXJjZTogY3JlYXRlRE9NRmFj dG9yeSgnc291cmNlJyksCisgIHNwYW46IGNyZWF0ZURPTUZhY3RvcnkoJ3NwYW4nKSwKKyAgc3Ry b25nOiBjcmVhdGVET01GYWN0b3J5KCdzdHJvbmcnKSwKKyAgc3R5bGU6IGNyZWF0ZURPTUZhY3Rv cnkoJ3N0eWxlJyksCisgIHN1YjogY3JlYXRlRE9NRmFjdG9yeSgnc3ViJyksCisgIHN1bW1hcnk6 IGNyZWF0ZURPTUZhY3RvcnkoJ3N1bW1hcnknKSwKKyAgc3VwOiBjcmVhdGVET01GYWN0b3J5KCdz dXAnKSwKKyAgdGFibGU6IGNyZWF0ZURPTUZhY3RvcnkoJ3RhYmxlJyksCisgIHRib2R5OiBjcmVh dGVET01GYWN0b3J5KCd0Ym9keScpLAorICB0ZDogY3JlYXRlRE9NRmFjdG9yeSgndGQnKSwKKyAg dGV4dGFyZWE6IGNyZWF0ZURPTUZhY3RvcnkoJ3RleHRhcmVhJyksCisgIHRmb290OiBjcmVhdGVE T01GYWN0b3J5KCd0Zm9vdCcpLAorICB0aDogY3JlYXRlRE9NRmFjdG9yeSgndGgnKSwKKyAgdGhl YWQ6IGNyZWF0ZURPTUZhY3RvcnkoJ3RoZWFkJyksCisgIHRpbWU6IGNyZWF0ZURPTUZhY3Rvcnko J3RpbWUnKSwKKyAgdGl0bGU6IGNyZWF0ZURPTUZhY3RvcnkoJ3RpdGxlJyksCisgIHRyOiBjcmVh dGVET01GYWN0b3J5KCd0cicpLAorICB0cmFjazogY3JlYXRlRE9NRmFjdG9yeSgndHJhY2snKSwK KyAgdTogY3JlYXRlRE9NRmFjdG9yeSgndScpLAorICB1bDogY3JlYXRlRE9NRmFjdG9yeSgndWwn KSwKKyAgJ3Zhcic6IGNyZWF0ZURPTUZhY3RvcnkoJ3ZhcicpLAorICB2aWRlbzogY3JlYXRlRE9N RmFjdG9yeSgndmlkZW8nKSwKKyAgd2JyOiBjcmVhdGVET01GYWN0b3J5KCd3YnInKSwKKworICAv LyBTVkcKKyAgY2lyY2xlOiBjcmVhdGVET01GYWN0b3J5KCdjaXJjbGUnKSwKKyAgY2xpcFBhdGg6 IGNyZWF0ZURPTUZhY3RvcnkoJ2NsaXBQYXRoJyksCisgIGRlZnM6IGNyZWF0ZURPTUZhY3Rvcnko J2RlZnMnKSwKKyAgZWxsaXBzZTogY3JlYXRlRE9NRmFjdG9yeSgnZWxsaXBzZScpLAorICBnOiBj cmVhdGVET01GYWN0b3J5KCdnJyksCisgIGltYWdlOiBjcmVhdGVET01GYWN0b3J5KCdpbWFnZScp LAorICBsaW5lOiBjcmVhdGVET01GYWN0b3J5KCdsaW5lJyksCisgIGxpbmVhckdyYWRpZW50OiBj cmVhdGVET01GYWN0b3J5KCdsaW5lYXJHcmFkaWVudCcpLAorICBtYXNrOiBjcmVhdGVET01GYWN0 b3J5KCdtYXNrJyksCisgIHBhdGg6IGNyZWF0ZURPTUZhY3RvcnkoJ3BhdGgnKSwKKyAgcGF0dGVy bjogY3JlYXRlRE9NRmFjdG9yeSgncGF0dGVybicpLAorICBwb2x5Z29uOiBjcmVhdGVET01GYWN0 b3J5KCdwb2x5Z29uJyksCisgIHBvbHlsaW5lOiBjcmVhdGVET01GYWN0b3J5KCdwb2x5bGluZScp LAorICByYWRpYWxHcmFkaWVudDogY3JlYXRlRE9NRmFjdG9yeSgncmFkaWFsR3JhZGllbnQnKSwK KyAgcmVjdDogY3JlYXRlRE9NRmFjdG9yeSgncmVjdCcpLAorICBzdG9wOiBjcmVhdGVET01GYWN0 b3J5KCdzdG9wJyksCisgIHN2ZzogY3JlYXRlRE9NRmFjdG9yeSgnc3ZnJyksCisgIHRleHQ6IGNy ZWF0ZURPTUZhY3RvcnkoJ3RleHQnKSwKKyAgdHNwYW46IGNyZWF0ZURPTUZhY3RvcnkoJ3RzcGFu JykKK307CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RET01GYWN0b3JpZXM7Cit9LHsiMTYiOjE2 LCIxOCI6MTh9XSwxNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAq IENvcHlyaWdodCAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJl c2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJT RC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290 IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBv ZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBz YW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX2Fzc2lnbiA9 IF9kZXJlcV8oNDkpOworCit2YXIgUmVhY3RDdXJyZW50T3duZXIgPSBfZGVyZXFfKDE0KTsKKwor dmFyIHdhcm5pbmcgPSBfZGVyZXFfKDQ4KTsKK3ZhciBjYW5EZWZpbmVQcm9wZXJ0eSA9IF9kZXJl cV8oMzMpOwordmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9w ZXJ0eTsKKwordmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IF9kZXJlcV8oMTcpOworCit2YXIgUkVT RVJWRURfUFJPUFMgPSB7CisgIGtleTogdHJ1ZSwKKyAgcmVmOiB0cnVlLAorICBfX3NlbGY6IHRy dWUsCisgIF9fc291cmNlOiB0cnVlCit9OworCit2YXIgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hv d24sIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duOworCitmdW5jdGlvbiBoYXNWYWxpZFJlZihj b25maWcpIHsKKyAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgIGlm IChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgJ3JlZicpKSB7CisgICAgICB2YXIgZ2V0dGVy ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25maWcsICdyZWYnKS5nZXQ7Cisg ICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykgeworICAgICAgICByZXR1 cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBjb25maWcucmVmICE9PSB1 bmRlZmluZWQ7Cit9CisKK2Z1bmN0aW9uIGhhc1ZhbGlkS2V5KGNvbmZpZykgeworICBpZiAoImRl dmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgaWYgKGhhc093blByb3BlcnR5LmNh bGwoY29uZmlnLCAna2V5JykpIHsKKyAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJv cGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ2tleScpLmdldDsKKyAgICAgIGlmIChnZXR0ZXIgJiYg Z2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0K KyAgICB9CisgIH0KKyAgcmV0dXJuIGNvbmZpZy5rZXkgIT09IHVuZGVmaW5lZDsKK30KKworZnVu Y3Rpb24gZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7Cisg IHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkgPSBmdW5jdGlvbiAoKSB7CisgICAgaWYgKCFzcGVj aWFsUHJvcEtleVdhcm5pbmdTaG93bikgeworICAgICAgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hv d24gPSB0cnVlOworICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2Fybmlu ZyhmYWxzZSwgJyVzOiBga2V5YCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdp bGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVk IHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50 LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9m Yi5tZS9yZWFjdC1zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKSA6IHZvaWQgMDsKKyAgICB9 CisgIH07CisgIHdhcm5BYm91dEFjY2Vzc2luZ0tleS5pc1JlYWN0V2FybmluZyA9IHRydWU7Cisg IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ2tleScsIHsKKyAgICBnZXQ6IHdhcm5BYm91 dEFjY2Vzc2luZ0tleSwKKyAgICBjb25maWd1cmFibGU6IHRydWUKKyAgfSk7Cit9CisKK2Z1bmN0 aW9uIGRlZmluZVJlZlByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSkgeworICB2 YXIgd2FybkFib3V0QWNjZXNzaW5nUmVmID0gZnVuY3Rpb24gKCkgeworICAgIGlmICghc3BlY2lh bFByb3BSZWZXYXJuaW5nU2hvd24pIHsKKyAgICAgIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3du ID0gdHJ1ZTsKKyAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmco ZmFsc2UsICclczogYHJlZmAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxs IHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0 byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhlIGNoaWxkIGNvbXBvbmVudCwg eW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAncHJvcC4gKGh0dHBzOi8vZmIu bWUvcmVhY3Qtc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSkgOiB2b2lkIDA7CisgICAgfQor ICB9OworICB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYuaXNSZWFjdFdhcm5pbmcgPSB0cnVlOworICBP YmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdyZWYnLCB7CisgICAgZ2V0OiB3YXJuQWJvdXRB Y2Nlc3NpbmdSZWYsCisgICAgY29uZmlndXJhYmxlOiB0cnVlCisgIH0pOworfQorCisvKioKKyAq IEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBSZWFjdCBlbGVtZW50LiBUaGlzIG5vIGxv bmdlciBhZGhlcmVzIHRvCisgKiB0aGUgY2xhc3MgcGF0dGVybiwgc28gZG8gbm90IHVzZSBuZXcg dG8gY2FsbCBpdC4gQWxzbywgbm8gaW5zdGFuY2VvZiBjaGVjaworICogd2lsbCB3b3JrLiBJbnN0 ZWFkIHRlc3QgJCR0eXBlb2YgZmllbGQgYWdhaW5zdCBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50 JykgdG8gY2hlY2sKKyAqIGlmIHNvbWV0aGluZyBpcyBhIFJlYWN0IEVsZW1lbnQuCisgKgorICog QHBhcmFtIHsqfSB0eXBlCisgKiBAcGFyYW0geyp9IGtleQorICogQHBhcmFtIHtzdHJpbmd8b2Jq ZWN0fSByZWYKKyAqIEBwYXJhbSB7Kn0gc2VsZiBBICp0ZW1wb3JhcnkqIGhlbHBlciB0byBkZXRl Y3QgcGxhY2VzIHdoZXJlIGB0aGlzYCBpcworICogZGlmZmVyZW50IGZyb20gdGhlIGBvd25lcmAg d2hlbiBSZWFjdC5jcmVhdGVFbGVtZW50IGlzIGNhbGxlZCwgc28gdGhhdCB3ZQorICogY2FuIHdh cm4uIFdlIHdhbnQgdG8gZ2V0IHJpZCBvZiBvd25lciBhbmQgcmVwbGFjZSBzdHJpbmcgYHJlZmBz IHdpdGggYXJyb3cKKyAqIGZ1bmN0aW9ucywgYW5kIGFzIGxvbmcgYXMgYHRoaXNgIGFuZCBvd25l ciBhcmUgdGhlIHNhbWUsIHRoZXJlIHdpbGwgYmUgbm8KKyAqIGNoYW5nZSBpbiBiZWhhdmlvci4K KyAqIEBwYXJhbSB7Kn0gc291cmNlIEFuIGFubm90YXRpb24gb2JqZWN0IChhZGRlZCBieSBhIHRy YW5zcGlsZXIgb3Igb3RoZXJ3aXNlKQorICogaW5kaWNhdGluZyBmaWxlbmFtZSwgbGluZSBudW1i ZXIsIGFuZC9vciBvdGhlciBpbmZvcm1hdGlvbi4KKyAqIEBwYXJhbSB7Kn0gb3duZXIKKyAqIEBw YXJhbSB7Kn0gcHJvcHMKKyAqIEBpbnRlcm5hbAorICovCit2YXIgUmVhY3RFbGVtZW50ID0gZnVu Y3Rpb24gKHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcykgeworICB2 YXIgZWxlbWVudCA9IHsKKyAgICAvLyBUaGlzIHRhZyBhbGxvdyB1cyB0byB1bmlxdWVseSBpZGVu dGlmeSB0aGlzIGFzIGEgUmVhY3QgRWxlbWVudAorICAgICQkdHlwZW9mOiBSRUFDVF9FTEVNRU5U X1RZUEUsCisKKyAgICAvLyBCdWlsdC1pbiBwcm9wZXJ0aWVzIHRoYXQgYmVsb25nIG9uIHRoZSBl bGVtZW50CisgICAgdHlwZTogdHlwZSwKKyAgICBrZXk6IGtleSwKKyAgICByZWY6IHJlZiwKKyAg ICBwcm9wczogcHJvcHMsCisKKyAgICAvLyBSZWNvcmQgdGhlIGNvbXBvbmVudCByZXNwb25zaWJs ZSBmb3IgY3JlYXRpbmcgdGhpcyBlbGVtZW50LgorICAgIF9vd25lcjogb3duZXIKKyAgfTsKKwor ICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgLy8gVGhlIHZhbGlk YXRpb24gZmxhZyBpcyBjdXJyZW50bHkgbXV0YXRpdmUuIFdlIHB1dCBpdCBvbgorICAgIC8vIGFu IGV4dGVybmFsIGJhY2tpbmcgc3RvcmUgc28gdGhhdCB3ZSBjYW4gZnJlZXplIHRoZSB3aG9sZSBv YmplY3QuCisgICAgLy8gVGhpcyBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhIFdlYWtNYXAgb25jZSB0 aGV5IGFyZSBpbXBsZW1lbnRlZCBpbgorICAgIC8vIGNvbW1vbmx5IHVzZWQgZGV2ZWxvcG1lbnQg ZW52aXJvbm1lbnRzLgorICAgIGVsZW1lbnQuX3N0b3JlID0ge307CisKKyAgICAvLyBUbyBtYWtl IGNvbXBhcmluZyBSZWFjdEVsZW1lbnRzIGVhc2llciBmb3IgdGVzdGluZyBwdXJwb3Nlcywgd2Ug bWFrZQorICAgIC8vIHRoZSB2YWxpZGF0aW9uIGZsYWcgbm9uLWVudW1lcmFibGUgKHdoZXJlIHBv c3NpYmxlLCB3aGljaCBzaG91bGQKKyAgICAvLyBpbmNsdWRlIGV2ZXJ5IGVudmlyb25tZW50IHdl IHJ1biB0ZXN0cyBpbiksIHNvIHRoZSB0ZXN0IGZyYW1ld29yaworICAgIC8vIGlnbm9yZXMgaXQu CisgICAgaWYgKGNhbkRlZmluZVByb3BlcnR5KSB7CisgICAgICBPYmplY3QuZGVmaW5lUHJvcGVy dHkoZWxlbWVudC5fc3RvcmUsICd2YWxpZGF0ZWQnLCB7CisgICAgICAgIGNvbmZpZ3VyYWJsZTog ZmFsc2UsCisgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAorICAgICAgICB3cml0YWJsZTogdHJ1 ZSwKKyAgICAgICAgdmFsdWU6IGZhbHNlCisgICAgICB9KTsKKyAgICAgIC8vIHNlbGYgYW5kIHNv dXJjZSBhcmUgREVWIG9ubHkgcHJvcGVydGllcy4KKyAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0 eShlbGVtZW50LCAnX3NlbGYnLCB7CisgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCisgICAg ICAgIGVudW1lcmFibGU6IGZhbHNlLAorICAgICAgICB3cml0YWJsZTogZmFsc2UsCisgICAgICAg IHZhbHVlOiBzZWxmCisgICAgICB9KTsKKyAgICAgIC8vIFR3byBlbGVtZW50cyBjcmVhdGVkIGlu IHR3byBkaWZmZXJlbnQgcGxhY2VzIHNob3VsZCBiZSBjb25zaWRlcmVkCisgICAgICAvLyBlcXVh bCBmb3IgdGVzdGluZyBwdXJwb3NlcyBhbmQgdGhlcmVmb3JlIHdlIGhpZGUgaXQgZnJvbSBlbnVt ZXJhdGlvbi4KKyAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NvdXJjZScs IHsKKyAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKKyAgICAgICAgZW51bWVyYWJsZTogZmFs c2UsCisgICAgICAgIHdyaXRhYmxlOiBmYWxzZSwKKyAgICAgICAgdmFsdWU6IHNvdXJjZQorICAg ICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IGZh bHNlOworICAgICAgZWxlbWVudC5fc2VsZiA9IHNlbGY7CisgICAgICBlbGVtZW50Ll9zb3VyY2Ug PSBzb3VyY2U7CisgICAgfQorICAgIGlmIChPYmplY3QuZnJlZXplKSB7CisgICAgICBPYmplY3Qu ZnJlZXplKGVsZW1lbnQucHJvcHMpOworICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50KTsKKyAg ICB9CisgIH0KKworICByZXR1cm4gZWxlbWVudDsKK307CisKKy8qKgorICogQ3JlYXRlIGFuZCBy ZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IG9mIHRoZSBnaXZlbiB0eXBlLgorICogU2VlIGh0dHBz Oi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0 LmNyZWF0ZWVsZW1lbnQKKyAqLworUmVhY3RFbGVtZW50LmNyZWF0ZUVsZW1lbnQgPSBmdW5jdGlv biAodHlwZSwgY29uZmlnLCBjaGlsZHJlbikgeworICB2YXIgcHJvcE5hbWU7CisKKyAgLy8gUmVz ZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZAorICB2YXIgcHJvcHMgPSB7fTsKKworICB2YXIga2V5 ID0gbnVsbDsKKyAgdmFyIHJlZiA9IG51bGw7CisgIHZhciBzZWxmID0gbnVsbDsKKyAgdmFyIHNv dXJjZSA9IG51bGw7CisKKyAgaWYgKGNvbmZpZyAhPSBudWxsKSB7CisgICAgaWYgKGhhc1ZhbGlk UmVmKGNvbmZpZykpIHsKKyAgICAgIHJlZiA9IGNvbmZpZy5yZWY7CisgICAgfQorICAgIGlmICho YXNWYWxpZEtleShjb25maWcpKSB7CisgICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7CisgICAg fQorCisgICAgc2VsZiA9IGNvbmZpZy5fX3NlbGYgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25m aWcuX19zZWxmOworICAgIHNvdXJjZSA9IGNvbmZpZy5fX3NvdXJjZSA9PT0gdW5kZWZpbmVkID8g bnVsbCA6IGNvbmZpZy5fX3NvdXJjZTsKKyAgICAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBhcmUg YWRkZWQgdG8gYSBuZXcgcHJvcHMgb2JqZWN0CisgICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcp IHsKKyAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFS RVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHsKKyAgICAgICAgcHJvcHNb cHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAv LyBDaGlsZHJlbiBjYW4gYmUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCwgYW5kIHRob3NlIGFyZSB0 cmFuc2ZlcnJlZCBvbnRvCisgIC8vIHRoZSBuZXdseSBhbGxvY2F0ZWQgcHJvcHMgb2JqZWN0Lgor ICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjsKKyAgaWYgKGNoaWxk cmVuTGVuZ3RoID09PSAxKSB7CisgICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKKyAgfSBl bHNlIGlmIChjaGlsZHJlbkxlbmd0aCA+IDEpIHsKKyAgICB2YXIgY2hpbGRBcnJheSA9IEFycmF5 KGNoaWxkcmVuTGVuZ3RoKTsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3Ro OyBpKyspIHsKKyAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdOworICAgIH0K KyAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICBpZiAoT2Jq ZWN0LmZyZWV6ZSkgeworICAgICAgICBPYmplY3QuZnJlZXplKGNoaWxkQXJyYXkpOworICAgICAg fQorICAgIH0KKyAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkQXJyYXk7CisgIH0KKworICAvLyBS ZXNvbHZlIGRlZmF1bHQgcHJvcHMKKyAgaWYgKHR5cGUgJiYgdHlwZS5kZWZhdWx0UHJvcHMpIHsK KyAgICB2YXIgZGVmYXVsdFByb3BzID0gdHlwZS5kZWZhdWx0UHJvcHM7CisgICAgZm9yIChwcm9w TmFtZSBpbiBkZWZhdWx0UHJvcHMpIHsKKyAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVu ZGVmaW5lZCkgeworICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5h bWVdOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1 Y3Rpb24nKSB7CisgICAgaWYgKGtleSB8fCByZWYpIHsKKyAgICAgIGlmICh0eXBlb2YgcHJvcHMu JCR0eXBlb2YgPT09ICd1bmRlZmluZWQnIHx8IHByb3BzLiQkdHlwZW9mICE9PSBSRUFDVF9FTEVN RU5UX1RZUEUpIHsKKyAgICAgICAgdmFyIGRpc3BsYXlOYW1lID0gdHlwZW9mIHR5cGUgPT09ICdm dW5jdGlvbicgPyB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCAnVW5rbm93bicgOiB0 eXBlOworICAgICAgICBpZiAoa2V5KSB7CisgICAgICAgICAgZGVmaW5lS2V5UHJvcFdhcm5pbmdH ZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVmKSB7 CisgICAgICAgICAgZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1l KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gUmVhY3RFbGVtZW50 KHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQs IHByb3BzKTsKK307CisKKy8qKgorICogUmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBwcm9kdWNlcyBS ZWFjdEVsZW1lbnRzIG9mIGEgZ2l2ZW4gdHlwZS4KKyAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdp dGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jcmVhdGVmYWN0b3J5 CisgKi8KK1JlYWN0RWxlbWVudC5jcmVhdGVGYWN0b3J5ID0gZnVuY3Rpb24gKHR5cGUpIHsKKyAg dmFyIGZhY3RvcnkgPSBSZWFjdEVsZW1lbnQuY3JlYXRlRWxlbWVudC5iaW5kKG51bGwsIHR5cGUp OworICAvLyBFeHBvc2UgdGhlIHR5cGUgb24gdGhlIGZhY3RvcnkgYW5kIHRoZSBwcm90b3R5cGUg c28gdGhhdCBpdCBjYW4gYmUKKyAgLy8gZWFzaWx5IGFjY2Vzc2VkIG9uIGVsZW1lbnRzLiBFLmcu IGA8Rm9vIC8+LnR5cGUgPT09IEZvb2AuCisgIC8vIFRoaXMgc2hvdWxkIG5vdCBiZSBuYW1lZCBg Y29uc3RydWN0b3JgIHNpbmNlIHRoaXMgbWF5IG5vdCBiZSB0aGUgZnVuY3Rpb24KKyAgLy8gdGhh dCBjcmVhdGVkIHRoZSBlbGVtZW50LCBhbmQgaXQgbWF5IG5vdCBldmVuIGJlIGEgY29uc3RydWN0 b3IuCisgIC8vIExlZ2FjeSBob29rIFRPRE86IFdhcm4gaWYgdGhpcyBpcyBhY2Nlc3NlZAorICBm YWN0b3J5LnR5cGUgPSB0eXBlOworICByZXR1cm4gZmFjdG9yeTsKK307CisKK1JlYWN0RWxlbWVu dC5jbG9uZUFuZFJlcGxhY2VLZXkgPSBmdW5jdGlvbiAob2xkRWxlbWVudCwgbmV3S2V5KSB7Cisg IHZhciBuZXdFbGVtZW50ID0gUmVhY3RFbGVtZW50KG9sZEVsZW1lbnQudHlwZSwgbmV3S2V5LCBv bGRFbGVtZW50LnJlZiwgb2xkRWxlbWVudC5fc2VsZiwgb2xkRWxlbWVudC5fc291cmNlLCBvbGRF bGVtZW50Ll9vd25lciwgb2xkRWxlbWVudC5wcm9wcyk7CisKKyAgcmV0dXJuIG5ld0VsZW1lbnQ7 Cit9OworCisvKioKKyAqIENsb25lIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IHVzaW5n IGVsZW1lbnQgYXMgdGhlIHN0YXJ0aW5nIHBvaW50LgorICogU2VlIGh0dHBzOi8vZmFjZWJvb2su Z2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNsb25lZWxlbWVu dAorICovCitSZWFjdEVsZW1lbnQuY2xvbmVFbGVtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQsIGNv bmZpZywgY2hpbGRyZW4pIHsKKyAgdmFyIHByb3BOYW1lOworCisgIC8vIE9yaWdpbmFsIHByb3Bz IGFyZSBjb3BpZWQKKyAgdmFyIHByb3BzID0gX2Fzc2lnbih7fSwgZWxlbWVudC5wcm9wcyk7CisK KyAgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZAorICB2YXIga2V5ID0gZWxlbWVudC5r ZXk7CisgIHZhciByZWYgPSBlbGVtZW50LnJlZjsKKyAgLy8gU2VsZiBpcyBwcmVzZXJ2ZWQgc2lu Y2UgdGhlIG93bmVyIGlzIHByZXNlcnZlZC4KKyAgdmFyIHNlbGYgPSBlbGVtZW50Ll9zZWxmOwor ICAvLyBTb3VyY2UgaXMgcHJlc2VydmVkIHNpbmNlIGNsb25lRWxlbWVudCBpcyB1bmxpa2VseSB0 byBiZSB0YXJnZXRlZCBieSBhCisgIC8vIHRyYW5zcGlsZXIsIGFuZCB0aGUgb3JpZ2luYWwgc291 cmNlIGlzIHByb2JhYmx5IGEgYmV0dGVyIGluZGljYXRvciBvZiB0aGUKKyAgLy8gdHJ1ZSBvd25l ci4KKyAgdmFyIHNvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTsKKworICAvLyBPd25lciB3aWxsIGJl IHByZXNlcnZlZCwgdW5sZXNzIHJlZiBpcyBvdmVycmlkZGVuCisgIHZhciBvd25lciA9IGVsZW1l bnQuX293bmVyOworCisgIGlmIChjb25maWcgIT0gbnVsbCkgeworICAgIGlmIChoYXNWYWxpZFJl Zihjb25maWcpKSB7CisgICAgICAvLyBTaWxlbnRseSBzdGVhbCB0aGUgcmVmIGZyb20gdGhlIHBh cmVudC4KKyAgICAgIHJlZiA9IGNvbmZpZy5yZWY7CisgICAgICBvd25lciA9IFJlYWN0Q3VycmVu dE93bmVyLmN1cnJlbnQ7CisgICAgfQorICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7Cisg ICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7CisgICAgfQorCisgICAgLy8gUmVtYWluaW5nIHBy b3BlcnRpZXMgb3ZlcnJpZGUgZXhpc3RpbmcgcHJvcHMKKyAgICB2YXIgZGVmYXVsdFByb3BzOwor ICAgIGlmIChlbGVtZW50LnR5cGUgJiYgZWxlbWVudC50eXBlLmRlZmF1bHRQcm9wcykgeworICAg ICAgZGVmYXVsdFByb3BzID0gZWxlbWVudC50eXBlLmRlZmF1bHRQcm9wczsKKyAgICB9CisgICAg Zm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHsKKyAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxs KGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9w TmFtZSkpIHsKKyAgICAgICAgaWYgKGNvbmZpZ1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCAmJiBk ZWZhdWx0UHJvcHMgIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgIC8vIFJlc29sdmUgZGVmYXVs dCBwcm9wcworICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFt ZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmln W3Byb3BOYW1lXTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIENoaWxk cmVuIGNhbiBiZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LCBhbmQgdGhvc2UgYXJlIHRyYW5zZmVy cmVkIG9udG8KKyAgLy8gdGhlIG5ld2x5IGFsbG9jYXRlZCBwcm9wcyBvYmplY3QuCisgIHZhciBj aGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAyOworICBpZiAoY2hpbGRyZW5MZW5n dGggPT09IDEpIHsKKyAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuOworICB9IGVsc2UgaWYg KGNoaWxkcmVuTGVuZ3RoID4gMSkgeworICAgIHZhciBjaGlsZEFycmF5ID0gQXJyYXkoY2hpbGRy ZW5MZW5ndGgpOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7IGkrKykg eworICAgICAgY2hpbGRBcnJheVtpXSA9IGFyZ3VtZW50c1tpICsgMl07CisgICAgfQorICAgIHBy b3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTsKKyAgfQorCisgIHJldHVybiBSZWFjdEVsZW1lbnQo ZWxlbWVudC50eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpOworfTsK KworLyoqCisgKiBWZXJpZmllcyB0aGUgb2JqZWN0IGlzIGEgUmVhY3RFbGVtZW50LgorICogU2Vl IGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1s I3JlYWN0LmlzdmFsaWRlbGVtZW50CisgKiBAcGFyYW0gez9vYmplY3R9IG9iamVjdAorICogQHJl dHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgb2JqZWN0YCBpcyBhIHZhbGlkIGNvbXBvbmVudC4KKyAq IEBmaW5hbAorICovCitSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQgPSBmdW5jdGlvbiAob2Jq ZWN0KSB7CisgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09 IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7Cit9OworCitt b2R1bGUuZXhwb3J0cyA9IFJlYWN0RWxlbWVudDsKK30seyIxNCI6MTQsIjE3IjoxNywiMzMiOjMz LCI0OCI6NDgsIjQ5Ijo0OX1dLDE3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsK Ky8qKgorICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCBy aWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRl ciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4g dGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3Jh bnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUg aW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKKwor Ly8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50IHR5cGUuIElmIHRoZXJl IGlzIG5vIG5hdGl2ZSBTeW1ib2wKKy8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJl ciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS4KKwordmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IHR5 cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sWydmb3InXSAmJiBTeW1ib2xbJ2Zv ciddKCdyZWFjdC5lbGVtZW50JykgfHwgMHhlYWM3OworCittb2R1bGUuZXhwb3J0cyA9IFJFQUNU X0VMRU1FTlRfVFlQRTsKK30se31dLDE4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRz KXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFs bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1 bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUg aW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwg Z3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZp bGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisvKioKKyAqIFJlYWN0RWxlbWVu dFZhbGlkYXRvciBwcm92aWRlcyBhIHdyYXBwZXIgYXJvdW5kIGEgZWxlbWVudCBmYWN0b3J5Cisg KiB3aGljaCB2YWxpZGF0ZXMgdGhlIHByb3BzIHBhc3NlZCB0byB0aGUgZWxlbWVudC4gVGhpcyBp cyBpbnRlbmRlZCB0byBiZQorICogdXNlZCBvbmx5IGluIERFViBhbmQgY291bGQgYmUgcmVwbGFj ZWQgYnkgYSBzdGF0aWMgdHlwZSBjaGVja2VyIGZvciBsYW5ndWFnZXMKKyAqIHRoYXQgc3VwcG9y dCBpdC4KKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBSZWFjdEN1cnJlbnRPd25lciA9IF9k ZXJlcV8oMTQpOwordmFyIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSBfZGVyZXFfKDEyKTsKK3Zh ciBSZWFjdEVsZW1lbnQgPSBfZGVyZXFfKDE2KTsKKwordmFyIGNoZWNrUmVhY3RUeXBlU3BlYyA9 IF9kZXJlcV8oMzQpOworCit2YXIgY2FuRGVmaW5lUHJvcGVydHkgPSBfZGVyZXFfKDMzKTsKK3Zh ciBnZXRJdGVyYXRvckZuID0gX2RlcmVxXygzNik7Cit2YXIgd2FybmluZyA9IF9kZXJlcV8oNDgp OworCitmdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSB7CisgIGlmIChSZWFj dEN1cnJlbnRPd25lci5jdXJyZW50KSB7CisgICAgdmFyIG5hbWUgPSBSZWFjdEN1cnJlbnRPd25l ci5jdXJyZW50LmdldE5hbWUoKTsKKyAgICBpZiAobmFtZSkgeworICAgICAgcmV0dXJuICcgQ2hl Y2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJzsKKyAgICB9CisgIH0KKyAg cmV0dXJuICcnOworfQorCisvKioKKyAqIFdhcm4gaWYgdGhlcmUncyBubyBrZXkgZXhwbGljaXRs eSBzZXQgb24gZHluYW1pYyBhcnJheXMgb2YgY2hpbGRyZW4gb3IKKyAqIG9iamVjdCBrZXlzIGFy ZSBub3QgdmFsaWQuIFRoaXMgYWxsb3dzIHVzIHRvIGtlZXAgdHJhY2sgb2YgY2hpbGRyZW4gYmV0 d2VlbgorICogdXBkYXRlcy4KKyAqLwordmFyIG93bmVySGFzS2V5VXNlV2FybmluZyA9IHt9Owor CitmdW5jdGlvbiBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpIHsKKyAg dmFyIGluZm8gPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTsKKworICBpZiAoIWluZm8p IHsKKyAgICB2YXIgcGFyZW50TmFtZSA9IHR5cGVvZiBwYXJlbnRUeXBlID09PSAnc3RyaW5nJyA/ IHBhcmVudFR5cGUgOiBwYXJlbnRUeXBlLmRpc3BsYXlOYW1lIHx8IHBhcmVudFR5cGUubmFtZTsK KyAgICBpZiAocGFyZW50TmFtZSkgeworICAgICAgaW5mbyA9ICcgQ2hlY2sgdGhlIHRvcC1sZXZl bCByZW5kZXIgY2FsbCB1c2luZyA8JyArIHBhcmVudE5hbWUgKyAnPi4nOworICAgIH0KKyAgfQor ICByZXR1cm4gaW5mbzsKK30KKworLyoqCisgKiBXYXJuIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3Qg aGF2ZSBhbiBleHBsaWNpdCBrZXkgYXNzaWduZWQgdG8gaXQuCisgKiBUaGlzIGVsZW1lbnQgaXMg aW4gYW4gYXJyYXkuIFRoZSBhcnJheSBjb3VsZCBncm93IGFuZCBzaHJpbmsgb3IgYmUKKyAqIHJl b3JkZXJlZC4gQWxsIGNoaWxkcmVuIHRoYXQgaGF2ZW4ndCBhbHJlYWR5IGJlZW4gdmFsaWRhdGVk IGFyZSByZXF1aXJlZCB0bworICogaGF2ZSBhICJrZXkiIHByb3BlcnR5IGFzc2lnbmVkIHRvIGl0 LiBFcnJvciBzdGF0dXNlcyBhcmUgY2FjaGVkIHNvIGEgd2FybmluZworICogd2lsbCBvbmx5IGJl IHNob3duIG9uY2UuCisgKgorICogQGludGVybmFsCisgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0g ZWxlbWVudCBFbGVtZW50IHRoYXQgcmVxdWlyZXMgYSBrZXkuCisgKiBAcGFyYW0geyp9IHBhcmVu dFR5cGUgZWxlbWVudCdzIHBhcmVudCdzIHR5cGUuCisgKi8KK2Z1bmN0aW9uIHZhbGlkYXRlRXhw bGljaXRLZXkoZWxlbWVudCwgcGFyZW50VHlwZSkgeworICBpZiAoIWVsZW1lbnQuX3N0b3JlIHx8 IGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCB8fCBlbGVtZW50LmtleSAhPSBudWxsKSB7CisgICAg cmV0dXJuOworICB9CisgIGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7CisKKyAgdmFy IG1lbW9pemVyID0gb3duZXJIYXNLZXlVc2VXYXJuaW5nLnVuaXF1ZUtleSB8fCAob3duZXJIYXNL ZXlVc2VXYXJuaW5nLnVuaXF1ZUtleSA9IHt9KTsKKworICB2YXIgY3VycmVudENvbXBvbmVudEVy cm9ySW5mbyA9IGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSk7CisgIGlm IChtZW1vaXplcltjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSkgeworICAgIHJldHVybjsKKyAg fQorICBtZW1vaXplcltjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSA9IHRydWU7CisKKyAgLy8g VXN1YWxseSB0aGUgY3VycmVudCBvd25lciBpcyB0aGUgb2ZmZW5kZXIsIGJ1dCBpZiBpdCBhY2Nl cHRzIGNoaWxkcmVuIGFzIGEKKyAgLy8gcHJvcGVydHksIGl0IG1heSBiZSB0aGUgY3JlYXRvciBv ZiB0aGUgY2hpbGQgdGhhdCdzIHJlc3BvbnNpYmxlIGZvcgorICAvLyBhc3NpZ25pbmcgaXQgYSBr ZXkuCisgIHZhciBjaGlsZE93bmVyID0gJyc7CisgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQuX293 bmVyICYmIGVsZW1lbnQuX293bmVyICE9PSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7Cisg ICAgLy8gR2l2ZSB0aGUgY29tcG9uZW50IHRoYXQgb3JpZ2luYWxseSBjcmVhdGVkIHRoaXMgY2hp bGQuCisgICAgY2hpbGRPd25lciA9ICcgSXQgd2FzIHBhc3NlZCBhIGNoaWxkIGZyb20gJyArIGVs ZW1lbnQuX293bmVyLmdldE5hbWUoKSArICcuJzsKKyAgfQorCisgICJkZXZlbG9wbWVudCIgIT09 ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdFYWNoIGNoaWxkIGluIGFuIGFycmF5IG9y IGl0ZXJhdG9yIHNob3VsZCBoYXZlIGEgdW5pcXVlICJrZXkiIHByb3AuJyArICclcyVzIFNlZSBo dHRwczovL2ZiLm1lL3JlYWN0LXdhcm5pbmcta2V5cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4lcycs IGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8sIGNoaWxkT3duZXIsIFJlYWN0Q29tcG9uZW50VHJl ZUhvb2suZ2V0Q3VycmVudFN0YWNrQWRkZW5kdW0oZWxlbWVudCkpIDogdm9pZCAwOworfQorCisv KioKKyAqIEVuc3VyZSB0aGF0IGV2ZXJ5IGVsZW1lbnQgZWl0aGVyIGlzIHBhc3NlZCBpbiBhIHN0 YXRpYyBsb2NhdGlvbiwgaW4gYW4KKyAqIGFycmF5IHdpdGggYW4gZXhwbGljaXQga2V5cyBwcm9w ZXJ0eSBkZWZpbmVkLCBvciBpbiBhbiBvYmplY3QgbGl0ZXJhbAorICogd2l0aCB2YWxpZCBrZXkg cHJvcGVydHkuCisgKgorICogQGludGVybmFsCisgKiBAcGFyYW0ge1JlYWN0Tm9kZX0gbm9kZSBT dGF0aWNhbGx5IHBhc3NlZCBjaGlsZCBvZiBhbnkgdHlwZS4KKyAqIEBwYXJhbSB7Kn0gcGFyZW50 VHlwZSBub2RlJ3MgcGFyZW50J3MgdHlwZS4KKyAqLworZnVuY3Rpb24gdmFsaWRhdGVDaGlsZEtl eXMobm9kZSwgcGFyZW50VHlwZSkgeworICBpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnKSB7 CisgICAgcmV0dXJuOworICB9CisgIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7CisgICAgZm9y ICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7CisgICAgICB2YXIgY2hpbGQgPSBu b2RlW2ldOworICAgICAgaWYgKFJlYWN0RWxlbWVudC5pc1ZhbGlkRWxlbWVudChjaGlsZCkpIHsK KyAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShjaGlsZCwgcGFyZW50VHlwZSk7CisgICAgICB9 CisgICAgfQorICB9IGVsc2UgaWYgKFJlYWN0RWxlbWVudC5pc1ZhbGlkRWxlbWVudChub2RlKSkg eworICAgIC8vIFRoaXMgZWxlbWVudCB3YXMgcGFzc2VkIGluIGEgdmFsaWQgbG9jYXRpb24uCisg ICAgaWYgKG5vZGUuX3N0b3JlKSB7CisgICAgICBub2RlLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVl OworICAgIH0KKyAgfSBlbHNlIGlmIChub2RlKSB7CisgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJ dGVyYXRvckZuKG5vZGUpOworICAgIC8vIEVudHJ5IGl0ZXJhdG9ycyBwcm92aWRlIGltcGxpY2l0 IGtleXMuCisgICAgaWYgKGl0ZXJhdG9yRm4pIHsKKyAgICAgIGlmIChpdGVyYXRvckZuICE9PSBu b2RlLmVudHJpZXMpIHsKKyAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG5v ZGUpOworICAgICAgICB2YXIgc3RlcDsKKyAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9y Lm5leHQoKSkuZG9uZSkgeworICAgICAgICAgIGlmIChSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1l bnQoc3RlcC52YWx1ZSkpIHsKKyAgICAgICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoc3RlcC52 YWx1ZSwgcGFyZW50VHlwZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAg fQorICB9Cit9CisKKy8qKgorICogR2l2ZW4gYW4gZWxlbWVudCwgdmFsaWRhdGUgdGhhdCBpdHMg cHJvcHMgZm9sbG93IHRoZSBwcm9wVHlwZXMgZGVmaW5pdGlvbiwKKyAqIHByb3ZpZGVkIGJ5IHRo ZSB0eXBlLgorICoKKyAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50CisgKi8KK2Z1bmN0 aW9uIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpIHsKKyAgdmFyIGNvbXBvbmVudENsYXNzID0g ZWxlbWVudC50eXBlOworICBpZiAodHlwZW9mIGNvbXBvbmVudENsYXNzICE9PSAnZnVuY3Rpb24n KSB7CisgICAgcmV0dXJuOworICB9CisgIHZhciBuYW1lID0gY29tcG9uZW50Q2xhc3MuZGlzcGxh eU5hbWUgfHwgY29tcG9uZW50Q2xhc3MubmFtZTsKKyAgaWYgKGNvbXBvbmVudENsYXNzLnByb3BU eXBlcykgeworICAgIGNoZWNrUmVhY3RUeXBlU3BlYyhjb21wb25lbnRDbGFzcy5wcm9wVHlwZXMs IGVsZW1lbnQucHJvcHMsICdwcm9wJywgbmFtZSwgZWxlbWVudCwgbnVsbCk7CisgIH0KKyAgaWYg KHR5cGVvZiBjb21wb25lbnRDbGFzcy5nZXREZWZhdWx0UHJvcHMgPT09ICdmdW5jdGlvbicpIHsK KyAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGNvbXBvbmVudENs YXNzLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCwgJ2dldERlZmF1bHRQcm9w cyBpcyBvbmx5IHVzZWQgb24gY2xhc3NpYyBSZWFjdC5jcmVhdGVDbGFzcyAnICsgJ2RlZmluaXRp b25zLiBVc2UgYSBzdGF0aWMgcHJvcGVydHkgbmFtZWQgYGRlZmF1bHRQcm9wc2AgaW5zdGVhZC4n KSA6IHZvaWQgMDsKKyAgfQorfQorCit2YXIgUmVhY3RFbGVtZW50VmFsaWRhdG9yID0geworCisg IGNyZWF0ZUVsZW1lbnQ6IGZ1bmN0aW9uICh0eXBlLCBwcm9wcywgY2hpbGRyZW4pIHsKKyAgICB2 YXIgdmFsaWRUeXBlID0gdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09 PSAnZnVuY3Rpb24nOworICAgIC8vIFdlIHdhcm4gaW4gdGhpcyBjYXNlIGJ1dCBkb24ndCB0aHJv dy4gV2UgZXhwZWN0IHRoZSBlbGVtZW50IGNyZWF0aW9uIHRvCisgICAgLy8gc3VjY2VlZCBhbmQg dGhlcmUgd2lsbCBsaWtlbHkgYmUgZXJyb3JzIGluIHJlbmRlci4KKyAgICBpZiAoIXZhbGlkVHlw ZSkgeworICAgICAgaWYgKHR5cGVvZiB0eXBlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB0eXBl ICE9PSAnc3RyaW5nJykgeworICAgICAgICB2YXIgaW5mbyA9ICcnOworICAgICAgICBpZiAodHlw ZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBu dWxsICYmIE9iamVjdC5rZXlzKHR5cGUpLmxlbmd0aCA9PT0gMCkgeworICAgICAgICAgIGluZm8g Kz0gJyBZb3UgbGlrZWx5IGZvcmdvdCB0byBleHBvcnQgeW91ciBjb21wb25lbnQgZnJvbSB0aGUg ZmlsZSAnICsgJ2l0XCdzIGRlZmluZWQgaW4uJzsKKyAgICAgICAgfQorICAgICAgICBpbmZvICs9 IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpOworICAgICAgICAiZGV2ZWxvcG1lbnQiICE9 PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnUmVhY3QuY3JlYXRlRWxlbWVudDogdHlw ZSBpcyBpbnZhbGlkIC0tIGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgJyArICdidWlsdC1pbiBjb21w b25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlICcgKyAnY29tcG9uZW50 cykgYnV0IGdvdDogJXMuJXMnLCB0eXBlID09IG51bGwgPyB0eXBlIDogdHlwZW9mIHR5cGUsIGlu Zm8pIDogdm9pZCAwOworICAgICAgfQorICAgIH0KKworICAgIHZhciBlbGVtZW50ID0gUmVhY3RF bGVtZW50LmNyZWF0ZUVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKworICAgIC8vIFRo ZSByZXN1bHQgY2FuIGJlIG51bGxpc2ggaWYgYSBtb2NrIG9yIGEgY3VzdG9tIGZ1bmN0aW9uIGlz IHVzZWQuCisgICAgLy8gVE9ETzogRHJvcCB0aGlzIHdoZW4gdGhlc2UgYXJlIG5vIGxvbmdlciBh bGxvd2VkIGFzIHRoZSB0eXBlIGFyZ3VtZW50LgorICAgIGlmIChlbGVtZW50ID09IG51bGwpIHsK KyAgICAgIHJldHVybiBlbGVtZW50OworICAgIH0KKworICAgIC8vIFNraXAga2V5IHdhcm5pbmcg aWYgdGhlIHR5cGUgaXNuJ3QgdmFsaWQgc2luY2Ugb3VyIGtleSB2YWxpZGF0aW9uIGxvZ2ljCisg ICAgLy8gZG9lc24ndCBleHBlY3QgYSBub24tc3RyaW5nL2Z1bmN0aW9uIHR5cGUgYW5kIGNhbiB0 aHJvdyBjb25mdXNpbmcgZXJyb3JzLgorICAgIC8vIFdlIGRvbid0IHdhbnQgZXhjZXB0aW9uIGJl aGF2aW9yIHRvIGRpZmZlciBiZXR3ZWVuIGRldiBhbmQgcHJvZC4KKyAgICAvLyAoUmVuZGVyaW5n IHdpbGwgdGhyb3cgd2l0aCBhIGhlbHBmdWwgbWVzc2FnZSBhbmQgYXMgc29vbiBhcyB0aGUgdHlw ZSBpcworICAgIC8vIGZpeGVkLCB0aGUga2V5IHdhcm5pbmdzIHdpbGwgYXBwZWFyLikKKyAgICBp ZiAodmFsaWRUeXBlKSB7CisgICAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5n dGg7IGkrKykgeworICAgICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhhcmd1bWVudHNbaV0sIHR5cGUp OworICAgICAgfQorICAgIH0KKworICAgIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpOworCisg ICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgY3JlYXRlRmFjdG9yeTogZnVuY3Rpb24gKHR5 cGUpIHsKKyAgICB2YXIgdmFsaWRhdGVkRmFjdG9yeSA9IFJlYWN0RWxlbWVudFZhbGlkYXRvci5j cmVhdGVFbGVtZW50LmJpbmQobnVsbCwgdHlwZSk7CisgICAgLy8gTGVnYWN5IGhvb2sgVE9ETzog V2FybiBpZiB0aGlzIGlzIGFjY2Vzc2VkCisgICAgdmFsaWRhdGVkRmFjdG9yeS50eXBlID0gdHlw ZTsKKworICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIGlm IChjYW5EZWZpbmVQcm9wZXJ0eSkgeworICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodmFs aWRhdGVkRmFjdG9yeSwgJ3R5cGUnLCB7CisgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCisg ICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAiZGV2ZWxvcG1lbnQiICE9 PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnRmFjdG9yeS50eXBlIGlzIGRlcHJlY2F0 ZWQuIEFjY2VzcyB0aGUgY2xhc3MgZGlyZWN0bHkgJyArICdiZWZvcmUgcGFzc2luZyBpdCB0byBj cmVhdGVGYWN0b3J5LicpIDogdm9pZCAwOworICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3Bl cnR5KHRoaXMsICd0eXBlJywgeworICAgICAgICAgICAgICB2YWx1ZTogdHlwZQorICAgICAgICAg ICAgfSk7CisgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgICB9CisgICAgICAgIH0p OworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB2YWxpZGF0ZWRGYWN0b3J5OworICB9LAor CisgIGNsb25lRWxlbWVudDogZnVuY3Rpb24gKGVsZW1lbnQsIHByb3BzLCBjaGlsZHJlbikgewor ICAgIHZhciBuZXdFbGVtZW50ID0gUmVhY3RFbGVtZW50LmNsb25lRWxlbWVudC5hcHBseSh0aGlz LCBhcmd1bWVudHMpOworICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsg aSsrKSB7CisgICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhhcmd1bWVudHNbaV0sIG5ld0VsZW1lbnQu dHlwZSk7CisgICAgfQorICAgIHZhbGlkYXRlUHJvcFR5cGVzKG5ld0VsZW1lbnQpOworICAgIHJl dHVybiBuZXdFbGVtZW50OworICB9CisKK307CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RFbGVt ZW50VmFsaWRhdG9yOworfSx7IjEyIjoxMiwiMTQiOjE0LCIxNiI6MTYsIjMzIjozMywiMzQiOjM0 LCIzNiI6MzYsIjQ4Ijo0OH1dLDE5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsK Ky8qKgorICogQ29weXJpZ2h0IDIwMTUtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCBy aWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRl ciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4g dGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3Jh bnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUg aW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBf cHJvZEludmFyaWFudCA9IF9kZXJlcV8oMzgpOworCit2YXIgUmVhY3RDaGlsZHJlbiA9IF9kZXJl cV8oOSk7Cit2YXIgUmVhY3RFbGVtZW50ID0gX2RlcmVxXygxNik7CisKK3ZhciBlbXB0eUZ1bmN0 aW9uID0gX2RlcmVxXyg0NCk7Cit2YXIgaW52YXJpYW50ID0gX2RlcmVxXyg0Nik7Cit2YXIgd2Fy bmluZyA9IF9kZXJlcV8oNDgpOworCisvKioKKyAqIFdlIHVzZWQgdG8gYWxsb3cga2V5ZWQgb2Jq ZWN0cyB0byBzZXJ2ZSBhcyBhIGNvbGxlY3Rpb24gb2YgUmVhY3RFbGVtZW50cywKKyAqIG9yIG5l c3RlZCBzZXRzLiBUaGlzIGFsbG93ZWQgdXMgYSB3YXkgdG8gZXhwbGljaXRseSBrZXkgYSBzZXQg b3IgZnJhZ21lbnQgb2YKKyAqIGNvbXBvbmVudHMuIFRoaXMgaXMgbm93IGJlaW5nIHJlcGxhY2Vk IHdpdGggYW4gb3BhcXVlIGRhdGEgc3RydWN0dXJlLgorICogVGhlIHVwZ3JhZGUgcGF0aCBpcyB0 byBjYWxsIFJlYWN0LmFkZG9ucy5jcmVhdGVGcmFnbWVudCh7IGtleTogdmFsdWUgfSkgdG8KKyAq IGNyZWF0ZSBhIGtleWVkIGZyYWdtZW50LiBUaGUgcmVzdWx0aW5nIGRhdGEgc3RydWN0dXJlIGlz IGFuIGFycmF5LgorICovCisKK3ZhciBudW1lcmljUHJvcGVydHlSZWdleCA9IC9eXGQrJC87CisK K3ZhciB3YXJuZWRBYm91dE51bWVyaWMgPSBmYWxzZTsKKwordmFyIFJlYWN0RnJhZ21lbnQgPSB7 CisgIC8qKgorICAgKiBXcmFwIGEga2V5ZWQgb2JqZWN0IGluIGFuIG9wYXF1ZSBwcm94eSB0aGF0 IHdhcm5zIHlvdSBpZiB5b3UgYWNjZXNzIGFueQorICAgKiBvZiBpdHMgcHJvcGVydGllcy4KKyAg ICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvY3JlYXRlLWZyYWdt ZW50Lmh0bWwKKyAgICovCisgIGNyZWF0ZTogZnVuY3Rpb24gKG9iamVjdCkgeworICAgIGlmICh0 eXBlb2Ygb2JqZWN0ICE9PSAnb2JqZWN0JyB8fCAhb2JqZWN0IHx8IEFycmF5LmlzQXJyYXkob2Jq ZWN0KSkgeworICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhm YWxzZSwgJ1JlYWN0LmFkZG9ucy5jcmVhdGVGcmFnbWVudCBvbmx5IGFjY2VwdHMgYSBzaW5nbGUg b2JqZWN0LiBHb3Q6ICVzJywgb2JqZWN0KSA6IHZvaWQgMDsKKyAgICAgIHJldHVybiBvYmplY3Q7 CisgICAgfQorICAgIGlmIChSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQob2JqZWN0KSkgewor ICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1Jl YWN0LmFkZG9ucy5jcmVhdGVGcmFnbWVudCBkb2VzIG5vdCBhY2NlcHQgYSBSZWFjdEVsZW1lbnQg JyArICd3aXRob3V0IGEgd3JhcHBlciBvYmplY3QuJykgOiB2b2lkIDA7CisgICAgICByZXR1cm4g b2JqZWN0OworICAgIH0KKworICAgICEob2JqZWN0Lm5vZGVUeXBlICE9PSAxKSA/ICJkZXZlbG9w bWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0LmFkZG9ucy5j cmVhdGVGcmFnbWVudCguLi4pOiBFbmNvdW50ZXJlZCBhbiBpbnZhbGlkIGNoaWxkOyBET00gZWxl bWVudHMgYXJlIG5vdCB2YWxpZCBjaGlsZHJlbiBvZiBSZWFjdCBjb21wb25lbnRzLicpIDogX3By b2RJbnZhcmlhbnQoJzAnKSA6IHZvaWQgMDsKKworICAgIHZhciByZXN1bHQgPSBbXTsKKworICAg IGZvciAodmFyIGtleSBpbiBvYmplY3QpIHsKKyAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAn cHJvZHVjdGlvbicpIHsKKyAgICAgICAgaWYgKCF3YXJuZWRBYm91dE51bWVyaWMgJiYgbnVtZXJp Y1Byb3BlcnR5UmVnZXgudGVzdChrZXkpKSB7CisgICAgICAgICAgImRldmVsb3BtZW50IiAhPT0g J3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1JlYWN0LmFkZG9ucy5jcmVhdGVGcmFnbWVu dCguLi4pOiBDaGlsZCBvYmplY3RzIHNob3VsZCBoYXZlICcgKyAnbm9uLW51bWVyaWMga2V5cyBz byBvcmRlcmluZyBpcyBwcmVzZXJ2ZWQuJykgOiB2b2lkIDA7CisgICAgICAgICAgd2FybmVkQWJv dXROdW1lcmljID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgUmVhY3RDaGlsZHJl bi5tYXBJbnRvV2l0aEtleVByZWZpeEludGVybmFsKG9iamVjdFtrZXldLCByZXN1bHQsIGtleSwg ZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc0FyZ3VtZW50KTsKKyAgICB9CisKKyAgICByZXR1cm4g cmVzdWx0OworICB9Cit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0RnJhZ21lbnQ7Cit9LHsi MTYiOjE2LCIzOCI6MzgsIjQ0Ijo0NCwiNDYiOjQ2LCI0OCI6NDgsIjkiOjl9XSwyMDpbZnVuY3Rp b24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNl bnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMg c291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5k IGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNv dXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBi ZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisg Ki8KKworJ3VzZSBzdHJpY3QnOworCisvKioKKyAqIFJlYWN0TGluayBlbmNhcHN1bGF0ZXMgYSBj b21tb24gcGF0dGVybiBpbiB3aGljaCBhIGNvbXBvbmVudCB3YW50cyB0byBtb2RpZnkKKyAqIGEg cHJvcCByZWNlaXZlZCBmcm9tIGl0cyBwYXJlbnQuIFJlYWN0TGluayBhbGxvd3MgdGhlIHBhcmVu dCB0byBwYXNzIGRvd24gYQorICogdmFsdWUgY291cGxlZCB3aXRoIGEgY2FsbGJhY2sgdGhhdCwg d2hlbiBpbnZva2VkLCBleHByZXNzZXMgYW4gaW50ZW50IHRvCisgKiBtb2RpZnkgdGhhdCB2YWx1 ZS4gRm9yIGV4YW1wbGU6CisgKgorICogUmVhY3QuY3JlYXRlQ2xhc3MoeworICogICBnZXRJbml0 aWFsU3RhdGU6IGZ1bmN0aW9uKCkgeworICogICAgIHJldHVybiB7dmFsdWU6ICcnfTsKKyAqICAg fSwKKyAqICAgcmVuZGVyOiBmdW5jdGlvbigpIHsKKyAqICAgICB2YXIgdmFsdWVMaW5rID0gbmV3 IFJlYWN0TGluayh0aGlzLnN0YXRlLnZhbHVlLCB0aGlzLl9oYW5kbGVWYWx1ZUNoYW5nZSk7Cisg KiAgICAgcmV0dXJuIDxpbnB1dCB2YWx1ZUxpbms9e3ZhbHVlTGlua30gLz47CisgKiAgIH0sCisg KiAgIF9oYW5kbGVWYWx1ZUNoYW5nZTogZnVuY3Rpb24obmV3VmFsdWUpIHsKKyAqICAgICB0aGlz LnNldFN0YXRlKHt2YWx1ZTogbmV3VmFsdWV9KTsKKyAqICAgfQorICogfSk7CisgKgorICogV2Ug aGF2ZSBwcm92aWRlZCBzb21lIHN1Z2FyeSBtaXhpbnMgdG8gbWFrZSB0aGUgY3JlYXRpb24gYW5k CisgKiBjb25zdW1wdGlvbiBvZiBSZWFjdExpbmsgZWFzaWVyOyBzZWUgTGlua2VkVmFsdWVVdGls cyBhbmQgTGlua2VkU3RhdGVNaXhpbi4KKyAqLworCit2YXIgUmVhY3QgPSBfZGVyZXFfKDUpOwor CisvKioKKyAqIERlcHJlY2F0ZWQ6IEFuIGFuIGVhc3kgd2F5IHRvIGV4cHJlc3MgdHdvLXdheSBi aW5kaW5nIHdpdGggUmVhY3QuIAorICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3Jl YWN0L2RvY3MvdHdvLXdheS1iaW5kaW5nLWhlbHBlcnMuaHRtbAorICoKKyAqIEBwYXJhbSB7Kn0g dmFsdWUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbGluaworICogQHBhcmFtIHtmdW5jdGlvbn0gcmVx dWVzdENoYW5nZSBjYWxsYmFjayB0byByZXF1ZXN0IGEgY2hhbmdlCisgKi8KK2Z1bmN0aW9uIFJl YWN0TGluayh2YWx1ZSwgcmVxdWVzdENoYW5nZSkgeworICB0aGlzLnZhbHVlID0gdmFsdWU7Cisg IHRoaXMucmVxdWVzdENoYW5nZSA9IHJlcXVlc3RDaGFuZ2U7Cit9CisKKy8qKgorICogQ3JlYXRl cyBhIFByb3BUeXBlIHRoYXQgZW5mb3JjZXMgdGhlIFJlYWN0TGluayBBUEkgYW5kIG9wdGlvbmFs bHkgY2hlY2tzIHRoZQorICogdHlwZSBvZiB0aGUgdmFsdWUgYmVpbmcgcGFzc2VkIGluc2lkZSB0 aGUgbGluay4gRXhhbXBsZToKKyAqCisgKiBNeUNvbXBvbmVudC5wcm9wVHlwZXMgPSB7CisgKiAg IHRhYkluZGV4TGluazogUmVhY3RMaW5rLlByb3BUeXBlcy5saW5rKFJlYWN0LlByb3BUeXBlcy5u dW1iZXIpCisgKiB9CisgKi8KK2Z1bmN0aW9uIGNyZWF0ZUxpbmtUeXBlQ2hlY2tlcihsaW5rVHlw ZSkgeworICB2YXIgc2hhcGVzID0geworICAgIHZhbHVlOiBsaW5rVHlwZSA9PT0gdW5kZWZpbmVk ID8gUmVhY3QuUHJvcFR5cGVzLmFueS5pc1JlcXVpcmVkIDogbGlua1R5cGUuaXNSZXF1aXJlZCwK KyAgICByZXF1ZXN0Q2hhbmdlOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkCisgIH07 CisgIHJldHVybiBSZWFjdC5Qcm9wVHlwZXMuc2hhcGUoc2hhcGVzKTsKK30KKworUmVhY3RMaW5r LlByb3BUeXBlcyA9IHsKKyAgbGluazogY3JlYXRlTGlua1R5cGVDaGVja2VyCit9OworCittb2R1 bGUuZXhwb3J0cyA9IFJlYWN0TGluazsKK30seyI1Ijo1fV0sMjE6W2Z1bmN0aW9uKF9kZXJlcV8s bW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxNS1wcmVzZW50LCBGYWNlYm9v aywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2Rl IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAq IExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4g QW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4g dGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ug c3RyaWN0JzsKKwordmFyIHdhcm5pbmcgPSBfZGVyZXFfKDQ4KTsKKworZnVuY3Rpb24gd2Fybk5v b3AocHVibGljSW5zdGFuY2UsIGNhbGxlck5hbWUpIHsKKyAgaWYgKCJkZXZlbG9wbWVudCIgIT09 ICdwcm9kdWN0aW9uJykgeworICAgIHZhciBjb25zdHJ1Y3RvciA9IHB1YmxpY0luc3RhbmNlLmNv bnN0cnVjdG9yOworICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmco ZmFsc2UsICclcyguLi4pOiBDYW4gb25seSB1cGRhdGUgYSBtb3VudGVkIG9yIG1vdW50aW5nIGNv bXBvbmVudC4gJyArICdUaGlzIHVzdWFsbHkgbWVhbnMgeW91IGNhbGxlZCAlcygpIG9uIGFuIHVu bW91bnRlZCBjb21wb25lbnQuICcgKyAnVGhpcyBpcyBhIG5vLW9wLiBQbGVhc2UgY2hlY2sgdGhl IGNvZGUgZm9yIHRoZSAlcyBjb21wb25lbnQuJywgY2FsbGVyTmFtZSwgY2FsbGVyTmFtZSwgY29u c3RydWN0b3IgJiYgKGNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IGNvbnN0cnVjdG9yLm5hbWUp IHx8ICdSZWFjdENsYXNzJykgOiB2b2lkIDA7CisgIH0KK30KKworLyoqCisgKiBUaGlzIGlzIHRo ZSBhYnN0cmFjdCBBUEkgZm9yIGFuIHVwZGF0ZSBxdWV1ZS4KKyAqLwordmFyIFJlYWN0Tm9vcFVw ZGF0ZVF1ZXVlID0geworCisgIC8qKgorICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhpcyBj b21wb3NpdGUgY29tcG9uZW50IGlzIG1vdW50ZWQuCisgICAqIEBwYXJhbSB7UmVhY3RDbGFzc30g cHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHdlIHdhbnQgdG8gdGVzdC4KKyAgICogQHJldHVy biB7Ym9vbGVhbn0gVHJ1ZSBpZiBtb3VudGVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAqIEBwcm90 ZWN0ZWQKKyAgICogQGZpbmFsCisgICAqLworICBpc01vdW50ZWQ6IGZ1bmN0aW9uIChwdWJsaWNJ bnN0YW5jZSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfSwKKworICAvKioKKyAgICogRW5xdWV1 ZSBhIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBhZnRlciBhbGwgdGhlIHBlbmRpbmcg dXBkYXRlcworICAgKiBoYXZlIHByb2Nlc3NlZC4KKyAgICoKKyAgICogQHBhcmFtIHtSZWFjdENs YXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdG8gdXNlIGFzIGB0aGlzYCBjb250ZXh0 LgorICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHN0YXRlIGlz IHVwZGF0ZWQuCisgICAqIEBpbnRlcm5hbAorICAgKi8KKyAgZW5xdWV1ZUNhbGxiYWNrOiBmdW5j dGlvbiAocHVibGljSW5zdGFuY2UsIGNhbGxiYWNrKSB7fSwKKworICAvKioKKyAgICogRm9yY2Vz IGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24g d2l0aAorICAgKiBjZXJ0YWludHkgdGhhdCB3ZSBhcmUgKipub3QqKiBpbiBhIERPTSB0cmFuc2Fj dGlvbi4KKyAgICoKKyAgICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93 IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZQorICAgKiBjb21wb25lbnQncyBzdGF0ZSBo YXMgY2hhbmdlZCBidXQgYHNldFN0YXRlYCB3YXMgbm90IGNhbGxlZC4KKyAgICoKKyAgICogVGhp cyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGlu dm9rZQorICAgKiBgY29tcG9uZW50V2lsbFVwZGF0ZWAgYW5kIGBjb21wb25lbnREaWRVcGRhdGVg LgorICAgKgorICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0 YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci4KKyAgICogQGludGVybmFsCisgICAqLworICBlbnF1 ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSkgeworICAgIHdhcm5Ob29w KHB1YmxpY0luc3RhbmNlLCAnZm9yY2VVcGRhdGUnKTsKKyAgfSwKKworICAvKioKKyAgICogUmVw bGFjZXMgYWxsIG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIG9yIGBzZXRTdGF0ZWAgdG8g bXV0YXRlIHN0YXRlLgorICAgKiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11 dGFibGUuCisgICAqCisgICAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRl YCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvCisgICAqIGFjY2Vzc2luZyBgdGhpcy5z dGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUu CisgICAqCisgICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3Rh bmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLgorICAgKiBAcGFyYW0ge29iamVjdH0gY29tcGxldGVT dGF0ZSBOZXh0IHN0YXRlLgorICAgKiBAaW50ZXJuYWwKKyAgICovCisgIGVucXVldWVSZXBsYWNl U3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY29tcGxldGVTdGF0ZSkgeworICAgIHdh cm5Ob29wKHB1YmxpY0luc3RhbmNlLCAncmVwbGFjZVN0YXRlJyk7CisgIH0sCisKKyAgLyoqCisg ICAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBUaGlzIG9ubHkgZXhpc3RzIGJlY2F1c2Ug X3BlbmRpbmdTdGF0ZSBpcworICAgKiBpbnRlcm5hbC4gVGhpcyBwcm92aWRlcyBhIG1lcmdpbmcg c3RyYXRlZ3kgdGhhdCBpcyBub3QgYXZhaWxhYmxlIHRvIGRlZXAKKyAgICogcHJvcGVydGllcyB3 aGljaCBpcyBjb25mdXNpbmcuIFRPRE86IEV4cG9zZSBwZW5kaW5nU3RhdGUgb3IgZG9uJ3QgdXNl IGl0CisgICAqIGR1cmluZyB0aGUgbWVyZ2UuCisgICAqCisgICAqIEBwYXJhbSB7UmVhY3RDbGFz c30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLgorICAg KiBAcGFyYW0ge29iamVjdH0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBt ZXJnZWQgd2l0aCBzdGF0ZS4KKyAgICogQGludGVybmFsCisgICAqLworICBlbnF1ZXVlU2V0U3Rh dGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgcGFydGlhbFN0YXRlKSB7CisgICAgd2Fybk5v b3AocHVibGljSW5zdGFuY2UsICdzZXRTdGF0ZScpOworICB9Cit9OworCittb2R1bGUuZXhwb3J0 cyA9IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlOworfSx7IjQ4Ijo0OH1dLDIyOltmdW5jdGlvbihfZGVy ZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFj ZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2Ug Y29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhl CisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRy ZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5k IGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAorICov CisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzID0ge307 CisKK2lmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgUmVhY3RQcm9wVHlw ZUxvY2F0aW9uTmFtZXMgPSB7CisgICAgcHJvcDogJ3Byb3AnLAorICAgIGNvbnRleHQ6ICdjb250 ZXh0JywKKyAgICBjaGlsZENvbnRleHQ6ICdjaGlsZCBjb250ZXh0JworICB9OworfQorCittb2R1 bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzOworfSx7fV0sMjM6W2Z1bmN0 aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVz ZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlz IHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3Vu ZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBz b3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4g YmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgor ICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFJlYWN0RWxlbWVudCA9IF9kZXJlcV8oMTYpOwor dmFyIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzID0gX2RlcmVxXygyMik7Cit2YXIgUmVhY3RQ cm9wVHlwZXNTZWNyZXQgPSBfZGVyZXFfKDI0KTsKKwordmFyIGVtcHR5RnVuY3Rpb24gPSBfZGVy ZXFfKDQ0KTsKK3ZhciBnZXRJdGVyYXRvckZuID0gX2RlcmVxXygzNik7Cit2YXIgd2FybmluZyA9 IF9kZXJlcV8oNDgpOworCisvKioKKyAqIENvbGxlY3Rpb24gb2YgbWV0aG9kcyB0aGF0IGFsbG93 IGRlY2xhcmF0aW9uIGFuZCB2YWxpZGF0aW9uIG9mIHByb3BzIHRoYXQgYXJlCisgKiBzdXBwbGll ZCB0byBSZWFjdCBjb21wb25lbnRzLiBFeGFtcGxlIHVzYWdlOgorICoKKyAqICAgdmFyIFByb3Bz ID0gcmVxdWlyZSgnUmVhY3RQcm9wVHlwZXMnKTsKKyAqICAgdmFyIE15QXJ0aWNsZSA9IFJlYWN0 LmNyZWF0ZUNsYXNzKHsKKyAqICAgICBwcm9wVHlwZXM6IHsKKyAqICAgICAgIC8vIEFuIG9wdGlv bmFsIHN0cmluZyBwcm9wIG5hbWVkICJkZXNjcmlwdGlvbiIuCisgKiAgICAgICBkZXNjcmlwdGlv bjogUHJvcHMuc3RyaW5nLAorICoKKyAqICAgICAgIC8vIEEgcmVxdWlyZWQgZW51bSBwcm9wIG5h bWVkICJjYXRlZ29yeSIuCisgKiAgICAgICBjYXRlZ29yeTogUHJvcHMub25lT2YoWydOZXdzJywn UGhvdG9zJ10pLmlzUmVxdWlyZWQsCisgKgorICogICAgICAgLy8gQSBwcm9wIG5hbWVkICJkaWFs b2ciIHRoYXQgcmVxdWlyZXMgYW4gaW5zdGFuY2Ugb2YgRGlhbG9nLgorICogICAgICAgZGlhbG9n OiBQcm9wcy5pbnN0YW5jZU9mKERpYWxvZykuaXNSZXF1aXJlZAorICogICAgIH0sCisgKiAgICAg cmVuZGVyOiBmdW5jdGlvbigpIHsgLi4uIH0KKyAqICAgfSk7CisgKgorICogQSBtb3JlIGZvcm1h bCBzcGVjaWZpY2F0aW9uIG9mIGhvdyB0aGVzZSBtZXRob2RzIGFyZSB1c2VkOgorICoKKyAqICAg dHlwZSA6PSBhcnJheXxib29sfGZ1bmN8b2JqZWN0fG51bWJlcnxzdHJpbmd8b25lT2YoWy4uLl0p fGluc3RhbmNlT2YoLi4uKQorICogICBkZWNsIDo9IFJlYWN0UHJvcFR5cGVzLnt0eXBlfSguaXNS ZXF1aXJlZCk/CisgKgorICogRWFjaCBhbmQgZXZlcnkgZGVjbGFyYXRpb24gcHJvZHVjZXMgYSBm dW5jdGlvbiB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZS4gVGhpcworICogYWxsb3dzIHRoZSBjcmVh dGlvbiBvZiBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvbnMuIEZvciBleGFtcGxlOgorICoKKyAq ICB2YXIgTXlMaW5rID0gUmVhY3QuY3JlYXRlQ2xhc3MoeworICogICAgcHJvcFR5cGVzOiB7Cisg KiAgICAgIC8vIEFuIG9wdGlvbmFsIHN0cmluZyBvciBVUkkgcHJvcCBuYW1lZCAiaHJlZiIuCisg KiAgICAgIGhyZWY6IGZ1bmN0aW9uKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkgewor ICogICAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07CisgKiAgICAgICAgaWYg KHByb3BWYWx1ZSAhPSBudWxsICYmIHR5cGVvZiBwcm9wVmFsdWUgIT09ICdzdHJpbmcnICYmCisg KiAgICAgICAgICAgICEocHJvcFZhbHVlIGluc3RhbmNlb2YgVVJJKSkgeworICogICAgICAgICAg cmV0dXJuIG5ldyBFcnJvcigKKyAqICAgICAgICAgICAgJ0V4cGVjdGVkIGEgc3RyaW5nIG9yIGFu IFVSSSBmb3IgJyArIHByb3BOYW1lICsgJyBpbiAnICsKKyAqICAgICAgICAgICAgY29tcG9uZW50 TmFtZQorICogICAgICAgICAgKTsKKyAqICAgICAgICB9CisgKiAgICAgIH0KKyAqICAgIH0sCisg KiAgICByZW5kZXI6IGZ1bmN0aW9uKCkgey4uLn0KKyAqICB9KTsKKyAqCisgKiBAaW50ZXJuYWwK KyAqLworCit2YXIgQU5PTllNT1VTID0gJzw8YW5vbnltb3VzPj4nOworCit2YXIgUmVhY3RQcm9w VHlwZXMgPSB7CisgIGFycmF5OiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignYXJyYXknKSwK KyAgYm9vbDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2Jvb2xlYW4nKSwKKyAgZnVuYzog Y3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2Z1bmN0aW9uJyksCisgIG51bWJlcjogY3JlYXRl UHJpbWl0aXZlVHlwZUNoZWNrZXIoJ251bWJlcicpLAorICBvYmplY3Q6IGNyZWF0ZVByaW1pdGl2 ZVR5cGVDaGVja2VyKCdvYmplY3QnKSwKKyAgc3RyaW5nOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hl Y2tlcignc3RyaW5nJyksCisgIHN5bWJvbDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ3N5 bWJvbCcpLAorCisgIGFueTogY3JlYXRlQW55VHlwZUNoZWNrZXIoKSwKKyAgYXJyYXlPZjogY3Jl YXRlQXJyYXlPZlR5cGVDaGVja2VyLAorICBlbGVtZW50OiBjcmVhdGVFbGVtZW50VHlwZUNoZWNr ZXIoKSwKKyAgaW5zdGFuY2VPZjogY3JlYXRlSW5zdGFuY2VUeXBlQ2hlY2tlciwKKyAgbm9kZTog Y3JlYXRlTm9kZUNoZWNrZXIoKSwKKyAgb2JqZWN0T2Y6IGNyZWF0ZU9iamVjdE9mVHlwZUNoZWNr ZXIsCisgIG9uZU9mOiBjcmVhdGVFbnVtVHlwZUNoZWNrZXIsCisgIG9uZU9mVHlwZTogY3JlYXRl VW5pb25UeXBlQ2hlY2tlciwKKyAgc2hhcGU6IGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXIKK307CisK Ky8qKgorICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNv bnN1bWVycyBzaGlwIHRoZWlyIG93bgorICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcv ZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0 L2lzCisgKi8KKy8qZXNsaW50LWRpc2FibGUgbm8tc2VsZi1jb21wYXJlKi8KK2Z1bmN0aW9uIGlz KHgsIHkpIHsKKyAgLy8gU2FtZVZhbHVlIGFsZ29yaXRobQorICBpZiAoeCA9PT0geSkgeworICAg IC8vIFN0ZXBzIDEtNSwgNy0xMAorICAgIC8vIFN0ZXBzIDYuYi02LmU6ICswICE9IC0wCisgICAg cmV0dXJuIHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5OworICB9IGVsc2UgeworICAgIC8vIFN0 ZXAgNi5hOiBOYU4gPT0gTmFOCisgICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTsKKyAgfQor fQorLyplc2xpbnQtZW5hYmxlIG5vLXNlbGYtY29tcGFyZSovCisKKy8qKgorICogV2UgdXNlIGFu IEVycm9yLWxpa2Ugb2JqZWN0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFzIHBlb3BsZSBt YXkgY2FsbAorICogUHJvcFR5cGVzIGRpcmVjdGx5IGFuZCBpbnNwZWN0IHRoZWlyIG91dHB1dC4g SG93ZXZlciB3ZSBkb24ndCB1c2UgcmVhbAorICogRXJyb3JzIGFueW1vcmUuIFdlIGRvbid0IGlu c3BlY3QgdGhlaXIgc3RhY2sgYW55d2F5LCBhbmQgY3JlYXRpbmcgdGhlbQorICogaXMgcHJvaGli aXRpdmVseSBleHBlbnNpdmUgaWYgdGhleSBhcmUgY3JlYXRlZCB0b28gb2Z0ZW4sIHN1Y2ggYXMg d2hhdAorICogaGFwcGVucyBpbiBvbmVPZlR5cGUoKSBmb3IgYW55IHR5cGUgYmVmb3JlIHRoZSBv bmUgdGhhdCBtYXRjaGVkLgorICovCitmdW5jdGlvbiBQcm9wVHlwZUVycm9yKG1lc3NhZ2UpIHsK KyAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgdGhpcy5zdGFjayA9ICcnOworfQorLy8gTWFr ZSBgaW5zdGFuY2VvZiBFcnJvcmAgc3RpbGwgd29yayBmb3IgcmV0dXJuZWQgZXJyb3JzLgorUHJv cFR5cGVFcnJvci5wcm90b3R5cGUgPSBFcnJvci5wcm90b3R5cGU7CisKK2Z1bmN0aW9uIGNyZWF0 ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKSB7CisgIGlmICgiZGV2ZWxvcG1lbnQiICE9 PSAncHJvZHVjdGlvbicpIHsKKyAgICB2YXIgbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGUgPSB7fTsK KyAgfQorICBmdW5jdGlvbiBjaGVja1R5cGUoaXNSZXF1aXJlZCwgcHJvcHMsIHByb3BOYW1lLCBj b21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBzZWNyZXQpIHsKKyAgICBjb21w b25lbnROYW1lID0gY29tcG9uZW50TmFtZSB8fCBBTk9OWU1PVVM7CisgICAgcHJvcEZ1bGxOYW1l ID0gcHJvcEZ1bGxOYW1lIHx8IHByb3BOYW1lOworICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAn cHJvZHVjdGlvbicpIHsKKyAgICAgIGlmIChzZWNyZXQgIT09IFJlYWN0UHJvcFR5cGVzU2VjcmV0 ICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykgeworICAgICAgICB2YXIgY2FjaGVL ZXkgPSBjb21wb25lbnROYW1lICsgJzonICsgcHJvcE5hbWU7CisgICAgICAgIGlmICghbWFudWFs UHJvcFR5cGVDYWxsQ2FjaGVbY2FjaGVLZXldKSB7CisgICAgICAgICAgImRldmVsb3BtZW50IiAh PT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1lvdSBhcmUgbWFudWFsbHkgY2FsbGlu ZyBhIFJlYWN0LlByb3BUeXBlcyB2YWxpZGF0aW9uICcgKyAnZnVuY3Rpb24gZm9yIHRoZSBgJXNg IHByb3Agb24gYCVzYC4gVGhpcyBpcyBkZXByZWNhdGVkICcgKyAnYW5kIHdpbGwgbm90IHdvcmsg aW4gcHJvZHVjdGlvbiB3aXRoIHRoZSBuZXh0IG1ham9yIHZlcnNpb24uICcgKyAnWW91IG1heSBi ZSBzZWVpbmcgdGhpcyB3YXJuaW5nIGR1ZSB0byBhIHRoaXJkLXBhcnR5IFByb3BUeXBlcyAnICsg J2xpYnJhcnkuIFNlZSBodHRwczovL2ZiLm1lL3JlYWN0LXdhcm5pbmctZG9udC1jYWxsLXByb3B0 eXBlcyAnICsgJ2ZvciBkZXRhaWxzLicsIHByb3BGdWxsTmFtZSwgY29tcG9uZW50TmFtZSkgOiB2 b2lkIDA7CisgICAgICAgICAgbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGVbY2FjaGVLZXldID0gdHJ1 ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09 IG51bGwpIHsKKyAgICAgIHZhciBsb2NhdGlvbk5hbWUgPSBSZWFjdFByb3BUeXBlTG9jYXRpb25O YW1lc1tsb2NhdGlvbl07CisgICAgICBpZiAoaXNSZXF1aXJlZCkgeworICAgICAgICBpZiAocHJv cHNbcHJvcE5hbWVdID09PSBudWxsKSB7CisgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVy cm9yKCdUaGUgJyArIGxvY2F0aW9uTmFtZSArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBpcyBt YXJrZWQgYXMgcmVxdWlyZWQgJyArICgnaW4gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGJ1dCBp dHMgdmFsdWUgaXMgYG51bGxgLicpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFBy b3BUeXBlRXJyb3IoJ1RoZSAnICsgbG9jYXRpb25OYW1lICsgJyBgJyArIHByb3BGdWxsTmFtZSAr ICdgIGlzIG1hcmtlZCBhcyByZXF1aXJlZCBpbiAnICsgKCdgJyArIGNvbXBvbmVudE5hbWUgKyAn YCwgYnV0IGl0cyB2YWx1ZSBpcyBgdW5kZWZpbmVkYC4nKSk7CisgICAgICB9CisgICAgICByZXR1 cm4gbnVsbDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHZhbGlkYXRlKHByb3BzLCBwcm9w TmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSk7CisgICAgfQorICB9 CisKKyAgdmFyIGNoYWluZWRDaGVja1R5cGUgPSBjaGVja1R5cGUuYmluZChudWxsLCBmYWxzZSk7 CisgIGNoYWluZWRDaGVja1R5cGUuaXNSZXF1aXJlZCA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIHRy dWUpOworCisgIHJldHVybiBjaGFpbmVkQ2hlY2tUeXBlOworfQorCitmdW5jdGlvbiBjcmVhdGVQ cmltaXRpdmVUeXBlQ2hlY2tlcihleHBlY3RlZFR5cGUpIHsKKyAgZnVuY3Rpb24gdmFsaWRhdGUo cHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBz ZWNyZXQpIHsKKyAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdOworICAgIHZhciBw cm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7CisgICAgaWYgKHByb3BUeXBlICE9PSBl eHBlY3RlZFR5cGUpIHsKKyAgICAgIHZhciBsb2NhdGlvbk5hbWUgPSBSZWFjdFByb3BUeXBlTG9j YXRpb25OYW1lc1tsb2NhdGlvbl07CisgICAgICAvLyBgcHJvcFZhbHVlYCBiZWluZyBpbnN0YW5j ZSBvZiwgc2F5LCBkYXRlL3JlZ2V4cCwgcGFzcyB0aGUgJ29iamVjdCcKKyAgICAgIC8vIGNoZWNr LCBidXQgd2UgY2FuIG9mZmVyIGEgbW9yZSBwcmVjaXNlIGVycm9yIG1lc3NhZ2UgaGVyZSByYXRo ZXIgdGhhbgorICAgICAgLy8gJ29mIHR5cGUgYG9iamVjdGAnLgorICAgICAgdmFyIHByZWNpc2VU eXBlID0gZ2V0UHJlY2lzZVR5cGUocHJvcFZhbHVlKTsKKworICAgICAgcmV0dXJuIG5ldyBQcm9w VHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbk5hbWUgKyAnIGAnICsgcHJvcEZ1bGxOYW1l ICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByZWNpc2VUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcg KyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkICcpICsgKCdgJyArIGV4cGVjdGVkVHlwZSAr ICdgLicpKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKyAgcmV0dXJuIGNyZWF0ZUNo YWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTsKK30KKworZnVuY3Rpb24gY3JlYXRlQW55VHlw ZUNoZWNrZXIoKSB7CisgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcihlbXB0eUZ1 bmN0aW9uLnRoYXRSZXR1cm5zKG51bGwpKTsKK30KKworZnVuY3Rpb24gY3JlYXRlQXJyYXlPZlR5 cGVDaGVja2VyKHR5cGVDaGVja2VyKSB7CisgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9w TmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkgeworICAgIGlmICh0 eXBlb2YgdHlwZUNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHsKKyAgICAgIHJldHVybiBuZXcgUHJv cFR5cGVFcnJvcignUHJvcGVydHkgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiBjb21wb25lbnQg YCcgKyBjb21wb25lbnROYW1lICsgJ2AgaGFzIGludmFsaWQgUHJvcFR5cGUgbm90YXRpb24gaW5z aWRlIGFycmF5T2YuJyk7CisgICAgfQorICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFt ZV07CisgICAgaWYgKCFBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHsKKyAgICAgIHZhciBsb2Nh dGlvbk5hbWUgPSBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl07CisgICAgICB2 YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpOworICAgICAgcmV0dXJuIG5ldyBQ cm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbk5hbWUgKyAnIGAnICsgcHJvcEZ1bGxO YW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcg KyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGFuIGFycmF5LicpKTsKKyAgICB9CisgICAg Zm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wVmFsdWUubGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciBl cnJvciA9IHR5cGVDaGVja2VyKHByb3BWYWx1ZSwgaSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24s IHByb3BGdWxsTmFtZSArICdbJyArIGkgKyAnXScsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTsKKyAg ICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7CisgICAgICAgIHJldHVybiBlcnJvcjsK KyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKyAgcmV0dXJuIGNyZWF0ZUNo YWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTsKK30KKworZnVuY3Rpb24gY3JlYXRlRWxlbWVu dFR5cGVDaGVja2VyKCkgeworICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNv bXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHsKKyAgICB2YXIgcHJvcFZhbHVl ID0gcHJvcHNbcHJvcE5hbWVdOworICAgIGlmICghUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50 KHByb3BWYWx1ZSkpIHsKKyAgICAgIHZhciBsb2NhdGlvbk5hbWUgPSBSZWFjdFByb3BUeXBlTG9j YXRpb25OYW1lc1tsb2NhdGlvbl07CisgICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShw cm9wVmFsdWUpOworICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBs b2NhdGlvbk5hbWUgKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyAr IHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVj dGVkIGEgc2luZ2xlIFJlYWN0RWxlbWVudC4nKSk7CisgICAgfQorICAgIHJldHVybiBudWxsOwor ICB9CisgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7Cit9CisK K2Z1bmN0aW9uIGNyZWF0ZUluc3RhbmNlVHlwZUNoZWNrZXIoZXhwZWN0ZWRDbGFzcykgeworICBm dW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9u LCBwcm9wRnVsbE5hbWUpIHsKKyAgICBpZiAoIShwcm9wc1twcm9wTmFtZV0gaW5zdGFuY2VvZiBl eHBlY3RlZENsYXNzKSkgeworICAgICAgdmFyIGxvY2F0aW9uTmFtZSA9IFJlYWN0UHJvcFR5cGVM b2NhdGlvbk5hbWVzW2xvY2F0aW9uXTsKKyAgICAgIHZhciBleHBlY3RlZENsYXNzTmFtZSA9IGV4 cGVjdGVkQ2xhc3MubmFtZSB8fCBBTk9OWU1PVVM7CisgICAgICB2YXIgYWN0dWFsQ2xhc3NOYW1l ID0gZ2V0Q2xhc3NOYW1lKHByb3BzW3Byb3BOYW1lXSk7CisgICAgICByZXR1cm4gbmV3IFByb3BU eXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uTmFtZSArICcgYCcgKyBwcm9wRnVsbE5hbWUg KyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgYWN0dWFsQ2xhc3NOYW1lICsgJ2Agc3VwcGxpZWQgdG8g YCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkICcpICsgKCdpbnN0YW5jZSBvZiBgJyAr IGV4cGVjdGVkQ2xhc3NOYW1lICsgJ2AuJykpOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAg fQorICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpOworfQorCitm dW5jdGlvbiBjcmVhdGVFbnVtVHlwZUNoZWNrZXIoZXhwZWN0ZWRWYWx1ZXMpIHsKKyAgaWYgKCFB cnJheS5pc0FycmF5KGV4cGVjdGVkVmFsdWVzKSkgeworICAgICJkZXZlbG9wbWVudCIgIT09ICdw cm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRv IG9uZU9mLCBleHBlY3RlZCBhbiBpbnN0YW5jZSBvZiBhcnJheS4nKSA6IHZvaWQgMDsKKyAgICBy ZXR1cm4gZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc051bGw7CisgIH0KKworICBmdW5jdGlvbiB2 YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVs bE5hbWUpIHsKKyAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdOworICAgIGZvciAo dmFyIGkgPSAwOyBpIDwgZXhwZWN0ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmIChp cyhwcm9wVmFsdWUsIGV4cGVjdGVkVmFsdWVzW2ldKSkgeworICAgICAgICByZXR1cm4gbnVsbDsK KyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxv Y2F0aW9uTmFtZXNbbG9jYXRpb25dOworICAgIHZhciB2YWx1ZXNTdHJpbmcgPSBKU09OLnN0cmlu Z2lmeShleHBlY3RlZFZhbHVlcyk7CisgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZh bGlkICcgKyBsb2NhdGlvbk5hbWUgKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdmFsdWUg YCcgKyBwcm9wVmFsdWUgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUg KyAnYCwgZXhwZWN0ZWQgb25lIG9mICcgKyB2YWx1ZXNTdHJpbmcgKyAnLicpKTsKKyAgfQorICBy ZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpOworfQorCitmdW5jdGlv biBjcmVhdGVPYmplY3RPZlR5cGVDaGVja2VyKHR5cGVDaGVja2VyKSB7CisgIGZ1bmN0aW9uIHZh bGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxs TmFtZSkgeworICAgIGlmICh0eXBlb2YgdHlwZUNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHsKKyAg ICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignUHJvcGVydHkgYCcgKyBwcm9wRnVsbE5hbWUg KyAnYCBvZiBjb21wb25lbnQgYCcgKyBjb21wb25lbnROYW1lICsgJ2AgaGFzIGludmFsaWQgUHJv cFR5cGUgbm90YXRpb24gaW5zaWRlIG9iamVjdE9mLicpOworICAgIH0KKyAgICB2YXIgcHJvcFZh bHVlID0gcHJvcHNbcHJvcE5hbWVdOworICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHBy b3BWYWx1ZSk7CisgICAgaWYgKHByb3BUeXBlICE9PSAnb2JqZWN0JykgeworICAgICAgdmFyIGxv Y2F0aW9uTmFtZSA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXTsKKyAgICAg IHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb25OYW1lICsgJyBg JyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1 cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhbiBvYmplY3QuJykp OworICAgIH0KKyAgICBmb3IgKHZhciBrZXkgaW4gcHJvcFZhbHVlKSB7CisgICAgICBpZiAocHJv cFZhbHVlLmhhc093blByb3BlcnR5KGtleSkpIHsKKyAgICAgICAgdmFyIGVycm9yID0gdHlwZUNo ZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5h bWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTsKKyAgICAgICAgaWYgKGVycm9y IGluc3RhbmNlb2YgRXJyb3IpIHsKKyAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0K KyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKyAgcmV0dXJuIGNyZWF0ZUNo YWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTsKK30KKworZnVuY3Rpb24gY3JlYXRlVW5pb25U eXBlQ2hlY2tlcihhcnJheU9mVHlwZUNoZWNrZXJzKSB7CisgIGlmICghQXJyYXkuaXNBcnJheShh cnJheU9mVHlwZUNoZWNrZXJzKSkgeworICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9u JyA/IHdhcm5pbmcoZmFsc2UsICdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIG9uZU9mVHlw ZSwgZXhwZWN0ZWQgYW4gaW5zdGFuY2Ugb2YgYXJyYXkuJykgOiB2b2lkIDA7CisgICAgcmV0dXJu IGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNOdWxsOworICB9CisKKyAgZnVuY3Rpb24gdmFsaWRh dGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1l KSB7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheU9mVHlwZUNoZWNrZXJzLmxlbmd0aDsg aSsrKSB7CisgICAgICB2YXIgY2hlY2tlciA9IGFycmF5T2ZUeXBlQ2hlY2tlcnNbaV07CisgICAg ICBpZiAoY2hlY2tlcihwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBw cm9wRnVsbE5hbWUsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KSA9PSBudWxsKSB7CisgICAgICAgIHJl dHVybiBudWxsOworICAgICAgfQorICAgIH0KKworICAgIHZhciBsb2NhdGlvbk5hbWUgPSBSZWFj dFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl07CisgICAgcmV0dXJuIG5ldyBQcm9wVHlw ZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbk5hbWUgKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsg J2Agc3VwcGxpZWQgdG8gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AuJykpOworICB9Cisg IHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7Cit9CisKK2Z1bmN0 aW9uIGNyZWF0ZU5vZGVDaGVja2VyKCkgeworICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJv cE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHsKKyAgICBpZiAo IWlzTm9kZShwcm9wc1twcm9wTmFtZV0pKSB7CisgICAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVh Y3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dOworICAgICAgcmV0dXJuIG5ldyBQcm9w VHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbk5hbWUgKyAnIGAnICsgcHJvcEZ1bGxOYW1l ICsgJ2Agc3VwcGxpZWQgdG8gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVk IGEgUmVhY3ROb2RlLicpKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKyAgcmV0dXJu IGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTsKK30KKworZnVuY3Rpb24gY3Jl YXRlU2hhcGVUeXBlQ2hlY2tlcihzaGFwZVR5cGVzKSB7CisgIGZ1bmN0aW9uIHZhbGlkYXRlKHBy b3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkgewor ICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07CisgICAgdmFyIHByb3BUeXBlID0g Z2V0UHJvcFR5cGUocHJvcFZhbHVlKTsKKyAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7 CisgICAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9j YXRpb25dOworICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2Nh dGlvbk5hbWUgKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSBgJyArIHByb3BUeXBl ICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVk IGBvYmplY3RgLicpKTsKKyAgICB9CisgICAgZm9yICh2YXIga2V5IGluIHNoYXBlVHlwZXMpIHsK KyAgICAgIHZhciBjaGVja2VyID0gc2hhcGVUeXBlc1trZXldOworICAgICAgaWYgKCFjaGVja2Vy KSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgdmFyIGVycm9yID0gY2hlY2tl cihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSAr ICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpOworICAgICAgaWYgKGVycm9yKSB7Cisg ICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGw7Cisg IH0KKyAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTsKK30KKwor ZnVuY3Rpb24gaXNOb2RlKHByb3BWYWx1ZSkgeworICBzd2l0Y2ggKHR5cGVvZiBwcm9wVmFsdWUp IHsKKyAgICBjYXNlICdudW1iZXInOgorICAgIGNhc2UgJ3N0cmluZyc6CisgICAgY2FzZSAndW5k ZWZpbmVkJzoKKyAgICAgIHJldHVybiB0cnVlOworICAgIGNhc2UgJ2Jvb2xlYW4nOgorICAgICAg cmV0dXJuICFwcm9wVmFsdWU7CisgICAgY2FzZSAnb2JqZWN0JzoKKyAgICAgIGlmIChBcnJheS5p c0FycmF5KHByb3BWYWx1ZSkpIHsKKyAgICAgICAgcmV0dXJuIHByb3BWYWx1ZS5ldmVyeShpc05v ZGUpOworICAgICAgfQorICAgICAgaWYgKHByb3BWYWx1ZSA9PT0gbnVsbCB8fCBSZWFjdEVsZW1l bnQuaXNWYWxpZEVsZW1lbnQocHJvcFZhbHVlKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg ICAgIH0KKworICAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKHByb3BWYWx1ZSk7 CisgICAgICBpZiAoaXRlcmF0b3JGbikgeworICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRv ckZuLmNhbGwocHJvcFZhbHVlKTsKKyAgICAgICAgdmFyIHN0ZXA7CisgICAgICAgIGlmIChpdGVy YXRvckZuICE9PSBwcm9wVmFsdWUuZW50cmllcykgeworICAgICAgICAgIHdoaWxlICghKHN0ZXAg PSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHsKKyAgICAgICAgICAgIGlmICghaXNOb2RlKHN0ZXAu dmFsdWUpKSB7CisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAg ICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gSXRlcmF0b3Igd2lsbCBw cm92aWRlIGVudHJ5IFtrLHZdIHR1cGxlcyByYXRoZXIgdGhhbiB2YWx1ZXMuCisgICAgICAgICAg d2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkgeworICAgICAgICAgICAgdmFy IGVudHJ5ID0gc3RlcC52YWx1ZTsKKyAgICAgICAgICAgIGlmIChlbnRyeSkgeworICAgICAgICAg ICAgICBpZiAoIWlzTm9kZShlbnRyeVsxXSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFs c2U7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAg IH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAg ICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQor fQorCitmdW5jdGlvbiBpc1N5bWJvbChwcm9wVHlwZSwgcHJvcFZhbHVlKSB7CisgIC8vIE5hdGl2 ZSBTeW1ib2wuCisgIGlmIChwcm9wVHlwZSA9PT0gJ3N5bWJvbCcpIHsKKyAgICByZXR1cm4gdHJ1 ZTsKKyAgfQorCisgIC8vIDE5LjQuMy41IFN5bWJvbC5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ10g PT09ICdTeW1ib2wnCisgIGlmIChwcm9wVmFsdWVbJ0BAdG9TdHJpbmdUYWcnXSA9PT0gJ1N5bWJv bCcpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIEZhbGxiYWNrIGZvciBub24tc3Bl YyBjb21wbGlhbnQgU3ltYm9scyB3aGljaCBhcmUgcG9seWZpbGxlZC4KKyAgaWYgKHR5cGVvZiBT eW1ib2wgPT09ICdmdW5jdGlvbicgJiYgcHJvcFZhbHVlIGluc3RhbmNlb2YgU3ltYm9sKSB7Cisg ICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIEVxdWl2YWxl bnQgb2YgYHR5cGVvZmAgYnV0IHdpdGggc3BlY2lhbCBoYW5kbGluZyBmb3IgYXJyYXkgYW5kIHJl Z2V4cC4KK2Z1bmN0aW9uIGdldFByb3BUeXBlKHByb3BWYWx1ZSkgeworICB2YXIgcHJvcFR5cGUg PSB0eXBlb2YgcHJvcFZhbHVlOworICBpZiAoQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7Cisg ICAgcmV0dXJuICdhcnJheSc7CisgIH0KKyAgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4 cCkgeworICAgIC8vIE9sZCB3ZWJraXRzIChhdCBsZWFzdCB1bnRpbCBBbmRyb2lkIDQuMCkgcmV0 dXJuICdmdW5jdGlvbicgcmF0aGVyIHRoYW4KKyAgICAvLyAnb2JqZWN0JyBmb3IgdHlwZW9mIGEg UmVnRXhwLiBXZSdsbCBub3JtYWxpemUgdGhpcyBoZXJlIHNvIHRoYXQgL2JsYS8KKyAgICAvLyBw YXNzZXMgUHJvcFR5cGVzLm9iamVjdC4KKyAgICByZXR1cm4gJ29iamVjdCc7CisgIH0KKyAgaWYg KGlzU3ltYm9sKHByb3BUeXBlLCBwcm9wVmFsdWUpKSB7CisgICAgcmV0dXJuICdzeW1ib2wnOwor ICB9CisgIHJldHVybiBwcm9wVHlwZTsKK30KKworLy8gVGhpcyBoYW5kbGVzIG1vcmUgdHlwZXMg dGhhbiBgZ2V0UHJvcFR5cGVgLiBPbmx5IHVzZWQgZm9yIGVycm9yIG1lc3NhZ2VzLgorLy8gU2Vl IGBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcmAuCitmdW5jdGlvbiBnZXRQcmVjaXNlVHlwZShw cm9wVmFsdWUpIHsKKyAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTsKKyAg aWYgKHByb3BUeXBlID09PSAnb2JqZWN0JykgeworICAgIGlmIChwcm9wVmFsdWUgaW5zdGFuY2Vv ZiBEYXRlKSB7CisgICAgICByZXR1cm4gJ2RhdGUnOworICAgIH0gZWxzZSBpZiAocHJvcFZhbHVl IGluc3RhbmNlb2YgUmVnRXhwKSB7CisgICAgICByZXR1cm4gJ3JlZ2V4cCc7CisgICAgfQorICB9 CisgIHJldHVybiBwcm9wVHlwZTsKK30KKworLy8gUmV0dXJucyBjbGFzcyBuYW1lIG9mIHRoZSBv YmplY3QsIGlmIGFueS4KK2Z1bmN0aW9uIGdldENsYXNzTmFtZShwcm9wVmFsdWUpIHsKKyAgaWYg KCFwcm9wVmFsdWUuY29uc3RydWN0b3IgfHwgIXByb3BWYWx1ZS5jb25zdHJ1Y3Rvci5uYW1lKSB7 CisgICAgcmV0dXJuIEFOT05ZTU9VUzsKKyAgfQorICByZXR1cm4gcHJvcFZhbHVlLmNvbnN0cnVj dG9yLm5hbWU7Cit9CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RQcm9wVHlwZXM7Cit9LHsiMTYi OjE2LCIyMiI6MjIsIjI0IjoyNCwiMzYiOjM2LCI0NCI6NDQsIjQ4Ijo0OH1dLDI0OltmdW5jdGlv bihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2Vu dCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBz b3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQg aW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291 cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJl IGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAq IAorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gJ1NF Q1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJzsKKworbW9kdWxlLmV4 cG9ydHMgPSBSZWFjdFByb3BUeXBlc1NlY3JldDsKK30se31dLDI1OltmdW5jdGlvbihfZGVyZXFf LG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJv b2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29k ZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisg KiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUu IEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGlu IHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNl IHN0cmljdCc7CisKK3ZhciBfYXNzaWduID0gX2RlcmVxXyg0OSk7CisKK3ZhciBSZWFjdENvbXBv bmVudCA9IF9kZXJlcV8oMTEpOwordmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0gX2RlcmVxXygy MSk7CisKK3ZhciBlbXB0eU9iamVjdCA9IF9kZXJlcV8oNDUpOworCisvKioKKyAqIEJhc2UgY2xh c3MgaGVscGVycyBmb3IgdGhlIHVwZGF0aW5nIHN0YXRlIG9mIGEgY29tcG9uZW50LgorICovCitm dW5jdGlvbiBSZWFjdFB1cmVDb21wb25lbnQocHJvcHMsIGNvbnRleHQsIHVwZGF0ZXIpIHsKKyAg Ly8gRHVwbGljYXRlZCBmcm9tIFJlYWN0Q29tcG9uZW50LgorICB0aGlzLnByb3BzID0gcHJvcHM7 CisgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisgIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0Owor ICAvLyBXZSBpbml0aWFsaXplIHRoZSBkZWZhdWx0IHVwZGF0ZXIgYnV0IHRoZSByZWFsIG9uZSBn ZXRzIGluamVjdGVkIGJ5IHRoZQorICAvLyByZW5kZXJlci4KKyAgdGhpcy51cGRhdGVyID0gdXBk YXRlciB8fCBSZWFjdE5vb3BVcGRhdGVRdWV1ZTsKK30KKworZnVuY3Rpb24gQ29tcG9uZW50RHVt bXkoKSB7fQorQ29tcG9uZW50RHVtbXkucHJvdG90eXBlID0gUmVhY3RDb21wb25lbnQucHJvdG90 eXBlOworUmVhY3RQdXJlQ29tcG9uZW50LnByb3RvdHlwZSA9IG5ldyBDb21wb25lbnREdW1teSgp OworUmVhY3RQdXJlQ29tcG9uZW50LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlYWN0UHVyZUNv bXBvbmVudDsKKy8vIEF2b2lkIGFuIGV4dHJhIHByb3RvdHlwZSBqdW1wIGZvciB0aGVzZSBtZXRo b2RzLgorX2Fzc2lnbihSZWFjdFB1cmVDb21wb25lbnQucHJvdG90eXBlLCBSZWFjdENvbXBvbmVu dC5wcm90b3R5cGUpOworUmVhY3RQdXJlQ29tcG9uZW50LnByb3RvdHlwZS5pc1B1cmVSZWFjdENv bXBvbmVudCA9IHRydWU7CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RQdXJlQ29tcG9uZW50Owor fSx7IjExIjoxMSwiMjEiOjIxLCI0NSI6NDUsIjQ5Ijo0OX1dLDI2OltmdW5jdGlvbihfZGVyZXFf LG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJv b2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29k ZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisg KiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUu IEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGlu IHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNl IHN0cmljdCc7CisKK3ZhciBSZWFjdFN0YXRlU2V0dGVycyA9IHsKKyAgLyoqCisgICAqIFJldHVy bnMgYSBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiwgYW5kIHVzZXMg dGhlIHJlc3VsdAorICAgKiBvZiB0aGF0IHRvIHNldCB0aGUgY29tcG9uZW50J3Mgc3RhdGUuCisg ICAqCisgICAqIEBwYXJhbSB7UmVhY3RDb21wb3NpdGVDb21wb25lbnR9IGNvbXBvbmVudAorICAg KiBAcGFyYW0ge2Z1bmN0aW9ufSBmdW5jUmV0dXJuaW5nU3RhdGUgUmV0dXJuZWQgY2FsbGJhY2sg dXNlcyB0aGlzIHRvCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBk ZXRlcm1pbmUgaG93IHRvIHVwZGF0ZSBzdGF0ZS4KKyAgICogQHJldHVybiB7ZnVuY3Rpb259IGNh bGxiYWNrIHRoYXQgd2hlbiBpbnZva2VkIHVzZXMgZnVuY1JldHVybmluZ1N0YXRlIHRvCisgICAq ICAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmVkIHRoZSBvYmplY3QgbGl0ZXJhbCB0byBzZXRT dGF0ZS4KKyAgICovCisgIGNyZWF0ZVN0YXRlU2V0dGVyOiBmdW5jdGlvbiAoY29tcG9uZW50LCBm dW5jUmV0dXJuaW5nU3RhdGUpIHsKKyAgICByZXR1cm4gZnVuY3Rpb24gKGEsIGIsIGMsIGQsIGUs IGYpIHsKKyAgICAgIHZhciBwYXJ0aWFsU3RhdGUgPSBmdW5jUmV0dXJuaW5nU3RhdGUuY2FsbChj b21wb25lbnQsIGEsIGIsIGMsIGQsIGUsIGYpOworICAgICAgaWYgKHBhcnRpYWxTdGF0ZSkgewor ICAgICAgICBjb21wb25lbnQuc2V0U3RhdGUocGFydGlhbFN0YXRlKTsKKyAgICAgIH0KKyAgICB9 OworICB9LAorCisgIC8qKgorICAgKiBSZXR1cm5zIGEgc2luZ2xlLWFyZ3VtZW50IGNhbGxiYWNr IHRoYXQgY2FuIGJlIHVzZWQgdG8gdXBkYXRlIGEgc2luZ2xlCisgICAqIGtleSBpbiB0aGUgY29t cG9uZW50J3Mgc3RhdGUuCisgICAqCisgICAqIE5vdGU6IHRoaXMgaXMgbWVtb2l6ZWQgZnVuY3Rp b24sIHdoaWNoIG1ha2VzIGl0IGluZXhwZW5zaXZlIHRvIGNhbGwuCisgICAqCisgICAqIEBwYXJh bSB7UmVhY3RDb21wb3NpdGVDb21wb25lbnR9IGNvbXBvbmVudAorICAgKiBAcGFyYW0ge3N0cmlu Z30ga2V5IFRoZSBrZXkgaW4gdGhlIHN0YXRlIHRoYXQgeW91IHNob3VsZCB1cGRhdGUuCisgICAq IEByZXR1cm4ge2Z1bmN0aW9ufSBjYWxsYmFjayBvZiAxIGFyZ3VtZW50IHdoaWNoIGNhbGxzIHNl dFN0YXRlKCkgd2l0aAorICAgKiAgICAgICAgICAgICAgICAgICAgdGhlIHByb3ZpZGVkIGtleU5h bWUgYW5kIGNhbGxiYWNrIGFyZ3VtZW50LgorICAgKi8KKyAgY3JlYXRlU3RhdGVLZXlTZXR0ZXI6 IGZ1bmN0aW9uIChjb21wb25lbnQsIGtleSkgeworICAgIC8vIE1lbW9pemUgdGhlIHNldHRlcnMu CisgICAgdmFyIGNhY2hlID0gY29tcG9uZW50Ll9fa2V5U2V0dGVycyB8fCAoY29tcG9uZW50Ll9f a2V5U2V0dGVycyA9IHt9KTsKKyAgICByZXR1cm4gY2FjaGVba2V5XSB8fCAoY2FjaGVba2V5XSA9 IGNyZWF0ZVN0YXRlS2V5U2V0dGVyKGNvbXBvbmVudCwga2V5KSk7CisgIH0KK307CisKK2Z1bmN0 aW9uIGNyZWF0ZVN0YXRlS2V5U2V0dGVyKGNvbXBvbmVudCwga2V5KSB7CisgIC8vIFBhcnRpYWwg c3RhdGUgaXMgYWxsb2NhdGVkIG91dHNpZGUgb2YgdGhlIGZ1bmN0aW9uIGNsb3N1cmUgc28gaXQg Y2FuIGJlCisgIC8vIHJldXNlZCB3aXRoIGV2ZXJ5IGNhbGwsIGF2b2lkaW5nIG1lbW9yeSBhbGxv Y2F0aW9uIHdoZW4gdGhpcyBmdW5jdGlvbgorICAvLyBpcyBjYWxsZWQuCisgIHZhciBwYXJ0aWFs U3RhdGUgPSB7fTsKKyAgcmV0dXJuIGZ1bmN0aW9uIHN0YXRlS2V5U2V0dGVyKHZhbHVlKSB7Cisg ICAgcGFydGlhbFN0YXRlW2tleV0gPSB2YWx1ZTsKKyAgICBjb21wb25lbnQuc2V0U3RhdGUocGFy dGlhbFN0YXRlKTsKKyAgfTsKK30KKworUmVhY3RTdGF0ZVNldHRlcnMuTWl4aW4gPSB7CisgIC8q KgorICAgKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rp b24sIGFuZCB1c2VzIHRoZSByZXN1bHQKKyAgICogb2YgdGhhdCB0byBzZXQgdGhlIGNvbXBvbmVu dCdzIHN0YXRlLgorICAgKgorICAgKiBGb3IgZXhhbXBsZSwgdGhlc2Ugc3RhdGVtZW50cyBhcmUg ZXF1aXZhbGVudDoKKyAgICoKKyAgICogICB0aGlzLnNldFN0YXRlKHt4OiAxfSk7CisgICAqICAg dGhpcy5jcmVhdGVTdGF0ZVNldHRlcihmdW5jdGlvbih4VmFsdWUpIHsKKyAgICogICAgIHJldHVy biB7eDogeFZhbHVlfTsKKyAgICogICB9KSgxKTsKKyAgICoKKyAgICogQHBhcmFtIHtmdW5jdGlv bn0gZnVuY1JldHVybmluZ1N0YXRlIFJldHVybmVkIGNhbGxiYWNrIHVzZXMgdGhpcyB0bworICAg KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5lIGhvdyB0byB1 cGRhdGUgc3RhdGUuCisgICAqIEByZXR1cm4ge2Z1bmN0aW9ufSBjYWxsYmFjayB0aGF0IHdoZW4g aW52b2tlZCB1c2VzIGZ1bmNSZXR1cm5pbmdTdGF0ZSB0bworICAgKiAgICAgICAgICAgICAgICAg ICAgZGV0ZXJtaW5lZCB0aGUgb2JqZWN0IGxpdGVyYWwgdG8gc2V0U3RhdGUuCisgICAqLworICBj cmVhdGVTdGF0ZVNldHRlcjogZnVuY3Rpb24gKGZ1bmNSZXR1cm5pbmdTdGF0ZSkgeworICAgIHJl dHVybiBSZWFjdFN0YXRlU2V0dGVycy5jcmVhdGVTdGF0ZVNldHRlcih0aGlzLCBmdW5jUmV0dXJu aW5nU3RhdGUpOworICB9LAorCisgIC8qKgorICAgKiBSZXR1cm5zIGEgc2luZ2xlLWFyZ3VtZW50 IGNhbGxiYWNrIHRoYXQgY2FuIGJlIHVzZWQgdG8gdXBkYXRlIGEgc2luZ2xlCisgICAqIGtleSBp biB0aGUgY29tcG9uZW50J3Mgc3RhdGUuCisgICAqCisgICAqIEZvciBleGFtcGxlLCB0aGVzZSBz dGF0ZW1lbnRzIGFyZSBlcXVpdmFsZW50OgorICAgKgorICAgKiAgIHRoaXMuc2V0U3RhdGUoe3g6 IDF9KTsKKyAgICogICB0aGlzLmNyZWF0ZVN0YXRlS2V5U2V0dGVyKCd4JykoMSk7CisgICAqCisg ICAqIE5vdGU6IHRoaXMgaXMgbWVtb2l6ZWQgZnVuY3Rpb24sIHdoaWNoIG1ha2VzIGl0IGluZXhw ZW5zaXZlIHRvIGNhbGwuCisgICAqCisgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBp biB0aGUgc3RhdGUgdGhhdCB5b3Ugc2hvdWxkIHVwZGF0ZS4KKyAgICogQHJldHVybiB7ZnVuY3Rp b259IGNhbGxiYWNrIG9mIDEgYXJndW1lbnQgd2hpY2ggY2FsbHMgc2V0U3RhdGUoKSB3aXRoCisg ICAqICAgICAgICAgICAgICAgICAgICB0aGUgcHJvdmlkZWQga2V5TmFtZSBhbmQgY2FsbGJhY2sg YXJndW1lbnQuCisgICAqLworICBjcmVhdGVTdGF0ZUtleVNldHRlcjogZnVuY3Rpb24gKGtleSkg eworICAgIHJldHVybiBSZWFjdFN0YXRlU2V0dGVycy5jcmVhdGVTdGF0ZUtleVNldHRlcih0aGlz LCBrZXkpOworICB9Cit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0U3RhdGVTZXR0ZXJzOwor fSx7fV0sMjc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5 cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZl ZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5 bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJl Y3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0 ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBk aXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIGZsYXR0ZW5DaGlsZHJl biA9IF9kZXJlcV8oMzUpOworCit2YXIgUmVhY3RUcmFuc2l0aW9uQ2hpbGRNYXBwaW5nID0gewor ICAvKioKKyAgICogR2l2ZW4gYHRoaXMucHJvcHMuY2hpbGRyZW5gLCByZXR1cm4gYW4gb2JqZWN0 IG1hcHBpbmcga2V5IHRvIGNoaWxkLiBKdXN0CisgICAqIHNpbXBsZSBzeW50YWN0aWMgc3VnYXIg YXJvdW5kIGZsYXR0ZW5DaGlsZHJlbigpLgorICAgKgorICAgKiBAcGFyYW0geyp9IGNoaWxkcmVu IGB0aGlzLnByb3BzLmNoaWxkcmVuYAorICAgKiBAcGFyYW0ge251bWJlcj19IHNlbGZEZWJ1Z0lE IE9wdGlvbmFsIGRlYnVnSUQgb2YgdGhlIGN1cnJlbnQgaW50ZXJuYWwgaW5zdGFuY2UuCisgICAq IEByZXR1cm4ge29iamVjdH0gTWFwcGluZyBvZiBrZXkgdG8gY2hpbGQKKyAgICovCisgIGdldENo aWxkTWFwcGluZzogZnVuY3Rpb24gKGNoaWxkcmVuLCBzZWxmRGVidWdJRCkgeworICAgIGlmICgh Y2hpbGRyZW4pIHsKKyAgICAgIHJldHVybiBjaGlsZHJlbjsKKyAgICB9CisKKyAgICBpZiAoImRl dmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICByZXR1cm4gZmxhdHRlbkNoaWxk cmVuKGNoaWxkcmVuLCBzZWxmRGVidWdJRCk7CisgICAgfQorCisgICAgcmV0dXJuIGZsYXR0ZW5D aGlsZHJlbihjaGlsZHJlbik7CisgIH0sCisKKyAgLyoqCisgICAqIFdoZW4geW91J3JlIGFkZGlu ZyBvciByZW1vdmluZyBjaGlsZHJlbiBzb21lIG1heSBiZSBhZGRlZCBvciByZW1vdmVkIGluIHRo ZQorICAgKiBzYW1lIHJlbmRlciBwYXNzLiBXZSB3YW50IHRvIHNob3cgKmJvdGgqIHNpbmNlIHdl IHdhbnQgdG8gc2ltdWx0YW5lb3VzbHkKKyAgICogYW5pbWF0ZSBlbGVtZW50cyBpbiBhbmQgb3V0 LiBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgcHJldmlvdXMgc2V0IG9mIGtleXMKKyAgICogYW5kIGEg bmV3IHNldCBvZiBrZXlzIGFuZCBtZXJnZXMgdGhlbSB3aXRoIGl0cyBiZXN0IGd1ZXNzIG9mIHRo ZSBjb3JyZWN0CisgICAqIG9yZGVyaW5nLiBJbiB0aGUgZnV0dXJlIHdlIG1heSBleHBvc2Ugc29t ZSBvZiB0aGUgdXRpbGl0aWVzIGluCisgICAqIFJlYWN0TXVsdGlDaGlsZCB0byBtYWtlIHRoaXMg ZWFzeSwgYnV0IGZvciBub3cgUmVhY3QgaXRzZWxmIGRvZXMgbm90CisgICAqIGRpcmVjdGx5IGhh dmUgdGhpcyBjb25jZXB0IG9mIHRoZSB1bmlvbiBvZiBwcmV2Q2hpbGRyZW4gYW5kIG5leHRDaGls ZHJlbgorICAgKiBzbyB3ZSBpbXBsZW1lbnQgaXQgaGVyZS4KKyAgICoKKyAgICogQHBhcmFtIHtv YmplY3R9IHByZXYgcHJldiBjaGlsZHJlbiBhcyByZXR1cm5lZCBmcm9tCisgICAqIGBSZWFjdFRy YW5zaXRpb25DaGlsZE1hcHBpbmcuZ2V0Q2hpbGRNYXBwaW5nKClgLgorICAgKiBAcGFyYW0ge29i amVjdH0gbmV4dCBuZXh0IGNoaWxkcmVuIGFzIHJldHVybmVkIGZyb20KKyAgICogYFJlYWN0VHJh bnNpdGlvbkNoaWxkTWFwcGluZy5nZXRDaGlsZE1hcHBpbmcoKWAuCisgICAqIEByZXR1cm4ge29i amVjdH0gYSBrZXkgc2V0IHRoYXQgY29udGFpbnMgYWxsIGtleXMgaW4gYHByZXZgIGFuZCBhbGwg a2V5cworICAgKiBpbiBgbmV4dGAgaW4gYSByZWFzb25hYmxlIG9yZGVyLgorICAgKi8KKyAgbWVy Z2VDaGlsZE1hcHBpbmdzOiBmdW5jdGlvbiAocHJldiwgbmV4dCkgeworICAgIHByZXYgPSBwcmV2 IHx8IHt9OworICAgIG5leHQgPSBuZXh0IHx8IHt9OworCisgICAgZnVuY3Rpb24gZ2V0VmFsdWVG b3JLZXkoa2V5KSB7CisgICAgICBpZiAobmV4dC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAg ICAgIHJldHVybiBuZXh0W2tleV07CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gcHJl dltrZXldOworICAgICAgfQorICAgIH0KKworICAgIC8vIEZvciBlYWNoIGtleSBvZiBgbmV4dGAs IHRoZSBsaXN0IG9mIGtleXMgdG8gaW5zZXJ0IGJlZm9yZSB0aGF0IGtleSBpbgorICAgIC8vIHRo ZSBjb21iaW5lZCBsaXN0CisgICAgdmFyIG5leHRLZXlzUGVuZGluZyA9IHt9OworCisgICAgdmFy IHBlbmRpbmdLZXlzID0gW107CisgICAgZm9yICh2YXIgcHJldktleSBpbiBwcmV2KSB7CisgICAg ICBpZiAobmV4dC5oYXNPd25Qcm9wZXJ0eShwcmV2S2V5KSkgeworICAgICAgICBpZiAocGVuZGlu Z0tleXMubGVuZ3RoKSB7CisgICAgICAgICAgbmV4dEtleXNQZW5kaW5nW3ByZXZLZXldID0gcGVu ZGluZ0tleXM7CisgICAgICAgICAgcGVuZGluZ0tleXMgPSBbXTsKKyAgICAgICAgfQorICAgICAg fSBlbHNlIHsKKyAgICAgICAgcGVuZGluZ0tleXMucHVzaChwcmV2S2V5KTsKKyAgICAgIH0KKyAg ICB9CisKKyAgICB2YXIgaTsKKyAgICB2YXIgY2hpbGRNYXBwaW5nID0ge307CisgICAgZm9yICh2 YXIgbmV4dEtleSBpbiBuZXh0KSB7CisgICAgICBpZiAobmV4dEtleXNQZW5kaW5nLmhhc093blBy b3BlcnR5KG5leHRLZXkpKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuZXh0S2V5c1BlbmRp bmdbbmV4dEtleV0ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICB2YXIgcGVuZGluZ05leHRLZXkg PSBuZXh0S2V5c1BlbmRpbmdbbmV4dEtleV1baV07CisgICAgICAgICAgY2hpbGRNYXBwaW5nW25l eHRLZXlzUGVuZGluZ1tuZXh0S2V5XVtpXV0gPSBnZXRWYWx1ZUZvcktleShwZW5kaW5nTmV4dEtl eSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNoaWxkTWFwcGluZ1tuZXh0S2V5XSA9IGdl dFZhbHVlRm9yS2V5KG5leHRLZXkpOworICAgIH0KKworICAgIC8vIEZpbmFsbHksIGFkZCB0aGUg a2V5cyB3aGljaCBkaWRuJ3QgYXBwZWFyIGJlZm9yZSBhbnkga2V5IGluIGBuZXh0YAorICAgIGZv ciAoaSA9IDA7IGkgPCBwZW5kaW5nS2V5cy5sZW5ndGg7IGkrKykgeworICAgICAgY2hpbGRNYXBw aW5nW3BlbmRpbmdLZXlzW2ldXSA9IGdldFZhbHVlRm9yS2V5KHBlbmRpbmdLZXlzW2ldKTsKKyAg ICB9CisKKyAgICByZXR1cm4gY2hpbGRNYXBwaW5nOworICB9Cit9OworCittb2R1bGUuZXhwb3J0 cyA9IFJlYWN0VHJhbnNpdGlvbkNoaWxkTWFwcGluZzsKK30seyIzNSI6MzV9XSwyODpbZnVuY3Rp b24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNl bnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMg c291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5k IGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNv dXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBi ZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisg Ki8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSBfZGVyZXFf KDQzKTsKKwordmFyIGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lID0gX2RlcmVxXygxKTsKKwor dmFyIGVuZEV2ZW50cyA9IFtdOworCitmdW5jdGlvbiBkZXRlY3RFdmVudHMoKSB7CisgIHZhciBh bmltRW5kID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ2FuaW1hdGlvbmVuZCcpOworICB2 YXIgdHJhbnNFbmQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgndHJhbnNpdGlvbmVuZCcp OworCisgIGlmIChhbmltRW5kKSB7CisgICAgZW5kRXZlbnRzLnB1c2goYW5pbUVuZCk7CisgIH0K KworICBpZiAodHJhbnNFbmQpIHsKKyAgICBlbmRFdmVudHMucHVzaCh0cmFuc0VuZCk7CisgIH0K K30KKworaWYgKEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSkgeworICBkZXRlY3RFdmVu dHMoKTsKK30KKworLy8gV2UgdXNlIHRoZSByYXcge2FkZHxyZW1vdmV9RXZlbnRMaXN0ZW5lcigp IGNhbGwgYmVjYXVzZSBFdmVudExpc3RlbmVyCisvLyBkb2VzIG5vdCBrbm93IGhvdyB0byByZW1v dmUgZXZlbnQgbGlzdGVuZXJzIGFuZCB3ZSByZWFsbHkgc2hvdWxkCisvLyBjbGVhbiB1cC4gQWxz bywgdGhlc2UgZXZlbnRzIGFyZSBub3QgdHJpZ2dlcmVkIGluIG9sZGVyIGJyb3dzZXJzCisvLyBz byB3ZSBzaG91bGQgYmUgQS1PSyBoZXJlLgorCitmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKG5v ZGUsIGV2ZW50TmFtZSwgZXZlbnRMaXN0ZW5lcikgeworICBub2RlLmFkZEV2ZW50TGlzdGVuZXIo ZXZlbnROYW1lLCBldmVudExpc3RlbmVyLCBmYWxzZSk7Cit9CisKK2Z1bmN0aW9uIHJlbW92ZUV2 ZW50TGlzdGVuZXIobm9kZSwgZXZlbnROYW1lLCBldmVudExpc3RlbmVyKSB7CisgIG5vZGUucmVt b3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGV2ZW50TGlzdGVuZXIsIGZhbHNlKTsKK30KKwor dmFyIFJlYWN0VHJhbnNpdGlvbkV2ZW50cyA9IHsKKyAgYWRkRW5kRXZlbnRMaXN0ZW5lcjogZnVu Y3Rpb24gKG5vZGUsIGV2ZW50TGlzdGVuZXIpIHsKKyAgICBpZiAoZW5kRXZlbnRzLmxlbmd0aCA9 PT0gMCkgeworICAgICAgLy8gSWYgQ1NTIHRyYW5zaXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkLCB0 cmlnZ2VyIGFuICJlbmQgYW5pbWF0aW9uIgorICAgICAgLy8gZXZlbnQgaW1tZWRpYXRlbHkuCisg ICAgICB3aW5kb3cuc2V0VGltZW91dChldmVudExpc3RlbmVyLCAwKTsKKyAgICAgIHJldHVybjsK KyAgICB9CisgICAgZW5kRXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGVuZEV2ZW50KSB7CisgICAg ICBhZGRFdmVudExpc3RlbmVyKG5vZGUsIGVuZEV2ZW50LCBldmVudExpc3RlbmVyKTsKKyAgICB9 KTsKKyAgfSwKKworICByZW1vdmVFbmRFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAobm9kZSwgZXZl bnRMaXN0ZW5lcikgeworICAgIGlmIChlbmRFdmVudHMubGVuZ3RoID09PSAwKSB7CisgICAgICBy ZXR1cm47CisgICAgfQorICAgIGVuZEV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbmRFdmVudCkg eworICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihub2RlLCBlbmRFdmVudCwgZXZlbnRMaXN0ZW5l cik7CisgICAgfSk7CisgIH0KK307CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RUcmFuc2l0aW9u RXZlbnRzOworfSx7IjEiOjEsIjQzIjo0M31dLDI5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxl eHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4K KyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNl bnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNF IGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0 aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRF TlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7 CisKK3ZhciBfYXNzaWduID0gX2RlcmVxXyg0OSk7CisKK2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVj ayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25z dHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBh IGZ1bmN0aW9uIik7IH0gfQorCitmdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihz ZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMg aGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpOyB9 IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIGNhbGwg PT09ICJmdW5jdGlvbiIpID8gY2FsbCA6IHNlbGY7IH0KKworZnVuY3Rpb24gX2luaGVyaXRzKHN1 YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gImZ1bmN0aW9u IiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4 cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIiArIHR5cGVv ZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVy Q2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1 YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTog dHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0 LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9f XyA9IHN1cGVyQ2xhc3M7IH0KKwordmFyIFJlYWN0ID0gX2RlcmVxXyg1KTsKK3ZhciBSZWFjdFRy YW5zaXRpb25DaGlsZE1hcHBpbmcgPSBfZGVyZXFfKDI3KTsKKwordmFyIGVtcHR5RnVuY3Rpb24g PSBfZGVyZXFfKDQ0KTsKKworLyoqCisgKiBBIGJhc2lzIGZvciBhbmltYXRpb25zLiBXaGVuIGNo aWxkcmVuIGFyZSBkZWNsYXJhdGl2ZWx5IGFkZGVkIG9yIHJlbW92ZWQsCisgKiBzcGVjaWFsIGxp ZmVjeWNsZSBob29rcyBhcmUgY2FsbGVkLgorICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHVi LmlvL3JlYWN0L2RvY3MvYW5pbWF0aW9uLmh0bWwjbG93LWxldmVsLWFwaS1yZWFjdHRyYW5zaXRp b25ncm91cAorICovCisKK3ZhciBSZWFjdFRyYW5zaXRpb25Hcm91cCA9IGZ1bmN0aW9uIChfUmVh Y3QkQ29tcG9uZW50KSB7CisgIF9pbmhlcml0cyhSZWFjdFRyYW5zaXRpb25Hcm91cCwgX1JlYWN0 JENvbXBvbmVudCk7CisKKyAgZnVuY3Rpb24gUmVhY3RUcmFuc2l0aW9uR3JvdXAoKSB7CisgICAg dmFyIF90ZW1wLCBfdGhpcywgX3JldDsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSZWFj dFRyYW5zaXRpb25Hcm91cCk7CisKKyAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0 aCwgYXJncyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykgewor ICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTsKKyAgICB9CisKKyAgICByZXR1cm4g X3JldCA9IChfdGVtcCA9IChfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMs IF9SZWFjdCRDb21wb25lbnQuY2FsbC5hcHBseShfUmVhY3QkQ29tcG9uZW50LCBbdGhpc10uY29u Y2F0KGFyZ3MpKSksIF90aGlzKSwgX3RoaXMuc3RhdGUgPSB7CisgICAgICAvLyBUT0RPOiBjYW4g d2UgZ2V0IHVzZWZ1bCBkZWJ1ZyBpbmZvcm1hdGlvbiB0byBzaG93IGF0IHRoaXMgcG9pbnQ/Cisg ICAgICBjaGlsZHJlbjogUmVhY3RUcmFuc2l0aW9uQ2hpbGRNYXBwaW5nLmdldENoaWxkTWFwcGlu ZyhfdGhpcy5wcm9wcy5jaGlsZHJlbikKKyAgICB9LCBfdGhpcy5wZXJmb3JtQXBwZWFyID0gZnVu Y3Rpb24gKGtleSkgeworICAgICAgX3RoaXMuY3VycmVudGx5VHJhbnNpdGlvbmluZ0tleXNba2V5 XSA9IHRydWU7CisKKyAgICAgIHZhciBjb21wb25lbnQgPSBfdGhpcy5yZWZzW2tleV07CisKKyAg ICAgIGlmIChjb21wb25lbnQuY29tcG9uZW50V2lsbEFwcGVhcikgeworICAgICAgICBjb21wb25l bnQuY29tcG9uZW50V2lsbEFwcGVhcihfdGhpcy5faGFuZGxlRG9uZUFwcGVhcmluZy5iaW5kKF90 aGlzLCBrZXkpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIF90aGlzLl9oYW5kbGVEb25lQXBw ZWFyaW5nKGtleSk7CisgICAgICB9CisgICAgfSwgX3RoaXMuX2hhbmRsZURvbmVBcHBlYXJpbmcg PSBmdW5jdGlvbiAoa2V5KSB7CisgICAgICB2YXIgY29tcG9uZW50ID0gX3RoaXMucmVmc1trZXld OworICAgICAgaWYgKGNvbXBvbmVudC5jb21wb25lbnREaWRBcHBlYXIpIHsKKyAgICAgICAgY29t cG9uZW50LmNvbXBvbmVudERpZEFwcGVhcigpOworICAgICAgfQorCisgICAgICBkZWxldGUgX3Ro aXMuY3VycmVudGx5VHJhbnNpdGlvbmluZ0tleXNba2V5XTsKKworICAgICAgdmFyIGN1cnJlbnRD aGlsZE1hcHBpbmcgPSBSZWFjdFRyYW5zaXRpb25DaGlsZE1hcHBpbmcuZ2V0Q2hpbGRNYXBwaW5n KF90aGlzLnByb3BzLmNoaWxkcmVuKTsKKworICAgICAgaWYgKCFjdXJyZW50Q2hpbGRNYXBwaW5n IHx8ICFjdXJyZW50Q2hpbGRNYXBwaW5nLmhhc093blByb3BlcnR5KGtleSkpIHsKKyAgICAgICAg Ly8gVGhpcyB3YXMgcmVtb3ZlZCBiZWZvcmUgaXQgaGFkIGZ1bGx5IGFwcGVhcmVkLiBSZW1vdmUg aXQuCisgICAgICAgIF90aGlzLnBlcmZvcm1MZWF2ZShrZXkpOworICAgICAgfQorICAgIH0sIF90 aGlzLnBlcmZvcm1FbnRlciA9IGZ1bmN0aW9uIChrZXkpIHsKKyAgICAgIF90aGlzLmN1cnJlbnRs eVRyYW5zaXRpb25pbmdLZXlzW2tleV0gPSB0cnVlOworCisgICAgICB2YXIgY29tcG9uZW50ID0g X3RoaXMucmVmc1trZXldOworCisgICAgICBpZiAoY29tcG9uZW50LmNvbXBvbmVudFdpbGxFbnRl cikgeworICAgICAgICBjb21wb25lbnQuY29tcG9uZW50V2lsbEVudGVyKF90aGlzLl9oYW5kbGVE b25lRW50ZXJpbmcuYmluZChfdGhpcywga2V5KSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBf dGhpcy5faGFuZGxlRG9uZUVudGVyaW5nKGtleSk7CisgICAgICB9CisgICAgfSwgX3RoaXMuX2hh bmRsZURvbmVFbnRlcmluZyA9IGZ1bmN0aW9uIChrZXkpIHsKKyAgICAgIHZhciBjb21wb25lbnQg PSBfdGhpcy5yZWZzW2tleV07CisgICAgICBpZiAoY29tcG9uZW50LmNvbXBvbmVudERpZEVudGVy KSB7CisgICAgICAgIGNvbXBvbmVudC5jb21wb25lbnREaWRFbnRlcigpOworICAgICAgfQorCisg ICAgICBkZWxldGUgX3RoaXMuY3VycmVudGx5VHJhbnNpdGlvbmluZ0tleXNba2V5XTsKKworICAg ICAgdmFyIGN1cnJlbnRDaGlsZE1hcHBpbmcgPSBSZWFjdFRyYW5zaXRpb25DaGlsZE1hcHBpbmcu Z2V0Q2hpbGRNYXBwaW5nKF90aGlzLnByb3BzLmNoaWxkcmVuKTsKKworICAgICAgaWYgKCFjdXJy ZW50Q2hpbGRNYXBwaW5nIHx8ICFjdXJyZW50Q2hpbGRNYXBwaW5nLmhhc093blByb3BlcnR5KGtl eSkpIHsKKyAgICAgICAgLy8gVGhpcyB3YXMgcmVtb3ZlZCBiZWZvcmUgaXQgaGFkIGZ1bGx5IGVu dGVyZWQuIFJlbW92ZSBpdC4KKyAgICAgICAgX3RoaXMucGVyZm9ybUxlYXZlKGtleSk7CisgICAg ICB9CisgICAgfSwgX3RoaXMucGVyZm9ybUxlYXZlID0gZnVuY3Rpb24gKGtleSkgeworICAgICAg X3RoaXMuY3VycmVudGx5VHJhbnNpdGlvbmluZ0tleXNba2V5XSA9IHRydWU7CisKKyAgICAgIHZh ciBjb21wb25lbnQgPSBfdGhpcy5yZWZzW2tleV07CisgICAgICBpZiAoY29tcG9uZW50LmNvbXBv bmVudFdpbGxMZWF2ZSkgeworICAgICAgICBjb21wb25lbnQuY29tcG9uZW50V2lsbExlYXZlKF90 aGlzLl9oYW5kbGVEb25lTGVhdmluZy5iaW5kKF90aGlzLCBrZXkpKTsKKyAgICAgIH0gZWxzZSB7 CisgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGlzIHNvbWV3aGF0IGRhbmdlcm91cyBiL2MgaXQg Y2FsbHMgc2V0U3RhdGUoKQorICAgICAgICAvLyBhZ2FpbiwgZWZmZWN0aXZlbHkgbXV0YXRpbmcg dGhlIGNvbXBvbmVudCBiZWZvcmUgYWxsIHRoZSB3b3JrCisgICAgICAgIC8vIGlzIGRvbmUuCisg ICAgICAgIF90aGlzLl9oYW5kbGVEb25lTGVhdmluZyhrZXkpOworICAgICAgfQorICAgIH0sIF90 aGlzLl9oYW5kbGVEb25lTGVhdmluZyA9IGZ1bmN0aW9uIChrZXkpIHsKKyAgICAgIHZhciBjb21w b25lbnQgPSBfdGhpcy5yZWZzW2tleV07CisKKyAgICAgIGlmIChjb21wb25lbnQuY29tcG9uZW50 RGlkTGVhdmUpIHsKKyAgICAgICAgY29tcG9uZW50LmNvbXBvbmVudERpZExlYXZlKCk7CisgICAg ICB9CisKKyAgICAgIGRlbGV0ZSBfdGhpcy5jdXJyZW50bHlUcmFuc2l0aW9uaW5nS2V5c1trZXld OworCisgICAgICB2YXIgY3VycmVudENoaWxkTWFwcGluZyA9IFJlYWN0VHJhbnNpdGlvbkNoaWxk TWFwcGluZy5nZXRDaGlsZE1hcHBpbmcoX3RoaXMucHJvcHMuY2hpbGRyZW4pOworCisgICAgICBp ZiAoY3VycmVudENoaWxkTWFwcGluZyAmJiBjdXJyZW50Q2hpbGRNYXBwaW5nLmhhc093blByb3Bl cnR5KGtleSkpIHsKKyAgICAgICAgLy8gVGhpcyBlbnRlcmVkIGFnYWluIGJlZm9yZSBpdCBmdWxs eSBsZWZ0LiBBZGQgaXQgYWdhaW4uCisgICAgICAgIF90aGlzLnBlcmZvcm1FbnRlcihrZXkpOwor ICAgICAgfSBlbHNlIHsKKyAgICAgICAgX3RoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKHN0YXRlKSB7 CisgICAgICAgICAgdmFyIG5ld0NoaWxkcmVuID0gX2Fzc2lnbih7fSwgc3RhdGUuY2hpbGRyZW4p OworICAgICAgICAgIGRlbGV0ZSBuZXdDaGlsZHJlbltrZXldOworICAgICAgICAgIHJldHVybiB7 IGNoaWxkcmVuOiBuZXdDaGlsZHJlbiB9OworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9LCBf dGVtcCksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLCBfcmV0KTsKKyAgfQorCisg IFJlYWN0VHJhbnNpdGlvbkdyb3VwLnByb3RvdHlwZS5jb21wb25lbnRXaWxsTW91bnQgPSBmdW5j dGlvbiBjb21wb25lbnRXaWxsTW91bnQoKSB7CisgICAgdGhpcy5jdXJyZW50bHlUcmFuc2l0aW9u aW5nS2V5cyA9IHt9OworICAgIHRoaXMua2V5c1RvRW50ZXIgPSBbXTsKKyAgICB0aGlzLmtleXNU b0xlYXZlID0gW107CisgIH07CisKKyAgUmVhY3RUcmFuc2l0aW9uR3JvdXAucHJvdG90eXBlLmNv bXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7CisgICAgdmFy IGluaXRpYWxDaGlsZE1hcHBpbmcgPSB0aGlzLnN0YXRlLmNoaWxkcmVuOworICAgIGZvciAodmFy IGtleSBpbiBpbml0aWFsQ2hpbGRNYXBwaW5nKSB7CisgICAgICBpZiAoaW5pdGlhbENoaWxkTWFw cGluZ1trZXldKSB7CisgICAgICAgIHRoaXMucGVyZm9ybUFwcGVhcihrZXkpOworICAgICAgfQor ICAgIH0KKyAgfTsKKworICBSZWFjdFRyYW5zaXRpb25Hcm91cC5wcm90b3R5cGUuY29tcG9uZW50 V2lsbFJlY2VpdmVQcm9wcyA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4 dFByb3BzKSB7CisgICAgdmFyIG5leHRDaGlsZE1hcHBpbmcgPSBSZWFjdFRyYW5zaXRpb25DaGls ZE1hcHBpbmcuZ2V0Q2hpbGRNYXBwaW5nKG5leHRQcm9wcy5jaGlsZHJlbik7CisgICAgdmFyIHBy ZXZDaGlsZE1hcHBpbmcgPSB0aGlzLnN0YXRlLmNoaWxkcmVuOworCisgICAgdGhpcy5zZXRTdGF0 ZSh7CisgICAgICBjaGlsZHJlbjogUmVhY3RUcmFuc2l0aW9uQ2hpbGRNYXBwaW5nLm1lcmdlQ2hp bGRNYXBwaW5ncyhwcmV2Q2hpbGRNYXBwaW5nLCBuZXh0Q2hpbGRNYXBwaW5nKQorICAgIH0pOwor CisgICAgdmFyIGtleTsKKworICAgIGZvciAoa2V5IGluIG5leHRDaGlsZE1hcHBpbmcpIHsKKyAg ICAgIHZhciBoYXNQcmV2ID0gcHJldkNoaWxkTWFwcGluZyAmJiBwcmV2Q2hpbGRNYXBwaW5nLmhh c093blByb3BlcnR5KGtleSk7CisgICAgICBpZiAobmV4dENoaWxkTWFwcGluZ1trZXldICYmICFo YXNQcmV2ICYmICF0aGlzLmN1cnJlbnRseVRyYW5zaXRpb25pbmdLZXlzW2tleV0pIHsKKyAgICAg ICAgdGhpcy5rZXlzVG9FbnRlci5wdXNoKGtleSk7CisgICAgICB9CisgICAgfQorCisgICAgZm9y IChrZXkgaW4gcHJldkNoaWxkTWFwcGluZykgeworICAgICAgdmFyIGhhc05leHQgPSBuZXh0Q2hp bGRNYXBwaW5nICYmIG5leHRDaGlsZE1hcHBpbmcuaGFzT3duUHJvcGVydHkoa2V5KTsKKyAgICAg IGlmIChwcmV2Q2hpbGRNYXBwaW5nW2tleV0gJiYgIWhhc05leHQgJiYgIXRoaXMuY3VycmVudGx5 VHJhbnNpdGlvbmluZ0tleXNba2V5XSkgeworICAgICAgICB0aGlzLmtleXNUb0xlYXZlLnB1c2go a2V5KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB3ZSB3YW50IHRvIHNvbWVkYXkgY2hl Y2sgZm9yIHJlb3JkZXJpbmcsIHdlIGNvdWxkIGRvIGl0IGhlcmUuCisgIH07CisKKyAgUmVhY3RU cmFuc2l0aW9uR3JvdXAucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNv bXBvbmVudERpZFVwZGF0ZSgpIHsKKyAgICB2YXIga2V5c1RvRW50ZXIgPSB0aGlzLmtleXNUb0Vu dGVyOworICAgIHRoaXMua2V5c1RvRW50ZXIgPSBbXTsKKyAgICBrZXlzVG9FbnRlci5mb3JFYWNo KHRoaXMucGVyZm9ybUVudGVyKTsKKworICAgIHZhciBrZXlzVG9MZWF2ZSA9IHRoaXMua2V5c1Rv TGVhdmU7CisgICAgdGhpcy5rZXlzVG9MZWF2ZSA9IFtdOworICAgIGtleXNUb0xlYXZlLmZvckVh Y2godGhpcy5wZXJmb3JtTGVhdmUpOworICB9OworCisgIFJlYWN0VHJhbnNpdGlvbkdyb3VwLnBy b3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7CisgICAgLy8gVE9ETzogd2UgY291 bGQgZ2V0IHJpZCBvZiB0aGUgbmVlZCBmb3IgdGhlIHdyYXBwZXIgbm9kZQorICAgIC8vIGJ5IGNs b25pbmcgYSBzaW5nbGUgY2hpbGQKKyAgICB2YXIgY2hpbGRyZW5Ub1JlbmRlciA9IFtdOworICAg IGZvciAodmFyIGtleSBpbiB0aGlzLnN0YXRlLmNoaWxkcmVuKSB7CisgICAgICB2YXIgY2hpbGQg PSB0aGlzLnN0YXRlLmNoaWxkcmVuW2tleV07CisgICAgICBpZiAoY2hpbGQpIHsKKyAgICAgICAg Ly8gWW91IG1heSBuZWVkIHRvIGFwcGx5IHJlYWN0aXZlIHVwZGF0ZXMgdG8gYSBjaGlsZCBhcyBp dCBpcyBsZWF2aW5nLgorICAgICAgICAvLyBUaGUgbm9ybWFsIFJlYWN0IHdheSB0byBkbyBpdCB3 b24ndCB3b3JrIHNpbmNlIHRoZSBjaGlsZCB3aWxsIGhhdmUKKyAgICAgICAgLy8gYWxyZWFkeSBi ZWVuIHJlbW92ZWQuIEluIGNhc2UgeW91IG5lZWQgdGhpcyBiZWhhdmlvciB5b3UgY2FuIHByb3Zp ZGUKKyAgICAgICAgLy8gYSBjaGlsZEZhY3RvcnkgZnVuY3Rpb24gdG8gd3JhcCBldmVyeSBjaGls ZCwgZXZlbiB0aGUgb25lcyB0aGF0IGFyZQorICAgICAgICAvLyBsZWF2aW5nLgorICAgICAgICBj aGlsZHJlblRvUmVuZGVyLnB1c2goUmVhY3QuY2xvbmVFbGVtZW50KHRoaXMucHJvcHMuY2hpbGRG YWN0b3J5KGNoaWxkKSwgeyByZWY6IGtleSwga2V5OiBrZXkgfSkpOworICAgICAgfQorICAgIH0K KworICAgIC8vIERvIG5vdCBmb3J3YXJkIFJlYWN0VHJhbnNpdGlvbkdyb3VwIHByb3BzIHRvIHBy aW1pdGl2ZSBET00gbm9kZXMKKyAgICB2YXIgcHJvcHMgPSBfYXNzaWduKHt9LCB0aGlzLnByb3Bz KTsKKyAgICBkZWxldGUgcHJvcHMudHJhbnNpdGlvbkxlYXZlOworICAgIGRlbGV0ZSBwcm9wcy50 cmFuc2l0aW9uTmFtZTsKKyAgICBkZWxldGUgcHJvcHMudHJhbnNpdGlvbkFwcGVhcjsKKyAgICBk ZWxldGUgcHJvcHMudHJhbnNpdGlvbkVudGVyOworICAgIGRlbGV0ZSBwcm9wcy5jaGlsZEZhY3Rv cnk7CisgICAgZGVsZXRlIHByb3BzLnRyYW5zaXRpb25MZWF2ZVRpbWVvdXQ7CisgICAgZGVsZXRl IHByb3BzLnRyYW5zaXRpb25FbnRlclRpbWVvdXQ7CisgICAgZGVsZXRlIHByb3BzLnRyYW5zaXRp b25BcHBlYXJUaW1lb3V0OworICAgIGRlbGV0ZSBwcm9wcy5jb21wb25lbnQ7CisKKyAgICByZXR1 cm4gUmVhY3QuY3JlYXRlRWxlbWVudCh0aGlzLnByb3BzLmNvbXBvbmVudCwgcHJvcHMsIGNoaWxk cmVuVG9SZW5kZXIpOworICB9OworCisgIHJldHVybiBSZWFjdFRyYW5zaXRpb25Hcm91cDsKK30o UmVhY3QuQ29tcG9uZW50KTsKKworUmVhY3RUcmFuc2l0aW9uR3JvdXAuZGlzcGxheU5hbWUgPSAn UmVhY3RUcmFuc2l0aW9uR3JvdXAnOworUmVhY3RUcmFuc2l0aW9uR3JvdXAucHJvcFR5cGVzID0g eworICBjb21wb25lbnQ6IFJlYWN0LlByb3BUeXBlcy5hbnksCisgIGNoaWxkRmFjdG9yeTogUmVh Y3QuUHJvcFR5cGVzLmZ1bmMKK307CitSZWFjdFRyYW5zaXRpb25Hcm91cC5kZWZhdWx0UHJvcHMg PSB7CisgIGNvbXBvbmVudDogJ3NwYW4nLAorICBjaGlsZEZhY3Rvcnk6IGVtcHR5RnVuY3Rpb24u dGhhdFJldHVybnNBcmd1bWVudAorfTsKKworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0VHJhbnNp dGlvbkdyb3VwOworfSx7IjI3IjoyNywiNDQiOjQ0LCI0OSI6NDksIjUiOjV9XSwzMDpbZnVuY3Rp b24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNl bnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMg c291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5k IGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNv dXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBi ZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisg Ki8KKworJ3VzZSBzdHJpY3QnOworCittb2R1bGUuZXhwb3J0cyA9ICcxNS40LjInOworfSx7fV0s MzE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQg MjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq CisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGlj ZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkg b2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJp Z2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3Rv cnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIExpbmtlZFN0YXRlTWl4aW4gPSBf ZGVyZXFfKDMpOwordmFyIFJlYWN0ID0gX2RlcmVxXyg1KTsKK3ZhciBSZWFjdEFkZG9uc0RPTURl cGVuZGVuY2llcyA9IF9kZXJlcV8oNik7Cit2YXIgUmVhY3RDb21wb25lbnRXaXRoUHVyZVJlbmRl ck1peGluID0gX2RlcmVxXygxMyk7Cit2YXIgUmVhY3RDU1NUcmFuc2l0aW9uR3JvdXAgPSBfZGVy ZXFfKDcpOwordmFyIFJlYWN0RnJhZ21lbnQgPSBfZGVyZXFfKDE5KTsKK3ZhciBSZWFjdFRyYW5z aXRpb25Hcm91cCA9IF9kZXJlcV8oMjkpOworCit2YXIgc2hhbGxvd0NvbXBhcmUgPSBfZGVyZXFf KDM5KTsKK3ZhciB1cGRhdGUgPSBfZGVyZXFfKDQxKTsKKworUmVhY3QuYWRkb25zID0geworICBD U1NUcmFuc2l0aW9uR3JvdXA6IFJlYWN0Q1NTVHJhbnNpdGlvbkdyb3VwLAorICBMaW5rZWRTdGF0 ZU1peGluOiBMaW5rZWRTdGF0ZU1peGluLAorICBQdXJlUmVuZGVyTWl4aW46IFJlYWN0Q29tcG9u ZW50V2l0aFB1cmVSZW5kZXJNaXhpbiwKKyAgVHJhbnNpdGlvbkdyb3VwOiBSZWFjdFRyYW5zaXRp b25Hcm91cCwKKworICBjcmVhdGVGcmFnbWVudDogUmVhY3RGcmFnbWVudC5jcmVhdGUsCisgIHNo YWxsb3dDb21wYXJlOiBzaGFsbG93Q29tcGFyZSwKKyAgdXBkYXRlOiB1cGRhdGUKK307CisKK2lm ICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgLy8gRm9yIHRoZSBVTUQgYnVp bGQgd2UgZ2V0IHRoZXNlIGxhemlseSBmcm9tIHRoZSBnbG9iYWwgc2luY2UgdGhleSdyZSB0aWVk CisgIC8vIHRvIHRoZSBET00gcmVuZGVyZXIgYW5kIGl0IGhhc24ndCBsb2FkZWQgeWV0LgorICBP YmplY3QuZGVmaW5lUHJvcGVydHkoUmVhY3QuYWRkb25zLCAnUGVyZicsIHsKKyAgICBlbnVtZXJh YmxlOiB0cnVlLAorICAgIGdldDogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIFJlYWN0QWRk b25zRE9NRGVwZW5kZW5jaWVzLmdldFJlYWN0UGVyZigpOworICAgIH0KKyAgfSk7CisgIE9iamVj dC5kZWZpbmVQcm9wZXJ0eShSZWFjdC5hZGRvbnMsICdUZXN0VXRpbHMnLCB7CisgICAgZW51bWVy YWJsZTogdHJ1ZSwKKyAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBSZWFjdEFk ZG9uc0RPTURlcGVuZGVuY2llcy5nZXRSZWFjdFRlc3RVdGlscygpOworICAgIH0KKyAgfSk7Cit9 CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3Q7Cit9LHsiMTMiOjEzLCIxOSI6MTksIjI5IjoyOSwi MyI6MywiMzkiOjM5LCI0MSI6NDEsIjUiOjUsIjYiOjYsIjciOjd9XSwzMjpbZnVuY3Rpb24oX2Rl cmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZh Y2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNl IGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRo ZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0 cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3Vu ZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKwor J3VzZSBzdHJpY3QnOworCit2YXIgX2Fzc2lnbiA9IF9kZXJlcV8oNDkpOworCit2YXIgUmVhY3RX aXRoQWRkb25zID0gX2RlcmVxXygzMSk7CisKKy8vIGB2ZXJzaW9uYCB3aWxsIGJlIGFkZGVkIGhl cmUgYnkgdGhlIFJlYWN0IG1vZHVsZS4KK3ZhciBSZWFjdFdpdGhBZGRvbnNVTURFbnRyeSA9IF9h c3NpZ24oeworICBfX1NFQ1JFVF9JTkpFQ1RFRF9SRUFDVF9ET01fRE9fTk9UX1VTRV9PUl9ZT1Vf V0lMTF9CRV9GSVJFRDogbnVsbCwgLy8gV2lsbCBiZSBpbmplY3RlZCBieSBSZWFjdERPTSBVTUQg YnVpbGQuCisgIF9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJ UkVEOiB7CisgICAgUmVhY3RDdXJyZW50T3duZXI6IF9kZXJlcV8oMTQpCisgIH0KK30sIFJlYWN0 V2l0aEFkZG9ucyk7CisKK2lmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAg X2Fzc2lnbihSZWFjdFdpdGhBZGRvbnNVTURFbnRyeS5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9U X1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCwgeworICAgIC8vIFJlYWN0Q29tcG9uZW50VHJlZUhv b2sgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiBwcm9kdWN0aW9uLgorICAgIFJlYWN0Q29tcG9u ZW50VHJlZUhvb2s6IF9kZXJlcV8oMTIpCisgIH0pOworfQorCittb2R1bGUuZXhwb3J0cyA9IFJl YWN0V2l0aEFkZG9uc1VNREVudHJ5OworfSx7IjEyIjoxMiwiMTQiOjE0LCIzMSI6MzEsIjQ5Ijo0 OX1dLDMzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJp Z2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQu CisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxl IGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0 b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVu dCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGly ZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIGNhbkRlZmluZVBy b3BlcnR5ID0gZmFsc2U7CitpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7Cisg IHRyeSB7CisgICAgLy8gJEZsb3dGaXhNZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxv dy9pc3N1ZXMvMjg1CisgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAneCcsIHsgZ2V0OiBm dW5jdGlvbiAoKSB7fSB9KTsKKyAgICBjYW5EZWZpbmVQcm9wZXJ0eSA9IHRydWU7CisgIH0gY2F0 Y2ggKHgpIHsKKyAgICAvLyBJRSB3aWxsIGZhaWwgb24gZGVmaW5lUHJvcGVydHkKKyAgfQorfQor Cittb2R1bGUuZXhwb3J0cyA9IGNhbkRlZmluZVByb3BlcnR5OworfSx7fV0sMzQ6W2Z1bmN0aW9u KF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworKGZ1bmN0aW9uIChwcm9jZXNzKXsKKy8qKgorICog Q29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVz ZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNE LXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qg ZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9m IHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNh bWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJvZEludmFy aWFudCA9IF9kZXJlcV8oMzgpOworCit2YXIgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMgPSBf ZGVyZXFfKDIyKTsKK3ZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9IF9kZXJlcV8oMjQpOworCit2 YXIgaW52YXJpYW50ID0gX2RlcmVxXyg0Nik7Cit2YXIgd2FybmluZyA9IF9kZXJlcV8oNDgpOwor Cit2YXIgUmVhY3RDb21wb25lbnRUcmVlSG9vazsKKworaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAn dW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudiAmJiAiZGV2ZWxvcG1lbnQiID09PSAndGVzdCcpIHsK KyAgLy8gVGVtcG9yYXJ5IGhhY2suCisgIC8vIElubGluZSByZXF1aXJlcyBkb24ndCB3b3JrIHdl bGwgd2l0aCBKZXN0OgorICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNz dWVzLzcyNDAKKyAgLy8gUmVtb3ZlIHRoZSBpbmxpbmUgcmVxdWlyZXMgd2hlbiB3ZSBkb24ndCBu ZWVkIHRoZW0gYW55bW9yZToKKyAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0 L3B1bGwvNzE3OAorICBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gX2RlcmVxXygxMik7Cit9CisK K3ZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTsKKworLyoqCisgKiBBc3NlcnQgdGhhdCB0aGUg dmFsdWVzIG1hdGNoIHdpdGggdGhlIHR5cGUgc3BlY3MuCisgKiBFcnJvciBtZXNzYWdlcyBhcmUg bWVtb3JpemVkIGFuZCB3aWxsIG9ubHkgYmUgc2hvd24gb25jZS4KKyAqCisgKiBAcGFyYW0ge29i amVjdH0gdHlwZVNwZWNzIE1hcCBvZiBuYW1lIHRvIGEgUmVhY3RQcm9wVHlwZQorICogQHBhcmFt IHtvYmplY3R9IHZhbHVlcyBSdW50aW1lIHZhbHVlcyB0aGF0IG5lZWQgdG8gYmUgdHlwZS1jaGVj a2VkCisgKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb24gZS5nLiAicHJvcCIsICJjb250ZXh0Iiwg ImNoaWxkIGNvbnRleHQiCisgKiBAcGFyYW0ge3N0cmluZ30gY29tcG9uZW50TmFtZSBOYW1lIG9m IHRoZSBjb21wb25lbnQgZm9yIGVycm9yIG1lc3NhZ2VzLgorICogQHBhcmFtIHs/b2JqZWN0fSBl bGVtZW50IFRoZSBSZWFjdCBlbGVtZW50IHRoYXQgaXMgYmVpbmcgdHlwZS1jaGVja2VkCisgKiBA cGFyYW0gez9udW1iZXJ9IGRlYnVnSUQgVGhlIFJlYWN0IGNvbXBvbmVudCBpbnN0YW5jZSB0aGF0 IGlzIGJlaW5nIHR5cGUtY2hlY2tlZAorICogQHByaXZhdGUKKyAqLworZnVuY3Rpb24gY2hlY2tS ZWFjdFR5cGVTcGVjKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgY29tcG9uZW50TmFtZSwg ZWxlbWVudCwgZGVidWdJRCkgeworICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNz KSB7CisgICAgaWYgKHR5cGVTcGVjcy5oYXNPd25Qcm9wZXJ0eSh0eXBlU3BlY05hbWUpKSB7Cisg ICAgICB2YXIgZXJyb3I7CisgICAgICAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cu IEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0bworICAgICAgLy8gZmFpbCB0aGUgcmVu ZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LgorICAg ICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRo cm93LgorICAgICAgdHJ5IHsKKyAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGlu dmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lCisgICAgICAgIC8vIGJlaGF2 aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2Fn ZS4KKyAgICAgICAgISh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gPT09ICdmdW5jdGlv bicpID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAn JXM6ICVzIHR5cGUgYCVzYCBpcyBpbnZhbGlkOyBpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFs bHkgZnJvbSBSZWFjdC5Qcm9wVHlwZXMuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3Mn LCBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl0sIHR5cGVTcGVjTmFtZSkgOiBf cHJvZEludmFyaWFudCgnODQnLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIFJlYWN0 UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXSwgdHlwZVNwZWNOYW1lKSA6IHZvaWQgMDsK KyAgICAgICAgZXJyb3IgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVj TmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsIFJlYWN0UHJvcFR5cGVzU2VjcmV0 KTsKKyAgICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICAgIGVycm9yID0gZXg7CisgICAgICB9Cisg ICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFlcnJvciB8fCBl cnJvciBpbnN0YW5jZW9mIEVycm9yLCAnJXM6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAlcyBgJXNg IGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArICdmdW5jdGlvbiBtdXN0IHJldHVybiBg bnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAlcy4gJyArICdZb3UgbWF5IGhhdmUg Zm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICsgJ2Ny ZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBh bmQgJyArICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJywgY29tcG9uZW50TmFtZSB8 fCAnUmVhY3QgY2xhc3MnLCBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl0sIHR5 cGVTcGVjTmFtZSwgdHlwZW9mIGVycm9yKSA6IHZvaWQgMDsKKyAgICAgIGlmIChlcnJvciBpbnN0 YW5jZW9mIEVycm9yICYmICEoZXJyb3IubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7 CisgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJl IHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZQorICAgICAgICAvLyBzYW1lIGVycm9yLgorICAgICAg ICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IubWVzc2FnZV0gPSB0cnVlOworCisgICAgICAgIHZh ciBjb21wb25lbnRTdGFja0luZm8gPSAnJzsKKworICAgICAgICBpZiAoImRldmVsb3BtZW50IiAh PT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICAgICAgaWYgKCFSZWFjdENvbXBvbmVudFRyZWVIb29r KSB7CisgICAgICAgICAgICBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gX2RlcmVxXygxMik7Cisg ICAgICAgICAgfQorICAgICAgICAgIGlmIChkZWJ1Z0lEICE9PSBudWxsKSB7CisgICAgICAgICAg ICBjb21wb25lbnRTdGFja0luZm8gPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRk ZW5kdW1CeUlEKGRlYnVnSUQpOworICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCAhPT0gbnVs bCkgeworICAgICAgICAgICAgY29tcG9uZW50U3RhY2tJbmZvID0gUmVhY3RDb21wb25lbnRUcmVl SG9vay5nZXRDdXJyZW50U3RhY2tBZGRlbmR1bShlbGVtZW50KTsKKyAgICAgICAgICB9CisgICAg ICAgIH0KKworICAgICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5n KGZhbHNlLCAnRmFpbGVkICVzIHR5cGU6ICVzJXMnLCBsb2NhdGlvbiwgZXJyb3IubWVzc2FnZSwg Y29tcG9uZW50U3RhY2tJbmZvKSA6IHZvaWQgMDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwor bW9kdWxlLmV4cG9ydHMgPSBjaGVja1JlYWN0VHlwZVNwZWM7Cit9KS5jYWxsKHRoaXMsdW5kZWZp bmVkKQorfSx7IjEyIjoxMiwiMjIiOjIyLCIyNCI6MjQsIjM4IjozOCwiNDYiOjQ2LCI0OCI6NDh9 XSwzNTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisoZnVuY3Rpb24gKHByb2Nl c3MpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICog QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2Vk IHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmls ZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25h bCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMg ZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogCisgKi8KKworJ3VzZSBzdHJpY3Qn OworCit2YXIgS2V5RXNjYXBlVXRpbHMgPSBfZGVyZXFfKDIpOwordmFyIHRyYXZlcnNlQWxsQ2hp bGRyZW4gPSBfZGVyZXFfKDQwKTsKK3ZhciB3YXJuaW5nID0gX2RlcmVxXyg0OCk7CisKK3ZhciBS ZWFjdENvbXBvbmVudFRyZWVIb29rOworCitpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmlu ZWQnICYmIHByb2Nlc3MuZW52ICYmICJkZXZlbG9wbWVudCIgPT09ICd0ZXN0JykgeworICAvLyBU ZW1wb3JhcnkgaGFjay4KKyAgLy8gSW5saW5lIHJlcXVpcmVzIGRvbid0IHdvcmsgd2VsbCB3aXRo IEplc3Q6CisgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzI0 MAorICAvLyBSZW1vdmUgdGhlIGlubGluZSByZXF1aXJlcyB3aGVuIHdlIGRvbid0IG5lZWQgdGhl bSBhbnltb3JlOgorICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC83 MTc4CisgIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSBfZGVyZXFfKDEyKTsKK30KKworLyoqCisg KiBAcGFyYW0ge2Z1bmN0aW9ufSB0cmF2ZXJzZUNvbnRleHQgQ29udGV4dCBwYXNzZWQgdGhyb3Vn aCB0cmF2ZXJzYWwuCisgKiBAcGFyYW0gez9SZWFjdENvbXBvbmVudH0gY2hpbGQgUmVhY3QgY2hp bGQgY29tcG9uZW50LgorICogQHBhcmFtIHshc3RyaW5nfSBuYW1lIFN0cmluZyBuYW1lIG9mIGtl eSBwYXRoIHRvIGNoaWxkLgorICogQHBhcmFtIHtudW1iZXI9fSBzZWxmRGVidWdJRCBPcHRpb25h bCBkZWJ1Z0lEIG9mIHRoZSBjdXJyZW50IGludGVybmFsIGluc3RhbmNlLgorICovCitmdW5jdGlv biBmbGF0dGVuU2luZ2xlQ2hpbGRJbnRvQ29udGV4dCh0cmF2ZXJzZUNvbnRleHQsIGNoaWxkLCBu YW1lLCBzZWxmRGVidWdJRCkgeworICAvLyBXZSBmb3VuZCBhIGNvbXBvbmVudCBpbnN0YW5jZS4K KyAgaWYgKHRyYXZlcnNlQ29udGV4dCAmJiB0eXBlb2YgdHJhdmVyc2VDb250ZXh0ID09PSAnb2Jq ZWN0JykgeworICAgIHZhciByZXN1bHQgPSB0cmF2ZXJzZUNvbnRleHQ7CisgICAgdmFyIGtleVVu aXF1ZSA9IHJlc3VsdFtuYW1lXSA9PT0gdW5kZWZpbmVkOworICAgIGlmICgiZGV2ZWxvcG1lbnQi ICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIGlmICghUmVhY3RDb21wb25lbnRUcmVlSG9vaykg eworICAgICAgICBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gX2RlcmVxXygxMik7CisgICAgICB9 CisgICAgICBpZiAoIWtleVVuaXF1ZSkgeworICAgICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJv ZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnZmxhdHRlbkNoaWxkcmVuKC4uLik6IEVuY291bnRl cmVkIHR3byBjaGlsZHJlbiB3aXRoIHRoZSBzYW1lIGtleSwgJyArICdgJXNgLiBDaGlsZCBrZXlz IG11c3QgYmUgdW5pcXVlOyB3aGVuIHR3byBjaGlsZHJlbiBzaGFyZSBhIGtleSwgb25seSAnICsg J3RoZSBmaXJzdCBjaGlsZCB3aWxsIGJlIHVzZWQuJXMnLCBLZXlFc2NhcGVVdGlscy51bmVzY2Fw ZShuYW1lKSwgUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChzZWxm RGVidWdJRCkpIDogdm9pZCAwOworICAgICAgfQorICAgIH0KKyAgICBpZiAoa2V5VW5pcXVlICYm IGNoaWxkICE9IG51bGwpIHsKKyAgICAgIHJlc3VsdFtuYW1lXSA9IGNoaWxkOworICAgIH0KKyAg fQorfQorCisvKioKKyAqIEZsYXR0ZW5zIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVj aWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYC4gQW55IG51bGwKKyAqIGNoaWxkcmVuIHdpbGwgbm90 IGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgb2JqZWN0LgorICogQHJldHVybiB7IW9iamVj dH0gZmxhdHRlbmVkIGNoaWxkcmVuIGtleWVkIGJ5IG5hbWUuCisgKi8KK2Z1bmN0aW9uIGZsYXR0 ZW5DaGlsZHJlbihjaGlsZHJlbiwgc2VsZkRlYnVnSUQpIHsKKyAgaWYgKGNoaWxkcmVuID09IG51 bGwpIHsKKyAgICByZXR1cm4gY2hpbGRyZW47CisgIH0KKyAgdmFyIHJlc3VsdCA9IHt9OworCisg IGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICB0cmF2ZXJzZUFsbENo aWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAodHJhdmVyc2VDb250ZXh0LCBjaGlsZCwgbmFtZSkg eworICAgICAgcmV0dXJuIGZsYXR0ZW5TaW5nbGVDaGlsZEludG9Db250ZXh0KHRyYXZlcnNlQ29u dGV4dCwgY2hpbGQsIG5hbWUsIHNlbGZEZWJ1Z0lEKTsKKyAgICB9LCByZXN1bHQpOworICB9IGVs c2UgeworICAgIHRyYXZlcnNlQWxsQ2hpbGRyZW4oY2hpbGRyZW4sIGZsYXR0ZW5TaW5nbGVDaGls ZEludG9Db250ZXh0LCByZXN1bHQpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK21vZHVs ZS5leHBvcnRzID0gZmxhdHRlbkNoaWxkcmVuOworfSkuY2FsbCh0aGlzLHVuZGVmaW5lZCkKK30s eyIxMiI6MTIsIjIiOjIsIjQwIjo0MCwiNDgiOjQ4fV0sMzY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9k dWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywg SW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlz IGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJ Q0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4g YWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhl IFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogCisgKi8KKworJ3Vz ZSBzdHJpY3QnOworCisvKiBnbG9iYWwgU3ltYm9sICovCisKK3ZhciBJVEVSQVRPUl9TWU1CT0wg PSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5pdGVyYXRvcjsKK3ZhciBG QVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJzsgLy8gQmVmb3JlIFN5bWJvbCBzcGVj LgorCisvKioKKyAqIFJldHVybnMgdGhlIGl0ZXJhdG9yIG1ldGhvZCBmdW5jdGlvbiBjb250YWlu ZWQgb24gdGhlIGl0ZXJhYmxlIG9iamVjdC4KKyAqCisgKiBCZSBzdXJlIHRvIGludm9rZSB0aGUg ZnVuY3Rpb24gd2l0aCB0aGUgaXRlcmFibGUgYXMgY29udGV4dDoKKyAqCisgKiAgICAgdmFyIGl0 ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG15SXRlcmFibGUpOworICogICAgIGlmIChpdGVyYXRv ckZuKSB7CisgKiAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobXlJdGVyYWJs ZSk7CisgKiAgICAgICAuLi4KKyAqICAgICB9CisgKgorICogQHBhcmFtIHs/b2JqZWN0fSBtYXli ZUl0ZXJhYmxlCisgKiBAcmV0dXJuIHs/ZnVuY3Rpb259CisgKi8KK2Z1bmN0aW9uIGdldEl0ZXJh dG9yRm4obWF5YmVJdGVyYWJsZSkgeworICB2YXIgaXRlcmF0b3JGbiA9IG1heWJlSXRlcmFibGUg JiYgKElURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW0lURVJBVE9SX1NZTUJPTF0gfHwg bWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF0pOworICBpZiAodHlwZW9mIGl0ZXJh dG9yRm4gPT09ICdmdW5jdGlvbicpIHsKKyAgICByZXR1cm4gaXRlcmF0b3JGbjsKKyAgfQorfQor Cittb2R1bGUuZXhwb3J0cyA9IGdldEl0ZXJhdG9yRm47Cit9LHt9XSwzNzpbZnVuY3Rpb24oX2Rl cmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZh Y2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNl IGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRo ZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0 cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3Vu ZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKyd1 c2Ugc3RyaWN0JzsKKwordmFyIF9wcm9kSW52YXJpYW50ID0gX2RlcmVxXygzOCk7CisKK3ZhciBS ZWFjdEVsZW1lbnQgPSBfZGVyZXFfKDE2KTsKKwordmFyIGludmFyaWFudCA9IF9kZXJlcV8oNDYp OworCisvKioKKyAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGluIGEgY29sbGVjdGlvbiBvZiBj aGlsZHJlbiBhbmQgdmVyaWZpZXMgdGhhdCB0aGVyZQorICogaXMgb25seSBvbmUgY2hpbGQgaW4g dGhlIGNvbGxlY3Rpb24uCisgKgorICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3Jl YWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNoaWxkcmVuLm9ubHkKKyAqCisgKiBU aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBh IHNpbmdsZSBjaGlsZCBnZXRzCisgKiBwYXNzZWQgd2l0aG91dCBhIHdyYXBwZXIsIGJ1dCB0aGUg cHVycG9zZSBvZiB0aGlzIGhlbHBlciBmdW5jdGlvbiBpcyB0bworICogYWJzdHJhY3QgYXdheSB0 aGUgcGFydGljdWxhciBzdHJ1Y3R1cmUgb2YgY2hpbGRyZW4uCisgKgorICogQHBhcmFtIHs/b2Jq ZWN0fSBjaGlsZHJlbiBDaGlsZCBjb2xsZWN0aW9uIHN0cnVjdHVyZS4KKyAqIEByZXR1cm4ge1Jl YWN0RWxlbWVudH0gVGhlIGZpcnN0IGFuZCBvbmx5IGBSZWFjdEVsZW1lbnRgIGNvbnRhaW5lZCBp biB0aGUKKyAqIHN0cnVjdHVyZS4KKyAqLworZnVuY3Rpb24gb25seUNoaWxkKGNoaWxkcmVuKSB7 CisgICFSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pID8gImRldmVsb3BtZW50 IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3QuQ2hpbGRyZW4ub25s eSBleHBlY3RlZCB0byByZWNlaXZlIGEgc2luZ2xlIFJlYWN0IGVsZW1lbnQgY2hpbGQuJykgOiBf cHJvZEludmFyaWFudCgnMTQzJykgOiB2b2lkIDA7CisgIHJldHVybiBjaGlsZHJlbjsKK30KKwor bW9kdWxlLmV4cG9ydHMgPSBvbmx5Q2hpbGQ7Cit9LHsiMTYiOjE2LCIzOCI6MzgsIjQ2Ijo0Nn1d LDM4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0 IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVk LgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHls ZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVj dG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRl bnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRp cmVjdG9yeS4KKyAqCisgKiAKKyAqLworJ3VzZSBzdHJpY3QnOworCisvKioKKyAqIFdBUk5JTkc6 IERPIE5PVCBtYW51YWxseSByZXF1aXJlIHRoaXMgbW9kdWxlLgorICogVGhpcyBpcyBhIHJlcGxh Y2VtZW50IGZvciBgaW52YXJpYW50KC4uLilgIHVzZWQgYnkgdGhlIGVycm9yIGNvZGUgc3lzdGVt CisgKiBhbmQgd2lsbCBfb25seV8gYmUgcmVxdWlyZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgYmFi ZWwgcGFzcy4KKyAqIEl0IGFsd2F5cyB0aHJvd3MuCisgKi8KKworZnVuY3Rpb24gcmVhY3RQcm9k SW52YXJpYW50KGNvZGUpIHsKKyAgdmFyIGFyZ0NvdW50ID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7 CisKKyAgdmFyIG1lc3NhZ2UgPSAnTWluaWZpZWQgUmVhY3QgZXJyb3IgIycgKyBjb2RlICsgJzsg dmlzaXQgJyArICdodHRwOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvZXJyb3ItZGVj b2Rlci5odG1sP2ludmFyaWFudD0nICsgY29kZTsKKworICBmb3IgKHZhciBhcmdJZHggPSAwOyBh cmdJZHggPCBhcmdDb3VudDsgYXJnSWR4KyspIHsKKyAgICBtZXNzYWdlICs9ICcmYXJnc1tdPScg KyBlbmNvZGVVUklDb21wb25lbnQoYXJndW1lbnRzW2FyZ0lkeCArIDFdKTsKKyAgfQorCisgIG1l c3NhZ2UgKz0gJyBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBk ZXYgZW52aXJvbm1lbnQnICsgJyBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1 bCB3YXJuaW5ncy4nOworCisgIHZhciBlcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKTsKKyAgZXJy b3IubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJzsKKyAgZXJyb3IuZnJhbWVzVG9Qb3AgPSAx OyAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IHJlYWN0UHJvZEludmFyaWFudCdzIG93biBmcmFtZQor CisgIHRocm93IGVycm9yOworfQorCittb2R1bGUuZXhwb3J0cyA9IHJlYWN0UHJvZEludmFyaWFu dDsKK30se31dLDM5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICog Q29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVz ZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNE LXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qg ZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9m IHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNh bWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBzaGFsbG93RXF1 YWwgPSBfZGVyZXFfKDQ3KTsKKworLyoqCisgKiBEb2VzIGEgc2hhbGxvdyBjb21wYXJpc29uIGZv ciBwcm9wcyBhbmQgc3RhdGUuCisgKiBTZWUgUmVhY3RDb21wb25lbnRXaXRoUHVyZVJlbmRlck1p eGluCisgKiBTZWUgYWxzbyBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3No YWxsb3ctY29tcGFyZS5odG1sCisgKi8KK2Z1bmN0aW9uIHNoYWxsb3dDb21wYXJlKGluc3RhbmNl LCBuZXh0UHJvcHMsIG5leHRTdGF0ZSkgeworICByZXR1cm4gIXNoYWxsb3dFcXVhbChpbnN0YW5j ZS5wcm9wcywgbmV4dFByb3BzKSB8fCAhc2hhbGxvd0VxdWFsKGluc3RhbmNlLnN0YXRlLCBuZXh0 U3RhdGUpOworfQorCittb2R1bGUuZXhwb3J0cyA9IHNoYWxsb3dDb21wYXJlOworfSx7IjQ3Ijo0 N31dLDQwOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJp Z2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQu CisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxl IGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0 b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVu dCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGly ZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJvZEludmFyaWFudCA9 IF9kZXJlcV8oMzgpOworCit2YXIgUmVhY3RDdXJyZW50T3duZXIgPSBfZGVyZXFfKDE0KTsKK3Zh ciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBfZGVyZXFfKDE3KTsKKwordmFyIGdldEl0ZXJhdG9yRm4g PSBfZGVyZXFfKDM2KTsKK3ZhciBpbnZhcmlhbnQgPSBfZGVyZXFfKDQ2KTsKK3ZhciBLZXlFc2Nh cGVVdGlscyA9IF9kZXJlcV8oMik7Cit2YXIgd2FybmluZyA9IF9kZXJlcV8oNDgpOworCit2YXIg U0VQQVJBVE9SID0gJy4nOwordmFyIFNVQlNFUEFSQVRPUiA9ICc6JzsKKworLyoqCisgKiBUaGlz IGlzIGlubGluZWQgZnJvbSBSZWFjdEVsZW1lbnQgc2luY2UgdGhpcyBmaWxlIGlzIHNoYXJlZCBi ZXR3ZWVuCisgKiBpc29tb3JwaGljIGFuZCByZW5kZXJlcnMuIFdlIGNvdWxkIGV4dHJhY3QgdGhp cyB0byBhCisgKgorICovCisKKy8qKgorICogVE9ETzogVGVzdCB0aGF0IGEgc2luZ2xlIGNoaWxk IGFuZCBhbiBhcnJheSB3aXRoIG9uZSBpdGVtIGhhdmUgdGhlIHNhbWUga2V5CisgKiBwYXR0ZXJu LgorICovCisKK3ZhciBkaWRXYXJuQWJvdXRNYXBzID0gZmFsc2U7CisKKy8qKgorICogR2VuZXJh dGUgYSBrZXkgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyBhIGNvbXBvbmVudCB3aXRoaW4gYSBzZXQu CisgKgorICogQHBhcmFtIHsqfSBjb21wb25lbnQgQSBjb21wb25lbnQgdGhhdCBjb3VsZCBjb250 YWluIGEgbWFudWFsIGtleS4KKyAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCB0aGF0IGlz IHVzZWQgaWYgYSBtYW51YWwga2V5IGlzIG5vdCBwcm92aWRlZC4KKyAqIEByZXR1cm4ge3N0cmlu Z30KKyAqLworZnVuY3Rpb24gZ2V0Q29tcG9uZW50S2V5KGNvbXBvbmVudCwgaW5kZXgpIHsKKyAg Ly8gRG8gc29tZSB0eXBlY2hlY2tpbmcgaGVyZSBzaW5jZSB3ZSBjYWxsIHRoaXMgYmxpbmRseS4g V2Ugd2FudCB0byBlbnN1cmUKKyAgLy8gdGhhdCB3ZSBkb24ndCBibG9jayBwb3RlbnRpYWwgZnV0 dXJlIEVTIEFQSXMuCisgIGlmIChjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudCA9PT0gJ29i amVjdCcgJiYgY29tcG9uZW50LmtleSAhPSBudWxsKSB7CisgICAgLy8gRXhwbGljaXQga2V5Cisg ICAgcmV0dXJuIEtleUVzY2FwZVV0aWxzLmVzY2FwZShjb21wb25lbnQua2V5KTsKKyAgfQorICAv LyBJbXBsaWNpdCBrZXkgZGV0ZXJtaW5lZCBieSB0aGUgaW5kZXggaW4gdGhlIHNldAorICByZXR1 cm4gaW5kZXgudG9TdHJpbmcoMzYpOworfQorCisvKioKKyAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVu IENoaWxkcmVuIHRyZWUgY29udGFpbmVyLgorICogQHBhcmFtIHshc3RyaW5nfSBuYW1lU29GYXIg TmFtZSBvZiB0aGUga2V5IHBhdGggc28gZmFyLgorICogQHBhcmFtIHshZnVuY3Rpb259IGNhbGxi YWNrIENhbGxiYWNrIHRvIGludm9rZSB3aXRoIGVhY2ggY2hpbGQgZm91bmQuCisgKiBAcGFyYW0g ez8qfSB0cmF2ZXJzZUNvbnRleHQgVXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRocm91Z2hvdXQg dGhlIHRyYXZlcnNhbAorICogcHJvY2Vzcy4KKyAqIEByZXR1cm4geyFudW1iZXJ9IFRoZSBudW1i ZXIgb2YgY2hpbGRyZW4gaW4gdGhpcyBzdWJ0cmVlLgorICovCitmdW5jdGlvbiB0cmF2ZXJzZUFs bENoaWxkcmVuSW1wbChjaGlsZHJlbiwgbmFtZVNvRmFyLCBjYWxsYmFjaywgdHJhdmVyc2VDb250 ZXh0KSB7CisgIHZhciB0eXBlID0gdHlwZW9mIGNoaWxkcmVuOworCisgIGlmICh0eXBlID09PSAn dW5kZWZpbmVkJyB8fCB0eXBlID09PSAnYm9vbGVhbicpIHsKKyAgICAvLyBBbGwgb2YgdGhlIGFi b3ZlIGFyZSBwZXJjZWl2ZWQgYXMgbnVsbC4KKyAgICBjaGlsZHJlbiA9IG51bGw7CisgIH0KKwor ICBpZiAoY2hpbGRyZW4gPT09IG51bGwgfHwgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0g J251bWJlcicgfHwKKyAgLy8gVGhlIGZvbGxvd2luZyBpcyBpbmxpbmVkIGZyb20gUmVhY3RFbGVt ZW50LiBUaGlzIG1lYW5zIHdlIGNhbiBvcHRpbWl6ZQorICAvLyBzb21lIGNoZWNrcy4gUmVhY3Qg RmliZXIgYWxzbyBpbmxpbmVzIHRoaXMgbG9naWMgZm9yIHNpbWlsYXIgcHVycG9zZXMuCisgIHR5 cGUgPT09ICdvYmplY3QnICYmIGNoaWxkcmVuLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZ UEUpIHsKKyAgICBjYWxsYmFjayh0cmF2ZXJzZUNvbnRleHQsIGNoaWxkcmVuLAorICAgIC8vIElm IGl0J3MgdGhlIG9ubHkgY2hpbGQsIHRyZWF0IHRoZSBuYW1lIGFzIGlmIGl0IHdhcyB3cmFwcGVk IGluIGFuIGFycmF5CisgICAgLy8gc28gdGhhdCBpdCdzIGNvbnNpc3RlbnQgaWYgdGhlIG51bWJl ciBvZiBjaGlsZHJlbiBncm93cy4KKyAgICBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SICsg Z2V0Q29tcG9uZW50S2V5KGNoaWxkcmVuLCAwKSA6IG5hbWVTb0Zhcik7CisgICAgcmV0dXJuIDE7 CisgIH0KKworICB2YXIgY2hpbGQ7CisgIHZhciBuZXh0TmFtZTsKKyAgdmFyIHN1YnRyZWVDb3Vu dCA9IDA7IC8vIENvdW50IG9mIGNoaWxkcmVuIGZvdW5kIGluIHRoZSBjdXJyZW50IHN1YnRyZWUu CisgIHZhciBuZXh0TmFtZVByZWZpeCA9IG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgOiBu YW1lU29GYXIgKyBTVUJTRVBBUkFUT1I7CisKKyAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4p KSB7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworICAg ICAgY2hpbGQgPSBjaGlsZHJlbltpXTsKKyAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXgg KyBnZXRDb21wb25lbnRLZXkoY2hpbGQsIGkpOworICAgICAgc3VidHJlZUNvdW50ICs9IHRyYXZl cnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkLCBuZXh0TmFtZSwgY2FsbGJhY2ssIHRyYXZlcnNlQ29u dGV4dCk7CisgICAgfQorICB9IGVsc2UgeworICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0 b3JGbihjaGlsZHJlbik7CisgICAgaWYgKGl0ZXJhdG9yRm4pIHsKKyAgICAgIHZhciBpdGVyYXRv ciA9IGl0ZXJhdG9yRm4uY2FsbChjaGlsZHJlbik7CisgICAgICB2YXIgc3RlcDsKKyAgICAgIGlm IChpdGVyYXRvckZuICE9PSBjaGlsZHJlbi5lbnRyaWVzKSB7CisgICAgICAgIHZhciBpaSA9IDA7 CisgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHsKKyAgICAg ICAgICBjaGlsZCA9IHN0ZXAudmFsdWU7CisgICAgICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVBy ZWZpeCArIGdldENvbXBvbmVudEtleShjaGlsZCwgaWkrKyk7CisgICAgICAgICAgc3VidHJlZUNv dW50ICs9IHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkLCBuZXh0TmFtZSwgY2FsbGJhY2ss IHRyYXZlcnNlQ29udGV4dCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlm ICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICAgICB2YXIgbWFwc0Fz Q2hpbGRyZW5BZGRlbmR1bSA9ICcnOworICAgICAgICAgIGlmIChSZWFjdEN1cnJlbnRPd25lci5j dXJyZW50KSB7CisgICAgICAgICAgICB2YXIgbWFwc0FzQ2hpbGRyZW5Pd25lck5hbWUgPSBSZWFj dEN1cnJlbnRPd25lci5jdXJyZW50LmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmIChtYXBzQXND aGlsZHJlbk93bmVyTmFtZSkgeworICAgICAgICAgICAgICBtYXBzQXNDaGlsZHJlbkFkZGVuZHVt ID0gJyBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG1hcHNBc0NoaWxkcmVuT3duZXJO YW1lICsgJ2AuJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgImRldmVs b3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhkaWRXYXJuQWJvdXRNYXBzLCAnVXNp bmcgTWFwcyBhcyBjaGlsZHJlbiBpcyBub3QgeWV0IGZ1bGx5IHN1cHBvcnRlZC4gSXQgaXMgYW4g JyArICdleHBlcmltZW50YWwgZmVhdHVyZSB0aGF0IG1pZ2h0IGJlIHJlbW92ZWQuIENvbnZlcnQg aXQgdG8gYSAnICsgJ3NlcXVlbmNlIC8gaXRlcmFibGUgb2Yga2V5ZWQgUmVhY3RFbGVtZW50cyBp bnN0ZWFkLiVzJywgbWFwc0FzQ2hpbGRyZW5BZGRlbmR1bSkgOiB2b2lkIDA7CisgICAgICAgICAg ZGlkV2FybkFib3V0TWFwcyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gSXRlcmF0b3Ig d2lsbCBwcm92aWRlIGVudHJ5IFtrLHZdIHR1cGxlcyByYXRoZXIgdGhhbiB2YWx1ZXMuCisgICAg ICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHsKKyAgICAgICAgICB2 YXIgZW50cnkgPSBzdGVwLnZhbHVlOworICAgICAgICAgIGlmIChlbnRyeSkgeworICAgICAgICAg ICAgY2hpbGQgPSBlbnRyeVsxXTsKKyAgICAgICAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVm aXggKyBLZXlFc2NhcGVVdGlscy5lc2NhcGUoZW50cnlbMF0pICsgU1VCU0VQQVJBVE9SICsgZ2V0 Q29tcG9uZW50S2V5KGNoaWxkLCAwKTsKKyAgICAgICAgICAgIHN1YnRyZWVDb3VudCArPSB0cmF2 ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZCwgbmV4dE5hbWUsIGNhbGxiYWNrLCB0cmF2ZXJzZUNv bnRleHQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAo dHlwZSA9PT0gJ29iamVjdCcpIHsKKyAgICAgIHZhciBhZGRlbmR1bSA9ICcnOworICAgICAgaWYg KCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgICBhZGRlbmR1bSA9ICcg SWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBh cnJheSAnICsgJ2luc3RlYWQgb3Igd3JhcCB0aGUgb2JqZWN0IHVzaW5nIGNyZWF0ZUZyYWdtZW50 KG9iamVjdCkgZnJvbSB0aGUgJyArICdSZWFjdCBhZGQtb25zLic7CisgICAgICAgIGlmIChjaGls ZHJlbi5faXNSZWFjdEVsZW1lbnQpIHsKKyAgICAgICAgICBhZGRlbmR1bSA9ICcgSXQgbG9va3Mg bGlrZSB5b3VcJ3JlIHVzaW5nIGFuIGVsZW1lbnQgY3JlYXRlZCBieSBhIGRpZmZlcmVudCAnICsg J3ZlcnNpb24gb2YgUmVhY3QuIE1ha2Ugc3VyZSB0byB1c2Ugb25seSBvbmUgY29weSBvZiBSZWFj dC4nOworICAgICAgICB9CisgICAgICAgIGlmIChSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7 CisgICAgICAgICAgdmFyIG5hbWUgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LmdldE5hbWUo KTsKKyAgICAgICAgICBpZiAobmFtZSkgeworICAgICAgICAgICAgYWRkZW5kdW0gKz0gJyBDaGVj ayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nOworICAgICAgICAgIH0KKyAg ICAgICAgfQorICAgICAgfQorICAgICAgdmFyIGNoaWxkcmVuU3RyaW5nID0gU3RyaW5nKGNoaWxk cmVuKTsKKyAgICAgICFmYWxzZSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGlu dmFyaWFudChmYWxzZSwgJ09iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChm b3VuZDogJXMpLiVzJywgY2hpbGRyZW5TdHJpbmcgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29i amVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjaGlsZHJlbikuam9pbignLCAnKSArICd9 JyA6IGNoaWxkcmVuU3RyaW5nLCBhZGRlbmR1bSkgOiBfcHJvZEludmFyaWFudCgnMzEnLCBjaGls ZHJlblN0cmluZyA9PT0gJ1tvYmplY3QgT2JqZWN0XScgPyAnb2JqZWN0IHdpdGgga2V5cyB7JyAr IE9iamVjdC5rZXlzKGNoaWxkcmVuKS5qb2luKCcsICcpICsgJ30nIDogY2hpbGRyZW5TdHJpbmcs IGFkZGVuZHVtKSA6IHZvaWQgMDsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3VidHJlZUNvdW50 OworfQorCisvKioKKyAqIFRyYXZlcnNlcyBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3Bl Y2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAsIGJ1dAorICogbWlnaHQgYWxzbyBiZSBzcGVjaWZp ZWQgdGhyb3VnaCBhdHRyaWJ1dGVzOgorICoKKyAqIC0gYHRyYXZlcnNlQWxsQ2hpbGRyZW4odGhp cy5wcm9wcy5jaGlsZHJlbiwgLi4uKWAKKyAqIC0gYHRyYXZlcnNlQWxsQ2hpbGRyZW4odGhpcy5w cm9wcy5sZWZ0UGFuZWxDaGlsZHJlbiwgLi4uKWAKKyAqCisgKiBUaGUgYHRyYXZlcnNlQ29udGV4 dGAgaXMgYW4gb3B0aW9uYWwgYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgdGhyb3VnaCB0aGUKKyAq IGVudGlyZSB0cmF2ZXJzYWwuIEl0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIGFjY3VtdWxhdGlvbnMg b3IgYW55dGhpbmcgZWxzZSB0aGF0CisgKiB0aGUgY2FsbGJhY2sgbWlnaHQgZmluZCByZWxldmFu dC4KKyAqCisgKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIG9iamVjdC4KKyAq IEBwYXJhbSB7IWZ1bmN0aW9ufSBjYWxsYmFjayBUbyBpbnZva2UgdXBvbiB0cmF2ZXJzaW5nIGVh Y2ggY2hpbGQuCisgKiBAcGFyYW0gez8qfSB0cmF2ZXJzZUNvbnRleHQgQ29udGV4dCBmb3IgdHJh dmVyc2FsLgorICogQHJldHVybiB7IW51bWJlcn0gVGhlIG51bWJlciBvZiBjaGlsZHJlbiBpbiB0 aGlzIHN1YnRyZWUuCisgKi8KK2Z1bmN0aW9uIHRyYXZlcnNlQWxsQ2hpbGRyZW4oY2hpbGRyZW4s IGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpIHsKKyAgaWYgKGNoaWxkcmVuID09IG51bGwpIHsK KyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChj aGlsZHJlbiwgJycsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpOworfQorCittb2R1bGUuZXhw b3J0cyA9IHRyYXZlcnNlQWxsQ2hpbGRyZW47Cit9LHsiMTQiOjE0LCIxNyI6MTcsIjIiOjIsIjM2 IjozNiwiMzgiOjM4LCI0NiI6NDYsIjQ4Ijo0OH1dLDQxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVs ZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIElu Yy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBs aWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNF TlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFk ZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQ QVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisvKiBnbG9iYWwg aGFzT3duUHJvcGVydHk6dHJ1ZSAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJvZEludmFy aWFudCA9IF9kZXJlcV8oMzgpLAorICAgIF9hc3NpZ24gPSBfZGVyZXFfKDQ5KTsKKwordmFyIGlu dmFyaWFudCA9IF9kZXJlcV8oNDYpOwordmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJv cGVydHk7CisKK2Z1bmN0aW9uIHNoYWxsb3dDb3B5KHgpIHsKKyAgaWYgKEFycmF5LmlzQXJyYXko eCkpIHsKKyAgICByZXR1cm4geC5jb25jYXQoKTsKKyAgfSBlbHNlIGlmICh4ICYmIHR5cGVvZiB4 ID09PSAnb2JqZWN0JykgeworICAgIHJldHVybiBfYXNzaWduKG5ldyB4LmNvbnN0cnVjdG9yKCks IHgpOworICB9IGVsc2UgeworICAgIHJldHVybiB4OworICB9Cit9CisKK3ZhciBDT01NQU5EX1BV U0ggPSAnJHB1c2gnOwordmFyIENPTU1BTkRfVU5TSElGVCA9ICckdW5zaGlmdCc7Cit2YXIgQ09N TUFORF9TUExJQ0UgPSAnJHNwbGljZSc7Cit2YXIgQ09NTUFORF9TRVQgPSAnJHNldCc7Cit2YXIg Q09NTUFORF9NRVJHRSA9ICckbWVyZ2UnOwordmFyIENPTU1BTkRfQVBQTFkgPSAnJGFwcGx5JzsK KwordmFyIEFMTF9DT01NQU5EU19MSVNUID0gW0NPTU1BTkRfUFVTSCwgQ09NTUFORF9VTlNISUZU LCBDT01NQU5EX1NQTElDRSwgQ09NTUFORF9TRVQsIENPTU1BTkRfTUVSR0UsIENPTU1BTkRfQVBQ TFldOworCit2YXIgQUxMX0NPTU1BTkRTX1NFVCA9IHt9OworCitBTExfQ09NTUFORFNfTElTVC5m b3JFYWNoKGZ1bmN0aW9uIChjb21tYW5kKSB7CisgIEFMTF9DT01NQU5EU19TRVRbY29tbWFuZF0g PSB0cnVlOworfSk7CisKK2Z1bmN0aW9uIGludmFyaWFudEFycmF5Q2FzZSh2YWx1ZSwgc3BlYywg Y29tbWFuZCkgeworICAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyAiZGV2ZWxvcG1lbnQiICE9PSAn cHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd1cGRhdGUoKTogZXhwZWN0ZWQgdGFyZ2V0 IG9mICVzIHRvIGJlIGFuIGFycmF5OyBnb3QgJXMuJywgY29tbWFuZCwgdmFsdWUpIDogX3Byb2RJ bnZhcmlhbnQoJzEnLCBjb21tYW5kLCB2YWx1ZSkgOiB2b2lkIDA7CisgIHZhciBzcGVjVmFsdWUg PSBzcGVjW2NvbW1hbmRdOworICAhQXJyYXkuaXNBcnJheShzcGVjVmFsdWUpID8gImRldmVsb3Bt ZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAndXBkYXRlKCk6IGV4cGVj dGVkIHNwZWMgb2YgJXMgdG8gYmUgYW4gYXJyYXk7IGdvdCAlcy4gRGlkIHlvdSBmb3JnZXQgdG8g d3JhcCB5b3VyIHBhcmFtZXRlciBpbiBhbiBhcnJheT8nLCBjb21tYW5kLCBzcGVjVmFsdWUpIDog X3Byb2RJbnZhcmlhbnQoJzInLCBjb21tYW5kLCBzcGVjVmFsdWUpIDogdm9pZCAwOworfQorCisv KioKKyAqIFJldHVybnMgYSB1cGRhdGVkIHNoYWxsb3cgY29weSBvZiBhbiBvYmplY3Qgd2l0aG91 dCBtdXRhdGluZyB0aGUgb3JpZ2luYWwuCisgKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIu aW8vcmVhY3QvZG9jcy91cGRhdGUuaHRtbCBmb3IgZGV0YWlscy4KKyAqLworZnVuY3Rpb24gdXBk YXRlKHZhbHVlLCBzcGVjKSB7CisgICEodHlwZW9mIHNwZWMgPT09ICdvYmplY3QnKSA/ICJkZXZl bG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3VwZGF0ZSgpOiBZ b3UgcHJvdmlkZWQgYSBrZXkgcGF0aCB0byB1cGRhdGUoKSB0aGF0IGRpZCBub3QgY29udGFpbiBv bmUgb2YgJXMuIERpZCB5b3UgZm9yZ2V0IHRvIGluY2x1ZGUgeyVzOiAuLi59PycsIEFMTF9DT01N QU5EU19MSVNULmpvaW4oJywgJyksIENPTU1BTkRfU0VUKSA6IF9wcm9kSW52YXJpYW50KCczJywg QUxMX0NPTU1BTkRTX0xJU1Quam9pbignLCAnKSwgQ09NTUFORF9TRVQpIDogdm9pZCAwOworCisg IGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNwZWMsIENPTU1BTkRfU0VUKSkgeworICAgICEoT2Jq ZWN0LmtleXMoc3BlYykubGVuZ3RoID09PSAxKSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0 aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0Nhbm5vdCBoYXZlIG1vcmUgdGhhbiBvbmUga2V5IGlu IGFuIG9iamVjdCB3aXRoICVzJywgQ09NTUFORF9TRVQpIDogX3Byb2RJbnZhcmlhbnQoJzQnLCBD T01NQU5EX1NFVCkgOiB2b2lkIDA7CisKKyAgICByZXR1cm4gc3BlY1tDT01NQU5EX1NFVF07Cisg IH0KKworICB2YXIgbmV4dFZhbHVlID0gc2hhbGxvd0NvcHkodmFsdWUpOworCisgIGlmIChoYXNP d25Qcm9wZXJ0eS5jYWxsKHNwZWMsIENPTU1BTkRfTUVSR0UpKSB7CisgICAgdmFyIG1lcmdlT2Jq ID0gc3BlY1tDT01NQU5EX01FUkdFXTsKKyAgICAhKG1lcmdlT2JqICYmIHR5cGVvZiBtZXJnZU9i aiA9PT0gJ29iamVjdCcpID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJp YW50KGZhbHNlLCAndXBkYXRlKCk6ICVzIGV4cGVjdHMgYSBzcGVjIG9mIHR5cGUgXCdvYmplY3Rc JzsgZ290ICVzJywgQ09NTUFORF9NRVJHRSwgbWVyZ2VPYmopIDogX3Byb2RJbnZhcmlhbnQoJzUn LCBDT01NQU5EX01FUkdFLCBtZXJnZU9iaikgOiB2b2lkIDA7CisgICAgIShuZXh0VmFsdWUgJiYg dHlwZW9mIG5leHRWYWx1ZSA9PT0gJ29iamVjdCcpID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1 Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAndXBkYXRlKCk6ICVzIGV4cGVjdHMgYSB0YXJnZXQg b2YgdHlwZSBcJ29iamVjdFwnOyBnb3QgJXMnLCBDT01NQU5EX01FUkdFLCBuZXh0VmFsdWUpIDog X3Byb2RJbnZhcmlhbnQoJzYnLCBDT01NQU5EX01FUkdFLCBuZXh0VmFsdWUpIDogdm9pZCAwOwor ICAgIF9hc3NpZ24obmV4dFZhbHVlLCBzcGVjW0NPTU1BTkRfTUVSR0VdKTsKKyAgfQorCisgIGlm IChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNwZWMsIENPTU1BTkRfUFVTSCkpIHsKKyAgICBpbnZhcmlh bnRBcnJheUNhc2UodmFsdWUsIHNwZWMsIENPTU1BTkRfUFVTSCk7CisgICAgc3BlY1tDT01NQU5E X1BVU0hdLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKKyAgICAgIG5leHRWYWx1ZS5wdXNoKGl0 ZW0pOworICAgIH0pOworICB9CisKKyAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoc3BlYywgQ09N TUFORF9VTlNISUZUKSkgeworICAgIGludmFyaWFudEFycmF5Q2FzZSh2YWx1ZSwgc3BlYywgQ09N TUFORF9VTlNISUZUKTsKKyAgICBzcGVjW0NPTU1BTkRfVU5TSElGVF0uZm9yRWFjaChmdW5jdGlv biAoaXRlbSkgeworICAgICAgbmV4dFZhbHVlLnVuc2hpZnQoaXRlbSk7CisgICAgfSk7CisgIH0K KworICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChzcGVjLCBDT01NQU5EX1NQTElDRSkpIHsKKyAg ICAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicg PyBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCAlcyB0YXJnZXQgdG8gYmUgYW4gYXJyYXk7IGdv dCAlcycsIENPTU1BTkRfU1BMSUNFLCB2YWx1ZSkgOiBfcHJvZEludmFyaWFudCgnNycsIENPTU1B TkRfU1BMSUNFLCB2YWx1ZSkgOiB2b2lkIDA7CisgICAgIUFycmF5LmlzQXJyYXkoc3BlY1tDT01N QU5EX1NQTElDRV0pID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50 KGZhbHNlLCAndXBkYXRlKCk6IGV4cGVjdGVkIHNwZWMgb2YgJXMgdG8gYmUgYW4gYXJyYXkgb2Yg YXJyYXlzOyBnb3QgJXMuIERpZCB5b3UgZm9yZ2V0IHRvIHdyYXAgeW91ciBwYXJhbWV0ZXJzIGlu IGFuIGFycmF5PycsIENPTU1BTkRfU1BMSUNFLCBzcGVjW0NPTU1BTkRfU1BMSUNFXSkgOiBfcHJv ZEludmFyaWFudCgnOCcsIENPTU1BTkRfU1BMSUNFLCBzcGVjW0NPTU1BTkRfU1BMSUNFXSkgOiB2 b2lkIDA7CisgICAgc3BlY1tDT01NQU5EX1NQTElDRV0uZm9yRWFjaChmdW5jdGlvbiAoYXJncykg eworICAgICAgIUFycmF5LmlzQXJyYXkoYXJncykgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVj dGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd1cGRhdGUoKTogZXhwZWN0ZWQgc3BlYyBvZiAlcyB0 byBiZSBhbiBhcnJheSBvZiBhcnJheXM7IGdvdCAlcy4gRGlkIHlvdSBmb3JnZXQgdG8gd3JhcCB5 b3VyIHBhcmFtZXRlcnMgaW4gYW4gYXJyYXk/JywgQ09NTUFORF9TUExJQ0UsIHNwZWNbQ09NTUFO RF9TUExJQ0VdKSA6IF9wcm9kSW52YXJpYW50KCc4JywgQ09NTUFORF9TUExJQ0UsIHNwZWNbQ09N TUFORF9TUExJQ0VdKSA6IHZvaWQgMDsKKyAgICAgIG5leHRWYWx1ZS5zcGxpY2UuYXBwbHkobmV4 dFZhbHVlLCBhcmdzKTsKKyAgICB9KTsKKyAgfQorCisgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxs KHNwZWMsIENPTU1BTkRfQVBQTFkpKSB7CisgICAgISh0eXBlb2Ygc3BlY1tDT01NQU5EX0FQUExZ XSA9PT0gJ2Z1bmN0aW9uJykgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZh cmlhbnQoZmFsc2UsICd1cGRhdGUoKTogZXhwZWN0ZWQgc3BlYyBvZiAlcyB0byBiZSBhIGZ1bmN0 aW9uOyBnb3QgJXMuJywgQ09NTUFORF9BUFBMWSwgc3BlY1tDT01NQU5EX0FQUExZXSkgOiBfcHJv ZEludmFyaWFudCgnOScsIENPTU1BTkRfQVBQTFksIHNwZWNbQ09NTUFORF9BUFBMWV0pIDogdm9p ZCAwOworICAgIG5leHRWYWx1ZSA9IHNwZWNbQ09NTUFORF9BUFBMWV0obmV4dFZhbHVlKTsKKyAg fQorCisgIGZvciAodmFyIGsgaW4gc3BlYykgeworICAgIGlmICghKEFMTF9DT01NQU5EU19TRVQu aGFzT3duUHJvcGVydHkoaykgJiYgQUxMX0NPTU1BTkRTX1NFVFtrXSkpIHsKKyAgICAgIG5leHRW YWx1ZVtrXSA9IHVwZGF0ZSh2YWx1ZVtrXSwgc3BlY1trXSk7CisgICAgfQorICB9CisKKyAgcmV0 dXJuIG5leHRWYWx1ZTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSB1cGRhdGU7Cit9LHsiMzgiOjM4 LCI0NiI6NDYsIjQ5Ijo0OX1dLDQyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsK Kyd1c2Ugc3RyaWN0JzsKKworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFj ZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2Ug Y29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhl CisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRy ZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5k IGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIEB0eXBl Y2hlY2tzCisgKi8KKwordmFyIGludmFyaWFudCA9IF9kZXJlcV8oNDYpOworCisvKioKKyAqIFRo ZSBDU1NDb3JlIG1vZHVsZSBzcGVjaWZpZXMgdGhlIEFQSSAoYW5kIGltcGxlbWVudHMgbW9zdCBv ZiB0aGUgbWV0aG9kcykKKyAqIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiBkZWFsaW5nIHdpdGgg dGhlIGRpc3BsYXkgb2YgZWxlbWVudHMgKHZpYSB0aGVpcgorICogQ1NTIGNsYXNzZXMgYW5kIHZp c2liaWxpdHkgb24gc2NyZWVuLiBJdCBpcyBhbiBBUEkgZm9jdXNlZCBvbiBtdXRhdGluZyB0aGUK KyAqIGRpc3BsYXkgYW5kIG5vdCByZWFkaW5nIGl0IGFzIG5vIGxvZ2ljYWwgc3RhdGUgc2hvdWxk IGJlIGVuY29kZWQgaW4gdGhlCisgKiBkaXNwbGF5IG9mIGVsZW1lbnRzLgorICovCisKKy8qIFNs b3cgaW1wbGVtZW50YXRpb24gZm9yIGJyb3dzZXJzIHRoYXQgZG9uJ3QgbmF0aXZlbHkgc3VwcG9y dCAubWF0Y2hlcygpICovCitmdW5jdGlvbiBtYXRjaGVzU2VsZWN0b3JfU0xPVyhlbGVtZW50LCBz ZWxlY3RvcikgeworICB2YXIgcm9vdCA9IGVsZW1lbnQ7CisgIHdoaWxlIChyb290LnBhcmVudE5v ZGUpIHsKKyAgICByb290ID0gcm9vdC5wYXJlbnROb2RlOworICB9CisKKyAgdmFyIGFsbCA9IHJv b3QucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CisgIHJldHVybiBBcnJheS5wcm90b3R5cGUu aW5kZXhPZi5jYWxsKGFsbCwgZWxlbWVudCkgIT09IC0xOworfQorCit2YXIgQ1NTQ29yZSA9IHsK KworICAvKioKKyAgICogQWRkcyB0aGUgY2xhc3MgcGFzc2VkIGluIHRvIHRoZSBlbGVtZW50IGlm IGl0IGRvZXNuJ3QgYWxyZWFkeSBoYXZlIGl0LgorICAgKgorICAgKiBAcGFyYW0ge0RPTUVsZW1l bnR9IGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gc2V0IHRoZSBjbGFzcyBvbgorICAgKiBAcGFyYW0g e3N0cmluZ30gY2xhc3NOYW1lIHRoZSBDU1MgY2xhc3NOYW1lCisgICAqIEByZXR1cm4ge0RPTUVs ZW1lbnR9IHRoZSBlbGVtZW50IHBhc3NlZCBpbgorICAgKi8KKyAgYWRkQ2xhc3M6IGZ1bmN0aW9u IGFkZENsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkgeworICAgICEhL1xzLy50ZXN0KGNsYXNzTmFt ZSkgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdD U1NDb3JlLmFkZENsYXNzIHRha2VzIG9ubHkgYSBzaW5nbGUgY2xhc3MgbmFtZS4gIiVzIiBjb250 YWlucyAnICsgJ211bHRpcGxlIGNsYXNzZXMuJywgY2xhc3NOYW1lKSA6IGludmFyaWFudChmYWxz ZSkgOiB2b2lkIDA7CisKKyAgICBpZiAoY2xhc3NOYW1lKSB7CisgICAgICBpZiAoZWxlbWVudC5j bGFzc0xpc3QpIHsKKyAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7Cisg ICAgICB9IGVsc2UgaWYgKCFDU1NDb3JlLmhhc0NsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkpIHsK KyAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSBlbGVtZW50LmNsYXNzTmFtZSArICcgJyArIGNs YXNzTmFtZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAg LyoqCisgICAqIFJlbW92ZXMgdGhlIGNsYXNzIHBhc3NlZCBpbiBmcm9tIHRoZSBlbGVtZW50Cisg ICAqCisgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBzZXQg dGhlIGNsYXNzIG9uCisgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgdGhlIENTUyBjbGFz c05hbWUKKyAgICogQHJldHVybiB7RE9NRWxlbWVudH0gdGhlIGVsZW1lbnQgcGFzc2VkIGluCisg ICAqLworICByZW1vdmVDbGFzczogZnVuY3Rpb24gcmVtb3ZlQ2xhc3MoZWxlbWVudCwgY2xhc3NO YW1lKSB7CisgICAgISEvXHMvLnRlc3QoY2xhc3NOYW1lKSA/ICJkZXZlbG9wbWVudCIgIT09ICdw cm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0NTU0NvcmUucmVtb3ZlQ2xhc3MgdGFrZXMg b25seSBhIHNpbmdsZSBjbGFzcyBuYW1lLiAiJXMiIGNvbnRhaW5zICcgKyAnbXVsdGlwbGUgY2xh c3Nlcy4nLCBjbGFzc05hbWUpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDsKKworICAgIGlm IChjbGFzc05hbWUpIHsKKyAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdCkgeworICAgICAgICBl bGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTsKKyAgICAgIH0gZWxzZSBpZiAoQ1NT Q29yZS5oYXNDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpKSB7CisgICAgICAgIGVsZW1lbnQuY2xh c3NOYW1lID0gZWxlbWVudC5jbGFzc05hbWUucmVwbGFjZShuZXcgUmVnRXhwKCcoXnxcXHMpJyAr IGNsYXNzTmFtZSArICcoPzpcXHN8JCknLCAnZycpLCAnJDEnKS5yZXBsYWNlKC9ccysvZywgJyAn KSAvLyBtdWx0aXBsZSBzcGFjZXMgdG8gb25lCisgICAgICAgIC5yZXBsYWNlKC9eXHMqfFxzKiQv ZywgJycpOyAvLyB0cmltIHRoZSBlbmRzCisgICAgICB9CisgICAgfQorICAgIHJldHVybiBlbGVt ZW50OworICB9LAorCisgIC8qKgorICAgKiBIZWxwZXIgdG8gYWRkIG9yIHJlbW92ZSBhIGNsYXNz IGZyb20gYW4gZWxlbWVudCBiYXNlZCBvbiBhIGNvbmRpdGlvbi4KKyAgICoKKyAgICogQHBhcmFt IHtET01FbGVtZW50fSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIHNldCB0aGUgY2xhc3Mgb24KKyAg ICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSB0aGUgQ1NTIGNsYXNzTmFtZQorICAgKiBAcGFy YW0geyp9IGJvb2wgY29uZGl0aW9uIHRvIHdoZXRoZXIgdG8gYWRkIG9yIHJlbW92ZSB0aGUgY2xh c3MKKyAgICogQHJldHVybiB7RE9NRWxlbWVudH0gdGhlIGVsZW1lbnQgcGFzc2VkIGluCisgICAq LworICBjb25kaXRpb25DbGFzczogZnVuY3Rpb24gY29uZGl0aW9uQ2xhc3MoZWxlbWVudCwgY2xh c3NOYW1lLCBib29sKSB7CisgICAgcmV0dXJuIChib29sID8gQ1NTQ29yZS5hZGRDbGFzcyA6IENT U0NvcmUucmVtb3ZlQ2xhc3MpKGVsZW1lbnQsIGNsYXNzTmFtZSk7CisgIH0sCisKKyAgLyoqCisg ICAqIFRlc3RzIHdoZXRoZXIgdGhlIGVsZW1lbnQgaGFzIHRoZSBjbGFzcyBzcGVjaWZpZWQuCisg ICAqCisgICAqIEBwYXJhbSB7RE9NTm9kZXxET01XaW5kb3d9IGVsZW1lbnQgdGhlIGVsZW1lbnQg dG8gY2hlY2sgdGhlIGNsYXNzIG9uCisgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgdGhl IENTUyBjbGFzc05hbWUKKyAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgZWxlbWVu dCBoYXMgdGhlIGNsYXNzLCBmYWxzZSBpZiBub3QKKyAgICovCisgIGhhc0NsYXNzOiBmdW5jdGlv biBoYXNDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpIHsKKyAgICAhIS9ccy8udGVzdChjbGFzc05h bWUpID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAn Q1NTLmhhc0NsYXNzIHRha2VzIG9ubHkgYSBzaW5nbGUgY2xhc3MgbmFtZS4nKSA6IGludmFyaWFu dChmYWxzZSkgOiB2b2lkIDA7CisgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0KSB7CisgICAgICBy ZXR1cm4gISFjbGFzc05hbWUgJiYgZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1l KTsKKyAgICB9CisgICAgcmV0dXJuICgnICcgKyBlbGVtZW50LmNsYXNzTmFtZSArICcgJykuaW5k ZXhPZignICcgKyBjbGFzc05hbWUgKyAnICcpID4gLTE7CisgIH0sCisKKyAgLyoqCisgICAqIFRl c3RzIHdoZXRoZXIgdGhlIGVsZW1lbnQgbWF0Y2hlcyB0aGUgc2VsZWN0b3Igc3BlY2lmaWVkCisg ICAqCisgICAqIEBwYXJhbSB7RE9NTm9kZXxET01XaW5kb3d9IGVsZW1lbnQgdGhlIGVsZW1lbnQg dGhhdCB3ZSBhcmUgcXVlcnlpbmcKKyAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIHRoZSBD U1Mgc2VsZWN0b3IKKyAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgZWxlbWVudCBt YXRjaGVzIHRoZSBzZWxlY3RvciwgZmFsc2UgaWYgbm90CisgICAqLworICBtYXRjaGVzU2VsZWN0 b3I6IGZ1bmN0aW9uIG1hdGNoZXNTZWxlY3RvcihlbGVtZW50LCBzZWxlY3RvcikgeworICAgIHZh ciBtYXRjaGVzSW1wbCA9IGVsZW1lbnQubWF0Y2hlcyB8fCBlbGVtZW50LndlYmtpdE1hdGNoZXNT ZWxlY3RvciB8fCBlbGVtZW50Lm1vek1hdGNoZXNTZWxlY3RvciB8fCBlbGVtZW50Lm1zTWF0Y2hl c1NlbGVjdG9yIHx8IGZ1bmN0aW9uIChzKSB7CisgICAgICByZXR1cm4gbWF0Y2hlc1NlbGVjdG9y X1NMT1coZWxlbWVudCwgcyk7CisgICAgfTsKKyAgICByZXR1cm4gbWF0Y2hlc0ltcGwuY2FsbChl bGVtZW50LCBzZWxlY3Rvcik7CisgIH0KKworfTsKKworbW9kdWxlLmV4cG9ydHMgPSBDU1NDb3Jl OworfSx7IjQ2Ijo0Nn1dLDQzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8q KgorICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwg cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5k ZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGlu IHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdy YW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxl IGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIg Y2FuVXNlRE9NID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRv Y3VtZW50ICYmIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KTsKKworLyoqCisgKiBTaW1w bGUsIGxpZ2h0d2VpZ2h0IG1vZHVsZSBhc3Npc3Rpbmcgd2l0aCB0aGUgZGV0ZWN0aW9uIGFuZCBj b250ZXh0IG9mCisgKiBXb3JrZXIuIEhlbHBzIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llcyBh bmQgYWxsb3dzIGNvZGUgdG8gcmVhc29uIGFib3V0CisgKiB3aGV0aGVyIG9yIG5vdCB0aGV5IGFy ZSBpbiBhIFdvcmtlciwgZXZlbiBpZiB0aGV5IG5ldmVyIGluY2x1ZGUgdGhlIG1haW4KKyAqIGBS ZWFjdFdvcmtlcmAgZGVwZW5kZW5jeS4KKyAqLwordmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0g eworCisgIGNhblVzZURPTTogY2FuVXNlRE9NLAorCisgIGNhblVzZVdvcmtlcnM6IHR5cGVvZiBX b3JrZXIgIT09ICd1bmRlZmluZWQnLAorCisgIGNhblVzZUV2ZW50TGlzdGVuZXJzOiBjYW5Vc2VE T00gJiYgISEod2luZG93LmFkZEV2ZW50TGlzdGVuZXIgfHwgd2luZG93LmF0dGFjaEV2ZW50KSwK KworICBjYW5Vc2VWaWV3cG9ydDogY2FuVXNlRE9NICYmICEhd2luZG93LnNjcmVlbiwKKworICBp c0luV29ya2VyOiAhY2FuVXNlRE9NIC8vIEZvciBub3csIHRoaXMgaXMgdHJ1ZSAtIG1pZ2h0IGNo YW5nZSBpbiB0aGUgZnV0dXJlLgorCit9OworCittb2R1bGUuZXhwb3J0cyA9IEV4ZWN1dGlvbkVu dmlyb25tZW50OworfSx7fV0sNDQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpewor InVzZSBzdHJpY3QiOworCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNl Ym9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBj b2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUK KyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJl ZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQg aW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogCisgKi8K KworZnVuY3Rpb24gbWFrZUVtcHR5RnVuY3Rpb24oYXJnKSB7CisgIHJldHVybiBmdW5jdGlvbiAo KSB7CisgICAgcmV0dXJuIGFyZzsKKyAgfTsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGFj Y2VwdHMgYW5kIGRpc2NhcmRzIGlucHV0czsgaXQgaGFzIG5vIHNpZGUgZWZmZWN0cy4gVGhpcyBp cworICogcHJpbWFyaWx5IHVzZWZ1bCBpZGlvbWF0aWNhbGx5IGZvciBvdmVycmlkYWJsZSBmdW5j dGlvbiBlbmRwb2ludHMgd2hpY2gKKyAqIGFsd2F5cyBuZWVkIHRvIGJlIGNhbGxhYmxlLCBzaW5j ZSBKUyBsYWNrcyBhIG51bGwtY2FsbCBpZGlvbSBhbGEgQ29jb2EuCisgKi8KK3ZhciBlbXB0eUZ1 bmN0aW9uID0gZnVuY3Rpb24gZW1wdHlGdW5jdGlvbigpIHt9OworCitlbXB0eUZ1bmN0aW9uLnRo YXRSZXR1cm5zID0gbWFrZUVtcHR5RnVuY3Rpb247CitlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5z RmFsc2UgPSBtYWtlRW1wdHlGdW5jdGlvbihmYWxzZSk7CitlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1 cm5zVHJ1ZSA9IG1ha2VFbXB0eUZ1bmN0aW9uKHRydWUpOworZW1wdHlGdW5jdGlvbi50aGF0UmV0 dXJuc051bGwgPSBtYWtlRW1wdHlGdW5jdGlvbihudWxsKTsKK2VtcHR5RnVuY3Rpb24udGhhdFJl dHVybnNUaGlzID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gdGhpczsKK307CitlbXB0eUZ1bmN0 aW9uLnRoYXRSZXR1cm5zQXJndW1lbnQgPSBmdW5jdGlvbiAoYXJnKSB7CisgIHJldHVybiBhcmc7 Cit9OworCittb2R1bGUuZXhwb3J0cyA9IGVtcHR5RnVuY3Rpb247Cit9LHt9XSw0NTpbZnVuY3Rp b24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMy1w cmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBU aGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBm b3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhp cyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBj YW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisg KgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIGVtcHR5T2JqZWN0ID0ge307CisKK2lmICgi ZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgT2JqZWN0LmZyZWV6ZShlbXB0eU9i amVjdCk7Cit9CisKK21vZHVsZS5leHBvcnRzID0gZW1wdHlPYmplY3Q7Cit9LHt9XSw0NjpbZnVu Y3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAoYykgMjAx My1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg KiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5z ZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2Yg dGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0 cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3Rvcnku CisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKworLyoqCisgKiBVc2UgaW52YXJpYW50KCkgdG8g YXNzZXJ0IHN0YXRlIHdoaWNoIHlvdXIgcHJvZ3JhbSBhc3N1bWVzIHRvIGJlIHRydWUuCisgKgor ICogUHJvdmlkZSBzcHJpbnRmLXN0eWxlIGZvcm1hdCAob25seSAlcyBpcyBzdXBwb3J0ZWQpIGFu ZCBhcmd1bWVudHMKKyAqIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBicm9rZSBh bmQgd2hhdCB5b3Ugd2VyZQorICogZXhwZWN0aW5nLgorICoKKyAqIFRoZSBpbnZhcmlhbnQgbWVz c2FnZSB3aWxsIGJlIHN0cmlwcGVkIGluIHByb2R1Y3Rpb24sIGJ1dCB0aGUgaW52YXJpYW50Cisg KiB3aWxsIHJlbWFpbiB0byBlbnN1cmUgbG9naWMgZG9lcyBub3QgZGlmZmVyIGluIHByb2R1Y3Rp b24uCisgKi8KKwordmFyIHZhbGlkYXRlRm9ybWF0ID0gZnVuY3Rpb24gdmFsaWRhdGVGb3JtYXQo Zm9ybWF0KSB7fTsKKworaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICB2 YWxpZGF0ZUZvcm1hdCA9IGZ1bmN0aW9uIHZhbGlkYXRlRm9ybWF0KGZvcm1hdCkgeworICAgIGlm IChmb3JtYXQgPT09IHVuZGVmaW5lZCkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhcmlh bnQgcmVxdWlyZXMgYW4gZXJyb3IgbWVzc2FnZSBhcmd1bWVudCcpOworICAgIH0KKyAgfTsKK30K KworZnVuY3Rpb24gaW52YXJpYW50KGNvbmRpdGlvbiwgZm9ybWF0LCBhLCBiLCBjLCBkLCBlLCBm KSB7CisgIHZhbGlkYXRlRm9ybWF0KGZvcm1hdCk7CisKKyAgaWYgKCFjb25kaXRpb24pIHsKKyAg ICB2YXIgZXJyb3I7CisgICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICBlcnJv ciA9IG5ldyBFcnJvcignTWluaWZpZWQgZXhjZXB0aW9uIG9jY3VycmVkOyB1c2UgdGhlIG5vbi1t aW5pZmllZCBkZXYgZW52aXJvbm1lbnQgJyArICdmb3IgdGhlIGZ1bGwgZXJyb3IgbWVzc2FnZSBh bmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLicpOworICAgIH0gZWxzZSB7CisgICAgICB2 YXIgYXJncyA9IFthLCBiLCBjLCBkLCBlLCBmXTsKKyAgICAgIHZhciBhcmdJbmRleCA9IDA7Cisg ICAgICBlcnJvciA9IG5ldyBFcnJvcihmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24gKCkg eworICAgICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTsKKyAgICAgIH0pKTsKKyAgICAgIGVy cm9yLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7CisgICAgfQorCisgICAgZXJyb3IuZnJh bWVzVG9Qb3AgPSAxOyAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IGludmFyaWFudCdzIG93biBmcmFt ZQorICAgIHRocm93IGVycm9yOworICB9Cit9CisKK21vZHVsZS5leHBvcnRzID0gaW52YXJpYW50 OworfSx7fV0sNDc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBD b3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMg cmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUg QlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJv b3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAq IG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhl IHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIEB0eXBlY2hlY2tzCisgKiAKKyAqLworCisvKmVzbGlu dC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBoYXNP d25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CisKKy8qKgorICog aW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1bWVycyBz aGlwIHRoZWlyIG93bgorICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9j cy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzCisgKi8K K2Z1bmN0aW9uIGlzKHgsIHkpIHsKKyAgLy8gU2FtZVZhbHVlIGFsZ29yaXRobQorICBpZiAoeCA9 PT0geSkgeworICAgIC8vIFN0ZXBzIDEtNSwgNy0xMAorICAgIC8vIFN0ZXBzIDYuYi02LmU6ICsw ICE9IC0wCisgICAgLy8gQWRkZWQgdGhlIG5vbnplcm8geSBjaGVjayB0byBtYWtlIEZsb3cgaGFw cHksIGJ1dCBpdCBpcyByZWR1bmRhbnQKKyAgICByZXR1cm4geCAhPT0gMCB8fCB5ICE9PSAwIHx8 IDEgLyB4ID09PSAxIC8geTsKKyAgfSBlbHNlIHsKKyAgICAvLyBTdGVwIDYuYTogTmFOID09IE5h TgorICAgIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHk7CisgIH0KK30KKworLyoqCisgKiBQZXJm b3JtcyBlcXVhbGl0eSBieSBpdGVyYXRpbmcgdGhyb3VnaCBrZXlzIG9uIGFuIG9iamVjdCBhbmQg cmV0dXJuaW5nIGZhbHNlCisgKiB3aGVuIGFueSBrZXkgaGFzIHZhbHVlcyB3aGljaCBhcmUgbm90 IHN0cmljdGx5IGVxdWFsIGJldHdlZW4gdGhlIGFyZ3VtZW50cy4KKyAqIFJldHVybnMgdHJ1ZSB3 aGVuIHRoZSB2YWx1ZXMgb2YgYWxsIGtleXMgYXJlIHN0cmljdGx5IGVxdWFsLgorICovCitmdW5j dGlvbiBzaGFsbG93RXF1YWwob2JqQSwgb2JqQikgeworICBpZiAoaXMob2JqQSwgb2JqQikpIHsK KyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGlmICh0eXBlb2Ygb2JqQSAhPT0gJ29iamVjdCcg fHwgb2JqQSA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqQiAhPT0gJ29iamVjdCcgfHwgb2JqQiA9PT0g bnVsbCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZhciBrZXlzQSA9IE9iamVjdC5r ZXlzKG9iakEpOworICB2YXIga2V5c0IgPSBPYmplY3Qua2V5cyhvYmpCKTsKKworICBpZiAoa2V5 c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKwor ICAvLyBUZXN0IGZvciBBJ3Mga2V5cyBkaWZmZXJlbnQgZnJvbSBCLgorICBmb3IgKHZhciBpID0g MDsgaSA8IGtleXNBLmxlbmd0aDsgaSsrKSB7CisgICAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxs KG9iakIsIGtleXNBW2ldKSB8fCAhaXMob2JqQVtrZXlzQVtpXV0sIG9iakJba2V5c0FbaV1dKSkg eworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQor Cittb2R1bGUuZXhwb3J0cyA9IHNoYWxsb3dFcXVhbDsKK30se31dLDQ4OltmdW5jdGlvbihfZGVy ZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTQtMjAxNSwgRmFjZWJv b2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29k ZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisg KiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUu IEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGlu IHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNl IHN0cmljdCc7CisKK3ZhciBlbXB0eUZ1bmN0aW9uID0gX2RlcmVxXyg0NCk7CisKKy8qKgorICog U2ltaWxhciB0byBpbnZhcmlhbnQgYnV0IG9ubHkgbG9ncyBhIHdhcm5pbmcgaWYgdGhlIGNvbmRp dGlvbiBpcyBub3QgbWV0LgorICogVGhpcyBjYW4gYmUgdXNlZCB0byBsb2cgaXNzdWVzIGluIGRl dmVsb3BtZW50IGVudmlyb25tZW50cyBpbiBjcml0aWNhbAorICogcGF0aHMuIFJlbW92aW5nIHRo ZSBsb2dnaW5nIGNvZGUgZm9yIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzIHdpbGwga2VlcCB0aGUK KyAqIHNhbWUgbG9naWMgYW5kIGZvbGxvdyB0aGUgc2FtZSBjb2RlIHBhdGhzLgorICovCisKK3Zh ciB3YXJuaW5nID0gZW1wdHlGdW5jdGlvbjsKKworaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9k dWN0aW9uJykgeworICAoZnVuY3Rpb24gKCkgeworICAgIHZhciBwcmludFdhcm5pbmcgPSBmdW5j dGlvbiBwcmludFdhcm5pbmcoZm9ybWF0KSB7CisgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1l bnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9 IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHsKKyAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1 bWVudHNbX2tleV07CisgICAgICB9CisKKyAgICAgIHZhciBhcmdJbmRleCA9IDA7CisgICAgICB2 YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICsgZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9u ICgpIHsKKyAgICAgICAgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107CisgICAgICB9KTsKKyAgICAg IGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgY29uc29sZS5l cnJvcihtZXNzYWdlKTsKKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIC8vIC0tLSBXZWxj b21lIHRvIGRlYnVnZ2luZyBSZWFjdCAtLS0KKyAgICAgICAgLy8gVGhpcyBlcnJvciB3YXMgdGhy b3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCB5b3UgY2FuIHVzZSB0aGlzIHN0YWNrCisgICAg ICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBm aXJlLgorICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7CisgICAgICB9IGNhdGNoICh4 KSB7fQorICAgIH07CisKKyAgICB3YXJuaW5nID0gZnVuY3Rpb24gd2FybmluZyhjb25kaXRpb24s IGZvcm1hdCkgeworICAgICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHRo cm93IG5ldyBFcnJvcignYHdhcm5pbmcoY29uZGl0aW9uLCBmb3JtYXQsIC4uLmFyZ3MpYCByZXF1 aXJlcyBhIHdhcm5pbmcgJyArICdtZXNzYWdlIGFyZ3VtZW50Jyk7CisgICAgICB9CisKKyAgICAg IGlmIChmb3JtYXQuaW5kZXhPZignRmFpbGVkIENvbXBvc2l0ZSBwcm9wVHlwZTogJykgPT09IDAp IHsKKyAgICAgICAgcmV0dXJuOyAvLyBJZ25vcmUgQ29tcG9zaXRlQ29tcG9uZW50IHByb3B0eXBl IGNoZWNrLgorICAgICAgfQorCisgICAgICBpZiAoIWNvbmRpdGlvbikgeworICAgICAgICBmb3Ig KHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMiA+IDIgPyBf bGVuMiAtIDIgOiAwKSwgX2tleTIgPSAyOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7CisgICAg ICAgICAgYXJnc1tfa2V5MiAtIDJdID0gYXJndW1lbnRzW19rZXkyXTsKKyAgICAgICAgfQorCisg ICAgICAgIHByaW50V2FybmluZy5hcHBseSh1bmRlZmluZWQsIFtmb3JtYXRdLmNvbmNhdChhcmdz KSk7CisgICAgICB9CisgICAgfTsKKyAgfSkoKTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSB3YXJu aW5nOworfSx7IjQ0Ijo0NH1dLDQ5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsK Kyd1c2Ugc3RyaWN0JzsKKy8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovCit2YXIg aGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5OwordmFyIHBy b3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlOwor CitmdW5jdGlvbiB0b09iamVjdCh2YWwpIHsKKwlpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0g dW5kZWZpbmVkKSB7CisJCXRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90 IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7CisJfQorCisJcmV0dXJuIE9iamVj dCh2YWwpOworfQorCitmdW5jdGlvbiBzaG91bGRVc2VOYXRpdmUoKSB7CisJdHJ5IHsKKwkJaWYg KCFPYmplY3QuYXNzaWduKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkvLyBEZXRlY3Qg YnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuCisK KwkJLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9NDEx OAorCQl2YXIgdGVzdDEgPSBuZXcgU3RyaW5nKCdhYmMnKTsgIC8vIGVzbGludC1kaXNhYmxlLWxp bmUKKwkJdGVzdDFbNV0gPSAnZGUnOworCQlpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMo dGVzdDEpWzBdID09PSAnNScpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCS8vIGh0dHBz Oi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTYKKwkJdmFyIHRl c3QyID0ge307CisJCWZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQkJdGVzdDJbJ18n ICsgU3RyaW5nLmZyb21DaGFyQ29kZShpKV0gPSBpOworCQl9CisJCXZhciBvcmRlcjIgPSBPYmpl Y3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MikubWFwKGZ1bmN0aW9uIChuKSB7CisJCQlyZXR1 cm4gdGVzdDJbbl07CisJCX0pOworCQlpZiAob3JkZXIyLmpvaW4oJycpICE9PSAnMDEyMzQ1Njc4 OScpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCS8vIGh0dHBzOi8vYnVncy5jaHJvbWl1 bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTYKKwkJdmFyIHRlc3QzID0ge307CisJCSdh YmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikg eworCQkJdGVzdDNbbGV0dGVyXSA9IGxldHRlcjsKKwkJfSk7CisJCWlmIChPYmplY3Qua2V5cyhP YmplY3QuYXNzaWduKHt9LCB0ZXN0MykpLmpvaW4oJycpICE9PQorCQkJCSdhYmNkZWZnaGlqa2xt bm9wcXJzdCcpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0g Y2F0Y2ggKGUpIHsKKwkJLy8gV2UgZG9uJ3QgZXhwZWN0IGFueSBvZiB0aGUgYWJvdmUgdG8gdGhy b3csIGJ1dCBiZXR0ZXIgdG8gYmUgc2FmZS4KKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworbW9k dWxlLmV4cG9ydHMgPSBzaG91bGRVc2VOYXRpdmUoKSA/IE9iamVjdC5hc3NpZ24gOiBmdW5jdGlv biAodGFyZ2V0LCBzb3VyY2UpIHsKKwl2YXIgZnJvbTsKKwl2YXIgdG8gPSB0b09iamVjdCh0YXJn ZXQpOworCXZhciBzeW1ib2xzOworCisJZm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVu Z3RoOyBzKyspIHsKKwkJZnJvbSA9IE9iamVjdChhcmd1bWVudHNbc10pOworCisJCWZvciAodmFy IGtleSBpbiBmcm9tKSB7CisJCQlpZiAoaGFzT3duUHJvcGVydHkuY2FsbChmcm9tLCBrZXkpKSB7 CisJCQkJdG9ba2V5XSA9IGZyb21ba2V5XTsKKwkJCX0KKwkJfQorCisJCWlmIChPYmplY3QuZ2V0 T3duUHJvcGVydHlTeW1ib2xzKSB7CisJCQlzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5 U3ltYm9scyhmcm9tKTsKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgc3ltYm9scy5sZW5ndGg7IGkr KykgeworCQkJCWlmIChwcm9wSXNFbnVtZXJhYmxlLmNhbGwoZnJvbSwgc3ltYm9sc1tpXSkpIHsK KwkJCQkJdG9bc3ltYm9sc1tpXV0gPSBmcm9tW3N5bWJvbHNbaV1dOworCQkJCX0KKwkJCX0KKwkJ fQorCX0KKworCXJldHVybiB0bzsKK307CisKK30se31dfSx7fSxbMzJdKSgzMikKK30pOwpcIE5v IG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92 ZW5kb3IvcmVhY3QvZGlzdC9yZWFjdC13aXRoLWFkZG9ucy5taW4uanMgYi93ZWIvcGdhZG1pbi9z dGF0aWMvdmVuZG9yL3JlYWN0L2Rpc3QvcmVhY3Qtd2l0aC1hZGRvbnMubWluLmpzCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi5lYzA3NDFhZQotLS0gL2Rldi9udWxsCisrKyBi L3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvZGlzdC9yZWFjdC13aXRoLWFkZG9ucy5t aW4uanMKQEAgLTAsMCArMSwxMyBAQAorLyoqCisgKiBSZWFjdCAod2l0aCBhZGRvbnMpIHYxNS40 LjIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxs IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVu ZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBp biB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBn cmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmls ZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCishZnVuY3Rpb24oZSl7aWYoIm9iamVj dCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZSltb2R1bGUuZXhw b3J0cz1lKCk7ZWxzZSBpZigiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRl ZmluZShbXSxlKTtlbHNle3ZhciB0O3Q9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93 OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNl bGY/c2VsZjp0aGlzLHQuUmVhY3Q9ZSgpfX0oZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24gZSh0 LG4scil7ZnVuY3Rpb24gbyhhLHMpe2lmKCFuW2FdKXtpZighdFthXSl7dmFyIHU9ImZ1bmN0aW9u Ij09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIXMmJnUpcmV0dXJuIHUoYSwhMCk7aWYoaSly ZXR1cm4gaShhLCEwKTt2YXIgYz1uZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIithKyIn Iik7dGhyb3cgYy5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixjfXZhciBwPW5bYV09e2V4cG9ydHM6 e319O3RbYV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFthXVsxXVtlXTty ZXR1cm4gbyhuP246ZSl9LHAscC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW2FdLmV4cG9ydHN9 Zm9yKHZhciBpPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGE9MDthPHIubGVu Z3RoO2ErKylvKHJbYV0pO3JldHVybiBvfSh7MTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0 IjtmdW5jdGlvbiByKGUsdCl7dmFyIG49e307cmV0dXJuIG5bZS50b0xvd2VyQ2FzZSgpXT10LnRv TG93ZXJDYXNlKCksblsiV2Via2l0IitlXT0id2Via2l0Iit0LG5bIk1veiIrZV09Im1veiIrdCxu WyJtcyIrZV09Ik1TIit0LG5bIk8iK2VdPSJvIit0LnRvTG93ZXJDYXNlKCksbn1mdW5jdGlvbiBv KGUpe2lmKHNbZV0pcmV0dXJuIHNbZV07aWYoIWFbZV0pcmV0dXJuIGU7dmFyIHQ9YVtlXTtmb3Io dmFyIG4gaW4gdClpZih0Lmhhc093blByb3BlcnR5KG4pJiZuIGluIHUpcmV0dXJuIHNbZV09dFtu XTtyZXR1cm4iIn12YXIgaT1lKDQwKSxhPXthbmltYXRpb25lbmQ6cigiQW5pbWF0aW9uIiwiQW5p bWF0aW9uRW5kIiksYW5pbWF0aW9uaXRlcmF0aW9uOnIoIkFuaW1hdGlvbiIsIkFuaW1hdGlvbkl0 ZXJhdGlvbiIpLGFuaW1hdGlvbnN0YXJ0OnIoIkFuaW1hdGlvbiIsIkFuaW1hdGlvblN0YXJ0Iiks dHJhbnNpdGlvbmVuZDpyKCJUcmFuc2l0aW9uIiwiVHJhbnNpdGlvbkVuZCIpfSxzPXt9LHU9e307 aS5jYW5Vc2VET00mJih1PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLCJBbmlt YXRpb25FdmVudCJpbiB3aW5kb3d8fChkZWxldGUgYS5hbmltYXRpb25lbmQuYW5pbWF0aW9uLGRl bGV0ZSBhLmFuaW1hdGlvbml0ZXJhdGlvbi5hbmltYXRpb24sZGVsZXRlIGEuYW5pbWF0aW9uc3Rh cnQuYW5pbWF0aW9uKSwiVHJhbnNpdGlvbkV2ZW50ImluIHdpbmRvd3x8ZGVsZXRlIGEudHJhbnNp dGlvbmVuZC50cmFuc2l0aW9uKSx0LmV4cG9ydHM9b30sezQwOjQwfV0sMjpbZnVuY3Rpb24oZSx0 LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3ZhciB0PS9bPTpdL2csbj17Ij0iOiI9MCIs IjoiOiI9MiJ9LHI9KCIiK2UpLnJlcGxhY2UodCxmdW5jdGlvbihlKXtyZXR1cm4gbltlXX0pO3Jl dHVybiIkIityfWZ1bmN0aW9uIG8oZSl7dmFyIHQ9Lyg9MHw9MikvZyxuPXsiPTAiOiI9IiwiPTIi OiI6In0scj0iLiI9PT1lWzBdJiYiJCI9PT1lWzFdP2Uuc3Vic3RyaW5nKDIpOmUuc3Vic3RyaW5n KDEpO3JldHVybigiIityKS5yZXBsYWNlKHQsZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV19KX12YXIg aT17ZXNjYXBlOnIsdW5lc2NhcGU6b307dC5leHBvcnRzPWl9LHt9XSwzOltmdW5jdGlvbihlLHQs bil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTgpLG89ZSgyNCksaT17bGlua1N0YXRlOmZ1bmN0aW9u KGUpe3JldHVybiBuZXcgcih0aGlzLnN0YXRlW2VdLG8uY3JlYXRlU3RhdGVLZXlTZXR0ZXIodGhp cyxlKSl9fTt0LmV4cG9ydHM9aX0sezE4OjE4LDI0OjI0fV0sNDpbZnVuY3Rpb24oZSx0LG4peyJ1 c2Ugc3RyaWN0Ijt2YXIgcj1lKDM1KSxvPShlKDQzKSxmdW5jdGlvbihlKXt2YXIgdD10aGlzO2lm KHQuaW5zdGFuY2VQb29sLmxlbmd0aCl7dmFyIG49dC5pbnN0YW5jZVBvb2wucG9wKCk7cmV0dXJu IHQuY2FsbChuLGUpLG59cmV0dXJuIG5ldyB0KGUpfSksaT1mdW5jdGlvbihlLHQpe3ZhciBuPXRo aXM7aWYobi5pbnN0YW5jZVBvb2wubGVuZ3RoKXt2YXIgcj1uLmluc3RhbmNlUG9vbC5wb3AoKTty ZXR1cm4gbi5jYWxsKHIsZSx0KSxyfXJldHVybiBuZXcgbihlLHQpfSxhPWZ1bmN0aW9uKGUsdCxu KXt2YXIgcj10aGlzO2lmKHIuaW5zdGFuY2VQb29sLmxlbmd0aCl7dmFyIG89ci5pbnN0YW5jZVBv b2wucG9wKCk7cmV0dXJuIHIuY2FsbChvLGUsdCxuKSxvfXJldHVybiBuZXcgcihlLHQsbil9LHM9 ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89dGhpcztpZihvLmluc3RhbmNlUG9vbC5sZW5ndGgpe3Zh ciBpPW8uaW5zdGFuY2VQb29sLnBvcCgpO3JldHVybiBvLmNhbGwoaSxlLHQsbixyKSxpfXJldHVy biBuZXcgbyhlLHQsbixyKX0sdT1mdW5jdGlvbihlKXt2YXIgdD10aGlzO2UgaW5zdGFuY2VvZiB0 P3ZvaWQgMDpyKCIyNSIpLGUuZGVzdHJ1Y3RvcigpLHQuaW5zdGFuY2VQb29sLmxlbmd0aDx0LnBv b2xTaXplJiZ0Lmluc3RhbmNlUG9vbC5wdXNoKGUpfSxjPTEwLHA9byxsPWZ1bmN0aW9uKGUsdCl7 dmFyIG49ZTtyZXR1cm4gbi5pbnN0YW5jZVBvb2w9W10sbi5nZXRQb29sZWQ9dHx8cCxuLnBvb2xT aXplfHwobi5wb29sU2l6ZT1jKSxuLnJlbGVhc2U9dSxufSxmPXthZGRQb29saW5nVG86bCxvbmVB cmd1bWVudFBvb2xlcjpvLHR3b0FyZ3VtZW50UG9vbGVyOmksdGhyZWVBcmd1bWVudFBvb2xlcjph LGZvdXJBcmd1bWVudFBvb2xlcjpzfTt0LmV4cG9ydHM9Zn0sezM1OjM1LDQzOjQzfV0sNTpbZnVu Y3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDQ2KSxvPWUoOSksaT1lKDExKSxhPWUo MjMpLHM9ZSgxMCksdT1lKDE0KSxjPWUoMTUpLHA9ZSgyMSksbD1lKDI4KSxmPWUoMzQpLGQ9KGUo NDUpLGMuY3JlYXRlRWxlbWVudCksaD1jLmNyZWF0ZUZhY3Rvcnksdj1jLmNsb25lRWxlbWVudCx5 PXIsbT17Q2hpbGRyZW46e21hcDpvLm1hcCxmb3JFYWNoOm8uZm9yRWFjaCxjb3VudDpvLmNvdW50 LHRvQXJyYXk6by50b0FycmF5LG9ubHk6Zn0sQ29tcG9uZW50OmksUHVyZUNvbXBvbmVudDphLGNy ZWF0ZUVsZW1lbnQ6ZCxjbG9uZUVsZW1lbnQ6dixpc1ZhbGlkRWxlbWVudDpjLmlzVmFsaWRFbGVt ZW50LFByb3BUeXBlczpwLGNyZWF0ZUNsYXNzOnMuY3JlYXRlQ2xhc3MsY3JlYXRlRmFjdG9yeTpo LGNyZWF0ZU1peGluOmZ1bmN0aW9uKGUpe3JldHVybiBlfSxET006dSx2ZXJzaW9uOmwsX19zcHJl YWQ6eX07dC5leHBvcnRzPW19LHsxMDoxMCwxMToxMSwxNDoxNCwxNToxNSwyMToyMSwyMzoyMywy ODoyOCwzNDozNCw0NTo0NSw0Njo0Niw5Ojl9XSw2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJp Y3QiO2Z1bmN0aW9uIHIoKXtpZighbyl7dmFyIHQ9ZSgzMCk7bz10Ll9fU0VDUkVUX0lOSkVDVEVE X1JFQUNUX0RPTV9ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEfXJldHVybiBvfXZhciBv O24uZ2V0UmVhY3RET009cn0sezMwOjMwfV0sNzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0 IjtmdW5jdGlvbiByKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJv cigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gbyhlLHQpe2lm KCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNl ZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBl b2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGkoZSx0KXtpZigiZnVuY3Rp b24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVz c2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtl LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFs dWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2Jq ZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19f PXQpfWZ1bmN0aW9uIGEoZSl7dmFyIHQ9InRyYW5zaXRpb24iK2UrIlRpbWVvdXQiLG49InRyYW5z aXRpb24iK2U7cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKGVbbl0pe2lmKG51bGw9PWVbdF0pcmV0dXJu IG5ldyBFcnJvcih0KyIgd2Fzbid0IHN1cHBsaWVkIHRvIFJlYWN0Q1NTVHJhbnNpdGlvbkdyb3Vw OiB0aGlzIGNhbiBjYXVzZSB1bnJlbGlhYmxlIGFuaW1hdGlvbnMgYW5kIHdvbid0IGJlIHN1cHBv cnRlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIFJlYWN0LiBTZWUgaHR0cHM6Ly9mYi5tZS9yZWFj dC1hbmltYXRpb24tdHJhbnNpdGlvbi1ncm91cC10aW1lb3V0IGZvciBtb3JlIGluZm9ybWF0aW9u LiIpO2lmKCJudW1iZXIiIT10eXBlb2YgZVt0XSlyZXR1cm4gbmV3IEVycm9yKHQrIiBtdXN0IGJl IGEgbnVtYmVyIChpbiBtaWxsaXNlY29uZHMpIil9fX12YXIgcz1lKDQ2KSx1PWUoNSksYz1lKDI3 KSxwPWUoOCksbD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7dmFyIG4saSxhO3IodGhpcyx0KTtm b3IodmFyIHM9YXJndW1lbnRzLmxlbmd0aCxjPUFycmF5KHMpLGw9MDtsPHM7bCsrKWNbbF09YXJn dW1lbnRzW2xdO3JldHVybiBuPWk9byh0aGlzLGUuY2FsbC5hcHBseShlLFt0aGlzXS5jb25jYXQo YykpKSxpLl93cmFwQ2hpbGQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHUuY3JlYXRlRWxlbWVudChwLHtu YW1lOmkucHJvcHMudHJhbnNpdGlvbk5hbWUsYXBwZWFyOmkucHJvcHMudHJhbnNpdGlvbkFwcGVh cixlbnRlcjppLnByb3BzLnRyYW5zaXRpb25FbnRlcixsZWF2ZTppLnByb3BzLnRyYW5zaXRpb25M ZWF2ZSxhcHBlYXJUaW1lb3V0OmkucHJvcHMudHJhbnNpdGlvbkFwcGVhclRpbWVvdXQsZW50ZXJU aW1lb3V0OmkucHJvcHMudHJhbnNpdGlvbkVudGVyVGltZW91dCxsZWF2ZVRpbWVvdXQ6aS5wcm9w cy50cmFuc2l0aW9uTGVhdmVUaW1lb3V0fSxlKX0sYT1uLG8oaSxhKX1yZXR1cm4gaSh0LGUpLHQu cHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3JldHVybiB1LmNyZWF0ZUVsZW1lbnQoYyxzKHt9 LHRoaXMucHJvcHMse2NoaWxkRmFjdG9yeTp0aGlzLl93cmFwQ2hpbGR9KSl9LHR9KHUuQ29tcG9u ZW50KTtsLmRpc3BsYXlOYW1lPSJSZWFjdENTU1RyYW5zaXRpb25Hcm91cCIsbC5wcm9wVHlwZXM9 e3RyYW5zaXRpb25OYW1lOnAucHJvcFR5cGVzLm5hbWUsdHJhbnNpdGlvbkFwcGVhcjp1LlByb3BU eXBlcy5ib29sLHRyYW5zaXRpb25FbnRlcjp1LlByb3BUeXBlcy5ib29sLHRyYW5zaXRpb25MZWF2 ZTp1LlByb3BUeXBlcy5ib29sLHRyYW5zaXRpb25BcHBlYXJUaW1lb3V0OmEoIkFwcGVhciIpLHRy YW5zaXRpb25FbnRlclRpbWVvdXQ6YSgiRW50ZXIiKSx0cmFuc2l0aW9uTGVhdmVUaW1lb3V0OmEo IkxlYXZlIil9LGwuZGVmYXVsdFByb3BzPXt0cmFuc2l0aW9uQXBwZWFyOiExLHRyYW5zaXRpb25F bnRlcjohMCx0cmFuc2l0aW9uTGVhdmU6ITB9LHQuZXhwb3J0cz1sfSx7Mjc6MjcsNDY6NDYsNTo1 LDg6OH1dLDg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSg1KSxvPWUoNiks aT1lKDM5KSxhPWUoMjYpLHM9ZSgzNCksdT0xNyxjPXIuY3JlYXRlQ2xhc3Moe2Rpc3BsYXlOYW1l OiJSZWFjdENTU1RyYW5zaXRpb25Hcm91cENoaWxkIixwcm9wVHlwZXM6e25hbWU6ci5Qcm9wVHlw ZXMub25lT2ZUeXBlKFtyLlByb3BUeXBlcy5zdHJpbmcsci5Qcm9wVHlwZXMuc2hhcGUoe2VudGVy OnIuUHJvcFR5cGVzLnN0cmluZyxsZWF2ZTpyLlByb3BUeXBlcy5zdHJpbmcsYWN0aXZlOnIuUHJv cFR5cGVzLnN0cmluZ30pLHIuUHJvcFR5cGVzLnNoYXBlKHtlbnRlcjpyLlByb3BUeXBlcy5zdHJp bmcsZW50ZXJBY3RpdmU6ci5Qcm9wVHlwZXMuc3RyaW5nLGxlYXZlOnIuUHJvcFR5cGVzLnN0cmlu ZyxsZWF2ZUFjdGl2ZTpyLlByb3BUeXBlcy5zdHJpbmcsYXBwZWFyOnIuUHJvcFR5cGVzLnN0cmlu ZyxhcHBlYXJBY3RpdmU6ci5Qcm9wVHlwZXMuc3RyaW5nfSldKS5pc1JlcXVpcmVkLGFwcGVhcjpy LlByb3BUeXBlcy5ib29sLGVudGVyOnIuUHJvcFR5cGVzLmJvb2wsbGVhdmU6ci5Qcm9wVHlwZXMu Ym9vbCxhcHBlYXJUaW1lb3V0OnIuUHJvcFR5cGVzLm51bWJlcixlbnRlclRpbWVvdXQ6ci5Qcm9w VHlwZXMubnVtYmVyLGxlYXZlVGltZW91dDpyLlByb3BUeXBlcy5udW1iZXJ9LHRyYW5zaXRpb246 ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW8uZ2V0UmVhY3RET00oKS5maW5kRE9NTm9kZSh0aGlzKTtp ZighcilyZXR1cm4gdm9pZCh0JiZ0KCkpO3ZhciBzPXRoaXMucHJvcHMubmFtZVtlXXx8dGhpcy5w cm9wcy5uYW1lKyItIitlLHU9dGhpcy5wcm9wcy5uYW1lW2UrIkFjdGl2ZSJdfHxzKyItYWN0aXZl IixjPW51bGwscD1mdW5jdGlvbihlKXtlJiZlLnRhcmdldCE9PXJ8fChjbGVhclRpbWVvdXQoYyks aS5yZW1vdmVDbGFzcyhyLHMpLGkucmVtb3ZlQ2xhc3Mocix1KSxhLnJlbW92ZUVuZEV2ZW50TGlz dGVuZXIocixwKSx0JiZ0KCkpfTtpLmFkZENsYXNzKHIscyksdGhpcy5xdWV1ZUNsYXNzQW5kTm9k ZSh1LHIpLG4/KGM9c2V0VGltZW91dChwLG4pLHRoaXMudHJhbnNpdGlvblRpbWVvdXRzLnB1c2go YykpOmEuYWRkRW5kRXZlbnRMaXN0ZW5lcihyLHApfSxxdWV1ZUNsYXNzQW5kTm9kZTpmdW5jdGlv bihlLHQpe3RoaXMuY2xhc3NOYW1lQW5kTm9kZVF1ZXVlLnB1c2goe2NsYXNzTmFtZTplLG5vZGU6 dH0pLHRoaXMudGltZW91dHx8KHRoaXMudGltZW91dD1zZXRUaW1lb3V0KHRoaXMuZmx1c2hDbGFz c05hbWVBbmROb2RlUXVldWUsdSkpfSxmbHVzaENsYXNzTmFtZUFuZE5vZGVRdWV1ZTpmdW5jdGlv bigpe3RoaXMuaXNNb3VudGVkKCkmJnRoaXMuY2xhc3NOYW1lQW5kTm9kZVF1ZXVlLmZvckVhY2go ZnVuY3Rpb24oZSl7aS5hZGRDbGFzcyhlLm5vZGUsZS5jbGFzc05hbWUpfSksdGhpcy5jbGFzc05h bWVBbmROb2RlUXVldWUubGVuZ3RoPTAsdGhpcy50aW1lb3V0PW51bGx9LGNvbXBvbmVudFdpbGxN b3VudDpmdW5jdGlvbigpe3RoaXMuY2xhc3NOYW1lQW5kTm9kZVF1ZXVlPVtdLHRoaXMudHJhbnNp dGlvblRpbWVvdXRzPVtdfSxjb21wb25lbnRXaWxsVW5tb3VudDpmdW5jdGlvbigpe3RoaXMudGlt ZW91dCYmY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCksdGhpcy50cmFuc2l0aW9uVGltZW91dHMu Zm9yRWFjaChmdW5jdGlvbihlKXtjbGVhclRpbWVvdXQoZSl9KSx0aGlzLmNsYXNzTmFtZUFuZE5v ZGVRdWV1ZS5sZW5ndGg9MH0sY29tcG9uZW50V2lsbEFwcGVhcjpmdW5jdGlvbihlKXt0aGlzLnBy b3BzLmFwcGVhcj90aGlzLnRyYW5zaXRpb24oImFwcGVhciIsZSx0aGlzLnByb3BzLmFwcGVhclRp bWVvdXQpOmUoKX0sY29tcG9uZW50V2lsbEVudGVyOmZ1bmN0aW9uKGUpe3RoaXMucHJvcHMuZW50 ZXI/dGhpcy50cmFuc2l0aW9uKCJlbnRlciIsZSx0aGlzLnByb3BzLmVudGVyVGltZW91dCk6ZSgp fSxjb21wb25lbnRXaWxsTGVhdmU6ZnVuY3Rpb24oZSl7dGhpcy5wcm9wcy5sZWF2ZT90aGlzLnRy YW5zaXRpb24oImxlYXZlIixlLHRoaXMucHJvcHMubGVhdmVUaW1lb3V0KTplKCl9LHJlbmRlcjpm dW5jdGlvbigpe3JldHVybiBzKHRoaXMucHJvcHMuY2hpbGRyZW4pfX0pO3QuZXhwb3J0cz1jfSx7 MjY6MjYsMzQ6MzQsMzk6MzksNTo1LDY6Nn1dLDk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmlj dCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4oIiIrZSkucmVwbGFjZShiLCIkJi8iKX1mdW5jdGlvbiBv KGUsdCl7dGhpcy5mdW5jPWUsdGhpcy5jb250ZXh0PXQsdGhpcy5jb3VudD0wfWZ1bmN0aW9uIGko ZSx0LG4pe3ZhciByPWUuZnVuYyxvPWUuY29udGV4dDtyLmNhbGwobyx0LGUuY291bnQrKyl9ZnVu Y3Rpb24gYShlLHQsbil7aWYobnVsbD09ZSlyZXR1cm4gZTt2YXIgcj1vLmdldFBvb2xlZCh0LG4p O20oZSxpLHIpLG8ucmVsZWFzZShyKX1mdW5jdGlvbiBzKGUsdCxuLHIpe3RoaXMucmVzdWx0PWUs dGhpcy5rZXlQcmVmaXg9dCx0aGlzLmZ1bmM9bix0aGlzLmNvbnRleHQ9cix0aGlzLmNvdW50PTB9 ZnVuY3Rpb24gdShlLHQsbil7dmFyIG89ZS5yZXN1bHQsaT1lLmtleVByZWZpeCxhPWUuZnVuYyxz PWUuY29udGV4dCx1PWEuY2FsbChzLHQsZS5jb3VudCsrKTtBcnJheS5pc0FycmF5KHUpP2ModSxv LG4seS50aGF0UmV0dXJuc0FyZ3VtZW50KTpudWxsIT11JiYodi5pc1ZhbGlkRWxlbWVudCh1KSYm KHU9di5jbG9uZUFuZFJlcGxhY2VLZXkodSxpKyghdS5rZXl8fHQmJnQua2V5PT09dS5rZXk/IiI6 cih1LmtleSkrIi8iKStuKSksby5wdXNoKHUpKX1mdW5jdGlvbiBjKGUsdCxuLG8saSl7dmFyIGE9 IiI7bnVsbCE9biYmKGE9cihuKSsiLyIpO3ZhciBjPXMuZ2V0UG9vbGVkKHQsYSxvLGkpO20oZSx1 LGMpLHMucmVsZWFzZShjKX1mdW5jdGlvbiBwKGUsdCxuKXtpZihudWxsPT1lKXJldHVybiBlO3Zh ciByPVtdO3JldHVybiBjKGUscixudWxsLHQsbikscn1mdW5jdGlvbiBsKGUsdCxuKXtyZXR1cm4g bnVsbH1mdW5jdGlvbiBmKGUsdCl7cmV0dXJuIG0oZSxsLG51bGwpfWZ1bmN0aW9uIGQoZSl7dmFy IHQ9W107cmV0dXJuIGMoZSx0LG51bGwseS50aGF0UmV0dXJuc0FyZ3VtZW50KSx0fXZhciBoPWUo NCksdj1lKDE1KSx5PWUoNDEpLG09ZSgzNyksZz1oLnR3b0FyZ3VtZW50UG9vbGVyLEU9aC5mb3Vy QXJndW1lbnRQb29sZXIsYj0vXC8rL2c7by5wcm90b3R5cGUuZGVzdHJ1Y3Rvcj1mdW5jdGlvbigp e3RoaXMuZnVuYz1udWxsLHRoaXMuY29udGV4dD1udWxsLHRoaXMuY291bnQ9MH0saC5hZGRQb29s aW5nVG8obyxnKSxzLnByb3RvdHlwZS5kZXN0cnVjdG9yPWZ1bmN0aW9uKCl7dGhpcy5yZXN1bHQ9 bnVsbCx0aGlzLmtleVByZWZpeD1udWxsLHRoaXMuZnVuYz1udWxsLHRoaXMuY29udGV4dD1udWxs LHRoaXMuY291bnQ9MH0saC5hZGRQb29saW5nVG8ocyxFKTt2YXIgVD17Zm9yRWFjaDphLG1hcDpw LG1hcEludG9XaXRoS2V5UHJlZml4SW50ZXJuYWw6Yyxjb3VudDpmLHRvQXJyYXk6ZH07dC5leHBv cnRzPVR9LHsxNToxNSwzNzozNyw0OjQsNDE6NDF9XSwxMDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ug c3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlfWZ1bmN0aW9uIG8oZSx0KXt2YXIgbj1iLmhh c093blByb3BlcnR5KHQpP2JbdF06bnVsbDtfLmhhc093blByb3BlcnR5KHQpJiYoIk9WRVJSSURF X0JBU0UiIT09bj9mKCI3MyIsdCk6dm9pZCAwKSxlJiYoIkRFRklORV9NQU5ZIiE9PW4mJiJERUZJ TkVfTUFOWV9NRVJHRUQiIT09bj9mKCI3NCIsdCk6dm9pZCAwKX1mdW5jdGlvbiBpKGUsdCl7aWYo dCl7ImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZigiNzUiKTp2b2lkIDAsdi5pc1ZhbGlkRWxlbWVudCh0 KT9mKCI3NiIpOnZvaWQgMDt2YXIgbj1lLnByb3RvdHlwZSxyPW4uX19yZWFjdEF1dG9CaW5kUGFp cnM7dC5oYXNPd25Qcm9wZXJ0eShnKSYmVC5taXhpbnMoZSx0Lm1peGlucyk7Zm9yKHZhciBpIGlu IHQpaWYodC5oYXNPd25Qcm9wZXJ0eShpKSYmaSE9PWcpe3ZhciBhPXRbaV0scz1uLmhhc093blBy b3BlcnR5KGkpO2lmKG8ocyxpKSxULmhhc093blByb3BlcnR5KGkpKVRbaV0oZSxhKTtlbHNle3Zh ciBwPWIuaGFzT3duUHJvcGVydHkoaSksbD0iZnVuY3Rpb24iPT10eXBlb2YgYSxkPWwmJiFwJiYh cyYmdC5hdXRvYmluZCE9PSExO2lmKGQpci5wdXNoKGksYSksbltpXT1hO2Vsc2UgaWYocyl7dmFy IGg9YltpXTshcHx8IkRFRklORV9NQU5ZX01FUkdFRCIhPT1oJiYiREVGSU5FX01BTlkiIT09aD9m KCI3NyIsaCxpKTp2b2lkIDAsIkRFRklORV9NQU5ZX01FUkdFRCI9PT1oP25baV09dShuW2ldLGEp OiJERUZJTkVfTUFOWSI9PT1oJiYobltpXT1jKG5baV0sYSkpfWVsc2UgbltpXT1hfX19fWZ1bmN0 aW9uIGEoZSx0KXtpZih0KWZvcih2YXIgbiBpbiB0KXt2YXIgcj10W25dO2lmKHQuaGFzT3duUHJv cGVydHkobikpe3ZhciBvPW4gaW4gVDtvP2YoIjc4IixuKTp2b2lkIDA7dmFyIGk9biBpbiBlO2k/ ZigiNzkiLG4pOnZvaWQgMCxlW25dPXJ9fX1mdW5jdGlvbiBzKGUsdCl7ZSYmdCYmIm9iamVjdCI9 PXR5cGVvZiBlJiYib2JqZWN0Ij09dHlwZW9mIHQ/dm9pZCAwOmYoIjgwIik7Zm9yKHZhciBuIGlu IHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmKHZvaWQgMCE9PWVbbl0/ZigiODEiLG4pOnZvaWQgMCxl W25dPXRbbl0pO3JldHVybiBlfWZ1bmN0aW9uIHUoZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIg bj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKG51 bGw9PW4pcmV0dXJuIHI7aWYobnVsbD09cilyZXR1cm4gbjt2YXIgbz17fTtyZXR1cm4gcyhvLG4p LHMobyxyKSxvfX1mdW5jdGlvbiBjKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7ZS5hcHBseSh0aGlz LGFyZ3VtZW50cyksdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIHAoZSx0KXt2YXIg bj10LmJpbmQoZSk7cmV0dXJuIG59ZnVuY3Rpb24gbChlKXtmb3IodmFyIHQ9ZS5fX3JlYWN0QXV0 b0JpbmRQYWlycyxuPTA7bjx0Lmxlbmd0aDtuKz0yKXt2YXIgcj10W25dLG89dFtuKzFdO2Vbcl09 cChlLG8pfX12YXIgZj1lKDM1KSxkPWUoNDYpLGg9ZSgxMSksdj1lKDE1KSx5PShlKDIwKSxlKDE5 KSksbT1lKDQyKSxnPShlKDQzKSxlKDQ1KSwibWl4aW5zIiksRT1bXSxiPXttaXhpbnM6IkRFRklO RV9NQU5ZIixzdGF0aWNzOiJERUZJTkVfTUFOWSIscHJvcFR5cGVzOiJERUZJTkVfTUFOWSIsY29u dGV4dFR5cGVzOiJERUZJTkVfTUFOWSIsY2hpbGRDb250ZXh0VHlwZXM6IkRFRklORV9NQU5ZIixn ZXREZWZhdWx0UHJvcHM6IkRFRklORV9NQU5ZX01FUkdFRCIsZ2V0SW5pdGlhbFN0YXRlOiJERUZJ TkVfTUFOWV9NRVJHRUQiLGdldENoaWxkQ29udGV4dDoiREVGSU5FX01BTllfTUVSR0VEIixyZW5k ZXI6IkRFRklORV9PTkNFIixjb21wb25lbnRXaWxsTW91bnQ6IkRFRklORV9NQU5ZIixjb21wb25l bnREaWRNb3VudDoiREVGSU5FX01BTlkiLGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM6IkRFRklO RV9NQU5ZIixzaG91bGRDb21wb25lbnRVcGRhdGU6IkRFRklORV9PTkNFIixjb21wb25lbnRXaWxs VXBkYXRlOiJERUZJTkVfTUFOWSIsY29tcG9uZW50RGlkVXBkYXRlOiJERUZJTkVfTUFOWSIsY29t cG9uZW50V2lsbFVubW91bnQ6IkRFRklORV9NQU5ZIix1cGRhdGVDb21wb25lbnQ6Ik9WRVJSSURF X0JBU0UifSxUPXtkaXNwbGF5TmFtZTpmdW5jdGlvbihlLHQpe2UuZGlzcGxheU5hbWU9dH0sbWl4 aW5zOmZ1bmN0aW9uKGUsdCl7aWYodClmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpKGUsdFtu XSl9LGNoaWxkQ29udGV4dFR5cGVzOmZ1bmN0aW9uKGUsdCl7ZS5jaGlsZENvbnRleHRUeXBlcz1k KHt9LGUuY2hpbGRDb250ZXh0VHlwZXMsdCl9LGNvbnRleHRUeXBlczpmdW5jdGlvbihlLHQpe2Uu Y29udGV4dFR5cGVzPWQoe30sZS5jb250ZXh0VHlwZXMsdCl9LGdldERlZmF1bHRQcm9wczpmdW5j dGlvbihlLHQpe2UuZ2V0RGVmYXVsdFByb3BzP2UuZ2V0RGVmYXVsdFByb3BzPXUoZS5nZXREZWZh dWx0UHJvcHMsdCk6ZS5nZXREZWZhdWx0UHJvcHM9dH0scHJvcFR5cGVzOmZ1bmN0aW9uKGUsdCl7 ZS5wcm9wVHlwZXM9ZCh7fSxlLnByb3BUeXBlcyx0KX0sc3RhdGljczpmdW5jdGlvbihlLHQpe2Eo ZSx0KX0sYXV0b2JpbmQ6ZnVuY3Rpb24oKXt9fSxfPXtyZXBsYWNlU3RhdGU6ZnVuY3Rpb24oZSx0 KXt0aGlzLnVwZGF0ZXIuZW5xdWV1ZVJlcGxhY2VTdGF0ZSh0aGlzLGUpLHQmJnRoaXMudXBkYXRl ci5lbnF1ZXVlQ2FsbGJhY2sodGhpcyx0LCJyZXBsYWNlU3RhdGUiKX0saXNNb3VudGVkOmZ1bmN0 aW9uKCl7cmV0dXJuIHRoaXMudXBkYXRlci5pc01vdW50ZWQodGhpcyl9fSxQPWZ1bmN0aW9uKCl7 fTtkKFAucHJvdG90eXBlLGgucHJvdG90eXBlLF8pO3ZhciB3PXtjcmVhdGVDbGFzczpmdW5jdGlv bihlKXt2YXIgdD1yKGZ1bmN0aW9uKGUsbixyKXt0aGlzLl9fcmVhY3RBdXRvQmluZFBhaXJzLmxl bmd0aCYmbCh0aGlzKSx0aGlzLnByb3BzPWUsdGhpcy5jb250ZXh0PW4sdGhpcy5yZWZzPW0sdGhp cy51cGRhdGVyPXJ8fHksdGhpcy5zdGF0ZT1udWxsO3ZhciBvPXRoaXMuZ2V0SW5pdGlhbFN0YXRl P3RoaXMuZ2V0SW5pdGlhbFN0YXRlKCk6bnVsbDsib2JqZWN0IiE9dHlwZW9mIG98fEFycmF5Lmlz QXJyYXkobyk/ZigiODIiLHQuZGlzcGxheU5hbWV8fCJSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCIp OnZvaWQgMCx0aGlzLnN0YXRlPW99KTt0LnByb3RvdHlwZT1uZXcgUCx0LnByb3RvdHlwZS5jb25z dHJ1Y3Rvcj10LHQucHJvdG90eXBlLl9fcmVhY3RBdXRvQmluZFBhaXJzPVtdLEUuZm9yRWFjaChp LmJpbmQobnVsbCx0KSksaSh0LGUpLHQuZ2V0RGVmYXVsdFByb3BzJiYodC5kZWZhdWx0UHJvcHM9 dC5nZXREZWZhdWx0UHJvcHMoKSksdC5wcm90b3R5cGUucmVuZGVyP3ZvaWQgMDpmKCI4MyIpO2Zv cih2YXIgbiBpbiBiKXQucHJvdG90eXBlW25dfHwodC5wcm90b3R5cGVbbl09bnVsbCk7cmV0dXJu IHR9LGluamVjdGlvbjp7aW5qZWN0TWl4aW46ZnVuY3Rpb24oZSl7RS5wdXNoKGUpfX19O3QuZXhw b3J0cz13fSx7MTE6MTEsMTU6MTUsMTk6MTksMjA6MjAsMzU6MzUsNDI6NDIsNDM6NDMsNDU6NDUs NDY6NDZ9XSwxMTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxu KXt0aGlzLnByb3BzPWUsdGhpcy5jb250ZXh0PXQsdGhpcy5yZWZzPWEsdGhpcy51cGRhdGVyPW58 fGl9dmFyIG89ZSgzNSksaT1lKDE5KSxhPShlKDMxKSxlKDQyKSk7ZSg0MyksZSg0NSk7ci5wcm90 b3R5cGUuaXNSZWFjdENvbXBvbmVudD17fSxyLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihl LHQpeyJvYmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPWU/bygi ODUiKTp2b2lkIDAsdGhpcy51cGRhdGVyLmVucXVldWVTZXRTdGF0ZSh0aGlzLGUpLHQmJnRoaXMu dXBkYXRlci5lbnF1ZXVlQ2FsbGJhY2sodGhpcyx0LCJzZXRTdGF0ZSIpfSxyLnByb3RvdHlwZS5m b3JjZVVwZGF0ZT1mdW5jdGlvbihlKXt0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRo aXMpLGUmJnRoaXMudXBkYXRlci5lbnF1ZXVlQ2FsbGJhY2sodGhpcyxlLCJmb3JjZVVwZGF0ZSIp fTt0LmV4cG9ydHM9cn0sezE5OjE5LDMxOjMxLDM1OjM1LDQyOjQyLDQzOjQzLDQ1OjQ1fV0sMTI6 W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgzNiksbz17c2hvdWxkQ29tcG9u ZW50VXBkYXRlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIodGhpcyxlLHQpfX07dC5leHBvcnRzPW99 LHszNjozNn1dLDEzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXtjdXJyZW50 Om51bGx9O3QuZXhwb3J0cz1yfSx7fV0sMTQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7 dmFyIHI9ZSgxNSksbz1yLmNyZWF0ZUZhY3RvcnksaT17YTpvKCJhIiksYWJicjpvKCJhYmJyIiks YWRkcmVzczpvKCJhZGRyZXNzIiksYXJlYTpvKCJhcmVhIiksYXJ0aWNsZTpvKCJhcnRpY2xlIiks YXNpZGU6bygiYXNpZGUiKSxhdWRpbzpvKCJhdWRpbyIpLGI6bygiYiIpLGJhc2U6bygiYmFzZSIp LGJkaTpvKCJiZGkiKSxiZG86bygiYmRvIiksYmlnOm8oImJpZyIpLGJsb2NrcXVvdGU6bygiYmxv Y2txdW90ZSIpLGJvZHk6bygiYm9keSIpLGJyOm8oImJyIiksYnV0dG9uOm8oImJ1dHRvbiIpLGNh bnZhczpvKCJjYW52YXMiKSxjYXB0aW9uOm8oImNhcHRpb24iKSxjaXRlOm8oImNpdGUiKSxjb2Rl Om8oImNvZGUiKSxjb2w6bygiY29sIiksY29sZ3JvdXA6bygiY29sZ3JvdXAiKSxkYXRhOm8oImRh dGEiKSxkYXRhbGlzdDpvKCJkYXRhbGlzdCIpLGRkOm8oImRkIiksZGVsOm8oImRlbCIpLGRldGFp bHM6bygiZGV0YWlscyIpLGRmbjpvKCJkZm4iKSxkaWFsb2c6bygiZGlhbG9nIiksZGl2Om8oImRp diIpLGRsOm8oImRsIiksZHQ6bygiZHQiKSxlbTpvKCJlbSIpLGVtYmVkOm8oImVtYmVkIiksZmll bGRzZXQ6bygiZmllbGRzZXQiKSxmaWdjYXB0aW9uOm8oImZpZ2NhcHRpb24iKSxmaWd1cmU6bygi ZmlndXJlIiksZm9vdGVyOm8oImZvb3RlciIpLGZvcm06bygiZm9ybSIpLGgxOm8oImgxIiksaDI6 bygiaDIiKSxoMzpvKCJoMyIpLGg0Om8oImg0IiksaDU6bygiaDUiKSxoNjpvKCJoNiIpLGhlYWQ6 bygiaGVhZCIpLGhlYWRlcjpvKCJoZWFkZXIiKSxoZ3JvdXA6bygiaGdyb3VwIiksaHI6bygiaHIi KSxodG1sOm8oImh0bWwiKSxpOm8oImkiKSxpZnJhbWU6bygiaWZyYW1lIiksaW1nOm8oImltZyIp LGlucHV0Om8oImlucHV0IiksaW5zOm8oImlucyIpLGtiZDpvKCJrYmQiKSxrZXlnZW46bygia2V5 Z2VuIiksbGFiZWw6bygibGFiZWwiKSxsZWdlbmQ6bygibGVnZW5kIiksbGk6bygibGkiKSxsaW5r Om8oImxpbmsiKSxtYWluOm8oIm1haW4iKSxtYXA6bygibWFwIiksbWFyazpvKCJtYXJrIiksbWVu dTpvKCJtZW51IiksbWVudWl0ZW06bygibWVudWl0ZW0iKSxtZXRhOm8oIm1ldGEiKSxtZXRlcjpv KCJtZXRlciIpLG5hdjpvKCJuYXYiKSxub3NjcmlwdDpvKCJub3NjcmlwdCIpLG9iamVjdDpvKCJv YmplY3QiKSxvbDpvKCJvbCIpLG9wdGdyb3VwOm8oIm9wdGdyb3VwIiksb3B0aW9uOm8oIm9wdGlv biIpLG91dHB1dDpvKCJvdXRwdXQiKSxwOm8oInAiKSxwYXJhbTpvKCJwYXJhbSIpLHBpY3R1cmU6 bygicGljdHVyZSIpLHByZTpvKCJwcmUiKSxwcm9ncmVzczpvKCJwcm9ncmVzcyIpLHE6bygicSIp LHJwOm8oInJwIikscnQ6bygicnQiKSxydWJ5Om8oInJ1YnkiKSxzOm8oInMiKSxzYW1wOm8oInNh bXAiKSxzY3JpcHQ6bygic2NyaXB0Iiksc2VjdGlvbjpvKCJzZWN0aW9uIiksc2VsZWN0Om8oInNl bGVjdCIpLHNtYWxsOm8oInNtYWxsIiksc291cmNlOm8oInNvdXJjZSIpLHNwYW46bygic3BhbiIp LHN0cm9uZzpvKCJzdHJvbmciKSxzdHlsZTpvKCJzdHlsZSIpLHN1YjpvKCJzdWIiKSxzdW1tYXJ5 Om8oInN1bW1hcnkiKSxzdXA6bygic3VwIiksdGFibGU6bygidGFibGUiKSx0Ym9keTpvKCJ0Ym9k eSIpLHRkOm8oInRkIiksdGV4dGFyZWE6bygidGV4dGFyZWEiKSx0Zm9vdDpvKCJ0Zm9vdCIpLHRo Om8oInRoIiksdGhlYWQ6bygidGhlYWQiKSx0aW1lOm8oInRpbWUiKSx0aXRsZTpvKCJ0aXRsZSIp LHRyOm8oInRyIiksdHJhY2s6bygidHJhY2siKSx1Om8oInUiKSx1bDpvKCJ1bCIpLHZhcjpvKCJ2 YXIiKSx2aWRlbzpvKCJ2aWRlbyIpLHdicjpvKCJ3YnIiKSxjaXJjbGU6bygiY2lyY2xlIiksY2xp cFBhdGg6bygiY2xpcFBhdGgiKSxkZWZzOm8oImRlZnMiKSxlbGxpcHNlOm8oImVsbGlwc2UiKSxn Om8oImciKSxpbWFnZTpvKCJpbWFnZSIpLGxpbmU6bygibGluZSIpLGxpbmVhckdyYWRpZW50Om8o ImxpbmVhckdyYWRpZW50IiksbWFzazpvKCJtYXNrIikscGF0aDpvKCJwYXRoIikscGF0dGVybjpv KCJwYXR0ZXJuIikscG9seWdvbjpvKCJwb2x5Z29uIikscG9seWxpbmU6bygicG9seWxpbmUiKSxy YWRpYWxHcmFkaWVudDpvKCJyYWRpYWxHcmFkaWVudCIpLHJlY3Q6bygicmVjdCIpLHN0b3A6bygi c3RvcCIpLHN2ZzpvKCJzdmciKSx0ZXh0Om8oInRleHQiKSx0c3BhbjpvKCJ0c3BhbiIpfTt0LmV4 cG9ydHM9aX0sezE1OjE1fV0sMTU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rp b24gcihlKXtyZXR1cm4gdm9pZCAwIT09ZS5yZWZ9ZnVuY3Rpb24gbyhlKXtyZXR1cm4gdm9pZCAw IT09ZS5rZXl9dmFyIGk9ZSg0NiksYT1lKDEzKSxzPShlKDQ1KSxlKDMxKSxPYmplY3QucHJvdG90 eXBlLmhhc093blByb3BlcnR5KSx1PWUoMTYpLGM9e2tleTohMCxyZWY6ITAsX19zZWxmOiEwLF9f c291cmNlOiEwfSxwPWZ1bmN0aW9uKGUsdCxuLHIsbyxpLGEpe3ZhciBzPXskJHR5cGVvZjp1LHR5 cGU6ZSxrZXk6dCxyZWY6bixwcm9wczphLF9vd25lcjppfTtyZXR1cm4gc307cC5jcmVhdGVFbGVt ZW50PWZ1bmN0aW9uKGUsdCxuKXt2YXIgaSx1PXt9LGw9bnVsbCxmPW51bGwsZD1udWxsLGg9bnVs bDtpZihudWxsIT10KXtyKHQpJiYoZj10LnJlZiksbyh0KSYmKGw9IiIrdC5rZXkpLGQ9dm9pZCAw PT09dC5fX3NlbGY/bnVsbDp0Ll9fc2VsZixoPXZvaWQgMD09PXQuX19zb3VyY2U/bnVsbDp0Ll9f c291cmNlO2ZvcihpIGluIHQpcy5jYWxsKHQsaSkmJiFjLmhhc093blByb3BlcnR5KGkpJiYodVtp XT10W2ldKX12YXIgdj1hcmd1bWVudHMubGVuZ3RoLTI7aWYoMT09PXYpdS5jaGlsZHJlbj1uO2Vs c2UgaWYodj4xKXtmb3IodmFyIHk9QXJyYXkodiksbT0wO208djttKyspeVttXT1hcmd1bWVudHNb bSsyXTt1LmNoaWxkcmVuPXl9aWYoZSYmZS5kZWZhdWx0UHJvcHMpe3ZhciBnPWUuZGVmYXVsdFBy b3BzO2ZvcihpIGluIGcpdm9pZCAwPT09dVtpXSYmKHVbaV09Z1tpXSl9cmV0dXJuIHAoZSxsLGYs ZCxoLGEuY3VycmVudCx1KX0scC5jcmVhdGVGYWN0b3J5PWZ1bmN0aW9uKGUpe3ZhciB0PXAuY3Jl YXRlRWxlbWVudC5iaW5kKG51bGwsZSk7cmV0dXJuIHQudHlwZT1lLHR9LHAuY2xvbmVBbmRSZXBs YWNlS2V5PWZ1bmN0aW9uKGUsdCl7dmFyIG49cChlLnR5cGUsdCxlLnJlZixlLl9zZWxmLGUuX3Nv dXJjZSxlLl9vd25lcixlLnByb3BzKTtyZXR1cm4gbn0scC5jbG9uZUVsZW1lbnQ9ZnVuY3Rpb24o ZSx0LG4pe3ZhciB1LGw9aSh7fSxlLnByb3BzKSxmPWUua2V5LGQ9ZS5yZWYsaD1lLl9zZWxmLHY9 ZS5fc291cmNlLHk9ZS5fb3duZXI7aWYobnVsbCE9dCl7cih0KSYmKGQ9dC5yZWYseT1hLmN1cnJl bnQpLG8odCkmJihmPSIiK3Qua2V5KTt2YXIgbTtlLnR5cGUmJmUudHlwZS5kZWZhdWx0UHJvcHMm JihtPWUudHlwZS5kZWZhdWx0UHJvcHMpO2Zvcih1IGluIHQpcy5jYWxsKHQsdSkmJiFjLmhhc093 blByb3BlcnR5KHUpJiYodm9pZCAwPT09dFt1XSYmdm9pZCAwIT09bT9sW3VdPW1bdV06bFt1XT10 W3VdKX12YXIgZz1hcmd1bWVudHMubGVuZ3RoLTI7aWYoMT09PWcpbC5jaGlsZHJlbj1uO2Vsc2Ug aWYoZz4xKXtmb3IodmFyIEU9QXJyYXkoZyksYj0wO2I8ZztiKyspRVtiXT1hcmd1bWVudHNbYisy XTtsLmNoaWxkcmVuPUV9cmV0dXJuIHAoZS50eXBlLGYsZCxoLHYseSxsKX0scC5pc1ZhbGlkRWxl bWVudD1mdW5jdGlvbihlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPT1lJiZlLiQk dHlwZW9mPT09dX0sdC5leHBvcnRzPXB9LHsxMzoxMywxNjoxNiwzMTozMSw0NTo0NSw0Njo0Nn1d LDE2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPSJmdW5jdGlvbiI9PXR5cGVv ZiBTeW1ib2wmJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKXx8NjAxMDM7 dC5leHBvcnRzPXJ9LHt9XSwxNzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1l KDM1KSxvPWUoOSksaT1lKDE1KSxhPWUoNDEpLHM9KGUoNDMpLGUoNDUpLHtjcmVhdGU6ZnVuY3Rp b24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHwhZXx8QXJyYXkuaXNBcnJheShlKSlyZXR1cm4g ZTtpZihpLmlzVmFsaWRFbGVtZW50KGUpKXJldHVybiBlOzE9PT1lLm5vZGVUeXBlP3IoIjAiKTp2 b2lkIDA7dmFyIHQ9W107Zm9yKHZhciBuIGluIGUpby5tYXBJbnRvV2l0aEtleVByZWZpeEludGVy bmFsKGVbbl0sdCxuLGEudGhhdFJldHVybnNBcmd1bWVudCk7cmV0dXJuIHR9fSk7dC5leHBvcnRz PXN9LHsxNToxNSwzNTozNSw0MTo0MSw0Mzo0Myw0NTo0NSw5Ojl9XSwxODpbZnVuY3Rpb24oZSx0 LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7dGhpcy52YWx1ZT1lLHRoaXMucmVxdWVz dENoYW5nZT10fWZ1bmN0aW9uIG8oZSl7dmFyIHQ9e3ZhbHVlOnZvaWQgMD09PWU/aS5Qcm9wVHlw ZXMuYW55LmlzUmVxdWlyZWQ6ZS5pc1JlcXVpcmVkLHJlcXVlc3RDaGFuZ2U6aS5Qcm9wVHlwZXMu ZnVuYy5pc1JlcXVpcmVkfTtyZXR1cm4gaS5Qcm9wVHlwZXMuc2hhcGUodCl9dmFyIGk9ZSg1KTty LlByb3BUeXBlcz17bGluazpvfSx0LmV4cG9ydHM9cn0sezU6NX1dLDE5OltmdW5jdGlvbihlLHQs bil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXt9dmFyIG89KGUoNDUpLHtpc01vdW50ZWQ6 ZnVuY3Rpb24oZSl7cmV0dXJuITF9LGVucXVldWVDYWxsYmFjazpmdW5jdGlvbihlLHQpe30sZW5x dWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKGUpe3IoZSwiZm9yY2VVcGRhdGUiKX0sZW5xdWV1ZVJl cGxhY2VTdGF0ZTpmdW5jdGlvbihlLHQpe3IoZSwicmVwbGFjZVN0YXRlIil9LGVucXVldWVTZXRT dGF0ZTpmdW5jdGlvbihlLHQpe3IoZSwic2V0U3RhdGUiKX19KTt0LmV4cG9ydHM9b30sezQ1OjQ1 fV0sMjA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9e307dC5leHBvcnRzPXJ9 LHt9XSwyMTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7cmV0 dXJuIGU9PT10PzAhPT1lfHwxL2U9PT0xL3Q6ZSE9PWUmJnQhPT10fWZ1bmN0aW9uIG8oZSl7dGhp cy5tZXNzYWdlPWUsdGhpcy5zdGFjaz0iIn1mdW5jdGlvbiBpKGUpe2Z1bmN0aW9uIHQodCxuLHIs aSxhLHMsdSl7aWYoaT1pfHx4LHM9c3x8cixudWxsPT1uW3JdKXt2YXIgYz1fW2FdO3JldHVybiB0 P25ldyBvKG51bGw9PT1uW3JdPyJUaGUgIitjKyIgYCIrcysiYCBpcyBtYXJrZWQgYXMgcmVxdWly ZWQgIisoImluIGAiK2krImAsIGJ1dCBpdHMgdmFsdWUgaXMgYG51bGxgLiIpOiJUaGUgIitjKyIg YCIrcysiYCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQgaW4gIisoImAiK2krImAsIGJ1dCBpdHMgdmFs dWUgaXMgYHVuZGVmaW5lZGAuIikpOm51bGx9cmV0dXJuIGUobixyLGksYSxzKX12YXIgbj10LmJp bmQobnVsbCwhMSk7cmV0dXJuIG4uaXNSZXF1aXJlZD10LmJpbmQobnVsbCwhMCksbn1mdW5jdGlv biBhKGUpe2Z1bmN0aW9uIHQodCxuLHIsaSxhLHMpe3ZhciB1PXRbbl0sYz1nKHUpO2lmKGMhPT1l KXt2YXIgcD1fW2ldLGw9RSh1KTtyZXR1cm4gbmV3IG8oIkludmFsaWQgIitwKyIgYCIrYSsiYCBv ZiB0eXBlICIrKCJgIitsKyJgIHN1cHBsaWVkIHRvIGAiK3IrImAsIGV4cGVjdGVkICIpKygiYCIr ZSsiYC4iKSl9cmV0dXJuIG51bGx9cmV0dXJuIGkodCl9ZnVuY3Rpb24gcygpe3JldHVybiBpKHcu dGhhdFJldHVybnMobnVsbCkpfWZ1bmN0aW9uIHUoZSl7ZnVuY3Rpb24gdCh0LG4scixpLGEpe2lm KCJmdW5jdGlvbiIhPXR5cGVvZiBlKXJldHVybiBuZXcgbygiUHJvcGVydHkgYCIrYSsiYCBvZiBj b21wb25lbnQgYCIrcisiYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgYXJy YXlPZi4iKTt2YXIgcz10W25dO2lmKCFBcnJheS5pc0FycmF5KHMpKXt2YXIgdT1fW2ldLGM9Zyhz KTtyZXR1cm4gbmV3IG8oIkludmFsaWQgIit1KyIgYCIrYSsiYCBvZiB0eXBlICIrKCJgIitjKyJg IHN1cHBsaWVkIHRvIGAiK3IrImAsIGV4cGVjdGVkIGFuIGFycmF5LiIpKX1mb3IodmFyIHA9MDtw PHMubGVuZ3RoO3ArKyl7dmFyIGw9ZShzLHAscixpLGErIlsiK3ArIl0iLFApO2lmKGwgaW5zdGFu Y2VvZiBFcnJvcilyZXR1cm4gbH1yZXR1cm4gbnVsbH1yZXR1cm4gaSh0KX1mdW5jdGlvbiBjKCl7 ZnVuY3Rpb24gZShlLHQsbixyLGkpe3ZhciBhPWVbdF07aWYoIVQuaXNWYWxpZEVsZW1lbnQoYSkp e3ZhciBzPV9bcl0sdT1nKGEpO3JldHVybiBuZXcgbygiSW52YWxpZCAiK3MrIiBgIitpKyJgIG9m IHR5cGUgIisoImAiK3UrImAgc3VwcGxpZWQgdG8gYCIrbisiYCwgZXhwZWN0ZWQgYSBzaW5nbGUg UmVhY3RFbGVtZW50LiIpKX1yZXR1cm4gbnVsbH1yZXR1cm4gaShlKX1mdW5jdGlvbiBwKGUpe2Z1 bmN0aW9uIHQodCxuLHIsaSxhKXtpZighKHRbbl1pbnN0YW5jZW9mIGUpKXt2YXIgcz1fW2ldLHU9 ZS5uYW1lfHx4LGM9Yih0W25dKTtyZXR1cm4gbmV3IG8oIkludmFsaWQgIitzKyIgYCIrYSsiYCBv ZiB0eXBlICIrKCJgIitjKyJgIHN1cHBsaWVkIHRvIGAiK3IrImAsIGV4cGVjdGVkICIpKygiaW5z dGFuY2Ugb2YgYCIrdSsiYC4iKSl9cmV0dXJuIG51bGx9cmV0dXJuIGkodCl9ZnVuY3Rpb24gbChl KXtmdW5jdGlvbiB0KHQsbixpLGEscyl7Zm9yKHZhciB1PXRbbl0sYz0wO2M8ZS5sZW5ndGg7Yysr KWlmKHIodSxlW2NdKSlyZXR1cm4gbnVsbDt2YXIgcD1fW2FdLGw9SlNPTi5zdHJpbmdpZnkoZSk7 cmV0dXJuIG5ldyBvKCJJbnZhbGlkICIrcCsiIGAiK3MrImAgb2YgdmFsdWUgYCIrdSsiYCAiKygi c3VwcGxpZWQgdG8gYCIraSsiYCwgZXhwZWN0ZWQgb25lIG9mICIrbCsiLiIpKX1yZXR1cm4gQXJy YXkuaXNBcnJheShlKT9pKHQpOncudGhhdFJldHVybnNOdWxsfWZ1bmN0aW9uIGYoZSl7ZnVuY3Rp b24gdCh0LG4scixpLGEpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXJldHVybiBuZXcgbygiUHJv cGVydHkgYCIrYSsiYCBvZiBjb21wb25lbnQgYCIrcisiYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBu b3RhdGlvbiBpbnNpZGUgb2JqZWN0T2YuIik7dmFyIHM9dFtuXSx1PWcocyk7aWYoIm9iamVjdCIh PT11KXt2YXIgYz1fW2ldO3JldHVybiBuZXcgbygiSW52YWxpZCAiK2MrIiBgIithKyJgIG9mIHR5 cGUgIisoImAiK3UrImAgc3VwcGxpZWQgdG8gYCIrcisiYCwgZXhwZWN0ZWQgYW4gb2JqZWN0LiIp KX1mb3IodmFyIHAgaW4gcylpZihzLmhhc093blByb3BlcnR5KHApKXt2YXIgbD1lKHMscCxyLGks YSsiLiIrcCxQKTtpZihsIGluc3RhbmNlb2YgRXJyb3IpcmV0dXJuIGx9cmV0dXJuIG51bGx9cmV0 dXJuIGkodCl9ZnVuY3Rpb24gZChlKXtmdW5jdGlvbiB0KHQsbixyLGksYSl7Zm9yKHZhciBzPTA7 czxlLmxlbmd0aDtzKyspe3ZhciB1PWVbc107aWYobnVsbD09dSh0LG4scixpLGEsUCkpcmV0dXJu IG51bGx9dmFyIGM9X1tpXTtyZXR1cm4gbmV3IG8oIkludmFsaWQgIitjKyIgYCIrYSsiYCBzdXBw bGllZCB0byAiKygiYCIrcisiYC4iKSl9cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/aSh0KTp3LnRo YXRSZXR1cm5zTnVsbH1mdW5jdGlvbiBoKCl7ZnVuY3Rpb24gZShlLHQsbixyLGkpe2lmKCF5KGVb dF0pKXt2YXIgYT1fW3JdO3JldHVybiBuZXcgbygiSW52YWxpZCAiK2ErIiBgIitpKyJgIHN1cHBs aWVkIHRvICIrKCJgIituKyJgLCBleHBlY3RlZCBhIFJlYWN0Tm9kZS4iKSl9cmV0dXJuIG51bGx9 cmV0dXJuIGkoZSl9ZnVuY3Rpb24gdihlKXtmdW5jdGlvbiB0KHQsbixyLGksYSl7dmFyIHM9dFtu XSx1PWcocyk7aWYoIm9iamVjdCIhPT11KXt2YXIgYz1fW2ldO3JldHVybiBuZXcgbygiSW52YWxp ZCAiK2MrIiBgIithKyJgIG9mIHR5cGUgYCIrdSsiYCAiKygic3VwcGxpZWQgdG8gYCIrcisiYCwg ZXhwZWN0ZWQgYG9iamVjdGAuIikpfWZvcih2YXIgcCBpbiBlKXt2YXIgbD1lW3BdO2lmKGwpe3Zh ciBmPWwocyxwLHIsaSxhKyIuIitwLFApO2lmKGYpcmV0dXJuIGZ9fXJldHVybiBudWxsfXJldHVy biBpKHQpfWZ1bmN0aW9uIHkoZSl7c3dpdGNoKHR5cGVvZiBlKXtjYXNlIm51bWJlciI6Y2FzZSJz dHJpbmciOmNhc2UidW5kZWZpbmVkIjpyZXR1cm4hMDtjYXNlImJvb2xlYW4iOnJldHVybiFlO2Nh c2Uib2JqZWN0IjppZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlLmV2ZXJ5KHkpO2lmKG51bGw9 PT1lfHxULmlzVmFsaWRFbGVtZW50KGUpKXJldHVybiEwO3ZhciB0PUEoZSk7aWYoIXQpcmV0dXJu ITE7dmFyIG4scj10LmNhbGwoZSk7aWYodCE9PWUuZW50cmllcyl7Zm9yKDshKG49ci5uZXh0KCkp LmRvbmU7KWlmKCF5KG4udmFsdWUpKXJldHVybiExfWVsc2UgZm9yKDshKG49ci5uZXh0KCkpLmRv bmU7KXt2YXIgbz1uLnZhbHVlO2lmKG8mJiF5KG9bMV0pKXJldHVybiExfXJldHVybiEwO2RlZmF1 bHQ6cmV0dXJuITF9fWZ1bmN0aW9uIG0oZSx0KXtyZXR1cm4ic3ltYm9sIj09PWV8fCJTeW1ib2wi PT09dFsiQEB0b1N0cmluZ1RhZyJdfHwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0IGluc3Rh bmNlb2YgU3ltYm9sfWZ1bmN0aW9uIGcoZSl7dmFyIHQ9dHlwZW9mIGU7cmV0dXJuIEFycmF5Lmlz QXJyYXkoZSk/ImFycmF5IjplIGluc3RhbmNlb2YgUmVnRXhwPyJvYmplY3QiOm0odCxlKT8ic3lt Ym9sIjp0fWZ1bmN0aW9uIEUoZSl7dmFyIHQ9ZyhlKTtpZigib2JqZWN0Ij09PXQpe2lmKGUgaW5z dGFuY2VvZiBEYXRlKXJldHVybiJkYXRlIjtpZihlIGluc3RhbmNlb2YgUmVnRXhwKXJldHVybiJy ZWdleHAifXJldHVybiB0fWZ1bmN0aW9uIGIoZSl7cmV0dXJuIGUuY29uc3RydWN0b3ImJmUuY29u c3RydWN0b3IubmFtZT9lLmNvbnN0cnVjdG9yLm5hbWU6eH12YXIgVD1lKDE1KSxfPWUoMjApLFA9 ZSgyMiksdz1lKDQxKSxBPWUoMzMpLHg9KGUoNDUpLCI8PGFub255bW91cz4+IiksTz17YXJyYXk6 YSgiYXJyYXkiKSxib29sOmEoImJvb2xlYW4iKSxmdW5jOmEoImZ1bmN0aW9uIiksbnVtYmVyOmEo Im51bWJlciIpLG9iamVjdDphKCJvYmplY3QiKSxzdHJpbmc6YSgic3RyaW5nIiksc3ltYm9sOmEo InN5bWJvbCIpLGFueTpzKCksYXJyYXlPZjp1LGVsZW1lbnQ6YygpLGluc3RhbmNlT2Y6cCxub2Rl OmgoKSxvYmplY3RPZjpmLG9uZU9mOmwsb25lT2ZUeXBlOmQsc2hhcGU6dn07by5wcm90b3R5cGU9 RXJyb3IucHJvdG90eXBlLHQuZXhwb3J0cz1PfSx7MTU6MTUsMjA6MjAsMjI6MjIsMzM6MzMsNDE6 NDEsNDU6NDV9XSwyMjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj0iU0VDUkVU X0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQiO3QuZXhwb3J0cz1yfSx7fV0s MjM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbil7dGhpcy5w cm9wcz1lLHRoaXMuY29udGV4dD10LHRoaXMucmVmcz11LHRoaXMudXBkYXRlcj1ufHxzfWZ1bmN0 aW9uIG8oKXt9dmFyIGk9ZSg0NiksYT1lKDExKSxzPWUoMTkpLHU9ZSg0Mik7by5wcm90b3R5cGU9 YS5wcm90b3R5cGUsci5wcm90b3R5cGU9bmV3IG8sci5wcm90b3R5cGUuY29uc3RydWN0b3I9cixp KHIucHJvdG90eXBlLGEucHJvdG90eXBlKSxyLnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVu dD0hMCx0LmV4cG9ydHM9cn0sezExOjExLDE5OjE5LDQyOjQyLDQ2OjQ2fV0sMjQ6W2Z1bmN0aW9u KGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3ZhciBuPXt9O3JldHVybiBmdW5j dGlvbihyKXtuW3RdPXIsZS5zZXRTdGF0ZShuKX19dmFyIG89e2NyZWF0ZVN0YXRlU2V0dGVyOmZ1 bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKG4scixvLGksYSxzKXt2YXIgdT10LmNhbGwoZSxu LHIsbyxpLGEscyk7dSYmZS5zZXRTdGF0ZSh1KX19LGNyZWF0ZVN0YXRlS2V5U2V0dGVyOmZ1bmN0 aW9uKGUsdCl7dmFyIG49ZS5fX2tleVNldHRlcnN8fChlLl9fa2V5U2V0dGVycz17fSk7cmV0dXJu IG5bdF18fChuW3RdPXIoZSx0KSl9fTtvLk1peGluPXtjcmVhdGVTdGF0ZVNldHRlcjpmdW5jdGlv bihlKXtyZXR1cm4gby5jcmVhdGVTdGF0ZVNldHRlcih0aGlzLGUpfSxjcmVhdGVTdGF0ZUtleVNl dHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gby5jcmVhdGVTdGF0ZUtleVNldHRlcih0aGlzLGUpfX0s dC5leHBvcnRzPW99LHt9XSwyNTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1l KDMyKSxvPXtnZXRDaGlsZE1hcHBpbmc6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT9yKGUpOmV9LG1l cmdlQ2hpbGRNYXBwaW5nczpmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4obil7cmV0dXJuIHQuaGFz T3duUHJvcGVydHkobik/dFtuXTplW25dfWU9ZXx8e30sdD10fHx7fTt2YXIgcj17fSxvPVtdO2Zv cih2YXIgaSBpbiBlKXQuaGFzT3duUHJvcGVydHkoaSk/by5sZW5ndGgmJihyW2ldPW8sbz1bXSk6 by5wdXNoKGkpO3ZhciBhLHM9e307Zm9yKHZhciB1IGluIHQpe2lmKHIuaGFzT3duUHJvcGVydHko dSkpZm9yKGE9MDthPHJbdV0ubGVuZ3RoO2ErKyl7dmFyIGM9clt1XVthXTtzW3JbdV1bYV1dPW4o Yyl9c1t1XT1uKHUpfWZvcihhPTA7YTxvLmxlbmd0aDthKyspc1tvW2FdXT1uKG9bYV0pO3JldHVy biBzfX07dC5leHBvcnRzPW99LHszMjozMn1dLDI2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJp Y3QiO2Z1bmN0aW9uIHIoKXt2YXIgZT1zKCJhbmltYXRpb25lbmQiKSx0PXMoInRyYW5zaXRpb25l bmQiKTtlJiZ1LnB1c2goZSksdCYmdS5wdXNoKHQpfWZ1bmN0aW9uIG8oZSx0LG4pe2UuYWRkRXZl bnRMaXN0ZW5lcih0LG4sITEpfWZ1bmN0aW9uIGkoZSx0LG4pe2UucmVtb3ZlRXZlbnRMaXN0ZW5l cih0LG4sITEpfXZhciBhPWUoNDApLHM9ZSgxKSx1PVtdO2EuY2FuVXNlRE9NJiZyKCk7dmFyIGM9 e2FkZEVuZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gMD09PXUubGVuZ3RoP3Zv aWQgd2luZG93LnNldFRpbWVvdXQodCwwKTp2b2lkIHUuZm9yRWFjaChmdW5jdGlvbihuKXtvKGUs bix0KX0pfSxyZW1vdmVFbmRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGUsdCl7MCE9PXUubGVuZ3Ro JiZ1LmZvckVhY2goZnVuY3Rpb24obil7aShlLG4sdCl9KX19O3QuZXhwb3J0cz1jfSx7MToxLDQw OjQwfV0sMjc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe2lm KCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xh c3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIG8oZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJl bmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBi ZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5 cGVvZiB0P2U6dH1mdW5jdGlvbiBpKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwh PT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUg bnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNy ZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3 cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9P YmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX12YXIgYT1lKDQ2KSxzPWUo NSksdT1lKDI1KSxjPWUoNDEpLHA9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3ZhciBuLGksczty KHRoaXMsdCk7Zm9yKHZhciBjPWFyZ3VtZW50cy5sZW5ndGgscD1BcnJheShjKSxsPTA7bDxjO2wr KylwW2xdPWFyZ3VtZW50c1tsXTtyZXR1cm4gbj1pPW8odGhpcyxlLmNhbGwuYXBwbHkoZSxbdGhp c10uY29uY2F0KHApKSksaS5zdGF0ZT17Y2hpbGRyZW46dS5nZXRDaGlsZE1hcHBpbmcoaS5wcm9w cy5jaGlsZHJlbil9LGkucGVyZm9ybUFwcGVhcj1mdW5jdGlvbihlKXtpLmN1cnJlbnRseVRyYW5z aXRpb25pbmdLZXlzW2VdPSEwO3ZhciB0PWkucmVmc1tlXTt0LmNvbXBvbmVudFdpbGxBcHBlYXI/ dC5jb21wb25lbnRXaWxsQXBwZWFyKGkuX2hhbmRsZURvbmVBcHBlYXJpbmcuYmluZChpLGUpKTpp Ll9oYW5kbGVEb25lQXBwZWFyaW5nKGUpfSxpLl9oYW5kbGVEb25lQXBwZWFyaW5nPWZ1bmN0aW9u KGUpe3ZhciB0PWkucmVmc1tlXTt0LmNvbXBvbmVudERpZEFwcGVhciYmdC5jb21wb25lbnREaWRB cHBlYXIoKSxkZWxldGUgaS5jdXJyZW50bHlUcmFuc2l0aW9uaW5nS2V5c1tlXTt2YXIgbj11Lmdl dENoaWxkTWFwcGluZyhpLnByb3BzLmNoaWxkcmVuKTtuJiZuLmhhc093blByb3BlcnR5KGUpfHxp LnBlcmZvcm1MZWF2ZShlKX0saS5wZXJmb3JtRW50ZXI9ZnVuY3Rpb24oZSl7aS5jdXJyZW50bHlU cmFuc2l0aW9uaW5nS2V5c1tlXT0hMDt2YXIgdD1pLnJlZnNbZV07dC5jb21wb25lbnRXaWxsRW50 ZXI/dC5jb21wb25lbnRXaWxsRW50ZXIoaS5faGFuZGxlRG9uZUVudGVyaW5nLmJpbmQoaSxlKSk6 aS5faGFuZGxlRG9uZUVudGVyaW5nKGUpfSxpLl9oYW5kbGVEb25lRW50ZXJpbmc9ZnVuY3Rpb24o ZSl7dmFyIHQ9aS5yZWZzW2VdO3QuY29tcG9uZW50RGlkRW50ZXImJnQuY29tcG9uZW50RGlkRW50 ZXIoKSxkZWxldGUgaS5jdXJyZW50bHlUcmFuc2l0aW9uaW5nS2V5c1tlXTt2YXIgbj11LmdldENo aWxkTWFwcGluZyhpLnByb3BzLmNoaWxkcmVuKTtuJiZuLmhhc093blByb3BlcnR5KGUpfHxpLnBl cmZvcm1MZWF2ZShlKX0saS5wZXJmb3JtTGVhdmU9ZnVuY3Rpb24oZSl7aS5jdXJyZW50bHlUcmFu c2l0aW9uaW5nS2V5c1tlXT0hMDt2YXIgdD1pLnJlZnNbZV07dC5jb21wb25lbnRXaWxsTGVhdmU/ dC5jb21wb25lbnRXaWxsTGVhdmUoaS5faGFuZGxlRG9uZUxlYXZpbmcuYmluZChpLGUpKTppLl9o YW5kbGVEb25lTGVhdmluZyhlKX0saS5faGFuZGxlRG9uZUxlYXZpbmc9ZnVuY3Rpb24oZSl7dmFy IHQ9aS5yZWZzW2VdO3QuY29tcG9uZW50RGlkTGVhdmUmJnQuY29tcG9uZW50RGlkTGVhdmUoKSxk ZWxldGUgaS5jdXJyZW50bHlUcmFuc2l0aW9uaW5nS2V5c1tlXTt2YXIgbj11LmdldENoaWxkTWFw cGluZyhpLnByb3BzLmNoaWxkcmVuKTtuJiZuLmhhc093blByb3BlcnR5KGUpP2kucGVyZm9ybUVu dGVyKGUpOmkuc2V0U3RhdGUoZnVuY3Rpb24odCl7dmFyIG49YSh7fSx0LmNoaWxkcmVuKTtyZXR1 cm4gZGVsZXRlIG5bZV0se2NoaWxkcmVuOm59fSl9LHM9bixvKGkscyl9cmV0dXJuIGkodCxlKSx0 LnByb3RvdHlwZS5jb21wb25lbnRXaWxsTW91bnQ9ZnVuY3Rpb24oKXt0aGlzLmN1cnJlbnRseVRy YW5zaXRpb25pbmdLZXlzPXt9LHRoaXMua2V5c1RvRW50ZXI9W10sdGhpcy5rZXlzVG9MZWF2ZT1b XX0sdC5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnN0 YXRlLmNoaWxkcmVuO2Zvcih2YXIgdCBpbiBlKWVbdF0mJnRoaXMucGVyZm9ybUFwcGVhcih0KX0s dC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcz1mdW5jdGlvbihlKXt2YXIgdD11 LmdldENoaWxkTWFwcGluZyhlLmNoaWxkcmVuKSxuPXRoaXMuc3RhdGUuY2hpbGRyZW47dGhpcy5z ZXRTdGF0ZSh7Y2hpbGRyZW46dS5tZXJnZUNoaWxkTWFwcGluZ3Mobix0KX0pO3ZhciByO2Zvcihy IGluIHQpe3ZhciBvPW4mJm4uaGFzT3duUHJvcGVydHkocik7IXRbcl18fG98fHRoaXMuY3VycmVu dGx5VHJhbnNpdGlvbmluZ0tleXNbcl18fHRoaXMua2V5c1RvRW50ZXIucHVzaChyKX1mb3IociBp biBuKXt2YXIgaT10JiZ0Lmhhc093blByb3BlcnR5KHIpOyFuW3JdfHxpfHx0aGlzLmN1cnJlbnRs eVRyYW5zaXRpb25pbmdLZXlzW3JdfHx0aGlzLmtleXNUb0xlYXZlLnB1c2gocil9fSx0LnByb3Rv dHlwZS5jb21wb25lbnREaWRVcGRhdGU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmtleXNUb0VudGVy O3RoaXMua2V5c1RvRW50ZXI9W10sZS5mb3JFYWNoKHRoaXMucGVyZm9ybUVudGVyKTt2YXIgdD10 aGlzLmtleXNUb0xlYXZlO3RoaXMua2V5c1RvTGVhdmU9W10sdC5mb3JFYWNoKHRoaXMucGVyZm9y bUxlYXZlKX0sdC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGU9W107Zm9yKHZhciB0 IGluIHRoaXMuc3RhdGUuY2hpbGRyZW4pe3ZhciBuPXRoaXMuc3RhdGUuY2hpbGRyZW5bdF07biYm ZS5wdXNoKHMuY2xvbmVFbGVtZW50KHRoaXMucHJvcHMuY2hpbGRGYWN0b3J5KG4pLHtyZWY6dCxr ZXk6dH0pKX12YXIgcj1hKHt9LHRoaXMucHJvcHMpO3JldHVybiBkZWxldGUgci50cmFuc2l0aW9u TGVhdmUsZGVsZXRlIHIudHJhbnNpdGlvbk5hbWUsZGVsZXRlIHIudHJhbnNpdGlvbkFwcGVhcixk ZWxldGUgci50cmFuc2l0aW9uRW50ZXIsZGVsZXRlIHIuY2hpbGRGYWN0b3J5LGRlbGV0ZSByLnRy YW5zaXRpb25MZWF2ZVRpbWVvdXQsZGVsZXRlIHIudHJhbnNpdGlvbkVudGVyVGltZW91dCxkZWxl dGUgci50cmFuc2l0aW9uQXBwZWFyVGltZW91dCxkZWxldGUgci5jb21wb25lbnQscy5jcmVhdGVF bGVtZW50KHRoaXMucHJvcHMuY29tcG9uZW50LHIsZSl9LHR9KHMuQ29tcG9uZW50KTtwLmRpc3Bs YXlOYW1lPSJSZWFjdFRyYW5zaXRpb25Hcm91cCIscC5wcm9wVHlwZXM9e2NvbXBvbmVudDpzLlBy b3BUeXBlcy5hbnksY2hpbGRGYWN0b3J5OnMuUHJvcFR5cGVzLmZ1bmN9LHAuZGVmYXVsdFByb3Bz PXtjb21wb25lbnQ6InNwYW4iLGNoaWxkRmFjdG9yeTpjLnRoYXRSZXR1cm5zQXJndW1lbnR9LHQu ZXhwb3J0cz1wfSx7MjU6MjUsNDE6NDEsNDY6NDYsNTo1fV0sMjg6W2Z1bmN0aW9uKGUsdCxuKXsi dXNlIHN0cmljdCI7dC5leHBvcnRzPSIxNS40LjIifSx7fV0sMjk6W2Z1bmN0aW9uKGUsdCxuKXsi dXNlIHN0cmljdCI7dmFyIHI9ZSgzKSxvPWUoNSksaT0oZSg2KSxlKDEyKSksYT1lKDcpLHM9ZSgx NyksdT1lKDI3KSxjPWUoMzYpLHA9ZSgzOCk7by5hZGRvbnM9e0NTU1RyYW5zaXRpb25Hcm91cDph LExpbmtlZFN0YXRlTWl4aW46cixQdXJlUmVuZGVyTWl4aW46aSxUcmFuc2l0aW9uR3JvdXA6dSxj cmVhdGVGcmFnbWVudDpzLmNyZWF0ZSxzaGFsbG93Q29tcGFyZTpjLHVwZGF0ZTpwfSx0LmV4cG9y dHM9b30sezEyOjEyLDE3OjE3LDI3OjI3LDM6MywzNjozNiwzODozOCw1OjUsNjo2LDc6N31dLDMw OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoNDYpLG89ZSgyOSksaT1yKHtf X1NFQ1JFVF9JTkpFQ1RFRF9SRUFDVF9ET01fRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJF RDpudWxsLF9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVE OntSZWFjdEN1cnJlbnRPd25lcjplKDEzKX19LG8pO3QuZXhwb3J0cz1pfSx7MTM6MTMsMjk6Mjks NDY6NDZ9XSwzMTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj0hMTt0LmV4cG9y dHM9cn0se31dLDMyOltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKG4peyJ1c2Ugc3RyaWN0Ijtm dW5jdGlvbiByKGUsdCxuLHIpe2lmKGUmJiJvYmplY3QiPT10eXBlb2YgZSl7dmFyIG89ZSxpPXZv aWQgMD09PW9bbl07aSYmbnVsbCE9dCYmKG9bbl09dCl9fWZ1bmN0aW9uIG8oZSx0KXtpZihudWxs PT1lKXJldHVybiBlO3ZhciBuPXt9O3JldHVybiBpKGUscixuKSxufXZhciBpPShlKDIpLGUoMzcp KTtlKDQ1KTsidW5kZWZpbmVkIiE9dHlwZW9mIG4mJm4uZW52LHQuZXhwb3J0cz1vfSkuY2FsbCh0 aGlzLHZvaWQgMCl9LHsyOjIsMzc6MzcsNDU6NDV9XSwzMzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ug c3RyaWN0IjtmdW5jdGlvbiByKGUpe3ZhciB0PWUmJihvJiZlW29dfHxlW2ldKTtpZigiZnVuY3Rp b24iPT10eXBlb2YgdClyZXR1cm4gdH12YXIgbz0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZT eW1ib2wuaXRlcmF0b3IsaT0iQEBpdGVyYXRvciI7dC5leHBvcnRzPXJ9LHt9XSwzNDpbZnVuY3Rp b24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBpLmlzVmFsaWRFbGVt ZW50KGUpP3ZvaWQgMDpvKCIxNDMiKSxlfXZhciBvPWUoMzUpLGk9ZSgxNSk7ZSg0Myk7dC5leHBv cnRzPXJ9LHsxNToxNSwzNTozNSw0Mzo0M31dLDM1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJp Y3QiO2Z1bmN0aW9uIHIoZSl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgtMSxuPSJNaW5pZmll ZCBSZWFjdCBlcnJvciAjIitlKyI7IHZpc2l0IGh0dHA6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVh Y3QvZG9jcy9lcnJvci1kZWNvZGVyLmh0bWw/aW52YXJpYW50PSIrZSxyPTA7cjx0O3IrKyluKz0i JmFyZ3NbXT0iK2VuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbcisxXSk7bis9IiBmb3IgdGhl IGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9y IGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuIjt2YXIgbz1uZXcg RXJyb3Iobik7dGhyb3cgby5uYW1lPSJJbnZhcmlhbnQgVmlvbGF0aW9uIixvLmZyYW1lc1RvUG9w PTEsb310LmV4cG9ydHM9cn0se31dLDM2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1 bmN0aW9uIHIoZSx0LG4pe3JldHVybiFvKGUucHJvcHMsdCl8fCFvKGUuc3RhdGUsbil9dmFyIG89 ZSg0NCk7dC5leHBvcnRzPXJ9LHs0NDo0NH1dLDM3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJp Y3QiO2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4gZSYmIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT1l LmtleT9jLmVzY2FwZShlLmtleSk6dC50b1N0cmluZygzNil9ZnVuY3Rpb24gbyhlLHQsbixpKXt2 YXIgZj10eXBlb2YgZTtpZigidW5kZWZpbmVkIiE9PWYmJiJib29sZWFuIiE9PWZ8fChlPW51bGwp LG51bGw9PT1lfHwic3RyaW5nIj09PWZ8fCJudW1iZXIiPT09Znx8Im9iamVjdCI9PT1mJiZlLiQk dHlwZW9mPT09cylyZXR1cm4gbihpLGUsIiI9PT10P3ArcihlLDApOnQpLDE7dmFyIGQsaCx2PTAs eT0iIj09PXQ/cDp0K2w7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIG09MDttPGUubGVuZ3Ro O20rKylkPWVbbV0saD15K3IoZCxtKSx2Kz1vKGQsaCxuLGkpO2Vsc2V7dmFyIGc9dShlKTtpZihn KXt2YXIgRSxiPWcuY2FsbChlKTtpZihnIT09ZS5lbnRyaWVzKWZvcih2YXIgVD0wOyEoRT1iLm5l eHQoKSkuZG9uZTspZD1FLnZhbHVlLGg9eStyKGQsVCsrKSx2Kz1vKGQsaCxuLGkpO2Vsc2UgZm9y KDshKEU9Yi5uZXh0KCkpLmRvbmU7KXt2YXIgXz1FLnZhbHVlO18mJihkPV9bMV0saD15K2MuZXNj YXBlKF9bMF0pK2wrcihkLDApLHYrPW8oZCxoLG4saSkpfX1lbHNlIGlmKCJvYmplY3QiPT09Zil7 dmFyIFA9IiIsdz1TdHJpbmcoZSk7YSgiMzEiLCJbb2JqZWN0IE9iamVjdF0iPT09dz8ib2JqZWN0 IHdpdGgga2V5cyB7IitPYmplY3Qua2V5cyhlKS5qb2luKCIsICIpKyJ9Ijp3LFApfX1yZXR1cm4g dn1mdW5jdGlvbiBpKGUsdCxuKXtyZXR1cm4gbnVsbD09ZT8wOm8oZSwiIix0LG4pfXZhciBhPWUo MzUpLHM9KGUoMTMpLGUoMTYpKSx1PWUoMzMpLGM9KGUoNDMpLGUoMikpLHA9KGUoNDUpLCIuIiks bD0iOiI7dC5leHBvcnRzPWl9LHsxMzoxMywxNjoxNiwyOjIsMzM6MzMsMzU6MzUsNDM6NDMsNDU6 NDV9XSwzODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVy biBBcnJheS5pc0FycmF5KGUpP2UuY29uY2F0KCk6ZSYmIm9iamVjdCI9PXR5cGVvZiBlP3MobmV3 IGUuY29uc3RydWN0b3IsZSk6ZX1mdW5jdGlvbiBvKGUsdCxuKXtBcnJheS5pc0FycmF5KGUpP3Zv aWQgMDphKCIxIixuLGUpO3ZhciByPXRbbl07QXJyYXkuaXNBcnJheShyKT92b2lkIDA6YSgiMiIs bixyKX1mdW5jdGlvbiBpKGUsdCl7aWYoIm9iamVjdCIhPXR5cGVvZiB0P2EoIjMiLHYuam9pbigi LCAiKSxmKTp2b2lkIDAsdS5jYWxsKHQsZikpcmV0dXJuIDEhPT1PYmplY3Qua2V5cyh0KS5sZW5n dGg/YSgiNCIsZik6dm9pZCAwLHRbZl07dmFyIG49cihlKTtpZih1LmNhbGwodCxkKSl7dmFyIG09 dFtkXTttJiYib2JqZWN0Ij09dHlwZW9mIG0/dm9pZCAwOmEoIjUiLGQsbSksbiYmIm9iamVjdCI9 PXR5cGVvZiBuP3ZvaWQgMDphKCI2IixkLG4pLHMobix0W2RdKX11LmNhbGwodCxjKSYmKG8oZSx0 LGMpLHRbY10uZm9yRWFjaChmdW5jdGlvbihlKXtuLnB1c2goZSl9KSksdS5jYWxsKHQscCkmJihv KGUsdCxwKSx0W3BdLmZvckVhY2goZnVuY3Rpb24oZSl7bi51bnNoaWZ0KGUpfSkpLHUuY2FsbCh0 LGwpJiYoQXJyYXkuaXNBcnJheShlKT92b2lkIDA6YSgiNyIsbCxlKSxBcnJheS5pc0FycmF5KHRb bF0pP3ZvaWQgMDphKCI4IixsLHRbbF0pLHRbbF0uZm9yRWFjaChmdW5jdGlvbihlKXtBcnJheS5p c0FycmF5KGUpP3ZvaWQgMDphKCI4IixsLHRbbF0pLG4uc3BsaWNlLmFwcGx5KG4sZSl9KSksdS5j YWxsKHQsaCkmJigiZnVuY3Rpb24iIT10eXBlb2YgdFtoXT9hKCI5IixoLHRbaF0pOnZvaWQgMCxu PXRbaF0obikpOworZm9yKHZhciBnIGluIHQpeS5oYXNPd25Qcm9wZXJ0eShnKSYmeVtnXXx8KG5b Z109aShlW2ddLHRbZ10pKTtyZXR1cm4gbn12YXIgYT1lKDM1KSxzPWUoNDYpLHU9KGUoNDMpLHt9 Lmhhc093blByb3BlcnR5KSxjPSIkcHVzaCIscD0iJHVuc2hpZnQiLGw9IiRzcGxpY2UiLGY9IiRz ZXQiLGQ9IiRtZXJnZSIsaD0iJGFwcGx5Iix2PVtjLHAsbCxmLGQsaF0seT17fTt2LmZvckVhY2go ZnVuY3Rpb24oZSl7eVtlXT0hMH0pLHQuZXhwb3J0cz1pfSx7MzU6MzUsNDM6NDMsNDY6NDZ9XSwz OTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7Zm9yKHZhciBu PWU7bi5wYXJlbnROb2RlOyluPW4ucGFyZW50Tm9kZTt2YXIgcj1uLnF1ZXJ5U2VsZWN0b3JBbGwo dCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwocixlKSE9PS0xfXZhciBvPWUo NDMpLGk9e2FkZENsYXNzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuL1xzLy50ZXN0KHQpP28oITEpOnZv aWQgMCx0JiYoZS5jbGFzc0xpc3Q/ZS5jbGFzc0xpc3QuYWRkKHQpOmkuaGFzQ2xhc3MoZSx0KXx8 KGUuY2xhc3NOYW1lPWUuY2xhc3NOYW1lKyIgIit0KSksZX0scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24o ZSx0KXtyZXR1cm4vXHMvLnRlc3QodCk/byghMSk6dm9pZCAwLHQmJihlLmNsYXNzTGlzdD9lLmNs YXNzTGlzdC5yZW1vdmUodCk6aS5oYXNDbGFzcyhlLHQpJiYoZS5jbGFzc05hbWU9ZS5jbGFzc05h bWUucmVwbGFjZShuZXcgUmVnRXhwKCIoXnxcXHMpIit0KyIoPzpcXHN8JCkiLCJnIiksIiQxIiku cmVwbGFjZSgvXHMrL2csIiAiKS5yZXBsYWNlKC9eXHMqfFxzKiQvZywiIikpKSxlfSxjb25kaXRp b25DbGFzczpmdW5jdGlvbihlLHQsbil7cmV0dXJuKG4/aS5hZGRDbGFzczppLnJlbW92ZUNsYXNz KShlLHQpfSxoYXNDbGFzczpmdW5jdGlvbihlLHQpe3JldHVybi9ccy8udGVzdCh0KT9vKCExKTp2 b2lkIDAsZS5jbGFzc0xpc3Q/ISF0JiZlLmNsYXNzTGlzdC5jb250YWlucyh0KTooIiAiK2UuY2xh c3NOYW1lKyIgIikuaW5kZXhPZigiICIrdCsiICIpPi0xfSxtYXRjaGVzU2VsZWN0b3I6ZnVuY3Rp b24oZSx0KXt2YXIgbj1lLm1hdGNoZXN8fGUud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxlLm1vek1h dGNoZXNTZWxlY3Rvcnx8ZS5tc01hdGNoZXNTZWxlY3Rvcnx8ZnVuY3Rpb24odCl7cmV0dXJuIHIo ZSx0KX07cmV0dXJuIG4uY2FsbChlLHQpfX07dC5leHBvcnRzPWl9LHs0Mzo0M31dLDQwOltmdW5j dGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPSEoInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5k b3d8fCF3aW5kb3cuZG9jdW1lbnR8fCF3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCksbz17 Y2FuVXNlRE9NOnIsY2FuVXNlV29ya2VyczoidW5kZWZpbmVkIiE9dHlwZW9mIFdvcmtlcixjYW5V c2VFdmVudExpc3RlbmVyczpyJiYhKCF3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciYmIXdpbmRvdy5h dHRhY2hFdmVudCksY2FuVXNlVmlld3BvcnQ6ciYmISF3aW5kb3cuc2NyZWVuLGlzSW5Xb3JrZXI6 IXJ9O3QuZXhwb3J0cz1vfSx7fV0sNDE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVu Y3Rpb24gcihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZX19dmFyIG89ZnVuY3Rpb24oKXt9 O28udGhhdFJldHVybnM9cixvLnRoYXRSZXR1cm5zRmFsc2U9cighMSksby50aGF0UmV0dXJuc1Ry dWU9cighMCksby50aGF0UmV0dXJuc051bGw9cihudWxsKSxvLnRoYXRSZXR1cm5zVGhpcz1mdW5j dGlvbigpe3JldHVybiB0aGlzfSxvLnRoYXRSZXR1cm5zQXJndW1lbnQ9ZnVuY3Rpb24oZSl7cmV0 dXJuIGV9LHQuZXhwb3J0cz1vfSx7fV0sNDI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7 dmFyIHI9e307dC5leHBvcnRzPXJ9LHt9XSw0MzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0 IjtmdW5jdGlvbiByKGUsdCxuLHIsaSxhLHMsdSl7aWYobyh0KSwhZSl7dmFyIGM7aWYodm9pZCAw PT09dCljPW5ldyBFcnJvcigiTWluaWZpZWQgZXhjZXB0aW9uIG9jY3VycmVkOyB1c2UgdGhlIG5v bi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIHRoZSBmdWxsIGVycm9yIG1lc3NhZ2UgYW5k IGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4iKTtlbHNle3ZhciBwPVtuLHIsaSxhLHMsdV0s bD0wO2M9bmV3IEVycm9yKHQucmVwbGFjZSgvJXMvZyxmdW5jdGlvbigpe3JldHVybiBwW2wrK119 KSksYy5uYW1lPSJJbnZhcmlhbnQgVmlvbGF0aW9uIn10aHJvdyBjLmZyYW1lc1RvUG9wPTEsY319 dmFyIG89ZnVuY3Rpb24oZSl7fTt0LmV4cG9ydHM9cn0se31dLDQ0OltmdW5jdGlvbihlLHQsbil7 InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4gZT09PXQ/MCE9PWV8fDAhPT10fHwx L2U9PT0xL3Q6ZSE9PWUmJnQhPT10fWZ1bmN0aW9uIG8oZSx0KXtpZihyKGUsdCkpcmV0dXJuITA7 aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZXx8Im9iamVjdCIhPXR5cGVvZiB0fHxudWxs PT09dClyZXR1cm4hMTt2YXIgbj1PYmplY3Qua2V5cyhlKSxvPU9iamVjdC5rZXlzKHQpO2lmKG4u bGVuZ3RoIT09by5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBhPTA7YTxuLmxlbmd0aDthKyspaWYo IWkuY2FsbCh0LG5bYV0pfHwhcihlW25bYV1dLHRbblthXV0pKXJldHVybiExO3JldHVybiEwfXZh ciBpPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPW99LHt9XSw0NTpb ZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDQxKSxvPXI7dC5leHBvcnRzPW99 LHs0MTo0MX1dLDQ2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7 aWYobnVsbD09PWV8fHZvaWQgMD09PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0LmFzc2ln biBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQiKTtyZXR1cm4gT2JqZWN0 KGUpfWZ1bmN0aW9uIG8oKXt0cnl7aWYoIU9iamVjdC5hc3NpZ24pcmV0dXJuITE7dmFyIGU9bmV3 IFN0cmluZygiYWJjIik7aWYoZVs1XT0iZGUiLCI1Ij09PU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5h bWVzKGUpWzBdKXJldHVybiExO2Zvcih2YXIgdD17fSxuPTA7bjwxMDtuKyspdFsiXyIrU3RyaW5n LmZyb21DaGFyQ29kZShuKV09bjt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KS5t YXAoZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19KTtpZigiMDEyMzQ1Njc4OSIhPT1yLmpvaW4oIiIp KXJldHVybiExO3ZhciBvPXt9O3JldHVybiJhYmNkZWZnaGlqa2xtbm9wcXJzdCIuc3BsaXQoIiIp LmZvckVhY2goZnVuY3Rpb24oZSl7b1tlXT1lfSksImFiY2RlZmdoaWprbG1ub3BxcnN0Ij09PU9i amVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sbykpLmpvaW4oIiIpfWNhdGNoKGUpe3JldHVybiEx fX12YXIgaT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGE9T2JqZWN0LnByb3RvdHlw ZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt0LmV4cG9ydHM9bygpP09iamVjdC5hc3NpZ246ZnVuY3Rp b24oZSx0KXtmb3IodmFyIG4sbyxzPXIoZSksdT0xO3U8YXJndW1lbnRzLmxlbmd0aDt1Kyspe249 T2JqZWN0KGFyZ3VtZW50c1t1XSk7Zm9yKHZhciBjIGluIG4paS5jYWxsKG4sYykmJihzW2NdPW5b Y10pO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe289T2JqZWN0LmdldE93blByb3Bl cnR5U3ltYm9scyhuKTtmb3IodmFyIHA9MDtwPG8ubGVuZ3RoO3ArKylhLmNhbGwobixvW3BdKSYm KHNbb1twXV09bltvW3BdXSl9fXJldHVybiBzfX0se31dfSx7fSxbMzBdKSgzMCl9KTsKXCBObyBu ZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVu ZG9yL3JlYWN0L2Rpc3QvcmVhY3QuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0 L2Rpc3QvcmVhY3QuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLmIwM2Nj YjcyCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9k aXN0L3JlYWN0LmpzCkBAIC0wLDAgKzEsMzc1NyBAQAorIC8qKgorICAqIFJlYWN0IHYxNS40LjIK KyAgKi8KKyhmdW5jdGlvbihmKXtpZih0eXBlb2YgZXhwb3J0cz09PSJvYmplY3QiJiZ0eXBlb2Yg bW9kdWxlIT09InVuZGVmaW5lZCIpe21vZHVsZS5leHBvcnRzPWYoKX1lbHNlIGlmKHR5cGVvZiBk ZWZpbmU9PT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kKXtkZWZpbmUoW10sZil9ZWxzZXt2YXIgZztp Zih0eXBlb2Ygd2luZG93IT09InVuZGVmaW5lZCIpe2c9d2luZG93fWVsc2UgaWYodHlwZW9mIGds b2JhbCE9PSJ1bmRlZmluZWQiKXtnPWdsb2JhbH1lbHNlIGlmKHR5cGVvZiBzZWxmIT09InVuZGVm aW5lZCIpe2c9c2VsZn1lbHNle2c9dGhpc31nLlJlYWN0ID0gZigpfX0pKGZ1bmN0aW9uKCl7dmFy IGRlZmluZSxtb2R1bGUsZXhwb3J0cztyZXR1cm4gKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9u IHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rp b24iJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7 dmFyIGY9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrbysiJyIpO3Rocm93IGYuY29k ZT0iTU9EVUxFX05PVF9GT1VORCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNh bGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUp fSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiBy ZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMo cltvXSk7cmV0dXJuIHN9KSh7MTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7Cisv KioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmln aHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIg dGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRo ZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50 CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGlu IHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisKKy8q KgorICogRXNjYXBlIGFuZCB3cmFwIGtleSBzbyBpdCBpcyBzYWZlIHRvIHVzZSBhcyBhIHJlYWN0 aWQKKyAqCisgKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRvIGJlIGVzY2FwZWQuCisgKiBAcmV0dXJu IHtzdHJpbmd9IHRoZSBlc2NhcGVkIGtleS4KKyAqLworCitmdW5jdGlvbiBlc2NhcGUoa2V5KSB7 CisgIHZhciBlc2NhcGVSZWdleCA9IC9bPTpdL2c7CisgIHZhciBlc2NhcGVyTG9va3VwID0gewor ICAgICc9JzogJz0wJywKKyAgICAnOic6ICc9MicKKyAgfTsKKyAgdmFyIGVzY2FwZWRTdHJpbmcg PSAoJycgKyBrZXkpLnJlcGxhY2UoZXNjYXBlUmVnZXgsIGZ1bmN0aW9uIChtYXRjaCkgeworICAg IHJldHVybiBlc2NhcGVyTG9va3VwW21hdGNoXTsKKyAgfSk7CisKKyAgcmV0dXJuICckJyArIGVz Y2FwZWRTdHJpbmc7Cit9CisKKy8qKgorICogVW5lc2NhcGUgYW5kIHVud3JhcCBrZXkgZm9yIGh1 bWFuLXJlYWRhYmxlIGRpc3BsYXkKKyAqCisgKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRvIHVuZXNj YXBlLgorICogQHJldHVybiB7c3RyaW5nfSB0aGUgdW5lc2NhcGVkIGtleS4KKyAqLworZnVuY3Rp b24gdW5lc2NhcGUoa2V5KSB7CisgIHZhciB1bmVzY2FwZVJlZ2V4ID0gLyg9MHw9MikvZzsKKyAg dmFyIHVuZXNjYXBlckxvb2t1cCA9IHsKKyAgICAnPTAnOiAnPScsCisgICAgJz0yJzogJzonCisg IH07CisgIHZhciBrZXlTdWJzdHJpbmcgPSBrZXlbMF0gPT09ICcuJyAmJiBrZXlbMV0gPT09ICck JyA/IGtleS5zdWJzdHJpbmcoMikgOiBrZXkuc3Vic3RyaW5nKDEpOworCisgIHJldHVybiAoJycg KyBrZXlTdWJzdHJpbmcpLnJlcGxhY2UodW5lc2NhcGVSZWdleCwgZnVuY3Rpb24gKG1hdGNoKSB7 CisgICAgcmV0dXJuIHVuZXNjYXBlckxvb2t1cFttYXRjaF07CisgIH0pOworfQorCit2YXIgS2V5 RXNjYXBlVXRpbHMgPSB7CisgIGVzY2FwZTogZXNjYXBlLAorICB1bmVzY2FwZTogdW5lc2NhcGUK K307CisKK21vZHVsZS5leHBvcnRzID0gS2V5RXNjYXBlVXRpbHM7Cit9LHt9XSwyOltmdW5jdGlv bihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2Vu dCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBz b3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQg aW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291 cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJl IGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAq IAorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9wcm9kSW52YXJpYW50ID0gX2RlcmVxXygy NCk7CisKK3ZhciBpbnZhcmlhbnQgPSBfZGVyZXFfKDI4KTsKKworLyoqCisgKiBTdGF0aWMgcG9v bGVycy4gU2V2ZXJhbCBjdXN0b20gdmVyc2lvbnMgZm9yIGVhY2ggcG90ZW50aWFsIG51bWJlciBv ZgorICogYXJndW1lbnRzLiBBIGNvbXBsZXRlbHkgZ2VuZXJpYyBwb29sZXIgaXMgZWFzeSB0byBp bXBsZW1lbnQsIGJ1dCB3b3VsZAorICogcmVxdWlyZSBhY2Nlc3NpbmcgdGhlIGBhcmd1bWVudHNg IG9iamVjdC4gSW4gZWFjaCBvZiB0aGVzZSwgYHRoaXNgIHJlZmVycyB0bworICogdGhlIENsYXNz IGl0c2VsZiwgbm90IGFuIGluc3RhbmNlLiBJZiBhbnkgb3RoZXJzIGFyZSBuZWVkZWQsIHNpbXBs eSBhZGQgdGhlbQorICogaGVyZSwgb3IgaW4gdGhlaXIgb3duIGZpbGVzLgorICovCit2YXIgb25l QXJndW1lbnRQb29sZXIgPSBmdW5jdGlvbiAoY29weUZpZWxkc0Zyb20pIHsKKyAgdmFyIEtsYXNz ID0gdGhpczsKKyAgaWYgKEtsYXNzLmluc3RhbmNlUG9vbC5sZW5ndGgpIHsKKyAgICB2YXIgaW5z dGFuY2UgPSBLbGFzcy5pbnN0YW5jZVBvb2wucG9wKCk7CisgICAgS2xhc3MuY2FsbChpbnN0YW5j ZSwgY29weUZpZWxkc0Zyb20pOworICAgIHJldHVybiBpbnN0YW5jZTsKKyAgfSBlbHNlIHsKKyAg ICByZXR1cm4gbmV3IEtsYXNzKGNvcHlGaWVsZHNGcm9tKTsKKyAgfQorfTsKKwordmFyIHR3b0Fy Z3VtZW50UG9vbGVyID0gZnVuY3Rpb24gKGExLCBhMikgeworICB2YXIgS2xhc3MgPSB0aGlzOwor ICBpZiAoS2xhc3MuaW5zdGFuY2VQb29sLmxlbmd0aCkgeworICAgIHZhciBpbnN0YW5jZSA9IEts YXNzLmluc3RhbmNlUG9vbC5wb3AoKTsKKyAgICBLbGFzcy5jYWxsKGluc3RhbmNlLCBhMSwgYTIp OworICAgIHJldHVybiBpbnN0YW5jZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbmV3IEtsYXNz KGExLCBhMik7CisgIH0KK307CisKK3ZhciB0aHJlZUFyZ3VtZW50UG9vbGVyID0gZnVuY3Rpb24g KGExLCBhMiwgYTMpIHsKKyAgdmFyIEtsYXNzID0gdGhpczsKKyAgaWYgKEtsYXNzLmluc3RhbmNl UG9vbC5sZW5ndGgpIHsKKyAgICB2YXIgaW5zdGFuY2UgPSBLbGFzcy5pbnN0YW5jZVBvb2wucG9w KCk7CisgICAgS2xhc3MuY2FsbChpbnN0YW5jZSwgYTEsIGEyLCBhMyk7CisgICAgcmV0dXJuIGlu c3RhbmNlOworICB9IGVsc2UgeworICAgIHJldHVybiBuZXcgS2xhc3MoYTEsIGEyLCBhMyk7Cisg IH0KK307CisKK3ZhciBmb3VyQXJndW1lbnRQb29sZXIgPSBmdW5jdGlvbiAoYTEsIGEyLCBhMywg YTQpIHsKKyAgdmFyIEtsYXNzID0gdGhpczsKKyAgaWYgKEtsYXNzLmluc3RhbmNlUG9vbC5sZW5n dGgpIHsKKyAgICB2YXIgaW5zdGFuY2UgPSBLbGFzcy5pbnN0YW5jZVBvb2wucG9wKCk7CisgICAg S2xhc3MuY2FsbChpbnN0YW5jZSwgYTEsIGEyLCBhMywgYTQpOworICAgIHJldHVybiBpbnN0YW5j ZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbmV3IEtsYXNzKGExLCBhMiwgYTMsIGE0KTsKKyAg fQorfTsKKwordmFyIHN0YW5kYXJkUmVsZWFzZXIgPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKKyAg dmFyIEtsYXNzID0gdGhpczsKKyAgIShpbnN0YW5jZSBpbnN0YW5jZW9mIEtsYXNzKSA/ICJkZXZl bG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1RyeWluZyB0byBy ZWxlYXNlIGFuIGluc3RhbmNlIGludG8gYSBwb29sIG9mIGEgZGlmZmVyZW50IHR5cGUuJykgOiBf cHJvZEludmFyaWFudCgnMjUnKSA6IHZvaWQgMDsKKyAgaW5zdGFuY2UuZGVzdHJ1Y3RvcigpOwor ICBpZiAoS2xhc3MuaW5zdGFuY2VQb29sLmxlbmd0aCA8IEtsYXNzLnBvb2xTaXplKSB7CisgICAg S2xhc3MuaW5zdGFuY2VQb29sLnB1c2goaW5zdGFuY2UpOworICB9Cit9OworCit2YXIgREVGQVVM VF9QT09MX1NJWkUgPSAxMDsKK3ZhciBERUZBVUxUX1BPT0xFUiA9IG9uZUFyZ3VtZW50UG9vbGVy OworCisvKioKKyAqIEF1Z21lbnRzIGBDb3B5Q29uc3RydWN0b3JgIHRvIGJlIGEgcG9vbGFibGUg Y2xhc3MsIGF1Z21lbnRpbmcgb25seSB0aGUgY2xhc3MKKyAqIGl0c2VsZiAoc3RhdGljYWxseSkg bm90IGFkZGluZyBhbnkgcHJvdG90eXBpY2FsIGZpZWxkcy4gQW55IENvcHlDb25zdHJ1Y3Rvcgor ICogeW91IGdpdmUgdGhpcyBtYXkgaGF2ZSBhIGBwb29sU2l6ZWAgcHJvcGVydHksIGFuZCB3aWxs IGxvb2sgZm9yIGEKKyAqIHByb3RvdHlwaWNhbCBgZGVzdHJ1Y3RvcmAgb24gaW5zdGFuY2VzLgor ICoKKyAqIEBwYXJhbSB7RnVuY3Rpb259IENvcHlDb25zdHJ1Y3RvciBDb25zdHJ1Y3RvciB0aGF0 IGNhbiBiZSB1c2VkIHRvIHJlc2V0LgorICogQHBhcmFtIHtGdW5jdGlvbn0gcG9vbGVyIEN1c3Rv bWl6YWJsZSBwb29sZXIuCisgKi8KK3ZhciBhZGRQb29saW5nVG8gPSBmdW5jdGlvbiAoQ29weUNv bnN0cnVjdG9yLCBwb29sZXIpIHsKKyAgLy8gQ2FzdGluZyBhcyBhbnkgc28gdGhhdCBmbG93IGln bm9yZXMgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBhbmQgdHJ1c3RzCisgIC8vIGl0IHRvIG1h dGNoIHRoZSB0eXBlIHdlIGRlY2xhcmVkCisgIHZhciBOZXdLbGFzcyA9IENvcHlDb25zdHJ1Y3Rv cjsKKyAgTmV3S2xhc3MuaW5zdGFuY2VQb29sID0gW107CisgIE5ld0tsYXNzLmdldFBvb2xlZCA9 IHBvb2xlciB8fCBERUZBVUxUX1BPT0xFUjsKKyAgaWYgKCFOZXdLbGFzcy5wb29sU2l6ZSkgewor ICAgIE5ld0tsYXNzLnBvb2xTaXplID0gREVGQVVMVF9QT09MX1NJWkU7CisgIH0KKyAgTmV3S2xh c3MucmVsZWFzZSA9IHN0YW5kYXJkUmVsZWFzZXI7CisgIHJldHVybiBOZXdLbGFzczsKK307CisK K3ZhciBQb29sZWRDbGFzcyA9IHsKKyAgYWRkUG9vbGluZ1RvOiBhZGRQb29saW5nVG8sCisgIG9u ZUFyZ3VtZW50UG9vbGVyOiBvbmVBcmd1bWVudFBvb2xlciwKKyAgdHdvQXJndW1lbnRQb29sZXI6 IHR3b0FyZ3VtZW50UG9vbGVyLAorICB0aHJlZUFyZ3VtZW50UG9vbGVyOiB0aHJlZUFyZ3VtZW50 UG9vbGVyLAorICBmb3VyQXJndW1lbnRQb29sZXI6IGZvdXJBcmd1bWVudFBvb2xlcgorfTsKKwor bW9kdWxlLmV4cG9ydHMgPSBQb29sZWRDbGFzczsKK30seyIyNCI6MjQsIjI4IjoyOH1dLDM6W2Z1 bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1w cmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBU aGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBm b3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhp cyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBj YW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisg KgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9hc3NpZ24gPSBfZGVyZXFfKDMwKTsKKwor dmFyIFJlYWN0Q2hpbGRyZW4gPSBfZGVyZXFfKDQpOwordmFyIFJlYWN0Q29tcG9uZW50ID0gX2Rl cmVxXyg2KTsKK3ZhciBSZWFjdFB1cmVDb21wb25lbnQgPSBfZGVyZXFfKDE3KTsKK3ZhciBSZWFj dENsYXNzID0gX2RlcmVxXyg1KTsKK3ZhciBSZWFjdERPTUZhY3RvcmllcyA9IF9kZXJlcV8oOSk7 Cit2YXIgUmVhY3RFbGVtZW50ID0gX2RlcmVxXygxMCk7Cit2YXIgUmVhY3RQcm9wVHlwZXMgPSBf ZGVyZXFfKDE1KTsKK3ZhciBSZWFjdFZlcnNpb24gPSBfZGVyZXFfKDE5KTsKKwordmFyIG9ubHlD aGlsZCA9IF9kZXJlcV8oMjMpOwordmFyIHdhcm5pbmcgPSBfZGVyZXFfKDI5KTsKKwordmFyIGNy ZWF0ZUVsZW1lbnQgPSBSZWFjdEVsZW1lbnQuY3JlYXRlRWxlbWVudDsKK3ZhciBjcmVhdGVGYWN0 b3J5ID0gUmVhY3RFbGVtZW50LmNyZWF0ZUZhY3Rvcnk7Cit2YXIgY2xvbmVFbGVtZW50ID0gUmVh Y3RFbGVtZW50LmNsb25lRWxlbWVudDsKKworaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0 aW9uJykgeworICB2YXIgUmVhY3RFbGVtZW50VmFsaWRhdG9yID0gX2RlcmVxXygxMik7CisgIGNy ZWF0ZUVsZW1lbnQgPSBSZWFjdEVsZW1lbnRWYWxpZGF0b3IuY3JlYXRlRWxlbWVudDsKKyAgY3Jl YXRlRmFjdG9yeSA9IFJlYWN0RWxlbWVudFZhbGlkYXRvci5jcmVhdGVGYWN0b3J5OworICBjbG9u ZUVsZW1lbnQgPSBSZWFjdEVsZW1lbnRWYWxpZGF0b3IuY2xvbmVFbGVtZW50OworfQorCit2YXIg X19zcHJlYWQgPSBfYXNzaWduOworCitpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24n KSB7CisgIHZhciB3YXJuZWQgPSBmYWxzZTsKKyAgX19zcHJlYWQgPSBmdW5jdGlvbiAoKSB7Cisg ICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyh3YXJuZWQsICdSZWFj dC5fX3NwcmVhZCBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQuIFVzZSAnICsg J09iamVjdC5hc3NpZ24gZGlyZWN0bHkgb3IgYW5vdGhlciBoZWxwZXIgZnVuY3Rpb24gd2l0aCBz aW1pbGFyICcgKyAnc2VtYW50aWNzLiBZb3UgbWF5IGJlIHNlZWluZyB0aGlzIHdhcm5pbmcgZHVl IHRvIHlvdXIgY29tcGlsZXIuICcgKyAnU2VlIGh0dHBzOi8vZmIubWUvcmVhY3Qtc3ByZWFkLWRl cHJlY2F0aW9uIGZvciBtb3JlIGRldGFpbHMuJykgOiB2b2lkIDA7CisgICAgd2FybmVkID0gdHJ1 ZTsKKyAgICByZXR1cm4gX2Fzc2lnbi5hcHBseShudWxsLCBhcmd1bWVudHMpOworICB9OworfQor Cit2YXIgUmVhY3QgPSB7CisKKyAgLy8gTW9kZXJuCisKKyAgQ2hpbGRyZW46IHsKKyAgICBtYXA6 IFJlYWN0Q2hpbGRyZW4ubWFwLAorICAgIGZvckVhY2g6IFJlYWN0Q2hpbGRyZW4uZm9yRWFjaCwK KyAgICBjb3VudDogUmVhY3RDaGlsZHJlbi5jb3VudCwKKyAgICB0b0FycmF5OiBSZWFjdENoaWxk cmVuLnRvQXJyYXksCisgICAgb25seTogb25seUNoaWxkCisgIH0sCisKKyAgQ29tcG9uZW50OiBS ZWFjdENvbXBvbmVudCwKKyAgUHVyZUNvbXBvbmVudDogUmVhY3RQdXJlQ29tcG9uZW50LAorCisg IGNyZWF0ZUVsZW1lbnQ6IGNyZWF0ZUVsZW1lbnQsCisgIGNsb25lRWxlbWVudDogY2xvbmVFbGVt ZW50LAorICBpc1ZhbGlkRWxlbWVudDogUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50LAorCisg IC8vIENsYXNzaWMKKworICBQcm9wVHlwZXM6IFJlYWN0UHJvcFR5cGVzLAorICBjcmVhdGVDbGFz czogUmVhY3RDbGFzcy5jcmVhdGVDbGFzcywKKyAgY3JlYXRlRmFjdG9yeTogY3JlYXRlRmFjdG9y eSwKKyAgY3JlYXRlTWl4aW46IGZ1bmN0aW9uIChtaXhpbikgeworICAgIC8vIEN1cnJlbnRseSBh IG5vb3AuIFdpbGwgYmUgdXNlZCB0byB2YWxpZGF0ZSBhbmQgdHJhY2UgbWl4aW5zLgorICAgIHJl dHVybiBtaXhpbjsKKyAgfSwKKworICAvLyBUaGlzIGxvb2tzIERPTSBzcGVjaWZpYyBidXQgdGhl c2UgYXJlIGFjdHVhbGx5IGlzb21vcnBoaWMgaGVscGVycworICAvLyBzaW5jZSB0aGV5IGFyZSBq dXN0IGdlbmVyYXRpbmcgRE9NIHN0cmluZ3MuCisgIERPTTogUmVhY3RET01GYWN0b3JpZXMsCisK KyAgdmVyc2lvbjogUmVhY3RWZXJzaW9uLAorCisgIC8vIERlcHJlY2F0ZWQgaG9vayBmb3IgSlNY IHNwcmVhZCwgZG9uJ3QgdXNlIHRoaXMgZm9yIGFueXRoaW5nLgorICBfX3NwcmVhZDogX19zcHJl YWQKK307CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3Q7Cit9LHsiMTAiOjEwLCIxMiI6MTIsIjE1 IjoxNSwiMTciOjE3LCIxOSI6MTksIjIzIjoyMywiMjkiOjI5LCIzMCI6MzAsIjQiOjQsIjUiOjUs IjYiOjYsIjkiOjl9XSw0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgor ICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMg cmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUg QlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJv b3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAq IG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhl IHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBQb29sZWRD bGFzcyA9IF9kZXJlcV8oMik7Cit2YXIgUmVhY3RFbGVtZW50ID0gX2RlcmVxXygxMCk7CisKK3Zh ciBlbXB0eUZ1bmN0aW9uID0gX2RlcmVxXygyNik7Cit2YXIgdHJhdmVyc2VBbGxDaGlsZHJlbiA9 IF9kZXJlcV8oMjUpOworCit2YXIgdHdvQXJndW1lbnRQb29sZXIgPSBQb29sZWRDbGFzcy50d29B cmd1bWVudFBvb2xlcjsKK3ZhciBmb3VyQXJndW1lbnRQb29sZXIgPSBQb29sZWRDbGFzcy5mb3Vy QXJndW1lbnRQb29sZXI7CisKK3ZhciB1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCA9IC9cLysv ZzsKK2Z1bmN0aW9uIGVzY2FwZVVzZXJQcm92aWRlZEtleSh0ZXh0KSB7CisgIHJldHVybiAoJycg KyB0ZXh0KS5yZXBsYWNlKHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4LCAnJCYvJyk7Cit9CisK Ky8qKgorICogUG9vbGVkQ2xhc3MgcmVwcmVzZW50aW5nIHRoZSBib29ra2VlcGluZyBhc3NvY2lh dGVkIHdpdGggcGVyZm9ybWluZyBhIGNoaWxkCisgKiB0cmF2ZXJzYWwuIEFsbG93cyBhdm9pZGlu ZyBiaW5kaW5nIGNhbGxiYWNrcy4KKyAqCisgKiBAY29uc3RydWN0b3IgRm9yRWFjaEJvb2tLZWVw aW5nCisgKiBAcGFyYW0geyFmdW5jdGlvbn0gZm9yRWFjaEZ1bmN0aW9uIEZ1bmN0aW9uIHRvIHBl cmZvcm0gdHJhdmVyc2FsIHdpdGguCisgKiBAcGFyYW0gez8qfSBmb3JFYWNoQ29udGV4dCBDb250 ZXh0IHRvIHBlcmZvcm0gY29udGV4dCB3aXRoLgorICovCitmdW5jdGlvbiBGb3JFYWNoQm9va0tl ZXBpbmcoZm9yRWFjaEZ1bmN0aW9uLCBmb3JFYWNoQ29udGV4dCkgeworICB0aGlzLmZ1bmMgPSBm b3JFYWNoRnVuY3Rpb247CisgIHRoaXMuY29udGV4dCA9IGZvckVhY2hDb250ZXh0OworICB0aGlz LmNvdW50ID0gMDsKK30KK0ZvckVhY2hCb29rS2VlcGluZy5wcm90b3R5cGUuZGVzdHJ1Y3RvciA9 IGZ1bmN0aW9uICgpIHsKKyAgdGhpcy5mdW5jID0gbnVsbDsKKyAgdGhpcy5jb250ZXh0ID0gbnVs bDsKKyAgdGhpcy5jb3VudCA9IDA7Cit9OworUG9vbGVkQ2xhc3MuYWRkUG9vbGluZ1RvKEZvckVh Y2hCb29rS2VlcGluZywgdHdvQXJndW1lbnRQb29sZXIpOworCitmdW5jdGlvbiBmb3JFYWNoU2lu Z2xlQ2hpbGQoYm9va0tlZXBpbmcsIGNoaWxkLCBuYW1lKSB7CisgIHZhciBmdW5jID0gYm9va0tl ZXBpbmcuZnVuYywKKyAgICAgIGNvbnRleHQgPSBib29rS2VlcGluZy5jb250ZXh0OworCisgIGZ1 bmMuY2FsbChjb250ZXh0LCBjaGlsZCwgYm9va0tlZXBpbmcuY291bnQrKyk7Cit9CisKKy8qKgor ICogSXRlcmF0ZXMgdGhyb3VnaCBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVk IGFzIGBwcm9wcy5jaGlsZHJlbmAuCisgKgorICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHVi LmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNoaWxkcmVuLmZvcmVhY2gK KyAqCisgKiBUaGUgcHJvdmlkZWQgZm9yRWFjaEZ1bmMoY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNh bGxlZCBmb3IgZWFjaAorICogbGVhZiBjaGlsZC4KKyAqCisgKiBAcGFyYW0gez8qfSBjaGlsZHJl biBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci4KKyAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0g Zm9yRWFjaEZ1bmMKKyAqIEBwYXJhbSB7Kn0gZm9yRWFjaENvbnRleHQgQ29udGV4dCBmb3IgZm9y RWFjaENvbnRleHQuCisgKi8KK2Z1bmN0aW9uIGZvckVhY2hDaGlsZHJlbihjaGlsZHJlbiwgZm9y RWFjaEZ1bmMsIGZvckVhY2hDb250ZXh0KSB7CisgIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7Cisg ICAgcmV0dXJuIGNoaWxkcmVuOworICB9CisgIHZhciB0cmF2ZXJzZUNvbnRleHQgPSBGb3JFYWNo Qm9va0tlZXBpbmcuZ2V0UG9vbGVkKGZvckVhY2hGdW5jLCBmb3JFYWNoQ29udGV4dCk7CisgIHRy YXZlcnNlQWxsQ2hpbGRyZW4oY2hpbGRyZW4sIGZvckVhY2hTaW5nbGVDaGlsZCwgdHJhdmVyc2VD b250ZXh0KTsKKyAgRm9yRWFjaEJvb2tLZWVwaW5nLnJlbGVhc2UodHJhdmVyc2VDb250ZXh0KTsK K30KKworLyoqCisgKiBQb29sZWRDbGFzcyByZXByZXNlbnRpbmcgdGhlIGJvb2trZWVwaW5nIGFz c29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIGEgY2hpbGQKKyAqIG1hcHBpbmcuIEFsbG93cyBhdm9p ZGluZyBiaW5kaW5nIGNhbGxiYWNrcy4KKyAqCisgKiBAY29uc3RydWN0b3IgTWFwQm9va0tlZXBp bmcKKyAqIEBwYXJhbSB7ISp9IG1hcFJlc3VsdCBPYmplY3QgY29udGFpbmluZyB0aGUgb3JkZXJl ZCBtYXAgb2YgcmVzdWx0cy4KKyAqIEBwYXJhbSB7IWZ1bmN0aW9ufSBtYXBGdW5jdGlvbiBGdW5j dGlvbiB0byBwZXJmb3JtIG1hcHBpbmcgd2l0aC4KKyAqIEBwYXJhbSB7Pyp9IG1hcENvbnRleHQg Q29udGV4dCB0byBwZXJmb3JtIG1hcHBpbmcgd2l0aC4KKyAqLworZnVuY3Rpb24gTWFwQm9va0tl ZXBpbmcobWFwUmVzdWx0LCBrZXlQcmVmaXgsIG1hcEZ1bmN0aW9uLCBtYXBDb250ZXh0KSB7Cisg IHRoaXMucmVzdWx0ID0gbWFwUmVzdWx0OworICB0aGlzLmtleVByZWZpeCA9IGtleVByZWZpeDsK KyAgdGhpcy5mdW5jID0gbWFwRnVuY3Rpb247CisgIHRoaXMuY29udGV4dCA9IG1hcENvbnRleHQ7 CisgIHRoaXMuY291bnQgPSAwOworfQorTWFwQm9va0tlZXBpbmcucHJvdG90eXBlLmRlc3RydWN0 b3IgPSBmdW5jdGlvbiAoKSB7CisgIHRoaXMucmVzdWx0ID0gbnVsbDsKKyAgdGhpcy5rZXlQcmVm aXggPSBudWxsOworICB0aGlzLmZ1bmMgPSBudWxsOworICB0aGlzLmNvbnRleHQgPSBudWxsOwor ICB0aGlzLmNvdW50ID0gMDsKK307CitQb29sZWRDbGFzcy5hZGRQb29saW5nVG8oTWFwQm9va0tl ZXBpbmcsIGZvdXJBcmd1bWVudFBvb2xlcik7CisKK2Z1bmN0aW9uIG1hcFNpbmdsZUNoaWxkSW50 b0NvbnRleHQoYm9va0tlZXBpbmcsIGNoaWxkLCBjaGlsZEtleSkgeworICB2YXIgcmVzdWx0ID0g Ym9va0tlZXBpbmcucmVzdWx0LAorICAgICAga2V5UHJlZml4ID0gYm9va0tlZXBpbmcua2V5UHJl Zml4LAorICAgICAgZnVuYyA9IGJvb2tLZWVwaW5nLmZ1bmMsCisgICAgICBjb250ZXh0ID0gYm9v a0tlZXBpbmcuY29udGV4dDsKKworCisgIHZhciBtYXBwZWRDaGlsZCA9IGZ1bmMuY2FsbChjb250 ZXh0LCBjaGlsZCwgYm9va0tlZXBpbmcuY291bnQrKyk7CisgIGlmIChBcnJheS5pc0FycmF5KG1h cHBlZENoaWxkKSkgeworICAgIG1hcEludG9XaXRoS2V5UHJlZml4SW50ZXJuYWwobWFwcGVkQ2hp bGQsIHJlc3VsdCwgY2hpbGRLZXksIGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNBcmd1bWVudCk7 CisgIH0gZWxzZSBpZiAobWFwcGVkQ2hpbGQgIT0gbnVsbCkgeworICAgIGlmIChSZWFjdEVsZW1l bnQuaXNWYWxpZEVsZW1lbnQobWFwcGVkQ2hpbGQpKSB7CisgICAgICBtYXBwZWRDaGlsZCA9IFJl YWN0RWxlbWVudC5jbG9uZUFuZFJlcGxhY2VLZXkobWFwcGVkQ2hpbGQsCisgICAgICAvLyBLZWVw IGJvdGggdGhlIChtYXBwZWQpIGFuZCBvbGQga2V5cyBpZiB0aGV5IGRpZmZlciwganVzdCBhcwor ICAgICAgLy8gdHJhdmVyc2VBbGxDaGlsZHJlbiB1c2VkIHRvIGRvIGZvciBvYmplY3RzIGFzIGNo aWxkcmVuCisgICAgICBrZXlQcmVmaXggKyAobWFwcGVkQ2hpbGQua2V5ICYmICghY2hpbGQgfHwg Y2hpbGQua2V5ICE9PSBtYXBwZWRDaGlsZC5rZXkpID8gZXNjYXBlVXNlclByb3ZpZGVkS2V5KG1h cHBlZENoaWxkLmtleSkgKyAnLycgOiAnJykgKyBjaGlsZEtleSk7CisgICAgfQorICAgIHJlc3Vs dC5wdXNoKG1hcHBlZENoaWxkKTsKKyAgfQorfQorCitmdW5jdGlvbiBtYXBJbnRvV2l0aEtleVBy ZWZpeEludGVybmFsKGNoaWxkcmVuLCBhcnJheSwgcHJlZml4LCBmdW5jLCBjb250ZXh0KSB7Cisg IHZhciBlc2NhcGVkUHJlZml4ID0gJyc7CisgIGlmIChwcmVmaXggIT0gbnVsbCkgeworICAgIGVz Y2FwZWRQcmVmaXggPSBlc2NhcGVVc2VyUHJvdmlkZWRLZXkocHJlZml4KSArICcvJzsKKyAgfQor ICB2YXIgdHJhdmVyc2VDb250ZXh0ID0gTWFwQm9va0tlZXBpbmcuZ2V0UG9vbGVkKGFycmF5LCBl c2NhcGVkUHJlZml4LCBmdW5jLCBjb250ZXh0KTsKKyAgdHJhdmVyc2VBbGxDaGlsZHJlbihjaGls ZHJlbiwgbWFwU2luZ2xlQ2hpbGRJbnRvQ29udGV4dCwgdHJhdmVyc2VDb250ZXh0KTsKKyAgTWFw Qm9va0tlZXBpbmcucmVsZWFzZSh0cmF2ZXJzZUNvbnRleHQpOworfQorCisvKioKKyAqIE1hcHMg Y2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5g LgorICoKKyAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1s ZXZlbC1hcGkuaHRtbCNyZWFjdC5jaGlsZHJlbi5tYXAKKyAqCisgKiBUaGUgcHJvdmlkZWQgbWFw RnVuY3Rpb24oY2hpbGQsIGtleSwgaW5kZXgpIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoCisgKiBs ZWFmIGNoaWxkLgorICoKKyAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29u dGFpbmVyLgorICogQHBhcmFtIHtmdW5jdGlvbigqLCBpbnQpfSBmdW5jIFRoZSBtYXAgZnVuY3Rp b24uCisgKiBAcGFyYW0geyp9IGNvbnRleHQgQ29udGV4dCBmb3IgbWFwRnVuY3Rpb24uCisgKiBA cmV0dXJuIHtvYmplY3R9IE9iamVjdCBjb250YWluaW5nIHRoZSBvcmRlcmVkIG1hcCBvZiByZXN1 bHRzLgorICovCitmdW5jdGlvbiBtYXBDaGlsZHJlbihjaGlsZHJlbiwgZnVuYywgY29udGV4dCkg eworICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgeworICAgIHJldHVybiBjaGlsZHJlbjsKKyAgfQor ICB2YXIgcmVzdWx0ID0gW107CisgIG1hcEludG9XaXRoS2V5UHJlZml4SW50ZXJuYWwoY2hpbGRy ZW4sIHJlc3VsdCwgbnVsbCwgZnVuYywgY29udGV4dCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisK K2Z1bmN0aW9uIGZvckVhY2hTaW5nbGVDaGlsZER1bW15KHRyYXZlcnNlQ29udGV4dCwgY2hpbGQs IG5hbWUpIHsKKyAgcmV0dXJuIG51bGw7Cit9CisKKy8qKgorICogQ291bnQgdGhlIG51bWJlciBv ZiBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzCisgKiBgcHJvcHMuY2hp bGRyZW5gLgorICoKKyAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2Nz L3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jaGlsZHJlbi5jb3VudAorICoKKyAqIEBwYXJhbSB7 Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLgorICogQHJldHVybiB7bnVtYmVy fSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuLgorICovCitmdW5jdGlvbiBjb3VudENoaWxkcmVuKGNo aWxkcmVuLCBjb250ZXh0KSB7CisgIHJldHVybiB0cmF2ZXJzZUFsbENoaWxkcmVuKGNoaWxkcmVu LCBmb3JFYWNoU2luZ2xlQ2hpbGREdW1teSwgbnVsbCk7Cit9CisKKy8qKgorICogRmxhdHRlbiBh IGNoaWxkcmVuIG9iamVjdCAodHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5g KSBhbmQKKyAqIHJldHVybiBhbiBhcnJheSB3aXRoIGFwcHJvcHJpYXRlbHkgcmUta2V5ZWQgY2hp bGRyZW4uCisgKgorICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3Mv dG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNoaWxkcmVuLnRvYXJyYXkKKyAqLworZnVuY3Rpb24g dG9BcnJheShjaGlsZHJlbikgeworICB2YXIgcmVzdWx0ID0gW107CisgIG1hcEludG9XaXRoS2V5 UHJlZml4SW50ZXJuYWwoY2hpbGRyZW4sIHJlc3VsdCwgbnVsbCwgZW1wdHlGdW5jdGlvbi50aGF0 UmV0dXJuc0FyZ3VtZW50KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordmFyIFJlYWN0Q2hpbGRy ZW4gPSB7CisgIGZvckVhY2g6IGZvckVhY2hDaGlsZHJlbiwKKyAgbWFwOiBtYXBDaGlsZHJlbiwK KyAgbWFwSW50b1dpdGhLZXlQcmVmaXhJbnRlcm5hbDogbWFwSW50b1dpdGhLZXlQcmVmaXhJbnRl cm5hbCwKKyAgY291bnQ6IGNvdW50Q2hpbGRyZW4sCisgIHRvQXJyYXk6IHRvQXJyYXkKK307CisK K21vZHVsZS5leHBvcnRzID0gUmVhY3RDaGlsZHJlbjsKK30seyIxMCI6MTAsIjIiOjIsIjI1Ijoy NSwiMjYiOjI2fV0sNTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAq IENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJl c2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJT RC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290 IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBv ZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBz YW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX3Byb2RJbnZh cmlhbnQgPSBfZGVyZXFfKDI0KSwKKyAgICBfYXNzaWduID0gX2RlcmVxXygzMCk7CisKK3ZhciBS ZWFjdENvbXBvbmVudCA9IF9kZXJlcV8oNik7Cit2YXIgUmVhY3RFbGVtZW50ID0gX2RlcmVxXygx MCk7Cit2YXIgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMgPSBfZGVyZXFfKDE0KTsKK3ZhciBS ZWFjdE5vb3BVcGRhdGVRdWV1ZSA9IF9kZXJlcV8oMTMpOworCit2YXIgZW1wdHlPYmplY3QgPSBf ZGVyZXFfKDI3KTsKK3ZhciBpbnZhcmlhbnQgPSBfZGVyZXFfKDI4KTsKK3ZhciB3YXJuaW5nID0g X2RlcmVxXygyOSk7CisKK3ZhciBNSVhJTlNfS0VZID0gJ21peGlucyc7CisKKy8vIEhlbHBlciBm dW5jdGlvbiB0byBhbGxvdyB0aGUgY3JlYXRpb24gb2YgYW5vbnltb3VzIGZ1bmN0aW9ucyB3aGlj aCBkbyBub3QKKy8vIGhhdmUgLm5hbWUgc2V0IHRvIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSBi ZWluZyBhc3NpZ25lZCB0by4KK2Z1bmN0aW9uIGlkZW50aXR5KGZuKSB7CisgIHJldHVybiBmbjsK K30KKworLyoqCisgKiBQb2xpY2llcyB0aGF0IGRlc2NyaWJlIG1ldGhvZHMgaW4gYFJlYWN0Q2xh c3NJbnRlcmZhY2VgLgorICovCisKKwordmFyIGluamVjdGVkTWl4aW5zID0gW107CisKKy8qKgor ICogQ29tcG9zaXRlIGNvbXBvbmVudHMgYXJlIGhpZ2hlci1sZXZlbCBjb21wb25lbnRzIHRoYXQg Y29tcG9zZSBvdGhlciBjb21wb3NpdGUKKyAqIG9yIGhvc3QgY29tcG9uZW50cy4KKyAqCisgKiBU byBjcmVhdGUgYSBuZXcgdHlwZSBvZiBgUmVhY3RDbGFzc2AsIHBhc3MgYSBzcGVjaWZpY2F0aW9u IG9mCisgKiB5b3VyIG5ldyBjbGFzcyB0byBgUmVhY3QuY3JlYXRlQ2xhc3NgLiBUaGUgb25seSBy ZXF1aXJlbWVudCBvZiB5b3VyIGNsYXNzCisgKiBzcGVjaWZpY2F0aW9uIGlzIHRoYXQgeW91IGlt cGxlbWVudCBhIGByZW5kZXJgIG1ldGhvZC4KKyAqCisgKiAgIHZhciBNeUNvbXBvbmVudCA9IFJl YWN0LmNyZWF0ZUNsYXNzKHsKKyAqICAgICByZW5kZXI6IGZ1bmN0aW9uKCkgeworICogICAgICAg cmV0dXJuIDxkaXY+SGVsbG8gV29ybGQ8L2Rpdj47CisgKiAgICAgfQorICogICB9KTsKKyAqCisg KiBUaGUgY2xhc3Mgc3BlY2lmaWNhdGlvbiBzdXBwb3J0cyBhIHNwZWNpZmljIHByb3RvY29sIG9m IG1ldGhvZHMgdGhhdCBoYXZlCisgKiBzcGVjaWFsIG1lYW5pbmcgKGUuZy4gYHJlbmRlcmApLiBT ZWUgYFJlYWN0Q2xhc3NJbnRlcmZhY2VgIGZvcgorICogbW9yZSB0aGUgY29tcHJlaGVuc2l2ZSBw cm90b2NvbC4gQW55IG90aGVyIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgaW4gdGhlCisgKiBjbGFz cyBzcGVjaWZpY2F0aW9uIHdpbGwgYmUgYXZhaWxhYmxlIG9uIHRoZSBwcm90b3R5cGUuCisgKgor ICogQGludGVyZmFjZSBSZWFjdENsYXNzSW50ZXJmYWNlCisgKiBAaW50ZXJuYWwKKyAqLwordmFy IFJlYWN0Q2xhc3NJbnRlcmZhY2UgPSB7CisKKyAgLyoqCisgICAqIEFuIGFycmF5IG9mIE1peGlu IG9iamVjdHMgdG8gaW5jbHVkZSB3aGVuIGRlZmluaW5nIHlvdXIgY29tcG9uZW50LgorICAgKgor ICAgKiBAdHlwZSB7YXJyYXl9CisgICAqIEBvcHRpb25hbAorICAgKi8KKyAgbWl4aW5zOiAnREVG SU5FX01BTlknLAorCisgIC8qKgorICAgKiBBbiBvYmplY3QgY29udGFpbmluZyBwcm9wZXJ0aWVz IGFuZCBtZXRob2RzIHRoYXQgc2hvdWxkIGJlIGRlZmluZWQgb24KKyAgICogdGhlIGNvbXBvbmVu dCdzIGNvbnN0cnVjdG9yIGluc3RlYWQgb2YgaXRzIHByb3RvdHlwZSAoc3RhdGljIG1ldGhvZHMp LgorICAgKgorICAgKiBAdHlwZSB7b2JqZWN0fQorICAgKiBAb3B0aW9uYWwKKyAgICovCisgIHN0 YXRpY3M6ICdERUZJTkVfTUFOWScsCisKKyAgLyoqCisgICAqIERlZmluaXRpb24gb2YgcHJvcCB0 eXBlcyBmb3IgdGhpcyBjb21wb25lbnQuCisgICAqCisgICAqIEB0eXBlIHtvYmplY3R9CisgICAq IEBvcHRpb25hbAorICAgKi8KKyAgcHJvcFR5cGVzOiAnREVGSU5FX01BTlknLAorCisgIC8qKgor ICAgKiBEZWZpbml0aW9uIG9mIGNvbnRleHQgdHlwZXMgZm9yIHRoaXMgY29tcG9uZW50LgorICAg KgorICAgKiBAdHlwZSB7b2JqZWN0fQorICAgKiBAb3B0aW9uYWwKKyAgICovCisgIGNvbnRleHRU eXBlczogJ0RFRklORV9NQU5ZJywKKworICAvKioKKyAgICogRGVmaW5pdGlvbiBvZiBjb250ZXh0 IHR5cGVzIHRoaXMgY29tcG9uZW50IHNldHMgZm9yIGl0cyBjaGlsZHJlbi4KKyAgICoKKyAgICog QHR5cGUge29iamVjdH0KKyAgICogQG9wdGlvbmFsCisgICAqLworICBjaGlsZENvbnRleHRUeXBl czogJ0RFRklORV9NQU5ZJywKKworICAvLyA9PT09IERlZmluaXRpb24gbWV0aG9kcyA9PT09CisK KyAgLyoqCisgICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIG1vdW50ZWQuIFZhbHVl cyBpbiB0aGUgbWFwcGluZyB3aWxsIGJlIHNldCBvbgorICAgKiBgdGhpcy5wcm9wc2AgaWYgdGhh dCBwcm9wIGlzIG5vdCBzcGVjaWZpZWQgKGkuZS4gdXNpbmcgYW4gYGluYCBjaGVjaykuCisgICAq CisgICAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYmVmb3JlIGBnZXRJbml0aWFsU3RhdGVgIGFu ZCB0aGVyZWZvcmUgY2Fubm90IHJlbHkKKyAgICogb24gYHRoaXMuc3RhdGVgIG9yIHVzZSBgdGhp cy5zZXRTdGF0ZWAuCisgICAqCisgICAqIEByZXR1cm4ge29iamVjdH0KKyAgICogQG9wdGlvbmFs CisgICAqLworICBnZXREZWZhdWx0UHJvcHM6ICdERUZJTkVfTUFOWV9NRVJHRUQnLAorCisgIC8q KgorICAgKiBJbnZva2VkIG9uY2UgYmVmb3JlIHRoZSBjb21wb25lbnQgaXMgbW91bnRlZC4gVGhl IHJldHVybiB2YWx1ZSB3aWxsIGJlIHVzZWQKKyAgICogYXMgdGhlIGluaXRpYWwgdmFsdWUgb2Yg YHRoaXMuc3RhdGVgLgorICAgKgorICAgKiAgIGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24oKSB7 CisgICAqICAgICByZXR1cm4geworICAgKiAgICAgICBpc09uOiBmYWxzZSwKKyAgICogICAgICAg Zm9vQmF6OiBuZXcgQmF6Rm9vKCkKKyAgICogICAgIH0KKyAgICogICB9CisgICAqCisgICAqIEBy ZXR1cm4ge29iamVjdH0KKyAgICogQG9wdGlvbmFsCisgICAqLworICBnZXRJbml0aWFsU3RhdGU6 ICdERUZJTkVfTUFOWV9NRVJHRUQnLAorCisgIC8qKgorICAgKiBAcmV0dXJuIHtvYmplY3R9Cisg ICAqIEBvcHRpb25hbAorICAgKi8KKyAgZ2V0Q2hpbGRDb250ZXh0OiAnREVGSU5FX01BTllfTUVS R0VEJywKKworICAvKioKKyAgICogVXNlcyBwcm9wcyBmcm9tIGB0aGlzLnByb3BzYCBhbmQgc3Rh dGUgZnJvbSBgdGhpcy5zdGF0ZWAgdG8gcmVuZGVyIHRoZQorICAgKiBzdHJ1Y3R1cmUgb2YgdGhl IGNvbXBvbmVudC4KKyAgICoKKyAgICogTm8gZ3VhcmFudGVlcyBhcmUgbWFkZSBhYm91dCB3aGVu IG9yIGhvdyBvZnRlbiB0aGlzIG1ldGhvZCBpcyBpbnZva2VkLCBzbworICAgKiBpdCBtdXN0IG5v dCBoYXZlIHNpZGUgZWZmZWN0cy4KKyAgICoKKyAgICogICByZW5kZXI6IGZ1bmN0aW9uKCkgewor ICAgKiAgICAgdmFyIG5hbWUgPSB0aGlzLnByb3BzLm5hbWU7CisgICAqICAgICByZXR1cm4gPGRp dj5IZWxsbywge25hbWV9ITwvZGl2PjsKKyAgICogICB9CisgICAqCisgICAqIEByZXR1cm4ge1Jl YWN0Q29tcG9uZW50fQorICAgKiBAbm9zaWRlZWZmZWN0cworICAgKiBAcmVxdWlyZWQKKyAgICov CisgIHJlbmRlcjogJ0RFRklORV9PTkNFJywKKworICAvLyA9PT09IERlbGVnYXRlIG1ldGhvZHMg PT09PQorCisgIC8qKgorICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBpbml0aWFs bHkgY3JlYXRlZCBhbmQgYWJvdXQgdG8gYmUgbW91bnRlZC4KKyAgICogVGhpcyBtYXkgaGF2ZSBz aWRlIGVmZmVjdHMsIGJ1dCBhbnkgZXh0ZXJuYWwgc3Vic2NyaXB0aW9ucyBvciBkYXRhIGNyZWF0 ZWQKKyAgICogYnkgdGhpcyBtZXRob2QgbXVzdCBiZSBjbGVhbmVkIHVwIGluIGBjb21wb25lbnRX aWxsVW5tb3VudGAuCisgICAqCisgICAqIEBvcHRpb25hbAorICAgKi8KKyAgY29tcG9uZW50V2ls bE1vdW50OiAnREVGSU5FX01BTlknLAorCisgIC8qKgorICAgKiBJbnZva2VkIHdoZW4gdGhlIGNv bXBvbmVudCBoYXMgYmVlbiBtb3VudGVkIGFuZCBoYXMgYSBET00gcmVwcmVzZW50YXRpb24uCisg ICAqIEhvd2V2ZXIsIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBET00gbm9kZSBpcyBp biB0aGUgZG9jdW1lbnQuCisgICAqCisgICAqIFVzZSB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRv IG9wZXJhdGUgb24gdGhlIERPTSB3aGVuIHRoZSBjb21wb25lbnQgaGFzCisgICAqIGJlZW4gbW91 bnRlZCAoaW5pdGlhbGl6ZWQgYW5kIHJlbmRlcmVkKSBmb3IgdGhlIGZpcnN0IHRpbWUuCisgICAq CisgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gcm9vdE5vZGUgRE9NIGVsZW1lbnQgcmVwcmVzZW50 aW5nIHRoZSBjb21wb25lbnQuCisgICAqIEBvcHRpb25hbAorICAgKi8KKyAgY29tcG9uZW50RGlk TW91bnQ6ICdERUZJTkVfTUFOWScsCisKKyAgLyoqCisgICAqIEludm9rZWQgYmVmb3JlIHRoZSBj b21wb25lbnQgcmVjZWl2ZXMgbmV3IHByb3BzLgorICAgKgorICAgKiBVc2UgdGhpcyBhcyBhbiBv cHBvcnR1bml0eSB0byByZWFjdCB0byBhIHByb3AgdHJhbnNpdGlvbiBieSB1cGRhdGluZyB0aGUK KyAgICogc3RhdGUgdXNpbmcgYHRoaXMuc2V0U3RhdGVgLiBDdXJyZW50IHByb3BzIGFyZSBhY2Nl c3NlZCB2aWEgYHRoaXMucHJvcHNgLgorICAgKgorICAgKiAgIGNvbXBvbmVudFdpbGxSZWNlaXZl UHJvcHM6IGZ1bmN0aW9uKG5leHRQcm9wcywgbmV4dENvbnRleHQpIHsKKyAgICogICAgIHRoaXMu c2V0U3RhdGUoeworICAgKiAgICAgICBsaWtlc0luY3JlYXNpbmc6IG5leHRQcm9wcy5saWtlQ291 bnQgPiB0aGlzLnByb3BzLmxpa2VDb3VudAorICAgKiAgICAgfSk7CisgICAqICAgfQorICAgKgor ICAgKiBOT1RFOiBUaGVyZSBpcyBubyBlcXVpdmFsZW50IGBjb21wb25lbnRXaWxsUmVjZWl2ZVN0 YXRlYC4gQW4gaW5jb21pbmcgcHJvcAorICAgKiB0cmFuc2l0aW9uIG1heSBjYXVzZSBhIHN0YXRl IGNoYW5nZSwgYnV0IHRoZSBvcHBvc2l0ZSBpcyBub3QgdHJ1ZS4gSWYgeW91CisgICAqIG5lZWQg aXQsIHlvdSBhcmUgcHJvYmFibHkgbG9va2luZyBmb3IgYGNvbXBvbmVudFdpbGxVcGRhdGVgLgor ICAgKgorICAgKiBAcGFyYW0ge29iamVjdH0gbmV4dFByb3BzCisgICAqIEBvcHRpb25hbAorICAg Ki8KKyAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wczogJ0RFRklORV9NQU5ZJywKKworICAvKioK KyAgICogSW52b2tlZCB3aGlsZSBkZWNpZGluZyBpZiB0aGUgY29tcG9uZW50IHNob3VsZCBiZSB1 cGRhdGVkIGFzIGEgcmVzdWx0IG9mCisgICAqIHJlY2VpdmluZyBuZXcgcHJvcHMsIHN0YXRlIGFu ZC9vciBjb250ZXh0LgorICAgKgorICAgKiBVc2UgdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBg cmV0dXJuIGZhbHNlYCB3aGVuIHlvdSdyZSBjZXJ0YWluIHRoYXQgdGhlCisgICAqIHRyYW5zaXRp b24gdG8gdGhlIG5ldyBwcm9wcy9zdGF0ZS9jb250ZXh0IHdpbGwgbm90IHJlcXVpcmUgYSBjb21w b25lbnQKKyAgICogdXBkYXRlLgorICAgKgorICAgKiAgIHNob3VsZENvbXBvbmVudFVwZGF0ZTog ZnVuY3Rpb24obmV4dFByb3BzLCBuZXh0U3RhdGUsIG5leHRDb250ZXh0KSB7CisgICAqICAgICBy ZXR1cm4gIWVxdWFsKG5leHRQcm9wcywgdGhpcy5wcm9wcykgfHwKKyAgICogICAgICAgIWVxdWFs KG5leHRTdGF0ZSwgdGhpcy5zdGF0ZSkgfHwKKyAgICogICAgICAgIWVxdWFsKG5leHRDb250ZXh0 LCB0aGlzLmNvbnRleHQpOworICAgKiAgIH0KKyAgICoKKyAgICogQHBhcmFtIHtvYmplY3R9IG5l eHRQcm9wcworICAgKiBAcGFyYW0gez9vYmplY3R9IG5leHRTdGF0ZQorICAgKiBAcGFyYW0gez9v YmplY3R9IG5leHRDb250ZXh0CisgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGNv bXBvbmVudCBzaG91bGQgdXBkYXRlLgorICAgKiBAb3B0aW9uYWwKKyAgICovCisgIHNob3VsZENv bXBvbmVudFVwZGF0ZTogJ0RFRklORV9PTkNFJywKKworICAvKioKKyAgICogSW52b2tlZCB3aGVu IHRoZSBjb21wb25lbnQgaXMgYWJvdXQgdG8gdXBkYXRlIGR1ZSB0byBhIHRyYW5zaXRpb24gZnJv bQorICAgKiBgdGhpcy5wcm9wc2AsIGB0aGlzLnN0YXRlYCBhbmQgYHRoaXMuY29udGV4dGAgdG8g YG5leHRQcm9wc2AsIGBuZXh0U3RhdGVgCisgICAqIGFuZCBgbmV4dENvbnRleHRgLgorICAgKgor ICAgKiBVc2UgdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBwZXJmb3JtIHByZXBhcmF0aW9uIGJl Zm9yZSBhbiB1cGRhdGUgb2NjdXJzLgorICAgKgorICAgKiBOT1RFOiBZb3UgKipjYW5ub3QqKiB1 c2UgYHRoaXMuc2V0U3RhdGUoKWAgaW4gdGhpcyBtZXRob2QuCisgICAqCisgICAqIEBwYXJhbSB7 b2JqZWN0fSBuZXh0UHJvcHMKKyAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0U3RhdGUKKyAgICog QHBhcmFtIHs/b2JqZWN0fSBuZXh0Q29udGV4dAorICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxl VHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uCisgICAqIEBvcHRpb25hbAorICAgKi8KKyAgY29tcG9u ZW50V2lsbFVwZGF0ZTogJ0RFRklORV9NQU5ZJywKKworICAvKioKKyAgICogSW52b2tlZCB3aGVu IHRoZSBjb21wb25lbnQncyBET00gcmVwcmVzZW50YXRpb24gaGFzIGJlZW4gdXBkYXRlZC4KKyAg ICoKKyAgICogVXNlIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gb3BlcmF0ZSBvbiB0aGUgRE9N IHdoZW4gdGhlIGNvbXBvbmVudCBoYXMKKyAgICogYmVlbiB1cGRhdGVkLgorICAgKgorICAgKiBA cGFyYW0ge29iamVjdH0gcHJldlByb3BzCisgICAqIEBwYXJhbSB7P29iamVjdH0gcHJldlN0YXRl CisgICAqIEBwYXJhbSB7P29iamVjdH0gcHJldkNvbnRleHQKKyAgICogQHBhcmFtIHtET01FbGVt ZW50fSByb290Tm9kZSBET00gZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGNvbXBvbmVudC4KKyAg ICogQG9wdGlvbmFsCisgICAqLworICBjb21wb25lbnREaWRVcGRhdGU6ICdERUZJTkVfTUFOWScs CisKKyAgLyoqCisgICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIGFib3V0IHRvIGJl IHJlbW92ZWQgZnJvbSBpdHMgcGFyZW50IGFuZCBoYXZlCisgICAqIGl0cyBET00gcmVwcmVzZW50 YXRpb24gZGVzdHJveWVkLgorICAgKgorICAgKiBVc2UgdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0 byBkZWFsbG9jYXRlIGFueSBleHRlcm5hbCByZXNvdXJjZXMuCisgICAqCisgICAqIE5PVEU6IFRo ZXJlIGlzIG5vIGBjb21wb25lbnREaWRVbm1vdW50YCBzaW5jZSB5b3VyIGNvbXBvbmVudCB3aWxs IGhhdmUgYmVlbgorICAgKiBkZXN0cm95ZWQgYnkgdGhhdCBwb2ludC4KKyAgICoKKyAgICogQG9w dGlvbmFsCisgICAqLworICBjb21wb25lbnRXaWxsVW5tb3VudDogJ0RFRklORV9NQU5ZJywKKwor ICAvLyA9PT09IEFkdmFuY2VkIG1ldGhvZHMgPT09PQorCisgIC8qKgorICAgKiBVcGRhdGVzIHRo ZSBjb21wb25lbnQncyBjdXJyZW50bHkgbW91bnRlZCBET00gcmVwcmVzZW50YXRpb24uCisgICAq CisgICAqIEJ5IGRlZmF1bHQsIHRoaXMgaW1wbGVtZW50cyBSZWFjdCdzIHJlbmRlcmluZyBhbmQg cmVjb25jaWxpYXRpb24gYWxnb3JpdGhtLgorICAgKiBTb3BoaXN0aWNhdGVkIGNsaWVudHMgbWF5 IHdpc2ggdG8gb3ZlcnJpZGUgdGhpcy4KKyAgICoKKyAgICogQHBhcmFtIHtSZWFjdFJlY29uY2ls ZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvbgorICAgKiBAaW50ZXJuYWwKKyAgICogQG92ZXJyaWRh YmxlCisgICAqLworICB1cGRhdGVDb21wb25lbnQ6ICdPVkVSUklERV9CQVNFJworCit9OworCisv KioKKyAqIE1hcHBpbmcgZnJvbSBjbGFzcyBzcGVjaWZpY2F0aW9uIGtleXMgdG8gc3BlY2lhbCBw cm9jZXNzaW5nIGZ1bmN0aW9ucy4KKyAqCisgKiBBbHRob3VnaCB0aGVzZSBhcmUgZGVjbGFyZWQg bGlrZSBpbnN0YW5jZSBwcm9wZXJ0aWVzIGluIHRoZSBzcGVjaWZpY2F0aW9uCisgKiB3aGVuIGRl ZmluaW5nIGNsYXNzZXMgdXNpbmcgYFJlYWN0LmNyZWF0ZUNsYXNzYCwgdGhleSBhcmUgYWN0dWFs bHkgc3RhdGljCisgKiBhbmQgYXJlIGFjY2Vzc2libGUgb24gdGhlIGNvbnN0cnVjdG9yIGluc3Rl YWQgb2YgdGhlIHByb3RvdHlwZS4gRGVzcGl0ZQorICogYmVpbmcgc3RhdGljLCB0aGV5IG11c3Qg YmUgZGVmaW5lZCBvdXRzaWRlIG9mIHRoZSAic3RhdGljcyIga2V5IHVuZGVyCisgKiB3aGljaCBh bGwgb3RoZXIgc3RhdGljIG1ldGhvZHMgYXJlIGRlZmluZWQuCisgKi8KK3ZhciBSRVNFUlZFRF9T UEVDX0tFWVMgPSB7CisgIGRpc3BsYXlOYW1lOiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIGRpc3Bs YXlOYW1lKSB7CisgICAgQ29uc3RydWN0b3IuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKKyAg fSwKKyAgbWl4aW5zOiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIG1peGlucykgeworICAgIGlmICht aXhpbnMpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWl4aW5zLmxlbmd0aDsgaSsrKSB7 CisgICAgICAgIG1peFNwZWNJbnRvQ29tcG9uZW50KENvbnN0cnVjdG9yLCBtaXhpbnNbaV0pOwor ICAgICAgfQorICAgIH0KKyAgfSwKKyAgY2hpbGRDb250ZXh0VHlwZXM6IGZ1bmN0aW9uIChDb25z dHJ1Y3RvciwgY2hpbGRDb250ZXh0VHlwZXMpIHsKKyAgICBpZiAoImRldmVsb3BtZW50IiAhPT0g J3Byb2R1Y3Rpb24nKSB7CisgICAgICB2YWxpZGF0ZVR5cGVEZWYoQ29uc3RydWN0b3IsIGNoaWxk Q29udGV4dFR5cGVzLCAnY2hpbGRDb250ZXh0Jyk7CisgICAgfQorICAgIENvbnN0cnVjdG9yLmNo aWxkQ29udGV4dFR5cGVzID0gX2Fzc2lnbih7fSwgQ29uc3RydWN0b3IuY2hpbGRDb250ZXh0VHlw ZXMsIGNoaWxkQ29udGV4dFR5cGVzKTsKKyAgfSwKKyAgY29udGV4dFR5cGVzOiBmdW5jdGlvbiAo Q29uc3RydWN0b3IsIGNvbnRleHRUeXBlcykgeworICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAn cHJvZHVjdGlvbicpIHsKKyAgICAgIHZhbGlkYXRlVHlwZURlZihDb25zdHJ1Y3RvciwgY29udGV4 dFR5cGVzLCAnY29udGV4dCcpOworICAgIH0KKyAgICBDb25zdHJ1Y3Rvci5jb250ZXh0VHlwZXMg PSBfYXNzaWduKHt9LCBDb25zdHJ1Y3Rvci5jb250ZXh0VHlwZXMsIGNvbnRleHRUeXBlcyk7Cisg IH0sCisgIC8qKgorICAgKiBTcGVjaWFsIGNhc2UgZ2V0RGVmYXVsdFByb3BzIHdoaWNoIHNob3Vs ZCBtb3ZlIGludG8gc3RhdGljcyBidXQgcmVxdWlyZXMKKyAgICogYXV0b21hdGljIG1lcmdpbmcu CisgICAqLworICBnZXREZWZhdWx0UHJvcHM6IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgZ2V0RGVm YXVsdFByb3BzKSB7CisgICAgaWYgKENvbnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcykgeworICAg ICAgQ29uc3RydWN0b3IuZ2V0RGVmYXVsdFByb3BzID0gY3JlYXRlTWVyZ2VkUmVzdWx0RnVuY3Rp b24oQ29uc3RydWN0b3IuZ2V0RGVmYXVsdFByb3BzLCBnZXREZWZhdWx0UHJvcHMpOworICAgIH0g ZWxzZSB7CisgICAgICBDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMgPSBnZXREZWZhdWx0UHJv cHM7CisgICAgfQorICB9LAorICBwcm9wVHlwZXM6IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJv cFR5cGVzKSB7CisgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAg ICAgdmFsaWRhdGVUeXBlRGVmKENvbnN0cnVjdG9yLCBwcm9wVHlwZXMsICdwcm9wJyk7CisgICAg fQorICAgIENvbnN0cnVjdG9yLnByb3BUeXBlcyA9IF9hc3NpZ24oe30sIENvbnN0cnVjdG9yLnBy b3BUeXBlcywgcHJvcFR5cGVzKTsKKyAgfSwKKyAgc3RhdGljczogZnVuY3Rpb24gKENvbnN0cnVj dG9yLCBzdGF0aWNzKSB7CisgICAgbWl4U3RhdGljU3BlY0ludG9Db21wb25lbnQoQ29uc3RydWN0 b3IsIHN0YXRpY3MpOworICB9LAorICBhdXRvYmluZDogZnVuY3Rpb24gKCkge30gfTsKKworZnVu Y3Rpb24gdmFsaWRhdGVUeXBlRGVmKENvbnN0cnVjdG9yLCB0eXBlRGVmLCBsb2NhdGlvbikgewor ICBmb3IgKHZhciBwcm9wTmFtZSBpbiB0eXBlRGVmKSB7CisgICAgaWYgKHR5cGVEZWYuaGFzT3du UHJvcGVydHkocHJvcE5hbWUpKSB7CisgICAgICAvLyB1c2UgYSB3YXJuaW5nIGluc3RlYWQgb2Yg YW4gaW52YXJpYW50IHNvIGNvbXBvbmVudHMKKyAgICAgIC8vIGRvbid0IHNob3cgdXAgaW4gcHJv ZCBidXQgb25seSBpbiBfX0RFVl9fCisgICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlv bicgPyB3YXJuaW5nKHR5cGVvZiB0eXBlRGVmW3Byb3BOYW1lXSA9PT0gJ2Z1bmN0aW9uJywgJyVz OiAlcyB0eXBlIGAlc2AgaXMgaW52YWxpZDsgaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5 IGZyb20gJyArICdSZWFjdC5Qcm9wVHlwZXMuJywgQ29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwg J1JlYWN0Q2xhc3MnLCBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl0sIHByb3BO YW1lKSA6IHZvaWQgMDsKKyAgICB9CisgIH0KK30KKworZnVuY3Rpb24gdmFsaWRhdGVNZXRob2RP dmVycmlkZShpc0FscmVhZHlEZWZpbmVkLCBuYW1lKSB7CisgIHZhciBzcGVjUG9saWN5ID0gUmVh Y3RDbGFzc0ludGVyZmFjZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IFJlYWN0Q2xhc3NJbnRlcmZh Y2VbbmFtZV0gOiBudWxsOworCisgIC8vIERpc2FsbG93IG92ZXJyaWRpbmcgb2YgYmFzZSBjbGFz cyBtZXRob2RzIHVubGVzcyBleHBsaWNpdGx5IGFsbG93ZWQuCisgIGlmIChSZWFjdENsYXNzTWl4 aW4uaGFzT3duUHJvcGVydHkobmFtZSkpIHsKKyAgICAhKHNwZWNQb2xpY3kgPT09ICdPVkVSUklE RV9CQVNFJykgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFs c2UsICdSZWFjdENsYXNzSW50ZXJmYWNlOiBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gb3ZlcnJpZGUg YCVzYCBmcm9tIHlvdXIgY2xhc3Mgc3BlY2lmaWNhdGlvbi4gRW5zdXJlIHRoYXQgeW91ciBtZXRo b2QgbmFtZXMgZG8gbm90IG92ZXJsYXAgd2l0aCBSZWFjdCBtZXRob2RzLicsIG5hbWUpIDogX3By b2RJbnZhcmlhbnQoJzczJywgbmFtZSkgOiB2b2lkIDA7CisgIH0KKworICAvLyBEaXNhbGxvdyBk ZWZpbmluZyBtZXRob2RzIG1vcmUgdGhhbiBvbmNlIHVubGVzcyBleHBsaWNpdGx5IGFsbG93ZWQu CisgIGlmIChpc0FscmVhZHlEZWZpbmVkKSB7CisgICAgIShzcGVjUG9saWN5ID09PSAnREVGSU5F X01BTlknIHx8IHNwZWNQb2xpY3kgPT09ICdERUZJTkVfTUFOWV9NRVJHRUQnKSA/ICJkZXZlbG9w bWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0Q2xhc3NJbnRl cmZhY2U6IFlvdSBhcmUgYXR0ZW1wdGluZyB0byBkZWZpbmUgYCVzYCBvbiB5b3VyIGNvbXBvbmVu dCBtb3JlIHRoYW4gb25jZS4gVGhpcyBjb25mbGljdCBtYXkgYmUgZHVlIHRvIGEgbWl4aW4uJywg bmFtZSkgOiBfcHJvZEludmFyaWFudCgnNzQnLCBuYW1lKSA6IHZvaWQgMDsKKyAgfQorfQorCisv KioKKyAqIE1peGluIGhlbHBlciB3aGljaCBoYW5kbGVzIHBvbGljeSB2YWxpZGF0aW9uIGFuZCBy ZXNlcnZlZAorICogc3BlY2lmaWNhdGlvbiBrZXlzIHdoZW4gYnVpbGRpbmcgUmVhY3QgY2xhc3Nl cy4KKyAqLworZnVuY3Rpb24gbWl4U3BlY0ludG9Db21wb25lbnQoQ29uc3RydWN0b3IsIHNwZWMp IHsKKyAgaWYgKCFzcGVjKSB7CisgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9u JykgeworICAgICAgdmFyIHR5cGVvZlNwZWMgPSB0eXBlb2Ygc3BlYzsKKyAgICAgIHZhciBpc01p eGluVmFsaWQgPSB0eXBlb2ZTcGVjID09PSAnb2JqZWN0JyAmJiBzcGVjICE9PSBudWxsOworCisg ICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGlzTWl4aW5WYWxp ZCwgJyVzOiBZb3VcJ3JlIGF0dGVtcHRpbmcgdG8gaW5jbHVkZSBhIG1peGluIHRoYXQgaXMgZWl0 aGVyIG51bGwgJyArICdvciBub3QgYW4gb2JqZWN0LiBDaGVjayB0aGUgbWl4aW5zIGluY2x1ZGVk IGJ5IHRoZSBjb21wb25lbnQsICcgKyAnYXMgd2VsbCBhcyBhbnkgbWl4aW5zIHRoZXkgaW5jbHVk ZSB0aGVtc2VsdmVzLiAnICsgJ0V4cGVjdGVkIG9iamVjdCBidXQgZ290ICVzLicsIENvbnN0cnVj dG9yLmRpc3BsYXlOYW1lIHx8ICdSZWFjdENsYXNzJywgc3BlYyA9PT0gbnVsbCA/IG51bGwgOiB0 eXBlb2ZTcGVjKSA6IHZvaWQgMDsKKyAgICB9CisKKyAgICByZXR1cm47CisgIH0KKworICAhKHR5 cGVvZiBzcGVjICE9PSAnZnVuY3Rpb24nKSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9u JyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0Q2xhc3M6IFlvdVwncmUgYXR0ZW1wdGluZyB0byB1 c2UgYSBjb21wb25lbnQgY2xhc3Mgb3IgZnVuY3Rpb24gYXMgYSBtaXhpbi4gSW5zdGVhZCwganVz dCB1c2UgYSByZWd1bGFyIG9iamVjdC4nKSA6IF9wcm9kSW52YXJpYW50KCc3NScpIDogdm9pZCAw OworICAhIVJlYWN0RWxlbWVudC5pc1ZhbGlkRWxlbWVudChzcGVjKSA/ICJkZXZlbG9wbWVudCIg IT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0Q2xhc3M6IFlvdVwncmUg YXR0ZW1wdGluZyB0byB1c2UgYSBjb21wb25lbnQgYXMgYSBtaXhpbi4gSW5zdGVhZCwganVzdCB1 c2UgYSByZWd1bGFyIG9iamVjdC4nKSA6IF9wcm9kSW52YXJpYW50KCc3NicpIDogdm9pZCAwOwor CisgIHZhciBwcm90byA9IENvbnN0cnVjdG9yLnByb3RvdHlwZTsKKyAgdmFyIGF1dG9CaW5kUGFp cnMgPSBwcm90by5fX3JlYWN0QXV0b0JpbmRQYWlyczsKKworICAvLyBCeSBoYW5kbGluZyBtaXhp bnMgYmVmb3JlIGFueSBvdGhlciBwcm9wZXJ0aWVzLCB3ZSBlbnN1cmUgdGhlIHNhbWUKKyAgLy8g Y2hhaW5pbmcgb3JkZXIgaXMgYXBwbGllZCB0byBtZXRob2RzIHdpdGggREVGSU5FX01BTlkgcG9s aWN5LCB3aGV0aGVyCisgIC8vIG1peGlucyBhcmUgbGlzdGVkIGJlZm9yZSBvciBhZnRlciB0aGVz ZSBtZXRob2RzIGluIHRoZSBzcGVjLgorICBpZiAoc3BlYy5oYXNPd25Qcm9wZXJ0eShNSVhJTlNf S0VZKSkgeworICAgIFJFU0VSVkVEX1NQRUNfS0VZUy5taXhpbnMoQ29uc3RydWN0b3IsIHNwZWMu bWl4aW5zKTsKKyAgfQorCisgIGZvciAodmFyIG5hbWUgaW4gc3BlYykgeworICAgIGlmICghc3Bl Yy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAg aWYgKG5hbWUgPT09IE1JWElOU19LRVkpIHsKKyAgICAgIC8vIFdlIGhhdmUgYWxyZWFkeSBoYW5k bGVkIG1peGlucyBpbiBhIHNwZWNpYWwgY2FzZSBhYm92ZS4KKyAgICAgIGNvbnRpbnVlOworICAg IH0KKworICAgIHZhciBwcm9wZXJ0eSA9IHNwZWNbbmFtZV07CisgICAgdmFyIGlzQWxyZWFkeURl ZmluZWQgPSBwcm90by5oYXNPd25Qcm9wZXJ0eShuYW1lKTsKKyAgICB2YWxpZGF0ZU1ldGhvZE92 ZXJyaWRlKGlzQWxyZWFkeURlZmluZWQsIG5hbWUpOworCisgICAgaWYgKFJFU0VSVkVEX1NQRUNf S0VZUy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgeworICAgICAgUkVTRVJWRURfU1BFQ19LRVlTW25h bWVdKENvbnN0cnVjdG9yLCBwcm9wZXJ0eSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFNldHVw IG1ldGhvZHMgb24gcHJvdG90eXBlOgorICAgICAgLy8gVGhlIGZvbGxvd2luZyBtZW1iZXIgbWV0 aG9kcyBzaG91bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgYm91bmQ6CisgICAgICAvLyAxLiBFeHBl Y3RlZCBSZWFjdENsYXNzIG1ldGhvZHMgKGluIHRoZSAiaW50ZXJmYWNlIikuCisgICAgICAvLyAy LiBPdmVycmlkZGVuIG1ldGhvZHMgKHRoYXQgd2VyZSBtaXhlZCBpbikuCisgICAgICB2YXIgaXNS ZWFjdENsYXNzTWV0aG9kID0gUmVhY3RDbGFzc0ludGVyZmFjZS5oYXNPd25Qcm9wZXJ0eShuYW1l KTsKKyAgICAgIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIHByb3BlcnR5ID09PSAnZnVuY3Rpb24n OworICAgICAgdmFyIHNob3VsZEF1dG9CaW5kID0gaXNGdW5jdGlvbiAmJiAhaXNSZWFjdENsYXNz TWV0aG9kICYmICFpc0FscmVhZHlEZWZpbmVkICYmIHNwZWMuYXV0b2JpbmQgIT09IGZhbHNlOwor CisgICAgICBpZiAoc2hvdWxkQXV0b0JpbmQpIHsKKyAgICAgICAgYXV0b0JpbmRQYWlycy5wdXNo KG5hbWUsIHByb3BlcnR5KTsKKyAgICAgICAgcHJvdG9bbmFtZV0gPSBwcm9wZXJ0eTsKKyAgICAg IH0gZWxzZSB7CisgICAgICAgIGlmIChpc0FscmVhZHlEZWZpbmVkKSB7CisgICAgICAgICAgdmFy IHNwZWNQb2xpY3kgPSBSZWFjdENsYXNzSW50ZXJmYWNlW25hbWVdOworCisgICAgICAgICAgLy8g VGhlc2UgY2FzZXMgc2hvdWxkIGFscmVhZHkgYmUgY2F1Z2h0IGJ5IHZhbGlkYXRlTWV0aG9kT3Zl cnJpZGUuCisgICAgICAgICAgIShpc1JlYWN0Q2xhc3NNZXRob2QgJiYgKHNwZWNQb2xpY3kgPT09 ICdERUZJTkVfTUFOWV9NRVJHRUQnIHx8IHNwZWNQb2xpY3kgPT09ICdERUZJTkVfTUFOWScpKSA/ ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0 Q2xhc3M6IFVuZXhwZWN0ZWQgc3BlYyBwb2xpY3kgJXMgZm9yIGtleSAlcyB3aGVuIG1peGluZyBp biBjb21wb25lbnQgc3BlY3MuJywgc3BlY1BvbGljeSwgbmFtZSkgOiBfcHJvZEludmFyaWFudCgn NzcnLCBzcGVjUG9saWN5LCBuYW1lKSA6IHZvaWQgMDsKKworICAgICAgICAgIC8vIEZvciBtZXRo b2RzIHdoaWNoIGFyZSBkZWZpbmVkIG1vcmUgdGhhbiBvbmNlLCBjYWxsIHRoZSBleGlzdGluZwor ICAgICAgICAgIC8vIG1ldGhvZHMgYmVmb3JlIGNhbGxpbmcgdGhlIG5ldyBwcm9wZXJ0eSwgbWVy Z2luZyBpZiBhcHByb3ByaWF0ZS4KKyAgICAgICAgICBpZiAoc3BlY1BvbGljeSA9PT0gJ0RFRklO RV9NQU5ZX01FUkdFRCcpIHsKKyAgICAgICAgICAgIHByb3RvW25hbWVdID0gY3JlYXRlTWVyZ2Vk UmVzdWx0RnVuY3Rpb24ocHJvdG9bbmFtZV0sIHByb3BlcnR5KTsKKyAgICAgICAgICB9IGVsc2Ug aWYgKHNwZWNQb2xpY3kgPT09ICdERUZJTkVfTUFOWScpIHsKKyAgICAgICAgICAgIHByb3RvW25h bWVdID0gY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKHByb3RvW25hbWVdLCBwcm9wZXJ0eSk7CisgICAg ICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHByb3RvW25hbWVdID0gcHJvcGVy dHk7CisgICAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAg ICAgICAgICAgLy8gQWRkIHZlcmJvc2UgZGlzcGxheU5hbWUgdG8gdGhlIGZ1bmN0aW9uLCB3aGlj aCBoZWxwcyB3aGVuIGxvb2tpbmcKKyAgICAgICAgICAgIC8vIGF0IHByb2ZpbGluZyB0b29scy4K KyAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkgPT09ICdmdW5jdGlvbicgJiYgc3BlYy5k aXNwbGF5TmFtZSkgeworICAgICAgICAgICAgICBwcm90b1tuYW1lXS5kaXNwbGF5TmFtZSA9IHNw ZWMuZGlzcGxheU5hbWUgKyAnXycgKyBuYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgIH0K KyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCitmdW5jdGlvbiBtaXhTdGF0aWNT cGVjSW50b0NvbXBvbmVudChDb25zdHJ1Y3Rvciwgc3RhdGljcykgeworICBpZiAoIXN0YXRpY3Mp IHsKKyAgICByZXR1cm47CisgIH0KKyAgZm9yICh2YXIgbmFtZSBpbiBzdGF0aWNzKSB7CisgICAg dmFyIHByb3BlcnR5ID0gc3RhdGljc1tuYW1lXTsKKyAgICBpZiAoIXN0YXRpY3MuaGFzT3duUHJv cGVydHkobmFtZSkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHZhciBpc1Jlc2Vy dmVkID0gbmFtZSBpbiBSRVNFUlZFRF9TUEVDX0tFWVM7CisgICAgISFpc1Jlc2VydmVkID8gImRl dmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RDbGFz czogWW91IGFyZSBhdHRlbXB0aW5nIHRvIGRlZmluZSBhIHJlc2VydmVkIHByb3BlcnR5LCBgJXNg LCB0aGF0IHNob3VsZG5cJ3QgYmUgb24gdGhlICJzdGF0aWNzIiBrZXkuIERlZmluZSBpdCBhcyBh biBpbnN0YW5jZSBwcm9wZXJ0eSBpbnN0ZWFkOyBpdCB3aWxsIHN0aWxsIGJlIGFjY2Vzc2libGUg b24gdGhlIGNvbnN0cnVjdG9yLicsIG5hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzc4JywgbmFtZSkg OiB2b2lkIDA7CisKKyAgICB2YXIgaXNJbmhlcml0ZWQgPSBuYW1lIGluIENvbnN0cnVjdG9yOwor ICAgICEhaXNJbmhlcml0ZWQgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZh cmlhbnQoZmFsc2UsICdSZWFjdENsYXNzOiBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gZGVmaW5lIGAl c2Agb24geW91ciBjb21wb25lbnQgbW9yZSB0aGFuIG9uY2UuIFRoaXMgY29uZmxpY3QgbWF5IGJl IGR1ZSB0byBhIG1peGluLicsIG5hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzc5JywgbmFtZSkgOiB2 b2lkIDA7CisgICAgQ29uc3RydWN0b3JbbmFtZV0gPSBwcm9wZXJ0eTsKKyAgfQorfQorCisvKioK KyAqIE1lcmdlIHR3byBvYmplY3RzLCBidXQgdGhyb3cgaWYgYm90aCBjb250YWluIHRoZSBzYW1l IGtleS4KKyAqCisgKiBAcGFyYW0ge29iamVjdH0gb25lIFRoZSBmaXJzdCBvYmplY3QsIHdoaWNo IGlzIG11dGF0ZWQuCisgKiBAcGFyYW0ge29iamVjdH0gdHdvIFRoZSBzZWNvbmQgb2JqZWN0Cisg KiBAcmV0dXJuIHtvYmplY3R9IG9uZSBhZnRlciBpdCBoYXMgYmVlbiBtdXRhdGVkIHRvIGNvbnRh aW4gZXZlcnl0aGluZyBpbiB0d28uCisgKi8KK2Z1bmN0aW9uIG1lcmdlSW50b1dpdGhOb0R1cGxp Y2F0ZUtleXMob25lLCB0d28pIHsKKyAgIShvbmUgJiYgdHdvICYmIHR5cGVvZiBvbmUgPT09ICdv YmplY3QnICYmIHR5cGVvZiB0d28gPT09ICdvYmplY3QnKSA/ICJkZXZlbG9wbWVudCIgIT09ICdw cm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ21lcmdlSW50b1dpdGhOb0R1cGxpY2F0ZUtl eXMoKTogQ2Fubm90IG1lcmdlIG5vbi1vYmplY3RzLicpIDogX3Byb2RJbnZhcmlhbnQoJzgwJykg OiB2b2lkIDA7CisKKyAgZm9yICh2YXIga2V5IGluIHR3bykgeworICAgIGlmICh0d28uaGFzT3du UHJvcGVydHkoa2V5KSkgeworICAgICAgIShvbmVba2V5XSA9PT0gdW5kZWZpbmVkKSA/ICJkZXZl bG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ21lcmdlSW50b1dp dGhOb0R1cGxpY2F0ZUtleXMoKTogVHJpZWQgdG8gbWVyZ2UgdHdvIG9iamVjdHMgd2l0aCB0aGUg c2FtZSBrZXk6IGAlc2AuIFRoaXMgY29uZmxpY3QgbWF5IGJlIGR1ZSB0byBhIG1peGluOyBpbiBw YXJ0aWN1bGFyLCB0aGlzIG1heSBiZSBjYXVzZWQgYnkgdHdvIGdldEluaXRpYWxTdGF0ZSgpIG9y IGdldERlZmF1bHRQcm9wcygpIG1ldGhvZHMgcmV0dXJuaW5nIG9iamVjdHMgd2l0aCBjbGFzaGlu ZyBrZXlzLicsIGtleSkgOiBfcHJvZEludmFyaWFudCgnODEnLCBrZXkpIDogdm9pZCAwOworICAg ICAgb25lW2tleV0gPSB0d29ba2V5XTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG9uZTsKK30KKwor LyoqCisgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHR3byBmdW5jdGlvbnMgYW5k IG1lcmdlcyB0aGVpciByZXR1cm4gdmFsdWVzLgorICoKKyAqIEBwYXJhbSB7ZnVuY3Rpb259IG9u ZSBGdW5jdGlvbiB0byBpbnZva2UgZmlyc3QuCisgKiBAcGFyYW0ge2Z1bmN0aW9ufSB0d28gRnVu Y3Rpb24gdG8gaW52b2tlIHNlY29uZC4KKyAqIEByZXR1cm4ge2Z1bmN0aW9ufSBGdW5jdGlvbiB0 aGF0IGludm9rZXMgdGhlIHR3byBhcmd1bWVudCBmdW5jdGlvbnMuCisgKiBAcHJpdmF0ZQorICov CitmdW5jdGlvbiBjcmVhdGVNZXJnZWRSZXN1bHRGdW5jdGlvbihvbmUsIHR3bykgeworICByZXR1 cm4gZnVuY3Rpb24gbWVyZ2VkUmVzdWx0KCkgeworICAgIHZhciBhID0gb25lLmFwcGx5KHRoaXMs IGFyZ3VtZW50cyk7CisgICAgdmFyIGIgPSB0d28uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAg ICBpZiAoYSA9PSBudWxsKSB7CisgICAgICByZXR1cm4gYjsKKyAgICB9IGVsc2UgaWYgKGIgPT0g bnVsbCkgeworICAgICAgcmV0dXJuIGE7CisgICAgfQorICAgIHZhciBjID0ge307CisgICAgbWVy Z2VJbnRvV2l0aE5vRHVwbGljYXRlS2V5cyhjLCBhKTsKKyAgICBtZXJnZUludG9XaXRoTm9EdXBs aWNhdGVLZXlzKGMsIGIpOworICAgIHJldHVybiBjOworICB9OworfQorCisvKioKKyAqIENyZWF0 ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdHdvIGZ1bmN0aW9ucyBhbmQgaWdub3JlcyB0aGVp ciByZXR1cm4gdmFsZXMuCisgKgorICogQHBhcmFtIHtmdW5jdGlvbn0gb25lIEZ1bmN0aW9uIHRv IGludm9rZSBmaXJzdC4KKyAqIEBwYXJhbSB7ZnVuY3Rpb259IHR3byBGdW5jdGlvbiB0byBpbnZv a2Ugc2Vjb25kLgorICogQHJldHVybiB7ZnVuY3Rpb259IEZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0 aGUgdHdvIGFyZ3VtZW50IGZ1bmN0aW9ucy4KKyAqIEBwcml2YXRlCisgKi8KK2Z1bmN0aW9uIGNy ZWF0ZUNoYWluZWRGdW5jdGlvbihvbmUsIHR3bykgeworICByZXR1cm4gZnVuY3Rpb24gY2hhaW5l ZEZ1bmN0aW9uKCkgeworICAgIG9uZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIHR3by5h cHBseSh0aGlzLCBhcmd1bWVudHMpOworICB9OworfQorCisvKioKKyAqIEJpbmRzIGEgbWV0aG9k IHRvIHRoZSBjb21wb25lbnQuCisgKgorICogQHBhcmFtIHtvYmplY3R9IGNvbXBvbmVudCBDb21w b25lbnQgd2hvc2UgbWV0aG9kIGlzIGdvaW5nIHRvIGJlIGJvdW5kLgorICogQHBhcmFtIHtmdW5j dGlvbn0gbWV0aG9kIE1ldGhvZCB0byBiZSBib3VuZC4KKyAqIEByZXR1cm4ge2Z1bmN0aW9ufSBU aGUgYm91bmQgbWV0aG9kLgorICovCitmdW5jdGlvbiBiaW5kQXV0b0JpbmRNZXRob2QoY29tcG9u ZW50LCBtZXRob2QpIHsKKyAgdmFyIGJvdW5kTWV0aG9kID0gbWV0aG9kLmJpbmQoY29tcG9uZW50 KTsKKyAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgIGJvdW5kTWV0 aG9kLl9fcmVhY3RCb3VuZENvbnRleHQgPSBjb21wb25lbnQ7CisgICAgYm91bmRNZXRob2QuX19y ZWFjdEJvdW5kTWV0aG9kID0gbWV0aG9kOworICAgIGJvdW5kTWV0aG9kLl9fcmVhY3RCb3VuZEFy Z3VtZW50cyA9IG51bGw7CisgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnQuY29uc3Ry dWN0b3IuZGlzcGxheU5hbWU7CisgICAgdmFyIF9iaW5kID0gYm91bmRNZXRob2QuYmluZDsKKyAg ICBib3VuZE1ldGhvZC5iaW5kID0gZnVuY3Rpb24gKG5ld1RoaXMpIHsKKyAgICAgIGZvciAodmFy IF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0g MSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykgeworICAgICAgICBhcmdzW19r ZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTsKKyAgICAgIH0KKworICAgICAgLy8gVXNlciBpcyB0 cnlpbmcgdG8gYmluZCgpIGFuIGF1dG9ib3VuZCBtZXRob2Q7IHdlIGVmZmVjdGl2ZWx5IHdpbGwK KyAgICAgIC8vIGlnbm9yZSB0aGUgdmFsdWUgb2YgInRoaXMiIHRoYXQgdGhlIHVzZXIgaXMgdHJ5 aW5nIHRvIHVzZSwgc28KKyAgICAgIC8vIGxldCdzIHdhcm4uCisgICAgICBpZiAobmV3VGhpcyAh PT0gY29tcG9uZW50ICYmIG5ld1RoaXMgIT09IG51bGwpIHsKKyAgICAgICAgImRldmVsb3BtZW50 IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2JpbmQoKTogUmVhY3QgY29tcG9u ZW50IG1ldGhvZHMgbWF5IG9ubHkgYmUgYm91bmQgdG8gdGhlICcgKyAnY29tcG9uZW50IGluc3Rh bmNlLiBTZWUgJXMnLCBjb21wb25lbnROYW1lKSA6IHZvaWQgMDsKKyAgICAgIH0gZWxzZSBpZiAo IWFyZ3MubGVuZ3RoKSB7CisgICAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/ IHdhcm5pbmcoZmFsc2UsICdiaW5kKCk6IFlvdSBhcmUgYmluZGluZyBhIGNvbXBvbmVudCBtZXRo b2QgdG8gdGhlIGNvbXBvbmVudC4gJyArICdSZWFjdCBkb2VzIHRoaXMgZm9yIHlvdSBhdXRvbWF0 aWNhbGx5IGluIGEgaGlnaC1wZXJmb3JtYW5jZSAnICsgJ3dheSwgc28geW91IGNhbiBzYWZlbHkg cmVtb3ZlIHRoaXMgY2FsbC4gU2VlICVzJywgY29tcG9uZW50TmFtZSkgOiB2b2lkIDA7CisgICAg ICAgIHJldHVybiBib3VuZE1ldGhvZDsKKyAgICAgIH0KKyAgICAgIHZhciByZWJvdW5kTWV0aG9k ID0gX2JpbmQuYXBwbHkoYm91bmRNZXRob2QsIGFyZ3VtZW50cyk7CisgICAgICByZWJvdW5kTWV0 aG9kLl9fcmVhY3RCb3VuZENvbnRleHQgPSBjb21wb25lbnQ7CisgICAgICByZWJvdW5kTWV0aG9k Ll9fcmVhY3RCb3VuZE1ldGhvZCA9IG1ldGhvZDsKKyAgICAgIHJlYm91bmRNZXRob2QuX19yZWFj dEJvdW5kQXJndW1lbnRzID0gYXJnczsKKyAgICAgIHJldHVybiByZWJvdW5kTWV0aG9kOworICAg IH07CisgIH0KKyAgcmV0dXJuIGJvdW5kTWV0aG9kOworfQorCisvKioKKyAqIEJpbmRzIGFsbCBh dXRvLWJvdW5kIG1ldGhvZHMgaW4gYSBjb21wb25lbnQuCisgKgorICogQHBhcmFtIHtvYmplY3R9 IGNvbXBvbmVudCBDb21wb25lbnQgd2hvc2UgbWV0aG9kIGlzIGdvaW5nIHRvIGJlIGJvdW5kLgor ICovCitmdW5jdGlvbiBiaW5kQXV0b0JpbmRNZXRob2RzKGNvbXBvbmVudCkgeworICB2YXIgcGFp cnMgPSBjb21wb25lbnQuX19yZWFjdEF1dG9CaW5kUGFpcnM7CisgIGZvciAodmFyIGkgPSAwOyBp IDwgcGFpcnMubGVuZ3RoOyBpICs9IDIpIHsKKyAgICB2YXIgYXV0b0JpbmRLZXkgPSBwYWlyc1tp XTsKKyAgICB2YXIgbWV0aG9kID0gcGFpcnNbaSArIDFdOworICAgIGNvbXBvbmVudFthdXRvQmlu ZEtleV0gPSBiaW5kQXV0b0JpbmRNZXRob2QoY29tcG9uZW50LCBtZXRob2QpOworICB9Cit9CisK Ky8qKgorICogQWRkIG1vcmUgdG8gdGhlIFJlYWN0Q2xhc3MgYmFzZSBjbGFzcy4gVGhlc2UgYXJl IGFsbCBsZWdhY3kgZmVhdHVyZXMgYW5kCisgKiB0aGVyZWZvcmUgbm90IGFscmVhZHkgcGFydCBv ZiB0aGUgbW9kZXJuIFJlYWN0Q29tcG9uZW50LgorICovCit2YXIgUmVhY3RDbGFzc01peGluID0g eworCisgIC8qKgorICAgKiBUT0RPOiBUaGlzIHdpbGwgYmUgZGVwcmVjYXRlZCBiZWNhdXNlIHN0 YXRlIHNob3VsZCBhbHdheXMga2VlcCBhIGNvbnNpc3RlbnQKKyAgICogdHlwZSBzaWduYXR1cmUg YW5kIHRoZSBvbmx5IHVzZSBjYXNlIGZvciB0aGlzLCBpcyB0byBhdm9pZCB0aGF0LgorICAgKi8K KyAgcmVwbGFjZVN0YXRlOiBmdW5jdGlvbiAobmV3U3RhdGUsIGNhbGxiYWNrKSB7CisgICAgdGhp cy51cGRhdGVyLmVucXVldWVSZXBsYWNlU3RhdGUodGhpcywgbmV3U3RhdGUpOworICAgIGlmIChj YWxsYmFjaykgeworICAgICAgdGhpcy51cGRhdGVyLmVucXVldWVDYWxsYmFjayh0aGlzLCBjYWxs YmFjaywgJ3JlcGxhY2VTdGF0ZScpOworICAgIH0KKyAgfSwKKworICAvKioKKyAgICogQ2hlY2tz IHdoZXRoZXIgb3Igbm90IHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCBpcyBtb3VudGVkLgorICAg KiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIG1vdW50ZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAg ICogQHByb3RlY3RlZAorICAgKiBAZmluYWwKKyAgICovCisgIGlzTW91bnRlZDogZnVuY3Rpb24g KCkgeworICAgIHJldHVybiB0aGlzLnVwZGF0ZXIuaXNNb3VudGVkKHRoaXMpOworICB9Cit9Owor Cit2YXIgUmVhY3RDbGFzc0NvbXBvbmVudCA9IGZ1bmN0aW9uICgpIHt9OworX2Fzc2lnbihSZWFj dENsYXNzQ29tcG9uZW50LnByb3RvdHlwZSwgUmVhY3RDb21wb25lbnQucHJvdG90eXBlLCBSZWFj dENsYXNzTWl4aW4pOworCisvKioKKyAqIE1vZHVsZSBmb3IgY3JlYXRpbmcgY29tcG9zaXRlIGNv bXBvbmVudHMuCisgKgorICogQGNsYXNzIFJlYWN0Q2xhc3MKKyAqLwordmFyIFJlYWN0Q2xhc3Mg PSB7CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBjb21wb3NpdGUgY29tcG9uZW50IGNsYXNzIGdp dmVuIGEgY2xhc3Mgc3BlY2lmaWNhdGlvbi4KKyAgICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0 aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNyZWF0ZWNsYXNzCisg ICAqCisgICAqIEBwYXJhbSB7b2JqZWN0fSBzcGVjIENsYXNzIHNwZWNpZmljYXRpb24gKHdoaWNo IG11c3QgZGVmaW5lIGByZW5kZXJgKS4KKyAgICogQHJldHVybiB7ZnVuY3Rpb259IENvbXBvbmVu dCBjb25zdHJ1Y3RvciBmdW5jdGlvbi4KKyAgICogQHB1YmxpYworICAgKi8KKyAgY3JlYXRlQ2xh c3M6IGZ1bmN0aW9uIChzcGVjKSB7CisgICAgLy8gVG8ga2VlcCBvdXIgd2FybmluZ3MgbW9yZSB1 bmRlcnN0YW5kYWJsZSwgd2UnbGwgdXNlIGEgbGl0dGxlIGhhY2sgaGVyZSB0bworICAgIC8vIGVu c3VyZSB0aGF0IENvbnN0cnVjdG9yLm5hbWUgIT09ICdDb25zdHJ1Y3RvcicuIFRoaXMgbWFrZXMg c3VyZSB3ZSBkb24ndAorICAgIC8vIHVubmVjZXNzYXJpbHkgaWRlbnRpZnkgYSBjbGFzcyB3aXRo b3V0IGRpc3BsYXlOYW1lIGFzICdDb25zdHJ1Y3RvcicuCisgICAgdmFyIENvbnN0cnVjdG9yID0g aWRlbnRpdHkoZnVuY3Rpb24gKHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7CisgICAgICAvLyBU aGlzIGNvbnN0cnVjdG9yIGdldHMgb3ZlcnJpZGRlbiBieSBtb2Nrcy4gVGhlIGFyZ3VtZW50IGlz IHVzZWQKKyAgICAgIC8vIGJ5IG1vY2tzIHRvIGFzc2VydCBvbiB3aGF0IGdldHMgbW91bnRlZC4K KworICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgICAi ZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHRoaXMgaW5zdGFuY2VvZiBD b25zdHJ1Y3RvciwgJ1NvbWV0aGluZyBpcyBjYWxsaW5nIGEgUmVhY3QgY29tcG9uZW50IGRpcmVj dGx5LiBVc2UgYSBmYWN0b3J5IG9yICcgKyAnSlNYIGluc3RlYWQuIFNlZTogaHR0cHM6Ly9mYi5t ZS9yZWFjdC1sZWdhY3lmYWN0b3J5JykgOiB2b2lkIDA7CisgICAgICB9CisKKyAgICAgIC8vIFdp cmUgdXAgYXV0by1iaW5kaW5nCisgICAgICBpZiAodGhpcy5fX3JlYWN0QXV0b0JpbmRQYWlycy5s ZW5ndGgpIHsKKyAgICAgICAgYmluZEF1dG9CaW5kTWV0aG9kcyh0aGlzKTsKKyAgICAgIH0KKwor ICAgICAgdGhpcy5wcm9wcyA9IHByb3BzOworICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsK KyAgICAgIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0OworICAgICAgdGhpcy51cGRhdGVyID0gdXBk YXRlciB8fCBSZWFjdE5vb3BVcGRhdGVRdWV1ZTsKKworICAgICAgdGhpcy5zdGF0ZSA9IG51bGw7 CisKKyAgICAgIC8vIFJlYWN0Q2xhc3NlcyBkb2Vzbid0IGhhdmUgY29uc3RydWN0b3JzLiBJbnN0 ZWFkLCB0aGV5IHVzZSB0aGUKKyAgICAgIC8vIGdldEluaXRpYWxTdGF0ZSBhbmQgY29tcG9uZW50 V2lsbE1vdW50IG1ldGhvZHMgZm9yIGluaXRpYWxpemF0aW9uLgorCisgICAgICB2YXIgaW5pdGlh bFN0YXRlID0gdGhpcy5nZXRJbml0aWFsU3RhdGUgPyB0aGlzLmdldEluaXRpYWxTdGF0ZSgpIDog bnVsbDsKKyAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAg ICAgLy8gV2UgYWxsb3cgYXV0by1tb2NrcyB0byBwcm9jZWVkIGFzIGlmIHRoZXkncmUgcmV0dXJu aW5nIG51bGwuCisgICAgICAgIGlmIChpbml0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCAmJiB0aGlz LmdldEluaXRpYWxTdGF0ZS5faXNNb2NrRnVuY3Rpb24pIHsKKyAgICAgICAgICAvLyBUaGlzIGlz IHByb2JhYmx5IGJhZCBwcmFjdGljZS4gQ29uc2lkZXIgd2FybmluZyBoZXJlIGFuZAorICAgICAg ICAgIC8vIGRlcHJlY2F0aW5nIHRoaXMgY29udmVuaWVuY2UuCisgICAgICAgICAgaW5pdGlhbFN0 YXRlID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgISh0eXBlb2YgaW5pdGlhbFN0 YXRlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShpbml0aWFsU3RhdGUpKSA/ICJkZXZl bG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJyVzLmdldEluaXRp YWxTdGF0ZSgpOiBtdXN0IHJldHVybiBhbiBvYmplY3Qgb3IgbnVsbCcsIENvbnN0cnVjdG9yLmRp c3BsYXlOYW1lIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcpIDogX3Byb2RJbnZhcmlhbnQo JzgyJywgQ29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50 JykgOiB2b2lkIDA7CisKKyAgICAgIHRoaXMuc3RhdGUgPSBpbml0aWFsU3RhdGU7CisgICAgfSk7 CisgICAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gbmV3IFJlYWN0Q2xhc3NDb21wb25lbnQoKTsK KyAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb25zdHJ1Y3RvcjsKKyAg ICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUuX19yZWFjdEF1dG9CaW5kUGFpcnMgPSBbXTsKKworICAg IGluamVjdGVkTWl4aW5zLmZvckVhY2gobWl4U3BlY0ludG9Db21wb25lbnQuYmluZChudWxsLCBD b25zdHJ1Y3RvcikpOworCisgICAgbWl4U3BlY0ludG9Db21wb25lbnQoQ29uc3RydWN0b3IsIHNw ZWMpOworCisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdFByb3BzIHByb3BlcnR5IGFmdGVy IGFsbCBtaXhpbnMgaGF2ZSBiZWVuIG1lcmdlZC4KKyAgICBpZiAoQ29uc3RydWN0b3IuZ2V0RGVm YXVsdFByb3BzKSB7CisgICAgICBDb25zdHJ1Y3Rvci5kZWZhdWx0UHJvcHMgPSBDb25zdHJ1Y3Rv ci5nZXREZWZhdWx0UHJvcHMoKTsKKyAgICB9CisKKyAgICBpZiAoImRldmVsb3BtZW50IiAhPT0g J3Byb2R1Y3Rpb24nKSB7CisgICAgICAvLyBUaGlzIGlzIGEgdGFnIHRvIGluZGljYXRlIHRoYXQg dGhlIHVzZSBvZiB0aGVzZSBtZXRob2QgbmFtZXMgaXMgb2ssCisgICAgICAvLyBzaW5jZSBpdCdz IHVzZWQgd2l0aCBjcmVhdGVDbGFzcy4gSWYgaXQncyBub3QsIHRoZW4gaXQncyBsaWtlbHkgYQor ICAgICAgLy8gbWlzdGFrZSBzbyB3ZSdsbCB3YXJuIHlvdSB0byB1c2UgdGhlIHN0YXRpYyBwcm9w ZXJ0eSwgcHJvcGVydHkKKyAgICAgIC8vIGluaXRpYWxpemVyIG9yIGNvbnN0cnVjdG9yIHJlc3Bl Y3RpdmVseS4KKyAgICAgIGlmIChDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMpIHsKKyAgICAg ICAgQ29uc3RydWN0b3IuZ2V0RGVmYXVsdFByb3BzLmlzUmVhY3RDbGFzc0FwcHJvdmVkID0ge307 CisgICAgICB9CisgICAgICBpZiAoQ29uc3RydWN0b3IucHJvdG90eXBlLmdldEluaXRpYWxTdGF0 ZSkgeworICAgICAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUuZ2V0SW5pdGlhbFN0YXRlLmlzUmVh Y3RDbGFzc0FwcHJvdmVkID0ge307CisgICAgICB9CisgICAgfQorCisgICAgIUNvbnN0cnVjdG9y LnByb3RvdHlwZS5yZW5kZXIgPyAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZh cmlhbnQoZmFsc2UsICdjcmVhdGVDbGFzcyguLi4pOiBDbGFzcyBzcGVjaWZpY2F0aW9uIG11c3Qg aW1wbGVtZW50IGEgYHJlbmRlcmAgbWV0aG9kLicpIDogX3Byb2RJbnZhcmlhbnQoJzgzJykgOiB2 b2lkIDA7CisKKyAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAg ICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFDb25zdHJ1Y3Rvci5w cm90b3R5cGUuY29tcG9uZW50U2hvdWxkVXBkYXRlLCAnJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAn ICsgJ2NvbXBvbmVudFNob3VsZFVwZGF0ZSgpLiBEaWQgeW91IG1lYW4gc2hvdWxkQ29tcG9uZW50 VXBkYXRlKCk/ICcgKyAnVGhlIG5hbWUgaXMgcGhyYXNlZCBhcyBhIHF1ZXN0aW9uIGJlY2F1c2Ug dGhlIGZ1bmN0aW9uIGlzICcgKyAnZXhwZWN0ZWQgdG8gcmV0dXJuIGEgdmFsdWUuJywgc3BlYy5k aXNwbGF5TmFtZSB8fCAnQSBjb21wb25lbnQnKSA6IHZvaWQgMDsKKyAgICAgICJkZXZlbG9wbWVu dCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIUNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb21w b25lbnRXaWxsUmVjaWV2ZVByb3BzLCAnJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBv bmVudFdpbGxSZWNpZXZlUHJvcHMoKS4gRGlkIHlvdSBtZWFuIGNvbXBvbmVudFdpbGxSZWNlaXZl UHJvcHMoKT8nLCBzcGVjLmRpc3BsYXlOYW1lIHx8ICdBIGNvbXBvbmVudCcpIDogdm9pZCAwOwor ICAgIH0KKworICAgIC8vIFJlZHVjZSB0aW1lIHNwZW50IGRvaW5nIGxvb2t1cHMgYnkgc2V0dGlu ZyB0aGVzZSBvbiB0aGUgcHJvdG90eXBlLgorICAgIGZvciAodmFyIG1ldGhvZE5hbWUgaW4gUmVh Y3RDbGFzc0ludGVyZmFjZSkgeworICAgICAgaWYgKCFDb25zdHJ1Y3Rvci5wcm90b3R5cGVbbWV0 aG9kTmFtZV0pIHsKKyAgICAgICAgQ29uc3RydWN0b3IucHJvdG90eXBlW21ldGhvZE5hbWVdID0g bnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQ29uc3RydWN0b3I7CisgIH0sCisK KyAgaW5qZWN0aW9uOiB7CisgICAgaW5qZWN0TWl4aW46IGZ1bmN0aW9uIChtaXhpbikgeworICAg ICAgaW5qZWN0ZWRNaXhpbnMucHVzaChtaXhpbik7CisgICAgfQorICB9CisKK307CisKK21vZHVs ZS5leHBvcnRzID0gUmVhY3RDbGFzczsKK30seyIxMCI6MTAsIjEzIjoxMywiMTQiOjE0LCIyNCI6 MjQsIjI3IjoyNywiMjgiOjI4LCIyOSI6MjksIjMwIjozMCwiNiI6Nn1dLDY6W2Z1bmN0aW9uKF9k ZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBG YWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJj ZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0 aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2Ug dHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91 bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisK Kyd1c2Ugc3RyaWN0JzsKKwordmFyIF9wcm9kSW52YXJpYW50ID0gX2RlcmVxXygyNCk7CisKK3Zh ciBSZWFjdE5vb3BVcGRhdGVRdWV1ZSA9IF9kZXJlcV8oMTMpOworCit2YXIgY2FuRGVmaW5lUHJv cGVydHkgPSBfZGVyZXFfKDIwKTsKK3ZhciBlbXB0eU9iamVjdCA9IF9kZXJlcV8oMjcpOwordmFy IGludmFyaWFudCA9IF9kZXJlcV8oMjgpOwordmFyIHdhcm5pbmcgPSBfZGVyZXFfKDI5KTsKKwor LyoqCisgKiBCYXNlIGNsYXNzIGhlbHBlcnMgZm9yIHRoZSB1cGRhdGluZyBzdGF0ZSBvZiBhIGNv bXBvbmVudC4KKyAqLworZnVuY3Rpb24gUmVhY3RDb21wb25lbnQocHJvcHMsIGNvbnRleHQsIHVw ZGF0ZXIpIHsKKyAgdGhpcy5wcm9wcyA9IHByb3BzOworICB0aGlzLmNvbnRleHQgPSBjb250ZXh0 OworICB0aGlzLnJlZnMgPSBlbXB0eU9iamVjdDsKKyAgLy8gV2UgaW5pdGlhbGl6ZSB0aGUgZGVm YXVsdCB1cGRhdGVyIGJ1dCB0aGUgcmVhbCBvbmUgZ2V0cyBpbmplY3RlZCBieSB0aGUKKyAgLy8g cmVuZGVyZXIuCisgIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVl dWU7Cit9CisKK1JlYWN0Q29tcG9uZW50LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50ID0ge307 CisKKy8qKgorICogU2V0cyBhIHN1YnNldCBvZiB0aGUgc3RhdGUuIEFsd2F5cyB1c2UgdGhpcyB0 byBtdXRhdGUKKyAqIHN0YXRlLiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11 dGFibGUuCisgKgorICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYHRoaXMuc3RhdGVgIHdp bGwgYmUgaW1tZWRpYXRlbHkgdXBkYXRlZCwgc28KKyAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAg YWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuCisgKgor ICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgY2FsbHMgdG8gYHNldFN0YXRlYCB3aWxsIHJ1 biBzeW5jaHJvbm91c2x5LAorICogYXMgdGhleSBtYXkgZXZlbnR1YWxseSBiZSBiYXRjaGVkIHRv Z2V0aGVyLiAgWW91IGNhbiBwcm92aWRlIGFuIG9wdGlvbmFsCisgKiBjYWxsYmFjayB0aGF0IHdp bGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgY2FsbCB0byBzZXRTdGF0ZSBpcyBhY3R1YWxseQorICog Y29tcGxldGVkLgorICoKKyAqIFdoZW4gYSBmdW5jdGlvbiBpcyBwcm92aWRlZCB0byBzZXRTdGF0 ZSwgaXQgd2lsbCBiZSBjYWxsZWQgYXQgc29tZSBwb2ludCBpbgorICogdGhlIGZ1dHVyZSAobm90 IHN5bmNocm9ub3VzbHkpLiBJdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSB1cCB0byBkYXRlCisg KiBjb21wb25lbnQgYXJndW1lbnRzIChzdGF0ZSwgcHJvcHMsIGNvbnRleHQpLiBUaGVzZSB2YWx1 ZXMgY2FuIGJlIGRpZmZlcmVudAorICogZnJvbSB0aGlzLiogYmVjYXVzZSB5b3VyIGZ1bmN0aW9u IG1heSBiZSBjYWxsZWQgYWZ0ZXIgcmVjZWl2ZVByb3BzIGJ1dCBiZWZvcmUKKyAqIHNob3VsZENv bXBvbmVudFVwZGF0ZSwgYW5kIHRoaXMgbmV3IHN0YXRlLCBwcm9wcywgYW5kIGNvbnRleHQgd2ls bCBub3QgeWV0IGJlCisgKiBhc3NpZ25lZCB0byB0aGlzLgorICoKKyAqIEBwYXJhbSB7b2JqZWN0 fGZ1bmN0aW9ufSBwYXJ0aWFsU3RhdGUgTmV4dCBwYXJ0aWFsIHN0YXRlIG9yIGZ1bmN0aW9uIHRv CisgKiAgICAgICAgcHJvZHVjZSBuZXh0IHBhcnRpYWwgc3RhdGUgdG8gYmUgbWVyZ2VkIHdpdGgg Y3VycmVudCBzdGF0ZS4KKyAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0 ZXIgc3RhdGUgaXMgdXBkYXRlZC4KKyAqIEBmaW5hbAorICogQHByb3RlY3RlZAorICovCitSZWFj dENvbXBvbmVudC5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAocGFydGlhbFN0YXRlLCBj YWxsYmFjaykgeworICAhKHR5cGVvZiBwYXJ0aWFsU3RhdGUgPT09ICdvYmplY3QnIHx8IHR5cGVv ZiBwYXJ0aWFsU3RhdGUgPT09ICdmdW5jdGlvbicgfHwgcGFydGlhbFN0YXRlID09IG51bGwpID8g ImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnc2V0U3Rh dGUoLi4uKTogdGFrZXMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcyB0byB1cGRhdGUgb3Ig YSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMuJykg OiBfcHJvZEludmFyaWFudCgnODUnKSA6IHZvaWQgMDsKKyAgdGhpcy51cGRhdGVyLmVucXVldWVT ZXRTdGF0ZSh0aGlzLCBwYXJ0aWFsU3RhdGUpOworICBpZiAoY2FsbGJhY2spIHsKKyAgICB0aGlz LnVwZGF0ZXIuZW5xdWV1ZUNhbGxiYWNrKHRoaXMsIGNhbGxiYWNrLCAnc2V0U3RhdGUnKTsKKyAg fQorfTsKKworLyoqCisgKiBGb3JjZXMgYW4gdXBkYXRlLiBUaGlzIHNob3VsZCBvbmx5IGJlIGlu dm9rZWQgd2hlbiBpdCBpcyBrbm93biB3aXRoCisgKiBjZXJ0YWludHkgdGhhdCB3ZSBhcmUgKipu b3QqKiBpbiBhIERPTSB0cmFuc2FjdGlvbi4KKyAqCisgKiBZb3UgbWF5IHdhbnQgdG8gY2FsbCB0 aGlzIHdoZW4geW91IGtub3cgdGhhdCBzb21lIGRlZXBlciBhc3BlY3Qgb2YgdGhlCisgKiBjb21w b25lbnQncyBzdGF0ZSBoYXMgY2hhbmdlZCBidXQgYHNldFN0YXRlYCB3YXMgbm90IGNhbGxlZC4K KyAqCisgKiBUaGlzIHdpbGwgbm90IGludm9rZSBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCwgYnV0 IGl0IHdpbGwgaW52b2tlCisgKiBgY29tcG9uZW50V2lsbFVwZGF0ZWAgYW5kIGBjb21wb25lbnRE aWRVcGRhdGVgLgorICoKKyAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0 ZXIgdXBkYXRlIGlzIGNvbXBsZXRlLgorICogQGZpbmFsCisgKiBAcHJvdGVjdGVkCisgKi8KK1Jl YWN0Q29tcG9uZW50LnByb3RvdHlwZS5mb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykg eworICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMpOworICBpZiAoY2FsbGJh Y2spIHsKKyAgICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZUNhbGxiYWNrKHRoaXMsIGNhbGxiYWNrLCAn Zm9yY2VVcGRhdGUnKTsKKyAgfQorfTsKKworLyoqCisgKiBEZXByZWNhdGVkIEFQSXMuIFRoZXNl IEFQSXMgdXNlZCB0byBleGlzdCBvbiBjbGFzc2ljIFJlYWN0IGNsYXNzZXMgYnV0IHNpbmNlCisg KiB3ZSB3b3VsZCBsaWtlIHRvIGRlcHJlY2F0ZSB0aGVtLCB3ZSdyZSBub3QgZ29pbmcgdG8gbW92 ZSB0aGVtIG92ZXIgdG8gdGhpcworICogbW9kZXJuIGJhc2UgY2xhc3MuIEluc3RlYWQsIHdlIGRl ZmluZSBhIGdldHRlciB0aGF0IHdhcm5zIGlmIGl0J3MgYWNjZXNzZWQuCisgKi8KK2lmICgiZGV2 ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgdmFyIGRlcHJlY2F0ZWRBUElzID0gewor ICAgIGlzTW91bnRlZDogWydpc01vdW50ZWQnLCAnSW5zdGVhZCwgbWFrZSBzdXJlIHRvIGNsZWFu IHVwIHN1YnNjcmlwdGlvbnMgYW5kIHBlbmRpbmcgcmVxdWVzdHMgaW4gJyArICdjb21wb25lbnRX aWxsVW5tb3VudCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy4nXSwKKyAgICByZXBsYWNlU3RhdGU6 IFsncmVwbGFjZVN0YXRlJywgJ1JlZmFjdG9yIHlvdXIgY29kZSB0byB1c2Ugc2V0U3RhdGUgaW5z dGVhZCAoc2VlICcgKyAnaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8z MjM2KS4nXQorICB9OworICB2YXIgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nID0gZnVuY3Rpb24g KG1ldGhvZE5hbWUsIGluZm8pIHsKKyAgICBpZiAoY2FuRGVmaW5lUHJvcGVydHkpIHsKKyAgICAg IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFjdENvbXBvbmVudC5wcm90b3R5cGUsIG1ldGhvZE5h bWUsIHsKKyAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgImRldmVsb3BtZW50 IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJyVzKC4uLikgaXMgZGVwcmVjYXRl ZCBpbiBwbGFpbiBKYXZhU2NyaXB0IFJlYWN0IGNsYXNzZXMuICVzJywgaW5mb1swXSwgaW5mb1sx XSkgOiB2b2lkIDA7CisgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICAgICAgfQorICAg ICAgfSk7CisgICAgfQorICB9OworICBmb3IgKHZhciBmbk5hbWUgaW4gZGVwcmVjYXRlZEFQSXMp IHsKKyAgICBpZiAoZGVwcmVjYXRlZEFQSXMuaGFzT3duUHJvcGVydHkoZm5OYW1lKSkgeworICAg ICAgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nKGZuTmFtZSwgZGVwcmVjYXRlZEFQSXNbZm5OYW1l XSk7CisgICAgfQorICB9Cit9CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RDb21wb25lbnQ7Cit9 LHsiMTMiOjEzLCIyMCI6MjAsIjI0IjoyNCwiMjciOjI3LCIyOCI6MjgsIjI5IjoyOX1dLDc6W2Z1 bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxNi1w cmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBU aGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBm b3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhp cyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBj YW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisg KgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX3Byb2RJbnZhcmlhbnQgPSBfZGVy ZXFfKDI0KTsKKwordmFyIFJlYWN0Q3VycmVudE93bmVyID0gX2RlcmVxXyg4KTsKKwordmFyIGlu dmFyaWFudCA9IF9kZXJlcV8oMjgpOwordmFyIHdhcm5pbmcgPSBfZGVyZXFfKDI5KTsKKworZnVu Y3Rpb24gaXNOYXRpdmUoZm4pIHsKKyAgLy8gQmFzZWQgb24gaXNOYXRpdmUoKSBmcm9tIExvZGFz aAorICB2YXIgZnVuY1RvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nOworICB2 YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5OworICB2 YXIgcmVJc05hdGl2ZSA9IFJlZ0V4cCgnXicgKyBmdW5jVG9TdHJpbmcKKyAgLy8gVGFrZSBhbiBl eGFtcGxlIG5hdGl2ZSBmdW5jdGlvbiBzb3VyY2UgZm9yIGNvbXBhcmlzb24KKyAgLmNhbGwoaGFz T3duUHJvcGVydHkpCisgIC8vIFN0cmlwIHJlZ2V4IGNoYXJhY3RlcnMgc28gd2UgY2FuIHVzZSBp dCBmb3IgcmVnZXgKKyAgLnJlcGxhY2UoL1tcXF4kLiorPygpW1xde318XS9nLCAnXFwkJicpCisg IC8vIFJlbW92ZSBoYXNPd25Qcm9wZXJ0eSBmcm9tIHRoZSB0ZW1wbGF0ZSB0byBtYWtlIGl0IGdl bmVyaWMKKyAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwg Zm9yIC4rPyg/PVxcXF0pL2csICckMS4qPycpICsgJyQnKTsKKyAgdHJ5IHsKKyAgICB2YXIgc291 cmNlID0gZnVuY1RvU3RyaW5nLmNhbGwoZm4pOworICAgIHJldHVybiByZUlzTmF0aXZlLnRlc3Qo c291cmNlKTsKKyAgfSBjYXRjaCAoZXJyKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisK K3ZhciBjYW5Vc2VDb2xsZWN0aW9ucyA9CisvLyBBcnJheS5mcm9tCit0eXBlb2YgQXJyYXkuZnJv bSA9PT0gJ2Z1bmN0aW9uJyAmJgorLy8gTWFwCit0eXBlb2YgTWFwID09PSAnZnVuY3Rpb24nICYm IGlzTmF0aXZlKE1hcCkgJiYKKy8vIE1hcC5wcm90b3R5cGUua2V5cworTWFwLnByb3RvdHlwZSAh PSBudWxsICYmIHR5cGVvZiBNYXAucHJvdG90eXBlLmtleXMgPT09ICdmdW5jdGlvbicgJiYgaXNO YXRpdmUoTWFwLnByb3RvdHlwZS5rZXlzKSAmJgorLy8gU2V0Cit0eXBlb2YgU2V0ID09PSAnZnVu Y3Rpb24nICYmIGlzTmF0aXZlKFNldCkgJiYKKy8vIFNldC5wcm90b3R5cGUua2V5cworU2V0LnBy b3RvdHlwZSAhPSBudWxsICYmIHR5cGVvZiBTZXQucHJvdG90eXBlLmtleXMgPT09ICdmdW5jdGlv bicgJiYgaXNOYXRpdmUoU2V0LnByb3RvdHlwZS5rZXlzKTsKKwordmFyIHNldEl0ZW07Cit2YXIg Z2V0SXRlbTsKK3ZhciByZW1vdmVJdGVtOwordmFyIGdldEl0ZW1JRHM7Cit2YXIgYWRkUm9vdDsK K3ZhciByZW1vdmVSb290OwordmFyIGdldFJvb3RJRHM7CisKK2lmIChjYW5Vc2VDb2xsZWN0aW9u cykgeworICB2YXIgaXRlbU1hcCA9IG5ldyBNYXAoKTsKKyAgdmFyIHJvb3RJRFNldCA9IG5ldyBT ZXQoKTsKKworICBzZXRJdGVtID0gZnVuY3Rpb24gKGlkLCBpdGVtKSB7CisgICAgaXRlbU1hcC5z ZXQoaWQsIGl0ZW0pOworICB9OworICBnZXRJdGVtID0gZnVuY3Rpb24gKGlkKSB7CisgICAgcmV0 dXJuIGl0ZW1NYXAuZ2V0KGlkKTsKKyAgfTsKKyAgcmVtb3ZlSXRlbSA9IGZ1bmN0aW9uIChpZCkg eworICAgIGl0ZW1NYXBbJ2RlbGV0ZSddKGlkKTsKKyAgfTsKKyAgZ2V0SXRlbUlEcyA9IGZ1bmN0 aW9uICgpIHsKKyAgICByZXR1cm4gQXJyYXkuZnJvbShpdGVtTWFwLmtleXMoKSk7CisgIH07CisK KyAgYWRkUm9vdCA9IGZ1bmN0aW9uIChpZCkgeworICAgIHJvb3RJRFNldC5hZGQoaWQpOworICB9 OworICByZW1vdmVSb290ID0gZnVuY3Rpb24gKGlkKSB7CisgICAgcm9vdElEU2V0WydkZWxldGUn XShpZCk7CisgIH07CisgIGdldFJvb3RJRHMgPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIEFy cmF5LmZyb20ocm9vdElEU2V0LmtleXMoKSk7CisgIH07Cit9IGVsc2UgeworICB2YXIgaXRlbUJ5 S2V5ID0ge307CisgIHZhciByb290QnlLZXkgPSB7fTsKKworICAvLyBVc2Ugbm9uLW51bWVyaWMg a2V5cyB0byBwcmV2ZW50IFY4IHBlcmZvcm1hbmNlIGlzc3VlczoKKyAgLy8gaHR0cHM6Ly9naXRo dWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNzIzMgorICB2YXIgZ2V0S2V5RnJvbUlEID0gZnVu Y3Rpb24gKGlkKSB7CisgICAgcmV0dXJuICcuJyArIGlkOworICB9OworICB2YXIgZ2V0SURGcm9t S2V5ID0gZnVuY3Rpb24gKGtleSkgeworICAgIHJldHVybiBwYXJzZUludChrZXkuc3Vic3RyKDEp LCAxMCk7CisgIH07CisKKyAgc2V0SXRlbSA9IGZ1bmN0aW9uIChpZCwgaXRlbSkgeworICAgIHZh ciBrZXkgPSBnZXRLZXlGcm9tSUQoaWQpOworICAgIGl0ZW1CeUtleVtrZXldID0gaXRlbTsKKyAg fTsKKyAgZ2V0SXRlbSA9IGZ1bmN0aW9uIChpZCkgeworICAgIHZhciBrZXkgPSBnZXRLZXlGcm9t SUQoaWQpOworICAgIHJldHVybiBpdGVtQnlLZXlba2V5XTsKKyAgfTsKKyAgcmVtb3ZlSXRlbSA9 IGZ1bmN0aW9uIChpZCkgeworICAgIHZhciBrZXkgPSBnZXRLZXlGcm9tSUQoaWQpOworICAgIGRl bGV0ZSBpdGVtQnlLZXlba2V5XTsKKyAgfTsKKyAgZ2V0SXRlbUlEcyA9IGZ1bmN0aW9uICgpIHsK KyAgICByZXR1cm4gT2JqZWN0LmtleXMoaXRlbUJ5S2V5KS5tYXAoZ2V0SURGcm9tS2V5KTsKKyAg fTsKKworICBhZGRSb290ID0gZnVuY3Rpb24gKGlkKSB7CisgICAgdmFyIGtleSA9IGdldEtleUZy b21JRChpZCk7CisgICAgcm9vdEJ5S2V5W2tleV0gPSB0cnVlOworICB9OworICByZW1vdmVSb290 ID0gZnVuY3Rpb24gKGlkKSB7CisgICAgdmFyIGtleSA9IGdldEtleUZyb21JRChpZCk7CisgICAg ZGVsZXRlIHJvb3RCeUtleVtrZXldOworICB9OworICBnZXRSb290SURzID0gZnVuY3Rpb24gKCkg eworICAgIHJldHVybiBPYmplY3Qua2V5cyhyb290QnlLZXkpLm1hcChnZXRJREZyb21LZXkpOwor ICB9OworfQorCit2YXIgdW5tb3VudGVkSURzID0gW107CisKK2Z1bmN0aW9uIHB1cmdlRGVlcChp ZCkgeworICB2YXIgaXRlbSA9IGdldEl0ZW0oaWQpOworICBpZiAoaXRlbSkgeworICAgIHZhciBj aGlsZElEcyA9IGl0ZW0uY2hpbGRJRHM7CisKKyAgICByZW1vdmVJdGVtKGlkKTsKKyAgICBjaGls ZElEcy5mb3JFYWNoKHB1cmdlRGVlcCk7CisgIH0KK30KKworZnVuY3Rpb24gZGVzY3JpYmVDb21w b25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyTmFtZSkgeworICByZXR1cm4gJ1xuICAgIGlu ICcgKyAobmFtZSB8fCAnVW5rbm93bicpICsgKHNvdXJjZSA/ICcgKGF0ICcgKyBzb3VyY2UuZmls ZU5hbWUucmVwbGFjZSgvXi4qW1xcXC9dLywgJycpICsgJzonICsgc291cmNlLmxpbmVOdW1iZXIg KyAnKScgOiBvd25lck5hbWUgPyAnIChjcmVhdGVkIGJ5ICcgKyBvd25lck5hbWUgKyAnKScgOiAn Jyk7Cit9CisKK2Z1bmN0aW9uIGdldERpc3BsYXlOYW1lKGVsZW1lbnQpIHsKKyAgaWYgKGVsZW1l bnQgPT0gbnVsbCkgeworICAgIHJldHVybiAnI2VtcHR5JzsKKyAgfSBlbHNlIGlmICh0eXBlb2Yg ZWxlbWVudCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGVsZW1lbnQgPT09ICdudW1iZXInKSB7Cisg ICAgcmV0dXJuICcjdGV4dCc7CisgIH0gZWxzZSBpZiAodHlwZW9mIGVsZW1lbnQudHlwZSA9PT0g J3N0cmluZycpIHsKKyAgICByZXR1cm4gZWxlbWVudC50eXBlOworICB9IGVsc2UgeworICAgIHJl dHVybiBlbGVtZW50LnR5cGUuZGlzcGxheU5hbWUgfHwgZWxlbWVudC50eXBlLm5hbWUgfHwgJ1Vu a25vd24nOworICB9Cit9CisKK2Z1bmN0aW9uIGRlc2NyaWJlSUQoaWQpIHsKKyAgdmFyIG5hbWUg PSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldERpc3BsYXlOYW1lKGlkKTsKKyAgdmFyIGVsZW1l bnQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldEVsZW1lbnQoaWQpOworICB2YXIgb3duZXJJ RCA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0T3duZXJJRChpZCk7CisgIHZhciBvd25lck5h bWU7CisgIGlmIChvd25lcklEKSB7CisgICAgb3duZXJOYW1lID0gUmVhY3RDb21wb25lbnRUcmVl SG9vay5nZXREaXNwbGF5TmFtZShvd25lcklEKTsKKyAgfQorICAiZGV2ZWxvcG1lbnQiICE9PSAn cHJvZHVjdGlvbicgPyB3YXJuaW5nKGVsZW1lbnQsICdSZWFjdENvbXBvbmVudFRyZWVIb29rOiBN aXNzaW5nIFJlYWN0IGVsZW1lbnQgZm9yIGRlYnVnSUQgJXMgd2hlbiAnICsgJ2J1aWxkaW5nIHN0 YWNrJywgaWQpIDogdm9pZCAwOworICByZXR1cm4gZGVzY3JpYmVDb21wb25lbnRGcmFtZShuYW1l LCBlbGVtZW50ICYmIGVsZW1lbnQuX3NvdXJjZSwgb3duZXJOYW1lKTsKK30KKwordmFyIFJlYWN0 Q29tcG9uZW50VHJlZUhvb2sgPSB7CisgIG9uU2V0Q2hpbGRyZW46IGZ1bmN0aW9uIChpZCwgbmV4 dENoaWxkSURzKSB7CisgICAgdmFyIGl0ZW0gPSBnZXRJdGVtKGlkKTsKKyAgICAhaXRlbSA/ICJk ZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0l0ZW0gbXVz dCBoYXZlIGJlZW4gc2V0JykgOiBfcHJvZEludmFyaWFudCgnMTQ0JykgOiB2b2lkIDA7CisgICAg aXRlbS5jaGlsZElEcyA9IG5leHRDaGlsZElEczsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwg bmV4dENoaWxkSURzLmxlbmd0aDsgaSsrKSB7CisgICAgICB2YXIgbmV4dENoaWxkSUQgPSBuZXh0 Q2hpbGRJRHNbaV07CisgICAgICB2YXIgbmV4dENoaWxkID0gZ2V0SXRlbShuZXh0Q2hpbGRJRCk7 CisgICAgICAhbmV4dENoaWxkID8gImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52 YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgaG9vayBldmVudHMgdG8gZmlyZSBmb3IgdGhlIGNoaWxk IGJlZm9yZSBpdHMgcGFyZW50IGluY2x1ZGVzIGl0IGluIG9uU2V0Q2hpbGRyZW4oKS4nKSA6IF9w cm9kSW52YXJpYW50KCcxNDAnKSA6IHZvaWQgMDsKKyAgICAgICEobmV4dENoaWxkLmNoaWxkSURz ICE9IG51bGwgfHwgdHlwZW9mIG5leHRDaGlsZC5lbGVtZW50ICE9PSAnb2JqZWN0JyB8fCBuZXh0 Q2hpbGQuZWxlbWVudCA9PSBudWxsKSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/ IGludmFyaWFudChmYWxzZSwgJ0V4cGVjdGVkIG9uU2V0Q2hpbGRyZW4oKSB0byBmaXJlIGZvciBh IGNvbnRhaW5lciBjaGlsZCBiZWZvcmUgaXRzIHBhcmVudCBpbmNsdWRlcyBpdCBpbiBvblNldENo aWxkcmVuKCkuJykgOiBfcHJvZEludmFyaWFudCgnMTQxJykgOiB2b2lkIDA7CisgICAgICAhbmV4 dENoaWxkLmlzTW91bnRlZCA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFy aWFudChmYWxzZSwgJ0V4cGVjdGVkIG9uTW91bnRDb21wb25lbnQoKSB0byBmaXJlIGZvciB0aGUg Y2hpbGQgYmVmb3JlIGl0cyBwYXJlbnQgaW5jbHVkZXMgaXQgaW4gb25TZXRDaGlsZHJlbigpLicp IDogX3Byb2RJbnZhcmlhbnQoJzcxJykgOiB2b2lkIDA7CisgICAgICBpZiAobmV4dENoaWxkLnBh cmVudElEID09IG51bGwpIHsKKyAgICAgICAgbmV4dENoaWxkLnBhcmVudElEID0gaWQ7CisgICAg ICAgIC8vIFRPRE86IFRoaXMgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSBidXQgbW91bnRpbmcgYSBu ZXcgcm9vdCBkdXJpbmcgaW4KKyAgICAgICAgLy8gY29tcG9uZW50V2lsbE1vdW50IGN1cnJlbnRs eSBjYXVzZXMgbm90LXlldC1tb3VudGVkIGNvbXBvbmVudHMgdG8KKyAgICAgICAgLy8gYmUgcHVy Z2VkIGZyb20gb3VyIHRyZWUgZGF0YSBzbyB0aGVpciBwYXJlbnQgaWQgaXMgbWlzc2luZy4KKyAg ICAgIH0KKyAgICAgICEobmV4dENoaWxkLnBhcmVudElEID09PSBpZCkgPyAiZGV2ZWxvcG1lbnQi ICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCBvbkJlZm9yZU1v dW50Q29tcG9uZW50KCkgcGFyZW50IGFuZCBvblNldENoaWxkcmVuKCkgdG8gYmUgY29uc2lzdGVu dCAoJXMgaGFzIHBhcmVudHMgJXMgYW5kICVzKS4nLCBuZXh0Q2hpbGRJRCwgbmV4dENoaWxkLnBh cmVudElELCBpZCkgOiBfcHJvZEludmFyaWFudCgnMTQyJywgbmV4dENoaWxkSUQsIG5leHRDaGls ZC5wYXJlbnRJRCwgaWQpIDogdm9pZCAwOworICAgIH0KKyAgfSwKKyAgb25CZWZvcmVNb3VudENv bXBvbmVudDogZnVuY3Rpb24gKGlkLCBlbGVtZW50LCBwYXJlbnRJRCkgeworICAgIHZhciBpdGVt ID0geworICAgICAgZWxlbWVudDogZWxlbWVudCwKKyAgICAgIHBhcmVudElEOiBwYXJlbnRJRCwK KyAgICAgIHRleHQ6IG51bGwsCisgICAgICBjaGlsZElEczogW10sCisgICAgICBpc01vdW50ZWQ6 IGZhbHNlLAorICAgICAgdXBkYXRlQ291bnQ6IDAKKyAgICB9OworICAgIHNldEl0ZW0oaWQsIGl0 ZW0pOworICB9LAorICBvbkJlZm9yZVVwZGF0ZUNvbXBvbmVudDogZnVuY3Rpb24gKGlkLCBlbGVt ZW50KSB7CisgICAgdmFyIGl0ZW0gPSBnZXRJdGVtKGlkKTsKKyAgICBpZiAoIWl0ZW0gfHwgIWl0 ZW0uaXNNb3VudGVkKSB7CisgICAgICAvLyBXZSBtYXkgZW5kIHVwIGhlcmUgYXMgYSByZXN1bHQg b2Ygc2V0U3RhdGUoKSBpbiBjb21wb25lbnRXaWxsVW5tb3VudCgpLgorICAgICAgLy8gSW4gdGhp cyBjYXNlLCBpZ25vcmUgdGhlIGVsZW1lbnQuCisgICAgICByZXR1cm47CisgICAgfQorICAgIGl0 ZW0uZWxlbWVudCA9IGVsZW1lbnQ7CisgIH0sCisgIG9uTW91bnRDb21wb25lbnQ6IGZ1bmN0aW9u IChpZCkgeworICAgIHZhciBpdGVtID0gZ2V0SXRlbShpZCk7CisgICAgIWl0ZW0gPyAiZGV2ZWxv cG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdJdGVtIG11c3QgaGF2 ZSBiZWVuIHNldCcpIDogX3Byb2RJbnZhcmlhbnQoJzE0NCcpIDogdm9pZCAwOworICAgIGl0ZW0u aXNNb3VudGVkID0gdHJ1ZTsKKyAgICB2YXIgaXNSb290ID0gaXRlbS5wYXJlbnRJRCA9PT0gMDsK KyAgICBpZiAoaXNSb290KSB7CisgICAgICBhZGRSb290KGlkKTsKKyAgICB9CisgIH0sCisgIG9u VXBkYXRlQ29tcG9uZW50OiBmdW5jdGlvbiAoaWQpIHsKKyAgICB2YXIgaXRlbSA9IGdldEl0ZW0o aWQpOworICAgIGlmICghaXRlbSB8fCAhaXRlbS5pc01vdW50ZWQpIHsKKyAgICAgIC8vIFdlIG1h eSBlbmQgdXAgaGVyZSBhcyBhIHJlc3VsdCBvZiBzZXRTdGF0ZSgpIGluIGNvbXBvbmVudFdpbGxV bm1vdW50KCkuCisgICAgICAvLyBJbiB0aGlzIGNhc2UsIGlnbm9yZSB0aGUgZWxlbWVudC4KKyAg ICAgIHJldHVybjsKKyAgICB9CisgICAgaXRlbS51cGRhdGVDb3VudCsrOworICB9LAorICBvblVu bW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChpZCkgeworICAgIHZhciBpdGVtID0gZ2V0SXRlbShp ZCk7CisgICAgaWYgKGl0ZW0pIHsKKyAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgaWYgaXQgZXhp c3RzLgorICAgICAgLy8gYGl0ZW1gIG1pZ2h0IG5vdCBleGlzdCBpZiBpdCBpcyBpbnNpZGUgYW4g ZXJyb3IgYm91bmRhcnksIGFuZCBhIHNpYmxpbmcKKyAgICAgIC8vIGVycm9yIGJvdW5kYXJ5IGNo aWxkIHRocmV3IHdoaWxlIG1vdW50aW5nLiBUaGVuIHRoaXMgaW5zdGFuY2UgbmV2ZXIKKyAgICAg IC8vIGdvdCBhIGNoYW5jZSB0byBtb3VudCwgYnV0IGl0IHN0aWxsIGdldHMgYW4gdW5tb3VudGlu ZyBldmVudCBkdXJpbmcKKyAgICAgIC8vIHRoZSBlcnJvciBib3VuZGFyeSBjbGVhbnVwLgorICAg ICAgaXRlbS5pc01vdW50ZWQgPSBmYWxzZTsKKyAgICAgIHZhciBpc1Jvb3QgPSBpdGVtLnBhcmVu dElEID09PSAwOworICAgICAgaWYgKGlzUm9vdCkgeworICAgICAgICByZW1vdmVSb290KGlkKTsK KyAgICAgIH0KKyAgICB9CisgICAgdW5tb3VudGVkSURzLnB1c2goaWQpOworICB9LAorICBwdXJn ZVVubW91bnRlZENvbXBvbmVudHM6IGZ1bmN0aW9uICgpIHsKKyAgICBpZiAoUmVhY3RDb21wb25l bnRUcmVlSG9vay5fcHJldmVudFB1cmdpbmcpIHsKKyAgICAgIC8vIFNob3VsZCBvbmx5IGJlIHVz ZWQgZm9yIHRlc3RpbmcuCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yICh2YXIgaSA9 IDA7IGkgPCB1bm1vdW50ZWRJRHMubGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciBpZCA9IHVubW91 bnRlZElEc1tpXTsKKyAgICAgIHB1cmdlRGVlcChpZCk7CisgICAgfQorICAgIHVubW91bnRlZElE cy5sZW5ndGggPSAwOworICB9LAorICBpc01vdW50ZWQ6IGZ1bmN0aW9uIChpZCkgeworICAgIHZh ciBpdGVtID0gZ2V0SXRlbShpZCk7CisgICAgcmV0dXJuIGl0ZW0gPyBpdGVtLmlzTW91bnRlZCA6 IGZhbHNlOworICB9LAorICBnZXRDdXJyZW50U3RhY2tBZGRlbmR1bTogZnVuY3Rpb24gKHRvcEVs ZW1lbnQpIHsKKyAgICB2YXIgaW5mbyA9ICcnOworICAgIGlmICh0b3BFbGVtZW50KSB7CisgICAg ICB2YXIgbmFtZSA9IGdldERpc3BsYXlOYW1lKHRvcEVsZW1lbnQpOworICAgICAgdmFyIG93bmVy ID0gdG9wRWxlbWVudC5fb3duZXI7CisgICAgICBpbmZvICs9IGRlc2NyaWJlQ29tcG9uZW50RnJh bWUobmFtZSwgdG9wRWxlbWVudC5fc291cmNlLCBvd25lciAmJiBvd25lci5nZXROYW1lKCkpOwor ICAgIH0KKworICAgIHZhciBjdXJyZW50T3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50 OworICAgIHZhciBpZCA9IGN1cnJlbnRPd25lciAmJiBjdXJyZW50T3duZXIuX2RlYnVnSUQ7CisK KyAgICBpbmZvICs9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0U3RhY2tBZGRlbmR1bUJ5SUQo aWQpOworICAgIHJldHVybiBpbmZvOworICB9LAorICBnZXRTdGFja0FkZGVuZHVtQnlJRDogZnVu Y3Rpb24gKGlkKSB7CisgICAgdmFyIGluZm8gPSAnJzsKKyAgICB3aGlsZSAoaWQpIHsKKyAgICAg IGluZm8gKz0gZGVzY3JpYmVJRChpZCk7CisgICAgICBpZCA9IFJlYWN0Q29tcG9uZW50VHJlZUhv b2suZ2V0UGFyZW50SUQoaWQpOworICAgIH0KKyAgICByZXR1cm4gaW5mbzsKKyAgfSwKKyAgZ2V0 Q2hpbGRJRHM6IGZ1bmN0aW9uIChpZCkgeworICAgIHZhciBpdGVtID0gZ2V0SXRlbShpZCk7Cisg ICAgcmV0dXJuIGl0ZW0gPyBpdGVtLmNoaWxkSURzIDogW107CisgIH0sCisgIGdldERpc3BsYXlO YW1lOiBmdW5jdGlvbiAoaWQpIHsKKyAgICB2YXIgZWxlbWVudCA9IFJlYWN0Q29tcG9uZW50VHJl ZUhvb2suZ2V0RWxlbWVudChpZCk7CisgICAgaWYgKCFlbGVtZW50KSB7CisgICAgICByZXR1cm4g bnVsbDsKKyAgICB9CisgICAgcmV0dXJuIGdldERpc3BsYXlOYW1lKGVsZW1lbnQpOworICB9LAor ICBnZXRFbGVtZW50OiBmdW5jdGlvbiAoaWQpIHsKKyAgICB2YXIgaXRlbSA9IGdldEl0ZW0oaWQp OworICAgIHJldHVybiBpdGVtID8gaXRlbS5lbGVtZW50IDogbnVsbDsKKyAgfSwKKyAgZ2V0T3du ZXJJRDogZnVuY3Rpb24gKGlkKSB7CisgICAgdmFyIGVsZW1lbnQgPSBSZWFjdENvbXBvbmVudFRy ZWVIb29rLmdldEVsZW1lbnQoaWQpOworICAgIGlmICghZWxlbWVudCB8fCAhZWxlbWVudC5fb3du ZXIpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICByZXR1cm4gZWxlbWVudC5fb3du ZXIuX2RlYnVnSUQ7CisgIH0sCisgIGdldFBhcmVudElEOiBmdW5jdGlvbiAoaWQpIHsKKyAgICB2 YXIgaXRlbSA9IGdldEl0ZW0oaWQpOworICAgIHJldHVybiBpdGVtID8gaXRlbS5wYXJlbnRJRCA6 IG51bGw7CisgIH0sCisgIGdldFNvdXJjZTogZnVuY3Rpb24gKGlkKSB7CisgICAgdmFyIGl0ZW0g PSBnZXRJdGVtKGlkKTsKKyAgICB2YXIgZWxlbWVudCA9IGl0ZW0gPyBpdGVtLmVsZW1lbnQgOiBu dWxsOworICAgIHZhciBzb3VyY2UgPSBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50Ll9zb3VyY2Ug OiBudWxsOworICAgIHJldHVybiBzb3VyY2U7CisgIH0sCisgIGdldFRleHQ6IGZ1bmN0aW9uIChp ZCkgeworICAgIHZhciBlbGVtZW50ID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRFbGVtZW50 KGlkKTsKKyAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnKSB7CisgICAgICByZXR1 cm4gZWxlbWVudDsKKyAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnbnVtYmVyJykg eworICAgICAgcmV0dXJuICcnICsgZWxlbWVudDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJu IG51bGw7CisgICAgfQorICB9LAorICBnZXRVcGRhdGVDb3VudDogZnVuY3Rpb24gKGlkKSB7Cisg ICAgdmFyIGl0ZW0gPSBnZXRJdGVtKGlkKTsKKyAgICByZXR1cm4gaXRlbSA/IGl0ZW0udXBkYXRl Q291bnQgOiAwOworICB9LAorCisKKyAgZ2V0Um9vdElEczogZ2V0Um9vdElEcywKKyAgZ2V0UmVn aXN0ZXJlZElEczogZ2V0SXRlbUlEcworfTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdENvbXBv bmVudFRyZWVIb29rOworfSx7IjI0IjoyNCwiMjgiOjI4LCIyOSI6MjksIjgiOjh9XSw4OltmdW5j dGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJl c2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhp cyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91 bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMg c291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2Fu IGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoK KyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKKworLyoqCisgKiBLZWVwcyB0cmFjayBvZiB0aGUg Y3VycmVudCBvd25lci4KKyAqCisgKiBUaGUgY3VycmVudCBvd25lciBpcyB0aGUgY29tcG9uZW50 IHdobyBzaG91bGQgb3duIGFueSBjb21wb25lbnRzIHRoYXQgYXJlCisgKiBjdXJyZW50bHkgYmVp bmcgY29uc3RydWN0ZWQuCisgKi8KK3ZhciBSZWFjdEN1cnJlbnRPd25lciA9IHsKKworICAvKioK KyAgICogQGludGVybmFsCisgICAqIEB0eXBlIHtSZWFjdENvbXBvbmVudH0KKyAgICovCisgIGN1 cnJlbnQ6IG51bGwKKworfTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdEN1cnJlbnRPd25lcjsK K30se31dLDk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5 cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZl ZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5 bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJl Y3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0 ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBk aXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFJlYWN0RWxlbWVudCA9 IF9kZXJlcV8oMTApOworCisvKioKKyAqIENyZWF0ZSBhIGZhY3RvcnkgdGhhdCBjcmVhdGVzIEhU TUwgdGFnIGVsZW1lbnRzLgorICoKKyAqIEBwcml2YXRlCisgKi8KK3ZhciBjcmVhdGVET01GYWN0 b3J5ID0gUmVhY3RFbGVtZW50LmNyZWF0ZUZhY3Rvcnk7CitpZiAoImRldmVsb3BtZW50IiAhPT0g J3Byb2R1Y3Rpb24nKSB7CisgIHZhciBSZWFjdEVsZW1lbnRWYWxpZGF0b3IgPSBfZGVyZXFfKDEy KTsKKyAgY3JlYXRlRE9NRmFjdG9yeSA9IFJlYWN0RWxlbWVudFZhbGlkYXRvci5jcmVhdGVGYWN0 b3J5OworfQorCisvKioKKyAqIENyZWF0ZXMgYSBtYXBwaW5nIGZyb20gc3VwcG9ydGVkIEhUTUwg dGFncyB0byBgUmVhY3RET01Db21wb25lbnRgIGNsYXNzZXMuCisgKiBUaGlzIGlzIGFsc28gYWNj ZXNzaWJsZSB2aWEgYFJlYWN0LkRPTWAuCisgKgorICogQHB1YmxpYworICovCit2YXIgUmVhY3RE T01GYWN0b3JpZXMgPSB7CisgIGE6IGNyZWF0ZURPTUZhY3RvcnkoJ2EnKSwKKyAgYWJicjogY3Jl YXRlRE9NRmFjdG9yeSgnYWJicicpLAorICBhZGRyZXNzOiBjcmVhdGVET01GYWN0b3J5KCdhZGRy ZXNzJyksCisgIGFyZWE6IGNyZWF0ZURPTUZhY3RvcnkoJ2FyZWEnKSwKKyAgYXJ0aWNsZTogY3Jl YXRlRE9NRmFjdG9yeSgnYXJ0aWNsZScpLAorICBhc2lkZTogY3JlYXRlRE9NRmFjdG9yeSgnYXNp ZGUnKSwKKyAgYXVkaW86IGNyZWF0ZURPTUZhY3RvcnkoJ2F1ZGlvJyksCisgIGI6IGNyZWF0ZURP TUZhY3RvcnkoJ2InKSwKKyAgYmFzZTogY3JlYXRlRE9NRmFjdG9yeSgnYmFzZScpLAorICBiZGk6 IGNyZWF0ZURPTUZhY3RvcnkoJ2JkaScpLAorICBiZG86IGNyZWF0ZURPTUZhY3RvcnkoJ2Jkbycp LAorICBiaWc6IGNyZWF0ZURPTUZhY3RvcnkoJ2JpZycpLAorICBibG9ja3F1b3RlOiBjcmVhdGVE T01GYWN0b3J5KCdibG9ja3F1b3RlJyksCisgIGJvZHk6IGNyZWF0ZURPTUZhY3RvcnkoJ2JvZHkn KSwKKyAgYnI6IGNyZWF0ZURPTUZhY3RvcnkoJ2JyJyksCisgIGJ1dHRvbjogY3JlYXRlRE9NRmFj dG9yeSgnYnV0dG9uJyksCisgIGNhbnZhczogY3JlYXRlRE9NRmFjdG9yeSgnY2FudmFzJyksCisg IGNhcHRpb246IGNyZWF0ZURPTUZhY3RvcnkoJ2NhcHRpb24nKSwKKyAgY2l0ZTogY3JlYXRlRE9N RmFjdG9yeSgnY2l0ZScpLAorICBjb2RlOiBjcmVhdGVET01GYWN0b3J5KCdjb2RlJyksCisgIGNv bDogY3JlYXRlRE9NRmFjdG9yeSgnY29sJyksCisgIGNvbGdyb3VwOiBjcmVhdGVET01GYWN0b3J5 KCdjb2xncm91cCcpLAorICBkYXRhOiBjcmVhdGVET01GYWN0b3J5KCdkYXRhJyksCisgIGRhdGFs aXN0OiBjcmVhdGVET01GYWN0b3J5KCdkYXRhbGlzdCcpLAorICBkZDogY3JlYXRlRE9NRmFjdG9y eSgnZGQnKSwKKyAgZGVsOiBjcmVhdGVET01GYWN0b3J5KCdkZWwnKSwKKyAgZGV0YWlsczogY3Jl YXRlRE9NRmFjdG9yeSgnZGV0YWlscycpLAorICBkZm46IGNyZWF0ZURPTUZhY3RvcnkoJ2Rmbicp LAorICBkaWFsb2c6IGNyZWF0ZURPTUZhY3RvcnkoJ2RpYWxvZycpLAorICBkaXY6IGNyZWF0ZURP TUZhY3RvcnkoJ2RpdicpLAorICBkbDogY3JlYXRlRE9NRmFjdG9yeSgnZGwnKSwKKyAgZHQ6IGNy ZWF0ZURPTUZhY3RvcnkoJ2R0JyksCisgIGVtOiBjcmVhdGVET01GYWN0b3J5KCdlbScpLAorICBl bWJlZDogY3JlYXRlRE9NRmFjdG9yeSgnZW1iZWQnKSwKKyAgZmllbGRzZXQ6IGNyZWF0ZURPTUZh Y3RvcnkoJ2ZpZWxkc2V0JyksCisgIGZpZ2NhcHRpb246IGNyZWF0ZURPTUZhY3RvcnkoJ2ZpZ2Nh cHRpb24nKSwKKyAgZmlndXJlOiBjcmVhdGVET01GYWN0b3J5KCdmaWd1cmUnKSwKKyAgZm9vdGVy OiBjcmVhdGVET01GYWN0b3J5KCdmb290ZXInKSwKKyAgZm9ybTogY3JlYXRlRE9NRmFjdG9yeSgn Zm9ybScpLAorICBoMTogY3JlYXRlRE9NRmFjdG9yeSgnaDEnKSwKKyAgaDI6IGNyZWF0ZURPTUZh Y3RvcnkoJ2gyJyksCisgIGgzOiBjcmVhdGVET01GYWN0b3J5KCdoMycpLAorICBoNDogY3JlYXRl RE9NRmFjdG9yeSgnaDQnKSwKKyAgaDU6IGNyZWF0ZURPTUZhY3RvcnkoJ2g1JyksCisgIGg2OiBj cmVhdGVET01GYWN0b3J5KCdoNicpLAorICBoZWFkOiBjcmVhdGVET01GYWN0b3J5KCdoZWFkJyks CisgIGhlYWRlcjogY3JlYXRlRE9NRmFjdG9yeSgnaGVhZGVyJyksCisgIGhncm91cDogY3JlYXRl RE9NRmFjdG9yeSgnaGdyb3VwJyksCisgIGhyOiBjcmVhdGVET01GYWN0b3J5KCdocicpLAorICBo dG1sOiBjcmVhdGVET01GYWN0b3J5KCdodG1sJyksCisgIGk6IGNyZWF0ZURPTUZhY3RvcnkoJ2kn KSwKKyAgaWZyYW1lOiBjcmVhdGVET01GYWN0b3J5KCdpZnJhbWUnKSwKKyAgaW1nOiBjcmVhdGVE T01GYWN0b3J5KCdpbWcnKSwKKyAgaW5wdXQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2lucHV0JyksCisg IGluczogY3JlYXRlRE9NRmFjdG9yeSgnaW5zJyksCisgIGtiZDogY3JlYXRlRE9NRmFjdG9yeSgn a2JkJyksCisgIGtleWdlbjogY3JlYXRlRE9NRmFjdG9yeSgna2V5Z2VuJyksCisgIGxhYmVsOiBj cmVhdGVET01GYWN0b3J5KCdsYWJlbCcpLAorICBsZWdlbmQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2xl Z2VuZCcpLAorICBsaTogY3JlYXRlRE9NRmFjdG9yeSgnbGknKSwKKyAgbGluazogY3JlYXRlRE9N RmFjdG9yeSgnbGluaycpLAorICBtYWluOiBjcmVhdGVET01GYWN0b3J5KCdtYWluJyksCisgIG1h cDogY3JlYXRlRE9NRmFjdG9yeSgnbWFwJyksCisgIG1hcms6IGNyZWF0ZURPTUZhY3RvcnkoJ21h cmsnKSwKKyAgbWVudTogY3JlYXRlRE9NRmFjdG9yeSgnbWVudScpLAorICBtZW51aXRlbTogY3Jl YXRlRE9NRmFjdG9yeSgnbWVudWl0ZW0nKSwKKyAgbWV0YTogY3JlYXRlRE9NRmFjdG9yeSgnbWV0 YScpLAorICBtZXRlcjogY3JlYXRlRE9NRmFjdG9yeSgnbWV0ZXInKSwKKyAgbmF2OiBjcmVhdGVE T01GYWN0b3J5KCduYXYnKSwKKyAgbm9zY3JpcHQ6IGNyZWF0ZURPTUZhY3RvcnkoJ25vc2NyaXB0 JyksCisgIG9iamVjdDogY3JlYXRlRE9NRmFjdG9yeSgnb2JqZWN0JyksCisgIG9sOiBjcmVhdGVE T01GYWN0b3J5KCdvbCcpLAorICBvcHRncm91cDogY3JlYXRlRE9NRmFjdG9yeSgnb3B0Z3JvdXAn KSwKKyAgb3B0aW9uOiBjcmVhdGVET01GYWN0b3J5KCdvcHRpb24nKSwKKyAgb3V0cHV0OiBjcmVh dGVET01GYWN0b3J5KCdvdXRwdXQnKSwKKyAgcDogY3JlYXRlRE9NRmFjdG9yeSgncCcpLAorICBw YXJhbTogY3JlYXRlRE9NRmFjdG9yeSgncGFyYW0nKSwKKyAgcGljdHVyZTogY3JlYXRlRE9NRmFj dG9yeSgncGljdHVyZScpLAorICBwcmU6IGNyZWF0ZURPTUZhY3RvcnkoJ3ByZScpLAorICBwcm9n cmVzczogY3JlYXRlRE9NRmFjdG9yeSgncHJvZ3Jlc3MnKSwKKyAgcTogY3JlYXRlRE9NRmFjdG9y eSgncScpLAorICBycDogY3JlYXRlRE9NRmFjdG9yeSgncnAnKSwKKyAgcnQ6IGNyZWF0ZURPTUZh Y3RvcnkoJ3J0JyksCisgIHJ1Ynk6IGNyZWF0ZURPTUZhY3RvcnkoJ3J1YnknKSwKKyAgczogY3Jl YXRlRE9NRmFjdG9yeSgncycpLAorICBzYW1wOiBjcmVhdGVET01GYWN0b3J5KCdzYW1wJyksCisg IHNjcmlwdDogY3JlYXRlRE9NRmFjdG9yeSgnc2NyaXB0JyksCisgIHNlY3Rpb246IGNyZWF0ZURP TUZhY3RvcnkoJ3NlY3Rpb24nKSwKKyAgc2VsZWN0OiBjcmVhdGVET01GYWN0b3J5KCdzZWxlY3Qn KSwKKyAgc21hbGw6IGNyZWF0ZURPTUZhY3RvcnkoJ3NtYWxsJyksCisgIHNvdXJjZTogY3JlYXRl RE9NRmFjdG9yeSgnc291cmNlJyksCisgIHNwYW46IGNyZWF0ZURPTUZhY3RvcnkoJ3NwYW4nKSwK KyAgc3Ryb25nOiBjcmVhdGVET01GYWN0b3J5KCdzdHJvbmcnKSwKKyAgc3R5bGU6IGNyZWF0ZURP TUZhY3RvcnkoJ3N0eWxlJyksCisgIHN1YjogY3JlYXRlRE9NRmFjdG9yeSgnc3ViJyksCisgIHN1 bW1hcnk6IGNyZWF0ZURPTUZhY3RvcnkoJ3N1bW1hcnknKSwKKyAgc3VwOiBjcmVhdGVET01GYWN0 b3J5KCdzdXAnKSwKKyAgdGFibGU6IGNyZWF0ZURPTUZhY3RvcnkoJ3RhYmxlJyksCisgIHRib2R5 OiBjcmVhdGVET01GYWN0b3J5KCd0Ym9keScpLAorICB0ZDogY3JlYXRlRE9NRmFjdG9yeSgndGQn KSwKKyAgdGV4dGFyZWE6IGNyZWF0ZURPTUZhY3RvcnkoJ3RleHRhcmVhJyksCisgIHRmb290OiBj cmVhdGVET01GYWN0b3J5KCd0Zm9vdCcpLAorICB0aDogY3JlYXRlRE9NRmFjdG9yeSgndGgnKSwK KyAgdGhlYWQ6IGNyZWF0ZURPTUZhY3RvcnkoJ3RoZWFkJyksCisgIHRpbWU6IGNyZWF0ZURPTUZh Y3RvcnkoJ3RpbWUnKSwKKyAgdGl0bGU6IGNyZWF0ZURPTUZhY3RvcnkoJ3RpdGxlJyksCisgIHRy OiBjcmVhdGVET01GYWN0b3J5KCd0cicpLAorICB0cmFjazogY3JlYXRlRE9NRmFjdG9yeSgndHJh Y2snKSwKKyAgdTogY3JlYXRlRE9NRmFjdG9yeSgndScpLAorICB1bDogY3JlYXRlRE9NRmFjdG9y eSgndWwnKSwKKyAgJ3Zhcic6IGNyZWF0ZURPTUZhY3RvcnkoJ3ZhcicpLAorICB2aWRlbzogY3Jl YXRlRE9NRmFjdG9yeSgndmlkZW8nKSwKKyAgd2JyOiBjcmVhdGVET01GYWN0b3J5KCd3YnInKSwK KworICAvLyBTVkcKKyAgY2lyY2xlOiBjcmVhdGVET01GYWN0b3J5KCdjaXJjbGUnKSwKKyAgY2xp cFBhdGg6IGNyZWF0ZURPTUZhY3RvcnkoJ2NsaXBQYXRoJyksCisgIGRlZnM6IGNyZWF0ZURPTUZh Y3RvcnkoJ2RlZnMnKSwKKyAgZWxsaXBzZTogY3JlYXRlRE9NRmFjdG9yeSgnZWxsaXBzZScpLAor ICBnOiBjcmVhdGVET01GYWN0b3J5KCdnJyksCisgIGltYWdlOiBjcmVhdGVET01GYWN0b3J5KCdp bWFnZScpLAorICBsaW5lOiBjcmVhdGVET01GYWN0b3J5KCdsaW5lJyksCisgIGxpbmVhckdyYWRp ZW50OiBjcmVhdGVET01GYWN0b3J5KCdsaW5lYXJHcmFkaWVudCcpLAorICBtYXNrOiBjcmVhdGVE T01GYWN0b3J5KCdtYXNrJyksCisgIHBhdGg6IGNyZWF0ZURPTUZhY3RvcnkoJ3BhdGgnKSwKKyAg cGF0dGVybjogY3JlYXRlRE9NRmFjdG9yeSgncGF0dGVybicpLAorICBwb2x5Z29uOiBjcmVhdGVE T01GYWN0b3J5KCdwb2x5Z29uJyksCisgIHBvbHlsaW5lOiBjcmVhdGVET01GYWN0b3J5KCdwb2x5 bGluZScpLAorICByYWRpYWxHcmFkaWVudDogY3JlYXRlRE9NRmFjdG9yeSgncmFkaWFsR3JhZGll bnQnKSwKKyAgcmVjdDogY3JlYXRlRE9NRmFjdG9yeSgncmVjdCcpLAorICBzdG9wOiBjcmVhdGVE T01GYWN0b3J5KCdzdG9wJyksCisgIHN2ZzogY3JlYXRlRE9NRmFjdG9yeSgnc3ZnJyksCisgIHRl eHQ6IGNyZWF0ZURPTUZhY3RvcnkoJ3RleHQnKSwKKyAgdHNwYW46IGNyZWF0ZURPTUZhY3Rvcnko J3RzcGFuJykKK307CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RET01GYWN0b3JpZXM7Cit9LHsi MTAiOjEwLCIxMiI6MTJ9XSwxMDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7Cisv KioKKyAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmln aHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIg dGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRo ZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50 CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGlu IHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX2Fz c2lnbiA9IF9kZXJlcV8oMzApOworCit2YXIgUmVhY3RDdXJyZW50T3duZXIgPSBfZGVyZXFfKDgp OworCit2YXIgd2FybmluZyA9IF9kZXJlcV8oMjkpOwordmFyIGNhbkRlZmluZVByb3BlcnR5ID0g X2RlcmVxXygyMCk7Cit2YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093 blByb3BlcnR5OworCit2YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gX2RlcmVxXygxMSk7CisKK3Zh ciBSRVNFUlZFRF9QUk9QUyA9IHsKKyAga2V5OiB0cnVlLAorICByZWY6IHRydWUsCisgIF9fc2Vs ZjogdHJ1ZSwKKyAgX19zb3VyY2U6IHRydWUKK307CisKK3ZhciBzcGVjaWFsUHJvcEtleVdhcm5p bmdTaG93biwgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd247CisKK2Z1bmN0aW9uIGhhc1ZhbGlk UmVmKGNvbmZpZykgeworICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7Cisg ICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAncmVmJykpIHsKKyAgICAgIHZhciBn ZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ3JlZicpLmdl dDsKKyAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7CisgICAgICAg IHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGNvbmZpZy5yZWYg IT09IHVuZGVmaW5lZDsKK30KKworZnVuY3Rpb24gaGFzVmFsaWRLZXkoY29uZmlnKSB7CisgIGlm ICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICBpZiAoaGFzT3duUHJvcGVy dHkuY2FsbChjb25maWcsICdrZXknKSkgeworICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRP d25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAna2V5JykuZ2V0OworICAgICAgaWYgKGdldHRl ciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg ICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gY29uZmlnLmtleSAhPT0gdW5kZWZpbmVkOworfQor CitmdW5jdGlvbiBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUp IHsKKyAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ0tleSA9IGZ1bmN0aW9uICgpIHsKKyAgICBpZiAo IXNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duKSB7CisgICAgICBzcGVjaWFsUHJvcEtleVdhcm5p bmdTaG93biA9IHRydWU7CisgICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3 YXJuaW5nKGZhbHNlLCAnJXM6IGBrZXlgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3Mg aXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91 IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21w b25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRw czovL2ZiLm1lL3JlYWN0LXNwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpIDogdm9pZCAwOwor ICAgIH0KKyAgfTsKKyAgd2FybkFib3V0QWNjZXNzaW5nS2V5LmlzUmVhY3RXYXJuaW5nID0gdHJ1 ZTsKKyAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAna2V5JywgeworICAgIGdldDogd2Fy bkFib3V0QWNjZXNzaW5nS2V5LAorICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQorICB9KTsKK30KKwor ZnVuY3Rpb24gZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7 CisgIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYgPSBmdW5jdGlvbiAoKSB7CisgICAgaWYgKCFz cGVjaWFsUHJvcFJlZldhcm5pbmdTaG93bikgeworICAgICAgc3BlY2lhbFByb3BSZWZXYXJuaW5n U2hvd24gPSB0cnVlOworICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2Fy bmluZyhmYWxzZSwgJyVzOiBgcmVmYCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0 IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBu ZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9u ZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6 Ly9mYi5tZS9yZWFjdC1zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKSA6IHZvaWQgMDsKKyAg ICB9CisgIH07CisgIHdhcm5BYm91dEFjY2Vzc2luZ1JlZi5pc1JlYWN0V2FybmluZyA9IHRydWU7 CisgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ3JlZicsIHsKKyAgICBnZXQ6IHdhcm5B Ym91dEFjY2Vzc2luZ1JlZiwKKyAgICBjb25maWd1cmFibGU6IHRydWUKKyAgfSk7Cit9CisKKy8q KgorICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IFJlYWN0IGVsZW1lbnQuIFRoaXMg bm8gbG9uZ2VyIGFkaGVyZXMgdG8KKyAqIHRoZSBjbGFzcyBwYXR0ZXJuLCBzbyBkbyBub3QgdXNl IG5ldyB0byBjYWxsIGl0LiBBbHNvLCBubyBpbnN0YW5jZW9mIGNoZWNrCisgKiB3aWxsIHdvcmsu IEluc3RlYWQgdGVzdCAkJHR5cGVvZiBmaWVsZCBhZ2FpbnN0IFN5bWJvbC5mb3IoJ3JlYWN0LmVs ZW1lbnQnKSB0byBjaGVjaworICogaWYgc29tZXRoaW5nIGlzIGEgUmVhY3QgRWxlbWVudC4KKyAq CisgKiBAcGFyYW0geyp9IHR5cGUKKyAqIEBwYXJhbSB7Kn0ga2V5CisgKiBAcGFyYW0ge3N0cmlu Z3xvYmplY3R9IHJlZgorICogQHBhcmFtIHsqfSBzZWxmIEEgKnRlbXBvcmFyeSogaGVscGVyIHRv IGRldGVjdCBwbGFjZXMgd2hlcmUgYHRoaXNgIGlzCisgKiBkaWZmZXJlbnQgZnJvbSB0aGUgYG93 bmVyYCB3aGVuIFJlYWN0LmNyZWF0ZUVsZW1lbnQgaXMgY2FsbGVkLCBzbyB0aGF0IHdlCisgKiBj YW4gd2Fybi4gV2Ugd2FudCB0byBnZXQgcmlkIG9mIG93bmVyIGFuZCByZXBsYWNlIHN0cmluZyBg cmVmYHMgd2l0aCBhcnJvdworICogZnVuY3Rpb25zLCBhbmQgYXMgbG9uZyBhcyBgdGhpc2AgYW5k IG93bmVyIGFyZSB0aGUgc2FtZSwgdGhlcmUgd2lsbCBiZSBubworICogY2hhbmdlIGluIGJlaGF2 aW9yLgorICogQHBhcmFtIHsqfSBzb3VyY2UgQW4gYW5ub3RhdGlvbiBvYmplY3QgKGFkZGVkIGJ5 IGEgdHJhbnNwaWxlciBvciBvdGhlcndpc2UpCisgKiBpbmRpY2F0aW5nIGZpbGVuYW1lLCBsaW5l IG51bWJlciwgYW5kL29yIG90aGVyIGluZm9ybWF0aW9uLgorICogQHBhcmFtIHsqfSBvd25lcgor ICogQHBhcmFtIHsqfSBwcm9wcworICogQGludGVybmFsCisgKi8KK3ZhciBSZWFjdEVsZW1lbnQg PSBmdW5jdGlvbiAodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKSB7 CisgIHZhciBlbGVtZW50ID0geworICAgIC8vIFRoaXMgdGFnIGFsbG93IHVzIHRvIHVuaXF1ZWx5 IGlkZW50aWZ5IHRoaXMgYXMgYSBSZWFjdCBFbGVtZW50CisgICAgJCR0eXBlb2Y6IFJFQUNUX0VM RU1FTlRfVFlQRSwKKworICAgIC8vIEJ1aWx0LWluIHByb3BlcnRpZXMgdGhhdCBiZWxvbmcgb24g dGhlIGVsZW1lbnQKKyAgICB0eXBlOiB0eXBlLAorICAgIGtleToga2V5LAorICAgIHJlZjogcmVm LAorICAgIHByb3BzOiBwcm9wcywKKworICAgIC8vIFJlY29yZCB0aGUgY29tcG9uZW50IHJlc3Bv bnNpYmxlIGZvciBjcmVhdGluZyB0aGlzIGVsZW1lbnQuCisgICAgX293bmVyOiBvd25lcgorICB9 OworCisgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAvLyBUaGUg dmFsaWRhdGlvbiBmbGFnIGlzIGN1cnJlbnRseSBtdXRhdGl2ZS4gV2UgcHV0IGl0IG9uCisgICAg Ly8gYW4gZXh0ZXJuYWwgYmFja2luZyBzdG9yZSBzbyB0aGF0IHdlIGNhbiBmcmVlemUgdGhlIHdo b2xlIG9iamVjdC4KKyAgICAvLyBUaGlzIGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgV2Vha01hcCBv bmNlIHRoZXkgYXJlIGltcGxlbWVudGVkIGluCisgICAgLy8gY29tbW9ubHkgdXNlZCBkZXZlbG9w bWVudCBlbnZpcm9ubWVudHMuCisgICAgZWxlbWVudC5fc3RvcmUgPSB7fTsKKworICAgIC8vIFRv IG1ha2UgY29tcGFyaW5nIFJlYWN0RWxlbWVudHMgZWFzaWVyIGZvciB0ZXN0aW5nIHB1cnBvc2Vz LCB3ZSBtYWtlCisgICAgLy8gdGhlIHZhbGlkYXRpb24gZmxhZyBub24tZW51bWVyYWJsZSAod2hl cmUgcG9zc2libGUsIHdoaWNoIHNob3VsZAorICAgIC8vIGluY2x1ZGUgZXZlcnkgZW52aXJvbm1l bnQgd2UgcnVuIHRlc3RzIGluKSwgc28gdGhlIHRlc3QgZnJhbWV3b3JrCisgICAgLy8gaWdub3Jl cyBpdC4KKyAgICBpZiAoY2FuRGVmaW5lUHJvcGVydHkpIHsKKyAgICAgIE9iamVjdC5kZWZpbmVQ cm9wZXJ0eShlbGVtZW50Ll9zdG9yZSwgJ3ZhbGlkYXRlZCcsIHsKKyAgICAgICAgY29uZmlndXJh YmxlOiBmYWxzZSwKKyAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCisgICAgICAgIHdyaXRhYmxl OiB0cnVlLAorICAgICAgICB2YWx1ZTogZmFsc2UKKyAgICAgIH0pOworICAgICAgLy8gc2VsZiBh bmQgc291cmNlIGFyZSBERVYgb25seSBwcm9wZXJ0aWVzLgorICAgICAgT2JqZWN0LmRlZmluZVBy b3BlcnR5KGVsZW1lbnQsICdfc2VsZicsIHsKKyAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwK KyAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCisgICAgICAgIHdyaXRhYmxlOiBmYWxzZSwKKyAg ICAgICAgdmFsdWU6IHNlbGYKKyAgICAgIH0pOworICAgICAgLy8gVHdvIGVsZW1lbnRzIGNyZWF0 ZWQgaW4gdHdvIGRpZmZlcmVudCBwbGFjZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWQKKyAgICAgIC8v IGVxdWFsIGZvciB0ZXN0aW5nIHB1cnBvc2VzIGFuZCB0aGVyZWZvcmUgd2UgaGlkZSBpdCBmcm9t IGVudW1lcmF0aW9uLgorICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc291 cmNlJywgeworICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAorICAgICAgICBlbnVtZXJhYmxl OiBmYWxzZSwKKyAgICAgICAgd3JpdGFibGU6IGZhbHNlLAorICAgICAgICB2YWx1ZTogc291cmNl CisgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgZWxlbWVudC5fc3RvcmUudmFsaWRhdGVk ID0gZmFsc2U7CisgICAgICBlbGVtZW50Ll9zZWxmID0gc2VsZjsKKyAgICAgIGVsZW1lbnQuX3Nv dXJjZSA9IHNvdXJjZTsKKyAgICB9CisgICAgaWYgKE9iamVjdC5mcmVlemUpIHsKKyAgICAgIE9i amVjdC5mcmVlemUoZWxlbWVudC5wcm9wcyk7CisgICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQp OworICAgIH0KKyAgfQorCisgIHJldHVybiBlbGVtZW50OworfTsKKworLyoqCisgKiBDcmVhdGUg YW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQgb2YgdGhlIGdpdmVuIHR5cGUuCisgKiBTZWUg aHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0bWwj cmVhY3QuY3JlYXRlZWxlbWVudAorICovCitSZWFjdEVsZW1lbnQuY3JlYXRlRWxlbWVudCA9IGZ1 bmN0aW9uICh0eXBlLCBjb25maWcsIGNoaWxkcmVuKSB7CisgIHZhciBwcm9wTmFtZTsKKworICAv LyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkCisgIHZhciBwcm9wcyA9IHt9OworCisgIHZh ciBrZXkgPSBudWxsOworICB2YXIgcmVmID0gbnVsbDsKKyAgdmFyIHNlbGYgPSBudWxsOworICB2 YXIgc291cmNlID0gbnVsbDsKKworICBpZiAoY29uZmlnICE9IG51bGwpIHsKKyAgICBpZiAoaGFz VmFsaWRSZWYoY29uZmlnKSkgeworICAgICAgcmVmID0gY29uZmlnLnJlZjsKKyAgICB9CisgICAg aWYgKGhhc1ZhbGlkS2V5KGNvbmZpZykpIHsKKyAgICAgIGtleSA9ICcnICsgY29uZmlnLmtleTsK KyAgICB9CisKKyAgICBzZWxmID0gY29uZmlnLl9fc2VsZiA9PT0gdW5kZWZpbmVkID8gbnVsbCA6 IGNvbmZpZy5fX3NlbGY7CisgICAgc291cmNlID0gY29uZmlnLl9fc291cmNlID09PSB1bmRlZmlu ZWQgPyBudWxsIDogY29uZmlnLl9fc291cmNlOworICAgIC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVz IGFyZSBhZGRlZCB0byBhIG5ldyBwcm9wcyBvYmplY3QKKyAgICBmb3IgKHByb3BOYW1lIGluIGNv bmZpZykgeworICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBwcm9wTmFtZSkg JiYgIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkgeworICAgICAgICBw cm9wc1twcm9wTmFtZV0gPSBjb25maWdbcHJvcE5hbWVdOworICAgICAgfQorICAgIH0KKyAgfQor CisgIC8vIENoaWxkcmVuIGNhbiBiZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LCBhbmQgdGhvc2Ug YXJlIHRyYW5zZmVycmVkIG9udG8KKyAgLy8gdGhlIG5ld2x5IGFsbG9jYXRlZCBwcm9wcyBvYmpl Y3QuCisgIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAyOworICBpZiAo Y2hpbGRyZW5MZW5ndGggPT09IDEpIHsKKyAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuOwor ICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkgeworICAgIHZhciBjaGlsZEFycmF5ID0g QXJyYXkoY2hpbGRyZW5MZW5ndGgpOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW5M ZW5ndGg7IGkrKykgeworICAgICAgY2hpbGRBcnJheVtpXSA9IGFyZ3VtZW50c1tpICsgMl07Cisg ICAgfQorICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIGlm IChPYmplY3QuZnJlZXplKSB7CisgICAgICAgIE9iamVjdC5mcmVlemUoY2hpbGRBcnJheSk7Cisg ICAgICB9CisgICAgfQorICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTsKKyAgfQorCisg IC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wcworICBpZiAodHlwZSAmJiB0eXBlLmRlZmF1bHRQcm9w cykgeworICAgIHZhciBkZWZhdWx0UHJvcHMgPSB0eXBlLmRlZmF1bHRQcm9wczsKKyAgICBmb3Ig KHByb3BOYW1lIGluIGRlZmF1bHRQcm9wcykgeworICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9 PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1tw cm9wTmFtZV07CisgICAgICB9CisgICAgfQorICB9CisgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAn cHJvZHVjdGlvbicpIHsKKyAgICBpZiAoa2V5IHx8IHJlZikgeworICAgICAgaWYgKHR5cGVvZiBw cm9wcy4kJHR5cGVvZiA9PT0gJ3VuZGVmaW5lZCcgfHwgcHJvcHMuJCR0eXBlb2YgIT09IFJFQUNU X0VMRU1FTlRfVFlQRSkgeworICAgICAgICB2YXIgZGlzcGxheU5hbWUgPSB0eXBlb2YgdHlwZSA9 PT0gJ2Z1bmN0aW9uJyA/IHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8ICdVbmtub3du JyA6IHR5cGU7CisgICAgICAgIGlmIChrZXkpIHsKKyAgICAgICAgICBkZWZpbmVLZXlQcm9wV2Fy bmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpOworICAgICAgICB9CisgICAgICAgIGlmIChy ZWYpIHsKKyAgICAgICAgICBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxh eU5hbWUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBSZWFjdEVs ZW1lbnQodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgUmVhY3RDdXJyZW50T3duZXIuY3Vy cmVudCwgcHJvcHMpOworfTsKKworLyoqCisgKiBSZXR1cm4gYSBmdW5jdGlvbiB0aGF0IHByb2R1 Y2VzIFJlYWN0RWxlbWVudHMgb2YgYSBnaXZlbiB0eXBlLgorICogU2VlIGh0dHBzOi8vZmFjZWJv b2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNyZWF0ZWZh Y3RvcnkKKyAqLworUmVhY3RFbGVtZW50LmNyZWF0ZUZhY3RvcnkgPSBmdW5jdGlvbiAodHlwZSkg eworICB2YXIgZmFjdG9yeSA9IFJlYWN0RWxlbWVudC5jcmVhdGVFbGVtZW50LmJpbmQobnVsbCwg dHlwZSk7CisgIC8vIEV4cG9zZSB0aGUgdHlwZSBvbiB0aGUgZmFjdG9yeSBhbmQgdGhlIHByb3Rv dHlwZSBzbyB0aGF0IGl0IGNhbiBiZQorICAvLyBlYXNpbHkgYWNjZXNzZWQgb24gZWxlbWVudHMu IEUuZy4gYDxGb28gLz4udHlwZSA9PT0gRm9vYC4KKyAgLy8gVGhpcyBzaG91bGQgbm90IGJlIG5h bWVkIGBjb25zdHJ1Y3RvcmAgc2luY2UgdGhpcyBtYXkgbm90IGJlIHRoZSBmdW5jdGlvbgorICAv LyB0aGF0IGNyZWF0ZWQgdGhlIGVsZW1lbnQsIGFuZCBpdCBtYXkgbm90IGV2ZW4gYmUgYSBjb25z dHJ1Y3Rvci4KKyAgLy8gTGVnYWN5IGhvb2sgVE9ETzogV2FybiBpZiB0aGlzIGlzIGFjY2Vzc2Vk CisgIGZhY3RvcnkudHlwZSA9IHR5cGU7CisgIHJldHVybiBmYWN0b3J5OworfTsKKworUmVhY3RF bGVtZW50LmNsb25lQW5kUmVwbGFjZUtleSA9IGZ1bmN0aW9uIChvbGRFbGVtZW50LCBuZXdLZXkp IHsKKyAgdmFyIG5ld0VsZW1lbnQgPSBSZWFjdEVsZW1lbnQob2xkRWxlbWVudC50eXBlLCBuZXdL ZXksIG9sZEVsZW1lbnQucmVmLCBvbGRFbGVtZW50Ll9zZWxmLCBvbGRFbGVtZW50Ll9zb3VyY2Us IG9sZEVsZW1lbnQuX293bmVyLCBvbGRFbGVtZW50LnByb3BzKTsKKworICByZXR1cm4gbmV3RWxl bWVudDsKK307CisKKy8qKgorICogQ2xvbmUgYW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQg dXNpbmcgZWxlbWVudCBhcyB0aGUgc3RhcnRpbmcgcG9pbnQuCisgKiBTZWUgaHR0cHM6Ly9mYWNl Ym9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0bWwjcmVhY3QuY2xvbmVl bGVtZW50CisgKi8KK1JlYWN0RWxlbWVudC5jbG9uZUVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVu dCwgY29uZmlnLCBjaGlsZHJlbikgeworICB2YXIgcHJvcE5hbWU7CisKKyAgLy8gT3JpZ2luYWwg cHJvcHMgYXJlIGNvcGllZAorICB2YXIgcHJvcHMgPSBfYXNzaWduKHt9LCBlbGVtZW50LnByb3Bz KTsKKworICAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkCisgIHZhciBrZXkgPSBlbGVt ZW50LmtleTsKKyAgdmFyIHJlZiA9IGVsZW1lbnQucmVmOworICAvLyBTZWxmIGlzIHByZXNlcnZl ZCBzaW5jZSB0aGUgb3duZXIgaXMgcHJlc2VydmVkLgorICB2YXIgc2VsZiA9IGVsZW1lbnQuX3Nl bGY7CisgIC8vIFNvdXJjZSBpcyBwcmVzZXJ2ZWQgc2luY2UgY2xvbmVFbGVtZW50IGlzIHVubGlr ZWx5IHRvIGJlIHRhcmdldGVkIGJ5IGEKKyAgLy8gdHJhbnNwaWxlciwgYW5kIHRoZSBvcmlnaW5h bCBzb3VyY2UgaXMgcHJvYmFibHkgYSBiZXR0ZXIgaW5kaWNhdG9yIG9mIHRoZQorICAvLyB0cnVl IG93bmVyLgorICB2YXIgc291cmNlID0gZWxlbWVudC5fc291cmNlOworCisgIC8vIE93bmVyIHdp bGwgYmUgcHJlc2VydmVkLCB1bmxlc3MgcmVmIGlzIG92ZXJyaWRkZW4KKyAgdmFyIG93bmVyID0g ZWxlbWVudC5fb3duZXI7CisKKyAgaWYgKGNvbmZpZyAhPSBudWxsKSB7CisgICAgaWYgKGhhc1Zh bGlkUmVmKGNvbmZpZykpIHsKKyAgICAgIC8vIFNpbGVudGx5IHN0ZWFsIHRoZSByZWYgZnJvbSB0 aGUgcGFyZW50LgorICAgICAgcmVmID0gY29uZmlnLnJlZjsKKyAgICAgIG93bmVyID0gUmVhY3RD dXJyZW50T3duZXIuY3VycmVudDsKKyAgICB9CisgICAgaWYgKGhhc1ZhbGlkS2V5KGNvbmZpZykp IHsKKyAgICAgIGtleSA9ICcnICsgY29uZmlnLmtleTsKKyAgICB9CisKKyAgICAvLyBSZW1haW5p bmcgcHJvcGVydGllcyBvdmVycmlkZSBleGlzdGluZyBwcm9wcworICAgIHZhciBkZWZhdWx0UHJv cHM7CisgICAgaWYgKGVsZW1lbnQudHlwZSAmJiBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzKSB7 CisgICAgICBkZWZhdWx0UHJvcHMgPSBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzOworICAgIH0K KyAgICBmb3IgKHByb3BOYW1lIGluIGNvbmZpZykgeworICAgICAgaWYgKGhhc093blByb3BlcnR5 LmNhbGwoY29uZmlnLCBwcm9wTmFtZSkgJiYgIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5 KHByb3BOYW1lKSkgeworICAgICAgICBpZiAoY29uZmlnW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVk ICYmIGRlZmF1bHRQcm9wcyAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgLy8gUmVzb2x2ZSBk ZWZhdWx0IHByb3BzCisgICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3By b3BOYW1lXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBj b25maWdbcHJvcE5hbWVdOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8g Q2hpbGRyZW4gY2FuIGJlIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQsIGFuZCB0aG9zZSBhcmUgdHJh bnNmZXJyZWQgb250bworICAvLyB0aGUgbmV3bHkgYWxsb2NhdGVkIHByb3BzIG9iamVjdC4KKyAg dmFyIGNoaWxkcmVuTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCAtIDI7CisgIGlmIChjaGlsZHJl bkxlbmd0aCA9PT0gMSkgeworICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47CisgIH0gZWxz ZSBpZiAoY2hpbGRyZW5MZW5ndGggPiAxKSB7CisgICAgdmFyIGNoaWxkQXJyYXkgPSBBcnJheShj aGlsZHJlbkxlbmd0aCk7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsg aSsrKSB7CisgICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTsKKyAgICB9Cisg ICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZEFycmF5OworICB9CisKKyAgcmV0dXJuIFJlYWN0RWxl bWVudChlbGVtZW50LnR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcyk7 Cit9OworCisvKioKKyAqIFZlcmlmaWVzIHRoZSBvYmplY3QgaXMgYSBSZWFjdEVsZW1lbnQuCisg KiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBp Lmh0bWwjcmVhY3QuaXN2YWxpZGVsZW1lbnQKKyAqIEBwYXJhbSB7P29iamVjdH0gb2JqZWN0Cisg KiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBvYmplY3RgIGlzIGEgdmFsaWQgY29tcG9uZW50 LgorICogQGZpbmFsCisgKi8KK1JlYWN0RWxlbWVudC5pc1ZhbGlkRWxlbWVudCA9IGZ1bmN0aW9u IChvYmplY3QpIHsKKyAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVj dCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTsKK307 CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RFbGVtZW50OworfSx7IjExIjoxMSwiMjAiOjIwLCIy OSI6MjksIjMwIjozMCwiOCI6OH1dLDExOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRz KXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFs bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1 bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUg aW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwg Z3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZp bGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsK KworLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50IHR5cGUuIElmIHRo ZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2wKKy8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51 bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS4KKwordmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9 IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sWydmb3InXSAmJiBTeW1ib2xb J2ZvciddKCdyZWFjdC5lbGVtZW50JykgfHwgMHhlYWM3OworCittb2R1bGUuZXhwb3J0cyA9IFJF QUNUX0VMRU1FTlRfVFlQRTsKK30se31dLDEyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBv cnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAq IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNl ZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZp bGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9u YWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRT IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisvKioKKyAqIFJlYWN0RWxl bWVudFZhbGlkYXRvciBwcm92aWRlcyBhIHdyYXBwZXIgYXJvdW5kIGEgZWxlbWVudCBmYWN0b3J5 CisgKiB3aGljaCB2YWxpZGF0ZXMgdGhlIHByb3BzIHBhc3NlZCB0byB0aGUgZWxlbWVudC4gVGhp cyBpcyBpbnRlbmRlZCB0byBiZQorICogdXNlZCBvbmx5IGluIERFViBhbmQgY291bGQgYmUgcmVw bGFjZWQgYnkgYSBzdGF0aWMgdHlwZSBjaGVja2VyIGZvciBsYW5ndWFnZXMKKyAqIHRoYXQgc3Vw cG9ydCBpdC4KKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBSZWFjdEN1cnJlbnRPd25lciA9 IF9kZXJlcV8oOCk7Cit2YXIgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IF9kZXJlcV8oNyk7Cit2 YXIgUmVhY3RFbGVtZW50ID0gX2RlcmVxXygxMCk7CisKK3ZhciBjaGVja1JlYWN0VHlwZVNwZWMg PSBfZGVyZXFfKDIxKTsKKwordmFyIGNhbkRlZmluZVByb3BlcnR5ID0gX2RlcmVxXygyMCk7Cit2 YXIgZ2V0SXRlcmF0b3JGbiA9IF9kZXJlcV8oMjIpOwordmFyIHdhcm5pbmcgPSBfZGVyZXFfKDI5 KTsKKworZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkgeworICBpZiAoUmVh Y3RDdXJyZW50T3duZXIuY3VycmVudCkgeworICAgIHZhciBuYW1lID0gUmVhY3RDdXJyZW50T3du ZXIuY3VycmVudC5nZXROYW1lKCk7CisgICAgaWYgKG5hbWUpIHsKKyAgICAgIHJldHVybiAnIENo ZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7CisgICAgfQorICB9Cisg IHJldHVybiAnJzsKK30KKworLyoqCisgKiBXYXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0 bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9mIGNoaWxkcmVuIG9yCisgKiBvYmplY3Qga2V5cyBh cmUgbm90IHZhbGlkLiBUaGlzIGFsbG93cyB1cyB0byBrZWVwIHRyYWNrIG9mIGNoaWxkcmVuIGJl dHdlZW4KKyAqIHVwZGF0ZXMuCisgKi8KK3ZhciBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB7fTsK KworZnVuY3Rpb24gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKSB7Cisg IHZhciBpbmZvID0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7CisKKyAgaWYgKCFpbmZv KSB7CisgICAgdmFyIHBhcmVudE5hbWUgPSB0eXBlb2YgcGFyZW50VHlwZSA9PT0gJ3N0cmluZycg PyBwYXJlbnRUeXBlIDogcGFyZW50VHlwZS5kaXNwbGF5TmFtZSB8fCBwYXJlbnRUeXBlLm5hbWU7 CisgICAgaWYgKHBhcmVudE5hbWUpIHsKKyAgICAgIGluZm8gPSAnIENoZWNrIHRoZSB0b3AtbGV2 ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPCcgKyBwYXJlbnROYW1lICsgJz4uJzsKKyAgICB9CisgIH0K KyAgcmV0dXJuIGluZm87Cit9CisKKy8qKgorICogV2FybiBpZiB0aGUgZWxlbWVudCBkb2Vzbid0 IGhhdmUgYW4gZXhwbGljaXQga2V5IGFzc2lnbmVkIHRvIGl0LgorICogVGhpcyBlbGVtZW50IGlz IGluIGFuIGFycmF5LiBUaGUgYXJyYXkgY291bGQgZ3JvdyBhbmQgc2hyaW5rIG9yIGJlCisgKiBy ZW9yZGVyZWQuIEFsbCBjaGlsZHJlbiB0aGF0IGhhdmVuJ3QgYWxyZWFkeSBiZWVuIHZhbGlkYXRl ZCBhcmUgcmVxdWlyZWQgdG8KKyAqIGhhdmUgYSAia2V5IiBwcm9wZXJ0eSBhc3NpZ25lZCB0byBp dC4gRXJyb3Igc3RhdHVzZXMgYXJlIGNhY2hlZCBzbyBhIHdhcm5pbmcKKyAqIHdpbGwgb25seSBi ZSBzaG93biBvbmNlLgorICoKKyAqIEBpbnRlcm5hbAorICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9 IGVsZW1lbnQgRWxlbWVudCB0aGF0IHJlcXVpcmVzIGEga2V5LgorICogQHBhcmFtIHsqfSBwYXJl bnRUeXBlIGVsZW1lbnQncyBwYXJlbnQncyB0eXBlLgorICovCitmdW5jdGlvbiB2YWxpZGF0ZUV4 cGxpY2l0S2V5KGVsZW1lbnQsIHBhcmVudFR5cGUpIHsKKyAgaWYgKCFlbGVtZW50Ll9zdG9yZSB8 fCBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgfHwgZWxlbWVudC5rZXkgIT0gbnVsbCkgeworICAg IHJldHVybjsKKyAgfQorICBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlOworCisgIHZh ciBtZW1vaXplciA9IG93bmVySGFzS2V5VXNlV2FybmluZy51bmlxdWVLZXkgfHwgKG93bmVySGFz S2V5VXNlV2FybmluZy51bmlxdWVLZXkgPSB7fSk7CisKKyAgdmFyIGN1cnJlbnRDb21wb25lbnRF cnJvckluZm8gPSBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpOworICBp ZiAobWVtb2l6ZXJbY3VycmVudENvbXBvbmVudEVycm9ySW5mb10pIHsKKyAgICByZXR1cm47Cisg IH0KKyAgbWVtb2l6ZXJbY3VycmVudENvbXBvbmVudEVycm9ySW5mb10gPSB0cnVlOworCisgIC8v IFVzdWFsbHkgdGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIG9mZmVuZGVyLCBidXQgaWYgaXQgYWNj ZXB0cyBjaGlsZHJlbiBhcyBhCisgIC8vIHByb3BlcnR5LCBpdCBtYXkgYmUgdGhlIGNyZWF0b3Ig b2YgdGhlIGNoaWxkIHRoYXQncyByZXNwb25zaWJsZSBmb3IKKyAgLy8gYXNzaWduaW5nIGl0IGEg a2V5LgorICB2YXIgY2hpbGRPd25lciA9ICcnOworICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Ll9v d25lciAmJiBlbGVtZW50Ll9vd25lciAhPT0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkgewor ICAgIC8vIEdpdmUgdGhlIGNvbXBvbmVudCB0aGF0IG9yaWdpbmFsbHkgY3JlYXRlZCB0aGlzIGNo aWxkLgorICAgIGNoaWxkT3duZXIgPSAnIEl0IHdhcyBwYXNzZWQgYSBjaGlsZCBmcm9tICcgKyBl bGVtZW50Ll9vd25lci5nZXROYW1lKCkgKyAnLic7CisgIH0KKworICAiZGV2ZWxvcG1lbnQiICE9 PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnRWFjaCBjaGlsZCBpbiBhbiBhcnJheSBv ciBpdGVyYXRvciBzaG91bGQgaGF2ZSBhIHVuaXF1ZSAia2V5IiBwcm9wLicgKyAnJXMlcyBTZWUg aHR0cHM6Ly9mYi5tZS9yZWFjdC13YXJuaW5nLWtleXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJXMn LCBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvLCBjaGlsZE93bmVyLCBSZWFjdENvbXBvbmVudFRy ZWVIb29rLmdldEN1cnJlbnRTdGFja0FkZGVuZHVtKGVsZW1lbnQpKSA6IHZvaWQgMDsKK30KKwor LyoqCisgKiBFbnN1cmUgdGhhdCBldmVyeSBlbGVtZW50IGVpdGhlciBpcyBwYXNzZWQgaW4gYSBz dGF0aWMgbG9jYXRpb24sIGluIGFuCisgKiBhcnJheSB3aXRoIGFuIGV4cGxpY2l0IGtleXMgcHJv cGVydHkgZGVmaW5lZCwgb3IgaW4gYW4gb2JqZWN0IGxpdGVyYWwKKyAqIHdpdGggdmFsaWQga2V5 IHByb3BlcnR5LgorICoKKyAqIEBpbnRlcm5hbAorICogQHBhcmFtIHtSZWFjdE5vZGV9IG5vZGUg U3RhdGljYWxseSBwYXNzZWQgY2hpbGQgb2YgYW55IHR5cGUuCisgKiBAcGFyYW0geyp9IHBhcmVu dFR5cGUgbm9kZSdzIHBhcmVudCdzIHR5cGUuCisgKi8KK2Z1bmN0aW9uIHZhbGlkYXRlQ2hpbGRL ZXlzKG5vZGUsIHBhcmVudFR5cGUpIHsKKyAgaWYgKHR5cGVvZiBub2RlICE9PSAnb2JqZWN0Jykg eworICAgIHJldHVybjsKKyAgfQorICBpZiAoQXJyYXkuaXNBcnJheShub2RlKSkgeworICAgIGZv ciAodmFyIGkgPSAwOyBpIDwgbm9kZS5sZW5ndGg7IGkrKykgeworICAgICAgdmFyIGNoaWxkID0g bm9kZVtpXTsKKyAgICAgIGlmIChSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7 CisgICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoY2hpbGQsIHBhcmVudFR5cGUpOworICAgICAg fQorICAgIH0KKyAgfSBlbHNlIGlmIChSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQobm9kZSkp IHsKKyAgICAvLyBUaGlzIGVsZW1lbnQgd2FzIHBhc3NlZCBpbiBhIHZhbGlkIGxvY2F0aW9uLgor ICAgIGlmIChub2RlLl9zdG9yZSkgeworICAgICAgbm9kZS5fc3RvcmUudmFsaWRhdGVkID0gdHJ1 ZTsKKyAgICB9CisgIH0gZWxzZSBpZiAobm9kZSkgeworICAgIHZhciBpdGVyYXRvckZuID0gZ2V0 SXRlcmF0b3JGbihub2RlKTsKKyAgICAvLyBFbnRyeSBpdGVyYXRvcnMgcHJvdmlkZSBpbXBsaWNp dCBrZXlzLgorICAgIGlmIChpdGVyYXRvckZuKSB7CisgICAgICBpZiAoaXRlcmF0b3JGbiAhPT0g bm9kZS5lbnRyaWVzKSB7CisgICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChu b2RlKTsKKyAgICAgICAgdmFyIHN0ZXA7CisgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRv ci5uZXh0KCkpLmRvbmUpIHsKKyAgICAgICAgICBpZiAoUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVt ZW50KHN0ZXAudmFsdWUpKSB7CisgICAgICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KHN0ZXAu dmFsdWUsIHBhcmVudFR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAg IH0KKyAgfQorfQorCisvKioKKyAqIEdpdmVuIGFuIGVsZW1lbnQsIHZhbGlkYXRlIHRoYXQgaXRz IHByb3BzIGZvbGxvdyB0aGUgcHJvcFR5cGVzIGRlZmluaXRpb24sCisgKiBwcm92aWRlZCBieSB0 aGUgdHlwZS4KKyAqCisgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudAorICovCitmdW5j dGlvbiB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KSB7CisgIHZhciBjb21wb25lbnRDbGFzcyA9 IGVsZW1lbnQudHlwZTsKKyAgaWYgKHR5cGVvZiBjb21wb25lbnRDbGFzcyAhPT0gJ2Z1bmN0aW9u JykgeworICAgIHJldHVybjsKKyAgfQorICB2YXIgbmFtZSA9IGNvbXBvbmVudENsYXNzLmRpc3Bs YXlOYW1lIHx8IGNvbXBvbmVudENsYXNzLm5hbWU7CisgIGlmIChjb21wb25lbnRDbGFzcy5wcm9w VHlwZXMpIHsKKyAgICBjaGVja1JlYWN0VHlwZVNwZWMoY29tcG9uZW50Q2xhc3MucHJvcFR5cGVz LCBlbGVtZW50LnByb3BzLCAncHJvcCcsIG5hbWUsIGVsZW1lbnQsIG51bGwpOworICB9CisgIGlm ICh0eXBlb2YgY29tcG9uZW50Q2xhc3MuZ2V0RGVmYXVsdFByb3BzID09PSAnZnVuY3Rpb24nKSB7 CisgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhjb21wb25lbnRD bGFzcy5nZXREZWZhdWx0UHJvcHMuaXNSZWFjdENsYXNzQXBwcm92ZWQsICdnZXREZWZhdWx0UHJv cHMgaXMgb25seSB1c2VkIG9uIGNsYXNzaWMgUmVhY3QuY3JlYXRlQ2xhc3MgJyArICdkZWZpbml0 aW9ucy4gVXNlIGEgc3RhdGljIHByb3BlcnR5IG5hbWVkIGBkZWZhdWx0UHJvcHNgIGluc3RlYWQu JykgOiB2b2lkIDA7CisgIH0KK30KKwordmFyIFJlYWN0RWxlbWVudFZhbGlkYXRvciA9IHsKKwor ICBjcmVhdGVFbGVtZW50OiBmdW5jdGlvbiAodHlwZSwgcHJvcHMsIGNoaWxkcmVuKSB7CisgICAg dmFyIHZhbGlkVHlwZSA9IHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9 PT0gJ2Z1bmN0aW9uJzsKKyAgICAvLyBXZSB3YXJuIGluIHRoaXMgY2FzZSBidXQgZG9uJ3QgdGhy b3cuIFdlIGV4cGVjdCB0aGUgZWxlbWVudCBjcmVhdGlvbiB0bworICAgIC8vIHN1Y2NlZWQgYW5k IHRoZXJlIHdpbGwgbGlrZWx5IGJlIGVycm9ycyBpbiByZW5kZXIuCisgICAgaWYgKCF2YWxpZFR5 cGUpIHsKKyAgICAgIGlmICh0eXBlb2YgdHlwZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdHlw ZSAhPT0gJ3N0cmluZycpIHsKKyAgICAgICAgdmFyIGluZm8gPSAnJzsKKyAgICAgICAgaWYgKHR5 cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0g bnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHsKKyAgICAgICAgICBpbmZv ICs9ICcgWW91IGxpa2VseSBmb3Jnb3QgdG8gZXhwb3J0IHlvdXIgY29tcG9uZW50IGZyb20gdGhl IGZpbGUgJyArICdpdFwncyBkZWZpbmVkIGluLic7CisgICAgICAgIH0KKyAgICAgICAgaW5mbyAr PSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTsKKyAgICAgICAgImRldmVsb3BtZW50IiAh PT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1JlYWN0LmNyZWF0ZUVsZW1lbnQ6IHR5 cGUgaXMgaW52YWxpZCAtLSBleHBlY3RlZCBhIHN0cmluZyAoZm9yICcgKyAnYnVpbHQtaW4gY29t cG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSAnICsgJ2NvbXBvbmVu dHMpIGJ1dCBnb3Q6ICVzLiVzJywgdHlwZSA9PSBudWxsID8gdHlwZSA6IHR5cGVvZiB0eXBlLCBp bmZvKSA6IHZvaWQgMDsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgZWxlbWVudCA9IFJlYWN0 RWxlbWVudC5jcmVhdGVFbGVtZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisKKyAgICAvLyBU aGUgcmVzdWx0IGNhbiBiZSBudWxsaXNoIGlmIGEgbW9jayBvciBhIGN1c3RvbSBmdW5jdGlvbiBp cyB1c2VkLgorICAgIC8vIFRPRE86IERyb3AgdGhpcyB3aGVuIHRoZXNlIGFyZSBubyBsb25nZXIg YWxsb3dlZCBhcyB0aGUgdHlwZSBhcmd1bWVudC4KKyAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7 CisgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICB9CisKKyAgICAvLyBTa2lwIGtleSB3YXJuaW5n IGlmIHRoZSB0eXBlIGlzbid0IHZhbGlkIHNpbmNlIG91ciBrZXkgdmFsaWRhdGlvbiBsb2dpYwor ICAgIC8vIGRvZXNuJ3QgZXhwZWN0IGEgbm9uLXN0cmluZy9mdW5jdGlvbiB0eXBlIGFuZCBjYW4g dGhyb3cgY29uZnVzaW5nIGVycm9ycy4KKyAgICAvLyBXZSBkb24ndCB3YW50IGV4Y2VwdGlvbiBi ZWhhdmlvciB0byBkaWZmZXIgYmV0d2VlbiBkZXYgYW5kIHByb2QuCisgICAgLy8gKFJlbmRlcmlu ZyB3aWxsIHRocm93IHdpdGggYSBoZWxwZnVsIG1lc3NhZ2UgYW5kIGFzIHNvb24gYXMgdGhlIHR5 cGUgaXMKKyAgICAvLyBmaXhlZCwgdGhlIGtleSB3YXJuaW5ncyB3aWxsIGFwcGVhci4pCisgICAg aWYgKHZhbGlkVHlwZSkgeworICAgICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVu Z3RoOyBpKyspIHsKKyAgICAgICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCB0eXBl KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KTsKKwor ICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIGNyZWF0ZUZhY3Rvcnk6IGZ1bmN0aW9uICh0 eXBlKSB7CisgICAgdmFyIHZhbGlkYXRlZEZhY3RvcnkgPSBSZWFjdEVsZW1lbnRWYWxpZGF0b3Iu Y3JlYXRlRWxlbWVudC5iaW5kKG51bGwsIHR5cGUpOworICAgIC8vIExlZ2FjeSBob29rIFRPRE86 IFdhcm4gaWYgdGhpcyBpcyBhY2Nlc3NlZAorICAgIHZhbGlkYXRlZEZhY3RvcnkudHlwZSA9IHR5 cGU7CisKKyAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICBp ZiAoY2FuRGVmaW5lUHJvcGVydHkpIHsKKyAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZh bGlkYXRlZEZhY3RvcnksICd0eXBlJywgeworICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAor ICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgImRldmVsb3BtZW50IiAh PT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ0ZhY3RvcnkudHlwZSBpcyBkZXByZWNh dGVkLiBBY2Nlc3MgdGhlIGNsYXNzIGRpcmVjdGx5ICcgKyAnYmVmb3JlIHBhc3NpbmcgaXQgdG8g Y3JlYXRlRmFjdG9yeS4nKSA6IHZvaWQgMDsKKyAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9w ZXJ0eSh0aGlzLCAndHlwZScsIHsKKyAgICAgICAgICAgICAgdmFsdWU6IHR5cGUKKyAgICAgICAg ICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgICAgfQorICAgICAgICB9 KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdmFsaWRhdGVkRmFjdG9yeTsKKyAgfSwK KworICBjbG9uZUVsZW1lbnQ6IGZ1bmN0aW9uIChlbGVtZW50LCBwcm9wcywgY2hpbGRyZW4pIHsK KyAgICB2YXIgbmV3RWxlbWVudCA9IFJlYWN0RWxlbWVudC5jbG9uZUVsZW1lbnQuYXBwbHkodGhp cywgYXJndW1lbnRzKTsKKyAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7 IGkrKykgeworICAgICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCBuZXdFbGVtZW50 LnR5cGUpOworICAgIH0KKyAgICB2YWxpZGF0ZVByb3BUeXBlcyhuZXdFbGVtZW50KTsKKyAgICBy ZXR1cm4gbmV3RWxlbWVudDsKKyAgfQorCit9OworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0RWxl bWVudFZhbGlkYXRvcjsKK30seyIxMCI6MTAsIjIwIjoyMCwiMjEiOjIxLCIyMiI6MjIsIjI5Ijoy OSwiNyI6NywiOCI6OH1dLDEzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8q KgorICogQ29weXJpZ2h0IDIwMTUtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdo dHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0 aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhl IHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQK KyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4g dGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciB3YXJu aW5nID0gX2RlcmVxXygyOSk7CisKK2Z1bmN0aW9uIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCBj YWxsZXJOYW1lKSB7CisgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAg ICB2YXIgY29uc3RydWN0b3IgPSBwdWJsaWNJbnN0YW5jZS5jb25zdHJ1Y3RvcjsKKyAgICAiZGV2 ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnJXMoLi4uKTogQ2Fu IG9ubHkgdXBkYXRlIGEgbW91bnRlZCBvciBtb3VudGluZyBjb21wb25lbnQuICcgKyAnVGhpcyB1 c3VhbGx5IG1lYW5zIHlvdSBjYWxsZWQgJXMoKSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LiAn ICsgJ1RoaXMgaXMgYSBuby1vcC4gUGxlYXNlIGNoZWNrIHRoZSBjb2RlIGZvciB0aGUgJXMgY29t cG9uZW50LicsIGNhbGxlck5hbWUsIGNhbGxlck5hbWUsIGNvbnN0cnVjdG9yICYmIChjb25zdHJ1 Y3Rvci5kaXNwbGF5TmFtZSB8fCBjb25zdHJ1Y3Rvci5uYW1lKSB8fCAnUmVhY3RDbGFzcycpIDog dm9pZCAwOworICB9Cit9CisKKy8qKgorICogVGhpcyBpcyB0aGUgYWJzdHJhY3QgQVBJIGZvciBh biB1cGRhdGUgcXVldWUuCisgKi8KK3ZhciBSZWFjdE5vb3BVcGRhdGVRdWV1ZSA9IHsKKworICAv KioKKyAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCBp cyBtb3VudGVkLgorICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBp bnN0YW5jZSB3ZSB3YW50IHRvIHRlc3QuCisgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYg bW91bnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKiBAcHJvdGVjdGVkCisgICAqIEBmaW5hbAor ICAgKi8KKyAgaXNNb3VudGVkOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UpIHsKKyAgICByZXR1 cm4gZmFsc2U7CisgIH0sCisKKyAgLyoqCisgICAqIEVucXVldWUgYSBjYWxsYmFjayB0aGF0IHdp bGwgYmUgZXhlY3V0ZWQgYWZ0ZXIgYWxsIHRoZSBwZW5kaW5nIHVwZGF0ZXMKKyAgICogaGF2ZSBw cm9jZXNzZWQuCisgICAqCisgICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2Ug VGhlIGluc3RhbmNlIHRvIHVzZSBhcyBgdGhpc2AgY29udGV4dC4KKyAgICogQHBhcmFtIHs/ZnVu Y3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBzdGF0ZSBpcyB1cGRhdGVkLgorICAgKiBAaW50 ZXJuYWwKKyAgICovCisgIGVucXVldWVDYWxsYmFjazogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNl LCBjYWxsYmFjaykge30sCisKKyAgLyoqCisgICAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hv dWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGgKKyAgICogY2VydGFpbnR5 IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uCisgICAqCisgICAqIFlv dSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFz cGVjdCBvZiB0aGUKKyAgICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRT dGF0ZWAgd2FzIG5vdCBjYWxsZWQuCisgICAqCisgICAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBz aG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2UKKyAgICogYGNvbXBvbmVu dFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC4KKyAgICoKKyAgICogQHBhcmFt IHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVy ZW5kZXIuCisgICAqIEBpbnRlcm5hbAorICAgKi8KKyAgZW5xdWV1ZUZvcmNlVXBkYXRlOiBmdW5j dGlvbiAocHVibGljSW5zdGFuY2UpIHsKKyAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ2Zv cmNlVXBkYXRlJyk7CisgIH0sCisKKyAgLyoqCisgICAqIFJlcGxhY2VzIGFsbCBvZiB0aGUgc3Rh dGUuIEFsd2F5cyB1c2UgdGhpcyBvciBgc2V0U3RhdGVgIHRvIG11dGF0ZSBzdGF0ZS4KKyAgICog WW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMgaW1tdXRhYmxlLgorICAgKgorICAgKiBU aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVs eSB1cGRhdGVkLCBzbworICAgKiBhY2Nlc3NpbmcgYHRoaXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcg dGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZhbHVlLgorICAgKgorICAgKiBAcGFyYW0g e1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJl bmRlci4KKyAgICogQHBhcmFtIHtvYmplY3R9IGNvbXBsZXRlU3RhdGUgTmV4dCBzdGF0ZS4KKyAg ICogQGludGVybmFsCisgICAqLworICBlbnF1ZXVlUmVwbGFjZVN0YXRlOiBmdW5jdGlvbiAocHVi bGljSW5zdGFuY2UsIGNvbXBsZXRlU3RhdGUpIHsKKyAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5j ZSwgJ3JlcGxhY2VTdGF0ZScpOworICB9LAorCisgIC8qKgorICAgKiBTZXRzIGEgc3Vic2V0IG9m IHRoZSBzdGF0ZS4gVGhpcyBvbmx5IGV4aXN0cyBiZWNhdXNlIF9wZW5kaW5nU3RhdGUgaXMKKyAg ICogaW50ZXJuYWwuIFRoaXMgcHJvdmlkZXMgYSBtZXJnaW5nIHN0cmF0ZWd5IHRoYXQgaXMgbm90 IGF2YWlsYWJsZSB0byBkZWVwCisgICAqIHByb3BlcnRpZXMgd2hpY2ggaXMgY29uZnVzaW5nLiBU T0RPOiBFeHBvc2UgcGVuZGluZ1N0YXRlIG9yIGRvbid0IHVzZSBpdAorICAgKiBkdXJpbmcgdGhl IG1lcmdlLgorICAgKgorICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRo ZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci4KKyAgICogQHBhcmFtIHtvYmplY3R9IHBh cnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgdG8gYmUgbWVyZ2VkIHdpdGggc3RhdGUuCisg ICAqIEBpbnRlcm5hbAorICAgKi8KKyAgZW5xdWV1ZVNldFN0YXRlOiBmdW5jdGlvbiAocHVibGlj SW5zdGFuY2UsIHBhcnRpYWxTdGF0ZSkgeworICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAn c2V0U3RhdGUnKTsKKyAgfQorfTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdE5vb3BVcGRhdGVR dWV1ZTsKK30seyIyOSI6Mjl9XSwxNDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7 CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwg cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5k ZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGlu IHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdy YW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxl IGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisK K3ZhciBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcyA9IHt9OworCitpZiAoImRldmVsb3BtZW50 IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzID0gewor ICAgIHByb3A6ICdwcm9wJywKKyAgICBjb250ZXh0OiAnY29udGV4dCcsCisgICAgY2hpbGRDb250 ZXh0OiAnY2hpbGQgY29udGV4dCcKKyAgfTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdFBy b3BUeXBlTG9jYXRpb25OYW1lczsKK30se31dLDE1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxl eHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4K KyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNl bnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNF IGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0 aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRF TlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7 CisKK3ZhciBSZWFjdEVsZW1lbnQgPSBfZGVyZXFfKDEwKTsKK3ZhciBSZWFjdFByb3BUeXBlTG9j YXRpb25OYW1lcyA9IF9kZXJlcV8oMTQpOwordmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gX2Rl cmVxXygxNik7CisKK3ZhciBlbXB0eUZ1bmN0aW9uID0gX2RlcmVxXygyNik7Cit2YXIgZ2V0SXRl cmF0b3JGbiA9IF9kZXJlcV8oMjIpOwordmFyIHdhcm5pbmcgPSBfZGVyZXFfKDI5KTsKKworLyoq CisgKiBDb2xsZWN0aW9uIG9mIG1ldGhvZHMgdGhhdCBhbGxvdyBkZWNsYXJhdGlvbiBhbmQgdmFs aWRhdGlvbiBvZiBwcm9wcyB0aGF0IGFyZQorICogc3VwcGxpZWQgdG8gUmVhY3QgY29tcG9uZW50 cy4gRXhhbXBsZSB1c2FnZToKKyAqCisgKiAgIHZhciBQcm9wcyA9IHJlcXVpcmUoJ1JlYWN0UHJv cFR5cGVzJyk7CisgKiAgIHZhciBNeUFydGljbGUgPSBSZWFjdC5jcmVhdGVDbGFzcyh7CisgKiAg ICAgcHJvcFR5cGVzOiB7CisgKiAgICAgICAvLyBBbiBvcHRpb25hbCBzdHJpbmcgcHJvcCBuYW1l ZCAiZGVzY3JpcHRpb24iLgorICogICAgICAgZGVzY3JpcHRpb246IFByb3BzLnN0cmluZywKKyAq CisgKiAgICAgICAvLyBBIHJlcXVpcmVkIGVudW0gcHJvcCBuYW1lZCAiY2F0ZWdvcnkiLgorICog ICAgICAgY2F0ZWdvcnk6IFByb3BzLm9uZU9mKFsnTmV3cycsJ1Bob3RvcyddKS5pc1JlcXVpcmVk LAorICoKKyAqICAgICAgIC8vIEEgcHJvcCBuYW1lZCAiZGlhbG9nIiB0aGF0IHJlcXVpcmVzIGFu IGluc3RhbmNlIG9mIERpYWxvZy4KKyAqICAgICAgIGRpYWxvZzogUHJvcHMuaW5zdGFuY2VPZihE aWFsb2cpLmlzUmVxdWlyZWQKKyAqICAgICB9LAorICogICAgIHJlbmRlcjogZnVuY3Rpb24oKSB7 IC4uLiB9CisgKiAgIH0pOworICoKKyAqIEEgbW9yZSBmb3JtYWwgc3BlY2lmaWNhdGlvbiBvZiBo b3cgdGhlc2UgbWV0aG9kcyBhcmUgdXNlZDoKKyAqCisgKiAgIHR5cGUgOj0gYXJyYXl8Ym9vbHxm dW5jfG9iamVjdHxudW1iZXJ8c3RyaW5nfG9uZU9mKFsuLi5dKXxpbnN0YW5jZU9mKC4uLikKKyAq ICAgZGVjbCA6PSBSZWFjdFByb3BUeXBlcy57dHlwZX0oLmlzUmVxdWlyZWQpPworICoKKyAqIEVh Y2ggYW5kIGV2ZXJ5IGRlY2xhcmF0aW9uIHByb2R1Y2VzIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2Ft ZSBzaWduYXR1cmUuIFRoaXMKKyAqIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgY3VzdG9tIHZhbGlk YXRpb24gZnVuY3Rpb25zLiBGb3IgZXhhbXBsZToKKyAqCisgKiAgdmFyIE15TGluayA9IFJlYWN0 LmNyZWF0ZUNsYXNzKHsKKyAqICAgIHByb3BUeXBlczogeworICogICAgICAvLyBBbiBvcHRpb25h bCBzdHJpbmcgb3IgVVJJIHByb3AgbmFtZWQgImhyZWYiLgorICogICAgICBocmVmOiBmdW5jdGlv bihwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUpIHsKKyAqICAgICAgICB2YXIgcHJvcFZh bHVlID0gcHJvcHNbcHJvcE5hbWVdOworICogICAgICAgIGlmIChwcm9wVmFsdWUgIT0gbnVsbCAm JiB0eXBlb2YgcHJvcFZhbHVlICE9PSAnc3RyaW5nJyAmJgorICogICAgICAgICAgICAhKHByb3BW YWx1ZSBpbnN0YW5jZW9mIFVSSSkpIHsKKyAqICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoCisg KiAgICAgICAgICAgICdFeHBlY3RlZCBhIHN0cmluZyBvciBhbiBVUkkgZm9yICcgKyBwcm9wTmFt ZSArICcgaW4gJyArCisgKiAgICAgICAgICAgIGNvbXBvbmVudE5hbWUKKyAqICAgICAgICAgICk7 CisgKiAgICAgICAgfQorICogICAgICB9CisgKiAgICB9LAorICogICAgcmVuZGVyOiBmdW5jdGlv bigpIHsuLi59CisgKiAgfSk7CisgKgorICogQGludGVybmFsCisgKi8KKwordmFyIEFOT05ZTU9V UyA9ICc8PGFub255bW91cz4+JzsKKwordmFyIFJlYWN0UHJvcFR5cGVzID0geworICBhcnJheTog Y3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2FycmF5JyksCisgIGJvb2w6IGNyZWF0ZVByaW1p dGl2ZVR5cGVDaGVja2VyKCdib29sZWFuJyksCisgIGZ1bmM6IGNyZWF0ZVByaW1pdGl2ZVR5cGVD aGVja2VyKCdmdW5jdGlvbicpLAorICBudW1iZXI6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2Vy KCdudW1iZXInKSwKKyAgb2JqZWN0OiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignb2JqZWN0 JyksCisgIHN0cmluZzogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ3N0cmluZycpLAorICBz eW1ib2w6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdzeW1ib2wnKSwKKworICBhbnk6IGNy ZWF0ZUFueVR5cGVDaGVja2VyKCksCisgIGFycmF5T2Y6IGNyZWF0ZUFycmF5T2ZUeXBlQ2hlY2tl ciwKKyAgZWxlbWVudDogY3JlYXRlRWxlbWVudFR5cGVDaGVja2VyKCksCisgIGluc3RhbmNlT2Y6 IGNyZWF0ZUluc3RhbmNlVHlwZUNoZWNrZXIsCisgIG5vZGU6IGNyZWF0ZU5vZGVDaGVja2VyKCks CisgIG9iamVjdE9mOiBjcmVhdGVPYmplY3RPZlR5cGVDaGVja2VyLAorICBvbmVPZjogY3JlYXRl RW51bVR5cGVDaGVja2VyLAorICBvbmVPZlR5cGU6IGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIsCisg IHNoYXBlOiBjcmVhdGVTaGFwZVR5cGVDaGVja2VyCit9OworCisvKioKKyAqIGlubGluZWQgT2Jq ZWN0LmlzIHBvbHlmaWxsIHRvIGF2b2lkIHJlcXVpcmluZyBjb25zdW1lcnMgc2hpcCB0aGVpciBv d24KKyAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFT Y3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pcworICovCisvKmVzbGludC1k aXNhYmxlIG5vLXNlbGYtY29tcGFyZSovCitmdW5jdGlvbiBpcyh4LCB5KSB7CisgIC8vIFNhbWVW YWx1ZSBhbGdvcml0aG0KKyAgaWYgKHggPT09IHkpIHsKKyAgICAvLyBTdGVwcyAxLTUsIDctMTAK KyAgICAvLyBTdGVwcyA2LmItNi5lOiArMCAhPSAtMAorICAgIHJldHVybiB4ICE9PSAwIHx8IDEg LyB4ID09PSAxIC8geTsKKyAgfSBlbHNlIHsKKyAgICAvLyBTdGVwIDYuYTogTmFOID09IE5hTgor ICAgIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHk7CisgIH0KK30KKy8qZXNsaW50LWVuYWJsZSBu by1zZWxmLWNvbXBhcmUqLworCisvKioKKyAqIFdlIHVzZSBhbiBFcnJvci1saWtlIG9iamVjdCBm b3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBhcyBwZW9wbGUgbWF5IGNhbGwKKyAqIFByb3BUeXBl cyBkaXJlY3RseSBhbmQgaW5zcGVjdCB0aGVpciBvdXRwdXQuIEhvd2V2ZXIgd2UgZG9uJ3QgdXNl IHJlYWwKKyAqIEVycm9ycyBhbnltb3JlLiBXZSBkb24ndCBpbnNwZWN0IHRoZWlyIHN0YWNrIGFu eXdheSwgYW5kIGNyZWF0aW5nIHRoZW0KKyAqIGlzIHByb2hpYml0aXZlbHkgZXhwZW5zaXZlIGlm IHRoZXkgYXJlIGNyZWF0ZWQgdG9vIG9mdGVuLCBzdWNoIGFzIHdoYXQKKyAqIGhhcHBlbnMgaW4g b25lT2ZUeXBlKCkgZm9yIGFueSB0eXBlIGJlZm9yZSB0aGUgb25lIHRoYXQgbWF0Y2hlZC4KKyAq LworZnVuY3Rpb24gUHJvcFR5cGVFcnJvcihtZXNzYWdlKSB7CisgIHRoaXMubWVzc2FnZSA9IG1l c3NhZ2U7CisgIHRoaXMuc3RhY2sgPSAnJzsKK30KKy8vIE1ha2UgYGluc3RhbmNlb2YgRXJyb3Jg IHN0aWxsIHdvcmsgZm9yIHJldHVybmVkIGVycm9ycy4KK1Byb3BUeXBlRXJyb3IucHJvdG90eXBl ID0gRXJyb3IucHJvdG90eXBlOworCitmdW5jdGlvbiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tl cih2YWxpZGF0ZSkgeworICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7Cisg ICAgdmFyIG1hbnVhbFByb3BUeXBlQ2FsbENhY2hlID0ge307CisgIH0KKyAgZnVuY3Rpb24gY2hl Y2tUeXBlKGlzUmVxdWlyZWQsIHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRp b24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KSB7CisgICAgY29tcG9uZW50TmFtZSA9IGNvbXBvbmVu dE5hbWUgfHwgQU5PTllNT1VTOworICAgIHByb3BGdWxsTmFtZSA9IHByb3BGdWxsTmFtZSB8fCBw cm9wTmFtZTsKKyAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAg ICBpZiAoc2VjcmV0ICE9PSBSZWFjdFByb3BUeXBlc1NlY3JldCAmJiB0eXBlb2YgY29uc29sZSAh PT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgdmFyIGNhY2hlS2V5ID0gY29tcG9uZW50TmFtZSAr ICc6JyArIHByb3BOYW1lOworICAgICAgICBpZiAoIW1hbnVhbFByb3BUeXBlQ2FsbENhY2hlW2Nh Y2hlS2V5XSkgeworICAgICAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IHdh cm5pbmcoZmFsc2UsICdZb3UgYXJlIG1hbnVhbGx5IGNhbGxpbmcgYSBSZWFjdC5Qcm9wVHlwZXMg dmFsaWRhdGlvbiAnICsgJ2Z1bmN0aW9uIGZvciB0aGUgYCVzYCBwcm9wIG9uIGAlc2AuIFRoaXMg aXMgZGVwcmVjYXRlZCAnICsgJ2FuZCB3aWxsIG5vdCB3b3JrIGluIHByb2R1Y3Rpb24gd2l0aCB0 aGUgbmV4dCBtYWpvciB2ZXJzaW9uLiAnICsgJ1lvdSBtYXkgYmUgc2VlaW5nIHRoaXMgd2Fybmlu ZyBkdWUgdG8gYSB0aGlyZC1wYXJ0eSBQcm9wVHlwZXMgJyArICdsaWJyYXJ5LiBTZWUgaHR0cHM6 Ly9mYi5tZS9yZWFjdC13YXJuaW5nLWRvbnQtY2FsbC1wcm9wdHlwZXMgJyArICdmb3IgZGV0YWls cy4nLCBwcm9wRnVsbE5hbWUsIGNvbXBvbmVudE5hbWUpIDogdm9pZCAwOworICAgICAgICAgIG1h bnVhbFByb3BUeXBlQ2FsbENhY2hlW2NhY2hlS2V5XSA9IHRydWU7CisgICAgICAgIH0KKyAgICAg IH0KKyAgICB9CisgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7CisgICAgICB2YXIg bG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dOworICAg ICAgaWYgKGlzUmVxdWlyZWQpIHsKKyAgICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gbnVs bCkgeworICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignVGhlICcgKyBsb2NhdGlv bk5hbWUgKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2AgaXMgbWFya2VkIGFzIHJlcXVpcmVkICcg KyAoJ2luIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBidXQgaXRzIHZhbHVlIGlzIGBudWxsYC4n KSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdUaGUgJyAr IGxvY2F0aW9uTmFtZSArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBpcyBtYXJrZWQgYXMgcmVx dWlyZWQgaW4gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGJ1dCBpdHMgdmFsdWUgaXMg YHVuZGVmaW5lZGAuJykpOworICAgICAgfQorICAgICAgcmV0dXJuIG51bGw7CisgICAgfSBlbHNl IHsKKyAgICAgIHJldHVybiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUs IGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpOworICAgIH0KKyAgfQorCisgIHZhciBjaGFpbmVkQ2hl Y2tUeXBlID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgZmFsc2UpOworICBjaGFpbmVkQ2hlY2tUeXBl LmlzUmVxdWlyZWQgPSBjaGVja1R5cGUuYmluZChudWxsLCB0cnVlKTsKKworICByZXR1cm4gY2hh aW5lZENoZWNrVHlwZTsKK30KKworZnVuY3Rpb24gY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIo ZXhwZWN0ZWRUeXBlKSB7CisgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29t cG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KSB7CisgICAgdmFyIHBy b3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTsKKyAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlw ZShwcm9wVmFsdWUpOworICAgIGlmIChwcm9wVHlwZSAhPT0gZXhwZWN0ZWRUeXBlKSB7CisgICAg ICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25d OworICAgICAgLy8gYHByb3BWYWx1ZWAgYmVpbmcgaW5zdGFuY2Ugb2YsIHNheSwgZGF0ZS9yZWdl eHAsIHBhc3MgdGhlICdvYmplY3QnCisgICAgICAvLyBjaGVjaywgYnV0IHdlIGNhbiBvZmZlciBh IG1vcmUgcHJlY2lzZSBlcnJvciBtZXNzYWdlIGhlcmUgcmF0aGVyIHRoYW4KKyAgICAgIC8vICdv ZiB0eXBlIGBvYmplY3RgJy4KKyAgICAgIHZhciBwcmVjaXNlVHlwZSA9IGdldFByZWNpc2VUeXBl KHByb3BWYWx1ZSk7CisKKyAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAn ICsgbG9jYXRpb25OYW1lICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgn YCcgKyBwcmVjaXNlVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdg LCBleHBlY3RlZCAnKSArICgnYCcgKyBleHBlY3RlZFR5cGUgKyAnYC4nKSk7CisgICAgfQorICAg IHJldHVybiBudWxsOworICB9CisgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2 YWxpZGF0ZSk7Cit9CisKK2Z1bmN0aW9uIGNyZWF0ZUFueVR5cGVDaGVja2VyKCkgeworICByZXR1 cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIoZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJucyhu dWxsKSk7Cit9CisKK2Z1bmN0aW9uIGNyZWF0ZUFycmF5T2ZUeXBlQ2hlY2tlcih0eXBlQ2hlY2tl cikgeworICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUs IGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHsKKyAgICBpZiAodHlwZW9mIHR5cGVDaGVja2VyICE9 PSAnZnVuY3Rpb24nKSB7CisgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1Byb3BlcnR5 IGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgY29tcG9uZW50IGAnICsgY29tcG9uZW50TmFtZSAr ICdgIGhhcyBpbnZhbGlkIFByb3BUeXBlIG5vdGF0aW9uIGluc2lkZSBhcnJheU9mLicpOworICAg IH0KKyAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdOworICAgIGlmICghQXJyYXku aXNBcnJheShwcm9wVmFsdWUpKSB7CisgICAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9w VHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dOworICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJv cFR5cGUocHJvcFZhbHVlKTsKKyAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxp ZCAnICsgbG9jYXRpb25OYW1lICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyAr ICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdg LCBleHBlY3RlZCBhbiBhcnJheS4nKSk7CisgICAgfQorICAgIGZvciAodmFyIGkgPSAwOyBpIDwg cHJvcFZhbHVlLmxlbmd0aDsgaSsrKSB7CisgICAgICB2YXIgZXJyb3IgPSB0eXBlQ2hlY2tlcihw cm9wVmFsdWUsIGksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnWycg KyBpICsgJ10nLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7CisgICAgICBpZiAoZXJyb3IgaW5zdGFu Y2VvZiBFcnJvcikgeworICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICB9CisgICAgfQorICAg IHJldHVybiBudWxsOworICB9CisgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2 YWxpZGF0ZSk7Cit9CisKK2Z1bmN0aW9uIGNyZWF0ZUVsZW1lbnRUeXBlQ2hlY2tlcigpIHsKKyAg ZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlv biwgcHJvcEZ1bGxOYW1lKSB7CisgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTsK KyAgICBpZiAoIVJlYWN0RWxlbWVudC5pc1ZhbGlkRWxlbWVudChwcm9wVmFsdWUpKSB7CisgICAg ICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25d OworICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTsKKyAgICAgIHJl dHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb25OYW1lICsgJyBgJyAr IHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBs aWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIHNpbmdsZSBSZWFjdEVs ZW1lbnQuJykpOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorICByZXR1cm4gY3JlYXRl Q2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpOworfQorCitmdW5jdGlvbiBjcmVhdGVJbnN0 YW5jZVR5cGVDaGVja2VyKGV4cGVjdGVkQ2xhc3MpIHsKKyAgZnVuY3Rpb24gdmFsaWRhdGUocHJv cHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7Cisg ICAgaWYgKCEocHJvcHNbcHJvcE5hbWVdIGluc3RhbmNlb2YgZXhwZWN0ZWRDbGFzcykpIHsKKyAg ICAgIHZhciBsb2NhdGlvbk5hbWUgPSBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlv bl07CisgICAgICB2YXIgZXhwZWN0ZWRDbGFzc05hbWUgPSBleHBlY3RlZENsYXNzLm5hbWUgfHwg QU5PTllNT1VTOworICAgICAgdmFyIGFjdHVhbENsYXNzTmFtZSA9IGdldENsYXNzTmFtZShwcm9w c1twcm9wTmFtZV0pOworICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcg KyBsb2NhdGlvbk5hbWUgKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdg JyArIGFjdHVhbENsYXNzTmFtZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSAr ICdgLCBleHBlY3RlZCAnKSArICgnaW5zdGFuY2Ugb2YgYCcgKyBleHBlY3RlZENsYXNzTmFtZSAr ICdgLicpKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKyAgcmV0dXJuIGNyZWF0ZUNo YWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTsKK30KKworZnVuY3Rpb24gY3JlYXRlRW51bVR5 cGVDaGVja2VyKGV4cGVjdGVkVmFsdWVzKSB7CisgIGlmICghQXJyYXkuaXNBcnJheShleHBlY3Rl ZFZhbHVlcykpIHsKKyAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5n KGZhbHNlLCAnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZiwgZXhwZWN0ZWQgYW4g aW5zdGFuY2Ugb2YgYXJyYXkuJykgOiB2b2lkIDA7CisgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb24u dGhhdFJldHVybnNOdWxsOworICB9CisKKyAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BO YW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7CisgICAgdmFyIHBy b3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cGVj dGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICBpZiAoaXMocHJvcFZhbHVlLCBleHBlY3Rl ZFZhbHVlc1tpXSkpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgfQorCisg ICAgdmFyIGxvY2F0aW9uTmFtZSA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9u XTsKKyAgICB2YXIgdmFsdWVzU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZXhwZWN0ZWRWYWx1ZXMp OworICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb25OYW1l ICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHZhbHVlIGAnICsgcHJvcFZhbHVlICsgJ2Ag JyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIG9uZSBv ZiAnICsgdmFsdWVzU3RyaW5nICsgJy4nKSk7CisgIH0KKyAgcmV0dXJuIGNyZWF0ZUNoYWluYWJs ZVR5cGVDaGVja2VyKHZhbGlkYXRlKTsKK30KKworZnVuY3Rpb24gY3JlYXRlT2JqZWN0T2ZUeXBl Q2hlY2tlcih0eXBlQ2hlY2tlcikgeworICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5h bWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHsKKyAgICBpZiAodHlw ZW9mIHR5cGVDaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7CisgICAgICByZXR1cm4gbmV3IFByb3BU eXBlRXJyb3IoJ1Byb3BlcnR5IGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgY29tcG9uZW50IGAn ICsgY29tcG9uZW50TmFtZSArICdgIGhhcyBpbnZhbGlkIFByb3BUeXBlIG5vdGF0aW9uIGluc2lk ZSBvYmplY3RPZi4nKTsKKyAgICB9CisgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1l XTsKKyAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpOworICAgIGlmIChw cm9wVHlwZSAhPT0gJ29iamVjdCcpIHsKKyAgICAgIHZhciBsb2NhdGlvbk5hbWUgPSBSZWFjdFBy b3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl07CisgICAgICByZXR1cm4gbmV3IFByb3BUeXBl RXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uTmFtZSArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAn YCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBv bmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYW4gb2JqZWN0LicpKTsKKyAgICB9CisgICAgZm9yICh2 YXIga2V5IGluIHByb3BWYWx1ZSkgeworICAgICAgaWYgKHByb3BWYWx1ZS5oYXNPd25Qcm9wZXJ0 eShrZXkpKSB7CisgICAgICAgIHZhciBlcnJvciA9IHR5cGVDaGVja2VyKHByb3BWYWx1ZSwga2V5 LCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJy4nICsga2V5LCBSZWFj dFByb3BUeXBlc1NlY3JldCk7CisgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7 CisgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAg IHJldHVybiBudWxsOworICB9CisgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2 YWxpZGF0ZSk7Cit9CisKK2Z1bmN0aW9uIGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIoYXJyYXlPZlR5 cGVDaGVja2VycykgeworICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyYXlPZlR5cGVDaGVja2Vycykp IHsKKyAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAn SW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZlR5cGUsIGV4cGVjdGVkIGFuIGluc3Rh bmNlIG9mIGFycmF5LicpIDogdm9pZCAwOworICAgIHJldHVybiBlbXB0eUZ1bmN0aW9uLnRoYXRS ZXR1cm5zTnVsbDsKKyAgfQorCisgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwg Y29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkgeworICAgIGZvciAodmFyIGkg PSAwOyBpIDwgYXJyYXlPZlR5cGVDaGVja2Vycy5sZW5ndGg7IGkrKykgeworICAgICAgdmFyIGNo ZWNrZXIgPSBhcnJheU9mVHlwZUNoZWNrZXJzW2ldOworICAgICAgaWYgKGNoZWNrZXIocHJvcHMs IHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBSZWFjdFBy b3BUeXBlc1NlY3JldCkgPT0gbnVsbCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0K KyAgICB9CisKKyAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFt ZXNbbG9jYXRpb25dOworICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsg bG9jYXRpb25OYW1lICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIHN1cHBsaWVkIHRvICcgKyAo J2AnICsgY29tcG9uZW50TmFtZSArICdgLicpKTsKKyAgfQorICByZXR1cm4gY3JlYXRlQ2hhaW5h YmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpOworfQorCitmdW5jdGlvbiBjcmVhdGVOb2RlQ2hlY2tl cigpIHsKKyAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1l LCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7CisgICAgaWYgKCFpc05vZGUocHJvcHNbcHJvcE5h bWVdKSkgeworICAgICAgdmFyIGxvY2F0aW9uTmFtZSA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5h bWVzW2xvY2F0aW9uXTsKKyAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAn ICsgbG9jYXRpb25OYW1lICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIHN1cHBsaWVkIHRvICcg KyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIFJlYWN0Tm9kZS4nKSk7Cisg ICAgfQorICAgIHJldHVybiBudWxsOworICB9CisgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBl Q2hlY2tlcih2YWxpZGF0ZSk7Cit9CisKK2Z1bmN0aW9uIGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXIo c2hhcGVUeXBlcykgeworICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBv bmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHsKKyAgICB2YXIgcHJvcFZhbHVlID0g cHJvcHNbcHJvcE5hbWVdOworICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1 ZSk7CisgICAgaWYgKHByb3BUeXBlICE9PSAnb2JqZWN0JykgeworICAgICAgdmFyIGxvY2F0aW9u TmFtZSA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXTsKKyAgICAgIHJldHVy biBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb25OYW1lICsgJyBgJyArIHBy b3BGdWxsTmFtZSArICdgIG9mIHR5cGUgYCcgKyBwcm9wVHlwZSArICdgICcgKyAoJ3N1cHBsaWVk IHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBgb2JqZWN0YC4nKSk7CisgICAg fQorICAgIGZvciAodmFyIGtleSBpbiBzaGFwZVR5cGVzKSB7CisgICAgICB2YXIgY2hlY2tlciA9 IHNoYXBlVHlwZXNba2V5XTsKKyAgICAgIGlmICghY2hlY2tlcikgeworICAgICAgICBjb250aW51 ZTsKKyAgICAgIH0KKyAgICAgIHZhciBlcnJvciA9IGNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNv bXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJv cFR5cGVzU2VjcmV0KTsKKyAgICAgIGlmIChlcnJvcikgeworICAgICAgICByZXR1cm4gZXJyb3I7 CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxsOworICB9CisgIHJldHVybiBjcmVhdGVD aGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7Cit9CisKK2Z1bmN0aW9uIGlzTm9kZShwcm9w VmFsdWUpIHsKKyAgc3dpdGNoICh0eXBlb2YgcHJvcFZhbHVlKSB7CisgICAgY2FzZSAnbnVtYmVy JzoKKyAgICBjYXNlICdzdHJpbmcnOgorICAgIGNhc2UgJ3VuZGVmaW5lZCc6CisgICAgICByZXR1 cm4gdHJ1ZTsKKyAgICBjYXNlICdib29sZWFuJzoKKyAgICAgIHJldHVybiAhcHJvcFZhbHVlOwor ICAgIGNhc2UgJ29iamVjdCc6CisgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7 CisgICAgICAgIHJldHVybiBwcm9wVmFsdWUuZXZlcnkoaXNOb2RlKTsKKyAgICAgIH0KKyAgICAg IGlmIChwcm9wVmFsdWUgPT09IG51bGwgfHwgUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50KHBy b3BWYWx1ZSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIHZhciBp dGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihwcm9wVmFsdWUpOworICAgICAgaWYgKGl0ZXJhdG9y Rm4pIHsKKyAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKHByb3BWYWx1ZSk7 CisgICAgICAgIHZhciBzdGVwOworICAgICAgICBpZiAoaXRlcmF0b3JGbiAhPT0gcHJvcFZhbHVl LmVudHJpZXMpIHsKKyAgICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5k b25lKSB7CisgICAgICAgICAgICBpZiAoIWlzTm9kZShzdGVwLnZhbHVlKSkgeworICAgICAgICAg ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9 IGVsc2UgeworICAgICAgICAgIC8vIEl0ZXJhdG9yIHdpbGwgcHJvdmlkZSBlbnRyeSBbayx2XSB0 dXBsZXMgcmF0aGVyIHRoYW4gdmFsdWVzLgorICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVy YXRvci5uZXh0KCkpLmRvbmUpIHsKKyAgICAgICAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7 CisgICAgICAgICAgICBpZiAoZW50cnkpIHsKKyAgICAgICAgICAgICAgaWYgKCFpc05vZGUoZW50 cnlbMV0pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICB9 CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2Ugewor ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0cnVlOworICAg IGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworZnVuY3Rpb24gaXNTeW1i b2wocHJvcFR5cGUsIHByb3BWYWx1ZSkgeworICAvLyBOYXRpdmUgU3ltYm9sLgorICBpZiAocHJv cFR5cGUgPT09ICdzeW1ib2wnKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyAxOS40 LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddID09PSAnU3ltYm9sJworICBpZiAo cHJvcFZhbHVlWydAQHRvU3RyaW5nVGFnJ10gPT09ICdTeW1ib2wnKSB7CisgICAgcmV0dXJuIHRy dWU7CisgIH0KKworICAvLyBGYWxsYmFjayBmb3Igbm9uLXNwZWMgY29tcGxpYW50IFN5bWJvbHMg d2hpY2ggYXJlIHBvbHlmaWxsZWQuCisgIGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24n ICYmIHByb3BWYWx1ZSBpbnN0YW5jZW9mIFN5bWJvbCkgeworICAgIHJldHVybiB0cnVlOworICB9 CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBFcXVpdmFsZW50IG9mIGB0eXBlb2ZgIGJ1dCB3 aXRoIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGFycmF5IGFuZCByZWdleHAuCitmdW5jdGlvbiBnZXRQ cm9wVHlwZShwcm9wVmFsdWUpIHsKKyAgdmFyIHByb3BUeXBlID0gdHlwZW9mIHByb3BWYWx1ZTsK KyAgaWYgKEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkgeworICAgIHJldHVybiAnYXJyYXknOwor ICB9CisgIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHsKKyAgICAvLyBPbGQgd2Vi a2l0cyAoYXQgbGVhc3QgdW50aWwgQW5kcm9pZCA0LjApIHJldHVybiAnZnVuY3Rpb24nIHJhdGhl ciB0aGFuCisgICAgLy8gJ29iamVjdCcgZm9yIHR5cGVvZiBhIFJlZ0V4cC4gV2UnbGwgbm9ybWFs aXplIHRoaXMgaGVyZSBzbyB0aGF0IC9ibGEvCisgICAgLy8gcGFzc2VzIFByb3BUeXBlcy5vYmpl Y3QuCisgICAgcmV0dXJuICdvYmplY3QnOworICB9CisgIGlmIChpc1N5bWJvbChwcm9wVHlwZSwg cHJvcFZhbHVlKSkgeworICAgIHJldHVybiAnc3ltYm9sJzsKKyAgfQorICByZXR1cm4gcHJvcFR5 cGU7Cit9CisKKy8vIFRoaXMgaGFuZGxlcyBtb3JlIHR5cGVzIHRoYW4gYGdldFByb3BUeXBlYC4g T25seSB1c2VkIGZvciBlcnJvciBtZXNzYWdlcy4KKy8vIFNlZSBgY3JlYXRlUHJpbWl0aXZlVHlw ZUNoZWNrZXJgLgorZnVuY3Rpb24gZ2V0UHJlY2lzZVR5cGUocHJvcFZhbHVlKSB7CisgIHZhciBw cm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7CisgIGlmIChwcm9wVHlwZSA9PT0gJ29i amVjdCcpIHsKKyAgICBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgeworICAgICAgcmV0 dXJuICdkYXRlJzsKKyAgICB9IGVsc2UgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkg eworICAgICAgcmV0dXJuICdyZWdleHAnOworICAgIH0KKyAgfQorICByZXR1cm4gcHJvcFR5cGU7 Cit9CisKKy8vIFJldHVybnMgY2xhc3MgbmFtZSBvZiB0aGUgb2JqZWN0LCBpZiBhbnkuCitmdW5j dGlvbiBnZXRDbGFzc05hbWUocHJvcFZhbHVlKSB7CisgIGlmICghcHJvcFZhbHVlLmNvbnN0cnVj dG9yIHx8ICFwcm9wVmFsdWUuY29uc3RydWN0b3IubmFtZSkgeworICAgIHJldHVybiBBTk9OWU1P VVM7CisgIH0KKyAgcmV0dXJuIHByb3BWYWx1ZS5jb25zdHJ1Y3Rvci5uYW1lOworfQorCittb2R1 bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVzOworfSx7IjEwIjoxMCwiMTQiOjE0LCIxNiI6MTYs IjIyIjoyMiwiMjYiOjI2LCIyOSI6Mjl9XSwxNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhw b3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisg KiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5z ZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBm aWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlv bmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5U UyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisndXNlIHN0cmlj dCc7CisKK3ZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9ICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJ U19PUl9ZT1VfV0lMTF9CRV9GSVJFRCc7CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RQcm9wVHlw ZXNTZWNyZXQ7Cit9LHt9XSwxNzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7Cisv KioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmln aHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIg dGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRo ZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50 CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGlu IHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX2Fz c2lnbiA9IF9kZXJlcV8oMzApOworCit2YXIgUmVhY3RDb21wb25lbnQgPSBfZGVyZXFfKDYpOwor dmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0gX2RlcmVxXygxMyk7CisKK3ZhciBlbXB0eU9iamVj dCA9IF9kZXJlcV8oMjcpOworCisvKioKKyAqIEJhc2UgY2xhc3MgaGVscGVycyBmb3IgdGhlIHVw ZGF0aW5nIHN0YXRlIG9mIGEgY29tcG9uZW50LgorICovCitmdW5jdGlvbiBSZWFjdFB1cmVDb21w b25lbnQocHJvcHMsIGNvbnRleHQsIHVwZGF0ZXIpIHsKKyAgLy8gRHVwbGljYXRlZCBmcm9tIFJl YWN0Q29tcG9uZW50LgorICB0aGlzLnByb3BzID0gcHJvcHM7CisgIHRoaXMuY29udGV4dCA9IGNv bnRleHQ7CisgIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0OworICAvLyBXZSBpbml0aWFsaXplIHRo ZSBkZWZhdWx0IHVwZGF0ZXIgYnV0IHRoZSByZWFsIG9uZSBnZXRzIGluamVjdGVkIGJ5IHRoZQor ICAvLyByZW5kZXJlci4KKyAgdGhpcy51cGRhdGVyID0gdXBkYXRlciB8fCBSZWFjdE5vb3BVcGRh dGVRdWV1ZTsKK30KKworZnVuY3Rpb24gQ29tcG9uZW50RHVtbXkoKSB7fQorQ29tcG9uZW50RHVt bXkucHJvdG90eXBlID0gUmVhY3RDb21wb25lbnQucHJvdG90eXBlOworUmVhY3RQdXJlQ29tcG9u ZW50LnByb3RvdHlwZSA9IG5ldyBDb21wb25lbnREdW1teSgpOworUmVhY3RQdXJlQ29tcG9uZW50 LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlYWN0UHVyZUNvbXBvbmVudDsKKy8vIEF2b2lkIGFu IGV4dHJhIHByb3RvdHlwZSBqdW1wIGZvciB0aGVzZSBtZXRob2RzLgorX2Fzc2lnbihSZWFjdFB1 cmVDb21wb25lbnQucHJvdG90eXBlLCBSZWFjdENvbXBvbmVudC5wcm90b3R5cGUpOworUmVhY3RQ dXJlQ29tcG9uZW50LnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCA9IHRydWU7CisKK21v ZHVsZS5leHBvcnRzID0gUmVhY3RQdXJlQ29tcG9uZW50OworfSx7IjEzIjoxMywiMjciOjI3LCIz MCI6MzAsIjYiOjZ9XSwxODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioK KyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRz IHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhl IEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSBy b290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50Cisg KiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRo ZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX2Fzc2ln biA9IF9kZXJlcV8oMzApOworCit2YXIgUmVhY3QgPSBfZGVyZXFfKDMpOworCisvLyBgdmVyc2lv bmAgd2lsbCBiZSBhZGRlZCBoZXJlIGJ5IHRoZSBSZWFjdCBtb2R1bGUuCit2YXIgUmVhY3RVTURF bnRyeSA9IF9hc3NpZ24oeworICBfX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1Vf V0lMTF9CRV9GSVJFRDogeworICAgIFJlYWN0Q3VycmVudE93bmVyOiBfZGVyZXFfKDgpCisgIH0K K30sIFJlYWN0KTsKKworaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICBf YXNzaWduKFJlYWN0VU1ERW50cnkuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9V X1dJTExfQkVfRklSRUQsIHsKKyAgICAvLyBSZWFjdENvbXBvbmVudFRyZWVIb29rIHNob3VsZCBu b3QgYmUgaW5jbHVkZWQgaW4gcHJvZHVjdGlvbi4KKyAgICBSZWFjdENvbXBvbmVudFRyZWVIb29r OiBfZGVyZXFfKDcpCisgIH0pOworfQorCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0VU1ERW50cnk7 Cit9LHsiMyI6MywiMzAiOjMwLCI3Ijo3LCI4Ijo4fV0sMTk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9k dWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywg SW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlz IGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJ Q0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4g YWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhl IFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3Ry aWN0JzsKKworbW9kdWxlLmV4cG9ydHMgPSAnMTUuNC4yJzsKK30se31dLDIwOltmdW5jdGlvbihf ZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwg RmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3Vy Y2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4g dGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNl IHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZv dW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAor ICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIGNhbkRlZmluZVByb3BlcnR5ID0gZmFsc2U7Citp ZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgIHRyeSB7CisgICAgLy8gJEZs b3dGaXhNZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvMjg1CisgICAg T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAneCcsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7fSB9KTsK KyAgICBjYW5EZWZpbmVQcm9wZXJ0eSA9IHRydWU7CisgIH0gY2F0Y2ggKHgpIHsKKyAgICAvLyBJ RSB3aWxsIGZhaWwgb24gZGVmaW5lUHJvcGVydHkKKyAgfQorfQorCittb2R1bGUuZXhwb3J0cyA9 IGNhbkRlZmluZVByb3BlcnR5OworfSx7fV0sMjE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4 cG9ydHMpeworKGZ1bmN0aW9uIChwcm9jZXNzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJl c2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhp cyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91 bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMg c291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2Fu IGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoK KyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJvZEludmFyaWFudCA9IF9kZXJlcV8oMjQp OworCit2YXIgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMgPSBfZGVyZXFfKDE0KTsKK3ZhciBS ZWFjdFByb3BUeXBlc1NlY3JldCA9IF9kZXJlcV8oMTYpOworCit2YXIgaW52YXJpYW50ID0gX2Rl cmVxXygyOCk7Cit2YXIgd2FybmluZyA9IF9kZXJlcV8oMjkpOworCit2YXIgUmVhY3RDb21wb25l bnRUcmVlSG9vazsKKworaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9j ZXNzLmVudiAmJiAiZGV2ZWxvcG1lbnQiID09PSAndGVzdCcpIHsKKyAgLy8gVGVtcG9yYXJ5IGhh Y2suCisgIC8vIElubGluZSByZXF1aXJlcyBkb24ndCB3b3JrIHdlbGwgd2l0aCBKZXN0OgorICAv LyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcyNDAKKyAgLy8gUmVt b3ZlIHRoZSBpbmxpbmUgcmVxdWlyZXMgd2hlbiB3ZSBkb24ndCBuZWVkIHRoZW0gYW55bW9yZToK KyAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNzE3OAorICBSZWFj dENvbXBvbmVudFRyZWVIb29rID0gX2RlcmVxXyg3KTsKK30KKwordmFyIGxvZ2dlZFR5cGVGYWls dXJlcyA9IHt9OworCisvKioKKyAqIEFzc2VydCB0aGF0IHRoZSB2YWx1ZXMgbWF0Y2ggd2l0aCB0 aGUgdHlwZSBzcGVjcy4KKyAqIEVycm9yIG1lc3NhZ2VzIGFyZSBtZW1vcml6ZWQgYW5kIHdpbGwg b25seSBiZSBzaG93biBvbmNlLgorICoKKyAqIEBwYXJhbSB7b2JqZWN0fSB0eXBlU3BlY3MgTWFw IG9mIG5hbWUgdG8gYSBSZWFjdFByb3BUeXBlCisgKiBAcGFyYW0ge29iamVjdH0gdmFsdWVzIFJ1 bnRpbWUgdmFsdWVzIHRoYXQgbmVlZCB0byBiZSB0eXBlLWNoZWNrZWQKKyAqIEBwYXJhbSB7c3Ry aW5nfSBsb2NhdGlvbiBlLmcuICJwcm9wIiwgImNvbnRleHQiLCAiY2hpbGQgY29udGV4dCIKKyAq IEBwYXJhbSB7c3RyaW5nfSBjb21wb25lbnROYW1lIE5hbWUgb2YgdGhlIGNvbXBvbmVudCBmb3Ig ZXJyb3IgbWVzc2FnZXMuCisgKiBAcGFyYW0gez9vYmplY3R9IGVsZW1lbnQgVGhlIFJlYWN0IGVs ZW1lbnQgdGhhdCBpcyBiZWluZyB0eXBlLWNoZWNrZWQKKyAqIEBwYXJhbSB7P251bWJlcn0gZGVi dWdJRCBUaGUgUmVhY3QgY29tcG9uZW50IGluc3RhbmNlIHRoYXQgaXMgYmVpbmcgdHlwZS1jaGVj a2VkCisgKiBAcHJpdmF0ZQorICovCitmdW5jdGlvbiBjaGVja1JlYWN0VHlwZVNwZWModHlwZVNw ZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBlbGVtZW50LCBkZWJ1Z0lEKSB7 CisgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHsKKyAgICBpZiAodHlwZVNw ZWNzLmhhc093blByb3BlcnR5KHR5cGVTcGVjTmFtZSkpIHsKKyAgICAgIHZhciBlcnJvcjsKKyAg ICAgIC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3 ZSBkb24ndCB3YW50IHRvCisgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQg ZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuCisgICAgICAvLyBBZnRlciB0aGVzZSBo YXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuCisgICAgICB0cnkgewor ICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBj YXVnaHQuIEl0J3MgdGhlIHNhbWUKKyAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlz IHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLgorICAgICAgICAhKHR5cGVv ZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSA9PT0gJ2Z1bmN0aW9uJykgPyAiZGV2ZWxvcG1lbnQi ICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICclczogJXMgdHlwZSBgJXNgIGlz IGludmFsaWQ7IGl0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIFJlYWN0LlByb3BU eXBlcy4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIFJlYWN0UHJvcFR5cGVMb2Nh dGlvbk5hbWVzW2xvY2F0aW9uXSwgdHlwZVNwZWNOYW1lKSA6IF9wcm9kSW52YXJpYW50KCc4NCcs IGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFt ZXNbbG9jYXRpb25dLCB0eXBlU3BlY05hbWUpIDogdm9pZCAwOworICAgICAgICBlcnJvciA9IHR5 cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1l LCBsb2NhdGlvbiwgbnVsbCwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpOworICAgICAgfSBjYXRjaCAo ZXgpIHsKKyAgICAgICAgZXJyb3IgPSBleDsKKyAgICAgIH0KKyAgICAgICJkZXZlbG9wbWVudCIg IT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIWVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgRXJy b3IsICclczogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICVzIGAlc2AgaXMgaW52YWxpZDsgdGhlIHR5 cGUgY2hlY2tlciAnICsgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3Jg IGJ1dCByZXR1cm5lZCBhICVzLiAnICsgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBh biBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgKyAnY3JlYXRvciAoYXJyYXlPZiwgaW5z dGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICsgJ3NoYXBlIGFsbCBy ZXF1aXJlIGFuIGFyZ3VtZW50KS4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIFJl YWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXSwgdHlwZVNwZWNOYW1lLCB0eXBlb2Yg ZXJyb3IpIDogdm9pZCAwOworICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgIShl cnJvci5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHsKKyAgICAgICAgLy8gT25seSBt b25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qg b2YgdGhlCisgICAgICAgIC8vIHNhbWUgZXJyb3IuCisgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJl c1tlcnJvci5tZXNzYWdlXSA9IHRydWU7CisKKyAgICAgICAgdmFyIGNvbXBvbmVudFN0YWNrSW5m byA9ICcnOworCisgICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsK KyAgICAgICAgICBpZiAoIVJlYWN0Q29tcG9uZW50VHJlZUhvb2spIHsKKyAgICAgICAgICAgIFJl YWN0Q29tcG9uZW50VHJlZUhvb2sgPSBfZGVyZXFfKDcpOworICAgICAgICAgIH0KKyAgICAgICAg ICBpZiAoZGVidWdJRCAhPT0gbnVsbCkgeworICAgICAgICAgICAgY29tcG9uZW50U3RhY2tJbmZv ID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChkZWJ1Z0lEKTsK KyAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgIT09IG51bGwpIHsKKyAgICAgICAgICAgIGNv bXBvbmVudFN0YWNrSW5mbyA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0Q3VycmVudFN0YWNr QWRkZW5kdW0oZWxlbWVudCk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgImRl dmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ0ZhaWxlZCAlcyB0 eXBlOiAlcyVzJywgbG9jYXRpb24sIGVycm9yLm1lc3NhZ2UsIGNvbXBvbmVudFN0YWNrSW5mbykg OiB2b2lkIDA7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK21vZHVsZS5leHBvcnRzID0gY2hl Y2tSZWFjdFR5cGVTcGVjOworfSkuY2FsbCh0aGlzLHVuZGVmaW5lZCkKK30seyIxNCI6MTQsIjE2 IjoxNiwiMjQiOjI0LCIyOCI6MjgsIjI5IjoyOSwiNyI6N31dLDIyOltmdW5jdGlvbihfZGVyZXFf LG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJv b2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29k ZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisg KiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUu IEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGlu IHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAorICovCisK Kyd1c2Ugc3RyaWN0JzsKKworLyogZ2xvYmFsIFN5bWJvbCAqLworCit2YXIgSVRFUkFUT1JfU1lN Qk9MID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuaXRlcmF0b3I7Cit2 YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7IC8vIEJlZm9yZSBTeW1ib2wg c3BlYy4KKworLyoqCisgKiBSZXR1cm5zIHRoZSBpdGVyYXRvciBtZXRob2QgZnVuY3Rpb24gY29u dGFpbmVkIG9uIHRoZSBpdGVyYWJsZSBvYmplY3QuCisgKgorICogQmUgc3VyZSB0byBpbnZva2Ug dGhlIGZ1bmN0aW9uIHdpdGggdGhlIGl0ZXJhYmxlIGFzIGNvbnRleHQ6CisgKgorICogICAgIHZh ciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihteUl0ZXJhYmxlKTsKKyAqICAgICBpZiAoaXRl cmF0b3JGbikgeworICogICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG15SXRl cmFibGUpOworICogICAgICAgLi4uCisgKiAgICAgfQorICoKKyAqIEBwYXJhbSB7P29iamVjdH0g bWF5YmVJdGVyYWJsZQorICogQHJldHVybiB7P2Z1bmN0aW9ufQorICovCitmdW5jdGlvbiBnZXRJ dGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHsKKyAgdmFyIGl0ZXJhdG9yRm4gPSBtYXliZUl0ZXJh YmxlICYmIChJVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtJVEVSQVRPUl9TWU1CT0xd IHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdKTsKKyAgaWYgKHR5cGVvZiBp dGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7CisgICAgcmV0dXJuIGl0ZXJhdG9yRm47CisgIH0K K30KKworbW9kdWxlLmV4cG9ydHMgPSBnZXRJdGVyYXRvckZuOworfSx7fV0sMjM6W2Z1bmN0aW9u KF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50 LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNv dXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBp biB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3Vy Y2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUg Zm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICov CisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJvZEludmFyaWFudCA9IF9kZXJlcV8oMjQpOworCit2 YXIgUmVhY3RFbGVtZW50ID0gX2RlcmVxXygxMCk7CisKK3ZhciBpbnZhcmlhbnQgPSBfZGVyZXFf KDI4KTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBpbiBhIGNvbGxlY3Rpb24g b2YgY2hpbGRyZW4gYW5kIHZlcmlmaWVzIHRoYXQgdGhlcmUKKyAqIGlzIG9ubHkgb25lIGNoaWxk IGluIHRoZSBjb2xsZWN0aW9uLgorICoKKyAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5p by9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jaGlsZHJlbi5vbmx5CisgKgor ICogVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRo YXQgYSBzaW5nbGUgY2hpbGQgZ2V0cworICogcGFzc2VkIHdpdGhvdXQgYSB3cmFwcGVyLCBidXQg dGhlIHB1cnBvc2Ugb2YgdGhpcyBoZWxwZXIgZnVuY3Rpb24gaXMgdG8KKyAqIGFic3RyYWN0IGF3 YXkgdGhlIHBhcnRpY3VsYXIgc3RydWN0dXJlIG9mIGNoaWxkcmVuLgorICoKKyAqIEBwYXJhbSB7 P29iamVjdH0gY2hpbGRyZW4gQ2hpbGQgY29sbGVjdGlvbiBzdHJ1Y3R1cmUuCisgKiBAcmV0dXJu IHtSZWFjdEVsZW1lbnR9IFRoZSBmaXJzdCBhbmQgb25seSBgUmVhY3RFbGVtZW50YCBjb250YWlu ZWQgaW4gdGhlCisgKiBzdHJ1Y3R1cmUuCisgKi8KK2Z1bmN0aW9uIG9ubHlDaGlsZChjaGlsZHJl bikgeworICAhUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSA/ICJkZXZlbG9w bWVudCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0LkNoaWxkcmVu Lm9ubHkgZXhwZWN0ZWQgdG8gcmVjZWl2ZSBhIHNpbmdsZSBSZWFjdCBlbGVtZW50IGNoaWxkLicp IDogX3Byb2RJbnZhcmlhbnQoJzE0MycpIDogdm9pZCAwOworICByZXR1cm4gY2hpbGRyZW47Cit9 CisKK21vZHVsZS5leHBvcnRzID0gb25seUNoaWxkOworfSx7IjEwIjoxMCwiMjQiOjI0LCIyOCI6 Mjh9XSwyNDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvcHly aWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNl cnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qt c3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBk aXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2Yg cGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2Ft ZSBkaXJlY3RvcnkuCisgKgorICogCisgKi8KKyd1c2Ugc3RyaWN0JzsKKworLyoqCisgKiBXQVJO SU5HOiBETyBOT1QgbWFudWFsbHkgcmVxdWlyZSB0aGlzIG1vZHVsZS4KKyAqIFRoaXMgaXMgYSBy ZXBsYWNlbWVudCBmb3IgYGludmFyaWFudCguLi4pYCB1c2VkIGJ5IHRoZSBlcnJvciBjb2RlIHN5 c3RlbQorICogYW5kIHdpbGwgX29ubHlfIGJlIHJlcXVpcmVkIGJ5IHRoZSBjb3JyZXNwb25kaW5n IGJhYmVsIHBhc3MuCisgKiBJdCBhbHdheXMgdGhyb3dzLgorICovCisKK2Z1bmN0aW9uIHJlYWN0 UHJvZEludmFyaWFudChjb2RlKSB7CisgIHZhciBhcmdDb3VudCA9IGFyZ3VtZW50cy5sZW5ndGgg LSAxOworCisgIHZhciBtZXNzYWdlID0gJ01pbmlmaWVkIFJlYWN0IGVycm9yICMnICsgY29kZSAr ICc7IHZpc2l0ICcgKyAnaHR0cDovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL2Vycm9y LWRlY29kZXIuaHRtbD9pbnZhcmlhbnQ9JyArIGNvZGU7CisKKyAgZm9yICh2YXIgYXJnSWR4ID0g MDsgYXJnSWR4IDwgYXJnQ291bnQ7IGFyZ0lkeCsrKSB7CisgICAgbWVzc2FnZSArPSAnJmFyZ3Nb XT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3VtZW50c1thcmdJZHggKyAxXSk7CisgIH0KKwor ICBtZXNzYWdlICs9ICcgZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZp ZWQgZGV2IGVudmlyb25tZW50JyArICcgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhl bHBmdWwgd2FybmluZ3MuJzsKKworICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7Cisg IGVycm9yLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7CisgIGVycm9yLmZyYW1lc1RvUG9w ID0gMTsgLy8gd2UgZG9uJ3QgY2FyZSBhYm91dCByZWFjdFByb2RJbnZhcmlhbnQncyBvd24gZnJh bWUKKworICB0aHJvdyBlcnJvcjsKK30KKworbW9kdWxlLmV4cG9ydHMgPSByZWFjdFByb2RJbnZh cmlhbnQ7Cit9LHt9XSwyNTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisvKioK KyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRz IHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhl IEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSBy b290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50Cisg KiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRo ZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgX3Byb2RJ bnZhcmlhbnQgPSBfZGVyZXFfKDI0KTsKKwordmFyIFJlYWN0Q3VycmVudE93bmVyID0gX2RlcmVx Xyg4KTsKK3ZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBfZGVyZXFfKDExKTsKKwordmFyIGdldEl0 ZXJhdG9yRm4gPSBfZGVyZXFfKDIyKTsKK3ZhciBpbnZhcmlhbnQgPSBfZGVyZXFfKDI4KTsKK3Zh ciBLZXlFc2NhcGVVdGlscyA9IF9kZXJlcV8oMSk7Cit2YXIgd2FybmluZyA9IF9kZXJlcV8oMjkp OworCit2YXIgU0VQQVJBVE9SID0gJy4nOwordmFyIFNVQlNFUEFSQVRPUiA9ICc6JzsKKworLyoq CisgKiBUaGlzIGlzIGlubGluZWQgZnJvbSBSZWFjdEVsZW1lbnQgc2luY2UgdGhpcyBmaWxlIGlz IHNoYXJlZCBiZXR3ZWVuCisgKiBpc29tb3JwaGljIGFuZCByZW5kZXJlcnMuIFdlIGNvdWxkIGV4 dHJhY3QgdGhpcyB0byBhCisgKgorICovCisKKy8qKgorICogVE9ETzogVGVzdCB0aGF0IGEgc2lu Z2xlIGNoaWxkIGFuZCBhbiBhcnJheSB3aXRoIG9uZSBpdGVtIGhhdmUgdGhlIHNhbWUga2V5Cisg KiBwYXR0ZXJuLgorICovCisKK3ZhciBkaWRXYXJuQWJvdXRNYXBzID0gZmFsc2U7CisKKy8qKgor ICogR2VuZXJhdGUgYSBrZXkgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyBhIGNvbXBvbmVudCB3aXRo aW4gYSBzZXQuCisgKgorICogQHBhcmFtIHsqfSBjb21wb25lbnQgQSBjb21wb25lbnQgdGhhdCBj b3VsZCBjb250YWluIGEgbWFudWFsIGtleS4KKyAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRl eCB0aGF0IGlzIHVzZWQgaWYgYSBtYW51YWwga2V5IGlzIG5vdCBwcm92aWRlZC4KKyAqIEByZXR1 cm4ge3N0cmluZ30KKyAqLworZnVuY3Rpb24gZ2V0Q29tcG9uZW50S2V5KGNvbXBvbmVudCwgaW5k ZXgpIHsKKyAgLy8gRG8gc29tZSB0eXBlY2hlY2tpbmcgaGVyZSBzaW5jZSB3ZSBjYWxsIHRoaXMg YmxpbmRseS4gV2Ugd2FudCB0byBlbnN1cmUKKyAgLy8gdGhhdCB3ZSBkb24ndCBibG9jayBwb3Rl bnRpYWwgZnV0dXJlIEVTIEFQSXMuCisgIGlmIChjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVu dCA9PT0gJ29iamVjdCcgJiYgY29tcG9uZW50LmtleSAhPSBudWxsKSB7CisgICAgLy8gRXhwbGlj aXQga2V5CisgICAgcmV0dXJuIEtleUVzY2FwZVV0aWxzLmVzY2FwZShjb21wb25lbnQua2V5KTsK KyAgfQorICAvLyBJbXBsaWNpdCBrZXkgZGV0ZXJtaW5lZCBieSB0aGUgaW5kZXggaW4gdGhlIHNl dAorICByZXR1cm4gaW5kZXgudG9TdHJpbmcoMzYpOworfQorCisvKioKKyAqIEBwYXJhbSB7Pyp9 IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLgorICogQHBhcmFtIHshc3RyaW5nfSBu YW1lU29GYXIgTmFtZSBvZiB0aGUga2V5IHBhdGggc28gZmFyLgorICogQHBhcmFtIHshZnVuY3Rp b259IGNhbGxiYWNrIENhbGxiYWNrIHRvIGludm9rZSB3aXRoIGVhY2ggY2hpbGQgZm91bmQuCisg KiBAcGFyYW0gez8qfSB0cmF2ZXJzZUNvbnRleHQgVXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRo cm91Z2hvdXQgdGhlIHRyYXZlcnNhbAorICogcHJvY2Vzcy4KKyAqIEByZXR1cm4geyFudW1iZXJ9 IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4gaW4gdGhpcyBzdWJ0cmVlLgorICovCitmdW5jdGlvbiB0 cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZHJlbiwgbmFtZVNvRmFyLCBjYWxsYmFjaywgdHJh dmVyc2VDb250ZXh0KSB7CisgIHZhciB0eXBlID0gdHlwZW9mIGNoaWxkcmVuOworCisgIGlmICh0 eXBlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlID09PSAnYm9vbGVhbicpIHsKKyAgICAvLyBBbGwg b2YgdGhlIGFib3ZlIGFyZSBwZXJjZWl2ZWQgYXMgbnVsbC4KKyAgICBjaGlsZHJlbiA9IG51bGw7 CisgIH0KKworICBpZiAoY2hpbGRyZW4gPT09IG51bGwgfHwgdHlwZSA9PT0gJ3N0cmluZycgfHwg dHlwZSA9PT0gJ251bWJlcicgfHwKKyAgLy8gVGhlIGZvbGxvd2luZyBpcyBpbmxpbmVkIGZyb20g UmVhY3RFbGVtZW50LiBUaGlzIG1lYW5zIHdlIGNhbiBvcHRpbWl6ZQorICAvLyBzb21lIGNoZWNr cy4gUmVhY3QgRmliZXIgYWxzbyBpbmxpbmVzIHRoaXMgbG9naWMgZm9yIHNpbWlsYXIgcHVycG9z ZXMuCisgIHR5cGUgPT09ICdvYmplY3QnICYmIGNoaWxkcmVuLiQkdHlwZW9mID09PSBSRUFDVF9F TEVNRU5UX1RZUEUpIHsKKyAgICBjYWxsYmFjayh0cmF2ZXJzZUNvbnRleHQsIGNoaWxkcmVuLAor ICAgIC8vIElmIGl0J3MgdGhlIG9ubHkgY2hpbGQsIHRyZWF0IHRoZSBuYW1lIGFzIGlmIGl0IHdh cyB3cmFwcGVkIGluIGFuIGFycmF5CisgICAgLy8gc28gdGhhdCBpdCdzIGNvbnNpc3RlbnQgaWYg dGhlIG51bWJlciBvZiBjaGlsZHJlbiBncm93cy4KKyAgICBuYW1lU29GYXIgPT09ICcnID8gU0VQ QVJBVE9SICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkcmVuLCAwKSA6IG5hbWVTb0Zhcik7CisgICAg cmV0dXJuIDE7CisgIH0KKworICB2YXIgY2hpbGQ7CisgIHZhciBuZXh0TmFtZTsKKyAgdmFyIHN1 YnRyZWVDb3VudCA9IDA7IC8vIENvdW50IG9mIGNoaWxkcmVuIGZvdW5kIGluIHRoZSBjdXJyZW50 IHN1YnRyZWUuCisgIHZhciBuZXh0TmFtZVByZWZpeCA9IG5hbWVTb0ZhciA9PT0gJycgPyBTRVBB UkFUT1IgOiBuYW1lU29GYXIgKyBTVUJTRVBBUkFUT1I7CisKKyAgaWYgKEFycmF5LmlzQXJyYXko Y2hpbGRyZW4pKSB7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkr KykgeworICAgICAgY2hpbGQgPSBjaGlsZHJlbltpXTsKKyAgICAgIG5leHROYW1lID0gbmV4dE5h bWVQcmVmaXggKyBnZXRDb21wb25lbnRLZXkoY2hpbGQsIGkpOworICAgICAgc3VidHJlZUNvdW50 ICs9IHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkLCBuZXh0TmFtZSwgY2FsbGJhY2ssIHRy YXZlcnNlQ29udGV4dCk7CisgICAgfQorICB9IGVsc2UgeworICAgIHZhciBpdGVyYXRvckZuID0g Z2V0SXRlcmF0b3JGbihjaGlsZHJlbik7CisgICAgaWYgKGl0ZXJhdG9yRm4pIHsKKyAgICAgIHZh ciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChjaGlsZHJlbik7CisgICAgICB2YXIgc3RlcDsK KyAgICAgIGlmIChpdGVyYXRvckZuICE9PSBjaGlsZHJlbi5lbnRyaWVzKSB7CisgICAgICAgIHZh ciBpaSA9IDA7CisgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUp IHsKKyAgICAgICAgICBjaGlsZCA9IHN0ZXAudmFsdWU7CisgICAgICAgICAgbmV4dE5hbWUgPSBu ZXh0TmFtZVByZWZpeCArIGdldENvbXBvbmVudEtleShjaGlsZCwgaWkrKyk7CisgICAgICAgICAg c3VidHJlZUNvdW50ICs9IHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkLCBuZXh0TmFtZSwg Y2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7Cisg ICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICAgICB2 YXIgbWFwc0FzQ2hpbGRyZW5BZGRlbmR1bSA9ICcnOworICAgICAgICAgIGlmIChSZWFjdEN1cnJl bnRPd25lci5jdXJyZW50KSB7CisgICAgICAgICAgICB2YXIgbWFwc0FzQ2hpbGRyZW5Pd25lck5h bWUgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlm IChtYXBzQXNDaGlsZHJlbk93bmVyTmFtZSkgeworICAgICAgICAgICAgICBtYXBzQXNDaGlsZHJl bkFkZGVuZHVtID0gJyBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG1hcHNBc0NoaWxk cmVuT3duZXJOYW1lICsgJ2AuJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAg ICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhkaWRXYXJuQWJvdXRN YXBzLCAnVXNpbmcgTWFwcyBhcyBjaGlsZHJlbiBpcyBub3QgeWV0IGZ1bGx5IHN1cHBvcnRlZC4g SXQgaXMgYW4gJyArICdleHBlcmltZW50YWwgZmVhdHVyZSB0aGF0IG1pZ2h0IGJlIHJlbW92ZWQu IENvbnZlcnQgaXQgdG8gYSAnICsgJ3NlcXVlbmNlIC8gaXRlcmFibGUgb2Yga2V5ZWQgUmVhY3RF bGVtZW50cyBpbnN0ZWFkLiVzJywgbWFwc0FzQ2hpbGRyZW5BZGRlbmR1bSkgOiB2b2lkIDA7Cisg ICAgICAgICAgZGlkV2FybkFib3V0TWFwcyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgLy8g SXRlcmF0b3Igd2lsbCBwcm92aWRlIGVudHJ5IFtrLHZdIHR1cGxlcyByYXRoZXIgdGhhbiB2YWx1 ZXMuCisgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHsKKyAg ICAgICAgICB2YXIgZW50cnkgPSBzdGVwLnZhbHVlOworICAgICAgICAgIGlmIChlbnRyeSkgewor ICAgICAgICAgICAgY2hpbGQgPSBlbnRyeVsxXTsKKyAgICAgICAgICAgIG5leHROYW1lID0gbmV4 dE5hbWVQcmVmaXggKyBLZXlFc2NhcGVVdGlscy5lc2NhcGUoZW50cnlbMF0pICsgU1VCU0VQQVJB VE9SICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkLCAwKTsKKyAgICAgICAgICAgIHN1YnRyZWVDb3Vu dCArPSB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZCwgbmV4dE5hbWUsIGNhbGxiYWNrLCB0 cmF2ZXJzZUNvbnRleHQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0g ZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHsKKyAgICAgIHZhciBhZGRlbmR1bSA9ICcnOwor ICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgICBhZGRl bmR1bSA9ICcgSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4s IHVzZSBhbiBhcnJheSAnICsgJ2luc3RlYWQgb3Igd3JhcCB0aGUgb2JqZWN0IHVzaW5nIGNyZWF0 ZUZyYWdtZW50KG9iamVjdCkgZnJvbSB0aGUgJyArICdSZWFjdCBhZGQtb25zLic7CisgICAgICAg IGlmIChjaGlsZHJlbi5faXNSZWFjdEVsZW1lbnQpIHsKKyAgICAgICAgICBhZGRlbmR1bSA9ICcg SXQgbG9va3MgbGlrZSB5b3VcJ3JlIHVzaW5nIGFuIGVsZW1lbnQgY3JlYXRlZCBieSBhIGRpZmZl cmVudCAnICsgJ3ZlcnNpb24gb2YgUmVhY3QuIE1ha2Ugc3VyZSB0byB1c2Ugb25seSBvbmUgY29w eSBvZiBSZWFjdC4nOworICAgICAgICB9CisgICAgICAgIGlmIChSZWFjdEN1cnJlbnRPd25lci5j dXJyZW50KSB7CisgICAgICAgICAgdmFyIG5hbWUgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50 LmdldE5hbWUoKTsKKyAgICAgICAgICBpZiAobmFtZSkgeworICAgICAgICAgICAgYWRkZW5kdW0g Kz0gJyBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nOworICAgICAg ICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgdmFyIGNoaWxkcmVuU3RyaW5nID0gU3Ry aW5nKGNoaWxkcmVuKTsKKyAgICAgICFmYWxzZSA/ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0 aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ09iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0 IGNoaWxkIChmb3VuZDogJXMpLiVzJywgY2hpbGRyZW5TdHJpbmcgPT09ICdbb2JqZWN0IE9iamVj dF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjaGlsZHJlbikuam9pbign LCAnKSArICd9JyA6IGNoaWxkcmVuU3RyaW5nLCBhZGRlbmR1bSkgOiBfcHJvZEludmFyaWFudCgn MzEnLCBjaGlsZHJlblN0cmluZyA9PT0gJ1tvYmplY3QgT2JqZWN0XScgPyAnb2JqZWN0IHdpdGgg a2V5cyB7JyArIE9iamVjdC5rZXlzKGNoaWxkcmVuKS5qb2luKCcsICcpICsgJ30nIDogY2hpbGRy ZW5TdHJpbmcsIGFkZGVuZHVtKSA6IHZvaWQgMDsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3Vi dHJlZUNvdW50OworfQorCisvKioKKyAqIFRyYXZlcnNlcyBjaGlsZHJlbiB0aGF0IGFyZSB0eXBp Y2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAsIGJ1dAorICogbWlnaHQgYWxzbyBi ZSBzcGVjaWZpZWQgdGhyb3VnaCBhdHRyaWJ1dGVzOgorICoKKyAqIC0gYHRyYXZlcnNlQWxsQ2hp bGRyZW4odGhpcy5wcm9wcy5jaGlsZHJlbiwgLi4uKWAKKyAqIC0gYHRyYXZlcnNlQWxsQ2hpbGRy ZW4odGhpcy5wcm9wcy5sZWZ0UGFuZWxDaGlsZHJlbiwgLi4uKWAKKyAqCisgKiBUaGUgYHRyYXZl cnNlQ29udGV4dGAgaXMgYW4gb3B0aW9uYWwgYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgdGhyb3Vn aCB0aGUKKyAqIGVudGlyZSB0cmF2ZXJzYWwuIEl0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIGFjY3Vt dWxhdGlvbnMgb3IgYW55dGhpbmcgZWxzZSB0aGF0CisgKiB0aGUgY2FsbGJhY2sgbWlnaHQgZmlu ZCByZWxldmFudC4KKyAqCisgKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIG9i amVjdC4KKyAqIEBwYXJhbSB7IWZ1bmN0aW9ufSBjYWxsYmFjayBUbyBpbnZva2UgdXBvbiB0cmF2 ZXJzaW5nIGVhY2ggY2hpbGQuCisgKiBAcGFyYW0gez8qfSB0cmF2ZXJzZUNvbnRleHQgQ29udGV4 dCBmb3IgdHJhdmVyc2FsLgorICogQHJldHVybiB7IW51bWJlcn0gVGhlIG51bWJlciBvZiBjaGls ZHJlbiBpbiB0aGlzIHN1YnRyZWUuCisgKi8KK2Z1bmN0aW9uIHRyYXZlcnNlQWxsQ2hpbGRyZW4o Y2hpbGRyZW4sIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpIHsKKyAgaWYgKGNoaWxkcmVuID09 IG51bGwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiB0cmF2ZXJzZUFsbENoaWxk cmVuSW1wbChjaGlsZHJlbiwgJycsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpOworfQorCitt b2R1bGUuZXhwb3J0cyA9IHRyYXZlcnNlQWxsQ2hpbGRyZW47Cit9LHsiMSI6MSwiMTEiOjExLCIy MiI6MjIsIjI0IjoyNCwiMjgiOjI4LCIyOSI6MjksIjgiOjh9XSwyNjpbZnVuY3Rpb24oX2RlcmVx Xyxtb2R1bGUsZXhwb3J0cyl7CisidXNlIHN0cmljdCI7CisKKy8qKgorICogQ29weXJpZ2h0IChj KSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgor ICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBs aWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9y eSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQg cmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVj dG9yeS4KKyAqCisgKiAKKyAqLworCitmdW5jdGlvbiBtYWtlRW1wdHlGdW5jdGlvbihhcmcpIHsK KyAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gYXJnOworICB9OworfQorCisvKioK KyAqIFRoaXMgZnVuY3Rpb24gYWNjZXB0cyBhbmQgZGlzY2FyZHMgaW5wdXRzOyBpdCBoYXMgbm8g c2lkZSBlZmZlY3RzLiBUaGlzIGlzCisgKiBwcmltYXJpbHkgdXNlZnVsIGlkaW9tYXRpY2FsbHkg Zm9yIG92ZXJyaWRhYmxlIGZ1bmN0aW9uIGVuZHBvaW50cyB3aGljaAorICogYWx3YXlzIG5lZWQg dG8gYmUgY2FsbGFibGUsIHNpbmNlIEpTIGxhY2tzIGEgbnVsbC1jYWxsIGlkaW9tIGFsYSBDb2Nv YS4KKyAqLwordmFyIGVtcHR5RnVuY3Rpb24gPSBmdW5jdGlvbiBlbXB0eUZ1bmN0aW9uKCkge307 CisKK2VtcHR5RnVuY3Rpb24udGhhdFJldHVybnMgPSBtYWtlRW1wdHlGdW5jdGlvbjsKK2VtcHR5 RnVuY3Rpb24udGhhdFJldHVybnNGYWxzZSA9IG1ha2VFbXB0eUZ1bmN0aW9uKGZhbHNlKTsKK2Vt cHR5RnVuY3Rpb24udGhhdFJldHVybnNUcnVlID0gbWFrZUVtcHR5RnVuY3Rpb24odHJ1ZSk7Citl bXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zTnVsbCA9IG1ha2VFbXB0eUZ1bmN0aW9uKG51bGwpOwor ZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc1RoaXMgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiB0 aGlzOworfTsKK2VtcHR5RnVuY3Rpb24udGhhdFJldHVybnNBcmd1bWVudCA9IGZ1bmN0aW9uIChh cmcpIHsKKyAgcmV0dXJuIGFyZzsKK307CisKK21vZHVsZS5leHBvcnRzID0gZW1wdHlGdW5jdGlv bjsKK30se31dLDI3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICog Q29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRz IHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhl IEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSBy b290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50Cisg KiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRo ZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgZW1wdHlP YmplY3QgPSB7fTsKKworaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgeworICBP YmplY3QuZnJlZXplKGVtcHR5T2JqZWN0KTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBlbXB0eU9i amVjdDsKK30se31dLDI4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsKKy8qKgor ICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmln aHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIg dGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRo ZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50 CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGlu IHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCisvKioKKyAq IFVzZSBpbnZhcmlhbnQoKSB0byBhc3NlcnQgc3RhdGUgd2hpY2ggeW91ciBwcm9ncmFtIGFzc3Vt ZXMgdG8gYmUgdHJ1ZS4KKyAqCisgKiBQcm92aWRlIHNwcmludGYtc3R5bGUgZm9ybWF0IChvbmx5 ICVzIGlzIHN1cHBvcnRlZCkgYW5kIGFyZ3VtZW50cworICogdG8gcHJvdmlkZSBpbmZvcm1hdGlv biBhYm91dCB3aGF0IGJyb2tlIGFuZCB3aGF0IHlvdSB3ZXJlCisgKiBleHBlY3RpbmcuCisgKgor ICogVGhlIGludmFyaWFudCBtZXNzYWdlIHdpbGwgYmUgc3RyaXBwZWQgaW4gcHJvZHVjdGlvbiwg YnV0IHRoZSBpbnZhcmlhbnQKKyAqIHdpbGwgcmVtYWluIHRvIGVuc3VyZSBsb2dpYyBkb2VzIG5v dCBkaWZmZXIgaW4gcHJvZHVjdGlvbi4KKyAqLworCit2YXIgdmFsaWRhdGVGb3JtYXQgPSBmdW5j dGlvbiB2YWxpZGF0ZUZvcm1hdChmb3JtYXQpIHt9OworCitpZiAoImRldmVsb3BtZW50IiAhPT0g J3Byb2R1Y3Rpb24nKSB7CisgIHZhbGlkYXRlRm9ybWF0ID0gZnVuY3Rpb24gdmFsaWRhdGVGb3Jt YXQoZm9ybWF0KSB7CisgICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICB0aHJv dyBuZXcgRXJyb3IoJ2ludmFyaWFudCByZXF1aXJlcyBhbiBlcnJvciBtZXNzYWdlIGFyZ3VtZW50 Jyk7CisgICAgfQorICB9OworfQorCitmdW5jdGlvbiBpbnZhcmlhbnQoY29uZGl0aW9uLCBmb3Jt YXQsIGEsIGIsIGMsIGQsIGUsIGYpIHsKKyAgdmFsaWRhdGVGb3JtYXQoZm9ybWF0KTsKKworICBp ZiAoIWNvbmRpdGlvbikgeworICAgIHZhciBlcnJvcjsKKyAgICBpZiAoZm9ybWF0ID09PSB1bmRl ZmluZWQpIHsKKyAgICAgIGVycm9yID0gbmV3IEVycm9yKCdNaW5pZmllZCBleGNlcHRpb24gb2Nj dXJyZWQ7IHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCAnICsgJ2ZvciB0aGUg ZnVsbCBlcnJvciBtZXNzYWdlIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuJyk7Cisg ICAgfSBlbHNlIHsKKyAgICAgIHZhciBhcmdzID0gW2EsIGIsIGMsIGQsIGUsIGZdOworICAgICAg dmFyIGFyZ0luZGV4ID0gMDsKKyAgICAgIGVycm9yID0gbmV3IEVycm9yKGZvcm1hdC5yZXBsYWNl KC8lcy9nLCBmdW5jdGlvbiAoKSB7CisgICAgICAgIHJldHVybiBhcmdzW2FyZ0luZGV4KytdOwor ICAgICAgfSkpOworICAgICAgZXJyb3IubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJzsKKyAg ICB9CisKKyAgICBlcnJvci5mcmFtZXNUb1BvcCA9IDE7IC8vIHdlIGRvbid0IGNhcmUgYWJvdXQg aW52YXJpYW50J3Mgb3duIGZyYW1lCisgICAgdGhyb3cgZXJyb3I7CisgIH0KK30KKworbW9kdWxl LmV4cG9ydHMgPSBpbnZhcmlhbnQ7Cit9LHt9XSwyOTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUs ZXhwb3J0cyl7CisvKioKKyAqIENvcHlyaWdodCAyMDE0LTIwMTUsIEZhY2Vib29rLCBJbmMuCisg KiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5z ZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBm aWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlv bmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5U UyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOwor Cit2YXIgZW1wdHlGdW5jdGlvbiA9IF9kZXJlcV8oMjYpOworCisvKioKKyAqIFNpbWlsYXIgdG8g aW52YXJpYW50IGJ1dCBvbmx5IGxvZ3MgYSB3YXJuaW5nIGlmIHRoZSBjb25kaXRpb24gaXMgbm90 IG1ldC4KKyAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gbG9nIGlzc3VlcyBpbiBkZXZlbG9wbWVudCBl bnZpcm9ubWVudHMgaW4gY3JpdGljYWwKKyAqIHBhdGhzLiBSZW1vdmluZyB0aGUgbG9nZ2luZyBj b2RlIGZvciBwcm9kdWN0aW9uIGVudmlyb25tZW50cyB3aWxsIGtlZXAgdGhlCisgKiBzYW1lIGxv Z2ljIGFuZCBmb2xsb3cgdGhlIHNhbWUgY29kZSBwYXRocy4KKyAqLworCit2YXIgd2FybmluZyA9 IGVtcHR5RnVuY3Rpb247CisKK2lmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsK KyAgKGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24gcHJpbnRX YXJuaW5nKGZvcm1hdCkgeworICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgs IGFyZ3MgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwg X2xlbjsgX2tleSsrKSB7CisgICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXld OworICAgICAgfQorCisgICAgICB2YXIgYXJnSW5kZXggPSAwOworICAgICAgdmFyIG1lc3NhZ2Ug PSAnV2FybmluZzogJyArIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbiAoKSB7CisgICAg ICAgIHJldHVybiBhcmdzW2FyZ0luZGV4KytdOworICAgICAgfSk7CisgICAgICBpZiAodHlwZW9m IGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7CisgICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2Fn ZSk7CisgICAgICB9CisgICAgICB0cnkgeworICAgICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1 Z2dpbmcgUmVhY3QgLS0tCisgICAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNv bnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFjaworICAgICAgICAvLyB0byBm aW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS4KKyAgICAg ICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpOworICAgICAgfSBjYXRjaCAoeCkge30KKyAgICB9 OworCisgICAgd2FybmluZyA9IGZ1bmN0aW9uIHdhcm5pbmcoY29uZGl0aW9uLCBmb3JtYXQpIHsK KyAgICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkgeworICAgICAgICB0aHJvdyBuZXcgRXJy b3IoJ2B3YXJuaW5nKGNvbmRpdGlvbiwgZm9ybWF0LCAuLi5hcmdzKWAgcmVxdWlyZXMgYSB3YXJu aW5nICcgKyAnbWVzc2FnZSBhcmd1bWVudCcpOworICAgICAgfQorCisgICAgICBpZiAoZm9ybWF0 LmluZGV4T2YoJ0ZhaWxlZCBDb21wb3NpdGUgcHJvcFR5cGU6ICcpID09PSAwKSB7CisgICAgICAg IHJldHVybjsgLy8gSWdub3JlIENvbXBvc2l0ZUNvbXBvbmVudCBwcm9wdHlwZSBjaGVjay4KKyAg ICAgIH0KKworICAgICAgaWYgKCFjb25kaXRpb24pIHsKKyAgICAgICAgZm9yICh2YXIgX2xlbjIg PSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIgPiAyID8gX2xlbjIgLSAyIDog MCksIF9rZXkyID0gMjsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykgeworICAgICAgICAgIGFyZ3Nb X2tleTIgLSAyXSA9IGFyZ3VtZW50c1tfa2V5Ml07CisgICAgICAgIH0KKworICAgICAgICBwcmlu dFdhcm5pbmcuYXBwbHkodW5kZWZpbmVkLCBbZm9ybWF0XS5jb25jYXQoYXJncykpOworICAgICAg fQorICAgIH07CisgIH0pKCk7Cit9CisKK21vZHVsZS5leHBvcnRzID0gd2FybmluZzsKK30seyIy NiI6MjZ9XSwzMDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7CisndXNlIHN0cmlj dCc7CisvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqLwordmFyIGhhc093blByb3Bl cnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKK3ZhciBwcm9wSXNFbnVtZXJh YmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTsKKworZnVuY3Rpb24g dG9PYmplY3QodmFsKSB7CisJaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkg eworCQl0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3QuYXNzaWduIGNhbm5vdCBiZSBjYWxsZWQg d2l0aCBudWxsIG9yIHVuZGVmaW5lZCcpOworCX0KKworCXJldHVybiBPYmplY3QodmFsKTsKK30K KworZnVuY3Rpb24gc2hvdWxkVXNlTmF0aXZlKCkgeworCXRyeSB7CisJCWlmICghT2JqZWN0LmFz c2lnbikgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLy8gRGV0ZWN0IGJ1Z2d5IHByb3Bl cnR5IGVudW1lcmF0aW9uIG9yZGVyIGluIG9sZGVyIFY4IHZlcnNpb25zLgorCisJCS8vIGh0dHBz Oi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTQxMTgKKwkJdmFyIHRl c3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lCisJCXRlc3Qx WzVdID0gJ2RlJzsKKwkJaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QxKVswXSA9 PT0gJzUnKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkvLyBodHRwczovL2J1Z3MuY2hy b21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2CisJCXZhciB0ZXN0MiA9IHt9Owor CQlmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJCXRlc3QyWydfJyArIFN0cmluZy5m cm9tQ2hhckNvZGUoaSldID0gaTsKKwkJfQorCQl2YXIgb3JkZXIyID0gT2JqZWN0LmdldE93blBy b3BlcnR5TmFtZXModGVzdDIpLm1hcChmdW5jdGlvbiAobikgeworCQkJcmV0dXJuIHRlc3QyW25d OworCQl9KTsKKwkJaWYgKG9yZGVyMi5qb2luKCcnKSAhPT0gJzAxMjM0NTY3ODknKSB7CisJCQly ZXR1cm4gZmFsc2U7CisJCX0KKworCQkvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avdjgv aXNzdWVzL2RldGFpbD9pZD0zMDU2CisJCXZhciB0ZXN0MyA9IHt9OworCQknYWJjZGVmZ2hpamts bW5vcHFyc3QnLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChsZXR0ZXIpIHsKKwkJCXRlc3Qz W2xldHRlcl0gPSBsZXR0ZXI7CisJCX0pOworCQlpZiAoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2ln bih7fSwgdGVzdDMpKS5qb2luKCcnKSAhPT0KKwkJCQknYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSB7 CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9IGNhdGNoIChlKSB7 CisJCS8vIFdlIGRvbid0IGV4cGVjdCBhbnkgb2YgdGhlIGFib3ZlIHRvIHRocm93LCBidXQgYmV0 dGVyIHRvIGJlIHNhZmUuCisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK21vZHVsZS5leHBvcnRz ID0gc2hvdWxkVXNlTmF0aXZlKCkgPyBPYmplY3QuYXNzaWduIDogZnVuY3Rpb24gKHRhcmdldCwg c291cmNlKSB7CisJdmFyIGZyb207CisJdmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTsKKwl2YXIg c3ltYm9sczsKKworCWZvciAodmFyIHMgPSAxOyBzIDwgYXJndW1lbnRzLmxlbmd0aDsgcysrKSB7 CisJCWZyb20gPSBPYmplY3QoYXJndW1lbnRzW3NdKTsKKworCQlmb3IgKHZhciBrZXkgaW4gZnJv bSkgeworCQkJaWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkgeworCQkJCXRvW2tl eV0gPSBmcm9tW2tleV07CisJCQl9CisJCX0KKworCQlpZiAoT2JqZWN0LmdldE93blByb3BlcnR5 U3ltYm9scykgeworCQkJc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJv bSk7CisJCQlmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbHMubGVuZ3RoOyBpKyspIHsKKwkJCQlp ZiAocHJvcElzRW51bWVyYWJsZS5jYWxsKGZyb20sIHN5bWJvbHNbaV0pKSB7CisJCQkJCXRvW3N5 bWJvbHNbaV1dID0gZnJvbVtzeW1ib2xzW2ldXTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwly ZXR1cm4gdG87Cit9OworCit9LHt9XX0se30sWzE4XSkoMTgpCit9KTsKXCBObyBuZXdsaW5lIGF0 IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0 L2Rpc3QvcmVhY3QubWluLmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9kaXN0 L3JlYWN0Lm1pbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uYjQyNGVk ZGEKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0L2Rp c3QvcmVhY3QubWluLmpzCkBAIC0wLDAgKzEsMTIgQEAKKy8qKgorICogUmVhY3QgdjE1LjQuMgor ICoKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmln aHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIg dGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRo ZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50 CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGlu IHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKyFmdW5jdGlvbih0KXtpZigib2JqZWN0Ij09 dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlKW1vZHVsZS5leHBvcnRz PXQoKTtlbHNlIGlmKCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQpZGVmaW5l KFtdLHQpO2Vsc2V7dmFyIGU7ZT0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVu ZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9z ZWxmOnRoaXMsZS5SZWFjdD10KCl9fShmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbiB0KGUsbixy KXtmdW5jdGlvbiBvKHUsYSl7aWYoIW5bdV0pe2lmKCFlW3VdKXt2YXIgcz0iZnVuY3Rpb24iPT10 eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighYSYmcylyZXR1cm4gcyh1LCEwKTtpZihpKXJldHVy biBpKHUsITApO3ZhciBjPW5ldyBFcnJvcigiQ2Fubm90IGZpbmQgbW9kdWxlICciK3UrIiciKTt0 aHJvdyBjLmNvZGU9Ik1PRFVMRV9OT1RfRk9VTkQiLGN9dmFyIGw9blt1XT17ZXhwb3J0czp7fX07 ZVt1XVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbih0KXt2YXIgbj1lW3VdWzFdW3RdO3JldHVy biBvKG4/bjp0KX0sbCxsLmV4cG9ydHMsdCxlLG4scil9cmV0dXJuIG5bdV0uZXhwb3J0c31mb3Io dmFyIGk9ImZ1bmN0aW9uIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsdT0wO3U8ci5sZW5ndGg7 dSsrKW8oclt1XSk7cmV0dXJuIG99KHsxOltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1 bmN0aW9uIHIodCl7dmFyIGU9L1s9Ol0vZyxuPXsiPSI6Ij0wIiwiOiI6Ij0yIn0scj0oIiIrdCku cmVwbGFjZShlLGZ1bmN0aW9uKHQpe3JldHVybiBuW3RdfSk7cmV0dXJuIiQiK3J9ZnVuY3Rpb24g byh0KXt2YXIgZT0vKD0wfD0yKS9nLG49eyI9MCI6Ij0iLCI9MiI6IjoifSxyPSIuIj09PXRbMF0m JiIkIj09PXRbMV0/dC5zdWJzdHJpbmcoMik6dC5zdWJzdHJpbmcoMSk7cmV0dXJuKCIiK3IpLnJl cGxhY2UoZSxmdW5jdGlvbih0KXtyZXR1cm4gblt0XX0pfXZhciBpPXtlc2NhcGU6cix1bmVzY2Fw ZTpvfTtlLmV4cG9ydHM9aX0se31dLDI6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFy IHI9dCgyMSksbz0odCgyNSksZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZihlLmluc3RhbmNlUG9v bC5sZW5ndGgpe3ZhciBuPWUuaW5zdGFuY2VQb29sLnBvcCgpO3JldHVybiBlLmNhbGwobix0KSxu fXJldHVybiBuZXcgZSh0KX0pLGk9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO2lmKG4uaW5zdGFu Y2VQb29sLmxlbmd0aCl7dmFyIHI9bi5pbnN0YW5jZVBvb2wucG9wKCk7cmV0dXJuIG4uY2FsbChy LHQsZSkscn1yZXR1cm4gbmV3IG4odCxlKX0sdT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcztp ZihyLmluc3RhbmNlUG9vbC5sZW5ndGgpe3ZhciBvPXIuaW5zdGFuY2VQb29sLnBvcCgpO3JldHVy biByLmNhbGwobyx0LGUsbiksb31yZXR1cm4gbmV3IHIodCxlLG4pfSxhPWZ1bmN0aW9uKHQsZSxu LHIpe3ZhciBvPXRoaXM7aWYoby5pbnN0YW5jZVBvb2wubGVuZ3RoKXt2YXIgaT1vLmluc3RhbmNl UG9vbC5wb3AoKTtyZXR1cm4gby5jYWxsKGksdCxlLG4sciksaX1yZXR1cm4gbmV3IG8odCxlLG4s cil9LHM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0IGluc3RhbmNlb2YgZT92b2lkIDA6cigiMjUi KSx0LmRlc3RydWN0b3IoKSxlLmluc3RhbmNlUG9vbC5sZW5ndGg8ZS5wb29sU2l6ZSYmZS5pbnN0 YW5jZVBvb2wucHVzaCh0KX0sYz0xMCxsPW8sZj1mdW5jdGlvbih0LGUpe3ZhciBuPXQ7cmV0dXJu IG4uaW5zdGFuY2VQb29sPVtdLG4uZ2V0UG9vbGVkPWV8fGwsbi5wb29sU2l6ZXx8KG4ucG9vbFNp emU9Yyksbi5yZWxlYXNlPXMsbn0scD17YWRkUG9vbGluZ1RvOmYsb25lQXJndW1lbnRQb29sZXI6 byx0d29Bcmd1bWVudFBvb2xlcjppLHRocmVlQXJndW1lbnRQb29sZXI6dSxmb3VyQXJndW1lbnRQ b29sZXI6YX07ZS5leHBvcnRzPXB9LHsyMToyMSwyNToyNX1dLDM6W2Z1bmN0aW9uKHQsZSxuKXsi dXNlIHN0cmljdCI7dmFyIHI9dCgyNyksbz10KDQpLGk9dCg2KSx1PXQoMTUpLGE9dCg1KSxzPXQo OCksYz10KDkpLGw9dCgxMyksZj10KDE3KSxwPXQoMjApLGQ9KHQoMjYpLGMuY3JlYXRlRWxlbWVu dCkseT1jLmNyZWF0ZUZhY3Rvcnksdj1jLmNsb25lRWxlbWVudCxoPXIsbT17Q2hpbGRyZW46e21h cDpvLm1hcCxmb3JFYWNoOm8uZm9yRWFjaCxjb3VudDpvLmNvdW50LHRvQXJyYXk6by50b0FycmF5 LG9ubHk6cH0sQ29tcG9uZW50OmksUHVyZUNvbXBvbmVudDp1LGNyZWF0ZUVsZW1lbnQ6ZCxjbG9u ZUVsZW1lbnQ6dixpc1ZhbGlkRWxlbWVudDpjLmlzVmFsaWRFbGVtZW50LFByb3BUeXBlczpsLGNy ZWF0ZUNsYXNzOmEuY3JlYXRlQ2xhc3MsY3JlYXRlRmFjdG9yeTp5LGNyZWF0ZU1peGluOmZ1bmN0 aW9uKHQpe3JldHVybiB0fSxET006cyx2ZXJzaW9uOmYsX19zcHJlYWQ6aH07ZS5leHBvcnRzPW19 LHsxMzoxMywxNToxNSwxNzoxNywyMDoyMCwyNjoyNiwyNzoyNyw0OjQsNTo1LDY6Niw4OjgsOTo5 fV0sNDpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKHQpe3JldHVybigi Iit0KS5yZXBsYWNlKEUsIiQmLyIpfWZ1bmN0aW9uIG8odCxlKXt0aGlzLmZ1bmM9dCx0aGlzLmNv bnRleHQ9ZSx0aGlzLmNvdW50PTB9ZnVuY3Rpb24gaSh0LGUsbil7dmFyIHI9dC5mdW5jLG89dC5j b250ZXh0O3IuY2FsbChvLGUsdC5jb3VudCsrKX1mdW5jdGlvbiB1KHQsZSxuKXtpZihudWxsPT10 KXJldHVybiB0O3ZhciByPW8uZ2V0UG9vbGVkKGUsbik7bSh0LGksciksby5yZWxlYXNlKHIpfWZ1 bmN0aW9uIGEodCxlLG4scil7dGhpcy5yZXN1bHQ9dCx0aGlzLmtleVByZWZpeD1lLHRoaXMuZnVu Yz1uLHRoaXMuY29udGV4dD1yLHRoaXMuY291bnQ9MH1mdW5jdGlvbiBzKHQsZSxuKXt2YXIgbz10 LnJlc3VsdCxpPXQua2V5UHJlZml4LHU9dC5mdW5jLGE9dC5jb250ZXh0LHM9dS5jYWxsKGEsZSx0 LmNvdW50KyspO0FycmF5LmlzQXJyYXkocyk/YyhzLG8sbixoLnRoYXRSZXR1cm5zQXJndW1lbnQp Om51bGwhPXMmJih2LmlzVmFsaWRFbGVtZW50KHMpJiYocz12LmNsb25lQW5kUmVwbGFjZUtleShz LGkrKCFzLmtleXx8ZSYmZS5rZXk9PT1zLmtleT8iIjpyKHMua2V5KSsiLyIpK24pKSxvLnB1c2go cykpfWZ1bmN0aW9uIGModCxlLG4sbyxpKXt2YXIgdT0iIjtudWxsIT1uJiYodT1yKG4pKyIvIik7 dmFyIGM9YS5nZXRQb29sZWQoZSx1LG8saSk7bSh0LHMsYyksYS5yZWxlYXNlKGMpfWZ1bmN0aW9u IGwodCxlLG4pe2lmKG51bGw9PXQpcmV0dXJuIHQ7dmFyIHI9W107cmV0dXJuIGModCxyLG51bGws ZSxuKSxyfWZ1bmN0aW9uIGYodCxlLG4pe3JldHVybiBudWxsfWZ1bmN0aW9uIHAodCxlKXtyZXR1 cm4gbSh0LGYsbnVsbCl9ZnVuY3Rpb24gZCh0KXt2YXIgZT1bXTtyZXR1cm4gYyh0LGUsbnVsbCxo LnRoYXRSZXR1cm5zQXJndW1lbnQpLGV9dmFyIHk9dCgyKSx2PXQoOSksaD10KDIzKSxtPXQoMjIp LGI9eS50d29Bcmd1bWVudFBvb2xlcixnPXkuZm91ckFyZ3VtZW50UG9vbGVyLEU9L1wvKy9nO28u cHJvdG90eXBlLmRlc3RydWN0b3I9ZnVuY3Rpb24oKXt0aGlzLmZ1bmM9bnVsbCx0aGlzLmNvbnRl eHQ9bnVsbCx0aGlzLmNvdW50PTB9LHkuYWRkUG9vbGluZ1RvKG8sYiksYS5wcm90b3R5cGUuZGVz dHJ1Y3Rvcj1mdW5jdGlvbigpe3RoaXMucmVzdWx0PW51bGwsdGhpcy5rZXlQcmVmaXg9bnVsbCx0 aGlzLmZ1bmM9bnVsbCx0aGlzLmNvbnRleHQ9bnVsbCx0aGlzLmNvdW50PTB9LHkuYWRkUG9vbGlu Z1RvKGEsZyk7dmFyIHg9e2ZvckVhY2g6dSxtYXA6bCxtYXBJbnRvV2l0aEtleVByZWZpeEludGVy bmFsOmMsY291bnQ6cCx0b0FycmF5OmR9O2UuZXhwb3J0cz14fSx7MjoyLDIyOjIyLDIzOjIzLDk6 OX1dLDU6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcih0KXtyZXR1cm4g dH1mdW5jdGlvbiBvKHQsZSl7dmFyIG49RS5oYXNPd25Qcm9wZXJ0eShlKT9FW2VdOm51bGw7Xy5o YXNPd25Qcm9wZXJ0eShlKSYmKCJPVkVSUklERV9CQVNFIiE9PW4/cCgiNzMiLGUpOnZvaWQgMCks dCYmKCJERUZJTkVfTUFOWSIhPT1uJiYiREVGSU5FX01BTllfTUVSR0VEIiE9PW4/cCgiNzQiLGUp OnZvaWQgMCl9ZnVuY3Rpb24gaSh0LGUpe2lmKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBlP3AoIjc1 Iik6dm9pZCAwLHYuaXNWYWxpZEVsZW1lbnQoZSk/cCgiNzYiKTp2b2lkIDA7dmFyIG49dC5wcm90 b3R5cGUscj1uLl9fcmVhY3RBdXRvQmluZFBhaXJzO2UuaGFzT3duUHJvcGVydHkoYikmJngubWl4 aW5zKHQsZS5taXhpbnMpO2Zvcih2YXIgaSBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkoaSkmJmkh PT1iKXt2YXIgdT1lW2ldLGE9bi5oYXNPd25Qcm9wZXJ0eShpKTtpZihvKGEsaSkseC5oYXNPd25Q cm9wZXJ0eShpKSl4W2ldKHQsdSk7ZWxzZXt2YXIgbD1FLmhhc093blByb3BlcnR5KGkpLGY9ImZ1 bmN0aW9uIj09dHlwZW9mIHUsZD1mJiYhbCYmIWEmJmUuYXV0b2JpbmQhPT0hMTtpZihkKXIucHVz aChpLHUpLG5baV09dTtlbHNlIGlmKGEpe3ZhciB5PUVbaV07IWx8fCJERUZJTkVfTUFOWV9NRVJH RUQiIT09eSYmIkRFRklORV9NQU5ZIiE9PXk/cCgiNzciLHksaSk6dm9pZCAwLCJERUZJTkVfTUFO WV9NRVJHRUQiPT09eT9uW2ldPXMobltpXSx1KToiREVGSU5FX01BTlkiPT09eSYmKG5baV09Yyhu W2ldLHUpKX1lbHNlIG5baV09dX19fX1mdW5jdGlvbiB1KHQsZSl7aWYoZSlmb3IodmFyIG4gaW4g ZSl7dmFyIHI9ZVtuXTtpZihlLmhhc093blByb3BlcnR5KG4pKXt2YXIgbz1uIGluIHg7bz9wKCI3 OCIsbik6dm9pZCAwO3ZhciBpPW4gaW4gdDtpP3AoIjc5IixuKTp2b2lkIDAsdFtuXT1yfX19ZnVu Y3Rpb24gYSh0LGUpe3QmJmUmJiJvYmplY3QiPT10eXBlb2YgdCYmIm9iamVjdCI9PXR5cGVvZiBl P3ZvaWQgMDpwKCI4MCIpO2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih2b2lk IDAhPT10W25dP3AoIjgxIixuKTp2b2lkIDAsdFtuXT1lW25dKTtyZXR1cm4gdH1mdW5jdGlvbiBz KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cykscj1l LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZihudWxsPT1uKXJldHVybiByO2lmKG51bGw9PXIpcmV0 dXJuIG47dmFyIG89e307cmV0dXJuIGEobyxuKSxhKG8sciksb319ZnVuY3Rpb24gYyh0LGUpe3Jl dHVybiBmdW5jdGlvbigpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUuYXBwbHkodGhpcyxhcmd1 bWVudHMpfX1mdW5jdGlvbiBsKHQsZSl7dmFyIG49ZS5iaW5kKHQpO3JldHVybiBufWZ1bmN0aW9u IGYodCl7Zm9yKHZhciBlPXQuX19yZWFjdEF1dG9CaW5kUGFpcnMsbj0wO248ZS5sZW5ndGg7bis9 Mil7dmFyIHI9ZVtuXSxvPWVbbisxXTt0W3JdPWwodCxvKX19dmFyIHA9dCgyMSksZD10KDI3KSx5 PXQoNiksdj10KDkpLGg9KHQoMTIpLHQoMTEpKSxtPXQoMjQpLGI9KHQoMjUpLHQoMjYpLCJtaXhp bnMiKSxnPVtdLEU9e21peGluczoiREVGSU5FX01BTlkiLHN0YXRpY3M6IkRFRklORV9NQU5ZIixw cm9wVHlwZXM6IkRFRklORV9NQU5ZIixjb250ZXh0VHlwZXM6IkRFRklORV9NQU5ZIixjaGlsZENv bnRleHRUeXBlczoiREVGSU5FX01BTlkiLGdldERlZmF1bHRQcm9wczoiREVGSU5FX01BTllfTUVS R0VEIixnZXRJbml0aWFsU3RhdGU6IkRFRklORV9NQU5ZX01FUkdFRCIsZ2V0Q2hpbGRDb250ZXh0 OiJERUZJTkVfTUFOWV9NRVJHRUQiLHJlbmRlcjoiREVGSU5FX09OQ0UiLGNvbXBvbmVudFdpbGxN b3VudDoiREVGSU5FX01BTlkiLGNvbXBvbmVudERpZE1vdW50OiJERUZJTkVfTUFOWSIsY29tcG9u ZW50V2lsbFJlY2VpdmVQcm9wczoiREVGSU5FX01BTlkiLHNob3VsZENvbXBvbmVudFVwZGF0ZToi REVGSU5FX09OQ0UiLGNvbXBvbmVudFdpbGxVcGRhdGU6IkRFRklORV9NQU5ZIixjb21wb25lbnRE aWRVcGRhdGU6IkRFRklORV9NQU5ZIixjb21wb25lbnRXaWxsVW5tb3VudDoiREVGSU5FX01BTlki LHVwZGF0ZUNvbXBvbmVudDoiT1ZFUlJJREVfQkFTRSJ9LHg9e2Rpc3BsYXlOYW1lOmZ1bmN0aW9u KHQsZSl7dC5kaXNwbGF5TmFtZT1lfSxtaXhpbnM6ZnVuY3Rpb24odCxlKXtpZihlKWZvcih2YXIg bj0wO248ZS5sZW5ndGg7bisrKWkodCxlW25dKX0sY2hpbGRDb250ZXh0VHlwZXM6ZnVuY3Rpb24o dCxlKXt0LmNoaWxkQ29udGV4dFR5cGVzPWQoe30sdC5jaGlsZENvbnRleHRUeXBlcyxlKX0sY29u dGV4dFR5cGVzOmZ1bmN0aW9uKHQsZSl7dC5jb250ZXh0VHlwZXM9ZCh7fSx0LmNvbnRleHRUeXBl cyxlKX0sZ2V0RGVmYXVsdFByb3BzOmZ1bmN0aW9uKHQsZSl7dC5nZXREZWZhdWx0UHJvcHM/dC5n ZXREZWZhdWx0UHJvcHM9cyh0LmdldERlZmF1bHRQcm9wcyxlKTp0LmdldERlZmF1bHRQcm9wcz1l fSxwcm9wVHlwZXM6ZnVuY3Rpb24odCxlKXt0LnByb3BUeXBlcz1kKHt9LHQucHJvcFR5cGVzLGUp fSxzdGF0aWNzOmZ1bmN0aW9uKHQsZSl7dSh0LGUpfSxhdXRvYmluZDpmdW5jdGlvbigpe319LF89 e3JlcGxhY2VTdGF0ZTpmdW5jdGlvbih0LGUpe3RoaXMudXBkYXRlci5lbnF1ZXVlUmVwbGFjZVN0 YXRlKHRoaXMsdCksZSYmdGhpcy51cGRhdGVyLmVucXVldWVDYWxsYmFjayh0aGlzLGUsInJlcGxh Y2VTdGF0ZSIpfSxpc01vdW50ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51cGRhdGVyLmlzTW91 bnRlZCh0aGlzKX19LFA9ZnVuY3Rpb24oKXt9O2QoUC5wcm90b3R5cGUseS5wcm90b3R5cGUsXyk7 dmFyIHc9e2NyZWF0ZUNsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlPXIoZnVuY3Rpb24odCxuLHIpe3Ro aXMuX19yZWFjdEF1dG9CaW5kUGFpcnMubGVuZ3RoJiZmKHRoaXMpLHRoaXMucHJvcHM9dCx0aGlz LmNvbnRleHQ9bix0aGlzLnJlZnM9bSx0aGlzLnVwZGF0ZXI9cnx8aCx0aGlzLnN0YXRlPW51bGw7 dmFyIG89dGhpcy5nZXRJbml0aWFsU3RhdGU/dGhpcy5nZXRJbml0aWFsU3RhdGUoKTpudWxsOyJv YmplY3QiIT10eXBlb2Ygb3x8QXJyYXkuaXNBcnJheShvKT9wKCI4MiIsZS5kaXNwbGF5TmFtZXx8 IlJlYWN0Q29tcG9zaXRlQ29tcG9uZW50Iik6dm9pZCAwLHRoaXMuc3RhdGU9b30pO2UucHJvdG90 eXBlPW5ldyBQLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuX19yZWFjdEF1 dG9CaW5kUGFpcnM9W10sZy5mb3JFYWNoKGkuYmluZChudWxsLGUpKSxpKGUsdCksZS5nZXREZWZh dWx0UHJvcHMmJihlLmRlZmF1bHRQcm9wcz1lLmdldERlZmF1bHRQcm9wcygpKSxlLnByb3RvdHlw ZS5yZW5kZXI/dm9pZCAwOnAoIjgzIik7Zm9yKHZhciBuIGluIEUpZS5wcm90b3R5cGVbbl18fChl LnByb3RvdHlwZVtuXT1udWxsKTtyZXR1cm4gZX0saW5qZWN0aW9uOntpbmplY3RNaXhpbjpmdW5j dGlvbih0KXtnLnB1c2godCl9fX07ZS5leHBvcnRzPXd9LHsxMToxMSwxMjoxMiwyMToyMSwyNDoy NCwyNToyNSwyNjoyNiwyNzoyNyw2OjYsOTo5fV0sNjpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3Ry aWN0IjtmdW5jdGlvbiByKHQsZSxuKXt0aGlzLnByb3BzPXQsdGhpcy5jb250ZXh0PWUsdGhpcy5y ZWZzPXUsdGhpcy51cGRhdGVyPW58fGl9dmFyIG89dCgyMSksaT10KDExKSx1PSh0KDE4KSx0KDI0 KSk7dCgyNSksdCgyNik7ci5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudD17fSxyLnByb3RvdHlw ZS5zZXRTdGF0ZT1mdW5jdGlvbih0LGUpeyJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9 dHlwZW9mIHQmJm51bGwhPXQ/bygiODUiKTp2b2lkIDAsdGhpcy51cGRhdGVyLmVucXVldWVTZXRT dGF0ZSh0aGlzLHQpLGUmJnRoaXMudXBkYXRlci5lbnF1ZXVlQ2FsbGJhY2sodGhpcyxlLCJzZXRT dGF0ZSIpfSxyLnByb3RvdHlwZS5mb3JjZVVwZGF0ZT1mdW5jdGlvbih0KXt0aGlzLnVwZGF0ZXIu ZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMpLHQmJnRoaXMudXBkYXRlci5lbnF1ZXVlQ2FsbGJhY2so dGhpcyx0LCJmb3JjZVVwZGF0ZSIpfTtlLmV4cG9ydHM9cn0sezExOjExLDE4OjE4LDIxOjIxLDI0 OjI0LDI1OjI1LDI2OjI2fV0sNzpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17 Y3VycmVudDpudWxsfTtlLmV4cG9ydHM9cn0se31dLDg6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0 cmljdCI7dmFyIHI9dCg5KSxvPXIuY3JlYXRlRmFjdG9yeSxpPXthOm8oImEiKSxhYmJyOm8oImFi YnIiKSxhZGRyZXNzOm8oImFkZHJlc3MiKSxhcmVhOm8oImFyZWEiKSxhcnRpY2xlOm8oImFydGlj bGUiKSxhc2lkZTpvKCJhc2lkZSIpLGF1ZGlvOm8oImF1ZGlvIiksYjpvKCJiIiksYmFzZTpvKCJi YXNlIiksYmRpOm8oImJkaSIpLGJkbzpvKCJiZG8iKSxiaWc6bygiYmlnIiksYmxvY2txdW90ZTpv KCJibG9ja3F1b3RlIiksYm9keTpvKCJib2R5IiksYnI6bygiYnIiKSxidXR0b246bygiYnV0dG9u IiksY2FudmFzOm8oImNhbnZhcyIpLGNhcHRpb246bygiY2FwdGlvbiIpLGNpdGU6bygiY2l0ZSIp LGNvZGU6bygiY29kZSIpLGNvbDpvKCJjb2wiKSxjb2xncm91cDpvKCJjb2xncm91cCIpLGRhdGE6 bygiZGF0YSIpLGRhdGFsaXN0Om8oImRhdGFsaXN0IiksZGQ6bygiZGQiKSxkZWw6bygiZGVsIiks ZGV0YWlsczpvKCJkZXRhaWxzIiksZGZuOm8oImRmbiIpLGRpYWxvZzpvKCJkaWFsb2ciKSxkaXY6 bygiZGl2IiksZGw6bygiZGwiKSxkdDpvKCJkdCIpLGVtOm8oImVtIiksZW1iZWQ6bygiZW1iZWQi KSxmaWVsZHNldDpvKCJmaWVsZHNldCIpLGZpZ2NhcHRpb246bygiZmlnY2FwdGlvbiIpLGZpZ3Vy ZTpvKCJmaWd1cmUiKSxmb290ZXI6bygiZm9vdGVyIiksZm9ybTpvKCJmb3JtIiksaDE6bygiaDEi KSxoMjpvKCJoMiIpLGgzOm8oImgzIiksaDQ6bygiaDQiKSxoNTpvKCJoNSIpLGg2Om8oImg2Iiks aGVhZDpvKCJoZWFkIiksaGVhZGVyOm8oImhlYWRlciIpLGhncm91cDpvKCJoZ3JvdXAiKSxocjpv KCJociIpLGh0bWw6bygiaHRtbCIpLGk6bygiaSIpLGlmcmFtZTpvKCJpZnJhbWUiKSxpbWc6bygi aW1nIiksaW5wdXQ6bygiaW5wdXQiKSxpbnM6bygiaW5zIiksa2JkOm8oImtiZCIpLGtleWdlbjpv KCJrZXlnZW4iKSxsYWJlbDpvKCJsYWJlbCIpLGxlZ2VuZDpvKCJsZWdlbmQiKSxsaTpvKCJsaSIp LGxpbms6bygibGluayIpLG1haW46bygibWFpbiIpLG1hcDpvKCJtYXAiKSxtYXJrOm8oIm1hcmsi KSxtZW51Om8oIm1lbnUiKSxtZW51aXRlbTpvKCJtZW51aXRlbSIpLG1ldGE6bygibWV0YSIpLG1l dGVyOm8oIm1ldGVyIiksbmF2Om8oIm5hdiIpLG5vc2NyaXB0Om8oIm5vc2NyaXB0Iiksb2JqZWN0 Om8oIm9iamVjdCIpLG9sOm8oIm9sIiksb3B0Z3JvdXA6bygib3B0Z3JvdXAiKSxvcHRpb246bygi b3B0aW9uIiksb3V0cHV0Om8oIm91dHB1dCIpLHA6bygicCIpLHBhcmFtOm8oInBhcmFtIikscGlj dHVyZTpvKCJwaWN0dXJlIikscHJlOm8oInByZSIpLHByb2dyZXNzOm8oInByb2dyZXNzIikscTpv KCJxIikscnA6bygicnAiKSxydDpvKCJydCIpLHJ1Ynk6bygicnVieSIpLHM6bygicyIpLHNhbXA6 bygic2FtcCIpLHNjcmlwdDpvKCJzY3JpcHQiKSxzZWN0aW9uOm8oInNlY3Rpb24iKSxzZWxlY3Q6 bygic2VsZWN0Iiksc21hbGw6bygic21hbGwiKSxzb3VyY2U6bygic291cmNlIiksc3BhbjpvKCJz cGFuIiksc3Ryb25nOm8oInN0cm9uZyIpLHN0eWxlOm8oInN0eWxlIiksc3ViOm8oInN1YiIpLHN1 bW1hcnk6bygic3VtbWFyeSIpLHN1cDpvKCJzdXAiKSx0YWJsZTpvKCJ0YWJsZSIpLHRib2R5Om8o InRib2R5IiksdGQ6bygidGQiKSx0ZXh0YXJlYTpvKCJ0ZXh0YXJlYSIpLHRmb290Om8oInRmb290 IiksdGg6bygidGgiKSx0aGVhZDpvKCJ0aGVhZCIpLHRpbWU6bygidGltZSIpLHRpdGxlOm8oInRp dGxlIiksdHI6bygidHIiKSx0cmFjazpvKCJ0cmFjayIpLHU6bygidSIpLHVsOm8oInVsIiksdmFy Om8oInZhciIpLHZpZGVvOm8oInZpZGVvIiksd2JyOm8oIndiciIpLGNpcmNsZTpvKCJjaXJjbGUi KSxjbGlwUGF0aDpvKCJjbGlwUGF0aCIpLGRlZnM6bygiZGVmcyIpLGVsbGlwc2U6bygiZWxsaXBz ZSIpLGc6bygiZyIpLGltYWdlOm8oImltYWdlIiksbGluZTpvKCJsaW5lIiksbGluZWFyR3JhZGll bnQ6bygibGluZWFyR3JhZGllbnQiKSxtYXNrOm8oIm1hc2siKSxwYXRoOm8oInBhdGgiKSxwYXR0 ZXJuOm8oInBhdHRlcm4iKSxwb2x5Z29uOm8oInBvbHlnb24iKSxwb2x5bGluZTpvKCJwb2x5bGlu ZSIpLHJhZGlhbEdyYWRpZW50Om8oInJhZGlhbEdyYWRpZW50IikscmVjdDpvKCJyZWN0Iiksc3Rv cDpvKCJzdG9wIiksc3ZnOm8oInN2ZyIpLHRleHQ6bygidGV4dCIpLHRzcGFuOm8oInRzcGFuIil9 O2UuZXhwb3J0cz1pfSx7OTo5fV0sOTpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtmdW5j dGlvbiByKHQpe3JldHVybiB2b2lkIDAhPT10LnJlZn1mdW5jdGlvbiBvKHQpe3JldHVybiB2b2lk IDAhPT10LmtleX12YXIgaT10KDI3KSx1PXQoNyksYT0odCgyNiksdCgxOCksT2JqZWN0LnByb3Rv dHlwZS5oYXNPd25Qcm9wZXJ0eSkscz10KDEwKSxjPXtrZXk6ITAscmVmOiEwLF9fc2VsZjohMCxf X3NvdXJjZTohMH0sbD1mdW5jdGlvbih0LGUsbixyLG8saSx1KXt2YXIgYT17JCR0eXBlb2Y6cyx0 eXBlOnQsa2V5OmUscmVmOm4scHJvcHM6dSxfb3duZXI6aX07cmV0dXJuIGF9O2wuY3JlYXRlRWxl bWVudD1mdW5jdGlvbih0LGUsbil7dmFyIGkscz17fSxmPW51bGwscD1udWxsLGQ9bnVsbCx5PW51 bGw7aWYobnVsbCE9ZSl7cihlKSYmKHA9ZS5yZWYpLG8oZSkmJihmPSIiK2Uua2V5KSxkPXZvaWQg MD09PWUuX19zZWxmP251bGw6ZS5fX3NlbGYseT12b2lkIDA9PT1lLl9fc291cmNlP251bGw6ZS5f X3NvdXJjZTtmb3IoaSBpbiBlKWEuY2FsbChlLGkpJiYhYy5oYXNPd25Qcm9wZXJ0eShpKSYmKHNb aV09ZVtpXSl9dmFyIHY9YXJndW1lbnRzLmxlbmd0aC0yO2lmKDE9PT12KXMuY2hpbGRyZW49bjtl bHNlIGlmKHY+MSl7Zm9yKHZhciBoPUFycmF5KHYpLG09MDttPHY7bSsrKWhbbV09YXJndW1lbnRz W20rMl07cy5jaGlsZHJlbj1ofWlmKHQmJnQuZGVmYXVsdFByb3BzKXt2YXIgYj10LmRlZmF1bHRQ cm9wcztmb3IoaSBpbiBiKXZvaWQgMD09PXNbaV0mJihzW2ldPWJbaV0pfXJldHVybiBsKHQsZixw LGQseSx1LmN1cnJlbnQscyl9LGwuY3JlYXRlRmFjdG9yeT1mdW5jdGlvbih0KXt2YXIgZT1sLmNy ZWF0ZUVsZW1lbnQuYmluZChudWxsLHQpO3JldHVybiBlLnR5cGU9dCxlfSxsLmNsb25lQW5kUmVw bGFjZUtleT1mdW5jdGlvbih0LGUpe3ZhciBuPWwodC50eXBlLGUsdC5yZWYsdC5fc2VsZix0Ll9z b3VyY2UsdC5fb3duZXIsdC5wcm9wcyk7cmV0dXJuIG59LGwuY2xvbmVFbGVtZW50PWZ1bmN0aW9u KHQsZSxuKXt2YXIgcyxmPWkoe30sdC5wcm9wcykscD10LmtleSxkPXQucmVmLHk9dC5fc2VsZix2 PXQuX3NvdXJjZSxoPXQuX293bmVyO2lmKG51bGwhPWUpe3IoZSkmJihkPWUucmVmLGg9dS5jdXJy ZW50KSxvKGUpJiYocD0iIitlLmtleSk7dmFyIG07dC50eXBlJiZ0LnR5cGUuZGVmYXVsdFByb3Bz JiYobT10LnR5cGUuZGVmYXVsdFByb3BzKTtmb3IocyBpbiBlKWEuY2FsbChlLHMpJiYhYy5oYXNP d25Qcm9wZXJ0eShzKSYmKHZvaWQgMD09PWVbc10mJnZvaWQgMCE9PW0/ZltzXT1tW3NdOmZbc109 ZVtzXSl9dmFyIGI9YXJndW1lbnRzLmxlbmd0aC0yO2lmKDE9PT1iKWYuY2hpbGRyZW49bjtlbHNl IGlmKGI+MSl7Zm9yKHZhciBnPUFycmF5KGIpLEU9MDtFPGI7RSsrKWdbRV09YXJndW1lbnRzW0Ur Ml07Zi5jaGlsZHJlbj1nfXJldHVybiBsKHQudHlwZSxwLGQseSx2LGgsZil9LGwuaXNWYWxpZEVs ZW1lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT09dCYmdC4k JHR5cGVvZj09PXN9LGUuZXhwb3J0cz1sfSx7MTA6MTAsMTg6MTgsMjY6MjYsMjc6MjcsNzo3fV0s MTA6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9ImZ1bmN0aW9uIj09dHlwZW9m IFN5bWJvbCYmU3ltYm9sLmZvciYmU3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpfHw2MDEwMztl LmV4cG9ydHM9cn0se31dLDExOltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9u IHIodCxlKXt9dmFyIG89KHQoMjYpLHtpc01vdW50ZWQ6ZnVuY3Rpb24odCl7cmV0dXJuITF9LGVu cXVldWVDYWxsYmFjazpmdW5jdGlvbih0LGUpe30sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9u KHQpe3IodCwiZm9yY2VVcGRhdGUiKX0sZW5xdWV1ZVJlcGxhY2VTdGF0ZTpmdW5jdGlvbih0LGUp e3IodCwicmVwbGFjZVN0YXRlIil9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbih0LGUpe3IodCwi c2V0U3RhdGUiKX19KTtlLmV4cG9ydHM9b30sezI2OjI2fV0sMTI6W2Z1bmN0aW9uKHQsZSxuKXsi dXNlIHN0cmljdCI7dmFyIHI9e307ZS5leHBvcnRzPXJ9LHt9XSwxMzpbZnVuY3Rpb24odCxlLG4p eyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKHQsZSl7cmV0dXJuIHQ9PT1lPzAhPT10fHwxL3Q9PT0x L2U6dCE9PXQmJmUhPT1lfWZ1bmN0aW9uIG8odCl7dGhpcy5tZXNzYWdlPXQsdGhpcy5zdGFjaz0i In1mdW5jdGlvbiBpKHQpe2Z1bmN0aW9uIGUoZSxuLHIsaSx1LGEscyl7aWYoaT1pfHxOLGE9YXx8 cixudWxsPT1uW3JdKXt2YXIgYz1fW3VdO3JldHVybiBlP25ldyBvKG51bGw9PT1uW3JdPyJUaGUg IitjKyIgYCIrYSsiYCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQgIisoImluIGAiK2krImAsIGJ1dCBp dHMgdmFsdWUgaXMgYG51bGxgLiIpOiJUaGUgIitjKyIgYCIrYSsiYCBpcyBtYXJrZWQgYXMgcmVx dWlyZWQgaW4gIisoImAiK2krImAsIGJ1dCBpdHMgdmFsdWUgaXMgYHVuZGVmaW5lZGAuIikpOm51 bGx9cmV0dXJuIHQobixyLGksdSxhKX12YXIgbj1lLmJpbmQobnVsbCwhMSk7cmV0dXJuIG4uaXNS ZXF1aXJlZD1lLmJpbmQobnVsbCwhMCksbn1mdW5jdGlvbiB1KHQpe2Z1bmN0aW9uIGUoZSxuLHIs aSx1LGEpe3ZhciBzPWVbbl0sYz1iKHMpO2lmKGMhPT10KXt2YXIgbD1fW2ldLGY9ZyhzKTtyZXR1 cm4gbmV3IG8oIkludmFsaWQgIitsKyIgYCIrdSsiYCBvZiB0eXBlICIrKCJgIitmKyJgIHN1cHBs aWVkIHRvIGAiK3IrImAsIGV4cGVjdGVkICIpKygiYCIrdCsiYC4iKSl9cmV0dXJuIG51bGx9cmV0 dXJuIGkoZSl9ZnVuY3Rpb24gYSgpe3JldHVybiBpKHcudGhhdFJldHVybnMobnVsbCkpfWZ1bmN0 aW9uIHModCl7ZnVuY3Rpb24gZShlLG4scixpLHUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXJl dHVybiBuZXcgbygiUHJvcGVydHkgYCIrdSsiYCBvZiBjb21wb25lbnQgYCIrcisiYCBoYXMgaW52 YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgYXJyYXlPZi4iKTt2YXIgYT1lW25dO2lmKCFB cnJheS5pc0FycmF5KGEpKXt2YXIgcz1fW2ldLGM9YihhKTtyZXR1cm4gbmV3IG8oIkludmFsaWQg IitzKyIgYCIrdSsiYCBvZiB0eXBlICIrKCJgIitjKyJgIHN1cHBsaWVkIHRvIGAiK3IrImAsIGV4 cGVjdGVkIGFuIGFycmF5LiIpKX1mb3IodmFyIGw9MDtsPGEubGVuZ3RoO2wrKyl7dmFyIGY9dChh LGwscixpLHUrIlsiK2wrIl0iLFApO2lmKGYgaW5zdGFuY2VvZiBFcnJvcilyZXR1cm4gZn1yZXR1 cm4gbnVsbH1yZXR1cm4gaShlKX1mdW5jdGlvbiBjKCl7ZnVuY3Rpb24gdCh0LGUsbixyLGkpe3Zh ciB1PXRbZV07aWYoIXguaXNWYWxpZEVsZW1lbnQodSkpe3ZhciBhPV9bcl0scz1iKHUpO3JldHVy biBuZXcgbygiSW52YWxpZCAiK2ErIiBgIitpKyJgIG9mIHR5cGUgIisoImAiK3MrImAgc3VwcGxp ZWQgdG8gYCIrbisiYCwgZXhwZWN0ZWQgYSBzaW5nbGUgUmVhY3RFbGVtZW50LiIpKX1yZXR1cm4g bnVsbH1yZXR1cm4gaSh0KX1mdW5jdGlvbiBsKHQpe2Z1bmN0aW9uIGUoZSxuLHIsaSx1KXtpZigh KGVbbl1pbnN0YW5jZW9mIHQpKXt2YXIgYT1fW2ldLHM9dC5uYW1lfHxOLGM9RShlW25dKTtyZXR1 cm4gbmV3IG8oIkludmFsaWQgIithKyIgYCIrdSsiYCBvZiB0eXBlICIrKCJgIitjKyJgIHN1cHBs aWVkIHRvIGAiK3IrImAsIGV4cGVjdGVkICIpKygiaW5zdGFuY2Ugb2YgYCIrcysiYC4iKSl9cmV0 dXJuIG51bGx9cmV0dXJuIGkoZSl9ZnVuY3Rpb24gZih0KXtmdW5jdGlvbiBlKGUsbixpLHUsYSl7 Zm9yKHZhciBzPWVbbl0sYz0wO2M8dC5sZW5ndGg7YysrKWlmKHIocyx0W2NdKSlyZXR1cm4gbnVs bDt2YXIgbD1fW3VdLGY9SlNPTi5zdHJpbmdpZnkodCk7cmV0dXJuIG5ldyBvKCJJbnZhbGlkICIr bCsiIGAiK2ErImAgb2YgdmFsdWUgYCIrcysiYCAiKygic3VwcGxpZWQgdG8gYCIraSsiYCwgZXhw ZWN0ZWQgb25lIG9mICIrZisiLiIpKX1yZXR1cm4gQXJyYXkuaXNBcnJheSh0KT9pKGUpOncudGhh dFJldHVybnNOdWxsfWZ1bmN0aW9uIHAodCl7ZnVuY3Rpb24gZShlLG4scixpLHUpe2lmKCJmdW5j dGlvbiIhPXR5cGVvZiB0KXJldHVybiBuZXcgbygiUHJvcGVydHkgYCIrdSsiYCBvZiBjb21wb25l bnQgYCIrcisiYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgb2JqZWN0T2Yu Iik7dmFyIGE9ZVtuXSxzPWIoYSk7aWYoIm9iamVjdCIhPT1zKXt2YXIgYz1fW2ldO3JldHVybiBu ZXcgbygiSW52YWxpZCAiK2MrIiBgIit1KyJgIG9mIHR5cGUgIisoImAiK3MrImAgc3VwcGxpZWQg dG8gYCIrcisiYCwgZXhwZWN0ZWQgYW4gb2JqZWN0LiIpKX1mb3IodmFyIGwgaW4gYSlpZihhLmhh c093blByb3BlcnR5KGwpKXt2YXIgZj10KGEsbCxyLGksdSsiLiIrbCxQKTtpZihmIGluc3RhbmNl b2YgRXJyb3IpcmV0dXJuIGZ9cmV0dXJuIG51bGx9cmV0dXJuIGkoZSl9ZnVuY3Rpb24gZCh0KXtm dW5jdGlvbiBlKGUsbixyLGksdSl7Zm9yKHZhciBhPTA7YTx0Lmxlbmd0aDthKyspe3ZhciBzPXRb YV07aWYobnVsbD09cyhlLG4scixpLHUsUCkpcmV0dXJuIG51bGx9dmFyIGM9X1tpXTtyZXR1cm4g bmV3IG8oIkludmFsaWQgIitjKyIgYCIrdSsiYCBzdXBwbGllZCB0byAiKygiYCIrcisiYC4iKSl9 cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/aShlKTp3LnRoYXRSZXR1cm5zTnVsbH1mdW5jdGlvbiB5 KCl7ZnVuY3Rpb24gdCh0LGUsbixyLGkpe2lmKCFoKHRbZV0pKXt2YXIgdT1fW3JdO3JldHVybiBu ZXcgbygiSW52YWxpZCAiK3UrIiBgIitpKyJgIHN1cHBsaWVkIHRvICIrKCJgIituKyJgLCBleHBl Y3RlZCBhIFJlYWN0Tm9kZS4iKSl9cmV0dXJuIG51bGx9cmV0dXJuIGkodCl9ZnVuY3Rpb24gdih0 KXtmdW5jdGlvbiBlKGUsbixyLGksdSl7dmFyIGE9ZVtuXSxzPWIoYSk7aWYoIm9iamVjdCIhPT1z KXt2YXIgYz1fW2ldO3JldHVybiBuZXcgbygiSW52YWxpZCAiK2MrIiBgIit1KyJgIG9mIHR5cGUg YCIrcysiYCAiKygic3VwcGxpZWQgdG8gYCIrcisiYCwgZXhwZWN0ZWQgYG9iamVjdGAuIikpfWZv cih2YXIgbCBpbiB0KXt2YXIgZj10W2xdO2lmKGYpe3ZhciBwPWYoYSxsLHIsaSx1KyIuIitsLFAp O2lmKHApcmV0dXJuIHB9fXJldHVybiBudWxsfXJldHVybiBpKGUpfWZ1bmN0aW9uIGgodCl7c3dp dGNoKHR5cGVvZiB0KXtjYXNlIm51bWJlciI6Y2FzZSJzdHJpbmciOmNhc2UidW5kZWZpbmVkIjpy ZXR1cm4hMDtjYXNlImJvb2xlYW4iOnJldHVybiF0O2Nhc2Uib2JqZWN0IjppZihBcnJheS5pc0Fy cmF5KHQpKXJldHVybiB0LmV2ZXJ5KGgpO2lmKG51bGw9PT10fHx4LmlzVmFsaWRFbGVtZW50KHQp KXJldHVybiEwO3ZhciBlPUEodCk7aWYoIWUpcmV0dXJuITE7dmFyIG4scj1lLmNhbGwodCk7aWYo ZSE9PXQuZW50cmllcyl7Zm9yKDshKG49ci5uZXh0KCkpLmRvbmU7KWlmKCFoKG4udmFsdWUpKXJl dHVybiExfWVsc2UgZm9yKDshKG49ci5uZXh0KCkpLmRvbmU7KXt2YXIgbz1uLnZhbHVlO2lmKG8m JiFoKG9bMV0pKXJldHVybiExfXJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fWZ1bmN0aW9uIG0o dCxlKXtyZXR1cm4ic3ltYm9sIj09PXR8fCJTeW1ib2wiPT09ZVsiQEB0b1N0cmluZ1RhZyJdfHwi ZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZlIGluc3RhbmNlb2YgU3ltYm9sfWZ1bmN0aW9uIGIo dCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/ImFycmF5Ijp0IGluc3Rh bmNlb2YgUmVnRXhwPyJvYmplY3QiOm0oZSx0KT8ic3ltYm9sIjplfWZ1bmN0aW9uIGcodCl7dmFy IGU9Yih0KTtpZigib2JqZWN0Ij09PWUpe2lmKHQgaW5zdGFuY2VvZiBEYXRlKXJldHVybiJkYXRl IjtpZih0IGluc3RhbmNlb2YgUmVnRXhwKXJldHVybiJyZWdleHAifXJldHVybiBlfWZ1bmN0aW9u IEUodCl7cmV0dXJuIHQuY29uc3RydWN0b3ImJnQuY29uc3RydWN0b3IubmFtZT90LmNvbnN0cnVj dG9yLm5hbWU6Tn12YXIgeD10KDkpLF89dCgxMiksUD10KDE0KSx3PXQoMjMpLEE9dCgxOSksTj0o dCgyNiksIjw8YW5vbnltb3VzPj4iKSxPPXthcnJheTp1KCJhcnJheSIpLGJvb2w6dSgiYm9vbGVh biIpLGZ1bmM6dSgiZnVuY3Rpb24iKSxudW1iZXI6dSgibnVtYmVyIiksb2JqZWN0OnUoIm9iamVj dCIpLHN0cmluZzp1KCJzdHJpbmciKSxzeW1ib2w6dSgic3ltYm9sIiksYW55OmEoKSxhcnJheU9m OnMsZWxlbWVudDpjKCksaW5zdGFuY2VPZjpsLG5vZGU6eSgpLG9iamVjdE9mOnAsb25lT2Y6Zixv bmVPZlR5cGU6ZCxzaGFwZTp2fTtvLnByb3RvdHlwZT1FcnJvci5wcm90b3R5cGUsZS5leHBvcnRz PU99LHsxMjoxMiwxNDoxNCwxOToxOSwyMzoyMywyNjoyNiw5Ojl9XSwxNDpbZnVuY3Rpb24odCxl LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj0iU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJ TExfQkVfRklSRUQiO2UuZXhwb3J0cz1yfSx7fV0sMTU6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0 cmljdCI7ZnVuY3Rpb24gcih0LGUsbil7dGhpcy5wcm9wcz10LHRoaXMuY29udGV4dD1lLHRoaXMu cmVmcz1zLHRoaXMudXBkYXRlcj1ufHxhfWZ1bmN0aW9uIG8oKXt9dmFyIGk9dCgyNyksdT10KDYp LGE9dCgxMSkscz10KDI0KTtvLnByb3RvdHlwZT11LnByb3RvdHlwZSxyLnByb3RvdHlwZT1uZXcg byxyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1yLGkoci5wcm90b3R5cGUsdS5wcm90b3R5cGUpLHIu cHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50PSEwLGUuZXhwb3J0cz1yfSx7MTE6MTEsMjQ6 MjQsMjc6MjcsNjo2fV0sMTY6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgy Nyksbz10KDMpLGk9cih7X19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExf QkVfRklSRUQ6e1JlYWN0Q3VycmVudE93bmVyOnQoNyl9fSxvKTtlLmV4cG9ydHM9aX0sezI3OjI3 LDM6Myw3Ojd9XSwxNzpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9IjE1 LjQuMiJ9LHt9XSwxODpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj0hMTtlLmV4 cG9ydHM9cn0se31dLDE5OltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIo dCl7dmFyIGU9dCYmKG8mJnRbb118fHRbaV0pO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBlKXJldHVy biBlfXZhciBvPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvcixpPSJA QGl0ZXJhdG9yIjtlLmV4cG9ydHM9cn0se31dLDIwOltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJp Y3QiO2Z1bmN0aW9uIHIodCl7cmV0dXJuIGkuaXNWYWxpZEVsZW1lbnQodCk/dm9pZCAwOm8oIjE0 MyIpLHR9dmFyIG89dCgyMSksaT10KDkpO3QoMjUpO2UuZXhwb3J0cz1yfSx7MjE6MjEsMjU6MjUs OTo5fV0sMjE6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcih0KXtmb3Io dmFyIGU9YXJndW1lbnRzLmxlbmd0aC0xLG49Ik1pbmlmaWVkIFJlYWN0IGVycm9yICMiK3QrIjsg dmlzaXQgaHR0cDovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL2Vycm9yLWRlY29kZXIu aHRtbD9pbnZhcmlhbnQ9Iit0LHI9MDtyPGU7cisrKW4rPSImYXJnc1tdPSIrZW5jb2RlVVJJQ29t cG9uZW50KGFyZ3VtZW50c1tyKzFdKTtuKz0iIGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0 aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0 aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4iO3ZhciBvPW5ldyBFcnJvcihuKTt0aHJvdyBvLm5hbWU9 IkludmFyaWFudCBWaW9sYXRpb24iLG8uZnJhbWVzVG9Qb3A9MSxvfWUuZXhwb3J0cz1yfSx7fV0s MjI6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcih0LGUpe3JldHVybiB0 JiYib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPXQua2V5P2MuZXNjYXBlKHQua2V5KTplLnRvU3Ry aW5nKDM2KX1mdW5jdGlvbiBvKHQsZSxuLGkpe3ZhciBwPXR5cGVvZiB0O2lmKCJ1bmRlZmluZWQi IT09cCYmImJvb2xlYW4iIT09cHx8KHQ9bnVsbCksbnVsbD09PXR8fCJzdHJpbmciPT09cHx8Im51 bWJlciI9PT1wfHwib2JqZWN0Ij09PXAmJnQuJCR0eXBlb2Y9PT1hKXJldHVybiBuKGksdCwiIj09 PWU/bCtyKHQsMCk6ZSksMTt2YXIgZCx5LHY9MCxoPSIiPT09ZT9sOmUrZjtpZihBcnJheS5pc0Fy cmF5KHQpKWZvcih2YXIgbT0wO208dC5sZW5ndGg7bSsrKWQ9dFttXSx5PWgrcihkLG0pLHYrPW8o ZCx5LG4saSk7ZWxzZXt2YXIgYj1zKHQpO2lmKGIpe3ZhciBnLEU9Yi5jYWxsKHQpO2lmKGIhPT10 LmVudHJpZXMpZm9yKHZhciB4PTA7IShnPUUubmV4dCgpKS5kb25lOylkPWcudmFsdWUseT1oK3Io ZCx4KyspLHYrPW8oZCx5LG4saSk7ZWxzZSBmb3IoOyEoZz1FLm5leHQoKSkuZG9uZTspe3ZhciBf PWcudmFsdWU7XyYmKGQ9X1sxXSx5PWgrYy5lc2NhcGUoX1swXSkrZityKGQsMCksdis9byhkLHks bixpKSl9fWVsc2UgaWYoIm9iamVjdCI9PT1wKXt2YXIgUD0iIix3PVN0cmluZyh0KTt1KCIzMSIs IltvYmplY3QgT2JqZWN0XSI9PT13PyJvYmplY3Qgd2l0aCBrZXlzIHsiK09iamVjdC5rZXlzKHQp LmpvaW4oIiwgIikrIn0iOncsUCl9fXJldHVybiB2fWZ1bmN0aW9uIGkodCxlLG4pe3JldHVybiBu dWxsPT10PzA6byh0LCIiLGUsbil9dmFyIHU9dCgyMSksYT0odCg3KSx0KDEwKSkscz10KDE5KSxj PSh0KDI1KSx0KDEpKSxsPSh0KDI2KSwiLiIpLGY9IjoiO2UuZXhwb3J0cz1pfSx7MToxLDEwOjEw LDE5OjE5LDIxOjIxLDI1OjI1LDI2OjI2LDc6N31dLDIzOltmdW5jdGlvbih0LGUsbil7InVzZSBz dHJpY3QiO2Z1bmN0aW9uIHIodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciBvPWZ1 bmN0aW9uKCl7fTtvLnRoYXRSZXR1cm5zPXIsby50aGF0UmV0dXJuc0ZhbHNlPXIoITEpLG8udGhh dFJldHVybnNUcnVlPXIoITApLG8udGhhdFJldHVybnNOdWxsPXIobnVsbCksby50aGF0UmV0dXJu c1RoaXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sby50aGF0UmV0dXJuc0FyZ3VtZW50PWZ1bmN0 aW9uKHQpe3JldHVybiB0fSxlLmV4cG9ydHM9b30se31dLDI0OltmdW5jdGlvbih0LGUsbil7InVz ZSBzdHJpY3QiO3ZhciByPXt9O2UuZXhwb3J0cz1yfSx7fV0sMjU6W2Z1bmN0aW9uKHQsZSxuKXsi dXNlIHN0cmljdCI7ZnVuY3Rpb24gcih0LGUsbixyLGksdSxhLHMpe2lmKG8oZSksIXQpe3ZhciBj O2lmKHZvaWQgMD09PWUpYz1uZXcgRXJyb3IoIk1pbmlmaWVkIGV4Y2VwdGlvbiBvY2N1cnJlZDsg dXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciB0aGUgZnVsbCBlcnJvciBt ZXNzYWdlIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuIik7ZWxzZXt2YXIgbD1bbixy LGksdSxhLHNdLGY9MDtjPW5ldyBFcnJvcihlLnJlcGxhY2UoLyVzL2csZnVuY3Rpb24oKXtyZXR1 cm4gbFtmKytdfSkpLGMubmFtZT0iSW52YXJpYW50IFZpb2xhdGlvbiJ9dGhyb3cgYy5mcmFtZXNU b1BvcD0xLGN9fXZhciBvPWZ1bmN0aW9uKHQpe307ZS5leHBvcnRzPXJ9LHt9XSwyNjpbZnVuY3Rp b24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10KDIzKSxvPXI7ZS5leHBvcnRzPW99LHsyMzoy M31dLDI3OltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIodCl7aWYobnVs bD09PXR8fHZvaWQgMD09PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0LmFzc2lnbiBjYW5u b3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQiKTtyZXR1cm4gT2JqZWN0KHQpfWZ1 bmN0aW9uIG8oKXt0cnl7aWYoIU9iamVjdC5hc3NpZ24pcmV0dXJuITE7dmFyIHQ9bmV3IFN0cmlu ZygiYWJjIik7aWYodFs1XT0iZGUiLCI1Ij09PU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHQp WzBdKXJldHVybiExO2Zvcih2YXIgZT17fSxuPTA7bjwxMDtuKyspZVsiXyIrU3RyaW5nLmZyb21D aGFyQ29kZShuKV09bjt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKS5tYXAoZnVu Y3Rpb24odCl7cmV0dXJuIGVbdF19KTtpZigiMDEyMzQ1Njc4OSIhPT1yLmpvaW4oIiIpKXJldHVy biExO3ZhciBvPXt9O3JldHVybiJhYmNkZWZnaGlqa2xtbm9wcXJzdCIuc3BsaXQoIiIpLmZvckVh Y2goZnVuY3Rpb24odCl7b1t0XT10fSksImFiY2RlZmdoaWprbG1ub3BxcnN0Ij09PU9iamVjdC5r ZXlzKE9iamVjdC5hc3NpZ24oe30sbykpLmpvaW4oIiIpfWNhdGNoKHQpe3JldHVybiExfX12YXIg aT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHU9T2JqZWN0LnByb3RvdHlwZS5wcm9w ZXJ0eUlzRW51bWVyYWJsZTtlLmV4cG9ydHM9bygpP09iamVjdC5hc3NpZ246ZnVuY3Rpb24odCxl KXtmb3IodmFyIG4sbyxhPXIodCkscz0xO3M8YXJndW1lbnRzLmxlbmd0aDtzKyspe249T2JqZWN0 KGFyZ3VtZW50c1tzXSk7Zm9yKHZhciBjIGluIG4paS5jYWxsKG4sYykmJihhW2NdPW5bY10pO2lm KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe289T2JqZWN0LmdldE93blByb3BlcnR5U3lt Ym9scyhuKTtmb3IodmFyIGw9MDtsPG8ubGVuZ3RoO2wrKyl1LmNhbGwobixvW2xdKSYmKGFbb1ts XV09bltvW2xdXSl9fXJldHVybiBhfX0se31dfSx7fSxbMTZdKSgxNil9KTsKXCBObyBuZXdsaW5l IGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3Jl YWN0L2xpYi9LZXlFc2NhcGVVdGlscy5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVh Y3QvbGliL0tleUVzY2FwZVV0aWxzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAwLi4wYWJmMWEyMgotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5k b3IvcmVhY3QvbGliL0tleUVzY2FwZVV0aWxzLmpzCkBAIC0wLDAgKzEsNTggQEAKKy8qKgorICog Q29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVz ZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNE LXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qg ZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9m IHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNh bWUgZGlyZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKKworLyoqCisgKiBF c2NhcGUgYW5kIHdyYXAga2V5IHNvIGl0IGlzIHNhZmUgdG8gdXNlIGFzIGEgcmVhY3RpZAorICoK KyAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgdG8gYmUgZXNjYXBlZC4KKyAqIEByZXR1cm4ge3N0cmlu Z30gdGhlIGVzY2FwZWQga2V5LgorICovCisKK2Z1bmN0aW9uIGVzY2FwZShrZXkpIHsKKyAgdmFy IGVzY2FwZVJlZ2V4ID0gL1s9Ol0vZzsKKyAgdmFyIGVzY2FwZXJMb29rdXAgPSB7CisgICAgJz0n OiAnPTAnLAorICAgICc6JzogJz0yJworICB9OworICB2YXIgZXNjYXBlZFN0cmluZyA9ICgnJyAr IGtleSkucmVwbGFjZShlc2NhcGVSZWdleCwgZnVuY3Rpb24gKG1hdGNoKSB7CisgICAgcmV0dXJu IGVzY2FwZXJMb29rdXBbbWF0Y2hdOworICB9KTsKKworICByZXR1cm4gJyQnICsgZXNjYXBlZFN0 cmluZzsKK30KKworLyoqCisgKiBVbmVzY2FwZSBhbmQgdW53cmFwIGtleSBmb3IgaHVtYW4tcmVh ZGFibGUgZGlzcGxheQorICoKKyAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgdG8gdW5lc2NhcGUuCisg KiBAcmV0dXJuIHtzdHJpbmd9IHRoZSB1bmVzY2FwZWQga2V5LgorICovCitmdW5jdGlvbiB1bmVz Y2FwZShrZXkpIHsKKyAgdmFyIHVuZXNjYXBlUmVnZXggPSAvKD0wfD0yKS9nOworICB2YXIgdW5l c2NhcGVyTG9va3VwID0geworICAgICc9MCc6ICc9JywKKyAgICAnPTInOiAnOicKKyAgfTsKKyAg dmFyIGtleVN1YnN0cmluZyA9IGtleVswXSA9PT0gJy4nICYmIGtleVsxXSA9PT0gJyQnID8ga2V5 LnN1YnN0cmluZygyKSA6IGtleS5zdWJzdHJpbmcoMSk7CisKKyAgcmV0dXJuICgnJyArIGtleVN1 YnN0cmluZykucmVwbGFjZSh1bmVzY2FwZVJlZ2V4LCBmdW5jdGlvbiAobWF0Y2gpIHsKKyAgICBy ZXR1cm4gdW5lc2NhcGVyTG9va3VwW21hdGNoXTsKKyAgfSk7Cit9CisKK3ZhciBLZXlFc2NhcGVV dGlscyA9IHsKKyAgZXNjYXBlOiBlc2NhcGUsCisgIHVuZXNjYXBlOiB1bmVzY2FwZQorfTsKKwor bW9kdWxlLmV4cG9ydHMgPSBLZXlFc2NhcGVVdGlsczsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBm aWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0L2xpYi9MaW5r ZWRTdGF0ZU1peGluLmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvTGlu a2VkU3RhdGVNaXhpbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uODk1 Y2Y3MzYKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0 L2xpYi9MaW5rZWRTdGF0ZU1peGluLmpzCkBAIC0wLDAgKzEsMzQgQEAKKy8qKgorICogQ29weXJp Z2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQu CisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxl IGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0 b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVu dCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGly ZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBSZWFjdExpbmsgPSByZXF1 aXJlKCcuL1JlYWN0TGluaycpOwordmFyIFJlYWN0U3RhdGVTZXR0ZXJzID0gcmVxdWlyZSgnLi9S ZWFjdFN0YXRlU2V0dGVycycpOworCisvKioKKyAqIEEgc2ltcGxlIG1peGluIGFyb3VuZCBSZWFj dExpbmsuZm9yU3RhdGUoKS4KKyAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFj dC9kb2NzL3R3by13YXktYmluZGluZy1oZWxwZXJzLmh0bWwKKyAqLwordmFyIExpbmtlZFN0YXRl TWl4aW4gPSB7CisgIC8qKgorICAgKiBDcmVhdGUgYSBSZWFjdExpbmsgdGhhdCdzIGxpbmtlZCB0 byBwYXJ0IG9mIHRoaXMgY29tcG9uZW50J3Mgc3RhdGUuIFRoZQorICAgKiBSZWFjdExpbmsgd2ls bCBoYXZlIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoaXMuc3RhdGVba2V5XSBhbmQgd2lsbCBjYWxs CisgICAqIHNldFN0YXRlKCkgd2hlbiBhIGNoYW5nZSBpcyByZXF1ZXN0ZWQuCisgICAqCisgICAq IEBwYXJhbSB7c3RyaW5nfSBrZXkgc3RhdGUga2V5IHRvIHVwZGF0ZS4KKyAgICogQHJldHVybiB7 UmVhY3RMaW5rfSBSZWFjdExpbmsgaW5zdGFuY2UgbGlua2luZyB0byB0aGUgc3RhdGUuCisgICAq LworICBsaW5rU3RhdGU6IGZ1bmN0aW9uIChrZXkpIHsKKyAgICByZXR1cm4gbmV3IFJlYWN0TGlu ayh0aGlzLnN0YXRlW2tleV0sIFJlYWN0U3RhdGVTZXR0ZXJzLmNyZWF0ZVN0YXRlS2V5U2V0dGVy KHRoaXMsIGtleSkpOworICB9Cit9OworCittb2R1bGUuZXhwb3J0cyA9IExpbmtlZFN0YXRlTWl4 aW47ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4v c3RhdGljL3ZlbmRvci9yZWFjdC9saWIvUG9vbGVkQ2xhc3MuanMgYi93ZWIvcGdhZG1pbi9zdGF0 aWMvdmVuZG9yL3JlYWN0L2xpYi9Qb29sZWRDbGFzcy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMC4uMWQxMGVhZjEKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9z dGF0aWMvdmVuZG9yL3JlYWN0L2xpYi9Qb29sZWRDbGFzcy5qcwpAQCAtMCwwICsxLDExMSBAQAor LyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJp Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVy IHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0 aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFu dAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBp biB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2 YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpOworCit2 YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7CisKKy8qKgorICog U3RhdGljIHBvb2xlcnMuIFNldmVyYWwgY3VzdG9tIHZlcnNpb25zIGZvciBlYWNoIHBvdGVudGlh bCBudW1iZXIgb2YKKyAqIGFyZ3VtZW50cy4gQSBjb21wbGV0ZWx5IGdlbmVyaWMgcG9vbGVyIGlz IGVhc3kgdG8gaW1wbGVtZW50LCBidXQgd291bGQKKyAqIHJlcXVpcmUgYWNjZXNzaW5nIHRoZSBg YXJndW1lbnRzYCBvYmplY3QuIEluIGVhY2ggb2YgdGhlc2UsIGB0aGlzYCByZWZlcnMgdG8KKyAq IHRoZSBDbGFzcyBpdHNlbGYsIG5vdCBhbiBpbnN0YW5jZS4gSWYgYW55IG90aGVycyBhcmUgbmVl ZGVkLCBzaW1wbHkgYWRkIHRoZW0KKyAqIGhlcmUsIG9yIGluIHRoZWlyIG93biBmaWxlcy4KKyAq LwordmFyIG9uZUFyZ3VtZW50UG9vbGVyID0gZnVuY3Rpb24gKGNvcHlGaWVsZHNGcm9tKSB7Cisg IHZhciBLbGFzcyA9IHRoaXM7CisgIGlmIChLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoKSB7Cisg ICAgdmFyIGluc3RhbmNlID0gS2xhc3MuaW5zdGFuY2VQb29sLnBvcCgpOworICAgIEtsYXNzLmNh bGwoaW5zdGFuY2UsIGNvcHlGaWVsZHNGcm9tKTsKKyAgICByZXR1cm4gaW5zdGFuY2U7CisgIH0g ZWxzZSB7CisgICAgcmV0dXJuIG5ldyBLbGFzcyhjb3B5RmllbGRzRnJvbSk7CisgIH0KK307CisK K3ZhciB0d29Bcmd1bWVudFBvb2xlciA9IGZ1bmN0aW9uIChhMSwgYTIpIHsKKyAgdmFyIEtsYXNz ID0gdGhpczsKKyAgaWYgKEtsYXNzLmluc3RhbmNlUG9vbC5sZW5ndGgpIHsKKyAgICB2YXIgaW5z dGFuY2UgPSBLbGFzcy5pbnN0YW5jZVBvb2wucG9wKCk7CisgICAgS2xhc3MuY2FsbChpbnN0YW5j ZSwgYTEsIGEyKTsKKyAgICByZXR1cm4gaW5zdGFuY2U7CisgIH0gZWxzZSB7CisgICAgcmV0dXJu IG5ldyBLbGFzcyhhMSwgYTIpOworICB9Cit9OworCit2YXIgdGhyZWVBcmd1bWVudFBvb2xlciA9 IGZ1bmN0aW9uIChhMSwgYTIsIGEzKSB7CisgIHZhciBLbGFzcyA9IHRoaXM7CisgIGlmIChLbGFz cy5pbnN0YW5jZVBvb2wubGVuZ3RoKSB7CisgICAgdmFyIGluc3RhbmNlID0gS2xhc3MuaW5zdGFu Y2VQb29sLnBvcCgpOworICAgIEtsYXNzLmNhbGwoaW5zdGFuY2UsIGExLCBhMiwgYTMpOworICAg IHJldHVybiBpbnN0YW5jZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbmV3IEtsYXNzKGExLCBh MiwgYTMpOworICB9Cit9OworCit2YXIgZm91ckFyZ3VtZW50UG9vbGVyID0gZnVuY3Rpb24gKGEx LCBhMiwgYTMsIGE0KSB7CisgIHZhciBLbGFzcyA9IHRoaXM7CisgIGlmIChLbGFzcy5pbnN0YW5j ZVBvb2wubGVuZ3RoKSB7CisgICAgdmFyIGluc3RhbmNlID0gS2xhc3MuaW5zdGFuY2VQb29sLnBv cCgpOworICAgIEtsYXNzLmNhbGwoaW5zdGFuY2UsIGExLCBhMiwgYTMsIGE0KTsKKyAgICByZXR1 cm4gaW5zdGFuY2U7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5ldyBLbGFzcyhhMSwgYTIsIGEz LCBhNCk7CisgIH0KK307CisKK3ZhciBzdGFuZGFyZFJlbGVhc2VyID0gZnVuY3Rpb24gKGluc3Rh bmNlKSB7CisgIHZhciBLbGFzcyA9IHRoaXM7CisgICEoaW5zdGFuY2UgaW5zdGFuY2VvZiBLbGFz cykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZh bHNlLCAnVHJ5aW5nIHRvIHJlbGVhc2UgYW4gaW5zdGFuY2UgaW50byBhIHBvb2wgb2YgYSBkaWZm ZXJlbnQgdHlwZS4nKSA6IF9wcm9kSW52YXJpYW50KCcyNScpIDogdm9pZCAwOworICBpbnN0YW5j ZS5kZXN0cnVjdG9yKCk7CisgIGlmIChLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoIDwgS2xhc3Mu cG9vbFNpemUpIHsKKyAgICBLbGFzcy5pbnN0YW5jZVBvb2wucHVzaChpbnN0YW5jZSk7CisgIH0K K307CisKK3ZhciBERUZBVUxUX1BPT0xfU0laRSA9IDEwOwordmFyIERFRkFVTFRfUE9PTEVSID0g b25lQXJndW1lbnRQb29sZXI7CisKKy8qKgorICogQXVnbWVudHMgYENvcHlDb25zdHJ1Y3RvcmAg dG8gYmUgYSBwb29sYWJsZSBjbGFzcywgYXVnbWVudGluZyBvbmx5IHRoZSBjbGFzcworICogaXRz ZWxmIChzdGF0aWNhbGx5KSBub3QgYWRkaW5nIGFueSBwcm90b3R5cGljYWwgZmllbGRzLiBBbnkg Q29weUNvbnN0cnVjdG9yCisgKiB5b3UgZ2l2ZSB0aGlzIG1heSBoYXZlIGEgYHBvb2xTaXplYCBw cm9wZXJ0eSwgYW5kIHdpbGwgbG9vayBmb3IgYQorICogcHJvdG90eXBpY2FsIGBkZXN0cnVjdG9y YCBvbiBpbnN0YW5jZXMuCisgKgorICogQHBhcmFtIHtGdW5jdGlvbn0gQ29weUNvbnN0cnVjdG9y IENvbnN0cnVjdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVzZXQuCisgKiBAcGFyYW0ge0Z1bmN0 aW9ufSBwb29sZXIgQ3VzdG9taXphYmxlIHBvb2xlci4KKyAqLwordmFyIGFkZFBvb2xpbmdUbyA9 IGZ1bmN0aW9uIChDb3B5Q29uc3RydWN0b3IsIHBvb2xlcikgeworICAvLyBDYXN0aW5nIGFzIGFu eSBzbyB0aGF0IGZsb3cgaWdub3JlcyB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIGFuZCB0cnVz dHMKKyAgLy8gaXQgdG8gbWF0Y2ggdGhlIHR5cGUgd2UgZGVjbGFyZWQKKyAgdmFyIE5ld0tsYXNz ID0gQ29weUNvbnN0cnVjdG9yOworICBOZXdLbGFzcy5pbnN0YW5jZVBvb2wgPSBbXTsKKyAgTmV3 S2xhc3MuZ2V0UG9vbGVkID0gcG9vbGVyIHx8IERFRkFVTFRfUE9PTEVSOworICBpZiAoIU5ld0ts YXNzLnBvb2xTaXplKSB7CisgICAgTmV3S2xhc3MucG9vbFNpemUgPSBERUZBVUxUX1BPT0xfU0la RTsKKyAgfQorICBOZXdLbGFzcy5yZWxlYXNlID0gc3RhbmRhcmRSZWxlYXNlcjsKKyAgcmV0dXJu IE5ld0tsYXNzOworfTsKKwordmFyIFBvb2xlZENsYXNzID0geworICBhZGRQb29saW5nVG86IGFk ZFBvb2xpbmdUbywKKyAgb25lQXJndW1lbnRQb29sZXI6IG9uZUFyZ3VtZW50UG9vbGVyLAorICB0 d29Bcmd1bWVudFBvb2xlcjogdHdvQXJndW1lbnRQb29sZXIsCisgIHRocmVlQXJndW1lbnRQb29s ZXI6IHRocmVlQXJndW1lbnRQb29sZXIsCisgIGZvdXJBcmd1bWVudFBvb2xlcjogZm91ckFyZ3Vt ZW50UG9vbGVyCit9OworCittb2R1bGUuZXhwb3J0cyA9IFBvb2xlZENsYXNzOwpcIE5vIG5ld2xp bmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3Iv cmVhY3QvbGliL1JlYWN0LmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIv UmVhY3QuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLmQyOTcwMGQyCi0t LSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvUmVh Y3QuanMKQEAgLTAsMCArMSw4OCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBG YWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJj ZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0 aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2Ug dHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91 bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisK Kyd1c2Ugc3RyaWN0JzsKKwordmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7 CisKK3ZhciBSZWFjdENoaWxkcmVuID0gcmVxdWlyZSgnLi9SZWFjdENoaWxkcmVuJyk7Cit2YXIg UmVhY3RDb21wb25lbnQgPSByZXF1aXJlKCcuL1JlYWN0Q29tcG9uZW50Jyk7Cit2YXIgUmVhY3RQ dXJlQ29tcG9uZW50ID0gcmVxdWlyZSgnLi9SZWFjdFB1cmVDb21wb25lbnQnKTsKK3ZhciBSZWFj dENsYXNzID0gcmVxdWlyZSgnLi9SZWFjdENsYXNzJyk7Cit2YXIgUmVhY3RET01GYWN0b3JpZXMg PSByZXF1aXJlKCcuL1JlYWN0RE9NRmFjdG9yaWVzJyk7Cit2YXIgUmVhY3RFbGVtZW50ID0gcmVx dWlyZSgnLi9SZWFjdEVsZW1lbnQnKTsKK3ZhciBSZWFjdFByb3BUeXBlcyA9IHJlcXVpcmUoJy4v UmVhY3RQcm9wVHlwZXMnKTsKK3ZhciBSZWFjdFZlcnNpb24gPSByZXF1aXJlKCcuL1JlYWN0VmVy c2lvbicpOworCit2YXIgb25seUNoaWxkID0gcmVxdWlyZSgnLi9vbmx5Q2hpbGQnKTsKK3ZhciB3 YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpOworCit2YXIgY3JlYXRlRWxlbWVu dCA9IFJlYWN0RWxlbWVudC5jcmVhdGVFbGVtZW50OwordmFyIGNyZWF0ZUZhY3RvcnkgPSBSZWFj dEVsZW1lbnQuY3JlYXRlRmFjdG9yeTsKK3ZhciBjbG9uZUVsZW1lbnQgPSBSZWFjdEVsZW1lbnQu Y2xvbmVFbGVtZW50OworCitpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9u JykgeworICB2YXIgUmVhY3RFbGVtZW50VmFsaWRhdG9yID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1l bnRWYWxpZGF0b3InKTsKKyAgY3JlYXRlRWxlbWVudCA9IFJlYWN0RWxlbWVudFZhbGlkYXRvci5j cmVhdGVFbGVtZW50OworICBjcmVhdGVGYWN0b3J5ID0gUmVhY3RFbGVtZW50VmFsaWRhdG9yLmNy ZWF0ZUZhY3Rvcnk7CisgIGNsb25lRWxlbWVudCA9IFJlYWN0RWxlbWVudFZhbGlkYXRvci5jbG9u ZUVsZW1lbnQ7Cit9CisKK3ZhciBfX3NwcmVhZCA9IF9hc3NpZ247CisKK2lmIChwcm9jZXNzLmVu di5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgIHZhciB3YXJuZWQgPSBmYWxzZTsKKyAg X19zcHJlYWQgPSBmdW5jdGlvbiAoKSB7CisgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdw cm9kdWN0aW9uJyA/IHdhcm5pbmcod2FybmVkLCAnUmVhY3QuX19zcHJlYWQgaXMgZGVwcmVjYXRl ZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLiBVc2UgJyArICdPYmplY3QuYXNzaWduIGRpcmVjdGx5 IG9yIGFub3RoZXIgaGVscGVyIGZ1bmN0aW9uIHdpdGggc2ltaWxhciAnICsgJ3NlbWFudGljcy4g WW91IG1heSBiZSBzZWVpbmcgdGhpcyB3YXJuaW5nIGR1ZSB0byB5b3VyIGNvbXBpbGVyLiAnICsg J1NlZSBodHRwczovL2ZiLm1lL3JlYWN0LXNwcmVhZC1kZXByZWNhdGlvbiBmb3IgbW9yZSBkZXRh aWxzLicpIDogdm9pZCAwOworICAgIHdhcm5lZCA9IHRydWU7CisgICAgcmV0dXJuIF9hc3NpZ24u YXBwbHkobnVsbCwgYXJndW1lbnRzKTsKKyAgfTsKK30KKwordmFyIFJlYWN0ID0geworCisgIC8v IE1vZGVybgorCisgIENoaWxkcmVuOiB7CisgICAgbWFwOiBSZWFjdENoaWxkcmVuLm1hcCwKKyAg ICBmb3JFYWNoOiBSZWFjdENoaWxkcmVuLmZvckVhY2gsCisgICAgY291bnQ6IFJlYWN0Q2hpbGRy ZW4uY291bnQsCisgICAgdG9BcnJheTogUmVhY3RDaGlsZHJlbi50b0FycmF5LAorICAgIG9ubHk6 IG9ubHlDaGlsZAorICB9LAorCisgIENvbXBvbmVudDogUmVhY3RDb21wb25lbnQsCisgIFB1cmVD b21wb25lbnQ6IFJlYWN0UHVyZUNvbXBvbmVudCwKKworICBjcmVhdGVFbGVtZW50OiBjcmVhdGVF bGVtZW50LAorICBjbG9uZUVsZW1lbnQ6IGNsb25lRWxlbWVudCwKKyAgaXNWYWxpZEVsZW1lbnQ6 IFJlYWN0RWxlbWVudC5pc1ZhbGlkRWxlbWVudCwKKworICAvLyBDbGFzc2ljCisKKyAgUHJvcFR5 cGVzOiBSZWFjdFByb3BUeXBlcywKKyAgY3JlYXRlQ2xhc3M6IFJlYWN0Q2xhc3MuY3JlYXRlQ2xh c3MsCisgIGNyZWF0ZUZhY3Rvcnk6IGNyZWF0ZUZhY3RvcnksCisgIGNyZWF0ZU1peGluOiBmdW5j dGlvbiAobWl4aW4pIHsKKyAgICAvLyBDdXJyZW50bHkgYSBub29wLiBXaWxsIGJlIHVzZWQgdG8g dmFsaWRhdGUgYW5kIHRyYWNlIG1peGlucy4KKyAgICByZXR1cm4gbWl4aW47CisgIH0sCisKKyAg Ly8gVGhpcyBsb29rcyBET00gc3BlY2lmaWMgYnV0IHRoZXNlIGFyZSBhY3R1YWxseSBpc29tb3Jw aGljIGhlbHBlcnMKKyAgLy8gc2luY2UgdGhleSBhcmUganVzdCBnZW5lcmF0aW5nIERPTSBzdHJp bmdzLgorICBET006IFJlYWN0RE9NRmFjdG9yaWVzLAorCisgIHZlcnNpb246IFJlYWN0VmVyc2lv biwKKworICAvLyBEZXByZWNhdGVkIGhvb2sgZm9yIEpTWCBzcHJlYWQsIGRvbid0IHVzZSB0aGlz IGZvciBhbnl0aGluZy4KKyAgX19zcHJlYWQ6IF9fc3ByZWFkCit9OworCittb2R1bGUuZXhwb3J0 cyA9IFJlYWN0OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9w Z2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL1JlYWN0QWRkb25zRE9NRGVwZW5kZW5jaWVz LmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvUmVhY3RBZGRvbnNET01E ZXBlbmRlbmNpZXMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjZmOTE0 ZmQxCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9s aWIvUmVhY3RBZGRvbnNET01EZXBlbmRlbmNpZXMuanMKQEAgLTAsMCArMSwzNiBAQAorLyoqCisg KiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyBy ZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBC U0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9v dCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICog b2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUg c2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFJlYWN0RE9N ID0gcmVxdWlyZSgncmVhY3QtZG9tL2xpYi9SZWFjdERPTScpOworCitleHBvcnRzLmdldFJlYWN0 RE9NID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gUmVhY3RET007Cit9OworCitpZiAocHJvY2Vz cy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgeworICB2YXIgUmVhY3RQZXJmOworICB2 YXIgUmVhY3RUZXN0VXRpbHM7CisKKyAgZXhwb3J0cy5nZXRSZWFjdFBlcmYgPSBmdW5jdGlvbiAo KSB7CisgICAgaWYgKCFSZWFjdFBlcmYpIHsKKyAgICAgIFJlYWN0UGVyZiA9IHJlcXVpcmUoJ3Jl YWN0LWRvbS9saWIvUmVhY3RQZXJmJyk7CisgICAgfQorICAgIHJldHVybiBSZWFjdFBlcmY7Cisg IH07CisKKyAgZXhwb3J0cy5nZXRSZWFjdFRlc3RVdGlscyA9IGZ1bmN0aW9uICgpIHsKKyAgICBp ZiAoIVJlYWN0VGVzdFV0aWxzKSB7CisgICAgICBSZWFjdFRlc3RVdGlscyA9IHJlcXVpcmUoJ3Jl YWN0LWRvbS9saWIvUmVhY3RUZXN0VXRpbHMnKTsKKyAgICB9CisgICAgcmV0dXJuIFJlYWN0VGVz dFV0aWxzOworICB9OworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBh L3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL1JlYWN0QWRkb25zRE9NRGVwZW5k ZW5jaWVzVU1EU2hpbS5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL1Jl YWN0QWRkb25zRE9NRGVwZW5kZW5jaWVzVU1EU2hpbS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMC4uMjdlOGZjNzMKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9z dGF0aWMvdmVuZG9yL3JlYWN0L2xpYi9SZWFjdEFkZG9uc0RPTURlcGVuZGVuY2llc1VNRFNoaW0u anMKQEAgLTAsMCArMSwzNSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNl Ym9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBj b2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUK KyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJl ZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQg aW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1 c2Ugc3RyaWN0JzsKKwordmFyIFJlYWN0RE9NOworCitmdW5jdGlvbiBnZXRSZWFjdERPTSgpIHsK KyAgaWYgKCFSZWFjdERPTSkgeworICAgIC8vIFRoaXMgaXMgc2FmZSB0byB1c2UgYmVjYXVzZSBj dXJyZW50IG1vZHVsZSBvbmx5IGV4aXN0cyBpbiB0aGUgYWRkb25zIGJ1aWxkOgorICAgIHZhciBS ZWFjdFdpdGhBZGRvbnNVTURFbnRyeSA9IHJlcXVpcmUoJy4vUmVhY3RXaXRoQWRkb25zVU1ERW50 cnknKTsKKyAgICAvLyBUaGlzIGlzIGluamVjdGVkIGJ5IHRoZSBSZWFjdERPTSBVTUQgYnVpbGQ6 CisgICAgUmVhY3RET00gPSBSZWFjdFdpdGhBZGRvbnNVTURFbnRyeS5fX1NFQ1JFVF9JTkpFQ1RF RF9SRUFDVF9ET01fRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDsKKyAgfQorICByZXR1 cm4gUmVhY3RET007Cit9CisKK2V4cG9ydHMuZ2V0UmVhY3RET00gPSBnZXRSZWFjdERPTTsKKwor aWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgZXhwb3J0cy5n ZXRSZWFjdFBlcmYgPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIGdldFJlYWN0RE9NKCkuX19T RUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQuUmVhY3RQZXJm OworICB9OworCisgIGV4cG9ydHMuZ2V0UmVhY3RUZXN0VXRpbHMgPSBmdW5jdGlvbiAoKSB7Cisg ICAgcmV0dXJuIGdldFJlYWN0RE9NKCkuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1Jf WU9VX1dJTExfQkVfRklSRUQuUmVhY3RUZXN0VXRpbHM7CisgIH07Cit9ClwgTm8gbmV3bGluZSBh dCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFj dC9saWIvUmVhY3RDU1NUcmFuc2l0aW9uR3JvdXAuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVu ZG9yL3JlYWN0L2xpYi9SZWFjdENTU1RyYW5zaXRpb25Hcm91cC5qcwpuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwMC4uYmJmY2I0MjIKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdh ZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0L2xpYi9SZWFjdENTU1RyYW5zaXRpb25Hcm91cC5qcwpA QCAtMCwwICsxLDEwNCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9v aywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2Rl IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAq IExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4g QW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4g dGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ug c3RyaWN0JzsKKwordmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7CisKK2Z1 bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5z dGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fu bm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQorCitmdW5jdGlvbiBfcG9zc2li bGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcg UmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhh c24ndCBiZWVuIGNhbGxlZCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gIm9i amVjdCIgfHwgdHlwZW9mIGNhbGwgPT09ICJmdW5jdGlvbiIpID8gY2FsbCA6IHNlbGY7IH0KKwor ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3Vw ZXJDbGFzcyAhPT0gImZ1bmN0aW9uIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5l dyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1 bmN0aW9uLCBub3QgIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUg PSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29u c3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6 IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNl dFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNz KSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH0KKwordmFyIFJlYWN0ID0gcmVx dWlyZSgnLi9SZWFjdCcpOworCit2YXIgUmVhY3RUcmFuc2l0aW9uR3JvdXAgPSByZXF1aXJlKCcu L1JlYWN0VHJhbnNpdGlvbkdyb3VwJyk7Cit2YXIgUmVhY3RDU1NUcmFuc2l0aW9uR3JvdXBDaGls ZCA9IHJlcXVpcmUoJy4vUmVhY3RDU1NUcmFuc2l0aW9uR3JvdXBDaGlsZCcpOworCitmdW5jdGlv biBjcmVhdGVUcmFuc2l0aW9uVGltZW91dFByb3BWYWxpZGF0b3IodHJhbnNpdGlvblR5cGUpIHsK KyAgdmFyIHRpbWVvdXRQcm9wTmFtZSA9ICd0cmFuc2l0aW9uJyArIHRyYW5zaXRpb25UeXBlICsg J1RpbWVvdXQnOworICB2YXIgZW5hYmxlZFByb3BOYW1lID0gJ3RyYW5zaXRpb24nICsgdHJhbnNp dGlvblR5cGU7CisKKyAgcmV0dXJuIGZ1bmN0aW9uIChwcm9wcykgeworICAgIC8vIElmIHRoZSB0 cmFuc2l0aW9uIGlzIGVuYWJsZWQKKyAgICBpZiAocHJvcHNbZW5hYmxlZFByb3BOYW1lXSkgewor ICAgICAgLy8gSWYgbm8gdGltZW91dCBkdXJhdGlvbiBpcyBwcm92aWRlZAorICAgICAgaWYgKHBy b3BzW3RpbWVvdXRQcm9wTmFtZV0gPT0gbnVsbCkgeworICAgICAgICByZXR1cm4gbmV3IEVycm9y KHRpbWVvdXRQcm9wTmFtZSArICcgd2FzblwndCBzdXBwbGllZCB0byBSZWFjdENTU1RyYW5zaXRp b25Hcm91cDogJyArICd0aGlzIGNhbiBjYXVzZSB1bnJlbGlhYmxlIGFuaW1hdGlvbnMgYW5kIHdv blwndCBiZSBzdXBwb3J0ZWQgaW4gJyArICdhIGZ1dHVyZSB2ZXJzaW9uIG9mIFJlYWN0LiBTZWUg JyArICdodHRwczovL2ZiLm1lL3JlYWN0LWFuaW1hdGlvbi10cmFuc2l0aW9uLWdyb3VwLXRpbWVv dXQgZm9yIG1vcmUgJyArICdpbmZvcm1hdGlvbi4nKTsKKworICAgICAgICAvLyBJZiB0aGUgZHVy YXRpb24gaXNuJ3QgYSBudW1iZXIKKyAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHByb3BzW3RpbWVv dXRQcm9wTmFtZV0gIT09ICdudW1iZXInKSB7CisgICAgICAgIHJldHVybiBuZXcgRXJyb3IodGlt ZW91dFByb3BOYW1lICsgJyBtdXN0IGJlIGEgbnVtYmVyIChpbiBtaWxsaXNlY29uZHMpJyk7Cisg ICAgICB9CisgICAgfQorICB9OworfQorCisvKioKKyAqIEFuIGVhc3kgd2F5IHRvIHBlcmZvcm0g Q1NTIHRyYW5zaXRpb25zIGFuZCBhbmltYXRpb25zIHdoZW4gYSBSZWFjdCBjb21wb25lbnQKKyAq IGVudGVycyBvciBsZWF2ZXMgdGhlIERPTS4KKyAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1 Yi5pby9yZWFjdC9kb2NzL2FuaW1hdGlvbi5odG1sI2hpZ2gtbGV2ZWwtYXBpLXJlYWN0Y3NzdHJh bnNpdGlvbmdyb3VwCisgKi8KKwordmFyIFJlYWN0Q1NTVHJhbnNpdGlvbkdyb3VwID0gZnVuY3Rp b24gKF9SZWFjdCRDb21wb25lbnQpIHsKKyAgX2luaGVyaXRzKFJlYWN0Q1NTVHJhbnNpdGlvbkdy b3VwLCBfUmVhY3QkQ29tcG9uZW50KTsKKworICBmdW5jdGlvbiBSZWFjdENTU1RyYW5zaXRpb25H cm91cCgpIHsKKyAgICB2YXIgX3RlbXAsIF90aGlzLCBfcmV0OworCisgICAgX2NsYXNzQ2FsbENo ZWNrKHRoaXMsIFJlYWN0Q1NTVHJhbnNpdGlvbkdyb3VwKTsKKworICAgIGZvciAodmFyIF9sZW4g PSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwg X2xlbjsgX2tleSsrKSB7CisgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldOworICAg IH0KKworICAgIHJldHVybiBfcmV0ID0gKF90ZW1wID0gKF90aGlzID0gX3Bvc3NpYmxlQ29uc3Ry dWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JENvbXBvbmVudC5jYWxsLmFwcGx5KF9SZWFjdCRDb21w b25lbnQsIFt0aGlzXS5jb25jYXQoYXJncykpKSwgX3RoaXMpLCBfdGhpcy5fd3JhcENoaWxkID0g ZnVuY3Rpb24gKGNoaWxkKSB7CisgICAgICAvLyBXZSBuZWVkIHRvIHByb3ZpZGUgdGhpcyBjaGls ZEZhY3Rvcnkgc28gdGhhdAorICAgICAgLy8gUmVhY3RDU1NUcmFuc2l0aW9uR3JvdXBDaGlsZCBj YW4gcmVjZWl2ZSB1cGRhdGVzIHRvIG5hbWUsIGVudGVyLCBhbmQKKyAgICAgIC8vIGxlYXZlIHdo aWxlIGl0IGlzIGxlYXZpbmcuCisgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChSZWFj dENTU1RyYW5zaXRpb25Hcm91cENoaWxkLCB7CisgICAgICAgIG5hbWU6IF90aGlzLnByb3BzLnRy YW5zaXRpb25OYW1lLAorICAgICAgICBhcHBlYXI6IF90aGlzLnByb3BzLnRyYW5zaXRpb25BcHBl YXIsCisgICAgICAgIGVudGVyOiBfdGhpcy5wcm9wcy50cmFuc2l0aW9uRW50ZXIsCisgICAgICAg IGxlYXZlOiBfdGhpcy5wcm9wcy50cmFuc2l0aW9uTGVhdmUsCisgICAgICAgIGFwcGVhclRpbWVv dXQ6IF90aGlzLnByb3BzLnRyYW5zaXRpb25BcHBlYXJUaW1lb3V0LAorICAgICAgICBlbnRlclRp bWVvdXQ6IF90aGlzLnByb3BzLnRyYW5zaXRpb25FbnRlclRpbWVvdXQsCisgICAgICAgIGxlYXZl VGltZW91dDogX3RoaXMucHJvcHMudHJhbnNpdGlvbkxlYXZlVGltZW91dAorICAgICAgfSwgY2hp bGQpOworICAgIH0sIF90ZW1wKSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsIF9y ZXQpOworICB9CisKKyAgUmVhY3RDU1NUcmFuc2l0aW9uR3JvdXAucHJvdG90eXBlLnJlbmRlciA9 IGZ1bmN0aW9uIHJlbmRlcigpIHsKKyAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChSZWFj dFRyYW5zaXRpb25Hcm91cCwgX2Fzc2lnbih7fSwgdGhpcy5wcm9wcywgeyBjaGlsZEZhY3Rvcnk6 IHRoaXMuX3dyYXBDaGlsZCB9KSk7CisgIH07CisKKyAgcmV0dXJuIFJlYWN0Q1NTVHJhbnNpdGlv bkdyb3VwOworfShSZWFjdC5Db21wb25lbnQpOworCitSZWFjdENTU1RyYW5zaXRpb25Hcm91cC5k aXNwbGF5TmFtZSA9ICdSZWFjdENTU1RyYW5zaXRpb25Hcm91cCc7CitSZWFjdENTU1RyYW5zaXRp b25Hcm91cC5wcm9wVHlwZXMgPSB7CisgIHRyYW5zaXRpb25OYW1lOiBSZWFjdENTU1RyYW5zaXRp b25Hcm91cENoaWxkLnByb3BUeXBlcy5uYW1lLAorCisgIHRyYW5zaXRpb25BcHBlYXI6IFJlYWN0 LlByb3BUeXBlcy5ib29sLAorICB0cmFuc2l0aW9uRW50ZXI6IFJlYWN0LlByb3BUeXBlcy5ib29s LAorICB0cmFuc2l0aW9uTGVhdmU6IFJlYWN0LlByb3BUeXBlcy5ib29sLAorICB0cmFuc2l0aW9u QXBwZWFyVGltZW91dDogY3JlYXRlVHJhbnNpdGlvblRpbWVvdXRQcm9wVmFsaWRhdG9yKCdBcHBl YXInKSwKKyAgdHJhbnNpdGlvbkVudGVyVGltZW91dDogY3JlYXRlVHJhbnNpdGlvblRpbWVvdXRQ cm9wVmFsaWRhdG9yKCdFbnRlcicpLAorICB0cmFuc2l0aW9uTGVhdmVUaW1lb3V0OiBjcmVhdGVU cmFuc2l0aW9uVGltZW91dFByb3BWYWxpZGF0b3IoJ0xlYXZlJykKK307CitSZWFjdENTU1RyYW5z aXRpb25Hcm91cC5kZWZhdWx0UHJvcHMgPSB7CisgIHRyYW5zaXRpb25BcHBlYXI6IGZhbHNlLAor ICB0cmFuc2l0aW9uRW50ZXI6IHRydWUsCisgIHRyYW5zaXRpb25MZWF2ZTogdHJ1ZQorfTsKKwor Cittb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q1NTVHJhbnNpdGlvbkdyb3VwOwpcIE5vIG5ld2xpbmUg YXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVh Y3QvbGliL1JlYWN0Q1NTVHJhbnNpdGlvbkdyb3VwQ2hpbGQuanMgYi93ZWIvcGdhZG1pbi9zdGF0 aWMvdmVuZG9yL3JlYWN0L2xpYi9SZWFjdENTU1RyYW5zaXRpb25Hcm91cENoaWxkLmpzCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi5kODIyMDRmZQotLS0gL2Rldi9udWxsCisr KyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL1JlYWN0Q1NTVHJhbnNpdGlv bkdyb3VwQ2hpbGQuanMKQEAgLTAsMCArMSwxNjYgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMt cHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog VGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2Ug Zm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRo aXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMg Y2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5Lgor ICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBSZWFjdCA9IHJlcXVpcmUoJy4vUmVhY3Qn KTsKK3ZhciBSZWFjdEFkZG9uc0RPTURlcGVuZGVuY2llcyA9IHJlcXVpcmUoJy4vUmVhY3RBZGRv bnNET01EZXBlbmRlbmNpZXMnKTsKKwordmFyIENTU0NvcmUgPSByZXF1aXJlKCdmYmpzL2xpYi9D U1NDb3JlJyk7Cit2YXIgUmVhY3RUcmFuc2l0aW9uRXZlbnRzID0gcmVxdWlyZSgnLi9SZWFjdFRy YW5zaXRpb25FdmVudHMnKTsKKwordmFyIG9ubHlDaGlsZCA9IHJlcXVpcmUoJy4vb25seUNoaWxk Jyk7CisKK3ZhciBUSUNLID0gMTc7CisKK3ZhciBSZWFjdENTU1RyYW5zaXRpb25Hcm91cENoaWxk ID0gUmVhY3QuY3JlYXRlQ2xhc3MoeworICBkaXNwbGF5TmFtZTogJ1JlYWN0Q1NTVHJhbnNpdGlv bkdyb3VwQ2hpbGQnLAorCisgIHByb3BUeXBlczogeworICAgIG5hbWU6IFJlYWN0LlByb3BUeXBl cy5vbmVPZlR5cGUoW1JlYWN0LlByb3BUeXBlcy5zdHJpbmcsIFJlYWN0LlByb3BUeXBlcy5zaGFw ZSh7CisgICAgICBlbnRlcjogUmVhY3QuUHJvcFR5cGVzLnN0cmluZywKKyAgICAgIGxlYXZlOiBS ZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLAorICAgICAgYWN0aXZlOiBSZWFjdC5Qcm9wVHlwZXMuc3Ry aW5nCisgICAgfSksIFJlYWN0LlByb3BUeXBlcy5zaGFwZSh7CisgICAgICBlbnRlcjogUmVhY3Qu UHJvcFR5cGVzLnN0cmluZywKKyAgICAgIGVudGVyQWN0aXZlOiBSZWFjdC5Qcm9wVHlwZXMuc3Ry aW5nLAorICAgICAgbGVhdmU6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsCisgICAgICBsZWF2ZUFj dGl2ZTogUmVhY3QuUHJvcFR5cGVzLnN0cmluZywKKyAgICAgIGFwcGVhcjogUmVhY3QuUHJvcFR5 cGVzLnN0cmluZywKKyAgICAgIGFwcGVhckFjdGl2ZTogUmVhY3QuUHJvcFR5cGVzLnN0cmluZwor ICAgIH0pXSkuaXNSZXF1aXJlZCwKKworICAgIC8vIE9uY2Ugd2UgcmVxdWlyZSB0aW1lb3V0cyB0 byBiZSBzcGVjaWZpZWQsIHdlIGNhbiByZW1vdmUgdGhlCisgICAgLy8gYm9vbGVhbiBmbGFncyAo YXBwZWFyIGV0Yy4pIGFuZCBqdXN0IGFjY2VwdCBhIG51bWJlcgorICAgIC8vIG9yIGEgYm9vbCBm b3IgdGhlIHRpbWVvdXQgZmxhZ3MgKGFwcGVhclRpbWVvdXQgZXRjLikKKyAgICBhcHBlYXI6IFJl YWN0LlByb3BUeXBlcy5ib29sLAorICAgIGVudGVyOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCwKKyAg ICBsZWF2ZTogUmVhY3QuUHJvcFR5cGVzLmJvb2wsCisgICAgYXBwZWFyVGltZW91dDogUmVhY3Qu UHJvcFR5cGVzLm51bWJlciwKKyAgICBlbnRlclRpbWVvdXQ6IFJlYWN0LlByb3BUeXBlcy5udW1i ZXIsCisgICAgbGVhdmVUaW1lb3V0OiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyCisgIH0sCisKKyAg dHJhbnNpdGlvbjogZnVuY3Rpb24gKGFuaW1hdGlvblR5cGUsIGZpbmlzaENhbGxiYWNrLCB1c2Vy U3BlY2lmaWVkRGVsYXkpIHsKKyAgICB2YXIgbm9kZSA9IFJlYWN0QWRkb25zRE9NRGVwZW5kZW5j aWVzLmdldFJlYWN0RE9NKCkuZmluZERPTU5vZGUodGhpcyk7CisKKyAgICBpZiAoIW5vZGUpIHsK KyAgICAgIGlmIChmaW5pc2hDYWxsYmFjaykgeworICAgICAgICBmaW5pc2hDYWxsYmFjaygpOwor ICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBjbGFzc05hbWUgPSB0aGlz LnByb3BzLm5hbWVbYW5pbWF0aW9uVHlwZV0gfHwgdGhpcy5wcm9wcy5uYW1lICsgJy0nICsgYW5p bWF0aW9uVHlwZTsKKyAgICB2YXIgYWN0aXZlQ2xhc3NOYW1lID0gdGhpcy5wcm9wcy5uYW1lW2Fu aW1hdGlvblR5cGUgKyAnQWN0aXZlJ10gfHwgY2xhc3NOYW1lICsgJy1hY3RpdmUnOworICAgIHZh ciB0aW1lb3V0ID0gbnVsbDsKKworICAgIHZhciBlbmRMaXN0ZW5lciA9IGZ1bmN0aW9uIChlKSB7 CisgICAgICBpZiAoZSAmJiBlLnRhcmdldCAhPT0gbm9kZSkgeworICAgICAgICByZXR1cm47Cisg ICAgICB9CisKKyAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTsKKworICAgICAgQ1NTQ29yZS5y ZW1vdmVDbGFzcyhub2RlLCBjbGFzc05hbWUpOworICAgICAgQ1NTQ29yZS5yZW1vdmVDbGFzcyhu b2RlLCBhY3RpdmVDbGFzc05hbWUpOworCisgICAgICBSZWFjdFRyYW5zaXRpb25FdmVudHMucmVt b3ZlRW5kRXZlbnRMaXN0ZW5lcihub2RlLCBlbmRMaXN0ZW5lcik7CisKKyAgICAgIC8vIFVzdWFs bHkgdGhpcyBvcHRpb25hbCBjYWxsYmFjayBpcyB1c2VkIGZvciBpbmZvcm1pbmcgYW4gb3duZXIg b2YKKyAgICAgIC8vIGEgbGVhdmUgYW5pbWF0aW9uIGFuZCB0ZWxsaW5nIGl0IHRvIHJlbW92ZSB0 aGUgY2hpbGQuCisgICAgICBpZiAoZmluaXNoQ2FsbGJhY2spIHsKKyAgICAgICAgZmluaXNoQ2Fs bGJhY2soKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgQ1NTQ29yZS5hZGRDbGFzcyhub2RlLCBj bGFzc05hbWUpOworCisgICAgLy8gTmVlZCB0byBkbyB0aGlzIHRvIGFjdHVhbGx5IHRyaWdnZXIg YSB0cmFuc2l0aW9uLgorICAgIHRoaXMucXVldWVDbGFzc0FuZE5vZGUoYWN0aXZlQ2xhc3NOYW1l LCBub2RlKTsKKworICAgIC8vIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhIHRpbWVvdXQgZGVsYXku CisgICAgaWYgKHVzZXJTcGVjaWZpZWREZWxheSkgeworICAgICAgLy8gQ2xlYW4tdXAgdGhlIGFu aW1hdGlvbiBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5CisgICAgICB0aW1lb3V0ID0gc2V0VGlt ZW91dChlbmRMaXN0ZW5lciwgdXNlclNwZWNpZmllZERlbGF5KTsKKyAgICAgIHRoaXMudHJhbnNp dGlvblRpbWVvdXRzLnB1c2godGltZW91dCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIERFUFJF Q0FURUQ6IHRoaXMgbGlzdGVuZXIgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24g b2YgcmVhY3QKKyAgICAgIFJlYWN0VHJhbnNpdGlvbkV2ZW50cy5hZGRFbmRFdmVudExpc3RlbmVy KG5vZGUsIGVuZExpc3RlbmVyKTsKKyAgICB9CisgIH0sCisKKyAgcXVldWVDbGFzc0FuZE5vZGU6 IGZ1bmN0aW9uIChjbGFzc05hbWUsIG5vZGUpIHsKKyAgICB0aGlzLmNsYXNzTmFtZUFuZE5vZGVR dWV1ZS5wdXNoKHsKKyAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLAorICAgICAgbm9kZTogbm9k ZQorICAgIH0pOworCisgICAgaWYgKCF0aGlzLnRpbWVvdXQpIHsKKyAgICAgIHRoaXMudGltZW91 dCA9IHNldFRpbWVvdXQodGhpcy5mbHVzaENsYXNzTmFtZUFuZE5vZGVRdWV1ZSwgVElDSyk7Cisg ICAgfQorICB9LAorCisgIGZsdXNoQ2xhc3NOYW1lQW5kTm9kZVF1ZXVlOiBmdW5jdGlvbiAoKSB7 CisgICAgaWYgKHRoaXMuaXNNb3VudGVkKCkpIHsKKyAgICAgIHRoaXMuY2xhc3NOYW1lQW5kTm9k ZVF1ZXVlLmZvckVhY2goZnVuY3Rpb24gKG9iaikgeworICAgICAgICBDU1NDb3JlLmFkZENsYXNz KG9iai5ub2RlLCBvYmouY2xhc3NOYW1lKTsKKyAgICAgIH0pOworICAgIH0KKyAgICB0aGlzLmNs YXNzTmFtZUFuZE5vZGVRdWV1ZS5sZW5ndGggPSAwOworICAgIHRoaXMudGltZW91dCA9IG51bGw7 CisgIH0sCisKKyAgY29tcG9uZW50V2lsbE1vdW50OiBmdW5jdGlvbiAoKSB7CisgICAgdGhpcy5j bGFzc05hbWVBbmROb2RlUXVldWUgPSBbXTsKKyAgICB0aGlzLnRyYW5zaXRpb25UaW1lb3V0cyA9 IFtdOworICB9LAorCisgIGNvbXBvbmVudFdpbGxVbm1vdW50OiBmdW5jdGlvbiAoKSB7CisgICAg aWYgKHRoaXMudGltZW91dCkgeworICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7Cisg ICAgfQorICAgIHRoaXMudHJhbnNpdGlvblRpbWVvdXRzLmZvckVhY2goZnVuY3Rpb24gKHRpbWVv dXQpIHsKKyAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTsKKyAgICB9KTsKKworICAgIHRoaXMu Y2xhc3NOYW1lQW5kTm9kZVF1ZXVlLmxlbmd0aCA9IDA7CisgIH0sCisKKyAgY29tcG9uZW50V2ls bEFwcGVhcjogZnVuY3Rpb24gKGRvbmUpIHsKKyAgICBpZiAodGhpcy5wcm9wcy5hcHBlYXIpIHsK KyAgICAgIHRoaXMudHJhbnNpdGlvbignYXBwZWFyJywgZG9uZSwgdGhpcy5wcm9wcy5hcHBlYXJU aW1lb3V0KTsKKyAgICB9IGVsc2UgeworICAgICAgZG9uZSgpOworICAgIH0KKyAgfSwKKworICBj b21wb25lbnRXaWxsRW50ZXI6IGZ1bmN0aW9uIChkb25lKSB7CisgICAgaWYgKHRoaXMucHJvcHMu ZW50ZXIpIHsKKyAgICAgIHRoaXMudHJhbnNpdGlvbignZW50ZXInLCBkb25lLCB0aGlzLnByb3Bz LmVudGVyVGltZW91dCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRvbmUoKTsKKyAgICB9CisgIH0s CisKKyAgY29tcG9uZW50V2lsbExlYXZlOiBmdW5jdGlvbiAoZG9uZSkgeworICAgIGlmICh0aGlz LnByb3BzLmxlYXZlKSB7CisgICAgICB0aGlzLnRyYW5zaXRpb24oJ2xlYXZlJywgZG9uZSwgdGhp cy5wcm9wcy5sZWF2ZVRpbWVvdXQpOworICAgIH0gZWxzZSB7CisgICAgICBkb25lKCk7CisgICAg fQorICB9LAorCisgIHJlbmRlcjogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBvbmx5Q2hpbGQo dGhpcy5wcm9wcy5jaGlsZHJlbik7CisgIH0KK30pOworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0 Q1NTVHJhbnNpdGlvbkdyb3VwQ2hpbGQ7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZm IC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvUmVhY3RDaGlsZHJl bi5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL1JlYWN0Q2hpbGRyZW4u anMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjRhMmNhYjcwCi0tLSAvZGV2 L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvUmVhY3RDaGls ZHJlbi5qcwpAQCAtMCwwICsxLDE5MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50 LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNv dXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBp biB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3Vy Y2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUg Zm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICov CisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFBvb2xlZENsYXNzID0gcmVxdWlyZSgnLi9Qb29sZWRD bGFzcycpOwordmFyIFJlYWN0RWxlbWVudCA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50Jyk7CisK K3ZhciBlbXB0eUZ1bmN0aW9uID0gcmVxdWlyZSgnZmJqcy9saWIvZW1wdHlGdW5jdGlvbicpOwor dmFyIHRyYXZlcnNlQWxsQ2hpbGRyZW4gPSByZXF1aXJlKCcuL3RyYXZlcnNlQWxsQ2hpbGRyZW4n KTsKKwordmFyIHR3b0FyZ3VtZW50UG9vbGVyID0gUG9vbGVkQ2xhc3MudHdvQXJndW1lbnRQb29s ZXI7Cit2YXIgZm91ckFyZ3VtZW50UG9vbGVyID0gUG9vbGVkQ2xhc3MuZm91ckFyZ3VtZW50UG9v bGVyOworCit2YXIgdXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXggPSAvXC8rL2c7CitmdW5jdGlv biBlc2NhcGVVc2VyUHJvdmlkZWRLZXkodGV4dCkgeworICByZXR1cm4gKCcnICsgdGV4dCkucmVw bGFjZSh1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCwgJyQmLycpOworfQorCisvKioKKyAqIFBv b2xlZENsYXNzIHJlcHJlc2VudGluZyB0aGUgYm9va2tlZXBpbmcgYXNzb2NpYXRlZCB3aXRoIHBl cmZvcm1pbmcgYSBjaGlsZAorICogdHJhdmVyc2FsLiBBbGxvd3MgYXZvaWRpbmcgYmluZGluZyBj YWxsYmFja3MuCisgKgorICogQGNvbnN0cnVjdG9yIEZvckVhY2hCb29rS2VlcGluZworICogQHBh cmFtIHshZnVuY3Rpb259IGZvckVhY2hGdW5jdGlvbiBGdW5jdGlvbiB0byBwZXJmb3JtIHRyYXZl cnNhbCB3aXRoLgorICogQHBhcmFtIHs/Kn0gZm9yRWFjaENvbnRleHQgQ29udGV4dCB0byBwZXJm b3JtIGNvbnRleHQgd2l0aC4KKyAqLworZnVuY3Rpb24gRm9yRWFjaEJvb2tLZWVwaW5nKGZvckVh Y2hGdW5jdGlvbiwgZm9yRWFjaENvbnRleHQpIHsKKyAgdGhpcy5mdW5jID0gZm9yRWFjaEZ1bmN0 aW9uOworICB0aGlzLmNvbnRleHQgPSBmb3JFYWNoQ29udGV4dDsKKyAgdGhpcy5jb3VudCA9IDA7 Cit9CitGb3JFYWNoQm9va0tlZXBpbmcucHJvdG90eXBlLmRlc3RydWN0b3IgPSBmdW5jdGlvbiAo KSB7CisgIHRoaXMuZnVuYyA9IG51bGw7CisgIHRoaXMuY29udGV4dCA9IG51bGw7CisgIHRoaXMu Y291bnQgPSAwOworfTsKK1Bvb2xlZENsYXNzLmFkZFBvb2xpbmdUbyhGb3JFYWNoQm9va0tlZXBp bmcsIHR3b0FyZ3VtZW50UG9vbGVyKTsKKworZnVuY3Rpb24gZm9yRWFjaFNpbmdsZUNoaWxkKGJv b2tLZWVwaW5nLCBjaGlsZCwgbmFtZSkgeworICB2YXIgZnVuYyA9IGJvb2tLZWVwaW5nLmZ1bmMs CisgICAgICBjb250ZXh0ID0gYm9va0tlZXBpbmcuY29udGV4dDsKKworICBmdW5jLmNhbGwoY29u dGV4dCwgY2hpbGQsIGJvb2tLZWVwaW5nLmNvdW50KyspOworfQorCisvKioKKyAqIEl0ZXJhdGVz IHRocm91Z2ggY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMu Y2hpbGRyZW5gLgorICoKKyAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9k b2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jaGlsZHJlbi5mb3JlYWNoCisgKgorICogVGhl IHByb3ZpZGVkIGZvckVhY2hGdW5jKGNoaWxkLCBpbmRleCkgd2lsbCBiZSBjYWxsZWQgZm9yIGVh Y2gKKyAqIGxlYWYgY2hpbGQuCisgKgorICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4g dHJlZSBjb250YWluZXIuCisgKiBAcGFyYW0ge2Z1bmN0aW9uKCosIGludCl9IGZvckVhY2hGdW5j CisgKiBAcGFyYW0geyp9IGZvckVhY2hDb250ZXh0IENvbnRleHQgZm9yIGZvckVhY2hDb250ZXh0 LgorICovCitmdW5jdGlvbiBmb3JFYWNoQ2hpbGRyZW4oY2hpbGRyZW4sIGZvckVhY2hGdW5jLCBm b3JFYWNoQ29udGV4dCkgeworICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgeworICAgIHJldHVybiBj aGlsZHJlbjsKKyAgfQorICB2YXIgdHJhdmVyc2VDb250ZXh0ID0gRm9yRWFjaEJvb2tLZWVwaW5n LmdldFBvb2xlZChmb3JFYWNoRnVuYywgZm9yRWFjaENvbnRleHQpOworICB0cmF2ZXJzZUFsbENo aWxkcmVuKGNoaWxkcmVuLCBmb3JFYWNoU2luZ2xlQ2hpbGQsIHRyYXZlcnNlQ29udGV4dCk7Cisg IEZvckVhY2hCb29rS2VlcGluZy5yZWxlYXNlKHRyYXZlcnNlQ29udGV4dCk7Cit9CisKKy8qKgor ICogUG9vbGVkQ2xhc3MgcmVwcmVzZW50aW5nIHRoZSBib29ra2VlcGluZyBhc3NvY2lhdGVkIHdp dGggcGVyZm9ybWluZyBhIGNoaWxkCisgKiBtYXBwaW5nLiBBbGxvd3MgYXZvaWRpbmcgYmluZGlu ZyBjYWxsYmFja3MuCisgKgorICogQGNvbnN0cnVjdG9yIE1hcEJvb2tLZWVwaW5nCisgKiBAcGFy YW0geyEqfSBtYXBSZXN1bHQgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9yZGVyZWQgbWFwIG9mIHJl c3VsdHMuCisgKiBAcGFyYW0geyFmdW5jdGlvbn0gbWFwRnVuY3Rpb24gRnVuY3Rpb24gdG8gcGVy Zm9ybSBtYXBwaW5nIHdpdGguCisgKiBAcGFyYW0gez8qfSBtYXBDb250ZXh0IENvbnRleHQgdG8g cGVyZm9ybSBtYXBwaW5nIHdpdGguCisgKi8KK2Z1bmN0aW9uIE1hcEJvb2tLZWVwaW5nKG1hcFJl c3VsdCwga2V5UHJlZml4LCBtYXBGdW5jdGlvbiwgbWFwQ29udGV4dCkgeworICB0aGlzLnJlc3Vs dCA9IG1hcFJlc3VsdDsKKyAgdGhpcy5rZXlQcmVmaXggPSBrZXlQcmVmaXg7CisgIHRoaXMuZnVu YyA9IG1hcEZ1bmN0aW9uOworICB0aGlzLmNvbnRleHQgPSBtYXBDb250ZXh0OworICB0aGlzLmNv dW50ID0gMDsKK30KK01hcEJvb2tLZWVwaW5nLnByb3RvdHlwZS5kZXN0cnVjdG9yID0gZnVuY3Rp b24gKCkgeworICB0aGlzLnJlc3VsdCA9IG51bGw7CisgIHRoaXMua2V5UHJlZml4ID0gbnVsbDsK KyAgdGhpcy5mdW5jID0gbnVsbDsKKyAgdGhpcy5jb250ZXh0ID0gbnVsbDsKKyAgdGhpcy5jb3Vu dCA9IDA7Cit9OworUG9vbGVkQ2xhc3MuYWRkUG9vbGluZ1RvKE1hcEJvb2tLZWVwaW5nLCBmb3Vy QXJndW1lbnRQb29sZXIpOworCitmdW5jdGlvbiBtYXBTaW5nbGVDaGlsZEludG9Db250ZXh0KGJv b2tLZWVwaW5nLCBjaGlsZCwgY2hpbGRLZXkpIHsKKyAgdmFyIHJlc3VsdCA9IGJvb2tLZWVwaW5n LnJlc3VsdCwKKyAgICAgIGtleVByZWZpeCA9IGJvb2tLZWVwaW5nLmtleVByZWZpeCwKKyAgICAg IGZ1bmMgPSBib29rS2VlcGluZy5mdW5jLAorICAgICAgY29udGV4dCA9IGJvb2tLZWVwaW5nLmNv bnRleHQ7CisKKworICB2YXIgbWFwcGVkQ2hpbGQgPSBmdW5jLmNhbGwoY29udGV4dCwgY2hpbGQs IGJvb2tLZWVwaW5nLmNvdW50KyspOworICBpZiAoQXJyYXkuaXNBcnJheShtYXBwZWRDaGlsZCkp IHsKKyAgICBtYXBJbnRvV2l0aEtleVByZWZpeEludGVybmFsKG1hcHBlZENoaWxkLCByZXN1bHQs IGNoaWxkS2V5LCBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zQXJndW1lbnQpOworICB9IGVsc2Ug aWYgKG1hcHBlZENoaWxkICE9IG51bGwpIHsKKyAgICBpZiAoUmVhY3RFbGVtZW50LmlzVmFsaWRF bGVtZW50KG1hcHBlZENoaWxkKSkgeworICAgICAgbWFwcGVkQ2hpbGQgPSBSZWFjdEVsZW1lbnQu Y2xvbmVBbmRSZXBsYWNlS2V5KG1hcHBlZENoaWxkLAorICAgICAgLy8gS2VlcCBib3RoIHRoZSAo bWFwcGVkKSBhbmQgb2xkIGtleXMgaWYgdGhleSBkaWZmZXIsIGp1c3QgYXMKKyAgICAgIC8vIHRy YXZlcnNlQWxsQ2hpbGRyZW4gdXNlZCB0byBkbyBmb3Igb2JqZWN0cyBhcyBjaGlsZHJlbgorICAg ICAga2V5UHJlZml4ICsgKG1hcHBlZENoaWxkLmtleSAmJiAoIWNoaWxkIHx8IGNoaWxkLmtleSAh PT0gbWFwcGVkQ2hpbGQua2V5KSA/IGVzY2FwZVVzZXJQcm92aWRlZEtleShtYXBwZWRDaGlsZC5r ZXkpICsgJy8nIDogJycpICsgY2hpbGRLZXkpOworICAgIH0KKyAgICByZXN1bHQucHVzaChtYXBw ZWRDaGlsZCk7CisgIH0KK30KKworZnVuY3Rpb24gbWFwSW50b1dpdGhLZXlQcmVmaXhJbnRlcm5h bChjaGlsZHJlbiwgYXJyYXksIHByZWZpeCwgZnVuYywgY29udGV4dCkgeworICB2YXIgZXNjYXBl ZFByZWZpeCA9ICcnOworICBpZiAocHJlZml4ICE9IG51bGwpIHsKKyAgICBlc2NhcGVkUHJlZml4 ID0gZXNjYXBlVXNlclByb3ZpZGVkS2V5KHByZWZpeCkgKyAnLyc7CisgIH0KKyAgdmFyIHRyYXZl cnNlQ29udGV4dCA9IE1hcEJvb2tLZWVwaW5nLmdldFBvb2xlZChhcnJheSwgZXNjYXBlZFByZWZp eCwgZnVuYywgY29udGV4dCk7CisgIHRyYXZlcnNlQWxsQ2hpbGRyZW4oY2hpbGRyZW4sIG1hcFNp bmdsZUNoaWxkSW50b0NvbnRleHQsIHRyYXZlcnNlQ29udGV4dCk7CisgIE1hcEJvb2tLZWVwaW5n LnJlbGVhc2UodHJhdmVyc2VDb250ZXh0KTsKK30KKworLyoqCisgKiBNYXBzIGNoaWxkcmVuIHRo YXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYC4KKyAqCisgKiBT ZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0 bWwjcmVhY3QuY2hpbGRyZW4ubWFwCisgKgorICogVGhlIHByb3ZpZGVkIG1hcEZ1bmN0aW9uKGNo aWxkLCBrZXksIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaAorICogbGVhZiBjaGlsZC4K KyAqCisgKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci4KKyAq IEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZnVuYyBUaGUgbWFwIGZ1bmN0aW9uLgorICogQHBh cmFtIHsqfSBjb250ZXh0IENvbnRleHQgZm9yIG1hcEZ1bmN0aW9uLgorICogQHJldHVybiB7b2Jq ZWN0fSBPYmplY3QgY29udGFpbmluZyB0aGUgb3JkZXJlZCBtYXAgb2YgcmVzdWx0cy4KKyAqLwor ZnVuY3Rpb24gbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmMsIGNvbnRleHQpIHsKKyAgaWYgKGNo aWxkcmVuID09IG51bGwpIHsKKyAgICByZXR1cm4gY2hpbGRyZW47CisgIH0KKyAgdmFyIHJlc3Vs dCA9IFtdOworICBtYXBJbnRvV2l0aEtleVByZWZpeEludGVybmFsKGNoaWxkcmVuLCByZXN1bHQs IG51bGwsIGZ1bmMsIGNvbnRleHQpOworICByZXR1cm4gcmVzdWx0OworfQorCitmdW5jdGlvbiBm b3JFYWNoU2luZ2xlQ2hpbGREdW1teSh0cmF2ZXJzZUNvbnRleHQsIGNoaWxkLCBuYW1lKSB7Cisg IHJldHVybiBudWxsOworfQorCisvKioKKyAqIENvdW50IHRoZSBudW1iZXIgb2YgY2hpbGRyZW4g dGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcworICogYHByb3BzLmNoaWxkcmVuYC4KKyAq CisgKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwt YXBpLmh0bWwjcmVhY3QuY2hpbGRyZW4uY291bnQKKyAqCisgKiBAcGFyYW0gez8qfSBjaGlsZHJl biBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci4KKyAqIEByZXR1cm4ge251bWJlcn0gVGhlIG51bWJl ciBvZiBjaGlsZHJlbi4KKyAqLworZnVuY3Rpb24gY291bnRDaGlsZHJlbihjaGlsZHJlbiwgY29u dGV4dCkgeworICByZXR1cm4gdHJhdmVyc2VBbGxDaGlsZHJlbihjaGlsZHJlbiwgZm9yRWFjaFNp bmdsZUNoaWxkRHVtbXksIG51bGwpOworfQorCisvKioKKyAqIEZsYXR0ZW4gYSBjaGlsZHJlbiBv YmplY3QgKHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYCkgYW5kCisgKiBy ZXR1cm4gYW4gYXJyYXkgd2l0aCBhcHByb3ByaWF0ZWx5IHJlLWtleWVkIGNoaWxkcmVuLgorICoK KyAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1h cGkuaHRtbCNyZWFjdC5jaGlsZHJlbi50b2FycmF5CisgKi8KK2Z1bmN0aW9uIHRvQXJyYXkoY2hp bGRyZW4pIHsKKyAgdmFyIHJlc3VsdCA9IFtdOworICBtYXBJbnRvV2l0aEtleVByZWZpeEludGVy bmFsKGNoaWxkcmVuLCByZXN1bHQsIG51bGwsIGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNBcmd1 bWVudCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZhciBSZWFjdENoaWxkcmVuID0geworICBm b3JFYWNoOiBmb3JFYWNoQ2hpbGRyZW4sCisgIG1hcDogbWFwQ2hpbGRyZW4sCisgIG1hcEludG9X aXRoS2V5UHJlZml4SW50ZXJuYWw6IG1hcEludG9XaXRoS2V5UHJlZml4SW50ZXJuYWwsCisgIGNv dW50OiBjb3VudENoaWxkcmVuLAorICB0b0FycmF5OiB0b0FycmF5Cit9OworCittb2R1bGUuZXhw b3J0cyA9IFJlYWN0Q2hpbGRyZW47ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0t Z2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvUmVhY3RDbGFzcy5qcyBi L3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL1JlYWN0Q2xhc3MuanMKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLmM0ZmM0MTYzCi0tLSAvZGV2L251bGwKKysr IGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvUmVhY3RDbGFzcy5qcwpAQCAt MCwwICsxLDcxNiBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywg SW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlz IGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJ Q0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4g YWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhl IFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3Ry aWN0JzsKKwordmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlh bnQnKSwKKyAgICBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpOworCit2YXIgUmVh Y3RDb21wb25lbnQgPSByZXF1aXJlKCcuL1JlYWN0Q29tcG9uZW50Jyk7Cit2YXIgUmVhY3RFbGVt ZW50ID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnQnKTsKK3ZhciBSZWFjdFByb3BUeXBlTG9jYXRp b25OYW1lcyA9IHJlcXVpcmUoJy4vUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMnKTsKK3ZhciBS ZWFjdE5vb3BVcGRhdGVRdWV1ZSA9IHJlcXVpcmUoJy4vUmVhY3ROb29wVXBkYXRlUXVldWUnKTsK KwordmFyIGVtcHR5T2JqZWN0ID0gcmVxdWlyZSgnZmJqcy9saWIvZW1wdHlPYmplY3QnKTsKK3Zh ciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTsKK3ZhciB3YXJuaW5n ID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpOworCit2YXIgTUlYSU5TX0tFWSA9ICdtaXhp bnMnOworCisvLyBIZWxwZXIgZnVuY3Rpb24gdG8gYWxsb3cgdGhlIGNyZWF0aW9uIG9mIGFub255 bW91cyBmdW5jdGlvbnMgd2hpY2ggZG8gbm90CisvLyBoYXZlIC5uYW1lIHNldCB0byB0aGUgbmFt ZSBvZiB0aGUgdmFyaWFibGUgYmVpbmcgYXNzaWduZWQgdG8uCitmdW5jdGlvbiBpZGVudGl0eShm bikgeworICByZXR1cm4gZm47Cit9CisKKy8qKgorICogUG9saWNpZXMgdGhhdCBkZXNjcmliZSBt ZXRob2RzIGluIGBSZWFjdENsYXNzSW50ZXJmYWNlYC4KKyAqLworCisKK3ZhciBpbmplY3RlZE1p eGlucyA9IFtdOworCisvKioKKyAqIENvbXBvc2l0ZSBjb21wb25lbnRzIGFyZSBoaWdoZXItbGV2 ZWwgY29tcG9uZW50cyB0aGF0IGNvbXBvc2Ugb3RoZXIgY29tcG9zaXRlCisgKiBvciBob3N0IGNv bXBvbmVudHMuCisgKgorICogVG8gY3JlYXRlIGEgbmV3IHR5cGUgb2YgYFJlYWN0Q2xhc3NgLCBw YXNzIGEgc3BlY2lmaWNhdGlvbiBvZgorICogeW91ciBuZXcgY2xhc3MgdG8gYFJlYWN0LmNyZWF0 ZUNsYXNzYC4gVGhlIG9ubHkgcmVxdWlyZW1lbnQgb2YgeW91ciBjbGFzcworICogc3BlY2lmaWNh dGlvbiBpcyB0aGF0IHlvdSBpbXBsZW1lbnQgYSBgcmVuZGVyYCBtZXRob2QuCisgKgorICogICB2 YXIgTXlDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVDbGFzcyh7CisgKiAgICAgcmVuZGVyOiBmdW5j dGlvbigpIHsKKyAqICAgICAgIHJldHVybiA8ZGl2PkhlbGxvIFdvcmxkPC9kaXY+OworICogICAg IH0KKyAqICAgfSk7CisgKgorICogVGhlIGNsYXNzIHNwZWNpZmljYXRpb24gc3VwcG9ydHMgYSBz cGVjaWZpYyBwcm90b2NvbCBvZiBtZXRob2RzIHRoYXQgaGF2ZQorICogc3BlY2lhbCBtZWFuaW5n IChlLmcuIGByZW5kZXJgKS4gU2VlIGBSZWFjdENsYXNzSW50ZXJmYWNlYCBmb3IKKyAqIG1vcmUg dGhlIGNvbXByZWhlbnNpdmUgcHJvdG9jb2wuIEFueSBvdGhlciBwcm9wZXJ0aWVzIGFuZCBtZXRo b2RzIGluIHRoZQorICogY2xhc3Mgc3BlY2lmaWNhdGlvbiB3aWxsIGJlIGF2YWlsYWJsZSBvbiB0 aGUgcHJvdG90eXBlLgorICoKKyAqIEBpbnRlcmZhY2UgUmVhY3RDbGFzc0ludGVyZmFjZQorICog QGludGVybmFsCisgKi8KK3ZhciBSZWFjdENsYXNzSW50ZXJmYWNlID0geworCisgIC8qKgorICAg KiBBbiBhcnJheSBvZiBNaXhpbiBvYmplY3RzIHRvIGluY2x1ZGUgd2hlbiBkZWZpbmluZyB5b3Vy IGNvbXBvbmVudC4KKyAgICoKKyAgICogQHR5cGUge2FycmF5fQorICAgKiBAb3B0aW9uYWwKKyAg ICovCisgIG1peGluczogJ0RFRklORV9NQU5ZJywKKworICAvKioKKyAgICogQW4gb2JqZWN0IGNv bnRhaW5pbmcgcHJvcGVydGllcyBhbmQgbWV0aG9kcyB0aGF0IHNob3VsZCBiZSBkZWZpbmVkIG9u CisgICAqIHRoZSBjb21wb25lbnQncyBjb25zdHJ1Y3RvciBpbnN0ZWFkIG9mIGl0cyBwcm90b3R5 cGUgKHN0YXRpYyBtZXRob2RzKS4KKyAgICoKKyAgICogQHR5cGUge29iamVjdH0KKyAgICogQG9w dGlvbmFsCisgICAqLworICBzdGF0aWNzOiAnREVGSU5FX01BTlknLAorCisgIC8qKgorICAgKiBE ZWZpbml0aW9uIG9mIHByb3AgdHlwZXMgZm9yIHRoaXMgY29tcG9uZW50LgorICAgKgorICAgKiBA dHlwZSB7b2JqZWN0fQorICAgKiBAb3B0aW9uYWwKKyAgICovCisgIHByb3BUeXBlczogJ0RFRklO RV9NQU5ZJywKKworICAvKioKKyAgICogRGVmaW5pdGlvbiBvZiBjb250ZXh0IHR5cGVzIGZvciB0 aGlzIGNvbXBvbmVudC4KKyAgICoKKyAgICogQHR5cGUge29iamVjdH0KKyAgICogQG9wdGlvbmFs CisgICAqLworICBjb250ZXh0VHlwZXM6ICdERUZJTkVfTUFOWScsCisKKyAgLyoqCisgICAqIERl ZmluaXRpb24gb2YgY29udGV4dCB0eXBlcyB0aGlzIGNvbXBvbmVudCBzZXRzIGZvciBpdHMgY2hp bGRyZW4uCisgICAqCisgICAqIEB0eXBlIHtvYmplY3R9CisgICAqIEBvcHRpb25hbAorICAgKi8K KyAgY2hpbGRDb250ZXh0VHlwZXM6ICdERUZJTkVfTUFOWScsCisKKyAgLy8gPT09PSBEZWZpbml0 aW9uIG1ldGhvZHMgPT09PQorCisgIC8qKgorICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVu dCBpcyBtb3VudGVkLiBWYWx1ZXMgaW4gdGhlIG1hcHBpbmcgd2lsbCBiZSBzZXQgb24KKyAgICog YHRoaXMucHJvcHNgIGlmIHRoYXQgcHJvcCBpcyBub3Qgc3BlY2lmaWVkIChpLmUuIHVzaW5nIGFu IGBpbmAgY2hlY2spLgorICAgKgorICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJlZm9yZSBg Z2V0SW5pdGlhbFN0YXRlYCBhbmQgdGhlcmVmb3JlIGNhbm5vdCByZWx5CisgICAqIG9uIGB0aGlz LnN0YXRlYCBvciB1c2UgYHRoaXMuc2V0U3RhdGVgLgorICAgKgorICAgKiBAcmV0dXJuIHtvYmpl Y3R9CisgICAqIEBvcHRpb25hbAorICAgKi8KKyAgZ2V0RGVmYXVsdFByb3BzOiAnREVGSU5FX01B TllfTUVSR0VEJywKKworICAvKioKKyAgICogSW52b2tlZCBvbmNlIGJlZm9yZSB0aGUgY29tcG9u ZW50IGlzIG1vdW50ZWQuIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSB1c2VkCisgICAqIGFzIHRo ZSBpbml0aWFsIHZhbHVlIG9mIGB0aGlzLnN0YXRlYC4KKyAgICoKKyAgICogICBnZXRJbml0aWFs U3RhdGU6IGZ1bmN0aW9uKCkgeworICAgKiAgICAgcmV0dXJuIHsKKyAgICogICAgICAgaXNPbjog ZmFsc2UsCisgICAqICAgICAgIGZvb0JhejogbmV3IEJhekZvbygpCisgICAqICAgICB9CisgICAq ICAgfQorICAgKgorICAgKiBAcmV0dXJuIHtvYmplY3R9CisgICAqIEBvcHRpb25hbAorICAgKi8K KyAgZ2V0SW5pdGlhbFN0YXRlOiAnREVGSU5FX01BTllfTUVSR0VEJywKKworICAvKioKKyAgICog QHJldHVybiB7b2JqZWN0fQorICAgKiBAb3B0aW9uYWwKKyAgICovCisgIGdldENoaWxkQ29udGV4 dDogJ0RFRklORV9NQU5ZX01FUkdFRCcsCisKKyAgLyoqCisgICAqIFVzZXMgcHJvcHMgZnJvbSBg dGhpcy5wcm9wc2AgYW5kIHN0YXRlIGZyb20gYHRoaXMuc3RhdGVgIHRvIHJlbmRlciB0aGUKKyAg ICogc3RydWN0dXJlIG9mIHRoZSBjb21wb25lbnQuCisgICAqCisgICAqIE5vIGd1YXJhbnRlZXMg YXJlIG1hZGUgYWJvdXQgd2hlbiBvciBob3cgb2Z0ZW4gdGhpcyBtZXRob2QgaXMgaW52b2tlZCwg c28KKyAgICogaXQgbXVzdCBub3QgaGF2ZSBzaWRlIGVmZmVjdHMuCisgICAqCisgICAqICAgcmVu ZGVyOiBmdW5jdGlvbigpIHsKKyAgICogICAgIHZhciBuYW1lID0gdGhpcy5wcm9wcy5uYW1lOwor ICAgKiAgICAgcmV0dXJuIDxkaXY+SGVsbG8sIHtuYW1lfSE8L2Rpdj47CisgICAqICAgfQorICAg KgorICAgKiBAcmV0dXJuIHtSZWFjdENvbXBvbmVudH0KKyAgICogQG5vc2lkZWVmZmVjdHMKKyAg ICogQHJlcXVpcmVkCisgICAqLworICByZW5kZXI6ICdERUZJTkVfT05DRScsCisKKyAgLy8gPT09 PSBEZWxlZ2F0ZSBtZXRob2RzID09PT0KKworICAvKioKKyAgICogSW52b2tlZCB3aGVuIHRoZSBj b21wb25lbnQgaXMgaW5pdGlhbGx5IGNyZWF0ZWQgYW5kIGFib3V0IHRvIGJlIG1vdW50ZWQuCisg ICAqIFRoaXMgbWF5IGhhdmUgc2lkZSBlZmZlY3RzLCBidXQgYW55IGV4dGVybmFsIHN1YnNjcmlw dGlvbnMgb3IgZGF0YSBjcmVhdGVkCisgICAqIGJ5IHRoaXMgbWV0aG9kIG11c3QgYmUgY2xlYW5l ZCB1cCBpbiBgY29tcG9uZW50V2lsbFVubW91bnRgLgorICAgKgorICAgKiBAb3B0aW9uYWwKKyAg ICovCisgIGNvbXBvbmVudFdpbGxNb3VudDogJ0RFRklORV9NQU5ZJywKKworICAvKioKKyAgICog SW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gbW91bnRlZCBhbmQgaGFzIGEgRE9N IHJlcHJlc2VudGF0aW9uLgorICAgKiBIb3dldmVyLCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhh dCB0aGUgRE9NIG5vZGUgaXMgaW4gdGhlIGRvY3VtZW50LgorICAgKgorICAgKiBVc2UgdGhpcyBh cyBhbiBvcHBvcnR1bml0eSB0byBvcGVyYXRlIG9uIHRoZSBET00gd2hlbiB0aGUgY29tcG9uZW50 IGhhcworICAgKiBiZWVuIG1vdW50ZWQgKGluaXRpYWxpemVkIGFuZCByZW5kZXJlZCkgZm9yIHRo ZSBmaXJzdCB0aW1lLgorICAgKgorICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IHJvb3ROb2RlIERP TSBlbGVtZW50IHJlcHJlc2VudGluZyB0aGUgY29tcG9uZW50LgorICAgKiBAb3B0aW9uYWwKKyAg ICovCisgIGNvbXBvbmVudERpZE1vdW50OiAnREVGSU5FX01BTlknLAorCisgIC8qKgorICAgKiBJ bnZva2VkIGJlZm9yZSB0aGUgY29tcG9uZW50IHJlY2VpdmVzIG5ldyBwcm9wcy4KKyAgICoKKyAg ICogVXNlIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcmVhY3QgdG8gYSBwcm9wIHRyYW5zaXRp b24gYnkgdXBkYXRpbmcgdGhlCisgICAqIHN0YXRlIHVzaW5nIGB0aGlzLnNldFN0YXRlYC4gQ3Vy cmVudCBwcm9wcyBhcmUgYWNjZXNzZWQgdmlhIGB0aGlzLnByb3BzYC4KKyAgICoKKyAgICogICBj b21wb25lbnRXaWxsUmVjZWl2ZVByb3BzOiBmdW5jdGlvbihuZXh0UHJvcHMsIG5leHRDb250ZXh0 KSB7CisgICAqICAgICB0aGlzLnNldFN0YXRlKHsKKyAgICogICAgICAgbGlrZXNJbmNyZWFzaW5n OiBuZXh0UHJvcHMubGlrZUNvdW50ID4gdGhpcy5wcm9wcy5saWtlQ291bnQKKyAgICogICAgIH0p OworICAgKiAgIH0KKyAgICoKKyAgICogTk9URTogVGhlcmUgaXMgbm8gZXF1aXZhbGVudCBgY29t cG9uZW50V2lsbFJlY2VpdmVTdGF0ZWAuIEFuIGluY29taW5nIHByb3AKKyAgICogdHJhbnNpdGlv biBtYXkgY2F1c2UgYSBzdGF0ZSBjaGFuZ2UsIGJ1dCB0aGUgb3Bwb3NpdGUgaXMgbm90IHRydWUu IElmIHlvdQorICAgKiBuZWVkIGl0LCB5b3UgYXJlIHByb2JhYmx5IGxvb2tpbmcgZm9yIGBjb21w b25lbnRXaWxsVXBkYXRlYC4KKyAgICoKKyAgICogQHBhcmFtIHtvYmplY3R9IG5leHRQcm9wcwor ICAgKiBAb3B0aW9uYWwKKyAgICovCisgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM6ICdERUZJ TkVfTUFOWScsCisKKyAgLyoqCisgICAqIEludm9rZWQgd2hpbGUgZGVjaWRpbmcgaWYgdGhlIGNv bXBvbmVudCBzaG91bGQgYmUgdXBkYXRlZCBhcyBhIHJlc3VsdCBvZgorICAgKiByZWNlaXZpbmcg bmV3IHByb3BzLCBzdGF0ZSBhbmQvb3IgY29udGV4dC4KKyAgICoKKyAgICogVXNlIHRoaXMgYXMg YW4gb3Bwb3J0dW5pdHkgdG8gYHJldHVybiBmYWxzZWAgd2hlbiB5b3UncmUgY2VydGFpbiB0aGF0 IHRoZQorICAgKiB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgcHJvcHMvc3RhdGUvY29udGV4dCB3aWxs IG5vdCByZXF1aXJlIGEgY29tcG9uZW50CisgICAqIHVwZGF0ZS4KKyAgICoKKyAgICogICBzaG91 bGRDb21wb25lbnRVcGRhdGU6IGZ1bmN0aW9uKG5leHRQcm9wcywgbmV4dFN0YXRlLCBuZXh0Q29u dGV4dCkgeworICAgKiAgICAgcmV0dXJuICFlcXVhbChuZXh0UHJvcHMsIHRoaXMucHJvcHMpIHx8 CisgICAqICAgICAgICFlcXVhbChuZXh0U3RhdGUsIHRoaXMuc3RhdGUpIHx8CisgICAqICAgICAg ICFlcXVhbChuZXh0Q29udGV4dCwgdGhpcy5jb250ZXh0KTsKKyAgICogICB9CisgICAqCisgICAq IEBwYXJhbSB7b2JqZWN0fSBuZXh0UHJvcHMKKyAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0U3Rh dGUKKyAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0Q29udGV4dAorICAgKiBAcmV0dXJuIHtib29s ZWFufSBUcnVlIGlmIHRoZSBjb21wb25lbnQgc2hvdWxkIHVwZGF0ZS4KKyAgICogQG9wdGlvbmFs CisgICAqLworICBzaG91bGRDb21wb25lbnRVcGRhdGU6ICdERUZJTkVfT05DRScsCisKKyAgLyoq CisgICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIGFib3V0IHRvIHVwZGF0ZSBkdWUg dG8gYSB0cmFuc2l0aW9uIGZyb20KKyAgICogYHRoaXMucHJvcHNgLCBgdGhpcy5zdGF0ZWAgYW5k IGB0aGlzLmNvbnRleHRgIHRvIGBuZXh0UHJvcHNgLCBgbmV4dFN0YXRlYAorICAgKiBhbmQgYG5l eHRDb250ZXh0YC4KKyAgICoKKyAgICogVXNlIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcGVy Zm9ybSBwcmVwYXJhdGlvbiBiZWZvcmUgYW4gdXBkYXRlIG9jY3Vycy4KKyAgICoKKyAgICogTk9U RTogWW91ICoqY2Fubm90KiogdXNlIGB0aGlzLnNldFN0YXRlKClgIGluIHRoaXMgbWV0aG9kLgor ICAgKgorICAgKiBAcGFyYW0ge29iamVjdH0gbmV4dFByb3BzCisgICAqIEBwYXJhbSB7P29iamVj dH0gbmV4dFN0YXRlCisgICAqIEBwYXJhbSB7P29iamVjdH0gbmV4dENvbnRleHQKKyAgICogQHBh cmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvbgorICAgKiBAb3B0aW9u YWwKKyAgICovCisgIGNvbXBvbmVudFdpbGxVcGRhdGU6ICdERUZJTkVfTUFOWScsCisKKyAgLyoq CisgICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50J3MgRE9NIHJlcHJlc2VudGF0aW9uIGhh cyBiZWVuIHVwZGF0ZWQuCisgICAqCisgICAqIFVzZSB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRv IG9wZXJhdGUgb24gdGhlIERPTSB3aGVuIHRoZSBjb21wb25lbnQgaGFzCisgICAqIGJlZW4gdXBk YXRlZC4KKyAgICoKKyAgICogQHBhcmFtIHtvYmplY3R9IHByZXZQcm9wcworICAgKiBAcGFyYW0g ez9vYmplY3R9IHByZXZTdGF0ZQorICAgKiBAcGFyYW0gez9vYmplY3R9IHByZXZDb250ZXh0Cisg ICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gcm9vdE5vZGUgRE9NIGVsZW1lbnQgcmVwcmVzZW50aW5n IHRoZSBjb21wb25lbnQuCisgICAqIEBvcHRpb25hbAorICAgKi8KKyAgY29tcG9uZW50RGlkVXBk YXRlOiAnREVGSU5FX01BTlknLAorCisgIC8qKgorICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBv bmVudCBpcyBhYm91dCB0byBiZSByZW1vdmVkIGZyb20gaXRzIHBhcmVudCBhbmQgaGF2ZQorICAg KiBpdHMgRE9NIHJlcHJlc2VudGF0aW9uIGRlc3Ryb3llZC4KKyAgICoKKyAgICogVXNlIHRoaXMg YXMgYW4gb3Bwb3J0dW5pdHkgdG8gZGVhbGxvY2F0ZSBhbnkgZXh0ZXJuYWwgcmVzb3VyY2VzLgor ICAgKgorICAgKiBOT1RFOiBUaGVyZSBpcyBubyBgY29tcG9uZW50RGlkVW5tb3VudGAgc2luY2Ug eW91ciBjb21wb25lbnQgd2lsbCBoYXZlIGJlZW4KKyAgICogZGVzdHJveWVkIGJ5IHRoYXQgcG9p bnQuCisgICAqCisgICAqIEBvcHRpb25hbAorICAgKi8KKyAgY29tcG9uZW50V2lsbFVubW91bnQ6 ICdERUZJTkVfTUFOWScsCisKKyAgLy8gPT09PSBBZHZhbmNlZCBtZXRob2RzID09PT0KKworICAv KioKKyAgICogVXBkYXRlcyB0aGUgY29tcG9uZW50J3MgY3VycmVudGx5IG1vdW50ZWQgRE9NIHJl cHJlc2VudGF0aW9uLgorICAgKgorICAgKiBCeSBkZWZhdWx0LCB0aGlzIGltcGxlbWVudHMgUmVh Y3QncyByZW5kZXJpbmcgYW5kIHJlY29uY2lsaWF0aW9uIGFsZ29yaXRobS4KKyAgICogU29waGlz dGljYXRlZCBjbGllbnRzIG1heSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMuCisgICAqCisgICAqIEBw YXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24KKyAgICogQGludGVy bmFsCisgICAqIEBvdmVycmlkYWJsZQorICAgKi8KKyAgdXBkYXRlQ29tcG9uZW50OiAnT1ZFUlJJ REVfQkFTRScKKworfTsKKworLyoqCisgKiBNYXBwaW5nIGZyb20gY2xhc3Mgc3BlY2lmaWNhdGlv biBrZXlzIHRvIHNwZWNpYWwgcHJvY2Vzc2luZyBmdW5jdGlvbnMuCisgKgorICogQWx0aG91Z2gg dGhlc2UgYXJlIGRlY2xhcmVkIGxpa2UgaW5zdGFuY2UgcHJvcGVydGllcyBpbiB0aGUgc3BlY2lm aWNhdGlvbgorICogd2hlbiBkZWZpbmluZyBjbGFzc2VzIHVzaW5nIGBSZWFjdC5jcmVhdGVDbGFz c2AsIHRoZXkgYXJlIGFjdHVhbGx5IHN0YXRpYworICogYW5kIGFyZSBhY2Nlc3NpYmxlIG9uIHRo ZSBjb25zdHJ1Y3RvciBpbnN0ZWFkIG9mIHRoZSBwcm90b3R5cGUuIERlc3BpdGUKKyAqIGJlaW5n IHN0YXRpYywgdGhleSBtdXN0IGJlIGRlZmluZWQgb3V0c2lkZSBvZiB0aGUgInN0YXRpY3MiIGtl eSB1bmRlcgorICogd2hpY2ggYWxsIG90aGVyIHN0YXRpYyBtZXRob2RzIGFyZSBkZWZpbmVkLgor ICovCit2YXIgUkVTRVJWRURfU1BFQ19LRVlTID0geworICBkaXNwbGF5TmFtZTogZnVuY3Rpb24g KENvbnN0cnVjdG9yLCBkaXNwbGF5TmFtZSkgeworICAgIENvbnN0cnVjdG9yLmRpc3BsYXlOYW1l ID0gZGlzcGxheU5hbWU7CisgIH0sCisgIG1peGluczogZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBt aXhpbnMpIHsKKyAgICBpZiAobWl4aW5zKSB7CisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1p eGlucy5sZW5ndGg7IGkrKykgeworICAgICAgICBtaXhTcGVjSW50b0NvbXBvbmVudChDb25zdHJ1 Y3RvciwgbWl4aW5zW2ldKTsKKyAgICAgIH0KKyAgICB9CisgIH0sCisgIGNoaWxkQ29udGV4dFR5 cGVzOiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIGNoaWxkQ29udGV4dFR5cGVzKSB7CisgICAgaWYg KHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIHZhbGlkYXRl VHlwZURlZihDb25zdHJ1Y3RvciwgY2hpbGRDb250ZXh0VHlwZXMsICdjaGlsZENvbnRleHQnKTsK KyAgICB9CisgICAgQ29uc3RydWN0b3IuY2hpbGRDb250ZXh0VHlwZXMgPSBfYXNzaWduKHt9LCBD b25zdHJ1Y3Rvci5jaGlsZENvbnRleHRUeXBlcywgY2hpbGRDb250ZXh0VHlwZXMpOworICB9LAor ICBjb250ZXh0VHlwZXM6IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgY29udGV4dFR5cGVzKSB7Cisg ICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIHZh bGlkYXRlVHlwZURlZihDb25zdHJ1Y3RvciwgY29udGV4dFR5cGVzLCAnY29udGV4dCcpOworICAg IH0KKyAgICBDb25zdHJ1Y3Rvci5jb250ZXh0VHlwZXMgPSBfYXNzaWduKHt9LCBDb25zdHJ1Y3Rv ci5jb250ZXh0VHlwZXMsIGNvbnRleHRUeXBlcyk7CisgIH0sCisgIC8qKgorICAgKiBTcGVjaWFs IGNhc2UgZ2V0RGVmYXVsdFByb3BzIHdoaWNoIHNob3VsZCBtb3ZlIGludG8gc3RhdGljcyBidXQg cmVxdWlyZXMKKyAgICogYXV0b21hdGljIG1lcmdpbmcuCisgICAqLworICBnZXREZWZhdWx0UHJv cHM6IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgZ2V0RGVmYXVsdFByb3BzKSB7CisgICAgaWYgKENv bnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcykgeworICAgICAgQ29uc3RydWN0b3IuZ2V0RGVmYXVs dFByb3BzID0gY3JlYXRlTWVyZ2VkUmVzdWx0RnVuY3Rpb24oQ29uc3RydWN0b3IuZ2V0RGVmYXVs dFByb3BzLCBnZXREZWZhdWx0UHJvcHMpOworICAgIH0gZWxzZSB7CisgICAgICBDb25zdHJ1Y3Rv ci5nZXREZWZhdWx0UHJvcHMgPSBnZXREZWZhdWx0UHJvcHM7CisgICAgfQorICB9LAorICBwcm9w VHlwZXM6IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvcFR5cGVzKSB7CisgICAgaWYgKHByb2Nl c3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgIHZhbGlkYXRlVHlwZURl ZihDb25zdHJ1Y3RvciwgcHJvcFR5cGVzLCAncHJvcCcpOworICAgIH0KKyAgICBDb25zdHJ1Y3Rv ci5wcm9wVHlwZXMgPSBfYXNzaWduKHt9LCBDb25zdHJ1Y3Rvci5wcm9wVHlwZXMsIHByb3BUeXBl cyk7CisgIH0sCisgIHN0YXRpY3M6IGZ1bmN0aW9uIChDb25zdHJ1Y3Rvciwgc3RhdGljcykgewor ICAgIG1peFN0YXRpY1NwZWNJbnRvQ29tcG9uZW50KENvbnN0cnVjdG9yLCBzdGF0aWNzKTsKKyAg fSwKKyAgYXV0b2JpbmQ6IGZ1bmN0aW9uICgpIHt9IH07CisKK2Z1bmN0aW9uIHZhbGlkYXRlVHlw ZURlZihDb25zdHJ1Y3RvciwgdHlwZURlZiwgbG9jYXRpb24pIHsKKyAgZm9yICh2YXIgcHJvcE5h bWUgaW4gdHlwZURlZikgeworICAgIGlmICh0eXBlRGVmLmhhc093blByb3BlcnR5KHByb3BOYW1l KSkgeworICAgICAgLy8gdXNlIGEgd2FybmluZyBpbnN0ZWFkIG9mIGFuIGludmFyaWFudCBzbyBj b21wb25lbnRzCisgICAgICAvLyBkb24ndCBzaG93IHVwIGluIHByb2QgYnV0IG9ubHkgaW4gX19E RVZfXworICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5p bmcodHlwZW9mIHR5cGVEZWZbcHJvcE5hbWVdID09PSAnZnVuY3Rpb24nLCAnJXM6ICVzIHR5cGUg YCVzYCBpcyBpbnZhbGlkOyBpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSAnICsg J1JlYWN0LlByb3BUeXBlcy4nLCBDb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCAnUmVhY3RDbGFz cycsIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXSwgcHJvcE5hbWUpIDogdm9p ZCAwOworICAgIH0KKyAgfQorfQorCitmdW5jdGlvbiB2YWxpZGF0ZU1ldGhvZE92ZXJyaWRlKGlz QWxyZWFkeURlZmluZWQsIG5hbWUpIHsKKyAgdmFyIHNwZWNQb2xpY3kgPSBSZWFjdENsYXNzSW50 ZXJmYWNlLmhhc093blByb3BlcnR5KG5hbWUpID8gUmVhY3RDbGFzc0ludGVyZmFjZVtuYW1lXSA6 IG51bGw7CisKKyAgLy8gRGlzYWxsb3cgb3ZlcnJpZGluZyBvZiBiYXNlIGNsYXNzIG1ldGhvZHMg dW5sZXNzIGV4cGxpY2l0bHkgYWxsb3dlZC4KKyAgaWYgKFJlYWN0Q2xhc3NNaXhpbi5oYXNPd25Q cm9wZXJ0eShuYW1lKSkgeworICAgICEoc3BlY1BvbGljeSA9PT0gJ09WRVJSSURFX0JBU0UnKSA/ IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2Us ICdSZWFjdENsYXNzSW50ZXJmYWNlOiBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gb3ZlcnJpZGUgYCVz YCBmcm9tIHlvdXIgY2xhc3Mgc3BlY2lmaWNhdGlvbi4gRW5zdXJlIHRoYXQgeW91ciBtZXRob2Qg bmFtZXMgZG8gbm90IG92ZXJsYXAgd2l0aCBSZWFjdCBtZXRob2RzLicsIG5hbWUpIDogX3Byb2RJ bnZhcmlhbnQoJzczJywgbmFtZSkgOiB2b2lkIDA7CisgIH0KKworICAvLyBEaXNhbGxvdyBkZWZp bmluZyBtZXRob2RzIG1vcmUgdGhhbiBvbmNlIHVubGVzcyBleHBsaWNpdGx5IGFsbG93ZWQuCisg IGlmIChpc0FscmVhZHlEZWZpbmVkKSB7CisgICAgIShzcGVjUG9saWN5ID09PSAnREVGSU5FX01B TlknIHx8IHNwZWNQb2xpY3kgPT09ICdERUZJTkVfTUFOWV9NRVJHRUQnKSA/IHByb2Nlc3MuZW52 Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdENsYXNz SW50ZXJmYWNlOiBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gZGVmaW5lIGAlc2Agb24geW91ciBjb21w b25lbnQgbW9yZSB0aGFuIG9uY2UuIFRoaXMgY29uZmxpY3QgbWF5IGJlIGR1ZSB0byBhIG1peGlu LicsIG5hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzc0JywgbmFtZSkgOiB2b2lkIDA7CisgIH0KK30K KworLyoqCisgKiBNaXhpbiBoZWxwZXIgd2hpY2ggaGFuZGxlcyBwb2xpY3kgdmFsaWRhdGlvbiBh bmQgcmVzZXJ2ZWQKKyAqIHNwZWNpZmljYXRpb24ga2V5cyB3aGVuIGJ1aWxkaW5nIFJlYWN0IGNs YXNzZXMuCisgKi8KK2Z1bmN0aW9uIG1peFNwZWNJbnRvQ29tcG9uZW50KENvbnN0cnVjdG9yLCBz cGVjKSB7CisgIGlmICghc3BlYykgeworICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0g J3Byb2R1Y3Rpb24nKSB7CisgICAgICB2YXIgdHlwZW9mU3BlYyA9IHR5cGVvZiBzcGVjOworICAg ICAgdmFyIGlzTWl4aW5WYWxpZCA9IHR5cGVvZlNwZWMgPT09ICdvYmplY3QnICYmIHNwZWMgIT09 IG51bGw7CisKKyAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3 YXJuaW5nKGlzTWl4aW5WYWxpZCwgJyVzOiBZb3VcJ3JlIGF0dGVtcHRpbmcgdG8gaW5jbHVkZSBh IG1peGluIHRoYXQgaXMgZWl0aGVyIG51bGwgJyArICdvciBub3QgYW4gb2JqZWN0LiBDaGVjayB0 aGUgbWl4aW5zIGluY2x1ZGVkIGJ5IHRoZSBjb21wb25lbnQsICcgKyAnYXMgd2VsbCBhcyBhbnkg bWl4aW5zIHRoZXkgaW5jbHVkZSB0aGVtc2VsdmVzLiAnICsgJ0V4cGVjdGVkIG9iamVjdCBidXQg Z290ICVzLicsIENvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8ICdSZWFjdENsYXNzJywgc3BlYyA9 PT0gbnVsbCA/IG51bGwgOiB0eXBlb2ZTcGVjKSA6IHZvaWQgMDsKKyAgICB9CisKKyAgICByZXR1 cm47CisgIH0KKworICAhKHR5cGVvZiBzcGVjICE9PSAnZnVuY3Rpb24nKSA/IHByb2Nlc3MuZW52 Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdENsYXNz OiBZb3VcJ3JlIGF0dGVtcHRpbmcgdG8gdXNlIGEgY29tcG9uZW50IGNsYXNzIG9yIGZ1bmN0aW9u IGFzIGEgbWl4aW4uIEluc3RlYWQsIGp1c3QgdXNlIGEgcmVndWxhciBvYmplY3QuJykgOiBfcHJv ZEludmFyaWFudCgnNzUnKSA6IHZvaWQgMDsKKyAgISFSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1l bnQoc3BlYykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJp YW50KGZhbHNlLCAnUmVhY3RDbGFzczogWW91XCdyZSBhdHRlbXB0aW5nIHRvIHVzZSBhIGNvbXBv bmVudCBhcyBhIG1peGluLiBJbnN0ZWFkLCBqdXN0IHVzZSBhIHJlZ3VsYXIgb2JqZWN0LicpIDog X3Byb2RJbnZhcmlhbnQoJzc2JykgOiB2b2lkIDA7CisKKyAgdmFyIHByb3RvID0gQ29uc3RydWN0 b3IucHJvdG90eXBlOworICB2YXIgYXV0b0JpbmRQYWlycyA9IHByb3RvLl9fcmVhY3RBdXRvQmlu ZFBhaXJzOworCisgIC8vIEJ5IGhhbmRsaW5nIG1peGlucyBiZWZvcmUgYW55IG90aGVyIHByb3Bl cnRpZXMsIHdlIGVuc3VyZSB0aGUgc2FtZQorICAvLyBjaGFpbmluZyBvcmRlciBpcyBhcHBsaWVk IHRvIG1ldGhvZHMgd2l0aCBERUZJTkVfTUFOWSBwb2xpY3ksIHdoZXRoZXIKKyAgLy8gbWl4aW5z IGFyZSBsaXN0ZWQgYmVmb3JlIG9yIGFmdGVyIHRoZXNlIG1ldGhvZHMgaW4gdGhlIHNwZWMuCisg IGlmIChzcGVjLmhhc093blByb3BlcnR5KE1JWElOU19LRVkpKSB7CisgICAgUkVTRVJWRURfU1BF Q19LRVlTLm1peGlucyhDb25zdHJ1Y3Rvciwgc3BlYy5taXhpbnMpOworICB9CisKKyAgZm9yICh2 YXIgbmFtZSBpbiBzcGVjKSB7CisgICAgaWYgKCFzcGVjLmhhc093blByb3BlcnR5KG5hbWUpKSB7 CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAobmFtZSA9PT0gTUlYSU5TX0tFWSkg eworICAgICAgLy8gV2UgaGF2ZSBhbHJlYWR5IGhhbmRsZWQgbWl4aW5zIGluIGEgc3BlY2lhbCBj YXNlIGFib3ZlLgorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgdmFyIHByb3BlcnR5ID0g c3BlY1tuYW1lXTsKKyAgICB2YXIgaXNBbHJlYWR5RGVmaW5lZCA9IHByb3RvLmhhc093blByb3Bl cnR5KG5hbWUpOworICAgIHZhbGlkYXRlTWV0aG9kT3ZlcnJpZGUoaXNBbHJlYWR5RGVmaW5lZCwg bmFtZSk7CisKKyAgICBpZiAoUkVTRVJWRURfU1BFQ19LRVlTLmhhc093blByb3BlcnR5KG5hbWUp KSB7CisgICAgICBSRVNFUlZFRF9TUEVDX0tFWVNbbmFtZV0oQ29uc3RydWN0b3IsIHByb3BlcnR5 KTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gU2V0dXAgbWV0aG9kcyBvbiBwcm90b3R5cGU6Cisg ICAgICAvLyBUaGUgZm9sbG93aW5nIG1lbWJlciBtZXRob2RzIHNob3VsZCBub3QgYmUgYXV0b21h dGljYWxseSBib3VuZDoKKyAgICAgIC8vIDEuIEV4cGVjdGVkIFJlYWN0Q2xhc3MgbWV0aG9kcyAo aW4gdGhlICJpbnRlcmZhY2UiKS4KKyAgICAgIC8vIDIuIE92ZXJyaWRkZW4gbWV0aG9kcyAodGhh dCB3ZXJlIG1peGVkIGluKS4KKyAgICAgIHZhciBpc1JlYWN0Q2xhc3NNZXRob2QgPSBSZWFjdENs YXNzSW50ZXJmYWNlLmhhc093blByb3BlcnR5KG5hbWUpOworICAgICAgdmFyIGlzRnVuY3Rpb24g PSB0eXBlb2YgcHJvcGVydHkgPT09ICdmdW5jdGlvbic7CisgICAgICB2YXIgc2hvdWxkQXV0b0Jp bmQgPSBpc0Z1bmN0aW9uICYmICFpc1JlYWN0Q2xhc3NNZXRob2QgJiYgIWlzQWxyZWFkeURlZmlu ZWQgJiYgc3BlYy5hdXRvYmluZCAhPT0gZmFsc2U7CisKKyAgICAgIGlmIChzaG91bGRBdXRvQmlu ZCkgeworICAgICAgICBhdXRvQmluZFBhaXJzLnB1c2gobmFtZSwgcHJvcGVydHkpOworICAgICAg ICBwcm90b1tuYW1lXSA9IHByb3BlcnR5OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGlz QWxyZWFkeURlZmluZWQpIHsKKyAgICAgICAgICB2YXIgc3BlY1BvbGljeSA9IFJlYWN0Q2xhc3NJ bnRlcmZhY2VbbmFtZV07CisKKyAgICAgICAgICAvLyBUaGVzZSBjYXNlcyBzaG91bGQgYWxyZWFk eSBiZSBjYXVnaHQgYnkgdmFsaWRhdGVNZXRob2RPdmVycmlkZS4KKyAgICAgICAgICAhKGlzUmVh Y3RDbGFzc01ldGhvZCAmJiAoc3BlY1BvbGljeSA9PT0gJ0RFRklORV9NQU5ZX01FUkdFRCcgfHwg c3BlY1BvbGljeSA9PT0gJ0RFRklORV9NQU5ZJykpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09 ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0Q2xhc3M6IFVuZXhwZWN0ZWQg c3BlYyBwb2xpY3kgJXMgZm9yIGtleSAlcyB3aGVuIG1peGluZyBpbiBjb21wb25lbnQgc3BlY3Mu Jywgc3BlY1BvbGljeSwgbmFtZSkgOiBfcHJvZEludmFyaWFudCgnNzcnLCBzcGVjUG9saWN5LCBu YW1lKSA6IHZvaWQgMDsKKworICAgICAgICAgIC8vIEZvciBtZXRob2RzIHdoaWNoIGFyZSBkZWZp bmVkIG1vcmUgdGhhbiBvbmNlLCBjYWxsIHRoZSBleGlzdGluZworICAgICAgICAgIC8vIG1ldGhv ZHMgYmVmb3JlIGNhbGxpbmcgdGhlIG5ldyBwcm9wZXJ0eSwgbWVyZ2luZyBpZiBhcHByb3ByaWF0 ZS4KKyAgICAgICAgICBpZiAoc3BlY1BvbGljeSA9PT0gJ0RFRklORV9NQU5ZX01FUkdFRCcpIHsK KyAgICAgICAgICAgIHByb3RvW25hbWVdID0gY3JlYXRlTWVyZ2VkUmVzdWx0RnVuY3Rpb24ocHJv dG9bbmFtZV0sIHByb3BlcnR5KTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHNwZWNQb2xpY3kgPT09 ICdERUZJTkVfTUFOWScpIHsKKyAgICAgICAgICAgIHByb3RvW25hbWVdID0gY3JlYXRlQ2hhaW5l ZEZ1bmN0aW9uKHByb3RvW25hbWVdLCBwcm9wZXJ0eSk7CisgICAgICAgICAgfQorICAgICAgICB9 IGVsc2UgeworICAgICAgICAgIHByb3RvW25hbWVdID0gcHJvcGVydHk7CisgICAgICAgICAgaWYg KHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICAgICAgICAgIC8v IEFkZCB2ZXJib3NlIGRpc3BsYXlOYW1lIHRvIHRoZSBmdW5jdGlvbiwgd2hpY2ggaGVscHMgd2hl biBsb29raW5nCisgICAgICAgICAgICAvLyBhdCBwcm9maWxpbmcgdG9vbHMuCisgICAgICAgICAg ICBpZiAodHlwZW9mIHByb3BlcnR5ID09PSAnZnVuY3Rpb24nICYmIHNwZWMuZGlzcGxheU5hbWUp IHsKKyAgICAgICAgICAgICAgcHJvdG9bbmFtZV0uZGlzcGxheU5hbWUgPSBzcGVjLmRpc3BsYXlO YW1lICsgJ18nICsgbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0K KyAgICAgIH0KKyAgICB9CisgIH0KK30KKworZnVuY3Rpb24gbWl4U3RhdGljU3BlY0ludG9Db21w b25lbnQoQ29uc3RydWN0b3IsIHN0YXRpY3MpIHsKKyAgaWYgKCFzdGF0aWNzKSB7CisgICAgcmV0 dXJuOworICB9CisgIGZvciAodmFyIG5hbWUgaW4gc3RhdGljcykgeworICAgIHZhciBwcm9wZXJ0 eSA9IHN0YXRpY3NbbmFtZV07CisgICAgaWYgKCFzdGF0aWNzLmhhc093blByb3BlcnR5KG5hbWUp KSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICB2YXIgaXNSZXNlcnZlZCA9IG5hbWUg aW4gUkVTRVJWRURfU1BFQ19LRVlTOworICAgICEhaXNSZXNlcnZlZCA/IHByb2Nlc3MuZW52Lk5P REVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdENsYXNzOiBZ b3UgYXJlIGF0dGVtcHRpbmcgdG8gZGVmaW5lIGEgcmVzZXJ2ZWQgcHJvcGVydHksIGAlc2AsIHRo YXQgc2hvdWxkblwndCBiZSBvbiB0aGUgInN0YXRpY3MiIGtleS4gRGVmaW5lIGl0IGFzIGFuIGlu c3RhbmNlIHByb3BlcnR5IGluc3RlYWQ7IGl0IHdpbGwgc3RpbGwgYmUgYWNjZXNzaWJsZSBvbiB0 aGUgY29uc3RydWN0b3IuJywgbmFtZSkgOiBfcHJvZEludmFyaWFudCgnNzgnLCBuYW1lKSA6IHZv aWQgMDsKKworICAgIHZhciBpc0luaGVyaXRlZCA9IG5hbWUgaW4gQ29uc3RydWN0b3I7CisgICAg ISFpc0luaGVyaXRlZCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBp bnZhcmlhbnQoZmFsc2UsICdSZWFjdENsYXNzOiBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gZGVmaW5l IGAlc2Agb24geW91ciBjb21wb25lbnQgbW9yZSB0aGFuIG9uY2UuIFRoaXMgY29uZmxpY3QgbWF5 IGJlIGR1ZSB0byBhIG1peGluLicsIG5hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzc5JywgbmFtZSkg OiB2b2lkIDA7CisgICAgQ29uc3RydWN0b3JbbmFtZV0gPSBwcm9wZXJ0eTsKKyAgfQorfQorCisv KioKKyAqIE1lcmdlIHR3byBvYmplY3RzLCBidXQgdGhyb3cgaWYgYm90aCBjb250YWluIHRoZSBz YW1lIGtleS4KKyAqCisgKiBAcGFyYW0ge29iamVjdH0gb25lIFRoZSBmaXJzdCBvYmplY3QsIHdo aWNoIGlzIG11dGF0ZWQuCisgKiBAcGFyYW0ge29iamVjdH0gdHdvIFRoZSBzZWNvbmQgb2JqZWN0 CisgKiBAcmV0dXJuIHtvYmplY3R9IG9uZSBhZnRlciBpdCBoYXMgYmVlbiBtdXRhdGVkIHRvIGNv bnRhaW4gZXZlcnl0aGluZyBpbiB0d28uCisgKi8KK2Z1bmN0aW9uIG1lcmdlSW50b1dpdGhOb0R1 cGxpY2F0ZUtleXMob25lLCB0d28pIHsKKyAgIShvbmUgJiYgdHdvICYmIHR5cGVvZiBvbmUgPT09 ICdvYmplY3QnICYmIHR5cGVvZiB0d28gPT09ICdvYmplY3QnKSA/IHByb2Nlc3MuZW52Lk5PREVf RU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdtZXJnZUludG9XaXRoTm9E dXBsaWNhdGVLZXlzKCk6IENhbm5vdCBtZXJnZSBub24tb2JqZWN0cy4nKSA6IF9wcm9kSW52YXJp YW50KCc4MCcpIDogdm9pZCAwOworCisgIGZvciAodmFyIGtleSBpbiB0d28pIHsKKyAgICBpZiAo dHdvLmhhc093blByb3BlcnR5KGtleSkpIHsKKyAgICAgICEob25lW2tleV0gPT09IHVuZGVmaW5l ZCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZh bHNlLCAnbWVyZ2VJbnRvV2l0aE5vRHVwbGljYXRlS2V5cygpOiBUcmllZCB0byBtZXJnZSB0d28g b2JqZWN0cyB3aXRoIHRoZSBzYW1lIGtleTogYCVzYC4gVGhpcyBjb25mbGljdCBtYXkgYmUgZHVl IHRvIGEgbWl4aW47IGluIHBhcnRpY3VsYXIsIHRoaXMgbWF5IGJlIGNhdXNlZCBieSB0d28gZ2V0 SW5pdGlhbFN0YXRlKCkgb3IgZ2V0RGVmYXVsdFByb3BzKCkgbWV0aG9kcyByZXR1cm5pbmcgb2Jq ZWN0cyB3aXRoIGNsYXNoaW5nIGtleXMuJywga2V5KSA6IF9wcm9kSW52YXJpYW50KCc4MScsIGtl eSkgOiB2b2lkIDA7CisgICAgICBvbmVba2V5XSA9IHR3b1trZXldOworICAgIH0KKyAgfQorICBy ZXR1cm4gb25lOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMg dHdvIGZ1bmN0aW9ucyBhbmQgbWVyZ2VzIHRoZWlyIHJldHVybiB2YWx1ZXMuCisgKgorICogQHBh cmFtIHtmdW5jdGlvbn0gb25lIEZ1bmN0aW9uIHRvIGludm9rZSBmaXJzdC4KKyAqIEBwYXJhbSB7 ZnVuY3Rpb259IHR3byBGdW5jdGlvbiB0byBpbnZva2Ugc2Vjb25kLgorICogQHJldHVybiB7ZnVu Y3Rpb259IEZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0aGUgdHdvIGFyZ3VtZW50IGZ1bmN0aW9ucy4K KyAqIEBwcml2YXRlCisgKi8KK2Z1bmN0aW9uIGNyZWF0ZU1lcmdlZFJlc3VsdEZ1bmN0aW9uKG9u ZSwgdHdvKSB7CisgIHJldHVybiBmdW5jdGlvbiBtZXJnZWRSZXN1bHQoKSB7CisgICAgdmFyIGEg PSBvbmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB2YXIgYiA9IHR3by5hcHBseSh0aGlz LCBhcmd1bWVudHMpOworICAgIGlmIChhID09IG51bGwpIHsKKyAgICAgIHJldHVybiBiOworICAg IH0gZWxzZSBpZiAoYiA9PSBudWxsKSB7CisgICAgICByZXR1cm4gYTsKKyAgICB9CisgICAgdmFy IGMgPSB7fTsKKyAgICBtZXJnZUludG9XaXRoTm9EdXBsaWNhdGVLZXlzKGMsIGEpOworICAgIG1l cmdlSW50b1dpdGhOb0R1cGxpY2F0ZUtleXMoYywgYik7CisgICAgcmV0dXJuIGM7CisgIH07Cit9 CisKKy8qKgorICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0d28gZnVuY3Rpb25z IGFuZCBpZ25vcmVzIHRoZWlyIHJldHVybiB2YWxlcy4KKyAqCisgKiBAcGFyYW0ge2Z1bmN0aW9u fSBvbmUgRnVuY3Rpb24gdG8gaW52b2tlIGZpcnN0LgorICogQHBhcmFtIHtmdW5jdGlvbn0gdHdv IEZ1bmN0aW9uIHRvIGludm9rZSBzZWNvbmQuCisgKiBAcmV0dXJuIHtmdW5jdGlvbn0gRnVuY3Rp b24gdGhhdCBpbnZva2VzIHRoZSB0d28gYXJndW1lbnQgZnVuY3Rpb25zLgorICogQHByaXZhdGUK KyAqLworZnVuY3Rpb24gY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKG9uZSwgdHdvKSB7CisgIHJldHVy biBmdW5jdGlvbiBjaGFpbmVkRnVuY3Rpb24oKSB7CisgICAgb25lLmFwcGx5KHRoaXMsIGFyZ3Vt ZW50cyk7CisgICAgdHdvLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgIH07Cit9CisKKy8qKgor ICogQmluZHMgYSBtZXRob2QgdG8gdGhlIGNvbXBvbmVudC4KKyAqCisgKiBAcGFyYW0ge29iamVj dH0gY29tcG9uZW50IENvbXBvbmVudCB3aG9zZSBtZXRob2QgaXMgZ29pbmcgdG8gYmUgYm91bmQu CisgKiBAcGFyYW0ge2Z1bmN0aW9ufSBtZXRob2QgTWV0aG9kIHRvIGJlIGJvdW5kLgorICogQHJl dHVybiB7ZnVuY3Rpb259IFRoZSBib3VuZCBtZXRob2QuCisgKi8KK2Z1bmN0aW9uIGJpbmRBdXRv QmluZE1ldGhvZChjb21wb25lbnQsIG1ldGhvZCkgeworICB2YXIgYm91bmRNZXRob2QgPSBtZXRo b2QuYmluZChjb21wb25lbnQpOworICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9k dWN0aW9uJykgeworICAgIGJvdW5kTWV0aG9kLl9fcmVhY3RCb3VuZENvbnRleHQgPSBjb21wb25l bnQ7CisgICAgYm91bmRNZXRob2QuX19yZWFjdEJvdW5kTWV0aG9kID0gbWV0aG9kOworICAgIGJv dW5kTWV0aG9kLl9fcmVhY3RCb3VuZEFyZ3VtZW50cyA9IG51bGw7CisgICAgdmFyIGNvbXBvbmVu dE5hbWUgPSBjb21wb25lbnQuY29uc3RydWN0b3IuZGlzcGxheU5hbWU7CisgICAgdmFyIF9iaW5k ID0gYm91bmRNZXRob2QuYmluZDsKKyAgICBib3VuZE1ldGhvZC5iaW5kID0gZnVuY3Rpb24gKG5l d1RoaXMpIHsKKyAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0g QXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9r ZXkrKykgeworICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTsKKyAgICAg IH0KKworICAgICAgLy8gVXNlciBpcyB0cnlpbmcgdG8gYmluZCgpIGFuIGF1dG9ib3VuZCBtZXRo b2Q7IHdlIGVmZmVjdGl2ZWx5IHdpbGwKKyAgICAgIC8vIGlnbm9yZSB0aGUgdmFsdWUgb2YgInRo aXMiIHRoYXQgdGhlIHVzZXIgaXMgdHJ5aW5nIHRvIHVzZSwgc28KKyAgICAgIC8vIGxldCdzIHdh cm4uCisgICAgICBpZiAobmV3VGhpcyAhPT0gY29tcG9uZW50ICYmIG5ld1RoaXMgIT09IG51bGwp IHsKKyAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5p bmcoZmFsc2UsICdiaW5kKCk6IFJlYWN0IGNvbXBvbmVudCBtZXRob2RzIG1heSBvbmx5IGJlIGJv dW5kIHRvIHRoZSAnICsgJ2NvbXBvbmVudCBpbnN0YW5jZS4gU2VlICVzJywgY29tcG9uZW50TmFt ZSkgOiB2b2lkIDA7CisgICAgICB9IGVsc2UgaWYgKCFhcmdzLmxlbmd0aCkgeworICAgICAgICBw cm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2Jp bmQoKTogWW91IGFyZSBiaW5kaW5nIGEgY29tcG9uZW50IG1ldGhvZCB0byB0aGUgY29tcG9uZW50 LiAnICsgJ1JlYWN0IGRvZXMgdGhpcyBmb3IgeW91IGF1dG9tYXRpY2FsbHkgaW4gYSBoaWdoLXBl cmZvcm1hbmNlICcgKyAnd2F5LCBzbyB5b3UgY2FuIHNhZmVseSByZW1vdmUgdGhpcyBjYWxsLiBT ZWUgJXMnLCBjb21wb25lbnROYW1lKSA6IHZvaWQgMDsKKyAgICAgICAgcmV0dXJuIGJvdW5kTWV0 aG9kOworICAgICAgfQorICAgICAgdmFyIHJlYm91bmRNZXRob2QgPSBfYmluZC5hcHBseShib3Vu ZE1ldGhvZCwgYXJndW1lbnRzKTsKKyAgICAgIHJlYm91bmRNZXRob2QuX19yZWFjdEJvdW5kQ29u dGV4dCA9IGNvbXBvbmVudDsKKyAgICAgIHJlYm91bmRNZXRob2QuX19yZWFjdEJvdW5kTWV0aG9k ID0gbWV0aG9kOworICAgICAgcmVib3VuZE1ldGhvZC5fX3JlYWN0Qm91bmRBcmd1bWVudHMgPSBh cmdzOworICAgICAgcmV0dXJuIHJlYm91bmRNZXRob2Q7CisgICAgfTsKKyAgfQorICByZXR1cm4g Ym91bmRNZXRob2Q7Cit9CisKKy8qKgorICogQmluZHMgYWxsIGF1dG8tYm91bmQgbWV0aG9kcyBp biBhIGNvbXBvbmVudC4KKyAqCisgKiBAcGFyYW0ge29iamVjdH0gY29tcG9uZW50IENvbXBvbmVu dCB3aG9zZSBtZXRob2QgaXMgZ29pbmcgdG8gYmUgYm91bmQuCisgKi8KK2Z1bmN0aW9uIGJpbmRB dXRvQmluZE1ldGhvZHMoY29tcG9uZW50KSB7CisgIHZhciBwYWlycyA9IGNvbXBvbmVudC5fX3Jl YWN0QXV0b0JpbmRQYWlyczsKKyAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkg Kz0gMikgeworICAgIHZhciBhdXRvQmluZEtleSA9IHBhaXJzW2ldOworICAgIHZhciBtZXRob2Qg PSBwYWlyc1tpICsgMV07CisgICAgY29tcG9uZW50W2F1dG9CaW5kS2V5XSA9IGJpbmRBdXRvQmlu ZE1ldGhvZChjb21wb25lbnQsIG1ldGhvZCk7CisgIH0KK30KKworLyoqCisgKiBBZGQgbW9yZSB0 byB0aGUgUmVhY3RDbGFzcyBiYXNlIGNsYXNzLiBUaGVzZSBhcmUgYWxsIGxlZ2FjeSBmZWF0dXJl cyBhbmQKKyAqIHRoZXJlZm9yZSBub3QgYWxyZWFkeSBwYXJ0IG9mIHRoZSBtb2Rlcm4gUmVhY3RD b21wb25lbnQuCisgKi8KK3ZhciBSZWFjdENsYXNzTWl4aW4gPSB7CisKKyAgLyoqCisgICAqIFRP RE86IFRoaXMgd2lsbCBiZSBkZXByZWNhdGVkIGJlY2F1c2Ugc3RhdGUgc2hvdWxkIGFsd2F5cyBr ZWVwIGEgY29uc2lzdGVudAorICAgKiB0eXBlIHNpZ25hdHVyZSBhbmQgdGhlIG9ubHkgdXNlIGNh c2UgZm9yIHRoaXMsIGlzIHRvIGF2b2lkIHRoYXQuCisgICAqLworICByZXBsYWNlU3RhdGU6IGZ1 bmN0aW9uIChuZXdTdGF0ZSwgY2FsbGJhY2spIHsKKyAgICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZVJl cGxhY2VTdGF0ZSh0aGlzLCBuZXdTdGF0ZSk7CisgICAgaWYgKGNhbGxiYWNrKSB7CisgICAgICB0 aGlzLnVwZGF0ZXIuZW5xdWV1ZUNhbGxiYWNrKHRoaXMsIGNhbGxiYWNrLCAncmVwbGFjZVN0YXRl Jyk7CisgICAgfQorICB9LAorCisgIC8qKgorICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhp cyBjb21wb3NpdGUgY29tcG9uZW50IGlzIG1vdW50ZWQuCisgICAqIEByZXR1cm4ge2Jvb2xlYW59 IFRydWUgaWYgbW91bnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKiBAcHJvdGVjdGVkCisgICAq IEBmaW5hbAorICAgKi8KKyAgaXNNb3VudGVkOiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIHRo aXMudXBkYXRlci5pc01vdW50ZWQodGhpcyk7CisgIH0KK307CisKK3ZhciBSZWFjdENsYXNzQ29t cG9uZW50ID0gZnVuY3Rpb24gKCkge307CitfYXNzaWduKFJlYWN0Q2xhc3NDb21wb25lbnQucHJv dG90eXBlLCBSZWFjdENvbXBvbmVudC5wcm90b3R5cGUsIFJlYWN0Q2xhc3NNaXhpbik7CisKKy8q KgorICogTW9kdWxlIGZvciBjcmVhdGluZyBjb21wb3NpdGUgY29tcG9uZW50cy4KKyAqCisgKiBA Y2xhc3MgUmVhY3RDbGFzcworICovCit2YXIgUmVhY3RDbGFzcyA9IHsKKworICAvKioKKyAgICog Q3JlYXRlcyBhIGNvbXBvc2l0ZSBjb21wb25lbnQgY2xhc3MgZ2l2ZW4gYSBjbGFzcyBzcGVjaWZp Y2F0aW9uLgorICAgKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90 b3AtbGV2ZWwtYXBpLmh0bWwjcmVhY3QuY3JlYXRlY2xhc3MKKyAgICoKKyAgICogQHBhcmFtIHtv YmplY3R9IHNwZWMgQ2xhc3Mgc3BlY2lmaWNhdGlvbiAod2hpY2ggbXVzdCBkZWZpbmUgYHJlbmRl cmApLgorICAgKiBAcmV0dXJuIHtmdW5jdGlvbn0gQ29tcG9uZW50IGNvbnN0cnVjdG9yIGZ1bmN0 aW9uLgorICAgKiBAcHVibGljCisgICAqLworICBjcmVhdGVDbGFzczogZnVuY3Rpb24gKHNwZWMp IHsKKyAgICAvLyBUbyBrZWVwIG91ciB3YXJuaW5ncyBtb3JlIHVuZGVyc3RhbmRhYmxlLCB3ZSds bCB1c2UgYSBsaXR0bGUgaGFjayBoZXJlIHRvCisgICAgLy8gZW5zdXJlIHRoYXQgQ29uc3RydWN0 b3IubmFtZSAhPT0gJ0NvbnN0cnVjdG9yJy4gVGhpcyBtYWtlcyBzdXJlIHdlIGRvbid0CisgICAg Ly8gdW5uZWNlc3NhcmlseSBpZGVudGlmeSBhIGNsYXNzIHdpdGhvdXQgZGlzcGxheU5hbWUgYXMg J0NvbnN0cnVjdG9yJy4KKyAgICB2YXIgQ29uc3RydWN0b3IgPSBpZGVudGl0eShmdW5jdGlvbiAo cHJvcHMsIGNvbnRleHQsIHVwZGF0ZXIpIHsKKyAgICAgIC8vIFRoaXMgY29uc3RydWN0b3IgZ2V0 cyBvdmVycmlkZGVuIGJ5IG1vY2tzLiBUaGUgYXJndW1lbnQgaXMgdXNlZAorICAgICAgLy8gYnkg bW9ja3MgdG8gYXNzZXJ0IG9uIHdoYXQgZ2V0cyBtb3VudGVkLgorCisgICAgICBpZiAocHJvY2Vz cy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgICBwcm9jZXNzLmVudi5O T0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyh0aGlzIGluc3RhbmNlb2YgQ29uc3Ry dWN0b3IsICdTb21ldGhpbmcgaXMgY2FsbGluZyBhIFJlYWN0IGNvbXBvbmVudCBkaXJlY3RseS4g VXNlIGEgZmFjdG9yeSBvciAnICsgJ0pTWCBpbnN0ZWFkLiBTZWU6IGh0dHBzOi8vZmIubWUvcmVh Y3QtbGVnYWN5ZmFjdG9yeScpIDogdm9pZCAwOworICAgICAgfQorCisgICAgICAvLyBXaXJlIHVw IGF1dG8tYmluZGluZworICAgICAgaWYgKHRoaXMuX19yZWFjdEF1dG9CaW5kUGFpcnMubGVuZ3Ro KSB7CisgICAgICAgIGJpbmRBdXRvQmluZE1ldGhvZHModGhpcyk7CisgICAgICB9CisKKyAgICAg IHRoaXMucHJvcHMgPSBwcm9wczsKKyAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisgICAg ICB0aGlzLnJlZnMgPSBlbXB0eU9iamVjdDsKKyAgICAgIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIg fHwgUmVhY3ROb29wVXBkYXRlUXVldWU7CisKKyAgICAgIHRoaXMuc3RhdGUgPSBudWxsOworCisg ICAgICAvLyBSZWFjdENsYXNzZXMgZG9lc24ndCBoYXZlIGNvbnN0cnVjdG9ycy4gSW5zdGVhZCwg dGhleSB1c2UgdGhlCisgICAgICAvLyBnZXRJbml0aWFsU3RhdGUgYW5kIGNvbXBvbmVudFdpbGxN b3VudCBtZXRob2RzIGZvciBpbml0aWFsaXphdGlvbi4KKworICAgICAgdmFyIGluaXRpYWxTdGF0 ZSA9IHRoaXMuZ2V0SW5pdGlhbFN0YXRlID8gdGhpcy5nZXRJbml0aWFsU3RhdGUoKSA6IG51bGw7 CisgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgeworICAg ICAgICAvLyBXZSBhbGxvdyBhdXRvLW1vY2tzIHRvIHByb2NlZWQgYXMgaWYgdGhleSdyZSByZXR1 cm5pbmcgbnVsbC4KKyAgICAgICAgaWYgKGluaXRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVkICYmIHRo aXMuZ2V0SW5pdGlhbFN0YXRlLl9pc01vY2tGdW5jdGlvbikgeworICAgICAgICAgIC8vIFRoaXMg aXMgcHJvYmFibHkgYmFkIHByYWN0aWNlLiBDb25zaWRlciB3YXJuaW5nIGhlcmUgYW5kCisgICAg ICAgICAgLy8gZGVwcmVjYXRpbmcgdGhpcyBjb252ZW5pZW5jZS4KKyAgICAgICAgICBpbml0aWFs U3RhdGUgPSBudWxsOworICAgICAgICB9CisgICAgICB9CisgICAgICAhKHR5cGVvZiBpbml0aWFs U3RhdGUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGluaXRpYWxTdGF0ZSkpID8gcHJv Y2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJyVz LmdldEluaXRpYWxTdGF0ZSgpOiBtdXN0IHJldHVybiBhbiBvYmplY3Qgb3IgbnVsbCcsIENvbnN0 cnVjdG9yLmRpc3BsYXlOYW1lIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcpIDogX3Byb2RJ bnZhcmlhbnQoJzgyJywgQ29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgJ1JlYWN0Q29tcG9zaXRl Q29tcG9uZW50JykgOiB2b2lkIDA7CisKKyAgICAgIHRoaXMuc3RhdGUgPSBpbml0aWFsU3RhdGU7 CisgICAgfSk7CisgICAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gbmV3IFJlYWN0Q2xhc3NDb21w b25lbnQoKTsKKyAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb25zdHJ1 Y3RvcjsKKyAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUuX19yZWFjdEF1dG9CaW5kUGFpcnMgPSBb XTsKKworICAgIGluamVjdGVkTWl4aW5zLmZvckVhY2gobWl4U3BlY0ludG9Db21wb25lbnQuYmlu ZChudWxsLCBDb25zdHJ1Y3RvcikpOworCisgICAgbWl4U3BlY0ludG9Db21wb25lbnQoQ29uc3Ry dWN0b3IsIHNwZWMpOworCisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdFByb3BzIHByb3Bl cnR5IGFmdGVyIGFsbCBtaXhpbnMgaGF2ZSBiZWVuIG1lcmdlZC4KKyAgICBpZiAoQ29uc3RydWN0 b3IuZ2V0RGVmYXVsdFByb3BzKSB7CisgICAgICBDb25zdHJ1Y3Rvci5kZWZhdWx0UHJvcHMgPSBD b25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMoKTsKKyAgICB9CisKKyAgICBpZiAocHJvY2Vzcy5l bnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgLy8gVGhpcyBpcyBhIHRhZyB0 byBpbmRpY2F0ZSB0aGF0IHRoZSB1c2Ugb2YgdGhlc2UgbWV0aG9kIG5hbWVzIGlzIG9rLAorICAg ICAgLy8gc2luY2UgaXQncyB1c2VkIHdpdGggY3JlYXRlQ2xhc3MuIElmIGl0J3Mgbm90LCB0aGVu IGl0J3MgbGlrZWx5IGEKKyAgICAgIC8vIG1pc3Rha2Ugc28gd2UnbGwgd2FybiB5b3UgdG8gdXNl IHRoZSBzdGF0aWMgcHJvcGVydHksIHByb3BlcnR5CisgICAgICAvLyBpbml0aWFsaXplciBvciBj b25zdHJ1Y3RvciByZXNwZWN0aXZlbHkuCisgICAgICBpZiAoQ29uc3RydWN0b3IuZ2V0RGVmYXVs dFByb3BzKSB7CisgICAgICAgIENvbnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xh c3NBcHByb3ZlZCA9IHt9OworICAgICAgfQorICAgICAgaWYgKENvbnN0cnVjdG9yLnByb3RvdHlw ZS5nZXRJbml0aWFsU3RhdGUpIHsKKyAgICAgICAgQ29uc3RydWN0b3IucHJvdG90eXBlLmdldElu aXRpYWxTdGF0ZS5pc1JlYWN0Q2xhc3NBcHByb3ZlZCA9IHt9OworICAgICAgfQorICAgIH0KKwor ICAgICFDb25zdHJ1Y3Rvci5wcm90b3R5cGUucmVuZGVyID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYg IT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2NyZWF0ZUNsYXNzKC4uLik6IENs YXNzIHNwZWNpZmljYXRpb24gbXVzdCBpbXBsZW1lbnQgYSBgcmVuZGVyYCBtZXRob2QuJykgOiBf cHJvZEludmFyaWFudCgnODMnKSA6IHZvaWQgMDsKKworICAgIGlmIChwcm9jZXNzLmVudi5OT0RF X0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0g J3Byb2R1Y3Rpb24nID8gd2FybmluZyghQ29uc3RydWN0b3IucHJvdG90eXBlLmNvbXBvbmVudFNo b3VsZFVwZGF0ZSwgJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnRTaG91bGRV cGRhdGUoKS4gRGlkIHlvdSBtZWFuIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpPyAnICsgJ1RoZSBu YW1lIGlzIHBocmFzZWQgYXMgYSBxdWVzdGlvbiBiZWNhdXNlIHRoZSBmdW5jdGlvbiBpcyAnICsg J2V4cGVjdGVkIHRvIHJldHVybiBhIHZhbHVlLicsIHNwZWMuZGlzcGxheU5hbWUgfHwgJ0EgY29t cG9uZW50JykgOiB2b2lkIDA7CisgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1 Y3Rpb24nID8gd2FybmluZyghQ29uc3RydWN0b3IucHJvdG90eXBlLmNvbXBvbmVudFdpbGxSZWNp ZXZlUHJvcHMsICclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50V2lsbFJlY2ll dmVQcm9wcygpLiBEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpPycsIHNw ZWMuZGlzcGxheU5hbWUgfHwgJ0EgY29tcG9uZW50JykgOiB2b2lkIDA7CisgICAgfQorCisgICAg Ly8gUmVkdWNlIHRpbWUgc3BlbnQgZG9pbmcgbG9va3VwcyBieSBzZXR0aW5nIHRoZXNlIG9uIHRo ZSBwcm90b3R5cGUuCisgICAgZm9yICh2YXIgbWV0aG9kTmFtZSBpbiBSZWFjdENsYXNzSW50ZXJm YWNlKSB7CisgICAgICBpZiAoIUNvbnN0cnVjdG9yLnByb3RvdHlwZVttZXRob2ROYW1lXSkgewor ICAgICAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBudWxsOworICAgICAg fQorICAgIH0KKworICAgIHJldHVybiBDb25zdHJ1Y3RvcjsKKyAgfSwKKworICBpbmplY3Rpb246 IHsKKyAgICBpbmplY3RNaXhpbjogZnVuY3Rpb24gKG1peGluKSB7CisgICAgICBpbmplY3RlZE1p eGlucy5wdXNoKG1peGluKTsKKyAgICB9CisgIH0KKworfTsKKworbW9kdWxlLmV4cG9ydHMgPSBS ZWFjdENsYXNzOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9w Z2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL1JlYWN0Q29tcG9uZW50LmpzIGIvd2ViL3Bn YWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvUmVhY3RDb21wb25lbnQuanMKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjhlNWMwOGYxCi0tLSAvZGV2L251bGwKKysrIGIv d2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvUmVhY3RDb21wb25lbnQuanMKQEAg LTAsMCArMSwxMTcgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ss IEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBp cyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBM SUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFu IGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRo ZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0 cmljdCc7CisKK3ZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJp YW50Jyk7CisKK3ZhciBSZWFjdE5vb3BVcGRhdGVRdWV1ZSA9IHJlcXVpcmUoJy4vUmVhY3ROb29w VXBkYXRlUXVldWUnKTsKKwordmFyIGNhbkRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9jYW5E ZWZpbmVQcm9wZXJ0eScpOwordmFyIGVtcHR5T2JqZWN0ID0gcmVxdWlyZSgnZmJqcy9saWIvZW1w dHlPYmplY3QnKTsKK3ZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQn KTsKK3ZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpOworCisvKioKKyAq IEJhc2UgY2xhc3MgaGVscGVycyBmb3IgdGhlIHVwZGF0aW5nIHN0YXRlIG9mIGEgY29tcG9uZW50 LgorICovCitmdW5jdGlvbiBSZWFjdENvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikg eworICB0aGlzLnByb3BzID0gcHJvcHM7CisgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisgIHRo aXMucmVmcyA9IGVtcHR5T2JqZWN0OworICAvLyBXZSBpbml0aWFsaXplIHRoZSBkZWZhdWx0IHVw ZGF0ZXIgYnV0IHRoZSByZWFsIG9uZSBnZXRzIGluamVjdGVkIGJ5IHRoZQorICAvLyByZW5kZXJl ci4KKyAgdGhpcy51cGRhdGVyID0gdXBkYXRlciB8fCBSZWFjdE5vb3BVcGRhdGVRdWV1ZTsKK30K KworUmVhY3RDb21wb25lbnQucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQgPSB7fTsKKworLyoq CisgKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIHRvIG11dGF0 ZQorICogc3RhdGUuIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS4K KyAqCisgKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBp bW1lZGlhdGVseSB1cGRhdGVkLCBzbworICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBj YWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gdGhlIG9sZCB2YWx1ZS4KKyAqCisgKiBUaGVy ZSBpcyBubyBndWFyYW50ZWUgdGhhdCBjYWxscyB0byBgc2V0U3RhdGVgIHdpbGwgcnVuIHN5bmNo cm9ub3VzbHksCisgKiBhcyB0aGV5IG1heSBldmVudHVhbGx5IGJlIGJhdGNoZWQgdG9nZXRoZXIu ICBZb3UgY2FuIHByb3ZpZGUgYW4gb3B0aW9uYWwKKyAqIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBl eGVjdXRlZCB3aGVuIHRoZSBjYWxsIHRvIHNldFN0YXRlIGlzIGFjdHVhbGx5CisgKiBjb21wbGV0 ZWQuCisgKgorICogV2hlbiBhIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHRvIHNldFN0YXRlLCBpdCB3 aWxsIGJlIGNhbGxlZCBhdCBzb21lIHBvaW50IGluCisgKiB0aGUgZnV0dXJlIChub3Qgc3luY2hy b25vdXNseSkuIEl0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHVwIHRvIGRhdGUKKyAqIGNvbXBv bmVudCBhcmd1bWVudHMgKHN0YXRlLCBwcm9wcywgY29udGV4dCkuIFRoZXNlIHZhbHVlcyBjYW4g YmUgZGlmZmVyZW50CisgKiBmcm9tIHRoaXMuKiBiZWNhdXNlIHlvdXIgZnVuY3Rpb24gbWF5IGJl IGNhbGxlZCBhZnRlciByZWNlaXZlUHJvcHMgYnV0IGJlZm9yZQorICogc2hvdWxkQ29tcG9uZW50 VXBkYXRlLCBhbmQgdGhpcyBuZXcgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCB3aWxsIG5vdCB5 ZXQgYmUKKyAqIGFzc2lnbmVkIHRvIHRoaXMuCisgKgorICogQHBhcmFtIHtvYmplY3R8ZnVuY3Rp b259IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgb3IgZnVuY3Rpb24gdG8KKyAqICAg ICAgICBwcm9kdWNlIG5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBjdXJyZW50 IHN0YXRlLgorICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBzdGF0 ZSBpcyB1cGRhdGVkLgorICogQGZpbmFsCisgKiBAcHJvdGVjdGVkCisgKi8KK1JlYWN0Q29tcG9u ZW50LnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChwYXJ0aWFsU3RhdGUsIGNhbGxiYWNr KSB7CisgICEodHlwZW9mIHBhcnRpYWxTdGF0ZSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHBhcnRp YWxTdGF0ZSA9PT0gJ2Z1bmN0aW9uJyB8fCBwYXJ0aWFsU3RhdGUgPT0gbnVsbCkgPyBwcm9jZXNz LmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnc2V0U3Rh dGUoLi4uKTogdGFrZXMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcyB0byB1cGRhdGUgb3Ig YSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMuJykg OiBfcHJvZEludmFyaWFudCgnODUnKSA6IHZvaWQgMDsKKyAgdGhpcy51cGRhdGVyLmVucXVldWVT ZXRTdGF0ZSh0aGlzLCBwYXJ0aWFsU3RhdGUpOworICBpZiAoY2FsbGJhY2spIHsKKyAgICB0aGlz LnVwZGF0ZXIuZW5xdWV1ZUNhbGxiYWNrKHRoaXMsIGNhbGxiYWNrLCAnc2V0U3RhdGUnKTsKKyAg fQorfTsKKworLyoqCisgKiBGb3JjZXMgYW4gdXBkYXRlLiBUaGlzIHNob3VsZCBvbmx5IGJlIGlu dm9rZWQgd2hlbiBpdCBpcyBrbm93biB3aXRoCisgKiBjZXJ0YWludHkgdGhhdCB3ZSBhcmUgKipu b3QqKiBpbiBhIERPTSB0cmFuc2FjdGlvbi4KKyAqCisgKiBZb3UgbWF5IHdhbnQgdG8gY2FsbCB0 aGlzIHdoZW4geW91IGtub3cgdGhhdCBzb21lIGRlZXBlciBhc3BlY3Qgb2YgdGhlCisgKiBjb21w b25lbnQncyBzdGF0ZSBoYXMgY2hhbmdlZCBidXQgYHNldFN0YXRlYCB3YXMgbm90IGNhbGxlZC4K KyAqCisgKiBUaGlzIHdpbGwgbm90IGludm9rZSBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCwgYnV0 IGl0IHdpbGwgaW52b2tlCisgKiBgY29tcG9uZW50V2lsbFVwZGF0ZWAgYW5kIGBjb21wb25lbnRE aWRVcGRhdGVgLgorICoKKyAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0 ZXIgdXBkYXRlIGlzIGNvbXBsZXRlLgorICogQGZpbmFsCisgKiBAcHJvdGVjdGVkCisgKi8KK1Jl YWN0Q29tcG9uZW50LnByb3RvdHlwZS5mb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykg eworICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMpOworICBpZiAoY2FsbGJh Y2spIHsKKyAgICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZUNhbGxiYWNrKHRoaXMsIGNhbGxiYWNrLCAn Zm9yY2VVcGRhdGUnKTsKKyAgfQorfTsKKworLyoqCisgKiBEZXByZWNhdGVkIEFQSXMuIFRoZXNl IEFQSXMgdXNlZCB0byBleGlzdCBvbiBjbGFzc2ljIFJlYWN0IGNsYXNzZXMgYnV0IHNpbmNlCisg KiB3ZSB3b3VsZCBsaWtlIHRvIGRlcHJlY2F0ZSB0aGVtLCB3ZSdyZSBub3QgZ29pbmcgdG8gbW92 ZSB0aGVtIG92ZXIgdG8gdGhpcworICogbW9kZXJuIGJhc2UgY2xhc3MuIEluc3RlYWQsIHdlIGRl ZmluZSBhIGdldHRlciB0aGF0IHdhcm5zIGlmIGl0J3MgYWNjZXNzZWQuCisgKi8KK2lmIChwcm9j ZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgIHZhciBkZXByZWNhdGVkQVBJ cyA9IHsKKyAgICBpc01vdW50ZWQ6IFsnaXNNb3VudGVkJywgJ0luc3RlYWQsIG1ha2Ugc3VyZSB0 byBjbGVhbiB1cCBzdWJzY3JpcHRpb25zIGFuZCBwZW5kaW5nIHJlcXVlc3RzIGluICcgKyAnY29t cG9uZW50V2lsbFVubW91bnQgdG8gcHJldmVudCBtZW1vcnkgbGVha3MuJ10sCisgICAgcmVwbGFj ZVN0YXRlOiBbJ3JlcGxhY2VTdGF0ZScsICdSZWZhY3RvciB5b3VyIGNvZGUgdG8gdXNlIHNldFN0 YXRlIGluc3RlYWQgKHNlZSAnICsgJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9p c3N1ZXMvMzIzNikuJ10KKyAgfTsKKyAgdmFyIGRlZmluZURlcHJlY2F0aW9uV2FybmluZyA9IGZ1 bmN0aW9uIChtZXRob2ROYW1lLCBpbmZvKSB7CisgICAgaWYgKGNhbkRlZmluZVByb3BlcnR5KSB7 CisgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhY3RDb21wb25lbnQucHJvdG90eXBlLCBt ZXRob2ROYW1lLCB7CisgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeworICAgICAgICAgIHByb2Nl c3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnJXMoLi4u KSBpcyBkZXByZWNhdGVkIGluIHBsYWluIEphdmFTY3JpcHQgUmVhY3QgY2xhc3Nlcy4gJXMnLCBp bmZvWzBdLCBpbmZvWzFdKSA6IHZvaWQgMDsKKyAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwor ICAgICAgICB9CisgICAgICB9KTsKKyAgICB9CisgIH07CisgIGZvciAodmFyIGZuTmFtZSBpbiBk ZXByZWNhdGVkQVBJcykgeworICAgIGlmIChkZXByZWNhdGVkQVBJcy5oYXNPd25Qcm9wZXJ0eShm bk5hbWUpKSB7CisgICAgICBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcoZm5OYW1lLCBkZXByZWNh dGVkQVBJc1tmbk5hbWVdKTsKKyAgICB9CisgIH0KK30KKworbW9kdWxlLmV4cG9ydHMgPSBSZWFj dENvbXBvbmVudDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIv cGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0L2xpYi9SZWFjdENvbXBvbmVudFRyZWVEZXZ0b29s LmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvUmVhY3RDb21wb25lbnRU cmVlRGV2dG9vbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uNDkwMTJl NzQKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0L2xp Yi9SZWFjdENvbXBvbmVudFRyZWVEZXZ0b29sLmpzCkBAIC0wLDAgKzEsMTQgQEAKKy8qKgorICog Q29weXJpZ2h0IDIwMTYtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVz ZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNE LXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qg ZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9m IHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNh bWUgZGlyZWN0b3J5LgorICoKKyAqLworJ3VzZSBzdHJpY3QnOworCisvLyBUT0RPIHJlbW92ZSB0 aGlzIHByb3h5IHdoZW4gUk4vd3d3IGdldHMgdXBkYXRlZAorCittb2R1bGUuZXhwb3J0cyA9IHJl cXVpcmUoJy4vUmVhY3RDb21wb25lbnRUcmVlSG9vaycpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9m IGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL1Jl YWN0Q29tcG9uZW50VHJlZUhvb2suanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0 L2xpYi9SZWFjdENvbXBvbmVudFRyZWVIb29rLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAwLi5iMmZhYTIwNQotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRp Yy92ZW5kb3IvcmVhY3QvbGliL1JlYWN0Q29tcG9uZW50VHJlZUhvb2suanMKQEAgLTAsMCArMSwz MzMgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTYtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAq IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNl ZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZp bGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9u YWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRT IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0 JzsKKwordmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQn KTsKKwordmFyIFJlYWN0Q3VycmVudE93bmVyID0gcmVxdWlyZSgnLi9SZWFjdEN1cnJlbnRPd25l cicpOworCit2YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7Cit2 YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTsKKworZnVuY3Rpb24gaXNO YXRpdmUoZm4pIHsKKyAgLy8gQmFzZWQgb24gaXNOYXRpdmUoKSBmcm9tIExvZGFzaAorICB2YXIg ZnVuY1RvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nOworICB2YXIgaGFzT3du UHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5OworICB2YXIgcmVJc05h dGl2ZSA9IFJlZ0V4cCgnXicgKyBmdW5jVG9TdHJpbmcKKyAgLy8gVGFrZSBhbiBleGFtcGxlIG5h dGl2ZSBmdW5jdGlvbiBzb3VyY2UgZm9yIGNvbXBhcmlzb24KKyAgLmNhbGwoaGFzT3duUHJvcGVy dHkpCisgIC8vIFN0cmlwIHJlZ2V4IGNoYXJhY3RlcnMgc28gd2UgY2FuIHVzZSBpdCBmb3IgcmVn ZXgKKyAgLnJlcGxhY2UoL1tcXF4kLiorPygpW1xde318XS9nLCAnXFwkJicpCisgIC8vIFJlbW92 ZSBoYXNPd25Qcm9wZXJ0eSBmcm9tIHRoZSB0ZW1wbGF0ZSB0byBtYWtlIGl0IGdlbmVyaWMKKyAg LnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/ PVxcXF0pL2csICckMS4qPycpICsgJyQnKTsKKyAgdHJ5IHsKKyAgICB2YXIgc291cmNlID0gZnVu Y1RvU3RyaW5nLmNhbGwoZm4pOworICAgIHJldHVybiByZUlzTmF0aXZlLnRlc3Qoc291cmNlKTsK KyAgfSBjYXRjaCAoZXJyKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK3ZhciBjYW5V c2VDb2xsZWN0aW9ucyA9CisvLyBBcnJheS5mcm9tCit0eXBlb2YgQXJyYXkuZnJvbSA9PT0gJ2Z1 bmN0aW9uJyAmJgorLy8gTWFwCit0eXBlb2YgTWFwID09PSAnZnVuY3Rpb24nICYmIGlzTmF0aXZl KE1hcCkgJiYKKy8vIE1hcC5wcm90b3R5cGUua2V5cworTWFwLnByb3RvdHlwZSAhPSBudWxsICYm IHR5cGVvZiBNYXAucHJvdG90eXBlLmtleXMgPT09ICdmdW5jdGlvbicgJiYgaXNOYXRpdmUoTWFw LnByb3RvdHlwZS5rZXlzKSAmJgorLy8gU2V0Cit0eXBlb2YgU2V0ID09PSAnZnVuY3Rpb24nICYm IGlzTmF0aXZlKFNldCkgJiYKKy8vIFNldC5wcm90b3R5cGUua2V5cworU2V0LnByb3RvdHlwZSAh PSBudWxsICYmIHR5cGVvZiBTZXQucHJvdG90eXBlLmtleXMgPT09ICdmdW5jdGlvbicgJiYgaXNO YXRpdmUoU2V0LnByb3RvdHlwZS5rZXlzKTsKKwordmFyIHNldEl0ZW07Cit2YXIgZ2V0SXRlbTsK K3ZhciByZW1vdmVJdGVtOwordmFyIGdldEl0ZW1JRHM7Cit2YXIgYWRkUm9vdDsKK3ZhciByZW1v dmVSb290OwordmFyIGdldFJvb3RJRHM7CisKK2lmIChjYW5Vc2VDb2xsZWN0aW9ucykgeworICB2 YXIgaXRlbU1hcCA9IG5ldyBNYXAoKTsKKyAgdmFyIHJvb3RJRFNldCA9IG5ldyBTZXQoKTsKKwor ICBzZXRJdGVtID0gZnVuY3Rpb24gKGlkLCBpdGVtKSB7CisgICAgaXRlbU1hcC5zZXQoaWQsIGl0 ZW0pOworICB9OworICBnZXRJdGVtID0gZnVuY3Rpb24gKGlkKSB7CisgICAgcmV0dXJuIGl0ZW1N YXAuZ2V0KGlkKTsKKyAgfTsKKyAgcmVtb3ZlSXRlbSA9IGZ1bmN0aW9uIChpZCkgeworICAgIGl0 ZW1NYXBbJ2RlbGV0ZSddKGlkKTsKKyAgfTsKKyAgZ2V0SXRlbUlEcyA9IGZ1bmN0aW9uICgpIHsK KyAgICByZXR1cm4gQXJyYXkuZnJvbShpdGVtTWFwLmtleXMoKSk7CisgIH07CisKKyAgYWRkUm9v dCA9IGZ1bmN0aW9uIChpZCkgeworICAgIHJvb3RJRFNldC5hZGQoaWQpOworICB9OworICByZW1v dmVSb290ID0gZnVuY3Rpb24gKGlkKSB7CisgICAgcm9vdElEU2V0WydkZWxldGUnXShpZCk7Cisg IH07CisgIGdldFJvb3RJRHMgPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIEFycmF5LmZyb20o cm9vdElEU2V0LmtleXMoKSk7CisgIH07Cit9IGVsc2UgeworICB2YXIgaXRlbUJ5S2V5ID0ge307 CisgIHZhciByb290QnlLZXkgPSB7fTsKKworICAvLyBVc2Ugbm9uLW51bWVyaWMga2V5cyB0byBw cmV2ZW50IFY4IHBlcmZvcm1hbmNlIGlzc3VlczoKKyAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zh Y2Vib29rL3JlYWN0L3B1bGwvNzIzMgorICB2YXIgZ2V0S2V5RnJvbUlEID0gZnVuY3Rpb24gKGlk KSB7CisgICAgcmV0dXJuICcuJyArIGlkOworICB9OworICB2YXIgZ2V0SURGcm9tS2V5ID0gZnVu Y3Rpb24gKGtleSkgeworICAgIHJldHVybiBwYXJzZUludChrZXkuc3Vic3RyKDEpLCAxMCk7Cisg IH07CisKKyAgc2V0SXRlbSA9IGZ1bmN0aW9uIChpZCwgaXRlbSkgeworICAgIHZhciBrZXkgPSBn ZXRLZXlGcm9tSUQoaWQpOworICAgIGl0ZW1CeUtleVtrZXldID0gaXRlbTsKKyAgfTsKKyAgZ2V0 SXRlbSA9IGZ1bmN0aW9uIChpZCkgeworICAgIHZhciBrZXkgPSBnZXRLZXlGcm9tSUQoaWQpOwor ICAgIHJldHVybiBpdGVtQnlLZXlba2V5XTsKKyAgfTsKKyAgcmVtb3ZlSXRlbSA9IGZ1bmN0aW9u IChpZCkgeworICAgIHZhciBrZXkgPSBnZXRLZXlGcm9tSUQoaWQpOworICAgIGRlbGV0ZSBpdGVt QnlLZXlba2V5XTsKKyAgfTsKKyAgZ2V0SXRlbUlEcyA9IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1 cm4gT2JqZWN0LmtleXMoaXRlbUJ5S2V5KS5tYXAoZ2V0SURGcm9tS2V5KTsKKyAgfTsKKworICBh ZGRSb290ID0gZnVuY3Rpb24gKGlkKSB7CisgICAgdmFyIGtleSA9IGdldEtleUZyb21JRChpZCk7 CisgICAgcm9vdEJ5S2V5W2tleV0gPSB0cnVlOworICB9OworICByZW1vdmVSb290ID0gZnVuY3Rp b24gKGlkKSB7CisgICAgdmFyIGtleSA9IGdldEtleUZyb21JRChpZCk7CisgICAgZGVsZXRlIHJv b3RCeUtleVtrZXldOworICB9OworICBnZXRSb290SURzID0gZnVuY3Rpb24gKCkgeworICAgIHJl dHVybiBPYmplY3Qua2V5cyhyb290QnlLZXkpLm1hcChnZXRJREZyb21LZXkpOworICB9OworfQor Cit2YXIgdW5tb3VudGVkSURzID0gW107CisKK2Z1bmN0aW9uIHB1cmdlRGVlcChpZCkgeworICB2 YXIgaXRlbSA9IGdldEl0ZW0oaWQpOworICBpZiAoaXRlbSkgeworICAgIHZhciBjaGlsZElEcyA9 IGl0ZW0uY2hpbGRJRHM7CisKKyAgICByZW1vdmVJdGVtKGlkKTsKKyAgICBjaGlsZElEcy5mb3JF YWNoKHB1cmdlRGVlcCk7CisgIH0KK30KKworZnVuY3Rpb24gZGVzY3JpYmVDb21wb25lbnRGcmFt ZShuYW1lLCBzb3VyY2UsIG93bmVyTmFtZSkgeworICByZXR1cm4gJ1xuICAgIGluICcgKyAobmFt ZSB8fCAnVW5rbm93bicpICsgKHNvdXJjZSA/ICcgKGF0ICcgKyBzb3VyY2UuZmlsZU5hbWUucmVw bGFjZSgvXi4qW1xcXC9dLywgJycpICsgJzonICsgc291cmNlLmxpbmVOdW1iZXIgKyAnKScgOiBv d25lck5hbWUgPyAnIChjcmVhdGVkIGJ5ICcgKyBvd25lck5hbWUgKyAnKScgOiAnJyk7Cit9CisK K2Z1bmN0aW9uIGdldERpc3BsYXlOYW1lKGVsZW1lbnQpIHsKKyAgaWYgKGVsZW1lbnQgPT0gbnVs bCkgeworICAgIHJldHVybiAnI2VtcHR5JzsKKyAgfSBlbHNlIGlmICh0eXBlb2YgZWxlbWVudCA9 PT0gJ3N0cmluZycgfHwgdHlwZW9mIGVsZW1lbnQgPT09ICdudW1iZXInKSB7CisgICAgcmV0dXJu ICcjdGV4dCc7CisgIH0gZWxzZSBpZiAodHlwZW9mIGVsZW1lbnQudHlwZSA9PT0gJ3N0cmluZycp IHsKKyAgICByZXR1cm4gZWxlbWVudC50eXBlOworICB9IGVsc2UgeworICAgIHJldHVybiBlbGVt ZW50LnR5cGUuZGlzcGxheU5hbWUgfHwgZWxlbWVudC50eXBlLm5hbWUgfHwgJ1Vua25vd24nOwor ICB9Cit9CisKK2Z1bmN0aW9uIGRlc2NyaWJlSUQoaWQpIHsKKyAgdmFyIG5hbWUgPSBSZWFjdENv bXBvbmVudFRyZWVIb29rLmdldERpc3BsYXlOYW1lKGlkKTsKKyAgdmFyIGVsZW1lbnQgPSBSZWFj dENvbXBvbmVudFRyZWVIb29rLmdldEVsZW1lbnQoaWQpOworICB2YXIgb3duZXJJRCA9IFJlYWN0 Q29tcG9uZW50VHJlZUhvb2suZ2V0T3duZXJJRChpZCk7CisgIHZhciBvd25lck5hbWU7CisgIGlm IChvd25lcklEKSB7CisgICAgb3duZXJOYW1lID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRE aXNwbGF5TmFtZShvd25lcklEKTsKKyAgfQorICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3By b2R1Y3Rpb24nID8gd2FybmluZyhlbGVtZW50LCAnUmVhY3RDb21wb25lbnRUcmVlSG9vazogTWlz c2luZyBSZWFjdCBlbGVtZW50IGZvciBkZWJ1Z0lEICVzIHdoZW4gJyArICdidWlsZGluZyBzdGFj aycsIGlkKSA6IHZvaWQgMDsKKyAgcmV0dXJuIGRlc2NyaWJlQ29tcG9uZW50RnJhbWUobmFtZSwg ZWxlbWVudCAmJiBlbGVtZW50Ll9zb3VyY2UsIG93bmVyTmFtZSk7Cit9CisKK3ZhciBSZWFjdENv bXBvbmVudFRyZWVIb29rID0geworICBvblNldENoaWxkcmVuOiBmdW5jdGlvbiAoaWQsIG5leHRD aGlsZElEcykgeworICAgIHZhciBpdGVtID0gZ2V0SXRlbShpZCk7CisgICAgIWl0ZW0gPyBwcm9j ZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnSXRl bSBtdXN0IGhhdmUgYmVlbiBzZXQnKSA6IF9wcm9kSW52YXJpYW50KCcxNDQnKSA6IHZvaWQgMDsK KyAgICBpdGVtLmNoaWxkSURzID0gbmV4dENoaWxkSURzOworCisgICAgZm9yICh2YXIgaSA9IDA7 IGkgPCBuZXh0Q2hpbGRJRHMubGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciBuZXh0Q2hpbGRJRCA9 IG5leHRDaGlsZElEc1tpXTsKKyAgICAgIHZhciBuZXh0Q2hpbGQgPSBnZXRJdGVtKG5leHRDaGls ZElEKTsKKyAgICAgICFuZXh0Q2hpbGQgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1 Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgaG9vayBldmVudHMgdG8gZmlyZSBm b3IgdGhlIGNoaWxkIGJlZm9yZSBpdHMgcGFyZW50IGluY2x1ZGVzIGl0IGluIG9uU2V0Q2hpbGRy ZW4oKS4nKSA6IF9wcm9kSW52YXJpYW50KCcxNDAnKSA6IHZvaWQgMDsKKyAgICAgICEobmV4dENo aWxkLmNoaWxkSURzICE9IG51bGwgfHwgdHlwZW9mIG5leHRDaGlsZC5lbGVtZW50ICE9PSAnb2Jq ZWN0JyB8fCBuZXh0Q2hpbGQuZWxlbWVudCA9PSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5W ICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCBvblNldENoaWxk cmVuKCkgdG8gZmlyZSBmb3IgYSBjb250YWluZXIgY2hpbGQgYmVmb3JlIGl0cyBwYXJlbnQgaW5j bHVkZXMgaXQgaW4gb25TZXRDaGlsZHJlbigpLicpIDogX3Byb2RJbnZhcmlhbnQoJzE0MScpIDog dm9pZCAwOworICAgICAgIW5leHRDaGlsZC5pc01vdW50ZWQgPyBwcm9jZXNzLmVudi5OT0RFX0VO ViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgb25Nb3VudENv bXBvbmVudCgpIHRvIGZpcmUgZm9yIHRoZSBjaGlsZCBiZWZvcmUgaXRzIHBhcmVudCBpbmNsdWRl cyBpdCBpbiBvblNldENoaWxkcmVuKCkuJykgOiBfcHJvZEludmFyaWFudCgnNzEnKSA6IHZvaWQg MDsKKyAgICAgIGlmIChuZXh0Q2hpbGQucGFyZW50SUQgPT0gbnVsbCkgeworICAgICAgICBuZXh0 Q2hpbGQucGFyZW50SUQgPSBpZDsKKyAgICAgICAgLy8gVE9ETzogVGhpcyBzaG91bGRuJ3QgYmUg bmVjZXNzYXJ5IGJ1dCBtb3VudGluZyBhIG5ldyByb290IGR1cmluZyBpbgorICAgICAgICAvLyBj b21wb25lbnRXaWxsTW91bnQgY3VycmVudGx5IGNhdXNlcyBub3QteWV0LW1vdW50ZWQgY29tcG9u ZW50cyB0bworICAgICAgICAvLyBiZSBwdXJnZWQgZnJvbSBvdXIgdHJlZSBkYXRhIHNvIHRoZWly IHBhcmVudCBpZCBpcyBtaXNzaW5nLgorICAgICAgfQorICAgICAgIShuZXh0Q2hpbGQucGFyZW50 SUQgPT09IGlkKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZh cmlhbnQoZmFsc2UsICdFeHBlY3RlZCBvbkJlZm9yZU1vdW50Q29tcG9uZW50KCkgcGFyZW50IGFu ZCBvblNldENoaWxkcmVuKCkgdG8gYmUgY29uc2lzdGVudCAoJXMgaGFzIHBhcmVudHMgJXMgYW5k ICVzKS4nLCBuZXh0Q2hpbGRJRCwgbmV4dENoaWxkLnBhcmVudElELCBpZCkgOiBfcHJvZEludmFy aWFudCgnMTQyJywgbmV4dENoaWxkSUQsIG5leHRDaGlsZC5wYXJlbnRJRCwgaWQpIDogdm9pZCAw OworICAgIH0KKyAgfSwKKyAgb25CZWZvcmVNb3VudENvbXBvbmVudDogZnVuY3Rpb24gKGlkLCBl bGVtZW50LCBwYXJlbnRJRCkgeworICAgIHZhciBpdGVtID0geworICAgICAgZWxlbWVudDogZWxl bWVudCwKKyAgICAgIHBhcmVudElEOiBwYXJlbnRJRCwKKyAgICAgIHRleHQ6IG51bGwsCisgICAg ICBjaGlsZElEczogW10sCisgICAgICBpc01vdW50ZWQ6IGZhbHNlLAorICAgICAgdXBkYXRlQ291 bnQ6IDAKKyAgICB9OworICAgIHNldEl0ZW0oaWQsIGl0ZW0pOworICB9LAorICBvbkJlZm9yZVVw ZGF0ZUNvbXBvbmVudDogZnVuY3Rpb24gKGlkLCBlbGVtZW50KSB7CisgICAgdmFyIGl0ZW0gPSBn ZXRJdGVtKGlkKTsKKyAgICBpZiAoIWl0ZW0gfHwgIWl0ZW0uaXNNb3VudGVkKSB7CisgICAgICAv LyBXZSBtYXkgZW5kIHVwIGhlcmUgYXMgYSByZXN1bHQgb2Ygc2V0U3RhdGUoKSBpbiBjb21wb25l bnRXaWxsVW5tb3VudCgpLgorICAgICAgLy8gSW4gdGhpcyBjYXNlLCBpZ25vcmUgdGhlIGVsZW1l bnQuCisgICAgICByZXR1cm47CisgICAgfQorICAgIGl0ZW0uZWxlbWVudCA9IGVsZW1lbnQ7Cisg IH0sCisgIG9uTW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChpZCkgeworICAgIHZhciBpdGVtID0g Z2V0SXRlbShpZCk7CisgICAgIWl0ZW0gPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1 Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnSXRlbSBtdXN0IGhhdmUgYmVlbiBzZXQnKSA6IF9w cm9kSW52YXJpYW50KCcxNDQnKSA6IHZvaWQgMDsKKyAgICBpdGVtLmlzTW91bnRlZCA9IHRydWU7 CisgICAgdmFyIGlzUm9vdCA9IGl0ZW0ucGFyZW50SUQgPT09IDA7CisgICAgaWYgKGlzUm9vdCkg eworICAgICAgYWRkUm9vdChpZCk7CisgICAgfQorICB9LAorICBvblVwZGF0ZUNvbXBvbmVudDog ZnVuY3Rpb24gKGlkKSB7CisgICAgdmFyIGl0ZW0gPSBnZXRJdGVtKGlkKTsKKyAgICBpZiAoIWl0 ZW0gfHwgIWl0ZW0uaXNNb3VudGVkKSB7CisgICAgICAvLyBXZSBtYXkgZW5kIHVwIGhlcmUgYXMg YSByZXN1bHQgb2Ygc2V0U3RhdGUoKSBpbiBjb21wb25lbnRXaWxsVW5tb3VudCgpLgorICAgICAg Ly8gSW4gdGhpcyBjYXNlLCBpZ25vcmUgdGhlIGVsZW1lbnQuCisgICAgICByZXR1cm47CisgICAg fQorICAgIGl0ZW0udXBkYXRlQ291bnQrKzsKKyAgfSwKKyAgb25Vbm1vdW50Q29tcG9uZW50OiBm dW5jdGlvbiAoaWQpIHsKKyAgICB2YXIgaXRlbSA9IGdldEl0ZW0oaWQpOworICAgIGlmIChpdGVt KSB7CisgICAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIGlmIGl0IGV4aXN0cy4KKyAgICAgIC8vIGBp dGVtYCBtaWdodCBub3QgZXhpc3QgaWYgaXQgaXMgaW5zaWRlIGFuIGVycm9yIGJvdW5kYXJ5LCBh bmQgYSBzaWJsaW5nCisgICAgICAvLyBlcnJvciBib3VuZGFyeSBjaGlsZCB0aHJldyB3aGlsZSBt b3VudGluZy4gVGhlbiB0aGlzIGluc3RhbmNlIG5ldmVyCisgICAgICAvLyBnb3QgYSBjaGFuY2Ug dG8gbW91bnQsIGJ1dCBpdCBzdGlsbCBnZXRzIGFuIHVubW91bnRpbmcgZXZlbnQgZHVyaW5nCisg ICAgICAvLyB0aGUgZXJyb3IgYm91bmRhcnkgY2xlYW51cC4KKyAgICAgIGl0ZW0uaXNNb3VudGVk ID0gZmFsc2U7CisgICAgICB2YXIgaXNSb290ID0gaXRlbS5wYXJlbnRJRCA9PT0gMDsKKyAgICAg IGlmIChpc1Jvb3QpIHsKKyAgICAgICAgcmVtb3ZlUm9vdChpZCk7CisgICAgICB9CisgICAgfQor ICAgIHVubW91bnRlZElEcy5wdXNoKGlkKTsKKyAgfSwKKyAgcHVyZ2VVbm1vdW50ZWRDb21wb25l bnRzOiBmdW5jdGlvbiAoKSB7CisgICAgaWYgKFJlYWN0Q29tcG9uZW50VHJlZUhvb2suX3ByZXZl bnRQdXJnaW5nKSB7CisgICAgICAvLyBTaG91bGQgb25seSBiZSB1c2VkIGZvciB0ZXN0aW5nLgor ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdW5tb3VudGVk SURzLmxlbmd0aDsgaSsrKSB7CisgICAgICB2YXIgaWQgPSB1bm1vdW50ZWRJRHNbaV07CisgICAg ICBwdXJnZURlZXAoaWQpOworICAgIH0KKyAgICB1bm1vdW50ZWRJRHMubGVuZ3RoID0gMDsKKyAg fSwKKyAgaXNNb3VudGVkOiBmdW5jdGlvbiAoaWQpIHsKKyAgICB2YXIgaXRlbSA9IGdldEl0ZW0o aWQpOworICAgIHJldHVybiBpdGVtID8gaXRlbS5pc01vdW50ZWQgOiBmYWxzZTsKKyAgfSwKKyAg Z2V0Q3VycmVudFN0YWNrQWRkZW5kdW06IGZ1bmN0aW9uICh0b3BFbGVtZW50KSB7CisgICAgdmFy IGluZm8gPSAnJzsKKyAgICBpZiAodG9wRWxlbWVudCkgeworICAgICAgdmFyIG5hbWUgPSBnZXRE aXNwbGF5TmFtZSh0b3BFbGVtZW50KTsKKyAgICAgIHZhciBvd25lciA9IHRvcEVsZW1lbnQuX293 bmVyOworICAgICAgaW5mbyArPSBkZXNjcmliZUNvbXBvbmVudEZyYW1lKG5hbWUsIHRvcEVsZW1l bnQuX3NvdXJjZSwgb3duZXIgJiYgb3duZXIuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICB2YXIg Y3VycmVudE93bmVyID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudDsKKyAgICB2YXIgaWQgPSBj dXJyZW50T3duZXIgJiYgY3VycmVudE93bmVyLl9kZWJ1Z0lEOworCisgICAgaW5mbyArPSBSZWFj dENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKGlkKTsKKyAgICByZXR1cm4g aW5mbzsKKyAgfSwKKyAgZ2V0U3RhY2tBZGRlbmR1bUJ5SUQ6IGZ1bmN0aW9uIChpZCkgeworICAg IHZhciBpbmZvID0gJyc7CisgICAgd2hpbGUgKGlkKSB7CisgICAgICBpbmZvICs9IGRlc2NyaWJl SUQoaWQpOworICAgICAgaWQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFBhcmVudElEKGlk KTsKKyAgICB9CisgICAgcmV0dXJuIGluZm87CisgIH0sCisgIGdldENoaWxkSURzOiBmdW5jdGlv biAoaWQpIHsKKyAgICB2YXIgaXRlbSA9IGdldEl0ZW0oaWQpOworICAgIHJldHVybiBpdGVtID8g aXRlbS5jaGlsZElEcyA6IFtdOworICB9LAorICBnZXREaXNwbGF5TmFtZTogZnVuY3Rpb24gKGlk KSB7CisgICAgdmFyIGVsZW1lbnQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldEVsZW1lbnQo aWQpOworICAgIGlmICghZWxlbWVudCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAg IHJldHVybiBnZXREaXNwbGF5TmFtZShlbGVtZW50KTsKKyAgfSwKKyAgZ2V0RWxlbWVudDogZnVu Y3Rpb24gKGlkKSB7CisgICAgdmFyIGl0ZW0gPSBnZXRJdGVtKGlkKTsKKyAgICByZXR1cm4gaXRl bSA/IGl0ZW0uZWxlbWVudCA6IG51bGw7CisgIH0sCisgIGdldE93bmVySUQ6IGZ1bmN0aW9uIChp ZCkgeworICAgIHZhciBlbGVtZW50ID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRFbGVtZW50 KGlkKTsKKyAgICBpZiAoIWVsZW1lbnQgfHwgIWVsZW1lbnQuX293bmVyKSB7CisgICAgICByZXR1 cm4gbnVsbDsKKyAgICB9CisgICAgcmV0dXJuIGVsZW1lbnQuX293bmVyLl9kZWJ1Z0lEOworICB9 LAorICBnZXRQYXJlbnRJRDogZnVuY3Rpb24gKGlkKSB7CisgICAgdmFyIGl0ZW0gPSBnZXRJdGVt KGlkKTsKKyAgICByZXR1cm4gaXRlbSA/IGl0ZW0ucGFyZW50SUQgOiBudWxsOworICB9LAorICBn ZXRTb3VyY2U6IGZ1bmN0aW9uIChpZCkgeworICAgIHZhciBpdGVtID0gZ2V0SXRlbShpZCk7Cisg ICAgdmFyIGVsZW1lbnQgPSBpdGVtID8gaXRlbS5lbGVtZW50IDogbnVsbDsKKyAgICB2YXIgc291 cmNlID0gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudC5fc291cmNlIDogbnVsbDsKKyAgICByZXR1 cm4gc291cmNlOworICB9LAorICBnZXRUZXh0OiBmdW5jdGlvbiAoaWQpIHsKKyAgICB2YXIgZWxl bWVudCA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0RWxlbWVudChpZCk7CisgICAgaWYgKHR5 cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykgeworICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAg fSBlbHNlIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ251bWJlcicpIHsKKyAgICAgIHJldHVybiAn JyArIGVsZW1lbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAg fSwKKyAgZ2V0VXBkYXRlQ291bnQ6IGZ1bmN0aW9uIChpZCkgeworICAgIHZhciBpdGVtID0gZ2V0 SXRlbShpZCk7CisgICAgcmV0dXJuIGl0ZW0gPyBpdGVtLnVwZGF0ZUNvdW50IDogMDsKKyAgfSwK KworCisgIGdldFJvb3RJRHM6IGdldFJvb3RJRHMsCisgIGdldFJlZ2lzdGVyZWRJRHM6IGdldEl0 ZW1JRHMKK307CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RDb21wb25lbnRUcmVlSG9vazsKXCBO byBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMv dmVuZG9yL3JlYWN0L2xpYi9SZWFjdENvbXBvbmVudFRyZWVIb29rVU1EU2hpbS5qcyBiL3dlYi9w Z2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL1JlYWN0Q29tcG9uZW50VHJlZUhvb2tVTURT aGltLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi4wMDMzNWIzNgotLS0g L2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL1JlYWN0 Q29tcG9uZW50VHJlZUhvb2tVTURTaGltLmpzCkBAIC0wLDAgKzEsMTcgQEAKKy8qKgorICogQ29w eXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2 ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0 eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGly ZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBh dGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUg ZGlyZWN0b3J5LgorICoKKyAqLworCisvKiBnbG9iYWxzIFJlYWN0ICovCisKKyd1c2Ugc3RyaWN0 JzsKKwordmFyIFJlYWN0SW50ZXJuYWxzID0gUmVhY3QuX19TRUNSRVRfSU5URVJOQUxTX0RPX05P VF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ7CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RJbnRl cm5hbHMuUmVhY3RDb21wb25lbnRUcmVlSG9vazsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxl CmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0L2xpYi9SZWFjdENv bXBvbmVudFdpdGhQdXJlUmVuZGVyTWl4aW4uanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9y L3JlYWN0L2xpYi9SZWFjdENvbXBvbmVudFdpdGhQdXJlUmVuZGVyTWl4aW4uanMKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjZmMzg2OGI4Ci0tLSAvZGV2L251bGwKKysrIGIv d2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvUmVhY3RDb21wb25lbnRXaXRoUHVy ZVJlbmRlck1peGluLmpzCkBAIC0wLDAgKzEsNDcgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMt cHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog VGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2Ug Zm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRo aXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMg Y2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5Lgor ICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBzaGFsbG93Q29tcGFyZSA9IHJlcXVpcmUo Jy4vc2hhbGxvd0NvbXBhcmUnKTsKKworLyoqCisgKiBJZiB5b3VyIFJlYWN0IGNvbXBvbmVudCdz IHJlbmRlciBmdW5jdGlvbiBpcyAicHVyZSIsIGUuZy4gaXQgd2lsbCByZW5kZXIgdGhlCisgKiBz YW1lIHJlc3VsdCBnaXZlbiB0aGUgc2FtZSBwcm9wcyBhbmQgc3RhdGUsIHByb3ZpZGUgdGhpcyBt aXhpbiBmb3IgYQorICogY29uc2lkZXJhYmxlIHBlcmZvcm1hbmNlIGJvb3N0LgorICoKKyAqIE1v c3QgUmVhY3QgY29tcG9uZW50cyBoYXZlIHB1cmUgcmVuZGVyIGZ1bmN0aW9ucy4KKyAqCisgKiBF eGFtcGxlOgorICoKKyAqICAgdmFyIFJlYWN0Q29tcG9uZW50V2l0aFB1cmVSZW5kZXJNaXhpbiA9 CisgKiAgICAgcmVxdWlyZSgnUmVhY3RDb21wb25lbnRXaXRoUHVyZVJlbmRlck1peGluJyk7Cisg KiAgIFJlYWN0LmNyZWF0ZUNsYXNzKHsKKyAqICAgICBtaXhpbnM6IFtSZWFjdENvbXBvbmVudFdp dGhQdXJlUmVuZGVyTWl4aW5dLAorICoKKyAqICAgICByZW5kZXI6IGZ1bmN0aW9uKCkgeworICog ICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZX0+Zm9vPC9k aXY+OworICogICAgIH0KKyAqICAgfSk7CisgKgorICogTm90ZTogVGhpcyBvbmx5IGNoZWNrcyBz aGFsbG93IGVxdWFsaXR5IGZvciBwcm9wcyBhbmQgc3RhdGUuIElmIHRoZXNlIGNvbnRhaW4KKyAq IGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHRoaXMgbWl4aW4gbWF5IGhhdmUgZmFsc2UtbmVnYXRp dmVzIGZvciBkZWVwZXIKKyAqIGRpZmZlcmVuY2VzLiBPbmx5IG1peGluIHRvIGNvbXBvbmVudHMg d2hpY2ggaGF2ZSBzaW1wbGUgcHJvcHMgYW5kIHN0YXRlLCBvcgorICogdXNlIGBmb3JjZVVwZGF0 ZSgpYCB3aGVuIHlvdSBrbm93IGRlZXAgZGF0YSBzdHJ1Y3R1cmVzIGhhdmUgY2hhbmdlZC4KKyAq CisgKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy9wdXJlLXJlbmRl ci1taXhpbi5odG1sCisgKi8KK3ZhciBSZWFjdENvbXBvbmVudFdpdGhQdXJlUmVuZGVyTWl4aW4g PSB7CisgIHNob3VsZENvbXBvbmVudFVwZGF0ZTogZnVuY3Rpb24gKG5leHRQcm9wcywgbmV4dFN0 YXRlKSB7CisgICAgcmV0dXJuIHNoYWxsb3dDb21wYXJlKHRoaXMsIG5leHRQcm9wcywgbmV4dFN0 YXRlKTsKKyAgfQorfTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdENvbXBvbmVudFdpdGhQdXJl UmVuZGVyTWl4aW47ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2Vi L3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvUmVhY3RDdXJyZW50T3duZXIuanMgYi93 ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0L2xpYi9SZWFjdEN1cnJlbnRPd25lci5qcwpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uNWVjZjAzZTQKLS0tIC9kZXYvbnVs bAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0L2xpYi9SZWFjdEN1cnJlbnRP d25lci5qcwpAQCAtMCwwICsxLDMwIEBACisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQs IEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291 cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGlu IHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJj ZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBm b3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiAK KyAqLworCisndXNlIHN0cmljdCc7CisKKy8qKgorICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJl bnQgb3duZXIuCisgKgorICogVGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIGNvbXBvbmVudCB3aG8g c2hvdWxkIG93biBhbnkgY29tcG9uZW50cyB0aGF0IGFyZQorICogY3VycmVudGx5IGJlaW5nIGNv bnN0cnVjdGVkLgorICovCit2YXIgUmVhY3RDdXJyZW50T3duZXIgPSB7CisKKyAgLyoqCisgICAq IEBpbnRlcm5hbAorICAgKiBAdHlwZSB7UmVhY3RDb21wb25lbnR9CisgICAqLworICBjdXJyZW50 OiBudWxsCisKK307CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RDdXJyZW50T3duZXI7ClwgTm8g bmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3Zl bmRvci9yZWFjdC9saWIvUmVhY3RDdXJyZW50T3duZXJVTURTaGltLmpzIGIvd2ViL3BnYWRtaW4v c3RhdGljL3ZlbmRvci9yZWFjdC9saWIvUmVhY3RDdXJyZW50T3duZXJVTURTaGltLmpzCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi5hNTNmMGE1MwotLS0gL2Rldi9udWxsCisr KyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL1JlYWN0Q3VycmVudE93bmVy VU1EU2hpbS5qcwpAQCAtMCwwICsxLDE3IEBACisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNl bnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMg c291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5k IGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNv dXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBi ZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisg Ki8KKworLyogZ2xvYmFscyBSZWFjdCAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBSZWFjdElu dGVybmFscyA9IFJlYWN0Ll9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxM X0JFX0ZJUkVEOworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0SW50ZXJuYWxzLlJlYWN0Q3VycmVu dE93bmVyOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2Fk bWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL1JlYWN0RE9NRmFjdG9yaWVzLmpzIGIvd2ViL3Bn YWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvUmVhY3RET01GYWN0b3JpZXMuanMKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLmQ1YWFkNmRkCi0tLSAvZGV2L251bGwKKysr IGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvUmVhY3RET01GYWN0b3JpZXMu anMKQEAgLTAsMCArMSwxNjkgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFj ZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2Ug Y29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhl CisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRy ZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5k IGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisn dXNlIHN0cmljdCc7CisKK3ZhciBSZWFjdEVsZW1lbnQgPSByZXF1aXJlKCcuL1JlYWN0RWxlbWVu dCcpOworCisvKioKKyAqIENyZWF0ZSBhIGZhY3RvcnkgdGhhdCBjcmVhdGVzIEhUTUwgdGFnIGVs ZW1lbnRzLgorICoKKyAqIEBwcml2YXRlCisgKi8KK3ZhciBjcmVhdGVET01GYWN0b3J5ID0gUmVh Y3RFbGVtZW50LmNyZWF0ZUZhY3Rvcnk7CitpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdw cm9kdWN0aW9uJykgeworICB2YXIgUmVhY3RFbGVtZW50VmFsaWRhdG9yID0gcmVxdWlyZSgnLi9S ZWFjdEVsZW1lbnRWYWxpZGF0b3InKTsKKyAgY3JlYXRlRE9NRmFjdG9yeSA9IFJlYWN0RWxlbWVu dFZhbGlkYXRvci5jcmVhdGVGYWN0b3J5OworfQorCisvKioKKyAqIENyZWF0ZXMgYSBtYXBwaW5n IGZyb20gc3VwcG9ydGVkIEhUTUwgdGFncyB0byBgUmVhY3RET01Db21wb25lbnRgIGNsYXNzZXMu CisgKiBUaGlzIGlzIGFsc28gYWNjZXNzaWJsZSB2aWEgYFJlYWN0LkRPTWAuCisgKgorICogQHB1 YmxpYworICovCit2YXIgUmVhY3RET01GYWN0b3JpZXMgPSB7CisgIGE6IGNyZWF0ZURPTUZhY3Rv cnkoJ2EnKSwKKyAgYWJicjogY3JlYXRlRE9NRmFjdG9yeSgnYWJicicpLAorICBhZGRyZXNzOiBj cmVhdGVET01GYWN0b3J5KCdhZGRyZXNzJyksCisgIGFyZWE6IGNyZWF0ZURPTUZhY3RvcnkoJ2Fy ZWEnKSwKKyAgYXJ0aWNsZTogY3JlYXRlRE9NRmFjdG9yeSgnYXJ0aWNsZScpLAorICBhc2lkZTog Y3JlYXRlRE9NRmFjdG9yeSgnYXNpZGUnKSwKKyAgYXVkaW86IGNyZWF0ZURPTUZhY3RvcnkoJ2F1 ZGlvJyksCisgIGI6IGNyZWF0ZURPTUZhY3RvcnkoJ2InKSwKKyAgYmFzZTogY3JlYXRlRE9NRmFj dG9yeSgnYmFzZScpLAorICBiZGk6IGNyZWF0ZURPTUZhY3RvcnkoJ2JkaScpLAorICBiZG86IGNy ZWF0ZURPTUZhY3RvcnkoJ2JkbycpLAorICBiaWc6IGNyZWF0ZURPTUZhY3RvcnkoJ2JpZycpLAor ICBibG9ja3F1b3RlOiBjcmVhdGVET01GYWN0b3J5KCdibG9ja3F1b3RlJyksCisgIGJvZHk6IGNy ZWF0ZURPTUZhY3RvcnkoJ2JvZHknKSwKKyAgYnI6IGNyZWF0ZURPTUZhY3RvcnkoJ2JyJyksCisg IGJ1dHRvbjogY3JlYXRlRE9NRmFjdG9yeSgnYnV0dG9uJyksCisgIGNhbnZhczogY3JlYXRlRE9N RmFjdG9yeSgnY2FudmFzJyksCisgIGNhcHRpb246IGNyZWF0ZURPTUZhY3RvcnkoJ2NhcHRpb24n KSwKKyAgY2l0ZTogY3JlYXRlRE9NRmFjdG9yeSgnY2l0ZScpLAorICBjb2RlOiBjcmVhdGVET01G YWN0b3J5KCdjb2RlJyksCisgIGNvbDogY3JlYXRlRE9NRmFjdG9yeSgnY29sJyksCisgIGNvbGdy b3VwOiBjcmVhdGVET01GYWN0b3J5KCdjb2xncm91cCcpLAorICBkYXRhOiBjcmVhdGVET01GYWN0 b3J5KCdkYXRhJyksCisgIGRhdGFsaXN0OiBjcmVhdGVET01GYWN0b3J5KCdkYXRhbGlzdCcpLAor ICBkZDogY3JlYXRlRE9NRmFjdG9yeSgnZGQnKSwKKyAgZGVsOiBjcmVhdGVET01GYWN0b3J5KCdk ZWwnKSwKKyAgZGV0YWlsczogY3JlYXRlRE9NRmFjdG9yeSgnZGV0YWlscycpLAorICBkZm46IGNy ZWF0ZURPTUZhY3RvcnkoJ2RmbicpLAorICBkaWFsb2c6IGNyZWF0ZURPTUZhY3RvcnkoJ2RpYWxv ZycpLAorICBkaXY6IGNyZWF0ZURPTUZhY3RvcnkoJ2RpdicpLAorICBkbDogY3JlYXRlRE9NRmFj dG9yeSgnZGwnKSwKKyAgZHQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2R0JyksCisgIGVtOiBjcmVhdGVE T01GYWN0b3J5KCdlbScpLAorICBlbWJlZDogY3JlYXRlRE9NRmFjdG9yeSgnZW1iZWQnKSwKKyAg ZmllbGRzZXQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2ZpZWxkc2V0JyksCisgIGZpZ2NhcHRpb246IGNy ZWF0ZURPTUZhY3RvcnkoJ2ZpZ2NhcHRpb24nKSwKKyAgZmlndXJlOiBjcmVhdGVET01GYWN0b3J5 KCdmaWd1cmUnKSwKKyAgZm9vdGVyOiBjcmVhdGVET01GYWN0b3J5KCdmb290ZXInKSwKKyAgZm9y bTogY3JlYXRlRE9NRmFjdG9yeSgnZm9ybScpLAorICBoMTogY3JlYXRlRE9NRmFjdG9yeSgnaDEn KSwKKyAgaDI6IGNyZWF0ZURPTUZhY3RvcnkoJ2gyJyksCisgIGgzOiBjcmVhdGVET01GYWN0b3J5 KCdoMycpLAorICBoNDogY3JlYXRlRE9NRmFjdG9yeSgnaDQnKSwKKyAgaDU6IGNyZWF0ZURPTUZh Y3RvcnkoJ2g1JyksCisgIGg2OiBjcmVhdGVET01GYWN0b3J5KCdoNicpLAorICBoZWFkOiBjcmVh dGVET01GYWN0b3J5KCdoZWFkJyksCisgIGhlYWRlcjogY3JlYXRlRE9NRmFjdG9yeSgnaGVhZGVy JyksCisgIGhncm91cDogY3JlYXRlRE9NRmFjdG9yeSgnaGdyb3VwJyksCisgIGhyOiBjcmVhdGVE T01GYWN0b3J5KCdocicpLAorICBodG1sOiBjcmVhdGVET01GYWN0b3J5KCdodG1sJyksCisgIGk6 IGNyZWF0ZURPTUZhY3RvcnkoJ2knKSwKKyAgaWZyYW1lOiBjcmVhdGVET01GYWN0b3J5KCdpZnJh bWUnKSwKKyAgaW1nOiBjcmVhdGVET01GYWN0b3J5KCdpbWcnKSwKKyAgaW5wdXQ6IGNyZWF0ZURP TUZhY3RvcnkoJ2lucHV0JyksCisgIGluczogY3JlYXRlRE9NRmFjdG9yeSgnaW5zJyksCisgIGti ZDogY3JlYXRlRE9NRmFjdG9yeSgna2JkJyksCisgIGtleWdlbjogY3JlYXRlRE9NRmFjdG9yeSgn a2V5Z2VuJyksCisgIGxhYmVsOiBjcmVhdGVET01GYWN0b3J5KCdsYWJlbCcpLAorICBsZWdlbmQ6 IGNyZWF0ZURPTUZhY3RvcnkoJ2xlZ2VuZCcpLAorICBsaTogY3JlYXRlRE9NRmFjdG9yeSgnbGkn KSwKKyAgbGluazogY3JlYXRlRE9NRmFjdG9yeSgnbGluaycpLAorICBtYWluOiBjcmVhdGVET01G YWN0b3J5KCdtYWluJyksCisgIG1hcDogY3JlYXRlRE9NRmFjdG9yeSgnbWFwJyksCisgIG1hcms6 IGNyZWF0ZURPTUZhY3RvcnkoJ21hcmsnKSwKKyAgbWVudTogY3JlYXRlRE9NRmFjdG9yeSgnbWVu dScpLAorICBtZW51aXRlbTogY3JlYXRlRE9NRmFjdG9yeSgnbWVudWl0ZW0nKSwKKyAgbWV0YTog Y3JlYXRlRE9NRmFjdG9yeSgnbWV0YScpLAorICBtZXRlcjogY3JlYXRlRE9NRmFjdG9yeSgnbWV0 ZXInKSwKKyAgbmF2OiBjcmVhdGVET01GYWN0b3J5KCduYXYnKSwKKyAgbm9zY3JpcHQ6IGNyZWF0 ZURPTUZhY3RvcnkoJ25vc2NyaXB0JyksCisgIG9iamVjdDogY3JlYXRlRE9NRmFjdG9yeSgnb2Jq ZWN0JyksCisgIG9sOiBjcmVhdGVET01GYWN0b3J5KCdvbCcpLAorICBvcHRncm91cDogY3JlYXRl RE9NRmFjdG9yeSgnb3B0Z3JvdXAnKSwKKyAgb3B0aW9uOiBjcmVhdGVET01GYWN0b3J5KCdvcHRp b24nKSwKKyAgb3V0cHV0OiBjcmVhdGVET01GYWN0b3J5KCdvdXRwdXQnKSwKKyAgcDogY3JlYXRl RE9NRmFjdG9yeSgncCcpLAorICBwYXJhbTogY3JlYXRlRE9NRmFjdG9yeSgncGFyYW0nKSwKKyAg cGljdHVyZTogY3JlYXRlRE9NRmFjdG9yeSgncGljdHVyZScpLAorICBwcmU6IGNyZWF0ZURPTUZh Y3RvcnkoJ3ByZScpLAorICBwcm9ncmVzczogY3JlYXRlRE9NRmFjdG9yeSgncHJvZ3Jlc3MnKSwK KyAgcTogY3JlYXRlRE9NRmFjdG9yeSgncScpLAorICBycDogY3JlYXRlRE9NRmFjdG9yeSgncnAn KSwKKyAgcnQ6IGNyZWF0ZURPTUZhY3RvcnkoJ3J0JyksCisgIHJ1Ynk6IGNyZWF0ZURPTUZhY3Rv cnkoJ3J1YnknKSwKKyAgczogY3JlYXRlRE9NRmFjdG9yeSgncycpLAorICBzYW1wOiBjcmVhdGVE T01GYWN0b3J5KCdzYW1wJyksCisgIHNjcmlwdDogY3JlYXRlRE9NRmFjdG9yeSgnc2NyaXB0Jyks CisgIHNlY3Rpb246IGNyZWF0ZURPTUZhY3RvcnkoJ3NlY3Rpb24nKSwKKyAgc2VsZWN0OiBjcmVh dGVET01GYWN0b3J5KCdzZWxlY3QnKSwKKyAgc21hbGw6IGNyZWF0ZURPTUZhY3RvcnkoJ3NtYWxs JyksCisgIHNvdXJjZTogY3JlYXRlRE9NRmFjdG9yeSgnc291cmNlJyksCisgIHNwYW46IGNyZWF0 ZURPTUZhY3RvcnkoJ3NwYW4nKSwKKyAgc3Ryb25nOiBjcmVhdGVET01GYWN0b3J5KCdzdHJvbmcn KSwKKyAgc3R5bGU6IGNyZWF0ZURPTUZhY3RvcnkoJ3N0eWxlJyksCisgIHN1YjogY3JlYXRlRE9N RmFjdG9yeSgnc3ViJyksCisgIHN1bW1hcnk6IGNyZWF0ZURPTUZhY3RvcnkoJ3N1bW1hcnknKSwK KyAgc3VwOiBjcmVhdGVET01GYWN0b3J5KCdzdXAnKSwKKyAgdGFibGU6IGNyZWF0ZURPTUZhY3Rv cnkoJ3RhYmxlJyksCisgIHRib2R5OiBjcmVhdGVET01GYWN0b3J5KCd0Ym9keScpLAorICB0ZDog Y3JlYXRlRE9NRmFjdG9yeSgndGQnKSwKKyAgdGV4dGFyZWE6IGNyZWF0ZURPTUZhY3RvcnkoJ3Rl eHRhcmVhJyksCisgIHRmb290OiBjcmVhdGVET01GYWN0b3J5KCd0Zm9vdCcpLAorICB0aDogY3Jl YXRlRE9NRmFjdG9yeSgndGgnKSwKKyAgdGhlYWQ6IGNyZWF0ZURPTUZhY3RvcnkoJ3RoZWFkJyks CisgIHRpbWU6IGNyZWF0ZURPTUZhY3RvcnkoJ3RpbWUnKSwKKyAgdGl0bGU6IGNyZWF0ZURPTUZh Y3RvcnkoJ3RpdGxlJyksCisgIHRyOiBjcmVhdGVET01GYWN0b3J5KCd0cicpLAorICB0cmFjazog Y3JlYXRlRE9NRmFjdG9yeSgndHJhY2snKSwKKyAgdTogY3JlYXRlRE9NRmFjdG9yeSgndScpLAor ICB1bDogY3JlYXRlRE9NRmFjdG9yeSgndWwnKSwKKyAgJ3Zhcic6IGNyZWF0ZURPTUZhY3Rvcnko J3ZhcicpLAorICB2aWRlbzogY3JlYXRlRE9NRmFjdG9yeSgndmlkZW8nKSwKKyAgd2JyOiBjcmVh dGVET01GYWN0b3J5KCd3YnInKSwKKworICAvLyBTVkcKKyAgY2lyY2xlOiBjcmVhdGVET01GYWN0 b3J5KCdjaXJjbGUnKSwKKyAgY2xpcFBhdGg6IGNyZWF0ZURPTUZhY3RvcnkoJ2NsaXBQYXRoJyks CisgIGRlZnM6IGNyZWF0ZURPTUZhY3RvcnkoJ2RlZnMnKSwKKyAgZWxsaXBzZTogY3JlYXRlRE9N RmFjdG9yeSgnZWxsaXBzZScpLAorICBnOiBjcmVhdGVET01GYWN0b3J5KCdnJyksCisgIGltYWdl OiBjcmVhdGVET01GYWN0b3J5KCdpbWFnZScpLAorICBsaW5lOiBjcmVhdGVET01GYWN0b3J5KCds aW5lJyksCisgIGxpbmVhckdyYWRpZW50OiBjcmVhdGVET01GYWN0b3J5KCdsaW5lYXJHcmFkaWVu dCcpLAorICBtYXNrOiBjcmVhdGVET01GYWN0b3J5KCdtYXNrJyksCisgIHBhdGg6IGNyZWF0ZURP TUZhY3RvcnkoJ3BhdGgnKSwKKyAgcGF0dGVybjogY3JlYXRlRE9NRmFjdG9yeSgncGF0dGVybicp LAorICBwb2x5Z29uOiBjcmVhdGVET01GYWN0b3J5KCdwb2x5Z29uJyksCisgIHBvbHlsaW5lOiBj cmVhdGVET01GYWN0b3J5KCdwb2x5bGluZScpLAorICByYWRpYWxHcmFkaWVudDogY3JlYXRlRE9N RmFjdG9yeSgncmFkaWFsR3JhZGllbnQnKSwKKyAgcmVjdDogY3JlYXRlRE9NRmFjdG9yeSgncmVj dCcpLAorICBzdG9wOiBjcmVhdGVET01GYWN0b3J5KCdzdG9wJyksCisgIHN2ZzogY3JlYXRlRE9N RmFjdG9yeSgnc3ZnJyksCisgIHRleHQ6IGNyZWF0ZURPTUZhY3RvcnkoJ3RleHQnKSwKKyAgdHNw YW46IGNyZWF0ZURPTUZhY3RvcnkoJ3RzcGFuJykKK307CisKK21vZHVsZS5leHBvcnRzID0gUmVh Y3RET01GYWN0b3JpZXM7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEv d2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvUmVhY3RFbGVtZW50LmpzIGIvd2Vi L3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvUmVhY3RFbGVtZW50LmpzCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi45N2Y0YmYwMQotLS0gL2Rldi9udWxsCisrKyBi L3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL1JlYWN0RWxlbWVudC5qcwpAQCAt MCwwICsxLDM0MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywg SW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlz IGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJ Q0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4g YWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhl IFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3Ry aWN0JzsKKwordmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7CisKK3ZhciBS ZWFjdEN1cnJlbnRPd25lciA9IHJlcXVpcmUoJy4vUmVhY3RDdXJyZW50T3duZXInKTsKKwordmFy IHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7Cit2YXIgY2FuRGVmaW5lUHJv cGVydHkgPSByZXF1aXJlKCcuL2NhbkRlZmluZVByb3BlcnR5Jyk7Cit2YXIgaGFzT3duUHJvcGVy dHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5OworCit2YXIgUkVBQ1RfRUxFTUVO VF9UWVBFID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnRTeW1ib2wnKTsKKwordmFyIFJFU0VSVkVE X1BST1BTID0geworICBrZXk6IHRydWUsCisgIHJlZjogdHJ1ZSwKKyAgX19zZWxmOiB0cnVlLAor ICBfX3NvdXJjZTogdHJ1ZQorfTsKKwordmFyIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duLCBz cGVjaWFsUHJvcFJlZldhcm5pbmdTaG93bjsKKworZnVuY3Rpb24gaGFzVmFsaWRSZWYoY29uZmln KSB7CisgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAg aWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAncmVmJykpIHsKKyAgICAgIHZhciBnZXR0 ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ3JlZicpLmdldDsK KyAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7CisgICAgICAgIHJl dHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGNvbmZpZy5yZWYgIT09 IHVuZGVmaW5lZDsKK30KKworZnVuY3Rpb24gaGFzVmFsaWRLZXkoY29uZmlnKSB7CisgIGlmIChw cm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgaWYgKGhhc093blBy b3BlcnR5LmNhbGwoY29uZmlnLCAna2V5JykpIHsKKyAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3Qu Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ2tleScpLmdldDsKKyAgICAgIGlmIChn ZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsK KyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGNvbmZpZy5rZXkgIT09IHVuZGVmaW5lZDsK K30KKworZnVuY3Rpb24gZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlO YW1lKSB7CisgIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkgPSBmdW5jdGlvbiAoKSB7CisgICAg aWYgKCFzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93bikgeworICAgICAgc3BlY2lhbFByb3BLZXlX YXJuaW5nU2hvd24gPSB0cnVlOworICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9k dWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclczogYGtleWAgaXMgbm90IGEgcHJvcC4gVHJ5aW5n IHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVy bmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhl IGNoaWxkIGNvbXBvbmVudCwgeW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAn cHJvcC4gKGh0dHBzOi8vZmIubWUvcmVhY3Qtc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSkg OiB2b2lkIDA7CisgICAgfQorICB9OworICB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkuaXNSZWFjdFdh cm5pbmcgPSB0cnVlOworICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdrZXknLCB7Cisg ICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdLZXksCisgICAgY29uZmlndXJhYmxlOiB0cnVlCisg IH0pOworfQorCitmdW5jdGlvbiBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlz cGxheU5hbWUpIHsKKyAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ1JlZiA9IGZ1bmN0aW9uICgpIHsK KyAgICBpZiAoIXNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duKSB7CisgICAgICBzcGVjaWFsUHJv cFJlZldhcm5pbmdTaG93biA9IHRydWU7CisgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0g J3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJyVzOiBgcmVmYCBpcyBub3QgYSBwcm9wLiBU cnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcg cmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhp biB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQg JyArICdwcm9wLiAoaHR0cHM6Ly9mYi5tZS9yZWFjdC1zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlO YW1lKSA6IHZvaWQgMDsKKyAgICB9CisgIH07CisgIHdhcm5BYm91dEFjY2Vzc2luZ1JlZi5pc1Jl YWN0V2FybmluZyA9IHRydWU7CisgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ3JlZics IHsKKyAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ1JlZiwKKyAgICBjb25maWd1cmFibGU6IHRy dWUKKyAgfSk7Cit9CisKKy8qKgorICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IFJl YWN0IGVsZW1lbnQuIFRoaXMgbm8gbG9uZ2VyIGFkaGVyZXMgdG8KKyAqIHRoZSBjbGFzcyBwYXR0 ZXJuLCBzbyBkbyBub3QgdXNlIG5ldyB0byBjYWxsIGl0LiBBbHNvLCBubyBpbnN0YW5jZW9mIGNo ZWNrCisgKiB3aWxsIHdvcmsuIEluc3RlYWQgdGVzdCAkJHR5cGVvZiBmaWVsZCBhZ2FpbnN0IFN5 bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSB0byBjaGVjaworICogaWYgc29tZXRoaW5nIGlzIGEg UmVhY3QgRWxlbWVudC4KKyAqCisgKiBAcGFyYW0geyp9IHR5cGUKKyAqIEBwYXJhbSB7Kn0ga2V5 CisgKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHJlZgorICogQHBhcmFtIHsqfSBzZWxmIEEgKnRl bXBvcmFyeSogaGVscGVyIHRvIGRldGVjdCBwbGFjZXMgd2hlcmUgYHRoaXNgIGlzCisgKiBkaWZm ZXJlbnQgZnJvbSB0aGUgYG93bmVyYCB3aGVuIFJlYWN0LmNyZWF0ZUVsZW1lbnQgaXMgY2FsbGVk LCBzbyB0aGF0IHdlCisgKiBjYW4gd2Fybi4gV2Ugd2FudCB0byBnZXQgcmlkIG9mIG93bmVyIGFu ZCByZXBsYWNlIHN0cmluZyBgcmVmYHMgd2l0aCBhcnJvdworICogZnVuY3Rpb25zLCBhbmQgYXMg bG9uZyBhcyBgdGhpc2AgYW5kIG93bmVyIGFyZSB0aGUgc2FtZSwgdGhlcmUgd2lsbCBiZSBubwor ICogY2hhbmdlIGluIGJlaGF2aW9yLgorICogQHBhcmFtIHsqfSBzb3VyY2UgQW4gYW5ub3RhdGlv biBvYmplY3QgKGFkZGVkIGJ5IGEgdHJhbnNwaWxlciBvciBvdGhlcndpc2UpCisgKiBpbmRpY2F0 aW5nIGZpbGVuYW1lLCBsaW5lIG51bWJlciwgYW5kL29yIG90aGVyIGluZm9ybWF0aW9uLgorICog QHBhcmFtIHsqfSBvd25lcgorICogQHBhcmFtIHsqfSBwcm9wcworICogQGludGVybmFsCisgKi8K K3ZhciBSZWFjdEVsZW1lbnQgPSBmdW5jdGlvbiAodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJj ZSwgb3duZXIsIHByb3BzKSB7CisgIHZhciBlbGVtZW50ID0geworICAgIC8vIFRoaXMgdGFnIGFs bG93IHVzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgYXMgYSBSZWFjdCBFbGVtZW50CisgICAg JCR0eXBlb2Y6IFJFQUNUX0VMRU1FTlRfVFlQRSwKKworICAgIC8vIEJ1aWx0LWluIHByb3BlcnRp ZXMgdGhhdCBiZWxvbmcgb24gdGhlIGVsZW1lbnQKKyAgICB0eXBlOiB0eXBlLAorICAgIGtleTog a2V5LAorICAgIHJlZjogcmVmLAorICAgIHByb3BzOiBwcm9wcywKKworICAgIC8vIFJlY29yZCB0 aGUgY29tcG9uZW50IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGlzIGVsZW1lbnQuCisgICAg X293bmVyOiBvd25lcgorICB9OworCisgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3By b2R1Y3Rpb24nKSB7CisgICAgLy8gVGhlIHZhbGlkYXRpb24gZmxhZyBpcyBjdXJyZW50bHkgbXV0 YXRpdmUuIFdlIHB1dCBpdCBvbgorICAgIC8vIGFuIGV4dGVybmFsIGJhY2tpbmcgc3RvcmUgc28g dGhhdCB3ZSBjYW4gZnJlZXplIHRoZSB3aG9sZSBvYmplY3QuCisgICAgLy8gVGhpcyBjYW4gYmUg cmVwbGFjZWQgd2l0aCBhIFdlYWtNYXAgb25jZSB0aGV5IGFyZSBpbXBsZW1lbnRlZCBpbgorICAg IC8vIGNvbW1vbmx5IHVzZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzLgorICAgIGVsZW1lbnQu X3N0b3JlID0ge307CisKKyAgICAvLyBUbyBtYWtlIGNvbXBhcmluZyBSZWFjdEVsZW1lbnRzIGVh c2llciBmb3IgdGVzdGluZyBwdXJwb3Nlcywgd2UgbWFrZQorICAgIC8vIHRoZSB2YWxpZGF0aW9u IGZsYWcgbm9uLWVudW1lcmFibGUgKHdoZXJlIHBvc3NpYmxlLCB3aGljaCBzaG91bGQKKyAgICAv LyBpbmNsdWRlIGV2ZXJ5IGVudmlyb25tZW50IHdlIHJ1biB0ZXN0cyBpbiksIHNvIHRoZSB0ZXN0 IGZyYW1ld29yaworICAgIC8vIGlnbm9yZXMgaXQuCisgICAgaWYgKGNhbkRlZmluZVByb3BlcnR5 KSB7CisgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudC5fc3RvcmUsICd2YWxpZGF0 ZWQnLCB7CisgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCisgICAgICAgIGVudW1lcmFibGU6 IGZhbHNlLAorICAgICAgICB3cml0YWJsZTogdHJ1ZSwKKyAgICAgICAgdmFsdWU6IGZhbHNlCisg ICAgICB9KTsKKyAgICAgIC8vIHNlbGYgYW5kIHNvdXJjZSBhcmUgREVWIG9ubHkgcHJvcGVydGll cy4KKyAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NlbGYnLCB7CisgICAg ICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCisgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAorICAg ICAgICB3cml0YWJsZTogZmFsc2UsCisgICAgICAgIHZhbHVlOiBzZWxmCisgICAgICB9KTsKKyAg ICAgIC8vIFR3byBlbGVtZW50cyBjcmVhdGVkIGluIHR3byBkaWZmZXJlbnQgcGxhY2VzIHNob3Vs ZCBiZSBjb25zaWRlcmVkCisgICAgICAvLyBlcXVhbCBmb3IgdGVzdGluZyBwdXJwb3NlcyBhbmQg dGhlcmVmb3JlIHdlIGhpZGUgaXQgZnJvbSBlbnVtZXJhdGlvbi4KKyAgICAgIE9iamVjdC5kZWZp bmVQcm9wZXJ0eShlbGVtZW50LCAnX3NvdXJjZScsIHsKKyAgICAgICAgY29uZmlndXJhYmxlOiBm YWxzZSwKKyAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCisgICAgICAgIHdyaXRhYmxlOiBmYWxz ZSwKKyAgICAgICAgdmFsdWU6IHNvdXJjZQorICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAg IGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IGZhbHNlOworICAgICAgZWxlbWVudC5fc2VsZiA9 IHNlbGY7CisgICAgICBlbGVtZW50Ll9zb3VyY2UgPSBzb3VyY2U7CisgICAgfQorICAgIGlmIChP YmplY3QuZnJlZXplKSB7CisgICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQucHJvcHMpOworICAg ICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50KTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZWxlbWVu dDsKK307CisKKy8qKgorICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IG9m IHRoZSBnaXZlbiB0eXBlLgorICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0 L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNyZWF0ZWVsZW1lbnQKKyAqLworUmVhY3RF bGVtZW50LmNyZWF0ZUVsZW1lbnQgPSBmdW5jdGlvbiAodHlwZSwgY29uZmlnLCBjaGlsZHJlbikg eworICB2YXIgcHJvcE5hbWU7CisKKyAgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZAor ICB2YXIgcHJvcHMgPSB7fTsKKworICB2YXIga2V5ID0gbnVsbDsKKyAgdmFyIHJlZiA9IG51bGw7 CisgIHZhciBzZWxmID0gbnVsbDsKKyAgdmFyIHNvdXJjZSA9IG51bGw7CisKKyAgaWYgKGNvbmZp ZyAhPSBudWxsKSB7CisgICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHsKKyAgICAgIHJlZiA9 IGNvbmZpZy5yZWY7CisgICAgfQorICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7CisgICAg ICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7CisgICAgfQorCisgICAgc2VsZiA9IGNvbmZpZy5fX3Nl bGYgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zZWxmOworICAgIHNvdXJjZSA9IGNv bmZpZy5fX3NvdXJjZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNvbmZpZy5fX3NvdXJjZTsKKyAg ICAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gYSBuZXcgcHJvcHMgb2JqZWN0 CisgICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHsKKyAgICAgIGlmIChoYXNPd25Qcm9wZXJ0 eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0 eShwcm9wTmFtZSkpIHsKKyAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1l XTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBDaGlsZHJlbiBjYW4gYmUgbW9yZSB0aGFu IG9uZSBhcmd1bWVudCwgYW5kIHRob3NlIGFyZSB0cmFuc2ZlcnJlZCBvbnRvCisgIC8vIHRoZSBu ZXdseSBhbGxvY2F0ZWQgcHJvcHMgb2JqZWN0LgorICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1 bWVudHMubGVuZ3RoIC0gMjsKKyAgaWYgKGNoaWxkcmVuTGVuZ3RoID09PSAxKSB7CisgICAgcHJv cHMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKKyAgfSBlbHNlIGlmIChjaGlsZHJlbkxlbmd0aCA+IDEp IHsKKyAgICB2YXIgY2hpbGRBcnJheSA9IEFycmF5KGNoaWxkcmVuTGVuZ3RoKTsKKyAgICBmb3Ig KHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHsKKyAgICAgIGNoaWxkQXJyYXlb aV0gPSBhcmd1bWVudHNbaSArIDJdOworICAgIH0KKyAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9F TlYgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgaWYgKE9iamVjdC5mcmVlemUpIHsKKyAgICAg ICAgT2JqZWN0LmZyZWV6ZShjaGlsZEFycmF5KTsKKyAgICAgIH0KKyAgICB9CisgICAgcHJvcHMu Y2hpbGRyZW4gPSBjaGlsZEFycmF5OworICB9CisKKyAgLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3Bz CisgIGlmICh0eXBlICYmIHR5cGUuZGVmYXVsdFByb3BzKSB7CisgICAgdmFyIGRlZmF1bHRQcm9w cyA9IHR5cGUuZGVmYXVsdFByb3BzOworICAgIGZvciAocHJvcE5hbWUgaW4gZGVmYXVsdFByb3Bz KSB7CisgICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAg cHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTsKKyAgICAgIH0KKyAgICB9 CisgIH0KKyAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAg ICBpZiAoa2V5IHx8IHJlZikgeworICAgICAgaWYgKHR5cGVvZiBwcm9wcy4kJHR5cGVvZiA9PT0g J3VuZGVmaW5lZCcgfHwgcHJvcHMuJCR0eXBlb2YgIT09IFJFQUNUX0VMRU1FTlRfVFlQRSkgewor ICAgICAgICB2YXIgZGlzcGxheU5hbWUgPSB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyA/IHR5 cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8ICdVbmtub3duJyA6IHR5cGU7CisgICAgICAg IGlmIChrZXkpIHsKKyAgICAgICAgICBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywg ZGlzcGxheU5hbWUpOworICAgICAgICB9CisgICAgICAgIGlmIChyZWYpIHsKKyAgICAgICAgICBk ZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpOworICAgICAgICB9 CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBSZWFjdEVsZW1lbnQodHlwZSwga2V5LCBy ZWYsIHNlbGYsIHNvdXJjZSwgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCwgcHJvcHMpOworfTsK KworLyoqCisgKiBSZXR1cm4gYSBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIFJlYWN0RWxlbWVudHMg b2YgYSBnaXZlbiB0eXBlLgorICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0 L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNyZWF0ZWZhY3RvcnkKKyAqLworUmVhY3RF bGVtZW50LmNyZWF0ZUZhY3RvcnkgPSBmdW5jdGlvbiAodHlwZSkgeworICB2YXIgZmFjdG9yeSA9 IFJlYWN0RWxlbWVudC5jcmVhdGVFbGVtZW50LmJpbmQobnVsbCwgdHlwZSk7CisgIC8vIEV4cG9z ZSB0aGUgdHlwZSBvbiB0aGUgZmFjdG9yeSBhbmQgdGhlIHByb3RvdHlwZSBzbyB0aGF0IGl0IGNh biBiZQorICAvLyBlYXNpbHkgYWNjZXNzZWQgb24gZWxlbWVudHMuIEUuZy4gYDxGb28gLz4udHlw ZSA9PT0gRm9vYC4KKyAgLy8gVGhpcyBzaG91bGQgbm90IGJlIG5hbWVkIGBjb25zdHJ1Y3RvcmAg c2luY2UgdGhpcyBtYXkgbm90IGJlIHRoZSBmdW5jdGlvbgorICAvLyB0aGF0IGNyZWF0ZWQgdGhl IGVsZW1lbnQsIGFuZCBpdCBtYXkgbm90IGV2ZW4gYmUgYSBjb25zdHJ1Y3Rvci4KKyAgLy8gTGVn YWN5IGhvb2sgVE9ETzogV2FybiBpZiB0aGlzIGlzIGFjY2Vzc2VkCisgIGZhY3RvcnkudHlwZSA9 IHR5cGU7CisgIHJldHVybiBmYWN0b3J5OworfTsKKworUmVhY3RFbGVtZW50LmNsb25lQW5kUmVw bGFjZUtleSA9IGZ1bmN0aW9uIChvbGRFbGVtZW50LCBuZXdLZXkpIHsKKyAgdmFyIG5ld0VsZW1l bnQgPSBSZWFjdEVsZW1lbnQob2xkRWxlbWVudC50eXBlLCBuZXdLZXksIG9sZEVsZW1lbnQucmVm LCBvbGRFbGVtZW50Ll9zZWxmLCBvbGRFbGVtZW50Ll9zb3VyY2UsIG9sZEVsZW1lbnQuX293bmVy LCBvbGRFbGVtZW50LnByb3BzKTsKKworICByZXR1cm4gbmV3RWxlbWVudDsKK307CisKKy8qKgor ICogQ2xvbmUgYW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQgdXNpbmcgZWxlbWVudCBhcyB0 aGUgc3RhcnRpbmcgcG9pbnQuCisgKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVh Y3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0bWwjcmVhY3QuY2xvbmVlbGVtZW50CisgKi8KK1JlYWN0 RWxlbWVudC5jbG9uZUVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCwgY29uZmlnLCBjaGlsZHJl bikgeworICB2YXIgcHJvcE5hbWU7CisKKyAgLy8gT3JpZ2luYWwgcHJvcHMgYXJlIGNvcGllZAor ICB2YXIgcHJvcHMgPSBfYXNzaWduKHt9LCBlbGVtZW50LnByb3BzKTsKKworICAvLyBSZXNlcnZl ZCBuYW1lcyBhcmUgZXh0cmFjdGVkCisgIHZhciBrZXkgPSBlbGVtZW50LmtleTsKKyAgdmFyIHJl ZiA9IGVsZW1lbnQucmVmOworICAvLyBTZWxmIGlzIHByZXNlcnZlZCBzaW5jZSB0aGUgb3duZXIg aXMgcHJlc2VydmVkLgorICB2YXIgc2VsZiA9IGVsZW1lbnQuX3NlbGY7CisgIC8vIFNvdXJjZSBp cyBwcmVzZXJ2ZWQgc2luY2UgY2xvbmVFbGVtZW50IGlzIHVubGlrZWx5IHRvIGJlIHRhcmdldGVk IGJ5IGEKKyAgLy8gdHJhbnNwaWxlciwgYW5kIHRoZSBvcmlnaW5hbCBzb3VyY2UgaXMgcHJvYmFi bHkgYSBiZXR0ZXIgaW5kaWNhdG9yIG9mIHRoZQorICAvLyB0cnVlIG93bmVyLgorICB2YXIgc291 cmNlID0gZWxlbWVudC5fc291cmNlOworCisgIC8vIE93bmVyIHdpbGwgYmUgcHJlc2VydmVkLCB1 bmxlc3MgcmVmIGlzIG92ZXJyaWRkZW4KKyAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7CisK KyAgaWYgKGNvbmZpZyAhPSBudWxsKSB7CisgICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHsK KyAgICAgIC8vIFNpbGVudGx5IHN0ZWFsIHRoZSByZWYgZnJvbSB0aGUgcGFyZW50LgorICAgICAg cmVmID0gY29uZmlnLnJlZjsKKyAgICAgIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVu dDsKKyAgICB9CisgICAgaWYgKGhhc1ZhbGlkS2V5KGNvbmZpZykpIHsKKyAgICAgIGtleSA9ICcn ICsgY29uZmlnLmtleTsKKyAgICB9CisKKyAgICAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBvdmVy cmlkZSBleGlzdGluZyBwcm9wcworICAgIHZhciBkZWZhdWx0UHJvcHM7CisgICAgaWYgKGVsZW1l bnQudHlwZSAmJiBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzKSB7CisgICAgICBkZWZhdWx0UHJv cHMgPSBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzOworICAgIH0KKyAgICBmb3IgKHByb3BOYW1l IGluIGNvbmZpZykgeworICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBwcm9w TmFtZSkgJiYgIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkgeworICAg ICAgICBpZiAoY29uZmlnW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkICYmIGRlZmF1bHRQcm9wcyAh PT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzCisgICAg ICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTsKKyAgICAgICAg fSBlbHNlIHsKKyAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBjb25maWdbcHJvcE5hbWVdOwor ICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gQ2hpbGRyZW4gY2FuIGJlIG1v cmUgdGhhbiBvbmUgYXJndW1lbnQsIGFuZCB0aG9zZSBhcmUgdHJhbnNmZXJyZWQgb250bworICAv LyB0aGUgbmV3bHkgYWxsb2NhdGVkIHByb3BzIG9iamVjdC4KKyAgdmFyIGNoaWxkcmVuTGVuZ3Ro ID0gYXJndW1lbnRzLmxlbmd0aCAtIDI7CisgIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSkgewor ICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47CisgIH0gZWxzZSBpZiAoY2hpbGRyZW5MZW5n dGggPiAxKSB7CisgICAgdmFyIGNoaWxkQXJyYXkgPSBBcnJheShjaGlsZHJlbkxlbmd0aCk7Cisg ICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7CisgICAgICBjaGls ZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTsKKyAgICB9CisgICAgcHJvcHMuY2hpbGRyZW4g PSBjaGlsZEFycmF5OworICB9CisKKyAgcmV0dXJuIFJlYWN0RWxlbWVudChlbGVtZW50LnR5cGUs IGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcyk7Cit9OworCisvKioKKyAqIFZl cmlmaWVzIHRoZSBvYmplY3QgaXMgYSBSZWFjdEVsZW1lbnQuCisgKiBTZWUgaHR0cHM6Ly9mYWNl Ym9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0bWwjcmVhY3QuaXN2YWxp ZGVsZW1lbnQKKyAqIEBwYXJhbSB7P29iamVjdH0gb2JqZWN0CisgKiBAcmV0dXJuIHtib29sZWFu fSBUcnVlIGlmIGBvYmplY3RgIGlzIGEgdmFsaWQgY29tcG9uZW50LgorICogQGZpbmFsCisgKi8K K1JlYWN0RWxlbWVudC5pc1ZhbGlkRWxlbWVudCA9IGZ1bmN0aW9uIChvYmplY3QpIHsKKyAgcmV0 dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmpl Y3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTsKK307CisKK21vZHVsZS5leHBvcnRz ID0gUmVhY3RFbGVtZW50OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBh L3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL1JlYWN0RWxlbWVudFN5bWJvbC5q cyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL1JlYWN0RWxlbWVudFN5bWJv bC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uYzEzNzY1YjkKLS0tIC9k ZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0L2xpYi9SZWFjdEVs ZW1lbnRTeW1ib2wuanMKQEAgLTAsMCArMSwxOSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxNC1w cmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBU aGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBm b3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhp cyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBj YW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisg KgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOworCisvLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFn IHRoZSBSZWFjdEVsZW1lbnQgdHlwZS4gSWYgdGhlcmUgaXMgbm8gbmF0aXZlIFN5bWJvbAorLy8g bm9yIHBvbHlmaWxsLCB0aGVuIGEgcGxhaW4gbnVtYmVyIGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNl LgorCit2YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9u JyAmJiBTeW1ib2xbJ2ZvciddICYmIFN5bWJvbFsnZm9yJ10oJ3JlYWN0LmVsZW1lbnQnKSB8fCAw eGVhYzc7CisKK21vZHVsZS5leHBvcnRzID0gUkVBQ1RfRUxFTUVOVF9UWVBFOwpcIE5vIG5ld2xp bmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3Iv cmVhY3QvbGliL1JlYWN0RWxlbWVudFR5cGUuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9y L3JlYWN0L2xpYi9SZWFjdEVsZW1lbnRUeXBlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAwLi4yYjJlN2JiYwotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRp Yy92ZW5kb3IvcmVhY3QvbGliL1JlYWN0RWxlbWVudFR5cGUuanMKQEAgLTAsMCArMSwxMiBAQAor LyoqCisgKiBDb3B5cmlnaHQgMjAxNi1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJp Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVy IHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0 aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFu dAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBp biB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOwpcIE5v IG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92 ZW5kb3IvcmVhY3QvbGliL1JlYWN0RWxlbWVudFZhbGlkYXRvci5qcyBiL3dlYi9wZ2FkbWluL3N0 YXRpYy92ZW5kb3IvcmVhY3QvbGliL1JlYWN0RWxlbWVudFZhbGlkYXRvci5qcwpuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uZTFiYWVmM2MKLS0tIC9kZXYvbnVsbAorKysgYi93 ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0L2xpYi9SZWFjdEVsZW1lbnRWYWxpZGF0b3Iu anMKQEAgLTAsMCArMSwyMzMgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFj ZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2Ug Y29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhl CisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRy ZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5k IGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisv KioKKyAqIFJlYWN0RWxlbWVudFZhbGlkYXRvciBwcm92aWRlcyBhIHdyYXBwZXIgYXJvdW5kIGEg ZWxlbWVudCBmYWN0b3J5CisgKiB3aGljaCB2YWxpZGF0ZXMgdGhlIHByb3BzIHBhc3NlZCB0byB0 aGUgZWxlbWVudC4gVGhpcyBpcyBpbnRlbmRlZCB0byBiZQorICogdXNlZCBvbmx5IGluIERFViBh bmQgY291bGQgYmUgcmVwbGFjZWQgYnkgYSBzdGF0aWMgdHlwZSBjaGVja2VyIGZvciBsYW5ndWFn ZXMKKyAqIHRoYXQgc3VwcG9ydCBpdC4KKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBSZWFj dEN1cnJlbnRPd25lciA9IHJlcXVpcmUoJy4vUmVhY3RDdXJyZW50T3duZXInKTsKK3ZhciBSZWFj dENvbXBvbmVudFRyZWVIb29rID0gcmVxdWlyZSgnLi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7 Cit2YXIgUmVhY3RFbGVtZW50ID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnQnKTsKKwordmFyIGNo ZWNrUmVhY3RUeXBlU3BlYyA9IHJlcXVpcmUoJy4vY2hlY2tSZWFjdFR5cGVTcGVjJyk7CisKK3Zh ciBjYW5EZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vY2FuRGVmaW5lUHJvcGVydHknKTsKK3Zh ciBnZXRJdGVyYXRvckZuID0gcmVxdWlyZSgnLi9nZXRJdGVyYXRvckZuJyk7Cit2YXIgd2Fybmlu ZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTsKKworZnVuY3Rpb24gZ2V0RGVjbGFyYXRp b25FcnJvckFkZGVuZHVtKCkgeworICBpZiAoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkgewor ICAgIHZhciBuYW1lID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5nZXROYW1lKCk7CisgICAg aWYgKG5hbWUpIHsKKyAgICAgIHJldHVybiAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAn ICsgbmFtZSArICdgLic7CisgICAgfQorICB9CisgIHJldHVybiAnJzsKK30KKworLyoqCisgKiBX YXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9m IGNoaWxkcmVuIG9yCisgKiBvYmplY3Qga2V5cyBhcmUgbm90IHZhbGlkLiBUaGlzIGFsbG93cyB1 cyB0byBrZWVwIHRyYWNrIG9mIGNoaWxkcmVuIGJldHdlZW4KKyAqIHVwZGF0ZXMuCisgKi8KK3Zh ciBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB7fTsKKworZnVuY3Rpb24gZ2V0Q3VycmVudENvbXBv bmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKSB7CisgIHZhciBpbmZvID0gZ2V0RGVjbGFyYXRpb25F cnJvckFkZGVuZHVtKCk7CisKKyAgaWYgKCFpbmZvKSB7CisgICAgdmFyIHBhcmVudE5hbWUgPSB0 eXBlb2YgcGFyZW50VHlwZSA9PT0gJ3N0cmluZycgPyBwYXJlbnRUeXBlIDogcGFyZW50VHlwZS5k aXNwbGF5TmFtZSB8fCBwYXJlbnRUeXBlLm5hbWU7CisgICAgaWYgKHBhcmVudE5hbWUpIHsKKyAg ICAgIGluZm8gPSAnIENoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPCcgKyBw YXJlbnROYW1lICsgJz4uJzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGluZm87Cit9CisKKy8qKgor ICogV2FybiBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW4gZXhwbGljaXQga2V5IGFzc2ln bmVkIHRvIGl0LgorICogVGhpcyBlbGVtZW50IGlzIGluIGFuIGFycmF5LiBUaGUgYXJyYXkgY291 bGQgZ3JvdyBhbmQgc2hyaW5rIG9yIGJlCisgKiByZW9yZGVyZWQuIEFsbCBjaGlsZHJlbiB0aGF0 IGhhdmVuJ3QgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcmUgcmVxdWlyZWQgdG8KKyAqIGhhdmUg YSAia2V5IiBwcm9wZXJ0eSBhc3NpZ25lZCB0byBpdC4gRXJyb3Igc3RhdHVzZXMgYXJlIGNhY2hl ZCBzbyBhIHdhcm5pbmcKKyAqIHdpbGwgb25seSBiZSBzaG93biBvbmNlLgorICoKKyAqIEBpbnRl cm5hbAorICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnQgRWxlbWVudCB0aGF0IHJlcXVp cmVzIGEga2V5LgorICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIGVsZW1lbnQncyBwYXJlbnQncyB0 eXBlLgorICovCitmdW5jdGlvbiB2YWxpZGF0ZUV4cGxpY2l0S2V5KGVsZW1lbnQsIHBhcmVudFR5 cGUpIHsKKyAgaWYgKCFlbGVtZW50Ll9zdG9yZSB8fCBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQg fHwgZWxlbWVudC5rZXkgIT0gbnVsbCkgeworICAgIHJldHVybjsKKyAgfQorICBlbGVtZW50Ll9z dG9yZS52YWxpZGF0ZWQgPSB0cnVlOworCisgIHZhciBtZW1vaXplciA9IG93bmVySGFzS2V5VXNl V2FybmluZy51bmlxdWVLZXkgfHwgKG93bmVySGFzS2V5VXNlV2FybmluZy51bmlxdWVLZXkgPSB7 fSk7CisKKyAgdmFyIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8gPSBnZXRDdXJyZW50Q29tcG9u ZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpOworICBpZiAobWVtb2l6ZXJbY3VycmVudENvbXBvbmVu dEVycm9ySW5mb10pIHsKKyAgICByZXR1cm47CisgIH0KKyAgbWVtb2l6ZXJbY3VycmVudENvbXBv bmVudEVycm9ySW5mb10gPSB0cnVlOworCisgIC8vIFVzdWFsbHkgdGhlIGN1cnJlbnQgb3duZXIg aXMgdGhlIG9mZmVuZGVyLCBidXQgaWYgaXQgYWNjZXB0cyBjaGlsZHJlbiBhcyBhCisgIC8vIHBy b3BlcnR5LCBpdCBtYXkgYmUgdGhlIGNyZWF0b3Igb2YgdGhlIGNoaWxkIHRoYXQncyByZXNwb25z aWJsZSBmb3IKKyAgLy8gYXNzaWduaW5nIGl0IGEga2V5LgorICB2YXIgY2hpbGRPd25lciA9ICcn OworICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9vd25lciAhPT0g UmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkgeworICAgIC8vIEdpdmUgdGhlIGNvbXBvbmVudCB0 aGF0IG9yaWdpbmFsbHkgY3JlYXRlZCB0aGlzIGNoaWxkLgorICAgIGNoaWxkT3duZXIgPSAnIEl0 IHdhcyBwYXNzZWQgYSBjaGlsZCBmcm9tICcgKyBlbGVtZW50Ll9vd25lci5nZXROYW1lKCkgKyAn Lic7CisgIH0KKworICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2Fy bmluZyhmYWxzZSwgJ0VhY2ggY2hpbGQgaW4gYW4gYXJyYXkgb3IgaXRlcmF0b3Igc2hvdWxkIGhh dmUgYSB1bmlxdWUgImtleSIgcHJvcC4nICsgJyVzJXMgU2VlIGh0dHBzOi8vZmIubWUvcmVhY3Qt d2FybmluZy1rZXlzIGZvciBtb3JlIGluZm9ybWF0aW9uLiVzJywgY3VycmVudENvbXBvbmVudEVy cm9ySW5mbywgY2hpbGRPd25lciwgUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRDdXJyZW50U3Rh Y2tBZGRlbmR1bShlbGVtZW50KSkgOiB2b2lkIDA7Cit9CisKKy8qKgorICogRW5zdXJlIHRoYXQg ZXZlcnkgZWxlbWVudCBlaXRoZXIgaXMgcGFzc2VkIGluIGEgc3RhdGljIGxvY2F0aW9uLCBpbiBh bgorICogYXJyYXkgd2l0aCBhbiBleHBsaWNpdCBrZXlzIHByb3BlcnR5IGRlZmluZWQsIG9yIGlu IGFuIG9iamVjdCBsaXRlcmFsCisgKiB3aXRoIHZhbGlkIGtleSBwcm9wZXJ0eS4KKyAqCisgKiBA aW50ZXJuYWwKKyAqIEBwYXJhbSB7UmVhY3ROb2RlfSBub2RlIFN0YXRpY2FsbHkgcGFzc2VkIGNo aWxkIG9mIGFueSB0eXBlLgorICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIG5vZGUncyBwYXJlbnQn cyB0eXBlLgorICovCitmdW5jdGlvbiB2YWxpZGF0ZUNoaWxkS2V5cyhub2RlLCBwYXJlbnRUeXBl KSB7CisgIGlmICh0eXBlb2Ygbm9kZSAhPT0gJ29iamVjdCcpIHsKKyAgICByZXR1cm47CisgIH0K KyAgaWYgKEFycmF5LmlzQXJyYXkobm9kZSkpIHsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5v ZGUubGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciBjaGlsZCA9IG5vZGVbaV07CisgICAgICBpZiAo UmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50KGNoaWxkKSkgeworICAgICAgICB2YWxpZGF0ZUV4 cGxpY2l0S2V5KGNoaWxkLCBwYXJlbnRUeXBlKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBp ZiAoUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50KG5vZGUpKSB7CisgICAgLy8gVGhpcyBlbGVt ZW50IHdhcyBwYXNzZWQgaW4gYSB2YWxpZCBsb2NhdGlvbi4KKyAgICBpZiAobm9kZS5fc3RvcmUp IHsKKyAgICAgIG5vZGUuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7CisgICAgfQorICB9IGVsc2Ug aWYgKG5vZGUpIHsKKyAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obm9kZSk7Cisg ICAgLy8gRW50cnkgaXRlcmF0b3JzIHByb3ZpZGUgaW1wbGljaXQga2V5cy4KKyAgICBpZiAoaXRl cmF0b3JGbikgeworICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IG5vZGUuZW50cmllcykgeworICAg ICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobm9kZSk7CisgICAgICAgIHZhciBz dGVwOworICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7Cisg ICAgICAgICAgaWYgKFJlYWN0RWxlbWVudC5pc1ZhbGlkRWxlbWVudChzdGVwLnZhbHVlKSkgewor ICAgICAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShzdGVwLnZhbHVlLCBwYXJlbnRUeXBlKTsK KyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLyoqCisg KiBHaXZlbiBhbiBlbGVtZW50LCB2YWxpZGF0ZSB0aGF0IGl0cyBwcm9wcyBmb2xsb3cgdGhlIHBy b3BUeXBlcyBkZWZpbml0aW9uLAorICogcHJvdmlkZWQgYnkgdGhlIHR5cGUuCisgKgorICogQHBh cmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnQKKyAqLworZnVuY3Rpb24gdmFsaWRhdGVQcm9wVHlw ZXMoZWxlbWVudCkgeworICB2YXIgY29tcG9uZW50Q2xhc3MgPSBlbGVtZW50LnR5cGU7CisgIGlm ICh0eXBlb2YgY29tcG9uZW50Q2xhc3MgIT09ICdmdW5jdGlvbicpIHsKKyAgICByZXR1cm47Cisg IH0KKyAgdmFyIG5hbWUgPSBjb21wb25lbnRDbGFzcy5kaXNwbGF5TmFtZSB8fCBjb21wb25lbnRD bGFzcy5uYW1lOworICBpZiAoY29tcG9uZW50Q2xhc3MucHJvcFR5cGVzKSB7CisgICAgY2hlY2tS ZWFjdFR5cGVTcGVjKGNvbXBvbmVudENsYXNzLnByb3BUeXBlcywgZWxlbWVudC5wcm9wcywgJ3By b3AnLCBuYW1lLCBlbGVtZW50LCBudWxsKTsKKyAgfQorICBpZiAodHlwZW9mIGNvbXBvbmVudENs YXNzLmdldERlZmF1bHRQcm9wcyA9PT0gJ2Z1bmN0aW9uJykgeworICAgIHByb2Nlc3MuZW52Lk5P REVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGNvbXBvbmVudENsYXNzLmdldERlZmF1 bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCwgJ2dldERlZmF1bHRQcm9wcyBpcyBvbmx5IHVz ZWQgb24gY2xhc3NpYyBSZWFjdC5jcmVhdGVDbGFzcyAnICsgJ2RlZmluaXRpb25zLiBVc2UgYSBz dGF0aWMgcHJvcGVydHkgbmFtZWQgYGRlZmF1bHRQcm9wc2AgaW5zdGVhZC4nKSA6IHZvaWQgMDsK KyAgfQorfQorCit2YXIgUmVhY3RFbGVtZW50VmFsaWRhdG9yID0geworCisgIGNyZWF0ZUVsZW1l bnQ6IGZ1bmN0aW9uICh0eXBlLCBwcm9wcywgY2hpbGRyZW4pIHsKKyAgICB2YXIgdmFsaWRUeXBl ID0gdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24n OworICAgIC8vIFdlIHdhcm4gaW4gdGhpcyBjYXNlIGJ1dCBkb24ndCB0aHJvdy4gV2UgZXhwZWN0 IHRoZSBlbGVtZW50IGNyZWF0aW9uIHRvCisgICAgLy8gc3VjY2VlZCBhbmQgdGhlcmUgd2lsbCBs aWtlbHkgYmUgZXJyb3JzIGluIHJlbmRlci4KKyAgICBpZiAoIXZhbGlkVHlwZSkgeworICAgICAg aWYgKHR5cGVvZiB0eXBlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB0eXBlICE9PSAnc3RyaW5n JykgeworICAgICAgICB2YXIgaW5mbyA9ICcnOworICAgICAgICBpZiAodHlwZSA9PT0gdW5kZWZp bmVkIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmIE9iamVj dC5rZXlzKHR5cGUpLmxlbmd0aCA9PT0gMCkgeworICAgICAgICAgIGluZm8gKz0gJyBZb3UgbGlr ZWx5IGZvcmdvdCB0byBleHBvcnQgeW91ciBjb21wb25lbnQgZnJvbSB0aGUgZmlsZSAnICsgJ2l0 XCdzIGRlZmluZWQgaW4uJzsKKyAgICAgICAgfQorICAgICAgICBpbmZvICs9IGdldERlY2xhcmF0 aW9uRXJyb3JBZGRlbmR1bSgpOworICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3By b2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1JlYWN0LmNyZWF0ZUVsZW1lbnQ6IHR5cGUgaXMg aW52YWxpZCAtLSBleHBlY3RlZCBhIHN0cmluZyAoZm9yICcgKyAnYnVpbHQtaW4gY29tcG9uZW50 cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSAnICsgJ2NvbXBvbmVudHMpIGJ1 dCBnb3Q6ICVzLiVzJywgdHlwZSA9PSBudWxsID8gdHlwZSA6IHR5cGVvZiB0eXBlLCBpbmZvKSA6 IHZvaWQgMDsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgZWxlbWVudCA9IFJlYWN0RWxlbWVu dC5jcmVhdGVFbGVtZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisKKyAgICAvLyBUaGUgcmVz dWx0IGNhbiBiZSBudWxsaXNoIGlmIGEgbW9jayBvciBhIGN1c3RvbSBmdW5jdGlvbiBpcyB1c2Vk LgorICAgIC8vIFRPRE86IERyb3AgdGhpcyB3aGVuIHRoZXNlIGFyZSBubyBsb25nZXIgYWxsb3dl ZCBhcyB0aGUgdHlwZSBhcmd1bWVudC4KKyAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7CisgICAg ICByZXR1cm4gZWxlbWVudDsKKyAgICB9CisKKyAgICAvLyBTa2lwIGtleSB3YXJuaW5nIGlmIHRo ZSB0eXBlIGlzbid0IHZhbGlkIHNpbmNlIG91ciBrZXkgdmFsaWRhdGlvbiBsb2dpYworICAgIC8v IGRvZXNuJ3QgZXhwZWN0IGEgbm9uLXN0cmluZy9mdW5jdGlvbiB0eXBlIGFuZCBjYW4gdGhyb3cg Y29uZnVzaW5nIGVycm9ycy4KKyAgICAvLyBXZSBkb24ndCB3YW50IGV4Y2VwdGlvbiBiZWhhdmlv ciB0byBkaWZmZXIgYmV0d2VlbiBkZXYgYW5kIHByb2QuCisgICAgLy8gKFJlbmRlcmluZyB3aWxs IHRocm93IHdpdGggYSBoZWxwZnVsIG1lc3NhZ2UgYW5kIGFzIHNvb24gYXMgdGhlIHR5cGUgaXMK KyAgICAvLyBmaXhlZCwgdGhlIGtleSB3YXJuaW5ncyB3aWxsIGFwcGVhci4pCisgICAgaWYgKHZh bGlkVHlwZSkgeworICAgICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBp KyspIHsKKyAgICAgICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCB0eXBlKTsKKyAg ICAgIH0KKyAgICB9CisKKyAgICB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KTsKKworICAgIHJl dHVybiBlbGVtZW50OworICB9LAorCisgIGNyZWF0ZUZhY3Rvcnk6IGZ1bmN0aW9uICh0eXBlKSB7 CisgICAgdmFyIHZhbGlkYXRlZEZhY3RvcnkgPSBSZWFjdEVsZW1lbnRWYWxpZGF0b3IuY3JlYXRl RWxlbWVudC5iaW5kKG51bGwsIHR5cGUpOworICAgIC8vIExlZ2FjeSBob29rIFRPRE86IFdhcm4g aWYgdGhpcyBpcyBhY2Nlc3NlZAorICAgIHZhbGlkYXRlZEZhY3RvcnkudHlwZSA9IHR5cGU7CisK KyAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAg aWYgKGNhbkRlZmluZVByb3BlcnR5KSB7CisgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2 YWxpZGF0ZWRGYWN0b3J5LCAndHlwZScsIHsKKyAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwK KyAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIHByb2Nlc3MuZW52Lk5P REVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnRmFjdG9yeS50eXBlIGlz IGRlcHJlY2F0ZWQuIEFjY2VzcyB0aGUgY2xhc3MgZGlyZWN0bHkgJyArICdiZWZvcmUgcGFzc2lu ZyBpdCB0byBjcmVhdGVGYWN0b3J5LicpIDogdm9pZCAwOworICAgICAgICAgICAgT2JqZWN0LmRl ZmluZVByb3BlcnR5KHRoaXMsICd0eXBlJywgeworICAgICAgICAgICAgICB2YWx1ZTogdHlwZQor ICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgICB9Cisg ICAgICAgIH0pOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB2YWxpZGF0ZWRGYWN0b3J5 OworICB9LAorCisgIGNsb25lRWxlbWVudDogZnVuY3Rpb24gKGVsZW1lbnQsIHByb3BzLCBjaGls ZHJlbikgeworICAgIHZhciBuZXdFbGVtZW50ID0gUmVhY3RFbGVtZW50LmNsb25lRWxlbWVudC5h cHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRz Lmxlbmd0aDsgaSsrKSB7CisgICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhhcmd1bWVudHNbaV0sIG5l d0VsZW1lbnQudHlwZSk7CisgICAgfQorICAgIHZhbGlkYXRlUHJvcFR5cGVzKG5ld0VsZW1lbnQp OworICAgIHJldHVybiBuZXdFbGVtZW50OworICB9CisKK307CisKK21vZHVsZS5leHBvcnRzID0g UmVhY3RFbGVtZW50VmFsaWRhdG9yOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAt LWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL1JlYWN0RnJhZ21lbnQu anMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0L2xpYi9SZWFjdEZyYWdtZW50Lmpz Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi5iMzVjZWQyZAotLS0gL2Rldi9u dWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL1JlYWN0RnJhZ21l bnQuanMKQEAgLTAsMCArMSw2OCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxNS1wcmVzZW50LCBG YWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJj ZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0 aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2Ug dHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91 bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisK Kyd1c2Ugc3RyaWN0JzsKKwordmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFBy b2RJbnZhcmlhbnQnKTsKKwordmFyIFJlYWN0Q2hpbGRyZW4gPSByZXF1aXJlKCcuL1JlYWN0Q2hp bGRyZW4nKTsKK3ZhciBSZWFjdEVsZW1lbnQgPSByZXF1aXJlKCcuL1JlYWN0RWxlbWVudCcpOwor Cit2YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5RnVuY3Rpb24nKTsK K3ZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTsKK3ZhciB3YXJu aW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpOworCisvKioKKyAqIFdlIHVzZWQgdG8g YWxsb3cga2V5ZWQgb2JqZWN0cyB0byBzZXJ2ZSBhcyBhIGNvbGxlY3Rpb24gb2YgUmVhY3RFbGVt ZW50cywKKyAqIG9yIG5lc3RlZCBzZXRzLiBUaGlzIGFsbG93ZWQgdXMgYSB3YXkgdG8gZXhwbGlj aXRseSBrZXkgYSBzZXQgb3IgZnJhZ21lbnQgb2YKKyAqIGNvbXBvbmVudHMuIFRoaXMgaXMgbm93 IGJlaW5nIHJlcGxhY2VkIHdpdGggYW4gb3BhcXVlIGRhdGEgc3RydWN0dXJlLgorICogVGhlIHVw Z3JhZGUgcGF0aCBpcyB0byBjYWxsIFJlYWN0LmFkZG9ucy5jcmVhdGVGcmFnbWVudCh7IGtleTog dmFsdWUgfSkgdG8KKyAqIGNyZWF0ZSBhIGtleWVkIGZyYWdtZW50LiBUaGUgcmVzdWx0aW5nIGRh dGEgc3RydWN0dXJlIGlzIGFuIGFycmF5LgorICovCisKK3ZhciBudW1lcmljUHJvcGVydHlSZWdl eCA9IC9eXGQrJC87CisKK3ZhciB3YXJuZWRBYm91dE51bWVyaWMgPSBmYWxzZTsKKwordmFyIFJl YWN0RnJhZ21lbnQgPSB7CisgIC8qKgorICAgKiBXcmFwIGEga2V5ZWQgb2JqZWN0IGluIGFuIG9w YXF1ZSBwcm94eSB0aGF0IHdhcm5zIHlvdSBpZiB5b3UgYWNjZXNzIGFueQorICAgKiBvZiBpdHMg cHJvcGVydGllcy4KKyAgICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2Rv Y3MvY3JlYXRlLWZyYWdtZW50Lmh0bWwKKyAgICovCisgIGNyZWF0ZTogZnVuY3Rpb24gKG9iamVj dCkgeworICAgIGlmICh0eXBlb2Ygb2JqZWN0ICE9PSAnb2JqZWN0JyB8fCAhb2JqZWN0IHx8IEFy cmF5LmlzQXJyYXkob2JqZWN0KSkgeworICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdw cm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdSZWFjdC5hZGRvbnMuY3JlYXRlRnJhZ21lbnQg b25seSBhY2NlcHRzIGEgc2luZ2xlIG9iamVjdC4gR290OiAlcycsIG9iamVjdCkgOiB2b2lkIDA7 CisgICAgICByZXR1cm4gb2JqZWN0OworICAgIH0KKyAgICBpZiAoUmVhY3RFbGVtZW50LmlzVmFs aWRFbGVtZW50KG9iamVjdCkpIHsKKyAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJv ZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnUmVhY3QuYWRkb25zLmNyZWF0ZUZyYWdtZW50IGRv ZXMgbm90IGFjY2VwdCBhIFJlYWN0RWxlbWVudCAnICsgJ3dpdGhvdXQgYSB3cmFwcGVyIG9iamVj dC4nKSA6IHZvaWQgMDsKKyAgICAgIHJldHVybiBvYmplY3Q7CisgICAgfQorCisgICAgIShvYmpl Y3Qubm9kZVR5cGUgIT09IDEpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9u JyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0LmFkZG9ucy5jcmVhdGVGcmFnbWVudCguLi4pOiBF bmNvdW50ZXJlZCBhbiBpbnZhbGlkIGNoaWxkOyBET00gZWxlbWVudHMgYXJlIG5vdCB2YWxpZCBj aGlsZHJlbiBvZiBSZWFjdCBjb21wb25lbnRzLicpIDogX3Byb2RJbnZhcmlhbnQoJzAnKSA6IHZv aWQgMDsKKworICAgIHZhciByZXN1bHQgPSBbXTsKKworICAgIGZvciAodmFyIGtleSBpbiBvYmpl Y3QpIHsKKyAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7 CisgICAgICAgIGlmICghd2FybmVkQWJvdXROdW1lcmljICYmIG51bWVyaWNQcm9wZXJ0eVJlZ2V4 LnRlc3Qoa2V5KSkgeworICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVj dGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnUmVhY3QuYWRkb25zLmNyZWF0ZUZyYWdtZW50KC4uLik6 IENoaWxkIG9iamVjdHMgc2hvdWxkIGhhdmUgJyArICdub24tbnVtZXJpYyBrZXlzIHNvIG9yZGVy aW5nIGlzIHByZXNlcnZlZC4nKSA6IHZvaWQgMDsKKyAgICAgICAgICB3YXJuZWRBYm91dE51bWVy aWMgPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBSZWFjdENoaWxkcmVuLm1hcElu dG9XaXRoS2V5UHJlZml4SW50ZXJuYWwob2JqZWN0W2tleV0sIHJlc3VsdCwga2V5LCBlbXB0eUZ1 bmN0aW9uLnRoYXRSZXR1cm5zQXJndW1lbnQpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7 CisgIH0KK307CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RGcmFnbWVudDsKXCBObyBuZXdsaW5l IGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3Jl YWN0L2xpYi9SZWFjdExpbmsuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0L2xp Yi9SZWFjdExpbmsuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLmIwZTg4 MjI1Ci0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9s aWIvUmVhY3RMaW5rLmpzCkBAIC0wLDAgKzEsNzAgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMt cHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog VGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2Ug Zm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRo aXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMg Y2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5Lgor ICoKKyAqLworCisndXNlIHN0cmljdCc7CisKKy8qKgorICogUmVhY3RMaW5rIGVuY2Fwc3VsYXRl cyBhIGNvbW1vbiBwYXR0ZXJuIGluIHdoaWNoIGEgY29tcG9uZW50IHdhbnRzIHRvIG1vZGlmeQor ICogYSBwcm9wIHJlY2VpdmVkIGZyb20gaXRzIHBhcmVudC4gUmVhY3RMaW5rIGFsbG93cyB0aGUg cGFyZW50IHRvIHBhc3MgZG93biBhCisgKiB2YWx1ZSBjb3VwbGVkIHdpdGggYSBjYWxsYmFjayB0 aGF0LCB3aGVuIGludm9rZWQsIGV4cHJlc3NlcyBhbiBpbnRlbnQgdG8KKyAqIG1vZGlmeSB0aGF0 IHZhbHVlLiBGb3IgZXhhbXBsZToKKyAqCisgKiBSZWFjdC5jcmVhdGVDbGFzcyh7CisgKiAgIGdl dEluaXRpYWxTdGF0ZTogZnVuY3Rpb24oKSB7CisgKiAgICAgcmV0dXJuIHt2YWx1ZTogJyd9Owor ICogICB9LAorICogICByZW5kZXI6IGZ1bmN0aW9uKCkgeworICogICAgIHZhciB2YWx1ZUxpbmsg PSBuZXcgUmVhY3RMaW5rKHRoaXMuc3RhdGUudmFsdWUsIHRoaXMuX2hhbmRsZVZhbHVlQ2hhbmdl KTsKKyAqICAgICByZXR1cm4gPGlucHV0IHZhbHVlTGluaz17dmFsdWVMaW5rfSAvPjsKKyAqICAg fSwKKyAqICAgX2hhbmRsZVZhbHVlQ2hhbmdlOiBmdW5jdGlvbihuZXdWYWx1ZSkgeworICogICAg IHRoaXMuc2V0U3RhdGUoe3ZhbHVlOiBuZXdWYWx1ZX0pOworICogICB9CisgKiB9KTsKKyAqCisg KiBXZSBoYXZlIHByb3ZpZGVkIHNvbWUgc3VnYXJ5IG1peGlucyB0byBtYWtlIHRoZSBjcmVhdGlv biBhbmQKKyAqIGNvbnN1bXB0aW9uIG9mIFJlYWN0TGluayBlYXNpZXI7IHNlZSBMaW5rZWRWYWx1 ZVV0aWxzIGFuZCBMaW5rZWRTdGF0ZU1peGluLgorICovCisKK3ZhciBSZWFjdCA9IHJlcXVpcmUo Jy4vUmVhY3QnKTsKKworLyoqCisgKiBEZXByZWNhdGVkOiBBbiBhbiBlYXN5IHdheSB0byBleHBy ZXNzIHR3by13YXkgYmluZGluZyB3aXRoIFJlYWN0LiAKKyAqIFNlZSBodHRwczovL2ZhY2Vib29r LmdpdGh1Yi5pby9yZWFjdC9kb2NzL3R3by13YXktYmluZGluZy1oZWxwZXJzLmh0bWwKKyAqCisg KiBAcGFyYW0geyp9IHZhbHVlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGxpbmsKKyAqIEBwYXJhbSB7 ZnVuY3Rpb259IHJlcXVlc3RDaGFuZ2UgY2FsbGJhY2sgdG8gcmVxdWVzdCBhIGNoYW5nZQorICov CitmdW5jdGlvbiBSZWFjdExpbmsodmFsdWUsIHJlcXVlc3RDaGFuZ2UpIHsKKyAgdGhpcy52YWx1 ZSA9IHZhbHVlOworICB0aGlzLnJlcXVlc3RDaGFuZ2UgPSByZXF1ZXN0Q2hhbmdlOworfQorCisv KioKKyAqIENyZWF0ZXMgYSBQcm9wVHlwZSB0aGF0IGVuZm9yY2VzIHRoZSBSZWFjdExpbmsgQVBJ IGFuZCBvcHRpb25hbGx5IGNoZWNrcyB0aGUKKyAqIHR5cGUgb2YgdGhlIHZhbHVlIGJlaW5nIHBh c3NlZCBpbnNpZGUgdGhlIGxpbmsuIEV4YW1wbGU6CisgKgorICogTXlDb21wb25lbnQucHJvcFR5 cGVzID0geworICogICB0YWJJbmRleExpbms6IFJlYWN0TGluay5Qcm9wVHlwZXMubGluayhSZWFj dC5Qcm9wVHlwZXMubnVtYmVyKQorICogfQorICovCitmdW5jdGlvbiBjcmVhdGVMaW5rVHlwZUNo ZWNrZXIobGlua1R5cGUpIHsKKyAgdmFyIHNoYXBlcyA9IHsKKyAgICB2YWx1ZTogbGlua1R5cGUg PT09IHVuZGVmaW5lZCA/IFJlYWN0LlByb3BUeXBlcy5hbnkuaXNSZXF1aXJlZCA6IGxpbmtUeXBl LmlzUmVxdWlyZWQsCisgICAgcmVxdWVzdENoYW5nZTogUmVhY3QuUHJvcFR5cGVzLmZ1bmMuaXNS ZXF1aXJlZAorICB9OworICByZXR1cm4gUmVhY3QuUHJvcFR5cGVzLnNoYXBlKHNoYXBlcyk7Cit9 CisKK1JlYWN0TGluay5Qcm9wVHlwZXMgPSB7CisgIGxpbms6IGNyZWF0ZUxpbmtUeXBlQ2hlY2tl cgorfTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdExpbms7ClwgTm8gbmV3bGluZSBhdCBlbmQg b2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIv UmVhY3ROb29wVXBkYXRlUXVldWUuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0 L2xpYi9SZWFjdE5vb3BVcGRhdGVRdWV1ZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwMC4uY2Y1ZmQ3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMv dmVuZG9yL3JlYWN0L2xpYi9SZWFjdE5vb3BVcGRhdGVRdWV1ZS5qcwpAQCAtMCwwICsxLDk1IEBA CisvKioKKyAqIENvcHlyaWdodCAyMDE1LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwg cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5k ZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGlu IHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdy YW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxl IGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIg d2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTsKKworZnVuY3Rpb24gd2Fybk5v b3AocHVibGljSW5zdGFuY2UsIGNhbGxlck5hbWUpIHsKKyAgaWYgKHByb2Nlc3MuZW52Lk5PREVf RU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICB2YXIgY29uc3RydWN0b3IgPSBwdWJsaWNJbnN0 YW5jZS5jb25zdHJ1Y3RvcjsKKyAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rp b24nID8gd2FybmluZyhmYWxzZSwgJyVzKC4uLik6IENhbiBvbmx5IHVwZGF0ZSBhIG1vdW50ZWQg b3IgbW91bnRpbmcgY29tcG9uZW50LiAnICsgJ1RoaXMgdXN1YWxseSBtZWFucyB5b3UgY2FsbGVk ICVzKCkgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4gJyArICdUaGlzIGlzIGEgbm8tb3AuIFBs ZWFzZSBjaGVjayB0aGUgY29kZSBmb3IgdGhlICVzIGNvbXBvbmVudC4nLCBjYWxsZXJOYW1lLCBj YWxsZXJOYW1lLCBjb25zdHJ1Y3RvciAmJiAoY29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgY29u c3RydWN0b3IubmFtZSkgfHwgJ1JlYWN0Q2xhc3MnKSA6IHZvaWQgMDsKKyAgfQorfQorCisvKioK KyAqIFRoaXMgaXMgdGhlIGFic3RyYWN0IEFQSSBmb3IgYW4gdXBkYXRlIHF1ZXVlLgorICovCit2 YXIgUmVhY3ROb29wVXBkYXRlUXVldWUgPSB7CisKKyAgLyoqCisgICAqIENoZWNrcyB3aGV0aGVy IG9yIG5vdCB0aGlzIGNvbXBvc2l0ZSBjb21wb25lbnQgaXMgbW91bnRlZC4KKyAgICogQHBhcmFt IHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2Ugd2Ugd2FudCB0byB0ZXN0 LgorICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIG1vdW50ZWQsIGZhbHNlIG90aGVyd2lz ZS4KKyAgICogQHByb3RlY3RlZAorICAgKiBAZmluYWwKKyAgICovCisgIGlzTW91bnRlZDogZnVu Y3Rpb24gKHB1YmxpY0luc3RhbmNlKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9LAorCisgIC8q KgorICAgKiBFbnF1ZXVlIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGFmdGVyIGFs bCB0aGUgcGVuZGluZyB1cGRhdGVzCisgICAqIGhhdmUgcHJvY2Vzc2VkLgorICAgKgorICAgKiBA cGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0byB1c2UgYXMg YHRoaXNgIGNvbnRleHQuCisgICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQg YWZ0ZXIgc3RhdGUgaXMgdXBkYXRlZC4KKyAgICogQGludGVybmFsCisgICAqLworICBlbnF1ZXVl Q2FsbGJhY2s6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY2FsbGJhY2spIHt9LAorCisgIC8q KgorICAgKiBGb3JjZXMgYW4gdXBkYXRlLiBUaGlzIHNob3VsZCBvbmx5IGJlIGludm9rZWQgd2hl biBpdCBpcyBrbm93biB3aXRoCisgICAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGlu IGEgRE9NIHRyYW5zYWN0aW9uLgorICAgKgorICAgKiBZb3UgbWF5IHdhbnQgdG8gY2FsbCB0aGlz IHdoZW4geW91IGtub3cgdGhhdCBzb21lIGRlZXBlciBhc3BlY3Qgb2YgdGhlCisgICAqIGNvbXBv bmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLgor ICAgKgorICAgKiBUaGlzIHdpbGwgbm90IGludm9rZSBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCwg YnV0IGl0IHdpbGwgaW52b2tlCisgICAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBv bmVudERpZFVwZGF0ZWAuCisgICAqCisgICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5z dGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLgorICAgKiBAaW50ZXJuYWwK KyAgICovCisgIGVucXVldWVGb3JjZVVwZGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlKSB7 CisgICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdmb3JjZVVwZGF0ZScpOworICB9LAorCisg IC8qKgorICAgKiBSZXBsYWNlcyBhbGwgb2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRoaXMgb3Ig YHNldFN0YXRlYCB0byBtdXRhdGUgc3RhdGUuCisgICAqIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMu c3RhdGVgIGFzIGltbXV0YWJsZS4KKyAgICoKKyAgICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRo YXQgYHRoaXMuc3RhdGVgIHdpbGwgYmUgaW1tZWRpYXRlbHkgdXBkYXRlZCwgc28KKyAgICogYWNj ZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4g dGhlIG9sZCB2YWx1ZS4KKyAgICoKKyAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0 YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuCisgICAqIEBwYXJhbSB7b2Jq ZWN0fSBjb21wbGV0ZVN0YXRlIE5leHQgc3RhdGUuCisgICAqIEBpbnRlcm5hbAorICAgKi8KKyAg ZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjb21wbGV0ZVN0 YXRlKSB7CisgICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdyZXBsYWNlU3RhdGUnKTsKKyAg fSwKKworICAvKioKKyAgICogU2V0cyBhIHN1YnNldCBvZiB0aGUgc3RhdGUuIFRoaXMgb25seSBl eGlzdHMgYmVjYXVzZSBfcGVuZGluZ1N0YXRlIGlzCisgICAqIGludGVybmFsLiBUaGlzIHByb3Zp ZGVzIGEgbWVyZ2luZyBzdHJhdGVneSB0aGF0IGlzIG5vdCBhdmFpbGFibGUgdG8gZGVlcAorICAg KiBwcm9wZXJ0aWVzIHdoaWNoIGlzIGNvbmZ1c2luZy4gVE9ETzogRXhwb3NlIHBlbmRpbmdTdGF0 ZSBvciBkb24ndCB1c2UgaXQKKyAgICogZHVyaW5nIHRoZSBtZXJnZS4KKyAgICoKKyAgICogQHBh cmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQg cmVyZW5kZXIuCisgICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJ0aWFsU3RhdGUgTmV4dCBwYXJ0aWFs IHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIHN0YXRlLgorICAgKiBAaW50ZXJuYWwKKyAgICovCisg IGVucXVldWVTZXRTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBwYXJ0aWFsU3RhdGUp IHsKKyAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ3NldFN0YXRlJyk7CisgIH0KK307CisK K21vZHVsZS5leHBvcnRzID0gUmVhY3ROb29wVXBkYXRlUXVldWU7ClwgTm8gbmV3bGluZSBhdCBl bmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9s aWIvUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVu ZG9yL3JlYWN0L2xpYi9SZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcy5qcwpuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMC4uZGIwMzNjZGEKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIv cGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0L2xpYi9SZWFjdFByb3BUeXBlTG9jYXRpb25OYW1l cy5qcwpAQCAtMCwwICsxLDI0IEBACisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZh Y2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNl IGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRo ZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0 cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3Vu ZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAq LworCisndXNlIHN0cmljdCc7CisKK3ZhciBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcyA9IHt9 OworCitpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgeworICBSZWFj dFByb3BUeXBlTG9jYXRpb25OYW1lcyA9IHsKKyAgICBwcm9wOiAncHJvcCcsCisgICAgY29udGV4 dDogJ2NvbnRleHQnLAorICAgIGNoaWxkQ29udGV4dDogJ2NoaWxkIGNvbnRleHQnCisgIH07Cit9 CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXM7ClwgTm8gbmV3 bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRv ci9yZWFjdC9saWIvUmVhY3RQcm9wVHlwZUxvY2F0aW9ucy5qcyBiL3dlYi9wZ2FkbWluL3N0YXRp Yy92ZW5kb3IvcmVhY3QvbGliL1JlYWN0UHJvcFR5cGVMb2NhdGlvbnMuanMKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjZkOTRjYTgxCi0tLSAvZGV2L251bGwKKysrIGIvd2Vi L3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvUmVhY3RQcm9wVHlwZUxvY2F0aW9ucy5q cwpAQCAtMCwwICsxLDEyIEBACisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vi b29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNv ZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQor ICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVl LiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBp biB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLwor CisndXNlIHN0cmljdCc7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEv d2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvUmVhY3RQcm9wVHlwZXMuanMgYi93 ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0L2xpYi9SZWFjdFByb3BUeXBlcy5qcwpuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uMDU3Y2UzNTUKLS0tIC9kZXYvbnVsbAor KysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0L2xpYi9SZWFjdFByb3BUeXBlcy5q cwpAQCAtMCwwICsxLDQzMyBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNl Ym9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBj b2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUK KyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJl ZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQg aW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1 c2Ugc3RyaWN0JzsKKwordmFyIFJlYWN0RWxlbWVudCA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50 Jyk7Cit2YXIgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMgPSByZXF1aXJlKCcuL1JlYWN0UHJv cFR5cGVMb2NhdGlvbk5hbWVzJyk7Cit2YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJl KCcuL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7CisKK3ZhciBlbXB0eUZ1bmN0aW9uID0gcmVxdWly ZSgnZmJqcy9saWIvZW1wdHlGdW5jdGlvbicpOwordmFyIGdldEl0ZXJhdG9yRm4gPSByZXF1aXJl KCcuL2dldEl0ZXJhdG9yRm4nKTsKK3ZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2Fy bmluZycpOworCisvKioKKyAqIENvbGxlY3Rpb24gb2YgbWV0aG9kcyB0aGF0IGFsbG93IGRlY2xh cmF0aW9uIGFuZCB2YWxpZGF0aW9uIG9mIHByb3BzIHRoYXQgYXJlCisgKiBzdXBwbGllZCB0byBS ZWFjdCBjb21wb25lbnRzLiBFeGFtcGxlIHVzYWdlOgorICoKKyAqICAgdmFyIFByb3BzID0gcmVx dWlyZSgnUmVhY3RQcm9wVHlwZXMnKTsKKyAqICAgdmFyIE15QXJ0aWNsZSA9IFJlYWN0LmNyZWF0 ZUNsYXNzKHsKKyAqICAgICBwcm9wVHlwZXM6IHsKKyAqICAgICAgIC8vIEFuIG9wdGlvbmFsIHN0 cmluZyBwcm9wIG5hbWVkICJkZXNjcmlwdGlvbiIuCisgKiAgICAgICBkZXNjcmlwdGlvbjogUHJv cHMuc3RyaW5nLAorICoKKyAqICAgICAgIC8vIEEgcmVxdWlyZWQgZW51bSBwcm9wIG5hbWVkICJj YXRlZ29yeSIuCisgKiAgICAgICBjYXRlZ29yeTogUHJvcHMub25lT2YoWydOZXdzJywnUGhvdG9z J10pLmlzUmVxdWlyZWQsCisgKgorICogICAgICAgLy8gQSBwcm9wIG5hbWVkICJkaWFsb2ciIHRo YXQgcmVxdWlyZXMgYW4gaW5zdGFuY2Ugb2YgRGlhbG9nLgorICogICAgICAgZGlhbG9nOiBQcm9w cy5pbnN0YW5jZU9mKERpYWxvZykuaXNSZXF1aXJlZAorICogICAgIH0sCisgKiAgICAgcmVuZGVy OiBmdW5jdGlvbigpIHsgLi4uIH0KKyAqICAgfSk7CisgKgorICogQSBtb3JlIGZvcm1hbCBzcGVj aWZpY2F0aW9uIG9mIGhvdyB0aGVzZSBtZXRob2RzIGFyZSB1c2VkOgorICoKKyAqICAgdHlwZSA6 PSBhcnJheXxib29sfGZ1bmN8b2JqZWN0fG51bWJlcnxzdHJpbmd8b25lT2YoWy4uLl0pfGluc3Rh bmNlT2YoLi4uKQorICogICBkZWNsIDo9IFJlYWN0UHJvcFR5cGVzLnt0eXBlfSguaXNSZXF1aXJl ZCk/CisgKgorICogRWFjaCBhbmQgZXZlcnkgZGVjbGFyYXRpb24gcHJvZHVjZXMgYSBmdW5jdGlv biB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZS4gVGhpcworICogYWxsb3dzIHRoZSBjcmVhdGlvbiBv ZiBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvbnMuIEZvciBleGFtcGxlOgorICoKKyAqICB2YXIg TXlMaW5rID0gUmVhY3QuY3JlYXRlQ2xhc3MoeworICogICAgcHJvcFR5cGVzOiB7CisgKiAgICAg IC8vIEFuIG9wdGlvbmFsIHN0cmluZyBvciBVUkkgcHJvcCBuYW1lZCAiaHJlZiIuCisgKiAgICAg IGhyZWY6IGZ1bmN0aW9uKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkgeworICogICAg ICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07CisgKiAgICAgICAgaWYgKHByb3BW YWx1ZSAhPSBudWxsICYmIHR5cGVvZiBwcm9wVmFsdWUgIT09ICdzdHJpbmcnICYmCisgKiAgICAg ICAgICAgICEocHJvcFZhbHVlIGluc3RhbmNlb2YgVVJJKSkgeworICogICAgICAgICAgcmV0dXJu IG5ldyBFcnJvcigKKyAqICAgICAgICAgICAgJ0V4cGVjdGVkIGEgc3RyaW5nIG9yIGFuIFVSSSBm b3IgJyArIHByb3BOYW1lICsgJyBpbiAnICsKKyAqICAgICAgICAgICAgY29tcG9uZW50TmFtZQor ICogICAgICAgICAgKTsKKyAqICAgICAgICB9CisgKiAgICAgIH0KKyAqICAgIH0sCisgKiAgICBy ZW5kZXI6IGZ1bmN0aW9uKCkgey4uLn0KKyAqICB9KTsKKyAqCisgKiBAaW50ZXJuYWwKKyAqLwor Cit2YXIgQU5PTllNT1VTID0gJzw8YW5vbnltb3VzPj4nOworCit2YXIgUmVhY3RQcm9wVHlwZXMg PSB7CisgIGFycmF5OiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignYXJyYXknKSwKKyAgYm9v bDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2Jvb2xlYW4nKSwKKyAgZnVuYzogY3JlYXRl UHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2Z1bmN0aW9uJyksCisgIG51bWJlcjogY3JlYXRlUHJpbWl0 aXZlVHlwZUNoZWNrZXIoJ251bWJlcicpLAorICBvYmplY3Q6IGNyZWF0ZVByaW1pdGl2ZVR5cGVD aGVja2VyKCdvYmplY3QnKSwKKyAgc3RyaW5nOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcign c3RyaW5nJyksCisgIHN5bWJvbDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ3N5bWJvbCcp LAorCisgIGFueTogY3JlYXRlQW55VHlwZUNoZWNrZXIoKSwKKyAgYXJyYXlPZjogY3JlYXRlQXJy YXlPZlR5cGVDaGVja2VyLAorICBlbGVtZW50OiBjcmVhdGVFbGVtZW50VHlwZUNoZWNrZXIoKSwK KyAgaW5zdGFuY2VPZjogY3JlYXRlSW5zdGFuY2VUeXBlQ2hlY2tlciwKKyAgbm9kZTogY3JlYXRl Tm9kZUNoZWNrZXIoKSwKKyAgb2JqZWN0T2Y6IGNyZWF0ZU9iamVjdE9mVHlwZUNoZWNrZXIsCisg IG9uZU9mOiBjcmVhdGVFbnVtVHlwZUNoZWNrZXIsCisgIG9uZU9mVHlwZTogY3JlYXRlVW5pb25U eXBlQ2hlY2tlciwKKyAgc2hhcGU6IGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXIKK307CisKKy8qKgor ICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1bWVy cyBzaGlwIHRoZWlyIG93bgorICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMv ZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzCisg Ki8KKy8qZXNsaW50LWRpc2FibGUgbm8tc2VsZi1jb21wYXJlKi8KK2Z1bmN0aW9uIGlzKHgsIHkp IHsKKyAgLy8gU2FtZVZhbHVlIGFsZ29yaXRobQorICBpZiAoeCA9PT0geSkgeworICAgIC8vIFN0 ZXBzIDEtNSwgNy0xMAorICAgIC8vIFN0ZXBzIDYuYi02LmU6ICswICE9IC0wCisgICAgcmV0dXJu IHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5OworICB9IGVsc2UgeworICAgIC8vIFN0ZXAgNi5h OiBOYU4gPT0gTmFOCisgICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTsKKyAgfQorfQorLypl c2xpbnQtZW5hYmxlIG5vLXNlbGYtY29tcGFyZSovCisKKy8qKgorICogV2UgdXNlIGFuIEVycm9y LWxpa2Ugb2JqZWN0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFzIHBlb3BsZSBtYXkgY2Fs bAorICogUHJvcFR5cGVzIGRpcmVjdGx5IGFuZCBpbnNwZWN0IHRoZWlyIG91dHB1dC4gSG93ZXZl ciB3ZSBkb24ndCB1c2UgcmVhbAorICogRXJyb3JzIGFueW1vcmUuIFdlIGRvbid0IGluc3BlY3Qg dGhlaXIgc3RhY2sgYW55d2F5LCBhbmQgY3JlYXRpbmcgdGhlbQorICogaXMgcHJvaGliaXRpdmVs eSBleHBlbnNpdmUgaWYgdGhleSBhcmUgY3JlYXRlZCB0b28gb2Z0ZW4sIHN1Y2ggYXMgd2hhdAor ICogaGFwcGVucyBpbiBvbmVPZlR5cGUoKSBmb3IgYW55IHR5cGUgYmVmb3JlIHRoZSBvbmUgdGhh dCBtYXRjaGVkLgorICovCitmdW5jdGlvbiBQcm9wVHlwZUVycm9yKG1lc3NhZ2UpIHsKKyAgdGhp cy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgdGhpcy5zdGFjayA9ICcnOworfQorLy8gTWFrZSBgaW5z dGFuY2VvZiBFcnJvcmAgc3RpbGwgd29yayBmb3IgcmV0dXJuZWQgZXJyb3JzLgorUHJvcFR5cGVF cnJvci5wcm90b3R5cGUgPSBFcnJvci5wcm90b3R5cGU7CisKK2Z1bmN0aW9uIGNyZWF0ZUNoYWlu YWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKSB7CisgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAh PT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgdmFyIG1hbnVhbFByb3BUeXBlQ2FsbENhY2hlID0ge307 CisgIH0KKyAgZnVuY3Rpb24gY2hlY2tUeXBlKGlzUmVxdWlyZWQsIHByb3BzLCBwcm9wTmFtZSwg Y29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KSB7CisgICAgY29t cG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWUgfHwgQU5PTllNT1VTOworICAgIHByb3BGdWxsTmFt ZSA9IHByb3BGdWxsTmFtZSB8fCBwcm9wTmFtZTsKKyAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9F TlYgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgaWYgKHNlY3JldCAhPT0gUmVhY3RQcm9wVHlw ZXNTZWNyZXQgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7CisgICAgICAgIHZh ciBjYWNoZUtleSA9IGNvbXBvbmVudE5hbWUgKyAnOicgKyBwcm9wTmFtZTsKKyAgICAgICAgaWYg KCFtYW51YWxQcm9wVHlwZUNhbGxDYWNoZVtjYWNoZUtleV0pIHsKKyAgICAgICAgICBwcm9jZXNz LmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1lvdSBhcmUg bWFudWFsbHkgY2FsbGluZyBhIFJlYWN0LlByb3BUeXBlcyB2YWxpZGF0aW9uICcgKyAnZnVuY3Rp b24gZm9yIHRoZSBgJXNgIHByb3Agb24gYCVzYC4gVGhpcyBpcyBkZXByZWNhdGVkICcgKyAnYW5k IHdpbGwgbm90IHdvcmsgaW4gcHJvZHVjdGlvbiB3aXRoIHRoZSBuZXh0IG1ham9yIHZlcnNpb24u ICcgKyAnWW91IG1heSBiZSBzZWVpbmcgdGhpcyB3YXJuaW5nIGR1ZSB0byBhIHRoaXJkLXBhcnR5 IFByb3BUeXBlcyAnICsgJ2xpYnJhcnkuIFNlZSBodHRwczovL2ZiLm1lL3JlYWN0LXdhcm5pbmct ZG9udC1jYWxsLXByb3B0eXBlcyAnICsgJ2ZvciBkZXRhaWxzLicsIHByb3BGdWxsTmFtZSwgY29t cG9uZW50TmFtZSkgOiB2b2lkIDA7CisgICAgICAgICAgbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGVb Y2FjaGVLZXldID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAocHJv cHNbcHJvcE5hbWVdID09IG51bGwpIHsKKyAgICAgIHZhciBsb2NhdGlvbk5hbWUgPSBSZWFjdFBy b3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl07CisgICAgICBpZiAoaXNSZXF1aXJlZCkgewor ICAgICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSBudWxsKSB7CisgICAgICAgICAgcmV0dXJu IG5ldyBQcm9wVHlwZUVycm9yKCdUaGUgJyArIGxvY2F0aW9uTmFtZSArICcgYCcgKyBwcm9wRnVs bE5hbWUgKyAnYCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQgJyArICgnaW4gYCcgKyBjb21wb25lbnRO YW1lICsgJ2AsIGJ1dCBpdHMgdmFsdWUgaXMgYG51bGxgLicpKTsKKyAgICAgICAgfQorICAgICAg ICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1RoZSAnICsgbG9jYXRpb25OYW1lICsgJyBgJyAr IHByb3BGdWxsTmFtZSArICdgIGlzIG1hcmtlZCBhcyByZXF1aXJlZCBpbiAnICsgKCdgJyArIGNv bXBvbmVudE5hbWUgKyAnYCwgYnV0IGl0cyB2YWx1ZSBpcyBgdW5kZWZpbmVkYC4nKSk7CisgICAg ICB9CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHZhbGlk YXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFt ZSk7CisgICAgfQorICB9CisKKyAgdmFyIGNoYWluZWRDaGVja1R5cGUgPSBjaGVja1R5cGUuYmlu ZChudWxsLCBmYWxzZSk7CisgIGNoYWluZWRDaGVja1R5cGUuaXNSZXF1aXJlZCA9IGNoZWNrVHlw ZS5iaW5kKG51bGwsIHRydWUpOworCisgIHJldHVybiBjaGFpbmVkQ2hlY2tUeXBlOworfQorCitm dW5jdGlvbiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcihleHBlY3RlZFR5cGUpIHsKKyAgZnVu Y3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwg cHJvcEZ1bGxOYW1lLCBzZWNyZXQpIHsKKyAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5h bWVdOworICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7CisgICAgaWYg KHByb3BUeXBlICE9PSBleHBlY3RlZFR5cGUpIHsKKyAgICAgIHZhciBsb2NhdGlvbk5hbWUgPSBS ZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl07CisgICAgICAvLyBgcHJvcFZhbHVl YCBiZWluZyBpbnN0YW5jZSBvZiwgc2F5LCBkYXRlL3JlZ2V4cCwgcGFzcyB0aGUgJ29iamVjdCcK KyAgICAgIC8vIGNoZWNrLCBidXQgd2UgY2FuIG9mZmVyIGEgbW9yZSBwcmVjaXNlIGVycm9yIG1l c3NhZ2UgaGVyZSByYXRoZXIgdGhhbgorICAgICAgLy8gJ29mIHR5cGUgYG9iamVjdGAnLgorICAg ICAgdmFyIHByZWNpc2VUeXBlID0gZ2V0UHJlY2lzZVR5cGUocHJvcFZhbHVlKTsKKworICAgICAg cmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbk5hbWUgKyAnIGAn ICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByZWNpc2VUeXBlICsgJ2Ag c3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkICcpICsgKCdgJyAr IGV4cGVjdGVkVHlwZSArICdgLicpKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKyAg cmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTsKK30KKworZnVuY3Rp b24gY3JlYXRlQW55VHlwZUNoZWNrZXIoKSB7CisgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBl Q2hlY2tlcihlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zKG51bGwpKTsKK30KKworZnVuY3Rpb24g Y3JlYXRlQXJyYXlPZlR5cGVDaGVja2VyKHR5cGVDaGVja2VyKSB7CisgIGZ1bmN0aW9uIHZhbGlk YXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFt ZSkgeworICAgIGlmICh0eXBlb2YgdHlwZUNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHsKKyAgICAg IHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignUHJvcGVydHkgYCcgKyBwcm9wRnVsbE5hbWUgKyAn YCBvZiBjb21wb25lbnQgYCcgKyBjb21wb25lbnROYW1lICsgJ2AgaGFzIGludmFsaWQgUHJvcFR5 cGUgbm90YXRpb24gaW5zaWRlIGFycmF5T2YuJyk7CisgICAgfQorICAgIHZhciBwcm9wVmFsdWUg PSBwcm9wc1twcm9wTmFtZV07CisgICAgaWYgKCFBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHsK KyAgICAgIHZhciBsb2NhdGlvbk5hbWUgPSBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2Nh dGlvbl07CisgICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpOworICAg ICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbk5hbWUgKyAn IGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Ag c3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGFuIGFycmF5Licp KTsKKyAgICB9CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wVmFsdWUubGVuZ3RoOyBpKysp IHsKKyAgICAgIHZhciBlcnJvciA9IHR5cGVDaGVja2VyKHByb3BWYWx1ZSwgaSwgY29tcG9uZW50 TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICdbJyArIGkgKyAnXScsIFJlYWN0UHJvcFR5 cGVzU2VjcmV0KTsKKyAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7CisgICAgICAg IHJldHVybiBlcnJvcjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKyAg cmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTsKK30KKworZnVuY3Rp b24gY3JlYXRlRWxlbWVudFR5cGVDaGVja2VyKCkgeworICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9w cywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHsKKyAg ICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdOworICAgIGlmICghUmVhY3RFbGVtZW50 LmlzVmFsaWRFbGVtZW50KHByb3BWYWx1ZSkpIHsKKyAgICAgIHZhciBsb2NhdGlvbk5hbWUgPSBS ZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl07CisgICAgICB2YXIgcHJvcFR5cGUg PSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpOworICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9y KCdJbnZhbGlkICcgKyBsb2NhdGlvbk5hbWUgKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2Yg dHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnRO YW1lICsgJ2AsIGV4cGVjdGVkIGEgc2luZ2xlIFJlYWN0RWxlbWVudC4nKSk7CisgICAgfQorICAg IHJldHVybiBudWxsOworICB9CisgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2 YWxpZGF0ZSk7Cit9CisKK2Z1bmN0aW9uIGNyZWF0ZUluc3RhbmNlVHlwZUNoZWNrZXIoZXhwZWN0 ZWRDbGFzcykgeworICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVu dE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHsKKyAgICBpZiAoIShwcm9wc1twcm9wTmFt ZV0gaW5zdGFuY2VvZiBleHBlY3RlZENsYXNzKSkgeworICAgICAgdmFyIGxvY2F0aW9uTmFtZSA9 IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXTsKKyAgICAgIHZhciBleHBlY3Rl ZENsYXNzTmFtZSA9IGV4cGVjdGVkQ2xhc3MubmFtZSB8fCBBTk9OWU1PVVM7CisgICAgICB2YXIg YWN0dWFsQ2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lKHByb3BzW3Byb3BOYW1lXSk7CisgICAgICBy ZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uTmFtZSArICcgYCcg KyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgYWN0dWFsQ2xhc3NOYW1lICsg J2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkICcpICsgKCdp bnN0YW5jZSBvZiBgJyArIGV4cGVjdGVkQ2xhc3NOYW1lICsgJ2AuJykpOworICAgIH0KKyAgICBy ZXR1cm4gbnVsbDsKKyAgfQorICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFs aWRhdGUpOworfQorCitmdW5jdGlvbiBjcmVhdGVFbnVtVHlwZUNoZWNrZXIoZXhwZWN0ZWRWYWx1 ZXMpIHsKKyAgaWYgKCFBcnJheS5pc0FycmF5KGV4cGVjdGVkVmFsdWVzKSkgeworICAgIHByb2Nl c3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnSW52YWxp ZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZiwgZXhwZWN0ZWQgYW4gaW5zdGFuY2Ugb2YgYXJy YXkuJykgOiB2b2lkIDA7CisgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNOdWxs OworICB9CisKKyAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnRO YW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7CisgICAgdmFyIHByb3BWYWx1ZSA9IHByb3Bz W3Byb3BOYW1lXTsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cGVjdGVkVmFsdWVzLmxlbmd0 aDsgaSsrKSB7CisgICAgICBpZiAoaXMocHJvcFZhbHVlLCBleHBlY3RlZFZhbHVlc1tpXSkpIHsK KyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgdmFyIGxvY2F0aW9u TmFtZSA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXTsKKyAgICB2YXIgdmFs dWVzU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZXhwZWN0ZWRWYWx1ZXMpOworICAgIHJldHVybiBu ZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb25OYW1lICsgJyBgJyArIHByb3BG dWxsTmFtZSArICdgIG9mIHZhbHVlIGAnICsgcHJvcFZhbHVlICsgJ2AgJyArICgnc3VwcGxpZWQg dG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIG9uZSBvZiAnICsgdmFsdWVzU3Ry aW5nICsgJy4nKSk7CisgIH0KKyAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZh bGlkYXRlKTsKK30KKworZnVuY3Rpb24gY3JlYXRlT2JqZWN0T2ZUeXBlQ2hlY2tlcih0eXBlQ2hl Y2tlcikgeworICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5h bWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHsKKyAgICBpZiAodHlwZW9mIHR5cGVDaGVja2Vy ICE9PSAnZnVuY3Rpb24nKSB7CisgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1Byb3Bl cnR5IGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgY29tcG9uZW50IGAnICsgY29tcG9uZW50TmFt ZSArICdgIGhhcyBpbnZhbGlkIFByb3BUeXBlIG5vdGF0aW9uIGluc2lkZSBvYmplY3RPZi4nKTsK KyAgICB9CisgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTsKKyAgICB2YXIgcHJv cFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpOworICAgIGlmIChwcm9wVHlwZSAhPT0gJ29i amVjdCcpIHsKKyAgICAgIHZhciBsb2NhdGlvbk5hbWUgPSBSZWFjdFByb3BUeXBlTG9jYXRpb25O YW1lc1tsb2NhdGlvbl07CisgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQg JyArIGxvY2F0aW9uTmFtZSArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAo J2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwg ZXhwZWN0ZWQgYW4gb2JqZWN0LicpKTsKKyAgICB9CisgICAgZm9yICh2YXIga2V5IGluIHByb3BW YWx1ZSkgeworICAgICAgaWYgKHByb3BWYWx1ZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAg ICAgIHZhciBlcnJvciA9IHR5cGVDaGVja2VyKHByb3BWYWx1ZSwga2V5LCBjb21wb25lbnROYW1l LCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJy4nICsga2V5LCBSZWFjdFByb3BUeXBlc1NlY3Jl dCk7CisgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7CisgICAgICAgICAgcmV0 dXJuIGVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxsOwor ICB9CisgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7Cit9CisK K2Z1bmN0aW9uIGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIoYXJyYXlPZlR5cGVDaGVja2Vycykgewor ICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyYXlPZlR5cGVDaGVja2VycykpIHsKKyAgICBwcm9jZXNz LmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ0ludmFsaWQg YXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2ZUeXBlLCBleHBlY3RlZCBhbiBpbnN0YW5jZSBvZiBh cnJheS4nKSA6IHZvaWQgMDsKKyAgICByZXR1cm4gZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc051 bGw7CisgIH0KKworICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVu dE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8 IGFycmF5T2ZUeXBlQ2hlY2tlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciBjaGVja2VyID0g YXJyYXlPZlR5cGVDaGVja2Vyc1tpXTsKKyAgICAgIGlmIChjaGVja2VyKHByb3BzLCBwcm9wTmFt ZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgUmVhY3RQcm9wVHlwZXNT ZWNyZXQpID09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgfQor CisgICAgdmFyIGxvY2F0aW9uTmFtZSA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0 aW9uXTsKKyAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9u TmFtZSArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBzdXBwbGllZCB0byAnICsgKCdgJyArIGNv bXBvbmVudE5hbWUgKyAnYC4nKSk7CisgIH0KKyAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVD aGVja2VyKHZhbGlkYXRlKTsKK30KKworZnVuY3Rpb24gY3JlYXRlTm9kZUNoZWNrZXIoKSB7Cisg IGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRp b24sIHByb3BGdWxsTmFtZSkgeworICAgIGlmICghaXNOb2RlKHByb3BzW3Byb3BOYW1lXSkpIHsK KyAgICAgIHZhciBsb2NhdGlvbk5hbWUgPSBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2Nh dGlvbl07CisgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0 aW9uTmFtZSArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBzdXBwbGllZCB0byAnICsgKCdgJyAr IGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBSZWFjdE5vZGUuJykpOworICAgIH0KKyAg ICByZXR1cm4gbnVsbDsKKyAgfQorICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIo dmFsaWRhdGUpOworfQorCitmdW5jdGlvbiBjcmVhdGVTaGFwZVR5cGVDaGVja2VyKHNoYXBlVHlw ZXMpIHsKKyAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1l LCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7CisgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3By b3BOYW1lXTsKKyAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpOworICAg IGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHsKKyAgICAgIHZhciBsb2NhdGlvbk5hbWUgPSBS ZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl07CisgICAgICByZXR1cm4gbmV3IFBy b3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uTmFtZSArICcgYCcgKyBwcm9wRnVsbE5h bWUgKyAnYCBvZiB0eXBlIGAnICsgcHJvcFR5cGUgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyAr IGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYG9iamVjdGAuJykpOworICAgIH0KKyAgICBm b3IgKHZhciBrZXkgaW4gc2hhcGVUeXBlcykgeworICAgICAgdmFyIGNoZWNrZXIgPSBzaGFwZVR5 cGVzW2tleV07CisgICAgICBpZiAoIWNoZWNrZXIpIHsKKyAgICAgICAgY29udGludWU7CisgICAg ICB9CisgICAgICB2YXIgZXJyb3IgPSBjaGVja2VyKHByb3BWYWx1ZSwga2V5LCBjb21wb25lbnRO YW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJy4nICsga2V5LCBSZWFjdFByb3BUeXBlc1Nl Y3JldCk7CisgICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAg fQorICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxl VHlwZUNoZWNrZXIodmFsaWRhdGUpOworfQorCitmdW5jdGlvbiBpc05vZGUocHJvcFZhbHVlKSB7 CisgIHN3aXRjaCAodHlwZW9mIHByb3BWYWx1ZSkgeworICAgIGNhc2UgJ251bWJlcic6CisgICAg Y2FzZSAnc3RyaW5nJzoKKyAgICBjYXNlICd1bmRlZmluZWQnOgorICAgICAgcmV0dXJuIHRydWU7 CisgICAgY2FzZSAnYm9vbGVhbic6CisgICAgICByZXR1cm4gIXByb3BWYWx1ZTsKKyAgICBjYXNl ICdvYmplY3QnOgorICAgICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkgeworICAgICAg ICByZXR1cm4gcHJvcFZhbHVlLmV2ZXJ5KGlzTm9kZSk7CisgICAgICB9CisgICAgICBpZiAocHJv cFZhbHVlID09PSBudWxsIHx8IFJlYWN0RWxlbWVudC5pc1ZhbGlkRWxlbWVudChwcm9wVmFsdWUp KSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICB2YXIgaXRlcmF0b3JG biA9IGdldEl0ZXJhdG9yRm4ocHJvcFZhbHVlKTsKKyAgICAgIGlmIChpdGVyYXRvckZuKSB7Cisg ICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChwcm9wVmFsdWUpOworICAgICAg ICB2YXIgc3RlcDsKKyAgICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IHByb3BWYWx1ZS5lbnRyaWVz KSB7CisgICAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkgewor ICAgICAgICAgICAgaWYgKCFpc05vZGUoc3RlcC52YWx1ZSkpIHsKKyAgICAgICAgICAgICAgcmV0 dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsK KyAgICAgICAgICAvLyBJdGVyYXRvciB3aWxsIHByb3ZpZGUgZW50cnkgW2ssdl0gdHVwbGVzIHJh dGhlciB0aGFuIHZhbHVlcy4KKyAgICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4 dCgpKS5kb25lKSB7CisgICAgICAgICAgICB2YXIgZW50cnkgPSBzdGVwLnZhbHVlOworICAgICAg ICAgICAgaWYgKGVudHJ5KSB7CisgICAgICAgICAgICAgIGlmICghaXNOb2RlKGVudHJ5WzFdKSkg eworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgfQorICAgICAg ICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAg cmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0 OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Z1bmN0aW9uIGlzU3ltYm9sKHByb3BU eXBlLCBwcm9wVmFsdWUpIHsKKyAgLy8gTmF0aXZlIFN5bWJvbC4KKyAgaWYgKHByb3BUeXBlID09 PSAnc3ltYm9sJykgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gMTkuNC4zLjUgU3lt Ym9sLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXSA9PT0gJ1N5bWJvbCcKKyAgaWYgKHByb3BWYWx1 ZVsnQEB0b1N0cmluZ1RhZyddID09PSAnU3ltYm9sJykgeworICAgIHJldHVybiB0cnVlOworICB9 CisKKyAgLy8gRmFsbGJhY2sgZm9yIG5vbi1zcGVjIGNvbXBsaWFudCBTeW1ib2xzIHdoaWNoIGFy ZSBwb2x5ZmlsbGVkLgorICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBwcm9w VmFsdWUgaW5zdGFuY2VvZiBTeW1ib2wpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJl dHVybiBmYWxzZTsKK30KKworLy8gRXF1aXZhbGVudCBvZiBgdHlwZW9mYCBidXQgd2l0aCBzcGVj aWFsIGhhbmRsaW5nIGZvciBhcnJheSBhbmQgcmVnZXhwLgorZnVuY3Rpb24gZ2V0UHJvcFR5cGUo cHJvcFZhbHVlKSB7CisgIHZhciBwcm9wVHlwZSA9IHR5cGVvZiBwcm9wVmFsdWU7CisgIGlmIChB cnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHsKKyAgICByZXR1cm4gJ2FycmF5JzsKKyAgfQorICBp ZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7CisgICAgLy8gT2xkIHdlYmtpdHMgKGF0 IGxlYXN0IHVudGlsIEFuZHJvaWQgNC4wKSByZXR1cm4gJ2Z1bmN0aW9uJyByYXRoZXIgdGhhbgor ICAgIC8vICdvYmplY3QnIGZvciB0eXBlb2YgYSBSZWdFeHAuIFdlJ2xsIG5vcm1hbGl6ZSB0aGlz IGhlcmUgc28gdGhhdCAvYmxhLworICAgIC8vIHBhc3NlcyBQcm9wVHlwZXMub2JqZWN0LgorICAg IHJldHVybiAnb2JqZWN0JzsKKyAgfQorICBpZiAoaXNTeW1ib2wocHJvcFR5cGUsIHByb3BWYWx1 ZSkpIHsKKyAgICByZXR1cm4gJ3N5bWJvbCc7CisgIH0KKyAgcmV0dXJuIHByb3BUeXBlOworfQor CisvLyBUaGlzIGhhbmRsZXMgbW9yZSB0eXBlcyB0aGFuIGBnZXRQcm9wVHlwZWAuIE9ubHkgdXNl ZCBmb3IgZXJyb3IgbWVzc2FnZXMuCisvLyBTZWUgYGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2Vy YC4KK2Z1bmN0aW9uIGdldFByZWNpc2VUeXBlKHByb3BWYWx1ZSkgeworICB2YXIgcHJvcFR5cGUg PSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpOworICBpZiAocHJvcFR5cGUgPT09ICdvYmplY3QnKSB7 CisgICAgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIERhdGUpIHsKKyAgICAgIHJldHVybiAnZGF0 ZSc7CisgICAgfSBlbHNlIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHsKKyAgICAg IHJldHVybiAncmVnZXhwJzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHByb3BUeXBlOworfQorCisv LyBSZXR1cm5zIGNsYXNzIG5hbWUgb2YgdGhlIG9iamVjdCwgaWYgYW55LgorZnVuY3Rpb24gZ2V0 Q2xhc3NOYW1lKHByb3BWYWx1ZSkgeworICBpZiAoIXByb3BWYWx1ZS5jb25zdHJ1Y3RvciB8fCAh cHJvcFZhbHVlLmNvbnN0cnVjdG9yLm5hbWUpIHsKKyAgICByZXR1cm4gQU5PTllNT1VTOworICB9 CisgIHJldHVybiBwcm9wVmFsdWUuY29uc3RydWN0b3IubmFtZTsKK30KKworbW9kdWxlLmV4cG9y dHMgPSBSZWFjdFByb3BUeXBlczsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1n aXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0L2xpYi9SZWFjdFByb3BUeXBlc1Nl Y3JldC5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL1JlYWN0UHJvcFR5 cGVzU2VjcmV0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi4zM2QzZmFj MAotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGli L1JlYWN0UHJvcFR5cGVzU2VjcmV0LmpzCkBAIC0wLDAgKzEsMTYgQEAKKy8qKgorICogQ29weXJp Z2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQu CisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxl IGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0 b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVu dCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGly ZWN0b3J5LgorICoKKyAqIAorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIFJlYWN0UHJvcFR5 cGVzU2VjcmV0ID0gJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVE JzsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdFByb3BUeXBlc1NlY3JldDsKXCBObyBuZXdsaW5l IGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3Jl YWN0L2xpYi9SZWFjdFB1cmVDb21wb25lbnQuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9y L3JlYWN0L2xpYi9SZWFjdFB1cmVDb21wb25lbnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAuLjY0YWVhOWVmCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3Rh dGljL3ZlbmRvci9yZWFjdC9saWIvUmVhY3RQdXJlQ29tcG9uZW50LmpzCkBAIC0wLDAgKzEsNDEg QEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFs bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1 bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUg aW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwg Z3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZp bGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK3Zh ciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpOworCit2YXIgUmVhY3RDb21wb25l bnQgPSByZXF1aXJlKCcuL1JlYWN0Q29tcG9uZW50Jyk7Cit2YXIgUmVhY3ROb29wVXBkYXRlUXVl dWUgPSByZXF1aXJlKCcuL1JlYWN0Tm9vcFVwZGF0ZVF1ZXVlJyk7CisKK3ZhciBlbXB0eU9iamVj dCA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5T2JqZWN0Jyk7CisKKy8qKgorICogQmFzZSBjbGFz cyBoZWxwZXJzIGZvciB0aGUgdXBkYXRpbmcgc3RhdGUgb2YgYSBjb21wb25lbnQuCisgKi8KK2Z1 bmN0aW9uIFJlYWN0UHVyZUNvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikgeworICAv LyBEdXBsaWNhdGVkIGZyb20gUmVhY3RDb21wb25lbnQuCisgIHRoaXMucHJvcHMgPSBwcm9wczsK KyAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7Cisg IC8vIFdlIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgdXBkYXRlciBidXQgdGhlIHJlYWwgb25lIGdl dHMgaW5qZWN0ZWQgYnkgdGhlCisgIC8vIHJlbmRlcmVyLgorICB0aGlzLnVwZGF0ZXIgPSB1cGRh dGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlOworfQorCitmdW5jdGlvbiBDb21wb25lbnREdW1t eSgpIHt9CitDb21wb25lbnREdW1teS5wcm90b3R5cGUgPSBSZWFjdENvbXBvbmVudC5wcm90b3R5 cGU7CitSZWFjdFB1cmVDb21wb25lbnQucHJvdG90eXBlID0gbmV3IENvbXBvbmVudER1bW15KCk7 CitSZWFjdFB1cmVDb21wb25lbnQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmVhY3RQdXJlQ29t cG9uZW50OworLy8gQXZvaWQgYW4gZXh0cmEgcHJvdG90eXBlIGp1bXAgZm9yIHRoZXNlIG1ldGhv ZHMuCitfYXNzaWduKFJlYWN0UHVyZUNvbXBvbmVudC5wcm90b3R5cGUsIFJlYWN0Q29tcG9uZW50 LnByb3RvdHlwZSk7CitSZWFjdFB1cmVDb21wb25lbnQucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29t cG9uZW50ID0gdHJ1ZTsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdFB1cmVDb21wb25lbnQ7Clwg Tm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGlj L3ZlbmRvci9yZWFjdC9saWIvUmVhY3RTdGF0ZVNldHRlcnMuanMgYi93ZWIvcGdhZG1pbi9zdGF0 aWMvdmVuZG9yL3JlYWN0L2xpYi9SZWFjdFN0YXRlU2V0dGVycy5qcwpuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwMC4uMGExOGE5MTgKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdh ZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0L2xpYi9SZWFjdFN0YXRlU2V0dGVycy5qcwpAQCAtMCww ICsxLDEwMyBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5j LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxp Y2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VO U0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRk aXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBB VEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0 JzsKKwordmFyIFJlYWN0U3RhdGVTZXR0ZXJzID0geworICAvKioKKyAgICogUmV0dXJucyBhIGZ1 bmN0aW9uIHRoYXQgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLCBhbmQgdXNlcyB0aGUgcmVz dWx0CisgICAqIG9mIHRoYXQgdG8gc2V0IHRoZSBjb21wb25lbnQncyBzdGF0ZS4KKyAgICoKKyAg ICogQHBhcmFtIHtSZWFjdENvbXBvc2l0ZUNvbXBvbmVudH0gY29tcG9uZW50CisgICAqIEBwYXJh bSB7ZnVuY3Rpb259IGZ1bmNSZXR1cm5pbmdTdGF0ZSBSZXR1cm5lZCBjYWxsYmFjayB1c2VzIHRo aXMgdG8KKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWlu ZSBob3cgdG8gdXBkYXRlIHN0YXRlLgorICAgKiBAcmV0dXJuIHtmdW5jdGlvbn0gY2FsbGJhY2sg dGhhdCB3aGVuIGludm9rZWQgdXNlcyBmdW5jUmV0dXJuaW5nU3RhdGUgdG8KKyAgICogICAgICAg ICAgICAgICAgICAgIGRldGVybWluZWQgdGhlIG9iamVjdCBsaXRlcmFsIHRvIHNldFN0YXRlLgor ICAgKi8KKyAgY3JlYXRlU3RhdGVTZXR0ZXI6IGZ1bmN0aW9uIChjb21wb25lbnQsIGZ1bmNSZXR1 cm5pbmdTdGF0ZSkgeworICAgIHJldHVybiBmdW5jdGlvbiAoYSwgYiwgYywgZCwgZSwgZikgewor ICAgICAgdmFyIHBhcnRpYWxTdGF0ZSA9IGZ1bmNSZXR1cm5pbmdTdGF0ZS5jYWxsKGNvbXBvbmVu dCwgYSwgYiwgYywgZCwgZSwgZik7CisgICAgICBpZiAocGFydGlhbFN0YXRlKSB7CisgICAgICAg IGNvbXBvbmVudC5zZXRTdGF0ZShwYXJ0aWFsU3RhdGUpOworICAgICAgfQorICAgIH07CisgIH0s CisKKyAgLyoqCisgICAqIFJldHVybnMgYSBzaW5nbGUtYXJndW1lbnQgY2FsbGJhY2sgdGhhdCBj YW4gYmUgdXNlZCB0byB1cGRhdGUgYSBzaW5nbGUKKyAgICoga2V5IGluIHRoZSBjb21wb25lbnQn cyBzdGF0ZS4KKyAgICoKKyAgICogTm90ZTogdGhpcyBpcyBtZW1vaXplZCBmdW5jdGlvbiwgd2hp Y2ggbWFrZXMgaXQgaW5leHBlbnNpdmUgdG8gY2FsbC4KKyAgICoKKyAgICogQHBhcmFtIHtSZWFj dENvbXBvc2l0ZUNvbXBvbmVudH0gY29tcG9uZW50CisgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkg VGhlIGtleSBpbiB0aGUgc3RhdGUgdGhhdCB5b3Ugc2hvdWxkIHVwZGF0ZS4KKyAgICogQHJldHVy biB7ZnVuY3Rpb259IGNhbGxiYWNrIG9mIDEgYXJndW1lbnQgd2hpY2ggY2FsbHMgc2V0U3RhdGUo KSB3aXRoCisgICAqICAgICAgICAgICAgICAgICAgICB0aGUgcHJvdmlkZWQga2V5TmFtZSBhbmQg Y2FsbGJhY2sgYXJndW1lbnQuCisgICAqLworICBjcmVhdGVTdGF0ZUtleVNldHRlcjogZnVuY3Rp b24gKGNvbXBvbmVudCwga2V5KSB7CisgICAgLy8gTWVtb2l6ZSB0aGUgc2V0dGVycy4KKyAgICB2 YXIgY2FjaGUgPSBjb21wb25lbnQuX19rZXlTZXR0ZXJzIHx8IChjb21wb25lbnQuX19rZXlTZXR0 ZXJzID0ge30pOworICAgIHJldHVybiBjYWNoZVtrZXldIHx8IChjYWNoZVtrZXldID0gY3JlYXRl U3RhdGVLZXlTZXR0ZXIoY29tcG9uZW50LCBrZXkpKTsKKyAgfQorfTsKKworZnVuY3Rpb24gY3Jl YXRlU3RhdGVLZXlTZXR0ZXIoY29tcG9uZW50LCBrZXkpIHsKKyAgLy8gUGFydGlhbCBzdGF0ZSBp cyBhbGxvY2F0ZWQgb3V0c2lkZSBvZiB0aGUgZnVuY3Rpb24gY2xvc3VyZSBzbyBpdCBjYW4gYmUK KyAgLy8gcmV1c2VkIHdpdGggZXZlcnkgY2FsbCwgYXZvaWRpbmcgbWVtb3J5IGFsbG9jYXRpb24g d2hlbiB0aGlzIGZ1bmN0aW9uCisgIC8vIGlzIGNhbGxlZC4KKyAgdmFyIHBhcnRpYWxTdGF0ZSA9 IHt9OworICByZXR1cm4gZnVuY3Rpb24gc3RhdGVLZXlTZXR0ZXIodmFsdWUpIHsKKyAgICBwYXJ0 aWFsU3RhdGVba2V5XSA9IHZhbHVlOworICAgIGNvbXBvbmVudC5zZXRTdGF0ZShwYXJ0aWFsU3Rh dGUpOworICB9OworfQorCitSZWFjdFN0YXRlU2V0dGVycy5NaXhpbiA9IHsKKyAgLyoqCisgICAq IFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiwgYW5k IHVzZXMgdGhlIHJlc3VsdAorICAgKiBvZiB0aGF0IHRvIHNldCB0aGUgY29tcG9uZW50J3Mgc3Rh dGUuCisgICAqCisgICAqIEZvciBleGFtcGxlLCB0aGVzZSBzdGF0ZW1lbnRzIGFyZSBlcXVpdmFs ZW50OgorICAgKgorICAgKiAgIHRoaXMuc2V0U3RhdGUoe3g6IDF9KTsKKyAgICogICB0aGlzLmNy ZWF0ZVN0YXRlU2V0dGVyKGZ1bmN0aW9uKHhWYWx1ZSkgeworICAgKiAgICAgcmV0dXJuIHt4OiB4 VmFsdWV9OworICAgKiAgIH0pKDEpOworICAgKgorICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBmdW5j UmV0dXJuaW5nU3RhdGUgUmV0dXJuZWQgY2FsbGJhY2sgdXNlcyB0aGlzIHRvCisgICAqICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmUgaG93IHRvIHVwZGF0ZSBz dGF0ZS4KKyAgICogQHJldHVybiB7ZnVuY3Rpb259IGNhbGxiYWNrIHRoYXQgd2hlbiBpbnZva2Vk IHVzZXMgZnVuY1JldHVybmluZ1N0YXRlIHRvCisgICAqICAgICAgICAgICAgICAgICAgICBkZXRl cm1pbmVkIHRoZSBvYmplY3QgbGl0ZXJhbCB0byBzZXRTdGF0ZS4KKyAgICovCisgIGNyZWF0ZVN0 YXRlU2V0dGVyOiBmdW5jdGlvbiAoZnVuY1JldHVybmluZ1N0YXRlKSB7CisgICAgcmV0dXJuIFJl YWN0U3RhdGVTZXR0ZXJzLmNyZWF0ZVN0YXRlU2V0dGVyKHRoaXMsIGZ1bmNSZXR1cm5pbmdTdGF0 ZSk7CisgIH0sCisKKyAgLyoqCisgICAqIFJldHVybnMgYSBzaW5nbGUtYXJndW1lbnQgY2FsbGJh Y2sgdGhhdCBjYW4gYmUgdXNlZCB0byB1cGRhdGUgYSBzaW5nbGUKKyAgICoga2V5IGluIHRoZSBj b21wb25lbnQncyBzdGF0ZS4KKyAgICoKKyAgICogRm9yIGV4YW1wbGUsIHRoZXNlIHN0YXRlbWVu dHMgYXJlIGVxdWl2YWxlbnQ6CisgICAqCisgICAqICAgdGhpcy5zZXRTdGF0ZSh7eDogMX0pOwor ICAgKiAgIHRoaXMuY3JlYXRlU3RhdGVLZXlTZXR0ZXIoJ3gnKSgxKTsKKyAgICoKKyAgICogTm90 ZTogdGhpcyBpcyBtZW1vaXplZCBmdW5jdGlvbiwgd2hpY2ggbWFrZXMgaXQgaW5leHBlbnNpdmUg dG8gY2FsbC4KKyAgICoKKyAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IGluIHRoZSBz dGF0ZSB0aGF0IHlvdSBzaG91bGQgdXBkYXRlLgorICAgKiBAcmV0dXJuIHtmdW5jdGlvbn0gY2Fs bGJhY2sgb2YgMSBhcmd1bWVudCB3aGljaCBjYWxscyBzZXRTdGF0ZSgpIHdpdGgKKyAgICogICAg ICAgICAgICAgICAgICAgIHRoZSBwcm92aWRlZCBrZXlOYW1lIGFuZCBjYWxsYmFjayBhcmd1bWVu dC4KKyAgICovCisgIGNyZWF0ZVN0YXRlS2V5U2V0dGVyOiBmdW5jdGlvbiAoa2V5KSB7CisgICAg cmV0dXJuIFJlYWN0U3RhdGVTZXR0ZXJzLmNyZWF0ZVN0YXRlS2V5U2V0dGVyKHRoaXMsIGtleSk7 CisgIH0KK307CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RTdGF0ZVNldHRlcnM7ClwgTm8gbmV3 bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRv ci9yZWFjdC9saWIvUmVhY3RUcmFuc2l0aW9uQ2hpbGRNYXBwaW5nLmpzIGIvd2ViL3BnYWRtaW4v c3RhdGljL3ZlbmRvci9yZWFjdC9saWIvUmVhY3RUcmFuc2l0aW9uQ2hpbGRNYXBwaW5nLmpzCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi5mZjNkMGU2MgotLS0gL2Rldi9udWxs CisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL1JlYWN0VHJhbnNpdGlv bkNoaWxkTWFwcGluZy5qcwpAQCAtMCwwICsxLDEwMiBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAx My1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg KiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5z ZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2Yg dGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0 cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3Rvcnku CisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIGZsYXR0ZW5DaGlsZHJlbiA9IHJlcXVp cmUoJy4vZmxhdHRlbkNoaWxkcmVuJyk7CisKK3ZhciBSZWFjdFRyYW5zaXRpb25DaGlsZE1hcHBp bmcgPSB7CisgIC8qKgorICAgKiBHaXZlbiBgdGhpcy5wcm9wcy5jaGlsZHJlbmAsIHJldHVybiBh biBvYmplY3QgbWFwcGluZyBrZXkgdG8gY2hpbGQuIEp1c3QKKyAgICogc2ltcGxlIHN5bnRhY3Rp YyBzdWdhciBhcm91bmQgZmxhdHRlbkNoaWxkcmVuKCkuCisgICAqCisgICAqIEBwYXJhbSB7Kn0g Y2hpbGRyZW4gYHRoaXMucHJvcHMuY2hpbGRyZW5gCisgICAqIEBwYXJhbSB7bnVtYmVyPX0gc2Vs ZkRlYnVnSUQgT3B0aW9uYWwgZGVidWdJRCBvZiB0aGUgY3VycmVudCBpbnRlcm5hbCBpbnN0YW5j ZS4KKyAgICogQHJldHVybiB7b2JqZWN0fSBNYXBwaW5nIG9mIGtleSB0byBjaGlsZAorICAgKi8K KyAgZ2V0Q2hpbGRNYXBwaW5nOiBmdW5jdGlvbiAoY2hpbGRyZW4sIHNlbGZEZWJ1Z0lEKSB7Cisg ICAgaWYgKCFjaGlsZHJlbikgeworICAgICAgcmV0dXJuIGNoaWxkcmVuOworICAgIH0KKworICAg IGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICByZXR1 cm4gZmxhdHRlbkNoaWxkcmVuKGNoaWxkcmVuLCBzZWxmRGVidWdJRCk7CisgICAgfQorCisgICAg cmV0dXJuIGZsYXR0ZW5DaGlsZHJlbihjaGlsZHJlbik7CisgIH0sCisKKyAgLyoqCisgICAqIFdo ZW4geW91J3JlIGFkZGluZyBvciByZW1vdmluZyBjaGlsZHJlbiBzb21lIG1heSBiZSBhZGRlZCBv ciByZW1vdmVkIGluIHRoZQorICAgKiBzYW1lIHJlbmRlciBwYXNzLiBXZSB3YW50IHRvIHNob3cg KmJvdGgqIHNpbmNlIHdlIHdhbnQgdG8gc2ltdWx0YW5lb3VzbHkKKyAgICogYW5pbWF0ZSBlbGVt ZW50cyBpbiBhbmQgb3V0LiBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgcHJldmlvdXMgc2V0IG9mIGtl eXMKKyAgICogYW5kIGEgbmV3IHNldCBvZiBrZXlzIGFuZCBtZXJnZXMgdGhlbSB3aXRoIGl0cyBi ZXN0IGd1ZXNzIG9mIHRoZSBjb3JyZWN0CisgICAqIG9yZGVyaW5nLiBJbiB0aGUgZnV0dXJlIHdl IG1heSBleHBvc2Ugc29tZSBvZiB0aGUgdXRpbGl0aWVzIGluCisgICAqIFJlYWN0TXVsdGlDaGls ZCB0byBtYWtlIHRoaXMgZWFzeSwgYnV0IGZvciBub3cgUmVhY3QgaXRzZWxmIGRvZXMgbm90Cisg ICAqIGRpcmVjdGx5IGhhdmUgdGhpcyBjb25jZXB0IG9mIHRoZSB1bmlvbiBvZiBwcmV2Q2hpbGRy ZW4gYW5kIG5leHRDaGlsZHJlbgorICAgKiBzbyB3ZSBpbXBsZW1lbnQgaXQgaGVyZS4KKyAgICoK KyAgICogQHBhcmFtIHtvYmplY3R9IHByZXYgcHJldiBjaGlsZHJlbiBhcyByZXR1cm5lZCBmcm9t CisgICAqIGBSZWFjdFRyYW5zaXRpb25DaGlsZE1hcHBpbmcuZ2V0Q2hpbGRNYXBwaW5nKClgLgor ICAgKiBAcGFyYW0ge29iamVjdH0gbmV4dCBuZXh0IGNoaWxkcmVuIGFzIHJldHVybmVkIGZyb20K KyAgICogYFJlYWN0VHJhbnNpdGlvbkNoaWxkTWFwcGluZy5nZXRDaGlsZE1hcHBpbmcoKWAuCisg ICAqIEByZXR1cm4ge29iamVjdH0gYSBrZXkgc2V0IHRoYXQgY29udGFpbnMgYWxsIGtleXMgaW4g YHByZXZgIGFuZCBhbGwga2V5cworICAgKiBpbiBgbmV4dGAgaW4gYSByZWFzb25hYmxlIG9yZGVy LgorICAgKi8KKyAgbWVyZ2VDaGlsZE1hcHBpbmdzOiBmdW5jdGlvbiAocHJldiwgbmV4dCkgewor ICAgIHByZXYgPSBwcmV2IHx8IHt9OworICAgIG5leHQgPSBuZXh0IHx8IHt9OworCisgICAgZnVu Y3Rpb24gZ2V0VmFsdWVGb3JLZXkoa2V5KSB7CisgICAgICBpZiAobmV4dC5oYXNPd25Qcm9wZXJ0 eShrZXkpKSB7CisgICAgICAgIHJldHVybiBuZXh0W2tleV07CisgICAgICB9IGVsc2UgeworICAg ICAgICByZXR1cm4gcHJldltrZXldOworICAgICAgfQorICAgIH0KKworICAgIC8vIEZvciBlYWNo IGtleSBvZiBgbmV4dGAsIHRoZSBsaXN0IG9mIGtleXMgdG8gaW5zZXJ0IGJlZm9yZSB0aGF0IGtl eSBpbgorICAgIC8vIHRoZSBjb21iaW5lZCBsaXN0CisgICAgdmFyIG5leHRLZXlzUGVuZGluZyA9 IHt9OworCisgICAgdmFyIHBlbmRpbmdLZXlzID0gW107CisgICAgZm9yICh2YXIgcHJldktleSBp biBwcmV2KSB7CisgICAgICBpZiAobmV4dC5oYXNPd25Qcm9wZXJ0eShwcmV2S2V5KSkgeworICAg ICAgICBpZiAocGVuZGluZ0tleXMubGVuZ3RoKSB7CisgICAgICAgICAgbmV4dEtleXNQZW5kaW5n W3ByZXZLZXldID0gcGVuZGluZ0tleXM7CisgICAgICAgICAgcGVuZGluZ0tleXMgPSBbXTsKKyAg ICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGVuZGluZ0tleXMucHVzaChwcmV2S2V5 KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgaTsKKyAgICB2YXIgY2hpbGRNYXBwaW5nID0g e307CisgICAgZm9yICh2YXIgbmV4dEtleSBpbiBuZXh0KSB7CisgICAgICBpZiAobmV4dEtleXNQ ZW5kaW5nLmhhc093blByb3BlcnR5KG5leHRLZXkpKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkg PCBuZXh0S2V5c1BlbmRpbmdbbmV4dEtleV0ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICB2YXIg cGVuZGluZ05leHRLZXkgPSBuZXh0S2V5c1BlbmRpbmdbbmV4dEtleV1baV07CisgICAgICAgICAg Y2hpbGRNYXBwaW5nW25leHRLZXlzUGVuZGluZ1tuZXh0S2V5XVtpXV0gPSBnZXRWYWx1ZUZvcktl eShwZW5kaW5nTmV4dEtleSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNoaWxkTWFwcGlu Z1tuZXh0S2V5XSA9IGdldFZhbHVlRm9yS2V5KG5leHRLZXkpOworICAgIH0KKworICAgIC8vIEZp bmFsbHksIGFkZCB0aGUga2V5cyB3aGljaCBkaWRuJ3QgYXBwZWFyIGJlZm9yZSBhbnkga2V5IGlu IGBuZXh0YAorICAgIGZvciAoaSA9IDA7IGkgPCBwZW5kaW5nS2V5cy5sZW5ndGg7IGkrKykgewor ICAgICAgY2hpbGRNYXBwaW5nW3BlbmRpbmdLZXlzW2ldXSA9IGdldFZhbHVlRm9yS2V5KHBlbmRp bmdLZXlzW2ldKTsKKyAgICB9CisKKyAgICByZXR1cm4gY2hpbGRNYXBwaW5nOworICB9Cit9Owor Cittb2R1bGUuZXhwb3J0cyA9IFJlYWN0VHJhbnNpdGlvbkNoaWxkTWFwcGluZzsKXCBObyBuZXds aW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9y L3JlYWN0L2xpYi9SZWFjdFRyYW5zaXRpb25FdmVudHMuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMv dmVuZG9yL3JlYWN0L2xpYi9SZWFjdFRyYW5zaXRpb25FdmVudHMuanMKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMDAuLmNhNGI3ZTcxCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL3Bn YWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvUmVhY3RUcmFuc2l0aW9uRXZlbnRzLmpzCkBA IC0wLDAgKzEsNzIgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ss IEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBp cyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBM SUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFu IGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRo ZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0 cmljdCc7CisKK3ZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4 ZWN1dGlvbkVudmlyb25tZW50Jyk7CisKK3ZhciBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSA9 IHJlcXVpcmUoJ3JlYWN0LWRvbS9saWIvZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUnKTsKKwor dmFyIGVuZEV2ZW50cyA9IFtdOworCitmdW5jdGlvbiBkZXRlY3RFdmVudHMoKSB7CisgIHZhciBh bmltRW5kID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ2FuaW1hdGlvbmVuZCcpOworICB2 YXIgdHJhbnNFbmQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgndHJhbnNpdGlvbmVuZCcp OworCisgIGlmIChhbmltRW5kKSB7CisgICAgZW5kRXZlbnRzLnB1c2goYW5pbUVuZCk7CisgIH0K KworICBpZiAodHJhbnNFbmQpIHsKKyAgICBlbmRFdmVudHMucHVzaCh0cmFuc0VuZCk7CisgIH0K K30KKworaWYgKEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSkgeworICBkZXRlY3RFdmVu dHMoKTsKK30KKworLy8gV2UgdXNlIHRoZSByYXcge2FkZHxyZW1vdmV9RXZlbnRMaXN0ZW5lcigp IGNhbGwgYmVjYXVzZSBFdmVudExpc3RlbmVyCisvLyBkb2VzIG5vdCBrbm93IGhvdyB0byByZW1v dmUgZXZlbnQgbGlzdGVuZXJzIGFuZCB3ZSByZWFsbHkgc2hvdWxkCisvLyBjbGVhbiB1cC4gQWxz bywgdGhlc2UgZXZlbnRzIGFyZSBub3QgdHJpZ2dlcmVkIGluIG9sZGVyIGJyb3dzZXJzCisvLyBz byB3ZSBzaG91bGQgYmUgQS1PSyBoZXJlLgorCitmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKG5v ZGUsIGV2ZW50TmFtZSwgZXZlbnRMaXN0ZW5lcikgeworICBub2RlLmFkZEV2ZW50TGlzdGVuZXIo ZXZlbnROYW1lLCBldmVudExpc3RlbmVyLCBmYWxzZSk7Cit9CisKK2Z1bmN0aW9uIHJlbW92ZUV2 ZW50TGlzdGVuZXIobm9kZSwgZXZlbnROYW1lLCBldmVudExpc3RlbmVyKSB7CisgIG5vZGUucmVt b3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGV2ZW50TGlzdGVuZXIsIGZhbHNlKTsKK30KKwor dmFyIFJlYWN0VHJhbnNpdGlvbkV2ZW50cyA9IHsKKyAgYWRkRW5kRXZlbnRMaXN0ZW5lcjogZnVu Y3Rpb24gKG5vZGUsIGV2ZW50TGlzdGVuZXIpIHsKKyAgICBpZiAoZW5kRXZlbnRzLmxlbmd0aCA9 PT0gMCkgeworICAgICAgLy8gSWYgQ1NTIHRyYW5zaXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkLCB0 cmlnZ2VyIGFuICJlbmQgYW5pbWF0aW9uIgorICAgICAgLy8gZXZlbnQgaW1tZWRpYXRlbHkuCisg ICAgICB3aW5kb3cuc2V0VGltZW91dChldmVudExpc3RlbmVyLCAwKTsKKyAgICAgIHJldHVybjsK KyAgICB9CisgICAgZW5kRXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGVuZEV2ZW50KSB7CisgICAg ICBhZGRFdmVudExpc3RlbmVyKG5vZGUsIGVuZEV2ZW50LCBldmVudExpc3RlbmVyKTsKKyAgICB9 KTsKKyAgfSwKKworICByZW1vdmVFbmRFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAobm9kZSwgZXZl bnRMaXN0ZW5lcikgeworICAgIGlmIChlbmRFdmVudHMubGVuZ3RoID09PSAwKSB7CisgICAgICBy ZXR1cm47CisgICAgfQorICAgIGVuZEV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbmRFdmVudCkg eworICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihub2RlLCBlbmRFdmVudCwgZXZlbnRMaXN0ZW5l cik7CisgICAgfSk7CisgIH0KK307CisKK21vZHVsZS5leHBvcnRzID0gUmVhY3RUcmFuc2l0aW9u RXZlbnRzOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2Fk bWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL1JlYWN0VHJhbnNpdGlvbkdyb3VwLmpzIGIvd2Vi L3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvUmVhY3RUcmFuc2l0aW9uR3JvdXAuanMK bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjNkNTUwNDk2Ci0tLSAvZGV2L251 bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvUmVhY3RUcmFuc2l0 aW9uR3JvdXAuanMKQEAgLTAsMCArMSwyMjggQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJl c2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhp cyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91 bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMg c291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2Fu IGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoK KyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFz c2lnbicpOworCitmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9y KSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBU eXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KKworZnVu Y3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYp IHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2Vk IC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9m IGNhbGwgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBjYWxsID09PSAiZnVuY3Rpb24iKSA/IGNhbGwg OiBzZWxmOyB9CisKK2Z1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBp ZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICJmdW5jdGlvbiIgJiYgc3VwZXJDbGFzcyAhPT0gbnVs bCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJl IG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xh c3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJv dG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFs c2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xh c3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFz cywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9CisKK3Zh ciBSZWFjdCA9IHJlcXVpcmUoJy4vUmVhY3QnKTsKK3ZhciBSZWFjdFRyYW5zaXRpb25DaGlsZE1h cHBpbmcgPSByZXF1aXJlKCcuL1JlYWN0VHJhbnNpdGlvbkNoaWxkTWFwcGluZycpOworCit2YXIg ZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5RnVuY3Rpb24nKTsKKworLyoq CisgKiBBIGJhc2lzIGZvciBhbmltYXRpb25zLiBXaGVuIGNoaWxkcmVuIGFyZSBkZWNsYXJhdGl2 ZWx5IGFkZGVkIG9yIHJlbW92ZWQsCisgKiBzcGVjaWFsIGxpZmVjeWNsZSBob29rcyBhcmUgY2Fs bGVkLgorICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvYW5pbWF0 aW9uLmh0bWwjbG93LWxldmVsLWFwaS1yZWFjdHRyYW5zaXRpb25ncm91cAorICovCisKK3ZhciBS ZWFjdFRyYW5zaXRpb25Hcm91cCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7CisgIF9p bmhlcml0cyhSZWFjdFRyYW5zaXRpb25Hcm91cCwgX1JlYWN0JENvbXBvbmVudCk7CisKKyAgZnVu Y3Rpb24gUmVhY3RUcmFuc2l0aW9uR3JvdXAoKSB7CisgICAgdmFyIF90ZW1wLCBfdGhpcywgX3Jl dDsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSZWFjdFRyYW5zaXRpb25Hcm91cCk7CisK KyAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4p LCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykgeworICAgICAgYXJnc1tfa2V5XSA9IGFy Z3VtZW50c1tfa2V5XTsKKyAgICB9CisKKyAgICByZXR1cm4gX3JldCA9IChfdGVtcCA9IChfdGhp cyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuY2Fs bC5hcHBseShfUmVhY3QkQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSksIF90aGlzKSwg X3RoaXMuc3RhdGUgPSB7CisgICAgICAvLyBUT0RPOiBjYW4gd2UgZ2V0IHVzZWZ1bCBkZWJ1ZyBp bmZvcm1hdGlvbiB0byBzaG93IGF0IHRoaXMgcG9pbnQ/CisgICAgICBjaGlsZHJlbjogUmVhY3RU cmFuc2l0aW9uQ2hpbGRNYXBwaW5nLmdldENoaWxkTWFwcGluZyhfdGhpcy5wcm9wcy5jaGlsZHJl bikKKyAgICB9LCBfdGhpcy5wZXJmb3JtQXBwZWFyID0gZnVuY3Rpb24gKGtleSkgeworICAgICAg X3RoaXMuY3VycmVudGx5VHJhbnNpdGlvbmluZ0tleXNba2V5XSA9IHRydWU7CisKKyAgICAgIHZh ciBjb21wb25lbnQgPSBfdGhpcy5yZWZzW2tleV07CisKKyAgICAgIGlmIChjb21wb25lbnQuY29t cG9uZW50V2lsbEFwcGVhcikgeworICAgICAgICBjb21wb25lbnQuY29tcG9uZW50V2lsbEFwcGVh cihfdGhpcy5faGFuZGxlRG9uZUFwcGVhcmluZy5iaW5kKF90aGlzLCBrZXkpKTsKKyAgICAgIH0g ZWxzZSB7CisgICAgICAgIF90aGlzLl9oYW5kbGVEb25lQXBwZWFyaW5nKGtleSk7CisgICAgICB9 CisgICAgfSwgX3RoaXMuX2hhbmRsZURvbmVBcHBlYXJpbmcgPSBmdW5jdGlvbiAoa2V5KSB7Cisg ICAgICB2YXIgY29tcG9uZW50ID0gX3RoaXMucmVmc1trZXldOworICAgICAgaWYgKGNvbXBvbmVu dC5jb21wb25lbnREaWRBcHBlYXIpIHsKKyAgICAgICAgY29tcG9uZW50LmNvbXBvbmVudERpZEFw cGVhcigpOworICAgICAgfQorCisgICAgICBkZWxldGUgX3RoaXMuY3VycmVudGx5VHJhbnNpdGlv bmluZ0tleXNba2V5XTsKKworICAgICAgdmFyIGN1cnJlbnRDaGlsZE1hcHBpbmcgPSBSZWFjdFRy YW5zaXRpb25DaGlsZE1hcHBpbmcuZ2V0Q2hpbGRNYXBwaW5nKF90aGlzLnByb3BzLmNoaWxkcmVu KTsKKworICAgICAgaWYgKCFjdXJyZW50Q2hpbGRNYXBwaW5nIHx8ICFjdXJyZW50Q2hpbGRNYXBw aW5nLmhhc093blByb3BlcnR5KGtleSkpIHsKKyAgICAgICAgLy8gVGhpcyB3YXMgcmVtb3ZlZCBi ZWZvcmUgaXQgaGFkIGZ1bGx5IGFwcGVhcmVkLiBSZW1vdmUgaXQuCisgICAgICAgIF90aGlzLnBl cmZvcm1MZWF2ZShrZXkpOworICAgICAgfQorICAgIH0sIF90aGlzLnBlcmZvcm1FbnRlciA9IGZ1 bmN0aW9uIChrZXkpIHsKKyAgICAgIF90aGlzLmN1cnJlbnRseVRyYW5zaXRpb25pbmdLZXlzW2tl eV0gPSB0cnVlOworCisgICAgICB2YXIgY29tcG9uZW50ID0gX3RoaXMucmVmc1trZXldOworCisg ICAgICBpZiAoY29tcG9uZW50LmNvbXBvbmVudFdpbGxFbnRlcikgeworICAgICAgICBjb21wb25l bnQuY29tcG9uZW50V2lsbEVudGVyKF90aGlzLl9oYW5kbGVEb25lRW50ZXJpbmcuYmluZChfdGhp cywga2V5KSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBfdGhpcy5faGFuZGxlRG9uZUVudGVy aW5nKGtleSk7CisgICAgICB9CisgICAgfSwgX3RoaXMuX2hhbmRsZURvbmVFbnRlcmluZyA9IGZ1 bmN0aW9uIChrZXkpIHsKKyAgICAgIHZhciBjb21wb25lbnQgPSBfdGhpcy5yZWZzW2tleV07Cisg ICAgICBpZiAoY29tcG9uZW50LmNvbXBvbmVudERpZEVudGVyKSB7CisgICAgICAgIGNvbXBvbmVu dC5jb21wb25lbnREaWRFbnRlcigpOworICAgICAgfQorCisgICAgICBkZWxldGUgX3RoaXMuY3Vy cmVudGx5VHJhbnNpdGlvbmluZ0tleXNba2V5XTsKKworICAgICAgdmFyIGN1cnJlbnRDaGlsZE1h cHBpbmcgPSBSZWFjdFRyYW5zaXRpb25DaGlsZE1hcHBpbmcuZ2V0Q2hpbGRNYXBwaW5nKF90aGlz LnByb3BzLmNoaWxkcmVuKTsKKworICAgICAgaWYgKCFjdXJyZW50Q2hpbGRNYXBwaW5nIHx8ICFj dXJyZW50Q2hpbGRNYXBwaW5nLmhhc093blByb3BlcnR5KGtleSkpIHsKKyAgICAgICAgLy8gVGhp cyB3YXMgcmVtb3ZlZCBiZWZvcmUgaXQgaGFkIGZ1bGx5IGVudGVyZWQuIFJlbW92ZSBpdC4KKyAg ICAgICAgX3RoaXMucGVyZm9ybUxlYXZlKGtleSk7CisgICAgICB9CisgICAgfSwgX3RoaXMucGVy Zm9ybUxlYXZlID0gZnVuY3Rpb24gKGtleSkgeworICAgICAgX3RoaXMuY3VycmVudGx5VHJhbnNp dGlvbmluZ0tleXNba2V5XSA9IHRydWU7CisKKyAgICAgIHZhciBjb21wb25lbnQgPSBfdGhpcy5y ZWZzW2tleV07CisgICAgICBpZiAoY29tcG9uZW50LmNvbXBvbmVudFdpbGxMZWF2ZSkgeworICAg ICAgICBjb21wb25lbnQuY29tcG9uZW50V2lsbExlYXZlKF90aGlzLl9oYW5kbGVEb25lTGVhdmlu Zy5iaW5kKF90aGlzLCBrZXkpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIE5vdGUgdGhh dCB0aGlzIGlzIHNvbWV3aGF0IGRhbmdlcm91cyBiL2MgaXQgY2FsbHMgc2V0U3RhdGUoKQorICAg ICAgICAvLyBhZ2FpbiwgZWZmZWN0aXZlbHkgbXV0YXRpbmcgdGhlIGNvbXBvbmVudCBiZWZvcmUg YWxsIHRoZSB3b3JrCisgICAgICAgIC8vIGlzIGRvbmUuCisgICAgICAgIF90aGlzLl9oYW5kbGVE b25lTGVhdmluZyhrZXkpOworICAgICAgfQorICAgIH0sIF90aGlzLl9oYW5kbGVEb25lTGVhdmlu ZyA9IGZ1bmN0aW9uIChrZXkpIHsKKyAgICAgIHZhciBjb21wb25lbnQgPSBfdGhpcy5yZWZzW2tl eV07CisKKyAgICAgIGlmIChjb21wb25lbnQuY29tcG9uZW50RGlkTGVhdmUpIHsKKyAgICAgICAg Y29tcG9uZW50LmNvbXBvbmVudERpZExlYXZlKCk7CisgICAgICB9CisKKyAgICAgIGRlbGV0ZSBf dGhpcy5jdXJyZW50bHlUcmFuc2l0aW9uaW5nS2V5c1trZXldOworCisgICAgICB2YXIgY3VycmVu dENoaWxkTWFwcGluZyA9IFJlYWN0VHJhbnNpdGlvbkNoaWxkTWFwcGluZy5nZXRDaGlsZE1hcHBp bmcoX3RoaXMucHJvcHMuY2hpbGRyZW4pOworCisgICAgICBpZiAoY3VycmVudENoaWxkTWFwcGlu ZyAmJiBjdXJyZW50Q2hpbGRNYXBwaW5nLmhhc093blByb3BlcnR5KGtleSkpIHsKKyAgICAgICAg Ly8gVGhpcyBlbnRlcmVkIGFnYWluIGJlZm9yZSBpdCBmdWxseSBsZWZ0LiBBZGQgaXQgYWdhaW4u CisgICAgICAgIF90aGlzLnBlcmZvcm1FbnRlcihrZXkpOworICAgICAgfSBlbHNlIHsKKyAgICAg ICAgX3RoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKHN0YXRlKSB7CisgICAgICAgICAgdmFyIG5ld0No aWxkcmVuID0gX2Fzc2lnbih7fSwgc3RhdGUuY2hpbGRyZW4pOworICAgICAgICAgIGRlbGV0ZSBu ZXdDaGlsZHJlbltrZXldOworICAgICAgICAgIHJldHVybiB7IGNoaWxkcmVuOiBuZXdDaGlsZHJl biB9OworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9LCBfdGVtcCksIF9wb3NzaWJsZUNvbnN0 cnVjdG9yUmV0dXJuKF90aGlzLCBfcmV0KTsKKyAgfQorCisgIFJlYWN0VHJhbnNpdGlvbkdyb3Vw LnByb3RvdHlwZS5jb21wb25lbnRXaWxsTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsTW91 bnQoKSB7CisgICAgdGhpcy5jdXJyZW50bHlUcmFuc2l0aW9uaW5nS2V5cyA9IHt9OworICAgIHRo aXMua2V5c1RvRW50ZXIgPSBbXTsKKyAgICB0aGlzLmtleXNUb0xlYXZlID0gW107CisgIH07CisK KyAgUmVhY3RUcmFuc2l0aW9uR3JvdXAucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50ID0gZnVu Y3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7CisgICAgdmFyIGluaXRpYWxDaGlsZE1hcHBpbmcg PSB0aGlzLnN0YXRlLmNoaWxkcmVuOworICAgIGZvciAodmFyIGtleSBpbiBpbml0aWFsQ2hpbGRN YXBwaW5nKSB7CisgICAgICBpZiAoaW5pdGlhbENoaWxkTWFwcGluZ1trZXldKSB7CisgICAgICAg IHRoaXMucGVyZm9ybUFwcGVhcihrZXkpOworICAgICAgfQorICAgIH0KKyAgfTsKKworICBSZWFj dFRyYW5zaXRpb25Hcm91cC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9IGZ1 bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7CisgICAgdmFyIG5l eHRDaGlsZE1hcHBpbmcgPSBSZWFjdFRyYW5zaXRpb25DaGlsZE1hcHBpbmcuZ2V0Q2hpbGRNYXBw aW5nKG5leHRQcm9wcy5jaGlsZHJlbik7CisgICAgdmFyIHByZXZDaGlsZE1hcHBpbmcgPSB0aGlz LnN0YXRlLmNoaWxkcmVuOworCisgICAgdGhpcy5zZXRTdGF0ZSh7CisgICAgICBjaGlsZHJlbjog UmVhY3RUcmFuc2l0aW9uQ2hpbGRNYXBwaW5nLm1lcmdlQ2hpbGRNYXBwaW5ncyhwcmV2Q2hpbGRN YXBwaW5nLCBuZXh0Q2hpbGRNYXBwaW5nKQorICAgIH0pOworCisgICAgdmFyIGtleTsKKworICAg IGZvciAoa2V5IGluIG5leHRDaGlsZE1hcHBpbmcpIHsKKyAgICAgIHZhciBoYXNQcmV2ID0gcHJl dkNoaWxkTWFwcGluZyAmJiBwcmV2Q2hpbGRNYXBwaW5nLmhhc093blByb3BlcnR5KGtleSk7Cisg ICAgICBpZiAobmV4dENoaWxkTWFwcGluZ1trZXldICYmICFoYXNQcmV2ICYmICF0aGlzLmN1cnJl bnRseVRyYW5zaXRpb25pbmdLZXlzW2tleV0pIHsKKyAgICAgICAgdGhpcy5rZXlzVG9FbnRlci5w dXNoKGtleSk7CisgICAgICB9CisgICAgfQorCisgICAgZm9yIChrZXkgaW4gcHJldkNoaWxkTWFw cGluZykgeworICAgICAgdmFyIGhhc05leHQgPSBuZXh0Q2hpbGRNYXBwaW5nICYmIG5leHRDaGls ZE1hcHBpbmcuaGFzT3duUHJvcGVydHkoa2V5KTsKKyAgICAgIGlmIChwcmV2Q2hpbGRNYXBwaW5n W2tleV0gJiYgIWhhc05leHQgJiYgIXRoaXMuY3VycmVudGx5VHJhbnNpdGlvbmluZ0tleXNba2V5 XSkgeworICAgICAgICB0aGlzLmtleXNUb0xlYXZlLnB1c2goa2V5KTsKKyAgICAgIH0KKyAgICB9 CisKKyAgICAvLyBJZiB3ZSB3YW50IHRvIHNvbWVkYXkgY2hlY2sgZm9yIHJlb3JkZXJpbmcsIHdl IGNvdWxkIGRvIGl0IGhlcmUuCisgIH07CisKKyAgUmVhY3RUcmFuc2l0aW9uR3JvdXAucHJvdG90 eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHsK KyAgICB2YXIga2V5c1RvRW50ZXIgPSB0aGlzLmtleXNUb0VudGVyOworICAgIHRoaXMua2V5c1Rv RW50ZXIgPSBbXTsKKyAgICBrZXlzVG9FbnRlci5mb3JFYWNoKHRoaXMucGVyZm9ybUVudGVyKTsK KworICAgIHZhciBrZXlzVG9MZWF2ZSA9IHRoaXMua2V5c1RvTGVhdmU7CisgICAgdGhpcy5rZXlz VG9MZWF2ZSA9IFtdOworICAgIGtleXNUb0xlYXZlLmZvckVhY2godGhpcy5wZXJmb3JtTGVhdmUp OworICB9OworCisgIFJlYWN0VHJhbnNpdGlvbkdyb3VwLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5j dGlvbiByZW5kZXIoKSB7CisgICAgLy8gVE9ETzogd2UgY291bGQgZ2V0IHJpZCBvZiB0aGUgbmVl ZCBmb3IgdGhlIHdyYXBwZXIgbm9kZQorICAgIC8vIGJ5IGNsb25pbmcgYSBzaW5nbGUgY2hpbGQK KyAgICB2YXIgY2hpbGRyZW5Ub1JlbmRlciA9IFtdOworICAgIGZvciAodmFyIGtleSBpbiB0aGlz LnN0YXRlLmNoaWxkcmVuKSB7CisgICAgICB2YXIgY2hpbGQgPSB0aGlzLnN0YXRlLmNoaWxkcmVu W2tleV07CisgICAgICBpZiAoY2hpbGQpIHsKKyAgICAgICAgLy8gWW91IG1heSBuZWVkIHRvIGFw cGx5IHJlYWN0aXZlIHVwZGF0ZXMgdG8gYSBjaGlsZCBhcyBpdCBpcyBsZWF2aW5nLgorICAgICAg ICAvLyBUaGUgbm9ybWFsIFJlYWN0IHdheSB0byBkbyBpdCB3b24ndCB3b3JrIHNpbmNlIHRoZSBj aGlsZCB3aWxsIGhhdmUKKyAgICAgICAgLy8gYWxyZWFkeSBiZWVuIHJlbW92ZWQuIEluIGNhc2Ug eW91IG5lZWQgdGhpcyBiZWhhdmlvciB5b3UgY2FuIHByb3ZpZGUKKyAgICAgICAgLy8gYSBjaGls ZEZhY3RvcnkgZnVuY3Rpb24gdG8gd3JhcCBldmVyeSBjaGlsZCwgZXZlbiB0aGUgb25lcyB0aGF0 IGFyZQorICAgICAgICAvLyBsZWF2aW5nLgorICAgICAgICBjaGlsZHJlblRvUmVuZGVyLnB1c2go UmVhY3QuY2xvbmVFbGVtZW50KHRoaXMucHJvcHMuY2hpbGRGYWN0b3J5KGNoaWxkKSwgeyByZWY6 IGtleSwga2V5OiBrZXkgfSkpOworICAgICAgfQorICAgIH0KKworICAgIC8vIERvIG5vdCBmb3J3 YXJkIFJlYWN0VHJhbnNpdGlvbkdyb3VwIHByb3BzIHRvIHByaW1pdGl2ZSBET00gbm9kZXMKKyAg ICB2YXIgcHJvcHMgPSBfYXNzaWduKHt9LCB0aGlzLnByb3BzKTsKKyAgICBkZWxldGUgcHJvcHMu dHJhbnNpdGlvbkxlYXZlOworICAgIGRlbGV0ZSBwcm9wcy50cmFuc2l0aW9uTmFtZTsKKyAgICBk ZWxldGUgcHJvcHMudHJhbnNpdGlvbkFwcGVhcjsKKyAgICBkZWxldGUgcHJvcHMudHJhbnNpdGlv bkVudGVyOworICAgIGRlbGV0ZSBwcm9wcy5jaGlsZEZhY3Rvcnk7CisgICAgZGVsZXRlIHByb3Bz LnRyYW5zaXRpb25MZWF2ZVRpbWVvdXQ7CisgICAgZGVsZXRlIHByb3BzLnRyYW5zaXRpb25FbnRl clRpbWVvdXQ7CisgICAgZGVsZXRlIHByb3BzLnRyYW5zaXRpb25BcHBlYXJUaW1lb3V0OworICAg IGRlbGV0ZSBwcm9wcy5jb21wb25lbnQ7CisKKyAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVu dCh0aGlzLnByb3BzLmNvbXBvbmVudCwgcHJvcHMsIGNoaWxkcmVuVG9SZW5kZXIpOworICB9Owor CisgIHJldHVybiBSZWFjdFRyYW5zaXRpb25Hcm91cDsKK30oUmVhY3QuQ29tcG9uZW50KTsKKwor UmVhY3RUcmFuc2l0aW9uR3JvdXAuZGlzcGxheU5hbWUgPSAnUmVhY3RUcmFuc2l0aW9uR3JvdXAn OworUmVhY3RUcmFuc2l0aW9uR3JvdXAucHJvcFR5cGVzID0geworICBjb21wb25lbnQ6IFJlYWN0 LlByb3BUeXBlcy5hbnksCisgIGNoaWxkRmFjdG9yeTogUmVhY3QuUHJvcFR5cGVzLmZ1bmMKK307 CitSZWFjdFRyYW5zaXRpb25Hcm91cC5kZWZhdWx0UHJvcHMgPSB7CisgIGNvbXBvbmVudDogJ3Nw YW4nLAorICBjaGlsZEZhY3Rvcnk6IGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNBcmd1bWVudAor fTsKKworCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0VHJhbnNpdGlvbkdyb3VwOwpcIE5vIG5ld2xp bmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3Iv cmVhY3QvbGliL1JlYWN0VU1ERW50cnkuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3Jl YWN0L2xpYi9SZWFjdFVNREVudHJ5LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAwLi42NTAzYThmZQotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5k b3IvcmVhY3QvbGliL1JlYWN0VU1ERW50cnkuanMKQEAgLTAsMCArMSwzMSBAQAorLyoqCisgKiBD b3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNl cnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qt c3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBk aXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2Yg cGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2Ft ZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9hc3NpZ24gPSBy ZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7CisKK3ZhciBSZWFjdCA9IHJlcXVpcmUoJy4vUmVhY3Qn KTsKKworLy8gYHZlcnNpb25gIHdpbGwgYmUgYWRkZWQgaGVyZSBieSB0aGUgUmVhY3QgbW9kdWxl LgordmFyIFJlYWN0VU1ERW50cnkgPSBfYXNzaWduKHsKKyAgX19TRUNSRVRfSU5URVJOQUxTX0RP X05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ6IHsKKyAgICBSZWFjdEN1cnJlbnRPd25lcjog cmVxdWlyZSgnLi9SZWFjdEN1cnJlbnRPd25lcicpCisgIH0KK30sIFJlYWN0KTsKKworaWYgKHBy b2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgX2Fzc2lnbihSZWFjdFVN REVudHJ5Ll9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVE LCB7CisgICAgLy8gUmVhY3RDb21wb25lbnRUcmVlSG9vayBzaG91bGQgbm90IGJlIGluY2x1ZGVk IGluIHByb2R1Y3Rpb24uCisgICAgUmVhY3RDb21wb25lbnRUcmVlSG9vazogcmVxdWlyZSgnLi9S ZWFjdENvbXBvbmVudFRyZWVIb29rJykKKyAgfSk7Cit9CisKK21vZHVsZS5leHBvcnRzID0gUmVh Y3RVTURFbnRyeTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIv cGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0L2xpYi9SZWFjdFVNRFNoaW0uanMgYi93ZWIvcGdh ZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0L2xpYi9SZWFjdFVNRFNoaW0uanMKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjUxZjYwYjIwCi0tLSAvZGV2L251bGwKKysrIGIvd2Vi L3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvUmVhY3RVTURTaGltLmpzCkBAIC0wLDAg KzEsMTUgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4K KyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNl bnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNF IGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0 aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRF TlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisvKiBnbG9iYWxzIFJl YWN0ICovCisKKyd1c2Ugc3RyaWN0JzsKKworbW9kdWxlLmV4cG9ydHMgPSBSZWFjdDsKXCBObyBu ZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVu ZG9yL3JlYWN0L2xpYi9SZWFjdFZlcnNpb24uanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9y L3JlYWN0L2xpYi9SZWFjdFZlcnNpb24uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMDAuLjUxMjFiOGI3Ci0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3Zl bmRvci9yZWFjdC9saWIvUmVhY3RWZXJzaW9uLmpzCkBAIC0wLDAgKzEsMTMgQEAKKy8qKgorICog Q29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVz ZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNE LXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qg ZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9m IHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNh bWUgZGlyZWN0b3J5LgorICoKKyAqLworCisndXNlIHN0cmljdCc7CisKK21vZHVsZS5leHBvcnRz ID0gJzE1LjQuMic7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2Vi L3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvUmVhY3RXaXRoQWRkb25zLmpzIGIvd2Vi L3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvUmVhY3RXaXRoQWRkb25zLmpzCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi4zMjYzZmFkMgotLS0gL2Rldi9udWxsCisr KyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL1JlYWN0V2l0aEFkZG9ucy5q cwpAQCAtMCwwICsxLDUyIEBACisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vi b29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNv ZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQor ICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVl LiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBp biB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3Vz ZSBzdHJpY3QnOworCit2YXIgTGlua2VkU3RhdGVNaXhpbiA9IHJlcXVpcmUoJy4vTGlua2VkU3Rh dGVNaXhpbicpOwordmFyIFJlYWN0ID0gcmVxdWlyZSgnLi9SZWFjdCcpOwordmFyIFJlYWN0QWRk b25zRE9NRGVwZW5kZW5jaWVzID0gcmVxdWlyZSgnLi9SZWFjdEFkZG9uc0RPTURlcGVuZGVuY2ll cycpOwordmFyIFJlYWN0Q29tcG9uZW50V2l0aFB1cmVSZW5kZXJNaXhpbiA9IHJlcXVpcmUoJy4v UmVhY3RDb21wb25lbnRXaXRoUHVyZVJlbmRlck1peGluJyk7Cit2YXIgUmVhY3RDU1NUcmFuc2l0 aW9uR3JvdXAgPSByZXF1aXJlKCcuL1JlYWN0Q1NTVHJhbnNpdGlvbkdyb3VwJyk7Cit2YXIgUmVh Y3RGcmFnbWVudCA9IHJlcXVpcmUoJy4vUmVhY3RGcmFnbWVudCcpOwordmFyIFJlYWN0VHJhbnNp dGlvbkdyb3VwID0gcmVxdWlyZSgnLi9SZWFjdFRyYW5zaXRpb25Hcm91cCcpOworCit2YXIgc2hh bGxvd0NvbXBhcmUgPSByZXF1aXJlKCcuL3NoYWxsb3dDb21wYXJlJyk7Cit2YXIgdXBkYXRlID0g cmVxdWlyZSgnLi91cGRhdGUnKTsKKworUmVhY3QuYWRkb25zID0geworICBDU1NUcmFuc2l0aW9u R3JvdXA6IFJlYWN0Q1NTVHJhbnNpdGlvbkdyb3VwLAorICBMaW5rZWRTdGF0ZU1peGluOiBMaW5r ZWRTdGF0ZU1peGluLAorICBQdXJlUmVuZGVyTWl4aW46IFJlYWN0Q29tcG9uZW50V2l0aFB1cmVS ZW5kZXJNaXhpbiwKKyAgVHJhbnNpdGlvbkdyb3VwOiBSZWFjdFRyYW5zaXRpb25Hcm91cCwKKwor ICBjcmVhdGVGcmFnbWVudDogUmVhY3RGcmFnbWVudC5jcmVhdGUsCisgIHNoYWxsb3dDb21wYXJl OiBzaGFsbG93Q29tcGFyZSwKKyAgdXBkYXRlOiB1cGRhdGUKK307CisKK2lmIChwcm9jZXNzLmVu di5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgIC8vIEZvciB0aGUgVU1EIGJ1aWxkIHdl IGdldCB0aGVzZSBsYXppbHkgZnJvbSB0aGUgZ2xvYmFsIHNpbmNlIHRoZXkncmUgdGllZAorICAv LyB0byB0aGUgRE9NIHJlbmRlcmVyIGFuZCBpdCBoYXNuJ3QgbG9hZGVkIHlldC4KKyAgT2JqZWN0 LmRlZmluZVByb3BlcnR5KFJlYWN0LmFkZG9ucywgJ1BlcmYnLCB7CisgICAgZW51bWVyYWJsZTog dHJ1ZSwKKyAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBSZWFjdEFkZG9uc0RP TURlcGVuZGVuY2llcy5nZXRSZWFjdFBlcmYoKTsKKyAgICB9CisgIH0pOworICBPYmplY3QuZGVm aW5lUHJvcGVydHkoUmVhY3QuYWRkb25zLCAnVGVzdFV0aWxzJywgeworICAgIGVudW1lcmFibGU6 IHRydWUsCisgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gUmVhY3RBZGRvbnNE T01EZXBlbmRlbmNpZXMuZ2V0UmVhY3RUZXN0VXRpbHMoKTsKKyAgICB9CisgIH0pOworfQorCitt b2R1bGUuZXhwb3J0cyA9IFJlYWN0OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAt LWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL1JlYWN0V2l0aEFkZG9u c1VNREVudHJ5LmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvUmVhY3RX aXRoQWRkb25zVU1ERW50cnkuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAu LjllMTJkMDIxCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9y ZWFjdC9saWIvUmVhY3RXaXRoQWRkb25zVU1ERW50cnkuanMKQEAgLTAsMCArMSwzMiBAQAorLyoq CisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0 cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRo ZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUg cm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAor ICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0 aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9hc3Np Z24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7CisKK3ZhciBSZWFjdFdpdGhBZGRvbnMgPSBy ZXF1aXJlKCcuL1JlYWN0V2l0aEFkZG9ucycpOworCisvLyBgdmVyc2lvbmAgd2lsbCBiZSBhZGRl ZCBoZXJlIGJ5IHRoZSBSZWFjdCBtb2R1bGUuCit2YXIgUmVhY3RXaXRoQWRkb25zVU1ERW50cnkg PSBfYXNzaWduKHsKKyAgX19TRUNSRVRfSU5KRUNURURfUkVBQ1RfRE9NX0RPX05PVF9VU0VfT1Jf WU9VX1dJTExfQkVfRklSRUQ6IG51bGwsIC8vIFdpbGwgYmUgaW5qZWN0ZWQgYnkgUmVhY3RET00g VU1EIGJ1aWxkLgorICBfX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9C RV9GSVJFRDogeworICAgIFJlYWN0Q3VycmVudE93bmVyOiByZXF1aXJlKCcuL1JlYWN0Q3VycmVu dE93bmVyJykKKyAgfQorfSwgUmVhY3RXaXRoQWRkb25zKTsKKworaWYgKHByb2Nlc3MuZW52Lk5P REVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgX2Fzc2lnbihSZWFjdFdpdGhBZGRvbnNVTURF bnRyeS5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCwg eworICAgIC8vIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBp biBwcm9kdWN0aW9uLgorICAgIFJlYWN0Q29tcG9uZW50VHJlZUhvb2s6IHJlcXVpcmUoJy4vUmVh Y3RDb21wb25lbnRUcmVlSG9vaycpCisgIH0pOworfQorCittb2R1bGUuZXhwb3J0cyA9IFJlYWN0 V2l0aEFkZG9uc1VNREVudHJ5OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdp dCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL2NhbkRlZmluZVByb3BlcnR5 LmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvY2FuRGVmaW5lUHJvcGVy dHkuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLmNkZTlmNWM1Ci0tLSAv ZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvY2FuRGVm aW5lUHJvcGVydHkuanMKQEAgLTAsMCArMSwyNSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1w cmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBU aGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBm b3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhp cyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBj YW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisg KgorICogCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgY2FuRGVmaW5lUHJvcGVydHkgPSBm YWxzZTsKK2lmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgIHRy eSB7CisgICAgLy8gJEZsb3dGaXhNZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9p c3N1ZXMvMjg1CisgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAneCcsIHsgZ2V0OiBmdW5j dGlvbiAoKSB7fSB9KTsKKyAgICBjYW5EZWZpbmVQcm9wZXJ0eSA9IHRydWU7CisgIH0gY2F0Y2gg KHgpIHsKKyAgICAvLyBJRSB3aWxsIGZhaWwgb24gZGVmaW5lUHJvcGVydHkKKyAgfQorfQorCitt b2R1bGUuZXhwb3J0cyA9IGNhbkRlZmluZVByb3BlcnR5OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9m IGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL2No ZWNrUmVhY3RUeXBlU3BlYy5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGli L2NoZWNrUmVhY3RUeXBlU3BlYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw MC4uOTY4NGQwMzQKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9y L3JlYWN0L2xpYi9jaGVja1JlYWN0VHlwZVNwZWMuanMKQEAgLTAsMCArMSw4NiBAQAorLyoqCisg KiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyBy ZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBC U0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9v dCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICog b2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUg c2FtZSBkaXJlY3RvcnkuCisgKgorICovCisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF9wcm9kSW52 YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTsKKwordmFyIFJlYWN0UHJv cFR5cGVMb2NhdGlvbk5hbWVzID0gcmVxdWlyZSgnLi9SZWFjdFByb3BUeXBlTG9jYXRpb25OYW1l cycpOwordmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9SZWFjdFByb3BUeXBl c1NlY3JldCcpOworCit2YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50 Jyk7Cit2YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTsKKwordmFyIFJl YWN0Q29tcG9uZW50VHJlZUhvb2s7CisKK2lmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5l ZCcgJiYgcHJvY2Vzcy5lbnYgJiYgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0Jykgewor ICAvLyBUZW1wb3JhcnkgaGFjay4KKyAgLy8gSW5saW5lIHJlcXVpcmVzIGRvbid0IHdvcmsgd2Vs bCB3aXRoIEplc3Q6CisgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1 ZXMvNzI0MAorICAvLyBSZW1vdmUgdGhlIGlubGluZSByZXF1aXJlcyB3aGVuIHdlIGRvbid0IG5l ZWQgdGhlbSBhbnltb3JlOgorICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3Qv cHVsbC83MTc4CisgIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSByZXF1aXJlKCcuL1JlYWN0Q29t cG9uZW50VHJlZUhvb2snKTsKK30KKwordmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9OworCisv KioKKyAqIEFzc2VydCB0aGF0IHRoZSB2YWx1ZXMgbWF0Y2ggd2l0aCB0aGUgdHlwZSBzcGVjcy4K KyAqIEVycm9yIG1lc3NhZ2VzIGFyZSBtZW1vcml6ZWQgYW5kIHdpbGwgb25seSBiZSBzaG93biBv bmNlLgorICoKKyAqIEBwYXJhbSB7b2JqZWN0fSB0eXBlU3BlY3MgTWFwIG9mIG5hbWUgdG8gYSBS ZWFjdFByb3BUeXBlCisgKiBAcGFyYW0ge29iamVjdH0gdmFsdWVzIFJ1bnRpbWUgdmFsdWVzIHRo YXQgbmVlZCB0byBiZSB0eXBlLWNoZWNrZWQKKyAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbiBl LmcuICJwcm9wIiwgImNvbnRleHQiLCAiY2hpbGQgY29udGV4dCIKKyAqIEBwYXJhbSB7c3RyaW5n fSBjb21wb25lbnROYW1lIE5hbWUgb2YgdGhlIGNvbXBvbmVudCBmb3IgZXJyb3IgbWVzc2FnZXMu CisgKiBAcGFyYW0gez9vYmplY3R9IGVsZW1lbnQgVGhlIFJlYWN0IGVsZW1lbnQgdGhhdCBpcyBi ZWluZyB0eXBlLWNoZWNrZWQKKyAqIEBwYXJhbSB7P251bWJlcn0gZGVidWdJRCBUaGUgUmVhY3Qg Y29tcG9uZW50IGluc3RhbmNlIHRoYXQgaXMgYmVpbmcgdHlwZS1jaGVja2VkCisgKiBAcHJpdmF0 ZQorICovCitmdW5jdGlvbiBjaGVja1JlYWN0VHlwZVNwZWModHlwZVNwZWNzLCB2YWx1ZXMsIGxv Y2F0aW9uLCBjb21wb25lbnROYW1lLCBlbGVtZW50LCBkZWJ1Z0lEKSB7CisgIGZvciAodmFyIHR5 cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHsKKyAgICBpZiAodHlwZVNwZWNzLmhhc093blByb3Bl cnR5KHR5cGVTcGVjTmFtZSkpIHsKKyAgICAgIHZhciBlcnJvcjsKKyAgICAgIC8vIFByb3AgdHlw ZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRv CisgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVm b3JlLiBTbyB3ZSBsb2cgaXQuCisgICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5l ZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuCisgICAgICB0cnkgeworICAgICAgICAvLyBUaGlz IGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhl IHNhbWUKKyAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNl cHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLgorICAgICAgICAhKHR5cGVvZiB0eXBlU3BlY3NbdHlw ZVNwZWNOYW1lXSA9PT0gJ2Z1bmN0aW9uJykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3By b2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXM6ICVzIHR5cGUgYCVzYCBpcyBpbnZhbGlk OyBpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSBSZWFjdC5Qcm9wVHlwZXMuJywg Y29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1l c1tsb2NhdGlvbl0sIHR5cGVTcGVjTmFtZSkgOiBfcHJvZEludmFyaWFudCgnODQnLCBjb21wb25l bnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0 aW9uXSwgdHlwZVNwZWNOYW1lKSA6IHZvaWQgMDsKKyAgICAgICAgZXJyb3IgPSB0eXBlU3BlY3Nb dHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRp b24sIG51bGwsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTsKKyAgICAgIH0gY2F0Y2ggKGV4KSB7Cisg ICAgICAgIGVycm9yID0gZXg7CisgICAgICB9CisgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAh PT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghZXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBFcnJv ciwgJyVzOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJXMgYCVzYCBpcyBpbnZhbGlkOyB0aGUgdHlw ZSBjaGVja2VyICcgKyAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAg YnV0IHJldHVybmVkIGEgJXMuICcgKyAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFu IGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArICdjcmVhdG9yIChhcnJheU9mLCBpbnN0 YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgKyAnc2hhcGUgYWxsIHJl cXVpcmUgYW4gYXJndW1lbnQpLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgUmVh Y3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dLCB0eXBlU3BlY05hbWUsIHR5cGVvZiBl cnJvcikgOiB2b2lkIDA7CisgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVy cm9yLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkgeworICAgICAgICAvLyBPbmx5IG1v bml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBv ZiB0aGUKKyAgICAgICAgLy8gc2FtZSBlcnJvci4KKyAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVz W2Vycm9yLm1lc3NhZ2VdID0gdHJ1ZTsKKworICAgICAgICB2YXIgY29tcG9uZW50U3RhY2tJbmZv ID0gJyc7CisKKyAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlv bicpIHsKKyAgICAgICAgICBpZiAoIVJlYWN0Q29tcG9uZW50VHJlZUhvb2spIHsKKyAgICAgICAg ICAgIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSByZXF1aXJlKCcuL1JlYWN0Q29tcG9uZW50VHJl ZUhvb2snKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGRlYnVnSUQgIT09IG51bGwpIHsK KyAgICAgICAgICAgIGNvbXBvbmVudFN0YWNrSW5mbyA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2su Z2V0U3RhY2tBZGRlbmR1bUJ5SUQoZGVidWdJRCk7CisgICAgICAgICAgfSBlbHNlIGlmIChlbGVt ZW50ICE9PSBudWxsKSB7CisgICAgICAgICAgICBjb21wb25lbnRTdGFja0luZm8gPSBSZWFjdENv bXBvbmVudFRyZWVIb29rLmdldEN1cnJlbnRTdGFja0FkZGVuZHVtKGVsZW1lbnQpOworICAgICAg ICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJv ZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnRmFpbGVkICVzIHR5cGU6ICVzJXMnLCBsb2NhdGlv biwgZXJyb3IubWVzc2FnZSwgY29tcG9uZW50U3RhY2tJbmZvKSA6IHZvaWQgMDsKKyAgICAgIH0K KyAgICB9CisgIH0KK30KKworbW9kdWxlLmV4cG9ydHMgPSBjaGVja1JlYWN0VHlwZVNwZWM7Clwg Tm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGlj L3ZlbmRvci9yZWFjdC9saWIvZGVwcmVjYXRlZC5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5k b3IvcmVhY3QvbGliL2RlcHJlY2F0ZWQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMDAuLmFhMGI0OWZjCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3Zl bmRvci9yZWFjdC9saWIvZGVwcmVjYXRlZC5qcwpAQCAtMCwwICsxLDU2IEBACisvKioKKyAqIENv cHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2Vy dmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1z dHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRp cmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBw YXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1l IGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfYXNzaWdu ID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpOworCit2YXIgd2FybmluZyA9IHJlcXVpcmUoJ2Zi anMvbGliL3dhcm5pbmcnKTsKKworLyoqCisgKiBUaGlzIHdpbGwgbG9nIGEgc2luZ2xlIGRlcHJl Y2F0aW9uIG5vdGljZSBwZXIgZnVuY3Rpb24gYW5kIGZvcndhcmQgdGhlIGNhbGwKKyAqIG9uIHRv IHRoZSBuZXcgQVBJLgorICoKKyAqIEBwYXJhbSB7c3RyaW5nfSBmbk5hbWUgVGhlIG5hbWUgb2Yg dGhlIGZ1bmN0aW9uCisgKiBAcGFyYW0ge3N0cmluZ30gbmV3TW9kdWxlIFRoZSBtb2R1bGUgdGhh dCBmbiB3aWxsIGV4aXN0IGluCisgKiBAcGFyYW0ge3N0cmluZ30gbmV3UGFja2FnZSBUaGUgbW9k dWxlIHRoYXQgZm4gd2lsbCBleGlzdCBpbgorICogQHBhcmFtIHsqfSBjdHggVGhlIGNvbnRleHQg dGhpcyBmb3J3YXJkZWQgY2FsbCBzaG91bGQgcnVuIGluCisgKiBAcGFyYW0ge2Z1bmN0aW9ufSBm biBUaGUgZnVuY3Rpb24gdG8gZm9yd2FyZCBvbiB0bworICogQHJldHVybiB7ZnVuY3Rpb259IFRo ZSBmdW5jdGlvbiB0aGF0IHdpbGwgd2FybiBvbmNlIGFuZCB0aGVuIGNhbGwgZm4KKyAqLworZnVu Y3Rpb24gZGVwcmVjYXRlZChmbk5hbWUsIG5ld01vZHVsZSwgbmV3UGFja2FnZSwgY3R4LCBmbikg eworICB2YXIgd2FybmVkID0gZmFsc2U7CisgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0g J3Byb2R1Y3Rpb24nKSB7CisgICAgdmFyIG5ld0ZuID0gZnVuY3Rpb24gKCkgeworICAgICAgcHJv Y2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcod2FybmVkLAorICAg ICAgLyogZXNsaW50LWRpc2FibGUgbm8tdXNlbGVzcy1jb25jYXQgKi8KKyAgICAgIC8vIFJlcXVp cmUgZXhhbXBsZXMgaW4gdGhpcyBzdHJpbmcgbXVzdCBiZSBzcGxpdCB0byBwcmV2ZW50IFJlYWN0 J3MKKyAgICAgIC8vIGJ1aWxkIHRvb2xzIGZyb20gbWlzdGFraW5nIHRoZW0gZm9yIHJlYWwgcmVx dWlyZXMuCisgICAgICAvLyBPdGhlcndpc2UgdGhlIGJ1aWxkIHRvb2xzIHdpbGwgYXR0ZW1wdCB0 byBidWlsZCBhICclcycgbW9kdWxlLgorICAgICAgJ1JlYWN0LiVzIGlzIGRlcHJlY2F0ZWQuIFBs ZWFzZSB1c2UgJXMuJXMgZnJvbSByZXF1aXJlJyArICcoXCclc1wnKSAnICsgJ2luc3RlYWQuJywg Zm5OYW1lLCBuZXdNb2R1bGUsIGZuTmFtZSwgbmV3UGFja2FnZSkgOiB2b2lkIDA7CisgICAgICAv KiBlc2xpbnQtZW5hYmxlIG5vLXVzZWxlc3MtY29uY2F0ICovCisgICAgICB3YXJuZWQgPSB0cnVl OworICAgICAgcmV0dXJuIGZuLmFwcGx5KGN0eCwgYXJndW1lbnRzKTsKKyAgICB9OworICAgIC8v IFdlIG5lZWQgdG8gbWFrZSBzdXJlIGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBvcmlnaW5hbCBmbiBh cmUgY29waWVkIG92ZXIuCisgICAgLy8gSW4gcGFydGljdWxhciwgdGhpcyBpcyBuZWVkZWQgdG8g c3VwcG9ydCBQcm9wVHlwZXMKKyAgICBfYXNzaWduKG5ld0ZuLCBmbik7CisKKyAgICAvLyBGbG93 IGlzIG5vdCBzbWFydCBlbm91Z2ggdG8gZmlndXJlIG91dCB0aGF0IG5ld0ZuIGlzIG9mIHRoZSBz YW1lIHR5cGUgYXMKKyAgICAvLyBmbi4gU2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBsb3NlIG91dCB0 aGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24sIGNhc3RpbmcKKyAgICAvLyB0byBhbnkgYW5kIGZvcmNl IGZsb3cgdG8gdXNlIFQuCisgICAgcmV0dXJuIG5ld0ZuOworICB9CisKKyAgcmV0dXJuIGZuOwor fQorCittb2R1bGUuZXhwb3J0cyA9IGRlcHJlY2F0ZWQ7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2Yg ZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvZmxh dHRlbkNoaWxkcmVuLmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvZmxh dHRlbkNoaWxkcmVuLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi4wMDUy NTlhMQotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3Qv bGliL2ZsYXR0ZW5DaGlsZHJlbi5qcwpAQCAtMCwwICsxLDc1IEBACisvKioKKyAqIENvcHlyaWdo dCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgor ICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBs aWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9y eSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBwYXRlbnQg cmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVj dG9yeS4KKyAqCisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBLZXlFc2NhcGVVdGls cyA9IHJlcXVpcmUoJy4vS2V5RXNjYXBlVXRpbHMnKTsKK3ZhciB0cmF2ZXJzZUFsbENoaWxkcmVu ID0gcmVxdWlyZSgnLi90cmF2ZXJzZUFsbENoaWxkcmVuJyk7Cit2YXIgd2FybmluZyA9IHJlcXVp cmUoJ2ZianMvbGliL3dhcm5pbmcnKTsKKwordmFyIFJlYWN0Q29tcG9uZW50VHJlZUhvb2s7CisK K2lmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5lbnYgJiYgcHJv Y2Vzcy5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0JykgeworICAvLyBUZW1wb3JhcnkgaGFjay4KKyAg Ly8gSW5saW5lIHJlcXVpcmVzIGRvbid0IHdvcmsgd2VsbCB3aXRoIEplc3Q6CisgIC8vIGh0dHBz Oi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzI0MAorICAvLyBSZW1vdmUgdGhl IGlubGluZSByZXF1aXJlcyB3aGVuIHdlIGRvbid0IG5lZWQgdGhlbSBhbnltb3JlOgorICAvLyBo dHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC83MTc4CisgIFJlYWN0Q29tcG9u ZW50VHJlZUhvb2sgPSByZXF1aXJlKCcuL1JlYWN0Q29tcG9uZW50VHJlZUhvb2snKTsKK30KKwor LyoqCisgKiBAcGFyYW0ge2Z1bmN0aW9ufSB0cmF2ZXJzZUNvbnRleHQgQ29udGV4dCBwYXNzZWQg dGhyb3VnaCB0cmF2ZXJzYWwuCisgKiBAcGFyYW0gez9SZWFjdENvbXBvbmVudH0gY2hpbGQgUmVh Y3QgY2hpbGQgY29tcG9uZW50LgorICogQHBhcmFtIHshc3RyaW5nfSBuYW1lIFN0cmluZyBuYW1l IG9mIGtleSBwYXRoIHRvIGNoaWxkLgorICogQHBhcmFtIHtudW1iZXI9fSBzZWxmRGVidWdJRCBP cHRpb25hbCBkZWJ1Z0lEIG9mIHRoZSBjdXJyZW50IGludGVybmFsIGluc3RhbmNlLgorICovCitm dW5jdGlvbiBmbGF0dGVuU2luZ2xlQ2hpbGRJbnRvQ29udGV4dCh0cmF2ZXJzZUNvbnRleHQsIGNo aWxkLCBuYW1lLCBzZWxmRGVidWdJRCkgeworICAvLyBXZSBmb3VuZCBhIGNvbXBvbmVudCBpbnN0 YW5jZS4KKyAgaWYgKHRyYXZlcnNlQ29udGV4dCAmJiB0eXBlb2YgdHJhdmVyc2VDb250ZXh0ID09 PSAnb2JqZWN0JykgeworICAgIHZhciByZXN1bHQgPSB0cmF2ZXJzZUNvbnRleHQ7CisgICAgdmFy IGtleVVuaXF1ZSA9IHJlc3VsdFtuYW1lXSA9PT0gdW5kZWZpbmVkOworICAgIGlmIChwcm9jZXNz LmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CisgICAgICBpZiAoIVJlYWN0Q29tcG9u ZW50VHJlZUhvb2spIHsKKyAgICAgICAgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHJlcXVpcmUo Jy4vUmVhY3RDb21wb25lbnRUcmVlSG9vaycpOworICAgICAgfQorICAgICAgaWYgKCFrZXlVbmlx dWUpIHsKKyAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdh cm5pbmcoZmFsc2UsICdmbGF0dGVuQ2hpbGRyZW4oLi4uKTogRW5jb3VudGVyZWQgdHdvIGNoaWxk cmVuIHdpdGggdGhlIHNhbWUga2V5LCAnICsgJ2Alc2AuIENoaWxkIGtleXMgbXVzdCBiZSB1bmlx dWU7IHdoZW4gdHdvIGNoaWxkcmVuIHNoYXJlIGEga2V5LCBvbmx5ICcgKyAndGhlIGZpcnN0IGNo aWxkIHdpbGwgYmUgdXNlZC4lcycsIEtleUVzY2FwZVV0aWxzLnVuZXNjYXBlKG5hbWUpLCBSZWFj dENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKHNlbGZEZWJ1Z0lEKSkgOiB2 b2lkIDA7CisgICAgICB9CisgICAgfQorICAgIGlmIChrZXlVbmlxdWUgJiYgY2hpbGQgIT0gbnVs bCkgeworICAgICAgcmVzdWx0W25hbWVdID0gY2hpbGQ7CisgICAgfQorICB9Cit9CisKKy8qKgor ICogRmxhdHRlbnMgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJv cHMuY2hpbGRyZW5gLiBBbnkgbnVsbAorICogY2hpbGRyZW4gd2lsbCBub3QgYmUgaW5jbHVkZWQg aW4gdGhlIHJlc3VsdGluZyBvYmplY3QuCisgKiBAcmV0dXJuIHshb2JqZWN0fSBmbGF0dGVuZWQg Y2hpbGRyZW4ga2V5ZWQgYnkgbmFtZS4KKyAqLworZnVuY3Rpb24gZmxhdHRlbkNoaWxkcmVuKGNo aWxkcmVuLCBzZWxmRGVidWdJRCkgeworICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgeworICAgIHJl dHVybiBjaGlsZHJlbjsKKyAgfQorICB2YXIgcmVzdWx0ID0ge307CisKKyAgaWYgKHByb2Nlc3Mu ZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKKyAgICB0cmF2ZXJzZUFsbENoaWxkcmVu KGNoaWxkcmVuLCBmdW5jdGlvbiAodHJhdmVyc2VDb250ZXh0LCBjaGlsZCwgbmFtZSkgeworICAg ICAgcmV0dXJuIGZsYXR0ZW5TaW5nbGVDaGlsZEludG9Db250ZXh0KHRyYXZlcnNlQ29udGV4dCwg Y2hpbGQsIG5hbWUsIHNlbGZEZWJ1Z0lEKTsKKyAgICB9LCByZXN1bHQpOworICB9IGVsc2Ugewor ICAgIHRyYXZlcnNlQWxsQ2hpbGRyZW4oY2hpbGRyZW4sIGZsYXR0ZW5TaW5nbGVDaGlsZEludG9D b250ZXh0LCByZXN1bHQpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK21vZHVsZS5leHBv cnRzID0gZmxhdHRlbkNoaWxkcmVuOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAt LWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL2dldEl0ZXJhdG9yRm4u anMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0L2xpYi9nZXRJdGVyYXRvckZuLmpz Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi45NWVlZDQyMgotLS0gL2Rldi9u dWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL2dldEl0ZXJhdG9y Rm4uanMKQEAgLTAsMCArMSw0MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBG YWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJj ZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0 aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2Ug dHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91 bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICogCisg Ki8KKworJ3VzZSBzdHJpY3QnOworCisvKiBnbG9iYWwgU3ltYm9sICovCisKK3ZhciBJVEVSQVRP Ul9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5pdGVyYXRv cjsKK3ZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJzsgLy8gQmVmb3JlIFN5 bWJvbCBzcGVjLgorCisvKioKKyAqIFJldHVybnMgdGhlIGl0ZXJhdG9yIG1ldGhvZCBmdW5jdGlv biBjb250YWluZWQgb24gdGhlIGl0ZXJhYmxlIG9iamVjdC4KKyAqCisgKiBCZSBzdXJlIHRvIGlu dm9rZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgaXRlcmFibGUgYXMgY29udGV4dDoKKyAqCisgKiAg ICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG15SXRlcmFibGUpOworICogICAgIGlm IChpdGVyYXRvckZuKSB7CisgKiAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwo bXlJdGVyYWJsZSk7CisgKiAgICAgICAuLi4KKyAqICAgICB9CisgKgorICogQHBhcmFtIHs/b2Jq ZWN0fSBtYXliZUl0ZXJhYmxlCisgKiBAcmV0dXJuIHs/ZnVuY3Rpb259CisgKi8KK2Z1bmN0aW9u IGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkgeworICB2YXIgaXRlcmF0b3JGbiA9IG1heWJl SXRlcmFibGUgJiYgKElURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW0lURVJBVE9SX1NZ TUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF0pOworICBpZiAodHlw ZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHsKKyAgICByZXR1cm4gaXRlcmF0b3JGbjsK KyAgfQorfQorCittb2R1bGUuZXhwb3J0cyA9IGdldEl0ZXJhdG9yRm47ClwgTm8gbmV3bGluZSBh dCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFj dC9saWIvZ2V0TmV4dERlYnVnSUQuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0 L2xpYi9nZXROZXh0RGVidWdJRC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw MC4uMjhjZDc4YTcKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9y L3JlYWN0L2xpYi9nZXROZXh0RGVidWdJRC5qcwpAQCAtMCwwICsxLDIwIEBACisvKioKKyAqIENv cHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2Vy dmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1z dHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRp cmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBw YXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1l IGRpcmVjdG9yeS4KKyAqCisgKiAKKyAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBuZXh0RGVi dWdJRCA9IDE7CisKK2Z1bmN0aW9uIGdldE5leHREZWJ1Z0lEKCkgeworICByZXR1cm4gbmV4dERl YnVnSUQrKzsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBnZXROZXh0RGVidWdJRDsKXCBObyBuZXds aW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9y L3JlYWN0L2xpYi9vbmx5Q2hpbGQuanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0 L2xpYi9vbmx5Q2hpbGQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjUy N2Q2ZTY0Ci0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFj dC9saWIvb25seUNoaWxkLmpzCkBAIC0wLDAgKzEsMzcgQEAKKy8qKgorICogQ29weXJpZ2h0IDIw MTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor ICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vu c2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9m IHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdo dHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5 LgorICoKKyAqLworJ3VzZSBzdHJpY3QnOworCit2YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJl KCcuL3JlYWN0UHJvZEludmFyaWFudCcpOworCit2YXIgUmVhY3RFbGVtZW50ID0gcmVxdWlyZSgn Li9SZWFjdEVsZW1lbnQnKTsKKwordmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2lu dmFyaWFudCcpOworCisvKioKKyAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGluIGEgY29sbGVj dGlvbiBvZiBjaGlsZHJlbiBhbmQgdmVyaWZpZXMgdGhhdCB0aGVyZQorICogaXMgb25seSBvbmUg Y2hpbGQgaW4gdGhlIGNvbGxlY3Rpb24uCisgKgorICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0 aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNoaWxkcmVuLm9ubHkK KyAqCisgKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGFzc3Vt ZXMgdGhhdCBhIHNpbmdsZSBjaGlsZCBnZXRzCisgKiBwYXNzZWQgd2l0aG91dCBhIHdyYXBwZXIs IGJ1dCB0aGUgcHVycG9zZSBvZiB0aGlzIGhlbHBlciBmdW5jdGlvbiBpcyB0bworICogYWJzdHJh Y3QgYXdheSB0aGUgcGFydGljdWxhciBzdHJ1Y3R1cmUgb2YgY2hpbGRyZW4uCisgKgorICogQHBh cmFtIHs/b2JqZWN0fSBjaGlsZHJlbiBDaGlsZCBjb2xsZWN0aW9uIHN0cnVjdHVyZS4KKyAqIEBy ZXR1cm4ge1JlYWN0RWxlbWVudH0gVGhlIGZpcnN0IGFuZCBvbmx5IGBSZWFjdEVsZW1lbnRgIGNv bnRhaW5lZCBpbiB0aGUKKyAqIHN0cnVjdHVyZS4KKyAqLworZnVuY3Rpb24gb25seUNoaWxkKGNo aWxkcmVuKSB7CisgICFSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pID8gcHJv Y2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1Jl YWN0LkNoaWxkcmVuLm9ubHkgZXhwZWN0ZWQgdG8gcmVjZWl2ZSBhIHNpbmdsZSBSZWFjdCBlbGVt ZW50IGNoaWxkLicpIDogX3Byb2RJbnZhcmlhbnQoJzE0MycpIDogdm9pZCAwOworICByZXR1cm4g Y2hpbGRyZW47Cit9CisKK21vZHVsZS5leHBvcnRzID0gb25seUNoaWxkOwpcIE5vIG5ld2xpbmUg YXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVh Y3QvbGliL3JlYWN0UHJvZEludmFyaWFudC5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3Iv cmVhY3QvbGliL3JlYWN0UHJvZEludmFyaWFudC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMC4uYjkwZjllYjAKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0 aWMvdmVuZG9yL3JlYWN0L2xpYi9yZWFjdFByb2RJbnZhcmlhbnQuanMKQEAgLTAsMCArMSwzOCBA QAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAq IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNl ZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZp bGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9u YWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRT IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIAorICovCisndXNlIHN0cmljdCc7 CisKKy8qKgorICogV0FSTklORzogRE8gTk9UIG1hbnVhbGx5IHJlcXVpcmUgdGhpcyBtb2R1bGUu CisgKiBUaGlzIGlzIGEgcmVwbGFjZW1lbnQgZm9yIGBpbnZhcmlhbnQoLi4uKWAgdXNlZCBieSB0 aGUgZXJyb3IgY29kZSBzeXN0ZW0KKyAqIGFuZCB3aWxsIF9vbmx5XyBiZSByZXF1aXJlZCBieSB0 aGUgY29ycmVzcG9uZGluZyBiYWJlbCBwYXNzLgorICogSXQgYWx3YXlzIHRocm93cy4KKyAqLwor CitmdW5jdGlvbiByZWFjdFByb2RJbnZhcmlhbnQoY29kZSkgeworICB2YXIgYXJnQ291bnQgPSBh cmd1bWVudHMubGVuZ3RoIC0gMTsKKworICB2YXIgbWVzc2FnZSA9ICdNaW5pZmllZCBSZWFjdCBl cnJvciAjJyArIGNvZGUgKyAnOyB2aXNpdCAnICsgJ2h0dHA6Ly9mYWNlYm9vay5naXRodWIuaW8v cmVhY3QvZG9jcy9lcnJvci1kZWNvZGVyLmh0bWw/aW52YXJpYW50PScgKyBjb2RlOworCisgIGZv ciAodmFyIGFyZ0lkeCA9IDA7IGFyZ0lkeCA8IGFyZ0NvdW50OyBhcmdJZHgrKykgeworICAgIG1l c3NhZ2UgKz0gJyZhcmdzW109JyArIGVuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbYXJnSWR4 ICsgMV0pOworICB9CisKKyAgbWVzc2FnZSArPSAnIGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVz ZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCcgKyAnIGZvciBmdWxsIGVycm9ycyBh bmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLic7CisKKyAgdmFyIGVycm9yID0gbmV3IEVy cm9yKG1lc3NhZ2UpOworICBlcnJvci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nOworICBl cnJvci5mcmFtZXNUb1BvcCA9IDE7IC8vIHdlIGRvbid0IGNhcmUgYWJvdXQgcmVhY3RQcm9kSW52 YXJpYW50J3Mgb3duIGZyYW1lCisKKyAgdGhyb3cgZXJyb3I7Cit9CisKK21vZHVsZS5leHBvcnRz ID0gcmVhY3RQcm9kSW52YXJpYW50OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAt LWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL3NoYWxsb3dDb21wYXJl LmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvc2hhbGxvd0NvbXBhcmUu anMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjQyZjc0Y2UwCi0tLSAvZGV2 L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9saWIvc2hhbGxvd0Nv bXBhcmUuanMKQEAgLTAsMCArMSwyNCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50 LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNv dXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBp biB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3Vy Y2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAorICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUg Zm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgKgorICov CisKKyd1c2Ugc3RyaWN0JzsKKwordmFyIHNoYWxsb3dFcXVhbCA9IHJlcXVpcmUoJ2ZianMvbGli L3NoYWxsb3dFcXVhbCcpOworCisvKioKKyAqIERvZXMgYSBzaGFsbG93IGNvbXBhcmlzb24gZm9y IHByb3BzIGFuZCBzdGF0ZS4KKyAqIFNlZSBSZWFjdENvbXBvbmVudFdpdGhQdXJlUmVuZGVyTWl4 aW4KKyAqIFNlZSBhbHNvIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3Mvc2hh bGxvdy1jb21wYXJlLmh0bWwKKyAqLworZnVuY3Rpb24gc2hhbGxvd0NvbXBhcmUoaW5zdGFuY2Us IG5leHRQcm9wcywgbmV4dFN0YXRlKSB7CisgIHJldHVybiAhc2hhbGxvd0VxdWFsKGluc3RhbmNl LnByb3BzLCBuZXh0UHJvcHMpIHx8ICFzaGFsbG93RXF1YWwoaW5zdGFuY2Uuc3RhdGUsIG5leHRT dGF0ZSk7Cit9CisKK21vZHVsZS5leHBvcnRzID0gc2hhbGxvd0NvbXBhcmU7ClwgTm8gbmV3bGlu ZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9y ZWFjdC9saWIvc2xpY2VDaGlsZHJlbi5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVh Y3QvbGliL3NsaWNlQ2hpbGRyZW4uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MDAuLmRjNTUxMTg4Ci0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRv ci9yZWFjdC9saWIvc2xpY2VDaGlsZHJlbi5qcwpAQCAtMCwwICsxLDMzIEBACisvKioKKyAqIENv cHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2Vy dmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1z dHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRp cmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50CisgKiBvZiBw YXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1l IGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIgUmVhY3RDaGlsZHJl biA9IHJlcXVpcmUoJy4vUmVhY3RDaGlsZHJlbicpOworCisvKioKKyAqIFNsaWNlIGNoaWxkcmVu IHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYC4gVGhpcyB2 ZXJzaW9uCisgKiBvZiBzbGljZSBjaGlsZHJlbiBpZ25vcmVzIGVtcHR5IGNoaWxkIGNvbXBvbmVu dHMuCisgKgorICogQHBhcmFtIHsqfSBjaGlsZHJlbiBUaGUgY2hpbGRyZW4gc2V0IHRvIGZpbHRl ci4KKyAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgZmlyc3QgemVyby1iYXNlZCBpbmRleCB0 byBpbmNsdWRlIGluIHRoZSBzdWJzZXQuCisgKiBAcGFyYW0gez9udW1iZXJ9IGVuZCBUaGUgbm9u LWluY2x1c2l2ZSBsYXN0IGluZGV4IG9mIHRoZSBzdWJzZXQuCisgKiBAcmV0dXJuIHtvYmplY3R9 IG1pcnJvcmVkIGFycmF5IHdpdGggbWFwcGVkIGNoaWxkcmVuCisgKi8KK2Z1bmN0aW9uIHNsaWNl Q2hpbGRyZW4oY2hpbGRyZW4sIHN0YXJ0LCBlbmQpIHsKKyAgaWYgKGNoaWxkcmVuID09IG51bGwp IHsKKyAgICByZXR1cm4gY2hpbGRyZW47CisgIH0KKworICB2YXIgYXJyYXkgPSBSZWFjdENoaWxk cmVuLnRvQXJyYXkoY2hpbGRyZW4pOworICByZXR1cm4gYXJyYXkuc2xpY2Uoc3RhcnQsIGVuZCk7 Cit9CisKK21vZHVsZS5leHBvcnRzID0gc2xpY2VDaGlsZHJlbjsKXCBObyBuZXdsaW5lIGF0IGVu ZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0L2xp Yi90cmF2ZXJzZUFsbENoaWxkcmVuLmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFj dC9saWIvdHJhdmVyc2VBbGxDaGlsZHJlbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwMC4uN2M1OWU0YTAKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMv dmVuZG9yL3JlYWN0L2xpYi90cmF2ZXJzZUFsbENoaWxkcmVuLmpzCkBAIC0wLDAgKzEsMTc1IEBA CisvKioKKyAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwg cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5k ZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGlu IHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdy YW50CisgKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxl IGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKi8KKworJ3VzZSBzdHJpY3QnOworCit2YXIg X3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpOworCit2YXIg UmVhY3RDdXJyZW50T3duZXIgPSByZXF1aXJlKCcuL1JlYWN0Q3VycmVudE93bmVyJyk7Cit2YXIg UkVBQ1RfRUxFTUVOVF9UWVBFID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnRTeW1ib2wnKTsKKwor dmFyIGdldEl0ZXJhdG9yRm4gPSByZXF1aXJlKCcuL2dldEl0ZXJhdG9yRm4nKTsKK3ZhciBpbnZh cmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTsKK3ZhciBLZXlFc2NhcGVVdGls cyA9IHJlcXVpcmUoJy4vS2V5RXNjYXBlVXRpbHMnKTsKK3ZhciB3YXJuaW5nID0gcmVxdWlyZSgn ZmJqcy9saWIvd2FybmluZycpOworCit2YXIgU0VQQVJBVE9SID0gJy4nOwordmFyIFNVQlNFUEFS QVRPUiA9ICc6JzsKKworLyoqCisgKiBUaGlzIGlzIGlubGluZWQgZnJvbSBSZWFjdEVsZW1lbnQg c2luY2UgdGhpcyBmaWxlIGlzIHNoYXJlZCBiZXR3ZWVuCisgKiBpc29tb3JwaGljIGFuZCByZW5k ZXJlcnMuIFdlIGNvdWxkIGV4dHJhY3QgdGhpcyB0byBhCisgKgorICovCisKKy8qKgorICogVE9E TzogVGVzdCB0aGF0IGEgc2luZ2xlIGNoaWxkIGFuZCBhbiBhcnJheSB3aXRoIG9uZSBpdGVtIGhh dmUgdGhlIHNhbWUga2V5CisgKiBwYXR0ZXJuLgorICovCisKK3ZhciBkaWRXYXJuQWJvdXRNYXBz ID0gZmFsc2U7CisKKy8qKgorICogR2VuZXJhdGUgYSBrZXkgc3RyaW5nIHRoYXQgaWRlbnRpZmll cyBhIGNvbXBvbmVudCB3aXRoaW4gYSBzZXQuCisgKgorICogQHBhcmFtIHsqfSBjb21wb25lbnQg QSBjb21wb25lbnQgdGhhdCBjb3VsZCBjb250YWluIGEgbWFudWFsIGtleS4KKyAqIEBwYXJhbSB7 bnVtYmVyfSBpbmRleCBJbmRleCB0aGF0IGlzIHVzZWQgaWYgYSBtYW51YWwga2V5IGlzIG5vdCBw cm92aWRlZC4KKyAqIEByZXR1cm4ge3N0cmluZ30KKyAqLworZnVuY3Rpb24gZ2V0Q29tcG9uZW50 S2V5KGNvbXBvbmVudCwgaW5kZXgpIHsKKyAgLy8gRG8gc29tZSB0eXBlY2hlY2tpbmcgaGVyZSBz aW5jZSB3ZSBjYWxsIHRoaXMgYmxpbmRseS4gV2Ugd2FudCB0byBlbnN1cmUKKyAgLy8gdGhhdCB3 ZSBkb24ndCBibG9jayBwb3RlbnRpYWwgZnV0dXJlIEVTIEFQSXMuCisgIGlmIChjb21wb25lbnQg JiYgdHlwZW9mIGNvbXBvbmVudCA9PT0gJ29iamVjdCcgJiYgY29tcG9uZW50LmtleSAhPSBudWxs KSB7CisgICAgLy8gRXhwbGljaXQga2V5CisgICAgcmV0dXJuIEtleUVzY2FwZVV0aWxzLmVzY2Fw ZShjb21wb25lbnQua2V5KTsKKyAgfQorICAvLyBJbXBsaWNpdCBrZXkgZGV0ZXJtaW5lZCBieSB0 aGUgaW5kZXggaW4gdGhlIHNldAorICByZXR1cm4gaW5kZXgudG9TdHJpbmcoMzYpOworfQorCisv KioKKyAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLgorICog QHBhcmFtIHshc3RyaW5nfSBuYW1lU29GYXIgTmFtZSBvZiB0aGUga2V5IHBhdGggc28gZmFyLgor ICogQHBhcmFtIHshZnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIHRvIGludm9rZSB3aXRoIGVh Y2ggY2hpbGQgZm91bmQuCisgKiBAcGFyYW0gez8qfSB0cmF2ZXJzZUNvbnRleHQgVXNlZCB0byBw YXNzIGluZm9ybWF0aW9uIHRocm91Z2hvdXQgdGhlIHRyYXZlcnNhbAorICogcHJvY2Vzcy4KKyAq IEByZXR1cm4geyFudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4gaW4gdGhpcyBzdWJ0cmVl LgorICovCitmdW5jdGlvbiB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZHJlbiwgbmFtZVNv RmFyLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KSB7CisgIHZhciB0eXBlID0gdHlwZW9mIGNo aWxkcmVuOworCisgIGlmICh0eXBlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlID09PSAnYm9vbGVh bicpIHsKKyAgICAvLyBBbGwgb2YgdGhlIGFib3ZlIGFyZSBwZXJjZWl2ZWQgYXMgbnVsbC4KKyAg ICBjaGlsZHJlbiA9IG51bGw7CisgIH0KKworICBpZiAoY2hpbGRyZW4gPT09IG51bGwgfHwgdHlw ZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ251bWJlcicgfHwKKyAgLy8gVGhlIGZvbGxvd2lu ZyBpcyBpbmxpbmVkIGZyb20gUmVhY3RFbGVtZW50LiBUaGlzIG1lYW5zIHdlIGNhbiBvcHRpbWl6 ZQorICAvLyBzb21lIGNoZWNrcy4gUmVhY3QgRmliZXIgYWxzbyBpbmxpbmVzIHRoaXMgbG9naWMg Zm9yIHNpbWlsYXIgcHVycG9zZXMuCisgIHR5cGUgPT09ICdvYmplY3QnICYmIGNoaWxkcmVuLiQk dHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEUpIHsKKyAgICBjYWxsYmFjayh0cmF2ZXJzZUNv bnRleHQsIGNoaWxkcmVuLAorICAgIC8vIElmIGl0J3MgdGhlIG9ubHkgY2hpbGQsIHRyZWF0IHRo ZSBuYW1lIGFzIGlmIGl0IHdhcyB3cmFwcGVkIGluIGFuIGFycmF5CisgICAgLy8gc28gdGhhdCBp dCdzIGNvbnNpc3RlbnQgaWYgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBncm93cy4KKyAgICBuYW1l U29GYXIgPT09ICcnID8gU0VQQVJBVE9SICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkcmVuLCAwKSA6 IG5hbWVTb0Zhcik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICB2YXIgY2hpbGQ7CisgIHZhciBu ZXh0TmFtZTsKKyAgdmFyIHN1YnRyZWVDb3VudCA9IDA7IC8vIENvdW50IG9mIGNoaWxkcmVuIGZv dW5kIGluIHRoZSBjdXJyZW50IHN1YnRyZWUuCisgIHZhciBuZXh0TmFtZVByZWZpeCA9IG5hbWVT b0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgOiBuYW1lU29GYXIgKyBTVUJTRVBBUkFUT1I7CisKKyAg aWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBj aGlsZHJlbi5sZW5ndGg7IGkrKykgeworICAgICAgY2hpbGQgPSBjaGlsZHJlbltpXTsKKyAgICAg IG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBnZXRDb21wb25lbnRLZXkoY2hpbGQsIGkpOwor ICAgICAgc3VidHJlZUNvdW50ICs9IHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkLCBuZXh0 TmFtZSwgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCk7CisgICAgfQorICB9IGVsc2UgeworICAg IHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihjaGlsZHJlbik7CisgICAgaWYgKGl0ZXJh dG9yRm4pIHsKKyAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChjaGlsZHJlbik7 CisgICAgICB2YXIgc3RlcDsKKyAgICAgIGlmIChpdGVyYXRvckZuICE9PSBjaGlsZHJlbi5lbnRy aWVzKSB7CisgICAgICAgIHZhciBpaSA9IDA7CisgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVy YXRvci5uZXh0KCkpLmRvbmUpIHsKKyAgICAgICAgICBjaGlsZCA9IHN0ZXAudmFsdWU7CisgICAg ICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIGdldENvbXBvbmVudEtleShjaGlsZCwg aWkrKyk7CisgICAgICAgICAgc3VidHJlZUNvdW50ICs9IHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBs KGNoaWxkLCBuZXh0TmFtZSwgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCk7CisgICAgICAgIH0K KyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3By b2R1Y3Rpb24nKSB7CisgICAgICAgICAgdmFyIG1hcHNBc0NoaWxkcmVuQWRkZW5kdW0gPSAnJzsK KyAgICAgICAgICBpZiAoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkgeworICAgICAgICAgICAg dmFyIG1hcHNBc0NoaWxkcmVuT3duZXJOYW1lID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5n ZXROYW1lKCk7CisgICAgICAgICAgICBpZiAobWFwc0FzQ2hpbGRyZW5Pd25lck5hbWUpIHsKKyAg ICAgICAgICAgICAgbWFwc0FzQ2hpbGRyZW5BZGRlbmR1bSA9ICcgQ2hlY2sgdGhlIHJlbmRlciBt ZXRob2Qgb2YgYCcgKyBtYXBzQXNDaGlsZHJlbk93bmVyTmFtZSArICdgLic7CisgICAgICAgICAg ICB9CisgICAgICAgICAgfQorICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJv ZHVjdGlvbicgPyB3YXJuaW5nKGRpZFdhcm5BYm91dE1hcHMsICdVc2luZyBNYXBzIGFzIGNoaWxk cmVuIGlzIG5vdCB5ZXQgZnVsbHkgc3VwcG9ydGVkLiBJdCBpcyBhbiAnICsgJ2V4cGVyaW1lbnRh bCBmZWF0dXJlIHRoYXQgbWlnaHQgYmUgcmVtb3ZlZC4gQ29udmVydCBpdCB0byBhICcgKyAnc2Vx dWVuY2UgLyBpdGVyYWJsZSBvZiBrZXllZCBSZWFjdEVsZW1lbnRzIGluc3RlYWQuJXMnLCBtYXBz QXNDaGlsZHJlbkFkZGVuZHVtKSA6IHZvaWQgMDsKKyAgICAgICAgICBkaWRXYXJuQWJvdXRNYXBz ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBJdGVyYXRvciB3aWxsIHByb3ZpZGUgZW50 cnkgW2ssdl0gdHVwbGVzIHJhdGhlciB0aGFuIHZhbHVlcy4KKyAgICAgICAgd2hpbGUgKCEoc3Rl cCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkgeworICAgICAgICAgIHZhciBlbnRyeSA9IHN0ZXAu dmFsdWU7CisgICAgICAgICAgaWYgKGVudHJ5KSB7CisgICAgICAgICAgICBjaGlsZCA9IGVudHJ5 WzFdOworICAgICAgICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIEtleUVzY2FwZVV0 aWxzLmVzY2FwZShlbnRyeVswXSkgKyBTVUJTRVBBUkFUT1IgKyBnZXRDb21wb25lbnRLZXkoY2hp bGQsIDApOworICAgICAgICAgICAgc3VidHJlZUNvdW50ICs9IHRyYXZlcnNlQWxsQ2hpbGRyZW5J bXBsKGNoaWxkLCBuZXh0TmFtZSwgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCk7CisgICAgICAg ICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0 JykgeworICAgICAgdmFyIGFkZGVuZHVtID0gJyc7CisgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9E RV9FTlYgIT09ICdwcm9kdWN0aW9uJykgeworICAgICAgICBhZGRlbmR1bSA9ICcgSWYgeW91IG1l YW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSAnICsg J2luc3RlYWQgb3Igd3JhcCB0aGUgb2JqZWN0IHVzaW5nIGNyZWF0ZUZyYWdtZW50KG9iamVjdCkg ZnJvbSB0aGUgJyArICdSZWFjdCBhZGQtb25zLic7CisgICAgICAgIGlmIChjaGlsZHJlbi5faXNS ZWFjdEVsZW1lbnQpIHsKKyAgICAgICAgICBhZGRlbmR1bSA9ICcgSXQgbG9va3MgbGlrZSB5b3Vc J3JlIHVzaW5nIGFuIGVsZW1lbnQgY3JlYXRlZCBieSBhIGRpZmZlcmVudCAnICsgJ3ZlcnNpb24g b2YgUmVhY3QuIE1ha2Ugc3VyZSB0byB1c2Ugb25seSBvbmUgY29weSBvZiBSZWFjdC4nOworICAg ICAgICB9CisgICAgICAgIGlmIChSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7CisgICAgICAg ICAgdmFyIG5hbWUgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LmdldE5hbWUoKTsKKyAgICAg ICAgICBpZiAobmFtZSkgeworICAgICAgICAgICAgYWRkZW5kdW0gKz0gJyBDaGVjayB0aGUgcmVu ZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nOworICAgICAgICAgIH0KKyAgICAgICAgfQor ICAgICAgfQorICAgICAgdmFyIGNoaWxkcmVuU3RyaW5nID0gU3RyaW5nKGNoaWxkcmVuKTsKKyAg ICAgICFmYWxzZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZh cmlhbnQoZmFsc2UsICdPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91 bmQ6ICVzKS4lcycsIGNoaWxkcmVuU3RyaW5nID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmpl Y3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY2hpbGRyZW4pLmpvaW4oJywgJykgKyAnfScg OiBjaGlsZHJlblN0cmluZywgYWRkZW5kdW0pIDogX3Byb2RJbnZhcmlhbnQoJzMxJywgY2hpbGRy ZW5TdHJpbmcgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBP YmplY3Qua2V5cyhjaGlsZHJlbikuam9pbignLCAnKSArICd9JyA6IGNoaWxkcmVuU3RyaW5nLCBh ZGRlbmR1bSkgOiB2b2lkIDA7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN1YnRyZWVDb3VudDsK K30KKworLyoqCisgKiBUcmF2ZXJzZXMgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNp ZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLCBidXQKKyAqIG1pZ2h0IGFsc28gYmUgc3BlY2lmaWVk IHRocm91Z2ggYXR0cmlidXRlczoKKyAqCisgKiAtIGB0cmF2ZXJzZUFsbENoaWxkcmVuKHRoaXMu cHJvcHMuY2hpbGRyZW4sIC4uLilgCisgKiAtIGB0cmF2ZXJzZUFsbENoaWxkcmVuKHRoaXMucHJv cHMubGVmdFBhbmVsQ2hpbGRyZW4sIC4uLilgCisgKgorICogVGhlIGB0cmF2ZXJzZUNvbnRleHRg IGlzIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRoYXQgaXMgcGFzc2VkIHRocm91Z2ggdGhlCisgKiBl bnRpcmUgdHJhdmVyc2FsLiBJdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBhY2N1bXVsYXRpb25zIG9y IGFueXRoaW5nIGVsc2UgdGhhdAorICogdGhlIGNhbGxiYWNrIG1pZ2h0IGZpbmQgcmVsZXZhbnQu CisgKgorICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBvYmplY3QuCisgKiBA cGFyYW0geyFmdW5jdGlvbn0gY2FsbGJhY2sgVG8gaW52b2tlIHVwb24gdHJhdmVyc2luZyBlYWNo IGNoaWxkLgorICogQHBhcmFtIHs/Kn0gdHJhdmVyc2VDb250ZXh0IENvbnRleHQgZm9yIHRyYXZl cnNhbC4KKyAqIEByZXR1cm4geyFudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4gaW4gdGhp cyBzdWJ0cmVlLgorICovCitmdW5jdGlvbiB0cmF2ZXJzZUFsbENoaWxkcmVuKGNoaWxkcmVuLCBj YWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KSB7CisgIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7Cisg ICAgcmV0dXJuIDA7CisgIH0KKworICByZXR1cm4gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hp bGRyZW4sICcnLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KTsKK30KKworbW9kdWxlLmV4cG9y dHMgPSB0cmF2ZXJzZUFsbENoaWxkcmVuOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlm ZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL3VwZGF0ZS5qcyBi L3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QvbGliL3VwZGF0ZS5qcwpuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uMTNhNTQ5ZjMKLS0tIC9kZXYvbnVsbAorKysgYi93 ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0L2xpYi91cGRhdGUuanMKQEAgLTAsMCArMSwx MTEgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KKyAq IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNl ZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZp bGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9u YWwgZ3JhbnQKKyAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRT IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqLworCisvKiBnbG9iYWwgaGFzT3du UHJvcGVydHk6dHJ1ZSAqLworCisndXNlIHN0cmljdCc7CisKK3ZhciBfcHJvZEludmFyaWFudCA9 IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50JyksCisgICAgX2Fzc2lnbiA9IHJlcXVpcmUo J29iamVjdC1hc3NpZ24nKTsKKwordmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2lu dmFyaWFudCcpOwordmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7CisKK2Z1 bmN0aW9uIHNoYWxsb3dDb3B5KHgpIHsKKyAgaWYgKEFycmF5LmlzQXJyYXkoeCkpIHsKKyAgICBy ZXR1cm4geC5jb25jYXQoKTsKKyAgfSBlbHNlIGlmICh4ICYmIHR5cGVvZiB4ID09PSAnb2JqZWN0 JykgeworICAgIHJldHVybiBfYXNzaWduKG5ldyB4LmNvbnN0cnVjdG9yKCksIHgpOworICB9IGVs c2UgeworICAgIHJldHVybiB4OworICB9Cit9CisKK3ZhciBDT01NQU5EX1BVU0ggPSAnJHB1c2gn OwordmFyIENPTU1BTkRfVU5TSElGVCA9ICckdW5zaGlmdCc7Cit2YXIgQ09NTUFORF9TUExJQ0Ug PSAnJHNwbGljZSc7Cit2YXIgQ09NTUFORF9TRVQgPSAnJHNldCc7Cit2YXIgQ09NTUFORF9NRVJH RSA9ICckbWVyZ2UnOwordmFyIENPTU1BTkRfQVBQTFkgPSAnJGFwcGx5JzsKKwordmFyIEFMTF9D T01NQU5EU19MSVNUID0gW0NPTU1BTkRfUFVTSCwgQ09NTUFORF9VTlNISUZULCBDT01NQU5EX1NQ TElDRSwgQ09NTUFORF9TRVQsIENPTU1BTkRfTUVSR0UsIENPTU1BTkRfQVBQTFldOworCit2YXIg QUxMX0NPTU1BTkRTX1NFVCA9IHt9OworCitBTExfQ09NTUFORFNfTElTVC5mb3JFYWNoKGZ1bmN0 aW9uIChjb21tYW5kKSB7CisgIEFMTF9DT01NQU5EU19TRVRbY29tbWFuZF0gPSB0cnVlOworfSk7 CisKK2Z1bmN0aW9uIGludmFyaWFudEFycmF5Q2FzZSh2YWx1ZSwgc3BlYywgY29tbWFuZCkgewor ICAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1 Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAndXBkYXRlKCk6IGV4cGVjdGVkIHRhcmdldCBvZiAl cyB0byBiZSBhbiBhcnJheTsgZ290ICVzLicsIGNvbW1hbmQsIHZhbHVlKSA6IF9wcm9kSW52YXJp YW50KCcxJywgY29tbWFuZCwgdmFsdWUpIDogdm9pZCAwOworICB2YXIgc3BlY1ZhbHVlID0gc3Bl Y1tjb21tYW5kXTsKKyAgIUFycmF5LmlzQXJyYXkoc3BlY1ZhbHVlKSA/IHByb2Nlc3MuZW52Lk5P REVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd1cGRhdGUoKTogZXhw ZWN0ZWQgc3BlYyBvZiAlcyB0byBiZSBhbiBhcnJheTsgZ290ICVzLiBEaWQgeW91IGZvcmdldCB0 byB3cmFwIHlvdXIgcGFyYW1ldGVyIGluIGFuIGFycmF5PycsIGNvbW1hbmQsIHNwZWNWYWx1ZSkg OiBfcHJvZEludmFyaWFudCgnMicsIGNvbW1hbmQsIHNwZWNWYWx1ZSkgOiB2b2lkIDA7Cit9CisK Ky8qKgorICogUmV0dXJucyBhIHVwZGF0ZWQgc2hhbGxvdyBjb3B5IG9mIGFuIG9iamVjdCB3aXRo b3V0IG11dGF0aW5nIHRoZSBvcmlnaW5hbC4KKyAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1 Yi5pby9yZWFjdC9kb2NzL3VwZGF0ZS5odG1sIGZvciBkZXRhaWxzLgorICovCitmdW5jdGlvbiB1 cGRhdGUodmFsdWUsIHNwZWMpIHsKKyAgISh0eXBlb2Ygc3BlYyA9PT0gJ29iamVjdCcpID8gcHJv Y2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3Vw ZGF0ZSgpOiBZb3UgcHJvdmlkZWQgYSBrZXkgcGF0aCB0byB1cGRhdGUoKSB0aGF0IGRpZCBub3Qg Y29udGFpbiBvbmUgb2YgJXMuIERpZCB5b3UgZm9yZ2V0IHRvIGluY2x1ZGUgeyVzOiAuLi59Pycs IEFMTF9DT01NQU5EU19MSVNULmpvaW4oJywgJyksIENPTU1BTkRfU0VUKSA6IF9wcm9kSW52YXJp YW50KCczJywgQUxMX0NPTU1BTkRTX0xJU1Quam9pbignLCAnKSwgQ09NTUFORF9TRVQpIDogdm9p ZCAwOworCisgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNwZWMsIENPTU1BTkRfU0VUKSkgewor ICAgICEoT2JqZWN0LmtleXMoc3BlYykubGVuZ3RoID09PSAxKSA/IHByb2Nlc3MuZW52Lk5PREVf RU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW5ub3QgaGF2ZSBtb3Jl IHRoYW4gb25lIGtleSBpbiBhbiBvYmplY3Qgd2l0aCAlcycsIENPTU1BTkRfU0VUKSA6IF9wcm9k SW52YXJpYW50KCc0JywgQ09NTUFORF9TRVQpIDogdm9pZCAwOworCisgICAgcmV0dXJuIHNwZWNb Q09NTUFORF9TRVRdOworICB9CisKKyAgdmFyIG5leHRWYWx1ZSA9IHNoYWxsb3dDb3B5KHZhbHVl KTsKKworICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChzcGVjLCBDT01NQU5EX01FUkdFKSkgewor ICAgIHZhciBtZXJnZU9iaiA9IHNwZWNbQ09NTUFORF9NRVJHRV07CisgICAgIShtZXJnZU9iaiAm JiB0eXBlb2YgbWVyZ2VPYmogPT09ICdvYmplY3QnKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9 PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd1cGRhdGUoKTogJXMgZXhwZWN0cyBh IHNwZWMgb2YgdHlwZSBcJ29iamVjdFwnOyBnb3QgJXMnLCBDT01NQU5EX01FUkdFLCBtZXJnZU9i aikgOiBfcHJvZEludmFyaWFudCgnNScsIENPTU1BTkRfTUVSR0UsIG1lcmdlT2JqKSA6IHZvaWQg MDsKKyAgICAhKG5leHRWYWx1ZSAmJiB0eXBlb2YgbmV4dFZhbHVlID09PSAnb2JqZWN0JykgPyBw cm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAn dXBkYXRlKCk6ICVzIGV4cGVjdHMgYSB0YXJnZXQgb2YgdHlwZSBcJ29iamVjdFwnOyBnb3QgJXMn LCBDT01NQU5EX01FUkdFLCBuZXh0VmFsdWUpIDogX3Byb2RJbnZhcmlhbnQoJzYnLCBDT01NQU5E X01FUkdFLCBuZXh0VmFsdWUpIDogdm9pZCAwOworICAgIF9hc3NpZ24obmV4dFZhbHVlLCBzcGVj W0NPTU1BTkRfTUVSR0VdKTsKKyAgfQorCisgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNwZWMs IENPTU1BTkRfUFVTSCkpIHsKKyAgICBpbnZhcmlhbnRBcnJheUNhc2UodmFsdWUsIHNwZWMsIENP TU1BTkRfUFVTSCk7CisgICAgc3BlY1tDT01NQU5EX1BVU0hdLmZvckVhY2goZnVuY3Rpb24gKGl0 ZW0pIHsKKyAgICAgIG5leHRWYWx1ZS5wdXNoKGl0ZW0pOworICAgIH0pOworICB9CisKKyAgaWYg KGhhc093blByb3BlcnR5LmNhbGwoc3BlYywgQ09NTUFORF9VTlNISUZUKSkgeworICAgIGludmFy aWFudEFycmF5Q2FzZSh2YWx1ZSwgc3BlYywgQ09NTUFORF9VTlNISUZUKTsKKyAgICBzcGVjW0NP TU1BTkRfVU5TSElGVF0uZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgeworICAgICAgbmV4dFZhbHVl LnVuc2hpZnQoaXRlbSk7CisgICAgfSk7CisgIH0KKworICBpZiAoaGFzT3duUHJvcGVydHkuY2Fs bChzcGVjLCBDT01NQU5EX1NQTElDRSkpIHsKKyAgICAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBw cm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAn RXhwZWN0ZWQgJXMgdGFyZ2V0IHRvIGJlIGFuIGFycmF5OyBnb3QgJXMnLCBDT01NQU5EX1NQTElD RSwgdmFsdWUpIDogX3Byb2RJbnZhcmlhbnQoJzcnLCBDT01NQU5EX1NQTElDRSwgdmFsdWUpIDog dm9pZCAwOworICAgICFBcnJheS5pc0FycmF5KHNwZWNbQ09NTUFORF9TUExJQ0VdKSA/IHByb2Nl c3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd1cGRh dGUoKTogZXhwZWN0ZWQgc3BlYyBvZiAlcyB0byBiZSBhbiBhcnJheSBvZiBhcnJheXM7IGdvdCAl cy4gRGlkIHlvdSBmb3JnZXQgdG8gd3JhcCB5b3VyIHBhcmFtZXRlcnMgaW4gYW4gYXJyYXk/Jywg Q09NTUFORF9TUExJQ0UsIHNwZWNbQ09NTUFORF9TUExJQ0VdKSA6IF9wcm9kSW52YXJpYW50KCc4 JywgQ09NTUFORF9TUExJQ0UsIHNwZWNbQ09NTUFORF9TUExJQ0VdKSA6IHZvaWQgMDsKKyAgICBz cGVjW0NPTU1BTkRfU1BMSUNFXS5mb3JFYWNoKGZ1bmN0aW9uIChhcmdzKSB7CisgICAgICAhQXJy YXkuaXNBcnJheShhcmdzKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicg PyBpbnZhcmlhbnQoZmFsc2UsICd1cGRhdGUoKTogZXhwZWN0ZWQgc3BlYyBvZiAlcyB0byBiZSBh biBhcnJheSBvZiBhcnJheXM7IGdvdCAlcy4gRGlkIHlvdSBmb3JnZXQgdG8gd3JhcCB5b3VyIHBh cmFtZXRlcnMgaW4gYW4gYXJyYXk/JywgQ09NTUFORF9TUExJQ0UsIHNwZWNbQ09NTUFORF9TUExJ Q0VdKSA6IF9wcm9kSW52YXJpYW50KCc4JywgQ09NTUFORF9TUExJQ0UsIHNwZWNbQ09NTUFORF9T UExJQ0VdKSA6IHZvaWQgMDsKKyAgICAgIG5leHRWYWx1ZS5zcGxpY2UuYXBwbHkobmV4dFZhbHVl LCBhcmdzKTsKKyAgICB9KTsKKyAgfQorCisgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNwZWMs IENPTU1BTkRfQVBQTFkpKSB7CisgICAgISh0eXBlb2Ygc3BlY1tDT01NQU5EX0FQUExZXSA9PT0g J2Z1bmN0aW9uJykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52 YXJpYW50KGZhbHNlLCAndXBkYXRlKCk6IGV4cGVjdGVkIHNwZWMgb2YgJXMgdG8gYmUgYSBmdW5j dGlvbjsgZ290ICVzLicsIENPTU1BTkRfQVBQTFksIHNwZWNbQ09NTUFORF9BUFBMWV0pIDogX3By b2RJbnZhcmlhbnQoJzknLCBDT01NQU5EX0FQUExZLCBzcGVjW0NPTU1BTkRfQVBQTFldKSA6IHZv aWQgMDsKKyAgICBuZXh0VmFsdWUgPSBzcGVjW0NPTU1BTkRfQVBQTFldKG5leHRWYWx1ZSk7Cisg IH0KKworICBmb3IgKHZhciBrIGluIHNwZWMpIHsKKyAgICBpZiAoIShBTExfQ09NTUFORFNfU0VU Lmhhc093blByb3BlcnR5KGspICYmIEFMTF9DT01NQU5EU19TRVRba10pKSB7CisgICAgICBuZXh0 VmFsdWVba10gPSB1cGRhdGUodmFsdWVba10sIHNwZWNba10pOworICAgIH0KKyAgfQorCisgIHJl dHVybiBuZXh0VmFsdWU7Cit9CisKK21vZHVsZS5leHBvcnRzID0gdXBkYXRlOwpcIE5vIG5ld2xp bmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3Iv cmVhY3QvcGFja2FnZS5qc29uIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9wYWNr YWdlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjQyNzU1NWZlCi0t LSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9wYWNrYWdl Lmpzb24KQEAgLTAsMCArMSwzNSBAQAoreworICAibmFtZSI6ICJyZWFjdCIsCisgICJkZXNjcmlw dGlvbiI6ICJSZWFjdCBpcyBhIEphdmFTY3JpcHQgbGlicmFyeSBmb3IgYnVpbGRpbmcgdXNlciBp bnRlcmZhY2VzLiIsCisgICJ2ZXJzaW9uIjogIjE1LjQuMiIsCisgICJrZXl3b3JkcyI6IFsKKyAg ICAicmVhY3QiCisgIF0sCisgICJob21lcGFnZSI6ICJodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5p by9yZWFjdC8iLAorICAiYnVncyI6ICJodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3Qv aXNzdWVzIiwKKyAgImxpY2Vuc2UiOiAiQlNELTMtQ2xhdXNlIiwKKyAgImZpbGVzIjogWworICAg ICJMSUNFTlNFIiwKKyAgICAiUEFURU5UUyIsCisgICAgImFkZG9ucy5qcyIsCisgICAgInJlYWN0 LmpzIiwKKyAgICAiYWRkb25zLyIsCisgICAgImRpc3QvIiwKKyAgICAibGliLyIKKyAgXSwKKyAg Im1haW4iOiAicmVhY3QuanMiLAorICAicmVwb3NpdG9yeSI6ICJmYWNlYm9vay9yZWFjdCIsCisg ICJlbmdpbmVzIjogeworICAgICJub2RlIjogIj49MC4xMC4wIgorICB9LAorICAiZGVwZW5kZW5j aWVzIjogeworICAgICJmYmpzIjogIl4wLjguNCIsCisgICAgImxvb3NlLWVudmlmeSI6ICJeMS4x LjAiLAorICAgICJvYmplY3QtYXNzaWduIjogIl40LjEuMCIKKyAgfSwKKyAgImJyb3dzZXJpZnki OiB7CisgICAgInRyYW5zZm9ybSI6IFsKKyAgICAgICJsb29zZS1lbnZpZnkiCisgICAgXQorICB9 Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4v c3RhdGljL3ZlbmRvci9yZWFjdC9yZWFjdC5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3Iv cmVhY3QvcmVhY3QuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjUzYWJk NmYwCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC9y ZWFjdC5qcwpAQCAtMCwwICsxLDMgQEAKKyd1c2Ugc3RyaWN0JzsKKworbW9kdWxlLmV4cG9ydHMg PSByZXF1aXJlKCcuL2xpYi9SZWFjdCcpOwpkaWZmIC0tZ2l0IGEvd2ViL3lhcm4ubG9jayBiL3dl Yi95YXJuLmxvY2sKaW5kZXggY2U3MmQ0MWIuLjQwOTcwZTNiIDEwMDY0NAotLS0gYS93ZWIveWFy bi5sb2NrCisrKyBiL3dlYi95YXJuLmxvY2sKQEAgLTI2NCwxMiArMjY0LDEyIEBAIGJhYmVsLWNv cmVAXjYuMC4wLCBiYWJlbC1jb3JlQF42LjAuMTQsIGJhYmVsLWNvcmVAXjYuMjQuMSwgYmFiZWwt Y29yZUB+Ni4yNC4wOgogICAgIHNvdXJjZS1tYXAgIl4wLjUuMCIKIAogYmFiZWwtZ2VuZXJhdG9y QF42LjI0LjE6Ci0gIHZlcnNpb24gIjYuMjQuMSIKLSAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0 cnkueWFybnBrZy5jb20vYmFiZWwtZ2VuZXJhdG9yLy0vYmFiZWwtZ2VuZXJhdG9yLTYuMjQuMS50 Z3ojZTcxNWY0ODZjNThkZWQyNTY0OWQ4ODg5NDRkNTJhYTA3YzVkOTQ5NyIKKyAgdmVyc2lvbiAi Ni4yNS4wIgorICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9iYWJlbC1n ZW5lcmF0b3IvLS9iYWJlbC1nZW5lcmF0b3ItNi4yNS4wLnRneiMzM2ExYWY3MGQ1ZjI4OTBhZWI0 NjVhNGE3NzkzYzFkZjZhOWVhOWZjIgogICBkZXBlbmRlbmNpZXM6CiAgICAgYmFiZWwtbWVzc2Fn ZXMgIl42LjIzLjAiCiAgICAgYmFiZWwtcnVudGltZSAiXjYuMjIuMCIKLSAgICBiYWJlbC10eXBl cyAiXjYuMjQuMSIKKyAgICBiYWJlbC10eXBlcyAiXjYuMjUuMCIKICAgICBkZXRlY3QtaW5kZW50 ICJeNC4wLjAiCiAgICAganNlc2MgIl4xLjMuMCIKICAgICBsb2Rhc2ggIl40LjIuMCIKQEAgLTU2 NCw4ICs1NjQsOCBAQCBiYWJlbC1wbHVnaW4tdHJhbnNmb3JtLWZsb3ctc3RyaXAtdHlwZXNAXjYu MjIuMDoKICAgICBiYWJlbC1ydW50aW1lICJeNi4yMi4wIgogCiBiYWJlbC1wbHVnaW4tdHJhbnNm b3JtLXJlYWN0LWRpc3BsYXktbmFtZUBeNi4yMy4wOgotICB2ZXJzaW9uICI2LjIzLjAiCi0gIHJl c29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2JhYmVsLXBsdWdpbi10cmFuc2Zv cm0tcmVhY3QtZGlzcGxheS1uYW1lLy0vYmFiZWwtcGx1Z2luLXRyYW5zZm9ybS1yZWFjdC1kaXNw bGF5LW5hbWUtNi4yMy4wLnRneiM0Mzk4OTEwYzM1ODQ0MWRjNGNlZjE4Nzg3MjY0ZDA0MTJlZDM2 YjM3IgorICB2ZXJzaW9uICI2LjI1LjAiCisgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlh cm5wa2cuY29tL2JhYmVsLXBsdWdpbi10cmFuc2Zvcm0tcmVhY3QtZGlzcGxheS1uYW1lLy0vYmFi ZWwtcGx1Z2luLXRyYW5zZm9ybS1yZWFjdC1kaXNwbGF5LW5hbWUtNi4yNS4wLnRneiM2N2UyYmYx ZjFlOWM5M2FiMDhkYjk2NzkyZTA1MzkyYmYyY2MyOGQxIgogICBkZXBlbmRlbmNpZXM6CiAgICAg YmFiZWwtcnVudGltZSAiXjYuMjIuMCIKIApAQCAtNzA0LDMyICs3MDQsMzIgQEAgYmFiZWwtcnVu dGltZUBeNi4xOC4wLCBiYWJlbC1ydW50aW1lQF42LjIyLjA6CiAgICAgcmVnZW5lcmF0b3ItcnVu dGltZSAiXjAuMTAuMCIKIAogYmFiZWwtdGVtcGxhdGVAXjYuMjQuMToKLSAgdmVyc2lvbiAiNi4y NC4xIgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9iYWJlbC10ZW1w bGF0ZS8tL2JhYmVsLXRlbXBsYXRlLTYuMjQuMS50Z3ojMDRhZTUxNGYxZjkzYjNhMjUzN2YyYTBm NjBhNWE0NWZiODMwODMzMyIKKyAgdmVyc2lvbiAiNi4yNS4wIgorICByZXNvbHZlZCAiaHR0cHM6 Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9iYWJlbC10ZW1wbGF0ZS8tL2JhYmVsLXRlbXBsYXRlLTYu MjUuMC50Z3ojNjY1MjQxMTY2YjdjMmFhNGM2MTlkNzFlMTkyOTY5NTUyYjEwYzA3MSIKICAgZGVw ZW5kZW5jaWVzOgogICAgIGJhYmVsLXJ1bnRpbWUgIl42LjIyLjAiCi0gICAgYmFiZWwtdHJhdmVy c2UgIl42LjI0LjEiCi0gICAgYmFiZWwtdHlwZXMgIl42LjI0LjEiCi0gICAgYmFieWxvbiAiXjYu MTEuMCIKKyAgICBiYWJlbC10cmF2ZXJzZSAiXjYuMjUuMCIKKyAgICBiYWJlbC10eXBlcyAiXjYu MjUuMCIKKyAgICBiYWJ5bG9uICJeNi4xNy4yIgogICAgIGxvZGFzaCAiXjQuMi4wIgogCi1iYWJl bC10cmF2ZXJzZUBeNi4yNC4xOgotICB2ZXJzaW9uICI2LjI0LjEiCi0gIHJlc29sdmVkICJodHRw czovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2JhYmVsLXRyYXZlcnNlLy0vYmFiZWwtdHJhdmVyc2Ut Ni4yNC4xLnRneiNhYjM2NjczZmQzNTZmOWEwOTQ4NjU5ZTdiMzM4ZDVmZWFkYjMxNjk1IgorYmFi ZWwtdHJhdmVyc2VAXjYuMjQuMSwgYmFiZWwtdHJhdmVyc2VAXjYuMjUuMDoKKyAgdmVyc2lvbiAi Ni4yNS4wIgorICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9iYWJlbC10 cmF2ZXJzZS8tL2JhYmVsLXRyYXZlcnNlLTYuMjUuMC50Z3ojMjI1NzQ5N2UyZmNkMTliODllZGMx M2M0YzkxMzgxZjk1MTI0OTZmMSIKICAgZGVwZW5kZW5jaWVzOgogICAgIGJhYmVsLWNvZGUtZnJh bWUgIl42LjIyLjAiCiAgICAgYmFiZWwtbWVzc2FnZXMgIl42LjIzLjAiCiAgICAgYmFiZWwtcnVu dGltZSAiXjYuMjIuMCIKLSAgICBiYWJlbC10eXBlcyAiXjYuMjQuMSIKLSAgICBiYWJ5bG9uICJe Ni4xNS4wIgorICAgIGJhYmVsLXR5cGVzICJeNi4yNS4wIgorICAgIGJhYnlsb24gIl42LjE3LjIi CiAgICAgZGVidWcgIl4yLjIuMCIKICAgICBnbG9iYWxzICJeOS4wLjAiCiAgICAgaW52YXJpYW50 ICJeMi4yLjAiCiAgICAgbG9kYXNoICJeNC4yLjAiCiAKLWJhYmVsLXR5cGVzQF42LjE5LjAsIGJh YmVsLXR5cGVzQF42LjI0LjE6Ci0gIHZlcnNpb24gIjYuMjQuMSIKLSAgcmVzb2x2ZWQgImh0dHBz Oi8vcmVnaXN0cnkueWFybnBrZy5jb20vYmFiZWwtdHlwZXMvLS9iYWJlbC10eXBlcy02LjI0LjEu dGd6I2ExMzY4NzlkYzE1YjM2MDZiZGEwZDkwYzFmYzc0MzA0YzJmZjA5NzUiCitiYWJlbC10eXBl c0BeNi4xOS4wLCBiYWJlbC10eXBlc0BeNi4yNC4xLCBiYWJlbC10eXBlc0BeNi4yNS4wOgorICB2 ZXJzaW9uICI2LjI1LjAiCisgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29t L2JhYmVsLXR5cGVzLy0vYmFiZWwtdHlwZXMtNi4yNS4wLnRneiM3MGFmYjI0OGQ1NjYwZTVkMThm ODExZDkxYzgzMDNiNTQxMzRhMThlIgogICBkZXBlbmRlbmNpZXM6CiAgICAgYmFiZWwtcnVudGlt ZSAiXjYuMjIuMCIKICAgICBlc3V0aWxzICJeMi4wLjIiCkBAIC03NDMsMTcgKzc0MywxNyBAQCBi YWJlbGlmeUB+Ny4zLjA6CiAgICAgYmFiZWwtY29yZSAiXjYuMC4xNCIKICAgICBvYmplY3QtYXNz aWduICJeNC4wLjAiCiAKLWJhYnlsb25AXjYuMTEuMCwgYmFieWxvbkBeNi4xNS4wOgotICB2ZXJz aW9uICI2LjE3LjIiCi0gIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2Jh Ynlsb24vLS9iYWJ5bG9uLTYuMTcuMi50Z3ojMjAxZDI1ZWY1Zjg5MmM0MWJhZTQ5NDg4YjA4ZGIw ZGQ0NzZlOWY1YyIKK2JhYnlsb25AXjYuMTEuMCwgYmFieWxvbkBeNi4xNy4yOgorICB2ZXJzaW9u ICI2LjE3LjQiCisgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2JhYnls b24vLS9iYWJ5bG9uLTYuMTcuNC50Z3ojM2U4Yjc0MDJiODhkMjJjMzQyM2UxMzdhMTU3Nzg4M2Ix NWZmODY5YSIKIAogYmFja28yQDEuMC4yOgogICB2ZXJzaW9uICIxLjAuMiIKICAgcmVzb2x2ZWQg Imh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vYmFja28yLy0vYmFja28yLTEuMC4yLnRneiMz MWFiMWFjOGIxMjkzNjM0NjNlMzViM2ViYjY5ZjRkZmNmYmE3OTQ3IgogCi1iYWxhbmNlZC1tYXRj aEBeMC40LjE6Ci0gIHZlcnNpb24gIjAuNC4yIgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3Ry eS55YXJucGtnLmNvbS9iYWxhbmNlZC1tYXRjaC8tL2JhbGFuY2VkLW1hdGNoLTAuNC4yLnRneiNj YjNmM2UzYzczMmRjMGYwMWVlNzBiNDAzZjMwMmU2MWQ3NzA5ODM4IgorYmFsYW5jZWQtbWF0Y2hA XjEuMC4wOgorICB2ZXJzaW9uICIxLjAuMCIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnku eWFybnBrZy5jb20vYmFsYW5jZWQtbWF0Y2gvLS9iYWxhbmNlZC1tYXRjaC0xLjAuMC50Z3ojODli NGQxOTlhYjJiZWU0OWRlMTY0ZWEwMmI4OWNlNDYyZDcxYjc2NyIKIAogYmFzZTY0LWFycmF5YnVm ZmVyQDAuMS41OgogICB2ZXJzaW9uICIwLjEuNSIKQEAgLTgzMSwxMCArODMxLDEwIEBAIGJvb21A Mi54Lng6CiAgICAgaG9layAiMi54LngiCiAKIGJyYWNlLWV4cGFuc2lvbkBeMS4xLjc6Ci0gIHZl cnNpb24gIjEuMS43IgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9i cmFjZS1leHBhbnNpb24vLS9icmFjZS1leHBhbnNpb24tMS4xLjcudGd6IzNlZmZjM2M1MGUwMDA1 MzFmYjcyMGVhZmY4MGYwYWU4ZWYyM2NmNTkiCisgIHZlcnNpb24gIjEuMS44IgorICByZXNvbHZl ZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9icmFjZS1leHBhbnNpb24vLS9icmFjZS1l eHBhbnNpb24tMS4xLjgudGd6I2MwN2IyMTFjN2M5NTJlYzFmOGVmZDUxYTc3ZWYwZDFkMzk5MGEy OTIiCiAgIGRlcGVuZGVuY2llczoKLSAgICBiYWxhbmNlZC1tYXRjaCAiXjAuNC4xIgorICAgIGJh bGFuY2VkLW1hdGNoICJeMS4wLjAiCiAgICAgY29uY2F0LW1hcCAiMC4wLjEiCiAKIGJyYWNlc0Be MC4xLjI6CkBAIC0xMTk5LDcgKzExOTksMTUgQEAgY29uY2F0LXN0cmVhbUAxLjUuMDoKICAgICBy ZWFkYWJsZS1zdHJlYW0gIn4yLjAuMCIKICAgICB0eXBlZGFycmF5ICJ+MC4wLjUiCiAKLWNvbmNh dC1zdHJlYW1AXjEuNS4yLCBjb25jYXQtc3RyZWFtQH4xLjUuMCwgY29uY2F0LXN0cmVhbUB+MS41 LjE6Citjb25jYXQtc3RyZWFtQF4xLjUuMjoKKyAgdmVyc2lvbiAiMS42LjAiCisgIHJlc29sdmVk ICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2NvbmNhdC1zdHJlYW0vLS9jb25jYXQtc3Ry ZWFtLTEuNi4wLnRneiMwYWFjNjYyZmQ1MmJlNzg5NjRkNTUzMmY2OTQ3ODRlNzAxMTBhY2Y3Igor ICBkZXBlbmRlbmNpZXM6CisgICAgaW5oZXJpdHMgIl4yLjAuMyIKKyAgICByZWFkYWJsZS1zdHJl YW0gIl4yLjIuMiIKKyAgICB0eXBlZGFycmF5ICJeMC4wLjYiCisKK2NvbmNhdC1zdHJlYW1AfjEu NS4wLCBjb25jYXQtc3RyZWFtQH4xLjUuMToKICAgdmVyc2lvbiAiMS41LjIiCiAgIHJlc29sdmVk ICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2NvbmNhdC1zdHJlYW0vLS9jb25jYXQtc3Ry ZWFtLTEuNS4yLnRneiM3MDg5Nzg2MjRkODU2YWY0MWE1YTc0MWRlZmRkMjYxZGE3NTJjMjY2Igog ICBkZXBlbmRlbmNpZXM6CkBAIC0xODA1LDIwICsxODEzLDE2IEBAIGVzcXVlcnlAXjEuMC4wOgog ICAgIGVzdHJhdmVyc2UgIl40LjAuMCIKIAogZXNyZWN1cnNlQF40LjEuMDoKLSAgdmVyc2lvbiAi NC4xLjAiCi0gIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2VzcmVjdXJz ZS8tL2VzcmVjdXJzZS00LjEuMC50Z3ojNDcxM2I2NTM2YWRmN2YyYWM0ZjMyN2Q1NTllNzc1NmJm ZjY0ODIyMCIKKyAgdmVyc2lvbiAiNC4yLjAiCisgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5 Lnlhcm5wa2cuY29tL2VzcmVjdXJzZS8tL2VzcmVjdXJzZS00LjIuMC50Z3ojZmE5NTY4ZDk4ZDM4 MjNmOWE0MWQ5MWU5MDJkY2FiOWVhNmU1YjE2MyIKICAgZGVwZW5kZW5jaWVzOgotICAgIGVzdHJh dmVyc2UgIn40LjEuMCIKKyAgICBlc3RyYXZlcnNlICJeNC4xLjAiCiAgICAgb2JqZWN0LWFzc2ln biAiXjQuMC4xIgogCi1lc3RyYXZlcnNlQF40LjAuMCwgZXN0cmF2ZXJzZUBeNC4xLjEsIGVzdHJh dmVyc2VAXjQuMi4wOgorZXN0cmF2ZXJzZUBeNC4wLjAsIGVzdHJhdmVyc2VAXjQuMS4wLCBlc3Ry YXZlcnNlQF40LjEuMSwgZXN0cmF2ZXJzZUBeNC4yLjA6CiAgIHZlcnNpb24gIjQuMi4wIgogICBy ZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9lc3RyYXZlcnNlLy0vZXN0cmF2 ZXJzZS00LjIuMC50Z3ojMGRlZTNmZWQzMWZjZDQ2OTYxOGNlNzM0MjA5OWZjMWFmYTBiZGIxMyIK IAotZXN0cmF2ZXJzZUB+NC4xLjA6Ci0gIHZlcnNpb24gIjQuMS4xIgotICByZXNvbHZlZCAiaHR0 cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9lc3RyYXZlcnNlLy0vZXN0cmF2ZXJzZS00LjEuMS50 Z3ojZjZjYWNhNzI4OTMzYTg1MGVmOTA2NjFkMGUxNzk4MmJhNDcxMTFhMiIKLQogZXN1dGlsc0Be Mi4wLjAsIGVzdXRpbHNAXjIuMC4yOgogICB2ZXJzaW9uICIyLjAuMiIKICAgcmVzb2x2ZWQgImh0 dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vZXN1dGlscy8tL2VzdXRpbHMtMi4wLjIudGd6IzBh YmY0ZjFjYWE1YmNiMWY3YTlkOGFjYzZkZWE0ZmFhYTA0YmFjOWIiCkBAIC0yMDM2LDExICsyMDQw LDExIEBAIGZzLnJlYWxwYXRoQF4xLjAuMDoKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnku eWFybnBrZy5jb20vZnMucmVhbHBhdGgvLS9mcy5yZWFscGF0aC0xLjAuMC50Z3ojMTUwNGFkMjUy MzE1OGNhYTQwZGI0YTI3ODdjYjAxNDExOTk0ZWE0ZiIKIAogZnNldmVudHNAXjEuMC4wOgotICB2 ZXJzaW9uICIxLjEuMSIKLSAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20v ZnNldmVudHMvLS9mc2V2ZW50cy0xLjEuMS50Z3ojZjE5ZmQyOGY0M2VlYWY3NjE2ODBlNTE5YTIw M2M0ZDBiM2QzMWFmZiIKKyAgdmVyc2lvbiAiMS4xLjIiCisgIHJlc29sdmVkICJodHRwczovL3Jl Z2lzdHJ5Lnlhcm5wa2cuY29tL2ZzZXZlbnRzLy0vZnNldmVudHMtMS4xLjIudGd6IzMyODJiNzEz ZmIzYWQ4MGVkZTBlOWZjZjQ2MTFiNWFhNmZjMDMzZjQiCiAgIGRlcGVuZGVuY2llczoKICAgICBu YW4gIl4yLjMuMCIKLSAgICBub2RlLXByZS1neXAgIl4wLjYuMjkiCisgICAgbm9kZS1wcmUtZ3lw ICJeMC42LjM2IgogCiBmc3RyZWFtLWlnbm9yZUBeMS4wLjU6CiAgIHZlcnNpb24gIjEuMC41IgpA QCAtMjIwOCwxMCArMjIxMiwxMSBAQCBoYXNoLWJhc2VAXjIuMC4wOgogICAgIGluaGVyaXRzICJe Mi4wLjEiCiAKIGhhc2guanNAXjEuMC4wLCBoYXNoLmpzQF4xLjAuMzoKLSAgdmVyc2lvbiAiMS4w LjMiCi0gIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2hhc2guanMvLS9o YXNoLmpzLTEuMC4zLnRneiMxMzMyZmYwMDE1NmMwYTBmZmRkODIzNjAxM2QwN2I3N2EwNDUxNTcz IgorICB2ZXJzaW9uICIxLjEuMSIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBr Zy5jb20vaGFzaC5qcy8tL2hhc2guanMtMS4xLjEudGd6IzVjYjJlNzk2NDk5MjI0ZTY5ZmQwYjAw ZWQwMWQyZDRhMTZlN2EzMjMiCiAgIGRlcGVuZGVuY2llczoKLSAgICBpbmhlcml0cyAiXjIuMC4x IgorICAgIGluaGVyaXRzICJeMi4wLjMiCisgICAgbWluaW1hbGlzdGljLWFzc2VydCAiXjEuMC4w IgogCiBoYXNoYUB+Mi4yLjA6CiAgIHZlcnNpb24gIjIuMi4wIgpAQCAtMjMzOSw3ICsyMzQ0LDcg QEAgaW5mbGlnaHRAXjEuMC40OgogICAgIG9uY2UgIl4xLjMuMCIKICAgICB3cmFwcHkgIjEiCiAK LWluaGVyaXRzQDIsIGluaGVyaXRzQDIuMC4zLCBpbmhlcml0c0BeMi4wLjEsIGluaGVyaXRzQH4y LjAuMCwgaW5oZXJpdHNAfjIuMC4xOgoraW5oZXJpdHNAMiwgaW5oZXJpdHNAMi4wLjMsIGluaGVy aXRzQF4yLjAuMSwgaW5oZXJpdHNAXjIuMC4zLCBpbmhlcml0c0B+Mi4wLjAsIGluaGVyaXRzQH4y LjAuMSwgaW5oZXJpdHNAfjIuMC4zOgogICB2ZXJzaW9uICIyLjAuMyIKICAgcmVzb2x2ZWQgImh0 dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vaW5oZXJpdHMvLS9pbmhlcml0cy0yLjAuMy50Z3oj NjMzYzJjODNlM2RhNDJhNTAyZjUyNDY2MDIyNDgwZjQyMDgyNjFkZSIKIApAQCAtMjQ4MywxMiAr MjQ4OCwxOCBAQCBpcy1udW1iZXJAXjAuMS4xOgogICB2ZXJzaW9uICIwLjEuMSIKICAgcmVzb2x2 ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vaXMtbnVtYmVyLy0vaXMtbnVtYmVyLTAu MS4xLnRneiM2OWE3YWYxMTY5NjNkNDcyMDZlYzliZDliNDhhMTQyMTZmMWUzODA2IgogCi1pcy1u dW1iZXJAXjIuMC4yLCBpcy1udW1iZXJAXjIuMS4wOgoraXMtbnVtYmVyQF4yLjEuMDoKICAgdmVy c2lvbiAiMi4xLjAiCiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2lz LW51bWJlci8tL2lzLW51bWJlci0yLjEuMC50Z3ojMDFmY2JiYjM5MzQ2M2E1NDhmMmY0NjZjY2Ux NmRlY2U0OWRiOTA4ZiIKICAgZGVwZW5kZW5jaWVzOgogICAgIGtpbmQtb2YgIl4zLjAuMiIKIAor aXMtbnVtYmVyQF4zLjAuMDoKKyAgdmVyc2lvbiAiMy4wLjAiCisgIHJlc29sdmVkICJodHRwczov L3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2lzLW51bWJlci8tL2lzLW51bWJlci0zLjAuMC50Z3ojMjRm ZDYyMDFhNDc4MmNmNTA1NjFjODEwMjc2YWZjN2QxMmQ3MTE5NSIKKyAgZGVwZW5kZW5jaWVzOgor ICAgIGtpbmQtb2YgIl4zLjAuMiIKKwogaXMtcGF0aC1jd2RAXjEuMC4wOgogICB2ZXJzaW9uICIx LjAuMCIKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vaXMtcGF0aC1j d2QvLS9pcy1wYXRoLWN3ZC0xLjAuMC50Z3ojZDIyNWVjMjMxMzJlODllZGQzOGZkYTc2NzQ3MmU2 MmU2NWYxMTA2ZCIKQEAgLTI1OTIsMTIgKzI2MDMsNiBAQCBqYXNtaW5lLWVuenltZUBeMy4xLjA6 CiAgIGRlcGVuZGVuY2llczoKICAgICBlbnp5bWUtbWF0Y2hlcnMgIl4zLjIuMCIKIAotam9kaWQy NTUxOUBeMS4wLjA6Ci0gIHZlcnNpb24gIjEuMC4yIgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdp c3RyeS55YXJucGtnLmNvbS9qb2RpZDI1NTE5Ly0vam9kaWQyNTUxOS0xLjAuMi50Z3ojMDZkNDkx MjI1NTA5MzQxOTQ3N2Q0MjU2MzM2MDZlMGU5MDc4Mjk2NyIKLSAgZGVwZW5kZW5jaWVzOgotICAg IGpzYm4gIn4wLjEuMCIKLQoganMtc3RyaW5nLWVzY2FwZUBeMS4wLjA6CiAgIHZlcnNpb24gIjEu MC4xIgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9qcy1zdHJpbmct ZXNjYXBlLy0vanMtc3RyaW5nLWVzY2FwZS0xLjAuMS50Z3ojZTI2MjViYWRiYzBkNjdjNzUzM2U5 ZWRjMTA2OGM1ODdhZTQxMzdlZiIKQEAgLTI3ODQsNiArMjc4OSwxMiBAQCBraW5kLW9mQF4zLjAu MjoKICAgZGVwZW5kZW5jaWVzOgogICAgIGlzLWJ1ZmZlciAiXjEuMS41IgogCitraW5kLW9mQF40 LjAuMDoKKyAgdmVyc2lvbiAiNC4wLjAiCisgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlh cm5wa2cuY29tL2tpbmQtb2YvLS9raW5kLW9mLTQuMC4wLnRneiMyMDgxM2RmM2Q3MTI5MjhiMjA3 Mzc4NjkxYTQ1MDY2ZmFlNzJkZDU3IgorICBkZXBlbmRlbmNpZXM6CisgICAgaXMtYnVmZmVyICJe MS4xLjUiCisKIGtsYXdAXjEuMC4wOgogICB2ZXJzaW9uICIxLjMuMSIKICAgcmVzb2x2ZWQgImh0 dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20va2xhdy8tL2tsYXctMS4zLjEudGd6IzQwODg0MzNi NDZiM2IxYmEyNTlkNzg3ODVkOGU5NmY3M2JhMDI0MzkiCkBAIC0zMTQ3LDcgKzMxNTgsNyBAQCBu b2RlLWxpYnMtYnJvd3NlckBeMi4wLjA6CiAgICAgdXRpbCAiXjAuMTAuMyIKICAgICB2bS1icm93 c2VyaWZ5ICIwLjAuNCIKIAotbm9kZS1wcmUtZ3lwQF4wLjYuMjk6Citub2RlLXByZS1neXBAXjAu Ni4zNjoKICAgdmVyc2lvbiAiMC42LjM2IgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55 YXJucGtnLmNvbS9ub2RlLXByZS1neXAvLS9ub2RlLXByZS1neXAtMC42LjM2LnRneiNkYjYwNDEx MmNiNzRlMGQ0Nzc1NTRlOWI1MDViMTdhYmRkZmFiNzg2IgogICBkZXBlbmRlbmNpZXM6CkBAIC0z NTA4LDggKzM1MTksOCBAQCBwcm9ncmVzc0BeMS4xLjgsIHByb2dyZXNzQH4xLjEuODoKICAgcmVz b2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vcHJvZ3Jlc3MvLS9wcm9ncmVzcy0x LjEuOC50Z3ojZTI2MGM3OGY2MTYxY2RkOWIwZTU2Y2MzZTBhODVkZTE3YzdhNTdiZSIKIAogcHJv bWlzZUBeNy4xLjE6Ci0gIHZlcnNpb24gIjcuMS4xIgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdp c3RyeS55YXJucGtnLmNvbS9wcm9taXNlLy0vcHJvbWlzZS03LjEuMS50Z3ojNDg5NjU0YzY5MjYx NmI4YWE1NWIwNzI0ZmE4MDliYjdkYjQ5YzViZiIKKyAgdmVyc2lvbiAiNy4zLjEiCisgIHJlc29s dmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL3Byb21pc2UvLS9wcm9taXNlLTcuMy4x LnRneiMwNjRiNzI2MDJiMThmOTBmMjkxOTJiOGIxYmM0MThmZmQxZWJkM2JmIgogICBkZXBlbmRl bmNpZXM6CiAgICAgYXNhcCAifjIuMC4zIgogCkBAIC0zNTYzLDExICszNTc0LDExIEBAIHF1ZXJ5 c3RyaW5nQDAuMi4wOgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9x dWVyeXN0cmluZy8tL3F1ZXJ5c3RyaW5nLTAuMi4wLnRneiNiMjA5ODQ5MjAzYmIyNWRmODIwZGE3 NTZlNzQ3MDA1ODc4NTIxNjIwIgogCiByYW5kb21hdGljQF4xLjEuMzoKLSAgdmVyc2lvbiAiMS4x LjYiCi0gIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL3JhbmRvbWF0aWMv LS9yYW5kb21hdGljLTEuMS42LnRneiMxMTBkY2FiZmYzOTdlOWRjZmY3YzA3ODljY2MwYTQ5YWRm MWVjNWJiIgorICB2ZXJzaW9uICIxLjEuNyIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnku eWFybnBrZy5jb20vcmFuZG9tYXRpYy8tL3JhbmRvbWF0aWMtMS4xLjcudGd6I2M3YWJlOWNjOGI4 N2MwYmFhODc2YjE5ZmRlODNmZDQ2NDc5N2UzOGMiCiAgIGRlcGVuZGVuY2llczoKLSAgICBpcy1u dW1iZXIgIl4yLjAuMiIKLSAgICBraW5kLW9mICJeMy4wLjIiCisgICAgaXMtbnVtYmVyICJeMy4w LjAiCisgICAga2luZC1vZiAiXjQuMC4wIgogCiByYW5kb21ieXRlc0BeMi4wLjAsIHJhbmRvbWJ5 dGVzQF4yLjAuMToKICAgdmVyc2lvbiAiMi4wLjUiCkBAIC0zNjAzLDE3ICszNjE0LDE1IEBAIHJl YWN0LWFkZG9ucy10ZXN0LXV0aWxzQH4xNS40LjI6CiAgICAgZmJqcyAiXjAuOC40IgogICAgIG9i amVjdC1hc3NpZ24gIl40LjEuMCIKIAotcmVhY3QtZG9tQH4xNS40LjI6CisicmVhY3QtZG9tQGZp bGU6Li4vd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20iOgogICB2ZXJzaW9uICIx NS40LjIiCi0gIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL3JlYWN0LWRv bS8tL3JlYWN0LWRvbS0xNS40LjIudGd6IzAxNTM2M2YwNWIwYTFmZDUyYWU5ZWZkZDNhMDA2MGQ5 MDY5NTIwOGYiCiAgIGRlcGVuZGVuY2llczoKICAgICBmYmpzICJeMC44LjEiCiAgICAgbG9vc2Ut ZW52aWZ5ICJeMS4xLjAiCiAgICAgb2JqZWN0LWFzc2lnbiAiXjQuMS4wIgogCi1yZWFjdEB+MTUu NC4yOgorInJlYWN0QGZpbGU6Li4vd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdCI6CiAg IHZlcnNpb24gIjE1LjQuMiIKLSAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5j b20vcmVhY3QvLS9yZWFjdC0xNS40LjIudGd6IzQxZjc5OTFiMjYxODUzOTJiYTliYWU5NmM4ODg5 ZTdlMDE4Mzk3ZWYiCiAgIGRlcGVuZGVuY2llczoKICAgICBmYmpzICJeMC44LjQiCiAgICAgbG9v c2UtZW52aWZ5ICJeMS4xLjAiCkBAIC0zNjQwLDE1ICszNjQ5LDE1IEBAIHJlYWQtcGtnQF4xLjAu MDoKICAgICBub3JtYWxpemUtcGFja2FnZS1kYXRhICJeMi4zLjIiCiAgICAgcGF0aC10eXBlICJe MS4wLjAiCiAKLXJlYWRhYmxlLXN0cmVhbUBeMi4wLjEsIHJlYWRhYmxlLXN0cmVhbUBeMi4wLjIs IHJlYWRhYmxlLXN0cmVhbUBeMi4wLjUsIHJlYWRhYmxlLXN0cmVhbUBeMi4wLjYsIHJlYWRhYmxl LXN0cmVhbUBeMi4xLjQsIHJlYWRhYmxlLXN0cmVhbUBeMi4xLjUsIHJlYWRhYmxlLXN0cmVhbUBe Mi4yLjY6Ci0gIHZlcnNpb24gIjIuMi4xMSIKLSAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnku eWFybnBrZy5jb20vcmVhZGFibGUtc3RyZWFtLy0vcmVhZGFibGUtc3RyZWFtLTIuMi4xMS50Z3oj MDc5NmIzMWY4ZDc2ODgwMDdmZjBiOTNhODA4OGQzNGFhMTdjMGY3MiIKK3JlYWRhYmxlLXN0cmVh bUBeMi4wLjEsIHJlYWRhYmxlLXN0cmVhbUBeMi4wLjIsIHJlYWRhYmxlLXN0cmVhbUBeMi4wLjUs IHJlYWRhYmxlLXN0cmVhbUBeMi4wLjYsIHJlYWRhYmxlLXN0cmVhbUBeMi4xLjQsIHJlYWRhYmxl LXN0cmVhbUBeMi4xLjUsIHJlYWRhYmxlLXN0cmVhbUBeMi4yLjIsIHJlYWRhYmxlLXN0cmVhbUBe Mi4yLjY6CisgIHZlcnNpb24gIjIuMy4wIgorICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55 YXJucGtnLmNvbS9yZWFkYWJsZS1zdHJlYW0vLS9yZWFkYWJsZS1zdHJlYW0tMi4zLjAudGd6IzY0 MGY1ZGNkYTg4YzkxYThkYzYwNzg3MTQ1NjI5MTcwODEzYTFlZDIiCiAgIGRlcGVuZGVuY2llczoK ICAgICBjb3JlLXV0aWwtaXMgIn4xLjAuMCIKLSAgICBpbmhlcml0cyAifjIuMC4xIgorICAgIGlu aGVyaXRzICJ+Mi4wLjMiCiAgICAgaXNhcnJheSAifjEuMC4wIgogICAgIHByb2Nlc3MtbmV4dGlj ay1hcmdzICJ+MS4wLjYiCi0gICAgc2FmZS1idWZmZXIgIn41LjAuMSIKKyAgICBzYWZlLWJ1ZmZl ciAifjUuMS4wIgogICAgIHN0cmluZ19kZWNvZGVyICJ+MS4wLjAiCiAgICAgdXRpbC1kZXByZWNh dGUgIn4xLjAuMSIKIApAQCAtMzg4OSw3ICszODk4LDcgQEAgcngtbGl0ZUBeMy4xLjI6CiAgIHZl cnNpb24gIjMuMS4yIgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9y eC1saXRlLy0vcngtbGl0ZS0zLjEuMi50Z3ojMTljZTUwMmNhNTcyNjY1ZjNiNjQ3YjEwOTM5Zjk3 ZmQxNjE1ZjEwMiIKIAotc2FmZS1idWZmZXJAXjUuMC4xLCBzYWZlLWJ1ZmZlckBeNS4xLjA6Citz YWZlLWJ1ZmZlckBeNS4wLjEsIHNhZmUtYnVmZmVyQF41LjEuMCwgc2FmZS1idWZmZXJAfjUuMS4w OgogICB2ZXJzaW9uICI1LjEuMCIKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBr Zy5jb20vc2FmZS1idWZmZXIvLS9zYWZlLWJ1ZmZlci01LjEuMC50Z3ojZmU0Yzg0NjAzOTdmOWVh YWFhNThlNzNiZTQ2MjczNDA4YTQ1ZTIyMyIKIApAQCAtNDA1Miw4ICs0MDYxLDggQEAgc3ByaW50 Zi1qc0B+MS4wLjI6CiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL3Nw cmludGYtanMvLS9zcHJpbnRmLWpzLTEuMC4zLnRneiMwNGU2OTI2ZjY2Mjg5NTM1NGYzZGQwMTUy MDM2MzNiODU3Mjk3ZTJjIgogCiBzc2hwa0BeMS43LjA6Ci0gIHZlcnNpb24gIjEuMTMuMCIKLSAg cmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vc3NocGsvLS9zc2hway0xLjEz LjAudGd6I2ZmMmEzZTRmZDA0NDk3NTU1ZmVkOTdiMzlhMGZkODJmYWZiM2EzM2MiCisgIHZlcnNp b24gIjEuMTMuMSIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vc3No cGsvLS9zc2hway0xLjEzLjEudGd6IzUxMmRmNmRhNjI4NzE0NDMxNmRjNGMxOGZlMWNmMWQ5NDA3 MzliZTMiCiAgIGRlcGVuZGVuY2llczoKICAgICBhc24xICJ+MC4yLjMiCiAgICAgYXNzZXJ0LXBs dXMgIl4xLjAuMCIKQEAgLTQwNjIsNyArNDA3MSw2IEBAIHNzaHBrQF4xLjcuMDoKICAgb3B0aW9u YWxEZXBlbmRlbmNpZXM6CiAgICAgYmNyeXB0LXBia2RmICJeMS4wLjAiCiAgICAgZWNjLWpzYm4g In4wLjEuMSIKLSAgICBqb2RpZDI1NTE5ICJeMS4wLjAiCiAgICAganNibiAifjAuMS4wIgogICAg IHR3ZWV0bmFjbCAifjAuMTQuMCIKIApAQCAtNDA4NSw4ICs0MDkzLDggQEAgc3RyZWFtLWNvbWJp bmVyMkBeMS4xLjE6CiAgICAgcmVhZGFibGUtc3RyZWFtICJeMi4wLjIiCiAKIHN0cmVhbS1odHRw QF4yLjAuMCwgc3RyZWFtLWh0dHBAXjIuMy4xOgotICB2ZXJzaW9uICIyLjcuMSIKLSAgcmVzb2x2 ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vc3RyZWFtLWh0dHAvLS9zdHJlYW0taHR0 cC0yLjcuMS50Z3ojNTQ2YTUxNzQxYWQ1YTZiMDdlOWUzMWIwYjEwNDQxYTkxN2RmNTI4YSIKKyAg dmVyc2lvbiAiMi43LjIiCisgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29t L3N0cmVhbS1odHRwLy0vc3RyZWFtLWh0dHAtMi43LjIudGd6IzQwYTA1MGVjOGRjM2I1M2IzM2Q5 OTA5NDE1YzAyYzBiZjFhYmZiYWQiCiAgIGRlcGVuZGVuY2llczoKICAgICBidWlsdGluLXN0YXR1 cy1jb2RlcyAiXjMuMC4wIgogICAgIGluaGVyaXRzICJeMi4wLjEiCkBAIC00MzAyLDcgKzQzMTAs NyBAQCB0eXBlLWlzQH4xLjYuMTU6CiAgICAgbWVkaWEtdHlwZXIgIjAuMy4wIgogICAgIG1pbWUt dHlwZXMgIn4yLjEuMTUiCiAKLXR5cGVkYXJyYXlAfjAuMC41OgordHlwZWRhcnJheUBeMC4wLjYs IHR5cGVkYXJyYXlAfjAuMC41OgogICB2ZXJzaW9uICIwLjAuNiIKICAgcmVzb2x2ZWQgImh0dHBz Oi8vcmVnaXN0cnkueWFybnBrZy5jb20vdHlwZWRhcnJheS8tL3R5cGVkYXJyYXktMC4wLjYudGd6 Izg2N2FjNzRlMzg2NDE4N2IxZDNkNDdkOTk2YTc4ZWM1Yzg4MzA3NzciCiAKQEAgLTQzMTEsOCAr NDMxOSw4IEBAIHVhLXBhcnNlci1qc0BeMC43Ljk6CiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lz dHJ5Lnlhcm5wa2cuY29tL3VhLXBhcnNlci1qcy8tL3VhLXBhcnNlci1qcy0wLjcuMTIudGd6IzA0 YzgxYTk5YmRkNWRjNTIyNjNlYTI5ZDI0YzZiZjhkNDgxOGE0YmIiCiAKIHVnbGlmeS1qc0BeMi44 LjU6Ci0gIHZlcnNpb24gIjIuOC4yOCIKLSAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFy bnBrZy5jb20vdWdsaWZ5LWpzLy0vdWdsaWZ5LWpzLTIuOC4yOC50Z3ojZTMzNTAzMmRmOWJiMjBk Y2I5MThmMTY0NTg5ZDVhZjQ3ZjM4ODM0YSIKKyAgdmVyc2lvbiAiMi44LjI5IgorICByZXNvbHZl ZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS91Z2xpZnktanMvLS91Z2xpZnktanMtMi44 LjI5LnRneiMyOWM1NzMzMTQ4MDU3YmI0ZTFmNzVkZjM1YjdhOWNiNzJlNmE1OWRkIgogICBkZXBl bmRlbmNpZXM6CiAgICAgc291cmNlLW1hcCAifjAuNS4xIgogICAgIHlhcmdzICJ+My4xMC4wIgpA QCAtNDM4Miw4ICs0MzkwLDggQEAgdXVpZEBeMi4wLjM6CiAgIHJlc29sdmVkICJodHRwczovL3Jl Z2lzdHJ5Lnlhcm5wa2cuY29tL3V1aWQvLS91dWlkLTIuMC4zLnRneiM2N2UyZTg2Mzc5NzIxNTUz MGRmZjMxOGU1YmY5ZGNlYmZkNDdiMjFhIgogCiB1dWlkQF4zLjAuMDoKLSAgdmVyc2lvbiAiMy4w LjEiCi0gIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL3V1aWQvLS91dWlk LTMuMC4xLnRneiM2NTQ0YmJhMmRmZGE4YzFjZjE3ZTYyOWEzYTMwNWUyYmIxZmVlNmMxIgorICB2 ZXJzaW9uICIzLjEuMCIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20v dXVpZC8tL3V1aWQtMy4xLjAudGd6IzNkZDNkM2U3OTBhYmMyNGQ3YjBkM2EwMzRmZmFiYWJlMjhl YmJjMDQiCiAKIHZhbGlkYXRlLW5wbS1wYWNrYWdlLWxpY2Vuc2VAXjMuMC4xOgogICB2ZXJzaW9u ICIzLjAuMSIK --f403045e1d6c3cf30605526af3d5 Content-Type: text/plain; charset="US-ASCII"; name="02-react-dom-synthetic-event-fix.diff" Content-Disposition: attachment; filename="02-react-dom-synthetic-event-fix.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_j46307971 ZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2Rpc3QvcmVh Y3QtZG9tLXNlcnZlci5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2Rp c3QvcmVhY3QtZG9tLXNlcnZlci5qcwppbmRleCA4ZWIyYzkwYy4uNmQ0YzhmZTYgMTAwNjQ0Ci0t LSBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2Rpc3QvcmVhY3QtZG9tLXNl cnZlci5qcworKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9kaXN0L3Jl YWN0LWRvbS1zZXJ2ZXIuanMKQEAgLTEyMTM2LDYgKzEyMTM2LDI5IEBAIF9hc3NpZ24oU3ludGhl dGljRXZlbnQucHJvdG90eXBlLCB7CiAKIFN5bnRoZXRpY0V2ZW50LkludGVyZmFjZSA9IEV2ZW50 SW50ZXJmYWNlOwogCisvKioKKyAqIEhlbHBlciB0byByZWR1Y2UgYm9pbGVycGxhdGUgd2hlbiBj cmVhdGluZyBzdWJjbGFzc2VzLgorICoKKyAqIEBwYXJhbSB7ZnVuY3Rpb259IENsYXNzCisgKiBA cGFyYW0gez9vYmplY3R9IEludGVyZmFjZQorICovCitTeW50aGV0aWNFdmVudC5hdWdtZW50Q2xh c3MgPSBmdW5jdGlvbiAoQ2xhc3MsIEludGVyZmFjZSkgeworICB2YXIgU3VwZXIgPSB0aGlzOwor CisgIHZhciBFID0gZnVuY3Rpb24gKCkge307CisgIEUucHJvdG90eXBlID0gU3VwZXIucHJvdG90 eXBlOworICB2YXIgcHJvdG90eXBlID0gbmV3IEUoKTsKKworICBfYXNzaWduKHByb3RvdHlwZSwg Q2xhc3MucHJvdG90eXBlKTsKKyAgQ2xhc3MucHJvdG90eXBlID0gcHJvdG90eXBlOworICBDbGFz cy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDbGFzczsKKworICBDbGFzcy5JbnRlcmZhY2UgPSBf YXNzaWduKHt9LCBTdXBlci5JbnRlcmZhY2UsIEludGVyZmFjZSk7CisgIENsYXNzLmF1Z21lbnRD bGFzcyA9IFN1cGVyLmF1Z21lbnRDbGFzczsKKworICBQb29sZWRDbGFzcy5hZGRQb29saW5nVG8o Q2xhc3MsIFBvb2xlZENsYXNzLmZvdXJBcmd1bWVudFBvb2xlcik7Cit9OworCiBpZiAoImRldmVs b3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgIGlmIChpc1Byb3h5U3VwcG9ydGVkKSB7CiAg ICAgLyplc2xpbnQtZGlzYWJsZSBuby1mdW5jLWFzc2lnbiAqLwpAQCAtMTIxNTksMjggKzEyMTgy LDYgQEAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgewogICAgIC8qZXNsaW50 LWVuYWJsZSBuby1mdW5jLWFzc2lnbiAqLwogICB9CiB9Ci0vKioKLSAqIEhlbHBlciB0byByZWR1 Y2UgYm9pbGVycGxhdGUgd2hlbiBjcmVhdGluZyBzdWJjbGFzc2VzLgotICoKLSAqIEBwYXJhbSB7 ZnVuY3Rpb259IENsYXNzCi0gKiBAcGFyYW0gez9vYmplY3R9IEludGVyZmFjZQotICovCi1TeW50 aGV0aWNFdmVudC5hdWdtZW50Q2xhc3MgPSBmdW5jdGlvbiAoQ2xhc3MsIEludGVyZmFjZSkgewot ICB2YXIgU3VwZXIgPSB0aGlzOwotCi0gIHZhciBFID0gZnVuY3Rpb24gKCkge307Ci0gIEUucHJv dG90eXBlID0gU3VwZXIucHJvdG90eXBlOwotICB2YXIgcHJvdG90eXBlID0gbmV3IEUoKTsKLQot ICBfYXNzaWduKHByb3RvdHlwZSwgQ2xhc3MucHJvdG90eXBlKTsKLSAgQ2xhc3MucHJvdG90eXBl ID0gcHJvdG90eXBlOwotICBDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDbGFzczsKLQot ICBDbGFzcy5JbnRlcmZhY2UgPSBfYXNzaWduKHt9LCBTdXBlci5JbnRlcmZhY2UsIEludGVyZmFj ZSk7Ci0gIENsYXNzLmF1Z21lbnRDbGFzcyA9IFN1cGVyLmF1Z21lbnRDbGFzczsKLQotICBQb29s ZWRDbGFzcy5hZGRQb29saW5nVG8oQ2xhc3MsIFBvb2xlZENsYXNzLmZvdXJBcmd1bWVudFBvb2xl cik7Ci19OwogCiBQb29sZWRDbGFzcy5hZGRQb29saW5nVG8oU3ludGhldGljRXZlbnQsIFBvb2xl ZENsYXNzLmZvdXJBcmd1bWVudFBvb2xlcik7CiAKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3N0 YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2Rpc3QvcmVhY3QtZG9tLXNlcnZlci5taW4uanMgYi93ZWIv cGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9kaXN0L3JlYWN0LWRvbS1zZXJ2ZXIubWlu LmpzCmluZGV4IGUzYjkwZDI2Li42MDU4ZmQ0ZSAxMDA2NDQKLS0tIGEvd2ViL3BnYWRtaW4vc3Rh dGljL3ZlbmRvci9yZWFjdC1kb20vZGlzdC9yZWFjdC1kb20tc2VydmVyLm1pbi5qcworKysgYi93 ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9kaXN0L3JlYWN0LWRvbS1zZXJ2ZXIu bWluLmpzCkBAIC0xLDE1ICsxIEBACi0vKioKLSAqIFJlYWN0RE9NU2VydmVyIHYxNS40LjIKLSAq Ci0gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgotICogQWxsIHJpZ2h0 cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRo ZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKLSAqIExJQ0VOU0UgZmlsZSBpbiB0aGUg cm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAot ICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0 aGUgc2FtZSBkaXJlY3RvcnkuCi0gKgotICovCi0hZnVuY3Rpb24oZSl7aWYoIm9iamVjdCI9PXR5 cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZSltb2R1bGUuZXhwb3J0cz1l KHJlcXVpcmUoInJlYWN0IikpO2Vsc2UgaWYoImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVm aW5lLmFtZClkZWZpbmUoWyJyZWFjdCJdLGUpO2Vsc2V7dmFyIHQ7dD0idW5kZWZpbmVkIiE9dHlw ZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRl ZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnRoaXMsdC5SZWFjdERPTVNlcnZlcj1lKHQuUmVhY3Qp fX0oZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlKCl9KGZ1bmN0aW9uKCl7 cmV0dXJuIGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIG8oYSxzKXtpZighblthXSl7aWYoIXRb YV0pe3ZhciB1PSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFzJiZ1KXJl dHVybiB1KGEsITApO2lmKGkpcmV0dXJuIGkoYSwhMCk7dmFyIGw9bmV3IEVycm9yKCJDYW5ub3Qg ZmluZCBtb2R1bGUgJyIrYSsiJyIpO3Rocm93IGwuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsbH12 YXIgYz1uW2FdPXtleHBvcnRzOnt9fTt0W2FdWzBdLmNhbGwoYy5leHBvcnRzLGZ1bmN0aW9uKGUp e3ZhciBuPXRbYV1bMV1bZV07cmV0dXJuIG8obj9uOmUpfSxjLGMuZXhwb3J0cyxlLHQsbixyKX1y ZXR1cm4gblthXS5leHBvcnRzfWZvcih2YXIgaT0iZnVuY3Rpb24iPT10eXBlb2YgcmVxdWlyZSYm cmVxdWlyZSxhPTA7YTxyLmxlbmd0aDthKyspbyhyW2FdKTtyZXR1cm4gb30oezE6W2Z1bmN0aW9u KGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9e1Byb3BlcnRpZXM6eyJhcmlhLWN1cnJlbnQiOjAs ImFyaWEtZGV0YWlscyI6MCwiYXJpYS1kaXNhYmxlZCI6MCwiYXJpYS1oaWRkZW4iOjAsImFyaWEt aW52YWxpZCI6MCwiYXJpYS1rZXlzaG9ydGN1dHMiOjAsImFyaWEtbGFiZWwiOjAsImFyaWEtcm9s ZWRlc2NyaXB0aW9uIjowLCJhcmlhLWF1dG9jb21wbGV0ZSI6MCwiYXJpYS1jaGVja2VkIjowLCJh cmlhLWV4cGFuZGVkIjowLCJhcmlhLWhhc3BvcHVwIjowLCJhcmlhLWxldmVsIjowLCJhcmlhLW1v ZGFsIjowLCJhcmlhLW11bHRpbGluZSI6MCwiYXJpYS1tdWx0aXNlbGVjdGFibGUiOjAsImFyaWEt b3JpZW50YXRpb24iOjAsImFyaWEtcGxhY2Vob2xkZXIiOjAsImFyaWEtcHJlc3NlZCI6MCwiYXJp YS1yZWFkb25seSI6MCwiYXJpYS1yZXF1aXJlZCI6MCwiYXJpYS1zZWxlY3RlZCI6MCwiYXJpYS1z b3J0IjowLCJhcmlhLXZhbHVlbWF4IjowLCJhcmlhLXZhbHVlbWluIjowLCJhcmlhLXZhbHVlbm93 IjowLCJhcmlhLXZhbHVldGV4dCI6MCwiYXJpYS1hdG9taWMiOjAsImFyaWEtYnVzeSI6MCwiYXJp YS1saXZlIjowLCJhcmlhLXJlbGV2YW50IjowLCJhcmlhLWRyb3BlZmZlY3QiOjAsImFyaWEtZ3Jh YmJlZCI6MCwiYXJpYS1hY3RpdmVkZXNjZW5kYW50IjowLCJhcmlhLWNvbGNvdW50IjowLCJhcmlh LWNvbGluZGV4IjowLCJhcmlhLWNvbHNwYW4iOjAsImFyaWEtY29udHJvbHMiOjAsImFyaWEtZGVz Y3JpYmVkYnkiOjAsImFyaWEtZXJyb3JtZXNzYWdlIjowLCJhcmlhLWZsb3d0byI6MCwiYXJpYS1s YWJlbGxlZGJ5IjowLCJhcmlhLW93bnMiOjAsImFyaWEtcG9zaW5zZXQiOjAsImFyaWEtcm93Y291 bnQiOjAsImFyaWEtcm93aW5kZXgiOjAsImFyaWEtcm93c3BhbiI6MCwiYXJpYS1zZXRzaXplIjow fSxET01BdHRyaWJ1dGVOYW1lczp7fSxET01Qcm9wZXJ0eU5hbWVzOnt9fTt0LmV4cG9ydHM9cn0s e31dLDI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgzMiksbz1lKDEyOCks aT17Zm9jdXNET01Db21wb25lbnQ6ZnVuY3Rpb24oKXtvKHIuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0 aGlzKSl9fTt0LmV4cG9ydHM9aX0sezEyODoxMjgsMzI6MzJ9XSwzOltmdW5jdGlvbihlLHQsbil7 InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoKXt2YXIgZT13aW5kb3cub3BlcmE7cmV0dXJuIm9iamVj dCI9PXR5cGVvZiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS52ZXJzaW9uJiZwYXJzZUludChlLnZl cnNpb24oKSwxMCk8PTEyfWZ1bmN0aW9uIG8oZSl7cmV0dXJuKGUuY3RybEtleXx8ZS5hbHRLZXl8 fGUubWV0YUtleSkmJiEoZS5jdHJsS2V5JiZlLmFsdEtleSl9ZnVuY3Rpb24gaShlKXtzd2l0Y2go ZSl7Y2FzZSJ0b3BDb21wb3NpdGlvblN0YXJ0IjpyZXR1cm4gVC5jb21wb3NpdGlvblN0YXJ0O2Nh c2UidG9wQ29tcG9zaXRpb25FbmQiOnJldHVybiBULmNvbXBvc2l0aW9uRW5kO2Nhc2UidG9wQ29t cG9zaXRpb25VcGRhdGUiOnJldHVybiBULmNvbXBvc2l0aW9uVXBkYXRlfX1mdW5jdGlvbiBhKGUs dCl7cmV0dXJuInRvcEtleURvd24iPT09ZSYmdC5rZXlDb2RlPT09Q31mdW5jdGlvbiBzKGUsdCl7 c3dpdGNoKGUpe2Nhc2UidG9wS2V5VXAiOnJldHVybiB5LmluZGV4T2YodC5rZXlDb2RlKSE9PS0x O2Nhc2UidG9wS2V5RG93biI6cmV0dXJuIHQua2V5Q29kZSE9PUM7Y2FzZSJ0b3BLZXlQcmVzcyI6 Y2FzZSJ0b3BNb3VzZURvd24iOmNhc2UidG9wQmx1ciI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4h MX19ZnVuY3Rpb24gdShlKXt2YXIgdD1lLmRldGFpbDtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQm JiJkYXRhImluIHQ/dC5kYXRhOm51bGx9ZnVuY3Rpb24gbChlLHQsbixyKXt2YXIgbyxsO2lmKF8/ bz1pKGUpOlM/cyhlLG4pJiYobz1ULmNvbXBvc2l0aW9uRW5kKTphKGUsbikmJihvPVQuY29tcG9z aXRpb25TdGFydCksIW8pcmV0dXJuIG51bGw7eCYmKFN8fG8hPT1ULmNvbXBvc2l0aW9uU3RhcnQ/ bz09PVQuY29tcG9zaXRpb25FbmQmJlMmJihsPVMuZ2V0RGF0YSgpKTpTPXYuZ2V0UG9vbGVkKHIp KTt2YXIgYz1tLmdldFBvb2xlZChvLHQsbixyKTtpZihsKWMuZGF0YT1sO2Vsc2V7dmFyIHA9dShu KTtudWxsIT09cCYmKGMuZGF0YT1wKX1yZXR1cm4gZi5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRj aGVzKGMpLGN9ZnVuY3Rpb24gYyhlLHQpe3N3aXRjaChlKXtjYXNlInRvcENvbXBvc2l0aW9uRW5k IjpyZXR1cm4gdSh0KTtjYXNlInRvcEtleVByZXNzIjp2YXIgbj10LndoaWNoO3JldHVybiBuIT09 dz9udWxsOihQPSEwLGspO2Nhc2UidG9wVGV4dElucHV0Ijp2YXIgcj10LmRhdGE7cmV0dXJuIHI9 PT1rJiZQP251bGw6cjtkZWZhdWx0OnJldHVybiBudWxsfX1mdW5jdGlvbiBwKGUsdCl7aWYoUyl7 aWYoInRvcENvbXBvc2l0aW9uRW5kIj09PWV8fCFfJiZzKGUsdCkpe3ZhciBuPVMuZ2V0RGF0YSgp O3JldHVybiB2LnJlbGVhc2UoUyksUz1udWxsLG59cmV0dXJuIG51bGx9c3dpdGNoKGUpe2Nhc2Ui dG9wUGFzdGUiOnJldHVybiBudWxsO2Nhc2UidG9wS2V5UHJlc3MiOnJldHVybiB0LndoaWNoJiYh byh0KT9TdHJpbmcuZnJvbUNoYXJDb2RlKHQud2hpY2gpOm51bGw7Y2FzZSJ0b3BDb21wb3NpdGlv bkVuZCI6cmV0dXJuIHg/bnVsbDp0LmRhdGE7ZGVmYXVsdDpyZXR1cm4gbnVsbH19ZnVuY3Rpb24g ZChlLHQsbixyKXt2YXIgbztpZihvPUU/YyhlLG4pOnAoZSxuKSwhbylyZXR1cm4gbnVsbDt2YXIg aT1nLmdldFBvb2xlZChULmJlZm9yZUlucHV0LHQsbixyKTtyZXR1cm4gaS5kYXRhPW8sZi5hY2N1 bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGkpLGl9dmFyIGY9ZSgxOSksaD1lKDEyMCksdj1lKDIw KSxtPWUoNzgpLGc9ZSg4MikseT1bOSwxMywyNywzMl0sQz0yMjksXz1oLmNhblVzZURPTSYmIkNv bXBvc2l0aW9uRXZlbnQiaW4gd2luZG93LGI9bnVsbDtoLmNhblVzZURPTSYmImRvY3VtZW50TW9k ZSJpbiBkb2N1bWVudCYmKGI9ZG9jdW1lbnQuZG9jdW1lbnRNb2RlKTt2YXIgRT1oLmNhblVzZURP TSYmIlRleHRFdmVudCJpbiB3aW5kb3cmJiFiJiYhcigpLHg9aC5jYW5Vc2VET00mJighX3x8YiYm Yj44JiZiPD0xMSksdz0zMixrPVN0cmluZy5mcm9tQ2hhckNvZGUodyksVD17YmVmb3JlSW5wdXQ6 e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOiJvbkJlZm9yZUlucHV0IixjYXB0dXJl ZDoib25CZWZvcmVJbnB1dENhcHR1cmUifSxkZXBlbmRlbmNpZXM6WyJ0b3BDb21wb3NpdGlvbkVu ZCIsInRvcEtleVByZXNzIiwidG9wVGV4dElucHV0IiwidG9wUGFzdGUiXX0sY29tcG9zaXRpb25F bmQ6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOiJvbkNvbXBvc2l0aW9uRW5kIixj YXB0dXJlZDoib25Db21wb3NpdGlvbkVuZENhcHR1cmUifSxkZXBlbmRlbmNpZXM6WyJ0b3BCbHVy IiwidG9wQ29tcG9zaXRpb25FbmQiLCJ0b3BLZXlEb3duIiwidG9wS2V5UHJlc3MiLCJ0b3BLZXlV cCIsInRvcE1vdXNlRG93biJdfSxjb21wb3NpdGlvblN0YXJ0OntwaGFzZWRSZWdpc3RyYXRpb25O YW1lczp7YnViYmxlZDoib25Db21wb3NpdGlvblN0YXJ0IixjYXB0dXJlZDoib25Db21wb3NpdGlv blN0YXJ0Q2FwdHVyZSJ9LGRlcGVuZGVuY2llczpbInRvcEJsdXIiLCJ0b3BDb21wb3NpdGlvblN0 YXJ0IiwidG9wS2V5RG93biIsInRvcEtleVByZXNzIiwidG9wS2V5VXAiLCJ0b3BNb3VzZURvd24i XX0sY29tcG9zaXRpb25VcGRhdGU6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOiJv bkNvbXBvc2l0aW9uVXBkYXRlIixjYXB0dXJlZDoib25Db21wb3NpdGlvblVwZGF0ZUNhcHR1cmUi fSxkZXBlbmRlbmNpZXM6WyJ0b3BCbHVyIiwidG9wQ29tcG9zaXRpb25VcGRhdGUiLCJ0b3BLZXlE b3duIiwidG9wS2V5UHJlc3MiLCJ0b3BLZXlVcCIsInRvcE1vdXNlRG93biJdfX0sUD0hMSxTPW51 bGwsTT17ZXZlbnRUeXBlczpULGV4dHJhY3RFdmVudHM6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJu W2woZSx0LG4sciksZChlLHQsbixyKV19fTt0LmV4cG9ydHM9TX0sezEyMDoxMjAsMTk6MTksMjA6 MjAsNzg6NzgsODI6ODJ9XSw0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9u IHIoZSx0KXtyZXR1cm4gZSt0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3Quc3Vic3RyaW5nKDEp fXZhciBvPXthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxib3JkZXJJbWFnZU91dHNldDohMCxi b3JkZXJJbWFnZVNsaWNlOiEwLGJvcmRlckltYWdlV2lkdGg6ITAsYm94RmxleDohMCxib3hGbGV4 R3JvdXA6ITAsYm94T3JkaW5hbEdyb3VwOiEwLGNvbHVtbkNvdW50OiEwLGZsZXg6ITAsZmxleEdy b3c6ITAsZmxleFBvc2l0aXZlOiEwLGZsZXhTaHJpbms6ITAsZmxleE5lZ2F0aXZlOiEwLGZsZXhP cmRlcjohMCxncmlkUm93OiEwLGdyaWRDb2x1bW46ITAsZm9udFdlaWdodDohMCxsaW5lQ2xhbXA6 ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsdGFiU2l6ZToh MCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITAsZmlsbE9wYWNpdHk6ITAsZmxvb2RPcGFjaXR5 OiEwLHN0b3BPcGFjaXR5OiEwLHN0cm9rZURhc2hhcnJheTohMCxzdHJva2VEYXNob2Zmc2V0OiEw LHN0cm9rZU1pdGVybGltaXQ6ITAsc3Ryb2tlT3BhY2l0eTohMCxzdHJva2VXaWR0aDohMH0saT1b IldlYmtpdCIsIm1zIiwiTW96IiwiTyJdO09iamVjdC5rZXlzKG8pLmZvckVhY2goZnVuY3Rpb24o ZSl7aS5mb3JFYWNoKGZ1bmN0aW9uKHQpe29bcih0LGUpXT1vW2VdfSl9KTt2YXIgYT17YmFja2dy b3VuZDp7YmFja2dyb3VuZEF0dGFjaG1lbnQ6ITAsYmFja2dyb3VuZENvbG9yOiEwLGJhY2tncm91 bmRJbWFnZTohMCxiYWNrZ3JvdW5kUG9zaXRpb25YOiEwLGJhY2tncm91bmRQb3NpdGlvblk6ITAs YmFja2dyb3VuZFJlcGVhdDohMH0sYmFja2dyb3VuZFBvc2l0aW9uOntiYWNrZ3JvdW5kUG9zaXRp b25YOiEwLGJhY2tncm91bmRQb3NpdGlvblk6ITB9LGJvcmRlcjp7Ym9yZGVyV2lkdGg6ITAsYm9y ZGVyU3R5bGU6ITAsYm9yZGVyQ29sb3I6ITB9LGJvcmRlckJvdHRvbTp7Ym9yZGVyQm90dG9tV2lk dGg6ITAsYm9yZGVyQm90dG9tU3R5bGU6ITAsYm9yZGVyQm90dG9tQ29sb3I6ITB9LGJvcmRlckxl ZnQ6e2JvcmRlckxlZnRXaWR0aDohMCxib3JkZXJMZWZ0U3R5bGU6ITAsYm9yZGVyTGVmdENvbG9y OiEwfSxib3JkZXJSaWdodDp7Ym9yZGVyUmlnaHRXaWR0aDohMCxib3JkZXJSaWdodFN0eWxlOiEw LGJvcmRlclJpZ2h0Q29sb3I6ITB9LGJvcmRlclRvcDp7Ym9yZGVyVG9wV2lkdGg6ITAsYm9yZGVy VG9wU3R5bGU6ITAsYm9yZGVyVG9wQ29sb3I6ITB9LGZvbnQ6e2ZvbnRTdHlsZTohMCxmb250VmFy aWFudDohMCxmb250V2VpZ2h0OiEwLGZvbnRTaXplOiEwLGxpbmVIZWlnaHQ6ITAsZm9udEZhbWls eTohMH0sb3V0bGluZTp7b3V0bGluZVdpZHRoOiEwLG91dGxpbmVTdHlsZTohMCxvdXRsaW5lQ29s b3I6ITB9fSxzPXtpc1VuaXRsZXNzTnVtYmVyOm8sc2hvcnRoYW5kUHJvcGVydHlFeHBhbnNpb25z OmF9O3QuZXhwb3J0cz1zfSx7fV0sNTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIg cj1lKDQpLG89ZSgxMjApLGk9KGUoNTcpLGUoMTIyKSxlKDk0KSksYT1lKDEzMykscz1lKDEzNyks dT0oZSgxMzkpLHMoZnVuY3Rpb24oZSl7cmV0dXJuIGEoZSl9KSksbD0hMSxjPSJjc3NGbG9hdCI7 aWYoby5jYW5Vc2VET00pe3ZhciBwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxl O3RyeXtwLmZvbnQ9IiJ9Y2F0Y2goZSl7bD0hMH12b2lkIDA9PT1kb2N1bWVudC5kb2N1bWVudEVs ZW1lbnQuc3R5bGUuY3NzRmxvYXQmJihjPSJzdHlsZUZsb2F0Iil9dmFyIGQ9e2NyZWF0ZU1hcmt1 cEZvclN0eWxlczpmdW5jdGlvbihlLHQpe3ZhciBuPSIiO2Zvcih2YXIgciBpbiBlKWlmKGUuaGFz T3duUHJvcGVydHkocikpe3ZhciBvPWVbcl07bnVsbCE9byYmKG4rPXUocikrIjoiLG4rPWkocixv LHQpKyI7Iil9cmV0dXJuIG58fG51bGx9LHNldFZhbHVlRm9yU3R5bGVzOmZ1bmN0aW9uKGUsdCxu KXt2YXIgbz1lLnN0eWxlO2Zvcih2YXIgYSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoYSkpe3Zh ciBzPWkoYSx0W2FdLG4pO2lmKCJmbG9hdCIhPT1hJiYiY3NzRmxvYXQiIT09YXx8KGE9Yykscylv W2FdPXM7ZWxzZXt2YXIgdT1sJiZyLnNob3J0aGFuZFByb3BlcnR5RXhwYW5zaW9uc1thXTtpZih1 KWZvcih2YXIgcCBpbiB1KW9bcF09IiI7ZWxzZSBvW2FdPSIifX19fTt0LmV4cG9ydHM9ZH0sezEy MDoxMjAsMTIyOjEyMiwxMzM6MTMzLDEzNzoxMzcsMTM5OjEzOSw0OjQsNTc6NTcsOTQ6OTR9XSw2 OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXtpZighKGUgaW5z dGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEg ZnVuY3Rpb24iKX12YXIgbz1lKDExMSksaT1lKDI0KSxhPShlKDEzNCksZnVuY3Rpb24oKXtmdW5j dGlvbiBlKHQpe3IodGhpcyxlKSx0aGlzLl9jYWxsYmFja3M9bnVsbCx0aGlzLl9jb250ZXh0cz1u dWxsLHRoaXMuX2FyZz10fXJldHVybiBlLnByb3RvdHlwZS5lbnF1ZXVlPWZ1bmN0aW9uKGUsdCl7 dGhpcy5fY2FsbGJhY2tzPXRoaXMuX2NhbGxiYWNrc3x8W10sdGhpcy5fY2FsbGJhY2tzLnB1c2go ZSksdGhpcy5fY29udGV4dHM9dGhpcy5fY29udGV4dHN8fFtdLHRoaXMuX2NvbnRleHRzLnB1c2go dCl9LGUucHJvdG90eXBlLm5vdGlmeUFsbD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX2NhbGxiYWNr cyx0PXRoaXMuX2NvbnRleHRzLG49dGhpcy5fYXJnO2lmKGUmJnQpe2UubGVuZ3RoIT09dC5sZW5n dGg/bygiMjQiKTp2b2lkIDAsdGhpcy5fY2FsbGJhY2tzPW51bGwsdGhpcy5fY29udGV4dHM9bnVs bDtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyllW3JdLmNhbGwodFtyXSxuKTtlLmxlbmd0aD0w LHQubGVuZ3RoPTB9fSxlLnByb3RvdHlwZS5jaGVja3BvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRo aXMuX2NhbGxiYWNrcz90aGlzLl9jYWxsYmFja3MubGVuZ3RoOjB9LGUucHJvdG90eXBlLnJvbGxi YWNrPWZ1bmN0aW9uKGUpe3RoaXMuX2NhbGxiYWNrcyYmdGhpcy5fY29udGV4dHMmJih0aGlzLl9j YWxsYmFja3MubGVuZ3RoPWUsdGhpcy5fY29udGV4dHMubGVuZ3RoPWUpfSxlLnByb3RvdHlwZS5y ZXNldD1mdW5jdGlvbigpe3RoaXMuX2NhbGxiYWNrcz1udWxsLHRoaXMuX2NvbnRleHRzPW51bGx9 LGUucHJvdG90eXBlLmRlc3RydWN0b3I9ZnVuY3Rpb24oKXt0aGlzLnJlc2V0KCl9LGV9KCkpO3Qu ZXhwb3J0cz1pLmFkZFBvb2xpbmdUbyhhKX0sezExMToxMTEsMTM0OjEzNCwyNDoyNH1dLDc6W2Z1 bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt2YXIgdD1lLm5vZGVOYW1l JiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuInNlbGVjdCI9PT10fHwiaW5wdXQiPT09 dCYmImZpbGUiPT09ZS50eXBlfWZ1bmN0aW9uIG8oZSl7dmFyIHQ9eC5nZXRQb29sZWQoUC5jaGFu Z2UsTSxlLHcoZSkpO0MuYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyh0KSxFLmJhdGNoZWRV cGRhdGVzKGksdCl9ZnVuY3Rpb24gaShlKXt5LmVucXVldWVFdmVudHMoZSkseS5wcm9jZXNzRXZl bnRRdWV1ZSghMSl9ZnVuY3Rpb24gYShlLHQpe1M9ZSxNPXQsUy5hdHRhY2hFdmVudCgib25jaGFu Z2UiLG8pfWZ1bmN0aW9uIHMoKXtTJiYoUy5kZXRhY2hFdmVudCgib25jaGFuZ2UiLG8pLFM9bnVs bCxNPW51bGwpfWZ1bmN0aW9uIHUoZSx0KXtpZigidG9wQ2hhbmdlIj09PWUpcmV0dXJuIHR9ZnVu Y3Rpb24gbChlLHQsbil7InRvcEZvY3VzIj09PWU/KHMoKSxhKHQsbikpOiJ0b3BCbHVyIj09PWUm JnMoKX1mdW5jdGlvbiBjKGUsdCl7Uz1lLE09dCxOPWUudmFsdWUsTz1PYmplY3QuZ2V0T3duUHJv cGVydHlEZXNjcmlwdG9yKGUuY29uc3RydWN0b3IucHJvdG90eXBlLCJ2YWx1ZSIpLE9iamVjdC5k ZWZpbmVQcm9wZXJ0eShTLCJ2YWx1ZSIsQSksUy5hdHRhY2hFdmVudD9TLmF0dGFjaEV2ZW50KCJv bnByb3BlcnR5Y2hhbmdlIixkKTpTLmFkZEV2ZW50TGlzdGVuZXIoInByb3BlcnR5Y2hhbmdlIixk LCExKX1mdW5jdGlvbiBwKCl7UyYmKGRlbGV0ZSBTLnZhbHVlLFMuZGV0YWNoRXZlbnQ/Uy5kZXRh Y2hFdmVudCgib25wcm9wZXJ0eWNoYW5nZSIsZCk6Uy5yZW1vdmVFdmVudExpc3RlbmVyKCJwcm9w ZXJ0eWNoYW5nZSIsZCwhMSksUz1udWxsLE09bnVsbCxOPW51bGwsTz1udWxsKX1mdW5jdGlvbiBk KGUpe2lmKCJ2YWx1ZSI9PT1lLnByb3BlcnR5TmFtZSl7dmFyIHQ9ZS5zcmNFbGVtZW50LnZhbHVl O3QhPT1OJiYoTj10LG8oZSkpfX1mdW5jdGlvbiBmKGUsdCl7aWYoInRvcElucHV0Ij09PWUpcmV0 dXJuIHR9ZnVuY3Rpb24gaChlLHQsbil7InRvcEZvY3VzIj09PWU/KHAoKSxjKHQsbikpOiJ0b3BC bHVyIj09PWUmJnAoKX1mdW5jdGlvbiB2KGUsdCl7aWYoKCJ0b3BTZWxlY3Rpb25DaGFuZ2UiPT09 ZXx8InRvcEtleVVwIj09PWV8fCJ0b3BLZXlEb3duIj09PWUpJiZTJiZTLnZhbHVlIT09TilyZXR1 cm4gTj1TLnZhbHVlLE19ZnVuY3Rpb24gbShlKXtyZXR1cm4gZS5ub2RlTmFtZSYmImlucHV0Ij09 PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmKCJjaGVja2JveCI9PT1lLnR5cGV8fCJyYWRpbyI9 PT1lLnR5cGUpfWZ1bmN0aW9uIGcoZSx0KXtpZigidG9wQ2xpY2siPT09ZSlyZXR1cm4gdH12YXIg eT1lKDE2KSxDPWUoMTkpLF89ZSgxMjApLGI9ZSgzMiksRT1lKDcxKSx4PWUoODApLHc9ZSgxMDEp LGs9ZSgxMDgpLFQ9ZSgxMDkpLFA9e2NoYW5nZTp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1 YmJsZWQ6Im9uQ2hhbmdlIixjYXB0dXJlZDoib25DaGFuZ2VDYXB0dXJlIn0sZGVwZW5kZW5jaWVz OlsidG9wQmx1ciIsInRvcENoYW5nZSIsInRvcENsaWNrIiwidG9wRm9jdXMiLCJ0b3BJbnB1dCIs InRvcEtleURvd24iLCJ0b3BLZXlVcCIsInRvcFNlbGVjdGlvbkNoYW5nZSJdfX0sUz1udWxsLE09 bnVsbCxOPW51bGwsTz1udWxsLEk9ITE7Xy5jYW5Vc2VET00mJihJPWsoImNoYW5nZSIpJiYoIWRv Y3VtZW50LmRvY3VtZW50TW9kZXx8ZG9jdW1lbnQuZG9jdW1lbnRNb2RlPjgpKTt2YXIgUj0hMTtf LmNhblVzZURPTSYmKFI9aygiaW5wdXQiKSYmKCFkb2N1bWVudC5kb2N1bWVudE1vZGV8fGRvY3Vt ZW50LmRvY3VtZW50TW9kZT4xMSkpO3ZhciBBPXtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gTy5nZXQu Y2FsbCh0aGlzKX0sc2V0OmZ1bmN0aW9uKGUpe049IiIrZSxPLnNldC5jYWxsKHRoaXMsZSl9fSxE PXtldmVudFR5cGVzOlAsZXh0cmFjdEV2ZW50czpmdW5jdGlvbihlLHQsbixvKXt2YXIgaSxhLHM9 dD9iLmdldE5vZGVGcm9tSW5zdGFuY2UodCk6d2luZG93O2lmKHIocyk/ST9pPXU6YT1sOlQocyk/ Uj9pPWY6KGk9dixhPWgpOm0ocykmJihpPWcpLGkpe3ZhciBjPWkoZSx0KTtpZihjKXt2YXIgcD14 LmdldFBvb2xlZChQLmNoYW5nZSxjLG4sbyk7cmV0dXJuIHAudHlwZT0iY2hhbmdlIixDLmFjY3Vt dWxhdGVUd29QaGFzZURpc3BhdGNoZXMocCkscH19YSYmYShlLHMsdCl9fTt0LmV4cG9ydHM9RH0s ezEwMToxMDEsMTA4OjEwOCwxMDk6MTA5LDEyMDoxMjAsMTY6MTYsMTk6MTksMzI6MzIsNzE6NzEs ODA6ODB9XSw4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXty ZXR1cm4gQXJyYXkuaXNBcnJheSh0KSYmKHQ9dFsxXSksdD90Lm5leHRTaWJsaW5nOmUuZmlyc3RD aGlsZH1mdW5jdGlvbiBvKGUsdCxuKXtjLmluc2VydFRyZWVCZWZvcmUoZSx0LG4pfWZ1bmN0aW9u IGkoZSx0LG4pe0FycmF5LmlzQXJyYXkodCk/cyhlLHRbMF0sdFsxXSxuKTp2KGUsdCxuKX1mdW5j dGlvbiBhKGUsdCl7aWYoQXJyYXkuaXNBcnJheSh0KSl7dmFyIG49dFsxXTt0PXRbMF0sdShlLHQs biksZS5yZW1vdmVDaGlsZChuKX1lLnJlbW92ZUNoaWxkKHQpfWZ1bmN0aW9uIHMoZSx0LG4scil7 Zm9yKHZhciBvPXQ7Oyl7dmFyIGk9by5uZXh0U2libGluZztpZih2KGUsbyxyKSxvPT09bilicmVh aztvPWl9fWZ1bmN0aW9uIHUoZSx0LG4pe2Zvcig7Oyl7dmFyIHI9dC5uZXh0U2libGluZztpZihy PT09bilicmVhaztlLnJlbW92ZUNoaWxkKHIpfX1mdW5jdGlvbiBsKGUsdCxuKXt2YXIgcj1lLnBh cmVudE5vZGUsbz1lLm5leHRTaWJsaW5nO289PT10P24mJnYocixkb2N1bWVudC5jcmVhdGVUZXh0 Tm9kZShuKSxvKTpuPyhoKG8sbiksdShyLG8sdCkpOnUocixlLHQpfXZhciBjPWUoOSkscD1lKDEz KSxkPShlKDMyKSxlKDU3KSxlKDkzKSksZj1lKDExMiksaD1lKDExMyksdj1kKGZ1bmN0aW9uKGUs dCxuKXtlLmluc2VydEJlZm9yZSh0LG4pfSksbT1wLmRhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRo TWFya3VwLGc9e2Rhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwOm0scmVwbGFjZURlbGlt aXRlZFRleHQ6bCxwcm9jZXNzVXBkYXRlczpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248dC5s ZW5ndGg7bisrKXt2YXIgcz10W25dO3N3aXRjaChzLnR5cGUpe2Nhc2UiSU5TRVJUX01BUktVUCI6 byhlLHMuY29udGVudCxyKGUscy5hZnRlck5vZGUpKTticmVhaztjYXNlIk1PVkVfRVhJU1RJTkci OmkoZSxzLmZyb21Ob2RlLHIoZSxzLmFmdGVyTm9kZSkpO2JyZWFrO2Nhc2UiU0VUX01BUktVUCI6 ZihlLHMuY29udGVudCk7YnJlYWs7Y2FzZSJURVhUX0NPTlRFTlQiOmgoZSxzLmNvbnRlbnQpO2Jy ZWFrO2Nhc2UiUkVNT1ZFX05PREUiOmEoZSxzLmZyb21Ob2RlKX19fX07dC5leHBvcnRzPWd9LHsx MTI6MTEyLDExMzoxMTMsMTM6MTMsMzI6MzIsNTc6NTcsOTo5LDkzOjkzfV0sOTpbZnVuY3Rpb24o ZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe2lmKG0pe3ZhciB0PWUubm9kZSxuPWUu Y2hpbGRyZW47aWYobi5sZW5ndGgpZm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKyspZyh0LG5bcl0s bnVsbCk7ZWxzZSBudWxsIT1lLmh0bWw/cCh0LGUuaHRtbCk6bnVsbCE9ZS50ZXh0JiZmKHQsZS50 ZXh0KX19ZnVuY3Rpb24gbyhlLHQpe2UucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodC5ub2RlLGUp LHIodCl9ZnVuY3Rpb24gaShlLHQpe20/ZS5jaGlsZHJlbi5wdXNoKHQpOmUubm9kZS5hcHBlbmRD aGlsZCh0Lm5vZGUpfWZ1bmN0aW9uIGEoZSx0KXttP2UuaHRtbD10OnAoZS5ub2RlLHQpfWZ1bmN0 aW9uIHMoZSx0KXttP2UudGV4dD10OmYoZS5ub2RlLHQpfWZ1bmN0aW9uIHUoKXtyZXR1cm4gdGhp cy5ub2RlLm5vZGVOYW1lfWZ1bmN0aW9uIGwoZSl7cmV0dXJue25vZGU6ZSxjaGlsZHJlbjpbXSxo dG1sOm51bGwsdGV4dDpudWxsLHRvU3RyaW5nOnV9fXZhciBjPWUoMTApLHA9ZSgxMTIpLGQ9ZSg5 MyksZj1lKDExMyksaD0xLHY9MTEsbT0idW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiYibnVt YmVyIj09dHlwZW9mIGRvY3VtZW50LmRvY3VtZW50TW9kZXx8InVuZGVmaW5lZCIhPXR5cGVvZiBu YXZpZ2F0b3ImJiJzdHJpbmciPT10eXBlb2YgbmF2aWdhdG9yLnVzZXJBZ2VudCYmL1xiRWRnZVwv XGQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksZz1kKGZ1bmN0aW9uKGUsdCxuKXt0Lm5vZGUu bm9kZVR5cGU9PT12fHx0Lm5vZGUubm9kZVR5cGU9PT1oJiYib2JqZWN0Ij09PXQubm9kZS5ub2Rl TmFtZS50b0xvd2VyQ2FzZSgpJiYobnVsbD09dC5ub2RlLm5hbWVzcGFjZVVSSXx8dC5ub2RlLm5h bWVzcGFjZVVSST09PWMuaHRtbCk/KHIodCksZS5pbnNlcnRCZWZvcmUodC5ub2RlLG4pKTooZS5p bnNlcnRCZWZvcmUodC5ub2RlLG4pLHIodCkpfSk7bC5pbnNlcnRUcmVlQmVmb3JlPWcsbC5yZXBs YWNlQ2hpbGRXaXRoVHJlZT1vLGwucXVldWVDaGlsZD1pLGwucXVldWVIVE1MPWEsbC5xdWV1ZVRl eHQ9cyx0LmV4cG9ydHM9bH0sezEwOjEwLDExMjoxMTIsMTEzOjExMyw5Mzo5M31dLDEwOltmdW5j dGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXtodG1sOiJodHRwOi8vd3d3LnczLm9yZy8x OTk5L3hodG1sIixtYXRobWw6Imh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiLHN2 ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcifTt0LmV4cG9ydHM9cn0se31dLDExOltmdW5j dGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4oZSZ0KT09PXR9 dmFyIG89ZSgxMTEpLGk9KGUoMTM0KSx7TVVTVF9VU0VfUFJPUEVSVFk6MSxIQVNfQk9PTEVBTl9W QUxVRTo0LEhBU19OVU1FUklDX1ZBTFVFOjgsSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUU6MjQs SEFTX09WRVJMT0FERURfQk9PTEVBTl9WQUxVRTozMixpbmplY3RET01Qcm9wZXJ0eUNvbmZpZzpm dW5jdGlvbihlKXt2YXIgdD1pLG49ZS5Qcm9wZXJ0aWVzfHx7fSxhPWUuRE9NQXR0cmlidXRlTmFt ZXNwYWNlc3x8e30sdT1lLkRPTUF0dHJpYnV0ZU5hbWVzfHx7fSxsPWUuRE9NUHJvcGVydHlOYW1l c3x8e30sYz1lLkRPTU11dGF0aW9uTWV0aG9kc3x8e307ZS5pc0N1c3RvbUF0dHJpYnV0ZSYmcy5f aXNDdXN0b21BdHRyaWJ1dGVGdW5jdGlvbnMucHVzaChlLmlzQ3VzdG9tQXR0cmlidXRlKTtmb3Io dmFyIHAgaW4gbil7cy5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHApP28oIjQ4IixwKTp2b2lk IDA7dmFyIGQ9cC50b0xvd2VyQ2FzZSgpLGY9bltwXSxoPXthdHRyaWJ1dGVOYW1lOmQsYXR0cmli dXRlTmFtZXNwYWNlOm51bGwscHJvcGVydHlOYW1lOnAsbXV0YXRpb25NZXRob2Q6bnVsbCxtdXN0 VXNlUHJvcGVydHk6cihmLHQuTVVTVF9VU0VfUFJPUEVSVFkpLGhhc0Jvb2xlYW5WYWx1ZTpyKGYs dC5IQVNfQk9PTEVBTl9WQUxVRSksaGFzTnVtZXJpY1ZhbHVlOnIoZix0LkhBU19OVU1FUklDX1ZB TFVFKSxoYXNQb3NpdGl2ZU51bWVyaWNWYWx1ZTpyKGYsdC5IQVNfUE9TSVRJVkVfTlVNRVJJQ19W QUxVRSksaGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZTpyKGYsdC5IQVNfT1ZFUkxPQURFRF9CT09M RUFOX1ZBTFVFKX07aWYoaC5oYXNCb29sZWFuVmFsdWUraC5oYXNOdW1lcmljVmFsdWUraC5oYXNP dmVybG9hZGVkQm9vbGVhblZhbHVlPD0xP3ZvaWQgMDpvKCI1MCIscCksdS5oYXNPd25Qcm9wZXJ0 eShwKSl7dmFyIHY9dVtwXTtoLmF0dHJpYnV0ZU5hbWU9dn1hLmhhc093blByb3BlcnR5KHApJiYo aC5hdHRyaWJ1dGVOYW1lc3BhY2U9YVtwXSksbC5oYXNPd25Qcm9wZXJ0eShwKSYmKGgucHJvcGVy dHlOYW1lPWxbcF0pLGMuaGFzT3duUHJvcGVydHkocCkmJihoLm11dGF0aW9uTWV0aG9kPWNbcF0p LHMucHJvcGVydGllc1twXT1ofX19KSxhPSI6QS1aX2EtelxcdTAwQzAtXFx1MDBENlxcdTAwRDgt XFx1MDBGNlxcdTAwRjgtXFx1MDJGRlxcdTAzNzAtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIw MEMtXFx1MjAwRFxcdTIwNzAtXFx1MjE4RlxcdTJDMDAtXFx1MkZFRlxcdTMwMDEtXFx1RDdGRlxc dUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZGRCIscz17SURfQVRUUklCVVRFX05BTUU6ImRhdGEt cmVhY3RpZCIsUk9PVF9BVFRSSUJVVEVfTkFNRToiZGF0YS1yZWFjdHJvb3QiLEFUVFJJQlVURV9O QU1FX1NUQVJUX0NIQVI6YSxBVFRSSUJVVEVfTkFNRV9DSEFSOmErIlxcLS4wLTlcXHUwMEI3XFx1 MDMwMC1cXHUwMzZGXFx1MjAzRi1cXHUyMDQwIixwcm9wZXJ0aWVzOnt9LGdldFBvc3NpYmxlU3Rh bmRhcmROYW1lOm51bGwsX2lzQ3VzdG9tQXR0cmlidXRlRnVuY3Rpb25zOltdLGlzQ3VzdG9tQXR0 cmlidXRlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8cy5faXNDdXN0b21BdHRyaWJ1dGVGdW5j dGlvbnMubGVuZ3RoO3QrKyl7dmFyIG49cy5faXNDdXN0b21BdHRyaWJ1dGVGdW5jdGlvbnNbdF07 aWYobihlKSlyZXR1cm4hMH1yZXR1cm4hMX0saW5qZWN0aW9uOml9O3QuZXhwb3J0cz1zfSx7MTEx OjExMSwxMzQ6MTM0fV0sMTI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24g cihlKXtyZXR1cm4hIWwuaGFzT3duUHJvcGVydHkoZSl8fCF1Lmhhc093blByb3BlcnR5KGUpJiYo cy50ZXN0KGUpPyhsW2VdPSEwLCEwKToodVtlXT0hMCwhMSkpfWZ1bmN0aW9uIG8oZSx0KXtyZXR1 cm4gbnVsbD09dHx8ZS5oYXNCb29sZWFuVmFsdWUmJiF0fHxlLmhhc051bWVyaWNWYWx1ZSYmaXNO YU4odCl8fGUuaGFzUG9zaXRpdmVOdW1lcmljVmFsdWUmJnQ8MXx8ZS5oYXNPdmVybG9hZGVkQm9v bGVhblZhbHVlJiZ0PT09ITF9dmFyIGk9ZSgxMSksYT0oZSgzMiksZSg1NyksZSgxMTApKSxzPShl KDEzOSksbmV3IFJlZ0V4cCgiXlsiK2kuQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUisiXVsiK2ku QVRUUklCVVRFX05BTUVfQ0hBUisiXSokIikpLHU9e30sbD17fSxjPXtjcmVhdGVNYXJrdXBGb3JJ RDpmdW5jdGlvbihlKXtyZXR1cm4gaS5JRF9BVFRSSUJVVEVfTkFNRSsiPSIrYShlKX0sc2V0QXR0 cmlidXRlRm9ySUQ6ZnVuY3Rpb24oZSx0KXtlLnNldEF0dHJpYnV0ZShpLklEX0FUVFJJQlVURV9O QU1FLHQpfSxjcmVhdGVNYXJrdXBGb3JSb290OmZ1bmN0aW9uKCl7cmV0dXJuIGkuUk9PVF9BVFRS SUJVVEVfTkFNRSsnPSIiJ30sc2V0QXR0cmlidXRlRm9yUm9vdDpmdW5jdGlvbihlKXtlLnNldEF0 dHJpYnV0ZShpLlJPT1RfQVRUUklCVVRFX05BTUUsIiIpfSxjcmVhdGVNYXJrdXBGb3JQcm9wZXJ0 eTpmdW5jdGlvbihlLHQpe3ZhciBuPWkucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShlKT9pLnBy b3BlcnRpZXNbZV06bnVsbDtpZihuKXtpZihvKG4sdCkpcmV0dXJuIiI7dmFyIHI9bi5hdHRyaWJ1 dGVOYW1lO3JldHVybiBuLmhhc0Jvb2xlYW5WYWx1ZXx8bi5oYXNPdmVybG9hZGVkQm9vbGVhblZh bHVlJiZ0PT09ITA/cisnPSIiJzpyKyI9IithKHQpfXJldHVybiBpLmlzQ3VzdG9tQXR0cmlidXRl KGUpP251bGw9PXQ/IiI6ZSsiPSIrYSh0KTpudWxsfSxjcmVhdGVNYXJrdXBGb3JDdXN0b21BdHRy aWJ1dGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcihlKSYmbnVsbCE9dD9lKyI9IithKHQpOiIifSxz ZXRWYWx1ZUZvclByb3BlcnR5OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1pLnByb3BlcnRpZXMuaGFz T3duUHJvcGVydHkodCk/aS5wcm9wZXJ0aWVzW3RdOm51bGw7aWYocil7dmFyIGE9ci5tdXRhdGlv bk1ldGhvZDtpZihhKWEoZSxuKTtlbHNle2lmKG8ocixuKSlyZXR1cm4gdm9pZCB0aGlzLmRlbGV0 ZVZhbHVlRm9yUHJvcGVydHkoZSx0KTtpZihyLm11c3RVc2VQcm9wZXJ0eSllW3IucHJvcGVydHlO YW1lXT1uO2Vsc2V7dmFyIHM9ci5hdHRyaWJ1dGVOYW1lLHU9ci5hdHRyaWJ1dGVOYW1lc3BhY2U7 dT9lLnNldEF0dHJpYnV0ZU5TKHUscywiIituKTpyLmhhc0Jvb2xlYW5WYWx1ZXx8ci5oYXNPdmVy bG9hZGVkQm9vbGVhblZhbHVlJiZuPT09ITA/ZS5zZXRBdHRyaWJ1dGUocywiIik6ZS5zZXRBdHRy aWJ1dGUocywiIituKX19fWVsc2UgaWYoaS5pc0N1c3RvbUF0dHJpYnV0ZSh0KSlyZXR1cm4gdm9p ZCBjLnNldFZhbHVlRm9yQXR0cmlidXRlKGUsdCxuKX0sc2V0VmFsdWVGb3JBdHRyaWJ1dGU6ZnVu Y3Rpb24oZSx0LG4pe3IodCkmJihudWxsPT1uP2UucmVtb3ZlQXR0cmlidXRlKHQpOmUuc2V0QXR0 cmlidXRlKHQsIiIrbikpfSxkZWxldGVWYWx1ZUZvckF0dHJpYnV0ZTpmdW5jdGlvbihlLHQpe2Uu cmVtb3ZlQXR0cmlidXRlKHQpfSxkZWxldGVWYWx1ZUZvclByb3BlcnR5OmZ1bmN0aW9uKGUsdCl7 dmFyIG49aS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHQpP2kucHJvcGVydGllc1t0XTpudWxs O2lmKG4pe3ZhciByPW4ubXV0YXRpb25NZXRob2Q7aWYocilyKGUsdm9pZCAwKTtlbHNlIGlmKG4u bXVzdFVzZVByb3BlcnR5KXt2YXIgbz1uLnByb3BlcnR5TmFtZTtuLmhhc0Jvb2xlYW5WYWx1ZT9l W29dPSExOmVbb109IiJ9ZWxzZSBlLnJlbW92ZUF0dHJpYnV0ZShuLmF0dHJpYnV0ZU5hbWUpfWVs c2UgaS5pc0N1c3RvbUF0dHJpYnV0ZSh0KSYmZS5yZW1vdmVBdHRyaWJ1dGUodCl9fTt0LmV4cG9y dHM9Y30sezExOjExLDExMDoxMTAsMTM5OjEzOSwzMjozMiw1Nzo1N31dLDEzOltmdW5jdGlvbihl LHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTExKSxvPWUoOSksaT1lKDEyMCksYT1lKDEyNSks cz1lKDEyNiksdT0oZSgxMzQpLHtkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cDpmdW5j dGlvbihlLHQpe2lmKGkuY2FuVXNlRE9NP3ZvaWQgMDpyKCI1NiIpLHQ/dm9pZCAwOnIoIjU3Iiks IkhUTUwiPT09ZS5ub2RlTmFtZT9yKCI1OCIpOnZvaWQgMCwic3RyaW5nIj09dHlwZW9mIHQpe3Zh ciBuPWEodCxzKVswXTtlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG4sZSl9ZWxzZSBvLnJlcGxh Y2VDaGlsZFdpdGhUcmVlKGUsdCl9fSk7dC5leHBvcnRzPXV9LHsxMTE6MTExLDEyMDoxMjAsMTI1 OjEyNSwxMjY6MTI2LDEzNDoxMzQsOTo5fV0sMTQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmlj dCI7dmFyIHI9WyJSZXNwb25kZXJFdmVudFBsdWdpbiIsIlNpbXBsZUV2ZW50UGx1Z2luIiwiVGFw RXZlbnRQbHVnaW4iLCJFbnRlckxlYXZlRXZlbnRQbHVnaW4iLCJDaGFuZ2VFdmVudFBsdWdpbiIs IlNlbGVjdEV2ZW50UGx1Z2luIiwiQmVmb3JlSW5wdXRFdmVudFBsdWdpbiJdO3QuZXhwb3J0cz1y fSx7fV0sMTU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxOSksbz1lKDMy KSxpPWUoODQpLGE9e21vdXNlRW50ZXI6e3JlZ2lzdHJhdGlvbk5hbWU6Im9uTW91c2VFbnRlciIs ZGVwZW5kZW5jaWVzOlsidG9wTW91c2VPdXQiLCJ0b3BNb3VzZU92ZXIiXX0sbW91c2VMZWF2ZTp7 cmVnaXN0cmF0aW9uTmFtZToib25Nb3VzZUxlYXZlIixkZXBlbmRlbmNpZXM6WyJ0b3BNb3VzZU91 dCIsInRvcE1vdXNlT3ZlciJdfX0scz17ZXZlbnRUeXBlczphLGV4dHJhY3RFdmVudHM6ZnVuY3Rp b24oZSx0LG4scyl7aWYoInRvcE1vdXNlT3ZlciI9PT1lJiYobi5yZWxhdGVkVGFyZ2V0fHxuLmZy b21FbGVtZW50KSlyZXR1cm4gbnVsbDtpZigidG9wTW91c2VPdXQiIT09ZSYmInRvcE1vdXNlT3Zl ciIhPT1lKXJldHVybiBudWxsO3ZhciB1O2lmKHMud2luZG93PT09cyl1PXM7ZWxzZXt2YXIgbD1z Lm93bmVyRG9jdW1lbnQ7dT1sP2wuZGVmYXVsdFZpZXd8fGwucGFyZW50V2luZG93OndpbmRvd312 YXIgYyxwO2lmKCJ0b3BNb3VzZU91dCI9PT1lKXtjPXQ7dmFyIGQ9bi5yZWxhdGVkVGFyZ2V0fHxu LnRvRWxlbWVudDtwPWQ/by5nZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShkKTpudWxsfWVsc2Ug Yz1udWxsLHA9dDtpZihjPT09cClyZXR1cm4gbnVsbDt2YXIgZj1udWxsPT1jP3U6by5nZXROb2Rl RnJvbUluc3RhbmNlKGMpLGg9bnVsbD09cD91Om8uZ2V0Tm9kZUZyb21JbnN0YW5jZShwKSx2PWku Z2V0UG9vbGVkKGEubW91c2VMZWF2ZSxjLG4scyk7di50eXBlPSJtb3VzZWxlYXZlIix2LnRhcmdl dD1mLHYucmVsYXRlZFRhcmdldD1oO3ZhciBtPWkuZ2V0UG9vbGVkKGEubW91c2VFbnRlcixwLG4s cyk7cmV0dXJuIG0udHlwZT0ibW91c2VlbnRlciIsbS50YXJnZXQ9aCxtLnJlbGF0ZWRUYXJnZXQ9 ZixyLmFjY3VtdWxhdGVFbnRlckxlYXZlRGlzcGF0Y2hlcyh2LG0sYyxwKSxbdixtXX19O3QuZXhw b3J0cz1zfSx7MTk6MTksMzI6MzIsODQ6ODR9XSwxNjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3Ry aWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiJidXR0b24iPT09ZXx8ImlucHV0Ij09PWV8fCJzZWxl Y3QiPT09ZXx8InRleHRhcmVhIj09PWV9ZnVuY3Rpb24gbyhlLHQsbil7c3dpdGNoKGUpe2Nhc2Ui b25DbGljayI6Y2FzZSJvbkNsaWNrQ2FwdHVyZSI6Y2FzZSJvbkRvdWJsZUNsaWNrIjpjYXNlIm9u RG91YmxlQ2xpY2tDYXB0dXJlIjpjYXNlIm9uTW91c2VEb3duIjpjYXNlIm9uTW91c2VEb3duQ2Fw dHVyZSI6Y2FzZSJvbk1vdXNlTW92ZSI6Y2FzZSJvbk1vdXNlTW92ZUNhcHR1cmUiOmNhc2Uib25N b3VzZVVwIjpjYXNlIm9uTW91c2VVcENhcHR1cmUiOnJldHVybiEoIW4uZGlzYWJsZWR8fCFyKHQp KTtkZWZhdWx0OnJldHVybiExfX12YXIgaT1lKDExMSksYT1lKDE3KSxzPWUoMTgpLHU9ZSg0OSks bD1lKDkxKSxjPWUoOTcpLHA9KGUoMTM0KSx7fSksZD1udWxsLGY9ZnVuY3Rpb24oZSx0KXtlJiYo cy5leGVjdXRlRGlzcGF0Y2hlc0luT3JkZXIoZSx0KSxlLmlzUGVyc2lzdGVudCgpfHxlLmNvbnN0 cnVjdG9yLnJlbGVhc2UoZSkpfSxoPWZ1bmN0aW9uKGUpe3JldHVybiBmKGUsITApfSx2PWZ1bmN0 aW9uKGUpe3JldHVybiBmKGUsITEpfSxtPWZ1bmN0aW9uKGUpe3JldHVybiIuIitlLl9yb290Tm9k ZUlEfSxnPXtpbmplY3Rpb246e2luamVjdEV2ZW50UGx1Z2luT3JkZXI6YS5pbmplY3RFdmVudFBs dWdpbk9yZGVyLGluamVjdEV2ZW50UGx1Z2luc0J5TmFtZTphLmluamVjdEV2ZW50UGx1Z2luc0J5 TmFtZX0scHV0TGlzdGVuZXI6ZnVuY3Rpb24oZSx0LG4peyJmdW5jdGlvbiIhPXR5cGVvZiBuP2ko Ijk0Iix0LHR5cGVvZiBuKTp2b2lkIDA7dmFyIHI9bShlKSxvPXBbdF18fChwW3RdPXt9KTtvW3Jd PW47dmFyIHM9YS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1t0XTtzJiZzLmRpZFB1dExpc3RlbmVy JiZzLmRpZFB1dExpc3RlbmVyKGUsdCxuKX0sZ2V0TGlzdGVuZXI6ZnVuY3Rpb24oZSx0KXt2YXIg bj1wW3RdO2lmKG8odCxlLl9jdXJyZW50RWxlbWVudC50eXBlLGUuX2N1cnJlbnRFbGVtZW50LnBy b3BzKSlyZXR1cm4gbnVsbDt2YXIgcj1tKGUpO3JldHVybiBuJiZuW3JdfSxkZWxldGVMaXN0ZW5l cjpmdW5jdGlvbihlLHQpe3ZhciBuPWEucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbdF07biYmbi53 aWxsRGVsZXRlTGlzdGVuZXImJm4ud2lsbERlbGV0ZUxpc3RlbmVyKGUsdCk7dmFyIHI9cFt0XTtp ZihyKXt2YXIgbz1tKGUpO2RlbGV0ZSByW29dfX0sZGVsZXRlQWxsTGlzdGVuZXJzOmZ1bmN0aW9u KGUpe3ZhciB0PW0oZSk7Zm9yKHZhciBuIGluIHApaWYocC5oYXNPd25Qcm9wZXJ0eShuKSYmcFtu XVt0XSl7dmFyIHI9YS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tuXTtyJiZyLndpbGxEZWxldGVM aXN0ZW5lciYmci53aWxsRGVsZXRlTGlzdGVuZXIoZSxuKSxkZWxldGUgcFtuXVt0XX19LGV4dHJh Y3RFdmVudHM6ZnVuY3Rpb24oZSx0LG4scil7Zm9yKHZhciBvLGk9YS5wbHVnaW5zLHM9MDtzPGku bGVuZ3RoO3MrKyl7dmFyIHU9aVtzXTtpZih1KXt2YXIgYz11LmV4dHJhY3RFdmVudHMoZSx0LG4s cik7YyYmKG89bChvLGMpKX19cmV0dXJuIG99LGVucXVldWVFdmVudHM6ZnVuY3Rpb24oZSl7ZSYm KGQ9bChkLGUpKX0scHJvY2Vzc0V2ZW50UXVldWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZDtkPW51bGws ZT9jKHQsaCk6Yyh0LHYpLGQ/aSgiOTUiKTp2b2lkIDAsdS5yZXRocm93Q2F1Z2h0RXJyb3IoKX0s X19wdXJnZTpmdW5jdGlvbigpe3A9e319LF9fZ2V0TGlzdGVuZXJCYW5rOmZ1bmN0aW9uKCl7cmV0 dXJuIHB9fTt0LmV4cG9ydHM9Z30sezExMToxMTEsMTM0OjEzNCwxNzoxNywxODoxOCw0OTo0OSw5 MTo5MSw5Nzo5N31dLDE3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIo KXtpZihzKWZvcih2YXIgZSBpbiB1KXt2YXIgdD11W2VdLG49cy5pbmRleE9mKGUpO2lmKG4+LTE/ dm9pZCAwOmEoIjk2IixlKSwhbC5wbHVnaW5zW25dKXt0LmV4dHJhY3RFdmVudHM/dm9pZCAwOmEo Ijk3IixlKSxsLnBsdWdpbnNbbl09dDt2YXIgcj10LmV2ZW50VHlwZXM7Zm9yKHZhciBpIGluIHIp byhyW2ldLHQsaSk/dm9pZCAwOmEoIjk4IixpLGUpfX19ZnVuY3Rpb24gbyhlLHQsbil7bC5ldmVu dE5hbWVEaXNwYXRjaENvbmZpZ3MuaGFzT3duUHJvcGVydHkobik/YSgiOTkiLG4pOnZvaWQgMCxs LmV2ZW50TmFtZURpc3BhdGNoQ29uZmlnc1tuXT1lO3ZhciByPWUucGhhc2VkUmVnaXN0cmF0aW9u TmFtZXM7aWYocil7Zm9yKHZhciBvIGluIHIpaWYoci5oYXNPd25Qcm9wZXJ0eShvKSl7dmFyIHM9 cltvXTtpKHMsdCxuKX1yZXR1cm4hMH1yZXR1cm4hIWUucmVnaXN0cmF0aW9uTmFtZSYmKGkoZS5y ZWdpc3RyYXRpb25OYW1lLHQsbiksITApfWZ1bmN0aW9uIGkoZSx0LG4pe2wucmVnaXN0cmF0aW9u TmFtZU1vZHVsZXNbZV0/YSgiMTAwIixlKTp2b2lkIDAsbC5yZWdpc3RyYXRpb25OYW1lTW9kdWxl c1tlXT10LGwucmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llc1tlXT10LmV2ZW50VHlwZXNbbl0u ZGVwZW5kZW5jaWVzfXZhciBhPWUoMTExKSxzPShlKDEzNCksbnVsbCksdT17fSxsPXtwbHVnaW5z OltdLGV2ZW50TmFtZURpc3BhdGNoQ29uZmlnczp7fSxyZWdpc3RyYXRpb25OYW1lTW9kdWxlczp7 fSxyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzOnt9LHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFt ZXM6bnVsbCxpbmplY3RFdmVudFBsdWdpbk9yZGVyOmZ1bmN0aW9uKGUpe3M/YSgiMTAxIik6dm9p ZCAwLHM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZSkscigpfSxpbmplY3RFdmVudFBsdWdp bnNCeU5hbWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ITE7Zm9yKHZhciBuIGluIGUpaWYoZS5oYXNPd25Q cm9wZXJ0eShuKSl7dmFyIG89ZVtuXTt1Lmhhc093blByb3BlcnR5KG4pJiZ1W25dPT09b3x8KHVb bl0/YSgiMTAyIixuKTp2b2lkIDAsdVtuXT1vLHQ9ITApfXQmJnIoKX0sZ2V0UGx1Z2luTW9kdWxl Rm9yRXZlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kaXNwYXRjaENvbmZpZztpZih0LnJlZ2lzdHJh dGlvbk5hbWUpcmV0dXJuIGwucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbdC5yZWdpc3RyYXRpb25O YW1lXXx8bnVsbDtpZih2b2lkIDAhPT10LnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzKXt2YXIgbj10 LnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzO2Zvcih2YXIgciBpbiBuKWlmKG4uaGFzT3duUHJvcGVy dHkocikpe3ZhciBvPWwucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbbltyXV07aWYobylyZXR1cm4g b319cmV0dXJuIG51bGx9LF9yZXNldEV2ZW50UGx1Z2luczpmdW5jdGlvbigpe3M9bnVsbDtmb3Io dmFyIGUgaW4gdSl1Lmhhc093blByb3BlcnR5KGUpJiZkZWxldGUgdVtlXTtsLnBsdWdpbnMubGVu Z3RoPTA7dmFyIHQ9bC5ldmVudE5hbWVEaXNwYXRjaENvbmZpZ3M7Zm9yKHZhciBuIGluIHQpdC5o YXNPd25Qcm9wZXJ0eShuKSYmZGVsZXRlIHRbbl07dmFyIHI9bC5yZWdpc3RyYXRpb25OYW1lTW9k dWxlcztmb3IodmFyIG8gaW4gcilyLmhhc093blByb3BlcnR5KG8pJiZkZWxldGUgcltvXX19O3Qu ZXhwb3J0cz1sfSx7MTExOjExMSwxMzQ6MTM0fV0sMTg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0 cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4idG9wTW91c2VVcCI9PT1lfHwidG9wVG91Y2hFbmQi PT09ZXx8InRvcFRvdWNoQ2FuY2VsIj09PWV9ZnVuY3Rpb24gbyhlKXtyZXR1cm4idG9wTW91c2VN b3ZlIj09PWV8fCJ0b3BUb3VjaE1vdmUiPT09ZX1mdW5jdGlvbiBpKGUpe3JldHVybiJ0b3BNb3Vz ZURvd24iPT09ZXx8InRvcFRvdWNoU3RhcnQiPT09ZX1mdW5jdGlvbiBhKGUsdCxuLHIpe3ZhciBv PWUudHlwZXx8InVua25vd24tZXZlbnQiO2UuY3VycmVudFRhcmdldD1nLmdldE5vZGVGcm9tSW5z dGFuY2UociksdD92Lmludm9rZUd1YXJkZWRDYWxsYmFja1dpdGhDYXRjaChvLG4sZSk6di5pbnZv a2VHdWFyZGVkQ2FsbGJhY2sobyxuLGUpLGUuY3VycmVudFRhcmdldD1udWxsfWZ1bmN0aW9uIHMo ZSx0KXt2YXIgbj1lLl9kaXNwYXRjaExpc3RlbmVycyxyPWUuX2Rpc3BhdGNoSW5zdGFuY2VzO2lm KEFycmF5LmlzQXJyYXkobikpZm9yKHZhciBvPTA7bzxuLmxlbmd0aCYmIWUuaXNQcm9wYWdhdGlv blN0b3BwZWQoKTtvKyspYShlLHQsbltvXSxyW29dKTtlbHNlIG4mJmEoZSx0LG4scik7ZS5fZGlz cGF0Y2hMaXN0ZW5lcnM9bnVsbCxlLl9kaXNwYXRjaEluc3RhbmNlcz1udWxsfWZ1bmN0aW9uIHUo ZSl7dmFyIHQ9ZS5fZGlzcGF0Y2hMaXN0ZW5lcnMsbj1lLl9kaXNwYXRjaEluc3RhbmNlcztpZihB cnJheS5pc0FycmF5KHQpKXtmb3IodmFyIHI9MDtyPHQubGVuZ3RoJiYhZS5pc1Byb3BhZ2F0aW9u U3RvcHBlZCgpO3IrKylpZih0W3JdKGUsbltyXSkpcmV0dXJuIG5bcl19ZWxzZSBpZih0JiZ0KGUs bikpcmV0dXJuIG47cmV0dXJuIG51bGx9ZnVuY3Rpb24gbChlKXt2YXIgdD11KGUpO3JldHVybiBl Ll9kaXNwYXRjaEluc3RhbmNlcz1udWxsLGUuX2Rpc3BhdGNoTGlzdGVuZXJzPW51bGwsdH1mdW5j dGlvbiBjKGUpe3ZhciB0PWUuX2Rpc3BhdGNoTGlzdGVuZXJzLG49ZS5fZGlzcGF0Y2hJbnN0YW5j ZXM7QXJyYXkuaXNBcnJheSh0KT9oKCIxMDMiKTp2b2lkIDAsZS5jdXJyZW50VGFyZ2V0PXQ/Zy5n ZXROb2RlRnJvbUluc3RhbmNlKG4pOm51bGw7dmFyIHI9dD90KGUpOm51bGw7cmV0dXJuIGUuY3Vy cmVudFRhcmdldD1udWxsLGUuX2Rpc3BhdGNoTGlzdGVuZXJzPW51bGwsZS5fZGlzcGF0Y2hJbnN0 YW5jZXM9bnVsbCxyfWZ1bmN0aW9uIHAoZSl7cmV0dXJuISFlLl9kaXNwYXRjaExpc3RlbmVyc312 YXIgZCxmLGg9ZSgxMTEpLHY9ZSg0OSksbT0oZSgxMzQpLGUoMTM5KSx7aW5qZWN0Q29tcG9uZW50 VHJlZTpmdW5jdGlvbihlKXtkPWV9LGluamVjdFRyZWVUcmF2ZXJzYWw6ZnVuY3Rpb24oZSl7Zj1l fX0pLGc9e2lzRW5kaXNoOnIsaXNNb3ZlaXNoOm8saXNTdGFydGlzaDppLGV4ZWN1dGVEaXJlY3RE aXNwYXRjaDpjLGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlcjpzLGV4ZWN1dGVEaXNwYXRjaGVzSW5P cmRlclN0b3BBdFRydWU6bCxoYXNEaXNwYXRjaGVzOnAsZ2V0SW5zdGFuY2VGcm9tTm9kZTpmdW5j dGlvbihlKXtyZXR1cm4gZC5nZXRJbnN0YW5jZUZyb21Ob2RlKGUpfSxnZXROb2RlRnJvbUluc3Rh bmNlOmZ1bmN0aW9uKGUpe3JldHVybiBkLmdldE5vZGVGcm9tSW5zdGFuY2UoZSl9LGlzQW5jZXN0 b3I6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZi5pc0FuY2VzdG9yKGUsdCl9LGdldExvd2VzdENvbW1v bkFuY2VzdG9yOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGYuZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3Io ZSx0KX0sZ2V0UGFyZW50SW5zdGFuY2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGYuZ2V0UGFyZW50SW5z dGFuY2UoZSl9LHRyYXZlcnNlVHdvUGhhc2U6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBmLnRyYXZl cnNlVHdvUGhhc2UoZSx0LG4pfSx0cmF2ZXJzZUVudGVyTGVhdmU6ZnVuY3Rpb24oZSx0LG4scixv KXtyZXR1cm4gZi50cmF2ZXJzZUVudGVyTGVhdmUoZSx0LG4scixvKX0saW5qZWN0aW9uOm19O3Qu ZXhwb3J0cz1nfSx7MTExOjExMSwxMzQ6MTM0LDEzOToxMzksNDk6NDl9XSwxOTpbZnVuY3Rpb24o ZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuKXt2YXIgcj10LmRpc3BhdGNoQ29u ZmlnLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzW25dO3JldHVybiBnKGUscil9ZnVuY3Rpb24gbyhl LHQsbil7dmFyIG89cihlLG4sdCk7byYmKG4uX2Rpc3BhdGNoTGlzdGVuZXJzPXYobi5fZGlzcGF0 Y2hMaXN0ZW5lcnMsbyksbi5fZGlzcGF0Y2hJbnN0YW5jZXM9dihuLl9kaXNwYXRjaEluc3RhbmNl cyxlKSl9ZnVuY3Rpb24gaShlKXtlJiZlLmRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJhdGlv bk5hbWVzJiZoLnRyYXZlcnNlVHdvUGhhc2UoZS5fdGFyZ2V0SW5zdCxvLGUpfWZ1bmN0aW9uIGEo ZSl7aWYoZSYmZS5kaXNwYXRjaENvbmZpZy5waGFzZWRSZWdpc3RyYXRpb25OYW1lcyl7dmFyIHQ9 ZS5fdGFyZ2V0SW5zdCxuPXQ/aC5nZXRQYXJlbnRJbnN0YW5jZSh0KTpudWxsO2gudHJhdmVyc2VU d29QaGFzZShuLG8sZSl9fWZ1bmN0aW9uIHMoZSx0LG4pe2lmKG4mJm4uZGlzcGF0Y2hDb25maWcu cmVnaXN0cmF0aW9uTmFtZSl7dmFyIHI9bi5kaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1l LG89ZyhlLHIpO28mJihuLl9kaXNwYXRjaExpc3RlbmVycz12KG4uX2Rpc3BhdGNoTGlzdGVuZXJz LG8pLG4uX2Rpc3BhdGNoSW5zdGFuY2VzPXYobi5fZGlzcGF0Y2hJbnN0YW5jZXMsZSkpfX1mdW5j dGlvbiB1KGUpe2UmJmUuZGlzcGF0Y2hDb25maWcucmVnaXN0cmF0aW9uTmFtZSYmcyhlLl90YXJn ZXRJbnN0LG51bGwsZSl9ZnVuY3Rpb24gbChlKXttKGUsaSl9ZnVuY3Rpb24gYyhlKXttKGUsYSl9 ZnVuY3Rpb24gcChlLHQsbixyKXtoLnRyYXZlcnNlRW50ZXJMZWF2ZShuLHIscyxlLHQpfWZ1bmN0 aW9uIGQoZSl7bShlLHUpfXZhciBmPWUoMTYpLGg9ZSgxOCksdj1lKDkxKSxtPWUoOTcpLGc9KGUo MTM5KSxmLmdldExpc3RlbmVyKSx5PXthY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzOmwsYWNj dW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1NraXBUYXJnZXQ6YyxhY2N1bXVsYXRlRGlyZWN0RGlz cGF0Y2hlczpkLGFjY3VtdWxhdGVFbnRlckxlYXZlRGlzcGF0Y2hlczpwfTt0LmV4cG9ydHM9eX0s ezEzOToxMzksMTY6MTYsMTg6MTgsOTE6OTEsOTc6OTd9XSwyMDpbZnVuY3Rpb24oZSx0LG4peyJ1 c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3RoaXMuX3Jvb3Q9ZSx0aGlzLl9zdGFydFRleHQ9dGhp cy5nZXRUZXh0KCksdGhpcy5fZmFsbGJhY2tUZXh0PW51bGx9dmFyIG89ZSgxNDApLGk9ZSgyNCks YT1lKDEwNSk7byhyLnByb3RvdHlwZSx7ZGVzdHJ1Y3RvcjpmdW5jdGlvbigpe3RoaXMuX3Jvb3Q9 bnVsbCx0aGlzLl9zdGFydFRleHQ9bnVsbCx0aGlzLl9mYWxsYmFja1RleHQ9bnVsbH0sZ2V0VGV4 dDpmdW5jdGlvbigpe3JldHVybiJ2YWx1ZSJpbiB0aGlzLl9yb290P3RoaXMuX3Jvb3QudmFsdWU6 dGhpcy5fcm9vdFthKCldfSxnZXREYXRhOmZ1bmN0aW9uKCl7aWYodGhpcy5fZmFsbGJhY2tUZXh0 KXJldHVybiB0aGlzLl9mYWxsYmFja1RleHQ7dmFyIGUsdCxuPXRoaXMuX3N0YXJ0VGV4dCxyPW4u bGVuZ3RoLG89dGhpcy5nZXRUZXh0KCksaT1vLmxlbmd0aDtmb3IoZT0wO2U8ciYmbltlXT09PW9b ZV07ZSsrKTt2YXIgYT1yLWU7Zm9yKHQ9MTt0PD1hJiZuW3ItdF09PT1vW2ktdF07dCsrKTt2YXIg cz10PjE/MS10OnZvaWQgMDtyZXR1cm4gdGhpcy5fZmFsbGJhY2tUZXh0PW8uc2xpY2UoZSxzKSx0 aGlzLl9mYWxsYmFja1RleHR9fSksaS5hZGRQb29saW5nVG8ociksdC5leHBvcnRzPXJ9LHsxMDU6 MTA1LDE0MDoxNDAsMjQ6MjR9XSwyMTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIg cj1lKDExKSxvPXIuaW5qZWN0aW9uLk1VU1RfVVNFX1BST1BFUlRZLGk9ci5pbmplY3Rpb24uSEFT X0JPT0xFQU5fVkFMVUUsYT1yLmluamVjdGlvbi5IQVNfTlVNRVJJQ19WQUxVRSxzPXIuaW5qZWN0 aW9uLkhBU19QT1NJVElWRV9OVU1FUklDX1ZBTFVFLHU9ci5pbmplY3Rpb24uSEFTX09WRVJMT0FE RURfQk9PTEVBTl9WQUxVRSxsPXtpc0N1c3RvbUF0dHJpYnV0ZTpSZWdFeHAucHJvdG90eXBlLnRl c3QuYmluZChuZXcgUmVnRXhwKCJeKGRhdGF8YXJpYSktWyIrci5BVFRSSUJVVEVfTkFNRV9DSEFS KyJdKiQiKSksUHJvcGVydGllczp7YWNjZXB0OjAsYWNjZXB0Q2hhcnNldDowLGFjY2Vzc0tleTow LGFjdGlvbjowLGFsbG93RnVsbFNjcmVlbjppLGFsbG93VHJhbnNwYXJlbmN5OjAsYWx0OjAsYXM6 MCxhc3luYzppLGF1dG9Db21wbGV0ZTowLGF1dG9QbGF5OmksY2FwdHVyZTppLGNlbGxQYWRkaW5n OjAsY2VsbFNwYWNpbmc6MCxjaGFyU2V0OjAsY2hhbGxlbmdlOjAsY2hlY2tlZDpvfGksY2l0ZTow LGNsYXNzSUQ6MCxjbGFzc05hbWU6MCxjb2xzOnMsY29sU3BhbjowLGNvbnRlbnQ6MCxjb250ZW50 RWRpdGFibGU6MCxjb250ZXh0TWVudTowLGNvbnRyb2xzOmksY29vcmRzOjAsY3Jvc3NPcmlnaW46 MCxkYXRhOjAsZGF0ZVRpbWU6MCxkZWZhdWx0OmksZGVmZXI6aSxkaXI6MCxkaXNhYmxlZDppLGRv d25sb2FkOnUsZHJhZ2dhYmxlOjAsZW5jVHlwZTowLGZvcm06MCxmb3JtQWN0aW9uOjAsZm9ybUVu Y1R5cGU6MCxmb3JtTWV0aG9kOjAsZm9ybU5vVmFsaWRhdGU6aSxmb3JtVGFyZ2V0OjAsZnJhbWVC b3JkZXI6MCxoZWFkZXJzOjAsaGVpZ2h0OjAsaGlkZGVuOmksaGlnaDowLGhyZWY6MCxocmVmTGFu ZzowLGh0bWxGb3I6MCxodHRwRXF1aXY6MCxpY29uOjAsaWQ6MCxpbnB1dE1vZGU6MCxpbnRlZ3Jp dHk6MCxpczowLGtleVBhcmFtczowLGtleVR5cGU6MCxraW5kOjAsbGFiZWw6MCxsYW5nOjAsbGlz dDowLGxvb3A6aSxsb3c6MCxtYW5pZmVzdDowLG1hcmdpbkhlaWdodDowLG1hcmdpbldpZHRoOjAs bWF4OjAsbWF4TGVuZ3RoOjAsbWVkaWE6MCxtZWRpYUdyb3VwOjAsbWV0aG9kOjAsbWluOjAsbWlu TGVuZ3RoOjAsbXVsdGlwbGU6b3xpLG11dGVkOm98aSxuYW1lOjAsbm9uY2U6MCxub1ZhbGlkYXRl Omksb3BlbjppLG9wdGltdW06MCxwYXR0ZXJuOjAscGxhY2Vob2xkZXI6MCxwbGF5c0lubGluZTpp LHBvc3RlcjowLHByZWxvYWQ6MCxwcm9maWxlOjAscmFkaW9Hcm91cDowLHJlYWRPbmx5OmkscmVm ZXJyZXJQb2xpY3k6MCxyZWw6MCxyZXF1aXJlZDppLHJldmVyc2VkOmkscm9sZTowLHJvd3M6cyxy b3dTcGFuOmEsc2FuZGJveDowLHNjb3BlOjAsc2NvcGVkOmksc2Nyb2xsaW5nOjAsc2VhbWxlc3M6 aSxzZWxlY3RlZDpvfGksc2hhcGU6MCxzaXplOnMsc2l6ZXM6MCxzcGFuOnMsc3BlbGxDaGVjazow LHNyYzowLHNyY0RvYzowLHNyY0xhbmc6MCxzcmNTZXQ6MCxzdGFydDphLHN0ZXA6MCxzdHlsZTow LHN1bW1hcnk6MCx0YWJJbmRleDowLHRhcmdldDowLHRpdGxlOjAsdHlwZTowLHVzZU1hcDowLHZh bHVlOjAsd2lkdGg6MCx3bW9kZTowLHdyYXA6MCxhYm91dDowLGRhdGF0eXBlOjAsaW5saXN0OjAs cHJlZml4OjAscHJvcGVydHk6MCxyZXNvdXJjZTowLHR5cGVvZjowLHZvY2FiOjAsYXV0b0NhcGl0 YWxpemU6MCxhdXRvQ29ycmVjdDowLGF1dG9TYXZlOjAsY29sb3I6MCxpdGVtUHJvcDowLGl0ZW1T Y29wZTppLGl0ZW1UeXBlOjAsaXRlbUlEOjAsaXRlbVJlZjowLHJlc3VsdHM6MCxzZWN1cml0eTow LHVuc2VsZWN0YWJsZTowfSxET01BdHRyaWJ1dGVOYW1lczp7YWNjZXB0Q2hhcnNldDoiYWNjZXB0 LWNoYXJzZXQiLGNsYXNzTmFtZToiY2xhc3MiLGh0bWxGb3I6ImZvciIsaHR0cEVxdWl2OiJodHRw LWVxdWl2In0sRE9NUHJvcGVydHlOYW1lczp7fX07dC5leHBvcnRzPWx9LHsxMToxMX1dLDIyOltm dW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dmFyIHQ9L1s9Ol0vZyxu PXsiPSI6Ij0wIiwiOiI6Ij0yIn0scj0oIiIrZSkucmVwbGFjZSh0LGZ1bmN0aW9uKGUpe3JldHVy biBuW2VdfSk7cmV0dXJuIiQiK3J9ZnVuY3Rpb24gbyhlKXt2YXIgdD0vKD0wfD0yKS9nLG49eyI9 MCI6Ij0iLCI9MiI6IjoifSxyPSIuIj09PWVbMF0mJiIkIj09PWVbMV0/ZS5zdWJzdHJpbmcoMik6 ZS5zdWJzdHJpbmcoMSk7cmV0dXJuKCIiK3IpLnJlcGxhY2UodCxmdW5jdGlvbihlKXtyZXR1cm4g bltlXX0pfXZhciBpPXtlc2NhcGU6cix1bmVzY2FwZTpvfTt0LmV4cG9ydHM9aX0se31dLDIzOltm dW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7bnVsbCE9ZS5jaGVja2Vk TGluayYmbnVsbCE9ZS52YWx1ZUxpbms/cygiODciKTp2b2lkIDB9ZnVuY3Rpb24gbyhlKXtyKGUp LG51bGwhPWUudmFsdWV8fG51bGwhPWUub25DaGFuZ2U/cygiODgiKTp2b2lkIDB9ZnVuY3Rpb24g aShlKXtyKGUpLG51bGwhPWUuY2hlY2tlZHx8bnVsbCE9ZS5vbkNoYW5nZT9zKCI4OSIpOnZvaWQg MH1mdW5jdGlvbiBhKGUpe2lmKGUpe3ZhciB0PWUuZ2V0TmFtZSgpO2lmKHQpcmV0dXJuIiBDaGVj ayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgIit0KyJgLiJ9cmV0dXJuIiJ9dmFyIHM9ZSgxMTEpLHU9 ZSgxMTgpLGw9ZSg2MiksYz0oZSgxMzQpLGUoMTM5KSx7YnV0dG9uOiEwLGNoZWNrYm94OiEwLGlt YWdlOiEwLGhpZGRlbjohMCxyYWRpbzohMCxyZXNldDohMCxzdWJtaXQ6ITB9KSxwPXt2YWx1ZTpm dW5jdGlvbihlLHQsbil7cmV0dXJuIWVbdF18fGNbZS50eXBlXXx8ZS5vbkNoYW5nZXx8ZS5yZWFk T25seXx8ZS5kaXNhYmxlZD9udWxsOm5ldyBFcnJvcigiWW91IHByb3ZpZGVkIGEgYHZhbHVlYCBw cm9wIHRvIGEgZm9ybSBmaWVsZCB3aXRob3V0IGFuIGBvbkNoYW5nZWAgaGFuZGxlci4gVGhpcyB3 aWxsIHJlbmRlciBhIHJlYWQtb25seSBmaWVsZC4gSWYgdGhlIGZpZWxkIHNob3VsZCBiZSBtdXRh YmxlIHVzZSBgZGVmYXVsdFZhbHVlYC4gT3RoZXJ3aXNlLCBzZXQgZWl0aGVyIGBvbkNoYW5nZWAg b3IgYHJlYWRPbmx5YC4iKX0sY2hlY2tlZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIWVbdF18fGUu b25DaGFuZ2V8fGUucmVhZE9ubHl8fGUuZGlzYWJsZWQ/bnVsbDpuZXcgRXJyb3IoIllvdSBwcm92 aWRlZCBhIGBjaGVja2VkYCBwcm9wIHRvIGEgZm9ybSBmaWVsZCB3aXRob3V0IGFuIGBvbkNoYW5n ZWAgaGFuZGxlci4gVGhpcyB3aWxsIHJlbmRlciBhIHJlYWQtb25seSBmaWVsZC4gSWYgdGhlIGZp ZWxkIHNob3VsZCBiZSBtdXRhYmxlIHVzZSBgZGVmYXVsdENoZWNrZWRgLiBPdGhlcndpc2UsIHNl dCBlaXRoZXIgYG9uQ2hhbmdlYCBvciBgcmVhZE9ubHlgLiIpfSxvbkNoYW5nZTp1LlByb3BUeXBl cy5mdW5jfSxkPXt9LGY9e2NoZWNrUHJvcFR5cGVzOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHIg aW4gcCl7aWYocC5oYXNPd25Qcm9wZXJ0eShyKSl2YXIgbz1wW3JdKHQscixlLCJwcm9wIixudWxs LGwpO28gaW5zdGFuY2VvZiBFcnJvciYmIShvLm1lc3NhZ2UgaW4gZCkmJihkW28ubWVzc2FnZV09 ITAsYShuKSl9fSxnZXRWYWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gZS52YWx1ZUxpbms/KG8oZSks ZS52YWx1ZUxpbmsudmFsdWUpOmUudmFsdWV9LGdldENoZWNrZWQ6ZnVuY3Rpb24oZSl7cmV0dXJu IGUuY2hlY2tlZExpbms/KGkoZSksZS5jaGVja2VkTGluay52YWx1ZSk6ZS5jaGVja2VkfSxleGVj dXRlT25DaGFuZ2U6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS52YWx1ZUxpbms/KG8oZSksZS52YWx1 ZUxpbmsucmVxdWVzdENoYW5nZSh0LnRhcmdldC52YWx1ZSkpOmUuY2hlY2tlZExpbms/KGkoZSks ZS5jaGVja2VkTGluay5yZXF1ZXN0Q2hhbmdlKHQudGFyZ2V0LmNoZWNrZWQpKTplLm9uQ2hhbmdl P2Uub25DaGFuZ2UuY2FsbCh2b2lkIDAsdCk6dm9pZCAwfX07dC5leHBvcnRzPWZ9LHsxMTE6MTEx LDExODoxMTgsMTM0OjEzNCwxMzk6MTM5LDYyOjYyfV0sMjQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNl IHN0cmljdCI7dmFyIHI9ZSgxMTEpLG89KGUoMTM0KSxmdW5jdGlvbihlKXt2YXIgdD10aGlzO2lm KHQuaW5zdGFuY2VQb29sLmxlbmd0aCl7dmFyIG49dC5pbnN0YW5jZVBvb2wucG9wKCk7cmV0dXJu IHQuY2FsbChuLGUpLG59cmV0dXJuIG5ldyB0KGUpfSksaT1mdW5jdGlvbihlLHQpe3ZhciBuPXRo aXM7aWYobi5pbnN0YW5jZVBvb2wubGVuZ3RoKXt2YXIgcj1uLmluc3RhbmNlUG9vbC5wb3AoKTty ZXR1cm4gbi5jYWxsKHIsZSx0KSxyfXJldHVybiBuZXcgbihlLHQpfSxhPWZ1bmN0aW9uKGUsdCxu KXt2YXIgcj10aGlzO2lmKHIuaW5zdGFuY2VQb29sLmxlbmd0aCl7dmFyIG89ci5pbnN0YW5jZVBv b2wucG9wKCk7cmV0dXJuIHIuY2FsbChvLGUsdCxuKSxvfXJldHVybiBuZXcgcihlLHQsbil9LHM9 ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89dGhpcztpZihvLmluc3RhbmNlUG9vbC5sZW5ndGgpe3Zh ciBpPW8uaW5zdGFuY2VQb29sLnBvcCgpO3JldHVybiBvLmNhbGwoaSxlLHQsbixyKSxpfXJldHVy biBuZXcgbyhlLHQsbixyKX0sdT1mdW5jdGlvbihlKXt2YXIgdD10aGlzO2UgaW5zdGFuY2VvZiB0 P3ZvaWQgMDpyKCIyNSIpLGUuZGVzdHJ1Y3RvcigpLHQuaW5zdGFuY2VQb29sLmxlbmd0aDx0LnBv b2xTaXplJiZ0Lmluc3RhbmNlUG9vbC5wdXNoKGUpfSxsPTEwLGM9byxwPWZ1bmN0aW9uKGUsdCl7 dmFyIG49ZTtyZXR1cm4gbi5pbnN0YW5jZVBvb2w9W10sbi5nZXRQb29sZWQ9dHx8YyxuLnBvb2xT aXplfHwobi5wb29sU2l6ZT1sKSxuLnJlbGVhc2U9dSxufSxkPXthZGRQb29saW5nVG86cCxvbmVB cmd1bWVudFBvb2xlcjpvLHR3b0FyZ3VtZW50UG9vbGVyOmksdGhyZWVBcmd1bWVudFBvb2xlcjph LGZvdXJBcmd1bWVudFBvb2xlcjpzfTt0LmV4cG9ydHM9ZH0sezExMToxMTEsMTM0OjEzNH1dLDI1 OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIE9iamVj dC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHYpfHwoZVt2XT1mKysscFtlW3ZdXT17 fSkscFtlW3ZdXX12YXIgbyxpPWUoMTQwKSxhPWUoMTcpLHM9ZSg1MCksdT1lKDkwKSxsPWUoMTA2 KSxjPWUoMTA4KSxwPXt9LGQ9ITEsZj0wLGg9e3RvcEFib3J0OiJhYm9ydCIsdG9wQW5pbWF0aW9u RW5kOmwoImFuaW1hdGlvbmVuZCIpfHwiYW5pbWF0aW9uZW5kIix0b3BBbmltYXRpb25JdGVyYXRp b246bCgiYW5pbWF0aW9uaXRlcmF0aW9uIil8fCJhbmltYXRpb25pdGVyYXRpb24iLHRvcEFuaW1h dGlvblN0YXJ0OmwoImFuaW1hdGlvbnN0YXJ0Iil8fCJhbmltYXRpb25zdGFydCIsdG9wQmx1cjoi Ymx1ciIsdG9wQ2FuUGxheToiY2FucGxheSIsdG9wQ2FuUGxheVRocm91Z2g6ImNhbnBsYXl0aHJv dWdoIix0b3BDaGFuZ2U6ImNoYW5nZSIsdG9wQ2xpY2s6ImNsaWNrIix0b3BDb21wb3NpdGlvbkVu ZDoiY29tcG9zaXRpb25lbmQiLHRvcENvbXBvc2l0aW9uU3RhcnQ6ImNvbXBvc2l0aW9uc3RhcnQi LHRvcENvbXBvc2l0aW9uVXBkYXRlOiJjb21wb3NpdGlvbnVwZGF0ZSIsdG9wQ29udGV4dE1lbnU6 ImNvbnRleHRtZW51Iix0b3BDb3B5OiJjb3B5Iix0b3BDdXQ6ImN1dCIsdG9wRG91YmxlQ2xpY2s6 ImRibGNsaWNrIix0b3BEcmFnOiJkcmFnIix0b3BEcmFnRW5kOiJkcmFnZW5kIix0b3BEcmFnRW50 ZXI6ImRyYWdlbnRlciIsdG9wRHJhZ0V4aXQ6ImRyYWdleGl0Iix0b3BEcmFnTGVhdmU6ImRyYWds ZWF2ZSIsdG9wRHJhZ092ZXI6ImRyYWdvdmVyIix0b3BEcmFnU3RhcnQ6ImRyYWdzdGFydCIsdG9w RHJvcDoiZHJvcCIsdG9wRHVyYXRpb25DaGFuZ2U6ImR1cmF0aW9uY2hhbmdlIix0b3BFbXB0aWVk OiJlbXB0aWVkIix0b3BFbmNyeXB0ZWQ6ImVuY3J5cHRlZCIsdG9wRW5kZWQ6ImVuZGVkIix0b3BF cnJvcjoiZXJyb3IiLHRvcEZvY3VzOiJmb2N1cyIsdG9wSW5wdXQ6ImlucHV0Iix0b3BLZXlEb3du OiJrZXlkb3duIix0b3BLZXlQcmVzczoia2V5cHJlc3MiLHRvcEtleVVwOiJrZXl1cCIsdG9wTG9h ZGVkRGF0YToibG9hZGVkZGF0YSIsdG9wTG9hZGVkTWV0YWRhdGE6ImxvYWRlZG1ldGFkYXRhIix0 b3BMb2FkU3RhcnQ6ImxvYWRzdGFydCIsdG9wTW91c2VEb3duOiJtb3VzZWRvd24iLHRvcE1vdXNl TW92ZToibW91c2Vtb3ZlIix0b3BNb3VzZU91dDoibW91c2VvdXQiLHRvcE1vdXNlT3ZlcjoibW91 c2VvdmVyIix0b3BNb3VzZVVwOiJtb3VzZXVwIix0b3BQYXN0ZToicGFzdGUiLHRvcFBhdXNlOiJw YXVzZSIsCi10b3BQbGF5OiJwbGF5Iix0b3BQbGF5aW5nOiJwbGF5aW5nIix0b3BQcm9ncmVzczoi cHJvZ3Jlc3MiLHRvcFJhdGVDaGFuZ2U6InJhdGVjaGFuZ2UiLHRvcFNjcm9sbDoic2Nyb2xsIix0 b3BTZWVrZWQ6InNlZWtlZCIsdG9wU2Vla2luZzoic2Vla2luZyIsdG9wU2VsZWN0aW9uQ2hhbmdl OiJzZWxlY3Rpb25jaGFuZ2UiLHRvcFN0YWxsZWQ6InN0YWxsZWQiLHRvcFN1c3BlbmQ6InN1c3Bl bmQiLHRvcFRleHRJbnB1dDoidGV4dElucHV0Iix0b3BUaW1lVXBkYXRlOiJ0aW1ldXBkYXRlIix0 b3BUb3VjaENhbmNlbDoidG91Y2hjYW5jZWwiLHRvcFRvdWNoRW5kOiJ0b3VjaGVuZCIsdG9wVG91 Y2hNb3ZlOiJ0b3VjaG1vdmUiLHRvcFRvdWNoU3RhcnQ6InRvdWNoc3RhcnQiLHRvcFRyYW5zaXRp b25FbmQ6bCgidHJhbnNpdGlvbmVuZCIpfHwidHJhbnNpdGlvbmVuZCIsdG9wVm9sdW1lQ2hhbmdl OiJ2b2x1bWVjaGFuZ2UiLHRvcFdhaXRpbmc6IndhaXRpbmciLHRvcFdoZWVsOiJ3aGVlbCJ9LHY9 Il9yZWFjdExpc3RlbmVyc0lEIitTdHJpbmcoTWF0aC5yYW5kb20oKSkuc2xpY2UoMiksbT1pKHt9 LHMse1JlYWN0RXZlbnRMaXN0ZW5lcjpudWxsLGluamVjdGlvbjp7aW5qZWN0UmVhY3RFdmVudExp c3RlbmVyOmZ1bmN0aW9uKGUpe2Uuc2V0SGFuZGxlVG9wTGV2ZWwobS5oYW5kbGVUb3BMZXZlbCks bS5SZWFjdEV2ZW50TGlzdGVuZXI9ZX19LHNldEVuYWJsZWQ6ZnVuY3Rpb24oZSl7bS5SZWFjdEV2 ZW50TGlzdGVuZXImJm0uUmVhY3RFdmVudExpc3RlbmVyLnNldEVuYWJsZWQoZSl9LGlzRW5hYmxl ZDpmdW5jdGlvbigpe3JldHVybiEoIW0uUmVhY3RFdmVudExpc3RlbmVyfHwhbS5SZWFjdEV2ZW50 TGlzdGVuZXIuaXNFbmFibGVkKCkpfSxsaXN0ZW5UbzpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj10 LG89cihuKSxpPWEucmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llc1tlXSxzPTA7czxpLmxlbmd0 aDtzKyspe3ZhciB1PWlbc107by5oYXNPd25Qcm9wZXJ0eSh1KSYmb1t1XXx8KCJ0b3BXaGVlbCI9 PT11P2MoIndoZWVsIik/bS5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudCgidG9w V2hlZWwiLCJ3aGVlbCIsbik6YygibW91c2V3aGVlbCIpP20uUmVhY3RFdmVudExpc3RlbmVyLnRy YXBCdWJibGVkRXZlbnQoInRvcFdoZWVsIiwibW91c2V3aGVlbCIsbik6bS5SZWFjdEV2ZW50TGlz dGVuZXIudHJhcEJ1YmJsZWRFdmVudCgidG9wV2hlZWwiLCJET01Nb3VzZVNjcm9sbCIsbik6InRv cFNjcm9sbCI9PT11P2MoInNjcm9sbCIsITApP20uUmVhY3RFdmVudExpc3RlbmVyLnRyYXBDYXB0 dXJlZEV2ZW50KCJ0b3BTY3JvbGwiLCJzY3JvbGwiLG4pOm0uUmVhY3RFdmVudExpc3RlbmVyLnRy YXBCdWJibGVkRXZlbnQoInRvcFNjcm9sbCIsInNjcm9sbCIsbS5SZWFjdEV2ZW50TGlzdGVuZXIu V0lORE9XX0hBTkRMRSk6InRvcEZvY3VzIj09PXV8fCJ0b3BCbHVyIj09PXU/KGMoImZvY3VzIiwh MCk/KG0uUmVhY3RFdmVudExpc3RlbmVyLnRyYXBDYXB0dXJlZEV2ZW50KCJ0b3BGb2N1cyIsImZv Y3VzIixuKSxtLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQ2FwdHVyZWRFdmVudCgidG9wQmx1ciIs ImJsdXIiLG4pKTpjKCJmb2N1c2luIikmJihtLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxl ZEV2ZW50KCJ0b3BGb2N1cyIsImZvY3VzaW4iLG4pLG0uUmVhY3RFdmVudExpc3RlbmVyLnRyYXBC dWJibGVkRXZlbnQoInRvcEJsdXIiLCJmb2N1c291dCIsbikpLG8udG9wQmx1cj0hMCxvLnRvcEZv Y3VzPSEwKTpoLmhhc093blByb3BlcnR5KHUpJiZtLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnVi YmxlZEV2ZW50KHUsaFt1XSxuKSxvW3VdPSEwKX19LHRyYXBCdWJibGVkRXZlbnQ6ZnVuY3Rpb24o ZSx0LG4pe3JldHVybiBtLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KGUsdCxu KX0sdHJhcENhcHR1cmVkRXZlbnQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBtLlJlYWN0RXZlbnRM aXN0ZW5lci50cmFwQ2FwdHVyZWRFdmVudChlLHQsbil9LHN1cHBvcnRzRXZlbnRQYWdlWFk6ZnVu Y3Rpb24oKXtpZighZG9jdW1lbnQuY3JlYXRlRXZlbnQpcmV0dXJuITE7dmFyIGU9ZG9jdW1lbnQu Y3JlYXRlRXZlbnQoIk1vdXNlRXZlbnQiKTtyZXR1cm4gbnVsbCE9ZSYmInBhZ2VYImluIGV9LGVu c3VyZVNjcm9sbFZhbHVlTW9uaXRvcmluZzpmdW5jdGlvbigpe2lmKHZvaWQgMD09PW8mJihvPW0u c3VwcG9ydHNFdmVudFBhZ2VYWSgpKSwhbyYmIWQpe3ZhciBlPXUucmVmcmVzaFNjcm9sbFZhbHVl czttLlJlYWN0RXZlbnRMaXN0ZW5lci5tb25pdG9yU2Nyb2xsVmFsdWUoZSksZD0hMH19fSk7dC5l eHBvcnRzPW19LHsxMDY6MTA2LDEwODoxMDgsMTQwOjE0MCwxNzoxNyw1MDo1MCw5MDo5MH1dLDI2 OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUs dCxuLHIpe3ZhciBvPXZvaWQgMD09PWVbbl07bnVsbCE9dCYmbyYmKGVbbl09aSh0LCEwKSl9dmFy IG89ZSg2NCksaT1lKDEwNyksYT0oZSgyMiksZSgxMTQpKSxzPWUoMTE1KTtlKDEzOSk7InVuZGVm aW5lZCIhPXR5cGVvZiBuJiZuLmVudiwxO3ZhciB1PXtpbnN0YW50aWF0ZUNoaWxkcmVuOmZ1bmN0 aW9uKGUsdCxuLG8pe2lmKG51bGw9PWUpcmV0dXJuIG51bGw7dmFyIGk9e307cmV0dXJuIHMoZSxy LGkpLGl9LHVwZGF0ZUNoaWxkcmVuOmZ1bmN0aW9uKGUsdCxuLHIscyx1LGwsYyxwKXtpZih0fHxl KXt2YXIgZCxmO2ZvcihkIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShkKSl7Zj1lJiZlW2RdO3Zh ciBoPWYmJmYuX2N1cnJlbnRFbGVtZW50LHY9dFtkXTtpZihudWxsIT1mJiZhKGgsdikpby5yZWNl aXZlQ29tcG9uZW50KGYsdixzLGMpLHRbZF09ZjtlbHNle2YmJihyW2RdPW8uZ2V0SG9zdE5vZGUo Ziksby51bm1vdW50Q29tcG9uZW50KGYsITEpKTt2YXIgbT1pKHYsITApO3RbZF09bTt2YXIgZz1v Lm1vdW50Q29tcG9uZW50KG0scyx1LGwsYyxwKTtuLnB1c2goZyl9fWZvcihkIGluIGUpIWUuaGFz T3duUHJvcGVydHkoZCl8fHQmJnQuaGFzT3duUHJvcGVydHkoZCl8fChmPWVbZF0scltkXT1vLmdl dEhvc3ROb2RlKGYpLG8udW5tb3VudENvbXBvbmVudChmLCExKSl9fSx1bm1vdW50Q2hpbGRyZW46 ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gZSlpZihlLmhhc093blByb3BlcnR5KG4pKXt2YXIg cj1lW25dO28udW5tb3VudENvbXBvbmVudChyLHQpfX19O3QuZXhwb3J0cz11fSkuY2FsbCh0aGlz LHZvaWQgMCl9LHsxMDc6MTA3LDExNDoxMTQsMTE1OjExNSwxMzk6MTM5LDIyOjIyLDY0OjY0fV0s Mjc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSg4KSxvPWUoMzUpLGk9e3By b2Nlc3NDaGlsZHJlblVwZGF0ZXM6by5kYW5nZXJvdXNseVByb2Nlc3NDaGlsZHJlblVwZGF0ZXMs cmVwbGFjZU5vZGVXaXRoTWFya3VwOnIuZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXB9 O3QuZXhwb3J0cz1pfSx7MzU6MzUsODo4fV0sMjg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmlj dCI7dmFyIHI9ZSgxMTEpLG89KGUoMTM0KSwhMSksaT17cmVwbGFjZU5vZGVXaXRoTWFya3VwOm51 bGwscHJvY2Vzc0NoaWxkcmVuVXBkYXRlczpudWxsLGluamVjdGlvbjp7aW5qZWN0RW52aXJvbm1l bnQ6ZnVuY3Rpb24oZSl7bz9yKCIxMDQiKTp2b2lkIDAsaS5yZXBsYWNlTm9kZVdpdGhNYXJrdXA9 ZS5yZXBsYWNlTm9kZVdpdGhNYXJrdXAsaS5wcm9jZXNzQ2hpbGRyZW5VcGRhdGVzPWUucHJvY2Vz c0NoaWxkcmVuVXBkYXRlcyxvPSEwfX19O3QuZXhwb3J0cz1pfSx7MTExOjExMSwxMzQ6MTM0fV0s Mjk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt9ZnVuY3Rpb24g byhlLHQpe31mdW5jdGlvbiBpKGUpe3JldHVybiEoIWUucHJvdG90eXBlfHwhZS5wcm90b3R5cGUu aXNSZWFjdENvbXBvbmVudCl9ZnVuY3Rpb24gYShlKXtyZXR1cm4hKCFlLnByb3RvdHlwZXx8IWUu cHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50KX12YXIgcz1lKDExMSksdT1lKDE0MCksbD1l KDExOCksYz1lKDI4KSxwPWUoMTE3KSxkPWUoNDkpLGY9ZSg1NiksaD0oZSg1NyksZSg2MCkpLHY9 ZSg2NCksbT1lKDEyNyksZz0oZSgxMzQpLGUoMTM4KSkseT1lKDExNCksQz0oZSgxMzkpLHtJbXB1 cmVDbGFzczowLFB1cmVDbGFzczoxLFN0YXRlbGVzc0Z1bmN0aW9uYWw6Mn0pO3IucHJvdG90eXBl LnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlPWYuZ2V0KHRoaXMpLl9jdXJyZW50RWxlbWVudC50eXBl LHQ9ZSh0aGlzLnByb3BzLHRoaXMuY29udGV4dCx0aGlzLnVwZGF0ZXIpO3JldHVybiBvKGUsdCks dH07dmFyIF89MSxiPXtjb25zdHJ1Y3Q6ZnVuY3Rpb24oZSl7dGhpcy5fY3VycmVudEVsZW1lbnQ9 ZSx0aGlzLl9yb290Tm9kZUlEPTAsdGhpcy5fY29tcG9zaXRlVHlwZT1udWxsLHRoaXMuX2luc3Rh bmNlPW51bGwsdGhpcy5faG9zdFBhcmVudD1udWxsLHRoaXMuX2hvc3RDb250YWluZXJJbmZvPW51 bGwsdGhpcy5fdXBkYXRlQmF0Y2hOdW1iZXI9bnVsbCx0aGlzLl9wZW5kaW5nRWxlbWVudD1udWxs LHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlPW51bGwsdGhpcy5fcGVuZGluZ1JlcGxhY2VTdGF0ZT0h MSx0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGU9ITEsdGhpcy5fcmVuZGVyZWROb2RlVHlwZT1udWxs LHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50PW51bGwsdGhpcy5fY29udGV4dD1udWxsLHRoaXMuX21v dW50T3JkZXI9MCx0aGlzLl90b3BMZXZlbFdyYXBwZXI9bnVsbCx0aGlzLl9wZW5kaW5nQ2FsbGJh Y2tzPW51bGwsdGhpcy5fY2FsbGVkQ29tcG9uZW50V2lsbFVubW91bnQ9ITF9LG1vdW50Q29tcG9u ZW50OmZ1bmN0aW9uKGUsdCxuLHUpe3RoaXMuX2NvbnRleHQ9dSx0aGlzLl9tb3VudE9yZGVyPV8r Kyx0aGlzLl9ob3N0UGFyZW50PXQsdGhpcy5faG9zdENvbnRhaW5lckluZm89bjt2YXIgYyxwPXRo aXMuX2N1cnJlbnRFbGVtZW50LnByb3BzLGQ9dGhpcy5fcHJvY2Vzc0NvbnRleHQodSksaD10aGlz Ll9jdXJyZW50RWxlbWVudC50eXBlLHY9ZS5nZXRVcGRhdGVRdWV1ZSgpLGc9aShoKSx5PXRoaXMu X2NvbnN0cnVjdENvbXBvbmVudChnLHAsZCx2KTtnfHxudWxsIT15JiZudWxsIT15LnJlbmRlcj9h KGgpP3RoaXMuX2NvbXBvc2l0ZVR5cGU9Qy5QdXJlQ2xhc3M6dGhpcy5fY29tcG9zaXRlVHlwZT1D LkltcHVyZUNsYXNzOihjPXksbyhoLGMpLG51bGw9PT15fHx5PT09ITF8fGwuaXNWYWxpZEVsZW1l bnQoeSk/dm9pZCAwOnMoIjEwNSIsaC5kaXNwbGF5TmFtZXx8aC5uYW1lfHwiQ29tcG9uZW50Iiks eT1uZXcgcihoKSx0aGlzLl9jb21wb3NpdGVUeXBlPUMuU3RhdGVsZXNzRnVuY3Rpb25hbCkseS5w cm9wcz1wLHkuY29udGV4dD1kLHkucmVmcz1tLHkudXBkYXRlcj12LHRoaXMuX2luc3RhbmNlPXks Zi5zZXQoeSx0aGlzKTt2YXIgYj15LnN0YXRlO3ZvaWQgMD09PWImJih5LnN0YXRlPWI9bnVsbCks Im9iamVjdCIhPXR5cGVvZiBifHxBcnJheS5pc0FycmF5KGIpP3MoIjEwNiIsdGhpcy5nZXROYW1l KCl8fCJSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCIpOnZvaWQgMCx0aGlzLl9wZW5kaW5nU3RhdGVR dWV1ZT1udWxsLHRoaXMuX3BlbmRpbmdSZXBsYWNlU3RhdGU9ITEsdGhpcy5fcGVuZGluZ0ZvcmNl VXBkYXRlPSExO3ZhciBFO3JldHVybiBFPXkudW5zdGFibGVfaGFuZGxlRXJyb3I/dGhpcy5wZXJm b3JtSW5pdGlhbE1vdW50V2l0aEVycm9ySGFuZGxpbmcoYyx0LG4sZSx1KTp0aGlzLnBlcmZvcm1J bml0aWFsTW91bnQoYyx0LG4sZSx1KSx5LmNvbXBvbmVudERpZE1vdW50JiZlLmdldFJlYWN0TW91 bnRSZWFkeSgpLmVucXVldWUoeS5jb21wb25lbnREaWRNb3VudCx5KSxFfSxfY29uc3RydWN0Q29t cG9uZW50OmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLl9jb25zdHJ1Y3RDb21wb25lbnRX aXRob3V0T3duZXIoZSx0LG4scil9LF9jb25zdHJ1Y3RDb21wb25lbnRXaXRob3V0T3duZXI6ZnVu Y3Rpb24oZSx0LG4scil7dmFyIG89dGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTtyZXR1cm4gZT9u ZXcgbyh0LG4scik6byh0LG4scil9LHBlcmZvcm1Jbml0aWFsTW91bnRXaXRoRXJyb3JIYW5kbGlu ZzpmdW5jdGlvbihlLHQsbixyLG8pe3ZhciBpLGE9ci5jaGVja3BvaW50KCk7dHJ5e2k9dGhpcy5w ZXJmb3JtSW5pdGlhbE1vdW50KGUsdCxuLHIsbyl9Y2F0Y2gocyl7ci5yb2xsYmFjayhhKSx0aGlz Ll9pbnN0YW5jZS51bnN0YWJsZV9oYW5kbGVFcnJvcihzKSx0aGlzLl9wZW5kaW5nU3RhdGVRdWV1 ZSYmKHRoaXMuX2luc3RhbmNlLnN0YXRlPXRoaXMuX3Byb2Nlc3NQZW5kaW5nU3RhdGUodGhpcy5f aW5zdGFuY2UucHJvcHMsdGhpcy5faW5zdGFuY2UuY29udGV4dCkpLGE9ci5jaGVja3BvaW50KCks dGhpcy5fcmVuZGVyZWRDb21wb25lbnQudW5tb3VudENvbXBvbmVudCghMCksci5yb2xsYmFjayhh KSxpPXRoaXMucGVyZm9ybUluaXRpYWxNb3VudChlLHQsbixyLG8pfXJldHVybiBpfSxwZXJmb3Jt SW5pdGlhbE1vdW50OmZ1bmN0aW9uKGUsdCxuLHIsbyl7dmFyIGk9dGhpcy5faW5zdGFuY2UsYT0w O2kuY29tcG9uZW50V2lsbE1vdW50JiYoaS5jb21wb25lbnRXaWxsTW91bnQoKSx0aGlzLl9wZW5k aW5nU3RhdGVRdWV1ZSYmKGkuc3RhdGU9dGhpcy5fcHJvY2Vzc1BlbmRpbmdTdGF0ZShpLnByb3Bz LGkuY29udGV4dCkpKSx2b2lkIDA9PT1lJiYoZT10aGlzLl9yZW5kZXJWYWxpZGF0ZWRDb21wb25l bnQoKSk7dmFyIHM9aC5nZXRUeXBlKGUpO3RoaXMuX3JlbmRlcmVkTm9kZVR5cGU9czt2YXIgdT10 aGlzLl9pbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50KGUscyE9PWguRU1QVFkpO3RoaXMuX3JlbmRl cmVkQ29tcG9uZW50PXU7dmFyIGw9di5tb3VudENvbXBvbmVudCh1LHIsdCxuLHRoaXMuX3Byb2Nl c3NDaGlsZENvbnRleHQobyksYSk7cmV0dXJuIGx9LGdldEhvc3ROb2RlOmZ1bmN0aW9uKCl7cmV0 dXJuIHYuZ2V0SG9zdE5vZGUodGhpcy5fcmVuZGVyZWRDb21wb25lbnQpfSx1bm1vdW50Q29tcG9u ZW50OmZ1bmN0aW9uKGUpe2lmKHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50KXt2YXIgdD10aGlzLl9p bnN0YW5jZTtpZih0LmNvbXBvbmVudFdpbGxVbm1vdW50JiYhdC5fY2FsbGVkQ29tcG9uZW50V2ls bFVubW91bnQpaWYodC5fY2FsbGVkQ29tcG9uZW50V2lsbFVubW91bnQ9ITAsZSl7dmFyIG49dGhp cy5nZXROYW1lKCkrIi5jb21wb25lbnRXaWxsVW5tb3VudCgpIjtkLmludm9rZUd1YXJkZWRDYWxs YmFjayhuLHQuY29tcG9uZW50V2lsbFVubW91bnQuYmluZCh0KSl9ZWxzZSB0LmNvbXBvbmVudFdp bGxVbm1vdW50KCk7dGhpcy5fcmVuZGVyZWRDb21wb25lbnQmJih2LnVubW91bnRDb21wb25lbnQo dGhpcy5fcmVuZGVyZWRDb21wb25lbnQsZSksdGhpcy5fcmVuZGVyZWROb2RlVHlwZT1udWxsLHRo aXMuX3JlbmRlcmVkQ29tcG9uZW50PW51bGwsdGhpcy5faW5zdGFuY2U9bnVsbCksdGhpcy5fcGVu ZGluZ1N0YXRlUXVldWU9bnVsbCx0aGlzLl9wZW5kaW5nUmVwbGFjZVN0YXRlPSExLHRoaXMuX3Bl bmRpbmdGb3JjZVVwZGF0ZT0hMSx0aGlzLl9wZW5kaW5nQ2FsbGJhY2tzPW51bGwsdGhpcy5fcGVu ZGluZ0VsZW1lbnQ9bnVsbCx0aGlzLl9jb250ZXh0PW51bGwsdGhpcy5fcm9vdE5vZGVJRD0wLHRo aXMuX3RvcExldmVsV3JhcHBlcj1udWxsLGYucmVtb3ZlKHQpfX0sX21hc2tDb250ZXh0OmZ1bmN0 aW9uKGUpe3ZhciB0PXRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGUsbj10LmNvbnRleHRUeXBlcztp ZighbilyZXR1cm4gbTt2YXIgcj17fTtmb3IodmFyIG8gaW4gbilyW29dPWVbb107cmV0dXJuIHJ9 LF9wcm9jZXNzQ29udGV4dDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9tYXNrQ29udGV4dChlKTty ZXR1cm4gdH0sX3Byb2Nlc3NDaGlsZENvbnRleHQ6ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzLl9j dXJyZW50RWxlbWVudC50eXBlLHI9dGhpcy5faW5zdGFuY2U7aWYoci5nZXRDaGlsZENvbnRleHQm Jih0PXIuZ2V0Q2hpbGRDb250ZXh0KCkpLHQpeyJvYmplY3QiIT10eXBlb2Ygbi5jaGlsZENvbnRl eHRUeXBlcz9zKCIxMDciLHRoaXMuZ2V0TmFtZSgpfHwiUmVhY3RDb21wb3NpdGVDb21wb25lbnQi KTp2b2lkIDA7Zm9yKHZhciBvIGluIHQpbyBpbiBuLmNoaWxkQ29udGV4dFR5cGVzP3ZvaWQgMDpz KCIxMDgiLHRoaXMuZ2V0TmFtZSgpfHwiUmVhY3RDb21wb3NpdGVDb21wb25lbnQiLG8pO3JldHVy biB1KHt9LGUsdCl9cmV0dXJuIGV9LF9jaGVja0NvbnRleHRUeXBlczpmdW5jdGlvbihlLHQsbil7 fSxyZWNlaXZlQ29tcG9uZW50OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLl9jdXJyZW50RWxl bWVudCxvPXRoaXMuX2NvbnRleHQ7dGhpcy5fcGVuZGluZ0VsZW1lbnQ9bnVsbCx0aGlzLnVwZGF0 ZUNvbXBvbmVudCh0LHIsZSxvLG4pfSxwZXJmb3JtVXBkYXRlSWZOZWNlc3Nhcnk6ZnVuY3Rpb24o ZSl7bnVsbCE9dGhpcy5fcGVuZGluZ0VsZW1lbnQ/di5yZWNlaXZlQ29tcG9uZW50KHRoaXMsdGhp cy5fcGVuZGluZ0VsZW1lbnQsZSx0aGlzLl9jb250ZXh0KTpudWxsIT09dGhpcy5fcGVuZGluZ1N0 YXRlUXVldWV8fHRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZT90aGlzLnVwZGF0ZUNvbXBvbmVudChl LHRoaXMuX2N1cnJlbnRFbGVtZW50LHRoaXMuX2N1cnJlbnRFbGVtZW50LHRoaXMuX2NvbnRleHQs dGhpcy5fY29udGV4dCk6dGhpcy5fdXBkYXRlQmF0Y2hOdW1iZXI9bnVsbH0sdXBkYXRlQ29tcG9u ZW50OmZ1bmN0aW9uKGUsdCxuLHIsbyl7dmFyIGk9dGhpcy5faW5zdGFuY2U7bnVsbD09aT9zKCIx MzYiLHRoaXMuZ2V0TmFtZSgpfHwiUmVhY3RDb21wb3NpdGVDb21wb25lbnQiKTp2b2lkIDA7dmFy IGEsdT0hMTt0aGlzLl9jb250ZXh0PT09bz9hPWkuY29udGV4dDooYT10aGlzLl9wcm9jZXNzQ29u dGV4dChvKSx1PSEwKTt2YXIgbD10LnByb3BzLGM9bi5wcm9wczt0IT09biYmKHU9ITApLHUmJmku Y29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyYmaS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKGMs YSk7dmFyIHA9dGhpcy5fcHJvY2Vzc1BlbmRpbmdTdGF0ZShjLGEpLGQ9ITA7dGhpcy5fcGVuZGlu Z0ZvcmNlVXBkYXRlfHwoaS5zaG91bGRDb21wb25lbnRVcGRhdGU/ZD1pLnNob3VsZENvbXBvbmVu dFVwZGF0ZShjLHAsYSk6dGhpcy5fY29tcG9zaXRlVHlwZT09PUMuUHVyZUNsYXNzJiYoZD0hZyhs LGMpfHwhZyhpLnN0YXRlLHApKSksdGhpcy5fdXBkYXRlQmF0Y2hOdW1iZXI9bnVsbCxkPyh0aGlz Ll9wZW5kaW5nRm9yY2VVcGRhdGU9ITEsdGhpcy5fcGVyZm9ybUNvbXBvbmVudFVwZGF0ZShuLGMs cCxhLGUsbykpOih0aGlzLl9jdXJyZW50RWxlbWVudD1uLHRoaXMuX2NvbnRleHQ9byxpLnByb3Bz PWMsaS5zdGF0ZT1wLGkuY29udGV4dD1hKX0sX3Byb2Nlc3NQZW5kaW5nU3RhdGU6ZnVuY3Rpb24o ZSx0KXt2YXIgbj10aGlzLl9pbnN0YW5jZSxyPXRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlLG89dGhp cy5fcGVuZGluZ1JlcGxhY2VTdGF0ZTtpZih0aGlzLl9wZW5kaW5nUmVwbGFjZVN0YXRlPSExLHRo aXMuX3BlbmRpbmdTdGF0ZVF1ZXVlPW51bGwsIXIpcmV0dXJuIG4uc3RhdGU7aWYobyYmMT09PXIu bGVuZ3RoKXJldHVybiByWzBdO2Zvcih2YXIgaT11KHt9LG8/clswXTpuLnN0YXRlKSxhPW8/MTow O2E8ci5sZW5ndGg7YSsrKXt2YXIgcz1yW2FdO3UoaSwiZnVuY3Rpb24iPT10eXBlb2Ygcz9zLmNh bGwobixpLGUsdCk6cyl9cmV0dXJuIGl9LF9wZXJmb3JtQ29tcG9uZW50VXBkYXRlOmZ1bmN0aW9u KGUsdCxuLHIsbyxpKXt2YXIgYSxzLHUsbD10aGlzLl9pbnN0YW5jZSxjPUJvb2xlYW4obC5jb21w b25lbnREaWRVcGRhdGUpO2MmJihhPWwucHJvcHMscz1sLnN0YXRlLHU9bC5jb250ZXh0KSxsLmNv bXBvbmVudFdpbGxVcGRhdGUmJmwuY29tcG9uZW50V2lsbFVwZGF0ZSh0LG4sciksdGhpcy5fY3Vy cmVudEVsZW1lbnQ9ZSx0aGlzLl9jb250ZXh0PWksbC5wcm9wcz10LGwuc3RhdGU9bixsLmNvbnRl eHQ9cix0aGlzLl91cGRhdGVSZW5kZXJlZENvbXBvbmVudChvLGkpLGMmJm8uZ2V0UmVhY3RNb3Vu dFJlYWR5KCkuZW5xdWV1ZShsLmNvbXBvbmVudERpZFVwZGF0ZS5iaW5kKGwsYSxzLHUpLGwpfSxf dXBkYXRlUmVuZGVyZWRDb21wb25lbnQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9yZW5kZXJl ZENvbXBvbmVudCxyPW4uX2N1cnJlbnRFbGVtZW50LG89dGhpcy5fcmVuZGVyVmFsaWRhdGVkQ29t cG9uZW50KCksaT0wO2lmKHkocixvKSl2LnJlY2VpdmVDb21wb25lbnQobixvLGUsdGhpcy5fcHJv Y2Vzc0NoaWxkQ29udGV4dCh0KSk7ZWxzZXt2YXIgYT12LmdldEhvc3ROb2RlKG4pO3YudW5tb3Vu dENvbXBvbmVudChuLCExKTt2YXIgcz1oLmdldFR5cGUobyk7dGhpcy5fcmVuZGVyZWROb2RlVHlw ZT1zO3ZhciB1PXRoaXMuX2luc3RhbnRpYXRlUmVhY3RDb21wb25lbnQobyxzIT09aC5FTVBUWSk7 dGhpcy5fcmVuZGVyZWRDb21wb25lbnQ9dTt2YXIgbD12Lm1vdW50Q29tcG9uZW50KHUsZSx0aGlz Ll9ob3N0UGFyZW50LHRoaXMuX2hvc3RDb250YWluZXJJbmZvLHRoaXMuX3Byb2Nlc3NDaGlsZENv bnRleHQodCksaSk7dGhpcy5fcmVwbGFjZU5vZGVXaXRoTWFya3VwKGEsbCxuKX19LF9yZXBsYWNl Tm9kZVdpdGhNYXJrdXA6ZnVuY3Rpb24oZSx0LG4pe2MucmVwbGFjZU5vZGVXaXRoTWFya3VwKGUs dCxuKX0sX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudFdpdGhvdXRPd25lck9yQ29udGV4dDpmdW5j dGlvbigpe3ZhciBlLHQ9dGhpcy5faW5zdGFuY2U7cmV0dXJuIGU9dC5yZW5kZXIoKX0sX3JlbmRl clZhbGlkYXRlZENvbXBvbmVudDpmdW5jdGlvbigpe3ZhciBlO2lmKHRoaXMuX2NvbXBvc2l0ZVR5 cGUhPT1DLlN0YXRlbGVzc0Z1bmN0aW9uYWwpe3AuY3VycmVudD10aGlzO3RyeXtlPXRoaXMuX3Jl bmRlclZhbGlkYXRlZENvbXBvbmVudFdpdGhvdXRPd25lck9yQ29udGV4dCgpfWZpbmFsbHl7cC5j dXJyZW50PW51bGx9fWVsc2UgZT10aGlzLl9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnRXaXRob3V0 T3duZXJPckNvbnRleHQoKTtyZXR1cm4gbnVsbD09PWV8fGU9PT0hMXx8bC5pc1ZhbGlkRWxlbWVu dChlKT92b2lkIDA6cygiMTA5Iix0aGlzLmdldE5hbWUoKXx8IlJlYWN0Q29tcG9zaXRlQ29tcG9u ZW50IiksZX0sYXR0YWNoUmVmOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5nZXRQdWJsaWNJbnN0 YW5jZSgpO251bGw9PW4/cygiMTEwIik6dm9pZCAwO3ZhciByPXQuZ2V0UHVibGljSW5zdGFuY2Uo KSxvPW4ucmVmcz09PW0/bi5yZWZzPXt9Om4ucmVmcztvW2VdPXJ9LGRldGFjaFJlZjpmdW5jdGlv bihlKXt2YXIgdD10aGlzLmdldFB1YmxpY0luc3RhbmNlKCkucmVmcztkZWxldGUgdFtlXX0sZ2V0 TmFtZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGUsdD10aGlzLl9p bnN0YW5jZSYmdGhpcy5faW5zdGFuY2UuY29uc3RydWN0b3I7cmV0dXJuIGUuZGlzcGxheU5hbWV8 fHQmJnQuZGlzcGxheU5hbWV8fGUubmFtZXx8dCYmdC5uYW1lfHxudWxsfSxnZXRQdWJsaWNJbnN0 YW5jZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2luc3RhbmNlO3JldHVybiB0aGlzLl9jb21wb3Np dGVUeXBlPT09Qy5TdGF0ZWxlc3NGdW5jdGlvbmFsP251bGw6ZX0sX2luc3RhbnRpYXRlUmVhY3RD b21wb25lbnQ6bnVsbH07dC5leHBvcnRzPWJ9LHsxMTE6MTExLDExNDoxMTQsMTE3OjExNywxMTg6 MTE4LDEyNzoxMjcsMTM0OjEzNCwxMzg6MTM4LDEzOToxMzksMTQwOjE0MCwyODoyOCw0OTo0OSw1 Njo1Niw1Nzo1Nyw2MDo2MCw2NDo2NH1dLDMwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3Qi O2Z1bmN0aW9uIHIoZSl7aWYoZSl7dmFyIHQ9ZS5fY3VycmVudEVsZW1lbnQuX293bmVyfHxudWxs O2lmKHQpe3ZhciBuPXQuZ2V0TmFtZSgpO2lmKG4pcmV0dXJuIiBUaGlzIERPTSBub2RlIHdhcyBy ZW5kZXJlZCBieSBgIituKyJgLiJ9fXJldHVybiIifWZ1bmN0aW9uIG8oZSx0KXt0JiYoWFtlLl90 YWddJiYobnVsbCE9dC5jaGlsZHJlbnx8bnVsbCE9dC5kYW5nZXJvdXNseVNldElubmVySFRNTD92 KCIxMzciLGUuX3RhZyxlLl9jdXJyZW50RWxlbWVudC5fb3duZXI/IiBDaGVjayB0aGUgcmVuZGVy IG1ldGhvZCBvZiAiK2UuX2N1cnJlbnRFbGVtZW50Ll9vd25lci5nZXROYW1lKCkrIi4iOiIiKTp2 b2lkIDApLG51bGwhPXQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwmJihudWxsIT10LmNoaWxkcmVu P3YoIjYwIik6dm9pZCAwLCJvYmplY3QiPT10eXBlb2YgdC5kYW5nZXJvdXNseVNldElubmVySFRN TCYmVyBpbiB0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MP3ZvaWQgMDp2KCI2MSIpKSxudWxsIT10 LnN0eWxlJiYib2JqZWN0IiE9dHlwZW9mIHQuc3R5bGU/digiNjIiLHIoZSkpOnZvaWQgMCl9ZnVu Y3Rpb24gaShlLHQsbixyKXtpZighKHIgaW5zdGFuY2VvZiBSKSl7dmFyIG89ZS5faG9zdENvbnRh aW5lckluZm8saT1vLl9ub2RlJiZvLl9ub2RlLm5vZGVUeXBlPT09cSxzPWk/by5fbm9kZTpvLl9v d25lckRvY3VtZW50O0YodCxzKSxyLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoYSx7aW5z dDplLHJlZ2lzdHJhdGlvbk5hbWU6dCxsaXN0ZW5lcjpufSl9fWZ1bmN0aW9uIGEoKXt2YXIgZT10 aGlzO3gucHV0TGlzdGVuZXIoZS5pbnN0LGUucmVnaXN0cmF0aW9uTmFtZSxlLmxpc3RlbmVyKX1m dW5jdGlvbiBzKCl7dmFyIGU9dGhpcztTLnBvc3RNb3VudFdyYXBwZXIoZSl9ZnVuY3Rpb24gdSgp e3ZhciBlPXRoaXM7Ty5wb3N0TW91bnRXcmFwcGVyKGUpfWZ1bmN0aW9uIGwoKXt2YXIgZT10aGlz O00ucG9zdE1vdW50V3JhcHBlcihlKX1mdW5jdGlvbiBjKCl7dmFyIGU9dGhpcztlLl9yb290Tm9k ZUlEP3ZvaWQgMDp2KCI2MyIpO3ZhciB0PVUoZSk7c3dpdGNoKHQ/dm9pZCAwOnYoIjY0IiksZS5f dGFnKXtjYXNlImlmcmFtZSI6Y2FzZSJvYmplY3QiOmUuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM9 W2sudHJhcEJ1YmJsZWRFdmVudCgidG9wTG9hZCIsImxvYWQiLHQpXTticmVhaztjYXNlInZpZGVv IjpjYXNlImF1ZGlvIjplLl93cmFwcGVyU3RhdGUubGlzdGVuZXJzPVtdO2Zvcih2YXIgbiBpbiBL KUsuaGFzT3duUHJvcGVydHkobikmJmUuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnMucHVzaChrLnRy YXBCdWJibGVkRXZlbnQobixLW25dLHQpKTticmVhaztjYXNlInNvdXJjZSI6ZS5fd3JhcHBlclN0 YXRlLmxpc3RlbmVycz1bay50cmFwQnViYmxlZEV2ZW50KCJ0b3BFcnJvciIsImVycm9yIix0KV07 YnJlYWs7Y2FzZSJpbWciOmUuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM9W2sudHJhcEJ1YmJsZWRF dmVudCgidG9wRXJyb3IiLCJlcnJvciIsdCksay50cmFwQnViYmxlZEV2ZW50KCJ0b3BMb2FkIiwi bG9hZCIsdCldO2JyZWFrO2Nhc2UiZm9ybSI6ZS5fd3JhcHBlclN0YXRlLmxpc3RlbmVycz1bay50 cmFwQnViYmxlZEV2ZW50KCJ0b3BSZXNldCIsInJlc2V0Iix0KSxrLnRyYXBCdWJibGVkRXZlbnQo InRvcFN1Ym1pdCIsInN1Ym1pdCIsdCldO2JyZWFrO2Nhc2UiaW5wdXQiOmNhc2Uic2VsZWN0Ijpj YXNlInRleHRhcmVhIjplLl93cmFwcGVyU3RhdGUubGlzdGVuZXJzPVtrLnRyYXBCdWJibGVkRXZl bnQoInRvcEludmFsaWQiLCJpbnZhbGlkIix0KV19fWZ1bmN0aW9uIHAoKXtOLnBvc3RVcGRhdGVX cmFwcGVyKHRoaXMpfWZ1bmN0aW9uIGQoZSl7JC5jYWxsKEcsZSl8fChRLnRlc3QoZSk/dm9pZCAw OnYoIjY1IixlKSxHW2VdPSEwKX1mdW5jdGlvbiBmKGUsdCl7cmV0dXJuIGUuaW5kZXhPZigiLSIp Pj0wfHxudWxsIT10LmlzfWZ1bmN0aW9uIGgoZSl7dmFyIHQ9ZS50eXBlO2QodCksdGhpcy5fY3Vy cmVudEVsZW1lbnQ9ZSx0aGlzLl90YWc9dC50b0xvd2VyQ2FzZSgpLHRoaXMuX25hbWVzcGFjZVVS ST1udWxsLHRoaXMuX3JlbmRlcmVkQ2hpbGRyZW49bnVsbCx0aGlzLl9wcmV2aW91c1N0eWxlPW51 bGwsdGhpcy5fcHJldmlvdXNTdHlsZUNvcHk9bnVsbCx0aGlzLl9ob3N0Tm9kZT1udWxsLHRoaXMu X2hvc3RQYXJlbnQ9bnVsbCx0aGlzLl9yb290Tm9kZUlEPTAsdGhpcy5fZG9tSUQ9MCx0aGlzLl9o b3N0Q29udGFpbmVySW5mbz1udWxsLHRoaXMuX3dyYXBwZXJTdGF0ZT1udWxsLHRoaXMuX3RvcExl dmVsV3JhcHBlcj1udWxsLHRoaXMuX2ZsYWdzPTB9dmFyIHY9ZSgxMTEpLG09ZSgxNDApLGc9ZSgy KSx5PWUoNSksQz1lKDkpLF89ZSgxMCksYj1lKDExKSxFPWUoMTIpLHg9ZSgxNiksdz1lKDE3KSxr PWUoMjUpLFQ9ZSgzMSksUD1lKDMyKSxTPWUoMzYpLE09ZSgzNyksTj1lKDM4KSxPPWUoNDMpLEk9 KGUoNTcpLGUoNTkpKSxSPWUoNjgpLEE9KGUoMTI2KSxlKDk1KSksRD0oZSgxMzQpLGUoMTA4KSxl KDEzOCksZSgxMTYpLGUoMTM5KSxUKSxMPXguZGVsZXRlTGlzdGVuZXIsVT1QLmdldE5vZGVGcm9t SW5zdGFuY2UsRj1rLmxpc3RlblRvLFY9dy5yZWdpc3RyYXRpb25OYW1lTW9kdWxlcyxqPXtzdHJp bmc6ITAsbnVtYmVyOiEwfSxCPSJzdHlsZSIsVz0iX19odG1sIixIPXtjaGlsZHJlbjpudWxsLGRh bmdlcm91c2x5U2V0SW5uZXJIVE1MOm51bGwsc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5n Om51bGx9LHE9MTEsSz17dG9wQWJvcnQ6ImFib3J0Iix0b3BDYW5QbGF5OiJjYW5wbGF5Iix0b3BD YW5QbGF5VGhyb3VnaDoiY2FucGxheXRocm91Z2giLHRvcER1cmF0aW9uQ2hhbmdlOiJkdXJhdGlv bmNoYW5nZSIsdG9wRW1wdGllZDoiZW1wdGllZCIsdG9wRW5jcnlwdGVkOiJlbmNyeXB0ZWQiLHRv cEVuZGVkOiJlbmRlZCIsdG9wRXJyb3I6ImVycm9yIix0b3BMb2FkZWREYXRhOiJsb2FkZWRkYXRh Iix0b3BMb2FkZWRNZXRhZGF0YToibG9hZGVkbWV0YWRhdGEiLHRvcExvYWRTdGFydDoibG9hZHN0 YXJ0Iix0b3BQYXVzZToicGF1c2UiLHRvcFBsYXk6InBsYXkiLHRvcFBsYXlpbmc6InBsYXlpbmci LHRvcFByb2dyZXNzOiJwcm9ncmVzcyIsdG9wUmF0ZUNoYW5nZToicmF0ZWNoYW5nZSIsdG9wU2Vl a2VkOiJzZWVrZWQiLHRvcFNlZWtpbmc6InNlZWtpbmciLHRvcFN0YWxsZWQ6InN0YWxsZWQiLHRv cFN1c3BlbmQ6InN1c3BlbmQiLHRvcFRpbWVVcGRhdGU6InRpbWV1cGRhdGUiLHRvcFZvbHVtZUNo YW5nZToidm9sdW1lY2hhbmdlIix0b3BXYWl0aW5nOiJ3YWl0aW5nIn0sej17YXJlYTohMCxiYXNl OiEwLGJyOiEwLGNvbDohMCxlbWJlZDohMCxocjohMCxpbWc6ITAsaW5wdXQ6ITAsa2V5Z2VuOiEw LGxpbms6ITAsbWV0YTohMCxwYXJhbTohMCxzb3VyY2U6ITAsdHJhY2s6ITAsd2JyOiEwfSxZPXts aXN0aW5nOiEwLHByZTohMCx0ZXh0YXJlYTohMH0sWD1tKHttZW51aXRlbTohMH0seiksUT0vXlth LXpBLVpdW2EtekEtWjpfXC5cLVxkXSokLyxHPXt9LCQ9e30uaGFzT3duUHJvcGVydHksWj0xO2gu ZGlzcGxheU5hbWU9IlJlYWN0RE9NQ29tcG9uZW50IixoLk1peGluPXttb3VudENvbXBvbmVudDpm dW5jdGlvbihlLHQsbixyKXt0aGlzLl9yb290Tm9kZUlEPVorKyx0aGlzLl9kb21JRD1uLl9pZENv dW50ZXIrKyx0aGlzLl9ob3N0UGFyZW50PXQsdGhpcy5faG9zdENvbnRhaW5lckluZm89bjt2YXIg aT10aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcztzd2l0Y2godGhpcy5fdGFnKXtjYXNlImF1ZGlv IjpjYXNlImZvcm0iOmNhc2UiaWZyYW1lIjpjYXNlImltZyI6Y2FzZSJsaW5rIjpjYXNlIm9iamVj dCI6Y2FzZSJzb3VyY2UiOmNhc2UidmlkZW8iOnRoaXMuX3dyYXBwZXJTdGF0ZT17bGlzdGVuZXJz Om51bGx9LGUuZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShjLHRoaXMpO2JyZWFrO2Nhc2Ui aW5wdXQiOlMubW91bnRXcmFwcGVyKHRoaXMsaSx0KSxpPVMuZ2V0SG9zdFByb3BzKHRoaXMsaSks ZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGMsdGhpcyk7YnJlYWs7Y2FzZSJvcHRpb24i Ok0ubW91bnRXcmFwcGVyKHRoaXMsaSx0KSxpPU0uZ2V0SG9zdFByb3BzKHRoaXMsaSk7YnJlYWs7 Y2FzZSJzZWxlY3QiOk4ubW91bnRXcmFwcGVyKHRoaXMsaSx0KSxpPU4uZ2V0SG9zdFByb3BzKHRo aXMsaSksZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGMsdGhpcyk7YnJlYWs7Y2FzZSJ0 ZXh0YXJlYSI6Ty5tb3VudFdyYXBwZXIodGhpcyxpLHQpLGk9Ty5nZXRIb3N0UHJvcHModGhpcyxp KSxlLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoYyx0aGlzKX1vKHRoaXMsaSk7dmFyIGEs cDtudWxsIT10PyhhPXQuX25hbWVzcGFjZVVSSSxwPXQuX3RhZyk6bi5fdGFnJiYoYT1uLl9uYW1l c3BhY2VVUkkscD1uLl90YWcpLChudWxsPT1hfHxhPT09Xy5zdmcmJiJmb3JlaWdub2JqZWN0Ij09 PXApJiYoYT1fLmh0bWwpLGE9PT1fLmh0bWwmJigic3ZnIj09PXRoaXMuX3RhZz9hPV8uc3ZnOiJt YXRoIj09PXRoaXMuX3RhZyYmKGE9Xy5tYXRobWwpKSx0aGlzLl9uYW1lc3BhY2VVUkk9YTt2YXIg ZDtpZihlLnVzZUNyZWF0ZUVsZW1lbnQpe3ZhciBmLGg9bi5fb3duZXJEb2N1bWVudDtpZihhPT09 Xy5odG1sKWlmKCJzY3JpcHQiPT09dGhpcy5fdGFnKXt2YXIgdj1oLmNyZWF0ZUVsZW1lbnQoImRp diIpLG09dGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTt2LmlubmVySFRNTD0iPCIrbSsiPjwvIitt KyI+IixmPXYucmVtb3ZlQ2hpbGQodi5maXJzdENoaWxkKX1lbHNlIGY9aS5pcz9oLmNyZWF0ZUVs ZW1lbnQodGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSxpLmlzKTpoLmNyZWF0ZUVsZW1lbnQodGhp cy5fY3VycmVudEVsZW1lbnQudHlwZSk7ZWxzZSBmPWguY3JlYXRlRWxlbWVudE5TKGEsdGhpcy5f Y3VycmVudEVsZW1lbnQudHlwZSk7UC5wcmVjYWNoZU5vZGUodGhpcyxmKSx0aGlzLl9mbGFnc3w9 RC5oYXNDYWNoZWRDaGlsZE5vZGVzLHRoaXMuX2hvc3RQYXJlbnR8fEUuc2V0QXR0cmlidXRlRm9y Um9vdChmKSx0aGlzLl91cGRhdGVET01Qcm9wZXJ0aWVzKG51bGwsaSxlKTt2YXIgeT1DKGYpO3Ro aXMuX2NyZWF0ZUluaXRpYWxDaGlsZHJlbihlLGkscix5KSxkPXl9ZWxzZXt2YXIgYj10aGlzLl9j cmVhdGVPcGVuVGFnTWFya3VwQW5kUHV0TGlzdGVuZXJzKGUsaSkseD10aGlzLl9jcmVhdGVDb250 ZW50TWFya3VwKGUsaSxyKTtkPSF4JiZ6W3RoaXMuX3RhZ10/YisiLz4iOmIrIj4iK3grIjwvIit0 aGlzLl9jdXJyZW50RWxlbWVudC50eXBlKyI+In1zd2l0Y2godGhpcy5fdGFnKXtjYXNlImlucHV0 IjplLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUocyx0aGlzKSxpLmF1dG9Gb2N1cyYmZS5n ZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGcuZm9jdXNET01Db21wb25lbnQsdGhpcyk7YnJl YWs7Y2FzZSJ0ZXh0YXJlYSI6ZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHUsdGhpcyks aS5hdXRvRm9jdXMmJmUuZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShnLmZvY3VzRE9NQ29t cG9uZW50LHRoaXMpO2JyZWFrO2Nhc2Uic2VsZWN0IjppLmF1dG9Gb2N1cyYmZS5nZXRSZWFjdE1v dW50UmVhZHkoKS5lbnF1ZXVlKGcuZm9jdXNET01Db21wb25lbnQsdGhpcyk7YnJlYWs7Y2FzZSJi dXR0b24iOmkuYXV0b0ZvY3VzJiZlLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoZy5mb2N1 c0RPTUNvbXBvbmVudCx0aGlzKTticmVhaztjYXNlIm9wdGlvbiI6ZS5nZXRSZWFjdE1vdW50UmVh ZHkoKS5lbnF1ZXVlKGwsdGhpcyl9cmV0dXJuIGR9LF9jcmVhdGVPcGVuVGFnTWFya3VwQW5kUHV0 TGlzdGVuZXJzOmZ1bmN0aW9uKGUsdCl7dmFyIG49IjwiK3RoaXMuX2N1cnJlbnRFbGVtZW50LnR5 cGU7Zm9yKHZhciByIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShyKSl7dmFyIG89dFtyXTtpZihu dWxsIT1vKWlmKFYuaGFzT3duUHJvcGVydHkocikpbyYmaSh0aGlzLHIsbyxlKTtlbHNle3I9PT1C JiYobyYmKG89dGhpcy5fcHJldmlvdXNTdHlsZUNvcHk9bSh7fSx0LnN0eWxlKSksbz15LmNyZWF0 ZU1hcmt1cEZvclN0eWxlcyhvLHRoaXMpKTt2YXIgYT1udWxsO251bGwhPXRoaXMuX3RhZyYmZih0 aGlzLl90YWcsdCk/SC5oYXNPd25Qcm9wZXJ0eShyKXx8KGE9RS5jcmVhdGVNYXJrdXBGb3JDdXN0 b21BdHRyaWJ1dGUocixvKSk6YT1FLmNyZWF0ZU1hcmt1cEZvclByb3BlcnR5KHIsbyksYSYmKG4r PSIgIithKX19cmV0dXJuIGUucmVuZGVyVG9TdGF0aWNNYXJrdXA/bjoodGhpcy5faG9zdFBhcmVu dHx8KG4rPSIgIitFLmNyZWF0ZU1hcmt1cEZvclJvb3QoKSksbis9IiAiK0UuY3JlYXRlTWFya3Vw Rm9ySUQodGhpcy5fZG9tSUQpKX0sX2NyZWF0ZUNvbnRlbnRNYXJrdXA6ZnVuY3Rpb24oZSx0LG4p e3ZhciByPSIiLG89dC5kYW5nZXJvdXNseVNldElubmVySFRNTDtpZihudWxsIT1vKW51bGwhPW8u X19odG1sJiYocj1vLl9faHRtbCk7ZWxzZXt2YXIgaT1qW3R5cGVvZiB0LmNoaWxkcmVuXT90LmNo aWxkcmVuOm51bGwsYT1udWxsIT1pP251bGw6dC5jaGlsZHJlbjtpZihudWxsIT1pKXI9QShpKTtl bHNlIGlmKG51bGwhPWEpe3ZhciBzPXRoaXMubW91bnRDaGlsZHJlbihhLGUsbik7cj1zLmpvaW4o IiIpfX1yZXR1cm4gWVt0aGlzLl90YWddJiYiXG4iPT09ci5jaGFyQXQoMCk/IlxuIityOnJ9LF9j cmVhdGVJbml0aWFsQ2hpbGRyZW46ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89dC5kYW5nZXJvdXNs eVNldElubmVySFRNTDtpZihudWxsIT1vKW51bGwhPW8uX19odG1sJiZDLnF1ZXVlSFRNTChyLG8u X19odG1sKTtlbHNle3ZhciBpPWpbdHlwZW9mIHQuY2hpbGRyZW5dP3QuY2hpbGRyZW46bnVsbCxh PW51bGwhPWk/bnVsbDp0LmNoaWxkcmVuO2lmKG51bGwhPWkpIiIhPT1pJiZDLnF1ZXVlVGV4dChy LGkpO2Vsc2UgaWYobnVsbCE9YSlmb3IodmFyIHM9dGhpcy5tb3VudENoaWxkcmVuKGEsZSxuKSx1 PTA7dTxzLmxlbmd0aDt1KyspQy5xdWV1ZUNoaWxkKHIsc1t1XSl9fSxyZWNlaXZlQ29tcG9uZW50 OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLl9jdXJyZW50RWxlbWVudDt0aGlzLl9jdXJyZW50 RWxlbWVudD1lLHRoaXMudXBkYXRlQ29tcG9uZW50KHQscixlLG4pfSx1cGRhdGVDb21wb25lbnQ6 ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dC5wcm9wcyxhPXRoaXMuX2N1cnJlbnRFbGVtZW50LnBy b3BzO3N3aXRjaCh0aGlzLl90YWcpe2Nhc2UiaW5wdXQiOmk9Uy5nZXRIb3N0UHJvcHModGhpcyxp KSxhPVMuZ2V0SG9zdFByb3BzKHRoaXMsYSk7YnJlYWs7Y2FzZSJvcHRpb24iOmk9TS5nZXRIb3N0 UHJvcHModGhpcyxpKSxhPU0uZ2V0SG9zdFByb3BzKHRoaXMsYSk7YnJlYWs7Y2FzZSJzZWxlY3Qi Omk9Ti5nZXRIb3N0UHJvcHModGhpcyxpKSxhPU4uZ2V0SG9zdFByb3BzKHRoaXMsYSk7YnJlYWs7 Y2FzZSJ0ZXh0YXJlYSI6aT1PLmdldEhvc3RQcm9wcyh0aGlzLGkpLGE9Ty5nZXRIb3N0UHJvcHMo dGhpcyxhKX1zd2l0Y2gobyh0aGlzLGEpLHRoaXMuX3VwZGF0ZURPTVByb3BlcnRpZXMoaSxhLGUp LHRoaXMuX3VwZGF0ZURPTUNoaWxkcmVuKGksYSxlLHIpLHRoaXMuX3RhZyl7Y2FzZSJpbnB1dCI6 Uy51cGRhdGVXcmFwcGVyKHRoaXMpO2JyZWFrO2Nhc2UidGV4dGFyZWEiOk8udXBkYXRlV3JhcHBl cih0aGlzKTticmVhaztjYXNlInNlbGVjdCI6ZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVl KHAsdGhpcyl9fSxfdXBkYXRlRE9NUHJvcGVydGllczpmdW5jdGlvbihlLHQsbil7dmFyIHIsbyxh O2ZvcihyIGluIGUpaWYoIXQuaGFzT3duUHJvcGVydHkocikmJmUuaGFzT3duUHJvcGVydHkocikm Jm51bGwhPWVbcl0paWYocj09PUIpe3ZhciBzPXRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5O2Zvcihv IGluIHMpcy5oYXNPd25Qcm9wZXJ0eShvKSYmKGE9YXx8e30sYVtvXT0iIik7dGhpcy5fcHJldmlv dXNTdHlsZUNvcHk9bnVsbH1lbHNlIFYuaGFzT3duUHJvcGVydHkocik/ZVtyXSYmTCh0aGlzLHIp OmYodGhpcy5fdGFnLGUpP0guaGFzT3duUHJvcGVydHkocil8fEUuZGVsZXRlVmFsdWVGb3JBdHRy aWJ1dGUoVSh0aGlzKSxyKTooYi5wcm9wZXJ0aWVzW3JdfHxiLmlzQ3VzdG9tQXR0cmlidXRlKHIp KSYmRS5kZWxldGVWYWx1ZUZvclByb3BlcnR5KFUodGhpcykscik7Zm9yKHIgaW4gdCl7dmFyIHU9 dFtyXSxsPXI9PT1CP3RoaXMuX3ByZXZpb3VzU3R5bGVDb3B5Om51bGwhPWU/ZVtyXTp2b2lkIDA7 aWYodC5oYXNPd25Qcm9wZXJ0eShyKSYmdSE9PWwmJihudWxsIT11fHxudWxsIT1sKSlpZihyPT09 QilpZih1P3U9dGhpcy5fcHJldmlvdXNTdHlsZUNvcHk9bSh7fSx1KTp0aGlzLl9wcmV2aW91c1N0 eWxlQ29weT1udWxsLGwpe2ZvcihvIGluIGwpIWwuaGFzT3duUHJvcGVydHkobyl8fHUmJnUuaGFz T3duUHJvcGVydHkobyl8fChhPWF8fHt9LGFbb109IiIpO2ZvcihvIGluIHUpdS5oYXNPd25Qcm9w ZXJ0eShvKSYmbFtvXSE9PXVbb10mJihhPWF8fHt9LGFbb109dVtvXSl9ZWxzZSBhPXU7ZWxzZSBp ZihWLmhhc093blByb3BlcnR5KHIpKXU/aSh0aGlzLHIsdSxuKTpsJiZMKHRoaXMscik7ZWxzZSBp ZihmKHRoaXMuX3RhZyx0KSlILmhhc093blByb3BlcnR5KHIpfHxFLnNldFZhbHVlRm9yQXR0cmli dXRlKFUodGhpcykscix1KTtlbHNlIGlmKGIucHJvcGVydGllc1tyXXx8Yi5pc0N1c3RvbUF0dHJp YnV0ZShyKSl7dmFyIGM9VSh0aGlzKTtudWxsIT11P0Uuc2V0VmFsdWVGb3JQcm9wZXJ0eShjLHIs dSk6RS5kZWxldGVWYWx1ZUZvclByb3BlcnR5KGMscil9fWEmJnkuc2V0VmFsdWVGb3JTdHlsZXMo VSh0aGlzKSxhLHRoaXMpfSxfdXBkYXRlRE9NQ2hpbGRyZW46ZnVuY3Rpb24oZSx0LG4scil7dmFy IG89alt0eXBlb2YgZS5jaGlsZHJlbl0/ZS5jaGlsZHJlbjpudWxsLGk9alt0eXBlb2YgdC5jaGls ZHJlbl0/dC5jaGlsZHJlbjpudWxsLGE9ZS5kYW5nZXJvdXNseVNldElubmVySFRNTCYmZS5kYW5n ZXJvdXNseVNldElubmVySFRNTC5fX2h0bWwscz10LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MJiZ0 LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRtbCx1PW51bGwhPW8/bnVsbDplLmNoaWxkcmVu LGw9bnVsbCE9aT9udWxsOnQuY2hpbGRyZW4sYz1udWxsIT1vfHxudWxsIT1hLHA9bnVsbCE9aXx8 bnVsbCE9cztudWxsIT11JiZudWxsPT1sP3RoaXMudXBkYXRlQ2hpbGRyZW4obnVsbCxuLHIpOmMm JiFwJiZ0aGlzLnVwZGF0ZVRleHRDb250ZW50KCIiKSxudWxsIT1pP28hPT1pJiZ0aGlzLnVwZGF0 ZVRleHRDb250ZW50KCIiK2kpOm51bGwhPXM/YSE9PXMmJnRoaXMudXBkYXRlTWFya3VwKCIiK3Mp Om51bGwhPWwmJnRoaXMudXBkYXRlQ2hpbGRyZW4obCxuLHIpfSxnZXRIb3N0Tm9kZTpmdW5jdGlv bigpe3JldHVybiBVKHRoaXMpfSx1bm1vdW50Q29tcG9uZW50OmZ1bmN0aW9uKGUpe3N3aXRjaCh0 aGlzLl90YWcpe2Nhc2UiYXVkaW8iOmNhc2UiZm9ybSI6Y2FzZSJpZnJhbWUiOmNhc2UiaW1nIjpj YXNlImxpbmsiOmNhc2Uib2JqZWN0IjpjYXNlInNvdXJjZSI6Y2FzZSJ2aWRlbyI6dmFyIHQ9dGhp cy5fd3JhcHBlclN0YXRlLmxpc3RlbmVycztpZih0KWZvcih2YXIgbj0wO248dC5sZW5ndGg7bisr KXRbbl0ucmVtb3ZlKCk7YnJlYWs7Y2FzZSJodG1sIjpjYXNlImhlYWQiOmNhc2UiYm9keSI6digi NjYiLHRoaXMuX3RhZyl9dGhpcy51bm1vdW50Q2hpbGRyZW4oZSksUC51bmNhY2hlTm9kZSh0aGlz KSx4LmRlbGV0ZUFsbExpc3RlbmVycyh0aGlzKSx0aGlzLl9yb290Tm9kZUlEPTAsdGhpcy5fZG9t SUQ9MCx0aGlzLl93cmFwcGVyU3RhdGU9bnVsbH0sZ2V0UHVibGljSW5zdGFuY2U6ZnVuY3Rpb24o KXtyZXR1cm4gVSh0aGlzKX19LG0oaC5wcm90b3R5cGUsaC5NaXhpbixJLk1peGluKSx0LmV4cG9y dHM9aH0sezEwOjEwLDEwODoxMDgsMTE6MTEsMTExOjExMSwxMTY6MTE2LDEyOjEyLDEyNjoxMjYs MTM0OjEzNCwxMzg6MTM4LDEzOToxMzksMTQwOjE0MCwxNjoxNiwxNzoxNywyOjIsMjU6MjUsMzE6 MzEsMzI6MzIsMzY6MzYsMzc6MzcsMzg6MzgsNDM6NDMsNTo1LDU3OjU3LDU5OjU5LDY4OjY4LDk6 OSw5NTo5NX1dLDMxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXtoYXNDYWNo ZWRDaGlsZE5vZGVzOjF9O3QuZXhwb3J0cz1yfSx7fV0sMzI6W2Z1bmN0aW9uKGUsdCxuKXsidXNl IHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3JldHVybiAxPT09ZS5ub2RlVHlwZSYmZS5nZXRBdHRy aWJ1dGUoaCk9PT1TdHJpbmcodCl8fDg9PT1lLm5vZGVUeXBlJiZlLm5vZGVWYWx1ZT09PSIgcmVh Y3QtdGV4dDogIit0KyIgInx8OD09PWUubm9kZVR5cGUmJmUubm9kZVZhbHVlPT09IiByZWFjdC1l bXB0eTogIit0KyIgIn1mdW5jdGlvbiBvKGUpe2Zvcih2YXIgdDt0PWUuX3JlbmRlcmVkQ29tcG9u ZW50OyllPXQ7cmV0dXJuIGV9ZnVuY3Rpb24gaShlLHQpe3ZhciBuPW8oZSk7bi5faG9zdE5vZGU9 dCx0W21dPW59ZnVuY3Rpb24gYShlKXt2YXIgdD1lLl9ob3N0Tm9kZTt0JiYoZGVsZXRlIHRbbV0s ZS5faG9zdE5vZGU9bnVsbCl9ZnVuY3Rpb24gcyhlLHQpe2lmKCEoZS5fZmxhZ3Mmdi5oYXNDYWNo ZWRDaGlsZE5vZGVzKSl7dmFyIG49ZS5fcmVuZGVyZWRDaGlsZHJlbixhPXQuZmlyc3RDaGlsZDtl OmZvcih2YXIgcyBpbiBuKWlmKG4uaGFzT3duUHJvcGVydHkocykpe3ZhciB1PW5bc10sbD1vKHUp Ll9kb21JRDtpZigwIT09bCl7Zm9yKDtudWxsIT09YTthPWEubmV4dFNpYmxpbmcpaWYocihhLGwp KXtpKHUsYSk7Y29udGludWUgZX1wKCIzMiIsbCl9fWUuX2ZsYWdzfD12Lmhhc0NhY2hlZENoaWxk Tm9kZXN9fWZ1bmN0aW9uIHUoZSl7aWYoZVttXSlyZXR1cm4gZVttXTtmb3IodmFyIHQ9W107IWVb bV07KXtpZih0LnB1c2goZSksIWUucGFyZW50Tm9kZSlyZXR1cm4gbnVsbDtlPWUucGFyZW50Tm9k ZX1mb3IodmFyIG4scjtlJiYocj1lW21dKTtlPXQucG9wKCkpbj1yLHQubGVuZ3RoJiZzKHIsZSk7 cmV0dXJuIG59ZnVuY3Rpb24gbChlKXt2YXIgdD11KGUpO3JldHVybiBudWxsIT10JiZ0Ll9ob3N0 Tm9kZT09PWU/dDpudWxsfWZ1bmN0aW9uIGMoZSl7aWYodm9pZCAwPT09ZS5faG9zdE5vZGU/cCgi MzMiKTp2b2lkIDAsZS5faG9zdE5vZGUpcmV0dXJuIGUuX2hvc3ROb2RlO2Zvcih2YXIgdD1bXTsh ZS5faG9zdE5vZGU7KXQucHVzaChlKSxlLl9ob3N0UGFyZW50P3ZvaWQgMDpwKCIzNCIpLGU9ZS5f aG9zdFBhcmVudDtmb3IoO3QubGVuZ3RoO2U9dC5wb3AoKSlzKGUsZS5faG9zdE5vZGUpO3JldHVy biBlLl9ob3N0Tm9kZX12YXIgcD1lKDExMSksZD1lKDExKSxmPWUoMzEpLGg9KGUoMTM0KSxkLklE X0FUVFJJQlVURV9OQU1FKSx2PWYsbT0iX19yZWFjdEludGVybmFsSW5zdGFuY2UkIitNYXRoLnJh bmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKSxnPXtnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9k ZTp1LGdldEluc3RhbmNlRnJvbU5vZGU6bCxnZXROb2RlRnJvbUluc3RhbmNlOmMscHJlY2FjaGVD aGlsZE5vZGVzOnMscHJlY2FjaGVOb2RlOmksdW5jYWNoZU5vZGU6YX07dC5leHBvcnRzPWd9LHsx MToxMSwxMTE6MTExLDEzNDoxMzQsMzE6MzF9XSwzMzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3Ry aWN0IjtmdW5jdGlvbiByKGUsdCl7dmFyIG49e190b3BMZXZlbFdyYXBwZXI6ZSxfaWRDb3VudGVy OjEsX293bmVyRG9jdW1lbnQ6dD90Lm5vZGVUeXBlPT09bz90OnQub3duZXJEb2N1bWVudDpudWxs LF9ub2RlOnQsX3RhZzp0P3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTpudWxsLF9uYW1lc3BhY2VV Ukk6dD90Lm5hbWVzcGFjZVVSSTpudWxsfTtyZXR1cm4gbn12YXIgbz0oZSgxMTYpLDkpO3QuZXhw b3J0cz1yfSx7MTE2OjExNn1dLDM0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciBy PWUoMTQwKSxvPWUoOSksaT1lKDMyKSxhPWZ1bmN0aW9uKGUpe3RoaXMuX2N1cnJlbnRFbGVtZW50 PW51bGwsdGhpcy5faG9zdE5vZGU9bnVsbCx0aGlzLl9ob3N0UGFyZW50PW51bGwsdGhpcy5faG9z dENvbnRhaW5lckluZm89bnVsbCx0aGlzLl9kb21JRD0wfTtyKGEucHJvdG90eXBlLHttb3VudENv bXBvbmVudDpmdW5jdGlvbihlLHQsbixyKXt2YXIgYT1uLl9pZENvdW50ZXIrKzt0aGlzLl9kb21J RD1hLHRoaXMuX2hvc3RQYXJlbnQ9dCx0aGlzLl9ob3N0Q29udGFpbmVySW5mbz1uO3ZhciBzPSIg cmVhY3QtZW1wdHk6ICIrdGhpcy5fZG9tSUQrIiAiO2lmKGUudXNlQ3JlYXRlRWxlbWVudCl7dmFy IHU9bi5fb3duZXJEb2N1bWVudCxsPXUuY3JlYXRlQ29tbWVudChzKTtyZXR1cm4gaS5wcmVjYWNo ZU5vZGUodGhpcyxsKSxvKGwpfXJldHVybiBlLnJlbmRlclRvU3RhdGljTWFya3VwPyIiOiI8IS0t IitzKyItLT4ifSxyZWNlaXZlQ29tcG9uZW50OmZ1bmN0aW9uKCl7fSxnZXRIb3N0Tm9kZTpmdW5j dGlvbigpe3JldHVybiBpLmdldE5vZGVGcm9tSW5zdGFuY2UodGhpcyl9LHVubW91bnRDb21wb25l bnQ6ZnVuY3Rpb24oKXtpLnVuY2FjaGVOb2RlKHRoaXMpfX0pLHQuZXhwb3J0cz1hfSx7MTQwOjE0 MCwzMjozMiw5Ojl9XSwzNTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDgp LG89ZSgzMiksaT17ZGFuZ2Vyb3VzbHlQcm9jZXNzQ2hpbGRyZW5VcGRhdGVzOmZ1bmN0aW9uKGUs dCl7dmFyIG49by5nZXROb2RlRnJvbUluc3RhbmNlKGUpO3IucHJvY2Vzc1VwZGF0ZXMobix0KX19 O3QuZXhwb3J0cz1pfSx7MzI6MzIsODo4fV0sMzY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmlj dCI7ZnVuY3Rpb24gcigpe3RoaXMuX3Jvb3ROb2RlSUQmJnAudXBkYXRlV3JhcHBlcih0aGlzKX1m dW5jdGlvbiBvKGUpe3ZhciB0PXRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzLG49dS5leGVjdXRl T25DaGFuZ2UodCxlKTtjLmFzYXAocix0aGlzKTt2YXIgbz10Lm5hbWU7aWYoInJhZGlvIj09PXQu dHlwZSYmbnVsbCE9byl7Zm9yKHZhciBhPWwuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0aGlzKSxzPWE7 cy5wYXJlbnROb2RlOylzPXMucGFyZW50Tm9kZTtmb3IodmFyIHA9cy5xdWVyeVNlbGVjdG9yQWxs KCJpbnB1dFtuYW1lPSIrSlNPTi5zdHJpbmdpZnkoIiIrbykrJ11bdHlwZT0icmFkaW8iXScpLGQ9 MDtkPHAubGVuZ3RoO2QrKyl7dmFyIGY9cFtkXTtpZihmIT09YSYmZi5mb3JtPT09YS5mb3JtKXt2 YXIgaD1sLmdldEluc3RhbmNlRnJvbU5vZGUoZik7aD92b2lkIDA6aSgiOTAiKSxjLmFzYXAocixo KX19fXJldHVybiBufXZhciBpPWUoMTExKSxhPWUoMTQwKSxzPWUoMTIpLHU9ZSgyMyksbD1lKDMy KSxjPWUoNzEpLHA9KGUoMTM0KSxlKDEzOSkse2dldEhvc3RQcm9wczpmdW5jdGlvbihlLHQpe3Zh ciBuPXUuZ2V0VmFsdWUodCkscj11LmdldENoZWNrZWQodCksbz1hKHt0eXBlOnZvaWQgMCxzdGVw OnZvaWQgMCxtaW46dm9pZCAwLG1heDp2b2lkIDB9LHQse2RlZmF1bHRDaGVja2VkOnZvaWQgMCxk ZWZhdWx0VmFsdWU6dm9pZCAwLHZhbHVlOm51bGwhPW4/bjplLl93cmFwcGVyU3RhdGUuaW5pdGlh bFZhbHVlLGNoZWNrZWQ6bnVsbCE9cj9yOmUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZCxv bkNoYW5nZTplLl93cmFwcGVyU3RhdGUub25DaGFuZ2V9KTtyZXR1cm4gb30sbW91bnRXcmFwcGVy OmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5kZWZhdWx0VmFsdWU7ZS5fd3JhcHBlclN0YXRlPXtpbml0 aWFsQ2hlY2tlZDpudWxsIT10LmNoZWNrZWQ/dC5jaGVja2VkOnQuZGVmYXVsdENoZWNrZWQsaW5p dGlhbFZhbHVlOm51bGwhPXQudmFsdWU/dC52YWx1ZTpuLGxpc3RlbmVyczpudWxsLG9uQ2hhbmdl Om8uYmluZChlKX19LHVwZGF0ZVdyYXBwZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5fY3VycmVudEVs ZW1lbnQucHJvcHMsbj10LmNoZWNrZWQ7bnVsbCE9biYmcy5zZXRWYWx1ZUZvclByb3BlcnR5KGwu Z2V0Tm9kZUZyb21JbnN0YW5jZShlKSwiY2hlY2tlZCIsbnx8ITEpO3ZhciByPWwuZ2V0Tm9kZUZy b21JbnN0YW5jZShlKSxvPXUuZ2V0VmFsdWUodCk7aWYobnVsbCE9byl7dmFyIGk9IiIrbztpIT09 ci52YWx1ZSYmKHIudmFsdWU9aSl9ZWxzZSBudWxsPT10LnZhbHVlJiZudWxsIT10LmRlZmF1bHRW YWx1ZSYmci5kZWZhdWx0VmFsdWUhPT0iIit0LmRlZmF1bHRWYWx1ZSYmKHIuZGVmYXVsdFZhbHVl PSIiK3QuZGVmYXVsdFZhbHVlKSxudWxsPT10LmNoZWNrZWQmJm51bGwhPXQuZGVmYXVsdENoZWNr ZWQmJihyLmRlZmF1bHRDaGVja2VkPSEhdC5kZWZhdWx0Q2hlY2tlZCl9LHBvc3RNb3VudFdyYXBw ZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5fY3VycmVudEVsZW1lbnQucHJvcHMsbj1sLmdldE5vZGVG cm9tSW5zdGFuY2UoZSk7c3dpdGNoKHQudHlwZSl7Y2FzZSJzdWJtaXQiOmNhc2UicmVzZXQiOmJy ZWFrO2Nhc2UiY29sb3IiOmNhc2UiZGF0ZSI6Y2FzZSJkYXRldGltZSI6Y2FzZSJkYXRldGltZS1s b2NhbCI6Y2FzZSJtb250aCI6Y2FzZSJ0aW1lIjpjYXNlIndlZWsiOm4udmFsdWU9IiIsbi52YWx1 ZT1uLmRlZmF1bHRWYWx1ZTticmVhaztkZWZhdWx0Om4udmFsdWU9bi52YWx1ZX12YXIgcj1uLm5h bWU7IiIhPT1yJiYobi5uYW1lPSIiKSxuLmRlZmF1bHRDaGVja2VkPSFuLmRlZmF1bHRDaGVja2Vk LG4uZGVmYXVsdENoZWNrZWQ9IW4uZGVmYXVsdENoZWNrZWQsIiIhPT1yJiYobi5uYW1lPXIpfX0p O3QuZXhwb3J0cz1wfSx7MTExOjExMSwxMjoxMiwxMzQ6MTM0LDEzOToxMzksMTQwOjE0MCwyMzoy MywzMjozMiw3MTo3MX1dLDM3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9u IHIoZSl7dmFyIHQ9IiI7cmV0dXJuIGkuQ2hpbGRyZW4uZm9yRWFjaChlLGZ1bmN0aW9uKGUpe251 bGwhPWUmJigic3RyaW5nIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZT90Kz1lOnV8fCh1 PSEwKSl9KSx0fXZhciBvPWUoMTQwKSxpPWUoMTE4KSxhPWUoMzIpLHM9ZSgzOCksdT0oZSgxMzkp LCExKSxsPXttb3VudFdyYXBwZXI6ZnVuY3Rpb24oZSx0LG4pe3ZhciBvPW51bGw7aWYobnVsbCE9 bil7dmFyIGk9bjsib3B0Z3JvdXAiPT09aS5fdGFnJiYoaT1pLl9ob3N0UGFyZW50KSxudWxsIT1p JiYic2VsZWN0Ij09PWkuX3RhZyYmKG89cy5nZXRTZWxlY3RWYWx1ZUNvbnRleHQoaSkpfXZhciBh PW51bGw7aWYobnVsbCE9byl7dmFyIHU7aWYodT1udWxsIT10LnZhbHVlP3QudmFsdWUrIiI6cih0 LmNoaWxkcmVuKSxhPSExLEFycmF5LmlzQXJyYXkobykpe2Zvcih2YXIgbD0wO2w8by5sZW5ndGg7 bCsrKWlmKCIiK29bbF09PT11KXthPSEwO2JyZWFrfX1lbHNlIGE9IiIrbz09PXV9ZS5fd3JhcHBl clN0YXRlPXtzZWxlY3RlZDphfX0scG9zdE1vdW50V3JhcHBlcjpmdW5jdGlvbihlKXt2YXIgdD1l Ll9jdXJyZW50RWxlbWVudC5wcm9wcztpZihudWxsIT10LnZhbHVlKXt2YXIgbj1hLmdldE5vZGVG cm9tSW5zdGFuY2UoZSk7bi5zZXRBdHRyaWJ1dGUoInZhbHVlIix0LnZhbHVlKX19LGdldEhvc3RQ cm9wczpmdW5jdGlvbihlLHQpe3ZhciBuPW8oe3NlbGVjdGVkOnZvaWQgMCxjaGlsZHJlbjp2b2lk IDB9LHQpO251bGwhPWUuX3dyYXBwZXJTdGF0ZS5zZWxlY3RlZCYmKG4uc2VsZWN0ZWQ9ZS5fd3Jh cHBlclN0YXRlLnNlbGVjdGVkKTt2YXIgaT1yKHQuY2hpbGRyZW4pO3JldHVybiBpJiYobi5jaGls ZHJlbj1pKSxufX07dC5leHBvcnRzPWx9LHsxMTg6MTE4LDEzOToxMzksMTQwOjE0MCwzMjozMiwz ODozOH1dLDM4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoKXtpZih0 aGlzLl9yb290Tm9kZUlEJiZ0aGlzLl93cmFwcGVyU3RhdGUucGVuZGluZ1VwZGF0ZSl7dGhpcy5f d3JhcHBlclN0YXRlLnBlbmRpbmdVcGRhdGU9ITE7dmFyIGU9dGhpcy5fY3VycmVudEVsZW1lbnQu cHJvcHMsdD1zLmdldFZhbHVlKGUpO251bGwhPXQmJm8odGhpcyxCb29sZWFuKGUubXVsdGlwbGUp LHQpfX1mdW5jdGlvbiBvKGUsdCxuKXt2YXIgcixvLGk9dS5nZXROb2RlRnJvbUluc3RhbmNlKGUp Lm9wdGlvbnM7aWYodCl7Zm9yKHI9e30sbz0wO288bi5sZW5ndGg7bysrKXJbIiIrbltvXV09ITA7 Zm9yKG89MDtvPGkubGVuZ3RoO28rKyl7dmFyIGE9ci5oYXNPd25Qcm9wZXJ0eShpW29dLnZhbHVl KTtpW29dLnNlbGVjdGVkIT09YSYmKGlbb10uc2VsZWN0ZWQ9YSl9fWVsc2V7Zm9yKHI9IiIrbixv PTA7bzxpLmxlbmd0aDtvKyspaWYoaVtvXS52YWx1ZT09PXIpcmV0dXJuIHZvaWQoaVtvXS5zZWxl Y3RlZD0hMCk7aS5sZW5ndGgmJihpWzBdLnNlbGVjdGVkPSEwKX19ZnVuY3Rpb24gaShlKXt2YXIg dD10aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcyxuPXMuZXhlY3V0ZU9uQ2hhbmdlKHQsZSk7cmV0 dXJuIHRoaXMuX3Jvb3ROb2RlSUQmJih0aGlzLl93cmFwcGVyU3RhdGUucGVuZGluZ1VwZGF0ZT0h MCksbC5hc2FwKHIsdGhpcyksbn12YXIgYT1lKDE0MCkscz1lKDIzKSx1PWUoMzIpLGw9ZSg3MSks Yz0oZSgxMzkpLCExKSxwPXtnZXRIb3N0UHJvcHM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYSh7fSx0 LHtvbkNoYW5nZTplLl93cmFwcGVyU3RhdGUub25DaGFuZ2UsdmFsdWU6dm9pZCAwfSl9LG1vdW50 V3JhcHBlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXMuZ2V0VmFsdWUodCk7ZS5fd3JhcHBlclN0YXRl PXtwZW5kaW5nVXBkYXRlOiExLGluaXRpYWxWYWx1ZTpudWxsIT1uP246dC5kZWZhdWx0VmFsdWUs bGlzdGVuZXJzOm51bGwsb25DaGFuZ2U6aS5iaW5kKGUpLHdhc011bHRpcGxlOkJvb2xlYW4odC5t dWx0aXBsZSl9LHZvaWQgMD09PXQudmFsdWV8fHZvaWQgMD09PXQuZGVmYXVsdFZhbHVlfHxjfHwo Yz0hMCl9LGdldFNlbGVjdFZhbHVlQ29udGV4dDpmdW5jdGlvbihlKXtyZXR1cm4gZS5fd3JhcHBl clN0YXRlLmluaXRpYWxWYWx1ZX0scG9zdFVwZGF0ZVdyYXBwZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9 ZS5fY3VycmVudEVsZW1lbnQucHJvcHM7ZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZT12b2lk IDA7dmFyIG49ZS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlO2UuX3dyYXBwZXJTdGF0ZS53YXNN dWx0aXBsZT1Cb29sZWFuKHQubXVsdGlwbGUpO3ZhciByPXMuZ2V0VmFsdWUodCk7bnVsbCE9cj8o ZS5fd3JhcHBlclN0YXRlLnBlbmRpbmdVcGRhdGU9ITEsbyhlLEJvb2xlYW4odC5tdWx0aXBsZSks cikpOm4hPT1Cb29sZWFuKHQubXVsdGlwbGUpJiYobnVsbCE9dC5kZWZhdWx0VmFsdWU/byhlLEJv b2xlYW4odC5tdWx0aXBsZSksdC5kZWZhdWx0VmFsdWUpOm8oZSxCb29sZWFuKHQubXVsdGlwbGUp LHQubXVsdGlwbGU/W106IiIpKX19O3QuZXhwb3J0cz1wfSx7MTM5OjEzOSwxNDA6MTQwLDIzOjIz LDMyOjMyLDcxOjcxfV0sMzk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24g cihlLHQsbixyKXtyZXR1cm4gZT09PW4mJnQ9PT1yfWZ1bmN0aW9uIG8oZSl7dmFyIHQ9ZG9jdW1l bnQuc2VsZWN0aW9uLG49dC5jcmVhdGVSYW5nZSgpLHI9bi50ZXh0Lmxlbmd0aCxvPW4uZHVwbGlj YXRlKCk7by5tb3ZlVG9FbGVtZW50VGV4dChlKSxvLnNldEVuZFBvaW50KCJFbmRUb1N0YXJ0Iixu KTt2YXIgaT1vLnRleHQubGVuZ3RoLGE9aStyO3JldHVybntzdGFydDppLGVuZDphfX1mdW5jdGlv biBpKGUpe3ZhciB0PXdpbmRvdy5nZXRTZWxlY3Rpb24mJndpbmRvdy5nZXRTZWxlY3Rpb24oKTtp ZighdHx8MD09PXQucmFuZ2VDb3VudClyZXR1cm4gbnVsbDt2YXIgbj10LmFuY2hvck5vZGUsbz10 LmFuY2hvck9mZnNldCxpPXQuZm9jdXNOb2RlLGE9dC5mb2N1c09mZnNldCxzPXQuZ2V0UmFuZ2VB dCgwKTt0cnl7cy5zdGFydENvbnRhaW5lci5ub2RlVHlwZSxzLmVuZENvbnRhaW5lci5ub2RlVHlw ZX1jYXRjaChlKXtyZXR1cm4gbnVsbH12YXIgdT1yKHQuYW5jaG9yTm9kZSx0LmFuY2hvck9mZnNl dCx0LmZvY3VzTm9kZSx0LmZvY3VzT2Zmc2V0KSxsPXU/MDpzLnRvU3RyaW5nKCkubGVuZ3RoLGM9 cy5jbG9uZVJhbmdlKCk7Yy5zZWxlY3ROb2RlQ29udGVudHMoZSksYy5zZXRFbmQocy5zdGFydENv bnRhaW5lcixzLnN0YXJ0T2Zmc2V0KTt2YXIgcD1yKGMuc3RhcnRDb250YWluZXIsYy5zdGFydE9m ZnNldCxjLmVuZENvbnRhaW5lcixjLmVuZE9mZnNldCksZD1wPzA6Yy50b1N0cmluZygpLmxlbmd0 aCxmPWQrbCxoPWRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7aC5zZXRTdGFydChuLG8pLGguc2V0RW5k KGksYSk7dmFyIHY9aC5jb2xsYXBzZWQ7cmV0dXJue3N0YXJ0OnY/ZjpkLGVuZDp2P2Q6Zn19ZnVu Y3Rpb24gYShlLHQpe3ZhciBuLHIsbz1kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKS5k dXBsaWNhdGUoKTt2b2lkIDA9PT10LmVuZD8obj10LnN0YXJ0LHI9bik6dC5zdGFydD50LmVuZD8o bj10LmVuZCxyPXQuc3RhcnQpOihuPXQuc3RhcnQscj10LmVuZCksby5tb3ZlVG9FbGVtZW50VGV4 dChlKSxvLm1vdmVTdGFydCgiY2hhcmFjdGVyIixuKSxvLnNldEVuZFBvaW50KCJFbmRUb1N0YXJ0 IixvKSxvLm1vdmVFbmQoImNoYXJhY3RlciIsci1uKSxvLnNlbGVjdCgpfWZ1bmN0aW9uIHMoZSx0 KXtpZih3aW5kb3cuZ2V0U2VsZWN0aW9uKXt2YXIgbj13aW5kb3cuZ2V0U2VsZWN0aW9uKCkscj1l W2MoKV0ubGVuZ3RoLG89TWF0aC5taW4odC5zdGFydCxyKSxpPXZvaWQgMD09PXQuZW5kP286TWF0 aC5taW4odC5lbmQscik7aWYoIW4uZXh0ZW5kJiZvPmkpe3ZhciBhPWk7aT1vLG89YX12YXIgcz1s KGUsbyksdT1sKGUsaSk7aWYocyYmdSl7dmFyIHA9ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtwLnNl dFN0YXJ0KHMubm9kZSxzLm9mZnNldCksbi5yZW1vdmVBbGxSYW5nZXMoKSxvPmk/KG4uYWRkUmFu Z2UocCksbi5leHRlbmQodS5ub2RlLHUub2Zmc2V0KSk6KHAuc2V0RW5kKHUubm9kZSx1Lm9mZnNl dCksbi5hZGRSYW5nZShwKSl9fX12YXIgdT1lKDEyMCksbD1lKDEwNCksYz1lKDEwNSkscD11LmNh blVzZURPTSYmInNlbGVjdGlvbiJpbiBkb2N1bWVudCYmISgiZ2V0U2VsZWN0aW9uImluIHdpbmRv dyksZD17Z2V0T2Zmc2V0czpwP286aSxzZXRPZmZzZXRzOnA/YTpzfTt0LmV4cG9ydHM9ZH0sezEw NDoxMDQsMTA1OjEwNSwxMjA6MTIwfV0sNDA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7 dmFyIHI9ZSg0Niksbz1lKDY3KSxpPWUoNzIpO3IuaW5qZWN0KCk7dmFyIGE9e3JlbmRlclRvU3Ry aW5nOm8ucmVuZGVyVG9TdHJpbmcscmVuZGVyVG9TdGF0aWNNYXJrdXA6by5yZW5kZXJUb1N0YXRp Y01hcmt1cCx2ZXJzaW9uOml9O3QuZXhwb3J0cz1hfSx7NDY6NDYsNjc6NjcsNzI6NzJ9XSw0MTpb ZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDQwKTt0LmV4cG9ydHM9cn0sezQw OjQwfV0sNDI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxMTEpLG89ZSgx NDApLGk9ZSg4KSxhPWUoOSkscz1lKDMyKSx1PWUoOTUpLGw9KGUoMTM0KSxlKDExNiksZnVuY3Rp b24oZSl7dGhpcy5fY3VycmVudEVsZW1lbnQ9ZSx0aGlzLl9zdHJpbmdUZXh0PSIiK2UsdGhpcy5f aG9zdE5vZGU9bnVsbCx0aGlzLl9ob3N0UGFyZW50PW51bGwsdGhpcy5fZG9tSUQ9MCx0aGlzLl9t b3VudEluZGV4PTAsdGhpcy5fY2xvc2luZ0NvbW1lbnQ9bnVsbCx0aGlzLl9jb21tZW50Tm9kZXM9 bnVsbH0pO28obC5wcm90b3R5cGUse21vdW50Q29tcG9uZW50OmZ1bmN0aW9uKGUsdCxuLHIpe3Zh ciBvPW4uX2lkQ291bnRlcisrLGk9IiByZWFjdC10ZXh0OiAiK28rIiAiLGw9IiAvcmVhY3QtdGV4 dCAiO2lmKHRoaXMuX2RvbUlEPW8sdGhpcy5faG9zdFBhcmVudD10LGUudXNlQ3JlYXRlRWxlbWVu dCl7dmFyIGM9bi5fb3duZXJEb2N1bWVudCxwPWMuY3JlYXRlQ29tbWVudChpKSxkPWMuY3JlYXRl Q29tbWVudChsKSxmPWEoYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkpO3JldHVybiBhLnF1ZXVl Q2hpbGQoZixhKHApKSx0aGlzLl9zdHJpbmdUZXh0JiZhLnF1ZXVlQ2hpbGQoZixhKGMuY3JlYXRl VGV4dE5vZGUodGhpcy5fc3RyaW5nVGV4dCkpKSxhLnF1ZXVlQ2hpbGQoZixhKGQpKSxzLnByZWNh Y2hlTm9kZSh0aGlzLHApLHRoaXMuX2Nsb3NpbmdDb21tZW50PWQsZn12YXIgaD11KHRoaXMuX3N0 cmluZ1RleHQpO3JldHVybiBlLnJlbmRlclRvU3RhdGljTWFya3VwP2g6IjwhLS0iK2krIi0tPiIr aCsiPCEtLSIrbCsiLS0+In0scmVjZWl2ZUNvbXBvbmVudDpmdW5jdGlvbihlLHQpe2lmKGUhPT10 aGlzLl9jdXJyZW50RWxlbWVudCl7dGhpcy5fY3VycmVudEVsZW1lbnQ9ZTt2YXIgbj0iIitlO2lm KG4hPT10aGlzLl9zdHJpbmdUZXh0KXt0aGlzLl9zdHJpbmdUZXh0PW47dmFyIHI9dGhpcy5nZXRI b3N0Tm9kZSgpO2kucmVwbGFjZURlbGltaXRlZFRleHQoclswXSxyWzFdLG4pOwotfX19LGdldEhv c3ROb2RlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fY29tbWVudE5vZGVzO2lmKGUpcmV0dXJuIGU7 aWYoIXRoaXMuX2Nsb3NpbmdDb21tZW50KWZvcih2YXIgdD1zLmdldE5vZGVGcm9tSW5zdGFuY2Uo dGhpcyksbj10Lm5leHRTaWJsaW5nOzspe2lmKG51bGw9PW4/cigiNjciLHRoaXMuX2RvbUlEKTp2 b2lkIDAsOD09PW4ubm9kZVR5cGUmJiIgL3JlYWN0LXRleHQgIj09PW4ubm9kZVZhbHVlKXt0aGlz Ll9jbG9zaW5nQ29tbWVudD1uO2JyZWFrfW49bi5uZXh0U2libGluZ31yZXR1cm4gZT1bdGhpcy5f aG9zdE5vZGUsdGhpcy5fY2xvc2luZ0NvbW1lbnRdLHRoaXMuX2NvbW1lbnROb2Rlcz1lLGV9LHVu bW91bnRDb21wb25lbnQ6ZnVuY3Rpb24oKXt0aGlzLl9jbG9zaW5nQ29tbWVudD1udWxsLHRoaXMu X2NvbW1lbnROb2Rlcz1udWxsLHMudW5jYWNoZU5vZGUodGhpcyl9fSksdC5leHBvcnRzPWx9LHsx MTE6MTExLDExNjoxMTYsMTM0OjEzNCwxNDA6MTQwLDMyOjMyLDg6OCw5OjksOTU6OTV9XSw0Mzpb ZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7dGhpcy5fcm9vdE5vZGVJ RCYmYy51cGRhdGVXcmFwcGVyKHRoaXMpfWZ1bmN0aW9uIG8oZSl7dmFyIHQ9dGhpcy5fY3VycmVu dEVsZW1lbnQucHJvcHMsbj1zLmV4ZWN1dGVPbkNoYW5nZSh0LGUpO3JldHVybiBsLmFzYXAocix0 aGlzKSxufXZhciBpPWUoMTExKSxhPWUoMTQwKSxzPWUoMjMpLHU9ZSgzMiksbD1lKDcxKSxjPShl KDEzNCksZSgxMzkpLHtnZXRIb3N0UHJvcHM6ZnVuY3Rpb24oZSx0KXtudWxsIT10LmRhbmdlcm91 c2x5U2V0SW5uZXJIVE1MP2koIjkxIik6dm9pZCAwO3ZhciBuPWEoe30sdCx7dmFsdWU6dm9pZCAw LGRlZmF1bHRWYWx1ZTp2b2lkIDAsY2hpbGRyZW46IiIrZS5fd3JhcHBlclN0YXRlLmluaXRpYWxW YWx1ZSxvbkNoYW5nZTplLl93cmFwcGVyU3RhdGUub25DaGFuZ2V9KTtyZXR1cm4gbn0sbW91bnRX cmFwcGVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49cy5nZXRWYWx1ZSh0KSxyPW47aWYobnVsbD09bil7 dmFyIGE9dC5kZWZhdWx0VmFsdWUsdT10LmNoaWxkcmVuO251bGwhPXUmJihudWxsIT1hP2koIjky Iik6dm9pZCAwLEFycmF5LmlzQXJyYXkodSkmJih1Lmxlbmd0aDw9MT92b2lkIDA6aSgiOTMiKSx1 PXVbMF0pLGE9IiIrdSksbnVsbD09YSYmKGE9IiIpLHI9YX1lLl93cmFwcGVyU3RhdGU9e2luaXRp YWxWYWx1ZToiIityLGxpc3RlbmVyczpudWxsLG9uQ2hhbmdlOm8uYmluZChlKX19LHVwZGF0ZVdy YXBwZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5fY3VycmVudEVsZW1lbnQucHJvcHMsbj11LmdldE5v ZGVGcm9tSW5zdGFuY2UoZSkscj1zLmdldFZhbHVlKHQpO2lmKG51bGwhPXIpe3ZhciBvPSIiK3I7 byE9PW4udmFsdWUmJihuLnZhbHVlPW8pLG51bGw9PXQuZGVmYXVsdFZhbHVlJiYobi5kZWZhdWx0 VmFsdWU9byl9bnVsbCE9dC5kZWZhdWx0VmFsdWUmJihuLmRlZmF1bHRWYWx1ZT10LmRlZmF1bHRW YWx1ZSl9LHBvc3RNb3VudFdyYXBwZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dS5nZXROb2RlRnJvbUlu c3RhbmNlKGUpLG49dC50ZXh0Q29udGVudDtuPT09ZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1 ZSYmKHQudmFsdWU9bil9fSk7dC5leHBvcnRzPWN9LHsxMTE6MTExLDEzNDoxMzQsMTM5OjEzOSwx NDA6MTQwLDIzOjIzLDMyOjMyLDcxOjcxfV0sNDQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmlj dCI7ZnVuY3Rpb24gcihlLHQpeyJfaG9zdE5vZGUiaW4gZT92b2lkIDA6dSgiMzMiKSwiX2hvc3RO b2RlImluIHQ/dm9pZCAwOnUoIjMzIik7Zm9yKHZhciBuPTAscj1lO3I7cj1yLl9ob3N0UGFyZW50 KW4rKztmb3IodmFyIG89MCxpPXQ7aTtpPWkuX2hvc3RQYXJlbnQpbysrO2Zvcig7bi1vPjA7KWU9 ZS5faG9zdFBhcmVudCxuLS07Zm9yKDtvLW4+MDspdD10Ll9ob3N0UGFyZW50LG8tLTtmb3IodmFy IGE9bjthLS07KXtpZihlPT09dClyZXR1cm4gZTtlPWUuX2hvc3RQYXJlbnQsdD10Ll9ob3N0UGFy ZW50fXJldHVybiBudWxsfWZ1bmN0aW9uIG8oZSx0KXsiX2hvc3ROb2RlImluIGU/dm9pZCAwOnUo IjM1IiksIl9ob3N0Tm9kZSJpbiB0P3ZvaWQgMDp1KCIzNSIpO2Zvcig7dDspe2lmKHQ9PT1lKXJl dHVybiEwO3Q9dC5faG9zdFBhcmVudH1yZXR1cm4hMX1mdW5jdGlvbiBpKGUpe3JldHVybiJfaG9z dE5vZGUiaW4gZT92b2lkIDA6dSgiMzYiKSxlLl9ob3N0UGFyZW50fWZ1bmN0aW9uIGEoZSx0LG4p e2Zvcih2YXIgcj1bXTtlOylyLnB1c2goZSksZT1lLl9ob3N0UGFyZW50O3ZhciBvO2ZvcihvPXIu bGVuZ3RoO28tLSA+MDspdChyW29dLCJjYXB0dXJlZCIsbik7Zm9yKG89MDtvPHIubGVuZ3RoO28r Kyl0KHJbb10sImJ1YmJsZWQiLG4pfWZ1bmN0aW9uIHMoZSx0LG4sbyxpKXtmb3IodmFyIGE9ZSYm dD9yKGUsdCk6bnVsbCxzPVtdO2UmJmUhPT1hOylzLnB1c2goZSksZT1lLl9ob3N0UGFyZW50O2Zv cih2YXIgdT1bXTt0JiZ0IT09YTspdS5wdXNoKHQpLHQ9dC5faG9zdFBhcmVudDt2YXIgbDtmb3Io bD0wO2w8cy5sZW5ndGg7bCsrKW4oc1tsXSwiYnViYmxlZCIsbyk7Zm9yKGw9dS5sZW5ndGg7bC0t ID4wOyluKHVbbF0sImNhcHR1cmVkIixpKX12YXIgdT1lKDExMSk7ZSgxMzQpO3QuZXhwb3J0cz17 aXNBbmNlc3RvcjpvLGdldExvd2VzdENvbW1vbkFuY2VzdG9yOnIsZ2V0UGFyZW50SW5zdGFuY2U6 aSx0cmF2ZXJzZVR3b1BoYXNlOmEsdHJhdmVyc2VFbnRlckxlYXZlOnN9fSx7MTExOjExMSwxMzQ6 MTM0fV0sNDU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcigpe3RoaXMu cmVpbml0aWFsaXplVHJhbnNhY3Rpb24oKX12YXIgbz1lKDE0MCksaT1lKDcxKSxhPWUoODkpLHM9 ZSgxMjYpLHU9e2luaXRpYWxpemU6cyxjbG9zZTpmdW5jdGlvbigpe2QuaXNCYXRjaGluZ1VwZGF0 ZXM9ITF9fSxsPXtpbml0aWFsaXplOnMsY2xvc2U6aS5mbHVzaEJhdGNoZWRVcGRhdGVzLmJpbmQo aSl9LGM9W2wsdV07byhyLnByb3RvdHlwZSxhLHtnZXRUcmFuc2FjdGlvbldyYXBwZXJzOmZ1bmN0 aW9uKCl7cmV0dXJuIGN9fSk7dmFyIHA9bmV3IHIsZD17aXNCYXRjaGluZ1VwZGF0ZXM6ITEsYmF0 Y2hlZFVwZGF0ZXM6ZnVuY3Rpb24oZSx0LG4scixvLGkpe3ZhciBhPWQuaXNCYXRjaGluZ1VwZGF0 ZXM7cmV0dXJuIGQuaXNCYXRjaGluZ1VwZGF0ZXM9ITAsYT9lKHQsbixyLG8saSk6cC5wZXJmb3Jt KGUsbnVsbCx0LG4scixvLGkpfX07dC5leHBvcnRzPWR9LHsxMjY6MTI2LDE0MDoxNDAsNzE6NzEs ODk6ODl9XSw0NjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7eHx8 KHg9ITAseS5FdmVudEVtaXR0ZXIuaW5qZWN0UmVhY3RFdmVudExpc3RlbmVyKGcpLHkuRXZlbnRQ bHVnaW5IdWIuaW5qZWN0RXZlbnRQbHVnaW5PcmRlcihzKSx5LkV2ZW50UGx1Z2luVXRpbHMuaW5q ZWN0Q29tcG9uZW50VHJlZShkKSx5LkV2ZW50UGx1Z2luVXRpbHMuaW5qZWN0VHJlZVRyYXZlcnNh bChoKSx5LkV2ZW50UGx1Z2luSHViLmluamVjdEV2ZW50UGx1Z2luc0J5TmFtZSh7U2ltcGxlRXZl bnRQbHVnaW46RSxFbnRlckxlYXZlRXZlbnRQbHVnaW46dSxDaGFuZ2VFdmVudFBsdWdpbjphLFNl bGVjdEV2ZW50UGx1Z2luOmIsQmVmb3JlSW5wdXRFdmVudFBsdWdpbjppfSkseS5Ib3N0Q29tcG9u ZW50LmluamVjdEdlbmVyaWNDb21wb25lbnRDbGFzcyhwKSx5Lkhvc3RDb21wb25lbnQuaW5qZWN0 VGV4dENvbXBvbmVudENsYXNzKHYpLHkuRE9NUHJvcGVydHkuaW5qZWN0RE9NUHJvcGVydHlDb25m aWcobykseS5ET01Qcm9wZXJ0eS5pbmplY3RET01Qcm9wZXJ0eUNvbmZpZyhsKSx5LkRPTVByb3Bl cnR5LmluamVjdERPTVByb3BlcnR5Q29uZmlnKF8pLHkuRW1wdHlDb21wb25lbnQuaW5qZWN0RW1w dHlDb21wb25lbnRGYWN0b3J5KGZ1bmN0aW9uKGUpe3JldHVybiBuZXcgZihlKX0pLHkuVXBkYXRl cy5pbmplY3RSZWNvbmNpbGVUcmFuc2FjdGlvbihDKSx5LlVwZGF0ZXMuaW5qZWN0QmF0Y2hpbmdT dHJhdGVneShtKSx5LkNvbXBvbmVudC5pbmplY3RFbnZpcm9ubWVudChjKSl9dmFyIG89ZSgxKSxp PWUoMyksYT1lKDcpLHM9ZSgxNCksdT1lKDE1KSxsPWUoMjEpLGM9ZSgyNykscD1lKDMwKSxkPWUo MzIpLGY9ZSgzNCksaD1lKDQ0KSx2PWUoNDIpLG09ZSg0NSksZz1lKDUxKSx5PWUoNTQpLEM9ZSg2 MyksXz1lKDczKSxiPWUoNzQpLEU9ZSg3NSkseD0hMTt0LmV4cG9ydHM9e2luamVjdDpyfX0sezE6 MSwxNDoxNCwxNToxNSwyMToyMSwyNzoyNywzOjMsMzA6MzAsMzI6MzIsMzQ6MzQsNDI6NDIsNDQ6 NDQsNDU6NDUsNTE6NTEsNTQ6NTQsNjM6NjMsNzo3LDczOjczLDc0Ojc0LDc1Ojc1fV0sNDc6W2Z1 bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJv bCYmU3ltYm9sLmZvciYmU3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpfHw2MDEwMzt0LmV4cG9y dHM9cn0se31dLDQ4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByLG89e2luamVj dEVtcHR5Q29tcG9uZW50RmFjdG9yeTpmdW5jdGlvbihlKXtyPWV9fSxpPXtjcmVhdGU6ZnVuY3Rp b24oZSl7cmV0dXJuIHIoZSl9fTtpLmluamVjdGlvbj1vLHQuZXhwb3J0cz1pfSx7fV0sNDk6W2Z1 bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbil7dHJ5e3Qobil9Y2F0 Y2goZSl7bnVsbD09PW8mJihvPWUpfX12YXIgbz1udWxsLGk9e2ludm9rZUd1YXJkZWRDYWxsYmFj azpyLGludm9rZUd1YXJkZWRDYWxsYmFja1dpdGhDYXRjaDpyLHJldGhyb3dDYXVnaHRFcnJvcjpm dW5jdGlvbigpe2lmKG8pe3ZhciBlPW87dGhyb3cgbz1udWxsLGV9fX07dC5leHBvcnRzPWl9LHt9 XSw1MDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe28uZW5xdWV1 ZUV2ZW50cyhlKSxvLnByb2Nlc3NFdmVudFF1ZXVlKCExKX12YXIgbz1lKDE2KSxpPXtoYW5kbGVU b3BMZXZlbDpmdW5jdGlvbihlLHQsbixpKXt2YXIgYT1vLmV4dHJhY3RFdmVudHMoZSx0LG4saSk7 cihhKX19O3QuZXhwb3J0cz1pfSx7MTY6MTZ9XSw1MTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3Ry aWN0IjtmdW5jdGlvbiByKGUpe2Zvcig7ZS5faG9zdFBhcmVudDspZT1lLl9ob3N0UGFyZW50O3Zh ciB0PXAuZ2V0Tm9kZUZyb21JbnN0YW5jZShlKSxuPXQucGFyZW50Tm9kZTtyZXR1cm4gcC5nZXRD bG9zZXN0SW5zdGFuY2VGcm9tTm9kZShuKX1mdW5jdGlvbiBvKGUsdCl7dGhpcy50b3BMZXZlbFR5 cGU9ZSx0aGlzLm5hdGl2ZUV2ZW50PXQsdGhpcy5hbmNlc3RvcnM9W119ZnVuY3Rpb24gaShlKXt2 YXIgdD1mKGUubmF0aXZlRXZlbnQpLG49cC5nZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSh0KSxv PW47ZG8gZS5hbmNlc3RvcnMucHVzaChvKSxvPW8mJnIobyk7d2hpbGUobyk7Zm9yKHZhciBpPTA7 aTxlLmFuY2VzdG9ycy5sZW5ndGg7aSsrKW49ZS5hbmNlc3RvcnNbaV0sdi5faGFuZGxlVG9wTGV2 ZWwoZS50b3BMZXZlbFR5cGUsbixlLm5hdGl2ZUV2ZW50LGYoZS5uYXRpdmVFdmVudCkpfWZ1bmN0 aW9uIGEoZSl7dmFyIHQ9aCh3aW5kb3cpO2UodCl9dmFyIHM9ZSgxNDApLHU9ZSgxMTkpLGw9ZSgx MjApLGM9ZSgyNCkscD1lKDMyKSxkPWUoNzEpLGY9ZSgxMDEpLGg9ZSgxMzEpO3Moby5wcm90b3R5 cGUse2Rlc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLnRvcExldmVsVHlwZT1udWxsLHRoaXMubmF0 aXZlRXZlbnQ9bnVsbCx0aGlzLmFuY2VzdG9ycy5sZW5ndGg9MH19KSxjLmFkZFBvb2xpbmdUbyhv LGMudHdvQXJndW1lbnRQb29sZXIpO3ZhciB2PXtfZW5hYmxlZDohMCxfaGFuZGxlVG9wTGV2ZWw6 bnVsbCxXSU5ET1dfSEFORExFOmwuY2FuVXNlRE9NP3dpbmRvdzpudWxsLHNldEhhbmRsZVRvcExl dmVsOmZ1bmN0aW9uKGUpe3YuX2hhbmRsZVRvcExldmVsPWV9LHNldEVuYWJsZWQ6ZnVuY3Rpb24o ZSl7di5fZW5hYmxlZD0hIWV9LGlzRW5hYmxlZDpmdW5jdGlvbigpe3JldHVybiB2Ll9lbmFibGVk fSx0cmFwQnViYmxlZEV2ZW50OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj91Lmxpc3RlbihuLHQs di5kaXNwYXRjaEV2ZW50LmJpbmQobnVsbCxlKSk6bnVsbH0sdHJhcENhcHR1cmVkRXZlbnQ6ZnVu Y3Rpb24oZSx0LG4pe3JldHVybiBuP3UuY2FwdHVyZShuLHQsdi5kaXNwYXRjaEV2ZW50LmJpbmQo bnVsbCxlKSk6bnVsbH0sbW9uaXRvclNjcm9sbFZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWEuYmlu ZChudWxsLGUpO3UubGlzdGVuKHdpbmRvdywic2Nyb2xsIix0KX0sZGlzcGF0Y2hFdmVudDpmdW5j dGlvbihlLHQpe2lmKHYuX2VuYWJsZWQpe3ZhciBuPW8uZ2V0UG9vbGVkKGUsdCk7dHJ5e2QuYmF0 Y2hlZFVwZGF0ZXMoaSxuKX1maW5hbGx5e28ucmVsZWFzZShuKX19fX07dC5leHBvcnRzPXZ9LHsx MDE6MTAxLDExOToxMTksMTIwOjEyMCwxMzE6MTMxLDE0MDoxNDAsMjQ6MjQsMzI6MzIsNzE6NzF9 XSw1MjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17bG9nVG9wTGV2ZWxSZW5k ZXJzOiExfTt0LmV4cG9ydHM9cn0se31dLDUzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3Qi O2Z1bmN0aW9uIHIoZSl7cmV0dXJuIHM/dm9pZCAwOmEoIjExMSIsZS50eXBlKSxuZXcgcyhlKX1m dW5jdGlvbiBvKGUpe3JldHVybiBuZXcgdShlKX1mdW5jdGlvbiBpKGUpe3JldHVybiBlIGluc3Rh bmNlb2YgdX12YXIgYT1lKDExMSkscz0oZSgxMzQpLG51bGwpLHU9bnVsbCxsPXtpbmplY3RHZW5l cmljQ29tcG9uZW50Q2xhc3M6ZnVuY3Rpb24oZSl7cz1lfSxpbmplY3RUZXh0Q29tcG9uZW50Q2xh c3M6ZnVuY3Rpb24oZSl7dT1lfX0sYz17Y3JlYXRlSW50ZXJuYWxDb21wb25lbnQ6cixjcmVhdGVJ bnN0YW5jZUZvclRleHQ6byxpc1RleHRDb21wb25lbnQ6aSxpbmplY3Rpb246bH07dC5leHBvcnRz PWN9LHsxMTE6MTExLDEzNDoxMzR9XSw1NDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2 YXIgcj1lKDExKSxvPWUoMTYpLGk9ZSgxOCksYT1lKDI4KSxzPWUoNDgpLHU9ZSgyNSksbD1lKDUz KSxjPWUoNzEpLHA9e0NvbXBvbmVudDphLmluamVjdGlvbixET01Qcm9wZXJ0eTpyLmluamVjdGlv bixFbXB0eUNvbXBvbmVudDpzLmluamVjdGlvbixFdmVudFBsdWdpbkh1YjpvLmluamVjdGlvbixF dmVudFBsdWdpblV0aWxzOmkuaW5qZWN0aW9uLEV2ZW50RW1pdHRlcjp1LmluamVjdGlvbixIb3N0 Q29tcG9uZW50OmwuaW5qZWN0aW9uLFVwZGF0ZXM6Yy5pbmplY3Rpb259O3QuZXhwb3J0cz1wfSx7 MTE6MTEsMTY6MTYsMTg6MTgsMjU6MjUsMjg6MjgsNDg6NDgsNTM6NTMsNzE6NzF9XSw1NTpbZnVu Y3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBpKGRvY3VtZW50 LmRvY3VtZW50RWxlbWVudCxlKX12YXIgbz1lKDM5KSxpPWUoMTIzKSxhPWUoMTI4KSxzPWUoMTI5 KSx1PXtoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5ub2Rl TmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiB0JiYoImlucHV0Ij09PXQmJiJ0 ZXh0Ij09PWUudHlwZXx8InRleHRhcmVhIj09PXR8fCJ0cnVlIj09PWUuY29udGVudEVkaXRhYmxl KX0sZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb246ZnVuY3Rpb24oKXt2YXIgZT1zKCk7cmV0dXJue2Zv Y3VzZWRFbGVtOmUsc2VsZWN0aW9uUmFuZ2U6dS5oYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMoZSk/ dS5nZXRTZWxlY3Rpb24oZSk6bnVsbH19LHJlc3RvcmVTZWxlY3Rpb246ZnVuY3Rpb24oZSl7dmFy IHQ9cygpLG49ZS5mb2N1c2VkRWxlbSxvPWUuc2VsZWN0aW9uUmFuZ2U7dCE9PW4mJnIobikmJih1 Lmhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhuKSYmdS5zZXRTZWxlY3Rpb24obixvKSxhKG4pKX0s Z2V0U2VsZWN0aW9uOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKCJzZWxlY3Rpb25TdGFydCJpbiBlKXQ9 e3N0YXJ0OmUuc2VsZWN0aW9uU3RhcnQsZW5kOmUuc2VsZWN0aW9uRW5kfTtlbHNlIGlmKGRvY3Vt ZW50LnNlbGVjdGlvbiYmZS5ub2RlTmFtZSYmImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNh c2UoKSl7dmFyIG49ZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7bi5wYXJlbnRFbGVt ZW50KCk9PT1lJiYodD17c3RhcnQ6LW4ubW92ZVN0YXJ0KCJjaGFyYWN0ZXIiLC1lLnZhbHVlLmxl bmd0aCksZW5kOi1uLm1vdmVFbmQoImNoYXJhY3RlciIsLWUudmFsdWUubGVuZ3RoKX0pfWVsc2Ug dD1vLmdldE9mZnNldHMoZSk7cmV0dXJuIHR8fHtzdGFydDowLGVuZDowfX0sc2V0U2VsZWN0aW9u OmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5zdGFydCxyPXQuZW5kO2lmKHZvaWQgMD09PXImJihyPW4p LCJzZWxlY3Rpb25TdGFydCJpbiBlKWUuc2VsZWN0aW9uU3RhcnQ9bixlLnNlbGVjdGlvbkVuZD1N YXRoLm1pbihyLGUudmFsdWUubGVuZ3RoKTtlbHNlIGlmKGRvY3VtZW50LnNlbGVjdGlvbiYmZS5u b2RlTmFtZSYmImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7dmFyIGk9ZS5jcmVh dGVUZXh0UmFuZ2UoKTtpLmNvbGxhcHNlKCEwKSxpLm1vdmVTdGFydCgiY2hhcmFjdGVyIixuKSxp Lm1vdmVFbmQoImNoYXJhY3RlciIsci1uKSxpLnNlbGVjdCgpfWVsc2Ugby5zZXRPZmZzZXRzKGUs dCl9fTt0LmV4cG9ydHM9dX0sezEyMzoxMjMsMTI4OjEyOCwxMjk6MTI5LDM5OjM5fV0sNTY6W2Z1 bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9e3JlbW92ZTpmdW5jdGlvbihlKXtlLl9y ZWFjdEludGVybmFsSW5zdGFuY2U9dm9pZCAwfSxnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX3Jl YWN0SW50ZXJuYWxJbnN0YW5jZX0saGFzOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDAhPT1lLl9y ZWFjdEludGVybmFsSW5zdGFuY2V9LHNldDpmdW5jdGlvbihlLHQpe2UuX3JlYWN0SW50ZXJuYWxJ bnN0YW5jZT10fX07dC5leHBvcnRzPXJ9LHt9XSw1NzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3Ry aWN0Ijt2YXIgcj1udWxsO3QuZXhwb3J0cz17ZGVidWdUb29sOnJ9fSx7fV0sNTg6W2Z1bmN0aW9u KGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSg5Miksbz0vXC8/Pi8saT0vXjxcIVwtXC0vLGE9 e0NIRUNLU1VNX0FUVFJfTkFNRToiZGF0YS1yZWFjdC1jaGVja3N1bSIsYWRkQ2hlY2tzdW1Ub01h cmt1cDpmdW5jdGlvbihlKXt2YXIgdD1yKGUpO3JldHVybiBpLnRlc3QoZSk/ZTplLnJlcGxhY2Uo bywiICIrYS5DSEVDS1NVTV9BVFRSX05BTUUrJz0iJyt0KyciJCYnKX0sY2FuUmV1c2VNYXJrdXA6 ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmdldEF0dHJpYnV0ZShhLkNIRUNLU1VNX0FUVFJfTkFNRSk7 bj1uJiZwYXJzZUludChuLDEwKTt2YXIgbz1yKGUpO3JldHVybiBvPT09bn19O3QuZXhwb3J0cz1h fSx7OTI6OTJ9XSw1OTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUs dCxuKXtyZXR1cm57dHlwZToiSU5TRVJUX01BUktVUCIsY29udGVudDplLGZyb21JbmRleDpudWxs LGZyb21Ob2RlOm51bGwsdG9JbmRleDpuLGFmdGVyTm9kZTp0fX1mdW5jdGlvbiBvKGUsdCxuKXty ZXR1cm57dHlwZToiTU9WRV9FWElTVElORyIsY29udGVudDpudWxsLGZyb21JbmRleDplLl9tb3Vu dEluZGV4LGZyb21Ob2RlOmQuZ2V0SG9zdE5vZGUoZSksdG9JbmRleDpuLGFmdGVyTm9kZTp0fX1m dW5jdGlvbiBpKGUsdCl7cmV0dXJue3R5cGU6IlJFTU9WRV9OT0RFIixjb250ZW50Om51bGwsZnJv bUluZGV4OmUuX21vdW50SW5kZXgsZnJvbU5vZGU6dCx0b0luZGV4Om51bGwsYWZ0ZXJOb2RlOm51 bGx9fWZ1bmN0aW9uIGEoZSl7cmV0dXJue3R5cGU6IlNFVF9NQVJLVVAiLGNvbnRlbnQ6ZSxmcm9t SW5kZXg6bnVsbCxmcm9tTm9kZTpudWxsLHRvSW5kZXg6bnVsbCxhZnRlck5vZGU6bnVsbH19ZnVu Y3Rpb24gcyhlKXtyZXR1cm57dHlwZToiVEVYVF9DT05URU5UIixjb250ZW50OmUsZnJvbUluZGV4 Om51bGwsZnJvbU5vZGU6bnVsbCx0b0luZGV4Om51bGwsYWZ0ZXJOb2RlOm51bGx9fWZ1bmN0aW9u IHUoZSx0KXtyZXR1cm4gdCYmKGU9ZXx8W10sZS5wdXNoKHQpKSxlfWZ1bmN0aW9uIGwoZSx0KXtw LnByb2Nlc3NDaGlsZHJlblVwZGF0ZXMoZSx0KX12YXIgYz1lKDExMSkscD1lKDI4KSxkPShlKDU2 KSxlKDU3KSxlKDExNyksZSg2NCkpLGY9ZSgyNiksaD0oZSgxMjYpLGUoOTYpKSx2PShlKDEzNCks e01peGluOntfcmVjb25jaWxlckluc3RhbnRpYXRlQ2hpbGRyZW46ZnVuY3Rpb24oZSx0LG4pe3Jl dHVybiBmLmluc3RhbnRpYXRlQ2hpbGRyZW4oZSx0LG4pfSxfcmVjb25jaWxlclVwZGF0ZUNoaWxk cmVuOmZ1bmN0aW9uKGUsdCxuLHIsbyxpKXt2YXIgYSxzPTA7cmV0dXJuIGE9aCh0LHMpLGYudXBk YXRlQ2hpbGRyZW4oZSxhLG4scixvLHRoaXMsdGhpcy5faG9zdENvbnRhaW5lckluZm8saSxzKSxh fSxtb3VudENoaWxkcmVuOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLl9yZWNvbmNpbGVySW5z dGFudGlhdGVDaGlsZHJlbihlLHQsbik7dGhpcy5fcmVuZGVyZWRDaGlsZHJlbj1yO3ZhciBvPVtd LGk9MDtmb3IodmFyIGEgaW4gcilpZihyLmhhc093blByb3BlcnR5KGEpKXt2YXIgcz1yW2FdLHU9 MCxsPWQubW91bnRDb21wb25lbnQocyx0LHRoaXMsdGhpcy5faG9zdENvbnRhaW5lckluZm8sbix1 KTtzLl9tb3VudEluZGV4PWkrKyxvLnB1c2gobCl9cmV0dXJuIG99LHVwZGF0ZVRleHRDb250ZW50 OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX3JlbmRlcmVkQ2hpbGRyZW47Zi51bm1vdW50Q2hpbGRy ZW4odCwhMSk7Zm9yKHZhciBuIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmYygiMTE4Iik7dmFy IHI9W3MoZSldO2wodGhpcyxyKX0sdXBkYXRlTWFya3VwOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMu X3JlbmRlcmVkQ2hpbGRyZW47Zi51bm1vdW50Q2hpbGRyZW4odCwhMSk7Zm9yKHZhciBuIGluIHQp dC5oYXNPd25Qcm9wZXJ0eShuKSYmYygiMTE4Iik7dmFyIHI9W2EoZSldO2wodGhpcyxyKX0sdXBk YXRlQ2hpbGRyZW46ZnVuY3Rpb24oZSx0LG4pe3RoaXMuX3VwZGF0ZUNoaWxkcmVuKGUsdCxuKX0s X3VwZGF0ZUNoaWxkcmVuOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLl9yZW5kZXJlZENoaWxk cmVuLG89e30saT1bXSxhPXRoaXMuX3JlY29uY2lsZXJVcGRhdGVDaGlsZHJlbihyLGUsaSxvLHQs bik7aWYoYXx8cil7dmFyIHMsYz1udWxsLHA9MCxmPTAsaD0wLHY9bnVsbDtmb3IocyBpbiBhKWlm KGEuaGFzT3duUHJvcGVydHkocykpe3ZhciBtPXImJnJbc10sZz1hW3NdO209PT1nPyhjPXUoYyx0 aGlzLm1vdmVDaGlsZChtLHYscCxmKSksZj1NYXRoLm1heChtLl9tb3VudEluZGV4LGYpLG0uX21v dW50SW5kZXg9cCk6KG0mJihmPU1hdGgubWF4KG0uX21vdW50SW5kZXgsZikpLGM9dShjLHRoaXMu X21vdW50Q2hpbGRBdEluZGV4KGcsaVtoXSx2LHAsdCxuKSksaCsrKSxwKyssdj1kLmdldEhvc3RO b2RlKGcpfWZvcihzIGluIG8pby5oYXNPd25Qcm9wZXJ0eShzKSYmKGM9dShjLHRoaXMuX3VubW91 bnRDaGlsZChyW3NdLG9bc10pKSk7YyYmbCh0aGlzLGMpLHRoaXMuX3JlbmRlcmVkQ2hpbGRyZW49 YX19LHVubW91bnRDaGlsZHJlbjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9yZW5kZXJlZENoaWxk cmVuO2YudW5tb3VudENoaWxkcmVuKHQsZSksdGhpcy5fcmVuZGVyZWRDaGlsZHJlbj1udWxsfSxt b3ZlQ2hpbGQ6ZnVuY3Rpb24oZSx0LG4scil7aWYoZS5fbW91bnRJbmRleDxyKXJldHVybiBvKGUs dCxuKX0sY3JlYXRlQ2hpbGQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiByKG4sdCxlLl9tb3VudElu ZGV4KX0scmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaShlLHQpfSxfbW91bnRDaGls ZEF0SW5kZXg6ZnVuY3Rpb24oZSx0LG4scixvLGkpe3JldHVybiBlLl9tb3VudEluZGV4PXIsdGhp cy5jcmVhdGVDaGlsZChlLG4sdCl9LF91bm1vdW50Q2hpbGQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj10 aGlzLnJlbW92ZUNoaWxkKGUsdCk7cmV0dXJuIGUuX21vdW50SW5kZXg9bnVsbCxufX19KTt0LmV4 cG9ydHM9dn0sezExMToxMTEsMTE3OjExNywxMjY6MTI2LDEzNDoxMzQsMjY6MjYsMjg6MjgsNTY6 NTYsNTc6NTcsNjQ6NjQsOTY6OTZ9XSw2MDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2 YXIgcj1lKDExMSksbz1lKDExOCksaT0oZSgxMzQpLHtIT1NUOjAsQ09NUE9TSVRFOjEsRU1QVFk6 MixnZXRUeXBlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZXx8ZT09PSExP2kuRU1QVFk6by5p c1ZhbGlkRWxlbWVudChlKT8iZnVuY3Rpb24iPT10eXBlb2YgZS50eXBlP2kuQ09NUE9TSVRFOmku SE9TVDp2b2lkIHIoIjI2IixlKX19KTt0LmV4cG9ydHM9aX0sezExMToxMTEsMTE4OjExOCwxMzQ6 MTM0fV0sNjE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1 cm4hKCFlfHwiZnVuY3Rpb24iIT10eXBlb2YgZS5hdHRhY2hSZWZ8fCJmdW5jdGlvbiIhPXR5cGVv ZiBlLmRldGFjaFJlZil9dmFyIG89ZSgxMTEpLGk9KGUoMTM0KSx7YWRkQ29tcG9uZW50QXNSZWZU bzpmdW5jdGlvbihlLHQsbil7cihuKT92b2lkIDA6bygiMTE5Iiksbi5hdHRhY2hSZWYodCxlKX0s cmVtb3ZlQ29tcG9uZW50QXNSZWZGcm9tOmZ1bmN0aW9uKGUsdCxuKXtyKG4pP3ZvaWQgMDpvKCIx MjAiKTt2YXIgaT1uLmdldFB1YmxpY0luc3RhbmNlKCk7aSYmaS5yZWZzW3RdPT09ZS5nZXRQdWJs aWNJbnN0YW5jZSgpJiZuLmRldGFjaFJlZih0KX19KTt0LmV4cG9ydHM9aX0sezExMToxMTEsMTM0 OjEzNH1dLDYyOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPSJTRUNSRVRfRE9f Tk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCI7dC5leHBvcnRzPXJ9LHt9XSw2Mzpb ZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3RoaXMucmVpbml0aWFs aXplVHJhbnNhY3Rpb24oKSx0aGlzLnJlbmRlclRvU3RhdGljTWFya3VwPSExLHRoaXMucmVhY3RN b3VudFJlYWR5PWkuZ2V0UG9vbGVkKG51bGwpLHRoaXMudXNlQ3JlYXRlRWxlbWVudD1lfXZhciBv PWUoMTQwKSxpPWUoNiksYT1lKDI0KSxzPWUoMjUpLHU9ZSg1NSksbD0oZSg1NyksZSg4OSkpLGM9 ZSg3MCkscD17aW5pdGlhbGl6ZTp1LmdldFNlbGVjdGlvbkluZm9ybWF0aW9uLGNsb3NlOnUucmVz dG9yZVNlbGVjdGlvbn0sZD17aW5pdGlhbGl6ZTpmdW5jdGlvbigpe3ZhciBlPXMuaXNFbmFibGVk KCk7cmV0dXJuIHMuc2V0RW5hYmxlZCghMSksZX0sY2xvc2U6ZnVuY3Rpb24oZSl7cy5zZXRFbmFi bGVkKGUpfX0sZj17aW5pdGlhbGl6ZTpmdW5jdGlvbigpe3RoaXMucmVhY3RNb3VudFJlYWR5LnJl c2V0KCl9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy5yZWFjdE1vdW50UmVhZHkubm90aWZ5QWxsKCl9 fSxoPVtwLGQsZl0sdj17Z2V0VHJhbnNhY3Rpb25XcmFwcGVyczpmdW5jdGlvbigpe3JldHVybiBo fSxnZXRSZWFjdE1vdW50UmVhZHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFjdE1vdW50UmVh ZHl9LGdldFVwZGF0ZVF1ZXVlOmZ1bmN0aW9uKCl7cmV0dXJuIGN9LGNoZWNrcG9pbnQ6ZnVuY3Rp b24oKXtyZXR1cm4gdGhpcy5yZWFjdE1vdW50UmVhZHkuY2hlY2twb2ludCgpfSxyb2xsYmFjazpm dW5jdGlvbihlKXt0aGlzLnJlYWN0TW91bnRSZWFkeS5yb2xsYmFjayhlKX0sZGVzdHJ1Y3Rvcjpm dW5jdGlvbigpe2kucmVsZWFzZSh0aGlzLnJlYWN0TW91bnRSZWFkeSksdGhpcy5yZWFjdE1vdW50 UmVhZHk9bnVsbH19O28oci5wcm90b3R5cGUsbCx2KSxhLmFkZFBvb2xpbmdUbyhyKSx0LmV4cG9y dHM9cn0sezE0MDoxNDAsMjQ6MjQsMjU6MjUsNTU6NTUsNTc6NTcsNjo2LDcwOjcwLDg5Ojg5fV0s NjQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcigpe28uYXR0YWNoUmVm cyh0aGlzLHRoaXMuX2N1cnJlbnRFbGVtZW50KX12YXIgbz1lKDY1KSxpPShlKDU3KSxlKDEzOSks e21vdW50Q29tcG9uZW50OmZ1bmN0aW9uKGUsdCxuLG8saSxhKXt2YXIgcz1lLm1vdW50Q29tcG9u ZW50KHQsbixvLGksYSk7cmV0dXJuIGUuX2N1cnJlbnRFbGVtZW50JiZudWxsIT1lLl9jdXJyZW50 RWxlbWVudC5yZWYmJnQuZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShyLGUpLHN9LGdldEhv c3ROb2RlOmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEhvc3ROb2RlKCl9LHVubW91bnRDb21wb25l bnQ6ZnVuY3Rpb24oZSx0KXtvLmRldGFjaFJlZnMoZSxlLl9jdXJyZW50RWxlbWVudCksZS51bm1v dW50Q29tcG9uZW50KHQpfSxyZWNlaXZlQ29tcG9uZW50OmZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBh PWUuX2N1cnJlbnRFbGVtZW50O2lmKHQhPT1hfHxpIT09ZS5fY29udGV4dCl7dmFyIHM9by5zaG91 bGRVcGRhdGVSZWZzKGEsdCk7cyYmby5kZXRhY2hSZWZzKGUsYSksZS5yZWNlaXZlQ29tcG9uZW50 KHQsbixpKSxzJiZlLl9jdXJyZW50RWxlbWVudCYmbnVsbCE9ZS5fY3VycmVudEVsZW1lbnQucmVm JiZuLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUocixlKX19LHBlcmZvcm1VcGRhdGVJZk5l Y2Vzc2FyeTpmdW5jdGlvbihlLHQsbil7ZS5fdXBkYXRlQmF0Y2hOdW1iZXI9PT1uJiZlLnBlcmZv cm1VcGRhdGVJZk5lY2Vzc2FyeSh0KX19KTt0LmV4cG9ydHM9aX0sezEzOToxMzksNTc6NTcsNjU6 NjV9XSw2NTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuKXsi ZnVuY3Rpb24iPT10eXBlb2YgZT9lKHQuZ2V0UHVibGljSW5zdGFuY2UoKSk6aS5hZGRDb21wb25l bnRBc1JlZlRvKHQsZSxuKX1mdW5jdGlvbiBvKGUsdCxuKXsiZnVuY3Rpb24iPT10eXBlb2YgZT9l KG51bGwpOmkucmVtb3ZlQ29tcG9uZW50QXNSZWZGcm9tKHQsZSxuKX12YXIgaT1lKDYxKSxhPXt9 O2EuYXR0YWNoUmVmcz1mdW5jdGlvbihlLHQpe2lmKG51bGwhPT10JiYib2JqZWN0Ij09dHlwZW9m IHQpe3ZhciBuPXQucmVmO251bGwhPW4mJnIobixlLHQuX293bmVyKX19LGEuc2hvdWxkVXBkYXRl UmVmcz1mdW5jdGlvbihlLHQpe3ZhciBuPW51bGwscj1udWxsO251bGwhPT1lJiYib2JqZWN0Ij09 dHlwZW9mIGUmJihuPWUucmVmLHI9ZS5fb3duZXIpO3ZhciBvPW51bGwsaT1udWxsO3JldHVybiBu dWxsIT09dCYmIm9iamVjdCI9PXR5cGVvZiB0JiYobz10LnJlZixpPXQuX293bmVyKSxuIT09b3x8 InN0cmluZyI9PXR5cGVvZiBvJiZpIT09cn0sYS5kZXRhY2hSZWZzPWZ1bmN0aW9uKGUsdCl7aWYo bnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdCl7dmFyIG49dC5yZWY7bnVsbCE9biYmbyhuLGUs dC5fb3duZXIpfX0sdC5leHBvcnRzPWF9LHs2MTo2MX1dLDY2OltmdW5jdGlvbihlLHQsbil7InVz ZSBzdHJpY3QiO3ZhciByPXtpc0JhdGNoaW5nVXBkYXRlczohMSxiYXRjaGVkVXBkYXRlczpmdW5j dGlvbihlKXt9fTt0LmV4cG9ydHM9cn0se31dLDY3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJp Y3QiO2Z1bmN0aW9uIHIoZSx0KXt2YXIgbjt0cnl7cmV0dXJuIGguaW5qZWN0aW9uLmluamVjdEJh dGNoaW5nU3RyYXRlZ3koZCksbj1mLmdldFBvb2xlZCh0KSxnKyssbi5wZXJmb3JtKGZ1bmN0aW9u KCl7dmFyIHI9bShlLCEwKSxvPXAubW91bnRDb21wb25lbnQocixuLG51bGwsdSgpLHYsMCk7cmV0 dXJuIHR8fChvPWMuYWRkQ2hlY2tzdW1Ub01hcmt1cChvKSksb30sbnVsbCl9ZmluYWxseXtnLS0s Zi5yZWxlYXNlKG4pLGd8fGguaW5qZWN0aW9uLmluamVjdEJhdGNoaW5nU3RyYXRlZ3kobCl9fWZ1 bmN0aW9uIG8oZSl7cmV0dXJuIHMuaXNWYWxpZEVsZW1lbnQoZSk/dm9pZCAwOmEoIjQ2Iikscihl LCExKX1mdW5jdGlvbiBpKGUpe3JldHVybiBzLmlzVmFsaWRFbGVtZW50KGUpP3ZvaWQgMDphKCI0 NyIpLHIoZSwhMCl9dmFyIGE9ZSgxMTEpLHM9ZSgxMTgpLHU9ZSgzMyksbD1lKDQ1KSxjPShlKDU3 KSxlKDU4KSkscD1lKDY0KSxkPWUoNjYpLGY9ZSg2OCksaD1lKDcxKSx2PWUoMTI3KSxtPWUoMTA3 KSxnPShlKDEzNCksMCk7dC5leHBvcnRzPXtyZW5kZXJUb1N0cmluZzpvLHJlbmRlclRvU3RhdGlj TWFya3VwOml9fSx7MTA3OjEwNywxMTE6MTExLDExODoxMTgsMTI3OjEyNywxMzQ6MTM0LDMzOjMz LDQ1OjQ1LDU3OjU3LDU4OjU4LDY0OjY0LDY2OjY2LDY4OjY4LDcxOjcxfV0sNjg6W2Z1bmN0aW9u KGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt0aGlzLnJlaW5pdGlhbGl6ZVRyYW5z YWN0aW9uKCksdGhpcy5yZW5kZXJUb1N0YXRpY01hcmt1cD1lLHRoaXMudXNlQ3JlYXRlRWxlbWVu dD0hMSx0aGlzLnVwZGF0ZVF1ZXVlPW5ldyBzKHRoaXMpfXZhciBvPWUoMTQwKSxpPWUoMjQpLGE9 ZSg4OSkscz0oZSg1NyksZSg2OSkpLHU9W10sbD17ZW5xdWV1ZTpmdW5jdGlvbigpe319LGM9e2dl dFRyYW5zYWN0aW9uV3JhcHBlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdX0sZ2V0UmVhY3RNb3VudFJl YWR5OmZ1bmN0aW9uKCl7cmV0dXJuIGx9LGdldFVwZGF0ZVF1ZXVlOmZ1bmN0aW9uKCl7cmV0dXJu IHRoaXMudXBkYXRlUXVldWV9LGRlc3RydWN0b3I6ZnVuY3Rpb24oKXt9LGNoZWNrcG9pbnQ6ZnVu Y3Rpb24oKXt9LHJvbGxiYWNrOmZ1bmN0aW9uKCl7fX07byhyLnByb3RvdHlwZSxhLGMpLGkuYWRk UG9vbGluZ1RvKHIpLHQuZXhwb3J0cz1yfSx7MTQwOjE0MCwyNDoyNCw1Nzo1Nyw2OTo2OSw4OTo4 OX1dLDY5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXtpZigh KGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNz IGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBvKGUsdCl7fXZhciBpPWUoNzApLGE9KGUoMTM5KSxm dW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7cih0aGlzLGUpLHRoaXMudHJhbnNhY3Rpb249dH1yZXR1 cm4gZS5wcm90b3R5cGUuaXNNb3VudGVkPWZ1bmN0aW9uKGUpe3JldHVybiExfSxlLnByb3RvdHlw ZS5lbnF1ZXVlQ2FsbGJhY2s9ZnVuY3Rpb24oZSx0LG4pe3RoaXMudHJhbnNhY3Rpb24uaXNJblRy YW5zYWN0aW9uKCkmJmkuZW5xdWV1ZUNhbGxiYWNrKGUsdCxuKX0sZS5wcm90b3R5cGUuZW5xdWV1 ZUZvcmNlVXBkYXRlPWZ1bmN0aW9uKGUpe3RoaXMudHJhbnNhY3Rpb24uaXNJblRyYW5zYWN0aW9u KCk/aS5lbnF1ZXVlRm9yY2VVcGRhdGUoZSk6byhlLCJmb3JjZVVwZGF0ZSIpfSxlLnByb3RvdHlw ZS5lbnF1ZXVlUmVwbGFjZVN0YXRlPWZ1bmN0aW9uKGUsdCl7dGhpcy50cmFuc2FjdGlvbi5pc0lu VHJhbnNhY3Rpb24oKT9pLmVucXVldWVSZXBsYWNlU3RhdGUoZSx0KTpvKGUsInJlcGxhY2VTdGF0 ZSIpfSxlLnByb3RvdHlwZS5lbnF1ZXVlU2V0U3RhdGU9ZnVuY3Rpb24oZSx0KXt0aGlzLnRyYW5z YWN0aW9uLmlzSW5UcmFuc2FjdGlvbigpP2kuZW5xdWV1ZVNldFN0YXRlKGUsdCk6byhlLCJzZXRT dGF0ZSIpfSxlfSgpKTt0LmV4cG9ydHM9YX0sezEzOToxMzksNzA6NzB9XSw3MDpbZnVuY3Rpb24o ZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3UuZW5xdWV1ZVVwZGF0ZShlKX1mdW5j dGlvbiBvKGUpe3ZhciB0PXR5cGVvZiBlO2lmKCJvYmplY3QiIT09dClyZXR1cm4gdDt2YXIgbj1l LmNvbnN0cnVjdG9yJiZlLmNvbnN0cnVjdG9yLm5hbWV8fHQscj1PYmplY3Qua2V5cyhlKTtyZXR1 cm4gci5sZW5ndGg+MCYmci5sZW5ndGg8MjA/bisiIChrZXlzOiAiK3Iuam9pbigiLCAiKSsiKSI6 bn1mdW5jdGlvbiBpKGUsdCl7dmFyIG49cy5nZXQoZSk7cmV0dXJuIG4/bjpudWxsfXZhciBhPWUo MTExKSxzPShlKDExNyksZSg1NikpLHU9KGUoNTcpLGUoNzEpKSxsPShlKDEzNCksZSgxMzkpLHtp c01vdW50ZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9cy5nZXQoZSk7cmV0dXJuISF0JiYhIXQuX3JlbmRl cmVkQ29tcG9uZW50fSxlbnF1ZXVlQ2FsbGJhY2s6ZnVuY3Rpb24oZSx0LG4pe2wudmFsaWRhdGVD YWxsYmFjayh0LG4pO3ZhciBvPWkoZSk7cmV0dXJuIG8/KG8uX3BlbmRpbmdDYWxsYmFja3M/by5f cGVuZGluZ0NhbGxiYWNrcy5wdXNoKHQpOm8uX3BlbmRpbmdDYWxsYmFja3M9W3RdLHZvaWQgcihv KSk6bnVsbH0sZW5xdWV1ZUNhbGxiYWNrSW50ZXJuYWw6ZnVuY3Rpb24oZSx0KXtlLl9wZW5kaW5n Q2FsbGJhY2tzP2UuX3BlbmRpbmdDYWxsYmFja3MucHVzaCh0KTplLl9wZW5kaW5nQ2FsbGJhY2tz PVt0XSxyKGUpfSxlbnF1ZXVlRm9yY2VVcGRhdGU6ZnVuY3Rpb24oZSl7dmFyIHQ9aShlLCJmb3Jj ZVVwZGF0ZSIpO3QmJih0Ll9wZW5kaW5nRm9yY2VVcGRhdGU9ITAscih0KSl9LGVucXVldWVSZXBs YWNlU3RhdGU6ZnVuY3Rpb24oZSx0KXt2YXIgbj1pKGUsInJlcGxhY2VTdGF0ZSIpO24mJihuLl9w ZW5kaW5nU3RhdGVRdWV1ZT1bdF0sbi5fcGVuZGluZ1JlcGxhY2VTdGF0ZT0hMCxyKG4pKX0sZW5x dWV1ZVNldFN0YXRlOmZ1bmN0aW9uKGUsdCl7dmFyIG49aShlLCJzZXRTdGF0ZSIpO2lmKG4pe3Zh ciBvPW4uX3BlbmRpbmdTdGF0ZVF1ZXVlfHwobi5fcGVuZGluZ1N0YXRlUXVldWU9W10pO28ucHVz aCh0KSxyKG4pfX0sZW5xdWV1ZUVsZW1lbnRJbnRlcm5hbDpmdW5jdGlvbihlLHQsbil7ZS5fcGVu ZGluZ0VsZW1lbnQ9dCxlLl9jb250ZXh0PW4scihlKX0sdmFsaWRhdGVDYWxsYmFjazpmdW5jdGlv bihlLHQpe2UmJiJmdW5jdGlvbiIhPXR5cGVvZiBlP2EoIjEyMiIsdCxvKGUpKTp2b2lkIDB9fSk7 dC5leHBvcnRzPWx9LHsxMTE6MTExLDExNzoxMTcsMTM0OjEzNCwxMzk6MTM5LDU2OjU2LDU3OjU3 LDcxOjcxfV0sNzE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcigpe1Au UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbiYmYj92b2lkIDA6YygiMTIzIil9ZnVuY3Rpb24gbygp e3RoaXMucmVpbml0aWFsaXplVHJhbnNhY3Rpb24oKSx0aGlzLmRpcnR5Q29tcG9uZW50c0xlbmd0 aD1udWxsLHRoaXMuY2FsbGJhY2tRdWV1ZT1kLmdldFBvb2xlZCgpLHRoaXMucmVjb25jaWxlVHJh bnNhY3Rpb249UC5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uLmdldFBvb2xlZCghMCl9ZnVuY3Rp b24gaShlLHQsbixvLGksYSl7cmV0dXJuIHIoKSxiLmJhdGNoZWRVcGRhdGVzKGUsdCxuLG8saSxh KX1mdW5jdGlvbiBhKGUsdCl7cmV0dXJuIGUuX21vdW50T3JkZXItdC5fbW91bnRPcmRlcn1mdW5j dGlvbiBzKGUpe3ZhciB0PWUuZGlydHlDb21wb25lbnRzTGVuZ3RoO3QhPT1nLmxlbmd0aD9jKCIx MjQiLHQsZy5sZW5ndGgpOnZvaWQgMCxnLnNvcnQoYSkseSsrO2Zvcih2YXIgbj0wO248dDtuKysp e3ZhciByPWdbbl0sbz1yLl9wZW5kaW5nQ2FsbGJhY2tzO3IuX3BlbmRpbmdDYWxsYmFja3M9bnVs bDt2YXIgaTtpZihoLmxvZ1RvcExldmVsUmVuZGVycyl7dmFyIHM9cjtyLl9jdXJyZW50RWxlbWVu dC50eXBlLmlzUmVhY3RUb3BMZXZlbFdyYXBwZXImJihzPXIuX3JlbmRlcmVkQ29tcG9uZW50KSxp PSJSZWFjdCB1cGRhdGU6ICIrcy5nZXROYW1lKCksY29uc29sZS50aW1lKGkpfWlmKHYucGVyZm9y bVVwZGF0ZUlmTmVjZXNzYXJ5KHIsZS5yZWNvbmNpbGVUcmFuc2FjdGlvbix5KSxpJiZjb25zb2xl LnRpbWVFbmQoaSksbylmb3IodmFyIHU9MDt1PG8ubGVuZ3RoO3UrKyllLmNhbGxiYWNrUXVldWUu ZW5xdWV1ZShvW3VdLHIuZ2V0UHVibGljSW5zdGFuY2UoKSl9fWZ1bmN0aW9uIHUoZSl7cmV0dXJu IHIoKSxiLmlzQmF0Y2hpbmdVcGRhdGVzPyhnLnB1c2goZSksdm9pZChudWxsPT1lLl91cGRhdGVC YXRjaE51bWJlciYmKGUuX3VwZGF0ZUJhdGNoTnVtYmVyPXkrMSkpKTp2b2lkIGIuYmF0Y2hlZFVw ZGF0ZXModSxlKX1mdW5jdGlvbiBsKGUsdCl7Yi5pc0JhdGNoaW5nVXBkYXRlcz92b2lkIDA6Yygi MTI1IiksQy5lbnF1ZXVlKGUsdCksXz0hMH12YXIgYz1lKDExMSkscD1lKDE0MCksZD1lKDYpLGY9 ZSgyNCksaD1lKDUyKSx2PWUoNjQpLG09ZSg4OSksZz0oZSgxMzQpLFtdKSx5PTAsQz1kLmdldFBv b2xlZCgpLF89ITEsYj1udWxsLEU9e2luaXRpYWxpemU6ZnVuY3Rpb24oKXt0aGlzLmRpcnR5Q29t cG9uZW50c0xlbmd0aD1nLmxlbmd0aH0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLmRpcnR5Q29tcG9u ZW50c0xlbmd0aCE9PWcubGVuZ3RoPyhnLnNwbGljZSgwLHRoaXMuZGlydHlDb21wb25lbnRzTGVu Z3RoKSxrKCkpOmcubGVuZ3RoPTB9fSx4PXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7dGhpcy5jYWxs YmFja1F1ZXVlLnJlc2V0KCl9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy5jYWxsYmFja1F1ZXVlLm5v dGlmeUFsbCgpfX0sdz1bRSx4XTtwKG8ucHJvdG90eXBlLG0se2dldFRyYW5zYWN0aW9uV3JhcHBl cnM6ZnVuY3Rpb24oKXtyZXR1cm4gd30sZGVzdHJ1Y3RvcjpmdW5jdGlvbigpe3RoaXMuZGlydHlD b21wb25lbnRzTGVuZ3RoPW51bGwsZC5yZWxlYXNlKHRoaXMuY2FsbGJhY2tRdWV1ZSksdGhpcy5j YWxsYmFja1F1ZXVlPW51bGwsUC5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uLnJlbGVhc2UodGhp cy5yZWNvbmNpbGVUcmFuc2FjdGlvbiksdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbj1udWxsfSxw ZXJmb3JtOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbS5wZXJmb3JtLmNhbGwodGhpcyx0aGlzLnJl Y29uY2lsZVRyYW5zYWN0aW9uLnBlcmZvcm0sdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbixlLHQs bil9fSksZi5hZGRQb29saW5nVG8obyk7dmFyIGs9ZnVuY3Rpb24oKXtmb3IoO2cubGVuZ3RofHxf Oyl7aWYoZy5sZW5ndGgpe3ZhciBlPW8uZ2V0UG9vbGVkKCk7ZS5wZXJmb3JtKHMsbnVsbCxlKSxv LnJlbGVhc2UoZSl9aWYoXyl7Xz0hMTt2YXIgdD1DO0M9ZC5nZXRQb29sZWQoKSx0Lm5vdGlmeUFs bCgpLGQucmVsZWFzZSh0KX19fSxUPXtpbmplY3RSZWNvbmNpbGVUcmFuc2FjdGlvbjpmdW5jdGlv bihlKXtlP3ZvaWQgMDpjKCIxMjYiKSxQLlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb249ZX0saW5q ZWN0QmF0Y2hpbmdTdHJhdGVneTpmdW5jdGlvbihlKXtlP3ZvaWQgMDpjKCIxMjciKSwiZnVuY3Rp b24iIT10eXBlb2YgZS5iYXRjaGVkVXBkYXRlcz9jKCIxMjgiKTp2b2lkIDAsImJvb2xlYW4iIT10 eXBlb2YgZS5pc0JhdGNoaW5nVXBkYXRlcz9jKCIxMjkiKTp2b2lkIDAsYj1lfX0sUD17UmVhY3RS ZWNvbmNpbGVUcmFuc2FjdGlvbjpudWxsLGJhdGNoZWRVcGRhdGVzOmksZW5xdWV1ZVVwZGF0ZTp1 LGZsdXNoQmF0Y2hlZFVwZGF0ZXM6ayxpbmplY3Rpb246VCxhc2FwOmx9O3QuZXhwb3J0cz1QfSx7 MTExOjExMSwxMzQ6MTM0LDE0MDoxNDAsMjQ6MjQsNTI6NTIsNjo2LDY0OjY0LDg5Ojg5fV0sNzI6 W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dC5leHBvcnRzPSIxNS40LjIifSx7fV0sNzM6 W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9e3hsaW5rOiJodHRwOi8vd3d3Lncz Lm9yZy8xOTk5L3hsaW5rIix4bWw6Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFj ZSJ9LG89e2FjY2VudEhlaWdodDoiYWNjZW50LWhlaWdodCIsYWNjdW11bGF0ZTowLGFkZGl0aXZl OjAsYWxpZ25tZW50QmFzZWxpbmU6ImFsaWdubWVudC1iYXNlbGluZSIsYWxsb3dSZW9yZGVyOiJh bGxvd1Jlb3JkZXIiLGFscGhhYmV0aWM6MCxhbXBsaXR1ZGU6MCxhcmFiaWNGb3JtOiJhcmFiaWMt Zm9ybSIsYXNjZW50OjAsYXR0cmlidXRlTmFtZToiYXR0cmlidXRlTmFtZSIsYXR0cmlidXRlVHlw ZToiYXR0cmlidXRlVHlwZSIsYXV0b1JldmVyc2U6ImF1dG9SZXZlcnNlIixhemltdXRoOjAsYmFz ZUZyZXF1ZW5jeToiYmFzZUZyZXF1ZW5jeSIsYmFzZVByb2ZpbGU6ImJhc2VQcm9maWxlIixiYXNl bGluZVNoaWZ0OiJiYXNlbGluZS1zaGlmdCIsYmJveDowLGJlZ2luOjAsYmlhczowLGJ5OjAsY2Fs Y01vZGU6ImNhbGNNb2RlIixjYXBIZWlnaHQ6ImNhcC1oZWlnaHQiLGNsaXA6MCxjbGlwUGF0aDoi Y2xpcC1wYXRoIixjbGlwUnVsZToiY2xpcC1ydWxlIixjbGlwUGF0aFVuaXRzOiJjbGlwUGF0aFVu aXRzIixjb2xvckludGVycG9sYXRpb246ImNvbG9yLWludGVycG9sYXRpb24iLGNvbG9ySW50ZXJw b2xhdGlvbkZpbHRlcnM6ImNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyIsY29sb3JQcm9maWxl OiJjb2xvci1wcm9maWxlIixjb2xvclJlbmRlcmluZzoiY29sb3ItcmVuZGVyaW5nIixjb250ZW50 U2NyaXB0VHlwZToiY29udGVudFNjcmlwdFR5cGUiLGNvbnRlbnRTdHlsZVR5cGU6ImNvbnRlbnRT dHlsZVR5cGUiLGN1cnNvcjowLGN4OjAsY3k6MCxkOjAsZGVjZWxlcmF0ZTowLGRlc2NlbnQ6MCxk aWZmdXNlQ29uc3RhbnQ6ImRpZmZ1c2VDb25zdGFudCIsZGlyZWN0aW9uOjAsZGlzcGxheTowLGRp dmlzb3I6MCxkb21pbmFudEJhc2VsaW5lOiJkb21pbmFudC1iYXNlbGluZSIsZHVyOjAsZHg6MCxk eTowLGVkZ2VNb2RlOiJlZGdlTW9kZSIsZWxldmF0aW9uOjAsZW5hYmxlQmFja2dyb3VuZDoiZW5h YmxlLWJhY2tncm91bmQiLGVuZDowLGV4cG9uZW50OjAsZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJl ZDoiZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCIsZmlsbDowLGZpbGxPcGFjaXR5OiJmaWxsLW9w YWNpdHkiLGZpbGxSdWxlOiJmaWxsLXJ1bGUiLGZpbHRlcjowLGZpbHRlclJlczoiZmlsdGVyUmVz IixmaWx0ZXJVbml0czoiZmlsdGVyVW5pdHMiLGZsb29kQ29sb3I6ImZsb29kLWNvbG9yIixmbG9v ZE9wYWNpdHk6ImZsb29kLW9wYWNpdHkiLGZvY3VzYWJsZTowLGZvbnRGYW1pbHk6ImZvbnQtZmFt aWx5Iixmb250U2l6ZToiZm9udC1zaXplIixmb250U2l6ZUFkanVzdDoiZm9udC1zaXplLWFkanVz dCIsZm9udFN0cmV0Y2g6ImZvbnQtc3RyZXRjaCIsZm9udFN0eWxlOiJmb250LXN0eWxlIixmb250 VmFyaWFudDoiZm9udC12YXJpYW50Iixmb250V2VpZ2h0OiJmb250LXdlaWdodCIsZm9ybWF0OjAs ZnJvbTowLGZ4OjAsZnk6MCxnMTowLGcyOjAsZ2x5cGhOYW1lOiJnbHlwaC1uYW1lIixnbHlwaE9y aWVudGF0aW9uSG9yaXpvbnRhbDoiZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCIsZ2x5cGhP cmllbnRhdGlvblZlcnRpY2FsOiJnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCIsZ2x5cGhSZWY6 ImdseXBoUmVmIixncmFkaWVudFRyYW5zZm9ybToiZ3JhZGllbnRUcmFuc2Zvcm0iLGdyYWRpZW50 VW5pdHM6ImdyYWRpZW50VW5pdHMiLGhhbmdpbmc6MCxob3JpekFkdlg6Imhvcml6LWFkdi14Iixo b3Jpek9yaWdpblg6Imhvcml6LW9yaWdpbi14IixpZGVvZ3JhcGhpYzowLGltYWdlUmVuZGVyaW5n OiJpbWFnZS1yZW5kZXJpbmciLGluOjAsaW4yOjAsaW50ZXJjZXB0OjAsazowLGsxOjAsazI6MCxr MzowLGs0OjAsa2VybmVsTWF0cml4OiJrZXJuZWxNYXRyaXgiLGtlcm5lbFVuaXRMZW5ndGg6Imtl cm5lbFVuaXRMZW5ndGgiLGtlcm5pbmc6MCxrZXlQb2ludHM6ImtleVBvaW50cyIsa2V5U3BsaW5l czoia2V5U3BsaW5lcyIsa2V5VGltZXM6ImtleVRpbWVzIixsZW5ndGhBZGp1c3Q6Imxlbmd0aEFk anVzdCIsbGV0dGVyU3BhY2luZzoibGV0dGVyLXNwYWNpbmciLGxpZ2h0aW5nQ29sb3I6ImxpZ2h0 aW5nLWNvbG9yIixsaW1pdGluZ0NvbmVBbmdsZToibGltaXRpbmdDb25lQW5nbGUiLGxvY2FsOjAs bWFya2VyRW5kOiJtYXJrZXItZW5kIixtYXJrZXJNaWQ6Im1hcmtlci1taWQiLG1hcmtlclN0YXJ0 OiJtYXJrZXItc3RhcnQiLG1hcmtlckhlaWdodDoibWFya2VySGVpZ2h0IixtYXJrZXJVbml0czoi bWFya2VyVW5pdHMiLG1hcmtlcldpZHRoOiJtYXJrZXJXaWR0aCIsbWFzazowLG1hc2tDb250ZW50 VW5pdHM6Im1hc2tDb250ZW50VW5pdHMiLG1hc2tVbml0czoibWFza1VuaXRzIixtYXRoZW1hdGlj YWw6MCxtb2RlOjAsbnVtT2N0YXZlczoibnVtT2N0YXZlcyIsb2Zmc2V0OjAsb3BhY2l0eTowLG9w ZXJhdG9yOjAsb3JkZXI6MCxvcmllbnQ6MCxvcmllbnRhdGlvbjowLG9yaWdpbjowLG92ZXJmbG93 OjAsb3ZlcmxpbmVQb3NpdGlvbjoib3ZlcmxpbmUtcG9zaXRpb24iLG92ZXJsaW5lVGhpY2tuZXNz OiJvdmVybGluZS10aGlja25lc3MiLHBhaW50T3JkZXI6InBhaW50LW9yZGVyIixwYW5vc2UxOiJw YW5vc2UtMSIscGF0aExlbmd0aDoicGF0aExlbmd0aCIscGF0dGVybkNvbnRlbnRVbml0czoicGF0 dGVybkNvbnRlbnRVbml0cyIscGF0dGVyblRyYW5zZm9ybToicGF0dGVyblRyYW5zZm9ybSIscGF0 dGVyblVuaXRzOiJwYXR0ZXJuVW5pdHMiLHBvaW50ZXJFdmVudHM6InBvaW50ZXItZXZlbnRzIixw b2ludHM6MCxwb2ludHNBdFg6InBvaW50c0F0WCIscG9pbnRzQXRZOiJwb2ludHNBdFkiLHBvaW50 c0F0WjoicG9pbnRzQXRaIixwcmVzZXJ2ZUFscGhhOiJwcmVzZXJ2ZUFscGhhIixwcmVzZXJ2ZUFz cGVjdFJhdGlvOiJwcmVzZXJ2ZUFzcGVjdFJhdGlvIixwcmltaXRpdmVVbml0czoicHJpbWl0aXZl VW5pdHMiLHI6MCxyYWRpdXM6MCxyZWZYOiJyZWZYIixyZWZZOiJyZWZZIixyZW5kZXJpbmdJbnRl bnQ6InJlbmRlcmluZy1pbnRlbnQiLHJlcGVhdENvdW50OiJyZXBlYXRDb3VudCIscmVwZWF0RHVy OiJyZXBlYXREdXIiLHJlcXVpcmVkRXh0ZW5zaW9uczoicmVxdWlyZWRFeHRlbnNpb25zIixyZXF1 aXJlZEZlYXR1cmVzOiJyZXF1aXJlZEZlYXR1cmVzIixyZXN0YXJ0OjAscmVzdWx0OjAscm90YXRl OjAscng6MCxyeTowLHNjYWxlOjAsc2VlZDowLHNoYXBlUmVuZGVyaW5nOiJzaGFwZS1yZW5kZXJp bmciLHNsb3BlOjAsc3BhY2luZzowLHNwZWN1bGFyQ29uc3RhbnQ6InNwZWN1bGFyQ29uc3RhbnQi LHNwZWN1bGFyRXhwb25lbnQ6InNwZWN1bGFyRXhwb25lbnQiLHNwZWVkOjAsc3ByZWFkTWV0aG9k OiJzcHJlYWRNZXRob2QiLHN0YXJ0T2Zmc2V0OiJzdGFydE9mZnNldCIsc3RkRGV2aWF0aW9uOiJz dGREZXZpYXRpb24iLHN0ZW1oOjAsc3RlbXY6MCxzdGl0Y2hUaWxlczoic3RpdGNoVGlsZXMiLHN0 b3BDb2xvcjoic3RvcC1jb2xvciIsc3RvcE9wYWNpdHk6InN0b3Atb3BhY2l0eSIsc3RyaWtldGhy b3VnaFBvc2l0aW9uOiJzdHJpa2V0aHJvdWdoLXBvc2l0aW9uIixzdHJpa2V0aHJvdWdoVGhpY2tu ZXNzOiJzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyIsc3RyaW5nOjAsc3Ryb2tlOjAsc3Ryb2tlRGFz aGFycmF5OiJzdHJva2UtZGFzaGFycmF5IixzdHJva2VEYXNob2Zmc2V0OiJzdHJva2UtZGFzaG9m ZnNldCIsc3Ryb2tlTGluZWNhcDoic3Ryb2tlLWxpbmVjYXAiLHN0cm9rZUxpbmVqb2luOiJzdHJv a2UtbGluZWpvaW4iLHN0cm9rZU1pdGVybGltaXQ6InN0cm9rZS1taXRlcmxpbWl0IixzdHJva2VP cGFjaXR5OiJzdHJva2Utb3BhY2l0eSIsc3Ryb2tlV2lkdGg6InN0cm9rZS13aWR0aCIsc3VyZmFj ZVNjYWxlOiJzdXJmYWNlU2NhbGUiLHN5c3RlbUxhbmd1YWdlOiJzeXN0ZW1MYW5ndWFnZSIsdGFi bGVWYWx1ZXM6InRhYmxlVmFsdWVzIix0YXJnZXRYOiJ0YXJnZXRYIix0YXJnZXRZOiJ0YXJnZXRZ Iix0ZXh0QW5jaG9yOiJ0ZXh0LWFuY2hvciIsdGV4dERlY29yYXRpb246InRleHQtZGVjb3JhdGlv biIsdGV4dFJlbmRlcmluZzoidGV4dC1yZW5kZXJpbmciLHRleHRMZW5ndGg6InRleHRMZW5ndGgi LHRvOjAsdHJhbnNmb3JtOjAsdTE6MCx1MjowLHVuZGVybGluZVBvc2l0aW9uOiJ1bmRlcmxpbmUt cG9zaXRpb24iLHVuZGVybGluZVRoaWNrbmVzczoidW5kZXJsaW5lLXRoaWNrbmVzcyIsdW5pY29k ZTowLHVuaWNvZGVCaWRpOiJ1bmljb2RlLWJpZGkiLHVuaWNvZGVSYW5nZToidW5pY29kZS1yYW5n ZSIsdW5pdHNQZXJFbToidW5pdHMtcGVyLWVtIix2QWxwaGFiZXRpYzoidi1hbHBoYWJldGljIix2 SGFuZ2luZzoidi1oYW5naW5nIix2SWRlb2dyYXBoaWM6InYtaWRlb2dyYXBoaWMiLHZNYXRoZW1h dGljYWw6InYtbWF0aGVtYXRpY2FsIix2YWx1ZXM6MCx2ZWN0b3JFZmZlY3Q6InZlY3Rvci1lZmZl Y3QiLHZlcnNpb246MCx2ZXJ0QWR2WToidmVydC1hZHYteSIsdmVydE9yaWdpblg6InZlcnQtb3Jp Z2luLXgiLHZlcnRPcmlnaW5ZOiJ2ZXJ0LW9yaWdpbi15Iix2aWV3Qm94OiJ2aWV3Qm94Iix2aWV3 VGFyZ2V0OiJ2aWV3VGFyZ2V0Iix2aXNpYmlsaXR5OjAsd2lkdGhzOjAsd29yZFNwYWNpbmc6Indv cmQtc3BhY2luZyIsd3JpdGluZ01vZGU6IndyaXRpbmctbW9kZSIseDowLHhIZWlnaHQ6IngtaGVp Z2h0Iix4MTowLHgyOjAseENoYW5uZWxTZWxlY3RvcjoieENoYW5uZWxTZWxlY3RvciIseGxpbmtB Y3R1YXRlOiJ4bGluazphY3R1YXRlIix4bGlua0FyY3JvbGU6InhsaW5rOmFyY3JvbGUiLHhsaW5r SHJlZjoieGxpbms6aHJlZiIseGxpbmtSb2xlOiJ4bGluazpyb2xlIix4bGlua1Nob3c6InhsaW5r OnNob3ciLHhsaW5rVGl0bGU6InhsaW5rOnRpdGxlIix4bGlua1R5cGU6InhsaW5rOnR5cGUiLHht bEJhc2U6InhtbDpiYXNlIix4bWxuczowLHhtbG5zWGxpbms6InhtbG5zOnhsaW5rIix4bWxMYW5n OiJ4bWw6bGFuZyIseG1sU3BhY2U6InhtbDpzcGFjZSIseTowLHkxOjAseTI6MCx5Q2hhbm5lbFNl bGVjdG9yOiJ5Q2hhbm5lbFNlbGVjdG9yIix6OjAsem9vbUFuZFBhbjoiem9vbUFuZFBhbiJ9LGk9 e1Byb3BlcnRpZXM6e30sRE9NQXR0cmlidXRlTmFtZXNwYWNlczp7eGxpbmtBY3R1YXRlOnIueGxp bmsseGxpbmtBcmNyb2xlOnIueGxpbmsseGxpbmtIcmVmOnIueGxpbmsseGxpbmtSb2xlOnIueGxp bmsseGxpbmtTaG93OnIueGxpbmsseGxpbmtUaXRsZTpyLnhsaW5rLHhsaW5rVHlwZTpyLnhsaW5r LHhtbEJhc2U6ci54bWwseG1sTGFuZzpyLnhtbCx4bWxTcGFjZTpyLnhtbH0sRE9NQXR0cmlidXRl TmFtZXM6e319O09iamVjdC5rZXlzKG8pLmZvckVhY2goZnVuY3Rpb24oZSl7aS5Qcm9wZXJ0aWVz W2VdPTAsb1tlXSYmKGkuRE9NQXR0cmlidXRlTmFtZXNbZV09b1tlXSl9KSx0LmV4cG9ydHM9aX0s e31dLDc0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7aWYoInNl bGVjdGlvblN0YXJ0ImluIGUmJnUuaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKGUpKXJldHVybntz dGFydDplLnNlbGVjdGlvblN0YXJ0LGVuZDplLnNlbGVjdGlvbkVuZH07aWYod2luZG93LmdldFNl bGVjdGlvbil7dmFyIHQ9d2luZG93LmdldFNlbGVjdGlvbigpO3JldHVybnthbmNob3JOb2RlOnQu YW5jaG9yTm9kZSxhbmNob3JPZmZzZXQ6dC5hbmNob3JPZmZzZXQsZm9jdXNOb2RlOnQuZm9jdXNO b2RlLGZvY3VzT2Zmc2V0OnQuZm9jdXNPZmZzZXR9fWlmKGRvY3VtZW50LnNlbGVjdGlvbil7dmFy IG49ZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7cmV0dXJue3BhcmVudEVsZW1lbnQ6 bi5wYXJlbnRFbGVtZW50KCksdGV4dDpuLnRleHQsdG9wOm4uYm91bmRpbmdUb3AsbGVmdDpuLmJv dW5kaW5nTGVmdH19fWZ1bmN0aW9uIG8oZSx0KXtpZih5fHxudWxsPT12fHx2IT09YygpKXJldHVy biBudWxsO3ZhciBuPXIodik7aWYoIWd8fCFkKGcsbikpe2c9bjt2YXIgbz1sLmdldFBvb2xlZCho LnNlbGVjdCxtLGUsdCk7cmV0dXJuIG8udHlwZT0ic2VsZWN0IixvLnRhcmdldD12LGkuYWNjdW11 bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyhvKSxvfXJldHVybiBudWxsfXZhciBpPWUoMTkpLGE9ZSgx MjApLHM9ZSgzMiksdT1lKDU1KSxsPWUoODApLGM9ZSgxMjkpLHA9ZSgxMDkpLGQ9ZSgxMzgpLGY9 YS5jYW5Vc2VET00mJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQmJmRvY3VtZW50LmRvY3VtZW50 TW9kZTw9MTEsaD17c2VsZWN0OntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDoib25T ZWxlY3QiLGNhcHR1cmVkOiJvblNlbGVjdENhcHR1cmUifSxkZXBlbmRlbmNpZXM6WyJ0b3BCbHVy IiwidG9wQ29udGV4dE1lbnUiLCJ0b3BGb2N1cyIsInRvcEtleURvd24iLCJ0b3BLZXlVcCIsInRv cE1vdXNlRG93biIsInRvcE1vdXNlVXAiLCJ0b3BTZWxlY3Rpb25DaGFuZ2UiXX19LHY9bnVsbCxt PW51bGwsZz1udWxsLHk9ITEsQz0hMSxfPXtldmVudFR5cGVzOmgsZXh0cmFjdEV2ZW50czpmdW5j dGlvbihlLHQsbixyKXtpZighQylyZXR1cm4gbnVsbDt2YXIgaT10P3MuZ2V0Tm9kZUZyb21JbnN0 YW5jZSh0KTp3aW5kb3c7c3dpdGNoKGUpe2Nhc2UidG9wRm9jdXMiOihwKGkpfHwidHJ1ZSI9PT1p LmNvbnRlbnRFZGl0YWJsZSkmJih2PWksbT10LGc9bnVsbCk7YnJlYWs7Y2FzZSJ0b3BCbHVyIjp2 PW51bGwsbT1udWxsLGc9bnVsbDticmVhaztjYXNlInRvcE1vdXNlRG93biI6eT0hMDticmVhaztj YXNlInRvcENvbnRleHRNZW51IjpjYXNlInRvcE1vdXNlVXAiOnJldHVybiB5PSExLG8obixyKTtj YXNlInRvcFNlbGVjdGlvbkNoYW5nZSI6aWYoZilicmVhaztjYXNlInRvcEtleURvd24iOmNhc2Ui dG9wS2V5VXAiOnJldHVybiBvKG4scil9cmV0dXJuIG51bGx9LGRpZFB1dExpc3RlbmVyOmZ1bmN0 aW9uKGUsdCxuKXsib25TZWxlY3QiPT09dCYmKEM9ITApfX07dC5leHBvcnRzPV99LHsxMDk6MTA5 LDEyMDoxMjAsMTI5OjEyOSwxMzg6MTM4LDE5OjE5LDMyOjMyLDU1OjU1LDgwOjgwfV0sNzU6W2Z1 bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4iLiIrZS5fcm9v dE5vZGVJRH1mdW5jdGlvbiBvKGUpe3JldHVybiJidXR0b24iPT09ZXx8ImlucHV0Ij09PWV8fCJz ZWxlY3QiPT09ZXx8InRleHRhcmVhIj09PWV9dmFyIGk9ZSgxMTEpLGE9ZSgxMTkpLHM9ZSgxOSks dT1lKDMyKSxsPWUoNzYpLGM9ZSg3NykscD1lKDgwKSxkPWUoODEpLGY9ZSg4MyksaD1lKDg0KSx2 PWUoNzkpLG09ZSg4NSksZz1lKDg2KSx5PWUoODcpLEM9ZSg4OCksXz1lKDEyNiksYj1lKDk4KSxF PShlKDEzNCkse30pLHg9e307WyJhYm9ydCIsImFuaW1hdGlvbkVuZCIsImFuaW1hdGlvbkl0ZXJh dGlvbiIsImFuaW1hdGlvblN0YXJ0IiwiYmx1ciIsImNhblBsYXkiLCJjYW5QbGF5VGhyb3VnaCIs ImNsaWNrIiwiY29udGV4dE1lbnUiLCJjb3B5IiwiY3V0IiwiZG91YmxlQ2xpY2siLCJkcmFnIiwi ZHJhZ0VuZCIsImRyYWdFbnRlciIsImRyYWdFeGl0IiwiZHJhZ0xlYXZlIiwiZHJhZ092ZXIiLCJk cmFnU3RhcnQiLCJkcm9wIiwiZHVyYXRpb25DaGFuZ2UiLCJlbXB0aWVkIiwiZW5jcnlwdGVkIiwi ZW5kZWQiLCJlcnJvciIsImZvY3VzIiwiaW5wdXQiLCJpbnZhbGlkIiwia2V5RG93biIsImtleVBy ZXNzIiwia2V5VXAiLCJsb2FkIiwibG9hZGVkRGF0YSIsImxvYWRlZE1ldGFkYXRhIiwibG9hZFN0 YXJ0IiwibW91c2VEb3duIiwibW91c2VNb3ZlIiwibW91c2VPdXQiLCJtb3VzZU92ZXIiLCJtb3Vz ZVVwIiwicGFzdGUiLCJwYXVzZSIsInBsYXkiLCJwbGF5aW5nIiwicHJvZ3Jlc3MiLCJyYXRlQ2hh bmdlIiwicmVzZXQiLCJzY3JvbGwiLCJzZWVrZWQiLCJzZWVraW5nIiwic3RhbGxlZCIsInN1Ym1p dCIsInN1c3BlbmQiLCJ0aW1lVXBkYXRlIiwidG91Y2hDYW5jZWwiLCJ0b3VjaEVuZCIsInRvdWNo TW92ZSIsInRvdWNoU3RhcnQiLCJ0cmFuc2l0aW9uRW5kIiwidm9sdW1lQ2hhbmdlIiwid2FpdGlu ZyIsIndoZWVsIl0uZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lWzBdLnRvVXBwZXJDYXNlKCkr ZS5zbGljZSgxKSxuPSJvbiIrdCxyPSJ0b3AiK3Qsbz17cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6 e2J1YmJsZWQ6bixjYXB0dXJlZDpuKyJDYXB0dXJlIn0sZGVwZW5kZW5jaWVzOltyXX07RVtlXT1v LHhbcl09b30pO3ZhciB3PXt9LGs9e2V2ZW50VHlwZXM6RSxleHRyYWN0RXZlbnRzOmZ1bmN0aW9u KGUsdCxuLHIpe3ZhciBvPXhbZV07aWYoIW8pcmV0dXJuIG51bGw7dmFyIGE7c3dpdGNoKGUpe2Nh c2UidG9wQWJvcnQiOmNhc2UidG9wQ2FuUGxheSI6Y2FzZSJ0b3BDYW5QbGF5VGhyb3VnaCI6Y2Fz ZSJ0b3BEdXJhdGlvbkNoYW5nZSI6Y2FzZSJ0b3BFbXB0aWVkIjpjYXNlInRvcEVuY3J5cHRlZCI6 Y2FzZSJ0b3BFbmRlZCI6Y2FzZSJ0b3BFcnJvciI6Y2FzZSJ0b3BJbnB1dCI6Y2FzZSJ0b3BJbnZh bGlkIjpjYXNlInRvcExvYWQiOmNhc2UidG9wTG9hZGVkRGF0YSI6Y2FzZSJ0b3BMb2FkZWRNZXRh ZGF0YSI6Y2FzZSJ0b3BMb2FkU3RhcnQiOmNhc2UidG9wUGF1c2UiOmNhc2UidG9wUGxheSI6Y2Fz ZSJ0b3BQbGF5aW5nIjpjYXNlInRvcFByb2dyZXNzIjpjYXNlInRvcFJhdGVDaGFuZ2UiOmNhc2Ui dG9wUmVzZXQiOmNhc2UidG9wU2Vla2VkIjpjYXNlInRvcFNlZWtpbmciOmNhc2UidG9wU3RhbGxl ZCI6Y2FzZSJ0b3BTdWJtaXQiOmNhc2UidG9wU3VzcGVuZCI6Y2FzZSJ0b3BUaW1lVXBkYXRlIjpj YXNlInRvcFZvbHVtZUNoYW5nZSI6Y2FzZSJ0b3BXYWl0aW5nIjphPXA7YnJlYWs7Y2FzZSJ0b3BL ZXlQcmVzcyI6aWYoMD09PWIobikpcmV0dXJuIG51bGw7Y2FzZSJ0b3BLZXlEb3duIjpjYXNlInRv cEtleVVwIjphPWY7YnJlYWs7Y2FzZSJ0b3BCbHVyIjpjYXNlInRvcEZvY3VzIjphPWQ7YnJlYWs7 Y2FzZSJ0b3BDbGljayI6aWYoMj09PW4uYnV0dG9uKXJldHVybiBudWxsO2Nhc2UidG9wRG91Ymxl Q2xpY2siOmNhc2UidG9wTW91c2VEb3duIjpjYXNlInRvcE1vdXNlTW92ZSI6Y2FzZSJ0b3BNb3Vz ZVVwIjpjYXNlInRvcE1vdXNlT3V0IjpjYXNlInRvcE1vdXNlT3ZlciI6Y2FzZSJ0b3BDb250ZXh0 TWVudSI6YT1oO2JyZWFrO2Nhc2UidG9wRHJhZyI6Y2FzZSJ0b3BEcmFnRW5kIjpjYXNlInRvcERy YWdFbnRlciI6Y2FzZSJ0b3BEcmFnRXhpdCI6Y2FzZSJ0b3BEcmFnTGVhdmUiOmNhc2UidG9wRHJh Z092ZXIiOmNhc2UidG9wRHJhZ1N0YXJ0IjpjYXNlInRvcERyb3AiOmE9djticmVhaztjYXNlInRv cFRvdWNoQ2FuY2VsIjpjYXNlInRvcFRvdWNoRW5kIjpjYXNlInRvcFRvdWNoTW92ZSI6Y2FzZSJ0 b3BUb3VjaFN0YXJ0IjphPW07YnJlYWs7Y2FzZSJ0b3BBbmltYXRpb25FbmQiOmNhc2UidG9wQW5p bWF0aW9uSXRlcmF0aW9uIjpjYXNlInRvcEFuaW1hdGlvblN0YXJ0IjphPWw7YnJlYWs7Y2FzZSJ0 b3BUcmFuc2l0aW9uRW5kIjphPWc7YnJlYWs7Y2FzZSJ0b3BTY3JvbGwiOmE9eTticmVhaztjYXNl InRvcFdoZWVsIjphPUM7YnJlYWs7Y2FzZSJ0b3BDb3B5IjpjYXNlInRvcEN1dCI6Y2FzZSJ0b3BQ YXN0ZSI6YT1jfWE/dm9pZCAwOmkoIjg2IixlKTt2YXIgdT1hLmdldFBvb2xlZChvLHQsbixyKTty ZXR1cm4gcy5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKHUpLHV9LGRpZFB1dExpc3RlbmVy OmZ1bmN0aW9uKGUsdCxuKXtpZigib25DbGljayI9PT10JiYhbyhlLl90YWcpKXt2YXIgaT1yKGUp LHM9dS5nZXROb2RlRnJvbUluc3RhbmNlKGUpO3dbaV18fCh3W2ldPWEubGlzdGVuKHMsImNsaWNr IixfKSl9fSx3aWxsRGVsZXRlTGlzdGVuZXI6ZnVuY3Rpb24oZSx0KXtpZigib25DbGljayI9PT10 JiYhbyhlLl90YWcpKXt2YXIgbj1yKGUpO3dbbl0ucmVtb3ZlKCksZGVsZXRlIHdbbl19fX07dC5l eHBvcnRzPWt9LHsxMTE6MTExLDExOToxMTksMTI2OjEyNiwxMzQ6MTM0LDE5OjE5LDMyOjMyLDc2 Ojc2LDc3Ojc3LDc5Ojc5LDgwOjgwLDgxOjgxLDgzOjgzLDg0Ojg0LDg1Ojg1LDg2Ojg2LDg3Ojg3 LDg4Ojg4LDk4Ojk4fV0sNzY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24g cihlLHQsbixyKXtyZXR1cm4gby5jYWxsKHRoaXMsZSx0LG4scil9dmFyIG89ZSg4MCksaT17YW5p bWF0aW9uTmFtZTpudWxsLGVsYXBzZWRUaW1lOm51bGwscHNldWRvRWxlbWVudDpudWxsfTtvLmF1 Z21lbnRDbGFzcyhyLGkpLHQuZXhwb3J0cz1yfSx7ODA6ODB9XSw3NzpbZnVuY3Rpb24oZSx0LG4p eyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQs bixyKX12YXIgbz1lKDgwKSxpPXtjbGlwYm9hcmREYXRhOmZ1bmN0aW9uKGUpe3JldHVybiJjbGlw Ym9hcmREYXRhImluIGU/ZS5jbGlwYm9hcmREYXRhOndpbmRvdy5jbGlwYm9hcmREYXRhfX07by5h dWdtZW50Q2xhc3MocixpKSx0LmV4cG9ydHM9cn0sezgwOjgwfV0sNzg6W2Z1bmN0aW9uKGUsdCxu KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbixyKXtyZXR1cm4gby5jYWxsKHRoaXMsZSx0 LG4scil9dmFyIG89ZSg4MCksaT17ZGF0YTpudWxsfTtvLmF1Z21lbnRDbGFzcyhyLGkpLHQuZXhw b3J0cz1yfSx7ODA6ODB9XSw3OTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlv biByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDg0KSxpPXtk YXRhVHJhbnNmZXI6bnVsbH07by5hdWdtZW50Q2xhc3MocixpKSx0LmV4cG9ydHM9cn0sezg0Ojg0 fV0sODA6W2Z1bmN0aW9uKGUsdCxuKXsKLSJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIp e3RoaXMuZGlzcGF0Y2hDb25maWc9ZSx0aGlzLl90YXJnZXRJbnN0PXQsdGhpcy5uYXRpdmVFdmVu dD1uO3ZhciBvPXRoaXMuY29uc3RydWN0b3IuSW50ZXJmYWNlO2Zvcih2YXIgaSBpbiBvKWlmKG8u aGFzT3duUHJvcGVydHkoaSkpe3ZhciBzPW9baV07cz90aGlzW2ldPXMobik6InRhcmdldCI9PT1p P3RoaXMudGFyZ2V0PXI6dGhpc1tpXT1uW2ldfXZhciB1PW51bGwhPW4uZGVmYXVsdFByZXZlbnRl ZD9uLmRlZmF1bHRQcmV2ZW50ZWQ6bi5yZXR1cm5WYWx1ZT09PSExO3JldHVybiB1P3RoaXMuaXNE ZWZhdWx0UHJldmVudGVkPWEudGhhdFJldHVybnNUcnVlOnRoaXMuaXNEZWZhdWx0UHJldmVudGVk PWEudGhhdFJldHVybnNGYWxzZSx0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPWEudGhhdFJldHVy bnNGYWxzZSx0aGlzfXZhciBvPWUoMTQwKSxpPWUoMjQpLGE9ZSgxMjYpLHM9KGUoMTM5KSwiZnVu Y3Rpb24iPT10eXBlb2YgUHJveHksWyJkaXNwYXRjaENvbmZpZyIsIl90YXJnZXRJbnN0IiwibmF0 aXZlRXZlbnQiLCJpc0RlZmF1bHRQcmV2ZW50ZWQiLCJpc1Byb3BhZ2F0aW9uU3RvcHBlZCIsIl9k aXNwYXRjaExpc3RlbmVycyIsIl9kaXNwYXRjaEluc3RhbmNlcyJdKSx1PXt0eXBlOm51bGwsdGFy Z2V0Om51bGwsY3VycmVudFRhcmdldDphLnRoYXRSZXR1cm5zTnVsbCxldmVudFBoYXNlOm51bGws YnViYmxlczpudWxsLGNhbmNlbGFibGU6bnVsbCx0aW1lU3RhbXA6ZnVuY3Rpb24oZSl7cmV0dXJu IGUudGltZVN0YW1wfHxEYXRlLm5vdygpfSxkZWZhdWx0UHJldmVudGVkOm51bGwsaXNUcnVzdGVk Om51bGx9O28oci5wcm90b3R5cGUse3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5kZWZh dWx0UHJldmVudGVkPSEwO3ZhciBlPXRoaXMubmF0aXZlRXZlbnQ7ZSYmKGUucHJldmVudERlZmF1 bHQ/ZS5wcmV2ZW50RGVmYXVsdCgpOiJ1bmtub3duIiE9dHlwZW9mIGUucmV0dXJuVmFsdWUmJihl LnJldHVyblZhbHVlPSExKSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1hLnRoYXRSZXR1cm5zVHJ1 ZSl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMubmF0aXZlRXZlbnQ7ZSYm KGUuc3RvcFByb3BhZ2F0aW9uP2Uuc3RvcFByb3BhZ2F0aW9uKCk6InVua25vd24iIT10eXBlb2Yg ZS5jYW5jZWxCdWJibGUmJihlLmNhbmNlbEJ1YmJsZT0hMCksdGhpcy5pc1Byb3BhZ2F0aW9uU3Rv cHBlZD1hLnRoYXRSZXR1cm5zVHJ1ZSl9LHBlcnNpc3Q6ZnVuY3Rpb24oKXt0aGlzLmlzUGVyc2lz dGVudD1hLnRoYXRSZXR1cm5zVHJ1ZX0saXNQZXJzaXN0ZW50OmEudGhhdFJldHVybnNGYWxzZSxk ZXN0cnVjdG9yOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5jb25zdHJ1Y3Rvci5JbnRlcmZhY2U7Zm9y KHZhciB0IGluIGUpdGhpc1t0XT1udWxsO2Zvcih2YXIgbj0wO248cy5sZW5ndGg7bisrKXRoaXNb c1tuXV09bnVsbH19KSxyLkludGVyZmFjZT11LHIuYXVnbWVudENsYXNzPWZ1bmN0aW9uKGUsdCl7 dmFyIG49dGhpcyxyPWZ1bmN0aW9uKCl7fTtyLnByb3RvdHlwZT1uLnByb3RvdHlwZTt2YXIgYT1u ZXcgcjtvKGEsZS5wcm90b3R5cGUpLGUucHJvdG90eXBlPWEsZS5wcm90b3R5cGUuY29uc3RydWN0 b3I9ZSxlLkludGVyZmFjZT1vKHt9LG4uSW50ZXJmYWNlLHQpLGUuYXVnbWVudENsYXNzPW4uYXVn bWVudENsYXNzLGkuYWRkUG9vbGluZ1RvKGUsaS5mb3VyQXJndW1lbnRQb29sZXIpfSxpLmFkZFBv b2xpbmdUbyhyLGkuZm91ckFyZ3VtZW50UG9vbGVyKSx0LmV4cG9ydHM9cn0sezEyNjoxMjYsMTM5 OjEzOSwxNDA6MTQwLDI0OjI0fV0sODE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVu Y3Rpb24gcihlLHQsbixyKXtyZXR1cm4gby5jYWxsKHRoaXMsZSx0LG4scil9dmFyIG89ZSg4Nyks aT17cmVsYXRlZFRhcmdldDpudWxsfTtvLmF1Z21lbnRDbGFzcyhyLGkpLHQuZXhwb3J0cz1yfSx7 ODc6ODd9XSw4MjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxu LHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDgwKSxpPXtkYXRhOm51bGx9 O28uYXVnbWVudENsYXNzKHIsaSksdC5leHBvcnRzPXJ9LHs4MDo4MH1dLDgzOltmdW5jdGlvbihl LHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4scil7cmV0dXJuIG8uY2FsbCh0aGlz LGUsdCxuLHIpfXZhciBvPWUoODcpLGk9ZSg5OCksYT1lKDk5KSxzPWUoMTAwKSx1PXtrZXk6YSxs b2NhdGlvbjpudWxsLGN0cmxLZXk6bnVsbCxzaGlmdEtleTpudWxsLGFsdEtleTpudWxsLG1ldGFL ZXk6bnVsbCxyZXBlYXQ6bnVsbCxsb2NhbGU6bnVsbCxnZXRNb2RpZmllclN0YXRlOnMsY2hhckNv ZGU6ZnVuY3Rpb24oZSl7cmV0dXJuImtleXByZXNzIj09PWUudHlwZT9pKGUpOjB9LGtleUNvZGU6 ZnVuY3Rpb24oZSl7cmV0dXJuImtleWRvd24iPT09ZS50eXBlfHwia2V5dXAiPT09ZS50eXBlP2Uu a2V5Q29kZTowfSx3aGljaDpmdW5jdGlvbihlKXtyZXR1cm4ia2V5cHJlc3MiPT09ZS50eXBlP2ko ZSk6ImtleWRvd24iPT09ZS50eXBlfHwia2V5dXAiPT09ZS50eXBlP2Uua2V5Q29kZTowfX07by5h dWdtZW50Q2xhc3Mocix1KSx0LmV4cG9ydHM9cn0sezEwMDoxMDAsODc6ODcsOTg6OTgsOTk6OTl9 XSw4NDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3Jl dHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDg3KSxpPWUoOTApLGE9ZSgxMDApLHM9 e3NjcmVlblg6bnVsbCxzY3JlZW5ZOm51bGwsY2xpZW50WDpudWxsLGNsaWVudFk6bnVsbCxjdHJs S2V5Om51bGwsc2hpZnRLZXk6bnVsbCxhbHRLZXk6bnVsbCxtZXRhS2V5Om51bGwsZ2V0TW9kaWZp ZXJTdGF0ZTphLGJ1dHRvbjpmdW5jdGlvbihlKXt2YXIgdD1lLmJ1dHRvbjtyZXR1cm4id2hpY2gi aW4gZT90OjI9PT10PzI6ND09PXQ/MTowfSxidXR0b25zOm51bGwscmVsYXRlZFRhcmdldDpmdW5j dGlvbihlKXtyZXR1cm4gZS5yZWxhdGVkVGFyZ2V0fHwoZS5mcm9tRWxlbWVudD09PWUuc3JjRWxl bWVudD9lLnRvRWxlbWVudDplLmZyb21FbGVtZW50KX0scGFnZVg6ZnVuY3Rpb24oZSl7cmV0dXJu InBhZ2VYImluIGU/ZS5wYWdlWDplLmNsaWVudFgraS5jdXJyZW50U2Nyb2xsTGVmdH0scGFnZVk6 ZnVuY3Rpb24oZSl7cmV0dXJuInBhZ2VZImluIGU/ZS5wYWdlWTplLmNsaWVudFkraS5jdXJyZW50 U2Nyb2xsVG9wfX07by5hdWdtZW50Q2xhc3MocixzKSx0LmV4cG9ydHM9cn0sezEwMDoxMDAsODc6 ODcsOTA6OTB9XSw4NTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUs dCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDg3KSxpPWUoMTAwKSxh PXt0b3VjaGVzOm51bGwsdGFyZ2V0VG91Y2hlczpudWxsLGNoYW5nZWRUb3VjaGVzOm51bGwsYWx0 S2V5Om51bGwsbWV0YUtleTpudWxsLGN0cmxLZXk6bnVsbCxzaGlmdEtleTpudWxsLGdldE1vZGlm aWVyU3RhdGU6aX07by5hdWdtZW50Q2xhc3MocixhKSx0LmV4cG9ydHM9cn0sezEwMDoxMDAsODc6 ODd9XSw4NjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIp e3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDgwKSxpPXtwcm9wZXJ0eU5hbWU6 bnVsbCxlbGFwc2VkVGltZTpudWxsLHBzZXVkb0VsZW1lbnQ6bnVsbH07by5hdWdtZW50Q2xhc3Mo cixpKSx0LmV4cG9ydHM9cn0sezgwOjgwfV0sODc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmlj dCI7ZnVuY3Rpb24gcihlLHQsbixyKXtyZXR1cm4gby5jYWxsKHRoaXMsZSx0LG4scil9dmFyIG89 ZSg4MCksaT1lKDEwMSksYT17dmlldzpmdW5jdGlvbihlKXtpZihlLnZpZXcpcmV0dXJuIGUudmll dzt2YXIgdD1pKGUpO2lmKHQud2luZG93PT09dClyZXR1cm4gdDt2YXIgbj10Lm93bmVyRG9jdW1l bnQ7cmV0dXJuIG4/bi5kZWZhdWx0Vmlld3x8bi5wYXJlbnRXaW5kb3c6d2luZG93fSxkZXRhaWw6 ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGV0YWlsfHwwfX07by5hdWdtZW50Q2xhc3MocixhKSx0LmV4 cG9ydHM9cn0sezEwMToxMDEsODA6ODB9XSw4ODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0 IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1l KDg0KSxpPXtkZWx0YVg6ZnVuY3Rpb24oZSl7cmV0dXJuImRlbHRhWCJpbiBlP2UuZGVsdGFYOiJ3 aGVlbERlbHRhWCJpbiBlPy1lLndoZWVsRGVsdGFYOjB9LGRlbHRhWTpmdW5jdGlvbihlKXtyZXR1 cm4iZGVsdGFZImluIGU/ZS5kZWx0YVk6IndoZWVsRGVsdGFZImluIGU/LWUud2hlZWxEZWx0YVk6 IndoZWVsRGVsdGEiaW4gZT8tZS53aGVlbERlbHRhOjB9LGRlbHRhWjpudWxsLGRlbHRhTW9kZTpu dWxsfTtvLmF1Z21lbnRDbGFzcyhyLGkpLHQuZXhwb3J0cz1yfSx7ODQ6ODR9XSw4OTpbZnVuY3Rp b24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDExMSksbz0oZSgxMzQpLHt9KSxpPXtyZWlu aXRpYWxpemVUcmFuc2FjdGlvbjpmdW5jdGlvbigpe3RoaXMudHJhbnNhY3Rpb25XcmFwcGVycz10 aGlzLmdldFRyYW5zYWN0aW9uV3JhcHBlcnMoKSx0aGlzLndyYXBwZXJJbml0RGF0YT90aGlzLndy YXBwZXJJbml0RGF0YS5sZW5ndGg9MDp0aGlzLndyYXBwZXJJbml0RGF0YT1bXSx0aGlzLl9pc0lu VHJhbnNhY3Rpb249ITF9LF9pc0luVHJhbnNhY3Rpb246ITEsZ2V0VHJhbnNhY3Rpb25XcmFwcGVy czpudWxsLGlzSW5UcmFuc2FjdGlvbjpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5faXNJblRyYW5z YWN0aW9ufSxwZXJmb3JtOmZ1bmN0aW9uKGUsdCxuLG8saSxhLHMsdSl7dGhpcy5pc0luVHJhbnNh Y3Rpb24oKT9yKCIyNyIpOnZvaWQgMDt2YXIgbCxjO3RyeXt0aGlzLl9pc0luVHJhbnNhY3Rpb249 ITAsbD0hMCx0aGlzLmluaXRpYWxpemVBbGwoMCksYz1lLmNhbGwodCxuLG8saSxhLHMsdSksbD0h MX1maW5hbGx5e3RyeXtpZihsKXRyeXt0aGlzLmNsb3NlQWxsKDApfWNhdGNoKGUpe31lbHNlIHRo aXMuY2xvc2VBbGwoMCl9ZmluYWxseXt0aGlzLl9pc0luVHJhbnNhY3Rpb249ITF9fXJldHVybiBj fSxpbml0aWFsaXplQWxsOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLnRyYW5zYWN0aW9uV3Jh cHBlcnMsbj1lO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3RyeXt0aGlzLndyYXBwZXJJbml0 RGF0YVtuXT1vLHRoaXMud3JhcHBlckluaXREYXRhW25dPXIuaW5pdGlhbGl6ZT9yLmluaXRpYWxp emUuY2FsbCh0aGlzKTpudWxsfWZpbmFsbHl7aWYodGhpcy53cmFwcGVySW5pdERhdGFbbl09PT1v KXRyeXt0aGlzLmluaXRpYWxpemVBbGwobisxKX1jYXRjaChlKXt9fX19LGNsb3NlQWxsOmZ1bmN0 aW9uKGUpe3RoaXMuaXNJblRyYW5zYWN0aW9uKCk/dm9pZCAwOnIoIjI4Iik7Zm9yKHZhciB0PXRo aXMudHJhbnNhY3Rpb25XcmFwcGVycyxuPWU7bjx0Lmxlbmd0aDtuKyspe3ZhciBpLGE9dFtuXSxz PXRoaXMud3JhcHBlckluaXREYXRhW25dO3RyeXtpPSEwLHMhPT1vJiZhLmNsb3NlJiZhLmNsb3Nl LmNhbGwodGhpcyxzKSxpPSExfWZpbmFsbHl7aWYoaSl0cnl7dGhpcy5jbG9zZUFsbChuKzEpfWNh dGNoKGUpe319fXRoaXMud3JhcHBlckluaXREYXRhLmxlbmd0aD0wfX07dC5leHBvcnRzPWl9LHsx MTE6MTExLDEzNDoxMzR9XSw5MDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17 Y3VycmVudFNjcm9sbExlZnQ6MCxjdXJyZW50U2Nyb2xsVG9wOjAscmVmcmVzaFNjcm9sbFZhbHVl czpmdW5jdGlvbihlKXtyLmN1cnJlbnRTY3JvbGxMZWZ0PWUueCxyLmN1cnJlbnRTY3JvbGxUb3A9 ZS55fX07dC5leHBvcnRzPXJ9LHt9XSw5MTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijtm dW5jdGlvbiByKGUsdCl7cmV0dXJuIG51bGw9PXQ/bygiMzAiKTp2b2lkIDAsbnVsbD09ZT90OkFy cmF5LmlzQXJyYXkoZSk/QXJyYXkuaXNBcnJheSh0KT8oZS5wdXNoLmFwcGx5KGUsdCksZSk6KGUu cHVzaCh0KSxlKTpBcnJheS5pc0FycmF5KHQpP1tlXS5jb25jYXQodCk6W2UsdF19dmFyIG89ZSgx MTEpO2UoMTM0KTt0LmV4cG9ydHM9cn0sezExMToxMTEsMTM0OjEzNH1dLDkyOltmdW5jdGlvbihl LHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7Zm9yKHZhciB0PTEsbj0wLHI9MCxpPWUu bGVuZ3RoLGE9aSYtNDtyPGE7KXtmb3IodmFyIHM9TWF0aC5taW4ocis0MDk2LGEpO3I8cztyKz00 KW4rPSh0Kz1lLmNoYXJDb2RlQXQocikpKyh0Kz1lLmNoYXJDb2RlQXQocisxKSkrKHQrPWUuY2hh ckNvZGVBdChyKzIpKSsodCs9ZS5jaGFyQ29kZUF0KHIrMykpO3QlPW8sbiU9b31mb3IoO3I8aTty Kyspbis9dCs9ZS5jaGFyQ29kZUF0KHIpO3JldHVybiB0JT1vLG4lPW8sdHxuPDwxNn12YXIgbz02 NTUyMTt0LmV4cG9ydHM9cn0se31dLDkzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3Zh ciByPWZ1bmN0aW9uKGUpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgTVNBcHAmJk1TQXBwLmV4 ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uP2Z1bmN0aW9uKHQsbixyLG8pe01TQXBwLmV4ZWNVbnNhZmVM b2NhbEZ1bmN0aW9uKGZ1bmN0aW9uKCl7cmV0dXJuIGUodCxuLHIsbyl9KX06ZX07dC5leHBvcnRz PXJ9LHt9XSw5NDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxu KXt2YXIgcj1udWxsPT10fHwiYm9vbGVhbiI9PXR5cGVvZiB0fHwiIj09PXQ7aWYocilyZXR1cm4i Ijt2YXIgbz1pc05hTih0KTtyZXR1cm4gb3x8MD09PXR8fGkuaGFzT3duUHJvcGVydHkoZSkmJmlb ZV0/IiIrdDooInN0cmluZyI9PXR5cGVvZiB0JiYodD10LnRyaW0oKSksdCsicHgiKX12YXIgbz1l KDQpLGk9KGUoMTM5KSxvLmlzVW5pdGxlc3NOdW1iZXIpO3QuZXhwb3J0cz1yfSx7MTM5OjEzOSw0 OjR9XSw5NTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3ZhciB0 PSIiK2Usbj1pLmV4ZWModCk7aWYoIW4pcmV0dXJuIHQ7dmFyIHIsbz0iIixhPTAscz0wO2Zvcihh PW4uaW5kZXg7YTx0Lmxlbmd0aDthKyspe3N3aXRjaCh0LmNoYXJDb2RlQXQoYSkpe2Nhc2UgMzQ6 cj0iJnF1b3Q7IjticmVhaztjYXNlIDM4OnI9IiZhbXA7IjticmVhaztjYXNlIDM5OnI9IiYjeDI3 OyI7YnJlYWs7Y2FzZSA2MDpyPSImbHQ7IjticmVhaztjYXNlIDYyOnI9IiZndDsiO2JyZWFrO2Rl ZmF1bHQ6Y29udGludWV9cyE9PWEmJihvKz10LnN1YnN0cmluZyhzLGEpKSxzPWErMSxvKz1yfXJl dHVybiBzIT09YT9vK3Quc3Vic3RyaW5nKHMsYSk6b31mdW5jdGlvbiBvKGUpe3JldHVybiJib29s ZWFuIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZT8iIitlOnIoZSl9dmFyIGk9L1siJyY8 Pl0vO3QuZXhwb3J0cz1vfSx7fV0sOTY6W2Z1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24obil7InVz ZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4scil7aWYoZSYmIm9iamVjdCI9PXR5cGVvZiBlKXt2 YXIgbz1lLGk9dm9pZCAwPT09b1tuXTtpJiZudWxsIT10JiYob1tuXT10KX19ZnVuY3Rpb24gbyhl LHQpe2lmKG51bGw9PWUpcmV0dXJuIGU7dmFyIG49e307cmV0dXJuIGkoZSxyLG4pLG59dmFyIGk9 KGUoMjIpLGUoMTE1KSk7ZSgxMzkpOyJ1bmRlZmluZWQiIT10eXBlb2YgbiYmbi5lbnYsdC5leHBv cnRzPW99KS5jYWxsKHRoaXMsdm9pZCAwKX0sezExNToxMTUsMTM5OjEzOSwyMjoyMn1dLDk3Oltm dW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4pe0FycmF5LmlzQXJy YXkoZSk/ZS5mb3JFYWNoKHQsbik6ZSYmdC5jYWxsKG4sZSl9dC5leHBvcnRzPXJ9LHt9XSw5ODpb ZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3ZhciB0LG49ZS5rZXlD b2RlO3JldHVybiJjaGFyQ29kZSJpbiBlPyh0PWUuY2hhckNvZGUsMD09PXQmJjEzPT09biYmKHQ9 MTMpKTp0PW4sdD49MzJ8fDEzPT09dD90OjB9dC5leHBvcnRzPXJ9LHt9XSw5OTpbZnVuY3Rpb24o ZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe2lmKGUua2V5KXt2YXIgdD1pW2Uua2V5 XXx8ZS5rZXk7aWYoIlVuaWRlbnRpZmllZCIhPT10KXJldHVybiB0fWlmKCJrZXlwcmVzcyI9PT1l LnR5cGUpe3ZhciBuPW8oZSk7cmV0dXJuIDEzPT09bj8iRW50ZXIiOlN0cmluZy5mcm9tQ2hhckNv ZGUobil9cmV0dXJuImtleWRvd24iPT09ZS50eXBlfHwia2V5dXAiPT09ZS50eXBlP2FbZS5rZXlD b2RlXXx8IlVuaWRlbnRpZmllZCI6IiJ9dmFyIG89ZSg5OCksaT17RXNjOiJFc2NhcGUiLFNwYWNl YmFyOiIgIixMZWZ0OiJBcnJvd0xlZnQiLFVwOiJBcnJvd1VwIixSaWdodDoiQXJyb3dSaWdodCIs RG93bjoiQXJyb3dEb3duIixEZWw6IkRlbGV0ZSIsV2luOiJPUyIsTWVudToiQ29udGV4dE1lbnUi LEFwcHM6IkNvbnRleHRNZW51IixTY3JvbGw6IlNjcm9sbExvY2siLE1velByaW50YWJsZUtleToi VW5pZGVudGlmaWVkIn0sYT17ODoiQmFja3NwYWNlIiw5OiJUYWIiLDEyOiJDbGVhciIsMTM6IkVu dGVyIiwxNjoiU2hpZnQiLDE3OiJDb250cm9sIiwxODoiQWx0IiwxOToiUGF1c2UiLDIwOiJDYXBz TG9jayIsMjc6IkVzY2FwZSIsMzI6IiAiLDMzOiJQYWdlVXAiLDM0OiJQYWdlRG93biIsMzU6IkVu ZCIsMzY6IkhvbWUiLDM3OiJBcnJvd0xlZnQiLDM4OiJBcnJvd1VwIiwzOToiQXJyb3dSaWdodCIs NDA6IkFycm93RG93biIsNDU6Ikluc2VydCIsNDY6IkRlbGV0ZSIsMTEyOiJGMSIsMTEzOiJGMiIs MTE0OiJGMyIsMTE1OiJGNCIsMTE2OiJGNSIsMTE3OiJGNiIsMTE4OiJGNyIsMTE5OiJGOCIsMTIw OiJGOSIsMTIxOiJGMTAiLDEyMjoiRjExIiwxMjM6IkYxMiIsMTQ0OiJOdW1Mb2NrIiwxNDU6IlNj cm9sbExvY2siLDIyNDoiTWV0YSJ9O3QuZXhwb3J0cz1yfSx7OTg6OTh9XSwxMDA6W2Z1bmN0aW9u KGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt2YXIgdD10aGlzLG49dC5uYXRpdmVF dmVudDtpZihuLmdldE1vZGlmaWVyU3RhdGUpcmV0dXJuIG4uZ2V0TW9kaWZpZXJTdGF0ZShlKTt2 YXIgcj1pW2VdO3JldHVybiEhciYmISFuW3JdfWZ1bmN0aW9uIG8oZSl7cmV0dXJuIHJ9dmFyIGk9 e0FsdDoiYWx0S2V5IixDb250cm9sOiJjdHJsS2V5IixNZXRhOiJtZXRhS2V5IixTaGlmdDoic2hp ZnRLZXkifTt0LmV4cG9ydHM9b30se31dLDEwMTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0 IjtmdW5jdGlvbiByKGUpe3ZhciB0PWUudGFyZ2V0fHxlLnNyY0VsZW1lbnR8fHdpbmRvdztyZXR1 cm4gdC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCYmKHQ9dC5jb3JyZXNwb25kaW5nVXNlRWxlbWVu dCksMz09PXQubm9kZVR5cGU/dC5wYXJlbnROb2RlOnR9dC5leHBvcnRzPXJ9LHt9XSwxMDI6W2Z1 bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt2YXIgdD1lJiYobyYmZVtv XXx8ZVtpXSk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQpcmV0dXJuIHR9dmFyIG89ImZ1bmN0aW9u Ij09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yLGk9IkBAaXRlcmF0b3IiO3QuZXhwb3J0 cz1yfSx7fV0sMTAzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoKXty ZXR1cm4gbysrfXZhciBvPTE7dC5leHBvcnRzPXJ9LHt9XSwxMDQ6W2Z1bmN0aW9uKGUsdCxuKXsi dXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtmb3IoO2UmJmUuZmlyc3RDaGlsZDspZT1lLmZpcnN0 Q2hpbGQ7cmV0dXJuIGV9ZnVuY3Rpb24gbyhlKXtmb3IoO2U7KXtpZihlLm5leHRTaWJsaW5nKXJl dHVybiBlLm5leHRTaWJsaW5nO2U9ZS5wYXJlbnROb2RlfX1mdW5jdGlvbiBpKGUsdCl7Zm9yKHZh ciBuPXIoZSksaT0wLGE9MDtuOyl7aWYoMz09PW4ubm9kZVR5cGUpe2lmKGE9aStuLnRleHRDb250 ZW50Lmxlbmd0aCxpPD10JiZhPj10KXJldHVybntub2RlOm4sb2Zmc2V0OnQtaX07aT1hfW49cihv KG4pKX19dC5leHBvcnRzPWl9LHt9XSwxMDU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7 ZnVuY3Rpb24gcigpe3JldHVybiFpJiZvLmNhblVzZURPTSYmKGk9InRleHRDb250ZW50ImluIGRv Y3VtZW50LmRvY3VtZW50RWxlbWVudD8idGV4dENvbnRlbnQiOiJpbm5lclRleHQiKSxpfXZhciBv PWUoMTIwKSxpPW51bGw7dC5leHBvcnRzPXJ9LHsxMjA6MTIwfV0sMTA2OltmdW5jdGlvbihlLHQs bil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXt2YXIgbj17fTtyZXR1cm4gbltlLnRvTG93 ZXJDYXNlKCldPXQudG9Mb3dlckNhc2UoKSxuWyJXZWJraXQiK2VdPSJ3ZWJraXQiK3QsblsiTW96 IitlXT0ibW96Iit0LG5bIm1zIitlXT0iTVMiK3QsblsiTyIrZV09Im8iK3QudG9Mb3dlckNhc2Uo KSxufWZ1bmN0aW9uIG8oZSl7aWYoc1tlXSlyZXR1cm4gc1tlXTtpZighYVtlXSlyZXR1cm4gZTt2 YXIgdD1hW2VdO2Zvcih2YXIgbiBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkobikmJm4gaW4gdSly ZXR1cm4gc1tlXT10W25dO3JldHVybiIifXZhciBpPWUoMTIwKSxhPXthbmltYXRpb25lbmQ6cigi QW5pbWF0aW9uIiwiQW5pbWF0aW9uRW5kIiksYW5pbWF0aW9uaXRlcmF0aW9uOnIoIkFuaW1hdGlv biIsIkFuaW1hdGlvbkl0ZXJhdGlvbiIpLGFuaW1hdGlvbnN0YXJ0OnIoIkFuaW1hdGlvbiIsIkFu aW1hdGlvblN0YXJ0IiksdHJhbnNpdGlvbmVuZDpyKCJUcmFuc2l0aW9uIiwiVHJhbnNpdGlvbkVu ZCIpfSxzPXt9LHU9e307aS5jYW5Vc2VET00mJih1PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRp diIpLnN0eWxlLCJBbmltYXRpb25FdmVudCJpbiB3aW5kb3d8fChkZWxldGUgYS5hbmltYXRpb25l bmQuYW5pbWF0aW9uLGRlbGV0ZSBhLmFuaW1hdGlvbml0ZXJhdGlvbi5hbmltYXRpb24sZGVsZXRl IGEuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uKSwiVHJhbnNpdGlvbkV2ZW50ImluIHdpbmRvd3x8 ZGVsZXRlIGEudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uKSx0LmV4cG9ydHM9b30sezEyMDoxMjB9 XSwxMDc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtpZihlKXt2 YXIgdD1lLmdldE5hbWUoKTtpZih0KXJldHVybiIgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2Yg YCIrdCsiYC4ifXJldHVybiIifWZ1bmN0aW9uIG8oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9m IGUmJiJ1bmRlZmluZWQiIT10eXBlb2YgZS5wcm90b3R5cGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBl LnByb3RvdHlwZS5tb3VudENvbXBvbmVudCYmImZ1bmN0aW9uIj09dHlwZW9mIGUucHJvdG90eXBl LnJlY2VpdmVDb21wb25lbnR9ZnVuY3Rpb24gaShlLHQpe3ZhciBuO2lmKG51bGw9PT1lfHxlPT09 ITEpbj1sLmNyZWF0ZShpKTtlbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgZSl7dmFyIHM9ZSx1PXMu dHlwZTtpZigiZnVuY3Rpb24iIT10eXBlb2YgdSYmInN0cmluZyIhPXR5cGVvZiB1KXt2YXIgZD0i IjtkKz1yKHMuX293bmVyKSxhKCIxMzAiLG51bGw9PXU/dTp0eXBlb2YgdSxkKX0ic3RyaW5nIj09 dHlwZW9mIHMudHlwZT9uPWMuY3JlYXRlSW50ZXJuYWxDb21wb25lbnQocyk6byhzLnR5cGUpPyhu PW5ldyBzLnR5cGUocyksbi5nZXRIb3N0Tm9kZXx8KG4uZ2V0SG9zdE5vZGU9bi5nZXROYXRpdmVO b2RlKSk6bj1uZXcgcChzKX1lbHNlInN0cmluZyI9PXR5cGVvZiBlfHwibnVtYmVyIj09dHlwZW9m IGU/bj1jLmNyZWF0ZUluc3RhbmNlRm9yVGV4dChlKTphKCIxMzEiLHR5cGVvZiBlKTtyZXR1cm4g bi5fbW91bnRJbmRleD0wLG4uX21vdW50SW1hZ2U9bnVsbCxufXZhciBhPWUoMTExKSxzPWUoMTQw KSx1PWUoMjkpLGw9ZSg0OCksYz1lKDUzKSxwPShlKDEwMyksZSgxMzQpLGUoMTM5KSxmdW5jdGlv bihlKXt0aGlzLmNvbnN0cnVjdChlKX0pO3MocC5wcm90b3R5cGUsdSx7X2luc3RhbnRpYXRlUmVh Y3RDb21wb25lbnQ6aX0pLHQuZXhwb3J0cz1pfSx7MTAzOjEwMywxMTE6MTExLDEzNDoxMzQsMTM5 OjEzOSwxNDA6MTQwLDI5OjI5LDQ4OjQ4LDUzOjUzfV0sMTA4OltmdW5jdGlvbihlLHQsbil7InVz ZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXtpZighaS5jYW5Vc2VET018fHQmJiEoImFkZEV2ZW50 TGlzdGVuZXIiaW4gZG9jdW1lbnQpKXJldHVybiExO3ZhciBuPSJvbiIrZSxyPW4gaW4gZG9jdW1l bnQ7aWYoIXIpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Euc2V0QXR0cmli dXRlKG4sInJldHVybjsiKSxyPSJmdW5jdGlvbiI9PXR5cGVvZiBhW25dfXJldHVybiFyJiZvJiYi d2hlZWwiPT09ZSYmKHI9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZSgiRXZlbnRz LndoZWVsIiwiMy4wIikpLHJ9dmFyIG8saT1lKDEyMCk7aS5jYW5Vc2VET00mJihvPWRvY3VtZW50 LmltcGxlbWVudGF0aW9uJiZkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlJiZkb2N1 bWVudC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCIiLCIiKSE9PSEwKSx0LmV4cG9ydHM9cn0s ezEyMDoxMjB9XSwxMDk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihl KXt2YXIgdD1lJiZlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlu cHV0Ij09PXQ/ISFvW2UudHlwZV06InRleHRhcmVhIj09PXR9dmFyIG89e2NvbG9yOiEwLGRhdGU6 ITAsZGF0ZXRpbWU6ITAsImRhdGV0aW1lLWxvY2FsIjohMCxlbWFpbDohMCxtb250aDohMCxudW1i ZXI6ITAscGFzc3dvcmQ6ITAscmFuZ2U6ITAsc2VhcmNoOiEwLHRlbDohMCx0ZXh0OiEwLHRpbWU6 ITAsdXJsOiEwLHdlZWs6ITB9O3QuZXhwb3J0cz1yfSx7fV0sMTEwOltmdW5jdGlvbihlLHQsbil7 InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuJyInK28oZSkrJyInfXZhciBvPWUoOTUp O3QuZXhwb3J0cz1yfSx7OTU6OTV9XSwxMTE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7 ZnVuY3Rpb24gcihlKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aC0xLG49Ik1pbmlmaWVkIFJl YWN0IGVycm9yICMiK2UrIjsgdmlzaXQgaHR0cDovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9k b2NzL2Vycm9yLWRlY29kZXIuaHRtbD9pbnZhcmlhbnQ9IitlLHI9MDtyPHQ7cisrKW4rPSImYXJn c1tdPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3VtZW50c1tyKzFdKTtuKz0iIGZvciB0aGUgZnVs bCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVs bCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4iO3ZhciBvPW5ldyBFcnJv cihuKTt0aHJvdyBvLm5hbWU9IkludmFyaWFudCBWaW9sYXRpb24iLG8uZnJhbWVzVG9Qb3A9MSxv fXQuZXhwb3J0cz1yfSx7fV0sMTEyOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciBy LG89ZSgxMjApLGk9ZSgxMCksYT0vXlsgXHJcblx0XGZdLyxzPS88KCEtLXxsaW5rfG5vc2NyaXB0 fG1ldGF8c2NyaXB0fHN0eWxlKVsgXHJcblx0XGZcLz5dLyx1PWUoOTMpLGw9dShmdW5jdGlvbihl LHQpe2lmKGUubmFtZXNwYWNlVVJJIT09aS5zdmd8fCJpbm5lckhUTUwiaW4gZSllLmlubmVySFRN TD10O2Vsc2V7cj1yfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxyLmlubmVySFRNTD0i PHN2Zz4iK3QrIjwvc3ZnPiI7Zm9yKHZhciBuPXIuZmlyc3RDaGlsZDtuLmZpcnN0Q2hpbGQ7KWUu YXBwZW5kQ2hpbGQobi5maXJzdENoaWxkKX19KTtpZihvLmNhblVzZURPTSl7dmFyIGM9ZG9jdW1l bnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pbm5lckhUTUw9IiAiLCIiPT09Yy5pbm5lckhUTUwm JihsPWZ1bmN0aW9uKGUsdCl7aWYoZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUucmVwbGFjZUNo aWxkKGUsZSksYS50ZXN0KHQpfHwiPCI9PT10WzBdJiZzLnRlc3QodCkpe2UuaW5uZXJIVE1MPVN0 cmluZy5mcm9tQ2hhckNvZGUoNjUyNzkpK3Q7dmFyIG49ZS5maXJzdENoaWxkOzE9PT1uLmRhdGEu bGVuZ3RoP2UucmVtb3ZlQ2hpbGQobik6bi5kZWxldGVEYXRhKDAsMSl9ZWxzZSBlLmlubmVySFRN TD10fSksYz1udWxsfXQuZXhwb3J0cz1sfSx7MTA6MTAsMTIwOjEyMCw5Mzo5M31dLDExMzpbZnVu Y3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDEyMCksbz1lKDk1KSxpPWUoMTEyKSxh PWZ1bmN0aW9uKGUsdCl7aWYodCl7dmFyIG49ZS5maXJzdENoaWxkO2lmKG4mJm49PT1lLmxhc3RD aGlsZCYmMz09PW4ubm9kZVR5cGUpcmV0dXJuIHZvaWQobi5ub2RlVmFsdWU9dCl9ZS50ZXh0Q29u dGVudD10fTtyLmNhblVzZURPTSYmKCJ0ZXh0Q29udGVudCJpbiBkb2N1bWVudC5kb2N1bWVudEVs ZW1lbnR8fChhPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIDM9PT1lLm5vZGVUeXBlP3ZvaWQoZS5ub2Rl VmFsdWU9dCk6dm9pZCBpKGUsbyh0KSl9KSksdC5leHBvcnRzPWF9LHsxMTI6MTEyLDEyMDoxMjAs OTU6OTV9XSwxMTQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQp e3ZhciBuPW51bGw9PT1lfHxlPT09ITEscj1udWxsPT09dHx8dD09PSExO2lmKG58fHIpcmV0dXJu IG49PT1yO3ZhciBvPXR5cGVvZiBlLGk9dHlwZW9mIHQ7cmV0dXJuInN0cmluZyI9PT1vfHwibnVt YmVyIj09PW8/InN0cmluZyI9PT1pfHwibnVtYmVyIj09PWk6Im9iamVjdCI9PT1pJiZlLnR5cGU9 PT10LnR5cGUmJmUua2V5PT09dC5rZXl9dC5leHBvcnRzPXJ9LHt9XSwxMTU6W2Z1bmN0aW9uKGUs dCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3JldHVybiBlJiYib2JqZWN0Ij09dHlw ZW9mIGUmJm51bGwhPWUua2V5P2wuZXNjYXBlKGUua2V5KTp0LnRvU3RyaW5nKDM2KX1mdW5jdGlv biBvKGUsdCxuLGkpe3ZhciBkPXR5cGVvZiBlO2lmKCJ1bmRlZmluZWQiIT09ZCYmImJvb2xlYW4i IT09ZHx8KGU9bnVsbCksbnVsbD09PWV8fCJzdHJpbmciPT09ZHx8Im51bWJlciI9PT1kfHwib2Jq ZWN0Ij09PWQmJmUuJCR0eXBlb2Y9PT1zKXJldHVybiBuKGksZSwiIj09PXQ/YytyKGUsMCk6dCks MTt2YXIgZixoLHY9MCxtPSIiPT09dD9jOnQrcDtpZihBcnJheS5pc0FycmF5KGUpKWZvcih2YXIg Zz0wO2c8ZS5sZW5ndGg7ZysrKWY9ZVtnXSxoPW0rcihmLGcpLHYrPW8oZixoLG4saSk7ZWxzZXt2 YXIgeT11KGUpO2lmKHkpe3ZhciBDLF89eS5jYWxsKGUpO2lmKHkhPT1lLmVudHJpZXMpZm9yKHZh ciBiPTA7IShDPV8ubmV4dCgpKS5kb25lOylmPUMudmFsdWUsaD1tK3IoZixiKyspLHYrPW8oZixo LG4saSk7ZWxzZSBmb3IoOyEoQz1fLm5leHQoKSkuZG9uZTspe3ZhciBFPUMudmFsdWU7RSYmKGY9 RVsxXSxoPW0rbC5lc2NhcGUoRVswXSkrcCtyKGYsMCksdis9byhmLGgsbixpKSl9fWVsc2UgaWYo Im9iamVjdCI9PT1kKXt2YXIgeD0iIix3PVN0cmluZyhlKTthKCIzMSIsIltvYmplY3QgT2JqZWN0 XSI9PT13PyJvYmplY3Qgd2l0aCBrZXlzIHsiK09iamVjdC5rZXlzKGUpLmpvaW4oIiwgIikrIn0i OncseCl9fXJldHVybiB2fWZ1bmN0aW9uIGkoZSx0LG4pe3JldHVybiBudWxsPT1lPzA6byhlLCIi LHQsbil9dmFyIGE9ZSgxMTEpLHM9KGUoMTE3KSxlKDQ3KSksdT1lKDEwMiksbD0oZSgxMzQpLGUo MjIpKSxjPShlKDEzOSksIi4iKSxwPSI6Ijt0LmV4cG9ydHM9aX0sezEwMjoxMDIsMTExOjExMSwx MTc6MTE3LDEzNDoxMzQsMTM5OjEzOSwyMjoyMiw0Nzo0N31dLDExNjpbZnVuY3Rpb24oZSx0LG4p eyJ1c2Ugc3RyaWN0Ijt2YXIgcj0oZSgxNDApLGUoMTI2KSksbz0oZSgxMzkpLHIpO3QuZXhwb3J0 cz1vfSx7MTI2OjEyNiwxMzk6MTM5LDE0MDoxNDB9XSwxMTc6W2Z1bmN0aW9uKHQsbixyKXsidXNl IHN0cmljdCI7dmFyIG89ZS5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lM TF9CRV9GSVJFRDtuLmV4cG9ydHM9by5SZWFjdEN1cnJlbnRPd25lcn0se31dLDExODpbZnVuY3Rp b24odCxuLHIpeyJ1c2Ugc3RyaWN0IjtuLmV4cG9ydHM9ZX0se31dLDExOTpbZnVuY3Rpb24oZSx0 LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDEyNiksbz17bGlzdGVuOmZ1bmN0aW9uKGUsdCxuKXty ZXR1cm4gZS5hZGRFdmVudExpc3RlbmVyPyhlLmFkZEV2ZW50TGlzdGVuZXIodCxuLCExKSx7cmVt b3ZlOmZ1bmN0aW9uKCl7ZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiwhMSl9fSk6ZS5hdHRhY2hF dmVudD8oZS5hdHRhY2hFdmVudCgib24iK3Qsbikse3JlbW92ZTpmdW5jdGlvbigpe2UuZGV0YWNo RXZlbnQoIm9uIit0LG4pfX0pOnZvaWQgMH0sY2FwdHVyZTpmdW5jdGlvbihlLHQsbil7cmV0dXJu IGUuYWRkRXZlbnRMaXN0ZW5lcj8oZS5hZGRFdmVudExpc3RlbmVyKHQsbiwhMCkse3JlbW92ZTpm dW5jdGlvbigpe2UucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4sITApfX0pOntyZW1vdmU6cn19LHJl Z2lzdGVyRGVmYXVsdDpmdW5jdGlvbigpe319O3QuZXhwb3J0cz1vfSx7MTI2OjEyNn1dLDEyMDpb ZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj0hKCJ1bmRlZmluZWQiPT10eXBlb2Yg d2luZG93fHwhd2luZG93LmRvY3VtZW50fHwhd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQp LG89e2NhblVzZURPTTpyLGNhblVzZVdvcmtlcnM6InVuZGVmaW5lZCIhPXR5cGVvZiBXb3JrZXIs Y2FuVXNlRXZlbnRMaXN0ZW5lcnM6ciYmISghd2luZG93LmFkZEV2ZW50TGlzdGVuZXImJiF3aW5k b3cuYXR0YWNoRXZlbnQpLGNhblVzZVZpZXdwb3J0OnImJiEhd2luZG93LnNjcmVlbixpc0luV29y a2VyOiFyfTt0LmV4cG9ydHM9b30se31dLDEyMTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0 IjtmdW5jdGlvbiByKGUpe3JldHVybiBlLnJlcGxhY2UobyxmdW5jdGlvbihlLHQpe3JldHVybiB0 LnRvVXBwZXJDYXNlKCl9KX12YXIgbz0vLSguKS9nO3QuZXhwb3J0cz1yfSx7fV0sMTIyOltmdW5j dGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIG8oZS5yZXBsYWNl KGksIm1zLSIpKX12YXIgbz1lKDEyMSksaT0vXi1tcy0vO3QuZXhwb3J0cz1yfSx7MTIxOjEyMX1d LDEyMzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7cmV0dXJu ISghZXx8IXQpJiYoZT09PXR8fCFvKGUpJiYobyh0KT9yKGUsdC5wYXJlbnROb2RlKToiY29udGFp bnMiaW4gZT9lLmNvbnRhaW5zKHQpOiEhZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmISEoMTYm ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KSkpKX12YXIgbz1lKDEzNik7dC5leHBvcnRzPXJ9 LHsxMzY6MTM2fV0sMTI0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIo ZSl7dmFyIHQ9ZS5sZW5ndGg7aWYoQXJyYXkuaXNBcnJheShlKXx8Im9iamVjdCIhPXR5cGVvZiBl JiYiZnVuY3Rpb24iIT10eXBlb2YgZT9hKCExKTp2b2lkIDAsIm51bWJlciIhPXR5cGVvZiB0P2Eo ITEpOnZvaWQgMCwwPT09dHx8dC0xIGluIGU/dm9pZCAwOmEoITEpLCJmdW5jdGlvbiI9PXR5cGVv ZiBlLmNhbGxlZT9hKCExKTp2b2lkIDAsZS5oYXNPd25Qcm9wZXJ0eSl0cnl7cmV0dXJuIEFycmF5 LnByb3RvdHlwZS5zbGljZS5jYWxsKGUpfWNhdGNoKGUpe31mb3IodmFyIG49QXJyYXkodCkscj0w O3I8dDtyKyspbltyXT1lW3JdO3JldHVybiBufWZ1bmN0aW9uIG8oZSl7cmV0dXJuISFlJiYoIm9i amVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZSkmJiJsZW5ndGgiaW4gZSYmISgi c2V0SW50ZXJ2YWwiaW4gZSkmJiJudW1iZXIiIT10eXBlb2YgZS5ub2RlVHlwZSYmKEFycmF5Lmlz QXJyYXkoZSl8fCJjYWxsZWUiaW4gZXx8Iml0ZW0iaW4gZSl9ZnVuY3Rpb24gaShlKXtyZXR1cm4g byhlKT9BcnJheS5pc0FycmF5KGUpP2Uuc2xpY2UoKTpyKGUpOltlXX12YXIgYT1lKDEzNCk7dC5l eHBvcnRzPWl9LHsxMzQ6MTM0fV0sMTI1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1 bmN0aW9uIHIoZSl7dmFyIHQ9ZS5tYXRjaChjKTtyZXR1cm4gdCYmdFsxXS50b0xvd2VyQ2FzZSgp fWZ1bmN0aW9uIG8oZSx0KXt2YXIgbj1sO2w/dm9pZCAwOnUoITEpO3ZhciBvPXIoZSksaT1vJiZz KG8pO2lmKGkpe24uaW5uZXJIVE1MPWlbMV0rZStpWzJdO2Zvcih2YXIgYz1pWzBdO2MtLTspbj1u Lmxhc3RDaGlsZH1lbHNlIG4uaW5uZXJIVE1MPWU7dmFyIHA9bi5nZXRFbGVtZW50c0J5VGFnTmFt ZSgic2NyaXB0Iik7cC5sZW5ndGgmJih0P3ZvaWQgMDp1KCExKSxhKHApLmZvckVhY2godCkpO2Zv cih2YXIgZD1BcnJheS5mcm9tKG4uY2hpbGROb2Rlcyk7bi5sYXN0Q2hpbGQ7KW4ucmVtb3ZlQ2hp bGQobi5sYXN0Q2hpbGQpO3JldHVybiBkfXZhciBpPWUoMTIwKSxhPWUoMTI0KSxzPWUoMTMwKSx1 PWUoMTM0KSxsPWkuY2FuVXNlRE9NP2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOm51bGws Yz0vXlxzKjwoXHcrKS87dC5leHBvcnRzPW99LHsxMjA6MTIwLDEyNDoxMjQsMTMwOjEzMCwxMzQ6 MTM0fV0sMTI2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0 dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGV9fXZhciBvPWZ1bmN0aW9uKCl7fTtvLnRoYXRSZXR1cm5z PXIsby50aGF0UmV0dXJuc0ZhbHNlPXIoITEpLG8udGhhdFJldHVybnNUcnVlPXIoITApLG8udGhh dFJldHVybnNOdWxsPXIobnVsbCksby50aGF0UmV0dXJuc1RoaXM9ZnVuY3Rpb24oKXtyZXR1cm4g dGhpc30sby50aGF0UmV0dXJuc0FyZ3VtZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlfSx0LmV4cG9y dHM9b30se31dLDEyNzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17fTt0LmV4 cG9ydHM9cn0se31dLDEyODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBy KGUpe3RyeXtlLmZvY3VzKCl9Y2F0Y2goZSl7fX10LmV4cG9ydHM9cn0se31dLDEyOTpbZnVuY3Rp b24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVv ZiBkb2N1bWVudClyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnR8 fGRvY3VtZW50LmJvZHl9Y2F0Y2goZSl7cmV0dXJuIGRvY3VtZW50LmJvZHl9fXQuZXhwb3J0cz1y fSx7fV0sMTMwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0 dXJuIGE/dm9pZCAwOmkoITEpLGQuaGFzT3duUHJvcGVydHkoZSl8fChlPSIqIikscy5oYXNPd25Q cm9wZXJ0eShlKXx8KCIqIj09PWU/YS5pbm5lckhUTUw9IjxsaW5rIC8+IjphLmlubmVySFRNTD0i PCIrZSsiPjwvIitlKyI+IixzW2VdPSFhLmZpcnN0Q2hpbGQpLHNbZV0/ZFtlXTpudWxsfXZhciBv PWUoMTIwKSxpPWUoMTM0KSxhPW8uY2FuVXNlRE9NP2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRp diIpOm51bGwscz17fSx1PVsxLCc8c2VsZWN0IG11bHRpcGxlPSJ0cnVlIj4nLCI8L3NlbGVjdD4i XSxsPVsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSxjPVszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8 L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxwPVsxLCc8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9y Zy8yMDAwL3N2ZyI+JywiPC9zdmc+Il0sZD17IioiOlsxLCI/PGRpdj4iLCI8L2Rpdj4iXSxhcmVh OlsxLCI8bWFwPiIsIjwvbWFwPiJdLGNvbDpbMiwiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xn cm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9m aWVsZHNldD4iXSxwYXJhbTpbMSwiPG9iamVjdD4iLCI8L29iamVjdD4iXSx0cjpbMiwiPHRhYmxl Pjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sb3B0Z3JvdXA6dSxvcHRpb246dSxjYXB0aW9u OmwsY29sZ3JvdXA6bCx0Ym9keTpsLHRmb290OmwsdGhlYWQ6bCx0ZDpjLHRoOmN9LGY9WyJjaXJj bGUiLCJjbGlwUGF0aCIsImRlZnMiLCJlbGxpcHNlIiwiZyIsImltYWdlIiwibGluZSIsImxpbmVh ckdyYWRpZW50IiwibWFzayIsInBhdGgiLCJwYXR0ZXJuIiwicG9seWdvbiIsInBvbHlsaW5lIiwi cmFkaWFsR3JhZGllbnQiLCJyZWN0Iiwic3RvcCIsInRleHQiLCJ0c3BhbiJdO2YuZm9yRWFjaChm dW5jdGlvbihlKXtkW2VdPXAsc1tlXT0hMH0pLHQuZXhwb3J0cz1yfSx7MTIwOjEyMCwxMzQ6MTM0 fV0sMTMxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJu IGU9PT13aW5kb3c/e3g6d2luZG93LnBhZ2VYT2Zmc2V0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1l bnQuc2Nyb2xsTGVmdCx5OndpbmRvdy5wYWdlWU9mZnNldHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVt ZW50LnNjcm9sbFRvcH06e3g6ZS5zY3JvbGxMZWZ0LHk6ZS5zY3JvbGxUb3B9fXQuZXhwb3J0cz1y fSx7fV0sMTMyOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0 dXJuIGUucmVwbGFjZShvLCItJDEiKS50b0xvd2VyQ2FzZSgpfXZhciBvPS8oW0EtWl0pL2c7dC5l eHBvcnRzPXJ9LHt9XSwxMzM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24g cihlKXtyZXR1cm4gbyhlKS5yZXBsYWNlKGksIi1tcy0iKX12YXIgbz1lKDEzMiksaT0vXm1zLS87 dC5leHBvcnRzPXJ9LHsxMzI6MTMyfV0sMTM0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3Qi O2Z1bmN0aW9uIHIoZSx0LG4scixpLGEscyx1KXtpZihvKHQpLCFlKXt2YXIgbDtpZih2b2lkIDA9 PT10KWw9bmV3IEVycm9yKCJNaW5pZmllZCBleGNlcHRpb24gb2NjdXJyZWQ7IHVzZSB0aGUgbm9u LW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgdGhlIGZ1bGwgZXJyb3IgbWVzc2FnZSBhbmQg YWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLiIpO2Vsc2V7dmFyIGM9W24scixpLGEscyx1XSxw PTA7bD1uZXcgRXJyb3IodC5yZXBsYWNlKC8lcy9nLGZ1bmN0aW9uKCl7cmV0dXJuIGNbcCsrXX0p KSxsLm5hbWU9IkludmFyaWFudCBWaW9sYXRpb24ifXRocm93IGwuZnJhbWVzVG9Qb3A9MSxsfX12 YXIgbz1mdW5jdGlvbihlKXt9O3QuZXhwb3J0cz1yfSx7fV0sMTM1OltmdW5jdGlvbihlLHQsbil7 InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuISghZXx8ISgiZnVuY3Rpb24iPT10eXBl b2YgTm9kZT9lIGluc3RhbmNlb2YgTm9kZToib2JqZWN0Ij09dHlwZW9mIGUmJiJudW1iZXIiPT10 eXBlb2YgZS5ub2RlVHlwZSYmInN0cmluZyI9PXR5cGVvZiBlLm5vZGVOYW1lKSl9dC5leHBvcnRz PXJ9LHt9XSwxMzY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXty ZXR1cm4gbyhlKSYmMz09ZS5ub2RlVHlwZX12YXIgbz1lKDEzNSk7dC5leHBvcnRzPXJ9LHsxMzU6 MTM1fV0sMTM3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dmFy IHQ9e307cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0Lmhhc093blByb3BlcnR5KG4pfHwodFtu XT1lLmNhbGwodGhpcyxuKSksdFtuXX19dC5leHBvcnRzPXJ9LHt9XSwxMzg6W2Z1bmN0aW9uKGUs dCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3JldHVybiBlPT09dD8wIT09ZXx8MCE9 PXR8fDEvZT09PTEvdDplIT09ZSYmdCE9PXR9ZnVuY3Rpb24gbyhlLHQpe2lmKHIoZSx0KSlyZXR1 cm4hMDtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lfHwib2JqZWN0IiE9dHlwZW9mIHR8 fG51bGw9PT10KXJldHVybiExO3ZhciBuPU9iamVjdC5rZXlzKGUpLG89T2JqZWN0LmtleXModCk7 aWYobi5sZW5ndGghPT1vLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIGE9MDthPG4ubGVuZ3RoO2Er KylpZighaS5jYWxsKHQsblthXSl8fCFyKGVbblthXV0sdFtuW2FdXSkpcmV0dXJuITE7cmV0dXJu ITB9dmFyIGk9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt0LmV4cG9ydHM9b30se31d LDEzOTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDEyNiksbz1yO3QuZXhw b3J0cz1vfSx7MTI2OjEyNn1dLDE0MDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5j dGlvbiByKGUpe2lmKG51bGw9PT1lfHx2b2lkIDA9PT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIk9i amVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkIik7cmV0 dXJuIE9iamVjdChlKX1mdW5jdGlvbiBvKCl7dHJ5e2lmKCFPYmplY3QuYXNzaWduKXJldHVybiEx O3ZhciBlPW5ldyBTdHJpbmcoImFiYyIpO2lmKGVbNV09ImRlIiwiNSI9PT1PYmplY3QuZ2V0T3du UHJvcGVydHlOYW1lcyhlKVswXSlyZXR1cm4hMTtmb3IodmFyIHQ9e30sbj0wO248MTA7bisrKXRb Il8iK1N0cmluZy5mcm9tQ2hhckNvZGUobildPW47dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5 TmFtZXModCkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfSk7aWYoIjAxMjM0NTY3ODkiIT09 ci5qb2luKCIiKSlyZXR1cm4hMTt2YXIgbz17fTtyZXR1cm4iYWJjZGVmZ2hpamtsbW5vcHFyc3Qi LnNwbGl0KCIiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe29bZV09ZX0pLCJhYmNkZWZnaGlqa2xtbm9w cXJzdCI9PT1PYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LG8pKS5qb2luKCIiKX1jYXRjaChl KXtyZXR1cm4hMX19dmFyIGk9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxhPU9iamVj dC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7dC5leHBvcnRzPW8oKT9PYmplY3QuYXNz aWduOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuLG8scz1yKGUpLHU9MTt1PGFyZ3VtZW50cy5sZW5n dGg7dSsrKXtuPU9iamVjdChhcmd1bWVudHNbdV0pO2Zvcih2YXIgbCBpbiBuKWkuY2FsbChuLGwp JiYoc1tsXT1uW2xdKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXtvPU9iamVjdC5n ZXRPd25Qcm9wZXJ0eVN5bWJvbHMobik7Zm9yKHZhciBjPTA7YzxvLmxlbmd0aDtjKyspYS5jYWxs KG4sb1tjXSkmJihzW29bY11dPW5bb1tjXV0pfX1yZXR1cm4gc319LHt9XX0se30sWzQxXSkoNDEp fSl9KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisoZnVuY3Rpb24oZil7aWYodHlwZW9m IGV4cG9ydHM9PT0ib2JqZWN0IiYmdHlwZW9mIG1vZHVsZSE9PSJ1bmRlZmluZWQiKXttb2R1bGUu ZXhwb3J0cz1mKHJlcXVpcmUoInJlYWN0IikpfWVsc2UgaWYodHlwZW9mIGRlZmluZT09PSJmdW5j dGlvbiImJmRlZmluZS5hbWQpe2RlZmluZShbInJlYWN0Il0sZil9ZWxzZXt2YXIgZztpZih0eXBl b2Ygd2luZG93IT09InVuZGVmaW5lZCIpe2c9d2luZG93fWVsc2UgaWYodHlwZW9mIGdsb2JhbCE9 PSJ1bmRlZmluZWQiKXtnPWdsb2JhbH1lbHNlIGlmKHR5cGVvZiBzZWxmIT09InVuZGVmaW5lZCIp e2c9c2VsZn1lbHNle2c9dGhpc31nLlJlYWN0RE9NU2VydmVyPWYoZy5SZWFjdCl9fSkoZnVuY3Rp b24oUmVhY3Qpe3JldHVybiBmdW5jdGlvbihmKXtyZXR1cm4gZigpfShmdW5jdGlvbigpe3ZhciBk ZWZpbmUsbW9kdWxlLGV4cG9ydHM7cmV0dXJuIGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMo byx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24i JiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFy IGY9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrbysiJyIpO3Rocm93IGYuY29kZT0i TU9EVUxFX05PVF9GT1VORCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwo bC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxs LGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1 aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltv XSk7cmV0dXJuIHN9KHsxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0 cmljdCI7dmFyIEFSSUFET01Qcm9wZXJ0eUNvbmZpZz17UHJvcGVydGllczp7ImFyaWEtY3VycmVu dCI6MCwiYXJpYS1kZXRhaWxzIjowLCJhcmlhLWRpc2FibGVkIjowLCJhcmlhLWhpZGRlbiI6MCwi YXJpYS1pbnZhbGlkIjowLCJhcmlhLWtleXNob3J0Y3V0cyI6MCwiYXJpYS1sYWJlbCI6MCwiYXJp YS1yb2xlZGVzY3JpcHRpb24iOjAsImFyaWEtYXV0b2NvbXBsZXRlIjowLCJhcmlhLWNoZWNrZWQi OjAsImFyaWEtZXhwYW5kZWQiOjAsImFyaWEtaGFzcG9wdXAiOjAsImFyaWEtbGV2ZWwiOjAsImFy aWEtbW9kYWwiOjAsImFyaWEtbXVsdGlsaW5lIjowLCJhcmlhLW11bHRpc2VsZWN0YWJsZSI6MCwi YXJpYS1vcmllbnRhdGlvbiI6MCwiYXJpYS1wbGFjZWhvbGRlciI6MCwiYXJpYS1wcmVzc2VkIjow LCJhcmlhLXJlYWRvbmx5IjowLCJhcmlhLXJlcXVpcmVkIjowLCJhcmlhLXNlbGVjdGVkIjowLCJh cmlhLXNvcnQiOjAsImFyaWEtdmFsdWVtYXgiOjAsImFyaWEtdmFsdWVtaW4iOjAsImFyaWEtdmFs dWVub3ciOjAsImFyaWEtdmFsdWV0ZXh0IjowLCJhcmlhLWF0b21pYyI6MCwiYXJpYS1idXN5Ijow LCJhcmlhLWxpdmUiOjAsImFyaWEtcmVsZXZhbnQiOjAsImFyaWEtZHJvcGVmZmVjdCI6MCwiYXJp YS1ncmFiYmVkIjowLCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnQiOjAsImFyaWEtY29sY291bnQiOjAs ImFyaWEtY29saW5kZXgiOjAsImFyaWEtY29sc3BhbiI6MCwiYXJpYS1jb250cm9scyI6MCwiYXJp YS1kZXNjcmliZWRieSI6MCwiYXJpYS1lcnJvcm1lc3NhZ2UiOjAsImFyaWEtZmxvd3RvIjowLCJh cmlhLWxhYmVsbGVkYnkiOjAsImFyaWEtb3ducyI6MCwiYXJpYS1wb3NpbnNldCI6MCwiYXJpYS1y b3djb3VudCI6MCwiYXJpYS1yb3dpbmRleCI6MCwiYXJpYS1yb3dzcGFuIjowLCJhcmlhLXNldHNp emUiOjB9LERPTUF0dHJpYnV0ZU5hbWVzOnt9LERPTVByb3BlcnR5TmFtZXM6e319O21vZHVsZS5l eHBvcnRzPUFSSUFET01Qcm9wZXJ0eUNvbmZpZ30se31dLDI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9k dWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgUmVhY3RET01Db21wb25lbnRUcmVlPV9kZXJl cV8oMzIpO3ZhciBmb2N1c05vZGU9X2RlcmVxXygxMzQpO3ZhciBBdXRvRm9jdXNVdGlscz17Zm9j dXNET01Db21wb25lbnQ6ZnVuY3Rpb24oKXtmb2N1c05vZGUoUmVhY3RET01Db21wb25lbnRUcmVl LmdldE5vZGVGcm9tSW5zdGFuY2UodGhpcykpfX07bW9kdWxlLmV4cG9ydHM9QXV0b0ZvY3VzVXRp bHN9LHsxMzQ6MTM0LDMyOjMyfV0sMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7 InVzZSBzdHJpY3QiO3ZhciBFdmVudFByb3BhZ2F0b3JzPV9kZXJlcV8oMTkpO3ZhciBFeGVjdXRp b25FbnZpcm9ubWVudD1fZGVyZXFfKDEyNik7dmFyIEZhbGxiYWNrQ29tcG9zaXRpb25TdGF0ZT1f ZGVyZXFfKDIwKTt2YXIgU3ludGhldGljQ29tcG9zaXRpb25FdmVudD1fZGVyZXFfKDgyKTt2YXIg U3ludGhldGljSW5wdXRFdmVudD1fZGVyZXFfKDg2KTt2YXIgRU5EX0tFWUNPREVTPVs5LDEzLDI3 LDMyXTt2YXIgU1RBUlRfS0VZQ09ERT0yMjk7dmFyIGNhblVzZUNvbXBvc2l0aW9uRXZlbnQ9RXhl Y3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NJiYiQ29tcG9zaXRpb25FdmVudCJpbiB3aW5kb3c7 dmFyIGRvY3VtZW50TW9kZT1udWxsO2lmKEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSYm ImRvY3VtZW50TW9kZSJpbiBkb2N1bWVudCl7ZG9jdW1lbnRNb2RlPWRvY3VtZW50LmRvY3VtZW50 TW9kZX12YXIgY2FuVXNlVGV4dElucHV0RXZlbnQ9RXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNl RE9NJiYiVGV4dEV2ZW50ImluIHdpbmRvdyYmIWRvY3VtZW50TW9kZSYmIWlzUHJlc3RvKCk7dmFy IHVzZUZhbGxiYWNrQ29tcG9zaXRpb25EYXRhPUV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURP TSYmKCFjYW5Vc2VDb21wb3NpdGlvbkV2ZW50fHxkb2N1bWVudE1vZGUmJmRvY3VtZW50TW9kZT44 JiZkb2N1bWVudE1vZGU8PTExKTtmdW5jdGlvbiBpc1ByZXN0bygpe3ZhciBvcGVyYT13aW5kb3cu b3BlcmE7cmV0dXJuIHR5cGVvZiBvcGVyYT09PSJvYmplY3QiJiZ0eXBlb2Ygb3BlcmEudmVyc2lv bj09PSJmdW5jdGlvbiImJnBhcnNlSW50KG9wZXJhLnZlcnNpb24oKSwxMCk8PTEyfXZhciBTUEFD RUJBUl9DT0RFPTMyO3ZhciBTUEFDRUJBUl9DSEFSPVN0cmluZy5mcm9tQ2hhckNvZGUoU1BBQ0VC QVJfQ09ERSk7dmFyIGV2ZW50VHlwZXM9e2JlZm9yZUlucHV0OntwaGFzZWRSZWdpc3RyYXRpb25O YW1lczp7YnViYmxlZDoib25CZWZvcmVJbnB1dCIsY2FwdHVyZWQ6Im9uQmVmb3JlSW5wdXRDYXB0 dXJlIn0sZGVwZW5kZW5jaWVzOlsidG9wQ29tcG9zaXRpb25FbmQiLCJ0b3BLZXlQcmVzcyIsInRv cFRleHRJbnB1dCIsInRvcFBhc3RlIl19LGNvbXBvc2l0aW9uRW5kOntwaGFzZWRSZWdpc3RyYXRp b25OYW1lczp7YnViYmxlZDoib25Db21wb3NpdGlvbkVuZCIsY2FwdHVyZWQ6Im9uQ29tcG9zaXRp b25FbmRDYXB0dXJlIn0sZGVwZW5kZW5jaWVzOlsidG9wQmx1ciIsInRvcENvbXBvc2l0aW9uRW5k IiwidG9wS2V5RG93biIsInRvcEtleVByZXNzIiwidG9wS2V5VXAiLCJ0b3BNb3VzZURvd24iXX0s Y29tcG9zaXRpb25TdGFydDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Im9uQ29t cG9zaXRpb25TdGFydCIsY2FwdHVyZWQ6Im9uQ29tcG9zaXRpb25TdGFydENhcHR1cmUifSxkZXBl bmRlbmNpZXM6WyJ0b3BCbHVyIiwidG9wQ29tcG9zaXRpb25TdGFydCIsInRvcEtleURvd24iLCJ0 b3BLZXlQcmVzcyIsInRvcEtleVVwIiwidG9wTW91c2VEb3duIl19LGNvbXBvc2l0aW9uVXBkYXRl OntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDoib25Db21wb3NpdGlvblVwZGF0ZSIs Y2FwdHVyZWQ6Im9uQ29tcG9zaXRpb25VcGRhdGVDYXB0dXJlIn0sZGVwZW5kZW5jaWVzOlsidG9w Qmx1ciIsInRvcENvbXBvc2l0aW9uVXBkYXRlIiwidG9wS2V5RG93biIsInRvcEtleVByZXNzIiwi dG9wS2V5VXAiLCJ0b3BNb3VzZURvd24iXX19O3ZhciBoYXNTcGFjZUtleXByZXNzPWZhbHNlO2Z1 bmN0aW9uIGlzS2V5cHJlc3NDb21tYW5kKG5hdGl2ZUV2ZW50KXtyZXR1cm4obmF0aXZlRXZlbnQu Y3RybEtleXx8bmF0aXZlRXZlbnQuYWx0S2V5fHxuYXRpdmVFdmVudC5tZXRhS2V5KSYmIShuYXRp dmVFdmVudC5jdHJsS2V5JiZuYXRpdmVFdmVudC5hbHRLZXkpfWZ1bmN0aW9uIGdldENvbXBvc2l0 aW9uRXZlbnRUeXBlKHRvcExldmVsVHlwZSl7c3dpdGNoKHRvcExldmVsVHlwZSl7Y2FzZSJ0b3BD b21wb3NpdGlvblN0YXJ0IjpyZXR1cm4gZXZlbnRUeXBlcy5jb21wb3NpdGlvblN0YXJ0O2Nhc2Ui dG9wQ29tcG9zaXRpb25FbmQiOnJldHVybiBldmVudFR5cGVzLmNvbXBvc2l0aW9uRW5kO2Nhc2Ui dG9wQ29tcG9zaXRpb25VcGRhdGUiOnJldHVybiBldmVudFR5cGVzLmNvbXBvc2l0aW9uVXBkYXRl fX1mdW5jdGlvbiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25TdGFydCh0b3BMZXZlbFR5cGUsbmF0aXZl RXZlbnQpe3JldHVybiB0b3BMZXZlbFR5cGU9PT0idG9wS2V5RG93biImJm5hdGl2ZUV2ZW50Lmtl eUNvZGU9PT1TVEFSVF9LRVlDT0RFfWZ1bmN0aW9uIGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZCh0 b3BMZXZlbFR5cGUsbmF0aXZlRXZlbnQpe3N3aXRjaCh0b3BMZXZlbFR5cGUpe2Nhc2UidG9wS2V5 VXAiOnJldHVybiBFTkRfS0VZQ09ERVMuaW5kZXhPZihuYXRpdmVFdmVudC5rZXlDb2RlKSE9PS0x O2Nhc2UidG9wS2V5RG93biI6cmV0dXJuIG5hdGl2ZUV2ZW50LmtleUNvZGUhPT1TVEFSVF9LRVlD T0RFO2Nhc2UidG9wS2V5UHJlc3MiOmNhc2UidG9wTW91c2VEb3duIjpjYXNlInRvcEJsdXIiOnJl dHVybiB0cnVlO2RlZmF1bHQ6cmV0dXJuIGZhbHNlfX1mdW5jdGlvbiBnZXREYXRhRnJvbUN1c3Rv bUV2ZW50KG5hdGl2ZUV2ZW50KXt2YXIgZGV0YWlsPW5hdGl2ZUV2ZW50LmRldGFpbDtpZih0eXBl b2YgZGV0YWlsPT09Im9iamVjdCImJiJkYXRhImluIGRldGFpbCl7cmV0dXJuIGRldGFpbC5kYXRh fXJldHVybiBudWxsfXZhciBjdXJyZW50Q29tcG9zaXRpb249bnVsbDtmdW5jdGlvbiBleHRyYWN0 Q29tcG9zaXRpb25FdmVudCh0b3BMZXZlbFR5cGUsdGFyZ2V0SW5zdCxuYXRpdmVFdmVudCxuYXRp dmVFdmVudFRhcmdldCl7dmFyIGV2ZW50VHlwZTt2YXIgZmFsbGJhY2tEYXRhO2lmKGNhblVzZUNv bXBvc2l0aW9uRXZlbnQpe2V2ZW50VHlwZT1nZXRDb21wb3NpdGlvbkV2ZW50VHlwZSh0b3BMZXZl bFR5cGUpfWVsc2UgaWYoIWN1cnJlbnRDb21wb3NpdGlvbil7aWYoaXNGYWxsYmFja0NvbXBvc2l0 aW9uU3RhcnQodG9wTGV2ZWxUeXBlLG5hdGl2ZUV2ZW50KSl7ZXZlbnRUeXBlPWV2ZW50VHlwZXMu Y29tcG9zaXRpb25TdGFydH19ZWxzZSBpZihpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQodG9wTGV2 ZWxUeXBlLG5hdGl2ZUV2ZW50KSl7ZXZlbnRUeXBlPWV2ZW50VHlwZXMuY29tcG9zaXRpb25FbmR9 aWYoIWV2ZW50VHlwZSl7cmV0dXJuIG51bGx9aWYodXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEp e2lmKCFjdXJyZW50Q29tcG9zaXRpb24mJmV2ZW50VHlwZT09PWV2ZW50VHlwZXMuY29tcG9zaXRp b25TdGFydCl7Y3VycmVudENvbXBvc2l0aW9uPUZhbGxiYWNrQ29tcG9zaXRpb25TdGF0ZS5nZXRQ b29sZWQobmF0aXZlRXZlbnRUYXJnZXQpfWVsc2UgaWYoZXZlbnRUeXBlPT09ZXZlbnRUeXBlcy5j b21wb3NpdGlvbkVuZCl7aWYoY3VycmVudENvbXBvc2l0aW9uKXtmYWxsYmFja0RhdGE9Y3VycmVu dENvbXBvc2l0aW9uLmdldERhdGEoKX19fXZhciBldmVudD1TeW50aGV0aWNDb21wb3NpdGlvbkV2 ZW50LmdldFBvb2xlZChldmVudFR5cGUsdGFyZ2V0SW5zdCxuYXRpdmVFdmVudCxuYXRpdmVFdmVu dFRhcmdldCk7aWYoZmFsbGJhY2tEYXRhKXtldmVudC5kYXRhPWZhbGxiYWNrRGF0YX1lbHNle3Zh ciBjdXN0b21EYXRhPWdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZlRXZlbnQpO2lmKGN1c3Rv bURhdGEhPT1udWxsKXtldmVudC5kYXRhPWN1c3RvbURhdGF9fUV2ZW50UHJvcGFnYXRvcnMuYWNj dW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyhldmVudCk7cmV0dXJuIGV2ZW50fWZ1bmN0aW9uIGdl dE5hdGl2ZUJlZm9yZUlucHV0Q2hhcnModG9wTGV2ZWxUeXBlLG5hdGl2ZUV2ZW50KXtzd2l0Y2go dG9wTGV2ZWxUeXBlKXtjYXNlInRvcENvbXBvc2l0aW9uRW5kIjpyZXR1cm4gZ2V0RGF0YUZyb21D dXN0b21FdmVudChuYXRpdmVFdmVudCk7Y2FzZSJ0b3BLZXlQcmVzcyI6dmFyIHdoaWNoPW5hdGl2 ZUV2ZW50LndoaWNoO2lmKHdoaWNoIT09U1BBQ0VCQVJfQ09ERSl7cmV0dXJuIG51bGx9aGFzU3Bh Y2VLZXlwcmVzcz10cnVlO3JldHVybiBTUEFDRUJBUl9DSEFSO2Nhc2UidG9wVGV4dElucHV0Ijp2 YXIgY2hhcnM9bmF0aXZlRXZlbnQuZGF0YTtpZihjaGFycz09PVNQQUNFQkFSX0NIQVImJmhhc1Nw YWNlS2V5cHJlc3Mpe3JldHVybiBudWxsfXJldHVybiBjaGFycztkZWZhdWx0OnJldHVybiBudWxs fX1mdW5jdGlvbiBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnModG9wTGV2ZWxUeXBlLG5hdGl2 ZUV2ZW50KXtpZihjdXJyZW50Q29tcG9zaXRpb24pe2lmKHRvcExldmVsVHlwZT09PSJ0b3BDb21w b3NpdGlvbkVuZCJ8fCFjYW5Vc2VDb21wb3NpdGlvbkV2ZW50JiZpc0ZhbGxiYWNrQ29tcG9zaXRp b25FbmQodG9wTGV2ZWxUeXBlLG5hdGl2ZUV2ZW50KSl7dmFyIGNoYXJzPWN1cnJlbnRDb21wb3Np dGlvbi5nZXREYXRhKCk7RmFsbGJhY2tDb21wb3NpdGlvblN0YXRlLnJlbGVhc2UoY3VycmVudENv bXBvc2l0aW9uKTtjdXJyZW50Q29tcG9zaXRpb249bnVsbDtyZXR1cm4gY2hhcnN9cmV0dXJuIG51 bGx9c3dpdGNoKHRvcExldmVsVHlwZSl7Y2FzZSJ0b3BQYXN0ZSI6cmV0dXJuIG51bGw7Y2FzZSJ0 b3BLZXlQcmVzcyI6aWYobmF0aXZlRXZlbnQud2hpY2gmJiFpc0tleXByZXNzQ29tbWFuZChuYXRp dmVFdmVudCkpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKG5hdGl2ZUV2ZW50LndoaWNoKX1y ZXR1cm4gbnVsbDtjYXNlInRvcENvbXBvc2l0aW9uRW5kIjpyZXR1cm4gdXNlRmFsbGJhY2tDb21w b3NpdGlvbkRhdGE/bnVsbDpuYXRpdmVFdmVudC5kYXRhO2RlZmF1bHQ6cmV0dXJuIG51bGx9fWZ1 bmN0aW9uIGV4dHJhY3RCZWZvcmVJbnB1dEV2ZW50KHRvcExldmVsVHlwZSx0YXJnZXRJbnN0LG5h dGl2ZUV2ZW50LG5hdGl2ZUV2ZW50VGFyZ2V0KXt2YXIgY2hhcnM7aWYoY2FuVXNlVGV4dElucHV0 RXZlbnQpe2NoYXJzPWdldE5hdGl2ZUJlZm9yZUlucHV0Q2hhcnModG9wTGV2ZWxUeXBlLG5hdGl2 ZUV2ZW50KX1lbHNle2NoYXJzPWdldEZhbGxiYWNrQmVmb3JlSW5wdXRDaGFycyh0b3BMZXZlbFR5 cGUsbmF0aXZlRXZlbnQpfWlmKCFjaGFycyl7cmV0dXJuIG51bGx9dmFyIGV2ZW50PVN5bnRoZXRp Y0lucHV0RXZlbnQuZ2V0UG9vbGVkKGV2ZW50VHlwZXMuYmVmb3JlSW5wdXQsdGFyZ2V0SW5zdCxu YXRpdmVFdmVudCxuYXRpdmVFdmVudFRhcmdldCk7ZXZlbnQuZGF0YT1jaGFycztFdmVudFByb3Bh Z2F0b3JzLmFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMoZXZlbnQpO3JldHVybiBldmVudH12 YXIgQmVmb3JlSW5wdXRFdmVudFBsdWdpbj17ZXZlbnRUeXBlczpldmVudFR5cGVzLGV4dHJhY3RF dmVudHM6ZnVuY3Rpb24odG9wTGV2ZWxUeXBlLHRhcmdldEluc3QsbmF0aXZlRXZlbnQsbmF0aXZl RXZlbnRUYXJnZXQpe3JldHVybltleHRyYWN0Q29tcG9zaXRpb25FdmVudCh0b3BMZXZlbFR5cGUs dGFyZ2V0SW5zdCxuYXRpdmVFdmVudCxuYXRpdmVFdmVudFRhcmdldCksZXh0cmFjdEJlZm9yZUlu cHV0RXZlbnQodG9wTGV2ZWxUeXBlLHRhcmdldEluc3QsbmF0aXZlRXZlbnQsbmF0aXZlRXZlbnRU YXJnZXQpXX19O21vZHVsZS5leHBvcnRzPUJlZm9yZUlucHV0RXZlbnRQbHVnaW59LHsxMjY6MTI2 LDE5OjE5LDIwOjIwLDgyOjgyLDg2Ojg2fV0sNDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhw b3J0cyl7InVzZSBzdHJpY3QiO3ZhciBpc1VuaXRsZXNzTnVtYmVyPXthbmltYXRpb25JdGVyYXRp b25Db3VudDp0cnVlLGJvcmRlckltYWdlT3V0c2V0OnRydWUsYm9yZGVySW1hZ2VTbGljZTp0cnVl LGJvcmRlckltYWdlV2lkdGg6dHJ1ZSxib3hGbGV4OnRydWUsYm94RmxleEdyb3VwOnRydWUsYm94 T3JkaW5hbEdyb3VwOnRydWUsY29sdW1uQ291bnQ6dHJ1ZSxmbGV4OnRydWUsZmxleEdyb3c6dHJ1 ZSxmbGV4UG9zaXRpdmU6dHJ1ZSxmbGV4U2hyaW5rOnRydWUsZmxleE5lZ2F0aXZlOnRydWUsZmxl eE9yZGVyOnRydWUsZ3JpZFJvdzp0cnVlLGdyaWRDb2x1bW46dHJ1ZSxmb250V2VpZ2h0OnRydWUs bGluZUNsYW1wOnRydWUsbGluZUhlaWdodDp0cnVlLG9wYWNpdHk6dHJ1ZSxvcmRlcjp0cnVlLG9y cGhhbnM6dHJ1ZSx0YWJTaXplOnRydWUsd2lkb3dzOnRydWUsekluZGV4OnRydWUsem9vbTp0cnVl LGZpbGxPcGFjaXR5OnRydWUsZmxvb2RPcGFjaXR5OnRydWUsc3RvcE9wYWNpdHk6dHJ1ZSxzdHJv a2VEYXNoYXJyYXk6dHJ1ZSxzdHJva2VEYXNob2Zmc2V0OnRydWUsc3Ryb2tlTWl0ZXJsaW1pdDp0 cnVlLHN0cm9rZU9wYWNpdHk6dHJ1ZSxzdHJva2VXaWR0aDp0cnVlfTtmdW5jdGlvbiBwcmVmaXhL ZXkocHJlZml4LGtleSl7cmV0dXJuIHByZWZpeCtrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkr a2V5LnN1YnN0cmluZygxKX12YXIgcHJlZml4ZXM9WyJXZWJraXQiLCJtcyIsIk1veiIsIk8iXTtP YmplY3Qua2V5cyhpc1VuaXRsZXNzTnVtYmVyKS5mb3JFYWNoKGZ1bmN0aW9uKHByb3Ape3ByZWZp eGVzLmZvckVhY2goZnVuY3Rpb24ocHJlZml4KXtpc1VuaXRsZXNzTnVtYmVyW3ByZWZpeEtleShw cmVmaXgscHJvcCldPWlzVW5pdGxlc3NOdW1iZXJbcHJvcF19KX0pO3ZhciBzaG9ydGhhbmRQcm9w ZXJ0eUV4cGFuc2lvbnM9e2JhY2tncm91bmQ6e2JhY2tncm91bmRBdHRhY2htZW50OnRydWUsYmFj a2dyb3VuZENvbG9yOnRydWUsYmFja2dyb3VuZEltYWdlOnRydWUsYmFja2dyb3VuZFBvc2l0aW9u WDp0cnVlLGJhY2tncm91bmRQb3NpdGlvblk6dHJ1ZSxiYWNrZ3JvdW5kUmVwZWF0OnRydWV9LGJh Y2tncm91bmRQb3NpdGlvbjp7YmFja2dyb3VuZFBvc2l0aW9uWDp0cnVlLGJhY2tncm91bmRQb3Np dGlvblk6dHJ1ZX0sYm9yZGVyOntib3JkZXJXaWR0aDp0cnVlLGJvcmRlclN0eWxlOnRydWUsYm9y ZGVyQ29sb3I6dHJ1ZX0sYm9yZGVyQm90dG9tOntib3JkZXJCb3R0b21XaWR0aDp0cnVlLGJvcmRl ckJvdHRvbVN0eWxlOnRydWUsYm9yZGVyQm90dG9tQ29sb3I6dHJ1ZX0sYm9yZGVyTGVmdDp7Ym9y ZGVyTGVmdFdpZHRoOnRydWUsYm9yZGVyTGVmdFN0eWxlOnRydWUsYm9yZGVyTGVmdENvbG9yOnRy dWV9LGJvcmRlclJpZ2h0Ontib3JkZXJSaWdodFdpZHRoOnRydWUsYm9yZGVyUmlnaHRTdHlsZTp0 cnVlLGJvcmRlclJpZ2h0Q29sb3I6dHJ1ZX0sYm9yZGVyVG9wOntib3JkZXJUb3BXaWR0aDp0cnVl LGJvcmRlclRvcFN0eWxlOnRydWUsYm9yZGVyVG9wQ29sb3I6dHJ1ZX0sZm9udDp7Zm9udFN0eWxl OnRydWUsZm9udFZhcmlhbnQ6dHJ1ZSxmb250V2VpZ2h0OnRydWUsZm9udFNpemU6dHJ1ZSxsaW5l SGVpZ2h0OnRydWUsZm9udEZhbWlseTp0cnVlfSxvdXRsaW5lOntvdXRsaW5lV2lkdGg6dHJ1ZSxv dXRsaW5lU3R5bGU6dHJ1ZSxvdXRsaW5lQ29sb3I6dHJ1ZX19O3ZhciBDU1NQcm9wZXJ0eT17aXNV bml0bGVzc051bWJlcjppc1VuaXRsZXNzTnVtYmVyLHNob3J0aGFuZFByb3BlcnR5RXhwYW5zaW9u czpzaG9ydGhhbmRQcm9wZXJ0eUV4cGFuc2lvbnN9O21vZHVsZS5leHBvcnRzPUNTU1Byb3BlcnR5 fSx7fV0sNTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3Zh ciBDU1NQcm9wZXJ0eT1fZGVyZXFfKDQpO3ZhciBFeGVjdXRpb25FbnZpcm9ubWVudD1fZGVyZXFf KDEyNik7dmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uPV9kZXJlcV8oNTkpO3ZhciBjYW1lbGl6ZVN0 eWxlTmFtZT1fZGVyZXFfKDEyOCk7dmFyIGRhbmdlcm91c1N0eWxlVmFsdWU9X2RlcmVxXyg5OSk7 dmFyIGh5cGhlbmF0ZVN0eWxlTmFtZT1fZGVyZXFfKDEzOSk7dmFyIG1lbW9pemVTdHJpbmdPbmx5 PV9kZXJlcV8oMTQzKTt2YXIgd2FybmluZz1fZGVyZXFfKDE0Nyk7dmFyIHByb2Nlc3NTdHlsZU5h bWU9bWVtb2l6ZVN0cmluZ09ubHkoZnVuY3Rpb24oc3R5bGVOYW1lKXtyZXR1cm4gaHlwaGVuYXRl U3R5bGVOYW1lKHN0eWxlTmFtZSl9KTt2YXIgaGFzU2hvcnRoYW5kUHJvcGVydHlCdWc9ZmFsc2U7 dmFyIHN0eWxlRmxvYXRBY2Nlc3Nvcj0iY3NzRmxvYXQiO2lmKEV4ZWN1dGlvbkVudmlyb25tZW50 LmNhblVzZURPTSl7dmFyIHRlbXBTdHlsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5z dHlsZTt0cnl7dGVtcFN0eWxlLmZvbnQ9IiJ9Y2F0Y2goZSl7aGFzU2hvcnRoYW5kUHJvcGVydHlC dWc9dHJ1ZX1pZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuY3NzRmxvYXQ9PT11bmRl ZmluZWQpe3N0eWxlRmxvYXRBY2Nlc3Nvcj0ic3R5bGVGbG9hdCJ9fWlmKCJkZXZlbG9wbWVudCIh PT0icHJvZHVjdGlvbiIpe3ZhciBiYWRWZW5kb3JlZFN0eWxlTmFtZVBhdHRlcm49L14oPzp3ZWJr aXR8bW96fG8pW0EtWl0vO3ZhciBiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm49Lztc cyokLzt2YXIgd2FybmVkU3R5bGVOYW1lcz17fTt2YXIgd2FybmVkU3R5bGVWYWx1ZXM9e307dmFy IHdhcm5lZEZvck5hTlZhbHVlPWZhbHNlO3ZhciB3YXJuSHlwaGVuYXRlZFN0eWxlTmFtZT1mdW5j dGlvbihuYW1lLG93bmVyKXtpZih3YXJuZWRTdHlsZU5hbWVzLmhhc093blByb3BlcnR5KG5hbWUp JiZ3YXJuZWRTdHlsZU5hbWVzW25hbWVdKXtyZXR1cm59d2FybmVkU3R5bGVOYW1lc1tuYW1lXT10 cnVlOyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyhmYWxzZSwiVW5zdXBwb3J0 ZWQgc3R5bGUgcHJvcGVydHkgJXMuIERpZCB5b3UgbWVhbiAlcz8lcyIsbmFtZSxjYW1lbGl6ZVN0 eWxlTmFtZShuYW1lKSxjaGVja1JlbmRlck1lc3NhZ2Uob3duZXIpKTp2b2lkIDB9O3ZhciB3YXJu QmFkVmVuZG9yZWRTdHlsZU5hbWU9ZnVuY3Rpb24obmFtZSxvd25lcil7aWYod2FybmVkU3R5bGVO YW1lcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSYmd2FybmVkU3R5bGVOYW1lc1tuYW1lXSl7cmV0dXJu fXdhcm5lZFN0eWxlTmFtZXNbbmFtZV09dHJ1ZTsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24i P3dhcm5pbmcoZmFsc2UsIlVuc3VwcG9ydGVkIHZlbmRvci1wcmVmaXhlZCBzdHlsZSBwcm9wZXJ0 eSAlcy4gRGlkIHlvdSBtZWFuICVzPyVzIixuYW1lLG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNl KCkrbmFtZS5zbGljZSgxKSxjaGVja1JlbmRlck1lc3NhZ2Uob3duZXIpKTp2b2lkIDB9O3ZhciB3 YXJuU3R5bGVWYWx1ZVdpdGhTZW1pY29sb249ZnVuY3Rpb24obmFtZSx2YWx1ZSxvd25lcil7aWYo d2FybmVkU3R5bGVWYWx1ZXMuaGFzT3duUHJvcGVydHkodmFsdWUpJiZ3YXJuZWRTdHlsZVZhbHVl c1t2YWx1ZV0pe3JldHVybn13YXJuZWRTdHlsZVZhbHVlc1t2YWx1ZV09dHJ1ZTsiZGV2ZWxvcG1l bnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmcoZmFsc2UsIlN0eWxlIHByb3BlcnR5IHZhbHVlcyBz aG91bGRuJ3QgY29udGFpbiBhIHNlbWljb2xvbi4lcyAiKydUcnkgIiVzOiAlcyIgaW5zdGVhZC4n LGNoZWNrUmVuZGVyTWVzc2FnZShvd25lciksbmFtZSx2YWx1ZS5yZXBsYWNlKGJhZFN0eWxlVmFs dWVXaXRoU2VtaWNvbG9uUGF0dGVybiwiIikpOnZvaWQgMH07dmFyIHdhcm5TdHlsZVZhbHVlSXNO YU49ZnVuY3Rpb24obmFtZSx2YWx1ZSxvd25lcil7aWYod2FybmVkRm9yTmFOVmFsdWUpe3JldHVy bn13YXJuZWRGb3JOYU5WYWx1ZT10cnVlOyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2Fy bmluZyhmYWxzZSwiYE5hTmAgaXMgYW4gaW52YWxpZCB2YWx1ZSBmb3IgdGhlIGAlc2AgY3NzIHN0 eWxlIHByb3BlcnR5LiVzIixuYW1lLGNoZWNrUmVuZGVyTWVzc2FnZShvd25lcikpOnZvaWQgMH07 dmFyIGNoZWNrUmVuZGVyTWVzc2FnZT1mdW5jdGlvbihvd25lcil7aWYob3duZXIpe3ZhciBuYW1l PW93bmVyLmdldE5hbWUoKTtpZihuYW1lKXtyZXR1cm4iIENoZWNrIHRoZSByZW5kZXIgbWV0aG9k IG9mIGAiK25hbWUrImAuIn19cmV0dXJuIiJ9O3ZhciB3YXJuVmFsaWRTdHlsZT1mdW5jdGlvbihu YW1lLHZhbHVlLGNvbXBvbmVudCl7dmFyIG93bmVyO2lmKGNvbXBvbmVudCl7b3duZXI9Y29tcG9u ZW50Ll9jdXJyZW50RWxlbWVudC5fb3duZXJ9aWYobmFtZS5pbmRleE9mKCItIik+LTEpe3dhcm5I eXBoZW5hdGVkU3R5bGVOYW1lKG5hbWUsb3duZXIpfWVsc2UgaWYoYmFkVmVuZG9yZWRTdHlsZU5h bWVQYXR0ZXJuLnRlc3QobmFtZSkpe3dhcm5CYWRWZW5kb3JlZFN0eWxlTmFtZShuYW1lLG93bmVy KX1lbHNlIGlmKGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybi50ZXN0KHZhbHVlKSl7 d2FyblN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uKG5hbWUsdmFsdWUsb3duZXIpfWlmKHR5cGVvZiB2 YWx1ZT09PSJudW1iZXIiJiZpc05hTih2YWx1ZSkpe3dhcm5TdHlsZVZhbHVlSXNOYU4obmFtZSx2 YWx1ZSxvd25lcil9fX12YXIgQ1NTUHJvcGVydHlPcGVyYXRpb25zPXtjcmVhdGVNYXJrdXBGb3JT dHlsZXM6ZnVuY3Rpb24oc3R5bGVzLGNvbXBvbmVudCl7dmFyIHNlcmlhbGl6ZWQ9IiI7Zm9yKHZh ciBzdHlsZU5hbWUgaW4gc3R5bGVzKXtpZighc3R5bGVzLmhhc093blByb3BlcnR5KHN0eWxlTmFt ZSkpe2NvbnRpbnVlfXZhciBzdHlsZVZhbHVlPXN0eWxlc1tzdHlsZU5hbWVdO2lmKCJkZXZlbG9w bWVudCIhPT0icHJvZHVjdGlvbiIpe3dhcm5WYWxpZFN0eWxlKHN0eWxlTmFtZSxzdHlsZVZhbHVl LGNvbXBvbmVudCl9aWYoc3R5bGVWYWx1ZSE9bnVsbCl7c2VyaWFsaXplZCs9cHJvY2Vzc1N0eWxl TmFtZShzdHlsZU5hbWUpKyI6IjtzZXJpYWxpemVkKz1kYW5nZXJvdXNTdHlsZVZhbHVlKHN0eWxl TmFtZSxzdHlsZVZhbHVlLGNvbXBvbmVudCkrIjsifX1yZXR1cm4gc2VyaWFsaXplZHx8bnVsbH0s c2V0VmFsdWVGb3JTdHlsZXM6ZnVuY3Rpb24obm9kZSxzdHlsZXMsY29tcG9uZW50KXtpZigiZGV2 ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wu b25Ib3N0T3BlcmF0aW9uKHtpbnN0YW5jZUlEOmNvbXBvbmVudC5fZGVidWdJRCx0eXBlOiJ1cGRh dGUgc3R5bGVzIixwYXlsb2FkOnN0eWxlc30pfXZhciBzdHlsZT1ub2RlLnN0eWxlO2Zvcih2YXIg c3R5bGVOYW1lIGluIHN0eWxlcyl7aWYoIXN0eWxlcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUp KXtjb250aW51ZX1pZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXt3YXJuVmFsaWRTdHls ZShzdHlsZU5hbWUsc3R5bGVzW3N0eWxlTmFtZV0sY29tcG9uZW50KX12YXIgc3R5bGVWYWx1ZT1k YW5nZXJvdXNTdHlsZVZhbHVlKHN0eWxlTmFtZSxzdHlsZXNbc3R5bGVOYW1lXSxjb21wb25lbnQp O2lmKHN0eWxlTmFtZT09PSJmbG9hdCJ8fHN0eWxlTmFtZT09PSJjc3NGbG9hdCIpe3N0eWxlTmFt ZT1zdHlsZUZsb2F0QWNjZXNzb3J9aWYoc3R5bGVWYWx1ZSl7c3R5bGVbc3R5bGVOYW1lXT1zdHls ZVZhbHVlfWVsc2V7dmFyIGV4cGFuc2lvbj1oYXNTaG9ydGhhbmRQcm9wZXJ0eUJ1ZyYmQ1NTUHJv cGVydHkuc2hvcnRoYW5kUHJvcGVydHlFeHBhbnNpb25zW3N0eWxlTmFtZV07aWYoZXhwYW5zaW9u KXtmb3IodmFyIGluZGl2aWR1YWxTdHlsZU5hbWUgaW4gZXhwYW5zaW9uKXtzdHlsZVtpbmRpdmlk dWFsU3R5bGVOYW1lXT0iIn19ZWxzZXtzdHlsZVtzdHlsZU5hbWVdPSIifX19fX07bW9kdWxlLmV4 cG9ydHM9Q1NTUHJvcGVydHlPcGVyYXRpb25zfSx7MTI2OjEyNiwxMjg6MTI4LDEzOToxMzksMTQz OjE0MywxNDc6MTQ3LDQ6NCw1OTo1OSw5OTo5OX1dLDY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxl LGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgX3Byb2RJbnZhcmlhbnQ9X2RlcmVxXygxMTYpO2Z1 bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSxDb25zdHJ1Y3Rvcil7aWYoIShpbnN0YW5j ZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNh bGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9fXZhciBQb29sZWRDbGFzcz1fZGVyZXFfKDI0KTt2 YXIgaW52YXJpYW50PV9kZXJlcV8oMTQwKTt2YXIgQ2FsbGJhY2tRdWV1ZT1mdW5jdGlvbigpe2Z1 bmN0aW9uIENhbGxiYWNrUXVldWUoYXJnKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxDYWxsYmFja1F1 ZXVlKTt0aGlzLl9jYWxsYmFja3M9bnVsbDt0aGlzLl9jb250ZXh0cz1udWxsO3RoaXMuX2FyZz1h cmd9Q2FsbGJhY2tRdWV1ZS5wcm90b3R5cGUuZW5xdWV1ZT1mdW5jdGlvbiBlbnF1ZXVlKGNhbGxi YWNrLGNvbnRleHQpe3RoaXMuX2NhbGxiYWNrcz10aGlzLl9jYWxsYmFja3N8fFtdO3RoaXMuX2Nh bGxiYWNrcy5wdXNoKGNhbGxiYWNrKTt0aGlzLl9jb250ZXh0cz10aGlzLl9jb250ZXh0c3x8W107 dGhpcy5fY29udGV4dHMucHVzaChjb250ZXh0KX07Q2FsbGJhY2tRdWV1ZS5wcm90b3R5cGUubm90 aWZ5QWxsPWZ1bmN0aW9uIG5vdGlmeUFsbCgpe3ZhciBjYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tz O3ZhciBjb250ZXh0cz10aGlzLl9jb250ZXh0czt2YXIgYXJnPXRoaXMuX2FyZztpZihjYWxsYmFj a3MmJmNvbnRleHRzKXshKGNhbGxiYWNrcy5sZW5ndGg9PT1jb250ZXh0cy5sZW5ndGgpPyJkZXZl bG9wbWVudCIhPT0icHJvZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJNaXNtYXRjaGVkIGxpc3Qg b2YgY29udGV4dHMgaW4gY2FsbGJhY2sgcXVldWUiKTpfcHJvZEludmFyaWFudCgiMjQiKTp2b2lk IDA7dGhpcy5fY2FsbGJhY2tzPW51bGw7dGhpcy5fY29udGV4dHM9bnVsbDtmb3IodmFyIGk9MDtp PGNhbGxiYWNrcy5sZW5ndGg7aSsrKXtjYWxsYmFja3NbaV0uY2FsbChjb250ZXh0c1tpXSxhcmcp fWNhbGxiYWNrcy5sZW5ndGg9MDtjb250ZXh0cy5sZW5ndGg9MH19O0NhbGxiYWNrUXVldWUucHJv dG90eXBlLmNoZWNrcG9pbnQ9ZnVuY3Rpb24gY2hlY2twb2ludCgpe3JldHVybiB0aGlzLl9jYWxs YmFja3M/dGhpcy5fY2FsbGJhY2tzLmxlbmd0aDowfTtDYWxsYmFja1F1ZXVlLnByb3RvdHlwZS5y b2xsYmFjaz1mdW5jdGlvbiByb2xsYmFjayhsZW4pe2lmKHRoaXMuX2NhbGxiYWNrcyYmdGhpcy5f Y29udGV4dHMpe3RoaXMuX2NhbGxiYWNrcy5sZW5ndGg9bGVuO3RoaXMuX2NvbnRleHRzLmxlbmd0 aD1sZW59fTtDYWxsYmFja1F1ZXVlLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbiByZXNldCgpe3Ro aXMuX2NhbGxiYWNrcz1udWxsO3RoaXMuX2NvbnRleHRzPW51bGx9O0NhbGxiYWNrUXVldWUucHJv dG90eXBlLmRlc3RydWN0b3I9ZnVuY3Rpb24gZGVzdHJ1Y3Rvcigpe3RoaXMucmVzZXQoKX07cmV0 dXJuIENhbGxiYWNrUXVldWV9KCk7bW9kdWxlLmV4cG9ydHM9UG9vbGVkQ2xhc3MuYWRkUG9vbGlu Z1RvKENhbGxiYWNrUXVldWUpfSx7MTE2OjExNiwxNDA6MTQwLDI0OjI0fV0sNzpbZnVuY3Rpb24o X2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBFdmVudFBsdWdpbkh1Yj1f ZGVyZXFfKDE2KTt2YXIgRXZlbnRQcm9wYWdhdG9ycz1fZGVyZXFfKDE5KTt2YXIgRXhlY3V0aW9u RW52aXJvbm1lbnQ9X2RlcmVxXygxMjYpO3ZhciBSZWFjdERPTUNvbXBvbmVudFRyZWU9X2RlcmVx XygzMik7dmFyIFJlYWN0VXBkYXRlcz1fZGVyZXFfKDc1KTt2YXIgU3ludGhldGljRXZlbnQ9X2Rl cmVxXyg4NCk7dmFyIGdldEV2ZW50VGFyZ2V0PV9kZXJlcV8oMTA2KTt2YXIgaXNFdmVudFN1cHBv cnRlZD1fZGVyZXFfKDExMyk7dmFyIGlzVGV4dElucHV0RWxlbWVudD1fZGVyZXFfKDExNCk7dmFy IGV2ZW50VHlwZXM9e2NoYW5nZTp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Im9u Q2hhbmdlIixjYXB0dXJlZDoib25DaGFuZ2VDYXB0dXJlIn0sZGVwZW5kZW5jaWVzOlsidG9wQmx1 ciIsInRvcENoYW5nZSIsInRvcENsaWNrIiwidG9wRm9jdXMiLCJ0b3BJbnB1dCIsInRvcEtleURv d24iLCJ0b3BLZXlVcCIsInRvcFNlbGVjdGlvbkNoYW5nZSJdfX07dmFyIGFjdGl2ZUVsZW1lbnQ9 bnVsbDt2YXIgYWN0aXZlRWxlbWVudEluc3Q9bnVsbDt2YXIgYWN0aXZlRWxlbWVudFZhbHVlPW51 bGw7dmFyIGFjdGl2ZUVsZW1lbnRWYWx1ZVByb3A9bnVsbDtmdW5jdGlvbiBzaG91bGRVc2VDaGFu Z2VFdmVudChlbGVtKXt2YXIgbm9kZU5hbWU9ZWxlbS5ub2RlTmFtZSYmZWxlbS5ub2RlTmFtZS50 b0xvd2VyQ2FzZSgpO3JldHVybiBub2RlTmFtZT09PSJzZWxlY3QifHxub2RlTmFtZT09PSJpbnB1 dCImJmVsZW0udHlwZT09PSJmaWxlIn12YXIgZG9lc0NoYW5nZUV2ZW50QnViYmxlPWZhbHNlO2lm KEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSl7ZG9lc0NoYW5nZUV2ZW50QnViYmxlPWlz RXZlbnRTdXBwb3J0ZWQoImNoYW5nZSIpJiYoIWRvY3VtZW50LmRvY3VtZW50TW9kZXx8ZG9jdW1l bnQuZG9jdW1lbnRNb2RlPjgpfWZ1bmN0aW9uIG1hbnVhbERpc3BhdGNoQ2hhbmdlRXZlbnQobmF0 aXZlRXZlbnQpe3ZhciBldmVudD1TeW50aGV0aWNFdmVudC5nZXRQb29sZWQoZXZlbnRUeXBlcy5j aGFuZ2UsYWN0aXZlRWxlbWVudEluc3QsbmF0aXZlRXZlbnQsZ2V0RXZlbnRUYXJnZXQobmF0aXZl RXZlbnQpKTtFdmVudFByb3BhZ2F0b3JzLmFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMoZXZl bnQpO1JlYWN0VXBkYXRlcy5iYXRjaGVkVXBkYXRlcyhydW5FdmVudEluQmF0Y2gsZXZlbnQpfWZ1 bmN0aW9uIHJ1bkV2ZW50SW5CYXRjaChldmVudCl7RXZlbnRQbHVnaW5IdWIuZW5xdWV1ZUV2ZW50 cyhldmVudCk7RXZlbnRQbHVnaW5IdWIucHJvY2Vzc0V2ZW50UXVldWUoZmFsc2UpfWZ1bmN0aW9u IHN0YXJ0V2F0Y2hpbmdGb3JDaGFuZ2VFdmVudElFOCh0YXJnZXQsdGFyZ2V0SW5zdCl7YWN0aXZl RWxlbWVudD10YXJnZXQ7YWN0aXZlRWxlbWVudEluc3Q9dGFyZ2V0SW5zdDthY3RpdmVFbGVtZW50 LmF0dGFjaEV2ZW50KCJvbmNoYW5nZSIsbWFudWFsRGlzcGF0Y2hDaGFuZ2VFdmVudCl9ZnVuY3Rp b24gc3RvcFdhdGNoaW5nRm9yQ2hhbmdlRXZlbnRJRTgoKXtpZighYWN0aXZlRWxlbWVudCl7cmV0 dXJufWFjdGl2ZUVsZW1lbnQuZGV0YWNoRXZlbnQoIm9uY2hhbmdlIixtYW51YWxEaXNwYXRjaENo YW5nZUV2ZW50KTthY3RpdmVFbGVtZW50PW51bGw7YWN0aXZlRWxlbWVudEluc3Q9bnVsbH1mdW5j dGlvbiBnZXRUYXJnZXRJbnN0Rm9yQ2hhbmdlRXZlbnQodG9wTGV2ZWxUeXBlLHRhcmdldEluc3Qp e2lmKHRvcExldmVsVHlwZT09PSJ0b3BDaGFuZ2UiKXtyZXR1cm4gdGFyZ2V0SW5zdH19ZnVuY3Rp b24gaGFuZGxlRXZlbnRzRm9yQ2hhbmdlRXZlbnRJRTgodG9wTGV2ZWxUeXBlLHRhcmdldCx0YXJn ZXRJbnN0KXtpZih0b3BMZXZlbFR5cGU9PT0idG9wRm9jdXMiKXtzdG9wV2F0Y2hpbmdGb3JDaGFu Z2VFdmVudElFOCgpO3N0YXJ0V2F0Y2hpbmdGb3JDaGFuZ2VFdmVudElFOCh0YXJnZXQsdGFyZ2V0 SW5zdCl9ZWxzZSBpZih0b3BMZXZlbFR5cGU9PT0idG9wQmx1ciIpe3N0b3BXYXRjaGluZ0ZvckNo YW5nZUV2ZW50SUU4KCl9fXZhciBpc0lucHV0RXZlbnRTdXBwb3J0ZWQ9ZmFsc2U7aWYoRXhlY3V0 aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NKXtpc0lucHV0RXZlbnRTdXBwb3J0ZWQ9aXNFdmVudFN1 cHBvcnRlZCgiaW5wdXQiKSYmKCFkb2N1bWVudC5kb2N1bWVudE1vZGV8fGRvY3VtZW50LmRvY3Vt ZW50TW9kZT4xMSl9dmFyIG5ld1ZhbHVlUHJvcD17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGFjdGl2 ZUVsZW1lbnRWYWx1ZVByb3AuZ2V0LmNhbGwodGhpcyl9LHNldDpmdW5jdGlvbih2YWwpe2FjdGl2 ZUVsZW1lbnRWYWx1ZT0iIit2YWw7YWN0aXZlRWxlbWVudFZhbHVlUHJvcC5zZXQuY2FsbCh0aGlz LHZhbCl9fTtmdW5jdGlvbiBzdGFydFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UodGFyZ2V0LHRhcmdl dEluc3Qpe2FjdGl2ZUVsZW1lbnQ9dGFyZ2V0O2FjdGl2ZUVsZW1lbnRJbnN0PXRhcmdldEluc3Q7 YWN0aXZlRWxlbWVudFZhbHVlPXRhcmdldC52YWx1ZTthY3RpdmVFbGVtZW50VmFsdWVQcm9wPU9i amVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LmNvbnN0cnVjdG9yLnByb3RvdHlw ZSwidmFsdWUiKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYWN0aXZlRWxlbWVudCwidmFsdWUiLG5l d1ZhbHVlUHJvcCk7aWYoYWN0aXZlRWxlbWVudC5hdHRhY2hFdmVudCl7YWN0aXZlRWxlbWVudC5h dHRhY2hFdmVudCgib25wcm9wZXJ0eWNoYW5nZSIsaGFuZGxlUHJvcGVydHlDaGFuZ2UpfWVsc2V7 YWN0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJwcm9wZXJ0eWNoYW5nZSIsaGFuZGxlUHJv cGVydHlDaGFuZ2UsZmFsc2UpfX1mdW5jdGlvbiBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgp e2lmKCFhY3RpdmVFbGVtZW50KXtyZXR1cm59ZGVsZXRlIGFjdGl2ZUVsZW1lbnQudmFsdWU7aWYo YWN0aXZlRWxlbWVudC5kZXRhY2hFdmVudCl7YWN0aXZlRWxlbWVudC5kZXRhY2hFdmVudCgib25w cm9wZXJ0eWNoYW5nZSIsaGFuZGxlUHJvcGVydHlDaGFuZ2UpfWVsc2V7YWN0aXZlRWxlbWVudC5y ZW1vdmVFdmVudExpc3RlbmVyKCJwcm9wZXJ0eWNoYW5nZSIsaGFuZGxlUHJvcGVydHlDaGFuZ2Us ZmFsc2UpfWFjdGl2ZUVsZW1lbnQ9bnVsbDthY3RpdmVFbGVtZW50SW5zdD1udWxsO2FjdGl2ZUVs ZW1lbnRWYWx1ZT1udWxsO2FjdGl2ZUVsZW1lbnRWYWx1ZVByb3A9bnVsbH1mdW5jdGlvbiBoYW5k bGVQcm9wZXJ0eUNoYW5nZShuYXRpdmVFdmVudCl7aWYobmF0aXZlRXZlbnQucHJvcGVydHlOYW1l IT09InZhbHVlIil7cmV0dXJufXZhciB2YWx1ZT1uYXRpdmVFdmVudC5zcmNFbGVtZW50LnZhbHVl O2lmKHZhbHVlPT09YWN0aXZlRWxlbWVudFZhbHVlKXtyZXR1cm59YWN0aXZlRWxlbWVudFZhbHVl PXZhbHVlO21hbnVhbERpc3BhdGNoQ2hhbmdlRXZlbnQobmF0aXZlRXZlbnQpfWZ1bmN0aW9uIGdl dFRhcmdldEluc3RGb3JJbnB1dEV2ZW50KHRvcExldmVsVHlwZSx0YXJnZXRJbnN0KXtpZih0b3BM ZXZlbFR5cGU9PT0idG9wSW5wdXQiKXtyZXR1cm4gdGFyZ2V0SW5zdH19ZnVuY3Rpb24gaGFuZGxl RXZlbnRzRm9ySW5wdXRFdmVudElFKHRvcExldmVsVHlwZSx0YXJnZXQsdGFyZ2V0SW5zdCl7aWYo dG9wTGV2ZWxUeXBlPT09InRvcEZvY3VzIil7c3RvcFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKTtz dGFydFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UodGFyZ2V0LHRhcmdldEluc3QpfWVsc2UgaWYodG9w TGV2ZWxUeXBlPT09InRvcEJsdXIiKXtzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpfX1mdW5j dGlvbiBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRFdmVudElFKHRvcExldmVsVHlwZSx0YXJnZXRJbnN0 KXtpZih0b3BMZXZlbFR5cGU9PT0idG9wU2VsZWN0aW9uQ2hhbmdlInx8dG9wTGV2ZWxUeXBlPT09 InRvcEtleVVwInx8dG9wTGV2ZWxUeXBlPT09InRvcEtleURvd24iKXtpZihhY3RpdmVFbGVtZW50 JiZhY3RpdmVFbGVtZW50LnZhbHVlIT09YWN0aXZlRWxlbWVudFZhbHVlKXthY3RpdmVFbGVtZW50 VmFsdWU9YWN0aXZlRWxlbWVudC52YWx1ZTtyZXR1cm4gYWN0aXZlRWxlbWVudEluc3R9fX1mdW5j dGlvbiBzaG91bGRVc2VDbGlja0V2ZW50KGVsZW0pe3JldHVybiBlbGVtLm5vZGVOYW1lJiZlbGVt Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYoZWxlbS50eXBlPT09ImNoZWNrYm94 Inx8ZWxlbS50eXBlPT09InJhZGlvIil9ZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZl bnQodG9wTGV2ZWxUeXBlLHRhcmdldEluc3Qpe2lmKHRvcExldmVsVHlwZT09PSJ0b3BDbGljayIp e3JldHVybiB0YXJnZXRJbnN0fX12YXIgQ2hhbmdlRXZlbnRQbHVnaW49e2V2ZW50VHlwZXM6ZXZl bnRUeXBlcyxleHRyYWN0RXZlbnRzOmZ1bmN0aW9uKHRvcExldmVsVHlwZSx0YXJnZXRJbnN0LG5h dGl2ZUV2ZW50LG5hdGl2ZUV2ZW50VGFyZ2V0KXt2YXIgdGFyZ2V0Tm9kZT10YXJnZXRJbnN0P1Jl YWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpOndpbmRv dzt2YXIgZ2V0VGFyZ2V0SW5zdEZ1bmMsaGFuZGxlRXZlbnRGdW5jO2lmKHNob3VsZFVzZUNoYW5n ZUV2ZW50KHRhcmdldE5vZGUpKXtpZihkb2VzQ2hhbmdlRXZlbnRCdWJibGUpe2dldFRhcmdldElu c3RGdW5jPWdldFRhcmdldEluc3RGb3JDaGFuZ2VFdmVudH1lbHNle2hhbmRsZUV2ZW50RnVuYz1o YW5kbGVFdmVudHNGb3JDaGFuZ2VFdmVudElFOH19ZWxzZSBpZihpc1RleHRJbnB1dEVsZW1lbnQo dGFyZ2V0Tm9kZSkpe2lmKGlzSW5wdXRFdmVudFN1cHBvcnRlZCl7Z2V0VGFyZ2V0SW5zdEZ1bmM9 Z2V0VGFyZ2V0SW5zdEZvcklucHV0RXZlbnR9ZWxzZXtnZXRUYXJnZXRJbnN0RnVuYz1nZXRUYXJn ZXRJbnN0Rm9ySW5wdXRFdmVudElFO2hhbmRsZUV2ZW50RnVuYz1oYW5kbGVFdmVudHNGb3JJbnB1 dEV2ZW50SUV9fWVsc2UgaWYoc2hvdWxkVXNlQ2xpY2tFdmVudCh0YXJnZXROb2RlKSl7Z2V0VGFy Z2V0SW5zdEZ1bmM9Z2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnR9aWYoZ2V0VGFyZ2V0SW5zdEZ1 bmMpe3ZhciBpbnN0PWdldFRhcmdldEluc3RGdW5jKHRvcExldmVsVHlwZSx0YXJnZXRJbnN0KTtp ZihpbnN0KXt2YXIgZXZlbnQ9U3ludGhldGljRXZlbnQuZ2V0UG9vbGVkKGV2ZW50VHlwZXMuY2hh bmdlLGluc3QsbmF0aXZlRXZlbnQsbmF0aXZlRXZlbnRUYXJnZXQpO2V2ZW50LnR5cGU9ImNoYW5n ZSI7RXZlbnRQcm9wYWdhdG9ycy5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGV2ZW50KTty ZXR1cm4gZXZlbnR9fWlmKGhhbmRsZUV2ZW50RnVuYyl7aGFuZGxlRXZlbnRGdW5jKHRvcExldmVs VHlwZSx0YXJnZXROb2RlLHRhcmdldEluc3QpfX19O21vZHVsZS5leHBvcnRzPUNoYW5nZUV2ZW50 UGx1Z2lufSx7MTA2OjEwNiwxMTM6MTEzLDExNDoxMTQsMTI2OjEyNiwxNjoxNiwxOToxOSwzMjoz Miw3NTo3NSw4NDo4NH1dLDg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ug c3RyaWN0Ijt2YXIgRE9NTGF6eVRyZWU9X2RlcmVxXyg5KTt2YXIgRGFuZ2VyPV9kZXJlcV8oMTMp O3ZhciBSZWFjdERPTUNvbXBvbmVudFRyZWU9X2RlcmVxXygzMik7dmFyIFJlYWN0SW5zdHJ1bWVu dGF0aW9uPV9kZXJlcV8oNTkpO3ZhciBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9u PV9kZXJlcV8oOTgpO3ZhciBzZXRJbm5lckhUTUw9X2RlcmVxXygxMTcpO3ZhciBzZXRUZXh0Q29u dGVudD1fZGVyZXFfKDExOCk7ZnVuY3Rpb24gZ2V0Tm9kZUFmdGVyKHBhcmVudE5vZGUsbm9kZSl7 aWYoQXJyYXkuaXNBcnJheShub2RlKSl7bm9kZT1ub2RlWzFdfXJldHVybiBub2RlP25vZGUubmV4 dFNpYmxpbmc6cGFyZW50Tm9kZS5maXJzdENoaWxkfXZhciBpbnNlcnRDaGlsZEF0PWNyZWF0ZU1p Y3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24ocGFyZW50Tm9kZSxjaGlsZE5vZGUs cmVmZXJlbmNlTm9kZSl7cGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGROb2RlLHJlZmVyZW5j ZU5vZGUpfSk7ZnVuY3Rpb24gaW5zZXJ0TGF6eVRyZWVDaGlsZEF0KHBhcmVudE5vZGUsY2hpbGRU cmVlLHJlZmVyZW5jZU5vZGUpe0RPTUxhenlUcmVlLmluc2VydFRyZWVCZWZvcmUocGFyZW50Tm9k ZSxjaGlsZFRyZWUscmVmZXJlbmNlTm9kZSl9ZnVuY3Rpb24gbW92ZUNoaWxkKHBhcmVudE5vZGUs Y2hpbGROb2RlLHJlZmVyZW5jZU5vZGUpe2lmKEFycmF5LmlzQXJyYXkoY2hpbGROb2RlKSl7bW92 ZURlbGltaXRlZFRleHQocGFyZW50Tm9kZSxjaGlsZE5vZGVbMF0sY2hpbGROb2RlWzFdLHJlZmVy ZW5jZU5vZGUpfWVsc2V7aW5zZXJ0Q2hpbGRBdChwYXJlbnROb2RlLGNoaWxkTm9kZSxyZWZlcmVu Y2VOb2RlKX19ZnVuY3Rpb24gcmVtb3ZlQ2hpbGQocGFyZW50Tm9kZSxjaGlsZE5vZGUpe2lmKEFy cmF5LmlzQXJyYXkoY2hpbGROb2RlKSl7dmFyIGNsb3NpbmdDb21tZW50PWNoaWxkTm9kZVsxXTtj aGlsZE5vZGU9Y2hpbGROb2RlWzBdO3JlbW92ZURlbGltaXRlZFRleHQocGFyZW50Tm9kZSxjaGls ZE5vZGUsY2xvc2luZ0NvbW1lbnQpO3BhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2xvc2luZ0NvbW1l bnQpfXBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2hpbGROb2RlKX1mdW5jdGlvbiBtb3ZlRGVsaW1p dGVkVGV4dChwYXJlbnROb2RlLG9wZW5pbmdDb21tZW50LGNsb3NpbmdDb21tZW50LHJlZmVyZW5j ZU5vZGUpe3ZhciBub2RlPW9wZW5pbmdDb21tZW50O3doaWxlKHRydWUpe3ZhciBuZXh0Tm9kZT1u b2RlLm5leHRTaWJsaW5nO2luc2VydENoaWxkQXQocGFyZW50Tm9kZSxub2RlLHJlZmVyZW5jZU5v ZGUpO2lmKG5vZGU9PT1jbG9zaW5nQ29tbWVudCl7YnJlYWt9bm9kZT1uZXh0Tm9kZX19ZnVuY3Rp b24gcmVtb3ZlRGVsaW1pdGVkVGV4dChwYXJlbnROb2RlLHN0YXJ0Tm9kZSxjbG9zaW5nQ29tbWVu dCl7d2hpbGUodHJ1ZSl7dmFyIG5vZGU9c3RhcnROb2RlLm5leHRTaWJsaW5nO2lmKG5vZGU9PT1j bG9zaW5nQ29tbWVudCl7YnJlYWt9ZWxzZXtwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpfX19 ZnVuY3Rpb24gcmVwbGFjZURlbGltaXRlZFRleHQob3BlbmluZ0NvbW1lbnQsY2xvc2luZ0NvbW1l bnQsc3RyaW5nVGV4dCl7dmFyIHBhcmVudE5vZGU9b3BlbmluZ0NvbW1lbnQucGFyZW50Tm9kZTt2 YXIgbm9kZUFmdGVyQ29tbWVudD1vcGVuaW5nQ29tbWVudC5uZXh0U2libGluZztpZihub2RlQWZ0 ZXJDb21tZW50PT09Y2xvc2luZ0NvbW1lbnQpe2lmKHN0cmluZ1RleHQpe2luc2VydENoaWxkQXQo cGFyZW50Tm9kZSxkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzdHJpbmdUZXh0KSxub2RlQWZ0ZXJD b21tZW50KX19ZWxzZXtpZihzdHJpbmdUZXh0KXtzZXRUZXh0Q29udGVudChub2RlQWZ0ZXJDb21t ZW50LHN0cmluZ1RleHQpO3JlbW92ZURlbGltaXRlZFRleHQocGFyZW50Tm9kZSxub2RlQWZ0ZXJD b21tZW50LGNsb3NpbmdDb21tZW50KX1lbHNle3JlbW92ZURlbGltaXRlZFRleHQocGFyZW50Tm9k ZSxvcGVuaW5nQ29tbWVudCxjbG9zaW5nQ29tbWVudCl9fWlmKCJkZXZlbG9wbWVudCIhPT0icHJv ZHVjdGlvbiIpe1JlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24o e2luc3RhbmNlSUQ6UmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUob3Bl bmluZ0NvbW1lbnQpLl9kZWJ1Z0lELHR5cGU6InJlcGxhY2UgdGV4dCIscGF5bG9hZDpzdHJpbmdU ZXh0fSl9fXZhciBkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cD1EYW5nZXIuZGFuZ2Vy b3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXA7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9u Iil7ZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXA9ZnVuY3Rpb24ob2xkQ2hpbGQsbWFy a3VwLHByZXZJbnN0YW5jZSl7RGFuZ2VyLmRhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3Vw KG9sZENoaWxkLG1hcmt1cCk7aWYocHJldkluc3RhbmNlLl9kZWJ1Z0lEIT09MCl7UmVhY3RJbnN0 cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7aW5zdGFuY2VJRDpwcmV2SW5z dGFuY2UuX2RlYnVnSUQsdHlwZToicmVwbGFjZSB3aXRoIixwYXlsb2FkOm1hcmt1cC50b1N0cmlu ZygpfSl9ZWxzZXt2YXIgbmV4dEluc3RhbmNlPVJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0 YW5jZUZyb21Ob2RlKG1hcmt1cC5ub2RlKTtpZihuZXh0SW5zdGFuY2UuX2RlYnVnSUQhPT0wKXtS ZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtpbnN0YW5jZUlE Om5leHRJbnN0YW5jZS5fZGVidWdJRCx0eXBlOiJtb3VudCIscGF5bG9hZDptYXJrdXAudG9TdHJp bmcoKX0pfX19fXZhciBET01DaGlsZHJlbk9wZXJhdGlvbnM9e2Rhbmdlcm91c2x5UmVwbGFjZU5v ZGVXaXRoTWFya3VwOmRhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwLHJlcGxhY2VEZWxp bWl0ZWRUZXh0OnJlcGxhY2VEZWxpbWl0ZWRUZXh0LHByb2Nlc3NVcGRhdGVzOmZ1bmN0aW9uKHBh cmVudE5vZGUsdXBkYXRlcyl7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7dmFyIHBh cmVudE5vZGVEZWJ1Z0lEPVJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2Rl KHBhcmVudE5vZGUpLl9kZWJ1Z0lEfWZvcih2YXIgaz0wO2s8dXBkYXRlcy5sZW5ndGg7aysrKXt2 YXIgdXBkYXRlPXVwZGF0ZXNba107c3dpdGNoKHVwZGF0ZS50eXBlKXtjYXNlIklOU0VSVF9NQVJL VVAiOmluc2VydExhenlUcmVlQ2hpbGRBdChwYXJlbnROb2RlLHVwZGF0ZS5jb250ZW50LGdldE5v ZGVBZnRlcihwYXJlbnROb2RlLHVwZGF0ZS5hZnRlck5vZGUpKTtpZigiZGV2ZWxvcG1lbnQiIT09 InByb2R1Y3Rpb24iKXtSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0 aW9uKHtpbnN0YW5jZUlEOnBhcmVudE5vZGVEZWJ1Z0lELHR5cGU6Imluc2VydCBjaGlsZCIscGF5 bG9hZDp7dG9JbmRleDp1cGRhdGUudG9JbmRleCxjb250ZW50OnVwZGF0ZS5jb250ZW50LnRvU3Ry aW5nKCl9fSl9YnJlYWs7Y2FzZSJNT1ZFX0VYSVNUSU5HIjptb3ZlQ2hpbGQocGFyZW50Tm9kZSx1 cGRhdGUuZnJvbU5vZGUsZ2V0Tm9kZUFmdGVyKHBhcmVudE5vZGUsdXBkYXRlLmFmdGVyTm9kZSkp O2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe1JlYWN0SW5zdHJ1bWVudGF0aW9uLmRl YnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oe2luc3RhbmNlSUQ6cGFyZW50Tm9kZURlYnVnSUQsdHlw ZToibW92ZSBjaGlsZCIscGF5bG9hZDp7ZnJvbUluZGV4OnVwZGF0ZS5mcm9tSW5kZXgsdG9JbmRl eDp1cGRhdGUudG9JbmRleH19KX1icmVhaztjYXNlIlNFVF9NQVJLVVAiOnNldElubmVySFRNTChw YXJlbnROb2RlLHVwZGF0ZS5jb250ZW50KTtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24i KXtSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtpbnN0YW5j ZUlEOnBhcmVudE5vZGVEZWJ1Z0lELHR5cGU6InJlcGxhY2UgY2hpbGRyZW4iLHBheWxvYWQ6dXBk YXRlLmNvbnRlbnQudG9TdHJpbmcoKX0pfWJyZWFrO2Nhc2UiVEVYVF9DT05URU5UIjpzZXRUZXh0 Q29udGVudChwYXJlbnROb2RlLHVwZGF0ZS5jb250ZW50KTtpZigiZGV2ZWxvcG1lbnQiIT09InBy b2R1Y3Rpb24iKXtSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9u KHtpbnN0YW5jZUlEOnBhcmVudE5vZGVEZWJ1Z0lELHR5cGU6InJlcGxhY2UgdGV4dCIscGF5bG9h ZDp1cGRhdGUuY29udGVudC50b1N0cmluZygpfSl9YnJlYWs7Y2FzZSJSRU1PVkVfTk9ERSI6cmVt b3ZlQ2hpbGQocGFyZW50Tm9kZSx1cGRhdGUuZnJvbU5vZGUpO2lmKCJkZXZlbG9wbWVudCIhPT0i cHJvZHVjdGlvbiIpe1JlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRp b24oe2luc3RhbmNlSUQ6cGFyZW50Tm9kZURlYnVnSUQsdHlwZToicmVtb3ZlIGNoaWxkIixwYXls b2FkOntmcm9tSW5kZXg6dXBkYXRlLmZyb21JbmRleH19KX1icmVha319fX07bW9kdWxlLmV4cG9y dHM9RE9NQ2hpbGRyZW5PcGVyYXRpb25zfSx7MTE3OjExNywxMTg6MTE4LDEzOjEzLDMyOjMyLDU5 OjU5LDk6OSw5ODo5OH1dLDk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ug c3RyaWN0Ijt2YXIgRE9NTmFtZXNwYWNlcz1fZGVyZXFfKDEwKTt2YXIgc2V0SW5uZXJIVE1MPV9k ZXJlcV8oMTE3KTt2YXIgY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbj1fZGVyZXFf KDk4KTt2YXIgc2V0VGV4dENvbnRlbnQ9X2RlcmVxXygxMTgpO3ZhciBFTEVNRU5UX05PREVfVFlQ RT0xO3ZhciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFX1RZUEU9MTE7dmFyIGVuYWJsZUxhenk9dHlw ZW9mIGRvY3VtZW50IT09InVuZGVmaW5lZCImJnR5cGVvZiBkb2N1bWVudC5kb2N1bWVudE1vZGU9 PT0ibnVtYmVyInx8dHlwZW9mIG5hdmlnYXRvciE9PSJ1bmRlZmluZWQiJiZ0eXBlb2YgbmF2aWdh dG9yLnVzZXJBZ2VudD09PSJzdHJpbmciJiYvXGJFZGdlXC9cZC8udGVzdChuYXZpZ2F0b3IudXNl ckFnZW50KTtmdW5jdGlvbiBpbnNlcnRUcmVlQ2hpbGRyZW4odHJlZSl7aWYoIWVuYWJsZUxhenkp e3JldHVybn12YXIgbm9kZT10cmVlLm5vZGU7dmFyIGNoaWxkcmVuPXRyZWUuY2hpbGRyZW47aWYo Y2hpbGRyZW4ubGVuZ3RoKXtmb3IodmFyIGk9MDtpPGNoaWxkcmVuLmxlbmd0aDtpKyspe2luc2Vy dFRyZWVCZWZvcmUobm9kZSxjaGlsZHJlbltpXSxudWxsKX19ZWxzZSBpZih0cmVlLmh0bWwhPW51 bGwpe3NldElubmVySFRNTChub2RlLHRyZWUuaHRtbCl9ZWxzZSBpZih0cmVlLnRleHQhPW51bGwp e3NldFRleHRDb250ZW50KG5vZGUsdHJlZS50ZXh0KX19dmFyIGluc2VydFRyZWVCZWZvcmU9Y3Jl YXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbihmdW5jdGlvbihwYXJlbnROb2RlLHRyZWUs cmVmZXJlbmNlTm9kZSl7aWYodHJlZS5ub2RlLm5vZGVUeXBlPT09RE9DVU1FTlRfRlJBR01FTlRf Tk9ERV9UWVBFfHx0cmVlLm5vZGUubm9kZVR5cGU9PT1FTEVNRU5UX05PREVfVFlQRSYmdHJlZS5u b2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0ib2JqZWN0IiYmKHRyZWUubm9kZS5uYW1lc3Bh Y2VVUkk9PW51bGx8fHRyZWUubm9kZS5uYW1lc3BhY2VVUkk9PT1ET01OYW1lc3BhY2VzLmh0bWwp KXtpbnNlcnRUcmVlQ2hpbGRyZW4odHJlZSk7cGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodHJlZS5u b2RlLHJlZmVyZW5jZU5vZGUpfWVsc2V7cGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodHJlZS5ub2Rl LHJlZmVyZW5jZU5vZGUpO2luc2VydFRyZWVDaGlsZHJlbih0cmVlKX19KTtmdW5jdGlvbiByZXBs YWNlQ2hpbGRXaXRoVHJlZShvbGROb2RlLG5ld1RyZWUpe29sZE5vZGUucGFyZW50Tm9kZS5yZXBs YWNlQ2hpbGQobmV3VHJlZS5ub2RlLG9sZE5vZGUpO2luc2VydFRyZWVDaGlsZHJlbihuZXdUcmVl KX1mdW5jdGlvbiBxdWV1ZUNoaWxkKHBhcmVudFRyZWUsY2hpbGRUcmVlKXtpZihlbmFibGVMYXp5 KXtwYXJlbnRUcmVlLmNoaWxkcmVuLnB1c2goY2hpbGRUcmVlKX1lbHNle3BhcmVudFRyZWUubm9k ZS5hcHBlbmRDaGlsZChjaGlsZFRyZWUubm9kZSl9fWZ1bmN0aW9uIHF1ZXVlSFRNTCh0cmVlLGh0 bWwpe2lmKGVuYWJsZUxhenkpe3RyZWUuaHRtbD1odG1sfWVsc2V7c2V0SW5uZXJIVE1MKHRyZWUu bm9kZSxodG1sKX19ZnVuY3Rpb24gcXVldWVUZXh0KHRyZWUsdGV4dCl7aWYoZW5hYmxlTGF6eSl7 dHJlZS50ZXh0PXRleHR9ZWxzZXtzZXRUZXh0Q29udGVudCh0cmVlLm5vZGUsdGV4dCl9fWZ1bmN0 aW9uIHRvU3RyaW5nKCl7cmV0dXJuIHRoaXMubm9kZS5ub2RlTmFtZX1mdW5jdGlvbiBET01MYXp5 VHJlZShub2RlKXtyZXR1cm57bm9kZTpub2RlLGNoaWxkcmVuOltdLGh0bWw6bnVsbCx0ZXh0Om51 bGwsdG9TdHJpbmc6dG9TdHJpbmd9fURPTUxhenlUcmVlLmluc2VydFRyZWVCZWZvcmU9aW5zZXJ0 VHJlZUJlZm9yZTtET01MYXp5VHJlZS5yZXBsYWNlQ2hpbGRXaXRoVHJlZT1yZXBsYWNlQ2hpbGRX aXRoVHJlZTtET01MYXp5VHJlZS5xdWV1ZUNoaWxkPXF1ZXVlQ2hpbGQ7RE9NTGF6eVRyZWUucXVl dWVIVE1MPXF1ZXVlSFRNTDtET01MYXp5VHJlZS5xdWV1ZVRleHQ9cXVldWVUZXh0O21vZHVsZS5l eHBvcnRzPURPTUxhenlUcmVlfSx7MTA6MTAsMTE3OjExNywxMTg6MTE4LDk4Ojk4fV0sMTA6W2Z1 bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgRE9NTmFtZXNw YWNlcz17aHRtbDoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsbWF0aG1sOiJodHRwOi8v d3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MIixzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAv c3ZnIn07bW9kdWxlLmV4cG9ydHM9RE9NTmFtZXNwYWNlc30se31dLDExOltmdW5jdGlvbihfZGVy ZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIF9wcm9kSW52YXJpYW50PV9kZXJl cV8oMTE2KTt2YXIgaW52YXJpYW50PV9kZXJlcV8oMTQwKTtmdW5jdGlvbiBjaGVja01hc2sodmFs dWUsYml0bWFzayl7cmV0dXJuKHZhbHVlJmJpdG1hc2spPT09Yml0bWFza312YXIgRE9NUHJvcGVy dHlJbmplY3Rpb249e01VU1RfVVNFX1BST1BFUlRZOjEsSEFTX0JPT0xFQU5fVkFMVUU6NCxIQVNf TlVNRVJJQ19WQUxVRTo4LEhBU19QT1NJVElWRV9OVU1FUklDX1ZBTFVFOjE2fDgsSEFTX09WRVJM T0FERURfQk9PTEVBTl9WQUxVRTozMixpbmplY3RET01Qcm9wZXJ0eUNvbmZpZzpmdW5jdGlvbihk b21Qcm9wZXJ0eUNvbmZpZyl7dmFyIEluamVjdGlvbj1ET01Qcm9wZXJ0eUluamVjdGlvbjt2YXIg UHJvcGVydGllcz1kb21Qcm9wZXJ0eUNvbmZpZy5Qcm9wZXJ0aWVzfHx7fTt2YXIgRE9NQXR0cmli dXRlTmFtZXNwYWNlcz1kb21Qcm9wZXJ0eUNvbmZpZy5ET01BdHRyaWJ1dGVOYW1lc3BhY2VzfHx7 fTt2YXIgRE9NQXR0cmlidXRlTmFtZXM9ZG9tUHJvcGVydHlDb25maWcuRE9NQXR0cmlidXRlTmFt ZXN8fHt9O3ZhciBET01Qcm9wZXJ0eU5hbWVzPWRvbVByb3BlcnR5Q29uZmlnLkRPTVByb3BlcnR5 TmFtZXN8fHt9O3ZhciBET01NdXRhdGlvbk1ldGhvZHM9ZG9tUHJvcGVydHlDb25maWcuRE9NTXV0 YXRpb25NZXRob2RzfHx7fTtpZihkb21Qcm9wZXJ0eUNvbmZpZy5pc0N1c3RvbUF0dHJpYnV0ZSl7 RE9NUHJvcGVydHkuX2lzQ3VzdG9tQXR0cmlidXRlRnVuY3Rpb25zLnB1c2goZG9tUHJvcGVydHlD b25maWcuaXNDdXN0b21BdHRyaWJ1dGUpfWZvcih2YXIgcHJvcE5hbWUgaW4gUHJvcGVydGllcyl7 ISFET01Qcm9wZXJ0eS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHByb3BOYW1lKT8iZGV2ZWxv cG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiaW5qZWN0RE9NUHJvcGVydHlD b25maWcoLi4uKTogWW91J3JlIHRyeWluZyB0byBpbmplY3QgRE9NIHByb3BlcnR5ICclcycgd2hp Y2ggaGFzIGFscmVhZHkgYmVlbiBpbmplY3RlZC4gWW91IG1heSBiZSBhY2NpZGVudGFsbHkgaW5q ZWN0aW5nIHRoZSBzYW1lIERPTSBwcm9wZXJ0eSBjb25maWcgdHdpY2UsIG9yIHlvdSBtYXkgYmUg aW5qZWN0aW5nIHR3byBjb25maWdzIHRoYXQgaGF2ZSBjb25mbGljdGluZyBwcm9wZXJ0eSBuYW1l cy4iLHByb3BOYW1lKTpfcHJvZEludmFyaWFudCgiNDgiLHByb3BOYW1lKTp2b2lkIDA7dmFyIGxv d2VyQ2FzZWQ9cHJvcE5hbWUudG9Mb3dlckNhc2UoKTt2YXIgcHJvcENvbmZpZz1Qcm9wZXJ0aWVz W3Byb3BOYW1lXTt2YXIgcHJvcGVydHlJbmZvPXthdHRyaWJ1dGVOYW1lOmxvd2VyQ2FzZWQsYXR0 cmlidXRlTmFtZXNwYWNlOm51bGwscHJvcGVydHlOYW1lOnByb3BOYW1lLG11dGF0aW9uTWV0aG9k Om51bGwsbXVzdFVzZVByb3BlcnR5OmNoZWNrTWFzayhwcm9wQ29uZmlnLEluamVjdGlvbi5NVVNU X1VTRV9QUk9QRVJUWSksaGFzQm9vbGVhblZhbHVlOmNoZWNrTWFzayhwcm9wQ29uZmlnLEluamVj dGlvbi5IQVNfQk9PTEVBTl9WQUxVRSksaGFzTnVtZXJpY1ZhbHVlOmNoZWNrTWFzayhwcm9wQ29u ZmlnLEluamVjdGlvbi5IQVNfTlVNRVJJQ19WQUxVRSksaGFzUG9zaXRpdmVOdW1lcmljVmFsdWU6 Y2hlY2tNYXNrKHByb3BDb25maWcsSW5qZWN0aW9uLkhBU19QT1NJVElWRV9OVU1FUklDX1ZBTFVF KSxoYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlOmNoZWNrTWFzayhwcm9wQ29uZmlnLEluamVjdGlv bi5IQVNfT1ZFUkxPQURFRF9CT09MRUFOX1ZBTFVFKX07IShwcm9wZXJ0eUluZm8uaGFzQm9vbGVh blZhbHVlK3Byb3BlcnR5SW5mby5oYXNOdW1lcmljVmFsdWUrcHJvcGVydHlJbmZvLmhhc092ZXJs b2FkZWRCb29sZWFuVmFsdWU8PTEpPyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/aW52YXJp YW50KGZhbHNlLCJET01Qcm9wZXJ0eTogVmFsdWUgY2FuIGJlIG9uZSBvZiBib29sZWFuLCBvdmVy bG9hZGVkIGJvb2xlYW4sIG9yIG51bWVyaWMgdmFsdWUsIGJ1dCBub3QgYSBjb21iaW5hdGlvbjog JXMiLHByb3BOYW1lKTpfcHJvZEludmFyaWFudCgiNTAiLHByb3BOYW1lKTp2b2lkIDA7aWYoImRl dmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7RE9NUHJvcGVydHkuZ2V0UG9zc2libGVTdGFuZGFy ZE5hbWVbbG93ZXJDYXNlZF09cHJvcE5hbWV9aWYoRE9NQXR0cmlidXRlTmFtZXMuaGFzT3duUHJv cGVydHkocHJvcE5hbWUpKXt2YXIgYXR0cmlidXRlTmFtZT1ET01BdHRyaWJ1dGVOYW1lc1twcm9w TmFtZV07cHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWU9YXR0cmlidXRlTmFtZTtpZigiZGV2ZWxv cG1lbnQiIT09InByb2R1Y3Rpb24iKXtET01Qcm9wZXJ0eS5nZXRQb3NzaWJsZVN0YW5kYXJkTmFt ZVthdHRyaWJ1dGVOYW1lXT1wcm9wTmFtZX19aWYoRE9NQXR0cmlidXRlTmFtZXNwYWNlcy5oYXNP d25Qcm9wZXJ0eShwcm9wTmFtZSkpe3Byb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lc3BhY2U9RE9N QXR0cmlidXRlTmFtZXNwYWNlc1twcm9wTmFtZV19aWYoRE9NUHJvcGVydHlOYW1lcy5oYXNPd25Q cm9wZXJ0eShwcm9wTmFtZSkpe3Byb3BlcnR5SW5mby5wcm9wZXJ0eU5hbWU9RE9NUHJvcGVydHlO YW1lc1twcm9wTmFtZV19aWYoRE9NTXV0YXRpb25NZXRob2RzLmhhc093blByb3BlcnR5KHByb3BO YW1lKSl7cHJvcGVydHlJbmZvLm11dGF0aW9uTWV0aG9kPURPTU11dGF0aW9uTWV0aG9kc1twcm9w TmFtZV19RE9NUHJvcGVydHkucHJvcGVydGllc1twcm9wTmFtZV09cHJvcGVydHlJbmZvfX19O3Zh ciBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSPSI6QS1aX2EtelxcdTAwQzAtXFx1MDBENlxcdTAw RDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJGRlxcdTAzNzAtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxc dTIwMEMtXFx1MjAwRFxcdTIwNzAtXFx1MjE4RlxcdTJDMDAtXFx1MkZFRlxcdTMwMDEtXFx1RDdG RlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZGRCI7dmFyIERPTVByb3BlcnR5PXtJRF9BVFRS SUJVVEVfTkFNRToiZGF0YS1yZWFjdGlkIixST09UX0FUVFJJQlVURV9OQU1FOiJkYXRhLXJlYWN0 cm9vdCIsQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUjpBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFS LEFUVFJJQlVURV9OQU1FX0NIQVI6QVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUisiXFwtLjAtOVxc dTAwQjdcXHUwMzAwLVxcdTAzNkZcXHUyMDNGLVxcdTIwNDAiLHByb3BlcnRpZXM6e30sZ2V0UG9z c2libGVTdGFuZGFyZE5hbWU6ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj97YXV0b2ZvY3Vz OiJhdXRvRm9jdXMifTpudWxsLF9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9uczpbXSxpc0N1c3Rv bUF0dHJpYnV0ZTpmdW5jdGlvbihhdHRyaWJ1dGVOYW1lKXtmb3IodmFyIGk9MDtpPERPTVByb3Bl cnR5Ll9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9ucy5sZW5ndGg7aSsrKXt2YXIgaXNDdXN0b21B dHRyaWJ1dGVGbj1ET01Qcm9wZXJ0eS5faXNDdXN0b21BdHRyaWJ1dGVGdW5jdGlvbnNbaV07aWYo aXNDdXN0b21BdHRyaWJ1dGVGbihhdHRyaWJ1dGVOYW1lKSl7cmV0dXJuIHRydWV9fXJldHVybiBm YWxzZX0saW5qZWN0aW9uOkRPTVByb3BlcnR5SW5qZWN0aW9ufTttb2R1bGUuZXhwb3J0cz1ET01Q cm9wZXJ0eX0sezExNjoxMTYsMTQwOjE0MH1dLDEyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxl eHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIERPTVByb3BlcnR5PV9kZXJlcV8oMTEpO3ZhciBSZWFj dERPTUNvbXBvbmVudFRyZWU9X2RlcmVxXygzMik7dmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uPV9k ZXJlcV8oNTkpO3ZhciBxdW90ZUF0dHJpYnV0ZVZhbHVlRm9yQnJvd3Nlcj1fZGVyZXFfKDExNSk7 dmFyIHdhcm5pbmc9X2RlcmVxXygxNDcpO3ZhciBWQUxJRF9BVFRSSUJVVEVfTkFNRV9SRUdFWD1u ZXcgUmVnRXhwKCJeWyIrRE9NUHJvcGVydHkuQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUisiXVsi K0RPTVByb3BlcnR5LkFUVFJJQlVURV9OQU1FX0NIQVIrIl0qJCIpO3ZhciBpbGxlZ2FsQXR0cmli dXRlTmFtZUNhY2hlPXt9O3ZhciB2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGU9e307ZnVuY3Rp b24gaXNBdHRyaWJ1dGVOYW1lU2FmZShhdHRyaWJ1dGVOYW1lKXtpZih2YWxpZGF0ZWRBdHRyaWJ1 dGVOYW1lQ2FjaGUuaGFzT3duUHJvcGVydHkoYXR0cmlidXRlTmFtZSkpe3JldHVybiB0cnVlfWlm KGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGUuaGFzT3duUHJvcGVydHkoYXR0cmlidXRlTmFtZSkp e3JldHVybiBmYWxzZX1pZihWQUxJRF9BVFRSSUJVVEVfTkFNRV9SRUdFWC50ZXN0KGF0dHJpYnV0 ZU5hbWUpKXt2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGVbYXR0cmlidXRlTmFtZV09dHJ1ZTty ZXR1cm4gdHJ1ZX1pbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlW2F0dHJpYnV0ZU5hbWVdPXRydWU7 ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKGZhbHNlLCJJbnZhbGlkIGF0dHJp YnV0ZSBuYW1lOiBgJXNgIixhdHRyaWJ1dGVOYW1lKTp2b2lkIDA7cmV0dXJuIGZhbHNlfWZ1bmN0 aW9uIHNob3VsZElnbm9yZVZhbHVlKHByb3BlcnR5SW5mbyx2YWx1ZSl7cmV0dXJuIHZhbHVlPT1u dWxsfHxwcm9wZXJ0eUluZm8uaGFzQm9vbGVhblZhbHVlJiYhdmFsdWV8fHByb3BlcnR5SW5mby5o YXNOdW1lcmljVmFsdWUmJmlzTmFOKHZhbHVlKXx8cHJvcGVydHlJbmZvLmhhc1Bvc2l0aXZlTnVt ZXJpY1ZhbHVlJiZ2YWx1ZTwxfHxwcm9wZXJ0eUluZm8uaGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1 ZSYmdmFsdWU9PT1mYWxzZX12YXIgRE9NUHJvcGVydHlPcGVyYXRpb25zPXtjcmVhdGVNYXJrdXBG b3JJRDpmdW5jdGlvbihpZCl7cmV0dXJuIERPTVByb3BlcnR5LklEX0FUVFJJQlVURV9OQU1FKyI9 IitxdW90ZUF0dHJpYnV0ZVZhbHVlRm9yQnJvd3NlcihpZCl9LHNldEF0dHJpYnV0ZUZvcklEOmZ1 bmN0aW9uKG5vZGUsaWQpe25vZGUuc2V0QXR0cmlidXRlKERPTVByb3BlcnR5LklEX0FUVFJJQlVU RV9OQU1FLGlkKX0sY3JlYXRlTWFya3VwRm9yUm9vdDpmdW5jdGlvbigpe3JldHVybiBET01Qcm9w ZXJ0eS5ST09UX0FUVFJJQlVURV9OQU1FKyc9IiInfSxzZXRBdHRyaWJ1dGVGb3JSb290OmZ1bmN0 aW9uKG5vZGUpe25vZGUuc2V0QXR0cmlidXRlKERPTVByb3BlcnR5LlJPT1RfQVRUUklCVVRFX05B TUUsIiIpfSxjcmVhdGVNYXJrdXBGb3JQcm9wZXJ0eTpmdW5jdGlvbihuYW1lLHZhbHVlKXt2YXIg cHJvcGVydHlJbmZvPURPTVByb3BlcnR5LnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSk/ RE9NUHJvcGVydHkucHJvcGVydGllc1tuYW1lXTpudWxsO2lmKHByb3BlcnR5SW5mbyl7aWYoc2hv dWxkSWdub3JlVmFsdWUocHJvcGVydHlJbmZvLHZhbHVlKSl7cmV0dXJuIiJ9dmFyIGF0dHJpYnV0 ZU5hbWU9cHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWU7aWYocHJvcGVydHlJbmZvLmhhc0Jvb2xl YW5WYWx1ZXx8cHJvcGVydHlJbmZvLmhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWUmJnZhbHVlPT09 dHJ1ZSl7cmV0dXJuIGF0dHJpYnV0ZU5hbWUrJz0iIid9cmV0dXJuIGF0dHJpYnV0ZU5hbWUrIj0i K3F1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyKHZhbHVlKX1lbHNlIGlmKERPTVByb3BlcnR5 LmlzQ3VzdG9tQXR0cmlidXRlKG5hbWUpKXtpZih2YWx1ZT09bnVsbCl7cmV0dXJuIiJ9cmV0dXJu IG5hbWUrIj0iK3F1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyKHZhbHVlKX1yZXR1cm4gbnVs bH0sY3JlYXRlTWFya3VwRm9yQ3VzdG9tQXR0cmlidXRlOmZ1bmN0aW9uKG5hbWUsdmFsdWUpe2lm KCFpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpfHx2YWx1ZT09bnVsbCl7cmV0dXJuIiJ9cmV0dXJu IG5hbWUrIj0iK3F1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyKHZhbHVlKX0sc2V0VmFsdWVG b3JQcm9wZXJ0eTpmdW5jdGlvbihub2RlLG5hbWUsdmFsdWUpe3ZhciBwcm9wZXJ0eUluZm89RE9N UHJvcGVydHkucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShuYW1lKT9ET01Qcm9wZXJ0eS5wcm9w ZXJ0aWVzW25hbWVdOm51bGw7aWYocHJvcGVydHlJbmZvKXt2YXIgbXV0YXRpb25NZXRob2Q9cHJv cGVydHlJbmZvLm11dGF0aW9uTWV0aG9kO2lmKG11dGF0aW9uTWV0aG9kKXttdXRhdGlvbk1ldGhv ZChub2RlLHZhbHVlKX1lbHNlIGlmKHNob3VsZElnbm9yZVZhbHVlKHByb3BlcnR5SW5mbyx2YWx1 ZSkpe3RoaXMuZGVsZXRlVmFsdWVGb3JQcm9wZXJ0eShub2RlLG5hbWUpO3JldHVybn1lbHNlIGlm KHByb3BlcnR5SW5mby5tdXN0VXNlUHJvcGVydHkpe25vZGVbcHJvcGVydHlJbmZvLnByb3BlcnR5 TmFtZV09dmFsdWV9ZWxzZXt2YXIgYXR0cmlidXRlTmFtZT1wcm9wZXJ0eUluZm8uYXR0cmlidXRl TmFtZTt2YXIgbmFtZXNwYWNlPXByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lc3BhY2U7aWYobmFt ZXNwYWNlKXtub2RlLnNldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZSxhdHRyaWJ1dGVOYW1lLCIiK3Zh bHVlKX1lbHNlIGlmKHByb3BlcnR5SW5mby5oYXNCb29sZWFuVmFsdWV8fHByb3BlcnR5SW5mby5o YXNPdmVybG9hZGVkQm9vbGVhblZhbHVlJiZ2YWx1ZT09PXRydWUpe25vZGUuc2V0QXR0cmlidXRl KGF0dHJpYnV0ZU5hbWUsIiIpfWVsc2V7bm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwi Iit2YWx1ZSl9fX1lbHNlIGlmKERPTVByb3BlcnR5LmlzQ3VzdG9tQXR0cmlidXRlKG5hbWUpKXtE T01Qcm9wZXJ0eU9wZXJhdGlvbnMuc2V0VmFsdWVGb3JBdHRyaWJ1dGUobm9kZSxuYW1lLHZhbHVl KTtyZXR1cm59aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7dmFyIHBheWxvYWQ9e307 cGF5bG9hZFtuYW1lXT12YWx1ZTtSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0 T3BlcmF0aW9uKHtpbnN0YW5jZUlEOlJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZy b21Ob2RlKG5vZGUpLl9kZWJ1Z0lELHR5cGU6InVwZGF0ZSBhdHRyaWJ1dGUiLHBheWxvYWQ6cGF5 bG9hZH0pfX0sc2V0VmFsdWVGb3JBdHRyaWJ1dGU6ZnVuY3Rpb24obm9kZSxuYW1lLHZhbHVlKXtp ZighaXNBdHRyaWJ1dGVOYW1lU2FmZShuYW1lKSl7cmV0dXJufWlmKHZhbHVlPT1udWxsKXtub2Rl LnJlbW92ZUF0dHJpYnV0ZShuYW1lKX1lbHNle25vZGUuc2V0QXR0cmlidXRlKG5hbWUsIiIrdmFs dWUpfWlmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe3ZhciBwYXlsb2FkPXt9O3BheWxv YWRbbmFtZV09dmFsdWU7UmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJh dGlvbih7aW5zdGFuY2VJRDpSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9k ZShub2RlKS5fZGVidWdJRCx0eXBlOiJ1cGRhdGUgYXR0cmlidXRlIixwYXlsb2FkOnBheWxvYWR9 KX19LGRlbGV0ZVZhbHVlRm9yQXR0cmlidXRlOmZ1bmN0aW9uKG5vZGUsbmFtZSl7bm9kZS5yZW1v dmVBdHRyaWJ1dGUobmFtZSk7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7UmVhY3RJ bnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7aW5zdGFuY2VJRDpSZWFj dERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShub2RlKS5fZGVidWdJRCx0eXBl OiJyZW1vdmUgYXR0cmlidXRlIixwYXlsb2FkOm5hbWV9KX19LGRlbGV0ZVZhbHVlRm9yUHJvcGVy dHk6ZnVuY3Rpb24obm9kZSxuYW1lKXt2YXIgcHJvcGVydHlJbmZvPURPTVByb3BlcnR5LnByb3Bl cnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSk/RE9NUHJvcGVydHkucHJvcGVydGllc1tuYW1lXTpu dWxsO2lmKHByb3BlcnR5SW5mbyl7dmFyIG11dGF0aW9uTWV0aG9kPXByb3BlcnR5SW5mby5tdXRh dGlvbk1ldGhvZDtpZihtdXRhdGlvbk1ldGhvZCl7bXV0YXRpb25NZXRob2Qobm9kZSx1bmRlZmlu ZWQpfWVsc2UgaWYocHJvcGVydHlJbmZvLm11c3RVc2VQcm9wZXJ0eSl7dmFyIHByb3BOYW1lPXBy b3BlcnR5SW5mby5wcm9wZXJ0eU5hbWU7aWYocHJvcGVydHlJbmZvLmhhc0Jvb2xlYW5WYWx1ZSl7 bm9kZVtwcm9wTmFtZV09ZmFsc2V9ZWxzZXtub2RlW3Byb3BOYW1lXT0iIn19ZWxzZXtub2RlLnJl bW92ZUF0dHJpYnV0ZShwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZSl9fWVsc2UgaWYoRE9NUHJv cGVydHkuaXNDdXN0b21BdHRyaWJ1dGUobmFtZSkpe25vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUp fWlmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe1JlYWN0SW5zdHJ1bWVudGF0aW9uLmRl YnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oe2luc3RhbmNlSUQ6UmVhY3RET01Db21wb25lbnRUcmVl LmdldEluc3RhbmNlRnJvbU5vZGUobm9kZSkuX2RlYnVnSUQsdHlwZToicmVtb3ZlIGF0dHJpYnV0 ZSIscGF5bG9hZDpuYW1lfSl9fX07bW9kdWxlLmV4cG9ydHM9RE9NUHJvcGVydHlPcGVyYXRpb25z fSx7MTE6MTEsMTE1OjExNSwxNDc6MTQ3LDMyOjMyLDU5OjU5fV0sMTM6W2Z1bmN0aW9uKF9kZXJl cV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgX3Byb2RJbnZhcmlhbnQ9X2RlcmVx XygxMTYpO3ZhciBET01MYXp5VHJlZT1fZGVyZXFfKDkpO3ZhciBFeGVjdXRpb25FbnZpcm9ubWVu dD1fZGVyZXFfKDEyNik7dmFyIGNyZWF0ZU5vZGVzRnJvbU1hcmt1cD1fZGVyZXFfKDEzMSk7dmFy IGVtcHR5RnVuY3Rpb249X2RlcmVxXygxMzIpO3ZhciBpbnZhcmlhbnQ9X2RlcmVxXygxNDApO3Zh ciBEYW5nZXI9e2Rhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwOmZ1bmN0aW9uKG9sZENo aWxkLG1hcmt1cCl7IUV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTT8iZGV2ZWxvcG1lbnQi IT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdp dGhNYXJrdXAoLi4uKTogQ2Fubm90IHJlbmRlciBtYXJrdXAgaW4gYSB3b3JrZXIgdGhyZWFkLiBN YWtlIHN1cmUgYHdpbmRvd2AgYW5kIGBkb2N1bWVudGAgYXJlIGF2YWlsYWJsZSBnbG9iYWxseSBi ZWZvcmUgcmVxdWlyaW5nIFJlYWN0IHdoZW4gdW5pdCB0ZXN0aW5nIG9yIHVzZSBSZWFjdERPTVNl cnZlci5yZW5kZXJUb1N0cmluZygpIGZvciBzZXJ2ZXIgcmVuZGVyaW5nLiIpOl9wcm9kSW52YXJp YW50KCI1NiIpOnZvaWQgMDshbWFya3VwPyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/aW52 YXJpYW50KGZhbHNlLCJkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cCguLi4pOiBNaXNz aW5nIG1hcmt1cC4iKTpfcHJvZEludmFyaWFudCgiNTciKTp2b2lkIDA7IShvbGRDaGlsZC5ub2Rl TmFtZSE9PSJIVE1MIik/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFs c2UsImRhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwKC4uLik6IENhbm5vdCByZXBsYWNl IG1hcmt1cCBvZiB0aGUgPGh0bWw+IG5vZGUuIFRoaXMgaXMgYmVjYXVzZSBicm93c2VyIHF1aXJr cyBtYWtlIHRoaXMgdW5yZWxpYWJsZSBhbmQvb3Igc2xvdy4gSWYgeW91IHdhbnQgdG8gcmVuZGVy IHRvIHRoZSByb290IHlvdSBtdXN0IHVzZSBzZXJ2ZXIgcmVuZGVyaW5nLiBTZWUgUmVhY3RET01T ZXJ2ZXIucmVuZGVyVG9TdHJpbmcoKS4iKTpfcHJvZEludmFyaWFudCgiNTgiKTp2b2lkIDA7aWYo dHlwZW9mIG1hcmt1cD09PSJzdHJpbmciKXt2YXIgbmV3Q2hpbGQ9Y3JlYXRlTm9kZXNGcm9tTWFy a3VwKG1hcmt1cCxlbXB0eUZ1bmN0aW9uKVswXTtvbGRDaGlsZC5wYXJlbnROb2RlLnJlcGxhY2VD aGlsZChuZXdDaGlsZCxvbGRDaGlsZCl9ZWxzZXtET01MYXp5VHJlZS5yZXBsYWNlQ2hpbGRXaXRo VHJlZShvbGRDaGlsZCxtYXJrdXApfX19O21vZHVsZS5leHBvcnRzPURhbmdlcn0sezExNjoxMTYs MTI2OjEyNiwxMzE6MTMxLDEzMjoxMzIsMTQwOjE0MCw5Ojl9XSwxNDpbZnVuY3Rpb24oX2RlcmVx Xyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBEZWZhdWx0RXZlbnRQbHVnaW5PcmRl cj1bIlJlc3BvbmRlckV2ZW50UGx1Z2luIiwiU2ltcGxlRXZlbnRQbHVnaW4iLCJUYXBFdmVudFBs dWdpbiIsIkVudGVyTGVhdmVFdmVudFBsdWdpbiIsIkNoYW5nZUV2ZW50UGx1Z2luIiwiU2VsZWN0 RXZlbnRQbHVnaW4iLCJCZWZvcmVJbnB1dEV2ZW50UGx1Z2luIl07bW9kdWxlLmV4cG9ydHM9RGVm YXVsdEV2ZW50UGx1Z2luT3JkZXJ9LHt9XSwxNTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhw b3J0cyl7InVzZSBzdHJpY3QiO3ZhciBFdmVudFByb3BhZ2F0b3JzPV9kZXJlcV8oMTkpO3ZhciBS ZWFjdERPTUNvbXBvbmVudFRyZWU9X2RlcmVxXygzMik7dmFyIFN5bnRoZXRpY01vdXNlRXZlbnQ9 X2RlcmVxXyg4OCk7dmFyIGV2ZW50VHlwZXM9e21vdXNlRW50ZXI6e3JlZ2lzdHJhdGlvbk5hbWU6 Im9uTW91c2VFbnRlciIsZGVwZW5kZW5jaWVzOlsidG9wTW91c2VPdXQiLCJ0b3BNb3VzZU92ZXIi XX0sbW91c2VMZWF2ZTp7cmVnaXN0cmF0aW9uTmFtZToib25Nb3VzZUxlYXZlIixkZXBlbmRlbmNp ZXM6WyJ0b3BNb3VzZU91dCIsInRvcE1vdXNlT3ZlciJdfX07dmFyIEVudGVyTGVhdmVFdmVudFBs dWdpbj17ZXZlbnRUeXBlczpldmVudFR5cGVzLGV4dHJhY3RFdmVudHM6ZnVuY3Rpb24odG9wTGV2 ZWxUeXBlLHRhcmdldEluc3QsbmF0aXZlRXZlbnQsbmF0aXZlRXZlbnRUYXJnZXQpe2lmKHRvcExl dmVsVHlwZT09PSJ0b3BNb3VzZU92ZXIiJiYobmF0aXZlRXZlbnQucmVsYXRlZFRhcmdldHx8bmF0 aXZlRXZlbnQuZnJvbUVsZW1lbnQpKXtyZXR1cm4gbnVsbH1pZih0b3BMZXZlbFR5cGUhPT0idG9w TW91c2VPdXQiJiZ0b3BMZXZlbFR5cGUhPT0idG9wTW91c2VPdmVyIil7cmV0dXJuIG51bGx9dmFy IHdpbjtpZihuYXRpdmVFdmVudFRhcmdldC53aW5kb3c9PT1uYXRpdmVFdmVudFRhcmdldCl7d2lu PW5hdGl2ZUV2ZW50VGFyZ2V0fWVsc2V7dmFyIGRvYz1uYXRpdmVFdmVudFRhcmdldC5vd25lckRv Y3VtZW50O2lmKGRvYyl7d2luPWRvYy5kZWZhdWx0Vmlld3x8ZG9jLnBhcmVudFdpbmRvd31lbHNl e3dpbj13aW5kb3d9fXZhciBmcm9tO3ZhciB0bztpZih0b3BMZXZlbFR5cGU9PT0idG9wTW91c2VP dXQiKXtmcm9tPXRhcmdldEluc3Q7dmFyIHJlbGF0ZWQ9bmF0aXZlRXZlbnQucmVsYXRlZFRhcmdl dHx8bmF0aXZlRXZlbnQudG9FbGVtZW50O3RvPXJlbGF0ZWQ/UmVhY3RET01Db21wb25lbnRUcmVl LmdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKHJlbGF0ZWQpOm51bGx9ZWxzZXtmcm9tPW51bGw7 dG89dGFyZ2V0SW5zdH1pZihmcm9tPT09dG8pe3JldHVybiBudWxsfXZhciBmcm9tTm9kZT1mcm9t PT1udWxsP3dpbjpSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShmcm9t KTt2YXIgdG9Ob2RlPXRvPT1udWxsP3dpbjpSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZy b21JbnN0YW5jZSh0byk7dmFyIGxlYXZlPVN5bnRoZXRpY01vdXNlRXZlbnQuZ2V0UG9vbGVkKGV2 ZW50VHlwZXMubW91c2VMZWF2ZSxmcm9tLG5hdGl2ZUV2ZW50LG5hdGl2ZUV2ZW50VGFyZ2V0KTts ZWF2ZS50eXBlPSJtb3VzZWxlYXZlIjtsZWF2ZS50YXJnZXQ9ZnJvbU5vZGU7bGVhdmUucmVsYXRl ZFRhcmdldD10b05vZGU7dmFyIGVudGVyPVN5bnRoZXRpY01vdXNlRXZlbnQuZ2V0UG9vbGVkKGV2 ZW50VHlwZXMubW91c2VFbnRlcix0byxuYXRpdmVFdmVudCxuYXRpdmVFdmVudFRhcmdldCk7ZW50 ZXIudHlwZT0ibW91c2VlbnRlciI7ZW50ZXIudGFyZ2V0PXRvTm9kZTtlbnRlci5yZWxhdGVkVGFy Z2V0PWZyb21Ob2RlO0V2ZW50UHJvcGFnYXRvcnMuYWNjdW11bGF0ZUVudGVyTGVhdmVEaXNwYXRj aGVzKGxlYXZlLGVudGVyLGZyb20sdG8pO3JldHVybltsZWF2ZSxlbnRlcl19fTttb2R1bGUuZXhw b3J0cz1FbnRlckxlYXZlRXZlbnRQbHVnaW59LHsxOToxOSwzMjozMiw4ODo4OH1dLDE2OltmdW5j dGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIF9wcm9kSW52YXJp YW50PV9kZXJlcV8oMTE2KTt2YXIgRXZlbnRQbHVnaW5SZWdpc3RyeT1fZGVyZXFfKDE3KTt2YXIg RXZlbnRQbHVnaW5VdGlscz1fZGVyZXFfKDE4KTt2YXIgUmVhY3RFcnJvclV0aWxzPV9kZXJlcV8o NTApO3ZhciBhY2N1bXVsYXRlSW50bz1fZGVyZXFfKDk1KTt2YXIgZm9yRWFjaEFjY3VtdWxhdGVk PV9kZXJlcV8oMTAyKTt2YXIgaW52YXJpYW50PV9kZXJlcV8oMTQwKTt2YXIgbGlzdGVuZXJCYW5r PXt9O3ZhciBldmVudFF1ZXVlPW51bGw7dmFyIGV4ZWN1dGVEaXNwYXRjaGVzQW5kUmVsZWFzZT1m dW5jdGlvbihldmVudCxzaW11bGF0ZWQpe2lmKGV2ZW50KXtFdmVudFBsdWdpblV0aWxzLmV4ZWN1 dGVEaXNwYXRjaGVzSW5PcmRlcihldmVudCxzaW11bGF0ZWQpO2lmKCFldmVudC5pc1BlcnNpc3Rl bnQoKSl7ZXZlbnQuY29uc3RydWN0b3IucmVsZWFzZShldmVudCl9fX07dmFyIGV4ZWN1dGVEaXNw YXRjaGVzQW5kUmVsZWFzZVNpbXVsYXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZXhlY3V0ZURpc3Bh dGNoZXNBbmRSZWxlYXNlKGUsdHJ1ZSl9O3ZhciBleGVjdXRlRGlzcGF0Y2hlc0FuZFJlbGVhc2VU b3BMZXZlbD1mdW5jdGlvbihlKXtyZXR1cm4gZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlKGUs ZmFsc2UpfTt2YXIgZ2V0RGljdGlvbmFyeUtleT1mdW5jdGlvbihpbnN0KXtyZXR1cm4iLiIraW5z dC5fcm9vdE5vZGVJRH07ZnVuY3Rpb24gaXNJbnRlcmFjdGl2ZSh0YWcpe3JldHVybiB0YWc9PT0i YnV0dG9uInx8dGFnPT09ImlucHV0Inx8dGFnPT09InNlbGVjdCJ8fHRhZz09PSJ0ZXh0YXJlYSJ9 ZnVuY3Rpb24gc2hvdWxkUHJldmVudE1vdXNlRXZlbnQobmFtZSx0eXBlLHByb3BzKXtzd2l0Y2go bmFtZSl7Y2FzZSJvbkNsaWNrIjpjYXNlIm9uQ2xpY2tDYXB0dXJlIjpjYXNlIm9uRG91YmxlQ2xp Y2siOmNhc2Uib25Eb3VibGVDbGlja0NhcHR1cmUiOmNhc2Uib25Nb3VzZURvd24iOmNhc2Uib25N b3VzZURvd25DYXB0dXJlIjpjYXNlIm9uTW91c2VNb3ZlIjpjYXNlIm9uTW91c2VNb3ZlQ2FwdHVy ZSI6Y2FzZSJvbk1vdXNlVXAiOmNhc2Uib25Nb3VzZVVwQ2FwdHVyZSI6cmV0dXJuISEocHJvcHMu ZGlzYWJsZWQmJmlzSW50ZXJhY3RpdmUodHlwZSkpO2RlZmF1bHQ6cmV0dXJuIGZhbHNlfX12YXIg RXZlbnRQbHVnaW5IdWI9e2luamVjdGlvbjp7aW5qZWN0RXZlbnRQbHVnaW5PcmRlcjpFdmVudFBs dWdpblJlZ2lzdHJ5LmluamVjdEV2ZW50UGx1Z2luT3JkZXIsaW5qZWN0RXZlbnRQbHVnaW5zQnlO YW1lOkV2ZW50UGx1Z2luUmVnaXN0cnkuaW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lfSxwdXRMaXN0 ZW5lcjpmdW5jdGlvbihpbnN0LHJlZ2lzdHJhdGlvbk5hbWUsbGlzdGVuZXIpeyEodHlwZW9mIGxp c3RlbmVyPT09ImZ1bmN0aW9uIik/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlh bnQoZmFsc2UsIkV4cGVjdGVkICVzIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24sIGluc3RlYWQg Z290IHR5cGUgJXMiLHJlZ2lzdHJhdGlvbk5hbWUsdHlwZW9mIGxpc3RlbmVyKTpfcHJvZEludmFy aWFudCgiOTQiLHJlZ2lzdHJhdGlvbk5hbWUsdHlwZW9mIGxpc3RlbmVyKTp2b2lkIDA7dmFyIGtl eT1nZXREaWN0aW9uYXJ5S2V5KGluc3QpO3ZhciBiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZT1saXN0 ZW5lckJhbmtbcmVnaXN0cmF0aW9uTmFtZV18fChsaXN0ZW5lckJhbmtbcmVnaXN0cmF0aW9uTmFt ZV09e30pO2JhbmtGb3JSZWdpc3RyYXRpb25OYW1lW2tleV09bGlzdGVuZXI7dmFyIFBsdWdpbk1v ZHVsZT1FdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW3JlZ2lzdHJh dGlvbk5hbWVdO2lmKFBsdWdpbk1vZHVsZSYmUGx1Z2luTW9kdWxlLmRpZFB1dExpc3RlbmVyKXtQ bHVnaW5Nb2R1bGUuZGlkUHV0TGlzdGVuZXIoaW5zdCxyZWdpc3RyYXRpb25OYW1lLGxpc3RlbmVy KX19LGdldExpc3RlbmVyOmZ1bmN0aW9uKGluc3QscmVnaXN0cmF0aW9uTmFtZSl7dmFyIGJhbmtG b3JSZWdpc3RyYXRpb25OYW1lPWxpc3RlbmVyQmFua1tyZWdpc3RyYXRpb25OYW1lXTtpZihzaG91 bGRQcmV2ZW50TW91c2VFdmVudChyZWdpc3RyYXRpb25OYW1lLGluc3QuX2N1cnJlbnRFbGVtZW50 LnR5cGUsaW5zdC5fY3VycmVudEVsZW1lbnQucHJvcHMpKXtyZXR1cm4gbnVsbH12YXIga2V5PWdl dERpY3Rpb25hcnlLZXkoaW5zdCk7cmV0dXJuIGJhbmtGb3JSZWdpc3RyYXRpb25OYW1lJiZiYW5r Rm9yUmVnaXN0cmF0aW9uTmFtZVtrZXldfSxkZWxldGVMaXN0ZW5lcjpmdW5jdGlvbihpbnN0LHJl Z2lzdHJhdGlvbk5hbWUpe3ZhciBQbHVnaW5Nb2R1bGU9RXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdp c3RyYXRpb25OYW1lTW9kdWxlc1tyZWdpc3RyYXRpb25OYW1lXTtpZihQbHVnaW5Nb2R1bGUmJlBs dWdpbk1vZHVsZS53aWxsRGVsZXRlTGlzdGVuZXIpe1BsdWdpbk1vZHVsZS53aWxsRGVsZXRlTGlz dGVuZXIoaW5zdCxyZWdpc3RyYXRpb25OYW1lKX12YXIgYmFua0ZvclJlZ2lzdHJhdGlvbk5hbWU9 bGlzdGVuZXJCYW5rW3JlZ2lzdHJhdGlvbk5hbWVdO2lmKGJhbmtGb3JSZWdpc3RyYXRpb25OYW1l KXt2YXIga2V5PWdldERpY3Rpb25hcnlLZXkoaW5zdCk7ZGVsZXRlIGJhbmtGb3JSZWdpc3RyYXRp b25OYW1lW2tleV19fSxkZWxldGVBbGxMaXN0ZW5lcnM6ZnVuY3Rpb24oaW5zdCl7dmFyIGtleT1n ZXREaWN0aW9uYXJ5S2V5KGluc3QpO2Zvcih2YXIgcmVnaXN0cmF0aW9uTmFtZSBpbiBsaXN0ZW5l ckJhbmspe2lmKCFsaXN0ZW5lckJhbmsuaGFzT3duUHJvcGVydHkocmVnaXN0cmF0aW9uTmFtZSkp e2NvbnRpbnVlfWlmKCFsaXN0ZW5lckJhbmtbcmVnaXN0cmF0aW9uTmFtZV1ba2V5XSl7Y29udGlu dWV9dmFyIFBsdWdpbk1vZHVsZT1FdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVN b2R1bGVzW3JlZ2lzdHJhdGlvbk5hbWVdO2lmKFBsdWdpbk1vZHVsZSYmUGx1Z2luTW9kdWxlLndp bGxEZWxldGVMaXN0ZW5lcil7UGx1Z2luTW9kdWxlLndpbGxEZWxldGVMaXN0ZW5lcihpbnN0LHJl Z2lzdHJhdGlvbk5hbWUpfWRlbGV0ZSBsaXN0ZW5lckJhbmtbcmVnaXN0cmF0aW9uTmFtZV1ba2V5 XX19LGV4dHJhY3RFdmVudHM6ZnVuY3Rpb24odG9wTGV2ZWxUeXBlLHRhcmdldEluc3QsbmF0aXZl RXZlbnQsbmF0aXZlRXZlbnRUYXJnZXQpe3ZhciBldmVudHM7dmFyIHBsdWdpbnM9RXZlbnRQbHVn aW5SZWdpc3RyeS5wbHVnaW5zO2Zvcih2YXIgaT0wO2k8cGx1Z2lucy5sZW5ndGg7aSsrKXt2YXIg cG9zc2libGVQbHVnaW49cGx1Z2luc1tpXTtpZihwb3NzaWJsZVBsdWdpbil7dmFyIGV4dHJhY3Rl ZEV2ZW50cz1wb3NzaWJsZVBsdWdpbi5leHRyYWN0RXZlbnRzKHRvcExldmVsVHlwZSx0YXJnZXRJ bnN0LG5hdGl2ZUV2ZW50LG5hdGl2ZUV2ZW50VGFyZ2V0KTtpZihleHRyYWN0ZWRFdmVudHMpe2V2 ZW50cz1hY2N1bXVsYXRlSW50byhldmVudHMsZXh0cmFjdGVkRXZlbnRzKX19fXJldHVybiBldmVu dHN9LGVucXVldWVFdmVudHM6ZnVuY3Rpb24oZXZlbnRzKXtpZihldmVudHMpe2V2ZW50UXVldWU9 YWNjdW11bGF0ZUludG8oZXZlbnRRdWV1ZSxldmVudHMpfX0scHJvY2Vzc0V2ZW50UXVldWU6ZnVu Y3Rpb24oc2ltdWxhdGVkKXt2YXIgcHJvY2Vzc2luZ0V2ZW50UXVldWU9ZXZlbnRRdWV1ZTtldmVu dFF1ZXVlPW51bGw7aWYoc2ltdWxhdGVkKXtmb3JFYWNoQWNjdW11bGF0ZWQocHJvY2Vzc2luZ0V2 ZW50UXVldWUsZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlU2ltdWxhdGVkKX1lbHNle2ZvckVh Y2hBY2N1bXVsYXRlZChwcm9jZXNzaW5nRXZlbnRRdWV1ZSxleGVjdXRlRGlzcGF0Y2hlc0FuZFJl bGVhc2VUb3BMZXZlbCl9ISFldmVudFF1ZXVlPyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/ aW52YXJpYW50KGZhbHNlLCJwcm9jZXNzRXZlbnRRdWV1ZSgpOiBBZGRpdGlvbmFsIGV2ZW50cyB3 ZXJlIGVucXVldWVkIHdoaWxlIHByb2Nlc3NpbmcgYW4gZXZlbnQgcXVldWUuIFN1cHBvcnQgZm9y IHRoaXMgaGFzIG5vdCB5ZXQgYmVlbiBpbXBsZW1lbnRlZC4iKTpfcHJvZEludmFyaWFudCgiOTUi KTp2b2lkIDA7UmVhY3RFcnJvclV0aWxzLnJldGhyb3dDYXVnaHRFcnJvcigpfSxfX3B1cmdlOmZ1 bmN0aW9uKCl7bGlzdGVuZXJCYW5rPXt9fSxfX2dldExpc3RlbmVyQmFuazpmdW5jdGlvbigpe3Jl dHVybiBsaXN0ZW5lckJhbmt9fTttb2R1bGUuZXhwb3J0cz1FdmVudFBsdWdpbkh1Yn0sezEwMjox MDIsMTE2OjExNiwxNDA6MTQwLDE3OjE3LDE4OjE4LDUwOjUwLDk1Ojk1fV0sMTc6W2Z1bmN0aW9u KF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgX3Byb2RJbnZhcmlhbnQ9 X2RlcmVxXygxMTYpO3ZhciBpbnZhcmlhbnQ9X2RlcmVxXygxNDApO3ZhciBldmVudFBsdWdpbk9y ZGVyPW51bGw7dmFyIG5hbWVzVG9QbHVnaW5zPXt9O2Z1bmN0aW9uIHJlY29tcHV0ZVBsdWdpbk9y ZGVyaW5nKCl7aWYoIWV2ZW50UGx1Z2luT3JkZXIpe3JldHVybn1mb3IodmFyIHBsdWdpbk5hbWUg aW4gbmFtZXNUb1BsdWdpbnMpe3ZhciBwbHVnaW5Nb2R1bGU9bmFtZXNUb1BsdWdpbnNbcGx1Z2lu TmFtZV07dmFyIHBsdWdpbkluZGV4PWV2ZW50UGx1Z2luT3JkZXIuaW5kZXhPZihwbHVnaW5OYW1l KTshKHBsdWdpbkluZGV4Pi0xKT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFu dChmYWxzZSwiRXZlbnRQbHVnaW5SZWdpc3RyeTogQ2Fubm90IGluamVjdCBldmVudCBwbHVnaW5z IHRoYXQgZG8gbm90IGV4aXN0IGluIHRoZSBwbHVnaW4gb3JkZXJpbmcsIGAlc2AuIixwbHVnaW5O YW1lKTpfcHJvZEludmFyaWFudCgiOTYiLHBsdWdpbk5hbWUpOnZvaWQgMDtpZihFdmVudFBsdWdp blJlZ2lzdHJ5LnBsdWdpbnNbcGx1Z2luSW5kZXhdKXtjb250aW51ZX0hcGx1Z2luTW9kdWxlLmV4 dHJhY3RFdmVudHM/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2Us IkV2ZW50UGx1Z2luUmVnaXN0cnk6IEV2ZW50IHBsdWdpbnMgbXVzdCBpbXBsZW1lbnQgYW4gYGV4 dHJhY3RFdmVudHNgIG1ldGhvZCwgYnV0IGAlc2AgZG9lcyBub3QuIixwbHVnaW5OYW1lKTpfcHJv ZEludmFyaWFudCgiOTciLHBsdWdpbk5hbWUpOnZvaWQgMDtFdmVudFBsdWdpblJlZ2lzdHJ5LnBs dWdpbnNbcGx1Z2luSW5kZXhdPXBsdWdpbk1vZHVsZTt2YXIgcHVibGlzaGVkRXZlbnRzPXBsdWdp bk1vZHVsZS5ldmVudFR5cGVzO2Zvcih2YXIgZXZlbnROYW1lIGluIHB1Ymxpc2hlZEV2ZW50cyl7 IXB1Ymxpc2hFdmVudEZvclBsdWdpbihwdWJsaXNoZWRFdmVudHNbZXZlbnROYW1lXSxwbHVnaW5N b2R1bGUsZXZlbnROYW1lKT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChm YWxzZSwiRXZlbnRQbHVnaW5SZWdpc3RyeTogRmFpbGVkIHRvIHB1Ymxpc2ggZXZlbnQgYCVzYCBm b3IgcGx1Z2luIGAlc2AuIixldmVudE5hbWUscGx1Z2luTmFtZSk6X3Byb2RJbnZhcmlhbnQoIjk4 IixldmVudE5hbWUscGx1Z2luTmFtZSk6dm9pZCAwfX19ZnVuY3Rpb24gcHVibGlzaEV2ZW50Rm9y UGx1Z2luKGRpc3BhdGNoQ29uZmlnLHBsdWdpbk1vZHVsZSxldmVudE5hbWUpeyEhRXZlbnRQbHVn aW5SZWdpc3RyeS5ldmVudE5hbWVEaXNwYXRjaENvbmZpZ3MuaGFzT3duUHJvcGVydHkoZXZlbnRO YW1lKT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiRXZlbnRQ bHVnaW5IdWI6IE1vcmUgdGhhbiBvbmUgcGx1Z2luIGF0dGVtcHRlZCB0byBwdWJsaXNoIHRoZSBz YW1lIGV2ZW50IG5hbWUsIGAlc2AuIixldmVudE5hbWUpOl9wcm9kSW52YXJpYW50KCI5OSIsZXZl bnROYW1lKTp2b2lkIDA7RXZlbnRQbHVnaW5SZWdpc3RyeS5ldmVudE5hbWVEaXNwYXRjaENvbmZp Z3NbZXZlbnROYW1lXT1kaXNwYXRjaENvbmZpZzt2YXIgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM9 ZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM7aWYocGhhc2VkUmVnaXN0cmF0 aW9uTmFtZXMpe2Zvcih2YXIgcGhhc2VOYW1lIGluIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzKXtp ZihwaGFzZWRSZWdpc3RyYXRpb25OYW1lcy5oYXNPd25Qcm9wZXJ0eShwaGFzZU5hbWUpKXt2YXIg cGhhc2VkUmVnaXN0cmF0aW9uTmFtZT1waGFzZWRSZWdpc3RyYXRpb25OYW1lc1twaGFzZU5hbWVd O3B1Ymxpc2hSZWdpc3RyYXRpb25OYW1lKHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWUscGx1Z2luTW9k dWxlLGV2ZW50TmFtZSl9fXJldHVybiB0cnVlfWVsc2UgaWYoZGlzcGF0Y2hDb25maWcucmVnaXN0 cmF0aW9uTmFtZSl7cHVibGlzaFJlZ2lzdHJhdGlvbk5hbWUoZGlzcGF0Y2hDb25maWcucmVnaXN0 cmF0aW9uTmFtZSxwbHVnaW5Nb2R1bGUsZXZlbnROYW1lKTtyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFs c2V9ZnVuY3Rpb24gcHVibGlzaFJlZ2lzdHJhdGlvbk5hbWUocmVnaXN0cmF0aW9uTmFtZSxwbHVn aW5Nb2R1bGUsZXZlbnROYW1lKXshIUV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFt ZU1vZHVsZXNbcmVnaXN0cmF0aW9uTmFtZV0/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9p bnZhcmlhbnQoZmFsc2UsIkV2ZW50UGx1Z2luSHViOiBNb3JlIHRoYW4gb25lIHBsdWdpbiBhdHRl bXB0ZWQgdG8gcHVibGlzaCB0aGUgc2FtZSByZWdpc3RyYXRpb24gbmFtZSwgYCVzYC4iLHJlZ2lz dHJhdGlvbk5hbWUpOl9wcm9kSW52YXJpYW50KCIxMDAiLHJlZ2lzdHJhdGlvbk5hbWUpOnZvaWQg MDtFdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW3JlZ2lzdHJhdGlv bk5hbWVdPXBsdWdpbk1vZHVsZTtFdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVE ZXBlbmRlbmNpZXNbcmVnaXN0cmF0aW9uTmFtZV09cGx1Z2luTW9kdWxlLmV2ZW50VHlwZXNbZXZl bnROYW1lXS5kZXBlbmRlbmNpZXM7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7dmFy IGxvd2VyQ2FzZWROYW1lPXJlZ2lzdHJhdGlvbk5hbWUudG9Mb3dlckNhc2UoKTtFdmVudFBsdWdp blJlZ2lzdHJ5LnBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXNbbG93ZXJDYXNlZE5hbWVdPXJlZ2lz dHJhdGlvbk5hbWU7aWYocmVnaXN0cmF0aW9uTmFtZT09PSJvbkRvdWJsZUNsaWNrIil7RXZlbnRQ bHVnaW5SZWdpc3RyeS5wb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzLm9uZGJsY2xpY2s9cmVnaXN0 cmF0aW9uTmFtZX19fXZhciBFdmVudFBsdWdpblJlZ2lzdHJ5PXtwbHVnaW5zOltdLGV2ZW50TmFt ZURpc3BhdGNoQ29uZmlnczp7fSxyZWdpc3RyYXRpb25OYW1lTW9kdWxlczp7fSxyZWdpc3RyYXRp b25OYW1lRGVwZW5kZW5jaWVzOnt9LHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXM6ImRldmVsb3Bt ZW50IiE9PSJwcm9kdWN0aW9uIj97fTpudWxsLGluamVjdEV2ZW50UGx1Z2luT3JkZXI6ZnVuY3Rp b24oaW5qZWN0ZWRFdmVudFBsdWdpbk9yZGVyKXshIWV2ZW50UGx1Z2luT3JkZXI/ImRldmVsb3Bt ZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsIkV2ZW50UGx1Z2luUmVnaXN0cnk6 IENhbm5vdCBpbmplY3QgZXZlbnQgcGx1Z2luIG9yZGVyaW5nIG1vcmUgdGhhbiBvbmNlLiBZb3Ug YXJlIGxpa2VseSB0cnlpbmcgdG8gbG9hZCBtb3JlIHRoYW4gb25lIGNvcHkgb2YgUmVhY3QuIik6 X3Byb2RJbnZhcmlhbnQoIjEwMSIpOnZvaWQgMDtldmVudFBsdWdpbk9yZGVyPUFycmF5LnByb3Rv dHlwZS5zbGljZS5jYWxsKGluamVjdGVkRXZlbnRQbHVnaW5PcmRlcik7cmVjb21wdXRlUGx1Z2lu T3JkZXJpbmcoKX0saW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lOmZ1bmN0aW9uKGluamVjdGVkTmFt ZXNUb1BsdWdpbnMpe3ZhciBpc09yZGVyaW5nRGlydHk9ZmFsc2U7Zm9yKHZhciBwbHVnaW5OYW1l IGluIGluamVjdGVkTmFtZXNUb1BsdWdpbnMpe2lmKCFpbmplY3RlZE5hbWVzVG9QbHVnaW5zLmhh c093blByb3BlcnR5KHBsdWdpbk5hbWUpKXtjb250aW51ZX12YXIgcGx1Z2luTW9kdWxlPWluamVj dGVkTmFtZXNUb1BsdWdpbnNbcGx1Z2luTmFtZV07aWYoIW5hbWVzVG9QbHVnaW5zLmhhc093blBy b3BlcnR5KHBsdWdpbk5hbWUpfHxuYW1lc1RvUGx1Z2luc1twbHVnaW5OYW1lXSE9PXBsdWdpbk1v ZHVsZSl7ISFuYW1lc1RvUGx1Z2luc1twbHVnaW5OYW1lXT8iZGV2ZWxvcG1lbnQiIT09InByb2R1 Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiRXZlbnRQbHVnaW5SZWdpc3RyeTogQ2Fubm90IGluamVj dCB0d28gZGlmZmVyZW50IGV2ZW50IHBsdWdpbnMgdXNpbmcgdGhlIHNhbWUgbmFtZSwgYCVzYC4i LHBsdWdpbk5hbWUpOl9wcm9kSW52YXJpYW50KCIxMDIiLHBsdWdpbk5hbWUpOnZvaWQgMDtuYW1l c1RvUGx1Z2luc1twbHVnaW5OYW1lXT1wbHVnaW5Nb2R1bGU7aXNPcmRlcmluZ0RpcnR5PXRydWV9 fWlmKGlzT3JkZXJpbmdEaXJ0eSl7cmVjb21wdXRlUGx1Z2luT3JkZXJpbmcoKX19LGdldFBsdWdp bk1vZHVsZUZvckV2ZW50OmZ1bmN0aW9uKGV2ZW50KXt2YXIgZGlzcGF0Y2hDb25maWc9ZXZlbnQu ZGlzcGF0Y2hDb25maWc7aWYoZGlzcGF0Y2hDb25maWcucmVnaXN0cmF0aW9uTmFtZSl7cmV0dXJu IEV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbZGlzcGF0Y2hDb25m aWcucmVnaXN0cmF0aW9uTmFtZV18fG51bGx9aWYoZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0 cmF0aW9uTmFtZXMhPT11bmRlZmluZWQpe3ZhciBwaGFzZWRSZWdpc3RyYXRpb25OYW1lcz1kaXNw YXRjaENvbmZpZy5waGFzZWRSZWdpc3RyYXRpb25OYW1lcztmb3IodmFyIHBoYXNlIGluIHBoYXNl ZFJlZ2lzdHJhdGlvbk5hbWVzKXtpZighcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMuaGFzT3duUHJv cGVydHkocGhhc2UpKXtjb250aW51ZX12YXIgcGx1Z2luTW9kdWxlPUV2ZW50UGx1Z2luUmVnaXN0 cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXNbcGhhc2Vd XTtpZihwbHVnaW5Nb2R1bGUpe3JldHVybiBwbHVnaW5Nb2R1bGV9fX1yZXR1cm4gbnVsbH0sX3Jl c2V0RXZlbnRQbHVnaW5zOmZ1bmN0aW9uKCl7ZXZlbnRQbHVnaW5PcmRlcj1udWxsO2Zvcih2YXIg cGx1Z2luTmFtZSBpbiBuYW1lc1RvUGx1Z2lucyl7aWYobmFtZXNUb1BsdWdpbnMuaGFzT3duUHJv cGVydHkocGx1Z2luTmFtZSkpe2RlbGV0ZSBuYW1lc1RvUGx1Z2luc1twbHVnaW5OYW1lXX19RXZl bnRQbHVnaW5SZWdpc3RyeS5wbHVnaW5zLmxlbmd0aD0wO3ZhciBldmVudE5hbWVEaXNwYXRjaENv bmZpZ3M9RXZlbnRQbHVnaW5SZWdpc3RyeS5ldmVudE5hbWVEaXNwYXRjaENvbmZpZ3M7Zm9yKHZh ciBldmVudE5hbWUgaW4gZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzKXtpZihldmVudE5hbWVEaXNw YXRjaENvbmZpZ3MuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSl7ZGVsZXRlIGV2ZW50TmFtZURp c3BhdGNoQ29uZmlnc1tldmVudE5hbWVdfX12YXIgcmVnaXN0cmF0aW9uTmFtZU1vZHVsZXM9RXZl bnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlcztmb3IodmFyIHJlZ2lzdHJh dGlvbk5hbWUgaW4gcmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMpe2lmKHJlZ2lzdHJhdGlvbk5hbWVN b2R1bGVzLmhhc093blByb3BlcnR5KHJlZ2lzdHJhdGlvbk5hbWUpKXtkZWxldGUgcmVnaXN0cmF0 aW9uTmFtZU1vZHVsZXNbcmVnaXN0cmF0aW9uTmFtZV19fWlmKCJkZXZlbG9wbWVudCIhPT0icHJv ZHVjdGlvbiIpe3ZhciBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzPUV2ZW50UGx1Z2luUmVnaXN0 cnkucG9zc2libGVSZWdpc3RyYXRpb25OYW1lcztmb3IodmFyIGxvd2VyQ2FzZWROYW1lIGluIHBv c3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMpe2lmKHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMuaGFz T3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpKXtkZWxldGUgcG9zc2libGVSZWdpc3RyYXRpb25O YW1lc1tsb3dlckNhc2VkTmFtZV19fX19fTttb2R1bGUuZXhwb3J0cz1FdmVudFBsdWdpblJlZ2lz dHJ5fSx7MTE2OjExNiwxNDA6MTQwfV0sMTg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9y dHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgX3Byb2RJbnZhcmlhbnQ9X2RlcmVxXygxMTYpO3ZhciBSZWFj dEVycm9yVXRpbHM9X2RlcmVxXyg1MCk7dmFyIGludmFyaWFudD1fZGVyZXFfKDE0MCk7dmFyIHdh cm5pbmc9X2RlcmVxXygxNDcpO3ZhciBDb21wb25lbnRUcmVlO3ZhciBUcmVlVHJhdmVyc2FsO3Zh ciBpbmplY3Rpb249e2luamVjdENvbXBvbmVudFRyZWU6ZnVuY3Rpb24oSW5qZWN0ZWQpe0NvbXBv bmVudFRyZWU9SW5qZWN0ZWQ7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7ImRldmVs b3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKEluamVjdGVkJiZJbmplY3RlZC5nZXROb2Rl RnJvbUluc3RhbmNlJiZJbmplY3RlZC5nZXRJbnN0YW5jZUZyb21Ob2RlLCJFdmVudFBsdWdpblV0 aWxzLmluamVjdGlvbi5pbmplY3RDb21wb25lbnRUcmVlKC4uLik6IEluamVjdGVkICIrIm1vZHVs ZSBpcyBtaXNzaW5nIGdldE5vZGVGcm9tSW5zdGFuY2Ugb3IgZ2V0SW5zdGFuY2VGcm9tTm9kZS4i KTp2b2lkIDB9fSxpbmplY3RUcmVlVHJhdmVyc2FsOmZ1bmN0aW9uKEluamVjdGVkKXtUcmVlVHJh dmVyc2FsPUluamVjdGVkO2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpeyJkZXZlbG9w bWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyhJbmplY3RlZCYmSW5qZWN0ZWQuaXNBbmNlc3Rv ciYmSW5qZWN0ZWQuZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IsIkV2ZW50UGx1Z2luVXRpbHMuaW5q ZWN0aW9uLmluamVjdFRyZWVUcmF2ZXJzYWwoLi4uKTogSW5qZWN0ZWQgIisibW9kdWxlIGlzIG1p c3NpbmcgaXNBbmNlc3RvciBvciBnZXRMb3dlc3RDb21tb25BbmNlc3Rvci4iKTp2b2lkIDB9fX07 ZnVuY3Rpb24gaXNFbmRpc2godG9wTGV2ZWxUeXBlKXtyZXR1cm4gdG9wTGV2ZWxUeXBlPT09InRv cE1vdXNlVXAifHx0b3BMZXZlbFR5cGU9PT0idG9wVG91Y2hFbmQifHx0b3BMZXZlbFR5cGU9PT0i dG9wVG91Y2hDYW5jZWwifWZ1bmN0aW9uIGlzTW92ZWlzaCh0b3BMZXZlbFR5cGUpe3JldHVybiB0 b3BMZXZlbFR5cGU9PT0idG9wTW91c2VNb3ZlInx8dG9wTGV2ZWxUeXBlPT09InRvcFRvdWNoTW92 ZSJ9ZnVuY3Rpb24gaXNTdGFydGlzaCh0b3BMZXZlbFR5cGUpe3JldHVybiB0b3BMZXZlbFR5cGU9 PT0idG9wTW91c2VEb3duInx8dG9wTGV2ZWxUeXBlPT09InRvcFRvdWNoU3RhcnQifXZhciB2YWxp ZGF0ZUV2ZW50RGlzcGF0Y2hlcztpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXt2YWxp ZGF0ZUV2ZW50RGlzcGF0Y2hlcz1mdW5jdGlvbihldmVudCl7dmFyIGRpc3BhdGNoTGlzdGVuZXJz PWV2ZW50Ll9kaXNwYXRjaExpc3RlbmVyczt2YXIgZGlzcGF0Y2hJbnN0YW5jZXM9ZXZlbnQuX2Rp c3BhdGNoSW5zdGFuY2VzO3ZhciBsaXN0ZW5lcnNJc0Fycj1BcnJheS5pc0FycmF5KGRpc3BhdGNo TGlzdGVuZXJzKTt2YXIgbGlzdGVuZXJzTGVuPWxpc3RlbmVyc0lzQXJyP2Rpc3BhdGNoTGlzdGVu ZXJzLmxlbmd0aDpkaXNwYXRjaExpc3RlbmVycz8xOjA7dmFyIGluc3RhbmNlc0lzQXJyPUFycmF5 LmlzQXJyYXkoZGlzcGF0Y2hJbnN0YW5jZXMpO3ZhciBpbnN0YW5jZXNMZW49aW5zdGFuY2VzSXNB cnI/ZGlzcGF0Y2hJbnN0YW5jZXMubGVuZ3RoOmRpc3BhdGNoSW5zdGFuY2VzPzE6MDsiZGV2ZWxv cG1lbnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmcoaW5zdGFuY2VzSXNBcnI9PT1saXN0ZW5lcnNJ c0FyciYmaW5zdGFuY2VzTGVuPT09bGlzdGVuZXJzTGVuLCJFdmVudFBsdWdpblV0aWxzOiBJbnZh bGlkIGBldmVudGAuIik6dm9pZCAwfX1mdW5jdGlvbiBleGVjdXRlRGlzcGF0Y2goZXZlbnQsc2lt dWxhdGVkLGxpc3RlbmVyLGluc3Qpe3ZhciB0eXBlPWV2ZW50LnR5cGV8fCJ1bmtub3duLWV2ZW50 IjtldmVudC5jdXJyZW50VGFyZ2V0PUV2ZW50UGx1Z2luVXRpbHMuZ2V0Tm9kZUZyb21JbnN0YW5j ZShpbnN0KTtpZihzaW11bGF0ZWQpe1JlYWN0RXJyb3JVdGlscy5pbnZva2VHdWFyZGVkQ2FsbGJh Y2tXaXRoQ2F0Y2godHlwZSxsaXN0ZW5lcixldmVudCl9ZWxzZXtSZWFjdEVycm9yVXRpbHMuaW52 b2tlR3VhcmRlZENhbGxiYWNrKHR5cGUsbGlzdGVuZXIsZXZlbnQpfWV2ZW50LmN1cnJlbnRUYXJn ZXQ9bnVsbH1mdW5jdGlvbiBleGVjdXRlRGlzcGF0Y2hlc0luT3JkZXIoZXZlbnQsc2ltdWxhdGVk KXt2YXIgZGlzcGF0Y2hMaXN0ZW5lcnM9ZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzO3ZhciBkaXNw YXRjaEluc3RhbmNlcz1ldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXM7aWYoImRldmVsb3BtZW50IiE9 PSJwcm9kdWN0aW9uIil7dmFsaWRhdGVFdmVudERpc3BhdGNoZXMoZXZlbnQpfWlmKEFycmF5Lmlz QXJyYXkoZGlzcGF0Y2hMaXN0ZW5lcnMpKXtmb3IodmFyIGk9MDtpPGRpc3BhdGNoTGlzdGVuZXJz Lmxlbmd0aDtpKyspe2lmKGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpe2JyZWFrfWV4ZWN1 dGVEaXNwYXRjaChldmVudCxzaW11bGF0ZWQsZGlzcGF0Y2hMaXN0ZW5lcnNbaV0sZGlzcGF0Y2hJ bnN0YW5jZXNbaV0pfX1lbHNlIGlmKGRpc3BhdGNoTGlzdGVuZXJzKXtleGVjdXRlRGlzcGF0Y2go ZXZlbnQsc2ltdWxhdGVkLGRpc3BhdGNoTGlzdGVuZXJzLGRpc3BhdGNoSW5zdGFuY2VzKX1ldmVu dC5fZGlzcGF0Y2hMaXN0ZW5lcnM9bnVsbDtldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXM9bnVsbH1m dW5jdGlvbiBleGVjdXRlRGlzcGF0Y2hlc0luT3JkZXJTdG9wQXRUcnVlSW1wbChldmVudCl7dmFy IGRpc3BhdGNoTGlzdGVuZXJzPWV2ZW50Ll9kaXNwYXRjaExpc3RlbmVyczt2YXIgZGlzcGF0Y2hJ bnN0YW5jZXM9ZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzO2lmKCJkZXZlbG9wbWVudCIhPT0icHJv ZHVjdGlvbiIpe3ZhbGlkYXRlRXZlbnREaXNwYXRjaGVzKGV2ZW50KX1pZihBcnJheS5pc0FycmF5 KGRpc3BhdGNoTGlzdGVuZXJzKSl7Zm9yKHZhciBpPTA7aTxkaXNwYXRjaExpc3RlbmVycy5sZW5n dGg7aSsrKXtpZihldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXticmVha31pZihkaXNwYXRj aExpc3RlbmVyc1tpXShldmVudCxkaXNwYXRjaEluc3RhbmNlc1tpXSkpe3JldHVybiBkaXNwYXRj aEluc3RhbmNlc1tpXX19fWVsc2UgaWYoZGlzcGF0Y2hMaXN0ZW5lcnMpe2lmKGRpc3BhdGNoTGlz dGVuZXJzKGV2ZW50LGRpc3BhdGNoSW5zdGFuY2VzKSl7cmV0dXJuIGRpc3BhdGNoSW5zdGFuY2Vz fX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBleGVjdXRlRGlzcGF0Y2hlc0luT3JkZXJTdG9wQXRUcnVl KGV2ZW50KXt2YXIgcmV0PWV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlclN0b3BBdFRydWVJbXBsKGV2 ZW50KTtldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXM9bnVsbDtldmVudC5fZGlzcGF0Y2hMaXN0ZW5l cnM9bnVsbDtyZXR1cm4gcmV0fWZ1bmN0aW9uIGV4ZWN1dGVEaXJlY3REaXNwYXRjaChldmVudCl7 aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7dmFsaWRhdGVFdmVudERpc3BhdGNoZXMo ZXZlbnQpfXZhciBkaXNwYXRjaExpc3RlbmVyPWV2ZW50Ll9kaXNwYXRjaExpc3RlbmVyczt2YXIg ZGlzcGF0Y2hJbnN0YW5jZT1ldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXM7ISFBcnJheS5pc0FycmF5 KGRpc3BhdGNoTGlzdGVuZXIpPyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/aW52YXJpYW50 KGZhbHNlLCJleGVjdXRlRGlyZWN0RGlzcGF0Y2goLi4uKTogSW52YWxpZCBgZXZlbnRgLiIpOl9w cm9kSW52YXJpYW50KCIxMDMiKTp2b2lkIDA7ZXZlbnQuY3VycmVudFRhcmdldD1kaXNwYXRjaExp c3RlbmVyP0V2ZW50UGx1Z2luVXRpbHMuZ2V0Tm9kZUZyb21JbnN0YW5jZShkaXNwYXRjaEluc3Rh bmNlKTpudWxsO3ZhciByZXM9ZGlzcGF0Y2hMaXN0ZW5lcj9kaXNwYXRjaExpc3RlbmVyKGV2ZW50 KTpudWxsO2V2ZW50LmN1cnJlbnRUYXJnZXQ9bnVsbDtldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnM9 bnVsbDtldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXM9bnVsbDtyZXR1cm4gcmVzfWZ1bmN0aW9uIGhh c0Rpc3BhdGNoZXMoZXZlbnQpe3JldHVybiEhZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzfXZhciBF dmVudFBsdWdpblV0aWxzPXtpc0VuZGlzaDppc0VuZGlzaCxpc01vdmVpc2g6aXNNb3ZlaXNoLGlz U3RhcnRpc2g6aXNTdGFydGlzaCxleGVjdXRlRGlyZWN0RGlzcGF0Y2g6ZXhlY3V0ZURpcmVjdERp c3BhdGNoLGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlcjpleGVjdXRlRGlzcGF0Y2hlc0luT3JkZXIs ZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyU3RvcEF0VHJ1ZTpleGVjdXRlRGlzcGF0Y2hlc0luT3Jk ZXJTdG9wQXRUcnVlLGhhc0Rpc3BhdGNoZXM6aGFzRGlzcGF0Y2hlcyxnZXRJbnN0YW5jZUZyb21O b2RlOmZ1bmN0aW9uKG5vZGUpe3JldHVybiBDb21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5v ZGUobm9kZSl9LGdldE5vZGVGcm9tSW5zdGFuY2U6ZnVuY3Rpb24obm9kZSl7cmV0dXJuIENvbXBv bmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShub2RlKX0saXNBbmNlc3RvcjpmdW5jdGlvbihh LGIpe3JldHVybiBUcmVlVHJhdmVyc2FsLmlzQW5jZXN0b3IoYSxiKX0sZ2V0TG93ZXN0Q29tbW9u QW5jZXN0b3I6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVHJlZVRyYXZlcnNhbC5nZXRMb3dlc3RDb21t b25BbmNlc3RvcihhLGIpfSxnZXRQYXJlbnRJbnN0YW5jZTpmdW5jdGlvbihpbnN0KXtyZXR1cm4g VHJlZVRyYXZlcnNhbC5nZXRQYXJlbnRJbnN0YW5jZShpbnN0KX0sdHJhdmVyc2VUd29QaGFzZTpm dW5jdGlvbih0YXJnZXQsZm4sYXJnKXtyZXR1cm4gVHJlZVRyYXZlcnNhbC50cmF2ZXJzZVR3b1Bo YXNlKHRhcmdldCxmbixhcmcpfSx0cmF2ZXJzZUVudGVyTGVhdmU6ZnVuY3Rpb24oZnJvbSx0byxm bixhcmdGcm9tLGFyZ1RvKXtyZXR1cm4gVHJlZVRyYXZlcnNhbC50cmF2ZXJzZUVudGVyTGVhdmUo ZnJvbSx0byxmbixhcmdGcm9tLGFyZ1RvKX0saW5qZWN0aW9uOmluamVjdGlvbn07bW9kdWxlLmV4 cG9ydHM9RXZlbnRQbHVnaW5VdGlsc30sezExNjoxMTYsMTQwOjE0MCwxNDc6MTQ3LDUwOjUwfV0s MTk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgRXZl bnRQbHVnaW5IdWI9X2RlcmVxXygxNik7dmFyIEV2ZW50UGx1Z2luVXRpbHM9X2RlcmVxXygxOCk7 dmFyIGFjY3VtdWxhdGVJbnRvPV9kZXJlcV8oOTUpO3ZhciBmb3JFYWNoQWNjdW11bGF0ZWQ9X2Rl cmVxXygxMDIpO3ZhciB3YXJuaW5nPV9kZXJlcV8oMTQ3KTt2YXIgZ2V0TGlzdGVuZXI9RXZlbnRQ bHVnaW5IdWIuZ2V0TGlzdGVuZXI7ZnVuY3Rpb24gbGlzdGVuZXJBdFBoYXNlKGluc3QsZXZlbnQs cHJvcGFnYXRpb25QaGFzZSl7dmFyIHJlZ2lzdHJhdGlvbk5hbWU9ZXZlbnQuZGlzcGF0Y2hDb25m aWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXNbcHJvcGFnYXRpb25QaGFzZV07cmV0dXJuIGdldExp c3RlbmVyKGluc3QscmVnaXN0cmF0aW9uTmFtZSl9ZnVuY3Rpb24gYWNjdW11bGF0ZURpcmVjdGlv bmFsRGlzcGF0Y2hlcyhpbnN0LHBoYXNlLGV2ZW50KXtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1 Y3Rpb24iKXsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmcoaW5zdCwiRGlzcGF0 Y2hpbmcgaW5zdCBtdXN0IG5vdCBiZSBudWxsIik6dm9pZCAwfXZhciBsaXN0ZW5lcj1saXN0ZW5l ckF0UGhhc2UoaW5zdCxldmVudCxwaGFzZSk7aWYobGlzdGVuZXIpe2V2ZW50Ll9kaXNwYXRjaExp c3RlbmVycz1hY2N1bXVsYXRlSW50byhldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnMsbGlzdGVuZXIp O2V2ZW50Ll9kaXNwYXRjaEluc3RhbmNlcz1hY2N1bXVsYXRlSW50byhldmVudC5fZGlzcGF0Y2hJ bnN0YW5jZXMsaW5zdCl9fWZ1bmN0aW9uIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXNTaW5n bGUoZXZlbnQpe2lmKGV2ZW50JiZldmVudC5kaXNwYXRjaENvbmZpZy5waGFzZWRSZWdpc3RyYXRp b25OYW1lcyl7RXZlbnRQbHVnaW5VdGlscy50cmF2ZXJzZVR3b1BoYXNlKGV2ZW50Ll90YXJnZXRJ bnN0LGFjY3VtdWxhdGVEaXJlY3Rpb25hbERpc3BhdGNoZXMsZXZlbnQpfX1mdW5jdGlvbiBhY2N1 bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzU2luZ2xlU2tpcFRhcmdldChldmVudCl7aWYoZXZlbnQm JmV2ZW50LmRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzKXt2YXIgdGFyZ2V0 SW5zdD1ldmVudC5fdGFyZ2V0SW5zdDt2YXIgcGFyZW50SW5zdD10YXJnZXRJbnN0P0V2ZW50UGx1 Z2luVXRpbHMuZ2V0UGFyZW50SW5zdGFuY2UodGFyZ2V0SW5zdCk6bnVsbDtFdmVudFBsdWdpblV0 aWxzLnRyYXZlcnNlVHdvUGhhc2UocGFyZW50SW5zdCxhY2N1bXVsYXRlRGlyZWN0aW9uYWxEaXNw YXRjaGVzLGV2ZW50KX19ZnVuY3Rpb24gYWNjdW11bGF0ZURpc3BhdGNoZXMoaW5zdCxpZ25vcmVk RGlyZWN0aW9uLGV2ZW50KXtpZihldmVudCYmZXZlbnQuZGlzcGF0Y2hDb25maWcucmVnaXN0cmF0 aW9uTmFtZSl7dmFyIHJlZ2lzdHJhdGlvbk5hbWU9ZXZlbnQuZGlzcGF0Y2hDb25maWcucmVnaXN0 cmF0aW9uTmFtZTt2YXIgbGlzdGVuZXI9Z2V0TGlzdGVuZXIoaW5zdCxyZWdpc3RyYXRpb25OYW1l KTtpZihsaXN0ZW5lcil7ZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzPWFjY3VtdWxhdGVJbnRvKGV2 ZW50Ll9kaXNwYXRjaExpc3RlbmVycyxsaXN0ZW5lcik7ZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2Vz PWFjY3VtdWxhdGVJbnRvKGV2ZW50Ll9kaXNwYXRjaEluc3RhbmNlcyxpbnN0KX19fWZ1bmN0aW9u IGFjY3VtdWxhdGVEaXJlY3REaXNwYXRjaGVzU2luZ2xlKGV2ZW50KXtpZihldmVudCYmZXZlbnQu ZGlzcGF0Y2hDb25maWcucmVnaXN0cmF0aW9uTmFtZSl7YWNjdW11bGF0ZURpc3BhdGNoZXMoZXZl bnQuX3RhcmdldEluc3QsbnVsbCxldmVudCl9fWZ1bmN0aW9uIGFjY3VtdWxhdGVUd29QaGFzZURp c3BhdGNoZXMoZXZlbnRzKXtmb3JFYWNoQWNjdW11bGF0ZWQoZXZlbnRzLGFjY3VtdWxhdGVUd29Q aGFzZURpc3BhdGNoZXNTaW5nbGUpfWZ1bmN0aW9uIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNo ZXNTa2lwVGFyZ2V0KGV2ZW50cyl7Zm9yRWFjaEFjY3VtdWxhdGVkKGV2ZW50cyxhY2N1bXVsYXRl VHdvUGhhc2VEaXNwYXRjaGVzU2luZ2xlU2tpcFRhcmdldCl9ZnVuY3Rpb24gYWNjdW11bGF0ZUVu dGVyTGVhdmVEaXNwYXRjaGVzKGxlYXZlLGVudGVyLGZyb20sdG8pe0V2ZW50UGx1Z2luVXRpbHMu dHJhdmVyc2VFbnRlckxlYXZlKGZyb20sdG8sYWNjdW11bGF0ZURpc3BhdGNoZXMsbGVhdmUsZW50 ZXIpfWZ1bmN0aW9uIGFjY3VtdWxhdGVEaXJlY3REaXNwYXRjaGVzKGV2ZW50cyl7Zm9yRWFjaEFj Y3VtdWxhdGVkKGV2ZW50cyxhY2N1bXVsYXRlRGlyZWN0RGlzcGF0Y2hlc1NpbmdsZSl9dmFyIEV2 ZW50UHJvcGFnYXRvcnM9e2FjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXM6YWNjdW11bGF0ZVR3 b1BoYXNlRGlzcGF0Y2hlcyxhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzU2tpcFRhcmdldDph Y2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzU2tpcFRhcmdldCxhY2N1bXVsYXRlRGlyZWN0RGlz cGF0Y2hlczphY2N1bXVsYXRlRGlyZWN0RGlzcGF0Y2hlcyxhY2N1bXVsYXRlRW50ZXJMZWF2ZURp c3BhdGNoZXM6YWNjdW11bGF0ZUVudGVyTGVhdmVEaXNwYXRjaGVzfTttb2R1bGUuZXhwb3J0cz1F dmVudFByb3BhZ2F0b3JzfSx7MTAyOjEwMiwxNDc6MTQ3LDE2OjE2LDE4OjE4LDk1Ojk1fV0sMjA6 W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgX2Fzc2ln bj1fZGVyZXFfKDE0OCk7dmFyIFBvb2xlZENsYXNzPV9kZXJlcV8oMjQpO3ZhciBnZXRUZXh0Q29u dGVudEFjY2Vzc29yPV9kZXJlcV8oMTEwKTtmdW5jdGlvbiBGYWxsYmFja0NvbXBvc2l0aW9uU3Rh dGUocm9vdCl7dGhpcy5fcm9vdD1yb290O3RoaXMuX3N0YXJ0VGV4dD10aGlzLmdldFRleHQoKTt0 aGlzLl9mYWxsYmFja1RleHQ9bnVsbH1fYXNzaWduKEZhbGxiYWNrQ29tcG9zaXRpb25TdGF0ZS5w cm90b3R5cGUse2Rlc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLl9yb290PW51bGw7dGhpcy5fc3Rh cnRUZXh0PW51bGw7dGhpcy5fZmFsbGJhY2tUZXh0PW51bGx9LGdldFRleHQ6ZnVuY3Rpb24oKXtp ZigidmFsdWUiaW4gdGhpcy5fcm9vdCl7cmV0dXJuIHRoaXMuX3Jvb3QudmFsdWV9cmV0dXJuIHRo aXMuX3Jvb3RbZ2V0VGV4dENvbnRlbnRBY2Nlc3NvcigpXX0sZ2V0RGF0YTpmdW5jdGlvbigpe2lm KHRoaXMuX2ZhbGxiYWNrVGV4dCl7cmV0dXJuIHRoaXMuX2ZhbGxiYWNrVGV4dH12YXIgc3RhcnQ7 dmFyIHN0YXJ0VmFsdWU9dGhpcy5fc3RhcnRUZXh0O3ZhciBzdGFydExlbmd0aD1zdGFydFZhbHVl Lmxlbmd0aDt2YXIgZW5kO3ZhciBlbmRWYWx1ZT10aGlzLmdldFRleHQoKTt2YXIgZW5kTGVuZ3Ro PWVuZFZhbHVlLmxlbmd0aDtmb3Ioc3RhcnQ9MDtzdGFydDxzdGFydExlbmd0aDtzdGFydCsrKXtp ZihzdGFydFZhbHVlW3N0YXJ0XSE9PWVuZFZhbHVlW3N0YXJ0XSl7YnJlYWt9fXZhciBtaW5FbmQ9 c3RhcnRMZW5ndGgtc3RhcnQ7Zm9yKGVuZD0xO2VuZDw9bWluRW5kO2VuZCsrKXtpZihzdGFydFZh bHVlW3N0YXJ0TGVuZ3RoLWVuZF0hPT1lbmRWYWx1ZVtlbmRMZW5ndGgtZW5kXSl7YnJlYWt9fXZh ciBzbGljZVRhaWw9ZW5kPjE/MS1lbmQ6dW5kZWZpbmVkO3RoaXMuX2ZhbGxiYWNrVGV4dD1lbmRW YWx1ZS5zbGljZShzdGFydCxzbGljZVRhaWwpO3JldHVybiB0aGlzLl9mYWxsYmFja1RleHR9fSk7 UG9vbGVkQ2xhc3MuYWRkUG9vbGluZ1RvKEZhbGxiYWNrQ29tcG9zaXRpb25TdGF0ZSk7bW9kdWxl LmV4cG9ydHM9RmFsbGJhY2tDb21wb3NpdGlvblN0YXRlfSx7MTEwOjExMCwxNDg6MTQ4LDI0OjI0 fV0sMjE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIg RE9NUHJvcGVydHk9X2RlcmVxXygxMSk7dmFyIE1VU1RfVVNFX1BST1BFUlRZPURPTVByb3BlcnR5 LmluamVjdGlvbi5NVVNUX1VTRV9QUk9QRVJUWTt2YXIgSEFTX0JPT0xFQU5fVkFMVUU9RE9NUHJv cGVydHkuaW5qZWN0aW9uLkhBU19CT09MRUFOX1ZBTFVFO3ZhciBIQVNfTlVNRVJJQ19WQUxVRT1E T01Qcm9wZXJ0eS5pbmplY3Rpb24uSEFTX05VTUVSSUNfVkFMVUU7dmFyIEhBU19QT1NJVElWRV9O VU1FUklDX1ZBTFVFPURPTVByb3BlcnR5LmluamVjdGlvbi5IQVNfUE9TSVRJVkVfTlVNRVJJQ19W QUxVRTt2YXIgSEFTX09WRVJMT0FERURfQk9PTEVBTl9WQUxVRT1ET01Qcm9wZXJ0eS5pbmplY3Rp b24uSEFTX09WRVJMT0FERURfQk9PTEVBTl9WQUxVRTt2YXIgSFRNTERPTVByb3BlcnR5Q29uZmln PXtpc0N1c3RvbUF0dHJpYnV0ZTpSZWdFeHAucHJvdG90eXBlLnRlc3QuYmluZChuZXcgUmVnRXhw KCJeKGRhdGF8YXJpYSktWyIrRE9NUHJvcGVydHkuQVRUUklCVVRFX05BTUVfQ0hBUisiXSokIikp LFByb3BlcnRpZXM6e2FjY2VwdDowLGFjY2VwdENoYXJzZXQ6MCxhY2Nlc3NLZXk6MCxhY3Rpb246 MCxhbGxvd0Z1bGxTY3JlZW46SEFTX0JPT0xFQU5fVkFMVUUsYWxsb3dUcmFuc3BhcmVuY3k6MCxh bHQ6MCxhczowLGFzeW5jOkhBU19CT09MRUFOX1ZBTFVFLGF1dG9Db21wbGV0ZTowLGF1dG9QbGF5 OkhBU19CT09MRUFOX1ZBTFVFLGNhcHR1cmU6SEFTX0JPT0xFQU5fVkFMVUUsY2VsbFBhZGRpbmc6 MCxjZWxsU3BhY2luZzowLGNoYXJTZXQ6MCxjaGFsbGVuZ2U6MCxjaGVja2VkOk1VU1RfVVNFX1BS T1BFUlRZfEhBU19CT09MRUFOX1ZBTFVFLGNpdGU6MCxjbGFzc0lEOjAsY2xhc3NOYW1lOjAsY29s czpIQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRSxjb2xTcGFuOjAsY29udGVudDowLGNvbnRlbnRF ZGl0YWJsZTowLGNvbnRleHRNZW51OjAsY29udHJvbHM6SEFTX0JPT0xFQU5fVkFMVUUsY29vcmRz OjAsY3Jvc3NPcmlnaW46MCxkYXRhOjAsZGF0ZVRpbWU6MCxkZWZhdWx0OkhBU19CT09MRUFOX1ZB TFVFLGRlZmVyOkhBU19CT09MRUFOX1ZBTFVFLGRpcjowLGRpc2FibGVkOkhBU19CT09MRUFOX1ZB TFVFLGRvd25sb2FkOkhBU19PVkVSTE9BREVEX0JPT0xFQU5fVkFMVUUsZHJhZ2dhYmxlOjAsZW5j VHlwZTowLGZvcm06MCxmb3JtQWN0aW9uOjAsZm9ybUVuY1R5cGU6MCxmb3JtTWV0aG9kOjAsZm9y bU5vVmFsaWRhdGU6SEFTX0JPT0xFQU5fVkFMVUUsZm9ybVRhcmdldDowLGZyYW1lQm9yZGVyOjAs aGVhZGVyczowLGhlaWdodDowLGhpZGRlbjpIQVNfQk9PTEVBTl9WQUxVRSxoaWdoOjAsaHJlZjow LGhyZWZMYW5nOjAsaHRtbEZvcjowLGh0dHBFcXVpdjowLGljb246MCxpZDowLGlucHV0TW9kZTow LGludGVncml0eTowLGlzOjAsa2V5UGFyYW1zOjAsa2V5VHlwZTowLGtpbmQ6MCxsYWJlbDowLGxh bmc6MCxsaXN0OjAsbG9vcDpIQVNfQk9PTEVBTl9WQUxVRSxsb3c6MCxtYW5pZmVzdDowLG1hcmdp bkhlaWdodDowLG1hcmdpbldpZHRoOjAsbWF4OjAsbWF4TGVuZ3RoOjAsbWVkaWE6MCxtZWRpYUdy b3VwOjAsbWV0aG9kOjAsbWluOjAsbWluTGVuZ3RoOjAsbXVsdGlwbGU6TVVTVF9VU0VfUFJPUEVS VFl8SEFTX0JPT0xFQU5fVkFMVUUsbXV0ZWQ6TVVTVF9VU0VfUFJPUEVSVFl8SEFTX0JPT0xFQU5f VkFMVUUsbmFtZTowLG5vbmNlOjAsbm9WYWxpZGF0ZTpIQVNfQk9PTEVBTl9WQUxVRSxvcGVuOkhB U19CT09MRUFOX1ZBTFVFLG9wdGltdW06MCxwYXR0ZXJuOjAscGxhY2Vob2xkZXI6MCxwbGF5c0lu bGluZTpIQVNfQk9PTEVBTl9WQUxVRSxwb3N0ZXI6MCxwcmVsb2FkOjAscHJvZmlsZTowLHJhZGlv R3JvdXA6MCxyZWFkT25seTpIQVNfQk9PTEVBTl9WQUxVRSxyZWZlcnJlclBvbGljeTowLHJlbDow LHJlcXVpcmVkOkhBU19CT09MRUFOX1ZBTFVFLHJldmVyc2VkOkhBU19CT09MRUFOX1ZBTFVFLHJv bGU6MCxyb3dzOkhBU19QT1NJVElWRV9OVU1FUklDX1ZBTFVFLHJvd1NwYW46SEFTX05VTUVSSUNf VkFMVUUsc2FuZGJveDowLHNjb3BlOjAsc2NvcGVkOkhBU19CT09MRUFOX1ZBTFVFLHNjcm9sbGlu ZzowLHNlYW1sZXNzOkhBU19CT09MRUFOX1ZBTFVFLHNlbGVjdGVkOk1VU1RfVVNFX1BST1BFUlRZ fEhBU19CT09MRUFOX1ZBTFVFLHNoYXBlOjAsc2l6ZTpIQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxV RSxzaXplczowLHNwYW46SEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUUsc3BlbGxDaGVjazowLHNy YzowLHNyY0RvYzowLHNyY0xhbmc6MCxzcmNTZXQ6MCxzdGFydDpIQVNfTlVNRVJJQ19WQUxVRSxz dGVwOjAsc3R5bGU6MCxzdW1tYXJ5OjAsdGFiSW5kZXg6MCx0YXJnZXQ6MCx0aXRsZTowLHR5cGU6 MCx1c2VNYXA6MCx2YWx1ZTowLHdpZHRoOjAsd21vZGU6MCx3cmFwOjAsYWJvdXQ6MCxkYXRhdHlw ZTowLGlubGlzdDowLHByZWZpeDowLHByb3BlcnR5OjAscmVzb3VyY2U6MCx0eXBlb2Y6MCx2b2Nh YjowLGF1dG9DYXBpdGFsaXplOjAsYXV0b0NvcnJlY3Q6MCxhdXRvU2F2ZTowLGNvbG9yOjAsaXRl bVByb3A6MCxpdGVtU2NvcGU6SEFTX0JPT0xFQU5fVkFMVUUsaXRlbVR5cGU6MCxpdGVtSUQ6MCxp dGVtUmVmOjAscmVzdWx0czowLHNlY3VyaXR5OjAsdW5zZWxlY3RhYmxlOjB9LERPTUF0dHJpYnV0 ZU5hbWVzOnthY2NlcHRDaGFyc2V0OiJhY2NlcHQtY2hhcnNldCIsY2xhc3NOYW1lOiJjbGFzcyIs aHRtbEZvcjoiZm9yIixodHRwRXF1aXY6Imh0dHAtZXF1aXYifSxET01Qcm9wZXJ0eU5hbWVzOnt9 fTttb2R1bGUuZXhwb3J0cz1IVE1MRE9NUHJvcGVydHlDb25maWd9LHsxMToxMX1dLDIyOltmdW5j dGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZXNjYXBl KGtleSl7dmFyIGVzY2FwZVJlZ2V4PS9bPTpdL2c7dmFyIGVzY2FwZXJMb29rdXA9eyI9IjoiPTAi LCI6IjoiPTIifTt2YXIgZXNjYXBlZFN0cmluZz0oIiIra2V5KS5yZXBsYWNlKGVzY2FwZVJlZ2V4 LGZ1bmN0aW9uKG1hdGNoKXtyZXR1cm4gZXNjYXBlckxvb2t1cFttYXRjaF19KTtyZXR1cm4iJCIr ZXNjYXBlZFN0cmluZ31mdW5jdGlvbiB1bmVzY2FwZShrZXkpe3ZhciB1bmVzY2FwZVJlZ2V4PS8o PTB8PTIpL2c7dmFyIHVuZXNjYXBlckxvb2t1cD17Ij0wIjoiPSIsIj0yIjoiOiJ9O3ZhciBrZXlT dWJzdHJpbmc9a2V5WzBdPT09Ii4iJiZrZXlbMV09PT0iJCI/a2V5LnN1YnN0cmluZygyKTprZXku c3Vic3RyaW5nKDEpO3JldHVybigiIitrZXlTdWJzdHJpbmcpLnJlcGxhY2UodW5lc2NhcGVSZWdl eCxmdW5jdGlvbihtYXRjaCl7cmV0dXJuIHVuZXNjYXBlckxvb2t1cFttYXRjaF19KX12YXIgS2V5 RXNjYXBlVXRpbHM9e2VzY2FwZTplc2NhcGUsdW5lc2NhcGU6dW5lc2NhcGV9O21vZHVsZS5leHBv cnRzPUtleUVzY2FwZVV0aWxzfSx7fV0sMjM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9y dHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgX3Byb2RJbnZhcmlhbnQ9X2RlcmVxXygxMTYpO3ZhciBSZWFj dD1fZGVyZXFfKDEyNCk7dmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0PV9kZXJlcV8oNjYpO3ZhciBp bnZhcmlhbnQ9X2RlcmVxXygxNDApO3ZhciB3YXJuaW5nPV9kZXJlcV8oMTQ3KTt2YXIgaGFzUmVh ZE9ubHlWYWx1ZT17YnV0dG9uOnRydWUsY2hlY2tib3g6dHJ1ZSxpbWFnZTp0cnVlLGhpZGRlbjp0 cnVlLHJhZGlvOnRydWUscmVzZXQ6dHJ1ZSxzdWJtaXQ6dHJ1ZX07ZnVuY3Rpb24gX2Fzc2VydFNp bmdsZUxpbmsoaW5wdXRQcm9wcyl7IShpbnB1dFByb3BzLmNoZWNrZWRMaW5rPT1udWxsfHxpbnB1 dFByb3BzLnZhbHVlTGluaz09bnVsbCk/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZh cmlhbnQoZmFsc2UsIkNhbm5vdCBwcm92aWRlIGEgY2hlY2tlZExpbmsgYW5kIGEgdmFsdWVMaW5r LiBJZiB5b3Ugd2FudCB0byB1c2UgY2hlY2tlZExpbmssIHlvdSBwcm9iYWJseSBkb24ndCB3YW50 IHRvIHVzZSB2YWx1ZUxpbmsgYW5kIHZpY2UgdmVyc2EuIik6X3Byb2RJbnZhcmlhbnQoIjg3Iik6 dm9pZCAwfWZ1bmN0aW9uIF9hc3NlcnRWYWx1ZUxpbmsoaW5wdXRQcm9wcyl7X2Fzc2VydFNpbmds ZUxpbmsoaW5wdXRQcm9wcyk7IShpbnB1dFByb3BzLnZhbHVlPT1udWxsJiZpbnB1dFByb3BzLm9u Q2hhbmdlPT1udWxsKT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxz ZSwiQ2Fubm90IHByb3ZpZGUgYSB2YWx1ZUxpbmsgYW5kIGEgdmFsdWUgb3Igb25DaGFuZ2UgZXZl bnQuIElmIHlvdSB3YW50IHRvIHVzZSB2YWx1ZSBvciBvbkNoYW5nZSwgeW91IHByb2JhYmx5IGRv bid0IHdhbnQgdG8gdXNlIHZhbHVlTGluay4iKTpfcHJvZEludmFyaWFudCgiODgiKTp2b2lkIDB9 ZnVuY3Rpb24gX2Fzc2VydENoZWNrZWRMaW5rKGlucHV0UHJvcHMpe19hc3NlcnRTaW5nbGVMaW5r KGlucHV0UHJvcHMpOyEoaW5wdXRQcm9wcy5jaGVja2VkPT1udWxsJiZpbnB1dFByb3BzLm9uQ2hh bmdlPT1udWxsKT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwi Q2Fubm90IHByb3ZpZGUgYSBjaGVja2VkTGluayBhbmQgYSBjaGVja2VkIHByb3BlcnR5IG9yIG9u Q2hhbmdlIGV2ZW50LiBJZiB5b3Ugd2FudCB0byB1c2UgY2hlY2tlZCBvciBvbkNoYW5nZSwgeW91 IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gdXNlIGNoZWNrZWRMaW5rIik6X3Byb2RJbnZhcmlhbnQo Ijg5Iik6dm9pZCAwfXZhciBwcm9wVHlwZXM9e3ZhbHVlOmZ1bmN0aW9uKHByb3BzLHByb3BOYW1l LGNvbXBvbmVudE5hbWUpe2lmKCFwcm9wc1twcm9wTmFtZV18fGhhc1JlYWRPbmx5VmFsdWVbcHJv cHMudHlwZV18fHByb3BzLm9uQ2hhbmdlfHxwcm9wcy5yZWFkT25seXx8cHJvcHMuZGlzYWJsZWQp e3JldHVybiBudWxsfXJldHVybiBuZXcgRXJyb3IoIllvdSBwcm92aWRlZCBhIGB2YWx1ZWAgcHJv cCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiAiKyJgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMg d2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmICIrInRoZSBmaWVsZCBzaG91bGQgYmUg bXV0YWJsZSB1c2UgYGRlZmF1bHRWYWx1ZWAuIE90aGVyd2lzZSwgIisic2V0IGVpdGhlciBgb25D aGFuZ2VgIG9yIGByZWFkT25seWAuIil9LGNoZWNrZWQ6ZnVuY3Rpb24ocHJvcHMscHJvcE5hbWUs Y29tcG9uZW50TmFtZSl7aWYoIXByb3BzW3Byb3BOYW1lXXx8cHJvcHMub25DaGFuZ2V8fHByb3Bz LnJlYWRPbmx5fHxwcm9wcy5kaXNhYmxlZCl7cmV0dXJuIG51bGx9cmV0dXJuIG5ldyBFcnJvcigi WW91IHByb3ZpZGVkIGEgYGNoZWNrZWRgIHByb3AgdG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4g IisiYG9uQ2hhbmdlYCBoYW5kbGVyLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxk LiBJZiAiKyJ0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGBkZWZhdWx0Q2hlY2tlZGAu IE90aGVyd2lzZSwgIisic2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuIil9LG9u Q2hhbmdlOlJlYWN0LlByb3BUeXBlcy5mdW5jfTt2YXIgbG9nZ2VkVHlwZUZhaWx1cmVzPXt9O2Z1 bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShvd25lcil7aWYob3duZXIpe3ZhciBu YW1lPW93bmVyLmdldE5hbWUoKTtpZihuYW1lKXtyZXR1cm4iIENoZWNrIHRoZSByZW5kZXIgbWV0 aG9kIG9mIGAiK25hbWUrImAuIn19cmV0dXJuIiJ9dmFyIExpbmtlZFZhbHVlVXRpbHM9e2NoZWNr UHJvcFR5cGVzOmZ1bmN0aW9uKHRhZ05hbWUscHJvcHMsb3duZXIpe2Zvcih2YXIgcHJvcE5hbWUg aW4gcHJvcFR5cGVzKXtpZihwcm9wVHlwZXMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKXt2YXIg ZXJyb3I9cHJvcFR5cGVzW3Byb3BOYW1lXShwcm9wcyxwcm9wTmFtZSx0YWdOYW1lLCJwcm9wIixu dWxsLFJlYWN0UHJvcFR5cGVzU2VjcmV0KX1pZihlcnJvciBpbnN0YW5jZW9mIEVycm9yJiYhKGVy cm9yLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSl7bG9nZ2VkVHlwZUZhaWx1cmVzW2Vy cm9yLm1lc3NhZ2VdPXRydWU7dmFyIGFkZGVuZHVtPWdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1 bShvd25lcik7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKGZhbHNlLCJGYWls ZWQgZm9ybSBwcm9wVHlwZTogJXMlcyIsZXJyb3IubWVzc2FnZSxhZGRlbmR1bSk6dm9pZCAwfX19 LGdldFZhbHVlOmZ1bmN0aW9uKGlucHV0UHJvcHMpe2lmKGlucHV0UHJvcHMudmFsdWVMaW5rKXtf YXNzZXJ0VmFsdWVMaW5rKGlucHV0UHJvcHMpO3JldHVybiBpbnB1dFByb3BzLnZhbHVlTGluay52 YWx1ZX1yZXR1cm4gaW5wdXRQcm9wcy52YWx1ZX0sZ2V0Q2hlY2tlZDpmdW5jdGlvbihpbnB1dFBy b3BzKXtpZihpbnB1dFByb3BzLmNoZWNrZWRMaW5rKXtfYXNzZXJ0Q2hlY2tlZExpbmsoaW5wdXRQ cm9wcyk7cmV0dXJuIGlucHV0UHJvcHMuY2hlY2tlZExpbmsudmFsdWV9cmV0dXJuIGlucHV0UHJv cHMuY2hlY2tlZH0sZXhlY3V0ZU9uQ2hhbmdlOmZ1bmN0aW9uKGlucHV0UHJvcHMsZXZlbnQpe2lm KGlucHV0UHJvcHMudmFsdWVMaW5rKXtfYXNzZXJ0VmFsdWVMaW5rKGlucHV0UHJvcHMpO3JldHVy biBpbnB1dFByb3BzLnZhbHVlTGluay5yZXF1ZXN0Q2hhbmdlKGV2ZW50LnRhcmdldC52YWx1ZSl9 ZWxzZSBpZihpbnB1dFByb3BzLmNoZWNrZWRMaW5rKXtfYXNzZXJ0Q2hlY2tlZExpbmsoaW5wdXRQ cm9wcyk7cmV0dXJuIGlucHV0UHJvcHMuY2hlY2tlZExpbmsucmVxdWVzdENoYW5nZShldmVudC50 YXJnZXQuY2hlY2tlZCl9ZWxzZSBpZihpbnB1dFByb3BzLm9uQ2hhbmdlKXtyZXR1cm4gaW5wdXRQ cm9wcy5vbkNoYW5nZS5jYWxsKHVuZGVmaW5lZCxldmVudCl9fX07bW9kdWxlLmV4cG9ydHM9TGlu a2VkVmFsdWVVdGlsc30sezExNjoxMTYsMTI0OjEyNCwxNDA6MTQwLDE0NzoxNDcsNjY6NjZ9XSwy NDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBfcHJv ZEludmFyaWFudD1fZGVyZXFfKDExNik7dmFyIGludmFyaWFudD1fZGVyZXFfKDE0MCk7dmFyIG9u ZUFyZ3VtZW50UG9vbGVyPWZ1bmN0aW9uKGNvcHlGaWVsZHNGcm9tKXt2YXIgS2xhc3M9dGhpcztp ZihLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoKXt2YXIgaW5zdGFuY2U9S2xhc3MuaW5zdGFuY2VQ b29sLnBvcCgpO0tsYXNzLmNhbGwoaW5zdGFuY2UsY29weUZpZWxkc0Zyb20pO3JldHVybiBpbnN0 YW5jZX1lbHNle3JldHVybiBuZXcgS2xhc3MoY29weUZpZWxkc0Zyb20pfX07dmFyIHR3b0FyZ3Vt ZW50UG9vbGVyPWZ1bmN0aW9uKGExLGEyKXt2YXIgS2xhc3M9dGhpcztpZihLbGFzcy5pbnN0YW5j ZVBvb2wubGVuZ3RoKXt2YXIgaW5zdGFuY2U9S2xhc3MuaW5zdGFuY2VQb29sLnBvcCgpO0tsYXNz LmNhbGwoaW5zdGFuY2UsYTEsYTIpO3JldHVybiBpbnN0YW5jZX1lbHNle3JldHVybiBuZXcgS2xh c3MoYTEsYTIpfX07dmFyIHRocmVlQXJndW1lbnRQb29sZXI9ZnVuY3Rpb24oYTEsYTIsYTMpe3Zh ciBLbGFzcz10aGlzO2lmKEtsYXNzLmluc3RhbmNlUG9vbC5sZW5ndGgpe3ZhciBpbnN0YW5jZT1L bGFzcy5pbnN0YW5jZVBvb2wucG9wKCk7S2xhc3MuY2FsbChpbnN0YW5jZSxhMSxhMixhMyk7cmV0 dXJuIGluc3RhbmNlfWVsc2V7cmV0dXJuIG5ldyBLbGFzcyhhMSxhMixhMyl9fTt2YXIgZm91ckFy Z3VtZW50UG9vbGVyPWZ1bmN0aW9uKGExLGEyLGEzLGE0KXt2YXIgS2xhc3M9dGhpcztpZihLbGFz cy5pbnN0YW5jZVBvb2wubGVuZ3RoKXt2YXIgaW5zdGFuY2U9S2xhc3MuaW5zdGFuY2VQb29sLnBv cCgpO0tsYXNzLmNhbGwoaW5zdGFuY2UsYTEsYTIsYTMsYTQpO3JldHVybiBpbnN0YW5jZX1lbHNl e3JldHVybiBuZXcgS2xhc3MoYTEsYTIsYTMsYTQpfX07dmFyIHN0YW5kYXJkUmVsZWFzZXI9ZnVu Y3Rpb24oaW5zdGFuY2Upe3ZhciBLbGFzcz10aGlzOyEoaW5zdGFuY2UgaW5zdGFuY2VvZiBLbGFz cyk/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsIlRyeWluZyB0 byByZWxlYXNlIGFuIGluc3RhbmNlIGludG8gYSBwb29sIG9mIGEgZGlmZmVyZW50IHR5cGUuIik6 X3Byb2RJbnZhcmlhbnQoIjI1Iik6dm9pZCAwO2luc3RhbmNlLmRlc3RydWN0b3IoKTtpZihLbGFz cy5pbnN0YW5jZVBvb2wubGVuZ3RoPEtsYXNzLnBvb2xTaXplKXtLbGFzcy5pbnN0YW5jZVBvb2wu cHVzaChpbnN0YW5jZSl9fTt2YXIgREVGQVVMVF9QT09MX1NJWkU9MTA7dmFyIERFRkFVTFRfUE9P TEVSPW9uZUFyZ3VtZW50UG9vbGVyO3ZhciBhZGRQb29saW5nVG89ZnVuY3Rpb24oQ29weUNvbnN0 cnVjdG9yLHBvb2xlcil7dmFyIE5ld0tsYXNzPUNvcHlDb25zdHJ1Y3RvcjtOZXdLbGFzcy5pbnN0 YW5jZVBvb2w9W107TmV3S2xhc3MuZ2V0UG9vbGVkPXBvb2xlcnx8REVGQVVMVF9QT09MRVI7aWYo IU5ld0tsYXNzLnBvb2xTaXplKXtOZXdLbGFzcy5wb29sU2l6ZT1ERUZBVUxUX1BPT0xfU0laRX1O ZXdLbGFzcy5yZWxlYXNlPXN0YW5kYXJkUmVsZWFzZXI7cmV0dXJuIE5ld0tsYXNzfTt2YXIgUG9v bGVkQ2xhc3M9e2FkZFBvb2xpbmdUbzphZGRQb29saW5nVG8sb25lQXJndW1lbnRQb29sZXI6b25l QXJndW1lbnRQb29sZXIsdHdvQXJndW1lbnRQb29sZXI6dHdvQXJndW1lbnRQb29sZXIsdGhyZWVB cmd1bWVudFBvb2xlcjp0aHJlZUFyZ3VtZW50UG9vbGVyLGZvdXJBcmd1bWVudFBvb2xlcjpmb3Vy QXJndW1lbnRQb29sZXJ9O21vZHVsZS5leHBvcnRzPVBvb2xlZENsYXNzfSx7MTE2OjExNiwxNDA6 MTQwfV0sMjU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2 YXIgX2Fzc2lnbj1fZGVyZXFfKDE0OCk7dmFyIEV2ZW50UGx1Z2luUmVnaXN0cnk9X2RlcmVxXygx Nyk7dmFyIFJlYWN0RXZlbnRFbWl0dGVyTWl4aW49X2RlcmVxXyg1MSk7dmFyIFZpZXdwb3J0TWV0 cmljcz1fZGVyZXFfKDk0KTt2YXIgZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWU9X2RlcmVxXygx MTEpO3ZhciBpc0V2ZW50U3VwcG9ydGVkPV9kZXJlcV8oMTEzKTt2YXIgaGFzRXZlbnRQYWdlWFk7 dmFyIGFscmVhZHlMaXN0ZW5pbmdUbz17fTt2YXIgaXNNb25pdG9yaW5nU2Nyb2xsVmFsdWU9ZmFs c2U7dmFyIHJlYWN0VG9wTGlzdGVuZXJzQ291bnRlcj0wO3ZhciB0b3BFdmVudE1hcHBpbmc9e3Rv cEFib3J0OiJhYm9ydCIsdG9wQW5pbWF0aW9uRW5kOmdldFZlbmRvclByZWZpeGVkRXZlbnROYW1l KCJhbmltYXRpb25lbmQiKXx8ImFuaW1hdGlvbmVuZCIsdG9wQW5pbWF0aW9uSXRlcmF0aW9uOmdl dFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCJhbmltYXRpb25pdGVyYXRpb24iKXx8ImFuaW1hdGlv bml0ZXJhdGlvbiIsdG9wQW5pbWF0aW9uU3RhcnQ6Z2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUo ImFuaW1hdGlvbnN0YXJ0Iil8fCJhbmltYXRpb25zdGFydCIsdG9wQmx1cjoiYmx1ciIsdG9wQ2Fu UGxheToiY2FucGxheSIsdG9wQ2FuUGxheVRocm91Z2g6ImNhbnBsYXl0aHJvdWdoIix0b3BDaGFu Z2U6ImNoYW5nZSIsdG9wQ2xpY2s6ImNsaWNrIix0b3BDb21wb3NpdGlvbkVuZDoiY29tcG9zaXRp b25lbmQiLHRvcENvbXBvc2l0aW9uU3RhcnQ6ImNvbXBvc2l0aW9uc3RhcnQiLHRvcENvbXBvc2l0 aW9uVXBkYXRlOiJjb21wb3NpdGlvbnVwZGF0ZSIsdG9wQ29udGV4dE1lbnU6ImNvbnRleHRtZW51 Iix0b3BDb3B5OiJjb3B5Iix0b3BDdXQ6ImN1dCIsdG9wRG91YmxlQ2xpY2s6ImRibGNsaWNrIix0 b3BEcmFnOiJkcmFnIix0b3BEcmFnRW5kOiJkcmFnZW5kIix0b3BEcmFnRW50ZXI6ImRyYWdlbnRl ciIsdG9wRHJhZ0V4aXQ6ImRyYWdleGl0Iix0b3BEcmFnTGVhdmU6ImRyYWdsZWF2ZSIsdG9wRHJh Z092ZXI6ImRyYWdvdmVyIix0b3BEcmFnU3RhcnQ6ImRyYWdzdGFydCIsdG9wRHJvcDoiZHJvcCIs dG9wRHVyYXRpb25DaGFuZ2U6ImR1cmF0aW9uY2hhbmdlIix0b3BFbXB0aWVkOiJlbXB0aWVkIix0 b3BFbmNyeXB0ZWQ6ImVuY3J5cHRlZCIsdG9wRW5kZWQ6ImVuZGVkIix0b3BFcnJvcjoiZXJyb3Ii LHRvcEZvY3VzOiJmb2N1cyIsdG9wSW5wdXQ6ImlucHV0Iix0b3BLZXlEb3duOiJrZXlkb3duIix0 b3BLZXlQcmVzczoia2V5cHJlc3MiLHRvcEtleVVwOiJrZXl1cCIsdG9wTG9hZGVkRGF0YToibG9h ZGVkZGF0YSIsdG9wTG9hZGVkTWV0YWRhdGE6ImxvYWRlZG1ldGFkYXRhIix0b3BMb2FkU3RhcnQ6 ImxvYWRzdGFydCIsdG9wTW91c2VEb3duOiJtb3VzZWRvd24iLHRvcE1vdXNlTW92ZToibW91c2Vt b3ZlIix0b3BNb3VzZU91dDoibW91c2VvdXQiLHRvcE1vdXNlT3ZlcjoibW91c2VvdmVyIix0b3BN b3VzZVVwOiJtb3VzZXVwIix0b3BQYXN0ZToicGFzdGUiLHRvcFBhdXNlOiJwYXVzZSIsdG9wUGxh eToicGxheSIsdG9wUGxheWluZzoicGxheWluZyIsdG9wUHJvZ3Jlc3M6InByb2dyZXNzIix0b3BS YXRlQ2hhbmdlOiJyYXRlY2hhbmdlIix0b3BTY3JvbGw6InNjcm9sbCIsdG9wU2Vla2VkOiJzZWVr ZWQiLHRvcFNlZWtpbmc6InNlZWtpbmciLHRvcFNlbGVjdGlvbkNoYW5nZToic2VsZWN0aW9uY2hh bmdlIix0b3BTdGFsbGVkOiJzdGFsbGVkIix0b3BTdXNwZW5kOiJzdXNwZW5kIix0b3BUZXh0SW5w dXQ6InRleHRJbnB1dCIsdG9wVGltZVVwZGF0ZToidGltZXVwZGF0ZSIsdG9wVG91Y2hDYW5jZWw6 InRvdWNoY2FuY2VsIix0b3BUb3VjaEVuZDoidG91Y2hlbmQiLHRvcFRvdWNoTW92ZToidG91Y2ht b3ZlIix0b3BUb3VjaFN0YXJ0OiJ0b3VjaHN0YXJ0Iix0b3BUcmFuc2l0aW9uRW5kOmdldFZlbmRv clByZWZpeGVkRXZlbnROYW1lKCJ0cmFuc2l0aW9uZW5kIil8fCJ0cmFuc2l0aW9uZW5kIix0b3BW b2x1bWVDaGFuZ2U6InZvbHVtZWNoYW5nZSIsdG9wV2FpdGluZzoid2FpdGluZyIsdG9wV2hlZWw6 IndoZWVsIn07dmFyIHRvcExpc3RlbmVyc0lES2V5PSJfcmVhY3RMaXN0ZW5lcnNJRCIrU3RyaW5n KE1hdGgucmFuZG9tKCkpLnNsaWNlKDIpO2Z1bmN0aW9uIGdldExpc3RlbmluZ0ZvckRvY3VtZW50 KG1vdW50QXQpe2lmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW91bnRB dCx0b3BMaXN0ZW5lcnNJREtleSkpe21vdW50QXRbdG9wTGlzdGVuZXJzSURLZXldPXJlYWN0VG9w TGlzdGVuZXJzQ291bnRlcisrO2FscmVhZHlMaXN0ZW5pbmdUb1ttb3VudEF0W3RvcExpc3RlbmVy c0lES2V5XV09e319cmV0dXJuIGFscmVhZHlMaXN0ZW5pbmdUb1ttb3VudEF0W3RvcExpc3RlbmVy c0lES2V5XV19dmFyIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlcj1fYXNzaWduKHt9LFJlYWN0RXZl bnRFbWl0dGVyTWl4aW4se1JlYWN0RXZlbnRMaXN0ZW5lcjpudWxsLGluamVjdGlvbjp7aW5qZWN0 UmVhY3RFdmVudExpc3RlbmVyOmZ1bmN0aW9uKFJlYWN0RXZlbnRMaXN0ZW5lcil7UmVhY3RFdmVu dExpc3RlbmVyLnNldEhhbmRsZVRvcExldmVsKFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5oYW5k bGVUb3BMZXZlbCk7UmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lcj1S ZWFjdEV2ZW50TGlzdGVuZXJ9fSxzZXRFbmFibGVkOmZ1bmN0aW9uKGVuYWJsZWQpe2lmKFJlYWN0 QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIpe1JlYWN0QnJvd3NlckV2ZW50 RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIuc2V0RW5hYmxlZChlbmFibGVkKX19LGlzRW5hYmxl ZDpmdW5jdGlvbigpe3JldHVybiEhKFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50 TGlzdGVuZXImJlJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIuaXNF bmFibGVkKCkpfSxsaXN0ZW5UbzpmdW5jdGlvbihyZWdpc3RyYXRpb25OYW1lLGNvbnRlbnREb2N1 bWVudEhhbmRsZSl7dmFyIG1vdW50QXQ9Y29udGVudERvY3VtZW50SGFuZGxlO3ZhciBpc0xpc3Rl bmluZz1nZXRMaXN0ZW5pbmdGb3JEb2N1bWVudChtb3VudEF0KTt2YXIgZGVwZW5kZW5jaWVzPUV2 ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llc1tyZWdpc3RyYXRp b25OYW1lXTtmb3IodmFyIGk9MDtpPGRlcGVuZGVuY2llcy5sZW5ndGg7aSsrKXt2YXIgZGVwZW5k ZW5jeT1kZXBlbmRlbmNpZXNbaV07aWYoIShpc0xpc3RlbmluZy5oYXNPd25Qcm9wZXJ0eShkZXBl bmRlbmN5KSYmaXNMaXN0ZW5pbmdbZGVwZW5kZW5jeV0pKXtpZihkZXBlbmRlbmN5PT09InRvcFdo ZWVsIil7aWYoaXNFdmVudFN1cHBvcnRlZCgid2hlZWwiKSl7UmVhY3RCcm93c2VyRXZlbnRFbWl0 dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KCJ0b3BXaGVlbCIsIndoZWVs Iixtb3VudEF0KX1lbHNlIGlmKGlzRXZlbnRTdXBwb3J0ZWQoIm1vdXNld2hlZWwiKSl7UmVhY3RC cm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KCJ0 b3BXaGVlbCIsIm1vdXNld2hlZWwiLG1vdW50QXQpfWVsc2V7UmVhY3RCcm93c2VyRXZlbnRFbWl0 dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KCJ0b3BXaGVlbCIsIkRPTU1v dXNlU2Nyb2xsIixtb3VudEF0KX19ZWxzZSBpZihkZXBlbmRlbmN5PT09InRvcFNjcm9sbCIpe2lm KGlzRXZlbnRTdXBwb3J0ZWQoInNjcm9sbCIsdHJ1ZSkpe1JlYWN0QnJvd3NlckV2ZW50RW1pdHRl ci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcENhcHR1cmVkRXZlbnQoInRvcFNjcm9sbCIsInNjcm9s bCIsbW91bnRBdCl9ZWxzZXtSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3Rl bmVyLnRyYXBCdWJibGVkRXZlbnQoInRvcFNjcm9sbCIsInNjcm9sbCIsUmVhY3RCcm93c2VyRXZl bnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci5XSU5ET1dfSEFORExFKX19ZWxzZSBpZihkZXBl bmRlbmN5PT09InRvcEZvY3VzInx8ZGVwZW5kZW5jeT09PSJ0b3BCbHVyIil7aWYoaXNFdmVudFN1 cHBvcnRlZCgiZm9jdXMiLHRydWUpKXtSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVu dExpc3RlbmVyLnRyYXBDYXB0dXJlZEV2ZW50KCJ0b3BGb2N1cyIsImZvY3VzIixtb3VudEF0KTtS ZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBDYXB0dXJlZEV2 ZW50KCJ0b3BCbHVyIiwiYmx1ciIsbW91bnRBdCl9ZWxzZSBpZihpc0V2ZW50U3VwcG9ydGVkKCJm b2N1c2luIikpe1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJh cEJ1YmJsZWRFdmVudCgidG9wRm9jdXMiLCJmb2N1c2luIixtb3VudEF0KTtSZWFjdEJyb3dzZXJF dmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQoInRvcEJsdXIi LCJmb2N1c291dCIsbW91bnRBdCl9aXNMaXN0ZW5pbmcudG9wQmx1cj10cnVlO2lzTGlzdGVuaW5n LnRvcEZvY3VzPXRydWV9ZWxzZSBpZih0b3BFdmVudE1hcHBpbmcuaGFzT3duUHJvcGVydHkoZGVw ZW5kZW5jeSkpe1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJh cEJ1YmJsZWRFdmVudChkZXBlbmRlbmN5LHRvcEV2ZW50TWFwcGluZ1tkZXBlbmRlbmN5XSxtb3Vu dEF0KX1pc0xpc3RlbmluZ1tkZXBlbmRlbmN5XT10cnVlfX19LHRyYXBCdWJibGVkRXZlbnQ6ZnVu Y3Rpb24odG9wTGV2ZWxUeXBlLGhhbmRsZXJCYXNlTmFtZSxoYW5kbGUpe3JldHVybiBSZWFjdEJy b3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQodG9w TGV2ZWxUeXBlLGhhbmRsZXJCYXNlTmFtZSxoYW5kbGUpfSx0cmFwQ2FwdHVyZWRFdmVudDpmdW5j dGlvbih0b3BMZXZlbFR5cGUsaGFuZGxlckJhc2VOYW1lLGhhbmRsZSl7cmV0dXJuIFJlYWN0QnJv d3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcENhcHR1cmVkRXZlbnQodG9w TGV2ZWxUeXBlLGhhbmRsZXJCYXNlTmFtZSxoYW5kbGUpfSxzdXBwb3J0c0V2ZW50UGFnZVhZOmZ1 bmN0aW9uKCl7aWYoIWRvY3VtZW50LmNyZWF0ZUV2ZW50KXtyZXR1cm4gZmFsc2V9dmFyIGV2PWRv Y3VtZW50LmNyZWF0ZUV2ZW50KCJNb3VzZUV2ZW50Iik7cmV0dXJuIGV2IT1udWxsJiYicGFnZVgi aW4gZXZ9LGVuc3VyZVNjcm9sbFZhbHVlTW9uaXRvcmluZzpmdW5jdGlvbigpe2lmKGhhc0V2ZW50 UGFnZVhZPT09dW5kZWZpbmVkKXtoYXNFdmVudFBhZ2VYWT1SZWFjdEJyb3dzZXJFdmVudEVtaXR0 ZXIuc3VwcG9ydHNFdmVudFBhZ2VYWSgpfWlmKCFoYXNFdmVudFBhZ2VYWSYmIWlzTW9uaXRvcmlu Z1Njcm9sbFZhbHVlKXt2YXIgcmVmcmVzaD1WaWV3cG9ydE1ldHJpY3MucmVmcmVzaFNjcm9sbFZh bHVlcztSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLm1vbml0b3JT Y3JvbGxWYWx1ZShyZWZyZXNoKTtpc01vbml0b3JpbmdTY3JvbGxWYWx1ZT10cnVlfX19KTttb2R1 bGUuZXhwb3J0cz1SZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXJ9LHsxMTE6MTExLDExMzoxMTMsMTQ4 OjE0OCwxNzoxNyw1MTo1MSw5NDo5NH1dLDI2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBv cnRzKXsoZnVuY3Rpb24ocHJvY2Vzcyl7InVzZSBzdHJpY3QiO3ZhciBSZWFjdFJlY29uY2lsZXI9 X2RlcmVxXyg2OCk7dmFyIGluc3RhbnRpYXRlUmVhY3RDb21wb25lbnQ9X2RlcmVxXygxMTIpO3Zh ciBLZXlFc2NhcGVVdGlscz1fZGVyZXFfKDIyKTt2YXIgc2hvdWxkVXBkYXRlUmVhY3RDb21wb25l bnQ9X2RlcmVxXygxMTkpO3ZhciB0cmF2ZXJzZUFsbENoaWxkcmVuPV9kZXJlcV8oMTIwKTt2YXIg d2FybmluZz1fZGVyZXFfKDE0Nyk7dmFyIFJlYWN0Q29tcG9uZW50VHJlZUhvb2s7aWYodHlwZW9m IHByb2Nlc3MhPT0idW5kZWZpbmVkIiYmcHJvY2Vzcy5lbnYmJiJkZXZlbG9wbWVudCI9PT0idGVz dCIpe1JlYWN0Q29tcG9uZW50VHJlZUhvb2s9X2RlcmVxXygxMjIpfWZ1bmN0aW9uIGluc3RhbnRp YXRlQ2hpbGQoY2hpbGRJbnN0YW5jZXMsY2hpbGQsbmFtZSxzZWxmRGVidWdJRCl7dmFyIGtleVVu aXF1ZT1jaGlsZEluc3RhbmNlc1tuYW1lXT09PXVuZGVmaW5lZDtpZigiZGV2ZWxvcG1lbnQiIT09 InByb2R1Y3Rpb24iKXtpZighUmVhY3RDb21wb25lbnRUcmVlSG9vayl7UmVhY3RDb21wb25lbnRU cmVlSG9vaz1fZGVyZXFfKDEyMil9aWYoIWtleVVuaXF1ZSl7ImRldmVsb3BtZW50IiE9PSJwcm9k dWN0aW9uIj93YXJuaW5nKGZhbHNlLCJmbGF0dGVuQ2hpbGRyZW4oLi4uKTogRW5jb3VudGVyZWQg dHdvIGNoaWxkcmVuIHdpdGggdGhlIHNhbWUga2V5LCAiKyJgJXNgLiBDaGlsZCBrZXlzIG11c3Qg YmUgdW5pcXVlOyB3aGVuIHR3byBjaGlsZHJlbiBzaGFyZSBhIGtleSwgb25seSAiKyJ0aGUgZmly c3QgY2hpbGQgd2lsbCBiZSB1c2VkLiVzIixLZXlFc2NhcGVVdGlscy51bmVzY2FwZShuYW1lKSxS ZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKHNlbGZEZWJ1Z0lEKSk6 dm9pZCAwfX1pZihjaGlsZCE9bnVsbCYma2V5VW5pcXVlKXtjaGlsZEluc3RhbmNlc1tuYW1lXT1p bnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50KGNoaWxkLHRydWUpfX12YXIgUmVhY3RDaGlsZFJlY29u Y2lsZXI9e2luc3RhbnRpYXRlQ2hpbGRyZW46ZnVuY3Rpb24obmVzdGVkQ2hpbGROb2Rlcyx0cmFu c2FjdGlvbixjb250ZXh0LHNlbGZEZWJ1Z0lEKXtpZihuZXN0ZWRDaGlsZE5vZGVzPT1udWxsKXty ZXR1cm4gbnVsbH12YXIgY2hpbGRJbnN0YW5jZXM9e307aWYoImRldmVsb3BtZW50IiE9PSJwcm9k dWN0aW9uIil7dHJhdmVyc2VBbGxDaGlsZHJlbihuZXN0ZWRDaGlsZE5vZGVzLGZ1bmN0aW9uKGNo aWxkSW5zdHMsY2hpbGQsbmFtZSl7cmV0dXJuIGluc3RhbnRpYXRlQ2hpbGQoY2hpbGRJbnN0cyxj aGlsZCxuYW1lLHNlbGZEZWJ1Z0lEKX0sY2hpbGRJbnN0YW5jZXMpfWVsc2V7dHJhdmVyc2VBbGxD aGlsZHJlbihuZXN0ZWRDaGlsZE5vZGVzLGluc3RhbnRpYXRlQ2hpbGQsY2hpbGRJbnN0YW5jZXMp fXJldHVybiBjaGlsZEluc3RhbmNlc30sdXBkYXRlQ2hpbGRyZW46ZnVuY3Rpb24ocHJldkNoaWxk cmVuLG5leHRDaGlsZHJlbixtb3VudEltYWdlcyxyZW1vdmVkTm9kZXMsdHJhbnNhY3Rpb24saG9z dFBhcmVudCxob3N0Q29udGFpbmVySW5mbyxjb250ZXh0LHNlbGZEZWJ1Z0lEKXtpZighbmV4dENo aWxkcmVuJiYhcHJldkNoaWxkcmVuKXtyZXR1cm59dmFyIG5hbWU7dmFyIHByZXZDaGlsZDtmb3Io bmFtZSBpbiBuZXh0Q2hpbGRyZW4pe2lmKCFuZXh0Q2hpbGRyZW4uaGFzT3duUHJvcGVydHkobmFt ZSkpe2NvbnRpbnVlfXByZXZDaGlsZD1wcmV2Q2hpbGRyZW4mJnByZXZDaGlsZHJlbltuYW1lXTt2 YXIgcHJldkVsZW1lbnQ9cHJldkNoaWxkJiZwcmV2Q2hpbGQuX2N1cnJlbnRFbGVtZW50O3ZhciBu ZXh0RWxlbWVudD1uZXh0Q2hpbGRyZW5bbmFtZV07aWYocHJldkNoaWxkIT1udWxsJiZzaG91bGRV cGRhdGVSZWFjdENvbXBvbmVudChwcmV2RWxlbWVudCxuZXh0RWxlbWVudCkpe1JlYWN0UmVjb25j aWxlci5yZWNlaXZlQ29tcG9uZW50KHByZXZDaGlsZCxuZXh0RWxlbWVudCx0cmFuc2FjdGlvbixj b250ZXh0KTtuZXh0Q2hpbGRyZW5bbmFtZV09cHJldkNoaWxkfWVsc2V7aWYocHJldkNoaWxkKXty ZW1vdmVkTm9kZXNbbmFtZV09UmVhY3RSZWNvbmNpbGVyLmdldEhvc3ROb2RlKHByZXZDaGlsZCk7 UmVhY3RSZWNvbmNpbGVyLnVubW91bnRDb21wb25lbnQocHJldkNoaWxkLGZhbHNlKX12YXIgbmV4 dENoaWxkSW5zdGFuY2U9aW5zdGFudGlhdGVSZWFjdENvbXBvbmVudChuZXh0RWxlbWVudCx0cnVl KTtuZXh0Q2hpbGRyZW5bbmFtZV09bmV4dENoaWxkSW5zdGFuY2U7dmFyIG5leHRDaGlsZE1vdW50 SW1hZ2U9UmVhY3RSZWNvbmNpbGVyLm1vdW50Q29tcG9uZW50KG5leHRDaGlsZEluc3RhbmNlLHRy YW5zYWN0aW9uLGhvc3RQYXJlbnQsaG9zdENvbnRhaW5lckluZm8sY29udGV4dCxzZWxmRGVidWdJ RCk7bW91bnRJbWFnZXMucHVzaChuZXh0Q2hpbGRNb3VudEltYWdlKX19Zm9yKG5hbWUgaW4gcHJl dkNoaWxkcmVuKXtpZihwcmV2Q2hpbGRyZW4uaGFzT3duUHJvcGVydHkobmFtZSkmJiEobmV4dENo aWxkcmVuJiZuZXh0Q2hpbGRyZW4uaGFzT3duUHJvcGVydHkobmFtZSkpKXtwcmV2Q2hpbGQ9cHJl dkNoaWxkcmVuW25hbWVdO3JlbW92ZWROb2Rlc1tuYW1lXT1SZWFjdFJlY29uY2lsZXIuZ2V0SG9z dE5vZGUocHJldkNoaWxkKTtSZWFjdFJlY29uY2lsZXIudW5tb3VudENvbXBvbmVudChwcmV2Q2hp bGQsZmFsc2UpfX19LHVubW91bnRDaGlsZHJlbjpmdW5jdGlvbihyZW5kZXJlZENoaWxkcmVuLHNh ZmVseSl7Zm9yKHZhciBuYW1lIGluIHJlbmRlcmVkQ2hpbGRyZW4pe2lmKHJlbmRlcmVkQ2hpbGRy ZW4uaGFzT3duUHJvcGVydHkobmFtZSkpe3ZhciByZW5kZXJlZENoaWxkPXJlbmRlcmVkQ2hpbGRy ZW5bbmFtZV07UmVhY3RSZWNvbmNpbGVyLnVubW91bnRDb21wb25lbnQocmVuZGVyZWRDaGlsZCxz YWZlbHkpfX19fTttb2R1bGUuZXhwb3J0cz1SZWFjdENoaWxkUmVjb25jaWxlcn0pLmNhbGwodGhp cyx1bmRlZmluZWQpfSx7MTEyOjExMiwxMTk6MTE5LDEyMDoxMjAsMTIyOjEyMiwxNDc6MTQ3LDIy OjIyLDY4OjY4fV0sMjc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3Ry aWN0Ijt2YXIgRE9NQ2hpbGRyZW5PcGVyYXRpb25zPV9kZXJlcV8oOCk7dmFyIFJlYWN0RE9NSURP cGVyYXRpb25zPV9kZXJlcV8oMzUpO3ZhciBSZWFjdENvbXBvbmVudEJyb3dzZXJFbnZpcm9ubWVu dD17cHJvY2Vzc0NoaWxkcmVuVXBkYXRlczpSZWFjdERPTUlET3BlcmF0aW9ucy5kYW5nZXJvdXNs eVByb2Nlc3NDaGlsZHJlblVwZGF0ZXMscmVwbGFjZU5vZGVXaXRoTWFya3VwOkRPTUNoaWxkcmVu T3BlcmF0aW9ucy5kYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cH07bW9kdWxlLmV4cG9y dHM9UmVhY3RDb21wb25lbnRCcm93c2VyRW52aXJvbm1lbnR9LHszNTozNSw4Ojh9XSwyODpbZnVu Y3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBfcHJvZEludmFy aWFudD1fZGVyZXFfKDExNik7dmFyIGludmFyaWFudD1fZGVyZXFfKDE0MCk7dmFyIGluamVjdGVk PWZhbHNlO3ZhciBSZWFjdENvbXBvbmVudEVudmlyb25tZW50PXtyZXBsYWNlTm9kZVdpdGhNYXJr dXA6bnVsbCxwcm9jZXNzQ2hpbGRyZW5VcGRhdGVzOm51bGwsaW5qZWN0aW9uOntpbmplY3RFbnZp cm9ubWVudDpmdW5jdGlvbihlbnZpcm9ubWVudCl7ISFpbmplY3RlZD8iZGV2ZWxvcG1lbnQiIT09 InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiUmVhY3RDb21wb3NpdGVDb21wb25lbnQ6IGlu amVjdEVudmlyb25tZW50KCkgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuIik6X3Byb2RJbnZhcmlh bnQoIjEwNCIpOnZvaWQgMDtSZWFjdENvbXBvbmVudEVudmlyb25tZW50LnJlcGxhY2VOb2RlV2l0 aE1hcmt1cD1lbnZpcm9ubWVudC5yZXBsYWNlTm9kZVdpdGhNYXJrdXA7UmVhY3RDb21wb25lbnRF bnZpcm9ubWVudC5wcm9jZXNzQ2hpbGRyZW5VcGRhdGVzPWVudmlyb25tZW50LnByb2Nlc3NDaGls ZHJlblVwZGF0ZXM7aW5qZWN0ZWQ9dHJ1ZX19fTttb2R1bGUuZXhwb3J0cz1SZWFjdENvbXBvbmVu dEVudmlyb25tZW50fSx7MTE2OjExNiwxNDA6MTQwfV0sMjk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9k dWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgX3Byb2RJbnZhcmlhbnQ9X2RlcmVxXygxMTYp LF9hc3NpZ249X2RlcmVxXygxNDgpO3ZhciBSZWFjdD1fZGVyZXFfKDEyNCk7dmFyIFJlYWN0Q29t cG9uZW50RW52aXJvbm1lbnQ9X2RlcmVxXygyOCk7dmFyIFJlYWN0Q3VycmVudE93bmVyPV9kZXJl cV8oMTIzKTt2YXIgUmVhY3RFcnJvclV0aWxzPV9kZXJlcV8oNTApO3ZhciBSZWFjdEluc3RhbmNl TWFwPV9kZXJlcV8oNTgpO3ZhciBSZWFjdEluc3RydW1lbnRhdGlvbj1fZGVyZXFfKDU5KTt2YXIg UmVhY3ROb2RlVHlwZXM9X2RlcmVxXyg2Myk7dmFyIFJlYWN0UmVjb25jaWxlcj1fZGVyZXFfKDY4 KTtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXt2YXIgY2hlY2tSZWFjdFR5cGVTcGVj PV9kZXJlcV8oOTcpfXZhciBlbXB0eU9iamVjdD1fZGVyZXFfKDEzMyk7dmFyIGludmFyaWFudD1f ZGVyZXFfKDE0MCk7dmFyIHNoYWxsb3dFcXVhbD1fZGVyZXFfKDE0Nik7dmFyIHNob3VsZFVwZGF0 ZVJlYWN0Q29tcG9uZW50PV9kZXJlcV8oMTE5KTt2YXIgd2FybmluZz1fZGVyZXFfKDE0Nyk7dmFy IENvbXBvc2l0ZVR5cGVzPXtJbXB1cmVDbGFzczowLFB1cmVDbGFzczoxLFN0YXRlbGVzc0Z1bmN0 aW9uYWw6Mn07ZnVuY3Rpb24gU3RhdGVsZXNzQ29tcG9uZW50KENvbXBvbmVudCl7fVN0YXRlbGVz c0NvbXBvbmVudC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIENvbXBvbmVudD1SZWFj dEluc3RhbmNlTWFwLmdldCh0aGlzKS5fY3VycmVudEVsZW1lbnQudHlwZTt2YXIgZWxlbWVudD1D b21wb25lbnQodGhpcy5wcm9wcyx0aGlzLmNvbnRleHQsdGhpcy51cGRhdGVyKTt3YXJuSWZJbnZh bGlkRWxlbWVudChDb21wb25lbnQsZWxlbWVudCk7cmV0dXJuIGVsZW1lbnR9O2Z1bmN0aW9uIHdh cm5JZkludmFsaWRFbGVtZW50KENvbXBvbmVudCxlbGVtZW50KXtpZigiZGV2ZWxvcG1lbnQiIT09 InByb2R1Y3Rpb24iKXsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmcoZWxlbWVu dD09PW51bGx8fGVsZW1lbnQ9PT1mYWxzZXx8UmVhY3QuaXNWYWxpZEVsZW1lbnQoZWxlbWVudCks IiVzKC4uLik6IEEgdmFsaWQgUmVhY3QgZWxlbWVudCAob3IgbnVsbCkgbXVzdCBiZSByZXR1cm5l ZC4gWW91IG1heSBoYXZlICIrInJldHVybmVkIHVuZGVmaW5lZCwgYW4gYXJyYXkgb3Igc29tZSBv dGhlciBpbnZhbGlkIG9iamVjdC4iLENvbXBvbmVudC5kaXNwbGF5TmFtZXx8Q29tcG9uZW50Lm5h bWV8fCJDb21wb25lbnQiKTp2b2lkIDA7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJu aW5nKCFDb21wb25lbnQuY2hpbGRDb250ZXh0VHlwZXMsIiVzKC4uLik6IGNoaWxkQ29udGV4dFR5 cGVzIGNhbm5vdCBiZSBkZWZpbmVkIG9uIGEgZnVuY3Rpb25hbCBjb21wb25lbnQuIixDb21wb25l bnQuZGlzcGxheU5hbWV8fENvbXBvbmVudC5uYW1lfHwiQ29tcG9uZW50Iik6dm9pZCAwfX1mdW5j dGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KXtyZXR1cm4hIShDb21wb25lbnQucHJvdG90 eXBlJiZDb21wb25lbnQucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpfWZ1bmN0aW9uIGlzUHVy ZUNvbXBvbmVudChDb21wb25lbnQpe3JldHVybiEhKENvbXBvbmVudC5wcm90b3R5cGUmJkNvbXBv bmVudC5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQpfWZ1bmN0aW9uIG1lYXN1cmVMaWZl Q3ljbGVQZXJmKGZuLGRlYnVnSUQsdGltZXJUeXBlKXtpZihkZWJ1Z0lEPT09MCl7cmV0dXJuIGZu KCl9UmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uQmVnaW5MaWZlQ3ljbGVUaW1lcihk ZWJ1Z0lELHRpbWVyVHlwZSk7dHJ5e3JldHVybiBmbigpfWZpbmFsbHl7UmVhY3RJbnN0cnVtZW50 YXRpb24uZGVidWdUb29sLm9uRW5kTGlmZUN5Y2xlVGltZXIoZGVidWdJRCx0aW1lclR5cGUpfX12 YXIgbmV4dE1vdW50SUQ9MTt2YXIgUmVhY3RDb21wb3NpdGVDb21wb25lbnQ9e2NvbnN0cnVjdDpm dW5jdGlvbihlbGVtZW50KXt0aGlzLl9jdXJyZW50RWxlbWVudD1lbGVtZW50O3RoaXMuX3Jvb3RO b2RlSUQ9MDt0aGlzLl9jb21wb3NpdGVUeXBlPW51bGw7dGhpcy5faW5zdGFuY2U9bnVsbDt0aGlz Ll9ob3N0UGFyZW50PW51bGw7dGhpcy5faG9zdENvbnRhaW5lckluZm89bnVsbDt0aGlzLl91cGRh dGVCYXRjaE51bWJlcj1udWxsO3RoaXMuX3BlbmRpbmdFbGVtZW50PW51bGw7dGhpcy5fcGVuZGlu Z1N0YXRlUXVldWU9bnVsbDt0aGlzLl9wZW5kaW5nUmVwbGFjZVN0YXRlPWZhbHNlO3RoaXMuX3Bl bmRpbmdGb3JjZVVwZGF0ZT1mYWxzZTt0aGlzLl9yZW5kZXJlZE5vZGVUeXBlPW51bGw7dGhpcy5f cmVuZGVyZWRDb21wb25lbnQ9bnVsbDt0aGlzLl9jb250ZXh0PW51bGw7dGhpcy5fbW91bnRPcmRl cj0wO3RoaXMuX3RvcExldmVsV3JhcHBlcj1udWxsO3RoaXMuX3BlbmRpbmdDYWxsYmFja3M9bnVs bDt0aGlzLl9jYWxsZWRDb21wb25lbnRXaWxsVW5tb3VudD1mYWxzZTtpZigiZGV2ZWxvcG1lbnQi IT09InByb2R1Y3Rpb24iKXt0aGlzLl93YXJuZWRBYm91dFJlZnNJblJlbmRlcj1mYWxzZX19LG1v dW50Q29tcG9uZW50OmZ1bmN0aW9uKHRyYW5zYWN0aW9uLGhvc3RQYXJlbnQsaG9zdENvbnRhaW5l ckluZm8sY29udGV4dCl7dmFyIF90aGlzPXRoaXM7dGhpcy5fY29udGV4dD1jb250ZXh0O3RoaXMu X21vdW50T3JkZXI9bmV4dE1vdW50SUQrKzt0aGlzLl9ob3N0UGFyZW50PWhvc3RQYXJlbnQ7dGhp cy5faG9zdENvbnRhaW5lckluZm89aG9zdENvbnRhaW5lckluZm87dmFyIHB1YmxpY1Byb3BzPXRo aXMuX2N1cnJlbnRFbGVtZW50LnByb3BzO3ZhciBwdWJsaWNDb250ZXh0PXRoaXMuX3Byb2Nlc3ND b250ZXh0KGNvbnRleHQpO3ZhciBDb21wb25lbnQ9dGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTt2 YXIgdXBkYXRlUXVldWU9dHJhbnNhY3Rpb24uZ2V0VXBkYXRlUXVldWUoKTt2YXIgZG9Db25zdHJ1 Y3Q9c2hvdWxkQ29uc3RydWN0KENvbXBvbmVudCk7dmFyIGluc3Q9dGhpcy5fY29uc3RydWN0Q29t cG9uZW50KGRvQ29uc3RydWN0LHB1YmxpY1Byb3BzLHB1YmxpY0NvbnRleHQsdXBkYXRlUXVldWUp O3ZhciByZW5kZXJlZEVsZW1lbnQ7aWYoIWRvQ29uc3RydWN0JiYoaW5zdD09bnVsbHx8aW5zdC5y ZW5kZXI9PW51bGwpKXtyZW5kZXJlZEVsZW1lbnQ9aW5zdDt3YXJuSWZJbnZhbGlkRWxlbWVudChD b21wb25lbnQscmVuZGVyZWRFbGVtZW50KTshKGluc3Q9PT1udWxsfHxpbnN0PT09ZmFsc2V8fFJl YWN0LmlzVmFsaWRFbGVtZW50KGluc3QpKT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2lu dmFyaWFudChmYWxzZSwiJXMoLi4uKTogQSB2YWxpZCBSZWFjdCBlbGVtZW50IChvciBudWxsKSBt dXN0IGJlIHJldHVybmVkLiBZb3UgbWF5IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLCBhbiBhcnJh eSBvciBzb21lIG90aGVyIGludmFsaWQgb2JqZWN0LiIsQ29tcG9uZW50LmRpc3BsYXlOYW1lfHxD b21wb25lbnQubmFtZXx8IkNvbXBvbmVudCIpOl9wcm9kSW52YXJpYW50KCIxMDUiLENvbXBvbmVu dC5kaXNwbGF5TmFtZXx8Q29tcG9uZW50Lm5hbWV8fCJDb21wb25lbnQiKTp2b2lkIDA7aW5zdD1u ZXcgU3RhdGVsZXNzQ29tcG9uZW50KENvbXBvbmVudCk7dGhpcy5fY29tcG9zaXRlVHlwZT1Db21w b3NpdGVUeXBlcy5TdGF0ZWxlc3NGdW5jdGlvbmFsfWVsc2V7aWYoaXNQdXJlQ29tcG9uZW50KENv bXBvbmVudCkpe3RoaXMuX2NvbXBvc2l0ZVR5cGU9Q29tcG9zaXRlVHlwZXMuUHVyZUNsYXNzfWVs c2V7dGhpcy5fY29tcG9zaXRlVHlwZT1Db21wb3NpdGVUeXBlcy5JbXB1cmVDbGFzc319aWYoImRl dmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7aWYoaW5zdC5yZW5kZXI9PW51bGwpeyJkZXZlbG9w bWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyhmYWxzZSwiJXMoLi4uKTogTm8gYHJlbmRlcmAg bWV0aG9kIGZvdW5kIG9uIHRoZSByZXR1cm5lZCBjb21wb25lbnQgIisiaW5zdGFuY2U6IHlvdSBt YXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gZGVmaW5lIGByZW5kZXJgLiIsQ29tcG9uZW50LmRpc3BsYXlO YW1lfHxDb21wb25lbnQubmFtZXx8IkNvbXBvbmVudCIpOnZvaWQgMH12YXIgcHJvcHNNdXRhdGVk PWluc3QucHJvcHMhPT1wdWJsaWNQcm9wczt2YXIgY29tcG9uZW50TmFtZT1Db21wb25lbnQuZGlz cGxheU5hbWV8fENvbXBvbmVudC5uYW1lfHwiQ29tcG9uZW50IjsiZGV2ZWxvcG1lbnQiIT09InBy b2R1Y3Rpb24iP3dhcm5pbmcoaW5zdC5wcm9wcz09PXVuZGVmaW5lZHx8IXByb3BzTXV0YXRlZCwi JXMoLi4uKTogV2hlbiBjYWxsaW5nIHN1cGVyKCkgaW4gYCVzYCwgbWFrZSBzdXJlIHRvIHBhc3Mg IisidXAgdGhlIHNhbWUgcHJvcHMgdGhhdCB5b3VyIGNvbXBvbmVudCdzIGNvbnN0cnVjdG9yIHdh cyBwYXNzZWQuIixjb21wb25lbnROYW1lLGNvbXBvbmVudE5hbWUpOnZvaWQgMH1pbnN0LnByb3Bz PXB1YmxpY1Byb3BzO2luc3QuY29udGV4dD1wdWJsaWNDb250ZXh0O2luc3QucmVmcz1lbXB0eU9i amVjdDtpbnN0LnVwZGF0ZXI9dXBkYXRlUXVldWU7dGhpcy5faW5zdGFuY2U9aW5zdDtSZWFjdElu c3RhbmNlTWFwLnNldChpbnN0LHRoaXMpO2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIp eyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyghaW5zdC5nZXRJbml0aWFsU3Rh dGV8fGluc3QuZ2V0SW5pdGlhbFN0YXRlLmlzUmVhY3RDbGFzc0FwcHJvdmVkfHxpbnN0LnN0YXRl LCJnZXRJbml0aWFsU3RhdGUgd2FzIGRlZmluZWQgb24gJXMsIGEgcGxhaW4gSmF2YVNjcmlwdCBj bGFzcy4gIisiVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBjcmVhdGVkIHVzaW5n IFJlYWN0LmNyZWF0ZUNsYXNzLiAiKyJEaWQgeW91IG1lYW4gdG8gZGVmaW5lIGEgc3RhdGUgcHJv cGVydHkgaW5zdGVhZD8iLHRoaXMuZ2V0TmFtZSgpfHwiYSBjb21wb25lbnQiKTp2b2lkIDA7ImRl dmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKCFpbnN0LmdldERlZmF1bHRQcm9wc3x8 aW5zdC5nZXREZWZhdWx0UHJvcHMuaXNSZWFjdENsYXNzQXBwcm92ZWQsImdldERlZmF1bHRQcm9w cyB3YXMgZGVmaW5lZCBvbiAlcywgYSBwbGFpbiBKYXZhU2NyaXB0IGNsYXNzLiAiKyJUaGlzIGlz IG9ubHkgc3VwcG9ydGVkIGZvciBjbGFzc2VzIGNyZWF0ZWQgdXNpbmcgUmVhY3QuY3JlYXRlQ2xh c3MuICIrIlVzZSBhIHN0YXRpYyBwcm9wZXJ0eSB0byBkZWZpbmUgZGVmYXVsdFByb3BzIGluc3Rl YWQuIix0aGlzLmdldE5hbWUoKXx8ImEgY29tcG9uZW50Iik6dm9pZCAwOyJkZXZlbG9wbWVudCIh PT0icHJvZHVjdGlvbiI/d2FybmluZyghaW5zdC5wcm9wVHlwZXMsInByb3BUeXBlcyB3YXMgZGVm aW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljICIrInByb3Bl cnR5IHRvIGRlZmluZSBwcm9wVHlwZXMgaW5zdGVhZC4iLHRoaXMuZ2V0TmFtZSgpfHwiYSBjb21w b25lbnQiKTp2b2lkIDA7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKCFpbnN0 LmNvbnRleHRUeXBlcywiY29udGV4dFR5cGVzIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHBy b3BlcnR5IG9uICVzLiBVc2UgYSAiKyJzdGF0aWMgcHJvcGVydHkgdG8gZGVmaW5lIGNvbnRleHRU eXBlcyBpbnN0ZWFkLiIsdGhpcy5nZXROYW1lKCl8fCJhIGNvbXBvbmVudCIpOnZvaWQgMDsiZGV2 ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmcodHlwZW9mIGluc3QuY29tcG9uZW50U2hv dWxkVXBkYXRlIT09ImZ1bmN0aW9uIiwiJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAiKyJjb21wb25l bnRTaG91bGRVcGRhdGUoKS4gRGlkIHlvdSBtZWFuIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpPyAi KyJUaGUgbmFtZSBpcyBwaHJhc2VkIGFzIGEgcXVlc3Rpb24gYmVjYXVzZSB0aGUgZnVuY3Rpb24g aXMgIisiZXhwZWN0ZWQgdG8gcmV0dXJuIGEgdmFsdWUuIix0aGlzLmdldE5hbWUoKXx8IkEgY29t cG9uZW50Iik6dm9pZCAwOyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyh0eXBl b2YgaW5zdC5jb21wb25lbnREaWRVbm1vdW50IT09ImZ1bmN0aW9uIiwiJXMgaGFzIGEgbWV0aG9k IGNhbGxlZCAiKyJjb21wb25lbnREaWRVbm1vdW50KCkuIEJ1dCB0aGVyZSBpcyBubyBzdWNoIGxp ZmVjeWNsZSBtZXRob2QuICIrIkRpZCB5b3UgbWVhbiBjb21wb25lbnRXaWxsVW5tb3VudCgpPyIs dGhpcy5nZXROYW1lKCl8fCJBIGNvbXBvbmVudCIpOnZvaWQgMDsiZGV2ZWxvcG1lbnQiIT09InBy b2R1Y3Rpb24iP3dhcm5pbmcodHlwZW9mIGluc3QuY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcyE9 PSJmdW5jdGlvbiIsIiVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgIisiY29tcG9uZW50V2lsbFJlY2ll dmVQcm9wcygpLiBEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpPyIsdGhp cy5nZXROYW1lKCl8fCJBIGNvbXBvbmVudCIpOnZvaWQgMH12YXIgaW5pdGlhbFN0YXRlPWluc3Qu c3RhdGU7aWYoaW5pdGlhbFN0YXRlPT09dW5kZWZpbmVkKXtpbnN0LnN0YXRlPWluaXRpYWxTdGF0 ZT1udWxsfSEodHlwZW9mIGluaXRpYWxTdGF0ZT09PSJvYmplY3QiJiYhQXJyYXkuaXNBcnJheShp bml0aWFsU3RhdGUpKT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxz ZSwiJXMuc3RhdGU6IG11c3QgYmUgc2V0IHRvIGFuIG9iamVjdCBvciBudWxsIix0aGlzLmdldE5h bWUoKXx8IlJlYWN0Q29tcG9zaXRlQ29tcG9uZW50Iik6X3Byb2RJbnZhcmlhbnQoIjEwNiIsdGhp cy5nZXROYW1lKCl8fCJSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCIpOnZvaWQgMDt0aGlzLl9wZW5k aW5nU3RhdGVRdWV1ZT1udWxsO3RoaXMuX3BlbmRpbmdSZXBsYWNlU3RhdGU9ZmFsc2U7dGhpcy5f cGVuZGluZ0ZvcmNlVXBkYXRlPWZhbHNlO3ZhciBtYXJrdXA7aWYoaW5zdC51bnN0YWJsZV9oYW5k bGVFcnJvcil7bWFya3VwPXRoaXMucGVyZm9ybUluaXRpYWxNb3VudFdpdGhFcnJvckhhbmRsaW5n KHJlbmRlcmVkRWxlbWVudCxob3N0UGFyZW50LGhvc3RDb250YWluZXJJbmZvLHRyYW5zYWN0aW9u LGNvbnRleHQpfWVsc2V7bWFya3VwPXRoaXMucGVyZm9ybUluaXRpYWxNb3VudChyZW5kZXJlZEVs ZW1lbnQsaG9zdFBhcmVudCxob3N0Q29udGFpbmVySW5mbyx0cmFuc2FjdGlvbixjb250ZXh0KX1p ZihpbnN0LmNvbXBvbmVudERpZE1vdW50KXtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24i KXt0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGZ1bmN0aW9uKCl7bWVh c3VyZUxpZmVDeWNsZVBlcmYoZnVuY3Rpb24oKXtyZXR1cm4gaW5zdC5jb21wb25lbnREaWRNb3Vu dCgpfSxfdGhpcy5fZGVidWdJRCwiY29tcG9uZW50RGlkTW91bnQiKX0pfWVsc2V7dHJhbnNhY3Rp b24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShpbnN0LmNvbXBvbmVudERpZE1vdW50LGlu c3QpfX1yZXR1cm4gbWFya3VwfSxfY29uc3RydWN0Q29tcG9uZW50OmZ1bmN0aW9uKGRvQ29uc3Ry dWN0LHB1YmxpY1Byb3BzLHB1YmxpY0NvbnRleHQsdXBkYXRlUXVldWUpe2lmKCJkZXZlbG9wbWVu dCIhPT0icHJvZHVjdGlvbiIpe1JlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQ9dGhpczt0cnl7cmV0 dXJuIHRoaXMuX2NvbnN0cnVjdENvbXBvbmVudFdpdGhvdXRPd25lcihkb0NvbnN0cnVjdCxwdWJs aWNQcm9wcyxwdWJsaWNDb250ZXh0LHVwZGF0ZVF1ZXVlKX1maW5hbGx5e1JlYWN0Q3VycmVudE93 bmVyLmN1cnJlbnQ9bnVsbH19ZWxzZXtyZXR1cm4gdGhpcy5fY29uc3RydWN0Q29tcG9uZW50V2l0 aG91dE93bmVyKGRvQ29uc3RydWN0LHB1YmxpY1Byb3BzLHB1YmxpY0NvbnRleHQsdXBkYXRlUXVl dWUpfX0sX2NvbnN0cnVjdENvbXBvbmVudFdpdGhvdXRPd25lcjpmdW5jdGlvbihkb0NvbnN0cnVj dCxwdWJsaWNQcm9wcyxwdWJsaWNDb250ZXh0LHVwZGF0ZVF1ZXVlKXt2YXIgQ29tcG9uZW50PXRo aXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7aWYoZG9Db25zdHJ1Y3Qpe2lmKCJkZXZlbG9wbWVudCIh PT0icHJvZHVjdGlvbiIpe3JldHVybiBtZWFzdXJlTGlmZUN5Y2xlUGVyZihmdW5jdGlvbigpe3Jl dHVybiBuZXcgQ29tcG9uZW50KHB1YmxpY1Byb3BzLHB1YmxpY0NvbnRleHQsdXBkYXRlUXVldWUp fSx0aGlzLl9kZWJ1Z0lELCJjdG9yIil9ZWxzZXtyZXR1cm4gbmV3IENvbXBvbmVudChwdWJsaWNQ cm9wcyxwdWJsaWNDb250ZXh0LHVwZGF0ZVF1ZXVlKX19aWYoImRldmVsb3BtZW50IiE9PSJwcm9k dWN0aW9uIil7cmV0dXJuIG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0aW9uKCl7cmV0dXJuIENv bXBvbmVudChwdWJsaWNQcm9wcyxwdWJsaWNDb250ZXh0LHVwZGF0ZVF1ZXVlKX0sdGhpcy5fZGVi dWdJRCwicmVuZGVyIil9ZWxzZXtyZXR1cm4gQ29tcG9uZW50KHB1YmxpY1Byb3BzLHB1YmxpY0Nv bnRleHQsdXBkYXRlUXVldWUpfX0scGVyZm9ybUluaXRpYWxNb3VudFdpdGhFcnJvckhhbmRsaW5n OmZ1bmN0aW9uKHJlbmRlcmVkRWxlbWVudCxob3N0UGFyZW50LGhvc3RDb250YWluZXJJbmZvLHRy YW5zYWN0aW9uLGNvbnRleHQpe3ZhciBtYXJrdXA7dmFyIGNoZWNrcG9pbnQ9dHJhbnNhY3Rpb24u Y2hlY2twb2ludCgpO3RyeXttYXJrdXA9dGhpcy5wZXJmb3JtSW5pdGlhbE1vdW50KHJlbmRlcmVk RWxlbWVudCxob3N0UGFyZW50LGhvc3RDb250YWluZXJJbmZvLHRyYW5zYWN0aW9uLGNvbnRleHQp fWNhdGNoKGUpe3RyYW5zYWN0aW9uLnJvbGxiYWNrKGNoZWNrcG9pbnQpO3RoaXMuX2luc3RhbmNl LnVuc3RhYmxlX2hhbmRsZUVycm9yKGUpO2lmKHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlKXt0aGlz Ll9pbnN0YW5jZS5zdGF0ZT10aGlzLl9wcm9jZXNzUGVuZGluZ1N0YXRlKHRoaXMuX2luc3RhbmNl LnByb3BzLHRoaXMuX2luc3RhbmNlLmNvbnRleHQpfWNoZWNrcG9pbnQ9dHJhbnNhY3Rpb24uY2hl Y2twb2ludCgpO3RoaXMuX3JlbmRlcmVkQ29tcG9uZW50LnVubW91bnRDb21wb25lbnQodHJ1ZSk7 dHJhbnNhY3Rpb24ucm9sbGJhY2soY2hlY2twb2ludCk7bWFya3VwPXRoaXMucGVyZm9ybUluaXRp YWxNb3VudChyZW5kZXJlZEVsZW1lbnQsaG9zdFBhcmVudCxob3N0Q29udGFpbmVySW5mbyx0cmFu c2FjdGlvbixjb250ZXh0KX1yZXR1cm4gbWFya3VwfSxwZXJmb3JtSW5pdGlhbE1vdW50OmZ1bmN0 aW9uKHJlbmRlcmVkRWxlbWVudCxob3N0UGFyZW50LGhvc3RDb250YWluZXJJbmZvLHRyYW5zYWN0 aW9uLGNvbnRleHQpe3ZhciBpbnN0PXRoaXMuX2luc3RhbmNlO3ZhciBkZWJ1Z0lEPTA7aWYoImRl dmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7ZGVidWdJRD10aGlzLl9kZWJ1Z0lEfWlmKGluc3Qu Y29tcG9uZW50V2lsbE1vdW50KXtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXttZWFz dXJlTGlmZUN5Y2xlUGVyZihmdW5jdGlvbigpe3JldHVybiBpbnN0LmNvbXBvbmVudFdpbGxNb3Vu dCgpfSxkZWJ1Z0lELCJjb21wb25lbnRXaWxsTW91bnQiKX1lbHNle2luc3QuY29tcG9uZW50V2ls bE1vdW50KCl9aWYodGhpcy5fcGVuZGluZ1N0YXRlUXVldWUpe2luc3Quc3RhdGU9dGhpcy5fcHJv Y2Vzc1BlbmRpbmdTdGF0ZShpbnN0LnByb3BzLGluc3QuY29udGV4dCl9fWlmKHJlbmRlcmVkRWxl bWVudD09PXVuZGVmaW5lZCl7cmVuZGVyZWRFbGVtZW50PXRoaXMuX3JlbmRlclZhbGlkYXRlZENv bXBvbmVudCgpfXZhciBub2RlVHlwZT1SZWFjdE5vZGVUeXBlcy5nZXRUeXBlKHJlbmRlcmVkRWxl bWVudCk7dGhpcy5fcmVuZGVyZWROb2RlVHlwZT1ub2RlVHlwZTt2YXIgY2hpbGQ9dGhpcy5faW5z dGFudGlhdGVSZWFjdENvbXBvbmVudChyZW5kZXJlZEVsZW1lbnQsbm9kZVR5cGUhPT1SZWFjdE5v ZGVUeXBlcy5FTVBUWSk7dGhpcy5fcmVuZGVyZWRDb21wb25lbnQ9Y2hpbGQ7dmFyIG1hcmt1cD1S ZWFjdFJlY29uY2lsZXIubW91bnRDb21wb25lbnQoY2hpbGQsdHJhbnNhY3Rpb24saG9zdFBhcmVu dCxob3N0Q29udGFpbmVySW5mbyx0aGlzLl9wcm9jZXNzQ2hpbGRDb250ZXh0KGNvbnRleHQpLGRl YnVnSUQpO2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe2lmKGRlYnVnSUQhPT0wKXt2 YXIgY2hpbGREZWJ1Z0lEcz1jaGlsZC5fZGVidWdJRCE9PTA/W2NoaWxkLl9kZWJ1Z0lEXTpbXTtS ZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25TZXRDaGlsZHJlbihkZWJ1Z0lELGNoaWxk RGVidWdJRHMpfX1yZXR1cm4gbWFya3VwfSxnZXRIb3N0Tm9kZTpmdW5jdGlvbigpe3JldHVybiBS ZWFjdFJlY29uY2lsZXIuZ2V0SG9zdE5vZGUodGhpcy5fcmVuZGVyZWRDb21wb25lbnQpfSx1bm1v dW50Q29tcG9uZW50OmZ1bmN0aW9uKHNhZmVseSl7aWYoIXRoaXMuX3JlbmRlcmVkQ29tcG9uZW50 KXtyZXR1cm59dmFyIGluc3Q9dGhpcy5faW5zdGFuY2U7aWYoaW5zdC5jb21wb25lbnRXaWxsVW5t b3VudCYmIWluc3QuX2NhbGxlZENvbXBvbmVudFdpbGxVbm1vdW50KXtpbnN0Ll9jYWxsZWRDb21w b25lbnRXaWxsVW5tb3VudD10cnVlO2lmKHNhZmVseSl7dmFyIG5hbWU9dGhpcy5nZXROYW1lKCkr Ii5jb21wb25lbnRXaWxsVW5tb3VudCgpIjtSZWFjdEVycm9yVXRpbHMuaW52b2tlR3VhcmRlZENh bGxiYWNrKG5hbWUsaW5zdC5jb21wb25lbnRXaWxsVW5tb3VudC5iaW5kKGluc3QpKX1lbHNle2lm KCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe21lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0 aW9uKCl7cmV0dXJuIGluc3QuY29tcG9uZW50V2lsbFVubW91bnQoKX0sdGhpcy5fZGVidWdJRCwi Y29tcG9uZW50V2lsbFVubW91bnQiKX1lbHNle2luc3QuY29tcG9uZW50V2lsbFVubW91bnQoKX19 fWlmKHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50KXtSZWFjdFJlY29uY2lsZXIudW5tb3VudENvbXBv bmVudCh0aGlzLl9yZW5kZXJlZENvbXBvbmVudCxzYWZlbHkpO3RoaXMuX3JlbmRlcmVkTm9kZVR5 cGU9bnVsbDt0aGlzLl9yZW5kZXJlZENvbXBvbmVudD1udWxsO3RoaXMuX2luc3RhbmNlPW51bGx9 dGhpcy5fcGVuZGluZ1N0YXRlUXVldWU9bnVsbDt0aGlzLl9wZW5kaW5nUmVwbGFjZVN0YXRlPWZh bHNlO3RoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZT1mYWxzZTt0aGlzLl9wZW5kaW5nQ2FsbGJhY2tz PW51bGw7dGhpcy5fcGVuZGluZ0VsZW1lbnQ9bnVsbDt0aGlzLl9jb250ZXh0PW51bGw7dGhpcy5f cm9vdE5vZGVJRD0wO3RoaXMuX3RvcExldmVsV3JhcHBlcj1udWxsO1JlYWN0SW5zdGFuY2VNYXAu cmVtb3ZlKGluc3QpfSxfbWFza0NvbnRleHQ6ZnVuY3Rpb24oY29udGV4dCl7dmFyIENvbXBvbmVu dD10aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO3ZhciBjb250ZXh0VHlwZXM9Q29tcG9uZW50LmNv bnRleHRUeXBlcztpZighY29udGV4dFR5cGVzKXtyZXR1cm4gZW1wdHlPYmplY3R9dmFyIG1hc2tl ZENvbnRleHQ9e307Zm9yKHZhciBjb250ZXh0TmFtZSBpbiBjb250ZXh0VHlwZXMpe21hc2tlZENv bnRleHRbY29udGV4dE5hbWVdPWNvbnRleHRbY29udGV4dE5hbWVdfXJldHVybiBtYXNrZWRDb250 ZXh0fSxfcHJvY2Vzc0NvbnRleHQ6ZnVuY3Rpb24oY29udGV4dCl7dmFyIG1hc2tlZENvbnRleHQ9 dGhpcy5fbWFza0NvbnRleHQoY29udGV4dCk7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9u Iil7dmFyIENvbXBvbmVudD10aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO2lmKENvbXBvbmVudC5j b250ZXh0VHlwZXMpe3RoaXMuX2NoZWNrQ29udGV4dFR5cGVzKENvbXBvbmVudC5jb250ZXh0VHlw ZXMsbWFza2VkQ29udGV4dCwiY29udGV4dCIpfX1yZXR1cm4gbWFza2VkQ29udGV4dH0sX3Byb2Nl c3NDaGlsZENvbnRleHQ6ZnVuY3Rpb24oY3VycmVudENvbnRleHQpe3ZhciBDb21wb25lbnQ9dGhp cy5fY3VycmVudEVsZW1lbnQudHlwZTt2YXIgaW5zdD10aGlzLl9pbnN0YW5jZTt2YXIgY2hpbGRD b250ZXh0O2lmKGluc3QuZ2V0Q2hpbGRDb250ZXh0KXtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1 Y3Rpb24iKXtSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWdpblByb2Nlc3NpbmdD aGlsZENvbnRleHQoKTt0cnl7Y2hpbGRDb250ZXh0PWluc3QuZ2V0Q2hpbGRDb250ZXh0KCl9Zmlu YWxseXtSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25FbmRQcm9jZXNzaW5nQ2hpbGRD b250ZXh0KCl9fWVsc2V7Y2hpbGRDb250ZXh0PWluc3QuZ2V0Q2hpbGRDb250ZXh0KCl9fWlmKGNo aWxkQ29udGV4dCl7ISh0eXBlb2YgQ29tcG9uZW50LmNoaWxkQ29udGV4dFR5cGVzPT09Im9iamVj dCIpPyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCIlcy5nZXRD aGlsZENvbnRleHQoKTogY2hpbGRDb250ZXh0VHlwZXMgbXVzdCBiZSBkZWZpbmVkIGluIG9yZGVy IHRvIHVzZSBnZXRDaGlsZENvbnRleHQoKS4iLHRoaXMuZ2V0TmFtZSgpfHwiUmVhY3RDb21wb3Np dGVDb21wb25lbnQiKTpfcHJvZEludmFyaWFudCgiMTA3Iix0aGlzLmdldE5hbWUoKXx8IlJlYWN0 Q29tcG9zaXRlQ29tcG9uZW50Iik6dm9pZCAwO2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlv biIpe3RoaXMuX2NoZWNrQ29udGV4dFR5cGVzKENvbXBvbmVudC5jaGlsZENvbnRleHRUeXBlcyxj aGlsZENvbnRleHQsImNoaWxkQ29udGV4dCIpfWZvcih2YXIgbmFtZSBpbiBjaGlsZENvbnRleHQp eyEobmFtZSBpbiBDb21wb25lbnQuY2hpbGRDb250ZXh0VHlwZXMpPyJkZXZlbG9wbWVudCIhPT0i cHJvZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCclcy5nZXRDaGlsZENvbnRleHQoKToga2V5ICIl cyIgaXMgbm90IGRlZmluZWQgaW4gY2hpbGRDb250ZXh0VHlwZXMuJyx0aGlzLmdldE5hbWUoKXx8 IlJlYWN0Q29tcG9zaXRlQ29tcG9uZW50IixuYW1lKTpfcHJvZEludmFyaWFudCgiMTA4Iix0aGlz LmdldE5hbWUoKXx8IlJlYWN0Q29tcG9zaXRlQ29tcG9uZW50IixuYW1lKTp2b2lkIDB9cmV0dXJu IF9hc3NpZ24oe30sY3VycmVudENvbnRleHQsY2hpbGRDb250ZXh0KX1yZXR1cm4gY3VycmVudENv bnRleHR9LF9jaGVja0NvbnRleHRUeXBlczpmdW5jdGlvbih0eXBlU3BlY3MsdmFsdWVzLGxvY2F0 aW9uKXtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtjaGVja1JlYWN0VHlwZVNwZWMo dHlwZVNwZWNzLHZhbHVlcyxsb2NhdGlvbix0aGlzLmdldE5hbWUoKSxudWxsLHRoaXMuX2RlYnVn SUQpfX0scmVjZWl2ZUNvbXBvbmVudDpmdW5jdGlvbihuZXh0RWxlbWVudCx0cmFuc2FjdGlvbixu ZXh0Q29udGV4dCl7dmFyIHByZXZFbGVtZW50PXRoaXMuX2N1cnJlbnRFbGVtZW50O3ZhciBwcmV2 Q29udGV4dD10aGlzLl9jb250ZXh0O3RoaXMuX3BlbmRpbmdFbGVtZW50PW51bGw7dGhpcy51cGRh dGVDb21wb25lbnQodHJhbnNhY3Rpb24scHJldkVsZW1lbnQsbmV4dEVsZW1lbnQscHJldkNvbnRl eHQsbmV4dENvbnRleHQpfSxwZXJmb3JtVXBkYXRlSWZOZWNlc3Nhcnk6ZnVuY3Rpb24odHJhbnNh Y3Rpb24pe2lmKHRoaXMuX3BlbmRpbmdFbGVtZW50IT1udWxsKXtSZWFjdFJlY29uY2lsZXIucmVj ZWl2ZUNvbXBvbmVudCh0aGlzLHRoaXMuX3BlbmRpbmdFbGVtZW50LHRyYW5zYWN0aW9uLHRoaXMu X2NvbnRleHQpfWVsc2UgaWYodGhpcy5fcGVuZGluZ1N0YXRlUXVldWUhPT1udWxsfHx0aGlzLl9w ZW5kaW5nRm9yY2VVcGRhdGUpe3RoaXMudXBkYXRlQ29tcG9uZW50KHRyYW5zYWN0aW9uLHRoaXMu X2N1cnJlbnRFbGVtZW50LHRoaXMuX2N1cnJlbnRFbGVtZW50LHRoaXMuX2NvbnRleHQsdGhpcy5f Y29udGV4dCl9ZWxzZXt0aGlzLl91cGRhdGVCYXRjaE51bWJlcj1udWxsfX0sdXBkYXRlQ29tcG9u ZW50OmZ1bmN0aW9uKHRyYW5zYWN0aW9uLHByZXZQYXJlbnRFbGVtZW50LG5leHRQYXJlbnRFbGVt ZW50LHByZXZVbm1hc2tlZENvbnRleHQsbmV4dFVubWFza2VkQ29udGV4dCl7dmFyIGluc3Q9dGhp cy5faW5zdGFuY2U7IShpbnN0IT1udWxsKT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2lu dmFyaWFudChmYWxzZSwiQXR0ZW1wdGVkIHRvIHVwZGF0ZSBjb21wb25lbnQgYCVzYCB0aGF0IGhh cyBhbHJlYWR5IGJlZW4gdW5tb3VudGVkIChvciBmYWlsZWQgdG8gbW91bnQpLiIsdGhpcy5nZXRO YW1lKCl8fCJSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCIpOl9wcm9kSW52YXJpYW50KCIxMzYiLHRo aXMuZ2V0TmFtZSgpfHwiUmVhY3RDb21wb3NpdGVDb21wb25lbnQiKTp2b2lkIDA7dmFyIHdpbGxS ZWNlaXZlPWZhbHNlO3ZhciBuZXh0Q29udGV4dDtpZih0aGlzLl9jb250ZXh0PT09bmV4dFVubWFz a2VkQ29udGV4dCl7bmV4dENvbnRleHQ9aW5zdC5jb250ZXh0fWVsc2V7bmV4dENvbnRleHQ9dGhp cy5fcHJvY2Vzc0NvbnRleHQobmV4dFVubWFza2VkQ29udGV4dCk7d2lsbFJlY2VpdmU9dHJ1ZX12 YXIgcHJldlByb3BzPXByZXZQYXJlbnRFbGVtZW50LnByb3BzO3ZhciBuZXh0UHJvcHM9bmV4dFBh cmVudEVsZW1lbnQucHJvcHM7aWYocHJldlBhcmVudEVsZW1lbnQhPT1uZXh0UGFyZW50RWxlbWVu dCl7d2lsbFJlY2VpdmU9dHJ1ZX1pZih3aWxsUmVjZWl2ZSYmaW5zdC5jb21wb25lbnRXaWxsUmVj ZWl2ZVByb3BzKXtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXttZWFzdXJlTGlmZUN5 Y2xlUGVyZihmdW5jdGlvbigpe3JldHVybiBpbnN0LmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMo bmV4dFByb3BzLG5leHRDb250ZXh0KX0sdGhpcy5fZGVidWdJRCwiY29tcG9uZW50V2lsbFJlY2Vp dmVQcm9wcyIpfWVsc2V7aW5zdC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcyxu ZXh0Q29udGV4dCl9fXZhciBuZXh0U3RhdGU9dGhpcy5fcHJvY2Vzc1BlbmRpbmdTdGF0ZShuZXh0 UHJvcHMsbmV4dENvbnRleHQpO3ZhciBzaG91bGRVcGRhdGU9dHJ1ZTtpZighdGhpcy5fcGVuZGlu Z0ZvcmNlVXBkYXRlKXtpZihpbnN0LnNob3VsZENvbXBvbmVudFVwZGF0ZSl7aWYoImRldmVsb3Bt ZW50IiE9PSJwcm9kdWN0aW9uIil7c2hvdWxkVXBkYXRlPW1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1 bmN0aW9uKCl7cmV0dXJuIGluc3Quc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcyxuZXh0 U3RhdGUsbmV4dENvbnRleHQpfSx0aGlzLl9kZWJ1Z0lELCJzaG91bGRDb21wb25lbnRVcGRhdGUi KX1lbHNle3Nob3VsZFVwZGF0ZT1pbnN0LnNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMs bmV4dFN0YXRlLG5leHRDb250ZXh0KX19ZWxzZXtpZih0aGlzLl9jb21wb3NpdGVUeXBlPT09Q29t cG9zaXRlVHlwZXMuUHVyZUNsYXNzKXtzaG91bGRVcGRhdGU9IXNoYWxsb3dFcXVhbChwcmV2UHJv cHMsbmV4dFByb3BzKXx8IXNoYWxsb3dFcXVhbChpbnN0LnN0YXRlLG5leHRTdGF0ZSl9fX1pZigi ZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24i P3dhcm5pbmcoc2hvdWxkVXBkYXRlIT09dW5kZWZpbmVkLCIlcy5zaG91bGRDb21wb25lbnRVcGRh dGUoKTogUmV0dXJuZWQgdW5kZWZpbmVkIGluc3RlYWQgb2YgYSAiKyJib29sZWFuIHZhbHVlLiBN YWtlIHN1cmUgdG8gcmV0dXJuIHRydWUgb3IgZmFsc2UuIix0aGlzLmdldE5hbWUoKXx8IlJlYWN0 Q29tcG9zaXRlQ29tcG9uZW50Iik6dm9pZCAwfXRoaXMuX3VwZGF0ZUJhdGNoTnVtYmVyPW51bGw7 aWYoc2hvdWxkVXBkYXRlKXt0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGU9ZmFsc2U7dGhpcy5fcGVy Zm9ybUNvbXBvbmVudFVwZGF0ZShuZXh0UGFyZW50RWxlbWVudCxuZXh0UHJvcHMsbmV4dFN0YXRl LG5leHRDb250ZXh0LHRyYW5zYWN0aW9uLG5leHRVbm1hc2tlZENvbnRleHQpfWVsc2V7dGhpcy5f Y3VycmVudEVsZW1lbnQ9bmV4dFBhcmVudEVsZW1lbnQ7dGhpcy5fY29udGV4dD1uZXh0VW5tYXNr ZWRDb250ZXh0O2luc3QucHJvcHM9bmV4dFByb3BzO2luc3Quc3RhdGU9bmV4dFN0YXRlO2luc3Qu Y29udGV4dD1uZXh0Q29udGV4dH19LF9wcm9jZXNzUGVuZGluZ1N0YXRlOmZ1bmN0aW9uKHByb3Bz LGNvbnRleHQpe3ZhciBpbnN0PXRoaXMuX2luc3RhbmNlO3ZhciBxdWV1ZT10aGlzLl9wZW5kaW5n U3RhdGVRdWV1ZTt2YXIgcmVwbGFjZT10aGlzLl9wZW5kaW5nUmVwbGFjZVN0YXRlO3RoaXMuX3Bl bmRpbmdSZXBsYWNlU3RhdGU9ZmFsc2U7dGhpcy5fcGVuZGluZ1N0YXRlUXVldWU9bnVsbDtpZigh cXVldWUpe3JldHVybiBpbnN0LnN0YXRlfWlmKHJlcGxhY2UmJnF1ZXVlLmxlbmd0aD09PTEpe3Jl dHVybiBxdWV1ZVswXX12YXIgbmV4dFN0YXRlPV9hc3NpZ24oe30scmVwbGFjZT9xdWV1ZVswXTpp bnN0LnN0YXRlKTtmb3IodmFyIGk9cmVwbGFjZT8xOjA7aTxxdWV1ZS5sZW5ndGg7aSsrKXt2YXIg cGFydGlhbD1xdWV1ZVtpXTtfYXNzaWduKG5leHRTdGF0ZSx0eXBlb2YgcGFydGlhbD09PSJmdW5j dGlvbiI/cGFydGlhbC5jYWxsKGluc3QsbmV4dFN0YXRlLHByb3BzLGNvbnRleHQpOnBhcnRpYWwp fXJldHVybiBuZXh0U3RhdGV9LF9wZXJmb3JtQ29tcG9uZW50VXBkYXRlOmZ1bmN0aW9uKG5leHRF bGVtZW50LG5leHRQcm9wcyxuZXh0U3RhdGUsbmV4dENvbnRleHQsdHJhbnNhY3Rpb24sdW5tYXNr ZWRDb250ZXh0KXt2YXIgX3RoaXMyPXRoaXM7dmFyIGluc3Q9dGhpcy5faW5zdGFuY2U7dmFyIGhh c0NvbXBvbmVudERpZFVwZGF0ZT1Cb29sZWFuKGluc3QuY29tcG9uZW50RGlkVXBkYXRlKTt2YXIg cHJldlByb3BzO3ZhciBwcmV2U3RhdGU7dmFyIHByZXZDb250ZXh0O2lmKGhhc0NvbXBvbmVudERp ZFVwZGF0ZSl7cHJldlByb3BzPWluc3QucHJvcHM7cHJldlN0YXRlPWluc3Quc3RhdGU7cHJldkNv bnRleHQ9aW5zdC5jb250ZXh0fWlmKGluc3QuY29tcG9uZW50V2lsbFVwZGF0ZSl7aWYoImRldmVs b3BtZW50IiE9PSJwcm9kdWN0aW9uIil7bWVhc3VyZUxpZmVDeWNsZVBlcmYoZnVuY3Rpb24oKXty ZXR1cm4gaW5zdC5jb21wb25lbnRXaWxsVXBkYXRlKG5leHRQcm9wcyxuZXh0U3RhdGUsbmV4dENv bnRleHQpfSx0aGlzLl9kZWJ1Z0lELCJjb21wb25lbnRXaWxsVXBkYXRlIil9ZWxzZXtpbnN0LmNv bXBvbmVudFdpbGxVcGRhdGUobmV4dFByb3BzLG5leHRTdGF0ZSxuZXh0Q29udGV4dCl9fXRoaXMu X2N1cnJlbnRFbGVtZW50PW5leHRFbGVtZW50O3RoaXMuX2NvbnRleHQ9dW5tYXNrZWRDb250ZXh0 O2luc3QucHJvcHM9bmV4dFByb3BzO2luc3Quc3RhdGU9bmV4dFN0YXRlO2luc3QuY29udGV4dD1u ZXh0Q29udGV4dDt0aGlzLl91cGRhdGVSZW5kZXJlZENvbXBvbmVudCh0cmFuc2FjdGlvbix1bm1h c2tlZENvbnRleHQpO2lmKGhhc0NvbXBvbmVudERpZFVwZGF0ZSl7aWYoImRldmVsb3BtZW50IiE9 PSJwcm9kdWN0aW9uIil7dHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShm dW5jdGlvbigpe21lYXN1cmVMaWZlQ3ljbGVQZXJmKGluc3QuY29tcG9uZW50RGlkVXBkYXRlLmJp bmQoaW5zdCxwcmV2UHJvcHMscHJldlN0YXRlLHByZXZDb250ZXh0KSxfdGhpczIuX2RlYnVnSUQs ImNvbXBvbmVudERpZFVwZGF0ZSIpfSl9ZWxzZXt0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVh ZHkoKS5lbnF1ZXVlKGluc3QuY29tcG9uZW50RGlkVXBkYXRlLmJpbmQoaW5zdCxwcmV2UHJvcHMs cHJldlN0YXRlLHByZXZDb250ZXh0KSxpbnN0KX19fSxfdXBkYXRlUmVuZGVyZWRDb21wb25lbnQ6 ZnVuY3Rpb24odHJhbnNhY3Rpb24sY29udGV4dCl7dmFyIHByZXZDb21wb25lbnRJbnN0YW5jZT10 aGlzLl9yZW5kZXJlZENvbXBvbmVudDt2YXIgcHJldlJlbmRlcmVkRWxlbWVudD1wcmV2Q29tcG9u ZW50SW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50O3ZhciBuZXh0UmVuZGVyZWRFbGVtZW50PXRoaXMu X3JlbmRlclZhbGlkYXRlZENvbXBvbmVudCgpO3ZhciBkZWJ1Z0lEPTA7aWYoImRldmVsb3BtZW50 IiE9PSJwcm9kdWN0aW9uIil7ZGVidWdJRD10aGlzLl9kZWJ1Z0lEfWlmKHNob3VsZFVwZGF0ZVJl YWN0Q29tcG9uZW50KHByZXZSZW5kZXJlZEVsZW1lbnQsbmV4dFJlbmRlcmVkRWxlbWVudCkpe1Jl YWN0UmVjb25jaWxlci5yZWNlaXZlQ29tcG9uZW50KHByZXZDb21wb25lbnRJbnN0YW5jZSxuZXh0 UmVuZGVyZWRFbGVtZW50LHRyYW5zYWN0aW9uLHRoaXMuX3Byb2Nlc3NDaGlsZENvbnRleHQoY29u dGV4dCkpfWVsc2V7dmFyIG9sZEhvc3ROb2RlPVJlYWN0UmVjb25jaWxlci5nZXRIb3N0Tm9kZShw cmV2Q29tcG9uZW50SW5zdGFuY2UpO1JlYWN0UmVjb25jaWxlci51bm1vdW50Q29tcG9uZW50KHBy ZXZDb21wb25lbnRJbnN0YW5jZSxmYWxzZSk7dmFyIG5vZGVUeXBlPVJlYWN0Tm9kZVR5cGVzLmdl dFR5cGUobmV4dFJlbmRlcmVkRWxlbWVudCk7dGhpcy5fcmVuZGVyZWROb2RlVHlwZT1ub2RlVHlw ZTt2YXIgY2hpbGQ9dGhpcy5faW5zdGFudGlhdGVSZWFjdENvbXBvbmVudChuZXh0UmVuZGVyZWRF bGVtZW50LG5vZGVUeXBlIT09UmVhY3ROb2RlVHlwZXMuRU1QVFkpO3RoaXMuX3JlbmRlcmVkQ29t cG9uZW50PWNoaWxkO3ZhciBuZXh0TWFya3VwPVJlYWN0UmVjb25jaWxlci5tb3VudENvbXBvbmVu dChjaGlsZCx0cmFuc2FjdGlvbix0aGlzLl9ob3N0UGFyZW50LHRoaXMuX2hvc3RDb250YWluZXJJ bmZvLHRoaXMuX3Byb2Nlc3NDaGlsZENvbnRleHQoY29udGV4dCksZGVidWdJRCk7aWYoImRldmVs b3BtZW50IiE9PSJwcm9kdWN0aW9uIil7aWYoZGVidWdJRCE9PTApe3ZhciBjaGlsZERlYnVnSURz PWNoaWxkLl9kZWJ1Z0lEIT09MD9bY2hpbGQuX2RlYnVnSURdOltdO1JlYWN0SW5zdHJ1bWVudGF0 aW9uLmRlYnVnVG9vbC5vblNldENoaWxkcmVuKGRlYnVnSUQsY2hpbGREZWJ1Z0lEcyl9fXRoaXMu X3JlcGxhY2VOb2RlV2l0aE1hcmt1cChvbGRIb3N0Tm9kZSxuZXh0TWFya3VwLHByZXZDb21wb25l bnRJbnN0YW5jZSl9fSxfcmVwbGFjZU5vZGVXaXRoTWFya3VwOmZ1bmN0aW9uKG9sZEhvc3ROb2Rl LG5leHRNYXJrdXAscHJldkluc3RhbmNlKXtSZWFjdENvbXBvbmVudEVudmlyb25tZW50LnJlcGxh Y2VOb2RlV2l0aE1hcmt1cChvbGRIb3N0Tm9kZSxuZXh0TWFya3VwLHByZXZJbnN0YW5jZSl9LF9y ZW5kZXJWYWxpZGF0ZWRDb21wb25lbnRXaXRob3V0T3duZXJPckNvbnRleHQ6ZnVuY3Rpb24oKXt2 YXIgaW5zdD10aGlzLl9pbnN0YW5jZTt2YXIgcmVuZGVyZWRFbGVtZW50O2lmKCJkZXZlbG9wbWVu dCIhPT0icHJvZHVjdGlvbiIpe3JlbmRlcmVkRWxlbWVudD1tZWFzdXJlTGlmZUN5Y2xlUGVyZihm dW5jdGlvbigpe3JldHVybiBpbnN0LnJlbmRlcigpfSx0aGlzLl9kZWJ1Z0lELCJyZW5kZXIiKX1l bHNle3JlbmRlcmVkRWxlbWVudD1pbnN0LnJlbmRlcigpfWlmKCJkZXZlbG9wbWVudCIhPT0icHJv ZHVjdGlvbiIpe2lmKHJlbmRlcmVkRWxlbWVudD09PXVuZGVmaW5lZCYmaW5zdC5yZW5kZXIuX2lz TW9ja0Z1bmN0aW9uKXtyZW5kZXJlZEVsZW1lbnQ9bnVsbH19cmV0dXJuIHJlbmRlcmVkRWxlbWVu dH0sX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudDpmdW5jdGlvbigpe3ZhciByZW5kZXJlZEVsZW1l bnQ7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uInx8dGhpcy5fY29tcG9zaXRlVHlwZSE9 PUNvbXBvc2l0ZVR5cGVzLlN0YXRlbGVzc0Z1bmN0aW9uYWwpe1JlYWN0Q3VycmVudE93bmVyLmN1 cnJlbnQ9dGhpczt0cnl7cmVuZGVyZWRFbGVtZW50PXRoaXMuX3JlbmRlclZhbGlkYXRlZENvbXBv bmVudFdpdGhvdXRPd25lck9yQ29udGV4dCgpfWZpbmFsbHl7UmVhY3RDdXJyZW50T3duZXIuY3Vy cmVudD1udWxsfX1lbHNle3JlbmRlcmVkRWxlbWVudD10aGlzLl9yZW5kZXJWYWxpZGF0ZWRDb21w b25lbnRXaXRob3V0T3duZXJPckNvbnRleHQoKX0hKHJlbmRlcmVkRWxlbWVudD09PW51bGx8fHJl bmRlcmVkRWxlbWVudD09PWZhbHNlfHxSZWFjdC5pc1ZhbGlkRWxlbWVudChyZW5kZXJlZEVsZW1l bnQpKT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiJXMucmVu ZGVyKCk6IEEgdmFsaWQgUmVhY3QgZWxlbWVudCAob3IgbnVsbCkgbXVzdCBiZSByZXR1cm5lZC4g WW91IG1heSBoYXZlIHJldHVybmVkIHVuZGVmaW5lZCwgYW4gYXJyYXkgb3Igc29tZSBvdGhlciBp bnZhbGlkIG9iamVjdC4iLHRoaXMuZ2V0TmFtZSgpfHwiUmVhY3RDb21wb3NpdGVDb21wb25lbnQi KTpfcHJvZEludmFyaWFudCgiMTA5Iix0aGlzLmdldE5hbWUoKXx8IlJlYWN0Q29tcG9zaXRlQ29t cG9uZW50Iik6dm9pZCAwO3JldHVybiByZW5kZXJlZEVsZW1lbnR9LGF0dGFjaFJlZjpmdW5jdGlv bihyZWYsY29tcG9uZW50KXt2YXIgaW5zdD10aGlzLmdldFB1YmxpY0luc3RhbmNlKCk7IShpbnN0 IT1udWxsKT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiU3Rh dGVsZXNzIGZ1bmN0aW9uIGNvbXBvbmVudHMgY2Fubm90IGhhdmUgcmVmcy4iKTpfcHJvZEludmFy aWFudCgiMTEwIik6dm9pZCAwO3ZhciBwdWJsaWNDb21wb25lbnRJbnN0YW5jZT1jb21wb25lbnQu Z2V0UHVibGljSW5zdGFuY2UoKTtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXt2YXIg Y29tcG9uZW50TmFtZT1jb21wb25lbnQmJmNvbXBvbmVudC5nZXROYW1lP2NvbXBvbmVudC5nZXRO YW1lKCk6ImEgY29tcG9uZW50IjsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmco cHVibGljQ29tcG9uZW50SW5zdGFuY2UhPW51bGx8fGNvbXBvbmVudC5fY29tcG9zaXRlVHlwZSE9 PUNvbXBvc2l0ZVR5cGVzLlN0YXRlbGVzc0Z1bmN0aW9uYWwsIlN0YXRlbGVzcyBmdW5jdGlvbiBj b21wb25lbnRzIGNhbm5vdCBiZSBnaXZlbiByZWZzICIrJyhTZWUgcmVmICIlcyIgaW4gJXMgY3Jl YXRlZCBieSAlcykuICcrIkF0dGVtcHRzIHRvIGFjY2VzcyB0aGlzIHJlZiB3aWxsIGZhaWwuIixy ZWYsY29tcG9uZW50TmFtZSx0aGlzLmdldE5hbWUoKSk6dm9pZCAwfXZhciByZWZzPWluc3QucmVm cz09PWVtcHR5T2JqZWN0P2luc3QucmVmcz17fTppbnN0LnJlZnM7cmVmc1tyZWZdPXB1YmxpY0Nv bXBvbmVudEluc3RhbmNlfSxkZXRhY2hSZWY6ZnVuY3Rpb24ocmVmKXt2YXIgcmVmcz10aGlzLmdl dFB1YmxpY0luc3RhbmNlKCkucmVmcztkZWxldGUgcmVmc1tyZWZdfSxnZXROYW1lOmZ1bmN0aW9u KCl7dmFyIHR5cGU9dGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTt2YXIgY29uc3RydWN0b3I9dGhp cy5faW5zdGFuY2UmJnRoaXMuX2luc3RhbmNlLmNvbnN0cnVjdG9yO3JldHVybiB0eXBlLmRpc3Bs YXlOYW1lfHxjb25zdHJ1Y3RvciYmY29uc3RydWN0b3IuZGlzcGxheU5hbWV8fHR5cGUubmFtZXx8 Y29uc3RydWN0b3ImJmNvbnN0cnVjdG9yLm5hbWV8fG51bGx9LGdldFB1YmxpY0luc3RhbmNlOmZ1 bmN0aW9uKCl7dmFyIGluc3Q9dGhpcy5faW5zdGFuY2U7aWYodGhpcy5fY29tcG9zaXRlVHlwZT09 PUNvbXBvc2l0ZVR5cGVzLlN0YXRlbGVzc0Z1bmN0aW9uYWwpe3JldHVybiBudWxsfXJldHVybiBp bnN0fSxfaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudDpudWxsfTttb2R1bGUuZXhwb3J0cz1SZWFj dENvbXBvc2l0ZUNvbXBvbmVudH0sezExNjoxMTYsMTE5OjExOSwxMjM6MTIzLDEyNDoxMjQsMTMz OjEzMywxNDA6MTQwLDE0NjoxNDYsMTQ3OjE0NywxNDg6MTQ4LDI4OjI4LDUwOjUwLDU4OjU4LDU5 OjU5LDYzOjYzLDY4OjY4LDk3Ojk3fV0sMzA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9y dHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgX3Byb2RJbnZhcmlhbnQ9X2RlcmVxXygxMTYpLF9hc3NpZ249 X2RlcmVxXygxNDgpO3ZhciBBdXRvRm9jdXNVdGlscz1fZGVyZXFfKDIpO3ZhciBDU1NQcm9wZXJ0 eU9wZXJhdGlvbnM9X2RlcmVxXyg1KTt2YXIgRE9NTGF6eVRyZWU9X2RlcmVxXyg5KTt2YXIgRE9N TmFtZXNwYWNlcz1fZGVyZXFfKDEwKTt2YXIgRE9NUHJvcGVydHk9X2RlcmVxXygxMSk7dmFyIERP TVByb3BlcnR5T3BlcmF0aW9ucz1fZGVyZXFfKDEyKTt2YXIgRXZlbnRQbHVnaW5IdWI9X2RlcmVx XygxNik7dmFyIEV2ZW50UGx1Z2luUmVnaXN0cnk9X2RlcmVxXygxNyk7dmFyIFJlYWN0QnJvd3Nl ckV2ZW50RW1pdHRlcj1fZGVyZXFfKDI1KTt2YXIgUmVhY3RET01Db21wb25lbnRGbGFncz1fZGVy ZXFfKDMxKTt2YXIgUmVhY3RET01Db21wb25lbnRUcmVlPV9kZXJlcV8oMzIpO3ZhciBSZWFjdERP TUlucHV0PV9kZXJlcV8oMzYpO3ZhciBSZWFjdERPTU9wdGlvbj1fZGVyZXFfKDM3KTt2YXIgUmVh Y3RET01TZWxlY3Q9X2RlcmVxXygzOCk7dmFyIFJlYWN0RE9NVGV4dGFyZWE9X2RlcmVxXyg0Myk7 dmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uPV9kZXJlcV8oNTkpO3ZhciBSZWFjdE11bHRpQ2hpbGQ9 X2RlcmVxXyg2Mik7dmFyIFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb249X2RlcmVxXyg3 Mik7dmFyIGVtcHR5RnVuY3Rpb249X2RlcmVxXygxMzIpO3ZhciBlc2NhcGVUZXh0Q29udGVudEZv ckJyb3dzZXI9X2RlcmVxXygxMDApO3ZhciBpbnZhcmlhbnQ9X2RlcmVxXygxNDApO3ZhciBpc0V2 ZW50U3VwcG9ydGVkPV9kZXJlcV8oMTEzKTt2YXIgc2hhbGxvd0VxdWFsPV9kZXJlcV8oMTQ2KTt2 YXIgdmFsaWRhdGVET01OZXN0aW5nPV9kZXJlcV8oMTIxKTt2YXIgd2FybmluZz1fZGVyZXFfKDE0 Nyk7dmFyIEZsYWdzPVJlYWN0RE9NQ29tcG9uZW50RmxhZ3M7dmFyIGRlbGV0ZUxpc3RlbmVyPUV2 ZW50UGx1Z2luSHViLmRlbGV0ZUxpc3RlbmVyO3ZhciBnZXROb2RlPVJlYWN0RE9NQ29tcG9uZW50 VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlO3ZhciBsaXN0ZW5Ubz1SZWFjdEJyb3dzZXJFdmVudEVt aXR0ZXIubGlzdGVuVG87dmFyIHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzPUV2ZW50UGx1Z2luUmVn aXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXM7dmFyIENPTlRFTlRfVFlQRVM9e3N0cmluZzp0 cnVlLG51bWJlcjp0cnVlfTt2YXIgU1RZTEU9InN0eWxlIjt2YXIgSFRNTD0iX19odG1sIjt2YXIg UkVTRVJWRURfUFJPUFM9e2NoaWxkcmVuOm51bGwsZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6bnVs bCxzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmc6bnVsbH07dmFyIERPQ19GUkFHTUVOVF9U WVBFPTExO2Z1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShpbnRlcm5hbEluc3Rh bmNlKXtpZihpbnRlcm5hbEluc3RhbmNlKXt2YXIgb3duZXI9aW50ZXJuYWxJbnN0YW5jZS5fY3Vy cmVudEVsZW1lbnQuX293bmVyfHxudWxsO2lmKG93bmVyKXt2YXIgbmFtZT1vd25lci5nZXROYW1l KCk7aWYobmFtZSl7cmV0dXJuIiBUaGlzIERPTSBub2RlIHdhcyByZW5kZXJlZCBieSBgIituYW1l KyJgLiJ9fX1yZXR1cm4iIn1mdW5jdGlvbiBmcmllbmRseVN0cmluZ2lmeShvYmope2lmKHR5cGVv ZiBvYmo9PT0ib2JqZWN0Iil7aWYoQXJyYXkuaXNBcnJheShvYmopKXtyZXR1cm4iWyIrb2JqLm1h cChmcmllbmRseVN0cmluZ2lmeSkuam9pbigiLCAiKSsiXSJ9ZWxzZXt2YXIgcGFpcnM9W107Zm9y KHZhciBrZXkgaW4gb2JqKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwo b2JqLGtleSkpe3ZhciBrZXlFc2NhcGVkPS9eW2EteiRfXVtcdyRfXSokL2kudGVzdChrZXkpP2tl eTpKU09OLnN0cmluZ2lmeShrZXkpO3BhaXJzLnB1c2goa2V5RXNjYXBlZCsiOiAiK2ZyaWVuZGx5 U3RyaW5naWZ5KG9ialtrZXldKSl9fXJldHVybiJ7IitwYWlycy5qb2luKCIsICIpKyJ9In19ZWxz ZSBpZih0eXBlb2Ygb2JqPT09InN0cmluZyIpe3JldHVybiBKU09OLnN0cmluZ2lmeShvYmopfWVs c2UgaWYodHlwZW9mIG9iaj09PSJmdW5jdGlvbiIpe3JldHVybiJbZnVuY3Rpb24gb2JqZWN0XSJ9 cmV0dXJuIFN0cmluZyhvYmopfXZhciBzdHlsZU11dGF0aW9uV2FybmluZz17fTtmdW5jdGlvbiBj aGVja0FuZFdhcm5Gb3JNdXRhdGVkU3R5bGUoc3R5bGUxLHN0eWxlMixjb21wb25lbnQpe2lmKHN0 eWxlMT09bnVsbHx8c3R5bGUyPT1udWxsKXtyZXR1cm59aWYoc2hhbGxvd0VxdWFsKHN0eWxlMSxz dHlsZTIpKXtyZXR1cm59dmFyIGNvbXBvbmVudE5hbWU9Y29tcG9uZW50Ll90YWc7dmFyIG93bmVy PWNvbXBvbmVudC5fY3VycmVudEVsZW1lbnQuX293bmVyO3ZhciBvd25lck5hbWU7aWYob3duZXIp e293bmVyTmFtZT1vd25lci5nZXROYW1lKCl9dmFyIGhhc2g9b3duZXJOYW1lKyJ8Iitjb21wb25l bnROYW1lO2lmKHN0eWxlTXV0YXRpb25XYXJuaW5nLmhhc093blByb3BlcnR5KGhhc2gpKXtyZXR1 cm59c3R5bGVNdXRhdGlvbldhcm5pbmdbaGFzaF09dHJ1ZTsiZGV2ZWxvcG1lbnQiIT09InByb2R1 Y3Rpb24iP3dhcm5pbmcoZmFsc2UsImAlc2Agd2FzIHBhc3NlZCBhIHN0eWxlIG9iamVjdCB0aGF0 IGhhcyBwcmV2aW91c2x5IGJlZW4gbXV0YXRlZC4gIisiTXV0YXRpbmcgYHN0eWxlYCBpcyBkZXBy ZWNhdGVkLiBDb25zaWRlciBjbG9uaW5nIGl0IGJlZm9yZWhhbmQuIENoZWNrICIrInRoZSBgcmVu ZGVyYCAlcy4gUHJldmlvdXMgc3R5bGU6ICVzLiBNdXRhdGVkIHN0eWxlOiAlcy4iLGNvbXBvbmVu dE5hbWUsb3duZXI/Im9mIGAiK293bmVyTmFtZSsiYCI6InVzaW5nIDwiK2NvbXBvbmVudE5hbWUr Ij4iLGZyaWVuZGx5U3RyaW5naWZ5KHN0eWxlMSksZnJpZW5kbHlTdHJpbmdpZnkoc3R5bGUyKSk6 dm9pZCAwfWZ1bmN0aW9uIGFzc2VydFZhbGlkUHJvcHMoY29tcG9uZW50LHByb3BzKXtpZighcHJv cHMpe3JldHVybn1pZih2b2lkRWxlbWVudFRhZ3NbY29tcG9uZW50Ll90YWddKXshKHByb3BzLmNo aWxkcmVuPT1udWxsJiZwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTD09bnVsbCk/ImRldmVs b3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsIiVzIGlzIGEgdm9pZCBlbGVt ZW50IHRhZyBhbmQgbXVzdCBuZWl0aGVyIGhhdmUgYGNoaWxkcmVuYCBub3IgdXNlIGBkYW5nZXJv dXNseVNldElubmVySFRNTGAuJXMiLGNvbXBvbmVudC5fdGFnLGNvbXBvbmVudC5fY3VycmVudEVs ZW1lbnQuX293bmVyPyIgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgIitjb21wb25lbnQuX2N1 cnJlbnRFbGVtZW50Ll9vd25lci5nZXROYW1lKCkrIi4iOiIiKTpfcHJvZEludmFyaWFudCgiMTM3 Iixjb21wb25lbnQuX3RhZyxjb21wb25lbnQuX2N1cnJlbnRFbGVtZW50Ll9vd25lcj8iIENoZWNr IHRoZSByZW5kZXIgbWV0aG9kIG9mICIrY29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC5fb3duZXIu Z2V0TmFtZSgpKyIuIjoiIik6dm9pZCAwfWlmKHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1M IT1udWxsKXshKHByb3BzLmNoaWxkcmVuPT1udWxsKT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rp b24iP2ludmFyaWFudChmYWxzZSwiQ2FuIG9ubHkgc2V0IG9uZSBvZiBgY2hpbGRyZW5gIG9yIGBw cm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAuIik6X3Byb2RJbnZhcmlhbnQoIjYwIik6dm9p ZCAwOyEodHlwZW9mIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPT09Im9iamVjdCImJkhU TUwgaW4gcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpPyJkZXZlbG9wbWVudCIhPT0icHJv ZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxg IG11c3QgYmUgaW4gdGhlIGZvcm0gYHtfX2h0bWw6IC4uLn1gLiBQbGVhc2UgdmlzaXQgaHR0cHM6 Ly9mYi5tZS9yZWFjdC1pbnZhcmlhbnQtZGFuZ2Vyb3VzbHktc2V0LWlubmVyLWh0bWwgZm9yIG1v cmUgaW5mb3JtYXRpb24uIik6X3Byb2RJbnZhcmlhbnQoIjYxIik6dm9pZCAwfWlmKCJkZXZlbG9w bWVudCIhPT0icHJvZHVjdGlvbiIpeyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2Fybmlu Zyhwcm9wcy5pbm5lckhUTUw9PW51bGwsIkRpcmVjdGx5IHNldHRpbmcgcHJvcGVydHkgYGlubmVy SFRNTGAgaXMgbm90IHBlcm1pdHRlZC4gIisiRm9yIG1vcmUgaW5mb3JtYXRpb24sIGxvb2t1cCBk b2N1bWVudGF0aW9uIG9uIGBkYW5nZXJvdXNseVNldElubmVySFRNTGAuIik6dm9pZCAwOyJkZXZl bG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyhwcm9wcy5zdXBwcmVzc0NvbnRlbnRFZGl0 YWJsZVdhcm5pbmd8fCFwcm9wcy5jb250ZW50RWRpdGFibGV8fHByb3BzLmNoaWxkcmVuPT1udWxs LCJBIGNvbXBvbmVudCBpcyBgY29udGVudEVkaXRhYmxlYCBhbmQgY29udGFpbnMgYGNoaWxkcmVu YCBtYW5hZ2VkIGJ5ICIrIlJlYWN0LiBJdCBpcyBub3cgeW91ciByZXNwb25zaWJpbGl0eSB0byBn dWFyYW50ZWUgdGhhdCBub25lIG9mICIrInRob3NlIG5vZGVzIGFyZSB1bmV4cGVjdGVkbHkgbW9k aWZpZWQgb3IgZHVwbGljYXRlZC4gVGhpcyBpcyAiKyJwcm9iYWJseSBub3QgaW50ZW50aW9uYWwu Iik6dm9pZCAwOyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyhwcm9wcy5vbkZv Y3VzSW49PW51bGwmJnByb3BzLm9uRm9jdXNPdXQ9PW51bGwsIlJlYWN0IHVzZXMgb25Gb2N1cyBh bmQgb25CbHVyIGluc3RlYWQgb2Ygb25Gb2N1c0luIGFuZCBvbkZvY3VzT3V0LiAiKyJBbGwgUmVh Y3QgZXZlbnRzIGFyZSBub3JtYWxpemVkIHRvIGJ1YmJsZSwgc28gb25Gb2N1c0luIGFuZCBvbkZv Y3VzT3V0ICIrImFyZSBub3QgbmVlZGVkL3N1cHBvcnRlZCBieSBSZWFjdC4iKTp2b2lkIDB9IShw cm9wcy5zdHlsZT09bnVsbHx8dHlwZW9mIHByb3BzLnN0eWxlPT09Im9iamVjdCIpPyJkZXZlbG9w bWVudCIhPT0icHJvZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJUaGUgYHN0eWxlYCBwcm9wIGV4 cGVjdHMgYSBtYXBwaW5nIGZyb20gc3R5bGUgcHJvcGVydGllcyB0byB2YWx1ZXMsIG5vdCBhIHN0 cmluZy4gRm9yIGV4YW1wbGUsIHN0eWxlPXt7bWFyZ2luUmlnaHQ6IHNwYWNpbmcgKyAnZW0nfX0g d2hlbiB1c2luZyBKU1guJXMiLGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShjb21wb25lbnQp KTpfcHJvZEludmFyaWFudCgiNjIiLGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShjb21wb25l bnQpKTp2b2lkIDB9ZnVuY3Rpb24gZW5xdWV1ZVB1dExpc3RlbmVyKGluc3QscmVnaXN0cmF0aW9u TmFtZSxsaXN0ZW5lcix0cmFuc2FjdGlvbil7aWYodHJhbnNhY3Rpb24gaW5zdGFuY2VvZiBSZWFj dFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9uKXtyZXR1cm59aWYoImRldmVsb3BtZW50IiE9PSJw cm9kdWN0aW9uIil7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKHJlZ2lzdHJh dGlvbk5hbWUhPT0ib25TY3JvbGwifHxpc0V2ZW50U3VwcG9ydGVkKCJzY3JvbGwiLHRydWUpLCJU aGlzIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IHRoZSBgb25TY3JvbGxgIGV2ZW50Iik6dm9pZCAw fXZhciBjb250YWluZXJJbmZvPWluc3QuX2hvc3RDb250YWluZXJJbmZvO3ZhciBpc0RvY3VtZW50 RnJhZ21lbnQ9Y29udGFpbmVySW5mby5fbm9kZSYmY29udGFpbmVySW5mby5fbm9kZS5ub2RlVHlw ZT09PURPQ19GUkFHTUVOVF9UWVBFO3ZhciBkb2M9aXNEb2N1bWVudEZyYWdtZW50P2NvbnRhaW5l ckluZm8uX25vZGU6Y29udGFpbmVySW5mby5fb3duZXJEb2N1bWVudDtsaXN0ZW5UbyhyZWdpc3Ry YXRpb25OYW1lLGRvYyk7dHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShw dXRMaXN0ZW5lcix7aW5zdDppbnN0LHJlZ2lzdHJhdGlvbk5hbWU6cmVnaXN0cmF0aW9uTmFtZSxs aXN0ZW5lcjpsaXN0ZW5lcn0pfWZ1bmN0aW9uIHB1dExpc3RlbmVyKCl7dmFyIGxpc3RlbmVyVG9Q dXQ9dGhpcztFdmVudFBsdWdpbkh1Yi5wdXRMaXN0ZW5lcihsaXN0ZW5lclRvUHV0Lmluc3QsbGlz dGVuZXJUb1B1dC5yZWdpc3RyYXRpb25OYW1lLGxpc3RlbmVyVG9QdXQubGlzdGVuZXIpfWZ1bmN0 aW9uIGlucHV0UG9zdE1vdW50KCl7dmFyIGluc3Q9dGhpcztSZWFjdERPTUlucHV0LnBvc3RNb3Vu dFdyYXBwZXIoaW5zdCl9ZnVuY3Rpb24gdGV4dGFyZWFQb3N0TW91bnQoKXt2YXIgaW5zdD10aGlz O1JlYWN0RE9NVGV4dGFyZWEucG9zdE1vdW50V3JhcHBlcihpbnN0KX1mdW5jdGlvbiBvcHRpb25Q b3N0TW91bnQoKXt2YXIgaW5zdD10aGlzO1JlYWN0RE9NT3B0aW9uLnBvc3RNb3VudFdyYXBwZXIo aW5zdCl9dmFyIHNldEFuZFZhbGlkYXRlQ29udGVudENoaWxkRGV2PWVtcHR5RnVuY3Rpb247aWYo ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7c2V0QW5kVmFsaWRhdGVDb250ZW50Q2hpbGRE ZXY9ZnVuY3Rpb24oY29udGVudCl7dmFyIGhhc0V4aXN0aW5nQ29udGVudD10aGlzLl9jb250ZW50 RGVidWdJRCE9bnVsbDt2YXIgZGVidWdJRD10aGlzLl9kZWJ1Z0lEO3ZhciBjb250ZW50RGVidWdJ RD0tZGVidWdJRDtpZihjb250ZW50PT1udWxsKXtpZihoYXNFeGlzdGluZ0NvbnRlbnQpe1JlYWN0 SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblVubW91bnRDb21wb25lbnQodGhpcy5fY29udGVu dERlYnVnSUQpfXRoaXMuX2NvbnRlbnREZWJ1Z0lEPW51bGw7cmV0dXJufXZhbGlkYXRlRE9NTmVz dGluZyhudWxsLFN0cmluZyhjb250ZW50KSx0aGlzLHRoaXMuX2FuY2VzdG9ySW5mbyk7dGhpcy5f Y29udGVudERlYnVnSUQ9Y29udGVudERlYnVnSUQ7aWYoaGFzRXhpc3RpbmdDb250ZW50KXtSZWFj dEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWZvcmVVcGRhdGVDb21wb25lbnQoY29udGVu dERlYnVnSUQsY29udGVudCk7UmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uVXBkYXRl Q29tcG9uZW50KGNvbnRlbnREZWJ1Z0lEKX1lbHNle1JlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVn VG9vbC5vbkJlZm9yZU1vdW50Q29tcG9uZW50KGNvbnRlbnREZWJ1Z0lELGNvbnRlbnQsZGVidWdJ RCk7UmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uTW91bnRDb21wb25lbnQoY29udGVu dERlYnVnSUQpO1JlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblNldENoaWxkcmVuKGRl YnVnSUQsW2NvbnRlbnREZWJ1Z0lEXSl9fX12YXIgbWVkaWFFdmVudHM9e3RvcEFib3J0OiJhYm9y dCIsdG9wQ2FuUGxheToiY2FucGxheSIsdG9wQ2FuUGxheVRocm91Z2g6ImNhbnBsYXl0aHJvdWdo Iix0b3BEdXJhdGlvbkNoYW5nZToiZHVyYXRpb25jaGFuZ2UiLHRvcEVtcHRpZWQ6ImVtcHRpZWQi LHRvcEVuY3J5cHRlZDoiZW5jcnlwdGVkIix0b3BFbmRlZDoiZW5kZWQiLHRvcEVycm9yOiJlcnJv ciIsdG9wTG9hZGVkRGF0YToibG9hZGVkZGF0YSIsdG9wTG9hZGVkTWV0YWRhdGE6ImxvYWRlZG1l dGFkYXRhIix0b3BMb2FkU3RhcnQ6ImxvYWRzdGFydCIsdG9wUGF1c2U6InBhdXNlIix0b3BQbGF5 OiJwbGF5Iix0b3BQbGF5aW5nOiJwbGF5aW5nIix0b3BQcm9ncmVzczoicHJvZ3Jlc3MiLHRvcFJh dGVDaGFuZ2U6InJhdGVjaGFuZ2UiLHRvcFNlZWtlZDoic2Vla2VkIix0b3BTZWVraW5nOiJzZWVr aW5nIix0b3BTdGFsbGVkOiJzdGFsbGVkIix0b3BTdXNwZW5kOiJzdXNwZW5kIix0b3BUaW1lVXBk YXRlOiJ0aW1ldXBkYXRlIix0b3BWb2x1bWVDaGFuZ2U6InZvbHVtZWNoYW5nZSIsdG9wV2FpdGlu Zzoid2FpdGluZyJ9O2Z1bmN0aW9uIHRyYXBCdWJibGVkRXZlbnRzTG9jYWwoKXt2YXIgaW5zdD10 aGlzOyFpbnN0Ll9yb290Tm9kZUlEPyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/aW52YXJp YW50KGZhbHNlLCJNdXN0IGJlIG1vdW50ZWQgdG8gdHJhcCBldmVudHMiKTpfcHJvZEludmFyaWFu dCgiNjMiKTp2b2lkIDA7dmFyIG5vZGU9Z2V0Tm9kZShpbnN0KTshbm9kZT8iZGV2ZWxvcG1lbnQi IT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwidHJhcEJ1YmJsZWRFdmVudCguLi4pOiBS ZXF1aXJlcyBub2RlIHRvIGJlIHJlbmRlcmVkLiIpOl9wcm9kSW52YXJpYW50KCI2NCIpOnZvaWQg MDtzd2l0Y2goaW5zdC5fdGFnKXtjYXNlImlmcmFtZSI6Y2FzZSJvYmplY3QiOmluc3QuX3dyYXBw ZXJTdGF0ZS5saXN0ZW5lcnM9W1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci50cmFwQnViYmxlZEV2 ZW50KCJ0b3BMb2FkIiwibG9hZCIsbm9kZSldO2JyZWFrO2Nhc2UidmlkZW8iOmNhc2UiYXVkaW8i Omluc3QuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM9W107Zm9yKHZhciBldmVudCBpbiBtZWRpYUV2 ZW50cyl7aWYobWVkaWFFdmVudHMuaGFzT3duUHJvcGVydHkoZXZlbnQpKXtpbnN0Ll93cmFwcGVy U3RhdGUubGlzdGVuZXJzLnB1c2goUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLnRyYXBCdWJibGVk RXZlbnQoZXZlbnQsbWVkaWFFdmVudHNbZXZlbnRdLG5vZGUpKX19YnJlYWs7Y2FzZSJzb3VyY2Ui Omluc3QuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM9W1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci50 cmFwQnViYmxlZEV2ZW50KCJ0b3BFcnJvciIsImVycm9yIixub2RlKV07YnJlYWs7Y2FzZSJpbWci Omluc3QuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM9W1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci50 cmFwQnViYmxlZEV2ZW50KCJ0b3BFcnJvciIsImVycm9yIixub2RlKSxSZWFjdEJyb3dzZXJFdmVu dEVtaXR0ZXIudHJhcEJ1YmJsZWRFdmVudCgidG9wTG9hZCIsImxvYWQiLG5vZGUpXTticmVhaztj YXNlImZvcm0iOmluc3QuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM9W1JlYWN0QnJvd3NlckV2ZW50 RW1pdHRlci50cmFwQnViYmxlZEV2ZW50KCJ0b3BSZXNldCIsInJlc2V0Iixub2RlKSxSZWFjdEJy b3dzZXJFdmVudEVtaXR0ZXIudHJhcEJ1YmJsZWRFdmVudCgidG9wU3VibWl0Iiwic3VibWl0Iixu b2RlKV07YnJlYWs7Y2FzZSJpbnB1dCI6Y2FzZSJzZWxlY3QiOmNhc2UidGV4dGFyZWEiOmluc3Qu X3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM9W1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci50cmFwQnVi YmxlZEV2ZW50KCJ0b3BJbnZhbGlkIiwiaW52YWxpZCIsbm9kZSldO2JyZWFrfX1mdW5jdGlvbiBw b3N0VXBkYXRlU2VsZWN0V3JhcHBlcigpe1JlYWN0RE9NU2VsZWN0LnBvc3RVcGRhdGVXcmFwcGVy KHRoaXMpfXZhciBvbWl0dGVkQ2xvc2VUYWdzPXthcmVhOnRydWUsYmFzZTp0cnVlLGJyOnRydWUs Y29sOnRydWUsZW1iZWQ6dHJ1ZSxocjp0cnVlLGltZzp0cnVlLGlucHV0OnRydWUsa2V5Z2VuOnRy dWUsbGluazp0cnVlLG1ldGE6dHJ1ZSxwYXJhbTp0cnVlLHNvdXJjZTp0cnVlLHRyYWNrOnRydWUs d2JyOnRydWV9O3ZhciBuZXdsaW5lRWF0aW5nVGFncz17bGlzdGluZzp0cnVlLHByZTp0cnVlLHRl eHRhcmVhOnRydWV9O3ZhciB2b2lkRWxlbWVudFRhZ3M9X2Fzc2lnbih7bWVudWl0ZW06dHJ1ZX0s b21pdHRlZENsb3NlVGFncyk7dmFyIFZBTElEX1RBR19SRUdFWD0vXlthLXpBLVpdW2EtekEtWjpf XC5cLVxkXSokLzt2YXIgdmFsaWRhdGVkVGFnQ2FjaGU9e307dmFyIGhhc093blByb3BlcnR5PXt9 Lmhhc093blByb3BlcnR5O2Z1bmN0aW9uIHZhbGlkYXRlRGFuZ2Vyb3VzVGFnKHRhZyl7aWYoIWhh c093blByb3BlcnR5LmNhbGwodmFsaWRhdGVkVGFnQ2FjaGUsdGFnKSl7IVZBTElEX1RBR19SRUdF WC50ZXN0KHRhZyk/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2Us IkludmFsaWQgdGFnOiAlcyIsdGFnKTpfcHJvZEludmFyaWFudCgiNjUiLHRhZyk6dm9pZCAwO3Zh bGlkYXRlZFRhZ0NhY2hlW3RhZ109dHJ1ZX19ZnVuY3Rpb24gaXNDdXN0b21Db21wb25lbnQodGFn TmFtZSxwcm9wcyl7cmV0dXJuIHRhZ05hbWUuaW5kZXhPZigiLSIpPj0wfHxwcm9wcy5pcyE9bnVs bH12YXIgZ2xvYmFsSWRDb3VudGVyPTE7ZnVuY3Rpb24gUmVhY3RET01Db21wb25lbnQoZWxlbWVu dCl7dmFyIHRhZz1lbGVtZW50LnR5cGU7dmFsaWRhdGVEYW5nZXJvdXNUYWcodGFnKTt0aGlzLl9j dXJyZW50RWxlbWVudD1lbGVtZW50O3RoaXMuX3RhZz10YWcudG9Mb3dlckNhc2UoKTt0aGlzLl9u YW1lc3BhY2VVUkk9bnVsbDt0aGlzLl9yZW5kZXJlZENoaWxkcmVuPW51bGw7dGhpcy5fcHJldmlv dXNTdHlsZT1udWxsO3RoaXMuX3ByZXZpb3VzU3R5bGVDb3B5PW51bGw7dGhpcy5faG9zdE5vZGU9 bnVsbDt0aGlzLl9ob3N0UGFyZW50PW51bGw7dGhpcy5fcm9vdE5vZGVJRD0wO3RoaXMuX2RvbUlE PTA7dGhpcy5faG9zdENvbnRhaW5lckluZm89bnVsbDt0aGlzLl93cmFwcGVyU3RhdGU9bnVsbDt0 aGlzLl90b3BMZXZlbFdyYXBwZXI9bnVsbDt0aGlzLl9mbGFncz0wO2lmKCJkZXZlbG9wbWVudCIh PT0icHJvZHVjdGlvbiIpe3RoaXMuX2FuY2VzdG9ySW5mbz1udWxsO3NldEFuZFZhbGlkYXRlQ29u dGVudENoaWxkRGV2LmNhbGwodGhpcyxudWxsKX19UmVhY3RET01Db21wb25lbnQuZGlzcGxheU5h bWU9IlJlYWN0RE9NQ29tcG9uZW50IjtSZWFjdERPTUNvbXBvbmVudC5NaXhpbj17bW91bnRDb21w b25lbnQ6ZnVuY3Rpb24odHJhbnNhY3Rpb24saG9zdFBhcmVudCxob3N0Q29udGFpbmVySW5mbyxj b250ZXh0KXt0aGlzLl9yb290Tm9kZUlEPWdsb2JhbElkQ291bnRlcisrO3RoaXMuX2RvbUlEPWhv c3RDb250YWluZXJJbmZvLl9pZENvdW50ZXIrKzt0aGlzLl9ob3N0UGFyZW50PWhvc3RQYXJlbnQ7 dGhpcy5faG9zdENvbnRhaW5lckluZm89aG9zdENvbnRhaW5lckluZm87dmFyIHByb3BzPXRoaXMu X2N1cnJlbnRFbGVtZW50LnByb3BzO3N3aXRjaCh0aGlzLl90YWcpe2Nhc2UiYXVkaW8iOmNhc2Ui Zm9ybSI6Y2FzZSJpZnJhbWUiOmNhc2UiaW1nIjpjYXNlImxpbmsiOmNhc2Uib2JqZWN0IjpjYXNl InNvdXJjZSI6Y2FzZSJ2aWRlbyI6dGhpcy5fd3JhcHBlclN0YXRlPXtsaXN0ZW5lcnM6bnVsbH07 dHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZSh0cmFwQnViYmxlZEV2ZW50 c0xvY2FsLHRoaXMpO2JyZWFrO2Nhc2UiaW5wdXQiOlJlYWN0RE9NSW5wdXQubW91bnRXcmFwcGVy KHRoaXMscHJvcHMsaG9zdFBhcmVudCk7cHJvcHM9UmVhY3RET01JbnB1dC5nZXRIb3N0UHJvcHMo dGhpcyxwcm9wcyk7dHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZSh0cmFw QnViYmxlZEV2ZW50c0xvY2FsLHRoaXMpO2JyZWFrO2Nhc2Uib3B0aW9uIjpSZWFjdERPTU9wdGlv bi5tb3VudFdyYXBwZXIodGhpcyxwcm9wcyxob3N0UGFyZW50KTtwcm9wcz1SZWFjdERPTU9wdGlv bi5nZXRIb3N0UHJvcHModGhpcyxwcm9wcyk7YnJlYWs7Y2FzZSJzZWxlY3QiOlJlYWN0RE9NU2Vs ZWN0Lm1vdW50V3JhcHBlcih0aGlzLHByb3BzLGhvc3RQYXJlbnQpO3Byb3BzPVJlYWN0RE9NU2Vs ZWN0LmdldEhvc3RQcm9wcyh0aGlzLHByb3BzKTt0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVh ZHkoKS5lbnF1ZXVlKHRyYXBCdWJibGVkRXZlbnRzTG9jYWwsdGhpcyk7YnJlYWs7Y2FzZSJ0ZXh0 YXJlYSI6UmVhY3RET01UZXh0YXJlYS5tb3VudFdyYXBwZXIodGhpcyxwcm9wcyxob3N0UGFyZW50 KTtwcm9wcz1SZWFjdERPTVRleHRhcmVhLmdldEhvc3RQcm9wcyh0aGlzLHByb3BzKTt0cmFuc2Fj dGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHRyYXBCdWJibGVkRXZlbnRzTG9jYWws dGhpcyk7YnJlYWt9YXNzZXJ0VmFsaWRQcm9wcyh0aGlzLHByb3BzKTt2YXIgbmFtZXNwYWNlVVJJ O3ZhciBwYXJlbnRUYWc7aWYoaG9zdFBhcmVudCE9bnVsbCl7bmFtZXNwYWNlVVJJPWhvc3RQYXJl bnQuX25hbWVzcGFjZVVSSTtwYXJlbnRUYWc9aG9zdFBhcmVudC5fdGFnfWVsc2UgaWYoaG9zdENv bnRhaW5lckluZm8uX3RhZyl7bmFtZXNwYWNlVVJJPWhvc3RDb250YWluZXJJbmZvLl9uYW1lc3Bh Y2VVUkk7cGFyZW50VGFnPWhvc3RDb250YWluZXJJbmZvLl90YWd9aWYobmFtZXNwYWNlVVJJPT1u dWxsfHxuYW1lc3BhY2VVUkk9PT1ET01OYW1lc3BhY2VzLnN2ZyYmcGFyZW50VGFnPT09ImZvcmVp Z25vYmplY3QiKXtuYW1lc3BhY2VVUkk9RE9NTmFtZXNwYWNlcy5odG1sfWlmKG5hbWVzcGFjZVVS ST09PURPTU5hbWVzcGFjZXMuaHRtbCl7aWYodGhpcy5fdGFnPT09InN2ZyIpe25hbWVzcGFjZVVS ST1ET01OYW1lc3BhY2VzLnN2Z31lbHNlIGlmKHRoaXMuX3RhZz09PSJtYXRoIil7bmFtZXNwYWNl VVJJPURPTU5hbWVzcGFjZXMubWF0aG1sfX10aGlzLl9uYW1lc3BhY2VVUkk9bmFtZXNwYWNlVVJJ O2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe3ZhciBwYXJlbnRJbmZvO2lmKGhvc3RQ YXJlbnQhPW51bGwpe3BhcmVudEluZm89aG9zdFBhcmVudC5fYW5jZXN0b3JJbmZvfWVsc2UgaWYo aG9zdENvbnRhaW5lckluZm8uX3RhZyl7cGFyZW50SW5mbz1ob3N0Q29udGFpbmVySW5mby5fYW5j ZXN0b3JJbmZvfWlmKHBhcmVudEluZm8pe3ZhbGlkYXRlRE9NTmVzdGluZyh0aGlzLl90YWcsbnVs bCx0aGlzLHBhcmVudEluZm8pfXRoaXMuX2FuY2VzdG9ySW5mbz12YWxpZGF0ZURPTU5lc3Rpbmcu dXBkYXRlZEFuY2VzdG9ySW5mbyhwYXJlbnRJbmZvLHRoaXMuX3RhZyx0aGlzKX12YXIgbW91bnRJ bWFnZTtpZih0cmFuc2FjdGlvbi51c2VDcmVhdGVFbGVtZW50KXt2YXIgb3duZXJEb2N1bWVudD1o b3N0Q29udGFpbmVySW5mby5fb3duZXJEb2N1bWVudDt2YXIgZWw7aWYobmFtZXNwYWNlVVJJPT09 RE9NTmFtZXNwYWNlcy5odG1sKXtpZih0aGlzLl90YWc9PT0ic2NyaXB0Iil7dmFyIGRpdj1vd25l ckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3ZhciB0eXBlPXRoaXMuX2N1cnJlbnRFbGVt ZW50LnR5cGU7ZGl2LmlubmVySFRNTD0iPCIrdHlwZSsiPjwvIit0eXBlKyI+IjtlbD1kaXYucmVt b3ZlQ2hpbGQoZGl2LmZpcnN0Q2hpbGQpfWVsc2UgaWYocHJvcHMuaXMpe2VsPW93bmVyRG9jdW1l bnQuY3JlYXRlRWxlbWVudCh0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlLHByb3BzLmlzKX1lbHNl e2VsPW93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0aGlzLl9jdXJyZW50RWxlbWVudC50eXBl KX19ZWxzZXtlbD1vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksdGhp cy5fY3VycmVudEVsZW1lbnQudHlwZSl9UmVhY3RET01Db21wb25lbnRUcmVlLnByZWNhY2hlTm9k ZSh0aGlzLGVsKTt0aGlzLl9mbGFnc3w9RmxhZ3MuaGFzQ2FjaGVkQ2hpbGROb2RlcztpZighdGhp cy5faG9zdFBhcmVudCl7RE9NUHJvcGVydHlPcGVyYXRpb25zLnNldEF0dHJpYnV0ZUZvclJvb3Qo ZWwpfXRoaXMuX3VwZGF0ZURPTVByb3BlcnRpZXMobnVsbCxwcm9wcyx0cmFuc2FjdGlvbik7dmFy IGxhenlUcmVlPURPTUxhenlUcmVlKGVsKTt0aGlzLl9jcmVhdGVJbml0aWFsQ2hpbGRyZW4odHJh bnNhY3Rpb24scHJvcHMsY29udGV4dCxsYXp5VHJlZSk7bW91bnRJbWFnZT1sYXp5VHJlZX1lbHNl e3ZhciB0YWdPcGVuPXRoaXMuX2NyZWF0ZU9wZW5UYWdNYXJrdXBBbmRQdXRMaXN0ZW5lcnModHJh bnNhY3Rpb24scHJvcHMpO3ZhciB0YWdDb250ZW50PXRoaXMuX2NyZWF0ZUNvbnRlbnRNYXJrdXAo dHJhbnNhY3Rpb24scHJvcHMsY29udGV4dCk7aWYoIXRhZ0NvbnRlbnQmJm9taXR0ZWRDbG9zZVRh Z3NbdGhpcy5fdGFnXSl7bW91bnRJbWFnZT10YWdPcGVuKyIvPiJ9ZWxzZXttb3VudEltYWdlPXRh Z09wZW4rIj4iK3RhZ0NvbnRlbnQrIjwvIit0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlKyI+In19 c3dpdGNoKHRoaXMuX3RhZyl7Y2FzZSJpbnB1dCI6dHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJl YWR5KCkuZW5xdWV1ZShpbnB1dFBvc3RNb3VudCx0aGlzKTtpZihwcm9wcy5hdXRvRm9jdXMpe3Ry YW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoQXV0b0ZvY3VzVXRpbHMuZm9j dXNET01Db21wb25lbnQsdGhpcyl9YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6dHJhbnNhY3Rpb24uZ2V0 UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZSh0ZXh0YXJlYVBvc3RNb3VudCx0aGlzKTtpZihwcm9w cy5hdXRvRm9jdXMpe3RyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoQXV0 b0ZvY3VzVXRpbHMuZm9jdXNET01Db21wb25lbnQsdGhpcyl9YnJlYWs7Y2FzZSJzZWxlY3QiOmlm KHByb3BzLmF1dG9Gb2N1cyl7dHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1 ZShBdXRvRm9jdXNVdGlscy5mb2N1c0RPTUNvbXBvbmVudCx0aGlzKX1icmVhaztjYXNlImJ1dHRv biI6aWYocHJvcHMuYXV0b0ZvY3VzKXt0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5l bnF1ZXVlKEF1dG9Gb2N1c1V0aWxzLmZvY3VzRE9NQ29tcG9uZW50LHRoaXMpfWJyZWFrO2Nhc2Ui b3B0aW9uIjp0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKG9wdGlvblBv c3RNb3VudCx0aGlzKTticmVha31yZXR1cm4gbW91bnRJbWFnZX0sX2NyZWF0ZU9wZW5UYWdNYXJr dXBBbmRQdXRMaXN0ZW5lcnM6ZnVuY3Rpb24odHJhbnNhY3Rpb24scHJvcHMpe3ZhciByZXQ9Ijwi K3RoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7Zm9yKHZhciBwcm9wS2V5IGluIHByb3BzKXtpZigh cHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpe2NvbnRpbnVlfXZhciBwcm9wVmFsdWU9cHJv cHNbcHJvcEtleV07aWYocHJvcFZhbHVlPT1udWxsKXtjb250aW51ZX1pZihyZWdpc3RyYXRpb25O YW1lTW9kdWxlcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSl7aWYocHJvcFZhbHVlKXtlbnF1ZXVl UHV0TGlzdGVuZXIodGhpcyxwcm9wS2V5LHByb3BWYWx1ZSx0cmFuc2FjdGlvbil9fWVsc2V7aWYo cHJvcEtleT09PVNUWUxFKXtpZihwcm9wVmFsdWUpe2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVj dGlvbiIpe3RoaXMuX3ByZXZpb3VzU3R5bGU9cHJvcFZhbHVlfXByb3BWYWx1ZT10aGlzLl9wcmV2 aW91c1N0eWxlQ29weT1fYXNzaWduKHt9LHByb3BzLnN0eWxlKX1wcm9wVmFsdWU9Q1NTUHJvcGVy dHlPcGVyYXRpb25zLmNyZWF0ZU1hcmt1cEZvclN0eWxlcyhwcm9wVmFsdWUsdGhpcyl9dmFyIG1h cmt1cD1udWxsO2lmKHRoaXMuX3RhZyE9bnVsbCYmaXNDdXN0b21Db21wb25lbnQodGhpcy5fdGFn LHByb3BzKSl7aWYoIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BLZXkpKXttYXJr dXA9RE9NUHJvcGVydHlPcGVyYXRpb25zLmNyZWF0ZU1hcmt1cEZvckN1c3RvbUF0dHJpYnV0ZShw cm9wS2V5LHByb3BWYWx1ZSl9fWVsc2V7bWFya3VwPURPTVByb3BlcnR5T3BlcmF0aW9ucy5jcmVh dGVNYXJrdXBGb3JQcm9wZXJ0eShwcm9wS2V5LHByb3BWYWx1ZSl9aWYobWFya3VwKXtyZXQrPSIg IittYXJrdXB9fX1pZih0cmFuc2FjdGlvbi5yZW5kZXJUb1N0YXRpY01hcmt1cCl7cmV0dXJuIHJl dH1pZighdGhpcy5faG9zdFBhcmVudCl7cmV0Kz0iICIrRE9NUHJvcGVydHlPcGVyYXRpb25zLmNy ZWF0ZU1hcmt1cEZvclJvb3QoKX1yZXQrPSIgIitET01Qcm9wZXJ0eU9wZXJhdGlvbnMuY3JlYXRl TWFya3VwRm9ySUQodGhpcy5fZG9tSUQpO3JldHVybiByZXR9LF9jcmVhdGVDb250ZW50TWFya3Vw OmZ1bmN0aW9uKHRyYW5zYWN0aW9uLHByb3BzLGNvbnRleHQpe3ZhciByZXQ9IiI7dmFyIGlubmVy SFRNTD1wcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTDtpZihpbm5lckhUTUwhPW51bGwpe2lm KGlubmVySFRNTC5fX2h0bWwhPW51bGwpe3JldD1pbm5lckhUTUwuX19odG1sfX1lbHNle3ZhciBj b250ZW50VG9Vc2U9Q09OVEVOVF9UWVBFU1t0eXBlb2YgcHJvcHMuY2hpbGRyZW5dP3Byb3BzLmNo aWxkcmVuOm51bGw7dmFyIGNoaWxkcmVuVG9Vc2U9Y29udGVudFRvVXNlIT1udWxsP251bGw6cHJv cHMuY2hpbGRyZW47aWYoY29udGVudFRvVXNlIT1udWxsKXtyZXQ9ZXNjYXBlVGV4dENvbnRlbnRG b3JCcm93c2VyKGNvbnRlbnRUb1VzZSk7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7 c2V0QW5kVmFsaWRhdGVDb250ZW50Q2hpbGREZXYuY2FsbCh0aGlzLGNvbnRlbnRUb1VzZSl9fWVs c2UgaWYoY2hpbGRyZW5Ub1VzZSE9bnVsbCl7dmFyIG1vdW50SW1hZ2VzPXRoaXMubW91bnRDaGls ZHJlbihjaGlsZHJlblRvVXNlLHRyYW5zYWN0aW9uLGNvbnRleHQpO3JldD1tb3VudEltYWdlcy5q b2luKCIiKX19aWYobmV3bGluZUVhdGluZ1RhZ3NbdGhpcy5fdGFnXSYmcmV0LmNoYXJBdCgwKT09 PSJcbiIpe3JldHVybiJcbiIrcmV0fWVsc2V7cmV0dXJuIHJldH19LF9jcmVhdGVJbml0aWFsQ2hp bGRyZW46ZnVuY3Rpb24odHJhbnNhY3Rpb24scHJvcHMsY29udGV4dCxsYXp5VHJlZSl7dmFyIGlu bmVySFRNTD1wcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTDtpZihpbm5lckhUTUwhPW51bGwp e2lmKGlubmVySFRNTC5fX2h0bWwhPW51bGwpe0RPTUxhenlUcmVlLnF1ZXVlSFRNTChsYXp5VHJl ZSxpbm5lckhUTUwuX19odG1sKX19ZWxzZXt2YXIgY29udGVudFRvVXNlPUNPTlRFTlRfVFlQRVNb dHlwZW9mIHByb3BzLmNoaWxkcmVuXT9wcm9wcy5jaGlsZHJlbjpudWxsO3ZhciBjaGlsZHJlblRv VXNlPWNvbnRlbnRUb1VzZSE9bnVsbD9udWxsOnByb3BzLmNoaWxkcmVuO2lmKGNvbnRlbnRUb1Vz ZSE9bnVsbCl7aWYoY29udGVudFRvVXNlIT09IiIpe2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVj dGlvbiIpe3NldEFuZFZhbGlkYXRlQ29udGVudENoaWxkRGV2LmNhbGwodGhpcyxjb250ZW50VG9V c2UpfURPTUxhenlUcmVlLnF1ZXVlVGV4dChsYXp5VHJlZSxjb250ZW50VG9Vc2UpfX1lbHNlIGlm KGNoaWxkcmVuVG9Vc2UhPW51bGwpe3ZhciBtb3VudEltYWdlcz10aGlzLm1vdW50Q2hpbGRyZW4o Y2hpbGRyZW5Ub1VzZSx0cmFuc2FjdGlvbixjb250ZXh0KTtmb3IodmFyIGk9MDtpPG1vdW50SW1h Z2VzLmxlbmd0aDtpKyspe0RPTUxhenlUcmVlLnF1ZXVlQ2hpbGQobGF6eVRyZWUsbW91bnRJbWFn ZXNbaV0pfX19fSxyZWNlaXZlQ29tcG9uZW50OmZ1bmN0aW9uKG5leHRFbGVtZW50LHRyYW5zYWN0 aW9uLGNvbnRleHQpe3ZhciBwcmV2RWxlbWVudD10aGlzLl9jdXJyZW50RWxlbWVudDt0aGlzLl9j dXJyZW50RWxlbWVudD1uZXh0RWxlbWVudDt0aGlzLnVwZGF0ZUNvbXBvbmVudCh0cmFuc2FjdGlv bixwcmV2RWxlbWVudCxuZXh0RWxlbWVudCxjb250ZXh0KX0sdXBkYXRlQ29tcG9uZW50OmZ1bmN0 aW9uKHRyYW5zYWN0aW9uLHByZXZFbGVtZW50LG5leHRFbGVtZW50LGNvbnRleHQpe3ZhciBsYXN0 UHJvcHM9cHJldkVsZW1lbnQucHJvcHM7dmFyIG5leHRQcm9wcz10aGlzLl9jdXJyZW50RWxlbWVu dC5wcm9wcztzd2l0Y2godGhpcy5fdGFnKXtjYXNlImlucHV0IjpsYXN0UHJvcHM9UmVhY3RET01J bnB1dC5nZXRIb3N0UHJvcHModGhpcyxsYXN0UHJvcHMpO25leHRQcm9wcz1SZWFjdERPTUlucHV0 LmdldEhvc3RQcm9wcyh0aGlzLG5leHRQcm9wcyk7YnJlYWs7Y2FzZSJvcHRpb24iOmxhc3RQcm9w cz1SZWFjdERPTU9wdGlvbi5nZXRIb3N0UHJvcHModGhpcyxsYXN0UHJvcHMpO25leHRQcm9wcz1S ZWFjdERPTU9wdGlvbi5nZXRIb3N0UHJvcHModGhpcyxuZXh0UHJvcHMpO2JyZWFrO2Nhc2Uic2Vs ZWN0IjpsYXN0UHJvcHM9UmVhY3RET01TZWxlY3QuZ2V0SG9zdFByb3BzKHRoaXMsbGFzdFByb3Bz KTtuZXh0UHJvcHM9UmVhY3RET01TZWxlY3QuZ2V0SG9zdFByb3BzKHRoaXMsbmV4dFByb3BzKTti cmVhaztjYXNlInRleHRhcmVhIjpsYXN0UHJvcHM9UmVhY3RET01UZXh0YXJlYS5nZXRIb3N0UHJv cHModGhpcyxsYXN0UHJvcHMpO25leHRQcm9wcz1SZWFjdERPTVRleHRhcmVhLmdldEhvc3RQcm9w cyh0aGlzLG5leHRQcm9wcyk7YnJlYWt9YXNzZXJ0VmFsaWRQcm9wcyh0aGlzLG5leHRQcm9wcyk7 dGhpcy5fdXBkYXRlRE9NUHJvcGVydGllcyhsYXN0UHJvcHMsbmV4dFByb3BzLHRyYW5zYWN0aW9u KTt0aGlzLl91cGRhdGVET01DaGlsZHJlbihsYXN0UHJvcHMsbmV4dFByb3BzLHRyYW5zYWN0aW9u LGNvbnRleHQpO3N3aXRjaCh0aGlzLl90YWcpe2Nhc2UiaW5wdXQiOlJlYWN0RE9NSW5wdXQudXBk YXRlV3JhcHBlcih0aGlzKTticmVhaztjYXNlInRleHRhcmVhIjpSZWFjdERPTVRleHRhcmVhLnVw ZGF0ZVdyYXBwZXIodGhpcyk7YnJlYWs7Y2FzZSJzZWxlY3QiOnRyYW5zYWN0aW9uLmdldFJlYWN0 TW91bnRSZWFkeSgpLmVucXVldWUocG9zdFVwZGF0ZVNlbGVjdFdyYXBwZXIsdGhpcyk7YnJlYWt9 fSxfdXBkYXRlRE9NUHJvcGVydGllczpmdW5jdGlvbihsYXN0UHJvcHMsbmV4dFByb3BzLHRyYW5z YWN0aW9uKXt2YXIgcHJvcEtleTt2YXIgc3R5bGVOYW1lO3ZhciBzdHlsZVVwZGF0ZXM7Zm9yKHBy b3BLZXkgaW4gbGFzdFByb3BzKXtpZihuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSl8 fCFsYXN0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSl8fGxhc3RQcm9wc1twcm9wS2V5XT09 bnVsbCl7Y29udGludWV9aWYocHJvcEtleT09PVNUWUxFKXt2YXIgbGFzdFN0eWxlPXRoaXMuX3By ZXZpb3VzU3R5bGVDb3B5O2ZvcihzdHlsZU5hbWUgaW4gbGFzdFN0eWxlKXtpZihsYXN0U3R5bGUu aGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSl7c3R5bGVVcGRhdGVzPXN0eWxlVXBkYXRlc3x8e307 c3R5bGVVcGRhdGVzW3N0eWxlTmFtZV09IiJ9fXRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5PW51bGx9 ZWxzZSBpZihyZWdpc3RyYXRpb25OYW1lTW9kdWxlcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSl7 aWYobGFzdFByb3BzW3Byb3BLZXldKXtkZWxldGVMaXN0ZW5lcih0aGlzLHByb3BLZXkpfX1lbHNl IGlmKGlzQ3VzdG9tQ29tcG9uZW50KHRoaXMuX3RhZyxsYXN0UHJvcHMpKXtpZighUkVTRVJWRURf UFJPUFMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpe0RPTVByb3BlcnR5T3BlcmF0aW9ucy5kZWxl dGVWYWx1ZUZvckF0dHJpYnV0ZShnZXROb2RlKHRoaXMpLHByb3BLZXkpfX1lbHNlIGlmKERPTVBy b3BlcnR5LnByb3BlcnRpZXNbcHJvcEtleV18fERPTVByb3BlcnR5LmlzQ3VzdG9tQXR0cmlidXRl KHByb3BLZXkpKXtET01Qcm9wZXJ0eU9wZXJhdGlvbnMuZGVsZXRlVmFsdWVGb3JQcm9wZXJ0eShn ZXROb2RlKHRoaXMpLHByb3BLZXkpfX1mb3IocHJvcEtleSBpbiBuZXh0UHJvcHMpe3ZhciBuZXh0 UHJvcD1uZXh0UHJvcHNbcHJvcEtleV07dmFyIGxhc3RQcm9wPXByb3BLZXk9PT1TVFlMRT90aGlz Ll9wcmV2aW91c1N0eWxlQ29weTpsYXN0UHJvcHMhPW51bGw/bGFzdFByb3BzW3Byb3BLZXldOnVu ZGVmaW5lZDtpZighbmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpfHxuZXh0UHJvcD09 PWxhc3RQcm9wfHxuZXh0UHJvcD09bnVsbCYmbGFzdFByb3A9PW51bGwpe2NvbnRpbnVlfWlmKHBy b3BLZXk9PT1TVFlMRSl7aWYobmV4dFByb3Ape2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlv biIpe2NoZWNrQW5kV2FybkZvck11dGF0ZWRTdHlsZSh0aGlzLl9wcmV2aW91c1N0eWxlQ29weSx0 aGlzLl9wcmV2aW91c1N0eWxlLHRoaXMpO3RoaXMuX3ByZXZpb3VzU3R5bGU9bmV4dFByb3B9bmV4 dFByb3A9dGhpcy5fcHJldmlvdXNTdHlsZUNvcHk9X2Fzc2lnbih7fSxuZXh0UHJvcCl9ZWxzZXt0 aGlzLl9wcmV2aW91c1N0eWxlQ29weT1udWxsfWlmKGxhc3RQcm9wKXtmb3Ioc3R5bGVOYW1lIGlu IGxhc3RQcm9wKXtpZihsYXN0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpJiYoIW5leHRQ cm9wfHwhbmV4dFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkpe3N0eWxlVXBkYXRlcz1z dHlsZVVwZGF0ZXN8fHt9O3N0eWxlVXBkYXRlc1tzdHlsZU5hbWVdPSIifX1mb3Ioc3R5bGVOYW1l IGluIG5leHRQcm9wKXtpZihuZXh0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpJiZsYXN0 UHJvcFtzdHlsZU5hbWVdIT09bmV4dFByb3Bbc3R5bGVOYW1lXSl7c3R5bGVVcGRhdGVzPXN0eWxl VXBkYXRlc3x8e307c3R5bGVVcGRhdGVzW3N0eWxlTmFtZV09bmV4dFByb3Bbc3R5bGVOYW1lXX19 fWVsc2V7c3R5bGVVcGRhdGVzPW5leHRQcm9wfX1lbHNlIGlmKHJlZ2lzdHJhdGlvbk5hbWVNb2R1 bGVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKXtpZihuZXh0UHJvcCl7ZW5xdWV1ZVB1dExpc3Rl bmVyKHRoaXMscHJvcEtleSxuZXh0UHJvcCx0cmFuc2FjdGlvbil9ZWxzZSBpZihsYXN0UHJvcCl7 ZGVsZXRlTGlzdGVuZXIodGhpcyxwcm9wS2V5KX19ZWxzZSBpZihpc0N1c3RvbUNvbXBvbmVudCh0 aGlzLl90YWcsbmV4dFByb3BzKSl7aWYoIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHBy b3BLZXkpKXtET01Qcm9wZXJ0eU9wZXJhdGlvbnMuc2V0VmFsdWVGb3JBdHRyaWJ1dGUoZ2V0Tm9k ZSh0aGlzKSxwcm9wS2V5LG5leHRQcm9wKX19ZWxzZSBpZihET01Qcm9wZXJ0eS5wcm9wZXJ0aWVz W3Byb3BLZXldfHxET01Qcm9wZXJ0eS5pc0N1c3RvbUF0dHJpYnV0ZShwcm9wS2V5KSl7dmFyIG5v ZGU9Z2V0Tm9kZSh0aGlzKTtpZihuZXh0UHJvcCE9bnVsbCl7RE9NUHJvcGVydHlPcGVyYXRpb25z LnNldFZhbHVlRm9yUHJvcGVydHkobm9kZSxwcm9wS2V5LG5leHRQcm9wKX1lbHNle0RPTVByb3Bl cnR5T3BlcmF0aW9ucy5kZWxldGVWYWx1ZUZvclByb3BlcnR5KG5vZGUscHJvcEtleSl9fX1pZihz dHlsZVVwZGF0ZXMpe0NTU1Byb3BlcnR5T3BlcmF0aW9ucy5zZXRWYWx1ZUZvclN0eWxlcyhnZXRO b2RlKHRoaXMpLHN0eWxlVXBkYXRlcyx0aGlzKX19LF91cGRhdGVET01DaGlsZHJlbjpmdW5jdGlv bihsYXN0UHJvcHMsbmV4dFByb3BzLHRyYW5zYWN0aW9uLGNvbnRleHQpe3ZhciBsYXN0Q29udGVu dD1DT05URU5UX1RZUEVTW3R5cGVvZiBsYXN0UHJvcHMuY2hpbGRyZW5dP2xhc3RQcm9wcy5jaGls ZHJlbjpudWxsO3ZhciBuZXh0Q29udGVudD1DT05URU5UX1RZUEVTW3R5cGVvZiBuZXh0UHJvcHMu Y2hpbGRyZW5dP25leHRQcm9wcy5jaGlsZHJlbjpudWxsO3ZhciBsYXN0SHRtbD1sYXN0UHJvcHMu ZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwmJmxhc3RQcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRN TC5fX2h0bWw7dmFyIG5leHRIdG1sPW5leHRQcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCYm bmV4dFByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRtbDt2YXIgbGFzdENoaWxkcmVu PWxhc3RDb250ZW50IT1udWxsP251bGw6bGFzdFByb3BzLmNoaWxkcmVuO3ZhciBuZXh0Q2hpbGRy ZW49bmV4dENvbnRlbnQhPW51bGw/bnVsbDpuZXh0UHJvcHMuY2hpbGRyZW47dmFyIGxhc3RIYXND b250ZW50T3JIdG1sPWxhc3RDb250ZW50IT1udWxsfHxsYXN0SHRtbCE9bnVsbDt2YXIgbmV4dEhh c0NvbnRlbnRPckh0bWw9bmV4dENvbnRlbnQhPW51bGx8fG5leHRIdG1sIT1udWxsO2lmKGxhc3RD aGlsZHJlbiE9bnVsbCYmbmV4dENoaWxkcmVuPT1udWxsKXt0aGlzLnVwZGF0ZUNoaWxkcmVuKG51 bGwsdHJhbnNhY3Rpb24sY29udGV4dCl9ZWxzZSBpZihsYXN0SGFzQ29udGVudE9ySHRtbCYmIW5l eHRIYXNDb250ZW50T3JIdG1sKXt0aGlzLnVwZGF0ZVRleHRDb250ZW50KCIiKTtpZigiZGV2ZWxv cG1lbnQiIT09InByb2R1Y3Rpb24iKXtSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25T ZXRDaGlsZHJlbih0aGlzLl9kZWJ1Z0lELFtdKX19aWYobmV4dENvbnRlbnQhPW51bGwpe2lmKGxh c3RDb250ZW50IT09bmV4dENvbnRlbnQpe3RoaXMudXBkYXRlVGV4dENvbnRlbnQoIiIrbmV4dENv bnRlbnQpO2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe3NldEFuZFZhbGlkYXRlQ29u dGVudENoaWxkRGV2LmNhbGwodGhpcyxuZXh0Q29udGVudCl9fX1lbHNlIGlmKG5leHRIdG1sIT1u dWxsKXtpZihsYXN0SHRtbCE9PW5leHRIdG1sKXt0aGlzLnVwZGF0ZU1hcmt1cCgiIituZXh0SHRt bCl9aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7UmVhY3RJbnN0cnVtZW50YXRpb24u ZGVidWdUb29sLm9uU2V0Q2hpbGRyZW4odGhpcy5fZGVidWdJRCxbXSl9fWVsc2UgaWYobmV4dENo aWxkcmVuIT1udWxsKXtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtzZXRBbmRWYWxp ZGF0ZUNvbnRlbnRDaGlsZERldi5jYWxsKHRoaXMsbnVsbCl9dGhpcy51cGRhdGVDaGlsZHJlbihu ZXh0Q2hpbGRyZW4sdHJhbnNhY3Rpb24sY29udGV4dCl9fSxnZXRIb3N0Tm9kZTpmdW5jdGlvbigp e3JldHVybiBnZXROb2RlKHRoaXMpfSx1bm1vdW50Q29tcG9uZW50OmZ1bmN0aW9uKHNhZmVseSl7 c3dpdGNoKHRoaXMuX3RhZyl7Y2FzZSJhdWRpbyI6Y2FzZSJmb3JtIjpjYXNlImlmcmFtZSI6Y2Fz ZSJpbWciOmNhc2UibGluayI6Y2FzZSJvYmplY3QiOmNhc2Uic291cmNlIjpjYXNlInZpZGVvIjp2 YXIgbGlzdGVuZXJzPXRoaXMuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM7aWYobGlzdGVuZXJzKXtm b3IodmFyIGk9MDtpPGxpc3RlbmVycy5sZW5ndGg7aSsrKXtsaXN0ZW5lcnNbaV0ucmVtb3ZlKCl9 fWJyZWFrO2Nhc2UiaHRtbCI6Y2FzZSJoZWFkIjpjYXNlImJvZHkiOiFmYWxzZT8iZGV2ZWxvcG1l bnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiPCVzPiB0cmllZCB0byB1bm1vdW50 LiBCZWNhdXNlIG9mIGNyb3NzLWJyb3dzZXIgcXVpcmtzIGl0IGlzIGltcG9zc2libGUgdG8gdW5t b3VudCBzb21lIHRvcC1sZXZlbCBjb21wb25lbnRzIChlZyA8aHRtbD4sIDxoZWFkPiwgYW5kIDxi b2R5PikgcmVsaWFibHkgYW5kIGVmZmljaWVudGx5LiBUbyBmaXggdGhpcywgaGF2ZSBhIHNpbmds ZSB0b3AtbGV2ZWwgY29tcG9uZW50IHRoYXQgbmV2ZXIgdW5tb3VudHMgcmVuZGVyIHRoZXNlIGVs ZW1lbnRzLiIsdGhpcy5fdGFnKTpfcHJvZEludmFyaWFudCgiNjYiLHRoaXMuX3RhZyk6dm9pZCAw O2JyZWFrfXRoaXMudW5tb3VudENoaWxkcmVuKHNhZmVseSk7UmVhY3RET01Db21wb25lbnRUcmVl LnVuY2FjaGVOb2RlKHRoaXMpO0V2ZW50UGx1Z2luSHViLmRlbGV0ZUFsbExpc3RlbmVycyh0aGlz KTt0aGlzLl9yb290Tm9kZUlEPTA7dGhpcy5fZG9tSUQ9MDt0aGlzLl93cmFwcGVyU3RhdGU9bnVs bDtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtzZXRBbmRWYWxpZGF0ZUNvbnRlbnRD aGlsZERldi5jYWxsKHRoaXMsbnVsbCl9fSxnZXRQdWJsaWNJbnN0YW5jZTpmdW5jdGlvbigpe3Jl dHVybiBnZXROb2RlKHRoaXMpfX07X2Fzc2lnbihSZWFjdERPTUNvbXBvbmVudC5wcm90b3R5cGUs UmVhY3RET01Db21wb25lbnQuTWl4aW4sUmVhY3RNdWx0aUNoaWxkLk1peGluKTttb2R1bGUuZXhw b3J0cz1SZWFjdERPTUNvbXBvbmVudH0sezEwOjEwLDEwMDoxMDAsMTE6MTEsMTEzOjExMywxMTY6 MTE2LDEyOjEyLDEyMToxMjEsMTMyOjEzMiwxNDA6MTQwLDE0NjoxNDYsMTQ3OjE0NywxNDg6MTQ4 LDE2OjE2LDE3OjE3LDI6MiwyNToyNSwzMTozMSwzMjozMiwzNjozNiwzNzozNywzODozOCw0Mzo0 Myw1OjUsNTk6NTksNjI6NjIsNzI6NzIsOTo5fV0sMzE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxl LGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgUmVhY3RET01Db21wb25lbnRGbGFncz17aGFzQ2Fj aGVkQ2hpbGROb2RlczoxPDwwfTttb2R1bGUuZXhwb3J0cz1SZWFjdERPTUNvbXBvbmVudEZsYWdz fSx7fV0sMzI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2 YXIgX3Byb2RJbnZhcmlhbnQ9X2RlcmVxXygxMTYpO3ZhciBET01Qcm9wZXJ0eT1fZGVyZXFfKDEx KTt2YXIgUmVhY3RET01Db21wb25lbnRGbGFncz1fZGVyZXFfKDMxKTt2YXIgaW52YXJpYW50PV9k ZXJlcV8oMTQwKTt2YXIgQVRUUl9OQU1FPURPTVByb3BlcnR5LklEX0FUVFJJQlVURV9OQU1FO3Zh ciBGbGFncz1SZWFjdERPTUNvbXBvbmVudEZsYWdzO3ZhciBpbnRlcm5hbEluc3RhbmNlS2V5PSJf X3JlYWN0SW50ZXJuYWxJbnN0YW5jZSQiK01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNl KDIpO2Z1bmN0aW9uIHNob3VsZFByZWNhY2hlTm9kZShub2RlLG5vZGVJRCl7cmV0dXJuIG5vZGUu bm9kZVR5cGU9PT0xJiZub2RlLmdldEF0dHJpYnV0ZShBVFRSX05BTUUpPT09U3RyaW5nKG5vZGVJ RCl8fG5vZGUubm9kZVR5cGU9PT04JiZub2RlLm5vZGVWYWx1ZT09PSIgcmVhY3QtdGV4dDogIitu b2RlSUQrIiAifHxub2RlLm5vZGVUeXBlPT09OCYmbm9kZS5ub2RlVmFsdWU9PT0iIHJlYWN0LWVt cHR5OiAiK25vZGVJRCsiICJ9ZnVuY3Rpb24gZ2V0UmVuZGVyZWRIb3N0T3JUZXh0RnJvbUNvbXBv bmVudChjb21wb25lbnQpe3ZhciByZW5kZXJlZDt3aGlsZShyZW5kZXJlZD1jb21wb25lbnQuX3Jl bmRlcmVkQ29tcG9uZW50KXtjb21wb25lbnQ9cmVuZGVyZWR9cmV0dXJuIGNvbXBvbmVudH1mdW5j dGlvbiBwcmVjYWNoZU5vZGUoaW5zdCxub2RlKXt2YXIgaG9zdEluc3Q9Z2V0UmVuZGVyZWRIb3N0 T3JUZXh0RnJvbUNvbXBvbmVudChpbnN0KTtob3N0SW5zdC5faG9zdE5vZGU9bm9kZTtub2RlW2lu dGVybmFsSW5zdGFuY2VLZXldPWhvc3RJbnN0fWZ1bmN0aW9uIHVuY2FjaGVOb2RlKGluc3Qpe3Zh ciBub2RlPWluc3QuX2hvc3ROb2RlO2lmKG5vZGUpe2RlbGV0ZSBub2RlW2ludGVybmFsSW5zdGFu Y2VLZXldO2luc3QuX2hvc3ROb2RlPW51bGx9fWZ1bmN0aW9uIHByZWNhY2hlQ2hpbGROb2Rlcyhp bnN0LG5vZGUpe2lmKGluc3QuX2ZsYWdzJkZsYWdzLmhhc0NhY2hlZENoaWxkTm9kZXMpe3JldHVy bn12YXIgY2hpbGRyZW49aW5zdC5fcmVuZGVyZWRDaGlsZHJlbjt2YXIgY2hpbGROb2RlPW5vZGUu Zmlyc3RDaGlsZDtvdXRlcjpmb3IodmFyIG5hbWUgaW4gY2hpbGRyZW4pe2lmKCFjaGlsZHJlbi5o YXNPd25Qcm9wZXJ0eShuYW1lKSl7Y29udGludWV9dmFyIGNoaWxkSW5zdD1jaGlsZHJlbltuYW1l XTt2YXIgY2hpbGRJRD1nZXRSZW5kZXJlZEhvc3RPclRleHRGcm9tQ29tcG9uZW50KGNoaWxkSW5z dCkuX2RvbUlEO2lmKGNoaWxkSUQ9PT0wKXtjb250aW51ZX1mb3IoO2NoaWxkTm9kZSE9PW51bGw7 Y2hpbGROb2RlPWNoaWxkTm9kZS5uZXh0U2libGluZyl7aWYoc2hvdWxkUHJlY2FjaGVOb2RlKGNo aWxkTm9kZSxjaGlsZElEKSl7cHJlY2FjaGVOb2RlKGNoaWxkSW5zdCxjaGlsZE5vZGUpO2NvbnRp bnVlIG91dGVyfX0hZmFsc2U/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQo ZmFsc2UsIlVuYWJsZSB0byBmaW5kIGVsZW1lbnQgd2l0aCBJRCAlcy4iLGNoaWxkSUQpOl9wcm9k SW52YXJpYW50KCIzMiIsY2hpbGRJRCk6dm9pZCAwfWluc3QuX2ZsYWdzfD1GbGFncy5oYXNDYWNo ZWRDaGlsZE5vZGVzfWZ1bmN0aW9uIGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5vZGUpe2lm KG5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV0pe3JldHVybiBub2RlW2ludGVybmFsSW5zdGFuY2VL ZXldfXZhciBwYXJlbnRzPVtdO3doaWxlKCFub2RlW2ludGVybmFsSW5zdGFuY2VLZXldKXtwYXJl bnRzLnB1c2gobm9kZSk7aWYobm9kZS5wYXJlbnROb2RlKXtub2RlPW5vZGUucGFyZW50Tm9kZX1l bHNle3JldHVybiBudWxsfX12YXIgY2xvc2VzdDt2YXIgaW5zdDtmb3IoO25vZGUmJihpbnN0PW5v ZGVbaW50ZXJuYWxJbnN0YW5jZUtleV0pO25vZGU9cGFyZW50cy5wb3AoKSl7Y2xvc2VzdD1pbnN0 O2lmKHBhcmVudHMubGVuZ3RoKXtwcmVjYWNoZUNoaWxkTm9kZXMoaW5zdCxub2RlKX19cmV0dXJu IGNsb3Nlc3R9ZnVuY3Rpb24gZ2V0SW5zdGFuY2VGcm9tTm9kZShub2RlKXt2YXIgaW5zdD1nZXRD bG9zZXN0SW5zdGFuY2VGcm9tTm9kZShub2RlKTtpZihpbnN0IT1udWxsJiZpbnN0Ll9ob3N0Tm9k ZT09PW5vZGUpe3JldHVybiBpbnN0fWVsc2V7cmV0dXJuIG51bGx9fWZ1bmN0aW9uIGdldE5vZGVG cm9tSW5zdGFuY2UoaW5zdCl7IShpbnN0Ll9ob3N0Tm9kZSE9PXVuZGVmaW5lZCk/ImRldmVsb3Bt ZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsImdldE5vZGVGcm9tSW5zdGFuY2U6 IEludmFsaWQgYXJndW1lbnQuIik6X3Byb2RJbnZhcmlhbnQoIjMzIik6dm9pZCAwO2lmKGluc3Qu X2hvc3ROb2RlKXtyZXR1cm4gaW5zdC5faG9zdE5vZGV9dmFyIHBhcmVudHM9W107d2hpbGUoIWlu c3QuX2hvc3ROb2RlKXtwYXJlbnRzLnB1c2goaW5zdCk7IWluc3QuX2hvc3RQYXJlbnQ/ImRldmVs b3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsIlJlYWN0IERPTSB0cmVlIHJv b3Qgc2hvdWxkIGFsd2F5cyBoYXZlIGEgbm9kZSByZWZlcmVuY2UuIik6X3Byb2RJbnZhcmlhbnQo IjM0Iik6dm9pZCAwO2luc3Q9aW5zdC5faG9zdFBhcmVudH1mb3IoO3BhcmVudHMubGVuZ3RoO2lu c3Q9cGFyZW50cy5wb3AoKSl7cHJlY2FjaGVDaGlsZE5vZGVzKGluc3QsaW5zdC5faG9zdE5vZGUp fXJldHVybiBpbnN0Ll9ob3N0Tm9kZX12YXIgUmVhY3RET01Db21wb25lbnRUcmVlPXtnZXRDbG9z ZXN0SW5zdGFuY2VGcm9tTm9kZTpnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSxnZXRJbnN0YW5j ZUZyb21Ob2RlOmdldEluc3RhbmNlRnJvbU5vZGUsZ2V0Tm9kZUZyb21JbnN0YW5jZTpnZXROb2Rl RnJvbUluc3RhbmNlLHByZWNhY2hlQ2hpbGROb2RlczpwcmVjYWNoZUNoaWxkTm9kZXMscHJlY2Fj aGVOb2RlOnByZWNhY2hlTm9kZSx1bmNhY2hlTm9kZTp1bmNhY2hlTm9kZX07bW9kdWxlLmV4cG9y dHM9UmVhY3RET01Db21wb25lbnRUcmVlfSx7MTE6MTEsMTE2OjExNiwxNDA6MTQwLDMxOjMxfV0s MzM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgdmFs aWRhdGVET01OZXN0aW5nPV9kZXJlcV8oMTIxKTt2YXIgRE9DX05PREVfVFlQRT05O2Z1bmN0aW9u IFJlYWN0RE9NQ29udGFpbmVySW5mbyh0b3BMZXZlbFdyYXBwZXIsbm9kZSl7dmFyIGluZm89e190 b3BMZXZlbFdyYXBwZXI6dG9wTGV2ZWxXcmFwcGVyLF9pZENvdW50ZXI6MSxfb3duZXJEb2N1bWVu dDpub2RlP25vZGUubm9kZVR5cGU9PT1ET0NfTk9ERV9UWVBFP25vZGU6bm9kZS5vd25lckRvY3Vt ZW50Om51bGwsX25vZGU6bm9kZSxfdGFnOm5vZGU/bm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgp Om51bGwsX25hbWVzcGFjZVVSSTpub2RlP25vZGUubmFtZXNwYWNlVVJJOm51bGx9O2lmKCJkZXZl bG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe2luZm8uX2FuY2VzdG9ySW5mbz1ub2RlP3ZhbGlkYXRl RE9NTmVzdGluZy51cGRhdGVkQW5jZXN0b3JJbmZvKG51bGwsaW5mby5fdGFnLG51bGwpOm51bGx9 cmV0dXJuIGluZm99bW9kdWxlLmV4cG9ydHM9UmVhY3RET01Db250YWluZXJJbmZvfSx7MTIxOjEy MX1dLDM0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFy IF9hc3NpZ249X2RlcmVxXygxNDgpO3ZhciBET01MYXp5VHJlZT1fZGVyZXFfKDkpO3ZhciBSZWFj dERPTUNvbXBvbmVudFRyZWU9X2RlcmVxXygzMik7dmFyIFJlYWN0RE9NRW1wdHlDb21wb25lbnQ9 ZnVuY3Rpb24oaW5zdGFudGlhdGUpe3RoaXMuX2N1cnJlbnRFbGVtZW50PW51bGw7dGhpcy5faG9z dE5vZGU9bnVsbDt0aGlzLl9ob3N0UGFyZW50PW51bGw7dGhpcy5faG9zdENvbnRhaW5lckluZm89 bnVsbDt0aGlzLl9kb21JRD0wfTtfYXNzaWduKFJlYWN0RE9NRW1wdHlDb21wb25lbnQucHJvdG90 eXBlLHttb3VudENvbXBvbmVudDpmdW5jdGlvbih0cmFuc2FjdGlvbixob3N0UGFyZW50LGhvc3RD b250YWluZXJJbmZvLGNvbnRleHQpe3ZhciBkb21JRD1ob3N0Q29udGFpbmVySW5mby5faWRDb3Vu dGVyKys7dGhpcy5fZG9tSUQ9ZG9tSUQ7dGhpcy5faG9zdFBhcmVudD1ob3N0UGFyZW50O3RoaXMu X2hvc3RDb250YWluZXJJbmZvPWhvc3RDb250YWluZXJJbmZvO3ZhciBub2RlVmFsdWU9IiByZWFj dC1lbXB0eTogIit0aGlzLl9kb21JRCsiICI7aWYodHJhbnNhY3Rpb24udXNlQ3JlYXRlRWxlbWVu dCl7dmFyIG93bmVyRG9jdW1lbnQ9aG9zdENvbnRhaW5lckluZm8uX293bmVyRG9jdW1lbnQ7dmFy IG5vZGU9b3duZXJEb2N1bWVudC5jcmVhdGVDb21tZW50KG5vZGVWYWx1ZSk7UmVhY3RET01Db21w b25lbnRUcmVlLnByZWNhY2hlTm9kZSh0aGlzLG5vZGUpO3JldHVybiBET01MYXp5VHJlZShub2Rl KX1lbHNle2lmKHRyYW5zYWN0aW9uLnJlbmRlclRvU3RhdGljTWFya3VwKXtyZXR1cm4iIn1yZXR1 cm4iXHgzYyEtLSIrbm9kZVZhbHVlKyItLVx4M2UifX0scmVjZWl2ZUNvbXBvbmVudDpmdW5jdGlv bigpe30sZ2V0SG9zdE5vZGU6ZnVuY3Rpb24oKXtyZXR1cm4gUmVhY3RET01Db21wb25lbnRUcmVl LmdldE5vZGVGcm9tSW5zdGFuY2UodGhpcyl9LHVubW91bnRDb21wb25lbnQ6ZnVuY3Rpb24oKXtS ZWFjdERPTUNvbXBvbmVudFRyZWUudW5jYWNoZU5vZGUodGhpcyl9fSk7bW9kdWxlLmV4cG9ydHM9 UmVhY3RET01FbXB0eUNvbXBvbmVudH0sezE0ODoxNDgsMzI6MzIsOTo5fV0sMzU6W2Z1bmN0aW9u KF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgRE9NQ2hpbGRyZW5PcGVy YXRpb25zPV9kZXJlcV8oOCk7dmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZT1fZGVyZXFfKDMyKTt2 YXIgUmVhY3RET01JRE9wZXJhdGlvbnM9e2Rhbmdlcm91c2x5UHJvY2Vzc0NoaWxkcmVuVXBkYXRl czpmdW5jdGlvbihwYXJlbnRJbnN0LHVwZGF0ZXMpe3ZhciBub2RlPVJlYWN0RE9NQ29tcG9uZW50 VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKHBhcmVudEluc3QpO0RPTUNoaWxkcmVuT3BlcmF0aW9u cy5wcm9jZXNzVXBkYXRlcyhub2RlLHVwZGF0ZXMpfX07bW9kdWxlLmV4cG9ydHM9UmVhY3RET01J RE9wZXJhdGlvbnN9LHszMjozMiw4Ojh9XSwzNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhw b3J0cyl7InVzZSBzdHJpY3QiO3ZhciBfcHJvZEludmFyaWFudD1fZGVyZXFfKDExNiksX2Fzc2ln bj1fZGVyZXFfKDE0OCk7dmFyIERPTVByb3BlcnR5T3BlcmF0aW9ucz1fZGVyZXFfKDEyKTt2YXIg TGlua2VkVmFsdWVVdGlscz1fZGVyZXFfKDIzKTt2YXIgUmVhY3RET01Db21wb25lbnRUcmVlPV9k ZXJlcV8oMzIpO3ZhciBSZWFjdFVwZGF0ZXM9X2RlcmVxXyg3NSk7dmFyIGludmFyaWFudD1fZGVy ZXFfKDE0MCk7dmFyIHdhcm5pbmc9X2RlcmVxXygxNDcpO3ZhciBkaWRXYXJuVmFsdWVMaW5rPWZh bHNlO3ZhciBkaWRXYXJuQ2hlY2tlZExpbms9ZmFsc2U7dmFyIGRpZFdhcm5WYWx1ZURlZmF1bHRW YWx1ZT1mYWxzZTt2YXIgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZD1mYWxzZTt2YXIgZGlk V2FybkNvbnRyb2xsZWRUb1VuY29udHJvbGxlZD1mYWxzZTt2YXIgZGlkV2FyblVuY29udHJvbGxl ZFRvQ29udHJvbGxlZD1mYWxzZTtmdW5jdGlvbiBmb3JjZVVwZGF0ZUlmTW91bnRlZCgpe2lmKHRo aXMuX3Jvb3ROb2RlSUQpe1JlYWN0RE9NSW5wdXQudXBkYXRlV3JhcHBlcih0aGlzKX19ZnVuY3Rp b24gaXNDb250cm9sbGVkKHByb3BzKXt2YXIgdXNlc0NoZWNrZWQ9cHJvcHMudHlwZT09PSJjaGVj a2JveCJ8fHByb3BzLnR5cGU9PT0icmFkaW8iO3JldHVybiB1c2VzQ2hlY2tlZD9wcm9wcy5jaGVj a2VkIT1udWxsOnByb3BzLnZhbHVlIT1udWxsfXZhciBSZWFjdERPTUlucHV0PXtnZXRIb3N0UHJv cHM6ZnVuY3Rpb24oaW5zdCxwcm9wcyl7dmFyIHZhbHVlPUxpbmtlZFZhbHVlVXRpbHMuZ2V0VmFs dWUocHJvcHMpO3ZhciBjaGVja2VkPUxpbmtlZFZhbHVlVXRpbHMuZ2V0Q2hlY2tlZChwcm9wcyk7 dmFyIGhvc3RQcm9wcz1fYXNzaWduKHt0eXBlOnVuZGVmaW5lZCxzdGVwOnVuZGVmaW5lZCxtaW46 dW5kZWZpbmVkLG1heDp1bmRlZmluZWR9LHByb3BzLHtkZWZhdWx0Q2hlY2tlZDp1bmRlZmluZWQs ZGVmYXVsdFZhbHVlOnVuZGVmaW5lZCx2YWx1ZTp2YWx1ZSE9bnVsbD92YWx1ZTppbnN0Ll93cmFw cGVyU3RhdGUuaW5pdGlhbFZhbHVlLGNoZWNrZWQ6Y2hlY2tlZCE9bnVsbD9jaGVja2VkOmluc3Qu X3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZCxvbkNoYW5nZTppbnN0Ll93cmFwcGVyU3RhdGUu b25DaGFuZ2V9KTtyZXR1cm4gaG9zdFByb3BzfSxtb3VudFdyYXBwZXI6ZnVuY3Rpb24oaW5zdCxw cm9wcyl7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7TGlua2VkVmFsdWVVdGlscy5j aGVja1Byb3BUeXBlcygiaW5wdXQiLHByb3BzLGluc3QuX2N1cnJlbnRFbGVtZW50Ll9vd25lcik7 dmFyIG93bmVyPWluc3QuX2N1cnJlbnRFbGVtZW50Ll9vd25lcjtpZihwcm9wcy52YWx1ZUxpbmsh PT11bmRlZmluZWQmJiFkaWRXYXJuVmFsdWVMaW5rKXsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rp b24iP3dhcm5pbmcoZmFsc2UsImB2YWx1ZUxpbmtgIHByb3Agb24gYGlucHV0YCBpcyBkZXByZWNh dGVkOyBzZXQgYHZhbHVlYCBhbmQgYG9uQ2hhbmdlYCBpbnN0ZWFkLiIpOnZvaWQgMDtkaWRXYXJu VmFsdWVMaW5rPXRydWV9aWYocHJvcHMuY2hlY2tlZExpbmshPT11bmRlZmluZWQmJiFkaWRXYXJu Q2hlY2tlZExpbmspeyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyhmYWxzZSwi YGNoZWNrZWRMaW5rYCBwcm9wIG9uIGBpbnB1dGAgaXMgZGVwcmVjYXRlZDsgc2V0IGB2YWx1ZWAg YW5kIGBvbkNoYW5nZWAgaW5zdGVhZC4iKTp2b2lkIDA7ZGlkV2FybkNoZWNrZWRMaW5rPXRydWV9 aWYocHJvcHMuY2hlY2tlZCE9PXVuZGVmaW5lZCYmcHJvcHMuZGVmYXVsdENoZWNrZWQhPT11bmRl ZmluZWQmJiFkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkKXsiZGV2ZWxvcG1lbnQiIT09InBy b2R1Y3Rpb24iP3dhcm5pbmcoZmFsc2UsIiVzIGNvbnRhaW5zIGFuIGlucHV0IG9mIHR5cGUgJXMg d2l0aCBib3RoIGNoZWNrZWQgYW5kIGRlZmF1bHRDaGVja2VkIHByb3BzLiAiKyJJbnB1dCBlbGVt ZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAiKyIoc3BlY2lm eSBlaXRoZXIgdGhlIGNoZWNrZWQgcHJvcCwgb3IgdGhlIGRlZmF1bHRDaGVja2VkIHByb3AsIGJ1 dCBub3QgIisiYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNv bnRyb2xsZWQgaW5wdXQgIisiZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4g TW9yZSBpbmZvOiAiKyJodHRwczovL2ZiLm1lL3JlYWN0LWNvbnRyb2xsZWQtY29tcG9uZW50cyIs b3duZXImJm93bmVyLmdldE5hbWUoKXx8IkEgY29tcG9uZW50Iixwcm9wcy50eXBlKTp2b2lkIDA7 ZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZD10cnVlfWlmKHByb3BzLnZhbHVlIT09dW5kZWZp bmVkJiZwcm9wcy5kZWZhdWx0VmFsdWUhPT11bmRlZmluZWQmJiFkaWRXYXJuVmFsdWVEZWZhdWx0 VmFsdWUpeyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyhmYWxzZSwiJXMgY29u dGFpbnMgYW4gaW5wdXQgb2YgdHlwZSAlcyB3aXRoIGJvdGggdmFsdWUgYW5kIGRlZmF1bHRWYWx1 ZSBwcm9wcy4gIisiSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1 bmNvbnRyb2xsZWQgIisiKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVm YXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgIisiYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEg Y29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgIisiZWxlbWVudCBhbmQgcmVtb3ZlIG9u ZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAiKyJodHRwczovL2ZiLm1lL3JlYWN0LWNvbnRy b2xsZWQtY29tcG9uZW50cyIsb3duZXImJm93bmVyLmdldE5hbWUoKXx8IkEgY29tcG9uZW50Iixw cm9wcy50eXBlKTp2b2lkIDA7ZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlPXRydWV9fXZhciBkZWZh dWx0VmFsdWU9cHJvcHMuZGVmYXVsdFZhbHVlO2luc3QuX3dyYXBwZXJTdGF0ZT17aW5pdGlhbENo ZWNrZWQ6cHJvcHMuY2hlY2tlZCE9bnVsbD9wcm9wcy5jaGVja2VkOnByb3BzLmRlZmF1bHRDaGVj a2VkLGluaXRpYWxWYWx1ZTpwcm9wcy52YWx1ZSE9bnVsbD9wcm9wcy52YWx1ZTpkZWZhdWx0VmFs dWUsbGlzdGVuZXJzOm51bGwsb25DaGFuZ2U6X2hhbmRsZUNoYW5nZS5iaW5kKGluc3QpfTtpZigi ZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtpbnN0Ll93cmFwcGVyU3RhdGUuY29udHJvbGxl ZD1pc0NvbnRyb2xsZWQocHJvcHMpfX0sdXBkYXRlV3JhcHBlcjpmdW5jdGlvbihpbnN0KXt2YXIg cHJvcHM9aW5zdC5fY3VycmVudEVsZW1lbnQucHJvcHM7aWYoImRldmVsb3BtZW50IiE9PSJwcm9k dWN0aW9uIil7dmFyIGNvbnRyb2xsZWQ9aXNDb250cm9sbGVkKHByb3BzKTt2YXIgb3duZXI9aW5z dC5fY3VycmVudEVsZW1lbnQuX293bmVyO2lmKCFpbnN0Ll93cmFwcGVyU3RhdGUuY29udHJvbGxl ZCYmY29udHJvbGxlZCYmIWRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQpeyJkZXZlbG9w bWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyhmYWxzZSwiJXMgaXMgY2hhbmdpbmcgYW4gdW5j b250cm9sbGVkIGlucHV0IG9mIHR5cGUgJXMgdG8gYmUgY29udHJvbGxlZC4gIisiSW5wdXQgZWxl bWVudHMgc2hvdWxkIG5vdCBzd2l0Y2ggZnJvbSB1bmNvbnRyb2xsZWQgdG8gY29udHJvbGxlZCAo b3IgdmljZSB2ZXJzYSkuICIrIkRlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1 bmNvbnRyb2xsZWQgaW5wdXQgIisiZWxlbWVudCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb21w b25lbnQuIE1vcmUgaW5mbzogaHR0cHM6Ly9mYi5tZS9yZWFjdC1jb250cm9sbGVkLWNvbXBvbmVu dHMiLG93bmVyJiZvd25lci5nZXROYW1lKCl8fCJBIGNvbXBvbmVudCIscHJvcHMudHlwZSk6dm9p ZCAwO2RpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQ9dHJ1ZX1pZihpbnN0Ll93cmFwcGVy U3RhdGUuY29udHJvbGxlZCYmIWNvbnRyb2xsZWQmJiFkaWRXYXJuQ29udHJvbGxlZFRvVW5jb250 cm9sbGVkKXsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmcoZmFsc2UsIiVzIGlz IGNoYW5naW5nIGEgY29udHJvbGxlZCBpbnB1dCBvZiB0eXBlICVzIHRvIGJlIHVuY29udHJvbGxl ZC4gIisiSW5wdXQgZWxlbWVudHMgc2hvdWxkIG5vdCBzd2l0Y2ggZnJvbSBjb250cm9sbGVkIHRv IHVuY29udHJvbGxlZCAob3IgdmljZSB2ZXJzYSkuICIrIkRlY2lkZSBiZXR3ZWVuIHVzaW5nIGEg Y29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgIisiZWxlbWVudCBmb3IgdGhlIGxpZmV0 aW1lIG9mIHRoZSBjb21wb25lbnQuIE1vcmUgaW5mbzogaHR0cHM6Ly9mYi5tZS9yZWFjdC1jb250 cm9sbGVkLWNvbXBvbmVudHMiLG93bmVyJiZvd25lci5nZXROYW1lKCl8fCJBIGNvbXBvbmVudCIs cHJvcHMudHlwZSk6dm9pZCAwO2RpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQ9dHJ1ZX19 dmFyIGNoZWNrZWQ9cHJvcHMuY2hlY2tlZDtpZihjaGVja2VkIT1udWxsKXtET01Qcm9wZXJ0eU9w ZXJhdGlvbnMuc2V0VmFsdWVGb3JQcm9wZXJ0eShSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9k ZUZyb21JbnN0YW5jZShpbnN0KSwiY2hlY2tlZCIsY2hlY2tlZHx8ZmFsc2UpfXZhciBub2RlPVJl YWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpO3ZhciB2YWx1ZT1M aW5rZWRWYWx1ZVV0aWxzLmdldFZhbHVlKHByb3BzKTtpZih2YWx1ZSE9bnVsbCl7dmFyIG5ld1Zh bHVlPSIiK3ZhbHVlO2lmKG5ld1ZhbHVlIT09bm9kZS52YWx1ZSl7bm9kZS52YWx1ZT1uZXdWYWx1 ZX19ZWxzZXtpZihwcm9wcy52YWx1ZT09bnVsbCYmcHJvcHMuZGVmYXVsdFZhbHVlIT1udWxsKXtp Zihub2RlLmRlZmF1bHRWYWx1ZSE9PSIiK3Byb3BzLmRlZmF1bHRWYWx1ZSl7bm9kZS5kZWZhdWx0 VmFsdWU9IiIrcHJvcHMuZGVmYXVsdFZhbHVlfX1pZihwcm9wcy5jaGVja2VkPT1udWxsJiZwcm9w cy5kZWZhdWx0Q2hlY2tlZCE9bnVsbCl7bm9kZS5kZWZhdWx0Q2hlY2tlZD0hIXByb3BzLmRlZmF1 bHRDaGVja2VkfX19LHBvc3RNb3VudFdyYXBwZXI6ZnVuY3Rpb24oaW5zdCl7dmFyIHByb3BzPWlu c3QuX2N1cnJlbnRFbGVtZW50LnByb3BzO3ZhciBub2RlPVJlYWN0RE9NQ29tcG9uZW50VHJlZS5n ZXROb2RlRnJvbUluc3RhbmNlKGluc3QpO3N3aXRjaChwcm9wcy50eXBlKXtjYXNlInN1Ym1pdCI6 Y2FzZSJyZXNldCI6YnJlYWs7Y2FzZSJjb2xvciI6Y2FzZSJkYXRlIjpjYXNlImRhdGV0aW1lIjpj YXNlImRhdGV0aW1lLWxvY2FsIjpjYXNlIm1vbnRoIjpjYXNlInRpbWUiOmNhc2Uid2VlayI6bm9k ZS52YWx1ZT0iIjtub2RlLnZhbHVlPW5vZGUuZGVmYXVsdFZhbHVlO2JyZWFrO2RlZmF1bHQ6bm9k ZS52YWx1ZT1ub2RlLnZhbHVlO2JyZWFrfXZhciBuYW1lPW5vZGUubmFtZTtpZihuYW1lIT09IiIp e25vZGUubmFtZT0iIn1ub2RlLmRlZmF1bHRDaGVja2VkPSFub2RlLmRlZmF1bHRDaGVja2VkO25v ZGUuZGVmYXVsdENoZWNrZWQ9IW5vZGUuZGVmYXVsdENoZWNrZWQ7aWYobmFtZSE9PSIiKXtub2Rl Lm5hbWU9bmFtZX19fTtmdW5jdGlvbiBfaGFuZGxlQ2hhbmdlKGV2ZW50KXt2YXIgcHJvcHM9dGhp cy5fY3VycmVudEVsZW1lbnQucHJvcHM7dmFyIHJldHVyblZhbHVlPUxpbmtlZFZhbHVlVXRpbHMu ZXhlY3V0ZU9uQ2hhbmdlKHByb3BzLGV2ZW50KTtSZWFjdFVwZGF0ZXMuYXNhcChmb3JjZVVwZGF0 ZUlmTW91bnRlZCx0aGlzKTt2YXIgbmFtZT1wcm9wcy5uYW1lO2lmKHByb3BzLnR5cGU9PT0icmFk aW8iJiZuYW1lIT1udWxsKXt2YXIgcm9vdE5vZGU9UmVhY3RET01Db21wb25lbnRUcmVlLmdldE5v ZGVGcm9tSW5zdGFuY2UodGhpcyk7dmFyIHF1ZXJ5Um9vdD1yb290Tm9kZTt3aGlsZShxdWVyeVJv b3QucGFyZW50Tm9kZSl7cXVlcnlSb290PXF1ZXJ5Um9vdC5wYXJlbnROb2RlfXZhciBncm91cD1x dWVyeVJvb3QucXVlcnlTZWxlY3RvckFsbCgiaW5wdXRbbmFtZT0iK0pTT04uc3RyaW5naWZ5KCIi K25hbWUpKyddW3R5cGU9InJhZGlvIl0nKTtmb3IodmFyIGk9MDtpPGdyb3VwLmxlbmd0aDtpKysp e3ZhciBvdGhlck5vZGU9Z3JvdXBbaV07aWYob3RoZXJOb2RlPT09cm9vdE5vZGV8fG90aGVyTm9k ZS5mb3JtIT09cm9vdE5vZGUuZm9ybSl7Y29udGludWV9dmFyIG90aGVySW5zdGFuY2U9UmVhY3RE T01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUob3RoZXJOb2RlKTshb3RoZXJJbnN0 YW5jZT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiUmVhY3RE T01JbnB1dDogTWl4aW5nIFJlYWN0IGFuZCBub24tUmVhY3QgcmFkaW8gaW5wdXRzIHdpdGggdGhl IHNhbWUgYG5hbWVgIGlzIG5vdCBzdXBwb3J0ZWQuIik6X3Byb2RJbnZhcmlhbnQoIjkwIik6dm9p ZCAwO1JlYWN0VXBkYXRlcy5hc2FwKGZvcmNlVXBkYXRlSWZNb3VudGVkLG90aGVySW5zdGFuY2Up fX1yZXR1cm4gcmV0dXJuVmFsdWV9bW9kdWxlLmV4cG9ydHM9UmVhY3RET01JbnB1dH0sezExNjox MTYsMTI6MTIsMTQwOjE0MCwxNDc6MTQ3LDE0ODoxNDgsMjM6MjMsMzI6MzIsNzU6NzV9XSwzNzpb ZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBfYXNzaWdu PV9kZXJlcV8oMTQ4KTt2YXIgUmVhY3Q9X2RlcmVxXygxMjQpO3ZhciBSZWFjdERPTUNvbXBvbmVu dFRyZWU9X2RlcmVxXygzMik7dmFyIFJlYWN0RE9NU2VsZWN0PV9kZXJlcV8oMzgpO3ZhciB3YXJu aW5nPV9kZXJlcV8oMTQ3KTt2YXIgZGlkV2FybkludmFsaWRPcHRpb25DaGlsZHJlbj1mYWxzZTtm dW5jdGlvbiBmbGF0dGVuQ2hpbGRyZW4oY2hpbGRyZW4pe3ZhciBjb250ZW50PSIiO1JlYWN0LkNo aWxkcmVuLmZvckVhY2goY2hpbGRyZW4sZnVuY3Rpb24oY2hpbGQpe2lmKGNoaWxkPT1udWxsKXty ZXR1cm59aWYodHlwZW9mIGNoaWxkPT09InN0cmluZyJ8fHR5cGVvZiBjaGlsZD09PSJudW1iZXIi KXtjb250ZW50Kz1jaGlsZH1lbHNlIGlmKCFkaWRXYXJuSW52YWxpZE9wdGlvbkNoaWxkcmVuKXtk aWRXYXJuSW52YWxpZE9wdGlvbkNoaWxkcmVuPXRydWU7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0 aW9uIj93YXJuaW5nKGZhbHNlLCJPbmx5IHN0cmluZ3MgYW5kIG51bWJlcnMgYXJlIHN1cHBvcnRl ZCBhcyA8b3B0aW9uPiBjaGlsZHJlbi4iKTp2b2lkIDB9fSk7cmV0dXJuIGNvbnRlbnR9dmFyIFJl YWN0RE9NT3B0aW9uPXttb3VudFdyYXBwZXI6ZnVuY3Rpb24oaW5zdCxwcm9wcyxob3N0UGFyZW50 KXtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXsiZGV2ZWxvcG1lbnQiIT09InByb2R1 Y3Rpb24iP3dhcm5pbmcocHJvcHMuc2VsZWN0ZWQ9PW51bGwsIlVzZSB0aGUgYGRlZmF1bHRWYWx1 ZWAgb3IgYHZhbHVlYCBwcm9wcyBvbiA8c2VsZWN0PiBpbnN0ZWFkIG9mICIrInNldHRpbmcgYHNl bGVjdGVkYCBvbiA8b3B0aW9uPi4iKTp2b2lkIDB9dmFyIHNlbGVjdFZhbHVlPW51bGw7aWYoaG9z dFBhcmVudCE9bnVsbCl7dmFyIHNlbGVjdFBhcmVudD1ob3N0UGFyZW50O2lmKHNlbGVjdFBhcmVu dC5fdGFnPT09Im9wdGdyb3VwIil7c2VsZWN0UGFyZW50PXNlbGVjdFBhcmVudC5faG9zdFBhcmVu dH1pZihzZWxlY3RQYXJlbnQhPW51bGwmJnNlbGVjdFBhcmVudC5fdGFnPT09InNlbGVjdCIpe3Nl bGVjdFZhbHVlPVJlYWN0RE9NU2VsZWN0LmdldFNlbGVjdFZhbHVlQ29udGV4dChzZWxlY3RQYXJl bnQpfX12YXIgc2VsZWN0ZWQ9bnVsbDtpZihzZWxlY3RWYWx1ZSE9bnVsbCl7dmFyIHZhbHVlO2lm KHByb3BzLnZhbHVlIT1udWxsKXt2YWx1ZT1wcm9wcy52YWx1ZSsiIn1lbHNle3ZhbHVlPWZsYXR0 ZW5DaGlsZHJlbihwcm9wcy5jaGlsZHJlbil9c2VsZWN0ZWQ9ZmFsc2U7aWYoQXJyYXkuaXNBcnJh eShzZWxlY3RWYWx1ZSkpe2Zvcih2YXIgaT0wO2k8c2VsZWN0VmFsdWUubGVuZ3RoO2krKyl7aWYo IiIrc2VsZWN0VmFsdWVbaV09PT12YWx1ZSl7c2VsZWN0ZWQ9dHJ1ZTticmVha319fWVsc2V7c2Vs ZWN0ZWQ9IiIrc2VsZWN0VmFsdWU9PT12YWx1ZX19aW5zdC5fd3JhcHBlclN0YXRlPXtzZWxlY3Rl ZDpzZWxlY3RlZH19LHBvc3RNb3VudFdyYXBwZXI6ZnVuY3Rpb24oaW5zdCl7dmFyIHByb3BzPWlu c3QuX2N1cnJlbnRFbGVtZW50LnByb3BzO2lmKHByb3BzLnZhbHVlIT1udWxsKXt2YXIgbm9kZT1S ZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KTtub2RlLnNldEF0 dHJpYnV0ZSgidmFsdWUiLHByb3BzLnZhbHVlKX19LGdldEhvc3RQcm9wczpmdW5jdGlvbihpbnN0 LHByb3BzKXt2YXIgaG9zdFByb3BzPV9hc3NpZ24oe3NlbGVjdGVkOnVuZGVmaW5lZCxjaGlsZHJl bjp1bmRlZmluZWR9LHByb3BzKTtpZihpbnN0Ll93cmFwcGVyU3RhdGUuc2VsZWN0ZWQhPW51bGwp e2hvc3RQcm9wcy5zZWxlY3RlZD1pbnN0Ll93cmFwcGVyU3RhdGUuc2VsZWN0ZWR9dmFyIGNvbnRl bnQ9ZmxhdHRlbkNoaWxkcmVuKHByb3BzLmNoaWxkcmVuKTtpZihjb250ZW50KXtob3N0UHJvcHMu Y2hpbGRyZW49Y29udGVudH1yZXR1cm4gaG9zdFByb3BzfX07bW9kdWxlLmV4cG9ydHM9UmVhY3RE T01PcHRpb259LHsxMjQ6MTI0LDE0NzoxNDcsMTQ4OjE0OCwzMjozMiwzODozOH1dLDM4OltmdW5j dGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIF9hc3NpZ249X2Rl cmVxXygxNDgpO3ZhciBMaW5rZWRWYWx1ZVV0aWxzPV9kZXJlcV8oMjMpO3ZhciBSZWFjdERPTUNv bXBvbmVudFRyZWU9X2RlcmVxXygzMik7dmFyIFJlYWN0VXBkYXRlcz1fZGVyZXFfKDc1KTt2YXIg d2FybmluZz1fZGVyZXFfKDE0Nyk7dmFyIGRpZFdhcm5WYWx1ZUxpbms9ZmFsc2U7dmFyIGRpZFdh cm5WYWx1ZURlZmF1bHRWYWx1ZT1mYWxzZTtmdW5jdGlvbiB1cGRhdGVPcHRpb25zSWZQZW5kaW5n VXBkYXRlQW5kTW91bnRlZCgpe2lmKHRoaXMuX3Jvb3ROb2RlSUQmJnRoaXMuX3dyYXBwZXJTdGF0 ZS5wZW5kaW5nVXBkYXRlKXt0aGlzLl93cmFwcGVyU3RhdGUucGVuZGluZ1VwZGF0ZT1mYWxzZTt2 YXIgcHJvcHM9dGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHM7dmFyIHZhbHVlPUxpbmtlZFZhbHVl VXRpbHMuZ2V0VmFsdWUocHJvcHMpO2lmKHZhbHVlIT1udWxsKXt1cGRhdGVPcHRpb25zKHRoaXMs Qm9vbGVhbihwcm9wcy5tdWx0aXBsZSksdmFsdWUpfX19ZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25F cnJvckFkZGVuZHVtKG93bmVyKXtpZihvd25lcil7dmFyIG5hbWU9b3duZXIuZ2V0TmFtZSgpO2lm KG5hbWUpe3JldHVybiIgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCIrbmFtZSsiYC4ifX1y ZXR1cm4iIn12YXIgdmFsdWVQcm9wTmFtZXM9WyJ2YWx1ZSIsImRlZmF1bHRWYWx1ZSJdO2Z1bmN0 aW9uIGNoZWNrU2VsZWN0UHJvcFR5cGVzKGluc3QscHJvcHMpe3ZhciBvd25lcj1pbnN0Ll9jdXJy ZW50RWxlbWVudC5fb3duZXI7TGlua2VkVmFsdWVVdGlscy5jaGVja1Byb3BUeXBlcygic2VsZWN0 Iixwcm9wcyxvd25lcik7aWYocHJvcHMudmFsdWVMaW5rIT09dW5kZWZpbmVkJiYhZGlkV2FyblZh bHVlTGluayl7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKGZhbHNlLCJgdmFs dWVMaW5rYCBwcm9wIG9uIGBzZWxlY3RgIGlzIGRlcHJlY2F0ZWQ7IHNldCBgdmFsdWVgIGFuZCBg b25DaGFuZ2VgIGluc3RlYWQuIik6dm9pZCAwO2RpZFdhcm5WYWx1ZUxpbms9dHJ1ZX1mb3IodmFy IGk9MDtpPHZhbHVlUHJvcE5hbWVzLmxlbmd0aDtpKyspe3ZhciBwcm9wTmFtZT12YWx1ZVByb3BO YW1lc1tpXTtpZihwcm9wc1twcm9wTmFtZV09PW51bGwpe2NvbnRpbnVlfXZhciBpc0FycmF5PUFy cmF5LmlzQXJyYXkocHJvcHNbcHJvcE5hbWVdKTtpZihwcm9wcy5tdWx0aXBsZSYmIWlzQXJyYXkp eyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyhmYWxzZSwiVGhlIGAlc2AgcHJv cCBzdXBwbGllZCB0byA8c2VsZWN0PiBtdXN0IGJlIGFuIGFycmF5IGlmICIrImBtdWx0aXBsZWAg aXMgdHJ1ZS4lcyIscHJvcE5hbWUsZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKG93bmVyKSk6 dm9pZCAwfWVsc2UgaWYoIXByb3BzLm11bHRpcGxlJiZpc0FycmF5KXsiZGV2ZWxvcG1lbnQiIT09 InByb2R1Y3Rpb24iP3dhcm5pbmcoZmFsc2UsIlRoZSBgJXNgIHByb3Agc3VwcGxpZWQgdG8gPHNl bGVjdD4gbXVzdCBiZSBhIHNjYWxhciAiKyJ2YWx1ZSBpZiBgbXVsdGlwbGVgIGlzIGZhbHNlLiVz Iixwcm9wTmFtZSxnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0ob3duZXIpKTp2b2lkIDB9fX1m dW5jdGlvbiB1cGRhdGVPcHRpb25zKGluc3QsbXVsdGlwbGUscHJvcFZhbHVlKXt2YXIgc2VsZWN0 ZWRWYWx1ZSxpO3ZhciBvcHRpb25zPVJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUlu c3RhbmNlKGluc3QpLm9wdGlvbnM7aWYobXVsdGlwbGUpe3NlbGVjdGVkVmFsdWU9e307Zm9yKGk9 MDtpPHByb3BWYWx1ZS5sZW5ndGg7aSsrKXtzZWxlY3RlZFZhbHVlWyIiK3Byb3BWYWx1ZVtpXV09 dHJ1ZX1mb3IoaT0wO2k8b3B0aW9ucy5sZW5ndGg7aSsrKXt2YXIgc2VsZWN0ZWQ9c2VsZWN0ZWRW YWx1ZS5oYXNPd25Qcm9wZXJ0eShvcHRpb25zW2ldLnZhbHVlKTtpZihvcHRpb25zW2ldLnNlbGVj dGVkIT09c2VsZWN0ZWQpe29wdGlvbnNbaV0uc2VsZWN0ZWQ9c2VsZWN0ZWR9fX1lbHNle3NlbGVj dGVkVmFsdWU9IiIrcHJvcFZhbHVlO2ZvcihpPTA7aTxvcHRpb25zLmxlbmd0aDtpKyspe2lmKG9w dGlvbnNbaV0udmFsdWU9PT1zZWxlY3RlZFZhbHVlKXtvcHRpb25zW2ldLnNlbGVjdGVkPXRydWU7 cmV0dXJufX1pZihvcHRpb25zLmxlbmd0aCl7b3B0aW9uc1swXS5zZWxlY3RlZD10cnVlfX19dmFy IFJlYWN0RE9NU2VsZWN0PXtnZXRIb3N0UHJvcHM6ZnVuY3Rpb24oaW5zdCxwcm9wcyl7cmV0dXJu IF9hc3NpZ24oe30scHJvcHMse29uQ2hhbmdlOmluc3QuX3dyYXBwZXJTdGF0ZS5vbkNoYW5nZSx2 YWx1ZTp1bmRlZmluZWR9KX0sbW91bnRXcmFwcGVyOmZ1bmN0aW9uKGluc3QscHJvcHMpe2lmKCJk ZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe2NoZWNrU2VsZWN0UHJvcFR5cGVzKGluc3QscHJv cHMpfXZhciB2YWx1ZT1MaW5rZWRWYWx1ZVV0aWxzLmdldFZhbHVlKHByb3BzKTtpbnN0Ll93cmFw cGVyU3RhdGU9e3BlbmRpbmdVcGRhdGU6ZmFsc2UsaW5pdGlhbFZhbHVlOnZhbHVlIT1udWxsP3Zh bHVlOnByb3BzLmRlZmF1bHRWYWx1ZSxsaXN0ZW5lcnM6bnVsbCxvbkNoYW5nZTpfaGFuZGxlQ2hh bmdlLmJpbmQoaW5zdCksd2FzTXVsdGlwbGU6Qm9vbGVhbihwcm9wcy5tdWx0aXBsZSl9O2lmKHBy b3BzLnZhbHVlIT09dW5kZWZpbmVkJiZwcm9wcy5kZWZhdWx0VmFsdWUhPT11bmRlZmluZWQmJiFk aWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUpeyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2Fy bmluZyhmYWxzZSwiU2VsZWN0IGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3Ig dW5jb250cm9sbGVkICIrIihzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRl ZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICIrImJvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBh IGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIHNlbGVjdCAiKyJlbGVtZW50IGFuZCByZW1vdmUg b25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICIrImh0dHBzOi8vZmIubWUvcmVhY3QtY29u dHJvbGxlZC1jb21wb25lbnRzIik6dm9pZCAwO2RpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZT10cnVl fX0sZ2V0U2VsZWN0VmFsdWVDb250ZXh0OmZ1bmN0aW9uKGluc3Qpe3JldHVybiBpbnN0Ll93cmFw cGVyU3RhdGUuaW5pdGlhbFZhbHVlfSxwb3N0VXBkYXRlV3JhcHBlcjpmdW5jdGlvbihpbnN0KXt2 YXIgcHJvcHM9aW5zdC5fY3VycmVudEVsZW1lbnQucHJvcHM7aW5zdC5fd3JhcHBlclN0YXRlLmlu aXRpYWxWYWx1ZT11bmRlZmluZWQ7dmFyIHdhc011bHRpcGxlPWluc3QuX3dyYXBwZXJTdGF0ZS53 YXNNdWx0aXBsZTtpbnN0Ll93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU9Qm9vbGVhbihwcm9wcy5t dWx0aXBsZSk7dmFyIHZhbHVlPUxpbmtlZFZhbHVlVXRpbHMuZ2V0VmFsdWUocHJvcHMpO2lmKHZh bHVlIT1udWxsKXtpbnN0Ll93cmFwcGVyU3RhdGUucGVuZGluZ1VwZGF0ZT1mYWxzZTt1cGRhdGVP cHRpb25zKGluc3QsQm9vbGVhbihwcm9wcy5tdWx0aXBsZSksdmFsdWUpfWVsc2UgaWYod2FzTXVs dGlwbGUhPT1Cb29sZWFuKHByb3BzLm11bHRpcGxlKSl7aWYocHJvcHMuZGVmYXVsdFZhbHVlIT1u dWxsKXt1cGRhdGVPcHRpb25zKGluc3QsQm9vbGVhbihwcm9wcy5tdWx0aXBsZSkscHJvcHMuZGVm YXVsdFZhbHVlKX1lbHNle3VwZGF0ZU9wdGlvbnMoaW5zdCxCb29sZWFuKHByb3BzLm11bHRpcGxl KSxwcm9wcy5tdWx0aXBsZT9bXToiIil9fX19O2Z1bmN0aW9uIF9oYW5kbGVDaGFuZ2UoZXZlbnQp e3ZhciBwcm9wcz10aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wczt2YXIgcmV0dXJuVmFsdWU9TGlu a2VkVmFsdWVVdGlscy5leGVjdXRlT25DaGFuZ2UocHJvcHMsZXZlbnQpO2lmKHRoaXMuX3Jvb3RO b2RlSUQpe3RoaXMuX3dyYXBwZXJTdGF0ZS5wZW5kaW5nVXBkYXRlPXRydWV9UmVhY3RVcGRhdGVz LmFzYXAodXBkYXRlT3B0aW9uc0lmUGVuZGluZ1VwZGF0ZUFuZE1vdW50ZWQsdGhpcyk7cmV0dXJu IHJldHVyblZhbHVlfW1vZHVsZS5leHBvcnRzPVJlYWN0RE9NU2VsZWN0fSx7MTQ3OjE0NywxNDg6 MTQ4LDIzOjIzLDMyOjMyLDc1Ojc1fV0sMzk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9y dHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQ9X2RlcmVxXygxMjYpO3Zh ciBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0PV9kZXJlcV8oMTA5KTt2YXIgZ2V0VGV4dENvbnRl bnRBY2Nlc3Nvcj1fZGVyZXFfKDExMCk7ZnVuY3Rpb24gaXNDb2xsYXBzZWQoYW5jaG9yTm9kZSxh bmNob3JPZmZzZXQsZm9jdXNOb2RlLGZvY3VzT2Zmc2V0KXtyZXR1cm4gYW5jaG9yTm9kZT09PWZv Y3VzTm9kZSYmYW5jaG9yT2Zmc2V0PT09Zm9jdXNPZmZzZXR9ZnVuY3Rpb24gZ2V0SUVPZmZzZXRz KG5vZGUpe3ZhciBzZWxlY3Rpb249ZG9jdW1lbnQuc2VsZWN0aW9uO3ZhciBzZWxlY3RlZFJhbmdl PXNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpO3ZhciBzZWxlY3RlZExlbmd0aD1zZWxlY3RlZFJhbmdl LnRleHQubGVuZ3RoO3ZhciBmcm9tU3RhcnQ9c2VsZWN0ZWRSYW5nZS5kdXBsaWNhdGUoKTtmcm9t U3RhcnQubW92ZVRvRWxlbWVudFRleHQobm9kZSk7ZnJvbVN0YXJ0LnNldEVuZFBvaW50KCJFbmRU b1N0YXJ0IixzZWxlY3RlZFJhbmdlKTt2YXIgc3RhcnRPZmZzZXQ9ZnJvbVN0YXJ0LnRleHQubGVu Z3RoO3ZhciBlbmRPZmZzZXQ9c3RhcnRPZmZzZXQrc2VsZWN0ZWRMZW5ndGg7cmV0dXJue3N0YXJ0 OnN0YXJ0T2Zmc2V0LGVuZDplbmRPZmZzZXR9fWZ1bmN0aW9uIGdldE1vZGVybk9mZnNldHMobm9k ZSl7dmFyIHNlbGVjdGlvbj13aW5kb3cuZ2V0U2VsZWN0aW9uJiZ3aW5kb3cuZ2V0U2VsZWN0aW9u KCk7aWYoIXNlbGVjdGlvbnx8c2VsZWN0aW9uLnJhbmdlQ291bnQ9PT0wKXtyZXR1cm4gbnVsbH12 YXIgYW5jaG9yTm9kZT1zZWxlY3Rpb24uYW5jaG9yTm9kZTt2YXIgYW5jaG9yT2Zmc2V0PXNlbGVj dGlvbi5hbmNob3JPZmZzZXQ7dmFyIGZvY3VzTm9kZT1zZWxlY3Rpb24uZm9jdXNOb2RlO3ZhciBm b2N1c09mZnNldD1zZWxlY3Rpb24uZm9jdXNPZmZzZXQ7dmFyIGN1cnJlbnRSYW5nZT1zZWxlY3Rp b24uZ2V0UmFuZ2VBdCgwKTt0cnl7Y3VycmVudFJhbmdlLnN0YXJ0Q29udGFpbmVyLm5vZGVUeXBl O2N1cnJlbnRSYW5nZS5lbmRDb250YWluZXIubm9kZVR5cGV9Y2F0Y2goZSl7cmV0dXJuIG51bGx9 dmFyIGlzU2VsZWN0aW9uQ29sbGFwc2VkPWlzQ29sbGFwc2VkKHNlbGVjdGlvbi5hbmNob3JOb2Rl LHNlbGVjdGlvbi5hbmNob3JPZmZzZXQsc2VsZWN0aW9uLmZvY3VzTm9kZSxzZWxlY3Rpb24uZm9j dXNPZmZzZXQpO3ZhciByYW5nZUxlbmd0aD1pc1NlbGVjdGlvbkNvbGxhcHNlZD8wOmN1cnJlbnRS YW5nZS50b1N0cmluZygpLmxlbmd0aDt2YXIgdGVtcFJhbmdlPWN1cnJlbnRSYW5nZS5jbG9uZVJh bmdlKCk7dGVtcFJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhub2RlKTt0ZW1wUmFuZ2Uuc2V0RW5k KGN1cnJlbnRSYW5nZS5zdGFydENvbnRhaW5lcixjdXJyZW50UmFuZ2Uuc3RhcnRPZmZzZXQpO3Zh ciBpc1RlbXBSYW5nZUNvbGxhcHNlZD1pc0NvbGxhcHNlZCh0ZW1wUmFuZ2Uuc3RhcnRDb250YWlu ZXIsdGVtcFJhbmdlLnN0YXJ0T2Zmc2V0LHRlbXBSYW5nZS5lbmRDb250YWluZXIsdGVtcFJhbmdl LmVuZE9mZnNldCk7dmFyIHN0YXJ0PWlzVGVtcFJhbmdlQ29sbGFwc2VkPzA6dGVtcFJhbmdlLnRv U3RyaW5nKCkubGVuZ3RoO3ZhciBlbmQ9c3RhcnQrcmFuZ2VMZW5ndGg7dmFyIGRldGVjdGlvblJh bmdlPWRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7ZGV0ZWN0aW9uUmFuZ2Uuc2V0U3RhcnQoYW5jaG9y Tm9kZSxhbmNob3JPZmZzZXQpO2RldGVjdGlvblJhbmdlLnNldEVuZChmb2N1c05vZGUsZm9jdXNP ZmZzZXQpO3ZhciBpc0JhY2t3YXJkPWRldGVjdGlvblJhbmdlLmNvbGxhcHNlZDtyZXR1cm57c3Rh cnQ6aXNCYWNrd2FyZD9lbmQ6c3RhcnQsZW5kOmlzQmFja3dhcmQ/c3RhcnQ6ZW5kfX1mdW5jdGlv biBzZXRJRU9mZnNldHMobm9kZSxvZmZzZXRzKXt2YXIgcmFuZ2U9ZG9jdW1lbnQuc2VsZWN0aW9u LmNyZWF0ZVJhbmdlKCkuZHVwbGljYXRlKCk7dmFyIHN0YXJ0LGVuZDtpZihvZmZzZXRzLmVuZD09 PXVuZGVmaW5lZCl7c3RhcnQ9b2Zmc2V0cy5zdGFydDtlbmQ9c3RhcnR9ZWxzZSBpZihvZmZzZXRz LnN0YXJ0Pm9mZnNldHMuZW5kKXtzdGFydD1vZmZzZXRzLmVuZDtlbmQ9b2Zmc2V0cy5zdGFydH1l bHNle3N0YXJ0PW9mZnNldHMuc3RhcnQ7ZW5kPW9mZnNldHMuZW5kfXJhbmdlLm1vdmVUb0VsZW1l bnRUZXh0KG5vZGUpO3JhbmdlLm1vdmVTdGFydCgiY2hhcmFjdGVyIixzdGFydCk7cmFuZ2Uuc2V0 RW5kUG9pbnQoIkVuZFRvU3RhcnQiLHJhbmdlKTtyYW5nZS5tb3ZlRW5kKCJjaGFyYWN0ZXIiLGVu ZC1zdGFydCk7cmFuZ2Uuc2VsZWN0KCl9ZnVuY3Rpb24gc2V0TW9kZXJuT2Zmc2V0cyhub2RlLG9m ZnNldHMpe2lmKCF3aW5kb3cuZ2V0U2VsZWN0aW9uKXtyZXR1cm59dmFyIHNlbGVjdGlvbj13aW5k b3cuZ2V0U2VsZWN0aW9uKCk7dmFyIGxlbmd0aD1ub2RlW2dldFRleHRDb250ZW50QWNjZXNzb3Io KV0ubGVuZ3RoO3ZhciBzdGFydD1NYXRoLm1pbihvZmZzZXRzLnN0YXJ0LGxlbmd0aCk7dmFyIGVu ZD1vZmZzZXRzLmVuZD09PXVuZGVmaW5lZD9zdGFydDpNYXRoLm1pbihvZmZzZXRzLmVuZCxsZW5n dGgpO2lmKCFzZWxlY3Rpb24uZXh0ZW5kJiZzdGFydD5lbmQpe3ZhciB0ZW1wPWVuZDtlbmQ9c3Rh cnQ7c3RhcnQ9dGVtcH12YXIgc3RhcnRNYXJrZXI9Z2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChu b2RlLHN0YXJ0KTt2YXIgZW5kTWFya2VyPWdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQobm9kZSxl bmQpO2lmKHN0YXJ0TWFya2VyJiZlbmRNYXJrZXIpe3ZhciByYW5nZT1kb2N1bWVudC5jcmVhdGVS YW5nZSgpO3JhbmdlLnNldFN0YXJ0KHN0YXJ0TWFya2VyLm5vZGUsc3RhcnRNYXJrZXIub2Zmc2V0 KTtzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7aWYoc3RhcnQ+ZW5kKXtzZWxlY3Rpb24uYWRk UmFuZ2UocmFuZ2UpO3NlbGVjdGlvbi5leHRlbmQoZW5kTWFya2VyLm5vZGUsZW5kTWFya2VyLm9m ZnNldCl9ZWxzZXtyYW5nZS5zZXRFbmQoZW5kTWFya2VyLm5vZGUsZW5kTWFya2VyLm9mZnNldCk7 c2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKX19fXZhciB1c2VJRU9mZnNldHM9RXhlY3V0aW9uRW52 aXJvbm1lbnQuY2FuVXNlRE9NJiYic2VsZWN0aW9uImluIGRvY3VtZW50JiYhKCJnZXRTZWxlY3Rp b24iaW4gd2luZG93KTt2YXIgUmVhY3RET01TZWxlY3Rpb249e2dldE9mZnNldHM6dXNlSUVPZmZz ZXRzP2dldElFT2Zmc2V0czpnZXRNb2Rlcm5PZmZzZXRzLHNldE9mZnNldHM6dXNlSUVPZmZzZXRz P3NldElFT2Zmc2V0czpzZXRNb2Rlcm5PZmZzZXRzfTttb2R1bGUuZXhwb3J0cz1SZWFjdERPTVNl bGVjdGlvbn0sezEwOToxMDksMTEwOjExMCwxMjY6MTI2fV0sNDA6W2Z1bmN0aW9uKF9kZXJlcV8s bW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgUmVhY3REZWZhdWx0SW5qZWN0aW9uPV9k ZXJlcV8oNDcpO3ZhciBSZWFjdFNlcnZlclJlbmRlcmluZz1fZGVyZXFfKDcxKTt2YXIgUmVhY3RW ZXJzaW9uPV9kZXJlcV8oNzYpO1JlYWN0RGVmYXVsdEluamVjdGlvbi5pbmplY3QoKTt2YXIgUmVh Y3RET01TZXJ2ZXI9e3JlbmRlclRvU3RyaW5nOlJlYWN0U2VydmVyUmVuZGVyaW5nLnJlbmRlclRv U3RyaW5nLHJlbmRlclRvU3RhdGljTWFya3VwOlJlYWN0U2VydmVyUmVuZGVyaW5nLnJlbmRlclRv U3RhdGljTWFya3VwLHZlcnNpb246UmVhY3RWZXJzaW9ufTttb2R1bGUuZXhwb3J0cz1SZWFjdERP TVNlcnZlcn0sezQ3OjQ3LDcxOjcxLDc2Ojc2fV0sNDE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxl LGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgUmVhY3RET01TZXJ2ZXI9X2RlcmVxXyg0MCk7bW9k dWxlLmV4cG9ydHM9UmVhY3RET01TZXJ2ZXJ9LHs0MDo0MH1dLDQyOltmdW5jdGlvbihfZGVyZXFf LG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIF9wcm9kSW52YXJpYW50PV9kZXJlcV8o MTE2KSxfYXNzaWduPV9kZXJlcV8oMTQ4KTt2YXIgRE9NQ2hpbGRyZW5PcGVyYXRpb25zPV9kZXJl cV8oOCk7dmFyIERPTUxhenlUcmVlPV9kZXJlcV8oOSk7dmFyIFJlYWN0RE9NQ29tcG9uZW50VHJl ZT1fZGVyZXFfKDMyKTt2YXIgZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyPV9kZXJlcV8oMTAw KTt2YXIgaW52YXJpYW50PV9kZXJlcV8oMTQwKTt2YXIgdmFsaWRhdGVET01OZXN0aW5nPV9kZXJl cV8oMTIxKTt2YXIgUmVhY3RET01UZXh0Q29tcG9uZW50PWZ1bmN0aW9uKHRleHQpe3RoaXMuX2N1 cnJlbnRFbGVtZW50PXRleHQ7dGhpcy5fc3RyaW5nVGV4dD0iIit0ZXh0O3RoaXMuX2hvc3ROb2Rl PW51bGw7dGhpcy5faG9zdFBhcmVudD1udWxsO3RoaXMuX2RvbUlEPTA7dGhpcy5fbW91bnRJbmRl eD0wO3RoaXMuX2Nsb3NpbmdDb21tZW50PW51bGw7dGhpcy5fY29tbWVudE5vZGVzPW51bGx9O19h c3NpZ24oUmVhY3RET01UZXh0Q29tcG9uZW50LnByb3RvdHlwZSx7bW91bnRDb21wb25lbnQ6ZnVu Y3Rpb24odHJhbnNhY3Rpb24saG9zdFBhcmVudCxob3N0Q29udGFpbmVySW5mbyxjb250ZXh0KXtp ZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXt2YXIgcGFyZW50SW5mbztpZihob3N0UGFy ZW50IT1udWxsKXtwYXJlbnRJbmZvPWhvc3RQYXJlbnQuX2FuY2VzdG9ySW5mb31lbHNlIGlmKGhv c3RDb250YWluZXJJbmZvIT1udWxsKXtwYXJlbnRJbmZvPWhvc3RDb250YWluZXJJbmZvLl9hbmNl c3RvckluZm99aWYocGFyZW50SW5mbyl7dmFsaWRhdGVET01OZXN0aW5nKG51bGwsdGhpcy5fc3Ry aW5nVGV4dCx0aGlzLHBhcmVudEluZm8pfX12YXIgZG9tSUQ9aG9zdENvbnRhaW5lckluZm8uX2lk Q291bnRlcisrO3ZhciBvcGVuaW5nVmFsdWU9IiByZWFjdC10ZXh0OiAiK2RvbUlEKyIgIjt2YXIg Y2xvc2luZ1ZhbHVlPSIgL3JlYWN0LXRleHQgIjt0aGlzLl9kb21JRD1kb21JRDt0aGlzLl9ob3N0 UGFyZW50PWhvc3RQYXJlbnQ7aWYodHJhbnNhY3Rpb24udXNlQ3JlYXRlRWxlbWVudCl7dmFyIG93 bmVyRG9jdW1lbnQ9aG9zdENvbnRhaW5lckluZm8uX293bmVyRG9jdW1lbnQ7dmFyIG9wZW5pbmdD b21tZW50PW93bmVyRG9jdW1lbnQuY3JlYXRlQ29tbWVudChvcGVuaW5nVmFsdWUpO3ZhciBjbG9z aW5nQ29tbWVudD1vd25lckRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoY2xvc2luZ1ZhbHVlKTt2YXIg bGF6eVRyZWU9RE9NTGF6eVRyZWUob3duZXJEb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50 KCkpO0RPTUxhenlUcmVlLnF1ZXVlQ2hpbGQobGF6eVRyZWUsRE9NTGF6eVRyZWUob3BlbmluZ0Nv bW1lbnQpKTtpZih0aGlzLl9zdHJpbmdUZXh0KXtET01MYXp5VHJlZS5xdWV1ZUNoaWxkKGxhenlU cmVlLERPTUxhenlUcmVlKG93bmVyRG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5fc3RyaW5n VGV4dCkpKX1ET01MYXp5VHJlZS5xdWV1ZUNoaWxkKGxhenlUcmVlLERPTUxhenlUcmVlKGNsb3Np bmdDb21tZW50KSk7UmVhY3RET01Db21wb25lbnRUcmVlLnByZWNhY2hlTm9kZSh0aGlzLG9wZW5p bmdDb21tZW50KTt0aGlzLl9jbG9zaW5nQ29tbWVudD1jbG9zaW5nQ29tbWVudDtyZXR1cm4gbGF6 eVRyZWV9ZWxzZXt2YXIgZXNjYXBlZFRleHQ9ZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyKHRo aXMuX3N0cmluZ1RleHQpO2lmKHRyYW5zYWN0aW9uLnJlbmRlclRvU3RhdGljTWFya3VwKXtyZXR1 cm4gZXNjYXBlZFRleHR9cmV0dXJuIlx4M2MhLS0iK29wZW5pbmdWYWx1ZSsiLS1ceDNlIitlc2Nh cGVkVGV4dCsiXHgzYyEtLSIrY2xvc2luZ1ZhbHVlKyItLVx4M2UifX0scmVjZWl2ZUNvbXBvbmVu dDpmdW5jdGlvbihuZXh0VGV4dCx0cmFuc2FjdGlvbil7aWYobmV4dFRleHQhPT10aGlzLl9jdXJy ZW50RWxlbWVudCl7dGhpcy5fY3VycmVudEVsZW1lbnQ9bmV4dFRleHQ7dmFyIG5leHRTdHJpbmdU ZXh0PSIiK25leHRUZXh0O2lmKG5leHRTdHJpbmdUZXh0IT09dGhpcy5fc3RyaW5nVGV4dCl7dGhp cy5fc3RyaW5nVGV4dD1uZXh0U3RyaW5nVGV4dDt2YXIgY29tbWVudE5vZGVzPXRoaXMuZ2V0SG9z dE5vZGUoKTtET01DaGlsZHJlbk9wZXJhdGlvbnMucmVwbGFjZURlbGltaXRlZFRleHQoY29tbWVu dE5vZGVzWzBdLGNvbW1lbnROb2Rlc1sxXSxuZXh0U3RyaW5nVGV4dCl9fX0sZ2V0SG9zdE5vZGU6 ZnVuY3Rpb24oKXt2YXIgaG9zdE5vZGU9dGhpcy5fY29tbWVudE5vZGVzO2lmKGhvc3ROb2RlKXty ZXR1cm4gaG9zdE5vZGV9aWYoIXRoaXMuX2Nsb3NpbmdDb21tZW50KXt2YXIgb3BlbmluZ0NvbW1l bnQ9UmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UodGhpcyk7dmFyIG5v ZGU9b3BlbmluZ0NvbW1lbnQubmV4dFNpYmxpbmc7d2hpbGUodHJ1ZSl7IShub2RlIT1udWxsKT8i ZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiTWlzc2luZyBjbG9z aW5nIGNvbW1lbnQgZm9yIHRleHQgY29tcG9uZW50ICVzIix0aGlzLl9kb21JRCk6X3Byb2RJbnZh cmlhbnQoIjY3Iix0aGlzLl9kb21JRCk6dm9pZCAwO2lmKG5vZGUubm9kZVR5cGU9PT04JiZub2Rl Lm5vZGVWYWx1ZT09PSIgL3JlYWN0LXRleHQgIil7dGhpcy5fY2xvc2luZ0NvbW1lbnQ9bm9kZTti cmVha31ub2RlPW5vZGUubmV4dFNpYmxpbmd9fWhvc3ROb2RlPVt0aGlzLl9ob3N0Tm9kZSx0aGlz Ll9jbG9zaW5nQ29tbWVudF07dGhpcy5fY29tbWVudE5vZGVzPWhvc3ROb2RlO3JldHVybiBob3N0 Tm9kZX0sdW5tb3VudENvbXBvbmVudDpmdW5jdGlvbigpe3RoaXMuX2Nsb3NpbmdDb21tZW50PW51 bGw7dGhpcy5fY29tbWVudE5vZGVzPW51bGw7UmVhY3RET01Db21wb25lbnRUcmVlLnVuY2FjaGVO b2RlKHRoaXMpfX0pO21vZHVsZS5leHBvcnRzPVJlYWN0RE9NVGV4dENvbXBvbmVudH0sezEwMDox MDAsMTE2OjExNiwxMjE6MTIxLDE0MDoxNDAsMTQ4OjE0OCwzMjozMiw4OjgsOTo5fV0sNDM6W2Z1 bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgX3Byb2RJbnZh cmlhbnQ9X2RlcmVxXygxMTYpLF9hc3NpZ249X2RlcmVxXygxNDgpO3ZhciBMaW5rZWRWYWx1ZVV0 aWxzPV9kZXJlcV8oMjMpO3ZhciBSZWFjdERPTUNvbXBvbmVudFRyZWU9X2RlcmVxXygzMik7dmFy IFJlYWN0VXBkYXRlcz1fZGVyZXFfKDc1KTt2YXIgaW52YXJpYW50PV9kZXJlcV8oMTQwKTt2YXIg d2FybmluZz1fZGVyZXFfKDE0Nyk7dmFyIGRpZFdhcm5WYWx1ZUxpbms9ZmFsc2U7dmFyIGRpZFdh cm5WYWxEZWZhdWx0VmFsPWZhbHNlO2Z1bmN0aW9uIGZvcmNlVXBkYXRlSWZNb3VudGVkKCl7aWYo dGhpcy5fcm9vdE5vZGVJRCl7UmVhY3RET01UZXh0YXJlYS51cGRhdGVXcmFwcGVyKHRoaXMpfX12 YXIgUmVhY3RET01UZXh0YXJlYT17Z2V0SG9zdFByb3BzOmZ1bmN0aW9uKGluc3QscHJvcHMpeyEo cHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9PW51bGwpPyJkZXZlbG9wbWVudCIhPT0icHJv ZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgIGRvZXMg bm90IG1ha2Ugc2Vuc2Ugb24gPHRleHRhcmVhPi4iKTpfcHJvZEludmFyaWFudCgiOTEiKTp2b2lk IDA7dmFyIGhvc3RQcm9wcz1fYXNzaWduKHt9LHByb3BzLHt2YWx1ZTp1bmRlZmluZWQsZGVmYXVs dFZhbHVlOnVuZGVmaW5lZCxjaGlsZHJlbjoiIitpbnN0Ll93cmFwcGVyU3RhdGUuaW5pdGlhbFZh bHVlLG9uQ2hhbmdlOmluc3QuX3dyYXBwZXJTdGF0ZS5vbkNoYW5nZX0pO3JldHVybiBob3N0UHJv cHN9LG1vdW50V3JhcHBlcjpmdW5jdGlvbihpbnN0LHByb3BzKXtpZigiZGV2ZWxvcG1lbnQiIT09 InByb2R1Y3Rpb24iKXtMaW5rZWRWYWx1ZVV0aWxzLmNoZWNrUHJvcFR5cGVzKCJ0ZXh0YXJlYSIs cHJvcHMsaW5zdC5fY3VycmVudEVsZW1lbnQuX293bmVyKTtpZihwcm9wcy52YWx1ZUxpbmshPT11 bmRlZmluZWQmJiFkaWRXYXJuVmFsdWVMaW5rKXsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24i P3dhcm5pbmcoZmFsc2UsImB2YWx1ZUxpbmtgIHByb3Agb24gYHRleHRhcmVhYCBpcyBkZXByZWNh dGVkOyBzZXQgYHZhbHVlYCBhbmQgYG9uQ2hhbmdlYCBpbnN0ZWFkLiIpOnZvaWQgMDtkaWRXYXJu VmFsdWVMaW5rPXRydWV9aWYocHJvcHMudmFsdWUhPT11bmRlZmluZWQmJnByb3BzLmRlZmF1bHRW YWx1ZSE9PXVuZGVmaW5lZCYmIWRpZFdhcm5WYWxEZWZhdWx0VmFsKXsiZGV2ZWxvcG1lbnQiIT09 InByb2R1Y3Rpb24iP3dhcm5pbmcoZmFsc2UsIlRleHRhcmVhIGVsZW1lbnRzIG11c3QgYmUgZWl0 aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICIrIihzcGVjaWZ5IGVpdGhlciB0aGUgdmFs dWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICIrImJvdGgpLiBEZWNp ZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIHRleHRhcmVhICIr ImFuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICIrImh0dHBzOi8vZmIu bWUvcmVhY3QtY29udHJvbGxlZC1jb21wb25lbnRzIik6dm9pZCAwO2RpZFdhcm5WYWxEZWZhdWx0 VmFsPXRydWV9fXZhciB2YWx1ZT1MaW5rZWRWYWx1ZVV0aWxzLmdldFZhbHVlKHByb3BzKTt2YXIg aW5pdGlhbFZhbHVlPXZhbHVlO2lmKHZhbHVlPT1udWxsKXt2YXIgZGVmYXVsdFZhbHVlPXByb3Bz LmRlZmF1bHRWYWx1ZTt2YXIgY2hpbGRyZW49cHJvcHMuY2hpbGRyZW47aWYoY2hpbGRyZW4hPW51 bGwpe2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpeyJkZXZlbG9wbWVudCIhPT0icHJv ZHVjdGlvbiI/d2FybmluZyhmYWxzZSwiVXNlIHRoZSBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVg IHByb3BzIGluc3RlYWQgb2Ygc2V0dGluZyAiKyJjaGlsZHJlbiBvbiA8dGV4dGFyZWE+LiIpOnZv aWQgMH0hKGRlZmF1bHRWYWx1ZT09bnVsbCk/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9p bnZhcmlhbnQoZmFsc2UsIklmIHlvdSBzdXBwbHkgYGRlZmF1bHRWYWx1ZWAgb24gYSA8dGV4dGFy ZWE+LCBkbyBub3QgcGFzcyBjaGlsZHJlbi4iKTpfcHJvZEludmFyaWFudCgiOTIiKTp2b2lkIDA7 aWYoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpeyEoY2hpbGRyZW4ubGVuZ3RoPD0xKT8iZGV2ZWxv cG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiPHRleHRhcmVhPiBjYW4gb25s eSBoYXZlIGF0IG1vc3Qgb25lIGNoaWxkLiIpOl9wcm9kSW52YXJpYW50KCI5MyIpOnZvaWQgMDtj aGlsZHJlbj1jaGlsZHJlblswXX1kZWZhdWx0VmFsdWU9IiIrY2hpbGRyZW59aWYoZGVmYXVsdFZh bHVlPT1udWxsKXtkZWZhdWx0VmFsdWU9IiJ9aW5pdGlhbFZhbHVlPWRlZmF1bHRWYWx1ZX1pbnN0 Ll93cmFwcGVyU3RhdGU9e2luaXRpYWxWYWx1ZToiIitpbml0aWFsVmFsdWUsbGlzdGVuZXJzOm51 bGwsb25DaGFuZ2U6X2hhbmRsZUNoYW5nZS5iaW5kKGluc3QpfX0sdXBkYXRlV3JhcHBlcjpmdW5j dGlvbihpbnN0KXt2YXIgcHJvcHM9aW5zdC5fY3VycmVudEVsZW1lbnQucHJvcHM7dmFyIG5vZGU9 UmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCk7dmFyIHZhbHVl PUxpbmtlZFZhbHVlVXRpbHMuZ2V0VmFsdWUocHJvcHMpO2lmKHZhbHVlIT1udWxsKXt2YXIgbmV3 VmFsdWU9IiIrdmFsdWU7aWYobmV3VmFsdWUhPT1ub2RlLnZhbHVlKXtub2RlLnZhbHVlPW5ld1Zh bHVlfWlmKHByb3BzLmRlZmF1bHRWYWx1ZT09bnVsbCl7bm9kZS5kZWZhdWx0VmFsdWU9bmV3VmFs dWV9fWlmKHByb3BzLmRlZmF1bHRWYWx1ZSE9bnVsbCl7bm9kZS5kZWZhdWx0VmFsdWU9cHJvcHMu ZGVmYXVsdFZhbHVlfX0scG9zdE1vdW50V3JhcHBlcjpmdW5jdGlvbihpbnN0KXt2YXIgbm9kZT1S ZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KTt2YXIgdGV4dENv bnRlbnQ9bm9kZS50ZXh0Q29udGVudDtpZih0ZXh0Q29udGVudD09PWluc3QuX3dyYXBwZXJTdGF0 ZS5pbml0aWFsVmFsdWUpe25vZGUudmFsdWU9dGV4dENvbnRlbnR9fX07ZnVuY3Rpb24gX2hhbmRs ZUNoYW5nZShldmVudCl7dmFyIHByb3BzPXRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzO3ZhciBy ZXR1cm5WYWx1ZT1MaW5rZWRWYWx1ZVV0aWxzLmV4ZWN1dGVPbkNoYW5nZShwcm9wcyxldmVudCk7 UmVhY3RVcGRhdGVzLmFzYXAoZm9yY2VVcGRhdGVJZk1vdW50ZWQsdGhpcyk7cmV0dXJuIHJldHVy blZhbHVlfW1vZHVsZS5leHBvcnRzPVJlYWN0RE9NVGV4dGFyZWF9LHsxMTY6MTE2LDE0MDoxNDAs MTQ3OjE0NywxNDg6MTQ4LDIzOjIzLDMyOjMyLDc1Ojc1fV0sNDQ6W2Z1bmN0aW9uKF9kZXJlcV8s bW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgX3Byb2RJbnZhcmlhbnQ9X2RlcmVxXygx MTYpO3ZhciBpbnZhcmlhbnQ9X2RlcmVxXygxNDApO2Z1bmN0aW9uIGdldExvd2VzdENvbW1vbkFu Y2VzdG9yKGluc3RBLGluc3RCKXshKCJfaG9zdE5vZGUiaW4gaW5zdEEpPyJkZXZlbG9wbWVudCIh PT0icHJvZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJnZXROb2RlRnJvbUluc3RhbmNlOiBJbnZh bGlkIGFyZ3VtZW50LiIpOl9wcm9kSW52YXJpYW50KCIzMyIpOnZvaWQgMDshKCJfaG9zdE5vZGUi aW4gaW5zdEIpPyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJn ZXROb2RlRnJvbUluc3RhbmNlOiBJbnZhbGlkIGFyZ3VtZW50LiIpOl9wcm9kSW52YXJpYW50KCIz MyIpOnZvaWQgMDt2YXIgZGVwdGhBPTA7Zm9yKHZhciB0ZW1wQT1pbnN0QTt0ZW1wQTt0ZW1wQT10 ZW1wQS5faG9zdFBhcmVudCl7ZGVwdGhBKyt9dmFyIGRlcHRoQj0wO2Zvcih2YXIgdGVtcEI9aW5z dEI7dGVtcEI7dGVtcEI9dGVtcEIuX2hvc3RQYXJlbnQpe2RlcHRoQisrfXdoaWxlKGRlcHRoQS1k ZXB0aEI+MCl7aW5zdEE9aW5zdEEuX2hvc3RQYXJlbnQ7ZGVwdGhBLS19d2hpbGUoZGVwdGhCLWRl cHRoQT4wKXtpbnN0Qj1pbnN0Qi5faG9zdFBhcmVudDtkZXB0aEItLX12YXIgZGVwdGg9ZGVwdGhB O3doaWxlKGRlcHRoLS0pe2lmKGluc3RBPT09aW5zdEIpe3JldHVybiBpbnN0QX1pbnN0QT1pbnN0 QS5faG9zdFBhcmVudDtpbnN0Qj1pbnN0Qi5faG9zdFBhcmVudH1yZXR1cm4gbnVsbH1mdW5jdGlv biBpc0FuY2VzdG9yKGluc3RBLGluc3RCKXshKCJfaG9zdE5vZGUiaW4gaW5zdEEpPyJkZXZlbG9w bWVudCIhPT0icHJvZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJpc0FuY2VzdG9yOiBJbnZhbGlk IGFyZ3VtZW50LiIpOl9wcm9kSW52YXJpYW50KCIzNSIpOnZvaWQgMDshKCJfaG9zdE5vZGUiaW4g aW5zdEIpPyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJpc0Fu Y2VzdG9yOiBJbnZhbGlkIGFyZ3VtZW50LiIpOl9wcm9kSW52YXJpYW50KCIzNSIpOnZvaWQgMDt3 aGlsZShpbnN0Qil7aWYoaW5zdEI9PT1pbnN0QSl7cmV0dXJuIHRydWV9aW5zdEI9aW5zdEIuX2hv c3RQYXJlbnR9cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIGdldFBhcmVudEluc3RhbmNlKGluc3QpeyEo Il9ob3N0Tm9kZSJpbiBpbnN0KT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFu dChmYWxzZSwiZ2V0UGFyZW50SW5zdGFuY2U6IEludmFsaWQgYXJndW1lbnQuIik6X3Byb2RJbnZh cmlhbnQoIjM2Iik6dm9pZCAwO3JldHVybiBpbnN0Ll9ob3N0UGFyZW50fWZ1bmN0aW9uIHRyYXZl cnNlVHdvUGhhc2UoaW5zdCxmbixhcmcpe3ZhciBwYXRoPVtdO3doaWxlKGluc3Qpe3BhdGgucHVz aChpbnN0KTtpbnN0PWluc3QuX2hvc3RQYXJlbnR9dmFyIGk7Zm9yKGk9cGF0aC5sZW5ndGg7aS0t ID4wOyl7Zm4ocGF0aFtpXSwiY2FwdHVyZWQiLGFyZyl9Zm9yKGk9MDtpPHBhdGgubGVuZ3RoO2kr Kyl7Zm4ocGF0aFtpXSwiYnViYmxlZCIsYXJnKX19ZnVuY3Rpb24gdHJhdmVyc2VFbnRlckxlYXZl KGZyb20sdG8sZm4sYXJnRnJvbSxhcmdUbyl7dmFyIGNvbW1vbj1mcm9tJiZ0bz9nZXRMb3dlc3RD b21tb25BbmNlc3Rvcihmcm9tLHRvKTpudWxsO3ZhciBwYXRoRnJvbT1bXTt3aGlsZShmcm9tJiZm cm9tIT09Y29tbW9uKXtwYXRoRnJvbS5wdXNoKGZyb20pO2Zyb209ZnJvbS5faG9zdFBhcmVudH12 YXIgcGF0aFRvPVtdO3doaWxlKHRvJiZ0byE9PWNvbW1vbil7cGF0aFRvLnB1c2godG8pO3RvPXRv Ll9ob3N0UGFyZW50fXZhciBpO2ZvcihpPTA7aTxwYXRoRnJvbS5sZW5ndGg7aSsrKXtmbihwYXRo RnJvbVtpXSwiYnViYmxlZCIsYXJnRnJvbSl9Zm9yKGk9cGF0aFRvLmxlbmd0aDtpLS0gPjA7KXtm bihwYXRoVG9baV0sImNhcHR1cmVkIixhcmdUbyl9fW1vZHVsZS5leHBvcnRzPXtpc0FuY2VzdG9y OmlzQW5jZXN0b3IsZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3I6Z2V0TG93ZXN0Q29tbW9uQW5jZXN0 b3IsZ2V0UGFyZW50SW5zdGFuY2U6Z2V0UGFyZW50SW5zdGFuY2UsdHJhdmVyc2VUd29QaGFzZTp0 cmF2ZXJzZVR3b1BoYXNlLHRyYXZlcnNlRW50ZXJMZWF2ZTp0cmF2ZXJzZUVudGVyTGVhdmV9fSx7 MTE2OjExNiwxNDA6MTQwfV0sNDU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1 c2Ugc3RyaWN0Ijt2YXIgUmVhY3RJbnZhbGlkU2V0U3RhdGVXYXJuaW5nSG9vaz1fZGVyZXFfKDYw KTt2YXIgUmVhY3RIb3N0T3BlcmF0aW9uSGlzdG9yeUhvb2s9X2RlcmVxXyg1NSk7dmFyIFJlYWN0 Q29tcG9uZW50VHJlZUhvb2s9X2RlcmVxXygxMjIpO3ZhciBFeGVjdXRpb25FbnZpcm9ubWVudD1f ZGVyZXFfKDEyNik7dmFyIHBlcmZvcm1hbmNlTm93PV9kZXJlcV8oMTQ1KTt2YXIgd2FybmluZz1f ZGVyZXFfKDE0Nyk7dmFyIGhvb2tzPVtdO3ZhciBkaWRIb29rVGhyb3dGb3JFdmVudD17fTtmdW5j dGlvbiBjYWxsSG9vayhldmVudCxmbixjb250ZXh0LGFyZzEsYXJnMixhcmczLGFyZzQsYXJnNSl7 dHJ5e2ZuLmNhbGwoY29udGV4dCxhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUpfWNhdGNoKGUpeyJk ZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyhkaWRIb29rVGhyb3dGb3JFdmVudFtl dmVudF0sIkV4Y2VwdGlvbiB0aHJvd24gYnkgaG9vayB3aGlsZSBoYW5kbGluZyAlczogJXMiLGV2 ZW50LGUrIlxuIitlLnN0YWNrKTp2b2lkIDA7ZGlkSG9va1Rocm93Rm9yRXZlbnRbZXZlbnRdPXRy dWV9fWZ1bmN0aW9uIGVtaXRFdmVudChldmVudCxhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUpe2Zv cih2YXIgaT0wO2k8aG9va3MubGVuZ3RoO2krKyl7dmFyIGhvb2s9aG9va3NbaV07dmFyIGZuPWhv b2tbZXZlbnRdO2lmKGZuKXtjYWxsSG9vayhldmVudCxmbixob29rLGFyZzEsYXJnMixhcmczLGFy ZzQsYXJnNSl9fX12YXIgaXNQcm9maWxpbmc9ZmFsc2U7dmFyIGZsdXNoSGlzdG9yeT1bXTt2YXIg bGlmZUN5Y2xlVGltZXJTdGFjaz1bXTt2YXIgY3VycmVudEZsdXNoTmVzdGluZz0wO3ZhciBjdXJy ZW50Rmx1c2hNZWFzdXJlbWVudHM9W107dmFyIGN1cnJlbnRGbHVzaFN0YXJ0VGltZT0wO3ZhciBj dXJyZW50VGltZXJEZWJ1Z0lEPW51bGw7dmFyIGN1cnJlbnRUaW1lclN0YXJ0VGltZT0wO3ZhciBj dXJyZW50VGltZXJOZXN0ZWRGbHVzaER1cmF0aW9uPTA7dmFyIGN1cnJlbnRUaW1lclR5cGU9bnVs bDt2YXIgbGlmZUN5Y2xlVGltZXJIYXNXYXJuZWQ9ZmFsc2U7ZnVuY3Rpb24gY2xlYXJIaXN0b3J5 KCl7UmVhY3RDb21wb25lbnRUcmVlSG9vay5wdXJnZVVubW91bnRlZENvbXBvbmVudHMoKTtSZWFj dEhvc3RPcGVyYXRpb25IaXN0b3J5SG9vay5jbGVhckhpc3RvcnkoKX1mdW5jdGlvbiBnZXRUcmVl U25hcHNob3QocmVnaXN0ZXJlZElEcyl7cmV0dXJuIHJlZ2lzdGVyZWRJRHMucmVkdWNlKGZ1bmN0 aW9uKHRyZWUsaWQpe3ZhciBvd25lcklEPVJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0T3duZXJJ RChpZCk7dmFyIHBhcmVudElEPVJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0UGFyZW50SUQoaWQp O3RyZWVbaWRdPXtkaXNwbGF5TmFtZTpSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldERpc3BsYXlO YW1lKGlkKSx0ZXh0OlJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0VGV4dChpZCksdXBkYXRlQ291 bnQ6UmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRVcGRhdGVDb3VudChpZCksY2hpbGRJRHM6UmVh Y3RDb21wb25lbnRUcmVlSG9vay5nZXRDaGlsZElEcyhpZCksb3duZXJJRDpvd25lcklEfHxwYXJl bnRJRCYmUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRPd25lcklEKHBhcmVudElEKXx8MCxwYXJl bnRJRDpwYXJlbnRJRH07cmV0dXJuIHRyZWV9LHt9KX1mdW5jdGlvbiByZXNldE1lYXN1cmVtZW50 cygpe3ZhciBwcmV2aW91c1N0YXJ0VGltZT1jdXJyZW50Rmx1c2hTdGFydFRpbWU7dmFyIHByZXZp b3VzTWVhc3VyZW1lbnRzPWN1cnJlbnRGbHVzaE1lYXN1cmVtZW50czt2YXIgcHJldmlvdXNPcGVy YXRpb25zPVJlYWN0SG9zdE9wZXJhdGlvbkhpc3RvcnlIb29rLmdldEhpc3RvcnkoKTtpZihjdXJy ZW50Rmx1c2hOZXN0aW5nPT09MCl7Y3VycmVudEZsdXNoU3RhcnRUaW1lPTA7Y3VycmVudEZsdXNo TWVhc3VyZW1lbnRzPVtdO2NsZWFySGlzdG9yeSgpO3JldHVybn1pZihwcmV2aW91c01lYXN1cmVt ZW50cy5sZW5ndGh8fHByZXZpb3VzT3BlcmF0aW9ucy5sZW5ndGgpe3ZhciByZWdpc3RlcmVkSURz PVJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0UmVnaXN0ZXJlZElEcygpO2ZsdXNoSGlzdG9yeS5w dXNoKHtkdXJhdGlvbjpwZXJmb3JtYW5jZU5vdygpLXByZXZpb3VzU3RhcnRUaW1lLG1lYXN1cmVt ZW50czpwcmV2aW91c01lYXN1cmVtZW50c3x8W10sb3BlcmF0aW9uczpwcmV2aW91c09wZXJhdGlv bnN8fFtdLHRyZWVTbmFwc2hvdDpnZXRUcmVlU25hcHNob3QocmVnaXN0ZXJlZElEcyl9KX1jbGVh ckhpc3RvcnkoKTtjdXJyZW50Rmx1c2hTdGFydFRpbWU9cGVyZm9ybWFuY2VOb3coKTtjdXJyZW50 Rmx1c2hNZWFzdXJlbWVudHM9W119ZnVuY3Rpb24gY2hlY2tEZWJ1Z0lEKGRlYnVnSUQpe3ZhciBh bGxvd1Jvb3Q9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT11bmRlZmluZWQ/YXJn dW1lbnRzWzFdOmZhbHNlO2lmKGFsbG93Um9vdCYmZGVidWdJRD09PTApe3JldHVybn1pZighZGVi dWdJRCl7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKGZhbHNlLCJSZWFjdERl YnVnVG9vbDogZGVidWdJRCBtYXkgbm90IGJlIGVtcHR5LiIpOnZvaWQgMH19ZnVuY3Rpb24gYmVn aW5MaWZlQ3ljbGVUaW1lcihkZWJ1Z0lELHRpbWVyVHlwZSl7aWYoY3VycmVudEZsdXNoTmVzdGlu Zz09PTApe3JldHVybn1pZihjdXJyZW50VGltZXJUeXBlJiYhbGlmZUN5Y2xlVGltZXJIYXNXYXJu ZWQpeyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyhmYWxzZSwiVGhlcmUgaXMg YW4gaW50ZXJuYWwgZXJyb3IgaW4gdGhlIFJlYWN0IHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50IGNv ZGUuICIrIkRpZCBub3QgZXhwZWN0ICVzIHRpbWVyIHRvIHN0YXJ0IHdoaWxlICVzIHRpbWVyIGlz IHN0aWxsIGluICIrInByb2dyZXNzIGZvciAlcyBpbnN0YW5jZS4iLHRpbWVyVHlwZSxjdXJyZW50 VGltZXJUeXBlfHwibm8iLGRlYnVnSUQ9PT1jdXJyZW50VGltZXJEZWJ1Z0lEPyJ0aGUgc2FtZSI6 ImFub3RoZXIiKTp2b2lkIDA7bGlmZUN5Y2xlVGltZXJIYXNXYXJuZWQ9dHJ1ZX1jdXJyZW50VGlt ZXJTdGFydFRpbWU9cGVyZm9ybWFuY2VOb3coKTtjdXJyZW50VGltZXJOZXN0ZWRGbHVzaER1cmF0 aW9uPTA7Y3VycmVudFRpbWVyRGVidWdJRD1kZWJ1Z0lEO2N1cnJlbnRUaW1lclR5cGU9dGltZXJU eXBlfWZ1bmN0aW9uIGVuZExpZmVDeWNsZVRpbWVyKGRlYnVnSUQsdGltZXJUeXBlKXtpZihjdXJy ZW50Rmx1c2hOZXN0aW5nPT09MCl7cmV0dXJufWlmKGN1cnJlbnRUaW1lclR5cGUhPT10aW1lclR5 cGUmJiFsaWZlQ3ljbGVUaW1lckhhc1dhcm5lZCl7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9u Ij93YXJuaW5nKGZhbHNlLCJUaGVyZSBpcyBhbiBpbnRlcm5hbCBlcnJvciBpbiB0aGUgUmVhY3Qg cGVyZm9ybWFuY2UgbWVhc3VyZW1lbnQgY29kZS4gIisiV2UgZGlkIG5vdCBleHBlY3QgJXMgdGlt ZXIgdG8gc3RvcCB3aGlsZSAlcyB0aW1lciBpcyBzdGlsbCBpbiAiKyJwcm9ncmVzcyBmb3IgJXMg aW5zdGFuY2UuIFBsZWFzZSByZXBvcnQgdGhpcyBhcyBhIGJ1ZyBpbiBSZWFjdC4iLHRpbWVyVHlw ZSxjdXJyZW50VGltZXJUeXBlfHwibm8iLGRlYnVnSUQ9PT1jdXJyZW50VGltZXJEZWJ1Z0lEPyJ0 aGUgc2FtZSI6ImFub3RoZXIiKTp2b2lkIDA7bGlmZUN5Y2xlVGltZXJIYXNXYXJuZWQ9dHJ1ZX1p Zihpc1Byb2ZpbGluZyl7Y3VycmVudEZsdXNoTWVhc3VyZW1lbnRzLnB1c2goe3RpbWVyVHlwZTp0 aW1lclR5cGUsaW5zdGFuY2VJRDpkZWJ1Z0lELGR1cmF0aW9uOnBlcmZvcm1hbmNlTm93KCktY3Vy cmVudFRpbWVyU3RhcnRUaW1lLWN1cnJlbnRUaW1lck5lc3RlZEZsdXNoRHVyYXRpb259KX1jdXJy ZW50VGltZXJTdGFydFRpbWU9MDtjdXJyZW50VGltZXJOZXN0ZWRGbHVzaER1cmF0aW9uPTA7Y3Vy cmVudFRpbWVyRGVidWdJRD1udWxsO2N1cnJlbnRUaW1lclR5cGU9bnVsbH1mdW5jdGlvbiBwYXVz ZUN1cnJlbnRMaWZlQ3ljbGVUaW1lcigpe3ZhciBjdXJyZW50VGltZXI9e3N0YXJ0VGltZTpjdXJy ZW50VGltZXJTdGFydFRpbWUsbmVzdGVkRmx1c2hTdGFydFRpbWU6cGVyZm9ybWFuY2VOb3coKSxk ZWJ1Z0lEOmN1cnJlbnRUaW1lckRlYnVnSUQsdGltZXJUeXBlOmN1cnJlbnRUaW1lclR5cGV9O2xp ZmVDeWNsZVRpbWVyU3RhY2sucHVzaChjdXJyZW50VGltZXIpO2N1cnJlbnRUaW1lclN0YXJ0VGlt ZT0wO2N1cnJlbnRUaW1lck5lc3RlZEZsdXNoRHVyYXRpb249MDtjdXJyZW50VGltZXJEZWJ1Z0lE PW51bGw7Y3VycmVudFRpbWVyVHlwZT1udWxsfWZ1bmN0aW9uIHJlc3VtZUN1cnJlbnRMaWZlQ3lj bGVUaW1lcigpe3ZhciBfbGlmZUN5Y2xlVGltZXJTdGFjayQ9bGlmZUN5Y2xlVGltZXJTdGFjay5w b3AoKSxzdGFydFRpbWU9X2xpZmVDeWNsZVRpbWVyU3RhY2skLnN0YXJ0VGltZSxuZXN0ZWRGbHVz aFN0YXJ0VGltZT1fbGlmZUN5Y2xlVGltZXJTdGFjayQubmVzdGVkRmx1c2hTdGFydFRpbWUsZGVi dWdJRD1fbGlmZUN5Y2xlVGltZXJTdGFjayQuZGVidWdJRCx0aW1lclR5cGU9X2xpZmVDeWNsZVRp bWVyU3RhY2skLnRpbWVyVHlwZTt2YXIgbmVzdGVkRmx1c2hEdXJhdGlvbj1wZXJmb3JtYW5jZU5v dygpLW5lc3RlZEZsdXNoU3RhcnRUaW1lO2N1cnJlbnRUaW1lclN0YXJ0VGltZT1zdGFydFRpbWU7 Y3VycmVudFRpbWVyTmVzdGVkRmx1c2hEdXJhdGlvbis9bmVzdGVkRmx1c2hEdXJhdGlvbjtjdXJy ZW50VGltZXJEZWJ1Z0lEPWRlYnVnSUQ7Y3VycmVudFRpbWVyVHlwZT10aW1lclR5cGV9dmFyIGxh c3RNYXJrVGltZVN0YW1wPTA7dmFyIGNhblVzZVBlcmZvcm1hbmNlTWVhc3VyZT10eXBlb2YgcGVy Zm9ybWFuY2UhPT0idW5kZWZpbmVkIiYmdHlwZW9mIHBlcmZvcm1hbmNlLm1hcms9PT0iZnVuY3Rp b24iJiZ0eXBlb2YgcGVyZm9ybWFuY2UuY2xlYXJNYXJrcz09PSJmdW5jdGlvbiImJnR5cGVvZiBw ZXJmb3JtYW5jZS5tZWFzdXJlPT09ImZ1bmN0aW9uIiYmdHlwZW9mIHBlcmZvcm1hbmNlLmNsZWFy TWVhc3VyZXM9PT0iZnVuY3Rpb24iO2Z1bmN0aW9uIHNob3VsZE1hcmsoZGVidWdJRCl7aWYoIWlz UHJvZmlsaW5nfHwhY2FuVXNlUGVyZm9ybWFuY2VNZWFzdXJlKXtyZXR1cm4gZmFsc2V9dmFyIGVs ZW1lbnQ9UmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRFbGVtZW50KGRlYnVnSUQpO2lmKGVsZW1l bnQ9PW51bGx8fHR5cGVvZiBlbGVtZW50IT09Im9iamVjdCIpe3JldHVybiBmYWxzZX12YXIgaXNI b3N0RWxlbWVudD10eXBlb2YgZWxlbWVudC50eXBlPT09InN0cmluZyI7aWYoaXNIb3N0RWxlbWVu dCl7cmV0dXJuIGZhbHNlfXJldHVybiB0cnVlfWZ1bmN0aW9uIG1hcmtCZWdpbihkZWJ1Z0lELG1h cmtUeXBlKXtpZighc2hvdWxkTWFyayhkZWJ1Z0lEKSl7cmV0dXJufXZhciBtYXJrTmFtZT1kZWJ1 Z0lEKyI6OiIrbWFya1R5cGU7bGFzdE1hcmtUaW1lU3RhbXA9cGVyZm9ybWFuY2VOb3coKTtwZXJm b3JtYW5jZS5tYXJrKG1hcmtOYW1lKX1mdW5jdGlvbiBtYXJrRW5kKGRlYnVnSUQsbWFya1R5cGUp e2lmKCFzaG91bGRNYXJrKGRlYnVnSUQpKXtyZXR1cm59dmFyIG1hcmtOYW1lPWRlYnVnSUQrIjo6 IittYXJrVHlwZTt2YXIgZGlzcGxheU5hbWU9UmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXREaXNw bGF5TmFtZShkZWJ1Z0lEKXx8IlVua25vd24iO3ZhciB0aW1lU3RhbXA9cGVyZm9ybWFuY2VOb3co KTtpZih0aW1lU3RhbXAtbGFzdE1hcmtUaW1lU3RhbXA+LjEpe3ZhciBtZWFzdXJlbWVudE5hbWU9 ZGlzcGxheU5hbWUrIiBbIittYXJrVHlwZSsiXSI7cGVyZm9ybWFuY2UubWVhc3VyZShtZWFzdXJl bWVudE5hbWUsbWFya05hbWUpfXBlcmZvcm1hbmNlLmNsZWFyTWFya3MobWFya05hbWUpO3BlcmZv cm1hbmNlLmNsZWFyTWVhc3VyZXMobWVhc3VyZW1lbnROYW1lKX12YXIgUmVhY3REZWJ1Z1Rvb2w9 e2FkZEhvb2s6ZnVuY3Rpb24oaG9vayl7aG9va3MucHVzaChob29rKX0scmVtb3ZlSG9vazpmdW5j dGlvbihob29rKXtmb3IodmFyIGk9MDtpPGhvb2tzLmxlbmd0aDtpKyspe2lmKGhvb2tzW2ldPT09 aG9vayl7aG9va3Muc3BsaWNlKGksMSk7aS0tfX19LGlzUHJvZmlsaW5nOmZ1bmN0aW9uKCl7cmV0 dXJuIGlzUHJvZmlsaW5nfSxiZWdpblByb2ZpbGluZzpmdW5jdGlvbigpe2lmKGlzUHJvZmlsaW5n KXtyZXR1cm59aXNQcm9maWxpbmc9dHJ1ZTtmbHVzaEhpc3RvcnkubGVuZ3RoPTA7cmVzZXRNZWFz dXJlbWVudHMoKTtSZWFjdERlYnVnVG9vbC5hZGRIb29rKFJlYWN0SG9zdE9wZXJhdGlvbkhpc3Rv cnlIb29rKX0sZW5kUHJvZmlsaW5nOmZ1bmN0aW9uKCl7aWYoIWlzUHJvZmlsaW5nKXtyZXR1cm59 aXNQcm9maWxpbmc9ZmFsc2U7cmVzZXRNZWFzdXJlbWVudHMoKTtSZWFjdERlYnVnVG9vbC5yZW1v dmVIb29rKFJlYWN0SG9zdE9wZXJhdGlvbkhpc3RvcnlIb29rKX0sZ2V0Rmx1c2hIaXN0b3J5OmZ1 bmN0aW9uKCl7cmV0dXJuIGZsdXNoSGlzdG9yeX0sb25CZWdpbkZsdXNoOmZ1bmN0aW9uKCl7Y3Vy cmVudEZsdXNoTmVzdGluZysrO3Jlc2V0TWVhc3VyZW1lbnRzKCk7cGF1c2VDdXJyZW50TGlmZUN5 Y2xlVGltZXIoKTtlbWl0RXZlbnQoIm9uQmVnaW5GbHVzaCIpfSxvbkVuZEZsdXNoOmZ1bmN0aW9u KCl7cmVzZXRNZWFzdXJlbWVudHMoKTtjdXJyZW50Rmx1c2hOZXN0aW5nLS07cmVzdW1lQ3VycmVu dExpZmVDeWNsZVRpbWVyKCk7ZW1pdEV2ZW50KCJvbkVuZEZsdXNoIil9LG9uQmVnaW5MaWZlQ3lj bGVUaW1lcjpmdW5jdGlvbihkZWJ1Z0lELHRpbWVyVHlwZSl7Y2hlY2tEZWJ1Z0lEKGRlYnVnSUQp O2VtaXRFdmVudCgib25CZWdpbkxpZmVDeWNsZVRpbWVyIixkZWJ1Z0lELHRpbWVyVHlwZSk7bWFy a0JlZ2luKGRlYnVnSUQsdGltZXJUeXBlKTtiZWdpbkxpZmVDeWNsZVRpbWVyKGRlYnVnSUQsdGlt ZXJUeXBlKX0sb25FbmRMaWZlQ3ljbGVUaW1lcjpmdW5jdGlvbihkZWJ1Z0lELHRpbWVyVHlwZSl7 Y2hlY2tEZWJ1Z0lEKGRlYnVnSUQpO2VuZExpZmVDeWNsZVRpbWVyKGRlYnVnSUQsdGltZXJUeXBl KTttYXJrRW5kKGRlYnVnSUQsdGltZXJUeXBlKTtlbWl0RXZlbnQoIm9uRW5kTGlmZUN5Y2xlVGlt ZXIiLGRlYnVnSUQsdGltZXJUeXBlKX0sb25CZWdpblByb2Nlc3NpbmdDaGlsZENvbnRleHQ6ZnVu Y3Rpb24oKXtlbWl0RXZlbnQoIm9uQmVnaW5Qcm9jZXNzaW5nQ2hpbGRDb250ZXh0Iil9LG9uRW5k UHJvY2Vzc2luZ0NoaWxkQ29udGV4dDpmdW5jdGlvbigpe2VtaXRFdmVudCgib25FbmRQcm9jZXNz aW5nQ2hpbGRDb250ZXh0Iil9LG9uSG9zdE9wZXJhdGlvbjpmdW5jdGlvbihvcGVyYXRpb24pe2No ZWNrRGVidWdJRChvcGVyYXRpb24uaW5zdGFuY2VJRCk7ZW1pdEV2ZW50KCJvbkhvc3RPcGVyYXRp b24iLG9wZXJhdGlvbil9LG9uU2V0U3RhdGU6ZnVuY3Rpb24oKXtlbWl0RXZlbnQoIm9uU2V0U3Rh dGUiKX0sb25TZXRDaGlsZHJlbjpmdW5jdGlvbihkZWJ1Z0lELGNoaWxkRGVidWdJRHMpe2NoZWNr RGVidWdJRChkZWJ1Z0lEKTtjaGlsZERlYnVnSURzLmZvckVhY2goY2hlY2tEZWJ1Z0lEKTtlbWl0 RXZlbnQoIm9uU2V0Q2hpbGRyZW4iLGRlYnVnSUQsY2hpbGREZWJ1Z0lEcyl9LG9uQmVmb3JlTW91 bnRDb21wb25lbnQ6ZnVuY3Rpb24oZGVidWdJRCxlbGVtZW50LHBhcmVudERlYnVnSUQpe2NoZWNr RGVidWdJRChkZWJ1Z0lEKTtjaGVja0RlYnVnSUQocGFyZW50RGVidWdJRCx0cnVlKTtlbWl0RXZl bnQoIm9uQmVmb3JlTW91bnRDb21wb25lbnQiLGRlYnVnSUQsZWxlbWVudCxwYXJlbnREZWJ1Z0lE KTttYXJrQmVnaW4oZGVidWdJRCwibW91bnQiKX0sb25Nb3VudENvbXBvbmVudDpmdW5jdGlvbihk ZWJ1Z0lEKXtjaGVja0RlYnVnSUQoZGVidWdJRCk7bWFya0VuZChkZWJ1Z0lELCJtb3VudCIpO2Vt aXRFdmVudCgib25Nb3VudENvbXBvbmVudCIsZGVidWdJRCl9LG9uQmVmb3JlVXBkYXRlQ29tcG9u ZW50OmZ1bmN0aW9uKGRlYnVnSUQsZWxlbWVudCl7Y2hlY2tEZWJ1Z0lEKGRlYnVnSUQpO2VtaXRF dmVudCgib25CZWZvcmVVcGRhdGVDb21wb25lbnQiLGRlYnVnSUQsZWxlbWVudCk7bWFya0JlZ2lu KGRlYnVnSUQsInVwZGF0ZSIpfSxvblVwZGF0ZUNvbXBvbmVudDpmdW5jdGlvbihkZWJ1Z0lEKXtj aGVja0RlYnVnSUQoZGVidWdJRCk7bWFya0VuZChkZWJ1Z0lELCJ1cGRhdGUiKTtlbWl0RXZlbnQo Im9uVXBkYXRlQ29tcG9uZW50IixkZWJ1Z0lEKX0sb25CZWZvcmVVbm1vdW50Q29tcG9uZW50OmZ1 bmN0aW9uKGRlYnVnSUQpe2NoZWNrRGVidWdJRChkZWJ1Z0lEKTtlbWl0RXZlbnQoIm9uQmVmb3Jl VW5tb3VudENvbXBvbmVudCIsZGVidWdJRCk7bWFya0JlZ2luKGRlYnVnSUQsInVubW91bnQiKX0s b25Vbm1vdW50Q29tcG9uZW50OmZ1bmN0aW9uKGRlYnVnSUQpe2NoZWNrRGVidWdJRChkZWJ1Z0lE KTttYXJrRW5kKGRlYnVnSUQsInVubW91bnQiKTtlbWl0RXZlbnQoIm9uVW5tb3VudENvbXBvbmVu dCIsZGVidWdJRCl9LG9uVGVzdEV2ZW50OmZ1bmN0aW9uKCl7ZW1pdEV2ZW50KCJvblRlc3RFdmVu dCIpfX07UmVhY3REZWJ1Z1Rvb2wuYWRkRGV2dG9vbD1SZWFjdERlYnVnVG9vbC5hZGRIb29rO1Jl YWN0RGVidWdUb29sLnJlbW92ZURldnRvb2w9UmVhY3REZWJ1Z1Rvb2wucmVtb3ZlSG9vaztSZWFj dERlYnVnVG9vbC5hZGRIb29rKFJlYWN0SW52YWxpZFNldFN0YXRlV2FybmluZ0hvb2spO1JlYWN0 RGVidWdUb29sLmFkZEhvb2soUmVhY3RDb21wb25lbnRUcmVlSG9vayk7dmFyIHVybD1FeGVjdXRp b25FbnZpcm9ubWVudC5jYW5Vc2VET00mJndpbmRvdy5sb2NhdGlvbi5ocmVmfHwiIjtpZigvWz8m XXJlYWN0X3BlcmZcYi8udGVzdCh1cmwpKXtSZWFjdERlYnVnVG9vbC5iZWdpblByb2ZpbGluZygp fW1vZHVsZS5leHBvcnRzPVJlYWN0RGVidWdUb29sfSx7MTIyOjEyMiwxMjY6MTI2LDE0NToxNDUs MTQ3OjE0Nyw1NTo1NSw2MDo2MH1dLDQ2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRz KXsidXNlIHN0cmljdCI7dmFyIF9hc3NpZ249X2RlcmVxXygxNDgpO3ZhciBSZWFjdFVwZGF0ZXM9 X2RlcmVxXyg3NSk7dmFyIFRyYW5zYWN0aW9uPV9kZXJlcV8oOTMpO3ZhciBlbXB0eUZ1bmN0aW9u PV9kZXJlcV8oMTMyKTt2YXIgUkVTRVRfQkFUQ0hFRF9VUERBVEVTPXtpbml0aWFsaXplOmVtcHR5 RnVuY3Rpb24sY2xvc2U6ZnVuY3Rpb24oKXtSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5Lmlz QmF0Y2hpbmdVcGRhdGVzPWZhbHNlfX07dmFyIEZMVVNIX0JBVENIRURfVVBEQVRFUz17aW5pdGlh bGl6ZTplbXB0eUZ1bmN0aW9uLGNsb3NlOlJlYWN0VXBkYXRlcy5mbHVzaEJhdGNoZWRVcGRhdGVz LmJpbmQoUmVhY3RVcGRhdGVzKX07dmFyIFRSQU5TQUNUSU9OX1dSQVBQRVJTPVtGTFVTSF9CQVRD SEVEX1VQREFURVMsUkVTRVRfQkFUQ0hFRF9VUERBVEVTXTtmdW5jdGlvbiBSZWFjdERlZmF1bHRC YXRjaGluZ1N0cmF0ZWd5VHJhbnNhY3Rpb24oKXt0aGlzLnJlaW5pdGlhbGl6ZVRyYW5zYWN0aW9u KCl9X2Fzc2lnbihSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5VHJhbnNhY3Rpb24ucHJvdG90 eXBlLFRyYW5zYWN0aW9uLHtnZXRUcmFuc2FjdGlvbldyYXBwZXJzOmZ1bmN0aW9uKCl7cmV0dXJu IFRSQU5TQUNUSU9OX1dSQVBQRVJTfX0pO3ZhciB0cmFuc2FjdGlvbj1uZXcgUmVhY3REZWZhdWx0 QmF0Y2hpbmdTdHJhdGVneVRyYW5zYWN0aW9uO3ZhciBSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0 ZWd5PXtpc0JhdGNoaW5nVXBkYXRlczpmYWxzZSxiYXRjaGVkVXBkYXRlczpmdW5jdGlvbihjYWxs YmFjayxhLGIsYyxkLGUpe3ZhciBhbHJlYWR5QmF0Y2hpbmdVcGRhdGVzPVJlYWN0RGVmYXVsdEJh dGNoaW5nU3RyYXRlZ3kuaXNCYXRjaGluZ1VwZGF0ZXM7UmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJh dGVneS5pc0JhdGNoaW5nVXBkYXRlcz10cnVlO2lmKGFscmVhZHlCYXRjaGluZ1VwZGF0ZXMpe3Jl dHVybiBjYWxsYmFjayhhLGIsYyxkLGUpfWVsc2V7cmV0dXJuIHRyYW5zYWN0aW9uLnBlcmZvcm0o Y2FsbGJhY2ssbnVsbCxhLGIsYyxkLGUpfX19O21vZHVsZS5leHBvcnRzPVJlYWN0RGVmYXVsdEJh dGNoaW5nU3RyYXRlZ3l9LHsxMzI6MTMyLDE0ODoxNDgsNzU6NzUsOTM6OTN9XSw0NzpbZnVuY3Rp b24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBBUklBRE9NUHJvcGVy dHlDb25maWc9X2RlcmVxXygxKTt2YXIgQmVmb3JlSW5wdXRFdmVudFBsdWdpbj1fZGVyZXFfKDMp O3ZhciBDaGFuZ2VFdmVudFBsdWdpbj1fZGVyZXFfKDcpO3ZhciBEZWZhdWx0RXZlbnRQbHVnaW5P cmRlcj1fZGVyZXFfKDE0KTt2YXIgRW50ZXJMZWF2ZUV2ZW50UGx1Z2luPV9kZXJlcV8oMTUpO3Zh ciBIVE1MRE9NUHJvcGVydHlDb25maWc9X2RlcmVxXygyMSk7dmFyIFJlYWN0Q29tcG9uZW50QnJv d3NlckVudmlyb25tZW50PV9kZXJlcV8oMjcpO3ZhciBSZWFjdERPTUNvbXBvbmVudD1fZGVyZXFf KDMwKTt2YXIgUmVhY3RET01Db21wb25lbnRUcmVlPV9kZXJlcV8oMzIpO3ZhciBSZWFjdERPTUVt cHR5Q29tcG9uZW50PV9kZXJlcV8oMzQpO3ZhciBSZWFjdERPTVRyZWVUcmF2ZXJzYWw9X2RlcmVx Xyg0NCk7dmFyIFJlYWN0RE9NVGV4dENvbXBvbmVudD1fZGVyZXFfKDQyKTt2YXIgUmVhY3REZWZh dWx0QmF0Y2hpbmdTdHJhdGVneT1fZGVyZXFfKDQ2KTt2YXIgUmVhY3RFdmVudExpc3RlbmVyPV9k ZXJlcV8oNTIpO3ZhciBSZWFjdEluamVjdGlvbj1fZGVyZXFfKDU2KTt2YXIgUmVhY3RSZWNvbmNp bGVUcmFuc2FjdGlvbj1fZGVyZXFfKDY3KTt2YXIgU1ZHRE9NUHJvcGVydHlDb25maWc9X2RlcmVx Xyg3Nyk7dmFyIFNlbGVjdEV2ZW50UGx1Z2luPV9kZXJlcV8oNzgpO3ZhciBTaW1wbGVFdmVudFBs dWdpbj1fZGVyZXFfKDc5KTt2YXIgYWxyZWFkeUluamVjdGVkPWZhbHNlO2Z1bmN0aW9uIGluamVj dCgpe2lmKGFscmVhZHlJbmplY3RlZCl7cmV0dXJufWFscmVhZHlJbmplY3RlZD10cnVlO1JlYWN0 SW5qZWN0aW9uLkV2ZW50RW1pdHRlci5pbmplY3RSZWFjdEV2ZW50TGlzdGVuZXIoUmVhY3RFdmVu dExpc3RlbmVyKTtSZWFjdEluamVjdGlvbi5FdmVudFBsdWdpbkh1Yi5pbmplY3RFdmVudFBsdWdp bk9yZGVyKERlZmF1bHRFdmVudFBsdWdpbk9yZGVyKTtSZWFjdEluamVjdGlvbi5FdmVudFBsdWdp blV0aWxzLmluamVjdENvbXBvbmVudFRyZWUoUmVhY3RET01Db21wb25lbnRUcmVlKTtSZWFjdElu amVjdGlvbi5FdmVudFBsdWdpblV0aWxzLmluamVjdFRyZWVUcmF2ZXJzYWwoUmVhY3RET01UcmVl VHJhdmVyc2FsKTtSZWFjdEluamVjdGlvbi5FdmVudFBsdWdpbkh1Yi5pbmplY3RFdmVudFBsdWdp bnNCeU5hbWUoe1NpbXBsZUV2ZW50UGx1Z2luOlNpbXBsZUV2ZW50UGx1Z2luLEVudGVyTGVhdmVF dmVudFBsdWdpbjpFbnRlckxlYXZlRXZlbnRQbHVnaW4sQ2hhbmdlRXZlbnRQbHVnaW46Q2hhbmdl RXZlbnRQbHVnaW4sU2VsZWN0RXZlbnRQbHVnaW46U2VsZWN0RXZlbnRQbHVnaW4sQmVmb3JlSW5w dXRFdmVudFBsdWdpbjpCZWZvcmVJbnB1dEV2ZW50UGx1Z2lufSk7UmVhY3RJbmplY3Rpb24uSG9z dENvbXBvbmVudC5pbmplY3RHZW5lcmljQ29tcG9uZW50Q2xhc3MoUmVhY3RET01Db21wb25lbnQp O1JlYWN0SW5qZWN0aW9uLkhvc3RDb21wb25lbnQuaW5qZWN0VGV4dENvbXBvbmVudENsYXNzKFJl YWN0RE9NVGV4dENvbXBvbmVudCk7UmVhY3RJbmplY3Rpb24uRE9NUHJvcGVydHkuaW5qZWN0RE9N UHJvcGVydHlDb25maWcoQVJJQURPTVByb3BlcnR5Q29uZmlnKTtSZWFjdEluamVjdGlvbi5ET01Q cm9wZXJ0eS5pbmplY3RET01Qcm9wZXJ0eUNvbmZpZyhIVE1MRE9NUHJvcGVydHlDb25maWcpO1Jl YWN0SW5qZWN0aW9uLkRPTVByb3BlcnR5LmluamVjdERPTVByb3BlcnR5Q29uZmlnKFNWR0RPTVBy b3BlcnR5Q29uZmlnKTtSZWFjdEluamVjdGlvbi5FbXB0eUNvbXBvbmVudC5pbmplY3RFbXB0eUNv bXBvbmVudEZhY3RvcnkoZnVuY3Rpb24oaW5zdGFudGlhdGUpe3JldHVybiBuZXcgUmVhY3RET01F bXB0eUNvbXBvbmVudChpbnN0YW50aWF0ZSl9KTtSZWFjdEluamVjdGlvbi5VcGRhdGVzLmluamVj dFJlY29uY2lsZVRyYW5zYWN0aW9uKFJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24pO1JlYWN0SW5q ZWN0aW9uLlVwZGF0ZXMuaW5qZWN0QmF0Y2hpbmdTdHJhdGVneShSZWFjdERlZmF1bHRCYXRjaGlu Z1N0cmF0ZWd5KTtSZWFjdEluamVjdGlvbi5Db21wb25lbnQuaW5qZWN0RW52aXJvbm1lbnQoUmVh Y3RDb21wb25lbnRCcm93c2VyRW52aXJvbm1lbnQpfW1vZHVsZS5leHBvcnRzPXtpbmplY3Q6aW5q ZWN0fX0sezE6MSwxNDoxNCwxNToxNSwyMToyMSwyNzoyNywzOjMsMzA6MzAsMzI6MzIsMzQ6MzQs NDI6NDIsNDQ6NDQsNDY6NDYsNTI6NTIsNTY6NTYsNjc6NjcsNzo3LDc3Ojc3LDc4Ojc4LDc5Ojc5 fV0sNDg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIg UkVBQ1RfRUxFTUVOVF9UWVBFPXR5cGVvZiBTeW1ib2w9PT0iZnVuY3Rpb24iJiZTeW1ib2xbImZv ciJdJiZTeW1ib2xbImZvciJdKCJyZWFjdC5lbGVtZW50Iil8fDYwMTAzO21vZHVsZS5leHBvcnRz PVJFQUNUX0VMRU1FTlRfVFlQRX0se31dLDQ5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBv cnRzKXsidXNlIHN0cmljdCI7dmFyIGVtcHR5Q29tcG9uZW50RmFjdG9yeTt2YXIgUmVhY3RFbXB0 eUNvbXBvbmVudEluamVjdGlvbj17aW5qZWN0RW1wdHlDb21wb25lbnRGYWN0b3J5OmZ1bmN0aW9u KGZhY3Rvcnkpe2VtcHR5Q29tcG9uZW50RmFjdG9yeT1mYWN0b3J5fX07dmFyIFJlYWN0RW1wdHlD b21wb25lbnQ9e2NyZWF0ZTpmdW5jdGlvbihpbnN0YW50aWF0ZSl7cmV0dXJuIGVtcHR5Q29tcG9u ZW50RmFjdG9yeShpbnN0YW50aWF0ZSl9fTtSZWFjdEVtcHR5Q29tcG9uZW50LmluamVjdGlvbj1S ZWFjdEVtcHR5Q29tcG9uZW50SW5qZWN0aW9uO21vZHVsZS5leHBvcnRzPVJlYWN0RW1wdHlDb21w b25lbnR9LHt9XSw1MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJp Y3QiO3ZhciBjYXVnaHRFcnJvcj1udWxsO2Z1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFjayhu YW1lLGZ1bmMsYSl7dHJ5e2Z1bmMoYSl9Y2F0Y2goeCl7aWYoY2F1Z2h0RXJyb3I9PT1udWxsKXtj YXVnaHRFcnJvcj14fX19dmFyIFJlYWN0RXJyb3JVdGlscz17aW52b2tlR3VhcmRlZENhbGxiYWNr Omludm9rZUd1YXJkZWRDYWxsYmFjayxpbnZva2VHdWFyZGVkQ2FsbGJhY2tXaXRoQ2F0Y2g6aW52 b2tlR3VhcmRlZENhbGxiYWNrLHJldGhyb3dDYXVnaHRFcnJvcjpmdW5jdGlvbigpe2lmKGNhdWdo dEVycm9yKXt2YXIgZXJyb3I9Y2F1Z2h0RXJyb3I7Y2F1Z2h0RXJyb3I9bnVsbDt0aHJvdyBlcnJv cn19fTtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtpZih0eXBlb2Ygd2luZG93IT09 InVuZGVmaW5lZCImJnR5cGVvZiB3aW5kb3cuZGlzcGF0Y2hFdmVudD09PSJmdW5jdGlvbiImJnR5 cGVvZiBkb2N1bWVudCE9PSJ1bmRlZmluZWQiJiZ0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRXZlbnQ9 PT0iZnVuY3Rpb24iKXt2YXIgZmFrZU5vZGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicmVhY3Qi KTtSZWFjdEVycm9yVXRpbHMuaW52b2tlR3VhcmRlZENhbGxiYWNrPWZ1bmN0aW9uKG5hbWUsZnVu YyxhKXt2YXIgYm91bmRGdW5jPWZ1bmMuYmluZChudWxsLGEpO3ZhciBldnRUeXBlPSJyZWFjdC0i K25hbWU7ZmFrZU5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldnRUeXBlLGJvdW5kRnVuYyxmYWxzZSk7 dmFyIGV2dD1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTtldnQuaW5pdEV2ZW50KGV2dFR5 cGUsZmFsc2UsZmFsc2UpO2Zha2VOb2RlLmRpc3BhdGNoRXZlbnQoZXZ0KTtmYWtlTm9kZS5yZW1v dmVFdmVudExpc3RlbmVyKGV2dFR5cGUsYm91bmRGdW5jLGZhbHNlKX19fW1vZHVsZS5leHBvcnRz PVJlYWN0RXJyb3JVdGlsc30se31dLDUxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRz KXsidXNlIHN0cmljdCI7dmFyIEV2ZW50UGx1Z2luSHViPV9kZXJlcV8oMTYpO2Z1bmN0aW9uIHJ1 bkV2ZW50UXVldWVJbkJhdGNoKGV2ZW50cyl7RXZlbnRQbHVnaW5IdWIuZW5xdWV1ZUV2ZW50cyhl dmVudHMpO0V2ZW50UGx1Z2luSHViLnByb2Nlc3NFdmVudFF1ZXVlKGZhbHNlKX12YXIgUmVhY3RF dmVudEVtaXR0ZXJNaXhpbj17aGFuZGxlVG9wTGV2ZWw6ZnVuY3Rpb24odG9wTGV2ZWxUeXBlLHRh cmdldEluc3QsbmF0aXZlRXZlbnQsbmF0aXZlRXZlbnRUYXJnZXQpe3ZhciBldmVudHM9RXZlbnRQ bHVnaW5IdWIuZXh0cmFjdEV2ZW50cyh0b3BMZXZlbFR5cGUsdGFyZ2V0SW5zdCxuYXRpdmVFdmVu dCxuYXRpdmVFdmVudFRhcmdldCk7cnVuRXZlbnRRdWV1ZUluQmF0Y2goZXZlbnRzKX19O21vZHVs ZS5leHBvcnRzPVJlYWN0RXZlbnRFbWl0dGVyTWl4aW59LHsxNjoxNn1dLDUyOltmdW5jdGlvbihf ZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIF9hc3NpZ249X2RlcmVxXygx NDgpO3ZhciBFdmVudExpc3RlbmVyPV9kZXJlcV8oMTI1KTt2YXIgRXhlY3V0aW9uRW52aXJvbm1l bnQ9X2RlcmVxXygxMjYpO3ZhciBQb29sZWRDbGFzcz1fZGVyZXFfKDI0KTt2YXIgUmVhY3RET01D b21wb25lbnRUcmVlPV9kZXJlcV8oMzIpO3ZhciBSZWFjdFVwZGF0ZXM9X2RlcmVxXyg3NSk7dmFy IGdldEV2ZW50VGFyZ2V0PV9kZXJlcV8oMTA2KTt2YXIgZ2V0VW5ib3VuZGVkU2Nyb2xsUG9zaXRp b249X2RlcmVxXygxMzcpO2Z1bmN0aW9uIGZpbmRQYXJlbnQoaW5zdCl7d2hpbGUoaW5zdC5faG9z dFBhcmVudCl7aW5zdD1pbnN0Ll9ob3N0UGFyZW50fXZhciByb290Tm9kZT1SZWFjdERPTUNvbXBv bmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KTt2YXIgY29udGFpbmVyPXJvb3ROb2Rl LnBhcmVudE5vZGU7cmV0dXJuIFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRDbG9zZXN0SW5zdGFu Y2VGcm9tTm9kZShjb250YWluZXIpfWZ1bmN0aW9uIFRvcExldmVsQ2FsbGJhY2tCb29rS2VlcGlu Zyh0b3BMZXZlbFR5cGUsbmF0aXZlRXZlbnQpe3RoaXMudG9wTGV2ZWxUeXBlPXRvcExldmVsVHlw ZTt0aGlzLm5hdGl2ZUV2ZW50PW5hdGl2ZUV2ZW50O3RoaXMuYW5jZXN0b3JzPVtdfV9hc3NpZ24o VG9wTGV2ZWxDYWxsYmFja0Jvb2tLZWVwaW5nLnByb3RvdHlwZSx7ZGVzdHJ1Y3RvcjpmdW5jdGlv bigpe3RoaXMudG9wTGV2ZWxUeXBlPW51bGw7dGhpcy5uYXRpdmVFdmVudD1udWxsO3RoaXMuYW5j ZXN0b3JzLmxlbmd0aD0wfX0pO1Bvb2xlZENsYXNzLmFkZFBvb2xpbmdUbyhUb3BMZXZlbENhbGxi YWNrQm9va0tlZXBpbmcsUG9vbGVkQ2xhc3MudHdvQXJndW1lbnRQb29sZXIpO2Z1bmN0aW9uIGhh bmRsZVRvcExldmVsSW1wbChib29rS2VlcGluZyl7dmFyIG5hdGl2ZUV2ZW50VGFyZ2V0PWdldEV2 ZW50VGFyZ2V0KGJvb2tLZWVwaW5nLm5hdGl2ZUV2ZW50KTt2YXIgdGFyZ2V0SW5zdD1SZWFjdERP TUNvbXBvbmVudFRyZWUuZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUobmF0aXZlRXZlbnRUYXJn ZXQpO3ZhciBhbmNlc3Rvcj10YXJnZXRJbnN0O2Rve2Jvb2tLZWVwaW5nLmFuY2VzdG9ycy5wdXNo KGFuY2VzdG9yKTthbmNlc3Rvcj1hbmNlc3RvciYmZmluZFBhcmVudChhbmNlc3Rvcil9d2hpbGUo YW5jZXN0b3IpO2Zvcih2YXIgaT0wO2k8Ym9va0tlZXBpbmcuYW5jZXN0b3JzLmxlbmd0aDtpKysp e3RhcmdldEluc3Q9Ym9va0tlZXBpbmcuYW5jZXN0b3JzW2ldO1JlYWN0RXZlbnRMaXN0ZW5lci5f aGFuZGxlVG9wTGV2ZWwoYm9va0tlZXBpbmcudG9wTGV2ZWxUeXBlLHRhcmdldEluc3QsYm9va0tl ZXBpbmcubmF0aXZlRXZlbnQsZ2V0RXZlbnRUYXJnZXQoYm9va0tlZXBpbmcubmF0aXZlRXZlbnQp KX19ZnVuY3Rpb24gc2Nyb2xsVmFsdWVNb25pdG9yKGNiKXt2YXIgc2Nyb2xsUG9zaXRpb249Z2V0 VW5ib3VuZGVkU2Nyb2xsUG9zaXRpb24od2luZG93KTtjYihzY3JvbGxQb3NpdGlvbil9dmFyIFJl YWN0RXZlbnRMaXN0ZW5lcj17X2VuYWJsZWQ6dHJ1ZSxfaGFuZGxlVG9wTGV2ZWw6bnVsbCxXSU5E T1dfSEFORExFOkV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTT93aW5kb3c6bnVsbCxzZXRI YW5kbGVUb3BMZXZlbDpmdW5jdGlvbihoYW5kbGVUb3BMZXZlbCl7UmVhY3RFdmVudExpc3RlbmVy Ll9oYW5kbGVUb3BMZXZlbD1oYW5kbGVUb3BMZXZlbH0sc2V0RW5hYmxlZDpmdW5jdGlvbihlbmFi bGVkKXtSZWFjdEV2ZW50TGlzdGVuZXIuX2VuYWJsZWQ9ISFlbmFibGVkfSxpc0VuYWJsZWQ6ZnVu Y3Rpb24oKXtyZXR1cm4gUmVhY3RFdmVudExpc3RlbmVyLl9lbmFibGVkfSx0cmFwQnViYmxlZEV2 ZW50OmZ1bmN0aW9uKHRvcExldmVsVHlwZSxoYW5kbGVyQmFzZU5hbWUsZWxlbWVudCl7aWYoIWVs ZW1lbnQpe3JldHVybiBudWxsfXJldHVybiBFdmVudExpc3RlbmVyLmxpc3RlbihlbGVtZW50LGhh bmRsZXJCYXNlTmFtZSxSZWFjdEV2ZW50TGlzdGVuZXIuZGlzcGF0Y2hFdmVudC5iaW5kKG51bGws dG9wTGV2ZWxUeXBlKSl9LHRyYXBDYXB0dXJlZEV2ZW50OmZ1bmN0aW9uKHRvcExldmVsVHlwZSxo YW5kbGVyQmFzZU5hbWUsZWxlbWVudCl7aWYoIWVsZW1lbnQpe3JldHVybiBudWxsfXJldHVybiBF dmVudExpc3RlbmVyLmNhcHR1cmUoZWxlbWVudCxoYW5kbGVyQmFzZU5hbWUsUmVhY3RFdmVudExp c3RlbmVyLmRpc3BhdGNoRXZlbnQuYmluZChudWxsLHRvcExldmVsVHlwZSkpfSxtb25pdG9yU2Ny b2xsVmFsdWU6ZnVuY3Rpb24ocmVmcmVzaCl7dmFyIGNhbGxiYWNrPXNjcm9sbFZhbHVlTW9uaXRv ci5iaW5kKG51bGwscmVmcmVzaCk7RXZlbnRMaXN0ZW5lci5saXN0ZW4od2luZG93LCJzY3JvbGwi LGNhbGxiYWNrKX0sZGlzcGF0Y2hFdmVudDpmdW5jdGlvbih0b3BMZXZlbFR5cGUsbmF0aXZlRXZl bnQpe2lmKCFSZWFjdEV2ZW50TGlzdGVuZXIuX2VuYWJsZWQpe3JldHVybn12YXIgYm9va0tlZXBp bmc9VG9wTGV2ZWxDYWxsYmFja0Jvb2tLZWVwaW5nLmdldFBvb2xlZCh0b3BMZXZlbFR5cGUsbmF0 aXZlRXZlbnQpO3RyeXtSZWFjdFVwZGF0ZXMuYmF0Y2hlZFVwZGF0ZXMoaGFuZGxlVG9wTGV2ZWxJ bXBsLGJvb2tLZWVwaW5nKX1maW5hbGx5e1RvcExldmVsQ2FsbGJhY2tCb29rS2VlcGluZy5yZWxl YXNlKGJvb2tLZWVwaW5nKX19fTttb2R1bGUuZXhwb3J0cz1SZWFjdEV2ZW50TGlzdGVuZXJ9LHsx MDY6MTA2LDEyNToxMjUsMTI2OjEyNiwxMzc6MTM3LDE0ODoxNDgsMjQ6MjQsMzI6MzIsNzU6NzV9 XSw1MzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBS ZWFjdEZlYXR1cmVGbGFncz17bG9nVG9wTGV2ZWxSZW5kZXJzOmZhbHNlfTttb2R1bGUuZXhwb3J0 cz1SZWFjdEZlYXR1cmVGbGFnc30se31dLDU0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBv cnRzKXsidXNlIHN0cmljdCI7dmFyIF9wcm9kSW52YXJpYW50PV9kZXJlcV8oMTE2KTt2YXIgaW52 YXJpYW50PV9kZXJlcV8oMTQwKTt2YXIgZ2VuZXJpY0NvbXBvbmVudENsYXNzPW51bGw7dmFyIHRl eHRDb21wb25lbnRDbGFzcz1udWxsO3ZhciBSZWFjdEhvc3RDb21wb25lbnRJbmplY3Rpb249e2lu amVjdEdlbmVyaWNDb21wb25lbnRDbGFzczpmdW5jdGlvbihjb21wb25lbnRDbGFzcyl7Z2VuZXJp Y0NvbXBvbmVudENsYXNzPWNvbXBvbmVudENsYXNzfSxpbmplY3RUZXh0Q29tcG9uZW50Q2xhc3M6 ZnVuY3Rpb24oY29tcG9uZW50Q2xhc3Mpe3RleHRDb21wb25lbnRDbGFzcz1jb21wb25lbnRDbGFz c319O2Z1bmN0aW9uIGNyZWF0ZUludGVybmFsQ29tcG9uZW50KGVsZW1lbnQpeyFnZW5lcmljQ29t cG9uZW50Q2xhc3M/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2Us IlRoZXJlIGlzIG5vIHJlZ2lzdGVyZWQgY29tcG9uZW50IGZvciB0aGUgdGFnICVzIixlbGVtZW50 LnR5cGUpOl9wcm9kSW52YXJpYW50KCIxMTEiLGVsZW1lbnQudHlwZSk6dm9pZCAwO3JldHVybiBu ZXcgZ2VuZXJpY0NvbXBvbmVudENsYXNzKGVsZW1lbnQpfWZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNl Rm9yVGV4dCh0ZXh0KXtyZXR1cm4gbmV3IHRleHRDb21wb25lbnRDbGFzcyh0ZXh0KX1mdW5jdGlv biBpc1RleHRDb21wb25lbnQoY29tcG9uZW50KXtyZXR1cm4gY29tcG9uZW50IGluc3RhbmNlb2Yg dGV4dENvbXBvbmVudENsYXNzfXZhciBSZWFjdEhvc3RDb21wb25lbnQ9e2NyZWF0ZUludGVybmFs Q29tcG9uZW50OmNyZWF0ZUludGVybmFsQ29tcG9uZW50LGNyZWF0ZUluc3RhbmNlRm9yVGV4dDpj cmVhdGVJbnN0YW5jZUZvclRleHQsaXNUZXh0Q29tcG9uZW50OmlzVGV4dENvbXBvbmVudCxpbmpl Y3Rpb246UmVhY3RIb3N0Q29tcG9uZW50SW5qZWN0aW9ufTttb2R1bGUuZXhwb3J0cz1SZWFjdEhv c3RDb21wb25lbnR9LHsxMTY6MTE2LDE0MDoxNDB9XSw1NTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1 bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBoaXN0b3J5PVtdO3ZhciBSZWFjdEhvc3RPcGVy YXRpb25IaXN0b3J5SG9vaz17b25Ib3N0T3BlcmF0aW9uOmZ1bmN0aW9uKG9wZXJhdGlvbil7aGlz dG9yeS5wdXNoKG9wZXJhdGlvbil9LGNsZWFySGlzdG9yeTpmdW5jdGlvbigpe2lmKFJlYWN0SG9z dE9wZXJhdGlvbkhpc3RvcnlIb29rLl9wcmV2ZW50Q2xlYXJpbmcpe3JldHVybn1oaXN0b3J5PVtd fSxnZXRIaXN0b3J5OmZ1bmN0aW9uKCl7cmV0dXJuIGhpc3Rvcnl9fTttb2R1bGUuZXhwb3J0cz1S ZWFjdEhvc3RPcGVyYXRpb25IaXN0b3J5SG9va30se31dLDU2OltmdW5jdGlvbihfZGVyZXFfLG1v ZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIERPTVByb3BlcnR5PV9kZXJlcV8oMTEpO3Zh ciBFdmVudFBsdWdpbkh1Yj1fZGVyZXFfKDE2KTt2YXIgRXZlbnRQbHVnaW5VdGlscz1fZGVyZXFf KDE4KTt2YXIgUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudD1fZGVyZXFfKDI4KTt2YXIgUmVhY3RF bXB0eUNvbXBvbmVudD1fZGVyZXFfKDQ5KTt2YXIgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyPV9k ZXJlcV8oMjUpO3ZhciBSZWFjdEhvc3RDb21wb25lbnQ9X2RlcmVxXyg1NCk7dmFyIFJlYWN0VXBk YXRlcz1fZGVyZXFfKDc1KTt2YXIgUmVhY3RJbmplY3Rpb249e0NvbXBvbmVudDpSZWFjdENvbXBv bmVudEVudmlyb25tZW50LmluamVjdGlvbixET01Qcm9wZXJ0eTpET01Qcm9wZXJ0eS5pbmplY3Rp b24sRW1wdHlDb21wb25lbnQ6UmVhY3RFbXB0eUNvbXBvbmVudC5pbmplY3Rpb24sRXZlbnRQbHVn aW5IdWI6RXZlbnRQbHVnaW5IdWIuaW5qZWN0aW9uLEV2ZW50UGx1Z2luVXRpbHM6RXZlbnRQbHVn aW5VdGlscy5pbmplY3Rpb24sRXZlbnRFbWl0dGVyOlJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5p bmplY3Rpb24sSG9zdENvbXBvbmVudDpSZWFjdEhvc3RDb21wb25lbnQuaW5qZWN0aW9uLFVwZGF0 ZXM6UmVhY3RVcGRhdGVzLmluamVjdGlvbn07bW9kdWxlLmV4cG9ydHM9UmVhY3RJbmplY3Rpb259 LHsxMToxMSwxNjoxNiwxODoxOCwyNToyNSwyODoyOCw0OTo0OSw1NDo1NCw3NTo3NX1dLDU3Oltm dW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIFJlYWN0RE9N U2VsZWN0aW9uPV9kZXJlcV8oMzkpO3ZhciBjb250YWluc05vZGU9X2RlcmVxXygxMjkpO3ZhciBm b2N1c05vZGU9X2RlcmVxXygxMzQpO3ZhciBnZXRBY3RpdmVFbGVtZW50PV9kZXJlcV8oMTM1KTtm dW5jdGlvbiBpc0luRG9jdW1lbnQobm9kZSl7cmV0dXJuIGNvbnRhaW5zTm9kZShkb2N1bWVudC5k b2N1bWVudEVsZW1lbnQsbm9kZSl9dmFyIFJlYWN0SW5wdXRTZWxlY3Rpb249e2hhc1NlbGVjdGlv bkNhcGFiaWxpdGllczpmdW5jdGlvbihlbGVtKXt2YXIgbm9kZU5hbWU9ZWxlbSYmZWxlbS5ub2Rl TmFtZSYmZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiBub2RlTmFtZSYmKG5vZGVO YW1lPT09ImlucHV0IiYmZWxlbS50eXBlPT09InRleHQifHxub2RlTmFtZT09PSJ0ZXh0YXJlYSJ8 fGVsZW0uY29udGVudEVkaXRhYmxlPT09InRydWUiKX0sZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb246 ZnVuY3Rpb24oKXt2YXIgZm9jdXNlZEVsZW09Z2V0QWN0aXZlRWxlbWVudCgpO3JldHVybntmb2N1 c2VkRWxlbTpmb2N1c2VkRWxlbSxzZWxlY3Rpb25SYW5nZTpSZWFjdElucHV0U2VsZWN0aW9uLmhh c1NlbGVjdGlvbkNhcGFiaWxpdGllcyhmb2N1c2VkRWxlbSk/UmVhY3RJbnB1dFNlbGVjdGlvbi5n ZXRTZWxlY3Rpb24oZm9jdXNlZEVsZW0pOm51bGx9fSxyZXN0b3JlU2VsZWN0aW9uOmZ1bmN0aW9u KHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24pe3ZhciBjdXJGb2N1c2VkRWxlbT1nZXRBY3RpdmVF bGVtZW50KCk7dmFyIHByaW9yRm9jdXNlZEVsZW09cHJpb3JTZWxlY3Rpb25JbmZvcm1hdGlvbi5m b2N1c2VkRWxlbTt2YXIgcHJpb3JTZWxlY3Rpb25SYW5nZT1wcmlvclNlbGVjdGlvbkluZm9ybWF0 aW9uLnNlbGVjdGlvblJhbmdlO2lmKGN1ckZvY3VzZWRFbGVtIT09cHJpb3JGb2N1c2VkRWxlbSYm aXNJbkRvY3VtZW50KHByaW9yRm9jdXNlZEVsZW0pKXtpZihSZWFjdElucHV0U2VsZWN0aW9uLmhh c1NlbGVjdGlvbkNhcGFiaWxpdGllcyhwcmlvckZvY3VzZWRFbGVtKSl7UmVhY3RJbnB1dFNlbGVj dGlvbi5zZXRTZWxlY3Rpb24ocHJpb3JGb2N1c2VkRWxlbSxwcmlvclNlbGVjdGlvblJhbmdlKX1m b2N1c05vZGUocHJpb3JGb2N1c2VkRWxlbSl9fSxnZXRTZWxlY3Rpb246ZnVuY3Rpb24oaW5wdXQp e3ZhciBzZWxlY3Rpb247aWYoInNlbGVjdGlvblN0YXJ0ImluIGlucHV0KXtzZWxlY3Rpb249e3N0 YXJ0OmlucHV0LnNlbGVjdGlvblN0YXJ0LGVuZDppbnB1dC5zZWxlY3Rpb25FbmR9fWVsc2UgaWYo ZG9jdW1lbnQuc2VsZWN0aW9uJiZpbnB1dC5ub2RlTmFtZSYmaW5wdXQubm9kZU5hbWUudG9Mb3dl ckNhc2UoKT09PSJpbnB1dCIpe3ZhciByYW5nZT1kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFu Z2UoKTtpZihyYW5nZS5wYXJlbnRFbGVtZW50KCk9PT1pbnB1dCl7c2VsZWN0aW9uPXtzdGFydDot cmFuZ2UubW92ZVN0YXJ0KCJjaGFyYWN0ZXIiLC1pbnB1dC52YWx1ZS5sZW5ndGgpLGVuZDotcmFu Z2UubW92ZUVuZCgiY2hhcmFjdGVyIiwtaW5wdXQudmFsdWUubGVuZ3RoKX19fWVsc2V7c2VsZWN0 aW9uPVJlYWN0RE9NU2VsZWN0aW9uLmdldE9mZnNldHMoaW5wdXQpfXJldHVybiBzZWxlY3Rpb258 fHtzdGFydDowLGVuZDowfX0sc2V0U2VsZWN0aW9uOmZ1bmN0aW9uKGlucHV0LG9mZnNldHMpe3Zh ciBzdGFydD1vZmZzZXRzLnN0YXJ0O3ZhciBlbmQ9b2Zmc2V0cy5lbmQ7aWYoZW5kPT09dW5kZWZp bmVkKXtlbmQ9c3RhcnR9aWYoInNlbGVjdGlvblN0YXJ0ImluIGlucHV0KXtpbnB1dC5zZWxlY3Rp b25TdGFydD1zdGFydDtpbnB1dC5zZWxlY3Rpb25FbmQ9TWF0aC5taW4oZW5kLGlucHV0LnZhbHVl Lmxlbmd0aCl9ZWxzZSBpZihkb2N1bWVudC5zZWxlY3Rpb24mJmlucHV0Lm5vZGVOYW1lJiZpbnB1 dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0Iil7dmFyIHJhbmdlPWlucHV0LmNyZWF0 ZVRleHRSYW5nZSgpO3JhbmdlLmNvbGxhcHNlKHRydWUpO3JhbmdlLm1vdmVTdGFydCgiY2hhcmFj dGVyIixzdGFydCk7cmFuZ2UubW92ZUVuZCgiY2hhcmFjdGVyIixlbmQtc3RhcnQpO3JhbmdlLnNl bGVjdCgpfWVsc2V7UmVhY3RET01TZWxlY3Rpb24uc2V0T2Zmc2V0cyhpbnB1dCxvZmZzZXRzKX19 fTttb2R1bGUuZXhwb3J0cz1SZWFjdElucHV0U2VsZWN0aW9ufSx7MTI5OjEyOSwxMzQ6MTM0LDEz NToxMzUsMzk6Mzl9XSw1ODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBz dHJpY3QiO3ZhciBSZWFjdEluc3RhbmNlTWFwPXtyZW1vdmU6ZnVuY3Rpb24oa2V5KXtrZXkuX3Jl YWN0SW50ZXJuYWxJbnN0YW5jZT11bmRlZmluZWR9LGdldDpmdW5jdGlvbihrZXkpe3JldHVybiBr ZXkuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZX0saGFzOmZ1bmN0aW9uKGtleSl7cmV0dXJuIGtleS5f cmVhY3RJbnRlcm5hbEluc3RhbmNlIT09dW5kZWZpbmVkfSxzZXQ6ZnVuY3Rpb24oa2V5LHZhbHVl KXtrZXkuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZT12YWx1ZX19O21vZHVsZS5leHBvcnRzPVJlYWN0 SW5zdGFuY2VNYXB9LHt9XSw1OTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVz ZSBzdHJpY3QiO3ZhciBkZWJ1Z1Rvb2w9bnVsbDtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rp b24iKXt2YXIgUmVhY3REZWJ1Z1Rvb2w9X2RlcmVxXyg0NSk7ZGVidWdUb29sPVJlYWN0RGVidWdU b29sfW1vZHVsZS5leHBvcnRzPXtkZWJ1Z1Rvb2w6ZGVidWdUb29sfX0sezQ1OjQ1fV0sNjA6W2Z1 bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgd2FybmluZz1f ZGVyZXFfKDE0Nyk7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7dmFyIHByb2Nlc3Np bmdDaGlsZENvbnRleHQ9ZmFsc2U7dmFyIHdhcm5JbnZhbGlkU2V0U3RhdGU9ZnVuY3Rpb24oKXsi ZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmcoIXByb2Nlc3NpbmdDaGlsZENvbnRl eHQsInNldFN0YXRlKC4uLik6IENhbm5vdCBjYWxsIHNldFN0YXRlKCkgaW5zaWRlIGdldENoaWxk Q29udGV4dCgpIik6dm9pZCAwfX12YXIgUmVhY3RJbnZhbGlkU2V0U3RhdGVXYXJuaW5nSG9vaz17 b25CZWdpblByb2Nlc3NpbmdDaGlsZENvbnRleHQ6ZnVuY3Rpb24oKXtwcm9jZXNzaW5nQ2hpbGRD b250ZXh0PXRydWV9LG9uRW5kUHJvY2Vzc2luZ0NoaWxkQ29udGV4dDpmdW5jdGlvbigpe3Byb2Nl c3NpbmdDaGlsZENvbnRleHQ9ZmFsc2V9LG9uU2V0U3RhdGU6ZnVuY3Rpb24oKXt3YXJuSW52YWxp ZFNldFN0YXRlKCl9fTttb2R1bGUuZXhwb3J0cz1SZWFjdEludmFsaWRTZXRTdGF0ZVdhcm5pbmdI b29rfSx7MTQ3OjE0N31dLDYxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNl IHN0cmljdCI7dmFyIGFkbGVyMzI9X2RlcmVxXyg5Nik7dmFyIFRBR19FTkQ9L1wvPz4vO3ZhciBD T01NRU5UX1NUQVJUPS9ePFwhXC1cLS87dmFyIFJlYWN0TWFya3VwQ2hlY2tzdW09e0NIRUNLU1VN X0FUVFJfTkFNRToiZGF0YS1yZWFjdC1jaGVja3N1bSIsYWRkQ2hlY2tzdW1Ub01hcmt1cDpmdW5j dGlvbihtYXJrdXApe3ZhciBjaGVja3N1bT1hZGxlcjMyKG1hcmt1cCk7aWYoQ09NTUVOVF9TVEFS VC50ZXN0KG1hcmt1cCkpe3JldHVybiBtYXJrdXB9ZWxzZXtyZXR1cm4gbWFya3VwLnJlcGxhY2Uo VEFHX0VORCwiICIrUmVhY3RNYXJrdXBDaGVja3N1bS5DSEVDS1NVTV9BVFRSX05BTUUrJz0iJytj aGVja3N1bSsnIiQmJyl9fSxjYW5SZXVzZU1hcmt1cDpmdW5jdGlvbihtYXJrdXAsZWxlbWVudCl7 dmFyIGV4aXN0aW5nQ2hlY2tzdW09ZWxlbWVudC5nZXRBdHRyaWJ1dGUoUmVhY3RNYXJrdXBDaGVj a3N1bS5DSEVDS1NVTV9BVFRSX05BTUUpO2V4aXN0aW5nQ2hlY2tzdW09ZXhpc3RpbmdDaGVja3N1 bSYmcGFyc2VJbnQoZXhpc3RpbmdDaGVja3N1bSwxMCk7dmFyIG1hcmt1cENoZWNrc3VtPWFkbGVy MzIobWFya3VwKTtyZXR1cm4gbWFya3VwQ2hlY2tzdW09PT1leGlzdGluZ0NoZWNrc3VtfX07bW9k dWxlLmV4cG9ydHM9UmVhY3RNYXJrdXBDaGVja3N1bX0sezk2Ojk2fV0sNjI6W2Z1bmN0aW9uKF9k ZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgX3Byb2RJbnZhcmlhbnQ9X2Rl cmVxXygxMTYpO3ZhciBSZWFjdENvbXBvbmVudEVudmlyb25tZW50PV9kZXJlcV8oMjgpO3ZhciBS ZWFjdEluc3RhbmNlTWFwPV9kZXJlcV8oNTgpO3ZhciBSZWFjdEluc3RydW1lbnRhdGlvbj1fZGVy ZXFfKDU5KTt2YXIgUmVhY3RDdXJyZW50T3duZXI9X2RlcmVxXygxMjMpO3ZhciBSZWFjdFJlY29u Y2lsZXI9X2RlcmVxXyg2OCk7dmFyIFJlYWN0Q2hpbGRSZWNvbmNpbGVyPV9kZXJlcV8oMjYpO3Zh ciBlbXB0eUZ1bmN0aW9uPV9kZXJlcV8oMTMyKTt2YXIgZmxhdHRlbkNoaWxkcmVuPV9kZXJlcV8o MTAxKTt2YXIgaW52YXJpYW50PV9kZXJlcV8oMTQwKTtmdW5jdGlvbiBtYWtlSW5zZXJ0TWFya3Vw KG1hcmt1cCxhZnRlck5vZGUsdG9JbmRleCl7cmV0dXJue3R5cGU6IklOU0VSVF9NQVJLVVAiLGNv bnRlbnQ6bWFya3VwLGZyb21JbmRleDpudWxsLGZyb21Ob2RlOm51bGwsdG9JbmRleDp0b0luZGV4 LGFmdGVyTm9kZTphZnRlck5vZGV9fWZ1bmN0aW9uIG1ha2VNb3ZlKGNoaWxkLGFmdGVyTm9kZSx0 b0luZGV4KXtyZXR1cm57dHlwZToiTU9WRV9FWElTVElORyIsY29udGVudDpudWxsLGZyb21JbmRl eDpjaGlsZC5fbW91bnRJbmRleCxmcm9tTm9kZTpSZWFjdFJlY29uY2lsZXIuZ2V0SG9zdE5vZGUo Y2hpbGQpLHRvSW5kZXg6dG9JbmRleCxhZnRlck5vZGU6YWZ0ZXJOb2RlfX1mdW5jdGlvbiBtYWtl UmVtb3ZlKGNoaWxkLG5vZGUpe3JldHVybnt0eXBlOiJSRU1PVkVfTk9ERSIsY29udGVudDpudWxs LGZyb21JbmRleDpjaGlsZC5fbW91bnRJbmRleCxmcm9tTm9kZTpub2RlLHRvSW5kZXg6bnVsbCxh ZnRlck5vZGU6bnVsbH19ZnVuY3Rpb24gbWFrZVNldE1hcmt1cChtYXJrdXApe3JldHVybnt0eXBl OiJTRVRfTUFSS1VQIixjb250ZW50Om1hcmt1cCxmcm9tSW5kZXg6bnVsbCxmcm9tTm9kZTpudWxs LHRvSW5kZXg6bnVsbCxhZnRlck5vZGU6bnVsbH19ZnVuY3Rpb24gbWFrZVRleHRDb250ZW50KHRl eHRDb250ZW50KXtyZXR1cm57dHlwZToiVEVYVF9DT05URU5UIixjb250ZW50OnRleHRDb250ZW50 LGZyb21JbmRleDpudWxsLGZyb21Ob2RlOm51bGwsdG9JbmRleDpudWxsLGFmdGVyTm9kZTpudWxs fX1mdW5jdGlvbiBlbnF1ZXVlKHF1ZXVlLHVwZGF0ZSl7aWYodXBkYXRlKXtxdWV1ZT1xdWV1ZXx8 W107cXVldWUucHVzaCh1cGRhdGUpfXJldHVybiBxdWV1ZX1mdW5jdGlvbiBwcm9jZXNzUXVldWUo aW5zdCx1cGRhdGVRdWV1ZSl7UmVhY3RDb21wb25lbnRFbnZpcm9ubWVudC5wcm9jZXNzQ2hpbGRy ZW5VcGRhdGVzKGluc3QsdXBkYXRlUXVldWUpfXZhciBzZXRDaGlsZHJlbkZvckluc3RydW1lbnRh dGlvbj1lbXB0eUZ1bmN0aW9uO2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe3ZhciBn ZXREZWJ1Z0lEPWZ1bmN0aW9uKGluc3Qpe2lmKCFpbnN0Ll9kZWJ1Z0lEKXt2YXIgaW50ZXJuYWw7 aWYoaW50ZXJuYWw9UmVhY3RJbnN0YW5jZU1hcC5nZXQoaW5zdCkpe2luc3Q9aW50ZXJuYWx9fXJl dHVybiBpbnN0Ll9kZWJ1Z0lEfTtzZXRDaGlsZHJlbkZvckluc3RydW1lbnRhdGlvbj1mdW5jdGlv bihjaGlsZHJlbil7dmFyIGRlYnVnSUQ9Z2V0RGVidWdJRCh0aGlzKTtpZihkZWJ1Z0lEIT09MCl7 UmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uU2V0Q2hpbGRyZW4oZGVidWdJRCxjaGls ZHJlbj9PYmplY3Qua2V5cyhjaGlsZHJlbikubWFwKGZ1bmN0aW9uKGtleSl7cmV0dXJuIGNoaWxk cmVuW2tleV0uX2RlYnVnSUR9KTpbXSl9fX12YXIgUmVhY3RNdWx0aUNoaWxkPXtNaXhpbjp7X3Jl Y29uY2lsZXJJbnN0YW50aWF0ZUNoaWxkcmVuOmZ1bmN0aW9uKG5lc3RlZENoaWxkcmVuLHRyYW5z YWN0aW9uLGNvbnRleHQpe2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe3ZhciBzZWxm RGVidWdJRD1nZXREZWJ1Z0lEKHRoaXMpO2lmKHRoaXMuX2N1cnJlbnRFbGVtZW50KXt0cnl7UmVh Y3RDdXJyZW50T3duZXIuY3VycmVudD10aGlzLl9jdXJyZW50RWxlbWVudC5fb3duZXI7cmV0dXJu IFJlYWN0Q2hpbGRSZWNvbmNpbGVyLmluc3RhbnRpYXRlQ2hpbGRyZW4obmVzdGVkQ2hpbGRyZW4s dHJhbnNhY3Rpb24sY29udGV4dCxzZWxmRGVidWdJRCl9ZmluYWxseXtSZWFjdEN1cnJlbnRPd25l ci5jdXJyZW50PW51bGx9fX1yZXR1cm4gUmVhY3RDaGlsZFJlY29uY2lsZXIuaW5zdGFudGlhdGVD aGlsZHJlbihuZXN0ZWRDaGlsZHJlbix0cmFuc2FjdGlvbixjb250ZXh0KX0sX3JlY29uY2lsZXJV cGRhdGVDaGlsZHJlbjpmdW5jdGlvbihwcmV2Q2hpbGRyZW4sbmV4dE5lc3RlZENoaWxkcmVuRWxl bWVudHMsbW91bnRJbWFnZXMscmVtb3ZlZE5vZGVzLHRyYW5zYWN0aW9uLGNvbnRleHQpe3ZhciBu ZXh0Q2hpbGRyZW47dmFyIHNlbGZEZWJ1Z0lEPTA7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0 aW9uIil7c2VsZkRlYnVnSUQ9Z2V0RGVidWdJRCh0aGlzKTtpZih0aGlzLl9jdXJyZW50RWxlbWVu dCl7dHJ5e1JlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQ9dGhpcy5fY3VycmVudEVsZW1lbnQuX293 bmVyO25leHRDaGlsZHJlbj1mbGF0dGVuQ2hpbGRyZW4obmV4dE5lc3RlZENoaWxkcmVuRWxlbWVu dHMsc2VsZkRlYnVnSUQpfWZpbmFsbHl7UmVhY3RDdXJyZW50T3duZXIuY3VycmVudD1udWxsfVJl YWN0Q2hpbGRSZWNvbmNpbGVyLnVwZGF0ZUNoaWxkcmVuKHByZXZDaGlsZHJlbixuZXh0Q2hpbGRy ZW4sbW91bnRJbWFnZXMscmVtb3ZlZE5vZGVzLHRyYW5zYWN0aW9uLHRoaXMsdGhpcy5faG9zdENv bnRhaW5lckluZm8sY29udGV4dCxzZWxmRGVidWdJRCk7cmV0dXJuIG5leHRDaGlsZHJlbn19bmV4 dENoaWxkcmVuPWZsYXR0ZW5DaGlsZHJlbihuZXh0TmVzdGVkQ2hpbGRyZW5FbGVtZW50cyxzZWxm RGVidWdJRCk7UmVhY3RDaGlsZFJlY29uY2lsZXIudXBkYXRlQ2hpbGRyZW4ocHJldkNoaWxkcmVu LG5leHRDaGlsZHJlbixtb3VudEltYWdlcyxyZW1vdmVkTm9kZXMsdHJhbnNhY3Rpb24sdGhpcyx0 aGlzLl9ob3N0Q29udGFpbmVySW5mbyxjb250ZXh0LHNlbGZEZWJ1Z0lEKTtyZXR1cm4gbmV4dENo aWxkcmVufSxtb3VudENoaWxkcmVuOmZ1bmN0aW9uKG5lc3RlZENoaWxkcmVuLHRyYW5zYWN0aW9u LGNvbnRleHQpe3ZhciBjaGlsZHJlbj10aGlzLl9yZWNvbmNpbGVySW5zdGFudGlhdGVDaGlsZHJl bihuZXN0ZWRDaGlsZHJlbix0cmFuc2FjdGlvbixjb250ZXh0KTt0aGlzLl9yZW5kZXJlZENoaWxk cmVuPWNoaWxkcmVuO3ZhciBtb3VudEltYWdlcz1bXTt2YXIgaW5kZXg9MDtmb3IodmFyIG5hbWUg aW4gY2hpbGRyZW4pe2lmKGNoaWxkcmVuLmhhc093blByb3BlcnR5KG5hbWUpKXt2YXIgY2hpbGQ9 Y2hpbGRyZW5bbmFtZV07dmFyIHNlbGZEZWJ1Z0lEPTA7aWYoImRldmVsb3BtZW50IiE9PSJwcm9k dWN0aW9uIil7c2VsZkRlYnVnSUQ9Z2V0RGVidWdJRCh0aGlzKX12YXIgbW91bnRJbWFnZT1SZWFj dFJlY29uY2lsZXIubW91bnRDb21wb25lbnQoY2hpbGQsdHJhbnNhY3Rpb24sdGhpcyx0aGlzLl9o b3N0Q29udGFpbmVySW5mbyxjb250ZXh0LHNlbGZEZWJ1Z0lEKTtjaGlsZC5fbW91bnRJbmRleD1p bmRleCsrO21vdW50SW1hZ2VzLnB1c2gobW91bnRJbWFnZSl9fWlmKCJkZXZlbG9wbWVudCIhPT0i cHJvZHVjdGlvbiIpe3NldENoaWxkcmVuRm9ySW5zdHJ1bWVudGF0aW9uLmNhbGwodGhpcyxjaGls ZHJlbil9cmV0dXJuIG1vdW50SW1hZ2VzfSx1cGRhdGVUZXh0Q29udGVudDpmdW5jdGlvbihuZXh0 Q29udGVudCl7dmFyIHByZXZDaGlsZHJlbj10aGlzLl9yZW5kZXJlZENoaWxkcmVuO1JlYWN0Q2hp bGRSZWNvbmNpbGVyLnVubW91bnRDaGlsZHJlbihwcmV2Q2hpbGRyZW4sZmFsc2UpO2Zvcih2YXIg bmFtZSBpbiBwcmV2Q2hpbGRyZW4pe2lmKHByZXZDaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShuYW1l KSl7IWZhbHNlPyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJ1 cGRhdGVUZXh0Q29udGVudCBjYWxsZWQgb24gbm9uLWVtcHR5IGNvbXBvbmVudC4iKTpfcHJvZElu dmFyaWFudCgiMTE4Iik6dm9pZCAwfX12YXIgdXBkYXRlcz1bbWFrZVRleHRDb250ZW50KG5leHRD b250ZW50KV07cHJvY2Vzc1F1ZXVlKHRoaXMsdXBkYXRlcyl9LHVwZGF0ZU1hcmt1cDpmdW5jdGlv bihuZXh0TWFya3VwKXt2YXIgcHJldkNoaWxkcmVuPXRoaXMuX3JlbmRlcmVkQ2hpbGRyZW47UmVh Y3RDaGlsZFJlY29uY2lsZXIudW5tb3VudENoaWxkcmVuKHByZXZDaGlsZHJlbixmYWxzZSk7Zm9y KHZhciBuYW1lIGluIHByZXZDaGlsZHJlbil7aWYocHJldkNoaWxkcmVuLmhhc093blByb3BlcnR5 KG5hbWUpKXshZmFsc2U/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFs c2UsInVwZGF0ZVRleHRDb250ZW50IGNhbGxlZCBvbiBub24tZW1wdHkgY29tcG9uZW50LiIpOl9w cm9kSW52YXJpYW50KCIxMTgiKTp2b2lkIDB9fXZhciB1cGRhdGVzPVttYWtlU2V0TWFya3VwKG5l eHRNYXJrdXApXTtwcm9jZXNzUXVldWUodGhpcyx1cGRhdGVzKX0sdXBkYXRlQ2hpbGRyZW46ZnVu Y3Rpb24obmV4dE5lc3RlZENoaWxkcmVuRWxlbWVudHMsdHJhbnNhY3Rpb24sY29udGV4dCl7dGhp cy5fdXBkYXRlQ2hpbGRyZW4obmV4dE5lc3RlZENoaWxkcmVuRWxlbWVudHMsdHJhbnNhY3Rpb24s Y29udGV4dCl9LF91cGRhdGVDaGlsZHJlbjpmdW5jdGlvbihuZXh0TmVzdGVkQ2hpbGRyZW5FbGVt ZW50cyx0cmFuc2FjdGlvbixjb250ZXh0KXt2YXIgcHJldkNoaWxkcmVuPXRoaXMuX3JlbmRlcmVk Q2hpbGRyZW47dmFyIHJlbW92ZWROb2Rlcz17fTt2YXIgbW91bnRJbWFnZXM9W107dmFyIG5leHRD aGlsZHJlbj10aGlzLl9yZWNvbmNpbGVyVXBkYXRlQ2hpbGRyZW4ocHJldkNoaWxkcmVuLG5leHRO ZXN0ZWRDaGlsZHJlbkVsZW1lbnRzLG1vdW50SW1hZ2VzLHJlbW92ZWROb2Rlcyx0cmFuc2FjdGlv bixjb250ZXh0KTtpZighbmV4dENoaWxkcmVuJiYhcHJldkNoaWxkcmVuKXtyZXR1cm59dmFyIHVw ZGF0ZXM9bnVsbDt2YXIgbmFtZTt2YXIgbmV4dEluZGV4PTA7dmFyIGxhc3RJbmRleD0wO3ZhciBu ZXh0TW91bnRJbmRleD0wO3ZhciBsYXN0UGxhY2VkTm9kZT1udWxsO2ZvcihuYW1lIGluIG5leHRD aGlsZHJlbil7aWYoIW5leHRDaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShuYW1lKSl7Y29udGludWV9 dmFyIHByZXZDaGlsZD1wcmV2Q2hpbGRyZW4mJnByZXZDaGlsZHJlbltuYW1lXTt2YXIgbmV4dENo aWxkPW5leHRDaGlsZHJlbltuYW1lXTtpZihwcmV2Q2hpbGQ9PT1uZXh0Q2hpbGQpe3VwZGF0ZXM9 ZW5xdWV1ZSh1cGRhdGVzLHRoaXMubW92ZUNoaWxkKHByZXZDaGlsZCxsYXN0UGxhY2VkTm9kZSxu ZXh0SW5kZXgsbGFzdEluZGV4KSk7bGFzdEluZGV4PU1hdGgubWF4KHByZXZDaGlsZC5fbW91bnRJ bmRleCxsYXN0SW5kZXgpO3ByZXZDaGlsZC5fbW91bnRJbmRleD1uZXh0SW5kZXh9ZWxzZXtpZihw cmV2Q2hpbGQpe2xhc3RJbmRleD1NYXRoLm1heChwcmV2Q2hpbGQuX21vdW50SW5kZXgsbGFzdElu ZGV4KX11cGRhdGVzPWVucXVldWUodXBkYXRlcyx0aGlzLl9tb3VudENoaWxkQXRJbmRleChuZXh0 Q2hpbGQsbW91bnRJbWFnZXNbbmV4dE1vdW50SW5kZXhdLGxhc3RQbGFjZWROb2RlLG5leHRJbmRl eCx0cmFuc2FjdGlvbixjb250ZXh0KSk7bmV4dE1vdW50SW5kZXgrK31uZXh0SW5kZXgrKztsYXN0 UGxhY2VkTm9kZT1SZWFjdFJlY29uY2lsZXIuZ2V0SG9zdE5vZGUobmV4dENoaWxkKX1mb3IobmFt ZSBpbiByZW1vdmVkTm9kZXMpe2lmKHJlbW92ZWROb2Rlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSl7 dXBkYXRlcz1lbnF1ZXVlKHVwZGF0ZXMsdGhpcy5fdW5tb3VudENoaWxkKHByZXZDaGlsZHJlbltu YW1lXSxyZW1vdmVkTm9kZXNbbmFtZV0pKX19aWYodXBkYXRlcyl7cHJvY2Vzc1F1ZXVlKHRoaXMs dXBkYXRlcyl9dGhpcy5fcmVuZGVyZWRDaGlsZHJlbj1uZXh0Q2hpbGRyZW47aWYoImRldmVsb3Bt ZW50IiE9PSJwcm9kdWN0aW9uIil7c2V0Q2hpbGRyZW5Gb3JJbnN0cnVtZW50YXRpb24uY2FsbCh0 aGlzLG5leHRDaGlsZHJlbil9fSx1bm1vdW50Q2hpbGRyZW46ZnVuY3Rpb24oc2FmZWx5KXt2YXIg cmVuZGVyZWRDaGlsZHJlbj10aGlzLl9yZW5kZXJlZENoaWxkcmVuO1JlYWN0Q2hpbGRSZWNvbmNp bGVyLnVubW91bnRDaGlsZHJlbihyZW5kZXJlZENoaWxkcmVuLHNhZmVseSk7dGhpcy5fcmVuZGVy ZWRDaGlsZHJlbj1udWxsfSxtb3ZlQ2hpbGQ6ZnVuY3Rpb24oY2hpbGQsYWZ0ZXJOb2RlLHRvSW5k ZXgsbGFzdEluZGV4KXtpZihjaGlsZC5fbW91bnRJbmRleDxsYXN0SW5kZXgpe3JldHVybiBtYWtl TW92ZShjaGlsZCxhZnRlck5vZGUsdG9JbmRleCl9fSxjcmVhdGVDaGlsZDpmdW5jdGlvbihjaGls ZCxhZnRlck5vZGUsbW91bnRJbWFnZSl7cmV0dXJuIG1ha2VJbnNlcnRNYXJrdXAobW91bnRJbWFn ZSxhZnRlck5vZGUsY2hpbGQuX21vdW50SW5kZXgpfSxyZW1vdmVDaGlsZDpmdW5jdGlvbihjaGls ZCxub2RlKXtyZXR1cm4gbWFrZVJlbW92ZShjaGlsZCxub2RlKX0sX21vdW50Q2hpbGRBdEluZGV4 OmZ1bmN0aW9uKGNoaWxkLG1vdW50SW1hZ2UsYWZ0ZXJOb2RlLGluZGV4LHRyYW5zYWN0aW9uLGNv bnRleHQpe2NoaWxkLl9tb3VudEluZGV4PWluZGV4O3JldHVybiB0aGlzLmNyZWF0ZUNoaWxkKGNo aWxkLGFmdGVyTm9kZSxtb3VudEltYWdlKX0sX3VubW91bnRDaGlsZDpmdW5jdGlvbihjaGlsZCxu b2RlKXt2YXIgdXBkYXRlPXRoaXMucmVtb3ZlQ2hpbGQoY2hpbGQsbm9kZSk7Y2hpbGQuX21vdW50 SW5kZXg9bnVsbDtyZXR1cm4gdXBkYXRlfX19O21vZHVsZS5leHBvcnRzPVJlYWN0TXVsdGlDaGls ZH0sezEwMToxMDEsMTE2OjExNiwxMjM6MTIzLDEzMjoxMzIsMTQwOjE0MCwyNjoyNiwyODoyOCw1 ODo1OCw1OTo1OSw2ODo2OH1dLDYzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsi dXNlIHN0cmljdCI7dmFyIF9wcm9kSW52YXJpYW50PV9kZXJlcV8oMTE2KTt2YXIgUmVhY3Q9X2Rl cmVxXygxMjQpO3ZhciBpbnZhcmlhbnQ9X2RlcmVxXygxNDApO3ZhciBSZWFjdE5vZGVUeXBlcz17 SE9TVDowLENPTVBPU0lURToxLEVNUFRZOjIsZ2V0VHlwZTpmdW5jdGlvbihub2RlKXtpZihub2Rl PT09bnVsbHx8bm9kZT09PWZhbHNlKXtyZXR1cm4gUmVhY3ROb2RlVHlwZXMuRU1QVFl9ZWxzZSBp ZihSZWFjdC5pc1ZhbGlkRWxlbWVudChub2RlKSl7aWYodHlwZW9mIG5vZGUudHlwZT09PSJmdW5j dGlvbiIpe3JldHVybiBSZWFjdE5vZGVUeXBlcy5DT01QT1NJVEV9ZWxzZXtyZXR1cm4gUmVhY3RO b2RlVHlwZXMuSE9TVH19IWZhbHNlPyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/aW52YXJp YW50KGZhbHNlLCJVbmV4cGVjdGVkIG5vZGU6ICVzIixub2RlKTpfcHJvZEludmFyaWFudCgiMjYi LG5vZGUpOnZvaWQgMH19O21vZHVsZS5leHBvcnRzPVJlYWN0Tm9kZVR5cGVzfSx7MTE2OjExNiwx MjQ6MTI0LDE0MDoxNDB9XSw2NDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVz ZSBzdHJpY3QiO3ZhciBfcHJvZEludmFyaWFudD1fZGVyZXFfKDExNik7dmFyIGludmFyaWFudD1f ZGVyZXFfKDE0MCk7ZnVuY3Rpb24gaXNWYWxpZE93bmVyKG9iamVjdCl7cmV0dXJuISEob2JqZWN0 JiZ0eXBlb2Ygb2JqZWN0LmF0dGFjaFJlZj09PSJmdW5jdGlvbiImJnR5cGVvZiBvYmplY3QuZGV0 YWNoUmVmPT09ImZ1bmN0aW9uIil9dmFyIFJlYWN0T3duZXI9e2FkZENvbXBvbmVudEFzUmVmVG86 ZnVuY3Rpb24oY29tcG9uZW50LHJlZixvd25lcil7IWlzVmFsaWRPd25lcihvd25lcik/ImRldmVs b3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsImFkZENvbXBvbmVudEFzUmVm VG8oLi4uKTogT25seSBhIFJlYWN0T3duZXIgY2FuIGhhdmUgcmVmcy4gWW91IG1pZ2h0IGJlIGFk ZGluZyBhIHJlZiB0byBhIGNvbXBvbmVudCB0aGF0IHdhcyBub3QgY3JlYXRlZCBpbnNpZGUgYSBj b21wb25lbnQncyBgcmVuZGVyYCBtZXRob2QsIG9yIHlvdSBoYXZlIG11bHRpcGxlIGNvcGllcyBv ZiBSZWFjdCBsb2FkZWQgKGRldGFpbHM6IGh0dHBzOi8vZmIubWUvcmVhY3QtcmVmcy1tdXN0LWhh dmUtb3duZXIpLiIpOl9wcm9kSW52YXJpYW50KCIxMTkiKTp2b2lkIDA7b3duZXIuYXR0YWNoUmVm KHJlZixjb21wb25lbnQpfSxyZW1vdmVDb21wb25lbnRBc1JlZkZyb206ZnVuY3Rpb24oY29tcG9u ZW50LHJlZixvd25lcil7IWlzVmFsaWRPd25lcihvd25lcik/ImRldmVsb3BtZW50IiE9PSJwcm9k dWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsInJlbW92ZUNvbXBvbmVudEFzUmVmRnJvbSguLi4pOiBP bmx5IGEgUmVhY3RPd25lciBjYW4gaGF2ZSByZWZzLiBZb3UgbWlnaHQgYmUgcmVtb3ZpbmcgYSBy ZWYgdG8gYSBjb21wb25lbnQgdGhhdCB3YXMgbm90IGNyZWF0ZWQgaW5zaWRlIGEgY29tcG9uZW50 J3MgYHJlbmRlcmAgbWV0aG9kLCBvciB5b3UgaGF2ZSBtdWx0aXBsZSBjb3BpZXMgb2YgUmVhY3Qg bG9hZGVkIChkZXRhaWxzOiBodHRwczovL2ZiLm1lL3JlYWN0LXJlZnMtbXVzdC1oYXZlLW93bmVy KS4iKTpfcHJvZEludmFyaWFudCgiMTIwIik6dm9pZCAwO3ZhciBvd25lclB1YmxpY0luc3RhbmNl PW93bmVyLmdldFB1YmxpY0luc3RhbmNlKCk7aWYob3duZXJQdWJsaWNJbnN0YW5jZSYmb3duZXJQ dWJsaWNJbnN0YW5jZS5yZWZzW3JlZl09PT1jb21wb25lbnQuZ2V0UHVibGljSW5zdGFuY2UoKSl7 b3duZXIuZGV0YWNoUmVmKHJlZil9fX07bW9kdWxlLmV4cG9ydHM9UmVhY3RPd25lcn0sezExNjox MTYsMTQwOjE0MH1dLDY1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0 cmljdCI7dmFyIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzPXt9O2lmKCJkZXZlbG9wbWVudCIh PT0icHJvZHVjdGlvbiIpe1JlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzPXtwcm9wOiJwcm9wIixj b250ZXh0OiJjb250ZXh0IixjaGlsZENvbnRleHQ6ImNoaWxkIGNvbnRleHQifX1tb2R1bGUuZXhw b3J0cz1SZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc30se31dLDY2OltmdW5jdGlvbihfZGVyZXFf LG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0PSJT RUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCI7bW9kdWxlLmV4cG9y dHM9UmVhY3RQcm9wVHlwZXNTZWNyZXR9LHt9XSw2NzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUs ZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBfYXNzaWduPV9kZXJlcV8oMTQ4KTt2YXIgQ2FsbGJh Y2tRdWV1ZT1fZGVyZXFfKDYpO3ZhciBQb29sZWRDbGFzcz1fZGVyZXFfKDI0KTt2YXIgUmVhY3RC cm93c2VyRXZlbnRFbWl0dGVyPV9kZXJlcV8oMjUpO3ZhciBSZWFjdElucHV0U2VsZWN0aW9uPV9k ZXJlcV8oNTcpO3ZhciBSZWFjdEluc3RydW1lbnRhdGlvbj1fZGVyZXFfKDU5KTt2YXIgVHJhbnNh Y3Rpb249X2RlcmVxXyg5Myk7dmFyIFJlYWN0VXBkYXRlUXVldWU9X2RlcmVxXyg3NCk7dmFyIFNF TEVDVElPTl9SRVNUT1JBVElPTj17aW5pdGlhbGl6ZTpSZWFjdElucHV0U2VsZWN0aW9uLmdldFNl bGVjdGlvbkluZm9ybWF0aW9uLGNsb3NlOlJlYWN0SW5wdXRTZWxlY3Rpb24ucmVzdG9yZVNlbGVj dGlvbn07dmFyIEVWRU5UX1NVUFBSRVNTSU9OPXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7dmFyIGN1 cnJlbnRseUVuYWJsZWQ9UmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLmlzRW5hYmxlZCgpO1JlYWN0 QnJvd3NlckV2ZW50RW1pdHRlci5zZXRFbmFibGVkKGZhbHNlKTtyZXR1cm4gY3VycmVudGx5RW5h YmxlZH0sY2xvc2U6ZnVuY3Rpb24ocHJldmlvdXNseUVuYWJsZWQpe1JlYWN0QnJvd3NlckV2ZW50 RW1pdHRlci5zZXRFbmFibGVkKHByZXZpb3VzbHlFbmFibGVkKX19O3ZhciBPTl9ET01fUkVBRFlf UVVFVUVJTkc9e2luaXRpYWxpemU6ZnVuY3Rpb24oKXt0aGlzLnJlYWN0TW91bnRSZWFkeS5yZXNl dCgpfSxjbG9zZTpmdW5jdGlvbigpe3RoaXMucmVhY3RNb3VudFJlYWR5Lm5vdGlmeUFsbCgpfX07 dmFyIFRSQU5TQUNUSU9OX1dSQVBQRVJTPVtTRUxFQ1RJT05fUkVTVE9SQVRJT04sRVZFTlRfU1VQ UFJFU1NJT04sT05fRE9NX1JFQURZX1FVRVVFSU5HXTtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1 Y3Rpb24iKXtUUkFOU0FDVElPTl9XUkFQUEVSUy5wdXNoKHtpbml0aWFsaXplOlJlYWN0SW5zdHJ1 bWVudGF0aW9uLmRlYnVnVG9vbC5vbkJlZ2luRmx1c2gsY2xvc2U6UmVhY3RJbnN0cnVtZW50YXRp b24uZGVidWdUb29sLm9uRW5kRmx1c2h9KX1mdW5jdGlvbiBSZWFjdFJlY29uY2lsZVRyYW5zYWN0 aW9uKHVzZUNyZWF0ZUVsZW1lbnQpe3RoaXMucmVpbml0aWFsaXplVHJhbnNhY3Rpb24oKTt0aGlz LnJlbmRlclRvU3RhdGljTWFya3VwPWZhbHNlO3RoaXMucmVhY3RNb3VudFJlYWR5PUNhbGxiYWNr UXVldWUuZ2V0UG9vbGVkKG51bGwpO3RoaXMudXNlQ3JlYXRlRWxlbWVudD11c2VDcmVhdGVFbGVt ZW50fXZhciBNaXhpbj17Z2V0VHJhbnNhY3Rpb25XcmFwcGVyczpmdW5jdGlvbigpe3JldHVybiBU UkFOU0FDVElPTl9XUkFQUEVSU30sZ2V0UmVhY3RNb3VudFJlYWR5OmZ1bmN0aW9uKCl7cmV0dXJu IHRoaXMucmVhY3RNb3VudFJlYWR5fSxnZXRVcGRhdGVRdWV1ZTpmdW5jdGlvbigpe3JldHVybiBS ZWFjdFVwZGF0ZVF1ZXVlfSxjaGVja3BvaW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhY3RN b3VudFJlYWR5LmNoZWNrcG9pbnQoKX0scm9sbGJhY2s6ZnVuY3Rpb24oY2hlY2twb2ludCl7dGhp cy5yZWFjdE1vdW50UmVhZHkucm9sbGJhY2soY2hlY2twb2ludCl9LGRlc3RydWN0b3I6ZnVuY3Rp b24oKXtDYWxsYmFja1F1ZXVlLnJlbGVhc2UodGhpcy5yZWFjdE1vdW50UmVhZHkpO3RoaXMucmVh Y3RNb3VudFJlYWR5PW51bGx9fTtfYXNzaWduKFJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24ucHJv dG90eXBlLFRyYW5zYWN0aW9uLE1peGluKTtQb29sZWRDbGFzcy5hZGRQb29saW5nVG8oUmVhY3RS ZWNvbmNpbGVUcmFuc2FjdGlvbik7bW9kdWxlLmV4cG9ydHM9UmVhY3RSZWNvbmNpbGVUcmFuc2Fj dGlvbn0sezE0ODoxNDgsMjQ6MjQsMjU6MjUsNTc6NTcsNTk6NTksNjo2LDc0Ojc0LDkzOjkzfV0s Njg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgUmVh Y3RSZWY9X2RlcmVxXyg2OSk7dmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uPV9kZXJlcV8oNTkpO3Zh ciB3YXJuaW5nPV9kZXJlcV8oMTQ3KTtmdW5jdGlvbiBhdHRhY2hSZWZzKCl7UmVhY3RSZWYuYXR0 YWNoUmVmcyh0aGlzLHRoaXMuX2N1cnJlbnRFbGVtZW50KX12YXIgUmVhY3RSZWNvbmNpbGVyPXtt b3VudENvbXBvbmVudDpmdW5jdGlvbihpbnRlcm5hbEluc3RhbmNlLHRyYW5zYWN0aW9uLGhvc3RQ YXJlbnQsaG9zdENvbnRhaW5lckluZm8sY29udGV4dCxwYXJlbnREZWJ1Z0lEKXtpZigiZGV2ZWxv cG1lbnQiIT09InByb2R1Y3Rpb24iKXtpZihpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEIT09MCl7 UmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uQmVmb3JlTW91bnRDb21wb25lbnQoaW50 ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCxpbnRlcm5hbEluc3RhbmNlLl9jdXJyZW50RWxlbWVudCxw YXJlbnREZWJ1Z0lEKX19dmFyIG1hcmt1cD1pbnRlcm5hbEluc3RhbmNlLm1vdW50Q29tcG9uZW50 KHRyYW5zYWN0aW9uLGhvc3RQYXJlbnQsaG9zdENvbnRhaW5lckluZm8sY29udGV4dCxwYXJlbnRE ZWJ1Z0lEKTtpZihpbnRlcm5hbEluc3RhbmNlLl9jdXJyZW50RWxlbWVudCYmaW50ZXJuYWxJbnN0 YW5jZS5fY3VycmVudEVsZW1lbnQucmVmIT1udWxsKXt0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50 UmVhZHkoKS5lbnF1ZXVlKGF0dGFjaFJlZnMsaW50ZXJuYWxJbnN0YW5jZSl9aWYoImRldmVsb3Bt ZW50IiE9PSJwcm9kdWN0aW9uIil7aWYoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCE9PTApe1Jl YWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbk1vdW50Q29tcG9uZW50KGludGVybmFsSW5z dGFuY2UuX2RlYnVnSUQpfX1yZXR1cm4gbWFya3VwfSxnZXRIb3N0Tm9kZTpmdW5jdGlvbihpbnRl cm5hbEluc3RhbmNlKXtyZXR1cm4gaW50ZXJuYWxJbnN0YW5jZS5nZXRIb3N0Tm9kZSgpfSx1bm1v dW50Q29tcG9uZW50OmZ1bmN0aW9uKGludGVybmFsSW5zdGFuY2Usc2FmZWx5KXtpZigiZGV2ZWxv cG1lbnQiIT09InByb2R1Y3Rpb24iKXtpZihpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEIT09MCl7 UmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uQmVmb3JlVW5tb3VudENvbXBvbmVudChp bnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEKX19UmVhY3RSZWYuZGV0YWNoUmVmcyhpbnRlcm5hbElu c3RhbmNlLGludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50KTtpbnRlcm5hbEluc3RhbmNl LnVubW91bnRDb21wb25lbnQoc2FmZWx5KTtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24i KXtpZihpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEIT09MCl7UmVhY3RJbnN0cnVtZW50YXRpb24u ZGVidWdUb29sLm9uVW5tb3VudENvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEKX19 fSxyZWNlaXZlQ29tcG9uZW50OmZ1bmN0aW9uKGludGVybmFsSW5zdGFuY2UsbmV4dEVsZW1lbnQs dHJhbnNhY3Rpb24sY29udGV4dCl7dmFyIHByZXZFbGVtZW50PWludGVybmFsSW5zdGFuY2UuX2N1 cnJlbnRFbGVtZW50O2lmKG5leHRFbGVtZW50PT09cHJldkVsZW1lbnQmJmNvbnRleHQ9PT1pbnRl cm5hbEluc3RhbmNlLl9jb250ZXh0KXtyZXR1cm59aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0 aW9uIil7aWYoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCE9PTApe1JlYWN0SW5zdHJ1bWVudGF0 aW9uLmRlYnVnVG9vbC5vbkJlZm9yZVVwZGF0ZUNvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9k ZWJ1Z0lELG5leHRFbGVtZW50KX19dmFyIHJlZnNDaGFuZ2VkPVJlYWN0UmVmLnNob3VsZFVwZGF0 ZVJlZnMocHJldkVsZW1lbnQsbmV4dEVsZW1lbnQpO2lmKHJlZnNDaGFuZ2VkKXtSZWFjdFJlZi5k ZXRhY2hSZWZzKGludGVybmFsSW5zdGFuY2UscHJldkVsZW1lbnQpfWludGVybmFsSW5zdGFuY2Uu cmVjZWl2ZUNvbXBvbmVudChuZXh0RWxlbWVudCx0cmFuc2FjdGlvbixjb250ZXh0KTtpZihyZWZz Q2hhbmdlZCYmaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQmJmludGVybmFsSW5zdGFu Y2UuX2N1cnJlbnRFbGVtZW50LnJlZiE9bnVsbCl7dHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJl YWR5KCkuZW5xdWV1ZShhdHRhY2hSZWZzLGludGVybmFsSW5zdGFuY2UpfWlmKCJkZXZlbG9wbWVu dCIhPT0icHJvZHVjdGlvbiIpe2lmKGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQhPT0wKXtSZWFj dEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25VcGRhdGVDb21wb25lbnQoaW50ZXJuYWxJbnN0 YW5jZS5fZGVidWdJRCl9fX0scGVyZm9ybVVwZGF0ZUlmTmVjZXNzYXJ5OmZ1bmN0aW9uKGludGVy bmFsSW5zdGFuY2UsdHJhbnNhY3Rpb24sdXBkYXRlQmF0Y2hOdW1iZXIpe2lmKGludGVybmFsSW5z dGFuY2UuX3VwZGF0ZUJhdGNoTnVtYmVyIT09dXBkYXRlQmF0Y2hOdW1iZXIpeyJkZXZlbG9wbWVu dCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyhpbnRlcm5hbEluc3RhbmNlLl91cGRhdGVCYXRjaE51 bWJlcj09bnVsbHx8aW50ZXJuYWxJbnN0YW5jZS5fdXBkYXRlQmF0Y2hOdW1iZXI9PT11cGRhdGVC YXRjaE51bWJlcisxLCJwZXJmb3JtVXBkYXRlSWZOZWNlc3Nhcnk6IFVuZXhwZWN0ZWQgYmF0Y2gg bnVtYmVyIChjdXJyZW50ICVzLCAiKyJwZW5kaW5nICVzKSIsdXBkYXRlQmF0Y2hOdW1iZXIsaW50 ZXJuYWxJbnN0YW5jZS5fdXBkYXRlQmF0Y2hOdW1iZXIpOnZvaWQgMDtyZXR1cm59aWYoImRldmVs b3BtZW50IiE9PSJwcm9kdWN0aW9uIil7aWYoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCE9PTAp e1JlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkJlZm9yZVVwZGF0ZUNvbXBvbmVudChp bnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lELGludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50 KX19aW50ZXJuYWxJbnN0YW5jZS5wZXJmb3JtVXBkYXRlSWZOZWNlc3NhcnkodHJhbnNhY3Rpb24p O2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe2lmKGludGVybmFsSW5zdGFuY2UuX2Rl YnVnSUQhPT0wKXtSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25VcGRhdGVDb21wb25l bnQoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCl9fX19O21vZHVsZS5leHBvcnRzPVJlYWN0UmVj b25jaWxlcn0sezE0NzoxNDcsNTk6NTksNjk6Njl9XSw2OTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1 bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBSZWFjdE93bmVyPV9kZXJlcV8oNjQpO3ZhciBS ZWFjdFJlZj17fTtmdW5jdGlvbiBhdHRhY2hSZWYocmVmLGNvbXBvbmVudCxvd25lcil7aWYodHlw ZW9mIHJlZj09PSJmdW5jdGlvbiIpe3JlZihjb21wb25lbnQuZ2V0UHVibGljSW5zdGFuY2UoKSl9 ZWxzZXtSZWFjdE93bmVyLmFkZENvbXBvbmVudEFzUmVmVG8oY29tcG9uZW50LHJlZixvd25lcil9 fWZ1bmN0aW9uIGRldGFjaFJlZihyZWYsY29tcG9uZW50LG93bmVyKXtpZih0eXBlb2YgcmVmPT09 ImZ1bmN0aW9uIil7cmVmKG51bGwpfWVsc2V7UmVhY3RPd25lci5yZW1vdmVDb21wb25lbnRBc1Jl ZkZyb20oY29tcG9uZW50LHJlZixvd25lcil9fVJlYWN0UmVmLmF0dGFjaFJlZnM9ZnVuY3Rpb24o aW5zdGFuY2UsZWxlbWVudCl7aWYoZWxlbWVudD09PW51bGx8fHR5cGVvZiBlbGVtZW50IT09Im9i amVjdCIpe3JldHVybn12YXIgcmVmPWVsZW1lbnQucmVmO2lmKHJlZiE9bnVsbCl7YXR0YWNoUmVm KHJlZixpbnN0YW5jZSxlbGVtZW50Ll9vd25lcil9fTtSZWFjdFJlZi5zaG91bGRVcGRhdGVSZWZz PWZ1bmN0aW9uKHByZXZFbGVtZW50LG5leHRFbGVtZW50KXt2YXIgcHJldlJlZj1udWxsO3ZhciBw cmV2T3duZXI9bnVsbDtpZihwcmV2RWxlbWVudCE9PW51bGwmJnR5cGVvZiBwcmV2RWxlbWVudD09 PSJvYmplY3QiKXtwcmV2UmVmPXByZXZFbGVtZW50LnJlZjtwcmV2T3duZXI9cHJldkVsZW1lbnQu X293bmVyfXZhciBuZXh0UmVmPW51bGw7dmFyIG5leHRPd25lcj1udWxsO2lmKG5leHRFbGVtZW50 IT09bnVsbCYmdHlwZW9mIG5leHRFbGVtZW50PT09Im9iamVjdCIpe25leHRSZWY9bmV4dEVsZW1l bnQucmVmO25leHRPd25lcj1uZXh0RWxlbWVudC5fb3duZXJ9cmV0dXJuIHByZXZSZWYhPT1uZXh0 UmVmfHx0eXBlb2YgbmV4dFJlZj09PSJzdHJpbmciJiZuZXh0T3duZXIhPT1wcmV2T3duZXJ9O1Jl YWN0UmVmLmRldGFjaFJlZnM9ZnVuY3Rpb24oaW5zdGFuY2UsZWxlbWVudCl7aWYoZWxlbWVudD09 PW51bGx8fHR5cGVvZiBlbGVtZW50IT09Im9iamVjdCIpe3JldHVybn12YXIgcmVmPWVsZW1lbnQu cmVmO2lmKHJlZiE9bnVsbCl7ZGV0YWNoUmVmKHJlZixpbnN0YW5jZSxlbGVtZW50Ll9vd25lcil9 fTttb2R1bGUuZXhwb3J0cz1SZWFjdFJlZn0sezY0OjY0fV0sNzA6W2Z1bmN0aW9uKF9kZXJlcV8s bW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgUmVhY3RTZXJ2ZXJCYXRjaGluZ1N0cmF0 ZWd5PXtpc0JhdGNoaW5nVXBkYXRlczpmYWxzZSxiYXRjaGVkVXBkYXRlczpmdW5jdGlvbihjYWxs YmFjayl7fX07bW9kdWxlLmV4cG9ydHM9UmVhY3RTZXJ2ZXJCYXRjaGluZ1N0cmF0ZWd5fSx7fV0s NzE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgX3By b2RJbnZhcmlhbnQ9X2RlcmVxXygxMTYpO3ZhciBSZWFjdD1fZGVyZXFfKDEyNCk7dmFyIFJlYWN0 RE9NQ29udGFpbmVySW5mbz1fZGVyZXFfKDMzKTt2YXIgUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJh dGVneT1fZGVyZXFfKDQ2KTt2YXIgUmVhY3RJbnN0cnVtZW50YXRpb249X2RlcmVxXyg1OSk7dmFy IFJlYWN0TWFya3VwQ2hlY2tzdW09X2RlcmVxXyg2MSk7dmFyIFJlYWN0UmVjb25jaWxlcj1fZGVy ZXFfKDY4KTt2YXIgUmVhY3RTZXJ2ZXJCYXRjaGluZ1N0cmF0ZWd5PV9kZXJlcV8oNzApO3ZhciBS ZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9uPV9kZXJlcV8oNzIpO3ZhciBSZWFjdFVwZGF0 ZXM9X2RlcmVxXyg3NSk7dmFyIGVtcHR5T2JqZWN0PV9kZXJlcV8oMTMzKTt2YXIgaW5zdGFudGlh dGVSZWFjdENvbXBvbmVudD1fZGVyZXFfKDExMik7dmFyIGludmFyaWFudD1fZGVyZXFfKDE0MCk7 dmFyIHBlbmRpbmdUcmFuc2FjdGlvbnM9MDtmdW5jdGlvbiByZW5kZXJUb1N0cmluZ0ltcGwoZWxl bWVudCxtYWtlU3RhdGljTWFya3VwKXt2YXIgdHJhbnNhY3Rpb247dHJ5e1JlYWN0VXBkYXRlcy5p bmplY3Rpb24uaW5qZWN0QmF0Y2hpbmdTdHJhdGVneShSZWFjdFNlcnZlckJhdGNoaW5nU3RyYXRl Z3kpO3RyYW5zYWN0aW9uPVJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb24uZ2V0UG9vbGVk KG1ha2VTdGF0aWNNYXJrdXApO3BlbmRpbmdUcmFuc2FjdGlvbnMrKztyZXR1cm4gdHJhbnNhY3Rp b24ucGVyZm9ybShmdW5jdGlvbigpe3ZhciBjb21wb25lbnRJbnN0YW5jZT1pbnN0YW50aWF0ZVJl YWN0Q29tcG9uZW50KGVsZW1lbnQsdHJ1ZSk7dmFyIG1hcmt1cD1SZWFjdFJlY29uY2lsZXIubW91 bnRDb21wb25lbnQoY29tcG9uZW50SW5zdGFuY2UsdHJhbnNhY3Rpb24sbnVsbCxSZWFjdERPTUNv bnRhaW5lckluZm8oKSxlbXB0eU9iamVjdCwwKTtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rp b24iKXtSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Vbm1vdW50Q29tcG9uZW50KGNv bXBvbmVudEluc3RhbmNlLl9kZWJ1Z0lEKX1pZighbWFrZVN0YXRpY01hcmt1cCl7bWFya3VwPVJl YWN0TWFya3VwQ2hlY2tzdW0uYWRkQ2hlY2tzdW1Ub01hcmt1cChtYXJrdXApfXJldHVybiBtYXJr dXB9LG51bGwpfWZpbmFsbHl7cGVuZGluZ1RyYW5zYWN0aW9ucy0tO1JlYWN0U2VydmVyUmVuZGVy aW5nVHJhbnNhY3Rpb24ucmVsZWFzZSh0cmFuc2FjdGlvbik7aWYoIXBlbmRpbmdUcmFuc2FjdGlv bnMpe1JlYWN0VXBkYXRlcy5pbmplY3Rpb24uaW5qZWN0QmF0Y2hpbmdTdHJhdGVneShSZWFjdERl ZmF1bHRCYXRjaGluZ1N0cmF0ZWd5KX19fWZ1bmN0aW9uIHJlbmRlclRvU3RyaW5nKGVsZW1lbnQp eyFSZWFjdC5pc1ZhbGlkRWxlbWVudChlbGVtZW50KT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rp b24iP2ludmFyaWFudChmYWxzZSwicmVuZGVyVG9TdHJpbmcoKTogWW91IG11c3QgcGFzcyBhIHZh bGlkIFJlYWN0RWxlbWVudC4iKTpfcHJvZEludmFyaWFudCgiNDYiKTp2b2lkIDA7cmV0dXJuIHJl bmRlclRvU3RyaW5nSW1wbChlbGVtZW50LGZhbHNlKX1mdW5jdGlvbiByZW5kZXJUb1N0YXRpY01h cmt1cChlbGVtZW50KXshUmVhY3QuaXNWYWxpZEVsZW1lbnQoZWxlbWVudCk/ImRldmVsb3BtZW50 IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsInJlbmRlclRvU3RhdGljTWFya3VwKCk6 IFlvdSBtdXN0IHBhc3MgYSB2YWxpZCBSZWFjdEVsZW1lbnQuIik6X3Byb2RJbnZhcmlhbnQoIjQ3 Iik6dm9pZCAwO3JldHVybiByZW5kZXJUb1N0cmluZ0ltcGwoZWxlbWVudCx0cnVlKX1tb2R1bGUu ZXhwb3J0cz17cmVuZGVyVG9TdHJpbmc6cmVuZGVyVG9TdHJpbmcscmVuZGVyVG9TdGF0aWNNYXJr dXA6cmVuZGVyVG9TdGF0aWNNYXJrdXB9fSx7MTEyOjExMiwxMTY6MTE2LDEyNDoxMjQsMTMzOjEz MywxNDA6MTQwLDMzOjMzLDQ2OjQ2LDU5OjU5LDYxOjYxLDY4OjY4LDcwOjcwLDcyOjcyLDc1Ojc1 fV0sNzI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIg X2Fzc2lnbj1fZGVyZXFfKDE0OCk7dmFyIFBvb2xlZENsYXNzPV9kZXJlcV8oMjQpO3ZhciBUcmFu c2FjdGlvbj1fZGVyZXFfKDkzKTt2YXIgUmVhY3RJbnN0cnVtZW50YXRpb249X2RlcmVxXyg1OSk7 dmFyIFJlYWN0U2VydmVyVXBkYXRlUXVldWU9X2RlcmVxXyg3Myk7dmFyIFRSQU5TQUNUSU9OX1dS QVBQRVJTPVtdO2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe1RSQU5TQUNUSU9OX1dS QVBQRVJTLnB1c2goe2luaXRpYWxpemU6UmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9u QmVnaW5GbHVzaCxjbG9zZTpSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25FbmRGbHVz aH0pfXZhciBub29wQ2FsbGJhY2tRdWV1ZT17ZW5xdWV1ZTpmdW5jdGlvbigpe319O2Z1bmN0aW9u IFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb24ocmVuZGVyVG9TdGF0aWNNYXJrdXApe3Ro aXMucmVpbml0aWFsaXplVHJhbnNhY3Rpb24oKTt0aGlzLnJlbmRlclRvU3RhdGljTWFya3VwPXJl bmRlclRvU3RhdGljTWFya3VwO3RoaXMudXNlQ3JlYXRlRWxlbWVudD1mYWxzZTt0aGlzLnVwZGF0 ZVF1ZXVlPW5ldyBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlKHRoaXMpfXZhciBNaXhpbj17Z2V0VHJh bnNhY3Rpb25XcmFwcGVyczpmdW5jdGlvbigpe3JldHVybiBUUkFOU0FDVElPTl9XUkFQUEVSU30s Z2V0UmVhY3RNb3VudFJlYWR5OmZ1bmN0aW9uKCl7cmV0dXJuIG5vb3BDYWxsYmFja1F1ZXVlfSxn ZXRVcGRhdGVRdWV1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVwZGF0ZVF1ZXVlfSxkZXN0cnVj dG9yOmZ1bmN0aW9uKCl7fSxjaGVja3BvaW50OmZ1bmN0aW9uKCl7fSxyb2xsYmFjazpmdW5jdGlv bigpe319O19hc3NpZ24oUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbi5wcm90b3R5cGUs VHJhbnNhY3Rpb24sTWl4aW4pO1Bvb2xlZENsYXNzLmFkZFBvb2xpbmdUbyhSZWFjdFNlcnZlclJl bmRlcmluZ1RyYW5zYWN0aW9uKTttb2R1bGUuZXhwb3J0cz1SZWFjdFNlcnZlclJlbmRlcmluZ1Ry YW5zYWN0aW9ufSx7MTQ4OjE0OCwyNDoyNCw1OTo1OSw3Mzo3Myw5Mzo5M31dLDczOltmdW5jdGlv bihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gX2NsYXNzQ2Fs bENoZWNrKGluc3RhbmNlLENvbnN0cnVjdG9yKXtpZighKGluc3RhbmNlIGluc3RhbmNlb2YgQ29u c3RydWN0b3IpKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEg ZnVuY3Rpb24iKX19dmFyIFJlYWN0VXBkYXRlUXVldWU9X2RlcmVxXyg3NCk7dmFyIHdhcm5pbmc9 X2RlcmVxXygxNDcpO2Z1bmN0aW9uIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLGNhbGxlck5hbWUp e2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe3ZhciBjb25zdHJ1Y3Rvcj1wdWJsaWNJ bnN0YW5jZS5jb25zdHJ1Y3RvcjsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmco ZmFsc2UsIiVzKC4uLik6IENhbiBvbmx5IHVwZGF0ZSBhIG1vdW50aW5nIGNvbXBvbmVudC4gIisi VGhpcyB1c3VhbGx5IG1lYW5zIHlvdSBjYWxsZWQgJXMoKSBvdXRzaWRlIGNvbXBvbmVudFdpbGxN b3VudCgpIG9uIHRoZSBzZXJ2ZXIuICIrIlRoaXMgaXMgYSBuby1vcC4gUGxlYXNlIGNoZWNrIHRo ZSBjb2RlIGZvciB0aGUgJXMgY29tcG9uZW50LiIsY2FsbGVyTmFtZSxjYWxsZXJOYW1lLGNvbnN0 cnVjdG9yJiYoY29uc3RydWN0b3IuZGlzcGxheU5hbWV8fGNvbnN0cnVjdG9yLm5hbWUpfHwiUmVh Y3RDbGFzcyIpOnZvaWQgMH19dmFyIFJlYWN0U2VydmVyVXBkYXRlUXVldWU9ZnVuY3Rpb24oKXtm dW5jdGlvbiBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlKHRyYW5zYWN0aW9uKXtfY2xhc3NDYWxsQ2hl Y2sodGhpcyxSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlKTt0aGlzLnRyYW5zYWN0aW9uPXRyYW5zYWN0 aW9ufVJlYWN0U2VydmVyVXBkYXRlUXVldWUucHJvdG90eXBlLmlzTW91bnRlZD1mdW5jdGlvbiBp c01vdW50ZWQocHVibGljSW5zdGFuY2Upe3JldHVybiBmYWxzZX07UmVhY3RTZXJ2ZXJVcGRhdGVR dWV1ZS5wcm90b3R5cGUuZW5xdWV1ZUNhbGxiYWNrPWZ1bmN0aW9uIGVucXVldWVDYWxsYmFjayhw dWJsaWNJbnN0YW5jZSxjYWxsYmFjayxjYWxsZXJOYW1lKXtpZih0aGlzLnRyYW5zYWN0aW9uLmlz SW5UcmFuc2FjdGlvbigpKXtSZWFjdFVwZGF0ZVF1ZXVlLmVucXVldWVDYWxsYmFjayhwdWJsaWNJ bnN0YW5jZSxjYWxsYmFjayxjYWxsZXJOYW1lKX19O1JlYWN0U2VydmVyVXBkYXRlUXVldWUucHJv dG90eXBlLmVucXVldWVGb3JjZVVwZGF0ZT1mdW5jdGlvbiBlbnF1ZXVlRm9yY2VVcGRhdGUocHVi bGljSW5zdGFuY2Upe2lmKHRoaXMudHJhbnNhY3Rpb24uaXNJblRyYW5zYWN0aW9uKCkpe1JlYWN0 VXBkYXRlUXVldWUuZW5xdWV1ZUZvcmNlVXBkYXRlKHB1YmxpY0luc3RhbmNlKX1lbHNle3dhcm5O b29wKHB1YmxpY0luc3RhbmNlLCJmb3JjZVVwZGF0ZSIpfX07UmVhY3RTZXJ2ZXJVcGRhdGVRdWV1 ZS5wcm90b3R5cGUuZW5xdWV1ZVJlcGxhY2VTdGF0ZT1mdW5jdGlvbiBlbnF1ZXVlUmVwbGFjZVN0 YXRlKHB1YmxpY0luc3RhbmNlLGNvbXBsZXRlU3RhdGUpe2lmKHRoaXMudHJhbnNhY3Rpb24uaXNJ blRyYW5zYWN0aW9uKCkpe1JlYWN0VXBkYXRlUXVldWUuZW5xdWV1ZVJlcGxhY2VTdGF0ZShwdWJs aWNJbnN0YW5jZSxjb21wbGV0ZVN0YXRlKX1lbHNle3dhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCJy ZXBsYWNlU3RhdGUiKX19O1JlYWN0U2VydmVyVXBkYXRlUXVldWUucHJvdG90eXBlLmVucXVldWVT ZXRTdGF0ZT1mdW5jdGlvbiBlbnF1ZXVlU2V0U3RhdGUocHVibGljSW5zdGFuY2UscGFydGlhbFN0 YXRlKXtpZih0aGlzLnRyYW5zYWN0aW9uLmlzSW5UcmFuc2FjdGlvbigpKXtSZWFjdFVwZGF0ZVF1 ZXVlLmVucXVldWVTZXRTdGF0ZShwdWJsaWNJbnN0YW5jZSxwYXJ0aWFsU3RhdGUpfWVsc2V7d2Fy bk5vb3AocHVibGljSW5zdGFuY2UsInNldFN0YXRlIil9fTtyZXR1cm4gUmVhY3RTZXJ2ZXJVcGRh dGVRdWV1ZX0oKTttb2R1bGUuZXhwb3J0cz1SZWFjdFNlcnZlclVwZGF0ZVF1ZXVlfSx7MTQ3OjE0 Nyw3NDo3NH1dLDc0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmlj dCI7dmFyIF9wcm9kSW52YXJpYW50PV9kZXJlcV8oMTE2KTt2YXIgUmVhY3RDdXJyZW50T3duZXI9 X2RlcmVxXygxMjMpO3ZhciBSZWFjdEluc3RhbmNlTWFwPV9kZXJlcV8oNTgpO3ZhciBSZWFjdElu c3RydW1lbnRhdGlvbj1fZGVyZXFfKDU5KTt2YXIgUmVhY3RVcGRhdGVzPV9kZXJlcV8oNzUpO3Zh ciBpbnZhcmlhbnQ9X2RlcmVxXygxNDApO3ZhciB3YXJuaW5nPV9kZXJlcV8oMTQ3KTtmdW5jdGlv biBlbnF1ZXVlVXBkYXRlKGludGVybmFsSW5zdGFuY2Upe1JlYWN0VXBkYXRlcy5lbnF1ZXVlVXBk YXRlKGludGVybmFsSW5zdGFuY2UpfWZ1bmN0aW9uIGZvcm1hdFVuZXhwZWN0ZWRBcmd1bWVudChh cmcpe3ZhciB0eXBlPXR5cGVvZiBhcmc7aWYodHlwZSE9PSJvYmplY3QiKXtyZXR1cm4gdHlwZX12 YXIgZGlzcGxheU5hbWU9YXJnLmNvbnN0cnVjdG9yJiZhcmcuY29uc3RydWN0b3IubmFtZXx8dHlw ZTt2YXIga2V5cz1PYmplY3Qua2V5cyhhcmcpO2lmKGtleXMubGVuZ3RoPjAmJmtleXMubGVuZ3Ro PDIwKXtyZXR1cm4gZGlzcGxheU5hbWUrIiAoa2V5czogIitrZXlzLmpvaW4oIiwgIikrIikifXJl dHVybiBkaXNwbGF5TmFtZX1mdW5jdGlvbiBnZXRJbnRlcm5hbEluc3RhbmNlUmVhZHlGb3JVcGRh dGUocHVibGljSW5zdGFuY2UsY2FsbGVyTmFtZSl7dmFyIGludGVybmFsSW5zdGFuY2U9UmVhY3RJ bnN0YW5jZU1hcC5nZXQocHVibGljSW5zdGFuY2UpO2lmKCFpbnRlcm5hbEluc3RhbmNlKXtpZigi ZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXt2YXIgY3Rvcj1wdWJsaWNJbnN0YW5jZS5jb25z dHJ1Y3RvcjsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmcoIWNhbGxlck5hbWUs IiVzKC4uLik6IENhbiBvbmx5IHVwZGF0ZSBhIG1vdW50ZWQgb3IgbW91bnRpbmcgY29tcG9uZW50 LiAiKyJUaGlzIHVzdWFsbHkgbWVhbnMgeW91IGNhbGxlZCAlcygpIG9uIGFuIHVubW91bnRlZCBj b21wb25lbnQuICIrIlRoaXMgaXMgYSBuby1vcC4gUGxlYXNlIGNoZWNrIHRoZSBjb2RlIGZvciB0 aGUgJXMgY29tcG9uZW50LiIsY2FsbGVyTmFtZSxjYWxsZXJOYW1lLGN0b3ImJihjdG9yLmRpc3Bs YXlOYW1lfHxjdG9yLm5hbWUpfHwiUmVhY3RDbGFzcyIpOnZvaWQgMH1yZXR1cm4gbnVsbH1pZigi ZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24i P3dhcm5pbmcoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudD09bnVsbCwiJXMoLi4uKTogQ2Fubm90 IHVwZGF0ZSBkdXJpbmcgYW4gZXhpc3Rpbmcgc3RhdGUgdHJhbnNpdGlvbiAoc3VjaCBhcyAiKyJ3 aXRoaW4gYHJlbmRlcmAgb3IgYW5vdGhlciBjb21wb25lbnQncyBjb25zdHJ1Y3RvcikuIFJlbmRl ciBtZXRob2RzICIrInNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRl OyBjb25zdHJ1Y3RvciAiKyJzaWRlLWVmZmVjdHMgYXJlIGFuIGFudGktcGF0dGVybiwgYnV0IGNh biBiZSBtb3ZlZCB0byAiKyJgY29tcG9uZW50V2lsbE1vdW50YC4iLGNhbGxlck5hbWUpOnZvaWQg MH1yZXR1cm4gaW50ZXJuYWxJbnN0YW5jZX12YXIgUmVhY3RVcGRhdGVRdWV1ZT17aXNNb3VudGVk OmZ1bmN0aW9uKHB1YmxpY0luc3RhbmNlKXtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24i KXt2YXIgb3duZXI9UmVhY3RDdXJyZW50T3duZXIuY3VycmVudDtpZihvd25lciE9PW51bGwpeyJk ZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyhvd25lci5fd2FybmVkQWJvdXRSZWZz SW5SZW5kZXIsIiVzIGlzIGFjY2Vzc2luZyBpc01vdW50ZWQgaW5zaWRlIGl0cyByZW5kZXIoKSBm dW5jdGlvbi4gIisicmVuZGVyKCkgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBh bmQgc3RhdGUuIEl0IHNob3VsZCAiKyJuZXZlciBhY2Nlc3Mgc29tZXRoaW5nIHRoYXQgcmVxdWly ZXMgc3RhbGUgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyAiKyJyZW5kZXIsIHN1Y2ggYXMgcmVmcy4g TW92ZSB0aGlzIGxvZ2ljIHRvIGNvbXBvbmVudERpZE1vdW50IGFuZCAiKyJjb21wb25lbnREaWRV cGRhdGUgaW5zdGVhZC4iLG93bmVyLmdldE5hbWUoKXx8IkEgY29tcG9uZW50Iik6dm9pZCAwO293 bmVyLl93YXJuZWRBYm91dFJlZnNJblJlbmRlcj10cnVlfX12YXIgaW50ZXJuYWxJbnN0YW5jZT1S ZWFjdEluc3RhbmNlTWFwLmdldChwdWJsaWNJbnN0YW5jZSk7aWYoaW50ZXJuYWxJbnN0YW5jZSl7 cmV0dXJuISFpbnRlcm5hbEluc3RhbmNlLl9yZW5kZXJlZENvbXBvbmVudH1lbHNle3JldHVybiBm YWxzZX19LGVucXVldWVDYWxsYmFjazpmdW5jdGlvbihwdWJsaWNJbnN0YW5jZSxjYWxsYmFjayxj YWxsZXJOYW1lKXtSZWFjdFVwZGF0ZVF1ZXVlLnZhbGlkYXRlQ2FsbGJhY2soY2FsbGJhY2ssY2Fs bGVyTmFtZSk7dmFyIGludGVybmFsSW5zdGFuY2U9Z2V0SW50ZXJuYWxJbnN0YW5jZVJlYWR5Rm9y VXBkYXRlKHB1YmxpY0luc3RhbmNlKTtpZighaW50ZXJuYWxJbnN0YW5jZSl7cmV0dXJuIG51bGx9 aWYoaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ0NhbGxiYWNrcyl7aW50ZXJuYWxJbnN0YW5jZS5f cGVuZGluZ0NhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKX1lbHNle2ludGVybmFsSW5zdGFuY2UuX3Bl bmRpbmdDYWxsYmFja3M9W2NhbGxiYWNrXX1lbnF1ZXVlVXBkYXRlKGludGVybmFsSW5zdGFuY2Up fSxlbnF1ZXVlQ2FsbGJhY2tJbnRlcm5hbDpmdW5jdGlvbihpbnRlcm5hbEluc3RhbmNlLGNhbGxi YWNrKXtpZihpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nQ2FsbGJhY2tzKXtpbnRlcm5hbEluc3Rh bmNlLl9wZW5kaW5nQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spfWVsc2V7aW50ZXJuYWxJbnN0YW5j ZS5fcGVuZGluZ0NhbGxiYWNrcz1bY2FsbGJhY2tdfWVucXVldWVVcGRhdGUoaW50ZXJuYWxJbnN0 YW5jZSl9LGVucXVldWVGb3JjZVVwZGF0ZTpmdW5jdGlvbihwdWJsaWNJbnN0YW5jZSl7dmFyIGlu dGVybmFsSW5zdGFuY2U9Z2V0SW50ZXJuYWxJbnN0YW5jZVJlYWR5Rm9yVXBkYXRlKHB1YmxpY0lu c3RhbmNlLCJmb3JjZVVwZGF0ZSIpO2lmKCFpbnRlcm5hbEluc3RhbmNlKXtyZXR1cm59aW50ZXJu YWxJbnN0YW5jZS5fcGVuZGluZ0ZvcmNlVXBkYXRlPXRydWU7ZW5xdWV1ZVVwZGF0ZShpbnRlcm5h bEluc3RhbmNlKX0sZW5xdWV1ZVJlcGxhY2VTdGF0ZTpmdW5jdGlvbihwdWJsaWNJbnN0YW5jZSxj b21wbGV0ZVN0YXRlKXt2YXIgaW50ZXJuYWxJbnN0YW5jZT1nZXRJbnRlcm5hbEluc3RhbmNlUmVh ZHlGb3JVcGRhdGUocHVibGljSW5zdGFuY2UsInJlcGxhY2VTdGF0ZSIpO2lmKCFpbnRlcm5hbElu c3RhbmNlKXtyZXR1cm59aW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ1N0YXRlUXVldWU9W2NvbXBs ZXRlU3RhdGVdO2ludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdSZXBsYWNlU3RhdGU9dHJ1ZTtlbnF1 ZXVlVXBkYXRlKGludGVybmFsSW5zdGFuY2UpfSxlbnF1ZXVlU2V0U3RhdGU6ZnVuY3Rpb24ocHVi bGljSW5zdGFuY2UscGFydGlhbFN0YXRlKXtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24i KXtSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25TZXRTdGF0ZSgpOyJkZXZlbG9wbWVu dCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyhwYXJ0aWFsU3RhdGUhPW51bGwsInNldFN0YXRlKC4u Lik6IFlvdSBwYXNzZWQgYW4gdW5kZWZpbmVkIG9yIG51bGwgc3RhdGUgb2JqZWN0OyAiKyJpbnN0 ZWFkLCB1c2UgZm9yY2VVcGRhdGUoKS4iKTp2b2lkIDB9dmFyIGludGVybmFsSW5zdGFuY2U9Z2V0 SW50ZXJuYWxJbnN0YW5jZVJlYWR5Rm9yVXBkYXRlKHB1YmxpY0luc3RhbmNlLCJzZXRTdGF0ZSIp O2lmKCFpbnRlcm5hbEluc3RhbmNlKXtyZXR1cm59dmFyIHF1ZXVlPWludGVybmFsSW5zdGFuY2Uu X3BlbmRpbmdTdGF0ZVF1ZXVlfHwoaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ1N0YXRlUXVldWU9 W10pO3F1ZXVlLnB1c2gocGFydGlhbFN0YXRlKTtlbnF1ZXVlVXBkYXRlKGludGVybmFsSW5zdGFu Y2UpfSxlbnF1ZXVlRWxlbWVudEludGVybmFsOmZ1bmN0aW9uKGludGVybmFsSW5zdGFuY2UsbmV4 dEVsZW1lbnQsbmV4dENvbnRleHQpe2ludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdFbGVtZW50PW5l eHRFbGVtZW50O2ludGVybmFsSW5zdGFuY2UuX2NvbnRleHQ9bmV4dENvbnRleHQ7ZW5xdWV1ZVVw ZGF0ZShpbnRlcm5hbEluc3RhbmNlKX0sdmFsaWRhdGVDYWxsYmFjazpmdW5jdGlvbihjYWxsYmFj ayxjYWxsZXJOYW1lKXshKCFjYWxsYmFja3x8dHlwZW9mIGNhbGxiYWNrPT09ImZ1bmN0aW9uIik/ ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsIiVzKC4uLik6IEV4 cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSBmdW5j dGlvbi4gSW5zdGVhZCByZWNlaXZlZDogJXMuIixjYWxsZXJOYW1lLGZvcm1hdFVuZXhwZWN0ZWRB cmd1bWVudChjYWxsYmFjaykpOl9wcm9kSW52YXJpYW50KCIxMjIiLGNhbGxlck5hbWUsZm9ybWF0 VW5leHBlY3RlZEFyZ3VtZW50KGNhbGxiYWNrKSk6dm9pZCAwfX07bW9kdWxlLmV4cG9ydHM9UmVh Y3RVcGRhdGVRdWV1ZX0sezExNjoxMTYsMTIzOjEyMywxNDA6MTQwLDE0NzoxNDcsNTg6NTgsNTk6 NTksNzU6NzV9XSw3NTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJp Y3QiO3ZhciBfcHJvZEludmFyaWFudD1fZGVyZXFfKDExNiksX2Fzc2lnbj1fZGVyZXFfKDE0OCk7 dmFyIENhbGxiYWNrUXVldWU9X2RlcmVxXyg2KTt2YXIgUG9vbGVkQ2xhc3M9X2RlcmVxXygyNCk7 dmFyIFJlYWN0RmVhdHVyZUZsYWdzPV9kZXJlcV8oNTMpO3ZhciBSZWFjdFJlY29uY2lsZXI9X2Rl cmVxXyg2OCk7dmFyIFRyYW5zYWN0aW9uPV9kZXJlcV8oOTMpO3ZhciBpbnZhcmlhbnQ9X2RlcmVx XygxNDApO3ZhciBkaXJ0eUNvbXBvbmVudHM9W107dmFyIHVwZGF0ZUJhdGNoTnVtYmVyPTA7dmFy IGFzYXBDYWxsYmFja1F1ZXVlPUNhbGxiYWNrUXVldWUuZ2V0UG9vbGVkKCk7dmFyIGFzYXBFbnF1 ZXVlZD1mYWxzZTt2YXIgYmF0Y2hpbmdTdHJhdGVneT1udWxsO2Z1bmN0aW9uIGVuc3VyZUluamVj dGVkKCl7IShSZWFjdFVwZGF0ZXMuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbiYmYmF0Y2hpbmdT dHJhdGVneSk/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsIlJl YWN0VXBkYXRlczogbXVzdCBpbmplY3QgYSByZWNvbmNpbGUgdHJhbnNhY3Rpb24gY2xhc3MgYW5k IGJhdGNoaW5nIHN0cmF0ZWd5Iik6X3Byb2RJbnZhcmlhbnQoIjEyMyIpOnZvaWQgMH12YXIgTkVT VEVEX1VQREFURVM9e2luaXRpYWxpemU6ZnVuY3Rpb24oKXt0aGlzLmRpcnR5Q29tcG9uZW50c0xl bmd0aD1kaXJ0eUNvbXBvbmVudHMubGVuZ3RofSxjbG9zZTpmdW5jdGlvbigpe2lmKHRoaXMuZGly dHlDb21wb25lbnRzTGVuZ3RoIT09ZGlydHlDb21wb25lbnRzLmxlbmd0aCl7ZGlydHlDb21wb25l bnRzLnNwbGljZSgwLHRoaXMuZGlydHlDb21wb25lbnRzTGVuZ3RoKTtmbHVzaEJhdGNoZWRVcGRh dGVzKCl9ZWxzZXtkaXJ0eUNvbXBvbmVudHMubGVuZ3RoPTB9fX07dmFyIFVQREFURV9RVUVVRUlO Rz17aW5pdGlhbGl6ZTpmdW5jdGlvbigpe3RoaXMuY2FsbGJhY2tRdWV1ZS5yZXNldCgpfSxjbG9z ZTpmdW5jdGlvbigpe3RoaXMuY2FsbGJhY2tRdWV1ZS5ub3RpZnlBbGwoKX19O3ZhciBUUkFOU0FD VElPTl9XUkFQUEVSUz1bTkVTVEVEX1VQREFURVMsVVBEQVRFX1FVRVVFSU5HXTtmdW5jdGlvbiBS ZWFjdFVwZGF0ZXNGbHVzaFRyYW5zYWN0aW9uKCl7dGhpcy5yZWluaXRpYWxpemVUcmFuc2FjdGlv bigpO3RoaXMuZGlydHlDb21wb25lbnRzTGVuZ3RoPW51bGw7dGhpcy5jYWxsYmFja1F1ZXVlPUNh bGxiYWNrUXVldWUuZ2V0UG9vbGVkKCk7dGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbj1SZWFjdFVw ZGF0ZXMuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbi5nZXRQb29sZWQodHJ1ZSl9X2Fzc2lnbihS ZWFjdFVwZGF0ZXNGbHVzaFRyYW5zYWN0aW9uLnByb3RvdHlwZSxUcmFuc2FjdGlvbix7Z2V0VHJh bnNhY3Rpb25XcmFwcGVyczpmdW5jdGlvbigpe3JldHVybiBUUkFOU0FDVElPTl9XUkFQUEVSU30s ZGVzdHJ1Y3RvcjpmdW5jdGlvbigpe3RoaXMuZGlydHlDb21wb25lbnRzTGVuZ3RoPW51bGw7Q2Fs bGJhY2tRdWV1ZS5yZWxlYXNlKHRoaXMuY2FsbGJhY2tRdWV1ZSk7dGhpcy5jYWxsYmFja1F1ZXVl PW51bGw7UmVhY3RVcGRhdGVzLlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24ucmVsZWFzZSh0aGlz LnJlY29uY2lsZVRyYW5zYWN0aW9uKTt0aGlzLnJlY29uY2lsZVRyYW5zYWN0aW9uPW51bGx9LHBl cmZvcm06ZnVuY3Rpb24obWV0aG9kLHNjb3BlLGEpe3JldHVybiBUcmFuc2FjdGlvbi5wZXJmb3Jt LmNhbGwodGhpcyx0aGlzLnJlY29uY2lsZVRyYW5zYWN0aW9uLnBlcmZvcm0sdGhpcy5yZWNvbmNp bGVUcmFuc2FjdGlvbixtZXRob2Qsc2NvcGUsYSl9fSk7UG9vbGVkQ2xhc3MuYWRkUG9vbGluZ1Rv KFJlYWN0VXBkYXRlc0ZsdXNoVHJhbnNhY3Rpb24pO2Z1bmN0aW9uIGJhdGNoZWRVcGRhdGVzKGNh bGxiYWNrLGEsYixjLGQsZSl7ZW5zdXJlSW5qZWN0ZWQoKTtyZXR1cm4gYmF0Y2hpbmdTdHJhdGVn eS5iYXRjaGVkVXBkYXRlcyhjYWxsYmFjayxhLGIsYyxkLGUpfWZ1bmN0aW9uIG1vdW50T3JkZXJD b21wYXJhdG9yKGMxLGMyKXtyZXR1cm4gYzEuX21vdW50T3JkZXItYzIuX21vdW50T3JkZXJ9ZnVu Y3Rpb24gcnVuQmF0Y2hlZFVwZGF0ZXModHJhbnNhY3Rpb24pe3ZhciBsZW49dHJhbnNhY3Rpb24u ZGlydHlDb21wb25lbnRzTGVuZ3RoOyEobGVuPT09ZGlydHlDb21wb25lbnRzLmxlbmd0aCk/ImRl dmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsIkV4cGVjdGVkIGZsdXNo IHRyYW5zYWN0aW9uJ3Mgc3RvcmVkIGRpcnR5LWNvbXBvbmVudHMgbGVuZ3RoICglcykgdG8gbWF0 Y2ggZGlydHktY29tcG9uZW50cyBhcnJheSBsZW5ndGggKCVzKS4iLGxlbixkaXJ0eUNvbXBvbmVu dHMubGVuZ3RoKTpfcHJvZEludmFyaWFudCgiMTI0IixsZW4sZGlydHlDb21wb25lbnRzLmxlbmd0 aCk6dm9pZCAwO2RpcnR5Q29tcG9uZW50cy5zb3J0KG1vdW50T3JkZXJDb21wYXJhdG9yKTt1cGRh dGVCYXRjaE51bWJlcisrO2Zvcih2YXIgaT0wO2k8bGVuO2krKyl7dmFyIGNvbXBvbmVudD1kaXJ0 eUNvbXBvbmVudHNbaV07dmFyIGNhbGxiYWNrcz1jb21wb25lbnQuX3BlbmRpbmdDYWxsYmFja3M7 Y29tcG9uZW50Ll9wZW5kaW5nQ2FsbGJhY2tzPW51bGw7dmFyIG1hcmtlck5hbWU7aWYoUmVhY3RG ZWF0dXJlRmxhZ3MubG9nVG9wTGV2ZWxSZW5kZXJzKXt2YXIgbmFtZWRDb21wb25lbnQ9Y29tcG9u ZW50O2lmKGNvbXBvbmVudC5fY3VycmVudEVsZW1lbnQudHlwZS5pc1JlYWN0VG9wTGV2ZWxXcmFw cGVyKXtuYW1lZENvbXBvbmVudD1jb21wb25lbnQuX3JlbmRlcmVkQ29tcG9uZW50fW1hcmtlck5h bWU9IlJlYWN0IHVwZGF0ZTogIituYW1lZENvbXBvbmVudC5nZXROYW1lKCk7Y29uc29sZS50aW1l KG1hcmtlck5hbWUpfVJlYWN0UmVjb25jaWxlci5wZXJmb3JtVXBkYXRlSWZOZWNlc3NhcnkoY29t cG9uZW50LHRyYW5zYWN0aW9uLnJlY29uY2lsZVRyYW5zYWN0aW9uLHVwZGF0ZUJhdGNoTnVtYmVy KTtpZihtYXJrZXJOYW1lKXtjb25zb2xlLnRpbWVFbmQobWFya2VyTmFtZSl9aWYoY2FsbGJhY2tz KXtmb3IodmFyIGo9MDtqPGNhbGxiYWNrcy5sZW5ndGg7aisrKXt0cmFuc2FjdGlvbi5jYWxsYmFj a1F1ZXVlLmVucXVldWUoY2FsbGJhY2tzW2pdLGNvbXBvbmVudC5nZXRQdWJsaWNJbnN0YW5jZSgp KX19fX12YXIgZmx1c2hCYXRjaGVkVXBkYXRlcz1mdW5jdGlvbigpe3doaWxlKGRpcnR5Q29tcG9u ZW50cy5sZW5ndGh8fGFzYXBFbnF1ZXVlZCl7aWYoZGlydHlDb21wb25lbnRzLmxlbmd0aCl7dmFy IHRyYW5zYWN0aW9uPVJlYWN0VXBkYXRlc0ZsdXNoVHJhbnNhY3Rpb24uZ2V0UG9vbGVkKCk7dHJh bnNhY3Rpb24ucGVyZm9ybShydW5CYXRjaGVkVXBkYXRlcyxudWxsLHRyYW5zYWN0aW9uKTtSZWFj dFVwZGF0ZXNGbHVzaFRyYW5zYWN0aW9uLnJlbGVhc2UodHJhbnNhY3Rpb24pfWlmKGFzYXBFbnF1 ZXVlZCl7YXNhcEVucXVldWVkPWZhbHNlO3ZhciBxdWV1ZT1hc2FwQ2FsbGJhY2tRdWV1ZTthc2Fw Q2FsbGJhY2tRdWV1ZT1DYWxsYmFja1F1ZXVlLmdldFBvb2xlZCgpO3F1ZXVlLm5vdGlmeUFsbCgp O0NhbGxiYWNrUXVldWUucmVsZWFzZShxdWV1ZSl9fX07ZnVuY3Rpb24gZW5xdWV1ZVVwZGF0ZShj b21wb25lbnQpe2Vuc3VyZUluamVjdGVkKCk7aWYoIWJhdGNoaW5nU3RyYXRlZ3kuaXNCYXRjaGlu Z1VwZGF0ZXMpe2JhdGNoaW5nU3RyYXRlZ3kuYmF0Y2hlZFVwZGF0ZXMoZW5xdWV1ZVVwZGF0ZSxj b21wb25lbnQpO3JldHVybn1kaXJ0eUNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO2lmKGNvbXBv bmVudC5fdXBkYXRlQmF0Y2hOdW1iZXI9PW51bGwpe2NvbXBvbmVudC5fdXBkYXRlQmF0Y2hOdW1i ZXI9dXBkYXRlQmF0Y2hOdW1iZXIrMX19ZnVuY3Rpb24gYXNhcChjYWxsYmFjayxjb250ZXh0KXsh YmF0Y2hpbmdTdHJhdGVneS5pc0JhdGNoaW5nVXBkYXRlcz8iZGV2ZWxvcG1lbnQiIT09InByb2R1 Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiUmVhY3RVcGRhdGVzLmFzYXA6IENhbid0IGVucXVldWUg YW4gYXNhcCBjYWxsYmFjayBpbiBhIGNvbnRleHQgd2hlcmV1cGRhdGVzIGFyZSBub3QgYmVpbmcg YmF0Y2hlZC4iKTpfcHJvZEludmFyaWFudCgiMTI1Iik6dm9pZCAwO2FzYXBDYWxsYmFja1F1ZXVl LmVucXVldWUoY2FsbGJhY2ssY29udGV4dCk7YXNhcEVucXVldWVkPXRydWV9dmFyIFJlYWN0VXBk YXRlc0luamVjdGlvbj17aW5qZWN0UmVjb25jaWxlVHJhbnNhY3Rpb246ZnVuY3Rpb24oUmVjb25j aWxlVHJhbnNhY3Rpb24peyFSZWNvbmNpbGVUcmFuc2FjdGlvbj8iZGV2ZWxvcG1lbnQiIT09InBy b2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiUmVhY3RVcGRhdGVzOiBtdXN0IHByb3ZpZGUgYSBy ZWNvbmNpbGUgdHJhbnNhY3Rpb24gY2xhc3MiKTpfcHJvZEludmFyaWFudCgiMTI2Iik6dm9pZCAw O1JlYWN0VXBkYXRlcy5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uPVJlY29uY2lsZVRyYW5zYWN0 aW9ufSxpbmplY3RCYXRjaGluZ1N0cmF0ZWd5OmZ1bmN0aW9uKF9iYXRjaGluZ1N0cmF0ZWd5KXsh X2JhdGNoaW5nU3RyYXRlZ3k/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQo ZmFsc2UsIlJlYWN0VXBkYXRlczogbXVzdCBwcm92aWRlIGEgYmF0Y2hpbmcgc3RyYXRlZ3kiKTpf cHJvZEludmFyaWFudCgiMTI3Iik6dm9pZCAwOyEodHlwZW9mIF9iYXRjaGluZ1N0cmF0ZWd5LmJh dGNoZWRVcGRhdGVzPT09ImZ1bmN0aW9uIik/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9p bnZhcmlhbnQoZmFsc2UsIlJlYWN0VXBkYXRlczogbXVzdCBwcm92aWRlIGEgYmF0Y2hlZFVwZGF0 ZXMoKSBmdW5jdGlvbiIpOl9wcm9kSW52YXJpYW50KCIxMjgiKTp2b2lkIDA7ISh0eXBlb2YgX2Jh dGNoaW5nU3RyYXRlZ3kuaXNCYXRjaGluZ1VwZGF0ZXM9PT0iYm9vbGVhbiIpPyJkZXZlbG9wbWVu dCIhPT0icHJvZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJSZWFjdFVwZGF0ZXM6IG11c3QgcHJv dmlkZSBhbiBpc0JhdGNoaW5nVXBkYXRlcyBib29sZWFuIGF0dHJpYnV0ZSIpOl9wcm9kSW52YXJp YW50KCIxMjkiKTp2b2lkIDA7YmF0Y2hpbmdTdHJhdGVneT1fYmF0Y2hpbmdTdHJhdGVneX19O3Zh ciBSZWFjdFVwZGF0ZXM9e1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb246bnVsbCxiYXRjaGVkVXBk YXRlczpiYXRjaGVkVXBkYXRlcyxlbnF1ZXVlVXBkYXRlOmVucXVldWVVcGRhdGUsZmx1c2hCYXRj aGVkVXBkYXRlczpmbHVzaEJhdGNoZWRVcGRhdGVzLGluamVjdGlvbjpSZWFjdFVwZGF0ZXNJbmpl Y3Rpb24sYXNhcDphc2FwfTttb2R1bGUuZXhwb3J0cz1SZWFjdFVwZGF0ZXN9LHsxMTY6MTE2LDE0 MDoxNDAsMTQ4OjE0OCwyNDoyNCw1Mzo1Myw2OjYsNjg6NjgsOTM6OTN9XSw3NjpbZnVuY3Rpb24o X2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO21vZHVsZS5leHBvcnRzPSIxNS40 LjIifSx7fV0sNzc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0 Ijt2YXIgTlM9e3hsaW5rOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIix4bWw6Imh0dHA6 Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSJ9O3ZhciBBVFRSUz17YWNjZW50SGVpZ2h0 OiJhY2NlbnQtaGVpZ2h0IixhY2N1bXVsYXRlOjAsYWRkaXRpdmU6MCxhbGlnbm1lbnRCYXNlbGlu ZToiYWxpZ25tZW50LWJhc2VsaW5lIixhbGxvd1Jlb3JkZXI6ImFsbG93UmVvcmRlciIsYWxwaGFi ZXRpYzowLGFtcGxpdHVkZTowLGFyYWJpY0Zvcm06ImFyYWJpYy1mb3JtIixhc2NlbnQ6MCxhdHRy aWJ1dGVOYW1lOiJhdHRyaWJ1dGVOYW1lIixhdHRyaWJ1dGVUeXBlOiJhdHRyaWJ1dGVUeXBlIixh dXRvUmV2ZXJzZToiYXV0b1JldmVyc2UiLGF6aW11dGg6MCxiYXNlRnJlcXVlbmN5OiJiYXNlRnJl cXVlbmN5IixiYXNlUHJvZmlsZToiYmFzZVByb2ZpbGUiLGJhc2VsaW5lU2hpZnQ6ImJhc2VsaW5l LXNoaWZ0IixiYm94OjAsYmVnaW46MCxiaWFzOjAsYnk6MCxjYWxjTW9kZToiY2FsY01vZGUiLGNh cEhlaWdodDoiY2FwLWhlaWdodCIsY2xpcDowLGNsaXBQYXRoOiJjbGlwLXBhdGgiLGNsaXBSdWxl OiJjbGlwLXJ1bGUiLGNsaXBQYXRoVW5pdHM6ImNsaXBQYXRoVW5pdHMiLGNvbG9ySW50ZXJwb2xh dGlvbjoiY29sb3ItaW50ZXJwb2xhdGlvbiIsY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVyczoiY29s b3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzIixjb2xvclByb2ZpbGU6ImNvbG9yLXByb2ZpbGUiLGNv bG9yUmVuZGVyaW5nOiJjb2xvci1yZW5kZXJpbmciLGNvbnRlbnRTY3JpcHRUeXBlOiJjb250ZW50 U2NyaXB0VHlwZSIsY29udGVudFN0eWxlVHlwZToiY29udGVudFN0eWxlVHlwZSIsY3Vyc29yOjAs Y3g6MCxjeTowLGQ6MCxkZWNlbGVyYXRlOjAsZGVzY2VudDowLGRpZmZ1c2VDb25zdGFudDoiZGlm ZnVzZUNvbnN0YW50IixkaXJlY3Rpb246MCxkaXNwbGF5OjAsZGl2aXNvcjowLGRvbWluYW50QmFz ZWxpbmU6ImRvbWluYW50LWJhc2VsaW5lIixkdXI6MCxkeDowLGR5OjAsZWRnZU1vZGU6ImVkZ2VN b2RlIixlbGV2YXRpb246MCxlbmFibGVCYWNrZ3JvdW5kOiJlbmFibGUtYmFja2dyb3VuZCIsZW5k OjAsZXhwb25lbnQ6MCxleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkOiJleHRlcm5hbFJlc291cmNl c1JlcXVpcmVkIixmaWxsOjAsZmlsbE9wYWNpdHk6ImZpbGwtb3BhY2l0eSIsZmlsbFJ1bGU6ImZp bGwtcnVsZSIsZmlsdGVyOjAsZmlsdGVyUmVzOiJmaWx0ZXJSZXMiLGZpbHRlclVuaXRzOiJmaWx0 ZXJVbml0cyIsZmxvb2RDb2xvcjoiZmxvb2QtY29sb3IiLGZsb29kT3BhY2l0eToiZmxvb2Qtb3Bh Y2l0eSIsZm9jdXNhYmxlOjAsZm9udEZhbWlseToiZm9udC1mYW1pbHkiLGZvbnRTaXplOiJmb250 LXNpemUiLGZvbnRTaXplQWRqdXN0OiJmb250LXNpemUtYWRqdXN0Iixmb250U3RyZXRjaDoiZm9u dC1zdHJldGNoIixmb250U3R5bGU6ImZvbnQtc3R5bGUiLGZvbnRWYXJpYW50OiJmb250LXZhcmlh bnQiLGZvbnRXZWlnaHQ6ImZvbnQtd2VpZ2h0Iixmb3JtYXQ6MCxmcm9tOjAsZng6MCxmeTowLGcx OjAsZzI6MCxnbHlwaE5hbWU6ImdseXBoLW5hbWUiLGdseXBoT3JpZW50YXRpb25Ib3Jpem9udGFs OiJnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIixnbHlwaE9yaWVudGF0aW9uVmVydGljYWw6 ImdseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsIixnbHlwaFJlZjoiZ2x5cGhSZWYiLGdyYWRpZW50 VHJhbnNmb3JtOiJncmFkaWVudFRyYW5zZm9ybSIsZ3JhZGllbnRVbml0czoiZ3JhZGllbnRVbml0 cyIsaGFuZ2luZzowLGhvcml6QWR2WDoiaG9yaXotYWR2LXgiLGhvcml6T3JpZ2luWDoiaG9yaXot b3JpZ2luLXgiLGlkZW9ncmFwaGljOjAsaW1hZ2VSZW5kZXJpbmc6ImltYWdlLXJlbmRlcmluZyIs aW46MCxpbjI6MCxpbnRlcmNlcHQ6MCxrOjAsazE6MCxrMjowLGszOjAsazQ6MCxrZXJuZWxNYXRy aXg6Imtlcm5lbE1hdHJpeCIsa2VybmVsVW5pdExlbmd0aDoia2VybmVsVW5pdExlbmd0aCIsa2Vy bmluZzowLGtleVBvaW50czoia2V5UG9pbnRzIixrZXlTcGxpbmVzOiJrZXlTcGxpbmVzIixrZXlU aW1lczoia2V5VGltZXMiLGxlbmd0aEFkanVzdDoibGVuZ3RoQWRqdXN0IixsZXR0ZXJTcGFjaW5n OiJsZXR0ZXItc3BhY2luZyIsbGlnaHRpbmdDb2xvcjoibGlnaHRpbmctY29sb3IiLGxpbWl0aW5n Q29uZUFuZ2xlOiJsaW1pdGluZ0NvbmVBbmdsZSIsbG9jYWw6MCxtYXJrZXJFbmQ6Im1hcmtlci1l bmQiLG1hcmtlck1pZDoibWFya2VyLW1pZCIsbWFya2VyU3RhcnQ6Im1hcmtlci1zdGFydCIsbWFy a2VySGVpZ2h0OiJtYXJrZXJIZWlnaHQiLG1hcmtlclVuaXRzOiJtYXJrZXJVbml0cyIsbWFya2Vy V2lkdGg6Im1hcmtlcldpZHRoIixtYXNrOjAsbWFza0NvbnRlbnRVbml0czoibWFza0NvbnRlbnRV bml0cyIsbWFza1VuaXRzOiJtYXNrVW5pdHMiLG1hdGhlbWF0aWNhbDowLG1vZGU6MCxudW1PY3Rh dmVzOiJudW1PY3RhdmVzIixvZmZzZXQ6MCxvcGFjaXR5OjAsb3BlcmF0b3I6MCxvcmRlcjowLG9y aWVudDowLG9yaWVudGF0aW9uOjAsb3JpZ2luOjAsb3ZlcmZsb3c6MCxvdmVybGluZVBvc2l0aW9u OiJvdmVybGluZS1wb3NpdGlvbiIsb3ZlcmxpbmVUaGlja25lc3M6Im92ZXJsaW5lLXRoaWNrbmVz cyIscGFpbnRPcmRlcjoicGFpbnQtb3JkZXIiLHBhbm9zZTE6InBhbm9zZS0xIixwYXRoTGVuZ3Ro OiJwYXRoTGVuZ3RoIixwYXR0ZXJuQ29udGVudFVuaXRzOiJwYXR0ZXJuQ29udGVudFVuaXRzIixw YXR0ZXJuVHJhbnNmb3JtOiJwYXR0ZXJuVHJhbnNmb3JtIixwYXR0ZXJuVW5pdHM6InBhdHRlcm5V bml0cyIscG9pbnRlckV2ZW50czoicG9pbnRlci1ldmVudHMiLHBvaW50czowLHBvaW50c0F0WDoi cG9pbnRzQXRYIixwb2ludHNBdFk6InBvaW50c0F0WSIscG9pbnRzQXRaOiJwb2ludHNBdFoiLHBy ZXNlcnZlQWxwaGE6InByZXNlcnZlQWxwaGEiLHByZXNlcnZlQXNwZWN0UmF0aW86InByZXNlcnZl QXNwZWN0UmF0aW8iLHByaW1pdGl2ZVVuaXRzOiJwcmltaXRpdmVVbml0cyIscjowLHJhZGl1czow LHJlZlg6InJlZlgiLHJlZlk6InJlZlkiLHJlbmRlcmluZ0ludGVudDoicmVuZGVyaW5nLWludGVu dCIscmVwZWF0Q291bnQ6InJlcGVhdENvdW50IixyZXBlYXREdXI6InJlcGVhdER1ciIscmVxdWly ZWRFeHRlbnNpb25zOiJyZXF1aXJlZEV4dGVuc2lvbnMiLHJlcXVpcmVkRmVhdHVyZXM6InJlcXVp cmVkRmVhdHVyZXMiLHJlc3RhcnQ6MCxyZXN1bHQ6MCxyb3RhdGU6MCxyeDowLHJ5OjAsc2NhbGU6 MCxzZWVkOjAsc2hhcGVSZW5kZXJpbmc6InNoYXBlLXJlbmRlcmluZyIsc2xvcGU6MCxzcGFjaW5n OjAsc3BlY3VsYXJDb25zdGFudDoic3BlY3VsYXJDb25zdGFudCIsc3BlY3VsYXJFeHBvbmVudDoi c3BlY3VsYXJFeHBvbmVudCIsc3BlZWQ6MCxzcHJlYWRNZXRob2Q6InNwcmVhZE1ldGhvZCIsc3Rh cnRPZmZzZXQ6InN0YXJ0T2Zmc2V0IixzdGREZXZpYXRpb246InN0ZERldmlhdGlvbiIsc3RlbWg6 MCxzdGVtdjowLHN0aXRjaFRpbGVzOiJzdGl0Y2hUaWxlcyIsc3RvcENvbG9yOiJzdG9wLWNvbG9y IixzdG9wT3BhY2l0eToic3RvcC1vcGFjaXR5IixzdHJpa2V0aHJvdWdoUG9zaXRpb246InN0cmlr ZXRocm91Z2gtcG9zaXRpb24iLHN0cmlrZXRocm91Z2hUaGlja25lc3M6InN0cmlrZXRocm91Z2gt dGhpY2tuZXNzIixzdHJpbmc6MCxzdHJva2U6MCxzdHJva2VEYXNoYXJyYXk6InN0cm9rZS1kYXNo YXJyYXkiLHN0cm9rZURhc2hvZmZzZXQ6InN0cm9rZS1kYXNob2Zmc2V0IixzdHJva2VMaW5lY2Fw OiJzdHJva2UtbGluZWNhcCIsc3Ryb2tlTGluZWpvaW46InN0cm9rZS1saW5lam9pbiIsc3Ryb2tl TWl0ZXJsaW1pdDoic3Ryb2tlLW1pdGVybGltaXQiLHN0cm9rZU9wYWNpdHk6InN0cm9rZS1vcGFj aXR5IixzdHJva2VXaWR0aDoic3Ryb2tlLXdpZHRoIixzdXJmYWNlU2NhbGU6InN1cmZhY2VTY2Fs ZSIsc3lzdGVtTGFuZ3VhZ2U6InN5c3RlbUxhbmd1YWdlIix0YWJsZVZhbHVlczoidGFibGVWYWx1 ZXMiLHRhcmdldFg6InRhcmdldFgiLHRhcmdldFk6InRhcmdldFkiLHRleHRBbmNob3I6InRleHQt YW5jaG9yIix0ZXh0RGVjb3JhdGlvbjoidGV4dC1kZWNvcmF0aW9uIix0ZXh0UmVuZGVyaW5nOiJ0 ZXh0LXJlbmRlcmluZyIsdGV4dExlbmd0aDoidGV4dExlbmd0aCIsdG86MCx0cmFuc2Zvcm06MCx1 MTowLHUyOjAsdW5kZXJsaW5lUG9zaXRpb246InVuZGVybGluZS1wb3NpdGlvbiIsdW5kZXJsaW5l VGhpY2tuZXNzOiJ1bmRlcmxpbmUtdGhpY2tuZXNzIix1bmljb2RlOjAsdW5pY29kZUJpZGk6InVu aWNvZGUtYmlkaSIsdW5pY29kZVJhbmdlOiJ1bmljb2RlLXJhbmdlIix1bml0c1BlckVtOiJ1bml0 cy1wZXItZW0iLHZBbHBoYWJldGljOiJ2LWFscGhhYmV0aWMiLHZIYW5naW5nOiJ2LWhhbmdpbmci LHZJZGVvZ3JhcGhpYzoidi1pZGVvZ3JhcGhpYyIsdk1hdGhlbWF0aWNhbDoidi1tYXRoZW1hdGlj YWwiLHZhbHVlczowLHZlY3RvckVmZmVjdDoidmVjdG9yLWVmZmVjdCIsdmVyc2lvbjowLHZlcnRB ZHZZOiJ2ZXJ0LWFkdi15Iix2ZXJ0T3JpZ2luWDoidmVydC1vcmlnaW4teCIsdmVydE9yaWdpblk6 InZlcnQtb3JpZ2luLXkiLHZpZXdCb3g6InZpZXdCb3giLHZpZXdUYXJnZXQ6InZpZXdUYXJnZXQi LHZpc2liaWxpdHk6MCx3aWR0aHM6MCx3b3JkU3BhY2luZzoid29yZC1zcGFjaW5nIix3cml0aW5n TW9kZToid3JpdGluZy1tb2RlIix4OjAseEhlaWdodDoieC1oZWlnaHQiLHgxOjAseDI6MCx4Q2hh bm5lbFNlbGVjdG9yOiJ4Q2hhbm5lbFNlbGVjdG9yIix4bGlua0FjdHVhdGU6InhsaW5rOmFjdHVh dGUiLHhsaW5rQXJjcm9sZToieGxpbms6YXJjcm9sZSIseGxpbmtIcmVmOiJ4bGluazpocmVmIix4 bGlua1JvbGU6InhsaW5rOnJvbGUiLHhsaW5rU2hvdzoieGxpbms6c2hvdyIseGxpbmtUaXRsZToi eGxpbms6dGl0bGUiLHhsaW5rVHlwZToieGxpbms6dHlwZSIseG1sQmFzZToieG1sOmJhc2UiLHht bG5zOjAseG1sbnNYbGluazoieG1sbnM6eGxpbmsiLHhtbExhbmc6InhtbDpsYW5nIix4bWxTcGFj ZToieG1sOnNwYWNlIix5OjAseTE6MCx5MjowLHlDaGFubmVsU2VsZWN0b3I6InlDaGFubmVsU2Vs ZWN0b3IiLHo6MCx6b29tQW5kUGFuOiJ6b29tQW5kUGFuIn07dmFyIFNWR0RPTVByb3BlcnR5Q29u ZmlnPXtQcm9wZXJ0aWVzOnt9LERPTUF0dHJpYnV0ZU5hbWVzcGFjZXM6e3hsaW5rQWN0dWF0ZTpO Uy54bGluayx4bGlua0FyY3JvbGU6TlMueGxpbmsseGxpbmtIcmVmOk5TLnhsaW5rLHhsaW5rUm9s ZTpOUy54bGluayx4bGlua1Nob3c6TlMueGxpbmsseGxpbmtUaXRsZTpOUy54bGluayx4bGlua1R5 cGU6TlMueGxpbmsseG1sQmFzZTpOUy54bWwseG1sTGFuZzpOUy54bWwseG1sU3BhY2U6TlMueG1s fSxET01BdHRyaWJ1dGVOYW1lczp7fX07T2JqZWN0LmtleXMoQVRUUlMpLmZvckVhY2goZnVuY3Rp b24oa2V5KXtTVkdET01Qcm9wZXJ0eUNvbmZpZy5Qcm9wZXJ0aWVzW2tleV09MDtpZihBVFRSU1tr ZXldKXtTVkdET01Qcm9wZXJ0eUNvbmZpZy5ET01BdHRyaWJ1dGVOYW1lc1trZXldPUFUVFJTW2tl eV19fSk7bW9kdWxlLmV4cG9ydHM9U1ZHRE9NUHJvcGVydHlDb25maWd9LHt9XSw3ODpbZnVuY3Rp b24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBFdmVudFByb3BhZ2F0 b3JzPV9kZXJlcV8oMTkpO3ZhciBFeGVjdXRpb25FbnZpcm9ubWVudD1fZGVyZXFfKDEyNik7dmFy IFJlYWN0RE9NQ29tcG9uZW50VHJlZT1fZGVyZXFfKDMyKTt2YXIgUmVhY3RJbnB1dFNlbGVjdGlv bj1fZGVyZXFfKDU3KTt2YXIgU3ludGhldGljRXZlbnQ9X2RlcmVxXyg4NCk7dmFyIGdldEFjdGl2 ZUVsZW1lbnQ9X2RlcmVxXygxMzUpO3ZhciBpc1RleHRJbnB1dEVsZW1lbnQ9X2RlcmVxXygxMTQp O3ZhciBzaGFsbG93RXF1YWw9X2RlcmVxXygxNDYpO3ZhciBza2lwU2VsZWN0aW9uQ2hhbmdlRXZl bnQ9RXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NJiYiZG9jdW1lbnRNb2RlImluIGRvY3Vt ZW50JiZkb2N1bWVudC5kb2N1bWVudE1vZGU8PTExO3ZhciBldmVudFR5cGVzPXtzZWxlY3Q6e3Bo YXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOiJvblNlbGVjdCIsY2FwdHVyZWQ6Im9uU2Vs ZWN0Q2FwdHVyZSJ9LGRlcGVuZGVuY2llczpbInRvcEJsdXIiLCJ0b3BDb250ZXh0TWVudSIsInRv cEZvY3VzIiwidG9wS2V5RG93biIsInRvcEtleVVwIiwidG9wTW91c2VEb3duIiwidG9wTW91c2VV cCIsInRvcFNlbGVjdGlvbkNoYW5nZSJdfX07dmFyIGFjdGl2ZUVsZW1lbnQ9bnVsbDt2YXIgYWN0 aXZlRWxlbWVudEluc3Q9bnVsbDt2YXIgbGFzdFNlbGVjdGlvbj1udWxsO3ZhciBtb3VzZURvd249 ZmFsc2U7dmFyIGhhc0xpc3RlbmVyPWZhbHNlO2Z1bmN0aW9uIGdldFNlbGVjdGlvbihub2RlKXtp Zigic2VsZWN0aW9uU3RhcnQiaW4gbm9kZSYmUmVhY3RJbnB1dFNlbGVjdGlvbi5oYXNTZWxlY3Rp b25DYXBhYmlsaXRpZXMobm9kZSkpe3JldHVybntzdGFydDpub2RlLnNlbGVjdGlvblN0YXJ0LGVu ZDpub2RlLnNlbGVjdGlvbkVuZH19ZWxzZSBpZih3aW5kb3cuZ2V0U2VsZWN0aW9uKXt2YXIgc2Vs ZWN0aW9uPXdpbmRvdy5nZXRTZWxlY3Rpb24oKTtyZXR1cm57YW5jaG9yTm9kZTpzZWxlY3Rpb24u YW5jaG9yTm9kZSxhbmNob3JPZmZzZXQ6c2VsZWN0aW9uLmFuY2hvck9mZnNldCxmb2N1c05vZGU6 c2VsZWN0aW9uLmZvY3VzTm9kZSxmb2N1c09mZnNldDpzZWxlY3Rpb24uZm9jdXNPZmZzZXR9fWVs c2UgaWYoZG9jdW1lbnQuc2VsZWN0aW9uKXt2YXIgcmFuZ2U9ZG9jdW1lbnQuc2VsZWN0aW9uLmNy ZWF0ZVJhbmdlKCk7cmV0dXJue3BhcmVudEVsZW1lbnQ6cmFuZ2UucGFyZW50RWxlbWVudCgpLHRl eHQ6cmFuZ2UudGV4dCx0b3A6cmFuZ2UuYm91bmRpbmdUb3AsbGVmdDpyYW5nZS5ib3VuZGluZ0xl ZnR9fX1mdW5jdGlvbiBjb25zdHJ1Y3RTZWxlY3RFdmVudChuYXRpdmVFdmVudCxuYXRpdmVFdmVu dFRhcmdldCl7aWYobW91c2VEb3dufHxhY3RpdmVFbGVtZW50PT1udWxsfHxhY3RpdmVFbGVtZW50 IT09Z2V0QWN0aXZlRWxlbWVudCgpKXtyZXR1cm4gbnVsbH12YXIgY3VycmVudFNlbGVjdGlvbj1n ZXRTZWxlY3Rpb24oYWN0aXZlRWxlbWVudCk7aWYoIWxhc3RTZWxlY3Rpb258fCFzaGFsbG93RXF1 YWwobGFzdFNlbGVjdGlvbixjdXJyZW50U2VsZWN0aW9uKSl7bGFzdFNlbGVjdGlvbj1jdXJyZW50 U2VsZWN0aW9uO3ZhciBzeW50aGV0aWNFdmVudD1TeW50aGV0aWNFdmVudC5nZXRQb29sZWQoZXZl bnRUeXBlcy5zZWxlY3QsYWN0aXZlRWxlbWVudEluc3QsbmF0aXZlRXZlbnQsbmF0aXZlRXZlbnRU YXJnZXQpO3N5bnRoZXRpY0V2ZW50LnR5cGU9InNlbGVjdCI7c3ludGhldGljRXZlbnQudGFyZ2V0 PWFjdGl2ZUVsZW1lbnQ7RXZlbnRQcm9wYWdhdG9ycy5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRj aGVzKHN5bnRoZXRpY0V2ZW50KTtyZXR1cm4gc3ludGhldGljRXZlbnR9cmV0dXJuIG51bGx9dmFy IFNlbGVjdEV2ZW50UGx1Z2luPXtldmVudFR5cGVzOmV2ZW50VHlwZXMsZXh0cmFjdEV2ZW50czpm dW5jdGlvbih0b3BMZXZlbFR5cGUsdGFyZ2V0SW5zdCxuYXRpdmVFdmVudCxuYXRpdmVFdmVudFRh cmdldCl7aWYoIWhhc0xpc3RlbmVyKXtyZXR1cm4gbnVsbH12YXIgdGFyZ2V0Tm9kZT10YXJnZXRJ bnN0P1JlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3Qp OndpbmRvdztzd2l0Y2godG9wTGV2ZWxUeXBlKXtjYXNlInRvcEZvY3VzIjppZihpc1RleHRJbnB1 dEVsZW1lbnQodGFyZ2V0Tm9kZSl8fHRhcmdldE5vZGUuY29udGVudEVkaXRhYmxlPT09InRydWUi KXthY3RpdmVFbGVtZW50PXRhcmdldE5vZGU7YWN0aXZlRWxlbWVudEluc3Q9dGFyZ2V0SW5zdDts YXN0U2VsZWN0aW9uPW51bGx9YnJlYWs7Y2FzZSJ0b3BCbHVyIjphY3RpdmVFbGVtZW50PW51bGw7 YWN0aXZlRWxlbWVudEluc3Q9bnVsbDtsYXN0U2VsZWN0aW9uPW51bGw7YnJlYWs7Y2FzZSJ0b3BN b3VzZURvd24iOm1vdXNlRG93bj10cnVlO2JyZWFrO2Nhc2UidG9wQ29udGV4dE1lbnUiOmNhc2Ui dG9wTW91c2VVcCI6bW91c2VEb3duPWZhbHNlO3JldHVybiBjb25zdHJ1Y3RTZWxlY3RFdmVudChu YXRpdmVFdmVudCxuYXRpdmVFdmVudFRhcmdldCk7Y2FzZSJ0b3BTZWxlY3Rpb25DaGFuZ2UiOmlm KHNraXBTZWxlY3Rpb25DaGFuZ2VFdmVudCl7YnJlYWt9Y2FzZSJ0b3BLZXlEb3duIjpjYXNlInRv cEtleVVwIjpyZXR1cm4gY29uc3RydWN0U2VsZWN0RXZlbnQobmF0aXZlRXZlbnQsbmF0aXZlRXZl bnRUYXJnZXQpfXJldHVybiBudWxsfSxkaWRQdXRMaXN0ZW5lcjpmdW5jdGlvbihpbnN0LHJlZ2lz dHJhdGlvbk5hbWUsbGlzdGVuZXIpe2lmKHJlZ2lzdHJhdGlvbk5hbWU9PT0ib25TZWxlY3QiKXto YXNMaXN0ZW5lcj10cnVlfX19O21vZHVsZS5leHBvcnRzPVNlbGVjdEV2ZW50UGx1Z2lufSx7MTE0 OjExNCwxMjY6MTI2LDEzNToxMzUsMTQ2OjE0NiwxOToxOSwzMjozMiw1Nzo1Nyw4NDo4NH1dLDc5 OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIF9wcm9k SW52YXJpYW50PV9kZXJlcV8oMTE2KTt2YXIgRXZlbnRMaXN0ZW5lcj1fZGVyZXFfKDEyNSk7dmFy IEV2ZW50UHJvcGFnYXRvcnM9X2RlcmVxXygxOSk7dmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZT1f ZGVyZXFfKDMyKTt2YXIgU3ludGhldGljQW5pbWF0aW9uRXZlbnQ9X2RlcmVxXyg4MCk7dmFyIFN5 bnRoZXRpY0NsaXBib2FyZEV2ZW50PV9kZXJlcV8oODEpO3ZhciBTeW50aGV0aWNFdmVudD1fZGVy ZXFfKDg0KTt2YXIgU3ludGhldGljRm9jdXNFdmVudD1fZGVyZXFfKDg1KTt2YXIgU3ludGhldGlj S2V5Ym9hcmRFdmVudD1fZGVyZXFfKDg3KTt2YXIgU3ludGhldGljTW91c2VFdmVudD1fZGVyZXFf KDg4KTt2YXIgU3ludGhldGljRHJhZ0V2ZW50PV9kZXJlcV8oODMpO3ZhciBTeW50aGV0aWNUb3Vj aEV2ZW50PV9kZXJlcV8oODkpO3ZhciBTeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQ9X2RlcmVxXyg5 MCk7dmFyIFN5bnRoZXRpY1VJRXZlbnQ9X2RlcmVxXyg5MSk7dmFyIFN5bnRoZXRpY1doZWVsRXZl bnQ9X2RlcmVxXyg5Mik7dmFyIGVtcHR5RnVuY3Rpb249X2RlcmVxXygxMzIpO3ZhciBnZXRFdmVu dENoYXJDb2RlPV9kZXJlcV8oMTAzKTt2YXIgaW52YXJpYW50PV9kZXJlcV8oMTQwKTt2YXIgZXZl bnRUeXBlcz17fTt2YXIgdG9wTGV2ZWxFdmVudHNUb0Rpc3BhdGNoQ29uZmlnPXt9O1siYWJvcnQi LCJhbmltYXRpb25FbmQiLCJhbmltYXRpb25JdGVyYXRpb24iLCJhbmltYXRpb25TdGFydCIsImJs dXIiLCJjYW5QbGF5IiwiY2FuUGxheVRocm91Z2giLCJjbGljayIsImNvbnRleHRNZW51IiwiY29w eSIsImN1dCIsImRvdWJsZUNsaWNrIiwiZHJhZyIsImRyYWdFbmQiLCJkcmFnRW50ZXIiLCJkcmFn RXhpdCIsImRyYWdMZWF2ZSIsImRyYWdPdmVyIiwiZHJhZ1N0YXJ0IiwiZHJvcCIsImR1cmF0aW9u Q2hhbmdlIiwiZW1wdGllZCIsImVuY3J5cHRlZCIsImVuZGVkIiwiZXJyb3IiLCJmb2N1cyIsImlu cHV0IiwiaW52YWxpZCIsImtleURvd24iLCJrZXlQcmVzcyIsImtleVVwIiwibG9hZCIsImxvYWRl ZERhdGEiLCJsb2FkZWRNZXRhZGF0YSIsImxvYWRTdGFydCIsIm1vdXNlRG93biIsIm1vdXNlTW92 ZSIsIm1vdXNlT3V0IiwibW91c2VPdmVyIiwibW91c2VVcCIsInBhc3RlIiwicGF1c2UiLCJwbGF5 IiwicGxheWluZyIsInByb2dyZXNzIiwicmF0ZUNoYW5nZSIsInJlc2V0Iiwic2Nyb2xsIiwic2Vl a2VkIiwic2Vla2luZyIsInN0YWxsZWQiLCJzdWJtaXQiLCJzdXNwZW5kIiwidGltZVVwZGF0ZSIs InRvdWNoQ2FuY2VsIiwidG91Y2hFbmQiLCJ0b3VjaE1vdmUiLCJ0b3VjaFN0YXJ0IiwidHJhbnNp dGlvbkVuZCIsInZvbHVtZUNoYW5nZSIsIndhaXRpbmciLCJ3aGVlbCJdLmZvckVhY2goZnVuY3Rp b24oZXZlbnQpe3ZhciBjYXBpdGFsaXplZEV2ZW50PWV2ZW50WzBdLnRvVXBwZXJDYXNlKCkrZXZl bnQuc2xpY2UoMSk7dmFyIG9uRXZlbnQ9Im9uIitjYXBpdGFsaXplZEV2ZW50O3ZhciB0b3BFdmVu dD0idG9wIitjYXBpdGFsaXplZEV2ZW50O3ZhciB0eXBlPXtwaGFzZWRSZWdpc3RyYXRpb25OYW1l czp7YnViYmxlZDpvbkV2ZW50LGNhcHR1cmVkOm9uRXZlbnQrIkNhcHR1cmUifSxkZXBlbmRlbmNp ZXM6W3RvcEV2ZW50XX07ZXZlbnRUeXBlc1tldmVudF09dHlwZTt0b3BMZXZlbEV2ZW50c1RvRGlz cGF0Y2hDb25maWdbdG9wRXZlbnRdPXR5cGV9KTt2YXIgb25DbGlja0xpc3RlbmVycz17fTtmdW5j dGlvbiBnZXREaWN0aW9uYXJ5S2V5KGluc3Qpe3JldHVybiIuIitpbnN0Ll9yb290Tm9kZUlEfWZ1 bmN0aW9uIGlzSW50ZXJhY3RpdmUodGFnKXtyZXR1cm4gdGFnPT09ImJ1dHRvbiJ8fHRhZz09PSJp bnB1dCJ8fHRhZz09PSJzZWxlY3QifHx0YWc9PT0idGV4dGFyZWEifXZhciBTaW1wbGVFdmVudFBs dWdpbj17ZXZlbnRUeXBlczpldmVudFR5cGVzLGV4dHJhY3RFdmVudHM6ZnVuY3Rpb24odG9wTGV2 ZWxUeXBlLHRhcmdldEluc3QsbmF0aXZlRXZlbnQsbmF0aXZlRXZlbnRUYXJnZXQpe3ZhciBkaXNw YXRjaENvbmZpZz10b3BMZXZlbEV2ZW50c1RvRGlzcGF0Y2hDb25maWdbdG9wTGV2ZWxUeXBlXTtp ZighZGlzcGF0Y2hDb25maWcpe3JldHVybiBudWxsfXZhciBFdmVudENvbnN0cnVjdG9yO3N3aXRj aCh0b3BMZXZlbFR5cGUpe2Nhc2UidG9wQWJvcnQiOmNhc2UidG9wQ2FuUGxheSI6Y2FzZSJ0b3BD YW5QbGF5VGhyb3VnaCI6Y2FzZSJ0b3BEdXJhdGlvbkNoYW5nZSI6Y2FzZSJ0b3BFbXB0aWVkIjpj YXNlInRvcEVuY3J5cHRlZCI6Y2FzZSJ0b3BFbmRlZCI6Y2FzZSJ0b3BFcnJvciI6Y2FzZSJ0b3BJ bnB1dCI6Y2FzZSJ0b3BJbnZhbGlkIjpjYXNlInRvcExvYWQiOmNhc2UidG9wTG9hZGVkRGF0YSI6 Y2FzZSJ0b3BMb2FkZWRNZXRhZGF0YSI6Y2FzZSJ0b3BMb2FkU3RhcnQiOmNhc2UidG9wUGF1c2Ui OmNhc2UidG9wUGxheSI6Y2FzZSJ0b3BQbGF5aW5nIjpjYXNlInRvcFByb2dyZXNzIjpjYXNlInRv cFJhdGVDaGFuZ2UiOmNhc2UidG9wUmVzZXQiOmNhc2UidG9wU2Vla2VkIjpjYXNlInRvcFNlZWtp bmciOmNhc2UidG9wU3RhbGxlZCI6Y2FzZSJ0b3BTdWJtaXQiOmNhc2UidG9wU3VzcGVuZCI6Y2Fz ZSJ0b3BUaW1lVXBkYXRlIjpjYXNlInRvcFZvbHVtZUNoYW5nZSI6Y2FzZSJ0b3BXYWl0aW5nIjpF dmVudENvbnN0cnVjdG9yPVN5bnRoZXRpY0V2ZW50O2JyZWFrO2Nhc2UidG9wS2V5UHJlc3MiOmlm KGdldEV2ZW50Q2hhckNvZGUobmF0aXZlRXZlbnQpPT09MCl7cmV0dXJuIG51bGx9Y2FzZSJ0b3BL ZXlEb3duIjpjYXNlInRvcEtleVVwIjpFdmVudENvbnN0cnVjdG9yPVN5bnRoZXRpY0tleWJvYXJk RXZlbnQ7YnJlYWs7Y2FzZSJ0b3BCbHVyIjpjYXNlInRvcEZvY3VzIjpFdmVudENvbnN0cnVjdG9y PVN5bnRoZXRpY0ZvY3VzRXZlbnQ7YnJlYWs7Y2FzZSJ0b3BDbGljayI6aWYobmF0aXZlRXZlbnQu YnV0dG9uPT09Mil7cmV0dXJuIG51bGx9Y2FzZSJ0b3BEb3VibGVDbGljayI6Y2FzZSJ0b3BNb3Vz ZURvd24iOmNhc2UidG9wTW91c2VNb3ZlIjpjYXNlInRvcE1vdXNlVXAiOmNhc2UidG9wTW91c2VP dXQiOmNhc2UidG9wTW91c2VPdmVyIjpjYXNlInRvcENvbnRleHRNZW51IjpFdmVudENvbnN0cnVj dG9yPVN5bnRoZXRpY01vdXNlRXZlbnQ7YnJlYWs7Y2FzZSJ0b3BEcmFnIjpjYXNlInRvcERyYWdF bmQiOmNhc2UidG9wRHJhZ0VudGVyIjpjYXNlInRvcERyYWdFeGl0IjpjYXNlInRvcERyYWdMZWF2 ZSI6Y2FzZSJ0b3BEcmFnT3ZlciI6Y2FzZSJ0b3BEcmFnU3RhcnQiOmNhc2UidG9wRHJvcCI6RXZl bnRDb25zdHJ1Y3Rvcj1TeW50aGV0aWNEcmFnRXZlbnQ7YnJlYWs7Y2FzZSJ0b3BUb3VjaENhbmNl bCI6Y2FzZSJ0b3BUb3VjaEVuZCI6Y2FzZSJ0b3BUb3VjaE1vdmUiOmNhc2UidG9wVG91Y2hTdGFy dCI6RXZlbnRDb25zdHJ1Y3Rvcj1TeW50aGV0aWNUb3VjaEV2ZW50O2JyZWFrO2Nhc2UidG9wQW5p bWF0aW9uRW5kIjpjYXNlInRvcEFuaW1hdGlvbkl0ZXJhdGlvbiI6Y2FzZSJ0b3BBbmltYXRpb25T dGFydCI6RXZlbnRDb25zdHJ1Y3Rvcj1TeW50aGV0aWNBbmltYXRpb25FdmVudDticmVhaztjYXNl InRvcFRyYW5zaXRpb25FbmQiOkV2ZW50Q29uc3RydWN0b3I9U3ludGhldGljVHJhbnNpdGlvbkV2 ZW50O2JyZWFrO2Nhc2UidG9wU2Nyb2xsIjpFdmVudENvbnN0cnVjdG9yPVN5bnRoZXRpY1VJRXZl bnQ7YnJlYWs7Y2FzZSJ0b3BXaGVlbCI6RXZlbnRDb25zdHJ1Y3Rvcj1TeW50aGV0aWNXaGVlbEV2 ZW50O2JyZWFrO2Nhc2UidG9wQ29weSI6Y2FzZSJ0b3BDdXQiOmNhc2UidG9wUGFzdGUiOkV2ZW50 Q29uc3RydWN0b3I9U3ludGhldGljQ2xpcGJvYXJkRXZlbnQ7YnJlYWt9IUV2ZW50Q29uc3RydWN0 b3I/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsIlNpbXBsZUV2 ZW50UGx1Z2luOiBVbmhhbmRsZWQgZXZlbnQgdHlwZSwgYCVzYC4iLHRvcExldmVsVHlwZSk6X3By b2RJbnZhcmlhbnQoIjg2Iix0b3BMZXZlbFR5cGUpOnZvaWQgMDt2YXIgZXZlbnQ9RXZlbnRDb25z dHJ1Y3Rvci5nZXRQb29sZWQoZGlzcGF0Y2hDb25maWcsdGFyZ2V0SW5zdCxuYXRpdmVFdmVudCxu YXRpdmVFdmVudFRhcmdldCk7RXZlbnRQcm9wYWdhdG9ycy5hY2N1bXVsYXRlVHdvUGhhc2VEaXNw YXRjaGVzKGV2ZW50KTtyZXR1cm4gZXZlbnR9LGRpZFB1dExpc3RlbmVyOmZ1bmN0aW9uKGluc3Qs cmVnaXN0cmF0aW9uTmFtZSxsaXN0ZW5lcil7aWYocmVnaXN0cmF0aW9uTmFtZT09PSJvbkNsaWNr IiYmIWlzSW50ZXJhY3RpdmUoaW5zdC5fdGFnKSl7dmFyIGtleT1nZXREaWN0aW9uYXJ5S2V5KGlu c3QpO3ZhciBub2RlPVJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGlu c3QpO2lmKCFvbkNsaWNrTGlzdGVuZXJzW2tleV0pe29uQ2xpY2tMaXN0ZW5lcnNba2V5XT1FdmVu dExpc3RlbmVyLmxpc3Rlbihub2RlLCJjbGljayIsZW1wdHlGdW5jdGlvbil9fX0sd2lsbERlbGV0 ZUxpc3RlbmVyOmZ1bmN0aW9uKGluc3QscmVnaXN0cmF0aW9uTmFtZSl7aWYocmVnaXN0cmF0aW9u TmFtZT09PSJvbkNsaWNrIiYmIWlzSW50ZXJhY3RpdmUoaW5zdC5fdGFnKSl7dmFyIGtleT1nZXRE aWN0aW9uYXJ5S2V5KGluc3QpO29uQ2xpY2tMaXN0ZW5lcnNba2V5XS5yZW1vdmUoKTtkZWxldGUg b25DbGlja0xpc3RlbmVyc1trZXldfX19O21vZHVsZS5leHBvcnRzPVNpbXBsZUV2ZW50UGx1Z2lu fSx7MTAzOjEwMywxMTY6MTE2LDEyNToxMjUsMTMyOjEzMiwxNDA6MTQwLDE5OjE5LDMyOjMyLDgw OjgwLDgxOjgxLDgzOjgzLDg0Ojg0LDg1Ojg1LDg3Ojg3LDg4Ojg4LDg5Ojg5LDkwOjkwLDkxOjkx LDkyOjkyfV0sODA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0 Ijt2YXIgU3ludGhldGljRXZlbnQ9X2RlcmVxXyg4NCk7dmFyIEFuaW1hdGlvbkV2ZW50SW50ZXJm YWNlPXthbmltYXRpb25OYW1lOm51bGwsZWxhcHNlZFRpbWU6bnVsbCxwc2V1ZG9FbGVtZW50Om51 bGx9O2Z1bmN0aW9uIFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50KGRpc3BhdGNoQ29uZmlnLGRpc3Bh dGNoTWFya2VyLG5hdGl2ZUV2ZW50LG5hdGl2ZUV2ZW50VGFyZ2V0KXtyZXR1cm4gU3ludGhldGlj RXZlbnQuY2FsbCh0aGlzLGRpc3BhdGNoQ29uZmlnLGRpc3BhdGNoTWFya2VyLG5hdGl2ZUV2ZW50 LG5hdGl2ZUV2ZW50VGFyZ2V0KX1TeW50aGV0aWNFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGlj QW5pbWF0aW9uRXZlbnQsQW5pbWF0aW9uRXZlbnRJbnRlcmZhY2UpO21vZHVsZS5leHBvcnRzPVN5 bnRoZXRpY0FuaW1hdGlvbkV2ZW50fSx7ODQ6ODR9XSw4MTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1 bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBTeW50aGV0aWNFdmVudD1fZGVyZXFfKDg0KTt2 YXIgQ2xpcGJvYXJkRXZlbnRJbnRlcmZhY2U9e2NsaXBib2FyZERhdGE6ZnVuY3Rpb24oZXZlbnQp e3JldHVybiJjbGlwYm9hcmREYXRhImluIGV2ZW50P2V2ZW50LmNsaXBib2FyZERhdGE6d2luZG93 LmNsaXBib2FyZERhdGF9fTtmdW5jdGlvbiBTeW50aGV0aWNDbGlwYm9hcmRFdmVudChkaXNwYXRj aENvbmZpZyxkaXNwYXRjaE1hcmtlcixuYXRpdmVFdmVudCxuYXRpdmVFdmVudFRhcmdldCl7cmV0 dXJuIFN5bnRoZXRpY0V2ZW50LmNhbGwodGhpcyxkaXNwYXRjaENvbmZpZyxkaXNwYXRjaE1hcmtl cixuYXRpdmVFdmVudCxuYXRpdmVFdmVudFRhcmdldCl9U3ludGhldGljRXZlbnQuYXVnbWVudENs YXNzKFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50LENsaXBib2FyZEV2ZW50SW50ZXJmYWNlKTttb2R1 bGUuZXhwb3J0cz1TeW50aGV0aWNDbGlwYm9hcmRFdmVudH0sezg0Ojg0fV0sODI6W2Z1bmN0aW9u KF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgU3ludGhldGljRXZlbnQ9 X2RlcmVxXyg4NCk7dmFyIENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2U9e2RhdGE6bnVsbH07ZnVu Y3Rpb24gU3ludGhldGljQ29tcG9zaXRpb25FdmVudChkaXNwYXRjaENvbmZpZyxkaXNwYXRjaE1h cmtlcixuYXRpdmVFdmVudCxuYXRpdmVFdmVudFRhcmdldCl7cmV0dXJuIFN5bnRoZXRpY0V2ZW50 LmNhbGwodGhpcyxkaXNwYXRjaENvbmZpZyxkaXNwYXRjaE1hcmtlcixuYXRpdmVFdmVudCxuYXRp dmVFdmVudFRhcmdldCl9U3ludGhldGljRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY0NvbXBv c2l0aW9uRXZlbnQsQ29tcG9zaXRpb25FdmVudEludGVyZmFjZSk7bW9kdWxlLmV4cG9ydHM9U3lu dGhldGljQ29tcG9zaXRpb25FdmVudH0sezg0Ojg0fV0sODM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9k dWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgU3ludGhldGljTW91c2VFdmVudD1fZGVyZXFf KDg4KTt2YXIgRHJhZ0V2ZW50SW50ZXJmYWNlPXtkYXRhVHJhbnNmZXI6bnVsbH07ZnVuY3Rpb24g U3ludGhldGljRHJhZ0V2ZW50KGRpc3BhdGNoQ29uZmlnLGRpc3BhdGNoTWFya2VyLG5hdGl2ZUV2 ZW50LG5hdGl2ZUV2ZW50VGFyZ2V0KXtyZXR1cm4gU3ludGhldGljTW91c2VFdmVudC5jYWxsKHRo aXMsZGlzcGF0Y2hDb25maWcsZGlzcGF0Y2hNYXJrZXIsbmF0aXZlRXZlbnQsbmF0aXZlRXZlbnRU YXJnZXQpfVN5bnRoZXRpY01vdXNlRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY0RyYWdFdmVu dCxEcmFnRXZlbnRJbnRlcmZhY2UpO21vZHVsZS5leHBvcnRzPVN5bnRoZXRpY0RyYWdFdmVudH0s ezg4Ojg4fV0sODQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0 Ijt2YXIgX2Fzc2lnbj1fZGVyZXFfKDE0OCk7dmFyIFBvb2xlZENsYXNzPV9kZXJlcV8oMjQpO3Zh ciBlbXB0eUZ1bmN0aW9uPV9kZXJlcV8oMTMyKTt2YXIgd2FybmluZz1fZGVyZXFfKDE0Nyk7dmFy IGRpZFdhcm5Gb3JBZGRlZE5ld1Byb3BlcnR5PWZhbHNlO3ZhciBpc1Byb3h5U3VwcG9ydGVkPXR5 cGVvZiBQcm94eT09PSJmdW5jdGlvbiI7dmFyIHNob3VsZEJlUmVsZWFzZWRQcm9wZXJ0aWVzPVsi ZGlzcGF0Y2hDb25maWciLCJfdGFyZ2V0SW5zdCIsIm5hdGl2ZUV2ZW50IiwiaXNEZWZhdWx0UHJl dmVudGVkIiwiaXNQcm9wYWdhdGlvblN0b3BwZWQiLCJfZGlzcGF0Y2hMaXN0ZW5lcnMiLCJfZGlz cGF0Y2hJbnN0YW5jZXMiXTt2YXIgRXZlbnRJbnRlcmZhY2U9e3R5cGU6bnVsbCx0YXJnZXQ6bnVs bCxjdXJyZW50VGFyZ2V0OmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNOdWxsLGV2ZW50UGhhc2U6 bnVsbCxidWJibGVzOm51bGwsY2FuY2VsYWJsZTpudWxsLHRpbWVTdGFtcDpmdW5jdGlvbihldmVu dCl7cmV0dXJuIGV2ZW50LnRpbWVTdGFtcHx8RGF0ZS5ub3coKX0sZGVmYXVsdFByZXZlbnRlZDpu dWxsLGlzVHJ1c3RlZDpudWxsfTtmdW5jdGlvbiBTeW50aGV0aWNFdmVudChkaXNwYXRjaENvbmZp Zyx0YXJnZXRJbnN0LG5hdGl2ZUV2ZW50LG5hdGl2ZUV2ZW50VGFyZ2V0KXtpZigiZGV2ZWxvcG1l bnQiIT09InByb2R1Y3Rpb24iKXtkZWxldGUgdGhpcy5uYXRpdmVFdmVudDtkZWxldGUgdGhpcy5w cmV2ZW50RGVmYXVsdDtkZWxldGUgdGhpcy5zdG9wUHJvcGFnYXRpb259dGhpcy5kaXNwYXRjaENv bmZpZz1kaXNwYXRjaENvbmZpZzt0aGlzLl90YXJnZXRJbnN0PXRhcmdldEluc3Q7dGhpcy5uYXRp dmVFdmVudD1uYXRpdmVFdmVudDt2YXIgSW50ZXJmYWNlPXRoaXMuY29uc3RydWN0b3IuSW50ZXJm YWNlO2Zvcih2YXIgcHJvcE5hbWUgaW4gSW50ZXJmYWNlKXtpZighSW50ZXJmYWNlLmhhc093blBy b3BlcnR5KHByb3BOYW1lKSl7Y29udGludWV9aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9u Iil7ZGVsZXRlIHRoaXNbcHJvcE5hbWVdfXZhciBub3JtYWxpemU9SW50ZXJmYWNlW3Byb3BOYW1l XTtpZihub3JtYWxpemUpe3RoaXNbcHJvcE5hbWVdPW5vcm1hbGl6ZShuYXRpdmVFdmVudCl9ZWxz ZXtpZihwcm9wTmFtZT09PSJ0YXJnZXQiKXt0aGlzLnRhcmdldD1uYXRpdmVFdmVudFRhcmdldH1l bHNle3RoaXNbcHJvcE5hbWVdPW5hdGl2ZUV2ZW50W3Byb3BOYW1lXX19fXZhciBkZWZhdWx0UHJl dmVudGVkPW5hdGl2ZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQhPW51bGw/bmF0aXZlRXZlbnQuZGVm YXVsdFByZXZlbnRlZDpuYXRpdmVFdmVudC5yZXR1cm5WYWx1ZT09PWZhbHNlO2lmKGRlZmF1bHRQ cmV2ZW50ZWQpe3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPWVtcHR5RnVuY3Rpb24udGhhdFJldHVy bnNUcnVlfWVsc2V7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9ZW1wdHlGdW5jdGlvbi50aGF0UmV0 dXJuc0ZhbHNlfXRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9ZW1wdHlGdW5jdGlvbi50aGF0UmV0 dXJuc0ZhbHNlO3JldHVybiB0aGlzfV9hc3NpZ24oU3ludGhldGljRXZlbnQucHJvdG90eXBlLHtw cmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD10cnVlO3ZhciBl dmVudD10aGlzLm5hdGl2ZUV2ZW50O2lmKCFldmVudCl7cmV0dXJufWlmKGV2ZW50LnByZXZlbnRE ZWZhdWx0KXtldmVudC5wcmV2ZW50RGVmYXVsdCgpfWVsc2UgaWYodHlwZW9mIGV2ZW50LnJldHVy blZhbHVlIT09InVua25vd24iKXtldmVudC5yZXR1cm5WYWx1ZT1mYWxzZX10aGlzLmlzRGVmYXVs dFByZXZlbnRlZD1lbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zVHJ1ZX0sc3RvcFByb3BhZ2F0aW9u OmZ1bmN0aW9uKCl7dmFyIGV2ZW50PXRoaXMubmF0aXZlRXZlbnQ7aWYoIWV2ZW50KXtyZXR1cm59 aWYoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKXtldmVudC5zdG9wUHJvcGFnYXRpb24oKX1lbHNlIGlm KHR5cGVvZiBldmVudC5jYW5jZWxCdWJibGUhPT0idW5rbm93biIpe2V2ZW50LmNhbmNlbEJ1YmJs ZT10cnVlfXRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9ZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJu c1RydWV9LHBlcnNpc3Q6ZnVuY3Rpb24oKXt0aGlzLmlzUGVyc2lzdGVudD1lbXB0eUZ1bmN0aW9u LnRoYXRSZXR1cm5zVHJ1ZX0saXNQZXJzaXN0ZW50OmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNG YWxzZSxkZXN0cnVjdG9yOmZ1bmN0aW9uKCl7dmFyIEludGVyZmFjZT10aGlzLmNvbnN0cnVjdG9y LkludGVyZmFjZTtmb3IodmFyIHByb3BOYW1lIGluIEludGVyZmFjZSl7aWYoImRldmVsb3BtZW50 IiE9PSJwcm9kdWN0aW9uIil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMscHJvcE5hbWUsZ2V0 UG9vbGVkV2FybmluZ1Byb3BlcnR5RGVmaW5pdGlvbihwcm9wTmFtZSxJbnRlcmZhY2VbcHJvcE5h bWVdKSl9ZWxzZXt0aGlzW3Byb3BOYW1lXT1udWxsfX1mb3IodmFyIGk9MDtpPHNob3VsZEJlUmVs ZWFzZWRQcm9wZXJ0aWVzLmxlbmd0aDtpKyspe3RoaXNbc2hvdWxkQmVSZWxlYXNlZFByb3BlcnRp ZXNbaV1dPW51bGx9aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7T2JqZWN0LmRlZmlu ZVByb3BlcnR5KHRoaXMsIm5hdGl2ZUV2ZW50IixnZXRQb29sZWRXYXJuaW5nUHJvcGVydHlEZWZp bml0aW9uKCJuYXRpdmVFdmVudCIsbnVsbCkpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJw cmV2ZW50RGVmYXVsdCIsZ2V0UG9vbGVkV2FybmluZ1Byb3BlcnR5RGVmaW5pdGlvbigicHJldmVu dERlZmF1bHQiLGVtcHR5RnVuY3Rpb24pKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic3Rv cFByb3BhZ2F0aW9uIixnZXRQb29sZWRXYXJuaW5nUHJvcGVydHlEZWZpbml0aW9uKCJzdG9wUHJv cGFnYXRpb24iLGVtcHR5RnVuY3Rpb24pKX19fSk7U3ludGhldGljRXZlbnQuSW50ZXJmYWNlPUV2 ZW50SW50ZXJmYWNlO1N5bnRoZXRpY0V2ZW50LmF1Z21lbnRDbGFzcz1mdW5jdGlvbihDbGFzcyxJ bnRlcmZhY2Upe3ZhciBTdXBlcj10aGlzO3ZhciBFPWZ1bmN0aW9uKCl7fTtFLnByb3RvdHlwZT1T dXBlci5wcm90b3R5cGU7dmFyIHByb3RvdHlwZT1uZXcgRTtfYXNzaWduKHByb3RvdHlwZSxDbGFz cy5wcm90b3R5cGUpO0NsYXNzLnByb3RvdHlwZT1wcm90b3R5cGU7Q2xhc3MucHJvdG90eXBlLmNv bnN0cnVjdG9yPUNsYXNzO0NsYXNzLkludGVyZmFjZT1fYXNzaWduKHt9LFN1cGVyLkludGVyZmFj ZSxJbnRlcmZhY2UpO0NsYXNzLmF1Z21lbnRDbGFzcz1TdXBlci5hdWdtZW50Q2xhc3M7UG9vbGVk Q2xhc3MuYWRkUG9vbGluZ1RvKENsYXNzLFBvb2xlZENsYXNzLmZvdXJBcmd1bWVudFBvb2xlcil9 O2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe2lmKGlzUHJveHlTdXBwb3J0ZWQpe1N5 bnRoZXRpY0V2ZW50PW5ldyBQcm94eShTeW50aGV0aWNFdmVudCx7Y29uc3RydWN0OmZ1bmN0aW9u KHRhcmdldCxhcmdzKXtyZXR1cm4gdGhpcy5hcHBseSh0YXJnZXQsT2JqZWN0LmNyZWF0ZSh0YXJn ZXQucHJvdG90eXBlKSxhcmdzKX0sYXBwbHk6ZnVuY3Rpb24oY29uc3RydWN0b3IsdGhhdCxhcmdz KXtyZXR1cm4gbmV3IFByb3h5KGNvbnN0cnVjdG9yLmFwcGx5KHRoYXQsYXJncykse3NldDpmdW5j dGlvbih0YXJnZXQscHJvcCx2YWx1ZSl7aWYocHJvcCE9PSJpc1BlcnNpc3RlbnQiJiYhdGFyZ2V0 LmNvbnN0cnVjdG9yLkludGVyZmFjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSYmc2hvdWxkQmVSZWxl YXNlZFByb3BlcnRpZXMuaW5kZXhPZihwcm9wKT09PS0xKXsiZGV2ZWxvcG1lbnQiIT09InByb2R1 Y3Rpb24iP3dhcm5pbmcoZGlkV2FybkZvckFkZGVkTmV3UHJvcGVydHl8fHRhcmdldC5pc1BlcnNp c3RlbnQoKSwiVGhpcyBzeW50aGV0aWMgZXZlbnQgaXMgcmV1c2VkIGZvciBwZXJmb3JtYW5jZSBy ZWFzb25zLiBJZiB5b3UncmUgIisic2VlaW5nIHRoaXMsIHlvdSdyZSBhZGRpbmcgYSBuZXcgcHJv cGVydHkgaW4gdGhlIHN5bnRoZXRpYyBldmVudCBvYmplY3QuICIrIlRoZSBwcm9wZXJ0eSBpcyBu ZXZlciByZWxlYXNlZC4gU2VlICIrImh0dHBzOi8vZmIubWUvcmVhY3QtZXZlbnQtcG9vbGluZyBm b3IgbW9yZSBpbmZvcm1hdGlvbi4iKTp2b2lkIDA7ZGlkV2FybkZvckFkZGVkTmV3UHJvcGVydHk9 dHJ1ZX10YXJnZXRbcHJvcF09dmFsdWU7cmV0dXJuIHRydWV9fSl9fSl9fVBvb2xlZENsYXNzLmFk ZFBvb2xpbmdUbyhTeW50aGV0aWNFdmVudCxQb29sZWRDbGFzcy5mb3VyQXJndW1lbnRQb29sZXIp O21vZHVsZS5leHBvcnRzPVN5bnRoZXRpY0V2ZW50O2Z1bmN0aW9uIGdldFBvb2xlZFdhcm5pbmdQ cm9wZXJ0eURlZmluaXRpb24ocHJvcE5hbWUsZ2V0VmFsKXt2YXIgaXNGdW5jdGlvbj10eXBlb2Yg Z2V0VmFsPT09ImZ1bmN0aW9uIjtyZXR1cm57Y29uZmlndXJhYmxlOnRydWUsc2V0OnNldCxnZXQ6 Z2V0fTtmdW5jdGlvbiBzZXQodmFsKXt2YXIgYWN0aW9uPWlzRnVuY3Rpb24/InNldHRpbmcgdGhl IG1ldGhvZCI6InNldHRpbmcgdGhlIHByb3BlcnR5Ijt3YXJuKGFjdGlvbiwiVGhpcyBpcyBlZmZl Y3RpdmVseSBhIG5vLW9wIik7cmV0dXJuIHZhbH1mdW5jdGlvbiBnZXQoKXt2YXIgYWN0aW9uPWlz RnVuY3Rpb24/ImFjY2Vzc2luZyB0aGUgbWV0aG9kIjoiYWNjZXNzaW5nIHRoZSBwcm9wZXJ0eSI7 dmFyIHJlc3VsdD1pc0Z1bmN0aW9uPyJUaGlzIGlzIGEgbm8tb3AgZnVuY3Rpb24iOiJUaGlzIGlz IHNldCB0byBudWxsIjt3YXJuKGFjdGlvbixyZXN1bHQpO3JldHVybiBnZXRWYWx9ZnVuY3Rpb24g d2FybihhY3Rpb24scmVzdWx0KXt2YXIgd2FybmluZ0NvbmRpdGlvbj1mYWxzZTsiZGV2ZWxvcG1l bnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmcod2FybmluZ0NvbmRpdGlvbiwiVGhpcyBzeW50aGV0 aWMgZXZlbnQgaXMgcmV1c2VkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLiBJZiB5b3UncmUgc2Vl aW5nIHRoaXMsICIrInlvdSdyZSAlcyBgJXNgIG9uIGEgcmVsZWFzZWQvbnVsbGlmaWVkIHN5bnRo ZXRpYyBldmVudC4gJXMuICIrIklmIHlvdSBtdXN0IGtlZXAgdGhlIG9yaWdpbmFsIHN5bnRoZXRp YyBldmVudCBhcm91bmQsIHVzZSBldmVudC5wZXJzaXN0KCkuICIrIlNlZSBodHRwczovL2ZiLm1l L3JlYWN0LWV2ZW50LXBvb2xpbmcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIixhY3Rpb24scHJvcE5h bWUscmVzdWx0KTp2b2lkIDB9fX0sezEzMjoxMzIsMTQ3OjE0NywxNDg6MTQ4LDI0OjI0fV0sODU6 W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgU3ludGhl dGljVUlFdmVudD1fZGVyZXFfKDkxKTt2YXIgRm9jdXNFdmVudEludGVyZmFjZT17cmVsYXRlZFRh cmdldDpudWxsfTtmdW5jdGlvbiBTeW50aGV0aWNGb2N1c0V2ZW50KGRpc3BhdGNoQ29uZmlnLGRp c3BhdGNoTWFya2VyLG5hdGl2ZUV2ZW50LG5hdGl2ZUV2ZW50VGFyZ2V0KXtyZXR1cm4gU3ludGhl dGljVUlFdmVudC5jYWxsKHRoaXMsZGlzcGF0Y2hDb25maWcsZGlzcGF0Y2hNYXJrZXIsbmF0aXZl RXZlbnQsbmF0aXZlRXZlbnRUYXJnZXQpfVN5bnRoZXRpY1VJRXZlbnQuYXVnbWVudENsYXNzKFN5 bnRoZXRpY0ZvY3VzRXZlbnQsRm9jdXNFdmVudEludGVyZmFjZSk7bW9kdWxlLmV4cG9ydHM9U3lu dGhldGljRm9jdXNFdmVudH0sezkxOjkxfV0sODY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4 cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgU3ludGhldGljRXZlbnQ9X2RlcmVxXyg4NCk7dmFyIElu cHV0RXZlbnRJbnRlcmZhY2U9e2RhdGE6bnVsbH07ZnVuY3Rpb24gU3ludGhldGljSW5wdXRFdmVu dChkaXNwYXRjaENvbmZpZyxkaXNwYXRjaE1hcmtlcixuYXRpdmVFdmVudCxuYXRpdmVFdmVudFRh cmdldCl7cmV0dXJuIFN5bnRoZXRpY0V2ZW50LmNhbGwodGhpcyxkaXNwYXRjaENvbmZpZyxkaXNw YXRjaE1hcmtlcixuYXRpdmVFdmVudCxuYXRpdmVFdmVudFRhcmdldCl9U3ludGhldGljRXZlbnQu YXVnbWVudENsYXNzKFN5bnRoZXRpY0lucHV0RXZlbnQsSW5wdXRFdmVudEludGVyZmFjZSk7bW9k dWxlLmV4cG9ydHM9U3ludGhldGljSW5wdXRFdmVudH0sezg0Ojg0fV0sODc6W2Z1bmN0aW9uKF9k ZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgU3ludGhldGljVUlFdmVudD1f ZGVyZXFfKDkxKTt2YXIgZ2V0RXZlbnRDaGFyQ29kZT1fZGVyZXFfKDEwMyk7dmFyIGdldEV2ZW50 S2V5PV9kZXJlcV8oMTA0KTt2YXIgZ2V0RXZlbnRNb2RpZmllclN0YXRlPV9kZXJlcV8oMTA1KTt2 YXIgS2V5Ym9hcmRFdmVudEludGVyZmFjZT17a2V5OmdldEV2ZW50S2V5LGxvY2F0aW9uOm51bGws Y3RybEtleTpudWxsLHNoaWZ0S2V5Om51bGwsYWx0S2V5Om51bGwsbWV0YUtleTpudWxsLHJlcGVh dDpudWxsLGxvY2FsZTpudWxsLGdldE1vZGlmaWVyU3RhdGU6Z2V0RXZlbnRNb2RpZmllclN0YXRl LGNoYXJDb2RlOmZ1bmN0aW9uKGV2ZW50KXtpZihldmVudC50eXBlPT09ImtleXByZXNzIil7cmV0 dXJuIGdldEV2ZW50Q2hhckNvZGUoZXZlbnQpfXJldHVybiAwfSxrZXlDb2RlOmZ1bmN0aW9uKGV2 ZW50KXtpZihldmVudC50eXBlPT09ImtleWRvd24ifHxldmVudC50eXBlPT09ImtleXVwIil7cmV0 dXJuIGV2ZW50LmtleUNvZGV9cmV0dXJuIDB9LHdoaWNoOmZ1bmN0aW9uKGV2ZW50KXtpZihldmVu dC50eXBlPT09ImtleXByZXNzIil7cmV0dXJuIGdldEV2ZW50Q2hhckNvZGUoZXZlbnQpfWlmKGV2 ZW50LnR5cGU9PT0ia2V5ZG93biJ8fGV2ZW50LnR5cGU9PT0ia2V5dXAiKXtyZXR1cm4gZXZlbnQu a2V5Q29kZX1yZXR1cm4gMH19O2Z1bmN0aW9uIFN5bnRoZXRpY0tleWJvYXJkRXZlbnQoZGlzcGF0 Y2hDb25maWcsZGlzcGF0Y2hNYXJrZXIsbmF0aXZlRXZlbnQsbmF0aXZlRXZlbnRUYXJnZXQpe3Jl dHVybiBTeW50aGV0aWNVSUV2ZW50LmNhbGwodGhpcyxkaXNwYXRjaENvbmZpZyxkaXNwYXRjaE1h cmtlcixuYXRpdmVFdmVudCxuYXRpdmVFdmVudFRhcmdldCl9U3ludGhldGljVUlFdmVudC5hdWdt ZW50Q2xhc3MoU3ludGhldGljS2V5Ym9hcmRFdmVudCxLZXlib2FyZEV2ZW50SW50ZXJmYWNlKTtt b2R1bGUuZXhwb3J0cz1TeW50aGV0aWNLZXlib2FyZEV2ZW50fSx7MTAzOjEwMywxMDQ6MTA0LDEw NToxMDUsOTE6OTF9XSw4ODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBz dHJpY3QiO3ZhciBTeW50aGV0aWNVSUV2ZW50PV9kZXJlcV8oOTEpO3ZhciBWaWV3cG9ydE1ldHJp Y3M9X2RlcmVxXyg5NCk7dmFyIGdldEV2ZW50TW9kaWZpZXJTdGF0ZT1fZGVyZXFfKDEwNSk7dmFy IE1vdXNlRXZlbnRJbnRlcmZhY2U9e3NjcmVlblg6bnVsbCxzY3JlZW5ZOm51bGwsY2xpZW50WDpu dWxsLGNsaWVudFk6bnVsbCxjdHJsS2V5Om51bGwsc2hpZnRLZXk6bnVsbCxhbHRLZXk6bnVsbCxt ZXRhS2V5Om51bGwsZ2V0TW9kaWZpZXJTdGF0ZTpnZXRFdmVudE1vZGlmaWVyU3RhdGUsYnV0dG9u OmZ1bmN0aW9uKGV2ZW50KXt2YXIgYnV0dG9uPWV2ZW50LmJ1dHRvbjtpZigid2hpY2giaW4gZXZl bnQpe3JldHVybiBidXR0b259cmV0dXJuIGJ1dHRvbj09PTI/MjpidXR0b249PT00PzE6MH0sYnV0 dG9uczpudWxsLHJlbGF0ZWRUYXJnZXQ6ZnVuY3Rpb24oZXZlbnQpe3JldHVybiBldmVudC5yZWxh dGVkVGFyZ2V0fHwoZXZlbnQuZnJvbUVsZW1lbnQ9PT1ldmVudC5zcmNFbGVtZW50P2V2ZW50LnRv RWxlbWVudDpldmVudC5mcm9tRWxlbWVudCl9LHBhZ2VYOmZ1bmN0aW9uKGV2ZW50KXtyZXR1cm4i cGFnZVgiaW4gZXZlbnQ/ZXZlbnQucGFnZVg6ZXZlbnQuY2xpZW50WCtWaWV3cG9ydE1ldHJpY3Mu Y3VycmVudFNjcm9sbExlZnR9LHBhZ2VZOmZ1bmN0aW9uKGV2ZW50KXtyZXR1cm4icGFnZVkiaW4g ZXZlbnQ/ZXZlbnQucGFnZVk6ZXZlbnQuY2xpZW50WStWaWV3cG9ydE1ldHJpY3MuY3VycmVudFNj cm9sbFRvcH19O2Z1bmN0aW9uIFN5bnRoZXRpY01vdXNlRXZlbnQoZGlzcGF0Y2hDb25maWcsZGlz cGF0Y2hNYXJrZXIsbmF0aXZlRXZlbnQsbmF0aXZlRXZlbnRUYXJnZXQpe3JldHVybiBTeW50aGV0 aWNVSUV2ZW50LmNhbGwodGhpcyxkaXNwYXRjaENvbmZpZyxkaXNwYXRjaE1hcmtlcixuYXRpdmVF dmVudCxuYXRpdmVFdmVudFRhcmdldCl9U3ludGhldGljVUlFdmVudC5hdWdtZW50Q2xhc3MoU3lu dGhldGljTW91c2VFdmVudCxNb3VzZUV2ZW50SW50ZXJmYWNlKTttb2R1bGUuZXhwb3J0cz1TeW50 aGV0aWNNb3VzZUV2ZW50fSx7MTA1OjEwNSw5MTo5MSw5NDo5NH1dLDg5OltmdW5jdGlvbihfZGVy ZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIFN5bnRoZXRpY1VJRXZlbnQ9X2Rl cmVxXyg5MSk7dmFyIGdldEV2ZW50TW9kaWZpZXJTdGF0ZT1fZGVyZXFfKDEwNSk7dmFyIFRvdWNo RXZlbnRJbnRlcmZhY2U9e3RvdWNoZXM6bnVsbCx0YXJnZXRUb3VjaGVzOm51bGwsY2hhbmdlZFRv dWNoZXM6bnVsbCxhbHRLZXk6bnVsbCxtZXRhS2V5Om51bGwsY3RybEtleTpudWxsLHNoaWZ0S2V5 Om51bGwsZ2V0TW9kaWZpZXJTdGF0ZTpnZXRFdmVudE1vZGlmaWVyU3RhdGV9O2Z1bmN0aW9uIFN5 bnRoZXRpY1RvdWNoRXZlbnQoZGlzcGF0Y2hDb25maWcsZGlzcGF0Y2hNYXJrZXIsbmF0aXZlRXZl bnQsbmF0aXZlRXZlbnRUYXJnZXQpe3JldHVybiBTeW50aGV0aWNVSUV2ZW50LmNhbGwodGhpcyxk aXNwYXRjaENvbmZpZyxkaXNwYXRjaE1hcmtlcixuYXRpdmVFdmVudCxuYXRpdmVFdmVudFRhcmdl dCl9U3ludGhldGljVUlFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGljVG91Y2hFdmVudCxUb3Vj aEV2ZW50SW50ZXJmYWNlKTttb2R1bGUuZXhwb3J0cz1TeW50aGV0aWNUb3VjaEV2ZW50fSx7MTA1 OjEwNSw5MTo5MX1dLDkwOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0 cmljdCI7dmFyIFN5bnRoZXRpY0V2ZW50PV9kZXJlcV8oODQpO3ZhciBUcmFuc2l0aW9uRXZlbnRJ bnRlcmZhY2U9e3Byb3BlcnR5TmFtZTpudWxsLGVsYXBzZWRUaW1lOm51bGwscHNldWRvRWxlbWVu dDpudWxsfTtmdW5jdGlvbiBTeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQoZGlzcGF0Y2hDb25maWcs ZGlzcGF0Y2hNYXJrZXIsbmF0aXZlRXZlbnQsbmF0aXZlRXZlbnRUYXJnZXQpe3JldHVybiBTeW50 aGV0aWNFdmVudC5jYWxsKHRoaXMsZGlzcGF0Y2hDb25maWcsZGlzcGF0Y2hNYXJrZXIsbmF0aXZl RXZlbnQsbmF0aXZlRXZlbnRUYXJnZXQpfVN5bnRoZXRpY0V2ZW50LmF1Z21lbnRDbGFzcyhTeW50 aGV0aWNUcmFuc2l0aW9uRXZlbnQsVHJhbnNpdGlvbkV2ZW50SW50ZXJmYWNlKTttb2R1bGUuZXhw b3J0cz1TeW50aGV0aWNUcmFuc2l0aW9uRXZlbnR9LHs4NDo4NH1dLDkxOltmdW5jdGlvbihfZGVy ZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIFN5bnRoZXRpY0V2ZW50PV9kZXJl cV8oODQpO3ZhciBnZXRFdmVudFRhcmdldD1fZGVyZXFfKDEwNik7dmFyIFVJRXZlbnRJbnRlcmZh Y2U9e3ZpZXc6ZnVuY3Rpb24oZXZlbnQpe2lmKGV2ZW50LnZpZXcpe3JldHVybiBldmVudC52aWV3 fXZhciB0YXJnZXQ9Z2V0RXZlbnRUYXJnZXQoZXZlbnQpO2lmKHRhcmdldC53aW5kb3c9PT10YXJn ZXQpe3JldHVybiB0YXJnZXR9dmFyIGRvYz10YXJnZXQub3duZXJEb2N1bWVudDtpZihkb2Mpe3Jl dHVybiBkb2MuZGVmYXVsdFZpZXd8fGRvYy5wYXJlbnRXaW5kb3d9ZWxzZXtyZXR1cm4gd2luZG93 fX0sZGV0YWlsOmZ1bmN0aW9uKGV2ZW50KXtyZXR1cm4gZXZlbnQuZGV0YWlsfHwwfX07ZnVuY3Rp b24gU3ludGhldGljVUlFdmVudChkaXNwYXRjaENvbmZpZyxkaXNwYXRjaE1hcmtlcixuYXRpdmVF dmVudCxuYXRpdmVFdmVudFRhcmdldCl7cmV0dXJuIFN5bnRoZXRpY0V2ZW50LmNhbGwodGhpcyxk aXNwYXRjaENvbmZpZyxkaXNwYXRjaE1hcmtlcixuYXRpdmVFdmVudCxuYXRpdmVFdmVudFRhcmdl dCl9U3ludGhldGljRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY1VJRXZlbnQsVUlFdmVudElu dGVyZmFjZSk7bW9kdWxlLmV4cG9ydHM9U3ludGhldGljVUlFdmVudH0sezEwNjoxMDYsODQ6ODR9 XSw5MjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBT eW50aGV0aWNNb3VzZUV2ZW50PV9kZXJlcV8oODgpO3ZhciBXaGVlbEV2ZW50SW50ZXJmYWNlPXtk ZWx0YVg6ZnVuY3Rpb24oZXZlbnQpe3JldHVybiJkZWx0YVgiaW4gZXZlbnQ/ZXZlbnQuZGVsdGFY OiJ3aGVlbERlbHRhWCJpbiBldmVudD8tZXZlbnQud2hlZWxEZWx0YVg6MH0sZGVsdGFZOmZ1bmN0 aW9uKGV2ZW50KXtyZXR1cm4iZGVsdGFZImluIGV2ZW50P2V2ZW50LmRlbHRhWToid2hlZWxEZWx0 YVkiaW4gZXZlbnQ/LWV2ZW50LndoZWVsRGVsdGFZOiJ3aGVlbERlbHRhImluIGV2ZW50Py1ldmVu dC53aGVlbERlbHRhOjB9LGRlbHRhWjpudWxsLGRlbHRhTW9kZTpudWxsfTtmdW5jdGlvbiBTeW50 aGV0aWNXaGVlbEV2ZW50KGRpc3BhdGNoQ29uZmlnLGRpc3BhdGNoTWFya2VyLG5hdGl2ZUV2ZW50 LG5hdGl2ZUV2ZW50VGFyZ2V0KXtyZXR1cm4gU3ludGhldGljTW91c2VFdmVudC5jYWxsKHRoaXMs ZGlzcGF0Y2hDb25maWcsZGlzcGF0Y2hNYXJrZXIsbmF0aXZlRXZlbnQsbmF0aXZlRXZlbnRUYXJn ZXQpfVN5bnRoZXRpY01vdXNlRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY1doZWVsRXZlbnQs V2hlZWxFdmVudEludGVyZmFjZSk7bW9kdWxlLmV4cG9ydHM9U3ludGhldGljV2hlZWxFdmVudH0s ezg4Ojg4fV0sOTM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0 Ijt2YXIgX3Byb2RJbnZhcmlhbnQ9X2RlcmVxXygxMTYpO3ZhciBpbnZhcmlhbnQ9X2RlcmVxXygx NDApO3ZhciBPQlNFUlZFRF9FUlJPUj17fTt2YXIgVHJhbnNhY3Rpb25JbXBsPXtyZWluaXRpYWxp emVUcmFuc2FjdGlvbjpmdW5jdGlvbigpe3RoaXMudHJhbnNhY3Rpb25XcmFwcGVycz10aGlzLmdl dFRyYW5zYWN0aW9uV3JhcHBlcnMoKTtpZih0aGlzLndyYXBwZXJJbml0RGF0YSl7dGhpcy53cmFw cGVySW5pdERhdGEubGVuZ3RoPTB9ZWxzZXt0aGlzLndyYXBwZXJJbml0RGF0YT1bXX10aGlzLl9p c0luVHJhbnNhY3Rpb249ZmFsc2V9LF9pc0luVHJhbnNhY3Rpb246ZmFsc2UsZ2V0VHJhbnNhY3Rp b25XcmFwcGVyczpudWxsLGlzSW5UcmFuc2FjdGlvbjpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5f aXNJblRyYW5zYWN0aW9ufSxwZXJmb3JtOmZ1bmN0aW9uKG1ldGhvZCxzY29wZSxhLGIsYyxkLGUs Zil7ISF0aGlzLmlzSW5UcmFuc2FjdGlvbigpPyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/ aW52YXJpYW50KGZhbHNlLCJUcmFuc2FjdGlvbi5wZXJmb3JtKC4uLik6IENhbm5vdCBpbml0aWFs aXplIGEgdHJhbnNhY3Rpb24gd2hlbiB0aGVyZSBpcyBhbHJlYWR5IGFuIG91dHN0YW5kaW5nIHRy YW5zYWN0aW9uLiIpOl9wcm9kSW52YXJpYW50KCIyNyIpOnZvaWQgMDt2YXIgZXJyb3JUaHJvd247 dmFyIHJldDt0cnl7dGhpcy5faXNJblRyYW5zYWN0aW9uPXRydWU7ZXJyb3JUaHJvd249dHJ1ZTt0 aGlzLmluaXRpYWxpemVBbGwoMCk7cmV0PW1ldGhvZC5jYWxsKHNjb3BlLGEsYixjLGQsZSxmKTtl cnJvclRocm93bj1mYWxzZX1maW5hbGx5e3RyeXtpZihlcnJvclRocm93bil7dHJ5e3RoaXMuY2xv c2VBbGwoMCl9Y2F0Y2goZXJyKXt9fWVsc2V7dGhpcy5jbG9zZUFsbCgwKX19ZmluYWxseXt0aGlz Ll9pc0luVHJhbnNhY3Rpb249ZmFsc2V9fXJldHVybiByZXR9LGluaXRpYWxpemVBbGw6ZnVuY3Rp b24oc3RhcnRJbmRleCl7dmFyIHRyYW5zYWN0aW9uV3JhcHBlcnM9dGhpcy50cmFuc2FjdGlvbldy YXBwZXJzO2Zvcih2YXIgaT1zdGFydEluZGV4O2k8dHJhbnNhY3Rpb25XcmFwcGVycy5sZW5ndGg7 aSsrKXt2YXIgd3JhcHBlcj10cmFuc2FjdGlvbldyYXBwZXJzW2ldO3RyeXt0aGlzLndyYXBwZXJJ bml0RGF0YVtpXT1PQlNFUlZFRF9FUlJPUjt0aGlzLndyYXBwZXJJbml0RGF0YVtpXT13cmFwcGVy LmluaXRpYWxpemU/d3JhcHBlci5pbml0aWFsaXplLmNhbGwodGhpcyk6bnVsbH1maW5hbGx5e2lm KHRoaXMud3JhcHBlckluaXREYXRhW2ldPT09T0JTRVJWRURfRVJST1Ipe3RyeXt0aGlzLmluaXRp YWxpemVBbGwoaSsxKX1jYXRjaChlcnIpe319fX19LGNsb3NlQWxsOmZ1bmN0aW9uKHN0YXJ0SW5k ZXgpeyF0aGlzLmlzSW5UcmFuc2FjdGlvbigpPyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/ aW52YXJpYW50KGZhbHNlLCJUcmFuc2FjdGlvbi5jbG9zZUFsbCgpOiBDYW5ub3QgY2xvc2UgdHJh bnNhY3Rpb24gd2hlbiBub25lIGFyZSBvcGVuLiIpOl9wcm9kSW52YXJpYW50KCIyOCIpOnZvaWQg MDt2YXIgdHJhbnNhY3Rpb25XcmFwcGVycz10aGlzLnRyYW5zYWN0aW9uV3JhcHBlcnM7Zm9yKHZh ciBpPXN0YXJ0SW5kZXg7aTx0cmFuc2FjdGlvbldyYXBwZXJzLmxlbmd0aDtpKyspe3ZhciB3cmFw cGVyPXRyYW5zYWN0aW9uV3JhcHBlcnNbaV07dmFyIGluaXREYXRhPXRoaXMud3JhcHBlckluaXRE YXRhW2ldO3ZhciBlcnJvclRocm93bjt0cnl7ZXJyb3JUaHJvd249dHJ1ZTtpZihpbml0RGF0YSE9 PU9CU0VSVkVEX0VSUk9SJiZ3cmFwcGVyLmNsb3NlKXt3cmFwcGVyLmNsb3NlLmNhbGwodGhpcyxp bml0RGF0YSl9ZXJyb3JUaHJvd249ZmFsc2V9ZmluYWxseXtpZihlcnJvclRocm93bil7dHJ5e3Ro aXMuY2xvc2VBbGwoaSsxKX1jYXRjaChlKXt9fX19dGhpcy53cmFwcGVySW5pdERhdGEubGVuZ3Ro PTB9fTttb2R1bGUuZXhwb3J0cz1UcmFuc2FjdGlvbkltcGx9LHsxMTY6MTE2LDE0MDoxNDB9XSw5 NDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBWaWV3 cG9ydE1ldHJpY3M9e2N1cnJlbnRTY3JvbGxMZWZ0OjAsY3VycmVudFNjcm9sbFRvcDowLHJlZnJl c2hTY3JvbGxWYWx1ZXM6ZnVuY3Rpb24oc2Nyb2xsUG9zaXRpb24pe1ZpZXdwb3J0TWV0cmljcy5j dXJyZW50U2Nyb2xsTGVmdD1zY3JvbGxQb3NpdGlvbi54O1ZpZXdwb3J0TWV0cmljcy5jdXJyZW50 U2Nyb2xsVG9wPXNjcm9sbFBvc2l0aW9uLnl9fTttb2R1bGUuZXhwb3J0cz1WaWV3cG9ydE1ldHJp Y3N9LHt9XSw5NTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3Qi O3ZhciBfcHJvZEludmFyaWFudD1fZGVyZXFfKDExNik7dmFyIGludmFyaWFudD1fZGVyZXFfKDE0 MCk7ZnVuY3Rpb24gYWNjdW11bGF0ZUludG8oY3VycmVudCxuZXh0KXshKG5leHQhPW51bGwpPyJk ZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJhY2N1bXVsYXRlSW50 byguLi4pOiBBY2N1bXVsYXRlZCBpdGVtcyBtdXN0IG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4i KTpfcHJvZEludmFyaWFudCgiMzAiKTp2b2lkIDA7aWYoY3VycmVudD09bnVsbCl7cmV0dXJuIG5l eHR9aWYoQXJyYXkuaXNBcnJheShjdXJyZW50KSl7aWYoQXJyYXkuaXNBcnJheShuZXh0KSl7Y3Vy cmVudC5wdXNoLmFwcGx5KGN1cnJlbnQsbmV4dCk7cmV0dXJuIGN1cnJlbnR9Y3VycmVudC5wdXNo KG5leHQpO3JldHVybiBjdXJyZW50fWlmKEFycmF5LmlzQXJyYXkobmV4dCkpe3JldHVybltjdXJy ZW50XS5jb25jYXQobmV4dCl9cmV0dXJuW2N1cnJlbnQsbmV4dF19bW9kdWxlLmV4cG9ydHM9YWNj dW11bGF0ZUludG99LHsxMTY6MTE2LDE0MDoxNDB9XSw5NjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1 bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBNT0Q9NjU1MjE7ZnVuY3Rpb24gYWRsZXIzMihk YXRhKXt2YXIgYT0xO3ZhciBiPTA7dmFyIGk9MDt2YXIgbD1kYXRhLmxlbmd0aDt2YXIgbT1sJn4z O3doaWxlKGk8bSl7dmFyIG49TWF0aC5taW4oaSs0MDk2LG0pO2Zvcig7aTxuO2krPTQpe2IrPShh Kz1kYXRhLmNoYXJDb2RlQXQoaSkpKyhhKz1kYXRhLmNoYXJDb2RlQXQoaSsxKSkrKGErPWRhdGEu Y2hhckNvZGVBdChpKzIpKSsoYSs9ZGF0YS5jaGFyQ29kZUF0KGkrMykpfWElPU1PRDtiJT1NT0R9 Zm9yKDtpPGw7aSsrKXtiKz1hKz1kYXRhLmNoYXJDb2RlQXQoaSl9YSU9TU9EO2IlPU1PRDtyZXR1 cm4gYXxiPDwxNn1tb2R1bGUuZXhwb3J0cz1hZGxlcjMyfSx7fV0sOTc6W2Z1bmN0aW9uKF9kZXJl cV8sbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihwcm9jZXNzKXsidXNlIHN0cmljdCI7dmFyIF9w cm9kSW52YXJpYW50PV9kZXJlcV8oMTE2KTt2YXIgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXM9 X2RlcmVxXyg2NSk7dmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0PV9kZXJlcV8oNjYpO3ZhciBpbnZh cmlhbnQ9X2RlcmVxXygxNDApO3ZhciB3YXJuaW5nPV9kZXJlcV8oMTQ3KTt2YXIgUmVhY3RDb21w b25lbnRUcmVlSG9vaztpZih0eXBlb2YgcHJvY2VzcyE9PSJ1bmRlZmluZWQiJiZwcm9jZXNzLmVu diYmImRldmVsb3BtZW50Ij09PSJ0ZXN0Iil7UmVhY3RDb21wb25lbnRUcmVlSG9vaz1fZGVyZXFf KDEyMil9dmFyIGxvZ2dlZFR5cGVGYWlsdXJlcz17fTtmdW5jdGlvbiBjaGVja1JlYWN0VHlwZVNw ZWModHlwZVNwZWNzLHZhbHVlcyxsb2NhdGlvbixjb21wb25lbnROYW1lLGVsZW1lbnQsZGVidWdJ RCl7Zm9yKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKXtpZih0eXBlU3BlY3MuaGFzT3du UHJvcGVydHkodHlwZVNwZWNOYW1lKSl7dmFyIGVycm9yO3RyeXshKHR5cGVvZiB0eXBlU3BlY3Nb dHlwZVNwZWNOYW1lXT09PSJmdW5jdGlvbiIpPyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/ aW52YXJpYW50KGZhbHNlLCIlczogJXMgdHlwZSBgJXNgIGlzIGludmFsaWQ7IGl0IG11c3QgYmUg YSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIFJlYWN0LlByb3BUeXBlcy4iLGNvbXBvbmVudE5hbWV8 fCJSZWFjdCBjbGFzcyIsUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dLHR5cGVT cGVjTmFtZSk6X3Byb2RJbnZhcmlhbnQoIjg0Iixjb21wb25lbnROYW1lfHwiUmVhY3QgY2xhc3Mi LFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXSx0eXBlU3BlY05hbWUpOnZvaWQg MDtlcnJvcj10eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsdHlwZVNwZWNOYW1lLGNvbXBv bmVudE5hbWUsbG9jYXRpb24sbnVsbCxSZWFjdFByb3BUeXBlc1NlY3JldCl9Y2F0Y2goZXgpe2Vy cm9yPWV4fSJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyghZXJyb3J8fGVycm9y IGluc3RhbmNlb2YgRXJyb3IsIiVzOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJXMgYCVzYCBpcyBp bnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICIrImZ1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBv ciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICVzLiAiKyJZb3UgbWF5IGhhdmUgZm9yZ290dGVu IHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAiKyJjcmVhdG9yIChhcnJh eU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICIrInNoYXBl IGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4iLGNvbXBvbmVudE5hbWV8fCJSZWFjdCBjbGFzcyIs UmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dLHR5cGVTcGVjTmFtZSx0eXBlb2Yg ZXJyb3IpOnZvaWQgMDtpZihlcnJvciBpbnN0YW5jZW9mIEVycm9yJiYhKGVycm9yLm1lc3NhZ2Ug aW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSl7bG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yLm1lc3NhZ2Vd PXRydWU7dmFyIGNvbXBvbmVudFN0YWNrSW5mbz0iIjtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1 Y3Rpb24iKXtpZighUmVhY3RDb21wb25lbnRUcmVlSG9vayl7UmVhY3RDb21wb25lbnRUcmVlSG9v az1fZGVyZXFfKDEyMil9aWYoZGVidWdJRCE9PW51bGwpe2NvbXBvbmVudFN0YWNrSW5mbz1SZWFj dENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKGRlYnVnSUQpfWVsc2UgaWYo ZWxlbWVudCE9PW51bGwpe2NvbXBvbmVudFN0YWNrSW5mbz1SZWFjdENvbXBvbmVudFRyZWVIb29r LmdldEN1cnJlbnRTdGFja0FkZGVuZHVtKGVsZW1lbnQpfX0iZGV2ZWxvcG1lbnQiIT09InByb2R1 Y3Rpb24iP3dhcm5pbmcoZmFsc2UsIkZhaWxlZCAlcyB0eXBlOiAlcyVzIixsb2NhdGlvbixlcnJv ci5tZXNzYWdlLGNvbXBvbmVudFN0YWNrSW5mbyk6dm9pZCAwfX19fW1vZHVsZS5leHBvcnRzPWNo ZWNrUmVhY3RUeXBlU3BlY30pLmNhbGwodGhpcyx1bmRlZmluZWQpfSx7MTE2OjExNiwxMjI6MTIy LDE0MDoxNDAsMTQ3OjE0Nyw2NTo2NSw2Njo2Nn1dLDk4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVs ZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVu Y3Rpb249ZnVuY3Rpb24oZnVuYyl7aWYodHlwZW9mIE1TQXBwIT09InVuZGVmaW5lZCImJk1TQXBw LmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKXtyZXR1cm4gZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIs YXJnMyl7TVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24oKXtyZXR1cm4gZnVu YyhhcmcwLGFyZzEsYXJnMixhcmczKX0pfX1lbHNle3JldHVybiBmdW5jfX07bW9kdWxlLmV4cG9y dHM9Y3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbn0se31dLDk5OltmdW5jdGlvbihf ZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIENTU1Byb3BlcnR5PV9kZXJl cV8oNCk7dmFyIHdhcm5pbmc9X2RlcmVxXygxNDcpO3ZhciBpc1VuaXRsZXNzTnVtYmVyPUNTU1By b3BlcnR5LmlzVW5pdGxlc3NOdW1iZXI7dmFyIHN0eWxlV2FybmluZ3M9e307ZnVuY3Rpb24gZGFu Z2Vyb3VzU3R5bGVWYWx1ZShuYW1lLHZhbHVlLGNvbXBvbmVudCl7dmFyIGlzRW1wdHk9dmFsdWU9 PW51bGx8fHR5cGVvZiB2YWx1ZT09PSJib29sZWFuInx8dmFsdWU9PT0iIjtpZihpc0VtcHR5KXty ZXR1cm4iIn12YXIgaXNOb25OdW1lcmljPWlzTmFOKHZhbHVlKTtpZihpc05vbk51bWVyaWN8fHZh bHVlPT09MHx8aXNVbml0bGVzc051bWJlci5oYXNPd25Qcm9wZXJ0eShuYW1lKSYmaXNVbml0bGVz c051bWJlcltuYW1lXSl7cmV0dXJuIiIrdmFsdWV9aWYodHlwZW9mIHZhbHVlPT09InN0cmluZyIp e2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe2lmKGNvbXBvbmVudCYmdmFsdWUhPT0i MCIpe3ZhciBvd25lcj1jb21wb25lbnQuX2N1cnJlbnRFbGVtZW50Ll9vd25lcjt2YXIgb3duZXJO YW1lPW93bmVyP293bmVyLmdldE5hbWUoKTpudWxsO2lmKG93bmVyTmFtZSYmIXN0eWxlV2Fybmlu Z3Nbb3duZXJOYW1lXSl7c3R5bGVXYXJuaW5nc1tvd25lck5hbWVdPXt9fXZhciB3YXJuZWQ9ZmFs c2U7aWYob3duZXJOYW1lKXt2YXIgd2FybmluZ3M9c3R5bGVXYXJuaW5nc1tvd25lck5hbWVdO3dh cm5lZD13YXJuaW5nc1tuYW1lXTtpZighd2FybmVkKXt3YXJuaW5nc1tuYW1lXT10cnVlfX1pZigh d2FybmVkKXsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmcoZmFsc2UsImEgYCVz YCB0YWcgKG93bmVyOiBgJXNgKSB3YXMgcGFzc2VkIGEgbnVtZXJpYyBzdHJpbmcgdmFsdWUgIisi Zm9yIENTUyBwcm9wZXJ0eSBgJXNgICh2YWx1ZTogYCVzYCkgd2hpY2ggd2lsbCBiZSB0cmVhdGVk ICIrImFzIGEgdW5pdGxlc3MgbnVtYmVyIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgUmVhY3QuIixj b21wb25lbnQuX2N1cnJlbnRFbGVtZW50LnR5cGUsb3duZXJOYW1lfHwidW5rbm93biIsbmFtZSx2 YWx1ZSk6dm9pZCAwfX19dmFsdWU9dmFsdWUudHJpbSgpfXJldHVybiB2YWx1ZSsicHgifW1vZHVs ZS5leHBvcnRzPWRhbmdlcm91c1N0eWxlVmFsdWV9LHsxNDc6MTQ3LDQ6NH1dLDEwMDpbZnVuY3Rp b24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBtYXRjaEh0bWxSZWdF eHA9L1siJyY8Pl0vO2Z1bmN0aW9uIGVzY2FwZUh0bWwoc3RyaW5nKXt2YXIgc3RyPSIiK3N0cmlu Zzt2YXIgbWF0Y2g9bWF0Y2hIdG1sUmVnRXhwLmV4ZWMoc3RyKTtpZighbWF0Y2gpe3JldHVybiBz dHJ9dmFyIGVzY2FwZTt2YXIgaHRtbD0iIjt2YXIgaW5kZXg9MDt2YXIgbGFzdEluZGV4PTA7Zm9y KGluZGV4PW1hdGNoLmluZGV4O2luZGV4PHN0ci5sZW5ndGg7aW5kZXgrKyl7c3dpdGNoKHN0ci5j aGFyQ29kZUF0KGluZGV4KSl7Y2FzZSAzNDplc2NhcGU9IiZxdW90OyI7YnJlYWs7Y2FzZSAzODpl c2NhcGU9IiZhbXA7IjticmVhaztjYXNlIDM5OmVzY2FwZT0iJiN4Mjc7IjticmVhaztjYXNlIDYw OmVzY2FwZT0iJmx0OyI7YnJlYWs7Y2FzZSA2Mjplc2NhcGU9IiZndDsiO2JyZWFrO2RlZmF1bHQ6 Y29udGludWV9aWYobGFzdEluZGV4IT09aW5kZXgpe2h0bWwrPXN0ci5zdWJzdHJpbmcobGFzdElu ZGV4LGluZGV4KX1sYXN0SW5kZXg9aW5kZXgrMTtodG1sKz1lc2NhcGV9cmV0dXJuIGxhc3RJbmRl eCE9PWluZGV4P2h0bWwrc3RyLnN1YnN0cmluZyhsYXN0SW5kZXgsaW5kZXgpOmh0bWx9ZnVuY3Rp b24gZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyKHRleHQpe2lmKHR5cGVvZiB0ZXh0PT09ImJv b2xlYW4ifHx0eXBlb2YgdGV4dD09PSJudW1iZXIiKXtyZXR1cm4iIit0ZXh0fXJldHVybiBlc2Nh cGVIdG1sKHRleHQpfW1vZHVsZS5leHBvcnRzPWVzY2FwZVRleHRDb250ZW50Rm9yQnJvd3Nlcn0s e31dLDEwMTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9uKHByb2Nl c3MpeyJ1c2Ugc3RyaWN0Ijt2YXIgS2V5RXNjYXBlVXRpbHM9X2RlcmVxXygyMik7dmFyIHRyYXZl cnNlQWxsQ2hpbGRyZW49X2RlcmVxXygxMjApO3ZhciB3YXJuaW5nPV9kZXJlcV8oMTQ3KTt2YXIg UmVhY3RDb21wb25lbnRUcmVlSG9vaztpZih0eXBlb2YgcHJvY2VzcyE9PSJ1bmRlZmluZWQiJiZw cm9jZXNzLmVudiYmImRldmVsb3BtZW50Ij09PSJ0ZXN0Iil7UmVhY3RDb21wb25lbnRUcmVlSG9v az1fZGVyZXFfKDEyMil9ZnVuY3Rpb24gZmxhdHRlblNpbmdsZUNoaWxkSW50b0NvbnRleHQodHJh dmVyc2VDb250ZXh0LGNoaWxkLG5hbWUsc2VsZkRlYnVnSUQpe2lmKHRyYXZlcnNlQ29udGV4dCYm dHlwZW9mIHRyYXZlcnNlQ29udGV4dD09PSJvYmplY3QiKXt2YXIgcmVzdWx0PXRyYXZlcnNlQ29u dGV4dDt2YXIga2V5VW5pcXVlPXJlc3VsdFtuYW1lXT09PXVuZGVmaW5lZDtpZigiZGV2ZWxvcG1l bnQiIT09InByb2R1Y3Rpb24iKXtpZighUmVhY3RDb21wb25lbnRUcmVlSG9vayl7UmVhY3RDb21w b25lbnRUcmVlSG9vaz1fZGVyZXFfKDEyMil9aWYoIWtleVVuaXF1ZSl7ImRldmVsb3BtZW50IiE9 PSJwcm9kdWN0aW9uIj93YXJuaW5nKGZhbHNlLCJmbGF0dGVuQ2hpbGRyZW4oLi4uKTogRW5jb3Vu dGVyZWQgdHdvIGNoaWxkcmVuIHdpdGggdGhlIHNhbWUga2V5LCAiKyJgJXNgLiBDaGlsZCBrZXlz IG11c3QgYmUgdW5pcXVlOyB3aGVuIHR3byBjaGlsZHJlbiBzaGFyZSBhIGtleSwgb25seSAiKyJ0 aGUgZmlyc3QgY2hpbGQgd2lsbCBiZSB1c2VkLiVzIixLZXlFc2NhcGVVdGlscy51bmVzY2FwZShu YW1lKSxSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKHNlbGZEZWJ1 Z0lEKSk6dm9pZCAwfX1pZihrZXlVbmlxdWUmJmNoaWxkIT1udWxsKXtyZXN1bHRbbmFtZV09Y2hp bGR9fX1mdW5jdGlvbiBmbGF0dGVuQ2hpbGRyZW4oY2hpbGRyZW4sc2VsZkRlYnVnSUQpe2lmKGNo aWxkcmVuPT1udWxsKXtyZXR1cm4gY2hpbGRyZW59dmFyIHJlc3VsdD17fTtpZigiZGV2ZWxvcG1l bnQiIT09InByb2R1Y3Rpb24iKXt0cmF2ZXJzZUFsbENoaWxkcmVuKGNoaWxkcmVuLGZ1bmN0aW9u KHRyYXZlcnNlQ29udGV4dCxjaGlsZCxuYW1lKXtyZXR1cm4gZmxhdHRlblNpbmdsZUNoaWxkSW50 b0NvbnRleHQodHJhdmVyc2VDb250ZXh0LGNoaWxkLG5hbWUsc2VsZkRlYnVnSUQpfSxyZXN1bHQp fWVsc2V7dHJhdmVyc2VBbGxDaGlsZHJlbihjaGlsZHJlbixmbGF0dGVuU2luZ2xlQ2hpbGRJbnRv Q29udGV4dCxyZXN1bHQpfXJldHVybiByZXN1bHR9bW9kdWxlLmV4cG9ydHM9ZmxhdHRlbkNoaWxk cmVufSkuY2FsbCh0aGlzLHVuZGVmaW5lZCl9LHsxMjA6MTIwLDEyMjoxMjIsMTQ3OjE0NywyMjoy Mn1dLDEwMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO2Z1 bmN0aW9uIGZvckVhY2hBY2N1bXVsYXRlZChhcnIsY2Isc2NvcGUpe2lmKEFycmF5LmlzQXJyYXko YXJyKSl7YXJyLmZvckVhY2goY2Isc2NvcGUpfWVsc2UgaWYoYXJyKXtjYi5jYWxsKHNjb3BlLGFy cil9fW1vZHVsZS5leHBvcnRzPWZvckVhY2hBY2N1bXVsYXRlZH0se31dLDEwMzpbZnVuY3Rpb24o X2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGdldEV2ZW50Q2hh ckNvZGUobmF0aXZlRXZlbnQpe3ZhciBjaGFyQ29kZTt2YXIga2V5Q29kZT1uYXRpdmVFdmVudC5r ZXlDb2RlO2lmKCJjaGFyQ29kZSJpbiBuYXRpdmVFdmVudCl7Y2hhckNvZGU9bmF0aXZlRXZlbnQu Y2hhckNvZGU7aWYoY2hhckNvZGU9PT0wJiZrZXlDb2RlPT09MTMpe2NoYXJDb2RlPTEzfX1lbHNl e2NoYXJDb2RlPWtleUNvZGV9aWYoY2hhckNvZGU+PTMyfHxjaGFyQ29kZT09PTEzKXtyZXR1cm4g Y2hhckNvZGV9cmV0dXJuIDB9bW9kdWxlLmV4cG9ydHM9Z2V0RXZlbnRDaGFyQ29kZX0se31dLDEw NDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBnZXRF dmVudENoYXJDb2RlPV9kZXJlcV8oMTAzKTt2YXIgbm9ybWFsaXplS2V5PXtFc2M6IkVzY2FwZSIs U3BhY2ViYXI6IiAiLExlZnQ6IkFycm93TGVmdCIsVXA6IkFycm93VXAiLFJpZ2h0OiJBcnJvd1Jp Z2h0IixEb3duOiJBcnJvd0Rvd24iLERlbDoiRGVsZXRlIixXaW46Ik9TIixNZW51OiJDb250ZXh0 TWVudSIsQXBwczoiQ29udGV4dE1lbnUiLFNjcm9sbDoiU2Nyb2xsTG9jayIsTW96UHJpbnRhYmxl S2V5OiJVbmlkZW50aWZpZWQifTt2YXIgdHJhbnNsYXRlVG9LZXk9ezg6IkJhY2tzcGFjZSIsOToi VGFiIiwxMjoiQ2xlYXIiLDEzOiJFbnRlciIsMTY6IlNoaWZ0IiwxNzoiQ29udHJvbCIsMTg6IkFs dCIsMTk6IlBhdXNlIiwyMDoiQ2Fwc0xvY2siLDI3OiJFc2NhcGUiLDMyOiIgIiwzMzoiUGFnZVVw IiwzNDoiUGFnZURvd24iLDM1OiJFbmQiLDM2OiJIb21lIiwzNzoiQXJyb3dMZWZ0IiwzODoiQXJy b3dVcCIsMzk6IkFycm93UmlnaHQiLDQwOiJBcnJvd0Rvd24iLDQ1OiJJbnNlcnQiLDQ2OiJEZWxl dGUiLDExMjoiRjEiLDExMzoiRjIiLDExNDoiRjMiLDExNToiRjQiLDExNjoiRjUiLDExNzoiRjYi LDExODoiRjciLDExOToiRjgiLDEyMDoiRjkiLDEyMToiRjEwIiwxMjI6IkYxMSIsMTIzOiJGMTIi LDE0NDoiTnVtTG9jayIsMTQ1OiJTY3JvbGxMb2NrIiwyMjQ6Ik1ldGEifTtmdW5jdGlvbiBnZXRF dmVudEtleShuYXRpdmVFdmVudCl7aWYobmF0aXZlRXZlbnQua2V5KXt2YXIga2V5PW5vcm1hbGl6 ZUtleVtuYXRpdmVFdmVudC5rZXldfHxuYXRpdmVFdmVudC5rZXk7aWYoa2V5IT09IlVuaWRlbnRp ZmllZCIpe3JldHVybiBrZXl9fWlmKG5hdGl2ZUV2ZW50LnR5cGU9PT0ia2V5cHJlc3MiKXt2YXIg Y2hhckNvZGU9Z2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCk7cmV0dXJuIGNoYXJDb2RlPT09 MTM/IkVudGVyIjpTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKX1pZihuYXRpdmVFdmVudC50 eXBlPT09ImtleWRvd24ifHxuYXRpdmVFdmVudC50eXBlPT09ImtleXVwIil7cmV0dXJuIHRyYW5z bGF0ZVRvS2V5W25hdGl2ZUV2ZW50LmtleUNvZGVdfHwiVW5pZGVudGlmaWVkIn1yZXR1cm4iIn1t b2R1bGUuZXhwb3J0cz1nZXRFdmVudEtleX0sezEwMzoxMDN9XSwxMDU6W2Z1bmN0aW9uKF9kZXJl cV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgbW9kaWZpZXJLZXlUb1Byb3A9e0Fs dDoiYWx0S2V5IixDb250cm9sOiJjdHJsS2V5IixNZXRhOiJtZXRhS2V5IixTaGlmdDoic2hpZnRL ZXkifTtmdW5jdGlvbiBtb2RpZmllclN0YXRlR2V0dGVyKGtleUFyZyl7dmFyIHN5bnRoZXRpY0V2 ZW50PXRoaXM7dmFyIG5hdGl2ZUV2ZW50PXN5bnRoZXRpY0V2ZW50Lm5hdGl2ZUV2ZW50O2lmKG5h dGl2ZUV2ZW50LmdldE1vZGlmaWVyU3RhdGUpe3JldHVybiBuYXRpdmVFdmVudC5nZXRNb2RpZmll clN0YXRlKGtleUFyZyl9dmFyIGtleVByb3A9bW9kaWZpZXJLZXlUb1Byb3Bba2V5QXJnXTtyZXR1 cm4ga2V5UHJvcD8hIW5hdGl2ZUV2ZW50W2tleVByb3BdOmZhbHNlfWZ1bmN0aW9uIGdldEV2ZW50 TW9kaWZpZXJTdGF0ZShuYXRpdmVFdmVudCl7cmV0dXJuIG1vZGlmaWVyU3RhdGVHZXR0ZXJ9bW9k dWxlLmV4cG9ydHM9Z2V0RXZlbnRNb2RpZmllclN0YXRlfSx7fV0sMTA2OltmdW5jdGlvbihfZGVy ZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZ2V0RXZlbnRUYXJnZXQo bmF0aXZlRXZlbnQpe3ZhciB0YXJnZXQ9bmF0aXZlRXZlbnQudGFyZ2V0fHxuYXRpdmVFdmVudC5z cmNFbGVtZW50fHx3aW5kb3c7aWYodGFyZ2V0LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KXt0YXJn ZXQ9dGFyZ2V0LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50fXJldHVybiB0YXJnZXQubm9kZVR5cGU9 PT0zP3RhcmdldC5wYXJlbnROb2RlOnRhcmdldH1tb2R1bGUuZXhwb3J0cz1nZXRFdmVudFRhcmdl dH0se31dLDEwNzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3Qi O3ZhciBJVEVSQVRPUl9TWU1CT0w9dHlwZW9mIFN5bWJvbD09PSJmdW5jdGlvbiImJlN5bWJvbC5p dGVyYXRvcjt2YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0w9IkBAaXRlcmF0b3IiO2Z1bmN0aW9uIGdl dEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSl7dmFyIGl0ZXJhdG9yRm49bWF5YmVJdGVyYWJsZSYm KElURVJBVE9SX1NZTUJPTCYmbWF5YmVJdGVyYWJsZVtJVEVSQVRPUl9TWU1CT0xdfHxtYXliZUl0 ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXSk7aWYodHlwZW9mIGl0ZXJhdG9yRm49PT0iZnVu Y3Rpb24iKXtyZXR1cm4gaXRlcmF0b3JGbn19bW9kdWxlLmV4cG9ydHM9Z2V0SXRlcmF0b3JGbn0s e31dLDEwODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3Zh ciBuZXh0RGVidWdJRD0xO2Z1bmN0aW9uIGdldE5leHREZWJ1Z0lEKCl7cmV0dXJuIG5leHREZWJ1 Z0lEKyt9bW9kdWxlLmV4cG9ydHM9Z2V0TmV4dERlYnVnSUR9LHt9XSwxMDk6W2Z1bmN0aW9uKF9k ZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBnZXRMZWFmTm9kZShu b2RlKXt3aGlsZShub2RlJiZub2RlLmZpcnN0Q2hpbGQpe25vZGU9bm9kZS5maXJzdENoaWxkfXJl dHVybiBub2RlfWZ1bmN0aW9uIGdldFNpYmxpbmdOb2RlKG5vZGUpe3doaWxlKG5vZGUpe2lmKG5v ZGUubmV4dFNpYmxpbmcpe3JldHVybiBub2RlLm5leHRTaWJsaW5nfW5vZGU9bm9kZS5wYXJlbnRO b2RlfX1mdW5jdGlvbiBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KHJvb3Qsb2Zmc2V0KXt2YXIg bm9kZT1nZXRMZWFmTm9kZShyb290KTt2YXIgbm9kZVN0YXJ0PTA7dmFyIG5vZGVFbmQ9MDt3aGls ZShub2RlKXtpZihub2RlLm5vZGVUeXBlPT09Myl7bm9kZUVuZD1ub2RlU3RhcnQrbm9kZS50ZXh0 Q29udGVudC5sZW5ndGg7aWYobm9kZVN0YXJ0PD1vZmZzZXQmJm5vZGVFbmQ+PW9mZnNldCl7cmV0 dXJue25vZGU6bm9kZSxvZmZzZXQ6b2Zmc2V0LW5vZGVTdGFydH19bm9kZVN0YXJ0PW5vZGVFbmR9 bm9kZT1nZXRMZWFmTm9kZShnZXRTaWJsaW5nTm9kZShub2RlKSl9fW1vZHVsZS5leHBvcnRzPWdl dE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXR9LHt9XSwxMTA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxl LGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQ9X2RlcmVxXygx MjYpO3ZhciBjb250ZW50S2V5PW51bGw7ZnVuY3Rpb24gZ2V0VGV4dENvbnRlbnRBY2Nlc3Nvcigp e2lmKCFjb250ZW50S2V5JiZFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00pe2NvbnRlbnRL ZXk9InRleHRDb250ZW50ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudD8idGV4dENvbnRlbnQi OiJpbm5lclRleHQifXJldHVybiBjb250ZW50S2V5fW1vZHVsZS5leHBvcnRzPWdldFRleHRDb250 ZW50QWNjZXNzb3J9LHsxMjY6MTI2fV0sMTExOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBv cnRzKXsidXNlIHN0cmljdCI7dmFyIEV4ZWN1dGlvbkVudmlyb25tZW50PV9kZXJlcV8oMTI2KTtm dW5jdGlvbiBtYWtlUHJlZml4TWFwKHN0eWxlUHJvcCxldmVudE5hbWUpe3ZhciBwcmVmaXhlcz17 fTtwcmVmaXhlc1tzdHlsZVByb3AudG9Mb3dlckNhc2UoKV09ZXZlbnROYW1lLnRvTG93ZXJDYXNl KCk7cHJlZml4ZXNbIldlYmtpdCIrc3R5bGVQcm9wXT0id2Via2l0IitldmVudE5hbWU7cHJlZml4 ZXNbIk1veiIrc3R5bGVQcm9wXT0ibW96IitldmVudE5hbWU7cHJlZml4ZXNbIm1zIitzdHlsZVBy b3BdPSJNUyIrZXZlbnROYW1lO3ByZWZpeGVzWyJPIitzdHlsZVByb3BdPSJvIitldmVudE5hbWUu dG9Mb3dlckNhc2UoKTtyZXR1cm4gcHJlZml4ZXN9dmFyIHZlbmRvclByZWZpeGVzPXthbmltYXRp b25lbmQ6bWFrZVByZWZpeE1hcCgiQW5pbWF0aW9uIiwiQW5pbWF0aW9uRW5kIiksYW5pbWF0aW9u aXRlcmF0aW9uOm1ha2VQcmVmaXhNYXAoIkFuaW1hdGlvbiIsIkFuaW1hdGlvbkl0ZXJhdGlvbiIp LGFuaW1hdGlvbnN0YXJ0Om1ha2VQcmVmaXhNYXAoIkFuaW1hdGlvbiIsIkFuaW1hdGlvblN0YXJ0 IiksdHJhbnNpdGlvbmVuZDptYWtlUHJlZml4TWFwKCJUcmFuc2l0aW9uIiwiVHJhbnNpdGlvbkVu ZCIpfTt2YXIgcHJlZml4ZWRFdmVudE5hbWVzPXt9O3ZhciBzdHlsZT17fTtpZihFeGVjdXRpb25F bnZpcm9ubWVudC5jYW5Vc2VET00pe3N0eWxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIp LnN0eWxlO2lmKCEoIkFuaW1hdGlvbkV2ZW50ImluIHdpbmRvdykpe2RlbGV0ZSB2ZW5kb3JQcmVm aXhlcy5hbmltYXRpb25lbmQuYW5pbWF0aW9uO2RlbGV0ZSB2ZW5kb3JQcmVmaXhlcy5hbmltYXRp b25pdGVyYXRpb24uYW5pbWF0aW9uO2RlbGV0ZSB2ZW5kb3JQcmVmaXhlcy5hbmltYXRpb25zdGFy dC5hbmltYXRpb259aWYoISgiVHJhbnNpdGlvbkV2ZW50ImluIHdpbmRvdykpe2RlbGV0ZSB2ZW5k b3JQcmVmaXhlcy50cmFuc2l0aW9uZW5kLnRyYW5zaXRpb259fWZ1bmN0aW9uIGdldFZlbmRvclBy ZWZpeGVkRXZlbnROYW1lKGV2ZW50TmFtZSl7aWYocHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFt ZV0pe3JldHVybiBwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXX1lbHNlIGlmKCF2ZW5kb3JQ cmVmaXhlc1tldmVudE5hbWVdKXtyZXR1cm4gZXZlbnROYW1lfXZhciBwcmVmaXhNYXA9dmVuZG9y UHJlZml4ZXNbZXZlbnROYW1lXTtmb3IodmFyIHN0eWxlUHJvcCBpbiBwcmVmaXhNYXApe2lmKHBy ZWZpeE1hcC5oYXNPd25Qcm9wZXJ0eShzdHlsZVByb3ApJiZzdHlsZVByb3AgaW4gc3R5bGUpe3Jl dHVybiBwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXT1wcmVmaXhNYXBbc3R5bGVQcm9wXX19 cmV0dXJuIiJ9bW9kdWxlLmV4cG9ydHM9Z2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWV9LHsxMjY6 MTI2fV0sMTEyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7 dmFyIF9wcm9kSW52YXJpYW50PV9kZXJlcV8oMTE2KSxfYXNzaWduPV9kZXJlcV8oMTQ4KTt2YXIg UmVhY3RDb21wb3NpdGVDb21wb25lbnQ9X2RlcmVxXygyOSk7dmFyIFJlYWN0RW1wdHlDb21wb25l bnQ9X2RlcmVxXyg0OSk7dmFyIFJlYWN0SG9zdENvbXBvbmVudD1fZGVyZXFfKDU0KTt2YXIgZ2V0 TmV4dERlYnVnSUQ9X2RlcmVxXygxMDgpO3ZhciBpbnZhcmlhbnQ9X2RlcmVxXygxNDApO3ZhciB3 YXJuaW5nPV9kZXJlcV8oMTQ3KTt2YXIgUmVhY3RDb21wb3NpdGVDb21wb25lbnRXcmFwcGVyPWZ1 bmN0aW9uKGVsZW1lbnQpe3RoaXMuY29uc3RydWN0KGVsZW1lbnQpfTtfYXNzaWduKFJlYWN0Q29t cG9zaXRlQ29tcG9uZW50V3JhcHBlci5wcm90b3R5cGUsUmVhY3RDb21wb3NpdGVDb21wb25lbnQs e19pbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50Omluc3RhbnRpYXRlUmVhY3RDb21wb25lbnR9KTtm dW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0ob3duZXIpe2lmKG93bmVyKXt2YXIg bmFtZT1vd25lci5nZXROYW1lKCk7aWYobmFtZSl7cmV0dXJuIiBDaGVjayB0aGUgcmVuZGVyIG1l dGhvZCBvZiBgIituYW1lKyJgLiJ9fXJldHVybiIifWZ1bmN0aW9uIGlzSW50ZXJuYWxDb21wb25l bnRUeXBlKHR5cGUpe3JldHVybiB0eXBlb2YgdHlwZT09PSJmdW5jdGlvbiImJnR5cGVvZiB0eXBl LnByb3RvdHlwZSE9PSJ1bmRlZmluZWQiJiZ0eXBlb2YgdHlwZS5wcm90b3R5cGUubW91bnRDb21w b25lbnQ9PT0iZnVuY3Rpb24iJiZ0eXBlb2YgdHlwZS5wcm90b3R5cGUucmVjZWl2ZUNvbXBvbmVu dD09PSJmdW5jdGlvbiJ9ZnVuY3Rpb24gaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudChub2RlLHNo b3VsZEhhdmVEZWJ1Z0lEKXt2YXIgaW5zdGFuY2U7aWYobm9kZT09PW51bGx8fG5vZGU9PT1mYWxz ZSl7aW5zdGFuY2U9UmVhY3RFbXB0eUNvbXBvbmVudC5jcmVhdGUoaW5zdGFudGlhdGVSZWFjdENv bXBvbmVudCl9ZWxzZSBpZih0eXBlb2Ygbm9kZT09PSJvYmplY3QiKXt2YXIgZWxlbWVudD1ub2Rl O3ZhciB0eXBlPWVsZW1lbnQudHlwZTtpZih0eXBlb2YgdHlwZSE9PSJmdW5jdGlvbiImJnR5cGVv ZiB0eXBlIT09InN0cmluZyIpe3ZhciBpbmZvPSIiO2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVj dGlvbiIpe2lmKHR5cGU9PT11bmRlZmluZWR8fHR5cGVvZiB0eXBlPT09Im9iamVjdCImJnR5cGUh PT1udWxsJiZPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGg9PT0wKXtpbmZvKz0iIFlvdSBsaWtlbHkg Zm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICIrIml0J3MgZGVm aW5lZCBpbi4ifX1pbmZvKz1nZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oZWxlbWVudC5fb3du ZXIpOyFmYWxzZT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwi RWxlbWVudCB0eXBlIGlzIGludmFsaWQ6IGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgYnVpbHQtaW4g Y29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSBjb21wb25lbnRz KSBidXQgZ290OiAlcy4lcyIsdHlwZT09bnVsbD90eXBlOnR5cGVvZiB0eXBlLGluZm8pOl9wcm9k SW52YXJpYW50KCIxMzAiLHR5cGU9PW51bGw/dHlwZTp0eXBlb2YgdHlwZSxpbmZvKTp2b2lkIDB9 aWYodHlwZW9mIGVsZW1lbnQudHlwZT09PSJzdHJpbmciKXtpbnN0YW5jZT1SZWFjdEhvc3RDb21w b25lbnQuY3JlYXRlSW50ZXJuYWxDb21wb25lbnQoZWxlbWVudCl9ZWxzZSBpZihpc0ludGVybmFs Q29tcG9uZW50VHlwZShlbGVtZW50LnR5cGUpKXtpbnN0YW5jZT1uZXcgZWxlbWVudC50eXBlKGVs ZW1lbnQpO2lmKCFpbnN0YW5jZS5nZXRIb3N0Tm9kZSl7aW5zdGFuY2UuZ2V0SG9zdE5vZGU9aW5z dGFuY2UuZ2V0TmF0aXZlTm9kZX19ZWxzZXtpbnN0YW5jZT1uZXcgUmVhY3RDb21wb3NpdGVDb21w b25lbnRXcmFwcGVyKGVsZW1lbnQpfX1lbHNlIGlmKHR5cGVvZiBub2RlPT09InN0cmluZyJ8fHR5 cGVvZiBub2RlPT09Im51bWJlciIpe2luc3RhbmNlPVJlYWN0SG9zdENvbXBvbmVudC5jcmVhdGVJ bnN0YW5jZUZvclRleHQobm9kZSl9ZWxzZXshZmFsc2U/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0 aW9uIj9pbnZhcmlhbnQoZmFsc2UsIkVuY291bnRlcmVkIGludmFsaWQgUmVhY3Qgbm9kZSBvZiB0 eXBlICVzIix0eXBlb2Ygbm9kZSk6X3Byb2RJbnZhcmlhbnQoIjEzMSIsdHlwZW9mIG5vZGUpOnZv aWQgMH1pZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXsiZGV2ZWxvcG1lbnQiIT09InBy b2R1Y3Rpb24iP3dhcm5pbmcodHlwZW9mIGluc3RhbmNlLm1vdW50Q29tcG9uZW50PT09ImZ1bmN0 aW9uIiYmdHlwZW9mIGluc3RhbmNlLnJlY2VpdmVDb21wb25lbnQ9PT0iZnVuY3Rpb24iJiZ0eXBl b2YgaW5zdGFuY2UuZ2V0SG9zdE5vZGU9PT0iZnVuY3Rpb24iJiZ0eXBlb2YgaW5zdGFuY2UudW5t b3VudENvbXBvbmVudD09PSJmdW5jdGlvbiIsIk9ubHkgUmVhY3QgQ29tcG9uZW50cyBjYW4gYmUg bW91bnRlZC4iKTp2b2lkIDB9aW5zdGFuY2UuX21vdW50SW5kZXg9MDtpbnN0YW5jZS5fbW91bnRJ bWFnZT1udWxsO2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe2luc3RhbmNlLl9kZWJ1 Z0lEPXNob3VsZEhhdmVEZWJ1Z0lEP2dldE5leHREZWJ1Z0lEKCk6MH1pZigiZGV2ZWxvcG1lbnQi IT09InByb2R1Y3Rpb24iKXtpZihPYmplY3QucHJldmVudEV4dGVuc2lvbnMpe09iamVjdC5wcmV2 ZW50RXh0ZW5zaW9ucyhpbnN0YW5jZSl9fXJldHVybiBpbnN0YW5jZX1tb2R1bGUuZXhwb3J0cz1p bnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50fSx7MTA4OjEwOCwxMTY6MTE2LDE0MDoxNDAsMTQ3OjE0 NywxNDg6MTQ4LDI5OjI5LDQ5OjQ5LDU0OjU0fV0sMTEzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVs ZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIEV4ZWN1dGlvbkVudmlyb25tZW50PV9kZXJlcV8o MTI2KTt2YXIgdXNlSGFzRmVhdHVyZTtpZihFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00p e3VzZUhhc0ZlYXR1cmU9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24mJmRvY3VtZW50LmltcGxlbWVu dGF0aW9uLmhhc0ZlYXR1cmUmJmRvY3VtZW50LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoIiIs IiIpIT09dHJ1ZX1mdW5jdGlvbiBpc0V2ZW50U3VwcG9ydGVkKGV2ZW50TmFtZVN1ZmZpeCxjYXB0 dXJlKXtpZighRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NfHxjYXB0dXJlJiYhKCJhZGRF dmVudExpc3RlbmVyImluIGRvY3VtZW50KSl7cmV0dXJuIGZhbHNlfXZhciBldmVudE5hbWU9Im9u IitldmVudE5hbWVTdWZmaXg7dmFyIGlzU3VwcG9ydGVkPWV2ZW50TmFtZSBpbiBkb2N1bWVudDtp ZighaXNTdXBwb3J0ZWQpe3ZhciBlbGVtZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIp O2VsZW1lbnQuc2V0QXR0cmlidXRlKGV2ZW50TmFtZSwicmV0dXJuOyIpO2lzU3VwcG9ydGVkPXR5 cGVvZiBlbGVtZW50W2V2ZW50TmFtZV09PT0iZnVuY3Rpb24ifWlmKCFpc1N1cHBvcnRlZCYmdXNl SGFzRmVhdHVyZSYmZXZlbnROYW1lU3VmZml4PT09IndoZWVsIil7aXNTdXBwb3J0ZWQ9ZG9jdW1l bnQuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZSgiRXZlbnRzLndoZWVsIiwiMy4wIil9cmV0dXJu IGlzU3VwcG9ydGVkfW1vZHVsZS5leHBvcnRzPWlzRXZlbnRTdXBwb3J0ZWR9LHsxMjY6MTI2fV0s MTE0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIHN1 cHBvcnRlZElucHV0VHlwZXM9e2NvbG9yOnRydWUsZGF0ZTp0cnVlLGRhdGV0aW1lOnRydWUsImRh dGV0aW1lLWxvY2FsIjp0cnVlLGVtYWlsOnRydWUsbW9udGg6dHJ1ZSxudW1iZXI6dHJ1ZSxwYXNz d29yZDp0cnVlLHJhbmdlOnRydWUsc2VhcmNoOnRydWUsdGVsOnRydWUsdGV4dDp0cnVlLHRpbWU6 dHJ1ZSx1cmw6dHJ1ZSx3ZWVrOnRydWV9O2Z1bmN0aW9uIGlzVGV4dElucHV0RWxlbWVudChlbGVt KXt2YXIgbm9kZU5hbWU9ZWxlbSYmZWxlbS5ub2RlTmFtZSYmZWxlbS5ub2RlTmFtZS50b0xvd2Vy Q2FzZSgpO2lmKG5vZGVOYW1lPT09ImlucHV0Iil7cmV0dXJuISFzdXBwb3J0ZWRJbnB1dFR5cGVz W2VsZW0udHlwZV19aWYobm9kZU5hbWU9PT0idGV4dGFyZWEiKXtyZXR1cm4gdHJ1ZX1yZXR1cm4g ZmFsc2V9bW9kdWxlLmV4cG9ydHM9aXNUZXh0SW5wdXRFbGVtZW50fSx7fV0sMTE1OltmdW5jdGlv bihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIGVzY2FwZVRleHRDb250 ZW50Rm9yQnJvd3Nlcj1fZGVyZXFfKDEwMCk7ZnVuY3Rpb24gcXVvdGVBdHRyaWJ1dGVWYWx1ZUZv ckJyb3dzZXIodmFsdWUpe3JldHVybiciJytlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIodmFs dWUpKyciJ31tb2R1bGUuZXhwb3J0cz1xdW90ZUF0dHJpYnV0ZVZhbHVlRm9yQnJvd3Nlcn0sezEw MDoxMDB9XSwxMTY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0 IjtmdW5jdGlvbiByZWFjdFByb2RJbnZhcmlhbnQoY29kZSl7dmFyIGFyZ0NvdW50PWFyZ3VtZW50 cy5sZW5ndGgtMTt2YXIgbWVzc2FnZT0iTWluaWZpZWQgUmVhY3QgZXJyb3IgIyIrY29kZSsiOyB2 aXNpdCAiKyJodHRwOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvZXJyb3ItZGVjb2Rl ci5odG1sP2ludmFyaWFudD0iK2NvZGU7Zm9yKHZhciBhcmdJZHg9MDthcmdJZHg8YXJnQ291bnQ7 YXJnSWR4Kyspe21lc3NhZ2UrPSImYXJnc1tdPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3VtZW50 c1thcmdJZHgrMV0pfW1lc3NhZ2UrPSIgZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBu b24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IisiIGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRp b25hbCBoZWxwZnVsIHdhcm5pbmdzLiI7dmFyIGVycm9yPW5ldyBFcnJvcihtZXNzYWdlKTtlcnJv ci5uYW1lPSJJbnZhcmlhbnQgVmlvbGF0aW9uIjtlcnJvci5mcmFtZXNUb1BvcD0xO3Rocm93IGVy cm9yfW1vZHVsZS5leHBvcnRzPXJlYWN0UHJvZEludmFyaWFudH0se31dLDExNzpbZnVuY3Rpb24o X2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBFeGVjdXRpb25FbnZpcm9u bWVudD1fZGVyZXFfKDEyNik7dmFyIERPTU5hbWVzcGFjZXM9X2RlcmVxXygxMCk7dmFyIFdISVRF U1BBQ0VfVEVTVD0vXlsgXHJcblx0XGZdLzt2YXIgTk9OVklTSUJMRV9URVNUPS88KCEtLXxsaW5r fG5vc2NyaXB0fG1ldGF8c2NyaXB0fHN0eWxlKVsgXHJcblx0XGZcLz5dLzt2YXIgY3JlYXRlTWlj cm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbj1fZGVyZXFfKDk4KTt2YXIgcmV1c2FibGVTVkdDb250 YWluZXI7dmFyIHNldElubmVySFRNTD1jcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9u KGZ1bmN0aW9uKG5vZGUsaHRtbCl7aWYobm9kZS5uYW1lc3BhY2VVUkk9PT1ET01OYW1lc3BhY2Vz LnN2ZyYmISgiaW5uZXJIVE1MImluIG5vZGUpKXtyZXVzYWJsZVNWR0NvbnRhaW5lcj1yZXVzYWJs ZVNWR0NvbnRhaW5lcnx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV1c2FibGVTVkdD b250YWluZXIuaW5uZXJIVE1MPSI8c3ZnPiIraHRtbCsiPC9zdmc+Ijt2YXIgc3ZnTm9kZT1yZXVz YWJsZVNWR0NvbnRhaW5lci5maXJzdENoaWxkO3doaWxlKHN2Z05vZGUuZmlyc3RDaGlsZCl7bm9k ZS5hcHBlbmRDaGlsZChzdmdOb2RlLmZpcnN0Q2hpbGQpfX1lbHNle25vZGUuaW5uZXJIVE1MPWh0 bWx9fSk7aWYoRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NKXt2YXIgdGVzdEVsZW1lbnQ9 ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGVzdEVsZW1lbnQuaW5uZXJIVE1MPSIgIjtp Zih0ZXN0RWxlbWVudC5pbm5lckhUTUw9PT0iIil7c2V0SW5uZXJIVE1MPWZ1bmN0aW9uKG5vZGUs aHRtbCl7aWYobm9kZS5wYXJlbnROb2RlKXtub2RlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5v ZGUsbm9kZSl9aWYoV0hJVEVTUEFDRV9URVNULnRlc3QoaHRtbCl8fGh0bWxbMF09PT0iPCImJk5P TlZJU0lCTEVfVEVTVC50ZXN0KGh0bWwpKXtub2RlLmlubmVySFRNTD1TdHJpbmcuZnJvbUNoYXJD b2RlKDY1Mjc5KStodG1sO3ZhciB0ZXh0Tm9kZT1ub2RlLmZpcnN0Q2hpbGQ7aWYodGV4dE5vZGUu ZGF0YS5sZW5ndGg9PT0xKXtub2RlLnJlbW92ZUNoaWxkKHRleHROb2RlKX1lbHNle3RleHROb2Rl LmRlbGV0ZURhdGEoMCwxKX19ZWxzZXtub2RlLmlubmVySFRNTD1odG1sfX19dGVzdEVsZW1lbnQ9 bnVsbH1tb2R1bGUuZXhwb3J0cz1zZXRJbm5lckhUTUx9LHsxMDoxMCwxMjY6MTI2LDk4Ojk4fV0s MTE4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIEV4 ZWN1dGlvbkVudmlyb25tZW50PV9kZXJlcV8oMTI2KTt2YXIgZXNjYXBlVGV4dENvbnRlbnRGb3JC cm93c2VyPV9kZXJlcV8oMTAwKTt2YXIgc2V0SW5uZXJIVE1MPV9kZXJlcV8oMTE3KTt2YXIgc2V0 VGV4dENvbnRlbnQ9ZnVuY3Rpb24obm9kZSx0ZXh0KXtpZih0ZXh0KXt2YXIgZmlyc3RDaGlsZD1u b2RlLmZpcnN0Q2hpbGQ7aWYoZmlyc3RDaGlsZCYmZmlyc3RDaGlsZD09PW5vZGUubGFzdENoaWxk JiZmaXJzdENoaWxkLm5vZGVUeXBlPT09Myl7Zmlyc3RDaGlsZC5ub2RlVmFsdWU9dGV4dDtyZXR1 cm59fW5vZGUudGV4dENvbnRlbnQ9dGV4dH07aWYoRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNl RE9NKXtpZighKCJ0ZXh0Q29udGVudCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKXtzZXRU ZXh0Q29udGVudD1mdW5jdGlvbihub2RlLHRleHQpe2lmKG5vZGUubm9kZVR5cGU9PT0zKXtub2Rl Lm5vZGVWYWx1ZT10ZXh0O3JldHVybn1zZXRJbm5lckhUTUwobm9kZSxlc2NhcGVUZXh0Q29udGVu dEZvckJyb3dzZXIodGV4dCkpfX19bW9kdWxlLmV4cG9ydHM9c2V0VGV4dENvbnRlbnR9LHsxMDA6 MTAwLDExNzoxMTcsMTI2OjEyNn1dLDExOTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0 cyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHNob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50KHByZXZF bGVtZW50LG5leHRFbGVtZW50KXt2YXIgcHJldkVtcHR5PXByZXZFbGVtZW50PT09bnVsbHx8cHJl dkVsZW1lbnQ9PT1mYWxzZTt2YXIgbmV4dEVtcHR5PW5leHRFbGVtZW50PT09bnVsbHx8bmV4dEVs ZW1lbnQ9PT1mYWxzZTtpZihwcmV2RW1wdHl8fG5leHRFbXB0eSl7cmV0dXJuIHByZXZFbXB0eT09 PW5leHRFbXB0eX12YXIgcHJldlR5cGU9dHlwZW9mIHByZXZFbGVtZW50O3ZhciBuZXh0VHlwZT10 eXBlb2YgbmV4dEVsZW1lbnQ7aWYocHJldlR5cGU9PT0ic3RyaW5nInx8cHJldlR5cGU9PT0ibnVt YmVyIil7cmV0dXJuIG5leHRUeXBlPT09InN0cmluZyJ8fG5leHRUeXBlPT09Im51bWJlciJ9ZWxz ZXtyZXR1cm4gbmV4dFR5cGU9PT0ib2JqZWN0IiYmcHJldkVsZW1lbnQudHlwZT09PW5leHRFbGVt ZW50LnR5cGUmJnByZXZFbGVtZW50LmtleT09PW5leHRFbGVtZW50LmtleX19bW9kdWxlLmV4cG9y dHM9c2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnR9LHt9XSwxMjA6W2Z1bmN0aW9uKF9kZXJlcV8s bW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgX3Byb2RJbnZhcmlhbnQ9X2RlcmVxXygx MTYpO3ZhciBSZWFjdEN1cnJlbnRPd25lcj1fZGVyZXFfKDEyMyk7dmFyIFJFQUNUX0VMRU1FTlRf VFlQRT1fZGVyZXFfKDQ4KTt2YXIgZ2V0SXRlcmF0b3JGbj1fZGVyZXFfKDEwNyk7dmFyIGludmFy aWFudD1fZGVyZXFfKDE0MCk7dmFyIEtleUVzY2FwZVV0aWxzPV9kZXJlcV8oMjIpO3ZhciB3YXJu aW5nPV9kZXJlcV8oMTQ3KTt2YXIgU0VQQVJBVE9SPSIuIjt2YXIgU1VCU0VQQVJBVE9SPSI6Ijt2 YXIgZGlkV2FybkFib3V0TWFwcz1mYWxzZTtmdW5jdGlvbiBnZXRDb21wb25lbnRLZXkoY29tcG9u ZW50LGluZGV4KXtpZihjb21wb25lbnQmJnR5cGVvZiBjb21wb25lbnQ9PT0ib2JqZWN0IiYmY29t cG9uZW50LmtleSE9bnVsbCl7cmV0dXJuIEtleUVzY2FwZVV0aWxzLmVzY2FwZShjb21wb25lbnQu a2V5KX1yZXR1cm4gaW5kZXgudG9TdHJpbmcoMzYpfWZ1bmN0aW9uIHRyYXZlcnNlQWxsQ2hpbGRy ZW5JbXBsKGNoaWxkcmVuLG5hbWVTb0ZhcixjYWxsYmFjayx0cmF2ZXJzZUNvbnRleHQpe3ZhciB0 eXBlPXR5cGVvZiBjaGlsZHJlbjtpZih0eXBlPT09InVuZGVmaW5lZCJ8fHR5cGU9PT0iYm9vbGVh biIpe2NoaWxkcmVuPW51bGx9aWYoY2hpbGRyZW49PT1udWxsfHx0eXBlPT09InN0cmluZyJ8fHR5 cGU9PT0ibnVtYmVyInx8dHlwZT09PSJvYmplY3QiJiZjaGlsZHJlbi4kJHR5cGVvZj09PVJFQUNU X0VMRU1FTlRfVFlQRSl7Y2FsbGJhY2sodHJhdmVyc2VDb250ZXh0LGNoaWxkcmVuLG5hbWVTb0Zh cj09PSIiP1NFUEFSQVRPUitnZXRDb21wb25lbnRLZXkoY2hpbGRyZW4sMCk6bmFtZVNvRmFyKTty ZXR1cm4gMX12YXIgY2hpbGQ7dmFyIG5leHROYW1lO3ZhciBzdWJ0cmVlQ291bnQ9MDt2YXIgbmV4 dE5hbWVQcmVmaXg9bmFtZVNvRmFyPT09IiI/U0VQQVJBVE9SOm5hbWVTb0ZhcitTVUJTRVBBUkFU T1I7aWYoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpe2Zvcih2YXIgaT0wO2k8Y2hpbGRyZW4ubGVu Z3RoO2krKyl7Y2hpbGQ9Y2hpbGRyZW5baV07bmV4dE5hbWU9bmV4dE5hbWVQcmVmaXgrZ2V0Q29t cG9uZW50S2V5KGNoaWxkLGkpO3N1YnRyZWVDb3VudCs9dHJhdmVyc2VBbGxDaGlsZHJlbkltcGwo Y2hpbGQsbmV4dE5hbWUsY2FsbGJhY2ssdHJhdmVyc2VDb250ZXh0KX19ZWxzZXt2YXIgaXRlcmF0 b3JGbj1nZXRJdGVyYXRvckZuKGNoaWxkcmVuKTtpZihpdGVyYXRvckZuKXt2YXIgaXRlcmF0b3I9 aXRlcmF0b3JGbi5jYWxsKGNoaWxkcmVuKTt2YXIgc3RlcDtpZihpdGVyYXRvckZuIT09Y2hpbGRy ZW4uZW50cmllcyl7dmFyIGlpPTA7d2hpbGUoIShzdGVwPWl0ZXJhdG9yLm5leHQoKSkuZG9uZSl7 Y2hpbGQ9c3RlcC52YWx1ZTtuZXh0TmFtZT1uZXh0TmFtZVByZWZpeCtnZXRDb21wb25lbnRLZXko Y2hpbGQsaWkrKyk7c3VidHJlZUNvdW50Kz10cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZCxu ZXh0TmFtZSxjYWxsYmFjayx0cmF2ZXJzZUNvbnRleHQpfX1lbHNle2lmKCJkZXZlbG9wbWVudCIh PT0icHJvZHVjdGlvbiIpe3ZhciBtYXBzQXNDaGlsZHJlbkFkZGVuZHVtPSIiO2lmKFJlYWN0Q3Vy cmVudE93bmVyLmN1cnJlbnQpe3ZhciBtYXBzQXNDaGlsZHJlbk93bmVyTmFtZT1SZWFjdEN1cnJl bnRPd25lci5jdXJyZW50LmdldE5hbWUoKTtpZihtYXBzQXNDaGlsZHJlbk93bmVyTmFtZSl7bWFw c0FzQ2hpbGRyZW5BZGRlbmR1bT0iIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAiK21hcHNB c0NoaWxkcmVuT3duZXJOYW1lKyJgLiJ9fSJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2Fy bmluZyhkaWRXYXJuQWJvdXRNYXBzLCJVc2luZyBNYXBzIGFzIGNoaWxkcmVuIGlzIG5vdCB5ZXQg ZnVsbHkgc3VwcG9ydGVkLiBJdCBpcyBhbiAiKyJleHBlcmltZW50YWwgZmVhdHVyZSB0aGF0IG1p Z2h0IGJlIHJlbW92ZWQuIENvbnZlcnQgaXQgdG8gYSAiKyJzZXF1ZW5jZSAvIGl0ZXJhYmxlIG9m IGtleWVkIFJlYWN0RWxlbWVudHMgaW5zdGVhZC4lcyIsbWFwc0FzQ2hpbGRyZW5BZGRlbmR1bSk6 dm9pZCAwO2RpZFdhcm5BYm91dE1hcHM9dHJ1ZX13aGlsZSghKHN0ZXA9aXRlcmF0b3IubmV4dCgp KS5kb25lKXt2YXIgZW50cnk9c3RlcC52YWx1ZTtpZihlbnRyeSl7Y2hpbGQ9ZW50cnlbMV07bmV4 dE5hbWU9bmV4dE5hbWVQcmVmaXgrS2V5RXNjYXBlVXRpbHMuZXNjYXBlKGVudHJ5WzBdKStTVUJT RVBBUkFUT1IrZ2V0Q29tcG9uZW50S2V5KGNoaWxkLDApO3N1YnRyZWVDb3VudCs9dHJhdmVyc2VB bGxDaGlsZHJlbkltcGwoY2hpbGQsbmV4dE5hbWUsY2FsbGJhY2ssdHJhdmVyc2VDb250ZXh0KX19 fX1lbHNlIGlmKHR5cGU9PT0ib2JqZWN0Iil7dmFyIGFkZGVuZHVtPSIiO2lmKCJkZXZlbG9wbWVu dCIhPT0icHJvZHVjdGlvbiIpe2FkZGVuZHVtPSIgSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNv bGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSAiKyJpbnN0ZWFkIG9yIHdyYXAgdGhl IG9iamVjdCB1c2luZyBjcmVhdGVGcmFnbWVudChvYmplY3QpIGZyb20gdGhlICIrIlJlYWN0IGFk ZC1vbnMuIjtpZihjaGlsZHJlbi5faXNSZWFjdEVsZW1lbnQpe2FkZGVuZHVtPSIgSXQgbG9va3Mg bGlrZSB5b3UncmUgdXNpbmcgYW4gZWxlbWVudCBjcmVhdGVkIGJ5IGEgZGlmZmVyZW50ICIrInZl cnNpb24gb2YgUmVhY3QuIE1ha2Ugc3VyZSB0byB1c2Ugb25seSBvbmUgY29weSBvZiBSZWFjdC4i fWlmKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpe3ZhciBuYW1lPVJlYWN0Q3VycmVudE93bmVy LmN1cnJlbnQuZ2V0TmFtZSgpO2lmKG5hbWUpe2FkZGVuZHVtKz0iIENoZWNrIHRoZSByZW5kZXIg bWV0aG9kIG9mIGAiK25hbWUrImAuIn19fXZhciBjaGlsZHJlblN0cmluZz1TdHJpbmcoY2hpbGRy ZW4pOyFmYWxzZT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwi T2JqZWN0cyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQgKGZvdW5kOiAlcykuJXMiLGNo aWxkcmVuU3RyaW5nPT09IltvYmplY3QgT2JqZWN0XSI/Im9iamVjdCB3aXRoIGtleXMgeyIrT2Jq ZWN0LmtleXMoY2hpbGRyZW4pLmpvaW4oIiwgIikrIn0iOmNoaWxkcmVuU3RyaW5nLGFkZGVuZHVt KTpfcHJvZEludmFyaWFudCgiMzEiLGNoaWxkcmVuU3RyaW5nPT09IltvYmplY3QgT2JqZWN0XSI/ Im9iamVjdCB3aXRoIGtleXMgeyIrT2JqZWN0LmtleXMoY2hpbGRyZW4pLmpvaW4oIiwgIikrIn0i OmNoaWxkcmVuU3RyaW5nLGFkZGVuZHVtKTp2b2lkIDB9fXJldHVybiBzdWJ0cmVlQ291bnR9ZnVu Y3Rpb24gdHJhdmVyc2VBbGxDaGlsZHJlbihjaGlsZHJlbixjYWxsYmFjayx0cmF2ZXJzZUNvbnRl eHQpe2lmKGNoaWxkcmVuPT1udWxsKXtyZXR1cm4gMH1yZXR1cm4gdHJhdmVyc2VBbGxDaGlsZHJl bkltcGwoY2hpbGRyZW4sIiIsY2FsbGJhY2ssdHJhdmVyc2VDb250ZXh0KX1tb2R1bGUuZXhwb3J0 cz10cmF2ZXJzZUFsbENoaWxkcmVufSx7MTA3OjEwNywxMTY6MTE2LDEyMzoxMjMsMTQwOjE0MCwx NDc6MTQ3LDIyOjIyLDQ4OjQ4fV0sMTIxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRz KXsidXNlIHN0cmljdCI7dmFyIF9hc3NpZ249X2RlcmVxXygxNDgpO3ZhciBlbXB0eUZ1bmN0aW9u PV9kZXJlcV8oMTMyKTt2YXIgd2FybmluZz1fZGVyZXFfKDE0Nyk7dmFyIHZhbGlkYXRlRE9NTmVz dGluZz1lbXB0eUZ1bmN0aW9uO2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe3ZhciBz cGVjaWFsVGFncz1bImFkZHJlc3MiLCJhcHBsZXQiLCJhcmVhIiwiYXJ0aWNsZSIsImFzaWRlIiwi YmFzZSIsImJhc2Vmb250IiwiYmdzb3VuZCIsImJsb2NrcXVvdGUiLCJib2R5IiwiYnIiLCJidXR0 b24iLCJjYXB0aW9uIiwiY2VudGVyIiwiY29sIiwiY29sZ3JvdXAiLCJkZCIsImRldGFpbHMiLCJk aXIiLCJkaXYiLCJkbCIsImR0IiwiZW1iZWQiLCJmaWVsZHNldCIsImZpZ2NhcHRpb24iLCJmaWd1 cmUiLCJmb290ZXIiLCJmb3JtIiwiZnJhbWUiLCJmcmFtZXNldCIsImgxIiwiaDIiLCJoMyIsImg0 IiwiaDUiLCJoNiIsImhlYWQiLCJoZWFkZXIiLCJoZ3JvdXAiLCJociIsImh0bWwiLCJpZnJhbWUi LCJpbWciLCJpbnB1dCIsImlzaW5kZXgiLCJsaSIsImxpbmsiLCJsaXN0aW5nIiwibWFpbiIsIm1h cnF1ZWUiLCJtZW51IiwibWVudWl0ZW0iLCJtZXRhIiwibmF2Iiwibm9lbWJlZCIsIm5vZnJhbWVz Iiwibm9zY3JpcHQiLCJvYmplY3QiLCJvbCIsInAiLCJwYXJhbSIsInBsYWludGV4dCIsInByZSIs InNjcmlwdCIsInNlY3Rpb24iLCJzZWxlY3QiLCJzb3VyY2UiLCJzdHlsZSIsInN1bW1hcnkiLCJ0 YWJsZSIsInRib2R5IiwidGQiLCJ0ZW1wbGF0ZSIsInRleHRhcmVhIiwidGZvb3QiLCJ0aCIsInRo ZWFkIiwidGl0bGUiLCJ0ciIsInRyYWNrIiwidWwiLCJ3YnIiLCJ4bXAiXTt2YXIgaW5TY29wZVRh Z3M9WyJhcHBsZXQiLCJjYXB0aW9uIiwiaHRtbCIsInRhYmxlIiwidGQiLCJ0aCIsIm1hcnF1ZWUi LCJvYmplY3QiLCJ0ZW1wbGF0ZSIsImZvcmVpZ25PYmplY3QiLCJkZXNjIiwidGl0bGUiXTt2YXIg YnV0dG9uU2NvcGVUYWdzPWluU2NvcGVUYWdzLmNvbmNhdChbImJ1dHRvbiJdKTt2YXIgaW1wbGll ZEVuZFRhZ3M9WyJkZCIsImR0IiwibGkiLCJvcHRpb24iLCJvcHRncm91cCIsInAiLCJycCIsInJ0 Il07dmFyIGVtcHR5QW5jZXN0b3JJbmZvPXtjdXJyZW50Om51bGwsZm9ybVRhZzpudWxsLGFUYWdJ blNjb3BlOm51bGwsYnV0dG9uVGFnSW5TY29wZTpudWxsLG5vYnJUYWdJblNjb3BlOm51bGwscFRh Z0luQnV0dG9uU2NvcGU6bnVsbCxsaXN0SXRlbVRhZ0F1dG9jbG9zaW5nOm51bGwsZGxJdGVtVGFn QXV0b2Nsb3Npbmc6bnVsbH07dmFyIHVwZGF0ZWRBbmNlc3RvckluZm89ZnVuY3Rpb24ob2xkSW5m byx0YWcsaW5zdGFuY2Upe3ZhciBhbmNlc3RvckluZm89X2Fzc2lnbih7fSxvbGRJbmZvfHxlbXB0 eUFuY2VzdG9ySW5mbyk7dmFyIGluZm89e3RhZzp0YWcsaW5zdGFuY2U6aW5zdGFuY2V9O2lmKGlu U2NvcGVUYWdzLmluZGV4T2YodGFnKSE9PS0xKXthbmNlc3RvckluZm8uYVRhZ0luU2NvcGU9bnVs bDthbmNlc3RvckluZm8uYnV0dG9uVGFnSW5TY29wZT1udWxsO2FuY2VzdG9ySW5mby5ub2JyVGFn SW5TY29wZT1udWxsfWlmKGJ1dHRvblNjb3BlVGFncy5pbmRleE9mKHRhZykhPT0tMSl7YW5jZXN0 b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlPW51bGx9aWYoc3BlY2lhbFRhZ3MuaW5kZXhPZih0YWcp IT09LTEmJnRhZyE9PSJhZGRyZXNzIiYmdGFnIT09ImRpdiImJnRhZyE9PSJwIil7YW5jZXN0b3JJ bmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3Npbmc9bnVsbDthbmNlc3RvckluZm8uZGxJdGVtVGFnQXV0 b2Nsb3Npbmc9bnVsbH1hbmNlc3RvckluZm8uY3VycmVudD1pbmZvO2lmKHRhZz09PSJmb3JtIil7 YW5jZXN0b3JJbmZvLmZvcm1UYWc9aW5mb31pZih0YWc9PT0iYSIpe2FuY2VzdG9ySW5mby5hVGFn SW5TY29wZT1pbmZvfWlmKHRhZz09PSJidXR0b24iKXthbmNlc3RvckluZm8uYnV0dG9uVGFnSW5T Y29wZT1pbmZvfWlmKHRhZz09PSJub2JyIil7YW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlPWlu Zm99aWYodGFnPT09InAiKXthbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGU9aW5mb31pZih0 YWc9PT0ibGkiKXthbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZz1pbmZvfWlmKHRh Zz09PSJkZCJ8fHRhZz09PSJkdCIpe2FuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZz1p bmZvfXJldHVybiBhbmNlc3RvckluZm99O3ZhciBpc1RhZ1ZhbGlkV2l0aFBhcmVudD1mdW5jdGlv bih0YWcscGFyZW50VGFnKXtzd2l0Y2gocGFyZW50VGFnKXtjYXNlInNlbGVjdCI6cmV0dXJuIHRh Zz09PSJvcHRpb24ifHx0YWc9PT0ib3B0Z3JvdXAifHx0YWc9PT0iI3RleHQiO2Nhc2Uib3B0Z3Jv dXAiOnJldHVybiB0YWc9PT0ib3B0aW9uInx8dGFnPT09IiN0ZXh0IjtjYXNlIm9wdGlvbiI6cmV0 dXJuIHRhZz09PSIjdGV4dCI7Y2FzZSJ0ciI6cmV0dXJuIHRhZz09PSJ0aCJ8fHRhZz09PSJ0ZCJ8 fHRhZz09PSJzdHlsZSJ8fHRhZz09PSJzY3JpcHQifHx0YWc9PT0idGVtcGxhdGUiO2Nhc2UidGJv ZHkiOmNhc2UidGhlYWQiOmNhc2UidGZvb3QiOnJldHVybiB0YWc9PT0idHIifHx0YWc9PT0ic3R5 bGUifHx0YWc9PT0ic2NyaXB0Inx8dGFnPT09InRlbXBsYXRlIjtjYXNlImNvbGdyb3VwIjpyZXR1 cm4gdGFnPT09ImNvbCJ8fHRhZz09PSJ0ZW1wbGF0ZSI7Y2FzZSJ0YWJsZSI6cmV0dXJuIHRhZz09 PSJjYXB0aW9uInx8dGFnPT09ImNvbGdyb3VwInx8dGFnPT09InRib2R5Inx8dGFnPT09InRmb290 Inx8dGFnPT09InRoZWFkInx8dGFnPT09InN0eWxlInx8dGFnPT09InNjcmlwdCJ8fHRhZz09PSJ0 ZW1wbGF0ZSI7Y2FzZSJoZWFkIjpyZXR1cm4gdGFnPT09ImJhc2UifHx0YWc9PT0iYmFzZWZvbnQi fHx0YWc9PT0iYmdzb3VuZCJ8fHRhZz09PSJsaW5rInx8dGFnPT09Im1ldGEifHx0YWc9PT0idGl0 bGUifHx0YWc9PT0ibm9zY3JpcHQifHx0YWc9PT0ibm9mcmFtZXMifHx0YWc9PT0ic3R5bGUifHx0 YWc9PT0ic2NyaXB0Inx8dGFnPT09InRlbXBsYXRlIjtjYXNlImh0bWwiOnJldHVybiB0YWc9PT0i aGVhZCJ8fHRhZz09PSJib2R5IjtjYXNlIiNkb2N1bWVudCI6cmV0dXJuIHRhZz09PSJodG1sIn1z d2l0Y2godGFnKXtjYXNlImgxIjpjYXNlImgyIjpjYXNlImgzIjpjYXNlImg0IjpjYXNlImg1Ijpj YXNlImg2IjpyZXR1cm4gcGFyZW50VGFnIT09ImgxIiYmcGFyZW50VGFnIT09ImgyIiYmcGFyZW50 VGFnIT09ImgzIiYmcGFyZW50VGFnIT09Img0IiYmcGFyZW50VGFnIT09Img1IiYmcGFyZW50VGFn IT09Img2IjtjYXNlInJwIjpjYXNlInJ0IjpyZXR1cm4gaW1wbGllZEVuZFRhZ3MuaW5kZXhPZihw YXJlbnRUYWcpPT09LTE7Y2FzZSJib2R5IjpjYXNlImNhcHRpb24iOmNhc2UiY29sIjpjYXNlImNv bGdyb3VwIjpjYXNlImZyYW1lIjpjYXNlImhlYWQiOmNhc2UiaHRtbCI6Y2FzZSJ0Ym9keSI6Y2Fz ZSJ0ZCI6Y2FzZSJ0Zm9vdCI6Y2FzZSJ0aCI6Y2FzZSJ0aGVhZCI6Y2FzZSJ0ciI6cmV0dXJuIHBh cmVudFRhZz09bnVsbH1yZXR1cm4gdHJ1ZX07dmFyIGZpbmRJbnZhbGlkQW5jZXN0b3JGb3JUYWc9 ZnVuY3Rpb24odGFnLGFuY2VzdG9ySW5mbyl7c3dpdGNoKHRhZyl7Y2FzZSJhZGRyZXNzIjpjYXNl ImFydGljbGUiOmNhc2UiYXNpZGUiOmNhc2UiYmxvY2txdW90ZSI6Y2FzZSJjZW50ZXIiOmNhc2Ui ZGV0YWlscyI6Y2FzZSJkaWFsb2ciOmNhc2UiZGlyIjpjYXNlImRpdiI6Y2FzZSJkbCI6Y2FzZSJm aWVsZHNldCI6Y2FzZSJmaWdjYXB0aW9uIjpjYXNlImZpZ3VyZSI6Y2FzZSJmb290ZXIiOmNhc2Ui aGVhZGVyIjpjYXNlImhncm91cCI6Y2FzZSJtYWluIjpjYXNlIm1lbnUiOmNhc2UibmF2IjpjYXNl Im9sIjpjYXNlInAiOmNhc2Uic2VjdGlvbiI6Y2FzZSJzdW1tYXJ5IjpjYXNlInVsIjpjYXNlInBy ZSI6Y2FzZSJsaXN0aW5nIjpjYXNlInRhYmxlIjpjYXNlImhyIjpjYXNlInhtcCI6Y2FzZSJoMSI6 Y2FzZSJoMiI6Y2FzZSJoMyI6Y2FzZSJoNCI6Y2FzZSJoNSI6Y2FzZSJoNiI6cmV0dXJuIGFuY2Vz dG9ySW5mby5wVGFnSW5CdXR0b25TY29wZTtjYXNlImZvcm0iOnJldHVybiBhbmNlc3RvckluZm8u Zm9ybVRhZ3x8YW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlO2Nhc2UibGkiOnJldHVybiBh bmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZztjYXNlImRkIjpjYXNlImR0IjpyZXR1 cm4gYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nO2Nhc2UiYnV0dG9uIjpyZXR1cm4g YW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGU7Y2FzZSJhIjpyZXR1cm4gYW5jZXN0b3JJbmZv LmFUYWdJblNjb3BlO2Nhc2Uibm9iciI6cmV0dXJuIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29w ZX1yZXR1cm4gbnVsbH07dmFyIGZpbmRPd25lclN0YWNrPWZ1bmN0aW9uKGluc3RhbmNlKXtpZigh aW5zdGFuY2Upe3JldHVybltdfXZhciBzdGFjaz1bXTtkb3tzdGFjay5wdXNoKGluc3RhbmNlKX13 aGlsZShpbnN0YW5jZT1pbnN0YW5jZS5fY3VycmVudEVsZW1lbnQuX293bmVyKTtzdGFjay5yZXZl cnNlKCk7cmV0dXJuIHN0YWNrfTt2YXIgZGlkV2Fybj17fTt2YWxpZGF0ZURPTU5lc3Rpbmc9ZnVu Y3Rpb24oY2hpbGRUYWcsY2hpbGRUZXh0LGNoaWxkSW5zdGFuY2UsYW5jZXN0b3JJbmZvKXthbmNl c3RvckluZm89YW5jZXN0b3JJbmZvfHxlbXB0eUFuY2VzdG9ySW5mbzt2YXIgcGFyZW50SW5mbz1h bmNlc3RvckluZm8uY3VycmVudDt2YXIgcGFyZW50VGFnPXBhcmVudEluZm8mJnBhcmVudEluZm8u dGFnO2lmKGNoaWxkVGV4dCE9bnVsbCl7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJu aW5nKGNoaWxkVGFnPT1udWxsLCJ2YWxpZGF0ZURPTU5lc3Rpbmc6IHdoZW4gY2hpbGRUZXh0IGlz IHBhc3NlZCwgY2hpbGRUYWcgc2hvdWxkIGJlIG51bGwiKTp2b2lkIDA7Y2hpbGRUYWc9IiN0ZXh0 In12YXIgaW52YWxpZFBhcmVudD1pc1RhZ1ZhbGlkV2l0aFBhcmVudChjaGlsZFRhZyxwYXJlbnRU YWcpP251bGw6cGFyZW50SW5mbzt2YXIgaW52YWxpZEFuY2VzdG9yPWludmFsaWRQYXJlbnQ/bnVs bDpmaW5kSW52YWxpZEFuY2VzdG9yRm9yVGFnKGNoaWxkVGFnLGFuY2VzdG9ySW5mbyk7dmFyIHBy b2JsZW1hdGljPWludmFsaWRQYXJlbnR8fGludmFsaWRBbmNlc3RvcjtpZihwcm9ibGVtYXRpYyl7 dmFyIGFuY2VzdG9yVGFnPXByb2JsZW1hdGljLnRhZzt2YXIgYW5jZXN0b3JJbnN0YW5jZT1wcm9i bGVtYXRpYy5pbnN0YW5jZTt2YXIgY2hpbGRPd25lcj1jaGlsZEluc3RhbmNlJiZjaGlsZEluc3Rh bmNlLl9jdXJyZW50RWxlbWVudC5fb3duZXI7dmFyIGFuY2VzdG9yT3duZXI9YW5jZXN0b3JJbnN0 YW5jZSYmYW5jZXN0b3JJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQuX293bmVyO3ZhciBjaGlsZE93 bmVycz1maW5kT3duZXJTdGFjayhjaGlsZE93bmVyKTt2YXIgYW5jZXN0b3JPd25lcnM9ZmluZE93 bmVyU3RhY2soYW5jZXN0b3JPd25lcik7dmFyIG1pblN0YWNrTGVuPU1hdGgubWluKGNoaWxkT3du ZXJzLmxlbmd0aCxhbmNlc3Rvck93bmVycy5sZW5ndGgpO3ZhciBpO3ZhciBkZWVwZXN0Q29tbW9u PS0xO2ZvcihpPTA7aTxtaW5TdGFja0xlbjtpKyspe2lmKGNoaWxkT3duZXJzW2ldPT09YW5jZXN0 b3JPd25lcnNbaV0pe2RlZXBlc3RDb21tb249aX1lbHNle2JyZWFrfX12YXIgVU5LTk9XTj0iKHVu a25vd24pIjt2YXIgY2hpbGRPd25lck5hbWVzPWNoaWxkT3duZXJzLnNsaWNlKGRlZXBlc3RDb21t b24rMSkubWFwKGZ1bmN0aW9uKGluc3Qpe3JldHVybiBpbnN0LmdldE5hbWUoKXx8VU5LTk9XTn0p O3ZhciBhbmNlc3Rvck93bmVyTmFtZXM9YW5jZXN0b3JPd25lcnMuc2xpY2UoZGVlcGVzdENvbW1v bisxKS5tYXAoZnVuY3Rpb24oaW5zdCl7cmV0dXJuIGluc3QuZ2V0TmFtZSgpfHxVTktOT1dOfSk7 dmFyIG93bmVySW5mbz1bXS5jb25jYXQoZGVlcGVzdENvbW1vbiE9PS0xP2NoaWxkT3duZXJzW2Rl ZXBlc3RDb21tb25dLmdldE5hbWUoKXx8VU5LTk9XTjpbXSxhbmNlc3Rvck93bmVyTmFtZXMsYW5j ZXN0b3JUYWcsaW52YWxpZEFuY2VzdG9yP1siLi4uIl06W10sY2hpbGRPd25lck5hbWVzLGNoaWxk VGFnKS5qb2luKCIgPiAiKTt2YXIgd2FybktleT0hIWludmFsaWRQYXJlbnQrInwiK2NoaWxkVGFn KyJ8IithbmNlc3RvclRhZysifCIrb3duZXJJbmZvO2lmKGRpZFdhcm5bd2FybktleV0pe3JldHVy bn1kaWRXYXJuW3dhcm5LZXldPXRydWU7dmFyIHRhZ0Rpc3BsYXlOYW1lPWNoaWxkVGFnO3ZhciB3 aGl0ZXNwYWNlSW5mbz0iIjtpZihjaGlsZFRhZz09PSIjdGV4dCIpe2lmKC9cUy8udGVzdChjaGls ZFRleHQpKXt0YWdEaXNwbGF5TmFtZT0iVGV4dCBub2RlcyJ9ZWxzZXt0YWdEaXNwbGF5TmFtZT0i V2hpdGVzcGFjZSB0ZXh0IG5vZGVzIjt3aGl0ZXNwYWNlSW5mbz0iIE1ha2Ugc3VyZSB5b3UgZG9u J3QgaGF2ZSBhbnkgZXh0cmEgd2hpdGVzcGFjZSBiZXR3ZWVuIHRhZ3Mgb24gIisiZWFjaCBsaW5l IG9mIHlvdXIgc291cmNlIGNvZGUuIn19ZWxzZXt0YWdEaXNwbGF5TmFtZT0iPCIrY2hpbGRUYWcr Ij4ifWlmKGludmFsaWRQYXJlbnQpe3ZhciBpbmZvPSIiO2lmKGFuY2VzdG9yVGFnPT09InRhYmxl IiYmY2hpbGRUYWc9PT0idHIiKXtpbmZvKz0iIEFkZCBhIDx0Ym9keT4gdG8geW91ciBjb2RlIHRv IG1hdGNoIHRoZSBET00gdHJlZSBnZW5lcmF0ZWQgYnkgIisidGhlIGJyb3dzZXIuIn0iZGV2ZWxv cG1lbnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmcoZmFsc2UsInZhbGlkYXRlRE9NTmVzdGluZygu Li4pOiAlcyBjYW5ub3QgYXBwZWFyIGFzIGEgY2hpbGQgb2YgPCVzPi4lcyAiKyJTZWUgJXMuJXMi LHRhZ0Rpc3BsYXlOYW1lLGFuY2VzdG9yVGFnLHdoaXRlc3BhY2VJbmZvLG93bmVySW5mbyxpbmZv KTp2b2lkIDB9ZWxzZXsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmcoZmFsc2Us InZhbGlkYXRlRE9NTmVzdGluZyguLi4pOiAlcyBjYW5ub3QgYXBwZWFyIGFzIGEgZGVzY2VuZGFu dCBvZiAiKyI8JXM+LiBTZWUgJXMuIix0YWdEaXNwbGF5TmFtZSxhbmNlc3RvclRhZyxvd25lcklu Zm8pOnZvaWQgMH19fTt2YWxpZGF0ZURPTU5lc3RpbmcudXBkYXRlZEFuY2VzdG9ySW5mbz11cGRh dGVkQW5jZXN0b3JJbmZvO3ZhbGlkYXRlRE9NTmVzdGluZy5pc1RhZ1ZhbGlkSW5Db250ZXh0PWZ1 bmN0aW9uKHRhZyxhbmNlc3RvckluZm8pe2FuY2VzdG9ySW5mbz1hbmNlc3RvckluZm98fGVtcHR5 QW5jZXN0b3JJbmZvO3ZhciBwYXJlbnRJbmZvPWFuY2VzdG9ySW5mby5jdXJyZW50O3ZhciBwYXJl bnRUYWc9cGFyZW50SW5mbyYmcGFyZW50SW5mby50YWc7cmV0dXJuIGlzVGFnVmFsaWRXaXRoUGFy ZW50KHRhZyxwYXJlbnRUYWcpJiYhZmluZEludmFsaWRBbmNlc3RvckZvclRhZyh0YWcsYW5jZXN0 b3JJbmZvKX19bW9kdWxlLmV4cG9ydHM9dmFsaWRhdGVET01OZXN0aW5nfSx7MTMyOjEzMiwxNDc6 MTQ3LDE0ODoxNDh9XSwxMjI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ug c3RyaWN0Ijt2YXIgUmVhY3RJbnRlcm5hbHM9UmVhY3QuX19TRUNSRVRfSU5URVJOQUxTX0RPX05P VF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ7bW9kdWxlLmV4cG9ydHM9UmVhY3RJbnRlcm5hbHMu UmVhY3RDb21wb25lbnRUcmVlSG9va30se31dLDEyMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUs ZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBSZWFjdEludGVybmFscz1SZWFjdC5fX1NFQ1JFVF9J TlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDttb2R1bGUuZXhwb3J0cz1S ZWFjdEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcn0se31dLDEyNDpbZnVuY3Rpb24oX2RlcmVx Xyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO21vZHVsZS5leHBvcnRzPVJlYWN0fSx7fV0s MTI1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIGVt cHR5RnVuY3Rpb249X2RlcmVxXygxMzIpO3ZhciBFdmVudExpc3RlbmVyPXtsaXN0ZW46ZnVuY3Rp b24gbGlzdGVuKHRhcmdldCxldmVudFR5cGUsY2FsbGJhY2spe2lmKHRhcmdldC5hZGRFdmVudExp c3RlbmVyKXt0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsY2FsbGJhY2ssZmFsc2Up O3JldHVybntyZW1vdmU6ZnVuY3Rpb24gcmVtb3ZlKCl7dGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVu ZXIoZXZlbnRUeXBlLGNhbGxiYWNrLGZhbHNlKX19fWVsc2UgaWYodGFyZ2V0LmF0dGFjaEV2ZW50 KXt0YXJnZXQuYXR0YWNoRXZlbnQoIm9uIitldmVudFR5cGUsY2FsbGJhY2spO3JldHVybntyZW1v dmU6ZnVuY3Rpb24gcmVtb3ZlKCl7dGFyZ2V0LmRldGFjaEV2ZW50KCJvbiIrZXZlbnRUeXBlLGNh bGxiYWNrKX19fX0sY2FwdHVyZTpmdW5jdGlvbiBjYXB0dXJlKHRhcmdldCxldmVudFR5cGUsY2Fs bGJhY2spe2lmKHRhcmdldC5hZGRFdmVudExpc3RlbmVyKXt0YXJnZXQuYWRkRXZlbnRMaXN0ZW5l cihldmVudFR5cGUsY2FsbGJhY2ssdHJ1ZSk7cmV0dXJue3JlbW92ZTpmdW5jdGlvbiByZW1vdmUo KXt0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsY2FsbGJhY2ssdHJ1ZSl9fX1l bHNle2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe2NvbnNvbGUuZXJyb3IoIkF0dGVt cHRlZCB0byBsaXN0ZW4gdG8gZXZlbnRzIGR1cmluZyB0aGUgY2FwdHVyZSBwaGFzZSBvbiBhICIr ImJyb3dzZXIgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBjYXB0dXJlIHBoYXNlLiBZb3VyIGFw cGxpY2F0aW9uICIrIndpbGwgbm90IHJlY2VpdmUgc29tZSBldmVudHMuIil9cmV0dXJue3JlbW92 ZTplbXB0eUZ1bmN0aW9ufX19LHJlZ2lzdGVyRGVmYXVsdDpmdW5jdGlvbiByZWdpc3RlckRlZmF1 bHQoKXt9fTttb2R1bGUuZXhwb3J0cz1FdmVudExpc3RlbmVyfSx7MTMyOjEzMn1dLDEyNjpbZnVu Y3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBjYW5Vc2VET009 ISEodHlwZW9mIHdpbmRvdyE9PSJ1bmRlZmluZWQiJiZ3aW5kb3cuZG9jdW1lbnQmJndpbmRvdy5k b2N1bWVudC5jcmVhdGVFbGVtZW50KTt2YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQ9e2NhblVzZURP TTpjYW5Vc2VET00sY2FuVXNlV29ya2Vyczp0eXBlb2YgV29ya2VyIT09InVuZGVmaW5lZCIsY2Fu VXNlRXZlbnRMaXN0ZW5lcnM6Y2FuVXNlRE9NJiYhISh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcnx8 d2luZG93LmF0dGFjaEV2ZW50KSxjYW5Vc2VWaWV3cG9ydDpjYW5Vc2VET00mJiEhd2luZG93LnNj cmVlbixpc0luV29ya2VyOiFjYW5Vc2VET019O21vZHVsZS5leHBvcnRzPUV4ZWN1dGlvbkVudmly b25tZW50fSx7fV0sMTI3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0 cmljdCI7dmFyIF9oeXBoZW5QYXR0ZXJuPS8tKC4pL2c7ZnVuY3Rpb24gY2FtZWxpemUoc3RyaW5n KXtyZXR1cm4gc3RyaW5nLnJlcGxhY2UoX2h5cGhlblBhdHRlcm4sZnVuY3Rpb24oXyxjaGFyYWN0 ZXIpe3JldHVybiBjaGFyYWN0ZXIudG9VcHBlckNhc2UoKX0pfW1vZHVsZS5leHBvcnRzPWNhbWVs aXplfSx7fV0sMTI4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmlj dCI7dmFyIGNhbWVsaXplPV9kZXJlcV8oMTI3KTt2YXIgbXNQYXR0ZXJuPS9eLW1zLS87ZnVuY3Rp b24gY2FtZWxpemVTdHlsZU5hbWUoc3RyaW5nKXtyZXR1cm4gY2FtZWxpemUoc3RyaW5nLnJlcGxh Y2UobXNQYXR0ZXJuLCJtcy0iKSl9bW9kdWxlLmV4cG9ydHM9Y2FtZWxpemVTdHlsZU5hbWV9LHsx Mjc6MTI3fV0sMTI5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmlj dCI7dmFyIGlzVGV4dE5vZGU9X2RlcmVxXygxNDIpO2Z1bmN0aW9uIGNvbnRhaW5zTm9kZShvdXRl ck5vZGUsaW5uZXJOb2RlKXtpZighb3V0ZXJOb2RlfHwhaW5uZXJOb2RlKXtyZXR1cm4gZmFsc2V9 ZWxzZSBpZihvdXRlck5vZGU9PT1pbm5lck5vZGUpe3JldHVybiB0cnVlfWVsc2UgaWYoaXNUZXh0 Tm9kZShvdXRlck5vZGUpKXtyZXR1cm4gZmFsc2V9ZWxzZSBpZihpc1RleHROb2RlKGlubmVyTm9k ZSkpe3JldHVybiBjb250YWluc05vZGUob3V0ZXJOb2RlLGlubmVyTm9kZS5wYXJlbnROb2RlKX1l bHNlIGlmKCJjb250YWlucyJpbiBvdXRlck5vZGUpe3JldHVybiBvdXRlck5vZGUuY29udGFpbnMo aW5uZXJOb2RlKX1lbHNlIGlmKG91dGVyTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbil7cmV0 dXJuISEob3V0ZXJOb2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGlubmVyTm9kZSkmMTYpfWVs c2V7cmV0dXJuIGZhbHNlfX1tb2R1bGUuZXhwb3J0cz1jb250YWluc05vZGV9LHsxNDI6MTQyfV0s MTMwOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIGlu dmFyaWFudD1fZGVyZXFfKDE0MCk7ZnVuY3Rpb24gdG9BcnJheShvYmope3ZhciBsZW5ndGg9b2Jq Lmxlbmd0aDshKCFBcnJheS5pc0FycmF5KG9iaikmJih0eXBlb2Ygb2JqPT09Im9iamVjdCJ8fHR5 cGVvZiBvYmo9PT0iZnVuY3Rpb24iKSk/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZh cmlhbnQoZmFsc2UsInRvQXJyYXk6IEFycmF5LWxpa2Ugb2JqZWN0IGV4cGVjdGVkIik6aW52YXJp YW50KGZhbHNlKTp2b2lkIDA7ISh0eXBlb2YgbGVuZ3RoPT09Im51bWJlciIpPyJkZXZlbG9wbWVu dCIhPT0icHJvZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJ0b0FycmF5OiBPYmplY3QgbmVlZHMg YSBsZW5ndGggcHJvcGVydHkiKTppbnZhcmlhbnQoZmFsc2UpOnZvaWQgMDshKGxlbmd0aD09PTB8 fGxlbmd0aC0xIGluIG9iaik/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQo ZmFsc2UsInRvQXJyYXk6IE9iamVjdCBzaG91bGQgaGF2ZSBrZXlzIGZvciBpbmRpY2VzIik6aW52 YXJpYW50KGZhbHNlKTp2b2lkIDA7ISh0eXBlb2Ygb2JqLmNhbGxlZSE9PSJmdW5jdGlvbiIpPyJk ZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJ0b0FycmF5OiBPYmpl Y3QgY2FuJ3QgYmUgYGFyZ3VtZW50c2AuIFVzZSByZXN0IHBhcmFtcyAiKyIoZnVuY3Rpb24oLi4u YXJncykge30pIG9yIEFycmF5LmZyb20oKSBpbnN0ZWFkLiIpOmludmFyaWFudChmYWxzZSk6dm9p ZCAwO2lmKG9iai5oYXNPd25Qcm9wZXJ0eSl7dHJ5e3JldHVybiBBcnJheS5wcm90b3R5cGUuc2xp Y2UuY2FsbChvYmopfWNhdGNoKGUpe319dmFyIHJldD1BcnJheShsZW5ndGgpO2Zvcih2YXIgaWk9 MDtpaTxsZW5ndGg7aWkrKyl7cmV0W2lpXT1vYmpbaWldfXJldHVybiByZXR9ZnVuY3Rpb24gaGFz QXJyYXlOYXR1cmUob2JqKXtyZXR1cm4hIW9iaiYmKHR5cGVvZiBvYmo9PSJvYmplY3QifHx0eXBl b2Ygb2JqPT0iZnVuY3Rpb24iKSYmImxlbmd0aCJpbiBvYmomJiEoInNldEludGVydmFsImluIG9i aikmJnR5cGVvZiBvYmoubm9kZVR5cGUhPSJudW1iZXIiJiYoQXJyYXkuaXNBcnJheShvYmopfHwi Y2FsbGVlImluIG9ianx8Iml0ZW0iaW4gb2JqKX1mdW5jdGlvbiBjcmVhdGVBcnJheUZyb21NaXhl ZChvYmope2lmKCFoYXNBcnJheU5hdHVyZShvYmopKXtyZXR1cm5bb2JqXX1lbHNlIGlmKEFycmF5 LmlzQXJyYXkob2JqKSl7cmV0dXJuIG9iai5zbGljZSgpfWVsc2V7cmV0dXJuIHRvQXJyYXkob2Jq KX19bW9kdWxlLmV4cG9ydHM9Y3JlYXRlQXJyYXlGcm9tTWl4ZWR9LHsxNDA6MTQwfV0sMTMxOltm dW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIEV4ZWN1dGlv bkVudmlyb25tZW50PV9kZXJlcV8oMTI2KTt2YXIgY3JlYXRlQXJyYXlGcm9tTWl4ZWQ9X2RlcmVx XygxMzApO3ZhciBnZXRNYXJrdXBXcmFwPV9kZXJlcV8oMTM2KTt2YXIgaW52YXJpYW50PV9kZXJl cV8oMTQwKTt2YXIgZHVtbXlOb2RlPUV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTT9kb2N1 bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTpudWxsO3ZhciBub2RlTmFtZVBhdHRlcm49L15ccyo8 KFx3KykvO2Z1bmN0aW9uIGdldE5vZGVOYW1lKG1hcmt1cCl7dmFyIG5vZGVOYW1lTWF0Y2g9bWFy a3VwLm1hdGNoKG5vZGVOYW1lUGF0dGVybik7cmV0dXJuIG5vZGVOYW1lTWF0Y2gmJm5vZGVOYW1l TWF0Y2hbMV0udG9Mb3dlckNhc2UoKX1mdW5jdGlvbiBjcmVhdGVOb2Rlc0Zyb21NYXJrdXAobWFy a3VwLGhhbmRsZVNjcmlwdCl7dmFyIG5vZGU9ZHVtbXlOb2RlOyEhIWR1bW15Tm9kZT8iZGV2ZWxv cG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiY3JlYXRlTm9kZXNGcm9tTWFy a3VwIGR1bW15IG5vdCBpbml0aWFsaXplZCIpOmludmFyaWFudChmYWxzZSk6dm9pZCAwO3ZhciBu b2RlTmFtZT1nZXROb2RlTmFtZShtYXJrdXApO3ZhciB3cmFwPW5vZGVOYW1lJiZnZXRNYXJrdXBX cmFwKG5vZGVOYW1lKTtpZih3cmFwKXtub2RlLmlubmVySFRNTD13cmFwWzFdK21hcmt1cCt3cmFw WzJdO3ZhciB3cmFwRGVwdGg9d3JhcFswXTt3aGlsZSh3cmFwRGVwdGgtLSl7bm9kZT1ub2RlLmxh c3RDaGlsZH19ZWxzZXtub2RlLmlubmVySFRNTD1tYXJrdXB9dmFyIHNjcmlwdHM9bm9kZS5nZXRF bGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7aWYoc2NyaXB0cy5sZW5ndGgpeyFoYW5kbGVTY3Jp cHQ/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsImNyZWF0ZU5v ZGVzRnJvbU1hcmt1cCguLi4pOiBVbmV4cGVjdGVkIDxzY3JpcHQ+IGVsZW1lbnQgcmVuZGVyZWQu Iik6aW52YXJpYW50KGZhbHNlKTp2b2lkIDA7Y3JlYXRlQXJyYXlGcm9tTWl4ZWQoc2NyaXB0cyku Zm9yRWFjaChoYW5kbGVTY3JpcHQpfXZhciBub2Rlcz1BcnJheS5mcm9tKG5vZGUuY2hpbGROb2Rl cyk7d2hpbGUobm9kZS5sYXN0Q2hpbGQpe25vZGUucmVtb3ZlQ2hpbGQobm9kZS5sYXN0Q2hpbGQp fXJldHVybiBub2Rlc31tb2R1bGUuZXhwb3J0cz1jcmVhdGVOb2Rlc0Zyb21NYXJrdXB9LHsxMjY6 MTI2LDEzMDoxMzAsMTM2OjEzNiwxNDA6MTQwfV0sMTMyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVs ZSxleHBvcnRzKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbWFrZUVtcHR5RnVuY3Rpb24oYXJnKXty ZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYXJnfX12YXIgZW1wdHlGdW5jdGlvbj1mdW5jdGlvbiBl bXB0eUZ1bmN0aW9uKCl7fTtlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zPW1ha2VFbXB0eUZ1bmN0 aW9uO2VtcHR5RnVuY3Rpb24udGhhdFJldHVybnNGYWxzZT1tYWtlRW1wdHlGdW5jdGlvbihmYWxz ZSk7ZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc1RydWU9bWFrZUVtcHR5RnVuY3Rpb24odHJ1ZSk7 ZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc051bGw9bWFrZUVtcHR5RnVuY3Rpb24obnVsbCk7ZW1w dHlGdW5jdGlvbi50aGF0UmV0dXJuc1RoaXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307ZW1wdHlG dW5jdGlvbi50aGF0UmV0dXJuc0FyZ3VtZW50PWZ1bmN0aW9uKGFyZyl7cmV0dXJuIGFyZ307bW9k dWxlLmV4cG9ydHM9ZW1wdHlGdW5jdGlvbn0se31dLDEzMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1 bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBlbXB0eU9iamVjdD17fTtpZigiZGV2ZWxvcG1l bnQiIT09InByb2R1Y3Rpb24iKXtPYmplY3QuZnJlZXplKGVtcHR5T2JqZWN0KX1tb2R1bGUuZXhw b3J0cz1lbXB0eU9iamVjdH0se31dLDEzNDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0 cyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGZvY3VzTm9kZShub2RlKXt0cnl7bm9kZS5mb2N1cygp fWNhdGNoKGUpe319bW9kdWxlLmV4cG9ydHM9Zm9jdXNOb2RlfSx7fV0sMTM1OltmdW5jdGlvbihf ZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZ2V0QWN0aXZlRWxl bWVudCgpe2lmKHR5cGVvZiBkb2N1bWVudD09PSJ1bmRlZmluZWQiKXtyZXR1cm4gbnVsbH10cnl7 cmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnR8fGRvY3VtZW50LmJvZHl9Y2F0Y2goZSl7cmV0 dXJuIGRvY3VtZW50LmJvZHl9fW1vZHVsZS5leHBvcnRzPWdldEFjdGl2ZUVsZW1lbnR9LHt9XSwx MzY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgRXhl Y3V0aW9uRW52aXJvbm1lbnQ9X2RlcmVxXygxMjYpO3ZhciBpbnZhcmlhbnQ9X2RlcmVxXygxNDAp O3ZhciBkdW1teU5vZGU9RXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NP2RvY3VtZW50LmNy ZWF0ZUVsZW1lbnQoImRpdiIpOm51bGw7dmFyIHNob3VsZFdyYXA9e307dmFyIHNlbGVjdFdyYXA9 WzEsJzxzZWxlY3QgbXVsdGlwbGU9InRydWUiPicsIjwvc2VsZWN0PiJdO3ZhciB0YWJsZVdyYXA9 WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdO3ZhciB0cldyYXA9WzMsIjx0YWJsZT48dGJvZHk+PHRy PiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdO3ZhciBzdmdXcmFwPVsxLCc8c3ZnIHhtbG5zPSJo dHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+JywiPC9zdmc+Il07dmFyIG1hcmt1cFdyYXA9eyIq IjpbMSwiPzxkaXY+IiwiPC9kaXY+Il0sYXJlYTpbMSwiPG1hcD4iLCI8L21hcD4iXSxjb2w6WzIs Ijx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJd LGxlZ2VuZDpbMSwiPGZpZWxkc2V0PiIsIjwvZmllbGRzZXQ+Il0scGFyYW06WzEsIjxvYmplY3Q+ IiwiPC9vYmplY3Q+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJd LG9wdGdyb3VwOnNlbGVjdFdyYXAsb3B0aW9uOnNlbGVjdFdyYXAsY2FwdGlvbjp0YWJsZVdyYXAs Y29sZ3JvdXA6dGFibGVXcmFwLHRib2R5OnRhYmxlV3JhcCx0Zm9vdDp0YWJsZVdyYXAsdGhlYWQ6 dGFibGVXcmFwLHRkOnRyV3JhcCx0aDp0cldyYXB9O3ZhciBzdmdFbGVtZW50cz1bImNpcmNsZSIs ImNsaXBQYXRoIiwiZGVmcyIsImVsbGlwc2UiLCJnIiwiaW1hZ2UiLCJsaW5lIiwibGluZWFyR3Jh ZGllbnQiLCJtYXNrIiwicGF0aCIsInBhdHRlcm4iLCJwb2x5Z29uIiwicG9seWxpbmUiLCJyYWRp YWxHcmFkaWVudCIsInJlY3QiLCJzdG9wIiwidGV4dCIsInRzcGFuIl07c3ZnRWxlbWVudHMuZm9y RWFjaChmdW5jdGlvbihub2RlTmFtZSl7bWFya3VwV3JhcFtub2RlTmFtZV09c3ZnV3JhcDtzaG91 bGRXcmFwW25vZGVOYW1lXT10cnVlfSk7ZnVuY3Rpb24gZ2V0TWFya3VwV3JhcChub2RlTmFtZSl7 ISEhZHVtbXlOb2RlPyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/aW52YXJpYW50KGZhbHNl LCJNYXJrdXAgd3JhcHBpbmcgbm9kZSBub3QgaW5pdGlhbGl6ZWQiKTppbnZhcmlhbnQoZmFsc2Up OnZvaWQgMDtpZighbWFya3VwV3JhcC5oYXNPd25Qcm9wZXJ0eShub2RlTmFtZSkpe25vZGVOYW1l PSIqIn1pZighc2hvdWxkV3JhcC5oYXNPd25Qcm9wZXJ0eShub2RlTmFtZSkpe2lmKG5vZGVOYW1l PT09IioiKXtkdW1teU5vZGUuaW5uZXJIVE1MPSI8bGluayAvPiJ9ZWxzZXtkdW1teU5vZGUuaW5u ZXJIVE1MPSI8Iitub2RlTmFtZSsiPjwvIitub2RlTmFtZSsiPiJ9c2hvdWxkV3JhcFtub2RlTmFt ZV09IWR1bW15Tm9kZS5maXJzdENoaWxkfXJldHVybiBzaG91bGRXcmFwW25vZGVOYW1lXT9tYXJr dXBXcmFwW25vZGVOYW1lXTpudWxsfW1vZHVsZS5leHBvcnRzPWdldE1hcmt1cFdyYXB9LHsxMjY6 MTI2LDE0MDoxNDB9XSwxMzc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ug c3RyaWN0IjtmdW5jdGlvbiBnZXRVbmJvdW5kZWRTY3JvbGxQb3NpdGlvbihzY3JvbGxhYmxlKXtp ZihzY3JvbGxhYmxlPT09d2luZG93KXtyZXR1cm57eDp3aW5kb3cucGFnZVhPZmZzZXR8fGRvY3Vt ZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0LHk6d2luZG93LnBhZ2VZT2Zmc2V0fHxkb2N1 bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wfX1yZXR1cm57eDpzY3JvbGxhYmxlLnNjcm9s bExlZnQseTpzY3JvbGxhYmxlLnNjcm9sbFRvcH19bW9kdWxlLmV4cG9ydHM9Z2V0VW5ib3VuZGVk U2Nyb2xsUG9zaXRpb259LHt9XSwxMzg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMp eyJ1c2Ugc3RyaWN0Ijt2YXIgX3VwcGVyY2FzZVBhdHRlcm49LyhbQS1aXSkvZztmdW5jdGlvbiBo eXBoZW5hdGUoc3RyaW5nKXtyZXR1cm4gc3RyaW5nLnJlcGxhY2UoX3VwcGVyY2FzZVBhdHRlcm4s Ii0kMSIpLnRvTG93ZXJDYXNlKCl9bW9kdWxlLmV4cG9ydHM9aHlwaGVuYXRlfSx7fV0sMTM5Oltm dW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIGh5cGhlbmF0 ZT1fZGVyZXFfKDEzOCk7dmFyIG1zUGF0dGVybj0vXm1zLS87ZnVuY3Rpb24gaHlwaGVuYXRlU3R5 bGVOYW1lKHN0cmluZyl7cmV0dXJuIGh5cGhlbmF0ZShzdHJpbmcpLnJlcGxhY2UobXNQYXR0ZXJu LCItbXMtIil9bW9kdWxlLmV4cG9ydHM9aHlwaGVuYXRlU3R5bGVOYW1lfSx7MTM4OjEzOH1dLDE0 MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciB2YWxp ZGF0ZUZvcm1hdD1mdW5jdGlvbiB2YWxpZGF0ZUZvcm1hdChmb3JtYXQpe307aWYoImRldmVsb3Bt ZW50IiE9PSJwcm9kdWN0aW9uIil7dmFsaWRhdGVGb3JtYXQ9ZnVuY3Rpb24gdmFsaWRhdGVGb3Jt YXQoZm9ybWF0KXtpZihmb3JtYXQ9PT11bmRlZmluZWQpe3Rocm93IG5ldyBFcnJvcigiaW52YXJp YW50IHJlcXVpcmVzIGFuIGVycm9yIG1lc3NhZ2UgYXJndW1lbnQiKX19fWZ1bmN0aW9uIGludmFy aWFudChjb25kaXRpb24sZm9ybWF0LGEsYixjLGQsZSxmKXt2YWxpZGF0ZUZvcm1hdChmb3JtYXQp O2lmKCFjb25kaXRpb24pe3ZhciBlcnJvcjtpZihmb3JtYXQ9PT11bmRlZmluZWQpe2Vycm9yPW5l dyBFcnJvcigiTWluaWZpZWQgZXhjZXB0aW9uIG9jY3VycmVkOyB1c2UgdGhlIG5vbi1taW5pZmll ZCBkZXYgZW52aXJvbm1lbnQgIisiZm9yIHRoZSBmdWxsIGVycm9yIG1lc3NhZ2UgYW5kIGFkZGl0 aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4iKX1lbHNle3ZhciBhcmdzPVthLGIsYyxkLGUsZl07dmFy IGFyZ0luZGV4PTA7ZXJyb3I9bmV3IEVycm9yKGZvcm1hdC5yZXBsYWNlKC8lcy9nLGZ1bmN0aW9u KCl7cmV0dXJuIGFyZ3NbYXJnSW5kZXgrK119KSk7ZXJyb3IubmFtZT0iSW52YXJpYW50IFZpb2xh dGlvbiJ9ZXJyb3IuZnJhbWVzVG9Qb3A9MTt0aHJvdyBlcnJvcn19bW9kdWxlLmV4cG9ydHM9aW52 YXJpYW50fSx7fV0sMTQxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0 cmljdCI7ZnVuY3Rpb24gaXNOb2RlKG9iamVjdCl7cmV0dXJuISEob2JqZWN0JiYodHlwZW9mIE5v ZGU9PT0iZnVuY3Rpb24iP29iamVjdCBpbnN0YW5jZW9mIE5vZGU6dHlwZW9mIG9iamVjdD09PSJv YmplY3QiJiZ0eXBlb2Ygb2JqZWN0Lm5vZGVUeXBlPT09Im51bWJlciImJnR5cGVvZiBvYmplY3Qu bm9kZU5hbWU9PT0ic3RyaW5nIikpfW1vZHVsZS5leHBvcnRzPWlzTm9kZX0se31dLDE0MjpbZnVu Y3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBpc05vZGU9X2Rl cmVxXygxNDEpO2Z1bmN0aW9uIGlzVGV4dE5vZGUob2JqZWN0KXtyZXR1cm4gaXNOb2RlKG9iamVj dCkmJm9iamVjdC5ub2RlVHlwZT09M31tb2R1bGUuZXhwb3J0cz1pc1RleHROb2RlfSx7MTQxOjE0 MX1dLDE0MzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO2Z1 bmN0aW9uIG1lbW9pemVTdHJpbmdPbmx5KGNhbGxiYWNrKXt2YXIgY2FjaGU9e307cmV0dXJuIGZ1 bmN0aW9uKHN0cmluZyl7aWYoIWNhY2hlLmhhc093blByb3BlcnR5KHN0cmluZykpe2NhY2hlW3N0 cmluZ109Y2FsbGJhY2suY2FsbCh0aGlzLHN0cmluZyl9cmV0dXJuIGNhY2hlW3N0cmluZ119fW1v ZHVsZS5leHBvcnRzPW1lbW9pemVTdHJpbmdPbmx5fSx7fV0sMTQ0OltmdW5jdGlvbihfZGVyZXFf LG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIEV4ZWN1dGlvbkVudmlyb25tZW50PV9k ZXJlcV8oMTI2KTt2YXIgcGVyZm9ybWFuY2U7aWYoRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNl RE9NKXtwZXJmb3JtYW5jZT13aW5kb3cucGVyZm9ybWFuY2V8fHdpbmRvdy5tc1BlcmZvcm1hbmNl fHx3aW5kb3cud2Via2l0UGVyZm9ybWFuY2V9bW9kdWxlLmV4cG9ydHM9cGVyZm9ybWFuY2V8fHt9 fSx7MTI2OjEyNn1dLDE0NTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBz dHJpY3QiO3ZhciBwZXJmb3JtYW5jZT1fZGVyZXFfKDE0NCk7dmFyIHBlcmZvcm1hbmNlTm93O2lm KHBlcmZvcm1hbmNlLm5vdyl7cGVyZm9ybWFuY2VOb3c9ZnVuY3Rpb24gcGVyZm9ybWFuY2VOb3co KXtyZXR1cm4gcGVyZm9ybWFuY2Uubm93KCl9fWVsc2V7cGVyZm9ybWFuY2VOb3c9ZnVuY3Rpb24g cGVyZm9ybWFuY2VOb3coKXtyZXR1cm4gRGF0ZS5ub3coKX19bW9kdWxlLmV4cG9ydHM9cGVyZm9y bWFuY2VOb3d9LHsxNDQ6MTQ0fV0sMTQ2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRz KXsidXNlIHN0cmljdCI7dmFyIGhhc093blByb3BlcnR5PU9iamVjdC5wcm90b3R5cGUuaGFzT3du UHJvcGVydHk7ZnVuY3Rpb24gaXMoeCx5KXtpZih4PT09eSl7cmV0dXJuIHghPT0wfHx5IT09MHx8 MS94PT09MS95fWVsc2V7cmV0dXJuIHghPT14JiZ5IT09eX19ZnVuY3Rpb24gc2hhbGxvd0VxdWFs KG9iakEsb2JqQil7aWYoaXMob2JqQSxvYmpCKSl7cmV0dXJuIHRydWV9aWYodHlwZW9mIG9iakEh PT0ib2JqZWN0Inx8b2JqQT09PW51bGx8fHR5cGVvZiBvYmpCIT09Im9iamVjdCJ8fG9iakI9PT1u dWxsKXtyZXR1cm4gZmFsc2V9dmFyIGtleXNBPU9iamVjdC5rZXlzKG9iakEpO3ZhciBrZXlzQj1P YmplY3Qua2V5cyhvYmpCKTtpZihrZXlzQS5sZW5ndGghPT1rZXlzQi5sZW5ndGgpe3JldHVybiBm YWxzZX1mb3IodmFyIGk9MDtpPGtleXNBLmxlbmd0aDtpKyspe2lmKCFoYXNPd25Qcm9wZXJ0eS5j YWxsKG9iakIsa2V5c0FbaV0pfHwhaXMob2JqQVtrZXlzQVtpXV0sb2JqQltrZXlzQVtpXV0pKXty ZXR1cm4gZmFsc2V9fXJldHVybiB0cnVlfW1vZHVsZS5leHBvcnRzPXNoYWxsb3dFcXVhbH0se31d LDE0NzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBl bXB0eUZ1bmN0aW9uPV9kZXJlcV8oMTMyKTt2YXIgd2FybmluZz1lbXB0eUZ1bmN0aW9uO2lmKCJk ZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpeyhmdW5jdGlvbigpe3ZhciBwcmludFdhcm5pbmc9 ZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGZvcm1hdCl7Zm9yKHZhciBfbGVuPWFyZ3VtZW50cy5sZW5n dGgsYXJncz1BcnJheShfbGVuPjE/X2xlbi0xOjApLF9rZXk9MTtfa2V5PF9sZW47X2tleSsrKXth cmdzW19rZXktMV09YXJndW1lbnRzW19rZXldfXZhciBhcmdJbmRleD0wO3ZhciBtZXNzYWdlPSJX YXJuaW5nOiAiK2Zvcm1hdC5yZXBsYWNlKC8lcy9nLGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3NbYXJn SW5kZXgrK119KTtpZih0eXBlb2YgY29uc29sZSE9PSJ1bmRlZmluZWQiKXtjb25zb2xlLmVycm9y KG1lc3NhZ2UpfXRyeXt0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSl9Y2F0Y2goeCl7fX07d2Fybmlu Zz1mdW5jdGlvbiB3YXJuaW5nKGNvbmRpdGlvbixmb3JtYXQpe2lmKGZvcm1hdD09PXVuZGVmaW5l ZCl7dGhyb3cgbmV3IEVycm9yKCJgd2FybmluZyhjb25kaXRpb24sIGZvcm1hdCwgLi4uYXJncylg IHJlcXVpcmVzIGEgd2FybmluZyAiKyJtZXNzYWdlIGFyZ3VtZW50Iil9aWYoZm9ybWF0LmluZGV4 T2YoIkZhaWxlZCBDb21wb3NpdGUgcHJvcFR5cGU6ICIpPT09MCl7cmV0dXJufWlmKCFjb25kaXRp b24pe2Zvcih2YXIgX2xlbjI9YXJndW1lbnRzLmxlbmd0aCxhcmdzPUFycmF5KF9sZW4yPjI/X2xl bjItMjowKSxfa2V5Mj0yO19rZXkyPF9sZW4yO19rZXkyKyspe2FyZ3NbX2tleTItMl09YXJndW1l bnRzW19rZXkyXX1wcmludFdhcm5pbmcuYXBwbHkodW5kZWZpbmVkLFtmb3JtYXRdLmNvbmNhdChh cmdzKSl9fX0pKCl9bW9kdWxlLmV4cG9ydHM9d2FybmluZ30sezEzMjoxMzJ9XSwxNDg6W2Z1bmN0 aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgaGFzT3duUHJvcGVy dHk9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgcHJvcElzRW51bWVyYWJsZT1P YmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO2Z1bmN0aW9uIHRvT2JqZWN0KHZh bCl7aWYodmFsPT09bnVsbHx8dmFsPT09dW5kZWZpbmVkKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJP YmplY3QuYXNzaWduIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCIpfXJl dHVybiBPYmplY3QodmFsKX1mdW5jdGlvbiBzaG91bGRVc2VOYXRpdmUoKXt0cnl7aWYoIU9iamVj dC5hc3NpZ24pe3JldHVybiBmYWxzZX12YXIgdGVzdDE9bmV3IFN0cmluZygiYWJjIik7dGVzdDFb NV09ImRlIjtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MSlbMF09PT0iNSIpe3Jl dHVybiBmYWxzZX12YXIgdGVzdDI9e307Zm9yKHZhciBpPTA7aTwxMDtpKyspe3Rlc3QyWyJfIitT dHJpbmcuZnJvbUNoYXJDb2RlKGkpXT1pfXZhciBvcmRlcjI9T2JqZWN0LmdldE93blByb3BlcnR5 TmFtZXModGVzdDIpLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gdGVzdDJbbl19KTtpZihvcmRlcjIu am9pbigiIikhPT0iMDEyMzQ1Njc4OSIpe3JldHVybiBmYWxzZX12YXIgdGVzdDM9e307ImFiY2Rl ZmdoaWprbG1ub3BxcnN0Ii5zcGxpdCgiIikuZm9yRWFjaChmdW5jdGlvbihsZXR0ZXIpe3Rlc3Qz W2xldHRlcl09bGV0dGVyfSk7aWYoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSx0ZXN0Mykp LmpvaW4oIiIpIT09ImFiY2RlZmdoaWprbG1ub3BxcnN0Iil7cmV0dXJuIGZhbHNlfXJldHVybiB0 cnVlfWNhdGNoKGUpe3JldHVybiBmYWxzZX19bW9kdWxlLmV4cG9ydHM9c2hvdWxkVXNlTmF0aXZl KCk/T2JqZWN0LmFzc2lnbjpmdW5jdGlvbih0YXJnZXQsc291cmNlKXt2YXIgZnJvbTt2YXIgdG89 dG9PYmplY3QodGFyZ2V0KTt2YXIgc3ltYm9scztmb3IodmFyIHM9MTtzPGFyZ3VtZW50cy5sZW5n dGg7cysrKXtmcm9tPU9iamVjdChhcmd1bWVudHNbc10pO2Zvcih2YXIga2V5IGluIGZyb20pe2lm KGhhc093blByb3BlcnR5LmNhbGwoZnJvbSxrZXkpKXt0b1trZXldPWZyb21ba2V5XX19aWYoT2Jq ZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7c3ltYm9scz1PYmplY3QuZ2V0T3duUHJvcGVydHlT eW1ib2xzKGZyb20pO2Zvcih2YXIgaT0wO2k8c3ltYm9scy5sZW5ndGg7aSsrKXtpZihwcm9wSXNF bnVtZXJhYmxlLmNhbGwoZnJvbSxzeW1ib2xzW2ldKSl7dG9bc3ltYm9sc1tpXV09ZnJvbVtzeW1i b2xzW2ldXX19fX1yZXR1cm4gdG99fSx7fV19LHt9LFs0MV0pKDQxKX0pfSk7CmRpZmYgLS1naXQg YS93ZWIvcGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9kaXN0L3JlYWN0LWRvbS5qcyBi L3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2Rpc3QvcmVhY3QtZG9tLmpzCmlu ZGV4IGZiZDI5YWVhLi5hYzNjNzZmOSAxMDA2NDQKLS0tIGEvd2ViL3BnYWRtaW4vc3RhdGljL3Zl bmRvci9yZWFjdC1kb20vZGlzdC9yZWFjdC1kb20uanMKKysrIGIvd2ViL3BnYWRtaW4vc3RhdGlj L3ZlbmRvci9yZWFjdC1kb20vZGlzdC9yZWFjdC1kb20uanMKQEAgLTE0MDcyLDYgKzE0MDcyLDI5 IEBAIF9hc3NpZ24oU3ludGhldGljRXZlbnQucHJvdG90eXBlLCB7CiAKIFN5bnRoZXRpY0V2ZW50 LkludGVyZmFjZSA9IEV2ZW50SW50ZXJmYWNlOwogCisvKioKKyAqIEhlbHBlciB0byByZWR1Y2Ug Ym9pbGVycGxhdGUgd2hlbiBjcmVhdGluZyBzdWJjbGFzc2VzLgorICoKKyAqIEBwYXJhbSB7ZnVu Y3Rpb259IENsYXNzCisgKiBAcGFyYW0gez9vYmplY3R9IEludGVyZmFjZQorICovCitTeW50aGV0 aWNFdmVudC5hdWdtZW50Q2xhc3MgPSBmdW5jdGlvbiAoQ2xhc3MsIEludGVyZmFjZSkgeworICB2 YXIgU3VwZXIgPSB0aGlzOworCisgIHZhciBFID0gZnVuY3Rpb24gKCkge307CisgIEUucHJvdG90 eXBlID0gU3VwZXIucHJvdG90eXBlOworICB2YXIgcHJvdG90eXBlID0gbmV3IEUoKTsKKworICBf YXNzaWduKHByb3RvdHlwZSwgQ2xhc3MucHJvdG90eXBlKTsKKyAgQ2xhc3MucHJvdG90eXBlID0g cHJvdG90eXBlOworICBDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDbGFzczsKKworICBD bGFzcy5JbnRlcmZhY2UgPSBfYXNzaWduKHt9LCBTdXBlci5JbnRlcmZhY2UsIEludGVyZmFjZSk7 CisgIENsYXNzLmF1Z21lbnRDbGFzcyA9IFN1cGVyLmF1Z21lbnRDbGFzczsKKworICBQb29sZWRD bGFzcy5hZGRQb29saW5nVG8oQ2xhc3MsIFBvb2xlZENsYXNzLmZvdXJBcmd1bWVudFBvb2xlcik7 Cit9OworCiBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgIGlmIChpc1By b3h5U3VwcG9ydGVkKSB7CiAgICAgLyplc2xpbnQtZGlzYWJsZSBuby1mdW5jLWFzc2lnbiAqLwpA QCAtMTQwOTUsMjggKzE0MTE4LDYgQEAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9u JykgewogICAgIC8qZXNsaW50LWVuYWJsZSBuby1mdW5jLWFzc2lnbiAqLwogICB9CiB9Ci0vKioK LSAqIEhlbHBlciB0byByZWR1Y2UgYm9pbGVycGxhdGUgd2hlbiBjcmVhdGluZyBzdWJjbGFzc2Vz LgotICoKLSAqIEBwYXJhbSB7ZnVuY3Rpb259IENsYXNzCi0gKiBAcGFyYW0gez9vYmplY3R9IElu dGVyZmFjZQotICovCi1TeW50aGV0aWNFdmVudC5hdWdtZW50Q2xhc3MgPSBmdW5jdGlvbiAoQ2xh c3MsIEludGVyZmFjZSkgewotICB2YXIgU3VwZXIgPSB0aGlzOwotCi0gIHZhciBFID0gZnVuY3Rp b24gKCkge307Ci0gIEUucHJvdG90eXBlID0gU3VwZXIucHJvdG90eXBlOwotICB2YXIgcHJvdG90 eXBlID0gbmV3IEUoKTsKLQotICBfYXNzaWduKHByb3RvdHlwZSwgQ2xhc3MucHJvdG90eXBlKTsK LSAgQ2xhc3MucHJvdG90eXBlID0gcHJvdG90eXBlOwotICBDbGFzcy5wcm90b3R5cGUuY29uc3Ry dWN0b3IgPSBDbGFzczsKLQotICBDbGFzcy5JbnRlcmZhY2UgPSBfYXNzaWduKHt9LCBTdXBlci5J bnRlcmZhY2UsIEludGVyZmFjZSk7Ci0gIENsYXNzLmF1Z21lbnRDbGFzcyA9IFN1cGVyLmF1Z21l bnRDbGFzczsKLQotICBQb29sZWRDbGFzcy5hZGRQb29saW5nVG8oQ2xhc3MsIFBvb2xlZENsYXNz LmZvdXJBcmd1bWVudFBvb2xlcik7Ci19OwogCiBQb29sZWRDbGFzcy5hZGRQb29saW5nVG8oU3lu dGhldGljRXZlbnQsIFBvb2xlZENsYXNzLmZvdXJBcmd1bWVudFBvb2xlcik7CiAKZGlmZiAtLWdp dCBhL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2Rpc3QvcmVhY3QtZG9tLm1p bi5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2Rpc3QvcmVhY3QtZG9t Lm1pbi5qcwppbmRleCA0ODBjN2Y5ZS4uNWNlNGU3NWIgMTAwNjQ0Ci0tLSBhL3dlYi9wZ2FkbWlu L3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2Rpc3QvcmVhY3QtZG9tLm1pbi5qcworKysgYi93ZWIv cGdhZG1pbi9zdGF0aWMvdmVuZG9yL3JlYWN0LWRvbS9kaXN0L3JlYWN0LWRvbS5taW4uanMKQEAg LTEsMTUgKzEgQEAKLS8qKgotICogUmVhY3RET00gdjE1LjQuMgotICoKLSAqIENvcHlyaWdodCAy MDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoK LSAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNl bnNlIGZvdW5kIGluIHRoZQotICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBv ZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50Ci0gKiBvZiBwYXRlbnQgcmln aHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9y eS4KLSAqCi0gKi8KLSFmdW5jdGlvbihlKXtpZigib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1 bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlKW1vZHVsZS5leHBvcnRzPWUocmVxdWlyZSgicmVhY3Qi KSk7ZWxzZSBpZigiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShb InJlYWN0Il0sZSk7ZWxzZXt2YXIgdDt0PSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRv dzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBz ZWxmP3NlbGY6dGhpcyx0LlJlYWN0RE9NPWUodC5SZWFjdCl9fShmdW5jdGlvbihlKXtyZXR1cm4g ZnVuY3Rpb24oZSl7cmV0dXJuIGUoKX0oZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24gZSh0LG4s cil7ZnVuY3Rpb24gbyhhLHMpe2lmKCFuW2FdKXtpZighdFthXSl7dmFyIHU9ImZ1bmN0aW9uIj09 dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIXMmJnUpcmV0dXJuIHUoYSwhMCk7aWYoaSlyZXR1 cm4gaShhLCEwKTt2YXIgbD1uZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIithKyInIik7 dGhyb3cgbC5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixsfXZhciBjPW5bYV09e2V4cG9ydHM6e319 O3RbYV1bMF0uY2FsbChjLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFthXVsxXVtlXTtyZXR1 cm4gbyhuP246ZSl9LGMsYy5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW2FdLmV4cG9ydHN9Zm9y KHZhciBpPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGE9MDthPHIubGVuZ3Ro O2ErKylvKHJbYV0pO3JldHVybiBvfSh7MTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2 YXIgcj17UHJvcGVydGllczp7ImFyaWEtY3VycmVudCI6MCwiYXJpYS1kZXRhaWxzIjowLCJhcmlh LWRpc2FibGVkIjowLCJhcmlhLWhpZGRlbiI6MCwiYXJpYS1pbnZhbGlkIjowLCJhcmlhLWtleXNo b3J0Y3V0cyI6MCwiYXJpYS1sYWJlbCI6MCwiYXJpYS1yb2xlZGVzY3JpcHRpb24iOjAsImFyaWEt YXV0b2NvbXBsZXRlIjowLCJhcmlhLWNoZWNrZWQiOjAsImFyaWEtZXhwYW5kZWQiOjAsImFyaWEt aGFzcG9wdXAiOjAsImFyaWEtbGV2ZWwiOjAsImFyaWEtbW9kYWwiOjAsImFyaWEtbXVsdGlsaW5l IjowLCJhcmlhLW11bHRpc2VsZWN0YWJsZSI6MCwiYXJpYS1vcmllbnRhdGlvbiI6MCwiYXJpYS1w bGFjZWhvbGRlciI6MCwiYXJpYS1wcmVzc2VkIjowLCJhcmlhLXJlYWRvbmx5IjowLCJhcmlhLXJl cXVpcmVkIjowLCJhcmlhLXNlbGVjdGVkIjowLCJhcmlhLXNvcnQiOjAsImFyaWEtdmFsdWVtYXgi OjAsImFyaWEtdmFsdWVtaW4iOjAsImFyaWEtdmFsdWVub3ciOjAsImFyaWEtdmFsdWV0ZXh0Ijow LCJhcmlhLWF0b21pYyI6MCwiYXJpYS1idXN5IjowLCJhcmlhLWxpdmUiOjAsImFyaWEtcmVsZXZh bnQiOjAsImFyaWEtZHJvcGVmZmVjdCI6MCwiYXJpYS1ncmFiYmVkIjowLCJhcmlhLWFjdGl2ZWRl c2NlbmRhbnQiOjAsImFyaWEtY29sY291bnQiOjAsImFyaWEtY29saW5kZXgiOjAsImFyaWEtY29s c3BhbiI6MCwiYXJpYS1jb250cm9scyI6MCwiYXJpYS1kZXNjcmliZWRieSI6MCwiYXJpYS1lcnJv cm1lc3NhZ2UiOjAsImFyaWEtZmxvd3RvIjowLCJhcmlhLWxhYmVsbGVkYnkiOjAsImFyaWEtb3du cyI6MCwiYXJpYS1wb3NpbnNldCI6MCwiYXJpYS1yb3djb3VudCI6MCwiYXJpYS1yb3dpbmRleCI6 MCwiYXJpYS1yb3dzcGFuIjowLCJhcmlhLXNldHNpemUiOjB9LERPTUF0dHJpYnV0ZU5hbWVzOnt9 LERPTVByb3BlcnR5TmFtZXM6e319O3QuZXhwb3J0cz1yfSx7fV0sMjpbZnVuY3Rpb24oZSx0LG4p eyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDMzKSxvPWUoMTMxKSxpPXtmb2N1c0RPTUNvbXBvbmVudDpm dW5jdGlvbigpe28oci5nZXROb2RlRnJvbUluc3RhbmNlKHRoaXMpKX19O3QuZXhwb3J0cz1pfSx7 MTMxOjEzMSwzMzozM31dLDM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24g cigpe3ZhciBlPXdpbmRvdy5vcGVyYTtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJiJmdW5jdGlv biI9PXR5cGVvZiBlLnZlcnNpb24mJnBhcnNlSW50KGUudmVyc2lvbigpLDEwKTw9MTJ9ZnVuY3Rp b24gbyhlKXtyZXR1cm4oZS5jdHJsS2V5fHxlLmFsdEtleXx8ZS5tZXRhS2V5KSYmIShlLmN0cmxL ZXkmJmUuYWx0S2V5KX1mdW5jdGlvbiBpKGUpe3N3aXRjaChlKXtjYXNlInRvcENvbXBvc2l0aW9u U3RhcnQiOnJldHVybiBrLmNvbXBvc2l0aW9uU3RhcnQ7Y2FzZSJ0b3BDb21wb3NpdGlvbkVuZCI6 cmV0dXJuIGsuY29tcG9zaXRpb25FbmQ7Y2FzZSJ0b3BDb21wb3NpdGlvblVwZGF0ZSI6cmV0dXJu IGsuY29tcG9zaXRpb25VcGRhdGV9fWZ1bmN0aW9uIGEoZSx0KXtyZXR1cm4idG9wS2V5RG93biI9 PT1lJiZ0LmtleUNvZGU9PT1ffWZ1bmN0aW9uIHMoZSx0KXtzd2l0Y2goZSl7Y2FzZSJ0b3BLZXlV cCI6cmV0dXJuIHkuaW5kZXhPZih0LmtleUNvZGUpIT09LTE7Y2FzZSJ0b3BLZXlEb3duIjpyZXR1 cm4gdC5rZXlDb2RlIT09XztjYXNlInRvcEtleVByZXNzIjpjYXNlInRvcE1vdXNlRG93biI6Y2Fz ZSJ0b3BCbHVyIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiB1KGUpe3ZhciB0 PWUuZGV0YWlsO3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmImRhdGEiaW4gdD90LmRhdGE6bnVs bH1mdW5jdGlvbiBsKGUsdCxuLHIpe3ZhciBvLGw7aWYoQz9vPWkoZSk6Tj9zKGUsbikmJihvPWsu Y29tcG9zaXRpb25FbmQpOmEoZSxuKSYmKG89ay5jb21wb3NpdGlvblN0YXJ0KSwhbylyZXR1cm4g bnVsbDt4JiYoTnx8byE9PWsuY29tcG9zaXRpb25TdGFydD9vPT09ay5jb21wb3NpdGlvbkVuZCYm TiYmKGw9Ti5nZXREYXRhKCkpOk49bS5nZXRQb29sZWQocikpO3ZhciBjPXYuZ2V0UG9vbGVkKG8s dCxuLHIpO2lmKGwpYy5kYXRhPWw7ZWxzZXt2YXIgcD11KG4pO251bGwhPT1wJiYoYy5kYXRhPXAp fXJldHVybiBmLmFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMoYyksY31mdW5jdGlvbiBjKGUs dCl7c3dpdGNoKGUpe2Nhc2UidG9wQ29tcG9zaXRpb25FbmQiOnJldHVybiB1KHQpO2Nhc2UidG9w S2V5UHJlc3MiOnZhciBuPXQud2hpY2g7cmV0dXJuIG4hPT13P251bGw6KFA9ITAsVCk7Y2FzZSJ0 b3BUZXh0SW5wdXQiOnZhciByPXQuZGF0YTtyZXR1cm4gcj09PVQmJlA/bnVsbDpyO2RlZmF1bHQ6 cmV0dXJuIG51bGx9fWZ1bmN0aW9uIHAoZSx0KXtpZihOKXtpZigidG9wQ29tcG9zaXRpb25FbmQi PT09ZXx8IUMmJnMoZSx0KSl7dmFyIG49Ti5nZXREYXRhKCk7cmV0dXJuIG0ucmVsZWFzZShOKSxO PW51bGwsbn1yZXR1cm4gbnVsbH1zd2l0Y2goZSl7Y2FzZSJ0b3BQYXN0ZSI6cmV0dXJuIG51bGw7 Y2FzZSJ0b3BLZXlQcmVzcyI6cmV0dXJuIHQud2hpY2gmJiFvKHQpP1N0cmluZy5mcm9tQ2hhckNv ZGUodC53aGljaCk6bnVsbDtjYXNlInRvcENvbXBvc2l0aW9uRW5kIjpyZXR1cm4geD9udWxsOnQu ZGF0YTtkZWZhdWx0OnJldHVybiBudWxsfX1mdW5jdGlvbiBkKGUsdCxuLHIpe3ZhciBvO2lmKG89 RT9jKGUsbik6cChlLG4pLCFvKXJldHVybiBudWxsO3ZhciBpPWcuZ2V0UG9vbGVkKGsuYmVmb3Jl SW5wdXQsdCxuLHIpO3JldHVybiBpLmRhdGE9byxmLmFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNo ZXMoaSksaX12YXIgZj1lKDE5KSxoPWUoMTIzKSxtPWUoMjApLHY9ZSg3OCksZz1lKDgyKSx5PVs5 LDEzLDI3LDMyXSxfPTIyOSxDPWguY2FuVXNlRE9NJiYiQ29tcG9zaXRpb25FdmVudCJpbiB3aW5k b3csYj1udWxsO2guY2FuVXNlRE9NJiYiZG9jdW1lbnRNb2RlImluIGRvY3VtZW50JiYoYj1kb2N1 bWVudC5kb2N1bWVudE1vZGUpO3ZhciBFPWguY2FuVXNlRE9NJiYiVGV4dEV2ZW50ImluIHdpbmRv dyYmIWImJiFyKCkseD1oLmNhblVzZURPTSYmKCFDfHxiJiZiPjgmJmI8PTExKSx3PTMyLFQ9U3Ry aW5nLmZyb21DaGFyQ29kZSh3KSxrPXtiZWZvcmVJbnB1dDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFt ZXM6e2J1YmJsZWQ6Im9uQmVmb3JlSW5wdXQiLGNhcHR1cmVkOiJvbkJlZm9yZUlucHV0Q2FwdHVy ZSJ9LGRlcGVuZGVuY2llczpbInRvcENvbXBvc2l0aW9uRW5kIiwidG9wS2V5UHJlc3MiLCJ0b3BU ZXh0SW5wdXQiLCJ0b3BQYXN0ZSJdfSxjb21wb3NpdGlvbkVuZDp7cGhhc2VkUmVnaXN0cmF0aW9u TmFtZXM6e2J1YmJsZWQ6Im9uQ29tcG9zaXRpb25FbmQiLGNhcHR1cmVkOiJvbkNvbXBvc2l0aW9u RW5kQ2FwdHVyZSJ9LGRlcGVuZGVuY2llczpbInRvcEJsdXIiLCJ0b3BDb21wb3NpdGlvbkVuZCIs InRvcEtleURvd24iLCJ0b3BLZXlQcmVzcyIsInRvcEtleVVwIiwidG9wTW91c2VEb3duIl19LGNv bXBvc2l0aW9uU3RhcnQ6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOiJvbkNvbXBv c2l0aW9uU3RhcnQiLGNhcHR1cmVkOiJvbkNvbXBvc2l0aW9uU3RhcnRDYXB0dXJlIn0sZGVwZW5k ZW5jaWVzOlsidG9wQmx1ciIsInRvcENvbXBvc2l0aW9uU3RhcnQiLCJ0b3BLZXlEb3duIiwidG9w S2V5UHJlc3MiLCJ0b3BLZXlVcCIsInRvcE1vdXNlRG93biJdfSxjb21wb3NpdGlvblVwZGF0ZTp7 cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Im9uQ29tcG9zaXRpb25VcGRhdGUiLGNh cHR1cmVkOiJvbkNvbXBvc2l0aW9uVXBkYXRlQ2FwdHVyZSJ9LGRlcGVuZGVuY2llczpbInRvcEJs dXIiLCJ0b3BDb21wb3NpdGlvblVwZGF0ZSIsInRvcEtleURvd24iLCJ0b3BLZXlQcmVzcyIsInRv cEtleVVwIiwidG9wTW91c2VEb3duIl19fSxQPSExLE49bnVsbCxTPXtldmVudFR5cGVzOmssZXh0 cmFjdEV2ZW50czpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm5bbChlLHQsbixyKSxkKGUsdCxuLHIp XX19O3QuZXhwb3J0cz1TfSx7MTIzOjEyMywxOToxOSwyMDoyMCw3ODo3OCw4Mjo4Mn1dLDQ6W2Z1 bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3JldHVybiBlK3QuY2hh ckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHJpbmcoMSl9dmFyIG89e2FuaW1hdGlvbkl0ZXJh dGlvbkNvdW50OiEwLGJvcmRlckltYWdlT3V0c2V0OiEwLGJvcmRlckltYWdlU2xpY2U6ITAsYm9y ZGVySW1hZ2VXaWR0aDohMCxib3hGbGV4OiEwLGJveEZsZXhHcm91cDohMCxib3hPcmRpbmFsR3Jv dXA6ITAsY29sdW1uQ291bnQ6ITAsZmxleDohMCxmbGV4R3JvdzohMCxmbGV4UG9zaXRpdmU6ITAs ZmxleFNocmluazohMCxmbGV4TmVnYXRpdmU6ITAsZmxleE9yZGVyOiEwLGdyaWRSb3c6ITAsZ3Jp ZENvbHVtbjohMCxmb250V2VpZ2h0OiEwLGxpbmVDbGFtcDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNp dHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx0YWJTaXplOiEwLHdpZG93czohMCx6SW5kZXg6ITAs em9vbTohMCxmaWxsT3BhY2l0eTohMCxmbG9vZE9wYWNpdHk6ITAsc3RvcE9wYWNpdHk6ITAsc3Ry b2tlRGFzaGFycmF5OiEwLHN0cm9rZURhc2hvZmZzZXQ6ITAsc3Ryb2tlTWl0ZXJsaW1pdDohMCxz dHJva2VPcGFjaXR5OiEwLHN0cm9rZVdpZHRoOiEwfSxpPVsiV2Via2l0IiwibXMiLCJNb3oiLCJP Il07T2JqZWN0LmtleXMobykuZm9yRWFjaChmdW5jdGlvbihlKXtpLmZvckVhY2goZnVuY3Rpb24o dCl7b1tyKHQsZSldPW9bZV19KX0pO3ZhciBhPXtiYWNrZ3JvdW5kOntiYWNrZ3JvdW5kQXR0YWNo bWVudDohMCxiYWNrZ3JvdW5kQ29sb3I6ITAsYmFja2dyb3VuZEltYWdlOiEwLGJhY2tncm91bmRQ b3NpdGlvblg6ITAsYmFja2dyb3VuZFBvc2l0aW9uWTohMCxiYWNrZ3JvdW5kUmVwZWF0OiEwfSxi YWNrZ3JvdW5kUG9zaXRpb246e2JhY2tncm91bmRQb3NpdGlvblg6ITAsYmFja2dyb3VuZFBvc2l0 aW9uWTohMH0sYm9yZGVyOntib3JkZXJXaWR0aDohMCxib3JkZXJTdHlsZTohMCxib3JkZXJDb2xv cjohMH0sYm9yZGVyQm90dG9tOntib3JkZXJCb3R0b21XaWR0aDohMCxib3JkZXJCb3R0b21TdHls ZTohMCxib3JkZXJCb3R0b21Db2xvcjohMH0sYm9yZGVyTGVmdDp7Ym9yZGVyTGVmdFdpZHRoOiEw LGJvcmRlckxlZnRTdHlsZTohMCxib3JkZXJMZWZ0Q29sb3I6ITB9LGJvcmRlclJpZ2h0Ontib3Jk ZXJSaWdodFdpZHRoOiEwLGJvcmRlclJpZ2h0U3R5bGU6ITAsYm9yZGVyUmlnaHRDb2xvcjohMH0s Ym9yZGVyVG9wOntib3JkZXJUb3BXaWR0aDohMCxib3JkZXJUb3BTdHlsZTohMCxib3JkZXJUb3BD b2xvcjohMH0sZm9udDp7Zm9udFN0eWxlOiEwLGZvbnRWYXJpYW50OiEwLGZvbnRXZWlnaHQ6ITAs Zm9udFNpemU6ITAsbGluZUhlaWdodDohMCxmb250RmFtaWx5OiEwfSxvdXRsaW5lOntvdXRsaW5l V2lkdGg6ITAsb3V0bGluZVN0eWxlOiEwLG91dGxpbmVDb2xvcjohMH19LHM9e2lzVW5pdGxlc3NO dW1iZXI6byxzaG9ydGhhbmRQcm9wZXJ0eUV4cGFuc2lvbnM6YX07dC5leHBvcnRzPXN9LHt9XSw1 OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoNCksbz1lKDEyMyksaT0oZSg1 OCksZSgxMjUpLGUoOTQpKSxhPWUoMTM2KSxzPWUoMTQwKSx1PShlKDE0MikscyhmdW5jdGlvbihl KXtyZXR1cm4gYShlKX0pKSxsPSExLGM9ImNzc0Zsb2F0IjtpZihvLmNhblVzZURPTSl7dmFyIHA9 ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGU7dHJ5e3AuZm9udD0iIn1jYXRjaChl KXtsPSEwfXZvaWQgMD09PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5jc3NGbG9hdCYm KGM9InN0eWxlRmxvYXQiKX12YXIgZD17Y3JlYXRlTWFya3VwRm9yU3R5bGVzOmZ1bmN0aW9uKGUs dCl7dmFyIG49IiI7Zm9yKHZhciByIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eShyKSl7dmFyIG89 ZVtyXTtudWxsIT1vJiYobis9dShyKSsiOiIsbis9aShyLG8sdCkrIjsiKX1yZXR1cm4gbnx8bnVs bH0sc2V0VmFsdWVGb3JTdHlsZXM6ZnVuY3Rpb24oZSx0LG4pe3ZhciBvPWUuc3R5bGU7Zm9yKHZh ciBhIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIHM9aShhLHRbYV0sbik7aWYoImZs b2F0IiE9PWEmJiJjc3NGbG9hdCIhPT1hfHwoYT1jKSxzKW9bYV09cztlbHNle3ZhciB1PWwmJnIu c2hvcnRoYW5kUHJvcGVydHlFeHBhbnNpb25zW2FdO2lmKHUpZm9yKHZhciBwIGluIHUpb1twXT0i IjtlbHNlIG9bYV09IiJ9fX19O3QuZXhwb3J0cz1kfSx7MTIzOjEyMywxMjU6MTI1LDEzNjoxMzYs MTQwOjE0MCwxNDI6MTQyLDQ6NCw1ODo1OCw5NDo5NH1dLDY6W2Z1bmN0aW9uKGUsdCxuKXsidXNl IHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBU eXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfXZhciBvPWUoMTEz KSxpPWUoMjQpLGE9KGUoMTM3KSxmdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7cih0aGlzLGUpLHRo aXMuX2NhbGxiYWNrcz1udWxsLHRoaXMuX2NvbnRleHRzPW51bGwsdGhpcy5fYXJnPXR9cmV0dXJu IGUucHJvdG90eXBlLmVucXVldWU9ZnVuY3Rpb24oZSx0KXt0aGlzLl9jYWxsYmFja3M9dGhpcy5f Y2FsbGJhY2tzfHxbXSx0aGlzLl9jYWxsYmFja3MucHVzaChlKSx0aGlzLl9jb250ZXh0cz10aGlz Ll9jb250ZXh0c3x8W10sdGhpcy5fY29udGV4dHMucHVzaCh0KX0sZS5wcm90b3R5cGUubm90aWZ5 QWxsPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fY2FsbGJhY2tzLHQ9dGhpcy5fY29udGV4dHMsbj10 aGlzLl9hcmc7aWYoZSYmdCl7ZS5sZW5ndGghPT10Lmxlbmd0aD9vKCIyNCIpOnZvaWQgMCx0aGlz Ll9jYWxsYmFja3M9bnVsbCx0aGlzLl9jb250ZXh0cz1udWxsO2Zvcih2YXIgcj0wO3I8ZS5sZW5n dGg7cisrKWVbcl0uY2FsbCh0W3JdLG4pO2UubGVuZ3RoPTAsdC5sZW5ndGg9MH19LGUucHJvdG90 eXBlLmNoZWNrcG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2FsbGJhY2tzP3RoaXMuX2Nh bGxiYWNrcy5sZW5ndGg6MH0sZS5wcm90b3R5cGUucm9sbGJhY2s9ZnVuY3Rpb24oZSl7dGhpcy5f Y2FsbGJhY2tzJiZ0aGlzLl9jb250ZXh0cyYmKHRoaXMuX2NhbGxiYWNrcy5sZW5ndGg9ZSx0aGlz Ll9jb250ZXh0cy5sZW5ndGg9ZSl9LGUucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5f Y2FsbGJhY2tzPW51bGwsdGhpcy5fY29udGV4dHM9bnVsbH0sZS5wcm90b3R5cGUuZGVzdHJ1Y3Rv cj1mdW5jdGlvbigpe3RoaXMucmVzZXQoKX0sZX0oKSk7dC5leHBvcnRzPWkuYWRkUG9vbGluZ1Rv KGEpfSx7MTEzOjExMywxMzc6MTM3LDI0OjI0fV0sNzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3Ry aWN0IjtmdW5jdGlvbiByKGUpe3ZhciB0PWUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNh c2UoKTtyZXR1cm4ic2VsZWN0Ij09PXR8fCJpbnB1dCI9PT10JiYiZmlsZSI9PT1lLnR5cGV9ZnVu Y3Rpb24gbyhlKXt2YXIgdD14LmdldFBvb2xlZChQLmNoYW5nZSxTLGUsdyhlKSk7Xy5hY2N1bXVs YXRlVHdvUGhhc2VEaXNwYXRjaGVzKHQpLEUuYmF0Y2hlZFVwZGF0ZXMoaSx0KX1mdW5jdGlvbiBp KGUpe3kuZW5xdWV1ZUV2ZW50cyhlKSx5LnByb2Nlc3NFdmVudFF1ZXVlKCExKX1mdW5jdGlvbiBh KGUsdCl7Tj1lLFM9dCxOLmF0dGFjaEV2ZW50KCJvbmNoYW5nZSIsbyl9ZnVuY3Rpb24gcygpe04m JihOLmRldGFjaEV2ZW50KCJvbmNoYW5nZSIsbyksTj1udWxsLFM9bnVsbCl9ZnVuY3Rpb24gdShl LHQpe2lmKCJ0b3BDaGFuZ2UiPT09ZSlyZXR1cm4gdH1mdW5jdGlvbiBsKGUsdCxuKXsidG9wRm9j dXMiPT09ZT8ocygpLGEodCxuKSk6InRvcEJsdXIiPT09ZSYmcygpfWZ1bmN0aW9uIGMoZSx0KXtO PWUsUz10LE09ZS52YWx1ZSxJPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZS5jb25z dHJ1Y3Rvci5wcm90b3R5cGUsInZhbHVlIiksT2JqZWN0LmRlZmluZVByb3BlcnR5KE4sInZhbHVl IixBKSxOLmF0dGFjaEV2ZW50P04uYXR0YWNoRXZlbnQoIm9ucHJvcGVydHljaGFuZ2UiLGQpOk4u YWRkRXZlbnRMaXN0ZW5lcigicHJvcGVydHljaGFuZ2UiLGQsITEpfWZ1bmN0aW9uIHAoKXtOJiYo ZGVsZXRlIE4udmFsdWUsTi5kZXRhY2hFdmVudD9OLmRldGFjaEV2ZW50KCJvbnByb3BlcnR5Y2hh bmdlIixkKTpOLnJlbW92ZUV2ZW50TGlzdGVuZXIoInByb3BlcnR5Y2hhbmdlIixkLCExKSxOPW51 bGwsUz1udWxsLE09bnVsbCxJPW51bGwpfWZ1bmN0aW9uIGQoZSl7aWYoInZhbHVlIj09PWUucHJv cGVydHlOYW1lKXt2YXIgdD1lLnNyY0VsZW1lbnQudmFsdWU7dCE9PU0mJihNPXQsbyhlKSl9fWZ1 bmN0aW9uIGYoZSx0KXtpZigidG9wSW5wdXQiPT09ZSlyZXR1cm4gdH1mdW5jdGlvbiBoKGUsdCxu KXsidG9wRm9jdXMiPT09ZT8ocCgpLGModCxuKSk6InRvcEJsdXIiPT09ZSYmcCgpfWZ1bmN0aW9u IG0oZSx0KXtpZigoInRvcFNlbGVjdGlvbkNoYW5nZSI9PT1lfHwidG9wS2V5VXAiPT09ZXx8InRv cEtleURvd24iPT09ZSkmJk4mJk4udmFsdWUhPT1NKXJldHVybiBNPU4udmFsdWUsU31mdW5jdGlv biB2KGUpe3JldHVybiBlLm5vZGVOYW1lJiYiaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2Fz ZSgpJiYoImNoZWNrYm94Ij09PWUudHlwZXx8InJhZGlvIj09PWUudHlwZSl9ZnVuY3Rpb24gZyhl LHQpe2lmKCJ0b3BDbGljayI9PT1lKXJldHVybiB0fXZhciB5PWUoMTYpLF89ZSgxOSksQz1lKDEy MyksYj1lKDMzKSxFPWUoNzEpLHg9ZSg4MCksdz1lKDEwMiksVD1lKDExMCksaz1lKDExMSksUD17 Y2hhbmdlOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDoib25DaGFuZ2UiLGNhcHR1 cmVkOiJvbkNoYW5nZUNhcHR1cmUifSxkZXBlbmRlbmNpZXM6WyJ0b3BCbHVyIiwidG9wQ2hhbmdl IiwidG9wQ2xpY2siLCJ0b3BGb2N1cyIsInRvcElucHV0IiwidG9wS2V5RG93biIsInRvcEtleVVw IiwidG9wU2VsZWN0aW9uQ2hhbmdlIl19fSxOPW51bGwsUz1udWxsLE09bnVsbCxJPW51bGwsTz0h MTtDLmNhblVzZURPTSYmKE89VCgiY2hhbmdlIikmJighZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHxk b2N1bWVudC5kb2N1bWVudE1vZGU+OCkpO3ZhciBSPSExO0MuY2FuVXNlRE9NJiYoUj1UKCJpbnB1 dCIpJiYoIWRvY3VtZW50LmRvY3VtZW50TW9kZXx8ZG9jdW1lbnQuZG9jdW1lbnRNb2RlPjExKSk7 dmFyIEE9e2dldDpmdW5jdGlvbigpe3JldHVybiBJLmdldC5jYWxsKHRoaXMpfSxzZXQ6ZnVuY3Rp b24oZSl7TT0iIitlLEkuc2V0LmNhbGwodGhpcyxlKX19LEQ9e2V2ZW50VHlwZXM6UCxleHRyYWN0 RXZlbnRzOmZ1bmN0aW9uKGUsdCxuLG8pe3ZhciBpLGEscz10P2IuZ2V0Tm9kZUZyb21JbnN0YW5j ZSh0KTp3aW5kb3c7aWYocihzKT9PP2k9dTphPWw6ayhzKT9SP2k9ZjooaT1tLGE9aCk6dihzKSYm KGk9ZyksaSl7dmFyIGM9aShlLHQpO2lmKGMpe3ZhciBwPXguZ2V0UG9vbGVkKFAuY2hhbmdlLGMs bixvKTtyZXR1cm4gcC50eXBlPSJjaGFuZ2UiLF8uYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hl cyhwKSxwfX1hJiZhKGUscyx0KX19O3QuZXhwb3J0cz1EfSx7MTAyOjEwMiwxMTA6MTEwLDExMTox MTEsMTIzOjEyMywxNjoxNiwxOToxOSwzMzozMyw3MTo3MSw4MDo4MH1dLDg6W2Z1bmN0aW9uKGUs dCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQp JiYodD10WzFdKSx0P3QubmV4dFNpYmxpbmc6ZS5maXJzdENoaWxkfWZ1bmN0aW9uIG8oZSx0LG4p e2MuaW5zZXJ0VHJlZUJlZm9yZShlLHQsbil9ZnVuY3Rpb24gaShlLHQsbil7QXJyYXkuaXNBcnJh eSh0KT9zKGUsdFswXSx0WzFdLG4pOm0oZSx0LG4pfWZ1bmN0aW9uIGEoZSx0KXtpZihBcnJheS5p c0FycmF5KHQpKXt2YXIgbj10WzFdO3Q9dFswXSx1KGUsdCxuKSxlLnJlbW92ZUNoaWxkKG4pfWUu cmVtb3ZlQ2hpbGQodCl9ZnVuY3Rpb24gcyhlLHQsbixyKXtmb3IodmFyIG89dDs7KXt2YXIgaT1v Lm5leHRTaWJsaW5nO2lmKG0oZSxvLHIpLG89PT1uKWJyZWFrO289aX19ZnVuY3Rpb24gdShlLHQs bil7Zm9yKDs7KXt2YXIgcj10Lm5leHRTaWJsaW5nO2lmKHI9PT1uKWJyZWFrO2UucmVtb3ZlQ2hp bGQocil9fWZ1bmN0aW9uIGwoZSx0LG4pe3ZhciByPWUucGFyZW50Tm9kZSxvPWUubmV4dFNpYmxp bmc7bz09PXQ/biYmbShyLGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG4pLG8pOm4/KGgobyxuKSx1 KHIsbyx0KSk6dShyLGUsdCl9dmFyIGM9ZSg5KSxwPWUoMTMpLGQ9KGUoMzMpLGUoNTgpLGUoOTMp KSxmPWUoMTE1KSxoPWUoMTE2KSxtPWQoZnVuY3Rpb24oZSx0LG4pe2UuaW5zZXJ0QmVmb3JlKHQs bil9KSx2PXAuZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXAsZz17ZGFuZ2Vyb3VzbHlS ZXBsYWNlTm9kZVdpdGhNYXJrdXA6dixyZXBsYWNlRGVsaW1pdGVkVGV4dDpsLHByb2Nlc3NVcGRh dGVzOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBzPXRbbl07 c3dpdGNoKHMudHlwZSl7Y2FzZSJJTlNFUlRfTUFSS1VQIjpvKGUscy5jb250ZW50LHIoZSxzLmFm dGVyTm9kZSkpO2JyZWFrO2Nhc2UiTU9WRV9FWElTVElORyI6aShlLHMuZnJvbU5vZGUscihlLHMu YWZ0ZXJOb2RlKSk7YnJlYWs7Y2FzZSJTRVRfTUFSS1VQIjpmKGUscy5jb250ZW50KTticmVhaztj YXNlIlRFWFRfQ09OVEVOVCI6aChlLHMuY29udGVudCk7YnJlYWs7Y2FzZSJSRU1PVkVfTk9ERSI6 YShlLHMuZnJvbU5vZGUpfX19fTt0LmV4cG9ydHM9Z30sezExNToxMTUsMTE2OjExNiwxMzoxMywz MzozMyw1ODo1OCw5OjksOTM6OTN9XSw5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1 bmN0aW9uIHIoZSl7aWYodil7dmFyIHQ9ZS5ub2RlLG49ZS5jaGlsZHJlbjtpZihuLmxlbmd0aClm b3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKylnKHQsbltyXSxudWxsKTtlbHNlIG51bGwhPWUuaHRt bD9wKHQsZS5odG1sKTpudWxsIT1lLnRleHQmJmYodCxlLnRleHQpfX1mdW5jdGlvbiBvKGUsdCl7 ZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0Lm5vZGUsZSkscih0KX1mdW5jdGlvbiBpKGUsdCl7 dj9lLmNoaWxkcmVuLnB1c2godCk6ZS5ub2RlLmFwcGVuZENoaWxkKHQubm9kZSl9ZnVuY3Rpb24g YShlLHQpe3Y/ZS5odG1sPXQ6cChlLm5vZGUsdCl9ZnVuY3Rpb24gcyhlLHQpe3Y/ZS50ZXh0PXQ6 ZihlLm5vZGUsdCl9ZnVuY3Rpb24gdSgpe3JldHVybiB0aGlzLm5vZGUubm9kZU5hbWV9ZnVuY3Rp b24gbChlKXtyZXR1cm57bm9kZTplLGNoaWxkcmVuOltdLGh0bWw6bnVsbCx0ZXh0Om51bGwsdG9T dHJpbmc6dX19dmFyIGM9ZSgxMCkscD1lKDExNSksZD1lKDkzKSxmPWUoMTE2KSxoPTEsbT0xMSx2 PSJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJiJudW1iZXIiPT10eXBlb2YgZG9jdW1lbnQu ZG9jdW1lbnRNb2RlfHwidW5kZWZpbmVkIiE9dHlwZW9mIG5hdmlnYXRvciYmInN0cmluZyI9PXR5 cGVvZiBuYXZpZ2F0b3IudXNlckFnZW50JiYvXGJFZGdlXC9cZC8udGVzdChuYXZpZ2F0b3IudXNl ckFnZW50KSxnPWQoZnVuY3Rpb24oZSx0LG4pe3Qubm9kZS5ub2RlVHlwZT09PW18fHQubm9kZS5u b2RlVHlwZT09PWgmJiJvYmplY3QiPT09dC5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJihu dWxsPT10Lm5vZGUubmFtZXNwYWNlVVJJfHx0Lm5vZGUubmFtZXNwYWNlVVJJPT09Yy5odG1sKT8o cih0KSxlLmluc2VydEJlZm9yZSh0Lm5vZGUsbikpOihlLmluc2VydEJlZm9yZSh0Lm5vZGUsbiks cih0KSl9KTtsLmluc2VydFRyZWVCZWZvcmU9ZyxsLnJlcGxhY2VDaGlsZFdpdGhUcmVlPW8sbC5x dWV1ZUNoaWxkPWksbC5xdWV1ZUhUTUw9YSxsLnF1ZXVlVGV4dD1zLHQuZXhwb3J0cz1sfSx7MTA6 MTAsMTE1OjExNSwxMTY6MTE2LDkzOjkzfV0sMTA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmlj dCI7dmFyIHI9e2h0bWw6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLG1hdGhtbDoiaHR0 cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCIsc3ZnOiJodHRwOi8vd3d3LnczLm9yZy8y MDAwL3N2ZyJ9O3QuZXhwb3J0cz1yfSx7fV0sMTE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmlj dCI7ZnVuY3Rpb24gcihlLHQpe3JldHVybihlJnQpPT09dH12YXIgbz1lKDExMyksaT0oZSgxMzcp LHtNVVNUX1VTRV9QUk9QRVJUWToxLEhBU19CT09MRUFOX1ZBTFVFOjQsSEFTX05VTUVSSUNfVkFM VUU6OCxIQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRToyNCxIQVNfT1ZFUkxPQURFRF9CT09MRUFO X1ZBTFVFOjMyLGluamVjdERPTVByb3BlcnR5Q29uZmlnOmZ1bmN0aW9uKGUpe3ZhciB0PWksbj1l LlByb3BlcnRpZXN8fHt9LGE9ZS5ET01BdHRyaWJ1dGVOYW1lc3BhY2VzfHx7fSx1PWUuRE9NQXR0 cmlidXRlTmFtZXN8fHt9LGw9ZS5ET01Qcm9wZXJ0eU5hbWVzfHx7fSxjPWUuRE9NTXV0YXRpb25N ZXRob2RzfHx7fTtlLmlzQ3VzdG9tQXR0cmlidXRlJiZzLl9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0 aW9ucy5wdXNoKGUuaXNDdXN0b21BdHRyaWJ1dGUpO2Zvcih2YXIgcCBpbiBuKXtzLnByb3BlcnRp ZXMuaGFzT3duUHJvcGVydHkocCk/bygiNDgiLHApOnZvaWQgMDt2YXIgZD1wLnRvTG93ZXJDYXNl KCksZj1uW3BdLGg9e2F0dHJpYnV0ZU5hbWU6ZCxhdHRyaWJ1dGVOYW1lc3BhY2U6bnVsbCxwcm9w ZXJ0eU5hbWU6cCxtdXRhdGlvbk1ldGhvZDpudWxsLG11c3RVc2VQcm9wZXJ0eTpyKGYsdC5NVVNU X1VTRV9QUk9QRVJUWSksaGFzQm9vbGVhblZhbHVlOnIoZix0LkhBU19CT09MRUFOX1ZBTFVFKSxo YXNOdW1lcmljVmFsdWU6cihmLHQuSEFTX05VTUVSSUNfVkFMVUUpLGhhc1Bvc2l0aXZlTnVtZXJp Y1ZhbHVlOnIoZix0LkhBU19QT1NJVElWRV9OVU1FUklDX1ZBTFVFKSxoYXNPdmVybG9hZGVkQm9v bGVhblZhbHVlOnIoZix0LkhBU19PVkVSTE9BREVEX0JPT0xFQU5fVkFMVUUpfTtpZihoLmhhc0Jv b2xlYW5WYWx1ZStoLmhhc051bWVyaWNWYWx1ZStoLmhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWU8 PTE/dm9pZCAwOm8oIjUwIixwKSx1Lmhhc093blByb3BlcnR5KHApKXt2YXIgbT11W3BdO2guYXR0 cmlidXRlTmFtZT1tfWEuaGFzT3duUHJvcGVydHkocCkmJihoLmF0dHJpYnV0ZU5hbWVzcGFjZT1h W3BdKSxsLmhhc093blByb3BlcnR5KHApJiYoaC5wcm9wZXJ0eU5hbWU9bFtwXSksYy5oYXNPd25Q cm9wZXJ0eShwKSYmKGgubXV0YXRpb25NZXRob2Q9Y1twXSkscy5wcm9wZXJ0aWVzW3BdPWh9fX0p LGE9IjpBLVpfYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZG XFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUy MThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1c XHVGRkZEIixzPXtJRF9BVFRSSUJVVEVfTkFNRToiZGF0YS1yZWFjdGlkIixST09UX0FUVFJJQlVU RV9OQU1FOiJkYXRhLXJlYWN0cm9vdCIsQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUjphLEFUVFJJ QlVURV9OQU1FX0NIQVI6YSsiXFwtLjAtOVxcdTAwQjdcXHUwMzAwLVxcdTAzNkZcXHUyMDNGLVxc dTIwNDAiLHByb3BlcnRpZXM6e30sZ2V0UG9zc2libGVTdGFuZGFyZE5hbWU6bnVsbCxfaXNDdXN0 b21BdHRyaWJ1dGVGdW5jdGlvbnM6W10saXNDdXN0b21BdHRyaWJ1dGU6ZnVuY3Rpb24oZSl7Zm9y KHZhciB0PTA7dDxzLl9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9ucy5sZW5ndGg7dCsrKXt2YXIg bj1zLl9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9uc1t0XTtpZihuKGUpKXJldHVybiEwfXJldHVy biExfSxpbmplY3Rpb246aX07dC5leHBvcnRzPXN9LHsxMTM6MTEzLDEzNzoxMzd9XSwxMjpbZnVu Y3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiEhbC5oYXNPd25Q cm9wZXJ0eShlKXx8IXUuaGFzT3duUHJvcGVydHkoZSkmJihzLnRlc3QoZSk/KGxbZV09ITAsITAp Oih1W2VdPSEwLCExKSl9ZnVuY3Rpb24gbyhlLHQpe3JldHVybiBudWxsPT10fHxlLmhhc0Jvb2xl YW5WYWx1ZSYmIXR8fGUuaGFzTnVtZXJpY1ZhbHVlJiZpc05hTih0KXx8ZS5oYXNQb3NpdGl2ZU51 bWVyaWNWYWx1ZSYmdDwxfHxlLmhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWUmJnQ9PT0hMX12YXIg aT1lKDExKSxhPShlKDMzKSxlKDU4KSxlKDExMikpLHM9KGUoMTQyKSxuZXcgUmVnRXhwKCJeWyIr aS5BVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSKyJdWyIraS5BVFRSSUJVVEVfTkFNRV9DSEFSKyJd KiQiKSksdT17fSxsPXt9LGM9e2NyZWF0ZU1hcmt1cEZvcklEOmZ1bmN0aW9uKGUpe3JldHVybiBp LklEX0FUVFJJQlVURV9OQU1FKyI9IithKGUpfSxzZXRBdHRyaWJ1dGVGb3JJRDpmdW5jdGlvbihl LHQpe2Uuc2V0QXR0cmlidXRlKGkuSURfQVRUUklCVVRFX05BTUUsdCl9LGNyZWF0ZU1hcmt1cEZv clJvb3Q6ZnVuY3Rpb24oKXtyZXR1cm4gaS5ST09UX0FUVFJJQlVURV9OQU1FKyc9IiInfSxzZXRB dHRyaWJ1dGVGb3JSb290OmZ1bmN0aW9uKGUpe2Uuc2V0QXR0cmlidXRlKGkuUk9PVF9BVFRSSUJV VEVfTkFNRSwiIil9LGNyZWF0ZU1hcmt1cEZvclByb3BlcnR5OmZ1bmN0aW9uKGUsdCl7dmFyIG49 aS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGUpP2kucHJvcGVydGllc1tlXTpudWxsO2lmKG4p e2lmKG8obix0KSlyZXR1cm4iIjt2YXIgcj1uLmF0dHJpYnV0ZU5hbWU7cmV0dXJuIG4uaGFzQm9v bGVhblZhbHVlfHxuLmhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWUmJnQ9PT0hMD9yKyc9IiInOnIr Ij0iK2EodCl9cmV0dXJuIGkuaXNDdXN0b21BdHRyaWJ1dGUoZSk/bnVsbD09dD8iIjplKyI9Iith KHQpOm51bGx9LGNyZWF0ZU1hcmt1cEZvckN1c3RvbUF0dHJpYnV0ZTpmdW5jdGlvbihlLHQpe3Jl dHVybiByKGUpJiZudWxsIT10P2UrIj0iK2EodCk6IiJ9LHNldFZhbHVlRm9yUHJvcGVydHk6ZnVu Y3Rpb24oZSx0LG4pe3ZhciByPWkucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eSh0KT9pLnByb3Bl cnRpZXNbdF06bnVsbDtpZihyKXt2YXIgYT1yLm11dGF0aW9uTWV0aG9kO2lmKGEpYShlLG4pO2Vs c2V7aWYobyhyLG4pKXJldHVybiB2b2lkIHRoaXMuZGVsZXRlVmFsdWVGb3JQcm9wZXJ0eShlLHQp O2lmKHIubXVzdFVzZVByb3BlcnR5KWVbci5wcm9wZXJ0eU5hbWVdPW47ZWxzZXt2YXIgcz1yLmF0 dHJpYnV0ZU5hbWUsdT1yLmF0dHJpYnV0ZU5hbWVzcGFjZTt1P2Uuc2V0QXR0cmlidXRlTlModSxz LCIiK24pOnIuaGFzQm9vbGVhblZhbHVlfHxyLmhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWUmJm49 PT0hMD9lLnNldEF0dHJpYnV0ZShzLCIiKTplLnNldEF0dHJpYnV0ZShzLCIiK24pfX19ZWxzZSBp ZihpLmlzQ3VzdG9tQXR0cmlidXRlKHQpKXJldHVybiB2b2lkIGMuc2V0VmFsdWVGb3JBdHRyaWJ1 dGUoZSx0LG4pfSxzZXRWYWx1ZUZvckF0dHJpYnV0ZTpmdW5jdGlvbihlLHQsbil7cih0KSYmKG51 bGw9PW4/ZS5yZW1vdmVBdHRyaWJ1dGUodCk6ZS5zZXRBdHRyaWJ1dGUodCwiIituKSl9LGRlbGV0 ZVZhbHVlRm9yQXR0cmlidXRlOmZ1bmN0aW9uKGUsdCl7ZS5yZW1vdmVBdHRyaWJ1dGUodCl9LGRl bGV0ZVZhbHVlRm9yUHJvcGVydHk6ZnVuY3Rpb24oZSx0KXt2YXIgbj1pLnByb3BlcnRpZXMuaGFz T3duUHJvcGVydHkodCk/aS5wcm9wZXJ0aWVzW3RdOm51bGw7aWYobil7dmFyIHI9bi5tdXRhdGlv bk1ldGhvZDtpZihyKXIoZSx2b2lkIDApO2Vsc2UgaWYobi5tdXN0VXNlUHJvcGVydHkpe3ZhciBv PW4ucHJvcGVydHlOYW1lO24uaGFzQm9vbGVhblZhbHVlP2Vbb109ITE6ZVtvXT0iIn1lbHNlIGUu cmVtb3ZlQXR0cmlidXRlKG4uYXR0cmlidXRlTmFtZSl9ZWxzZSBpLmlzQ3VzdG9tQXR0cmlidXRl KHQpJiZlLnJlbW92ZUF0dHJpYnV0ZSh0KX19O3QuZXhwb3J0cz1jfSx7MTE6MTEsMTEyOjExMiwx NDI6MTQyLDMzOjMzLDU4OjU4fV0sMTM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFy IHI9ZSgxMTMpLG89ZSg5KSxpPWUoMTIzKSxhPWUoMTI4KSxzPWUoMTI5KSx1PShlKDEzNykse2Rh bmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwOmZ1bmN0aW9uKGUsdCl7aWYoaS5jYW5Vc2VE T00/dm9pZCAwOnIoIjU2IiksdD92b2lkIDA6cigiNTciKSwiSFRNTCI9PT1lLm5vZGVOYW1lP3Io IjU4Iik6dm9pZCAwLCJzdHJpbmciPT10eXBlb2YgdCl7dmFyIG49YSh0LHMpWzBdO2UucGFyZW50 Tm9kZS5yZXBsYWNlQ2hpbGQobixlKX1lbHNlIG8ucmVwbGFjZUNoaWxkV2l0aFRyZWUoZSx0KX19 KTt0LmV4cG9ydHM9dX0sezExMzoxMTMsMTIzOjEyMywxMjg6MTI4LDEyOToxMjksMTM3OjEzNyw5 Ojl9XSwxNDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1bIlJlc3BvbmRlckV2 ZW50UGx1Z2luIiwiU2ltcGxlRXZlbnRQbHVnaW4iLCJUYXBFdmVudFBsdWdpbiIsIkVudGVyTGVh dmVFdmVudFBsdWdpbiIsIkNoYW5nZUV2ZW50UGx1Z2luIiwiU2VsZWN0RXZlbnRQbHVnaW4iLCJC ZWZvcmVJbnB1dEV2ZW50UGx1Z2luIl07dC5leHBvcnRzPXJ9LHt9XSwxNTpbZnVuY3Rpb24oZSx0 LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDE5KSxvPWUoMzMpLGk9ZSg4NCksYT17bW91c2VFbnRl cjp7cmVnaXN0cmF0aW9uTmFtZToib25Nb3VzZUVudGVyIixkZXBlbmRlbmNpZXM6WyJ0b3BNb3Vz ZU91dCIsInRvcE1vdXNlT3ZlciJdfSxtb3VzZUxlYXZlOntyZWdpc3RyYXRpb25OYW1lOiJvbk1v dXNlTGVhdmUiLGRlcGVuZGVuY2llczpbInRvcE1vdXNlT3V0IiwidG9wTW91c2VPdmVyIl19fSxz PXtldmVudFR5cGVzOmEsZXh0cmFjdEV2ZW50czpmdW5jdGlvbihlLHQsbixzKXtpZigidG9wTW91 c2VPdmVyIj09PWUmJihuLnJlbGF0ZWRUYXJnZXR8fG4uZnJvbUVsZW1lbnQpKXJldHVybiBudWxs O2lmKCJ0b3BNb3VzZU91dCIhPT1lJiYidG9wTW91c2VPdmVyIiE9PWUpcmV0dXJuIG51bGw7dmFy IHU7aWYocy53aW5kb3c9PT1zKXU9cztlbHNle3ZhciBsPXMub3duZXJEb2N1bWVudDt1PWw/bC5k ZWZhdWx0Vmlld3x8bC5wYXJlbnRXaW5kb3c6d2luZG93fXZhciBjLHA7aWYoInRvcE1vdXNlT3V0 Ij09PWUpe2M9dDt2YXIgZD1uLnJlbGF0ZWRUYXJnZXR8fG4udG9FbGVtZW50O3A9ZD9vLmdldENs b3Nlc3RJbnN0YW5jZUZyb21Ob2RlKGQpOm51bGx9ZWxzZSBjPW51bGwscD10O2lmKGM9PT1wKXJl dHVybiBudWxsO3ZhciBmPW51bGw9PWM/dTpvLmdldE5vZGVGcm9tSW5zdGFuY2UoYyksaD1udWxs PT1wP3U6by5nZXROb2RlRnJvbUluc3RhbmNlKHApLG09aS5nZXRQb29sZWQoYS5tb3VzZUxlYXZl LGMsbixzKTttLnR5cGU9Im1vdXNlbGVhdmUiLG0udGFyZ2V0PWYsbS5yZWxhdGVkVGFyZ2V0PWg7 dmFyIHY9aS5nZXRQb29sZWQoYS5tb3VzZUVudGVyLHAsbixzKTtyZXR1cm4gdi50eXBlPSJtb3Vz ZWVudGVyIix2LnRhcmdldD1oLHYucmVsYXRlZFRhcmdldD1mLHIuYWNjdW11bGF0ZUVudGVyTGVh dmVEaXNwYXRjaGVzKG0sdixjLHApLFttLHZdfX07dC5leHBvcnRzPXN9LHsxOToxOSwzMzozMyw4 NDo4NH1dLDE2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0 dXJuImJ1dHRvbiI9PT1lfHwiaW5wdXQiPT09ZXx8InNlbGVjdCI9PT1lfHwidGV4dGFyZWEiPT09 ZX1mdW5jdGlvbiBvKGUsdCxuKXtzd2l0Y2goZSl7Y2FzZSJvbkNsaWNrIjpjYXNlIm9uQ2xpY2tD YXB0dXJlIjpjYXNlIm9uRG91YmxlQ2xpY2siOmNhc2Uib25Eb3VibGVDbGlja0NhcHR1cmUiOmNh c2Uib25Nb3VzZURvd24iOmNhc2Uib25Nb3VzZURvd25DYXB0dXJlIjpjYXNlIm9uTW91c2VNb3Zl IjpjYXNlIm9uTW91c2VNb3ZlQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlVXAiOmNhc2Uib25Nb3VzZVVw Q2FwdHVyZSI6cmV0dXJuISghbi5kaXNhYmxlZHx8IXIodCkpO2RlZmF1bHQ6cmV0dXJuITF9fXZh ciBpPWUoMTEzKSxhPWUoMTcpLHM9ZSgxOCksdT1lKDUwKSxsPWUoOTEpLGM9ZSg5OCkscD0oZSgx MzcpLHt9KSxkPW51bGwsZj1mdW5jdGlvbihlLHQpe2UmJihzLmV4ZWN1dGVEaXNwYXRjaGVzSW5P cmRlcihlLHQpLGUuaXNQZXJzaXN0ZW50KCl8fGUuY29uc3RydWN0b3IucmVsZWFzZShlKSl9LGg9 ZnVuY3Rpb24oZSl7cmV0dXJuIGYoZSwhMCl9LG09ZnVuY3Rpb24oZSl7cmV0dXJuIGYoZSwhMSl9 LHY9ZnVuY3Rpb24oZSl7cmV0dXJuIi4iK2UuX3Jvb3ROb2RlSUR9LGc9e2luamVjdGlvbjp7aW5q ZWN0RXZlbnRQbHVnaW5PcmRlcjphLmluamVjdEV2ZW50UGx1Z2luT3JkZXIsaW5qZWN0RXZlbnRQ bHVnaW5zQnlOYW1lOmEuaW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lfSxwdXRMaXN0ZW5lcjpmdW5j dGlvbihlLHQsbil7ImZ1bmN0aW9uIiE9dHlwZW9mIG4/aSgiOTQiLHQsdHlwZW9mIG4pOnZvaWQg MDt2YXIgcj12KGUpLG89cFt0XXx8KHBbdF09e30pO29bcl09bjt2YXIgcz1hLnJlZ2lzdHJhdGlv bk5hbWVNb2R1bGVzW3RdO3MmJnMuZGlkUHV0TGlzdGVuZXImJnMuZGlkUHV0TGlzdGVuZXIoZSx0 LG4pfSxnZXRMaXN0ZW5lcjpmdW5jdGlvbihlLHQpe3ZhciBuPXBbdF07aWYobyh0LGUuX2N1cnJl bnRFbGVtZW50LnR5cGUsZS5fY3VycmVudEVsZW1lbnQucHJvcHMpKXJldHVybiBudWxsO3ZhciBy PXYoZSk7cmV0dXJuIG4mJm5bcl19LGRlbGV0ZUxpc3RlbmVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49 YS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1t0XTtuJiZuLndpbGxEZWxldGVMaXN0ZW5lciYmbi53 aWxsRGVsZXRlTGlzdGVuZXIoZSx0KTt2YXIgcj1wW3RdO2lmKHIpe3ZhciBvPXYoZSk7ZGVsZXRl IHJbb119fSxkZWxldGVBbGxMaXN0ZW5lcnM6ZnVuY3Rpb24oZSl7dmFyIHQ9dihlKTtmb3IodmFy IG4gaW4gcClpZihwLmhhc093blByb3BlcnR5KG4pJiZwW25dW3RdKXt2YXIgcj1hLnJlZ2lzdHJh dGlvbk5hbWVNb2R1bGVzW25dO3ImJnIud2lsbERlbGV0ZUxpc3RlbmVyJiZyLndpbGxEZWxldGVM aXN0ZW5lcihlLG4pLGRlbGV0ZSBwW25dW3RdfX0sZXh0cmFjdEV2ZW50czpmdW5jdGlvbihlLHQs bixyKXtmb3IodmFyIG8saT1hLnBsdWdpbnMscz0wO3M8aS5sZW5ndGg7cysrKXt2YXIgdT1pW3Nd O2lmKHUpe3ZhciBjPXUuZXh0cmFjdEV2ZW50cyhlLHQsbixyKTtjJiYobz1sKG8sYykpfX1yZXR1 cm4gb30sZW5xdWV1ZUV2ZW50czpmdW5jdGlvbihlKXtlJiYoZD1sKGQsZSkpfSxwcm9jZXNzRXZl bnRRdWV1ZTpmdW5jdGlvbihlKXt2YXIgdD1kO2Q9bnVsbCxlP2ModCxoKTpjKHQsbSksZD9pKCI5 NSIpOnZvaWQgMCx1LnJldGhyb3dDYXVnaHRFcnJvcigpfSxfX3B1cmdlOmZ1bmN0aW9uKCl7cD17 fX0sX19nZXRMaXN0ZW5lckJhbms6ZnVuY3Rpb24oKXtyZXR1cm4gcH19O3QuZXhwb3J0cz1nfSx7 MTEzOjExMywxMzc6MTM3LDE3OjE3LDE4OjE4LDUwOjUwLDkxOjkxLDk4Ojk4fV0sMTc6W2Z1bmN0 aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcigpe2lmKHMpZm9yKHZhciBlIGluIHUp e3ZhciB0PXVbZV0sbj1zLmluZGV4T2YoZSk7aWYobj4tMT92b2lkIDA6YSgiOTYiLGUpLCFsLnBs dWdpbnNbbl0pe3QuZXh0cmFjdEV2ZW50cz92b2lkIDA6YSgiOTciLGUpLGwucGx1Z2luc1tuXT10 O3ZhciByPXQuZXZlbnRUeXBlcztmb3IodmFyIGkgaW4gcilvKHJbaV0sdCxpKT92b2lkIDA6YSgi OTgiLGksZSl9fX1mdW5jdGlvbiBvKGUsdCxuKXtsLmV2ZW50TmFtZURpc3BhdGNoQ29uZmlncy5o YXNPd25Qcm9wZXJ0eShuKT9hKCI5OSIsbik6dm9pZCAwLGwuZXZlbnROYW1lRGlzcGF0Y2hDb25m aWdzW25dPWU7dmFyIHI9ZS5waGFzZWRSZWdpc3RyYXRpb25OYW1lcztpZihyKXtmb3IodmFyIG8g aW4gcilpZihyLmhhc093blByb3BlcnR5KG8pKXt2YXIgcz1yW29dO2kocyx0LG4pfXJldHVybiEw fXJldHVybiEhZS5yZWdpc3RyYXRpb25OYW1lJiYoaShlLnJlZ2lzdHJhdGlvbk5hbWUsdCxuKSwh MCl9ZnVuY3Rpb24gaShlLHQsbil7bC5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tlXT9hKCIxMDAi LGUpOnZvaWQgMCxsLnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW2VdPXQsbC5yZWdpc3RyYXRpb25O YW1lRGVwZW5kZW5jaWVzW2VdPXQuZXZlbnRUeXBlc1tuXS5kZXBlbmRlbmNpZXN9dmFyIGE9ZSgx MTMpLHM9KGUoMTM3KSxudWxsKSx1PXt9LGw9e3BsdWdpbnM6W10sZXZlbnROYW1lRGlzcGF0Y2hD b25maWdzOnt9LHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzOnt9LHJlZ2lzdHJhdGlvbk5hbWVEZXBl bmRlbmNpZXM6e30scG9zc2libGVSZWdpc3RyYXRpb25OYW1lczpudWxsLGluamVjdEV2ZW50UGx1 Z2luT3JkZXI6ZnVuY3Rpb24oZSl7cz9hKCIxMDEiKTp2b2lkIDAscz1BcnJheS5wcm90b3R5cGUu c2xpY2UuY2FsbChlKSxyKCl9LGluamVjdEV2ZW50UGx1Z2luc0J5TmFtZTpmdW5jdGlvbihlKXt2 YXIgdD0hMTtmb3IodmFyIG4gaW4gZSlpZihlLmhhc093blByb3BlcnR5KG4pKXt2YXIgbz1lW25d O3UuaGFzT3duUHJvcGVydHkobikmJnVbbl09PT1vfHwodVtuXT9hKCIxMDIiLG4pOnZvaWQgMCx1 W25dPW8sdD0hMCl9dCYmcigpfSxnZXRQbHVnaW5Nb2R1bGVGb3JFdmVudDpmdW5jdGlvbihlKXt2 YXIgdD1lLmRpc3BhdGNoQ29uZmlnO2lmKHQucmVnaXN0cmF0aW9uTmFtZSlyZXR1cm4gbC5yZWdp c3RyYXRpb25OYW1lTW9kdWxlc1t0LnJlZ2lzdHJhdGlvbk5hbWVdfHxudWxsO2lmKHZvaWQgMCE9 PXQucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMpe3ZhciBuPXQucGhhc2VkUmVnaXN0cmF0aW9uTmFt ZXM7Zm9yKHZhciByIGluIG4paWYobi5oYXNPd25Qcm9wZXJ0eShyKSl7dmFyIG89bC5yZWdpc3Ry YXRpb25OYW1lTW9kdWxlc1tuW3JdXTtpZihvKXJldHVybiBvfX1yZXR1cm4gbnVsbH0sX3Jlc2V0 RXZlbnRQbHVnaW5zOmZ1bmN0aW9uKCl7cz1udWxsO2Zvcih2YXIgZSBpbiB1KXUuaGFzT3duUHJv cGVydHkoZSkmJmRlbGV0ZSB1W2VdO2wucGx1Z2lucy5sZW5ndGg9MDt2YXIgdD1sLmV2ZW50TmFt ZURpc3BhdGNoQ29uZmlncztmb3IodmFyIG4gaW4gdCl0Lmhhc093blByb3BlcnR5KG4pJiZkZWxl dGUgdFtuXTt2YXIgcj1sLnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzO2Zvcih2YXIgbyBpbiByKXIu aGFzT3duUHJvcGVydHkobykmJmRlbGV0ZSByW29dfX07dC5leHBvcnRzPWx9LHsxMTM6MTEzLDEz NzoxMzd9XSwxODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3Jl dHVybiJ0b3BNb3VzZVVwIj09PWV8fCJ0b3BUb3VjaEVuZCI9PT1lfHwidG9wVG91Y2hDYW5jZWwi PT09ZX1mdW5jdGlvbiBvKGUpe3JldHVybiJ0b3BNb3VzZU1vdmUiPT09ZXx8InRvcFRvdWNoTW92 ZSI9PT1lfWZ1bmN0aW9uIGkoZSl7cmV0dXJuInRvcE1vdXNlRG93biI9PT1lfHwidG9wVG91Y2hT dGFydCI9PT1lfWZ1bmN0aW9uIGEoZSx0LG4scil7dmFyIG89ZS50eXBlfHwidW5rbm93bi1ldmVu dCI7ZS5jdXJyZW50VGFyZ2V0PWcuZ2V0Tm9kZUZyb21JbnN0YW5jZShyKSx0P20uaW52b2tlR3Vh cmRlZENhbGxiYWNrV2l0aENhdGNoKG8sbixlKTptLmludm9rZUd1YXJkZWRDYWxsYmFjayhvLG4s ZSksZS5jdXJyZW50VGFyZ2V0PW51bGx9ZnVuY3Rpb24gcyhlLHQpe3ZhciBuPWUuX2Rpc3BhdGNo TGlzdGVuZXJzLHI9ZS5fZGlzcGF0Y2hJbnN0YW5jZXM7aWYoQXJyYXkuaXNBcnJheShuKSlmb3Io dmFyIG89MDtvPG4ubGVuZ3RoJiYhZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpO28rKylhKGUsdCxu W29dLHJbb10pO2Vsc2UgbiYmYShlLHQsbixyKTtlLl9kaXNwYXRjaExpc3RlbmVycz1udWxsLGUu X2Rpc3BhdGNoSW5zdGFuY2VzPW51bGx9ZnVuY3Rpb24gdShlKXt2YXIgdD1lLl9kaXNwYXRjaExp c3RlbmVycyxuPWUuX2Rpc3BhdGNoSW5zdGFuY2VzO2lmKEFycmF5LmlzQXJyYXkodCkpe2Zvcih2 YXIgcj0wO3I8dC5sZW5ndGgmJiFlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7cisrKWlmKHRbcl0o ZSxuW3JdKSlyZXR1cm4gbltyXX1lbHNlIGlmKHQmJnQoZSxuKSlyZXR1cm4gbjtyZXR1cm4gbnVs bH1mdW5jdGlvbiBsKGUpe3ZhciB0PXUoZSk7cmV0dXJuIGUuX2Rpc3BhdGNoSW5zdGFuY2VzPW51 bGwsZS5fZGlzcGF0Y2hMaXN0ZW5lcnM9bnVsbCx0fWZ1bmN0aW9uIGMoZSl7dmFyIHQ9ZS5fZGlz cGF0Y2hMaXN0ZW5lcnMsbj1lLl9kaXNwYXRjaEluc3RhbmNlcztBcnJheS5pc0FycmF5KHQpP2go IjEwMyIpOnZvaWQgMCxlLmN1cnJlbnRUYXJnZXQ9dD9nLmdldE5vZGVGcm9tSW5zdGFuY2Uobik6 bnVsbDt2YXIgcj10P3QoZSk6bnVsbDtyZXR1cm4gZS5jdXJyZW50VGFyZ2V0PW51bGwsZS5fZGlz cGF0Y2hMaXN0ZW5lcnM9bnVsbCxlLl9kaXNwYXRjaEluc3RhbmNlcz1udWxsLHJ9ZnVuY3Rpb24g cChlKXtyZXR1cm4hIWUuX2Rpc3BhdGNoTGlzdGVuZXJzfXZhciBkLGYsaD1lKDExMyksbT1lKDUw KSx2PShlKDEzNyksZSgxNDIpLHtpbmplY3RDb21wb25lbnRUcmVlOmZ1bmN0aW9uKGUpe2Q9ZX0s aW5qZWN0VHJlZVRyYXZlcnNhbDpmdW5jdGlvbihlKXtmPWV9fSksZz17aXNFbmRpc2g6cixpc01v dmVpc2g6byxpc1N0YXJ0aXNoOmksZXhlY3V0ZURpcmVjdERpc3BhdGNoOmMsZXhlY3V0ZURpc3Bh dGNoZXNJbk9yZGVyOnMsZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyU3RvcEF0VHJ1ZTpsLGhhc0Rp c3BhdGNoZXM6cCxnZXRJbnN0YW5jZUZyb21Ob2RlOmZ1bmN0aW9uKGUpe3JldHVybiBkLmdldElu c3RhbmNlRnJvbU5vZGUoZSl9LGdldE5vZGVGcm9tSW5zdGFuY2U6ZnVuY3Rpb24oZSl7cmV0dXJu IGQuZ2V0Tm9kZUZyb21JbnN0YW5jZShlKX0saXNBbmNlc3RvcjpmdW5jdGlvbihlLHQpe3JldHVy biBmLmlzQW5jZXN0b3IoZSx0KX0sZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3I6ZnVuY3Rpb24oZSx0 KXtyZXR1cm4gZi5nZXRMb3dlc3RDb21tb25BbmNlc3RvcihlLHQpfSxnZXRQYXJlbnRJbnN0YW5j ZTpmdW5jdGlvbihlKXtyZXR1cm4gZi5nZXRQYXJlbnRJbnN0YW5jZShlKX0sdHJhdmVyc2VUd29Q aGFzZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGYudHJhdmVyc2VUd29QaGFzZShlLHQsbil9LHRy YXZlcnNlRW50ZXJMZWF2ZTpmdW5jdGlvbihlLHQsbixyLG8pe3JldHVybiBmLnRyYXZlcnNlRW50 ZXJMZWF2ZShlLHQsbixyLG8pfSxpbmplY3Rpb246dn07dC5leHBvcnRzPWd9LHsxMTM6MTEzLDEz NzoxMzcsMTQyOjE0Miw1MDo1MH1dLDE5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1 bmN0aW9uIHIoZSx0LG4pe3ZhciByPXQuZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9u TmFtZXNbbl07cmV0dXJuIGcoZSxyKX1mdW5jdGlvbiBvKGUsdCxuKXt2YXIgbz1yKGUsbix0KTtv JiYobi5fZGlzcGF0Y2hMaXN0ZW5lcnM9bShuLl9kaXNwYXRjaExpc3RlbmVycyxvKSxuLl9kaXNw YXRjaEluc3RhbmNlcz1tKG4uX2Rpc3BhdGNoSW5zdGFuY2VzLGUpKX1mdW5jdGlvbiBpKGUpe2Um JmUuZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMmJmgudHJhdmVyc2VUd29Q aGFzZShlLl90YXJnZXRJbnN0LG8sZSl9ZnVuY3Rpb24gYShlKXtpZihlJiZlLmRpc3BhdGNoQ29u ZmlnLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzKXt2YXIgdD1lLl90YXJnZXRJbnN0LG49dD9oLmdl dFBhcmVudEluc3RhbmNlKHQpOm51bGw7aC50cmF2ZXJzZVR3b1BoYXNlKG4sbyxlKX19ZnVuY3Rp b24gcyhlLHQsbil7aWYobiYmbi5kaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lKXt2YXIg cj1uLmRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUsbz1nKGUscik7byYmKG4uX2Rpc3Bh dGNoTGlzdGVuZXJzPW0obi5fZGlzcGF0Y2hMaXN0ZW5lcnMsbyksbi5fZGlzcGF0Y2hJbnN0YW5j ZXM9bShuLl9kaXNwYXRjaEluc3RhbmNlcyxlKSl9fWZ1bmN0aW9uIHUoZSl7ZSYmZS5kaXNwYXRj aENvbmZpZy5yZWdpc3RyYXRpb25OYW1lJiZzKGUuX3RhcmdldEluc3QsbnVsbCxlKX1mdW5jdGlv biBsKGUpe3YoZSxpKX1mdW5jdGlvbiBjKGUpe3YoZSxhKX1mdW5jdGlvbiBwKGUsdCxuLHIpe2gu dHJhdmVyc2VFbnRlckxlYXZlKG4scixzLGUsdCl9ZnVuY3Rpb24gZChlKXt2KGUsdSl9dmFyIGY9 ZSgxNiksaD1lKDE4KSxtPWUoOTEpLHY9ZSg5OCksZz0oZSgxNDIpLGYuZ2V0TGlzdGVuZXIpLHk9 e2FjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXM6bCxhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRj aGVzU2tpcFRhcmdldDpjLGFjY3VtdWxhdGVEaXJlY3REaXNwYXRjaGVzOmQsYWNjdW11bGF0ZUVu dGVyTGVhdmVEaXNwYXRjaGVzOnB9O3QuZXhwb3J0cz15fSx7MTQyOjE0MiwxNjoxNiwxODoxOCw5 MTo5MSw5ODo5OH1dLDIwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIo ZSl7dGhpcy5fcm9vdD1lLHRoaXMuX3N0YXJ0VGV4dD10aGlzLmdldFRleHQoKSx0aGlzLl9mYWxs YmFja1RleHQ9bnVsbH12YXIgbz1lKDE0MyksaT1lKDI0KSxhPWUoMTA3KTtvKHIucHJvdG90eXBl LHtkZXN0cnVjdG9yOmZ1bmN0aW9uKCl7dGhpcy5fcm9vdD1udWxsLHRoaXMuX3N0YXJ0VGV4dD1u dWxsLHRoaXMuX2ZhbGxiYWNrVGV4dD1udWxsfSxnZXRUZXh0OmZ1bmN0aW9uKCl7cmV0dXJuInZh bHVlImluIHRoaXMuX3Jvb3Q/dGhpcy5fcm9vdC52YWx1ZTp0aGlzLl9yb290W2EoKV19LGdldERh dGE6ZnVuY3Rpb24oKXtpZih0aGlzLl9mYWxsYmFja1RleHQpcmV0dXJuIHRoaXMuX2ZhbGxiYWNr VGV4dDt2YXIgZSx0LG49dGhpcy5fc3RhcnRUZXh0LHI9bi5sZW5ndGgsbz10aGlzLmdldFRleHQo KSxpPW8ubGVuZ3RoO2ZvcihlPTA7ZTxyJiZuW2VdPT09b1tlXTtlKyspO3ZhciBhPXItZTtmb3Io dD0xO3Q8PWEmJm5bci10XT09PW9baS10XTt0KyspO3ZhciBzPXQ+MT8xLXQ6dm9pZCAwO3JldHVy biB0aGlzLl9mYWxsYmFja1RleHQ9by5zbGljZShlLHMpLHRoaXMuX2ZhbGxiYWNrVGV4dH19KSxp LmFkZFBvb2xpbmdUbyhyKSx0LmV4cG9ydHM9cn0sezEwNzoxMDcsMTQzOjE0MywyNDoyNH1dLDIx OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTEpLG89ci5pbmplY3Rpb24u TVVTVF9VU0VfUFJPUEVSVFksaT1yLmluamVjdGlvbi5IQVNfQk9PTEVBTl9WQUxVRSxhPXIuaW5q ZWN0aW9uLkhBU19OVU1FUklDX1ZBTFVFLHM9ci5pbmplY3Rpb24uSEFTX1BPU0lUSVZFX05VTUVS SUNfVkFMVUUsdT1yLmluamVjdGlvbi5IQVNfT1ZFUkxPQURFRF9CT09MRUFOX1ZBTFVFLGw9e2lz Q3VzdG9tQXR0cmlidXRlOlJlZ0V4cC5wcm90b3R5cGUudGVzdC5iaW5kKG5ldyBSZWdFeHAoIl4o ZGF0YXxhcmlhKS1bIityLkFUVFJJQlVURV9OQU1FX0NIQVIrIl0qJCIpKSxQcm9wZXJ0aWVzOnth Y2NlcHQ6MCxhY2NlcHRDaGFyc2V0OjAsYWNjZXNzS2V5OjAsYWN0aW9uOjAsYWxsb3dGdWxsU2Ny ZWVuOmksYWxsb3dUcmFuc3BhcmVuY3k6MCxhbHQ6MCxhczowLGFzeW5jOmksYXV0b0NvbXBsZXRl OjAsYXV0b1BsYXk6aSxjYXB0dXJlOmksY2VsbFBhZGRpbmc6MCxjZWxsU3BhY2luZzowLGNoYXJT ZXQ6MCxjaGFsbGVuZ2U6MCxjaGVja2VkOm98aSxjaXRlOjAsY2xhc3NJRDowLGNsYXNzTmFtZTow LGNvbHM6cyxjb2xTcGFuOjAsY29udGVudDowLGNvbnRlbnRFZGl0YWJsZTowLGNvbnRleHRNZW51 OjAsY29udHJvbHM6aSxjb29yZHM6MCxjcm9zc09yaWdpbjowLGRhdGE6MCxkYXRlVGltZTowLGRl ZmF1bHQ6aSxkZWZlcjppLGRpcjowLGRpc2FibGVkOmksZG93bmxvYWQ6dSxkcmFnZ2FibGU6MCxl bmNUeXBlOjAsZm9ybTowLGZvcm1BY3Rpb246MCxmb3JtRW5jVHlwZTowLGZvcm1NZXRob2Q6MCxm b3JtTm9WYWxpZGF0ZTppLGZvcm1UYXJnZXQ6MCxmcmFtZUJvcmRlcjowLGhlYWRlcnM6MCxoZWln aHQ6MCxoaWRkZW46aSxoaWdoOjAsaHJlZjowLGhyZWZMYW5nOjAsaHRtbEZvcjowLGh0dHBFcXVp djowLGljb246MCxpZDowLGlucHV0TW9kZTowLGludGVncml0eTowLGlzOjAsa2V5UGFyYW1zOjAs a2V5VHlwZTowLGtpbmQ6MCxsYWJlbDowLGxhbmc6MCxsaXN0OjAsbG9vcDppLGxvdzowLG1hbmlm ZXN0OjAsbWFyZ2luSGVpZ2h0OjAsbWFyZ2luV2lkdGg6MCxtYXg6MCxtYXhMZW5ndGg6MCxtZWRp YTowLG1lZGlhR3JvdXA6MCxtZXRob2Q6MCxtaW46MCxtaW5MZW5ndGg6MCxtdWx0aXBsZTpvfGks bXV0ZWQ6b3xpLG5hbWU6MCxub25jZTowLG5vVmFsaWRhdGU6aSxvcGVuOmksb3B0aW11bTowLHBh dHRlcm46MCxwbGFjZWhvbGRlcjowLHBsYXlzSW5saW5lOmkscG9zdGVyOjAscHJlbG9hZDowLHBy b2ZpbGU6MCxyYWRpb0dyb3VwOjAscmVhZE9ubHk6aSxyZWZlcnJlclBvbGljeTowLHJlbDowLHJl cXVpcmVkOmkscmV2ZXJzZWQ6aSxyb2xlOjAscm93czpzLHJvd1NwYW46YSxzYW5kYm94OjAsc2Nv cGU6MCxzY29wZWQ6aSxzY3JvbGxpbmc6MCxzZWFtbGVzczppLHNlbGVjdGVkOm98aSxzaGFwZTow LHNpemU6cyxzaXplczowLHNwYW46cyxzcGVsbENoZWNrOjAsc3JjOjAsc3JjRG9jOjAsc3JjTGFu ZzowLHNyY1NldDowLHN0YXJ0OmEsc3RlcDowLHN0eWxlOjAsc3VtbWFyeTowLHRhYkluZGV4OjAs dGFyZ2V0OjAsdGl0bGU6MCx0eXBlOjAsdXNlTWFwOjAsdmFsdWU6MCx3aWR0aDowLHdtb2RlOjAs d3JhcDowLGFib3V0OjAsZGF0YXR5cGU6MCxpbmxpc3Q6MCxwcmVmaXg6MCxwcm9wZXJ0eTowLHJl c291cmNlOjAsdHlwZW9mOjAsdm9jYWI6MCxhdXRvQ2FwaXRhbGl6ZTowLGF1dG9Db3JyZWN0OjAs YXV0b1NhdmU6MCxjb2xvcjowLGl0ZW1Qcm9wOjAsaXRlbVNjb3BlOmksaXRlbVR5cGU6MCxpdGVt SUQ6MCxpdGVtUmVmOjAscmVzdWx0czowLHNlY3VyaXR5OjAsdW5zZWxlY3RhYmxlOjB9LERPTUF0 dHJpYnV0ZU5hbWVzOnthY2NlcHRDaGFyc2V0OiJhY2NlcHQtY2hhcnNldCIsY2xhc3NOYW1lOiJj bGFzcyIsaHRtbEZvcjoiZm9yIixodHRwRXF1aXY6Imh0dHAtZXF1aXYifSxET01Qcm9wZXJ0eU5h bWVzOnt9fTt0LmV4cG9ydHM9bH0sezExOjExfV0sMjI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0 cmljdCI7ZnVuY3Rpb24gcihlKXt2YXIgdD0vWz06XS9nLG49eyI9IjoiPTAiLCI6IjoiPTIifSxy PSgiIitlKS5yZXBsYWNlKHQsZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV19KTtyZXR1cm4iJCIrcn1m dW5jdGlvbiBvKGUpe3ZhciB0PS8oPTB8PTIpL2csbj17Ij0wIjoiPSIsIj0yIjoiOiJ9LHI9Ii4i PT09ZVswXSYmIiQiPT09ZVsxXT9lLnN1YnN0cmluZygyKTplLnN1YnN0cmluZygxKTtyZXR1cm4o IiIrcikucmVwbGFjZSh0LGZ1bmN0aW9uKGUpe3JldHVybiBuW2VdfSl9dmFyIGk9e2VzY2FwZTpy LHVuZXNjYXBlOm99O3QuZXhwb3J0cz1pfSx7fV0sMjM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0 cmljdCI7ZnVuY3Rpb24gcihlKXtudWxsIT1lLmNoZWNrZWRMaW5rJiZudWxsIT1lLnZhbHVlTGlu az9zKCI4NyIpOnZvaWQgMH1mdW5jdGlvbiBvKGUpe3IoZSksbnVsbCE9ZS52YWx1ZXx8bnVsbCE9 ZS5vbkNoYW5nZT9zKCI4OCIpOnZvaWQgMH1mdW5jdGlvbiBpKGUpe3IoZSksbnVsbCE9ZS5jaGVj a2VkfHxudWxsIT1lLm9uQ2hhbmdlP3MoIjg5Iik6dm9pZCAwfWZ1bmN0aW9uIGEoZSl7aWYoZSl7 dmFyIHQ9ZS5nZXROYW1lKCk7aWYodClyZXR1cm4iIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9m IGAiK3QrImAuIn1yZXR1cm4iIn12YXIgcz1lKDExMyksdT1lKDEyMSksbD1lKDY0KSxjPShlKDEz NyksZSgxNDIpLHtidXR0b246ITAsY2hlY2tib3g6ITAsaW1hZ2U6ITAsaGlkZGVuOiEwLHJhZGlv OiEwLHJlc2V0OiEwLHN1Ym1pdDohMH0pLHA9e3ZhbHVlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4h ZVt0XXx8Y1tlLnR5cGVdfHxlLm9uQ2hhbmdlfHxlLnJlYWRPbmx5fHxlLmRpc2FibGVkP251bGw6 bmV3IEVycm9yKCJZb3UgcHJvdmlkZWQgYSBgdmFsdWVgIHByb3AgdG8gYSBmb3JtIGZpZWxkIHdp dGhvdXQgYW4gYG9uQ2hhbmdlYCBoYW5kbGVyLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5 IGZpZWxkLiBJZiB0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGBkZWZhdWx0VmFsdWVg LiBPdGhlcndpc2UsIHNldCBlaXRoZXIgYG9uQ2hhbmdlYCBvciBgcmVhZE9ubHlgLiIpfSxjaGVj a2VkOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4hZVt0XXx8ZS5vbkNoYW5nZXx8ZS5yZWFkT25seXx8 ZS5kaXNhYmxlZD9udWxsOm5ldyBFcnJvcigiWW91IHByb3ZpZGVkIGEgYGNoZWNrZWRgIHByb3Ag dG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gYG9uQ2hhbmdlYCBoYW5kbGVyLiBUaGlzIHdpbGwg cmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiBJZiB0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUg dXNlIGBkZWZhdWx0Q2hlY2tlZGAuIE90aGVyd2lzZSwgc2V0IGVpdGhlciBgb25DaGFuZ2VgIG9y IGByZWFkT25seWAuIil9LG9uQ2hhbmdlOnUuUHJvcFR5cGVzLmZ1bmN9LGQ9e30sZj17Y2hlY2tQ cm9wVHlwZXM6ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgciBpbiBwKXtpZihwLmhhc093blByb3Bl cnR5KHIpKXZhciBvPXBbcl0odCxyLGUsInByb3AiLG51bGwsbCk7byBpbnN0YW5jZW9mIEVycm9y JiYhKG8ubWVzc2FnZSBpbiBkKSYmKGRbby5tZXNzYWdlXT0hMCxhKG4pKX19LGdldFZhbHVlOmZ1 bmN0aW9uKGUpe3JldHVybiBlLnZhbHVlTGluaz8obyhlKSxlLnZhbHVlTGluay52YWx1ZSk6ZS52 YWx1ZX0sZ2V0Q2hlY2tlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5jaGVja2VkTGluaz8oaShlKSxl LmNoZWNrZWRMaW5rLnZhbHVlKTplLmNoZWNrZWR9LGV4ZWN1dGVPbkNoYW5nZTpmdW5jdGlvbihl LHQpe3JldHVybiBlLnZhbHVlTGluaz8obyhlKSxlLnZhbHVlTGluay5yZXF1ZXN0Q2hhbmdlKHQu dGFyZ2V0LnZhbHVlKSk6ZS5jaGVja2VkTGluaz8oaShlKSxlLmNoZWNrZWRMaW5rLnJlcXVlc3RD aGFuZ2UodC50YXJnZXQuY2hlY2tlZCkpOmUub25DaGFuZ2U/ZS5vbkNoYW5nZS5jYWxsKHZvaWQg MCx0KTp2b2lkIDB9fTt0LmV4cG9ydHM9Zn0sezExMzoxMTMsMTIxOjEyMSwxMzc6MTM3LDE0Mjox NDIsNjQ6NjR9XSwyNDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDExMyks bz0oZSgxMzcpLGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYodC5pbnN0YW5jZVBvb2wubGVuZ3Ro KXt2YXIgbj10Lmluc3RhbmNlUG9vbC5wb3AoKTtyZXR1cm4gdC5jYWxsKG4sZSksbn1yZXR1cm4g bmV3IHQoZSl9KSxpPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztpZihuLmluc3RhbmNlUG9vbC5s ZW5ndGgpe3ZhciByPW4uaW5zdGFuY2VQb29sLnBvcCgpO3JldHVybiBuLmNhbGwocixlLHQpLHJ9 cmV0dXJuIG5ldyBuKGUsdCl9LGE9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXM7aWYoci5pbnN0 YW5jZVBvb2wubGVuZ3RoKXt2YXIgbz1yLmluc3RhbmNlUG9vbC5wb3AoKTtyZXR1cm4gci5jYWxs KG8sZSx0LG4pLG99cmV0dXJuIG5ldyByKGUsdCxuKX0scz1mdW5jdGlvbihlLHQsbixyKXt2YXIg bz10aGlzO2lmKG8uaW5zdGFuY2VQb29sLmxlbmd0aCl7dmFyIGk9by5pbnN0YW5jZVBvb2wucG9w KCk7cmV0dXJuIG8uY2FsbChpLGUsdCxuLHIpLGl9cmV0dXJuIG5ldyBvKGUsdCxuLHIpfSx1PWZ1 bmN0aW9uKGUpe3ZhciB0PXRoaXM7ZSBpbnN0YW5jZW9mIHQ/dm9pZCAwOnIoIjI1IiksZS5kZXN0 cnVjdG9yKCksdC5pbnN0YW5jZVBvb2wubGVuZ3RoPHQucG9vbFNpemUmJnQuaW5zdGFuY2VQb29s LnB1c2goZSl9LGw9MTAsYz1vLHA9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lO3JldHVybiBuLmluc3Rh bmNlUG9vbD1bXSxuLmdldFBvb2xlZD10fHxjLG4ucG9vbFNpemV8fChuLnBvb2xTaXplPWwpLG4u cmVsZWFzZT11LG59LGQ9e2FkZFBvb2xpbmdUbzpwLG9uZUFyZ3VtZW50UG9vbGVyOm8sdHdvQXJn dW1lbnRQb29sZXI6aSx0aHJlZUFyZ3VtZW50UG9vbGVyOmEsZm91ckFyZ3VtZW50UG9vbGVyOnN9 O3QuZXhwb3J0cz1kfSx7MTEzOjExMywxMzc6MTM3fV0sMjU6W2Z1bmN0aW9uKGUsdCxuKXsidXNl IHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9w ZXJ0eS5jYWxsKGUsbSl8fChlW21dPWYrKyxwW2VbbV1dPXt9KSxwW2VbbV1dfXZhciBvLGk9ZSgx NDMpLGE9ZSgxNykscz1lKDUxKSx1PWUoOTApLGw9ZSgxMDgpLGM9ZSgxMTApLHA9e30sZD0hMSxm PTAsaD17dG9wQWJvcnQ6ImFib3J0Iix0b3BBbmltYXRpb25FbmQ6bCgiYW5pbWF0aW9uZW5kIil8 fCJhbmltYXRpb25lbmQiLHRvcEFuaW1hdGlvbkl0ZXJhdGlvbjpsKCJhbmltYXRpb25pdGVyYXRp b24iKXx8ImFuaW1hdGlvbml0ZXJhdGlvbiIsdG9wQW5pbWF0aW9uU3RhcnQ6bCgiYW5pbWF0aW9u c3RhcnQiKXx8ImFuaW1hdGlvbnN0YXJ0Iix0b3BCbHVyOiJibHVyIix0b3BDYW5QbGF5OiJjYW5w bGF5Iix0b3BDYW5QbGF5VGhyb3VnaDoiY2FucGxheXRocm91Z2giLHRvcENoYW5nZToiY2hhbmdl Iix0b3BDbGljazoiY2xpY2siLHRvcENvbXBvc2l0aW9uRW5kOiJjb21wb3NpdGlvbmVuZCIsdG9w Q29tcG9zaXRpb25TdGFydDoiY29tcG9zaXRpb25zdGFydCIsdG9wQ29tcG9zaXRpb25VcGRhdGU6 ImNvbXBvc2l0aW9udXBkYXRlIix0b3BDb250ZXh0TWVudToiY29udGV4dG1lbnUiLHRvcENvcHk6 ImNvcHkiLHRvcEN1dDoiY3V0Iix0b3BEb3VibGVDbGljazoiZGJsY2xpY2siLHRvcERyYWc6ImRy YWciLHRvcERyYWdFbmQ6ImRyYWdlbmQiLHRvcERyYWdFbnRlcjoiZHJhZ2VudGVyIix0b3BEcmFn RXhpdDoiZHJhZ2V4aXQiLHRvcERyYWdMZWF2ZToiZHJhZ2xlYXZlIix0b3BEcmFnT3ZlcjoiZHJh Z292ZXIiLHRvcERyYWdTdGFydDoiZHJhZ3N0YXJ0Iix0b3BEcm9wOiJkcm9wIix0b3BEdXJhdGlv bkNoYW5nZToiZHVyYXRpb25jaGFuZ2UiLHRvcEVtcHRpZWQ6ImVtcHRpZWQiLHRvcEVuY3J5cHRl ZDoiZW5jcnlwdGVkIix0b3BFbmRlZDoiZW5kZWQiLHRvcEVycm9yOiJlcnJvciIsdG9wRm9jdXM6 ImZvY3VzIix0b3BJbnB1dDoiaW5wdXQiLHRvcEtleURvd246ImtleWRvd24iLHRvcEtleVByZXNz OiJrZXlwcmVzcyIsdG9wS2V5VXA6ImtleXVwIix0b3BMb2FkZWREYXRhOiJsb2FkZWRkYXRhIix0 b3BMb2FkZWRNZXRhZGF0YToibG9hZGVkbWV0YWRhdGEiLHRvcExvYWRTdGFydDoibG9hZHN0YXJ0 Iix0b3BNb3VzZURvd246Im1vdXNlZG93biIsdG9wTW91c2VNb3ZlOiJtb3VzZW1vdmUiLHRvcE1v dXNlT3V0OiJtb3VzZW91dCIsdG9wTW91c2VPdmVyOiJtb3VzZW92ZXIiLHRvcE1vdXNlVXA6Im1v dXNldXAiLHRvcFBhc3RlOiJwYXN0ZSIsdG9wUGF1c2U6InBhdXNlIiwKLXRvcFBsYXk6InBsYXki LHRvcFBsYXlpbmc6InBsYXlpbmciLHRvcFByb2dyZXNzOiJwcm9ncmVzcyIsdG9wUmF0ZUNoYW5n ZToicmF0ZWNoYW5nZSIsdG9wU2Nyb2xsOiJzY3JvbGwiLHRvcFNlZWtlZDoic2Vla2VkIix0b3BT ZWVraW5nOiJzZWVraW5nIix0b3BTZWxlY3Rpb25DaGFuZ2U6InNlbGVjdGlvbmNoYW5nZSIsdG9w U3RhbGxlZDoic3RhbGxlZCIsdG9wU3VzcGVuZDoic3VzcGVuZCIsdG9wVGV4dElucHV0OiJ0ZXh0 SW5wdXQiLHRvcFRpbWVVcGRhdGU6InRpbWV1cGRhdGUiLHRvcFRvdWNoQ2FuY2VsOiJ0b3VjaGNh bmNlbCIsdG9wVG91Y2hFbmQ6InRvdWNoZW5kIix0b3BUb3VjaE1vdmU6InRvdWNobW92ZSIsdG9w VG91Y2hTdGFydDoidG91Y2hzdGFydCIsdG9wVHJhbnNpdGlvbkVuZDpsKCJ0cmFuc2l0aW9uZW5k Iil8fCJ0cmFuc2l0aW9uZW5kIix0b3BWb2x1bWVDaGFuZ2U6InZvbHVtZWNoYW5nZSIsdG9wV2Fp dGluZzoid2FpdGluZyIsdG9wV2hlZWw6IndoZWVsIn0sbT0iX3JlYWN0TGlzdGVuZXJzSUQiK1N0 cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZSgyKSx2PWkoe30scyx7UmVhY3RFdmVudExpc3RlbmVy Om51bGwsaW5qZWN0aW9uOntpbmplY3RSZWFjdEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oZSl7ZS5z ZXRIYW5kbGVUb3BMZXZlbCh2LmhhbmRsZVRvcExldmVsKSx2LlJlYWN0RXZlbnRMaXN0ZW5lcj1l fX0sc2V0RW5hYmxlZDpmdW5jdGlvbihlKXt2LlJlYWN0RXZlbnRMaXN0ZW5lciYmdi5SZWFjdEV2 ZW50TGlzdGVuZXIuc2V0RW5hYmxlZChlKX0saXNFbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuISgh di5SZWFjdEV2ZW50TGlzdGVuZXJ8fCF2LlJlYWN0RXZlbnRMaXN0ZW5lci5pc0VuYWJsZWQoKSl9 LGxpc3RlblRvOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXQsbz1yKG4pLGk9YS5yZWdpc3RyYXRp b25OYW1lRGVwZW5kZW5jaWVzW2VdLHM9MDtzPGkubGVuZ3RoO3MrKyl7dmFyIHU9aVtzXTtvLmhh c093blByb3BlcnR5KHUpJiZvW3VdfHwoInRvcFdoZWVsIj09PXU/Yygid2hlZWwiKT92LlJlYWN0 RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KCJ0b3BXaGVlbCIsIndoZWVsIixuKTpjKCJt b3VzZXdoZWVsIik/di5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudCgidG9wV2hl ZWwiLCJtb3VzZXdoZWVsIixuKTp2LlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50 KCJ0b3BXaGVlbCIsIkRPTU1vdXNlU2Nyb2xsIixuKToidG9wU2Nyb2xsIj09PXU/Yygic2Nyb2xs IiwhMCk/di5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcENhcHR1cmVkRXZlbnQoInRvcFNjcm9sbCIs InNjcm9sbCIsbik6di5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudCgidG9wU2Ny b2xsIiwic2Nyb2xsIix2LlJlYWN0RXZlbnRMaXN0ZW5lci5XSU5ET1dfSEFORExFKToidG9wRm9j dXMiPT09dXx8InRvcEJsdXIiPT09dT8oYygiZm9jdXMiLCEwKT8odi5SZWFjdEV2ZW50TGlzdGVu ZXIudHJhcENhcHR1cmVkRXZlbnQoInRvcEZvY3VzIiwiZm9jdXMiLG4pLHYuUmVhY3RFdmVudExp c3RlbmVyLnRyYXBDYXB0dXJlZEV2ZW50KCJ0b3BCbHVyIiwiYmx1ciIsbikpOmMoImZvY3VzaW4i KSYmKHYuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQoInRvcEZvY3VzIiwiZm9j dXNpbiIsbiksdi5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudCgidG9wQmx1ciIs ImZvY3Vzb3V0IixuKSksby50b3BCbHVyPSEwLG8udG9wRm9jdXM9ITApOmguaGFzT3duUHJvcGVy dHkodSkmJnYuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQodSxoW3VdLG4pLG9b dV09ITApfX0sdHJhcEJ1YmJsZWRFdmVudDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHYuUmVhY3RF dmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQoZSx0LG4pfSx0cmFwQ2FwdHVyZWRFdmVudDpm dW5jdGlvbihlLHQsbil7cmV0dXJuIHYuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBDYXB0dXJlZEV2 ZW50KGUsdCxuKX0sc3VwcG9ydHNFdmVudFBhZ2VYWTpmdW5jdGlvbigpe2lmKCFkb2N1bWVudC5j cmVhdGVFdmVudClyZXR1cm4hMTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVu dCIpO3JldHVybiBudWxsIT1lJiYicGFnZVgiaW4gZX0sZW5zdXJlU2Nyb2xsVmFsdWVNb25pdG9y aW5nOmZ1bmN0aW9uKCl7aWYodm9pZCAwPT09byYmKG89di5zdXBwb3J0c0V2ZW50UGFnZVhZKCkp LCFvJiYhZCl7dmFyIGU9dS5yZWZyZXNoU2Nyb2xsVmFsdWVzO3YuUmVhY3RFdmVudExpc3RlbmVy Lm1vbml0b3JTY3JvbGxWYWx1ZShlKSxkPSEwfX19KTt0LmV4cG9ydHM9dn0sezEwODoxMDgsMTEw OjExMCwxNDM6MTQzLDE3OjE3LDUxOjUxLDkwOjkwfV0sMjY6W2Z1bmN0aW9uKGUsdCxuKXsoZnVu Y3Rpb24obil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4scil7dmFyIG89dm9pZCAwPT09 ZVtuXTtudWxsIT10JiZvJiYoZVtuXT1pKHQsITApKX12YXIgbz1lKDY2KSxpPWUoMTA5KSxhPShl KDIyKSxlKDExNykpLHM9ZSgxMTgpO2UoMTQyKTsidW5kZWZpbmVkIiE9dHlwZW9mIG4mJm4uZW52 LDE7dmFyIHU9e2luc3RhbnRpYXRlQ2hpbGRyZW46ZnVuY3Rpb24oZSx0LG4sbyl7aWYobnVsbD09 ZSlyZXR1cm4gbnVsbDt2YXIgaT17fTtyZXR1cm4gcyhlLHIsaSksaX0sdXBkYXRlQ2hpbGRyZW46 ZnVuY3Rpb24oZSx0LG4scixzLHUsbCxjLHApe2lmKHR8fGUpe3ZhciBkLGY7Zm9yKGQgaW4gdClp Zih0Lmhhc093blByb3BlcnR5KGQpKXtmPWUmJmVbZF07dmFyIGg9ZiYmZi5fY3VycmVudEVsZW1l bnQsbT10W2RdO2lmKG51bGwhPWYmJmEoaCxtKSlvLnJlY2VpdmVDb21wb25lbnQoZixtLHMsYyks dFtkXT1mO2Vsc2V7ZiYmKHJbZF09by5nZXRIb3N0Tm9kZShmKSxvLnVubW91bnRDb21wb25lbnQo ZiwhMSkpO3ZhciB2PWkobSwhMCk7dFtkXT12O3ZhciBnPW8ubW91bnRDb21wb25lbnQodixzLHUs bCxjLHApO24ucHVzaChnKX19Zm9yKGQgaW4gZSkhZS5oYXNPd25Qcm9wZXJ0eShkKXx8dCYmdC5o YXNPd25Qcm9wZXJ0eShkKXx8KGY9ZVtkXSxyW2RdPW8uZ2V0SG9zdE5vZGUoZiksby51bm1vdW50 Q29tcG9uZW50KGYsITEpKX19LHVubW91bnRDaGlsZHJlbjpmdW5jdGlvbihlLHQpe2Zvcih2YXIg biBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkobikpe3ZhciByPWVbbl07by51bm1vdW50Q29tcG9u ZW50KHIsdCl9fX07dC5leHBvcnRzPXV9KS5jYWxsKHRoaXMsdm9pZCAwKX0sezEwOToxMDksMTE3 OjExNywxMTg6MTE4LDE0MjoxNDIsMjI6MjIsNjY6NjZ9XSwyNzpbZnVuY3Rpb24oZSx0LG4peyJ1 c2Ugc3RyaWN0Ijt2YXIgcj1lKDgpLG89ZSgzNyksaT17cHJvY2Vzc0NoaWxkcmVuVXBkYXRlczpv LmRhbmdlcm91c2x5UHJvY2Vzc0NoaWxkcmVuVXBkYXRlcyxyZXBsYWNlTm9kZVdpdGhNYXJrdXA6 ci5kYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cH07dC5leHBvcnRzPWl9LHszNzozNyw4 Ojh9XSwyODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDExMyksbz0oZSgx MzcpLCExKSxpPXtyZXBsYWNlTm9kZVdpdGhNYXJrdXA6bnVsbCxwcm9jZXNzQ2hpbGRyZW5VcGRh dGVzOm51bGwsaW5qZWN0aW9uOntpbmplY3RFbnZpcm9ubWVudDpmdW5jdGlvbihlKXtvP3IoIjEw NCIpOnZvaWQgMCxpLnJlcGxhY2VOb2RlV2l0aE1hcmt1cD1lLnJlcGxhY2VOb2RlV2l0aE1hcmt1 cCxpLnByb2Nlc3NDaGlsZHJlblVwZGF0ZXM9ZS5wcm9jZXNzQ2hpbGRyZW5VcGRhdGVzLG89ITB9 fX07dC5leHBvcnRzPWl9LHsxMTM6MTEzLDEzNzoxMzd9XSwyOTpbZnVuY3Rpb24oZSx0LG4peyJ1 c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe31mdW5jdGlvbiBvKGUsdCl7fWZ1bmN0aW9uIGkoZSl7 cmV0dXJuISghZS5wcm90b3R5cGV8fCFlLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KX1mdW5j dGlvbiBhKGUpe3JldHVybiEoIWUucHJvdG90eXBlfHwhZS5wcm90b3R5cGUuaXNQdXJlUmVhY3RD b21wb25lbnQpfXZhciBzPWUoMTEzKSx1PWUoMTQzKSxsPWUoMTIxKSxjPWUoMjgpLHA9ZSgxMjAp LGQ9ZSg1MCksZj1lKDU3KSxoPShlKDU4KSxlKDYyKSksbT1lKDY2KSx2PWUoMTMwKSxnPShlKDEz NyksZSgxNDEpKSx5PWUoMTE3KSxfPShlKDE0Mikse0ltcHVyZUNsYXNzOjAsUHVyZUNsYXNzOjEs U3RhdGVsZXNzRnVuY3Rpb25hbDoyfSk7ci5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFy IGU9Zi5nZXQodGhpcykuX2N1cnJlbnRFbGVtZW50LnR5cGUsdD1lKHRoaXMucHJvcHMsdGhpcy5j b250ZXh0LHRoaXMudXBkYXRlcik7cmV0dXJuIG8oZSx0KSx0fTt2YXIgQz0xLGI9e2NvbnN0cnVj dDpmdW5jdGlvbihlKXt0aGlzLl9jdXJyZW50RWxlbWVudD1lLHRoaXMuX3Jvb3ROb2RlSUQ9MCx0 aGlzLl9jb21wb3NpdGVUeXBlPW51bGwsdGhpcy5faW5zdGFuY2U9bnVsbCx0aGlzLl9ob3N0UGFy ZW50PW51bGwsdGhpcy5faG9zdENvbnRhaW5lckluZm89bnVsbCx0aGlzLl91cGRhdGVCYXRjaE51 bWJlcj1udWxsLHRoaXMuX3BlbmRpbmdFbGVtZW50PW51bGwsdGhpcy5fcGVuZGluZ1N0YXRlUXVl dWU9bnVsbCx0aGlzLl9wZW5kaW5nUmVwbGFjZVN0YXRlPSExLHRoaXMuX3BlbmRpbmdGb3JjZVVw ZGF0ZT0hMSx0aGlzLl9yZW5kZXJlZE5vZGVUeXBlPW51bGwsdGhpcy5fcmVuZGVyZWRDb21wb25l bnQ9bnVsbCx0aGlzLl9jb250ZXh0PW51bGwsdGhpcy5fbW91bnRPcmRlcj0wLHRoaXMuX3RvcExl dmVsV3JhcHBlcj1udWxsLHRoaXMuX3BlbmRpbmdDYWxsYmFja3M9bnVsbCx0aGlzLl9jYWxsZWRD b21wb25lbnRXaWxsVW5tb3VudD0hMX0sbW91bnRDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4sdSl7 dGhpcy5fY29udGV4dD11LHRoaXMuX21vdW50T3JkZXI9QysrLHRoaXMuX2hvc3RQYXJlbnQ9dCx0 aGlzLl9ob3N0Q29udGFpbmVySW5mbz1uO3ZhciBjLHA9dGhpcy5fY3VycmVudEVsZW1lbnQucHJv cHMsZD10aGlzLl9wcm9jZXNzQ29udGV4dCh1KSxoPXRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGUs bT1lLmdldFVwZGF0ZVF1ZXVlKCksZz1pKGgpLHk9dGhpcy5fY29uc3RydWN0Q29tcG9uZW50KGcs cCxkLG0pO2d8fG51bGwhPXkmJm51bGwhPXkucmVuZGVyP2EoaCk/dGhpcy5fY29tcG9zaXRlVHlw ZT1fLlB1cmVDbGFzczp0aGlzLl9jb21wb3NpdGVUeXBlPV8uSW1wdXJlQ2xhc3M6KGM9eSxvKGgs YyksbnVsbD09PXl8fHk9PT0hMXx8bC5pc1ZhbGlkRWxlbWVudCh5KT92b2lkIDA6cygiMTA1Iixo LmRpc3BsYXlOYW1lfHxoLm5hbWV8fCJDb21wb25lbnQiKSx5PW5ldyByKGgpLHRoaXMuX2NvbXBv c2l0ZVR5cGU9Xy5TdGF0ZWxlc3NGdW5jdGlvbmFsKSx5LnByb3BzPXAseS5jb250ZXh0PWQseS5y ZWZzPXYseS51cGRhdGVyPW0sdGhpcy5faW5zdGFuY2U9eSxmLnNldCh5LHRoaXMpO3ZhciBiPXku c3RhdGU7dm9pZCAwPT09YiYmKHkuc3RhdGU9Yj1udWxsKSwib2JqZWN0IiE9dHlwZW9mIGJ8fEFy cmF5LmlzQXJyYXkoYik/cygiMTA2Iix0aGlzLmdldE5hbWUoKXx8IlJlYWN0Q29tcG9zaXRlQ29t cG9uZW50Iik6dm9pZCAwLHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlPW51bGwsdGhpcy5fcGVuZGlu Z1JlcGxhY2VTdGF0ZT0hMSx0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGU9ITE7dmFyIEU7cmV0dXJu IEU9eS51bnN0YWJsZV9oYW5kbGVFcnJvcj90aGlzLnBlcmZvcm1Jbml0aWFsTW91bnRXaXRoRXJy b3JIYW5kbGluZyhjLHQsbixlLHUpOnRoaXMucGVyZm9ybUluaXRpYWxNb3VudChjLHQsbixlLHUp LHkuY29tcG9uZW50RGlkTW91bnQmJmUuZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZSh5LmNv bXBvbmVudERpZE1vdW50LHkpLEV9LF9jb25zdHJ1Y3RDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4s cil7cmV0dXJuIHRoaXMuX2NvbnN0cnVjdENvbXBvbmVudFdpdGhvdXRPd25lcihlLHQsbixyKX0s X2NvbnN0cnVjdENvbXBvbmVudFdpdGhvdXRPd25lcjpmdW5jdGlvbihlLHQsbixyKXt2YXIgbz10 aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO3JldHVybiBlP25ldyBvKHQsbixyKTpvKHQsbixyKX0s cGVyZm9ybUluaXRpYWxNb3VudFdpdGhFcnJvckhhbmRsaW5nOmZ1bmN0aW9uKGUsdCxuLHIsbyl7 dmFyIGksYT1yLmNoZWNrcG9pbnQoKTt0cnl7aT10aGlzLnBlcmZvcm1Jbml0aWFsTW91bnQoZSx0 LG4scixvKX1jYXRjaChzKXtyLnJvbGxiYWNrKGEpLHRoaXMuX2luc3RhbmNlLnVuc3RhYmxlX2hh bmRsZUVycm9yKHMpLHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlJiYodGhpcy5faW5zdGFuY2Uuc3Rh dGU9dGhpcy5fcHJvY2Vzc1BlbmRpbmdTdGF0ZSh0aGlzLl9pbnN0YW5jZS5wcm9wcyx0aGlzLl9p bnN0YW5jZS5jb250ZXh0KSksYT1yLmNoZWNrcG9pbnQoKSx0aGlzLl9yZW5kZXJlZENvbXBvbmVu dC51bm1vdW50Q29tcG9uZW50KCEwKSxyLnJvbGxiYWNrKGEpLGk9dGhpcy5wZXJmb3JtSW5pdGlh bE1vdW50KGUsdCxuLHIsbyl9cmV0dXJuIGl9LHBlcmZvcm1Jbml0aWFsTW91bnQ6ZnVuY3Rpb24o ZSx0LG4scixvKXt2YXIgaT10aGlzLl9pbnN0YW5jZSxhPTA7aS5jb21wb25lbnRXaWxsTW91bnQm JihpLmNvbXBvbmVudFdpbGxNb3VudCgpLHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlJiYoaS5zdGF0 ZT10aGlzLl9wcm9jZXNzUGVuZGluZ1N0YXRlKGkucHJvcHMsaS5jb250ZXh0KSkpLHZvaWQgMD09 PWUmJihlPXRoaXMuX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudCgpKTt2YXIgcz1oLmdldFR5cGUo ZSk7dGhpcy5fcmVuZGVyZWROb2RlVHlwZT1zO3ZhciB1PXRoaXMuX2luc3RhbnRpYXRlUmVhY3RD b21wb25lbnQoZSxzIT09aC5FTVBUWSk7dGhpcy5fcmVuZGVyZWRDb21wb25lbnQ9dTt2YXIgbD1t Lm1vdW50Q29tcG9uZW50KHUscix0LG4sdGhpcy5fcHJvY2Vzc0NoaWxkQ29udGV4dChvKSxhKTty ZXR1cm4gbH0sZ2V0SG9zdE5vZGU6ZnVuY3Rpb24oKXtyZXR1cm4gbS5nZXRIb3N0Tm9kZSh0aGlz Ll9yZW5kZXJlZENvbXBvbmVudCl9LHVubW91bnRDb21wb25lbnQ6ZnVuY3Rpb24oZSl7aWYodGhp cy5fcmVuZGVyZWRDb21wb25lbnQpe3ZhciB0PXRoaXMuX2luc3RhbmNlO2lmKHQuY29tcG9uZW50 V2lsbFVubW91bnQmJiF0Ll9jYWxsZWRDb21wb25lbnRXaWxsVW5tb3VudClpZih0Ll9jYWxsZWRD b21wb25lbnRXaWxsVW5tb3VudD0hMCxlKXt2YXIgbj10aGlzLmdldE5hbWUoKSsiLmNvbXBvbmVu dFdpbGxVbm1vdW50KCkiO2QuaW52b2tlR3VhcmRlZENhbGxiYWNrKG4sdC5jb21wb25lbnRXaWxs VW5tb3VudC5iaW5kKHQpKX1lbHNlIHQuY29tcG9uZW50V2lsbFVubW91bnQoKTt0aGlzLl9yZW5k ZXJlZENvbXBvbmVudCYmKG0udW5tb3VudENvbXBvbmVudCh0aGlzLl9yZW5kZXJlZENvbXBvbmVu dCxlKSx0aGlzLl9yZW5kZXJlZE5vZGVUeXBlPW51bGwsdGhpcy5fcmVuZGVyZWRDb21wb25lbnQ9 bnVsbCx0aGlzLl9pbnN0YW5jZT1udWxsKSx0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZT1udWxsLHRo aXMuX3BlbmRpbmdSZXBsYWNlU3RhdGU9ITEsdGhpcy5fcGVuZGluZ0ZvcmNlVXBkYXRlPSExLHRo aXMuX3BlbmRpbmdDYWxsYmFja3M9bnVsbCx0aGlzLl9wZW5kaW5nRWxlbWVudD1udWxsLHRoaXMu X2NvbnRleHQ9bnVsbCx0aGlzLl9yb290Tm9kZUlEPTAsdGhpcy5fdG9wTGV2ZWxXcmFwcGVyPW51 bGwsZi5yZW1vdmUodCl9fSxfbWFza0NvbnRleHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fY3Vy cmVudEVsZW1lbnQudHlwZSxuPXQuY29udGV4dFR5cGVzO2lmKCFuKXJldHVybiB2O3ZhciByPXt9 O2Zvcih2YXIgbyBpbiBuKXJbb109ZVtvXTtyZXR1cm4gcn0sX3Byb2Nlc3NDb250ZXh0OmZ1bmN0 aW9uKGUpe3ZhciB0PXRoaXMuX21hc2tDb250ZXh0KGUpO3JldHVybiB0fSxfcHJvY2Vzc0NoaWxk Q29udGV4dDpmdW5jdGlvbihlKXt2YXIgdCxuPXRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGUscj10 aGlzLl9pbnN0YW5jZTtpZihyLmdldENoaWxkQ29udGV4dCYmKHQ9ci5nZXRDaGlsZENvbnRleHQo KSksdCl7Im9iamVjdCIhPXR5cGVvZiBuLmNoaWxkQ29udGV4dFR5cGVzP3MoIjEwNyIsdGhpcy5n ZXROYW1lKCl8fCJSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCIpOnZvaWQgMDtmb3IodmFyIG8gaW4g dClvIGluIG4uY2hpbGRDb250ZXh0VHlwZXM/dm9pZCAwOnMoIjEwOCIsdGhpcy5nZXROYW1lKCl8 fCJSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCIsbyk7cmV0dXJuIHUoe30sZSx0KX1yZXR1cm4gZX0s X2NoZWNrQ29udGV4dFR5cGVzOmZ1bmN0aW9uKGUsdCxuKXt9LHJlY2VpdmVDb21wb25lbnQ6ZnVu Y3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuX2N1cnJlbnRFbGVtZW50LG89dGhpcy5fY29udGV4dDt0 aGlzLl9wZW5kaW5nRWxlbWVudD1udWxsLHRoaXMudXBkYXRlQ29tcG9uZW50KHQscixlLG8sbil9 LHBlcmZvcm1VcGRhdGVJZk5lY2Vzc2FyeTpmdW5jdGlvbihlKXtudWxsIT10aGlzLl9wZW5kaW5n RWxlbWVudD9tLnJlY2VpdmVDb21wb25lbnQodGhpcyx0aGlzLl9wZW5kaW5nRWxlbWVudCxlLHRo aXMuX2NvbnRleHQpOm51bGwhPT10aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZXx8dGhpcy5fcGVuZGlu Z0ZvcmNlVXBkYXRlP3RoaXMudXBkYXRlQ29tcG9uZW50KGUsdGhpcy5fY3VycmVudEVsZW1lbnQs dGhpcy5fY3VycmVudEVsZW1lbnQsdGhpcy5fY29udGV4dCx0aGlzLl9jb250ZXh0KTp0aGlzLl91 cGRhdGVCYXRjaE51bWJlcj1udWxsfSx1cGRhdGVDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4scixv KXt2YXIgaT10aGlzLl9pbnN0YW5jZTtudWxsPT1pP3MoIjEzNiIsdGhpcy5nZXROYW1lKCl8fCJS ZWFjdENvbXBvc2l0ZUNvbXBvbmVudCIpOnZvaWQgMDt2YXIgYSx1PSExO3RoaXMuX2NvbnRleHQ9 PT1vP2E9aS5jb250ZXh0OihhPXRoaXMuX3Byb2Nlc3NDb250ZXh0KG8pLHU9ITApO3ZhciBsPXQu cHJvcHMsYz1uLnByb3BzO3QhPT1uJiYodT0hMCksdSYmaS5jb21wb25lbnRXaWxsUmVjZWl2ZVBy b3BzJiZpLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoYyxhKTt2YXIgcD10aGlzLl9wcm9jZXNz UGVuZGluZ1N0YXRlKGMsYSksZD0hMDt0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGV8fChpLnNob3Vs ZENvbXBvbmVudFVwZGF0ZT9kPWkuc2hvdWxkQ29tcG9uZW50VXBkYXRlKGMscCxhKTp0aGlzLl9j b21wb3NpdGVUeXBlPT09Xy5QdXJlQ2xhc3MmJihkPSFnKGwsYyl8fCFnKGkuc3RhdGUscCkpKSx0 aGlzLl91cGRhdGVCYXRjaE51bWJlcj1udWxsLGQ/KHRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZT0h MSx0aGlzLl9wZXJmb3JtQ29tcG9uZW50VXBkYXRlKG4sYyxwLGEsZSxvKSk6KHRoaXMuX2N1cnJl bnRFbGVtZW50PW4sdGhpcy5fY29udGV4dD1vLGkucHJvcHM9YyxpLnN0YXRlPXAsaS5jb250ZXh0 PWEpfSxfcHJvY2Vzc1BlbmRpbmdTdGF0ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2luc3Rh bmNlLHI9dGhpcy5fcGVuZGluZ1N0YXRlUXVldWUsbz10aGlzLl9wZW5kaW5nUmVwbGFjZVN0YXRl O2lmKHRoaXMuX3BlbmRpbmdSZXBsYWNlU3RhdGU9ITEsdGhpcy5fcGVuZGluZ1N0YXRlUXVldWU9 bnVsbCwhcilyZXR1cm4gbi5zdGF0ZTtpZihvJiYxPT09ci5sZW5ndGgpcmV0dXJuIHJbMF07Zm9y KHZhciBpPXUoe30sbz9yWzBdOm4uc3RhdGUpLGE9bz8xOjA7YTxyLmxlbmd0aDthKyspe3ZhciBz PXJbYV07dShpLCJmdW5jdGlvbiI9PXR5cGVvZiBzP3MuY2FsbChuLGksZSx0KTpzKX1yZXR1cm4g aX0sX3BlcmZvcm1Db21wb25lbnRVcGRhdGU6ZnVuY3Rpb24oZSx0LG4scixvLGkpe3ZhciBhLHMs dSxsPXRoaXMuX2luc3RhbmNlLGM9Qm9vbGVhbihsLmNvbXBvbmVudERpZFVwZGF0ZSk7YyYmKGE9 bC5wcm9wcyxzPWwuc3RhdGUsdT1sLmNvbnRleHQpLGwuY29tcG9uZW50V2lsbFVwZGF0ZSYmbC5j b21wb25lbnRXaWxsVXBkYXRlKHQsbixyKSx0aGlzLl9jdXJyZW50RWxlbWVudD1lLHRoaXMuX2Nv bnRleHQ9aSxsLnByb3BzPXQsbC5zdGF0ZT1uLGwuY29udGV4dD1yLHRoaXMuX3VwZGF0ZVJlbmRl cmVkQ29tcG9uZW50KG8saSksYyYmby5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGwuY29t cG9uZW50RGlkVXBkYXRlLmJpbmQobCxhLHMsdSksbCl9LF91cGRhdGVSZW5kZXJlZENvbXBvbmVu dDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX3JlbmRlcmVkQ29tcG9uZW50LHI9bi5fY3VycmVu dEVsZW1lbnQsbz10aGlzLl9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnQoKSxpPTA7aWYoeShyLG8p KW0ucmVjZWl2ZUNvbXBvbmVudChuLG8sZSx0aGlzLl9wcm9jZXNzQ2hpbGRDb250ZXh0KHQpKTtl bHNle3ZhciBhPW0uZ2V0SG9zdE5vZGUobik7bS51bm1vdW50Q29tcG9uZW50KG4sITEpO3ZhciBz PWguZ2V0VHlwZShvKTt0aGlzLl9yZW5kZXJlZE5vZGVUeXBlPXM7dmFyIHU9dGhpcy5faW5zdGFu dGlhdGVSZWFjdENvbXBvbmVudChvLHMhPT1oLkVNUFRZKTt0aGlzLl9yZW5kZXJlZENvbXBvbmVu dD11O3ZhciBsPW0ubW91bnRDb21wb25lbnQodSxlLHRoaXMuX2hvc3RQYXJlbnQsdGhpcy5faG9z dENvbnRhaW5lckluZm8sdGhpcy5fcHJvY2Vzc0NoaWxkQ29udGV4dCh0KSxpKTt0aGlzLl9yZXBs YWNlTm9kZVdpdGhNYXJrdXAoYSxsLG4pfX0sX3JlcGxhY2VOb2RlV2l0aE1hcmt1cDpmdW5jdGlv bihlLHQsbil7Yy5yZXBsYWNlTm9kZVdpdGhNYXJrdXAoZSx0LG4pfSxfcmVuZGVyVmFsaWRhdGVk Q29tcG9uZW50V2l0aG91dE93bmVyT3JDb250ZXh0OmZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLl9p bnN0YW5jZTtyZXR1cm4gZT10LnJlbmRlcigpfSxfcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50OmZ1 bmN0aW9uKCl7dmFyIGU7aWYodGhpcy5fY29tcG9zaXRlVHlwZSE9PV8uU3RhdGVsZXNzRnVuY3Rp b25hbCl7cC5jdXJyZW50PXRoaXM7dHJ5e2U9dGhpcy5fcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50 V2l0aG91dE93bmVyT3JDb250ZXh0KCl9ZmluYWxseXtwLmN1cnJlbnQ9bnVsbH19ZWxzZSBlPXRo aXMuX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudFdpdGhvdXRPd25lck9yQ29udGV4dCgpO3JldHVy biBudWxsPT09ZXx8ZT09PSExfHxsLmlzVmFsaWRFbGVtZW50KGUpP3ZvaWQgMDpzKCIxMDkiLHRo aXMuZ2V0TmFtZSgpfHwiUmVhY3RDb21wb3NpdGVDb21wb25lbnQiKSxlfSxhdHRhY2hSZWY6ZnVu Y3Rpb24oZSx0KXt2YXIgbj10aGlzLmdldFB1YmxpY0luc3RhbmNlKCk7bnVsbD09bj9zKCIxMTAi KTp2b2lkIDA7dmFyIHI9dC5nZXRQdWJsaWNJbnN0YW5jZSgpLG89bi5yZWZzPT09dj9uLnJlZnM9 e306bi5yZWZzO29bZV09cn0sZGV0YWNoUmVmOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZ2V0UHVi bGljSW5zdGFuY2UoKS5yZWZzO2RlbGV0ZSB0W2VdfSxnZXROYW1lOmZ1bmN0aW9uKCl7dmFyIGU9 dGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSx0PXRoaXMuX2luc3RhbmNlJiZ0aGlzLl9pbnN0YW5j ZS5jb25zdHJ1Y3RvcjtyZXR1cm4gZS5kaXNwbGF5TmFtZXx8dCYmdC5kaXNwbGF5TmFtZXx8ZS5u YW1lfHx0JiZ0Lm5hbWV8fG51bGx9LGdldFB1YmxpY0luc3RhbmNlOmZ1bmN0aW9uKCl7dmFyIGU9 dGhpcy5faW5zdGFuY2U7cmV0dXJuIHRoaXMuX2NvbXBvc2l0ZVR5cGU9PT1fLlN0YXRlbGVzc0Z1 bmN0aW9uYWw/bnVsbDplfSxfaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudDpudWxsfTt0LmV4cG9y dHM9Yn0sezExMzoxMTMsMTE3OjExNywxMjA6MTIwLDEyMToxMjEsMTMwOjEzMCwxMzc6MTM3LDE0 MToxNDEsMTQyOjE0MiwxNDM6MTQzLDI4OjI4LDUwOjUwLDU3OjU3LDU4OjU4LDYyOjYyLDY2OjY2 fV0sMzA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgzMyksbz1lKDQ3KSxp PWUoNjApLGE9ZSg2Nikscz1lKDcxKSx1PWUoNzIpLGw9ZSg5NiksYz1lKDEwMykscD1lKDExNCk7 ZSgxNDIpO28uaW5qZWN0KCk7dmFyIGQ9e2ZpbmRET01Ob2RlOmwscmVuZGVyOmkucmVuZGVyLHVu bW91bnRDb21wb25lbnRBdE5vZGU6aS51bm1vdW50Q29tcG9uZW50QXROb2RlLHZlcnNpb246dSx1 bnN0YWJsZV9iYXRjaGVkVXBkYXRlczpzLmJhdGNoZWRVcGRhdGVzLHVuc3RhYmxlX3JlbmRlclN1 YnRyZWVJbnRvQ29udGFpbmVyOnB9OyJ1bmRlZmluZWQiIT10eXBlb2YgX19SRUFDVF9ERVZUT09M U19HTE9CQUxfSE9PS19fJiYiZnVuY3Rpb24iPT10eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9C QUxfSE9PS19fLmluamVjdCYmX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmluamVjdCh7 Q29tcG9uZW50VHJlZTp7Z2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGU6ci5nZXRDbG9zZXN0SW5z dGFuY2VGcm9tTm9kZSxnZXROb2RlRnJvbUluc3RhbmNlOmZ1bmN0aW9uKGUpe3JldHVybiBlLl9y ZW5kZXJlZENvbXBvbmVudCYmKGU9YyhlKSksZT9yLmdldE5vZGVGcm9tSW5zdGFuY2UoZSk6bnVs bH19LE1vdW50OmksUmVjb25jaWxlcjphfSk7dC5leHBvcnRzPWR9LHsxMDM6MTAzLDExNDoxMTQs MTQyOjE0MiwzMzozMyw0Nzo0Nyw2MDo2MCw2Njo2Niw3MTo3MSw3Mjo3Miw5Njo5Nn1dLDMxOltm dW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7aWYoZSl7dmFyIHQ9ZS5f Y3VycmVudEVsZW1lbnQuX293bmVyfHxudWxsO2lmKHQpe3ZhciBuPXQuZ2V0TmFtZSgpO2lmKG4p cmV0dXJuIiBUaGlzIERPTSBub2RlIHdhcyByZW5kZXJlZCBieSBgIituKyJgLiJ9fXJldHVybiIi fWZ1bmN0aW9uIG8oZSx0KXt0JiYoWFtlLl90YWddJiYobnVsbCE9dC5jaGlsZHJlbnx8bnVsbCE9 dC5kYW5nZXJvdXNseVNldElubmVySFRNTD9tKCIxMzciLGUuX3RhZyxlLl9jdXJyZW50RWxlbWVu dC5fb3duZXI/IiBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiAiK2UuX2N1cnJlbnRFbGVtZW50 Ll9vd25lci5nZXROYW1lKCkrIi4iOiIiKTp2b2lkIDApLG51bGwhPXQuZGFuZ2Vyb3VzbHlTZXRJ bm5lckhUTUwmJihudWxsIT10LmNoaWxkcmVuP20oIjYwIik6dm9pZCAwLCJvYmplY3QiPT10eXBl b2YgdC5kYW5nZXJvdXNseVNldElubmVySFRNTCYmVyBpbiB0LmRhbmdlcm91c2x5U2V0SW5uZXJI VE1MP3ZvaWQgMDptKCI2MSIpKSxudWxsIT10LnN0eWxlJiYib2JqZWN0IiE9dHlwZW9mIHQuc3R5 bGU/bSgiNjIiLHIoZSkpOnZvaWQgMCl9ZnVuY3Rpb24gaShlLHQsbixyKXtpZighKHIgaW5zdGFu Y2VvZiBSKSl7dmFyIG89ZS5faG9zdENvbnRhaW5lckluZm8saT1vLl9ub2RlJiZvLl9ub2RlLm5v ZGVUeXBlPT09cSxzPWk/by5fbm9kZTpvLl9vd25lckRvY3VtZW50O0YodCxzKSxyLmdldFJlYWN0 TW91bnRSZWFkeSgpLmVucXVldWUoYSx7aW5zdDplLHJlZ2lzdHJhdGlvbk5hbWU6dCxsaXN0ZW5l cjpufSl9fWZ1bmN0aW9uIGEoKXt2YXIgZT10aGlzO3gucHV0TGlzdGVuZXIoZS5pbnN0LGUucmVn aXN0cmF0aW9uTmFtZSxlLmxpc3RlbmVyKX1mdW5jdGlvbiBzKCl7dmFyIGU9dGhpcztOLnBvc3RN b3VudFdyYXBwZXIoZSl9ZnVuY3Rpb24gdSgpe3ZhciBlPXRoaXM7SS5wb3N0TW91bnRXcmFwcGVy KGUpfWZ1bmN0aW9uIGwoKXt2YXIgZT10aGlzO1MucG9zdE1vdW50V3JhcHBlcihlKX1mdW5jdGlv biBjKCl7dmFyIGU9dGhpcztlLl9yb290Tm9kZUlEP3ZvaWQgMDptKCI2MyIpO3ZhciB0PVUoZSk7 c3dpdGNoKHQ/dm9pZCAwOm0oIjY0IiksZS5fdGFnKXtjYXNlImlmcmFtZSI6Y2FzZSJvYmplY3Qi OmUuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM9W1QudHJhcEJ1YmJsZWRFdmVudCgidG9wTG9hZCIs ImxvYWQiLHQpXTticmVhaztjYXNlInZpZGVvIjpjYXNlImF1ZGlvIjplLl93cmFwcGVyU3RhdGUu bGlzdGVuZXJzPVtdO2Zvcih2YXIgbiBpbiBLKUsuaGFzT3duUHJvcGVydHkobikmJmUuX3dyYXBw ZXJTdGF0ZS5saXN0ZW5lcnMucHVzaChULnRyYXBCdWJibGVkRXZlbnQobixLW25dLHQpKTticmVh aztjYXNlInNvdXJjZSI6ZS5fd3JhcHBlclN0YXRlLmxpc3RlbmVycz1bVC50cmFwQnViYmxlZEV2 ZW50KCJ0b3BFcnJvciIsImVycm9yIix0KV07YnJlYWs7Y2FzZSJpbWciOmUuX3dyYXBwZXJTdGF0 ZS5saXN0ZW5lcnM9W1QudHJhcEJ1YmJsZWRFdmVudCgidG9wRXJyb3IiLCJlcnJvciIsdCksVC50 cmFwQnViYmxlZEV2ZW50KCJ0b3BMb2FkIiwibG9hZCIsdCldO2JyZWFrO2Nhc2UiZm9ybSI6ZS5f d3JhcHBlclN0YXRlLmxpc3RlbmVycz1bVC50cmFwQnViYmxlZEV2ZW50KCJ0b3BSZXNldCIsInJl c2V0Iix0KSxULnRyYXBCdWJibGVkRXZlbnQoInRvcFN1Ym1pdCIsInN1Ym1pdCIsdCldO2JyZWFr O2Nhc2UiaW5wdXQiOmNhc2Uic2VsZWN0IjpjYXNlInRleHRhcmVhIjplLl93cmFwcGVyU3RhdGUu bGlzdGVuZXJzPVtULnRyYXBCdWJibGVkRXZlbnQoInRvcEludmFsaWQiLCJpbnZhbGlkIix0KV19 fWZ1bmN0aW9uIHAoKXtNLnBvc3RVcGRhdGVXcmFwcGVyKHRoaXMpfWZ1bmN0aW9uIGQoZSl7JC5j YWxsKEcsZSl8fChRLnRlc3QoZSk/dm9pZCAwOm0oIjY1IixlKSxHW2VdPSEwKX1mdW5jdGlvbiBm KGUsdCl7cmV0dXJuIGUuaW5kZXhPZigiLSIpPj0wfHxudWxsIT10LmlzfWZ1bmN0aW9uIGgoZSl7 dmFyIHQ9ZS50eXBlO2QodCksdGhpcy5fY3VycmVudEVsZW1lbnQ9ZSx0aGlzLl90YWc9dC50b0xv d2VyQ2FzZSgpLHRoaXMuX25hbWVzcGFjZVVSST1udWxsLHRoaXMuX3JlbmRlcmVkQ2hpbGRyZW49 bnVsbCx0aGlzLl9wcmV2aW91c1N0eWxlPW51bGwsdGhpcy5fcHJldmlvdXNTdHlsZUNvcHk9bnVs bCx0aGlzLl9ob3N0Tm9kZT1udWxsLHRoaXMuX2hvc3RQYXJlbnQ9bnVsbCx0aGlzLl9yb290Tm9k ZUlEPTAsdGhpcy5fZG9tSUQ9MCx0aGlzLl9ob3N0Q29udGFpbmVySW5mbz1udWxsLHRoaXMuX3dy YXBwZXJTdGF0ZT1udWxsLHRoaXMuX3RvcExldmVsV3JhcHBlcj1udWxsLHRoaXMuX2ZsYWdzPTB9 dmFyIG09ZSgxMTMpLHY9ZSgxNDMpLGc9ZSgyKSx5PWUoNSksXz1lKDkpLEM9ZSgxMCksYj1lKDEx KSxFPWUoMTIpLHg9ZSgxNiksdz1lKDE3KSxUPWUoMjUpLGs9ZSgzMiksUD1lKDMzKSxOPWUoMzgp LFM9ZSgzOSksTT1lKDQwKSxJPWUoNDMpLE89KGUoNTgpLGUoNjEpKSxSPWUoNjgpLEE9KGUoMTI5 KSxlKDk1KSksRD0oZSgxMzcpLGUoMTEwKSxlKDE0MSksZSgxMTkpLGUoMTQyKSxrKSxMPXguZGVs ZXRlTGlzdGVuZXIsVT1QLmdldE5vZGVGcm9tSW5zdGFuY2UsRj1ULmxpc3RlblRvLFY9dy5yZWdp c3RyYXRpb25OYW1lTW9kdWxlcyxCPXtzdHJpbmc6ITAsbnVtYmVyOiEwfSxqPSJzdHlsZSIsVz0i X19odG1sIixIPXtjaGlsZHJlbjpudWxsLGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOm51bGwsc3Vw cHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nOm51bGx9LHE9MTEsSz17dG9wQWJvcnQ6ImFib3J0 Iix0b3BDYW5QbGF5OiJjYW5wbGF5Iix0b3BDYW5QbGF5VGhyb3VnaDoiY2FucGxheXRocm91Z2gi LHRvcER1cmF0aW9uQ2hhbmdlOiJkdXJhdGlvbmNoYW5nZSIsdG9wRW1wdGllZDoiZW1wdGllZCIs dG9wRW5jcnlwdGVkOiJlbmNyeXB0ZWQiLHRvcEVuZGVkOiJlbmRlZCIsdG9wRXJyb3I6ImVycm9y Iix0b3BMb2FkZWREYXRhOiJsb2FkZWRkYXRhIix0b3BMb2FkZWRNZXRhZGF0YToibG9hZGVkbWV0 YWRhdGEiLHRvcExvYWRTdGFydDoibG9hZHN0YXJ0Iix0b3BQYXVzZToicGF1c2UiLHRvcFBsYXk6 InBsYXkiLHRvcFBsYXlpbmc6InBsYXlpbmciLHRvcFByb2dyZXNzOiJwcm9ncmVzcyIsdG9wUmF0 ZUNoYW5nZToicmF0ZWNoYW5nZSIsdG9wU2Vla2VkOiJzZWVrZWQiLHRvcFNlZWtpbmc6InNlZWtp bmciLHRvcFN0YWxsZWQ6InN0YWxsZWQiLHRvcFN1c3BlbmQ6InN1c3BlbmQiLHRvcFRpbWVVcGRh dGU6InRpbWV1cGRhdGUiLHRvcFZvbHVtZUNoYW5nZToidm9sdW1lY2hhbmdlIix0b3BXYWl0aW5n OiJ3YWl0aW5nIn0sej17YXJlYTohMCxiYXNlOiEwLGJyOiEwLGNvbDohMCxlbWJlZDohMCxocjoh MCxpbWc6ITAsaW5wdXQ6ITAsa2V5Z2VuOiEwLGxpbms6ITAsbWV0YTohMCxwYXJhbTohMCxzb3Vy Y2U6ITAsdHJhY2s6ITAsd2JyOiEwfSxZPXtsaXN0aW5nOiEwLHByZTohMCx0ZXh0YXJlYTohMH0s WD12KHttZW51aXRlbTohMH0seiksUT0vXlthLXpBLVpdW2EtekEtWjpfXC5cLVxkXSokLyxHPXt9 LCQ9e30uaGFzT3duUHJvcGVydHksWj0xO2guZGlzcGxheU5hbWU9IlJlYWN0RE9NQ29tcG9uZW50 IixoLk1peGluPXttb3VudENvbXBvbmVudDpmdW5jdGlvbihlLHQsbixyKXt0aGlzLl9yb290Tm9k ZUlEPVorKyx0aGlzLl9kb21JRD1uLl9pZENvdW50ZXIrKyx0aGlzLl9ob3N0UGFyZW50PXQsdGhp cy5faG9zdENvbnRhaW5lckluZm89bjt2YXIgaT10aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcztz d2l0Y2godGhpcy5fdGFnKXtjYXNlImF1ZGlvIjpjYXNlImZvcm0iOmNhc2UiaWZyYW1lIjpjYXNl ImltZyI6Y2FzZSJsaW5rIjpjYXNlIm9iamVjdCI6Y2FzZSJzb3VyY2UiOmNhc2UidmlkZW8iOnRo aXMuX3dyYXBwZXJTdGF0ZT17bGlzdGVuZXJzOm51bGx9LGUuZ2V0UmVhY3RNb3VudFJlYWR5KCku ZW5xdWV1ZShjLHRoaXMpO2JyZWFrO2Nhc2UiaW5wdXQiOk4ubW91bnRXcmFwcGVyKHRoaXMsaSx0 KSxpPU4uZ2V0SG9zdFByb3BzKHRoaXMsaSksZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVl KGMsdGhpcyk7YnJlYWs7Y2FzZSJvcHRpb24iOlMubW91bnRXcmFwcGVyKHRoaXMsaSx0KSxpPVMu Z2V0SG9zdFByb3BzKHRoaXMsaSk7YnJlYWs7Y2FzZSJzZWxlY3QiOk0ubW91bnRXcmFwcGVyKHRo aXMsaSx0KSxpPU0uZ2V0SG9zdFByb3BzKHRoaXMsaSksZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5l bnF1ZXVlKGMsdGhpcyk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6SS5tb3VudFdyYXBwZXIodGhpcyxp LHQpLGk9SS5nZXRIb3N0UHJvcHModGhpcyxpKSxlLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVl dWUoYyx0aGlzKX1vKHRoaXMsaSk7dmFyIGEscDtudWxsIT10PyhhPXQuX25hbWVzcGFjZVVSSSxw PXQuX3RhZyk6bi5fdGFnJiYoYT1uLl9uYW1lc3BhY2VVUkkscD1uLl90YWcpLChudWxsPT1hfHxh PT09Qy5zdmcmJiJmb3JlaWdub2JqZWN0Ij09PXApJiYoYT1DLmh0bWwpLGE9PT1DLmh0bWwmJigi c3ZnIj09PXRoaXMuX3RhZz9hPUMuc3ZnOiJtYXRoIj09PXRoaXMuX3RhZyYmKGE9Qy5tYXRobWwp KSx0aGlzLl9uYW1lc3BhY2VVUkk9YTt2YXIgZDtpZihlLnVzZUNyZWF0ZUVsZW1lbnQpe3ZhciBm LGg9bi5fb3duZXJEb2N1bWVudDtpZihhPT09Qy5odG1sKWlmKCJzY3JpcHQiPT09dGhpcy5fdGFn KXt2YXIgbT1oLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHY9dGhpcy5fY3VycmVudEVsZW1lbnQudHlw ZTttLmlubmVySFRNTD0iPCIrdisiPjwvIit2KyI+IixmPW0ucmVtb3ZlQ2hpbGQobS5maXJzdENo aWxkKX1lbHNlIGY9aS5pcz9oLmNyZWF0ZUVsZW1lbnQodGhpcy5fY3VycmVudEVsZW1lbnQudHlw ZSxpLmlzKTpoLmNyZWF0ZUVsZW1lbnQodGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSk7ZWxzZSBm PWguY3JlYXRlRWxlbWVudE5TKGEsdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSk7UC5wcmVjYWNo ZU5vZGUodGhpcyxmKSx0aGlzLl9mbGFnc3w9RC5oYXNDYWNoZWRDaGlsZE5vZGVzLHRoaXMuX2hv c3RQYXJlbnR8fEUuc2V0QXR0cmlidXRlRm9yUm9vdChmKSx0aGlzLl91cGRhdGVET01Qcm9wZXJ0 aWVzKG51bGwsaSxlKTt2YXIgeT1fKGYpO3RoaXMuX2NyZWF0ZUluaXRpYWxDaGlsZHJlbihlLGks cix5KSxkPXl9ZWxzZXt2YXIgYj10aGlzLl9jcmVhdGVPcGVuVGFnTWFya3VwQW5kUHV0TGlzdGVu ZXJzKGUsaSkseD10aGlzLl9jcmVhdGVDb250ZW50TWFya3VwKGUsaSxyKTtkPSF4JiZ6W3RoaXMu X3RhZ10/YisiLz4iOmIrIj4iK3grIjwvIit0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlKyI+In1z d2l0Y2godGhpcy5fdGFnKXtjYXNlImlucHV0IjplLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVl dWUocyx0aGlzKSxpLmF1dG9Gb2N1cyYmZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGcu Zm9jdXNET01Db21wb25lbnQsdGhpcyk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6ZS5nZXRSZWFjdE1v dW50UmVhZHkoKS5lbnF1ZXVlKHUsdGhpcyksaS5hdXRvRm9jdXMmJmUuZ2V0UmVhY3RNb3VudFJl YWR5KCkuZW5xdWV1ZShnLmZvY3VzRE9NQ29tcG9uZW50LHRoaXMpO2JyZWFrO2Nhc2Uic2VsZWN0 IjppLmF1dG9Gb2N1cyYmZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGcuZm9jdXNET01D b21wb25lbnQsdGhpcyk7YnJlYWs7Y2FzZSJidXR0b24iOmkuYXV0b0ZvY3VzJiZlLmdldFJlYWN0 TW91bnRSZWFkeSgpLmVucXVldWUoZy5mb2N1c0RPTUNvbXBvbmVudCx0aGlzKTticmVhaztjYXNl Im9wdGlvbiI6ZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGwsdGhpcyl9cmV0dXJuIGR9 LF9jcmVhdGVPcGVuVGFnTWFya3VwQW5kUHV0TGlzdGVuZXJzOmZ1bmN0aW9uKGUsdCl7dmFyIG49 IjwiK3RoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7Zm9yKHZhciByIGluIHQpaWYodC5oYXNPd25Q cm9wZXJ0eShyKSl7dmFyIG89dFtyXTtpZihudWxsIT1vKWlmKFYuaGFzT3duUHJvcGVydHkocikp byYmaSh0aGlzLHIsbyxlKTtlbHNle3I9PT1qJiYobyYmKG89dGhpcy5fcHJldmlvdXNTdHlsZUNv cHk9dih7fSx0LnN0eWxlKSksbz15LmNyZWF0ZU1hcmt1cEZvclN0eWxlcyhvLHRoaXMpKTt2YXIg YT1udWxsO251bGwhPXRoaXMuX3RhZyYmZih0aGlzLl90YWcsdCk/SC5oYXNPd25Qcm9wZXJ0eShy KXx8KGE9RS5jcmVhdGVNYXJrdXBGb3JDdXN0b21BdHRyaWJ1dGUocixvKSk6YT1FLmNyZWF0ZU1h cmt1cEZvclByb3BlcnR5KHIsbyksYSYmKG4rPSIgIithKX19cmV0dXJuIGUucmVuZGVyVG9TdGF0 aWNNYXJrdXA/bjoodGhpcy5faG9zdFBhcmVudHx8KG4rPSIgIitFLmNyZWF0ZU1hcmt1cEZvclJv b3QoKSksbis9IiAiK0UuY3JlYXRlTWFya3VwRm9ySUQodGhpcy5fZG9tSUQpKX0sX2NyZWF0ZUNv bnRlbnRNYXJrdXA6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPSIiLG89dC5kYW5nZXJvdXNseVNldElu bmVySFRNTDtpZihudWxsIT1vKW51bGwhPW8uX19odG1sJiYocj1vLl9faHRtbCk7ZWxzZXt2YXIg aT1CW3R5cGVvZiB0LmNoaWxkcmVuXT90LmNoaWxkcmVuOm51bGwsYT1udWxsIT1pP251bGw6dC5j aGlsZHJlbjtpZihudWxsIT1pKXI9QShpKTtlbHNlIGlmKG51bGwhPWEpe3ZhciBzPXRoaXMubW91 bnRDaGlsZHJlbihhLGUsbik7cj1zLmpvaW4oIiIpfX1yZXR1cm4gWVt0aGlzLl90YWddJiYiXG4i PT09ci5jaGFyQXQoMCk/IlxuIityOnJ9LF9jcmVhdGVJbml0aWFsQ2hpbGRyZW46ZnVuY3Rpb24o ZSx0LG4scil7dmFyIG89dC5kYW5nZXJvdXNseVNldElubmVySFRNTDtpZihudWxsIT1vKW51bGwh PW8uX19odG1sJiZfLnF1ZXVlSFRNTChyLG8uX19odG1sKTtlbHNle3ZhciBpPUJbdHlwZW9mIHQu Y2hpbGRyZW5dP3QuY2hpbGRyZW46bnVsbCxhPW51bGwhPWk/bnVsbDp0LmNoaWxkcmVuO2lmKG51 bGwhPWkpIiIhPT1pJiZfLnF1ZXVlVGV4dChyLGkpO2Vsc2UgaWYobnVsbCE9YSlmb3IodmFyIHM9 dGhpcy5tb3VudENoaWxkcmVuKGEsZSxuKSx1PTA7dTxzLmxlbmd0aDt1KyspXy5xdWV1ZUNoaWxk KHIsc1t1XSl9fSxyZWNlaXZlQ29tcG9uZW50OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLl9j dXJyZW50RWxlbWVudDt0aGlzLl9jdXJyZW50RWxlbWVudD1lLHRoaXMudXBkYXRlQ29tcG9uZW50 KHQscixlLG4pfSx1cGRhdGVDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dC5wcm9w cyxhPXRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzO3N3aXRjaCh0aGlzLl90YWcpe2Nhc2UiaW5w dXQiOmk9Ti5nZXRIb3N0UHJvcHModGhpcyxpKSxhPU4uZ2V0SG9zdFByb3BzKHRoaXMsYSk7YnJl YWs7Y2FzZSJvcHRpb24iOmk9Uy5nZXRIb3N0UHJvcHModGhpcyxpKSxhPVMuZ2V0SG9zdFByb3Bz KHRoaXMsYSk7YnJlYWs7Y2FzZSJzZWxlY3QiOmk9TS5nZXRIb3N0UHJvcHModGhpcyxpKSxhPU0u Z2V0SG9zdFByb3BzKHRoaXMsYSk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6aT1JLmdldEhvc3RQcm9w cyh0aGlzLGkpLGE9SS5nZXRIb3N0UHJvcHModGhpcyxhKX1zd2l0Y2gobyh0aGlzLGEpLHRoaXMu X3VwZGF0ZURPTVByb3BlcnRpZXMoaSxhLGUpLHRoaXMuX3VwZGF0ZURPTUNoaWxkcmVuKGksYSxl LHIpLHRoaXMuX3RhZyl7Y2FzZSJpbnB1dCI6Ti51cGRhdGVXcmFwcGVyKHRoaXMpO2JyZWFrO2Nh c2UidGV4dGFyZWEiOkkudXBkYXRlV3JhcHBlcih0aGlzKTticmVhaztjYXNlInNlbGVjdCI6ZS5n ZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHAsdGhpcyl9fSxfdXBkYXRlRE9NUHJvcGVydGll czpmdW5jdGlvbihlLHQsbil7dmFyIHIsbyxhO2ZvcihyIGluIGUpaWYoIXQuaGFzT3duUHJvcGVy dHkocikmJmUuaGFzT3duUHJvcGVydHkocikmJm51bGwhPWVbcl0paWYocj09PWope3ZhciBzPXRo aXMuX3ByZXZpb3VzU3R5bGVDb3B5O2ZvcihvIGluIHMpcy5oYXNPd25Qcm9wZXJ0eShvKSYmKGE9 YXx8e30sYVtvXT0iIik7dGhpcy5fcHJldmlvdXNTdHlsZUNvcHk9bnVsbH1lbHNlIFYuaGFzT3du UHJvcGVydHkocik/ZVtyXSYmTCh0aGlzLHIpOmYodGhpcy5fdGFnLGUpP0guaGFzT3duUHJvcGVy dHkocil8fEUuZGVsZXRlVmFsdWVGb3JBdHRyaWJ1dGUoVSh0aGlzKSxyKTooYi5wcm9wZXJ0aWVz W3JdfHxiLmlzQ3VzdG9tQXR0cmlidXRlKHIpKSYmRS5kZWxldGVWYWx1ZUZvclByb3BlcnR5KFUo dGhpcykscik7Zm9yKHIgaW4gdCl7dmFyIHU9dFtyXSxsPXI9PT1qP3RoaXMuX3ByZXZpb3VzU3R5 bGVDb3B5Om51bGwhPWU/ZVtyXTp2b2lkIDA7aWYodC5oYXNPd25Qcm9wZXJ0eShyKSYmdSE9PWwm JihudWxsIT11fHxudWxsIT1sKSlpZihyPT09ailpZih1P3U9dGhpcy5fcHJldmlvdXNTdHlsZUNv cHk9dih7fSx1KTp0aGlzLl9wcmV2aW91c1N0eWxlQ29weT1udWxsLGwpe2ZvcihvIGluIGwpIWwu aGFzT3duUHJvcGVydHkobyl8fHUmJnUuaGFzT3duUHJvcGVydHkobyl8fChhPWF8fHt9LGFbb109 IiIpO2ZvcihvIGluIHUpdS5oYXNPd25Qcm9wZXJ0eShvKSYmbFtvXSE9PXVbb10mJihhPWF8fHt9 LGFbb109dVtvXSl9ZWxzZSBhPXU7ZWxzZSBpZihWLmhhc093blByb3BlcnR5KHIpKXU/aSh0aGlz LHIsdSxuKTpsJiZMKHRoaXMscik7ZWxzZSBpZihmKHRoaXMuX3RhZyx0KSlILmhhc093blByb3Bl cnR5KHIpfHxFLnNldFZhbHVlRm9yQXR0cmlidXRlKFUodGhpcykscix1KTtlbHNlIGlmKGIucHJv cGVydGllc1tyXXx8Yi5pc0N1c3RvbUF0dHJpYnV0ZShyKSl7dmFyIGM9VSh0aGlzKTtudWxsIT11 P0Uuc2V0VmFsdWVGb3JQcm9wZXJ0eShjLHIsdSk6RS5kZWxldGVWYWx1ZUZvclByb3BlcnR5KGMs cil9fWEmJnkuc2V0VmFsdWVGb3JTdHlsZXMoVSh0aGlzKSxhLHRoaXMpfSxfdXBkYXRlRE9NQ2hp bGRyZW46ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89Qlt0eXBlb2YgZS5jaGlsZHJlbl0/ZS5jaGls ZHJlbjpudWxsLGk9Qlt0eXBlb2YgdC5jaGlsZHJlbl0/dC5jaGlsZHJlbjpudWxsLGE9ZS5kYW5n ZXJvdXNseVNldElubmVySFRNTCYmZS5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWwscz10 LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MJiZ0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRt bCx1PW51bGwhPW8/bnVsbDplLmNoaWxkcmVuLGw9bnVsbCE9aT9udWxsOnQuY2hpbGRyZW4sYz1u dWxsIT1vfHxudWxsIT1hLHA9bnVsbCE9aXx8bnVsbCE9cztudWxsIT11JiZudWxsPT1sP3RoaXMu dXBkYXRlQ2hpbGRyZW4obnVsbCxuLHIpOmMmJiFwJiZ0aGlzLnVwZGF0ZVRleHRDb250ZW50KCIi KSxudWxsIT1pP28hPT1pJiZ0aGlzLnVwZGF0ZVRleHRDb250ZW50KCIiK2kpOm51bGwhPXM/YSE9 PXMmJnRoaXMudXBkYXRlTWFya3VwKCIiK3MpOm51bGwhPWwmJnRoaXMudXBkYXRlQ2hpbGRyZW4o bCxuLHIpfSxnZXRIb3N0Tm9kZTpmdW5jdGlvbigpe3JldHVybiBVKHRoaXMpfSx1bm1vdW50Q29t cG9uZW50OmZ1bmN0aW9uKGUpe3N3aXRjaCh0aGlzLl90YWcpe2Nhc2UiYXVkaW8iOmNhc2UiZm9y bSI6Y2FzZSJpZnJhbWUiOmNhc2UiaW1nIjpjYXNlImxpbmsiOmNhc2Uib2JqZWN0IjpjYXNlInNv dXJjZSI6Y2FzZSJ2aWRlbyI6dmFyIHQ9dGhpcy5fd3JhcHBlclN0YXRlLmxpc3RlbmVycztpZih0 KWZvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXRbbl0ucmVtb3ZlKCk7YnJlYWs7Y2FzZSJodG1s IjpjYXNlImhlYWQiOmNhc2UiYm9keSI6bSgiNjYiLHRoaXMuX3RhZyl9dGhpcy51bm1vdW50Q2hp bGRyZW4oZSksUC51bmNhY2hlTm9kZSh0aGlzKSx4LmRlbGV0ZUFsbExpc3RlbmVycyh0aGlzKSx0 aGlzLl9yb290Tm9kZUlEPTAsdGhpcy5fZG9tSUQ9MCx0aGlzLl93cmFwcGVyU3RhdGU9bnVsbH0s Z2V0UHVibGljSW5zdGFuY2U6ZnVuY3Rpb24oKXtyZXR1cm4gVSh0aGlzKX19LHYoaC5wcm90b3R5 cGUsaC5NaXhpbixPLk1peGluKSx0LmV4cG9ydHM9aH0sezEwOjEwLDExOjExLDExMDoxMTAsMTEz OjExMywxMTk6MTE5LDEyOjEyLDEyOToxMjksMTM3OjEzNywxNDE6MTQxLDE0MjoxNDIsMTQzOjE0 MywxNjoxNiwxNzoxNywyOjIsMjU6MjUsMzI6MzIsMzM6MzMsMzg6MzgsMzk6MzksNDA6NDAsNDM6 NDMsNTo1LDU4OjU4LDYxOjYxLDY4OjY4LDk6OSw5NTo5NX1dLDMyOltmdW5jdGlvbihlLHQsbil7 InVzZSBzdHJpY3QiO3ZhciByPXtoYXNDYWNoZWRDaGlsZE5vZGVzOjF9O3QuZXhwb3J0cz1yfSx7 fV0sMzM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3JldHVy biAxPT09ZS5ub2RlVHlwZSYmZS5nZXRBdHRyaWJ1dGUoaCk9PT1TdHJpbmcodCl8fDg9PT1lLm5v ZGVUeXBlJiZlLm5vZGVWYWx1ZT09PSIgcmVhY3QtdGV4dDogIit0KyIgInx8OD09PWUubm9kZVR5 cGUmJmUubm9kZVZhbHVlPT09IiByZWFjdC1lbXB0eTogIit0KyIgIn1mdW5jdGlvbiBvKGUpe2Zv cih2YXIgdDt0PWUuX3JlbmRlcmVkQ29tcG9uZW50OyllPXQ7cmV0dXJuIGV9ZnVuY3Rpb24gaShl LHQpe3ZhciBuPW8oZSk7bi5faG9zdE5vZGU9dCx0W3ZdPW59ZnVuY3Rpb24gYShlKXt2YXIgdD1l Ll9ob3N0Tm9kZTt0JiYoZGVsZXRlIHRbdl0sZS5faG9zdE5vZGU9bnVsbCl9ZnVuY3Rpb24gcyhl LHQpe2lmKCEoZS5fZmxhZ3MmbS5oYXNDYWNoZWRDaGlsZE5vZGVzKSl7dmFyIG49ZS5fcmVuZGVy ZWRDaGlsZHJlbixhPXQuZmlyc3RDaGlsZDtlOmZvcih2YXIgcyBpbiBuKWlmKG4uaGFzT3duUHJv cGVydHkocykpe3ZhciB1PW5bc10sbD1vKHUpLl9kb21JRDtpZigwIT09bCl7Zm9yKDtudWxsIT09 YTthPWEubmV4dFNpYmxpbmcpaWYocihhLGwpKXtpKHUsYSk7Y29udGludWUgZX1wKCIzMiIsbCl9 fWUuX2ZsYWdzfD1tLmhhc0NhY2hlZENoaWxkTm9kZXN9fWZ1bmN0aW9uIHUoZSl7aWYoZVt2XSly ZXR1cm4gZVt2XTtmb3IodmFyIHQ9W107IWVbdl07KXtpZih0LnB1c2goZSksIWUucGFyZW50Tm9k ZSlyZXR1cm4gbnVsbDtlPWUucGFyZW50Tm9kZX1mb3IodmFyIG4scjtlJiYocj1lW3ZdKTtlPXQu cG9wKCkpbj1yLHQubGVuZ3RoJiZzKHIsZSk7cmV0dXJuIG59ZnVuY3Rpb24gbChlKXt2YXIgdD11 KGUpO3JldHVybiBudWxsIT10JiZ0Ll9ob3N0Tm9kZT09PWU/dDpudWxsfWZ1bmN0aW9uIGMoZSl7 aWYodm9pZCAwPT09ZS5faG9zdE5vZGU/cCgiMzMiKTp2b2lkIDAsZS5faG9zdE5vZGUpcmV0dXJu IGUuX2hvc3ROb2RlO2Zvcih2YXIgdD1bXTshZS5faG9zdE5vZGU7KXQucHVzaChlKSxlLl9ob3N0 UGFyZW50P3ZvaWQgMDpwKCIzNCIpLGU9ZS5faG9zdFBhcmVudDtmb3IoO3QubGVuZ3RoO2U9dC5w b3AoKSlzKGUsZS5faG9zdE5vZGUpO3JldHVybiBlLl9ob3N0Tm9kZX12YXIgcD1lKDExMyksZD1l KDExKSxmPWUoMzIpLGg9KGUoMTM3KSxkLklEX0FUVFJJQlVURV9OQU1FKSxtPWYsdj0iX19yZWFj dEludGVybmFsSW5zdGFuY2UkIitNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKSxn PXtnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZTp1LGdldEluc3RhbmNlRnJvbU5vZGU6bCxnZXRO b2RlRnJvbUluc3RhbmNlOmMscHJlY2FjaGVDaGlsZE5vZGVzOnMscHJlY2FjaGVOb2RlOmksdW5j YWNoZU5vZGU6YX07dC5leHBvcnRzPWd9LHsxMToxMSwxMTM6MTEzLDEzNzoxMzcsMzI6MzJ9XSwz NDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7dmFyIG49e190 b3BMZXZlbFdyYXBwZXI6ZSxfaWRDb3VudGVyOjEsX293bmVyRG9jdW1lbnQ6dD90Lm5vZGVUeXBl PT09bz90OnQub3duZXJEb2N1bWVudDpudWxsLF9ub2RlOnQsX3RhZzp0P3Qubm9kZU5hbWUudG9M b3dlckNhc2UoKTpudWxsLF9uYW1lc3BhY2VVUkk6dD90Lm5hbWVzcGFjZVVSSTpudWxsfTtyZXR1 cm4gbn12YXIgbz0oZSgxMTkpLDkpO3QuZXhwb3J0cz1yfSx7MTE5OjExOX1dLDM1OltmdW5jdGlv bihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTQzKSxvPWUoOSksaT1lKDMzKSxhPWZ1bmN0 aW9uKGUpe3RoaXMuX2N1cnJlbnRFbGVtZW50PW51bGwsdGhpcy5faG9zdE5vZGU9bnVsbCx0aGlz Ll9ob3N0UGFyZW50PW51bGwsdGhpcy5faG9zdENvbnRhaW5lckluZm89bnVsbCx0aGlzLl9kb21J RD0wfTtyKGEucHJvdG90eXBlLHttb3VudENvbXBvbmVudDpmdW5jdGlvbihlLHQsbixyKXt2YXIg YT1uLl9pZENvdW50ZXIrKzt0aGlzLl9kb21JRD1hLHRoaXMuX2hvc3RQYXJlbnQ9dCx0aGlzLl9o b3N0Q29udGFpbmVySW5mbz1uO3ZhciBzPSIgcmVhY3QtZW1wdHk6ICIrdGhpcy5fZG9tSUQrIiAi O2lmKGUudXNlQ3JlYXRlRWxlbWVudCl7dmFyIHU9bi5fb3duZXJEb2N1bWVudCxsPXUuY3JlYXRl Q29tbWVudChzKTtyZXR1cm4gaS5wcmVjYWNoZU5vZGUodGhpcyxsKSxvKGwpfXJldHVybiBlLnJl bmRlclRvU3RhdGljTWFya3VwPyIiOiI8IS0tIitzKyItLT4ifSxyZWNlaXZlQ29tcG9uZW50OmZ1 bmN0aW9uKCl7fSxnZXRIb3N0Tm9kZTpmdW5jdGlvbigpe3JldHVybiBpLmdldE5vZGVGcm9tSW5z dGFuY2UodGhpcyl9LHVubW91bnRDb21wb25lbnQ6ZnVuY3Rpb24oKXtpLnVuY2FjaGVOb2RlKHRo aXMpfX0pLHQuZXhwb3J0cz1hfSx7MTQzOjE0MywzMzozMyw5Ojl9XSwzNjpbZnVuY3Rpb24oZSx0 LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17dXNlQ3JlYXRlRWxlbWVudDohMCx1c2VGaWJlcjohMX07 dC5leHBvcnRzPXJ9LHt9XSwzNzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1l KDgpLG89ZSgzMyksaT17ZGFuZ2Vyb3VzbHlQcm9jZXNzQ2hpbGRyZW5VcGRhdGVzOmZ1bmN0aW9u KGUsdCl7dmFyIG49by5nZXROb2RlRnJvbUluc3RhbmNlKGUpO3IucHJvY2Vzc1VwZGF0ZXMobix0 KX19O3QuZXhwb3J0cz1pfSx7MzM6MzMsODo4fV0sMzg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0 cmljdCI7ZnVuY3Rpb24gcigpe3RoaXMuX3Jvb3ROb2RlSUQmJnAudXBkYXRlV3JhcHBlcih0aGlz KX1mdW5jdGlvbiBvKGUpe3ZhciB0PXRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzLG49dS5leGVj dXRlT25DaGFuZ2UodCxlKTtjLmFzYXAocix0aGlzKTt2YXIgbz10Lm5hbWU7aWYoInJhZGlvIj09 PXQudHlwZSYmbnVsbCE9byl7Zm9yKHZhciBhPWwuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0aGlzKSxz PWE7cy5wYXJlbnROb2RlOylzPXMucGFyZW50Tm9kZTtmb3IodmFyIHA9cy5xdWVyeVNlbGVjdG9y QWxsKCJpbnB1dFtuYW1lPSIrSlNPTi5zdHJpbmdpZnkoIiIrbykrJ11bdHlwZT0icmFkaW8iXScp LGQ9MDtkPHAubGVuZ3RoO2QrKyl7dmFyIGY9cFtkXTtpZihmIT09YSYmZi5mb3JtPT09YS5mb3Jt KXt2YXIgaD1sLmdldEluc3RhbmNlRnJvbU5vZGUoZik7aD92b2lkIDA6aSgiOTAiKSxjLmFzYXAo cixoKX19fXJldHVybiBufXZhciBpPWUoMTEzKSxhPWUoMTQzKSxzPWUoMTIpLHU9ZSgyMyksbD1l KDMzKSxjPWUoNzEpLHA9KGUoMTM3KSxlKDE0Mikse2dldEhvc3RQcm9wczpmdW5jdGlvbihlLHQp e3ZhciBuPXUuZ2V0VmFsdWUodCkscj11LmdldENoZWNrZWQodCksbz1hKHt0eXBlOnZvaWQgMCxz dGVwOnZvaWQgMCxtaW46dm9pZCAwLG1heDp2b2lkIDB9LHQse2RlZmF1bHRDaGVja2VkOnZvaWQg MCxkZWZhdWx0VmFsdWU6dm9pZCAwLHZhbHVlOm51bGwhPW4/bjplLl93cmFwcGVyU3RhdGUuaW5p dGlhbFZhbHVlLGNoZWNrZWQ6bnVsbCE9cj9yOmUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tl ZCxvbkNoYW5nZTplLl93cmFwcGVyU3RhdGUub25DaGFuZ2V9KTtyZXR1cm4gb30sbW91bnRXcmFw cGVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5kZWZhdWx0VmFsdWU7ZS5fd3JhcHBlclN0YXRlPXtp bml0aWFsQ2hlY2tlZDpudWxsIT10LmNoZWNrZWQ/dC5jaGVja2VkOnQuZGVmYXVsdENoZWNrZWQs aW5pdGlhbFZhbHVlOm51bGwhPXQudmFsdWU/dC52YWx1ZTpuLGxpc3RlbmVyczpudWxsLG9uQ2hh bmdlOm8uYmluZChlKX19LHVwZGF0ZVdyYXBwZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5fY3VycmVu dEVsZW1lbnQucHJvcHMsbj10LmNoZWNrZWQ7bnVsbCE9biYmcy5zZXRWYWx1ZUZvclByb3BlcnR5 KGwuZ2V0Tm9kZUZyb21JbnN0YW5jZShlKSwiY2hlY2tlZCIsbnx8ITEpO3ZhciByPWwuZ2V0Tm9k ZUZyb21JbnN0YW5jZShlKSxvPXUuZ2V0VmFsdWUodCk7aWYobnVsbCE9byl7dmFyIGk9IiIrbztp IT09ci52YWx1ZSYmKHIudmFsdWU9aSl9ZWxzZSBudWxsPT10LnZhbHVlJiZudWxsIT10LmRlZmF1 bHRWYWx1ZSYmci5kZWZhdWx0VmFsdWUhPT0iIit0LmRlZmF1bHRWYWx1ZSYmKHIuZGVmYXVsdFZh bHVlPSIiK3QuZGVmYXVsdFZhbHVlKSxudWxsPT10LmNoZWNrZWQmJm51bGwhPXQuZGVmYXVsdENo ZWNrZWQmJihyLmRlZmF1bHRDaGVja2VkPSEhdC5kZWZhdWx0Q2hlY2tlZCl9LHBvc3RNb3VudFdy YXBwZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5fY3VycmVudEVsZW1lbnQucHJvcHMsbj1sLmdldE5v ZGVGcm9tSW5zdGFuY2UoZSk7c3dpdGNoKHQudHlwZSl7Y2FzZSJzdWJtaXQiOmNhc2UicmVzZXQi OmJyZWFrO2Nhc2UiY29sb3IiOmNhc2UiZGF0ZSI6Y2FzZSJkYXRldGltZSI6Y2FzZSJkYXRldGlt ZS1sb2NhbCI6Y2FzZSJtb250aCI6Y2FzZSJ0aW1lIjpjYXNlIndlZWsiOm4udmFsdWU9IiIsbi52 YWx1ZT1uLmRlZmF1bHRWYWx1ZTticmVhaztkZWZhdWx0Om4udmFsdWU9bi52YWx1ZX12YXIgcj1u Lm5hbWU7IiIhPT1yJiYobi5uYW1lPSIiKSxuLmRlZmF1bHRDaGVja2VkPSFuLmRlZmF1bHRDaGVj a2VkLG4uZGVmYXVsdENoZWNrZWQ9IW4uZGVmYXVsdENoZWNrZWQsIiIhPT1yJiYobi5uYW1lPXIp fX0pO3QuZXhwb3J0cz1wfSx7MTEzOjExMywxMjoxMiwxMzc6MTM3LDE0MjoxNDIsMTQzOjE0Mywy MzoyMywzMzozMyw3MTo3MX1dLDM5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0 aW9uIHIoZSl7dmFyIHQ9IiI7cmV0dXJuIGkuQ2hpbGRyZW4uZm9yRWFjaChlLGZ1bmN0aW9uKGUp e251bGwhPWUmJigic3RyaW5nIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZT90Kz1lOnV8 fCh1PSEwKSl9KSx0fXZhciBvPWUoMTQzKSxpPWUoMTIxKSxhPWUoMzMpLHM9ZSg0MCksdT0oZSgx NDIpLCExKSxsPXttb3VudFdyYXBwZXI6ZnVuY3Rpb24oZSx0LG4pe3ZhciBvPW51bGw7aWYobnVs bCE9bil7dmFyIGk9bjsib3B0Z3JvdXAiPT09aS5fdGFnJiYoaT1pLl9ob3N0UGFyZW50KSxudWxs IT1pJiYic2VsZWN0Ij09PWkuX3RhZyYmKG89cy5nZXRTZWxlY3RWYWx1ZUNvbnRleHQoaSkpfXZh ciBhPW51bGw7aWYobnVsbCE9byl7dmFyIHU7aWYodT1udWxsIT10LnZhbHVlP3QudmFsdWUrIiI6 cih0LmNoaWxkcmVuKSxhPSExLEFycmF5LmlzQXJyYXkobykpe2Zvcih2YXIgbD0wO2w8by5sZW5n dGg7bCsrKWlmKCIiK29bbF09PT11KXthPSEwO2JyZWFrfX1lbHNlIGE9IiIrbz09PXV9ZS5fd3Jh cHBlclN0YXRlPXtzZWxlY3RlZDphfX0scG9zdE1vdW50V3JhcHBlcjpmdW5jdGlvbihlKXt2YXIg dD1lLl9jdXJyZW50RWxlbWVudC5wcm9wcztpZihudWxsIT10LnZhbHVlKXt2YXIgbj1hLmdldE5v ZGVGcm9tSW5zdGFuY2UoZSk7bi5zZXRBdHRyaWJ1dGUoInZhbHVlIix0LnZhbHVlKX19LGdldEhv c3RQcm9wczpmdW5jdGlvbihlLHQpe3ZhciBuPW8oe3NlbGVjdGVkOnZvaWQgMCxjaGlsZHJlbjp2 b2lkIDB9LHQpO251bGwhPWUuX3dyYXBwZXJTdGF0ZS5zZWxlY3RlZCYmKG4uc2VsZWN0ZWQ9ZS5f d3JhcHBlclN0YXRlLnNlbGVjdGVkKTt2YXIgaT1yKHQuY2hpbGRyZW4pO3JldHVybiBpJiYobi5j aGlsZHJlbj1pKSxufX07dC5leHBvcnRzPWx9LHsxMjE6MTIxLDE0MjoxNDIsMTQzOjE0MywzMzoz Myw0MDo0MH1dLDQwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoKXtp Zih0aGlzLl9yb290Tm9kZUlEJiZ0aGlzLl93cmFwcGVyU3RhdGUucGVuZGluZ1VwZGF0ZSl7dGhp cy5fd3JhcHBlclN0YXRlLnBlbmRpbmdVcGRhdGU9ITE7dmFyIGU9dGhpcy5fY3VycmVudEVsZW1l bnQucHJvcHMsdD1zLmdldFZhbHVlKGUpO251bGwhPXQmJm8odGhpcyxCb29sZWFuKGUubXVsdGlw bGUpLHQpfX1mdW5jdGlvbiBvKGUsdCxuKXt2YXIgcixvLGk9dS5nZXROb2RlRnJvbUluc3RhbmNl KGUpLm9wdGlvbnM7aWYodCl7Zm9yKHI9e30sbz0wO288bi5sZW5ndGg7bysrKXJbIiIrbltvXV09 ITA7Zm9yKG89MDtvPGkubGVuZ3RoO28rKyl7dmFyIGE9ci5oYXNPd25Qcm9wZXJ0eShpW29dLnZh bHVlKTtpW29dLnNlbGVjdGVkIT09YSYmKGlbb10uc2VsZWN0ZWQ9YSl9fWVsc2V7Zm9yKHI9IiIr bixvPTA7bzxpLmxlbmd0aDtvKyspaWYoaVtvXS52YWx1ZT09PXIpcmV0dXJuIHZvaWQoaVtvXS5z ZWxlY3RlZD0hMCk7aS5sZW5ndGgmJihpWzBdLnNlbGVjdGVkPSEwKX19ZnVuY3Rpb24gaShlKXt2 YXIgdD10aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcyxuPXMuZXhlY3V0ZU9uQ2hhbmdlKHQsZSk7 cmV0dXJuIHRoaXMuX3Jvb3ROb2RlSUQmJih0aGlzLl93cmFwcGVyU3RhdGUucGVuZGluZ1VwZGF0 ZT0hMCksbC5hc2FwKHIsdGhpcyksbn12YXIgYT1lKDE0Mykscz1lKDIzKSx1PWUoMzMpLGw9ZSg3 MSksYz0oZSgxNDIpLCExKSxwPXtnZXRIb3N0UHJvcHM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYSh7 fSx0LHtvbkNoYW5nZTplLl93cmFwcGVyU3RhdGUub25DaGFuZ2UsdmFsdWU6dm9pZCAwfSl9LG1v dW50V3JhcHBlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXMuZ2V0VmFsdWUodCk7ZS5fd3JhcHBlclN0 YXRlPXtwZW5kaW5nVXBkYXRlOiExLGluaXRpYWxWYWx1ZTpudWxsIT1uP246dC5kZWZhdWx0VmFs dWUsbGlzdGVuZXJzOm51bGwsb25DaGFuZ2U6aS5iaW5kKGUpLHdhc011bHRpcGxlOkJvb2xlYW4o dC5tdWx0aXBsZSl9LHZvaWQgMD09PXQudmFsdWV8fHZvaWQgMD09PXQuZGVmYXVsdFZhbHVlfHxj fHwoYz0hMCl9LGdldFNlbGVjdFZhbHVlQ29udGV4dDpmdW5jdGlvbihlKXtyZXR1cm4gZS5fd3Jh cHBlclN0YXRlLmluaXRpYWxWYWx1ZX0scG9zdFVwZGF0ZVdyYXBwZXI6ZnVuY3Rpb24oZSl7dmFy IHQ9ZS5fY3VycmVudEVsZW1lbnQucHJvcHM7ZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZT12 b2lkIDA7dmFyIG49ZS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlO2UuX3dyYXBwZXJTdGF0ZS53 YXNNdWx0aXBsZT1Cb29sZWFuKHQubXVsdGlwbGUpO3ZhciByPXMuZ2V0VmFsdWUodCk7bnVsbCE9 cj8oZS5fd3JhcHBlclN0YXRlLnBlbmRpbmdVcGRhdGU9ITEsbyhlLEJvb2xlYW4odC5tdWx0aXBs ZSkscikpOm4hPT1Cb29sZWFuKHQubXVsdGlwbGUpJiYobnVsbCE9dC5kZWZhdWx0VmFsdWU/byhl LEJvb2xlYW4odC5tdWx0aXBsZSksdC5kZWZhdWx0VmFsdWUpOm8oZSxCb29sZWFuKHQubXVsdGlw bGUpLHQubXVsdGlwbGU/W106IiIpKX19O3QuZXhwb3J0cz1wfSx7MTQyOjE0MiwxNDM6MTQzLDIz OjIzLDMzOjMzLDcxOjcxfV0sNDE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rp b24gcihlLHQsbixyKXtyZXR1cm4gZT09PW4mJnQ9PT1yfWZ1bmN0aW9uIG8oZSl7dmFyIHQ9ZG9j dW1lbnQuc2VsZWN0aW9uLG49dC5jcmVhdGVSYW5nZSgpLHI9bi50ZXh0Lmxlbmd0aCxvPW4uZHVw bGljYXRlKCk7by5tb3ZlVG9FbGVtZW50VGV4dChlKSxvLnNldEVuZFBvaW50KCJFbmRUb1N0YXJ0 IixuKTt2YXIgaT1vLnRleHQubGVuZ3RoLGE9aStyO3JldHVybntzdGFydDppLGVuZDphfX1mdW5j dGlvbiBpKGUpe3ZhciB0PXdpbmRvdy5nZXRTZWxlY3Rpb24mJndpbmRvdy5nZXRTZWxlY3Rpb24o KTtpZighdHx8MD09PXQucmFuZ2VDb3VudClyZXR1cm4gbnVsbDt2YXIgbj10LmFuY2hvck5vZGUs bz10LmFuY2hvck9mZnNldCxpPXQuZm9jdXNOb2RlLGE9dC5mb2N1c09mZnNldCxzPXQuZ2V0UmFu Z2VBdCgwKTt0cnl7cy5zdGFydENvbnRhaW5lci5ub2RlVHlwZSxzLmVuZENvbnRhaW5lci5ub2Rl VHlwZX1jYXRjaChlKXtyZXR1cm4gbnVsbH12YXIgdT1yKHQuYW5jaG9yTm9kZSx0LmFuY2hvck9m ZnNldCx0LmZvY3VzTm9kZSx0LmZvY3VzT2Zmc2V0KSxsPXU/MDpzLnRvU3RyaW5nKCkubGVuZ3Ro LGM9cy5jbG9uZVJhbmdlKCk7Yy5zZWxlY3ROb2RlQ29udGVudHMoZSksYy5zZXRFbmQocy5zdGFy dENvbnRhaW5lcixzLnN0YXJ0T2Zmc2V0KTt2YXIgcD1yKGMuc3RhcnRDb250YWluZXIsYy5zdGFy dE9mZnNldCxjLmVuZENvbnRhaW5lcixjLmVuZE9mZnNldCksZD1wPzA6Yy50b1N0cmluZygpLmxl bmd0aCxmPWQrbCxoPWRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7aC5zZXRTdGFydChuLG8pLGguc2V0 RW5kKGksYSk7dmFyIG09aC5jb2xsYXBzZWQ7cmV0dXJue3N0YXJ0Om0/ZjpkLGVuZDptP2Q6Zn19 ZnVuY3Rpb24gYShlLHQpe3ZhciBuLHIsbz1kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2Uo KS5kdXBsaWNhdGUoKTt2b2lkIDA9PT10LmVuZD8obj10LnN0YXJ0LHI9bik6dC5zdGFydD50LmVu ZD8obj10LmVuZCxyPXQuc3RhcnQpOihuPXQuc3RhcnQscj10LmVuZCksby5tb3ZlVG9FbGVtZW50 VGV4dChlKSxvLm1vdmVTdGFydCgiY2hhcmFjdGVyIixuKSxvLnNldEVuZFBvaW50KCJFbmRUb1N0 YXJ0IixvKSxvLm1vdmVFbmQoImNoYXJhY3RlciIsci1uKSxvLnNlbGVjdCgpfWZ1bmN0aW9uIHMo ZSx0KXtpZih3aW5kb3cuZ2V0U2VsZWN0aW9uKXt2YXIgbj13aW5kb3cuZ2V0U2VsZWN0aW9uKCks cj1lW2MoKV0ubGVuZ3RoLG89TWF0aC5taW4odC5zdGFydCxyKSxpPXZvaWQgMD09PXQuZW5kP286 TWF0aC5taW4odC5lbmQscik7aWYoIW4uZXh0ZW5kJiZvPmkpe3ZhciBhPWk7aT1vLG89YX12YXIg cz1sKGUsbyksdT1sKGUsaSk7aWYocyYmdSl7dmFyIHA9ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtw LnNldFN0YXJ0KHMubm9kZSxzLm9mZnNldCksbi5yZW1vdmVBbGxSYW5nZXMoKSxvPmk/KG4uYWRk UmFuZ2UocCksbi5leHRlbmQodS5ub2RlLHUub2Zmc2V0KSk6KHAuc2V0RW5kKHUubm9kZSx1Lm9m ZnNldCksbi5hZGRSYW5nZShwKSl9fX12YXIgdT1lKDEyMyksbD1lKDEwNiksYz1lKDEwNykscD11 LmNhblVzZURPTSYmInNlbGVjdGlvbiJpbiBkb2N1bWVudCYmISgiZ2V0U2VsZWN0aW9uImluIHdp bmRvdyksZD17Z2V0T2Zmc2V0czpwP286aSxzZXRPZmZzZXRzOnA/YTpzfTt0LmV4cG9ydHM9ZH0s ezEwNjoxMDYsMTA3OjEwNywxMjM6MTIzfV0sNDI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmlj dCI7dmFyIHI9ZSgxMTMpLG89ZSgxNDMpLGk9ZSg4KSxhPWUoOSkscz1lKDMzKSx1PWUoOTUpLGw9 KGUoMTM3KSxlKDExOSksZnVuY3Rpb24oZSl7dGhpcy5fY3VycmVudEVsZW1lbnQ9ZSx0aGlzLl9z dHJpbmdUZXh0PSIiK2UsdGhpcy5faG9zdE5vZGU9bnVsbCx0aGlzLl9ob3N0UGFyZW50PW51bGws dGhpcy5fZG9tSUQ9MCx0aGlzLl9tb3VudEluZGV4PTAsdGhpcy5fY2xvc2luZ0NvbW1lbnQ9bnVs bCx0aGlzLl9jb21tZW50Tm9kZXM9bnVsbH0pO28obC5wcm90b3R5cGUse21vdW50Q29tcG9uZW50 OmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPW4uX2lkQ291bnRlcisrLGk9IiByZWFjdC10ZXh0OiAi K28rIiAiLGw9IiAvcmVhY3QtdGV4dCAiO2lmKHRoaXMuX2RvbUlEPW8sdGhpcy5faG9zdFBhcmVu dD10LGUudXNlQ3JlYXRlRWxlbWVudCl7Ci12YXIgYz1uLl9vd25lckRvY3VtZW50LHA9Yy5jcmVh dGVDb21tZW50KGkpLGQ9Yy5jcmVhdGVDb21tZW50KGwpLGY9YShjLmNyZWF0ZURvY3VtZW50RnJh Z21lbnQoKSk7cmV0dXJuIGEucXVldWVDaGlsZChmLGEocCkpLHRoaXMuX3N0cmluZ1RleHQmJmEu cXVldWVDaGlsZChmLGEoYy5jcmVhdGVUZXh0Tm9kZSh0aGlzLl9zdHJpbmdUZXh0KSkpLGEucXVl dWVDaGlsZChmLGEoZCkpLHMucHJlY2FjaGVOb2RlKHRoaXMscCksdGhpcy5fY2xvc2luZ0NvbW1l bnQ9ZCxmfXZhciBoPXUodGhpcy5fc3RyaW5nVGV4dCk7cmV0dXJuIGUucmVuZGVyVG9TdGF0aWNN YXJrdXA/aDoiPCEtLSIraSsiLS0+IitoKyI8IS0tIitsKyItLT4ifSxyZWNlaXZlQ29tcG9uZW50 OmZ1bmN0aW9uKGUsdCl7aWYoZSE9PXRoaXMuX2N1cnJlbnRFbGVtZW50KXt0aGlzLl9jdXJyZW50 RWxlbWVudD1lO3ZhciBuPSIiK2U7aWYobiE9PXRoaXMuX3N0cmluZ1RleHQpe3RoaXMuX3N0cmlu Z1RleHQ9bjt2YXIgcj10aGlzLmdldEhvc3ROb2RlKCk7aS5yZXBsYWNlRGVsaW1pdGVkVGV4dChy WzBdLHJbMV0sbil9fX0sZ2V0SG9zdE5vZGU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9jb21tZW50 Tm9kZXM7aWYoZSlyZXR1cm4gZTtpZighdGhpcy5fY2xvc2luZ0NvbW1lbnQpZm9yKHZhciB0PXMu Z2V0Tm9kZUZyb21JbnN0YW5jZSh0aGlzKSxuPXQubmV4dFNpYmxpbmc7Oyl7aWYobnVsbD09bj9y KCI2NyIsdGhpcy5fZG9tSUQpOnZvaWQgMCw4PT09bi5ub2RlVHlwZSYmIiAvcmVhY3QtdGV4dCAi PT09bi5ub2RlVmFsdWUpe3RoaXMuX2Nsb3NpbmdDb21tZW50PW47YnJlYWt9bj1uLm5leHRTaWJs aW5nfXJldHVybiBlPVt0aGlzLl9ob3N0Tm9kZSx0aGlzLl9jbG9zaW5nQ29tbWVudF0sdGhpcy5f Y29tbWVudE5vZGVzPWUsZX0sdW5tb3VudENvbXBvbmVudDpmdW5jdGlvbigpe3RoaXMuX2Nsb3Np bmdDb21tZW50PW51bGwsdGhpcy5fY29tbWVudE5vZGVzPW51bGwscy51bmNhY2hlTm9kZSh0aGlz KX19KSx0LmV4cG9ydHM9bH0sezExMzoxMTMsMTE5OjExOSwxMzc6MTM3LDE0MzoxNDMsMzM6MzMs ODo4LDk6OSw5NTo5NX1dLDQzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9u IHIoKXt0aGlzLl9yb290Tm9kZUlEJiZjLnVwZGF0ZVdyYXBwZXIodGhpcyl9ZnVuY3Rpb24gbyhl KXt2YXIgdD10aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcyxuPXMuZXhlY3V0ZU9uQ2hhbmdlKHQs ZSk7cmV0dXJuIGwuYXNhcChyLHRoaXMpLG59dmFyIGk9ZSgxMTMpLGE9ZSgxNDMpLHM9ZSgyMyks dT1lKDMzKSxsPWUoNzEpLGM9KGUoMTM3KSxlKDE0Mikse2dldEhvc3RQcm9wczpmdW5jdGlvbihl LHQpe251bGwhPXQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw/aSgiOTEiKTp2b2lkIDA7dmFyIG49 YSh7fSx0LHt2YWx1ZTp2b2lkIDAsZGVmYXVsdFZhbHVlOnZvaWQgMCxjaGlsZHJlbjoiIitlLl93 cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlLG9uQ2hhbmdlOmUuX3dyYXBwZXJTdGF0ZS5vbkNoYW5n ZX0pO3JldHVybiBufSxtb3VudFdyYXBwZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj1zLmdldFZhbHVl KHQpLHI9bjtpZihudWxsPT1uKXt2YXIgYT10LmRlZmF1bHRWYWx1ZSx1PXQuY2hpbGRyZW47bnVs bCE9dSYmKG51bGwhPWE/aSgiOTIiKTp2b2lkIDAsQXJyYXkuaXNBcnJheSh1KSYmKHUubGVuZ3Ro PD0xP3ZvaWQgMDppKCI5MyIpLHU9dVswXSksYT0iIit1KSxudWxsPT1hJiYoYT0iIikscj1hfWUu X3dyYXBwZXJTdGF0ZT17aW5pdGlhbFZhbHVlOiIiK3IsbGlzdGVuZXJzOm51bGwsb25DaGFuZ2U6 by5iaW5kKGUpfX0sdXBkYXRlV3JhcHBlcjpmdW5jdGlvbihlKXt2YXIgdD1lLl9jdXJyZW50RWxl bWVudC5wcm9wcyxuPXUuZ2V0Tm9kZUZyb21JbnN0YW5jZShlKSxyPXMuZ2V0VmFsdWUodCk7aWYo bnVsbCE9cil7dmFyIG89IiIrcjtvIT09bi52YWx1ZSYmKG4udmFsdWU9byksbnVsbD09dC5kZWZh dWx0VmFsdWUmJihuLmRlZmF1bHRWYWx1ZT1vKX1udWxsIT10LmRlZmF1bHRWYWx1ZSYmKG4uZGVm YXVsdFZhbHVlPXQuZGVmYXVsdFZhbHVlKX0scG9zdE1vdW50V3JhcHBlcjpmdW5jdGlvbihlKXt2 YXIgdD11LmdldE5vZGVGcm9tSW5zdGFuY2UoZSksbj10LnRleHRDb250ZW50O249PT1lLl93cmFw cGVyU3RhdGUuaW5pdGlhbFZhbHVlJiYodC52YWx1ZT1uKX19KTt0LmV4cG9ydHM9Y30sezExMzox MTMsMTM3OjEzNywxNDI6MTQyLDE0MzoxNDMsMjM6MjMsMzM6MzMsNzE6NzF9XSw0NDpbZnVuY3Rp b24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7Il9ob3N0Tm9kZSJpbiBlP3Zv aWQgMDp1KCIzMyIpLCJfaG9zdE5vZGUiaW4gdD92b2lkIDA6dSgiMzMiKTtmb3IodmFyIG49MCxy PWU7cjtyPXIuX2hvc3RQYXJlbnQpbisrO2Zvcih2YXIgbz0wLGk9dDtpO2k9aS5faG9zdFBhcmVu dClvKys7Zm9yKDtuLW8+MDspZT1lLl9ob3N0UGFyZW50LG4tLTtmb3IoO28tbj4wOyl0PXQuX2hv c3RQYXJlbnQsby0tO2Zvcih2YXIgYT1uO2EtLTspe2lmKGU9PT10KXJldHVybiBlO2U9ZS5faG9z dFBhcmVudCx0PXQuX2hvc3RQYXJlbnR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gbyhlLHQpeyJfaG9z dE5vZGUiaW4gZT92b2lkIDA6dSgiMzUiKSwiX2hvc3ROb2RlImluIHQ/dm9pZCAwOnUoIjM1Iik7 Zm9yKDt0Oyl7aWYodD09PWUpcmV0dXJuITA7dD10Ll9ob3N0UGFyZW50fXJldHVybiExfWZ1bmN0 aW9uIGkoZSl7cmV0dXJuIl9ob3N0Tm9kZSJpbiBlP3ZvaWQgMDp1KCIzNiIpLGUuX2hvc3RQYXJl bnR9ZnVuY3Rpb24gYShlLHQsbil7Zm9yKHZhciByPVtdO2U7KXIucHVzaChlKSxlPWUuX2hvc3RQ YXJlbnQ7dmFyIG87Zm9yKG89ci5sZW5ndGg7by0tID4wOyl0KHJbb10sImNhcHR1cmVkIixuKTtm b3Iobz0wO288ci5sZW5ndGg7bysrKXQocltvXSwiYnViYmxlZCIsbil9ZnVuY3Rpb24gcyhlLHQs bixvLGkpe2Zvcih2YXIgYT1lJiZ0P3IoZSx0KTpudWxsLHM9W107ZSYmZSE9PWE7KXMucHVzaChl KSxlPWUuX2hvc3RQYXJlbnQ7Zm9yKHZhciB1PVtdO3QmJnQhPT1hOyl1LnB1c2godCksdD10Ll9o b3N0UGFyZW50O3ZhciBsO2ZvcihsPTA7bDxzLmxlbmd0aDtsKyspbihzW2xdLCJidWJibGVkIixv KTtmb3IobD11Lmxlbmd0aDtsLS0gPjA7KW4odVtsXSwiY2FwdHVyZWQiLGkpfXZhciB1PWUoMTEz KTtlKDEzNyk7dC5leHBvcnRzPXtpc0FuY2VzdG9yOm8sZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3I6 cixnZXRQYXJlbnRJbnN0YW5jZTppLHRyYXZlcnNlVHdvUGhhc2U6YSx0cmF2ZXJzZUVudGVyTGVh dmU6c319LHsxMTM6MTEzLDEzNzoxMzd9XSw0NTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0 Ijt2YXIgcj1lKDEyMSksbz1lKDMwKSxpPW87ci5hZGRvbnMmJihyLl9fU0VDUkVUX0lOSkVDVEVE X1JFQUNUX0RPTV9ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEPWkpLHQuZXhwb3J0cz1p fSx7MTIxOjEyMSwzMDozMH1dLDQ2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0 aW9uIHIoKXt0aGlzLnJlaW5pdGlhbGl6ZVRyYW5zYWN0aW9uKCl9dmFyIG89ZSgxNDMpLGk9ZSg3 MSksYT1lKDg5KSxzPWUoMTI5KSx1PXtpbml0aWFsaXplOnMsY2xvc2U6ZnVuY3Rpb24oKXtkLmlz QmF0Y2hpbmdVcGRhdGVzPSExfX0sbD17aW5pdGlhbGl6ZTpzLGNsb3NlOmkuZmx1c2hCYXRjaGVk VXBkYXRlcy5iaW5kKGkpfSxjPVtsLHVdO28oci5wcm90b3R5cGUsYSx7Z2V0VHJhbnNhY3Rpb25X cmFwcGVyczpmdW5jdGlvbigpe3JldHVybiBjfX0pO3ZhciBwPW5ldyByLGQ9e2lzQmF0Y2hpbmdV cGRhdGVzOiExLGJhdGNoZWRVcGRhdGVzOmZ1bmN0aW9uKGUsdCxuLHIsbyxpKXt2YXIgYT1kLmlz QmF0Y2hpbmdVcGRhdGVzO3JldHVybiBkLmlzQmF0Y2hpbmdVcGRhdGVzPSEwLGE/ZSh0LG4scixv LGkpOnAucGVyZm9ybShlLG51bGwsdCxuLHIsbyxpKX19O3QuZXhwb3J0cz1kfSx7MTI5OjEyOSwx NDM6MTQzLDcxOjcxLDg5Ojg5fV0sNDc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVu Y3Rpb24gcigpe3h8fCh4PSEwLHkuRXZlbnRFbWl0dGVyLmluamVjdFJlYWN0RXZlbnRMaXN0ZW5l cihnKSx5LkV2ZW50UGx1Z2luSHViLmluamVjdEV2ZW50UGx1Z2luT3JkZXIocykseS5FdmVudFBs dWdpblV0aWxzLmluamVjdENvbXBvbmVudFRyZWUoZCkseS5FdmVudFBsdWdpblV0aWxzLmluamVj dFRyZWVUcmF2ZXJzYWwoaCkseS5FdmVudFBsdWdpbkh1Yi5pbmplY3RFdmVudFBsdWdpbnNCeU5h bWUoe1NpbXBsZUV2ZW50UGx1Z2luOkUsRW50ZXJMZWF2ZUV2ZW50UGx1Z2luOnUsQ2hhbmdlRXZl bnRQbHVnaW46YSxTZWxlY3RFdmVudFBsdWdpbjpiLEJlZm9yZUlucHV0RXZlbnRQbHVnaW46aX0p LHkuSG9zdENvbXBvbmVudC5pbmplY3RHZW5lcmljQ29tcG9uZW50Q2xhc3MocCkseS5Ib3N0Q29t cG9uZW50LmluamVjdFRleHRDb21wb25lbnRDbGFzcyhtKSx5LkRPTVByb3BlcnR5LmluamVjdERP TVByb3BlcnR5Q29uZmlnKG8pLHkuRE9NUHJvcGVydHkuaW5qZWN0RE9NUHJvcGVydHlDb25maWco bCkseS5ET01Qcm9wZXJ0eS5pbmplY3RET01Qcm9wZXJ0eUNvbmZpZyhDKSx5LkVtcHR5Q29tcG9u ZW50LmluamVjdEVtcHR5Q29tcG9uZW50RmFjdG9yeShmdW5jdGlvbihlKXtyZXR1cm4gbmV3IGYo ZSl9KSx5LlVwZGF0ZXMuaW5qZWN0UmVjb25jaWxlVHJhbnNhY3Rpb24oXykseS5VcGRhdGVzLmlu amVjdEJhdGNoaW5nU3RyYXRlZ3kodikseS5Db21wb25lbnQuaW5qZWN0RW52aXJvbm1lbnQoYykp fXZhciBvPWUoMSksaT1lKDMpLGE9ZSg3KSxzPWUoMTQpLHU9ZSgxNSksbD1lKDIxKSxjPWUoMjcp LHA9ZSgzMSksZD1lKDMzKSxmPWUoMzUpLGg9ZSg0NCksbT1lKDQyKSx2PWUoNDYpLGc9ZSg1Miks eT1lKDU1KSxfPWUoNjUpLEM9ZSg3MyksYj1lKDc0KSxFPWUoNzUpLHg9ITE7dC5leHBvcnRzPXtp bmplY3Q6cn19LHsxOjEsMTQ6MTQsMTU6MTUsMjE6MjEsMjc6MjcsMzozLDMxOjMxLDMzOjMzLDM1 OjM1LDQyOjQyLDQ0OjQ0LDQ2OjQ2LDUyOjUyLDU1OjU1LDY1OjY1LDc6Nyw3Mzo3Myw3NDo3NCw3 NTo3NX1dLDQ4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPSJmdW5jdGlvbiI9 PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKXx8 NjAxMDM7dC5leHBvcnRzPXJ9LHt9XSw0OTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2 YXIgcixvPXtpbmplY3RFbXB0eUNvbXBvbmVudEZhY3Rvcnk6ZnVuY3Rpb24oZSl7cj1lfX0saT17 Y3JlYXRlOmZ1bmN0aW9uKGUpe3JldHVybiByKGUpfX07aS5pbmplY3Rpb249byx0LmV4cG9ydHM9 aX0se31dLDUwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4p e3RyeXt0KG4pfWNhdGNoKGUpe251bGw9PT1vJiYobz1lKX19dmFyIG89bnVsbCxpPXtpbnZva2VH dWFyZGVkQ2FsbGJhY2s6cixpbnZva2VHdWFyZGVkQ2FsbGJhY2tXaXRoQ2F0Y2g6cixyZXRocm93 Q2F1Z2h0RXJyb3I6ZnVuY3Rpb24oKXtpZihvKXt2YXIgZT1vO3Rocm93IG89bnVsbCxlfX19O3Qu ZXhwb3J0cz1pfSx7fV0sNTE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24g cihlKXtvLmVucXVldWVFdmVudHMoZSksby5wcm9jZXNzRXZlbnRRdWV1ZSghMSl9dmFyIG89ZSgx NiksaT17aGFuZGxlVG9wTGV2ZWw6ZnVuY3Rpb24oZSx0LG4saSl7dmFyIGE9by5leHRyYWN0RXZl bnRzKGUsdCxuLGkpO3IoYSl9fTt0LmV4cG9ydHM9aX0sezE2OjE2fV0sNTI6W2Z1bmN0aW9uKGUs dCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtmb3IoO2UuX2hvc3RQYXJlbnQ7KWU9ZS5f aG9zdFBhcmVudDt2YXIgdD1wLmdldE5vZGVGcm9tSW5zdGFuY2UoZSksbj10LnBhcmVudE5vZGU7 cmV0dXJuIHAuZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUobil9ZnVuY3Rpb24gbyhlLHQpe3Ro aXMudG9wTGV2ZWxUeXBlPWUsdGhpcy5uYXRpdmVFdmVudD10LHRoaXMuYW5jZXN0b3JzPVtdfWZ1 bmN0aW9uIGkoZSl7dmFyIHQ9ZihlLm5hdGl2ZUV2ZW50KSxuPXAuZ2V0Q2xvc2VzdEluc3RhbmNl RnJvbU5vZGUodCksbz1uO2RvIGUuYW5jZXN0b3JzLnB1c2gobyksbz1vJiZyKG8pO3doaWxlKG8p O2Zvcih2YXIgaT0wO2k8ZS5hbmNlc3RvcnMubGVuZ3RoO2krKyluPWUuYW5jZXN0b3JzW2ldLG0u X2hhbmRsZVRvcExldmVsKGUudG9wTGV2ZWxUeXBlLG4sZS5uYXRpdmVFdmVudCxmKGUubmF0aXZl RXZlbnQpKX1mdW5jdGlvbiBhKGUpe3ZhciB0PWgod2luZG93KTtlKHQpfXZhciBzPWUoMTQzKSx1 PWUoMTIyKSxsPWUoMTIzKSxjPWUoMjQpLHA9ZSgzMyksZD1lKDcxKSxmPWUoMTAyKSxoPWUoMTM0 KTtzKG8ucHJvdG90eXBlLHtkZXN0cnVjdG9yOmZ1bmN0aW9uKCl7dGhpcy50b3BMZXZlbFR5cGU9 bnVsbCx0aGlzLm5hdGl2ZUV2ZW50PW51bGwsdGhpcy5hbmNlc3RvcnMubGVuZ3RoPTB9fSksYy5h ZGRQb29saW5nVG8obyxjLnR3b0FyZ3VtZW50UG9vbGVyKTt2YXIgbT17X2VuYWJsZWQ6ITAsX2hh bmRsZVRvcExldmVsOm51bGwsV0lORE9XX0hBTkRMRTpsLmNhblVzZURPTT93aW5kb3c6bnVsbCxz ZXRIYW5kbGVUb3BMZXZlbDpmdW5jdGlvbihlKXttLl9oYW5kbGVUb3BMZXZlbD1lfSxzZXRFbmFi bGVkOmZ1bmN0aW9uKGUpe20uX2VuYWJsZWQ9ISFlfSxpc0VuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1 cm4gbS5fZW5hYmxlZH0sdHJhcEJ1YmJsZWRFdmVudDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIG4/ dS5saXN0ZW4obix0LG0uZGlzcGF0Y2hFdmVudC5iaW5kKG51bGwsZSkpOm51bGx9LHRyYXBDYXB0 dXJlZEV2ZW50OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj91LmNhcHR1cmUobix0LG0uZGlzcGF0 Y2hFdmVudC5iaW5kKG51bGwsZSkpOm51bGx9LG1vbml0b3JTY3JvbGxWYWx1ZTpmdW5jdGlvbihl KXt2YXIgdD1hLmJpbmQobnVsbCxlKTt1Lmxpc3Rlbih3aW5kb3csInNjcm9sbCIsdCl9LGRpc3Bh dGNoRXZlbnQ6ZnVuY3Rpb24oZSx0KXtpZihtLl9lbmFibGVkKXt2YXIgbj1vLmdldFBvb2xlZChl LHQpO3RyeXtkLmJhdGNoZWRVcGRhdGVzKGksbil9ZmluYWxseXtvLnJlbGVhc2Uobil9fX19O3Qu ZXhwb3J0cz1tfSx7MTAyOjEwMiwxMjI6MTIyLDEyMzoxMjMsMTM0OjEzNCwxNDM6MTQzLDI0OjI0 LDMzOjMzLDcxOjcxfV0sNTM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9e2xv Z1RvcExldmVsUmVuZGVyczohMX07dC5leHBvcnRzPXJ9LHt9XSw1NDpbZnVuY3Rpb24oZSx0LG4p eyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBzP3ZvaWQgMDphKCIxMTEiLGUudHlw ZSksbmV3IHMoZSl9ZnVuY3Rpb24gbyhlKXtyZXR1cm4gbmV3IHUoZSl9ZnVuY3Rpb24gaShlKXty ZXR1cm4gZSBpbnN0YW5jZW9mIHV9dmFyIGE9ZSgxMTMpLHM9KGUoMTM3KSxudWxsKSx1PW51bGws bD17aW5qZWN0R2VuZXJpY0NvbXBvbmVudENsYXNzOmZ1bmN0aW9uKGUpe3M9ZX0saW5qZWN0VGV4 dENvbXBvbmVudENsYXNzOmZ1bmN0aW9uKGUpe3U9ZX19LGM9e2NyZWF0ZUludGVybmFsQ29tcG9u ZW50OnIsY3JlYXRlSW5zdGFuY2VGb3JUZXh0Om8saXNUZXh0Q29tcG9uZW50OmksaW5qZWN0aW9u Omx9O3QuZXhwb3J0cz1jfSx7MTEzOjExMywxMzc6MTM3fV0sNTU6W2Z1bmN0aW9uKGUsdCxuKXsi dXNlIHN0cmljdCI7dmFyIHI9ZSgxMSksbz1lKDE2KSxpPWUoMTgpLGE9ZSgyOCkscz1lKDQ5KSx1 PWUoMjUpLGw9ZSg1NCksYz1lKDcxKSxwPXtDb21wb25lbnQ6YS5pbmplY3Rpb24sRE9NUHJvcGVy dHk6ci5pbmplY3Rpb24sRW1wdHlDb21wb25lbnQ6cy5pbmplY3Rpb24sRXZlbnRQbHVnaW5IdWI6 by5pbmplY3Rpb24sRXZlbnRQbHVnaW5VdGlsczppLmluamVjdGlvbixFdmVudEVtaXR0ZXI6dS5p bmplY3Rpb24sSG9zdENvbXBvbmVudDpsLmluamVjdGlvbixVcGRhdGVzOmMuaW5qZWN0aW9ufTt0 LmV4cG9ydHM9cH0sezExOjExLDE2OjE2LDE4OjE4LDI1OjI1LDI4OjI4LDQ5OjQ5LDU0OjU0LDcx OjcxfV0sNTY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1 cm4gaShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZSl9dmFyIG89ZSg0MSksaT1lKDEyNiksYT1l KDEzMSkscz1lKDEzMiksdT17aGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzOmZ1bmN0aW9uKGUpe3Zh ciB0PWUmJmUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gdCYmKCJp bnB1dCI9PT10JiYidGV4dCI9PT1lLnR5cGV8fCJ0ZXh0YXJlYSI9PT10fHwidHJ1ZSI9PT1lLmNv bnRlbnRFZGl0YWJsZSl9LGdldFNlbGVjdGlvbkluZm9ybWF0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9 cygpO3JldHVybntmb2N1c2VkRWxlbTplLHNlbGVjdGlvblJhbmdlOnUuaGFzU2VsZWN0aW9uQ2Fw YWJpbGl0aWVzKGUpP3UuZ2V0U2VsZWN0aW9uKGUpOm51bGx9fSxyZXN0b3JlU2VsZWN0aW9uOmZ1 bmN0aW9uKGUpe3ZhciB0PXMoKSxuPWUuZm9jdXNlZEVsZW0sbz1lLnNlbGVjdGlvblJhbmdlO3Qh PT1uJiZyKG4pJiYodS5oYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMobikmJnUuc2V0U2VsZWN0aW9u KG4sbyksYShuKSl9LGdldFNlbGVjdGlvbjpmdW5jdGlvbihlKXt2YXIgdDtpZigic2VsZWN0aW9u U3RhcnQiaW4gZSl0PXtzdGFydDplLnNlbGVjdGlvblN0YXJ0LGVuZDplLnNlbGVjdGlvbkVuZH07 ZWxzZSBpZihkb2N1bWVudC5zZWxlY3Rpb24mJmUubm9kZU5hbWUmJiJpbnB1dCI9PT1lLm5vZGVO YW1lLnRvTG93ZXJDYXNlKCkpe3ZhciBuPWRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgp O24ucGFyZW50RWxlbWVudCgpPT09ZSYmKHQ9e3N0YXJ0Oi1uLm1vdmVTdGFydCgiY2hhcmFjdGVy IiwtZS52YWx1ZS5sZW5ndGgpLGVuZDotbi5tb3ZlRW5kKCJjaGFyYWN0ZXIiLC1lLnZhbHVlLmxl bmd0aCl9KX1lbHNlIHQ9by5nZXRPZmZzZXRzKGUpO3JldHVybiB0fHx7c3RhcnQ6MCxlbmQ6MH19 LHNldFNlbGVjdGlvbjpmdW5jdGlvbihlLHQpe3ZhciBuPXQuc3RhcnQscj10LmVuZDtpZih2b2lk IDA9PT1yJiYocj1uKSwic2VsZWN0aW9uU3RhcnQiaW4gZSllLnNlbGVjdGlvblN0YXJ0PW4sZS5z ZWxlY3Rpb25FbmQ9TWF0aC5taW4ocixlLnZhbHVlLmxlbmd0aCk7ZWxzZSBpZihkb2N1bWVudC5z ZWxlY3Rpb24mJmUubm9kZU5hbWUmJiJpbnB1dCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkp e3ZhciBpPWUuY3JlYXRlVGV4dFJhbmdlKCk7aS5jb2xsYXBzZSghMCksaS5tb3ZlU3RhcnQoImNo YXJhY3RlciIsbiksaS5tb3ZlRW5kKCJjaGFyYWN0ZXIiLHItbiksaS5zZWxlY3QoKX1lbHNlIG8u c2V0T2Zmc2V0cyhlLHQpfX07dC5leHBvcnRzPXV9LHsxMjY6MTI2LDEzMToxMzEsMTMyOjEzMiw0 MTo0MX1dLDU3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXtyZW1vdmU6ZnVu Y3Rpb24oZSl7ZS5fcmVhY3RJbnRlcm5hbEluc3RhbmNlPXZvaWQgMH0sZ2V0OmZ1bmN0aW9uKGUp e3JldHVybiBlLl9yZWFjdEludGVybmFsSW5zdGFuY2V9LGhhczpmdW5jdGlvbihlKXtyZXR1cm4g dm9pZCAwIT09ZS5fcmVhY3RJbnRlcm5hbEluc3RhbmNlfSxzZXQ6ZnVuY3Rpb24oZSx0KXtlLl9y ZWFjdEludGVybmFsSW5zdGFuY2U9dH19O3QuZXhwb3J0cz1yfSx7fV0sNTg6W2Z1bmN0aW9uKGUs dCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bnVsbDt0LmV4cG9ydHM9e2RlYnVnVG9vbDpyfX0se31d LDU5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoOTIpLG89L1wvPz4vLGk9 L148XCFcLVwtLyxhPXtDSEVDS1NVTV9BVFRSX05BTUU6ImRhdGEtcmVhY3QtY2hlY2tzdW0iLGFk ZENoZWNrc3VtVG9NYXJrdXA6ZnVuY3Rpb24oZSl7dmFyIHQ9cihlKTtyZXR1cm4gaS50ZXN0KGUp P2U6ZS5yZXBsYWNlKG8sIiAiK2EuQ0hFQ0tTVU1fQVRUUl9OQU1FKyc9IicrdCsnIiQmJyl9LGNh blJldXNlTWFya3VwOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5nZXRBdHRyaWJ1dGUoYS5DSEVDS1NV TV9BVFRSX05BTUUpO249biYmcGFyc2VJbnQobiwxMCk7dmFyIG89cihlKTtyZXR1cm4gbz09PW59 fTt0LmV4cG9ydHM9YX0sezkyOjkyfV0sNjA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7 ZnVuY3Rpb24gcihlLHQpe2Zvcih2YXIgbj1NYXRoLm1pbihlLmxlbmd0aCx0Lmxlbmd0aCkscj0w O3I8bjtyKyspaWYoZS5jaGFyQXQocikhPT10LmNoYXJBdChyKSlyZXR1cm4gcjtyZXR1cm4gZS5s ZW5ndGg9PT10Lmxlbmd0aD8tMTpufWZ1bmN0aW9uIG8oZSl7cmV0dXJuIGU/ZS5ub2RlVHlwZT09 PUE/ZS5kb2N1bWVudEVsZW1lbnQ6ZS5maXJzdENoaWxkOm51bGx9ZnVuY3Rpb24gaShlKXtyZXR1 cm4gZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKEkpfHwiIn1mdW5jdGlvbiBhKGUsdCxu LHIsbyl7dmFyIGk7aWYoYi5sb2dUb3BMZXZlbFJlbmRlcnMpe3ZhciBhPWUuX2N1cnJlbnRFbGVt ZW50LnByb3BzLmNoaWxkLHM9YS50eXBlO2k9IlJlYWN0IG1vdW50OiAiKygic3RyaW5nIj09dHlw ZW9mIHM/czpzLmRpc3BsYXlOYW1lfHxzLm5hbWUpLGNvbnNvbGUudGltZShpKX12YXIgdT13Lm1v dW50Q29tcG9uZW50KGUsbixudWxsLF8oZSx0KSxvLDApO2kmJmNvbnNvbGUudGltZUVuZChpKSxl Ll9yZW5kZXJlZENvbXBvbmVudC5fdG9wTGV2ZWxXcmFwcGVyPWUsVi5fbW91bnRJbWFnZUludG9O b2RlKHUsdCxlLHIsbil9ZnVuY3Rpb24gcyhlLHQsbixyKXt2YXIgbz1rLlJlYWN0UmVjb25jaWxl VHJhbnNhY3Rpb24uZ2V0UG9vbGVkKCFuJiZDLnVzZUNyZWF0ZUVsZW1lbnQpO28ucGVyZm9ybShh LG51bGwsZSx0LG8sbixyKSxrLlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24ucmVsZWFzZShvKX1m dW5jdGlvbiB1KGUsdCxuKXtmb3Iody51bm1vdW50Q29tcG9uZW50KGUsbiksdC5ub2RlVHlwZT09 PUEmJih0PXQuZG9jdW1lbnRFbGVtZW50KTt0Lmxhc3RDaGlsZDspdC5yZW1vdmVDaGlsZCh0Lmxh c3RDaGlsZCl9ZnVuY3Rpb24gbChlKXt2YXIgdD1vKGUpO2lmKHQpe3ZhciBuPXkuZ2V0SW5zdGFu Y2VGcm9tTm9kZSh0KTtyZXR1cm4hKCFufHwhbi5faG9zdFBhcmVudCl9fWZ1bmN0aW9uIGMoZSl7 cmV0dXJuISghZXx8ZS5ub2RlVHlwZSE9PVImJmUubm9kZVR5cGUhPT1BJiZlLm5vZGVUeXBlIT09 RCl9ZnVuY3Rpb24gcChlKXt2YXIgdD1vKGUpLG49dCYmeS5nZXRJbnN0YW5jZUZyb21Ob2RlKHQp O3JldHVybiBuJiYhbi5faG9zdFBhcmVudD9uOm51bGx9ZnVuY3Rpb24gZChlKXt2YXIgdD1wKGUp O3JldHVybiB0P3QuX2hvc3RDb250YWluZXJJbmZvLl90b3BMZXZlbFdyYXBwZXI6bnVsbH12YXIg Zj1lKDExMyksaD1lKDkpLG09ZSgxMSksdj1lKDEyMSksZz1lKDI1KSx5PShlKDEyMCksZSgzMykp LF89ZSgzNCksQz1lKDM2KSxiPWUoNTMpLEU9ZSg1NykseD0oZSg1OCksZSg1OSkpLHc9ZSg2Niks VD1lKDcwKSxrPWUoNzEpLFA9ZSgxMzApLE49ZSgxMDkpLFM9KGUoMTM3KSxlKDExNSkpLE09ZSgx MTcpLEk9KGUoMTQyKSxtLklEX0FUVFJJQlVURV9OQU1FKSxPPW0uUk9PVF9BVFRSSUJVVEVfTkFN RSxSPTEsQT05LEQ9MTEsTD17fSxVPTEsRj1mdW5jdGlvbigpe3RoaXMucm9vdElEPVUrK307Ri5w cm90b3R5cGUuaXNSZWFjdENvbXBvbmVudD17fSxGLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24o KXtyZXR1cm4gdGhpcy5wcm9wcy5jaGlsZH0sRi5pc1JlYWN0VG9wTGV2ZWxXcmFwcGVyPSEwO3Zh ciBWPXtUb3BMZXZlbFdyYXBwZXI6RixfaW5zdGFuY2VzQnlSZWFjdFJvb3RJRDpMLHNjcm9sbE1v bml0b3I6ZnVuY3Rpb24oZSx0KXt0KCl9LF91cGRhdGVSb290Q29tcG9uZW50OmZ1bmN0aW9uKGUs dCxuLHIsbyl7cmV0dXJuIFYuc2Nyb2xsTW9uaXRvcihyLGZ1bmN0aW9uKCl7VC5lbnF1ZXVlRWxl bWVudEludGVybmFsKGUsdCxuKSxvJiZULmVucXVldWVDYWxsYmFja0ludGVybmFsKGUsbyl9KSxl fSxfcmVuZGVyTmV3Um9vdENvbXBvbmVudDpmdW5jdGlvbihlLHQsbixyKXtjKHQpP3ZvaWQgMDpm KCIzNyIpLGcuZW5zdXJlU2Nyb2xsVmFsdWVNb25pdG9yaW5nKCk7dmFyIG89TihlLCExKTtrLmJh dGNoZWRVcGRhdGVzKHMsbyx0LG4scik7dmFyIGk9by5faW5zdGFuY2Uucm9vdElEO3JldHVybiBM W2ldPW8sb30scmVuZGVyU3VidHJlZUludG9Db250YWluZXI6ZnVuY3Rpb24oZSx0LG4scil7cmV0 dXJuIG51bGwhPWUmJkUuaGFzKGUpP3ZvaWQgMDpmKCIzOCIpLFYuX3JlbmRlclN1YnRyZWVJbnRv Q29udGFpbmVyKGUsdCxuLHIpfSxfcmVuZGVyU3VidHJlZUludG9Db250YWluZXI6ZnVuY3Rpb24o ZSx0LG4scil7VC52YWxpZGF0ZUNhbGxiYWNrKHIsIlJlYWN0RE9NLnJlbmRlciIpLHYuaXNWYWxp ZEVsZW1lbnQodCk/dm9pZCAwOmYoIjM5Iiwic3RyaW5nIj09dHlwZW9mIHQ/IiBJbnN0ZWFkIG9m IHBhc3NpbmcgYSBzdHJpbmcgbGlrZSAnZGl2JywgcGFzcyBSZWFjdC5jcmVhdGVFbGVtZW50KCdk aXYnKSBvciA8ZGl2IC8+LiI6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/IiBJbnN0ZWFkIG9mIHBhc3Np bmcgYSBjbGFzcyBsaWtlIEZvbywgcGFzcyBSZWFjdC5jcmVhdGVFbGVtZW50KEZvbykgb3IgPEZv byAvPi4iOm51bGwhPXQmJnZvaWQgMCE9PXQucHJvcHM/IiBUaGlzIG1heSBiZSBjYXVzZWQgYnkg dW5pbnRlbnRpb25hbGx5IGxvYWRpbmcgdHdvIGluZGVwZW5kZW50IGNvcGllcyBvZiBSZWFjdC4i OiIiKTt2YXIgYSxzPXYuY3JlYXRlRWxlbWVudChGLHtjaGlsZDp0fSk7aWYoZSl7dmFyIHU9RS5n ZXQoZSk7YT11Ll9wcm9jZXNzQ2hpbGRDb250ZXh0KHUuX2NvbnRleHQpfWVsc2UgYT1QO3ZhciBj PWQobik7aWYoYyl7dmFyIHA9Yy5fY3VycmVudEVsZW1lbnQsaD1wLnByb3BzLmNoaWxkO2lmKE0o aCx0KSl7dmFyIG09Yy5fcmVuZGVyZWRDb21wb25lbnQuZ2V0UHVibGljSW5zdGFuY2UoKSxnPXIm JmZ1bmN0aW9uKCl7ci5jYWxsKG0pfTtyZXR1cm4gVi5fdXBkYXRlUm9vdENvbXBvbmVudChjLHMs YSxuLGcpLG19Vi51bm1vdW50Q29tcG9uZW50QXROb2RlKG4pfXZhciB5PW8obiksXz15JiYhIWko eSksQz1sKG4pLGI9XyYmIWMmJiFDLHg9Vi5fcmVuZGVyTmV3Um9vdENvbXBvbmVudChzLG4sYixh KS5fcmVuZGVyZWRDb21wb25lbnQuZ2V0UHVibGljSW5zdGFuY2UoKTtyZXR1cm4gciYmci5jYWxs KHgpLHh9LHJlbmRlcjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFYuX3JlbmRlclN1YnRyZWVJbnRv Q29udGFpbmVyKG51bGwsZSx0LG4pfSx1bm1vdW50Q29tcG9uZW50QXROb2RlOmZ1bmN0aW9uKGUp e2MoZSk/dm9pZCAwOmYoIjQwIik7dmFyIHQ9ZChlKTtyZXR1cm4gdD8oZGVsZXRlIExbdC5faW5z dGFuY2Uucm9vdElEXSxrLmJhdGNoZWRVcGRhdGVzKHUsdCxlLCExKSwhMCk6KGwoZSksMT09PWUu bm9kZVR5cGUmJmUuaGFzQXR0cmlidXRlKE8pLCExKX0sX21vdW50SW1hZ2VJbnRvTm9kZTpmdW5j dGlvbihlLHQsbixpLGEpe2lmKGModCk/dm9pZCAwOmYoIjQxIiksaSl7dmFyIHM9byh0KTtpZih4 LmNhblJldXNlTWFya3VwKGUscykpcmV0dXJuIHZvaWQgeS5wcmVjYWNoZU5vZGUobixzKTt2YXIg dT1zLmdldEF0dHJpYnV0ZSh4LkNIRUNLU1VNX0FUVFJfTkFNRSk7cy5yZW1vdmVBdHRyaWJ1dGUo eC5DSEVDS1NVTV9BVFRSX05BTUUpO3ZhciBsPXMub3V0ZXJIVE1MO3Muc2V0QXR0cmlidXRlKHgu Q0hFQ0tTVU1fQVRUUl9OQU1FLHUpO3ZhciBwPWUsZD1yKHAsbCksbT0iIChjbGllbnQpICIrcC5z dWJzdHJpbmcoZC0yMCxkKzIwKSsiXG4gKHNlcnZlcikgIitsLnN1YnN0cmluZyhkLTIwLGQrMjAp O3Qubm9kZVR5cGU9PT1BP2YoIjQyIixtKTp2b2lkIDB9aWYodC5ub2RlVHlwZT09PUE/ZigiNDMi KTp2b2lkIDAsYS51c2VDcmVhdGVFbGVtZW50KXtmb3IoO3QubGFzdENoaWxkOyl0LnJlbW92ZUNo aWxkKHQubGFzdENoaWxkKTtoLmluc2VydFRyZWVCZWZvcmUodCxlLG51bGwpfWVsc2UgUyh0LGUp LHkucHJlY2FjaGVOb2RlKG4sdC5maXJzdENoaWxkKX19O3QuZXhwb3J0cz1WfSx7MTA5OjEwOSwx MToxMSwxMTM6MTEzLDExNToxMTUsMTE3OjExNywxMjA6MTIwLDEyMToxMjEsMTMwOjEzMCwxMzc6 MTM3LDE0MjoxNDIsMjU6MjUsMzM6MzMsMzQ6MzQsMzY6MzYsNTM6NTMsNTc6NTcsNTg6NTgsNTk6 NTksNjY6NjYsNzA6NzAsNzE6NzEsOTo5fV0sNjE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmlj dCI7ZnVuY3Rpb24gcihlLHQsbil7cmV0dXJue3R5cGU6IklOU0VSVF9NQVJLVVAiLGNvbnRlbnQ6 ZSxmcm9tSW5kZXg6bnVsbCxmcm9tTm9kZTpudWxsLHRvSW5kZXg6bixhZnRlck5vZGU6dH19ZnVu Y3Rpb24gbyhlLHQsbil7cmV0dXJue3R5cGU6Ik1PVkVfRVhJU1RJTkciLGNvbnRlbnQ6bnVsbCxm cm9tSW5kZXg6ZS5fbW91bnRJbmRleCxmcm9tTm9kZTpkLmdldEhvc3ROb2RlKGUpLHRvSW5kZXg6 bixhZnRlck5vZGU6dH19ZnVuY3Rpb24gaShlLHQpe3JldHVybnt0eXBlOiJSRU1PVkVfTk9ERSIs Y29udGVudDpudWxsLGZyb21JbmRleDplLl9tb3VudEluZGV4LGZyb21Ob2RlOnQsdG9JbmRleDpu dWxsLGFmdGVyTm9kZTpudWxsfX1mdW5jdGlvbiBhKGUpe3JldHVybnt0eXBlOiJTRVRfTUFSS1VQ Iixjb250ZW50OmUsZnJvbUluZGV4Om51bGwsZnJvbU5vZGU6bnVsbCx0b0luZGV4Om51bGwsYWZ0 ZXJOb2RlOm51bGx9fWZ1bmN0aW9uIHMoZSl7cmV0dXJue3R5cGU6IlRFWFRfQ09OVEVOVCIsY29u dGVudDplLGZyb21JbmRleDpudWxsLGZyb21Ob2RlOm51bGwsdG9JbmRleDpudWxsLGFmdGVyTm9k ZTpudWxsfX1mdW5jdGlvbiB1KGUsdCl7cmV0dXJuIHQmJihlPWV8fFtdLGUucHVzaCh0KSksZX1m dW5jdGlvbiBsKGUsdCl7cC5wcm9jZXNzQ2hpbGRyZW5VcGRhdGVzKGUsdCl9dmFyIGM9ZSgxMTMp LHA9ZSgyOCksZD0oZSg1NyksZSg1OCksZSgxMjApLGUoNjYpKSxmPWUoMjYpLGg9KGUoMTI5KSxl KDk3KSksbT0oZSgxMzcpLHtNaXhpbjp7X3JlY29uY2lsZXJJbnN0YW50aWF0ZUNoaWxkcmVuOmZ1 bmN0aW9uKGUsdCxuKXtyZXR1cm4gZi5pbnN0YW50aWF0ZUNoaWxkcmVuKGUsdCxuKX0sX3JlY29u Y2lsZXJVcGRhdGVDaGlsZHJlbjpmdW5jdGlvbihlLHQsbixyLG8saSl7dmFyIGEscz0wO3JldHVy biBhPWgodCxzKSxmLnVwZGF0ZUNoaWxkcmVuKGUsYSxuLHIsbyx0aGlzLHRoaXMuX2hvc3RDb250 YWluZXJJbmZvLGkscyksYX0sbW91bnRDaGlsZHJlbjpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhp cy5fcmVjb25jaWxlckluc3RhbnRpYXRlQ2hpbGRyZW4oZSx0LG4pO3RoaXMuX3JlbmRlcmVkQ2hp bGRyZW49cjt2YXIgbz1bXSxpPTA7Zm9yKHZhciBhIGluIHIpaWYoci5oYXNPd25Qcm9wZXJ0eShh KSl7dmFyIHM9clthXSx1PTAsbD1kLm1vdW50Q29tcG9uZW50KHMsdCx0aGlzLHRoaXMuX2hvc3RD b250YWluZXJJbmZvLG4sdSk7cy5fbW91bnRJbmRleD1pKyssby5wdXNoKGwpfXJldHVybiBvfSx1 cGRhdGVUZXh0Q29udGVudDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9yZW5kZXJlZENoaWxkcmVu O2YudW5tb3VudENoaWxkcmVuKHQsITEpO2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHko bikmJmMoIjExOCIpO3ZhciByPVtzKGUpXTtsKHRoaXMscil9LHVwZGF0ZU1hcmt1cDpmdW5jdGlv bihlKXt2YXIgdD10aGlzLl9yZW5kZXJlZENoaWxkcmVuO2YudW5tb3VudENoaWxkcmVuKHQsITEp O2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJmMoIjExOCIpO3ZhciByPVthKGUp XTtsKHRoaXMscil9LHVwZGF0ZUNoaWxkcmVuOmZ1bmN0aW9uKGUsdCxuKXt0aGlzLl91cGRhdGVD aGlsZHJlbihlLHQsbil9LF91cGRhdGVDaGlsZHJlbjpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhp cy5fcmVuZGVyZWRDaGlsZHJlbixvPXt9LGk9W10sYT10aGlzLl9yZWNvbmNpbGVyVXBkYXRlQ2hp bGRyZW4ocixlLGksbyx0LG4pO2lmKGF8fHIpe3ZhciBzLGM9bnVsbCxwPTAsZj0wLGg9MCxtPW51 bGw7Zm9yKHMgaW4gYSlpZihhLmhhc093blByb3BlcnR5KHMpKXt2YXIgdj1yJiZyW3NdLGc9YVtz XTt2PT09Zz8oYz11KGMsdGhpcy5tb3ZlQ2hpbGQodixtLHAsZikpLGY9TWF0aC5tYXgodi5fbW91 bnRJbmRleCxmKSx2Ll9tb3VudEluZGV4PXApOih2JiYoZj1NYXRoLm1heCh2Ll9tb3VudEluZGV4 LGYpKSxjPXUoYyx0aGlzLl9tb3VudENoaWxkQXRJbmRleChnLGlbaF0sbSxwLHQsbikpLGgrKyks cCsrLG09ZC5nZXRIb3N0Tm9kZShnKX1mb3IocyBpbiBvKW8uaGFzT3duUHJvcGVydHkocykmJihj PXUoYyx0aGlzLl91bm1vdW50Q2hpbGQocltzXSxvW3NdKSkpO2MmJmwodGhpcyxjKSx0aGlzLl9y ZW5kZXJlZENoaWxkcmVuPWF9fSx1bm1vdW50Q2hpbGRyZW46ZnVuY3Rpb24oZSl7dmFyIHQ9dGhp cy5fcmVuZGVyZWRDaGlsZHJlbjtmLnVubW91bnRDaGlsZHJlbih0LGUpLHRoaXMuX3JlbmRlcmVk Q2hpbGRyZW49bnVsbH0sbW92ZUNoaWxkOmZ1bmN0aW9uKGUsdCxuLHIpe2lmKGUuX21vdW50SW5k ZXg8cilyZXR1cm4gbyhlLHQsbil9LGNyZWF0ZUNoaWxkOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4g cihuLHQsZS5fbW91bnRJbmRleCl9LHJlbW92ZUNoaWxkOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGko ZSx0KX0sX21vdW50Q2hpbGRBdEluZGV4OmZ1bmN0aW9uKGUsdCxuLHIsbyxpKXtyZXR1cm4gZS5f bW91bnRJbmRleD1yLHRoaXMuY3JlYXRlQ2hpbGQoZSxuLHQpfSxfdW5tb3VudENoaWxkOmZ1bmN0 aW9uKGUsdCl7dmFyIG49dGhpcy5yZW1vdmVDaGlsZChlLHQpO3JldHVybiBlLl9tb3VudEluZGV4 PW51bGwsbn19fSk7dC5leHBvcnRzPW19LHsxMTM6MTEzLDEyMDoxMjAsMTI5OjEyOSwxMzc6MTM3 LDI2OjI2LDI4OjI4LDU3OjU3LDU4OjU4LDY2OjY2LDk3Ojk3fV0sNjI6W2Z1bmN0aW9uKGUsdCxu KXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxMTMpLG89ZSgxMjEpLGk9KGUoMTM3KSx7SE9TVDowLENP TVBPU0lURToxLEVNUFRZOjIsZ2V0VHlwZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWV8fGU9 PT0hMT9pLkVNUFRZOm8uaXNWYWxpZEVsZW1lbnQoZSk/ImZ1bmN0aW9uIj09dHlwZW9mIGUudHlw ZT9pLkNPTVBPU0lURTppLkhPU1Q6dm9pZCByKCIyNiIsZSl9fSk7dC5leHBvcnRzPWl9LHsxMTM6 MTEzLDEyMToxMjEsMTM3OjEzN31dLDYzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1 bmN0aW9uIHIoZSl7cmV0dXJuISghZXx8ImZ1bmN0aW9uIiE9dHlwZW9mIGUuYXR0YWNoUmVmfHwi ZnVuY3Rpb24iIT10eXBlb2YgZS5kZXRhY2hSZWYpfXZhciBvPWUoMTEzKSxpPShlKDEzNykse2Fk ZENvbXBvbmVudEFzUmVmVG86ZnVuY3Rpb24oZSx0LG4pe3Iobik/dm9pZCAwOm8oIjExOSIpLG4u YXR0YWNoUmVmKHQsZSl9LHJlbW92ZUNvbXBvbmVudEFzUmVmRnJvbTpmdW5jdGlvbihlLHQsbil7 cihuKT92b2lkIDA6bygiMTIwIik7dmFyIGk9bi5nZXRQdWJsaWNJbnN0YW5jZSgpO2kmJmkucmVm c1t0XT09PWUuZ2V0UHVibGljSW5zdGFuY2UoKSYmbi5kZXRhY2hSZWYodCl9fSk7dC5leHBvcnRz PWl9LHsxMTM6MTEzLDEzNzoxMzd9XSw2NDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2 YXIgcj0iU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQiO3QuZXhw b3J0cz1yfSx7fV0sNjU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihl KXt0aGlzLnJlaW5pdGlhbGl6ZVRyYW5zYWN0aW9uKCksdGhpcy5yZW5kZXJUb1N0YXRpY01hcmt1 cD0hMSx0aGlzLnJlYWN0TW91bnRSZWFkeT1pLmdldFBvb2xlZChudWxsKSx0aGlzLnVzZUNyZWF0 ZUVsZW1lbnQ9ZX12YXIgbz1lKDE0MyksaT1lKDYpLGE9ZSgyNCkscz1lKDI1KSx1PWUoNTYpLGw9 KGUoNTgpLGUoODkpKSxjPWUoNzApLHA9e2luaXRpYWxpemU6dS5nZXRTZWxlY3Rpb25JbmZvcm1h dGlvbixjbG9zZTp1LnJlc3RvcmVTZWxlY3Rpb259LGQ9e2luaXRpYWxpemU6ZnVuY3Rpb24oKXt2 YXIgZT1zLmlzRW5hYmxlZCgpO3JldHVybiBzLnNldEVuYWJsZWQoITEpLGV9LGNsb3NlOmZ1bmN0 aW9uKGUpe3Muc2V0RW5hYmxlZChlKX19LGY9e2luaXRpYWxpemU6ZnVuY3Rpb24oKXt0aGlzLnJl YWN0TW91bnRSZWFkeS5yZXNldCgpfSxjbG9zZTpmdW5jdGlvbigpe3RoaXMucmVhY3RNb3VudFJl YWR5Lm5vdGlmeUFsbCgpfX0saD1bcCxkLGZdLG09e2dldFRyYW5zYWN0aW9uV3JhcHBlcnM6ZnVu Y3Rpb24oKXtyZXR1cm4gaH0sZ2V0UmVhY3RNb3VudFJlYWR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRo aXMucmVhY3RNb3VudFJlYWR5fSxnZXRVcGRhdGVRdWV1ZTpmdW5jdGlvbigpe3JldHVybiBjfSxj aGVja3BvaW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhY3RNb3VudFJlYWR5LmNoZWNrcG9p bnQoKX0scm9sbGJhY2s6ZnVuY3Rpb24oZSl7dGhpcy5yZWFjdE1vdW50UmVhZHkucm9sbGJhY2so ZSl9LGRlc3RydWN0b3I6ZnVuY3Rpb24oKXtpLnJlbGVhc2UodGhpcy5yZWFjdE1vdW50UmVhZHkp LHRoaXMucmVhY3RNb3VudFJlYWR5PW51bGx9fTtvKHIucHJvdG90eXBlLGwsbSksYS5hZGRQb29s aW5nVG8ociksdC5leHBvcnRzPXJ9LHsxNDM6MTQzLDI0OjI0LDI1OjI1LDU2OjU2LDU4OjU4LDY6 Niw3MDo3MCw4OTo4OX1dLDY2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9u IHIoKXtvLmF0dGFjaFJlZnModGhpcyx0aGlzLl9jdXJyZW50RWxlbWVudCl9dmFyIG89ZSg2Nyks aT0oZSg1OCksZSgxNDIpLHttb3VudENvbXBvbmVudDpmdW5jdGlvbihlLHQsbixvLGksYSl7dmFy IHM9ZS5tb3VudENvbXBvbmVudCh0LG4sbyxpLGEpO3JldHVybiBlLl9jdXJyZW50RWxlbWVudCYm bnVsbCE9ZS5fY3VycmVudEVsZW1lbnQucmVmJiZ0LmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVl dWUocixlKSxzfSxnZXRIb3N0Tm9kZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRIb3N0Tm9kZSgp fSx1bm1vdW50Q29tcG9uZW50OmZ1bmN0aW9uKGUsdCl7by5kZXRhY2hSZWZzKGUsZS5fY3VycmVu dEVsZW1lbnQpLGUudW5tb3VudENvbXBvbmVudCh0KX0scmVjZWl2ZUNvbXBvbmVudDpmdW5jdGlv bihlLHQsbixpKXt2YXIgYT1lLl9jdXJyZW50RWxlbWVudDtpZih0IT09YXx8aSE9PWUuX2NvbnRl eHQpe3ZhciBzPW8uc2hvdWxkVXBkYXRlUmVmcyhhLHQpO3MmJm8uZGV0YWNoUmVmcyhlLGEpLGUu cmVjZWl2ZUNvbXBvbmVudCh0LG4saSkscyYmZS5fY3VycmVudEVsZW1lbnQmJm51bGwhPWUuX2N1 cnJlbnRFbGVtZW50LnJlZiYmbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHIsZSl9fSxw ZXJmb3JtVXBkYXRlSWZOZWNlc3Nhcnk6ZnVuY3Rpb24oZSx0LG4pe2UuX3VwZGF0ZUJhdGNoTnVt YmVyPT09biYmZS5wZXJmb3JtVXBkYXRlSWZOZWNlc3NhcnkodCl9fSk7dC5leHBvcnRzPWl9LHsx NDI6MTQyLDU4OjU4LDY3OjY3fV0sNjc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVu Y3Rpb24gcihlLHQsbil7ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZSh0LmdldFB1YmxpY0luc3RhbmNl KCkpOmkuYWRkQ29tcG9uZW50QXNSZWZUbyh0LGUsbil9ZnVuY3Rpb24gbyhlLHQsbil7ImZ1bmN0 aW9uIj09dHlwZW9mIGU/ZShudWxsKTppLnJlbW92ZUNvbXBvbmVudEFzUmVmRnJvbSh0LGUsbil9 dmFyIGk9ZSg2MyksYT17fTthLmF0dGFjaFJlZnM9ZnVuY3Rpb24oZSx0KXtpZihudWxsIT09dCYm Im9iamVjdCI9PXR5cGVvZiB0KXt2YXIgbj10LnJlZjtudWxsIT1uJiZyKG4sZSx0Ll9vd25lcil9 fSxhLnNob3VsZFVwZGF0ZVJlZnM9ZnVuY3Rpb24oZSx0KXt2YXIgbj1udWxsLHI9bnVsbDtudWxs IT09ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYobj1lLnJlZixyPWUuX293bmVyKTt2YXIgbz1udWxs LGk9bnVsbDtyZXR1cm4gbnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdCYmKG89dC5yZWYsaT10 Ll9vd25lciksbiE9PW98fCJzdHJpbmciPT10eXBlb2YgbyYmaSE9PXJ9LGEuZGV0YWNoUmVmcz1m dW5jdGlvbihlLHQpe2lmKG51bGwhPT10JiYib2JqZWN0Ij09dHlwZW9mIHQpe3ZhciBuPXQucmVm O251bGwhPW4mJm8obixlLHQuX293bmVyKX19LHQuZXhwb3J0cz1hfSx7NjM6NjN9XSw2ODpbZnVu Y3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3RoaXMucmVpbml0aWFsaXpl VHJhbnNhY3Rpb24oKSx0aGlzLnJlbmRlclRvU3RhdGljTWFya3VwPWUsdGhpcy51c2VDcmVhdGVF bGVtZW50PSExLHRoaXMudXBkYXRlUXVldWU9bmV3IHModGhpcyl9dmFyIG89ZSgxNDMpLGk9ZSgy NCksYT1lKDg5KSxzPShlKDU4KSxlKDY5KSksdT1bXSxsPXtlbnF1ZXVlOmZ1bmN0aW9uKCl7fX0s Yz17Z2V0VHJhbnNhY3Rpb25XcmFwcGVyczpmdW5jdGlvbigpe3JldHVybiB1fSxnZXRSZWFjdE1v dW50UmVhZHk6ZnVuY3Rpb24oKXtyZXR1cm4gbH0sZ2V0VXBkYXRlUXVldWU6ZnVuY3Rpb24oKXty ZXR1cm4gdGhpcy51cGRhdGVRdWV1ZX0sZGVzdHJ1Y3RvcjpmdW5jdGlvbigpe30sY2hlY2twb2lu dDpmdW5jdGlvbigpe30scm9sbGJhY2s6ZnVuY3Rpb24oKXt9fTtvKHIucHJvdG90eXBlLGEsYyks aS5hZGRQb29saW5nVG8ociksdC5leHBvcnRzPXJ9LHsxNDM6MTQzLDI0OjI0LDU4OjU4LDY5OjY5 LDg5Ojg5fV0sNjk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQp e2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEg Y2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIG8oZSx0KXt9dmFyIGk9ZSg3MCksYT0oZSgx NDIpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtyKHRoaXMsZSksdGhpcy50cmFuc2FjdGlvbj10 fXJldHVybiBlLnByb3RvdHlwZS5pc01vdW50ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuITF9LGUucHJv dG90eXBlLmVucXVldWVDYWxsYmFjaz1mdW5jdGlvbihlLHQsbil7dGhpcy50cmFuc2FjdGlvbi5p c0luVHJhbnNhY3Rpb24oKSYmaS5lbnF1ZXVlQ2FsbGJhY2soZSx0LG4pfSxlLnByb3RvdHlwZS5l bnF1ZXVlRm9yY2VVcGRhdGU9ZnVuY3Rpb24oZSl7dGhpcy50cmFuc2FjdGlvbi5pc0luVHJhbnNh Y3Rpb24oKT9pLmVucXVldWVGb3JjZVVwZGF0ZShlKTpvKGUsImZvcmNlVXBkYXRlIil9LGUucHJv dG90eXBlLmVucXVldWVSZXBsYWNlU3RhdGU9ZnVuY3Rpb24oZSx0KXt0aGlzLnRyYW5zYWN0aW9u LmlzSW5UcmFuc2FjdGlvbigpP2kuZW5xdWV1ZVJlcGxhY2VTdGF0ZShlLHQpOm8oZSwicmVwbGFj ZVN0YXRlIil9LGUucHJvdG90eXBlLmVucXVldWVTZXRTdGF0ZT1mdW5jdGlvbihlLHQpe3RoaXMu dHJhbnNhY3Rpb24uaXNJblRyYW5zYWN0aW9uKCk/aS5lbnF1ZXVlU2V0U3RhdGUoZSx0KTpvKGUs InNldFN0YXRlIil9LGV9KCkpO3QuZXhwb3J0cz1hfSx7MTQyOjE0Miw3MDo3MH1dLDcwOltmdW5j dGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dS5lbnF1ZXVlVXBkYXRlKGUp fWZ1bmN0aW9uIG8oZSl7dmFyIHQ9dHlwZW9mIGU7aWYoIm9iamVjdCIhPT10KXJldHVybiB0O3Zh ciBuPWUuY29uc3RydWN0b3ImJmUuY29uc3RydWN0b3IubmFtZXx8dCxyPU9iamVjdC5rZXlzKGUp O3JldHVybiByLmxlbmd0aD4wJiZyLmxlbmd0aDwyMD9uKyIgKGtleXM6ICIrci5qb2luKCIsICIp KyIpIjpufWZ1bmN0aW9uIGkoZSx0KXt2YXIgbj1zLmdldChlKTtyZXR1cm4gbj9uOm51bGx9dmFy IGE9ZSgxMTMpLHM9KGUoMTIwKSxlKDU3KSksdT0oZSg1OCksZSg3MSkpLGw9KGUoMTM3KSxlKDE0 Mikse2lzTW91bnRlZDpmdW5jdGlvbihlKXt2YXIgdD1zLmdldChlKTtyZXR1cm4hIXQmJiEhdC5f cmVuZGVyZWRDb21wb25lbnR9LGVucXVldWVDYWxsYmFjazpmdW5jdGlvbihlLHQsbil7bC52YWxp ZGF0ZUNhbGxiYWNrKHQsbik7dmFyIG89aShlKTtyZXR1cm4gbz8oby5fcGVuZGluZ0NhbGxiYWNr cz9vLl9wZW5kaW5nQ2FsbGJhY2tzLnB1c2godCk6by5fcGVuZGluZ0NhbGxiYWNrcz1bdF0sdm9p ZCByKG8pKTpudWxsfSxlbnF1ZXVlQ2FsbGJhY2tJbnRlcm5hbDpmdW5jdGlvbihlLHQpe2UuX3Bl bmRpbmdDYWxsYmFja3M/ZS5fcGVuZGluZ0NhbGxiYWNrcy5wdXNoKHQpOmUuX3BlbmRpbmdDYWxs YmFja3M9W3RdLHIoZSl9LGVucXVldWVGb3JjZVVwZGF0ZTpmdW5jdGlvbihlKXt2YXIgdD1pKGUs ImZvcmNlVXBkYXRlIik7dCYmKHQuX3BlbmRpbmdGb3JjZVVwZGF0ZT0hMCxyKHQpKX0sZW5xdWV1 ZVJlcGxhY2VTdGF0ZTpmdW5jdGlvbihlLHQpe3ZhciBuPWkoZSwicmVwbGFjZVN0YXRlIik7biYm KG4uX3BlbmRpbmdTdGF0ZVF1ZXVlPVt0XSxuLl9wZW5kaW5nUmVwbGFjZVN0YXRlPSEwLHIobikp fSxlbnF1ZXVlU2V0U3RhdGU6ZnVuY3Rpb24oZSx0KXt2YXIgbj1pKGUsInNldFN0YXRlIik7aWYo bil7dmFyIG89bi5fcGVuZGluZ1N0YXRlUXVldWV8fChuLl9wZW5kaW5nU3RhdGVRdWV1ZT1bXSk7 by5wdXNoKHQpLHIobil9fSxlbnF1ZXVlRWxlbWVudEludGVybmFsOmZ1bmN0aW9uKGUsdCxuKXtl Ll9wZW5kaW5nRWxlbWVudD10LGUuX2NvbnRleHQ9bixyKGUpfSx2YWxpZGF0ZUNhbGxiYWNrOmZ1 bmN0aW9uKGUsdCl7ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU/YSgiMTIyIix0LG8oZSkpOnZvaWQg MH19KTt0LmV4cG9ydHM9bH0sezExMzoxMTMsMTIwOjEyMCwxMzc6MTM3LDE0MjoxNDIsNTc6NTcs NTg6NTgsNzE6NzF9XSw3MTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBy KCl7UC5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uJiZiP3ZvaWQgMDpjKCIxMjMiKX1mdW5jdGlv biBvKCl7dGhpcy5yZWluaXRpYWxpemVUcmFuc2FjdGlvbigpLHRoaXMuZGlydHlDb21wb25lbnRz TGVuZ3RoPW51bGwsdGhpcy5jYWxsYmFja1F1ZXVlPWQuZ2V0UG9vbGVkKCksdGhpcy5yZWNvbmNp bGVUcmFuc2FjdGlvbj1QLlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24uZ2V0UG9vbGVkKCEwKX1m dW5jdGlvbiBpKGUsdCxuLG8saSxhKXtyZXR1cm4gcigpLGIuYmF0Y2hlZFVwZGF0ZXMoZSx0LG4s byxpLGEpfWZ1bmN0aW9uIGEoZSx0KXtyZXR1cm4gZS5fbW91bnRPcmRlci10Ll9tb3VudE9yZGVy fWZ1bmN0aW9uIHMoZSl7dmFyIHQ9ZS5kaXJ0eUNvbXBvbmVudHNMZW5ndGg7dCE9PWcubGVuZ3Ro P2MoIjEyNCIsdCxnLmxlbmd0aCk6dm9pZCAwLGcuc29ydChhKSx5Kys7Zm9yKHZhciBuPTA7bjx0 O24rKyl7dmFyIHI9Z1tuXSxvPXIuX3BlbmRpbmdDYWxsYmFja3M7ci5fcGVuZGluZ0NhbGxiYWNr cz1udWxsO3ZhciBpO2lmKGgubG9nVG9wTGV2ZWxSZW5kZXJzKXt2YXIgcz1yO3IuX2N1cnJlbnRF bGVtZW50LnR5cGUuaXNSZWFjdFRvcExldmVsV3JhcHBlciYmKHM9ci5fcmVuZGVyZWRDb21wb25l bnQpLGk9IlJlYWN0IHVwZGF0ZTogIitzLmdldE5hbWUoKSxjb25zb2xlLnRpbWUoaSl9aWYobS5w ZXJmb3JtVXBkYXRlSWZOZWNlc3NhcnkocixlLnJlY29uY2lsZVRyYW5zYWN0aW9uLHkpLGkmJmNv bnNvbGUudGltZUVuZChpKSxvKWZvcih2YXIgdT0wO3U8by5sZW5ndGg7dSsrKWUuY2FsbGJhY2tR dWV1ZS5lbnF1ZXVlKG9bdV0sci5nZXRQdWJsaWNJbnN0YW5jZSgpKX19ZnVuY3Rpb24gdShlKXty ZXR1cm4gcigpLGIuaXNCYXRjaGluZ1VwZGF0ZXM/KGcucHVzaChlKSx2b2lkKG51bGw9PWUuX3Vw ZGF0ZUJhdGNoTnVtYmVyJiYoZS5fdXBkYXRlQmF0Y2hOdW1iZXI9eSsxKSkpOnZvaWQgYi5iYXRj aGVkVXBkYXRlcyh1LGUpfWZ1bmN0aW9uIGwoZSx0KXtiLmlzQmF0Y2hpbmdVcGRhdGVzP3ZvaWQg MDpjKCIxMjUiKSxfLmVucXVldWUoZSx0KSxDPSEwfXZhciBjPWUoMTEzKSxwPWUoMTQzKSxkPWUo NiksZj1lKDI0KSxoPWUoNTMpLG09ZSg2Niksdj1lKDg5KSxnPShlKDEzNyksW10pLHk9MCxfPWQu Z2V0UG9vbGVkKCksQz0hMSxiPW51bGwsRT17aW5pdGlhbGl6ZTpmdW5jdGlvbigpe3RoaXMuZGly dHlDb21wb25lbnRzTGVuZ3RoPWcubGVuZ3RofSxjbG9zZTpmdW5jdGlvbigpe3RoaXMuZGlydHlD b21wb25lbnRzTGVuZ3RoIT09Zy5sZW5ndGg/KGcuc3BsaWNlKDAsdGhpcy5kaXJ0eUNvbXBvbmVu dHNMZW5ndGgpLFQoKSk6Zy5sZW5ndGg9MH19LHg9e2luaXRpYWxpemU6ZnVuY3Rpb24oKXt0aGlz LmNhbGxiYWNrUXVldWUucmVzZXQoKX0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLmNhbGxiYWNrUXVl dWUubm90aWZ5QWxsKCl9fSx3PVtFLHhdO3Aoby5wcm90b3R5cGUsdix7Z2V0VHJhbnNhY3Rpb25X cmFwcGVyczpmdW5jdGlvbigpe3JldHVybiB3fSxkZXN0cnVjdG9yOmZ1bmN0aW9uKCl7dGhpcy5k aXJ0eUNvbXBvbmVudHNMZW5ndGg9bnVsbCxkLnJlbGVhc2UodGhpcy5jYWxsYmFja1F1ZXVlKSx0 aGlzLmNhbGxiYWNrUXVldWU9bnVsbCxQLlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24ucmVsZWFz ZSh0aGlzLnJlY29uY2lsZVRyYW5zYWN0aW9uKSx0aGlzLnJlY29uY2lsZVRyYW5zYWN0aW9uPW51 bGx9LHBlcmZvcm06ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2LnBlcmZvcm0uY2FsbCh0aGlzLHRo aXMucmVjb25jaWxlVHJhbnNhY3Rpb24ucGVyZm9ybSx0aGlzLnJlY29uY2lsZVRyYW5zYWN0aW9u LGUsdCxuKX19KSxmLmFkZFBvb2xpbmdUbyhvKTt2YXIgVD1mdW5jdGlvbigpe2Zvcig7Zy5sZW5n dGh8fEM7KXtpZihnLmxlbmd0aCl7dmFyIGU9by5nZXRQb29sZWQoKTtlLnBlcmZvcm0ocyxudWxs LGUpLG8ucmVsZWFzZShlKX1pZihDKXtDPSExO3ZhciB0PV87Xz1kLmdldFBvb2xlZCgpLHQubm90 aWZ5QWxsKCksZC5yZWxlYXNlKHQpfX19LGs9e2luamVjdFJlY29uY2lsZVRyYW5zYWN0aW9uOmZ1 bmN0aW9uKGUpe2U/dm9pZCAwOmMoIjEyNiIpLFAuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbj1l fSxpbmplY3RCYXRjaGluZ1N0cmF0ZWd5OmZ1bmN0aW9uKGUpe2U/dm9pZCAwOmMoIjEyNyIpLCJm dW5jdGlvbiIhPXR5cGVvZiBlLmJhdGNoZWRVcGRhdGVzP2MoIjEyOCIpOnZvaWQgMCwiYm9vbGVh biIhPXR5cGVvZiBlLmlzQmF0Y2hpbmdVcGRhdGVzP2MoIjEyOSIpOnZvaWQgMCxiPWV9fSxQPXtS ZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uOm51bGwsYmF0Y2hlZFVwZGF0ZXM6aSxlbnF1ZXVlVXBk YXRlOnUsZmx1c2hCYXRjaGVkVXBkYXRlczpULGluamVjdGlvbjprLGFzYXA6bH07dC5leHBvcnRz PVB9LHsxMTM6MTEzLDEzNzoxMzcsMTQzOjE0MywyNDoyNCw1Mzo1Myw2OjYsNjY6NjYsODk6ODl9 XSw3MjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9IjE1LjQuMiJ9LHt9 XSw3MzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17eGxpbms6Imh0dHA6Ly93 d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFt ZXNwYWNlIn0sbz17YWNjZW50SGVpZ2h0OiJhY2NlbnQtaGVpZ2h0IixhY2N1bXVsYXRlOjAsYWRk aXRpdmU6MCxhbGlnbm1lbnRCYXNlbGluZToiYWxpZ25tZW50LWJhc2VsaW5lIixhbGxvd1Jlb3Jk ZXI6ImFsbG93UmVvcmRlciIsYWxwaGFiZXRpYzowLGFtcGxpdHVkZTowLGFyYWJpY0Zvcm06ImFy YWJpYy1mb3JtIixhc2NlbnQ6MCxhdHRyaWJ1dGVOYW1lOiJhdHRyaWJ1dGVOYW1lIixhdHRyaWJ1 dGVUeXBlOiJhdHRyaWJ1dGVUeXBlIixhdXRvUmV2ZXJzZToiYXV0b1JldmVyc2UiLGF6aW11dGg6 MCxiYXNlRnJlcXVlbmN5OiJiYXNlRnJlcXVlbmN5IixiYXNlUHJvZmlsZToiYmFzZVByb2ZpbGUi LGJhc2VsaW5lU2hpZnQ6ImJhc2VsaW5lLXNoaWZ0IixiYm94OjAsYmVnaW46MCxiaWFzOjAsYnk6 MCxjYWxjTW9kZToiY2FsY01vZGUiLGNhcEhlaWdodDoiY2FwLWhlaWdodCIsY2xpcDowLGNsaXBQ YXRoOiJjbGlwLXBhdGgiLGNsaXBSdWxlOiJjbGlwLXJ1bGUiLGNsaXBQYXRoVW5pdHM6ImNsaXBQ YXRoVW5pdHMiLGNvbG9ySW50ZXJwb2xhdGlvbjoiY29sb3ItaW50ZXJwb2xhdGlvbiIsY29sb3JJ bnRlcnBvbGF0aW9uRmlsdGVyczoiY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzIixjb2xvclBy b2ZpbGU6ImNvbG9yLXByb2ZpbGUiLGNvbG9yUmVuZGVyaW5nOiJjb2xvci1yZW5kZXJpbmciLGNv bnRlbnRTY3JpcHRUeXBlOiJjb250ZW50U2NyaXB0VHlwZSIsY29udGVudFN0eWxlVHlwZToiY29u dGVudFN0eWxlVHlwZSIsY3Vyc29yOjAsY3g6MCxjeTowLGQ6MCxkZWNlbGVyYXRlOjAsZGVzY2Vu dDowLGRpZmZ1c2VDb25zdGFudDoiZGlmZnVzZUNvbnN0YW50IixkaXJlY3Rpb246MCxkaXNwbGF5 OjAsZGl2aXNvcjowLGRvbWluYW50QmFzZWxpbmU6ImRvbWluYW50LWJhc2VsaW5lIixkdXI6MCxk eDowLGR5OjAsZWRnZU1vZGU6ImVkZ2VNb2RlIixlbGV2YXRpb246MCxlbmFibGVCYWNrZ3JvdW5k OiJlbmFibGUtYmFja2dyb3VuZCIsZW5kOjAsZXhwb25lbnQ6MCxleHRlcm5hbFJlc291cmNlc1Jl cXVpcmVkOiJleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkIixmaWxsOjAsZmlsbE9wYWNpdHk6ImZp bGwtb3BhY2l0eSIsZmlsbFJ1bGU6ImZpbGwtcnVsZSIsZmlsdGVyOjAsZmlsdGVyUmVzOiJmaWx0 ZXJSZXMiLGZpbHRlclVuaXRzOiJmaWx0ZXJVbml0cyIsZmxvb2RDb2xvcjoiZmxvb2QtY29sb3Ii LGZsb29kT3BhY2l0eToiZmxvb2Qtb3BhY2l0eSIsZm9jdXNhYmxlOjAsZm9udEZhbWlseToiZm9u dC1mYW1pbHkiLGZvbnRTaXplOiJmb250LXNpemUiLGZvbnRTaXplQWRqdXN0OiJmb250LXNpemUt YWRqdXN0Iixmb250U3RyZXRjaDoiZm9udC1zdHJldGNoIixmb250U3R5bGU6ImZvbnQtc3R5bGUi LGZvbnRWYXJpYW50OiJmb250LXZhcmlhbnQiLGZvbnRXZWlnaHQ6ImZvbnQtd2VpZ2h0Iixmb3Jt YXQ6MCxmcm9tOjAsZng6MCxmeTowLGcxOjAsZzI6MCxnbHlwaE5hbWU6ImdseXBoLW5hbWUiLGds eXBoT3JpZW50YXRpb25Ib3Jpem9udGFsOiJnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIixn bHlwaE9yaWVudGF0aW9uVmVydGljYWw6ImdseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsIixnbHlw aFJlZjoiZ2x5cGhSZWYiLGdyYWRpZW50VHJhbnNmb3JtOiJncmFkaWVudFRyYW5zZm9ybSIsZ3Jh ZGllbnRVbml0czoiZ3JhZGllbnRVbml0cyIsaGFuZ2luZzowLGhvcml6QWR2WDoiaG9yaXotYWR2 LXgiLGhvcml6T3JpZ2luWDoiaG9yaXotb3JpZ2luLXgiLGlkZW9ncmFwaGljOjAsaW1hZ2VSZW5k ZXJpbmc6ImltYWdlLXJlbmRlcmluZyIsaW46MCxpbjI6MCxpbnRlcmNlcHQ6MCxrOjAsazE6MCxr MjowLGszOjAsazQ6MCxrZXJuZWxNYXRyaXg6Imtlcm5lbE1hdHJpeCIsa2VybmVsVW5pdExlbmd0 aDoia2VybmVsVW5pdExlbmd0aCIsa2VybmluZzowLGtleVBvaW50czoia2V5UG9pbnRzIixrZXlT cGxpbmVzOiJrZXlTcGxpbmVzIixrZXlUaW1lczoia2V5VGltZXMiLGxlbmd0aEFkanVzdDoibGVu Z3RoQWRqdXN0IixsZXR0ZXJTcGFjaW5nOiJsZXR0ZXItc3BhY2luZyIsbGlnaHRpbmdDb2xvcjoi bGlnaHRpbmctY29sb3IiLGxpbWl0aW5nQ29uZUFuZ2xlOiJsaW1pdGluZ0NvbmVBbmdsZSIsbG9j YWw6MCxtYXJrZXJFbmQ6Im1hcmtlci1lbmQiLG1hcmtlck1pZDoibWFya2VyLW1pZCIsbWFya2Vy U3RhcnQ6Im1hcmtlci1zdGFydCIsbWFya2VySGVpZ2h0OiJtYXJrZXJIZWlnaHQiLG1hcmtlclVu aXRzOiJtYXJrZXJVbml0cyIsbWFya2VyV2lkdGg6Im1hcmtlcldpZHRoIixtYXNrOjAsbWFza0Nv bnRlbnRVbml0czoibWFza0NvbnRlbnRVbml0cyIsbWFza1VuaXRzOiJtYXNrVW5pdHMiLG1hdGhl bWF0aWNhbDowLG1vZGU6MCxudW1PY3RhdmVzOiJudW1PY3RhdmVzIixvZmZzZXQ6MCxvcGFjaXR5 OjAsb3BlcmF0b3I6MCxvcmRlcjowLG9yaWVudDowLG9yaWVudGF0aW9uOjAsb3JpZ2luOjAsb3Zl cmZsb3c6MCxvdmVybGluZVBvc2l0aW9uOiJvdmVybGluZS1wb3NpdGlvbiIsb3ZlcmxpbmVUaGlj a25lc3M6Im92ZXJsaW5lLXRoaWNrbmVzcyIscGFpbnRPcmRlcjoicGFpbnQtb3JkZXIiLHBhbm9z ZTE6InBhbm9zZS0xIixwYXRoTGVuZ3RoOiJwYXRoTGVuZ3RoIixwYXR0ZXJuQ29udGVudFVuaXRz OiJwYXR0ZXJuQ29udGVudFVuaXRzIixwYXR0ZXJuVHJhbnNmb3JtOiJwYXR0ZXJuVHJhbnNmb3Jt IixwYXR0ZXJuVW5pdHM6InBhdHRlcm5Vbml0cyIscG9pbnRlckV2ZW50czoicG9pbnRlci1ldmVu dHMiLHBvaW50czowLHBvaW50c0F0WDoicG9pbnRzQXRYIixwb2ludHNBdFk6InBvaW50c0F0WSIs cG9pbnRzQXRaOiJwb2ludHNBdFoiLHByZXNlcnZlQWxwaGE6InByZXNlcnZlQWxwaGEiLHByZXNl cnZlQXNwZWN0UmF0aW86InByZXNlcnZlQXNwZWN0UmF0aW8iLHByaW1pdGl2ZVVuaXRzOiJwcmlt aXRpdmVVbml0cyIscjowLHJhZGl1czowLHJlZlg6InJlZlgiLHJlZlk6InJlZlkiLHJlbmRlcmlu Z0ludGVudDoicmVuZGVyaW5nLWludGVudCIscmVwZWF0Q291bnQ6InJlcGVhdENvdW50IixyZXBl YXREdXI6InJlcGVhdER1ciIscmVxdWlyZWRFeHRlbnNpb25zOiJyZXF1aXJlZEV4dGVuc2lvbnMi LHJlcXVpcmVkRmVhdHVyZXM6InJlcXVpcmVkRmVhdHVyZXMiLHJlc3RhcnQ6MCxyZXN1bHQ6MCxy b3RhdGU6MCxyeDowLHJ5OjAsc2NhbGU6MCxzZWVkOjAsc2hhcGVSZW5kZXJpbmc6InNoYXBlLXJl bmRlcmluZyIsc2xvcGU6MCxzcGFjaW5nOjAsc3BlY3VsYXJDb25zdGFudDoic3BlY3VsYXJDb25z dGFudCIsc3BlY3VsYXJFeHBvbmVudDoic3BlY3VsYXJFeHBvbmVudCIsc3BlZWQ6MCxzcHJlYWRN ZXRob2Q6InNwcmVhZE1ldGhvZCIsc3RhcnRPZmZzZXQ6InN0YXJ0T2Zmc2V0IixzdGREZXZpYXRp b246InN0ZERldmlhdGlvbiIsc3RlbWg6MCxzdGVtdjowLHN0aXRjaFRpbGVzOiJzdGl0Y2hUaWxl cyIsc3RvcENvbG9yOiJzdG9wLWNvbG9yIixzdG9wT3BhY2l0eToic3RvcC1vcGFjaXR5IixzdHJp a2V0aHJvdWdoUG9zaXRpb246InN0cmlrZXRocm91Z2gtcG9zaXRpb24iLHN0cmlrZXRocm91Z2hU aGlja25lc3M6InN0cmlrZXRocm91Z2gtdGhpY2tuZXNzIixzdHJpbmc6MCxzdHJva2U6MCxzdHJv a2VEYXNoYXJyYXk6InN0cm9rZS1kYXNoYXJyYXkiLHN0cm9rZURhc2hvZmZzZXQ6InN0cm9rZS1k YXNob2Zmc2V0IixzdHJva2VMaW5lY2FwOiJzdHJva2UtbGluZWNhcCIsc3Ryb2tlTGluZWpvaW46 InN0cm9rZS1saW5lam9pbiIsc3Ryb2tlTWl0ZXJsaW1pdDoic3Ryb2tlLW1pdGVybGltaXQiLHN0 cm9rZU9wYWNpdHk6InN0cm9rZS1vcGFjaXR5IixzdHJva2VXaWR0aDoic3Ryb2tlLXdpZHRoIixz dXJmYWNlU2NhbGU6InN1cmZhY2VTY2FsZSIsc3lzdGVtTGFuZ3VhZ2U6InN5c3RlbUxhbmd1YWdl Iix0YWJsZVZhbHVlczoidGFibGVWYWx1ZXMiLHRhcmdldFg6InRhcmdldFgiLHRhcmdldFk6InRh cmdldFkiLHRleHRBbmNob3I6InRleHQtYW5jaG9yIix0ZXh0RGVjb3JhdGlvbjoidGV4dC1kZWNv cmF0aW9uIix0ZXh0UmVuZGVyaW5nOiJ0ZXh0LXJlbmRlcmluZyIsdGV4dExlbmd0aDoidGV4dExl bmd0aCIsdG86MCx0cmFuc2Zvcm06MCx1MTowLHUyOjAsdW5kZXJsaW5lUG9zaXRpb246InVuZGVy bGluZS1wb3NpdGlvbiIsdW5kZXJsaW5lVGhpY2tuZXNzOiJ1bmRlcmxpbmUtdGhpY2tuZXNzIix1 bmljb2RlOjAsdW5pY29kZUJpZGk6InVuaWNvZGUtYmlkaSIsdW5pY29kZVJhbmdlOiJ1bmljb2Rl LXJhbmdlIix1bml0c1BlckVtOiJ1bml0cy1wZXItZW0iLHZBbHBoYWJldGljOiJ2LWFscGhhYmV0 aWMiLHZIYW5naW5nOiJ2LWhhbmdpbmciLHZJZGVvZ3JhcGhpYzoidi1pZGVvZ3JhcGhpYyIsdk1h dGhlbWF0aWNhbDoidi1tYXRoZW1hdGljYWwiLHZhbHVlczowLHZlY3RvckVmZmVjdDoidmVjdG9y LWVmZmVjdCIsdmVyc2lvbjowLHZlcnRBZHZZOiJ2ZXJ0LWFkdi15Iix2ZXJ0T3JpZ2luWDoidmVy dC1vcmlnaW4teCIsdmVydE9yaWdpblk6InZlcnQtb3JpZ2luLXkiLHZpZXdCb3g6InZpZXdCb3gi LHZpZXdUYXJnZXQ6InZpZXdUYXJnZXQiLHZpc2liaWxpdHk6MCx3aWR0aHM6MCx3b3JkU3BhY2lu Zzoid29yZC1zcGFjaW5nIix3cml0aW5nTW9kZToid3JpdGluZy1tb2RlIix4OjAseEhlaWdodDoi eC1oZWlnaHQiLHgxOjAseDI6MCx4Q2hhbm5lbFNlbGVjdG9yOiJ4Q2hhbm5lbFNlbGVjdG9yIix4 bGlua0FjdHVhdGU6InhsaW5rOmFjdHVhdGUiLHhsaW5rQXJjcm9sZToieGxpbms6YXJjcm9sZSIs eGxpbmtIcmVmOiJ4bGluazpocmVmIix4bGlua1JvbGU6InhsaW5rOnJvbGUiLHhsaW5rU2hvdzoi eGxpbms6c2hvdyIseGxpbmtUaXRsZToieGxpbms6dGl0bGUiLHhsaW5rVHlwZToieGxpbms6dHlw ZSIseG1sQmFzZToieG1sOmJhc2UiLHhtbG5zOjAseG1sbnNYbGluazoieG1sbnM6eGxpbmsiLHht bExhbmc6InhtbDpsYW5nIix4bWxTcGFjZToieG1sOnNwYWNlIix5OjAseTE6MCx5MjowLHlDaGFu bmVsU2VsZWN0b3I6InlDaGFubmVsU2VsZWN0b3IiLHo6MCx6b29tQW5kUGFuOiJ6b29tQW5kUGFu In0saT17UHJvcGVydGllczp7fSxET01BdHRyaWJ1dGVOYW1lc3BhY2VzOnt4bGlua0FjdHVhdGU6 ci54bGluayx4bGlua0FyY3JvbGU6ci54bGluayx4bGlua0hyZWY6ci54bGluayx4bGlua1JvbGU6 ci54bGluayx4bGlua1Nob3c6ci54bGluayx4bGlua1RpdGxlOnIueGxpbmsseGxpbmtUeXBlOnIu eGxpbmsseG1sQmFzZTpyLnhtbCx4bWxMYW5nOnIueG1sLHhtbFNwYWNlOnIueG1sfSxET01BdHRy aWJ1dGVOYW1lczp7fX07T2JqZWN0LmtleXMobykuZm9yRWFjaChmdW5jdGlvbihlKXtpLlByb3Bl cnRpZXNbZV09MCxvW2VdJiYoaS5ET01BdHRyaWJ1dGVOYW1lc1tlXT1vW2VdKX0pLHQuZXhwb3J0 cz1pfSx7fV0sNzQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtp Zigic2VsZWN0aW9uU3RhcnQiaW4gZSYmdS5oYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMoZSkpcmV0 dXJue3N0YXJ0OmUuc2VsZWN0aW9uU3RhcnQsZW5kOmUuc2VsZWN0aW9uRW5kfTtpZih3aW5kb3cu Z2V0U2VsZWN0aW9uKXt2YXIgdD13aW5kb3cuZ2V0U2VsZWN0aW9uKCk7cmV0dXJue2FuY2hvck5v ZGU6dC5hbmNob3JOb2RlLGFuY2hvck9mZnNldDp0LmFuY2hvck9mZnNldCxmb2N1c05vZGU6dC5m b2N1c05vZGUsZm9jdXNPZmZzZXQ6dC5mb2N1c09mZnNldH19aWYoZG9jdW1lbnQuc2VsZWN0aW9u KXt2YXIgbj1kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTtyZXR1cm57cGFyZW50RWxl bWVudDpuLnBhcmVudEVsZW1lbnQoKSx0ZXh0Om4udGV4dCx0b3A6bi5ib3VuZGluZ1RvcCxsZWZ0 Om4uYm91bmRpbmdMZWZ0fX19ZnVuY3Rpb24gbyhlLHQpe2lmKHl8fG51bGw9PW18fG0hPT1jKCkp cmV0dXJuIG51bGw7dmFyIG49cihtKTtpZighZ3x8IWQoZyxuKSl7Zz1uO3ZhciBvPWwuZ2V0UG9v bGVkKGguc2VsZWN0LHYsZSx0KTtyZXR1cm4gby50eXBlPSJzZWxlY3QiLG8udGFyZ2V0PW0saS5h Y2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKG8pLG99cmV0dXJuIG51bGx9dmFyIGk9ZSgxOSks YT1lKDEyMykscz1lKDMzKSx1PWUoNTYpLGw9ZSg4MCksYz1lKDEzMikscD1lKDExMSksZD1lKDE0 MSksZj1hLmNhblVzZURPTSYmImRvY3VtZW50TW9kZSJpbiBkb2N1bWVudCYmZG9jdW1lbnQuZG9j dW1lbnRNb2RlPD0xMSxoPXtzZWxlY3Q6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVk OiJvblNlbGVjdCIsY2FwdHVyZWQ6Im9uU2VsZWN0Q2FwdHVyZSJ9LGRlcGVuZGVuY2llczpbInRv cEJsdXIiLCJ0b3BDb250ZXh0TWVudSIsInRvcEZvY3VzIiwidG9wS2V5RG93biIsInRvcEtleVVw IiwidG9wTW91c2VEb3duIiwidG9wTW91c2VVcCIsInRvcFNlbGVjdGlvbkNoYW5nZSJdfX0sbT1u dWxsLHY9bnVsbCxnPW51bGwseT0hMSxfPSExLEM9e2V2ZW50VHlwZXM6aCxleHRyYWN0RXZlbnRz OmZ1bmN0aW9uKGUsdCxuLHIpe2lmKCFfKXJldHVybiBudWxsO3ZhciBpPXQ/cy5nZXROb2RlRnJv bUluc3RhbmNlKHQpOndpbmRvdztzd2l0Y2goZSl7Y2FzZSJ0b3BGb2N1cyI6KHAoaSl8fCJ0cnVl Ij09PWkuY29udGVudEVkaXRhYmxlKSYmKG09aSx2PXQsZz1udWxsKTticmVhaztjYXNlInRvcEJs dXIiOm09bnVsbCx2PW51bGwsZz1udWxsO2JyZWFrO2Nhc2UidG9wTW91c2VEb3duIjp5PSEwO2Jy ZWFrO2Nhc2UidG9wQ29udGV4dE1lbnUiOmNhc2UidG9wTW91c2VVcCI6cmV0dXJuIHk9ITEsCi1v KG4scik7Y2FzZSJ0b3BTZWxlY3Rpb25DaGFuZ2UiOmlmKGYpYnJlYWs7Y2FzZSJ0b3BLZXlEb3du IjpjYXNlInRvcEtleVVwIjpyZXR1cm4gbyhuLHIpfXJldHVybiBudWxsfSxkaWRQdXRMaXN0ZW5l cjpmdW5jdGlvbihlLHQsbil7Im9uU2VsZWN0Ij09PXQmJihfPSEwKX19O3QuZXhwb3J0cz1DfSx7 MTExOjExMSwxMjM6MTIzLDEzMjoxMzIsMTQxOjE0MSwxOToxOSwzMzozMyw1Njo1Niw4MDo4MH1d LDc1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIi4i K2UuX3Jvb3ROb2RlSUR9ZnVuY3Rpb24gbyhlKXtyZXR1cm4iYnV0dG9uIj09PWV8fCJpbnB1dCI9 PT1lfHwic2VsZWN0Ij09PWV8fCJ0ZXh0YXJlYSI9PT1lfXZhciBpPWUoMTEzKSxhPWUoMTIyKSxz PWUoMTkpLHU9ZSgzMyksbD1lKDc2KSxjPWUoNzcpLHA9ZSg4MCksZD1lKDgxKSxmPWUoODMpLGg9 ZSg4NCksbT1lKDc5KSx2PWUoODUpLGc9ZSg4NikseT1lKDg3KSxfPWUoODgpLEM9ZSgxMjkpLGI9 ZSg5OSksRT0oZSgxMzcpLHt9KSx4PXt9O1siYWJvcnQiLCJhbmltYXRpb25FbmQiLCJhbmltYXRp b25JdGVyYXRpb24iLCJhbmltYXRpb25TdGFydCIsImJsdXIiLCJjYW5QbGF5IiwiY2FuUGxheVRo cm91Z2giLCJjbGljayIsImNvbnRleHRNZW51IiwiY29weSIsImN1dCIsImRvdWJsZUNsaWNrIiwi ZHJhZyIsImRyYWdFbmQiLCJkcmFnRW50ZXIiLCJkcmFnRXhpdCIsImRyYWdMZWF2ZSIsImRyYWdP dmVyIiwiZHJhZ1N0YXJ0IiwiZHJvcCIsImR1cmF0aW9uQ2hhbmdlIiwiZW1wdGllZCIsImVuY3J5 cHRlZCIsImVuZGVkIiwiZXJyb3IiLCJmb2N1cyIsImlucHV0IiwiaW52YWxpZCIsImtleURvd24i LCJrZXlQcmVzcyIsImtleVVwIiwibG9hZCIsImxvYWRlZERhdGEiLCJsb2FkZWRNZXRhZGF0YSIs ImxvYWRTdGFydCIsIm1vdXNlRG93biIsIm1vdXNlTW92ZSIsIm1vdXNlT3V0IiwibW91c2VPdmVy IiwibW91c2VVcCIsInBhc3RlIiwicGF1c2UiLCJwbGF5IiwicGxheWluZyIsInByb2dyZXNzIiwi cmF0ZUNoYW5nZSIsInJlc2V0Iiwic2Nyb2xsIiwic2Vla2VkIiwic2Vla2luZyIsInN0YWxsZWQi LCJzdWJtaXQiLCJzdXNwZW5kIiwidGltZVVwZGF0ZSIsInRvdWNoQ2FuY2VsIiwidG91Y2hFbmQi LCJ0b3VjaE1vdmUiLCJ0b3VjaFN0YXJ0IiwidHJhbnNpdGlvbkVuZCIsInZvbHVtZUNoYW5nZSIs IndhaXRpbmciLCJ3aGVlbCJdLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXS50b1VwcGVy Q2FzZSgpK2Uuc2xpY2UoMSksbj0ib24iK3Qscj0idG9wIit0LG89e3BoYXNlZFJlZ2lzdHJhdGlv bk5hbWVzOntidWJibGVkOm4sY2FwdHVyZWQ6bisiQ2FwdHVyZSJ9LGRlcGVuZGVuY2llczpbcl19 O0VbZV09byx4W3JdPW99KTt2YXIgdz17fSxUPXtldmVudFR5cGVzOkUsZXh0cmFjdEV2ZW50czpm dW5jdGlvbihlLHQsbixyKXt2YXIgbz14W2VdO2lmKCFvKXJldHVybiBudWxsO3ZhciBhO3N3aXRj aChlKXtjYXNlInRvcEFib3J0IjpjYXNlInRvcENhblBsYXkiOmNhc2UidG9wQ2FuUGxheVRocm91 Z2giOmNhc2UidG9wRHVyYXRpb25DaGFuZ2UiOmNhc2UidG9wRW1wdGllZCI6Y2FzZSJ0b3BFbmNy eXB0ZWQiOmNhc2UidG9wRW5kZWQiOmNhc2UidG9wRXJyb3IiOmNhc2UidG9wSW5wdXQiOmNhc2Ui dG9wSW52YWxpZCI6Y2FzZSJ0b3BMb2FkIjpjYXNlInRvcExvYWRlZERhdGEiOmNhc2UidG9wTG9h ZGVkTWV0YWRhdGEiOmNhc2UidG9wTG9hZFN0YXJ0IjpjYXNlInRvcFBhdXNlIjpjYXNlInRvcFBs YXkiOmNhc2UidG9wUGxheWluZyI6Y2FzZSJ0b3BQcm9ncmVzcyI6Y2FzZSJ0b3BSYXRlQ2hhbmdl IjpjYXNlInRvcFJlc2V0IjpjYXNlInRvcFNlZWtlZCI6Y2FzZSJ0b3BTZWVraW5nIjpjYXNlInRv cFN0YWxsZWQiOmNhc2UidG9wU3VibWl0IjpjYXNlInRvcFN1c3BlbmQiOmNhc2UidG9wVGltZVVw ZGF0ZSI6Y2FzZSJ0b3BWb2x1bWVDaGFuZ2UiOmNhc2UidG9wV2FpdGluZyI6YT1wO2JyZWFrO2Nh c2UidG9wS2V5UHJlc3MiOmlmKDA9PT1iKG4pKXJldHVybiBudWxsO2Nhc2UidG9wS2V5RG93biI6 Y2FzZSJ0b3BLZXlVcCI6YT1mO2JyZWFrO2Nhc2UidG9wQmx1ciI6Y2FzZSJ0b3BGb2N1cyI6YT1k O2JyZWFrO2Nhc2UidG9wQ2xpY2siOmlmKDI9PT1uLmJ1dHRvbilyZXR1cm4gbnVsbDtjYXNlInRv cERvdWJsZUNsaWNrIjpjYXNlInRvcE1vdXNlRG93biI6Y2FzZSJ0b3BNb3VzZU1vdmUiOmNhc2Ui dG9wTW91c2VVcCI6Y2FzZSJ0b3BNb3VzZU91dCI6Y2FzZSJ0b3BNb3VzZU92ZXIiOmNhc2UidG9w Q29udGV4dE1lbnUiOmE9aDticmVhaztjYXNlInRvcERyYWciOmNhc2UidG9wRHJhZ0VuZCI6Y2Fz ZSJ0b3BEcmFnRW50ZXIiOmNhc2UidG9wRHJhZ0V4aXQiOmNhc2UidG9wRHJhZ0xlYXZlIjpjYXNl InRvcERyYWdPdmVyIjpjYXNlInRvcERyYWdTdGFydCI6Y2FzZSJ0b3BEcm9wIjphPW07YnJlYWs7 Y2FzZSJ0b3BUb3VjaENhbmNlbCI6Y2FzZSJ0b3BUb3VjaEVuZCI6Y2FzZSJ0b3BUb3VjaE1vdmUi OmNhc2UidG9wVG91Y2hTdGFydCI6YT12O2JyZWFrO2Nhc2UidG9wQW5pbWF0aW9uRW5kIjpjYXNl InRvcEFuaW1hdGlvbkl0ZXJhdGlvbiI6Y2FzZSJ0b3BBbmltYXRpb25TdGFydCI6YT1sO2JyZWFr O2Nhc2UidG9wVHJhbnNpdGlvbkVuZCI6YT1nO2JyZWFrO2Nhc2UidG9wU2Nyb2xsIjphPXk7YnJl YWs7Y2FzZSJ0b3BXaGVlbCI6YT1fO2JyZWFrO2Nhc2UidG9wQ29weSI6Y2FzZSJ0b3BDdXQiOmNh c2UidG9wUGFzdGUiOmE9Y31hP3ZvaWQgMDppKCI4NiIsZSk7dmFyIHU9YS5nZXRQb29sZWQobyx0 LG4scik7cmV0dXJuIHMuYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyh1KSx1fSxkaWRQdXRM aXN0ZW5lcjpmdW5jdGlvbihlLHQsbil7aWYoIm9uQ2xpY2siPT09dCYmIW8oZS5fdGFnKSl7dmFy IGk9cihlKSxzPXUuZ2V0Tm9kZUZyb21JbnN0YW5jZShlKTt3W2ldfHwod1tpXT1hLmxpc3Rlbihz LCJjbGljayIsQykpfX0sd2lsbERlbGV0ZUxpc3RlbmVyOmZ1bmN0aW9uKGUsdCl7aWYoIm9uQ2xp Y2siPT09dCYmIW8oZS5fdGFnKSl7dmFyIG49cihlKTt3W25dLnJlbW92ZSgpLGRlbGV0ZSB3W25d fX19O3QuZXhwb3J0cz1UfSx7MTEzOjExMywxMjI6MTIyLDEyOToxMjksMTM3OjEzNywxOToxOSwz MzozMyw3Njo3Niw3Nzo3Nyw3OTo3OSw4MDo4MCw4MTo4MSw4Mzo4Myw4NDo4NCw4NTo4NSw4Njo4 Niw4Nzo4Nyw4ODo4OCw5OTo5OX1dLDc2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1 bmN0aW9uIHIoZSx0LG4scil7cmV0dXJuIG8uY2FsbCh0aGlzLGUsdCxuLHIpfXZhciBvPWUoODAp LGk9e2FuaW1hdGlvbk5hbWU6bnVsbCxlbGFwc2VkVGltZTpudWxsLHBzZXVkb0VsZW1lbnQ6bnVs bH07by5hdWdtZW50Q2xhc3MocixpKSx0LmV4cG9ydHM9cn0sezgwOjgwfV0sNzc6W2Z1bmN0aW9u KGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbixyKXtyZXR1cm4gby5jYWxsKHRo aXMsZSx0LG4scil9dmFyIG89ZSg4MCksaT17Y2xpcGJvYXJkRGF0YTpmdW5jdGlvbihlKXtyZXR1 cm4iY2xpcGJvYXJkRGF0YSJpbiBlP2UuY2xpcGJvYXJkRGF0YTp3aW5kb3cuY2xpcGJvYXJkRGF0 YX19O28uYXVnbWVudENsYXNzKHIsaSksdC5leHBvcnRzPXJ9LHs4MDo4MH1dLDc4OltmdW5jdGlv bihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4scil7cmV0dXJuIG8uY2FsbCh0 aGlzLGUsdCxuLHIpfXZhciBvPWUoODApLGk9e2RhdGE6bnVsbH07by5hdWdtZW50Q2xhc3Mocixp KSx0LmV4cG9ydHM9cn0sezgwOjgwfV0sNzk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7 ZnVuY3Rpb24gcihlLHQsbixyKXtyZXR1cm4gby5jYWxsKHRoaXMsZSx0LG4scil9dmFyIG89ZSg4 NCksaT17ZGF0YVRyYW5zZmVyOm51bGx9O28uYXVnbWVudENsYXNzKHIsaSksdC5leHBvcnRzPXJ9 LHs4NDo4NH1dLDgwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0 LG4scil7dGhpcy5kaXNwYXRjaENvbmZpZz1lLHRoaXMuX3RhcmdldEluc3Q9dCx0aGlzLm5hdGl2 ZUV2ZW50PW47dmFyIG89dGhpcy5jb25zdHJ1Y3Rvci5JbnRlcmZhY2U7Zm9yKHZhciBpIGluIG8p aWYoby5oYXNPd25Qcm9wZXJ0eShpKSl7dmFyIHM9b1tpXTtzP3RoaXNbaV09cyhuKToidGFyZ2V0 Ij09PWk/dGhpcy50YXJnZXQ9cjp0aGlzW2ldPW5baV19dmFyIHU9bnVsbCE9bi5kZWZhdWx0UHJl dmVudGVkP24uZGVmYXVsdFByZXZlbnRlZDpuLnJldHVyblZhbHVlPT09ITE7cmV0dXJuIHU/dGhp cy5pc0RlZmF1bHRQcmV2ZW50ZWQ9YS50aGF0UmV0dXJuc1RydWU6dGhpcy5pc0RlZmF1bHRQcmV2 ZW50ZWQ9YS50aGF0UmV0dXJuc0ZhbHNlLHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9YS50aGF0 UmV0dXJuc0ZhbHNlLHRoaXN9dmFyIG89ZSgxNDMpLGk9ZSgyNCksYT1lKDEyOSkscz0oZSgxNDIp LCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSxbImRpc3BhdGNoQ29uZmlnIiwiX3RhcmdldEluc3Qi LCJuYXRpdmVFdmVudCIsImlzRGVmYXVsdFByZXZlbnRlZCIsImlzUHJvcGFnYXRpb25TdG9wcGVk IiwiX2Rpc3BhdGNoTGlzdGVuZXJzIiwiX2Rpc3BhdGNoSW5zdGFuY2VzIl0pLHU9e3R5cGU6bnVs bCx0YXJnZXQ6bnVsbCxjdXJyZW50VGFyZ2V0OmEudGhhdFJldHVybnNOdWxsLGV2ZW50UGhhc2U6 bnVsbCxidWJibGVzOm51bGwsY2FuY2VsYWJsZTpudWxsLHRpbWVTdGFtcDpmdW5jdGlvbihlKXty ZXR1cm4gZS50aW1lU3RhbXB8fERhdGUubm93KCl9LGRlZmF1bHRQcmV2ZW50ZWQ6bnVsbCxpc1Ry dXN0ZWQ6bnVsbH07byhyLnByb3RvdHlwZSx7cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlz LmRlZmF1bHRQcmV2ZW50ZWQ9ITA7dmFyIGU9dGhpcy5uYXRpdmVFdmVudDtlJiYoZS5wcmV2ZW50 RGVmYXVsdD9lLnByZXZlbnREZWZhdWx0KCk6InVua25vd24iIT10eXBlb2YgZS5yZXR1cm5WYWx1 ZSYmKGUucmV0dXJuVmFsdWU9ITEpLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEudGhhdFJldHVy bnNUcnVlKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5uYXRpdmVFdmVu dDtlJiYoZS5zdG9wUHJvcGFnYXRpb24/ZS5zdG9wUHJvcGFnYXRpb24oKToidW5rbm93biIhPXR5 cGVvZiBlLmNhbmNlbEJ1YmJsZSYmKGUuY2FuY2VsQnViYmxlPSEwKSx0aGlzLmlzUHJvcGFnYXRp b25TdG9wcGVkPWEudGhhdFJldHVybnNUcnVlKX0scGVyc2lzdDpmdW5jdGlvbigpe3RoaXMuaXNQ ZXJzaXN0ZW50PWEudGhhdFJldHVybnNUcnVlfSxpc1BlcnNpc3RlbnQ6YS50aGF0UmV0dXJuc0Zh bHNlLGRlc3RydWN0b3I6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmNvbnN0cnVjdG9yLkludGVyZmFj ZTtmb3IodmFyIHQgaW4gZSl0aGlzW3RdPW51bGw7Zm9yKHZhciBuPTA7bjxzLmxlbmd0aDtuKysp dGhpc1tzW25dXT1udWxsfX0pLHIuSW50ZXJmYWNlPXUsci5hdWdtZW50Q2xhc3M9ZnVuY3Rpb24o ZSx0KXt2YXIgbj10aGlzLHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPW4ucHJvdG90eXBlO3Zh ciBhPW5ldyByO28oYSxlLnByb3RvdHlwZSksZS5wcm90b3R5cGU9YSxlLnByb3RvdHlwZS5jb25z dHJ1Y3Rvcj1lLGUuSW50ZXJmYWNlPW8oe30sbi5JbnRlcmZhY2UsdCksZS5hdWdtZW50Q2xhc3M9 bi5hdWdtZW50Q2xhc3MsaS5hZGRQb29saW5nVG8oZSxpLmZvdXJBcmd1bWVudFBvb2xlcil9LGku YWRkUG9vbGluZ1RvKHIsaS5mb3VyQXJndW1lbnRQb29sZXIpLHQuZXhwb3J0cz1yfSx7MTI5OjEy OSwxNDI6MTQyLDE0MzoxNDMsMjQ6MjR9XSw4MTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0 IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1l KDg3KSxpPXtyZWxhdGVkVGFyZ2V0Om51bGx9O28uYXVnbWVudENsYXNzKHIsaSksdC5leHBvcnRz PXJ9LHs4Nzo4N31dLDgyOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIo ZSx0LG4scil7cmV0dXJuIG8uY2FsbCh0aGlzLGUsdCxuLHIpfXZhciBvPWUoODApLGk9e2RhdGE6 bnVsbH07by5hdWdtZW50Q2xhc3MocixpKSx0LmV4cG9ydHM9cn0sezgwOjgwfV0sODM6W2Z1bmN0 aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbixyKXtyZXR1cm4gby5jYWxs KHRoaXMsZSx0LG4scil9dmFyIG89ZSg4NyksaT1lKDk5KSxhPWUoMTAwKSxzPWUoMTAxKSx1PXtr ZXk6YSxsb2NhdGlvbjpudWxsLGN0cmxLZXk6bnVsbCxzaGlmdEtleTpudWxsLGFsdEtleTpudWxs LG1ldGFLZXk6bnVsbCxyZXBlYXQ6bnVsbCxsb2NhbGU6bnVsbCxnZXRNb2RpZmllclN0YXRlOnMs Y2hhckNvZGU6ZnVuY3Rpb24oZSl7cmV0dXJuImtleXByZXNzIj09PWUudHlwZT9pKGUpOjB9LGtl eUNvZGU6ZnVuY3Rpb24oZSl7cmV0dXJuImtleWRvd24iPT09ZS50eXBlfHwia2V5dXAiPT09ZS50 eXBlP2Uua2V5Q29kZTowfSx3aGljaDpmdW5jdGlvbihlKXtyZXR1cm4ia2V5cHJlc3MiPT09ZS50 eXBlP2koZSk6ImtleWRvd24iPT09ZS50eXBlfHwia2V5dXAiPT09ZS50eXBlP2Uua2V5Q29kZTow fX07by5hdWdtZW50Q2xhc3Mocix1KSx0LmV4cG9ydHM9cn0sezEwMDoxMDAsMTAxOjEwMSw4Nzo4 Nyw5OTo5OX1dLDg0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0 LG4scil7cmV0dXJuIG8uY2FsbCh0aGlzLGUsdCxuLHIpfXZhciBvPWUoODcpLGk9ZSg5MCksYT1l KDEwMSkscz17c2NyZWVuWDpudWxsLHNjcmVlblk6bnVsbCxjbGllbnRYOm51bGwsY2xpZW50WTpu dWxsLGN0cmxLZXk6bnVsbCxzaGlmdEtleTpudWxsLGFsdEtleTpudWxsLG1ldGFLZXk6bnVsbCxn ZXRNb2RpZmllclN0YXRlOmEsYnV0dG9uOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYnV0dG9uO3JldHVy biJ3aGljaCJpbiBlP3Q6Mj09PXQ/Mjo0PT09dD8xOjB9LGJ1dHRvbnM6bnVsbCxyZWxhdGVkVGFy Z2V0OmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlbGF0ZWRUYXJnZXR8fChlLmZyb21FbGVtZW50PT09 ZS5zcmNFbGVtZW50P2UudG9FbGVtZW50OmUuZnJvbUVsZW1lbnQpfSxwYWdlWDpmdW5jdGlvbihl KXtyZXR1cm4icGFnZVgiaW4gZT9lLnBhZ2VYOmUuY2xpZW50WCtpLmN1cnJlbnRTY3JvbGxMZWZ0 fSxwYWdlWTpmdW5jdGlvbihlKXtyZXR1cm4icGFnZVkiaW4gZT9lLnBhZ2VZOmUuY2xpZW50WStp LmN1cnJlbnRTY3JvbGxUb3B9fTtvLmF1Z21lbnRDbGFzcyhyLHMpLHQuZXhwb3J0cz1yfSx7MTAx OjEwMSw4Nzo4Nyw5MDo5MH1dLDg1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0 aW9uIHIoZSx0LG4scil7cmV0dXJuIG8uY2FsbCh0aGlzLGUsdCxuLHIpfXZhciBvPWUoODcpLGk9 ZSgxMDEpLGE9e3RvdWNoZXM6bnVsbCx0YXJnZXRUb3VjaGVzOm51bGwsY2hhbmdlZFRvdWNoZXM6 bnVsbCxhbHRLZXk6bnVsbCxtZXRhS2V5Om51bGwsY3RybEtleTpudWxsLHNoaWZ0S2V5Om51bGws Z2V0TW9kaWZpZXJTdGF0ZTppfTtvLmF1Z21lbnRDbGFzcyhyLGEpLHQuZXhwb3J0cz1yfSx7MTAx OjEwMSw4Nzo4N31dLDg2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIo ZSx0LG4scil7cmV0dXJuIG8uY2FsbCh0aGlzLGUsdCxuLHIpfXZhciBvPWUoODApLGk9e3Byb3Bl cnR5TmFtZTpudWxsLGVsYXBzZWRUaW1lOm51bGwscHNldWRvRWxlbWVudDpudWxsfTtvLmF1Z21l bnRDbGFzcyhyLGkpLHQuZXhwb3J0cz1yfSx7ODA6ODB9XSw4NzpbZnVuY3Rpb24oZSx0LG4peyJ1 c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixy KX12YXIgbz1lKDgwKSxpPWUoMTAyKSxhPXt2aWV3OmZ1bmN0aW9uKGUpe2lmKGUudmlldylyZXR1 cm4gZS52aWV3O3ZhciB0PWkoZSk7aWYodC53aW5kb3c9PT10KXJldHVybiB0O3ZhciBuPXQub3du ZXJEb2N1bWVudDtyZXR1cm4gbj9uLmRlZmF1bHRWaWV3fHxuLnBhcmVudFdpbmRvdzp3aW5kb3d9 LGRldGFpbDpmdW5jdGlvbihlKXtyZXR1cm4gZS5kZXRhaWx8fDB9fTtvLmF1Z21lbnRDbGFzcyhy LGEpLHQuZXhwb3J0cz1yfSx7MTAyOjEwMiw4MDo4MH1dLDg4OltmdW5jdGlvbihlLHQsbil7InVz ZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4scil7cmV0dXJuIG8uY2FsbCh0aGlzLGUsdCxuLHIp fXZhciBvPWUoODQpLGk9e2RlbHRhWDpmdW5jdGlvbihlKXtyZXR1cm4iZGVsdGFYImluIGU/ZS5k ZWx0YVg6IndoZWVsRGVsdGFYImluIGU/LWUud2hlZWxEZWx0YVg6MH0sZGVsdGFZOmZ1bmN0aW9u KGUpe3JldHVybiJkZWx0YVkiaW4gZT9lLmRlbHRhWToid2hlZWxEZWx0YVkiaW4gZT8tZS53aGVl bERlbHRhWToid2hlZWxEZWx0YSJpbiBlPy1lLndoZWVsRGVsdGE6MH0sZGVsdGFaOm51bGwsZGVs dGFNb2RlOm51bGx9O28uYXVnbWVudENsYXNzKHIsaSksdC5leHBvcnRzPXJ9LHs4NDo4NH1dLDg5 OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTEzKSxvPShlKDEzNykse30p LGk9e3JlaW5pdGlhbGl6ZVRyYW5zYWN0aW9uOmZ1bmN0aW9uKCl7dGhpcy50cmFuc2FjdGlvbldy YXBwZXJzPXRoaXMuZ2V0VHJhbnNhY3Rpb25XcmFwcGVycygpLHRoaXMud3JhcHBlckluaXREYXRh P3RoaXMud3JhcHBlckluaXREYXRhLmxlbmd0aD0wOnRoaXMud3JhcHBlckluaXREYXRhPVtdLHRo aXMuX2lzSW5UcmFuc2FjdGlvbj0hMX0sX2lzSW5UcmFuc2FjdGlvbjohMSxnZXRUcmFuc2FjdGlv bldyYXBwZXJzOm51bGwsaXNJblRyYW5zYWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLl9p c0luVHJhbnNhY3Rpb259LHBlcmZvcm06ZnVuY3Rpb24oZSx0LG4sbyxpLGEscyx1KXt0aGlzLmlz SW5UcmFuc2FjdGlvbigpP3IoIjI3Iik6dm9pZCAwO3ZhciBsLGM7dHJ5e3RoaXMuX2lzSW5UcmFu c2FjdGlvbj0hMCxsPSEwLHRoaXMuaW5pdGlhbGl6ZUFsbCgwKSxjPWUuY2FsbCh0LG4sbyxpLGEs cyx1KSxsPSExfWZpbmFsbHl7dHJ5e2lmKGwpdHJ5e3RoaXMuY2xvc2VBbGwoMCl9Y2F0Y2goZSl7 fWVsc2UgdGhpcy5jbG9zZUFsbCgwKX1maW5hbGx5e3RoaXMuX2lzSW5UcmFuc2FjdGlvbj0hMX19 cmV0dXJuIGN9LGluaXRpYWxpemVBbGw6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMudHJhbnNh Y3Rpb25XcmFwcGVycyxuPWU7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07dHJ5e3RoaXMud3Jh cHBlckluaXREYXRhW25dPW8sdGhpcy53cmFwcGVySW5pdERhdGFbbl09ci5pbml0aWFsaXplP3Iu aW5pdGlhbGl6ZS5jYWxsKHRoaXMpOm51bGx9ZmluYWxseXtpZih0aGlzLndyYXBwZXJJbml0RGF0 YVtuXT09PW8pdHJ5e3RoaXMuaW5pdGlhbGl6ZUFsbChuKzEpfWNhdGNoKGUpe319fX0sY2xvc2VB bGw6ZnVuY3Rpb24oZSl7dGhpcy5pc0luVHJhbnNhY3Rpb24oKT92b2lkIDA6cigiMjgiKTtmb3Io dmFyIHQ9dGhpcy50cmFuc2FjdGlvbldyYXBwZXJzLG49ZTtuPHQubGVuZ3RoO24rKyl7dmFyIGks YT10W25dLHM9dGhpcy53cmFwcGVySW5pdERhdGFbbl07dHJ5e2k9ITAscyE9PW8mJmEuY2xvc2Um JmEuY2xvc2UuY2FsbCh0aGlzLHMpLGk9ITF9ZmluYWxseXtpZihpKXRyeXt0aGlzLmNsb3NlQWxs KG4rMSl9Y2F0Y2goZSl7fX19dGhpcy53cmFwcGVySW5pdERhdGEubGVuZ3RoPTB9fTt0LmV4cG9y dHM9aX0sezExMzoxMTMsMTM3OjEzN31dLDkwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3Qi O3ZhciByPXtjdXJyZW50U2Nyb2xsTGVmdDowLGN1cnJlbnRTY3JvbGxUb3A6MCxyZWZyZXNoU2Ny b2xsVmFsdWVzOmZ1bmN0aW9uKGUpe3IuY3VycmVudFNjcm9sbExlZnQ9ZS54LHIuY3VycmVudFNj cm9sbFRvcD1lLnl9fTt0LmV4cG9ydHM9cn0se31dLDkxOltmdW5jdGlvbihlLHQsbil7InVzZSBz dHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4gbnVsbD09dD9vKCIzMCIpOnZvaWQgMCxudWxs PT1lP3Q6QXJyYXkuaXNBcnJheShlKT9BcnJheS5pc0FycmF5KHQpPyhlLnB1c2guYXBwbHkoZSx0 KSxlKTooZS5wdXNoKHQpLGUpOkFycmF5LmlzQXJyYXkodCk/W2VdLmNvbmNhdCh0KTpbZSx0XX12 YXIgbz1lKDExMyk7ZSgxMzcpO3QuZXhwb3J0cz1yfSx7MTEzOjExMywxMzc6MTM3fV0sOTI6W2Z1 bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtmb3IodmFyIHQ9MSxuPTAs cj0wLGk9ZS5sZW5ndGgsYT1pJi00O3I8YTspe2Zvcih2YXIgcz1NYXRoLm1pbihyKzQwOTYsYSk7 cjxzO3IrPTQpbis9KHQrPWUuY2hhckNvZGVBdChyKSkrKHQrPWUuY2hhckNvZGVBdChyKzEpKSso dCs9ZS5jaGFyQ29kZUF0KHIrMikpKyh0Kz1lLmNoYXJDb2RlQXQociszKSk7dCU9byxuJT1vfWZv cig7cjxpO3IrKyluKz10Kz1lLmNoYXJDb2RlQXQocik7cmV0dXJuIHQlPW8sbiU9byx0fG48PDE2 fXZhciBvPTY1NTIxO3QuZXhwb3J0cz1yfSx7fV0sOTM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0 cmljdCI7dmFyIHI9ZnVuY3Rpb24oZSl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBNU0FwcCYm TVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24/ZnVuY3Rpb24odCxuLHIsbyl7TVNBcHAuZXhl Y1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24oKXtyZXR1cm4gZSh0LG4scixvKX0pfTplfTt0 LmV4cG9ydHM9cn0se31dLDk0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9u IHIoZSx0LG4pe3ZhciByPW51bGw9PXR8fCJib29sZWFuIj09dHlwZW9mIHR8fCIiPT09dDtpZihy KXJldHVybiIiO3ZhciBvPWlzTmFOKHQpO3JldHVybiBvfHwwPT09dHx8aS5oYXNPd25Qcm9wZXJ0 eShlKSYmaVtlXT8iIit0Oigic3RyaW5nIj09dHlwZW9mIHQmJih0PXQudHJpbSgpKSx0KyJweCIp fXZhciBvPWUoNCksaT0oZSgxNDIpLG8uaXNVbml0bGVzc051bWJlcik7dC5leHBvcnRzPXJ9LHsx NDI6MTQyLDQ6NH1dLDk1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIo ZSl7dmFyIHQ9IiIrZSxuPWkuZXhlYyh0KTtpZighbilyZXR1cm4gdDt2YXIgcixvPSIiLGE9MCxz PTA7Zm9yKGE9bi5pbmRleDthPHQubGVuZ3RoO2ErKyl7c3dpdGNoKHQuY2hhckNvZGVBdChhKSl7 Y2FzZSAzNDpyPSImcXVvdDsiO2JyZWFrO2Nhc2UgMzg6cj0iJmFtcDsiO2JyZWFrO2Nhc2UgMzk6 cj0iJiN4Mjc7IjticmVhaztjYXNlIDYwOnI9IiZsdDsiO2JyZWFrO2Nhc2UgNjI6cj0iJmd0OyI7 YnJlYWs7ZGVmYXVsdDpjb250aW51ZX1zIT09YSYmKG8rPXQuc3Vic3RyaW5nKHMsYSkpLHM9YSsx LG8rPXJ9cmV0dXJuIHMhPT1hP28rdC5zdWJzdHJpbmcocyxhKTpvfWZ1bmN0aW9uIG8oZSl7cmV0 dXJuImJvb2xlYW4iPT10eXBlb2YgZXx8Im51bWJlciI9PXR5cGVvZiBlPyIiK2U6cihlKX12YXIg aT0vWyInJjw+XS87dC5leHBvcnRzPW99LHt9XSw5NjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3Ry aWN0IjtmdW5jdGlvbiByKGUpe2lmKG51bGw9PWUpcmV0dXJuIG51bGw7aWYoMT09PWUubm9kZVR5 cGUpcmV0dXJuIGU7dmFyIHQ9YS5nZXQoZSk7cmV0dXJuIHQ/KHQ9cyh0KSx0P2kuZ2V0Tm9kZUZy b21JbnN0YW5jZSh0KTpudWxsKTp2b2lkKCJmdW5jdGlvbiI9PXR5cGVvZiBlLnJlbmRlcj9vKCI0 NCIpOm8oIjQ1IixPYmplY3Qua2V5cyhlKSkpfXZhciBvPWUoMTEzKSxpPShlKDEyMCksZSgzMykp LGE9ZSg1Nykscz1lKDEwMyk7ZSgxMzcpLGUoMTQyKTt0LmV4cG9ydHM9cn0sezEwMzoxMDMsMTEz OjExMywxMjA6MTIwLDEzNzoxMzcsMTQyOjE0MiwzMzozMyw1Nzo1N31dLDk3OltmdW5jdGlvbihl LHQsbil7KGZ1bmN0aW9uKG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe2lmKGUm JiJvYmplY3QiPT10eXBlb2YgZSl7dmFyIG89ZSxpPXZvaWQgMD09PW9bbl07aSYmbnVsbCE9dCYm KG9bbl09dCl9fWZ1bmN0aW9uIG8oZSx0KXtpZihudWxsPT1lKXJldHVybiBlO3ZhciBuPXt9O3Jl dHVybiBpKGUscixuKSxufXZhciBpPShlKDIyKSxlKDExOCkpO2UoMTQyKTsidW5kZWZpbmVkIiE9 dHlwZW9mIG4mJm4uZW52LHQuZXhwb3J0cz1vfSkuY2FsbCh0aGlzLHZvaWQgMCl9LHsxMTg6MTE4 LDE0MjoxNDIsMjI6MjJ9XSw5ODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlv biByKGUsdCxuKXtBcnJheS5pc0FycmF5KGUpP2UuZm9yRWFjaCh0LG4pOmUmJnQuY2FsbChuLGUp fXQuZXhwb3J0cz1yfSx7fV0sOTk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rp b24gcihlKXt2YXIgdCxuPWUua2V5Q29kZTtyZXR1cm4iY2hhckNvZGUiaW4gZT8odD1lLmNoYXJD b2RlLDA9PT10JiYxMz09PW4mJih0PTEzKSk6dD1uLHQ+PTMyfHwxMz09PXQ/dDowfXQuZXhwb3J0 cz1yfSx7fV0sMTAwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7 aWYoZS5rZXkpe3ZhciB0PWlbZS5rZXldfHxlLmtleTtpZigiVW5pZGVudGlmaWVkIiE9PXQpcmV0 dXJuIHR9aWYoImtleXByZXNzIj09PWUudHlwZSl7dmFyIG49byhlKTtyZXR1cm4gMTM9PT1uPyJF bnRlciI6U3RyaW5nLmZyb21DaGFyQ29kZShuKX1yZXR1cm4ia2V5ZG93biI9PT1lLnR5cGV8fCJr ZXl1cCI9PT1lLnR5cGU/YVtlLmtleUNvZGVdfHwiVW5pZGVudGlmaWVkIjoiIn12YXIgbz1lKDk5 KSxpPXtFc2M6IkVzY2FwZSIsU3BhY2ViYXI6IiAiLExlZnQ6IkFycm93TGVmdCIsVXA6IkFycm93 VXAiLFJpZ2h0OiJBcnJvd1JpZ2h0IixEb3duOiJBcnJvd0Rvd24iLERlbDoiRGVsZXRlIixXaW46 Ik9TIixNZW51OiJDb250ZXh0TWVudSIsQXBwczoiQ29udGV4dE1lbnUiLFNjcm9sbDoiU2Nyb2xs TG9jayIsTW96UHJpbnRhYmxlS2V5OiJVbmlkZW50aWZpZWQifSxhPXs4OiJCYWNrc3BhY2UiLDk6 IlRhYiIsMTI6IkNsZWFyIiwxMzoiRW50ZXIiLDE2OiJTaGlmdCIsMTc6IkNvbnRyb2wiLDE4OiJB bHQiLDE5OiJQYXVzZSIsMjA6IkNhcHNMb2NrIiwyNzoiRXNjYXBlIiwzMjoiICIsMzM6IlBhZ2VV cCIsMzQ6IlBhZ2VEb3duIiwzNToiRW5kIiwzNjoiSG9tZSIsMzc6IkFycm93TGVmdCIsMzg6IkFy cm93VXAiLDM5OiJBcnJvd1JpZ2h0Iiw0MDoiQXJyb3dEb3duIiw0NToiSW5zZXJ0Iiw0NjoiRGVs ZXRlIiwxMTI6IkYxIiwxMTM6IkYyIiwxMTQ6IkYzIiwxMTU6IkY0IiwxMTY6IkY1IiwxMTc6IkY2 IiwxMTg6IkY3IiwxMTk6IkY4IiwxMjA6IkY5IiwxMjE6IkYxMCIsMTIyOiJGMTEiLDEyMzoiRjEy IiwxNDQ6Ik51bUxvY2siLDE0NToiU2Nyb2xsTG9jayIsMjI0OiJNZXRhIn07dC5leHBvcnRzPXJ9 LHs5OTo5OX1dLDEwMTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUp e3ZhciB0PXRoaXMsbj10Lm5hdGl2ZUV2ZW50O2lmKG4uZ2V0TW9kaWZpZXJTdGF0ZSlyZXR1cm4g bi5nZXRNb2RpZmllclN0YXRlKGUpO3ZhciByPWlbZV07cmV0dXJuISFyJiYhIW5bcl19ZnVuY3Rp b24gbyhlKXtyZXR1cm4gcn12YXIgaT17QWx0OiJhbHRLZXkiLENvbnRyb2w6ImN0cmxLZXkiLE1l dGE6Im1ldGFLZXkiLFNoaWZ0OiJzaGlmdEtleSJ9O3QuZXhwb3J0cz1vfSx7fV0sMTAyOltmdW5j dGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dmFyIHQ9ZS50YXJnZXR8fGUu c3JjRWxlbWVudHx8d2luZG93O3JldHVybiB0LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50JiYodD10 LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KSwzPT09dC5ub2RlVHlwZT90LnBhcmVudE5vZGU6dH10 LmV4cG9ydHM9cn0se31dLDEwMzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlv biByKGUpe2Zvcih2YXIgdDsodD1lLl9yZW5kZXJlZE5vZGVUeXBlKT09PW8uQ09NUE9TSVRFOyll PWUuX3JlbmRlcmVkQ29tcG9uZW50O3JldHVybiB0PT09by5IT1NUP2UuX3JlbmRlcmVkQ29tcG9u ZW50OnQ9PT1vLkVNUFRZP251bGw6dm9pZCAwfXZhciBvPWUoNjIpO3QuZXhwb3J0cz1yfSx7NjI6 NjJ9XSwxMDQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt2YXIg dD1lJiYobyYmZVtvXXx8ZVtpXSk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQpcmV0dXJuIHR9dmFy IG89ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yLGk9IkBAaXRlcmF0 b3IiO3QuZXhwb3J0cz1yfSx7fV0sMTA1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1 bmN0aW9uIHIoKXtyZXR1cm4gbysrfXZhciBvPTE7dC5leHBvcnRzPXJ9LHt9XSwxMDY6W2Z1bmN0 aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtmb3IoO2UmJmUuZmlyc3RDaGls ZDspZT1lLmZpcnN0Q2hpbGQ7cmV0dXJuIGV9ZnVuY3Rpb24gbyhlKXtmb3IoO2U7KXtpZihlLm5l eHRTaWJsaW5nKXJldHVybiBlLm5leHRTaWJsaW5nO2U9ZS5wYXJlbnROb2RlfX1mdW5jdGlvbiBp KGUsdCl7Zm9yKHZhciBuPXIoZSksaT0wLGE9MDtuOyl7aWYoMz09PW4ubm9kZVR5cGUpe2lmKGE9 aStuLnRleHRDb250ZW50Lmxlbmd0aCxpPD10JiZhPj10KXJldHVybntub2RlOm4sb2Zmc2V0OnQt aX07aT1hfW49cihvKG4pKX19dC5leHBvcnRzPWl9LHt9XSwxMDc6W2Z1bmN0aW9uKGUsdCxuKXsi dXNlIHN0cmljdCI7ZnVuY3Rpb24gcigpe3JldHVybiFpJiZvLmNhblVzZURPTSYmKGk9InRleHRD b250ZW50ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudD8idGV4dENvbnRlbnQiOiJpbm5lclRl eHQiKSxpfXZhciBvPWUoMTIzKSxpPW51bGw7dC5leHBvcnRzPXJ9LHsxMjM6MTIzfV0sMTA4Oltm dW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXt2YXIgbj17fTtyZXR1 cm4gbltlLnRvTG93ZXJDYXNlKCldPXQudG9Mb3dlckNhc2UoKSxuWyJXZWJraXQiK2VdPSJ3ZWJr aXQiK3QsblsiTW96IitlXT0ibW96Iit0LG5bIm1zIitlXT0iTVMiK3QsblsiTyIrZV09Im8iK3Qu dG9Mb3dlckNhc2UoKSxufWZ1bmN0aW9uIG8oZSl7aWYoc1tlXSlyZXR1cm4gc1tlXTtpZighYVtl XSlyZXR1cm4gZTt2YXIgdD1hW2VdO2Zvcih2YXIgbiBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHko bikmJm4gaW4gdSlyZXR1cm4gc1tlXT10W25dO3JldHVybiIifXZhciBpPWUoMTIzKSxhPXthbmlt YXRpb25lbmQ6cigiQW5pbWF0aW9uIiwiQW5pbWF0aW9uRW5kIiksYW5pbWF0aW9uaXRlcmF0aW9u OnIoIkFuaW1hdGlvbiIsIkFuaW1hdGlvbkl0ZXJhdGlvbiIpLGFuaW1hdGlvbnN0YXJ0OnIoIkFu aW1hdGlvbiIsIkFuaW1hdGlvblN0YXJ0IiksdHJhbnNpdGlvbmVuZDpyKCJUcmFuc2l0aW9uIiwi VHJhbnNpdGlvbkVuZCIpfSxzPXt9LHU9e307aS5jYW5Vc2VET00mJih1PWRvY3VtZW50LmNyZWF0 ZUVsZW1lbnQoImRpdiIpLnN0eWxlLCJBbmltYXRpb25FdmVudCJpbiB3aW5kb3d8fChkZWxldGUg YS5hbmltYXRpb25lbmQuYW5pbWF0aW9uLGRlbGV0ZSBhLmFuaW1hdGlvbml0ZXJhdGlvbi5hbmlt YXRpb24sZGVsZXRlIGEuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uKSwiVHJhbnNpdGlvbkV2ZW50 ImluIHdpbmRvd3x8ZGVsZXRlIGEudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uKSx0LmV4cG9ydHM9 b30sezEyMzoxMjN9XSwxMDk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24g cihlKXtpZihlKXt2YXIgdD1lLmdldE5hbWUoKTtpZih0KXJldHVybiIgQ2hlY2sgdGhlIHJlbmRl ciBtZXRob2Qgb2YgYCIrdCsiYC4ifXJldHVybiIifWZ1bmN0aW9uIG8oZSl7cmV0dXJuImZ1bmN0 aW9uIj09dHlwZW9mIGUmJiJ1bmRlZmluZWQiIT10eXBlb2YgZS5wcm90b3R5cGUmJiJmdW5jdGlv biI9PXR5cGVvZiBlLnByb3RvdHlwZS5tb3VudENvbXBvbmVudCYmImZ1bmN0aW9uIj09dHlwZW9m IGUucHJvdG90eXBlLnJlY2VpdmVDb21wb25lbnR9ZnVuY3Rpb24gaShlLHQpe3ZhciBuO2lmKG51 bGw9PT1lfHxlPT09ITEpbj1sLmNyZWF0ZShpKTtlbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgZSl7 dmFyIHM9ZSx1PXMudHlwZTtpZigiZnVuY3Rpb24iIT10eXBlb2YgdSYmInN0cmluZyIhPXR5cGVv ZiB1KXt2YXIgZD0iIjtkKz1yKHMuX293bmVyKSxhKCIxMzAiLG51bGw9PXU/dTp0eXBlb2YgdSxk KX0ic3RyaW5nIj09dHlwZW9mIHMudHlwZT9uPWMuY3JlYXRlSW50ZXJuYWxDb21wb25lbnQocyk6 byhzLnR5cGUpPyhuPW5ldyBzLnR5cGUocyksbi5nZXRIb3N0Tm9kZXx8KG4uZ2V0SG9zdE5vZGU9 bi5nZXROYXRpdmVOb2RlKSk6bj1uZXcgcChzKX1lbHNlInN0cmluZyI9PXR5cGVvZiBlfHwibnVt YmVyIj09dHlwZW9mIGU/bj1jLmNyZWF0ZUluc3RhbmNlRm9yVGV4dChlKTphKCIxMzEiLHR5cGVv ZiBlKTtyZXR1cm4gbi5fbW91bnRJbmRleD0wLG4uX21vdW50SW1hZ2U9bnVsbCxufXZhciBhPWUo MTEzKSxzPWUoMTQzKSx1PWUoMjkpLGw9ZSg0OSksYz1lKDU0KSxwPShlKDEwNSksZSgxMzcpLGUo MTQyKSxmdW5jdGlvbihlKXt0aGlzLmNvbnN0cnVjdChlKX0pO3MocC5wcm90b3R5cGUsdSx7X2lu c3RhbnRpYXRlUmVhY3RDb21wb25lbnQ6aX0pLHQuZXhwb3J0cz1pfSx7MTA1OjEwNSwxMTM6MTEz LDEzNzoxMzcsMTQyOjE0MiwxNDM6MTQzLDI5OjI5LDQ5OjQ5LDU0OjU0fV0sMTEwOltmdW5jdGlv bihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXtpZighaS5jYW5Vc2VET018fHQm JiEoImFkZEV2ZW50TGlzdGVuZXIiaW4gZG9jdW1lbnQpKXJldHVybiExO3ZhciBuPSJvbiIrZSxy PW4gaW4gZG9jdW1lbnQ7aWYoIXIpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIp O2Euc2V0QXR0cmlidXRlKG4sInJldHVybjsiKSxyPSJmdW5jdGlvbiI9PXR5cGVvZiBhW25dfXJl dHVybiFyJiZvJiYid2hlZWwiPT09ZSYmKHI9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uaGFzRmVh dHVyZSgiRXZlbnRzLndoZWVsIiwiMy4wIikpLHJ9dmFyIG8saT1lKDEyMyk7aS5jYW5Vc2VET00m JihvPWRvY3VtZW50LmltcGxlbWVudGF0aW9uJiZkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5oYXNG ZWF0dXJlJiZkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCIiLCIiKSE9PSEwKSx0 LmV4cG9ydHM9cn0sezEyMzoxMjN9XSwxMTE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7 ZnVuY3Rpb24gcihlKXt2YXIgdD1lJiZlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNl KCk7cmV0dXJuImlucHV0Ij09PXQ/ISFvW2UudHlwZV06InRleHRhcmVhIj09PXR9dmFyIG89e2Nv bG9yOiEwLGRhdGU6ITAsZGF0ZXRpbWU6ITAsImRhdGV0aW1lLWxvY2FsIjohMCxlbWFpbDohMCxt b250aDohMCxudW1iZXI6ITAscGFzc3dvcmQ6ITAscmFuZ2U6ITAsc2VhcmNoOiEwLHRlbDohMCx0 ZXh0OiEwLHRpbWU6ITAsdXJsOiEwLHdlZWs6ITB9O3QuZXhwb3J0cz1yfSx7fV0sMTEyOltmdW5j dGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuJyInK28oZSkrJyIn fXZhciBvPWUoOTUpO3QuZXhwb3J0cz1yfSx7OTU6OTV9XSwxMTM6W2Z1bmN0aW9uKGUsdCxuKXsi dXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aC0xLG49 Ik1pbmlmaWVkIFJlYWN0IGVycm9yICMiK2UrIjsgdmlzaXQgaHR0cDovL2ZhY2Vib29rLmdpdGh1 Yi5pby9yZWFjdC9kb2NzL2Vycm9yLWRlY29kZXIuaHRtbD9pbnZhcmlhbnQ9IitlLHI9MDtyPHQ7 cisrKW4rPSImYXJnc1tdPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3VtZW50c1tyKzFdKTtuKz0i IGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9u bWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4iO3Zh ciBvPW5ldyBFcnJvcihuKTt0aHJvdyBvLm5hbWU9IkludmFyaWFudCBWaW9sYXRpb24iLG8uZnJh bWVzVG9Qb3A9MSxvfXQuZXhwb3J0cz1yfSx7fV0sMTE0OltmdW5jdGlvbihlLHQsbil7InVzZSBz dHJpY3QiO3ZhciByPWUoNjApO3QuZXhwb3J0cz1yLnJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVy fSx7NjA6NjB9XSwxMTU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHIsbz1lKDEy MyksaT1lKDEwKSxhPS9eWyBcclxuXHRcZl0vLHM9LzwoIS0tfGxpbmt8bm9zY3JpcHR8bWV0YXxz Y3JpcHR8c3R5bGUpWyBcclxuXHRcZlwvPl0vLHU9ZSg5MyksbD11KGZ1bmN0aW9uKGUsdCl7aWYo ZS5uYW1lc3BhY2VVUkkhPT1pLnN2Z3x8ImlubmVySFRNTCJpbiBlKWUuaW5uZXJIVE1MPXQ7ZWxz ZXtyPXJ8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHIuaW5uZXJIVE1MPSI8c3ZnPiIr dCsiPC9zdmc+Ijtmb3IodmFyIG49ci5maXJzdENoaWxkO24uZmlyc3RDaGlsZDspZS5hcHBlbmRD aGlsZChuLmZpcnN0Q2hpbGQpfX0pO2lmKG8uY2FuVXNlRE9NKXt2YXIgYz1kb2N1bWVudC5jcmVh dGVFbGVtZW50KCJkaXYiKTtjLmlubmVySFRNTD0iICIsIiI9PT1jLmlubmVySFRNTCYmKGw9ZnVu Y3Rpb24oZSx0KXtpZihlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZSxl KSxhLnRlc3QodCl8fCI8Ij09PXRbMF0mJnMudGVzdCh0KSl7ZS5pbm5lckhUTUw9U3RyaW5nLmZy b21DaGFyQ29kZSg2NTI3OSkrdDt2YXIgbj1lLmZpcnN0Q2hpbGQ7MT09PW4uZGF0YS5sZW5ndGg/ ZS5yZW1vdmVDaGlsZChuKTpuLmRlbGV0ZURhdGEoMCwxKX1lbHNlIGUuaW5uZXJIVE1MPXR9KSxj PW51bGx9dC5leHBvcnRzPWx9LHsxMDoxMCwxMjM6MTIzLDkzOjkzfV0sMTE2OltmdW5jdGlvbihl LHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTIzKSxvPWUoOTUpLGk9ZSgxMTUpLGE9ZnVuY3Rp b24oZSx0KXtpZih0KXt2YXIgbj1lLmZpcnN0Q2hpbGQ7aWYobiYmbj09PWUubGFzdENoaWxkJiYz PT09bi5ub2RlVHlwZSlyZXR1cm4gdm9pZChuLm5vZGVWYWx1ZT10KX1lLnRleHRDb250ZW50PXR9 O3IuY2FuVXNlRE9NJiYoInRleHRDb250ZW50ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8 KGE9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gMz09PWUubm9kZVR5cGU/dm9pZChlLm5vZGVWYWx1ZT10 KTp2b2lkIGkoZSxvKHQpKX0pKSx0LmV4cG9ydHM9YX0sezExNToxMTUsMTIzOjEyMyw5NTo5NX1d LDExNzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7dmFyIG49 bnVsbD09PWV8fGU9PT0hMSxyPW51bGw9PT10fHx0PT09ITE7aWYobnx8cilyZXR1cm4gbj09PXI7 dmFyIG89dHlwZW9mIGUsaT10eXBlb2YgdDtyZXR1cm4ic3RyaW5nIj09PW98fCJudW1iZXIiPT09 bz8ic3RyaW5nIj09PWl8fCJudW1iZXIiPT09aToib2JqZWN0Ij09PWkmJmUudHlwZT09PXQudHlw ZSYmZS5rZXk9PT10LmtleX10LmV4cG9ydHM9cn0se31dLDExODpbZnVuY3Rpb24oZSx0LG4peyJ1 c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIGUmJiJvYmplY3QiPT10eXBlb2YgZSYm bnVsbCE9ZS5rZXk/bC5lc2NhcGUoZS5rZXkpOnQudG9TdHJpbmcoMzYpfWZ1bmN0aW9uIG8oZSx0 LG4saSl7dmFyIGQ9dHlwZW9mIGU7aWYoInVuZGVmaW5lZCIhPT1kJiYiYm9vbGVhbiIhPT1kfHwo ZT1udWxsKSxudWxsPT09ZXx8InN0cmluZyI9PT1kfHwibnVtYmVyIj09PWR8fCJvYmplY3QiPT09 ZCYmZS4kJHR5cGVvZj09PXMpcmV0dXJuIG4oaSxlLCIiPT09dD9jK3IoZSwwKTp0KSwxO3ZhciBm LGgsbT0wLHY9IiI9PT10P2M6dCtwO2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciBnPTA7Zzxl Lmxlbmd0aDtnKyspZj1lW2ddLGg9dityKGYsZyksbSs9byhmLGgsbixpKTtlbHNle3ZhciB5PXUo ZSk7aWYoeSl7dmFyIF8sQz15LmNhbGwoZSk7aWYoeSE9PWUuZW50cmllcylmb3IodmFyIGI9MDsh KF89Qy5uZXh0KCkpLmRvbmU7KWY9Xy52YWx1ZSxoPXYrcihmLGIrKyksbSs9byhmLGgsbixpKTtl bHNlIGZvcig7IShfPUMubmV4dCgpKS5kb25lOyl7dmFyIEU9Xy52YWx1ZTtFJiYoZj1FWzFdLGg9 ditsLmVzY2FwZShFWzBdKStwK3IoZiwwKSxtKz1vKGYsaCxuLGkpKX19ZWxzZSBpZigib2JqZWN0 Ij09PWQpe3ZhciB4PSIiLHc9U3RyaW5nKGUpO2EoIjMxIiwiW29iamVjdCBPYmplY3RdIj09PXc/ Im9iamVjdCB3aXRoIGtleXMgeyIrT2JqZWN0LmtleXMoZSkuam9pbigiLCAiKSsifSI6dyx4KX19 cmV0dXJuIG19ZnVuY3Rpb24gaShlLHQsbil7cmV0dXJuIG51bGw9PWU/MDpvKGUsIiIsdCxuKX12 YXIgYT1lKDExMykscz0oZSgxMjApLGUoNDgpKSx1PWUoMTA0KSxsPShlKDEzNyksZSgyMikpLGM9 KGUoMTQyKSwiLiIpLHA9IjoiO3QuZXhwb3J0cz1pfSx7MTA0OjEwNCwxMTM6MTEzLDEyMDoxMjAs MTM3OjEzNywxNDI6MTQyLDIyOjIyLDQ4OjQ4fV0sMTE5OltmdW5jdGlvbihlLHQsbil7InVzZSBz dHJpY3QiO3ZhciByPShlKDE0MyksZSgxMjkpKSxvPShlKDE0Mikscik7dC5leHBvcnRzPW99LHsx Mjk6MTI5LDE0MjoxNDIsMTQzOjE0M31dLDEyMDpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0 Ijt2YXIgbz1lLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJ UkVEO24uZXhwb3J0cz1vLlJlYWN0Q3VycmVudE93bmVyfSx7fV0sMTIxOltmdW5jdGlvbih0LG4s cil7InVzZSBzdHJpY3QiO24uZXhwb3J0cz1lfSx7fV0sMTIyOltmdW5jdGlvbihlLHQsbil7InVz ZSBzdHJpY3QiO3ZhciByPWUoMTI5KSxvPXtsaXN0ZW46ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBl LmFkZEV2ZW50TGlzdGVuZXI/KGUuYWRkRXZlbnRMaXN0ZW5lcih0LG4sITEpLHtyZW1vdmU6ZnVu Y3Rpb24oKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuLCExKX19KTplLmF0dGFjaEV2ZW50Pyhl LmF0dGFjaEV2ZW50KCJvbiIrdCxuKSx7cmVtb3ZlOmZ1bmN0aW9uKCl7ZS5kZXRhY2hFdmVudCgi b24iK3Qsbil9fSk6dm9pZCAwfSxjYXB0dXJlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZS5hZGRF dmVudExpc3RlbmVyPyhlLmFkZEV2ZW50TGlzdGVuZXIodCxuLCEwKSx7cmVtb3ZlOmZ1bmN0aW9u KCl7ZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiwhMCl9fSk6e3JlbW92ZTpyfX0scmVnaXN0ZXJE ZWZhdWx0OmZ1bmN0aW9uKCl7fX07dC5leHBvcnRzPW99LHsxMjk6MTI5fV0sMTIzOltmdW5jdGlv bihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPSEoInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3d8 fCF3aW5kb3cuZG9jdW1lbnR8fCF3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCksbz17Y2Fu VXNlRE9NOnIsY2FuVXNlV29ya2VyczoidW5kZWZpbmVkIiE9dHlwZW9mIFdvcmtlcixjYW5Vc2VF dmVudExpc3RlbmVyczpyJiYhKCF3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciYmIXdpbmRvdy5hdHRh Y2hFdmVudCksY2FuVXNlVmlld3BvcnQ6ciYmISF3aW5kb3cuc2NyZWVuLGlzSW5Xb3JrZXI6IXJ9 O3QuZXhwb3J0cz1vfSx7fV0sMTI0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0 aW9uIHIoZSl7cmV0dXJuIGUucmVwbGFjZShvLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQudG9VcHBl ckNhc2UoKX0pfXZhciBvPS8tKC4pL2c7dC5leHBvcnRzPXJ9LHt9XSwxMjU6W2Z1bmN0aW9uKGUs dCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gbyhlLnJlcGxhY2UoaSwibXMt IikpfXZhciBvPWUoMTI0KSxpPS9eLW1zLS87dC5leHBvcnRzPXJ9LHsxMjQ6MTI0fV0sMTI2Oltm dW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4hKCFlfHwh dCkmJihlPT09dHx8IW8oZSkmJihvKHQpP3IoZSx0LnBhcmVudE5vZGUpOiJjb250YWlucyJpbiBl P2UuY29udGFpbnModCk6ISFlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYhISgxNiZlLmNvbXBh cmVEb2N1bWVudFBvc2l0aW9uKHQpKSkpfXZhciBvPWUoMTM5KTt0LmV4cG9ydHM9cn0sezEzOTox Mzl9XSwxMjc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt2YXIg dD1lLmxlbmd0aDtpZihBcnJheS5pc0FycmF5KGUpfHwib2JqZWN0IiE9dHlwZW9mIGUmJiJmdW5j dGlvbiIhPXR5cGVvZiBlP2EoITEpOnZvaWQgMCwibnVtYmVyIiE9dHlwZW9mIHQ/YSghMSk6dm9p ZCAwLDA9PT10fHx0LTEgaW4gZT92b2lkIDA6YSghMSksImZ1bmN0aW9uIj09dHlwZW9mIGUuY2Fs bGVlP2EoITEpOnZvaWQgMCxlLmhhc093blByb3BlcnR5KXRyeXtyZXR1cm4gQXJyYXkucHJvdG90 eXBlLnNsaWNlLmNhbGwoZSl9Y2F0Y2goZSl7fWZvcih2YXIgbj1BcnJheSh0KSxyPTA7cjx0O3Ir KyluW3JdPWVbcl07cmV0dXJuIG59ZnVuY3Rpb24gbyhlKXtyZXR1cm4hIWUmJigib2JqZWN0Ij09 dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlKSYmImxlbmd0aCJpbiBlJiYhKCJzZXRJbnRl cnZhbCJpbiBlKSYmIm51bWJlciIhPXR5cGVvZiBlLm5vZGVUeXBlJiYoQXJyYXkuaXNBcnJheShl KXx8ImNhbGxlZSJpbiBlfHwiaXRlbSJpbiBlKX1mdW5jdGlvbiBpKGUpe3JldHVybiBvKGUpP0Fy cmF5LmlzQXJyYXkoZSk/ZS5zbGljZSgpOnIoZSk6W2VdfXZhciBhPWUoMTM3KTt0LmV4cG9ydHM9 aX0sezEzNzoxMzd9XSwxMjg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24g cihlKXt2YXIgdD1lLm1hdGNoKGMpO3JldHVybiB0JiZ0WzFdLnRvTG93ZXJDYXNlKCl9ZnVuY3Rp b24gbyhlLHQpe3ZhciBuPWw7bD92b2lkIDA6dSghMSk7dmFyIG89cihlKSxpPW8mJnMobyk7aWYo aSl7bi5pbm5lckhUTUw9aVsxXStlK2lbMl07Zm9yKHZhciBjPWlbMF07Yy0tOyluPW4ubGFzdENo aWxkfWVsc2Ugbi5pbm5lckhUTUw9ZTt2YXIgcD1uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3Jp cHQiKTtwLmxlbmd0aCYmKHQ/dm9pZCAwOnUoITEpLGEocCkuZm9yRWFjaCh0KSk7Zm9yKHZhciBk PUFycmF5LmZyb20obi5jaGlsZE5vZGVzKTtuLmxhc3RDaGlsZDspbi5yZW1vdmVDaGlsZChuLmxh c3RDaGlsZCk7cmV0dXJuIGR9dmFyIGk9ZSgxMjMpLGE9ZSgxMjcpLHM9ZSgxMzMpLHU9ZSgxMzcp LGw9aS5jYW5Vc2VET00/ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik6bnVsbCxjPS9eXHMq PChcdyspLzt0LmV4cG9ydHM9b30sezEyMzoxMjMsMTI3OjEyNywxMzM6MTMzLDEzNzoxMzd9XSwx Mjk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZnVu Y3Rpb24oKXtyZXR1cm4gZX19dmFyIG89ZnVuY3Rpb24oKXt9O28udGhhdFJldHVybnM9cixvLnRo YXRSZXR1cm5zRmFsc2U9cighMSksby50aGF0UmV0dXJuc1RydWU9cighMCksby50aGF0UmV0dXJu c051bGw9cihudWxsKSxvLnRoYXRSZXR1cm5zVGhpcz1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxv LnRoYXRSZXR1cm5zQXJndW1lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHQuZXhwb3J0cz1vfSx7 fV0sMTMwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXt9O3QuZXhwb3J0cz1y fSx7fV0sMTMxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dHJ5 e2UuZm9jdXMoKX1jYXRjaChlKXt9fXQuZXhwb3J0cz1yfSx7fV0sMTMyOltmdW5jdGlvbihlLHQs bil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIGRvY3Vt ZW50KXJldHVybiBudWxsO3RyeXtyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudHx8ZG9jdW1l bnQuYm9keX1jYXRjaChlKXtyZXR1cm4gZG9jdW1lbnQuYm9keX19dC5leHBvcnRzPXJ9LHt9XSwx MzM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gYT92 b2lkIDA6aSghMSksZC5oYXNPd25Qcm9wZXJ0eShlKXx8KGU9IioiKSxzLmhhc093blByb3BlcnR5 KGUpfHwoIioiPT09ZT9hLmlubmVySFRNTD0iPGxpbmsgLz4iOmEuaW5uZXJIVE1MPSI8IitlKyI+ PC8iK2UrIj4iLHNbZV09IWEuZmlyc3RDaGlsZCksc1tlXT9kW2VdOm51bGx9dmFyIG89ZSgxMjMp LGk9ZSgxMzcpLGE9by5jYW5Vc2VET00/ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik6bnVs bCxzPXt9LHU9WzEsJzxzZWxlY3QgbXVsdGlwbGU9InRydWUiPicsIjwvc2VsZWN0PiJdLGw9WzEs Ijx0YWJsZT4iLCI8L3RhYmxlPiJdLGM9WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90 Ym9keT48L3RhYmxlPiJdLHA9WzEsJzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAv c3ZnIj4nLCI8L3N2Zz4iXSxkPXsiKiI6WzEsIj88ZGl2PiIsIjwvZGl2PiJdLGFyZWE6WzEsIjxt YXA+IiwiPC9tYXA+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIs IjwvY29sZ3JvdXA+PC90YWJsZT4iXSxsZWdlbmQ6WzEsIjxmaWVsZHNldD4iLCI8L2ZpZWxkc2V0 PiJdLHBhcmFtOlsxLCI8b2JqZWN0PiIsIjwvb2JqZWN0PiJdLHRyOlsyLCI8dGFibGU+PHRib2R5 PiIsIjwvdGJvZHk+PC90YWJsZT4iXSxvcHRncm91cDp1LG9wdGlvbjp1LGNhcHRpb246bCxjb2xn cm91cDpsLHRib2R5OmwsdGZvb3Q6bCx0aGVhZDpsLHRkOmMsdGg6Y30sZj1bImNpcmNsZSIsImNs aXBQYXRoIiwiZGVmcyIsImVsbGlwc2UiLCJnIiwiaW1hZ2UiLCJsaW5lIiwibGluZWFyR3JhZGll bnQiLCJtYXNrIiwicGF0aCIsInBhdHRlcm4iLCJwb2x5Z29uIiwicG9seWxpbmUiLCJyYWRpYWxH cmFkaWVudCIsInJlY3QiLCJzdG9wIiwidGV4dCIsInRzcGFuIl07Zi5mb3JFYWNoKGZ1bmN0aW9u KGUpe2RbZV09cCxzW2VdPSEwfSksdC5leHBvcnRzPXJ9LHsxMjM6MTIzLDEzNzoxMzd9XSwxMzQ6 W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZT09PXdp bmRvdz97eDp3aW5kb3cucGFnZVhPZmZzZXR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3Jv bGxMZWZ0LHk6d2luZG93LnBhZ2VZT2Zmc2V0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Ny b2xsVG9wfTp7eDplLnNjcm9sbExlZnQseTplLnNjcm9sbFRvcH19dC5leHBvcnRzPXJ9LHt9XSwx MzU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZS5y ZXBsYWNlKG8sIi0kMSIpLnRvTG93ZXJDYXNlKCl9dmFyIG89LyhbQS1aXSkvZzt0LmV4cG9ydHM9 cn0se31dLDEzNjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3Jl dHVybiBvKGUpLnJlcGxhY2UoaSwiLW1zLSIpfXZhciBvPWUoMTM1KSxpPS9ebXMtLzt0LmV4cG9y dHM9cn0sezEzNToxMzV9XSwxMzc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rp b24gcihlLHQsbixyLGksYSxzLHUpe2lmKG8odCksIWUpe3ZhciBsO2lmKHZvaWQgMD09PXQpbD1u ZXcgRXJyb3IoIk1pbmlmaWVkIGV4Y2VwdGlvbiBvY2N1cnJlZDsgdXNlIHRoZSBub24tbWluaWZp ZWQgZGV2IGVudmlyb25tZW50IGZvciB0aGUgZnVsbCBlcnJvciBtZXNzYWdlIGFuZCBhZGRpdGlv bmFsIGhlbHBmdWwgd2FybmluZ3MuIik7ZWxzZXt2YXIgYz1bbixyLGksYSxzLHVdLHA9MDtsPW5l dyBFcnJvcih0LnJlcGxhY2UoLyVzL2csZnVuY3Rpb24oKXtyZXR1cm4gY1twKytdfSkpLGwubmFt ZT0iSW52YXJpYW50IFZpb2xhdGlvbiJ9dGhyb3cgbC5mcmFtZXNUb1BvcD0xLGx9fXZhciBvPWZ1 bmN0aW9uKGUpe307dC5leHBvcnRzPXJ9LHt9XSwxMzg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0 cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4hKCFlfHwhKCJmdW5jdGlvbiI9PXR5cGVvZiBOb2Rl P2UgaW5zdGFuY2VvZiBOb2RlOiJvYmplY3QiPT10eXBlb2YgZSYmIm51bWJlciI9PXR5cGVvZiBl Lm5vZGVUeXBlJiYic3RyaW5nIj09dHlwZW9mIGUubm9kZU5hbWUpKX10LmV4cG9ydHM9cn0se31d LDEzOTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBv KGUpJiYzPT1lLm5vZGVUeXBlfXZhciBvPWUoMTM4KTt0LmV4cG9ydHM9cn0sezEzODoxMzh9XSwx NDA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt2YXIgdD17fTty ZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQuaGFzT3duUHJvcGVydHkobil8fCh0W25dPWUuY2Fs bCh0aGlzLG4pKSx0W25dfX10LmV4cG9ydHM9cn0se31dLDE0MTpbZnVuY3Rpb24oZSx0LG4peyJ1 c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIGU9PT10PzAhPT1lfHwwIT09dHx8MS9l PT09MS90OmUhPT1lJiZ0IT09dH1mdW5jdGlvbiBvKGUsdCl7aWYocihlLHQpKXJldHVybiEwO2lm KCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWV8fCJvYmplY3QiIT10eXBlb2YgdHx8bnVsbD09 PXQpcmV0dXJuITE7dmFyIG49T2JqZWN0LmtleXMoZSksbz1PYmplY3Qua2V5cyh0KTtpZihuLmxl bmd0aCE9PW8ubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgYT0wO2E8bi5sZW5ndGg7YSsrKWlmKCFp LmNhbGwodCxuW2FdKXx8IXIoZVtuW2FdXSx0W25bYV1dKSlyZXR1cm4hMTtyZXR1cm4hMH12YXIg aT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3QuZXhwb3J0cz1vfSx7fV0sMTQyOltm dW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTI5KSxvPXI7dC5leHBvcnRzPW99 LHsxMjk6MTI5fV0sMTQzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIo ZSl7aWYobnVsbD09PWV8fHZvaWQgMD09PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0LmFz c2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQiKTtyZXR1cm4gT2Jq ZWN0KGUpfWZ1bmN0aW9uIG8oKXt0cnl7aWYoIU9iamVjdC5hc3NpZ24pcmV0dXJuITE7dmFyIGU9 bmV3IFN0cmluZygiYWJjIik7aWYoZVs1XT0iZGUiLCI1Ij09PU9iamVjdC5nZXRPd25Qcm9wZXJ0 eU5hbWVzKGUpWzBdKXJldHVybiExO2Zvcih2YXIgdD17fSxuPTA7bjwxMDtuKyspdFsiXyIrU3Ry aW5nLmZyb21DaGFyQ29kZShuKV09bjt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0 KS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19KTtpZigiMDEyMzQ1Njc4OSIhPT1yLmpvaW4o IiIpKXJldHVybiExO3ZhciBvPXt9O3JldHVybiJhYmNkZWZnaGlqa2xtbm9wcXJzdCIuc3BsaXQo IiIpLmZvckVhY2goZnVuY3Rpb24oZSl7b1tlXT1lfSksImFiY2RlZmdoaWprbG1ub3BxcnN0Ij09 PU9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sbykpLmpvaW4oIiIpfWNhdGNoKGUpe3JldHVy biExfX12YXIgaT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGE9T2JqZWN0LnByb3Rv dHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt0LmV4cG9ydHM9bygpP09iamVjdC5hc3NpZ246ZnVu Y3Rpb24oZSx0KXtmb3IodmFyIG4sbyxzPXIoZSksdT0xO3U8YXJndW1lbnRzLmxlbmd0aDt1Kysp e249T2JqZWN0KGFyZ3VtZW50c1t1XSk7Zm9yKHZhciBsIGluIG4paS5jYWxsKG4sbCkmJihzW2xd PW5bbF0pO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe289T2JqZWN0LmdldE93blBy b3BlcnR5U3ltYm9scyhuKTtmb3IodmFyIGM9MDtjPG8ubGVuZ3RoO2MrKylhLmNhbGwobixvW2Nd KSYmKHNbb1tjXV09bltvW2NdXSl9fXJldHVybiBzfX0se31dfSx7fSxbNDVdKSg0NSl9KX0pOwpc IE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyhmdW5jdGlvbihmKXtpZih0eXBlb2YgZXhwb3J0 cz09PSJvYmplY3QiJiZ0eXBlb2YgbW9kdWxlIT09InVuZGVmaW5lZCIpe21vZHVsZS5leHBvcnRz PWYocmVxdWlyZSgicmVhY3QiKSl9ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT09ImZ1bmN0aW9uIiYm ZGVmaW5lLmFtZCl7ZGVmaW5lKFsicmVhY3QiXSxmKX1lbHNle3ZhciBnO2lmKHR5cGVvZiB3aW5k b3chPT0idW5kZWZpbmVkIil7Zz13aW5kb3d9ZWxzZSBpZih0eXBlb2YgZ2xvYmFsIT09InVuZGVm aW5lZCIpe2c9Z2xvYmFsfWVsc2UgaWYodHlwZW9mIHNlbGYhPT0idW5kZWZpbmVkIil7Zz1zZWxm fWVsc2V7Zz10aGlzfWcuUmVhY3RET009ZihnLlJlYWN0KX19KShmdW5jdGlvbihSZWFjdCl7cmV0 dXJuIGZ1bmN0aW9uKGYpe3JldHVybiBmKCl9KGZ1bmN0aW9uKCl7dmFyIGRlZmluZSxtb2R1bGUs ZXhwb3J0cztyZXR1cm4gZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29d KXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PSJmdW5jdGlvbiImJnJlcXVpcmU7aWYo IXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3Io IkNhbm5vdCBmaW5kIG1vZHVsZSAnIitvKyInIik7dGhyb3cgZi5jb2RlPSJNT0RVTEVfTk9UX0ZP VU5EIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVu Y3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUs dCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PSJmdW5jdGlv biImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30o ezE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgQVJJ QURPTVByb3BlcnR5Q29uZmlnPXtQcm9wZXJ0aWVzOnsiYXJpYS1jdXJyZW50IjowLCJhcmlhLWRl dGFpbHMiOjAsImFyaWEtZGlzYWJsZWQiOjAsImFyaWEtaGlkZGVuIjowLCJhcmlhLWludmFsaWQi OjAsImFyaWEta2V5c2hvcnRjdXRzIjowLCJhcmlhLWxhYmVsIjowLCJhcmlhLXJvbGVkZXNjcmlw dGlvbiI6MCwiYXJpYS1hdXRvY29tcGxldGUiOjAsImFyaWEtY2hlY2tlZCI6MCwiYXJpYS1leHBh bmRlZCI6MCwiYXJpYS1oYXNwb3B1cCI6MCwiYXJpYS1sZXZlbCI6MCwiYXJpYS1tb2RhbCI6MCwi YXJpYS1tdWx0aWxpbmUiOjAsImFyaWEtbXVsdGlzZWxlY3RhYmxlIjowLCJhcmlhLW9yaWVudGF0 aW9uIjowLCJhcmlhLXBsYWNlaG9sZGVyIjowLCJhcmlhLXByZXNzZWQiOjAsImFyaWEtcmVhZG9u bHkiOjAsImFyaWEtcmVxdWlyZWQiOjAsImFyaWEtc2VsZWN0ZWQiOjAsImFyaWEtc29ydCI6MCwi YXJpYS12YWx1ZW1heCI6MCwiYXJpYS12YWx1ZW1pbiI6MCwiYXJpYS12YWx1ZW5vdyI6MCwiYXJp YS12YWx1ZXRleHQiOjAsImFyaWEtYXRvbWljIjowLCJhcmlhLWJ1c3kiOjAsImFyaWEtbGl2ZSI6 MCwiYXJpYS1yZWxldmFudCI6MCwiYXJpYS1kcm9wZWZmZWN0IjowLCJhcmlhLWdyYWJiZWQiOjAs ImFyaWEtYWN0aXZlZGVzY2VuZGFudCI6MCwiYXJpYS1jb2xjb3VudCI6MCwiYXJpYS1jb2xpbmRl eCI6MCwiYXJpYS1jb2xzcGFuIjowLCJhcmlhLWNvbnRyb2xzIjowLCJhcmlhLWRlc2NyaWJlZGJ5 IjowLCJhcmlhLWVycm9ybWVzc2FnZSI6MCwiYXJpYS1mbG93dG8iOjAsImFyaWEtbGFiZWxsZWRi eSI6MCwiYXJpYS1vd25zIjowLCJhcmlhLXBvc2luc2V0IjowLCJhcmlhLXJvd2NvdW50IjowLCJh cmlhLXJvd2luZGV4IjowLCJhcmlhLXJvd3NwYW4iOjAsImFyaWEtc2V0c2l6ZSI6MH0sRE9NQXR0 cmlidXRlTmFtZXM6e30sRE9NUHJvcGVydHlOYW1lczp7fX07bW9kdWxlLmV4cG9ydHM9QVJJQURP TVByb3BlcnR5Q29uZmlnfSx7fV0sMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7 InVzZSBzdHJpY3QiO3ZhciBSZWFjdERPTUNvbXBvbmVudFRyZWU9X2RlcmVxXygzNCk7dmFyIGZv Y3VzTm9kZT1fZGVyZXFfKDE0NCk7dmFyIEF1dG9Gb2N1c1V0aWxzPXtmb2N1c0RPTUNvbXBvbmVu dDpmdW5jdGlvbigpe2ZvY3VzTm9kZShSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21J bnN0YW5jZSh0aGlzKSl9fTttb2R1bGUuZXhwb3J0cz1BdXRvRm9jdXNVdGlsc30sezE0NDoxNDQs MzQ6MzR9XSwzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7 dmFyIEV2ZW50UHJvcGFnYXRvcnM9X2RlcmVxXygyMCk7dmFyIEV4ZWN1dGlvbkVudmlyb25tZW50 PV9kZXJlcV8oMTM2KTt2YXIgRmFsbGJhY2tDb21wb3NpdGlvblN0YXRlPV9kZXJlcV8oMjEpO3Zh ciBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50PV9kZXJlcV8oODkpO3ZhciBTeW50aGV0aWNJbnB1 dEV2ZW50PV9kZXJlcV8oOTMpO3ZhciBFTkRfS0VZQ09ERVM9WzksMTMsMjcsMzJdO3ZhciBTVEFS VF9LRVlDT0RFPTIyOTt2YXIgY2FuVXNlQ29tcG9zaXRpb25FdmVudD1FeGVjdXRpb25FbnZpcm9u bWVudC5jYW5Vc2VET00mJiJDb21wb3NpdGlvbkV2ZW50ImluIHdpbmRvdzt2YXIgZG9jdW1lbnRN b2RlPW51bGw7aWYoRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NJiYiZG9jdW1lbnRNb2Rl ImluIGRvY3VtZW50KXtkb2N1bWVudE1vZGU9ZG9jdW1lbnQuZG9jdW1lbnRNb2RlfXZhciBjYW5V c2VUZXh0SW5wdXRFdmVudD1FeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00mJiJUZXh0RXZl bnQiaW4gd2luZG93JiYhZG9jdW1lbnRNb2RlJiYhaXNQcmVzdG8oKTt2YXIgdXNlRmFsbGJhY2tD b21wb3NpdGlvbkRhdGE9RXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NJiYoIWNhblVzZUNv bXBvc2l0aW9uRXZlbnR8fGRvY3VtZW50TW9kZSYmZG9jdW1lbnRNb2RlPjgmJmRvY3VtZW50TW9k ZTw9MTEpO2Z1bmN0aW9uIGlzUHJlc3RvKCl7dmFyIG9wZXJhPXdpbmRvdy5vcGVyYTtyZXR1cm4g dHlwZW9mIG9wZXJhPT09Im9iamVjdCImJnR5cGVvZiBvcGVyYS52ZXJzaW9uPT09ImZ1bmN0aW9u IiYmcGFyc2VJbnQob3BlcmEudmVyc2lvbigpLDEwKTw9MTJ9dmFyIFNQQUNFQkFSX0NPREU9MzI7 dmFyIFNQQUNFQkFSX0NIQVI9U3RyaW5nLmZyb21DaGFyQ29kZShTUEFDRUJBUl9DT0RFKTt2YXIg ZXZlbnRUeXBlcz17YmVmb3JlSW5wdXQ6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVk OiJvbkJlZm9yZUlucHV0IixjYXB0dXJlZDoib25CZWZvcmVJbnB1dENhcHR1cmUifSxkZXBlbmRl bmNpZXM6WyJ0b3BDb21wb3NpdGlvbkVuZCIsInRvcEtleVByZXNzIiwidG9wVGV4dElucHV0Iiwi dG9wUGFzdGUiXX0sY29tcG9zaXRpb25FbmQ6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJi bGVkOiJvbkNvbXBvc2l0aW9uRW5kIixjYXB0dXJlZDoib25Db21wb3NpdGlvbkVuZENhcHR1cmUi fSxkZXBlbmRlbmNpZXM6WyJ0b3BCbHVyIiwidG9wQ29tcG9zaXRpb25FbmQiLCJ0b3BLZXlEb3du IiwidG9wS2V5UHJlc3MiLCJ0b3BLZXlVcCIsInRvcE1vdXNlRG93biJdfSxjb21wb3NpdGlvblN0 YXJ0OntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDoib25Db21wb3NpdGlvblN0YXJ0 IixjYXB0dXJlZDoib25Db21wb3NpdGlvblN0YXJ0Q2FwdHVyZSJ9LGRlcGVuZGVuY2llczpbInRv cEJsdXIiLCJ0b3BDb21wb3NpdGlvblN0YXJ0IiwidG9wS2V5RG93biIsInRvcEtleVByZXNzIiwi dG9wS2V5VXAiLCJ0b3BNb3VzZURvd24iXX0sY29tcG9zaXRpb25VcGRhdGU6e3BoYXNlZFJlZ2lz dHJhdGlvbk5hbWVzOntidWJibGVkOiJvbkNvbXBvc2l0aW9uVXBkYXRlIixjYXB0dXJlZDoib25D b21wb3NpdGlvblVwZGF0ZUNhcHR1cmUifSxkZXBlbmRlbmNpZXM6WyJ0b3BCbHVyIiwidG9wQ29t cG9zaXRpb25VcGRhdGUiLCJ0b3BLZXlEb3duIiwidG9wS2V5UHJlc3MiLCJ0b3BLZXlVcCIsInRv cE1vdXNlRG93biJdfX07dmFyIGhhc1NwYWNlS2V5cHJlc3M9ZmFsc2U7ZnVuY3Rpb24gaXNLZXlw cmVzc0NvbW1hbmQobmF0aXZlRXZlbnQpe3JldHVybihuYXRpdmVFdmVudC5jdHJsS2V5fHxuYXRp dmVFdmVudC5hbHRLZXl8fG5hdGl2ZUV2ZW50Lm1ldGFLZXkpJiYhKG5hdGl2ZUV2ZW50LmN0cmxL ZXkmJm5hdGl2ZUV2ZW50LmFsdEtleSl9ZnVuY3Rpb24gZ2V0Q29tcG9zaXRpb25FdmVudFR5cGUo dG9wTGV2ZWxUeXBlKXtzd2l0Y2godG9wTGV2ZWxUeXBlKXtjYXNlInRvcENvbXBvc2l0aW9uU3Rh cnQiOnJldHVybiBldmVudFR5cGVzLmNvbXBvc2l0aW9uU3RhcnQ7Y2FzZSJ0b3BDb21wb3NpdGlv bkVuZCI6cmV0dXJuIGV2ZW50VHlwZXMuY29tcG9zaXRpb25FbmQ7Y2FzZSJ0b3BDb21wb3NpdGlv blVwZGF0ZSI6cmV0dXJuIGV2ZW50VHlwZXMuY29tcG9zaXRpb25VcGRhdGV9fWZ1bmN0aW9uIGlz RmFsbGJhY2tDb21wb3NpdGlvblN0YXJ0KHRvcExldmVsVHlwZSxuYXRpdmVFdmVudCl7cmV0dXJu IHRvcExldmVsVHlwZT09PSJ0b3BLZXlEb3duIiYmbmF0aXZlRXZlbnQua2V5Q29kZT09PVNUQVJU X0tFWUNPREV9ZnVuY3Rpb24gaXNGYWxsYmFja0NvbXBvc2l0aW9uRW5kKHRvcExldmVsVHlwZSxu YXRpdmVFdmVudCl7c3dpdGNoKHRvcExldmVsVHlwZSl7Y2FzZSJ0b3BLZXlVcCI6cmV0dXJuIEVO RF9LRVlDT0RFUy5pbmRleE9mKG5hdGl2ZUV2ZW50LmtleUNvZGUpIT09LTE7Y2FzZSJ0b3BLZXlE b3duIjpyZXR1cm4gbmF0aXZlRXZlbnQua2V5Q29kZSE9PVNUQVJUX0tFWUNPREU7Y2FzZSJ0b3BL ZXlQcmVzcyI6Y2FzZSJ0b3BNb3VzZURvd24iOmNhc2UidG9wQmx1ciI6cmV0dXJuIHRydWU7ZGVm YXVsdDpyZXR1cm4gZmFsc2V9fWZ1bmN0aW9uIGdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZl RXZlbnQpe3ZhciBkZXRhaWw9bmF0aXZlRXZlbnQuZGV0YWlsO2lmKHR5cGVvZiBkZXRhaWw9PT0i b2JqZWN0IiYmImRhdGEiaW4gZGV0YWlsKXtyZXR1cm4gZGV0YWlsLmRhdGF9cmV0dXJuIG51bGx9 dmFyIGN1cnJlbnRDb21wb3NpdGlvbj1udWxsO2Z1bmN0aW9uIGV4dHJhY3RDb21wb3NpdGlvbkV2 ZW50KHRvcExldmVsVHlwZSx0YXJnZXRJbnN0LG5hdGl2ZUV2ZW50LG5hdGl2ZUV2ZW50VGFyZ2V0 KXt2YXIgZXZlbnRUeXBlO3ZhciBmYWxsYmFja0RhdGE7aWYoY2FuVXNlQ29tcG9zaXRpb25FdmVu dCl7ZXZlbnRUeXBlPWdldENvbXBvc2l0aW9uRXZlbnRUeXBlKHRvcExldmVsVHlwZSl9ZWxzZSBp ZighY3VycmVudENvbXBvc2l0aW9uKXtpZihpc0ZhbGxiYWNrQ29tcG9zaXRpb25TdGFydCh0b3BM ZXZlbFR5cGUsbmF0aXZlRXZlbnQpKXtldmVudFR5cGU9ZXZlbnRUeXBlcy5jb21wb3NpdGlvblN0 YXJ0fX1lbHNlIGlmKGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZCh0b3BMZXZlbFR5cGUsbmF0aXZl RXZlbnQpKXtldmVudFR5cGU9ZXZlbnRUeXBlcy5jb21wb3NpdGlvbkVuZH1pZighZXZlbnRUeXBl KXtyZXR1cm4gbnVsbH1pZih1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSl7aWYoIWN1cnJlbnRD b21wb3NpdGlvbiYmZXZlbnRUeXBlPT09ZXZlbnRUeXBlcy5jb21wb3NpdGlvblN0YXJ0KXtjdXJy ZW50Q29tcG9zaXRpb249RmFsbGJhY2tDb21wb3NpdGlvblN0YXRlLmdldFBvb2xlZChuYXRpdmVF dmVudFRhcmdldCl9ZWxzZSBpZihldmVudFR5cGU9PT1ldmVudFR5cGVzLmNvbXBvc2l0aW9uRW5k KXtpZihjdXJyZW50Q29tcG9zaXRpb24pe2ZhbGxiYWNrRGF0YT1jdXJyZW50Q29tcG9zaXRpb24u Z2V0RGF0YSgpfX19dmFyIGV2ZW50PVN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQuZ2V0UG9vbGVk KGV2ZW50VHlwZSx0YXJnZXRJbnN0LG5hdGl2ZUV2ZW50LG5hdGl2ZUV2ZW50VGFyZ2V0KTtpZihm YWxsYmFja0RhdGEpe2V2ZW50LmRhdGE9ZmFsbGJhY2tEYXRhfWVsc2V7dmFyIGN1c3RvbURhdGE9 Z2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCk7aWYoY3VzdG9tRGF0YSE9PW51bGwp e2V2ZW50LmRhdGE9Y3VzdG9tRGF0YX19RXZlbnRQcm9wYWdhdG9ycy5hY2N1bXVsYXRlVHdvUGhh c2VEaXNwYXRjaGVzKGV2ZW50KTtyZXR1cm4gZXZlbnR9ZnVuY3Rpb24gZ2V0TmF0aXZlQmVmb3Jl SW5wdXRDaGFycyh0b3BMZXZlbFR5cGUsbmF0aXZlRXZlbnQpe3N3aXRjaCh0b3BMZXZlbFR5cGUp e2Nhc2UidG9wQ29tcG9zaXRpb25FbmQiOnJldHVybiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5h dGl2ZUV2ZW50KTtjYXNlInRvcEtleVByZXNzIjp2YXIgd2hpY2g9bmF0aXZlRXZlbnQud2hpY2g7 aWYod2hpY2ghPT1TUEFDRUJBUl9DT0RFKXtyZXR1cm4gbnVsbH1oYXNTcGFjZUtleXByZXNzPXRy dWU7cmV0dXJuIFNQQUNFQkFSX0NIQVI7Y2FzZSJ0b3BUZXh0SW5wdXQiOnZhciBjaGFycz1uYXRp dmVFdmVudC5kYXRhO2lmKGNoYXJzPT09U1BBQ0VCQVJfQ0hBUiYmaGFzU3BhY2VLZXlwcmVzcyl7 cmV0dXJuIG51bGx9cmV0dXJuIGNoYXJzO2RlZmF1bHQ6cmV0dXJuIG51bGx9fWZ1bmN0aW9uIGdl dEZhbGxiYWNrQmVmb3JlSW5wdXRDaGFycyh0b3BMZXZlbFR5cGUsbmF0aXZlRXZlbnQpe2lmKGN1 cnJlbnRDb21wb3NpdGlvbil7aWYodG9wTGV2ZWxUeXBlPT09InRvcENvbXBvc2l0aW9uRW5kInx8 IWNhblVzZUNvbXBvc2l0aW9uRXZlbnQmJmlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZCh0b3BMZXZl bFR5cGUsbmF0aXZlRXZlbnQpKXt2YXIgY2hhcnM9Y3VycmVudENvbXBvc2l0aW9uLmdldERhdGEo KTtGYWxsYmFja0NvbXBvc2l0aW9uU3RhdGUucmVsZWFzZShjdXJyZW50Q29tcG9zaXRpb24pO2N1 cnJlbnRDb21wb3NpdGlvbj1udWxsO3JldHVybiBjaGFyc31yZXR1cm4gbnVsbH1zd2l0Y2godG9w TGV2ZWxUeXBlKXtjYXNlInRvcFBhc3RlIjpyZXR1cm4gbnVsbDtjYXNlInRvcEtleVByZXNzIjpp ZihuYXRpdmVFdmVudC53aGljaCYmIWlzS2V5cHJlc3NDb21tYW5kKG5hdGl2ZUV2ZW50KSl7cmV0 dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUobmF0aXZlRXZlbnQud2hpY2gpfXJldHVybiBudWxsO2Nh c2UidG9wQ29tcG9zaXRpb25FbmQiOnJldHVybiB1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YT9u dWxsOm5hdGl2ZUV2ZW50LmRhdGE7ZGVmYXVsdDpyZXR1cm4gbnVsbH19ZnVuY3Rpb24gZXh0cmFj dEJlZm9yZUlucHV0RXZlbnQodG9wTGV2ZWxUeXBlLHRhcmdldEluc3QsbmF0aXZlRXZlbnQsbmF0 aXZlRXZlbnRUYXJnZXQpe3ZhciBjaGFycztpZihjYW5Vc2VUZXh0SW5wdXRFdmVudCl7Y2hhcnM9 Z2V0TmF0aXZlQmVmb3JlSW5wdXRDaGFycyh0b3BMZXZlbFR5cGUsbmF0aXZlRXZlbnQpfWVsc2V7 Y2hhcnM9Z2V0RmFsbGJhY2tCZWZvcmVJbnB1dENoYXJzKHRvcExldmVsVHlwZSxuYXRpdmVFdmVu dCl9aWYoIWNoYXJzKXtyZXR1cm4gbnVsbH12YXIgZXZlbnQ9U3ludGhldGljSW5wdXRFdmVudC5n ZXRQb29sZWQoZXZlbnRUeXBlcy5iZWZvcmVJbnB1dCx0YXJnZXRJbnN0LG5hdGl2ZUV2ZW50LG5h dGl2ZUV2ZW50VGFyZ2V0KTtldmVudC5kYXRhPWNoYXJzO0V2ZW50UHJvcGFnYXRvcnMuYWNjdW11 bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyhldmVudCk7cmV0dXJuIGV2ZW50fXZhciBCZWZvcmVJbnB1 dEV2ZW50UGx1Z2luPXtldmVudFR5cGVzOmV2ZW50VHlwZXMsZXh0cmFjdEV2ZW50czpmdW5jdGlv bih0b3BMZXZlbFR5cGUsdGFyZ2V0SW5zdCxuYXRpdmVFdmVudCxuYXRpdmVFdmVudFRhcmdldCl7 cmV0dXJuW2V4dHJhY3RDb21wb3NpdGlvbkV2ZW50KHRvcExldmVsVHlwZSx0YXJnZXRJbnN0LG5h dGl2ZUV2ZW50LG5hdGl2ZUV2ZW50VGFyZ2V0KSxleHRyYWN0QmVmb3JlSW5wdXRFdmVudCh0b3BM ZXZlbFR5cGUsdGFyZ2V0SW5zdCxuYXRpdmVFdmVudCxuYXRpdmVFdmVudFRhcmdldCldfX07bW9k dWxlLmV4cG9ydHM9QmVmb3JlSW5wdXRFdmVudFBsdWdpbn0sezEzNjoxMzYsMjA6MjAsMjE6MjEs ODk6ODksOTM6OTN9XSw0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0 cmljdCI7dmFyIGlzVW5pdGxlc3NOdW1iZXI9e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OnRydWUs Ym9yZGVySW1hZ2VPdXRzZXQ6dHJ1ZSxib3JkZXJJbWFnZVNsaWNlOnRydWUsYm9yZGVySW1hZ2VX aWR0aDp0cnVlLGJveEZsZXg6dHJ1ZSxib3hGbGV4R3JvdXA6dHJ1ZSxib3hPcmRpbmFsR3JvdXA6 dHJ1ZSxjb2x1bW5Db3VudDp0cnVlLGZsZXg6dHJ1ZSxmbGV4R3Jvdzp0cnVlLGZsZXhQb3NpdGl2 ZTp0cnVlLGZsZXhTaHJpbms6dHJ1ZSxmbGV4TmVnYXRpdmU6dHJ1ZSxmbGV4T3JkZXI6dHJ1ZSxn cmlkUm93OnRydWUsZ3JpZENvbHVtbjp0cnVlLGZvbnRXZWlnaHQ6dHJ1ZSxsaW5lQ2xhbXA6dHJ1 ZSxsaW5lSGVpZ2h0OnRydWUsb3BhY2l0eTp0cnVlLG9yZGVyOnRydWUsb3JwaGFuczp0cnVlLHRh YlNpemU6dHJ1ZSx3aWRvd3M6dHJ1ZSx6SW5kZXg6dHJ1ZSx6b29tOnRydWUsZmlsbE9wYWNpdHk6 dHJ1ZSxmbG9vZE9wYWNpdHk6dHJ1ZSxzdG9wT3BhY2l0eTp0cnVlLHN0cm9rZURhc2hhcnJheTp0 cnVlLHN0cm9rZURhc2hvZmZzZXQ6dHJ1ZSxzdHJva2VNaXRlcmxpbWl0OnRydWUsc3Ryb2tlT3Bh Y2l0eTp0cnVlLHN0cm9rZVdpZHRoOnRydWV9O2Z1bmN0aW9uIHByZWZpeEtleShwcmVmaXgsa2V5 KXtyZXR1cm4gcHJlZml4K2tleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStrZXkuc3Vic3RyaW5n KDEpfXZhciBwcmVmaXhlcz1bIldlYmtpdCIsIm1zIiwiTW96IiwiTyJdO09iamVjdC5rZXlzKGlz VW5pdGxlc3NOdW1iZXIpLmZvckVhY2goZnVuY3Rpb24ocHJvcCl7cHJlZml4ZXMuZm9yRWFjaChm dW5jdGlvbihwcmVmaXgpe2lzVW5pdGxlc3NOdW1iZXJbcHJlZml4S2V5KHByZWZpeCxwcm9wKV09 aXNVbml0bGVzc051bWJlcltwcm9wXX0pfSk7dmFyIHNob3J0aGFuZFByb3BlcnR5RXhwYW5zaW9u cz17YmFja2dyb3VuZDp7YmFja2dyb3VuZEF0dGFjaG1lbnQ6dHJ1ZSxiYWNrZ3JvdW5kQ29sb3I6 dHJ1ZSxiYWNrZ3JvdW5kSW1hZ2U6dHJ1ZSxiYWNrZ3JvdW5kUG9zaXRpb25YOnRydWUsYmFja2dy b3VuZFBvc2l0aW9uWTp0cnVlLGJhY2tncm91bmRSZXBlYXQ6dHJ1ZX0sYmFja2dyb3VuZFBvc2l0 aW9uOntiYWNrZ3JvdW5kUG9zaXRpb25YOnRydWUsYmFja2dyb3VuZFBvc2l0aW9uWTp0cnVlfSxi b3JkZXI6e2JvcmRlcldpZHRoOnRydWUsYm9yZGVyU3R5bGU6dHJ1ZSxib3JkZXJDb2xvcjp0cnVl fSxib3JkZXJCb3R0b206e2JvcmRlckJvdHRvbVdpZHRoOnRydWUsYm9yZGVyQm90dG9tU3R5bGU6 dHJ1ZSxib3JkZXJCb3R0b21Db2xvcjp0cnVlfSxib3JkZXJMZWZ0Ontib3JkZXJMZWZ0V2lkdGg6 dHJ1ZSxib3JkZXJMZWZ0U3R5bGU6dHJ1ZSxib3JkZXJMZWZ0Q29sb3I6dHJ1ZX0sYm9yZGVyUmln aHQ6e2JvcmRlclJpZ2h0V2lkdGg6dHJ1ZSxib3JkZXJSaWdodFN0eWxlOnRydWUsYm9yZGVyUmln aHRDb2xvcjp0cnVlfSxib3JkZXJUb3A6e2JvcmRlclRvcFdpZHRoOnRydWUsYm9yZGVyVG9wU3R5 bGU6dHJ1ZSxib3JkZXJUb3BDb2xvcjp0cnVlfSxmb250Ontmb250U3R5bGU6dHJ1ZSxmb250VmFy aWFudDp0cnVlLGZvbnRXZWlnaHQ6dHJ1ZSxmb250U2l6ZTp0cnVlLGxpbmVIZWlnaHQ6dHJ1ZSxm b250RmFtaWx5OnRydWV9LG91dGxpbmU6e291dGxpbmVXaWR0aDp0cnVlLG91dGxpbmVTdHlsZTp0 cnVlLG91dGxpbmVDb2xvcjp0cnVlfX07dmFyIENTU1Byb3BlcnR5PXtpc1VuaXRsZXNzTnVtYmVy OmlzVW5pdGxlc3NOdW1iZXIsc2hvcnRoYW5kUHJvcGVydHlFeHBhbnNpb25zOnNob3J0aGFuZFBy b3BlcnR5RXhwYW5zaW9uc307bW9kdWxlLmV4cG9ydHM9Q1NTUHJvcGVydHl9LHt9XSw1OltmdW5j dGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIENTU1Byb3BlcnR5 PV9kZXJlcV8oNCk7dmFyIEV4ZWN1dGlvbkVudmlyb25tZW50PV9kZXJlcV8oMTM2KTt2YXIgUmVh Y3RJbnN0cnVtZW50YXRpb249X2RlcmVxXyg2NCk7dmFyIGNhbWVsaXplU3R5bGVOYW1lPV9kZXJl cV8oMTM4KTt2YXIgZGFuZ2Vyb3VzU3R5bGVWYWx1ZT1fZGVyZXFfKDEwNik7dmFyIGh5cGhlbmF0 ZVN0eWxlTmFtZT1fZGVyZXFfKDE0OSk7dmFyIG1lbW9pemVTdHJpbmdPbmx5PV9kZXJlcV8oMTUz KTt2YXIgd2FybmluZz1fZGVyZXFfKDE1Nyk7dmFyIHByb2Nlc3NTdHlsZU5hbWU9bWVtb2l6ZVN0 cmluZ09ubHkoZnVuY3Rpb24oc3R5bGVOYW1lKXtyZXR1cm4gaHlwaGVuYXRlU3R5bGVOYW1lKHN0 eWxlTmFtZSl9KTt2YXIgaGFzU2hvcnRoYW5kUHJvcGVydHlCdWc9ZmFsc2U7dmFyIHN0eWxlRmxv YXRBY2Nlc3Nvcj0iY3NzRmxvYXQiO2lmKEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSl7 dmFyIHRlbXBTdHlsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZTt0cnl7dGVt cFN0eWxlLmZvbnQ9IiJ9Y2F0Y2goZSl7aGFzU2hvcnRoYW5kUHJvcGVydHlCdWc9dHJ1ZX1pZihk b2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuY3NzRmxvYXQ9PT11bmRlZmluZWQpe3N0eWxl RmxvYXRBY2Nlc3Nvcj0ic3R5bGVGbG9hdCJ9fWlmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlv biIpe3ZhciBiYWRWZW5kb3JlZFN0eWxlTmFtZVBhdHRlcm49L14oPzp3ZWJraXR8bW96fG8pW0Et Wl0vO3ZhciBiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm49LztccyokLzt2YXIgd2Fy bmVkU3R5bGVOYW1lcz17fTt2YXIgd2FybmVkU3R5bGVWYWx1ZXM9e307dmFyIHdhcm5lZEZvck5h TlZhbHVlPWZhbHNlO3ZhciB3YXJuSHlwaGVuYXRlZFN0eWxlTmFtZT1mdW5jdGlvbihuYW1lLG93 bmVyKXtpZih3YXJuZWRTdHlsZU5hbWVzLmhhc093blByb3BlcnR5KG5hbWUpJiZ3YXJuZWRTdHls ZU5hbWVzW25hbWVdKXtyZXR1cm59d2FybmVkU3R5bGVOYW1lc1tuYW1lXT10cnVlOyJkZXZlbG9w bWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyhmYWxzZSwiVW5zdXBwb3J0ZWQgc3R5bGUgcHJv cGVydHkgJXMuIERpZCB5b3UgbWVhbiAlcz8lcyIsbmFtZSxjYW1lbGl6ZVN0eWxlTmFtZShuYW1l KSxjaGVja1JlbmRlck1lc3NhZ2Uob3duZXIpKTp2b2lkIDB9O3ZhciB3YXJuQmFkVmVuZG9yZWRT dHlsZU5hbWU9ZnVuY3Rpb24obmFtZSxvd25lcil7aWYod2FybmVkU3R5bGVOYW1lcy5oYXNPd25Q cm9wZXJ0eShuYW1lKSYmd2FybmVkU3R5bGVOYW1lc1tuYW1lXSl7cmV0dXJufXdhcm5lZFN0eWxl TmFtZXNbbmFtZV09dHJ1ZTsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmcoZmFs c2UsIlVuc3VwcG9ydGVkIHZlbmRvci1wcmVmaXhlZCBzdHlsZSBwcm9wZXJ0eSAlcy4gRGlkIHlv dSBtZWFuICVzPyVzIixuYW1lLG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrbmFtZS5zbGlj ZSgxKSxjaGVja1JlbmRlck1lc3NhZ2Uob3duZXIpKTp2b2lkIDB9O3ZhciB3YXJuU3R5bGVWYWx1 ZVdpdGhTZW1pY29sb249ZnVuY3Rpb24obmFtZSx2YWx1ZSxvd25lcil7aWYod2FybmVkU3R5bGVW YWx1ZXMuaGFzT3duUHJvcGVydHkodmFsdWUpJiZ3YXJuZWRTdHlsZVZhbHVlc1t2YWx1ZV0pe3Jl dHVybn13YXJuZWRTdHlsZVZhbHVlc1t2YWx1ZV09dHJ1ZTsiZGV2ZWxvcG1lbnQiIT09InByb2R1 Y3Rpb24iP3dhcm5pbmcoZmFsc2UsIlN0eWxlIHByb3BlcnR5IHZhbHVlcyBzaG91bGRuJ3QgY29u dGFpbiBhIHNlbWljb2xvbi4lcyAiKydUcnkgIiVzOiAlcyIgaW5zdGVhZC4nLGNoZWNrUmVuZGVy TWVzc2FnZShvd25lciksbmFtZSx2YWx1ZS5yZXBsYWNlKGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNv bG9uUGF0dGVybiwiIikpOnZvaWQgMH07dmFyIHdhcm5TdHlsZVZhbHVlSXNOYU49ZnVuY3Rpb24o bmFtZSx2YWx1ZSxvd25lcil7aWYod2FybmVkRm9yTmFOVmFsdWUpe3JldHVybn13YXJuZWRGb3JO YU5WYWx1ZT10cnVlOyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyhmYWxzZSwi YE5hTmAgaXMgYW4gaW52YWxpZCB2YWx1ZSBmb3IgdGhlIGAlc2AgY3NzIHN0eWxlIHByb3BlcnR5 LiVzIixuYW1lLGNoZWNrUmVuZGVyTWVzc2FnZShvd25lcikpOnZvaWQgMH07dmFyIGNoZWNrUmVu ZGVyTWVzc2FnZT1mdW5jdGlvbihvd25lcil7aWYob3duZXIpe3ZhciBuYW1lPW93bmVyLmdldE5h bWUoKTtpZihuYW1lKXtyZXR1cm4iIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAiK25hbWUr ImAuIn19cmV0dXJuIiJ9O3ZhciB3YXJuVmFsaWRTdHlsZT1mdW5jdGlvbihuYW1lLHZhbHVlLGNv bXBvbmVudCl7dmFyIG93bmVyO2lmKGNvbXBvbmVudCl7b3duZXI9Y29tcG9uZW50Ll9jdXJyZW50 RWxlbWVudC5fb3duZXJ9aWYobmFtZS5pbmRleE9mKCItIik+LTEpe3dhcm5IeXBoZW5hdGVkU3R5 bGVOYW1lKG5hbWUsb3duZXIpfWVsc2UgaWYoYmFkVmVuZG9yZWRTdHlsZU5hbWVQYXR0ZXJuLnRl c3QobmFtZSkpe3dhcm5CYWRWZW5kb3JlZFN0eWxlTmFtZShuYW1lLG93bmVyKX1lbHNlIGlmKGJh ZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybi50ZXN0KHZhbHVlKSl7d2FyblN0eWxlVmFs dWVXaXRoU2VtaWNvbG9uKG5hbWUsdmFsdWUsb3duZXIpfWlmKHR5cGVvZiB2YWx1ZT09PSJudW1i ZXIiJiZpc05hTih2YWx1ZSkpe3dhcm5TdHlsZVZhbHVlSXNOYU4obmFtZSx2YWx1ZSxvd25lcil9 fX12YXIgQ1NTUHJvcGVydHlPcGVyYXRpb25zPXtjcmVhdGVNYXJrdXBGb3JTdHlsZXM6ZnVuY3Rp b24oc3R5bGVzLGNvbXBvbmVudCl7dmFyIHNlcmlhbGl6ZWQ9IiI7Zm9yKHZhciBzdHlsZU5hbWUg aW4gc3R5bGVzKXtpZighc3R5bGVzLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpe2NvbnRpbnVl fXZhciBzdHlsZVZhbHVlPXN0eWxlc1tzdHlsZU5hbWVdO2lmKCJkZXZlbG9wbWVudCIhPT0icHJv ZHVjdGlvbiIpe3dhcm5WYWxpZFN0eWxlKHN0eWxlTmFtZSxzdHlsZVZhbHVlLGNvbXBvbmVudCl9 aWYoc3R5bGVWYWx1ZSE9bnVsbCl7c2VyaWFsaXplZCs9cHJvY2Vzc1N0eWxlTmFtZShzdHlsZU5h bWUpKyI6IjtzZXJpYWxpemVkKz1kYW5nZXJvdXNTdHlsZVZhbHVlKHN0eWxlTmFtZSxzdHlsZVZh bHVlLGNvbXBvbmVudCkrIjsifX1yZXR1cm4gc2VyaWFsaXplZHx8bnVsbH0sc2V0VmFsdWVGb3JT dHlsZXM6ZnVuY3Rpb24obm9kZSxzdHlsZXMsY29tcG9uZW50KXtpZigiZGV2ZWxvcG1lbnQiIT09 InByb2R1Y3Rpb24iKXtSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0 aW9uKHtpbnN0YW5jZUlEOmNvbXBvbmVudC5fZGVidWdJRCx0eXBlOiJ1cGRhdGUgc3R5bGVzIixw YXlsb2FkOnN0eWxlc30pfXZhciBzdHlsZT1ub2RlLnN0eWxlO2Zvcih2YXIgc3R5bGVOYW1lIGlu IHN0eWxlcyl7aWYoIXN0eWxlcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKXtjb250aW51ZX1p ZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXt3YXJuVmFsaWRTdHlsZShzdHlsZU5hbWUs c3R5bGVzW3N0eWxlTmFtZV0sY29tcG9uZW50KX12YXIgc3R5bGVWYWx1ZT1kYW5nZXJvdXNTdHls ZVZhbHVlKHN0eWxlTmFtZSxzdHlsZXNbc3R5bGVOYW1lXSxjb21wb25lbnQpO2lmKHN0eWxlTmFt ZT09PSJmbG9hdCJ8fHN0eWxlTmFtZT09PSJjc3NGbG9hdCIpe3N0eWxlTmFtZT1zdHlsZUZsb2F0 QWNjZXNzb3J9aWYoc3R5bGVWYWx1ZSl7c3R5bGVbc3R5bGVOYW1lXT1zdHlsZVZhbHVlfWVsc2V7 dmFyIGV4cGFuc2lvbj1oYXNTaG9ydGhhbmRQcm9wZXJ0eUJ1ZyYmQ1NTUHJvcGVydHkuc2hvcnRo YW5kUHJvcGVydHlFeHBhbnNpb25zW3N0eWxlTmFtZV07aWYoZXhwYW5zaW9uKXtmb3IodmFyIGlu ZGl2aWR1YWxTdHlsZU5hbWUgaW4gZXhwYW5zaW9uKXtzdHlsZVtpbmRpdmlkdWFsU3R5bGVOYW1l XT0iIn19ZWxzZXtzdHlsZVtzdHlsZU5hbWVdPSIifX19fX07bW9kdWxlLmV4cG9ydHM9Q1NTUHJv cGVydHlPcGVyYXRpb25zfSx7MTA2OjEwNiwxMzY6MTM2LDEzODoxMzgsMTQ5OjE0OSwxNTM6MTUz LDE1NzoxNTcsNDo0LDY0OjY0fV0sNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7 InVzZSBzdHJpY3QiO3ZhciBfcHJvZEludmFyaWFudD1fZGVyZXFfKDEyNSk7ZnVuY3Rpb24gX2Ns YXNzQ2FsbENoZWNrKGluc3RhbmNlLENvbnN0cnVjdG9yKXtpZighKGluc3RhbmNlIGluc3RhbmNl b2YgQ29uc3RydWN0b3IpKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNz IGFzIGEgZnVuY3Rpb24iKX19dmFyIFBvb2xlZENsYXNzPV9kZXJlcV8oMjUpO3ZhciBpbnZhcmlh bnQ9X2RlcmVxXygxNTApO3ZhciBDYWxsYmFja1F1ZXVlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQ2Fs bGJhY2tRdWV1ZShhcmcpe19jbGFzc0NhbGxDaGVjayh0aGlzLENhbGxiYWNrUXVldWUpO3RoaXMu X2NhbGxiYWNrcz1udWxsO3RoaXMuX2NvbnRleHRzPW51bGw7dGhpcy5fYXJnPWFyZ31DYWxsYmFj a1F1ZXVlLnByb3RvdHlwZS5lbnF1ZXVlPWZ1bmN0aW9uIGVucXVldWUoY2FsbGJhY2ssY29udGV4 dCl7dGhpcy5fY2FsbGJhY2tzPXRoaXMuX2NhbGxiYWNrc3x8W107dGhpcy5fY2FsbGJhY2tzLnB1 c2goY2FsbGJhY2spO3RoaXMuX2NvbnRleHRzPXRoaXMuX2NvbnRleHRzfHxbXTt0aGlzLl9jb250 ZXh0cy5wdXNoKGNvbnRleHQpfTtDYWxsYmFja1F1ZXVlLnByb3RvdHlwZS5ub3RpZnlBbGw9ZnVu Y3Rpb24gbm90aWZ5QWxsKCl7dmFyIGNhbGxiYWNrcz10aGlzLl9jYWxsYmFja3M7dmFyIGNvbnRl eHRzPXRoaXMuX2NvbnRleHRzO3ZhciBhcmc9dGhpcy5fYXJnO2lmKGNhbGxiYWNrcyYmY29udGV4 dHMpeyEoY2FsbGJhY2tzLmxlbmd0aD09PWNvbnRleHRzLmxlbmd0aCk/ImRldmVsb3BtZW50IiE9 PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsIk1pc21hdGNoZWQgbGlzdCBvZiBjb250ZXh0 cyBpbiBjYWxsYmFjayBxdWV1ZSIpOl9wcm9kSW52YXJpYW50KCIyNCIpOnZvaWQgMDt0aGlzLl9j YWxsYmFja3M9bnVsbDt0aGlzLl9jb250ZXh0cz1udWxsO2Zvcih2YXIgaT0wO2k8Y2FsbGJhY2tz Lmxlbmd0aDtpKyspe2NhbGxiYWNrc1tpXS5jYWxsKGNvbnRleHRzW2ldLGFyZyl9Y2FsbGJhY2tz Lmxlbmd0aD0wO2NvbnRleHRzLmxlbmd0aD0wfX07Q2FsbGJhY2tRdWV1ZS5wcm90b3R5cGUuY2hl Y2twb2ludD1mdW5jdGlvbiBjaGVja3BvaW50KCl7cmV0dXJuIHRoaXMuX2NhbGxiYWNrcz90aGlz Ll9jYWxsYmFja3MubGVuZ3RoOjB9O0NhbGxiYWNrUXVldWUucHJvdG90eXBlLnJvbGxiYWNrPWZ1 bmN0aW9uIHJvbGxiYWNrKGxlbil7aWYodGhpcy5fY2FsbGJhY2tzJiZ0aGlzLl9jb250ZXh0cyl7 dGhpcy5fY2FsbGJhY2tzLmxlbmd0aD1sZW47dGhpcy5fY29udGV4dHMubGVuZ3RoPWxlbn19O0Nh bGxiYWNrUXVldWUucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uIHJlc2V0KCl7dGhpcy5fY2FsbGJh Y2tzPW51bGw7dGhpcy5fY29udGV4dHM9bnVsbH07Q2FsbGJhY2tRdWV1ZS5wcm90b3R5cGUuZGVz dHJ1Y3Rvcj1mdW5jdGlvbiBkZXN0cnVjdG9yKCl7dGhpcy5yZXNldCgpfTtyZXR1cm4gQ2FsbGJh Y2tRdWV1ZX0oKTttb2R1bGUuZXhwb3J0cz1Qb29sZWRDbGFzcy5hZGRQb29saW5nVG8oQ2FsbGJh Y2tRdWV1ZSl9LHsxMjU6MTI1LDE1MDoxNTAsMjU6MjV9XSw3OltmdW5jdGlvbihfZGVyZXFfLG1v ZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIEV2ZW50UGx1Z2luSHViPV9kZXJlcV8oMTcp O3ZhciBFdmVudFByb3BhZ2F0b3JzPV9kZXJlcV8oMjApO3ZhciBFeGVjdXRpb25FbnZpcm9ubWVu dD1fZGVyZXFfKDEzNik7dmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZT1fZGVyZXFfKDM0KTt2YXIg UmVhY3RVcGRhdGVzPV9kZXJlcV8oODIpO3ZhciBTeW50aGV0aWNFdmVudD1fZGVyZXFfKDkxKTt2 YXIgZ2V0RXZlbnRUYXJnZXQ9X2RlcmVxXygxMTQpO3ZhciBpc0V2ZW50U3VwcG9ydGVkPV9kZXJl cV8oMTIyKTt2YXIgaXNUZXh0SW5wdXRFbGVtZW50PV9kZXJlcV8oMTIzKTt2YXIgZXZlbnRUeXBl cz17Y2hhbmdlOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDoib25DaGFuZ2UiLGNh cHR1cmVkOiJvbkNoYW5nZUNhcHR1cmUifSxkZXBlbmRlbmNpZXM6WyJ0b3BCbHVyIiwidG9wQ2hh bmdlIiwidG9wQ2xpY2siLCJ0b3BGb2N1cyIsInRvcElucHV0IiwidG9wS2V5RG93biIsInRvcEtl eVVwIiwidG9wU2VsZWN0aW9uQ2hhbmdlIl19fTt2YXIgYWN0aXZlRWxlbWVudD1udWxsO3ZhciBh Y3RpdmVFbGVtZW50SW5zdD1udWxsO3ZhciBhY3RpdmVFbGVtZW50VmFsdWU9bnVsbDt2YXIgYWN0 aXZlRWxlbWVudFZhbHVlUHJvcD1udWxsO2Z1bmN0aW9uIHNob3VsZFVzZUNoYW5nZUV2ZW50KGVs ZW0pe3ZhciBub2RlTmFtZT1lbGVtLm5vZGVOYW1lJiZlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNl KCk7cmV0dXJuIG5vZGVOYW1lPT09InNlbGVjdCJ8fG5vZGVOYW1lPT09ImlucHV0IiYmZWxlbS50 eXBlPT09ImZpbGUifXZhciBkb2VzQ2hhbmdlRXZlbnRCdWJibGU9ZmFsc2U7aWYoRXhlY3V0aW9u RW52aXJvbm1lbnQuY2FuVXNlRE9NKXtkb2VzQ2hhbmdlRXZlbnRCdWJibGU9aXNFdmVudFN1cHBv cnRlZCgiY2hhbmdlIikmJighZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHxkb2N1bWVudC5kb2N1bWVu dE1vZGU+OCl9ZnVuY3Rpb24gbWFudWFsRGlzcGF0Y2hDaGFuZ2VFdmVudChuYXRpdmVFdmVudCl7 dmFyIGV2ZW50PVN5bnRoZXRpY0V2ZW50LmdldFBvb2xlZChldmVudFR5cGVzLmNoYW5nZSxhY3Rp dmVFbGVtZW50SW5zdCxuYXRpdmVFdmVudCxnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCkpO0V2 ZW50UHJvcGFnYXRvcnMuYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyhldmVudCk7UmVhY3RV cGRhdGVzLmJhdGNoZWRVcGRhdGVzKHJ1bkV2ZW50SW5CYXRjaCxldmVudCl9ZnVuY3Rpb24gcnVu RXZlbnRJbkJhdGNoKGV2ZW50KXtFdmVudFBsdWdpbkh1Yi5lbnF1ZXVlRXZlbnRzKGV2ZW50KTtF dmVudFBsdWdpbkh1Yi5wcm9jZXNzRXZlbnRRdWV1ZShmYWxzZSl9ZnVuY3Rpb24gc3RhcnRXYXRj aGluZ0ZvckNoYW5nZUV2ZW50SUU4KHRhcmdldCx0YXJnZXRJbnN0KXthY3RpdmVFbGVtZW50PXRh cmdldDthY3RpdmVFbGVtZW50SW5zdD10YXJnZXRJbnN0O2FjdGl2ZUVsZW1lbnQuYXR0YWNoRXZl bnQoIm9uY2hhbmdlIixtYW51YWxEaXNwYXRjaENoYW5nZUV2ZW50KX1mdW5jdGlvbiBzdG9wV2F0 Y2hpbmdGb3JDaGFuZ2VFdmVudElFOCgpe2lmKCFhY3RpdmVFbGVtZW50KXtyZXR1cm59YWN0aXZl RWxlbWVudC5kZXRhY2hFdmVudCgib25jaGFuZ2UiLG1hbnVhbERpc3BhdGNoQ2hhbmdlRXZlbnQp O2FjdGl2ZUVsZW1lbnQ9bnVsbDthY3RpdmVFbGVtZW50SW5zdD1udWxsfWZ1bmN0aW9uIGdldFRh cmdldEluc3RGb3JDaGFuZ2VFdmVudCh0b3BMZXZlbFR5cGUsdGFyZ2V0SW5zdCl7aWYodG9wTGV2 ZWxUeXBlPT09InRvcENoYW5nZSIpe3JldHVybiB0YXJnZXRJbnN0fX1mdW5jdGlvbiBoYW5kbGVF dmVudHNGb3JDaGFuZ2VFdmVudElFOCh0b3BMZXZlbFR5cGUsdGFyZ2V0LHRhcmdldEluc3Qpe2lm KHRvcExldmVsVHlwZT09PSJ0b3BGb2N1cyIpe3N0b3BXYXRjaGluZ0ZvckNoYW5nZUV2ZW50SUU4 KCk7c3RhcnRXYXRjaGluZ0ZvckNoYW5nZUV2ZW50SUU4KHRhcmdldCx0YXJnZXRJbnN0KX1lbHNl IGlmKHRvcExldmVsVHlwZT09PSJ0b3BCbHVyIil7c3RvcFdhdGNoaW5nRm9yQ2hhbmdlRXZlbnRJ RTgoKX19dmFyIGlzSW5wdXRFdmVudFN1cHBvcnRlZD1mYWxzZTtpZihFeGVjdXRpb25FbnZpcm9u bWVudC5jYW5Vc2VET00pe2lzSW5wdXRFdmVudFN1cHBvcnRlZD1pc0V2ZW50U3VwcG9ydGVkKCJp bnB1dCIpJiYoIWRvY3VtZW50LmRvY3VtZW50TW9kZXx8ZG9jdW1lbnQuZG9jdW1lbnRNb2RlPjEx KX12YXIgbmV3VmFsdWVQcm9wPXtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYWN0aXZlRWxlbWVudFZh bHVlUHJvcC5nZXQuY2FsbCh0aGlzKX0sc2V0OmZ1bmN0aW9uKHZhbCl7YWN0aXZlRWxlbWVudFZh bHVlPSIiK3ZhbDthY3RpdmVFbGVtZW50VmFsdWVQcm9wLnNldC5jYWxsKHRoaXMsdmFsKX19O2Z1 bmN0aW9uIHN0YXJ0V2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSh0YXJnZXQsdGFyZ2V0SW5zdCl7YWN0 aXZlRWxlbWVudD10YXJnZXQ7YWN0aXZlRWxlbWVudEluc3Q9dGFyZ2V0SW5zdDthY3RpdmVFbGVt ZW50VmFsdWU9dGFyZ2V0LnZhbHVlO2FjdGl2ZUVsZW1lbnRWYWx1ZVByb3A9T2JqZWN0LmdldE93 blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQuY29uc3RydWN0b3IucHJvdG90eXBlLCJ2YWx1ZSIp O09iamVjdC5kZWZpbmVQcm9wZXJ0eShhY3RpdmVFbGVtZW50LCJ2YWx1ZSIsbmV3VmFsdWVQcm9w KTtpZihhY3RpdmVFbGVtZW50LmF0dGFjaEV2ZW50KXthY3RpdmVFbGVtZW50LmF0dGFjaEV2ZW50 KCJvbnByb3BlcnR5Y2hhbmdlIixoYW5kbGVQcm9wZXJ0eUNoYW5nZSl9ZWxzZXthY3RpdmVFbGVt ZW50LmFkZEV2ZW50TGlzdGVuZXIoInByb3BlcnR5Y2hhbmdlIixoYW5kbGVQcm9wZXJ0eUNoYW5n ZSxmYWxzZSl9fWZ1bmN0aW9uIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCl7aWYoIWFjdGl2 ZUVsZW1lbnQpe3JldHVybn1kZWxldGUgYWN0aXZlRWxlbWVudC52YWx1ZTtpZihhY3RpdmVFbGVt ZW50LmRldGFjaEV2ZW50KXthY3RpdmVFbGVtZW50LmRldGFjaEV2ZW50KCJvbnByb3BlcnR5Y2hh bmdlIixoYW5kbGVQcm9wZXJ0eUNoYW5nZSl9ZWxzZXthY3RpdmVFbGVtZW50LnJlbW92ZUV2ZW50 TGlzdGVuZXIoInByb3BlcnR5Y2hhbmdlIixoYW5kbGVQcm9wZXJ0eUNoYW5nZSxmYWxzZSl9YWN0 aXZlRWxlbWVudD1udWxsO2FjdGl2ZUVsZW1lbnRJbnN0PW51bGw7YWN0aXZlRWxlbWVudFZhbHVl PW51bGw7YWN0aXZlRWxlbWVudFZhbHVlUHJvcD1udWxsfWZ1bmN0aW9uIGhhbmRsZVByb3BlcnR5 Q2hhbmdlKG5hdGl2ZUV2ZW50KXtpZihuYXRpdmVFdmVudC5wcm9wZXJ0eU5hbWUhPT0idmFsdWUi KXtyZXR1cm59dmFyIHZhbHVlPW5hdGl2ZUV2ZW50LnNyY0VsZW1lbnQudmFsdWU7aWYodmFsdWU9 PT1hY3RpdmVFbGVtZW50VmFsdWUpe3JldHVybn1hY3RpdmVFbGVtZW50VmFsdWU9dmFsdWU7bWFu dWFsRGlzcGF0Y2hDaGFuZ2VFdmVudChuYXRpdmVFdmVudCl9ZnVuY3Rpb24gZ2V0VGFyZ2V0SW5z dEZvcklucHV0RXZlbnQodG9wTGV2ZWxUeXBlLHRhcmdldEluc3Qpe2lmKHRvcExldmVsVHlwZT09 PSJ0b3BJbnB1dCIpe3JldHVybiB0YXJnZXRJbnN0fX1mdW5jdGlvbiBoYW5kbGVFdmVudHNGb3JJ bnB1dEV2ZW50SUUodG9wTGV2ZWxUeXBlLHRhcmdldCx0YXJnZXRJbnN0KXtpZih0b3BMZXZlbFR5 cGU9PT0idG9wRm9jdXMiKXtzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpO3N0YXJ0V2F0Y2hp bmdGb3JWYWx1ZUNoYW5nZSh0YXJnZXQsdGFyZ2V0SW5zdCl9ZWxzZSBpZih0b3BMZXZlbFR5cGU9 PT0idG9wQmx1ciIpe3N0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCl9fWZ1bmN0aW9uIGdldFRh cmdldEluc3RGb3JJbnB1dEV2ZW50SUUodG9wTGV2ZWxUeXBlLHRhcmdldEluc3Qpe2lmKHRvcExl dmVsVHlwZT09PSJ0b3BTZWxlY3Rpb25DaGFuZ2UifHx0b3BMZXZlbFR5cGU9PT0idG9wS2V5VXAi fHx0b3BMZXZlbFR5cGU9PT0idG9wS2V5RG93biIpe2lmKGFjdGl2ZUVsZW1lbnQmJmFjdGl2ZUVs ZW1lbnQudmFsdWUhPT1hY3RpdmVFbGVtZW50VmFsdWUpe2FjdGl2ZUVsZW1lbnRWYWx1ZT1hY3Rp dmVFbGVtZW50LnZhbHVlO3JldHVybiBhY3RpdmVFbGVtZW50SW5zdH19fWZ1bmN0aW9uIHNob3Vs ZFVzZUNsaWNrRXZlbnQoZWxlbSl7cmV0dXJuIGVsZW0ubm9kZU5hbWUmJmVsZW0ubm9kZU5hbWUu dG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJihlbGVtLnR5cGU9PT0iY2hlY2tib3gifHxlbGVtLnR5 cGU9PT0icmFkaW8iKX1mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9yQ2xpY2tFdmVudCh0b3BMZXZl bFR5cGUsdGFyZ2V0SW5zdCl7aWYodG9wTGV2ZWxUeXBlPT09InRvcENsaWNrIil7cmV0dXJuIHRh cmdldEluc3R9fXZhciBDaGFuZ2VFdmVudFBsdWdpbj17ZXZlbnRUeXBlczpldmVudFR5cGVzLGV4 dHJhY3RFdmVudHM6ZnVuY3Rpb24odG9wTGV2ZWxUeXBlLHRhcmdldEluc3QsbmF0aXZlRXZlbnQs bmF0aXZlRXZlbnRUYXJnZXQpe3ZhciB0YXJnZXROb2RlPXRhcmdldEluc3Q/UmVhY3RET01Db21w b25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UodGFyZ2V0SW5zdCk6d2luZG93O3ZhciBnZXRU YXJnZXRJbnN0RnVuYyxoYW5kbGVFdmVudEZ1bmM7aWYoc2hvdWxkVXNlQ2hhbmdlRXZlbnQodGFy Z2V0Tm9kZSkpe2lmKGRvZXNDaGFuZ2VFdmVudEJ1YmJsZSl7Z2V0VGFyZ2V0SW5zdEZ1bmM9Z2V0 VGFyZ2V0SW5zdEZvckNoYW5nZUV2ZW50fWVsc2V7aGFuZGxlRXZlbnRGdW5jPWhhbmRsZUV2ZW50 c0ZvckNoYW5nZUV2ZW50SUU4fX1lbHNlIGlmKGlzVGV4dElucHV0RWxlbWVudCh0YXJnZXROb2Rl KSl7aWYoaXNJbnB1dEV2ZW50U3VwcG9ydGVkKXtnZXRUYXJnZXRJbnN0RnVuYz1nZXRUYXJnZXRJ bnN0Rm9ySW5wdXRFdmVudH1lbHNle2dldFRhcmdldEluc3RGdW5jPWdldFRhcmdldEluc3RGb3JJ bnB1dEV2ZW50SUU7aGFuZGxlRXZlbnRGdW5jPWhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRJRX19 ZWxzZSBpZihzaG91bGRVc2VDbGlja0V2ZW50KHRhcmdldE5vZGUpKXtnZXRUYXJnZXRJbnN0RnVu Yz1nZXRUYXJnZXRJbnN0Rm9yQ2xpY2tFdmVudH1pZihnZXRUYXJnZXRJbnN0RnVuYyl7dmFyIGlu c3Q9Z2V0VGFyZ2V0SW5zdEZ1bmModG9wTGV2ZWxUeXBlLHRhcmdldEluc3QpO2lmKGluc3Qpe3Zh ciBldmVudD1TeW50aGV0aWNFdmVudC5nZXRQb29sZWQoZXZlbnRUeXBlcy5jaGFuZ2UsaW5zdCxu YXRpdmVFdmVudCxuYXRpdmVFdmVudFRhcmdldCk7ZXZlbnQudHlwZT0iY2hhbmdlIjtFdmVudFBy b3BhZ2F0b3JzLmFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMoZXZlbnQpO3JldHVybiBldmVu dH19aWYoaGFuZGxlRXZlbnRGdW5jKXtoYW5kbGVFdmVudEZ1bmModG9wTGV2ZWxUeXBlLHRhcmdl dE5vZGUsdGFyZ2V0SW5zdCl9fX07bW9kdWxlLmV4cG9ydHM9Q2hhbmdlRXZlbnRQbHVnaW59LHsx MTQ6MTE0LDEyMjoxMjIsMTIzOjEyMywxMzY6MTM2LDE3OjE3LDIwOjIwLDM0OjM0LDgyOjgyLDkx OjkxfV0sODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3Zh ciBET01MYXp5VHJlZT1fZGVyZXFfKDkpO3ZhciBEYW5nZXI9X2RlcmVxXygxMyk7dmFyIFJlYWN0 RE9NQ29tcG9uZW50VHJlZT1fZGVyZXFfKDM0KTt2YXIgUmVhY3RJbnN0cnVtZW50YXRpb249X2Rl cmVxXyg2NCk7dmFyIGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb249X2RlcmVxXygx MDUpO3ZhciBzZXRJbm5lckhUTUw9X2RlcmVxXygxMjcpO3ZhciBzZXRUZXh0Q29udGVudD1fZGVy ZXFfKDEyOCk7ZnVuY3Rpb24gZ2V0Tm9kZUFmdGVyKHBhcmVudE5vZGUsbm9kZSl7aWYoQXJyYXku aXNBcnJheShub2RlKSl7bm9kZT1ub2RlWzFdfXJldHVybiBub2RlP25vZGUubmV4dFNpYmxpbmc6 cGFyZW50Tm9kZS5maXJzdENoaWxkfXZhciBpbnNlcnRDaGlsZEF0PWNyZWF0ZU1pY3Jvc29mdFVu c2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24ocGFyZW50Tm9kZSxjaGlsZE5vZGUscmVmZXJlbmNl Tm9kZSl7cGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGROb2RlLHJlZmVyZW5jZU5vZGUpfSk7 ZnVuY3Rpb24gaW5zZXJ0TGF6eVRyZWVDaGlsZEF0KHBhcmVudE5vZGUsY2hpbGRUcmVlLHJlZmVy ZW5jZU5vZGUpe0RPTUxhenlUcmVlLmluc2VydFRyZWVCZWZvcmUocGFyZW50Tm9kZSxjaGlsZFRy ZWUscmVmZXJlbmNlTm9kZSl9ZnVuY3Rpb24gbW92ZUNoaWxkKHBhcmVudE5vZGUsY2hpbGROb2Rl LHJlZmVyZW5jZU5vZGUpe2lmKEFycmF5LmlzQXJyYXkoY2hpbGROb2RlKSl7bW92ZURlbGltaXRl ZFRleHQocGFyZW50Tm9kZSxjaGlsZE5vZGVbMF0sY2hpbGROb2RlWzFdLHJlZmVyZW5jZU5vZGUp fWVsc2V7aW5zZXJ0Q2hpbGRBdChwYXJlbnROb2RlLGNoaWxkTm9kZSxyZWZlcmVuY2VOb2RlKX19 ZnVuY3Rpb24gcmVtb3ZlQ2hpbGQocGFyZW50Tm9kZSxjaGlsZE5vZGUpe2lmKEFycmF5LmlzQXJy YXkoY2hpbGROb2RlKSl7dmFyIGNsb3NpbmdDb21tZW50PWNoaWxkTm9kZVsxXTtjaGlsZE5vZGU9 Y2hpbGROb2RlWzBdO3JlbW92ZURlbGltaXRlZFRleHQocGFyZW50Tm9kZSxjaGlsZE5vZGUsY2xv c2luZ0NvbW1lbnQpO3BhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2xvc2luZ0NvbW1lbnQpfXBhcmVu dE5vZGUucmVtb3ZlQ2hpbGQoY2hpbGROb2RlKX1mdW5jdGlvbiBtb3ZlRGVsaW1pdGVkVGV4dChw YXJlbnROb2RlLG9wZW5pbmdDb21tZW50LGNsb3NpbmdDb21tZW50LHJlZmVyZW5jZU5vZGUpe3Zh ciBub2RlPW9wZW5pbmdDb21tZW50O3doaWxlKHRydWUpe3ZhciBuZXh0Tm9kZT1ub2RlLm5leHRT aWJsaW5nO2luc2VydENoaWxkQXQocGFyZW50Tm9kZSxub2RlLHJlZmVyZW5jZU5vZGUpO2lmKG5v ZGU9PT1jbG9zaW5nQ29tbWVudCl7YnJlYWt9bm9kZT1uZXh0Tm9kZX19ZnVuY3Rpb24gcmVtb3Zl RGVsaW1pdGVkVGV4dChwYXJlbnROb2RlLHN0YXJ0Tm9kZSxjbG9zaW5nQ29tbWVudCl7d2hpbGUo dHJ1ZSl7dmFyIG5vZGU9c3RhcnROb2RlLm5leHRTaWJsaW5nO2lmKG5vZGU9PT1jbG9zaW5nQ29t bWVudCl7YnJlYWt9ZWxzZXtwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpfX19ZnVuY3Rpb24g cmVwbGFjZURlbGltaXRlZFRleHQob3BlbmluZ0NvbW1lbnQsY2xvc2luZ0NvbW1lbnQsc3RyaW5n VGV4dCl7dmFyIHBhcmVudE5vZGU9b3BlbmluZ0NvbW1lbnQucGFyZW50Tm9kZTt2YXIgbm9kZUFm dGVyQ29tbWVudD1vcGVuaW5nQ29tbWVudC5uZXh0U2libGluZztpZihub2RlQWZ0ZXJDb21tZW50 PT09Y2xvc2luZ0NvbW1lbnQpe2lmKHN0cmluZ1RleHQpe2luc2VydENoaWxkQXQocGFyZW50Tm9k ZSxkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzdHJpbmdUZXh0KSxub2RlQWZ0ZXJDb21tZW50KX19 ZWxzZXtpZihzdHJpbmdUZXh0KXtzZXRUZXh0Q29udGVudChub2RlQWZ0ZXJDb21tZW50LHN0cmlu Z1RleHQpO3JlbW92ZURlbGltaXRlZFRleHQocGFyZW50Tm9kZSxub2RlQWZ0ZXJDb21tZW50LGNs b3NpbmdDb21tZW50KX1lbHNle3JlbW92ZURlbGltaXRlZFRleHQocGFyZW50Tm9kZSxvcGVuaW5n Q29tbWVudCxjbG9zaW5nQ29tbWVudCl9fWlmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIp e1JlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oe2luc3RhbmNl SUQ6UmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUob3BlbmluZ0NvbW1l bnQpLl9kZWJ1Z0lELHR5cGU6InJlcGxhY2UgdGV4dCIscGF5bG9hZDpzdHJpbmdUZXh0fSl9fXZh ciBkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cD1EYW5nZXIuZGFuZ2Vyb3VzbHlSZXBs YWNlTm9kZVdpdGhNYXJrdXA7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7ZGFuZ2Vy b3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXA9ZnVuY3Rpb24ob2xkQ2hpbGQsbWFya3VwLHByZXZJ bnN0YW5jZSl7RGFuZ2VyLmRhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwKG9sZENoaWxk LG1hcmt1cCk7aWYocHJldkluc3RhbmNlLl9kZWJ1Z0lEIT09MCl7UmVhY3RJbnN0cnVtZW50YXRp b24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7aW5zdGFuY2VJRDpwcmV2SW5zdGFuY2UuX2Rl YnVnSUQsdHlwZToicmVwbGFjZSB3aXRoIixwYXlsb2FkOm1hcmt1cC50b1N0cmluZygpfSl9ZWxz ZXt2YXIgbmV4dEluc3RhbmNlPVJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21O b2RlKG1hcmt1cC5ub2RlKTtpZihuZXh0SW5zdGFuY2UuX2RlYnVnSUQhPT0wKXtSZWFjdEluc3Ry dW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtpbnN0YW5jZUlEOm5leHRJbnN0 YW5jZS5fZGVidWdJRCx0eXBlOiJtb3VudCIscGF5bG9hZDptYXJrdXAudG9TdHJpbmcoKX0pfX19 fXZhciBET01DaGlsZHJlbk9wZXJhdGlvbnM9e2Rhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFy a3VwOmRhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwLHJlcGxhY2VEZWxpbWl0ZWRUZXh0 OnJlcGxhY2VEZWxpbWl0ZWRUZXh0LHByb2Nlc3NVcGRhdGVzOmZ1bmN0aW9uKHBhcmVudE5vZGUs dXBkYXRlcyl7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7dmFyIHBhcmVudE5vZGVE ZWJ1Z0lEPVJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKHBhcmVudE5v ZGUpLl9kZWJ1Z0lEfWZvcih2YXIgaz0wO2s8dXBkYXRlcy5sZW5ndGg7aysrKXt2YXIgdXBkYXRl PXVwZGF0ZXNba107c3dpdGNoKHVwZGF0ZS50eXBlKXtjYXNlIklOU0VSVF9NQVJLVVAiOmluc2Vy dExhenlUcmVlQ2hpbGRBdChwYXJlbnROb2RlLHVwZGF0ZS5jb250ZW50LGdldE5vZGVBZnRlcihw YXJlbnROb2RlLHVwZGF0ZS5hZnRlck5vZGUpKTtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rp b24iKXtSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtpbnN0 YW5jZUlEOnBhcmVudE5vZGVEZWJ1Z0lELHR5cGU6Imluc2VydCBjaGlsZCIscGF5bG9hZDp7dG9J bmRleDp1cGRhdGUudG9JbmRleCxjb250ZW50OnVwZGF0ZS5jb250ZW50LnRvU3RyaW5nKCl9fSl9 YnJlYWs7Y2FzZSJNT1ZFX0VYSVNUSU5HIjptb3ZlQ2hpbGQocGFyZW50Tm9kZSx1cGRhdGUuZnJv bU5vZGUsZ2V0Tm9kZUFmdGVyKHBhcmVudE5vZGUsdXBkYXRlLmFmdGVyTm9kZSkpO2lmKCJkZXZl bG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe1JlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5v bkhvc3RPcGVyYXRpb24oe2luc3RhbmNlSUQ6cGFyZW50Tm9kZURlYnVnSUQsdHlwZToibW92ZSBj aGlsZCIscGF5bG9hZDp7ZnJvbUluZGV4OnVwZGF0ZS5mcm9tSW5kZXgsdG9JbmRleDp1cGRhdGUu dG9JbmRleH19KX1icmVhaztjYXNlIlNFVF9NQVJLVVAiOnNldElubmVySFRNTChwYXJlbnROb2Rl LHVwZGF0ZS5jb250ZW50KTtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtSZWFjdElu c3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtpbnN0YW5jZUlEOnBhcmVu dE5vZGVEZWJ1Z0lELHR5cGU6InJlcGxhY2UgY2hpbGRyZW4iLHBheWxvYWQ6dXBkYXRlLmNvbnRl bnQudG9TdHJpbmcoKX0pfWJyZWFrO2Nhc2UiVEVYVF9DT05URU5UIjpzZXRUZXh0Q29udGVudChw YXJlbnROb2RlLHVwZGF0ZS5jb250ZW50KTtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24i KXtSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtpbnN0YW5j ZUlEOnBhcmVudE5vZGVEZWJ1Z0lELHR5cGU6InJlcGxhY2UgdGV4dCIscGF5bG9hZDp1cGRhdGUu Y29udGVudC50b1N0cmluZygpfSl9YnJlYWs7Y2FzZSJSRU1PVkVfTk9ERSI6cmVtb3ZlQ2hpbGQo cGFyZW50Tm9kZSx1cGRhdGUuZnJvbU5vZGUpO2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlv biIpe1JlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oe2luc3Rh bmNlSUQ6cGFyZW50Tm9kZURlYnVnSUQsdHlwZToicmVtb3ZlIGNoaWxkIixwYXlsb2FkOntmcm9t SW5kZXg6dXBkYXRlLmZyb21JbmRleH19KX1icmVha319fX07bW9kdWxlLmV4cG9ydHM9RE9NQ2hp bGRyZW5PcGVyYXRpb25zfSx7MTA1OjEwNSwxMjc6MTI3LDEyODoxMjgsMTM6MTMsMzQ6MzQsNjQ6 NjQsOTo5fV0sOTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3Qi O3ZhciBET01OYW1lc3BhY2VzPV9kZXJlcV8oMTApO3ZhciBzZXRJbm5lckhUTUw9X2RlcmVxXygx MjcpO3ZhciBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uPV9kZXJlcV8oMTA1KTt2 YXIgc2V0VGV4dENvbnRlbnQ9X2RlcmVxXygxMjgpO3ZhciBFTEVNRU5UX05PREVfVFlQRT0xO3Zh ciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFX1RZUEU9MTE7dmFyIGVuYWJsZUxhenk9dHlwZW9mIGRv Y3VtZW50IT09InVuZGVmaW5lZCImJnR5cGVvZiBkb2N1bWVudC5kb2N1bWVudE1vZGU9PT0ibnVt YmVyInx8dHlwZW9mIG5hdmlnYXRvciE9PSJ1bmRlZmluZWQiJiZ0eXBlb2YgbmF2aWdhdG9yLnVz ZXJBZ2VudD09PSJzdHJpbmciJiYvXGJFZGdlXC9cZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50 KTtmdW5jdGlvbiBpbnNlcnRUcmVlQ2hpbGRyZW4odHJlZSl7aWYoIWVuYWJsZUxhenkpe3JldHVy bn12YXIgbm9kZT10cmVlLm5vZGU7dmFyIGNoaWxkcmVuPXRyZWUuY2hpbGRyZW47aWYoY2hpbGRy ZW4ubGVuZ3RoKXtmb3IodmFyIGk9MDtpPGNoaWxkcmVuLmxlbmd0aDtpKyspe2luc2VydFRyZWVC ZWZvcmUobm9kZSxjaGlsZHJlbltpXSxudWxsKX19ZWxzZSBpZih0cmVlLmh0bWwhPW51bGwpe3Nl dElubmVySFRNTChub2RlLHRyZWUuaHRtbCl9ZWxzZSBpZih0cmVlLnRleHQhPW51bGwpe3NldFRl eHRDb250ZW50KG5vZGUsdHJlZS50ZXh0KX19dmFyIGluc2VydFRyZWVCZWZvcmU9Y3JlYXRlTWlj cm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbihmdW5jdGlvbihwYXJlbnROb2RlLHRyZWUscmVmZXJl bmNlTm9kZSl7aWYodHJlZS5ub2RlLm5vZGVUeXBlPT09RE9DVU1FTlRfRlJBR01FTlRfTk9ERV9U WVBFfHx0cmVlLm5vZGUubm9kZVR5cGU9PT1FTEVNRU5UX05PREVfVFlQRSYmdHJlZS5ub2RlLm5v ZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0ib2JqZWN0IiYmKHRyZWUubm9kZS5uYW1lc3BhY2VVUkk9 PW51bGx8fHRyZWUubm9kZS5uYW1lc3BhY2VVUkk9PT1ET01OYW1lc3BhY2VzLmh0bWwpKXtpbnNl cnRUcmVlQ2hpbGRyZW4odHJlZSk7cGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodHJlZS5ub2RlLHJl ZmVyZW5jZU5vZGUpfWVsc2V7cGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodHJlZS5ub2RlLHJlZmVy ZW5jZU5vZGUpO2luc2VydFRyZWVDaGlsZHJlbih0cmVlKX19KTtmdW5jdGlvbiByZXBsYWNlQ2hp bGRXaXRoVHJlZShvbGROb2RlLG5ld1RyZWUpe29sZE5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hp bGQobmV3VHJlZS5ub2RlLG9sZE5vZGUpO2luc2VydFRyZWVDaGlsZHJlbihuZXdUcmVlKX1mdW5j dGlvbiBxdWV1ZUNoaWxkKHBhcmVudFRyZWUsY2hpbGRUcmVlKXtpZihlbmFibGVMYXp5KXtwYXJl bnRUcmVlLmNoaWxkcmVuLnB1c2goY2hpbGRUcmVlKX1lbHNle3BhcmVudFRyZWUubm9kZS5hcHBl bmRDaGlsZChjaGlsZFRyZWUubm9kZSl9fWZ1bmN0aW9uIHF1ZXVlSFRNTCh0cmVlLGh0bWwpe2lm KGVuYWJsZUxhenkpe3RyZWUuaHRtbD1odG1sfWVsc2V7c2V0SW5uZXJIVE1MKHRyZWUubm9kZSxo dG1sKX19ZnVuY3Rpb24gcXVldWVUZXh0KHRyZWUsdGV4dCl7aWYoZW5hYmxlTGF6eSl7dHJlZS50 ZXh0PXRleHR9ZWxzZXtzZXRUZXh0Q29udGVudCh0cmVlLm5vZGUsdGV4dCl9fWZ1bmN0aW9uIHRv U3RyaW5nKCl7cmV0dXJuIHRoaXMubm9kZS5ub2RlTmFtZX1mdW5jdGlvbiBET01MYXp5VHJlZShu b2RlKXtyZXR1cm57bm9kZTpub2RlLGNoaWxkcmVuOltdLGh0bWw6bnVsbCx0ZXh0Om51bGwsdG9T dHJpbmc6dG9TdHJpbmd9fURPTUxhenlUcmVlLmluc2VydFRyZWVCZWZvcmU9aW5zZXJ0VHJlZUJl Zm9yZTtET01MYXp5VHJlZS5yZXBsYWNlQ2hpbGRXaXRoVHJlZT1yZXBsYWNlQ2hpbGRXaXRoVHJl ZTtET01MYXp5VHJlZS5xdWV1ZUNoaWxkPXF1ZXVlQ2hpbGQ7RE9NTGF6eVRyZWUucXVldWVIVE1M PXF1ZXVlSFRNTDtET01MYXp5VHJlZS5xdWV1ZVRleHQ9cXVldWVUZXh0O21vZHVsZS5leHBvcnRz PURPTUxhenlUcmVlfSx7MTA6MTAsMTA1OjEwNSwxMjc6MTI3LDEyODoxMjh9XSwxMDpbZnVuY3Rp b24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBET01OYW1lc3BhY2Vz PXtodG1sOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIixtYXRobWw6Imh0dHA6Ly93d3cu dzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiLHN2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmci fTttb2R1bGUuZXhwb3J0cz1ET01OYW1lc3BhY2VzfSx7fV0sMTE6W2Z1bmN0aW9uKF9kZXJlcV8s bW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgX3Byb2RJbnZhcmlhbnQ9X2RlcmVxXygx MjUpO3ZhciBpbnZhcmlhbnQ9X2RlcmVxXygxNTApO2Z1bmN0aW9uIGNoZWNrTWFzayh2YWx1ZSxi aXRtYXNrKXtyZXR1cm4odmFsdWUmYml0bWFzayk9PT1iaXRtYXNrfXZhciBET01Qcm9wZXJ0eUlu amVjdGlvbj17TVVTVF9VU0VfUFJPUEVSVFk6MSxIQVNfQk9PTEVBTl9WQUxVRTo0LEhBU19OVU1F UklDX1ZBTFVFOjgsSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUU6MTZ8OCxIQVNfT1ZFUkxPQURF RF9CT09MRUFOX1ZBTFVFOjMyLGluamVjdERPTVByb3BlcnR5Q29uZmlnOmZ1bmN0aW9uKGRvbVBy b3BlcnR5Q29uZmlnKXt2YXIgSW5qZWN0aW9uPURPTVByb3BlcnR5SW5qZWN0aW9uO3ZhciBQcm9w ZXJ0aWVzPWRvbVByb3BlcnR5Q29uZmlnLlByb3BlcnRpZXN8fHt9O3ZhciBET01BdHRyaWJ1dGVO YW1lc3BhY2VzPWRvbVByb3BlcnR5Q29uZmlnLkRPTUF0dHJpYnV0ZU5hbWVzcGFjZXN8fHt9O3Zh ciBET01BdHRyaWJ1dGVOYW1lcz1kb21Qcm9wZXJ0eUNvbmZpZy5ET01BdHRyaWJ1dGVOYW1lc3x8 e307dmFyIERPTVByb3BlcnR5TmFtZXM9ZG9tUHJvcGVydHlDb25maWcuRE9NUHJvcGVydHlOYW1l c3x8e307dmFyIERPTU11dGF0aW9uTWV0aG9kcz1kb21Qcm9wZXJ0eUNvbmZpZy5ET01NdXRhdGlv bk1ldGhvZHN8fHt9O2lmKGRvbVByb3BlcnR5Q29uZmlnLmlzQ3VzdG9tQXR0cmlidXRlKXtET01Q cm9wZXJ0eS5faXNDdXN0b21BdHRyaWJ1dGVGdW5jdGlvbnMucHVzaChkb21Qcm9wZXJ0eUNvbmZp Zy5pc0N1c3RvbUF0dHJpYnV0ZSl9Zm9yKHZhciBwcm9wTmFtZSBpbiBQcm9wZXJ0aWVzKXshIURP TVByb3BlcnR5LnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpPyJkZXZlbG9wbWVu dCIhPT0icHJvZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJpbmplY3RET01Qcm9wZXJ0eUNvbmZp ZyguLi4pOiBZb3UncmUgdHJ5aW5nIHRvIGluamVjdCBET00gcHJvcGVydHkgJyVzJyB3aGljaCBo YXMgYWxyZWFkeSBiZWVuIGluamVjdGVkLiBZb3UgbWF5IGJlIGFjY2lkZW50YWxseSBpbmplY3Rp bmcgdGhlIHNhbWUgRE9NIHByb3BlcnR5IGNvbmZpZyB0d2ljZSwgb3IgeW91IG1heSBiZSBpbmpl Y3RpbmcgdHdvIGNvbmZpZ3MgdGhhdCBoYXZlIGNvbmZsaWN0aW5nIHByb3BlcnR5IG5hbWVzLiIs cHJvcE5hbWUpOl9wcm9kSW52YXJpYW50KCI0OCIscHJvcE5hbWUpOnZvaWQgMDt2YXIgbG93ZXJD YXNlZD1wcm9wTmFtZS50b0xvd2VyQ2FzZSgpO3ZhciBwcm9wQ29uZmlnPVByb3BlcnRpZXNbcHJv cE5hbWVdO3ZhciBwcm9wZXJ0eUluZm89e2F0dHJpYnV0ZU5hbWU6bG93ZXJDYXNlZCxhdHRyaWJ1 dGVOYW1lc3BhY2U6bnVsbCxwcm9wZXJ0eU5hbWU6cHJvcE5hbWUsbXV0YXRpb25NZXRob2Q6bnVs bCxtdXN0VXNlUHJvcGVydHk6Y2hlY2tNYXNrKHByb3BDb25maWcsSW5qZWN0aW9uLk1VU1RfVVNF X1BST1BFUlRZKSxoYXNCb29sZWFuVmFsdWU6Y2hlY2tNYXNrKHByb3BDb25maWcsSW5qZWN0aW9u LkhBU19CT09MRUFOX1ZBTFVFKSxoYXNOdW1lcmljVmFsdWU6Y2hlY2tNYXNrKHByb3BDb25maWcs SW5qZWN0aW9uLkhBU19OVU1FUklDX1ZBTFVFKSxoYXNQb3NpdGl2ZU51bWVyaWNWYWx1ZTpjaGVj a01hc2socHJvcENvbmZpZyxJbmplY3Rpb24uSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUUpLGhh c092ZXJsb2FkZWRCb29sZWFuVmFsdWU6Y2hlY2tNYXNrKHByb3BDb25maWcsSW5qZWN0aW9uLkhB U19PVkVSTE9BREVEX0JPT0xFQU5fVkFMVUUpfTshKHByb3BlcnR5SW5mby5oYXNCb29sZWFuVmFs dWUrcHJvcGVydHlJbmZvLmhhc051bWVyaWNWYWx1ZStwcm9wZXJ0eUluZm8uaGFzT3ZlcmxvYWRl ZEJvb2xlYW5WYWx1ZTw9MSk/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQo ZmFsc2UsIkRPTVByb3BlcnR5OiBWYWx1ZSBjYW4gYmUgb25lIG9mIGJvb2xlYW4sIG92ZXJsb2Fk ZWQgYm9vbGVhbiwgb3IgbnVtZXJpYyB2YWx1ZSwgYnV0IG5vdCBhIGNvbWJpbmF0aW9uOiAlcyIs cHJvcE5hbWUpOl9wcm9kSW52YXJpYW50KCI1MCIscHJvcE5hbWUpOnZvaWQgMDtpZigiZGV2ZWxv cG1lbnQiIT09InByb2R1Y3Rpb24iKXtET01Qcm9wZXJ0eS5nZXRQb3NzaWJsZVN0YW5kYXJkTmFt ZVtsb3dlckNhc2VkXT1wcm9wTmFtZX1pZihET01BdHRyaWJ1dGVOYW1lcy5oYXNPd25Qcm9wZXJ0 eShwcm9wTmFtZSkpe3ZhciBhdHRyaWJ1dGVOYW1lPURPTUF0dHJpYnV0ZU5hbWVzW3Byb3BOYW1l XTtwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZT1hdHRyaWJ1dGVOYW1lO2lmKCJkZXZlbG9wbWVu dCIhPT0icHJvZHVjdGlvbiIpe0RPTVByb3BlcnR5LmdldFBvc3NpYmxlU3RhbmRhcmROYW1lW2F0 dHJpYnV0ZU5hbWVdPXByb3BOYW1lfX1pZihET01BdHRyaWJ1dGVOYW1lc3BhY2VzLmhhc093blBy b3BlcnR5KHByb3BOYW1lKSl7cHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWVzcGFjZT1ET01BdHRy aWJ1dGVOYW1lc3BhY2VzW3Byb3BOYW1lXX1pZihET01Qcm9wZXJ0eU5hbWVzLmhhc093blByb3Bl cnR5KHByb3BOYW1lKSl7cHJvcGVydHlJbmZvLnByb3BlcnR5TmFtZT1ET01Qcm9wZXJ0eU5hbWVz W3Byb3BOYW1lXX1pZihET01NdXRhdGlvbk1ldGhvZHMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUp KXtwcm9wZXJ0eUluZm8ubXV0YXRpb25NZXRob2Q9RE9NTXV0YXRpb25NZXRob2RzW3Byb3BOYW1l XX1ET01Qcm9wZXJ0eS5wcm9wZXJ0aWVzW3Byb3BOYW1lXT1wcm9wZXJ0eUluZm99fX07dmFyIEFU VFJJQlVURV9OQU1FX1NUQVJUX0NIQVI9IjpBLVpfYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1c XHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAw Qy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1 RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEIjt2YXIgRE9NUHJvcGVydHk9e0lEX0FUVFJJQlVU RV9OQU1FOiJkYXRhLXJlYWN0aWQiLFJPT1RfQVRUUklCVVRFX05BTUU6ImRhdGEtcmVhY3Ryb290 IixBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSOkFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIsQVRU UklCVVRFX05BTUVfQ0hBUjpBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSKyJcXC0uMC05XFx1MDBC N1xcdTAzMDAtXFx1MDM2RlxcdTIwM0YtXFx1MjA0MCIscHJvcGVydGllczp7fSxnZXRQb3NzaWJs ZVN0YW5kYXJkTmFtZToiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP3thdXRvZm9jdXM6ImF1 dG9Gb2N1cyJ9Om51bGwsX2lzQ3VzdG9tQXR0cmlidXRlRnVuY3Rpb25zOltdLGlzQ3VzdG9tQXR0 cmlidXRlOmZ1bmN0aW9uKGF0dHJpYnV0ZU5hbWUpe2Zvcih2YXIgaT0wO2k8RE9NUHJvcGVydHku X2lzQ3VzdG9tQXR0cmlidXRlRnVuY3Rpb25zLmxlbmd0aDtpKyspe3ZhciBpc0N1c3RvbUF0dHJp YnV0ZUZuPURPTVByb3BlcnR5Ll9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9uc1tpXTtpZihpc0N1 c3RvbUF0dHJpYnV0ZUZuKGF0dHJpYnV0ZU5hbWUpKXtyZXR1cm4gdHJ1ZX19cmV0dXJuIGZhbHNl fSxpbmplY3Rpb246RE9NUHJvcGVydHlJbmplY3Rpb259O21vZHVsZS5leHBvcnRzPURPTVByb3Bl cnR5fSx7MTI1OjEyNSwxNTA6MTUwfV0sMTI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9y dHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgRE9NUHJvcGVydHk9X2RlcmVxXygxMSk7dmFyIFJlYWN0RE9N Q29tcG9uZW50VHJlZT1fZGVyZXFfKDM0KTt2YXIgUmVhY3RJbnN0cnVtZW50YXRpb249X2RlcmVx Xyg2NCk7dmFyIHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyPV9kZXJlcV8oMTI0KTt2YXIg d2FybmluZz1fZGVyZXFfKDE1Nyk7dmFyIFZBTElEX0FUVFJJQlVURV9OQU1FX1JFR0VYPW5ldyBS ZWdFeHAoIl5bIitET01Qcm9wZXJ0eS5BVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSKyJdWyIrRE9N UHJvcGVydHkuQVRUUklCVVRFX05BTUVfQ0hBUisiXSokIik7dmFyIGlsbGVnYWxBdHRyaWJ1dGVO YW1lQ2FjaGU9e307dmFyIHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZT17fTtmdW5jdGlvbiBp c0F0dHJpYnV0ZU5hbWVTYWZlKGF0dHJpYnV0ZU5hbWUpe2lmKHZhbGlkYXRlZEF0dHJpYnV0ZU5h bWVDYWNoZS5oYXNPd25Qcm9wZXJ0eShhdHRyaWJ1dGVOYW1lKSl7cmV0dXJuIHRydWV9aWYoaWxs ZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZS5oYXNPd25Qcm9wZXJ0eShhdHRyaWJ1dGVOYW1lKSl7cmV0 dXJuIGZhbHNlfWlmKFZBTElEX0FUVFJJQlVURV9OQU1FX1JFR0VYLnRlc3QoYXR0cmlidXRlTmFt ZSkpe3ZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZVthdHRyaWJ1dGVOYW1lXT10cnVlO3JldHVy biB0cnVlfWlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGVbYXR0cmlidXRlTmFtZV09dHJ1ZTsiZGV2 ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmcoZmFsc2UsIkludmFsaWQgYXR0cmlidXRl IG5hbWU6IGAlc2AiLGF0dHJpYnV0ZU5hbWUpOnZvaWQgMDtyZXR1cm4gZmFsc2V9ZnVuY3Rpb24g c2hvdWxkSWdub3JlVmFsdWUocHJvcGVydHlJbmZvLHZhbHVlKXtyZXR1cm4gdmFsdWU9PW51bGx8 fHByb3BlcnR5SW5mby5oYXNCb29sZWFuVmFsdWUmJiF2YWx1ZXx8cHJvcGVydHlJbmZvLmhhc051 bWVyaWNWYWx1ZSYmaXNOYU4odmFsdWUpfHxwcm9wZXJ0eUluZm8uaGFzUG9zaXRpdmVOdW1lcmlj VmFsdWUmJnZhbHVlPDF8fHByb3BlcnR5SW5mby5oYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlJiZ2 YWx1ZT09PWZhbHNlfXZhciBET01Qcm9wZXJ0eU9wZXJhdGlvbnM9e2NyZWF0ZU1hcmt1cEZvcklE OmZ1bmN0aW9uKGlkKXtyZXR1cm4gRE9NUHJvcGVydHkuSURfQVRUUklCVVRFX05BTUUrIj0iK3F1 b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyKGlkKX0sc2V0QXR0cmlidXRlRm9ySUQ6ZnVuY3Rp b24obm9kZSxpZCl7bm9kZS5zZXRBdHRyaWJ1dGUoRE9NUHJvcGVydHkuSURfQVRUUklCVVRFX05B TUUsaWQpfSxjcmVhdGVNYXJrdXBGb3JSb290OmZ1bmN0aW9uKCl7cmV0dXJuIERPTVByb3BlcnR5 LlJPT1RfQVRUUklCVVRFX05BTUUrJz0iIid9LHNldEF0dHJpYnV0ZUZvclJvb3Q6ZnVuY3Rpb24o bm9kZSl7bm9kZS5zZXRBdHRyaWJ1dGUoRE9NUHJvcGVydHkuUk9PVF9BVFRSSUJVVEVfTkFNRSwi Iil9LGNyZWF0ZU1hcmt1cEZvclByb3BlcnR5OmZ1bmN0aW9uKG5hbWUsdmFsdWUpe3ZhciBwcm9w ZXJ0eUluZm89RE9NUHJvcGVydHkucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShuYW1lKT9ET01Q cm9wZXJ0eS5wcm9wZXJ0aWVzW25hbWVdOm51bGw7aWYocHJvcGVydHlJbmZvKXtpZihzaG91bGRJ Z25vcmVWYWx1ZShwcm9wZXJ0eUluZm8sdmFsdWUpKXtyZXR1cm4iIn12YXIgYXR0cmlidXRlTmFt ZT1wcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZTtpZihwcm9wZXJ0eUluZm8uaGFzQm9vbGVhblZh bHVlfHxwcm9wZXJ0eUluZm8uaGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZSYmdmFsdWU9PT10cnVl KXtyZXR1cm4gYXR0cmlidXRlTmFtZSsnPSIiJ31yZXR1cm4gYXR0cmlidXRlTmFtZSsiPSIrcXVv dGVBdHRyaWJ1dGVWYWx1ZUZvckJyb3dzZXIodmFsdWUpfWVsc2UgaWYoRE9NUHJvcGVydHkuaXND dXN0b21BdHRyaWJ1dGUobmFtZSkpe2lmKHZhbHVlPT1udWxsKXtyZXR1cm4iIn1yZXR1cm4gbmFt ZSsiPSIrcXVvdGVBdHRyaWJ1dGVWYWx1ZUZvckJyb3dzZXIodmFsdWUpfXJldHVybiBudWxsfSxj cmVhdGVNYXJrdXBGb3JDdXN0b21BdHRyaWJ1dGU6ZnVuY3Rpb24obmFtZSx2YWx1ZSl7aWYoIWlz QXR0cmlidXRlTmFtZVNhZmUobmFtZSl8fHZhbHVlPT1udWxsKXtyZXR1cm4iIn1yZXR1cm4gbmFt ZSsiPSIrcXVvdGVBdHRyaWJ1dGVWYWx1ZUZvckJyb3dzZXIodmFsdWUpfSxzZXRWYWx1ZUZvclBy b3BlcnR5OmZ1bmN0aW9uKG5vZGUsbmFtZSx2YWx1ZSl7dmFyIHByb3BlcnR5SW5mbz1ET01Qcm9w ZXJ0eS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KG5hbWUpP0RPTVByb3BlcnR5LnByb3BlcnRp ZXNbbmFtZV06bnVsbDtpZihwcm9wZXJ0eUluZm8pe3ZhciBtdXRhdGlvbk1ldGhvZD1wcm9wZXJ0 eUluZm8ubXV0YXRpb25NZXRob2Q7aWYobXV0YXRpb25NZXRob2Qpe211dGF0aW9uTWV0aG9kKG5v ZGUsdmFsdWUpfWVsc2UgaWYoc2hvdWxkSWdub3JlVmFsdWUocHJvcGVydHlJbmZvLHZhbHVlKSl7 dGhpcy5kZWxldGVWYWx1ZUZvclByb3BlcnR5KG5vZGUsbmFtZSk7cmV0dXJufWVsc2UgaWYocHJv cGVydHlJbmZvLm11c3RVc2VQcm9wZXJ0eSl7bm9kZVtwcm9wZXJ0eUluZm8ucHJvcGVydHlOYW1l XT12YWx1ZX1lbHNle3ZhciBhdHRyaWJ1dGVOYW1lPXByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1l O3ZhciBuYW1lc3BhY2U9cHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWVzcGFjZTtpZihuYW1lc3Bh Y2Upe25vZGUuc2V0QXR0cmlidXRlTlMobmFtZXNwYWNlLGF0dHJpYnV0ZU5hbWUsIiIrdmFsdWUp fWVsc2UgaWYocHJvcGVydHlJbmZvLmhhc0Jvb2xlYW5WYWx1ZXx8cHJvcGVydHlJbmZvLmhhc092 ZXJsb2FkZWRCb29sZWFuVmFsdWUmJnZhbHVlPT09dHJ1ZSl7bm9kZS5zZXRBdHRyaWJ1dGUoYXR0 cmlidXRlTmFtZSwiIil9ZWxzZXtub2RlLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCIiK3Zh bHVlKX19fWVsc2UgaWYoRE9NUHJvcGVydHkuaXNDdXN0b21BdHRyaWJ1dGUobmFtZSkpe0RPTVBy b3BlcnR5T3BlcmF0aW9ucy5zZXRWYWx1ZUZvckF0dHJpYnV0ZShub2RlLG5hbWUsdmFsdWUpO3Jl dHVybn1pZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXt2YXIgcGF5bG9hZD17fTtwYXls b2FkW25hbWVdPXZhbHVlO1JlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVy YXRpb24oe2luc3RhbmNlSUQ6UmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5v ZGUobm9kZSkuX2RlYnVnSUQsdHlwZToidXBkYXRlIGF0dHJpYnV0ZSIscGF5bG9hZDpwYXlsb2Fk fSl9fSxzZXRWYWx1ZUZvckF0dHJpYnV0ZTpmdW5jdGlvbihub2RlLG5hbWUsdmFsdWUpe2lmKCFp c0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKXtyZXR1cm59aWYodmFsdWU9PW51bGwpe25vZGUucmVt b3ZlQXR0cmlidXRlKG5hbWUpfWVsc2V7bm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwiIit2YWx1ZSl9 aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7dmFyIHBheWxvYWQ9e307cGF5bG9hZFtu YW1lXT12YWx1ZTtSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9u KHtpbnN0YW5jZUlEOlJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKG5v ZGUpLl9kZWJ1Z0lELHR5cGU6InVwZGF0ZSBhdHRyaWJ1dGUiLHBheWxvYWQ6cGF5bG9hZH0pfX0s ZGVsZXRlVmFsdWVGb3JBdHRyaWJ1dGU6ZnVuY3Rpb24obm9kZSxuYW1lKXtub2RlLnJlbW92ZUF0 dHJpYnV0ZShuYW1lKTtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtSZWFjdEluc3Ry dW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtpbnN0YW5jZUlEOlJlYWN0RE9N Q29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpLl9kZWJ1Z0lELHR5cGU6InJl bW92ZSBhdHRyaWJ1dGUiLHBheWxvYWQ6bmFtZX0pfX0sZGVsZXRlVmFsdWVGb3JQcm9wZXJ0eTpm dW5jdGlvbihub2RlLG5hbWUpe3ZhciBwcm9wZXJ0eUluZm89RE9NUHJvcGVydHkucHJvcGVydGll cy5oYXNPd25Qcm9wZXJ0eShuYW1lKT9ET01Qcm9wZXJ0eS5wcm9wZXJ0aWVzW25hbWVdOm51bGw7 aWYocHJvcGVydHlJbmZvKXt2YXIgbXV0YXRpb25NZXRob2Q9cHJvcGVydHlJbmZvLm11dGF0aW9u TWV0aG9kO2lmKG11dGF0aW9uTWV0aG9kKXttdXRhdGlvbk1ldGhvZChub2RlLHVuZGVmaW5lZCl9 ZWxzZSBpZihwcm9wZXJ0eUluZm8ubXVzdFVzZVByb3BlcnR5KXt2YXIgcHJvcE5hbWU9cHJvcGVy dHlJbmZvLnByb3BlcnR5TmFtZTtpZihwcm9wZXJ0eUluZm8uaGFzQm9vbGVhblZhbHVlKXtub2Rl W3Byb3BOYW1lXT1mYWxzZX1lbHNle25vZGVbcHJvcE5hbWVdPSIifX1lbHNle25vZGUucmVtb3Zl QXR0cmlidXRlKHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lKX19ZWxzZSBpZihET01Qcm9wZXJ0 eS5pc0N1c3RvbUF0dHJpYnV0ZShuYW1lKSl7bm9kZS5yZW1vdmVBdHRyaWJ1dGUobmFtZSl9aWYo ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7UmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdU b29sLm9uSG9zdE9wZXJhdGlvbih7aW5zdGFuY2VJRDpSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0 SW5zdGFuY2VGcm9tTm9kZShub2RlKS5fZGVidWdJRCx0eXBlOiJyZW1vdmUgYXR0cmlidXRlIixw YXlsb2FkOm5hbWV9KX19fTttb2R1bGUuZXhwb3J0cz1ET01Qcm9wZXJ0eU9wZXJhdGlvbnN9LHsx MToxMSwxMjQ6MTI0LDE1NzoxNTcsMzQ6MzQsNjQ6NjR9XSwxMzpbZnVuY3Rpb24oX2RlcmVxXyxt b2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBfcHJvZEludmFyaWFudD1fZGVyZXFfKDEy NSk7dmFyIERPTUxhenlUcmVlPV9kZXJlcV8oOSk7dmFyIEV4ZWN1dGlvbkVudmlyb25tZW50PV9k ZXJlcV8oMTM2KTt2YXIgY3JlYXRlTm9kZXNGcm9tTWFya3VwPV9kZXJlcV8oMTQxKTt2YXIgZW1w dHlGdW5jdGlvbj1fZGVyZXFfKDE0Mik7dmFyIGludmFyaWFudD1fZGVyZXFfKDE1MCk7dmFyIERh bmdlcj17ZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXA6ZnVuY3Rpb24ob2xkQ2hpbGQs bWFya3VwKXshRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NPyJkZXZlbG9wbWVudCIhPT0i cHJvZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1h cmt1cCguLi4pOiBDYW5ub3QgcmVuZGVyIG1hcmt1cCBpbiBhIHdvcmtlciB0aHJlYWQuIE1ha2Ug c3VyZSBgd2luZG93YCBhbmQgYGRvY3VtZW50YCBhcmUgYXZhaWxhYmxlIGdsb2JhbGx5IGJlZm9y ZSByZXF1aXJpbmcgUmVhY3Qgd2hlbiB1bml0IHRlc3Rpbmcgb3IgdXNlIFJlYWN0RE9NU2VydmVy LnJlbmRlclRvU3RyaW5nKCkgZm9yIHNlcnZlciByZW5kZXJpbmcuIik6X3Byb2RJbnZhcmlhbnQo IjU2Iik6dm9pZCAwOyFtYXJrdXA/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlh bnQoZmFsc2UsImRhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwKC4uLik6IE1pc3Npbmcg bWFya3VwLiIpOl9wcm9kSW52YXJpYW50KCI1NyIpOnZvaWQgMDshKG9sZENoaWxkLm5vZGVOYW1l IT09IkhUTUwiKT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwi ZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXAoLi4uKTogQ2Fubm90IHJlcGxhY2UgbWFy a3VwIG9mIHRoZSA8aHRtbD4gbm9kZS4gVGhpcyBpcyBiZWNhdXNlIGJyb3dzZXIgcXVpcmtzIG1h a2UgdGhpcyB1bnJlbGlhYmxlIGFuZC9vciBzbG93LiBJZiB5b3Ugd2FudCB0byByZW5kZXIgdG8g dGhlIHJvb3QgeW91IG11c3QgdXNlIHNlcnZlciByZW5kZXJpbmcuIFNlZSBSZWFjdERPTVNlcnZl ci5yZW5kZXJUb1N0cmluZygpLiIpOl9wcm9kSW52YXJpYW50KCI1OCIpOnZvaWQgMDtpZih0eXBl b2YgbWFya3VwPT09InN0cmluZyIpe3ZhciBuZXdDaGlsZD1jcmVhdGVOb2Rlc0Zyb21NYXJrdXAo bWFya3VwLGVtcHR5RnVuY3Rpb24pWzBdO29sZENoaWxkLnBhcmVudE5vZGUucmVwbGFjZUNoaWxk KG5ld0NoaWxkLG9sZENoaWxkKX1lbHNle0RPTUxhenlUcmVlLnJlcGxhY2VDaGlsZFdpdGhUcmVl KG9sZENoaWxkLG1hcmt1cCl9fX07bW9kdWxlLmV4cG9ydHM9RGFuZ2VyfSx7MTI1OjEyNSwxMzY6 MTM2LDE0MToxNDEsMTQyOjE0MiwxNTA6MTUwLDk6OX1dLDE0OltmdW5jdGlvbihfZGVyZXFfLG1v ZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIERlZmF1bHRFdmVudFBsdWdpbk9yZGVyPVsi UmVzcG9uZGVyRXZlbnRQbHVnaW4iLCJTaW1wbGVFdmVudFBsdWdpbiIsIlRhcEV2ZW50UGx1Z2lu IiwiRW50ZXJMZWF2ZUV2ZW50UGx1Z2luIiwiQ2hhbmdlRXZlbnRQbHVnaW4iLCJTZWxlY3RFdmVu dFBsdWdpbiIsIkJlZm9yZUlucHV0RXZlbnRQbHVnaW4iXTttb2R1bGUuZXhwb3J0cz1EZWZhdWx0 RXZlbnRQbHVnaW5PcmRlcn0se31dLDE1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRz KXsidXNlIHN0cmljdCI7dmFyIEV2ZW50UHJvcGFnYXRvcnM9X2RlcmVxXygyMCk7dmFyIFJlYWN0 RE9NQ29tcG9uZW50VHJlZT1fZGVyZXFfKDM0KTt2YXIgU3ludGhldGljTW91c2VFdmVudD1fZGVy ZXFfKDk1KTt2YXIgZXZlbnRUeXBlcz17bW91c2VFbnRlcjp7cmVnaXN0cmF0aW9uTmFtZToib25N b3VzZUVudGVyIixkZXBlbmRlbmNpZXM6WyJ0b3BNb3VzZU91dCIsInRvcE1vdXNlT3ZlciJdfSxt b3VzZUxlYXZlOntyZWdpc3RyYXRpb25OYW1lOiJvbk1vdXNlTGVhdmUiLGRlcGVuZGVuY2llczpb InRvcE1vdXNlT3V0IiwidG9wTW91c2VPdmVyIl19fTt2YXIgRW50ZXJMZWF2ZUV2ZW50UGx1Z2lu PXtldmVudFR5cGVzOmV2ZW50VHlwZXMsZXh0cmFjdEV2ZW50czpmdW5jdGlvbih0b3BMZXZlbFR5 cGUsdGFyZ2V0SW5zdCxuYXRpdmVFdmVudCxuYXRpdmVFdmVudFRhcmdldCl7aWYodG9wTGV2ZWxU eXBlPT09InRvcE1vdXNlT3ZlciImJihuYXRpdmVFdmVudC5yZWxhdGVkVGFyZ2V0fHxuYXRpdmVF dmVudC5mcm9tRWxlbWVudCkpe3JldHVybiBudWxsfWlmKHRvcExldmVsVHlwZSE9PSJ0b3BNb3Vz ZU91dCImJnRvcExldmVsVHlwZSE9PSJ0b3BNb3VzZU92ZXIiKXtyZXR1cm4gbnVsbH12YXIgd2lu O2lmKG5hdGl2ZUV2ZW50VGFyZ2V0LndpbmRvdz09PW5hdGl2ZUV2ZW50VGFyZ2V0KXt3aW49bmF0 aXZlRXZlbnRUYXJnZXR9ZWxzZXt2YXIgZG9jPW5hdGl2ZUV2ZW50VGFyZ2V0Lm93bmVyRG9jdW1l bnQ7aWYoZG9jKXt3aW49ZG9jLmRlZmF1bHRWaWV3fHxkb2MucGFyZW50V2luZG93fWVsc2V7d2lu PXdpbmRvd319dmFyIGZyb207dmFyIHRvO2lmKHRvcExldmVsVHlwZT09PSJ0b3BNb3VzZU91dCIp e2Zyb209dGFyZ2V0SW5zdDt2YXIgcmVsYXRlZD1uYXRpdmVFdmVudC5yZWxhdGVkVGFyZ2V0fHxu YXRpdmVFdmVudC50b0VsZW1lbnQ7dG89cmVsYXRlZD9SZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0 Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUocmVsYXRlZCk6bnVsbH1lbHNle2Zyb209bnVsbDt0bz10 YXJnZXRJbnN0fWlmKGZyb209PT10byl7cmV0dXJuIG51bGx9dmFyIGZyb21Ob2RlPWZyb209PW51 bGw/d2luOlJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGZyb20pO3Zh ciB0b05vZGU9dG89PW51bGw/d2luOlJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUlu c3RhbmNlKHRvKTt2YXIgbGVhdmU9U3ludGhldGljTW91c2VFdmVudC5nZXRQb29sZWQoZXZlbnRU eXBlcy5tb3VzZUxlYXZlLGZyb20sbmF0aXZlRXZlbnQsbmF0aXZlRXZlbnRUYXJnZXQpO2xlYXZl LnR5cGU9Im1vdXNlbGVhdmUiO2xlYXZlLnRhcmdldD1mcm9tTm9kZTtsZWF2ZS5yZWxhdGVkVGFy Z2V0PXRvTm9kZTt2YXIgZW50ZXI9U3ludGhldGljTW91c2VFdmVudC5nZXRQb29sZWQoZXZlbnRU eXBlcy5tb3VzZUVudGVyLHRvLG5hdGl2ZUV2ZW50LG5hdGl2ZUV2ZW50VGFyZ2V0KTtlbnRlci50 eXBlPSJtb3VzZWVudGVyIjtlbnRlci50YXJnZXQ9dG9Ob2RlO2VudGVyLnJlbGF0ZWRUYXJnZXQ9 ZnJvbU5vZGU7RXZlbnRQcm9wYWdhdG9ycy5hY2N1bXVsYXRlRW50ZXJMZWF2ZURpc3BhdGNoZXMo bGVhdmUsZW50ZXIsZnJvbSx0byk7cmV0dXJuW2xlYXZlLGVudGVyXX19O21vZHVsZS5leHBvcnRz PUVudGVyTGVhdmVFdmVudFBsdWdpbn0sezIwOjIwLDM0OjM0LDk1Ojk1fV0sMTY6W2Z1bmN0aW9u KF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgdG9wTGV2ZWxUeXBlcz17 dG9wQWJvcnQ6bnVsbCx0b3BBbmltYXRpb25FbmQ6bnVsbCx0b3BBbmltYXRpb25JdGVyYXRpb246 bnVsbCx0b3BBbmltYXRpb25TdGFydDpudWxsLHRvcEJsdXI6bnVsbCx0b3BDYW5QbGF5Om51bGws dG9wQ2FuUGxheVRocm91Z2g6bnVsbCx0b3BDaGFuZ2U6bnVsbCx0b3BDbGljazpudWxsLHRvcENv bXBvc2l0aW9uRW5kOm51bGwsdG9wQ29tcG9zaXRpb25TdGFydDpudWxsLHRvcENvbXBvc2l0aW9u VXBkYXRlOm51bGwsdG9wQ29udGV4dE1lbnU6bnVsbCx0b3BDb3B5Om51bGwsdG9wQ3V0Om51bGws dG9wRG91YmxlQ2xpY2s6bnVsbCx0b3BEcmFnOm51bGwsdG9wRHJhZ0VuZDpudWxsLHRvcERyYWdF bnRlcjpudWxsLHRvcERyYWdFeGl0Om51bGwsdG9wRHJhZ0xlYXZlOm51bGwsdG9wRHJhZ092ZXI6 bnVsbCx0b3BEcmFnU3RhcnQ6bnVsbCx0b3BEcm9wOm51bGwsdG9wRHVyYXRpb25DaGFuZ2U6bnVs bCx0b3BFbXB0aWVkOm51bGwsdG9wRW5jcnlwdGVkOm51bGwsdG9wRW5kZWQ6bnVsbCx0b3BFcnJv cjpudWxsLHRvcEZvY3VzOm51bGwsdG9wSW5wdXQ6bnVsbCx0b3BJbnZhbGlkOm51bGwsdG9wS2V5 RG93bjpudWxsLHRvcEtleVByZXNzOm51bGwsdG9wS2V5VXA6bnVsbCx0b3BMb2FkOm51bGwsdG9w TG9hZGVkRGF0YTpudWxsLHRvcExvYWRlZE1ldGFkYXRhOm51bGwsdG9wTG9hZFN0YXJ0Om51bGws dG9wTW91c2VEb3duOm51bGwsdG9wTW91c2VNb3ZlOm51bGwsdG9wTW91c2VPdXQ6bnVsbCx0b3BN b3VzZU92ZXI6bnVsbCx0b3BNb3VzZVVwOm51bGwsdG9wUGFzdGU6bnVsbCx0b3BQYXVzZTpudWxs LHRvcFBsYXk6bnVsbCx0b3BQbGF5aW5nOm51bGwsdG9wUHJvZ3Jlc3M6bnVsbCx0b3BSYXRlQ2hh bmdlOm51bGwsdG9wUmVzZXQ6bnVsbCx0b3BTY3JvbGw6bnVsbCx0b3BTZWVrZWQ6bnVsbCx0b3BT ZWVraW5nOm51bGwsdG9wU2VsZWN0aW9uQ2hhbmdlOm51bGwsdG9wU3RhbGxlZDpudWxsLHRvcFN1 Ym1pdDpudWxsLHRvcFN1c3BlbmQ6bnVsbCx0b3BUZXh0SW5wdXQ6bnVsbCx0b3BUaW1lVXBkYXRl Om51bGwsdG9wVG91Y2hDYW5jZWw6bnVsbCx0b3BUb3VjaEVuZDpudWxsLHRvcFRvdWNoTW92ZTpu dWxsLHRvcFRvdWNoU3RhcnQ6bnVsbCx0b3BUcmFuc2l0aW9uRW5kOm51bGwsdG9wVm9sdW1lQ2hh bmdlOm51bGwsdG9wV2FpdGluZzpudWxsLHRvcFdoZWVsOm51bGx9O3ZhciBFdmVudENvbnN0YW50 cz17dG9wTGV2ZWxUeXBlczp0b3BMZXZlbFR5cGVzfTttb2R1bGUuZXhwb3J0cz1FdmVudENvbnN0 YW50c30se31dLDE3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmlj dCI7dmFyIF9wcm9kSW52YXJpYW50PV9kZXJlcV8oMTI1KTt2YXIgRXZlbnRQbHVnaW5SZWdpc3Ry eT1fZGVyZXFfKDE4KTt2YXIgRXZlbnRQbHVnaW5VdGlscz1fZGVyZXFfKDE5KTt2YXIgUmVhY3RF cnJvclV0aWxzPV9kZXJlcV8oNTUpO3ZhciBhY2N1bXVsYXRlSW50bz1fZGVyZXFfKDEwMik7dmFy IGZvckVhY2hBY2N1bXVsYXRlZD1fZGVyZXFfKDExMCk7dmFyIGludmFyaWFudD1fZGVyZXFfKDE1 MCk7dmFyIGxpc3RlbmVyQmFuaz17fTt2YXIgZXZlbnRRdWV1ZT1udWxsO3ZhciBleGVjdXRlRGlz cGF0Y2hlc0FuZFJlbGVhc2U9ZnVuY3Rpb24oZXZlbnQsc2ltdWxhdGVkKXtpZihldmVudCl7RXZl bnRQbHVnaW5VdGlscy5leGVjdXRlRGlzcGF0Y2hlc0luT3JkZXIoZXZlbnQsc2ltdWxhdGVkKTtp ZighZXZlbnQuaXNQZXJzaXN0ZW50KCkpe2V2ZW50LmNvbnN0cnVjdG9yLnJlbGVhc2UoZXZlbnQp fX19O3ZhciBleGVjdXRlRGlzcGF0Y2hlc0FuZFJlbGVhc2VTaW11bGF0ZWQ9ZnVuY3Rpb24oZSl7 cmV0dXJuIGV4ZWN1dGVEaXNwYXRjaGVzQW5kUmVsZWFzZShlLHRydWUpfTt2YXIgZXhlY3V0ZURp c3BhdGNoZXNBbmRSZWxlYXNlVG9wTGV2ZWw9ZnVuY3Rpb24oZSl7cmV0dXJuIGV4ZWN1dGVEaXNw YXRjaGVzQW5kUmVsZWFzZShlLGZhbHNlKX07dmFyIGdldERpY3Rpb25hcnlLZXk9ZnVuY3Rpb24o aW5zdCl7cmV0dXJuIi4iK2luc3QuX3Jvb3ROb2RlSUR9O2Z1bmN0aW9uIGlzSW50ZXJhY3RpdmUo dGFnKXtyZXR1cm4gdGFnPT09ImJ1dHRvbiJ8fHRhZz09PSJpbnB1dCJ8fHRhZz09PSJzZWxlY3Qi fHx0YWc9PT0idGV4dGFyZWEifWZ1bmN0aW9uIHNob3VsZFByZXZlbnRNb3VzZUV2ZW50KG5hbWUs dHlwZSxwcm9wcyl7c3dpdGNoKG5hbWUpe2Nhc2Uib25DbGljayI6Y2FzZSJvbkNsaWNrQ2FwdHVy ZSI6Y2FzZSJvbkRvdWJsZUNsaWNrIjpjYXNlIm9uRG91YmxlQ2xpY2tDYXB0dXJlIjpjYXNlIm9u TW91c2VEb3duIjpjYXNlIm9uTW91c2VEb3duQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlTW92ZSI6Y2Fz ZSJvbk1vdXNlTW92ZUNhcHR1cmUiOmNhc2Uib25Nb3VzZVVwIjpjYXNlIm9uTW91c2VVcENhcHR1 cmUiOnJldHVybiEhKHByb3BzLmRpc2FibGVkJiZpc0ludGVyYWN0aXZlKHR5cGUpKTtkZWZhdWx0 OnJldHVybiBmYWxzZX19dmFyIEV2ZW50UGx1Z2luSHViPXtpbmplY3Rpb246e2luamVjdEV2ZW50 UGx1Z2luT3JkZXI6RXZlbnRQbHVnaW5SZWdpc3RyeS5pbmplY3RFdmVudFBsdWdpbk9yZGVyLGlu amVjdEV2ZW50UGx1Z2luc0J5TmFtZTpFdmVudFBsdWdpblJlZ2lzdHJ5LmluamVjdEV2ZW50UGx1 Z2luc0J5TmFtZX0scHV0TGlzdGVuZXI6ZnVuY3Rpb24oaW5zdCxyZWdpc3RyYXRpb25OYW1lLGxp c3RlbmVyKXshKHR5cGVvZiBsaXN0ZW5lcj09PSJmdW5jdGlvbiIpPyJkZXZlbG9wbWVudCIhPT0i cHJvZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJFeHBlY3RlZCAlcyBsaXN0ZW5lciB0byBiZSBh IGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCB0eXBlICVzIixyZWdpc3RyYXRpb25OYW1lLHR5cGVvZiBs aXN0ZW5lcik6X3Byb2RJbnZhcmlhbnQoIjk0IixyZWdpc3RyYXRpb25OYW1lLHR5cGVvZiBsaXN0 ZW5lcik6dm9pZCAwO3ZhciBrZXk9Z2V0RGljdGlvbmFyeUtleShpbnN0KTt2YXIgYmFua0ZvclJl Z2lzdHJhdGlvbk5hbWU9bGlzdGVuZXJCYW5rW3JlZ2lzdHJhdGlvbk5hbWVdfHwobGlzdGVuZXJC YW5rW3JlZ2lzdHJhdGlvbk5hbWVdPXt9KTtiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZVtrZXldPWxp c3RlbmVyO3ZhciBQbHVnaW5Nb2R1bGU9RXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25O YW1lTW9kdWxlc1tyZWdpc3RyYXRpb25OYW1lXTtpZihQbHVnaW5Nb2R1bGUmJlBsdWdpbk1vZHVs ZS5kaWRQdXRMaXN0ZW5lcil7UGx1Z2luTW9kdWxlLmRpZFB1dExpc3RlbmVyKGluc3QscmVnaXN0 cmF0aW9uTmFtZSxsaXN0ZW5lcil9fSxnZXRMaXN0ZW5lcjpmdW5jdGlvbihpbnN0LHJlZ2lzdHJh dGlvbk5hbWUpe3ZhciBiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZT1saXN0ZW5lckJhbmtbcmVnaXN0 cmF0aW9uTmFtZV07aWYoc2hvdWxkUHJldmVudE1vdXNlRXZlbnQocmVnaXN0cmF0aW9uTmFtZSxp bnN0Ll9jdXJyZW50RWxlbWVudC50eXBlLGluc3QuX2N1cnJlbnRFbGVtZW50LnByb3BzKSl7cmV0 dXJuIG51bGx9dmFyIGtleT1nZXREaWN0aW9uYXJ5S2V5KGluc3QpO3JldHVybiBiYW5rRm9yUmVn aXN0cmF0aW9uTmFtZSYmYmFua0ZvclJlZ2lzdHJhdGlvbk5hbWVba2V5XX0sZGVsZXRlTGlzdGVu ZXI6ZnVuY3Rpb24oaW5zdCxyZWdpc3RyYXRpb25OYW1lKXt2YXIgUGx1Z2luTW9kdWxlPUV2ZW50 UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbcmVnaXN0cmF0aW9uTmFtZV07 aWYoUGx1Z2luTW9kdWxlJiZQbHVnaW5Nb2R1bGUud2lsbERlbGV0ZUxpc3RlbmVyKXtQbHVnaW5N b2R1bGUud2lsbERlbGV0ZUxpc3RlbmVyKGluc3QscmVnaXN0cmF0aW9uTmFtZSl9dmFyIGJhbmtG b3JSZWdpc3RyYXRpb25OYW1lPWxpc3RlbmVyQmFua1tyZWdpc3RyYXRpb25OYW1lXTtpZihiYW5r Rm9yUmVnaXN0cmF0aW9uTmFtZSl7dmFyIGtleT1nZXREaWN0aW9uYXJ5S2V5KGluc3QpO2RlbGV0 ZSBiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZVtrZXldfX0sZGVsZXRlQWxsTGlzdGVuZXJzOmZ1bmN0 aW9uKGluc3Qpe3ZhciBrZXk9Z2V0RGljdGlvbmFyeUtleShpbnN0KTtmb3IodmFyIHJlZ2lzdHJh dGlvbk5hbWUgaW4gbGlzdGVuZXJCYW5rKXtpZighbGlzdGVuZXJCYW5rLmhhc093blByb3BlcnR5 KHJlZ2lzdHJhdGlvbk5hbWUpKXtjb250aW51ZX1pZighbGlzdGVuZXJCYW5rW3JlZ2lzdHJhdGlv bk5hbWVdW2tleV0pe2NvbnRpbnVlfXZhciBQbHVnaW5Nb2R1bGU9RXZlbnRQbHVnaW5SZWdpc3Ry eS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tyZWdpc3RyYXRpb25OYW1lXTtpZihQbHVnaW5Nb2R1 bGUmJlBsdWdpbk1vZHVsZS53aWxsRGVsZXRlTGlzdGVuZXIpe1BsdWdpbk1vZHVsZS53aWxsRGVs ZXRlTGlzdGVuZXIoaW5zdCxyZWdpc3RyYXRpb25OYW1lKX1kZWxldGUgbGlzdGVuZXJCYW5rW3Jl Z2lzdHJhdGlvbk5hbWVdW2tleV19fSxleHRyYWN0RXZlbnRzOmZ1bmN0aW9uKHRvcExldmVsVHlw ZSx0YXJnZXRJbnN0LG5hdGl2ZUV2ZW50LG5hdGl2ZUV2ZW50VGFyZ2V0KXt2YXIgZXZlbnRzO3Zh ciBwbHVnaW5zPUV2ZW50UGx1Z2luUmVnaXN0cnkucGx1Z2lucztmb3IodmFyIGk9MDtpPHBsdWdp bnMubGVuZ3RoO2krKyl7dmFyIHBvc3NpYmxlUGx1Z2luPXBsdWdpbnNbaV07aWYocG9zc2libGVQ bHVnaW4pe3ZhciBleHRyYWN0ZWRFdmVudHM9cG9zc2libGVQbHVnaW4uZXh0cmFjdEV2ZW50cyh0 b3BMZXZlbFR5cGUsdGFyZ2V0SW5zdCxuYXRpdmVFdmVudCxuYXRpdmVFdmVudFRhcmdldCk7aWYo ZXh0cmFjdGVkRXZlbnRzKXtldmVudHM9YWNjdW11bGF0ZUludG8oZXZlbnRzLGV4dHJhY3RlZEV2 ZW50cyl9fX1yZXR1cm4gZXZlbnRzfSxlbnF1ZXVlRXZlbnRzOmZ1bmN0aW9uKGV2ZW50cyl7aWYo ZXZlbnRzKXtldmVudFF1ZXVlPWFjY3VtdWxhdGVJbnRvKGV2ZW50UXVldWUsZXZlbnRzKX19LHBy b2Nlc3NFdmVudFF1ZXVlOmZ1bmN0aW9uKHNpbXVsYXRlZCl7dmFyIHByb2Nlc3NpbmdFdmVudFF1 ZXVlPWV2ZW50UXVldWU7ZXZlbnRRdWV1ZT1udWxsO2lmKHNpbXVsYXRlZCl7Zm9yRWFjaEFjY3Vt dWxhdGVkKHByb2Nlc3NpbmdFdmVudFF1ZXVlLGV4ZWN1dGVEaXNwYXRjaGVzQW5kUmVsZWFzZVNp bXVsYXRlZCl9ZWxzZXtmb3JFYWNoQWNjdW11bGF0ZWQocHJvY2Vzc2luZ0V2ZW50UXVldWUsZXhl Y3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlVG9wTGV2ZWwpfSEhZXZlbnRRdWV1ZT8iZGV2ZWxvcG1l bnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwicHJvY2Vzc0V2ZW50UXVldWUoKTog QWRkaXRpb25hbCBldmVudHMgd2VyZSBlbnF1ZXVlZCB3aGlsZSBwcm9jZXNzaW5nIGFuIGV2ZW50 IHF1ZXVlLiBTdXBwb3J0IGZvciB0aGlzIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWQuIik6 X3Byb2RJbnZhcmlhbnQoIjk1Iik6dm9pZCAwO1JlYWN0RXJyb3JVdGlscy5yZXRocm93Q2F1Z2h0 RXJyb3IoKX0sX19wdXJnZTpmdW5jdGlvbigpe2xpc3RlbmVyQmFuaz17fX0sX19nZXRMaXN0ZW5l ckJhbms6ZnVuY3Rpb24oKXtyZXR1cm4gbGlzdGVuZXJCYW5rfX07bW9kdWxlLmV4cG9ydHM9RXZl bnRQbHVnaW5IdWJ9LHsxMDI6MTAyLDExMDoxMTAsMTI1OjEyNSwxNTA6MTUwLDE4OjE4LDE5OjE5 LDU1OjU1fV0sMTg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0 Ijt2YXIgX3Byb2RJbnZhcmlhbnQ9X2RlcmVxXygxMjUpO3ZhciBpbnZhcmlhbnQ9X2RlcmVxXygx NTApO3ZhciBldmVudFBsdWdpbk9yZGVyPW51bGw7dmFyIG5hbWVzVG9QbHVnaW5zPXt9O2Z1bmN0 aW9uIHJlY29tcHV0ZVBsdWdpbk9yZGVyaW5nKCl7aWYoIWV2ZW50UGx1Z2luT3JkZXIpe3JldHVy bn1mb3IodmFyIHBsdWdpbk5hbWUgaW4gbmFtZXNUb1BsdWdpbnMpe3ZhciBwbHVnaW5Nb2R1bGU9 bmFtZXNUb1BsdWdpbnNbcGx1Z2luTmFtZV07dmFyIHBsdWdpbkluZGV4PWV2ZW50UGx1Z2luT3Jk ZXIuaW5kZXhPZihwbHVnaW5OYW1lKTshKHBsdWdpbkluZGV4Pi0xKT8iZGV2ZWxvcG1lbnQiIT09 InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiRXZlbnRQbHVnaW5SZWdpc3RyeTogQ2Fubm90 IGluamVjdCBldmVudCBwbHVnaW5zIHRoYXQgZG8gbm90IGV4aXN0IGluIHRoZSBwbHVnaW4gb3Jk ZXJpbmcsIGAlc2AuIixwbHVnaW5OYW1lKTpfcHJvZEludmFyaWFudCgiOTYiLHBsdWdpbk5hbWUp OnZvaWQgMDtpZihFdmVudFBsdWdpblJlZ2lzdHJ5LnBsdWdpbnNbcGx1Z2luSW5kZXhdKXtjb250 aW51ZX0hcGx1Z2luTW9kdWxlLmV4dHJhY3RFdmVudHM/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0 aW9uIj9pbnZhcmlhbnQoZmFsc2UsIkV2ZW50UGx1Z2luUmVnaXN0cnk6IEV2ZW50IHBsdWdpbnMg bXVzdCBpbXBsZW1lbnQgYW4gYGV4dHJhY3RFdmVudHNgIG1ldGhvZCwgYnV0IGAlc2AgZG9lcyBu b3QuIixwbHVnaW5OYW1lKTpfcHJvZEludmFyaWFudCgiOTciLHBsdWdpbk5hbWUpOnZvaWQgMDtF dmVudFBsdWdpblJlZ2lzdHJ5LnBsdWdpbnNbcGx1Z2luSW5kZXhdPXBsdWdpbk1vZHVsZTt2YXIg cHVibGlzaGVkRXZlbnRzPXBsdWdpbk1vZHVsZS5ldmVudFR5cGVzO2Zvcih2YXIgZXZlbnROYW1l IGluIHB1Ymxpc2hlZEV2ZW50cyl7IXB1Ymxpc2hFdmVudEZvclBsdWdpbihwdWJsaXNoZWRFdmVu dHNbZXZlbnROYW1lXSxwbHVnaW5Nb2R1bGUsZXZlbnROYW1lKT8iZGV2ZWxvcG1lbnQiIT09InBy b2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiRXZlbnRQbHVnaW5SZWdpc3RyeTogRmFpbGVkIHRv IHB1Ymxpc2ggZXZlbnQgYCVzYCBmb3IgcGx1Z2luIGAlc2AuIixldmVudE5hbWUscGx1Z2luTmFt ZSk6X3Byb2RJbnZhcmlhbnQoIjk4IixldmVudE5hbWUscGx1Z2luTmFtZSk6dm9pZCAwfX19ZnVu Y3Rpb24gcHVibGlzaEV2ZW50Rm9yUGx1Z2luKGRpc3BhdGNoQ29uZmlnLHBsdWdpbk1vZHVsZSxl dmVudE5hbWUpeyEhRXZlbnRQbHVnaW5SZWdpc3RyeS5ldmVudE5hbWVEaXNwYXRjaENvbmZpZ3Mu aGFzT3duUHJvcGVydHkoZXZlbnROYW1lKT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2lu dmFyaWFudChmYWxzZSwiRXZlbnRQbHVnaW5IdWI6IE1vcmUgdGhhbiBvbmUgcGx1Z2luIGF0dGVt cHRlZCB0byBwdWJsaXNoIHRoZSBzYW1lIGV2ZW50IG5hbWUsIGAlc2AuIixldmVudE5hbWUpOl9w cm9kSW52YXJpYW50KCI5OSIsZXZlbnROYW1lKTp2b2lkIDA7RXZlbnRQbHVnaW5SZWdpc3RyeS5l dmVudE5hbWVEaXNwYXRjaENvbmZpZ3NbZXZlbnROYW1lXT1kaXNwYXRjaENvbmZpZzt2YXIgcGhh c2VkUmVnaXN0cmF0aW9uTmFtZXM9ZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFt ZXM7aWYocGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMpe2Zvcih2YXIgcGhhc2VOYW1lIGluIHBoYXNl ZFJlZ2lzdHJhdGlvbk5hbWVzKXtpZihwaGFzZWRSZWdpc3RyYXRpb25OYW1lcy5oYXNPd25Qcm9w ZXJ0eShwaGFzZU5hbWUpKXt2YXIgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZT1waGFzZWRSZWdpc3Ry YXRpb25OYW1lc1twaGFzZU5hbWVdO3B1Ymxpc2hSZWdpc3RyYXRpb25OYW1lKHBoYXNlZFJlZ2lz dHJhdGlvbk5hbWUscGx1Z2luTW9kdWxlLGV2ZW50TmFtZSl9fXJldHVybiB0cnVlfWVsc2UgaWYo ZGlzcGF0Y2hDb25maWcucmVnaXN0cmF0aW9uTmFtZSl7cHVibGlzaFJlZ2lzdHJhdGlvbk5hbWUo ZGlzcGF0Y2hDb25maWcucmVnaXN0cmF0aW9uTmFtZSxwbHVnaW5Nb2R1bGUsZXZlbnROYW1lKTty ZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9ZnVuY3Rpb24gcHVibGlzaFJlZ2lzdHJhdGlvbk5hbWUo cmVnaXN0cmF0aW9uTmFtZSxwbHVnaW5Nb2R1bGUsZXZlbnROYW1lKXshIUV2ZW50UGx1Z2luUmVn aXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbcmVnaXN0cmF0aW9uTmFtZV0/ImRldmVsb3Bt ZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsIkV2ZW50UGx1Z2luSHViOiBNb3Jl IHRoYW4gb25lIHBsdWdpbiBhdHRlbXB0ZWQgdG8gcHVibGlzaCB0aGUgc2FtZSByZWdpc3RyYXRp b24gbmFtZSwgYCVzYC4iLHJlZ2lzdHJhdGlvbk5hbWUpOl9wcm9kSW52YXJpYW50KCIxMDAiLHJl Z2lzdHJhdGlvbk5hbWUpOnZvaWQgMDtFdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5h bWVNb2R1bGVzW3JlZ2lzdHJhdGlvbk5hbWVdPXBsdWdpbk1vZHVsZTtFdmVudFBsdWdpblJlZ2lz dHJ5LnJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXNbcmVnaXN0cmF0aW9uTmFtZV09cGx1Z2lu TW9kdWxlLmV2ZW50VHlwZXNbZXZlbnROYW1lXS5kZXBlbmRlbmNpZXM7aWYoImRldmVsb3BtZW50 IiE9PSJwcm9kdWN0aW9uIil7dmFyIGxvd2VyQ2FzZWROYW1lPXJlZ2lzdHJhdGlvbk5hbWUudG9M b3dlckNhc2UoKTtFdmVudFBsdWdpblJlZ2lzdHJ5LnBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXNb bG93ZXJDYXNlZE5hbWVdPXJlZ2lzdHJhdGlvbk5hbWU7aWYocmVnaXN0cmF0aW9uTmFtZT09PSJv bkRvdWJsZUNsaWNrIil7RXZlbnRQbHVnaW5SZWdpc3RyeS5wb3NzaWJsZVJlZ2lzdHJhdGlvbk5h bWVzLm9uZGJsY2xpY2s9cmVnaXN0cmF0aW9uTmFtZX19fXZhciBFdmVudFBsdWdpblJlZ2lzdHJ5 PXtwbHVnaW5zOltdLGV2ZW50TmFtZURpc3BhdGNoQ29uZmlnczp7fSxyZWdpc3RyYXRpb25OYW1l TW9kdWxlczp7fSxyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzOnt9LHBvc3NpYmxlUmVnaXN0 cmF0aW9uTmFtZXM6ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj97fTpudWxsLGluamVjdEV2 ZW50UGx1Z2luT3JkZXI6ZnVuY3Rpb24oaW5qZWN0ZWRFdmVudFBsdWdpbk9yZGVyKXshIWV2ZW50 UGx1Z2luT3JkZXI/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2Us IkV2ZW50UGx1Z2luUmVnaXN0cnk6IENhbm5vdCBpbmplY3QgZXZlbnQgcGx1Z2luIG9yZGVyaW5n IG1vcmUgdGhhbiBvbmNlLiBZb3UgYXJlIGxpa2VseSB0cnlpbmcgdG8gbG9hZCBtb3JlIHRoYW4g b25lIGNvcHkgb2YgUmVhY3QuIik6X3Byb2RJbnZhcmlhbnQoIjEwMSIpOnZvaWQgMDtldmVudFBs dWdpbk9yZGVyPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGluamVjdGVkRXZlbnRQbHVnaW5P cmRlcik7cmVjb21wdXRlUGx1Z2luT3JkZXJpbmcoKX0saW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1l OmZ1bmN0aW9uKGluamVjdGVkTmFtZXNUb1BsdWdpbnMpe3ZhciBpc09yZGVyaW5nRGlydHk9ZmFs c2U7Zm9yKHZhciBwbHVnaW5OYW1lIGluIGluamVjdGVkTmFtZXNUb1BsdWdpbnMpe2lmKCFpbmpl Y3RlZE5hbWVzVG9QbHVnaW5zLmhhc093blByb3BlcnR5KHBsdWdpbk5hbWUpKXtjb250aW51ZX12 YXIgcGx1Z2luTW9kdWxlPWluamVjdGVkTmFtZXNUb1BsdWdpbnNbcGx1Z2luTmFtZV07aWYoIW5h bWVzVG9QbHVnaW5zLmhhc093blByb3BlcnR5KHBsdWdpbk5hbWUpfHxuYW1lc1RvUGx1Z2luc1tw bHVnaW5OYW1lXSE9PXBsdWdpbk1vZHVsZSl7ISFuYW1lc1RvUGx1Z2luc1twbHVnaW5OYW1lXT8i ZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiRXZlbnRQbHVnaW5S ZWdpc3RyeTogQ2Fubm90IGluamVjdCB0d28gZGlmZmVyZW50IGV2ZW50IHBsdWdpbnMgdXNpbmcg dGhlIHNhbWUgbmFtZSwgYCVzYC4iLHBsdWdpbk5hbWUpOl9wcm9kSW52YXJpYW50KCIxMDIiLHBs dWdpbk5hbWUpOnZvaWQgMDtuYW1lc1RvUGx1Z2luc1twbHVnaW5OYW1lXT1wbHVnaW5Nb2R1bGU7 aXNPcmRlcmluZ0RpcnR5PXRydWV9fWlmKGlzT3JkZXJpbmdEaXJ0eSl7cmVjb21wdXRlUGx1Z2lu T3JkZXJpbmcoKX19LGdldFBsdWdpbk1vZHVsZUZvckV2ZW50OmZ1bmN0aW9uKGV2ZW50KXt2YXIg ZGlzcGF0Y2hDb25maWc9ZXZlbnQuZGlzcGF0Y2hDb25maWc7aWYoZGlzcGF0Y2hDb25maWcucmVn aXN0cmF0aW9uTmFtZSl7cmV0dXJuIEV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFt ZU1vZHVsZXNbZGlzcGF0Y2hDb25maWcucmVnaXN0cmF0aW9uTmFtZV18fG51bGx9aWYoZGlzcGF0 Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMhPT11bmRlZmluZWQpe3ZhciBwaGFzZWRS ZWdpc3RyYXRpb25OYW1lcz1kaXNwYXRjaENvbmZpZy5waGFzZWRSZWdpc3RyYXRpb25OYW1lcztm b3IodmFyIHBoYXNlIGluIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzKXtpZighcGhhc2VkUmVnaXN0 cmF0aW9uTmFtZXMuaGFzT3duUHJvcGVydHkocGhhc2UpKXtjb250aW51ZX12YXIgcGx1Z2luTW9k dWxlPUV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbcGhhc2VkUmVn aXN0cmF0aW9uTmFtZXNbcGhhc2VdXTtpZihwbHVnaW5Nb2R1bGUpe3JldHVybiBwbHVnaW5Nb2R1 bGV9fX1yZXR1cm4gbnVsbH0sX3Jlc2V0RXZlbnRQbHVnaW5zOmZ1bmN0aW9uKCl7ZXZlbnRQbHVn aW5PcmRlcj1udWxsO2Zvcih2YXIgcGx1Z2luTmFtZSBpbiBuYW1lc1RvUGx1Z2lucyl7aWYobmFt ZXNUb1BsdWdpbnMuaGFzT3duUHJvcGVydHkocGx1Z2luTmFtZSkpe2RlbGV0ZSBuYW1lc1RvUGx1 Z2luc1twbHVnaW5OYW1lXX19RXZlbnRQbHVnaW5SZWdpc3RyeS5wbHVnaW5zLmxlbmd0aD0wO3Zh ciBldmVudE5hbWVEaXNwYXRjaENvbmZpZ3M9RXZlbnRQbHVnaW5SZWdpc3RyeS5ldmVudE5hbWVE aXNwYXRjaENvbmZpZ3M7Zm9yKHZhciBldmVudE5hbWUgaW4gZXZlbnROYW1lRGlzcGF0Y2hDb25m aWdzKXtpZihldmVudE5hbWVEaXNwYXRjaENvbmZpZ3MuaGFzT3duUHJvcGVydHkoZXZlbnROYW1l KSl7ZGVsZXRlIGV2ZW50TmFtZURpc3BhdGNoQ29uZmlnc1tldmVudE5hbWVdfX12YXIgcmVnaXN0 cmF0aW9uTmFtZU1vZHVsZXM9RXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9k dWxlcztmb3IodmFyIHJlZ2lzdHJhdGlvbk5hbWUgaW4gcmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMp e2lmKHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzLmhhc093blByb3BlcnR5KHJlZ2lzdHJhdGlvbk5h bWUpKXtkZWxldGUgcmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbcmVnaXN0cmF0aW9uTmFtZV19fWlm KCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe3ZhciBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5h bWVzPUV2ZW50UGx1Z2luUmVnaXN0cnkucG9zc2libGVSZWdpc3RyYXRpb25OYW1lcztmb3IodmFy IGxvd2VyQ2FzZWROYW1lIGluIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMpe2lmKHBvc3NpYmxl UmVnaXN0cmF0aW9uTmFtZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpKXtkZWxldGUg cG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV19fX19fTttb2R1bGUuZXhw b3J0cz1FdmVudFBsdWdpblJlZ2lzdHJ5fSx7MTI1OjEyNSwxNTA6MTUwfV0sMTk6W2Z1bmN0aW9u KF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgX3Byb2RJbnZhcmlhbnQ9 X2RlcmVxXygxMjUpO3ZhciBSZWFjdEVycm9yVXRpbHM9X2RlcmVxXyg1NSk7dmFyIGludmFyaWFu dD1fZGVyZXFfKDE1MCk7dmFyIHdhcm5pbmc9X2RlcmVxXygxNTcpO3ZhciBDb21wb25lbnRUcmVl O3ZhciBUcmVlVHJhdmVyc2FsO3ZhciBpbmplY3Rpb249e2luamVjdENvbXBvbmVudFRyZWU6ZnVu Y3Rpb24oSW5qZWN0ZWQpe0NvbXBvbmVudFRyZWU9SW5qZWN0ZWQ7aWYoImRldmVsb3BtZW50IiE9 PSJwcm9kdWN0aW9uIil7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKEluamVj dGVkJiZJbmplY3RlZC5nZXROb2RlRnJvbUluc3RhbmNlJiZJbmplY3RlZC5nZXRJbnN0YW5jZUZy b21Ob2RlLCJFdmVudFBsdWdpblV0aWxzLmluamVjdGlvbi5pbmplY3RDb21wb25lbnRUcmVlKC4u Lik6IEluamVjdGVkICIrIm1vZHVsZSBpcyBtaXNzaW5nIGdldE5vZGVGcm9tSW5zdGFuY2Ugb3Ig Z2V0SW5zdGFuY2VGcm9tTm9kZS4iKTp2b2lkIDB9fSxpbmplY3RUcmVlVHJhdmVyc2FsOmZ1bmN0 aW9uKEluamVjdGVkKXtUcmVlVHJhdmVyc2FsPUluamVjdGVkO2lmKCJkZXZlbG9wbWVudCIhPT0i cHJvZHVjdGlvbiIpeyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyhJbmplY3Rl ZCYmSW5qZWN0ZWQuaXNBbmNlc3RvciYmSW5qZWN0ZWQuZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3Is IkV2ZW50UGx1Z2luVXRpbHMuaW5qZWN0aW9uLmluamVjdFRyZWVUcmF2ZXJzYWwoLi4uKTogSW5q ZWN0ZWQgIisibW9kdWxlIGlzIG1pc3NpbmcgaXNBbmNlc3RvciBvciBnZXRMb3dlc3RDb21tb25B bmNlc3Rvci4iKTp2b2lkIDB9fX07ZnVuY3Rpb24gaXNFbmRpc2godG9wTGV2ZWxUeXBlKXtyZXR1 cm4gdG9wTGV2ZWxUeXBlPT09InRvcE1vdXNlVXAifHx0b3BMZXZlbFR5cGU9PT0idG9wVG91Y2hF bmQifHx0b3BMZXZlbFR5cGU9PT0idG9wVG91Y2hDYW5jZWwifWZ1bmN0aW9uIGlzTW92ZWlzaCh0 b3BMZXZlbFR5cGUpe3JldHVybiB0b3BMZXZlbFR5cGU9PT0idG9wTW91c2VNb3ZlInx8dG9wTGV2 ZWxUeXBlPT09InRvcFRvdWNoTW92ZSJ9ZnVuY3Rpb24gaXNTdGFydGlzaCh0b3BMZXZlbFR5cGUp e3JldHVybiB0b3BMZXZlbFR5cGU9PT0idG9wTW91c2VEb3duInx8dG9wTGV2ZWxUeXBlPT09InRv cFRvdWNoU3RhcnQifXZhciB2YWxpZGF0ZUV2ZW50RGlzcGF0Y2hlcztpZigiZGV2ZWxvcG1lbnQi IT09InByb2R1Y3Rpb24iKXt2YWxpZGF0ZUV2ZW50RGlzcGF0Y2hlcz1mdW5jdGlvbihldmVudCl7 dmFyIGRpc3BhdGNoTGlzdGVuZXJzPWV2ZW50Ll9kaXNwYXRjaExpc3RlbmVyczt2YXIgZGlzcGF0 Y2hJbnN0YW5jZXM9ZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzO3ZhciBsaXN0ZW5lcnNJc0Fycj1B cnJheS5pc0FycmF5KGRpc3BhdGNoTGlzdGVuZXJzKTt2YXIgbGlzdGVuZXJzTGVuPWxpc3RlbmVy c0lzQXJyP2Rpc3BhdGNoTGlzdGVuZXJzLmxlbmd0aDpkaXNwYXRjaExpc3RlbmVycz8xOjA7dmFy IGluc3RhbmNlc0lzQXJyPUFycmF5LmlzQXJyYXkoZGlzcGF0Y2hJbnN0YW5jZXMpO3ZhciBpbnN0 YW5jZXNMZW49aW5zdGFuY2VzSXNBcnI/ZGlzcGF0Y2hJbnN0YW5jZXMubGVuZ3RoOmRpc3BhdGNo SW5zdGFuY2VzPzE6MDsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmcoaW5zdGFu Y2VzSXNBcnI9PT1saXN0ZW5lcnNJc0FyciYmaW5zdGFuY2VzTGVuPT09bGlzdGVuZXJzTGVuLCJF dmVudFBsdWdpblV0aWxzOiBJbnZhbGlkIGBldmVudGAuIik6dm9pZCAwfX1mdW5jdGlvbiBleGVj dXRlRGlzcGF0Y2goZXZlbnQsc2ltdWxhdGVkLGxpc3RlbmVyLGluc3Qpe3ZhciB0eXBlPWV2ZW50 LnR5cGV8fCJ1bmtub3duLWV2ZW50IjtldmVudC5jdXJyZW50VGFyZ2V0PUV2ZW50UGx1Z2luVXRp bHMuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KTtpZihzaW11bGF0ZWQpe1JlYWN0RXJyb3JVdGls cy5pbnZva2VHdWFyZGVkQ2FsbGJhY2tXaXRoQ2F0Y2godHlwZSxsaXN0ZW5lcixldmVudCl9ZWxz ZXtSZWFjdEVycm9yVXRpbHMuaW52b2tlR3VhcmRlZENhbGxiYWNrKHR5cGUsbGlzdGVuZXIsZXZl bnQpfWV2ZW50LmN1cnJlbnRUYXJnZXQ9bnVsbH1mdW5jdGlvbiBleGVjdXRlRGlzcGF0Y2hlc0lu T3JkZXIoZXZlbnQsc2ltdWxhdGVkKXt2YXIgZGlzcGF0Y2hMaXN0ZW5lcnM9ZXZlbnQuX2Rpc3Bh dGNoTGlzdGVuZXJzO3ZhciBkaXNwYXRjaEluc3RhbmNlcz1ldmVudC5fZGlzcGF0Y2hJbnN0YW5j ZXM7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7dmFsaWRhdGVFdmVudERpc3BhdGNo ZXMoZXZlbnQpfWlmKEFycmF5LmlzQXJyYXkoZGlzcGF0Y2hMaXN0ZW5lcnMpKXtmb3IodmFyIGk9 MDtpPGRpc3BhdGNoTGlzdGVuZXJzLmxlbmd0aDtpKyspe2lmKGV2ZW50LmlzUHJvcGFnYXRpb25T dG9wcGVkKCkpe2JyZWFrfWV4ZWN1dGVEaXNwYXRjaChldmVudCxzaW11bGF0ZWQsZGlzcGF0Y2hM aXN0ZW5lcnNbaV0sZGlzcGF0Y2hJbnN0YW5jZXNbaV0pfX1lbHNlIGlmKGRpc3BhdGNoTGlzdGVu ZXJzKXtleGVjdXRlRGlzcGF0Y2goZXZlbnQsc2ltdWxhdGVkLGRpc3BhdGNoTGlzdGVuZXJzLGRp c3BhdGNoSW5zdGFuY2VzKX1ldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnM9bnVsbDtldmVudC5fZGlz cGF0Y2hJbnN0YW5jZXM9bnVsbH1mdW5jdGlvbiBleGVjdXRlRGlzcGF0Y2hlc0luT3JkZXJTdG9w QXRUcnVlSW1wbChldmVudCl7dmFyIGRpc3BhdGNoTGlzdGVuZXJzPWV2ZW50Ll9kaXNwYXRjaExp c3RlbmVyczt2YXIgZGlzcGF0Y2hJbnN0YW5jZXM9ZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzO2lm KCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe3ZhbGlkYXRlRXZlbnREaXNwYXRjaGVzKGV2 ZW50KX1pZihBcnJheS5pc0FycmF5KGRpc3BhdGNoTGlzdGVuZXJzKSl7Zm9yKHZhciBpPTA7aTxk aXNwYXRjaExpc3RlbmVycy5sZW5ndGg7aSsrKXtpZihldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBl ZCgpKXticmVha31pZihkaXNwYXRjaExpc3RlbmVyc1tpXShldmVudCxkaXNwYXRjaEluc3RhbmNl c1tpXSkpe3JldHVybiBkaXNwYXRjaEluc3RhbmNlc1tpXX19fWVsc2UgaWYoZGlzcGF0Y2hMaXN0 ZW5lcnMpe2lmKGRpc3BhdGNoTGlzdGVuZXJzKGV2ZW50LGRpc3BhdGNoSW5zdGFuY2VzKSl7cmV0 dXJuIGRpc3BhdGNoSW5zdGFuY2VzfX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBleGVjdXRlRGlzcGF0 Y2hlc0luT3JkZXJTdG9wQXRUcnVlKGV2ZW50KXt2YXIgcmV0PWV4ZWN1dGVEaXNwYXRjaGVzSW5P cmRlclN0b3BBdFRydWVJbXBsKGV2ZW50KTtldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXM9bnVsbDtl dmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnM9bnVsbDtyZXR1cm4gcmV0fWZ1bmN0aW9uIGV4ZWN1dGVE aXJlY3REaXNwYXRjaChldmVudCl7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7dmFs aWRhdGVFdmVudERpc3BhdGNoZXMoZXZlbnQpfXZhciBkaXNwYXRjaExpc3RlbmVyPWV2ZW50Ll9k aXNwYXRjaExpc3RlbmVyczt2YXIgZGlzcGF0Y2hJbnN0YW5jZT1ldmVudC5fZGlzcGF0Y2hJbnN0 YW5jZXM7ISFBcnJheS5pc0FycmF5KGRpc3BhdGNoTGlzdGVuZXIpPyJkZXZlbG9wbWVudCIhPT0i cHJvZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJleGVjdXRlRGlyZWN0RGlzcGF0Y2goLi4uKTog SW52YWxpZCBgZXZlbnRgLiIpOl9wcm9kSW52YXJpYW50KCIxMDMiKTp2b2lkIDA7ZXZlbnQuY3Vy cmVudFRhcmdldD1kaXNwYXRjaExpc3RlbmVyP0V2ZW50UGx1Z2luVXRpbHMuZ2V0Tm9kZUZyb21J bnN0YW5jZShkaXNwYXRjaEluc3RhbmNlKTpudWxsO3ZhciByZXM9ZGlzcGF0Y2hMaXN0ZW5lcj9k aXNwYXRjaExpc3RlbmVyKGV2ZW50KTpudWxsO2V2ZW50LmN1cnJlbnRUYXJnZXQ9bnVsbDtldmVu dC5fZGlzcGF0Y2hMaXN0ZW5lcnM9bnVsbDtldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXM9bnVsbDty ZXR1cm4gcmVzfWZ1bmN0aW9uIGhhc0Rpc3BhdGNoZXMoZXZlbnQpe3JldHVybiEhZXZlbnQuX2Rp c3BhdGNoTGlzdGVuZXJzfXZhciBFdmVudFBsdWdpblV0aWxzPXtpc0VuZGlzaDppc0VuZGlzaCxp c01vdmVpc2g6aXNNb3ZlaXNoLGlzU3RhcnRpc2g6aXNTdGFydGlzaCxleGVjdXRlRGlyZWN0RGlz cGF0Y2g6ZXhlY3V0ZURpcmVjdERpc3BhdGNoLGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlcjpleGVj dXRlRGlzcGF0Y2hlc0luT3JkZXIsZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyU3RvcEF0VHJ1ZTpl eGVjdXRlRGlzcGF0Y2hlc0luT3JkZXJTdG9wQXRUcnVlLGhhc0Rpc3BhdGNoZXM6aGFzRGlzcGF0 Y2hlcyxnZXRJbnN0YW5jZUZyb21Ob2RlOmZ1bmN0aW9uKG5vZGUpe3JldHVybiBDb21wb25lbnRU cmVlLmdldEluc3RhbmNlRnJvbU5vZGUobm9kZSl9LGdldE5vZGVGcm9tSW5zdGFuY2U6ZnVuY3Rp b24obm9kZSl7cmV0dXJuIENvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShub2RlKX0s aXNBbmNlc3RvcjpmdW5jdGlvbihhLGIpe3JldHVybiBUcmVlVHJhdmVyc2FsLmlzQW5jZXN0b3Io YSxiKX0sZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3I6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVHJlZVRy YXZlcnNhbC5nZXRMb3dlc3RDb21tb25BbmNlc3RvcihhLGIpfSxnZXRQYXJlbnRJbnN0YW5jZTpm dW5jdGlvbihpbnN0KXtyZXR1cm4gVHJlZVRyYXZlcnNhbC5nZXRQYXJlbnRJbnN0YW5jZShpbnN0 KX0sdHJhdmVyc2VUd29QaGFzZTpmdW5jdGlvbih0YXJnZXQsZm4sYXJnKXtyZXR1cm4gVHJlZVRy YXZlcnNhbC50cmF2ZXJzZVR3b1BoYXNlKHRhcmdldCxmbixhcmcpfSx0cmF2ZXJzZUVudGVyTGVh dmU6ZnVuY3Rpb24oZnJvbSx0byxmbixhcmdGcm9tLGFyZ1RvKXtyZXR1cm4gVHJlZVRyYXZlcnNh bC50cmF2ZXJzZUVudGVyTGVhdmUoZnJvbSx0byxmbixhcmdGcm9tLGFyZ1RvKX0saW5qZWN0aW9u OmluamVjdGlvbn07bW9kdWxlLmV4cG9ydHM9RXZlbnRQbHVnaW5VdGlsc30sezEyNToxMjUsMTUw OjE1MCwxNTc6MTU3LDU1OjU1fV0sMjA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMp eyJ1c2Ugc3RyaWN0Ijt2YXIgRXZlbnRQbHVnaW5IdWI9X2RlcmVxXygxNyk7dmFyIEV2ZW50UGx1 Z2luVXRpbHM9X2RlcmVxXygxOSk7dmFyIGFjY3VtdWxhdGVJbnRvPV9kZXJlcV8oMTAyKTt2YXIg Zm9yRWFjaEFjY3VtdWxhdGVkPV9kZXJlcV8oMTEwKTt2YXIgd2FybmluZz1fZGVyZXFfKDE1Nyk7 dmFyIGdldExpc3RlbmVyPUV2ZW50UGx1Z2luSHViLmdldExpc3RlbmVyO2Z1bmN0aW9uIGxpc3Rl bmVyQXRQaGFzZShpbnN0LGV2ZW50LHByb3BhZ2F0aW9uUGhhc2Upe3ZhciByZWdpc3RyYXRpb25O YW1lPWV2ZW50LmRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzW3Byb3BhZ2F0 aW9uUGhhc2VdO3JldHVybiBnZXRMaXN0ZW5lcihpbnN0LHJlZ2lzdHJhdGlvbk5hbWUpfWZ1bmN0 aW9uIGFjY3VtdWxhdGVEaXJlY3Rpb25hbERpc3BhdGNoZXMoaW5zdCxwaGFzZSxldmVudCl7aWYo ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9u Ij93YXJuaW5nKGluc3QsIkRpc3BhdGNoaW5nIGluc3QgbXVzdCBub3QgYmUgbnVsbCIpOnZvaWQg MH12YXIgbGlzdGVuZXI9bGlzdGVuZXJBdFBoYXNlKGluc3QsZXZlbnQscGhhc2UpO2lmKGxpc3Rl bmVyKXtldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnM9YWNjdW11bGF0ZUludG8oZXZlbnQuX2Rpc3Bh dGNoTGlzdGVuZXJzLGxpc3RlbmVyKTtldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXM9YWNjdW11bGF0 ZUludG8oZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzLGluc3QpfX1mdW5jdGlvbiBhY2N1bXVsYXRl VHdvUGhhc2VEaXNwYXRjaGVzU2luZ2xlKGV2ZW50KXtpZihldmVudCYmZXZlbnQuZGlzcGF0Y2hD b25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMpe0V2ZW50UGx1Z2luVXRpbHMudHJhdmVyc2VU d29QaGFzZShldmVudC5fdGFyZ2V0SW5zdCxhY2N1bXVsYXRlRGlyZWN0aW9uYWxEaXNwYXRjaGVz LGV2ZW50KX19ZnVuY3Rpb24gYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1NpbmdsZVNraXBU YXJnZXQoZXZlbnQpe2lmKGV2ZW50JiZldmVudC5kaXNwYXRjaENvbmZpZy5waGFzZWRSZWdpc3Ry YXRpb25OYW1lcyl7dmFyIHRhcmdldEluc3Q9ZXZlbnQuX3RhcmdldEluc3Q7dmFyIHBhcmVudElu c3Q9dGFyZ2V0SW5zdD9FdmVudFBsdWdpblV0aWxzLmdldFBhcmVudEluc3RhbmNlKHRhcmdldElu c3QpOm51bGw7RXZlbnRQbHVnaW5VdGlscy50cmF2ZXJzZVR3b1BoYXNlKHBhcmVudEluc3QsYWNj dW11bGF0ZURpcmVjdGlvbmFsRGlzcGF0Y2hlcyxldmVudCl9fWZ1bmN0aW9uIGFjY3VtdWxhdGVE aXNwYXRjaGVzKGluc3QsaWdub3JlZERpcmVjdGlvbixldmVudCl7aWYoZXZlbnQmJmV2ZW50LmRp c3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUpe3ZhciByZWdpc3RyYXRpb25OYW1lPWV2ZW50 LmRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWU7dmFyIGxpc3RlbmVyPWdldExpc3RlbmVy KGluc3QscmVnaXN0cmF0aW9uTmFtZSk7aWYobGlzdGVuZXIpe2V2ZW50Ll9kaXNwYXRjaExpc3Rl bmVycz1hY2N1bXVsYXRlSW50byhldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnMsbGlzdGVuZXIpO2V2 ZW50Ll9kaXNwYXRjaEluc3RhbmNlcz1hY2N1bXVsYXRlSW50byhldmVudC5fZGlzcGF0Y2hJbnN0 YW5jZXMsaW5zdCl9fX1mdW5jdGlvbiBhY2N1bXVsYXRlRGlyZWN0RGlzcGF0Y2hlc1NpbmdsZShl dmVudCl7aWYoZXZlbnQmJmV2ZW50LmRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUpe2Fj Y3VtdWxhdGVEaXNwYXRjaGVzKGV2ZW50Ll90YXJnZXRJbnN0LG51bGwsZXZlbnQpfX1mdW5jdGlv biBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGV2ZW50cyl7Zm9yRWFjaEFjY3VtdWxhdGVk KGV2ZW50cyxhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzU2luZ2xlKX1mdW5jdGlvbiBhY2N1 bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzU2tpcFRhcmdldChldmVudHMpe2ZvckVhY2hBY2N1bXVs YXRlZChldmVudHMsYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1NpbmdsZVNraXBUYXJnZXQp fWZ1bmN0aW9uIGFjY3VtdWxhdGVFbnRlckxlYXZlRGlzcGF0Y2hlcyhsZWF2ZSxlbnRlcixmcm9t LHRvKXtFdmVudFBsdWdpblV0aWxzLnRyYXZlcnNlRW50ZXJMZWF2ZShmcm9tLHRvLGFjY3VtdWxh dGVEaXNwYXRjaGVzLGxlYXZlLGVudGVyKX1mdW5jdGlvbiBhY2N1bXVsYXRlRGlyZWN0RGlzcGF0 Y2hlcyhldmVudHMpe2ZvckVhY2hBY2N1bXVsYXRlZChldmVudHMsYWNjdW11bGF0ZURpcmVjdERp c3BhdGNoZXNTaW5nbGUpfXZhciBFdmVudFByb3BhZ2F0b3JzPXthY2N1bXVsYXRlVHdvUGhhc2VE aXNwYXRjaGVzOmFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMsYWNjdW11bGF0ZVR3b1BoYXNl RGlzcGF0Y2hlc1NraXBUYXJnZXQ6YWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1NraXBUYXJn ZXQsYWNjdW11bGF0ZURpcmVjdERpc3BhdGNoZXM6YWNjdW11bGF0ZURpcmVjdERpc3BhdGNoZXMs YWNjdW11bGF0ZUVudGVyTGVhdmVEaXNwYXRjaGVzOmFjY3VtdWxhdGVFbnRlckxlYXZlRGlzcGF0 Y2hlc307bW9kdWxlLmV4cG9ydHM9RXZlbnRQcm9wYWdhdG9yc30sezEwMjoxMDIsMTEwOjExMCwx NTc6MTU3LDE3OjE3LDE5OjE5fV0sMjE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMp eyJ1c2Ugc3RyaWN0Ijt2YXIgX2Fzc2lnbj1fZGVyZXFfKDE1OCk7dmFyIFBvb2xlZENsYXNzPV9k ZXJlcV8oMjUpO3ZhciBnZXRUZXh0Q29udGVudEFjY2Vzc29yPV9kZXJlcV8oMTE5KTtmdW5jdGlv biBGYWxsYmFja0NvbXBvc2l0aW9uU3RhdGUocm9vdCl7dGhpcy5fcm9vdD1yb290O3RoaXMuX3N0 YXJ0VGV4dD10aGlzLmdldFRleHQoKTt0aGlzLl9mYWxsYmFja1RleHQ9bnVsbH1fYXNzaWduKEZh bGxiYWNrQ29tcG9zaXRpb25TdGF0ZS5wcm90b3R5cGUse2Rlc3RydWN0b3I6ZnVuY3Rpb24oKXt0 aGlzLl9yb290PW51bGw7dGhpcy5fc3RhcnRUZXh0PW51bGw7dGhpcy5fZmFsbGJhY2tUZXh0PW51 bGx9LGdldFRleHQ6ZnVuY3Rpb24oKXtpZigidmFsdWUiaW4gdGhpcy5fcm9vdCl7cmV0dXJuIHRo aXMuX3Jvb3QudmFsdWV9cmV0dXJuIHRoaXMuX3Jvb3RbZ2V0VGV4dENvbnRlbnRBY2Nlc3Nvcigp XX0sZ2V0RGF0YTpmdW5jdGlvbigpe2lmKHRoaXMuX2ZhbGxiYWNrVGV4dCl7cmV0dXJuIHRoaXMu X2ZhbGxiYWNrVGV4dH12YXIgc3RhcnQ7dmFyIHN0YXJ0VmFsdWU9dGhpcy5fc3RhcnRUZXh0O3Zh ciBzdGFydExlbmd0aD1zdGFydFZhbHVlLmxlbmd0aDt2YXIgZW5kO3ZhciBlbmRWYWx1ZT10aGlz LmdldFRleHQoKTt2YXIgZW5kTGVuZ3RoPWVuZFZhbHVlLmxlbmd0aDtmb3Ioc3RhcnQ9MDtzdGFy dDxzdGFydExlbmd0aDtzdGFydCsrKXtpZihzdGFydFZhbHVlW3N0YXJ0XSE9PWVuZFZhbHVlW3N0 YXJ0XSl7YnJlYWt9fXZhciBtaW5FbmQ9c3RhcnRMZW5ndGgtc3RhcnQ7Zm9yKGVuZD0xO2VuZDw9 bWluRW5kO2VuZCsrKXtpZihzdGFydFZhbHVlW3N0YXJ0TGVuZ3RoLWVuZF0hPT1lbmRWYWx1ZVtl bmRMZW5ndGgtZW5kXSl7YnJlYWt9fXZhciBzbGljZVRhaWw9ZW5kPjE/MS1lbmQ6dW5kZWZpbmVk O3RoaXMuX2ZhbGxiYWNrVGV4dD1lbmRWYWx1ZS5zbGljZShzdGFydCxzbGljZVRhaWwpO3JldHVy biB0aGlzLl9mYWxsYmFja1RleHR9fSk7UG9vbGVkQ2xhc3MuYWRkUG9vbGluZ1RvKEZhbGxiYWNr Q29tcG9zaXRpb25TdGF0ZSk7bW9kdWxlLmV4cG9ydHM9RmFsbGJhY2tDb21wb3NpdGlvblN0YXRl fSx7MTE5OjExOSwxNTg6MTU4LDI1OjI1fV0sMjI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4 cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgRE9NUHJvcGVydHk9X2RlcmVxXygxMSk7dmFyIE1VU1Rf VVNFX1BST1BFUlRZPURPTVByb3BlcnR5LmluamVjdGlvbi5NVVNUX1VTRV9QUk9QRVJUWTt2YXIg SEFTX0JPT0xFQU5fVkFMVUU9RE9NUHJvcGVydHkuaW5qZWN0aW9uLkhBU19CT09MRUFOX1ZBTFVF O3ZhciBIQVNfTlVNRVJJQ19WQUxVRT1ET01Qcm9wZXJ0eS5pbmplY3Rpb24uSEFTX05VTUVSSUNf VkFMVUU7dmFyIEhBU19QT1NJVElWRV9OVU1FUklDX1ZBTFVFPURPTVByb3BlcnR5LmluamVjdGlv bi5IQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRTt2YXIgSEFTX09WRVJMT0FERURfQk9PTEVBTl9W QUxVRT1ET01Qcm9wZXJ0eS5pbmplY3Rpb24uSEFTX09WRVJMT0FERURfQk9PTEVBTl9WQUxVRTt2 YXIgSFRNTERPTVByb3BlcnR5Q29uZmlnPXtpc0N1c3RvbUF0dHJpYnV0ZTpSZWdFeHAucHJvdG90 eXBlLnRlc3QuYmluZChuZXcgUmVnRXhwKCJeKGRhdGF8YXJpYSktWyIrRE9NUHJvcGVydHkuQVRU UklCVVRFX05BTUVfQ0hBUisiXSokIikpLFByb3BlcnRpZXM6e2FjY2VwdDowLGFjY2VwdENoYXJz ZXQ6MCxhY2Nlc3NLZXk6MCxhY3Rpb246MCxhbGxvd0Z1bGxTY3JlZW46SEFTX0JPT0xFQU5fVkFM VUUsYWxsb3dUcmFuc3BhcmVuY3k6MCxhbHQ6MCxhczowLGFzeW5jOkhBU19CT09MRUFOX1ZBTFVF LGF1dG9Db21wbGV0ZTowLGF1dG9QbGF5OkhBU19CT09MRUFOX1ZBTFVFLGNhcHR1cmU6SEFTX0JP T0xFQU5fVkFMVUUsY2VsbFBhZGRpbmc6MCxjZWxsU3BhY2luZzowLGNoYXJTZXQ6MCxjaGFsbGVu Z2U6MCxjaGVja2VkOk1VU1RfVVNFX1BST1BFUlRZfEhBU19CT09MRUFOX1ZBTFVFLGNpdGU6MCxj bGFzc0lEOjAsY2xhc3NOYW1lOjAsY29sczpIQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRSxjb2xT cGFuOjAsY29udGVudDowLGNvbnRlbnRFZGl0YWJsZTowLGNvbnRleHRNZW51OjAsY29udHJvbHM6 SEFTX0JPT0xFQU5fVkFMVUUsY29vcmRzOjAsY3Jvc3NPcmlnaW46MCxkYXRhOjAsZGF0ZVRpbWU6 MCxkZWZhdWx0OkhBU19CT09MRUFOX1ZBTFVFLGRlZmVyOkhBU19CT09MRUFOX1ZBTFVFLGRpcjow LGRpc2FibGVkOkhBU19CT09MRUFOX1ZBTFVFLGRvd25sb2FkOkhBU19PVkVSTE9BREVEX0JPT0xF QU5fVkFMVUUsZHJhZ2dhYmxlOjAsZW5jVHlwZTowLGZvcm06MCxmb3JtQWN0aW9uOjAsZm9ybUVu Y1R5cGU6MCxmb3JtTWV0aG9kOjAsZm9ybU5vVmFsaWRhdGU6SEFTX0JPT0xFQU5fVkFMVUUsZm9y bVRhcmdldDowLGZyYW1lQm9yZGVyOjAsaGVhZGVyczowLGhlaWdodDowLGhpZGRlbjpIQVNfQk9P TEVBTl9WQUxVRSxoaWdoOjAsaHJlZjowLGhyZWZMYW5nOjAsaHRtbEZvcjowLGh0dHBFcXVpdjow LGljb246MCxpZDowLGlucHV0TW9kZTowLGludGVncml0eTowLGlzOjAsa2V5UGFyYW1zOjAsa2V5 VHlwZTowLGtpbmQ6MCxsYWJlbDowLGxhbmc6MCxsaXN0OjAsbG9vcDpIQVNfQk9PTEVBTl9WQUxV RSxsb3c6MCxtYW5pZmVzdDowLG1hcmdpbkhlaWdodDowLG1hcmdpbldpZHRoOjAsbWF4OjAsbWF4 TGVuZ3RoOjAsbWVkaWE6MCxtZWRpYUdyb3VwOjAsbWV0aG9kOjAsbWluOjAsbWluTGVuZ3RoOjAs bXVsdGlwbGU6TVVTVF9VU0VfUFJPUEVSVFl8SEFTX0JPT0xFQU5fVkFMVUUsbXV0ZWQ6TVVTVF9V U0VfUFJPUEVSVFl8SEFTX0JPT0xFQU5fVkFMVUUsbmFtZTowLG5vbmNlOjAsbm9WYWxpZGF0ZTpI QVNfQk9PTEVBTl9WQUxVRSxvcGVuOkhBU19CT09MRUFOX1ZBTFVFLG9wdGltdW06MCxwYXR0ZXJu OjAscGxhY2Vob2xkZXI6MCxwbGF5c0lubGluZTpIQVNfQk9PTEVBTl9WQUxVRSxwb3N0ZXI6MCxw cmVsb2FkOjAscHJvZmlsZTowLHJhZGlvR3JvdXA6MCxyZWFkT25seTpIQVNfQk9PTEVBTl9WQUxV RSxyZWZlcnJlclBvbGljeTowLHJlbDowLHJlcXVpcmVkOkhBU19CT09MRUFOX1ZBTFVFLHJldmVy c2VkOkhBU19CT09MRUFOX1ZBTFVFLHJvbGU6MCxyb3dzOkhBU19QT1NJVElWRV9OVU1FUklDX1ZB TFVFLHJvd1NwYW46SEFTX05VTUVSSUNfVkFMVUUsc2FuZGJveDowLHNjb3BlOjAsc2NvcGVkOkhB U19CT09MRUFOX1ZBTFVFLHNjcm9sbGluZzowLHNlYW1sZXNzOkhBU19CT09MRUFOX1ZBTFVFLHNl bGVjdGVkOk1VU1RfVVNFX1BST1BFUlRZfEhBU19CT09MRUFOX1ZBTFVFLHNoYXBlOjAsc2l6ZTpI QVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRSxzaXplczowLHNwYW46SEFTX1BPU0lUSVZFX05VTUVS SUNfVkFMVUUsc3BlbGxDaGVjazowLHNyYzowLHNyY0RvYzowLHNyY0xhbmc6MCxzcmNTZXQ6MCxz dGFydDpIQVNfTlVNRVJJQ19WQUxVRSxzdGVwOjAsc3R5bGU6MCxzdW1tYXJ5OjAsdGFiSW5kZXg6 MCx0YXJnZXQ6MCx0aXRsZTowLHR5cGU6MCx1c2VNYXA6MCx2YWx1ZTowLHdpZHRoOjAsd21vZGU6 MCx3cmFwOjAsYWJvdXQ6MCxkYXRhdHlwZTowLGlubGlzdDowLHByZWZpeDowLHByb3BlcnR5OjAs cmVzb3VyY2U6MCx0eXBlb2Y6MCx2b2NhYjowLGF1dG9DYXBpdGFsaXplOjAsYXV0b0NvcnJlY3Q6 MCxhdXRvU2F2ZTowLGNvbG9yOjAsaXRlbVByb3A6MCxpdGVtU2NvcGU6SEFTX0JPT0xFQU5fVkFM VUUsaXRlbVR5cGU6MCxpdGVtSUQ6MCxpdGVtUmVmOjAscmVzdWx0czowLHNlY3VyaXR5OjAsdW5z ZWxlY3RhYmxlOjB9LERPTUF0dHJpYnV0ZU5hbWVzOnthY2NlcHRDaGFyc2V0OiJhY2NlcHQtY2hh cnNldCIsY2xhc3NOYW1lOiJjbGFzcyIsaHRtbEZvcjoiZm9yIixodHRwRXF1aXY6Imh0dHAtZXF1 aXYifSxET01Qcm9wZXJ0eU5hbWVzOnt9fTttb2R1bGUuZXhwb3J0cz1IVE1MRE9NUHJvcGVydHlD b25maWd9LHsxMToxMX1dLDIzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNl IHN0cmljdCI7ZnVuY3Rpb24gZXNjYXBlKGtleSl7dmFyIGVzY2FwZVJlZ2V4PS9bPTpdL2c7dmFy IGVzY2FwZXJMb29rdXA9eyI9IjoiPTAiLCI6IjoiPTIifTt2YXIgZXNjYXBlZFN0cmluZz0oIiIr a2V5KS5yZXBsYWNlKGVzY2FwZVJlZ2V4LGZ1bmN0aW9uKG1hdGNoKXtyZXR1cm4gZXNjYXBlckxv b2t1cFttYXRjaF19KTtyZXR1cm4iJCIrZXNjYXBlZFN0cmluZ31mdW5jdGlvbiB1bmVzY2FwZShr ZXkpe3ZhciB1bmVzY2FwZVJlZ2V4PS8oPTB8PTIpL2c7dmFyIHVuZXNjYXBlckxvb2t1cD17Ij0w IjoiPSIsIj0yIjoiOiJ9O3ZhciBrZXlTdWJzdHJpbmc9a2V5WzBdPT09Ii4iJiZrZXlbMV09PT0i JCI/a2V5LnN1YnN0cmluZygyKTprZXkuc3Vic3RyaW5nKDEpO3JldHVybigiIitrZXlTdWJzdHJp bmcpLnJlcGxhY2UodW5lc2NhcGVSZWdleCxmdW5jdGlvbihtYXRjaCl7cmV0dXJuIHVuZXNjYXBl ckxvb2t1cFttYXRjaF19KX12YXIgS2V5RXNjYXBlVXRpbHM9e2VzY2FwZTplc2NhcGUsdW5lc2Nh cGU6dW5lc2NhcGV9O21vZHVsZS5leHBvcnRzPUtleUVzY2FwZVV0aWxzfSx7fV0sMjQ6W2Z1bmN0 aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgX3Byb2RJbnZhcmlh bnQ9X2RlcmVxXygxMjUpO3ZhciBSZWFjdD1fZGVyZXFfKDEzNCk7dmFyIFJlYWN0UHJvcFR5cGVz U2VjcmV0PV9kZXJlcV8oNzMpO3ZhciBpbnZhcmlhbnQ9X2RlcmVxXygxNTApO3ZhciB3YXJuaW5n PV9kZXJlcV8oMTU3KTt2YXIgaGFzUmVhZE9ubHlWYWx1ZT17YnV0dG9uOnRydWUsY2hlY2tib3g6 dHJ1ZSxpbWFnZTp0cnVlLGhpZGRlbjp0cnVlLHJhZGlvOnRydWUscmVzZXQ6dHJ1ZSxzdWJtaXQ6 dHJ1ZX07ZnVuY3Rpb24gX2Fzc2VydFNpbmdsZUxpbmsoaW5wdXRQcm9wcyl7IShpbnB1dFByb3Bz LmNoZWNrZWRMaW5rPT1udWxsfHxpbnB1dFByb3BzLnZhbHVlTGluaz09bnVsbCk/ImRldmVsb3Bt ZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsIkNhbm5vdCBwcm92aWRlIGEgY2hl Y2tlZExpbmsgYW5kIGEgdmFsdWVMaW5rLiBJZiB5b3Ugd2FudCB0byB1c2UgY2hlY2tlZExpbmss IHlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIHVzZSB2YWx1ZUxpbmsgYW5kIHZpY2UgdmVyc2Eu Iik6X3Byb2RJbnZhcmlhbnQoIjg3Iik6dm9pZCAwfWZ1bmN0aW9uIF9hc3NlcnRWYWx1ZUxpbmso aW5wdXRQcm9wcyl7X2Fzc2VydFNpbmdsZUxpbmsoaW5wdXRQcm9wcyk7IShpbnB1dFByb3BzLnZh bHVlPT1udWxsJiZpbnB1dFByb3BzLm9uQ2hhbmdlPT1udWxsKT8iZGV2ZWxvcG1lbnQiIT09InBy b2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiQ2Fubm90IHByb3ZpZGUgYSB2YWx1ZUxpbmsgYW5k IGEgdmFsdWUgb3Igb25DaGFuZ2UgZXZlbnQuIElmIHlvdSB3YW50IHRvIHVzZSB2YWx1ZSBvciBv bkNoYW5nZSwgeW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gdXNlIHZhbHVlTGluay4iKTpfcHJv ZEludmFyaWFudCgiODgiKTp2b2lkIDB9ZnVuY3Rpb24gX2Fzc2VydENoZWNrZWRMaW5rKGlucHV0 UHJvcHMpe19hc3NlcnRTaW5nbGVMaW5rKGlucHV0UHJvcHMpOyEoaW5wdXRQcm9wcy5jaGVja2Vk PT1udWxsJiZpbnB1dFByb3BzLm9uQ2hhbmdlPT1udWxsKT8iZGV2ZWxvcG1lbnQiIT09InByb2R1 Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiQ2Fubm90IHByb3ZpZGUgYSBjaGVja2VkTGluayBhbmQg YSBjaGVja2VkIHByb3BlcnR5IG9yIG9uQ2hhbmdlIGV2ZW50LiBJZiB5b3Ugd2FudCB0byB1c2Ug Y2hlY2tlZCBvciBvbkNoYW5nZSwgeW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gdXNlIGNoZWNr ZWRMaW5rIik6X3Byb2RJbnZhcmlhbnQoIjg5Iik6dm9pZCAwfXZhciBwcm9wVHlwZXM9e3ZhbHVl OmZ1bmN0aW9uKHByb3BzLHByb3BOYW1lLGNvbXBvbmVudE5hbWUpe2lmKCFwcm9wc1twcm9wTmFt ZV18fGhhc1JlYWRPbmx5VmFsdWVbcHJvcHMudHlwZV18fHByb3BzLm9uQ2hhbmdlfHxwcm9wcy5y ZWFkT25seXx8cHJvcHMuZGlzYWJsZWQpe3JldHVybiBudWxsfXJldHVybiBuZXcgRXJyb3IoIllv dSBwcm92aWRlZCBhIGB2YWx1ZWAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiAiKyJg b25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElm ICIrInRoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRWYWx1ZWAuIE90aGVy d2lzZSwgIisic2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuIil9LGNoZWNrZWQ6 ZnVuY3Rpb24ocHJvcHMscHJvcE5hbWUsY29tcG9uZW50TmFtZSl7aWYoIXByb3BzW3Byb3BOYW1l XXx8cHJvcHMub25DaGFuZ2V8fHByb3BzLnJlYWRPbmx5fHxwcm9wcy5kaXNhYmxlZCl7cmV0dXJu IG51bGx9cmV0dXJuIG5ldyBFcnJvcigiWW91IHByb3ZpZGVkIGEgYGNoZWNrZWRgIHByb3AgdG8g YSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gIisiYG9uQ2hhbmdlYCBoYW5kbGVyLiBUaGlzIHdpbGwg cmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiBJZiAiKyJ0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFi bGUgdXNlIGBkZWZhdWx0Q2hlY2tlZGAuIE90aGVyd2lzZSwgIisic2V0IGVpdGhlciBgb25DaGFu Z2VgIG9yIGByZWFkT25seWAuIil9LG9uQ2hhbmdlOlJlYWN0LlByb3BUeXBlcy5mdW5jfTt2YXIg bG9nZ2VkVHlwZUZhaWx1cmVzPXt9O2Z1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1 bShvd25lcil7aWYob3duZXIpe3ZhciBuYW1lPW93bmVyLmdldE5hbWUoKTtpZihuYW1lKXtyZXR1 cm4iIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAiK25hbWUrImAuIn19cmV0dXJuIiJ9dmFy IExpbmtlZFZhbHVlVXRpbHM9e2NoZWNrUHJvcFR5cGVzOmZ1bmN0aW9uKHRhZ05hbWUscHJvcHMs b3duZXIpe2Zvcih2YXIgcHJvcE5hbWUgaW4gcHJvcFR5cGVzKXtpZihwcm9wVHlwZXMuaGFzT3du UHJvcGVydHkocHJvcE5hbWUpKXt2YXIgZXJyb3I9cHJvcFR5cGVzW3Byb3BOYW1lXShwcm9wcyxw cm9wTmFtZSx0YWdOYW1lLCJwcm9wIixudWxsLFJlYWN0UHJvcFR5cGVzU2VjcmV0KX1pZihlcnJv ciBpbnN0YW5jZW9mIEVycm9yJiYhKGVycm9yLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVz KSl7bG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yLm1lc3NhZ2VdPXRydWU7dmFyIGFkZGVuZHVtPWdl dERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShvd25lcik7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0 aW9uIj93YXJuaW5nKGZhbHNlLCJGYWlsZWQgZm9ybSBwcm9wVHlwZTogJXMlcyIsZXJyb3IubWVz c2FnZSxhZGRlbmR1bSk6dm9pZCAwfX19LGdldFZhbHVlOmZ1bmN0aW9uKGlucHV0UHJvcHMpe2lm KGlucHV0UHJvcHMudmFsdWVMaW5rKXtfYXNzZXJ0VmFsdWVMaW5rKGlucHV0UHJvcHMpO3JldHVy biBpbnB1dFByb3BzLnZhbHVlTGluay52YWx1ZX1yZXR1cm4gaW5wdXRQcm9wcy52YWx1ZX0sZ2V0 Q2hlY2tlZDpmdW5jdGlvbihpbnB1dFByb3BzKXtpZihpbnB1dFByb3BzLmNoZWNrZWRMaW5rKXtf YXNzZXJ0Q2hlY2tlZExpbmsoaW5wdXRQcm9wcyk7cmV0dXJuIGlucHV0UHJvcHMuY2hlY2tlZExp bmsudmFsdWV9cmV0dXJuIGlucHV0UHJvcHMuY2hlY2tlZH0sZXhlY3V0ZU9uQ2hhbmdlOmZ1bmN0 aW9uKGlucHV0UHJvcHMsZXZlbnQpe2lmKGlucHV0UHJvcHMudmFsdWVMaW5rKXtfYXNzZXJ0VmFs dWVMaW5rKGlucHV0UHJvcHMpO3JldHVybiBpbnB1dFByb3BzLnZhbHVlTGluay5yZXF1ZXN0Q2hh bmdlKGV2ZW50LnRhcmdldC52YWx1ZSl9ZWxzZSBpZihpbnB1dFByb3BzLmNoZWNrZWRMaW5rKXtf YXNzZXJ0Q2hlY2tlZExpbmsoaW5wdXRQcm9wcyk7cmV0dXJuIGlucHV0UHJvcHMuY2hlY2tlZExp bmsucmVxdWVzdENoYW5nZShldmVudC50YXJnZXQuY2hlY2tlZCl9ZWxzZSBpZihpbnB1dFByb3Bz Lm9uQ2hhbmdlKXtyZXR1cm4gaW5wdXRQcm9wcy5vbkNoYW5nZS5jYWxsKHVuZGVmaW5lZCxldmVu dCl9fX07bW9kdWxlLmV4cG9ydHM9TGlua2VkVmFsdWVVdGlsc30sezEyNToxMjUsMTM0OjEzNCwx NTA6MTUwLDE1NzoxNTcsNzM6NzN9XSwyNTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0 cyl7InVzZSBzdHJpY3QiO3ZhciBfcHJvZEludmFyaWFudD1fZGVyZXFfKDEyNSk7dmFyIGludmFy aWFudD1fZGVyZXFfKDE1MCk7dmFyIG9uZUFyZ3VtZW50UG9vbGVyPWZ1bmN0aW9uKGNvcHlGaWVs ZHNGcm9tKXt2YXIgS2xhc3M9dGhpcztpZihLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoKXt2YXIg aW5zdGFuY2U9S2xhc3MuaW5zdGFuY2VQb29sLnBvcCgpO0tsYXNzLmNhbGwoaW5zdGFuY2UsY29w eUZpZWxkc0Zyb20pO3JldHVybiBpbnN0YW5jZX1lbHNle3JldHVybiBuZXcgS2xhc3MoY29weUZp ZWxkc0Zyb20pfX07dmFyIHR3b0FyZ3VtZW50UG9vbGVyPWZ1bmN0aW9uKGExLGEyKXt2YXIgS2xh c3M9dGhpcztpZihLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoKXt2YXIgaW5zdGFuY2U9S2xhc3Mu aW5zdGFuY2VQb29sLnBvcCgpO0tsYXNzLmNhbGwoaW5zdGFuY2UsYTEsYTIpO3JldHVybiBpbnN0 YW5jZX1lbHNle3JldHVybiBuZXcgS2xhc3MoYTEsYTIpfX07dmFyIHRocmVlQXJndW1lbnRQb29s ZXI9ZnVuY3Rpb24oYTEsYTIsYTMpe3ZhciBLbGFzcz10aGlzO2lmKEtsYXNzLmluc3RhbmNlUG9v bC5sZW5ndGgpe3ZhciBpbnN0YW5jZT1LbGFzcy5pbnN0YW5jZVBvb2wucG9wKCk7S2xhc3MuY2Fs bChpbnN0YW5jZSxhMSxhMixhMyk7cmV0dXJuIGluc3RhbmNlfWVsc2V7cmV0dXJuIG5ldyBLbGFz cyhhMSxhMixhMyl9fTt2YXIgZm91ckFyZ3VtZW50UG9vbGVyPWZ1bmN0aW9uKGExLGEyLGEzLGE0 KXt2YXIgS2xhc3M9dGhpcztpZihLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoKXt2YXIgaW5zdGFu Y2U9S2xhc3MuaW5zdGFuY2VQb29sLnBvcCgpO0tsYXNzLmNhbGwoaW5zdGFuY2UsYTEsYTIsYTMs YTQpO3JldHVybiBpbnN0YW5jZX1lbHNle3JldHVybiBuZXcgS2xhc3MoYTEsYTIsYTMsYTQpfX07 dmFyIHN0YW5kYXJkUmVsZWFzZXI9ZnVuY3Rpb24oaW5zdGFuY2Upe3ZhciBLbGFzcz10aGlzOyEo aW5zdGFuY2UgaW5zdGFuY2VvZiBLbGFzcyk/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9p bnZhcmlhbnQoZmFsc2UsIlRyeWluZyB0byByZWxlYXNlIGFuIGluc3RhbmNlIGludG8gYSBwb29s IG9mIGEgZGlmZmVyZW50IHR5cGUuIik6X3Byb2RJbnZhcmlhbnQoIjI1Iik6dm9pZCAwO2luc3Rh bmNlLmRlc3RydWN0b3IoKTtpZihLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoPEtsYXNzLnBvb2xT aXplKXtLbGFzcy5pbnN0YW5jZVBvb2wucHVzaChpbnN0YW5jZSl9fTt2YXIgREVGQVVMVF9QT09M X1NJWkU9MTA7dmFyIERFRkFVTFRfUE9PTEVSPW9uZUFyZ3VtZW50UG9vbGVyO3ZhciBhZGRQb29s aW5nVG89ZnVuY3Rpb24oQ29weUNvbnN0cnVjdG9yLHBvb2xlcil7dmFyIE5ld0tsYXNzPUNvcHlD b25zdHJ1Y3RvcjtOZXdLbGFzcy5pbnN0YW5jZVBvb2w9W107TmV3S2xhc3MuZ2V0UG9vbGVkPXBv b2xlcnx8REVGQVVMVF9QT09MRVI7aWYoIU5ld0tsYXNzLnBvb2xTaXplKXtOZXdLbGFzcy5wb29s U2l6ZT1ERUZBVUxUX1BPT0xfU0laRX1OZXdLbGFzcy5yZWxlYXNlPXN0YW5kYXJkUmVsZWFzZXI7 cmV0dXJuIE5ld0tsYXNzfTt2YXIgUG9vbGVkQ2xhc3M9e2FkZFBvb2xpbmdUbzphZGRQb29saW5n VG8sb25lQXJndW1lbnRQb29sZXI6b25lQXJndW1lbnRQb29sZXIsdHdvQXJndW1lbnRQb29sZXI6 dHdvQXJndW1lbnRQb29sZXIsdGhyZWVBcmd1bWVudFBvb2xlcjp0aHJlZUFyZ3VtZW50UG9vbGVy LGZvdXJBcmd1bWVudFBvb2xlcjpmb3VyQXJndW1lbnRQb29sZXJ9O21vZHVsZS5leHBvcnRzPVBv b2xlZENsYXNzfSx7MTI1OjEyNSwxNTA6MTUwfV0sMjY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxl LGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgX2Fzc2lnbj1fZGVyZXFfKDE1OCk7dmFyIEV2ZW50 UGx1Z2luUmVnaXN0cnk9X2RlcmVxXygxOCk7dmFyIFJlYWN0RXZlbnRFbWl0dGVyTWl4aW49X2Rl cmVxXyg1Nik7dmFyIFZpZXdwb3J0TWV0cmljcz1fZGVyZXFfKDEwMSk7dmFyIGdldFZlbmRvclBy ZWZpeGVkRXZlbnROYW1lPV9kZXJlcV8oMTIwKTt2YXIgaXNFdmVudFN1cHBvcnRlZD1fZGVyZXFf KDEyMik7dmFyIGhhc0V2ZW50UGFnZVhZO3ZhciBhbHJlYWR5TGlzdGVuaW5nVG89e307dmFyIGlz TW9uaXRvcmluZ1Njcm9sbFZhbHVlPWZhbHNlO3ZhciByZWFjdFRvcExpc3RlbmVyc0NvdW50ZXI9 MDt2YXIgdG9wRXZlbnRNYXBwaW5nPXt0b3BBYm9ydDoiYWJvcnQiLHRvcEFuaW1hdGlvbkVuZDpn ZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgiYW5pbWF0aW9uZW5kIil8fCJhbmltYXRpb25lbmQi LHRvcEFuaW1hdGlvbkl0ZXJhdGlvbjpnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgiYW5pbWF0 aW9uaXRlcmF0aW9uIil8fCJhbmltYXRpb25pdGVyYXRpb24iLHRvcEFuaW1hdGlvblN0YXJ0Omdl dFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCJhbmltYXRpb25zdGFydCIpfHwiYW5pbWF0aW9uc3Rh cnQiLHRvcEJsdXI6ImJsdXIiLHRvcENhblBsYXk6ImNhbnBsYXkiLHRvcENhblBsYXlUaHJvdWdo OiJjYW5wbGF5dGhyb3VnaCIsdG9wQ2hhbmdlOiJjaGFuZ2UiLHRvcENsaWNrOiJjbGljayIsdG9w Q29tcG9zaXRpb25FbmQ6ImNvbXBvc2l0aW9uZW5kIix0b3BDb21wb3NpdGlvblN0YXJ0OiJjb21w b3NpdGlvbnN0YXJ0Iix0b3BDb21wb3NpdGlvblVwZGF0ZToiY29tcG9zaXRpb251cGRhdGUiLHRv cENvbnRleHRNZW51OiJjb250ZXh0bWVudSIsdG9wQ29weToiY29weSIsdG9wQ3V0OiJjdXQiLHRv cERvdWJsZUNsaWNrOiJkYmxjbGljayIsdG9wRHJhZzoiZHJhZyIsdG9wRHJhZ0VuZDoiZHJhZ2Vu ZCIsdG9wRHJhZ0VudGVyOiJkcmFnZW50ZXIiLHRvcERyYWdFeGl0OiJkcmFnZXhpdCIsdG9wRHJh Z0xlYXZlOiJkcmFnbGVhdmUiLHRvcERyYWdPdmVyOiJkcmFnb3ZlciIsdG9wRHJhZ1N0YXJ0OiJk cmFnc3RhcnQiLHRvcERyb3A6ImRyb3AiLHRvcER1cmF0aW9uQ2hhbmdlOiJkdXJhdGlvbmNoYW5n ZSIsdG9wRW1wdGllZDoiZW1wdGllZCIsdG9wRW5jcnlwdGVkOiJlbmNyeXB0ZWQiLHRvcEVuZGVk OiJlbmRlZCIsdG9wRXJyb3I6ImVycm9yIix0b3BGb2N1czoiZm9jdXMiLHRvcElucHV0OiJpbnB1 dCIsdG9wS2V5RG93bjoia2V5ZG93biIsdG9wS2V5UHJlc3M6ImtleXByZXNzIix0b3BLZXlVcDoi a2V5dXAiLHRvcExvYWRlZERhdGE6ImxvYWRlZGRhdGEiLHRvcExvYWRlZE1ldGFkYXRhOiJsb2Fk ZWRtZXRhZGF0YSIsdG9wTG9hZFN0YXJ0OiJsb2Fkc3RhcnQiLHRvcE1vdXNlRG93bjoibW91c2Vk b3duIix0b3BNb3VzZU1vdmU6Im1vdXNlbW92ZSIsdG9wTW91c2VPdXQ6Im1vdXNlb3V0Iix0b3BN b3VzZU92ZXI6Im1vdXNlb3ZlciIsdG9wTW91c2VVcDoibW91c2V1cCIsdG9wUGFzdGU6InBhc3Rl Iix0b3BQYXVzZToicGF1c2UiLHRvcFBsYXk6InBsYXkiLHRvcFBsYXlpbmc6InBsYXlpbmciLHRv cFByb2dyZXNzOiJwcm9ncmVzcyIsdG9wUmF0ZUNoYW5nZToicmF0ZWNoYW5nZSIsdG9wU2Nyb2xs OiJzY3JvbGwiLHRvcFNlZWtlZDoic2Vla2VkIix0b3BTZWVraW5nOiJzZWVraW5nIix0b3BTZWxl Y3Rpb25DaGFuZ2U6InNlbGVjdGlvbmNoYW5nZSIsdG9wU3RhbGxlZDoic3RhbGxlZCIsdG9wU3Vz cGVuZDoic3VzcGVuZCIsdG9wVGV4dElucHV0OiJ0ZXh0SW5wdXQiLHRvcFRpbWVVcGRhdGU6InRp bWV1cGRhdGUiLHRvcFRvdWNoQ2FuY2VsOiJ0b3VjaGNhbmNlbCIsdG9wVG91Y2hFbmQ6InRvdWNo ZW5kIix0b3BUb3VjaE1vdmU6InRvdWNobW92ZSIsdG9wVG91Y2hTdGFydDoidG91Y2hzdGFydCIs dG9wVHJhbnNpdGlvbkVuZDpnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgidHJhbnNpdGlvbmVu ZCIpfHwidHJhbnNpdGlvbmVuZCIsdG9wVm9sdW1lQ2hhbmdlOiJ2b2x1bWVjaGFuZ2UiLHRvcFdh aXRpbmc6IndhaXRpbmciLHRvcFdoZWVsOiJ3aGVlbCJ9O3ZhciB0b3BMaXN0ZW5lcnNJREtleT0i X3JlYWN0TGlzdGVuZXJzSUQiK1N0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZSgyKTtmdW5jdGlv biBnZXRMaXN0ZW5pbmdGb3JEb2N1bWVudChtb3VudEF0KXtpZighT2JqZWN0LnByb3RvdHlwZS5o YXNPd25Qcm9wZXJ0eS5jYWxsKG1vdW50QXQsdG9wTGlzdGVuZXJzSURLZXkpKXttb3VudEF0W3Rv cExpc3RlbmVyc0lES2V5XT1yZWFjdFRvcExpc3RlbmVyc0NvdW50ZXIrKzthbHJlYWR5TGlzdGVu aW5nVG9bbW91bnRBdFt0b3BMaXN0ZW5lcnNJREtleV1dPXt9fXJldHVybiBhbHJlYWR5TGlzdGVu aW5nVG9bbW91bnRBdFt0b3BMaXN0ZW5lcnNJREtleV1dfXZhciBSZWFjdEJyb3dzZXJFdmVudEVt aXR0ZXI9X2Fzc2lnbih7fSxSZWFjdEV2ZW50RW1pdHRlck1peGluLHtSZWFjdEV2ZW50TGlzdGVu ZXI6bnVsbCxpbmplY3Rpb246e2luamVjdFJlYWN0RXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihSZWFj dEV2ZW50TGlzdGVuZXIpe1JlYWN0RXZlbnRMaXN0ZW5lci5zZXRIYW5kbGVUb3BMZXZlbChSZWFj dEJyb3dzZXJFdmVudEVtaXR0ZXIuaGFuZGxlVG9wTGV2ZWwpO1JlYWN0QnJvd3NlckV2ZW50RW1p dHRlci5SZWFjdEV2ZW50TGlzdGVuZXI9UmVhY3RFdmVudExpc3RlbmVyfX0sc2V0RW5hYmxlZDpm dW5jdGlvbihlbmFibGVkKXtpZihSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExp c3RlbmVyKXtSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnNldEVu YWJsZWQoZW5hYmxlZCl9fSxpc0VuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIShSZWFjdEJyb3dz ZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyJiZSZWFjdEJyb3dzZXJFdmVudEVtaXR0 ZXIuUmVhY3RFdmVudExpc3RlbmVyLmlzRW5hYmxlZCgpKX0sbGlzdGVuVG86ZnVuY3Rpb24ocmVn aXN0cmF0aW9uTmFtZSxjb250ZW50RG9jdW1lbnRIYW5kbGUpe3ZhciBtb3VudEF0PWNvbnRlbnRE b2N1bWVudEhhbmRsZTt2YXIgaXNMaXN0ZW5pbmc9Z2V0TGlzdGVuaW5nRm9yRG9jdW1lbnQobW91 bnRBdCk7dmFyIGRlcGVuZGVuY2llcz1FdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5h bWVEZXBlbmRlbmNpZXNbcmVnaXN0cmF0aW9uTmFtZV07Zm9yKHZhciBpPTA7aTxkZXBlbmRlbmNp ZXMubGVuZ3RoO2krKyl7dmFyIGRlcGVuZGVuY3k9ZGVwZW5kZW5jaWVzW2ldO2lmKCEoaXNMaXN0 ZW5pbmcuaGFzT3duUHJvcGVydHkoZGVwZW5kZW5jeSkmJmlzTGlzdGVuaW5nW2RlcGVuZGVuY3ld KSl7aWYoZGVwZW5kZW5jeT09PSJ0b3BXaGVlbCIpe2lmKGlzRXZlbnRTdXBwb3J0ZWQoIndoZWVs Iikpe1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJs ZWRFdmVudCgidG9wV2hlZWwiLCJ3aGVlbCIsbW91bnRBdCl9ZWxzZSBpZihpc0V2ZW50U3VwcG9y dGVkKCJtb3VzZXdoZWVsIikpe1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlz dGVuZXIudHJhcEJ1YmJsZWRFdmVudCgidG9wV2hlZWwiLCJtb3VzZXdoZWVsIixtb3VudEF0KX1l bHNle1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJs ZWRFdmVudCgidG9wV2hlZWwiLCJET01Nb3VzZVNjcm9sbCIsbW91bnRBdCl9fWVsc2UgaWYoZGVw ZW5kZW5jeT09PSJ0b3BTY3JvbGwiKXtpZihpc0V2ZW50U3VwcG9ydGVkKCJzY3JvbGwiLHRydWUp KXtSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBDYXB0dXJl ZEV2ZW50KCJ0b3BTY3JvbGwiLCJzY3JvbGwiLG1vdW50QXQpfWVsc2V7UmVhY3RCcm93c2VyRXZl bnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KCJ0b3BTY3JvbGwi LCJzY3JvbGwiLFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIuV0lO RE9XX0hBTkRMRSl9fWVsc2UgaWYoZGVwZW5kZW5jeT09PSJ0b3BGb2N1cyJ8fGRlcGVuZGVuY3k9 PT0idG9wQmx1ciIpe2lmKGlzRXZlbnRTdXBwb3J0ZWQoImZvY3VzIix0cnVlKSl7UmVhY3RCcm93 c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQ2FwdHVyZWRFdmVudCgidG9w Rm9jdXMiLCJmb2N1cyIsbW91bnRBdCk7UmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZl bnRMaXN0ZW5lci50cmFwQ2FwdHVyZWRFdmVudCgidG9wQmx1ciIsImJsdXIiLG1vdW50QXQpfWVs c2UgaWYoaXNFdmVudFN1cHBvcnRlZCgiZm9jdXNpbiIpKXtSZWFjdEJyb3dzZXJFdmVudEVtaXR0 ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQoInRvcEZvY3VzIiwiZm9jdXNp biIsbW91bnRBdCk7UmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50 cmFwQnViYmxlZEV2ZW50KCJ0b3BCbHVyIiwiZm9jdXNvdXQiLG1vdW50QXQpfWlzTGlzdGVuaW5n LnRvcEJsdXI9dHJ1ZTtpc0xpc3RlbmluZy50b3BGb2N1cz10cnVlfWVsc2UgaWYodG9wRXZlbnRN YXBwaW5nLmhhc093blByb3BlcnR5KGRlcGVuZGVuY3kpKXtSZWFjdEJyb3dzZXJFdmVudEVtaXR0 ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQoZGVwZW5kZW5jeSx0b3BFdmVu dE1hcHBpbmdbZGVwZW5kZW5jeV0sbW91bnRBdCl9aXNMaXN0ZW5pbmdbZGVwZW5kZW5jeV09dHJ1 ZX19fSx0cmFwQnViYmxlZEV2ZW50OmZ1bmN0aW9uKHRvcExldmVsVHlwZSxoYW5kbGVyQmFzZU5h bWUsaGFuZGxlKXtyZXR1cm4gUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0 ZW5lci50cmFwQnViYmxlZEV2ZW50KHRvcExldmVsVHlwZSxoYW5kbGVyQmFzZU5hbWUsaGFuZGxl KX0sdHJhcENhcHR1cmVkRXZlbnQ6ZnVuY3Rpb24odG9wTGV2ZWxUeXBlLGhhbmRsZXJCYXNlTmFt ZSxoYW5kbGUpe3JldHVybiBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3Rl bmVyLnRyYXBDYXB0dXJlZEV2ZW50KHRvcExldmVsVHlwZSxoYW5kbGVyQmFzZU5hbWUsaGFuZGxl KX0sc3VwcG9ydHNFdmVudFBhZ2VYWTpmdW5jdGlvbigpe2lmKCFkb2N1bWVudC5jcmVhdGVFdmVu dCl7cmV0dXJuIGZhbHNlfXZhciBldj1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudCIp O3JldHVybiBldiE9bnVsbCYmInBhZ2VYImluIGV2fSxlbnN1cmVTY3JvbGxWYWx1ZU1vbml0b3Jp bmc6ZnVuY3Rpb24oKXtpZihoYXNFdmVudFBhZ2VYWT09PXVuZGVmaW5lZCl7aGFzRXZlbnRQYWdl WFk9UmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLnN1cHBvcnRzRXZlbnRQYWdlWFkoKX1pZighaGFz RXZlbnRQYWdlWFkmJiFpc01vbml0b3JpbmdTY3JvbGxWYWx1ZSl7dmFyIHJlZnJlc2g9Vmlld3Bv cnRNZXRyaWNzLnJlZnJlc2hTY3JvbGxWYWx1ZXM7UmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJl YWN0RXZlbnRMaXN0ZW5lci5tb25pdG9yU2Nyb2xsVmFsdWUocmVmcmVzaCk7aXNNb25pdG9yaW5n U2Nyb2xsVmFsdWU9dHJ1ZX19fSk7bW9kdWxlLmV4cG9ydHM9UmVhY3RCcm93c2VyRXZlbnRFbWl0 dGVyfSx7MTAxOjEwMSwxMjA6MTIwLDEyMjoxMjIsMTU4OjE1OCwxODoxOCw1Njo1Nn1dLDI3Oltm dW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsoZnVuY3Rpb24ocHJvY2Vzcyl7InVzZSBz dHJpY3QiO3ZhciBSZWFjdFJlY29uY2lsZXI9X2RlcmVxXyg3NSk7dmFyIGluc3RhbnRpYXRlUmVh Y3RDb21wb25lbnQ9X2RlcmVxXygxMjEpO3ZhciBLZXlFc2NhcGVVdGlscz1fZGVyZXFfKDIzKTt2 YXIgc2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQ9X2RlcmVxXygxMjkpO3ZhciB0cmF2ZXJzZUFs bENoaWxkcmVuPV9kZXJlcV8oMTMwKTt2YXIgd2FybmluZz1fZGVyZXFfKDE1Nyk7dmFyIFJlYWN0 Q29tcG9uZW50VHJlZUhvb2s7aWYodHlwZW9mIHByb2Nlc3MhPT0idW5kZWZpbmVkIiYmcHJvY2Vz cy5lbnYmJiJkZXZlbG9wbWVudCI9PT0idGVzdCIpe1JlYWN0Q29tcG9uZW50VHJlZUhvb2s9X2Rl cmVxXygxMzIpfWZ1bmN0aW9uIGluc3RhbnRpYXRlQ2hpbGQoY2hpbGRJbnN0YW5jZXMsY2hpbGQs bmFtZSxzZWxmRGVidWdJRCl7dmFyIGtleVVuaXF1ZT1jaGlsZEluc3RhbmNlc1tuYW1lXT09PXVu ZGVmaW5lZDtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtpZighUmVhY3RDb21wb25l bnRUcmVlSG9vayl7UmVhY3RDb21wb25lbnRUcmVlSG9vaz1fZGVyZXFfKDEzMil9aWYoIWtleVVu aXF1ZSl7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKGZhbHNlLCJmbGF0dGVu Q2hpbGRyZW4oLi4uKTogRW5jb3VudGVyZWQgdHdvIGNoaWxkcmVuIHdpdGggdGhlIHNhbWUga2V5 LCAiKyJgJXNgLiBDaGlsZCBrZXlzIG11c3QgYmUgdW5pcXVlOyB3aGVuIHR3byBjaGlsZHJlbiBz aGFyZSBhIGtleSwgb25seSAiKyJ0aGUgZmlyc3QgY2hpbGQgd2lsbCBiZSB1c2VkLiVzIixLZXlF c2NhcGVVdGlscy51bmVzY2FwZShuYW1lKSxSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNr QWRkZW5kdW1CeUlEKHNlbGZEZWJ1Z0lEKSk6dm9pZCAwfX1pZihjaGlsZCE9bnVsbCYma2V5VW5p cXVlKXtjaGlsZEluc3RhbmNlc1tuYW1lXT1pbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50KGNoaWxk LHRydWUpfX12YXIgUmVhY3RDaGlsZFJlY29uY2lsZXI9e2luc3RhbnRpYXRlQ2hpbGRyZW46ZnVu Y3Rpb24obmVzdGVkQ2hpbGROb2Rlcyx0cmFuc2FjdGlvbixjb250ZXh0LHNlbGZEZWJ1Z0lEKXtp ZihuZXN0ZWRDaGlsZE5vZGVzPT1udWxsKXtyZXR1cm4gbnVsbH12YXIgY2hpbGRJbnN0YW5jZXM9 e307aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7dHJhdmVyc2VBbGxDaGlsZHJlbihu ZXN0ZWRDaGlsZE5vZGVzLGZ1bmN0aW9uKGNoaWxkSW5zdHMsY2hpbGQsbmFtZSl7cmV0dXJuIGlu c3RhbnRpYXRlQ2hpbGQoY2hpbGRJbnN0cyxjaGlsZCxuYW1lLHNlbGZEZWJ1Z0lEKX0sY2hpbGRJ bnN0YW5jZXMpfWVsc2V7dHJhdmVyc2VBbGxDaGlsZHJlbihuZXN0ZWRDaGlsZE5vZGVzLGluc3Rh bnRpYXRlQ2hpbGQsY2hpbGRJbnN0YW5jZXMpfXJldHVybiBjaGlsZEluc3RhbmNlc30sdXBkYXRl Q2hpbGRyZW46ZnVuY3Rpb24ocHJldkNoaWxkcmVuLG5leHRDaGlsZHJlbixtb3VudEltYWdlcyxy ZW1vdmVkTm9kZXMsdHJhbnNhY3Rpb24saG9zdFBhcmVudCxob3N0Q29udGFpbmVySW5mbyxjb250 ZXh0LHNlbGZEZWJ1Z0lEKXtpZighbmV4dENoaWxkcmVuJiYhcHJldkNoaWxkcmVuKXtyZXR1cm59 dmFyIG5hbWU7dmFyIHByZXZDaGlsZDtmb3IobmFtZSBpbiBuZXh0Q2hpbGRyZW4pe2lmKCFuZXh0 Q2hpbGRyZW4uaGFzT3duUHJvcGVydHkobmFtZSkpe2NvbnRpbnVlfXByZXZDaGlsZD1wcmV2Q2hp bGRyZW4mJnByZXZDaGlsZHJlbltuYW1lXTt2YXIgcHJldkVsZW1lbnQ9cHJldkNoaWxkJiZwcmV2 Q2hpbGQuX2N1cnJlbnRFbGVtZW50O3ZhciBuZXh0RWxlbWVudD1uZXh0Q2hpbGRyZW5bbmFtZV07 aWYocHJldkNoaWxkIT1udWxsJiZzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudChwcmV2RWxlbWVu dCxuZXh0RWxlbWVudCkpe1JlYWN0UmVjb25jaWxlci5yZWNlaXZlQ29tcG9uZW50KHByZXZDaGls ZCxuZXh0RWxlbWVudCx0cmFuc2FjdGlvbixjb250ZXh0KTtuZXh0Q2hpbGRyZW5bbmFtZV09cHJl dkNoaWxkfWVsc2V7aWYocHJldkNoaWxkKXtyZW1vdmVkTm9kZXNbbmFtZV09UmVhY3RSZWNvbmNp bGVyLmdldEhvc3ROb2RlKHByZXZDaGlsZCk7UmVhY3RSZWNvbmNpbGVyLnVubW91bnRDb21wb25l bnQocHJldkNoaWxkLGZhbHNlKX12YXIgbmV4dENoaWxkSW5zdGFuY2U9aW5zdGFudGlhdGVSZWFj dENvbXBvbmVudChuZXh0RWxlbWVudCx0cnVlKTtuZXh0Q2hpbGRyZW5bbmFtZV09bmV4dENoaWxk SW5zdGFuY2U7dmFyIG5leHRDaGlsZE1vdW50SW1hZ2U9UmVhY3RSZWNvbmNpbGVyLm1vdW50Q29t cG9uZW50KG5leHRDaGlsZEluc3RhbmNlLHRyYW5zYWN0aW9uLGhvc3RQYXJlbnQsaG9zdENvbnRh aW5lckluZm8sY29udGV4dCxzZWxmRGVidWdJRCk7bW91bnRJbWFnZXMucHVzaChuZXh0Q2hpbGRN b3VudEltYWdlKX19Zm9yKG5hbWUgaW4gcHJldkNoaWxkcmVuKXtpZihwcmV2Q2hpbGRyZW4uaGFz T3duUHJvcGVydHkobmFtZSkmJiEobmV4dENoaWxkcmVuJiZuZXh0Q2hpbGRyZW4uaGFzT3duUHJv cGVydHkobmFtZSkpKXtwcmV2Q2hpbGQ9cHJldkNoaWxkcmVuW25hbWVdO3JlbW92ZWROb2Rlc1tu YW1lXT1SZWFjdFJlY29uY2lsZXIuZ2V0SG9zdE5vZGUocHJldkNoaWxkKTtSZWFjdFJlY29uY2ls ZXIudW5tb3VudENvbXBvbmVudChwcmV2Q2hpbGQsZmFsc2UpfX19LHVubW91bnRDaGlsZHJlbjpm dW5jdGlvbihyZW5kZXJlZENoaWxkcmVuLHNhZmVseSl7Zm9yKHZhciBuYW1lIGluIHJlbmRlcmVk Q2hpbGRyZW4pe2lmKHJlbmRlcmVkQ2hpbGRyZW4uaGFzT3duUHJvcGVydHkobmFtZSkpe3ZhciBy ZW5kZXJlZENoaWxkPXJlbmRlcmVkQ2hpbGRyZW5bbmFtZV07UmVhY3RSZWNvbmNpbGVyLnVubW91 bnRDb21wb25lbnQocmVuZGVyZWRDaGlsZCxzYWZlbHkpfX19fTttb2R1bGUuZXhwb3J0cz1SZWFj dENoaWxkUmVjb25jaWxlcn0pLmNhbGwodGhpcyx1bmRlZmluZWQpfSx7MTIxOjEyMSwxMjk6MTI5 LDEzMDoxMzAsMTMyOjEzMiwxNTc6MTU3LDIzOjIzLDc1Ojc1fV0sMjg6W2Z1bmN0aW9uKF9kZXJl cV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgRE9NQ2hpbGRyZW5PcGVyYXRpb25z PV9kZXJlcV8oOCk7dmFyIFJlYWN0RE9NSURPcGVyYXRpb25zPV9kZXJlcV8oMzgpO3ZhciBSZWFj dENvbXBvbmVudEJyb3dzZXJFbnZpcm9ubWVudD17cHJvY2Vzc0NoaWxkcmVuVXBkYXRlczpSZWFj dERPTUlET3BlcmF0aW9ucy5kYW5nZXJvdXNseVByb2Nlc3NDaGlsZHJlblVwZGF0ZXMscmVwbGFj ZU5vZGVXaXRoTWFya3VwOkRPTUNoaWxkcmVuT3BlcmF0aW9ucy5kYW5nZXJvdXNseVJlcGxhY2VO b2RlV2l0aE1hcmt1cH07bW9kdWxlLmV4cG9ydHM9UmVhY3RDb21wb25lbnRCcm93c2VyRW52aXJv bm1lbnR9LHszODozOCw4Ojh9XSwyOTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7 InVzZSBzdHJpY3QiO3ZhciBfcHJvZEludmFyaWFudD1fZGVyZXFfKDEyNSk7dmFyIGludmFyaWFu dD1fZGVyZXFfKDE1MCk7dmFyIGluamVjdGVkPWZhbHNlO3ZhciBSZWFjdENvbXBvbmVudEVudmly b25tZW50PXtyZXBsYWNlTm9kZVdpdGhNYXJrdXA6bnVsbCxwcm9jZXNzQ2hpbGRyZW5VcGRhdGVz Om51bGwsaW5qZWN0aW9uOntpbmplY3RFbnZpcm9ubWVudDpmdW5jdGlvbihlbnZpcm9ubWVudCl7 ISFpbmplY3RlZD8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwi UmVhY3RDb21wb3NpdGVDb21wb25lbnQ6IGluamVjdEVudmlyb25tZW50KCkgY2FuIG9ubHkgYmUg Y2FsbGVkIG9uY2UuIik6X3Byb2RJbnZhcmlhbnQoIjEwNCIpOnZvaWQgMDtSZWFjdENvbXBvbmVu dEVudmlyb25tZW50LnJlcGxhY2VOb2RlV2l0aE1hcmt1cD1lbnZpcm9ubWVudC5yZXBsYWNlTm9k ZVdpdGhNYXJrdXA7UmVhY3RDb21wb25lbnRFbnZpcm9ubWVudC5wcm9jZXNzQ2hpbGRyZW5VcGRh dGVzPWVudmlyb25tZW50LnByb2Nlc3NDaGlsZHJlblVwZGF0ZXM7aW5qZWN0ZWQ9dHJ1ZX19fTtt b2R1bGUuZXhwb3J0cz1SZWFjdENvbXBvbmVudEVudmlyb25tZW50fSx7MTI1OjEyNSwxNTA6MTUw fV0sMzA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIg X3Byb2RJbnZhcmlhbnQ9X2RlcmVxXygxMjUpLF9hc3NpZ249X2RlcmVxXygxNTgpO3ZhciBSZWFj dD1fZGVyZXFfKDEzNCk7dmFyIFJlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQ9X2RlcmVxXygyOSk7 dmFyIFJlYWN0Q3VycmVudE93bmVyPV9kZXJlcV8oMTMzKTt2YXIgUmVhY3RFcnJvclV0aWxzPV9k ZXJlcV8oNTUpO3ZhciBSZWFjdEluc3RhbmNlTWFwPV9kZXJlcV8oNjMpO3ZhciBSZWFjdEluc3Ry dW1lbnRhdGlvbj1fZGVyZXFfKDY0KTt2YXIgUmVhY3ROb2RlVHlwZXM9X2RlcmVxXyg2OSk7dmFy IFJlYWN0UmVjb25jaWxlcj1fZGVyZXFfKDc1KTtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rp b24iKXt2YXIgY2hlY2tSZWFjdFR5cGVTcGVjPV9kZXJlcV8oMTA0KX12YXIgZW1wdHlPYmplY3Q9 X2RlcmVxXygxNDMpO3ZhciBpbnZhcmlhbnQ9X2RlcmVxXygxNTApO3ZhciBzaGFsbG93RXF1YWw9 X2RlcmVxXygxNTYpO3ZhciBzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudD1fZGVyZXFfKDEyOSk7 dmFyIHdhcm5pbmc9X2RlcmVxXygxNTcpO3ZhciBDb21wb3NpdGVUeXBlcz17SW1wdXJlQ2xhc3M6 MCxQdXJlQ2xhc3M6MSxTdGF0ZWxlc3NGdW5jdGlvbmFsOjJ9O2Z1bmN0aW9uIFN0YXRlbGVzc0Nv bXBvbmVudChDb21wb25lbnQpe31TdGF0ZWxlc3NDb21wb25lbnQucHJvdG90eXBlLnJlbmRlcj1m dW5jdGlvbigpe3ZhciBDb21wb25lbnQ9UmVhY3RJbnN0YW5jZU1hcC5nZXQodGhpcykuX2N1cnJl bnRFbGVtZW50LnR5cGU7dmFyIGVsZW1lbnQ9Q29tcG9uZW50KHRoaXMucHJvcHMsdGhpcy5jb250 ZXh0LHRoaXMudXBkYXRlcik7d2FybklmSW52YWxpZEVsZW1lbnQoQ29tcG9uZW50LGVsZW1lbnQp O3JldHVybiBlbGVtZW50fTtmdW5jdGlvbiB3YXJuSWZJbnZhbGlkRWxlbWVudChDb21wb25lbnQs ZWxlbWVudCl7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7ImRldmVsb3BtZW50IiE9 PSJwcm9kdWN0aW9uIj93YXJuaW5nKGVsZW1lbnQ9PT1udWxsfHxlbGVtZW50PT09ZmFsc2V8fFJl YWN0LmlzVmFsaWRFbGVtZW50KGVsZW1lbnQpLCIlcyguLi4pOiBBIHZhbGlkIFJlYWN0IGVsZW1l bnQgKG9yIG51bGwpIG11c3QgYmUgcmV0dXJuZWQuIFlvdSBtYXkgaGF2ZSAiKyJyZXR1cm5lZCB1 bmRlZmluZWQsIGFuIGFycmF5IG9yIHNvbWUgb3RoZXIgaW52YWxpZCBvYmplY3QuIixDb21wb25l bnQuZGlzcGxheU5hbWV8fENvbXBvbmVudC5uYW1lfHwiQ29tcG9uZW50Iik6dm9pZCAwOyJkZXZl bG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyghQ29tcG9uZW50LmNoaWxkQ29udGV4dFR5 cGVzLCIlcyguLi4pOiBjaGlsZENvbnRleHRUeXBlcyBjYW5ub3QgYmUgZGVmaW5lZCBvbiBhIGZ1 bmN0aW9uYWwgY29tcG9uZW50LiIsQ29tcG9uZW50LmRpc3BsYXlOYW1lfHxDb21wb25lbnQubmFt ZXx8IkNvbXBvbmVudCIpOnZvaWQgMH19ZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0KENvbXBvbmVu dCl7cmV0dXJuISEoQ29tcG9uZW50LnByb3RvdHlwZSYmQ29tcG9uZW50LnByb3RvdHlwZS5pc1Jl YWN0Q29tcG9uZW50KX1mdW5jdGlvbiBpc1B1cmVDb21wb25lbnQoQ29tcG9uZW50KXtyZXR1cm4h IShDb21wb25lbnQucHJvdG90eXBlJiZDb21wb25lbnQucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29t cG9uZW50KX1mdW5jdGlvbiBtZWFzdXJlTGlmZUN5Y2xlUGVyZihmbixkZWJ1Z0lELHRpbWVyVHlw ZSl7aWYoZGVidWdJRD09PTApe3JldHVybiBmbigpfVJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVn VG9vbC5vbkJlZ2luTGlmZUN5Y2xlVGltZXIoZGVidWdJRCx0aW1lclR5cGUpO3RyeXtyZXR1cm4g Zm4oKX1maW5hbGx5e1JlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkVuZExpZmVDeWNs ZVRpbWVyKGRlYnVnSUQsdGltZXJUeXBlKX19dmFyIG5leHRNb3VudElEPTE7dmFyIFJlYWN0Q29t cG9zaXRlQ29tcG9uZW50PXtjb25zdHJ1Y3Q6ZnVuY3Rpb24oZWxlbWVudCl7dGhpcy5fY3VycmVu dEVsZW1lbnQ9ZWxlbWVudDt0aGlzLl9yb290Tm9kZUlEPTA7dGhpcy5fY29tcG9zaXRlVHlwZT1u dWxsO3RoaXMuX2luc3RhbmNlPW51bGw7dGhpcy5faG9zdFBhcmVudD1udWxsO3RoaXMuX2hvc3RD b250YWluZXJJbmZvPW51bGw7dGhpcy5fdXBkYXRlQmF0Y2hOdW1iZXI9bnVsbDt0aGlzLl9wZW5k aW5nRWxlbWVudD1udWxsO3RoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlPW51bGw7dGhpcy5fcGVuZGlu Z1JlcGxhY2VTdGF0ZT1mYWxzZTt0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGU9ZmFsc2U7dGhpcy5f cmVuZGVyZWROb2RlVHlwZT1udWxsO3RoaXMuX3JlbmRlcmVkQ29tcG9uZW50PW51bGw7dGhpcy5f Y29udGV4dD1udWxsO3RoaXMuX21vdW50T3JkZXI9MDt0aGlzLl90b3BMZXZlbFdyYXBwZXI9bnVs bDt0aGlzLl9wZW5kaW5nQ2FsbGJhY2tzPW51bGw7dGhpcy5fY2FsbGVkQ29tcG9uZW50V2lsbFVu bW91bnQ9ZmFsc2U7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7dGhpcy5fd2FybmVk QWJvdXRSZWZzSW5SZW5kZXI9ZmFsc2V9fSxtb3VudENvbXBvbmVudDpmdW5jdGlvbih0cmFuc2Fj dGlvbixob3N0UGFyZW50LGhvc3RDb250YWluZXJJbmZvLGNvbnRleHQpe3ZhciBfdGhpcz10aGlz O3RoaXMuX2NvbnRleHQ9Y29udGV4dDt0aGlzLl9tb3VudE9yZGVyPW5leHRNb3VudElEKys7dGhp cy5faG9zdFBhcmVudD1ob3N0UGFyZW50O3RoaXMuX2hvc3RDb250YWluZXJJbmZvPWhvc3RDb250 YWluZXJJbmZvO3ZhciBwdWJsaWNQcm9wcz10aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wczt2YXIg cHVibGljQ29udGV4dD10aGlzLl9wcm9jZXNzQ29udGV4dChjb250ZXh0KTt2YXIgQ29tcG9uZW50 PXRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7dmFyIHVwZGF0ZVF1ZXVlPXRyYW5zYWN0aW9uLmdl dFVwZGF0ZVF1ZXVlKCk7dmFyIGRvQ29uc3RydWN0PXNob3VsZENvbnN0cnVjdChDb21wb25lbnQp O3ZhciBpbnN0PXRoaXMuX2NvbnN0cnVjdENvbXBvbmVudChkb0NvbnN0cnVjdCxwdWJsaWNQcm9w cyxwdWJsaWNDb250ZXh0LHVwZGF0ZVF1ZXVlKTt2YXIgcmVuZGVyZWRFbGVtZW50O2lmKCFkb0Nv bnN0cnVjdCYmKGluc3Q9PW51bGx8fGluc3QucmVuZGVyPT1udWxsKSl7cmVuZGVyZWRFbGVtZW50 PWluc3Q7d2FybklmSW52YWxpZEVsZW1lbnQoQ29tcG9uZW50LHJlbmRlcmVkRWxlbWVudCk7IShp bnN0PT09bnVsbHx8aW5zdD09PWZhbHNlfHxSZWFjdC5pc1ZhbGlkRWxlbWVudChpbnN0KSk/ImRl dmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsIiVzKC4uLik6IEEgdmFs aWQgUmVhY3QgZWxlbWVudCAob3IgbnVsbCkgbXVzdCBiZSByZXR1cm5lZC4gWW91IG1heSBoYXZl IHJldHVybmVkIHVuZGVmaW5lZCwgYW4gYXJyYXkgb3Igc29tZSBvdGhlciBpbnZhbGlkIG9iamVj dC4iLENvbXBvbmVudC5kaXNwbGF5TmFtZXx8Q29tcG9uZW50Lm5hbWV8fCJDb21wb25lbnQiKTpf cHJvZEludmFyaWFudCgiMTA1IixDb21wb25lbnQuZGlzcGxheU5hbWV8fENvbXBvbmVudC5uYW1l fHwiQ29tcG9uZW50Iik6dm9pZCAwO2luc3Q9bmV3IFN0YXRlbGVzc0NvbXBvbmVudChDb21wb25l bnQpO3RoaXMuX2NvbXBvc2l0ZVR5cGU9Q29tcG9zaXRlVHlwZXMuU3RhdGVsZXNzRnVuY3Rpb25h bH1lbHNle2lmKGlzUHVyZUNvbXBvbmVudChDb21wb25lbnQpKXt0aGlzLl9jb21wb3NpdGVUeXBl PUNvbXBvc2l0ZVR5cGVzLlB1cmVDbGFzc31lbHNle3RoaXMuX2NvbXBvc2l0ZVR5cGU9Q29tcG9z aXRlVHlwZXMuSW1wdXJlQ2xhc3N9fWlmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe2lm KGluc3QucmVuZGVyPT1udWxsKXsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmco ZmFsc2UsIiVzKC4uLik6IE5vIGByZW5kZXJgIG1ldGhvZCBmb3VuZCBvbiB0aGUgcmV0dXJuZWQg Y29tcG9uZW50ICIrImluc3RhbmNlOiB5b3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIGRlZmluZSBg cmVuZGVyYC4iLENvbXBvbmVudC5kaXNwbGF5TmFtZXx8Q29tcG9uZW50Lm5hbWV8fCJDb21wb25l bnQiKTp2b2lkIDB9dmFyIHByb3BzTXV0YXRlZD1pbnN0LnByb3BzIT09cHVibGljUHJvcHM7dmFy IGNvbXBvbmVudE5hbWU9Q29tcG9uZW50LmRpc3BsYXlOYW1lfHxDb21wb25lbnQubmFtZXx8IkNv bXBvbmVudCI7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKGluc3QucHJvcHM9 PT11bmRlZmluZWR8fCFwcm9wc011dGF0ZWQsIiVzKC4uLik6IFdoZW4gY2FsbGluZyBzdXBlcigp IGluIGAlc2AsIG1ha2Ugc3VyZSB0byBwYXNzICIrInVwIHRoZSBzYW1lIHByb3BzIHRoYXQgeW91 ciBjb21wb25lbnQncyBjb25zdHJ1Y3RvciB3YXMgcGFzc2VkLiIsY29tcG9uZW50TmFtZSxjb21w b25lbnROYW1lKTp2b2lkIDB9aW5zdC5wcm9wcz1wdWJsaWNQcm9wcztpbnN0LmNvbnRleHQ9cHVi bGljQ29udGV4dDtpbnN0LnJlZnM9ZW1wdHlPYmplY3Q7aW5zdC51cGRhdGVyPXVwZGF0ZVF1ZXVl O3RoaXMuX2luc3RhbmNlPWluc3Q7UmVhY3RJbnN0YW5jZU1hcC5zZXQoaW5zdCx0aGlzKTtpZigi ZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24i P3dhcm5pbmcoIWluc3QuZ2V0SW5pdGlhbFN0YXRlfHxpbnN0LmdldEluaXRpYWxTdGF0ZS5pc1Jl YWN0Q2xhc3NBcHByb3ZlZHx8aW5zdC5zdGF0ZSwiZ2V0SW5pdGlhbFN0YXRlIHdhcyBkZWZpbmVk IG9uICVzLCBhIHBsYWluIEphdmFTY3JpcHQgY2xhc3MuICIrIlRoaXMgaXMgb25seSBzdXBwb3J0 ZWQgZm9yIGNsYXNzZXMgY3JlYXRlZCB1c2luZyBSZWFjdC5jcmVhdGVDbGFzcy4gIisiRGlkIHlv dSBtZWFuIHRvIGRlZmluZSBhIHN0YXRlIHByb3BlcnR5IGluc3RlYWQ/Iix0aGlzLmdldE5hbWUo KXx8ImEgY29tcG9uZW50Iik6dm9pZCAwOyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2Fy bmluZyghaW5zdC5nZXREZWZhdWx0UHJvcHN8fGluc3QuZ2V0RGVmYXVsdFByb3BzLmlzUmVhY3RD bGFzc0FwcHJvdmVkLCJnZXREZWZhdWx0UHJvcHMgd2FzIGRlZmluZWQgb24gJXMsIGEgcGxhaW4g SmF2YVNjcmlwdCBjbGFzcy4gIisiVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBj cmVhdGVkIHVzaW5nIFJlYWN0LmNyZWF0ZUNsYXNzLiAiKyJVc2UgYSBzdGF0aWMgcHJvcGVydHkg dG8gZGVmaW5lIGRlZmF1bHRQcm9wcyBpbnN0ZWFkLiIsdGhpcy5nZXROYW1lKCl8fCJhIGNvbXBv bmVudCIpOnZvaWQgMDsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmcoIWluc3Qu cHJvcFR5cGVzLCJwcm9wVHlwZXMgd2FzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkg b24gJXMuIFVzZSBhIHN0YXRpYyAiKyJwcm9wZXJ0eSB0byBkZWZpbmUgcHJvcFR5cGVzIGluc3Rl YWQuIix0aGlzLmdldE5hbWUoKXx8ImEgY29tcG9uZW50Iik6dm9pZCAwOyJkZXZlbG9wbWVudCIh PT0icHJvZHVjdGlvbiI/d2FybmluZyghaW5zdC5jb250ZXh0VHlwZXMsImNvbnRleHRUeXBlcyB3 YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgIisic3RhdGlj IHByb3BlcnR5IHRvIGRlZmluZSBjb250ZXh0VHlwZXMgaW5zdGVhZC4iLHRoaXMuZ2V0TmFtZSgp fHwiYSBjb21wb25lbnQiKTp2b2lkIDA7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJu aW5nKHR5cGVvZiBpbnN0LmNvbXBvbmVudFNob3VsZFVwZGF0ZSE9PSJmdW5jdGlvbiIsIiVzIGhh cyBhIG1ldGhvZCBjYWxsZWQgIisiY29tcG9uZW50U2hvdWxkVXBkYXRlKCkuIERpZCB5b3UgbWVh biBzaG91bGRDb21wb25lbnRVcGRhdGUoKT8gIisiVGhlIG5hbWUgaXMgcGhyYXNlZCBhcyBhIHF1 ZXN0aW9uIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGlzICIrImV4cGVjdGVkIHRvIHJldHVybiBhIHZh bHVlLiIsdGhpcy5nZXROYW1lKCl8fCJBIGNvbXBvbmVudCIpOnZvaWQgMDsiZGV2ZWxvcG1lbnQi IT09InByb2R1Y3Rpb24iP3dhcm5pbmcodHlwZW9mIGluc3QuY29tcG9uZW50RGlkVW5tb3VudCE9 PSJmdW5jdGlvbiIsIiVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgIisiY29tcG9uZW50RGlkVW5tb3Vu dCgpLiBCdXQgdGhlcmUgaXMgbm8gc3VjaCBsaWZlY3ljbGUgbWV0aG9kLiAiKyJEaWQgeW91IG1l YW4gY29tcG9uZW50V2lsbFVubW91bnQoKT8iLHRoaXMuZ2V0TmFtZSgpfHwiQSBjb21wb25lbnQi KTp2b2lkIDA7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKHR5cGVvZiBpbnN0 LmNvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMhPT0iZnVuY3Rpb24iLCIlcyBoYXMgYSBtZXRob2Qg Y2FsbGVkICIrImNvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMoKS4gRGlkIHlvdSBtZWFuIGNvbXBv bmVudFdpbGxSZWNlaXZlUHJvcHMoKT8iLHRoaXMuZ2V0TmFtZSgpfHwiQSBjb21wb25lbnQiKTp2 b2lkIDB9dmFyIGluaXRpYWxTdGF0ZT1pbnN0LnN0YXRlO2lmKGluaXRpYWxTdGF0ZT09PXVuZGVm aW5lZCl7aW5zdC5zdGF0ZT1pbml0aWFsU3RhdGU9bnVsbH0hKHR5cGVvZiBpbml0aWFsU3RhdGU9 PT0ib2JqZWN0IiYmIUFycmF5LmlzQXJyYXkoaW5pdGlhbFN0YXRlKSk/ImRldmVsb3BtZW50IiE9 PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsIiVzLnN0YXRlOiBtdXN0IGJlIHNldCB0byBh biBvYmplY3Qgb3IgbnVsbCIsdGhpcy5nZXROYW1lKCl8fCJSZWFjdENvbXBvc2l0ZUNvbXBvbmVu dCIpOl9wcm9kSW52YXJpYW50KCIxMDYiLHRoaXMuZ2V0TmFtZSgpfHwiUmVhY3RDb21wb3NpdGVD b21wb25lbnQiKTp2b2lkIDA7dGhpcy5fcGVuZGluZ1N0YXRlUXVldWU9bnVsbDt0aGlzLl9wZW5k aW5nUmVwbGFjZVN0YXRlPWZhbHNlO3RoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZT1mYWxzZTt2YXIg bWFya3VwO2lmKGluc3QudW5zdGFibGVfaGFuZGxlRXJyb3Ipe21hcmt1cD10aGlzLnBlcmZvcm1J bml0aWFsTW91bnRXaXRoRXJyb3JIYW5kbGluZyhyZW5kZXJlZEVsZW1lbnQsaG9zdFBhcmVudCxo b3N0Q29udGFpbmVySW5mbyx0cmFuc2FjdGlvbixjb250ZXh0KX1lbHNle21hcmt1cD10aGlzLnBl cmZvcm1Jbml0aWFsTW91bnQocmVuZGVyZWRFbGVtZW50LGhvc3RQYXJlbnQsaG9zdENvbnRhaW5l ckluZm8sdHJhbnNhY3Rpb24sY29udGV4dCl9aWYoaW5zdC5jb21wb25lbnREaWRNb3VudCl7aWYo ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7dHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJl YWR5KCkuZW5xdWV1ZShmdW5jdGlvbigpe21lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0aW9uKCl7 cmV0dXJuIGluc3QuY29tcG9uZW50RGlkTW91bnQoKX0sX3RoaXMuX2RlYnVnSUQsImNvbXBvbmVu dERpZE1vdW50Iil9KX1lbHNle3RyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVl dWUoaW5zdC5jb21wb25lbnREaWRNb3VudCxpbnN0KX19cmV0dXJuIG1hcmt1cH0sX2NvbnN0cnVj dENvbXBvbmVudDpmdW5jdGlvbihkb0NvbnN0cnVjdCxwdWJsaWNQcm9wcyxwdWJsaWNDb250ZXh0 LHVwZGF0ZVF1ZXVlKXtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtSZWFjdEN1cnJl bnRPd25lci5jdXJyZW50PXRoaXM7dHJ5e3JldHVybiB0aGlzLl9jb25zdHJ1Y3RDb21wb25lbnRX aXRob3V0T3duZXIoZG9Db25zdHJ1Y3QscHVibGljUHJvcHMscHVibGljQ29udGV4dCx1cGRhdGVR dWV1ZSl9ZmluYWxseXtSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50PW51bGx9fWVsc2V7cmV0dXJu IHRoaXMuX2NvbnN0cnVjdENvbXBvbmVudFdpdGhvdXRPd25lcihkb0NvbnN0cnVjdCxwdWJsaWNQ cm9wcyxwdWJsaWNDb250ZXh0LHVwZGF0ZVF1ZXVlKX19LF9jb25zdHJ1Y3RDb21wb25lbnRXaXRo b3V0T3duZXI6ZnVuY3Rpb24oZG9Db25zdHJ1Y3QscHVibGljUHJvcHMscHVibGljQ29udGV4dCx1 cGRhdGVRdWV1ZSl7dmFyIENvbXBvbmVudD10aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO2lmKGRv Q29uc3RydWN0KXtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtyZXR1cm4gbWVhc3Vy ZUxpZmVDeWNsZVBlcmYoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IENvbXBvbmVudChwdWJsaWNQcm9w cyxwdWJsaWNDb250ZXh0LHVwZGF0ZVF1ZXVlKX0sdGhpcy5fZGVidWdJRCwiY3RvciIpfWVsc2V7 cmV0dXJuIG5ldyBDb21wb25lbnQocHVibGljUHJvcHMscHVibGljQ29udGV4dCx1cGRhdGVRdWV1 ZSl9fWlmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe3JldHVybiBtZWFzdXJlTGlmZUN5 Y2xlUGVyZihmdW5jdGlvbigpe3JldHVybiBDb21wb25lbnQocHVibGljUHJvcHMscHVibGljQ29u dGV4dCx1cGRhdGVRdWV1ZSl9LHRoaXMuX2RlYnVnSUQsInJlbmRlciIpfWVsc2V7cmV0dXJuIENv bXBvbmVudChwdWJsaWNQcm9wcyxwdWJsaWNDb250ZXh0LHVwZGF0ZVF1ZXVlKX19LHBlcmZvcm1J bml0aWFsTW91bnRXaXRoRXJyb3JIYW5kbGluZzpmdW5jdGlvbihyZW5kZXJlZEVsZW1lbnQsaG9z dFBhcmVudCxob3N0Q29udGFpbmVySW5mbyx0cmFuc2FjdGlvbixjb250ZXh0KXt2YXIgbWFya3Vw O3ZhciBjaGVja3BvaW50PXRyYW5zYWN0aW9uLmNoZWNrcG9pbnQoKTt0cnl7bWFya3VwPXRoaXMu cGVyZm9ybUluaXRpYWxNb3VudChyZW5kZXJlZEVsZW1lbnQsaG9zdFBhcmVudCxob3N0Q29udGFp bmVySW5mbyx0cmFuc2FjdGlvbixjb250ZXh0KX1jYXRjaChlKXt0cmFuc2FjdGlvbi5yb2xsYmFj ayhjaGVja3BvaW50KTt0aGlzLl9pbnN0YW5jZS51bnN0YWJsZV9oYW5kbGVFcnJvcihlKTtpZih0 aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSl7dGhpcy5faW5zdGFuY2Uuc3RhdGU9dGhpcy5fcHJvY2Vz c1BlbmRpbmdTdGF0ZSh0aGlzLl9pbnN0YW5jZS5wcm9wcyx0aGlzLl9pbnN0YW5jZS5jb250ZXh0 KX1jaGVja3BvaW50PXRyYW5zYWN0aW9uLmNoZWNrcG9pbnQoKTt0aGlzLl9yZW5kZXJlZENvbXBv bmVudC51bm1vdW50Q29tcG9uZW50KHRydWUpO3RyYW5zYWN0aW9uLnJvbGxiYWNrKGNoZWNrcG9p bnQpO21hcmt1cD10aGlzLnBlcmZvcm1Jbml0aWFsTW91bnQocmVuZGVyZWRFbGVtZW50LGhvc3RQ YXJlbnQsaG9zdENvbnRhaW5lckluZm8sdHJhbnNhY3Rpb24sY29udGV4dCl9cmV0dXJuIG1hcmt1 cH0scGVyZm9ybUluaXRpYWxNb3VudDpmdW5jdGlvbihyZW5kZXJlZEVsZW1lbnQsaG9zdFBhcmVu dCxob3N0Q29udGFpbmVySW5mbyx0cmFuc2FjdGlvbixjb250ZXh0KXt2YXIgaW5zdD10aGlzLl9p bnN0YW5jZTt2YXIgZGVidWdJRD0wO2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe2Rl YnVnSUQ9dGhpcy5fZGVidWdJRH1pZihpbnN0LmNvbXBvbmVudFdpbGxNb3VudCl7aWYoImRldmVs b3BtZW50IiE9PSJwcm9kdWN0aW9uIil7bWVhc3VyZUxpZmVDeWNsZVBlcmYoZnVuY3Rpb24oKXty ZXR1cm4gaW5zdC5jb21wb25lbnRXaWxsTW91bnQoKX0sZGVidWdJRCwiY29tcG9uZW50V2lsbE1v dW50Iil9ZWxzZXtpbnN0LmNvbXBvbmVudFdpbGxNb3VudCgpfWlmKHRoaXMuX3BlbmRpbmdTdGF0 ZVF1ZXVlKXtpbnN0LnN0YXRlPXRoaXMuX3Byb2Nlc3NQZW5kaW5nU3RhdGUoaW5zdC5wcm9wcyxp bnN0LmNvbnRleHQpfX1pZihyZW5kZXJlZEVsZW1lbnQ9PT11bmRlZmluZWQpe3JlbmRlcmVkRWxl bWVudD10aGlzLl9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnQoKX12YXIgbm9kZVR5cGU9UmVhY3RO b2RlVHlwZXMuZ2V0VHlwZShyZW5kZXJlZEVsZW1lbnQpO3RoaXMuX3JlbmRlcmVkTm9kZVR5cGU9 bm9kZVR5cGU7dmFyIGNoaWxkPXRoaXMuX2luc3RhbnRpYXRlUmVhY3RDb21wb25lbnQocmVuZGVy ZWRFbGVtZW50LG5vZGVUeXBlIT09UmVhY3ROb2RlVHlwZXMuRU1QVFkpO3RoaXMuX3JlbmRlcmVk Q29tcG9uZW50PWNoaWxkO3ZhciBtYXJrdXA9UmVhY3RSZWNvbmNpbGVyLm1vdW50Q29tcG9uZW50 KGNoaWxkLHRyYW5zYWN0aW9uLGhvc3RQYXJlbnQsaG9zdENvbnRhaW5lckluZm8sdGhpcy5fcHJv Y2Vzc0NoaWxkQ29udGV4dChjb250ZXh0KSxkZWJ1Z0lEKTtpZigiZGV2ZWxvcG1lbnQiIT09InBy b2R1Y3Rpb24iKXtpZihkZWJ1Z0lEIT09MCl7dmFyIGNoaWxkRGVidWdJRHM9Y2hpbGQuX2RlYnVn SUQhPT0wP1tjaGlsZC5fZGVidWdJRF06W107UmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29s Lm9uU2V0Q2hpbGRyZW4oZGVidWdJRCxjaGlsZERlYnVnSURzKX19cmV0dXJuIG1hcmt1cH0sZ2V0 SG9zdE5vZGU6ZnVuY3Rpb24oKXtyZXR1cm4gUmVhY3RSZWNvbmNpbGVyLmdldEhvc3ROb2RlKHRo aXMuX3JlbmRlcmVkQ29tcG9uZW50KX0sdW5tb3VudENvbXBvbmVudDpmdW5jdGlvbihzYWZlbHkp e2lmKCF0aGlzLl9yZW5kZXJlZENvbXBvbmVudCl7cmV0dXJufXZhciBpbnN0PXRoaXMuX2luc3Rh bmNlO2lmKGluc3QuY29tcG9uZW50V2lsbFVubW91bnQmJiFpbnN0Ll9jYWxsZWRDb21wb25lbnRX aWxsVW5tb3VudCl7aW5zdC5fY2FsbGVkQ29tcG9uZW50V2lsbFVubW91bnQ9dHJ1ZTtpZihzYWZl bHkpe3ZhciBuYW1lPXRoaXMuZ2V0TmFtZSgpKyIuY29tcG9uZW50V2lsbFVubW91bnQoKSI7UmVh Y3RFcnJvclV0aWxzLmludm9rZUd1YXJkZWRDYWxsYmFjayhuYW1lLGluc3QuY29tcG9uZW50V2ls bFVubW91bnQuYmluZChpbnN0KSl9ZWxzZXtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24i KXttZWFzdXJlTGlmZUN5Y2xlUGVyZihmdW5jdGlvbigpe3JldHVybiBpbnN0LmNvbXBvbmVudFdp bGxVbm1vdW50KCl9LHRoaXMuX2RlYnVnSUQsImNvbXBvbmVudFdpbGxVbm1vdW50Iil9ZWxzZXtp bnN0LmNvbXBvbmVudFdpbGxVbm1vdW50KCl9fX1pZih0aGlzLl9yZW5kZXJlZENvbXBvbmVudCl7 UmVhY3RSZWNvbmNpbGVyLnVubW91bnRDb21wb25lbnQodGhpcy5fcmVuZGVyZWRDb21wb25lbnQs c2FmZWx5KTt0aGlzLl9yZW5kZXJlZE5vZGVUeXBlPW51bGw7dGhpcy5fcmVuZGVyZWRDb21wb25l bnQ9bnVsbDt0aGlzLl9pbnN0YW5jZT1udWxsfXRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlPW51bGw7 dGhpcy5fcGVuZGluZ1JlcGxhY2VTdGF0ZT1mYWxzZTt0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGU9 ZmFsc2U7dGhpcy5fcGVuZGluZ0NhbGxiYWNrcz1udWxsO3RoaXMuX3BlbmRpbmdFbGVtZW50PW51 bGw7dGhpcy5fY29udGV4dD1udWxsO3RoaXMuX3Jvb3ROb2RlSUQ9MDt0aGlzLl90b3BMZXZlbFdy YXBwZXI9bnVsbDtSZWFjdEluc3RhbmNlTWFwLnJlbW92ZShpbnN0KX0sX21hc2tDb250ZXh0OmZ1 bmN0aW9uKGNvbnRleHQpe3ZhciBDb21wb25lbnQ9dGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTt2 YXIgY29udGV4dFR5cGVzPUNvbXBvbmVudC5jb250ZXh0VHlwZXM7aWYoIWNvbnRleHRUeXBlcyl7 cmV0dXJuIGVtcHR5T2JqZWN0fXZhciBtYXNrZWRDb250ZXh0PXt9O2Zvcih2YXIgY29udGV4dE5h bWUgaW4gY29udGV4dFR5cGVzKXttYXNrZWRDb250ZXh0W2NvbnRleHROYW1lXT1jb250ZXh0W2Nv bnRleHROYW1lXX1yZXR1cm4gbWFza2VkQ29udGV4dH0sX3Byb2Nlc3NDb250ZXh0OmZ1bmN0aW9u KGNvbnRleHQpe3ZhciBtYXNrZWRDb250ZXh0PXRoaXMuX21hc2tDb250ZXh0KGNvbnRleHQpO2lm KCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe3ZhciBDb21wb25lbnQ9dGhpcy5fY3VycmVu dEVsZW1lbnQudHlwZTtpZihDb21wb25lbnQuY29udGV4dFR5cGVzKXt0aGlzLl9jaGVja0NvbnRl eHRUeXBlcyhDb21wb25lbnQuY29udGV4dFR5cGVzLG1hc2tlZENvbnRleHQsImNvbnRleHQiKX19 cmV0dXJuIG1hc2tlZENvbnRleHR9LF9wcm9jZXNzQ2hpbGRDb250ZXh0OmZ1bmN0aW9uKGN1cnJl bnRDb250ZXh0KXt2YXIgQ29tcG9uZW50PXRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7dmFyIGlu c3Q9dGhpcy5faW5zdGFuY2U7dmFyIGNoaWxkQ29udGV4dDtpZihpbnN0LmdldENoaWxkQ29udGV4 dCl7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7UmVhY3RJbnN0cnVtZW50YXRpb24u ZGVidWdUb29sLm9uQmVnaW5Qcm9jZXNzaW5nQ2hpbGRDb250ZXh0KCk7dHJ5e2NoaWxkQ29udGV4 dD1pbnN0LmdldENoaWxkQ29udGV4dCgpfWZpbmFsbHl7UmVhY3RJbnN0cnVtZW50YXRpb24uZGVi dWdUb29sLm9uRW5kUHJvY2Vzc2luZ0NoaWxkQ29udGV4dCgpfX1lbHNle2NoaWxkQ29udGV4dD1p bnN0LmdldENoaWxkQ29udGV4dCgpfX1pZihjaGlsZENvbnRleHQpeyEodHlwZW9mIENvbXBvbmVu dC5jaGlsZENvbnRleHRUeXBlcz09PSJvYmplY3QiKT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rp b24iP2ludmFyaWFudChmYWxzZSwiJXMuZ2V0Q2hpbGRDb250ZXh0KCk6IGNoaWxkQ29udGV4dFR5 cGVzIG11c3QgYmUgZGVmaW5lZCBpbiBvcmRlciB0byB1c2UgZ2V0Q2hpbGRDb250ZXh0KCkuIix0 aGlzLmdldE5hbWUoKXx8IlJlYWN0Q29tcG9zaXRlQ29tcG9uZW50Iik6X3Byb2RJbnZhcmlhbnQo IjEwNyIsdGhpcy5nZXROYW1lKCl8fCJSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCIpOnZvaWQgMDtp ZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXt0aGlzLl9jaGVja0NvbnRleHRUeXBlcyhD b21wb25lbnQuY2hpbGRDb250ZXh0VHlwZXMsY2hpbGRDb250ZXh0LCJjaGlsZENvbnRleHQiKX1m b3IodmFyIG5hbWUgaW4gY2hpbGRDb250ZXh0KXshKG5hbWUgaW4gQ29tcG9uZW50LmNoaWxkQ29u dGV4dFR5cGVzKT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwn JXMuZ2V0Q2hpbGRDb250ZXh0KCk6IGtleSAiJXMiIGlzIG5vdCBkZWZpbmVkIGluIGNoaWxkQ29u dGV4dFR5cGVzLicsdGhpcy5nZXROYW1lKCl8fCJSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCIsbmFt ZSk6X3Byb2RJbnZhcmlhbnQoIjEwOCIsdGhpcy5nZXROYW1lKCl8fCJSZWFjdENvbXBvc2l0ZUNv bXBvbmVudCIsbmFtZSk6dm9pZCAwfXJldHVybiBfYXNzaWduKHt9LGN1cnJlbnRDb250ZXh0LGNo aWxkQ29udGV4dCl9cmV0dXJuIGN1cnJlbnRDb250ZXh0fSxfY2hlY2tDb250ZXh0VHlwZXM6ZnVu Y3Rpb24odHlwZVNwZWNzLHZhbHVlcyxsb2NhdGlvbil7aWYoImRldmVsb3BtZW50IiE9PSJwcm9k dWN0aW9uIil7Y2hlY2tSZWFjdFR5cGVTcGVjKHR5cGVTcGVjcyx2YWx1ZXMsbG9jYXRpb24sdGhp cy5nZXROYW1lKCksbnVsbCx0aGlzLl9kZWJ1Z0lEKX19LHJlY2VpdmVDb21wb25lbnQ6ZnVuY3Rp b24obmV4dEVsZW1lbnQsdHJhbnNhY3Rpb24sbmV4dENvbnRleHQpe3ZhciBwcmV2RWxlbWVudD10 aGlzLl9jdXJyZW50RWxlbWVudDt2YXIgcHJldkNvbnRleHQ9dGhpcy5fY29udGV4dDt0aGlzLl9w ZW5kaW5nRWxlbWVudD1udWxsO3RoaXMudXBkYXRlQ29tcG9uZW50KHRyYW5zYWN0aW9uLHByZXZF bGVtZW50LG5leHRFbGVtZW50LHByZXZDb250ZXh0LG5leHRDb250ZXh0KX0scGVyZm9ybVVwZGF0 ZUlmTmVjZXNzYXJ5OmZ1bmN0aW9uKHRyYW5zYWN0aW9uKXtpZih0aGlzLl9wZW5kaW5nRWxlbWVu dCE9bnVsbCl7UmVhY3RSZWNvbmNpbGVyLnJlY2VpdmVDb21wb25lbnQodGhpcyx0aGlzLl9wZW5k aW5nRWxlbWVudCx0cmFuc2FjdGlvbix0aGlzLl9jb250ZXh0KX1lbHNlIGlmKHRoaXMuX3BlbmRp bmdTdGF0ZVF1ZXVlIT09bnVsbHx8dGhpcy5fcGVuZGluZ0ZvcmNlVXBkYXRlKXt0aGlzLnVwZGF0 ZUNvbXBvbmVudCh0cmFuc2FjdGlvbix0aGlzLl9jdXJyZW50RWxlbWVudCx0aGlzLl9jdXJyZW50 RWxlbWVudCx0aGlzLl9jb250ZXh0LHRoaXMuX2NvbnRleHQpfWVsc2V7dGhpcy5fdXBkYXRlQmF0 Y2hOdW1iZXI9bnVsbH19LHVwZGF0ZUNvbXBvbmVudDpmdW5jdGlvbih0cmFuc2FjdGlvbixwcmV2 UGFyZW50RWxlbWVudCxuZXh0UGFyZW50RWxlbWVudCxwcmV2VW5tYXNrZWRDb250ZXh0LG5leHRV bm1hc2tlZENvbnRleHQpe3ZhciBpbnN0PXRoaXMuX2luc3RhbmNlOyEoaW5zdCE9bnVsbCk/ImRl dmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsIkF0dGVtcHRlZCB0byB1 cGRhdGUgY29tcG9uZW50IGAlc2AgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHVubW91bnRlZCAob3Ig ZmFpbGVkIHRvIG1vdW50KS4iLHRoaXMuZ2V0TmFtZSgpfHwiUmVhY3RDb21wb3NpdGVDb21wb25l bnQiKTpfcHJvZEludmFyaWFudCgiMTM2Iix0aGlzLmdldE5hbWUoKXx8IlJlYWN0Q29tcG9zaXRl Q29tcG9uZW50Iik6dm9pZCAwO3ZhciB3aWxsUmVjZWl2ZT1mYWxzZTt2YXIgbmV4dENvbnRleHQ7 aWYodGhpcy5fY29udGV4dD09PW5leHRVbm1hc2tlZENvbnRleHQpe25leHRDb250ZXh0PWluc3Qu Y29udGV4dH1lbHNle25leHRDb250ZXh0PXRoaXMuX3Byb2Nlc3NDb250ZXh0KG5leHRVbm1hc2tl ZENvbnRleHQpO3dpbGxSZWNlaXZlPXRydWV9dmFyIHByZXZQcm9wcz1wcmV2UGFyZW50RWxlbWVu dC5wcm9wczt2YXIgbmV4dFByb3BzPW5leHRQYXJlbnRFbGVtZW50LnByb3BzO2lmKHByZXZQYXJl bnRFbGVtZW50IT09bmV4dFBhcmVudEVsZW1lbnQpe3dpbGxSZWNlaXZlPXRydWV9aWYod2lsbFJl Y2VpdmUmJmluc3QuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyl7aWYoImRldmVsb3BtZW50IiE9 PSJwcm9kdWN0aW9uIil7bWVhc3VyZUxpZmVDeWNsZVBlcmYoZnVuY3Rpb24oKXtyZXR1cm4gaW5z dC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcyxuZXh0Q29udGV4dCl9LHRoaXMu X2RlYnVnSUQsImNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMiKX1lbHNle2luc3QuY29tcG9uZW50 V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMsbmV4dENvbnRleHQpfX12YXIgbmV4dFN0YXRlPXRo aXMuX3Byb2Nlc3NQZW5kaW5nU3RhdGUobmV4dFByb3BzLG5leHRDb250ZXh0KTt2YXIgc2hvdWxk VXBkYXRlPXRydWU7aWYoIXRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZSl7aWYoaW5zdC5zaG91bGRD b21wb25lbnRVcGRhdGUpe2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe3Nob3VsZFVw ZGF0ZT1tZWFzdXJlTGlmZUN5Y2xlUGVyZihmdW5jdGlvbigpe3JldHVybiBpbnN0LnNob3VsZENv bXBvbmVudFVwZGF0ZShuZXh0UHJvcHMsbmV4dFN0YXRlLG5leHRDb250ZXh0KX0sdGhpcy5fZGVi dWdJRCwic2hvdWxkQ29tcG9uZW50VXBkYXRlIil9ZWxzZXtzaG91bGRVcGRhdGU9aW5zdC5zaG91 bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzLG5leHRTdGF0ZSxuZXh0Q29udGV4dCl9fWVsc2V7 aWYodGhpcy5fY29tcG9zaXRlVHlwZT09PUNvbXBvc2l0ZVR5cGVzLlB1cmVDbGFzcyl7c2hvdWxk VXBkYXRlPSFzaGFsbG93RXF1YWwocHJldlByb3BzLG5leHRQcm9wcyl8fCFzaGFsbG93RXF1YWwo aW5zdC5zdGF0ZSxuZXh0U3RhdGUpfX19aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7 ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKHNob3VsZFVwZGF0ZSE9PXVuZGVm aW5lZCwiJXMuc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk6IFJldHVybmVkIHVuZGVmaW5lZCBpbnN0 ZWFkIG9mIGEgIisiYm9vbGVhbiB2YWx1ZS4gTWFrZSBzdXJlIHRvIHJldHVybiB0cnVlIG9yIGZh bHNlLiIsdGhpcy5nZXROYW1lKCl8fCJSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCIpOnZvaWQgMH10 aGlzLl91cGRhdGVCYXRjaE51bWJlcj1udWxsO2lmKHNob3VsZFVwZGF0ZSl7dGhpcy5fcGVuZGlu Z0ZvcmNlVXBkYXRlPWZhbHNlO3RoaXMuX3BlcmZvcm1Db21wb25lbnRVcGRhdGUobmV4dFBhcmVu dEVsZW1lbnQsbmV4dFByb3BzLG5leHRTdGF0ZSxuZXh0Q29udGV4dCx0cmFuc2FjdGlvbixuZXh0 VW5tYXNrZWRDb250ZXh0KX1lbHNle3RoaXMuX2N1cnJlbnRFbGVtZW50PW5leHRQYXJlbnRFbGVt ZW50O3RoaXMuX2NvbnRleHQ9bmV4dFVubWFza2VkQ29udGV4dDtpbnN0LnByb3BzPW5leHRQcm9w cztpbnN0LnN0YXRlPW5leHRTdGF0ZTtpbnN0LmNvbnRleHQ9bmV4dENvbnRleHR9fSxfcHJvY2Vz c1BlbmRpbmdTdGF0ZTpmdW5jdGlvbihwcm9wcyxjb250ZXh0KXt2YXIgaW5zdD10aGlzLl9pbnN0 YW5jZTt2YXIgcXVldWU9dGhpcy5fcGVuZGluZ1N0YXRlUXVldWU7dmFyIHJlcGxhY2U9dGhpcy5f cGVuZGluZ1JlcGxhY2VTdGF0ZTt0aGlzLl9wZW5kaW5nUmVwbGFjZVN0YXRlPWZhbHNlO3RoaXMu X3BlbmRpbmdTdGF0ZVF1ZXVlPW51bGw7aWYoIXF1ZXVlKXtyZXR1cm4gaW5zdC5zdGF0ZX1pZihy ZXBsYWNlJiZxdWV1ZS5sZW5ndGg9PT0xKXtyZXR1cm4gcXVldWVbMF19dmFyIG5leHRTdGF0ZT1f YXNzaWduKHt9LHJlcGxhY2U/cXVldWVbMF06aW5zdC5zdGF0ZSk7Zm9yKHZhciBpPXJlcGxhY2U/ MTowO2k8cXVldWUubGVuZ3RoO2krKyl7dmFyIHBhcnRpYWw9cXVldWVbaV07X2Fzc2lnbihuZXh0 U3RhdGUsdHlwZW9mIHBhcnRpYWw9PT0iZnVuY3Rpb24iP3BhcnRpYWwuY2FsbChpbnN0LG5leHRT dGF0ZSxwcm9wcyxjb250ZXh0KTpwYXJ0aWFsKX1yZXR1cm4gbmV4dFN0YXRlfSxfcGVyZm9ybUNv bXBvbmVudFVwZGF0ZTpmdW5jdGlvbihuZXh0RWxlbWVudCxuZXh0UHJvcHMsbmV4dFN0YXRlLG5l eHRDb250ZXh0LHRyYW5zYWN0aW9uLHVubWFza2VkQ29udGV4dCl7dmFyIF90aGlzMj10aGlzO3Zh ciBpbnN0PXRoaXMuX2luc3RhbmNlO3ZhciBoYXNDb21wb25lbnREaWRVcGRhdGU9Qm9vbGVhbihp bnN0LmNvbXBvbmVudERpZFVwZGF0ZSk7dmFyIHByZXZQcm9wczt2YXIgcHJldlN0YXRlO3ZhciBw cmV2Q29udGV4dDtpZihoYXNDb21wb25lbnREaWRVcGRhdGUpe3ByZXZQcm9wcz1pbnN0LnByb3Bz O3ByZXZTdGF0ZT1pbnN0LnN0YXRlO3ByZXZDb250ZXh0PWluc3QuY29udGV4dH1pZihpbnN0LmNv bXBvbmVudFdpbGxVcGRhdGUpe2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe21lYXN1 cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0aW9uKCl7cmV0dXJuIGluc3QuY29tcG9uZW50V2lsbFVwZGF0 ZShuZXh0UHJvcHMsbmV4dFN0YXRlLG5leHRDb250ZXh0KX0sdGhpcy5fZGVidWdJRCwiY29tcG9u ZW50V2lsbFVwZGF0ZSIpfWVsc2V7aW5zdC5jb21wb25lbnRXaWxsVXBkYXRlKG5leHRQcm9wcyxu ZXh0U3RhdGUsbmV4dENvbnRleHQpfX10aGlzLl9jdXJyZW50RWxlbWVudD1uZXh0RWxlbWVudDt0 aGlzLl9jb250ZXh0PXVubWFza2VkQ29udGV4dDtpbnN0LnByb3BzPW5leHRQcm9wcztpbnN0LnN0 YXRlPW5leHRTdGF0ZTtpbnN0LmNvbnRleHQ9bmV4dENvbnRleHQ7dGhpcy5fdXBkYXRlUmVuZGVy ZWRDb21wb25lbnQodHJhbnNhY3Rpb24sdW5tYXNrZWRDb250ZXh0KTtpZihoYXNDb21wb25lbnRE aWRVcGRhdGUpe2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe3RyYW5zYWN0aW9uLmdl dFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoZnVuY3Rpb24oKXttZWFzdXJlTGlmZUN5Y2xlUGVy ZihpbnN0LmNvbXBvbmVudERpZFVwZGF0ZS5iaW5kKGluc3QscHJldlByb3BzLHByZXZTdGF0ZSxw cmV2Q29udGV4dCksX3RoaXMyLl9kZWJ1Z0lELCJjb21wb25lbnREaWRVcGRhdGUiKX0pfWVsc2V7 dHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShpbnN0LmNvbXBvbmVudERp ZFVwZGF0ZS5iaW5kKGluc3QscHJldlByb3BzLHByZXZTdGF0ZSxwcmV2Q29udGV4dCksaW5zdCl9 fX0sX3VwZGF0ZVJlbmRlcmVkQ29tcG9uZW50OmZ1bmN0aW9uKHRyYW5zYWN0aW9uLGNvbnRleHQp e3ZhciBwcmV2Q29tcG9uZW50SW5zdGFuY2U9dGhpcy5fcmVuZGVyZWRDb21wb25lbnQ7dmFyIHBy ZXZSZW5kZXJlZEVsZW1lbnQ9cHJldkNvbXBvbmVudEluc3RhbmNlLl9jdXJyZW50RWxlbWVudDt2 YXIgbmV4dFJlbmRlcmVkRWxlbWVudD10aGlzLl9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnQoKTt2 YXIgZGVidWdJRD0wO2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe2RlYnVnSUQ9dGhp cy5fZGVidWdJRH1pZihzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudChwcmV2UmVuZGVyZWRFbGVt ZW50LG5leHRSZW5kZXJlZEVsZW1lbnQpKXtSZWFjdFJlY29uY2lsZXIucmVjZWl2ZUNvbXBvbmVu dChwcmV2Q29tcG9uZW50SW5zdGFuY2UsbmV4dFJlbmRlcmVkRWxlbWVudCx0cmFuc2FjdGlvbix0 aGlzLl9wcm9jZXNzQ2hpbGRDb250ZXh0KGNvbnRleHQpKX1lbHNle3ZhciBvbGRIb3N0Tm9kZT1S ZWFjdFJlY29uY2lsZXIuZ2V0SG9zdE5vZGUocHJldkNvbXBvbmVudEluc3RhbmNlKTtSZWFjdFJl Y29uY2lsZXIudW5tb3VudENvbXBvbmVudChwcmV2Q29tcG9uZW50SW5zdGFuY2UsZmFsc2UpO3Zh ciBub2RlVHlwZT1SZWFjdE5vZGVUeXBlcy5nZXRUeXBlKG5leHRSZW5kZXJlZEVsZW1lbnQpO3Ro aXMuX3JlbmRlcmVkTm9kZVR5cGU9bm9kZVR5cGU7dmFyIGNoaWxkPXRoaXMuX2luc3RhbnRpYXRl UmVhY3RDb21wb25lbnQobmV4dFJlbmRlcmVkRWxlbWVudCxub2RlVHlwZSE9PVJlYWN0Tm9kZVR5 cGVzLkVNUFRZKTt0aGlzLl9yZW5kZXJlZENvbXBvbmVudD1jaGlsZDt2YXIgbmV4dE1hcmt1cD1S ZWFjdFJlY29uY2lsZXIubW91bnRDb21wb25lbnQoY2hpbGQsdHJhbnNhY3Rpb24sdGhpcy5faG9z dFBhcmVudCx0aGlzLl9ob3N0Q29udGFpbmVySW5mbyx0aGlzLl9wcm9jZXNzQ2hpbGRDb250ZXh0 KGNvbnRleHQpLGRlYnVnSUQpO2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe2lmKGRl YnVnSUQhPT0wKXt2YXIgY2hpbGREZWJ1Z0lEcz1jaGlsZC5fZGVidWdJRCE9PTA/W2NoaWxkLl9k ZWJ1Z0lEXTpbXTtSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25TZXRDaGlsZHJlbihk ZWJ1Z0lELGNoaWxkRGVidWdJRHMpfX10aGlzLl9yZXBsYWNlTm9kZVdpdGhNYXJrdXAob2xkSG9z dE5vZGUsbmV4dE1hcmt1cCxwcmV2Q29tcG9uZW50SW5zdGFuY2UpfX0sX3JlcGxhY2VOb2RlV2l0 aE1hcmt1cDpmdW5jdGlvbihvbGRIb3N0Tm9kZSxuZXh0TWFya3VwLHByZXZJbnN0YW5jZSl7UmVh Y3RDb21wb25lbnRFbnZpcm9ubWVudC5yZXBsYWNlTm9kZVdpdGhNYXJrdXAob2xkSG9zdE5vZGUs bmV4dE1hcmt1cCxwcmV2SW5zdGFuY2UpfSxfcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50V2l0aG91 dE93bmVyT3JDb250ZXh0OmZ1bmN0aW9uKCl7dmFyIGluc3Q9dGhpcy5faW5zdGFuY2U7dmFyIHJl bmRlcmVkRWxlbWVudDtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtyZW5kZXJlZEVs ZW1lbnQ9bWVhc3VyZUxpZmVDeWNsZVBlcmYoZnVuY3Rpb24oKXtyZXR1cm4gaW5zdC5yZW5kZXIo KX0sdGhpcy5fZGVidWdJRCwicmVuZGVyIil9ZWxzZXtyZW5kZXJlZEVsZW1lbnQ9aW5zdC5yZW5k ZXIoKX1pZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtpZihyZW5kZXJlZEVsZW1lbnQ9 PT11bmRlZmluZWQmJmluc3QucmVuZGVyLl9pc01vY2tGdW5jdGlvbil7cmVuZGVyZWRFbGVtZW50 PW51bGx9fXJldHVybiByZW5kZXJlZEVsZW1lbnR9LF9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnQ6 ZnVuY3Rpb24oKXt2YXIgcmVuZGVyZWRFbGVtZW50O2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVj dGlvbiJ8fHRoaXMuX2NvbXBvc2l0ZVR5cGUhPT1Db21wb3NpdGVUeXBlcy5TdGF0ZWxlc3NGdW5j dGlvbmFsKXtSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50PXRoaXM7dHJ5e3JlbmRlcmVkRWxlbWVu dD10aGlzLl9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnRXaXRob3V0T3duZXJPckNvbnRleHQoKX1m aW5hbGx5e1JlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQ9bnVsbH19ZWxzZXtyZW5kZXJlZEVsZW1l bnQ9dGhpcy5fcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50V2l0aG91dE93bmVyT3JDb250ZXh0KCl9 IShyZW5kZXJlZEVsZW1lbnQ9PT1udWxsfHxyZW5kZXJlZEVsZW1lbnQ9PT1mYWxzZXx8UmVhY3Qu aXNWYWxpZEVsZW1lbnQocmVuZGVyZWRFbGVtZW50KSk/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0 aW9uIj9pbnZhcmlhbnQoZmFsc2UsIiVzLnJlbmRlcigpOiBBIHZhbGlkIFJlYWN0IGVsZW1lbnQg KG9yIG51bGwpIG11c3QgYmUgcmV0dXJuZWQuIFlvdSBtYXkgaGF2ZSByZXR1cm5lZCB1bmRlZmlu ZWQsIGFuIGFycmF5IG9yIHNvbWUgb3RoZXIgaW52YWxpZCBvYmplY3QuIix0aGlzLmdldE5hbWUo KXx8IlJlYWN0Q29tcG9zaXRlQ29tcG9uZW50Iik6X3Byb2RJbnZhcmlhbnQoIjEwOSIsdGhpcy5n ZXROYW1lKCl8fCJSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCIpOnZvaWQgMDtyZXR1cm4gcmVuZGVy ZWRFbGVtZW50fSxhdHRhY2hSZWY6ZnVuY3Rpb24ocmVmLGNvbXBvbmVudCl7dmFyIGluc3Q9dGhp cy5nZXRQdWJsaWNJbnN0YW5jZSgpOyEoaW5zdCE9bnVsbCk/ImRldmVsb3BtZW50IiE9PSJwcm9k dWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsIlN0YXRlbGVzcyBmdW5jdGlvbiBjb21wb25lbnRzIGNh bm5vdCBoYXZlIHJlZnMuIik6X3Byb2RJbnZhcmlhbnQoIjExMCIpOnZvaWQgMDt2YXIgcHVibGlj Q29tcG9uZW50SW5zdGFuY2U9Y29tcG9uZW50LmdldFB1YmxpY0luc3RhbmNlKCk7aWYoImRldmVs b3BtZW50IiE9PSJwcm9kdWN0aW9uIil7dmFyIGNvbXBvbmVudE5hbWU9Y29tcG9uZW50JiZjb21w b25lbnQuZ2V0TmFtZT9jb21wb25lbnQuZ2V0TmFtZSgpOiJhIGNvbXBvbmVudCI7ImRldmVsb3Bt ZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKHB1YmxpY0NvbXBvbmVudEluc3RhbmNlIT1udWxs fHxjb21wb25lbnQuX2NvbXBvc2l0ZVR5cGUhPT1Db21wb3NpdGVUeXBlcy5TdGF0ZWxlc3NGdW5j dGlvbmFsLCJTdGF0ZWxlc3MgZnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgYmUgZ2l2ZW4gcmVm cyAiKycoU2VlIHJlZiAiJXMiIGluICVzIGNyZWF0ZWQgYnkgJXMpLiAnKyJBdHRlbXB0cyB0byBh Y2Nlc3MgdGhpcyByZWYgd2lsbCBmYWlsLiIscmVmLGNvbXBvbmVudE5hbWUsdGhpcy5nZXROYW1l KCkpOnZvaWQgMH12YXIgcmVmcz1pbnN0LnJlZnM9PT1lbXB0eU9iamVjdD9pbnN0LnJlZnM9e306 aW5zdC5yZWZzO3JlZnNbcmVmXT1wdWJsaWNDb21wb25lbnRJbnN0YW5jZX0sZGV0YWNoUmVmOmZ1 bmN0aW9uKHJlZil7dmFyIHJlZnM9dGhpcy5nZXRQdWJsaWNJbnN0YW5jZSgpLnJlZnM7ZGVsZXRl IHJlZnNbcmVmXX0sZ2V0TmFtZTpmdW5jdGlvbigpe3ZhciB0eXBlPXRoaXMuX2N1cnJlbnRFbGVt ZW50LnR5cGU7dmFyIGNvbnN0cnVjdG9yPXRoaXMuX2luc3RhbmNlJiZ0aGlzLl9pbnN0YW5jZS5j b25zdHJ1Y3RvcjtyZXR1cm4gdHlwZS5kaXNwbGF5TmFtZXx8Y29uc3RydWN0b3ImJmNvbnN0cnVj dG9yLmRpc3BsYXlOYW1lfHx0eXBlLm5hbWV8fGNvbnN0cnVjdG9yJiZjb25zdHJ1Y3Rvci5uYW1l fHxudWxsfSxnZXRQdWJsaWNJbnN0YW5jZTpmdW5jdGlvbigpe3ZhciBpbnN0PXRoaXMuX2luc3Rh bmNlO2lmKHRoaXMuX2NvbXBvc2l0ZVR5cGU9PT1Db21wb3NpdGVUeXBlcy5TdGF0ZWxlc3NGdW5j dGlvbmFsKXtyZXR1cm4gbnVsbH1yZXR1cm4gaW5zdH0sX2luc3RhbnRpYXRlUmVhY3RDb21wb25l bnQ6bnVsbH07bW9kdWxlLmV4cG9ydHM9UmVhY3RDb21wb3NpdGVDb21wb25lbnR9LHsxMDQ6MTA0 LDEyNToxMjUsMTI5OjEyOSwxMzM6MTMzLDEzNDoxMzQsMTQzOjE0MywxNTA6MTUwLDE1NjoxNTYs MTU3OjE1NywxNTg6MTU4LDI5OjI5LDU1OjU1LDYzOjYzLDY0OjY0LDY5OjY5LDc1Ojc1fV0sMzE6 W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgUmVhY3RE T01Db21wb25lbnRUcmVlPV9kZXJlcV8oMzQpO3ZhciBSZWFjdERlZmF1bHRJbmplY3Rpb249X2Rl cmVxXyg1Mik7dmFyIFJlYWN0TW91bnQ9X2RlcmVxXyg2Nyk7dmFyIFJlYWN0UmVjb25jaWxlcj1f ZGVyZXFfKDc1KTt2YXIgUmVhY3RVcGRhdGVzPV9kZXJlcV8oODIpO3ZhciBSZWFjdFZlcnNpb249 X2RlcmVxXyg4Myk7dmFyIGZpbmRET01Ob2RlPV9kZXJlcV8oMTA4KTt2YXIgZ2V0SG9zdENvbXBv bmVudEZyb21Db21wb3NpdGU9X2RlcmVxXygxMTUpO3ZhciByZW5kZXJTdWJ0cmVlSW50b0NvbnRh aW5lcj1fZGVyZXFfKDEyNik7dmFyIHdhcm5pbmc9X2RlcmVxXygxNTcpO1JlYWN0RGVmYXVsdElu amVjdGlvbi5pbmplY3QoKTt2YXIgUmVhY3RET009e2ZpbmRET01Ob2RlOmZpbmRET01Ob2RlLHJl bmRlcjpSZWFjdE1vdW50LnJlbmRlcix1bm1vdW50Q29tcG9uZW50QXROb2RlOlJlYWN0TW91bnQu dW5tb3VudENvbXBvbmVudEF0Tm9kZSx2ZXJzaW9uOlJlYWN0VmVyc2lvbix1bnN0YWJsZV9iYXRj aGVkVXBkYXRlczpSZWFjdFVwZGF0ZXMuYmF0Y2hlZFVwZGF0ZXMsdW5zdGFibGVfcmVuZGVyU3Vi dHJlZUludG9Db250YWluZXI6cmVuZGVyU3VidHJlZUludG9Db250YWluZXJ9O2lmKHR5cGVvZiBf X1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18hPT0idW5kZWZpbmVkIiYmdHlwZW9mIF9fUkVB Q1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5pbmplY3Q9PT0iZnVuY3Rpb24iKXtfX1JFQUNUX0RF VlRPT0xTX0dMT0JBTF9IT09LX18uaW5qZWN0KHtDb21wb25lbnRUcmVlOntnZXRDbG9zZXN0SW5z dGFuY2VGcm9tTm9kZTpSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Q2xvc2VzdEluc3RhbmNlRnJv bU5vZGUsZ2V0Tm9kZUZyb21JbnN0YW5jZTpmdW5jdGlvbihpbnN0KXtpZihpbnN0Ll9yZW5kZXJl ZENvbXBvbmVudCl7aW5zdD1nZXRIb3N0Q29tcG9uZW50RnJvbUNvbXBvc2l0ZShpbnN0KX1pZihp bnN0KXtyZXR1cm4gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoaW5z dCl9ZWxzZXtyZXR1cm4gbnVsbH19fSxNb3VudDpSZWFjdE1vdW50LFJlY29uY2lsZXI6UmVhY3RS ZWNvbmNpbGVyfSl9aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7dmFyIEV4ZWN1dGlv bkVudmlyb25tZW50PV9kZXJlcV8oMTM2KTtpZihFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VE T00mJndpbmRvdy50b3A9PT13aW5kb3cuc2VsZil7aWYodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNf R0xPQkFMX0hPT0tfXz09PSJ1bmRlZmluZWQiKXtpZihuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4 T2YoIkNocm9tZSIpPi0xJiZuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKT09PS0x fHxuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKT4tMSl7dmFyIHNob3dGaWxl VXJsTWVzc2FnZT13aW5kb3cubG9jYXRpb24ucHJvdG9jb2wuaW5kZXhPZigiaHR0cCIpPT09LTEm Jm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpPT09LTE7Y29uc29sZS5kZWJ1 ZygiRG93bmxvYWQgdGhlIFJlYWN0IERldlRvb2xzICIrKHNob3dGaWxlVXJsTWVzc2FnZT8iYW5k IHVzZSBhbiBIVFRQIHNlcnZlciAoaW5zdGVhZCBvZiBhIGZpbGU6IFVSTCkgIjoiIikrImZvciBh IGJldHRlciBkZXZlbG9wbWVudCBleHBlcmllbmNlOiAiKyJodHRwczovL2ZiLm1lL3JlYWN0LWRl dnRvb2xzIil9fXZhciB0ZXN0RnVuYz1mdW5jdGlvbiB0ZXN0Rm4oKXt9OyJkZXZlbG9wbWVudCIh PT0icHJvZHVjdGlvbiI/d2FybmluZygodGVzdEZ1bmMubmFtZXx8dGVzdEZ1bmMudG9TdHJpbmco KSkuaW5kZXhPZigidGVzdEZuIikhPT0tMSwiSXQgbG9va3MgbGlrZSB5b3UncmUgdXNpbmcgYSBt aW5pZmllZCBjb3B5IG9mIHRoZSBkZXZlbG9wbWVudCBidWlsZCAiKyJvZiBSZWFjdC4gV2hlbiBk ZXBsb3lpbmcgUmVhY3QgYXBwcyB0byBwcm9kdWN0aW9uLCBtYWtlIHN1cmUgdG8gdXNlICIrInRo ZSBwcm9kdWN0aW9uIGJ1aWxkIHdoaWNoIHNraXBzIGRldmVsb3BtZW50IHdhcm5pbmdzIGFuZCBp cyBmYXN0ZXIuICIrIlNlZSBodHRwczovL2ZiLm1lL3JlYWN0LW1pbmlmaWNhdGlvbiBmb3IgbW9y ZSBkZXRhaWxzLiIpOnZvaWQgMDt2YXIgaWVDb21wYXRpYmlsaXR5TW9kZT1kb2N1bWVudC5kb2N1 bWVudE1vZGUmJmRvY3VtZW50LmRvY3VtZW50TW9kZTw4OyJkZXZlbG9wbWVudCIhPT0icHJvZHVj dGlvbiI/d2FybmluZyghaWVDb21wYXRpYmlsaXR5TW9kZSwiSW50ZXJuZXQgRXhwbG9yZXIgaXMg cnVubmluZyBpbiBjb21wYXRpYmlsaXR5IG1vZGU7IHBsZWFzZSBhZGQgdGhlICIrImZvbGxvd2lu ZyB0YWcgdG8geW91ciBIVE1MIHRvIHByZXZlbnQgdGhpcyBmcm9tIGhhcHBlbmluZzogIisnPG1l dGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT1lZGdlIiAvPicpOnZv aWQgMDt2YXIgZXhwZWN0ZWRGZWF0dXJlcz1bQXJyYXkuaXNBcnJheSxBcnJheS5wcm90b3R5cGUu ZXZlcnksQXJyYXkucHJvdG90eXBlLmZvckVhY2gsQXJyYXkucHJvdG90eXBlLmluZGV4T2YsQXJy YXkucHJvdG90eXBlLm1hcCxEYXRlLm5vdyxGdW5jdGlvbi5wcm90b3R5cGUuYmluZCxPYmplY3Qu a2V5cyxTdHJpbmcucHJvdG90eXBlLnRyaW1dO2Zvcih2YXIgaT0wO2k8ZXhwZWN0ZWRGZWF0dXJl cy5sZW5ndGg7aSsrKXtpZighZXhwZWN0ZWRGZWF0dXJlc1tpXSl7ImRldmVsb3BtZW50IiE9PSJw cm9kdWN0aW9uIj93YXJuaW5nKGZhbHNlLCJPbmUgb3IgbW9yZSBFUzUgc2hpbXMgZXhwZWN0ZWQg YnkgUmVhY3QgYXJlIG5vdCBhdmFpbGFibGU6ICIrImh0dHBzOi8vZmIubWUvcmVhY3Qtd2Fybmlu Zy1wb2x5ZmlsbHMiKTp2b2lkIDA7YnJlYWt9fX19aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0 aW9uIil7dmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uPV9kZXJlcV8oNjQpO3ZhciBSZWFjdERPTVVu a25vd25Qcm9wZXJ0eUhvb2s9X2RlcmVxXyg0OSk7dmFyIFJlYWN0RE9NTnVsbElucHV0VmFsdWVQ cm9wSG9vaz1fZGVyZXFfKDQxKTt2YXIgUmVhY3RET01JbnZhbGlkQVJJQUhvb2s9X2RlcmVxXyg0 MCk7UmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLmFkZEhvb2soUmVhY3RET01Vbmtub3du UHJvcGVydHlIb29rKTtSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wuYWRkSG9vayhSZWFj dERPTU51bGxJbnB1dFZhbHVlUHJvcEhvb2spO1JlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9v bC5hZGRIb29rKFJlYWN0RE9NSW52YWxpZEFSSUFIb29rKX1tb2R1bGUuZXhwb3J0cz1SZWFjdERP TX0sezEwODoxMDgsMTE1OjExNSwxMjY6MTI2LDEzNjoxMzYsMTU3OjE1NywzNDozNCw0MDo0MCw0 MTo0MSw0OTo0OSw1Mjo1Miw2NDo2NCw2Nzo2Nyw3NTo3NSw4Mjo4Miw4Mzo4M31dLDMyOltmdW5j dGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIF9wcm9kSW52YXJp YW50PV9kZXJlcV8oMTI1KSxfYXNzaWduPV9kZXJlcV8oMTU4KTt2YXIgQXV0b0ZvY3VzVXRpbHM9 X2RlcmVxXygyKTt2YXIgQ1NTUHJvcGVydHlPcGVyYXRpb25zPV9kZXJlcV8oNSk7dmFyIERPTUxh enlUcmVlPV9kZXJlcV8oOSk7dmFyIERPTU5hbWVzcGFjZXM9X2RlcmVxXygxMCk7dmFyIERPTVBy b3BlcnR5PV9kZXJlcV8oMTEpO3ZhciBET01Qcm9wZXJ0eU9wZXJhdGlvbnM9X2RlcmVxXygxMik7 dmFyIEV2ZW50UGx1Z2luSHViPV9kZXJlcV8oMTcpO3ZhciBFdmVudFBsdWdpblJlZ2lzdHJ5PV9k ZXJlcV8oMTgpO3ZhciBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXI9X2RlcmVxXygyNik7dmFyIFJl YWN0RE9NQ29tcG9uZW50RmxhZ3M9X2RlcmVxXygzMyk7dmFyIFJlYWN0RE9NQ29tcG9uZW50VHJl ZT1fZGVyZXFfKDM0KTt2YXIgUmVhY3RET01JbnB1dD1fZGVyZXFfKDM5KTt2YXIgUmVhY3RET01P cHRpb249X2RlcmVxXyg0Mik7dmFyIFJlYWN0RE9NU2VsZWN0PV9kZXJlcV8oNDMpO3ZhciBSZWFj dERPTVRleHRhcmVhPV9kZXJlcV8oNDYpO3ZhciBSZWFjdEluc3RydW1lbnRhdGlvbj1fZGVyZXFf KDY0KTt2YXIgUmVhY3RNdWx0aUNoaWxkPV9kZXJlcV8oNjgpO3ZhciBSZWFjdFNlcnZlclJlbmRl cmluZ1RyYW5zYWN0aW9uPV9kZXJlcV8oNzcpO3ZhciBlbXB0eUZ1bmN0aW9uPV9kZXJlcV8oMTQy KTt2YXIgZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyPV9kZXJlcV8oMTA3KTt2YXIgaW52YXJp YW50PV9kZXJlcV8oMTUwKTt2YXIgaXNFdmVudFN1cHBvcnRlZD1fZGVyZXFfKDEyMik7dmFyIHNo YWxsb3dFcXVhbD1fZGVyZXFfKDE1Nik7dmFyIHZhbGlkYXRlRE9NTmVzdGluZz1fZGVyZXFfKDEz MSk7dmFyIHdhcm5pbmc9X2RlcmVxXygxNTcpO3ZhciBGbGFncz1SZWFjdERPTUNvbXBvbmVudEZs YWdzO3ZhciBkZWxldGVMaXN0ZW5lcj1FdmVudFBsdWdpbkh1Yi5kZWxldGVMaXN0ZW5lcjt2YXIg Z2V0Tm9kZT1SZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZTt2YXIgbGlz dGVuVG89UmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLmxpc3RlblRvO3ZhciByZWdpc3RyYXRpb25O YW1lTW9kdWxlcz1FdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzO3Zh ciBDT05URU5UX1RZUEVTPXtzdHJpbmc6dHJ1ZSxudW1iZXI6dHJ1ZX07dmFyIFNUWUxFPSJzdHls ZSI7dmFyIEhUTUw9Il9faHRtbCI7dmFyIFJFU0VSVkVEX1BST1BTPXtjaGlsZHJlbjpudWxsLGRh bmdlcm91c2x5U2V0SW5uZXJIVE1MOm51bGwsc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5n Om51bGx9O3ZhciBET0NfRlJBR01FTlRfVFlQRT0xMTtmdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVy cm9yQWRkZW5kdW0oaW50ZXJuYWxJbnN0YW5jZSl7aWYoaW50ZXJuYWxJbnN0YW5jZSl7dmFyIG93 bmVyPWludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50Ll9vd25lcnx8bnVsbDtpZihvd25l cil7dmFyIG5hbWU9b3duZXIuZ2V0TmFtZSgpO2lmKG5hbWUpe3JldHVybiIgVGhpcyBET00gbm9k ZSB3YXMgcmVuZGVyZWQgYnkgYCIrbmFtZSsiYC4ifX19cmV0dXJuIiJ9ZnVuY3Rpb24gZnJpZW5k bHlTdHJpbmdpZnkob2JqKXtpZih0eXBlb2Ygb2JqPT09Im9iamVjdCIpe2lmKEFycmF5LmlzQXJy YXkob2JqKSl7cmV0dXJuIlsiK29iai5tYXAoZnJpZW5kbHlTdHJpbmdpZnkpLmpvaW4oIiwgIikr Il0ifWVsc2V7dmFyIHBhaXJzPVtdO2Zvcih2YXIga2V5IGluIG9iail7aWYoT2JqZWN0LnByb3Rv dHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaixrZXkpKXt2YXIga2V5RXNjYXBlZD0vXlthLXok X11bXHckX10qJC9pLnRlc3Qoa2V5KT9rZXk6SlNPTi5zdHJpbmdpZnkoa2V5KTtwYWlycy5wdXNo KGtleUVzY2FwZWQrIjogIitmcmllbmRseVN0cmluZ2lmeShvYmpba2V5XSkpfX1yZXR1cm4ieyIr cGFpcnMuam9pbigiLCAiKSsifSJ9fWVsc2UgaWYodHlwZW9mIG9iaj09PSJzdHJpbmciKXtyZXR1 cm4gSlNPTi5zdHJpbmdpZnkob2JqKX1lbHNlIGlmKHR5cGVvZiBvYmo9PT0iZnVuY3Rpb24iKXty ZXR1cm4iW2Z1bmN0aW9uIG9iamVjdF0ifXJldHVybiBTdHJpbmcob2JqKX12YXIgc3R5bGVNdXRh dGlvbldhcm5pbmc9e307ZnVuY3Rpb24gY2hlY2tBbmRXYXJuRm9yTXV0YXRlZFN0eWxlKHN0eWxl MSxzdHlsZTIsY29tcG9uZW50KXtpZihzdHlsZTE9PW51bGx8fHN0eWxlMj09bnVsbCl7cmV0dXJu fWlmKHNoYWxsb3dFcXVhbChzdHlsZTEsc3R5bGUyKSl7cmV0dXJufXZhciBjb21wb25lbnROYW1l PWNvbXBvbmVudC5fdGFnO3ZhciBvd25lcj1jb21wb25lbnQuX2N1cnJlbnRFbGVtZW50Ll9vd25l cjt2YXIgb3duZXJOYW1lO2lmKG93bmVyKXtvd25lck5hbWU9b3duZXIuZ2V0TmFtZSgpfXZhciBo YXNoPW93bmVyTmFtZSsifCIrY29tcG9uZW50TmFtZTtpZihzdHlsZU11dGF0aW9uV2FybmluZy5o YXNPd25Qcm9wZXJ0eShoYXNoKSl7cmV0dXJufXN0eWxlTXV0YXRpb25XYXJuaW5nW2hhc2hdPXRy dWU7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKGZhbHNlLCJgJXNgIHdhcyBw YXNzZWQgYSBzdHlsZSBvYmplY3QgdGhhdCBoYXMgcHJldmlvdXNseSBiZWVuIG11dGF0ZWQuICIr Ik11dGF0aW5nIGBzdHlsZWAgaXMgZGVwcmVjYXRlZC4gQ29uc2lkZXIgY2xvbmluZyBpdCBiZWZv cmVoYW5kLiBDaGVjayAiKyJ0aGUgYHJlbmRlcmAgJXMuIFByZXZpb3VzIHN0eWxlOiAlcy4gTXV0 YXRlZCBzdHlsZTogJXMuIixjb21wb25lbnROYW1lLG93bmVyPyJvZiBgIitvd25lck5hbWUrImAi OiJ1c2luZyA8Iitjb21wb25lbnROYW1lKyI+IixmcmllbmRseVN0cmluZ2lmeShzdHlsZTEpLGZy aWVuZGx5U3RyaW5naWZ5KHN0eWxlMikpOnZvaWQgMH1mdW5jdGlvbiBhc3NlcnRWYWxpZFByb3Bz KGNvbXBvbmVudCxwcm9wcyl7aWYoIXByb3BzKXtyZXR1cm59aWYodm9pZEVsZW1lbnRUYWdzW2Nv bXBvbmVudC5fdGFnXSl7IShwcm9wcy5jaGlsZHJlbj09bnVsbCYmcHJvcHMuZGFuZ2Vyb3VzbHlT ZXRJbm5lckhUTUw9PW51bGwpPyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/aW52YXJpYW50 KGZhbHNlLCIlcyBpcyBhIHZvaWQgZWxlbWVudCB0YWcgYW5kIG11c3QgbmVpdGhlciBoYXZlIGBj aGlsZHJlbmAgbm9yIHVzZSBgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLiVzIixjb21wb25lbnQu X3RhZyxjb21wb25lbnQuX2N1cnJlbnRFbGVtZW50Ll9vd25lcj8iIENoZWNrIHRoZSByZW5kZXIg bWV0aG9kIG9mICIrY29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC5fb3duZXIuZ2V0TmFtZSgpKyIu IjoiIik6X3Byb2RJbnZhcmlhbnQoIjEzNyIsY29tcG9uZW50Ll90YWcsY29tcG9uZW50Ll9jdXJy ZW50RWxlbWVudC5fb3duZXI/IiBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiAiK2NvbXBvbmVu dC5fY3VycmVudEVsZW1lbnQuX293bmVyLmdldE5hbWUoKSsiLiI6IiIpOnZvaWQgMH1pZihwcm9w cy5kYW5nZXJvdXNseVNldElubmVySFRNTCE9bnVsbCl7IShwcm9wcy5jaGlsZHJlbj09bnVsbCk/ ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsIkNhbiBvbmx5IHNl dCBvbmUgb2YgYGNoaWxkcmVuYCBvciBgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLiIp Ol9wcm9kSW52YXJpYW50KCI2MCIpOnZvaWQgMDshKHR5cGVvZiBwcm9wcy5kYW5nZXJvdXNseVNl dElubmVySFRNTD09PSJvYmplY3QiJiZIVE1MIGluIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJI VE1MKT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiYHByb3Bz LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYCBtdXN0IGJlIGluIHRoZSBmb3JtIGB7X19odG1sOiAu Li59YC4gUGxlYXNlIHZpc2l0IGh0dHBzOi8vZmIubWUvcmVhY3QtaW52YXJpYW50LWRhbmdlcm91 c2x5LXNldC1pbm5lci1odG1sIGZvciBtb3JlIGluZm9ybWF0aW9uLiIpOl9wcm9kSW52YXJpYW50 KCI2MSIpOnZvaWQgMH1pZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXsiZGV2ZWxvcG1l bnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmcocHJvcHMuaW5uZXJIVE1MPT1udWxsLCJEaXJlY3Rs eSBzZXR0aW5nIHByb3BlcnR5IGBpbm5lckhUTUxgIGlzIG5vdCBwZXJtaXR0ZWQuICIrIkZvciBt b3JlIGluZm9ybWF0aW9uLCBsb29rdXAgZG9jdW1lbnRhdGlvbiBvbiBgZGFuZ2Vyb3VzbHlTZXRJ bm5lckhUTUxgLiIpOnZvaWQgMDsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmco cHJvcHMuc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nfHwhcHJvcHMuY29udGVudEVkaXRh YmxlfHxwcm9wcy5jaGlsZHJlbj09bnVsbCwiQSBjb21wb25lbnQgaXMgYGNvbnRlbnRFZGl0YWJs ZWAgYW5kIGNvbnRhaW5zIGBjaGlsZHJlbmAgbWFuYWdlZCBieSAiKyJSZWFjdC4gSXQgaXMgbm93 IHlvdXIgcmVzcG9uc2liaWxpdHkgdG8gZ3VhcmFudGVlIHRoYXQgbm9uZSBvZiAiKyJ0aG9zZSBu b2RlcyBhcmUgdW5leHBlY3RlZGx5IG1vZGlmaWVkIG9yIGR1cGxpY2F0ZWQuIFRoaXMgaXMgIisi cHJvYmFibHkgbm90IGludGVudGlvbmFsLiIpOnZvaWQgMDsiZGV2ZWxvcG1lbnQiIT09InByb2R1 Y3Rpb24iP3dhcm5pbmcocHJvcHMub25Gb2N1c0luPT1udWxsJiZwcm9wcy5vbkZvY3VzT3V0PT1u dWxsLCJSZWFjdCB1c2VzIG9uRm9jdXMgYW5kIG9uQmx1ciBpbnN0ZWFkIG9mIG9uRm9jdXNJbiBh bmQgb25Gb2N1c091dC4gIisiQWxsIFJlYWN0IGV2ZW50cyBhcmUgbm9ybWFsaXplZCB0byBidWJi bGUsIHNvIG9uRm9jdXNJbiBhbmQgb25Gb2N1c091dCAiKyJhcmUgbm90IG5lZWRlZC9zdXBwb3J0 ZWQgYnkgUmVhY3QuIik6dm9pZCAwfSEocHJvcHMuc3R5bGU9PW51bGx8fHR5cGVvZiBwcm9wcy5z dHlsZT09PSJvYmplY3QiKT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChm YWxzZSwiVGhlIGBzdHlsZWAgcHJvcCBleHBlY3RzIGEgbWFwcGluZyBmcm9tIHN0eWxlIHByb3Bl cnRpZXMgdG8gdmFsdWVzLCBub3QgYSBzdHJpbmcuIEZvciBleGFtcGxlLCBzdHlsZT17e21hcmdp blJpZ2h0OiBzcGFjaW5nICsgJ2VtJ319IHdoZW4gdXNpbmcgSlNYLiVzIixnZXREZWNsYXJhdGlv bkVycm9yQWRkZW5kdW0oY29tcG9uZW50KSk6X3Byb2RJbnZhcmlhbnQoIjYyIixnZXREZWNsYXJh dGlvbkVycm9yQWRkZW5kdW0oY29tcG9uZW50KSk6dm9pZCAwfWZ1bmN0aW9uIGVucXVldWVQdXRM aXN0ZW5lcihpbnN0LHJlZ2lzdHJhdGlvbk5hbWUsbGlzdGVuZXIsdHJhbnNhY3Rpb24pe2lmKHRy YW5zYWN0aW9uIGluc3RhbmNlb2YgUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbil7cmV0 dXJufWlmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpeyJkZXZlbG9wbWVudCIhPT0icHJv ZHVjdGlvbiI/d2FybmluZyhyZWdpc3RyYXRpb25OYW1lIT09Im9uU2Nyb2xsInx8aXNFdmVudFN1 cHBvcnRlZCgic2Nyb2xsIix0cnVlKSwiVGhpcyBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCB0aGUg YG9uU2Nyb2xsYCBldmVudCIpOnZvaWQgMH12YXIgY29udGFpbmVySW5mbz1pbnN0Ll9ob3N0Q29u dGFpbmVySW5mbzt2YXIgaXNEb2N1bWVudEZyYWdtZW50PWNvbnRhaW5lckluZm8uX25vZGUmJmNv bnRhaW5lckluZm8uX25vZGUubm9kZVR5cGU9PT1ET0NfRlJBR01FTlRfVFlQRTt2YXIgZG9jPWlz RG9jdW1lbnRGcmFnbWVudD9jb250YWluZXJJbmZvLl9ub2RlOmNvbnRhaW5lckluZm8uX293bmVy RG9jdW1lbnQ7bGlzdGVuVG8ocmVnaXN0cmF0aW9uTmFtZSxkb2MpO3RyYW5zYWN0aW9uLmdldFJl YWN0TW91bnRSZWFkeSgpLmVucXVldWUocHV0TGlzdGVuZXIse2luc3Q6aW5zdCxyZWdpc3RyYXRp b25OYW1lOnJlZ2lzdHJhdGlvbk5hbWUsbGlzdGVuZXI6bGlzdGVuZXJ9KX1mdW5jdGlvbiBwdXRM aXN0ZW5lcigpe3ZhciBsaXN0ZW5lclRvUHV0PXRoaXM7RXZlbnRQbHVnaW5IdWIucHV0TGlzdGVu ZXIobGlzdGVuZXJUb1B1dC5pbnN0LGxpc3RlbmVyVG9QdXQucmVnaXN0cmF0aW9uTmFtZSxsaXN0 ZW5lclRvUHV0Lmxpc3RlbmVyKX1mdW5jdGlvbiBpbnB1dFBvc3RNb3VudCgpe3ZhciBpbnN0PXRo aXM7UmVhY3RET01JbnB1dC5wb3N0TW91bnRXcmFwcGVyKGluc3QpfWZ1bmN0aW9uIHRleHRhcmVh UG9zdE1vdW50KCl7dmFyIGluc3Q9dGhpcztSZWFjdERPTVRleHRhcmVhLnBvc3RNb3VudFdyYXBw ZXIoaW5zdCl9ZnVuY3Rpb24gb3B0aW9uUG9zdE1vdW50KCl7dmFyIGluc3Q9dGhpcztSZWFjdERP TU9wdGlvbi5wb3N0TW91bnRXcmFwcGVyKGluc3QpfXZhciBzZXRBbmRWYWxpZGF0ZUNvbnRlbnRD aGlsZERldj1lbXB0eUZ1bmN0aW9uO2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe3Nl dEFuZFZhbGlkYXRlQ29udGVudENoaWxkRGV2PWZ1bmN0aW9uKGNvbnRlbnQpe3ZhciBoYXNFeGlz dGluZ0NvbnRlbnQ9dGhpcy5fY29udGVudERlYnVnSUQhPW51bGw7dmFyIGRlYnVnSUQ9dGhpcy5f ZGVidWdJRDt2YXIgY29udGVudERlYnVnSUQ9LWRlYnVnSUQ7aWYoY29udGVudD09bnVsbCl7aWYo aGFzRXhpc3RpbmdDb250ZW50KXtSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Vbm1v dW50Q29tcG9uZW50KHRoaXMuX2NvbnRlbnREZWJ1Z0lEKX10aGlzLl9jb250ZW50RGVidWdJRD1u dWxsO3JldHVybn12YWxpZGF0ZURPTU5lc3RpbmcobnVsbCxTdHJpbmcoY29udGVudCksdGhpcyx0 aGlzLl9hbmNlc3RvckluZm8pO3RoaXMuX2NvbnRlbnREZWJ1Z0lEPWNvbnRlbnREZWJ1Z0lEO2lm KGhhc0V4aXN0aW5nQ29udGVudCl7UmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uQmVm b3JlVXBkYXRlQ29tcG9uZW50KGNvbnRlbnREZWJ1Z0lELGNvbnRlbnQpO1JlYWN0SW5zdHJ1bWVu dGF0aW9uLmRlYnVnVG9vbC5vblVwZGF0ZUNvbXBvbmVudChjb250ZW50RGVidWdJRCl9ZWxzZXtS ZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWZvcmVNb3VudENvbXBvbmVudChjb250 ZW50RGVidWdJRCxjb250ZW50LGRlYnVnSUQpO1JlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9v bC5vbk1vdW50Q29tcG9uZW50KGNvbnRlbnREZWJ1Z0lEKTtSZWFjdEluc3RydW1lbnRhdGlvbi5k ZWJ1Z1Rvb2wub25TZXRDaGlsZHJlbihkZWJ1Z0lELFtjb250ZW50RGVidWdJRF0pfX19dmFyIG1l ZGlhRXZlbnRzPXt0b3BBYm9ydDoiYWJvcnQiLHRvcENhblBsYXk6ImNhbnBsYXkiLHRvcENhblBs YXlUaHJvdWdoOiJjYW5wbGF5dGhyb3VnaCIsdG9wRHVyYXRpb25DaGFuZ2U6ImR1cmF0aW9uY2hh bmdlIix0b3BFbXB0aWVkOiJlbXB0aWVkIix0b3BFbmNyeXB0ZWQ6ImVuY3J5cHRlZCIsdG9wRW5k ZWQ6ImVuZGVkIix0b3BFcnJvcjoiZXJyb3IiLHRvcExvYWRlZERhdGE6ImxvYWRlZGRhdGEiLHRv cExvYWRlZE1ldGFkYXRhOiJsb2FkZWRtZXRhZGF0YSIsdG9wTG9hZFN0YXJ0OiJsb2Fkc3RhcnQi LHRvcFBhdXNlOiJwYXVzZSIsdG9wUGxheToicGxheSIsdG9wUGxheWluZzoicGxheWluZyIsdG9w UHJvZ3Jlc3M6InByb2dyZXNzIix0b3BSYXRlQ2hhbmdlOiJyYXRlY2hhbmdlIix0b3BTZWVrZWQ6 InNlZWtlZCIsdG9wU2Vla2luZzoic2Vla2luZyIsdG9wU3RhbGxlZDoic3RhbGxlZCIsdG9wU3Vz cGVuZDoic3VzcGVuZCIsdG9wVGltZVVwZGF0ZToidGltZXVwZGF0ZSIsdG9wVm9sdW1lQ2hhbmdl OiJ2b2x1bWVjaGFuZ2UiLHRvcFdhaXRpbmc6IndhaXRpbmcifTtmdW5jdGlvbiB0cmFwQnViYmxl ZEV2ZW50c0xvY2FsKCl7dmFyIGluc3Q9dGhpczshaW5zdC5fcm9vdE5vZGVJRD8iZGV2ZWxvcG1l bnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiTXVzdCBiZSBtb3VudGVkIHRvIHRy YXAgZXZlbnRzIik6X3Byb2RJbnZhcmlhbnQoIjYzIik6dm9pZCAwO3ZhciBub2RlPWdldE5vZGUo aW5zdCk7IW5vZGU/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2Us InRyYXBCdWJibGVkRXZlbnQoLi4uKTogUmVxdWlyZXMgbm9kZSB0byBiZSByZW5kZXJlZC4iKTpf cHJvZEludmFyaWFudCgiNjQiKTp2b2lkIDA7c3dpdGNoKGluc3QuX3RhZyl7Y2FzZSJpZnJhbWUi OmNhc2Uib2JqZWN0IjppbnN0Ll93cmFwcGVyU3RhdGUubGlzdGVuZXJzPVtSZWFjdEJyb3dzZXJF dmVudEVtaXR0ZXIudHJhcEJ1YmJsZWRFdmVudCgidG9wTG9hZCIsImxvYWQiLG5vZGUpXTticmVh aztjYXNlInZpZGVvIjpjYXNlImF1ZGlvIjppbnN0Ll93cmFwcGVyU3RhdGUubGlzdGVuZXJzPVtd O2Zvcih2YXIgZXZlbnQgaW4gbWVkaWFFdmVudHMpe2lmKG1lZGlhRXZlbnRzLmhhc093blByb3Bl cnR5KGV2ZW50KSl7aW5zdC5fd3JhcHBlclN0YXRlLmxpc3RlbmVycy5wdXNoKFJlYWN0QnJvd3Nl ckV2ZW50RW1pdHRlci50cmFwQnViYmxlZEV2ZW50KGV2ZW50LG1lZGlhRXZlbnRzW2V2ZW50XSxu b2RlKSl9fWJyZWFrO2Nhc2Uic291cmNlIjppbnN0Ll93cmFwcGVyU3RhdGUubGlzdGVuZXJzPVtS ZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIudHJhcEJ1YmJsZWRFdmVudCgidG9wRXJyb3IiLCJlcnJv ciIsbm9kZSldO2JyZWFrO2Nhc2UiaW1nIjppbnN0Ll93cmFwcGVyU3RhdGUubGlzdGVuZXJzPVtS ZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIudHJhcEJ1YmJsZWRFdmVudCgidG9wRXJyb3IiLCJlcnJv ciIsbm9kZSksUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLnRyYXBCdWJibGVkRXZlbnQoInRvcExv YWQiLCJsb2FkIixub2RlKV07YnJlYWs7Y2FzZSJmb3JtIjppbnN0Ll93cmFwcGVyU3RhdGUubGlz dGVuZXJzPVtSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIudHJhcEJ1YmJsZWRFdmVudCgidG9wUmVz ZXQiLCJyZXNldCIsbm9kZSksUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLnRyYXBCdWJibGVkRXZl bnQoInRvcFN1Ym1pdCIsInN1Ym1pdCIsbm9kZSldO2JyZWFrO2Nhc2UiaW5wdXQiOmNhc2Uic2Vs ZWN0IjpjYXNlInRleHRhcmVhIjppbnN0Ll93cmFwcGVyU3RhdGUubGlzdGVuZXJzPVtSZWFjdEJy b3dzZXJFdmVudEVtaXR0ZXIudHJhcEJ1YmJsZWRFdmVudCgidG9wSW52YWxpZCIsImludmFsaWQi LG5vZGUpXTticmVha319ZnVuY3Rpb24gcG9zdFVwZGF0ZVNlbGVjdFdyYXBwZXIoKXtSZWFjdERP TVNlbGVjdC5wb3N0VXBkYXRlV3JhcHBlcih0aGlzKX12YXIgb21pdHRlZENsb3NlVGFncz17YXJl YTp0cnVlLGJhc2U6dHJ1ZSxicjp0cnVlLGNvbDp0cnVlLGVtYmVkOnRydWUsaHI6dHJ1ZSxpbWc6 dHJ1ZSxpbnB1dDp0cnVlLGtleWdlbjp0cnVlLGxpbms6dHJ1ZSxtZXRhOnRydWUscGFyYW06dHJ1 ZSxzb3VyY2U6dHJ1ZSx0cmFjazp0cnVlLHdicjp0cnVlfTt2YXIgbmV3bGluZUVhdGluZ1RhZ3M9 e2xpc3Rpbmc6dHJ1ZSxwcmU6dHJ1ZSx0ZXh0YXJlYTp0cnVlfTt2YXIgdm9pZEVsZW1lbnRUYWdz PV9hc3NpZ24oe21lbnVpdGVtOnRydWV9LG9taXR0ZWRDbG9zZVRhZ3MpO3ZhciBWQUxJRF9UQUdf UkVHRVg9L15bYS16QS1aXVthLXpBLVo6X1wuXC1cZF0qJC87dmFyIHZhbGlkYXRlZFRhZ0NhY2hl PXt9O3ZhciBoYXNPd25Qcm9wZXJ0eT17fS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiB2YWxpZGF0 ZURhbmdlcm91c1RhZyh0YWcpe2lmKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbGlkYXRlZFRhZ0Nh Y2hlLHRhZykpeyFWQUxJRF9UQUdfUkVHRVgudGVzdCh0YWcpPyJkZXZlbG9wbWVudCIhPT0icHJv ZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJJbnZhbGlkIHRhZzogJXMiLHRhZyk6X3Byb2RJbnZh cmlhbnQoIjY1Iix0YWcpOnZvaWQgMDt2YWxpZGF0ZWRUYWdDYWNoZVt0YWddPXRydWV9fWZ1bmN0 aW9uIGlzQ3VzdG9tQ29tcG9uZW50KHRhZ05hbWUscHJvcHMpe3JldHVybiB0YWdOYW1lLmluZGV4 T2YoIi0iKT49MHx8cHJvcHMuaXMhPW51bGx9dmFyIGdsb2JhbElkQ291bnRlcj0xO2Z1bmN0aW9u IFJlYWN0RE9NQ29tcG9uZW50KGVsZW1lbnQpe3ZhciB0YWc9ZWxlbWVudC50eXBlO3ZhbGlkYXRl RGFuZ2Vyb3VzVGFnKHRhZyk7dGhpcy5fY3VycmVudEVsZW1lbnQ9ZWxlbWVudDt0aGlzLl90YWc9 dGFnLnRvTG93ZXJDYXNlKCk7dGhpcy5fbmFtZXNwYWNlVVJJPW51bGw7dGhpcy5fcmVuZGVyZWRD aGlsZHJlbj1udWxsO3RoaXMuX3ByZXZpb3VzU3R5bGU9bnVsbDt0aGlzLl9wcmV2aW91c1N0eWxl Q29weT1udWxsO3RoaXMuX2hvc3ROb2RlPW51bGw7dGhpcy5faG9zdFBhcmVudD1udWxsO3RoaXMu X3Jvb3ROb2RlSUQ9MDt0aGlzLl9kb21JRD0wO3RoaXMuX2hvc3RDb250YWluZXJJbmZvPW51bGw7 dGhpcy5fd3JhcHBlclN0YXRlPW51bGw7dGhpcy5fdG9wTGV2ZWxXcmFwcGVyPW51bGw7dGhpcy5f ZmxhZ3M9MDtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXt0aGlzLl9hbmNlc3Rvcklu Zm89bnVsbDtzZXRBbmRWYWxpZGF0ZUNvbnRlbnRDaGlsZERldi5jYWxsKHRoaXMsbnVsbCl9fVJl YWN0RE9NQ29tcG9uZW50LmRpc3BsYXlOYW1lPSJSZWFjdERPTUNvbXBvbmVudCI7UmVhY3RET01D b21wb25lbnQuTWl4aW49e21vdW50Q29tcG9uZW50OmZ1bmN0aW9uKHRyYW5zYWN0aW9uLGhvc3RQ YXJlbnQsaG9zdENvbnRhaW5lckluZm8sY29udGV4dCl7dGhpcy5fcm9vdE5vZGVJRD1nbG9iYWxJ ZENvdW50ZXIrKzt0aGlzLl9kb21JRD1ob3N0Q29udGFpbmVySW5mby5faWRDb3VudGVyKys7dGhp cy5faG9zdFBhcmVudD1ob3N0UGFyZW50O3RoaXMuX2hvc3RDb250YWluZXJJbmZvPWhvc3RDb250 YWluZXJJbmZvO3ZhciBwcm9wcz10aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcztzd2l0Y2godGhp cy5fdGFnKXtjYXNlImF1ZGlvIjpjYXNlImZvcm0iOmNhc2UiaWZyYW1lIjpjYXNlImltZyI6Y2Fz ZSJsaW5rIjpjYXNlIm9iamVjdCI6Y2FzZSJzb3VyY2UiOmNhc2UidmlkZW8iOnRoaXMuX3dyYXBw ZXJTdGF0ZT17bGlzdGVuZXJzOm51bGx9O3RyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgp LmVucXVldWUodHJhcEJ1YmJsZWRFdmVudHNMb2NhbCx0aGlzKTticmVhaztjYXNlImlucHV0IjpS ZWFjdERPTUlucHV0Lm1vdW50V3JhcHBlcih0aGlzLHByb3BzLGhvc3RQYXJlbnQpO3Byb3BzPVJl YWN0RE9NSW5wdXQuZ2V0SG9zdFByb3BzKHRoaXMscHJvcHMpO3RyYW5zYWN0aW9uLmdldFJlYWN0 TW91bnRSZWFkeSgpLmVucXVldWUodHJhcEJ1YmJsZWRFdmVudHNMb2NhbCx0aGlzKTticmVhaztj YXNlIm9wdGlvbiI6UmVhY3RET01PcHRpb24ubW91bnRXcmFwcGVyKHRoaXMscHJvcHMsaG9zdFBh cmVudCk7cHJvcHM9UmVhY3RET01PcHRpb24uZ2V0SG9zdFByb3BzKHRoaXMscHJvcHMpO2JyZWFr O2Nhc2Uic2VsZWN0IjpSZWFjdERPTVNlbGVjdC5tb3VudFdyYXBwZXIodGhpcyxwcm9wcyxob3N0 UGFyZW50KTtwcm9wcz1SZWFjdERPTVNlbGVjdC5nZXRIb3N0UHJvcHModGhpcyxwcm9wcyk7dHJh bnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZSh0cmFwQnViYmxlZEV2ZW50c0xv Y2FsLHRoaXMpO2JyZWFrO2Nhc2UidGV4dGFyZWEiOlJlYWN0RE9NVGV4dGFyZWEubW91bnRXcmFw cGVyKHRoaXMscHJvcHMsaG9zdFBhcmVudCk7cHJvcHM9UmVhY3RET01UZXh0YXJlYS5nZXRIb3N0 UHJvcHModGhpcyxwcm9wcyk7dHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1 ZSh0cmFwQnViYmxlZEV2ZW50c0xvY2FsLHRoaXMpO2JyZWFrfWFzc2VydFZhbGlkUHJvcHModGhp cyxwcm9wcyk7dmFyIG5hbWVzcGFjZVVSSTt2YXIgcGFyZW50VGFnO2lmKGhvc3RQYXJlbnQhPW51 bGwpe25hbWVzcGFjZVVSST1ob3N0UGFyZW50Ll9uYW1lc3BhY2VVUkk7cGFyZW50VGFnPWhvc3RQ YXJlbnQuX3RhZ31lbHNlIGlmKGhvc3RDb250YWluZXJJbmZvLl90YWcpe25hbWVzcGFjZVVSST1o b3N0Q29udGFpbmVySW5mby5fbmFtZXNwYWNlVVJJO3BhcmVudFRhZz1ob3N0Q29udGFpbmVySW5m by5fdGFnfWlmKG5hbWVzcGFjZVVSST09bnVsbHx8bmFtZXNwYWNlVVJJPT09RE9NTmFtZXNwYWNl cy5zdmcmJnBhcmVudFRhZz09PSJmb3JlaWdub2JqZWN0Iil7bmFtZXNwYWNlVVJJPURPTU5hbWVz cGFjZXMuaHRtbH1pZihuYW1lc3BhY2VVUkk9PT1ET01OYW1lc3BhY2VzLmh0bWwpe2lmKHRoaXMu X3RhZz09PSJzdmciKXtuYW1lc3BhY2VVUkk9RE9NTmFtZXNwYWNlcy5zdmd9ZWxzZSBpZih0aGlz Ll90YWc9PT0ibWF0aCIpe25hbWVzcGFjZVVSST1ET01OYW1lc3BhY2VzLm1hdGhtbH19dGhpcy5f bmFtZXNwYWNlVVJJPW5hbWVzcGFjZVVSSTtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24i KXt2YXIgcGFyZW50SW5mbztpZihob3N0UGFyZW50IT1udWxsKXtwYXJlbnRJbmZvPWhvc3RQYXJl bnQuX2FuY2VzdG9ySW5mb31lbHNlIGlmKGhvc3RDb250YWluZXJJbmZvLl90YWcpe3BhcmVudElu Zm89aG9zdENvbnRhaW5lckluZm8uX2FuY2VzdG9ySW5mb31pZihwYXJlbnRJbmZvKXt2YWxpZGF0 ZURPTU5lc3RpbmcodGhpcy5fdGFnLG51bGwsdGhpcyxwYXJlbnRJbmZvKX10aGlzLl9hbmNlc3Rv ckluZm89dmFsaWRhdGVET01OZXN0aW5nLnVwZGF0ZWRBbmNlc3RvckluZm8ocGFyZW50SW5mbyx0 aGlzLl90YWcsdGhpcyl9dmFyIG1vdW50SW1hZ2U7aWYodHJhbnNhY3Rpb24udXNlQ3JlYXRlRWxl bWVudCl7dmFyIG93bmVyRG9jdW1lbnQ9aG9zdENvbnRhaW5lckluZm8uX293bmVyRG9jdW1lbnQ7 dmFyIGVsO2lmKG5hbWVzcGFjZVVSST09PURPTU5hbWVzcGFjZXMuaHRtbCl7aWYodGhpcy5fdGFn PT09InNjcmlwdCIpe3ZhciBkaXY9b3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt2 YXIgdHlwZT10aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO2Rpdi5pbm5lckhUTUw9IjwiK3R5cGUr Ij48LyIrdHlwZSsiPiI7ZWw9ZGl2LnJlbW92ZUNoaWxkKGRpdi5maXJzdENoaWxkKX1lbHNlIGlm KHByb3BzLmlzKXtlbD1vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5fY3VycmVudEVs ZW1lbnQudHlwZSxwcm9wcy5pcyl9ZWxzZXtlbD1vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQo dGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSl9fWVsc2V7ZWw9b3duZXJEb2N1bWVudC5jcmVhdGVF bGVtZW50TlMobmFtZXNwYWNlVVJJLHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGUpfVJlYWN0RE9N Q29tcG9uZW50VHJlZS5wcmVjYWNoZU5vZGUodGhpcyxlbCk7dGhpcy5fZmxhZ3N8PUZsYWdzLmhh c0NhY2hlZENoaWxkTm9kZXM7aWYoIXRoaXMuX2hvc3RQYXJlbnQpe0RPTVByb3BlcnR5T3BlcmF0 aW9ucy5zZXRBdHRyaWJ1dGVGb3JSb290KGVsKX10aGlzLl91cGRhdGVET01Qcm9wZXJ0aWVzKG51 bGwscHJvcHMsdHJhbnNhY3Rpb24pO3ZhciBsYXp5VHJlZT1ET01MYXp5VHJlZShlbCk7dGhpcy5f Y3JlYXRlSW5pdGlhbENoaWxkcmVuKHRyYW5zYWN0aW9uLHByb3BzLGNvbnRleHQsbGF6eVRyZWUp O21vdW50SW1hZ2U9bGF6eVRyZWV9ZWxzZXt2YXIgdGFnT3Blbj10aGlzLl9jcmVhdGVPcGVuVGFn TWFya3VwQW5kUHV0TGlzdGVuZXJzKHRyYW5zYWN0aW9uLHByb3BzKTt2YXIgdGFnQ29udGVudD10 aGlzLl9jcmVhdGVDb250ZW50TWFya3VwKHRyYW5zYWN0aW9uLHByb3BzLGNvbnRleHQpO2lmKCF0 YWdDb250ZW50JiZvbWl0dGVkQ2xvc2VUYWdzW3RoaXMuX3RhZ10pe21vdW50SW1hZ2U9dGFnT3Bl bisiLz4ifWVsc2V7bW91bnRJbWFnZT10YWdPcGVuKyI+Iit0YWdDb250ZW50KyI8LyIrdGhpcy5f Y3VycmVudEVsZW1lbnQudHlwZSsiPiJ9fXN3aXRjaCh0aGlzLl90YWcpe2Nhc2UiaW5wdXQiOnRy YW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoaW5wdXRQb3N0TW91bnQsdGhp cyk7aWYocHJvcHMuYXV0b0ZvY3VzKXt0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5l bnF1ZXVlKEF1dG9Gb2N1c1V0aWxzLmZvY3VzRE9NQ29tcG9uZW50LHRoaXMpfWJyZWFrO2Nhc2Ui dGV4dGFyZWEiOnRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUodGV4dGFy ZWFQb3N0TW91bnQsdGhpcyk7aWYocHJvcHMuYXV0b0ZvY3VzKXt0cmFuc2FjdGlvbi5nZXRSZWFj dE1vdW50UmVhZHkoKS5lbnF1ZXVlKEF1dG9Gb2N1c1V0aWxzLmZvY3VzRE9NQ29tcG9uZW50LHRo aXMpfWJyZWFrO2Nhc2Uic2VsZWN0IjppZihwcm9wcy5hdXRvRm9jdXMpe3RyYW5zYWN0aW9uLmdl dFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoQXV0b0ZvY3VzVXRpbHMuZm9jdXNET01Db21wb25l bnQsdGhpcyl9YnJlYWs7Y2FzZSJidXR0b24iOmlmKHByb3BzLmF1dG9Gb2N1cyl7dHJhbnNhY3Rp b24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShBdXRvRm9jdXNVdGlscy5mb2N1c0RPTUNv bXBvbmVudCx0aGlzKX1icmVhaztjYXNlIm9wdGlvbiI6dHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3Vu dFJlYWR5KCkuZW5xdWV1ZShvcHRpb25Qb3N0TW91bnQsdGhpcyk7YnJlYWt9cmV0dXJuIG1vdW50 SW1hZ2V9LF9jcmVhdGVPcGVuVGFnTWFya3VwQW5kUHV0TGlzdGVuZXJzOmZ1bmN0aW9uKHRyYW5z YWN0aW9uLHByb3BzKXt2YXIgcmV0PSI8Iit0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO2Zvcih2 YXIgcHJvcEtleSBpbiBwcm9wcyl7aWYoIXByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpKXtj b250aW51ZX12YXIgcHJvcFZhbHVlPXByb3BzW3Byb3BLZXldO2lmKHByb3BWYWx1ZT09bnVsbCl7 Y29udGludWV9aWYocmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMuaGFzT3duUHJvcGVydHkocHJvcEtl eSkpe2lmKHByb3BWYWx1ZSl7ZW5xdWV1ZVB1dExpc3RlbmVyKHRoaXMscHJvcEtleSxwcm9wVmFs dWUsdHJhbnNhY3Rpb24pfX1lbHNle2lmKHByb3BLZXk9PT1TVFlMRSl7aWYocHJvcFZhbHVlKXtp ZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXt0aGlzLl9wcmV2aW91c1N0eWxlPXByb3BW YWx1ZX1wcm9wVmFsdWU9dGhpcy5fcHJldmlvdXNTdHlsZUNvcHk9X2Fzc2lnbih7fSxwcm9wcy5z dHlsZSl9cHJvcFZhbHVlPUNTU1Byb3BlcnR5T3BlcmF0aW9ucy5jcmVhdGVNYXJrdXBGb3JTdHls ZXMocHJvcFZhbHVlLHRoaXMpfXZhciBtYXJrdXA9bnVsbDtpZih0aGlzLl90YWchPW51bGwmJmlz Q3VzdG9tQ29tcG9uZW50KHRoaXMuX3RhZyxwcm9wcykpe2lmKCFSRVNFUlZFRF9QUk9QUy5oYXNP d25Qcm9wZXJ0eShwcm9wS2V5KSl7bWFya3VwPURPTVByb3BlcnR5T3BlcmF0aW9ucy5jcmVhdGVN YXJrdXBGb3JDdXN0b21BdHRyaWJ1dGUocHJvcEtleSxwcm9wVmFsdWUpfX1lbHNle21hcmt1cD1E T01Qcm9wZXJ0eU9wZXJhdGlvbnMuY3JlYXRlTWFya3VwRm9yUHJvcGVydHkocHJvcEtleSxwcm9w VmFsdWUpfWlmKG1hcmt1cCl7cmV0Kz0iICIrbWFya3VwfX19aWYodHJhbnNhY3Rpb24ucmVuZGVy VG9TdGF0aWNNYXJrdXApe3JldHVybiByZXR9aWYoIXRoaXMuX2hvc3RQYXJlbnQpe3JldCs9IiAi K0RPTVByb3BlcnR5T3BlcmF0aW9ucy5jcmVhdGVNYXJrdXBGb3JSb290KCl9cmV0Kz0iICIrRE9N UHJvcGVydHlPcGVyYXRpb25zLmNyZWF0ZU1hcmt1cEZvcklEKHRoaXMuX2RvbUlEKTtyZXR1cm4g cmV0fSxfY3JlYXRlQ29udGVudE1hcmt1cDpmdW5jdGlvbih0cmFuc2FjdGlvbixwcm9wcyxjb250 ZXh0KXt2YXIgcmV0PSIiO3ZhciBpbm5lckhUTUw9cHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhU TUw7aWYoaW5uZXJIVE1MIT1udWxsKXtpZihpbm5lckhUTUwuX19odG1sIT1udWxsKXtyZXQ9aW5u ZXJIVE1MLl9faHRtbH19ZWxzZXt2YXIgY29udGVudFRvVXNlPUNPTlRFTlRfVFlQRVNbdHlwZW9m IHByb3BzLmNoaWxkcmVuXT9wcm9wcy5jaGlsZHJlbjpudWxsO3ZhciBjaGlsZHJlblRvVXNlPWNv bnRlbnRUb1VzZSE9bnVsbD9udWxsOnByb3BzLmNoaWxkcmVuO2lmKGNvbnRlbnRUb1VzZSE9bnVs bCl7cmV0PWVzY2FwZVRleHRDb250ZW50Rm9yQnJvd3Nlcihjb250ZW50VG9Vc2UpO2lmKCJkZXZl bG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe3NldEFuZFZhbGlkYXRlQ29udGVudENoaWxkRGV2LmNh bGwodGhpcyxjb250ZW50VG9Vc2UpfX1lbHNlIGlmKGNoaWxkcmVuVG9Vc2UhPW51bGwpe3ZhciBt b3VudEltYWdlcz10aGlzLm1vdW50Q2hpbGRyZW4oY2hpbGRyZW5Ub1VzZSx0cmFuc2FjdGlvbixj b250ZXh0KTtyZXQ9bW91bnRJbWFnZXMuam9pbigiIil9fWlmKG5ld2xpbmVFYXRpbmdUYWdzW3Ro aXMuX3RhZ10mJnJldC5jaGFyQXQoMCk9PT0iXG4iKXtyZXR1cm4iXG4iK3JldH1lbHNle3JldHVy biByZXR9fSxfY3JlYXRlSW5pdGlhbENoaWxkcmVuOmZ1bmN0aW9uKHRyYW5zYWN0aW9uLHByb3Bz LGNvbnRleHQsbGF6eVRyZWUpe3ZhciBpbm5lckhUTUw9cHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5l ckhUTUw7aWYoaW5uZXJIVE1MIT1udWxsKXtpZihpbm5lckhUTUwuX19odG1sIT1udWxsKXtET01M YXp5VHJlZS5xdWV1ZUhUTUwobGF6eVRyZWUsaW5uZXJIVE1MLl9faHRtbCl9fWVsc2V7dmFyIGNv bnRlbnRUb1VzZT1DT05URU5UX1RZUEVTW3R5cGVvZiBwcm9wcy5jaGlsZHJlbl0/cHJvcHMuY2hp bGRyZW46bnVsbDt2YXIgY2hpbGRyZW5Ub1VzZT1jb250ZW50VG9Vc2UhPW51bGw/bnVsbDpwcm9w cy5jaGlsZHJlbjtpZihjb250ZW50VG9Vc2UhPW51bGwpe2lmKGNvbnRlbnRUb1VzZSE9PSIiKXtp ZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtzZXRBbmRWYWxpZGF0ZUNvbnRlbnRDaGls ZERldi5jYWxsKHRoaXMsY29udGVudFRvVXNlKX1ET01MYXp5VHJlZS5xdWV1ZVRleHQobGF6eVRy ZWUsY29udGVudFRvVXNlKX19ZWxzZSBpZihjaGlsZHJlblRvVXNlIT1udWxsKXt2YXIgbW91bnRJ bWFnZXM9dGhpcy5tb3VudENoaWxkcmVuKGNoaWxkcmVuVG9Vc2UsdHJhbnNhY3Rpb24sY29udGV4 dCk7Zm9yKHZhciBpPTA7aTxtb3VudEltYWdlcy5sZW5ndGg7aSsrKXtET01MYXp5VHJlZS5xdWV1 ZUNoaWxkKGxhenlUcmVlLG1vdW50SW1hZ2VzW2ldKX19fX0scmVjZWl2ZUNvbXBvbmVudDpmdW5j dGlvbihuZXh0RWxlbWVudCx0cmFuc2FjdGlvbixjb250ZXh0KXt2YXIgcHJldkVsZW1lbnQ9dGhp cy5fY3VycmVudEVsZW1lbnQ7dGhpcy5fY3VycmVudEVsZW1lbnQ9bmV4dEVsZW1lbnQ7dGhpcy51 cGRhdGVDb21wb25lbnQodHJhbnNhY3Rpb24scHJldkVsZW1lbnQsbmV4dEVsZW1lbnQsY29udGV4 dCl9LHVwZGF0ZUNvbXBvbmVudDpmdW5jdGlvbih0cmFuc2FjdGlvbixwcmV2RWxlbWVudCxuZXh0 RWxlbWVudCxjb250ZXh0KXt2YXIgbGFzdFByb3BzPXByZXZFbGVtZW50LnByb3BzO3ZhciBuZXh0 UHJvcHM9dGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHM7c3dpdGNoKHRoaXMuX3RhZyl7Y2FzZSJp bnB1dCI6bGFzdFByb3BzPVJlYWN0RE9NSW5wdXQuZ2V0SG9zdFByb3BzKHRoaXMsbGFzdFByb3Bz KTtuZXh0UHJvcHM9UmVhY3RET01JbnB1dC5nZXRIb3N0UHJvcHModGhpcyxuZXh0UHJvcHMpO2Jy ZWFrO2Nhc2Uib3B0aW9uIjpsYXN0UHJvcHM9UmVhY3RET01PcHRpb24uZ2V0SG9zdFByb3BzKHRo aXMsbGFzdFByb3BzKTtuZXh0UHJvcHM9UmVhY3RET01PcHRpb24uZ2V0SG9zdFByb3BzKHRoaXMs bmV4dFByb3BzKTticmVhaztjYXNlInNlbGVjdCI6bGFzdFByb3BzPVJlYWN0RE9NU2VsZWN0Lmdl dEhvc3RQcm9wcyh0aGlzLGxhc3RQcm9wcyk7bmV4dFByb3BzPVJlYWN0RE9NU2VsZWN0LmdldEhv c3RQcm9wcyh0aGlzLG5leHRQcm9wcyk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6bGFzdFByb3BzPVJl YWN0RE9NVGV4dGFyZWEuZ2V0SG9zdFByb3BzKHRoaXMsbGFzdFByb3BzKTtuZXh0UHJvcHM9UmVh Y3RET01UZXh0YXJlYS5nZXRIb3N0UHJvcHModGhpcyxuZXh0UHJvcHMpO2JyZWFrfWFzc2VydFZh bGlkUHJvcHModGhpcyxuZXh0UHJvcHMpO3RoaXMuX3VwZGF0ZURPTVByb3BlcnRpZXMobGFzdFBy b3BzLG5leHRQcm9wcyx0cmFuc2FjdGlvbik7dGhpcy5fdXBkYXRlRE9NQ2hpbGRyZW4obGFzdFBy b3BzLG5leHRQcm9wcyx0cmFuc2FjdGlvbixjb250ZXh0KTtzd2l0Y2godGhpcy5fdGFnKXtjYXNl ImlucHV0IjpSZWFjdERPTUlucHV0LnVwZGF0ZVdyYXBwZXIodGhpcyk7YnJlYWs7Y2FzZSJ0ZXh0 YXJlYSI6UmVhY3RET01UZXh0YXJlYS51cGRhdGVXcmFwcGVyKHRoaXMpO2JyZWFrO2Nhc2Uic2Vs ZWN0Ijp0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHBvc3RVcGRhdGVT ZWxlY3RXcmFwcGVyLHRoaXMpO2JyZWFrfX0sX3VwZGF0ZURPTVByb3BlcnRpZXM6ZnVuY3Rpb24o bGFzdFByb3BzLG5leHRQcm9wcyx0cmFuc2FjdGlvbil7dmFyIHByb3BLZXk7dmFyIHN0eWxlTmFt ZTt2YXIgc3R5bGVVcGRhdGVzO2Zvcihwcm9wS2V5IGluIGxhc3RQcm9wcyl7aWYobmV4dFByb3Bz Lmhhc093blByb3BlcnR5KHByb3BLZXkpfHwhbGFzdFByb3BzLmhhc093blByb3BlcnR5KHByb3BL ZXkpfHxsYXN0UHJvcHNbcHJvcEtleV09PW51bGwpe2NvbnRpbnVlfWlmKHByb3BLZXk9PT1TVFlM RSl7dmFyIGxhc3RTdHlsZT10aGlzLl9wcmV2aW91c1N0eWxlQ29weTtmb3Ioc3R5bGVOYW1lIGlu IGxhc3RTdHlsZSl7aWYobGFzdFN0eWxlLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpe3N0eWxl VXBkYXRlcz1zdHlsZVVwZGF0ZXN8fHt9O3N0eWxlVXBkYXRlc1tzdHlsZU5hbWVdPSIifX10aGlz Ll9wcmV2aW91c1N0eWxlQ29weT1udWxsfWVsc2UgaWYocmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMu aGFzT3duUHJvcGVydHkocHJvcEtleSkpe2lmKGxhc3RQcm9wc1twcm9wS2V5XSl7ZGVsZXRlTGlz dGVuZXIodGhpcyxwcm9wS2V5KX19ZWxzZSBpZihpc0N1c3RvbUNvbXBvbmVudCh0aGlzLl90YWcs bGFzdFByb3BzKSl7aWYoIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BLZXkpKXtE T01Qcm9wZXJ0eU9wZXJhdGlvbnMuZGVsZXRlVmFsdWVGb3JBdHRyaWJ1dGUoZ2V0Tm9kZSh0aGlz KSxwcm9wS2V5KX19ZWxzZSBpZihET01Qcm9wZXJ0eS5wcm9wZXJ0aWVzW3Byb3BLZXldfHxET01Q cm9wZXJ0eS5pc0N1c3RvbUF0dHJpYnV0ZShwcm9wS2V5KSl7RE9NUHJvcGVydHlPcGVyYXRpb25z LmRlbGV0ZVZhbHVlRm9yUHJvcGVydHkoZ2V0Tm9kZSh0aGlzKSxwcm9wS2V5KX19Zm9yKHByb3BL ZXkgaW4gbmV4dFByb3BzKXt2YXIgbmV4dFByb3A9bmV4dFByb3BzW3Byb3BLZXldO3ZhciBsYXN0 UHJvcD1wcm9wS2V5PT09U1RZTEU/dGhpcy5fcHJldmlvdXNTdHlsZUNvcHk6bGFzdFByb3BzIT1u dWxsP2xhc3RQcm9wc1twcm9wS2V5XTp1bmRlZmluZWQ7aWYoIW5leHRQcm9wcy5oYXNPd25Qcm9w ZXJ0eShwcm9wS2V5KXx8bmV4dFByb3A9PT1sYXN0UHJvcHx8bmV4dFByb3A9PW51bGwmJmxhc3RQ cm9wPT1udWxsKXtjb250aW51ZX1pZihwcm9wS2V5PT09U1RZTEUpe2lmKG5leHRQcm9wKXtpZigi ZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtjaGVja0FuZFdhcm5Gb3JNdXRhdGVkU3R5bGUo dGhpcy5fcHJldmlvdXNTdHlsZUNvcHksdGhpcy5fcHJldmlvdXNTdHlsZSx0aGlzKTt0aGlzLl9w cmV2aW91c1N0eWxlPW5leHRQcm9wfW5leHRQcm9wPXRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5PV9h c3NpZ24oe30sbmV4dFByb3ApfWVsc2V7dGhpcy5fcHJldmlvdXNTdHlsZUNvcHk9bnVsbH1pZihs YXN0UHJvcCl7Zm9yKHN0eWxlTmFtZSBpbiBsYXN0UHJvcCl7aWYobGFzdFByb3AuaGFzT3duUHJv cGVydHkoc3R5bGVOYW1lKSYmKCFuZXh0UHJvcHx8IW5leHRQcm9wLmhhc093blByb3BlcnR5KHN0 eWxlTmFtZSkpKXtzdHlsZVVwZGF0ZXM9c3R5bGVVcGRhdGVzfHx7fTtzdHlsZVVwZGF0ZXNbc3R5 bGVOYW1lXT0iIn19Zm9yKHN0eWxlTmFtZSBpbiBuZXh0UHJvcCl7aWYobmV4dFByb3AuaGFzT3du UHJvcGVydHkoc3R5bGVOYW1lKSYmbGFzdFByb3Bbc3R5bGVOYW1lXSE9PW5leHRQcm9wW3N0eWxl TmFtZV0pe3N0eWxlVXBkYXRlcz1zdHlsZVVwZGF0ZXN8fHt9O3N0eWxlVXBkYXRlc1tzdHlsZU5h bWVdPW5leHRQcm9wW3N0eWxlTmFtZV19fX1lbHNle3N0eWxlVXBkYXRlcz1uZXh0UHJvcH19ZWxz ZSBpZihyZWdpc3RyYXRpb25OYW1lTW9kdWxlcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSl7aWYo bmV4dFByb3Ape2VucXVldWVQdXRMaXN0ZW5lcih0aGlzLHByb3BLZXksbmV4dFByb3AsdHJhbnNh Y3Rpb24pfWVsc2UgaWYobGFzdFByb3Ape2RlbGV0ZUxpc3RlbmVyKHRoaXMscHJvcEtleSl9fWVs c2UgaWYoaXNDdXN0b21Db21wb25lbnQodGhpcy5fdGFnLG5leHRQcm9wcykpe2lmKCFSRVNFUlZF RF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSl7RE9NUHJvcGVydHlPcGVyYXRpb25zLnNl dFZhbHVlRm9yQXR0cmlidXRlKGdldE5vZGUodGhpcykscHJvcEtleSxuZXh0UHJvcCl9fWVsc2Ug aWYoRE9NUHJvcGVydHkucHJvcGVydGllc1twcm9wS2V5XXx8RE9NUHJvcGVydHkuaXNDdXN0b21B dHRyaWJ1dGUocHJvcEtleSkpe3ZhciBub2RlPWdldE5vZGUodGhpcyk7aWYobmV4dFByb3AhPW51 bGwpe0RPTVByb3BlcnR5T3BlcmF0aW9ucy5zZXRWYWx1ZUZvclByb3BlcnR5KG5vZGUscHJvcEtl eSxuZXh0UHJvcCl9ZWxzZXtET01Qcm9wZXJ0eU9wZXJhdGlvbnMuZGVsZXRlVmFsdWVGb3JQcm9w ZXJ0eShub2RlLHByb3BLZXkpfX19aWYoc3R5bGVVcGRhdGVzKXtDU1NQcm9wZXJ0eU9wZXJhdGlv bnMuc2V0VmFsdWVGb3JTdHlsZXMoZ2V0Tm9kZSh0aGlzKSxzdHlsZVVwZGF0ZXMsdGhpcyl9fSxf dXBkYXRlRE9NQ2hpbGRyZW46ZnVuY3Rpb24obGFzdFByb3BzLG5leHRQcm9wcyx0cmFuc2FjdGlv bixjb250ZXh0KXt2YXIgbGFzdENvbnRlbnQ9Q09OVEVOVF9UWVBFU1t0eXBlb2YgbGFzdFByb3Bz LmNoaWxkcmVuXT9sYXN0UHJvcHMuY2hpbGRyZW46bnVsbDt2YXIgbmV4dENvbnRlbnQ9Q09OVEVO VF9UWVBFU1t0eXBlb2YgbmV4dFByb3BzLmNoaWxkcmVuXT9uZXh0UHJvcHMuY2hpbGRyZW46bnVs bDt2YXIgbGFzdEh0bWw9bGFzdFByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MJiZsYXN0UHJv cHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwuX19odG1sO3ZhciBuZXh0SHRtbD1uZXh0UHJvcHMu ZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwmJm5leHRQcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRN TC5fX2h0bWw7dmFyIGxhc3RDaGlsZHJlbj1sYXN0Q29udGVudCE9bnVsbD9udWxsOmxhc3RQcm9w cy5jaGlsZHJlbjt2YXIgbmV4dENoaWxkcmVuPW5leHRDb250ZW50IT1udWxsP251bGw6bmV4dFBy b3BzLmNoaWxkcmVuO3ZhciBsYXN0SGFzQ29udGVudE9ySHRtbD1sYXN0Q29udGVudCE9bnVsbHx8 bGFzdEh0bWwhPW51bGw7dmFyIG5leHRIYXNDb250ZW50T3JIdG1sPW5leHRDb250ZW50IT1udWxs fHxuZXh0SHRtbCE9bnVsbDtpZihsYXN0Q2hpbGRyZW4hPW51bGwmJm5leHRDaGlsZHJlbj09bnVs bCl7dGhpcy51cGRhdGVDaGlsZHJlbihudWxsLHRyYW5zYWN0aW9uLGNvbnRleHQpfWVsc2UgaWYo bGFzdEhhc0NvbnRlbnRPckh0bWwmJiFuZXh0SGFzQ29udGVudE9ySHRtbCl7dGhpcy51cGRhdGVU ZXh0Q29udGVudCgiIik7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7UmVhY3RJbnN0 cnVtZW50YXRpb24uZGVidWdUb29sLm9uU2V0Q2hpbGRyZW4odGhpcy5fZGVidWdJRCxbXSl9fWlm KG5leHRDb250ZW50IT1udWxsKXtpZihsYXN0Q29udGVudCE9PW5leHRDb250ZW50KXt0aGlzLnVw ZGF0ZVRleHRDb250ZW50KCIiK25leHRDb250ZW50KTtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1 Y3Rpb24iKXtzZXRBbmRWYWxpZGF0ZUNvbnRlbnRDaGlsZERldi5jYWxsKHRoaXMsbmV4dENvbnRl bnQpfX19ZWxzZSBpZihuZXh0SHRtbCE9bnVsbCl7aWYobGFzdEh0bWwhPT1uZXh0SHRtbCl7dGhp cy51cGRhdGVNYXJrdXAoIiIrbmV4dEh0bWwpfWlmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlv biIpe1JlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblNldENoaWxkcmVuKHRoaXMuX2Rl YnVnSUQsW10pfX1lbHNlIGlmKG5leHRDaGlsZHJlbiE9bnVsbCl7aWYoImRldmVsb3BtZW50IiE9 PSJwcm9kdWN0aW9uIil7c2V0QW5kVmFsaWRhdGVDb250ZW50Q2hpbGREZXYuY2FsbCh0aGlzLG51 bGwpfXRoaXMudXBkYXRlQ2hpbGRyZW4obmV4dENoaWxkcmVuLHRyYW5zYWN0aW9uLGNvbnRleHQp fX0sZ2V0SG9zdE5vZGU6ZnVuY3Rpb24oKXtyZXR1cm4gZ2V0Tm9kZSh0aGlzKX0sdW5tb3VudENv bXBvbmVudDpmdW5jdGlvbihzYWZlbHkpe3N3aXRjaCh0aGlzLl90YWcpe2Nhc2UiYXVkaW8iOmNh c2UiZm9ybSI6Y2FzZSJpZnJhbWUiOmNhc2UiaW1nIjpjYXNlImxpbmsiOmNhc2Uib2JqZWN0Ijpj YXNlInNvdXJjZSI6Y2FzZSJ2aWRlbyI6dmFyIGxpc3RlbmVycz10aGlzLl93cmFwcGVyU3RhdGUu bGlzdGVuZXJzO2lmKGxpc3RlbmVycyl7Zm9yKHZhciBpPTA7aTxsaXN0ZW5lcnMubGVuZ3RoO2kr Kyl7bGlzdGVuZXJzW2ldLnJlbW92ZSgpfX1icmVhaztjYXNlImh0bWwiOmNhc2UiaGVhZCI6Y2Fz ZSJib2R5IjohZmFsc2U/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFs c2UsIjwlcz4gdHJpZWQgdG8gdW5tb3VudC4gQmVjYXVzZSBvZiBjcm9zcy1icm93c2VyIHF1aXJr cyBpdCBpcyBpbXBvc3NpYmxlIHRvIHVubW91bnQgc29tZSB0b3AtbGV2ZWwgY29tcG9uZW50cyAo ZWcgPGh0bWw+LCA8aGVhZD4sIGFuZCA8Ym9keT4pIHJlbGlhYmx5IGFuZCBlZmZpY2llbnRseS4g VG8gZml4IHRoaXMsIGhhdmUgYSBzaW5nbGUgdG9wLWxldmVsIGNvbXBvbmVudCB0aGF0IG5ldmVy IHVubW91bnRzIHJlbmRlciB0aGVzZSBlbGVtZW50cy4iLHRoaXMuX3RhZyk6X3Byb2RJbnZhcmlh bnQoIjY2Iix0aGlzLl90YWcpOnZvaWQgMDticmVha310aGlzLnVubW91bnRDaGlsZHJlbihzYWZl bHkpO1JlYWN0RE9NQ29tcG9uZW50VHJlZS51bmNhY2hlTm9kZSh0aGlzKTtFdmVudFBsdWdpbkh1 Yi5kZWxldGVBbGxMaXN0ZW5lcnModGhpcyk7dGhpcy5fcm9vdE5vZGVJRD0wO3RoaXMuX2RvbUlE PTA7dGhpcy5fd3JhcHBlclN0YXRlPW51bGw7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9u Iil7c2V0QW5kVmFsaWRhdGVDb250ZW50Q2hpbGREZXYuY2FsbCh0aGlzLG51bGwpfX0sZ2V0UHVi bGljSW5zdGFuY2U6ZnVuY3Rpb24oKXtyZXR1cm4gZ2V0Tm9kZSh0aGlzKX19O19hc3NpZ24oUmVh Y3RET01Db21wb25lbnQucHJvdG90eXBlLFJlYWN0RE9NQ29tcG9uZW50Lk1peGluLFJlYWN0TXVs dGlDaGlsZC5NaXhpbik7bW9kdWxlLmV4cG9ydHM9UmVhY3RET01Db21wb25lbnR9LHsxMDoxMCwx MDc6MTA3LDExOjExLDEyOjEyLDEyMjoxMjIsMTI1OjEyNSwxMzE6MTMxLDE0MjoxNDIsMTUwOjE1 MCwxNTY6MTU2LDE1NzoxNTcsMTU4OjE1OCwxNzoxNywxODoxOCwyOjIsMjY6MjYsMzM6MzMsMzQ6 MzQsMzk6MzksNDI6NDIsNDM6NDMsNDY6NDYsNTo1LDY0OjY0LDY4OjY4LDc3Ojc3LDk6OX1dLDMz OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIFJlYWN0 RE9NQ29tcG9uZW50RmxhZ3M9e2hhc0NhY2hlZENoaWxkTm9kZXM6MTw8MH07bW9kdWxlLmV4cG9y dHM9UmVhY3RET01Db21wb25lbnRGbGFnc30se31dLDM0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVs ZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIF9wcm9kSW52YXJpYW50PV9kZXJlcV8oMTI1KTt2 YXIgRE9NUHJvcGVydHk9X2RlcmVxXygxMSk7dmFyIFJlYWN0RE9NQ29tcG9uZW50RmxhZ3M9X2Rl cmVxXygzMyk7dmFyIGludmFyaWFudD1fZGVyZXFfKDE1MCk7dmFyIEFUVFJfTkFNRT1ET01Qcm9w ZXJ0eS5JRF9BVFRSSUJVVEVfTkFNRTt2YXIgRmxhZ3M9UmVhY3RET01Db21wb25lbnRGbGFnczt2 YXIgaW50ZXJuYWxJbnN0YW5jZUtleT0iX19yZWFjdEludGVybmFsSW5zdGFuY2UkIitNYXRoLnJh bmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtmdW5jdGlvbiBzaG91bGRQcmVjYWNoZU5vZGUo bm9kZSxub2RlSUQpe3JldHVybiBub2RlLm5vZGVUeXBlPT09MSYmbm9kZS5nZXRBdHRyaWJ1dGUo QVRUUl9OQU1FKT09PVN0cmluZyhub2RlSUQpfHxub2RlLm5vZGVUeXBlPT09OCYmbm9kZS5ub2Rl VmFsdWU9PT0iIHJlYWN0LXRleHQ6ICIrbm9kZUlEKyIgInx8bm9kZS5ub2RlVHlwZT09PTgmJm5v ZGUubm9kZVZhbHVlPT09IiByZWFjdC1lbXB0eTogIitub2RlSUQrIiAifWZ1bmN0aW9uIGdldFJl bmRlcmVkSG9zdE9yVGV4dEZyb21Db21wb25lbnQoY29tcG9uZW50KXt2YXIgcmVuZGVyZWQ7d2hp bGUocmVuZGVyZWQ9Y29tcG9uZW50Ll9yZW5kZXJlZENvbXBvbmVudCl7Y29tcG9uZW50PXJlbmRl cmVkfXJldHVybiBjb21wb25lbnR9ZnVuY3Rpb24gcHJlY2FjaGVOb2RlKGluc3Qsbm9kZSl7dmFy IGhvc3RJbnN0PWdldFJlbmRlcmVkSG9zdE9yVGV4dEZyb21Db21wb25lbnQoaW5zdCk7aG9zdElu c3QuX2hvc3ROb2RlPW5vZGU7bm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XT1ob3N0SW5zdH1mdW5j dGlvbiB1bmNhY2hlTm9kZShpbnN0KXt2YXIgbm9kZT1pbnN0Ll9ob3N0Tm9kZTtpZihub2RlKXtk ZWxldGUgbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtpbnN0Ll9ob3N0Tm9kZT1udWxsfX1mdW5j dGlvbiBwcmVjYWNoZUNoaWxkTm9kZXMoaW5zdCxub2RlKXtpZihpbnN0Ll9mbGFncyZGbGFncy5o YXNDYWNoZWRDaGlsZE5vZGVzKXtyZXR1cm59dmFyIGNoaWxkcmVuPWluc3QuX3JlbmRlcmVkQ2hp bGRyZW47dmFyIGNoaWxkTm9kZT1ub2RlLmZpcnN0Q2hpbGQ7b3V0ZXI6Zm9yKHZhciBuYW1lIGlu IGNoaWxkcmVuKXtpZighY2hpbGRyZW4uaGFzT3duUHJvcGVydHkobmFtZSkpe2NvbnRpbnVlfXZh ciBjaGlsZEluc3Q9Y2hpbGRyZW5bbmFtZV07dmFyIGNoaWxkSUQ9Z2V0UmVuZGVyZWRIb3N0T3JU ZXh0RnJvbUNvbXBvbmVudChjaGlsZEluc3QpLl9kb21JRDtpZihjaGlsZElEPT09MCl7Y29udGlu dWV9Zm9yKDtjaGlsZE5vZGUhPT1udWxsO2NoaWxkTm9kZT1jaGlsZE5vZGUubmV4dFNpYmxpbmcp e2lmKHNob3VsZFByZWNhY2hlTm9kZShjaGlsZE5vZGUsY2hpbGRJRCkpe3ByZWNhY2hlTm9kZShj aGlsZEluc3QsY2hpbGROb2RlKTtjb250aW51ZSBvdXRlcn19IWZhbHNlPyJkZXZlbG9wbWVudCIh PT0icHJvZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJVbmFibGUgdG8gZmluZCBlbGVtZW50IHdp dGggSUQgJXMuIixjaGlsZElEKTpfcHJvZEludmFyaWFudCgiMzIiLGNoaWxkSUQpOnZvaWQgMH1p bnN0Ll9mbGFnc3w9RmxhZ3MuaGFzQ2FjaGVkQ2hpbGROb2Rlc31mdW5jdGlvbiBnZXRDbG9zZXN0 SW5zdGFuY2VGcm9tTm9kZShub2RlKXtpZihub2RlW2ludGVybmFsSW5zdGFuY2VLZXldKXtyZXR1 cm4gbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XX12YXIgcGFyZW50cz1bXTt3aGlsZSghbm9kZVtp bnRlcm5hbEluc3RhbmNlS2V5XSl7cGFyZW50cy5wdXNoKG5vZGUpO2lmKG5vZGUucGFyZW50Tm9k ZSl7bm9kZT1ub2RlLnBhcmVudE5vZGV9ZWxzZXtyZXR1cm4gbnVsbH19dmFyIGNsb3Nlc3Q7dmFy IGluc3Q7Zm9yKDtub2RlJiYoaW5zdD1ub2RlW2ludGVybmFsSW5zdGFuY2VLZXldKTtub2RlPXBh cmVudHMucG9wKCkpe2Nsb3Nlc3Q9aW5zdDtpZihwYXJlbnRzLmxlbmd0aCl7cHJlY2FjaGVDaGls ZE5vZGVzKGluc3Qsbm9kZSl9fXJldHVybiBjbG9zZXN0fWZ1bmN0aW9uIGdldEluc3RhbmNlRnJv bU5vZGUobm9kZSl7dmFyIGluc3Q9Z2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUobm9kZSk7aWYo aW5zdCE9bnVsbCYmaW5zdC5faG9zdE5vZGU9PT1ub2RlKXtyZXR1cm4gaW5zdH1lbHNle3JldHVy biBudWxsfX1mdW5jdGlvbiBnZXROb2RlRnJvbUluc3RhbmNlKGluc3QpeyEoaW5zdC5faG9zdE5v ZGUhPT11bmRlZmluZWQpPyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/aW52YXJpYW50KGZh bHNlLCJnZXROb2RlRnJvbUluc3RhbmNlOiBJbnZhbGlkIGFyZ3VtZW50LiIpOl9wcm9kSW52YXJp YW50KCIzMyIpOnZvaWQgMDtpZihpbnN0Ll9ob3N0Tm9kZSl7cmV0dXJuIGluc3QuX2hvc3ROb2Rl fXZhciBwYXJlbnRzPVtdO3doaWxlKCFpbnN0Ll9ob3N0Tm9kZSl7cGFyZW50cy5wdXNoKGluc3Qp OyFpbnN0Ll9ob3N0UGFyZW50PyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/aW52YXJpYW50 KGZhbHNlLCJSZWFjdCBET00gdHJlZSByb290IHNob3VsZCBhbHdheXMgaGF2ZSBhIG5vZGUgcmVm ZXJlbmNlLiIpOl9wcm9kSW52YXJpYW50KCIzNCIpOnZvaWQgMDtpbnN0PWluc3QuX2hvc3RQYXJl bnR9Zm9yKDtwYXJlbnRzLmxlbmd0aDtpbnN0PXBhcmVudHMucG9wKCkpe3ByZWNhY2hlQ2hpbGRO b2RlcyhpbnN0LGluc3QuX2hvc3ROb2RlKX1yZXR1cm4gaW5zdC5faG9zdE5vZGV9dmFyIFJlYWN0 RE9NQ29tcG9uZW50VHJlZT17Z2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGU6Z2V0Q2xvc2VzdElu c3RhbmNlRnJvbU5vZGUsZ2V0SW5zdGFuY2VGcm9tTm9kZTpnZXRJbnN0YW5jZUZyb21Ob2RlLGdl dE5vZGVGcm9tSW5zdGFuY2U6Z2V0Tm9kZUZyb21JbnN0YW5jZSxwcmVjYWNoZUNoaWxkTm9kZXM6 cHJlY2FjaGVDaGlsZE5vZGVzLHByZWNhY2hlTm9kZTpwcmVjYWNoZU5vZGUsdW5jYWNoZU5vZGU6 dW5jYWNoZU5vZGV9O21vZHVsZS5leHBvcnRzPVJlYWN0RE9NQ29tcG9uZW50VHJlZX0sezExOjEx LDEyNToxMjUsMTUwOjE1MCwzMzozM31dLDM1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBv cnRzKXsidXNlIHN0cmljdCI7dmFyIHZhbGlkYXRlRE9NTmVzdGluZz1fZGVyZXFfKDEzMSk7dmFy IERPQ19OT0RFX1RZUEU9OTtmdW5jdGlvbiBSZWFjdERPTUNvbnRhaW5lckluZm8odG9wTGV2ZWxX cmFwcGVyLG5vZGUpe3ZhciBpbmZvPXtfdG9wTGV2ZWxXcmFwcGVyOnRvcExldmVsV3JhcHBlcixf aWRDb3VudGVyOjEsX293bmVyRG9jdW1lbnQ6bm9kZT9ub2RlLm5vZGVUeXBlPT09RE9DX05PREVf VFlQRT9ub2RlOm5vZGUub3duZXJEb2N1bWVudDpudWxsLF9ub2RlOm5vZGUsX3RhZzpub2RlP25v ZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTpudWxsLF9uYW1lc3BhY2VVUkk6bm9kZT9ub2RlLm5h bWVzcGFjZVVSSTpudWxsfTtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtpbmZvLl9h bmNlc3RvckluZm89bm9kZT92YWxpZGF0ZURPTU5lc3RpbmcudXBkYXRlZEFuY2VzdG9ySW5mbyhu dWxsLGluZm8uX3RhZyxudWxsKTpudWxsfXJldHVybiBpbmZvfW1vZHVsZS5leHBvcnRzPVJlYWN0 RE9NQ29udGFpbmVySW5mb30sezEzMToxMzF9XSwzNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUs ZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBfYXNzaWduPV9kZXJlcV8oMTU4KTt2YXIgRE9NTGF6 eVRyZWU9X2RlcmVxXyg5KTt2YXIgUmVhY3RET01Db21wb25lbnRUcmVlPV9kZXJlcV8oMzQpO3Zh ciBSZWFjdERPTUVtcHR5Q29tcG9uZW50PWZ1bmN0aW9uKGluc3RhbnRpYXRlKXt0aGlzLl9jdXJy ZW50RWxlbWVudD1udWxsO3RoaXMuX2hvc3ROb2RlPW51bGw7dGhpcy5faG9zdFBhcmVudD1udWxs O3RoaXMuX2hvc3RDb250YWluZXJJbmZvPW51bGw7dGhpcy5fZG9tSUQ9MH07X2Fzc2lnbihSZWFj dERPTUVtcHR5Q29tcG9uZW50LnByb3RvdHlwZSx7bW91bnRDb21wb25lbnQ6ZnVuY3Rpb24odHJh bnNhY3Rpb24saG9zdFBhcmVudCxob3N0Q29udGFpbmVySW5mbyxjb250ZXh0KXt2YXIgZG9tSUQ9 aG9zdENvbnRhaW5lckluZm8uX2lkQ291bnRlcisrO3RoaXMuX2RvbUlEPWRvbUlEO3RoaXMuX2hv c3RQYXJlbnQ9aG9zdFBhcmVudDt0aGlzLl9ob3N0Q29udGFpbmVySW5mbz1ob3N0Q29udGFpbmVy SW5mbzt2YXIgbm9kZVZhbHVlPSIgcmVhY3QtZW1wdHk6ICIrdGhpcy5fZG9tSUQrIiAiO2lmKHRy YW5zYWN0aW9uLnVzZUNyZWF0ZUVsZW1lbnQpe3ZhciBvd25lckRvY3VtZW50PWhvc3RDb250YWlu ZXJJbmZvLl9vd25lckRvY3VtZW50O3ZhciBub2RlPW93bmVyRG9jdW1lbnQuY3JlYXRlQ29tbWVu dChub2RlVmFsdWUpO1JlYWN0RE9NQ29tcG9uZW50VHJlZS5wcmVjYWNoZU5vZGUodGhpcyxub2Rl KTtyZXR1cm4gRE9NTGF6eVRyZWUobm9kZSl9ZWxzZXtpZih0cmFuc2FjdGlvbi5yZW5kZXJUb1N0 YXRpY01hcmt1cCl7cmV0dXJuIiJ9cmV0dXJuIlx4M2MhLS0iK25vZGVWYWx1ZSsiLS1ceDNlIn19 LHJlY2VpdmVDb21wb25lbnQ6ZnVuY3Rpb24oKXt9LGdldEhvc3ROb2RlOmZ1bmN0aW9uKCl7cmV0 dXJuIFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKHRoaXMpfSx1bm1v dW50Q29tcG9uZW50OmZ1bmN0aW9uKCl7UmVhY3RET01Db21wb25lbnRUcmVlLnVuY2FjaGVOb2Rl KHRoaXMpfX0pO21vZHVsZS5leHBvcnRzPVJlYWN0RE9NRW1wdHlDb21wb25lbnR9LHsxNTg6MTU4 LDM0OjM0LDk6OX1dLDM3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0 cmljdCI7dmFyIFJlYWN0RE9NRmVhdHVyZUZsYWdzPXt1c2VDcmVhdGVFbGVtZW50OnRydWUsdXNl RmliZXI6ZmFsc2V9O21vZHVsZS5leHBvcnRzPVJlYWN0RE9NRmVhdHVyZUZsYWdzfSx7fV0sMzg6 W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgRE9NQ2hp bGRyZW5PcGVyYXRpb25zPV9kZXJlcV8oOCk7dmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZT1fZGVy ZXFfKDM0KTt2YXIgUmVhY3RET01JRE9wZXJhdGlvbnM9e2Rhbmdlcm91c2x5UHJvY2Vzc0NoaWxk cmVuVXBkYXRlczpmdW5jdGlvbihwYXJlbnRJbnN0LHVwZGF0ZXMpe3ZhciBub2RlPVJlYWN0RE9N Q29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKHBhcmVudEluc3QpO0RPTUNoaWxkcmVu T3BlcmF0aW9ucy5wcm9jZXNzVXBkYXRlcyhub2RlLHVwZGF0ZXMpfX07bW9kdWxlLmV4cG9ydHM9 UmVhY3RET01JRE9wZXJhdGlvbnN9LHszNDozNCw4Ojh9XSwzOTpbZnVuY3Rpb24oX2RlcmVxXyxt b2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBfcHJvZEludmFyaWFudD1fZGVyZXFfKDEy NSksX2Fzc2lnbj1fZGVyZXFfKDE1OCk7dmFyIERPTVByb3BlcnR5T3BlcmF0aW9ucz1fZGVyZXFf KDEyKTt2YXIgTGlua2VkVmFsdWVVdGlscz1fZGVyZXFfKDI0KTt2YXIgUmVhY3RET01Db21wb25l bnRUcmVlPV9kZXJlcV8oMzQpO3ZhciBSZWFjdFVwZGF0ZXM9X2RlcmVxXyg4Mik7dmFyIGludmFy aWFudD1fZGVyZXFfKDE1MCk7dmFyIHdhcm5pbmc9X2RlcmVxXygxNTcpO3ZhciBkaWRXYXJuVmFs dWVMaW5rPWZhbHNlO3ZhciBkaWRXYXJuQ2hlY2tlZExpbms9ZmFsc2U7dmFyIGRpZFdhcm5WYWx1 ZURlZmF1bHRWYWx1ZT1mYWxzZTt2YXIgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZD1mYWxz ZTt2YXIgZGlkV2FybkNvbnRyb2xsZWRUb1VuY29udHJvbGxlZD1mYWxzZTt2YXIgZGlkV2FyblVu Y29udHJvbGxlZFRvQ29udHJvbGxlZD1mYWxzZTtmdW5jdGlvbiBmb3JjZVVwZGF0ZUlmTW91bnRl ZCgpe2lmKHRoaXMuX3Jvb3ROb2RlSUQpe1JlYWN0RE9NSW5wdXQudXBkYXRlV3JhcHBlcih0aGlz KX19ZnVuY3Rpb24gaXNDb250cm9sbGVkKHByb3BzKXt2YXIgdXNlc0NoZWNrZWQ9cHJvcHMudHlw ZT09PSJjaGVja2JveCJ8fHByb3BzLnR5cGU9PT0icmFkaW8iO3JldHVybiB1c2VzQ2hlY2tlZD9w cm9wcy5jaGVja2VkIT1udWxsOnByb3BzLnZhbHVlIT1udWxsfXZhciBSZWFjdERPTUlucHV0PXtn ZXRIb3N0UHJvcHM6ZnVuY3Rpb24oaW5zdCxwcm9wcyl7dmFyIHZhbHVlPUxpbmtlZFZhbHVlVXRp bHMuZ2V0VmFsdWUocHJvcHMpO3ZhciBjaGVja2VkPUxpbmtlZFZhbHVlVXRpbHMuZ2V0Q2hlY2tl ZChwcm9wcyk7dmFyIGhvc3RQcm9wcz1fYXNzaWduKHt0eXBlOnVuZGVmaW5lZCxzdGVwOnVuZGVm aW5lZCxtaW46dW5kZWZpbmVkLG1heDp1bmRlZmluZWR9LHByb3BzLHtkZWZhdWx0Q2hlY2tlZDp1 bmRlZmluZWQsZGVmYXVsdFZhbHVlOnVuZGVmaW5lZCx2YWx1ZTp2YWx1ZSE9bnVsbD92YWx1ZTpp bnN0Ll93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlLGNoZWNrZWQ6Y2hlY2tlZCE9bnVsbD9jaGVj a2VkOmluc3QuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZCxvbkNoYW5nZTppbnN0Ll93cmFw cGVyU3RhdGUub25DaGFuZ2V9KTtyZXR1cm4gaG9zdFByb3BzfSxtb3VudFdyYXBwZXI6ZnVuY3Rp b24oaW5zdCxwcm9wcyl7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7TGlua2VkVmFs dWVVdGlscy5jaGVja1Byb3BUeXBlcygiaW5wdXQiLHByb3BzLGluc3QuX2N1cnJlbnRFbGVtZW50 Ll9vd25lcik7dmFyIG93bmVyPWluc3QuX2N1cnJlbnRFbGVtZW50Ll9vd25lcjtpZihwcm9wcy52 YWx1ZUxpbmshPT11bmRlZmluZWQmJiFkaWRXYXJuVmFsdWVMaW5rKXsiZGV2ZWxvcG1lbnQiIT09 InByb2R1Y3Rpb24iP3dhcm5pbmcoZmFsc2UsImB2YWx1ZUxpbmtgIHByb3Agb24gYGlucHV0YCBp cyBkZXByZWNhdGVkOyBzZXQgYHZhbHVlYCBhbmQgYG9uQ2hhbmdlYCBpbnN0ZWFkLiIpOnZvaWQg MDtkaWRXYXJuVmFsdWVMaW5rPXRydWV9aWYocHJvcHMuY2hlY2tlZExpbmshPT11bmRlZmluZWQm JiFkaWRXYXJuQ2hlY2tlZExpbmspeyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2Fybmlu ZyhmYWxzZSwiYGNoZWNrZWRMaW5rYCBwcm9wIG9uIGBpbnB1dGAgaXMgZGVwcmVjYXRlZDsgc2V0 IGB2YWx1ZWAgYW5kIGBvbkNoYW5nZWAgaW5zdGVhZC4iKTp2b2lkIDA7ZGlkV2FybkNoZWNrZWRM aW5rPXRydWV9aWYocHJvcHMuY2hlY2tlZCE9PXVuZGVmaW5lZCYmcHJvcHMuZGVmYXVsdENoZWNr ZWQhPT11bmRlZmluZWQmJiFkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkKXsiZGV2ZWxvcG1l bnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmcoZmFsc2UsIiVzIGNvbnRhaW5zIGFuIGlucHV0IG9m IHR5cGUgJXMgd2l0aCBib3RoIGNoZWNrZWQgYW5kIGRlZmF1bHRDaGVja2VkIHByb3BzLiAiKyJJ bnB1dCBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAi KyIoc3BlY2lmeSBlaXRoZXIgdGhlIGNoZWNrZWQgcHJvcCwgb3IgdGhlIGRlZmF1bHRDaGVja2Vk IHByb3AsIGJ1dCBub3QgIisiYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxl ZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgIisiZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVz ZSBwcm9wcy4gTW9yZSBpbmZvOiAiKyJodHRwczovL2ZiLm1lL3JlYWN0LWNvbnRyb2xsZWQtY29t cG9uZW50cyIsb3duZXImJm93bmVyLmdldE5hbWUoKXx8IkEgY29tcG9uZW50Iixwcm9wcy50eXBl KTp2b2lkIDA7ZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZD10cnVlfWlmKHByb3BzLnZhbHVl IT09dW5kZWZpbmVkJiZwcm9wcy5kZWZhdWx0VmFsdWUhPT11bmRlZmluZWQmJiFkaWRXYXJuVmFs dWVEZWZhdWx0VmFsdWUpeyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyhmYWxz ZSwiJXMgY29udGFpbnMgYW4gaW5wdXQgb2YgdHlwZSAlcyB3aXRoIGJvdGggdmFsdWUgYW5kIGRl ZmF1bHRWYWx1ZSBwcm9wcy4gIisiSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJv bGxlZCBvciB1bmNvbnRyb2xsZWQgIisiKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBv ciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgIisiYm90aCkuIERlY2lkZSBiZXR3ZWVu IHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgIisiZWxlbWVudCBhbmQg cmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAiKyJodHRwczovL2ZiLm1lL3Jl YWN0LWNvbnRyb2xsZWQtY29tcG9uZW50cyIsb3duZXImJm93bmVyLmdldE5hbWUoKXx8IkEgY29t cG9uZW50Iixwcm9wcy50eXBlKTp2b2lkIDA7ZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlPXRydWV9 fXZhciBkZWZhdWx0VmFsdWU9cHJvcHMuZGVmYXVsdFZhbHVlO2luc3QuX3dyYXBwZXJTdGF0ZT17 aW5pdGlhbENoZWNrZWQ6cHJvcHMuY2hlY2tlZCE9bnVsbD9wcm9wcy5jaGVja2VkOnByb3BzLmRl ZmF1bHRDaGVja2VkLGluaXRpYWxWYWx1ZTpwcm9wcy52YWx1ZSE9bnVsbD9wcm9wcy52YWx1ZTpk ZWZhdWx0VmFsdWUsbGlzdGVuZXJzOm51bGwsb25DaGFuZ2U6X2hhbmRsZUNoYW5nZS5iaW5kKGlu c3QpfTtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtpbnN0Ll93cmFwcGVyU3RhdGUu Y29udHJvbGxlZD1pc0NvbnRyb2xsZWQocHJvcHMpfX0sdXBkYXRlV3JhcHBlcjpmdW5jdGlvbihp bnN0KXt2YXIgcHJvcHM9aW5zdC5fY3VycmVudEVsZW1lbnQucHJvcHM7aWYoImRldmVsb3BtZW50 IiE9PSJwcm9kdWN0aW9uIil7dmFyIGNvbnRyb2xsZWQ9aXNDb250cm9sbGVkKHByb3BzKTt2YXIg b3duZXI9aW5zdC5fY3VycmVudEVsZW1lbnQuX293bmVyO2lmKCFpbnN0Ll93cmFwcGVyU3RhdGUu Y29udHJvbGxlZCYmY29udHJvbGxlZCYmIWRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQp eyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyhmYWxzZSwiJXMgaXMgY2hhbmdp bmcgYW4gdW5jb250cm9sbGVkIGlucHV0IG9mIHR5cGUgJXMgdG8gYmUgY29udHJvbGxlZC4gIisi SW5wdXQgZWxlbWVudHMgc2hvdWxkIG5vdCBzd2l0Y2ggZnJvbSB1bmNvbnRyb2xsZWQgdG8gY29u dHJvbGxlZCAob3IgdmljZSB2ZXJzYSkuICIrIkRlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJv bGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgIisiZWxlbWVudCBmb3IgdGhlIGxpZmV0aW1lIG9m IHRoZSBjb21wb25lbnQuIE1vcmUgaW5mbzogaHR0cHM6Ly9mYi5tZS9yZWFjdC1jb250cm9sbGVk LWNvbXBvbmVudHMiLG93bmVyJiZvd25lci5nZXROYW1lKCl8fCJBIGNvbXBvbmVudCIscHJvcHMu dHlwZSk6dm9pZCAwO2RpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQ9dHJ1ZX1pZihpbnN0 Ll93cmFwcGVyU3RhdGUuY29udHJvbGxlZCYmIWNvbnRyb2xsZWQmJiFkaWRXYXJuQ29udHJvbGxl ZFRvVW5jb250cm9sbGVkKXsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmcoZmFs c2UsIiVzIGlzIGNoYW5naW5nIGEgY29udHJvbGxlZCBpbnB1dCBvZiB0eXBlICVzIHRvIGJlIHVu Y29udHJvbGxlZC4gIisiSW5wdXQgZWxlbWVudHMgc2hvdWxkIG5vdCBzd2l0Y2ggZnJvbSBjb250 cm9sbGVkIHRvIHVuY29udHJvbGxlZCAob3IgdmljZSB2ZXJzYSkuICIrIkRlY2lkZSBiZXR3ZWVu IHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgIisiZWxlbWVudCBmb3Ig dGhlIGxpZmV0aW1lIG9mIHRoZSBjb21wb25lbnQuIE1vcmUgaW5mbzogaHR0cHM6Ly9mYi5tZS9y ZWFjdC1jb250cm9sbGVkLWNvbXBvbmVudHMiLG93bmVyJiZvd25lci5nZXROYW1lKCl8fCJBIGNv bXBvbmVudCIscHJvcHMudHlwZSk6dm9pZCAwO2RpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xs ZWQ9dHJ1ZX19dmFyIGNoZWNrZWQ9cHJvcHMuY2hlY2tlZDtpZihjaGVja2VkIT1udWxsKXtET01Q cm9wZXJ0eU9wZXJhdGlvbnMuc2V0VmFsdWVGb3JQcm9wZXJ0eShSZWFjdERPTUNvbXBvbmVudFRy ZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KSwiY2hlY2tlZCIsY2hlY2tlZHx8ZmFsc2UpfXZh ciBub2RlPVJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpO3Zh ciB2YWx1ZT1MaW5rZWRWYWx1ZVV0aWxzLmdldFZhbHVlKHByb3BzKTtpZih2YWx1ZSE9bnVsbCl7 dmFyIG5ld1ZhbHVlPSIiK3ZhbHVlO2lmKG5ld1ZhbHVlIT09bm9kZS52YWx1ZSl7bm9kZS52YWx1 ZT1uZXdWYWx1ZX19ZWxzZXtpZihwcm9wcy52YWx1ZT09bnVsbCYmcHJvcHMuZGVmYXVsdFZhbHVl IT1udWxsKXtpZihub2RlLmRlZmF1bHRWYWx1ZSE9PSIiK3Byb3BzLmRlZmF1bHRWYWx1ZSl7bm9k ZS5kZWZhdWx0VmFsdWU9IiIrcHJvcHMuZGVmYXVsdFZhbHVlfX1pZihwcm9wcy5jaGVja2VkPT1u dWxsJiZwcm9wcy5kZWZhdWx0Q2hlY2tlZCE9bnVsbCl7bm9kZS5kZWZhdWx0Q2hlY2tlZD0hIXBy b3BzLmRlZmF1bHRDaGVja2VkfX19LHBvc3RNb3VudFdyYXBwZXI6ZnVuY3Rpb24oaW5zdCl7dmFy IHByb3BzPWluc3QuX2N1cnJlbnRFbGVtZW50LnByb3BzO3ZhciBub2RlPVJlYWN0RE9NQ29tcG9u ZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpO3N3aXRjaChwcm9wcy50eXBlKXtjYXNl InN1Ym1pdCI6Y2FzZSJyZXNldCI6YnJlYWs7Y2FzZSJjb2xvciI6Y2FzZSJkYXRlIjpjYXNlImRh dGV0aW1lIjpjYXNlImRhdGV0aW1lLWxvY2FsIjpjYXNlIm1vbnRoIjpjYXNlInRpbWUiOmNhc2Ui d2VlayI6bm9kZS52YWx1ZT0iIjtub2RlLnZhbHVlPW5vZGUuZGVmYXVsdFZhbHVlO2JyZWFrO2Rl ZmF1bHQ6bm9kZS52YWx1ZT1ub2RlLnZhbHVlO2JyZWFrfXZhciBuYW1lPW5vZGUubmFtZTtpZihu YW1lIT09IiIpe25vZGUubmFtZT0iIn1ub2RlLmRlZmF1bHRDaGVja2VkPSFub2RlLmRlZmF1bHRD aGVja2VkO25vZGUuZGVmYXVsdENoZWNrZWQ9IW5vZGUuZGVmYXVsdENoZWNrZWQ7aWYobmFtZSE9 PSIiKXtub2RlLm5hbWU9bmFtZX19fTtmdW5jdGlvbiBfaGFuZGxlQ2hhbmdlKGV2ZW50KXt2YXIg cHJvcHM9dGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHM7dmFyIHJldHVyblZhbHVlPUxpbmtlZFZh bHVlVXRpbHMuZXhlY3V0ZU9uQ2hhbmdlKHByb3BzLGV2ZW50KTtSZWFjdFVwZGF0ZXMuYXNhcChm b3JjZVVwZGF0ZUlmTW91bnRlZCx0aGlzKTt2YXIgbmFtZT1wcm9wcy5uYW1lO2lmKHByb3BzLnR5 cGU9PT0icmFkaW8iJiZuYW1lIT1udWxsKXt2YXIgcm9vdE5vZGU9UmVhY3RET01Db21wb25lbnRU cmVlLmdldE5vZGVGcm9tSW5zdGFuY2UodGhpcyk7dmFyIHF1ZXJ5Um9vdD1yb290Tm9kZTt3aGls ZShxdWVyeVJvb3QucGFyZW50Tm9kZSl7cXVlcnlSb290PXF1ZXJ5Um9vdC5wYXJlbnROb2RlfXZh ciBncm91cD1xdWVyeVJvb3QucXVlcnlTZWxlY3RvckFsbCgiaW5wdXRbbmFtZT0iK0pTT04uc3Ry aW5naWZ5KCIiK25hbWUpKyddW3R5cGU9InJhZGlvIl0nKTtmb3IodmFyIGk9MDtpPGdyb3VwLmxl bmd0aDtpKyspe3ZhciBvdGhlck5vZGU9Z3JvdXBbaV07aWYob3RoZXJOb2RlPT09cm9vdE5vZGV8 fG90aGVyTm9kZS5mb3JtIT09cm9vdE5vZGUuZm9ybSl7Y29udGludWV9dmFyIG90aGVySW5zdGFu Y2U9UmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUob3RoZXJOb2RlKTsh b3RoZXJJbnN0YW5jZT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxz ZSwiUmVhY3RET01JbnB1dDogTWl4aW5nIFJlYWN0IGFuZCBub24tUmVhY3QgcmFkaW8gaW5wdXRz IHdpdGggdGhlIHNhbWUgYG5hbWVgIGlzIG5vdCBzdXBwb3J0ZWQuIik6X3Byb2RJbnZhcmlhbnQo IjkwIik6dm9pZCAwO1JlYWN0VXBkYXRlcy5hc2FwKGZvcmNlVXBkYXRlSWZNb3VudGVkLG90aGVy SW5zdGFuY2UpfX1yZXR1cm4gcmV0dXJuVmFsdWV9bW9kdWxlLmV4cG9ydHM9UmVhY3RET01JbnB1 dH0sezEyOjEyLDEyNToxMjUsMTUwOjE1MCwxNTc6MTU3LDE1ODoxNTgsMjQ6MjQsMzQ6MzQsODI6 ODJ9XSw0MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3Zh ciBET01Qcm9wZXJ0eT1fZGVyZXFfKDExKTt2YXIgUmVhY3RDb21wb25lbnRUcmVlSG9vaz1fZGVy ZXFfKDEzMik7dmFyIHdhcm5pbmc9X2RlcmVxXygxNTcpO3ZhciB3YXJuZWRQcm9wZXJ0aWVzPXt9 O3ZhciByQVJJQT1uZXcgUmVnRXhwKCJeKGFyaWEpLVsiK0RPTVByb3BlcnR5LkFUVFJJQlVURV9O QU1FX0NIQVIrIl0qJCIpO2Z1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHkodGFnTmFtZSxuYW1lLGRl YnVnSUQpe2lmKHdhcm5lZFByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSkmJndhcm5lZFBy b3BlcnRpZXNbbmFtZV0pe3JldHVybiB0cnVlfWlmKHJBUklBLnRlc3QobmFtZSkpe3ZhciBsb3dl ckNhc2VkTmFtZT1uYW1lLnRvTG93ZXJDYXNlKCk7dmFyIHN0YW5kYXJkTmFtZT1ET01Qcm9wZXJ0 eS5nZXRQb3NzaWJsZVN0YW5kYXJkTmFtZS5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSk/ RE9NUHJvcGVydHkuZ2V0UG9zc2libGVTdGFuZGFyZE5hbWVbbG93ZXJDYXNlZE5hbWVdOm51bGw7 aWYoc3RhbmRhcmROYW1lPT1udWxsKXt3YXJuZWRQcm9wZXJ0aWVzW25hbWVdPXRydWU7cmV0dXJu IGZhbHNlfWlmKG5hbWUhPT1zdGFuZGFyZE5hbWUpeyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlv biI/d2FybmluZyhmYWxzZSwiVW5rbm93biBBUklBIGF0dHJpYnV0ZSAlcy4gRGlkIHlvdSBtZWFu ICVzPyVzIixuYW1lLHN0YW5kYXJkTmFtZSxSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNr QWRkZW5kdW1CeUlEKGRlYnVnSUQpKTp2b2lkIDA7d2FybmVkUHJvcGVydGllc1tuYW1lXT10cnVl O3JldHVybiB0cnVlfX1yZXR1cm4gdHJ1ZX1mdW5jdGlvbiB3YXJuSW52YWxpZEFSSUFQcm9wcyhk ZWJ1Z0lELGVsZW1lbnQpe3ZhciBpbnZhbGlkUHJvcHM9W107Zm9yKHZhciBrZXkgaW4gZWxlbWVu dC5wcm9wcyl7dmFyIGlzVmFsaWQ9dmFsaWRhdGVQcm9wZXJ0eShlbGVtZW50LnR5cGUsa2V5LGRl YnVnSUQpO2lmKCFpc1ZhbGlkKXtpbnZhbGlkUHJvcHMucHVzaChrZXkpfX12YXIgdW5rbm93blBy b3BTdHJpbmc9aW52YWxpZFByb3BzLm1hcChmdW5jdGlvbihwcm9wKXtyZXR1cm4iYCIrcHJvcCsi YCJ9KS5qb2luKCIsICIpO2lmKGludmFsaWRQcm9wcy5sZW5ndGg9PT0xKXsiZGV2ZWxvcG1lbnQi IT09InByb2R1Y3Rpb24iP3dhcm5pbmcoZmFsc2UsIkludmFsaWQgYXJpYSBwcm9wICVzIG9uIDwl cz4gdGFnLiAiKyJGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vZmIubWUvaW52YWxpZC1hcmlhLXBy b3AlcyIsdW5rbm93blByb3BTdHJpbmcsZWxlbWVudC50eXBlLFJlYWN0Q29tcG9uZW50VHJlZUhv b2suZ2V0U3RhY2tBZGRlbmR1bUJ5SUQoZGVidWdJRCkpOnZvaWQgMH1lbHNlIGlmKGludmFsaWRQ cm9wcy5sZW5ndGg+MSl7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKGZhbHNl LCJJbnZhbGlkIGFyaWEgcHJvcHMgJXMgb24gPCVzPiB0YWcuICIrIkZvciBkZXRhaWxzLCBzZWUg aHR0cHM6Ly9mYi5tZS9pbnZhbGlkLWFyaWEtcHJvcCVzIix1bmtub3duUHJvcFN0cmluZyxlbGVt ZW50LnR5cGUsUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChkZWJ1 Z0lEKSk6dm9pZCAwfX1mdW5jdGlvbiBoYW5kbGVFbGVtZW50KGRlYnVnSUQsZWxlbWVudCl7aWYo ZWxlbWVudD09bnVsbHx8dHlwZW9mIGVsZW1lbnQudHlwZSE9PSJzdHJpbmciKXtyZXR1cm59aWYo ZWxlbWVudC50eXBlLmluZGV4T2YoIi0iKT49MHx8ZWxlbWVudC5wcm9wcy5pcyl7cmV0dXJufXdh cm5JbnZhbGlkQVJJQVByb3BzKGRlYnVnSUQsZWxlbWVudCl9dmFyIFJlYWN0RE9NSW52YWxpZEFS SUFIb29rPXtvbkJlZm9yZU1vdW50Q29tcG9uZW50OmZ1bmN0aW9uKGRlYnVnSUQsZWxlbWVudCl7 aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7aGFuZGxlRWxlbWVudChkZWJ1Z0lELGVs ZW1lbnQpfX0sb25CZWZvcmVVcGRhdGVDb21wb25lbnQ6ZnVuY3Rpb24oZGVidWdJRCxlbGVtZW50 KXtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtoYW5kbGVFbGVtZW50KGRlYnVnSUQs ZWxlbWVudCl9fX07bW9kdWxlLmV4cG9ydHM9UmVhY3RET01JbnZhbGlkQVJJQUhvb2t9LHsxMTox MSwxMzI6MTMyLDE1NzoxNTd9XSw0MTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7 InVzZSBzdHJpY3QiO3ZhciBSZWFjdENvbXBvbmVudFRyZWVIb29rPV9kZXJlcV8oMTMyKTt2YXIg d2FybmluZz1fZGVyZXFfKDE1Nyk7dmFyIGRpZFdhcm5WYWx1ZU51bGw9ZmFsc2U7ZnVuY3Rpb24g aGFuZGxlRWxlbWVudChkZWJ1Z0lELGVsZW1lbnQpe2lmKGVsZW1lbnQ9PW51bGwpe3JldHVybn1p ZihlbGVtZW50LnR5cGUhPT0iaW5wdXQiJiZlbGVtZW50LnR5cGUhPT0idGV4dGFyZWEiJiZlbGVt ZW50LnR5cGUhPT0ic2VsZWN0Iil7cmV0dXJufWlmKGVsZW1lbnQucHJvcHMhPW51bGwmJmVsZW1l bnQucHJvcHMudmFsdWU9PT1udWxsJiYhZGlkV2FyblZhbHVlTnVsbCl7ImRldmVsb3BtZW50IiE9 PSJwcm9kdWN0aW9uIj93YXJuaW5nKGZhbHNlLCJgdmFsdWVgIHByb3Agb24gYCVzYCBzaG91bGQg bm90IGJlIG51bGwuICIrIkNvbnNpZGVyIHVzaW5nIHRoZSBlbXB0eSBzdHJpbmcgdG8gY2xlYXIg dGhlIGNvbXBvbmVudCBvciBgdW5kZWZpbmVkYCAiKyJmb3IgdW5jb250cm9sbGVkIGNvbXBvbmVu dHMuJXMiLGVsZW1lbnQudHlwZSxSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5k dW1CeUlEKGRlYnVnSUQpKTp2b2lkIDA7ZGlkV2FyblZhbHVlTnVsbD10cnVlfX12YXIgUmVhY3RE T01OdWxsSW5wdXRWYWx1ZVByb3BIb29rPXtvbkJlZm9yZU1vdW50Q29tcG9uZW50OmZ1bmN0aW9u KGRlYnVnSUQsZWxlbWVudCl7aGFuZGxlRWxlbWVudChkZWJ1Z0lELGVsZW1lbnQpfSxvbkJlZm9y ZVVwZGF0ZUNvbXBvbmVudDpmdW5jdGlvbihkZWJ1Z0lELGVsZW1lbnQpe2hhbmRsZUVsZW1lbnQo ZGVidWdJRCxlbGVtZW50KX19O21vZHVsZS5leHBvcnRzPVJlYWN0RE9NTnVsbElucHV0VmFsdWVQ cm9wSG9va30sezEzMjoxMzIsMTU3OjE1N31dLDQyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxl eHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIF9hc3NpZ249X2RlcmVxXygxNTgpO3ZhciBSZWFjdD1f ZGVyZXFfKDEzNCk7dmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZT1fZGVyZXFfKDM0KTt2YXIgUmVh Y3RET01TZWxlY3Q9X2RlcmVxXyg0Myk7dmFyIHdhcm5pbmc9X2RlcmVxXygxNTcpO3ZhciBkaWRX YXJuSW52YWxpZE9wdGlvbkNoaWxkcmVuPWZhbHNlO2Z1bmN0aW9uIGZsYXR0ZW5DaGlsZHJlbihj aGlsZHJlbil7dmFyIGNvbnRlbnQ9IiI7UmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbixm dW5jdGlvbihjaGlsZCl7aWYoY2hpbGQ9PW51bGwpe3JldHVybn1pZih0eXBlb2YgY2hpbGQ9PT0i c3RyaW5nInx8dHlwZW9mIGNoaWxkPT09Im51bWJlciIpe2NvbnRlbnQrPWNoaWxkfWVsc2UgaWYo IWRpZFdhcm5JbnZhbGlkT3B0aW9uQ2hpbGRyZW4pe2RpZFdhcm5JbnZhbGlkT3B0aW9uQ2hpbGRy ZW49dHJ1ZTsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmcoZmFsc2UsIk9ubHkg c3RyaW5ncyBhbmQgbnVtYmVycyBhcmUgc3VwcG9ydGVkIGFzIDxvcHRpb24+IGNoaWxkcmVuLiIp OnZvaWQgMH19KTtyZXR1cm4gY29udGVudH12YXIgUmVhY3RET01PcHRpb249e21vdW50V3JhcHBl cjpmdW5jdGlvbihpbnN0LHByb3BzLGhvc3RQYXJlbnQpe2lmKCJkZXZlbG9wbWVudCIhPT0icHJv ZHVjdGlvbiIpeyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyhwcm9wcy5zZWxl Y3RlZD09bnVsbCwiVXNlIHRoZSBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVgIHByb3BzIG9uIDxz ZWxlY3Q+IGluc3RlYWQgb2YgIisic2V0dGluZyBgc2VsZWN0ZWRgIG9uIDxvcHRpb24+LiIpOnZv aWQgMH12YXIgc2VsZWN0VmFsdWU9bnVsbDtpZihob3N0UGFyZW50IT1udWxsKXt2YXIgc2VsZWN0 UGFyZW50PWhvc3RQYXJlbnQ7aWYoc2VsZWN0UGFyZW50Ll90YWc9PT0ib3B0Z3JvdXAiKXtzZWxl Y3RQYXJlbnQ9c2VsZWN0UGFyZW50Ll9ob3N0UGFyZW50fWlmKHNlbGVjdFBhcmVudCE9bnVsbCYm c2VsZWN0UGFyZW50Ll90YWc9PT0ic2VsZWN0Iil7c2VsZWN0VmFsdWU9UmVhY3RET01TZWxlY3Qu Z2V0U2VsZWN0VmFsdWVDb250ZXh0KHNlbGVjdFBhcmVudCl9fXZhciBzZWxlY3RlZD1udWxsO2lm KHNlbGVjdFZhbHVlIT1udWxsKXt2YXIgdmFsdWU7aWYocHJvcHMudmFsdWUhPW51bGwpe3ZhbHVl PXByb3BzLnZhbHVlKyIifWVsc2V7dmFsdWU9ZmxhdHRlbkNoaWxkcmVuKHByb3BzLmNoaWxkcmVu KX1zZWxlY3RlZD1mYWxzZTtpZihBcnJheS5pc0FycmF5KHNlbGVjdFZhbHVlKSl7Zm9yKHZhciBp PTA7aTxzZWxlY3RWYWx1ZS5sZW5ndGg7aSsrKXtpZigiIitzZWxlY3RWYWx1ZVtpXT09PXZhbHVl KXtzZWxlY3RlZD10cnVlO2JyZWFrfX19ZWxzZXtzZWxlY3RlZD0iIitzZWxlY3RWYWx1ZT09PXZh bHVlfX1pbnN0Ll93cmFwcGVyU3RhdGU9e3NlbGVjdGVkOnNlbGVjdGVkfX0scG9zdE1vdW50V3Jh cHBlcjpmdW5jdGlvbihpbnN0KXt2YXIgcHJvcHM9aW5zdC5fY3VycmVudEVsZW1lbnQucHJvcHM7 aWYocHJvcHMudmFsdWUhPW51bGwpe3ZhciBub2RlPVJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRO b2RlRnJvbUluc3RhbmNlKGluc3QpO25vZGUuc2V0QXR0cmlidXRlKCJ2YWx1ZSIscHJvcHMudmFs dWUpfX0sZ2V0SG9zdFByb3BzOmZ1bmN0aW9uKGluc3QscHJvcHMpe3ZhciBob3N0UHJvcHM9X2Fz c2lnbih7c2VsZWN0ZWQ6dW5kZWZpbmVkLGNoaWxkcmVuOnVuZGVmaW5lZH0scHJvcHMpO2lmKGlu c3QuX3dyYXBwZXJTdGF0ZS5zZWxlY3RlZCE9bnVsbCl7aG9zdFByb3BzLnNlbGVjdGVkPWluc3Qu X3dyYXBwZXJTdGF0ZS5zZWxlY3RlZH12YXIgY29udGVudD1mbGF0dGVuQ2hpbGRyZW4ocHJvcHMu Y2hpbGRyZW4pO2lmKGNvbnRlbnQpe2hvc3RQcm9wcy5jaGlsZHJlbj1jb250ZW50fXJldHVybiBo b3N0UHJvcHN9fTttb2R1bGUuZXhwb3J0cz1SZWFjdERPTU9wdGlvbn0sezEzNDoxMzQsMTU3OjE1 NywxNTg6MTU4LDM0OjM0LDQzOjQzfV0sNDM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9y dHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgX2Fzc2lnbj1fZGVyZXFfKDE1OCk7dmFyIExpbmtlZFZhbHVl VXRpbHM9X2RlcmVxXygyNCk7dmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZT1fZGVyZXFfKDM0KTt2 YXIgUmVhY3RVcGRhdGVzPV9kZXJlcV8oODIpO3ZhciB3YXJuaW5nPV9kZXJlcV8oMTU3KTt2YXIg ZGlkV2FyblZhbHVlTGluaz1mYWxzZTt2YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlPWZhbHNl O2Z1bmN0aW9uIHVwZGF0ZU9wdGlvbnNJZlBlbmRpbmdVcGRhdGVBbmRNb3VudGVkKCl7aWYodGhp cy5fcm9vdE5vZGVJRCYmdGhpcy5fd3JhcHBlclN0YXRlLnBlbmRpbmdVcGRhdGUpe3RoaXMuX3dy YXBwZXJTdGF0ZS5wZW5kaW5nVXBkYXRlPWZhbHNlO3ZhciBwcm9wcz10aGlzLl9jdXJyZW50RWxl bWVudC5wcm9wczt2YXIgdmFsdWU9TGlua2VkVmFsdWVVdGlscy5nZXRWYWx1ZShwcm9wcyk7aWYo dmFsdWUhPW51bGwpe3VwZGF0ZU9wdGlvbnModGhpcyxCb29sZWFuKHByb3BzLm11bHRpcGxlKSx2 YWx1ZSl9fX1mdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0ob3duZXIpe2lmKG93 bmVyKXt2YXIgbmFtZT1vd25lci5nZXROYW1lKCk7aWYobmFtZSl7cmV0dXJuIiBDaGVjayB0aGUg cmVuZGVyIG1ldGhvZCBvZiBgIituYW1lKyJgLiJ9fXJldHVybiIifXZhciB2YWx1ZVByb3BOYW1l cz1bInZhbHVlIiwiZGVmYXVsdFZhbHVlIl07ZnVuY3Rpb24gY2hlY2tTZWxlY3RQcm9wVHlwZXMo aW5zdCxwcm9wcyl7dmFyIG93bmVyPWluc3QuX2N1cnJlbnRFbGVtZW50Ll9vd25lcjtMaW5rZWRW YWx1ZVV0aWxzLmNoZWNrUHJvcFR5cGVzKCJzZWxlY3QiLHByb3BzLG93bmVyKTtpZihwcm9wcy52 YWx1ZUxpbmshPT11bmRlZmluZWQmJiFkaWRXYXJuVmFsdWVMaW5rKXsiZGV2ZWxvcG1lbnQiIT09 InByb2R1Y3Rpb24iP3dhcm5pbmcoZmFsc2UsImB2YWx1ZUxpbmtgIHByb3Agb24gYHNlbGVjdGAg aXMgZGVwcmVjYXRlZDsgc2V0IGB2YWx1ZWAgYW5kIGBvbkNoYW5nZWAgaW5zdGVhZC4iKTp2b2lk IDA7ZGlkV2FyblZhbHVlTGluaz10cnVlfWZvcih2YXIgaT0wO2k8dmFsdWVQcm9wTmFtZXMubGVu Z3RoO2krKyl7dmFyIHByb3BOYW1lPXZhbHVlUHJvcE5hbWVzW2ldO2lmKHByb3BzW3Byb3BOYW1l XT09bnVsbCl7Y29udGludWV9dmFyIGlzQXJyYXk9QXJyYXkuaXNBcnJheShwcm9wc1twcm9wTmFt ZV0pO2lmKHByb3BzLm11bHRpcGxlJiYhaXNBcnJheSl7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0 aW9uIj93YXJuaW5nKGZhbHNlLCJUaGUgYCVzYCBwcm9wIHN1cHBsaWVkIHRvIDxzZWxlY3Q+IG11 c3QgYmUgYW4gYXJyYXkgaWYgIisiYG11bHRpcGxlYCBpcyB0cnVlLiVzIixwcm9wTmFtZSxnZXRE ZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0ob3duZXIpKTp2b2lkIDB9ZWxzZSBpZighcHJvcHMubXVs dGlwbGUmJmlzQXJyYXkpeyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyhmYWxz ZSwiVGhlIGAlc2AgcHJvcCBzdXBwbGllZCB0byA8c2VsZWN0PiBtdXN0IGJlIGEgc2NhbGFyICIr InZhbHVlIGlmIGBtdWx0aXBsZWAgaXMgZmFsc2UuJXMiLHByb3BOYW1lLGdldERlY2xhcmF0aW9u RXJyb3JBZGRlbmR1bShvd25lcikpOnZvaWQgMH19fWZ1bmN0aW9uIHVwZGF0ZU9wdGlvbnMoaW5z dCxtdWx0aXBsZSxwcm9wVmFsdWUpe3ZhciBzZWxlY3RlZFZhbHVlLGk7dmFyIG9wdGlvbnM9UmVh Y3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCkub3B0aW9ucztpZiht dWx0aXBsZSl7c2VsZWN0ZWRWYWx1ZT17fTtmb3IoaT0wO2k8cHJvcFZhbHVlLmxlbmd0aDtpKysp e3NlbGVjdGVkVmFsdWVbIiIrcHJvcFZhbHVlW2ldXT10cnVlfWZvcihpPTA7aTxvcHRpb25zLmxl bmd0aDtpKyspe3ZhciBzZWxlY3RlZD1zZWxlY3RlZFZhbHVlLmhhc093blByb3BlcnR5KG9wdGlv bnNbaV0udmFsdWUpO2lmKG9wdGlvbnNbaV0uc2VsZWN0ZWQhPT1zZWxlY3RlZCl7b3B0aW9uc1tp XS5zZWxlY3RlZD1zZWxlY3RlZH19fWVsc2V7c2VsZWN0ZWRWYWx1ZT0iIitwcm9wVmFsdWU7Zm9y KGk9MDtpPG9wdGlvbnMubGVuZ3RoO2krKyl7aWYob3B0aW9uc1tpXS52YWx1ZT09PXNlbGVjdGVk VmFsdWUpe29wdGlvbnNbaV0uc2VsZWN0ZWQ9dHJ1ZTtyZXR1cm59fWlmKG9wdGlvbnMubGVuZ3Ro KXtvcHRpb25zWzBdLnNlbGVjdGVkPXRydWV9fX12YXIgUmVhY3RET01TZWxlY3Q9e2dldEhvc3RQ cm9wczpmdW5jdGlvbihpbnN0LHByb3BzKXtyZXR1cm4gX2Fzc2lnbih7fSxwcm9wcyx7b25DaGFu Z2U6aW5zdC5fd3JhcHBlclN0YXRlLm9uQ2hhbmdlLHZhbHVlOnVuZGVmaW5lZH0pfSxtb3VudFdy YXBwZXI6ZnVuY3Rpb24oaW5zdCxwcm9wcyl7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9u Iil7Y2hlY2tTZWxlY3RQcm9wVHlwZXMoaW5zdCxwcm9wcyl9dmFyIHZhbHVlPUxpbmtlZFZhbHVl VXRpbHMuZ2V0VmFsdWUocHJvcHMpO2luc3QuX3dyYXBwZXJTdGF0ZT17cGVuZGluZ1VwZGF0ZTpm YWxzZSxpbml0aWFsVmFsdWU6dmFsdWUhPW51bGw/dmFsdWU6cHJvcHMuZGVmYXVsdFZhbHVlLGxp c3RlbmVyczpudWxsLG9uQ2hhbmdlOl9oYW5kbGVDaGFuZ2UuYmluZChpbnN0KSx3YXNNdWx0aXBs ZTpCb29sZWFuKHByb3BzLm11bHRpcGxlKX07aWYocHJvcHMudmFsdWUhPT11bmRlZmluZWQmJnBy b3BzLmRlZmF1bHRWYWx1ZSE9PXVuZGVmaW5lZCYmIWRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSl7 ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKGZhbHNlLCJTZWxlY3QgZWxlbWVu dHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgIisiKHNwZWNpZnkg ZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3Qg IisiYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xs ZWQgc2VsZWN0ICIrImVsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUg aW5mbzogIisiaHR0cHM6Ly9mYi5tZS9yZWFjdC1jb250cm9sbGVkLWNvbXBvbmVudHMiKTp2b2lk IDA7ZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlPXRydWV9fSxnZXRTZWxlY3RWYWx1ZUNvbnRleHQ6 ZnVuY3Rpb24oaW5zdCl7cmV0dXJuIGluc3QuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWV9LHBv c3RVcGRhdGVXcmFwcGVyOmZ1bmN0aW9uKGluc3Qpe3ZhciBwcm9wcz1pbnN0Ll9jdXJyZW50RWxl bWVudC5wcm9wcztpbnN0Ll93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlPXVuZGVmaW5lZDt2YXIg d2FzTXVsdGlwbGU9aW5zdC5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlO2luc3QuX3dyYXBwZXJT dGF0ZS53YXNNdWx0aXBsZT1Cb29sZWFuKHByb3BzLm11bHRpcGxlKTt2YXIgdmFsdWU9TGlua2Vk VmFsdWVVdGlscy5nZXRWYWx1ZShwcm9wcyk7aWYodmFsdWUhPW51bGwpe2luc3QuX3dyYXBwZXJT dGF0ZS5wZW5kaW5nVXBkYXRlPWZhbHNlO3VwZGF0ZU9wdGlvbnMoaW5zdCxCb29sZWFuKHByb3Bz Lm11bHRpcGxlKSx2YWx1ZSl9ZWxzZSBpZih3YXNNdWx0aXBsZSE9PUJvb2xlYW4ocHJvcHMubXVs dGlwbGUpKXtpZihwcm9wcy5kZWZhdWx0VmFsdWUhPW51bGwpe3VwZGF0ZU9wdGlvbnMoaW5zdCxC b29sZWFuKHByb3BzLm11bHRpcGxlKSxwcm9wcy5kZWZhdWx0VmFsdWUpfWVsc2V7dXBkYXRlT3B0 aW9ucyhpbnN0LEJvb2xlYW4ocHJvcHMubXVsdGlwbGUpLHByb3BzLm11bHRpcGxlP1tdOiIiKX19 fX07ZnVuY3Rpb24gX2hhbmRsZUNoYW5nZShldmVudCl7dmFyIHByb3BzPXRoaXMuX2N1cnJlbnRF bGVtZW50LnByb3BzO3ZhciByZXR1cm5WYWx1ZT1MaW5rZWRWYWx1ZVV0aWxzLmV4ZWN1dGVPbkNo YW5nZShwcm9wcyxldmVudCk7aWYodGhpcy5fcm9vdE5vZGVJRCl7dGhpcy5fd3JhcHBlclN0YXRl LnBlbmRpbmdVcGRhdGU9dHJ1ZX1SZWFjdFVwZGF0ZXMuYXNhcCh1cGRhdGVPcHRpb25zSWZQZW5k aW5nVXBkYXRlQW5kTW91bnRlZCx0aGlzKTtyZXR1cm4gcmV0dXJuVmFsdWV9bW9kdWxlLmV4cG9y dHM9UmVhY3RET01TZWxlY3R9LHsxNTc6MTU3LDE1ODoxNTgsMjQ6MjQsMzQ6MzQsODI6ODJ9XSw0 NDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBFeGVj dXRpb25FbnZpcm9ubWVudD1fZGVyZXFfKDEzNik7dmFyIGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZz ZXQ9X2RlcmVxXygxMTgpO3ZhciBnZXRUZXh0Q29udGVudEFjY2Vzc29yPV9kZXJlcV8oMTE5KTtm dW5jdGlvbiBpc0NvbGxhcHNlZChhbmNob3JOb2RlLGFuY2hvck9mZnNldCxmb2N1c05vZGUsZm9j dXNPZmZzZXQpe3JldHVybiBhbmNob3JOb2RlPT09Zm9jdXNOb2RlJiZhbmNob3JPZmZzZXQ9PT1m b2N1c09mZnNldH1mdW5jdGlvbiBnZXRJRU9mZnNldHMobm9kZSl7dmFyIHNlbGVjdGlvbj1kb2N1 bWVudC5zZWxlY3Rpb247dmFyIHNlbGVjdGVkUmFuZ2U9c2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7 dmFyIHNlbGVjdGVkTGVuZ3RoPXNlbGVjdGVkUmFuZ2UudGV4dC5sZW5ndGg7dmFyIGZyb21TdGFy dD1zZWxlY3RlZFJhbmdlLmR1cGxpY2F0ZSgpO2Zyb21TdGFydC5tb3ZlVG9FbGVtZW50VGV4dChu b2RlKTtmcm9tU3RhcnQuc2V0RW5kUG9pbnQoIkVuZFRvU3RhcnQiLHNlbGVjdGVkUmFuZ2UpO3Zh ciBzdGFydE9mZnNldD1mcm9tU3RhcnQudGV4dC5sZW5ndGg7dmFyIGVuZE9mZnNldD1zdGFydE9m ZnNldCtzZWxlY3RlZExlbmd0aDtyZXR1cm57c3RhcnQ6c3RhcnRPZmZzZXQsZW5kOmVuZE9mZnNl dH19ZnVuY3Rpb24gZ2V0TW9kZXJuT2Zmc2V0cyhub2RlKXt2YXIgc2VsZWN0aW9uPXdpbmRvdy5n ZXRTZWxlY3Rpb24mJndpbmRvdy5nZXRTZWxlY3Rpb24oKTtpZighc2VsZWN0aW9ufHxzZWxlY3Rp b24ucmFuZ2VDb3VudD09PTApe3JldHVybiBudWxsfXZhciBhbmNob3JOb2RlPXNlbGVjdGlvbi5h bmNob3JOb2RlO3ZhciBhbmNob3JPZmZzZXQ9c2VsZWN0aW9uLmFuY2hvck9mZnNldDt2YXIgZm9j dXNOb2RlPXNlbGVjdGlvbi5mb2N1c05vZGU7dmFyIGZvY3VzT2Zmc2V0PXNlbGVjdGlvbi5mb2N1 c09mZnNldDt2YXIgY3VycmVudFJhbmdlPXNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO3RyeXtjdXJy ZW50UmFuZ2Uuc3RhcnRDb250YWluZXIubm9kZVR5cGU7Y3VycmVudFJhbmdlLmVuZENvbnRhaW5l ci5ub2RlVHlwZX1jYXRjaChlKXtyZXR1cm4gbnVsbH12YXIgaXNTZWxlY3Rpb25Db2xsYXBzZWQ9 aXNDb2xsYXBzZWQoc2VsZWN0aW9uLmFuY2hvck5vZGUsc2VsZWN0aW9uLmFuY2hvck9mZnNldCxz ZWxlY3Rpb24uZm9jdXNOb2RlLHNlbGVjdGlvbi5mb2N1c09mZnNldCk7dmFyIHJhbmdlTGVuZ3Ro PWlzU2VsZWN0aW9uQ29sbGFwc2VkPzA6Y3VycmVudFJhbmdlLnRvU3RyaW5nKCkubGVuZ3RoO3Zh ciB0ZW1wUmFuZ2U9Y3VycmVudFJhbmdlLmNsb25lUmFuZ2UoKTt0ZW1wUmFuZ2Uuc2VsZWN0Tm9k ZUNvbnRlbnRzKG5vZGUpO3RlbXBSYW5nZS5zZXRFbmQoY3VycmVudFJhbmdlLnN0YXJ0Q29udGFp bmVyLGN1cnJlbnRSYW5nZS5zdGFydE9mZnNldCk7dmFyIGlzVGVtcFJhbmdlQ29sbGFwc2VkPWlz Q29sbGFwc2VkKHRlbXBSYW5nZS5zdGFydENvbnRhaW5lcix0ZW1wUmFuZ2Uuc3RhcnRPZmZzZXQs dGVtcFJhbmdlLmVuZENvbnRhaW5lcix0ZW1wUmFuZ2UuZW5kT2Zmc2V0KTt2YXIgc3RhcnQ9aXNU ZW1wUmFuZ2VDb2xsYXBzZWQ/MDp0ZW1wUmFuZ2UudG9TdHJpbmcoKS5sZW5ndGg7dmFyIGVuZD1z dGFydCtyYW5nZUxlbmd0aDt2YXIgZGV0ZWN0aW9uUmFuZ2U9ZG9jdW1lbnQuY3JlYXRlUmFuZ2Uo KTtkZXRlY3Rpb25SYW5nZS5zZXRTdGFydChhbmNob3JOb2RlLGFuY2hvck9mZnNldCk7ZGV0ZWN0 aW9uUmFuZ2Uuc2V0RW5kKGZvY3VzTm9kZSxmb2N1c09mZnNldCk7dmFyIGlzQmFja3dhcmQ9ZGV0 ZWN0aW9uUmFuZ2UuY29sbGFwc2VkO3JldHVybntzdGFydDppc0JhY2t3YXJkP2VuZDpzdGFydCxl bmQ6aXNCYWNrd2FyZD9zdGFydDplbmR9fWZ1bmN0aW9uIHNldElFT2Zmc2V0cyhub2RlLG9mZnNl dHMpe3ZhciByYW5nZT1kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKS5kdXBsaWNhdGUo KTt2YXIgc3RhcnQsZW5kO2lmKG9mZnNldHMuZW5kPT09dW5kZWZpbmVkKXtzdGFydD1vZmZzZXRz LnN0YXJ0O2VuZD1zdGFydH1lbHNlIGlmKG9mZnNldHMuc3RhcnQ+b2Zmc2V0cy5lbmQpe3N0YXJ0 PW9mZnNldHMuZW5kO2VuZD1vZmZzZXRzLnN0YXJ0fWVsc2V7c3RhcnQ9b2Zmc2V0cy5zdGFydDtl bmQ9b2Zmc2V0cy5lbmR9cmFuZ2UubW92ZVRvRWxlbWVudFRleHQobm9kZSk7cmFuZ2UubW92ZVN0 YXJ0KCJjaGFyYWN0ZXIiLHN0YXJ0KTtyYW5nZS5zZXRFbmRQb2ludCgiRW5kVG9TdGFydCIscmFu Z2UpO3JhbmdlLm1vdmVFbmQoImNoYXJhY3RlciIsZW5kLXN0YXJ0KTtyYW5nZS5zZWxlY3QoKX1m dW5jdGlvbiBzZXRNb2Rlcm5PZmZzZXRzKG5vZGUsb2Zmc2V0cyl7aWYoIXdpbmRvdy5nZXRTZWxl Y3Rpb24pe3JldHVybn12YXIgc2VsZWN0aW9uPXdpbmRvdy5nZXRTZWxlY3Rpb24oKTt2YXIgbGVu Z3RoPW5vZGVbZ2V0VGV4dENvbnRlbnRBY2Nlc3NvcigpXS5sZW5ndGg7dmFyIHN0YXJ0PU1hdGgu bWluKG9mZnNldHMuc3RhcnQsbGVuZ3RoKTt2YXIgZW5kPW9mZnNldHMuZW5kPT09dW5kZWZpbmVk P3N0YXJ0Ok1hdGgubWluKG9mZnNldHMuZW5kLGxlbmd0aCk7aWYoIXNlbGVjdGlvbi5leHRlbmQm JnN0YXJ0PmVuZCl7dmFyIHRlbXA9ZW5kO2VuZD1zdGFydDtzdGFydD10ZW1wfXZhciBzdGFydE1h cmtlcj1nZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KG5vZGUsc3RhcnQpO3ZhciBlbmRNYXJrZXI9 Z2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChub2RlLGVuZCk7aWYoc3RhcnRNYXJrZXImJmVuZE1h cmtlcil7dmFyIHJhbmdlPWRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7cmFuZ2Uuc2V0U3RhcnQoc3Rh cnRNYXJrZXIubm9kZSxzdGFydE1hcmtlci5vZmZzZXQpO3NlbGVjdGlvbi5yZW1vdmVBbGxSYW5n ZXMoKTtpZihzdGFydD5lbmQpe3NlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7c2VsZWN0aW9uLmV4 dGVuZChlbmRNYXJrZXIubm9kZSxlbmRNYXJrZXIub2Zmc2V0KX1lbHNle3JhbmdlLnNldEVuZChl bmRNYXJrZXIubm9kZSxlbmRNYXJrZXIub2Zmc2V0KTtzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2Up fX19dmFyIHVzZUlFT2Zmc2V0cz1FeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00mJiJzZWxl Y3Rpb24iaW4gZG9jdW1lbnQmJiEoImdldFNlbGVjdGlvbiJpbiB3aW5kb3cpO3ZhciBSZWFjdERP TVNlbGVjdGlvbj17Z2V0T2Zmc2V0czp1c2VJRU9mZnNldHM/Z2V0SUVPZmZzZXRzOmdldE1vZGVy bk9mZnNldHMsc2V0T2Zmc2V0czp1c2VJRU9mZnNldHM/c2V0SUVPZmZzZXRzOnNldE1vZGVybk9m ZnNldHN9O21vZHVsZS5leHBvcnRzPVJlYWN0RE9NU2VsZWN0aW9ufSx7MTE4OjExOCwxMTk6MTE5 LDEzNjoxMzZ9XSw0NTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJp Y3QiO3ZhciBfcHJvZEludmFyaWFudD1fZGVyZXFfKDEyNSksX2Fzc2lnbj1fZGVyZXFfKDE1OCk7 dmFyIERPTUNoaWxkcmVuT3BlcmF0aW9ucz1fZGVyZXFfKDgpO3ZhciBET01MYXp5VHJlZT1fZGVy ZXFfKDkpO3ZhciBSZWFjdERPTUNvbXBvbmVudFRyZWU9X2RlcmVxXygzNCk7dmFyIGVzY2FwZVRl eHRDb250ZW50Rm9yQnJvd3Nlcj1fZGVyZXFfKDEwNyk7dmFyIGludmFyaWFudD1fZGVyZXFfKDE1 MCk7dmFyIHZhbGlkYXRlRE9NTmVzdGluZz1fZGVyZXFfKDEzMSk7dmFyIFJlYWN0RE9NVGV4dENv bXBvbmVudD1mdW5jdGlvbih0ZXh0KXt0aGlzLl9jdXJyZW50RWxlbWVudD10ZXh0O3RoaXMuX3N0 cmluZ1RleHQ9IiIrdGV4dDt0aGlzLl9ob3N0Tm9kZT1udWxsO3RoaXMuX2hvc3RQYXJlbnQ9bnVs bDt0aGlzLl9kb21JRD0wO3RoaXMuX21vdW50SW5kZXg9MDt0aGlzLl9jbG9zaW5nQ29tbWVudD1u dWxsO3RoaXMuX2NvbW1lbnROb2Rlcz1udWxsfTtfYXNzaWduKFJlYWN0RE9NVGV4dENvbXBvbmVu dC5wcm90b3R5cGUse21vdW50Q29tcG9uZW50OmZ1bmN0aW9uKHRyYW5zYWN0aW9uLGhvc3RQYXJl bnQsaG9zdENvbnRhaW5lckluZm8sY29udGV4dCl7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0 aW9uIil7dmFyIHBhcmVudEluZm87aWYoaG9zdFBhcmVudCE9bnVsbCl7cGFyZW50SW5mbz1ob3N0 UGFyZW50Ll9hbmNlc3RvckluZm99ZWxzZSBpZihob3N0Q29udGFpbmVySW5mbyE9bnVsbCl7cGFy ZW50SW5mbz1ob3N0Q29udGFpbmVySW5mby5fYW5jZXN0b3JJbmZvfWlmKHBhcmVudEluZm8pe3Zh bGlkYXRlRE9NTmVzdGluZyhudWxsLHRoaXMuX3N0cmluZ1RleHQsdGhpcyxwYXJlbnRJbmZvKX19 dmFyIGRvbUlEPWhvc3RDb250YWluZXJJbmZvLl9pZENvdW50ZXIrKzt2YXIgb3BlbmluZ1ZhbHVl PSIgcmVhY3QtdGV4dDogIitkb21JRCsiICI7dmFyIGNsb3NpbmdWYWx1ZT0iIC9yZWFjdC10ZXh0 ICI7dGhpcy5fZG9tSUQ9ZG9tSUQ7dGhpcy5faG9zdFBhcmVudD1ob3N0UGFyZW50O2lmKHRyYW5z YWN0aW9uLnVzZUNyZWF0ZUVsZW1lbnQpe3ZhciBvd25lckRvY3VtZW50PWhvc3RDb250YWluZXJJ bmZvLl9vd25lckRvY3VtZW50O3ZhciBvcGVuaW5nQ29tbWVudD1vd25lckRvY3VtZW50LmNyZWF0 ZUNvbW1lbnQob3BlbmluZ1ZhbHVlKTt2YXIgY2xvc2luZ0NvbW1lbnQ9b3duZXJEb2N1bWVudC5j cmVhdGVDb21tZW50KGNsb3NpbmdWYWx1ZSk7dmFyIGxhenlUcmVlPURPTUxhenlUcmVlKG93bmVy RG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKTtET01MYXp5VHJlZS5xdWV1ZUNoaWxk KGxhenlUcmVlLERPTUxhenlUcmVlKG9wZW5pbmdDb21tZW50KSk7aWYodGhpcy5fc3RyaW5nVGV4 dCl7RE9NTGF6eVRyZWUucXVldWVDaGlsZChsYXp5VHJlZSxET01MYXp5VHJlZShvd25lckRvY3Vt ZW50LmNyZWF0ZVRleHROb2RlKHRoaXMuX3N0cmluZ1RleHQpKSl9RE9NTGF6eVRyZWUucXVldWVD aGlsZChsYXp5VHJlZSxET01MYXp5VHJlZShjbG9zaW5nQ29tbWVudCkpO1JlYWN0RE9NQ29tcG9u ZW50VHJlZS5wcmVjYWNoZU5vZGUodGhpcyxvcGVuaW5nQ29tbWVudCk7dGhpcy5fY2xvc2luZ0Nv bW1lbnQ9Y2xvc2luZ0NvbW1lbnQ7cmV0dXJuIGxhenlUcmVlfWVsc2V7dmFyIGVzY2FwZWRUZXh0 PWVzY2FwZVRleHRDb250ZW50Rm9yQnJvd3Nlcih0aGlzLl9zdHJpbmdUZXh0KTtpZih0cmFuc2Fj dGlvbi5yZW5kZXJUb1N0YXRpY01hcmt1cCl7cmV0dXJuIGVzY2FwZWRUZXh0fXJldHVybiJceDNj IS0tIitvcGVuaW5nVmFsdWUrIi0tXHgzZSIrZXNjYXBlZFRleHQrIlx4M2MhLS0iK2Nsb3NpbmdW YWx1ZSsiLS1ceDNlIn19LHJlY2VpdmVDb21wb25lbnQ6ZnVuY3Rpb24obmV4dFRleHQsdHJhbnNh Y3Rpb24pe2lmKG5leHRUZXh0IT09dGhpcy5fY3VycmVudEVsZW1lbnQpe3RoaXMuX2N1cnJlbnRF bGVtZW50PW5leHRUZXh0O3ZhciBuZXh0U3RyaW5nVGV4dD0iIituZXh0VGV4dDtpZihuZXh0U3Ry aW5nVGV4dCE9PXRoaXMuX3N0cmluZ1RleHQpe3RoaXMuX3N0cmluZ1RleHQ9bmV4dFN0cmluZ1Rl eHQ7dmFyIGNvbW1lbnROb2Rlcz10aGlzLmdldEhvc3ROb2RlKCk7RE9NQ2hpbGRyZW5PcGVyYXRp b25zLnJlcGxhY2VEZWxpbWl0ZWRUZXh0KGNvbW1lbnROb2Rlc1swXSxjb21tZW50Tm9kZXNbMV0s bmV4dFN0cmluZ1RleHQpfX19LGdldEhvc3ROb2RlOmZ1bmN0aW9uKCl7dmFyIGhvc3ROb2RlPXRo aXMuX2NvbW1lbnROb2RlcztpZihob3N0Tm9kZSl7cmV0dXJuIGhvc3ROb2RlfWlmKCF0aGlzLl9j bG9zaW5nQ29tbWVudCl7dmFyIG9wZW5pbmdDb21tZW50PVJlYWN0RE9NQ29tcG9uZW50VHJlZS5n ZXROb2RlRnJvbUluc3RhbmNlKHRoaXMpO3ZhciBub2RlPW9wZW5pbmdDb21tZW50Lm5leHRTaWJs aW5nO3doaWxlKHRydWUpeyEobm9kZSE9bnVsbCk/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9u Ij9pbnZhcmlhbnQoZmFsc2UsIk1pc3NpbmcgY2xvc2luZyBjb21tZW50IGZvciB0ZXh0IGNvbXBv bmVudCAlcyIsdGhpcy5fZG9tSUQpOl9wcm9kSW52YXJpYW50KCI2NyIsdGhpcy5fZG9tSUQpOnZv aWQgMDtpZihub2RlLm5vZGVUeXBlPT09OCYmbm9kZS5ub2RlVmFsdWU9PT0iIC9yZWFjdC10ZXh0 ICIpe3RoaXMuX2Nsb3NpbmdDb21tZW50PW5vZGU7YnJlYWt9bm9kZT1ub2RlLm5leHRTaWJsaW5n fX1ob3N0Tm9kZT1bdGhpcy5faG9zdE5vZGUsdGhpcy5fY2xvc2luZ0NvbW1lbnRdO3RoaXMuX2Nv bW1lbnROb2Rlcz1ob3N0Tm9kZTtyZXR1cm4gaG9zdE5vZGV9LHVubW91bnRDb21wb25lbnQ6ZnVu Y3Rpb24oKXt0aGlzLl9jbG9zaW5nQ29tbWVudD1udWxsO3RoaXMuX2NvbW1lbnROb2Rlcz1udWxs O1JlYWN0RE9NQ29tcG9uZW50VHJlZS51bmNhY2hlTm9kZSh0aGlzKX19KTttb2R1bGUuZXhwb3J0 cz1SZWFjdERPTVRleHRDb21wb25lbnR9LHsxMDc6MTA3LDEyNToxMjUsMTMxOjEzMSwxNTA6MTUw LDE1ODoxNTgsMzQ6MzQsODo4LDk6OX1dLDQ2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBv cnRzKXsidXNlIHN0cmljdCI7dmFyIF9wcm9kSW52YXJpYW50PV9kZXJlcV8oMTI1KSxfYXNzaWdu PV9kZXJlcV8oMTU4KTt2YXIgTGlua2VkVmFsdWVVdGlscz1fZGVyZXFfKDI0KTt2YXIgUmVhY3RE T01Db21wb25lbnRUcmVlPV9kZXJlcV8oMzQpO3ZhciBSZWFjdFVwZGF0ZXM9X2RlcmVxXyg4Mik7 dmFyIGludmFyaWFudD1fZGVyZXFfKDE1MCk7dmFyIHdhcm5pbmc9X2RlcmVxXygxNTcpO3ZhciBk aWRXYXJuVmFsdWVMaW5rPWZhbHNlO3ZhciBkaWRXYXJuVmFsRGVmYXVsdFZhbD1mYWxzZTtmdW5j dGlvbiBmb3JjZVVwZGF0ZUlmTW91bnRlZCgpe2lmKHRoaXMuX3Jvb3ROb2RlSUQpe1JlYWN0RE9N VGV4dGFyZWEudXBkYXRlV3JhcHBlcih0aGlzKX19dmFyIFJlYWN0RE9NVGV4dGFyZWE9e2dldEhv c3RQcm9wczpmdW5jdGlvbihpbnN0LHByb3BzKXshKHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJI VE1MPT1udWxsKT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwi YGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYCBkb2VzIG5vdCBtYWtlIHNlbnNlIG9uIDx0ZXh0YXJl YT4uIik6X3Byb2RJbnZhcmlhbnQoIjkxIik6dm9pZCAwO3ZhciBob3N0UHJvcHM9X2Fzc2lnbih7 fSxwcm9wcyx7dmFsdWU6dW5kZWZpbmVkLGRlZmF1bHRWYWx1ZTp1bmRlZmluZWQsY2hpbGRyZW46 IiIraW5zdC5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSxvbkNoYW5nZTppbnN0Ll93cmFwcGVy U3RhdGUub25DaGFuZ2V9KTtyZXR1cm4gaG9zdFByb3BzfSxtb3VudFdyYXBwZXI6ZnVuY3Rpb24o aW5zdCxwcm9wcyl7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7TGlua2VkVmFsdWVV dGlscy5jaGVja1Byb3BUeXBlcygidGV4dGFyZWEiLHByb3BzLGluc3QuX2N1cnJlbnRFbGVtZW50 Ll9vd25lcik7aWYocHJvcHMudmFsdWVMaW5rIT09dW5kZWZpbmVkJiYhZGlkV2FyblZhbHVlTGlu ayl7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKGZhbHNlLCJgdmFsdWVMaW5r YCBwcm9wIG9uIGB0ZXh0YXJlYWAgaXMgZGVwcmVjYXRlZDsgc2V0IGB2YWx1ZWAgYW5kIGBvbkNo YW5nZWAgaW5zdGVhZC4iKTp2b2lkIDA7ZGlkV2FyblZhbHVlTGluaz10cnVlfWlmKHByb3BzLnZh bHVlIT09dW5kZWZpbmVkJiZwcm9wcy5kZWZhdWx0VmFsdWUhPT11bmRlZmluZWQmJiFkaWRXYXJu VmFsRGVmYXVsdFZhbCl7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKGZhbHNl LCJUZXh0YXJlYSBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJv bGxlZCAiKyIoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFs dWUgcHJvcCwgYnV0IG5vdCAiKyJib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9s bGVkIG9yIHVuY29udHJvbGxlZCB0ZXh0YXJlYSAiKyJhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBw cm9wcy4gTW9yZSBpbmZvOiAiKyJodHRwczovL2ZiLm1lL3JlYWN0LWNvbnRyb2xsZWQtY29tcG9u ZW50cyIpOnZvaWQgMDtkaWRXYXJuVmFsRGVmYXVsdFZhbD10cnVlfX12YXIgdmFsdWU9TGlua2Vk VmFsdWVVdGlscy5nZXRWYWx1ZShwcm9wcyk7dmFyIGluaXRpYWxWYWx1ZT12YWx1ZTtpZih2YWx1 ZT09bnVsbCl7dmFyIGRlZmF1bHRWYWx1ZT1wcm9wcy5kZWZhdWx0VmFsdWU7dmFyIGNoaWxkcmVu PXByb3BzLmNoaWxkcmVuO2lmKGNoaWxkcmVuIT1udWxsKXtpZigiZGV2ZWxvcG1lbnQiIT09InBy b2R1Y3Rpb24iKXsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmcoZmFsc2UsIlVz ZSB0aGUgYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBwcm9wcyBpbnN0ZWFkIG9mIHNldHRpbmcg IisiY2hpbGRyZW4gb24gPHRleHRhcmVhPi4iKTp2b2lkIDB9IShkZWZhdWx0VmFsdWU9PW51bGwp PyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJJZiB5b3Ugc3Vw cGx5IGBkZWZhdWx0VmFsdWVgIG9uIGEgPHRleHRhcmVhPiwgZG8gbm90IHBhc3MgY2hpbGRyZW4u Iik6X3Byb2RJbnZhcmlhbnQoIjkyIik6dm9pZCAwO2lmKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4p KXshKGNoaWxkcmVuLmxlbmd0aDw9MSk/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZh cmlhbnQoZmFsc2UsIjx0ZXh0YXJlYT4gY2FuIG9ubHkgaGF2ZSBhdCBtb3N0IG9uZSBjaGlsZC4i KTpfcHJvZEludmFyaWFudCgiOTMiKTp2b2lkIDA7Y2hpbGRyZW49Y2hpbGRyZW5bMF19ZGVmYXVs dFZhbHVlPSIiK2NoaWxkcmVufWlmKGRlZmF1bHRWYWx1ZT09bnVsbCl7ZGVmYXVsdFZhbHVlPSIi fWluaXRpYWxWYWx1ZT1kZWZhdWx0VmFsdWV9aW5zdC5fd3JhcHBlclN0YXRlPXtpbml0aWFsVmFs dWU6IiIraW5pdGlhbFZhbHVlLGxpc3RlbmVyczpudWxsLG9uQ2hhbmdlOl9oYW5kbGVDaGFuZ2Uu YmluZChpbnN0KX19LHVwZGF0ZVdyYXBwZXI6ZnVuY3Rpb24oaW5zdCl7dmFyIHByb3BzPWluc3Qu X2N1cnJlbnRFbGVtZW50LnByb3BzO3ZhciBub2RlPVJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRO b2RlRnJvbUluc3RhbmNlKGluc3QpO3ZhciB2YWx1ZT1MaW5rZWRWYWx1ZVV0aWxzLmdldFZhbHVl KHByb3BzKTtpZih2YWx1ZSE9bnVsbCl7dmFyIG5ld1ZhbHVlPSIiK3ZhbHVlO2lmKG5ld1ZhbHVl IT09bm9kZS52YWx1ZSl7bm9kZS52YWx1ZT1uZXdWYWx1ZX1pZihwcm9wcy5kZWZhdWx0VmFsdWU9 PW51bGwpe25vZGUuZGVmYXVsdFZhbHVlPW5ld1ZhbHVlfX1pZihwcm9wcy5kZWZhdWx0VmFsdWUh PW51bGwpe25vZGUuZGVmYXVsdFZhbHVlPXByb3BzLmRlZmF1bHRWYWx1ZX19LHBvc3RNb3VudFdy YXBwZXI6ZnVuY3Rpb24oaW5zdCl7dmFyIG5vZGU9UmVhY3RET01Db21wb25lbnRUcmVlLmdldE5v ZGVGcm9tSW5zdGFuY2UoaW5zdCk7dmFyIHRleHRDb250ZW50PW5vZGUudGV4dENvbnRlbnQ7aWYo dGV4dENvbnRlbnQ9PT1pbnN0Ll93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKXtub2RlLnZhbHVl PXRleHRDb250ZW50fX19O2Z1bmN0aW9uIF9oYW5kbGVDaGFuZ2UoZXZlbnQpe3ZhciBwcm9wcz10 aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wczt2YXIgcmV0dXJuVmFsdWU9TGlua2VkVmFsdWVVdGls cy5leGVjdXRlT25DaGFuZ2UocHJvcHMsZXZlbnQpO1JlYWN0VXBkYXRlcy5hc2FwKGZvcmNlVXBk YXRlSWZNb3VudGVkLHRoaXMpO3JldHVybiByZXR1cm5WYWx1ZX1tb2R1bGUuZXhwb3J0cz1SZWFj dERPTVRleHRhcmVhfSx7MTI1OjEyNSwxNTA6MTUwLDE1NzoxNTcsMTU4OjE1OCwyNDoyNCwzNDoz NCw4Mjo4Mn1dLDQ3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmlj dCI7dmFyIF9wcm9kSW52YXJpYW50PV9kZXJlcV8oMTI1KTt2YXIgaW52YXJpYW50PV9kZXJlcV8o MTUwKTtmdW5jdGlvbiBnZXRMb3dlc3RDb21tb25BbmNlc3RvcihpbnN0QSxpbnN0Qil7ISgiX2hv c3ROb2RlImluIGluc3RBKT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChm YWxzZSwiZ2V0Tm9kZUZyb21JbnN0YW5jZTogSW52YWxpZCBhcmd1bWVudC4iKTpfcHJvZEludmFy aWFudCgiMzMiKTp2b2lkIDA7ISgiX2hvc3ROb2RlImluIGluc3RCKT8iZGV2ZWxvcG1lbnQiIT09 InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiZ2V0Tm9kZUZyb21JbnN0YW5jZTogSW52YWxp ZCBhcmd1bWVudC4iKTpfcHJvZEludmFyaWFudCgiMzMiKTp2b2lkIDA7dmFyIGRlcHRoQT0wO2Zv cih2YXIgdGVtcEE9aW5zdEE7dGVtcEE7dGVtcEE9dGVtcEEuX2hvc3RQYXJlbnQpe2RlcHRoQSsr fXZhciBkZXB0aEI9MDtmb3IodmFyIHRlbXBCPWluc3RCO3RlbXBCO3RlbXBCPXRlbXBCLl9ob3N0 UGFyZW50KXtkZXB0aEIrK313aGlsZShkZXB0aEEtZGVwdGhCPjApe2luc3RBPWluc3RBLl9ob3N0 UGFyZW50O2RlcHRoQS0tfXdoaWxlKGRlcHRoQi1kZXB0aEE+MCl7aW5zdEI9aW5zdEIuX2hvc3RQ YXJlbnQ7ZGVwdGhCLS19dmFyIGRlcHRoPWRlcHRoQTt3aGlsZShkZXB0aC0tKXtpZihpbnN0QT09 PWluc3RCKXtyZXR1cm4gaW5zdEF9aW5zdEE9aW5zdEEuX2hvc3RQYXJlbnQ7aW5zdEI9aW5zdEIu X2hvc3RQYXJlbnR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gaXNBbmNlc3RvcihpbnN0QSxpbnN0Qil7 ISgiX2hvc3ROb2RlImluIGluc3RBKT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFy aWFudChmYWxzZSwiaXNBbmNlc3RvcjogSW52YWxpZCBhcmd1bWVudC4iKTpfcHJvZEludmFyaWFu dCgiMzUiKTp2b2lkIDA7ISgiX2hvc3ROb2RlImluIGluc3RCKT8iZGV2ZWxvcG1lbnQiIT09InBy b2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiaXNBbmNlc3RvcjogSW52YWxpZCBhcmd1bWVudC4i KTpfcHJvZEludmFyaWFudCgiMzUiKTp2b2lkIDA7d2hpbGUoaW5zdEIpe2lmKGluc3RCPT09aW5z dEEpe3JldHVybiB0cnVlfWluc3RCPWluc3RCLl9ob3N0UGFyZW50fXJldHVybiBmYWxzZX1mdW5j dGlvbiBnZXRQYXJlbnRJbnN0YW5jZShpbnN0KXshKCJfaG9zdE5vZGUiaW4gaW5zdCk/ImRldmVs b3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsImdldFBhcmVudEluc3RhbmNl OiBJbnZhbGlkIGFyZ3VtZW50LiIpOl9wcm9kSW52YXJpYW50KCIzNiIpOnZvaWQgMDtyZXR1cm4g aW5zdC5faG9zdFBhcmVudH1mdW5jdGlvbiB0cmF2ZXJzZVR3b1BoYXNlKGluc3QsZm4sYXJnKXt2 YXIgcGF0aD1bXTt3aGlsZShpbnN0KXtwYXRoLnB1c2goaW5zdCk7aW5zdD1pbnN0Ll9ob3N0UGFy ZW50fXZhciBpO2ZvcihpPXBhdGgubGVuZ3RoO2ktLSA+MDspe2ZuKHBhdGhbaV0sImNhcHR1cmVk IixhcmcpfWZvcihpPTA7aTxwYXRoLmxlbmd0aDtpKyspe2ZuKHBhdGhbaV0sImJ1YmJsZWQiLGFy Zyl9fWZ1bmN0aW9uIHRyYXZlcnNlRW50ZXJMZWF2ZShmcm9tLHRvLGZuLGFyZ0Zyb20sYXJnVG8p e3ZhciBjb21tb249ZnJvbSYmdG8/Z2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoZnJvbSx0byk6bnVs bDt2YXIgcGF0aEZyb209W107d2hpbGUoZnJvbSYmZnJvbSE9PWNvbW1vbil7cGF0aEZyb20ucHVz aChmcm9tKTtmcm9tPWZyb20uX2hvc3RQYXJlbnR9dmFyIHBhdGhUbz1bXTt3aGlsZSh0byYmdG8h PT1jb21tb24pe3BhdGhUby5wdXNoKHRvKTt0bz10by5faG9zdFBhcmVudH12YXIgaTtmb3IoaT0w O2k8cGF0aEZyb20ubGVuZ3RoO2krKyl7Zm4ocGF0aEZyb21baV0sImJ1YmJsZWQiLGFyZ0Zyb20p fWZvcihpPXBhdGhUby5sZW5ndGg7aS0tID4wOyl7Zm4ocGF0aFRvW2ldLCJjYXB0dXJlZCIsYXJn VG8pfX1tb2R1bGUuZXhwb3J0cz17aXNBbmNlc3Rvcjppc0FuY2VzdG9yLGdldExvd2VzdENvbW1v bkFuY2VzdG9yOmdldExvd2VzdENvbW1vbkFuY2VzdG9yLGdldFBhcmVudEluc3RhbmNlOmdldFBh cmVudEluc3RhbmNlLHRyYXZlcnNlVHdvUGhhc2U6dHJhdmVyc2VUd29QaGFzZSx0cmF2ZXJzZUVu dGVyTGVhdmU6dHJhdmVyc2VFbnRlckxlYXZlfX0sezEyNToxMjUsMTUwOjE1MH1dLDQ4OltmdW5j dGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIFJlYWN0PV9kZXJl cV8oMTM0KTt2YXIgUmVhY3RET009X2RlcmVxXygzMSk7dmFyIFJlYWN0RE9NVU1ERW50cnk9UmVh Y3RET007aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7UmVhY3RET01VTURFbnRyeS5f X1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRD17UmVhY3RQ ZXJmOl9kZXJlcV8oNzEpLFJlYWN0VGVzdFV0aWxzOl9kZXJlcV8oODApfX1pZihSZWFjdC5hZGRv bnMpe1JlYWN0Ll9fU0VDUkVUX0lOSkVDVEVEX1JFQUNUX0RPTV9ET19OT1RfVVNFX09SX1lPVV9X SUxMX0JFX0ZJUkVEPVJlYWN0RE9NVU1ERW50cnl9bW9kdWxlLmV4cG9ydHM9UmVhY3RET01VTURF bnRyeX0sezEzNDoxMzQsMzE6MzEsNzE6NzEsODA6ODB9XSw0OTpbZnVuY3Rpb24oX2RlcmVxXyxt b2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBET01Qcm9wZXJ0eT1fZGVyZXFfKDExKTt2 YXIgRXZlbnRQbHVnaW5SZWdpc3RyeT1fZGVyZXFfKDE4KTt2YXIgUmVhY3RDb21wb25lbnRUcmVl SG9vaz1fZGVyZXFfKDEzMik7dmFyIHdhcm5pbmc9X2RlcmVxXygxNTcpO2lmKCJkZXZlbG9wbWVu dCIhPT0icHJvZHVjdGlvbiIpe3ZhciByZWFjdFByb3BzPXtjaGlsZHJlbjp0cnVlLGRhbmdlcm91 c2x5U2V0SW5uZXJIVE1MOnRydWUsa2V5OnRydWUscmVmOnRydWUsYXV0b0ZvY3VzOnRydWUsZGVm YXVsdFZhbHVlOnRydWUsdmFsdWVMaW5rOnRydWUsZGVmYXVsdENoZWNrZWQ6dHJ1ZSxjaGVja2Vk TGluazp0cnVlLGlubmVySFRNTDp0cnVlLHN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZzp0 cnVlLG9uRm9jdXNJbjp0cnVlLG9uRm9jdXNPdXQ6dHJ1ZX07dmFyIHdhcm5lZFByb3BlcnRpZXM9 e307dmFyIHZhbGlkYXRlUHJvcGVydHk9ZnVuY3Rpb24odGFnTmFtZSxuYW1lLGRlYnVnSUQpe2lm KERPTVByb3BlcnR5LnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSl8fERPTVByb3BlcnR5 LmlzQ3VzdG9tQXR0cmlidXRlKG5hbWUpKXtyZXR1cm4gdHJ1ZX1pZihyZWFjdFByb3BzLmhhc093 blByb3BlcnR5KG5hbWUpJiZyZWFjdFByb3BzW25hbWVdfHx3YXJuZWRQcm9wZXJ0aWVzLmhhc093 blByb3BlcnR5KG5hbWUpJiZ3YXJuZWRQcm9wZXJ0aWVzW25hbWVdKXtyZXR1cm4gdHJ1ZX1pZihF dmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzLmhhc093blByb3BlcnR5 KG5hbWUpKXtyZXR1cm4gdHJ1ZX13YXJuZWRQcm9wZXJ0aWVzW25hbWVdPXRydWU7dmFyIGxvd2Vy Q2FzZWROYW1lPW5hbWUudG9Mb3dlckNhc2UoKTt2YXIgc3RhbmRhcmROYW1lPURPTVByb3BlcnR5 LmlzQ3VzdG9tQXR0cmlidXRlKGxvd2VyQ2FzZWROYW1lKT9sb3dlckNhc2VkTmFtZTpET01Qcm9w ZXJ0eS5nZXRQb3NzaWJsZVN0YW5kYXJkTmFtZS5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFt ZSk/RE9NUHJvcGVydHkuZ2V0UG9zc2libGVTdGFuZGFyZE5hbWVbbG93ZXJDYXNlZE5hbWVdOm51 bGw7dmFyIHJlZ2lzdHJhdGlvbk5hbWU9RXZlbnRQbHVnaW5SZWdpc3RyeS5wb3NzaWJsZVJlZ2lz dHJhdGlvbk5hbWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKT9FdmVudFBsdWdpblJl Z2lzdHJ5LnBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXNbbG93ZXJDYXNlZE5hbWVdOm51bGw7aWYo c3RhbmRhcmROYW1lIT1udWxsKXsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmco ZmFsc2UsIlVua25vd24gRE9NIHByb3BlcnR5ICVzLiBEaWQgeW91IG1lYW4gJXM/JXMiLG5hbWUs c3RhbmRhcmROYW1lLFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0U3RhY2tBZGRlbmR1bUJ5SUQo ZGVidWdJRCkpOnZvaWQgMDtyZXR1cm4gdHJ1ZX1lbHNlIGlmKHJlZ2lzdHJhdGlvbk5hbWUhPW51 bGwpeyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyhmYWxzZSwiVW5rbm93biBl dmVudCBoYW5kbGVyIHByb3BlcnR5ICVzLiBEaWQgeW91IG1lYW4gYCVzYD8lcyIsbmFtZSxyZWdp c3RyYXRpb25OYW1lLFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0U3RhY2tBZGRlbmR1bUJ5SUQo ZGVidWdJRCkpOnZvaWQgMDtyZXR1cm4gdHJ1ZX1lbHNle3JldHVybiBmYWxzZX19fXZhciB3YXJu VW5rbm93blByb3BlcnRpZXM9ZnVuY3Rpb24oZGVidWdJRCxlbGVtZW50KXt2YXIgdW5rbm93blBy b3BzPVtdO2Zvcih2YXIga2V5IGluIGVsZW1lbnQucHJvcHMpe3ZhciBpc1ZhbGlkPXZhbGlkYXRl UHJvcGVydHkoZWxlbWVudC50eXBlLGtleSxkZWJ1Z0lEKTtpZighaXNWYWxpZCl7dW5rbm93blBy b3BzLnB1c2goa2V5KX19dmFyIHVua25vd25Qcm9wU3RyaW5nPXVua25vd25Qcm9wcy5tYXAoZnVu Y3Rpb24ocHJvcCl7cmV0dXJuImAiK3Byb3ArImAifSkuam9pbigiLCAiKTtpZih1bmtub3duUHJv cHMubGVuZ3RoPT09MSl7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKGZhbHNl LCJVbmtub3duIHByb3AgJXMgb24gPCVzPiB0YWcuIFJlbW92ZSB0aGlzIHByb3AgZnJvbSB0aGUg ZWxlbWVudC4gIisiRm9yIGRldGFpbHMsIHNlZSBodHRwczovL2ZiLm1lL3JlYWN0LXVua25vd24t cHJvcCVzIix1bmtub3duUHJvcFN0cmluZyxlbGVtZW50LnR5cGUsUmVhY3RDb21wb25lbnRUcmVl SG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChkZWJ1Z0lEKSk6dm9pZCAwfWVsc2UgaWYodW5rbm93 blByb3BzLmxlbmd0aD4xKXsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmcoZmFs c2UsIlVua25vd24gcHJvcHMgJXMgb24gPCVzPiB0YWcuIFJlbW92ZSB0aGVzZSBwcm9wcyBmcm9t IHRoZSBlbGVtZW50LiAiKyJGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vZmIubWUvcmVhY3QtdW5r bm93bi1wcm9wJXMiLHVua25vd25Qcm9wU3RyaW5nLGVsZW1lbnQudHlwZSxSZWFjdENvbXBvbmVu dFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKGRlYnVnSUQpKTp2b2lkIDB9fTtmdW5jdGlv biBoYW5kbGVFbGVtZW50KGRlYnVnSUQsZWxlbWVudCl7aWYoZWxlbWVudD09bnVsbHx8dHlwZW9m IGVsZW1lbnQudHlwZSE9PSJzdHJpbmciKXtyZXR1cm59aWYoZWxlbWVudC50eXBlLmluZGV4T2Yo Ii0iKT49MHx8ZWxlbWVudC5wcm9wcy5pcyl7cmV0dXJufXdhcm5Vbmtub3duUHJvcGVydGllcyhk ZWJ1Z0lELGVsZW1lbnQpfXZhciBSZWFjdERPTVVua25vd25Qcm9wZXJ0eUhvb2s9e29uQmVmb3Jl TW91bnRDb21wb25lbnQ6ZnVuY3Rpb24oZGVidWdJRCxlbGVtZW50KXtoYW5kbGVFbGVtZW50KGRl YnVnSUQsZWxlbWVudCl9LG9uQmVmb3JlVXBkYXRlQ29tcG9uZW50OmZ1bmN0aW9uKGRlYnVnSUQs ZWxlbWVudCl7aGFuZGxlRWxlbWVudChkZWJ1Z0lELGVsZW1lbnQpfX07bW9kdWxlLmV4cG9ydHM9 UmVhY3RET01Vbmtub3duUHJvcGVydHlIb29rfSx7MTE6MTEsMTMyOjEzMiwxNTc6MTU3LDE4OjE4 fV0sNTA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIg UmVhY3RJbnZhbGlkU2V0U3RhdGVXYXJuaW5nSG9vaz1fZGVyZXFfKDY1KTt2YXIgUmVhY3RIb3N0 T3BlcmF0aW9uSGlzdG9yeUhvb2s9X2RlcmVxXyg2MCk7dmFyIFJlYWN0Q29tcG9uZW50VHJlZUhv b2s9X2RlcmVxXygxMzIpO3ZhciBFeGVjdXRpb25FbnZpcm9ubWVudD1fZGVyZXFfKDEzNik7dmFy IHBlcmZvcm1hbmNlTm93PV9kZXJlcV8oMTU1KTt2YXIgd2FybmluZz1fZGVyZXFfKDE1Nyk7dmFy IGhvb2tzPVtdO3ZhciBkaWRIb29rVGhyb3dGb3JFdmVudD17fTtmdW5jdGlvbiBjYWxsSG9vayhl dmVudCxmbixjb250ZXh0LGFyZzEsYXJnMixhcmczLGFyZzQsYXJnNSl7dHJ5e2ZuLmNhbGwoY29u dGV4dCxhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUpfWNhdGNoKGUpeyJkZXZlbG9wbWVudCIhPT0i cHJvZHVjdGlvbiI/d2FybmluZyhkaWRIb29rVGhyb3dGb3JFdmVudFtldmVudF0sIkV4Y2VwdGlv biB0aHJvd24gYnkgaG9vayB3aGlsZSBoYW5kbGluZyAlczogJXMiLGV2ZW50LGUrIlxuIitlLnN0 YWNrKTp2b2lkIDA7ZGlkSG9va1Rocm93Rm9yRXZlbnRbZXZlbnRdPXRydWV9fWZ1bmN0aW9uIGVt aXRFdmVudChldmVudCxhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUpe2Zvcih2YXIgaT0wO2k8aG9v a3MubGVuZ3RoO2krKyl7dmFyIGhvb2s9aG9va3NbaV07dmFyIGZuPWhvb2tbZXZlbnRdO2lmKGZu KXtjYWxsSG9vayhldmVudCxmbixob29rLGFyZzEsYXJnMixhcmczLGFyZzQsYXJnNSl9fX12YXIg aXNQcm9maWxpbmc9ZmFsc2U7dmFyIGZsdXNoSGlzdG9yeT1bXTt2YXIgbGlmZUN5Y2xlVGltZXJT dGFjaz1bXTt2YXIgY3VycmVudEZsdXNoTmVzdGluZz0wO3ZhciBjdXJyZW50Rmx1c2hNZWFzdXJl bWVudHM9W107dmFyIGN1cnJlbnRGbHVzaFN0YXJ0VGltZT0wO3ZhciBjdXJyZW50VGltZXJEZWJ1 Z0lEPW51bGw7dmFyIGN1cnJlbnRUaW1lclN0YXJ0VGltZT0wO3ZhciBjdXJyZW50VGltZXJOZXN0 ZWRGbHVzaER1cmF0aW9uPTA7dmFyIGN1cnJlbnRUaW1lclR5cGU9bnVsbDt2YXIgbGlmZUN5Y2xl VGltZXJIYXNXYXJuZWQ9ZmFsc2U7ZnVuY3Rpb24gY2xlYXJIaXN0b3J5KCl7UmVhY3RDb21wb25l bnRUcmVlSG9vay5wdXJnZVVubW91bnRlZENvbXBvbmVudHMoKTtSZWFjdEhvc3RPcGVyYXRpb25I aXN0b3J5SG9vay5jbGVhckhpc3RvcnkoKX1mdW5jdGlvbiBnZXRUcmVlU25hcHNob3QocmVnaXN0 ZXJlZElEcyl7cmV0dXJuIHJlZ2lzdGVyZWRJRHMucmVkdWNlKGZ1bmN0aW9uKHRyZWUsaWQpe3Zh ciBvd25lcklEPVJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0T3duZXJJRChpZCk7dmFyIHBhcmVu dElEPVJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0UGFyZW50SUQoaWQpO3RyZWVbaWRdPXtkaXNw bGF5TmFtZTpSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldERpc3BsYXlOYW1lKGlkKSx0ZXh0OlJl YWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0VGV4dChpZCksdXBkYXRlQ291bnQ6UmVhY3RDb21wb25l bnRUcmVlSG9vay5nZXRVcGRhdGVDb3VudChpZCksY2hpbGRJRHM6UmVhY3RDb21wb25lbnRUcmVl SG9vay5nZXRDaGlsZElEcyhpZCksb3duZXJJRDpvd25lcklEfHxwYXJlbnRJRCYmUmVhY3RDb21w b25lbnRUcmVlSG9vay5nZXRPd25lcklEKHBhcmVudElEKXx8MCxwYXJlbnRJRDpwYXJlbnRJRH07 cmV0dXJuIHRyZWV9LHt9KX1mdW5jdGlvbiByZXNldE1lYXN1cmVtZW50cygpe3ZhciBwcmV2aW91 c1N0YXJ0VGltZT1jdXJyZW50Rmx1c2hTdGFydFRpbWU7dmFyIHByZXZpb3VzTWVhc3VyZW1lbnRz PWN1cnJlbnRGbHVzaE1lYXN1cmVtZW50czt2YXIgcHJldmlvdXNPcGVyYXRpb25zPVJlYWN0SG9z dE9wZXJhdGlvbkhpc3RvcnlIb29rLmdldEhpc3RvcnkoKTtpZihjdXJyZW50Rmx1c2hOZXN0aW5n PT09MCl7Y3VycmVudEZsdXNoU3RhcnRUaW1lPTA7Y3VycmVudEZsdXNoTWVhc3VyZW1lbnRzPVtd O2NsZWFySGlzdG9yeSgpO3JldHVybn1pZihwcmV2aW91c01lYXN1cmVtZW50cy5sZW5ndGh8fHBy ZXZpb3VzT3BlcmF0aW9ucy5sZW5ndGgpe3ZhciByZWdpc3RlcmVkSURzPVJlYWN0Q29tcG9uZW50 VHJlZUhvb2suZ2V0UmVnaXN0ZXJlZElEcygpO2ZsdXNoSGlzdG9yeS5wdXNoKHtkdXJhdGlvbjpw ZXJmb3JtYW5jZU5vdygpLXByZXZpb3VzU3RhcnRUaW1lLG1lYXN1cmVtZW50czpwcmV2aW91c01l YXN1cmVtZW50c3x8W10sb3BlcmF0aW9uczpwcmV2aW91c09wZXJhdGlvbnN8fFtdLHRyZWVTbmFw c2hvdDpnZXRUcmVlU25hcHNob3QocmVnaXN0ZXJlZElEcyl9KX1jbGVhckhpc3RvcnkoKTtjdXJy ZW50Rmx1c2hTdGFydFRpbWU9cGVyZm9ybWFuY2VOb3coKTtjdXJyZW50Rmx1c2hNZWFzdXJlbWVu dHM9W119ZnVuY3Rpb24gY2hlY2tEZWJ1Z0lEKGRlYnVnSUQpe3ZhciBhbGxvd1Jvb3Q9YXJndW1l bnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOmZhbHNl O2lmKGFsbG93Um9vdCYmZGVidWdJRD09PTApe3JldHVybn1pZighZGVidWdJRCl7ImRldmVsb3Bt ZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKGZhbHNlLCJSZWFjdERlYnVnVG9vbDogZGVidWdJ RCBtYXkgbm90IGJlIGVtcHR5LiIpOnZvaWQgMH19ZnVuY3Rpb24gYmVnaW5MaWZlQ3ljbGVUaW1l cihkZWJ1Z0lELHRpbWVyVHlwZSl7aWYoY3VycmVudEZsdXNoTmVzdGluZz09PTApe3JldHVybn1p ZihjdXJyZW50VGltZXJUeXBlJiYhbGlmZUN5Y2xlVGltZXJIYXNXYXJuZWQpeyJkZXZlbG9wbWVu dCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyhmYWxzZSwiVGhlcmUgaXMgYW4gaW50ZXJuYWwgZXJy b3IgaW4gdGhlIFJlYWN0IHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50IGNvZGUuICIrIkRpZCBub3Qg ZXhwZWN0ICVzIHRpbWVyIHRvIHN0YXJ0IHdoaWxlICVzIHRpbWVyIGlzIHN0aWxsIGluICIrInBy b2dyZXNzIGZvciAlcyBpbnN0YW5jZS4iLHRpbWVyVHlwZSxjdXJyZW50VGltZXJUeXBlfHwibm8i LGRlYnVnSUQ9PT1jdXJyZW50VGltZXJEZWJ1Z0lEPyJ0aGUgc2FtZSI6ImFub3RoZXIiKTp2b2lk IDA7bGlmZUN5Y2xlVGltZXJIYXNXYXJuZWQ9dHJ1ZX1jdXJyZW50VGltZXJTdGFydFRpbWU9cGVy Zm9ybWFuY2VOb3coKTtjdXJyZW50VGltZXJOZXN0ZWRGbHVzaER1cmF0aW9uPTA7Y3VycmVudFRp bWVyRGVidWdJRD1kZWJ1Z0lEO2N1cnJlbnRUaW1lclR5cGU9dGltZXJUeXBlfWZ1bmN0aW9uIGVu ZExpZmVDeWNsZVRpbWVyKGRlYnVnSUQsdGltZXJUeXBlKXtpZihjdXJyZW50Rmx1c2hOZXN0aW5n PT09MCl7cmV0dXJufWlmKGN1cnJlbnRUaW1lclR5cGUhPT10aW1lclR5cGUmJiFsaWZlQ3ljbGVU aW1lckhhc1dhcm5lZCl7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKGZhbHNl LCJUaGVyZSBpcyBhbiBpbnRlcm5hbCBlcnJvciBpbiB0aGUgUmVhY3QgcGVyZm9ybWFuY2UgbWVh c3VyZW1lbnQgY29kZS4gIisiV2UgZGlkIG5vdCBleHBlY3QgJXMgdGltZXIgdG8gc3RvcCB3aGls ZSAlcyB0aW1lciBpcyBzdGlsbCBpbiAiKyJwcm9ncmVzcyBmb3IgJXMgaW5zdGFuY2UuIFBsZWFz ZSByZXBvcnQgdGhpcyBhcyBhIGJ1ZyBpbiBSZWFjdC4iLHRpbWVyVHlwZSxjdXJyZW50VGltZXJU eXBlfHwibm8iLGRlYnVnSUQ9PT1jdXJyZW50VGltZXJEZWJ1Z0lEPyJ0aGUgc2FtZSI6ImFub3Ro ZXIiKTp2b2lkIDA7bGlmZUN5Y2xlVGltZXJIYXNXYXJuZWQ9dHJ1ZX1pZihpc1Byb2ZpbGluZyl7 Y3VycmVudEZsdXNoTWVhc3VyZW1lbnRzLnB1c2goe3RpbWVyVHlwZTp0aW1lclR5cGUsaW5zdGFu Y2VJRDpkZWJ1Z0lELGR1cmF0aW9uOnBlcmZvcm1hbmNlTm93KCktY3VycmVudFRpbWVyU3RhcnRU aW1lLWN1cnJlbnRUaW1lck5lc3RlZEZsdXNoRHVyYXRpb259KX1jdXJyZW50VGltZXJTdGFydFRp bWU9MDtjdXJyZW50VGltZXJOZXN0ZWRGbHVzaER1cmF0aW9uPTA7Y3VycmVudFRpbWVyRGVidWdJ RD1udWxsO2N1cnJlbnRUaW1lclR5cGU9bnVsbH1mdW5jdGlvbiBwYXVzZUN1cnJlbnRMaWZlQ3lj bGVUaW1lcigpe3ZhciBjdXJyZW50VGltZXI9e3N0YXJ0VGltZTpjdXJyZW50VGltZXJTdGFydFRp bWUsbmVzdGVkRmx1c2hTdGFydFRpbWU6cGVyZm9ybWFuY2VOb3coKSxkZWJ1Z0lEOmN1cnJlbnRU aW1lckRlYnVnSUQsdGltZXJUeXBlOmN1cnJlbnRUaW1lclR5cGV9O2xpZmVDeWNsZVRpbWVyU3Rh Y2sucHVzaChjdXJyZW50VGltZXIpO2N1cnJlbnRUaW1lclN0YXJ0VGltZT0wO2N1cnJlbnRUaW1l ck5lc3RlZEZsdXNoRHVyYXRpb249MDtjdXJyZW50VGltZXJEZWJ1Z0lEPW51bGw7Y3VycmVudFRp bWVyVHlwZT1udWxsfWZ1bmN0aW9uIHJlc3VtZUN1cnJlbnRMaWZlQ3ljbGVUaW1lcigpe3ZhciBf bGlmZUN5Y2xlVGltZXJTdGFjayQ9bGlmZUN5Y2xlVGltZXJTdGFjay5wb3AoKSxzdGFydFRpbWU9 X2xpZmVDeWNsZVRpbWVyU3RhY2skLnN0YXJ0VGltZSxuZXN0ZWRGbHVzaFN0YXJ0VGltZT1fbGlm ZUN5Y2xlVGltZXJTdGFjayQubmVzdGVkRmx1c2hTdGFydFRpbWUsZGVidWdJRD1fbGlmZUN5Y2xl VGltZXJTdGFjayQuZGVidWdJRCx0aW1lclR5cGU9X2xpZmVDeWNsZVRpbWVyU3RhY2skLnRpbWVy VHlwZTt2YXIgbmVzdGVkRmx1c2hEdXJhdGlvbj1wZXJmb3JtYW5jZU5vdygpLW5lc3RlZEZsdXNo U3RhcnRUaW1lO2N1cnJlbnRUaW1lclN0YXJ0VGltZT1zdGFydFRpbWU7Y3VycmVudFRpbWVyTmVz dGVkRmx1c2hEdXJhdGlvbis9bmVzdGVkRmx1c2hEdXJhdGlvbjtjdXJyZW50VGltZXJEZWJ1Z0lE PWRlYnVnSUQ7Y3VycmVudFRpbWVyVHlwZT10aW1lclR5cGV9dmFyIGxhc3RNYXJrVGltZVN0YW1w PTA7dmFyIGNhblVzZVBlcmZvcm1hbmNlTWVhc3VyZT10eXBlb2YgcGVyZm9ybWFuY2UhPT0idW5k ZWZpbmVkIiYmdHlwZW9mIHBlcmZvcm1hbmNlLm1hcms9PT0iZnVuY3Rpb24iJiZ0eXBlb2YgcGVy Zm9ybWFuY2UuY2xlYXJNYXJrcz09PSJmdW5jdGlvbiImJnR5cGVvZiBwZXJmb3JtYW5jZS5tZWFz dXJlPT09ImZ1bmN0aW9uIiYmdHlwZW9mIHBlcmZvcm1hbmNlLmNsZWFyTWVhc3VyZXM9PT0iZnVu Y3Rpb24iO2Z1bmN0aW9uIHNob3VsZE1hcmsoZGVidWdJRCl7aWYoIWlzUHJvZmlsaW5nfHwhY2Fu VXNlUGVyZm9ybWFuY2VNZWFzdXJlKXtyZXR1cm4gZmFsc2V9dmFyIGVsZW1lbnQ9UmVhY3RDb21w b25lbnRUcmVlSG9vay5nZXRFbGVtZW50KGRlYnVnSUQpO2lmKGVsZW1lbnQ9PW51bGx8fHR5cGVv ZiBlbGVtZW50IT09Im9iamVjdCIpe3JldHVybiBmYWxzZX12YXIgaXNIb3N0RWxlbWVudD10eXBl b2YgZWxlbWVudC50eXBlPT09InN0cmluZyI7aWYoaXNIb3N0RWxlbWVudCl7cmV0dXJuIGZhbHNl fXJldHVybiB0cnVlfWZ1bmN0aW9uIG1hcmtCZWdpbihkZWJ1Z0lELG1hcmtUeXBlKXtpZighc2hv dWxkTWFyayhkZWJ1Z0lEKSl7cmV0dXJufXZhciBtYXJrTmFtZT1kZWJ1Z0lEKyI6OiIrbWFya1R5 cGU7bGFzdE1hcmtUaW1lU3RhbXA9cGVyZm9ybWFuY2VOb3coKTtwZXJmb3JtYW5jZS5tYXJrKG1h cmtOYW1lKX1mdW5jdGlvbiBtYXJrRW5kKGRlYnVnSUQsbWFya1R5cGUpe2lmKCFzaG91bGRNYXJr KGRlYnVnSUQpKXtyZXR1cm59dmFyIG1hcmtOYW1lPWRlYnVnSUQrIjo6IittYXJrVHlwZTt2YXIg ZGlzcGxheU5hbWU9UmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXREaXNwbGF5TmFtZShkZWJ1Z0lE KXx8IlVua25vd24iO3ZhciB0aW1lU3RhbXA9cGVyZm9ybWFuY2VOb3coKTtpZih0aW1lU3RhbXAt bGFzdE1hcmtUaW1lU3RhbXA+LjEpe3ZhciBtZWFzdXJlbWVudE5hbWU9ZGlzcGxheU5hbWUrIiBb IittYXJrVHlwZSsiXSI7cGVyZm9ybWFuY2UubWVhc3VyZShtZWFzdXJlbWVudE5hbWUsbWFya05h bWUpfXBlcmZvcm1hbmNlLmNsZWFyTWFya3MobWFya05hbWUpO3BlcmZvcm1hbmNlLmNsZWFyTWVh c3VyZXMobWVhc3VyZW1lbnROYW1lKX12YXIgUmVhY3REZWJ1Z1Rvb2w9e2FkZEhvb2s6ZnVuY3Rp b24oaG9vayl7aG9va3MucHVzaChob29rKX0scmVtb3ZlSG9vazpmdW5jdGlvbihob29rKXtmb3Io dmFyIGk9MDtpPGhvb2tzLmxlbmd0aDtpKyspe2lmKGhvb2tzW2ldPT09aG9vayl7aG9va3Muc3Bs aWNlKGksMSk7aS0tfX19LGlzUHJvZmlsaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIGlzUHJvZmlsaW5n fSxiZWdpblByb2ZpbGluZzpmdW5jdGlvbigpe2lmKGlzUHJvZmlsaW5nKXtyZXR1cm59aXNQcm9m aWxpbmc9dHJ1ZTtmbHVzaEhpc3RvcnkubGVuZ3RoPTA7cmVzZXRNZWFzdXJlbWVudHMoKTtSZWFj dERlYnVnVG9vbC5hZGRIb29rKFJlYWN0SG9zdE9wZXJhdGlvbkhpc3RvcnlIb29rKX0sZW5kUHJv ZmlsaW5nOmZ1bmN0aW9uKCl7aWYoIWlzUHJvZmlsaW5nKXtyZXR1cm59aXNQcm9maWxpbmc9ZmFs c2U7cmVzZXRNZWFzdXJlbWVudHMoKTtSZWFjdERlYnVnVG9vbC5yZW1vdmVIb29rKFJlYWN0SG9z dE9wZXJhdGlvbkhpc3RvcnlIb29rKX0sZ2V0Rmx1c2hIaXN0b3J5OmZ1bmN0aW9uKCl7cmV0dXJu IGZsdXNoSGlzdG9yeX0sb25CZWdpbkZsdXNoOmZ1bmN0aW9uKCl7Y3VycmVudEZsdXNoTmVzdGlu ZysrO3Jlc2V0TWVhc3VyZW1lbnRzKCk7cGF1c2VDdXJyZW50TGlmZUN5Y2xlVGltZXIoKTtlbWl0 RXZlbnQoIm9uQmVnaW5GbHVzaCIpfSxvbkVuZEZsdXNoOmZ1bmN0aW9uKCl7cmVzZXRNZWFzdXJl bWVudHMoKTtjdXJyZW50Rmx1c2hOZXN0aW5nLS07cmVzdW1lQ3VycmVudExpZmVDeWNsZVRpbWVy KCk7ZW1pdEV2ZW50KCJvbkVuZEZsdXNoIil9LG9uQmVnaW5MaWZlQ3ljbGVUaW1lcjpmdW5jdGlv bihkZWJ1Z0lELHRpbWVyVHlwZSl7Y2hlY2tEZWJ1Z0lEKGRlYnVnSUQpO2VtaXRFdmVudCgib25C ZWdpbkxpZmVDeWNsZVRpbWVyIixkZWJ1Z0lELHRpbWVyVHlwZSk7bWFya0JlZ2luKGRlYnVnSUQs dGltZXJUeXBlKTtiZWdpbkxpZmVDeWNsZVRpbWVyKGRlYnVnSUQsdGltZXJUeXBlKX0sb25FbmRM aWZlQ3ljbGVUaW1lcjpmdW5jdGlvbihkZWJ1Z0lELHRpbWVyVHlwZSl7Y2hlY2tEZWJ1Z0lEKGRl YnVnSUQpO2VuZExpZmVDeWNsZVRpbWVyKGRlYnVnSUQsdGltZXJUeXBlKTttYXJrRW5kKGRlYnVn SUQsdGltZXJUeXBlKTtlbWl0RXZlbnQoIm9uRW5kTGlmZUN5Y2xlVGltZXIiLGRlYnVnSUQsdGlt ZXJUeXBlKX0sb25CZWdpblByb2Nlc3NpbmdDaGlsZENvbnRleHQ6ZnVuY3Rpb24oKXtlbWl0RXZl bnQoIm9uQmVnaW5Qcm9jZXNzaW5nQ2hpbGRDb250ZXh0Iil9LG9uRW5kUHJvY2Vzc2luZ0NoaWxk Q29udGV4dDpmdW5jdGlvbigpe2VtaXRFdmVudCgib25FbmRQcm9jZXNzaW5nQ2hpbGRDb250ZXh0 Iil9LG9uSG9zdE9wZXJhdGlvbjpmdW5jdGlvbihvcGVyYXRpb24pe2NoZWNrRGVidWdJRChvcGVy YXRpb24uaW5zdGFuY2VJRCk7ZW1pdEV2ZW50KCJvbkhvc3RPcGVyYXRpb24iLG9wZXJhdGlvbil9 LG9uU2V0U3RhdGU6ZnVuY3Rpb24oKXtlbWl0RXZlbnQoIm9uU2V0U3RhdGUiKX0sb25TZXRDaGls ZHJlbjpmdW5jdGlvbihkZWJ1Z0lELGNoaWxkRGVidWdJRHMpe2NoZWNrRGVidWdJRChkZWJ1Z0lE KTtjaGlsZERlYnVnSURzLmZvckVhY2goY2hlY2tEZWJ1Z0lEKTtlbWl0RXZlbnQoIm9uU2V0Q2hp bGRyZW4iLGRlYnVnSUQsY2hpbGREZWJ1Z0lEcyl9LG9uQmVmb3JlTW91bnRDb21wb25lbnQ6ZnVu Y3Rpb24oZGVidWdJRCxlbGVtZW50LHBhcmVudERlYnVnSUQpe2NoZWNrRGVidWdJRChkZWJ1Z0lE KTtjaGVja0RlYnVnSUQocGFyZW50RGVidWdJRCx0cnVlKTtlbWl0RXZlbnQoIm9uQmVmb3JlTW91 bnRDb21wb25lbnQiLGRlYnVnSUQsZWxlbWVudCxwYXJlbnREZWJ1Z0lEKTttYXJrQmVnaW4oZGVi dWdJRCwibW91bnQiKX0sb25Nb3VudENvbXBvbmVudDpmdW5jdGlvbihkZWJ1Z0lEKXtjaGVja0Rl YnVnSUQoZGVidWdJRCk7bWFya0VuZChkZWJ1Z0lELCJtb3VudCIpO2VtaXRFdmVudCgib25Nb3Vu dENvbXBvbmVudCIsZGVidWdJRCl9LG9uQmVmb3JlVXBkYXRlQ29tcG9uZW50OmZ1bmN0aW9uKGRl YnVnSUQsZWxlbWVudCl7Y2hlY2tEZWJ1Z0lEKGRlYnVnSUQpO2VtaXRFdmVudCgib25CZWZvcmVV cGRhdGVDb21wb25lbnQiLGRlYnVnSUQsZWxlbWVudCk7bWFya0JlZ2luKGRlYnVnSUQsInVwZGF0 ZSIpfSxvblVwZGF0ZUNvbXBvbmVudDpmdW5jdGlvbihkZWJ1Z0lEKXtjaGVja0RlYnVnSUQoZGVi dWdJRCk7bWFya0VuZChkZWJ1Z0lELCJ1cGRhdGUiKTtlbWl0RXZlbnQoIm9uVXBkYXRlQ29tcG9u ZW50IixkZWJ1Z0lEKX0sb25CZWZvcmVVbm1vdW50Q29tcG9uZW50OmZ1bmN0aW9uKGRlYnVnSUQp e2NoZWNrRGVidWdJRChkZWJ1Z0lEKTtlbWl0RXZlbnQoIm9uQmVmb3JlVW5tb3VudENvbXBvbmVu dCIsZGVidWdJRCk7bWFya0JlZ2luKGRlYnVnSUQsInVubW91bnQiKX0sb25Vbm1vdW50Q29tcG9u ZW50OmZ1bmN0aW9uKGRlYnVnSUQpe2NoZWNrRGVidWdJRChkZWJ1Z0lEKTttYXJrRW5kKGRlYnVn SUQsInVubW91bnQiKTtlbWl0RXZlbnQoIm9uVW5tb3VudENvbXBvbmVudCIsZGVidWdJRCl9LG9u VGVzdEV2ZW50OmZ1bmN0aW9uKCl7ZW1pdEV2ZW50KCJvblRlc3RFdmVudCIpfX07UmVhY3REZWJ1 Z1Rvb2wuYWRkRGV2dG9vbD1SZWFjdERlYnVnVG9vbC5hZGRIb29rO1JlYWN0RGVidWdUb29sLnJl bW92ZURldnRvb2w9UmVhY3REZWJ1Z1Rvb2wucmVtb3ZlSG9vaztSZWFjdERlYnVnVG9vbC5hZGRI b29rKFJlYWN0SW52YWxpZFNldFN0YXRlV2FybmluZ0hvb2spO1JlYWN0RGVidWdUb29sLmFkZEhv b2soUmVhY3RDb21wb25lbnRUcmVlSG9vayk7dmFyIHVybD1FeGVjdXRpb25FbnZpcm9ubWVudC5j YW5Vc2VET00mJndpbmRvdy5sb2NhdGlvbi5ocmVmfHwiIjtpZigvWz8mXXJlYWN0X3BlcmZcYi8u dGVzdCh1cmwpKXtSZWFjdERlYnVnVG9vbC5iZWdpblByb2ZpbGluZygpfW1vZHVsZS5leHBvcnRz PVJlYWN0RGVidWdUb29sfSx7MTMyOjEzMiwxMzY6MTM2LDE1NToxNTUsMTU3OjE1Nyw2MDo2MCw2 NTo2NX1dLDUxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7 dmFyIF9hc3NpZ249X2RlcmVxXygxNTgpO3ZhciBSZWFjdFVwZGF0ZXM9X2RlcmVxXyg4Mik7dmFy IFRyYW5zYWN0aW9uPV9kZXJlcV8oMTAwKTt2YXIgZW1wdHlGdW5jdGlvbj1fZGVyZXFfKDE0Mik7 dmFyIFJFU0VUX0JBVENIRURfVVBEQVRFUz17aW5pdGlhbGl6ZTplbXB0eUZ1bmN0aW9uLGNsb3Nl OmZ1bmN0aW9uKCl7UmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVneS5pc0JhdGNoaW5nVXBkYXRl cz1mYWxzZX19O3ZhciBGTFVTSF9CQVRDSEVEX1VQREFURVM9e2luaXRpYWxpemU6ZW1wdHlGdW5j dGlvbixjbG9zZTpSZWFjdFVwZGF0ZXMuZmx1c2hCYXRjaGVkVXBkYXRlcy5iaW5kKFJlYWN0VXBk YXRlcyl9O3ZhciBUUkFOU0FDVElPTl9XUkFQUEVSUz1bRkxVU0hfQkFUQ0hFRF9VUERBVEVTLFJF U0VUX0JBVENIRURfVVBEQVRFU107ZnVuY3Rpb24gUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVn eVRyYW5zYWN0aW9uKCl7dGhpcy5yZWluaXRpYWxpemVUcmFuc2FjdGlvbigpfV9hc3NpZ24oUmVh Y3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVneVRyYW5zYWN0aW9uLnByb3RvdHlwZSxUcmFuc2FjdGlv bix7Z2V0VHJhbnNhY3Rpb25XcmFwcGVyczpmdW5jdGlvbigpe3JldHVybiBUUkFOU0FDVElPTl9X UkFQUEVSU319KTt2YXIgdHJhbnNhY3Rpb249bmV3IFJlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRl Z3lUcmFuc2FjdGlvbjt2YXIgUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVneT17aXNCYXRjaGlu Z1VwZGF0ZXM6ZmFsc2UsYmF0Y2hlZFVwZGF0ZXM6ZnVuY3Rpb24oY2FsbGJhY2ssYSxiLGMsZCxl KXt2YXIgYWxyZWFkeUJhdGNoaW5nVXBkYXRlcz1SZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5 LmlzQmF0Y2hpbmdVcGRhdGVzO1JlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3kuaXNCYXRjaGlu Z1VwZGF0ZXM9dHJ1ZTtpZihhbHJlYWR5QmF0Y2hpbmdVcGRhdGVzKXtyZXR1cm4gY2FsbGJhY2so YSxiLGMsZCxlKX1lbHNle3JldHVybiB0cmFuc2FjdGlvbi5wZXJmb3JtKGNhbGxiYWNrLG51bGws YSxiLGMsZCxlKX19fTttb2R1bGUuZXhwb3J0cz1SZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5 fSx7MTAwOjEwMCwxNDI6MTQyLDE1ODoxNTgsODI6ODJ9XSw1MjpbZnVuY3Rpb24oX2RlcmVxXyxt b2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBBUklBRE9NUHJvcGVydHlDb25maWc9X2Rl cmVxXygxKTt2YXIgQmVmb3JlSW5wdXRFdmVudFBsdWdpbj1fZGVyZXFfKDMpO3ZhciBDaGFuZ2VF dmVudFBsdWdpbj1fZGVyZXFfKDcpO3ZhciBEZWZhdWx0RXZlbnRQbHVnaW5PcmRlcj1fZGVyZXFf KDE0KTt2YXIgRW50ZXJMZWF2ZUV2ZW50UGx1Z2luPV9kZXJlcV8oMTUpO3ZhciBIVE1MRE9NUHJv cGVydHlDb25maWc9X2RlcmVxXygyMik7dmFyIFJlYWN0Q29tcG9uZW50QnJvd3NlckVudmlyb25t ZW50PV9kZXJlcV8oMjgpO3ZhciBSZWFjdERPTUNvbXBvbmVudD1fZGVyZXFfKDMyKTt2YXIgUmVh Y3RET01Db21wb25lbnRUcmVlPV9kZXJlcV8oMzQpO3ZhciBSZWFjdERPTUVtcHR5Q29tcG9uZW50 PV9kZXJlcV8oMzYpO3ZhciBSZWFjdERPTVRyZWVUcmF2ZXJzYWw9X2RlcmVxXyg0Nyk7dmFyIFJl YWN0RE9NVGV4dENvbXBvbmVudD1fZGVyZXFfKDQ1KTt2YXIgUmVhY3REZWZhdWx0QmF0Y2hpbmdT dHJhdGVneT1fZGVyZXFfKDUxKTt2YXIgUmVhY3RFdmVudExpc3RlbmVyPV9kZXJlcV8oNTcpO3Zh ciBSZWFjdEluamVjdGlvbj1fZGVyZXFfKDYxKTt2YXIgUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlv bj1fZGVyZXFfKDc0KTt2YXIgU1ZHRE9NUHJvcGVydHlDb25maWc9X2RlcmVxXyg4NCk7dmFyIFNl bGVjdEV2ZW50UGx1Z2luPV9kZXJlcV8oODUpO3ZhciBTaW1wbGVFdmVudFBsdWdpbj1fZGVyZXFf KDg2KTt2YXIgYWxyZWFkeUluamVjdGVkPWZhbHNlO2Z1bmN0aW9uIGluamVjdCgpe2lmKGFscmVh ZHlJbmplY3RlZCl7cmV0dXJufWFscmVhZHlJbmplY3RlZD10cnVlO1JlYWN0SW5qZWN0aW9uLkV2 ZW50RW1pdHRlci5pbmplY3RSZWFjdEV2ZW50TGlzdGVuZXIoUmVhY3RFdmVudExpc3RlbmVyKTtS ZWFjdEluamVjdGlvbi5FdmVudFBsdWdpbkh1Yi5pbmplY3RFdmVudFBsdWdpbk9yZGVyKERlZmF1 bHRFdmVudFBsdWdpbk9yZGVyKTtSZWFjdEluamVjdGlvbi5FdmVudFBsdWdpblV0aWxzLmluamVj dENvbXBvbmVudFRyZWUoUmVhY3RET01Db21wb25lbnRUcmVlKTtSZWFjdEluamVjdGlvbi5FdmVu dFBsdWdpblV0aWxzLmluamVjdFRyZWVUcmF2ZXJzYWwoUmVhY3RET01UcmVlVHJhdmVyc2FsKTtS ZWFjdEluamVjdGlvbi5FdmVudFBsdWdpbkh1Yi5pbmplY3RFdmVudFBsdWdpbnNCeU5hbWUoe1Np bXBsZUV2ZW50UGx1Z2luOlNpbXBsZUV2ZW50UGx1Z2luLEVudGVyTGVhdmVFdmVudFBsdWdpbjpF bnRlckxlYXZlRXZlbnRQbHVnaW4sQ2hhbmdlRXZlbnRQbHVnaW46Q2hhbmdlRXZlbnRQbHVnaW4s U2VsZWN0RXZlbnRQbHVnaW46U2VsZWN0RXZlbnRQbHVnaW4sQmVmb3JlSW5wdXRFdmVudFBsdWdp bjpCZWZvcmVJbnB1dEV2ZW50UGx1Z2lufSk7UmVhY3RJbmplY3Rpb24uSG9zdENvbXBvbmVudC5p bmplY3RHZW5lcmljQ29tcG9uZW50Q2xhc3MoUmVhY3RET01Db21wb25lbnQpO1JlYWN0SW5qZWN0 aW9uLkhvc3RDb21wb25lbnQuaW5qZWN0VGV4dENvbXBvbmVudENsYXNzKFJlYWN0RE9NVGV4dENv bXBvbmVudCk7UmVhY3RJbmplY3Rpb24uRE9NUHJvcGVydHkuaW5qZWN0RE9NUHJvcGVydHlDb25m aWcoQVJJQURPTVByb3BlcnR5Q29uZmlnKTtSZWFjdEluamVjdGlvbi5ET01Qcm9wZXJ0eS5pbmpl Y3RET01Qcm9wZXJ0eUNvbmZpZyhIVE1MRE9NUHJvcGVydHlDb25maWcpO1JlYWN0SW5qZWN0aW9u LkRPTVByb3BlcnR5LmluamVjdERPTVByb3BlcnR5Q29uZmlnKFNWR0RPTVByb3BlcnR5Q29uZmln KTtSZWFjdEluamVjdGlvbi5FbXB0eUNvbXBvbmVudC5pbmplY3RFbXB0eUNvbXBvbmVudEZhY3Rv cnkoZnVuY3Rpb24oaW5zdGFudGlhdGUpe3JldHVybiBuZXcgUmVhY3RET01FbXB0eUNvbXBvbmVu dChpbnN0YW50aWF0ZSl9KTtSZWFjdEluamVjdGlvbi5VcGRhdGVzLmluamVjdFJlY29uY2lsZVRy YW5zYWN0aW9uKFJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24pO1JlYWN0SW5qZWN0aW9uLlVwZGF0 ZXMuaW5qZWN0QmF0Y2hpbmdTdHJhdGVneShSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5KTtS ZWFjdEluamVjdGlvbi5Db21wb25lbnQuaW5qZWN0RW52aXJvbm1lbnQoUmVhY3RDb21wb25lbnRC cm93c2VyRW52aXJvbm1lbnQpfW1vZHVsZS5leHBvcnRzPXtpbmplY3Q6aW5qZWN0fX0sezE6MSwx NDoxNCwxNToxNSwyMjoyMiwyODoyOCwzOjMsMzI6MzIsMzQ6MzQsMzY6MzYsNDU6NDUsNDc6NDcs NTE6NTEsNTc6NTcsNjE6NjEsNzo3LDc0Ojc0LDg0Ojg0LDg1Ojg1LDg2Ojg2fV0sNTM6W2Z1bmN0 aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgUkVBQ1RfRUxFTUVO VF9UWVBFPXR5cGVvZiBTeW1ib2w9PT0iZnVuY3Rpb24iJiZTeW1ib2xbImZvciJdJiZTeW1ib2xb ImZvciJdKCJyZWFjdC5lbGVtZW50Iil8fDYwMTAzO21vZHVsZS5leHBvcnRzPVJFQUNUX0VMRU1F TlRfVFlQRX0se31dLDU0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0 cmljdCI7dmFyIGVtcHR5Q29tcG9uZW50RmFjdG9yeTt2YXIgUmVhY3RFbXB0eUNvbXBvbmVudElu amVjdGlvbj17aW5qZWN0RW1wdHlDb21wb25lbnRGYWN0b3J5OmZ1bmN0aW9uKGZhY3Rvcnkpe2Vt cHR5Q29tcG9uZW50RmFjdG9yeT1mYWN0b3J5fX07dmFyIFJlYWN0RW1wdHlDb21wb25lbnQ9e2Ny ZWF0ZTpmdW5jdGlvbihpbnN0YW50aWF0ZSl7cmV0dXJuIGVtcHR5Q29tcG9uZW50RmFjdG9yeShp bnN0YW50aWF0ZSl9fTtSZWFjdEVtcHR5Q29tcG9uZW50LmluamVjdGlvbj1SZWFjdEVtcHR5Q29t cG9uZW50SW5qZWN0aW9uO21vZHVsZS5leHBvcnRzPVJlYWN0RW1wdHlDb21wb25lbnR9LHt9XSw1 NTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBjYXVn aHRFcnJvcj1udWxsO2Z1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFjayhuYW1lLGZ1bmMsYSl7 dHJ5e2Z1bmMoYSl9Y2F0Y2goeCl7aWYoY2F1Z2h0RXJyb3I9PT1udWxsKXtjYXVnaHRFcnJvcj14 fX19dmFyIFJlYWN0RXJyb3JVdGlscz17aW52b2tlR3VhcmRlZENhbGxiYWNrOmludm9rZUd1YXJk ZWRDYWxsYmFjayxpbnZva2VHdWFyZGVkQ2FsbGJhY2tXaXRoQ2F0Y2g6aW52b2tlR3VhcmRlZENh bGxiYWNrLHJldGhyb3dDYXVnaHRFcnJvcjpmdW5jdGlvbigpe2lmKGNhdWdodEVycm9yKXt2YXIg ZXJyb3I9Y2F1Z2h0RXJyb3I7Y2F1Z2h0RXJyb3I9bnVsbDt0aHJvdyBlcnJvcn19fTtpZigiZGV2 ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtpZih0eXBlb2Ygd2luZG93IT09InVuZGVmaW5lZCIm JnR5cGVvZiB3aW5kb3cuZGlzcGF0Y2hFdmVudD09PSJmdW5jdGlvbiImJnR5cGVvZiBkb2N1bWVu dCE9PSJ1bmRlZmluZWQiJiZ0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRXZlbnQ9PT0iZnVuY3Rpb24i KXt2YXIgZmFrZU5vZGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicmVhY3QiKTtSZWFjdEVycm9y VXRpbHMuaW52b2tlR3VhcmRlZENhbGxiYWNrPWZ1bmN0aW9uKG5hbWUsZnVuYyxhKXt2YXIgYm91 bmRGdW5jPWZ1bmMuYmluZChudWxsLGEpO3ZhciBldnRUeXBlPSJyZWFjdC0iK25hbWU7ZmFrZU5v ZGUuYWRkRXZlbnRMaXN0ZW5lcihldnRUeXBlLGJvdW5kRnVuYyxmYWxzZSk7dmFyIGV2dD1kb2N1 bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTtldnQuaW5pdEV2ZW50KGV2dFR5cGUsZmFsc2UsZmFs c2UpO2Zha2VOb2RlLmRpc3BhdGNoRXZlbnQoZXZ0KTtmYWtlTm9kZS5yZW1vdmVFdmVudExpc3Rl bmVyKGV2dFR5cGUsYm91bmRGdW5jLGZhbHNlKX19fW1vZHVsZS5leHBvcnRzPVJlYWN0RXJyb3JV dGlsc30se31dLDU2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmlj dCI7dmFyIEV2ZW50UGx1Z2luSHViPV9kZXJlcV8oMTcpO2Z1bmN0aW9uIHJ1bkV2ZW50UXVldWVJ bkJhdGNoKGV2ZW50cyl7RXZlbnRQbHVnaW5IdWIuZW5xdWV1ZUV2ZW50cyhldmVudHMpO0V2ZW50 UGx1Z2luSHViLnByb2Nlc3NFdmVudFF1ZXVlKGZhbHNlKX12YXIgUmVhY3RFdmVudEVtaXR0ZXJN aXhpbj17aGFuZGxlVG9wTGV2ZWw6ZnVuY3Rpb24odG9wTGV2ZWxUeXBlLHRhcmdldEluc3QsbmF0 aXZlRXZlbnQsbmF0aXZlRXZlbnRUYXJnZXQpe3ZhciBldmVudHM9RXZlbnRQbHVnaW5IdWIuZXh0 cmFjdEV2ZW50cyh0b3BMZXZlbFR5cGUsdGFyZ2V0SW5zdCxuYXRpdmVFdmVudCxuYXRpdmVFdmVu dFRhcmdldCk7cnVuRXZlbnRRdWV1ZUluQmF0Y2goZXZlbnRzKX19O21vZHVsZS5leHBvcnRzPVJl YWN0RXZlbnRFbWl0dGVyTWl4aW59LHsxNzoxN31dLDU3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVs ZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIF9hc3NpZ249X2RlcmVxXygxNTgpO3ZhciBFdmVu dExpc3RlbmVyPV9kZXJlcV8oMTM1KTt2YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQ9X2RlcmVxXygx MzYpO3ZhciBQb29sZWRDbGFzcz1fZGVyZXFfKDI1KTt2YXIgUmVhY3RET01Db21wb25lbnRUcmVl PV9kZXJlcV8oMzQpO3ZhciBSZWFjdFVwZGF0ZXM9X2RlcmVxXyg4Mik7dmFyIGdldEV2ZW50VGFy Z2V0PV9kZXJlcV8oMTE0KTt2YXIgZ2V0VW5ib3VuZGVkU2Nyb2xsUG9zaXRpb249X2RlcmVxXygx NDcpO2Z1bmN0aW9uIGZpbmRQYXJlbnQoaW5zdCl7d2hpbGUoaW5zdC5faG9zdFBhcmVudCl7aW5z dD1pbnN0Ll9ob3N0UGFyZW50fXZhciByb290Tm9kZT1SZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0 Tm9kZUZyb21JbnN0YW5jZShpbnN0KTt2YXIgY29udGFpbmVyPXJvb3ROb2RlLnBhcmVudE5vZGU7 cmV0dXJuIFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShj b250YWluZXIpfWZ1bmN0aW9uIFRvcExldmVsQ2FsbGJhY2tCb29rS2VlcGluZyh0b3BMZXZlbFR5 cGUsbmF0aXZlRXZlbnQpe3RoaXMudG9wTGV2ZWxUeXBlPXRvcExldmVsVHlwZTt0aGlzLm5hdGl2 ZUV2ZW50PW5hdGl2ZUV2ZW50O3RoaXMuYW5jZXN0b3JzPVtdfV9hc3NpZ24oVG9wTGV2ZWxDYWxs YmFja0Jvb2tLZWVwaW5nLnByb3RvdHlwZSx7ZGVzdHJ1Y3RvcjpmdW5jdGlvbigpe3RoaXMudG9w TGV2ZWxUeXBlPW51bGw7dGhpcy5uYXRpdmVFdmVudD1udWxsO3RoaXMuYW5jZXN0b3JzLmxlbmd0 aD0wfX0pO1Bvb2xlZENsYXNzLmFkZFBvb2xpbmdUbyhUb3BMZXZlbENhbGxiYWNrQm9va0tlZXBp bmcsUG9vbGVkQ2xhc3MudHdvQXJndW1lbnRQb29sZXIpO2Z1bmN0aW9uIGhhbmRsZVRvcExldmVs SW1wbChib29rS2VlcGluZyl7dmFyIG5hdGl2ZUV2ZW50VGFyZ2V0PWdldEV2ZW50VGFyZ2V0KGJv b2tLZWVwaW5nLm5hdGl2ZUV2ZW50KTt2YXIgdGFyZ2V0SW5zdD1SZWFjdERPTUNvbXBvbmVudFRy ZWUuZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUobmF0aXZlRXZlbnRUYXJnZXQpO3ZhciBhbmNl c3Rvcj10YXJnZXRJbnN0O2Rve2Jvb2tLZWVwaW5nLmFuY2VzdG9ycy5wdXNoKGFuY2VzdG9yKTth bmNlc3Rvcj1hbmNlc3RvciYmZmluZFBhcmVudChhbmNlc3Rvcil9d2hpbGUoYW5jZXN0b3IpO2Zv cih2YXIgaT0wO2k8Ym9va0tlZXBpbmcuYW5jZXN0b3JzLmxlbmd0aDtpKyspe3RhcmdldEluc3Q9 Ym9va0tlZXBpbmcuYW5jZXN0b3JzW2ldO1JlYWN0RXZlbnRMaXN0ZW5lci5faGFuZGxlVG9wTGV2 ZWwoYm9va0tlZXBpbmcudG9wTGV2ZWxUeXBlLHRhcmdldEluc3QsYm9va0tlZXBpbmcubmF0aXZl RXZlbnQsZ2V0RXZlbnRUYXJnZXQoYm9va0tlZXBpbmcubmF0aXZlRXZlbnQpKX19ZnVuY3Rpb24g c2Nyb2xsVmFsdWVNb25pdG9yKGNiKXt2YXIgc2Nyb2xsUG9zaXRpb249Z2V0VW5ib3VuZGVkU2Ny b2xsUG9zaXRpb24od2luZG93KTtjYihzY3JvbGxQb3NpdGlvbil9dmFyIFJlYWN0RXZlbnRMaXN0 ZW5lcj17X2VuYWJsZWQ6dHJ1ZSxfaGFuZGxlVG9wTGV2ZWw6bnVsbCxXSU5ET1dfSEFORExFOkV4 ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTT93aW5kb3c6bnVsbCxzZXRIYW5kbGVUb3BMZXZl bDpmdW5jdGlvbihoYW5kbGVUb3BMZXZlbCl7UmVhY3RFdmVudExpc3RlbmVyLl9oYW5kbGVUb3BM ZXZlbD1oYW5kbGVUb3BMZXZlbH0sc2V0RW5hYmxlZDpmdW5jdGlvbihlbmFibGVkKXtSZWFjdEV2 ZW50TGlzdGVuZXIuX2VuYWJsZWQ9ISFlbmFibGVkfSxpc0VuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1 cm4gUmVhY3RFdmVudExpc3RlbmVyLl9lbmFibGVkfSx0cmFwQnViYmxlZEV2ZW50OmZ1bmN0aW9u KHRvcExldmVsVHlwZSxoYW5kbGVyQmFzZU5hbWUsZWxlbWVudCl7aWYoIWVsZW1lbnQpe3JldHVy biBudWxsfXJldHVybiBFdmVudExpc3RlbmVyLmxpc3RlbihlbGVtZW50LGhhbmRsZXJCYXNlTmFt ZSxSZWFjdEV2ZW50TGlzdGVuZXIuZGlzcGF0Y2hFdmVudC5iaW5kKG51bGwsdG9wTGV2ZWxUeXBl KSl9LHRyYXBDYXB0dXJlZEV2ZW50OmZ1bmN0aW9uKHRvcExldmVsVHlwZSxoYW5kbGVyQmFzZU5h bWUsZWxlbWVudCl7aWYoIWVsZW1lbnQpe3JldHVybiBudWxsfXJldHVybiBFdmVudExpc3RlbmVy LmNhcHR1cmUoZWxlbWVudCxoYW5kbGVyQmFzZU5hbWUsUmVhY3RFdmVudExpc3RlbmVyLmRpc3Bh dGNoRXZlbnQuYmluZChudWxsLHRvcExldmVsVHlwZSkpfSxtb25pdG9yU2Nyb2xsVmFsdWU6ZnVu Y3Rpb24ocmVmcmVzaCl7dmFyIGNhbGxiYWNrPXNjcm9sbFZhbHVlTW9uaXRvci5iaW5kKG51bGws cmVmcmVzaCk7RXZlbnRMaXN0ZW5lci5saXN0ZW4od2luZG93LCJzY3JvbGwiLGNhbGxiYWNrKX0s ZGlzcGF0Y2hFdmVudDpmdW5jdGlvbih0b3BMZXZlbFR5cGUsbmF0aXZlRXZlbnQpe2lmKCFSZWFj dEV2ZW50TGlzdGVuZXIuX2VuYWJsZWQpe3JldHVybn12YXIgYm9va0tlZXBpbmc9VG9wTGV2ZWxD YWxsYmFja0Jvb2tLZWVwaW5nLmdldFBvb2xlZCh0b3BMZXZlbFR5cGUsbmF0aXZlRXZlbnQpO3Ry eXtSZWFjdFVwZGF0ZXMuYmF0Y2hlZFVwZGF0ZXMoaGFuZGxlVG9wTGV2ZWxJbXBsLGJvb2tLZWVw aW5nKX1maW5hbGx5e1RvcExldmVsQ2FsbGJhY2tCb29rS2VlcGluZy5yZWxlYXNlKGJvb2tLZWVw aW5nKX19fTttb2R1bGUuZXhwb3J0cz1SZWFjdEV2ZW50TGlzdGVuZXJ9LHsxMTQ6MTE0LDEzNTox MzUsMTM2OjEzNiwxNDc6MTQ3LDE1ODoxNTgsMjU6MjUsMzQ6MzQsODI6ODJ9XSw1ODpbZnVuY3Rp b24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBSZWFjdEZlYXR1cmVG bGFncz17bG9nVG9wTGV2ZWxSZW5kZXJzOmZhbHNlfTttb2R1bGUuZXhwb3J0cz1SZWFjdEZlYXR1 cmVGbGFnc30se31dLDU5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0 cmljdCI7dmFyIF9wcm9kSW52YXJpYW50PV9kZXJlcV8oMTI1KTt2YXIgaW52YXJpYW50PV9kZXJl cV8oMTUwKTt2YXIgZ2VuZXJpY0NvbXBvbmVudENsYXNzPW51bGw7dmFyIHRleHRDb21wb25lbnRD bGFzcz1udWxsO3ZhciBSZWFjdEhvc3RDb21wb25lbnRJbmplY3Rpb249e2luamVjdEdlbmVyaWND b21wb25lbnRDbGFzczpmdW5jdGlvbihjb21wb25lbnRDbGFzcyl7Z2VuZXJpY0NvbXBvbmVudENs YXNzPWNvbXBvbmVudENsYXNzfSxpbmplY3RUZXh0Q29tcG9uZW50Q2xhc3M6ZnVuY3Rpb24oY29t cG9uZW50Q2xhc3Mpe3RleHRDb21wb25lbnRDbGFzcz1jb21wb25lbnRDbGFzc319O2Z1bmN0aW9u IGNyZWF0ZUludGVybmFsQ29tcG9uZW50KGVsZW1lbnQpeyFnZW5lcmljQ29tcG9uZW50Q2xhc3M/ ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsIlRoZXJlIGlzIG5v IHJlZ2lzdGVyZWQgY29tcG9uZW50IGZvciB0aGUgdGFnICVzIixlbGVtZW50LnR5cGUpOl9wcm9k SW52YXJpYW50KCIxMTEiLGVsZW1lbnQudHlwZSk6dm9pZCAwO3JldHVybiBuZXcgZ2VuZXJpY0Nv bXBvbmVudENsYXNzKGVsZW1lbnQpfWZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlRm9yVGV4dCh0ZXh0 KXtyZXR1cm4gbmV3IHRleHRDb21wb25lbnRDbGFzcyh0ZXh0KX1mdW5jdGlvbiBpc1RleHRDb21w b25lbnQoY29tcG9uZW50KXtyZXR1cm4gY29tcG9uZW50IGluc3RhbmNlb2YgdGV4dENvbXBvbmVu dENsYXNzfXZhciBSZWFjdEhvc3RDb21wb25lbnQ9e2NyZWF0ZUludGVybmFsQ29tcG9uZW50OmNy ZWF0ZUludGVybmFsQ29tcG9uZW50LGNyZWF0ZUluc3RhbmNlRm9yVGV4dDpjcmVhdGVJbnN0YW5j ZUZvclRleHQsaXNUZXh0Q29tcG9uZW50OmlzVGV4dENvbXBvbmVudCxpbmplY3Rpb246UmVhY3RI b3N0Q29tcG9uZW50SW5qZWN0aW9ufTttb2R1bGUuZXhwb3J0cz1SZWFjdEhvc3RDb21wb25lbnR9 LHsxMjU6MTI1LDE1MDoxNTB9XSw2MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7 InVzZSBzdHJpY3QiO3ZhciBoaXN0b3J5PVtdO3ZhciBSZWFjdEhvc3RPcGVyYXRpb25IaXN0b3J5 SG9vaz17b25Ib3N0T3BlcmF0aW9uOmZ1bmN0aW9uKG9wZXJhdGlvbil7aGlzdG9yeS5wdXNoKG9w ZXJhdGlvbil9LGNsZWFySGlzdG9yeTpmdW5jdGlvbigpe2lmKFJlYWN0SG9zdE9wZXJhdGlvbkhp c3RvcnlIb29rLl9wcmV2ZW50Q2xlYXJpbmcpe3JldHVybn1oaXN0b3J5PVtdfSxnZXRIaXN0b3J5 OmZ1bmN0aW9uKCl7cmV0dXJuIGhpc3Rvcnl9fTttb2R1bGUuZXhwb3J0cz1SZWFjdEhvc3RPcGVy YXRpb25IaXN0b3J5SG9va30se31dLDYxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRz KXsidXNlIHN0cmljdCI7dmFyIERPTVByb3BlcnR5PV9kZXJlcV8oMTEpO3ZhciBFdmVudFBsdWdp bkh1Yj1fZGVyZXFfKDE3KTt2YXIgRXZlbnRQbHVnaW5VdGlscz1fZGVyZXFfKDE5KTt2YXIgUmVh Y3RDb21wb25lbnRFbnZpcm9ubWVudD1fZGVyZXFfKDI5KTt2YXIgUmVhY3RFbXB0eUNvbXBvbmVu dD1fZGVyZXFfKDU0KTt2YXIgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyPV9kZXJlcV8oMjYpO3Zh ciBSZWFjdEhvc3RDb21wb25lbnQ9X2RlcmVxXyg1OSk7dmFyIFJlYWN0VXBkYXRlcz1fZGVyZXFf KDgyKTt2YXIgUmVhY3RJbmplY3Rpb249e0NvbXBvbmVudDpSZWFjdENvbXBvbmVudEVudmlyb25t ZW50LmluamVjdGlvbixET01Qcm9wZXJ0eTpET01Qcm9wZXJ0eS5pbmplY3Rpb24sRW1wdHlDb21w b25lbnQ6UmVhY3RFbXB0eUNvbXBvbmVudC5pbmplY3Rpb24sRXZlbnRQbHVnaW5IdWI6RXZlbnRQ bHVnaW5IdWIuaW5qZWN0aW9uLEV2ZW50UGx1Z2luVXRpbHM6RXZlbnRQbHVnaW5VdGlscy5pbmpl Y3Rpb24sRXZlbnRFbWl0dGVyOlJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5pbmplY3Rpb24sSG9z dENvbXBvbmVudDpSZWFjdEhvc3RDb21wb25lbnQuaW5qZWN0aW9uLFVwZGF0ZXM6UmVhY3RVcGRh dGVzLmluamVjdGlvbn07bW9kdWxlLmV4cG9ydHM9UmVhY3RJbmplY3Rpb259LHsxMToxMSwxNzox NywxOToxOSwyNjoyNiwyOToyOSw1NDo1NCw1OTo1OSw4Mjo4Mn1dLDYyOltmdW5jdGlvbihfZGVy ZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIFJlYWN0RE9NU2VsZWN0aW9uPV9k ZXJlcV8oNDQpO3ZhciBjb250YWluc05vZGU9X2RlcmVxXygxMzkpO3ZhciBmb2N1c05vZGU9X2Rl cmVxXygxNDQpO3ZhciBnZXRBY3RpdmVFbGVtZW50PV9kZXJlcV8oMTQ1KTtmdW5jdGlvbiBpc0lu RG9jdW1lbnQobm9kZSl7cmV0dXJuIGNvbnRhaW5zTm9kZShkb2N1bWVudC5kb2N1bWVudEVsZW1l bnQsbm9kZSl9dmFyIFJlYWN0SW5wdXRTZWxlY3Rpb249e2hhc1NlbGVjdGlvbkNhcGFiaWxpdGll czpmdW5jdGlvbihlbGVtKXt2YXIgbm9kZU5hbWU9ZWxlbSYmZWxlbS5ub2RlTmFtZSYmZWxlbS5u b2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiBub2RlTmFtZSYmKG5vZGVOYW1lPT09ImlucHV0 IiYmZWxlbS50eXBlPT09InRleHQifHxub2RlTmFtZT09PSJ0ZXh0YXJlYSJ8fGVsZW0uY29udGVu dEVkaXRhYmxlPT09InRydWUiKX0sZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb246ZnVuY3Rpb24oKXt2 YXIgZm9jdXNlZEVsZW09Z2V0QWN0aXZlRWxlbWVudCgpO3JldHVybntmb2N1c2VkRWxlbTpmb2N1 c2VkRWxlbSxzZWxlY3Rpb25SYW5nZTpSZWFjdElucHV0U2VsZWN0aW9uLmhhc1NlbGVjdGlvbkNh cGFiaWxpdGllcyhmb2N1c2VkRWxlbSk/UmVhY3RJbnB1dFNlbGVjdGlvbi5nZXRTZWxlY3Rpb24o Zm9jdXNlZEVsZW0pOm51bGx9fSxyZXN0b3JlU2VsZWN0aW9uOmZ1bmN0aW9uKHByaW9yU2VsZWN0 aW9uSW5mb3JtYXRpb24pe3ZhciBjdXJGb2N1c2VkRWxlbT1nZXRBY3RpdmVFbGVtZW50KCk7dmFy IHByaW9yRm9jdXNlZEVsZW09cHJpb3JTZWxlY3Rpb25JbmZvcm1hdGlvbi5mb2N1c2VkRWxlbTt2 YXIgcHJpb3JTZWxlY3Rpb25SYW5nZT1wcmlvclNlbGVjdGlvbkluZm9ybWF0aW9uLnNlbGVjdGlv blJhbmdlO2lmKGN1ckZvY3VzZWRFbGVtIT09cHJpb3JGb2N1c2VkRWxlbSYmaXNJbkRvY3VtZW50 KHByaW9yRm9jdXNlZEVsZW0pKXtpZihSZWFjdElucHV0U2VsZWN0aW9uLmhhc1NlbGVjdGlvbkNh cGFiaWxpdGllcyhwcmlvckZvY3VzZWRFbGVtKSl7UmVhY3RJbnB1dFNlbGVjdGlvbi5zZXRTZWxl Y3Rpb24ocHJpb3JGb2N1c2VkRWxlbSxwcmlvclNlbGVjdGlvblJhbmdlKX1mb2N1c05vZGUocHJp b3JGb2N1c2VkRWxlbSl9fSxnZXRTZWxlY3Rpb246ZnVuY3Rpb24oaW5wdXQpe3ZhciBzZWxlY3Rp b247aWYoInNlbGVjdGlvblN0YXJ0ImluIGlucHV0KXtzZWxlY3Rpb249e3N0YXJ0OmlucHV0LnNl bGVjdGlvblN0YXJ0LGVuZDppbnB1dC5zZWxlY3Rpb25FbmR9fWVsc2UgaWYoZG9jdW1lbnQuc2Vs ZWN0aW9uJiZpbnB1dC5ub2RlTmFtZSYmaW5wdXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJp bnB1dCIpe3ZhciByYW5nZT1kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTtpZihyYW5n ZS5wYXJlbnRFbGVtZW50KCk9PT1pbnB1dCl7c2VsZWN0aW9uPXtzdGFydDotcmFuZ2UubW92ZVN0 YXJ0KCJjaGFyYWN0ZXIiLC1pbnB1dC52YWx1ZS5sZW5ndGgpLGVuZDotcmFuZ2UubW92ZUVuZCgi Y2hhcmFjdGVyIiwtaW5wdXQudmFsdWUubGVuZ3RoKX19fWVsc2V7c2VsZWN0aW9uPVJlYWN0RE9N U2VsZWN0aW9uLmdldE9mZnNldHMoaW5wdXQpfXJldHVybiBzZWxlY3Rpb258fHtzdGFydDowLGVu ZDowfX0sc2V0U2VsZWN0aW9uOmZ1bmN0aW9uKGlucHV0LG9mZnNldHMpe3ZhciBzdGFydD1vZmZz ZXRzLnN0YXJ0O3ZhciBlbmQ9b2Zmc2V0cy5lbmQ7aWYoZW5kPT09dW5kZWZpbmVkKXtlbmQ9c3Rh cnR9aWYoInNlbGVjdGlvblN0YXJ0ImluIGlucHV0KXtpbnB1dC5zZWxlY3Rpb25TdGFydD1zdGFy dDtpbnB1dC5zZWxlY3Rpb25FbmQ9TWF0aC5taW4oZW5kLGlucHV0LnZhbHVlLmxlbmd0aCl9ZWxz ZSBpZihkb2N1bWVudC5zZWxlY3Rpb24mJmlucHV0Lm5vZGVOYW1lJiZpbnB1dC5ub2RlTmFtZS50 b0xvd2VyQ2FzZSgpPT09ImlucHV0Iil7dmFyIHJhbmdlPWlucHV0LmNyZWF0ZVRleHRSYW5nZSgp O3JhbmdlLmNvbGxhcHNlKHRydWUpO3JhbmdlLm1vdmVTdGFydCgiY2hhcmFjdGVyIixzdGFydCk7 cmFuZ2UubW92ZUVuZCgiY2hhcmFjdGVyIixlbmQtc3RhcnQpO3JhbmdlLnNlbGVjdCgpfWVsc2V7 UmVhY3RET01TZWxlY3Rpb24uc2V0T2Zmc2V0cyhpbnB1dCxvZmZzZXRzKX19fTttb2R1bGUuZXhw b3J0cz1SZWFjdElucHV0U2VsZWN0aW9ufSx7MTM5OjEzOSwxNDQ6MTQ0LDE0NToxNDUsNDQ6NDR9 XSw2MzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBS ZWFjdEluc3RhbmNlTWFwPXtyZW1vdmU6ZnVuY3Rpb24oa2V5KXtrZXkuX3JlYWN0SW50ZXJuYWxJ bnN0YW5jZT11bmRlZmluZWR9LGdldDpmdW5jdGlvbihrZXkpe3JldHVybiBrZXkuX3JlYWN0SW50 ZXJuYWxJbnN0YW5jZX0saGFzOmZ1bmN0aW9uKGtleSl7cmV0dXJuIGtleS5fcmVhY3RJbnRlcm5h bEluc3RhbmNlIT09dW5kZWZpbmVkfSxzZXQ6ZnVuY3Rpb24oa2V5LHZhbHVlKXtrZXkuX3JlYWN0 SW50ZXJuYWxJbnN0YW5jZT12YWx1ZX19O21vZHVsZS5leHBvcnRzPVJlYWN0SW5zdGFuY2VNYXB9 LHt9XSw2NDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3Zh ciBkZWJ1Z1Rvb2w9bnVsbDtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXt2YXIgUmVh Y3REZWJ1Z1Rvb2w9X2RlcmVxXyg1MCk7ZGVidWdUb29sPVJlYWN0RGVidWdUb29sfW1vZHVsZS5l eHBvcnRzPXtkZWJ1Z1Rvb2w6ZGVidWdUb29sfX0sezUwOjUwfV0sNjU6W2Z1bmN0aW9uKF9kZXJl cV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgd2FybmluZz1fZGVyZXFfKDE1Nyk7 aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7dmFyIHByb2Nlc3NpbmdDaGlsZENvbnRl eHQ9ZmFsc2U7dmFyIHdhcm5JbnZhbGlkU2V0U3RhdGU9ZnVuY3Rpb24oKXsiZGV2ZWxvcG1lbnQi IT09InByb2R1Y3Rpb24iP3dhcm5pbmcoIXByb2Nlc3NpbmdDaGlsZENvbnRleHQsInNldFN0YXRl KC4uLik6IENhbm5vdCBjYWxsIHNldFN0YXRlKCkgaW5zaWRlIGdldENoaWxkQ29udGV4dCgpIik6 dm9pZCAwfX12YXIgUmVhY3RJbnZhbGlkU2V0U3RhdGVXYXJuaW5nSG9vaz17b25CZWdpblByb2Nl c3NpbmdDaGlsZENvbnRleHQ6ZnVuY3Rpb24oKXtwcm9jZXNzaW5nQ2hpbGRDb250ZXh0PXRydWV9 LG9uRW5kUHJvY2Vzc2luZ0NoaWxkQ29udGV4dDpmdW5jdGlvbigpe3Byb2Nlc3NpbmdDaGlsZENv bnRleHQ9ZmFsc2V9LG9uU2V0U3RhdGU6ZnVuY3Rpb24oKXt3YXJuSW52YWxpZFNldFN0YXRlKCl9 fTttb2R1bGUuZXhwb3J0cz1SZWFjdEludmFsaWRTZXRTdGF0ZVdhcm5pbmdIb29rfSx7MTU3OjE1 N31dLDY2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFy IGFkbGVyMzI9X2RlcmVxXygxMDMpO3ZhciBUQUdfRU5EPS9cLz8+Lzt2YXIgQ09NTUVOVF9TVEFS VD0vXjxcIVwtXC0vO3ZhciBSZWFjdE1hcmt1cENoZWNrc3VtPXtDSEVDS1NVTV9BVFRSX05BTUU6 ImRhdGEtcmVhY3QtY2hlY2tzdW0iLGFkZENoZWNrc3VtVG9NYXJrdXA6ZnVuY3Rpb24obWFya3Vw KXt2YXIgY2hlY2tzdW09YWRsZXIzMihtYXJrdXApO2lmKENPTU1FTlRfU1RBUlQudGVzdChtYXJr dXApKXtyZXR1cm4gbWFya3VwfWVsc2V7cmV0dXJuIG1hcmt1cC5yZXBsYWNlKFRBR19FTkQsIiAi K1JlYWN0TWFya3VwQ2hlY2tzdW0uQ0hFQ0tTVU1fQVRUUl9OQU1FKyc9IicrY2hlY2tzdW0rJyIk JicpfX0sY2FuUmV1c2VNYXJrdXA6ZnVuY3Rpb24obWFya3VwLGVsZW1lbnQpe3ZhciBleGlzdGlu Z0NoZWNrc3VtPWVsZW1lbnQuZ2V0QXR0cmlidXRlKFJlYWN0TWFya3VwQ2hlY2tzdW0uQ0hFQ0tT VU1fQVRUUl9OQU1FKTtleGlzdGluZ0NoZWNrc3VtPWV4aXN0aW5nQ2hlY2tzdW0mJnBhcnNlSW50 KGV4aXN0aW5nQ2hlY2tzdW0sMTApO3ZhciBtYXJrdXBDaGVja3N1bT1hZGxlcjMyKG1hcmt1cCk7 cmV0dXJuIG1hcmt1cENoZWNrc3VtPT09ZXhpc3RpbmdDaGVja3N1bX19O21vZHVsZS5leHBvcnRz PVJlYWN0TWFya3VwQ2hlY2tzdW19LHsxMDM6MTAzfV0sNjc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9k dWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgX3Byb2RJbnZhcmlhbnQ9X2RlcmVxXygxMjUp O3ZhciBET01MYXp5VHJlZT1fZGVyZXFfKDkpO3ZhciBET01Qcm9wZXJ0eT1fZGVyZXFfKDExKTt2 YXIgUmVhY3Q9X2RlcmVxXygxMzQpO3ZhciBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXI9X2RlcmVx XygyNik7dmFyIFJlYWN0Q3VycmVudE93bmVyPV9kZXJlcV8oMTMzKTt2YXIgUmVhY3RET01Db21w b25lbnRUcmVlPV9kZXJlcV8oMzQpO3ZhciBSZWFjdERPTUNvbnRhaW5lckluZm89X2RlcmVxXygz NSk7dmFyIFJlYWN0RE9NRmVhdHVyZUZsYWdzPV9kZXJlcV8oMzcpO3ZhciBSZWFjdEZlYXR1cmVG bGFncz1fZGVyZXFfKDU4KTt2YXIgUmVhY3RJbnN0YW5jZU1hcD1fZGVyZXFfKDYzKTt2YXIgUmVh Y3RJbnN0cnVtZW50YXRpb249X2RlcmVxXyg2NCk7dmFyIFJlYWN0TWFya3VwQ2hlY2tzdW09X2Rl cmVxXyg2Nik7dmFyIFJlYWN0UmVjb25jaWxlcj1fZGVyZXFfKDc1KTt2YXIgUmVhY3RVcGRhdGVR dWV1ZT1fZGVyZXFfKDgxKTt2YXIgUmVhY3RVcGRhdGVzPV9kZXJlcV8oODIpO3ZhciBlbXB0eU9i amVjdD1fZGVyZXFfKDE0Myk7dmFyIGluc3RhbnRpYXRlUmVhY3RDb21wb25lbnQ9X2RlcmVxXygx MjEpO3ZhciBpbnZhcmlhbnQ9X2RlcmVxXygxNTApO3ZhciBzZXRJbm5lckhUTUw9X2RlcmVxXygx MjcpO3ZhciBzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudD1fZGVyZXFfKDEyOSk7dmFyIHdhcm5p bmc9X2RlcmVxXygxNTcpO3ZhciBBVFRSX05BTUU9RE9NUHJvcGVydHkuSURfQVRUUklCVVRFX05B TUU7dmFyIFJPT1RfQVRUUl9OQU1FPURPTVByb3BlcnR5LlJPT1RfQVRUUklCVVRFX05BTUU7dmFy IEVMRU1FTlRfTk9ERV9UWVBFPTE7dmFyIERPQ19OT0RFX1RZUEU9OTt2YXIgRE9DVU1FTlRfRlJB R01FTlRfTk9ERV9UWVBFPTExO3ZhciBpbnN0YW5jZXNCeVJlYWN0Um9vdElEPXt9O2Z1bmN0aW9u IGZpcnN0RGlmZmVyZW5jZUluZGV4KHN0cmluZzEsc3RyaW5nMil7dmFyIG1pbkxlbj1NYXRoLm1p bihzdHJpbmcxLmxlbmd0aCxzdHJpbmcyLmxlbmd0aCk7Zm9yKHZhciBpPTA7aTxtaW5MZW47aSsr KXtpZihzdHJpbmcxLmNoYXJBdChpKSE9PXN0cmluZzIuY2hhckF0KGkpKXtyZXR1cm4gaX19cmV0 dXJuIHN0cmluZzEubGVuZ3RoPT09c3RyaW5nMi5sZW5ndGg/LTE6bWluTGVufWZ1bmN0aW9uIGdl dFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpe2lmKCFjb250YWluZXIpe3Jl dHVybiBudWxsfWlmKGNvbnRhaW5lci5ub2RlVHlwZT09PURPQ19OT0RFX1RZUEUpe3JldHVybiBj b250YWluZXIuZG9jdW1lbnRFbGVtZW50fWVsc2V7cmV0dXJuIGNvbnRhaW5lci5maXJzdENoaWxk fX1mdW5jdGlvbiBpbnRlcm5hbEdldElEKG5vZGUpe3JldHVybiBub2RlLmdldEF0dHJpYnV0ZSYm bm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKXx8IiJ9ZnVuY3Rpb24gbW91bnRDb21wb25lbnRJ bnRvTm9kZSh3cmFwcGVySW5zdGFuY2UsY29udGFpbmVyLHRyYW5zYWN0aW9uLHNob3VsZFJldXNl TWFya3VwLGNvbnRleHQpe3ZhciBtYXJrZXJOYW1lO2lmKFJlYWN0RmVhdHVyZUZsYWdzLmxvZ1Rv cExldmVsUmVuZGVycyl7dmFyIHdyYXBwZWRFbGVtZW50PXdyYXBwZXJJbnN0YW5jZS5fY3VycmVu dEVsZW1lbnQucHJvcHMuY2hpbGQ7dmFyIHR5cGU9d3JhcHBlZEVsZW1lbnQudHlwZTttYXJrZXJO YW1lPSJSZWFjdCBtb3VudDogIisodHlwZW9mIHR5cGU9PT0ic3RyaW5nIj90eXBlOnR5cGUuZGlz cGxheU5hbWV8fHR5cGUubmFtZSk7Y29uc29sZS50aW1lKG1hcmtlck5hbWUpfXZhciBtYXJrdXA9 UmVhY3RSZWNvbmNpbGVyLm1vdW50Q29tcG9uZW50KHdyYXBwZXJJbnN0YW5jZSx0cmFuc2FjdGlv bixudWxsLFJlYWN0RE9NQ29udGFpbmVySW5mbyh3cmFwcGVySW5zdGFuY2UsY29udGFpbmVyKSxj b250ZXh0LDApO2lmKG1hcmtlck5hbWUpe2NvbnNvbGUudGltZUVuZChtYXJrZXJOYW1lKX13cmFw cGVySW5zdGFuY2UuX3JlbmRlcmVkQ29tcG9uZW50Ll90b3BMZXZlbFdyYXBwZXI9d3JhcHBlcklu c3RhbmNlO1JlYWN0TW91bnQuX21vdW50SW1hZ2VJbnRvTm9kZShtYXJrdXAsY29udGFpbmVyLHdy YXBwZXJJbnN0YW5jZSxzaG91bGRSZXVzZU1hcmt1cCx0cmFuc2FjdGlvbil9ZnVuY3Rpb24gYmF0 Y2hlZE1vdW50Q29tcG9uZW50SW50b05vZGUoY29tcG9uZW50SW5zdGFuY2UsY29udGFpbmVyLHNo b3VsZFJldXNlTWFya3VwLGNvbnRleHQpe3ZhciB0cmFuc2FjdGlvbj1SZWFjdFVwZGF0ZXMuUmVh Y3RSZWNvbmNpbGVUcmFuc2FjdGlvbi5nZXRQb29sZWQoIXNob3VsZFJldXNlTWFya3VwJiZSZWFj dERPTUZlYXR1cmVGbGFncy51c2VDcmVhdGVFbGVtZW50KTt0cmFuc2FjdGlvbi5wZXJmb3JtKG1v dW50Q29tcG9uZW50SW50b05vZGUsbnVsbCxjb21wb25lbnRJbnN0YW5jZSxjb250YWluZXIsdHJh bnNhY3Rpb24sc2hvdWxkUmV1c2VNYXJrdXAsY29udGV4dCk7UmVhY3RVcGRhdGVzLlJlYWN0UmVj b25jaWxlVHJhbnNhY3Rpb24ucmVsZWFzZSh0cmFuc2FjdGlvbil9ZnVuY3Rpb24gdW5tb3VudENv bXBvbmVudEZyb21Ob2RlKGluc3RhbmNlLGNvbnRhaW5lcixzYWZlbHkpe2lmKCJkZXZlbG9wbWVu dCIhPT0icHJvZHVjdGlvbiIpe1JlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkJlZ2lu Rmx1c2goKX1SZWFjdFJlY29uY2lsZXIudW5tb3VudENvbXBvbmVudChpbnN0YW5jZSxzYWZlbHkp O2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe1JlYWN0SW5zdHJ1bWVudGF0aW9uLmRl YnVnVG9vbC5vbkVuZEZsdXNoKCl9aWYoY29udGFpbmVyLm5vZGVUeXBlPT09RE9DX05PREVfVFlQ RSl7Y29udGFpbmVyPWNvbnRhaW5lci5kb2N1bWVudEVsZW1lbnR9d2hpbGUoY29udGFpbmVyLmxh c3RDaGlsZCl7Y29udGFpbmVyLnJlbW92ZUNoaWxkKGNvbnRhaW5lci5sYXN0Q2hpbGQpfX1mdW5j dGlvbiBoYXNOb25Sb290UmVhY3RDaGlsZChjb250YWluZXIpe3ZhciByb290RWw9Z2V0UmVhY3RS b290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7aWYocm9vdEVsKXt2YXIgaW5zdD1SZWFj dERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShyb290RWwpO3JldHVybiEhKGlu c3QmJmluc3QuX2hvc3RQYXJlbnQpfX1mdW5jdGlvbiBub2RlSXNSZW5kZXJlZEJ5T3RoZXJJbnN0 YW5jZShjb250YWluZXIpe3ZhciByb290RWw9Z2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVy KGNvbnRhaW5lcik7cmV0dXJuISEocm9vdEVsJiZpc1JlYWN0Tm9kZShyb290RWwpJiYhUmVhY3RE T01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUocm9vdEVsKSl9ZnVuY3Rpb24gaXNW YWxpZENvbnRhaW5lcihub2RlKXtyZXR1cm4hIShub2RlJiYobm9kZS5ub2RlVHlwZT09PUVMRU1F TlRfTk9ERV9UWVBFfHxub2RlLm5vZGVUeXBlPT09RE9DX05PREVfVFlQRXx8bm9kZS5ub2RlVHlw ZT09PURPQ1VNRU5UX0ZSQUdNRU5UX05PREVfVFlQRSkpfWZ1bmN0aW9uIGlzUmVhY3ROb2RlKG5v ZGUpe3JldHVybiBpc1ZhbGlkQ29udGFpbmVyKG5vZGUpJiYobm9kZS5oYXNBdHRyaWJ1dGUoUk9P VF9BVFRSX05BTUUpfHxub2RlLmhhc0F0dHJpYnV0ZShBVFRSX05BTUUpKX1mdW5jdGlvbiBnZXRI b3N0Um9vdEluc3RhbmNlSW5Db250YWluZXIoY29udGFpbmVyKXt2YXIgcm9vdEVsPWdldFJlYWN0 Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO3ZhciBwcmV2SG9zdEluc3RhbmNlPXJv b3RFbCYmUmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUocm9vdEVsKTty ZXR1cm4gcHJldkhvc3RJbnN0YW5jZSYmIXByZXZIb3N0SW5zdGFuY2UuX2hvc3RQYXJlbnQ/cHJl dkhvc3RJbnN0YW5jZTpudWxsfWZ1bmN0aW9uIGdldFRvcExldmVsV3JhcHBlckluQ29udGFpbmVy KGNvbnRhaW5lcil7dmFyIHJvb3Q9Z2V0SG9zdFJvb3RJbnN0YW5jZUluQ29udGFpbmVyKGNvbnRh aW5lcik7cmV0dXJuIHJvb3Q/cm9vdC5faG9zdENvbnRhaW5lckluZm8uX3RvcExldmVsV3JhcHBl cjpudWxsfXZhciB0b3BMZXZlbFJvb3RDb3VudGVyPTE7dmFyIFRvcExldmVsV3JhcHBlcj1mdW5j dGlvbigpe3RoaXMucm9vdElEPXRvcExldmVsUm9vdENvdW50ZXIrK307VG9wTGV2ZWxXcmFwcGVy LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PXt9O2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVj dGlvbiIpe1RvcExldmVsV3JhcHBlci5kaXNwbGF5TmFtZT0iVG9wTGV2ZWxXcmFwcGVyIn1Ub3BM ZXZlbFdyYXBwZXIucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnByb3Bz LmNoaWxkfTtUb3BMZXZlbFdyYXBwZXIuaXNSZWFjdFRvcExldmVsV3JhcHBlcj10cnVlO3ZhciBS ZWFjdE1vdW50PXtUb3BMZXZlbFdyYXBwZXI6VG9wTGV2ZWxXcmFwcGVyLF9pbnN0YW5jZXNCeVJl YWN0Um9vdElEOmluc3RhbmNlc0J5UmVhY3RSb290SUQsc2Nyb2xsTW9uaXRvcjpmdW5jdGlvbihj b250YWluZXIscmVuZGVyQ2FsbGJhY2spe3JlbmRlckNhbGxiYWNrKCl9LF91cGRhdGVSb290Q29t cG9uZW50OmZ1bmN0aW9uKHByZXZDb21wb25lbnQsbmV4dEVsZW1lbnQsbmV4dENvbnRleHQsY29u dGFpbmVyLGNhbGxiYWNrKXtSZWFjdE1vdW50LnNjcm9sbE1vbml0b3IoY29udGFpbmVyLGZ1bmN0 aW9uKCl7UmVhY3RVcGRhdGVRdWV1ZS5lbnF1ZXVlRWxlbWVudEludGVybmFsKHByZXZDb21wb25l bnQsbmV4dEVsZW1lbnQsbmV4dENvbnRleHQpO2lmKGNhbGxiYWNrKXtSZWFjdFVwZGF0ZVF1ZXVl LmVucXVldWVDYWxsYmFja0ludGVybmFsKHByZXZDb21wb25lbnQsY2FsbGJhY2spfX0pO3JldHVy biBwcmV2Q29tcG9uZW50fSxfcmVuZGVyTmV3Um9vdENvbXBvbmVudDpmdW5jdGlvbihuZXh0RWxl bWVudCxjb250YWluZXIsc2hvdWxkUmV1c2VNYXJrdXAsY29udGV4dCl7ImRldmVsb3BtZW50IiE9 PSJwcm9kdWN0aW9uIj93YXJuaW5nKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQ9PW51bGwsIl9y ZW5kZXJOZXdSb290Q29tcG9uZW50KCk6IFJlbmRlciBtZXRob2RzIHNob3VsZCBiZSBhIHB1cmUg ZnVuY3Rpb24gIisib2YgcHJvcHMgYW5kIHN0YXRlOyB0cmlnZ2VyaW5nIG5lc3RlZCBjb21wb25l bnQgdXBkYXRlcyBmcm9tICIrInJlbmRlciBpcyBub3QgYWxsb3dlZC4gSWYgbmVjZXNzYXJ5LCB0 cmlnZ2VyIG5lc3RlZCB1cGRhdGVzIGluICIrImNvbXBvbmVudERpZFVwZGF0ZS4gQ2hlY2sgdGhl IHJlbmRlciBtZXRob2Qgb2YgJXMuIixSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50JiZSZWFjdEN1 cnJlbnRPd25lci5jdXJyZW50LmdldE5hbWUoKXx8IlJlYWN0Q29tcG9zaXRlQ29tcG9uZW50Iik6 dm9pZCAwOyFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcik/ImRldmVsb3BtZW50IiE9PSJwcm9k dWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsIl9yZWdpc3RlckNvbXBvbmVudCguLi4pOiBUYXJnZXQg Y29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LiIpOl9wcm9kSW52YXJpYW50KCIzNyIpOnZv aWQgMDtSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuZW5zdXJlU2Nyb2xsVmFsdWVNb25pdG9yaW5n KCk7dmFyIGNvbXBvbmVudEluc3RhbmNlPWluc3RhbnRpYXRlUmVhY3RDb21wb25lbnQobmV4dEVs ZW1lbnQsZmFsc2UpO1JlYWN0VXBkYXRlcy5iYXRjaGVkVXBkYXRlcyhiYXRjaGVkTW91bnRDb21w b25lbnRJbnRvTm9kZSxjb21wb25lbnRJbnN0YW5jZSxjb250YWluZXIsc2hvdWxkUmV1c2VNYXJr dXAsY29udGV4dCk7dmFyIHdyYXBwZXJJRD1jb21wb25lbnRJbnN0YW5jZS5faW5zdGFuY2Uucm9v dElEO2luc3RhbmNlc0J5UmVhY3RSb290SURbd3JhcHBlcklEXT1jb21wb25lbnRJbnN0YW5jZTty ZXR1cm4gY29tcG9uZW50SW5zdGFuY2V9LHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyOmZ1bmN0 aW9uKHBhcmVudENvbXBvbmVudCxuZXh0RWxlbWVudCxjb250YWluZXIsY2FsbGJhY2speyEocGFy ZW50Q29tcG9uZW50IT1udWxsJiZSZWFjdEluc3RhbmNlTWFwLmhhcyhwYXJlbnRDb21wb25lbnQp KT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwicGFyZW50Q29t cG9uZW50IG11c3QgYmUgYSB2YWxpZCBSZWFjdCBDb21wb25lbnQiKTpfcHJvZEludmFyaWFudCgi MzgiKTp2b2lkIDA7cmV0dXJuIFJlYWN0TW91bnQuX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVy KHBhcmVudENvbXBvbmVudCxuZXh0RWxlbWVudCxjb250YWluZXIsY2FsbGJhY2spfSxfcmVuZGVy U3VidHJlZUludG9Db250YWluZXI6ZnVuY3Rpb24ocGFyZW50Q29tcG9uZW50LG5leHRFbGVtZW50 LGNvbnRhaW5lcixjYWxsYmFjayl7UmVhY3RVcGRhdGVRdWV1ZS52YWxpZGF0ZUNhbGxiYWNrKGNh bGxiYWNrLCJSZWFjdERPTS5yZW5kZXIiKTshUmVhY3QuaXNWYWxpZEVsZW1lbnQobmV4dEVsZW1l bnQpPyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJSZWFjdERP TS5yZW5kZXIoKTogSW52YWxpZCBjb21wb25lbnQgZWxlbWVudC4lcyIsdHlwZW9mIG5leHRFbGVt ZW50PT09InN0cmluZyI/IiBJbnN0ZWFkIG9mIHBhc3NpbmcgYSBzdHJpbmcgbGlrZSAnZGl2Jywg cGFzcyAiKyJSZWFjdC5jcmVhdGVFbGVtZW50KCdkaXYnKSBvciA8ZGl2IC8+LiI6dHlwZW9mIG5l eHRFbGVtZW50PT09ImZ1bmN0aW9uIj8iIEluc3RlYWQgb2YgcGFzc2luZyBhIGNsYXNzIGxpa2Ug Rm9vLCBwYXNzICIrIlJlYWN0LmNyZWF0ZUVsZW1lbnQoRm9vKSBvciA8Rm9vIC8+LiI6bmV4dEVs ZW1lbnQhPW51bGwmJm5leHRFbGVtZW50LnByb3BzIT09dW5kZWZpbmVkPyIgVGhpcyBtYXkgYmUg Y2F1c2VkIGJ5IHVuaW50ZW50aW9uYWxseSBsb2FkaW5nIHR3byBpbmRlcGVuZGVudCAiKyJjb3Bp ZXMgb2YgUmVhY3QuIjoiIik6X3Byb2RJbnZhcmlhbnQoIjM5Iix0eXBlb2YgbmV4dEVsZW1lbnQ9 PT0ic3RyaW5nIj8iIEluc3RlYWQgb2YgcGFzc2luZyBhIHN0cmluZyBsaWtlICdkaXYnLCBwYXNz ICIrIlJlYWN0LmNyZWF0ZUVsZW1lbnQoJ2RpdicpIG9yIDxkaXYgLz4uIjp0eXBlb2YgbmV4dEVs ZW1lbnQ9PT0iZnVuY3Rpb24iPyIgSW5zdGVhZCBvZiBwYXNzaW5nIGEgY2xhc3MgbGlrZSBGb28s IHBhc3MgIisiUmVhY3QuY3JlYXRlRWxlbWVudChGb28pIG9yIDxGb28gLz4uIjpuZXh0RWxlbWVu dCE9bnVsbCYmbmV4dEVsZW1lbnQucHJvcHMhPT11bmRlZmluZWQ/IiBUaGlzIG1heSBiZSBjYXVz ZWQgYnkgdW5pbnRlbnRpb25hbGx5IGxvYWRpbmcgdHdvIGluZGVwZW5kZW50ICIrImNvcGllcyBv ZiBSZWFjdC4iOiIiKTp2b2lkIDA7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5n KCFjb250YWluZXJ8fCFjb250YWluZXIudGFnTmFtZXx8Y29udGFpbmVyLnRhZ05hbWUudG9VcHBl ckNhc2UoKSE9PSJCT0RZIiwicmVuZGVyKCk6IFJlbmRlcmluZyBjb21wb25lbnRzIGRpcmVjdGx5 IGludG8gZG9jdW1lbnQuYm9keSBpcyAiKyJkaXNjb3VyYWdlZCwgc2luY2UgaXRzIGNoaWxkcmVu IGFyZSBvZnRlbiBtYW5pcHVsYXRlZCBieSB0aGlyZC1wYXJ0eSAiKyJzY3JpcHRzIGFuZCBicm93 c2VyIGV4dGVuc2lvbnMuIFRoaXMgbWF5IGxlYWQgdG8gc3VidGxlICIrInJlY29uY2lsaWF0aW9u IGlzc3Vlcy4gVHJ5IHJlbmRlcmluZyBpbnRvIGEgY29udGFpbmVyIGVsZW1lbnQgY3JlYXRlZCAi KyJmb3IgeW91ciBhcHAuIik6dm9pZCAwO3ZhciBuZXh0V3JhcHBlZEVsZW1lbnQ9UmVhY3QuY3Jl YXRlRWxlbWVudChUb3BMZXZlbFdyYXBwZXIse2NoaWxkOm5leHRFbGVtZW50fSk7dmFyIG5leHRD b250ZXh0O2lmKHBhcmVudENvbXBvbmVudCl7dmFyIHBhcmVudEluc3Q9UmVhY3RJbnN0YW5jZU1h cC5nZXQocGFyZW50Q29tcG9uZW50KTtuZXh0Q29udGV4dD1wYXJlbnRJbnN0Ll9wcm9jZXNzQ2hp bGRDb250ZXh0KHBhcmVudEluc3QuX2NvbnRleHQpfWVsc2V7bmV4dENvbnRleHQ9ZW1wdHlPYmpl Y3R9dmFyIHByZXZDb21wb25lbnQ9Z2V0VG9wTGV2ZWxXcmFwcGVySW5Db250YWluZXIoY29udGFp bmVyKTtpZihwcmV2Q29tcG9uZW50KXt2YXIgcHJldldyYXBwZWRFbGVtZW50PXByZXZDb21wb25l bnQuX2N1cnJlbnRFbGVtZW50O3ZhciBwcmV2RWxlbWVudD1wcmV2V3JhcHBlZEVsZW1lbnQucHJv cHMuY2hpbGQ7aWYoc2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQocHJldkVsZW1lbnQsbmV4dEVs ZW1lbnQpKXt2YXIgcHVibGljSW5zdD1wcmV2Q29tcG9uZW50Ll9yZW5kZXJlZENvbXBvbmVudC5n ZXRQdWJsaWNJbnN0YW5jZSgpO3ZhciB1cGRhdGVkQ2FsbGJhY2s9Y2FsbGJhY2smJmZ1bmN0aW9u KCl7Y2FsbGJhY2suY2FsbChwdWJsaWNJbnN0KX07UmVhY3RNb3VudC5fdXBkYXRlUm9vdENvbXBv bmVudChwcmV2Q29tcG9uZW50LG5leHRXcmFwcGVkRWxlbWVudCxuZXh0Q29udGV4dCxjb250YWlu ZXIsdXBkYXRlZENhbGxiYWNrKTtyZXR1cm4gcHVibGljSW5zdH1lbHNle1JlYWN0TW91bnQudW5t b3VudENvbXBvbmVudEF0Tm9kZShjb250YWluZXIpfX12YXIgcmVhY3RSb290RWxlbWVudD1nZXRS ZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTt2YXIgY29udGFpbmVySGFzUmVh Y3RNYXJrdXA9cmVhY3RSb290RWxlbWVudCYmISFpbnRlcm5hbEdldElEKHJlYWN0Um9vdEVsZW1l bnQpO3ZhciBjb250YWluZXJIYXNOb25Sb290UmVhY3RDaGlsZD1oYXNOb25Sb290UmVhY3RDaGls ZChjb250YWluZXIpO2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpeyJkZXZlbG9wbWVu dCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyghY29udGFpbmVySGFzTm9uUm9vdFJlYWN0Q2hpbGQs InJlbmRlciguLi4pOiBSZXBsYWNpbmcgUmVhY3QtcmVuZGVyZWQgY2hpbGRyZW4gd2l0aCBhIG5l dyByb290ICIrImNvbXBvbmVudC4gSWYgeW91IGludGVuZGVkIHRvIHVwZGF0ZSB0aGUgY2hpbGRy ZW4gb2YgdGhpcyBub2RlLCAiKyJ5b3Ugc2hvdWxkIGluc3RlYWQgaGF2ZSB0aGUgZXhpc3Rpbmcg Y2hpbGRyZW4gdXBkYXRlIHRoZWlyIHN0YXRlICIrImFuZCByZW5kZXIgdGhlIG5ldyBjb21wb25l bnRzIGluc3RlYWQgb2YgY2FsbGluZyBSZWFjdERPTS5yZW5kZXIuIik6dm9pZCAwO2lmKCFjb250 YWluZXJIYXNSZWFjdE1hcmt1cHx8cmVhY3RSb290RWxlbWVudC5uZXh0U2libGluZyl7dmFyIHJv b3RFbGVtZW50U2libGluZz1yZWFjdFJvb3RFbGVtZW50O3doaWxlKHJvb3RFbGVtZW50U2libGlu Zyl7aWYoaW50ZXJuYWxHZXRJRChyb290RWxlbWVudFNpYmxpbmcpKXsiZGV2ZWxvcG1lbnQiIT09 InByb2R1Y3Rpb24iP3dhcm5pbmcoZmFsc2UsInJlbmRlcigpOiBUYXJnZXQgbm9kZSBoYXMgbWFy a3VwIHJlbmRlcmVkIGJ5IFJlYWN0LCBidXQgdGhlcmUgIisiYXJlIHVucmVsYXRlZCBub2RlcyBh cyB3ZWxsLiBUaGlzIGlzIG1vc3QgY29tbW9ubHkgY2F1c2VkIGJ5ICIrIndoaXRlLXNwYWNlIGlu c2VydGVkIGFyb3VuZCBzZXJ2ZXItcmVuZGVyZWQgbWFya3VwLiIpOnZvaWQgMDticmVha31yb290 RWxlbWVudFNpYmxpbmc9cm9vdEVsZW1lbnRTaWJsaW5nLm5leHRTaWJsaW5nfX19dmFyIHNob3Vs ZFJldXNlTWFya3VwPWNvbnRhaW5lckhhc1JlYWN0TWFya3VwJiYhcHJldkNvbXBvbmVudCYmIWNv bnRhaW5lckhhc05vblJvb3RSZWFjdENoaWxkO3ZhciBjb21wb25lbnQ9UmVhY3RNb3VudC5fcmVu ZGVyTmV3Um9vdENvbXBvbmVudChuZXh0V3JhcHBlZEVsZW1lbnQsY29udGFpbmVyLHNob3VsZFJl dXNlTWFya3VwLG5leHRDb250ZXh0KS5fcmVuZGVyZWRDb21wb25lbnQuZ2V0UHVibGljSW5zdGFu Y2UoKTtpZihjYWxsYmFjayl7Y2FsbGJhY2suY2FsbChjb21wb25lbnQpfXJldHVybiBjb21wb25l bnR9LHJlbmRlcjpmdW5jdGlvbihuZXh0RWxlbWVudCxjb250YWluZXIsY2FsbGJhY2spe3JldHVy biBSZWFjdE1vdW50Ll9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihudWxsLG5leHRFbGVtZW50 LGNvbnRhaW5lcixjYWxsYmFjayl9LHVubW91bnRDb21wb25lbnRBdE5vZGU6ZnVuY3Rpb24oY29u dGFpbmVyKXsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmcoUmVhY3RDdXJyZW50 T3duZXIuY3VycmVudD09bnVsbCwidW5tb3VudENvbXBvbmVudEF0Tm9kZSgpOiBSZW5kZXIgbWV0 aG9kcyBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uICIrIm9mIHByb3BzIGFuZCBzdGF0ZTsgdHJp Z2dlcmluZyBuZXN0ZWQgY29tcG9uZW50IHVwZGF0ZXMgZnJvbSByZW5kZXIgIisiaXMgbm90IGFs bG93ZWQuIElmIG5lY2Vzc2FyeSwgdHJpZ2dlciBuZXN0ZWQgdXBkYXRlcyBpbiAiKyJjb21wb25l bnREaWRVcGRhdGUuIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mICVzLiIsUmVhY3RDdXJyZW50 T3duZXIuY3VycmVudCYmUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5nZXROYW1lKCl8fCJSZWFj dENvbXBvc2l0ZUNvbXBvbmVudCIpOnZvaWQgMDshaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIp PyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJ1bm1vdW50Q29t cG9uZW50QXROb2RlKC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQu Iik6X3Byb2RJbnZhcmlhbnQoIjQwIik6dm9pZCAwO2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVj dGlvbiIpeyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyghbm9kZUlzUmVuZGVy ZWRCeU90aGVySW5zdGFuY2UoY29udGFpbmVyKSwidW5tb3VudENvbXBvbmVudEF0Tm9kZSgpOiBU aGUgbm9kZSB5b3UncmUgYXR0ZW1wdGluZyB0byB1bm1vdW50ICIrIndhcyByZW5kZXJlZCBieSBh bm90aGVyIGNvcHkgb2YgUmVhY3QuIik6dm9pZCAwfXZhciBwcmV2Q29tcG9uZW50PWdldFRvcExl dmVsV3JhcHBlckluQ29udGFpbmVyKGNvbnRhaW5lcik7aWYoIXByZXZDb21wb25lbnQpe3ZhciBj b250YWluZXJIYXNOb25Sb290UmVhY3RDaGlsZD1oYXNOb25Sb290UmVhY3RDaGlsZChjb250YWlu ZXIpO3ZhciBpc0NvbnRhaW5lclJlYWN0Um9vdD1jb250YWluZXIubm9kZVR5cGU9PT0xJiZjb250 YWluZXIuaGFzQXR0cmlidXRlKFJPT1RfQVRUUl9OQU1FKTtpZigiZGV2ZWxvcG1lbnQiIT09InBy b2R1Y3Rpb24iKXsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmcoIWNvbnRhaW5l ckhhc05vblJvb3RSZWFjdENoaWxkLCJ1bm1vdW50Q29tcG9uZW50QXROb2RlKCk6IFRoZSBub2Rl IHlvdSdyZSBhdHRlbXB0aW5nIHRvIHVubW91bnQgIisid2FzIHJlbmRlcmVkIGJ5IFJlYWN0IGFu ZCBpcyBub3QgYSB0b3AtbGV2ZWwgY29udGFpbmVyLiAlcyIsaXNDb250YWluZXJSZWFjdFJvb3Q/ IllvdSBtYXkgaGF2ZSBhY2NpZGVudGFsbHkgcGFzc2VkIGluIGEgUmVhY3Qgcm9vdCBub2RlIGlu c3RlYWQgIisib2YgaXRzIGNvbnRhaW5lci4iOiJJbnN0ZWFkLCBoYXZlIHRoZSBwYXJlbnQgY29t cG9uZW50IHVwZGF0ZSBpdHMgc3RhdGUgYW5kICIrInJlcmVuZGVyIGluIG9yZGVyIHRvIHJlbW92 ZSB0aGlzIGNvbXBvbmVudC4iKTp2b2lkIDB9cmV0dXJuIGZhbHNlfWRlbGV0ZSBpbnN0YW5jZXNC eVJlYWN0Um9vdElEW3ByZXZDb21wb25lbnQuX2luc3RhbmNlLnJvb3RJRF07UmVhY3RVcGRhdGVz LmJhdGNoZWRVcGRhdGVzKHVubW91bnRDb21wb25lbnRGcm9tTm9kZSxwcmV2Q29tcG9uZW50LGNv bnRhaW5lcixmYWxzZSk7cmV0dXJuIHRydWV9LF9tb3VudEltYWdlSW50b05vZGU6ZnVuY3Rpb24o bWFya3VwLGNvbnRhaW5lcixpbnN0YW5jZSxzaG91bGRSZXVzZU1hcmt1cCx0cmFuc2FjdGlvbil7 IWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24i P2ludmFyaWFudChmYWxzZSwibW91bnRDb21wb25lbnRJbnRvTm9kZSguLi4pOiBUYXJnZXQgY29u dGFpbmVyIGlzIG5vdCB2YWxpZC4iKTpfcHJvZEludmFyaWFudCgiNDEiKTp2b2lkIDA7aWYoc2hv dWxkUmV1c2VNYXJrdXApe3ZhciByb290RWxlbWVudD1nZXRSZWFjdFJvb3RFbGVtZW50SW5Db250 YWluZXIoY29udGFpbmVyKTtpZihSZWFjdE1hcmt1cENoZWNrc3VtLmNhblJldXNlTWFya3VwKG1h cmt1cCxyb290RWxlbWVudCkpe1JlYWN0RE9NQ29tcG9uZW50VHJlZS5wcmVjYWNoZU5vZGUoaW5z dGFuY2Uscm9vdEVsZW1lbnQpO3JldHVybn1lbHNle3ZhciBjaGVja3N1bT1yb290RWxlbWVudC5n ZXRBdHRyaWJ1dGUoUmVhY3RNYXJrdXBDaGVja3N1bS5DSEVDS1NVTV9BVFRSX05BTUUpO3Jvb3RF bGVtZW50LnJlbW92ZUF0dHJpYnV0ZShSZWFjdE1hcmt1cENoZWNrc3VtLkNIRUNLU1VNX0FUVFJf TkFNRSk7dmFyIHJvb3RNYXJrdXA9cm9vdEVsZW1lbnQub3V0ZXJIVE1MO3Jvb3RFbGVtZW50LnNl dEF0dHJpYnV0ZShSZWFjdE1hcmt1cENoZWNrc3VtLkNIRUNLU1VNX0FUVFJfTkFNRSxjaGVja3N1 bSk7dmFyIG5vcm1hbGl6ZWRNYXJrdXA9bWFya3VwO2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVj dGlvbiIpe3ZhciBub3JtYWxpemVyO2lmKGNvbnRhaW5lci5ub2RlVHlwZT09PUVMRU1FTlRfTk9E RV9UWVBFKXtub3JtYWxpemVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO25vcm1hbGl6 ZXIuaW5uZXJIVE1MPW1hcmt1cDtub3JtYWxpemVkTWFya3VwPW5vcm1hbGl6ZXIuaW5uZXJIVE1M fWVsc2V7bm9ybWFsaXplcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtkb2N1bWVu dC5ib2R5LmFwcGVuZENoaWxkKG5vcm1hbGl6ZXIpO25vcm1hbGl6ZXIuY29udGVudERvY3VtZW50 LndyaXRlKG1hcmt1cCk7bm9ybWFsaXplZE1hcmt1cD1ub3JtYWxpemVyLmNvbnRlbnREb2N1bWVu dC5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobm9y bWFsaXplcil9fXZhciBkaWZmSW5kZXg9Zmlyc3REaWZmZXJlbmNlSW5kZXgobm9ybWFsaXplZE1h cmt1cCxyb290TWFya3VwKTt2YXIgZGlmZmVyZW5jZT0iIChjbGllbnQpICIrbm9ybWFsaXplZE1h cmt1cC5zdWJzdHJpbmcoZGlmZkluZGV4LTIwLGRpZmZJbmRleCsyMCkrIlxuIChzZXJ2ZXIpICIr cm9vdE1hcmt1cC5zdWJzdHJpbmcoZGlmZkluZGV4LTIwLGRpZmZJbmRleCsyMCk7IShjb250YWlu ZXIubm9kZVR5cGUhPT1ET0NfTk9ERV9UWVBFKT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24i P2ludmFyaWFudChmYWxzZSwiWW91J3JlIHRyeWluZyB0byByZW5kZXIgYSBjb21wb25lbnQgdG8g dGhlIGRvY3VtZW50IHVzaW5nIHNlcnZlciByZW5kZXJpbmcgYnV0IHRoZSBjaGVja3N1bSB3YXMg aW52YWxpZC4gVGhpcyB1c3VhbGx5IG1lYW5zIHlvdSByZW5kZXJlZCBhIGRpZmZlcmVudCBjb21w b25lbnQgdHlwZSBvciBwcm9wcyBvbiB0aGUgY2xpZW50IGZyb20gdGhlIG9uZSBvbiB0aGUgc2Vy dmVyLCBvciB5b3VyIHJlbmRlcigpIG1ldGhvZHMgYXJlIGltcHVyZS4gUmVhY3QgY2Fubm90IGhh bmRsZSB0aGlzIGNhc2UgZHVlIHRvIGNyb3NzLWJyb3dzZXIgcXVpcmtzIGJ5IHJlbmRlcmluZyBh dCB0aGUgZG9jdW1lbnQgcm9vdC4gWW91IHNob3VsZCBsb29rIGZvciBlbnZpcm9ubWVudCBkZXBl bmRlbnQgY29kZSBpbiB5b3VyIGNvbXBvbmVudHMgYW5kIGVuc3VyZSB0aGUgcHJvcHMgYXJlIHRo ZSBzYW1lIGNsaWVudCBhbmQgc2VydmVyIHNpZGU6XG4lcyIsZGlmZmVyZW5jZSk6X3Byb2RJbnZh cmlhbnQoIjQyIixkaWZmZXJlbmNlKTp2b2lkIDA7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0 aW9uIil7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKGZhbHNlLCJSZWFjdCBh dHRlbXB0ZWQgdG8gcmV1c2UgbWFya3VwIGluIGEgY29udGFpbmVyIGJ1dCB0aGUgIisiY2hlY2tz dW0gd2FzIGludmFsaWQuIFRoaXMgZ2VuZXJhbGx5IG1lYW5zIHRoYXQgeW91IGFyZSAiKyJ1c2lu ZyBzZXJ2ZXIgcmVuZGVyaW5nIGFuZCB0aGUgbWFya3VwIGdlbmVyYXRlZCBvbiB0aGUgIisic2Vy dmVyIHdhcyBub3Qgd2hhdCB0aGUgY2xpZW50IHdhcyBleHBlY3RpbmcuIFJlYWN0IGluamVjdGVk ICIrIm5ldyBtYXJrdXAgdG8gY29tcGVuc2F0ZSB3aGljaCB3b3JrcyBidXQgeW91IGhhdmUgbG9z dCBtYW55ICIrIm9mIHRoZSBiZW5lZml0cyBvZiBzZXJ2ZXIgcmVuZGVyaW5nLiBJbnN0ZWFkLCBm aWd1cmUgb3V0ICIrIndoeSB0aGUgbWFya3VwIGJlaW5nIGdlbmVyYXRlZCBpcyBkaWZmZXJlbnQg b24gdGhlIGNsaWVudCAiKyJvciBzZXJ2ZXI6XG4lcyIsZGlmZmVyZW5jZSk6dm9pZCAwfX19IShj b250YWluZXIubm9kZVR5cGUhPT1ET0NfTk9ERV9UWVBFKT8iZGV2ZWxvcG1lbnQiIT09InByb2R1 Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiWW91J3JlIHRyeWluZyB0byByZW5kZXIgYSBjb21wb25l bnQgdG8gdGhlIGRvY3VtZW50IGJ1dCB5b3UgZGlkbid0IHVzZSBzZXJ2ZXIgcmVuZGVyaW5nLiBX ZSBjYW4ndCBkbyB0aGlzIHdpdGhvdXQgdXNpbmcgc2VydmVyIHJlbmRlcmluZyBkdWUgdG8gY3Jv c3MtYnJvd3NlciBxdWlya3MuIFNlZSBSZWFjdERPTVNlcnZlci5yZW5kZXJUb1N0cmluZygpIGZv ciBzZXJ2ZXIgcmVuZGVyaW5nLiIpOl9wcm9kSW52YXJpYW50KCI0MyIpOnZvaWQgMDtpZih0cmFu c2FjdGlvbi51c2VDcmVhdGVFbGVtZW50KXt3aGlsZShjb250YWluZXIubGFzdENoaWxkKXtjb250 YWluZXIucmVtb3ZlQ2hpbGQoY29udGFpbmVyLmxhc3RDaGlsZCl9RE9NTGF6eVRyZWUuaW5zZXJ0 VHJlZUJlZm9yZShjb250YWluZXIsbWFya3VwLG51bGwpfWVsc2V7c2V0SW5uZXJIVE1MKGNvbnRh aW5lcixtYXJrdXApO1JlYWN0RE9NQ29tcG9uZW50VHJlZS5wcmVjYWNoZU5vZGUoaW5zdGFuY2Us Y29udGFpbmVyLmZpcnN0Q2hpbGQpfWlmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe3Zh ciBob3N0Tm9kZT1SZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShjb250 YWluZXIuZmlyc3RDaGlsZCk7aWYoaG9zdE5vZGUuX2RlYnVnSUQhPT0wKXtSZWFjdEluc3RydW1l bnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtpbnN0YW5jZUlEOmhvc3ROb2RlLl9k ZWJ1Z0lELHR5cGU6Im1vdW50IixwYXlsb2FkOm1hcmt1cC50b1N0cmluZygpfSl9fX19O21vZHVs ZS5leHBvcnRzPVJlYWN0TW91bnR9LHsxMToxMSwxMjE6MTIxLDEyNToxMjUsMTI3OjEyNywxMjk6 MTI5LDEzMzoxMzMsMTM0OjEzNCwxNDM6MTQzLDE1MDoxNTAsMTU3OjE1NywyNjoyNiwzNDozNCwz NTozNSwzNzozNyw1ODo1OCw2Mzo2Myw2NDo2NCw2Njo2Niw3NTo3NSw4MTo4MSw4Mjo4Miw5Ojl9 XSw2ODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBf cHJvZEludmFyaWFudD1fZGVyZXFfKDEyNSk7dmFyIFJlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQ9 X2RlcmVxXygyOSk7dmFyIFJlYWN0SW5zdGFuY2VNYXA9X2RlcmVxXyg2Myk7dmFyIFJlYWN0SW5z dHJ1bWVudGF0aW9uPV9kZXJlcV8oNjQpO3ZhciBSZWFjdEN1cnJlbnRPd25lcj1fZGVyZXFfKDEz Myk7dmFyIFJlYWN0UmVjb25jaWxlcj1fZGVyZXFfKDc1KTt2YXIgUmVhY3RDaGlsZFJlY29uY2ls ZXI9X2RlcmVxXygyNyk7dmFyIGVtcHR5RnVuY3Rpb249X2RlcmVxXygxNDIpO3ZhciBmbGF0dGVu Q2hpbGRyZW49X2RlcmVxXygxMDkpO3ZhciBpbnZhcmlhbnQ9X2RlcmVxXygxNTApO2Z1bmN0aW9u IG1ha2VJbnNlcnRNYXJrdXAobWFya3VwLGFmdGVyTm9kZSx0b0luZGV4KXtyZXR1cm57dHlwZToi SU5TRVJUX01BUktVUCIsY29udGVudDptYXJrdXAsZnJvbUluZGV4Om51bGwsZnJvbU5vZGU6bnVs bCx0b0luZGV4OnRvSW5kZXgsYWZ0ZXJOb2RlOmFmdGVyTm9kZX19ZnVuY3Rpb24gbWFrZU1vdmUo Y2hpbGQsYWZ0ZXJOb2RlLHRvSW5kZXgpe3JldHVybnt0eXBlOiJNT1ZFX0VYSVNUSU5HIixjb250 ZW50Om51bGwsZnJvbUluZGV4OmNoaWxkLl9tb3VudEluZGV4LGZyb21Ob2RlOlJlYWN0UmVjb25j aWxlci5nZXRIb3N0Tm9kZShjaGlsZCksdG9JbmRleDp0b0luZGV4LGFmdGVyTm9kZTphZnRlck5v ZGV9fWZ1bmN0aW9uIG1ha2VSZW1vdmUoY2hpbGQsbm9kZSl7cmV0dXJue3R5cGU6IlJFTU9WRV9O T0RFIixjb250ZW50Om51bGwsZnJvbUluZGV4OmNoaWxkLl9tb3VudEluZGV4LGZyb21Ob2RlOm5v ZGUsdG9JbmRleDpudWxsLGFmdGVyTm9kZTpudWxsfX1mdW5jdGlvbiBtYWtlU2V0TWFya3VwKG1h cmt1cCl7cmV0dXJue3R5cGU6IlNFVF9NQVJLVVAiLGNvbnRlbnQ6bWFya3VwLGZyb21JbmRleDpu dWxsLGZyb21Ob2RlOm51bGwsdG9JbmRleDpudWxsLGFmdGVyTm9kZTpudWxsfX1mdW5jdGlvbiBt YWtlVGV4dENvbnRlbnQodGV4dENvbnRlbnQpe3JldHVybnt0eXBlOiJURVhUX0NPTlRFTlQiLGNv bnRlbnQ6dGV4dENvbnRlbnQsZnJvbUluZGV4Om51bGwsZnJvbU5vZGU6bnVsbCx0b0luZGV4Om51 bGwsYWZ0ZXJOb2RlOm51bGx9fWZ1bmN0aW9uIGVucXVldWUocXVldWUsdXBkYXRlKXtpZih1cGRh dGUpe3F1ZXVlPXF1ZXVlfHxbXTtxdWV1ZS5wdXNoKHVwZGF0ZSl9cmV0dXJuIHF1ZXVlfWZ1bmN0 aW9uIHByb2Nlc3NRdWV1ZShpbnN0LHVwZGF0ZVF1ZXVlKXtSZWFjdENvbXBvbmVudEVudmlyb25t ZW50LnByb2Nlc3NDaGlsZHJlblVwZGF0ZXMoaW5zdCx1cGRhdGVRdWV1ZSl9dmFyIHNldENoaWxk cmVuRm9ySW5zdHJ1bWVudGF0aW9uPWVtcHR5RnVuY3Rpb247aWYoImRldmVsb3BtZW50IiE9PSJw cm9kdWN0aW9uIil7dmFyIGdldERlYnVnSUQ9ZnVuY3Rpb24oaW5zdCl7aWYoIWluc3QuX2RlYnVn SUQpe3ZhciBpbnRlcm5hbDtpZihpbnRlcm5hbD1SZWFjdEluc3RhbmNlTWFwLmdldChpbnN0KSl7 aW5zdD1pbnRlcm5hbH19cmV0dXJuIGluc3QuX2RlYnVnSUR9O3NldENoaWxkcmVuRm9ySW5zdHJ1 bWVudGF0aW9uPWZ1bmN0aW9uKGNoaWxkcmVuKXt2YXIgZGVidWdJRD1nZXREZWJ1Z0lEKHRoaXMp O2lmKGRlYnVnSUQhPT0wKXtSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25TZXRDaGls ZHJlbihkZWJ1Z0lELGNoaWxkcmVuP09iamVjdC5rZXlzKGNoaWxkcmVuKS5tYXAoZnVuY3Rpb24o a2V5KXtyZXR1cm4gY2hpbGRyZW5ba2V5XS5fZGVidWdJRH0pOltdKX19fXZhciBSZWFjdE11bHRp Q2hpbGQ9e01peGluOntfcmVjb25jaWxlckluc3RhbnRpYXRlQ2hpbGRyZW46ZnVuY3Rpb24obmVz dGVkQ2hpbGRyZW4sdHJhbnNhY3Rpb24sY29udGV4dCl7aWYoImRldmVsb3BtZW50IiE9PSJwcm9k dWN0aW9uIil7dmFyIHNlbGZEZWJ1Z0lEPWdldERlYnVnSUQodGhpcyk7aWYodGhpcy5fY3VycmVu dEVsZW1lbnQpe3RyeXtSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50PXRoaXMuX2N1cnJlbnRFbGVt ZW50Ll9vd25lcjtyZXR1cm4gUmVhY3RDaGlsZFJlY29uY2lsZXIuaW5zdGFudGlhdGVDaGlsZHJl bihuZXN0ZWRDaGlsZHJlbix0cmFuc2FjdGlvbixjb250ZXh0LHNlbGZEZWJ1Z0lEKX1maW5hbGx5 e1JlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQ9bnVsbH19fXJldHVybiBSZWFjdENoaWxkUmVjb25j aWxlci5pbnN0YW50aWF0ZUNoaWxkcmVuKG5lc3RlZENoaWxkcmVuLHRyYW5zYWN0aW9uLGNvbnRl eHQpfSxfcmVjb25jaWxlclVwZGF0ZUNoaWxkcmVuOmZ1bmN0aW9uKHByZXZDaGlsZHJlbixuZXh0 TmVzdGVkQ2hpbGRyZW5FbGVtZW50cyxtb3VudEltYWdlcyxyZW1vdmVkTm9kZXMsdHJhbnNhY3Rp b24sY29udGV4dCl7dmFyIG5leHRDaGlsZHJlbjt2YXIgc2VsZkRlYnVnSUQ9MDtpZigiZGV2ZWxv cG1lbnQiIT09InByb2R1Y3Rpb24iKXtzZWxmRGVidWdJRD1nZXREZWJ1Z0lEKHRoaXMpO2lmKHRo aXMuX2N1cnJlbnRFbGVtZW50KXt0cnl7UmVhY3RDdXJyZW50T3duZXIuY3VycmVudD10aGlzLl9j dXJyZW50RWxlbWVudC5fb3duZXI7bmV4dENoaWxkcmVuPWZsYXR0ZW5DaGlsZHJlbihuZXh0TmVz dGVkQ2hpbGRyZW5FbGVtZW50cyxzZWxmRGVidWdJRCl9ZmluYWxseXtSZWFjdEN1cnJlbnRPd25l ci5jdXJyZW50PW51bGx9UmVhY3RDaGlsZFJlY29uY2lsZXIudXBkYXRlQ2hpbGRyZW4ocHJldkNo aWxkcmVuLG5leHRDaGlsZHJlbixtb3VudEltYWdlcyxyZW1vdmVkTm9kZXMsdHJhbnNhY3Rpb24s dGhpcyx0aGlzLl9ob3N0Q29udGFpbmVySW5mbyxjb250ZXh0LHNlbGZEZWJ1Z0lEKTtyZXR1cm4g bmV4dENoaWxkcmVufX1uZXh0Q2hpbGRyZW49ZmxhdHRlbkNoaWxkcmVuKG5leHROZXN0ZWRDaGls ZHJlbkVsZW1lbnRzLHNlbGZEZWJ1Z0lEKTtSZWFjdENoaWxkUmVjb25jaWxlci51cGRhdGVDaGls ZHJlbihwcmV2Q2hpbGRyZW4sbmV4dENoaWxkcmVuLG1vdW50SW1hZ2VzLHJlbW92ZWROb2Rlcyx0 cmFuc2FjdGlvbix0aGlzLHRoaXMuX2hvc3RDb250YWluZXJJbmZvLGNvbnRleHQsc2VsZkRlYnVn SUQpO3JldHVybiBuZXh0Q2hpbGRyZW59LG1vdW50Q2hpbGRyZW46ZnVuY3Rpb24obmVzdGVkQ2hp bGRyZW4sdHJhbnNhY3Rpb24sY29udGV4dCl7dmFyIGNoaWxkcmVuPXRoaXMuX3JlY29uY2lsZXJJ bnN0YW50aWF0ZUNoaWxkcmVuKG5lc3RlZENoaWxkcmVuLHRyYW5zYWN0aW9uLGNvbnRleHQpO3Ro aXMuX3JlbmRlcmVkQ2hpbGRyZW49Y2hpbGRyZW47dmFyIG1vdW50SW1hZ2VzPVtdO3ZhciBpbmRl eD0wO2Zvcih2YXIgbmFtZSBpbiBjaGlsZHJlbil7aWYoY2hpbGRyZW4uaGFzT3duUHJvcGVydHko bmFtZSkpe3ZhciBjaGlsZD1jaGlsZHJlbltuYW1lXTt2YXIgc2VsZkRlYnVnSUQ9MDtpZigiZGV2 ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtzZWxmRGVidWdJRD1nZXREZWJ1Z0lEKHRoaXMpfXZh ciBtb3VudEltYWdlPVJlYWN0UmVjb25jaWxlci5tb3VudENvbXBvbmVudChjaGlsZCx0cmFuc2Fj dGlvbix0aGlzLHRoaXMuX2hvc3RDb250YWluZXJJbmZvLGNvbnRleHQsc2VsZkRlYnVnSUQpO2No aWxkLl9tb3VudEluZGV4PWluZGV4Kys7bW91bnRJbWFnZXMucHVzaChtb3VudEltYWdlKX19aWYo ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7c2V0Q2hpbGRyZW5Gb3JJbnN0cnVtZW50YXRp b24uY2FsbCh0aGlzLGNoaWxkcmVuKX1yZXR1cm4gbW91bnRJbWFnZXN9LHVwZGF0ZVRleHRDb250 ZW50OmZ1bmN0aW9uKG5leHRDb250ZW50KXt2YXIgcHJldkNoaWxkcmVuPXRoaXMuX3JlbmRlcmVk Q2hpbGRyZW47UmVhY3RDaGlsZFJlY29uY2lsZXIudW5tb3VudENoaWxkcmVuKHByZXZDaGlsZHJl bixmYWxzZSk7Zm9yKHZhciBuYW1lIGluIHByZXZDaGlsZHJlbil7aWYocHJldkNoaWxkcmVuLmhh c093blByb3BlcnR5KG5hbWUpKXshZmFsc2U/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9p bnZhcmlhbnQoZmFsc2UsInVwZGF0ZVRleHRDb250ZW50IGNhbGxlZCBvbiBub24tZW1wdHkgY29t cG9uZW50LiIpOl9wcm9kSW52YXJpYW50KCIxMTgiKTp2b2lkIDB9fXZhciB1cGRhdGVzPVttYWtl VGV4dENvbnRlbnQobmV4dENvbnRlbnQpXTtwcm9jZXNzUXVldWUodGhpcyx1cGRhdGVzKX0sdXBk YXRlTWFya3VwOmZ1bmN0aW9uKG5leHRNYXJrdXApe3ZhciBwcmV2Q2hpbGRyZW49dGhpcy5fcmVu ZGVyZWRDaGlsZHJlbjtSZWFjdENoaWxkUmVjb25jaWxlci51bm1vdW50Q2hpbGRyZW4ocHJldkNo aWxkcmVuLGZhbHNlKTtmb3IodmFyIG5hbWUgaW4gcHJldkNoaWxkcmVuKXtpZihwcmV2Q2hpbGRy ZW4uaGFzT3duUHJvcGVydHkobmFtZSkpeyFmYWxzZT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rp b24iP2ludmFyaWFudChmYWxzZSwidXBkYXRlVGV4dENvbnRlbnQgY2FsbGVkIG9uIG5vbi1lbXB0 eSBjb21wb25lbnQuIik6X3Byb2RJbnZhcmlhbnQoIjExOCIpOnZvaWQgMH19dmFyIHVwZGF0ZXM9 W21ha2VTZXRNYXJrdXAobmV4dE1hcmt1cCldO3Byb2Nlc3NRdWV1ZSh0aGlzLHVwZGF0ZXMpfSx1 cGRhdGVDaGlsZHJlbjpmdW5jdGlvbihuZXh0TmVzdGVkQ2hpbGRyZW5FbGVtZW50cyx0cmFuc2Fj dGlvbixjb250ZXh0KXt0aGlzLl91cGRhdGVDaGlsZHJlbihuZXh0TmVzdGVkQ2hpbGRyZW5FbGVt ZW50cyx0cmFuc2FjdGlvbixjb250ZXh0KX0sX3VwZGF0ZUNoaWxkcmVuOmZ1bmN0aW9uKG5leHRO ZXN0ZWRDaGlsZHJlbkVsZW1lbnRzLHRyYW5zYWN0aW9uLGNvbnRleHQpe3ZhciBwcmV2Q2hpbGRy ZW49dGhpcy5fcmVuZGVyZWRDaGlsZHJlbjt2YXIgcmVtb3ZlZE5vZGVzPXt9O3ZhciBtb3VudElt YWdlcz1bXTt2YXIgbmV4dENoaWxkcmVuPXRoaXMuX3JlY29uY2lsZXJVcGRhdGVDaGlsZHJlbihw cmV2Q2hpbGRyZW4sbmV4dE5lc3RlZENoaWxkcmVuRWxlbWVudHMsbW91bnRJbWFnZXMscmVtb3Zl ZE5vZGVzLHRyYW5zYWN0aW9uLGNvbnRleHQpO2lmKCFuZXh0Q2hpbGRyZW4mJiFwcmV2Q2hpbGRy ZW4pe3JldHVybn12YXIgdXBkYXRlcz1udWxsO3ZhciBuYW1lO3ZhciBuZXh0SW5kZXg9MDt2YXIg bGFzdEluZGV4PTA7dmFyIG5leHRNb3VudEluZGV4PTA7dmFyIGxhc3RQbGFjZWROb2RlPW51bGw7 Zm9yKG5hbWUgaW4gbmV4dENoaWxkcmVuKXtpZighbmV4dENoaWxkcmVuLmhhc093blByb3BlcnR5 KG5hbWUpKXtjb250aW51ZX12YXIgcHJldkNoaWxkPXByZXZDaGlsZHJlbiYmcHJldkNoaWxkcmVu W25hbWVdO3ZhciBuZXh0Q2hpbGQ9bmV4dENoaWxkcmVuW25hbWVdO2lmKHByZXZDaGlsZD09PW5l eHRDaGlsZCl7dXBkYXRlcz1lbnF1ZXVlKHVwZGF0ZXMsdGhpcy5tb3ZlQ2hpbGQocHJldkNoaWxk LGxhc3RQbGFjZWROb2RlLG5leHRJbmRleCxsYXN0SW5kZXgpKTtsYXN0SW5kZXg9TWF0aC5tYXgo cHJldkNoaWxkLl9tb3VudEluZGV4LGxhc3RJbmRleCk7cHJldkNoaWxkLl9tb3VudEluZGV4PW5l eHRJbmRleH1lbHNle2lmKHByZXZDaGlsZCl7bGFzdEluZGV4PU1hdGgubWF4KHByZXZDaGlsZC5f bW91bnRJbmRleCxsYXN0SW5kZXgpfXVwZGF0ZXM9ZW5xdWV1ZSh1cGRhdGVzLHRoaXMuX21vdW50 Q2hpbGRBdEluZGV4KG5leHRDaGlsZCxtb3VudEltYWdlc1tuZXh0TW91bnRJbmRleF0sbGFzdFBs YWNlZE5vZGUsbmV4dEluZGV4LHRyYW5zYWN0aW9uLGNvbnRleHQpKTtuZXh0TW91bnRJbmRleCsr fW5leHRJbmRleCsrO2xhc3RQbGFjZWROb2RlPVJlYWN0UmVjb25jaWxlci5nZXRIb3N0Tm9kZShu ZXh0Q2hpbGQpfWZvcihuYW1lIGluIHJlbW92ZWROb2Rlcyl7aWYocmVtb3ZlZE5vZGVzLmhhc093 blByb3BlcnR5KG5hbWUpKXt1cGRhdGVzPWVucXVldWUodXBkYXRlcyx0aGlzLl91bm1vdW50Q2hp bGQocHJldkNoaWxkcmVuW25hbWVdLHJlbW92ZWROb2Rlc1tuYW1lXSkpfX1pZih1cGRhdGVzKXtw cm9jZXNzUXVldWUodGhpcyx1cGRhdGVzKX10aGlzLl9yZW5kZXJlZENoaWxkcmVuPW5leHRDaGls ZHJlbjtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtzZXRDaGlsZHJlbkZvckluc3Ry dW1lbnRhdGlvbi5jYWxsKHRoaXMsbmV4dENoaWxkcmVuKX19LHVubW91bnRDaGlsZHJlbjpmdW5j dGlvbihzYWZlbHkpe3ZhciByZW5kZXJlZENoaWxkcmVuPXRoaXMuX3JlbmRlcmVkQ2hpbGRyZW47 UmVhY3RDaGlsZFJlY29uY2lsZXIudW5tb3VudENoaWxkcmVuKHJlbmRlcmVkQ2hpbGRyZW4sc2Fm ZWx5KTt0aGlzLl9yZW5kZXJlZENoaWxkcmVuPW51bGx9LG1vdmVDaGlsZDpmdW5jdGlvbihjaGls ZCxhZnRlck5vZGUsdG9JbmRleCxsYXN0SW5kZXgpe2lmKGNoaWxkLl9tb3VudEluZGV4PGxhc3RJ bmRleCl7cmV0dXJuIG1ha2VNb3ZlKGNoaWxkLGFmdGVyTm9kZSx0b0luZGV4KX19LGNyZWF0ZUNo aWxkOmZ1bmN0aW9uKGNoaWxkLGFmdGVyTm9kZSxtb3VudEltYWdlKXtyZXR1cm4gbWFrZUluc2Vy dE1hcmt1cChtb3VudEltYWdlLGFmdGVyTm9kZSxjaGlsZC5fbW91bnRJbmRleCl9LHJlbW92ZUNo aWxkOmZ1bmN0aW9uKGNoaWxkLG5vZGUpe3JldHVybiBtYWtlUmVtb3ZlKGNoaWxkLG5vZGUpfSxf bW91bnRDaGlsZEF0SW5kZXg6ZnVuY3Rpb24oY2hpbGQsbW91bnRJbWFnZSxhZnRlck5vZGUsaW5k ZXgsdHJhbnNhY3Rpb24sY29udGV4dCl7Y2hpbGQuX21vdW50SW5kZXg9aW5kZXg7cmV0dXJuIHRo aXMuY3JlYXRlQ2hpbGQoY2hpbGQsYWZ0ZXJOb2RlLG1vdW50SW1hZ2UpfSxfdW5tb3VudENoaWxk OmZ1bmN0aW9uKGNoaWxkLG5vZGUpe3ZhciB1cGRhdGU9dGhpcy5yZW1vdmVDaGlsZChjaGlsZCxu b2RlKTtjaGlsZC5fbW91bnRJbmRleD1udWxsO3JldHVybiB1cGRhdGV9fX07bW9kdWxlLmV4cG9y dHM9UmVhY3RNdWx0aUNoaWxkfSx7MTA5OjEwOSwxMjU6MTI1LDEzMzoxMzMsMTQyOjE0MiwxNTA6 MTUwLDI3OjI3LDI5OjI5LDYzOjYzLDY0OjY0LDc1Ojc1fV0sNjk6W2Z1bmN0aW9uKF9kZXJlcV8s bW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgX3Byb2RJbnZhcmlhbnQ9X2RlcmVxXygx MjUpO3ZhciBSZWFjdD1fZGVyZXFfKDEzNCk7dmFyIGludmFyaWFudD1fZGVyZXFfKDE1MCk7dmFy IFJlYWN0Tm9kZVR5cGVzPXtIT1NUOjAsQ09NUE9TSVRFOjEsRU1QVFk6MixnZXRUeXBlOmZ1bmN0 aW9uKG5vZGUpe2lmKG5vZGU9PT1udWxsfHxub2RlPT09ZmFsc2Upe3JldHVybiBSZWFjdE5vZGVU eXBlcy5FTVBUWX1lbHNlIGlmKFJlYWN0LmlzVmFsaWRFbGVtZW50KG5vZGUpKXtpZih0eXBlb2Yg bm9kZS50eXBlPT09ImZ1bmN0aW9uIil7cmV0dXJuIFJlYWN0Tm9kZVR5cGVzLkNPTVBPU0lURX1l bHNle3JldHVybiBSZWFjdE5vZGVUeXBlcy5IT1NUfX0hZmFsc2U/ImRldmVsb3BtZW50IiE9PSJw cm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsIlVuZXhwZWN0ZWQgbm9kZTogJXMiLG5vZGUpOl9w cm9kSW52YXJpYW50KCIyNiIsbm9kZSk6dm9pZCAwfX07bW9kdWxlLmV4cG9ydHM9UmVhY3ROb2Rl VHlwZXN9LHsxMjU6MTI1LDEzNDoxMzQsMTUwOjE1MH1dLDcwOltmdW5jdGlvbihfZGVyZXFfLG1v ZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIF9wcm9kSW52YXJpYW50PV9kZXJlcV8oMTI1 KTt2YXIgaW52YXJpYW50PV9kZXJlcV8oMTUwKTtmdW5jdGlvbiBpc1ZhbGlkT3duZXIob2JqZWN0 KXtyZXR1cm4hIShvYmplY3QmJnR5cGVvZiBvYmplY3QuYXR0YWNoUmVmPT09ImZ1bmN0aW9uIiYm dHlwZW9mIG9iamVjdC5kZXRhY2hSZWY9PT0iZnVuY3Rpb24iKX12YXIgUmVhY3RPd25lcj17YWRk Q29tcG9uZW50QXNSZWZUbzpmdW5jdGlvbihjb21wb25lbnQscmVmLG93bmVyKXshaXNWYWxpZE93 bmVyKG93bmVyKT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwi YWRkQ29tcG9uZW50QXNSZWZUbyguLi4pOiBPbmx5IGEgUmVhY3RPd25lciBjYW4gaGF2ZSByZWZz LiBZb3UgbWlnaHQgYmUgYWRkaW5nIGEgcmVmIHRvIGEgY29tcG9uZW50IHRoYXQgd2FzIG5vdCBj cmVhdGVkIGluc2lkZSBhIGNvbXBvbmVudCdzIGByZW5kZXJgIG1ldGhvZCwgb3IgeW91IGhhdmUg bXVsdGlwbGUgY29waWVzIG9mIFJlYWN0IGxvYWRlZCAoZGV0YWlsczogaHR0cHM6Ly9mYi5tZS9y ZWFjdC1yZWZzLW11c3QtaGF2ZS1vd25lcikuIik6X3Byb2RJbnZhcmlhbnQoIjExOSIpOnZvaWQg MDtvd25lci5hdHRhY2hSZWYocmVmLGNvbXBvbmVudCl9LHJlbW92ZUNvbXBvbmVudEFzUmVmRnJv bTpmdW5jdGlvbihjb21wb25lbnQscmVmLG93bmVyKXshaXNWYWxpZE93bmVyKG93bmVyKT8iZGV2 ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwicmVtb3ZlQ29tcG9uZW50 QXNSZWZGcm9tKC4uLik6IE9ubHkgYSBSZWFjdE93bmVyIGNhbiBoYXZlIHJlZnMuIFlvdSBtaWdo dCBiZSByZW1vdmluZyBhIHJlZiB0byBhIGNvbXBvbmVudCB0aGF0IHdhcyBub3QgY3JlYXRlZCBp bnNpZGUgYSBjb21wb25lbnQncyBgcmVuZGVyYCBtZXRob2QsIG9yIHlvdSBoYXZlIG11bHRpcGxl IGNvcGllcyBvZiBSZWFjdCBsb2FkZWQgKGRldGFpbHM6IGh0dHBzOi8vZmIubWUvcmVhY3QtcmVm cy1tdXN0LWhhdmUtb3duZXIpLiIpOl9wcm9kSW52YXJpYW50KCIxMjAiKTp2b2lkIDA7dmFyIG93 bmVyUHVibGljSW5zdGFuY2U9b3duZXIuZ2V0UHVibGljSW5zdGFuY2UoKTtpZihvd25lclB1Ymxp Y0luc3RhbmNlJiZvd25lclB1YmxpY0luc3RhbmNlLnJlZnNbcmVmXT09PWNvbXBvbmVudC5nZXRQ dWJsaWNJbnN0YW5jZSgpKXtvd25lci5kZXRhY2hSZWYocmVmKX19fTttb2R1bGUuZXhwb3J0cz1S ZWFjdE93bmVyfSx7MTI1OjEyNSwxNTA6MTUwfV0sNzE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxl LGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgX2Fzc2lnbj1fZGVyZXFfKDE1OCk7dmFyIF9leHRl bmRzPV9hc3NpZ258fGZ1bmN0aW9uKHRhcmdldCl7Zm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVu Z3RoO2krKyl7dmFyIHNvdXJjZT1hcmd1bWVudHNbaV07Zm9yKHZhciBrZXkgaW4gc291cmNlKXtp ZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkpe3Rhcmdl dFtrZXldPXNvdXJjZVtrZXldfX19cmV0dXJuIHRhcmdldH07dmFyIFJlYWN0RGVidWdUb29sPV9k ZXJlcV8oNTApO3ZhciB3YXJuaW5nPV9kZXJlcV8oMTU3KTt2YXIgYWxyZWFkeVdhcm5lZD1mYWxz ZTtmdW5jdGlvbiByb3VuZEZsb2F0KHZhbCl7dmFyIGJhc2U9YXJndW1lbnRzLmxlbmd0aD4xJiZh cmd1bWVudHNbMV0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOjI7dmFyIG49TWF0aC5wb3coMTAs YmFzZSk7cmV0dXJuIE1hdGguZmxvb3IodmFsKm4pL259ZnVuY3Rpb24gY29uc29sZVRhYmxlKHRh YmxlKXtjb25zb2xlLnRhYmxlKHRhYmxlKX1mdW5jdGlvbiB3YXJuSW5Qcm9kdWN0aW9uKCl7aWYo YWxyZWFkeVdhcm5lZCl7cmV0dXJufWFscmVhZHlXYXJuZWQ9dHJ1ZTtpZih0eXBlb2YgY29uc29s ZSE9PSJ1bmRlZmluZWQiKXtjb25zb2xlLmVycm9yKCJSZWFjdFBlcmYgaXMgbm90IHN1cHBvcnRl ZCBpbiB0aGUgcHJvZHVjdGlvbiBidWlsZHMgb2YgUmVhY3QuICIrIlRvIGNvbGxlY3QgbWVhc3Vy ZW1lbnRzLCBwbGVhc2UgdXNlIHRoZSBkZXZlbG9wbWVudCBidWlsZCBvZiBSZWFjdCBpbnN0ZWFk LiIpfX1mdW5jdGlvbiBnZXRMYXN0TWVhc3VyZW1lbnRzKCl7aWYoISgiZGV2ZWxvcG1lbnQiIT09 InByb2R1Y3Rpb24iKSl7d2FybkluUHJvZHVjdGlvbigpO3JldHVybltdfXJldHVybiBSZWFjdERl YnVnVG9vbC5nZXRGbHVzaEhpc3RvcnkoKX1mdW5jdGlvbiBnZXRFeGNsdXNpdmUoKXt2YXIgZmx1 c2hIaXN0b3J5PWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dW5kZWZpbmVkP2Fy Z3VtZW50c1swXTpnZXRMYXN0TWVhc3VyZW1lbnRzKCk7aWYoISgiZGV2ZWxvcG1lbnQiIT09InBy b2R1Y3Rpb24iKSl7d2FybkluUHJvZHVjdGlvbigpO3JldHVybltdfXZhciBhZ2dyZWdhdGVkU3Rh dHM9e307dmFyIGFmZmVjdGVkSURzPXt9O2Z1bmN0aW9uIHVwZGF0ZUFnZ3JlZ2F0ZWRTdGF0cyh0 cmVlU25hcHNob3QsaW5zdGFuY2VJRCx0aW1lclR5cGUsYXBwbHlVcGRhdGUpe3ZhciBkaXNwbGF5 TmFtZT10cmVlU25hcHNob3RbaW5zdGFuY2VJRF0uZGlzcGxheU5hbWU7dmFyIGtleT1kaXNwbGF5 TmFtZTt2YXIgc3RhdHM9YWdncmVnYXRlZFN0YXRzW2tleV07aWYoIXN0YXRzKXthZmZlY3RlZElE c1trZXldPXt9O3N0YXRzPWFnZ3JlZ2F0ZWRTdGF0c1trZXldPXtrZXk6a2V5LGluc3RhbmNlQ291 bnQ6MCxjb3VudHM6e30sZHVyYXRpb25zOnt9LHRvdGFsRHVyYXRpb246MH19aWYoIXN0YXRzLmR1 cmF0aW9uc1t0aW1lclR5cGVdKXtzdGF0cy5kdXJhdGlvbnNbdGltZXJUeXBlXT0wfWlmKCFzdGF0 cy5jb3VudHNbdGltZXJUeXBlXSl7c3RhdHMuY291bnRzW3RpbWVyVHlwZV09MH1hZmZlY3RlZElE c1trZXldW2luc3RhbmNlSURdPXRydWU7YXBwbHlVcGRhdGUoc3RhdHMpfWZsdXNoSGlzdG9yeS5m b3JFYWNoKGZ1bmN0aW9uKGZsdXNoKXt2YXIgbWVhc3VyZW1lbnRzPWZsdXNoLm1lYXN1cmVtZW50 cyx0cmVlU25hcHNob3Q9Zmx1c2gudHJlZVNuYXBzaG90O21lYXN1cmVtZW50cy5mb3JFYWNoKGZ1 bmN0aW9uKG1lYXN1cmVtZW50KXt2YXIgZHVyYXRpb249bWVhc3VyZW1lbnQuZHVyYXRpb24saW5z dGFuY2VJRD1tZWFzdXJlbWVudC5pbnN0YW5jZUlELHRpbWVyVHlwZT1tZWFzdXJlbWVudC50aW1l clR5cGU7dXBkYXRlQWdncmVnYXRlZFN0YXRzKHRyZWVTbmFwc2hvdCxpbnN0YW5jZUlELHRpbWVy VHlwZSxmdW5jdGlvbihzdGF0cyl7c3RhdHMudG90YWxEdXJhdGlvbis9ZHVyYXRpb247c3RhdHMu ZHVyYXRpb25zW3RpbWVyVHlwZV0rPWR1cmF0aW9uO3N0YXRzLmNvdW50c1t0aW1lclR5cGVdKyt9 KX0pfSk7cmV0dXJuIE9iamVjdC5rZXlzKGFnZ3JlZ2F0ZWRTdGF0cykubWFwKGZ1bmN0aW9uKGtl eSl7cmV0dXJuIF9leHRlbmRzKHt9LGFnZ3JlZ2F0ZWRTdGF0c1trZXldLHtpbnN0YW5jZUNvdW50 Ok9iamVjdC5rZXlzKGFmZmVjdGVkSURzW2tleV0pLmxlbmd0aH0pfSkuc29ydChmdW5jdGlvbihh LGIpe3JldHVybiBiLnRvdGFsRHVyYXRpb24tYS50b3RhbER1cmF0aW9ufSl9ZnVuY3Rpb24gZ2V0 SW5jbHVzaXZlKCl7dmFyIGZsdXNoSGlzdG9yeT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50 c1swXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMF06Z2V0TGFzdE1lYXN1cmVtZW50cygpO2lmKCEo ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIikpe3dhcm5JblByb2R1Y3Rpb24oKTtyZXR1cm5b XX12YXIgYWdncmVnYXRlZFN0YXRzPXt9O3ZhciBhZmZlY3RlZElEcz17fTtmdW5jdGlvbiB1cGRh dGVBZ2dyZWdhdGVkU3RhdHModHJlZVNuYXBzaG90LGluc3RhbmNlSUQsYXBwbHlVcGRhdGUpe3Zh ciBfdHJlZVNuYXBzaG90JGluc3RhbmM9dHJlZVNuYXBzaG90W2luc3RhbmNlSURdLGRpc3BsYXlO YW1lPV90cmVlU25hcHNob3QkaW5zdGFuYy5kaXNwbGF5TmFtZSxvd25lcklEPV90cmVlU25hcHNo b3QkaW5zdGFuYy5vd25lcklEO3ZhciBvd25lcj10cmVlU25hcHNob3Rbb3duZXJJRF07dmFyIGtl eT0ob3duZXI/b3duZXIuZGlzcGxheU5hbWUrIiA+ICI6IiIpK2Rpc3BsYXlOYW1lO3ZhciBzdGF0 cz1hZ2dyZWdhdGVkU3RhdHNba2V5XTtpZighc3RhdHMpe2FmZmVjdGVkSURzW2tleV09e307c3Rh dHM9YWdncmVnYXRlZFN0YXRzW2tleV09e2tleTprZXksaW5zdGFuY2VDb3VudDowLGluY2x1c2l2 ZVJlbmRlckR1cmF0aW9uOjAscmVuZGVyQ291bnQ6MH19YWZmZWN0ZWRJRHNba2V5XVtpbnN0YW5j ZUlEXT10cnVlO2FwcGx5VXBkYXRlKHN0YXRzKX12YXIgaXNDb21wb3NpdGVCeUlEPXt9O2ZsdXNo SGlzdG9yeS5mb3JFYWNoKGZ1bmN0aW9uKGZsdXNoKXt2YXIgbWVhc3VyZW1lbnRzPWZsdXNoLm1l YXN1cmVtZW50czttZWFzdXJlbWVudHMuZm9yRWFjaChmdW5jdGlvbihtZWFzdXJlbWVudCl7dmFy IGluc3RhbmNlSUQ9bWVhc3VyZW1lbnQuaW5zdGFuY2VJRCx0aW1lclR5cGU9bWVhc3VyZW1lbnQu dGltZXJUeXBlO2lmKHRpbWVyVHlwZSE9PSJyZW5kZXIiKXtyZXR1cm59aXNDb21wb3NpdGVCeUlE W2luc3RhbmNlSURdPXRydWV9KX0pO2ZsdXNoSGlzdG9yeS5mb3JFYWNoKGZ1bmN0aW9uKGZsdXNo KXt2YXIgbWVhc3VyZW1lbnRzPWZsdXNoLm1lYXN1cmVtZW50cyx0cmVlU25hcHNob3Q9Zmx1c2gu dHJlZVNuYXBzaG90O21lYXN1cmVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uKG1lYXN1cmVtZW50KXt2 YXIgZHVyYXRpb249bWVhc3VyZW1lbnQuZHVyYXRpb24saW5zdGFuY2VJRD1tZWFzdXJlbWVudC5p bnN0YW5jZUlELHRpbWVyVHlwZT1tZWFzdXJlbWVudC50aW1lclR5cGU7aWYodGltZXJUeXBlIT09 InJlbmRlciIpe3JldHVybn11cGRhdGVBZ2dyZWdhdGVkU3RhdHModHJlZVNuYXBzaG90LGluc3Rh bmNlSUQsZnVuY3Rpb24oc3RhdHMpe3N0YXRzLnJlbmRlckNvdW50Kyt9KTt2YXIgbmV4dFBhcmVu dElEPWluc3RhbmNlSUQ7d2hpbGUobmV4dFBhcmVudElEKXtpZihpc0NvbXBvc2l0ZUJ5SURbbmV4 dFBhcmVudElEXSl7dXBkYXRlQWdncmVnYXRlZFN0YXRzKHRyZWVTbmFwc2hvdCxuZXh0UGFyZW50 SUQsZnVuY3Rpb24oc3RhdHMpe3N0YXRzLmluY2x1c2l2ZVJlbmRlckR1cmF0aW9uKz1kdXJhdGlv bn0pfW5leHRQYXJlbnRJRD10cmVlU25hcHNob3RbbmV4dFBhcmVudElEXS5wYXJlbnRJRH19KX0p O3JldHVybiBPYmplY3Qua2V5cyhhZ2dyZWdhdGVkU3RhdHMpLm1hcChmdW5jdGlvbihrZXkpe3Jl dHVybiBfZXh0ZW5kcyh7fSxhZ2dyZWdhdGVkU3RhdHNba2V5XSx7aW5zdGFuY2VDb3VudDpPYmpl Y3Qua2V5cyhhZmZlY3RlZElEc1trZXldKS5sZW5ndGh9KX0pLnNvcnQoZnVuY3Rpb24oYSxiKXty ZXR1cm4gYi5pbmNsdXNpdmVSZW5kZXJEdXJhdGlvbi1hLmluY2x1c2l2ZVJlbmRlckR1cmF0aW9u fSl9ZnVuY3Rpb24gZ2V0V2FzdGVkKCl7dmFyIGZsdXNoSGlzdG9yeT1hcmd1bWVudHMubGVuZ3Ro PjAmJmFyZ3VtZW50c1swXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMF06Z2V0TGFzdE1lYXN1cmVt ZW50cygpO2lmKCEoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIikpe3dhcm5JblByb2R1Y3Rp b24oKTtyZXR1cm5bXX12YXIgYWdncmVnYXRlZFN0YXRzPXt9O3ZhciBhZmZlY3RlZElEcz17fTtm dW5jdGlvbiB1cGRhdGVBZ2dyZWdhdGVkU3RhdHModHJlZVNuYXBzaG90LGluc3RhbmNlSUQsYXBw bHlVcGRhdGUpe3ZhciBfdHJlZVNuYXBzaG90JGluc3RhbmMyPXRyZWVTbmFwc2hvdFtpbnN0YW5j ZUlEXSxkaXNwbGF5TmFtZT1fdHJlZVNuYXBzaG90JGluc3RhbmMyLmRpc3BsYXlOYW1lLG93bmVy SUQ9X3RyZWVTbmFwc2hvdCRpbnN0YW5jMi5vd25lcklEO3ZhciBvd25lcj10cmVlU25hcHNob3Rb b3duZXJJRF07dmFyIGtleT0ob3duZXI/b3duZXIuZGlzcGxheU5hbWUrIiA+ICI6IiIpK2Rpc3Bs YXlOYW1lO3ZhciBzdGF0cz1hZ2dyZWdhdGVkU3RhdHNba2V5XTtpZighc3RhdHMpe2FmZmVjdGVk SURzW2tleV09e307c3RhdHM9YWdncmVnYXRlZFN0YXRzW2tleV09e2tleTprZXksaW5zdGFuY2VD b3VudDowLGluY2x1c2l2ZVJlbmRlckR1cmF0aW9uOjAscmVuZGVyQ291bnQ6MH19YWZmZWN0ZWRJ RHNba2V5XVtpbnN0YW5jZUlEXT10cnVlO2FwcGx5VXBkYXRlKHN0YXRzKX1mbHVzaEhpc3Rvcnku Zm9yRWFjaChmdW5jdGlvbihmbHVzaCl7dmFyIG1lYXN1cmVtZW50cz1mbHVzaC5tZWFzdXJlbWVu dHMsdHJlZVNuYXBzaG90PWZsdXNoLnRyZWVTbmFwc2hvdCxvcGVyYXRpb25zPWZsdXNoLm9wZXJh dGlvbnM7dmFyIGlzRGVmaW5pdGVseU5vdFdhc3RlZEJ5SUQ9e307b3BlcmF0aW9ucy5mb3JFYWNo KGZ1bmN0aW9uKG9wZXJhdGlvbil7dmFyIGluc3RhbmNlSUQ9b3BlcmF0aW9uLmluc3RhbmNlSUQ7 dmFyIG5leHRQYXJlbnRJRD1pbnN0YW5jZUlEO3doaWxlKG5leHRQYXJlbnRJRCl7aXNEZWZpbml0 ZWx5Tm90V2FzdGVkQnlJRFtuZXh0UGFyZW50SURdPXRydWU7bmV4dFBhcmVudElEPXRyZWVTbmFw c2hvdFtuZXh0UGFyZW50SURdLnBhcmVudElEfX0pO3ZhciByZW5kZXJlZENvbXBvc2l0ZUlEcz17 fTttZWFzdXJlbWVudHMuZm9yRWFjaChmdW5jdGlvbihtZWFzdXJlbWVudCl7dmFyIGluc3RhbmNl SUQ9bWVhc3VyZW1lbnQuaW5zdGFuY2VJRCx0aW1lclR5cGU9bWVhc3VyZW1lbnQudGltZXJUeXBl O2lmKHRpbWVyVHlwZSE9PSJyZW5kZXIiKXtyZXR1cm59cmVuZGVyZWRDb21wb3NpdGVJRHNbaW5z dGFuY2VJRF09dHJ1ZX0pO21lYXN1cmVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uKG1lYXN1cmVtZW50 KXt2YXIgZHVyYXRpb249bWVhc3VyZW1lbnQuZHVyYXRpb24saW5zdGFuY2VJRD1tZWFzdXJlbWVu dC5pbnN0YW5jZUlELHRpbWVyVHlwZT1tZWFzdXJlbWVudC50aW1lclR5cGU7aWYodGltZXJUeXBl IT09InJlbmRlciIpe3JldHVybn12YXIgdXBkYXRlQ291bnQ9dHJlZVNuYXBzaG90W2luc3RhbmNl SURdLnVwZGF0ZUNvdW50O2lmKGlzRGVmaW5pdGVseU5vdFdhc3RlZEJ5SURbaW5zdGFuY2VJRF18 fHVwZGF0ZUNvdW50PT09MCl7cmV0dXJufXVwZGF0ZUFnZ3JlZ2F0ZWRTdGF0cyh0cmVlU25hcHNo b3QsaW5zdGFuY2VJRCxmdW5jdGlvbihzdGF0cyl7c3RhdHMucmVuZGVyQ291bnQrK30pO3ZhciBu ZXh0UGFyZW50SUQ9aW5zdGFuY2VJRDt3aGlsZShuZXh0UGFyZW50SUQpe3ZhciBpc1dhc3RlZD1y ZW5kZXJlZENvbXBvc2l0ZUlEc1tuZXh0UGFyZW50SURdJiYhaXNEZWZpbml0ZWx5Tm90V2FzdGVk QnlJRFtuZXh0UGFyZW50SURdO2lmKGlzV2FzdGVkKXt1cGRhdGVBZ2dyZWdhdGVkU3RhdHModHJl ZVNuYXBzaG90LG5leHRQYXJlbnRJRCxmdW5jdGlvbihzdGF0cyl7c3RhdHMuaW5jbHVzaXZlUmVu ZGVyRHVyYXRpb24rPWR1cmF0aW9ufSl9bmV4dFBhcmVudElEPXRyZWVTbmFwc2hvdFtuZXh0UGFy ZW50SURdLnBhcmVudElEfX0pfSk7cmV0dXJuIE9iamVjdC5rZXlzKGFnZ3JlZ2F0ZWRTdGF0cyku bWFwKGZ1bmN0aW9uKGtleSl7cmV0dXJuIF9leHRlbmRzKHt9LGFnZ3JlZ2F0ZWRTdGF0c1trZXld LHtpbnN0YW5jZUNvdW50Ok9iamVjdC5rZXlzKGFmZmVjdGVkSURzW2tleV0pLmxlbmd0aH0pfSku c29ydChmdW5jdGlvbihhLGIpe3JldHVybiBiLmluY2x1c2l2ZVJlbmRlckR1cmF0aW9uLWEuaW5j bHVzaXZlUmVuZGVyRHVyYXRpb259KX1mdW5jdGlvbiBnZXRPcGVyYXRpb25zKCl7dmFyIGZsdXNo SGlzdG9yeT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXVuZGVmaW5lZD9hcmd1 bWVudHNbMF06Z2V0TGFzdE1lYXN1cmVtZW50cygpO2lmKCEoImRldmVsb3BtZW50IiE9PSJwcm9k dWN0aW9uIikpe3dhcm5JblByb2R1Y3Rpb24oKTtyZXR1cm5bXX12YXIgc3RhdHM9W107Zmx1c2hI aXN0b3J5LmZvckVhY2goZnVuY3Rpb24oZmx1c2gsZmx1c2hJbmRleCl7dmFyIG9wZXJhdGlvbnM9 Zmx1c2gub3BlcmF0aW9ucyx0cmVlU25hcHNob3Q9Zmx1c2gudHJlZVNuYXBzaG90O29wZXJhdGlv bnMuZm9yRWFjaChmdW5jdGlvbihvcGVyYXRpb24pe3ZhciBpbnN0YW5jZUlEPW9wZXJhdGlvbi5p bnN0YW5jZUlELHR5cGU9b3BlcmF0aW9uLnR5cGUscGF5bG9hZD1vcGVyYXRpb24ucGF5bG9hZDt2 YXIgX3RyZWVTbmFwc2hvdCRpbnN0YW5jMz10cmVlU25hcHNob3RbaW5zdGFuY2VJRF0sZGlzcGxh eU5hbWU9X3RyZWVTbmFwc2hvdCRpbnN0YW5jMy5kaXNwbGF5TmFtZSxvd25lcklEPV90cmVlU25h cHNob3QkaW5zdGFuYzMub3duZXJJRDt2YXIgb3duZXI9dHJlZVNuYXBzaG90W293bmVySURdO3Zh ciBrZXk9KG93bmVyP293bmVyLmRpc3BsYXlOYW1lKyIgPiAiOiIiKStkaXNwbGF5TmFtZTtzdGF0 cy5wdXNoKHtmbHVzaEluZGV4OmZsdXNoSW5kZXgsaW5zdGFuY2VJRDppbnN0YW5jZUlELGtleTpr ZXksdHlwZTp0eXBlLG93bmVySUQ6b3duZXJJRCxwYXlsb2FkOnBheWxvYWR9KX0pfSk7cmV0dXJu IHN0YXRzfWZ1bmN0aW9uIHByaW50RXhjbHVzaXZlKGZsdXNoSGlzdG9yeSl7aWYoISgiZGV2ZWxv cG1lbnQiIT09InByb2R1Y3Rpb24iKSl7d2FybkluUHJvZHVjdGlvbigpO3JldHVybn12YXIgc3Rh dHM9Z2V0RXhjbHVzaXZlKGZsdXNoSGlzdG9yeSk7dmFyIHRhYmxlPXN0YXRzLm1hcChmdW5jdGlv bihpdGVtKXt2YXIga2V5PWl0ZW0ua2V5LGluc3RhbmNlQ291bnQ9aXRlbS5pbnN0YW5jZUNvdW50 LHRvdGFsRHVyYXRpb249aXRlbS50b3RhbER1cmF0aW9uO3ZhciByZW5kZXJDb3VudD1pdGVtLmNv dW50cy5yZW5kZXJ8fDA7dmFyIHJlbmRlckR1cmF0aW9uPWl0ZW0uZHVyYXRpb25zLnJlbmRlcnx8 MDtyZXR1cm57Q29tcG9uZW50OmtleSwiVG90YWwgdGltZSAobXMpIjpyb3VuZEZsb2F0KHRvdGFs RHVyYXRpb24pLCJJbnN0YW5jZSBjb3VudCI6aW5zdGFuY2VDb3VudCwiVG90YWwgcmVuZGVyIHRp bWUgKG1zKSI6cm91bmRGbG9hdChyZW5kZXJEdXJhdGlvbiksIkF2ZXJhZ2UgcmVuZGVyIHRpbWUg KG1zKSI6cmVuZGVyQ291bnQ/cm91bmRGbG9hdChyZW5kZXJEdXJhdGlvbi9yZW5kZXJDb3VudCk6 dW5kZWZpbmVkLCJSZW5kZXIgY291bnQiOnJlbmRlckNvdW50LCJUb3RhbCBsaWZlY3ljbGUgdGlt ZSAobXMpIjpyb3VuZEZsb2F0KHRvdGFsRHVyYXRpb24tcmVuZGVyRHVyYXRpb24pfX0pO2NvbnNv bGVUYWJsZSh0YWJsZSl9ZnVuY3Rpb24gcHJpbnRJbmNsdXNpdmUoZmx1c2hIaXN0b3J5KXtpZigh KCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpKXt3YXJuSW5Qcm9kdWN0aW9uKCk7cmV0dXJu fXZhciBzdGF0cz1nZXRJbmNsdXNpdmUoZmx1c2hIaXN0b3J5KTt2YXIgdGFibGU9c3RhdHMubWFw KGZ1bmN0aW9uKGl0ZW0pe3ZhciBrZXk9aXRlbS5rZXksaW5zdGFuY2VDb3VudD1pdGVtLmluc3Rh bmNlQ291bnQsaW5jbHVzaXZlUmVuZGVyRHVyYXRpb249aXRlbS5pbmNsdXNpdmVSZW5kZXJEdXJh dGlvbixyZW5kZXJDb3VudD1pdGVtLnJlbmRlckNvdW50O3JldHVybnsiT3duZXIgPiBDb21wb25l bnQiOmtleSwiSW5jbHVzaXZlIHJlbmRlciB0aW1lIChtcykiOnJvdW5kRmxvYXQoaW5jbHVzaXZl UmVuZGVyRHVyYXRpb24pLCJJbnN0YW5jZSBjb3VudCI6aW5zdGFuY2VDb3VudCwiUmVuZGVyIGNv dW50IjpyZW5kZXJDb3VudH19KTtjb25zb2xlVGFibGUodGFibGUpfWZ1bmN0aW9uIHByaW50V2Fz dGVkKGZsdXNoSGlzdG9yeSl7aWYoISgiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKSl7d2Fy bkluUHJvZHVjdGlvbigpO3JldHVybn12YXIgc3RhdHM9Z2V0V2FzdGVkKGZsdXNoSGlzdG9yeSk7 dmFyIHRhYmxlPXN0YXRzLm1hcChmdW5jdGlvbihpdGVtKXt2YXIga2V5PWl0ZW0ua2V5LGluc3Rh bmNlQ291bnQ9aXRlbS5pbnN0YW5jZUNvdW50LGluY2x1c2l2ZVJlbmRlckR1cmF0aW9uPWl0ZW0u aW5jbHVzaXZlUmVuZGVyRHVyYXRpb24scmVuZGVyQ291bnQ9aXRlbS5yZW5kZXJDb3VudDtyZXR1 cm57Ik93bmVyID4gQ29tcG9uZW50IjprZXksIkluY2x1c2l2ZSB3YXN0ZWQgdGltZSAobXMpIjpy b3VuZEZsb2F0KGluY2x1c2l2ZVJlbmRlckR1cmF0aW9uKSwiSW5zdGFuY2UgY291bnQiOmluc3Rh bmNlQ291bnQsIlJlbmRlciBjb3VudCI6cmVuZGVyQ291bnR9fSk7Y29uc29sZVRhYmxlKHRhYmxl KX1mdW5jdGlvbiBwcmludE9wZXJhdGlvbnMoZmx1c2hIaXN0b3J5KXtpZighKCJkZXZlbG9wbWVu dCIhPT0icHJvZHVjdGlvbiIpKXt3YXJuSW5Qcm9kdWN0aW9uKCk7cmV0dXJufXZhciBzdGF0cz1n ZXRPcGVyYXRpb25zKGZsdXNoSGlzdG9yeSk7dmFyIHRhYmxlPXN0YXRzLm1hcChmdW5jdGlvbihz dGF0KXtyZXR1cm57Ik93bmVyID4gTm9kZSI6c3RhdC5rZXksT3BlcmF0aW9uOnN0YXQudHlwZSxQ YXlsb2FkOnR5cGVvZiBzdGF0LnBheWxvYWQ9PT0ib2JqZWN0Ij9KU09OLnN0cmluZ2lmeShzdGF0 LnBheWxvYWQpOnN0YXQucGF5bG9hZCwiRmx1c2ggaW5kZXgiOnN0YXQuZmx1c2hJbmRleCwiT3du ZXIgQ29tcG9uZW50IElEIjpzdGF0Lm93bmVySUQsIkRPTSBDb21wb25lbnQgSUQiOnN0YXQuaW5z dGFuY2VJRH19KTtjb25zb2xlVGFibGUodGFibGUpfXZhciB3YXJuZWRBYm91dFByaW50RE9NPWZh bHNlO2Z1bmN0aW9uIHByaW50RE9NKG1lYXN1cmVtZW50cyl7ImRldmVsb3BtZW50IiE9PSJwcm9k dWN0aW9uIj93YXJuaW5nKHdhcm5lZEFib3V0UHJpbnRET00sImBSZWFjdFBlcmYucHJpbnRET00o Li4uKWAgaXMgZGVwcmVjYXRlZC4gVXNlICIrImBSZWFjdFBlcmYucHJpbnRPcGVyYXRpb25zKC4u LilgIGluc3RlYWQuIik6dm9pZCAwO3dhcm5lZEFib3V0UHJpbnRET009dHJ1ZTtyZXR1cm4gcHJp bnRPcGVyYXRpb25zKG1lYXN1cmVtZW50cyl9dmFyIHdhcm5lZEFib3V0R2V0TWVhc3VyZW1lbnRz U3VtbWFyeU1hcD1mYWxzZTtmdW5jdGlvbiBnZXRNZWFzdXJlbWVudHNTdW1tYXJ5TWFwKG1lYXN1 cmVtZW50cyl7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKHdhcm5lZEFib3V0 R2V0TWVhc3VyZW1lbnRzU3VtbWFyeU1hcCwiYFJlYWN0UGVyZi5nZXRNZWFzdXJlbWVudHNTdW1t YXJ5TWFwKC4uLilgIGlzIGRlcHJlY2F0ZWQuIFVzZSAiKyJgUmVhY3RQZXJmLmdldFdhc3RlZCgu Li4pYCBpbnN0ZWFkLiIpOnZvaWQgMDt3YXJuZWRBYm91dEdldE1lYXN1cmVtZW50c1N1bW1hcnlN YXA9dHJ1ZTtyZXR1cm4gZ2V0V2FzdGVkKG1lYXN1cmVtZW50cyl9ZnVuY3Rpb24gc3RhcnQoKXtp ZighKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpKXt3YXJuSW5Qcm9kdWN0aW9uKCk7cmV0 dXJufVJlYWN0RGVidWdUb29sLmJlZ2luUHJvZmlsaW5nKCl9ZnVuY3Rpb24gc3RvcCgpe2lmKCEo ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIikpe3dhcm5JblByb2R1Y3Rpb24oKTtyZXR1cm59 UmVhY3REZWJ1Z1Rvb2wuZW5kUHJvZmlsaW5nKCl9ZnVuY3Rpb24gaXNSdW5uaW5nKCl7aWYoISgi ZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKSl7d2FybkluUHJvZHVjdGlvbigpO3JldHVybiBm YWxzZX1yZXR1cm4gUmVhY3REZWJ1Z1Rvb2wuaXNQcm9maWxpbmcoKX12YXIgUmVhY3RQZXJmQW5h bHlzaXM9e2dldExhc3RNZWFzdXJlbWVudHM6Z2V0TGFzdE1lYXN1cmVtZW50cyxnZXRFeGNsdXNp dmU6Z2V0RXhjbHVzaXZlLGdldEluY2x1c2l2ZTpnZXRJbmNsdXNpdmUsZ2V0V2FzdGVkOmdldFdh c3RlZCxnZXRPcGVyYXRpb25zOmdldE9wZXJhdGlvbnMscHJpbnRFeGNsdXNpdmU6cHJpbnRFeGNs dXNpdmUscHJpbnRJbmNsdXNpdmU6cHJpbnRJbmNsdXNpdmUscHJpbnRXYXN0ZWQ6cHJpbnRXYXN0 ZWQscHJpbnRPcGVyYXRpb25zOnByaW50T3BlcmF0aW9ucyxzdGFydDpzdGFydCxzdG9wOnN0b3As aXNSdW5uaW5nOmlzUnVubmluZyxwcmludERPTTpwcmludERPTSxnZXRNZWFzdXJlbWVudHNTdW1t YXJ5TWFwOmdldE1lYXN1cmVtZW50c1N1bW1hcnlNYXB9O21vZHVsZS5leHBvcnRzPVJlYWN0UGVy ZkFuYWx5c2lzfSx7MTU3OjE1NywxNTg6MTU4LDUwOjUwfV0sNzI6W2Z1bmN0aW9uKF9kZXJlcV8s bW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFt ZXM9e307aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7UmVhY3RQcm9wVHlwZUxvY2F0 aW9uTmFtZXM9e3Byb3A6InByb3AiLGNvbnRleHQ6ImNvbnRleHQiLGNoaWxkQ29udGV4dDoiY2hp bGQgY29udGV4dCJ9fW1vZHVsZS5leHBvcnRzPVJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzfSx7 fV0sNzM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIg UmVhY3RQcm9wVHlwZXNTZWNyZXQ9IlNFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxM X0JFX0ZJUkVEIjttb2R1bGUuZXhwb3J0cz1SZWFjdFByb3BUeXBlc1NlY3JldH0se31dLDc0Oltm dW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIF9hc3NpZ249 X2RlcmVxXygxNTgpO3ZhciBDYWxsYmFja1F1ZXVlPV9kZXJlcV8oNik7dmFyIFBvb2xlZENsYXNz PV9kZXJlcV8oMjUpO3ZhciBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXI9X2RlcmVxXygyNik7dmFy IFJlYWN0SW5wdXRTZWxlY3Rpb249X2RlcmVxXyg2Mik7dmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9u PV9kZXJlcV8oNjQpO3ZhciBUcmFuc2FjdGlvbj1fZGVyZXFfKDEwMCk7dmFyIFJlYWN0VXBkYXRl UXVldWU9X2RlcmVxXyg4MSk7dmFyIFNFTEVDVElPTl9SRVNUT1JBVElPTj17aW5pdGlhbGl6ZTpS ZWFjdElucHV0U2VsZWN0aW9uLmdldFNlbGVjdGlvbkluZm9ybWF0aW9uLGNsb3NlOlJlYWN0SW5w dXRTZWxlY3Rpb24ucmVzdG9yZVNlbGVjdGlvbn07dmFyIEVWRU5UX1NVUFBSRVNTSU9OPXtpbml0 aWFsaXplOmZ1bmN0aW9uKCl7dmFyIGN1cnJlbnRseUVuYWJsZWQ9UmVhY3RCcm93c2VyRXZlbnRF bWl0dGVyLmlzRW5hYmxlZCgpO1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5zZXRFbmFibGVkKGZh bHNlKTtyZXR1cm4gY3VycmVudGx5RW5hYmxlZH0sY2xvc2U6ZnVuY3Rpb24ocHJldmlvdXNseUVu YWJsZWQpe1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5zZXRFbmFibGVkKHByZXZpb3VzbHlFbmFi bGVkKX19O3ZhciBPTl9ET01fUkVBRFlfUVVFVUVJTkc9e2luaXRpYWxpemU6ZnVuY3Rpb24oKXt0 aGlzLnJlYWN0TW91bnRSZWFkeS5yZXNldCgpfSxjbG9zZTpmdW5jdGlvbigpe3RoaXMucmVhY3RN b3VudFJlYWR5Lm5vdGlmeUFsbCgpfX07dmFyIFRSQU5TQUNUSU9OX1dSQVBQRVJTPVtTRUxFQ1RJ T05fUkVTVE9SQVRJT04sRVZFTlRfU1VQUFJFU1NJT04sT05fRE9NX1JFQURZX1FVRVVFSU5HXTtp ZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtUUkFOU0FDVElPTl9XUkFQUEVSUy5wdXNo KHtpbml0aWFsaXplOlJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkJlZ2luRmx1c2gs Y2xvc2U6UmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uRW5kRmx1c2h9KX1mdW5jdGlv biBSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uKHVzZUNyZWF0ZUVsZW1lbnQpe3RoaXMucmVpbml0 aWFsaXplVHJhbnNhY3Rpb24oKTt0aGlzLnJlbmRlclRvU3RhdGljTWFya3VwPWZhbHNlO3RoaXMu cmVhY3RNb3VudFJlYWR5PUNhbGxiYWNrUXVldWUuZ2V0UG9vbGVkKG51bGwpO3RoaXMudXNlQ3Jl YXRlRWxlbWVudD11c2VDcmVhdGVFbGVtZW50fXZhciBNaXhpbj17Z2V0VHJhbnNhY3Rpb25XcmFw cGVyczpmdW5jdGlvbigpe3JldHVybiBUUkFOU0FDVElPTl9XUkFQUEVSU30sZ2V0UmVhY3RNb3Vu dFJlYWR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhY3RNb3VudFJlYWR5fSxnZXRVcGRhdGVR dWV1ZTpmdW5jdGlvbigpe3JldHVybiBSZWFjdFVwZGF0ZVF1ZXVlfSxjaGVja3BvaW50OmZ1bmN0 aW9uKCl7cmV0dXJuIHRoaXMucmVhY3RNb3VudFJlYWR5LmNoZWNrcG9pbnQoKX0scm9sbGJhY2s6 ZnVuY3Rpb24oY2hlY2twb2ludCl7dGhpcy5yZWFjdE1vdW50UmVhZHkucm9sbGJhY2soY2hlY2tw b2ludCl9LGRlc3RydWN0b3I6ZnVuY3Rpb24oKXtDYWxsYmFja1F1ZXVlLnJlbGVhc2UodGhpcy5y ZWFjdE1vdW50UmVhZHkpO3RoaXMucmVhY3RNb3VudFJlYWR5PW51bGx9fTtfYXNzaWduKFJlYWN0 UmVjb25jaWxlVHJhbnNhY3Rpb24ucHJvdG90eXBlLFRyYW5zYWN0aW9uLE1peGluKTtQb29sZWRD bGFzcy5hZGRQb29saW5nVG8oUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbik7bW9kdWxlLmV4cG9y dHM9UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0sezEwMDoxMDAsMTU4OjE1OCwyNToyNSwyNjoy Niw2OjYsNjI6NjIsNjQ6NjQsODE6ODF9XSw3NTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhw b3J0cyl7InVzZSBzdHJpY3QiO3ZhciBSZWFjdFJlZj1fZGVyZXFfKDc2KTt2YXIgUmVhY3RJbnN0 cnVtZW50YXRpb249X2RlcmVxXyg2NCk7dmFyIHdhcm5pbmc9X2RlcmVxXygxNTcpO2Z1bmN0aW9u IGF0dGFjaFJlZnMoKXtSZWFjdFJlZi5hdHRhY2hSZWZzKHRoaXMsdGhpcy5fY3VycmVudEVsZW1l bnQpfXZhciBSZWFjdFJlY29uY2lsZXI9e21vdW50Q29tcG9uZW50OmZ1bmN0aW9uKGludGVybmFs SW5zdGFuY2UsdHJhbnNhY3Rpb24saG9zdFBhcmVudCxob3N0Q29udGFpbmVySW5mbyxjb250ZXh0 LHBhcmVudERlYnVnSUQpe2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe2lmKGludGVy bmFsSW5zdGFuY2UuX2RlYnVnSUQhPT0wKXtSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wu b25CZWZvcmVNb3VudENvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lELGludGVybmFs SW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50LHBhcmVudERlYnVnSUQpfX12YXIgbWFya3VwPWludGVy bmFsSW5zdGFuY2UubW91bnRDb21wb25lbnQodHJhbnNhY3Rpb24saG9zdFBhcmVudCxob3N0Q29u dGFpbmVySW5mbyxjb250ZXh0LHBhcmVudERlYnVnSUQpO2lmKGludGVybmFsSW5zdGFuY2UuX2N1 cnJlbnRFbGVtZW50JiZpbnRlcm5hbEluc3RhbmNlLl9jdXJyZW50RWxlbWVudC5yZWYhPW51bGwp e3RyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoYXR0YWNoUmVmcyxpbnRl cm5hbEluc3RhbmNlKX1pZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtpZihpbnRlcm5h bEluc3RhbmNlLl9kZWJ1Z0lEIT09MCl7UmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9u TW91bnRDb21wb25lbnQoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCl9fXJldHVybiBtYXJrdXB9 LGdldEhvc3ROb2RlOmZ1bmN0aW9uKGludGVybmFsSW5zdGFuY2Upe3JldHVybiBpbnRlcm5hbElu c3RhbmNlLmdldEhvc3ROb2RlKCl9LHVubW91bnRDb21wb25lbnQ6ZnVuY3Rpb24oaW50ZXJuYWxJ bnN0YW5jZSxzYWZlbHkpe2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe2lmKGludGVy bmFsSW5zdGFuY2UuX2RlYnVnSUQhPT0wKXtSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wu b25CZWZvcmVVbm1vdW50Q29tcG9uZW50KGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQpfX1SZWFj dFJlZi5kZXRhY2hSZWZzKGludGVybmFsSW5zdGFuY2UsaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVu dEVsZW1lbnQpO2ludGVybmFsSW5zdGFuY2UudW5tb3VudENvbXBvbmVudChzYWZlbHkpO2lmKCJk ZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe2lmKGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQh PT0wKXtSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Vbm1vdW50Q29tcG9uZW50KGlu dGVybmFsSW5zdGFuY2UuX2RlYnVnSUQpfX19LHJlY2VpdmVDb21wb25lbnQ6ZnVuY3Rpb24oaW50 ZXJuYWxJbnN0YW5jZSxuZXh0RWxlbWVudCx0cmFuc2FjdGlvbixjb250ZXh0KXt2YXIgcHJldkVs ZW1lbnQ9aW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQ7aWYobmV4dEVsZW1lbnQ9PT1w cmV2RWxlbWVudCYmY29udGV4dD09PWludGVybmFsSW5zdGFuY2UuX2NvbnRleHQpe3JldHVybn1p ZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtpZihpbnRlcm5hbEluc3RhbmNlLl9kZWJ1 Z0lEIT09MCl7UmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uQmVmb3JlVXBkYXRlQ29t cG9uZW50KGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQsbmV4dEVsZW1lbnQpfX12YXIgcmVmc0No YW5nZWQ9UmVhY3RSZWYuc2hvdWxkVXBkYXRlUmVmcyhwcmV2RWxlbWVudCxuZXh0RWxlbWVudCk7 aWYocmVmc0NoYW5nZWQpe1JlYWN0UmVmLmRldGFjaFJlZnMoaW50ZXJuYWxJbnN0YW5jZSxwcmV2 RWxlbWVudCl9aW50ZXJuYWxJbnN0YW5jZS5yZWNlaXZlQ29tcG9uZW50KG5leHRFbGVtZW50LHRy YW5zYWN0aW9uLGNvbnRleHQpO2lmKHJlZnNDaGFuZ2VkJiZpbnRlcm5hbEluc3RhbmNlLl9jdXJy ZW50RWxlbWVudCYmaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQucmVmIT1udWxsKXt0 cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGF0dGFjaFJlZnMsaW50ZXJu YWxJbnN0YW5jZSl9aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7aWYoaW50ZXJuYWxJ bnN0YW5jZS5fZGVidWdJRCE9PTApe1JlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblVw ZGF0ZUNvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEKX19fSxwZXJmb3JtVXBkYXRl SWZOZWNlc3Nhcnk6ZnVuY3Rpb24oaW50ZXJuYWxJbnN0YW5jZSx0cmFuc2FjdGlvbix1cGRhdGVC YXRjaE51bWJlcil7aWYoaW50ZXJuYWxJbnN0YW5jZS5fdXBkYXRlQmF0Y2hOdW1iZXIhPT11cGRh dGVCYXRjaE51bWJlcil7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKGludGVy bmFsSW5zdGFuY2UuX3VwZGF0ZUJhdGNoTnVtYmVyPT1udWxsfHxpbnRlcm5hbEluc3RhbmNlLl91 cGRhdGVCYXRjaE51bWJlcj09PXVwZGF0ZUJhdGNoTnVtYmVyKzEsInBlcmZvcm1VcGRhdGVJZk5l Y2Vzc2FyeTogVW5leHBlY3RlZCBiYXRjaCBudW1iZXIgKGN1cnJlbnQgJXMsICIrInBlbmRpbmcg JXMpIix1cGRhdGVCYXRjaE51bWJlcixpbnRlcm5hbEluc3RhbmNlLl91cGRhdGVCYXRjaE51bWJl cik6dm9pZCAwO3JldHVybn1pZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtpZihpbnRl cm5hbEluc3RhbmNlLl9kZWJ1Z0lEIT09MCl7UmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29s Lm9uQmVmb3JlVXBkYXRlQ29tcG9uZW50KGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQsaW50ZXJu YWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQpfX1pbnRlcm5hbEluc3RhbmNlLnBlcmZvcm1VcGRh dGVJZk5lY2Vzc2FyeSh0cmFuc2FjdGlvbik7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9u Iil7aWYoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCE9PTApe1JlYWN0SW5zdHJ1bWVudGF0aW9u LmRlYnVnVG9vbC5vblVwZGF0ZUNvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEKX19 fX07bW9kdWxlLmV4cG9ydHM9UmVhY3RSZWNvbmNpbGVyfSx7MTU3OjE1Nyw2NDo2NCw3Njo3Nn1d LDc2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIFJl YWN0T3duZXI9X2RlcmVxXyg3MCk7dmFyIFJlYWN0UmVmPXt9O2Z1bmN0aW9uIGF0dGFjaFJlZihy ZWYsY29tcG9uZW50LG93bmVyKXtpZih0eXBlb2YgcmVmPT09ImZ1bmN0aW9uIil7cmVmKGNvbXBv bmVudC5nZXRQdWJsaWNJbnN0YW5jZSgpKX1lbHNle1JlYWN0T3duZXIuYWRkQ29tcG9uZW50QXNS ZWZUbyhjb21wb25lbnQscmVmLG93bmVyKX19ZnVuY3Rpb24gZGV0YWNoUmVmKHJlZixjb21wb25l bnQsb3duZXIpe2lmKHR5cGVvZiByZWY9PT0iZnVuY3Rpb24iKXtyZWYobnVsbCl9ZWxzZXtSZWFj dE93bmVyLnJlbW92ZUNvbXBvbmVudEFzUmVmRnJvbShjb21wb25lbnQscmVmLG93bmVyKX19UmVh Y3RSZWYuYXR0YWNoUmVmcz1mdW5jdGlvbihpbnN0YW5jZSxlbGVtZW50KXtpZihlbGVtZW50PT09 bnVsbHx8dHlwZW9mIGVsZW1lbnQhPT0ib2JqZWN0Iil7cmV0dXJufXZhciByZWY9ZWxlbWVudC5y ZWY7aWYocmVmIT1udWxsKXthdHRhY2hSZWYocmVmLGluc3RhbmNlLGVsZW1lbnQuX293bmVyKX19 O1JlYWN0UmVmLnNob3VsZFVwZGF0ZVJlZnM9ZnVuY3Rpb24ocHJldkVsZW1lbnQsbmV4dEVsZW1l bnQpe3ZhciBwcmV2UmVmPW51bGw7dmFyIHByZXZPd25lcj1udWxsO2lmKHByZXZFbGVtZW50IT09 bnVsbCYmdHlwZW9mIHByZXZFbGVtZW50PT09Im9iamVjdCIpe3ByZXZSZWY9cHJldkVsZW1lbnQu cmVmO3ByZXZPd25lcj1wcmV2RWxlbWVudC5fb3duZXJ9dmFyIG5leHRSZWY9bnVsbDt2YXIgbmV4 dE93bmVyPW51bGw7aWYobmV4dEVsZW1lbnQhPT1udWxsJiZ0eXBlb2YgbmV4dEVsZW1lbnQ9PT0i b2JqZWN0Iil7bmV4dFJlZj1uZXh0RWxlbWVudC5yZWY7bmV4dE93bmVyPW5leHRFbGVtZW50Ll9v d25lcn1yZXR1cm4gcHJldlJlZiE9PW5leHRSZWZ8fHR5cGVvZiBuZXh0UmVmPT09InN0cmluZyIm Jm5leHRPd25lciE9PXByZXZPd25lcn07UmVhY3RSZWYuZGV0YWNoUmVmcz1mdW5jdGlvbihpbnN0 YW5jZSxlbGVtZW50KXtpZihlbGVtZW50PT09bnVsbHx8dHlwZW9mIGVsZW1lbnQhPT0ib2JqZWN0 Iil7cmV0dXJufXZhciByZWY9ZWxlbWVudC5yZWY7aWYocmVmIT1udWxsKXtkZXRhY2hSZWYocmVm LGluc3RhbmNlLGVsZW1lbnQuX293bmVyKX19O21vZHVsZS5leHBvcnRzPVJlYWN0UmVmfSx7NzA6 NzB9XSw3NzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3Zh ciBfYXNzaWduPV9kZXJlcV8oMTU4KTt2YXIgUG9vbGVkQ2xhc3M9X2RlcmVxXygyNSk7dmFyIFRy YW5zYWN0aW9uPV9kZXJlcV8oMTAwKTt2YXIgUmVhY3RJbnN0cnVtZW50YXRpb249X2RlcmVxXyg2 NCk7dmFyIFJlYWN0U2VydmVyVXBkYXRlUXVldWU9X2RlcmVxXyg3OCk7dmFyIFRSQU5TQUNUSU9O X1dSQVBQRVJTPVtdO2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe1RSQU5TQUNUSU9O X1dSQVBQRVJTLnB1c2goe2luaXRpYWxpemU6UmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29s Lm9uQmVnaW5GbHVzaCxjbG9zZTpSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25FbmRG bHVzaH0pfXZhciBub29wQ2FsbGJhY2tRdWV1ZT17ZW5xdWV1ZTpmdW5jdGlvbigpe319O2Z1bmN0 aW9uIFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb24ocmVuZGVyVG9TdGF0aWNNYXJrdXAp e3RoaXMucmVpbml0aWFsaXplVHJhbnNhY3Rpb24oKTt0aGlzLnJlbmRlclRvU3RhdGljTWFya3Vw PXJlbmRlclRvU3RhdGljTWFya3VwO3RoaXMudXNlQ3JlYXRlRWxlbWVudD1mYWxzZTt0aGlzLnVw ZGF0ZVF1ZXVlPW5ldyBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlKHRoaXMpfXZhciBNaXhpbj17Z2V0 VHJhbnNhY3Rpb25XcmFwcGVyczpmdW5jdGlvbigpe3JldHVybiBUUkFOU0FDVElPTl9XUkFQUEVS U30sZ2V0UmVhY3RNb3VudFJlYWR5OmZ1bmN0aW9uKCl7cmV0dXJuIG5vb3BDYWxsYmFja1F1ZXVl fSxnZXRVcGRhdGVRdWV1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVwZGF0ZVF1ZXVlfSxkZXN0 cnVjdG9yOmZ1bmN0aW9uKCl7fSxjaGVja3BvaW50OmZ1bmN0aW9uKCl7fSxyb2xsYmFjazpmdW5j dGlvbigpe319O19hc3NpZ24oUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbi5wcm90b3R5 cGUsVHJhbnNhY3Rpb24sTWl4aW4pO1Bvb2xlZENsYXNzLmFkZFBvb2xpbmdUbyhSZWFjdFNlcnZl clJlbmRlcmluZ1RyYW5zYWN0aW9uKTttb2R1bGUuZXhwb3J0cz1SZWFjdFNlcnZlclJlbmRlcmlu Z1RyYW5zYWN0aW9ufSx7MTAwOjEwMCwxNTg6MTU4LDI1OjI1LDY0OjY0LDc4Ojc4fV0sNzg6W2Z1 bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBfY2xh c3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2Vv ZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3Mg YXMgYSBmdW5jdGlvbiIpfX12YXIgUmVhY3RVcGRhdGVRdWV1ZT1fZGVyZXFfKDgxKTt2YXIgd2Fy bmluZz1fZGVyZXFfKDE1Nyk7ZnVuY3Rpb24gd2Fybk5vb3AocHVibGljSW5zdGFuY2UsY2FsbGVy TmFtZSl7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7dmFyIGNvbnN0cnVjdG9yPXB1 YmxpY0luc3RhbmNlLmNvbnN0cnVjdG9yOyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2Fy bmluZyhmYWxzZSwiJXMoLi4uKTogQ2FuIG9ubHkgdXBkYXRlIGEgbW91bnRpbmcgY29tcG9uZW50 LiAiKyJUaGlzIHVzdWFsbHkgbWVhbnMgeW91IGNhbGxlZCAlcygpIG91dHNpZGUgY29tcG9uZW50 V2lsbE1vdW50KCkgb24gdGhlIHNlcnZlci4gIisiVGhpcyBpcyBhIG5vLW9wLiBQbGVhc2UgY2hl Y2sgdGhlIGNvZGUgZm9yIHRoZSAlcyBjb21wb25lbnQuIixjYWxsZXJOYW1lLGNhbGxlck5hbWUs Y29uc3RydWN0b3ImJihjb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZXx8Y29uc3RydWN0b3IubmFtZSl8 fCJSZWFjdENsYXNzIik6dm9pZCAwfX12YXIgUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZT1mdW5jdGlv bigpe2Z1bmN0aW9uIFJlYWN0U2VydmVyVXBkYXRlUXVldWUodHJhbnNhY3Rpb24pe19jbGFzc0Nh bGxDaGVjayh0aGlzLFJlYWN0U2VydmVyVXBkYXRlUXVldWUpO3RoaXMudHJhbnNhY3Rpb249dHJh bnNhY3Rpb259UmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZS5wcm90b3R5cGUuaXNNb3VudGVkPWZ1bmN0 aW9uIGlzTW91bnRlZChwdWJsaWNJbnN0YW5jZSl7cmV0dXJuIGZhbHNlfTtSZWFjdFNlcnZlclVw ZGF0ZVF1ZXVlLnByb3RvdHlwZS5lbnF1ZXVlQ2FsbGJhY2s9ZnVuY3Rpb24gZW5xdWV1ZUNhbGxi YWNrKHB1YmxpY0luc3RhbmNlLGNhbGxiYWNrLGNhbGxlck5hbWUpe2lmKHRoaXMudHJhbnNhY3Rp b24uaXNJblRyYW5zYWN0aW9uKCkpe1JlYWN0VXBkYXRlUXVldWUuZW5xdWV1ZUNhbGxiYWNrKHB1 YmxpY0luc3RhbmNlLGNhbGxiYWNrLGNhbGxlck5hbWUpfX07UmVhY3RTZXJ2ZXJVcGRhdGVRdWV1 ZS5wcm90b3R5cGUuZW5xdWV1ZUZvcmNlVXBkYXRlPWZ1bmN0aW9uIGVucXVldWVGb3JjZVVwZGF0 ZShwdWJsaWNJbnN0YW5jZSl7aWYodGhpcy50cmFuc2FjdGlvbi5pc0luVHJhbnNhY3Rpb24oKSl7 UmVhY3RVcGRhdGVRdWV1ZS5lbnF1ZXVlRm9yY2VVcGRhdGUocHVibGljSW5zdGFuY2UpfWVsc2V7 d2Fybk5vb3AocHVibGljSW5zdGFuY2UsImZvcmNlVXBkYXRlIil9fTtSZWFjdFNlcnZlclVwZGF0 ZVF1ZXVlLnByb3RvdHlwZS5lbnF1ZXVlUmVwbGFjZVN0YXRlPWZ1bmN0aW9uIGVucXVldWVSZXBs YWNlU3RhdGUocHVibGljSW5zdGFuY2UsY29tcGxldGVTdGF0ZSl7aWYodGhpcy50cmFuc2FjdGlv bi5pc0luVHJhbnNhY3Rpb24oKSl7UmVhY3RVcGRhdGVRdWV1ZS5lbnF1ZXVlUmVwbGFjZVN0YXRl KHB1YmxpY0luc3RhbmNlLGNvbXBsZXRlU3RhdGUpfWVsc2V7d2Fybk5vb3AocHVibGljSW5zdGFu Y2UsInJlcGxhY2VTdGF0ZSIpfX07UmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZS5wcm90b3R5cGUuZW5x dWV1ZVNldFN0YXRlPWZ1bmN0aW9uIGVucXVldWVTZXRTdGF0ZShwdWJsaWNJbnN0YW5jZSxwYXJ0 aWFsU3RhdGUpe2lmKHRoaXMudHJhbnNhY3Rpb24uaXNJblRyYW5zYWN0aW9uKCkpe1JlYWN0VXBk YXRlUXVldWUuZW5xdWV1ZVNldFN0YXRlKHB1YmxpY0luc3RhbmNlLHBhcnRpYWxTdGF0ZSl9ZWxz ZXt3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwic2V0U3RhdGUiKX19O3JldHVybiBSZWFjdFNlcnZl clVwZGF0ZVF1ZXVlfSgpO21vZHVsZS5leHBvcnRzPVJlYWN0U2VydmVyVXBkYXRlUXVldWV9LHsx NTc6MTU3LDgxOjgxfV0sNzk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ug c3RyaWN0Ijt2YXIgX3Byb2RJbnZhcmlhbnQ9X2RlcmVxXygxMjUpLF9hc3NpZ249X2RlcmVxXygx NTgpO2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSxDb25zdHJ1Y3Rvcil7aWYoIShp bnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fu bm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9fXZhciBSZWFjdD1fZGVyZXFfKDEzNCk7 dmFyIFJlYWN0RGVmYXVsdEluamVjdGlvbj1fZGVyZXFfKDUyKTt2YXIgUmVhY3RDb21wb3NpdGVD b21wb25lbnQ9X2RlcmVxXygzMCk7dmFyIFJlYWN0UmVjb25jaWxlcj1fZGVyZXFfKDc1KTt2YXIg UmVhY3RVcGRhdGVzPV9kZXJlcV8oODIpO3ZhciBlbXB0eU9iamVjdD1fZGVyZXFfKDE0Myk7dmFy IGdldE5leHREZWJ1Z0lEPV9kZXJlcV8oMTE3KTt2YXIgaW52YXJpYW50PV9kZXJlcV8oMTUwKTt2 YXIgTm9vcEludGVybmFsQ29tcG9uZW50PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gTm9vcEludGVybmFs Q29tcG9uZW50KGVsZW1lbnQpe19jbGFzc0NhbGxDaGVjayh0aGlzLE5vb3BJbnRlcm5hbENvbXBv bmVudCk7dGhpcy5fcmVuZGVyZWRPdXRwdXQ9ZWxlbWVudDt0aGlzLl9jdXJyZW50RWxlbWVudD1l bGVtZW50O2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe3RoaXMuX2RlYnVnSUQ9Z2V0 TmV4dERlYnVnSUQoKX19Tm9vcEludGVybmFsQ29tcG9uZW50LnByb3RvdHlwZS5tb3VudENvbXBv bmVudD1mdW5jdGlvbiBtb3VudENvbXBvbmVudCgpe307Tm9vcEludGVybmFsQ29tcG9uZW50LnBy b3RvdHlwZS5yZWNlaXZlQ29tcG9uZW50PWZ1bmN0aW9uIHJlY2VpdmVDb21wb25lbnQoZWxlbWVu dCl7dGhpcy5fcmVuZGVyZWRPdXRwdXQ9ZWxlbWVudDt0aGlzLl9jdXJyZW50RWxlbWVudD1lbGVt ZW50fTtOb29wSW50ZXJuYWxDb21wb25lbnQucHJvdG90eXBlLnVubW91bnRDb21wb25lbnQ9ZnVu Y3Rpb24gdW5tb3VudENvbXBvbmVudCgpe307Tm9vcEludGVybmFsQ29tcG9uZW50LnByb3RvdHlw ZS5nZXRIb3N0Tm9kZT1mdW5jdGlvbiBnZXRIb3N0Tm9kZSgpe3JldHVybiB1bmRlZmluZWR9O05v b3BJbnRlcm5hbENvbXBvbmVudC5wcm90b3R5cGUuZ2V0UHVibGljSW5zdGFuY2U9ZnVuY3Rpb24g Z2V0UHVibGljSW5zdGFuY2UoKXtyZXR1cm4gbnVsbH07cmV0dXJuIE5vb3BJbnRlcm5hbENvbXBv bmVudH0oKTt2YXIgU2hhbGxvd0NvbXBvbmVudFdyYXBwZXI9ZnVuY3Rpb24oZWxlbWVudCl7aWYo ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7dGhpcy5fZGVidWdJRD1nZXROZXh0RGVidWdJ RCgpfXRoaXMuY29uc3RydWN0KGVsZW1lbnQpfTtfYXNzaWduKFNoYWxsb3dDb21wb25lbnRXcmFw cGVyLnByb3RvdHlwZSxSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCx7X2NvbnN0cnVjdENvbXBvbmVu dDpSZWFjdENvbXBvc2l0ZUNvbXBvbmVudC5fY29uc3RydWN0Q29tcG9uZW50V2l0aG91dE93bmVy LF9pbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50OmZ1bmN0aW9uKGVsZW1lbnQpe3JldHVybiBuZXcg Tm9vcEludGVybmFsQ29tcG9uZW50KGVsZW1lbnQpfSxfcmVwbGFjZU5vZGVXaXRoTWFya3VwOmZ1 bmN0aW9uKCl7fSxfcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50OlJlYWN0Q29tcG9zaXRlQ29tcG9u ZW50Ll9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnRXaXRob3V0T3duZXJPckNvbnRleHR9KTtmdW5j dGlvbiBfYmF0Y2hlZFJlbmRlcihyZW5kZXJlcixlbGVtZW50LGNvbnRleHQpe3ZhciB0cmFuc2Fj dGlvbj1SZWFjdFVwZGF0ZXMuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbi5nZXRQb29sZWQodHJ1 ZSk7cmVuZGVyZXIuX3JlbmRlcihlbGVtZW50LHRyYW5zYWN0aW9uLGNvbnRleHQpO1JlYWN0VXBk YXRlcy5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uLnJlbGVhc2UodHJhbnNhY3Rpb24pfXZhciBS ZWFjdFNoYWxsb3dSZW5kZXJlcj1mdW5jdGlvbigpe2Z1bmN0aW9uIFJlYWN0U2hhbGxvd1JlbmRl cmVyKCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsUmVhY3RTaGFsbG93UmVuZGVyZXIpO3RoaXMuX2lu c3RhbmNlPW51bGx9UmVhY3RTaGFsbG93UmVuZGVyZXIucHJvdG90eXBlLmdldE1vdW50ZWRJbnN0 YW5jZT1mdW5jdGlvbiBnZXRNb3VudGVkSW5zdGFuY2UoKXtyZXR1cm4gdGhpcy5faW5zdGFuY2U/ dGhpcy5faW5zdGFuY2UuX2luc3RhbmNlOm51bGx9O1JlYWN0U2hhbGxvd1JlbmRlcmVyLnByb3Rv dHlwZS5yZW5kZXI9ZnVuY3Rpb24gcmVuZGVyKGVsZW1lbnQsY29udGV4dCl7UmVhY3REZWZhdWx0 SW5qZWN0aW9uLmluamVjdCgpOyFSZWFjdC5pc1ZhbGlkRWxlbWVudChlbGVtZW50KT8iZGV2ZWxv cG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiUmVhY3RTaGFsbG93UmVuZGVy ZXIgcmVuZGVyKCk6IEludmFsaWQgY29tcG9uZW50IGVsZW1lbnQuJXMiLHR5cGVvZiBlbGVtZW50 PT09ImZ1bmN0aW9uIj8iIEluc3RlYWQgb2YgcGFzc2luZyBhIGNvbXBvbmVudCBjbGFzcywgbWFr ZSBzdXJlIHRvIGluc3RhbnRpYXRlICIrIml0IGJ5IHBhc3NpbmcgaXQgdG8gUmVhY3QuY3JlYXRl RWxlbWVudC4iOiIiKTpfcHJvZEludmFyaWFudCgiMTIiLHR5cGVvZiBlbGVtZW50PT09ImZ1bmN0 aW9uIj8iIEluc3RlYWQgb2YgcGFzc2luZyBhIGNvbXBvbmVudCBjbGFzcywgbWFrZSBzdXJlIHRv IGluc3RhbnRpYXRlICIrIml0IGJ5IHBhc3NpbmcgaXQgdG8gUmVhY3QuY3JlYXRlRWxlbWVudC4i OiIiKTp2b2lkIDA7ISh0eXBlb2YgZWxlbWVudC50eXBlIT09InN0cmluZyIpPyJkZXZlbG9wbWVu dCIhPT0icHJvZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJSZWFjdFNoYWxsb3dSZW5kZXJlciBy ZW5kZXIoKTogU2hhbGxvdyByZW5kZXJpbmcgd29ya3Mgb25seSB3aXRoIGN1c3RvbSBjb21wb25l bnRzLCBub3QgcHJpbWl0aXZlcyAoJXMpLiBJbnN0ZWFkIG9mIGNhbGxpbmcgYC5yZW5kZXIoZWwp YCBhbmQgaW5zcGVjdGluZyB0aGUgcmVuZGVyZWQgb3V0cHV0LCBsb29rIGF0IGBlbC5wcm9wc2Ag ZGlyZWN0bHkgaW5zdGVhZC4iLGVsZW1lbnQudHlwZSk6X3Byb2RJbnZhcmlhbnQoIjEzIixlbGVt ZW50LnR5cGUpOnZvaWQgMDtpZighY29udGV4dCl7Y29udGV4dD1lbXB0eU9iamVjdH1SZWFjdFVw ZGF0ZXMuYmF0Y2hlZFVwZGF0ZXMoX2JhdGNoZWRSZW5kZXIsdGhpcyxlbGVtZW50LGNvbnRleHQp O3JldHVybiB0aGlzLmdldFJlbmRlck91dHB1dCgpfTtSZWFjdFNoYWxsb3dSZW5kZXJlci5wcm90 b3R5cGUuZ2V0UmVuZGVyT3V0cHV0PWZ1bmN0aW9uIGdldFJlbmRlck91dHB1dCgpe3JldHVybiB0 aGlzLl9pbnN0YW5jZSYmdGhpcy5faW5zdGFuY2UuX3JlbmRlcmVkQ29tcG9uZW50JiZ0aGlzLl9p bnN0YW5jZS5fcmVuZGVyZWRDb21wb25lbnQuX3JlbmRlcmVkT3V0cHV0fHxudWxsfTtSZWFjdFNo YWxsb3dSZW5kZXJlci5wcm90b3R5cGUudW5tb3VudD1mdW5jdGlvbiB1bm1vdW50KCl7aWYodGhp cy5faW5zdGFuY2Upe1JlYWN0UmVjb25jaWxlci51bm1vdW50Q29tcG9uZW50KHRoaXMuX2luc3Rh bmNlLGZhbHNlKX19O1JlYWN0U2hhbGxvd1JlbmRlcmVyLnByb3RvdHlwZS5fcmVuZGVyPWZ1bmN0 aW9uIF9yZW5kZXIoZWxlbWVudCx0cmFuc2FjdGlvbixjb250ZXh0KXtpZih0aGlzLl9pbnN0YW5j ZSl7UmVhY3RSZWNvbmNpbGVyLnJlY2VpdmVDb21wb25lbnQodGhpcy5faW5zdGFuY2UsZWxlbWVu dCx0cmFuc2FjdGlvbixjb250ZXh0KX1lbHNle3ZhciBpbnN0YW5jZT1uZXcgU2hhbGxvd0NvbXBv bmVudFdyYXBwZXIoZWxlbWVudCk7UmVhY3RSZWNvbmNpbGVyLm1vdW50Q29tcG9uZW50KGluc3Rh bmNlLHRyYW5zYWN0aW9uLG51bGwsbnVsbCxjb250ZXh0LDApO3RoaXMuX2luc3RhbmNlPWluc3Rh bmNlfX07cmV0dXJuIFJlYWN0U2hhbGxvd1JlbmRlcmVyfSgpO21vZHVsZS5leHBvcnRzPVJlYWN0 U2hhbGxvd1JlbmRlcmVyfSx7MTE3OjExNywxMjU6MTI1LDEzNDoxMzQsMTQzOjE0MywxNTA6MTUw LDE1ODoxNTgsMzA6MzAsNTI6NTIsNzU6NzUsODI6ODJ9XSw4MDpbZnVuY3Rpb24oX2RlcmVxXyxt b2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBfcHJvZEludmFyaWFudD1fZGVyZXFfKDEy NSksX2Fzc2lnbj1fZGVyZXFfKDE1OCk7dmFyIEV2ZW50Q29uc3RhbnRzPV9kZXJlcV8oMTYpO3Zh ciBFdmVudFBsdWdpbkh1Yj1fZGVyZXFfKDE3KTt2YXIgRXZlbnRQbHVnaW5SZWdpc3RyeT1fZGVy ZXFfKDE4KTt2YXIgRXZlbnRQcm9wYWdhdG9ycz1fZGVyZXFfKDIwKTt2YXIgUmVhY3Q9X2RlcmVx XygxMzQpO3ZhciBSZWFjdERPTT1fZGVyZXFfKDMxKTt2YXIgUmVhY3RET01Db21wb25lbnRUcmVl PV9kZXJlcV8oMzQpO3ZhciBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXI9X2RlcmVxXygyNik7dmFy IFJlYWN0SW5zdGFuY2VNYXA9X2RlcmVxXyg2Myk7dmFyIFJlYWN0VXBkYXRlcz1fZGVyZXFfKDgy KTt2YXIgU3ludGhldGljRXZlbnQ9X2RlcmVxXyg5MSk7dmFyIFJlYWN0U2hhbGxvd1JlbmRlcmVy PV9kZXJlcV8oNzkpO3ZhciBmaW5kRE9NTm9kZT1fZGVyZXFfKDEwOCk7dmFyIGludmFyaWFudD1f ZGVyZXFfKDE1MCk7dmFyIHRvcExldmVsVHlwZXM9RXZlbnRDb25zdGFudHMudG9wTGV2ZWxUeXBl cztmdW5jdGlvbiBFdmVudChzdWZmaXgpe31mdW5jdGlvbiBmaW5kQWxsSW5SZW5kZXJlZFRyZWVJ bnRlcm5hbChpbnN0LHRlc3Qpe2lmKCFpbnN0fHwhaW5zdC5nZXRQdWJsaWNJbnN0YW5jZSl7cmV0 dXJuW119dmFyIHB1YmxpY0luc3Q9aW5zdC5nZXRQdWJsaWNJbnN0YW5jZSgpO3ZhciByZXQ9dGVz dChwdWJsaWNJbnN0KT9bcHVibGljSW5zdF06W107dmFyIGN1cnJlbnRFbGVtZW50PWluc3QuX2N1 cnJlbnRFbGVtZW50O2lmKFJlYWN0VGVzdFV0aWxzLmlzRE9NQ29tcG9uZW50KHB1YmxpY0luc3Qp KXt2YXIgcmVuZGVyZWRDaGlsZHJlbj1pbnN0Ll9yZW5kZXJlZENoaWxkcmVuO3ZhciBrZXk7Zm9y KGtleSBpbiByZW5kZXJlZENoaWxkcmVuKXtpZighcmVuZGVyZWRDaGlsZHJlbi5oYXNPd25Qcm9w ZXJ0eShrZXkpKXtjb250aW51ZX1yZXQ9cmV0LmNvbmNhdChmaW5kQWxsSW5SZW5kZXJlZFRyZWVJ bnRlcm5hbChyZW5kZXJlZENoaWxkcmVuW2tleV0sdGVzdCkpfX1lbHNlIGlmKFJlYWN0LmlzVmFs aWRFbGVtZW50KGN1cnJlbnRFbGVtZW50KSYmdHlwZW9mIGN1cnJlbnRFbGVtZW50LnR5cGU9PT0i ZnVuY3Rpb24iKXtyZXQ9cmV0LmNvbmNhdChmaW5kQWxsSW5SZW5kZXJlZFRyZWVJbnRlcm5hbChp bnN0Ll9yZW5kZXJlZENvbXBvbmVudCx0ZXN0KSl9cmV0dXJuIHJldH12YXIgUmVhY3RUZXN0VXRp bHM9e3JlbmRlckludG9Eb2N1bWVudDpmdW5jdGlvbihlbGVtZW50KXt2YXIgZGl2PWRvY3VtZW50 LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBSZWFjdERPTS5yZW5kZXIoZWxlbWVudCxkaXYp fSxpc0VsZW1lbnQ6ZnVuY3Rpb24oZWxlbWVudCl7cmV0dXJuIFJlYWN0LmlzVmFsaWRFbGVtZW50 KGVsZW1lbnQpfSxpc0VsZW1lbnRPZlR5cGU6ZnVuY3Rpb24oaW5zdCxjb252ZW5pZW5jZUNvbnN0 cnVjdG9yKXtyZXR1cm4gUmVhY3QuaXNWYWxpZEVsZW1lbnQoaW5zdCkmJmluc3QudHlwZT09PWNv bnZlbmllbmNlQ29uc3RydWN0b3J9LGlzRE9NQ29tcG9uZW50OmZ1bmN0aW9uKGluc3Qpe3JldHVy biEhKGluc3QmJmluc3Qubm9kZVR5cGU9PT0xJiZpbnN0LnRhZ05hbWUpfSxpc0RPTUNvbXBvbmVu dEVsZW1lbnQ6ZnVuY3Rpb24oaW5zdCl7cmV0dXJuISEoaW5zdCYmUmVhY3QuaXNWYWxpZEVsZW1l bnQoaW5zdCkmJiEhaW5zdC50YWdOYW1lKX0saXNDb21wb3NpdGVDb21wb25lbnQ6ZnVuY3Rpb24o aW5zdCl7aWYoUmVhY3RUZXN0VXRpbHMuaXNET01Db21wb25lbnQoaW5zdCkpe3JldHVybiBmYWxz ZX1yZXR1cm4gaW5zdCE9bnVsbCYmdHlwZW9mIGluc3QucmVuZGVyPT09ImZ1bmN0aW9uIiYmdHlw ZW9mIGluc3Quc2V0U3RhdGU9PT0iZnVuY3Rpb24ifSxpc0NvbXBvc2l0ZUNvbXBvbmVudFdpdGhU eXBlOmZ1bmN0aW9uKGluc3QsdHlwZSl7aWYoIVJlYWN0VGVzdFV0aWxzLmlzQ29tcG9zaXRlQ29t cG9uZW50KGluc3QpKXtyZXR1cm4gZmFsc2V9dmFyIGludGVybmFsSW5zdGFuY2U9UmVhY3RJbnN0 YW5jZU1hcC5nZXQoaW5zdCk7dmFyIGNvbnN0cnVjdG9yPWludGVybmFsSW5zdGFuY2UuX2N1cnJl bnRFbGVtZW50LnR5cGU7cmV0dXJuIGNvbnN0cnVjdG9yPT09dHlwZX0saXNDb21wb3NpdGVDb21w b25lbnRFbGVtZW50OmZ1bmN0aW9uKGluc3Qpe2lmKCFSZWFjdC5pc1ZhbGlkRWxlbWVudChpbnN0 KSl7cmV0dXJuIGZhbHNlfXZhciBwcm90b3R5cGU9aW5zdC50eXBlLnByb3RvdHlwZTtyZXR1cm4g dHlwZW9mIHByb3RvdHlwZS5yZW5kZXI9PT0iZnVuY3Rpb24iJiZ0eXBlb2YgcHJvdG90eXBlLnNl dFN0YXRlPT09ImZ1bmN0aW9uIn0saXNDb21wb3NpdGVDb21wb25lbnRFbGVtZW50V2l0aFR5cGU6 ZnVuY3Rpb24oaW5zdCx0eXBlKXt2YXIgaW50ZXJuYWxJbnN0YW5jZT1SZWFjdEluc3RhbmNlTWFw LmdldChpbnN0KTt2YXIgY29uc3RydWN0b3I9aW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1l bnQudHlwZTtyZXR1cm4hIShSZWFjdFRlc3RVdGlscy5pc0NvbXBvc2l0ZUNvbXBvbmVudEVsZW1l bnQoaW5zdCkmJmNvbnN0cnVjdG9yPT09dHlwZSl9LGdldFJlbmRlcmVkQ2hpbGRPZkNvbXBvc2l0 ZUNvbXBvbmVudDpmdW5jdGlvbihpbnN0KXtpZighUmVhY3RUZXN0VXRpbHMuaXNDb21wb3NpdGVD b21wb25lbnQoaW5zdCkpe3JldHVybiBudWxsfXZhciBpbnRlcm5hbEluc3RhbmNlPVJlYWN0SW5z dGFuY2VNYXAuZ2V0KGluc3QpO3JldHVybiBpbnRlcm5hbEluc3RhbmNlLl9yZW5kZXJlZENvbXBv bmVudC5nZXRQdWJsaWNJbnN0YW5jZSgpfSxmaW5kQWxsSW5SZW5kZXJlZFRyZWU6ZnVuY3Rpb24o aW5zdCx0ZXN0KXtpZighaW5zdCl7cmV0dXJuW119IVJlYWN0VGVzdFV0aWxzLmlzQ29tcG9zaXRl Q29tcG9uZW50KGluc3QpPyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/aW52YXJpYW50KGZh bHNlLCJmaW5kQWxsSW5SZW5kZXJlZFRyZWUoLi4uKTogaW5zdGFuY2UgbXVzdCBiZSBhIGNvbXBv c2l0ZSBjb21wb25lbnQiKTpfcHJvZEludmFyaWFudCgiMTAiKTp2b2lkIDA7cmV0dXJuIGZpbmRB bGxJblJlbmRlcmVkVHJlZUludGVybmFsKFJlYWN0SW5zdGFuY2VNYXAuZ2V0KGluc3QpLHRlc3Qp fSxzY3J5UmVuZGVyZWRET01Db21wb25lbnRzV2l0aENsYXNzOmZ1bmN0aW9uKHJvb3QsY2xhc3NO YW1lcyl7cmV0dXJuIFJlYWN0VGVzdFV0aWxzLmZpbmRBbGxJblJlbmRlcmVkVHJlZShyb290LGZ1 bmN0aW9uKGluc3Qpe2lmKFJlYWN0VGVzdFV0aWxzLmlzRE9NQ29tcG9uZW50KGluc3QpKXt2YXIg Y2xhc3NOYW1lPWluc3QuY2xhc3NOYW1lO2lmKHR5cGVvZiBjbGFzc05hbWUhPT0ic3RyaW5nIil7 Y2xhc3NOYW1lPWluc3QuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn12YXIgY2xhc3NMaXN0PWNs YXNzTmFtZS5zcGxpdCgvXHMrLyk7aWYoIUFycmF5LmlzQXJyYXkoY2xhc3NOYW1lcykpeyEoY2xh c3NOYW1lcyE9PXVuZGVmaW5lZCk/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlh bnQoZmFsc2UsIlRlc3RVdGlscy5zY3J5UmVuZGVyZWRET01Db21wb25lbnRzV2l0aENsYXNzIGV4 cGVjdHMgYSBjbGFzc05hbWUgYXMgYSBzZWNvbmQgYXJndW1lbnQuIik6X3Byb2RJbnZhcmlhbnQo IjExIik6dm9pZCAwO2NsYXNzTmFtZXM9Y2xhc3NOYW1lcy5zcGxpdCgvXHMrLyl9cmV0dXJuIGNs YXNzTmFtZXMuZXZlcnkoZnVuY3Rpb24obmFtZSl7cmV0dXJuIGNsYXNzTGlzdC5pbmRleE9mKG5h bWUpIT09LTF9KX1yZXR1cm4gZmFsc2V9KX0sZmluZFJlbmRlcmVkRE9NQ29tcG9uZW50V2l0aENs YXNzOmZ1bmN0aW9uKHJvb3QsY2xhc3NOYW1lKXt2YXIgYWxsPVJlYWN0VGVzdFV0aWxzLnNjcnlS ZW5kZXJlZERPTUNvbXBvbmVudHNXaXRoQ2xhc3Mocm9vdCxjbGFzc05hbWUpO2lmKGFsbC5sZW5n dGghPT0xKXt0aHJvdyBuZXcgRXJyb3IoIkRpZCBub3QgZmluZCBleGFjdGx5IG9uZSBtYXRjaCAo Zm91bmQ6ICIrYWxsLmxlbmd0aCsiKSAiKyJmb3IgY2xhc3M6IitjbGFzc05hbWUpfXJldHVybiBh bGxbMF19LHNjcnlSZW5kZXJlZERPTUNvbXBvbmVudHNXaXRoVGFnOmZ1bmN0aW9uKHJvb3QsdGFn TmFtZSl7cmV0dXJuIFJlYWN0VGVzdFV0aWxzLmZpbmRBbGxJblJlbmRlcmVkVHJlZShyb290LGZ1 bmN0aW9uKGluc3Qpe3JldHVybiBSZWFjdFRlc3RVdGlscy5pc0RPTUNvbXBvbmVudChpbnN0KSYm aW5zdC50YWdOYW1lLnRvVXBwZXJDYXNlKCk9PT10YWdOYW1lLnRvVXBwZXJDYXNlKCl9KX0sZmlu ZFJlbmRlcmVkRE9NQ29tcG9uZW50V2l0aFRhZzpmdW5jdGlvbihyb290LHRhZ05hbWUpe3ZhciBh bGw9UmVhY3RUZXN0VXRpbHMuc2NyeVJlbmRlcmVkRE9NQ29tcG9uZW50c1dpdGhUYWcocm9vdCx0 YWdOYW1lKTtpZihhbGwubGVuZ3RoIT09MSl7dGhyb3cgbmV3IEVycm9yKCJEaWQgbm90IGZpbmQg ZXhhY3RseSBvbmUgbWF0Y2ggKGZvdW5kOiAiK2FsbC5sZW5ndGgrIikgIisiZm9yIHRhZzoiK3Rh Z05hbWUpfXJldHVybiBhbGxbMF19LHNjcnlSZW5kZXJlZENvbXBvbmVudHNXaXRoVHlwZTpmdW5j dGlvbihyb290LGNvbXBvbmVudFR5cGUpe3JldHVybiBSZWFjdFRlc3RVdGlscy5maW5kQWxsSW5S ZW5kZXJlZFRyZWUocm9vdCxmdW5jdGlvbihpbnN0KXtyZXR1cm4gUmVhY3RUZXN0VXRpbHMuaXND b21wb3NpdGVDb21wb25lbnRXaXRoVHlwZShpbnN0LGNvbXBvbmVudFR5cGUpfSl9LGZpbmRSZW5k ZXJlZENvbXBvbmVudFdpdGhUeXBlOmZ1bmN0aW9uKHJvb3QsY29tcG9uZW50VHlwZSl7dmFyIGFs bD1SZWFjdFRlc3RVdGlscy5zY3J5UmVuZGVyZWRDb21wb25lbnRzV2l0aFR5cGUocm9vdCxjb21w b25lbnRUeXBlKTtpZihhbGwubGVuZ3RoIT09MSl7dGhyb3cgbmV3IEVycm9yKCJEaWQgbm90IGZp bmQgZXhhY3RseSBvbmUgbWF0Y2ggKGZvdW5kOiAiK2FsbC5sZW5ndGgrIikgIisiZm9yIGNvbXBv bmVudFR5cGU6Iitjb21wb25lbnRUeXBlKX1yZXR1cm4gYWxsWzBdfSxtb2NrQ29tcG9uZW50OmZ1 bmN0aW9uKG1vZHVsZSxtb2NrVGFnTmFtZSl7bW9ja1RhZ05hbWU9bW9ja1RhZ05hbWV8fG1vZHVs ZS5tb2NrVGFnTmFtZXx8ImRpdiI7bW9kdWxlLnByb3RvdHlwZS5yZW5kZXIubW9ja0ltcGxlbWVu dGF0aW9uKGZ1bmN0aW9uKCl7cmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQobW9ja1RhZ05hbWUs bnVsbCx0aGlzLnByb3BzLmNoaWxkcmVuKX0pO3JldHVybiB0aGlzfSxzaW11bGF0ZU5hdGl2ZUV2 ZW50T25Ob2RlOmZ1bmN0aW9uKHRvcExldmVsVHlwZSxub2RlLGZha2VOYXRpdmVFdmVudCl7ZmFr ZU5hdGl2ZUV2ZW50LnRhcmdldD1ub2RlO1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2 ZW50TGlzdGVuZXIuZGlzcGF0Y2hFdmVudCh0b3BMZXZlbFR5cGUsZmFrZU5hdGl2ZUV2ZW50KX0s c2ltdWxhdGVOYXRpdmVFdmVudE9uRE9NQ29tcG9uZW50OmZ1bmN0aW9uKHRvcExldmVsVHlwZSxj b21wLGZha2VOYXRpdmVFdmVudCl7UmVhY3RUZXN0VXRpbHMuc2ltdWxhdGVOYXRpdmVFdmVudE9u Tm9kZSh0b3BMZXZlbFR5cGUsZmluZERPTU5vZGUoY29tcCksZmFrZU5hdGl2ZUV2ZW50KX0sbmF0 aXZlVG91Y2hEYXRhOmZ1bmN0aW9uKHgseSl7cmV0dXJue3RvdWNoZXM6W3twYWdlWDp4LHBhZ2VZ Onl9XX19LGNyZWF0ZVJlbmRlcmVyOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBSZWFjdFNoYWxsb3dS ZW5kZXJlcn0sU2ltdWxhdGU6bnVsbCxTaW11bGF0ZU5hdGl2ZTp7fX07ZnVuY3Rpb24gbWFrZVNp bXVsYXRvcihldmVudFR5cGUpe3JldHVybiBmdW5jdGlvbihkb21Db21wb25lbnRPck5vZGUsZXZl bnREYXRhKXt2YXIgbm9kZTshIVJlYWN0LmlzVmFsaWRFbGVtZW50KGRvbUNvbXBvbmVudE9yTm9k ZSk/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsIlRlc3RVdGls cy5TaW11bGF0ZSBleHBlY3RzIGEgY29tcG9uZW50IGluc3RhbmNlIGFuZCBub3QgYSBSZWFjdEVs ZW1lbnQuVGVzdFV0aWxzLlNpbXVsYXRlIHdpbGwgbm90IHdvcmsgaWYgeW91IGFyZSB1c2luZyBz aGFsbG93IHJlbmRlcmluZy4iKTpfcHJvZEludmFyaWFudCgiMTQiKTp2b2lkIDA7aWYoUmVhY3RU ZXN0VXRpbHMuaXNET01Db21wb25lbnQoZG9tQ29tcG9uZW50T3JOb2RlKSl7bm9kZT1maW5kRE9N Tm9kZShkb21Db21wb25lbnRPck5vZGUpfWVsc2UgaWYoZG9tQ29tcG9uZW50T3JOb2RlLnRhZ05h bWUpe25vZGU9ZG9tQ29tcG9uZW50T3JOb2RlfXZhciBkaXNwYXRjaENvbmZpZz1FdmVudFBsdWdp blJlZ2lzdHJ5LmV2ZW50TmFtZURpc3BhdGNoQ29uZmlnc1tldmVudFR5cGVdO3ZhciBmYWtlTmF0 aXZlRXZlbnQ9bmV3IEV2ZW50O2Zha2VOYXRpdmVFdmVudC50YXJnZXQ9bm9kZTtmYWtlTmF0aXZl RXZlbnQudHlwZT1ldmVudFR5cGUudG9Mb3dlckNhc2UoKTt2YXIgZXZlbnQ9bmV3IFN5bnRoZXRp Y0V2ZW50KGRpc3BhdGNoQ29uZmlnLFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZy b21Ob2RlKG5vZGUpLGZha2VOYXRpdmVFdmVudCxub2RlKTtldmVudC5wZXJzaXN0KCk7X2Fzc2ln bihldmVudCxldmVudERhdGEpO2lmKGRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJhdGlvbk5h bWVzKXtFdmVudFByb3BhZ2F0b3JzLmFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMoZXZlbnQp fWVsc2V7RXZlbnRQcm9wYWdhdG9ycy5hY2N1bXVsYXRlRGlyZWN0RGlzcGF0Y2hlcyhldmVudCl9 UmVhY3RVcGRhdGVzLmJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uKCl7RXZlbnRQbHVnaW5IdWIuZW5x dWV1ZUV2ZW50cyhldmVudCk7RXZlbnRQbHVnaW5IdWIucHJvY2Vzc0V2ZW50UXVldWUodHJ1ZSl9 KX19ZnVuY3Rpb24gYnVpbGRTaW11bGF0b3JzKCl7UmVhY3RUZXN0VXRpbHMuU2ltdWxhdGU9e307 dmFyIGV2ZW50VHlwZTtmb3IoZXZlbnRUeXBlIGluIEV2ZW50UGx1Z2luUmVnaXN0cnkuZXZlbnRO YW1lRGlzcGF0Y2hDb25maWdzKXtSZWFjdFRlc3RVdGlscy5TaW11bGF0ZVtldmVudFR5cGVdPW1h a2VTaW11bGF0b3IoZXZlbnRUeXBlKX19dmFyIG9sZEluamVjdEV2ZW50UGx1Z2luT3JkZXI9RXZl bnRQbHVnaW5IdWIuaW5qZWN0aW9uLmluamVjdEV2ZW50UGx1Z2luT3JkZXI7RXZlbnRQbHVnaW5I dWIuaW5qZWN0aW9uLmluamVjdEV2ZW50UGx1Z2luT3JkZXI9ZnVuY3Rpb24oKXtvbGRJbmplY3RF dmVudFBsdWdpbk9yZGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtidWlsZFNpbXVsYXRvcnMoKX07 dmFyIG9sZEluamVjdEV2ZW50UGx1Z2lucz1FdmVudFBsdWdpbkh1Yi5pbmplY3Rpb24uaW5qZWN0 RXZlbnRQbHVnaW5zQnlOYW1lO0V2ZW50UGx1Z2luSHViLmluamVjdGlvbi5pbmplY3RFdmVudFBs dWdpbnNCeU5hbWU9ZnVuY3Rpb24oKXtvbGRJbmplY3RFdmVudFBsdWdpbnMuYXBwbHkodGhpcyxh cmd1bWVudHMpO2J1aWxkU2ltdWxhdG9ycygpfTtidWlsZFNpbXVsYXRvcnMoKTtmdW5jdGlvbiBt YWtlTmF0aXZlU2ltdWxhdG9yKGV2ZW50VHlwZSl7cmV0dXJuIGZ1bmN0aW9uKGRvbUNvbXBvbmVu dE9yTm9kZSxuYXRpdmVFdmVudERhdGEpe3ZhciBmYWtlTmF0aXZlRXZlbnQ9bmV3IEV2ZW50KGV2 ZW50VHlwZSk7X2Fzc2lnbihmYWtlTmF0aXZlRXZlbnQsbmF0aXZlRXZlbnREYXRhKTtpZihSZWFj dFRlc3RVdGlscy5pc0RPTUNvbXBvbmVudChkb21Db21wb25lbnRPck5vZGUpKXtSZWFjdFRlc3RV dGlscy5zaW11bGF0ZU5hdGl2ZUV2ZW50T25ET01Db21wb25lbnQoZXZlbnRUeXBlLGRvbUNvbXBv bmVudE9yTm9kZSxmYWtlTmF0aXZlRXZlbnQpfWVsc2UgaWYoZG9tQ29tcG9uZW50T3JOb2RlLnRh Z05hbWUpe1JlYWN0VGVzdFV0aWxzLnNpbXVsYXRlTmF0aXZlRXZlbnRPbk5vZGUoZXZlbnRUeXBl LGRvbUNvbXBvbmVudE9yTm9kZSxmYWtlTmF0aXZlRXZlbnQpfX19T2JqZWN0LmtleXModG9wTGV2 ZWxUeXBlcykuZm9yRWFjaChmdW5jdGlvbihldmVudFR5cGUpe3ZhciBjb252ZW5pZW5jZU5hbWU9 ZXZlbnRUeXBlLmluZGV4T2YoInRvcCIpPT09MD9ldmVudFR5cGUuY2hhckF0KDMpLnRvTG93ZXJD YXNlKCkrZXZlbnRUeXBlLnN1YnN0cig0KTpldmVudFR5cGU7UmVhY3RUZXN0VXRpbHMuU2ltdWxh dGVOYXRpdmVbY29udmVuaWVuY2VOYW1lXT1tYWtlTmF0aXZlU2ltdWxhdG9yKGV2ZW50VHlwZSl9 KTttb2R1bGUuZXhwb3J0cz1SZWFjdFRlc3RVdGlsc30sezEwODoxMDgsMTI1OjEyNSwxMzQ6MTM0 LDE1MDoxNTAsMTU4OjE1OCwxNjoxNiwxNzoxNywxODoxOCwyMDoyMCwyNjoyNiwzMTozMSwzNDoz NCw2Mzo2Myw3OTo3OSw4Mjo4Miw5MTo5MX1dLDgxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxl eHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIF9wcm9kSW52YXJpYW50PV9kZXJlcV8oMTI1KTt2YXIg UmVhY3RDdXJyZW50T3duZXI9X2RlcmVxXygxMzMpO3ZhciBSZWFjdEluc3RhbmNlTWFwPV9kZXJl cV8oNjMpO3ZhciBSZWFjdEluc3RydW1lbnRhdGlvbj1fZGVyZXFfKDY0KTt2YXIgUmVhY3RVcGRh dGVzPV9kZXJlcV8oODIpO3ZhciBpbnZhcmlhbnQ9X2RlcmVxXygxNTApO3ZhciB3YXJuaW5nPV9k ZXJlcV8oMTU3KTtmdW5jdGlvbiBlbnF1ZXVlVXBkYXRlKGludGVybmFsSW5zdGFuY2Upe1JlYWN0 VXBkYXRlcy5lbnF1ZXVlVXBkYXRlKGludGVybmFsSW5zdGFuY2UpfWZ1bmN0aW9uIGZvcm1hdFVu ZXhwZWN0ZWRBcmd1bWVudChhcmcpe3ZhciB0eXBlPXR5cGVvZiBhcmc7aWYodHlwZSE9PSJvYmpl Y3QiKXtyZXR1cm4gdHlwZX12YXIgZGlzcGxheU5hbWU9YXJnLmNvbnN0cnVjdG9yJiZhcmcuY29u c3RydWN0b3IubmFtZXx8dHlwZTt2YXIga2V5cz1PYmplY3Qua2V5cyhhcmcpO2lmKGtleXMubGVu Z3RoPjAmJmtleXMubGVuZ3RoPDIwKXtyZXR1cm4gZGlzcGxheU5hbWUrIiAoa2V5czogIitrZXlz LmpvaW4oIiwgIikrIikifXJldHVybiBkaXNwbGF5TmFtZX1mdW5jdGlvbiBnZXRJbnRlcm5hbElu c3RhbmNlUmVhZHlGb3JVcGRhdGUocHVibGljSW5zdGFuY2UsY2FsbGVyTmFtZSl7dmFyIGludGVy bmFsSW5zdGFuY2U9UmVhY3RJbnN0YW5jZU1hcC5nZXQocHVibGljSW5zdGFuY2UpO2lmKCFpbnRl cm5hbEluc3RhbmNlKXtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXt2YXIgY3Rvcj1w dWJsaWNJbnN0YW5jZS5jb25zdHJ1Y3RvcjsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP3dh cm5pbmcoIWNhbGxlck5hbWUsIiVzKC4uLik6IENhbiBvbmx5IHVwZGF0ZSBhIG1vdW50ZWQgb3Ig bW91bnRpbmcgY29tcG9uZW50LiAiKyJUaGlzIHVzdWFsbHkgbWVhbnMgeW91IGNhbGxlZCAlcygp IG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuICIrIlRoaXMgaXMgYSBuby1vcC4gUGxlYXNlIGNo ZWNrIHRoZSBjb2RlIGZvciB0aGUgJXMgY29tcG9uZW50LiIsY2FsbGVyTmFtZSxjYWxsZXJOYW1l LGN0b3ImJihjdG9yLmRpc3BsYXlOYW1lfHxjdG9yLm5hbWUpfHwiUmVhY3RDbGFzcyIpOnZvaWQg MH1yZXR1cm4gbnVsbH1pZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXsiZGV2ZWxvcG1l bnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmcoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudD09bnVs bCwiJXMoLi4uKTogQ2Fubm90IHVwZGF0ZSBkdXJpbmcgYW4gZXhpc3Rpbmcgc3RhdGUgdHJhbnNp dGlvbiAoc3VjaCBhcyAiKyJ3aXRoaW4gYHJlbmRlcmAgb3IgYW5vdGhlciBjb21wb25lbnQncyBj b25zdHJ1Y3RvcikuIFJlbmRlciBtZXRob2RzICIrInNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24g b2YgcHJvcHMgYW5kIHN0YXRlOyBjb25zdHJ1Y3RvciAiKyJzaWRlLWVmZmVjdHMgYXJlIGFuIGFu dGktcGF0dGVybiwgYnV0IGNhbiBiZSBtb3ZlZCB0byAiKyJgY29tcG9uZW50V2lsbE1vdW50YC4i LGNhbGxlck5hbWUpOnZvaWQgMH1yZXR1cm4gaW50ZXJuYWxJbnN0YW5jZX12YXIgUmVhY3RVcGRh dGVRdWV1ZT17aXNNb3VudGVkOmZ1bmN0aW9uKHB1YmxpY0luc3RhbmNlKXtpZigiZGV2ZWxvcG1l bnQiIT09InByb2R1Y3Rpb24iKXt2YXIgb3duZXI9UmVhY3RDdXJyZW50T3duZXIuY3VycmVudDtp Zihvd25lciE9PW51bGwpeyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyhvd25l ci5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIsIiVzIGlzIGFjY2Vzc2luZyBpc01vdW50ZWQgaW5z aWRlIGl0cyByZW5kZXIoKSBmdW5jdGlvbi4gIisicmVuZGVyKCkgc2hvdWxkIGJlIGEgcHVyZSBm dW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGUuIEl0IHNob3VsZCAiKyJuZXZlciBhY2Nlc3Mgc29t ZXRoaW5nIHRoYXQgcmVxdWlyZXMgc3RhbGUgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyAiKyJyZW5k ZXIsIHN1Y2ggYXMgcmVmcy4gTW92ZSB0aGlzIGxvZ2ljIHRvIGNvbXBvbmVudERpZE1vdW50IGFu ZCAiKyJjb21wb25lbnREaWRVcGRhdGUgaW5zdGVhZC4iLG93bmVyLmdldE5hbWUoKXx8IkEgY29t cG9uZW50Iik6dm9pZCAwO293bmVyLl93YXJuZWRBYm91dFJlZnNJblJlbmRlcj10cnVlfX12YXIg aW50ZXJuYWxJbnN0YW5jZT1SZWFjdEluc3RhbmNlTWFwLmdldChwdWJsaWNJbnN0YW5jZSk7aWYo aW50ZXJuYWxJbnN0YW5jZSl7cmV0dXJuISFpbnRlcm5hbEluc3RhbmNlLl9yZW5kZXJlZENvbXBv bmVudH1lbHNle3JldHVybiBmYWxzZX19LGVucXVldWVDYWxsYmFjazpmdW5jdGlvbihwdWJsaWNJ bnN0YW5jZSxjYWxsYmFjayxjYWxsZXJOYW1lKXtSZWFjdFVwZGF0ZVF1ZXVlLnZhbGlkYXRlQ2Fs bGJhY2soY2FsbGJhY2ssY2FsbGVyTmFtZSk7dmFyIGludGVybmFsSW5zdGFuY2U9Z2V0SW50ZXJu YWxJbnN0YW5jZVJlYWR5Rm9yVXBkYXRlKHB1YmxpY0luc3RhbmNlKTtpZighaW50ZXJuYWxJbnN0 YW5jZSl7cmV0dXJuIG51bGx9aWYoaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ0NhbGxiYWNrcyl7 aW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ0NhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKX1lbHNle2lu dGVybmFsSW5zdGFuY2UuX3BlbmRpbmdDYWxsYmFja3M9W2NhbGxiYWNrXX1lbnF1ZXVlVXBkYXRl KGludGVybmFsSW5zdGFuY2UpfSxlbnF1ZXVlQ2FsbGJhY2tJbnRlcm5hbDpmdW5jdGlvbihpbnRl cm5hbEluc3RhbmNlLGNhbGxiYWNrKXtpZihpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nQ2FsbGJh Y2tzKXtpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spfWVs c2V7aW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ0NhbGxiYWNrcz1bY2FsbGJhY2tdfWVucXVldWVV cGRhdGUoaW50ZXJuYWxJbnN0YW5jZSl9LGVucXVldWVGb3JjZVVwZGF0ZTpmdW5jdGlvbihwdWJs aWNJbnN0YW5jZSl7dmFyIGludGVybmFsSW5zdGFuY2U9Z2V0SW50ZXJuYWxJbnN0YW5jZVJlYWR5 Rm9yVXBkYXRlKHB1YmxpY0luc3RhbmNlLCJmb3JjZVVwZGF0ZSIpO2lmKCFpbnRlcm5hbEluc3Rh bmNlKXtyZXR1cm59aW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ0ZvcmNlVXBkYXRlPXRydWU7ZW5x dWV1ZVVwZGF0ZShpbnRlcm5hbEluc3RhbmNlKX0sZW5xdWV1ZVJlcGxhY2VTdGF0ZTpmdW5jdGlv bihwdWJsaWNJbnN0YW5jZSxjb21wbGV0ZVN0YXRlKXt2YXIgaW50ZXJuYWxJbnN0YW5jZT1nZXRJ bnRlcm5hbEluc3RhbmNlUmVhZHlGb3JVcGRhdGUocHVibGljSW5zdGFuY2UsInJlcGxhY2VTdGF0 ZSIpO2lmKCFpbnRlcm5hbEluc3RhbmNlKXtyZXR1cm59aW50ZXJuYWxJbnN0YW5jZS5fcGVuZGlu Z1N0YXRlUXVldWU9W2NvbXBsZXRlU3RhdGVdO2ludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdSZXBs YWNlU3RhdGU9dHJ1ZTtlbnF1ZXVlVXBkYXRlKGludGVybmFsSW5zdGFuY2UpfSxlbnF1ZXVlU2V0 U3RhdGU6ZnVuY3Rpb24ocHVibGljSW5zdGFuY2UscGFydGlhbFN0YXRlKXtpZigiZGV2ZWxvcG1l bnQiIT09InByb2R1Y3Rpb24iKXtSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25TZXRT dGF0ZSgpOyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyhwYXJ0aWFsU3RhdGUh PW51bGwsInNldFN0YXRlKC4uLik6IFlvdSBwYXNzZWQgYW4gdW5kZWZpbmVkIG9yIG51bGwgc3Rh dGUgb2JqZWN0OyAiKyJpbnN0ZWFkLCB1c2UgZm9yY2VVcGRhdGUoKS4iKTp2b2lkIDB9dmFyIGlu dGVybmFsSW5zdGFuY2U9Z2V0SW50ZXJuYWxJbnN0YW5jZVJlYWR5Rm9yVXBkYXRlKHB1YmxpY0lu c3RhbmNlLCJzZXRTdGF0ZSIpO2lmKCFpbnRlcm5hbEluc3RhbmNlKXtyZXR1cm59dmFyIHF1ZXVl PWludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdTdGF0ZVF1ZXVlfHwoaW50ZXJuYWxJbnN0YW5jZS5f cGVuZGluZ1N0YXRlUXVldWU9W10pO3F1ZXVlLnB1c2gocGFydGlhbFN0YXRlKTtlbnF1ZXVlVXBk YXRlKGludGVybmFsSW5zdGFuY2UpfSxlbnF1ZXVlRWxlbWVudEludGVybmFsOmZ1bmN0aW9uKGlu dGVybmFsSW5zdGFuY2UsbmV4dEVsZW1lbnQsbmV4dENvbnRleHQpe2ludGVybmFsSW5zdGFuY2Uu X3BlbmRpbmdFbGVtZW50PW5leHRFbGVtZW50O2ludGVybmFsSW5zdGFuY2UuX2NvbnRleHQ9bmV4 dENvbnRleHQ7ZW5xdWV1ZVVwZGF0ZShpbnRlcm5hbEluc3RhbmNlKX0sdmFsaWRhdGVDYWxsYmFj azpmdW5jdGlvbihjYWxsYmFjayxjYWxsZXJOYW1lKXshKCFjYWxsYmFja3x8dHlwZW9mIGNhbGxi YWNrPT09ImZ1bmN0aW9uIik/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQo ZmFsc2UsIiVzKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJn dW1lbnQgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogJXMuIixjYWxsZXJOYW1l LGZvcm1hdFVuZXhwZWN0ZWRBcmd1bWVudChjYWxsYmFjaykpOl9wcm9kSW52YXJpYW50KCIxMjIi LGNhbGxlck5hbWUsZm9ybWF0VW5leHBlY3RlZEFyZ3VtZW50KGNhbGxiYWNrKSk6dm9pZCAwfX07 bW9kdWxlLmV4cG9ydHM9UmVhY3RVcGRhdGVRdWV1ZX0sezEyNToxMjUsMTMzOjEzMywxNTA6MTUw LDE1NzoxNTcsNjM6NjMsNjQ6NjQsODI6ODJ9XSw4MjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUs ZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBfcHJvZEludmFyaWFudD1fZGVyZXFfKDEyNSksX2Fz c2lnbj1fZGVyZXFfKDE1OCk7dmFyIENhbGxiYWNrUXVldWU9X2RlcmVxXyg2KTt2YXIgUG9vbGVk Q2xhc3M9X2RlcmVxXygyNSk7dmFyIFJlYWN0RmVhdHVyZUZsYWdzPV9kZXJlcV8oNTgpO3ZhciBS ZWFjdFJlY29uY2lsZXI9X2RlcmVxXyg3NSk7dmFyIFRyYW5zYWN0aW9uPV9kZXJlcV8oMTAwKTt2 YXIgaW52YXJpYW50PV9kZXJlcV8oMTUwKTt2YXIgZGlydHlDb21wb25lbnRzPVtdO3ZhciB1cGRh dGVCYXRjaE51bWJlcj0wO3ZhciBhc2FwQ2FsbGJhY2tRdWV1ZT1DYWxsYmFja1F1ZXVlLmdldFBv b2xlZCgpO3ZhciBhc2FwRW5xdWV1ZWQ9ZmFsc2U7dmFyIGJhdGNoaW5nU3RyYXRlZ3k9bnVsbDtm dW5jdGlvbiBlbnN1cmVJbmplY3RlZCgpeyEoUmVhY3RVcGRhdGVzLlJlYWN0UmVjb25jaWxlVHJh bnNhY3Rpb24mJmJhdGNoaW5nU3RyYXRlZ3kpPyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/ aW52YXJpYW50KGZhbHNlLCJSZWFjdFVwZGF0ZXM6IG11c3QgaW5qZWN0IGEgcmVjb25jaWxlIHRy YW5zYWN0aW9uIGNsYXNzIGFuZCBiYXRjaGluZyBzdHJhdGVneSIpOl9wcm9kSW52YXJpYW50KCIx MjMiKTp2b2lkIDB9dmFyIE5FU1RFRF9VUERBVEVTPXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7dGhp cy5kaXJ0eUNvbXBvbmVudHNMZW5ndGg9ZGlydHlDb21wb25lbnRzLmxlbmd0aH0sY2xvc2U6ZnVu Y3Rpb24oKXtpZih0aGlzLmRpcnR5Q29tcG9uZW50c0xlbmd0aCE9PWRpcnR5Q29tcG9uZW50cy5s ZW5ndGgpe2RpcnR5Q29tcG9uZW50cy5zcGxpY2UoMCx0aGlzLmRpcnR5Q29tcG9uZW50c0xlbmd0 aCk7Zmx1c2hCYXRjaGVkVXBkYXRlcygpfWVsc2V7ZGlydHlDb21wb25lbnRzLmxlbmd0aD0wfX19 O3ZhciBVUERBVEVfUVVFVUVJTkc9e2luaXRpYWxpemU6ZnVuY3Rpb24oKXt0aGlzLmNhbGxiYWNr UXVldWUucmVzZXQoKX0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLmNhbGxiYWNrUXVldWUubm90aWZ5 QWxsKCl9fTt2YXIgVFJBTlNBQ1RJT05fV1JBUFBFUlM9W05FU1RFRF9VUERBVEVTLFVQREFURV9R VUVVRUlOR107ZnVuY3Rpb24gUmVhY3RVcGRhdGVzRmx1c2hUcmFuc2FjdGlvbigpe3RoaXMucmVp bml0aWFsaXplVHJhbnNhY3Rpb24oKTt0aGlzLmRpcnR5Q29tcG9uZW50c0xlbmd0aD1udWxsO3Ro aXMuY2FsbGJhY2tRdWV1ZT1DYWxsYmFja1F1ZXVlLmdldFBvb2xlZCgpO3RoaXMucmVjb25jaWxl VHJhbnNhY3Rpb249UmVhY3RVcGRhdGVzLlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24uZ2V0UG9v bGVkKHRydWUpfV9hc3NpZ24oUmVhY3RVcGRhdGVzRmx1c2hUcmFuc2FjdGlvbi5wcm90b3R5cGUs VHJhbnNhY3Rpb24se2dldFRyYW5zYWN0aW9uV3JhcHBlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gVFJB TlNBQ1RJT05fV1JBUFBFUlN9LGRlc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLmRpcnR5Q29tcG9u ZW50c0xlbmd0aD1udWxsO0NhbGxiYWNrUXVldWUucmVsZWFzZSh0aGlzLmNhbGxiYWNrUXVldWUp O3RoaXMuY2FsbGJhY2tRdWV1ZT1udWxsO1JlYWN0VXBkYXRlcy5SZWFjdFJlY29uY2lsZVRyYW5z YWN0aW9uLnJlbGVhc2UodGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbik7dGhpcy5yZWNvbmNpbGVU cmFuc2FjdGlvbj1udWxsfSxwZXJmb3JtOmZ1bmN0aW9uKG1ldGhvZCxzY29wZSxhKXtyZXR1cm4g VHJhbnNhY3Rpb24ucGVyZm9ybS5jYWxsKHRoaXMsdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbi5w ZXJmb3JtLHRoaXMucmVjb25jaWxlVHJhbnNhY3Rpb24sbWV0aG9kLHNjb3BlLGEpfX0pO1Bvb2xl ZENsYXNzLmFkZFBvb2xpbmdUbyhSZWFjdFVwZGF0ZXNGbHVzaFRyYW5zYWN0aW9uKTtmdW5jdGlv biBiYXRjaGVkVXBkYXRlcyhjYWxsYmFjayxhLGIsYyxkLGUpe2Vuc3VyZUluamVjdGVkKCk7cmV0 dXJuIGJhdGNoaW5nU3RyYXRlZ3kuYmF0Y2hlZFVwZGF0ZXMoY2FsbGJhY2ssYSxiLGMsZCxlKX1m dW5jdGlvbiBtb3VudE9yZGVyQ29tcGFyYXRvcihjMSxjMil7cmV0dXJuIGMxLl9tb3VudE9yZGVy LWMyLl9tb3VudE9yZGVyfWZ1bmN0aW9uIHJ1bkJhdGNoZWRVcGRhdGVzKHRyYW5zYWN0aW9uKXt2 YXIgbGVuPXRyYW5zYWN0aW9uLmRpcnR5Q29tcG9uZW50c0xlbmd0aDshKGxlbj09PWRpcnR5Q29t cG9uZW50cy5sZW5ndGgpPyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/aW52YXJpYW50KGZh bHNlLCJFeHBlY3RlZCBmbHVzaCB0cmFuc2FjdGlvbidzIHN0b3JlZCBkaXJ0eS1jb21wb25lbnRz IGxlbmd0aCAoJXMpIHRvIG1hdGNoIGRpcnR5LWNvbXBvbmVudHMgYXJyYXkgbGVuZ3RoICglcyku IixsZW4sZGlydHlDb21wb25lbnRzLmxlbmd0aCk6X3Byb2RJbnZhcmlhbnQoIjEyNCIsbGVuLGRp cnR5Q29tcG9uZW50cy5sZW5ndGgpOnZvaWQgMDtkaXJ0eUNvbXBvbmVudHMuc29ydChtb3VudE9y ZGVyQ29tcGFyYXRvcik7dXBkYXRlQmF0Y2hOdW1iZXIrKztmb3IodmFyIGk9MDtpPGxlbjtpKysp e3ZhciBjb21wb25lbnQ9ZGlydHlDb21wb25lbnRzW2ldO3ZhciBjYWxsYmFja3M9Y29tcG9uZW50 Ll9wZW5kaW5nQ2FsbGJhY2tzO2NvbXBvbmVudC5fcGVuZGluZ0NhbGxiYWNrcz1udWxsO3ZhciBt YXJrZXJOYW1lO2lmKFJlYWN0RmVhdHVyZUZsYWdzLmxvZ1RvcExldmVsUmVuZGVycyl7dmFyIG5h bWVkQ29tcG9uZW50PWNvbXBvbmVudDtpZihjb21wb25lbnQuX2N1cnJlbnRFbGVtZW50LnR5cGUu aXNSZWFjdFRvcExldmVsV3JhcHBlcil7bmFtZWRDb21wb25lbnQ9Y29tcG9uZW50Ll9yZW5kZXJl ZENvbXBvbmVudH1tYXJrZXJOYW1lPSJSZWFjdCB1cGRhdGU6ICIrbmFtZWRDb21wb25lbnQuZ2V0 TmFtZSgpO2NvbnNvbGUudGltZShtYXJrZXJOYW1lKX1SZWFjdFJlY29uY2lsZXIucGVyZm9ybVVw ZGF0ZUlmTmVjZXNzYXJ5KGNvbXBvbmVudCx0cmFuc2FjdGlvbi5yZWNvbmNpbGVUcmFuc2FjdGlv bix1cGRhdGVCYXRjaE51bWJlcik7aWYobWFya2VyTmFtZSl7Y29uc29sZS50aW1lRW5kKG1hcmtl ck5hbWUpfWlmKGNhbGxiYWNrcyl7Zm9yKHZhciBqPTA7ajxjYWxsYmFja3MubGVuZ3RoO2orKyl7 dHJhbnNhY3Rpb24uY2FsbGJhY2tRdWV1ZS5lbnF1ZXVlKGNhbGxiYWNrc1tqXSxjb21wb25lbnQu Z2V0UHVibGljSW5zdGFuY2UoKSl9fX19dmFyIGZsdXNoQmF0Y2hlZFVwZGF0ZXM9ZnVuY3Rpb24o KXt3aGlsZShkaXJ0eUNvbXBvbmVudHMubGVuZ3RofHxhc2FwRW5xdWV1ZWQpe2lmKGRpcnR5Q29t cG9uZW50cy5sZW5ndGgpe3ZhciB0cmFuc2FjdGlvbj1SZWFjdFVwZGF0ZXNGbHVzaFRyYW5zYWN0 aW9uLmdldFBvb2xlZCgpO3RyYW5zYWN0aW9uLnBlcmZvcm0ocnVuQmF0Y2hlZFVwZGF0ZXMsbnVs bCx0cmFuc2FjdGlvbik7UmVhY3RVcGRhdGVzRmx1c2hUcmFuc2FjdGlvbi5yZWxlYXNlKHRyYW5z YWN0aW9uKX1pZihhc2FwRW5xdWV1ZWQpe2FzYXBFbnF1ZXVlZD1mYWxzZTt2YXIgcXVldWU9YXNh cENhbGxiYWNrUXVldWU7YXNhcENhbGxiYWNrUXVldWU9Q2FsbGJhY2tRdWV1ZS5nZXRQb29sZWQo KTtxdWV1ZS5ub3RpZnlBbGwoKTtDYWxsYmFja1F1ZXVlLnJlbGVhc2UocXVldWUpfX19O2Z1bmN0 aW9uIGVucXVldWVVcGRhdGUoY29tcG9uZW50KXtlbnN1cmVJbmplY3RlZCgpO2lmKCFiYXRjaGlu Z1N0cmF0ZWd5LmlzQmF0Y2hpbmdVcGRhdGVzKXtiYXRjaGluZ1N0cmF0ZWd5LmJhdGNoZWRVcGRh dGVzKGVucXVldWVVcGRhdGUsY29tcG9uZW50KTtyZXR1cm59ZGlydHlDb21wb25lbnRzLnB1c2go Y29tcG9uZW50KTtpZihjb21wb25lbnQuX3VwZGF0ZUJhdGNoTnVtYmVyPT1udWxsKXtjb21wb25l bnQuX3VwZGF0ZUJhdGNoTnVtYmVyPXVwZGF0ZUJhdGNoTnVtYmVyKzF9fWZ1bmN0aW9uIGFzYXAo Y2FsbGJhY2ssY29udGV4dCl7IWJhdGNoaW5nU3RyYXRlZ3kuaXNCYXRjaGluZ1VwZGF0ZXM/ImRl dmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsIlJlYWN0VXBkYXRlcy5h c2FwOiBDYW4ndCBlbnF1ZXVlIGFuIGFzYXAgY2FsbGJhY2sgaW4gYSBjb250ZXh0IHdoZXJldXBk YXRlcyBhcmUgbm90IGJlaW5nIGJhdGNoZWQuIik6X3Byb2RJbnZhcmlhbnQoIjEyNSIpOnZvaWQg MDthc2FwQ2FsbGJhY2tRdWV1ZS5lbnF1ZXVlKGNhbGxiYWNrLGNvbnRleHQpO2FzYXBFbnF1ZXVl ZD10cnVlfXZhciBSZWFjdFVwZGF0ZXNJbmplY3Rpb249e2luamVjdFJlY29uY2lsZVRyYW5zYWN0 aW9uOmZ1bmN0aW9uKFJlY29uY2lsZVRyYW5zYWN0aW9uKXshUmVjb25jaWxlVHJhbnNhY3Rpb24/ ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsIlJlYWN0VXBkYXRl czogbXVzdCBwcm92aWRlIGEgcmVjb25jaWxlIHRyYW5zYWN0aW9uIGNsYXNzIik6X3Byb2RJbnZh cmlhbnQoIjEyNiIpOnZvaWQgMDtSZWFjdFVwZGF0ZXMuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlv bj1SZWNvbmNpbGVUcmFuc2FjdGlvbn0saW5qZWN0QmF0Y2hpbmdTdHJhdGVneTpmdW5jdGlvbihf YmF0Y2hpbmdTdHJhdGVneSl7IV9iYXRjaGluZ1N0cmF0ZWd5PyJkZXZlbG9wbWVudCIhPT0icHJv ZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJSZWFjdFVwZGF0ZXM6IG11c3QgcHJvdmlkZSBhIGJh dGNoaW5nIHN0cmF0ZWd5Iik6X3Byb2RJbnZhcmlhbnQoIjEyNyIpOnZvaWQgMDshKHR5cGVvZiBf YmF0Y2hpbmdTdHJhdGVneS5iYXRjaGVkVXBkYXRlcz09PSJmdW5jdGlvbiIpPyJkZXZlbG9wbWVu dCIhPT0icHJvZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJSZWFjdFVwZGF0ZXM6IG11c3QgcHJv dmlkZSBhIGJhdGNoZWRVcGRhdGVzKCkgZnVuY3Rpb24iKTpfcHJvZEludmFyaWFudCgiMTI4Iik6 dm9pZCAwOyEodHlwZW9mIF9iYXRjaGluZ1N0cmF0ZWd5LmlzQmF0Y2hpbmdVcGRhdGVzPT09ImJv b2xlYW4iKT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiUmVh Y3RVcGRhdGVzOiBtdXN0IHByb3ZpZGUgYW4gaXNCYXRjaGluZ1VwZGF0ZXMgYm9vbGVhbiBhdHRy aWJ1dGUiKTpfcHJvZEludmFyaWFudCgiMTI5Iik6dm9pZCAwO2JhdGNoaW5nU3RyYXRlZ3k9X2Jh dGNoaW5nU3RyYXRlZ3l9fTt2YXIgUmVhY3RVcGRhdGVzPXtSZWFjdFJlY29uY2lsZVRyYW5zYWN0 aW9uOm51bGwsYmF0Y2hlZFVwZGF0ZXM6YmF0Y2hlZFVwZGF0ZXMsZW5xdWV1ZVVwZGF0ZTplbnF1 ZXVlVXBkYXRlLGZsdXNoQmF0Y2hlZFVwZGF0ZXM6Zmx1c2hCYXRjaGVkVXBkYXRlcyxpbmplY3Rp b246UmVhY3RVcGRhdGVzSW5qZWN0aW9uLGFzYXA6YXNhcH07bW9kdWxlLmV4cG9ydHM9UmVhY3RV cGRhdGVzfSx7MTAwOjEwMCwxMjU6MTI1LDE1MDoxNTAsMTU4OjE1OCwyNToyNSw1ODo1OCw2OjYs NzU6NzV9XSw4MzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3Qi O21vZHVsZS5leHBvcnRzPSIxNS40LjIifSx7fV0sODQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxl LGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgTlM9e3hsaW5rOiJodHRwOi8vd3d3LnczLm9yZy8x OTk5L3hsaW5rIix4bWw6Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSJ9O3Zh ciBBVFRSUz17YWNjZW50SGVpZ2h0OiJhY2NlbnQtaGVpZ2h0IixhY2N1bXVsYXRlOjAsYWRkaXRp dmU6MCxhbGlnbm1lbnRCYXNlbGluZToiYWxpZ25tZW50LWJhc2VsaW5lIixhbGxvd1Jlb3JkZXI6 ImFsbG93UmVvcmRlciIsYWxwaGFiZXRpYzowLGFtcGxpdHVkZTowLGFyYWJpY0Zvcm06ImFyYWJp Yy1mb3JtIixhc2NlbnQ6MCxhdHRyaWJ1dGVOYW1lOiJhdHRyaWJ1dGVOYW1lIixhdHRyaWJ1dGVU eXBlOiJhdHRyaWJ1dGVUeXBlIixhdXRvUmV2ZXJzZToiYXV0b1JldmVyc2UiLGF6aW11dGg6MCxi YXNlRnJlcXVlbmN5OiJiYXNlRnJlcXVlbmN5IixiYXNlUHJvZmlsZToiYmFzZVByb2ZpbGUiLGJh c2VsaW5lU2hpZnQ6ImJhc2VsaW5lLXNoaWZ0IixiYm94OjAsYmVnaW46MCxiaWFzOjAsYnk6MCxj YWxjTW9kZToiY2FsY01vZGUiLGNhcEhlaWdodDoiY2FwLWhlaWdodCIsY2xpcDowLGNsaXBQYXRo OiJjbGlwLXBhdGgiLGNsaXBSdWxlOiJjbGlwLXJ1bGUiLGNsaXBQYXRoVW5pdHM6ImNsaXBQYXRo VW5pdHMiLGNvbG9ySW50ZXJwb2xhdGlvbjoiY29sb3ItaW50ZXJwb2xhdGlvbiIsY29sb3JJbnRl cnBvbGF0aW9uRmlsdGVyczoiY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzIixjb2xvclByb2Zp bGU6ImNvbG9yLXByb2ZpbGUiLGNvbG9yUmVuZGVyaW5nOiJjb2xvci1yZW5kZXJpbmciLGNvbnRl bnRTY3JpcHRUeXBlOiJjb250ZW50U2NyaXB0VHlwZSIsY29udGVudFN0eWxlVHlwZToiY29udGVu dFN0eWxlVHlwZSIsY3Vyc29yOjAsY3g6MCxjeTowLGQ6MCxkZWNlbGVyYXRlOjAsZGVzY2VudDow LGRpZmZ1c2VDb25zdGFudDoiZGlmZnVzZUNvbnN0YW50IixkaXJlY3Rpb246MCxkaXNwbGF5OjAs ZGl2aXNvcjowLGRvbWluYW50QmFzZWxpbmU6ImRvbWluYW50LWJhc2VsaW5lIixkdXI6MCxkeDow LGR5OjAsZWRnZU1vZGU6ImVkZ2VNb2RlIixlbGV2YXRpb246MCxlbmFibGVCYWNrZ3JvdW5kOiJl bmFibGUtYmFja2dyb3VuZCIsZW5kOjAsZXhwb25lbnQ6MCxleHRlcm5hbFJlc291cmNlc1JlcXVp cmVkOiJleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkIixmaWxsOjAsZmlsbE9wYWNpdHk6ImZpbGwt b3BhY2l0eSIsZmlsbFJ1bGU6ImZpbGwtcnVsZSIsZmlsdGVyOjAsZmlsdGVyUmVzOiJmaWx0ZXJS ZXMiLGZpbHRlclVuaXRzOiJmaWx0ZXJVbml0cyIsZmxvb2RDb2xvcjoiZmxvb2QtY29sb3IiLGZs b29kT3BhY2l0eToiZmxvb2Qtb3BhY2l0eSIsZm9jdXNhYmxlOjAsZm9udEZhbWlseToiZm9udC1m YW1pbHkiLGZvbnRTaXplOiJmb250LXNpemUiLGZvbnRTaXplQWRqdXN0OiJmb250LXNpemUtYWRq dXN0Iixmb250U3RyZXRjaDoiZm9udC1zdHJldGNoIixmb250U3R5bGU6ImZvbnQtc3R5bGUiLGZv bnRWYXJpYW50OiJmb250LXZhcmlhbnQiLGZvbnRXZWlnaHQ6ImZvbnQtd2VpZ2h0Iixmb3JtYXQ6 MCxmcm9tOjAsZng6MCxmeTowLGcxOjAsZzI6MCxnbHlwaE5hbWU6ImdseXBoLW5hbWUiLGdseXBo T3JpZW50YXRpb25Ib3Jpem9udGFsOiJnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIixnbHlw aE9yaWVudGF0aW9uVmVydGljYWw6ImdseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsIixnbHlwaFJl ZjoiZ2x5cGhSZWYiLGdyYWRpZW50VHJhbnNmb3JtOiJncmFkaWVudFRyYW5zZm9ybSIsZ3JhZGll bnRVbml0czoiZ3JhZGllbnRVbml0cyIsaGFuZ2luZzowLGhvcml6QWR2WDoiaG9yaXotYWR2LXgi LGhvcml6T3JpZ2luWDoiaG9yaXotb3JpZ2luLXgiLGlkZW9ncmFwaGljOjAsaW1hZ2VSZW5kZXJp bmc6ImltYWdlLXJlbmRlcmluZyIsaW46MCxpbjI6MCxpbnRlcmNlcHQ6MCxrOjAsazE6MCxrMjow LGszOjAsazQ6MCxrZXJuZWxNYXRyaXg6Imtlcm5lbE1hdHJpeCIsa2VybmVsVW5pdExlbmd0aDoi a2VybmVsVW5pdExlbmd0aCIsa2VybmluZzowLGtleVBvaW50czoia2V5UG9pbnRzIixrZXlTcGxp bmVzOiJrZXlTcGxpbmVzIixrZXlUaW1lczoia2V5VGltZXMiLGxlbmd0aEFkanVzdDoibGVuZ3Ro QWRqdXN0IixsZXR0ZXJTcGFjaW5nOiJsZXR0ZXItc3BhY2luZyIsbGlnaHRpbmdDb2xvcjoibGln aHRpbmctY29sb3IiLGxpbWl0aW5nQ29uZUFuZ2xlOiJsaW1pdGluZ0NvbmVBbmdsZSIsbG9jYWw6 MCxtYXJrZXJFbmQ6Im1hcmtlci1lbmQiLG1hcmtlck1pZDoibWFya2VyLW1pZCIsbWFya2VyU3Rh cnQ6Im1hcmtlci1zdGFydCIsbWFya2VySGVpZ2h0OiJtYXJrZXJIZWlnaHQiLG1hcmtlclVuaXRz OiJtYXJrZXJVbml0cyIsbWFya2VyV2lkdGg6Im1hcmtlcldpZHRoIixtYXNrOjAsbWFza0NvbnRl bnRVbml0czoibWFza0NvbnRlbnRVbml0cyIsbWFza1VuaXRzOiJtYXNrVW5pdHMiLG1hdGhlbWF0 aWNhbDowLG1vZGU6MCxudW1PY3RhdmVzOiJudW1PY3RhdmVzIixvZmZzZXQ6MCxvcGFjaXR5OjAs b3BlcmF0b3I6MCxvcmRlcjowLG9yaWVudDowLG9yaWVudGF0aW9uOjAsb3JpZ2luOjAsb3ZlcmZs b3c6MCxvdmVybGluZVBvc2l0aW9uOiJvdmVybGluZS1wb3NpdGlvbiIsb3ZlcmxpbmVUaGlja25l c3M6Im92ZXJsaW5lLXRoaWNrbmVzcyIscGFpbnRPcmRlcjoicGFpbnQtb3JkZXIiLHBhbm9zZTE6 InBhbm9zZS0xIixwYXRoTGVuZ3RoOiJwYXRoTGVuZ3RoIixwYXR0ZXJuQ29udGVudFVuaXRzOiJw YXR0ZXJuQ29udGVudFVuaXRzIixwYXR0ZXJuVHJhbnNmb3JtOiJwYXR0ZXJuVHJhbnNmb3JtIixw YXR0ZXJuVW5pdHM6InBhdHRlcm5Vbml0cyIscG9pbnRlckV2ZW50czoicG9pbnRlci1ldmVudHMi LHBvaW50czowLHBvaW50c0F0WDoicG9pbnRzQXRYIixwb2ludHNBdFk6InBvaW50c0F0WSIscG9p bnRzQXRaOiJwb2ludHNBdFoiLHByZXNlcnZlQWxwaGE6InByZXNlcnZlQWxwaGEiLHByZXNlcnZl QXNwZWN0UmF0aW86InByZXNlcnZlQXNwZWN0UmF0aW8iLHByaW1pdGl2ZVVuaXRzOiJwcmltaXRp dmVVbml0cyIscjowLHJhZGl1czowLHJlZlg6InJlZlgiLHJlZlk6InJlZlkiLHJlbmRlcmluZ0lu dGVudDoicmVuZGVyaW5nLWludGVudCIscmVwZWF0Q291bnQ6InJlcGVhdENvdW50IixyZXBlYXRE dXI6InJlcGVhdER1ciIscmVxdWlyZWRFeHRlbnNpb25zOiJyZXF1aXJlZEV4dGVuc2lvbnMiLHJl cXVpcmVkRmVhdHVyZXM6InJlcXVpcmVkRmVhdHVyZXMiLHJlc3RhcnQ6MCxyZXN1bHQ6MCxyb3Rh dGU6MCxyeDowLHJ5OjAsc2NhbGU6MCxzZWVkOjAsc2hhcGVSZW5kZXJpbmc6InNoYXBlLXJlbmRl cmluZyIsc2xvcGU6MCxzcGFjaW5nOjAsc3BlY3VsYXJDb25zdGFudDoic3BlY3VsYXJDb25zdGFu dCIsc3BlY3VsYXJFeHBvbmVudDoic3BlY3VsYXJFeHBvbmVudCIsc3BlZWQ6MCxzcHJlYWRNZXRo b2Q6InNwcmVhZE1ldGhvZCIsc3RhcnRPZmZzZXQ6InN0YXJ0T2Zmc2V0IixzdGREZXZpYXRpb246 InN0ZERldmlhdGlvbiIsc3RlbWg6MCxzdGVtdjowLHN0aXRjaFRpbGVzOiJzdGl0Y2hUaWxlcyIs c3RvcENvbG9yOiJzdG9wLWNvbG9yIixzdG9wT3BhY2l0eToic3RvcC1vcGFjaXR5IixzdHJpa2V0 aHJvdWdoUG9zaXRpb246InN0cmlrZXRocm91Z2gtcG9zaXRpb24iLHN0cmlrZXRocm91Z2hUaGlj a25lc3M6InN0cmlrZXRocm91Z2gtdGhpY2tuZXNzIixzdHJpbmc6MCxzdHJva2U6MCxzdHJva2VE YXNoYXJyYXk6InN0cm9rZS1kYXNoYXJyYXkiLHN0cm9rZURhc2hvZmZzZXQ6InN0cm9rZS1kYXNo b2Zmc2V0IixzdHJva2VMaW5lY2FwOiJzdHJva2UtbGluZWNhcCIsc3Ryb2tlTGluZWpvaW46InN0 cm9rZS1saW5lam9pbiIsc3Ryb2tlTWl0ZXJsaW1pdDoic3Ryb2tlLW1pdGVybGltaXQiLHN0cm9r ZU9wYWNpdHk6InN0cm9rZS1vcGFjaXR5IixzdHJva2VXaWR0aDoic3Ryb2tlLXdpZHRoIixzdXJm YWNlU2NhbGU6InN1cmZhY2VTY2FsZSIsc3lzdGVtTGFuZ3VhZ2U6InN5c3RlbUxhbmd1YWdlIix0 YWJsZVZhbHVlczoidGFibGVWYWx1ZXMiLHRhcmdldFg6InRhcmdldFgiLHRhcmdldFk6InRhcmdl dFkiLHRleHRBbmNob3I6InRleHQtYW5jaG9yIix0ZXh0RGVjb3JhdGlvbjoidGV4dC1kZWNvcmF0 aW9uIix0ZXh0UmVuZGVyaW5nOiJ0ZXh0LXJlbmRlcmluZyIsdGV4dExlbmd0aDoidGV4dExlbmd0 aCIsdG86MCx0cmFuc2Zvcm06MCx1MTowLHUyOjAsdW5kZXJsaW5lUG9zaXRpb246InVuZGVybGlu ZS1wb3NpdGlvbiIsdW5kZXJsaW5lVGhpY2tuZXNzOiJ1bmRlcmxpbmUtdGhpY2tuZXNzIix1bmlj b2RlOjAsdW5pY29kZUJpZGk6InVuaWNvZGUtYmlkaSIsdW5pY29kZVJhbmdlOiJ1bmljb2RlLXJh bmdlIix1bml0c1BlckVtOiJ1bml0cy1wZXItZW0iLHZBbHBoYWJldGljOiJ2LWFscGhhYmV0aWMi LHZIYW5naW5nOiJ2LWhhbmdpbmciLHZJZGVvZ3JhcGhpYzoidi1pZGVvZ3JhcGhpYyIsdk1hdGhl bWF0aWNhbDoidi1tYXRoZW1hdGljYWwiLHZhbHVlczowLHZlY3RvckVmZmVjdDoidmVjdG9yLWVm ZmVjdCIsdmVyc2lvbjowLHZlcnRBZHZZOiJ2ZXJ0LWFkdi15Iix2ZXJ0T3JpZ2luWDoidmVydC1v cmlnaW4teCIsdmVydE9yaWdpblk6InZlcnQtb3JpZ2luLXkiLHZpZXdCb3g6InZpZXdCb3giLHZp ZXdUYXJnZXQ6InZpZXdUYXJnZXQiLHZpc2liaWxpdHk6MCx3aWR0aHM6MCx3b3JkU3BhY2luZzoi d29yZC1zcGFjaW5nIix3cml0aW5nTW9kZToid3JpdGluZy1tb2RlIix4OjAseEhlaWdodDoieC1o ZWlnaHQiLHgxOjAseDI6MCx4Q2hhbm5lbFNlbGVjdG9yOiJ4Q2hhbm5lbFNlbGVjdG9yIix4bGlu a0FjdHVhdGU6InhsaW5rOmFjdHVhdGUiLHhsaW5rQXJjcm9sZToieGxpbms6YXJjcm9sZSIseGxp bmtIcmVmOiJ4bGluazpocmVmIix4bGlua1JvbGU6InhsaW5rOnJvbGUiLHhsaW5rU2hvdzoieGxp bms6c2hvdyIseGxpbmtUaXRsZToieGxpbms6dGl0bGUiLHhsaW5rVHlwZToieGxpbms6dHlwZSIs eG1sQmFzZToieG1sOmJhc2UiLHhtbG5zOjAseG1sbnNYbGluazoieG1sbnM6eGxpbmsiLHhtbExh bmc6InhtbDpsYW5nIix4bWxTcGFjZToieG1sOnNwYWNlIix5OjAseTE6MCx5MjowLHlDaGFubmVs U2VsZWN0b3I6InlDaGFubmVsU2VsZWN0b3IiLHo6MCx6b29tQW5kUGFuOiJ6b29tQW5kUGFuIn07 dmFyIFNWR0RPTVByb3BlcnR5Q29uZmlnPXtQcm9wZXJ0aWVzOnt9LERPTUF0dHJpYnV0ZU5hbWVz cGFjZXM6e3hsaW5rQWN0dWF0ZTpOUy54bGluayx4bGlua0FyY3JvbGU6TlMueGxpbmsseGxpbmtI cmVmOk5TLnhsaW5rLHhsaW5rUm9sZTpOUy54bGluayx4bGlua1Nob3c6TlMueGxpbmsseGxpbmtU aXRsZTpOUy54bGluayx4bGlua1R5cGU6TlMueGxpbmsseG1sQmFzZTpOUy54bWwseG1sTGFuZzpO Uy54bWwseG1sU3BhY2U6TlMueG1sfSxET01BdHRyaWJ1dGVOYW1lczp7fX07T2JqZWN0LmtleXMo QVRUUlMpLmZvckVhY2goZnVuY3Rpb24oa2V5KXtTVkdET01Qcm9wZXJ0eUNvbmZpZy5Qcm9wZXJ0 aWVzW2tleV09MDtpZihBVFRSU1trZXldKXtTVkdET01Qcm9wZXJ0eUNvbmZpZy5ET01BdHRyaWJ1 dGVOYW1lc1trZXldPUFUVFJTW2tleV19fSk7bW9kdWxlLmV4cG9ydHM9U1ZHRE9NUHJvcGVydHlD b25maWd9LHt9XSw4NTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJp Y3QiO3ZhciBFdmVudFByb3BhZ2F0b3JzPV9kZXJlcV8oMjApO3ZhciBFeGVjdXRpb25FbnZpcm9u bWVudD1fZGVyZXFfKDEzNik7dmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZT1fZGVyZXFfKDM0KTt2 YXIgUmVhY3RJbnB1dFNlbGVjdGlvbj1fZGVyZXFfKDYyKTt2YXIgU3ludGhldGljRXZlbnQ9X2Rl cmVxXyg5MSk7dmFyIGdldEFjdGl2ZUVsZW1lbnQ9X2RlcmVxXygxNDUpO3ZhciBpc1RleHRJbnB1 dEVsZW1lbnQ9X2RlcmVxXygxMjMpO3ZhciBzaGFsbG93RXF1YWw9X2RlcmVxXygxNTYpO3ZhciBz a2lwU2VsZWN0aW9uQ2hhbmdlRXZlbnQ9RXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NJiYi ZG9jdW1lbnRNb2RlImluIGRvY3VtZW50JiZkb2N1bWVudC5kb2N1bWVudE1vZGU8PTExO3ZhciBl dmVudFR5cGVzPXtzZWxlY3Q6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOiJvblNl bGVjdCIsY2FwdHVyZWQ6Im9uU2VsZWN0Q2FwdHVyZSJ9LGRlcGVuZGVuY2llczpbInRvcEJsdXIi LCJ0b3BDb250ZXh0TWVudSIsInRvcEZvY3VzIiwidG9wS2V5RG93biIsInRvcEtleVVwIiwidG9w TW91c2VEb3duIiwidG9wTW91c2VVcCIsInRvcFNlbGVjdGlvbkNoYW5nZSJdfX07dmFyIGFjdGl2 ZUVsZW1lbnQ9bnVsbDt2YXIgYWN0aXZlRWxlbWVudEluc3Q9bnVsbDt2YXIgbGFzdFNlbGVjdGlv bj1udWxsO3ZhciBtb3VzZURvd249ZmFsc2U7dmFyIGhhc0xpc3RlbmVyPWZhbHNlO2Z1bmN0aW9u IGdldFNlbGVjdGlvbihub2RlKXtpZigic2VsZWN0aW9uU3RhcnQiaW4gbm9kZSYmUmVhY3RJbnB1 dFNlbGVjdGlvbi5oYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMobm9kZSkpe3JldHVybntzdGFydDpu b2RlLnNlbGVjdGlvblN0YXJ0LGVuZDpub2RlLnNlbGVjdGlvbkVuZH19ZWxzZSBpZih3aW5kb3cu Z2V0U2VsZWN0aW9uKXt2YXIgc2VsZWN0aW9uPXdpbmRvdy5nZXRTZWxlY3Rpb24oKTtyZXR1cm57 YW5jaG9yTm9kZTpzZWxlY3Rpb24uYW5jaG9yTm9kZSxhbmNob3JPZmZzZXQ6c2VsZWN0aW9uLmFu Y2hvck9mZnNldCxmb2N1c05vZGU6c2VsZWN0aW9uLmZvY3VzTm9kZSxmb2N1c09mZnNldDpzZWxl Y3Rpb24uZm9jdXNPZmZzZXR9fWVsc2UgaWYoZG9jdW1lbnQuc2VsZWN0aW9uKXt2YXIgcmFuZ2U9 ZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7cmV0dXJue3BhcmVudEVsZW1lbnQ6cmFu Z2UucGFyZW50RWxlbWVudCgpLHRleHQ6cmFuZ2UudGV4dCx0b3A6cmFuZ2UuYm91bmRpbmdUb3As bGVmdDpyYW5nZS5ib3VuZGluZ0xlZnR9fX1mdW5jdGlvbiBjb25zdHJ1Y3RTZWxlY3RFdmVudChu YXRpdmVFdmVudCxuYXRpdmVFdmVudFRhcmdldCl7aWYobW91c2VEb3dufHxhY3RpdmVFbGVtZW50 PT1udWxsfHxhY3RpdmVFbGVtZW50IT09Z2V0QWN0aXZlRWxlbWVudCgpKXtyZXR1cm4gbnVsbH12 YXIgY3VycmVudFNlbGVjdGlvbj1nZXRTZWxlY3Rpb24oYWN0aXZlRWxlbWVudCk7aWYoIWxhc3RT ZWxlY3Rpb258fCFzaGFsbG93RXF1YWwobGFzdFNlbGVjdGlvbixjdXJyZW50U2VsZWN0aW9uKSl7 bGFzdFNlbGVjdGlvbj1jdXJyZW50U2VsZWN0aW9uO3ZhciBzeW50aGV0aWNFdmVudD1TeW50aGV0 aWNFdmVudC5nZXRQb29sZWQoZXZlbnRUeXBlcy5zZWxlY3QsYWN0aXZlRWxlbWVudEluc3QsbmF0 aXZlRXZlbnQsbmF0aXZlRXZlbnRUYXJnZXQpO3N5bnRoZXRpY0V2ZW50LnR5cGU9InNlbGVjdCI7 c3ludGhldGljRXZlbnQudGFyZ2V0PWFjdGl2ZUVsZW1lbnQ7RXZlbnRQcm9wYWdhdG9ycy5hY2N1 bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKHN5bnRoZXRpY0V2ZW50KTtyZXR1cm4gc3ludGhldGlj RXZlbnR9cmV0dXJuIG51bGx9dmFyIFNlbGVjdEV2ZW50UGx1Z2luPXtldmVudFR5cGVzOmV2ZW50 VHlwZXMsZXh0cmFjdEV2ZW50czpmdW5jdGlvbih0b3BMZXZlbFR5cGUsdGFyZ2V0SW5zdCxuYXRp dmVFdmVudCxuYXRpdmVFdmVudFRhcmdldCl7aWYoIWhhc0xpc3RlbmVyKXtyZXR1cm4gbnVsbH12 YXIgdGFyZ2V0Tm9kZT10YXJnZXRJbnN0P1JlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJv bUluc3RhbmNlKHRhcmdldEluc3QpOndpbmRvdztzd2l0Y2godG9wTGV2ZWxUeXBlKXtjYXNlInRv cEZvY3VzIjppZihpc1RleHRJbnB1dEVsZW1lbnQodGFyZ2V0Tm9kZSl8fHRhcmdldE5vZGUuY29u dGVudEVkaXRhYmxlPT09InRydWUiKXthY3RpdmVFbGVtZW50PXRhcmdldE5vZGU7YWN0aXZlRWxl bWVudEluc3Q9dGFyZ2V0SW5zdDtsYXN0U2VsZWN0aW9uPW51bGx9YnJlYWs7Y2FzZSJ0b3BCbHVy IjphY3RpdmVFbGVtZW50PW51bGw7YWN0aXZlRWxlbWVudEluc3Q9bnVsbDtsYXN0U2VsZWN0aW9u PW51bGw7YnJlYWs7Y2FzZSJ0b3BNb3VzZURvd24iOm1vdXNlRG93bj10cnVlO2JyZWFrO2Nhc2Ui dG9wQ29udGV4dE1lbnUiOmNhc2UidG9wTW91c2VVcCI6bW91c2VEb3duPWZhbHNlO3JldHVybiBj b25zdHJ1Y3RTZWxlY3RFdmVudChuYXRpdmVFdmVudCxuYXRpdmVFdmVudFRhcmdldCk7Y2FzZSJ0 b3BTZWxlY3Rpb25DaGFuZ2UiOmlmKHNraXBTZWxlY3Rpb25DaGFuZ2VFdmVudCl7YnJlYWt9Y2Fz ZSJ0b3BLZXlEb3duIjpjYXNlInRvcEtleVVwIjpyZXR1cm4gY29uc3RydWN0U2VsZWN0RXZlbnQo bmF0aXZlRXZlbnQsbmF0aXZlRXZlbnRUYXJnZXQpfXJldHVybiBudWxsfSxkaWRQdXRMaXN0ZW5l cjpmdW5jdGlvbihpbnN0LHJlZ2lzdHJhdGlvbk5hbWUsbGlzdGVuZXIpe2lmKHJlZ2lzdHJhdGlv bk5hbWU9PT0ib25TZWxlY3QiKXtoYXNMaXN0ZW5lcj10cnVlfX19O21vZHVsZS5leHBvcnRzPVNl bGVjdEV2ZW50UGx1Z2lufSx7MTIzOjEyMywxMzY6MTM2LDE0NToxNDUsMTU2OjE1NiwyMDoyMCwz NDozNCw2Mjo2Miw5MTo5MX1dLDg2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsi dXNlIHN0cmljdCI7dmFyIF9wcm9kSW52YXJpYW50PV9kZXJlcV8oMTI1KTt2YXIgRXZlbnRMaXN0 ZW5lcj1fZGVyZXFfKDEzNSk7dmFyIEV2ZW50UHJvcGFnYXRvcnM9X2RlcmVxXygyMCk7dmFyIFJl YWN0RE9NQ29tcG9uZW50VHJlZT1fZGVyZXFfKDM0KTt2YXIgU3ludGhldGljQW5pbWF0aW9uRXZl bnQ9X2RlcmVxXyg4Nyk7dmFyIFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50PV9kZXJlcV8oODgpO3Zh ciBTeW50aGV0aWNFdmVudD1fZGVyZXFfKDkxKTt2YXIgU3ludGhldGljRm9jdXNFdmVudD1fZGVy ZXFfKDkyKTt2YXIgU3ludGhldGljS2V5Ym9hcmRFdmVudD1fZGVyZXFfKDk0KTt2YXIgU3ludGhl dGljTW91c2VFdmVudD1fZGVyZXFfKDk1KTt2YXIgU3ludGhldGljRHJhZ0V2ZW50PV9kZXJlcV8o OTApO3ZhciBTeW50aGV0aWNUb3VjaEV2ZW50PV9kZXJlcV8oOTYpO3ZhciBTeW50aGV0aWNUcmFu c2l0aW9uRXZlbnQ9X2RlcmVxXyg5Nyk7dmFyIFN5bnRoZXRpY1VJRXZlbnQ9X2RlcmVxXyg5OCk7 dmFyIFN5bnRoZXRpY1doZWVsRXZlbnQ9X2RlcmVxXyg5OSk7dmFyIGVtcHR5RnVuY3Rpb249X2Rl cmVxXygxNDIpO3ZhciBnZXRFdmVudENoYXJDb2RlPV9kZXJlcV8oMTExKTt2YXIgaW52YXJpYW50 PV9kZXJlcV8oMTUwKTt2YXIgZXZlbnRUeXBlcz17fTt2YXIgdG9wTGV2ZWxFdmVudHNUb0Rpc3Bh dGNoQ29uZmlnPXt9O1siYWJvcnQiLCJhbmltYXRpb25FbmQiLCJhbmltYXRpb25JdGVyYXRpb24i LCJhbmltYXRpb25TdGFydCIsImJsdXIiLCJjYW5QbGF5IiwiY2FuUGxheVRocm91Z2giLCJjbGlj ayIsImNvbnRleHRNZW51IiwiY29weSIsImN1dCIsImRvdWJsZUNsaWNrIiwiZHJhZyIsImRyYWdF bmQiLCJkcmFnRW50ZXIiLCJkcmFnRXhpdCIsImRyYWdMZWF2ZSIsImRyYWdPdmVyIiwiZHJhZ1N0 YXJ0IiwiZHJvcCIsImR1cmF0aW9uQ2hhbmdlIiwiZW1wdGllZCIsImVuY3J5cHRlZCIsImVuZGVk IiwiZXJyb3IiLCJmb2N1cyIsImlucHV0IiwiaW52YWxpZCIsImtleURvd24iLCJrZXlQcmVzcyIs ImtleVVwIiwibG9hZCIsImxvYWRlZERhdGEiLCJsb2FkZWRNZXRhZGF0YSIsImxvYWRTdGFydCIs Im1vdXNlRG93biIsIm1vdXNlTW92ZSIsIm1vdXNlT3V0IiwibW91c2VPdmVyIiwibW91c2VVcCIs InBhc3RlIiwicGF1c2UiLCJwbGF5IiwicGxheWluZyIsInByb2dyZXNzIiwicmF0ZUNoYW5nZSIs InJlc2V0Iiwic2Nyb2xsIiwic2Vla2VkIiwic2Vla2luZyIsInN0YWxsZWQiLCJzdWJtaXQiLCJz dXNwZW5kIiwidGltZVVwZGF0ZSIsInRvdWNoQ2FuY2VsIiwidG91Y2hFbmQiLCJ0b3VjaE1vdmUi LCJ0b3VjaFN0YXJ0IiwidHJhbnNpdGlvbkVuZCIsInZvbHVtZUNoYW5nZSIsIndhaXRpbmciLCJ3 aGVlbCJdLmZvckVhY2goZnVuY3Rpb24oZXZlbnQpe3ZhciBjYXBpdGFsaXplZEV2ZW50PWV2ZW50 WzBdLnRvVXBwZXJDYXNlKCkrZXZlbnQuc2xpY2UoMSk7dmFyIG9uRXZlbnQ9Im9uIitjYXBpdGFs aXplZEV2ZW50O3ZhciB0b3BFdmVudD0idG9wIitjYXBpdGFsaXplZEV2ZW50O3ZhciB0eXBlPXtw aGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpvbkV2ZW50LGNhcHR1cmVkOm9uRXZlbnQr IkNhcHR1cmUifSxkZXBlbmRlbmNpZXM6W3RvcEV2ZW50XX07ZXZlbnRUeXBlc1tldmVudF09dHlw ZTt0b3BMZXZlbEV2ZW50c1RvRGlzcGF0Y2hDb25maWdbdG9wRXZlbnRdPXR5cGV9KTt2YXIgb25D bGlja0xpc3RlbmVycz17fTtmdW5jdGlvbiBnZXREaWN0aW9uYXJ5S2V5KGluc3Qpe3JldHVybiIu IitpbnN0Ll9yb290Tm9kZUlEfWZ1bmN0aW9uIGlzSW50ZXJhY3RpdmUodGFnKXtyZXR1cm4gdGFn PT09ImJ1dHRvbiJ8fHRhZz09PSJpbnB1dCJ8fHRhZz09PSJzZWxlY3QifHx0YWc9PT0idGV4dGFy ZWEifXZhciBTaW1wbGVFdmVudFBsdWdpbj17ZXZlbnRUeXBlczpldmVudFR5cGVzLGV4dHJhY3RF dmVudHM6ZnVuY3Rpb24odG9wTGV2ZWxUeXBlLHRhcmdldEluc3QsbmF0aXZlRXZlbnQsbmF0aXZl RXZlbnRUYXJnZXQpe3ZhciBkaXNwYXRjaENvbmZpZz10b3BMZXZlbEV2ZW50c1RvRGlzcGF0Y2hD b25maWdbdG9wTGV2ZWxUeXBlXTtpZighZGlzcGF0Y2hDb25maWcpe3JldHVybiBudWxsfXZhciBF dmVudENvbnN0cnVjdG9yO3N3aXRjaCh0b3BMZXZlbFR5cGUpe2Nhc2UidG9wQWJvcnQiOmNhc2Ui dG9wQ2FuUGxheSI6Y2FzZSJ0b3BDYW5QbGF5VGhyb3VnaCI6Y2FzZSJ0b3BEdXJhdGlvbkNoYW5n ZSI6Y2FzZSJ0b3BFbXB0aWVkIjpjYXNlInRvcEVuY3J5cHRlZCI6Y2FzZSJ0b3BFbmRlZCI6Y2Fz ZSJ0b3BFcnJvciI6Y2FzZSJ0b3BJbnB1dCI6Y2FzZSJ0b3BJbnZhbGlkIjpjYXNlInRvcExvYWQi OmNhc2UidG9wTG9hZGVkRGF0YSI6Y2FzZSJ0b3BMb2FkZWRNZXRhZGF0YSI6Y2FzZSJ0b3BMb2Fk U3RhcnQiOmNhc2UidG9wUGF1c2UiOmNhc2UidG9wUGxheSI6Y2FzZSJ0b3BQbGF5aW5nIjpjYXNl InRvcFByb2dyZXNzIjpjYXNlInRvcFJhdGVDaGFuZ2UiOmNhc2UidG9wUmVzZXQiOmNhc2UidG9w U2Vla2VkIjpjYXNlInRvcFNlZWtpbmciOmNhc2UidG9wU3RhbGxlZCI6Y2FzZSJ0b3BTdWJtaXQi OmNhc2UidG9wU3VzcGVuZCI6Y2FzZSJ0b3BUaW1lVXBkYXRlIjpjYXNlInRvcFZvbHVtZUNoYW5n ZSI6Y2FzZSJ0b3BXYWl0aW5nIjpFdmVudENvbnN0cnVjdG9yPVN5bnRoZXRpY0V2ZW50O2JyZWFr O2Nhc2UidG9wS2V5UHJlc3MiOmlmKGdldEV2ZW50Q2hhckNvZGUobmF0aXZlRXZlbnQpPT09MCl7 cmV0dXJuIG51bGx9Y2FzZSJ0b3BLZXlEb3duIjpjYXNlInRvcEtleVVwIjpFdmVudENvbnN0cnVj dG9yPVN5bnRoZXRpY0tleWJvYXJkRXZlbnQ7YnJlYWs7Y2FzZSJ0b3BCbHVyIjpjYXNlInRvcEZv Y3VzIjpFdmVudENvbnN0cnVjdG9yPVN5bnRoZXRpY0ZvY3VzRXZlbnQ7YnJlYWs7Y2FzZSJ0b3BD bGljayI6aWYobmF0aXZlRXZlbnQuYnV0dG9uPT09Mil7cmV0dXJuIG51bGx9Y2FzZSJ0b3BEb3Vi bGVDbGljayI6Y2FzZSJ0b3BNb3VzZURvd24iOmNhc2UidG9wTW91c2VNb3ZlIjpjYXNlInRvcE1v dXNlVXAiOmNhc2UidG9wTW91c2VPdXQiOmNhc2UidG9wTW91c2VPdmVyIjpjYXNlInRvcENvbnRl eHRNZW51IjpFdmVudENvbnN0cnVjdG9yPVN5bnRoZXRpY01vdXNlRXZlbnQ7YnJlYWs7Y2FzZSJ0 b3BEcmFnIjpjYXNlInRvcERyYWdFbmQiOmNhc2UidG9wRHJhZ0VudGVyIjpjYXNlInRvcERyYWdF eGl0IjpjYXNlInRvcERyYWdMZWF2ZSI6Y2FzZSJ0b3BEcmFnT3ZlciI6Y2FzZSJ0b3BEcmFnU3Rh cnQiOmNhc2UidG9wRHJvcCI6RXZlbnRDb25zdHJ1Y3Rvcj1TeW50aGV0aWNEcmFnRXZlbnQ7YnJl YWs7Y2FzZSJ0b3BUb3VjaENhbmNlbCI6Y2FzZSJ0b3BUb3VjaEVuZCI6Y2FzZSJ0b3BUb3VjaE1v dmUiOmNhc2UidG9wVG91Y2hTdGFydCI6RXZlbnRDb25zdHJ1Y3Rvcj1TeW50aGV0aWNUb3VjaEV2 ZW50O2JyZWFrO2Nhc2UidG9wQW5pbWF0aW9uRW5kIjpjYXNlInRvcEFuaW1hdGlvbkl0ZXJhdGlv biI6Y2FzZSJ0b3BBbmltYXRpb25TdGFydCI6RXZlbnRDb25zdHJ1Y3Rvcj1TeW50aGV0aWNBbmlt YXRpb25FdmVudDticmVhaztjYXNlInRvcFRyYW5zaXRpb25FbmQiOkV2ZW50Q29uc3RydWN0b3I9 U3ludGhldGljVHJhbnNpdGlvbkV2ZW50O2JyZWFrO2Nhc2UidG9wU2Nyb2xsIjpFdmVudENvbnN0 cnVjdG9yPVN5bnRoZXRpY1VJRXZlbnQ7YnJlYWs7Y2FzZSJ0b3BXaGVlbCI6RXZlbnRDb25zdHJ1 Y3Rvcj1TeW50aGV0aWNXaGVlbEV2ZW50O2JyZWFrO2Nhc2UidG9wQ29weSI6Y2FzZSJ0b3BDdXQi OmNhc2UidG9wUGFzdGUiOkV2ZW50Q29uc3RydWN0b3I9U3ludGhldGljQ2xpcGJvYXJkRXZlbnQ7 YnJlYWt9IUV2ZW50Q29uc3RydWN0b3I/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZh cmlhbnQoZmFsc2UsIlNpbXBsZUV2ZW50UGx1Z2luOiBVbmhhbmRsZWQgZXZlbnQgdHlwZSwgYCVz YC4iLHRvcExldmVsVHlwZSk6X3Byb2RJbnZhcmlhbnQoIjg2Iix0b3BMZXZlbFR5cGUpOnZvaWQg MDt2YXIgZXZlbnQ9RXZlbnRDb25zdHJ1Y3Rvci5nZXRQb29sZWQoZGlzcGF0Y2hDb25maWcsdGFy Z2V0SW5zdCxuYXRpdmVFdmVudCxuYXRpdmVFdmVudFRhcmdldCk7RXZlbnRQcm9wYWdhdG9ycy5h Y2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGV2ZW50KTtyZXR1cm4gZXZlbnR9LGRpZFB1dExp c3RlbmVyOmZ1bmN0aW9uKGluc3QscmVnaXN0cmF0aW9uTmFtZSxsaXN0ZW5lcil7aWYocmVnaXN0 cmF0aW9uTmFtZT09PSJvbkNsaWNrIiYmIWlzSW50ZXJhY3RpdmUoaW5zdC5fdGFnKSl7dmFyIGtl eT1nZXREaWN0aW9uYXJ5S2V5KGluc3QpO3ZhciBub2RlPVJlYWN0RE9NQ29tcG9uZW50VHJlZS5n ZXROb2RlRnJvbUluc3RhbmNlKGluc3QpO2lmKCFvbkNsaWNrTGlzdGVuZXJzW2tleV0pe29uQ2xp Y2tMaXN0ZW5lcnNba2V5XT1FdmVudExpc3RlbmVyLmxpc3Rlbihub2RlLCJjbGljayIsZW1wdHlG dW5jdGlvbil9fX0sd2lsbERlbGV0ZUxpc3RlbmVyOmZ1bmN0aW9uKGluc3QscmVnaXN0cmF0aW9u TmFtZSl7aWYocmVnaXN0cmF0aW9uTmFtZT09PSJvbkNsaWNrIiYmIWlzSW50ZXJhY3RpdmUoaW5z dC5fdGFnKSl7dmFyIGtleT1nZXREaWN0aW9uYXJ5S2V5KGluc3QpO29uQ2xpY2tMaXN0ZW5lcnNb a2V5XS5yZW1vdmUoKTtkZWxldGUgb25DbGlja0xpc3RlbmVyc1trZXldfX19O21vZHVsZS5leHBv cnRzPVNpbXBsZUV2ZW50UGx1Z2lufSx7MTExOjExMSwxMjU6MTI1LDEzNToxMzUsMTQyOjE0Miwx NTA6MTUwLDIwOjIwLDM0OjM0LDg3Ojg3LDg4Ojg4LDkwOjkwLDkxOjkxLDkyOjkyLDk0Ojk0LDk1 Ojk1LDk2Ojk2LDk3Ojk3LDk4Ojk4LDk5Ojk5fV0sODc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxl LGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgU3ludGhldGljRXZlbnQ9X2RlcmVxXyg5MSk7dmFy IEFuaW1hdGlvbkV2ZW50SW50ZXJmYWNlPXthbmltYXRpb25OYW1lOm51bGwsZWxhcHNlZFRpbWU6 bnVsbCxwc2V1ZG9FbGVtZW50Om51bGx9O2Z1bmN0aW9uIFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50 KGRpc3BhdGNoQ29uZmlnLGRpc3BhdGNoTWFya2VyLG5hdGl2ZUV2ZW50LG5hdGl2ZUV2ZW50VGFy Z2V0KXtyZXR1cm4gU3ludGhldGljRXZlbnQuY2FsbCh0aGlzLGRpc3BhdGNoQ29uZmlnLGRpc3Bh dGNoTWFya2VyLG5hdGl2ZUV2ZW50LG5hdGl2ZUV2ZW50VGFyZ2V0KX1TeW50aGV0aWNFdmVudC5h dWdtZW50Q2xhc3MoU3ludGhldGljQW5pbWF0aW9uRXZlbnQsQW5pbWF0aW9uRXZlbnRJbnRlcmZh Y2UpO21vZHVsZS5leHBvcnRzPVN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50fSx7OTE6OTF9XSw4ODpb ZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBTeW50aGV0 aWNFdmVudD1fZGVyZXFfKDkxKTt2YXIgQ2xpcGJvYXJkRXZlbnRJbnRlcmZhY2U9e2NsaXBib2Fy ZERhdGE6ZnVuY3Rpb24oZXZlbnQpe3JldHVybiJjbGlwYm9hcmREYXRhImluIGV2ZW50P2V2ZW50 LmNsaXBib2FyZERhdGE6d2luZG93LmNsaXBib2FyZERhdGF9fTtmdW5jdGlvbiBTeW50aGV0aWND bGlwYm9hcmRFdmVudChkaXNwYXRjaENvbmZpZyxkaXNwYXRjaE1hcmtlcixuYXRpdmVFdmVudCxu YXRpdmVFdmVudFRhcmdldCl7cmV0dXJuIFN5bnRoZXRpY0V2ZW50LmNhbGwodGhpcyxkaXNwYXRj aENvbmZpZyxkaXNwYXRjaE1hcmtlcixuYXRpdmVFdmVudCxuYXRpdmVFdmVudFRhcmdldCl9U3lu dGhldGljRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50LENsaXBib2Fy ZEV2ZW50SW50ZXJmYWNlKTttb2R1bGUuZXhwb3J0cz1TeW50aGV0aWNDbGlwYm9hcmRFdmVudH0s ezkxOjkxfV0sODk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0 Ijt2YXIgU3ludGhldGljRXZlbnQ9X2RlcmVxXyg5MSk7dmFyIENvbXBvc2l0aW9uRXZlbnRJbnRl cmZhY2U9e2RhdGE6bnVsbH07ZnVuY3Rpb24gU3ludGhldGljQ29tcG9zaXRpb25FdmVudChkaXNw YXRjaENvbmZpZyxkaXNwYXRjaE1hcmtlcixuYXRpdmVFdmVudCxuYXRpdmVFdmVudFRhcmdldCl7 cmV0dXJuIFN5bnRoZXRpY0V2ZW50LmNhbGwodGhpcyxkaXNwYXRjaENvbmZpZyxkaXNwYXRjaE1h cmtlcixuYXRpdmVFdmVudCxuYXRpdmVFdmVudFRhcmdldCl9U3ludGhldGljRXZlbnQuYXVnbWVu dENsYXNzKFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQsQ29tcG9zaXRpb25FdmVudEludGVyZmFj ZSk7bW9kdWxlLmV4cG9ydHM9U3ludGhldGljQ29tcG9zaXRpb25FdmVudH0sezkxOjkxfV0sOTA6 W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgU3ludGhl dGljTW91c2VFdmVudD1fZGVyZXFfKDk1KTt2YXIgRHJhZ0V2ZW50SW50ZXJmYWNlPXtkYXRhVHJh bnNmZXI6bnVsbH07ZnVuY3Rpb24gU3ludGhldGljRHJhZ0V2ZW50KGRpc3BhdGNoQ29uZmlnLGRp c3BhdGNoTWFya2VyLG5hdGl2ZUV2ZW50LG5hdGl2ZUV2ZW50VGFyZ2V0KXtyZXR1cm4gU3ludGhl dGljTW91c2VFdmVudC5jYWxsKHRoaXMsZGlzcGF0Y2hDb25maWcsZGlzcGF0Y2hNYXJrZXIsbmF0 aXZlRXZlbnQsbmF0aXZlRXZlbnRUYXJnZXQpfVN5bnRoZXRpY01vdXNlRXZlbnQuYXVnbWVudENs YXNzKFN5bnRoZXRpY0RyYWdFdmVudCxEcmFnRXZlbnRJbnRlcmZhY2UpO21vZHVsZS5leHBvcnRz PVN5bnRoZXRpY0RyYWdFdmVudH0sezk1Ojk1fV0sOTE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxl LGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgX2Fzc2lnbj1fZGVyZXFfKDE1OCk7dmFyIFBvb2xl ZENsYXNzPV9kZXJlcV8oMjUpO3ZhciBlbXB0eUZ1bmN0aW9uPV9kZXJlcV8oMTQyKTt2YXIgd2Fy bmluZz1fZGVyZXFfKDE1Nyk7dmFyIGRpZFdhcm5Gb3JBZGRlZE5ld1Byb3BlcnR5PWZhbHNlO3Zh ciBpc1Byb3h5U3VwcG9ydGVkPXR5cGVvZiBQcm94eT09PSJmdW5jdGlvbiI7dmFyIHNob3VsZEJl UmVsZWFzZWRQcm9wZXJ0aWVzPVsiZGlzcGF0Y2hDb25maWciLCJfdGFyZ2V0SW5zdCIsIm5hdGl2 ZUV2ZW50IiwiaXNEZWZhdWx0UHJldmVudGVkIiwiaXNQcm9wYWdhdGlvblN0b3BwZWQiLCJfZGlz cGF0Y2hMaXN0ZW5lcnMiLCJfZGlzcGF0Y2hJbnN0YW5jZXMiXTt2YXIgRXZlbnRJbnRlcmZhY2U9 e3R5cGU6bnVsbCx0YXJnZXQ6bnVsbCxjdXJyZW50VGFyZ2V0OmVtcHR5RnVuY3Rpb24udGhhdFJl dHVybnNOdWxsLGV2ZW50UGhhc2U6bnVsbCxidWJibGVzOm51bGwsY2FuY2VsYWJsZTpudWxsLHRp bWVTdGFtcDpmdW5jdGlvbihldmVudCl7cmV0dXJuIGV2ZW50LnRpbWVTdGFtcHx8RGF0ZS5ub3co KX0sZGVmYXVsdFByZXZlbnRlZDpudWxsLGlzVHJ1c3RlZDpudWxsfTtmdW5jdGlvbiBTeW50aGV0 aWNFdmVudChkaXNwYXRjaENvbmZpZyx0YXJnZXRJbnN0LG5hdGl2ZUV2ZW50LG5hdGl2ZUV2ZW50 VGFyZ2V0KXtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtkZWxldGUgdGhpcy5uYXRp dmVFdmVudDtkZWxldGUgdGhpcy5wcmV2ZW50RGVmYXVsdDtkZWxldGUgdGhpcy5zdG9wUHJvcGFn YXRpb259dGhpcy5kaXNwYXRjaENvbmZpZz1kaXNwYXRjaENvbmZpZzt0aGlzLl90YXJnZXRJbnN0 PXRhcmdldEluc3Q7dGhpcy5uYXRpdmVFdmVudD1uYXRpdmVFdmVudDt2YXIgSW50ZXJmYWNlPXRo aXMuY29uc3RydWN0b3IuSW50ZXJmYWNlO2Zvcih2YXIgcHJvcE5hbWUgaW4gSW50ZXJmYWNlKXtp ZighSW50ZXJmYWNlLmhhc093blByb3BlcnR5KHByb3BOYW1lKSl7Y29udGludWV9aWYoImRldmVs b3BtZW50IiE9PSJwcm9kdWN0aW9uIil7ZGVsZXRlIHRoaXNbcHJvcE5hbWVdfXZhciBub3JtYWxp emU9SW50ZXJmYWNlW3Byb3BOYW1lXTtpZihub3JtYWxpemUpe3RoaXNbcHJvcE5hbWVdPW5vcm1h bGl6ZShuYXRpdmVFdmVudCl9ZWxzZXtpZihwcm9wTmFtZT09PSJ0YXJnZXQiKXt0aGlzLnRhcmdl dD1uYXRpdmVFdmVudFRhcmdldH1lbHNle3RoaXNbcHJvcE5hbWVdPW5hdGl2ZUV2ZW50W3Byb3BO YW1lXX19fXZhciBkZWZhdWx0UHJldmVudGVkPW5hdGl2ZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQh PW51bGw/bmF0aXZlRXZlbnQuZGVmYXVsdFByZXZlbnRlZDpuYXRpdmVFdmVudC5yZXR1cm5WYWx1 ZT09PWZhbHNlO2lmKGRlZmF1bHRQcmV2ZW50ZWQpe3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPWVt cHR5RnVuY3Rpb24udGhhdFJldHVybnNUcnVlfWVsc2V7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9 ZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc0ZhbHNlfXRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9 ZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc0ZhbHNlO3JldHVybiB0aGlzfV9hc3NpZ24oU3ludGhl dGljRXZlbnQucHJvdG90eXBlLHtwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMuZGVmYXVs dFByZXZlbnRlZD10cnVlO3ZhciBldmVudD10aGlzLm5hdGl2ZUV2ZW50O2lmKCFldmVudCl7cmV0 dXJufWlmKGV2ZW50LnByZXZlbnREZWZhdWx0KXtldmVudC5wcmV2ZW50RGVmYXVsdCgpfWVsc2Ug aWYodHlwZW9mIGV2ZW50LnJldHVyblZhbHVlIT09InVua25vd24iKXtldmVudC5yZXR1cm5WYWx1 ZT1mYWxzZX10aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1lbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5z VHJ1ZX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGV2ZW50PXRoaXMubmF0aXZlRXZl bnQ7aWYoIWV2ZW50KXtyZXR1cm59aWYoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKXtldmVudC5zdG9w UHJvcGFnYXRpb24oKX1lbHNlIGlmKHR5cGVvZiBldmVudC5jYW5jZWxCdWJibGUhPT0idW5rbm93 biIpe2V2ZW50LmNhbmNlbEJ1YmJsZT10cnVlfXRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9ZW1w dHlGdW5jdGlvbi50aGF0UmV0dXJuc1RydWV9LHBlcnNpc3Q6ZnVuY3Rpb24oKXt0aGlzLmlzUGVy c2lzdGVudD1lbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zVHJ1ZX0saXNQZXJzaXN0ZW50OmVtcHR5 RnVuY3Rpb24udGhhdFJldHVybnNGYWxzZSxkZXN0cnVjdG9yOmZ1bmN0aW9uKCl7dmFyIEludGVy ZmFjZT10aGlzLmNvbnN0cnVjdG9yLkludGVyZmFjZTtmb3IodmFyIHByb3BOYW1lIGluIEludGVy ZmFjZSl7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7T2JqZWN0LmRlZmluZVByb3Bl cnR5KHRoaXMscHJvcE5hbWUsZ2V0UG9vbGVkV2FybmluZ1Byb3BlcnR5RGVmaW5pdGlvbihwcm9w TmFtZSxJbnRlcmZhY2VbcHJvcE5hbWVdKSl9ZWxzZXt0aGlzW3Byb3BOYW1lXT1udWxsfX1mb3Io dmFyIGk9MDtpPHNob3VsZEJlUmVsZWFzZWRQcm9wZXJ0aWVzLmxlbmd0aDtpKyspe3RoaXNbc2hv dWxkQmVSZWxlYXNlZFByb3BlcnRpZXNbaV1dPW51bGx9aWYoImRldmVsb3BtZW50IiE9PSJwcm9k dWN0aW9uIil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm5hdGl2ZUV2ZW50IixnZXRQb29s ZWRXYXJuaW5nUHJvcGVydHlEZWZpbml0aW9uKCJuYXRpdmVFdmVudCIsbnVsbCkpO09iamVjdC5k ZWZpbmVQcm9wZXJ0eSh0aGlzLCJwcmV2ZW50RGVmYXVsdCIsZ2V0UG9vbGVkV2FybmluZ1Byb3Bl cnR5RGVmaW5pdGlvbigicHJldmVudERlZmF1bHQiLGVtcHR5RnVuY3Rpb24pKTtPYmplY3QuZGVm aW5lUHJvcGVydHkodGhpcywic3RvcFByb3BhZ2F0aW9uIixnZXRQb29sZWRXYXJuaW5nUHJvcGVy dHlEZWZpbml0aW9uKCJzdG9wUHJvcGFnYXRpb24iLGVtcHR5RnVuY3Rpb24pKX19fSk7U3ludGhl dGljRXZlbnQuSW50ZXJmYWNlPUV2ZW50SW50ZXJmYWNlO1N5bnRoZXRpY0V2ZW50LmF1Z21lbnRD bGFzcz1mdW5jdGlvbihDbGFzcyxJbnRlcmZhY2Upe3ZhciBTdXBlcj10aGlzO3ZhciBFPWZ1bmN0 aW9uKCl7fTtFLnByb3RvdHlwZT1TdXBlci5wcm90b3R5cGU7dmFyIHByb3RvdHlwZT1uZXcgRTtf YXNzaWduKHByb3RvdHlwZSxDbGFzcy5wcm90b3R5cGUpO0NsYXNzLnByb3RvdHlwZT1wcm90b3R5 cGU7Q2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yPUNsYXNzO0NsYXNzLkludGVyZmFjZT1fYXNz aWduKHt9LFN1cGVyLkludGVyZmFjZSxJbnRlcmZhY2UpO0NsYXNzLmF1Z21lbnRDbGFzcz1TdXBl ci5hdWdtZW50Q2xhc3M7UG9vbGVkQ2xhc3MuYWRkUG9vbGluZ1RvKENsYXNzLFBvb2xlZENsYXNz LmZvdXJBcmd1bWVudFBvb2xlcil9O2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe2lm KGlzUHJveHlTdXBwb3J0ZWQpe1N5bnRoZXRpY0V2ZW50PW5ldyBQcm94eShTeW50aGV0aWNFdmVu dCx7Y29uc3RydWN0OmZ1bmN0aW9uKHRhcmdldCxhcmdzKXtyZXR1cm4gdGhpcy5hcHBseSh0YXJn ZXQsT2JqZWN0LmNyZWF0ZSh0YXJnZXQucHJvdG90eXBlKSxhcmdzKX0sYXBwbHk6ZnVuY3Rpb24o Y29uc3RydWN0b3IsdGhhdCxhcmdzKXtyZXR1cm4gbmV3IFByb3h5KGNvbnN0cnVjdG9yLmFwcGx5 KHRoYXQsYXJncykse3NldDpmdW5jdGlvbih0YXJnZXQscHJvcCx2YWx1ZSl7aWYocHJvcCE9PSJp c1BlcnNpc3RlbnQiJiYhdGFyZ2V0LmNvbnN0cnVjdG9yLkludGVyZmFjZS5oYXNPd25Qcm9wZXJ0 eShwcm9wKSYmc2hvdWxkQmVSZWxlYXNlZFByb3BlcnRpZXMuaW5kZXhPZihwcm9wKT09PS0xKXsi ZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmcoZGlkV2FybkZvckFkZGVkTmV3UHJv cGVydHl8fHRhcmdldC5pc1BlcnNpc3RlbnQoKSwiVGhpcyBzeW50aGV0aWMgZXZlbnQgaXMgcmV1 c2VkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLiBJZiB5b3UncmUgIisic2VlaW5nIHRoaXMsIHlv dSdyZSBhZGRpbmcgYSBuZXcgcHJvcGVydHkgaW4gdGhlIHN5bnRoZXRpYyBldmVudCBvYmplY3Qu ICIrIlRoZSBwcm9wZXJ0eSBpcyBuZXZlciByZWxlYXNlZC4gU2VlICIrImh0dHBzOi8vZmIubWUv cmVhY3QtZXZlbnQtcG9vbGluZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iKTp2b2lkIDA7ZGlkV2Fy bkZvckFkZGVkTmV3UHJvcGVydHk9dHJ1ZX10YXJnZXRbcHJvcF09dmFsdWU7cmV0dXJuIHRydWV9 fSl9fSl9fVBvb2xlZENsYXNzLmFkZFBvb2xpbmdUbyhTeW50aGV0aWNFdmVudCxQb29sZWRDbGFz cy5mb3VyQXJndW1lbnRQb29sZXIpO21vZHVsZS5leHBvcnRzPVN5bnRoZXRpY0V2ZW50O2Z1bmN0 aW9uIGdldFBvb2xlZFdhcm5pbmdQcm9wZXJ0eURlZmluaXRpb24ocHJvcE5hbWUsZ2V0VmFsKXt2 YXIgaXNGdW5jdGlvbj10eXBlb2YgZ2V0VmFsPT09ImZ1bmN0aW9uIjtyZXR1cm57Y29uZmlndXJh YmxlOnRydWUsc2V0OnNldCxnZXQ6Z2V0fTtmdW5jdGlvbiBzZXQodmFsKXt2YXIgYWN0aW9uPWlz RnVuY3Rpb24/InNldHRpbmcgdGhlIG1ldGhvZCI6InNldHRpbmcgdGhlIHByb3BlcnR5Ijt3YXJu KGFjdGlvbiwiVGhpcyBpcyBlZmZlY3RpdmVseSBhIG5vLW9wIik7cmV0dXJuIHZhbH1mdW5jdGlv biBnZXQoKXt2YXIgYWN0aW9uPWlzRnVuY3Rpb24/ImFjY2Vzc2luZyB0aGUgbWV0aG9kIjoiYWNj ZXNzaW5nIHRoZSBwcm9wZXJ0eSI7dmFyIHJlc3VsdD1pc0Z1bmN0aW9uPyJUaGlzIGlzIGEgbm8t b3AgZnVuY3Rpb24iOiJUaGlzIGlzIHNldCB0byBudWxsIjt3YXJuKGFjdGlvbixyZXN1bHQpO3Jl dHVybiBnZXRWYWx9ZnVuY3Rpb24gd2FybihhY3Rpb24scmVzdWx0KXt2YXIgd2FybmluZ0NvbmRp dGlvbj1mYWxzZTsiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP3dhcm5pbmcod2FybmluZ0Nv bmRpdGlvbiwiVGhpcyBzeW50aGV0aWMgZXZlbnQgaXMgcmV1c2VkIGZvciBwZXJmb3JtYW5jZSBy ZWFzb25zLiBJZiB5b3UncmUgc2VlaW5nIHRoaXMsICIrInlvdSdyZSAlcyBgJXNgIG9uIGEgcmVs ZWFzZWQvbnVsbGlmaWVkIHN5bnRoZXRpYyBldmVudC4gJXMuICIrIklmIHlvdSBtdXN0IGtlZXAg dGhlIG9yaWdpbmFsIHN5bnRoZXRpYyBldmVudCBhcm91bmQsIHVzZSBldmVudC5wZXJzaXN0KCku ICIrIlNlZSBodHRwczovL2ZiLm1lL3JlYWN0LWV2ZW50LXBvb2xpbmcgZm9yIG1vcmUgaW5mb3Jt YXRpb24uIixhY3Rpb24scHJvcE5hbWUscmVzdWx0KTp2b2lkIDB9fX0sezE0MjoxNDIsMTU3OjE1 NywxNTg6MTU4LDI1OjI1fV0sOTI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1 c2Ugc3RyaWN0Ijt2YXIgU3ludGhldGljVUlFdmVudD1fZGVyZXFfKDk4KTt2YXIgRm9jdXNFdmVu dEludGVyZmFjZT17cmVsYXRlZFRhcmdldDpudWxsfTtmdW5jdGlvbiBTeW50aGV0aWNGb2N1c0V2 ZW50KGRpc3BhdGNoQ29uZmlnLGRpc3BhdGNoTWFya2VyLG5hdGl2ZUV2ZW50LG5hdGl2ZUV2ZW50 VGFyZ2V0KXtyZXR1cm4gU3ludGhldGljVUlFdmVudC5jYWxsKHRoaXMsZGlzcGF0Y2hDb25maWcs ZGlzcGF0Y2hNYXJrZXIsbmF0aXZlRXZlbnQsbmF0aXZlRXZlbnRUYXJnZXQpfVN5bnRoZXRpY1VJ RXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY0ZvY3VzRXZlbnQsRm9jdXNFdmVudEludGVyZmFj ZSk7bW9kdWxlLmV4cG9ydHM9U3ludGhldGljRm9jdXNFdmVudH0sezk4Ojk4fV0sOTM6W2Z1bmN0 aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgU3ludGhldGljRXZl bnQ9X2RlcmVxXyg5MSk7dmFyIElucHV0RXZlbnRJbnRlcmZhY2U9e2RhdGE6bnVsbH07ZnVuY3Rp b24gU3ludGhldGljSW5wdXRFdmVudChkaXNwYXRjaENvbmZpZyxkaXNwYXRjaE1hcmtlcixuYXRp dmVFdmVudCxuYXRpdmVFdmVudFRhcmdldCl7cmV0dXJuIFN5bnRoZXRpY0V2ZW50LmNhbGwodGhp cyxkaXNwYXRjaENvbmZpZyxkaXNwYXRjaE1hcmtlcixuYXRpdmVFdmVudCxuYXRpdmVFdmVudFRh cmdldCl9U3ludGhldGljRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY0lucHV0RXZlbnQsSW5w dXRFdmVudEludGVyZmFjZSk7bW9kdWxlLmV4cG9ydHM9U3ludGhldGljSW5wdXRFdmVudH0sezkx OjkxfV0sOTQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2 YXIgU3ludGhldGljVUlFdmVudD1fZGVyZXFfKDk4KTt2YXIgZ2V0RXZlbnRDaGFyQ29kZT1fZGVy ZXFfKDExMSk7dmFyIGdldEV2ZW50S2V5PV9kZXJlcV8oMTEyKTt2YXIgZ2V0RXZlbnRNb2RpZmll clN0YXRlPV9kZXJlcV8oMTEzKTt2YXIgS2V5Ym9hcmRFdmVudEludGVyZmFjZT17a2V5OmdldEV2 ZW50S2V5LGxvY2F0aW9uOm51bGwsY3RybEtleTpudWxsLHNoaWZ0S2V5Om51bGwsYWx0S2V5Om51 bGwsbWV0YUtleTpudWxsLHJlcGVhdDpudWxsLGxvY2FsZTpudWxsLGdldE1vZGlmaWVyU3RhdGU6 Z2V0RXZlbnRNb2RpZmllclN0YXRlLGNoYXJDb2RlOmZ1bmN0aW9uKGV2ZW50KXtpZihldmVudC50 eXBlPT09ImtleXByZXNzIil7cmV0dXJuIGdldEV2ZW50Q2hhckNvZGUoZXZlbnQpfXJldHVybiAw fSxrZXlDb2RlOmZ1bmN0aW9uKGV2ZW50KXtpZihldmVudC50eXBlPT09ImtleWRvd24ifHxldmVu dC50eXBlPT09ImtleXVwIil7cmV0dXJuIGV2ZW50LmtleUNvZGV9cmV0dXJuIDB9LHdoaWNoOmZ1 bmN0aW9uKGV2ZW50KXtpZihldmVudC50eXBlPT09ImtleXByZXNzIil7cmV0dXJuIGdldEV2ZW50 Q2hhckNvZGUoZXZlbnQpfWlmKGV2ZW50LnR5cGU9PT0ia2V5ZG93biJ8fGV2ZW50LnR5cGU9PT0i a2V5dXAiKXtyZXR1cm4gZXZlbnQua2V5Q29kZX1yZXR1cm4gMH19O2Z1bmN0aW9uIFN5bnRoZXRp Y0tleWJvYXJkRXZlbnQoZGlzcGF0Y2hDb25maWcsZGlzcGF0Y2hNYXJrZXIsbmF0aXZlRXZlbnQs bmF0aXZlRXZlbnRUYXJnZXQpe3JldHVybiBTeW50aGV0aWNVSUV2ZW50LmNhbGwodGhpcyxkaXNw YXRjaENvbmZpZyxkaXNwYXRjaE1hcmtlcixuYXRpdmVFdmVudCxuYXRpdmVFdmVudFRhcmdldCl9 U3ludGhldGljVUlFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGljS2V5Ym9hcmRFdmVudCxLZXli b2FyZEV2ZW50SW50ZXJmYWNlKTttb2R1bGUuZXhwb3J0cz1TeW50aGV0aWNLZXlib2FyZEV2ZW50 fSx7MTExOjExMSwxMTI6MTEyLDExMzoxMTMsOTg6OTh9XSw5NTpbZnVuY3Rpb24oX2RlcmVxXyxt b2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBTeW50aGV0aWNVSUV2ZW50PV9kZXJlcV8o OTgpO3ZhciBWaWV3cG9ydE1ldHJpY3M9X2RlcmVxXygxMDEpO3ZhciBnZXRFdmVudE1vZGlmaWVy U3RhdGU9X2RlcmVxXygxMTMpO3ZhciBNb3VzZUV2ZW50SW50ZXJmYWNlPXtzY3JlZW5YOm51bGws c2NyZWVuWTpudWxsLGNsaWVudFg6bnVsbCxjbGllbnRZOm51bGwsY3RybEtleTpudWxsLHNoaWZ0 S2V5Om51bGwsYWx0S2V5Om51bGwsbWV0YUtleTpudWxsLGdldE1vZGlmaWVyU3RhdGU6Z2V0RXZl bnRNb2RpZmllclN0YXRlLGJ1dHRvbjpmdW5jdGlvbihldmVudCl7dmFyIGJ1dHRvbj1ldmVudC5i dXR0b247aWYoIndoaWNoImluIGV2ZW50KXtyZXR1cm4gYnV0dG9ufXJldHVybiBidXR0b249PT0y PzI6YnV0dG9uPT09ND8xOjB9LGJ1dHRvbnM6bnVsbCxyZWxhdGVkVGFyZ2V0OmZ1bmN0aW9uKGV2 ZW50KXtyZXR1cm4gZXZlbnQucmVsYXRlZFRhcmdldHx8KGV2ZW50LmZyb21FbGVtZW50PT09ZXZl bnQuc3JjRWxlbWVudD9ldmVudC50b0VsZW1lbnQ6ZXZlbnQuZnJvbUVsZW1lbnQpfSxwYWdlWDpm dW5jdGlvbihldmVudCl7cmV0dXJuInBhZ2VYImluIGV2ZW50P2V2ZW50LnBhZ2VYOmV2ZW50LmNs aWVudFgrVmlld3BvcnRNZXRyaWNzLmN1cnJlbnRTY3JvbGxMZWZ0fSxwYWdlWTpmdW5jdGlvbihl dmVudCl7cmV0dXJuInBhZ2VZImluIGV2ZW50P2V2ZW50LnBhZ2VZOmV2ZW50LmNsaWVudFkrVmll d3BvcnRNZXRyaWNzLmN1cnJlbnRTY3JvbGxUb3B9fTtmdW5jdGlvbiBTeW50aGV0aWNNb3VzZUV2 ZW50KGRpc3BhdGNoQ29uZmlnLGRpc3BhdGNoTWFya2VyLG5hdGl2ZUV2ZW50LG5hdGl2ZUV2ZW50 VGFyZ2V0KXtyZXR1cm4gU3ludGhldGljVUlFdmVudC5jYWxsKHRoaXMsZGlzcGF0Y2hDb25maWcs ZGlzcGF0Y2hNYXJrZXIsbmF0aXZlRXZlbnQsbmF0aXZlRXZlbnRUYXJnZXQpfVN5bnRoZXRpY1VJ RXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY01vdXNlRXZlbnQsTW91c2VFdmVudEludGVyZmFj ZSk7bW9kdWxlLmV4cG9ydHM9U3ludGhldGljTW91c2VFdmVudH0sezEwMToxMDEsMTEzOjExMyw5 ODo5OH1dLDk2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7 dmFyIFN5bnRoZXRpY1VJRXZlbnQ9X2RlcmVxXyg5OCk7dmFyIGdldEV2ZW50TW9kaWZpZXJTdGF0 ZT1fZGVyZXFfKDExMyk7dmFyIFRvdWNoRXZlbnRJbnRlcmZhY2U9e3RvdWNoZXM6bnVsbCx0YXJn ZXRUb3VjaGVzOm51bGwsY2hhbmdlZFRvdWNoZXM6bnVsbCxhbHRLZXk6bnVsbCxtZXRhS2V5Om51 bGwsY3RybEtleTpudWxsLHNoaWZ0S2V5Om51bGwsZ2V0TW9kaWZpZXJTdGF0ZTpnZXRFdmVudE1v ZGlmaWVyU3RhdGV9O2Z1bmN0aW9uIFN5bnRoZXRpY1RvdWNoRXZlbnQoZGlzcGF0Y2hDb25maWcs ZGlzcGF0Y2hNYXJrZXIsbmF0aXZlRXZlbnQsbmF0aXZlRXZlbnRUYXJnZXQpe3JldHVybiBTeW50 aGV0aWNVSUV2ZW50LmNhbGwodGhpcyxkaXNwYXRjaENvbmZpZyxkaXNwYXRjaE1hcmtlcixuYXRp dmVFdmVudCxuYXRpdmVFdmVudFRhcmdldCl9U3ludGhldGljVUlFdmVudC5hdWdtZW50Q2xhc3Mo U3ludGhldGljVG91Y2hFdmVudCxUb3VjaEV2ZW50SW50ZXJmYWNlKTttb2R1bGUuZXhwb3J0cz1T eW50aGV0aWNUb3VjaEV2ZW50fSx7MTEzOjExMyw5ODo5OH1dLDk3OltmdW5jdGlvbihfZGVyZXFf LG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIFN5bnRoZXRpY0V2ZW50PV9kZXJlcV8o OTEpO3ZhciBUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2U9e3Byb3BlcnR5TmFtZTpudWxsLGVsYXBz ZWRUaW1lOm51bGwscHNldWRvRWxlbWVudDpudWxsfTtmdW5jdGlvbiBTeW50aGV0aWNUcmFuc2l0 aW9uRXZlbnQoZGlzcGF0Y2hDb25maWcsZGlzcGF0Y2hNYXJrZXIsbmF0aXZlRXZlbnQsbmF0aXZl RXZlbnRUYXJnZXQpe3JldHVybiBTeW50aGV0aWNFdmVudC5jYWxsKHRoaXMsZGlzcGF0Y2hDb25m aWcsZGlzcGF0Y2hNYXJrZXIsbmF0aXZlRXZlbnQsbmF0aXZlRXZlbnRUYXJnZXQpfVN5bnRoZXRp Y0V2ZW50LmF1Z21lbnRDbGFzcyhTeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQsVHJhbnNpdGlvbkV2 ZW50SW50ZXJmYWNlKTttb2R1bGUuZXhwb3J0cz1TeW50aGV0aWNUcmFuc2l0aW9uRXZlbnR9LHs5 MTo5MX1dLDk4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7 dmFyIFN5bnRoZXRpY0V2ZW50PV9kZXJlcV8oOTEpO3ZhciBnZXRFdmVudFRhcmdldD1fZGVyZXFf KDExNCk7dmFyIFVJRXZlbnRJbnRlcmZhY2U9e3ZpZXc6ZnVuY3Rpb24oZXZlbnQpe2lmKGV2ZW50 LnZpZXcpe3JldHVybiBldmVudC52aWV3fXZhciB0YXJnZXQ9Z2V0RXZlbnRUYXJnZXQoZXZlbnQp O2lmKHRhcmdldC53aW5kb3c9PT10YXJnZXQpe3JldHVybiB0YXJnZXR9dmFyIGRvYz10YXJnZXQu b3duZXJEb2N1bWVudDtpZihkb2Mpe3JldHVybiBkb2MuZGVmYXVsdFZpZXd8fGRvYy5wYXJlbnRX aW5kb3d9ZWxzZXtyZXR1cm4gd2luZG93fX0sZGV0YWlsOmZ1bmN0aW9uKGV2ZW50KXtyZXR1cm4g ZXZlbnQuZGV0YWlsfHwwfX07ZnVuY3Rpb24gU3ludGhldGljVUlFdmVudChkaXNwYXRjaENvbmZp ZyxkaXNwYXRjaE1hcmtlcixuYXRpdmVFdmVudCxuYXRpdmVFdmVudFRhcmdldCl7cmV0dXJuIFN5 bnRoZXRpY0V2ZW50LmNhbGwodGhpcyxkaXNwYXRjaENvbmZpZyxkaXNwYXRjaE1hcmtlcixuYXRp dmVFdmVudCxuYXRpdmVFdmVudFRhcmdldCl9U3ludGhldGljRXZlbnQuYXVnbWVudENsYXNzKFN5 bnRoZXRpY1VJRXZlbnQsVUlFdmVudEludGVyZmFjZSk7bW9kdWxlLmV4cG9ydHM9U3ludGhldGlj VUlFdmVudH0sezExNDoxMTQsOTE6OTF9XSw5OTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhw b3J0cyl7InVzZSBzdHJpY3QiO3ZhciBTeW50aGV0aWNNb3VzZUV2ZW50PV9kZXJlcV8oOTUpO3Zh ciBXaGVlbEV2ZW50SW50ZXJmYWNlPXtkZWx0YVg6ZnVuY3Rpb24oZXZlbnQpe3JldHVybiJkZWx0 YVgiaW4gZXZlbnQ/ZXZlbnQuZGVsdGFYOiJ3aGVlbERlbHRhWCJpbiBldmVudD8tZXZlbnQud2hl ZWxEZWx0YVg6MH0sZGVsdGFZOmZ1bmN0aW9uKGV2ZW50KXtyZXR1cm4iZGVsdGFZImluIGV2ZW50 P2V2ZW50LmRlbHRhWToid2hlZWxEZWx0YVkiaW4gZXZlbnQ/LWV2ZW50LndoZWVsRGVsdGFZOiJ3 aGVlbERlbHRhImluIGV2ZW50Py1ldmVudC53aGVlbERlbHRhOjB9LGRlbHRhWjpudWxsLGRlbHRh TW9kZTpudWxsfTtmdW5jdGlvbiBTeW50aGV0aWNXaGVlbEV2ZW50KGRpc3BhdGNoQ29uZmlnLGRp c3BhdGNoTWFya2VyLG5hdGl2ZUV2ZW50LG5hdGl2ZUV2ZW50VGFyZ2V0KXtyZXR1cm4gU3ludGhl dGljTW91c2VFdmVudC5jYWxsKHRoaXMsZGlzcGF0Y2hDb25maWcsZGlzcGF0Y2hNYXJrZXIsbmF0 aXZlRXZlbnQsbmF0aXZlRXZlbnRUYXJnZXQpfVN5bnRoZXRpY01vdXNlRXZlbnQuYXVnbWVudENs YXNzKFN5bnRoZXRpY1doZWVsRXZlbnQsV2hlZWxFdmVudEludGVyZmFjZSk7bW9kdWxlLmV4cG9y dHM9U3ludGhldGljV2hlZWxFdmVudH0sezk1Ojk1fV0sMTAwOltmdW5jdGlvbihfZGVyZXFfLG1v ZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIF9wcm9kSW52YXJpYW50PV9kZXJlcV8oMTI1 KTt2YXIgaW52YXJpYW50PV9kZXJlcV8oMTUwKTt2YXIgT0JTRVJWRURfRVJST1I9e307dmFyIFRy YW5zYWN0aW9uSW1wbD17cmVpbml0aWFsaXplVHJhbnNhY3Rpb246ZnVuY3Rpb24oKXt0aGlzLnRy YW5zYWN0aW9uV3JhcHBlcnM9dGhpcy5nZXRUcmFuc2FjdGlvbldyYXBwZXJzKCk7aWYodGhpcy53 cmFwcGVySW5pdERhdGEpe3RoaXMud3JhcHBlckluaXREYXRhLmxlbmd0aD0wfWVsc2V7dGhpcy53 cmFwcGVySW5pdERhdGE9W119dGhpcy5faXNJblRyYW5zYWN0aW9uPWZhbHNlfSxfaXNJblRyYW5z YWN0aW9uOmZhbHNlLGdldFRyYW5zYWN0aW9uV3JhcHBlcnM6bnVsbCxpc0luVHJhbnNhY3Rpb246 ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuX2lzSW5UcmFuc2FjdGlvbn0scGVyZm9ybTpmdW5jdGlv bihtZXRob2Qsc2NvcGUsYSxiLGMsZCxlLGYpeyEhdGhpcy5pc0luVHJhbnNhY3Rpb24oKT8iZGV2 ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiVHJhbnNhY3Rpb24ucGVy Zm9ybSguLi4pOiBDYW5ub3QgaW5pdGlhbGl6ZSBhIHRyYW5zYWN0aW9uIHdoZW4gdGhlcmUgaXMg YWxyZWFkeSBhbiBvdXRzdGFuZGluZyB0cmFuc2FjdGlvbi4iKTpfcHJvZEludmFyaWFudCgiMjci KTp2b2lkIDA7dmFyIGVycm9yVGhyb3duO3ZhciByZXQ7dHJ5e3RoaXMuX2lzSW5UcmFuc2FjdGlv bj10cnVlO2Vycm9yVGhyb3duPXRydWU7dGhpcy5pbml0aWFsaXplQWxsKDApO3JldD1tZXRob2Qu Y2FsbChzY29wZSxhLGIsYyxkLGUsZik7ZXJyb3JUaHJvd249ZmFsc2V9ZmluYWxseXt0cnl7aWYo ZXJyb3JUaHJvd24pe3RyeXt0aGlzLmNsb3NlQWxsKDApfWNhdGNoKGVycil7fX1lbHNle3RoaXMu Y2xvc2VBbGwoMCl9fWZpbmFsbHl7dGhpcy5faXNJblRyYW5zYWN0aW9uPWZhbHNlfX1yZXR1cm4g cmV0fSxpbml0aWFsaXplQWxsOmZ1bmN0aW9uKHN0YXJ0SW5kZXgpe3ZhciB0cmFuc2FjdGlvbldy YXBwZXJzPXRoaXMudHJhbnNhY3Rpb25XcmFwcGVycztmb3IodmFyIGk9c3RhcnRJbmRleDtpPHRy YW5zYWN0aW9uV3JhcHBlcnMubGVuZ3RoO2krKyl7dmFyIHdyYXBwZXI9dHJhbnNhY3Rpb25XcmFw cGVyc1tpXTt0cnl7dGhpcy53cmFwcGVySW5pdERhdGFbaV09T0JTRVJWRURfRVJST1I7dGhpcy53 cmFwcGVySW5pdERhdGFbaV09d3JhcHBlci5pbml0aWFsaXplP3dyYXBwZXIuaW5pdGlhbGl6ZS5j YWxsKHRoaXMpOm51bGx9ZmluYWxseXtpZih0aGlzLndyYXBwZXJJbml0RGF0YVtpXT09PU9CU0VS VkVEX0VSUk9SKXt0cnl7dGhpcy5pbml0aWFsaXplQWxsKGkrMSl9Y2F0Y2goZXJyKXt9fX19fSxj bG9zZUFsbDpmdW5jdGlvbihzdGFydEluZGV4KXshdGhpcy5pc0luVHJhbnNhY3Rpb24oKT8iZGV2 ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwiVHJhbnNhY3Rpb24uY2xv c2VBbGwoKTogQ2Fubm90IGNsb3NlIHRyYW5zYWN0aW9uIHdoZW4gbm9uZSBhcmUgb3Blbi4iKTpf cHJvZEludmFyaWFudCgiMjgiKTp2b2lkIDA7dmFyIHRyYW5zYWN0aW9uV3JhcHBlcnM9dGhpcy50 cmFuc2FjdGlvbldyYXBwZXJzO2Zvcih2YXIgaT1zdGFydEluZGV4O2k8dHJhbnNhY3Rpb25XcmFw cGVycy5sZW5ndGg7aSsrKXt2YXIgd3JhcHBlcj10cmFuc2FjdGlvbldyYXBwZXJzW2ldO3ZhciBp bml0RGF0YT10aGlzLndyYXBwZXJJbml0RGF0YVtpXTt2YXIgZXJyb3JUaHJvd247dHJ5e2Vycm9y VGhyb3duPXRydWU7aWYoaW5pdERhdGEhPT1PQlNFUlZFRF9FUlJPUiYmd3JhcHBlci5jbG9zZSl7 d3JhcHBlci5jbG9zZS5jYWxsKHRoaXMsaW5pdERhdGEpfWVycm9yVGhyb3duPWZhbHNlfWZpbmFs bHl7aWYoZXJyb3JUaHJvd24pe3RyeXt0aGlzLmNsb3NlQWxsKGkrMSl9Y2F0Y2goZSl7fX19fXRo aXMud3JhcHBlckluaXREYXRhLmxlbmd0aD0wfX07bW9kdWxlLmV4cG9ydHM9VHJhbnNhY3Rpb25J bXBsfSx7MTI1OjEyNSwxNTA6MTUwfV0sMTAxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBv cnRzKXsidXNlIHN0cmljdCI7dmFyIFZpZXdwb3J0TWV0cmljcz17Y3VycmVudFNjcm9sbExlZnQ6 MCxjdXJyZW50U2Nyb2xsVG9wOjAscmVmcmVzaFNjcm9sbFZhbHVlczpmdW5jdGlvbihzY3JvbGxQ b3NpdGlvbil7Vmlld3BvcnRNZXRyaWNzLmN1cnJlbnRTY3JvbGxMZWZ0PXNjcm9sbFBvc2l0aW9u Lng7Vmlld3BvcnRNZXRyaWNzLmN1cnJlbnRTY3JvbGxUb3A9c2Nyb2xsUG9zaXRpb24ueX19O21v ZHVsZS5leHBvcnRzPVZpZXdwb3J0TWV0cmljc30se31dLDEwMjpbZnVuY3Rpb24oX2RlcmVxXyxt b2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBfcHJvZEludmFyaWFudD1fZGVyZXFfKDEy NSk7dmFyIGludmFyaWFudD1fZGVyZXFfKDE1MCk7ZnVuY3Rpb24gYWNjdW11bGF0ZUludG8oY3Vy cmVudCxuZXh0KXshKG5leHQhPW51bGwpPyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/aW52 YXJpYW50KGZhbHNlLCJhY2N1bXVsYXRlSW50byguLi4pOiBBY2N1bXVsYXRlZCBpdGVtcyBtdXN0 IG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4iKTpfcHJvZEludmFyaWFudCgiMzAiKTp2b2lkIDA7 aWYoY3VycmVudD09bnVsbCl7cmV0dXJuIG5leHR9aWYoQXJyYXkuaXNBcnJheShjdXJyZW50KSl7 aWYoQXJyYXkuaXNBcnJheShuZXh0KSl7Y3VycmVudC5wdXNoLmFwcGx5KGN1cnJlbnQsbmV4dCk7 cmV0dXJuIGN1cnJlbnR9Y3VycmVudC5wdXNoKG5leHQpO3JldHVybiBjdXJyZW50fWlmKEFycmF5 LmlzQXJyYXkobmV4dCkpe3JldHVybltjdXJyZW50XS5jb25jYXQobmV4dCl9cmV0dXJuW2N1cnJl bnQsbmV4dF19bW9kdWxlLmV4cG9ydHM9YWNjdW11bGF0ZUludG99LHsxMjU6MTI1LDE1MDoxNTB9 XSwxMDM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIg TU9EPTY1NTIxO2Z1bmN0aW9uIGFkbGVyMzIoZGF0YSl7dmFyIGE9MTt2YXIgYj0wO3ZhciBpPTA7 dmFyIGw9ZGF0YS5sZW5ndGg7dmFyIG09bCZ+Mzt3aGlsZShpPG0pe3ZhciBuPU1hdGgubWluKGkr NDA5NixtKTtmb3IoO2k8bjtpKz00KXtiKz0oYSs9ZGF0YS5jaGFyQ29kZUF0KGkpKSsoYSs9ZGF0 YS5jaGFyQ29kZUF0KGkrMSkpKyhhKz1kYXRhLmNoYXJDb2RlQXQoaSsyKSkrKGErPWRhdGEuY2hh ckNvZGVBdChpKzMpKX1hJT1NT0Q7YiU9TU9EfWZvcig7aTxsO2krKyl7Yis9YSs9ZGF0YS5jaGFy Q29kZUF0KGkpfWElPU1PRDtiJT1NT0Q7cmV0dXJuIGF8Yjw8MTZ9bW9kdWxlLmV4cG9ydHM9YWRs ZXIzMn0se31dLDEwNDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9u KHByb2Nlc3MpeyJ1c2Ugc3RyaWN0Ijt2YXIgX3Byb2RJbnZhcmlhbnQ9X2RlcmVxXygxMjUpO3Zh ciBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcz1fZGVyZXFfKDcyKTt2YXIgUmVhY3RQcm9wVHlw ZXNTZWNyZXQ9X2RlcmVxXyg3Myk7dmFyIGludmFyaWFudD1fZGVyZXFfKDE1MCk7dmFyIHdhcm5p bmc9X2RlcmVxXygxNTcpO3ZhciBSZWFjdENvbXBvbmVudFRyZWVIb29rO2lmKHR5cGVvZiBwcm9j ZXNzIT09InVuZGVmaW5lZCImJnByb2Nlc3MuZW52JiYiZGV2ZWxvcG1lbnQiPT09InRlc3QiKXtS ZWFjdENvbXBvbmVudFRyZWVIb29rPV9kZXJlcV8oMTMyKX12YXIgbG9nZ2VkVHlwZUZhaWx1cmVz PXt9O2Z1bmN0aW9uIGNoZWNrUmVhY3RUeXBlU3BlYyh0eXBlU3BlY3MsdmFsdWVzLGxvY2F0aW9u LGNvbXBvbmVudE5hbWUsZWxlbWVudCxkZWJ1Z0lEKXtmb3IodmFyIHR5cGVTcGVjTmFtZSBpbiB0 eXBlU3BlY3Mpe2lmKHR5cGVTcGVjcy5oYXNPd25Qcm9wZXJ0eSh0eXBlU3BlY05hbWUpKXt2YXIg ZXJyb3I7dHJ5eyEodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdPT09ImZ1bmN0aW9uIik/ ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsIiVzOiAlcyB0eXBl IGAlc2AgaXMgaW52YWxpZDsgaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gUmVh Y3QuUHJvcFR5cGVzLiIsY29tcG9uZW50TmFtZXx8IlJlYWN0IGNsYXNzIixSZWFjdFByb3BUeXBl TG9jYXRpb25OYW1lc1tsb2NhdGlvbl0sdHlwZVNwZWNOYW1lKTpfcHJvZEludmFyaWFudCgiODQi LGNvbXBvbmVudE5hbWV8fCJSZWFjdCBjbGFzcyIsUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNb bG9jYXRpb25dLHR5cGVTcGVjTmFtZSk6dm9pZCAwO2Vycm9yPXR5cGVTcGVjc1t0eXBlU3BlY05h bWVdKHZhbHVlcyx0eXBlU3BlY05hbWUsY29tcG9uZW50TmFtZSxsb2NhdGlvbixudWxsLFJlYWN0 UHJvcFR5cGVzU2VjcmV0KX1jYXRjaChleCl7ZXJyb3I9ZXh9ImRldmVsb3BtZW50IiE9PSJwcm9k dWN0aW9uIj93YXJuaW5nKCFlcnJvcnx8ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciwiJXM6IHR5cGUg c3BlY2lmaWNhdGlvbiBvZiAlcyBgJXNgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgIisi ZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEg JXMuICIrIllvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUg dHlwZSBjaGVja2VyICIrImNyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBv bmVPZiwgb25lT2ZUeXBlLCBhbmQgIisic2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLiIs Y29tcG9uZW50TmFtZXx8IlJlYWN0IGNsYXNzIixSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1ts b2NhdGlvbl0sdHlwZVNwZWNOYW1lLHR5cGVvZiBlcnJvcik6dm9pZCAwO2lmKGVycm9yIGluc3Rh bmNlb2YgRXJyb3ImJiEoZXJyb3IubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKXtsb2dn ZWRUeXBlRmFpbHVyZXNbZXJyb3IubWVzc2FnZV09dHJ1ZTt2YXIgY29tcG9uZW50U3RhY2tJbmZv PSIiO2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe2lmKCFSZWFjdENvbXBvbmVudFRy ZWVIb29rKXtSZWFjdENvbXBvbmVudFRyZWVIb29rPV9kZXJlcV8oMTMyKX1pZihkZWJ1Z0lEIT09 bnVsbCl7Y29tcG9uZW50U3RhY2tJbmZvPVJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0U3RhY2tB ZGRlbmR1bUJ5SUQoZGVidWdJRCl9ZWxzZSBpZihlbGVtZW50IT09bnVsbCl7Y29tcG9uZW50U3Rh Y2tJbmZvPVJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0Q3VycmVudFN0YWNrQWRkZW5kdW0oZWxl bWVudCl9fSJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyhmYWxzZSwiRmFpbGVk ICVzIHR5cGU6ICVzJXMiLGxvY2F0aW9uLGVycm9yLm1lc3NhZ2UsY29tcG9uZW50U3RhY2tJbmZv KTp2b2lkIDB9fX19bW9kdWxlLmV4cG9ydHM9Y2hlY2tSZWFjdFR5cGVTcGVjfSkuY2FsbCh0aGlz LHVuZGVmaW5lZCl9LHsxMjU6MTI1LDEzMjoxMzIsMTUwOjE1MCwxNTc6MTU3LDcyOjcyLDczOjcz fV0sMTA1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFy IGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb249ZnVuY3Rpb24oZnVuYyl7aWYodHlw ZW9mIE1TQXBwIT09InVuZGVmaW5lZCImJk1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKXty ZXR1cm4gZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIsYXJnMyl7TVNBcHAuZXhlY1Vuc2FmZUxvY2Fs RnVuY3Rpb24oZnVuY3Rpb24oKXtyZXR1cm4gZnVuYyhhcmcwLGFyZzEsYXJnMixhcmczKX0pfX1l bHNle3JldHVybiBmdW5jfX07bW9kdWxlLmV4cG9ydHM9Y3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9j YWxGdW5jdGlvbn0se31dLDEwNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVz ZSBzdHJpY3QiO3ZhciBDU1NQcm9wZXJ0eT1fZGVyZXFfKDQpO3ZhciB3YXJuaW5nPV9kZXJlcV8o MTU3KTt2YXIgaXNVbml0bGVzc051bWJlcj1DU1NQcm9wZXJ0eS5pc1VuaXRsZXNzTnVtYmVyO3Zh ciBzdHlsZVdhcm5pbmdzPXt9O2Z1bmN0aW9uIGRhbmdlcm91c1N0eWxlVmFsdWUobmFtZSx2YWx1 ZSxjb21wb25lbnQpe3ZhciBpc0VtcHR5PXZhbHVlPT1udWxsfHx0eXBlb2YgdmFsdWU9PT0iYm9v bGVhbiJ8fHZhbHVlPT09IiI7aWYoaXNFbXB0eSl7cmV0dXJuIiJ9dmFyIGlzTm9uTnVtZXJpYz1p c05hTih2YWx1ZSk7aWYoaXNOb25OdW1lcmljfHx2YWx1ZT09PTB8fGlzVW5pdGxlc3NOdW1iZXIu aGFzT3duUHJvcGVydHkobmFtZSkmJmlzVW5pdGxlc3NOdW1iZXJbbmFtZV0pe3JldHVybiIiK3Zh bHVlfWlmKHR5cGVvZiB2YWx1ZT09PSJzdHJpbmciKXtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1 Y3Rpb24iKXtpZihjb21wb25lbnQmJnZhbHVlIT09IjAiKXt2YXIgb3duZXI9Y29tcG9uZW50Ll9j dXJyZW50RWxlbWVudC5fb3duZXI7dmFyIG93bmVyTmFtZT1vd25lcj9vd25lci5nZXROYW1lKCk6 bnVsbDtpZihvd25lck5hbWUmJiFzdHlsZVdhcm5pbmdzW293bmVyTmFtZV0pe3N0eWxlV2Fybmlu Z3Nbb3duZXJOYW1lXT17fX12YXIgd2FybmVkPWZhbHNlO2lmKG93bmVyTmFtZSl7dmFyIHdhcm5p bmdzPXN0eWxlV2FybmluZ3Nbb3duZXJOYW1lXTt3YXJuZWQ9d2FybmluZ3NbbmFtZV07aWYoIXdh cm5lZCl7d2FybmluZ3NbbmFtZV09dHJ1ZX19aWYoIXdhcm5lZCl7ImRldmVsb3BtZW50IiE9PSJw cm9kdWN0aW9uIj93YXJuaW5nKGZhbHNlLCJhIGAlc2AgdGFnIChvd25lcjogYCVzYCkgd2FzIHBh c3NlZCBhIG51bWVyaWMgc3RyaW5nIHZhbHVlICIrImZvciBDU1MgcHJvcGVydHkgYCVzYCAodmFs dWU6IGAlc2ApIHdoaWNoIHdpbGwgYmUgdHJlYXRlZCAiKyJhcyBhIHVuaXRsZXNzIG51bWJlciBp biBhIGZ1dHVyZSB2ZXJzaW9uIG9mIFJlYWN0LiIsY29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC50 eXBlLG93bmVyTmFtZXx8InVua25vd24iLG5hbWUsdmFsdWUpOnZvaWQgMH19fXZhbHVlPXZhbHVl LnRyaW0oKX1yZXR1cm4gdmFsdWUrInB4In1tb2R1bGUuZXhwb3J0cz1kYW5nZXJvdXNTdHlsZVZh bHVlfSx7MTU3OjE1Nyw0OjR9XSwxMDc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMp eyJ1c2Ugc3RyaWN0Ijt2YXIgbWF0Y2hIdG1sUmVnRXhwPS9bIicmPD5dLztmdW5jdGlvbiBlc2Nh cGVIdG1sKHN0cmluZyl7dmFyIHN0cj0iIitzdHJpbmc7dmFyIG1hdGNoPW1hdGNoSHRtbFJlZ0V4 cC5leGVjKHN0cik7aWYoIW1hdGNoKXtyZXR1cm4gc3RyfXZhciBlc2NhcGU7dmFyIGh0bWw9IiI7 dmFyIGluZGV4PTA7dmFyIGxhc3RJbmRleD0wO2ZvcihpbmRleD1tYXRjaC5pbmRleDtpbmRleDxz dHIubGVuZ3RoO2luZGV4Kyspe3N3aXRjaChzdHIuY2hhckNvZGVBdChpbmRleCkpe2Nhc2UgMzQ6 ZXNjYXBlPSImcXVvdDsiO2JyZWFrO2Nhc2UgMzg6ZXNjYXBlPSImYW1wOyI7YnJlYWs7Y2FzZSAz OTplc2NhcGU9IiYjeDI3OyI7YnJlYWs7Y2FzZSA2MDplc2NhcGU9IiZsdDsiO2JyZWFrO2Nhc2Ug NjI6ZXNjYXBlPSImZ3Q7IjticmVhaztkZWZhdWx0OmNvbnRpbnVlfWlmKGxhc3RJbmRleCE9PWlu ZGV4KXtodG1sKz1zdHIuc3Vic3RyaW5nKGxhc3RJbmRleCxpbmRleCl9bGFzdEluZGV4PWluZGV4 KzE7aHRtbCs9ZXNjYXBlfXJldHVybiBsYXN0SW5kZXghPT1pbmRleD9odG1sK3N0ci5zdWJzdHJp bmcobGFzdEluZGV4LGluZGV4KTpodG1sfWZ1bmN0aW9uIGVzY2FwZVRleHRDb250ZW50Rm9yQnJv d3Nlcih0ZXh0KXtpZih0eXBlb2YgdGV4dD09PSJib29sZWFuInx8dHlwZW9mIHRleHQ9PT0ibnVt YmVyIil7cmV0dXJuIiIrdGV4dH1yZXR1cm4gZXNjYXBlSHRtbCh0ZXh0KX1tb2R1bGUuZXhwb3J0 cz1lc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXJ9LHt9XSwxMDg6W2Z1bmN0aW9uKF9kZXJlcV8s bW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgX3Byb2RJbnZhcmlhbnQ9X2RlcmVxXygx MjUpO3ZhciBSZWFjdEN1cnJlbnRPd25lcj1fZGVyZXFfKDEzMyk7dmFyIFJlYWN0RE9NQ29tcG9u ZW50VHJlZT1fZGVyZXFfKDM0KTt2YXIgUmVhY3RJbnN0YW5jZU1hcD1fZGVyZXFfKDYzKTt2YXIg Z2V0SG9zdENvbXBvbmVudEZyb21Db21wb3NpdGU9X2RlcmVxXygxMTUpO3ZhciBpbnZhcmlhbnQ9 X2RlcmVxXygxNTApO3ZhciB3YXJuaW5nPV9kZXJlcV8oMTU3KTtmdW5jdGlvbiBmaW5kRE9NTm9k ZShjb21wb25lbnRPckVsZW1lbnQpe2lmKCJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe3Zh ciBvd25lcj1SZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O2lmKG93bmVyIT09bnVsbCl7ImRldmVs b3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKG93bmVyLl93YXJuZWRBYm91dFJlZnNJblJl bmRlciwiJXMgaXMgYWNjZXNzaW5nIGZpbmRET01Ob2RlIGluc2lkZSBpdHMgcmVuZGVyKCkuICIr InJlbmRlcigpIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlLiBJ dCBzaG91bGQgIisibmV2ZXIgYWNjZXNzIHNvbWV0aGluZyB0aGF0IHJlcXVpcmVzIHN0YWxlIGRh dGEgZnJvbSB0aGUgcHJldmlvdXMgIisicmVuZGVyLCBzdWNoIGFzIHJlZnMuIE1vdmUgdGhpcyBs b2dpYyB0byBjb21wb25lbnREaWRNb3VudCBhbmQgIisiY29tcG9uZW50RGlkVXBkYXRlIGluc3Rl YWQuIixvd25lci5nZXROYW1lKCl8fCJBIGNvbXBvbmVudCIpOnZvaWQgMDtvd25lci5fd2FybmVk QWJvdXRSZWZzSW5SZW5kZXI9dHJ1ZX19aWYoY29tcG9uZW50T3JFbGVtZW50PT1udWxsKXtyZXR1 cm4gbnVsbH1pZihjb21wb25lbnRPckVsZW1lbnQubm9kZVR5cGU9PT0xKXtyZXR1cm4gY29tcG9u ZW50T3JFbGVtZW50fXZhciBpbnN0PVJlYWN0SW5zdGFuY2VNYXAuZ2V0KGNvbXBvbmVudE9yRWxl bWVudCk7aWYoaW5zdCl7aW5zdD1nZXRIb3N0Q29tcG9uZW50RnJvbUNvbXBvc2l0ZShpbnN0KTty ZXR1cm4gaW5zdD9SZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0 KTpudWxsfWlmKHR5cGVvZiBjb21wb25lbnRPckVsZW1lbnQucmVuZGVyPT09ImZ1bmN0aW9uIil7 IWZhbHNlPyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJmaW5k RE9NTm9kZSB3YXMgY2FsbGVkIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuIik6X3Byb2RJbnZh cmlhbnQoIjQ0Iik6dm9pZCAwfWVsc2V7IWZhbHNlPyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlv biI/aW52YXJpYW50KGZhbHNlLCJFbGVtZW50IGFwcGVhcnMgdG8gYmUgbmVpdGhlciBSZWFjdENv bXBvbmVudCBub3IgRE9NTm9kZSAoa2V5czogJXMpIixPYmplY3Qua2V5cyhjb21wb25lbnRPckVs ZW1lbnQpKTpfcHJvZEludmFyaWFudCgiNDUiLE9iamVjdC5rZXlzKGNvbXBvbmVudE9yRWxlbWVu dCkpOnZvaWQgMH19bW9kdWxlLmV4cG9ydHM9ZmluZERPTU5vZGV9LHsxMTU6MTE1LDEyNToxMjUs MTMzOjEzMywxNTA6MTUwLDE1NzoxNTcsMzQ6MzQsNjM6NjN9XSwxMDk6W2Z1bmN0aW9uKF9kZXJl cV8sbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihwcm9jZXNzKXsidXNlIHN0cmljdCI7dmFyIEtl eUVzY2FwZVV0aWxzPV9kZXJlcV8oMjMpO3ZhciB0cmF2ZXJzZUFsbENoaWxkcmVuPV9kZXJlcV8o MTMwKTt2YXIgd2FybmluZz1fZGVyZXFfKDE1Nyk7dmFyIFJlYWN0Q29tcG9uZW50VHJlZUhvb2s7 aWYodHlwZW9mIHByb2Nlc3MhPT0idW5kZWZpbmVkIiYmcHJvY2Vzcy5lbnYmJiJkZXZlbG9wbWVu dCI9PT0idGVzdCIpe1JlYWN0Q29tcG9uZW50VHJlZUhvb2s9X2RlcmVxXygxMzIpfWZ1bmN0aW9u IGZsYXR0ZW5TaW5nbGVDaGlsZEludG9Db250ZXh0KHRyYXZlcnNlQ29udGV4dCxjaGlsZCxuYW1l LHNlbGZEZWJ1Z0lEKXtpZih0cmF2ZXJzZUNvbnRleHQmJnR5cGVvZiB0cmF2ZXJzZUNvbnRleHQ9 PT0ib2JqZWN0Iil7dmFyIHJlc3VsdD10cmF2ZXJzZUNvbnRleHQ7dmFyIGtleVVuaXF1ZT1yZXN1 bHRbbmFtZV09PT11bmRlZmluZWQ7aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7aWYo IVJlYWN0Q29tcG9uZW50VHJlZUhvb2spe1JlYWN0Q29tcG9uZW50VHJlZUhvb2s9X2RlcmVxXygx MzIpfWlmKCFrZXlVbmlxdWUpeyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/d2FybmluZyhm YWxzZSwiZmxhdHRlbkNoaWxkcmVuKC4uLik6IEVuY291bnRlcmVkIHR3byBjaGlsZHJlbiB3aXRo IHRoZSBzYW1lIGtleSwgIisiYCVzYC4gQ2hpbGQga2V5cyBtdXN0IGJlIHVuaXF1ZTsgd2hlbiB0 d28gY2hpbGRyZW4gc2hhcmUgYSBrZXksIG9ubHkgIisidGhlIGZpcnN0IGNoaWxkIHdpbGwgYmUg dXNlZC4lcyIsS2V5RXNjYXBlVXRpbHMudW5lc2NhcGUobmFtZSksUmVhY3RDb21wb25lbnRUcmVl SG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChzZWxmRGVidWdJRCkpOnZvaWQgMH19aWYoa2V5VW5p cXVlJiZjaGlsZCE9bnVsbCl7cmVzdWx0W25hbWVdPWNoaWxkfX19ZnVuY3Rpb24gZmxhdHRlbkNo aWxkcmVuKGNoaWxkcmVuLHNlbGZEZWJ1Z0lEKXtpZihjaGlsZHJlbj09bnVsbCl7cmV0dXJuIGNo aWxkcmVufXZhciByZXN1bHQ9e307aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7dHJh dmVyc2VBbGxDaGlsZHJlbihjaGlsZHJlbixmdW5jdGlvbih0cmF2ZXJzZUNvbnRleHQsY2hpbGQs bmFtZSl7cmV0dXJuIGZsYXR0ZW5TaW5nbGVDaGlsZEludG9Db250ZXh0KHRyYXZlcnNlQ29udGV4 dCxjaGlsZCxuYW1lLHNlbGZEZWJ1Z0lEKX0scmVzdWx0KX1lbHNle3RyYXZlcnNlQWxsQ2hpbGRy ZW4oY2hpbGRyZW4sZmxhdHRlblNpbmdsZUNoaWxkSW50b0NvbnRleHQscmVzdWx0KX1yZXR1cm4g cmVzdWx0fW1vZHVsZS5leHBvcnRzPWZsYXR0ZW5DaGlsZHJlbn0pLmNhbGwodGhpcyx1bmRlZmlu ZWQpfSx7MTMwOjEzMCwxMzI6MTMyLDE1NzoxNTcsMjM6MjN9XSwxMTA6W2Z1bmN0aW9uKF9kZXJl cV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBmb3JFYWNoQWNjdW11bGF0 ZWQoYXJyLGNiLHNjb3BlKXtpZihBcnJheS5pc0FycmF5KGFycikpe2Fyci5mb3JFYWNoKGNiLHNj b3BlKX1lbHNlIGlmKGFycil7Y2IuY2FsbChzY29wZSxhcnIpfX1tb2R1bGUuZXhwb3J0cz1mb3JF YWNoQWNjdW11bGF0ZWR9LHt9XSwxMTE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMp eyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KXt2YXIg Y2hhckNvZGU7dmFyIGtleUNvZGU9bmF0aXZlRXZlbnQua2V5Q29kZTtpZigiY2hhckNvZGUiaW4g bmF0aXZlRXZlbnQpe2NoYXJDb2RlPW5hdGl2ZUV2ZW50LmNoYXJDb2RlO2lmKGNoYXJDb2RlPT09 MCYma2V5Q29kZT09PTEzKXtjaGFyQ29kZT0xM319ZWxzZXtjaGFyQ29kZT1rZXlDb2RlfWlmKGNo YXJDb2RlPj0zMnx8Y2hhckNvZGU9PT0xMyl7cmV0dXJuIGNoYXJDb2RlfXJldHVybiAwfW1vZHVs ZS5leHBvcnRzPWdldEV2ZW50Q2hhckNvZGV9LHt9XSwxMTI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9k dWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZ2V0RXZlbnRDaGFyQ29kZT1fZGVyZXFfKDEx MSk7dmFyIG5vcm1hbGl6ZUtleT17RXNjOiJFc2NhcGUiLFNwYWNlYmFyOiIgIixMZWZ0OiJBcnJv d0xlZnQiLFVwOiJBcnJvd1VwIixSaWdodDoiQXJyb3dSaWdodCIsRG93bjoiQXJyb3dEb3duIixE ZWw6IkRlbGV0ZSIsV2luOiJPUyIsTWVudToiQ29udGV4dE1lbnUiLEFwcHM6IkNvbnRleHRNZW51 IixTY3JvbGw6IlNjcm9sbExvY2siLE1velByaW50YWJsZUtleToiVW5pZGVudGlmaWVkIn07dmFy IHRyYW5zbGF0ZVRvS2V5PXs4OiJCYWNrc3BhY2UiLDk6IlRhYiIsMTI6IkNsZWFyIiwxMzoiRW50 ZXIiLDE2OiJTaGlmdCIsMTc6IkNvbnRyb2wiLDE4OiJBbHQiLDE5OiJQYXVzZSIsMjA6IkNhcHNM b2NrIiwyNzoiRXNjYXBlIiwzMjoiICIsMzM6IlBhZ2VVcCIsMzQ6IlBhZ2VEb3duIiwzNToiRW5k IiwzNjoiSG9tZSIsMzc6IkFycm93TGVmdCIsMzg6IkFycm93VXAiLDM5OiJBcnJvd1JpZ2h0Iiw0 MDoiQXJyb3dEb3duIiw0NToiSW5zZXJ0Iiw0NjoiRGVsZXRlIiwxMTI6IkYxIiwxMTM6IkYyIiwx MTQ6IkYzIiwxMTU6IkY0IiwxMTY6IkY1IiwxMTc6IkY2IiwxMTg6IkY3IiwxMTk6IkY4IiwxMjA6 IkY5IiwxMjE6IkYxMCIsMTIyOiJGMTEiLDEyMzoiRjEyIiwxNDQ6Ik51bUxvY2siLDE0NToiU2Ny b2xsTG9jayIsMjI0OiJNZXRhIn07ZnVuY3Rpb24gZ2V0RXZlbnRLZXkobmF0aXZlRXZlbnQpe2lm KG5hdGl2ZUV2ZW50LmtleSl7dmFyIGtleT1ub3JtYWxpemVLZXlbbmF0aXZlRXZlbnQua2V5XXx8 bmF0aXZlRXZlbnQua2V5O2lmKGtleSE9PSJVbmlkZW50aWZpZWQiKXtyZXR1cm4ga2V5fX1pZihu YXRpdmVFdmVudC50eXBlPT09ImtleXByZXNzIil7dmFyIGNoYXJDb2RlPWdldEV2ZW50Q2hhckNv ZGUobmF0aXZlRXZlbnQpO3JldHVybiBjaGFyQ29kZT09PTEzPyJFbnRlciI6U3RyaW5nLmZyb21D aGFyQ29kZShjaGFyQ29kZSl9aWYobmF0aXZlRXZlbnQudHlwZT09PSJrZXlkb3duInx8bmF0aXZl RXZlbnQudHlwZT09PSJrZXl1cCIpe3JldHVybiB0cmFuc2xhdGVUb0tleVtuYXRpdmVFdmVudC5r ZXlDb2RlXXx8IlVuaWRlbnRpZmllZCJ9cmV0dXJuIiJ9bW9kdWxlLmV4cG9ydHM9Z2V0RXZlbnRL ZXl9LHsxMTE6MTExfV0sMTEzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNl IHN0cmljdCI7dmFyIG1vZGlmaWVyS2V5VG9Qcm9wPXtBbHQ6ImFsdEtleSIsQ29udHJvbDoiY3Ry bEtleSIsTWV0YToibWV0YUtleSIsU2hpZnQ6InNoaWZ0S2V5In07ZnVuY3Rpb24gbW9kaWZpZXJT dGF0ZUdldHRlcihrZXlBcmcpe3ZhciBzeW50aGV0aWNFdmVudD10aGlzO3ZhciBuYXRpdmVFdmVu dD1zeW50aGV0aWNFdmVudC5uYXRpdmVFdmVudDtpZihuYXRpdmVFdmVudC5nZXRNb2RpZmllclN0 YXRlKXtyZXR1cm4gbmF0aXZlRXZlbnQuZ2V0TW9kaWZpZXJTdGF0ZShrZXlBcmcpfXZhciBrZXlQ cm9wPW1vZGlmaWVyS2V5VG9Qcm9wW2tleUFyZ107cmV0dXJuIGtleVByb3A/ISFuYXRpdmVFdmVu dFtrZXlQcm9wXTpmYWxzZX1mdW5jdGlvbiBnZXRFdmVudE1vZGlmaWVyU3RhdGUobmF0aXZlRXZl bnQpe3JldHVybiBtb2RpZmllclN0YXRlR2V0dGVyfW1vZHVsZS5leHBvcnRzPWdldEV2ZW50TW9k aWZpZXJTdGF0ZX0se31dLDExNDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVz ZSBzdHJpY3QiO2Z1bmN0aW9uIGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KXt2YXIgdGFyZ2V0 PW5hdGl2ZUV2ZW50LnRhcmdldHx8bmF0aXZlRXZlbnQuc3JjRWxlbWVudHx8d2luZG93O2lmKHRh cmdldC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCl7dGFyZ2V0PXRhcmdldC5jb3JyZXNwb25kaW5n VXNlRWxlbWVudH1yZXR1cm4gdGFyZ2V0Lm5vZGVUeXBlPT09Mz90YXJnZXQucGFyZW50Tm9kZTp0 YXJnZXR9bW9kdWxlLmV4cG9ydHM9Z2V0RXZlbnRUYXJnZXR9LHt9XSwxMTU6W2Z1bmN0aW9uKF9k ZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgUmVhY3ROb2RlVHlwZXM9X2Rl cmVxXyg2OSk7ZnVuY3Rpb24gZ2V0SG9zdENvbXBvbmVudEZyb21Db21wb3NpdGUoaW5zdCl7dmFy IHR5cGU7d2hpbGUoKHR5cGU9aW5zdC5fcmVuZGVyZWROb2RlVHlwZSk9PT1SZWFjdE5vZGVUeXBl cy5DT01QT1NJVEUpe2luc3Q9aW5zdC5fcmVuZGVyZWRDb21wb25lbnR9aWYodHlwZT09PVJlYWN0 Tm9kZVR5cGVzLkhPU1Qpe3JldHVybiBpbnN0Ll9yZW5kZXJlZENvbXBvbmVudH1lbHNlIGlmKHR5 cGU9PT1SZWFjdE5vZGVUeXBlcy5FTVBUWSl7cmV0dXJuIG51bGx9fW1vZHVsZS5leHBvcnRzPWdl dEhvc3RDb21wb25lbnRGcm9tQ29tcG9zaXRlfSx7Njk6Njl9XSwxMTY6W2Z1bmN0aW9uKF9kZXJl cV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgSVRFUkFUT1JfU1lNQk9MPXR5cGVv ZiBTeW1ib2w9PT0iZnVuY3Rpb24iJiZTeW1ib2wuaXRlcmF0b3I7dmFyIEZBVVhfSVRFUkFUT1Jf U1lNQk9MPSJAQGl0ZXJhdG9yIjtmdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUp e3ZhciBpdGVyYXRvckZuPW1heWJlSXRlcmFibGUmJihJVEVSQVRPUl9TWU1CT0wmJm1heWJlSXRl cmFibGVbSVRFUkFUT1JfU1lNQk9MXXx8bWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJP TF0pO2lmKHR5cGVvZiBpdGVyYXRvckZuPT09ImZ1bmN0aW9uIil7cmV0dXJuIGl0ZXJhdG9yRm59 fW1vZHVsZS5leHBvcnRzPWdldEl0ZXJhdG9yRm59LHt9XSwxMTc6W2Z1bmN0aW9uKF9kZXJlcV8s bW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgbmV4dERlYnVnSUQ9MTtmdW5jdGlvbiBn ZXROZXh0RGVidWdJRCgpe3JldHVybiBuZXh0RGVidWdJRCsrfW1vZHVsZS5leHBvcnRzPWdldE5l eHREZWJ1Z0lEfSx7fV0sMTE4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNl IHN0cmljdCI7ZnVuY3Rpb24gZ2V0TGVhZk5vZGUobm9kZSl7d2hpbGUobm9kZSYmbm9kZS5maXJz dENoaWxkKXtub2RlPW5vZGUuZmlyc3RDaGlsZH1yZXR1cm4gbm9kZX1mdW5jdGlvbiBnZXRTaWJs aW5nTm9kZShub2RlKXt3aGlsZShub2RlKXtpZihub2RlLm5leHRTaWJsaW5nKXtyZXR1cm4gbm9k ZS5uZXh0U2libGluZ31ub2RlPW5vZGUucGFyZW50Tm9kZX19ZnVuY3Rpb24gZ2V0Tm9kZUZvckNo YXJhY3Rlck9mZnNldChyb290LG9mZnNldCl7dmFyIG5vZGU9Z2V0TGVhZk5vZGUocm9vdCk7dmFy IG5vZGVTdGFydD0wO3ZhciBub2RlRW5kPTA7d2hpbGUobm9kZSl7aWYobm9kZS5ub2RlVHlwZT09 PTMpe25vZGVFbmQ9bm9kZVN0YXJ0K25vZGUudGV4dENvbnRlbnQubGVuZ3RoO2lmKG5vZGVTdGFy dDw9b2Zmc2V0JiZub2RlRW5kPj1vZmZzZXQpe3JldHVybntub2RlOm5vZGUsb2Zmc2V0Om9mZnNl dC1ub2RlU3RhcnR9fW5vZGVTdGFydD1ub2RlRW5kfW5vZGU9Z2V0TGVhZk5vZGUoZ2V0U2libGlu Z05vZGUobm9kZSkpfX1tb2R1bGUuZXhwb3J0cz1nZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0fSx7 fV0sMTE5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFy IEV4ZWN1dGlvbkVudmlyb25tZW50PV9kZXJlcV8oMTM2KTt2YXIgY29udGVudEtleT1udWxsO2Z1 bmN0aW9uIGdldFRleHRDb250ZW50QWNjZXNzb3IoKXtpZighY29udGVudEtleSYmRXhlY3V0aW9u RW52aXJvbm1lbnQuY2FuVXNlRE9NKXtjb250ZW50S2V5PSJ0ZXh0Q29udGVudCJpbiBkb2N1bWVu dC5kb2N1bWVudEVsZW1lbnQ/InRleHRDb250ZW50IjoiaW5uZXJUZXh0In1yZXR1cm4gY29udGVu dEtleX1tb2R1bGUuZXhwb3J0cz1nZXRUZXh0Q29udGVudEFjY2Vzc29yfSx7MTM2OjEzNn1dLDEy MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBFeGVj dXRpb25FbnZpcm9ubWVudD1fZGVyZXFfKDEzNik7ZnVuY3Rpb24gbWFrZVByZWZpeE1hcChzdHls ZVByb3AsZXZlbnROYW1lKXt2YXIgcHJlZml4ZXM9e307cHJlZml4ZXNbc3R5bGVQcm9wLnRvTG93 ZXJDYXNlKCldPWV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpO3ByZWZpeGVzWyJXZWJraXQiK3N0eWxl UHJvcF09IndlYmtpdCIrZXZlbnROYW1lO3ByZWZpeGVzWyJNb3oiK3N0eWxlUHJvcF09Im1veiIr ZXZlbnROYW1lO3ByZWZpeGVzWyJtcyIrc3R5bGVQcm9wXT0iTVMiK2V2ZW50TmFtZTtwcmVmaXhl c1siTyIrc3R5bGVQcm9wXT0ibyIrZXZlbnROYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHByZWZp eGVzfXZhciB2ZW5kb3JQcmVmaXhlcz17YW5pbWF0aW9uZW5kOm1ha2VQcmVmaXhNYXAoIkFuaW1h dGlvbiIsIkFuaW1hdGlvbkVuZCIpLGFuaW1hdGlvbml0ZXJhdGlvbjptYWtlUHJlZml4TWFwKCJB bmltYXRpb24iLCJBbmltYXRpb25JdGVyYXRpb24iKSxhbmltYXRpb25zdGFydDptYWtlUHJlZml4 TWFwKCJBbmltYXRpb24iLCJBbmltYXRpb25TdGFydCIpLHRyYW5zaXRpb25lbmQ6bWFrZVByZWZp eE1hcCgiVHJhbnNpdGlvbiIsIlRyYW5zaXRpb25FbmQiKX07dmFyIHByZWZpeGVkRXZlbnROYW1l cz17fTt2YXIgc3R5bGU9e307aWYoRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NKXtzdHls ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZTtpZighKCJBbmltYXRpb25FdmVu dCJpbiB3aW5kb3cpKXtkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uZW5kLmFuaW1hdGlv bjtkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbjtkZWxl dGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9ufWlmKCEoIlRyYW5zaXRp b25FdmVudCJpbiB3aW5kb3cpKXtkZWxldGUgdmVuZG9yUHJlZml4ZXMudHJhbnNpdGlvbmVuZC50 cmFuc2l0aW9ufX1mdW5jdGlvbiBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShldmVudE5hbWUp e2lmKHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdKXtyZXR1cm4gcHJlZml4ZWRFdmVudE5h bWVzW2V2ZW50TmFtZV19ZWxzZSBpZighdmVuZG9yUHJlZml4ZXNbZXZlbnROYW1lXSl7cmV0dXJu IGV2ZW50TmFtZX12YXIgcHJlZml4TWFwPXZlbmRvclByZWZpeGVzW2V2ZW50TmFtZV07Zm9yKHZh ciBzdHlsZVByb3AgaW4gcHJlZml4TWFwKXtpZihwcmVmaXhNYXAuaGFzT3duUHJvcGVydHkoc3R5 bGVQcm9wKSYmc3R5bGVQcm9wIGluIHN0eWxlKXtyZXR1cm4gcHJlZml4ZWRFdmVudE5hbWVzW2V2 ZW50TmFtZV09cHJlZml4TWFwW3N0eWxlUHJvcF19fXJldHVybiIifW1vZHVsZS5leHBvcnRzPWdl dFZlbmRvclByZWZpeGVkRXZlbnROYW1lfSx7MTM2OjEzNn1dLDEyMTpbZnVuY3Rpb24oX2RlcmVx Xyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBfcHJvZEludmFyaWFudD1fZGVyZXFf KDEyNSksX2Fzc2lnbj1fZGVyZXFfKDE1OCk7dmFyIFJlYWN0Q29tcG9zaXRlQ29tcG9uZW50PV9k ZXJlcV8oMzApO3ZhciBSZWFjdEVtcHR5Q29tcG9uZW50PV9kZXJlcV8oNTQpO3ZhciBSZWFjdEhv c3RDb21wb25lbnQ9X2RlcmVxXyg1OSk7dmFyIGdldE5leHREZWJ1Z0lEPV9kZXJlcV8oMTE3KTt2 YXIgaW52YXJpYW50PV9kZXJlcV8oMTUwKTt2YXIgd2FybmluZz1fZGVyZXFfKDE1Nyk7dmFyIFJl YWN0Q29tcG9zaXRlQ29tcG9uZW50V3JhcHBlcj1mdW5jdGlvbihlbGVtZW50KXt0aGlzLmNvbnN0 cnVjdChlbGVtZW50KX07X2Fzc2lnbihSZWFjdENvbXBvc2l0ZUNvbXBvbmVudFdyYXBwZXIucHJv dG90eXBlLFJlYWN0Q29tcG9zaXRlQ29tcG9uZW50LHtfaW5zdGFudGlhdGVSZWFjdENvbXBvbmVu dDppbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50fSk7ZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJv ckFkZGVuZHVtKG93bmVyKXtpZihvd25lcil7dmFyIG5hbWU9b3duZXIuZ2V0TmFtZSgpO2lmKG5h bWUpe3JldHVybiIgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCIrbmFtZSsiYC4ifX1yZXR1 cm4iIn1mdW5jdGlvbiBpc0ludGVybmFsQ29tcG9uZW50VHlwZSh0eXBlKXtyZXR1cm4gdHlwZW9m IHR5cGU9PT0iZnVuY3Rpb24iJiZ0eXBlb2YgdHlwZS5wcm90b3R5cGUhPT0idW5kZWZpbmVkIiYm dHlwZW9mIHR5cGUucHJvdG90eXBlLm1vdW50Q29tcG9uZW50PT09ImZ1bmN0aW9uIiYmdHlwZW9m IHR5cGUucHJvdG90eXBlLnJlY2VpdmVDb21wb25lbnQ9PT0iZnVuY3Rpb24ifWZ1bmN0aW9uIGlu c3RhbnRpYXRlUmVhY3RDb21wb25lbnQobm9kZSxzaG91bGRIYXZlRGVidWdJRCl7dmFyIGluc3Rh bmNlO2lmKG5vZGU9PT1udWxsfHxub2RlPT09ZmFsc2Upe2luc3RhbmNlPVJlYWN0RW1wdHlDb21w b25lbnQuY3JlYXRlKGluc3RhbnRpYXRlUmVhY3RDb21wb25lbnQpfWVsc2UgaWYodHlwZW9mIG5v ZGU9PT0ib2JqZWN0Iil7dmFyIGVsZW1lbnQ9bm9kZTt2YXIgdHlwZT1lbGVtZW50LnR5cGU7aWYo dHlwZW9mIHR5cGUhPT0iZnVuY3Rpb24iJiZ0eXBlb2YgdHlwZSE9PSJzdHJpbmciKXt2YXIgaW5m bz0iIjtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtpZih0eXBlPT09dW5kZWZpbmVk fHx0eXBlb2YgdHlwZT09PSJvYmplY3QiJiZ0eXBlIT09bnVsbCYmT2JqZWN0LmtleXModHlwZSku bGVuZ3RoPT09MCl7aW5mbys9IiBZb3UgbGlrZWx5IGZvcmdvdCB0byBleHBvcnQgeW91ciBjb21w b25lbnQgZnJvbSB0aGUgZmlsZSAiKyJpdCdzIGRlZmluZWQgaW4uIn19aW5mbys9Z2V0RGVjbGFy YXRpb25FcnJvckFkZGVuZHVtKGVsZW1lbnQuX293bmVyKTshZmFsc2U/ImRldmVsb3BtZW50IiE9 PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsIkVsZW1lbnQgdHlwZSBpcyBpbnZhbGlkOiBl eHBlY3RlZCBhIHN0cmluZyAoZm9yIGJ1aWx0LWluIGNvbXBvbmVudHMpIG9yIGEgY2xhc3MvZnVu Y3Rpb24gKGZvciBjb21wb3NpdGUgY29tcG9uZW50cykgYnV0IGdvdDogJXMuJXMiLHR5cGU9PW51 bGw/dHlwZTp0eXBlb2YgdHlwZSxpbmZvKTpfcHJvZEludmFyaWFudCgiMTMwIix0eXBlPT1udWxs P3R5cGU6dHlwZW9mIHR5cGUsaW5mbyk6dm9pZCAwfWlmKHR5cGVvZiBlbGVtZW50LnR5cGU9PT0i c3RyaW5nIil7aW5zdGFuY2U9UmVhY3RIb3N0Q29tcG9uZW50LmNyZWF0ZUludGVybmFsQ29tcG9u ZW50KGVsZW1lbnQpfWVsc2UgaWYoaXNJbnRlcm5hbENvbXBvbmVudFR5cGUoZWxlbWVudC50eXBl KSl7aW5zdGFuY2U9bmV3IGVsZW1lbnQudHlwZShlbGVtZW50KTtpZighaW5zdGFuY2UuZ2V0SG9z dE5vZGUpe2luc3RhbmNlLmdldEhvc3ROb2RlPWluc3RhbmNlLmdldE5hdGl2ZU5vZGV9fWVsc2V7 aW5zdGFuY2U9bmV3IFJlYWN0Q29tcG9zaXRlQ29tcG9uZW50V3JhcHBlcihlbGVtZW50KX19ZWxz ZSBpZih0eXBlb2Ygbm9kZT09PSJzdHJpbmcifHx0eXBlb2Ygbm9kZT09PSJudW1iZXIiKXtpbnN0 YW5jZT1SZWFjdEhvc3RDb21wb25lbnQuY3JlYXRlSW5zdGFuY2VGb3JUZXh0KG5vZGUpfWVsc2V7 IWZhbHNlPyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJFbmNv dW50ZXJlZCBpbnZhbGlkIFJlYWN0IG5vZGUgb2YgdHlwZSAlcyIsdHlwZW9mIG5vZGUpOl9wcm9k SW52YXJpYW50KCIxMzEiLHR5cGVvZiBub2RlKTp2b2lkIDB9aWYoImRldmVsb3BtZW50IiE9PSJw cm9kdWN0aW9uIil7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKHR5cGVvZiBp bnN0YW5jZS5tb3VudENvbXBvbmVudD09PSJmdW5jdGlvbiImJnR5cGVvZiBpbnN0YW5jZS5yZWNl aXZlQ29tcG9uZW50PT09ImZ1bmN0aW9uIiYmdHlwZW9mIGluc3RhbmNlLmdldEhvc3ROb2RlPT09 ImZ1bmN0aW9uIiYmdHlwZW9mIGluc3RhbmNlLnVubW91bnRDb21wb25lbnQ9PT0iZnVuY3Rpb24i LCJPbmx5IFJlYWN0IENvbXBvbmVudHMgY2FuIGJlIG1vdW50ZWQuIik6dm9pZCAwfWluc3RhbmNl Ll9tb3VudEluZGV4PTA7aW5zdGFuY2UuX21vdW50SW1hZ2U9bnVsbDtpZigiZGV2ZWxvcG1lbnQi IT09InByb2R1Y3Rpb24iKXtpbnN0YW5jZS5fZGVidWdJRD1zaG91bGRIYXZlRGVidWdJRD9nZXRO ZXh0RGVidWdJRCgpOjB9aWYoImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIil7aWYoT2JqZWN0 LnByZXZlbnRFeHRlbnNpb25zKXtPYmplY3QucHJldmVudEV4dGVuc2lvbnMoaW5zdGFuY2UpfX1y ZXR1cm4gaW5zdGFuY2V9bW9kdWxlLmV4cG9ydHM9aW5zdGFudGlhdGVSZWFjdENvbXBvbmVudH0s ezExNzoxMTcsMTI1OjEyNSwxNTA6MTUwLDE1NzoxNTcsMTU4OjE1OCwzMDozMCw1NDo1NCw1OTo1 OX1dLDEyMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3Zh ciBFeGVjdXRpb25FbnZpcm9ubWVudD1fZGVyZXFfKDEzNik7dmFyIHVzZUhhc0ZlYXR1cmU7aWYo RXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NKXt1c2VIYXNGZWF0dXJlPWRvY3VtZW50Lmlt cGxlbWVudGF0aW9uJiZkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlJiZkb2N1bWVu dC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCIiLCIiKSE9PXRydWV9ZnVuY3Rpb24gaXNFdmVu dFN1cHBvcnRlZChldmVudE5hbWVTdWZmaXgsY2FwdHVyZSl7aWYoIUV4ZWN1dGlvbkVudmlyb25t ZW50LmNhblVzZURPTXx8Y2FwdHVyZSYmISgiYWRkRXZlbnRMaXN0ZW5lciJpbiBkb2N1bWVudCkp e3JldHVybiBmYWxzZX12YXIgZXZlbnROYW1lPSJvbiIrZXZlbnROYW1lU3VmZml4O3ZhciBpc1N1 cHBvcnRlZD1ldmVudE5hbWUgaW4gZG9jdW1lbnQ7aWYoIWlzU3VwcG9ydGVkKXt2YXIgZWxlbWVu dD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlbGVtZW50LnNldEF0dHJpYnV0ZShldmVu dE5hbWUsInJldHVybjsiKTtpc1N1cHBvcnRlZD10eXBlb2YgZWxlbWVudFtldmVudE5hbWVdPT09 ImZ1bmN0aW9uIn1pZighaXNTdXBwb3J0ZWQmJnVzZUhhc0ZlYXR1cmUmJmV2ZW50TmFtZVN1ZmZp eD09PSJ3aGVlbCIpe2lzU3VwcG9ydGVkPWRvY3VtZW50LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1 cmUoIkV2ZW50cy53aGVlbCIsIjMuMCIpfXJldHVybiBpc1N1cHBvcnRlZH1tb2R1bGUuZXhwb3J0 cz1pc0V2ZW50U3VwcG9ydGVkfSx7MTM2OjEzNn1dLDEyMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1 bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBzdXBwb3J0ZWRJbnB1dFR5cGVzPXtjb2xvcjp0 cnVlLGRhdGU6dHJ1ZSxkYXRldGltZTp0cnVlLCJkYXRldGltZS1sb2NhbCI6dHJ1ZSxlbWFpbDp0 cnVlLG1vbnRoOnRydWUsbnVtYmVyOnRydWUscGFzc3dvcmQ6dHJ1ZSxyYW5nZTp0cnVlLHNlYXJj aDp0cnVlLHRlbDp0cnVlLHRleHQ6dHJ1ZSx0aW1lOnRydWUsdXJsOnRydWUsd2Vlazp0cnVlfTtm dW5jdGlvbiBpc1RleHRJbnB1dEVsZW1lbnQoZWxlbSl7dmFyIG5vZGVOYW1lPWVsZW0mJmVsZW0u bm9kZU5hbWUmJmVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZihub2RlTmFtZT09PSJpbnB1 dCIpe3JldHVybiEhc3VwcG9ydGVkSW5wdXRUeXBlc1tlbGVtLnR5cGVdfWlmKG5vZGVOYW1lPT09 InRleHRhcmVhIil7cmV0dXJuIHRydWV9cmV0dXJuIGZhbHNlfW1vZHVsZS5leHBvcnRzPWlzVGV4 dElucHV0RWxlbWVudH0se31dLDEyNDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7 InVzZSBzdHJpY3QiO3ZhciBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXI9X2RlcmVxXygxMDcp O2Z1bmN0aW9uIHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyKHZhbHVlKXtyZXR1cm4nIicr ZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyKHZhbHVlKSsnIid9bW9kdWxlLmV4cG9ydHM9cXVv dGVBdHRyaWJ1dGVWYWx1ZUZvckJyb3dzZXJ9LHsxMDc6MTA3fV0sMTI1OltmdW5jdGlvbihfZGVy ZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcmVhY3RQcm9kSW52YXJp YW50KGNvZGUpe3ZhciBhcmdDb3VudD1hcmd1bWVudHMubGVuZ3RoLTE7dmFyIG1lc3NhZ2U9Ik1p bmlmaWVkIFJlYWN0IGVycm9yICMiK2NvZGUrIjsgdmlzaXQgIisiaHR0cDovL2ZhY2Vib29rLmdp dGh1Yi5pby9yZWFjdC9kb2NzL2Vycm9yLWRlY29kZXIuaHRtbD9pbnZhcmlhbnQ9Iitjb2RlO2Zv cih2YXIgYXJnSWR4PTA7YXJnSWR4PGFyZ0NvdW50O2FyZ0lkeCsrKXttZXNzYWdlKz0iJmFyZ3Nb XT0iK2VuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbYXJnSWR4KzFdKX1tZXNzYWdlKz0iIGZv ciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVu dCIrIiBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4iO3Zh ciBlcnJvcj1uZXcgRXJyb3IobWVzc2FnZSk7ZXJyb3IubmFtZT0iSW52YXJpYW50IFZpb2xhdGlv biI7ZXJyb3IuZnJhbWVzVG9Qb3A9MTt0aHJvdyBlcnJvcn1tb2R1bGUuZXhwb3J0cz1yZWFjdFBy b2RJbnZhcmlhbnR9LHt9XSwxMjY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1 c2Ugc3RyaWN0Ijt2YXIgUmVhY3RNb3VudD1fZGVyZXFfKDY3KTttb2R1bGUuZXhwb3J0cz1SZWFj dE1vdW50LnJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyfSx7Njc6Njd9XSwxMjc6W2Z1bmN0aW9u KF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgRXhlY3V0aW9uRW52aXJv bm1lbnQ9X2RlcmVxXygxMzYpO3ZhciBET01OYW1lc3BhY2VzPV9kZXJlcV8oMTApO3ZhciBXSElU RVNQQUNFX1RFU1Q9L15bIFxyXG5cdFxmXS87dmFyIE5PTlZJU0lCTEVfVEVTVD0vPCghLS18bGlu a3xub3NjcmlwdHxtZXRhfHNjcmlwdHxzdHlsZSlbIFxyXG5cdFxmXC8+XS87dmFyIGNyZWF0ZU1p Y3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb249X2RlcmVxXygxMDUpO3ZhciByZXVzYWJsZVNWR0Nv bnRhaW5lcjt2YXIgc2V0SW5uZXJIVE1MPWNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rp b24oZnVuY3Rpb24obm9kZSxodG1sKXtpZihub2RlLm5hbWVzcGFjZVVSST09PURPTU5hbWVzcGFj ZXMuc3ZnJiYhKCJpbm5lckhUTUwiaW4gbm9kZSkpe3JldXNhYmxlU1ZHQ29udGFpbmVyPXJldXNh YmxlU1ZHQ29udGFpbmVyfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXVzYWJsZVNW R0NvbnRhaW5lci5pbm5lckhUTUw9Ijxzdmc+IitodG1sKyI8L3N2Zz4iO3ZhciBzdmdOb2RlPXJl dXNhYmxlU1ZHQ29udGFpbmVyLmZpcnN0Q2hpbGQ7d2hpbGUoc3ZnTm9kZS5maXJzdENoaWxkKXtu b2RlLmFwcGVuZENoaWxkKHN2Z05vZGUuZmlyc3RDaGlsZCl9fWVsc2V7bm9kZS5pbm5lckhUTUw9 aHRtbH19KTtpZihFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00pe3ZhciB0ZXN0RWxlbWVu dD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0ZXN0RWxlbWVudC5pbm5lckhUTUw9IiAi O2lmKHRlc3RFbGVtZW50LmlubmVySFRNTD09PSIiKXtzZXRJbm5lckhUTUw9ZnVuY3Rpb24obm9k ZSxodG1sKXtpZihub2RlLnBhcmVudE5vZGUpe25vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQo bm9kZSxub2RlKX1pZihXSElURVNQQUNFX1RFU1QudGVzdChodG1sKXx8aHRtbFswXT09PSI8IiYm Tk9OVklTSUJMRV9URVNULnRlc3QoaHRtbCkpe25vZGUuaW5uZXJIVE1MPVN0cmluZy5mcm9tQ2hh ckNvZGUoNjUyNzkpK2h0bWw7dmFyIHRleHROb2RlPW5vZGUuZmlyc3RDaGlsZDtpZih0ZXh0Tm9k ZS5kYXRhLmxlbmd0aD09PTEpe25vZGUucmVtb3ZlQ2hpbGQodGV4dE5vZGUpfWVsc2V7dGV4dE5v ZGUuZGVsZXRlRGF0YSgwLDEpfX1lbHNle25vZGUuaW5uZXJIVE1MPWh0bWx9fX10ZXN0RWxlbWVu dD1udWxsfW1vZHVsZS5leHBvcnRzPXNldElubmVySFRNTH0sezEwOjEwLDEwNToxMDUsMTM2OjEz Nn1dLDEyODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3Zh ciBFeGVjdXRpb25FbnZpcm9ubWVudD1fZGVyZXFfKDEzNik7dmFyIGVzY2FwZVRleHRDb250ZW50 Rm9yQnJvd3Nlcj1fZGVyZXFfKDEwNyk7dmFyIHNldElubmVySFRNTD1fZGVyZXFfKDEyNyk7dmFy IHNldFRleHRDb250ZW50PWZ1bmN0aW9uKG5vZGUsdGV4dCl7aWYodGV4dCl7dmFyIGZpcnN0Q2hp bGQ9bm9kZS5maXJzdENoaWxkO2lmKGZpcnN0Q2hpbGQmJmZpcnN0Q2hpbGQ9PT1ub2RlLmxhc3RD aGlsZCYmZmlyc3RDaGlsZC5ub2RlVHlwZT09PTMpe2ZpcnN0Q2hpbGQubm9kZVZhbHVlPXRleHQ7 cmV0dXJufX1ub2RlLnRleHRDb250ZW50PXRleHR9O2lmKEV4ZWN1dGlvbkVudmlyb25tZW50LmNh blVzZURPTSl7aWYoISgidGV4dENvbnRlbnQiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSl7 c2V0VGV4dENvbnRlbnQ9ZnVuY3Rpb24obm9kZSx0ZXh0KXtpZihub2RlLm5vZGVUeXBlPT09Myl7 bm9kZS5ub2RlVmFsdWU9dGV4dDtyZXR1cm59c2V0SW5uZXJIVE1MKG5vZGUsZXNjYXBlVGV4dENv bnRlbnRGb3JCcm93c2VyKHRleHQpKX19fW1vZHVsZS5leHBvcnRzPXNldFRleHRDb250ZW50fSx7 MTA3OjEwNywxMjc6MTI3LDEzNjoxMzZ9XSwxMjk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4 cG9ydHMpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudChw cmV2RWxlbWVudCxuZXh0RWxlbWVudCl7dmFyIHByZXZFbXB0eT1wcmV2RWxlbWVudD09PW51bGx8 fHByZXZFbGVtZW50PT09ZmFsc2U7dmFyIG5leHRFbXB0eT1uZXh0RWxlbWVudD09PW51bGx8fG5l eHRFbGVtZW50PT09ZmFsc2U7aWYocHJldkVtcHR5fHxuZXh0RW1wdHkpe3JldHVybiBwcmV2RW1w dHk9PT1uZXh0RW1wdHl9dmFyIHByZXZUeXBlPXR5cGVvZiBwcmV2RWxlbWVudDt2YXIgbmV4dFR5 cGU9dHlwZW9mIG5leHRFbGVtZW50O2lmKHByZXZUeXBlPT09InN0cmluZyJ8fHByZXZUeXBlPT09 Im51bWJlciIpe3JldHVybiBuZXh0VHlwZT09PSJzdHJpbmcifHxuZXh0VHlwZT09PSJudW1iZXIi fWVsc2V7cmV0dXJuIG5leHRUeXBlPT09Im9iamVjdCImJnByZXZFbGVtZW50LnR5cGU9PT1uZXh0 RWxlbWVudC50eXBlJiZwcmV2RWxlbWVudC5rZXk9PT1uZXh0RWxlbWVudC5rZXl9fW1vZHVsZS5l eHBvcnRzPXNob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50fSx7fV0sMTMwOltmdW5jdGlvbihfZGVy ZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIF9wcm9kSW52YXJpYW50PV9kZXJl cV8oMTI1KTt2YXIgUmVhY3RDdXJyZW50T3duZXI9X2RlcmVxXygxMzMpO3ZhciBSRUFDVF9FTEVN RU5UX1RZUEU9X2RlcmVxXyg1Myk7dmFyIGdldEl0ZXJhdG9yRm49X2RlcmVxXygxMTYpO3ZhciBp bnZhcmlhbnQ9X2RlcmVxXygxNTApO3ZhciBLZXlFc2NhcGVVdGlscz1fZGVyZXFfKDIzKTt2YXIg d2FybmluZz1fZGVyZXFfKDE1Nyk7dmFyIFNFUEFSQVRPUj0iLiI7dmFyIFNVQlNFUEFSQVRPUj0i OiI7dmFyIGRpZFdhcm5BYm91dE1hcHM9ZmFsc2U7ZnVuY3Rpb24gZ2V0Q29tcG9uZW50S2V5KGNv bXBvbmVudCxpbmRleCl7aWYoY29tcG9uZW50JiZ0eXBlb2YgY29tcG9uZW50PT09Im9iamVjdCIm JmNvbXBvbmVudC5rZXkhPW51bGwpe3JldHVybiBLZXlFc2NhcGVVdGlscy5lc2NhcGUoY29tcG9u ZW50LmtleSl9cmV0dXJuIGluZGV4LnRvU3RyaW5nKDM2KX1mdW5jdGlvbiB0cmF2ZXJzZUFsbENo aWxkcmVuSW1wbChjaGlsZHJlbixuYW1lU29GYXIsY2FsbGJhY2ssdHJhdmVyc2VDb250ZXh0KXt2 YXIgdHlwZT10eXBlb2YgY2hpbGRyZW47aWYodHlwZT09PSJ1bmRlZmluZWQifHx0eXBlPT09ImJv b2xlYW4iKXtjaGlsZHJlbj1udWxsfWlmKGNoaWxkcmVuPT09bnVsbHx8dHlwZT09PSJzdHJpbmci fHx0eXBlPT09Im51bWJlciJ8fHR5cGU9PT0ib2JqZWN0IiYmY2hpbGRyZW4uJCR0eXBlb2Y9PT1S RUFDVF9FTEVNRU5UX1RZUEUpe2NhbGxiYWNrKHRyYXZlcnNlQ29udGV4dCxjaGlsZHJlbixuYW1l U29GYXI9PT0iIj9TRVBBUkFUT1IrZ2V0Q29tcG9uZW50S2V5KGNoaWxkcmVuLDApOm5hbWVTb0Zh cik7cmV0dXJuIDF9dmFyIGNoaWxkO3ZhciBuZXh0TmFtZTt2YXIgc3VidHJlZUNvdW50PTA7dmFy IG5leHROYW1lUHJlZml4PW5hbWVTb0Zhcj09PSIiP1NFUEFSQVRPUjpuYW1lU29GYXIrU1VCU0VQ QVJBVE9SO2lmKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKXtmb3IodmFyIGk9MDtpPGNoaWxkcmVu Lmxlbmd0aDtpKyspe2NoaWxkPWNoaWxkcmVuW2ldO25leHROYW1lPW5leHROYW1lUHJlZml4K2dl dENvbXBvbmVudEtleShjaGlsZCxpKTtzdWJ0cmVlQ291bnQrPXRyYXZlcnNlQWxsQ2hpbGRyZW5J bXBsKGNoaWxkLG5leHROYW1lLGNhbGxiYWNrLHRyYXZlcnNlQ29udGV4dCl9fWVsc2V7dmFyIGl0 ZXJhdG9yRm49Z2V0SXRlcmF0b3JGbihjaGlsZHJlbik7aWYoaXRlcmF0b3JGbil7dmFyIGl0ZXJh dG9yPWl0ZXJhdG9yRm4uY2FsbChjaGlsZHJlbik7dmFyIHN0ZXA7aWYoaXRlcmF0b3JGbiE9PWNo aWxkcmVuLmVudHJpZXMpe3ZhciBpaT0wO3doaWxlKCEoc3RlcD1pdGVyYXRvci5uZXh0KCkpLmRv bmUpe2NoaWxkPXN0ZXAudmFsdWU7bmV4dE5hbWU9bmV4dE5hbWVQcmVmaXgrZ2V0Q29tcG9uZW50 S2V5KGNoaWxkLGlpKyspO3N1YnRyZWVDb3VudCs9dHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hp bGQsbmV4dE5hbWUsY2FsbGJhY2ssdHJhdmVyc2VDb250ZXh0KX19ZWxzZXtpZigiZGV2ZWxvcG1l bnQiIT09InByb2R1Y3Rpb24iKXt2YXIgbWFwc0FzQ2hpbGRyZW5BZGRlbmR1bT0iIjtpZihSZWFj dEN1cnJlbnRPd25lci5jdXJyZW50KXt2YXIgbWFwc0FzQ2hpbGRyZW5Pd25lck5hbWU9UmVhY3RD dXJyZW50T3duZXIuY3VycmVudC5nZXROYW1lKCk7aWYobWFwc0FzQ2hpbGRyZW5Pd25lck5hbWUp e21hcHNBc0NoaWxkcmVuQWRkZW5kdW09IiBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgIitt YXBzQXNDaGlsZHJlbk93bmVyTmFtZSsiYC4ifX0iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24i P3dhcm5pbmcoZGlkV2FybkFib3V0TWFwcywiVXNpbmcgTWFwcyBhcyBjaGlsZHJlbiBpcyBub3Qg eWV0IGZ1bGx5IHN1cHBvcnRlZC4gSXQgaXMgYW4gIisiZXhwZXJpbWVudGFsIGZlYXR1cmUgdGhh dCBtaWdodCBiZSByZW1vdmVkLiBDb252ZXJ0IGl0IHRvIGEgIisic2VxdWVuY2UgLyBpdGVyYWJs ZSBvZiBrZXllZCBSZWFjdEVsZW1lbnRzIGluc3RlYWQuJXMiLG1hcHNBc0NoaWxkcmVuQWRkZW5k dW0pOnZvaWQgMDtkaWRXYXJuQWJvdXRNYXBzPXRydWV9d2hpbGUoIShzdGVwPWl0ZXJhdG9yLm5l eHQoKSkuZG9uZSl7dmFyIGVudHJ5PXN0ZXAudmFsdWU7aWYoZW50cnkpe2NoaWxkPWVudHJ5WzFd O25leHROYW1lPW5leHROYW1lUHJlZml4K0tleUVzY2FwZVV0aWxzLmVzY2FwZShlbnRyeVswXSkr U1VCU0VQQVJBVE9SK2dldENvbXBvbmVudEtleShjaGlsZCwwKTtzdWJ0cmVlQ291bnQrPXRyYXZl cnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkLG5leHROYW1lLGNhbGxiYWNrLHRyYXZlcnNlQ29udGV4 dCl9fX19ZWxzZSBpZih0eXBlPT09Im9iamVjdCIpe3ZhciBhZGRlbmR1bT0iIjtpZigiZGV2ZWxv cG1lbnQiIT09InByb2R1Y3Rpb24iKXthZGRlbmR1bT0iIElmIHlvdSBtZWFudCB0byByZW5kZXIg YSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgIisiaW5zdGVhZCBvciB3cmFw IHRoZSBvYmplY3QgdXNpbmcgY3JlYXRlRnJhZ21lbnQob2JqZWN0KSBmcm9tIHRoZSAiKyJSZWFj dCBhZGQtb25zLiI7aWYoY2hpbGRyZW4uX2lzUmVhY3RFbGVtZW50KXthZGRlbmR1bT0iIEl0IGxv b2tzIGxpa2UgeW91J3JlIHVzaW5nIGFuIGVsZW1lbnQgY3JlYXRlZCBieSBhIGRpZmZlcmVudCAi KyJ2ZXJzaW9uIG9mIFJlYWN0LiBNYWtlIHN1cmUgdG8gdXNlIG9ubHkgb25lIGNvcHkgb2YgUmVh Y3QuIn1pZihSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KXt2YXIgbmFtZT1SZWFjdEN1cnJlbnRP d25lci5jdXJyZW50LmdldE5hbWUoKTtpZihuYW1lKXthZGRlbmR1bSs9IiBDaGVjayB0aGUgcmVu ZGVyIG1ldGhvZCBvZiBgIituYW1lKyJgLiJ9fX12YXIgY2hpbGRyZW5TdHJpbmc9U3RyaW5nKGNo aWxkcmVuKTshZmFsc2U/ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFs c2UsIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogJXMpLiVz IixjaGlsZHJlblN0cmluZz09PSJbb2JqZWN0IE9iamVjdF0iPyJvYmplY3Qgd2l0aCBrZXlzIHsi K09iamVjdC5rZXlzKGNoaWxkcmVuKS5qb2luKCIsICIpKyJ9IjpjaGlsZHJlblN0cmluZyxhZGRl bmR1bSk6X3Byb2RJbnZhcmlhbnQoIjMxIixjaGlsZHJlblN0cmluZz09PSJbb2JqZWN0IE9iamVj dF0iPyJvYmplY3Qgd2l0aCBrZXlzIHsiK09iamVjdC5rZXlzKGNoaWxkcmVuKS5qb2luKCIsICIp KyJ9IjpjaGlsZHJlblN0cmluZyxhZGRlbmR1bSk6dm9pZCAwfX1yZXR1cm4gc3VidHJlZUNvdW50 fWZ1bmN0aW9uIHRyYXZlcnNlQWxsQ2hpbGRyZW4oY2hpbGRyZW4sY2FsbGJhY2ssdHJhdmVyc2VD b250ZXh0KXtpZihjaGlsZHJlbj09bnVsbCl7cmV0dXJuIDB9cmV0dXJuIHRyYXZlcnNlQWxsQ2hp bGRyZW5JbXBsKGNoaWxkcmVuLCIiLGNhbGxiYWNrLHRyYXZlcnNlQ29udGV4dCl9bW9kdWxlLmV4 cG9ydHM9dHJhdmVyc2VBbGxDaGlsZHJlbn0sezExNjoxMTYsMTI1OjEyNSwxMzM6MTMzLDE1MDox NTAsMTU3OjE1NywyMzoyMyw1Mzo1M31dLDEzMTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhw b3J0cyl7InVzZSBzdHJpY3QiO3ZhciBfYXNzaWduPV9kZXJlcV8oMTU4KTt2YXIgZW1wdHlGdW5j dGlvbj1fZGVyZXFfKDE0Mik7dmFyIHdhcm5pbmc9X2RlcmVxXygxNTcpO3ZhciB2YWxpZGF0ZURP TU5lc3Rpbmc9ZW1wdHlGdW5jdGlvbjtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXt2 YXIgc3BlY2lhbFRhZ3M9WyJhZGRyZXNzIiwiYXBwbGV0IiwiYXJlYSIsImFydGljbGUiLCJhc2lk ZSIsImJhc2UiLCJiYXNlZm9udCIsImJnc291bmQiLCJibG9ja3F1b3RlIiwiYm9keSIsImJyIiwi YnV0dG9uIiwiY2FwdGlvbiIsImNlbnRlciIsImNvbCIsImNvbGdyb3VwIiwiZGQiLCJkZXRhaWxz IiwiZGlyIiwiZGl2IiwiZGwiLCJkdCIsImVtYmVkIiwiZmllbGRzZXQiLCJmaWdjYXB0aW9uIiwi ZmlndXJlIiwiZm9vdGVyIiwiZm9ybSIsImZyYW1lIiwiZnJhbWVzZXQiLCJoMSIsImgyIiwiaDMi LCJoNCIsImg1IiwiaDYiLCJoZWFkIiwiaGVhZGVyIiwiaGdyb3VwIiwiaHIiLCJodG1sIiwiaWZy YW1lIiwiaW1nIiwiaW5wdXQiLCJpc2luZGV4IiwibGkiLCJsaW5rIiwibGlzdGluZyIsIm1haW4i LCJtYXJxdWVlIiwibWVudSIsIm1lbnVpdGVtIiwibWV0YSIsIm5hdiIsIm5vZW1iZWQiLCJub2Zy YW1lcyIsIm5vc2NyaXB0Iiwib2JqZWN0Iiwib2wiLCJwIiwicGFyYW0iLCJwbGFpbnRleHQiLCJw cmUiLCJzY3JpcHQiLCJzZWN0aW9uIiwic2VsZWN0Iiwic291cmNlIiwic3R5bGUiLCJzdW1tYXJ5 IiwidGFibGUiLCJ0Ym9keSIsInRkIiwidGVtcGxhdGUiLCJ0ZXh0YXJlYSIsInRmb290IiwidGgi LCJ0aGVhZCIsInRpdGxlIiwidHIiLCJ0cmFjayIsInVsIiwid2JyIiwieG1wIl07dmFyIGluU2Nv cGVUYWdzPVsiYXBwbGV0IiwiY2FwdGlvbiIsImh0bWwiLCJ0YWJsZSIsInRkIiwidGgiLCJtYXJx dWVlIiwib2JqZWN0IiwidGVtcGxhdGUiLCJmb3JlaWduT2JqZWN0IiwiZGVzYyIsInRpdGxlIl07 dmFyIGJ1dHRvblNjb3BlVGFncz1pblNjb3BlVGFncy5jb25jYXQoWyJidXR0b24iXSk7dmFyIGlt cGxpZWRFbmRUYWdzPVsiZGQiLCJkdCIsImxpIiwib3B0aW9uIiwib3B0Z3JvdXAiLCJwIiwicnAi LCJydCJdO3ZhciBlbXB0eUFuY2VzdG9ySW5mbz17Y3VycmVudDpudWxsLGZvcm1UYWc6bnVsbCxh VGFnSW5TY29wZTpudWxsLGJ1dHRvblRhZ0luU2NvcGU6bnVsbCxub2JyVGFnSW5TY29wZTpudWxs LHBUYWdJbkJ1dHRvblNjb3BlOm51bGwsbGlzdEl0ZW1UYWdBdXRvY2xvc2luZzpudWxsLGRsSXRl bVRhZ0F1dG9jbG9zaW5nOm51bGx9O3ZhciB1cGRhdGVkQW5jZXN0b3JJbmZvPWZ1bmN0aW9uKG9s ZEluZm8sdGFnLGluc3RhbmNlKXt2YXIgYW5jZXN0b3JJbmZvPV9hc3NpZ24oe30sb2xkSW5mb3x8 ZW1wdHlBbmNlc3RvckluZm8pO3ZhciBpbmZvPXt0YWc6dGFnLGluc3RhbmNlOmluc3RhbmNlfTtp ZihpblNjb3BlVGFncy5pbmRleE9mKHRhZykhPT0tMSl7YW5jZXN0b3JJbmZvLmFUYWdJblNjb3Bl PW51bGw7YW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGU9bnVsbDthbmNlc3RvckluZm8ubm9i clRhZ0luU2NvcGU9bnVsbH1pZihidXR0b25TY29wZVRhZ3MuaW5kZXhPZih0YWcpIT09LTEpe2Fu Y2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZT1udWxsfWlmKHNwZWNpYWxUYWdzLmluZGV4T2Yo dGFnKSE9PS0xJiZ0YWchPT0iYWRkcmVzcyImJnRhZyE9PSJkaXYiJiZ0YWchPT0icCIpe2FuY2Vz dG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nPW51bGw7YW5jZXN0b3JJbmZvLmRsSXRlbVRh Z0F1dG9jbG9zaW5nPW51bGx9YW5jZXN0b3JJbmZvLmN1cnJlbnQ9aW5mbztpZih0YWc9PT0iZm9y bSIpe2FuY2VzdG9ySW5mby5mb3JtVGFnPWluZm99aWYodGFnPT09ImEiKXthbmNlc3RvckluZm8u YVRhZ0luU2NvcGU9aW5mb31pZih0YWc9PT0iYnV0dG9uIil7YW5jZXN0b3JJbmZvLmJ1dHRvblRh Z0luU2NvcGU9aW5mb31pZih0YWc9PT0ibm9iciIpe2FuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29w ZT1pbmZvfWlmKHRhZz09PSJwIil7YW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlPWluZm99 aWYodGFnPT09ImxpIil7YW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3Npbmc9aW5mb31p Zih0YWc9PT0iZGQifHx0YWc9PT0iZHQiKXthbmNlc3RvckluZm8uZGxJdGVtVGFnQXV0b2Nsb3Np bmc9aW5mb31yZXR1cm4gYW5jZXN0b3JJbmZvfTt2YXIgaXNUYWdWYWxpZFdpdGhQYXJlbnQ9ZnVu Y3Rpb24odGFnLHBhcmVudFRhZyl7c3dpdGNoKHBhcmVudFRhZyl7Y2FzZSJzZWxlY3QiOnJldHVy biB0YWc9PT0ib3B0aW9uInx8dGFnPT09Im9wdGdyb3VwInx8dGFnPT09IiN0ZXh0IjtjYXNlIm9w dGdyb3VwIjpyZXR1cm4gdGFnPT09Im9wdGlvbiJ8fHRhZz09PSIjdGV4dCI7Y2FzZSJvcHRpb24i OnJldHVybiB0YWc9PT0iI3RleHQiO2Nhc2UidHIiOnJldHVybiB0YWc9PT0idGgifHx0YWc9PT0i dGQifHx0YWc9PT0ic3R5bGUifHx0YWc9PT0ic2NyaXB0Inx8dGFnPT09InRlbXBsYXRlIjtjYXNl InRib2R5IjpjYXNlInRoZWFkIjpjYXNlInRmb290IjpyZXR1cm4gdGFnPT09InRyInx8dGFnPT09 InN0eWxlInx8dGFnPT09InNjcmlwdCJ8fHRhZz09PSJ0ZW1wbGF0ZSI7Y2FzZSJjb2xncm91cCI6 cmV0dXJuIHRhZz09PSJjb2wifHx0YWc9PT0idGVtcGxhdGUiO2Nhc2UidGFibGUiOnJldHVybiB0 YWc9PT0iY2FwdGlvbiJ8fHRhZz09PSJjb2xncm91cCJ8fHRhZz09PSJ0Ym9keSJ8fHRhZz09PSJ0 Zm9vdCJ8fHRhZz09PSJ0aGVhZCJ8fHRhZz09PSJzdHlsZSJ8fHRhZz09PSJzY3JpcHQifHx0YWc9 PT0idGVtcGxhdGUiO2Nhc2UiaGVhZCI6cmV0dXJuIHRhZz09PSJiYXNlInx8dGFnPT09ImJhc2Vm b250Inx8dGFnPT09ImJnc291bmQifHx0YWc9PT0ibGluayJ8fHRhZz09PSJtZXRhInx8dGFnPT09 InRpdGxlInx8dGFnPT09Im5vc2NyaXB0Inx8dGFnPT09Im5vZnJhbWVzInx8dGFnPT09InN0eWxl Inx8dGFnPT09InNjcmlwdCJ8fHRhZz09PSJ0ZW1wbGF0ZSI7Y2FzZSJodG1sIjpyZXR1cm4gdGFn PT09ImhlYWQifHx0YWc9PT0iYm9keSI7Y2FzZSIjZG9jdW1lbnQiOnJldHVybiB0YWc9PT0iaHRt bCJ9c3dpdGNoKHRhZyl7Y2FzZSJoMSI6Y2FzZSJoMiI6Y2FzZSJoMyI6Y2FzZSJoNCI6Y2FzZSJo NSI6Y2FzZSJoNiI6cmV0dXJuIHBhcmVudFRhZyE9PSJoMSImJnBhcmVudFRhZyE9PSJoMiImJnBh cmVudFRhZyE9PSJoMyImJnBhcmVudFRhZyE9PSJoNCImJnBhcmVudFRhZyE9PSJoNSImJnBhcmVu dFRhZyE9PSJoNiI7Y2FzZSJycCI6Y2FzZSJydCI6cmV0dXJuIGltcGxpZWRFbmRUYWdzLmluZGV4 T2YocGFyZW50VGFnKT09PS0xO2Nhc2UiYm9keSI6Y2FzZSJjYXB0aW9uIjpjYXNlImNvbCI6Y2Fz ZSJjb2xncm91cCI6Y2FzZSJmcmFtZSI6Y2FzZSJoZWFkIjpjYXNlImh0bWwiOmNhc2UidGJvZHki OmNhc2UidGQiOmNhc2UidGZvb3QiOmNhc2UidGgiOmNhc2UidGhlYWQiOmNhc2UidHIiOnJldHVy biBwYXJlbnRUYWc9PW51bGx9cmV0dXJuIHRydWV9O3ZhciBmaW5kSW52YWxpZEFuY2VzdG9yRm9y VGFnPWZ1bmN0aW9uKHRhZyxhbmNlc3RvckluZm8pe3N3aXRjaCh0YWcpe2Nhc2UiYWRkcmVzcyI6 Y2FzZSJhcnRpY2xlIjpjYXNlImFzaWRlIjpjYXNlImJsb2NrcXVvdGUiOmNhc2UiY2VudGVyIjpj YXNlImRldGFpbHMiOmNhc2UiZGlhbG9nIjpjYXNlImRpciI6Y2FzZSJkaXYiOmNhc2UiZGwiOmNh c2UiZmllbGRzZXQiOmNhc2UiZmlnY2FwdGlvbiI6Y2FzZSJmaWd1cmUiOmNhc2UiZm9vdGVyIjpj YXNlImhlYWRlciI6Y2FzZSJoZ3JvdXAiOmNhc2UibWFpbiI6Y2FzZSJtZW51IjpjYXNlIm5hdiI6 Y2FzZSJvbCI6Y2FzZSJwIjpjYXNlInNlY3Rpb24iOmNhc2Uic3VtbWFyeSI6Y2FzZSJ1bCI6Y2Fz ZSJwcmUiOmNhc2UibGlzdGluZyI6Y2FzZSJ0YWJsZSI6Y2FzZSJociI6Y2FzZSJ4bXAiOmNhc2Ui aDEiOmNhc2UiaDIiOmNhc2UiaDMiOmNhc2UiaDQiOmNhc2UiaDUiOmNhc2UiaDYiOnJldHVybiBh bmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGU7Y2FzZSJmb3JtIjpyZXR1cm4gYW5jZXN0b3JJ bmZvLmZvcm1UYWd8fGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZTtjYXNlImxpIjpyZXR1 cm4gYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3Npbmc7Y2FzZSJkZCI6Y2FzZSJkdCI6 cmV0dXJuIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZztjYXNlImJ1dHRvbiI6cmV0 dXJuIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlO2Nhc2UiYSI6cmV0dXJuIGFuY2VzdG9y SW5mby5hVGFnSW5TY29wZTtjYXNlIm5vYnIiOnJldHVybiBhbmNlc3RvckluZm8ubm9iclRhZ0lu U2NvcGV9cmV0dXJuIG51bGx9O3ZhciBmaW5kT3duZXJTdGFjaz1mdW5jdGlvbihpbnN0YW5jZSl7 aWYoIWluc3RhbmNlKXtyZXR1cm5bXX12YXIgc3RhY2s9W107ZG97c3RhY2sucHVzaChpbnN0YW5j ZSl9d2hpbGUoaW5zdGFuY2U9aW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50Ll9vd25lcik7c3RhY2su cmV2ZXJzZSgpO3JldHVybiBzdGFja307dmFyIGRpZFdhcm49e307dmFsaWRhdGVET01OZXN0aW5n PWZ1bmN0aW9uKGNoaWxkVGFnLGNoaWxkVGV4dCxjaGlsZEluc3RhbmNlLGFuY2VzdG9ySW5mbyl7 YW5jZXN0b3JJbmZvPWFuY2VzdG9ySW5mb3x8ZW1wdHlBbmNlc3RvckluZm87dmFyIHBhcmVudElu Zm89YW5jZXN0b3JJbmZvLmN1cnJlbnQ7dmFyIHBhcmVudFRhZz1wYXJlbnRJbmZvJiZwYXJlbnRJ bmZvLnRhZztpZihjaGlsZFRleHQhPW51bGwpeyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/ d2FybmluZyhjaGlsZFRhZz09bnVsbCwidmFsaWRhdGVET01OZXN0aW5nOiB3aGVuIGNoaWxkVGV4 dCBpcyBwYXNzZWQsIGNoaWxkVGFnIHNob3VsZCBiZSBudWxsIik6dm9pZCAwO2NoaWxkVGFnPSIj dGV4dCJ9dmFyIGludmFsaWRQYXJlbnQ9aXNUYWdWYWxpZFdpdGhQYXJlbnQoY2hpbGRUYWcscGFy ZW50VGFnKT9udWxsOnBhcmVudEluZm87dmFyIGludmFsaWRBbmNlc3Rvcj1pbnZhbGlkUGFyZW50 P251bGw6ZmluZEludmFsaWRBbmNlc3RvckZvclRhZyhjaGlsZFRhZyxhbmNlc3RvckluZm8pO3Zh ciBwcm9ibGVtYXRpYz1pbnZhbGlkUGFyZW50fHxpbnZhbGlkQW5jZXN0b3I7aWYocHJvYmxlbWF0 aWMpe3ZhciBhbmNlc3RvclRhZz1wcm9ibGVtYXRpYy50YWc7dmFyIGFuY2VzdG9ySW5zdGFuY2U9 cHJvYmxlbWF0aWMuaW5zdGFuY2U7dmFyIGNoaWxkT3duZXI9Y2hpbGRJbnN0YW5jZSYmY2hpbGRJ bnN0YW5jZS5fY3VycmVudEVsZW1lbnQuX293bmVyO3ZhciBhbmNlc3Rvck93bmVyPWFuY2VzdG9y SW5zdGFuY2UmJmFuY2VzdG9ySW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50Ll9vd25lcjt2YXIgY2hp bGRPd25lcnM9ZmluZE93bmVyU3RhY2soY2hpbGRPd25lcik7dmFyIGFuY2VzdG9yT3duZXJzPWZp bmRPd25lclN0YWNrKGFuY2VzdG9yT3duZXIpO3ZhciBtaW5TdGFja0xlbj1NYXRoLm1pbihjaGls ZE93bmVycy5sZW5ndGgsYW5jZXN0b3JPd25lcnMubGVuZ3RoKTt2YXIgaTt2YXIgZGVlcGVzdENv bW1vbj0tMTtmb3IoaT0wO2k8bWluU3RhY2tMZW47aSsrKXtpZihjaGlsZE93bmVyc1tpXT09PWFu Y2VzdG9yT3duZXJzW2ldKXtkZWVwZXN0Q29tbW9uPWl9ZWxzZXticmVha319dmFyIFVOS05PV049 Iih1bmtub3duKSI7dmFyIGNoaWxkT3duZXJOYW1lcz1jaGlsZE93bmVycy5zbGljZShkZWVwZXN0 Q29tbW9uKzEpLm1hcChmdW5jdGlvbihpbnN0KXtyZXR1cm4gaW5zdC5nZXROYW1lKCl8fFVOS05P V059KTt2YXIgYW5jZXN0b3JPd25lck5hbWVzPWFuY2VzdG9yT3duZXJzLnNsaWNlKGRlZXBlc3RD b21tb24rMSkubWFwKGZ1bmN0aW9uKGluc3Qpe3JldHVybiBpbnN0LmdldE5hbWUoKXx8VU5LTk9X Tn0pO3ZhciBvd25lckluZm89W10uY29uY2F0KGRlZXBlc3RDb21tb24hPT0tMT9jaGlsZE93bmVy c1tkZWVwZXN0Q29tbW9uXS5nZXROYW1lKCl8fFVOS05PV046W10sYW5jZXN0b3JPd25lck5hbWVz LGFuY2VzdG9yVGFnLGludmFsaWRBbmNlc3Rvcj9bIi4uLiJdOltdLGNoaWxkT3duZXJOYW1lcyxj aGlsZFRhZykuam9pbigiID4gIik7dmFyIHdhcm5LZXk9ISFpbnZhbGlkUGFyZW50KyJ8IitjaGls ZFRhZysifCIrYW5jZXN0b3JUYWcrInwiK293bmVySW5mbztpZihkaWRXYXJuW3dhcm5LZXldKXty ZXR1cm59ZGlkV2Fyblt3YXJuS2V5XT10cnVlO3ZhciB0YWdEaXNwbGF5TmFtZT1jaGlsZFRhZzt2 YXIgd2hpdGVzcGFjZUluZm89IiI7aWYoY2hpbGRUYWc9PT0iI3RleHQiKXtpZigvXFMvLnRlc3Qo Y2hpbGRUZXh0KSl7dGFnRGlzcGxheU5hbWU9IlRleHQgbm9kZXMifWVsc2V7dGFnRGlzcGxheU5h bWU9IldoaXRlc3BhY2UgdGV4dCBub2RlcyI7d2hpdGVzcGFjZUluZm89IiBNYWtlIHN1cmUgeW91 IGRvbid0IGhhdmUgYW55IGV4dHJhIHdoaXRlc3BhY2UgYmV0d2VlbiB0YWdzIG9uICIrImVhY2gg bGluZSBvZiB5b3VyIHNvdXJjZSBjb2RlLiJ9fWVsc2V7dGFnRGlzcGxheU5hbWU9IjwiK2NoaWxk VGFnKyI+In1pZihpbnZhbGlkUGFyZW50KXt2YXIgaW5mbz0iIjtpZihhbmNlc3RvclRhZz09PSJ0 YWJsZSImJmNoaWxkVGFnPT09InRyIil7aW5mbys9IiBBZGQgYSA8dGJvZHk+IHRvIHlvdXIgY29k ZSB0byBtYXRjaCB0aGUgRE9NIHRyZWUgZ2VuZXJhdGVkIGJ5ICIrInRoZSBicm93c2VyLiJ9ImRl dmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKGZhbHNlLCJ2YWxpZGF0ZURPTU5lc3Rp bmcoLi4uKTogJXMgY2Fubm90IGFwcGVhciBhcyBhIGNoaWxkIG9mIDwlcz4uJXMgIisiU2VlICVz LiVzIix0YWdEaXNwbGF5TmFtZSxhbmNlc3RvclRhZyx3aGl0ZXNwYWNlSW5mbyxvd25lckluZm8s aW5mbyk6dm9pZCAwfWVsc2V7ImRldmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj93YXJuaW5nKGZh bHNlLCJ2YWxpZGF0ZURPTU5lc3RpbmcoLi4uKTogJXMgY2Fubm90IGFwcGVhciBhcyBhIGRlc2Nl bmRhbnQgb2YgIisiPCVzPi4gU2VlICVzLiIsdGFnRGlzcGxheU5hbWUsYW5jZXN0b3JUYWcsb3du ZXJJbmZvKTp2b2lkIDB9fX07dmFsaWRhdGVET01OZXN0aW5nLnVwZGF0ZWRBbmNlc3RvckluZm89 dXBkYXRlZEFuY2VzdG9ySW5mbzt2YWxpZGF0ZURPTU5lc3RpbmcuaXNUYWdWYWxpZEluQ29udGV4 dD1mdW5jdGlvbih0YWcsYW5jZXN0b3JJbmZvKXthbmNlc3RvckluZm89YW5jZXN0b3JJbmZvfHxl bXB0eUFuY2VzdG9ySW5mbzt2YXIgcGFyZW50SW5mbz1hbmNlc3RvckluZm8uY3VycmVudDt2YXIg cGFyZW50VGFnPXBhcmVudEluZm8mJnBhcmVudEluZm8udGFnO3JldHVybiBpc1RhZ1ZhbGlkV2l0 aFBhcmVudCh0YWcscGFyZW50VGFnKSYmIWZpbmRJbnZhbGlkQW5jZXN0b3JGb3JUYWcodGFnLGFu Y2VzdG9ySW5mbyl9fW1vZHVsZS5leHBvcnRzPXZhbGlkYXRlRE9NTmVzdGluZ30sezE0MjoxNDIs MTU3OjE1NywxNTg6MTU4fV0sMTMyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsi dXNlIHN0cmljdCI7dmFyIFJlYWN0SW50ZXJuYWxzPVJlYWN0Ll9fU0VDUkVUX0lOVEVSTkFMU19E T19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEO21vZHVsZS5leHBvcnRzPVJlYWN0SW50ZXJu YWxzLlJlYWN0Q29tcG9uZW50VHJlZUhvb2t9LHt9XSwxMzM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9k dWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgUmVhY3RJbnRlcm5hbHM9UmVhY3QuX19TRUNS RVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ7bW9kdWxlLmV4cG9y dHM9UmVhY3RJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXJ9LHt9XSwxMzQ6W2Z1bmN0aW9uKF9k ZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijttb2R1bGUuZXhwb3J0cz1SZWFjdH0s e31dLDEzNTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3Zh ciBlbXB0eUZ1bmN0aW9uPV9kZXJlcV8oMTQyKTt2YXIgRXZlbnRMaXN0ZW5lcj17bGlzdGVuOmZ1 bmN0aW9uIGxpc3Rlbih0YXJnZXQsZXZlbnRUeXBlLGNhbGxiYWNrKXtpZih0YXJnZXQuYWRkRXZl bnRMaXN0ZW5lcil7dGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLGNhbGxiYWNrLGZh bHNlKTtyZXR1cm57cmVtb3ZlOmZ1bmN0aW9uIHJlbW92ZSgpe3RhcmdldC5yZW1vdmVFdmVudExp c3RlbmVyKGV2ZW50VHlwZSxjYWxsYmFjayxmYWxzZSl9fX1lbHNlIGlmKHRhcmdldC5hdHRhY2hF dmVudCl7dGFyZ2V0LmF0dGFjaEV2ZW50KCJvbiIrZXZlbnRUeXBlLGNhbGxiYWNrKTtyZXR1cm57 cmVtb3ZlOmZ1bmN0aW9uIHJlbW92ZSgpe3RhcmdldC5kZXRhY2hFdmVudCgib24iK2V2ZW50VHlw ZSxjYWxsYmFjayl9fX19LGNhcHR1cmU6ZnVuY3Rpb24gY2FwdHVyZSh0YXJnZXQsZXZlbnRUeXBl LGNhbGxiYWNrKXtpZih0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcil7dGFyZ2V0LmFkZEV2ZW50TGlz dGVuZXIoZXZlbnRUeXBlLGNhbGxiYWNrLHRydWUpO3JldHVybntyZW1vdmU6ZnVuY3Rpb24gcmVt b3ZlKCl7dGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLGNhbGxiYWNrLHRydWUp fX19ZWxzZXtpZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXtjb25zb2xlLmVycm9yKCJB dHRlbXB0ZWQgdG8gbGlzdGVuIHRvIGV2ZW50cyBkdXJpbmcgdGhlIGNhcHR1cmUgcGhhc2Ugb24g YSAiKyJicm93c2VyIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgY2FwdHVyZSBwaGFzZS4gWW91 ciBhcHBsaWNhdGlvbiAiKyJ3aWxsIG5vdCByZWNlaXZlIHNvbWUgZXZlbnRzLiIpfXJldHVybnty ZW1vdmU6ZW1wdHlGdW5jdGlvbn19fSxyZWdpc3RlckRlZmF1bHQ6ZnVuY3Rpb24gcmVnaXN0ZXJE ZWZhdWx0KCl7fX07bW9kdWxlLmV4cG9ydHM9RXZlbnRMaXN0ZW5lcn0sezE0MjoxNDJ9XSwxMzY6 W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgY2FuVXNl RE9NPSEhKHR5cGVvZiB3aW5kb3chPT0idW5kZWZpbmVkIiYmd2luZG93LmRvY3VtZW50JiZ3aW5k b3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7dmFyIEV4ZWN1dGlvbkVudmlyb25tZW50PXtjYW5V c2VET006Y2FuVXNlRE9NLGNhblVzZVdvcmtlcnM6dHlwZW9mIFdvcmtlciE9PSJ1bmRlZmluZWQi LGNhblVzZUV2ZW50TGlzdGVuZXJzOmNhblVzZURPTSYmISEod2luZG93LmFkZEV2ZW50TGlzdGVu ZXJ8fHdpbmRvdy5hdHRhY2hFdmVudCksY2FuVXNlVmlld3BvcnQ6Y2FuVXNlRE9NJiYhIXdpbmRv dy5zY3JlZW4saXNJbldvcmtlcjohY2FuVXNlRE9NfTttb2R1bGUuZXhwb3J0cz1FeGVjdXRpb25F bnZpcm9ubWVudH0se31dLDEzNzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVz ZSBzdHJpY3QiO3ZhciBfaHlwaGVuUGF0dGVybj0vLSguKS9nO2Z1bmN0aW9uIGNhbWVsaXplKHN0 cmluZyl7cmV0dXJuIHN0cmluZy5yZXBsYWNlKF9oeXBoZW5QYXR0ZXJuLGZ1bmN0aW9uKF8sY2hh cmFjdGVyKXtyZXR1cm4gY2hhcmFjdGVyLnRvVXBwZXJDYXNlKCl9KX1tb2R1bGUuZXhwb3J0cz1j YW1lbGl6ZX0se31dLDEzODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBz dHJpY3QiO3ZhciBjYW1lbGl6ZT1fZGVyZXFfKDEzNyk7dmFyIG1zUGF0dGVybj0vXi1tcy0vO2Z1 bmN0aW9uIGNhbWVsaXplU3R5bGVOYW1lKHN0cmluZyl7cmV0dXJuIGNhbWVsaXplKHN0cmluZy5y ZXBsYWNlKG1zUGF0dGVybiwibXMtIikpfW1vZHVsZS5leHBvcnRzPWNhbWVsaXplU3R5bGVOYW1l fSx7MTM3OjEzN31dLDEzOTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBz dHJpY3QiO3ZhciBpc1RleHROb2RlPV9kZXJlcV8oMTUyKTtmdW5jdGlvbiBjb250YWluc05vZGUo b3V0ZXJOb2RlLGlubmVyTm9kZSl7aWYoIW91dGVyTm9kZXx8IWlubmVyTm9kZSl7cmV0dXJuIGZh bHNlfWVsc2UgaWYob3V0ZXJOb2RlPT09aW5uZXJOb2RlKXtyZXR1cm4gdHJ1ZX1lbHNlIGlmKGlz VGV4dE5vZGUob3V0ZXJOb2RlKSl7cmV0dXJuIGZhbHNlfWVsc2UgaWYoaXNUZXh0Tm9kZShpbm5l ck5vZGUpKXtyZXR1cm4gY29udGFpbnNOb2RlKG91dGVyTm9kZSxpbm5lck5vZGUucGFyZW50Tm9k ZSl9ZWxzZSBpZigiY29udGFpbnMiaW4gb3V0ZXJOb2RlKXtyZXR1cm4gb3V0ZXJOb2RlLmNvbnRh aW5zKGlubmVyTm9kZSl9ZWxzZSBpZihvdXRlck5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24p e3JldHVybiEhKG91dGVyTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihpbm5lck5vZGUpJjE2 KX1lbHNle3JldHVybiBmYWxzZX19bW9kdWxlLmV4cG9ydHM9Y29udGFpbnNOb2RlfSx7MTUyOjE1 Mn1dLDE0MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3Zh ciBpbnZhcmlhbnQ9X2RlcmVxXygxNTApO2Z1bmN0aW9uIHRvQXJyYXkob2JqKXt2YXIgbGVuZ3Ro PW9iai5sZW5ndGg7ISghQXJyYXkuaXNBcnJheShvYmopJiYodHlwZW9mIG9iaj09PSJvYmplY3Qi fHx0eXBlb2Ygb2JqPT09ImZ1bmN0aW9uIikpPyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/ aW52YXJpYW50KGZhbHNlLCJ0b0FycmF5OiBBcnJheS1saWtlIG9iamVjdCBleHBlY3RlZCIpOmlu dmFyaWFudChmYWxzZSk6dm9pZCAwOyEodHlwZW9mIGxlbmd0aD09PSJudW1iZXIiKT8iZGV2ZWxv cG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwidG9BcnJheTogT2JqZWN0IG5l ZWRzIGEgbGVuZ3RoIHByb3BlcnR5Iik6aW52YXJpYW50KGZhbHNlKTp2b2lkIDA7IShsZW5ndGg9 PT0wfHxsZW5ndGgtMSBpbiBvYmopPyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/aW52YXJp YW50KGZhbHNlLCJ0b0FycmF5OiBPYmplY3Qgc2hvdWxkIGhhdmUga2V5cyBmb3IgaW5kaWNlcyIp OmludmFyaWFudChmYWxzZSk6dm9pZCAwOyEodHlwZW9mIG9iai5jYWxsZWUhPT0iZnVuY3Rpb24i KT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChmYWxzZSwidG9BcnJheTog T2JqZWN0IGNhbid0IGJlIGBhcmd1bWVudHNgLiBVc2UgcmVzdCBwYXJhbXMgIisiKGZ1bmN0aW9u KC4uLmFyZ3MpIHt9KSBvciBBcnJheS5mcm9tKCkgaW5zdGVhZC4iKTppbnZhcmlhbnQoZmFsc2Up OnZvaWQgMDtpZihvYmouaGFzT3duUHJvcGVydHkpe3RyeXtyZXR1cm4gQXJyYXkucHJvdG90eXBl LnNsaWNlLmNhbGwob2JqKX1jYXRjaChlKXt9fXZhciByZXQ9QXJyYXkobGVuZ3RoKTtmb3IodmFy IGlpPTA7aWk8bGVuZ3RoO2lpKyspe3JldFtpaV09b2JqW2lpXX1yZXR1cm4gcmV0fWZ1bmN0aW9u IGhhc0FycmF5TmF0dXJlKG9iail7cmV0dXJuISFvYmomJih0eXBlb2Ygb2JqPT0ib2JqZWN0Inx8 dHlwZW9mIG9iaj09ImZ1bmN0aW9uIikmJiJsZW5ndGgiaW4gb2JqJiYhKCJzZXRJbnRlcnZhbCJp biBvYmopJiZ0eXBlb2Ygb2JqLm5vZGVUeXBlIT0ibnVtYmVyIiYmKEFycmF5LmlzQXJyYXkob2Jq KXx8ImNhbGxlZSJpbiBvYmp8fCJpdGVtImluIG9iail9ZnVuY3Rpb24gY3JlYXRlQXJyYXlGcm9t TWl4ZWQob2JqKXtpZighaGFzQXJyYXlOYXR1cmUob2JqKSl7cmV0dXJuW29ial19ZWxzZSBpZihB cnJheS5pc0FycmF5KG9iaikpe3JldHVybiBvYmouc2xpY2UoKX1lbHNle3JldHVybiB0b0FycmF5 KG9iail9fW1vZHVsZS5leHBvcnRzPWNyZWF0ZUFycmF5RnJvbU1peGVkfSx7MTUwOjE1MH1dLDE0 MTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBFeGVj dXRpb25FbnZpcm9ubWVudD1fZGVyZXFfKDEzNik7dmFyIGNyZWF0ZUFycmF5RnJvbU1peGVkPV9k ZXJlcV8oMTQwKTt2YXIgZ2V0TWFya3VwV3JhcD1fZGVyZXFfKDE0Nik7dmFyIGludmFyaWFudD1f ZGVyZXFfKDE1MCk7dmFyIGR1bW15Tm9kZT1FeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00/ ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik6bnVsbDt2YXIgbm9kZU5hbWVQYXR0ZXJuPS9e XHMqPChcdyspLztmdW5jdGlvbiBnZXROb2RlTmFtZShtYXJrdXApe3ZhciBub2RlTmFtZU1hdGNo PW1hcmt1cC5tYXRjaChub2RlTmFtZVBhdHRlcm4pO3JldHVybiBub2RlTmFtZU1hdGNoJiZub2Rl TmFtZU1hdGNoWzFdLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gY3JlYXRlTm9kZXNGcm9tTWFya3Vw KG1hcmt1cCxoYW5kbGVTY3JpcHQpe3ZhciBub2RlPWR1bW15Tm9kZTshISFkdW1teU5vZGU/ImRl dmVsb3BtZW50IiE9PSJwcm9kdWN0aW9uIj9pbnZhcmlhbnQoZmFsc2UsImNyZWF0ZU5vZGVzRnJv bU1hcmt1cCBkdW1teSBub3QgaW5pdGlhbGl6ZWQiKTppbnZhcmlhbnQoZmFsc2UpOnZvaWQgMDt2 YXIgbm9kZU5hbWU9Z2V0Tm9kZU5hbWUobWFya3VwKTt2YXIgd3JhcD1ub2RlTmFtZSYmZ2V0TWFy a3VwV3JhcChub2RlTmFtZSk7aWYod3JhcCl7bm9kZS5pbm5lckhUTUw9d3JhcFsxXSttYXJrdXAr d3JhcFsyXTt2YXIgd3JhcERlcHRoPXdyYXBbMF07d2hpbGUod3JhcERlcHRoLS0pe25vZGU9bm9k ZS5sYXN0Q2hpbGR9fWVsc2V7bm9kZS5pbm5lckhUTUw9bWFya3VwfXZhciBzY3JpcHRzPW5vZGUu Z2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpO2lmKHNjcmlwdHMubGVuZ3RoKXshaGFuZGxl U2NyaXB0PyJkZXZlbG9wbWVudCIhPT0icHJvZHVjdGlvbiI/aW52YXJpYW50KGZhbHNlLCJjcmVh dGVOb2Rlc0Zyb21NYXJrdXAoLi4uKTogVW5leHBlY3RlZCA8c2NyaXB0PiBlbGVtZW50IHJlbmRl cmVkLiIpOmludmFyaWFudChmYWxzZSk6dm9pZCAwO2NyZWF0ZUFycmF5RnJvbU1peGVkKHNjcmlw dHMpLmZvckVhY2goaGFuZGxlU2NyaXB0KX12YXIgbm9kZXM9QXJyYXkuZnJvbShub2RlLmNoaWxk Tm9kZXMpO3doaWxlKG5vZGUubGFzdENoaWxkKXtub2RlLnJlbW92ZUNoaWxkKG5vZGUubGFzdENo aWxkKX1yZXR1cm4gbm9kZXN9bW9kdWxlLmV4cG9ydHM9Y3JlYXRlTm9kZXNGcm9tTWFya3VwfSx7 MTM2OjEzNiwxNDA6MTQwLDE0NjoxNDYsMTUwOjE1MH1dLDE0MjpbZnVuY3Rpb24oX2RlcmVxXyxt b2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG1ha2VFbXB0eUZ1bmN0aW9uKGFy Zyl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ319dmFyIGVtcHR5RnVuY3Rpb249ZnVuY3Rp b24gZW1wdHlGdW5jdGlvbigpe307ZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJucz1tYWtlRW1wdHlG dW5jdGlvbjtlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zRmFsc2U9bWFrZUVtcHR5RnVuY3Rpb24o ZmFsc2UpO2VtcHR5RnVuY3Rpb24udGhhdFJldHVybnNUcnVlPW1ha2VFbXB0eUZ1bmN0aW9uKHRy dWUpO2VtcHR5RnVuY3Rpb24udGhhdFJldHVybnNOdWxsPW1ha2VFbXB0eUZ1bmN0aW9uKG51bGwp O2VtcHR5RnVuY3Rpb24udGhhdFJldHVybnNUaGlzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O2Vt cHR5RnVuY3Rpb24udGhhdFJldHVybnNBcmd1bWVudD1mdW5jdGlvbihhcmcpe3JldHVybiBhcmd9 O21vZHVsZS5leHBvcnRzPWVtcHR5RnVuY3Rpb259LHt9XSwxNDM6W2Z1bmN0aW9uKF9kZXJlcV8s bW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZW1wdHlPYmplY3Q9e307aWYoImRldmVs b3BtZW50IiE9PSJwcm9kdWN0aW9uIil7T2JqZWN0LmZyZWV6ZShlbXB0eU9iamVjdCl9bW9kdWxl LmV4cG9ydHM9ZW1wdHlPYmplY3R9LHt9XSwxNDQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4 cG9ydHMpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBmb2N1c05vZGUobm9kZSl7dHJ5e25vZGUuZm9j dXMoKX1jYXRjaChlKXt9fW1vZHVsZS5leHBvcnRzPWZvY3VzTm9kZX0se31dLDE0NTpbZnVuY3Rp b24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGdldEFjdGl2 ZUVsZW1lbnQoKXtpZih0eXBlb2YgZG9jdW1lbnQ9PT0idW5kZWZpbmVkIil7cmV0dXJuIG51bGx9 dHJ5e3JldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50fHxkb2N1bWVudC5ib2R5fWNhdGNoKGUp e3JldHVybiBkb2N1bWVudC5ib2R5fX1tb2R1bGUuZXhwb3J0cz1nZXRBY3RpdmVFbGVtZW50fSx7 fV0sMTQ2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFy IEV4ZWN1dGlvbkVudmlyb25tZW50PV9kZXJlcV8oMTM2KTt2YXIgaW52YXJpYW50PV9kZXJlcV8o MTUwKTt2YXIgZHVtbXlOb2RlPUV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTT9kb2N1bWVu dC5jcmVhdGVFbGVtZW50KCJkaXYiKTpudWxsO3ZhciBzaG91bGRXcmFwPXt9O3ZhciBzZWxlY3RX cmFwPVsxLCc8c2VsZWN0IG11bHRpcGxlPSJ0cnVlIj4nLCI8L3NlbGVjdD4iXTt2YXIgdGFibGVX cmFwPVsxLCI8dGFibGU+IiwiPC90YWJsZT4iXTt2YXIgdHJXcmFwPVszLCI8dGFibGU+PHRib2R5 Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXTt2YXIgc3ZnV3JhcD1bMSwnPHN2ZyB4bWxu cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPicsIjwvc3ZnPiJdO3ZhciBtYXJrdXBXcmFw PXsiKiI6WzEsIj88ZGl2PiIsIjwvZGl2PiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0sY29s OlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJs ZT4iXSxsZWdlbmQ6WzEsIjxmaWVsZHNldD4iLCI8L2ZpZWxkc2V0PiJdLHBhcmFtOlsxLCI8b2Jq ZWN0PiIsIjwvb2JqZWN0PiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJs ZT4iXSxvcHRncm91cDpzZWxlY3RXcmFwLG9wdGlvbjpzZWxlY3RXcmFwLGNhcHRpb246dGFibGVX cmFwLGNvbGdyb3VwOnRhYmxlV3JhcCx0Ym9keTp0YWJsZVdyYXAsdGZvb3Q6dGFibGVXcmFwLHRo ZWFkOnRhYmxlV3JhcCx0ZDp0cldyYXAsdGg6dHJXcmFwfTt2YXIgc3ZnRWxlbWVudHM9WyJjaXJj bGUiLCJjbGlwUGF0aCIsImRlZnMiLCJlbGxpcHNlIiwiZyIsImltYWdlIiwibGluZSIsImxpbmVh ckdyYWRpZW50IiwibWFzayIsInBhdGgiLCJwYXR0ZXJuIiwicG9seWdvbiIsInBvbHlsaW5lIiwi cmFkaWFsR3JhZGllbnQiLCJyZWN0Iiwic3RvcCIsInRleHQiLCJ0c3BhbiJdO3N2Z0VsZW1lbnRz LmZvckVhY2goZnVuY3Rpb24obm9kZU5hbWUpe21hcmt1cFdyYXBbbm9kZU5hbWVdPXN2Z1dyYXA7 c2hvdWxkV3JhcFtub2RlTmFtZV09dHJ1ZX0pO2Z1bmN0aW9uIGdldE1hcmt1cFdyYXAobm9kZU5h bWUpeyEhIWR1bW15Tm9kZT8iZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iP2ludmFyaWFudChm YWxzZSwiTWFya3VwIHdyYXBwaW5nIG5vZGUgbm90IGluaXRpYWxpemVkIik6aW52YXJpYW50KGZh bHNlKTp2b2lkIDA7aWYoIW1hcmt1cFdyYXAuaGFzT3duUHJvcGVydHkobm9kZU5hbWUpKXtub2Rl TmFtZT0iKiJ9aWYoIXNob3VsZFdyYXAuaGFzT3duUHJvcGVydHkobm9kZU5hbWUpKXtpZihub2Rl TmFtZT09PSIqIil7ZHVtbXlOb2RlLmlubmVySFRNTD0iPGxpbmsgLz4ifWVsc2V7ZHVtbXlOb2Rl LmlubmVySFRNTD0iPCIrbm9kZU5hbWUrIj48LyIrbm9kZU5hbWUrIj4ifXNob3VsZFdyYXBbbm9k ZU5hbWVdPSFkdW1teU5vZGUuZmlyc3RDaGlsZH1yZXR1cm4gc2hvdWxkV3JhcFtub2RlTmFtZV0/ bWFya3VwV3JhcFtub2RlTmFtZV06bnVsbH1tb2R1bGUuZXhwb3J0cz1nZXRNYXJrdXBXcmFwfSx7 MTM2OjEzNiwxNTA6MTUwfV0sMTQ3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsi dXNlIHN0cmljdCI7ZnVuY3Rpb24gZ2V0VW5ib3VuZGVkU2Nyb2xsUG9zaXRpb24oc2Nyb2xsYWJs ZSl7aWYoc2Nyb2xsYWJsZT09PXdpbmRvdyl7cmV0dXJue3g6d2luZG93LnBhZ2VYT2Zmc2V0fHxk b2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCx5OndpbmRvdy5wYWdlWU9mZnNldHx8 ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcH19cmV0dXJue3g6c2Nyb2xsYWJsZS5z Y3JvbGxMZWZ0LHk6c2Nyb2xsYWJsZS5zY3JvbGxUb3B9fW1vZHVsZS5leHBvcnRzPWdldFVuYm91 bmRlZFNjcm9sbFBvc2l0aW9ufSx7fV0sMTQ4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBv cnRzKXsidXNlIHN0cmljdCI7dmFyIF91cHBlcmNhc2VQYXR0ZXJuPS8oW0EtWl0pL2c7ZnVuY3Rp b24gaHlwaGVuYXRlKHN0cmluZyl7cmV0dXJuIHN0cmluZy5yZXBsYWNlKF91cHBlcmNhc2VQYXR0 ZXJuLCItJDEiKS50b0xvd2VyQ2FzZSgpfW1vZHVsZS5leHBvcnRzPWh5cGhlbmF0ZX0se31dLDE0 OTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBoeXBo ZW5hdGU9X2RlcmVxXygxNDgpO3ZhciBtc1BhdHRlcm49L15tcy0vO2Z1bmN0aW9uIGh5cGhlbmF0 ZVN0eWxlTmFtZShzdHJpbmcpe3JldHVybiBoeXBoZW5hdGUoc3RyaW5nKS5yZXBsYWNlKG1zUGF0 dGVybiwiLW1zLSIpfW1vZHVsZS5leHBvcnRzPWh5cGhlbmF0ZVN0eWxlTmFtZX0sezE0ODoxNDh9 XSwxNTA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIg dmFsaWRhdGVGb3JtYXQ9ZnVuY3Rpb24gdmFsaWRhdGVGb3JtYXQoZm9ybWF0KXt9O2lmKCJkZXZl bG9wbWVudCIhPT0icHJvZHVjdGlvbiIpe3ZhbGlkYXRlRm9ybWF0PWZ1bmN0aW9uIHZhbGlkYXRl Rm9ybWF0KGZvcm1hdCl7aWYoZm9ybWF0PT09dW5kZWZpbmVkKXt0aHJvdyBuZXcgRXJyb3IoImlu dmFyaWFudCByZXF1aXJlcyBhbiBlcnJvciBtZXNzYWdlIGFyZ3VtZW50Iil9fX1mdW5jdGlvbiBp bnZhcmlhbnQoY29uZGl0aW9uLGZvcm1hdCxhLGIsYyxkLGUsZil7dmFsaWRhdGVGb3JtYXQoZm9y bWF0KTtpZighY29uZGl0aW9uKXt2YXIgZXJyb3I7aWYoZm9ybWF0PT09dW5kZWZpbmVkKXtlcnJv cj1uZXcgRXJyb3IoIk1pbmlmaWVkIGV4Y2VwdGlvbiBvY2N1cnJlZDsgdXNlIHRoZSBub24tbWlu aWZpZWQgZGV2IGVudmlyb25tZW50ICIrImZvciB0aGUgZnVsbCBlcnJvciBtZXNzYWdlIGFuZCBh ZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuIil9ZWxzZXt2YXIgYXJncz1bYSxiLGMsZCxlLGZd O3ZhciBhcmdJbmRleD0wO2Vycm9yPW5ldyBFcnJvcihmb3JtYXQucmVwbGFjZSgvJXMvZyxmdW5j dGlvbigpe3JldHVybiBhcmdzW2FyZ0luZGV4KytdfSkpO2Vycm9yLm5hbWU9IkludmFyaWFudCBW aW9sYXRpb24ifWVycm9yLmZyYW1lc1RvUG9wPTE7dGhyb3cgZXJyb3J9fW1vZHVsZS5leHBvcnRz PWludmFyaWFudH0se31dLDE1MTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7InVz ZSBzdHJpY3QiO2Z1bmN0aW9uIGlzTm9kZShvYmplY3Qpe3JldHVybiEhKG9iamVjdCYmKHR5cGVv ZiBOb2RlPT09ImZ1bmN0aW9uIj9vYmplY3QgaW5zdGFuY2VvZiBOb2RlOnR5cGVvZiBvYmplY3Q9 PT0ib2JqZWN0IiYmdHlwZW9mIG9iamVjdC5ub2RlVHlwZT09PSJudW1iZXIiJiZ0eXBlb2Ygb2Jq ZWN0Lm5vZGVOYW1lPT09InN0cmluZyIpKX1tb2R1bGUuZXhwb3J0cz1pc05vZGV9LHt9XSwxNTI6 W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgaXNOb2Rl PV9kZXJlcV8oMTUxKTtmdW5jdGlvbiBpc1RleHROb2RlKG9iamVjdCl7cmV0dXJuIGlzTm9kZShv YmplY3QpJiZvYmplY3Qubm9kZVR5cGU9PTN9bW9kdWxlLmV4cG9ydHM9aXNUZXh0Tm9kZX0sezE1 MToxNTF9XSwxNTM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0 IjtmdW5jdGlvbiBtZW1vaXplU3RyaW5nT25seShjYWxsYmFjayl7dmFyIGNhY2hlPXt9O3JldHVy biBmdW5jdGlvbihzdHJpbmcpe2lmKCFjYWNoZS5oYXNPd25Qcm9wZXJ0eShzdHJpbmcpKXtjYWNo ZVtzdHJpbmddPWNhbGxiYWNrLmNhbGwodGhpcyxzdHJpbmcpfXJldHVybiBjYWNoZVtzdHJpbmdd fX1tb2R1bGUuZXhwb3J0cz1tZW1vaXplU3RyaW5nT25seX0se31dLDE1NDpbZnVuY3Rpb24oX2Rl cmVxXyxtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciBFeGVjdXRpb25FbnZpcm9ubWVu dD1fZGVyZXFfKDEzNik7dmFyIHBlcmZvcm1hbmNlO2lmKEV4ZWN1dGlvbkVudmlyb25tZW50LmNh blVzZURPTSl7cGVyZm9ybWFuY2U9d2luZG93LnBlcmZvcm1hbmNlfHx3aW5kb3cubXNQZXJmb3Jt YW5jZXx8d2luZG93LndlYmtpdFBlcmZvcm1hbmNlfW1vZHVsZS5leHBvcnRzPXBlcmZvcm1hbmNl fHx7fX0sezEzNjoxMzZ9XSwxNTU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1 c2Ugc3RyaWN0Ijt2YXIgcGVyZm9ybWFuY2U9X2RlcmVxXygxNTQpO3ZhciBwZXJmb3JtYW5jZU5v dztpZihwZXJmb3JtYW5jZS5ub3cpe3BlcmZvcm1hbmNlTm93PWZ1bmN0aW9uIHBlcmZvcm1hbmNl Tm93KCl7cmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpfX1lbHNle3BlcmZvcm1hbmNlTm93PWZ1bmN0 aW9uIHBlcmZvcm1hbmNlTm93KCl7cmV0dXJuIERhdGUubm93KCl9fW1vZHVsZS5leHBvcnRzPXBl cmZvcm1hbmNlTm93fSx7MTU0OjE1NH1dLDE1NjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhw b3J0cyl7InVzZSBzdHJpY3QiO3ZhciBoYXNPd25Qcm9wZXJ0eT1PYmplY3QucHJvdG90eXBlLmhh c093blByb3BlcnR5O2Z1bmN0aW9uIGlzKHgseSl7aWYoeD09PXkpe3JldHVybiB4IT09MHx8eSE9 PTB8fDEveD09PTEveX1lbHNle3JldHVybiB4IT09eCYmeSE9PXl9fWZ1bmN0aW9uIHNoYWxsb3dF cXVhbChvYmpBLG9iakIpe2lmKGlzKG9iakEsb2JqQikpe3JldHVybiB0cnVlfWlmKHR5cGVvZiBv YmpBIT09Im9iamVjdCJ8fG9iakE9PT1udWxsfHx0eXBlb2Ygb2JqQiE9PSJvYmplY3QifHxvYmpC PT09bnVsbCl7cmV0dXJuIGZhbHNlfXZhciBrZXlzQT1PYmplY3Qua2V5cyhvYmpBKTt2YXIga2V5 c0I9T2JqZWN0LmtleXMob2JqQik7aWYoa2V5c0EubGVuZ3RoIT09a2V5c0IubGVuZ3RoKXtyZXR1 cm4gZmFsc2V9Zm9yKHZhciBpPTA7aTxrZXlzQS5sZW5ndGg7aSsrKXtpZighaGFzT3duUHJvcGVy dHkuY2FsbChvYmpCLGtleXNBW2ldKXx8IWlzKG9iakFba2V5c0FbaV1dLG9iakJba2V5c0FbaV1d KSl7cmV0dXJuIGZhbHNlfX1yZXR1cm4gdHJ1ZX1tb2R1bGUuZXhwb3J0cz1zaGFsbG93RXF1YWx9 LHt9XSwxNTc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2 YXIgZW1wdHlGdW5jdGlvbj1fZGVyZXFfKDE0Mik7dmFyIHdhcm5pbmc9ZW1wdHlGdW5jdGlvbjtp ZigiZGV2ZWxvcG1lbnQiIT09InByb2R1Y3Rpb24iKXsoZnVuY3Rpb24oKXt2YXIgcHJpbnRXYXJu aW5nPWZ1bmN0aW9uIHByaW50V2FybmluZyhmb3JtYXQpe2Zvcih2YXIgX2xlbj1hcmd1bWVudHMu bGVuZ3RoLGFyZ3M9QXJyYXkoX2xlbj4xP19sZW4tMTowKSxfa2V5PTE7X2tleTxfbGVuO19rZXkr Kyl7YXJnc1tfa2V5LTFdPWFyZ3VtZW50c1tfa2V5XX12YXIgYXJnSW5kZXg9MDt2YXIgbWVzc2Fn ZT0iV2FybmluZzogIitmb3JtYXQucmVwbGFjZSgvJXMvZyxmdW5jdGlvbigpe3JldHVybiBhcmdz W2FyZ0luZGV4KytdfSk7aWYodHlwZW9mIGNvbnNvbGUhPT0idW5kZWZpbmVkIil7Y29uc29sZS5l cnJvcihtZXNzYWdlKX10cnl7dGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpfWNhdGNoKHgpe319O3dh cm5pbmc9ZnVuY3Rpb24gd2FybmluZyhjb25kaXRpb24sZm9ybWF0KXtpZihmb3JtYXQ9PT11bmRl ZmluZWQpe3Rocm93IG5ldyBFcnJvcigiYHdhcm5pbmcoY29uZGl0aW9uLCBmb3JtYXQsIC4uLmFy Z3MpYCByZXF1aXJlcyBhIHdhcm5pbmcgIisibWVzc2FnZSBhcmd1bWVudCIpfWlmKGZvcm1hdC5p bmRleE9mKCJGYWlsZWQgQ29tcG9zaXRlIHByb3BUeXBlOiAiKT09PTApe3JldHVybn1pZighY29u ZGl0aW9uKXtmb3IodmFyIF9sZW4yPWFyZ3VtZW50cy5sZW5ndGgsYXJncz1BcnJheShfbGVuMj4y P19sZW4yLTI6MCksX2tleTI9Mjtfa2V5MjxfbGVuMjtfa2V5MisrKXthcmdzW19rZXkyLTJdPWFy Z3VtZW50c1tfa2V5Ml19cHJpbnRXYXJuaW5nLmFwcGx5KHVuZGVmaW5lZCxbZm9ybWF0XS5jb25j YXQoYXJncykpfX19KSgpfW1vZHVsZS5leHBvcnRzPXdhcm5pbmd9LHsxNDI6MTQyfV0sMTU4Oltm dW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7dmFyIGhhc093blBy b3BlcnR5PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIHByb3BJc0VudW1lcmFi bGU9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtmdW5jdGlvbiB0b09iamVj dCh2YWwpe2lmKHZhbD09PW51bGx8fHZhbD09PXVuZGVmaW5lZCl7dGhyb3cgbmV3IFR5cGVFcnJv cigiT2JqZWN0LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQi KX1yZXR1cm4gT2JqZWN0KHZhbCl9ZnVuY3Rpb24gc2hvdWxkVXNlTmF0aXZlKCl7dHJ5e2lmKCFP YmplY3QuYXNzaWduKXtyZXR1cm4gZmFsc2V9dmFyIHRlc3QxPW5ldyBTdHJpbmcoImFiYyIpO3Rl c3QxWzVdPSJkZSI7aWYoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDEpWzBdPT09IjUi KXtyZXR1cm4gZmFsc2V9dmFyIHRlc3QyPXt9O2Zvcih2YXIgaT0wO2k8MTA7aSsrKXt0ZXN0Mlsi XyIrU3RyaW5nLmZyb21DaGFyQ29kZShpKV09aX12YXIgb3JkZXIyPU9iamVjdC5nZXRPd25Qcm9w ZXJ0eU5hbWVzKHRlc3QyKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIHRlc3QyW25dfSk7aWYob3Jk ZXIyLmpvaW4oIiIpIT09IjAxMjM0NTY3ODkiKXtyZXR1cm4gZmFsc2V9dmFyIHRlc3QzPXt9OyJh YmNkZWZnaGlqa2xtbm9wcXJzdCIuc3BsaXQoIiIpLmZvckVhY2goZnVuY3Rpb24obGV0dGVyKXt0 ZXN0M1tsZXR0ZXJdPWxldHRlcn0pO2lmKE9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sdGVz dDMpKS5qb2luKCIiKSE9PSJhYmNkZWZnaGlqa2xtbm9wcXJzdCIpe3JldHVybiBmYWxzZX1yZXR1 cm4gdHJ1ZX1jYXRjaChlKXtyZXR1cm4gZmFsc2V9fW1vZHVsZS5leHBvcnRzPXNob3VsZFVzZU5h dGl2ZSgpP09iamVjdC5hc3NpZ246ZnVuY3Rpb24odGFyZ2V0LHNvdXJjZSl7dmFyIGZyb207dmFy IHRvPXRvT2JqZWN0KHRhcmdldCk7dmFyIHN5bWJvbHM7Zm9yKHZhciBzPTE7czxhcmd1bWVudHMu bGVuZ3RoO3MrKyl7ZnJvbT1PYmplY3QoYXJndW1lbnRzW3NdKTtmb3IodmFyIGtleSBpbiBmcm9t KXtpZihoYXNPd25Qcm9wZXJ0eS5jYWxsKGZyb20sa2V5KSl7dG9ba2V5XT1mcm9tW2tleV19fWlm KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3N5bWJvbHM9T2JqZWN0LmdldE93blByb3Bl cnR5U3ltYm9scyhmcm9tKTtmb3IodmFyIGk9MDtpPHN5bWJvbHMubGVuZ3RoO2krKyl7aWYocHJv cElzRW51bWVyYWJsZS5jYWxsKGZyb20sc3ltYm9sc1tpXSkpe3RvW3N5bWJvbHNbaV1dPWZyb21b c3ltYm9sc1tpXV19fX19cmV0dXJuIHRvfX0se31dfSx7fSxbNDhdKSg0OCl9KX0pOwpkaWZmIC0t Z2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1N5bnRoZXRpY0V2 ZW50LmpzIGIvd2ViL3BnYWRtaW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1N5bnRoZXRp Y0V2ZW50LmpzCmluZGV4IDZiNzQ1Y2NjLi4wZTA3MzExYSAxMDA2NDQKLS0tIGEvd2ViL3BnYWRt aW4vc3RhdGljL3ZlbmRvci9yZWFjdC1kb20vbGliL1N5bnRoZXRpY0V2ZW50LmpzCisrKyBiL3dl Yi9wZ2FkbWluL3N0YXRpYy92ZW5kb3IvcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNFdmVudC5qcwpA QCAtMTgyLDYgKzE4MiwyOSBAQCBfYXNzaWduKFN5bnRoZXRpY0V2ZW50LnByb3RvdHlwZSwgewog CiBTeW50aGV0aWNFdmVudC5JbnRlcmZhY2UgPSBFdmVudEludGVyZmFjZTsKIAorLyoqCisgKiBI ZWxwZXIgdG8gcmVkdWNlIGJvaWxlcnBsYXRlIHdoZW4gY3JlYXRpbmcgc3ViY2xhc3Nlcy4KKyAq CisgKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcworICogQHBhcmFtIHs/b2JqZWN0fSBJbnRlcmZh Y2UKKyAqLworU3ludGhldGljRXZlbnQuYXVnbWVudENsYXNzID0gZnVuY3Rpb24gKENsYXNzLCBJ bnRlcmZhY2UpIHsKKyAgdmFyIFN1cGVyID0gdGhpczsKKworICB2YXIgRSA9IGZ1bmN0aW9uICgp IHt9OworICBFLnByb3RvdHlwZSA9IFN1cGVyLnByb3RvdHlwZTsKKyAgdmFyIHByb3RvdHlwZSA9 IG5ldyBFKCk7CisKKyAgX2Fzc2lnbihwcm90b3R5cGUsIENsYXNzLnByb3RvdHlwZSk7CisgIENs YXNzLnByb3RvdHlwZSA9IHByb3RvdHlwZTsKKyAgQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9y ID0gQ2xhc3M7CisKKyAgQ2xhc3MuSW50ZXJmYWNlID0gX2Fzc2lnbih7fSwgU3VwZXIuSW50ZXJm YWNlLCBJbnRlcmZhY2UpOworICBDbGFzcy5hdWdtZW50Q2xhc3MgPSBTdXBlci5hdWdtZW50Q2xh c3M7CisKKyAgUG9vbGVkQ2xhc3MuYWRkUG9vbGluZ1RvKENsYXNzLCBQb29sZWRDbGFzcy5mb3Vy QXJndW1lbnRQb29sZXIpOworfTsKKwogaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJv ZHVjdGlvbicpIHsKICAgaWYgKGlzUHJveHlTdXBwb3J0ZWQpIHsKICAgICAvKmVzbGludC1kaXNh YmxlIG5vLWZ1bmMtYXNzaWduICovCkBAIC0yMDUsMjggKzIyOCw2IEBAIGlmIChwcm9jZXNzLmVu di5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgLyplc2xpbnQtZW5hYmxlIG5vLWZ1 bmMtYXNzaWduICovCiAgIH0KIH0KLS8qKgotICogSGVscGVyIHRvIHJlZHVjZSBib2lsZXJwbGF0 ZSB3aGVuIGNyZWF0aW5nIHN1YmNsYXNzZXMuCi0gKgotICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xh c3MKLSAqIEBwYXJhbSB7P29iamVjdH0gSW50ZXJmYWNlCi0gKi8KLVN5bnRoZXRpY0V2ZW50LmF1 Z21lbnRDbGFzcyA9IGZ1bmN0aW9uIChDbGFzcywgSW50ZXJmYWNlKSB7Ci0gIHZhciBTdXBlciA9 IHRoaXM7Ci0KLSAgdmFyIEUgPSBmdW5jdGlvbiAoKSB7fTsKLSAgRS5wcm90b3R5cGUgPSBTdXBl ci5wcm90b3R5cGU7Ci0gIHZhciBwcm90b3R5cGUgPSBuZXcgRSgpOwotCi0gIF9hc3NpZ24ocHJv dG90eXBlLCBDbGFzcy5wcm90b3R5cGUpOwotICBDbGFzcy5wcm90b3R5cGUgPSBwcm90b3R5cGU7 Ci0gIENsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENsYXNzOwotCi0gIENsYXNzLkludGVy ZmFjZSA9IF9hc3NpZ24oe30sIFN1cGVyLkludGVyZmFjZSwgSW50ZXJmYWNlKTsKLSAgQ2xhc3Mu YXVnbWVudENsYXNzID0gU3VwZXIuYXVnbWVudENsYXNzOwotCi0gIFBvb2xlZENsYXNzLmFkZFBv b2xpbmdUbyhDbGFzcywgUG9vbGVkQ2xhc3MuZm91ckFyZ3VtZW50UG9vbGVyKTsKLX07CiAKIFBv b2xlZENsYXNzLmFkZFBvb2xpbmdUbyhTeW50aGV0aWNFdmVudCwgUG9vbGVkQ2xhc3MuZm91ckFy Z3VtZW50UG9vbGVyKTsKIApAQCAtMjY0LDQgKzI2NSw0IEBAIGZ1bmN0aW9uIGdldFBvb2xlZFdh cm5pbmdQcm9wZXJ0eURlZmluaXRpb24ocHJvcE5hbWUsIGdldFZhbCkgewogICAgIHZhciB3YXJu aW5nQ29uZGl0aW9uID0gZmFsc2U7CiAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9k dWN0aW9uJyA/IHdhcm5pbmcod2FybmluZ0NvbmRpdGlvbiwgJ1RoaXMgc3ludGhldGljIGV2ZW50 IGlzIHJldXNlZCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4gSWYgeW91XCdyZSBzZWVpbmcgdGhp cywgJyArICd5b3VcJ3JlICVzIGAlc2Agb24gYSByZWxlYXNlZC9udWxsaWZpZWQgc3ludGhldGlj IGV2ZW50LiAlcy4gJyArICdJZiB5b3UgbXVzdCBrZWVwIHRoZSBvcmlnaW5hbCBzeW50aGV0aWMg ZXZlbnQgYXJvdW5kLCB1c2UgZXZlbnQucGVyc2lzdCgpLiAnICsgJ1NlZSBodHRwczovL2ZiLm1l L3JlYWN0LWV2ZW50LXBvb2xpbmcgZm9yIG1vcmUgaW5mb3JtYXRpb24uJywgYWN0aW9uLCBwcm9w TmFtZSwgcmVzdWx0KSA6IHZvaWQgMDsKICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZp bGUKK30KZGlmZiAtLWdpdCBhL3dlYi95YXJuLmxvY2sgYi93ZWIveWFybi5sb2NrCmluZGV4IDQw OTcwZTNiLi5mMzc4ZjYwZiAxMDA2NDQKLS0tIGEvd2ViL3lhcm4ubG9jaworKysgYi93ZWIveWFy bi5sb2NrCkBAIC0xMTk5LDE1ICsxMTk5LDcgQEAgY29uY2F0LXN0cmVhbUAxLjUuMDoKICAgICBy ZWFkYWJsZS1zdHJlYW0gIn4yLjAuMCIKICAgICB0eXBlZGFycmF5ICJ+MC4wLjUiCiAKLWNvbmNh dC1zdHJlYW1AXjEuNS4yOgotICB2ZXJzaW9uICIxLjYuMCIKLSAgcmVzb2x2ZWQgImh0dHBzOi8v cmVnaXN0cnkueWFybnBrZy5jb20vY29uY2F0LXN0cmVhbS8tL2NvbmNhdC1zdHJlYW0tMS42LjAu dGd6IzBhYWM2NjJmZDUyYmU3ODk2NGQ1NTMyZjY5NDc4NGU3MDExMGFjZjciCi0gIGRlcGVuZGVu Y2llczoKLSAgICBpbmhlcml0cyAiXjIuMC4zIgotICAgIHJlYWRhYmxlLXN0cmVhbSAiXjIuMi4y IgotICAgIHR5cGVkYXJyYXkgIl4wLjAuNiIKLQotY29uY2F0LXN0cmVhbUB+MS41LjAsIGNvbmNh dC1zdHJlYW1AfjEuNS4xOgorY29uY2F0LXN0cmVhbUBeMS41LjIsIGNvbmNhdC1zdHJlYW1AfjEu NS4wLCBjb25jYXQtc3RyZWFtQH4xLjUuMToKICAgdmVyc2lvbiAiMS41LjIiCiAgIHJlc29sdmVk ICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2NvbmNhdC1zdHJlYW0vLS9jb25jYXQtc3Ry ZWFtLTEuNS4yLnRneiM3MDg5Nzg2MjRkODU2YWY0MWE1YTc0MWRlZmRkMjYxZGE3NTJjMjY2Igog ICBkZXBlbmRlbmNpZXM6CkBAIC0zNjQ5LDcgKzM2NDEsNyBAQCByZWFkLXBrZ0BeMS4wLjA6CiAg ICAgbm9ybWFsaXplLXBhY2thZ2UtZGF0YSAiXjIuMy4yIgogICAgIHBhdGgtdHlwZSAiXjEuMC4w IgogCi1yZWFkYWJsZS1zdHJlYW1AXjIuMC4xLCByZWFkYWJsZS1zdHJlYW1AXjIuMC4yLCByZWFk YWJsZS1zdHJlYW1AXjIuMC41LCByZWFkYWJsZS1zdHJlYW1AXjIuMC42LCByZWFkYWJsZS1zdHJl YW1AXjIuMS40LCByZWFkYWJsZS1zdHJlYW1AXjIuMS41LCByZWFkYWJsZS1zdHJlYW1AXjIuMi4y LCByZWFkYWJsZS1zdHJlYW1AXjIuMi42OgorcmVhZGFibGUtc3RyZWFtQF4yLjAuMSwgcmVhZGFi bGUtc3RyZWFtQF4yLjAuMiwgcmVhZGFibGUtc3RyZWFtQF4yLjAuNSwgcmVhZGFibGUtc3RyZWFt QF4yLjAuNiwgcmVhZGFibGUtc3RyZWFtQF4yLjEuNCwgcmVhZGFibGUtc3RyZWFtQF4yLjEuNSwg cmVhZGFibGUtc3RyZWFtQF4yLjIuNjoKICAgdmVyc2lvbiAiMi4zLjAiCiAgIHJlc29sdmVkICJo dHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL3JlYWRhYmxlLXN0cmVhbS8tL3JlYWRhYmxlLXN0 cmVhbS0yLjMuMC50Z3ojNjQwZjVkY2RhODhjOTFhOGRjNjA3ODcxNDU2MjkxNzA4MTNhMWVkMiIK ICAgZGVwZW5kZW5jaWVzOgpAQCAtNDMxMCw3ICs0MzAyLDcgQEAgdHlwZS1pc0B+MS42LjE1Ogog ICAgIG1lZGlhLXR5cGVyICIwLjMuMCIKICAgICBtaW1lLXR5cGVzICJ+Mi4xLjE1IgogCi10eXBl ZGFycmF5QF4wLjAuNiwgdHlwZWRhcnJheUB+MC4wLjU6Cit0eXBlZGFycmF5QH4wLjAuNToKICAg dmVyc2lvbiAiMC4wLjYiCiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29t L3R5cGVkYXJyYXkvLS90eXBlZGFycmF5LTAuMC42LnRneiM4NjdhYzc0ZTM4NjQxODdiMWQzZDQ3 ZDk5NmE3OGVjNWM4ODMwNzc3IgogCg== --f403045e1d6c3cf30605526af3d5--