From nobody Wed Aug 02 08:15:37 2023 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4RG4YM6VQPz4qQRH; Wed, 2 Aug 2023 08:15:51 +0000 (UTC) (envelope-from chagin.dmitry@gmail.com) Received: from mail-yb1-f177.google.com (mail-yb1-f177.google.com [209.85.219.177]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "smtp.gmail.com", Issuer "GTS CA 1D4" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4RG4YL2z8Fz3JG5; Wed, 2 Aug 2023 08:15:50 +0000 (UTC) (envelope-from chagin.dmitry@gmail.com) Authentication-Results: mx1.freebsd.org; none Received: by mail-yb1-f177.google.com with SMTP id 3f1490d57ef6-d2b8437d825so4134115276.3; Wed, 02 Aug 2023 01:15:50 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1690964148; x=1691568948; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=BAmSERIaWdepIB2rLzYsE8xLptTw9RXL8nITv9VuDv8=; b=OgQWUB+siocrIrzAxX5FFZJm5dYVJo6CcKp4kCA9FdgC8aReIJ4TXj53vbuJgCYBY7 tWcW2XhB+Jrq29QYz0lB+yybNM8WDGcjgIAcgghUChMz5e1yyQOKpyou16FVWaMAYwr2 0bod4bZURGq8g7nAEMQ5+OFcD9S/Yun4iBJKDKYH7HmiZdnRqrDRUguDaaA/85z7XASd N9WXZMOT5OBBCUY6zJjIQE4UUbjLCy+OpC+AxiOsQtUn+XVsGxZKXveLVk4g8TZqR+GR 6iSvs3SkY6wV+Hmu9qawWOZmgKXXJTrlgTjzFTgCDzjU1bcRMM/krwBd55tUTK8zOyix /Zzw== X-Gm-Message-State: ABy/qLZq2D+ztD5P3xohTCg1E9HcgWdaQ7r1qhabzOVpUHpl3IjxirF8 D9Zaa4U6sxQJOHXxK64JWckA0j6PcS4+v7NYeKnzCnj/ X-Google-Smtp-Source: APBJJlHpXJWj2y4OqIhC4jqyxH5tbkwXHBHE1BqHSVIxsg2crpHniCUUI7S8XtikxaPQ/Xe8BM+/eVvRX2fXF1ft64U= X-Received: by 2002:a25:118a:0:b0:d1c:be0e:b9dd with SMTP id 132-20020a25118a000000b00d1cbe0eb9ddmr13418502ybr.28.1690964148573; Wed, 02 Aug 2023 01:15:48 -0700 (PDT) List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 References: <202308020314.3723ETgj027830@gitrepo.freebsd.org> In-Reply-To: <202308020314.3723ETgj027830@gitrepo.freebsd.org> From: Dmitry Chagin Date: Wed, 2 Aug 2023 11:15:37 +0300 Message-ID: Subject: Re: git: 1a7fcf6d51eb - main - vm_phys_enqueue_contig: handle npages==0 To: Doug Moore Cc: dev-commits-src-all@freebsd.org, dev-commits-src-main@freebsd.org, src-committers@freebsd.org Content-Type: multipart/alternative; boundary="000000000000675be50601ec45f2" X-Rspamd-Queue-Id: 4RG4YL2z8Fz3JG5 X-Spamd-Bar: ---- X-Rspamd-Pre-Result: action=no action; module=replies; Message is reply to one we originated X-Spamd-Result: default: False [-4.00 / 15.00]; REPLY(-4.00)[]; TAGGED_FROM(0.00)[]; ASN(0.00)[asn:15169, ipnet:209.85.128.0/17, country:US] --000000000000675be50601ec45f2 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi, With this change, I got a panic: vm_phys_enq_range: page 0xfffffe0000000000 and pages 0 are misaligned =D0=A1=D1=80, 2 =D0=B0=D0=B2=D0=B3. 2023 =D0=B3. =D0=B2 06:22, Doug Moore <= dougm@freebsd.org>: > The branch main has been updated by dougm: > > URL: > https://cgit.FreeBSD.org/src/commit/?id=3D1a7fcf6d51eb67ee3e05fdbb806f7e6= 8f9f53c9c > > commit 1a7fcf6d51eb67ee3e05fdbb806f7e68f9f53c9c > Author: Doug Moore > AuthorDate: 2023-08-02 03:12:00 +0000 > Commit: Doug Moore > CommitDate: 2023-08-02 03:12:00 +0000 > > vm_phys_enqueue_contig: handle npages=3D=3D0 > > By letting vm_phys_enqueue_contig handle the case when npages =3D=3D = 0, > the callers can stop checking it, and the compiler can stop > zero-checking with every call to ffs(). Letting vm_phys_enqueue_conti= g > call vm_phys_enqueue_contig for part of its work also saves a few > bytes. > > The amd64 object code shrinks by 80 bytes. > > Reviewed by: kib > Differential Revision: https://reviews.freebsd.org/D41154 > --- > sys/vm/vm_phys.c | 74 > +++++++++++++++++++++++++++----------------------------- > 1 file changed, 35 insertions(+), 39 deletions(-) > > diff --git a/sys/vm/vm_phys.c b/sys/vm/vm_phys.c > index 28f12231e01c..b2084bdef4e1 100644 > --- a/sys/vm/vm_phys.c > +++ b/sys/vm/vm_phys.c > @@ -72,6 +72,8 @@ __FBSDID("$FreeBSD$"); > > _Static_assert(sizeof(long) * NBBY >=3D VM_PHYSSEG_MAX, > "Too many physsegs."); > +_Static_assert(sizeof(long long) >=3D sizeof(vm_paddr_t), > + "vm_paddr_t too big for ffsll, flsll."); > > #ifdef NUMA > struct mem_affinity __read_mostly *mem_affinity; > @@ -690,18 +692,16 @@ vm_phys_split_pages(vm_page_t m, int oind, struct > vm_freelist *fl, int order, > * > * The physical page m's buddy must not be free. > */ > -static void > +static vm_page_t > vm_phys_enq_range(vm_page_t m, u_int npages, struct vm_freelist *fl, int > tail) > { > - u_int n; > int order; > > - KASSERT(npages > 0, ("vm_phys_enq_range: npages is 0")); > KASSERT(((VM_PAGE_TO_PHYS(m) + npages * PAGE_SIZE) & > ((PAGE_SIZE << (fls(npages) - 1)) - 1)) =3D=3D 0, > ("vm_phys_enq_range: page %p and npages %u are misaligned", > m, npages)); > - do { > + while (npages > 0) { > KASSERT(m->order =3D=3D VM_NFREEORDER, > ("vm_phys_enq_range: page %p has unexpected order %d"= , > m, m->order)); > @@ -709,10 +709,10 @@ vm_phys_enq_range(vm_page_t m, u_int npages, struct > vm_freelist *fl, int tail) > KASSERT(order < VM_NFREEORDER, > ("vm_phys_enq_range: order %d is out of range", > order)); > vm_freelist_add(fl, m, order, tail); > - n =3D 1 << order; > - m +=3D n; > - npages -=3D n; > - } while (npages > 0); > + m +=3D 1 << order; > + npages -=3D 1 << order; > + } > + return (m); > } > > /* > @@ -744,7 +744,7 @@ vm_phys_alloc_npages(int domain, int pool, int npages= , > vm_page_t ma[]) > { > struct vm_freelist *alt, *fl; > vm_page_t m; > - int avail, end, flind, freelist, i, need, oind, pind; > + int avail, end, flind, freelist, i, oind, pind; > > KASSERT(domain >=3D 0 && domain < vm_ndomains, > ("vm_phys_alloc_npages: domain %d is out of range", domain)); > @@ -762,20 +762,18 @@ vm_phys_alloc_npages(int domain, int pool, int > npages, vm_page_t ma[]) > for (oind =3D 0; oind < VM_NFREEORDER; oind++) { > while ((m =3D TAILQ_FIRST(&fl[oind].pl)) !=3D NUL= L) { > vm_freelist_rem(fl, m, oind); > - avail =3D 1 << oind; > - need =3D imin(npages - i, avail); > - for (end =3D i + need; i < end;) > + avail =3D i + (1 << oind); > + end =3D imin(npages, avail); > + while (i < end) > ma[i++] =3D m++; > - if (need < avail) { > + if (i =3D=3D npages) { > /* > - * Return excess pages to fl. It= s > - * order [0, oind) queues are > empty. > + * Return excess pages to fl. It= s > order > + * [0, oind) queues are empty. > */ > - vm_phys_enq_range(m, avail - need= , > fl, > - 1); > - return (npages); > - } else if (i =3D=3D npages) > + vm_phys_enq_range(m, avail - i, > fl, 1); > return (npages); > + } > } > } > for (oind =3D VM_NFREEORDER - 1; oind >=3D 0; oind--) { > @@ -785,21 +783,20 @@ vm_phys_alloc_npages(int domain, int pool, int > npages, vm_page_t ma[]) > NULL) { > vm_freelist_rem(alt, m, oind); > vm_phys_set_pool(pool, m, oind); > - avail =3D 1 << oind; > - need =3D imin(npages - i, avail); > - for (end =3D i + need; i < end;) > + avail =3D i + (1 << oind); > + end =3D imin(npages, avail); > + while (i < end) > ma[i++] =3D m++; > - if (need < avail) { > + if (i =3D=3D npages) { > /* > * Return excess pages to > fl. > * Its order [0, oind) > queues > * are empty. > */ > - vm_phys_enq_range(m, avai= l > - > - need, fl, 1); > - return (npages); > - } else if (i =3D=3D npages) > + vm_phys_enq_range(m, avai= l > - i, > + fl, 1); > return (npages); > + } > } > } > } > @@ -1146,7 +1143,7 @@ max_order(vm_page_t m) > * because the size of a physical address exceeds the size of > * a long. > */ > - return (min(ffsl(VM_PAGE_TO_PHYS(m) >> PAGE_SHIFT) - 1, > + return (min(ffsll(VM_PAGE_TO_PHYS(m) >> PAGE_SHIFT) - 1, > VM_NFREEORDER - 1)); > } > > @@ -1162,6 +1159,7 @@ vm_phys_enqueue_contig(vm_page_t m, u_long npages) > struct vm_freelist *fl; > struct vm_phys_seg *seg; > vm_page_t m_end; > + vm_paddr_t diff, lo; > int order; > > /* > @@ -1173,15 +1171,15 @@ vm_phys_enqueue_contig(vm_page_t m, u_long npages= ) > fl =3D (*seg->free_queues)[m->pool]; > m_end =3D m + npages; > /* Free blocks of increasing size. */ > - while ((order =3D max_order(m)) < VM_NFREEORDER - 1 && > - m + (1 << order) <=3D m_end) { > - KASSERT(seg =3D=3D &vm_phys_segs[m->segind], > - ("%s: page range [%p,%p) spans multiple segments", > - __func__, m_end - npages, m)); > - vm_freelist_add(fl, m, order, 1); > - m +=3D 1 << order; > + lo =3D VM_PAGE_TO_PHYS(m) >> PAGE_SHIFT; > + if (m < m_end && > + (diff =3D lo ^ (lo + npages - 1)) !=3D 0) { > + order =3D min(flsll(diff) - 1, VM_NFREEORDER - 1); > + m =3D vm_phys_enq_range(m, roundup2(-lo, 1 << order), fl,= 1); > } > + > /* Free blocks of maximum size. */ > + order =3D VM_NFREEORDER - 1; > while (m + (1 << order) <=3D m_end) { > KASSERT(seg =3D=3D &vm_phys_segs[m->segind], > ("%s: page range [%p,%p) spans multiple segments", > @@ -1560,10 +1558,8 @@ vm_phys_alloc_contig(int domain, u_long npages, > vm_paddr_t low, vm_paddr_t high, > vm_phys_set_pool(VM_FREEPOOL_DEFAULT, m, oind); > } > /* Return excess pages to the free lists. */ > - if (&m_run[npages] < m) { > - fl =3D (*queues)[VM_FREEPOOL_DEFAULT]; > - vm_phys_enq_range(&m_run[npages], m - &m_run[npages], fl, > 0); > - } > + fl =3D (*queues)[VM_FREEPOOL_DEFAULT]; > + vm_phys_enq_range(&m_run[npages], m - &m_run[npages], fl, 0); > return (m_run); > } > > --000000000000675be50601ec45f2 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGRpdj48YnI+PC9kaXY+PGRpdiBkaXI9ImF1dG8iPkhpLDwvZGl2PjxkaXYgZGlyPSJhdXRvIj48 YnI+PC9kaXY+PGRpdiBkaXI9ImF1dG8iPjxkaXYgZGlyPSJhdXRvIj5XaXRoIHRoaXMgY2hhbmdl LCBJIGdvdCBhIHBhbmljOjwvZGl2PjxkaXYgZGlyPSJhdXRvIj52bV9waHlzX2VucV9yYW5nZTog cGFnZSAweGZmZmZmZTAwMDAwMDAwMDAgYW5kIHBhZ2VzIDAgYXJlIG1pc2FsaWduZWQ8L2Rpdj48 L2Rpdj48ZGl2IGRpcj0iYXV0byI+PGJyPjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIiBkaXI9ImF1 dG8iPjxkaXYgZGlyPSJsdHIiIGNsYXNzPSJnbWFpbF9hdHRyIj7QodGALCAyINCw0LLQsy4gMjAy M8Kg0LMuINCyIDA2OjIyLCBEb3VnIE1vb3JlICZsdDs8YSBocmVmPSJtYWlsdG86ZG91Z21AZnJl ZWJzZC5vcmciPmRvdWdtQGZyZWVic2Qub3JnPC9hPiZndDs6PGJyPjwvZGl2PjxibG9ja3F1b3Rl IGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdpbjowIDAgMCAuOGV4O2JvcmRlci1sZWZ0 OjFweCAjY2NjIHNvbGlkO3BhZGRpbmctbGVmdDoxZXgiPlRoZSBicmFuY2ggbWFpbiBoYXMgYmVl biB1cGRhdGVkIGJ5IGRvdWdtOjxicj4NCjxicj4NClVSTDogPGEgaHJlZj0iaHR0cHM6Ly9jZ2l0 LkZyZWVCU0Qub3JnL3NyYy9jb21taXQvP2lkPTFhN2ZjZjZkNTFlYjY3ZWUzZTA1ZmRiYjgwNmY3 ZTY4ZjlmNTNjOWMiIHJlbD0ibm9yZWZlcnJlciIgdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vY2dp dC5GcmVlQlNELm9yZy9zcmMvY29tbWl0Lz9pZD0xYTdmY2Y2ZDUxZWI2N2VlM2UwNWZkYmI4MDZm N2U2OGY5ZjUzYzljPC9hPjxicj4NCjxicj4NCmNvbW1pdCAxYTdmY2Y2ZDUxZWI2N2VlM2UwNWZk YmI4MDZmN2U2OGY5ZjUzYzljPGJyPg0KQXV0aG9yOsKgIMKgIMKgRG91ZyBNb29yZSAmbHQ7ZG91 Z21ARnJlZUJTRC5vcmcmZ3Q7PGJyPg0KQXV0aG9yRGF0ZTogMjAyMy0wOC0wMiAwMzoxMjowMCAr MDAwMDxicj4NCkNvbW1pdDrCoCDCoCDCoERvdWcgTW9vcmUgJmx0O2RvdWdtQEZyZWVCU0Qub3Jn Jmd0Ozxicj4NCkNvbW1pdERhdGU6IDIwMjMtMDgtMDIgMDM6MTI6MDAgKzAwMDA8YnI+DQo8YnI+ DQrCoCDCoCB2bV9waHlzX2VucXVldWVfY29udGlnOiBoYW5kbGUgbnBhZ2VzPT0wPGJyPg0KPGJy Pg0KwqAgwqAgQnkgbGV0dGluZyB2bV9waHlzX2VucXVldWVfY29udGlnIGhhbmRsZSB0aGUgY2Fz ZSB3aGVuIG5wYWdlcyA9PSAwLDxicj4NCsKgIMKgIHRoZSBjYWxsZXJzIGNhbiBzdG9wIGNoZWNr aW5nIGl0LCBhbmQgdGhlIGNvbXBpbGVyIGNhbiBzdG9wPGJyPg0KwqAgwqAgemVyby1jaGVja2lu ZyB3aXRoIGV2ZXJ5IGNhbGwgdG8gZmZzKCkuIExldHRpbmcgdm1fcGh5c19lbnF1ZXVlX2NvbnRp Zzxicj4NCsKgIMKgIGNhbGwgdm1fcGh5c19lbnF1ZXVlX2NvbnRpZyBmb3IgcGFydCBvZiBpdHMg d29yayBhbHNvIHNhdmVzIGEgZmV3PGJyPg0KwqAgwqAgYnl0ZXMuPGJyPg0KPGJyPg0KwqAgwqAg VGhlIGFtZDY0IG9iamVjdCBjb2RlIHNocmlua3MgYnkgODAgYnl0ZXMuPGJyPg0KPGJyPg0KwqAg wqAgUmV2aWV3ZWQgYnk6wqAgwqAga2liPGJyPg0KwqAgwqAgRGlmZmVyZW50aWFsIFJldmlzaW9u OsKgIDxhIGhyZWY9Imh0dHBzOi8vcmV2aWV3cy5mcmVlYnNkLm9yZy9ENDExNTQiIHJlbD0ibm9y ZWZlcnJlciIgdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vcmV2aWV3cy5mcmVlYnNkLm9yZy9ENDEx NTQ8L2E+PGJyPg0KLS0tPGJyPg0KwqBzeXMvdm0vdm1fcGh5cy5jIHwgNzQgKysrKysrKysrKysr KysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08YnI+DQrCoDEgZmls ZSBjaGFuZ2VkLCAzNSBpbnNlcnRpb25zKCspLCAzOSBkZWxldGlvbnMoLSk8YnI+DQo8YnI+DQpk aWZmIC0tZ2l0IGEvc3lzL3ZtL3ZtX3BoeXMuYyBiL3N5cy92bS92bV9waHlzLmM8YnI+DQppbmRl eCAyOGYxMjIzMWUwMWMuLmIyMDg0YmRlZjRlMSAxMDA2NDQ8YnI+DQotLS0gYS9zeXMvdm0vdm1f cGh5cy5jPGJyPg0KKysrIGIvc3lzL3ZtL3ZtX3BoeXMuYzxicj4NCkBAIC03Miw2ICs3Miw4IEBA IF9fRkJTRElEKCZxdW90OyRGcmVlQlNEJCZxdW90Oyk7PGJyPg0KPGJyPg0KwqBfU3RhdGljX2Fz c2VydChzaXplb2YobG9uZykgKiBOQkJZICZndDs9IFZNX1BIWVNTRUdfTUFYLDxicj4NCsKgIMKg IMKgJnF1b3Q7VG9vIG1hbnkgcGh5c3NlZ3MuJnF1b3Q7KTs8YnI+DQorX1N0YXRpY19hc3NlcnQo c2l6ZW9mKGxvbmcgbG9uZykgJmd0Oz0gc2l6ZW9mKHZtX3BhZGRyX3QpLDxicj4NCivCoCDCoCAm cXVvdDt2bV9wYWRkcl90IHRvbyBiaWcgZm9yIGZmc2xsLCBmbHNsbC4mcXVvdDspOzxicj4NCjxi cj4NCsKgI2lmZGVmIE5VTUE8YnI+DQrCoHN0cnVjdCBtZW1fYWZmaW5pdHkgX19yZWFkX21vc3Rs eSAqbWVtX2FmZmluaXR5Ozxicj4NCkBAIC02OTAsMTggKzY5MiwxNiBAQCB2bV9waHlzX3NwbGl0 X3BhZ2VzKHZtX3BhZ2VfdCBtLCBpbnQgb2luZCwgc3RydWN0IHZtX2ZyZWVsaXN0ICpmbCwgaW50 IG9yZGVyLDxicj4NCsKgICo8YnI+DQrCoCAqIFRoZSBwaHlzaWNhbCBwYWdlIG0mIzM5O3MgYnVk ZHkgbXVzdCBub3QgYmUgZnJlZS48YnI+DQrCoCAqLzxicj4NCi1zdGF0aWMgdm9pZDxicj4NCitz dGF0aWMgdm1fcGFnZV90PGJyPg0KwqB2bV9waHlzX2VucV9yYW5nZSh2bV9wYWdlX3QgbSwgdV9p bnQgbnBhZ2VzLCBzdHJ1Y3Qgdm1fZnJlZWxpc3QgKmZsLCBpbnQgdGFpbCk8YnI+DQrCoHs8YnI+ DQotwqAgwqAgwqAgwqB1X2ludCBuOzxicj4NCsKgIMKgIMKgIMKgIGludCBvcmRlcjs8YnI+DQo8 YnI+DQotwqAgwqAgwqAgwqBLQVNTRVJUKG5wYWdlcyAmZ3Q7IDAsICgmcXVvdDt2bV9waHlzX2Vu cV9yYW5nZTogbnBhZ2VzIGlzIDAmcXVvdDspKTs8YnI+DQrCoCDCoCDCoCDCoCBLQVNTRVJUKCgo Vk1fUEFHRV9UT19QSFlTKG0pICsgbnBhZ2VzICogUEFHRV9TSVpFKSAmYW1wOzxicj4NCsKgIMKg IMKgIMKgIMKgIMKgICgoUEFHRV9TSVpFICZsdDsmbHQ7IChmbHMobnBhZ2VzKSAtIDEpKSAtIDEp KSA9PSAwLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgICgmcXVvdDt2bV9waHlzX2VucV9yYW5nZTog cGFnZSAlcCBhbmQgbnBhZ2VzICV1IGFyZSBtaXNhbGlnbmVkJnF1b3Q7LDxicj4NCsKgIMKgIMKg IMKgIMKgIMKgIG0sIG5wYWdlcykpOzxicj4NCi3CoCDCoCDCoCDCoGRvIHs8YnI+DQorwqAgwqAg wqAgwqB3aGlsZSAobnBhZ2VzICZndDsgMCkgezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IEtBU1NFUlQobS0mZ3Q7b3JkZXIgPT0gVk1fTkZSRUVPUkRFUiw8YnI+DQrCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCAoJnF1b3Q7dm1fcGh5c19lbnFfcmFuZ2U6IHBhZ2UgJXAgaGFzIHVu ZXhwZWN0ZWQgb3JkZXIgJWQmcXVvdDssPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgbSwgbS0mZ3Q7b3JkZXIpKTs8YnI+DQpAQCAtNzA5LDEwICs3MDksMTAgQEAgdm1fcGh5c19l bnFfcmFuZ2Uodm1fcGFnZV90IG0sIHVfaW50IG5wYWdlcywgc3RydWN0IHZtX2ZyZWVsaXN0ICpm bCwgaW50IHRhaWwpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgS0FTU0VSVChvcmRlciAm bHQ7IFZNX05GUkVFT1JERVIsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKCZx dW90O3ZtX3BoeXNfZW5xX3JhbmdlOiBvcmRlciAlZCBpcyBvdXQgb2YgcmFuZ2UmcXVvdDssIG9y ZGVyKSk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgdm1fZnJlZWxpc3RfYWRkKGZsLCBt LCBvcmRlciwgdGFpbCk7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgbiA9IDEgJmx0OyZs dDsgb3JkZXI7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgbSArPSBuOzxicj4NCi3CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoG5wYWdlcyAtPSBuOzxicj4NCi3CoCDCoCDCoCDCoH0gd2hpbGUg KG5wYWdlcyAmZ3Q7IDApOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG0gKz0gMSAmbHQ7 Jmx0OyBvcmRlcjs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBucGFnZXMgLT0gMSAmbHQ7 Jmx0OyBvcmRlcjs8YnI+DQorwqAgwqAgwqAgwqB9PGJyPg0KK8KgIMKgIMKgIMKgcmV0dXJuICht KTs8YnI+DQrCoH08YnI+DQo8YnI+DQrCoC8qPGJyPg0KQEAgLTc0NCw3ICs3NDQsNyBAQCB2bV9w aHlzX2FsbG9jX25wYWdlcyhpbnQgZG9tYWluLCBpbnQgcG9vbCwgaW50IG5wYWdlcywgdm1fcGFn ZV90IG1hW10pPGJyPg0KwqB7PGJyPg0KwqAgwqAgwqAgwqAgc3RydWN0IHZtX2ZyZWVsaXN0ICph bHQsICpmbDs8YnI+DQrCoCDCoCDCoCDCoCB2bV9wYWdlX3QgbTs8YnI+DQotwqAgwqAgwqAgwqBp bnQgYXZhaWwsIGVuZCwgZmxpbmQsIGZyZWVsaXN0LCBpLCBuZWVkLCBvaW5kLCBwaW5kOzxicj4N CivCoCDCoCDCoCDCoGludCBhdmFpbCwgZW5kLCBmbGluZCwgZnJlZWxpc3QsIGksIG9pbmQsIHBp bmQ7PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgS0FTU0VSVChkb21haW4gJmd0Oz0gMCAmYW1wOyZh bXA7IGRvbWFpbiAmbHQ7IHZtX25kb21haW5zLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgICgmcXVv dDt2bV9waHlzX2FsbG9jX25wYWdlczogZG9tYWluICVkIGlzIG91dCBvZiByYW5nZSZxdW90Oywg ZG9tYWluKSk7PGJyPg0KQEAgLTc2MiwyMCArNzYyLDE4IEBAIHZtX3BoeXNfYWxsb2NfbnBhZ2Vz KGludCBkb21haW4sIGludCBwb29sLCBpbnQgbnBhZ2VzLCB2bV9wYWdlX3QgbWFbXSk8YnI+DQrC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBmb3IgKG9pbmQgPSAwOyBvaW5kICZsdDsgVk1fTkZSRUVP UkRFUjsgb2luZCsrKSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg d2hpbGUgKChtID0gVEFJTFFfRklSU1QoJmFtcDtmbFtvaW5kXS5wbCkpICE9IE5VTEwpIHs8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB2bV9mcmVl bGlzdF9yZW0oZmwsIG0sIG9pbmQpOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoGF2YWlsID0gMSAmbHQ7Jmx0OyBvaW5kOzxicj4NCi3CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG5lZWQgPSBpbWluKG5wYWdl cyAtIGksIGF2YWlsKTs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBmb3IgKGVuZCA9IGkgKyBuZWVkOyBpICZsdDsgZW5kOyk8YnI+DQorwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBhdmFpbCA9IGkgKyAoMSAm bHQ7Jmx0OyBvaW5kKTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBlbmQgPSBpbWluKG5wYWdlcywgYXZhaWwpOzxicj4NCivCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHdoaWxlIChpICZsdDsgZW5kKTxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIG1hW2krK10gPSBtKys7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgaWYgKG5lZWQgJmx0OyBhdmFpbCkgezxicj4NCivCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChpID09IG5wYWdlcykgezxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIC8qPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgICogUmV0dXJuIGV4Y2VzcyBwYWdlcyB0byBmbC7CoCBJdHM8YnI+DQot wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgKiBvcmRlciBbMCwgb2luZCkgcXVldWVzIGFyZSBlbXB0eS48YnI+DQorwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKiBSZXR1cm4g ZXhjZXNzIHBhZ2VzIHRvIGZsLsKgIEl0cyBvcmRlcjxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAqIFswLCBvaW5kKSBxdWV1 ZXMgYXJlIGVtcHR5Ljxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKi88YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB2bV9waHlzX2VucV9yYW5nZShtLCBh dmFpbCAtIG5lZWQsIGZsLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDEpOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJldHVybiAobnBhZ2Vz KTs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9 IGVsc2UgaWYgKGkgPT0gbnBhZ2VzKTxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHZtX3BoeXNfZW5xX3JhbmdlKG0sIGF2YWls IC0gaSwgZmwsIDEpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJldHVybiAobnBhZ2VzKTs8YnI+DQorwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9PGJyPg0KwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgfTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIH08YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBmb3IgKG9pbmQgPSBWTV9ORlJFRU9SREVSIC0gMTsg b2luZCAmZ3Q7PSAwOyBvaW5kLS0pIHs8YnI+DQpAQCAtNzg1LDIxICs3ODMsMjAgQEAgdm1fcGh5 c19hbGxvY19ucGFnZXMoaW50IGRvbWFpbiwgaW50IHBvb2wsIGludCBucGFnZXMsIHZtX3BhZ2Vf dCBtYVtdKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIE5VTEwpIHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB2bV9mcmVlbGlzdF9yZW0oYWx0LCBtLCBvaW5kKTs8 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCB2bV9waHlzX3NldF9wb29sKHBvb2wsIG0sIG9pbmQpOzxicj4NCi3CoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGF2YWlsID0g MSAmbHQ7Jmx0OyBvaW5kOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG5lZWQgPSBpbWluKG5wYWdlcyAtIGksIGF2YWlsKTs8 YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBmb3IgKGVuZCA9IGkgKyBuZWVkOyBpICZsdDsgZW5kOyk8YnI+DQorwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBhdmFpbCA9 IGkgKyAoMSAmbHQ7Jmx0OyBvaW5kKTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBlbmQgPSBpbWluKG5wYWdlcywgYXZhaWwp Ozxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoHdoaWxlIChpICZsdDsgZW5kKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG1hW2krK10g PSBtKys7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgaWYgKG5lZWQgJmx0OyBhdmFpbCkgezxicj4NCivCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChpID09IG5w YWdlcykgezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIC8qPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAqIFJl dHVybiBleGNlc3MgcGFnZXMgdG8gZmwuPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAqIEl0cyBvcmRl ciBbMCwgb2luZCkgcXVldWVzPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAqIGFyZSBlbXB0eS48YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCovPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdm1fcGh5c19lbnFfcmFu Z2UobSwgYXZhaWwgLTxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG5lZWQsIGZsLCAxKTs8YnI+ DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqByZXR1cm4gKG5wYWdlcyk7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfSBlbHNlIGlmIChpID09 IG5wYWdlcyk8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB2bV9waHlzX2VucV9yYW5nZShtLCBhdmFpbCAt IGksPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZmwsIDEpOzxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IHJldHVybiAobnBhZ2VzKTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgfTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIH08YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB9PGJyPg0KQEAgLTExNDYs NyArMTE0Myw3IEBAIG1heF9vcmRlcih2bV9wYWdlX3QgbSk8YnI+DQrCoCDCoCDCoCDCoCDCoCog YmVjYXVzZSB0aGUgc2l6ZSBvZiBhIHBoeXNpY2FsIGFkZHJlc3MgZXhjZWVkcyB0aGUgc2l6ZSBv Zjxicj4NCsKgIMKgIMKgIMKgIMKgKiBhIGxvbmcuPGJyPg0KwqAgwqAgwqAgwqAgwqAqLzxicj4N Ci3CoCDCoCDCoCDCoHJldHVybiAobWluKGZmc2woVk1fUEFHRV9UT19QSFlTKG0pICZndDsmZ3Q7 IFBBR0VfU0hJRlQpIC0gMSw8YnI+DQorwqAgwqAgwqAgwqByZXR1cm4gKG1pbihmZnNsbChWTV9Q QUdFX1RPX1BIWVMobSkgJmd0OyZndDsgUEFHRV9TSElGVCkgLSAxLDxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIFZNX05GUkVFT1JERVIgLSAxKSk7PGJyPg0KwqB9PGJyPg0KPGJyPg0KQEAgLTExNjIs NiArMTE1OSw3IEBAIHZtX3BoeXNfZW5xdWV1ZV9jb250aWcodm1fcGFnZV90IG0sIHVfbG9uZyBu cGFnZXMpPGJyPg0KwqAgwqAgwqAgwqAgc3RydWN0IHZtX2ZyZWVsaXN0ICpmbDs8YnI+DQrCoCDC oCDCoCDCoCBzdHJ1Y3Qgdm1fcGh5c19zZWcgKnNlZzs8YnI+DQrCoCDCoCDCoCDCoCB2bV9wYWdl X3QgbV9lbmQ7PGJyPg0KK8KgIMKgIMKgIMKgdm1fcGFkZHJfdCBkaWZmLCBsbzs8YnI+DQrCoCDC oCDCoCDCoCBpbnQgb3JkZXI7PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgLyo8YnI+DQpAQCAtMTE3 MywxNSArMTE3MSwxNSBAQCB2bV9waHlzX2VucXVldWVfY29udGlnKHZtX3BhZ2VfdCBtLCB1X2xv bmcgbnBhZ2VzKTxicj4NCsKgIMKgIMKgIMKgIGZsID0gKCpzZWctJmd0O2ZyZWVfcXVldWVzKVtt LSZndDtwb29sXTs8YnI+DQrCoCDCoCDCoCDCoCBtX2VuZCA9IG0gKyBucGFnZXM7PGJyPg0KwqAg wqAgwqAgwqAgLyogRnJlZSBibG9ja3Mgb2YgaW5jcmVhc2luZyBzaXplLiAqLzxicj4NCi3CoCDC oCDCoCDCoHdoaWxlICgob3JkZXIgPSBtYXhfb3JkZXIobSkpICZsdDsgVk1fTkZSRUVPUkRFUiAt IDEgJmFtcDsmYW1wOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoG0gKyAoMSAmbHQ7Jmx0OyBvcmRl cikgJmx0Oz0gbV9lbmQpIHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBLQVNTRVJUKHNl ZyA9PSAmYW1wO3ZtX3BoeXNfc2Vnc1ttLSZndDtzZWdpbmRdLDxicj4NCi3CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCgmcXVvdDslczogcGFnZSByYW5nZSBbJXAsJXApIHNwYW5zIG11bHRp cGxlIHNlZ21lbnRzJnF1b3Q7LDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoF9f ZnVuY19fLCBtX2VuZCAtIG5wYWdlcywgbSkpOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oHZtX2ZyZWVsaXN0X2FkZChmbCwgbSwgb3JkZXIsIDEpOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoG0gKz0gMSAmbHQ7Jmx0OyBvcmRlcjs8YnI+DQorwqAgwqAgwqAgwqBsbyA9IFZNX1BB R0VfVE9fUEhZUyhtKSAmZ3Q7Jmd0OyBQQUdFX1NISUZUOzxicj4NCivCoCDCoCDCoCDCoGlmICht ICZsdDsgbV9lbmQgJmFtcDsmYW1wOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoChkaWZmID0gbG8g XiAobG8gKyBucGFnZXMgLSAxKSkgIT0gMCkgezxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oG9yZGVyID0gbWluKGZsc2xsKGRpZmYpIC0gMSwgVk1fTkZSRUVPUkRFUiAtIDEpOzxicj4NCivC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoG0gPSB2bV9waHlzX2VucV9yYW5nZShtLCByb3VuZHVwMigt bG8sIDEgJmx0OyZsdDsgb3JkZXIpLCBmbCwgMSk7PGJyPg0KwqAgwqAgwqAgwqAgfTxicj4NCis8 YnI+DQrCoCDCoCDCoCDCoCAvKiBGcmVlIGJsb2NrcyBvZiBtYXhpbXVtIHNpemUuICovPGJyPg0K K8KgIMKgIMKgIMKgb3JkZXIgPSBWTV9ORlJFRU9SREVSIC0gMTs8YnI+DQrCoCDCoCDCoCDCoCB3 aGlsZSAobSArICgxICZsdDsmbHQ7IG9yZGVyKSAmbHQ7PSBtX2VuZCkgezxicj4NCsKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIEtBU1NFUlQoc2VnID09ICZhbXA7dm1fcGh5c19zZWdzW20tJmd0O3Nl Z2luZF0sPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKCZxdW90OyVzOiBwYWdl IHJhbmdlIFslcCwlcCkgc3BhbnMgbXVsdGlwbGUgc2VnbWVudHMmcXVvdDssPGJyPg0KQEAgLTE1 NjAsMTAgKzE1NTgsOCBAQCB2bV9waHlzX2FsbG9jX2NvbnRpZyhpbnQgZG9tYWluLCB1X2xvbmcg bnBhZ2VzLCB2bV9wYWRkcl90IGxvdywgdm1fcGFkZHJfdCBoaWdoLDxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHZtX3BoeXNfc2V0X3Bvb2woVk1fRlJFRVBPT0xfREVG QVVMVCwgbSwgb2luZCk7PGJyPg0KwqAgwqAgwqAgwqAgfTxicj4NCsKgIMKgIMKgIMKgIC8qIFJl dHVybiBleGNlc3MgcGFnZXMgdG8gdGhlIGZyZWUgbGlzdHMuICovPGJyPg0KLcKgIMKgIMKgIMKg aWYgKCZhbXA7bV9ydW5bbnBhZ2VzXSAmbHQ7IG0pIHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBmbCA9ICgqcXVldWVzKVtWTV9GUkVFUE9PTF9ERUZBVUxUXTs8YnI+DQotwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqB2bV9waHlzX2VucV9yYW5nZSgmYW1wO21fcnVuW25wYWdlc10sIG0gLSAm YW1wO21fcnVuW25wYWdlc10sIGZsLCAwKTs8YnI+DQotwqAgwqAgwqAgwqB9PGJyPg0KK8KgIMKg IMKgIMKgZmwgPSAoKnF1ZXVlcylbVk1fRlJFRVBPT0xfREVGQVVMVF07PGJyPg0KK8KgIMKgIMKg IMKgdm1fcGh5c19lbnFfcmFuZ2UoJmFtcDttX3J1bltucGFnZXNdLCBtIC0gJmFtcDttX3J1bltu cGFnZXNdLCBmbCwgMCk7PGJyPg0KwqAgwqAgwqAgwqAgcmV0dXJuIChtX3J1bik7PGJyPg0KwqB9 PGJyPg0KPGJyPg0KPC9ibG9ja3F1b3RlPjwvZGl2PjwvZGl2Pg0K --000000000000675be50601ec45f2--