All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <6A3DF150A5B70D4F9B66A25E3F7C888D070E17FA@039-SN2MPN1-013.039d.mgd.msft.net>

diff --git a/a/1.txt b/N1/1.txt
index d8446bb..e7387ec 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -1,267 +1,184 @@
-
-
-> -----Original Message-----
-> From: Alexander Graf [mailto:agraf@suse.de]
-> Sent: Wednesday, July 24, 2013 1:55 PM
-> To: "“tiejun.chen”"
-> Cc: Bhushan Bharat-R65777; kvm-ppc@vger.kernel.org; kvm@vger.kernel.org list;
-> Wood Scott-B07421; Gleb Natapov; Paolo Bonzini
-> Subject: Re: [PATCH 2/2] kvm: powerpc: set cache coherency only for kernel
-> managed pages
-> 
-> 
-> On 24.07.2013, at 04:26, “tiejun.chen” wrote:
-> 
-> > On 07/18/2013 06:27 PM, Alexander Graf wrote:
-> >>
-> >> On 18.07.2013, at 12:19, “tiejun.chen” wrote:
-> >>
-> >>> On 07/18/2013 06:12 PM, Alexander Graf wrote:
-> >>>>
-> >>>> On 18.07.2013, at 12:08, “tiejun.chen” wrote:
-> >>>>
-> >>>>> On 07/18/2013 05:48 PM, Alexander Graf wrote:
-> >>>>>>
-> >>>>>> On 18.07.2013, at 10:25, Bhushan Bharat-R65777 wrote:
-> >>>>>>
-> >>>>>>>
-> >>>>>>>
-> >>>>>>>> -----Original Message-----
-> >>>>>>>> From: Bhushan Bharat-R65777
-> >>>>>>>> Sent: Thursday, July 18, 2013 1:53 PM
-> >>>>>>>> To: '" tiejun.chen "'
-> >>>>>>>> Cc: kvm-ppc@vger.kernel.org; kvm@vger.kernel.org;
-> >>>>>>>> agraf@suse.de; Wood Scott-
-> >>>>>>>> B07421
-> >>>>>>>> Subject: RE: [PATCH 2/2] kvm: powerpc: set cache coherency only
-> >>>>>>>> for kernel managed pages
-> >>>>>>>>
-> >>>>>>>>
-> >>>>>>>>
-> >>>>>>>>> -----Original Message-----
-> >>>>>>>>> From: " tiejun.chen " [mailto:tiejun.chen@windriver.com]
-> >>>>>>>>> Sent: Thursday, July 18, 2013 1:52 PM
-> >>>>>>>>> To: Bhushan Bharat-R65777
-> >>>>>>>>> Cc: kvm-ppc@vger.kernel.org; kvm@vger.kernel.org;
-> >>>>>>>>> agraf@suse.de; Wood
-> >>>>>>>>> Scott-
-> >>>>>>>>> B07421
-> >>>>>>>>> Subject: Re: [PATCH 2/2] kvm: powerpc: set cache coherency
-> >>>>>>>>> only for kernel managed pages
-> >>>>>>>>>
-> >>>>>>>>> On 07/18/2013 04:08 PM, Bhushan Bharat-R65777 wrote:
-> >>>>>>>>>>
-> >>>>>>>>>>
-> >>>>>>>>>>> -----Original Message-----
-> >>>>>>>>>>> From: kvm-ppc-owner@vger.kernel.org
-> >>>>>>>>>>> [mailto:kvm-ppc-owner@vger.kernel.org] On Behalf Of " tiejun.chen "
-> >>>>>>>>>>> Sent: Thursday, July 18, 2013 1:01 PM
-> >>>>>>>>>>> To: Bhushan Bharat-R65777
-> >>>>>>>>>>> Cc: kvm-ppc@vger.kernel.org; kvm@vger.kernel.org;
-> >>>>>>>>>>> agraf@suse.de; Wood
-> >>>>>>>>>>> Scott-
-> >>>>>>>>>>> B07421
-> >>>>>>>>>>> Subject: Re: [PATCH 2/2] kvm: powerpc: set cache coherency
-> >>>>>>>>>>> only for kernel managed pages
-> >>>>>>>>>>>
-> >>>>>>>>>>> On 07/18/2013 03:12 PM, Bhushan Bharat-R65777 wrote:
-> >>>>>>>>>>>>
-> >>>>>>>>>>>>
-> >>>>>>>>>>>>> -----Original Message-----
-> >>>>>>>>>>>>> From: " tiejun.chen " [mailto:tiejun.chen@windriver.com]
-> >>>>>>>>>>>>> Sent: Thursday, July 18, 2013 11:56 AM
-> >>>>>>>>>>>>> To: Bhushan Bharat-R65777
-> >>>>>>>>>>>>> Cc: kvm-ppc@vger.kernel.org; kvm@vger.kernel.org;
-> >>>>>>>>>>>>> agraf@suse.de; Wood
-> >>>>>>>>>>>>> Scott- B07421; Bhushan Bharat-R65777
-> >>>>>>>>>>>>> Subject: Re: [PATCH 2/2] kvm: powerpc: set cache coherency
-> >>>>>>>>>>>>> only for kernel managed pages
-> >>>>>>>>>>>>>
-> >>>>>>>>>>>>> On 07/18/2013 02:04 PM, Bharat Bhushan wrote:
-> >>>>>>>>>>>>>> If there is a struct page for the requested mapping then
-> >>>>>>>>>>>>>> it's normal DDR and the mapping sets "M" bit (coherent,
-> >>>>>>>>>>>>>> cacheable) else this is treated as I/O and we set  "I +
-> >>>>>>>>>>>>>> G"  (cache inhibited,
-> >>>>>>>>>>>>>> guarded)
-> >>>>>>>>>>>>>>
-> >>>>>>>>>>>>>> This helps setting proper TLB mapping for direct assigned
-> >>>>>>>>>>>>>> device
-> >>>>>>>>>>>>>>
-> >>>>>>>>>>>>>> Signed-off-by: Bharat Bhushan
-> >>>>>>>>>>>>>> <bharat.bhushan@freescale.com>
-> >>>>>>>>>>>>>> ---
-> >>>>>>>>>>>>>>    arch/powerpc/kvm/e500_mmu_host.c |   17 ++++++++++++-----
-> >>>>>>>>>>>>>>    1 files changed, 12 insertions(+), 5 deletions(-)
-> >>>>>>>>>>>>>>
-> >>>>>>>>>>>>>> diff --git a/arch/powerpc/kvm/e500_mmu_host.c
-> >>>>>>>>>>>>>> b/arch/powerpc/kvm/e500_mmu_host.c
-> >>>>>>>>>>>>>> index 1c6a9d7..089c227 100644
-> >>>>>>>>>>>>>> --- a/arch/powerpc/kvm/e500_mmu_host.c
-> >>>>>>>>>>>>>> +++ b/arch/powerpc/kvm/e500_mmu_host.c
-> >>>>>>>>>>>>>> @@ -64,13 +64,20 @@ static inline u32
-> >>>>>>>>>>>>>> e500_shadow_mas3_attrib(u32 mas3, int
-> >>>>>>>>>>>>> usermode)
-> >>>>>>>>>>>>>>    	return mas3;
-> >>>>>>>>>>>>>>    }
-> >>>>>>>>>>>>>>
-> >>>>>>>>>>>>>> -static inline u32 e500_shadow_mas2_attrib(u32 mas2, int
-> >>>>>>>>>>>>>> usermode)
-> >>>>>>>>>>>>>> +static inline u32 e500_shadow_mas2_attrib(u32 mas2,
-> >>>>>>>>>>>>>> +pfn_t pfn)
-> >>>>>>>>>>>>>>    {
-> >>>>>>>>>>>>>> +	u32 mas2_attr;
-> >>>>>>>>>>>>>> +
-> >>>>>>>>>>>>>> +	mas2_attr = mas2 & MAS2_ATTRIB_MASK;
-> >>>>>>>>>>>>>> +
-> >>>>>>>>>>>>>> +	if (!pfn_valid(pfn)) {
-> >>>>>>>>>>>>>
-> >>>>>>>>>>>>> Why not directly use kvm_is_mmio_pfn()?
-> >>>>>>>>>>>>
-> >>>>>>>>>>>> What I understand from this function (someone can correct
-> >>>>>>>>>>>> me) is that it
-> >>>>>>>>>>> returns "false" when the page is managed by kernel and is
-> >>>>>>>>>>> not marked as RESERVED (for some reason). For us it does not
-> >>>>>>>>>>> matter whether the page is reserved or not, if it is kernel
-> >>>>>>>>>>> visible page then it
-> >>>>>>>> is DDR.
-> >>>>>>>>>>>>
-> >>>>>>>>>>>
-> >>>>>>>>>>> I think you are setting I|G by addressing all mmio pages,
-> >>>>>>>>>>> right? If so,
-> >>>>>>>>>>>
-> >>>>>>>>>>>      KVM: direct mmio pfn check
-> >>>>>>>>>>>
-> >>>>>>>>>>>      Userspace may specify memory slots that are backed by
-> >>>>>>>>>>> mmio pages rather than
-> >>>>>>>>>>>      normal RAM.  In some cases it is not enough to identify
-> >>>>>>>>>>> these mmio
-> >>>>>>>>> pages
-> >>>>>>>>>>>      by pfn_valid().  This patch adds checking the PageReserved as
-> well.
-> >>>>>>>>>>
-> >>>>>>>>>> Do you know what are those "some cases" and how checking
-> >>>>>>>>>> PageReserved helps in
-> >>>>>>>>> those cases?
-> >>>>>>>>>
-> >>>>>>>>> No, myself didn't see these actual cases in qemu,too. But this
-> >>>>>>>>> should be chronically persistent as I understand ;-)
-> >>>>>>>>
-> >>>>>>>> Then I will wait till someone educate me :)
-> >>>>>>>
-> >>>>>>> The reason is , kvm_is_mmio_pfn() function looks pretty heavy and I do
-> not want to call this for all tlbwe operation unless it is necessary.
-> >>>>>>
-> >>>>>> It certainly does more than we need and potentially slows down the fast
-> path (RAM mapping). The only thing it does on top of "if (pfn_valid())" is to
-> check for pages that are declared reserved on the host. This happens in 2 cases:
-> >>>>>>
-> >>>>>>   1) Non cache coherent DMA
-> >>>>>>   2) Memory hot remove
-> >>>>>>
-> >>>>>> The non coherent DMA case would be interesting, as with the mechanism as
-> it is in place in Linux today, we could potentially break normal guest operation
-> if we don't take it into account. However, it's Kconfig guarded by:
-> >>>>>>
-> >>>>>>         depends on 4xx || 8xx || E200 || PPC_MPC512x || GAMECUBE_COMMON
-> >>>>>>         default n if PPC_47x
-> >>>>>>         default y
-> >>>>>>
-> >>>>>> so we never hit it with any core we care about ;).
-> >>>>>>
-> >>>>>> Memory hot remove does not exist on e500 FWIW, so we don't have to worry
-> about that one either.
-> >>>>>
-> >>>>> Thanks for this good information :)
-> >>>>>
-> >>>>> So why not limit those codes with CONFIG_MEMORY_HOTPLUG inside
-> kvm_is_mmio_pfn() to make sure that check is only valid when that is really
-> needed? This can decrease those unnecessary performance loss.
-> >>>>>
-> >>>>> If I'm wrong please correct me :)
-> >>>>
-> >>>> You're perfectly right, but this is generic KVM code. So it gets run across
-> all architectures. What if someone has the great idea to add a new case here for
-> x86, but doesn't tell us? In that case we potentially break x86.
-> >>>>
-> >>>> I'd rather not like to break x86 :).
-> >>>>
-> >>>> However, it'd be very interesting to see a benchmark with this change. Do
-> you think you could just rip out the whole reserved check and run a few
-> benchmarks and show us the results?
-> >>>>
-> >>>
-> >>> Often what case should be adopted to validate this scenario?
-> >>
-> >> Something which hammers the TLB emulation heavily. I usually just run
-> >> /bin/echo a thousand times in "time" and see how long it takes ;)
-> >>
-> >
-> > I tried to run five times with this combination, "time `for ((i=0; i<5000;
-> i++));  do /bin/echo; done`", to calculate the average value with this change:
-> >
-> > diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index
-> > 1580dd4..5e8635b 100644
-> > --- a/virt/kvm/kvm_main.c
-> > +++ b/virt/kvm/kvm_main.c
-> > @@ -102,6 +102,10 @@ static bool largepages_enabled = true;
-> >
-> > bool kvm_is_mmio_pfn(pfn_t pfn)
-> > {
-> > +#ifdef CONFIG_MEMORY_HOTPLUG
-> 
-> I'd feel safer if we narrow this down to e500.
-> 
-> > +       /*
-> > +        * Currently only in memory hot remove case we may still need this.
-> > +        */
-> >        if (pfn_valid(pfn)) {
-> 
-> We still have to check for pfn_valid, no? So the #ifdef should be down here.
-> 
-> >                int reserved;
-> >                struct page *tail = pfn_to_page(pfn); @@ -124,6 +128,7
-> > @@ bool kvm_is_mmio_pfn(pfn_t pfn)
-> >                }
-> >                return PageReserved(tail);
-> >        }
-> > +#endif
-> >
-> >        return true;
-> > }
-> >
-> > Before apply this change:
-> >
-> > real    (1m19.954s + 1m20.918s + 1m22.740s + 1m21.146s + 1m22.120s)/5=
-> 1m21.376s
-> > user    (0m23.181s + 0m23.550s + 0m23.506s + 0m23.410s + 0m23.520s)/5=
-> 0m23.433s
-> > sys	(0m49.087s + 0m49.563s + 0m51.758s + 0m50.290s + 0m51.047s)/5= 0m50.349s
-> >
-> > After apply this change:
-> >
-> > real    (1m19.507s + 1m20.919s + 1m21.436s + 1m21.179s + 1m20.293s)/5=
-> 1m20.667s
-> > user    (0m22.595s + 0m22.719s + 0m22.484s + 0m22.811s + 0m22.467s)/5=
-> 0m22.615s
-> > sys	(0m48.841s + 0m49.929s + 0m50.310s + 0m49.813s + 0m48.587s)/5= 0m49.496s
-> >
-> > So,
-> >
-> > real    (1m20.667s - 1m21.376s)/1m21.376s x 100% = -0.6%
-> > user    (0m22.615s - 0m23.433s)/0m23.433s x 100% = -3.5%
-> > sys	(0m49.496s - 0m50.349s)/0m50.349s x 100% = -1.7%
-> 
-> Very nice, so there is a real world performance benefit to doing this. Then yes,
-> I think it would make sense to change the global helper function to be fast on
-> e500 and use that one from e500_shadow_mas2_attrib() instead.
-
-Are not we going to use page_is_ram() from  e500_shadow_mas2_attrib() as Scott commented?
-
--Bharat
-
-> 
-> Gleb, Paolo, any hard feelings?
-> 
-> 
-> Alex
->
\ No newline at end of file
+DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogQWxleGFuZGVyIEdyYWYg
+W21haWx0bzphZ3JhZkBzdXNlLmRlXQ0KPiBTZW50OiBXZWRuZXNkYXksIEp1bHkgMjQsIDIwMTMg
+MTo1NSBQTQ0KPiBUbzogIuKAnHRpZWp1bi5jaGVu4oCdIg0KPiBDYzogQmh1c2hhbiBCaGFyYXQt
+UjY1Nzc3OyBrdm0tcHBjQHZnZXIua2VybmVsLm9yZzsga3ZtQHZnZXIua2VybmVsLm9yZyBsaXN0
+Ow0KPiBXb29kIFNjb3R0LUIwNzQyMTsgR2xlYiBOYXRhcG92OyBQYW9sbyBCb256aW5pDQo+IFN1
+YmplY3Q6IFJlOiBbUEFUQ0ggMi8yXSBrdm06IHBvd2VycGM6IHNldCBjYWNoZSBjb2hlcmVuY3kg
+b25seSBmb3Iga2VybmVsDQo+IG1hbmFnZWQgcGFnZXMNCj4gDQo+IA0KPiBPbiAyNC4wNy4yMDEz
+LCBhdCAwNDoyNiwg4oCcdGllanVuLmNoZW7igJ0gd3JvdGU6DQo+IA0KPiA+IE9uIDA3LzE4LzIw
+MTMgMDY6MjcgUE0sIEFsZXhhbmRlciBHcmFmIHdyb3RlOg0KPiA+Pg0KPiA+PiBPbiAxOC4wNy4y
+MDEzLCBhdCAxMjoxOSwg4oCcdGllanVuLmNoZW7igJ0gd3JvdGU6DQo+ID4+DQo+ID4+PiBPbiAw
+Ny8xOC8yMDEzIDA2OjEyIFBNLCBBbGV4YW5kZXIgR3JhZiB3cm90ZToNCj4gPj4+Pg0KPiA+Pj4+
+IE9uIDE4LjA3LjIwMTMsIGF0IDEyOjA4LCDigJx0aWVqdW4uY2hlbuKAnSB3cm90ZToNCj4gPj4+
+Pg0KPiA+Pj4+PiBPbiAwNy8xOC8yMDEzIDA1OjQ4IFBNLCBBbGV4YW5kZXIgR3JhZiB3cm90ZToN
+Cj4gPj4+Pj4+DQo+ID4+Pj4+PiBPbiAxOC4wNy4yMDEzLCBhdCAxMDoyNSwgQmh1c2hhbiBCaGFy
+YXQtUjY1Nzc3IHdyb3RlOg0KPiA+Pj4+Pj4NCj4gPj4+Pj4+Pg0KPiA+Pj4+Pj4+DQo+ID4+Pj4+
+Pj4+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+ID4+Pj4+Pj4+IEZyb206IEJodXNoYW4g
+QmhhcmF0LVI2NTc3Nw0KPiA+Pj4+Pj4+PiBTZW50OiBUaHVyc2RheSwgSnVseSAxOCwgMjAxMyAx
+OjUzIFBNDQo+ID4+Pj4+Pj4+IFRvOiAnIiB0aWVqdW4uY2hlbiAiJw0KPiA+Pj4+Pj4+PiBDYzog
+a3ZtLXBwY0B2Z2VyLmtlcm5lbC5vcmc7IGt2bUB2Z2VyLmtlcm5lbC5vcmc7DQo+ID4+Pj4+Pj4+
+IGFncmFmQHN1c2UuZGU7IFdvb2QgU2NvdHQtDQo+ID4+Pj4+Pj4+IEIwNzQyMQ0KPiA+Pj4+Pj4+
+PiBTdWJqZWN0OiBSRTogW1BBVENIIDIvMl0ga3ZtOiBwb3dlcnBjOiBzZXQgY2FjaGUgY29oZXJl
+bmN5IG9ubHkNCj4gPj4+Pj4+Pj4gZm9yIGtlcm5lbCBtYW5hZ2VkIHBhZ2VzDQo+ID4+Pj4+Pj4+
+DQo+ID4+Pj4+Pj4+DQo+ID4+Pj4+Pj4+DQo+ID4+Pj4+Pj4+PiAtLS0tLU9yaWdpbmFsIE1lc3Nh
+Z2UtLS0tLQ0KPiA+Pj4+Pj4+Pj4gRnJvbTogIiB0aWVqdW4uY2hlbiAiIFttYWlsdG86dGllanVu
+LmNoZW5Ad2luZHJpdmVyLmNvbV0NCj4gPj4+Pj4+Pj4+IFNlbnQ6IFRodXJzZGF5LCBKdWx5IDE4
+LCAyMDEzIDE6NTIgUE0NCj4gPj4+Pj4+Pj4+IFRvOiBCaHVzaGFuIEJoYXJhdC1SNjU3NzcNCj4g
+Pj4+Pj4+Pj4+IENjOiBrdm0tcHBjQHZnZXIua2VybmVsLm9yZzsga3ZtQHZnZXIua2VybmVsLm9y
+ZzsNCj4gPj4+Pj4+Pj4+IGFncmFmQHN1c2UuZGU7IFdvb2QNCj4gPj4+Pj4+Pj4+IFNjb3R0LQ0K
+PiA+Pj4+Pj4+Pj4gQjA3NDIxDQo+ID4+Pj4+Pj4+PiBTdWJqZWN0OiBSZTogW1BBVENIIDIvMl0g
+a3ZtOiBwb3dlcnBjOiBzZXQgY2FjaGUgY29oZXJlbmN5DQo+ID4+Pj4+Pj4+PiBvbmx5IGZvciBr
+ZXJuZWwgbWFuYWdlZCBwYWdlcw0KPiA+Pj4+Pj4+Pj4NCj4gPj4+Pj4+Pj4+IE9uIDA3LzE4LzIw
+MTMgMDQ6MDggUE0sIEJodXNoYW4gQmhhcmF0LVI2NTc3NyB3cm90ZToNCj4gPj4+Pj4+Pj4+Pg0K
+PiA+Pj4+Pj4+Pj4+DQo+ID4+Pj4+Pj4+Pj4+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+
+ID4+Pj4+Pj4+Pj4+IEZyb206IGt2bS1wcGMtb3duZXJAdmdlci5rZXJuZWwub3JnDQo+ID4+Pj4+
+Pj4+Pj4+IFttYWlsdG86a3ZtLXBwYy1vd25lckB2Z2VyLmtlcm5lbC5vcmddIE9uIEJlaGFsZiBP
+ZiAiIHRpZWp1bi5jaGVuICINCj4gPj4+Pj4+Pj4+Pj4gU2VudDogVGh1cnNkYXksIEp1bHkgMTgs
+IDIwMTMgMTowMSBQTQ0KPiA+Pj4+Pj4+Pj4+PiBUbzogQmh1c2hhbiBCaGFyYXQtUjY1Nzc3DQo+
+ID4+Pj4+Pj4+Pj4+IENjOiBrdm0tcHBjQHZnZXIua2VybmVsLm9yZzsga3ZtQHZnZXIua2VybmVs
+Lm9yZzsNCj4gPj4+Pj4+Pj4+Pj4gYWdyYWZAc3VzZS5kZTsgV29vZA0KPiA+Pj4+Pj4+Pj4+PiBT
+Y290dC0NCj4gPj4+Pj4+Pj4+Pj4gQjA3NDIxDQo+ID4+Pj4+Pj4+Pj4+IFN1YmplY3Q6IFJlOiBb
+UEFUQ0ggMi8yXSBrdm06IHBvd2VycGM6IHNldCBjYWNoZSBjb2hlcmVuY3kNCj4gPj4+Pj4+Pj4+
+Pj4gb25seSBmb3Iga2VybmVsIG1hbmFnZWQgcGFnZXMNCj4gPj4+Pj4+Pj4+Pj4NCj4gPj4+Pj4+
+Pj4+Pj4gT24gMDcvMTgvMjAxMyAwMzoxMiBQTSwgQmh1c2hhbiBCaGFyYXQtUjY1Nzc3IHdyb3Rl
+Og0KPiA+Pj4+Pj4+Pj4+Pj4NCj4gPj4+Pj4+Pj4+Pj4+DQo+ID4+Pj4+Pj4+Pj4+Pj4gLS0tLS1P
+cmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gPj4+Pj4+Pj4+Pj4+PiBGcm9tOiAiIHRpZWp1bi5jaGVu
+ICIgW21haWx0bzp0aWVqdW4uY2hlbkB3aW5kcml2ZXIuY29tXQ0KPiA+Pj4+Pj4+Pj4+Pj4+IFNl
+bnQ6IFRodXJzZGF5LCBKdWx5IDE4LCAyMDEzIDExOjU2IEFNDQo+ID4+Pj4+Pj4+Pj4+Pj4gVG86
+IEJodXNoYW4gQmhhcmF0LVI2NTc3Nw0KPiA+Pj4+Pj4+Pj4+Pj4+IENjOiBrdm0tcHBjQHZnZXIu
+a2VybmVsLm9yZzsga3ZtQHZnZXIua2VybmVsLm9yZzsNCj4gPj4+Pj4+Pj4+Pj4+PiBhZ3JhZkBz
+dXNlLmRlOyBXb29kDQo+ID4+Pj4+Pj4+Pj4+Pj4gU2NvdHQtIEIwNzQyMTsgQmh1c2hhbiBCaGFy
+YXQtUjY1Nzc3DQo+ID4+Pj4+Pj4+Pj4+Pj4gU3ViamVjdDogUmU6IFtQQVRDSCAyLzJdIGt2bTog
+cG93ZXJwYzogc2V0IGNhY2hlIGNvaGVyZW5jeQ0KPiA+Pj4+Pj4+Pj4+Pj4+IG9ubHkgZm9yIGtl
+cm5lbCBtYW5hZ2VkIHBhZ2VzDQo+ID4+Pj4+Pj4+Pj4+Pj4NCj4gPj4+Pj4+Pj4+Pj4+PiBPbiAw
+Ny8xOC8yMDEzIDAyOjA0IFBNLCBCaGFyYXQgQmh1c2hhbiB3cm90ZToNCj4gPj4+Pj4+Pj4+Pj4+
+Pj4gSWYgdGhlcmUgaXMgYSBzdHJ1Y3QgcGFnZSBmb3IgdGhlIHJlcXVlc3RlZCBtYXBwaW5nIHRo
+ZW4NCj4gPj4+Pj4+Pj4+Pj4+Pj4gaXQncyBub3JtYWwgRERSIGFuZCB0aGUgbWFwcGluZyBzZXRz
+ICJNIiBiaXQgKGNvaGVyZW50LA0KPiA+Pj4+Pj4+Pj4+Pj4+PiBjYWNoZWFibGUpIGVsc2UgdGhp
+cyBpcyB0cmVhdGVkIGFzIEkvTyBhbmQgd2Ugc2V0ICAiSSArDQo+ID4+Pj4+Pj4+Pj4+Pj4+IEci
+ICAoY2FjaGUgaW5oaWJpdGVkLA0KPiA+Pj4+Pj4+Pj4+Pj4+PiBndWFyZGVkKQ0KPiA+Pj4+Pj4+
+Pj4+Pj4+Pg0KPiA+Pj4+Pj4+Pj4+Pj4+PiBUaGlzIGhlbHBzIHNldHRpbmcgcHJvcGVyIFRMQiBt
+YXBwaW5nIGZvciBkaXJlY3QgYXNzaWduZWQNCj4gPj4+Pj4+Pj4+Pj4+Pj4gZGV2aWNlDQo+ID4+
+Pj4+Pj4+Pj4+Pj4+DQo+ID4+Pj4+Pj4+Pj4+Pj4+IFNpZ25lZC1vZmYtYnk6IEJoYXJhdCBCaHVz
+aGFuDQo+ID4+Pj4+Pj4+Pj4+Pj4+IDxiaGFyYXQuYmh1c2hhbkBmcmVlc2NhbGUuY29tPg0KPiA+
+Pj4+Pj4+Pj4+Pj4+PiAtLS0NCj4gPj4+Pj4+Pj4+Pj4+Pj4gICAgYXJjaC9wb3dlcnBjL2t2bS9l
+NTAwX21tdV9ob3N0LmMgfCAgIDE3ICsrKysrKysrKysrKy0tLS0tDQo+ID4+Pj4+Pj4+Pj4+Pj4+
+ICAgIDEgZmlsZXMgY2hhbmdlZCwgMTIgaW5zZXJ0aW9ucygrKSwgNSBkZWxldGlvbnMoLSkNCj4g
+Pj4+Pj4+Pj4+Pj4+Pj4NCj4gPj4+Pj4+Pj4+Pj4+Pj4gZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJw
+Yy9rdm0vZTUwMF9tbXVfaG9zdC5jDQo+ID4+Pj4+Pj4+Pj4+Pj4+IGIvYXJjaC9wb3dlcnBjL2t2
+bS9lNTAwX21tdV9ob3N0LmMNCj4gPj4+Pj4+Pj4+Pj4+Pj4gaW5kZXggMWM2YTlkNy4uMDg5YzIy
+NyAxMDA2NDQNCj4gPj4+Pj4+Pj4+Pj4+Pj4gLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9lNTAwX21t
+dV9ob3N0LmMNCj4gPj4+Pj4+Pj4+Pj4+Pj4gKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9lNTAwX21t
+dV9ob3N0LmMNCj4gPj4+Pj4+Pj4+Pj4+Pj4gQEAgLTY0LDEzICs2NCwyMCBAQCBzdGF0aWMgaW5s
+aW5lIHUzMg0KPiA+Pj4+Pj4+Pj4+Pj4+PiBlNTAwX3NoYWRvd19tYXMzX2F0dHJpYih1MzIgbWFz
+MywgaW50DQo+ID4+Pj4+Pj4+Pj4+Pj4gdXNlcm1vZGUpDQo+ID4+Pj4+Pj4+Pj4+Pj4+ICAgIAly
+ZXR1cm4gbWFzMzsNCj4gPj4+Pj4+Pj4+Pj4+Pj4gICAgfQ0KPiA+Pj4+Pj4+Pj4+Pj4+Pg0KPiA+
+Pj4+Pj4+Pj4+Pj4+PiAtc3RhdGljIGlubGluZSB1MzIgZTUwMF9zaGFkb3dfbWFzMl9hdHRyaWIo
+dTMyIG1hczIsIGludA0KPiA+Pj4+Pj4+Pj4+Pj4+PiB1c2VybW9kZSkNCj4gPj4+Pj4+Pj4+Pj4+
+Pj4gK3N0YXRpYyBpbmxpbmUgdTMyIGU1MDBfc2hhZG93X21hczJfYXR0cmliKHUzMiBtYXMyLA0K
+PiA+Pj4+Pj4+Pj4+Pj4+PiArcGZuX3QgcGZuKQ0KPiA+Pj4+Pj4+Pj4+Pj4+PiAgICB7DQo+ID4+
+Pj4+Pj4+Pj4+Pj4+ICsJdTMyIG1hczJfYXR0cjsNCj4gPj4+Pj4+Pj4+Pj4+Pj4gKw0KPiA+Pj4+
+Pj4+Pj4+Pj4+PiArCW1hczJfYXR0ciA9IG1hczIgJiBNQVMyX0FUVFJJQl9NQVNLOw0KPiA+Pj4+
+Pj4+Pj4+Pj4+PiArDQo+ID4+Pj4+Pj4+Pj4+Pj4+ICsJaWYgKCFwZm5fdmFsaWQocGZuKSkgew0K
+PiA+Pj4+Pj4+Pj4+Pj4+DQo+ID4+Pj4+Pj4+Pj4+Pj4gV2h5IG5vdCBkaXJlY3RseSB1c2Uga3Zt
+X2lzX21taW9fcGZuKCk/DQo+ID4+Pj4+Pj4+Pj4+Pg0KPiA+Pj4+Pj4+Pj4+Pj4gV2hhdCBJIHVu
+ZGVyc3RhbmQgZnJvbSB0aGlzIGZ1bmN0aW9uIChzb21lb25lIGNhbiBjb3JyZWN0DQo+ID4+Pj4+
+Pj4+Pj4+PiBtZSkgaXMgdGhhdCBpdA0KPiA+Pj4+Pj4+Pj4+PiByZXR1cm5zICJmYWxzZSIgd2hl
+biB0aGUgcGFnZSBpcyBtYW5hZ2VkIGJ5IGtlcm5lbCBhbmQgaXMNCj4gPj4+Pj4+Pj4+Pj4gbm90
+IG1hcmtlZCBhcyBSRVNFUlZFRCAoZm9yIHNvbWUgcmVhc29uKS4gRm9yIHVzIGl0IGRvZXMgbm90
+DQo+ID4+Pj4+Pj4+Pj4+IG1hdHRlciB3aGV0aGVyIHRoZSBwYWdlIGlzIHJlc2VydmVkIG9yIG5v
+dCwgaWYgaXQgaXMga2VybmVsDQo+ID4+Pj4+Pj4+Pj4+IHZpc2libGUgcGFnZSB0aGVuIGl0DQo+
+ID4+Pj4+Pj4+IGlzIEREUi4NCj4gPj4+Pj4+Pj4+Pj4+DQo+ID4+Pj4+Pj4+Pj4+DQo+ID4+Pj4+
+Pj4+Pj4+IEkgdGhpbmsgeW91IGFyZSBzZXR0aW5nIEl8RyBieSBhZGRyZXNzaW5nIGFsbCBtbWlv
+IHBhZ2VzLA0KPiA+Pj4+Pj4+Pj4+PiByaWdodD8gSWYgc28sDQo+ID4+Pj4+Pj4+Pj4+DQo+ID4+
+Pj4+Pj4+Pj4+ICAgICAgS1ZNOiBkaXJlY3QgbW1pbyBwZm4gY2hlY2sNCj4gPj4+Pj4+Pj4+Pj4N
+Cj4gPj4+Pj4+Pj4+Pj4gICAgICBVc2Vyc3BhY2UgbWF5IHNwZWNpZnkgbWVtb3J5IHNsb3RzIHRo
+YXQgYXJlIGJhY2tlZCBieQ0KPiA+Pj4+Pj4+Pj4+PiBtbWlvIHBhZ2VzIHJhdGhlciB0aGFuDQo+
+ID4+Pj4+Pj4+Pj4+ICAgICAgbm9ybWFsIFJBTS4gIEluIHNvbWUgY2FzZXMgaXQgaXMgbm90IGVu
+b3VnaCB0byBpZGVudGlmeQ0KPiA+Pj4+Pj4+Pj4+PiB0aGVzZSBtbWlvDQo+ID4+Pj4+Pj4+PiBw
+YWdlcw0KPiA+Pj4+Pj4+Pj4+PiAgICAgIGJ5IHBmbl92YWxpZCgpLiAgVGhpcyBwYXRjaCBhZGRz
+IGNoZWNraW5nIHRoZSBQYWdlUmVzZXJ2ZWQgYXMNCj4gd2VsbC4NCj4gPj4+Pj4+Pj4+Pg0KPiA+
+Pj4+Pj4+Pj4+IERvIHlvdSBrbm93IHdoYXQgYXJlIHRob3NlICJzb21lIGNhc2VzIiBhbmQgaG93
+IGNoZWNraW5nDQo+ID4+Pj4+Pj4+Pj4gUGFnZVJlc2VydmVkIGhlbHBzIGluDQo+ID4+Pj4+Pj4+
+PiB0aG9zZSBjYXNlcz8NCj4gPj4+Pj4+Pj4+DQo+ID4+Pj4+Pj4+PiBObywgbXlzZWxmIGRpZG4n
+dCBzZWUgdGhlc2UgYWN0dWFsIGNhc2VzIGluIHFlbXUsdG9vLiBCdXQgdGhpcw0KPiA+Pj4+Pj4+
+Pj4gc2hvdWxkIGJlIGNocm9uaWNhbGx5IHBlcnNpc3RlbnQgYXMgSSB1bmRlcnN0YW5kIDstKQ0K
+PiA+Pj4+Pj4+Pg0KPiA+Pj4+Pj4+PiBUaGVuIEkgd2lsbCB3YWl0IHRpbGwgc29tZW9uZSBlZHVj
+YXRlIG1lIDopDQo+ID4+Pj4+Pj4NCj4gPj4+Pj4+PiBUaGUgcmVhc29uIGlzICwga3ZtX2lzX21t
+aW9fcGZuKCkgZnVuY3Rpb24gbG9va3MgcHJldHR5IGhlYXZ5IGFuZCBJIGRvDQo+IG5vdCB3YW50
+IHRvIGNhbGwgdGhpcyBmb3IgYWxsIHRsYndlIG9wZXJhdGlvbiB1bmxlc3MgaXQgaXMgbmVjZXNz
+YXJ5Lg0KPiA+Pj4+Pj4NCj4gPj4+Pj4+IEl0IGNlcnRhaW5seSBkb2VzIG1vcmUgdGhhbiB3ZSBu
+ZWVkIGFuZCBwb3RlbnRpYWxseSBzbG93cyBkb3duIHRoZSBmYXN0DQo+IHBhdGggKFJBTSBtYXBw
+aW5nKS4gVGhlIG9ubHkgdGhpbmcgaXQgZG9lcyBvbiB0b3Agb2YgImlmIChwZm5fdmFsaWQoKSki
+IGlzIHRvDQo+IGNoZWNrIGZvciBwYWdlcyB0aGF0IGFyZSBkZWNsYXJlZCByZXNlcnZlZCBvbiB0
+aGUgaG9zdC4gVGhpcyBoYXBwZW5zIGluIDIgY2FzZXM6DQo+ID4+Pj4+Pg0KPiA+Pj4+Pj4gICAx
+KSBOb24gY2FjaGUgY29oZXJlbnQgRE1BDQo+ID4+Pj4+PiAgIDIpIE1lbW9yeSBob3QgcmVtb3Zl
+DQo+ID4+Pj4+Pg0KPiA+Pj4+Pj4gVGhlIG5vbiBjb2hlcmVudCBETUEgY2FzZSB3b3VsZCBiZSBp
+bnRlcmVzdGluZywgYXMgd2l0aCB0aGUgbWVjaGFuaXNtIGFzDQo+IGl0IGlzIGluIHBsYWNlIGlu
+IExpbnV4IHRvZGF5LCB3ZSBjb3VsZCBwb3RlbnRpYWxseSBicmVhayBub3JtYWwgZ3Vlc3Qgb3Bl
+cmF0aW9uDQo+IGlmIHdlIGRvbid0IHRha2UgaXQgaW50byBhY2NvdW50LiBIb3dldmVyLCBpdCdz
+IEtjb25maWcgZ3VhcmRlZCBieToNCj4gPj4+Pj4+DQo+ID4+Pj4+PiAgICAgICAgIGRlcGVuZHMg
+b24gNHh4IHx8IDh4eCB8fCBFMjAwIHx8IFBQQ19NUEM1MTJ4IHx8IEdBTUVDVUJFX0NPTU1PTg0K
+PiA+Pj4+Pj4gICAgICAgICBkZWZhdWx0IG4gaWYgUFBDXzQ3eA0KPiA+Pj4+Pj4gICAgICAgICBk
+ZWZhdWx0IHkNCj4gPj4+Pj4+DQo+ID4+Pj4+PiBzbyB3ZSBuZXZlciBoaXQgaXQgd2l0aCBhbnkg
+Y29yZSB3ZSBjYXJlIGFib3V0IDspLg0KPiA+Pj4+Pj4NCj4gPj4+Pj4+IE1lbW9yeSBob3QgcmVt
+b3ZlIGRvZXMgbm90IGV4aXN0IG9uIGU1MDAgRldJVywgc28gd2UgZG9uJ3QgaGF2ZSB0byB3b3Jy
+eQ0KPiBhYm91dCB0aGF0IG9uZSBlaXRoZXIuDQo+ID4+Pj4+DQo+ID4+Pj4+IFRoYW5rcyBmb3Ig
+dGhpcyBnb29kIGluZm9ybWF0aW9uIDopDQo+ID4+Pj4+DQo+ID4+Pj4+IFNvIHdoeSBub3QgbGlt
+aXQgdGhvc2UgY29kZXMgd2l0aCBDT05GSUdfTUVNT1JZX0hPVFBMVUcgaW5zaWRlDQo+IGt2bV9p
+c19tbWlvX3BmbigpIHRvIG1ha2Ugc3VyZSB0aGF0IGNoZWNrIGlzIG9ubHkgdmFsaWQgd2hlbiB0
+aGF0IGlzIHJlYWxseQ0KPiBuZWVkZWQ/IFRoaXMgY2FuIGRlY3JlYXNlIHRob3NlIHVubmVjZXNz
+YXJ5IHBlcmZvcm1hbmNlIGxvc3MuDQo+ID4+Pj4+DQo+ID4+Pj4+IElmIEknbSB3cm9uZyBwbGVh
+c2UgY29ycmVjdCBtZSA6KQ0KPiA+Pj4+DQo+ID4+Pj4gWW91J3JlIHBlcmZlY3RseSByaWdodCwg
+YnV0IHRoaXMgaXMgZ2VuZXJpYyBLVk0gY29kZS4gU28gaXQgZ2V0cyBydW4gYWNyb3NzDQo+IGFs
+bCBhcmNoaXRlY3R1cmVzLiBXaGF0IGlmIHNvbWVvbmUgaGFzIHRoZSBncmVhdCBpZGVhIHRvIGFk
+ZCBhIG5ldyBjYXNlIGhlcmUgZm9yDQo+IHg4NiwgYnV0IGRvZXNuJ3QgdGVsbCB1cz8gSW4gdGhh
+dCBjYXNlIHdlIHBvdGVudGlhbGx5IGJyZWFrIHg4Ni4NCj4gPj4+Pg0KPiA+Pj4+IEknZCByYXRo
+ZXIgbm90IGxpa2UgdG8gYnJlYWsgeDg2IDopLg0KPiA+Pj4+DQo+ID4+Pj4gSG93ZXZlciwgaXQn
+ZCBiZSB2ZXJ5IGludGVyZXN0aW5nIHRvIHNlZSBhIGJlbmNobWFyayB3aXRoIHRoaXMgY2hhbmdl
+LiBEbw0KPiB5b3UgdGhpbmsgeW91IGNvdWxkIGp1c3QgcmlwIG91dCB0aGUgd2hvbGUgcmVzZXJ2
+ZWQgY2hlY2sgYW5kIHJ1biBhIGZldw0KPiBiZW5jaG1hcmtzIGFuZCBzaG93IHVzIHRoZSByZXN1
+bHRzPw0KPiA+Pj4+DQo+ID4+Pg0KPiA+Pj4gT2Z0ZW4gd2hhdCBjYXNlIHNob3VsZCBiZSBhZG9w
+dGVkIHRvIHZhbGlkYXRlIHRoaXMgc2NlbmFyaW8/DQo+ID4+DQo+ID4+IFNvbWV0aGluZyB3aGlj
+aCBoYW1tZXJzIHRoZSBUTEIgZW11bGF0aW9uIGhlYXZpbHkuIEkgdXN1YWxseSBqdXN0IHJ1bg0K
+PiA+PiAvYmluL2VjaG8gYSB0aG91c2FuZCB0aW1lcyBpbiAidGltZSIgYW5kIHNlZSBob3cgbG9u
+ZyBpdCB0YWtlcyA7KQ0KPiA+Pg0KPiA+DQo+ID4gSSB0cmllZCB0byBydW4gZml2ZSB0aW1lcyB3
+aXRoIHRoaXMgY29tYmluYXRpb24sICJ0aW1lIGBmb3IgKChpPTA7IGk8NTAwMDsNCj4gaSsrKSk7
+ICBkbyAvYmluL2VjaG87IGRvbmVgIiwgdG8gY2FsY3VsYXRlIHRoZSBhdmVyYWdlIHZhbHVlIHdp
+dGggdGhpcyBjaGFuZ2U6DQo+ID4NCj4gPiBkaWZmIC0tZ2l0IGEvdmlydC9rdm0va3ZtX21haW4u
+YyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMgaW5kZXgNCj4gPiAxNTgwZGQ0Li41ZTg2MzViIDEwMDY0
+NA0KPiA+IC0tLSBhL3ZpcnQva3ZtL2t2bV9tYWluLmMNCj4gPiArKysgYi92aXJ0L2t2bS9rdm1f
+bWFpbi5jDQo+ID4gQEAgLTEwMiw2ICsxMDIsMTAgQEAgc3RhdGljIGJvb2wgbGFyZ2VwYWdlc19l
+bmFibGVkID0gdHJ1ZTsNCj4gPg0KPiA+IGJvb2wga3ZtX2lzX21taW9fcGZuKHBmbl90IHBmbikN
+Cj4gPiB7DQo+ID4gKyNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUcNCj4gDQo+IEknZCBmZWVs
+IHNhZmVyIGlmIHdlIG5hcnJvdyB0aGlzIGRvd24gdG8gZTUwMC4NCj4gDQo+ID4gKyAgICAgICAv
+Kg0KPiA+ICsgICAgICAgICogQ3VycmVudGx5IG9ubHkgaW4gbWVtb3J5IGhvdCByZW1vdmUgY2Fz
+ZSB3ZSBtYXkgc3RpbGwgbmVlZCB0aGlzLg0KPiA+ICsgICAgICAgICovDQo+ID4gICAgICAgIGlm
+IChwZm5fdmFsaWQocGZuKSkgew0KPiANCj4gV2Ugc3RpbGwgaGF2ZSB0byBjaGVjayBmb3IgcGZu
+X3ZhbGlkLCBubz8gU28gdGhlICNpZmRlZiBzaG91bGQgYmUgZG93biBoZXJlLg0KPiANCj4gPiAg
+ICAgICAgICAgICAgICBpbnQgcmVzZXJ2ZWQ7DQo+ID4gICAgICAgICAgICAgICAgc3RydWN0IHBh
+Z2UgKnRhaWwgPSBwZm5fdG9fcGFnZShwZm4pOyBAQCAtMTI0LDYgKzEyOCw3DQo+ID4gQEAgYm9v
+bCBrdm1faXNfbW1pb19wZm4ocGZuX3QgcGZuKQ0KPiA+ICAgICAgICAgICAgICAgIH0NCj4gPiAg
+ICAgICAgICAgICAgICByZXR1cm4gUGFnZVJlc2VydmVkKHRhaWwpOw0KPiA+ICAgICAgICB9DQo+
+ID4gKyNlbmRpZg0KPiA+DQo+ID4gICAgICAgIHJldHVybiB0cnVlOw0KPiA+IH0NCj4gPg0KPiA+
+IEJlZm9yZSBhcHBseSB0aGlzIGNoYW5nZToNCj4gPg0KPiA+IHJlYWwgICAgKDFtMTkuOTU0cyAr
+IDFtMjAuOTE4cyArIDFtMjIuNzQwcyArIDFtMjEuMTQ2cyArIDFtMjIuMTIwcykvNT0NCj4gMW0y
+MS4zNzZzDQo+ID4gdXNlciAgICAoMG0yMy4xODFzICsgMG0yMy41NTBzICsgMG0yMy41MDZzICsg
+MG0yMy40MTBzICsgMG0yMy41MjBzKS81PQ0KPiAwbTIzLjQzM3MNCj4gPiBzeXMJKDBtNDkuMDg3
+cyArIDBtNDkuNTYzcyArIDBtNTEuNzU4cyArIDBtNTAuMjkwcyArIDBtNTEuMDQ3cykvNT0gMG01
+MC4zNDlzDQo+ID4NCj4gPiBBZnRlciBhcHBseSB0aGlzIGNoYW5nZToNCj4gPg0KPiA+IHJlYWwg
+ICAgKDFtMTkuNTA3cyArIDFtMjAuOTE5cyArIDFtMjEuNDM2cyArIDFtMjEuMTc5cyArIDFtMjAu
+MjkzcykvNT0NCj4gMW0yMC42NjdzDQo+ID4gdXNlciAgICAoMG0yMi41OTVzICsgMG0yMi43MTlz
+ICsgMG0yMi40ODRzICsgMG0yMi44MTFzICsgMG0yMi40NjdzKS81PQ0KPiAwbTIyLjYxNXMNCj4g
+PiBzeXMJKDBtNDguODQxcyArIDBtNDkuOTI5cyArIDBtNTAuMzEwcyArIDBtNDkuODEzcyArIDBt
+NDguNTg3cykvNT0gMG00OS40OTZzDQo+ID4NCj4gPiBTbywNCj4gPg0KPiA+IHJlYWwgICAgKDFt
+MjAuNjY3cyAtIDFtMjEuMzc2cykvMW0yMS4zNzZzIHggMTAwJSA9IC0wLjYlDQo+ID4gdXNlciAg
+ICAoMG0yMi42MTVzIC0gMG0yMy40MzNzKS8wbTIzLjQzM3MgeCAxMDAlID0gLTMuNSUNCj4gPiBz
+eXMJKDBtNDkuNDk2cyAtIDBtNTAuMzQ5cykvMG01MC4zNDlzIHggMTAwJSA9IC0xLjclDQo+IA0K
+PiBWZXJ5IG5pY2UsIHNvIHRoZXJlIGlzIGEgcmVhbCB3b3JsZCBwZXJmb3JtYW5jZSBiZW5lZml0
+IHRvIGRvaW5nIHRoaXMuIFRoZW4geWVzLA0KPiBJIHRoaW5rIGl0IHdvdWxkIG1ha2Ugc2Vuc2Ug
+dG8gY2hhbmdlIHRoZSBnbG9iYWwgaGVscGVyIGZ1bmN0aW9uIHRvIGJlIGZhc3Qgb24NCj4gZTUw
+MCBhbmQgdXNlIHRoYXQgb25lIGZyb20gZTUwMF9zaGFkb3dfbWFzMl9hdHRyaWIoKSBpbnN0ZWFk
+Lg0KDQpBcmUgbm90IHdlIGdvaW5nIHRvIHVzZSBwYWdlX2lzX3JhbSgpIGZyb20gIGU1MDBfc2hh
+ZG93X21hczJfYXR0cmliKCkgYXMgU2NvdHQgY29tbWVudGVkPw0KDQotQmhhcmF0DQoNCj4gDQo+
+IEdsZWIsIFBhb2xvLCBhbnkgaGFyZCBmZWVsaW5ncz8NCj4gDQo+IA0KPiBBbGV4DQo+IA0KDQo
\ No newline at end of file
diff --git a/a/content_digest b/N1/content_digest
index 9d2dd46..7d2aad8 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -70,273 +70,190 @@
   "b\0"
 ]
 [
-  "\n",
-  "\n",
-  "> -----Original Message-----\n",
-  "> From: Alexander Graf [mailto:agraf\@suse.de]\n",
-  "> Sent: Wednesday, July 24, 2013 1:55 PM\n",
-  "> To: \"\342\200\234tiejun.chen\342\200\235\"\n",
-  "> Cc: Bhushan Bharat-R65777; kvm-ppc\@vger.kernel.org; kvm\@vger.kernel.org list;\n",
-  "> Wood Scott-B07421; Gleb Natapov; Paolo Bonzini\n",
-  "> Subject: Re: [PATCH 2/2] kvm: powerpc: set cache coherency only for kernel\n",
-  "> managed pages\n",
-  "> \n",
-  "> \n",
-  "> On 24.07.2013, at 04:26, \342\200\234tiejun.chen\342\200\235 wrote:\n",
-  "> \n",
-  "> > On 07/18/2013 06:27 PM, Alexander Graf wrote:\n",
-  "> >>\n",
-  "> >> On 18.07.2013, at 12:19, \342\200\234tiejun.chen\342\200\235 wrote:\n",
-  "> >>\n",
-  "> >>> On 07/18/2013 06:12 PM, Alexander Graf wrote:\n",
-  "> >>>>\n",
-  "> >>>> On 18.07.2013, at 12:08, \342\200\234tiejun.chen\342\200\235 wrote:\n",
-  "> >>>>\n",
-  "> >>>>> On 07/18/2013 05:48 PM, Alexander Graf wrote:\n",
-  "> >>>>>>\n",
-  "> >>>>>> On 18.07.2013, at 10:25, Bhushan Bharat-R65777 wrote:\n",
-  "> >>>>>>\n",
-  "> >>>>>>>\n",
-  "> >>>>>>>\n",
-  "> >>>>>>>> -----Original Message-----\n",
-  "> >>>>>>>> From: Bhushan Bharat-R65777\n",
-  "> >>>>>>>> Sent: Thursday, July 18, 2013 1:53 PM\n",
-  "> >>>>>>>> To: '\" tiejun.chen \"'\n",
-  "> >>>>>>>> Cc: kvm-ppc\@vger.kernel.org; kvm\@vger.kernel.org;\n",
-  "> >>>>>>>> agraf\@suse.de; Wood Scott-\n",
-  "> >>>>>>>> B07421\n",
-  "> >>>>>>>> Subject: RE: [PATCH 2/2] kvm: powerpc: set cache coherency only\n",
-  "> >>>>>>>> for kernel managed pages\n",
-  "> >>>>>>>>\n",
-  "> >>>>>>>>\n",
-  "> >>>>>>>>\n",
-  "> >>>>>>>>> -----Original Message-----\n",
-  "> >>>>>>>>> From: \" tiejun.chen \" [mailto:tiejun.chen\@windriver.com]\n",
-  "> >>>>>>>>> Sent: Thursday, July 18, 2013 1:52 PM\n",
-  "> >>>>>>>>> To: Bhushan Bharat-R65777\n",
-  "> >>>>>>>>> Cc: kvm-ppc\@vger.kernel.org; kvm\@vger.kernel.org;\n",
-  "> >>>>>>>>> agraf\@suse.de; Wood\n",
-  "> >>>>>>>>> Scott-\n",
-  "> >>>>>>>>> B07421\n",
-  "> >>>>>>>>> Subject: Re: [PATCH 2/2] kvm: powerpc: set cache coherency\n",
-  "> >>>>>>>>> only for kernel managed pages\n",
-  "> >>>>>>>>>\n",
-  "> >>>>>>>>> On 07/18/2013 04:08 PM, Bhushan Bharat-R65777 wrote:\n",
-  "> >>>>>>>>>>\n",
-  "> >>>>>>>>>>\n",
-  "> >>>>>>>>>>> -----Original Message-----\n",
-  "> >>>>>>>>>>> From: kvm-ppc-owner\@vger.kernel.org\n",
-  "> >>>>>>>>>>> [mailto:kvm-ppc-owner\@vger.kernel.org] On Behalf Of \" tiejun.chen \"\n",
-  "> >>>>>>>>>>> Sent: Thursday, July 18, 2013 1:01 PM\n",
-  "> >>>>>>>>>>> To: Bhushan Bharat-R65777\n",
-  "> >>>>>>>>>>> Cc: kvm-ppc\@vger.kernel.org; kvm\@vger.kernel.org;\n",
-  "> >>>>>>>>>>> agraf\@suse.de; Wood\n",
-  "> >>>>>>>>>>> Scott-\n",
-  "> >>>>>>>>>>> B07421\n",
-  "> >>>>>>>>>>> Subject: Re: [PATCH 2/2] kvm: powerpc: set cache coherency\n",
-  "> >>>>>>>>>>> only for kernel managed pages\n",
-  "> >>>>>>>>>>>\n",
-  "> >>>>>>>>>>> On 07/18/2013 03:12 PM, Bhushan Bharat-R65777 wrote:\n",
-  "> >>>>>>>>>>>>\n",
-  "> >>>>>>>>>>>>\n",
-  "> >>>>>>>>>>>>> -----Original Message-----\n",
-  "> >>>>>>>>>>>>> From: \" tiejun.chen \" [mailto:tiejun.chen\@windriver.com]\n",
-  "> >>>>>>>>>>>>> Sent: Thursday, July 18, 2013 11:56 AM\n",
-  "> >>>>>>>>>>>>> To: Bhushan Bharat-R65777\n",
-  "> >>>>>>>>>>>>> Cc: kvm-ppc\@vger.kernel.org; kvm\@vger.kernel.org;\n",
-  "> >>>>>>>>>>>>> agraf\@suse.de; Wood\n",
-  "> >>>>>>>>>>>>> Scott- B07421; Bhushan Bharat-R65777\n",
-  "> >>>>>>>>>>>>> Subject: Re: [PATCH 2/2] kvm: powerpc: set cache coherency\n",
-  "> >>>>>>>>>>>>> only for kernel managed pages\n",
-  "> >>>>>>>>>>>>>\n",
-  "> >>>>>>>>>>>>> On 07/18/2013 02:04 PM, Bharat Bhushan wrote:\n",
-  "> >>>>>>>>>>>>>> If there is a struct page for the requested mapping then\n",
-  "> >>>>>>>>>>>>>> it's normal DDR and the mapping sets \"M\" bit (coherent,\n",
-  "> >>>>>>>>>>>>>> cacheable) else this is treated as I/O and we set  \"I +\n",
-  "> >>>>>>>>>>>>>> G\"  (cache inhibited,\n",
-  "> >>>>>>>>>>>>>> guarded)\n",
-  "> >>>>>>>>>>>>>>\n",
-  "> >>>>>>>>>>>>>> This helps setting proper TLB mapping for direct assigned\n",
-  "> >>>>>>>>>>>>>> device\n",
-  "> >>>>>>>>>>>>>>\n",
-  "> >>>>>>>>>>>>>> Signed-off-by: Bharat Bhushan\n",
-  "> >>>>>>>>>>>>>> <bharat.bhushan\@freescale.com>\n",
-  "> >>>>>>>>>>>>>> ---\n",
-  "> >>>>>>>>>>>>>>    arch/powerpc/kvm/e500_mmu_host.c |   17 ++++++++++++-----\n",
-  "> >>>>>>>>>>>>>>    1 files changed, 12 insertions(+), 5 deletions(-)\n",
-  "> >>>>>>>>>>>>>>\n",
-  "> >>>>>>>>>>>>>> diff --git a/arch/powerpc/kvm/e500_mmu_host.c\n",
-  "> >>>>>>>>>>>>>> b/arch/powerpc/kvm/e500_mmu_host.c\n",
-  "> >>>>>>>>>>>>>> index 1c6a9d7..089c227 100644\n",
-  "> >>>>>>>>>>>>>> --- a/arch/powerpc/kvm/e500_mmu_host.c\n",
-  "> >>>>>>>>>>>>>> +++ b/arch/powerpc/kvm/e500_mmu_host.c\n",
-  "> >>>>>>>>>>>>>> \@\@ -64,13 +64,20 \@\@ static inline u32\n",
-  "> >>>>>>>>>>>>>> e500_shadow_mas3_attrib(u32 mas3, int\n",
-  "> >>>>>>>>>>>>> usermode)\n",
-  "> >>>>>>>>>>>>>>    \treturn mas3;\n",
-  "> >>>>>>>>>>>>>>    }\n",
-  "> >>>>>>>>>>>>>>\n",
-  "> >>>>>>>>>>>>>> -static inline u32 e500_shadow_mas2_attrib(u32 mas2, int\n",
-  "> >>>>>>>>>>>>>> usermode)\n",
-  "> >>>>>>>>>>>>>> +static inline u32 e500_shadow_mas2_attrib(u32 mas2,\n",
-  "> >>>>>>>>>>>>>> +pfn_t pfn)\n",
-  "> >>>>>>>>>>>>>>    {\n",
-  "> >>>>>>>>>>>>>> +\tu32 mas2_attr;\n",
-  "> >>>>>>>>>>>>>> +\n",
-  "> >>>>>>>>>>>>>> +\tmas2_attr = mas2 & MAS2_ATTRIB_MASK;\n",
-  "> >>>>>>>>>>>>>> +\n",
-  "> >>>>>>>>>>>>>> +\tif (!pfn_valid(pfn)) {\n",
-  "> >>>>>>>>>>>>>\n",
-  "> >>>>>>>>>>>>> Why not directly use kvm_is_mmio_pfn()?\n",
-  "> >>>>>>>>>>>>\n",
-  "> >>>>>>>>>>>> What I understand from this function (someone can correct\n",
-  "> >>>>>>>>>>>> me) is that it\n",
-  "> >>>>>>>>>>> returns \"false\" when the page is managed by kernel and is\n",
-  "> >>>>>>>>>>> not marked as RESERVED (for some reason). For us it does not\n",
-  "> >>>>>>>>>>> matter whether the page is reserved or not, if it is kernel\n",
-  "> >>>>>>>>>>> visible page then it\n",
-  "> >>>>>>>> is DDR.\n",
-  "> >>>>>>>>>>>>\n",
-  "> >>>>>>>>>>>\n",
-  "> >>>>>>>>>>> I think you are setting I|G by addressing all mmio pages,\n",
-  "> >>>>>>>>>>> right? If so,\n",
-  "> >>>>>>>>>>>\n",
-  "> >>>>>>>>>>>      KVM: direct mmio pfn check\n",
-  "> >>>>>>>>>>>\n",
-  "> >>>>>>>>>>>      Userspace may specify memory slots that are backed by\n",
-  "> >>>>>>>>>>> mmio pages rather than\n",
-  "> >>>>>>>>>>>      normal RAM.  In some cases it is not enough to identify\n",
-  "> >>>>>>>>>>> these mmio\n",
-  "> >>>>>>>>> pages\n",
-  "> >>>>>>>>>>>      by pfn_valid().  This patch adds checking the PageReserved as\n",
-  "> well.\n",
-  "> >>>>>>>>>>\n",
-  "> >>>>>>>>>> Do you know what are those \"some cases\" and how checking\n",
-  "> >>>>>>>>>> PageReserved helps in\n",
-  "> >>>>>>>>> those cases?\n",
-  "> >>>>>>>>>\n",
-  "> >>>>>>>>> No, myself didn't see these actual cases in qemu,too. But this\n",
-  "> >>>>>>>>> should be chronically persistent as I understand ;-)\n",
-  "> >>>>>>>>\n",
-  "> >>>>>>>> Then I will wait till someone educate me :)\n",
-  "> >>>>>>>\n",
-  "> >>>>>>> The reason is , kvm_is_mmio_pfn() function looks pretty heavy and I do\n",
-  "> not want to call this for all tlbwe operation unless it is necessary.\n",
-  "> >>>>>>\n",
-  "> >>>>>> It certainly does more than we need and potentially slows down the fast\n",
-  "> path (RAM mapping). The only thing it does on top of \"if (pfn_valid())\" is to\n",
-  "> check for pages that are declared reserved on the host. This happens in 2 cases:\n",
-  "> >>>>>>\n",
-  "> >>>>>>   1) Non cache coherent DMA\n",
-  "> >>>>>>   2) Memory hot remove\n",
-  "> >>>>>>\n",
-  "> >>>>>> The non coherent DMA case would be interesting, as with the mechanism as\n",
-  "> it is in place in Linux today, we could potentially break normal guest operation\n",
-  "> if we don't take it into account. However, it's Kconfig guarded by:\n",
-  "> >>>>>>\n",
-  "> >>>>>>         depends on 4xx || 8xx || E200 || PPC_MPC512x || GAMECUBE_COMMON\n",
-  "> >>>>>>         default n if PPC_47x\n",
-  "> >>>>>>         default y\n",
-  "> >>>>>>\n",
-  "> >>>>>> so we never hit it with any core we care about ;).\n",
-  "> >>>>>>\n",
-  "> >>>>>> Memory hot remove does not exist on e500 FWIW, so we don't have to worry\n",
-  "> about that one either.\n",
-  "> >>>>>\n",
-  "> >>>>> Thanks for this good information :)\n",
-  "> >>>>>\n",
-  "> >>>>> So why not limit those codes with CONFIG_MEMORY_HOTPLUG inside\n",
-  "> kvm_is_mmio_pfn() to make sure that check is only valid when that is really\n",
-  "> needed? This can decrease those unnecessary performance loss.\n",
-  "> >>>>>\n",
-  "> >>>>> If I'm wrong please correct me :)\n",
-  "> >>>>\n",
-  "> >>>> You're perfectly right, but this is generic KVM code. So it gets run across\n",
-  "> all architectures. What if someone has the great idea to add a new case here for\n",
-  "> x86, but doesn't tell us? In that case we potentially break x86.\n",
-  "> >>>>\n",
-  "> >>>> I'd rather not like to break x86 :).\n",
-  "> >>>>\n",
-  "> >>>> However, it'd be very interesting to see a benchmark with this change. Do\n",
-  "> you think you could just rip out the whole reserved check and run a few\n",
-  "> benchmarks and show us the results?\n",
-  "> >>>>\n",
-  "> >>>\n",
-  "> >>> Often what case should be adopted to validate this scenario?\n",
-  "> >>\n",
-  "> >> Something which hammers the TLB emulation heavily. I usually just run\n",
-  "> >> /bin/echo a thousand times in \"time\" and see how long it takes ;)\n",
-  "> >>\n",
-  "> >\n",
-  "> > I tried to run five times with this combination, \"time `for ((i=0; i<5000;\n",
-  "> i++));  do /bin/echo; done`\", to calculate the average value with this change:\n",
-  "> >\n",
-  "> > diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index\n",
-  "> > 1580dd4..5e8635b 100644\n",
-  "> > --- a/virt/kvm/kvm_main.c\n",
-  "> > +++ b/virt/kvm/kvm_main.c\n",
-  "> > \@\@ -102,6 +102,10 \@\@ static bool largepages_enabled = true;\n",
-  "> >\n",
-  "> > bool kvm_is_mmio_pfn(pfn_t pfn)\n",
-  "> > {\n",
-  "> > +#ifdef CONFIG_MEMORY_HOTPLUG\n",
-  "> \n",
-  "> I'd feel safer if we narrow this down to e500.\n",
-  "> \n",
-  "> > +       /*\n",
-  "> > +        * Currently only in memory hot remove case we may still need this.\n",
-  "> > +        */\n",
-  "> >        if (pfn_valid(pfn)) {\n",
-  "> \n",
-  "> We still have to check for pfn_valid, no? So the #ifdef should be down here.\n",
-  "> \n",
-  "> >                int reserved;\n",
-  "> >                struct page *tail = pfn_to_page(pfn); \@\@ -124,6 +128,7\n",
-  "> > \@\@ bool kvm_is_mmio_pfn(pfn_t pfn)\n",
-  "> >                }\n",
-  "> >                return PageReserved(tail);\n",
-  "> >        }\n",
-  "> > +#endif\n",
-  "> >\n",
-  "> >        return true;\n",
-  "> > }\n",
-  "> >\n",
-  "> > Before apply this change:\n",
-  "> >\n",
-  "> > real    (1m19.954s + 1m20.918s + 1m22.740s + 1m21.146s + 1m22.120s)/5=\n",
-  "> 1m21.376s\n",
-  "> > user    (0m23.181s + 0m23.550s + 0m23.506s + 0m23.410s + 0m23.520s)/5=\n",
-  "> 0m23.433s\n",
-  "> > sys\t(0m49.087s + 0m49.563s + 0m51.758s + 0m50.290s + 0m51.047s)/5= 0m50.349s\n",
-  "> >\n",
-  "> > After apply this change:\n",
-  "> >\n",
-  "> > real    (1m19.507s + 1m20.919s + 1m21.436s + 1m21.179s + 1m20.293s)/5=\n",
-  "> 1m20.667s\n",
-  "> > user    (0m22.595s + 0m22.719s + 0m22.484s + 0m22.811s + 0m22.467s)/5=\n",
-  "> 0m22.615s\n",
-  "> > sys\t(0m48.841s + 0m49.929s + 0m50.310s + 0m49.813s + 0m48.587s)/5= 0m49.496s\n",
-  "> >\n",
-  "> > So,\n",
-  "> >\n",
-  "> > real    (1m20.667s - 1m21.376s)/1m21.376s x 100% = -0.6%\n",
-  "> > user    (0m22.615s - 0m23.433s)/0m23.433s x 100% = -3.5%\n",
-  "> > sys\t(0m49.496s - 0m50.349s)/0m50.349s x 100% = -1.7%\n",
-  "> \n",
-  "> Very nice, so there is a real world performance benefit to doing this. Then yes,\n",
-  "> I think it would make sense to change the global helper function to be fast on\n",
-  "> e500 and use that one from e500_shadow_mas2_attrib() instead.\n",
-  "\n",
-  "Are not we going to use page_is_ram() from  e500_shadow_mas2_attrib() as Scott commented?\n",
-  "\n",
-  "-Bharat\n",
-  "\n",
-  "> \n",
-  "> Gleb, Paolo, any hard feelings?\n",
-  "> \n",
-  "> \n",
-  "> Alex\n",
-  ">"
+  "DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogQWxleGFuZGVyIEdyYWYg\n",
+  "W21haWx0bzphZ3JhZkBzdXNlLmRlXQ0KPiBTZW50OiBXZWRuZXNkYXksIEp1bHkgMjQsIDIwMTMg\n",
+  "MTo1NSBQTQ0KPiBUbzogIuKAnHRpZWp1bi5jaGVu4oCdIg0KPiBDYzogQmh1c2hhbiBCaGFyYXQt\n",
+  "UjY1Nzc3OyBrdm0tcHBjQHZnZXIua2VybmVsLm9yZzsga3ZtQHZnZXIua2VybmVsLm9yZyBsaXN0\n",
+  "Ow0KPiBXb29kIFNjb3R0LUIwNzQyMTsgR2xlYiBOYXRhcG92OyBQYW9sbyBCb256aW5pDQo+IFN1\n",
+  "YmplY3Q6IFJlOiBbUEFUQ0ggMi8yXSBrdm06IHBvd2VycGM6IHNldCBjYWNoZSBjb2hlcmVuY3kg\n",
+  "b25seSBmb3Iga2VybmVsDQo+IG1hbmFnZWQgcGFnZXMNCj4gDQo+IA0KPiBPbiAyNC4wNy4yMDEz\n",
+  "LCBhdCAwNDoyNiwg4oCcdGllanVuLmNoZW7igJ0gd3JvdGU6DQo+IA0KPiA+IE9uIDA3LzE4LzIw\n",
+  "MTMgMDY6MjcgUE0sIEFsZXhhbmRlciBHcmFmIHdyb3RlOg0KPiA+Pg0KPiA+PiBPbiAxOC4wNy4y\n",
+  "MDEzLCBhdCAxMjoxOSwg4oCcdGllanVuLmNoZW7igJ0gd3JvdGU6DQo+ID4+DQo+ID4+PiBPbiAw\n",
+  "Ny8xOC8yMDEzIDA2OjEyIFBNLCBBbGV4YW5kZXIgR3JhZiB3cm90ZToNCj4gPj4+Pg0KPiA+Pj4+\n",
+  "IE9uIDE4LjA3LjIwMTMsIGF0IDEyOjA4LCDigJx0aWVqdW4uY2hlbuKAnSB3cm90ZToNCj4gPj4+\n",
+  "Pg0KPiA+Pj4+PiBPbiAwNy8xOC8yMDEzIDA1OjQ4IFBNLCBBbGV4YW5kZXIgR3JhZiB3cm90ZToN\n",
+  "Cj4gPj4+Pj4+DQo+ID4+Pj4+PiBPbiAxOC4wNy4yMDEzLCBhdCAxMDoyNSwgQmh1c2hhbiBCaGFy\n",
+  "YXQtUjY1Nzc3IHdyb3RlOg0KPiA+Pj4+Pj4NCj4gPj4+Pj4+Pg0KPiA+Pj4+Pj4+DQo+ID4+Pj4+\n",
+  "Pj4+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+ID4+Pj4+Pj4+IEZyb206IEJodXNoYW4g\n",
+  "QmhhcmF0LVI2NTc3Nw0KPiA+Pj4+Pj4+PiBTZW50OiBUaHVyc2RheSwgSnVseSAxOCwgMjAxMyAx\n",
+  "OjUzIFBNDQo+ID4+Pj4+Pj4+IFRvOiAnIiB0aWVqdW4uY2hlbiAiJw0KPiA+Pj4+Pj4+PiBDYzog\n",
+  "a3ZtLXBwY0B2Z2VyLmtlcm5lbC5vcmc7IGt2bUB2Z2VyLmtlcm5lbC5vcmc7DQo+ID4+Pj4+Pj4+\n",
+  "IGFncmFmQHN1c2UuZGU7IFdvb2QgU2NvdHQtDQo+ID4+Pj4+Pj4+IEIwNzQyMQ0KPiA+Pj4+Pj4+\n",
+  "PiBTdWJqZWN0OiBSRTogW1BBVENIIDIvMl0ga3ZtOiBwb3dlcnBjOiBzZXQgY2FjaGUgY29oZXJl\n",
+  "bmN5IG9ubHkNCj4gPj4+Pj4+Pj4gZm9yIGtlcm5lbCBtYW5hZ2VkIHBhZ2VzDQo+ID4+Pj4+Pj4+\n",
+  "DQo+ID4+Pj4+Pj4+DQo+ID4+Pj4+Pj4+DQo+ID4+Pj4+Pj4+PiAtLS0tLU9yaWdpbmFsIE1lc3Nh\n",
+  "Z2UtLS0tLQ0KPiA+Pj4+Pj4+Pj4gRnJvbTogIiB0aWVqdW4uY2hlbiAiIFttYWlsdG86dGllanVu\n",
+  "LmNoZW5Ad2luZHJpdmVyLmNvbV0NCj4gPj4+Pj4+Pj4+IFNlbnQ6IFRodXJzZGF5LCBKdWx5IDE4\n",
+  "LCAyMDEzIDE6NTIgUE0NCj4gPj4+Pj4+Pj4+IFRvOiBCaHVzaGFuIEJoYXJhdC1SNjU3NzcNCj4g\n",
+  "Pj4+Pj4+Pj4+IENjOiBrdm0tcHBjQHZnZXIua2VybmVsLm9yZzsga3ZtQHZnZXIua2VybmVsLm9y\n",
+  "ZzsNCj4gPj4+Pj4+Pj4+IGFncmFmQHN1c2UuZGU7IFdvb2QNCj4gPj4+Pj4+Pj4+IFNjb3R0LQ0K\n",
+  "PiA+Pj4+Pj4+Pj4gQjA3NDIxDQo+ID4+Pj4+Pj4+PiBTdWJqZWN0OiBSZTogW1BBVENIIDIvMl0g\n",
+  "a3ZtOiBwb3dlcnBjOiBzZXQgY2FjaGUgY29oZXJlbmN5DQo+ID4+Pj4+Pj4+PiBvbmx5IGZvciBr\n",
+  "ZXJuZWwgbWFuYWdlZCBwYWdlcw0KPiA+Pj4+Pj4+Pj4NCj4gPj4+Pj4+Pj4+IE9uIDA3LzE4LzIw\n",
+  "MTMgMDQ6MDggUE0sIEJodXNoYW4gQmhhcmF0LVI2NTc3NyB3cm90ZToNCj4gPj4+Pj4+Pj4+Pg0K\n",
+  "PiA+Pj4+Pj4+Pj4+DQo+ID4+Pj4+Pj4+Pj4+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+\n",
+  "ID4+Pj4+Pj4+Pj4+IEZyb206IGt2bS1wcGMtb3duZXJAdmdlci5rZXJuZWwub3JnDQo+ID4+Pj4+\n",
+  "Pj4+Pj4+IFttYWlsdG86a3ZtLXBwYy1vd25lckB2Z2VyLmtlcm5lbC5vcmddIE9uIEJlaGFsZiBP\n",
+  "ZiAiIHRpZWp1bi5jaGVuICINCj4gPj4+Pj4+Pj4+Pj4gU2VudDogVGh1cnNkYXksIEp1bHkgMTgs\n",
+  "IDIwMTMgMTowMSBQTQ0KPiA+Pj4+Pj4+Pj4+PiBUbzogQmh1c2hhbiBCaGFyYXQtUjY1Nzc3DQo+\n",
+  "ID4+Pj4+Pj4+Pj4+IENjOiBrdm0tcHBjQHZnZXIua2VybmVsLm9yZzsga3ZtQHZnZXIua2VybmVs\n",
+  "Lm9yZzsNCj4gPj4+Pj4+Pj4+Pj4gYWdyYWZAc3VzZS5kZTsgV29vZA0KPiA+Pj4+Pj4+Pj4+PiBT\n",
+  "Y290dC0NCj4gPj4+Pj4+Pj4+Pj4gQjA3NDIxDQo+ID4+Pj4+Pj4+Pj4+IFN1YmplY3Q6IFJlOiBb\n",
+  "UEFUQ0ggMi8yXSBrdm06IHBvd2VycGM6IHNldCBjYWNoZSBjb2hlcmVuY3kNCj4gPj4+Pj4+Pj4+\n",
+  "Pj4gb25seSBmb3Iga2VybmVsIG1hbmFnZWQgcGFnZXMNCj4gPj4+Pj4+Pj4+Pj4NCj4gPj4+Pj4+\n",
+  "Pj4+Pj4gT24gMDcvMTgvMjAxMyAwMzoxMiBQTSwgQmh1c2hhbiBCaGFyYXQtUjY1Nzc3IHdyb3Rl\n",
+  "Og0KPiA+Pj4+Pj4+Pj4+Pj4NCj4gPj4+Pj4+Pj4+Pj4+DQo+ID4+Pj4+Pj4+Pj4+Pj4gLS0tLS1P\n",
+  "cmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gPj4+Pj4+Pj4+Pj4+PiBGcm9tOiAiIHRpZWp1bi5jaGVu\n",
+  "ICIgW21haWx0bzp0aWVqdW4uY2hlbkB3aW5kcml2ZXIuY29tXQ0KPiA+Pj4+Pj4+Pj4+Pj4+IFNl\n",
+  "bnQ6IFRodXJzZGF5LCBKdWx5IDE4LCAyMDEzIDExOjU2IEFNDQo+ID4+Pj4+Pj4+Pj4+Pj4gVG86\n",
+  "IEJodXNoYW4gQmhhcmF0LVI2NTc3Nw0KPiA+Pj4+Pj4+Pj4+Pj4+IENjOiBrdm0tcHBjQHZnZXIu\n",
+  "a2VybmVsLm9yZzsga3ZtQHZnZXIua2VybmVsLm9yZzsNCj4gPj4+Pj4+Pj4+Pj4+PiBhZ3JhZkBz\n",
+  "dXNlLmRlOyBXb29kDQo+ID4+Pj4+Pj4+Pj4+Pj4gU2NvdHQtIEIwNzQyMTsgQmh1c2hhbiBCaGFy\n",
+  "YXQtUjY1Nzc3DQo+ID4+Pj4+Pj4+Pj4+Pj4gU3ViamVjdDogUmU6IFtQQVRDSCAyLzJdIGt2bTog\n",
+  "cG93ZXJwYzogc2V0IGNhY2hlIGNvaGVyZW5jeQ0KPiA+Pj4+Pj4+Pj4+Pj4+IG9ubHkgZm9yIGtl\n",
+  "cm5lbCBtYW5hZ2VkIHBhZ2VzDQo+ID4+Pj4+Pj4+Pj4+Pj4NCj4gPj4+Pj4+Pj4+Pj4+PiBPbiAw\n",
+  "Ny8xOC8yMDEzIDAyOjA0IFBNLCBCaGFyYXQgQmh1c2hhbiB3cm90ZToNCj4gPj4+Pj4+Pj4+Pj4+\n",
+  "Pj4gSWYgdGhlcmUgaXMgYSBzdHJ1Y3QgcGFnZSBmb3IgdGhlIHJlcXVlc3RlZCBtYXBwaW5nIHRo\n",
+  "ZW4NCj4gPj4+Pj4+Pj4+Pj4+Pj4gaXQncyBub3JtYWwgRERSIGFuZCB0aGUgbWFwcGluZyBzZXRz\n",
+  "ICJNIiBiaXQgKGNvaGVyZW50LA0KPiA+Pj4+Pj4+Pj4+Pj4+PiBjYWNoZWFibGUpIGVsc2UgdGhp\n",
+  "cyBpcyB0cmVhdGVkIGFzIEkvTyBhbmQgd2Ugc2V0ICAiSSArDQo+ID4+Pj4+Pj4+Pj4+Pj4+IEci\n",
+  "ICAoY2FjaGUgaW5oaWJpdGVkLA0KPiA+Pj4+Pj4+Pj4+Pj4+PiBndWFyZGVkKQ0KPiA+Pj4+Pj4+\n",
+  "Pj4+Pj4+Pg0KPiA+Pj4+Pj4+Pj4+Pj4+PiBUaGlzIGhlbHBzIHNldHRpbmcgcHJvcGVyIFRMQiBt\n",
+  "YXBwaW5nIGZvciBkaXJlY3QgYXNzaWduZWQNCj4gPj4+Pj4+Pj4+Pj4+Pj4gZGV2aWNlDQo+ID4+\n",
+  "Pj4+Pj4+Pj4+Pj4+DQo+ID4+Pj4+Pj4+Pj4+Pj4+IFNpZ25lZC1vZmYtYnk6IEJoYXJhdCBCaHVz\n",
+  "aGFuDQo+ID4+Pj4+Pj4+Pj4+Pj4+IDxiaGFyYXQuYmh1c2hhbkBmcmVlc2NhbGUuY29tPg0KPiA+\n",
+  "Pj4+Pj4+Pj4+Pj4+PiAtLS0NCj4gPj4+Pj4+Pj4+Pj4+Pj4gICAgYXJjaC9wb3dlcnBjL2t2bS9l\n",
+  "NTAwX21tdV9ob3N0LmMgfCAgIDE3ICsrKysrKysrKysrKy0tLS0tDQo+ID4+Pj4+Pj4+Pj4+Pj4+\n",
+  "ICAgIDEgZmlsZXMgY2hhbmdlZCwgMTIgaW5zZXJ0aW9ucygrKSwgNSBkZWxldGlvbnMoLSkNCj4g\n",
+  "Pj4+Pj4+Pj4+Pj4+Pj4NCj4gPj4+Pj4+Pj4+Pj4+Pj4gZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJw\n",
+  "Yy9rdm0vZTUwMF9tbXVfaG9zdC5jDQo+ID4+Pj4+Pj4+Pj4+Pj4+IGIvYXJjaC9wb3dlcnBjL2t2\n",
+  "bS9lNTAwX21tdV9ob3N0LmMNCj4gPj4+Pj4+Pj4+Pj4+Pj4gaW5kZXggMWM2YTlkNy4uMDg5YzIy\n",
+  "NyAxMDA2NDQNCj4gPj4+Pj4+Pj4+Pj4+Pj4gLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9lNTAwX21t\n",
+  "dV9ob3N0LmMNCj4gPj4+Pj4+Pj4+Pj4+Pj4gKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9lNTAwX21t\n",
+  "dV9ob3N0LmMNCj4gPj4+Pj4+Pj4+Pj4+Pj4gQEAgLTY0LDEzICs2NCwyMCBAQCBzdGF0aWMgaW5s\n",
+  "aW5lIHUzMg0KPiA+Pj4+Pj4+Pj4+Pj4+PiBlNTAwX3NoYWRvd19tYXMzX2F0dHJpYih1MzIgbWFz\n",
+  "MywgaW50DQo+ID4+Pj4+Pj4+Pj4+Pj4gdXNlcm1vZGUpDQo+ID4+Pj4+Pj4+Pj4+Pj4+ICAgIAly\n",
+  "ZXR1cm4gbWFzMzsNCj4gPj4+Pj4+Pj4+Pj4+Pj4gICAgfQ0KPiA+Pj4+Pj4+Pj4+Pj4+Pg0KPiA+\n",
+  "Pj4+Pj4+Pj4+Pj4+PiAtc3RhdGljIGlubGluZSB1MzIgZTUwMF9zaGFkb3dfbWFzMl9hdHRyaWIo\n",
+  "dTMyIG1hczIsIGludA0KPiA+Pj4+Pj4+Pj4+Pj4+PiB1c2VybW9kZSkNCj4gPj4+Pj4+Pj4+Pj4+\n",
+  "Pj4gK3N0YXRpYyBpbmxpbmUgdTMyIGU1MDBfc2hhZG93X21hczJfYXR0cmliKHUzMiBtYXMyLA0K\n",
+  "PiA+Pj4+Pj4+Pj4+Pj4+PiArcGZuX3QgcGZuKQ0KPiA+Pj4+Pj4+Pj4+Pj4+PiAgICB7DQo+ID4+\n",
+  "Pj4+Pj4+Pj4+Pj4+ICsJdTMyIG1hczJfYXR0cjsNCj4gPj4+Pj4+Pj4+Pj4+Pj4gKw0KPiA+Pj4+\n",
+  "Pj4+Pj4+Pj4+PiArCW1hczJfYXR0ciA9IG1hczIgJiBNQVMyX0FUVFJJQl9NQVNLOw0KPiA+Pj4+\n",
+  "Pj4+Pj4+Pj4+PiArDQo+ID4+Pj4+Pj4+Pj4+Pj4+ICsJaWYgKCFwZm5fdmFsaWQocGZuKSkgew0K\n",
+  "PiA+Pj4+Pj4+Pj4+Pj4+DQo+ID4+Pj4+Pj4+Pj4+Pj4gV2h5IG5vdCBkaXJlY3RseSB1c2Uga3Zt\n",
+  "X2lzX21taW9fcGZuKCk/DQo+ID4+Pj4+Pj4+Pj4+Pg0KPiA+Pj4+Pj4+Pj4+Pj4gV2hhdCBJIHVu\n",
+  "ZGVyc3RhbmQgZnJvbSB0aGlzIGZ1bmN0aW9uIChzb21lb25lIGNhbiBjb3JyZWN0DQo+ID4+Pj4+\n",
+  "Pj4+Pj4+PiBtZSkgaXMgdGhhdCBpdA0KPiA+Pj4+Pj4+Pj4+PiByZXR1cm5zICJmYWxzZSIgd2hl\n",
+  "biB0aGUgcGFnZSBpcyBtYW5hZ2VkIGJ5IGtlcm5lbCBhbmQgaXMNCj4gPj4+Pj4+Pj4+Pj4gbm90\n",
+  "IG1hcmtlZCBhcyBSRVNFUlZFRCAoZm9yIHNvbWUgcmVhc29uKS4gRm9yIHVzIGl0IGRvZXMgbm90\n",
+  "DQo+ID4+Pj4+Pj4+Pj4+IG1hdHRlciB3aGV0aGVyIHRoZSBwYWdlIGlzIHJlc2VydmVkIG9yIG5v\n",
+  "dCwgaWYgaXQgaXMga2VybmVsDQo+ID4+Pj4+Pj4+Pj4+IHZpc2libGUgcGFnZSB0aGVuIGl0DQo+\n",
+  "ID4+Pj4+Pj4+IGlzIEREUi4NCj4gPj4+Pj4+Pj4+Pj4+DQo+ID4+Pj4+Pj4+Pj4+DQo+ID4+Pj4+\n",
+  "Pj4+Pj4+IEkgdGhpbmsgeW91IGFyZSBzZXR0aW5nIEl8RyBieSBhZGRyZXNzaW5nIGFsbCBtbWlv\n",
+  "IHBhZ2VzLA0KPiA+Pj4+Pj4+Pj4+PiByaWdodD8gSWYgc28sDQo+ID4+Pj4+Pj4+Pj4+DQo+ID4+\n",
+  "Pj4+Pj4+Pj4+ICAgICAgS1ZNOiBkaXJlY3QgbW1pbyBwZm4gY2hlY2sNCj4gPj4+Pj4+Pj4+Pj4N\n",
+  "Cj4gPj4+Pj4+Pj4+Pj4gICAgICBVc2Vyc3BhY2UgbWF5IHNwZWNpZnkgbWVtb3J5IHNsb3RzIHRo\n",
+  "YXQgYXJlIGJhY2tlZCBieQ0KPiA+Pj4+Pj4+Pj4+PiBtbWlvIHBhZ2VzIHJhdGhlciB0aGFuDQo+\n",
+  "ID4+Pj4+Pj4+Pj4+ICAgICAgbm9ybWFsIFJBTS4gIEluIHNvbWUgY2FzZXMgaXQgaXMgbm90IGVu\n",
+  "b3VnaCB0byBpZGVudGlmeQ0KPiA+Pj4+Pj4+Pj4+PiB0aGVzZSBtbWlvDQo+ID4+Pj4+Pj4+PiBw\n",
+  "YWdlcw0KPiA+Pj4+Pj4+Pj4+PiAgICAgIGJ5IHBmbl92YWxpZCgpLiAgVGhpcyBwYXRjaCBhZGRz\n",
+  "IGNoZWNraW5nIHRoZSBQYWdlUmVzZXJ2ZWQgYXMNCj4gd2VsbC4NCj4gPj4+Pj4+Pj4+Pg0KPiA+\n",
+  "Pj4+Pj4+Pj4+IERvIHlvdSBrbm93IHdoYXQgYXJlIHRob3NlICJzb21lIGNhc2VzIiBhbmQgaG93\n",
+  "IGNoZWNraW5nDQo+ID4+Pj4+Pj4+Pj4gUGFnZVJlc2VydmVkIGhlbHBzIGluDQo+ID4+Pj4+Pj4+\n",
+  "PiB0aG9zZSBjYXNlcz8NCj4gPj4+Pj4+Pj4+DQo+ID4+Pj4+Pj4+PiBObywgbXlzZWxmIGRpZG4n\n",
+  "dCBzZWUgdGhlc2UgYWN0dWFsIGNhc2VzIGluIHFlbXUsdG9vLiBCdXQgdGhpcw0KPiA+Pj4+Pj4+\n",
+  "Pj4gc2hvdWxkIGJlIGNocm9uaWNhbGx5IHBlcnNpc3RlbnQgYXMgSSB1bmRlcnN0YW5kIDstKQ0K\n",
+  "PiA+Pj4+Pj4+Pg0KPiA+Pj4+Pj4+PiBUaGVuIEkgd2lsbCB3YWl0IHRpbGwgc29tZW9uZSBlZHVj\n",
+  "YXRlIG1lIDopDQo+ID4+Pj4+Pj4NCj4gPj4+Pj4+PiBUaGUgcmVhc29uIGlzICwga3ZtX2lzX21t\n",
+  "aW9fcGZuKCkgZnVuY3Rpb24gbG9va3MgcHJldHR5IGhlYXZ5IGFuZCBJIGRvDQo+IG5vdCB3YW50\n",
+  "IHRvIGNhbGwgdGhpcyBmb3IgYWxsIHRsYndlIG9wZXJhdGlvbiB1bmxlc3MgaXQgaXMgbmVjZXNz\n",
+  "YXJ5Lg0KPiA+Pj4+Pj4NCj4gPj4+Pj4+IEl0IGNlcnRhaW5seSBkb2VzIG1vcmUgdGhhbiB3ZSBu\n",
+  "ZWVkIGFuZCBwb3RlbnRpYWxseSBzbG93cyBkb3duIHRoZSBmYXN0DQo+IHBhdGggKFJBTSBtYXBw\n",
+  "aW5nKS4gVGhlIG9ubHkgdGhpbmcgaXQgZG9lcyBvbiB0b3Agb2YgImlmIChwZm5fdmFsaWQoKSki\n",
+  "IGlzIHRvDQo+IGNoZWNrIGZvciBwYWdlcyB0aGF0IGFyZSBkZWNsYXJlZCByZXNlcnZlZCBvbiB0\n",
+  "aGUgaG9zdC4gVGhpcyBoYXBwZW5zIGluIDIgY2FzZXM6DQo+ID4+Pj4+Pg0KPiA+Pj4+Pj4gICAx\n",
+  "KSBOb24gY2FjaGUgY29oZXJlbnQgRE1BDQo+ID4+Pj4+PiAgIDIpIE1lbW9yeSBob3QgcmVtb3Zl\n",
+  "DQo+ID4+Pj4+Pg0KPiA+Pj4+Pj4gVGhlIG5vbiBjb2hlcmVudCBETUEgY2FzZSB3b3VsZCBiZSBp\n",
+  "bnRlcmVzdGluZywgYXMgd2l0aCB0aGUgbWVjaGFuaXNtIGFzDQo+IGl0IGlzIGluIHBsYWNlIGlu\n",
+  "IExpbnV4IHRvZGF5LCB3ZSBjb3VsZCBwb3RlbnRpYWxseSBicmVhayBub3JtYWwgZ3Vlc3Qgb3Bl\n",
+  "cmF0aW9uDQo+IGlmIHdlIGRvbid0IHRha2UgaXQgaW50byBhY2NvdW50LiBIb3dldmVyLCBpdCdz\n",
+  "IEtjb25maWcgZ3VhcmRlZCBieToNCj4gPj4+Pj4+DQo+ID4+Pj4+PiAgICAgICAgIGRlcGVuZHMg\n",
+  "b24gNHh4IHx8IDh4eCB8fCBFMjAwIHx8IFBQQ19NUEM1MTJ4IHx8IEdBTUVDVUJFX0NPTU1PTg0K\n",
+  "PiA+Pj4+Pj4gICAgICAgICBkZWZhdWx0IG4gaWYgUFBDXzQ3eA0KPiA+Pj4+Pj4gICAgICAgICBk\n",
+  "ZWZhdWx0IHkNCj4gPj4+Pj4+DQo+ID4+Pj4+PiBzbyB3ZSBuZXZlciBoaXQgaXQgd2l0aCBhbnkg\n",
+  "Y29yZSB3ZSBjYXJlIGFib3V0IDspLg0KPiA+Pj4+Pj4NCj4gPj4+Pj4+IE1lbW9yeSBob3QgcmVt\n",
+  "b3ZlIGRvZXMgbm90IGV4aXN0IG9uIGU1MDAgRldJVywgc28gd2UgZG9uJ3QgaGF2ZSB0byB3b3Jy\n",
+  "eQ0KPiBhYm91dCB0aGF0IG9uZSBlaXRoZXIuDQo+ID4+Pj4+DQo+ID4+Pj4+IFRoYW5rcyBmb3Ig\n",
+  "dGhpcyBnb29kIGluZm9ybWF0aW9uIDopDQo+ID4+Pj4+DQo+ID4+Pj4+IFNvIHdoeSBub3QgbGlt\n",
+  "aXQgdGhvc2UgY29kZXMgd2l0aCBDT05GSUdfTUVNT1JZX0hPVFBMVUcgaW5zaWRlDQo+IGt2bV9p\n",
+  "c19tbWlvX3BmbigpIHRvIG1ha2Ugc3VyZSB0aGF0IGNoZWNrIGlzIG9ubHkgdmFsaWQgd2hlbiB0\n",
+  "aGF0IGlzIHJlYWxseQ0KPiBuZWVkZWQ/IFRoaXMgY2FuIGRlY3JlYXNlIHRob3NlIHVubmVjZXNz\n",
+  "YXJ5IHBlcmZvcm1hbmNlIGxvc3MuDQo+ID4+Pj4+DQo+ID4+Pj4+IElmIEknbSB3cm9uZyBwbGVh\n",
+  "c2UgY29ycmVjdCBtZSA6KQ0KPiA+Pj4+DQo+ID4+Pj4gWW91J3JlIHBlcmZlY3RseSByaWdodCwg\n",
+  "YnV0IHRoaXMgaXMgZ2VuZXJpYyBLVk0gY29kZS4gU28gaXQgZ2V0cyBydW4gYWNyb3NzDQo+IGFs\n",
+  "bCBhcmNoaXRlY3R1cmVzLiBXaGF0IGlmIHNvbWVvbmUgaGFzIHRoZSBncmVhdCBpZGVhIHRvIGFk\n",
+  "ZCBhIG5ldyBjYXNlIGhlcmUgZm9yDQo+IHg4NiwgYnV0IGRvZXNuJ3QgdGVsbCB1cz8gSW4gdGhh\n",
+  "dCBjYXNlIHdlIHBvdGVudGlhbGx5IGJyZWFrIHg4Ni4NCj4gPj4+Pg0KPiA+Pj4+IEknZCByYXRo\n",
+  "ZXIgbm90IGxpa2UgdG8gYnJlYWsgeDg2IDopLg0KPiA+Pj4+DQo+ID4+Pj4gSG93ZXZlciwgaXQn\n",
+  "ZCBiZSB2ZXJ5IGludGVyZXN0aW5nIHRvIHNlZSBhIGJlbmNobWFyayB3aXRoIHRoaXMgY2hhbmdl\n",
+  "LiBEbw0KPiB5b3UgdGhpbmsgeW91IGNvdWxkIGp1c3QgcmlwIG91dCB0aGUgd2hvbGUgcmVzZXJ2\n",
+  "ZWQgY2hlY2sgYW5kIHJ1biBhIGZldw0KPiBiZW5jaG1hcmtzIGFuZCBzaG93IHVzIHRoZSByZXN1\n",
+  "bHRzPw0KPiA+Pj4+DQo+ID4+Pg0KPiA+Pj4gT2Z0ZW4gd2hhdCBjYXNlIHNob3VsZCBiZSBhZG9w\n",
+  "dGVkIHRvIHZhbGlkYXRlIHRoaXMgc2NlbmFyaW8/DQo+ID4+DQo+ID4+IFNvbWV0aGluZyB3aGlj\n",
+  "aCBoYW1tZXJzIHRoZSBUTEIgZW11bGF0aW9uIGhlYXZpbHkuIEkgdXN1YWxseSBqdXN0IHJ1bg0K\n",
+  "PiA+PiAvYmluL2VjaG8gYSB0aG91c2FuZCB0aW1lcyBpbiAidGltZSIgYW5kIHNlZSBob3cgbG9u\n",
+  "ZyBpdCB0YWtlcyA7KQ0KPiA+Pg0KPiA+DQo+ID4gSSB0cmllZCB0byBydW4gZml2ZSB0aW1lcyB3\n",
+  "aXRoIHRoaXMgY29tYmluYXRpb24sICJ0aW1lIGBmb3IgKChpPTA7IGk8NTAwMDsNCj4gaSsrKSk7\n",
+  "ICBkbyAvYmluL2VjaG87IGRvbmVgIiwgdG8gY2FsY3VsYXRlIHRoZSBhdmVyYWdlIHZhbHVlIHdp\n",
+  "dGggdGhpcyBjaGFuZ2U6DQo+ID4NCj4gPiBkaWZmIC0tZ2l0IGEvdmlydC9rdm0va3ZtX21haW4u\n",
+  "YyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMgaW5kZXgNCj4gPiAxNTgwZGQ0Li41ZTg2MzViIDEwMDY0\n",
+  "NA0KPiA+IC0tLSBhL3ZpcnQva3ZtL2t2bV9tYWluLmMNCj4gPiArKysgYi92aXJ0L2t2bS9rdm1f\n",
+  "bWFpbi5jDQo+ID4gQEAgLTEwMiw2ICsxMDIsMTAgQEAgc3RhdGljIGJvb2wgbGFyZ2VwYWdlc19l\n",
+  "bmFibGVkID0gdHJ1ZTsNCj4gPg0KPiA+IGJvb2wga3ZtX2lzX21taW9fcGZuKHBmbl90IHBmbikN\n",
+  "Cj4gPiB7DQo+ID4gKyNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUcNCj4gDQo+IEknZCBmZWVs\n",
+  "IHNhZmVyIGlmIHdlIG5hcnJvdyB0aGlzIGRvd24gdG8gZTUwMC4NCj4gDQo+ID4gKyAgICAgICAv\n",
+  "Kg0KPiA+ICsgICAgICAgICogQ3VycmVudGx5IG9ubHkgaW4gbWVtb3J5IGhvdCByZW1vdmUgY2Fz\n",
+  "ZSB3ZSBtYXkgc3RpbGwgbmVlZCB0aGlzLg0KPiA+ICsgICAgICAgICovDQo+ID4gICAgICAgIGlm\n",
+  "IChwZm5fdmFsaWQocGZuKSkgew0KPiANCj4gV2Ugc3RpbGwgaGF2ZSB0byBjaGVjayBmb3IgcGZu\n",
+  "X3ZhbGlkLCBubz8gU28gdGhlICNpZmRlZiBzaG91bGQgYmUgZG93biBoZXJlLg0KPiANCj4gPiAg\n",
+  "ICAgICAgICAgICAgICBpbnQgcmVzZXJ2ZWQ7DQo+ID4gICAgICAgICAgICAgICAgc3RydWN0IHBh\n",
+  "Z2UgKnRhaWwgPSBwZm5fdG9fcGFnZShwZm4pOyBAQCAtMTI0LDYgKzEyOCw3DQo+ID4gQEAgYm9v\n",
+  "bCBrdm1faXNfbW1pb19wZm4ocGZuX3QgcGZuKQ0KPiA+ICAgICAgICAgICAgICAgIH0NCj4gPiAg\n",
+  "ICAgICAgICAgICAgICByZXR1cm4gUGFnZVJlc2VydmVkKHRhaWwpOw0KPiA+ICAgICAgICB9DQo+\n",
+  "ID4gKyNlbmRpZg0KPiA+DQo+ID4gICAgICAgIHJldHVybiB0cnVlOw0KPiA+IH0NCj4gPg0KPiA+\n",
+  "IEJlZm9yZSBhcHBseSB0aGlzIGNoYW5nZToNCj4gPg0KPiA+IHJlYWwgICAgKDFtMTkuOTU0cyAr\n",
+  "IDFtMjAuOTE4cyArIDFtMjIuNzQwcyArIDFtMjEuMTQ2cyArIDFtMjIuMTIwcykvNT0NCj4gMW0y\n",
+  "MS4zNzZzDQo+ID4gdXNlciAgICAoMG0yMy4xODFzICsgMG0yMy41NTBzICsgMG0yMy41MDZzICsg\n",
+  "MG0yMy40MTBzICsgMG0yMy41MjBzKS81PQ0KPiAwbTIzLjQzM3MNCj4gPiBzeXMJKDBtNDkuMDg3\n",
+  "cyArIDBtNDkuNTYzcyArIDBtNTEuNzU4cyArIDBtNTAuMjkwcyArIDBtNTEuMDQ3cykvNT0gMG01\n",
+  "MC4zNDlzDQo+ID4NCj4gPiBBZnRlciBhcHBseSB0aGlzIGNoYW5nZToNCj4gPg0KPiA+IHJlYWwg\n",
+  "ICAgKDFtMTkuNTA3cyArIDFtMjAuOTE5cyArIDFtMjEuNDM2cyArIDFtMjEuMTc5cyArIDFtMjAu\n",
+  "MjkzcykvNT0NCj4gMW0yMC42NjdzDQo+ID4gdXNlciAgICAoMG0yMi41OTVzICsgMG0yMi43MTlz\n",
+  "ICsgMG0yMi40ODRzICsgMG0yMi44MTFzICsgMG0yMi40NjdzKS81PQ0KPiAwbTIyLjYxNXMNCj4g\n",
+  "PiBzeXMJKDBtNDguODQxcyArIDBtNDkuOTI5cyArIDBtNTAuMzEwcyArIDBtNDkuODEzcyArIDBt\n",
+  "NDguNTg3cykvNT0gMG00OS40OTZzDQo+ID4NCj4gPiBTbywNCj4gPg0KPiA+IHJlYWwgICAgKDFt\n",
+  "MjAuNjY3cyAtIDFtMjEuMzc2cykvMW0yMS4zNzZzIHggMTAwJSA9IC0wLjYlDQo+ID4gdXNlciAg\n",
+  "ICAoMG0yMi42MTVzIC0gMG0yMy40MzNzKS8wbTIzLjQzM3MgeCAxMDAlID0gLTMuNSUNCj4gPiBz\n",
+  "eXMJKDBtNDkuNDk2cyAtIDBtNTAuMzQ5cykvMG01MC4zNDlzIHggMTAwJSA9IC0xLjclDQo+IA0K\n",
+  "PiBWZXJ5IG5pY2UsIHNvIHRoZXJlIGlzIGEgcmVhbCB3b3JsZCBwZXJmb3JtYW5jZSBiZW5lZml0\n",
+  "IHRvIGRvaW5nIHRoaXMuIFRoZW4geWVzLA0KPiBJIHRoaW5rIGl0IHdvdWxkIG1ha2Ugc2Vuc2Ug\n",
+  "dG8gY2hhbmdlIHRoZSBnbG9iYWwgaGVscGVyIGZ1bmN0aW9uIHRvIGJlIGZhc3Qgb24NCj4gZTUw\n",
+  "MCBhbmQgdXNlIHRoYXQgb25lIGZyb20gZTUwMF9zaGFkb3dfbWFzMl9hdHRyaWIoKSBpbnN0ZWFk\n",
+  "Lg0KDQpBcmUgbm90IHdlIGdvaW5nIHRvIHVzZSBwYWdlX2lzX3JhbSgpIGZyb20gIGU1MDBfc2hh\n",
+  "ZG93X21hczJfYXR0cmliKCkgYXMgU2NvdHQgY29tbWVudGVkPw0KDQotQmhhcmF0DQoNCj4gDQo+\n",
+  "IEdsZWIsIFBhb2xvLCBhbnkgaGFyZCBmZWVsaW5ncz8NCj4gDQo+IA0KPiBBbGV4DQo+IA0KDQo"
 ]
 
-64f9f815a5c0e55773706ef08ce28f8e0e78bbfb5ee0b386aedd61ddbeaa657b
+657f56c1b412dd61fb98d396b26470f795feeb64d2c1663a8e9dc34b82cf7cbf

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.