220 25266 <nchmqn$qv3$1@ger.gmane.org> article
Path: news.gmane.org!not-for-mail
From: Matthew Woehlke <mwoehlke.floss@gmail.com>
Newsgroups: gmane.comp.lang.c++.isocpp.proposals
Subject: Re: [RFC] Call for considering "the big picture" re:
 tuples and parameter packs
Date: Fri, 18 Mar 2016 16:01:26 -0400
Lines: 1264
Approved: news@gmane.org
Message-ID: <nchmqn$qv3$1@ger.gmane.org>
References: <nch85i$8ob$1@ger.gmane.org> <f8b6c0ca-6e91-490f-b301-1cfb7b8a5179@isocpp.org> <nchfd7$4r4$1@ger.gmane.org> <0c6bf477-1d55-47ed-9ef7-3f4ef1b83199@isocpp.org>
Reply-To: std-proposals@isocpp.org
NNTP-Posting-Host: plane.gmane.org
Mime-Version: 1.0
Content-Type: multipart/mixed;
 boundary="------------060305020907090604080801"
X-Trace: ger.gmane.org 1458331312 28102 80.91.229.3 (18 Mar 2016 20:01:52 GMT)
X-Complaints-To: usenet@ger.gmane.org
NNTP-Posting-Date: Fri, 18 Mar 2016 20:01:52 +0000 (UTC)
To: std-proposals@isocpp.org
Original-X-From: std-proposals+bncBC37LBFWUIFBBI55WG3QKGQEUM53PLQ@isocpp.org Fri Mar 18 21:01:42 2016
Return-path: <std-proposals+bncBC37LBFWUIFBBI55WG3QKGQEUM53PLQ@isocpp.org>
Envelope-to: gclcip-std-proposals@m.gmane.org
Original-Received: from mail-lf0-f70.google.com ([209.85.215.70])
	by plane.gmane.org with esmtp (Exim 4.69)
	(envelope-from <std-proposals+bncBC37LBFWUIFBBI55WG3QKGQEUM53PLQ@isocpp.org>)
	id 1ah0aa-00078M-Kx
	for gclcip-std-proposals@m.gmane.org; Fri, 18 Mar 2016 21:01:40 +0100
Original-Received: by mail-lf0-f70.google.com with SMTP id c190sf10476943lfe.1
        for <gclcip-std-proposals@m.gmane.org>; Fri, 18 Mar 2016 13:01:40 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=isocpp-org.20150623.gappssmtp.com; s=20150623;
        h=to:from:subject:date:lines:message-id:references:mime-version
         :user-agent:in-reply-to:x-original-sender
         :x-original-authentication-results:reply-to:precedence:mailing-list
         :list-id:x-spam-checked-in-group:list-post:list-help:list-archive
         :list-subscribe:list-unsubscribe;
        bh=5S4KxjUyDsm1IoVbkAkCdy74tGpLWu7DUdVDQVoIo5s=;
        b=WjIvN9jfYO0sT9FhM9y+B/5Xb+GLT9ndAbW2YaWw4KAYfUKQ1YRDTKEWDHfY/EuCuK
         tzopGaK0TxcySClEGpZLhXE7DPLxW+gr1aLfinLPLdPH3e9tZch+T/TM1Vk2dbqlwmEr
         26Hmct4ONhhzgnbvJICRevkX59OXUOAWwC0FvpJhWZdXLfmtYSu5kWyjp2DGkgnHDr3K
         RQsBk4hPERHwOgyXg48YPbOBZfGNwjYosJWorzF15knu32fIaSUugkkV/YJZ4dB8pm/A
         jAssWrl8ZdbCerT9n+h+gYAEOqm4BLkgZ9G61/LczP9Jq8ja2/pMDRI/dllTs9v8YWWp
         aGfw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=1e100.net; s=20130820;
        h=x-gm-message-state:to:from:subject:date:lines:message-id:references
         :mime-version:user-agent:in-reply-to:x-original-sender
         :x-original-authentication-results:reply-to:precedence:mailing-list
         :list-id:x-spam-checked-in-group:list-post:list-help:list-archive
         :list-subscribe:list-unsubscribe;
        bh=5S4KxjUyDsm1IoVbkAkCdy74tGpLWu7DUdVDQVoIo5s=;
        b=IInkjutY0QtzP1NF62cExn/zL+tsnutnaWWcG0VrFBsR2ucmOhUXsQPDQjoE6M/Xgb
         OTEHIHo7BVo8dMj4WPv2WDaPKosx09UNOUeHtARhjdPQi/wmBOqLIjMwwpt4d031enu6
         jRWIJpKaVHZeoXlBKo21JYKtEtjvgxu+lQAEWpxsxXvZ+RuQONYYp9lVCjb15unZKafa
         1bCNqQ4d+/aHr6l8V4sgx9Q/fgtTGLX81KGkskWojhcPI8fotC7y+ZaFu8nimDFdE/ZT
         KhtUTYUwfgiASr3UEWxW//nuYnPXFMxpoReL8slSho1QgpLHDtaOTPf6kM1PcTeQlNsY
         BvGg==
X-Gm-Message-State: AD7BkJKutnOXR5wc5p3vugfp6M2zp9Dy2nxsyCS5OeQvPe8ppBMZcqeym49zLpwEcsREyA==
X-Received: by 10.112.219.68 with SMTP id pm4mr2527696lbc.18.1458331300051;
        Fri, 18 Mar 2016 13:01:40 -0700 (PDT)
X-BeenThere: std-proposals@isocpp.org
Original-Received: by 10.25.138.8 with SMTP id m8ls539536lfd.21.gmail; Fri, 18 Mar 2016
 13:01:38 -0700 (PDT)
X-Received: by 10.25.43.20 with SMTP id r20mr6606954lfr.30.1458331298477;
        Fri, 18 Mar 2016 13:01:38 -0700 (PDT)
Original-Received: from plane.gmane.org (plane.gmane.org. [80.91.229.3])
        by mx.google.com with ESMTPS id ro2si7302787lbb.76.2016.03.18.13.01.38
        for <std-proposals@isocpp.org>
        (version=TLS1 cipher=AES128-SHA bits=128/128);
        Fri, 18 Mar 2016 13:01:38 -0700 (PDT)
Received-SPF: pass (google.com: domain of gclcip-std-proposals@m.gmane.org designates 80.91.229.3 as permitted sender) client-ip=80.91.229.3;
Original-Received: from list by plane.gmane.org with local (Exim 4.69)
	(envelope-from <gclcip-std-proposals@m.gmane.org>)
	id 1ah0aW-00076J-LP
	for std-proposals@isocpp.org; Fri, 18 Mar 2016 21:01:36 +0100
Original-Received: from tripoint.kitware.com ([66.194.253.20])
        by main.gmane.org with esmtp (Gmexim 0.1 (Debian))
        id 1AlnuQ-0007hv-00
        for <std-proposals@isocpp.org>; Fri, 18 Mar 2016 21:01:36 +0100
Original-Received: from mwoehlke.floss by tripoint.kitware.com with local (Gmexim 0.1 (Debian))
        id 1AlnuQ-0007hv-00
        for <std-proposals@isocpp.org>; Fri, 18 Mar 2016 21:01:36 +0100
X-Injected-Via-Gmane: http://gmane.org/
Original-Lines: 1257
Original-X-Complaints-To: usenet@ger.gmane.org
X-Gmane-NNTP-Posting-Host: tripoint.kitware.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0
In-Reply-To: <0c6bf477-1d55-47ed-9ef7-3f4ef1b83199@isocpp.org>
X-Original-Sender: mwoehlke.floss@gmail.com
X-Original-Authentication-Results: mx.google.com;       spf=pass (google.com:
 domain of gclcip-std-proposals@m.gmane.org designates 80.91.229.3 as
 permitted sender) smtp.mailfrom=gclcip-std-proposals@m.gmane.org;
       dmarc=fail (p=NONE dis=NONE) header.from=gmail.com
Precedence: list
Mailing-list: list std-proposals@isocpp.org; contact std-proposals+owners@isocpp.org
List-ID: <std-proposals.isocpp.org>
X-Spam-Checked-In-Group: std-proposals@isocpp.org
X-Google-Group-Id: 399137483710
List-Post: <https://groups.google.com/a/isocpp.org/group/std-proposals/post>, <mailto:std-proposals@isocpp.org>
List-Help: <https://support.google.com/a/isocpp.org/bin/topic.py?topic=25838>, <mailto:std-proposals+help@isocpp.org>
List-Archive: <https://groups.google.com/a/isocpp.org/group/std-proposals/>
List-Subscribe: <https://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>,
 <mailto:std-proposals+subscribe@isocpp.org>
List-Unsubscribe: <mailto:googlegroups-manage+399137483710+unsubscribe@googlegroups.com>,
 <https://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>
Xref: news.gmane.org gmane.comp.lang.c++.isocpp.proposals:25266
Archived-At: <http://permalink.gmane.org/gmane.comp.lang.c++.isocpp.proposals/25266>

This is a multi-part message in MIME format.
--------------060305020907090604080801
Content-Type: text/plain; charset=UTF-8

On 2016-03-18 14:50, barry.revzin@gmail.com wrote:
>> Anyway, this is highly off topic. The paper isn't proposing this 
>> feature, it's outlining a vision for where we might be going. If you're 
>> getting hung up on syntax points, you have *WILDLY MISSED* the point of 
>> the paper. 
> 
> The paper reads very much like you are proposing prefix operator[] to 
> handle indexing and slicing parameter packs.

I'm "proposing" that indexing and slicing tuples and parameter packs are
"interesting features"... and to some extent, encouraging that they
should all have the same syntax. What form that syntax takes is a
secondary point, and this paper is *not* the proposal to add such a syntax.

Did you *read* the background and/or summary sections? (Or the
unification section, for that matter?) I've tried very hard to make the
intent clear. If you can suggest a way to do that better, without going
*too* abstract in the sections looking at where we might be going, that
would be appreciated.

Updates attached; maybe the changes will help... (I've tried to reduce
the ratio of "teaser" to important content.)

> That's what all of the code fragments use.

(new) "we urge the reader to keep in mind that syntax shown is used in
this context only as a tool to communicate examples of the future
feature space"

> I don't know how else to interpret this paper other than the 
> vision that you're outlining is prefix operator[]. 

(original) "this paper is [...meant as] a recommendation for areas which
we feel need to be explored, and in particular, considered by other
proposals being put forward"

-- 
Matthew

-- 
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/nchmqn%24qv3%241%40ger.gmane.org.

--------------060305020907090604080801
Content-Type: text/html; charset=UTF-8;
 name="dxxxx-tuple-like-unified-vision.html"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="dxxxx-tuple-like-unified-vision.html"

PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjwhRE9DVFlQRSBodG1s
IFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRw
Oi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4K
PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJl
biIgbGFuZz0iZW4iPgo8aGVhZD4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBj
b250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CjxtZXRhIG5hbWU9ImdlbmVy
YXRvciIgY29udGVudD0iRG9jdXRpbHMgMC4xMTogaHR0cDovL2RvY3V0aWxzLnNvdXJjZWZv
cmdlLm5ldC8iIC8+Cjx0aXRsZT5BIFVuaWZpZWQgVmlzaW9uIGZvciBNYW5pcHVsYXRpbmcg
VHVwbGUtbGlrZSBPYmplY3RzPC90aXRsZT4KPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0i
MjAxNi0wMy0xOCIgLz4KPG1ldGEgbmFtZT0iYXV0aG9yIiBjb250ZW50PSJNYXR0aGV3IFdv
ZWhsa2UgKG13b2VobGtlLmZsb3NzJiM2NDtnbWFpbC5jb20pIiAvPgo8c3R5bGUgdHlwZT0i
dGV4dC9jc3MiPgoKLyoKOkF1dGhvcjogRGF2aWQgR29vZGdlciAoZ29vZGdlckBweXRob24u
b3JnKQo6SWQ6ICRJZDogaHRtbDRjc3MxLmNzcyA3NjE0IDIwMTMtMDItMjEgMTU6NTU6NTFa
IG1pbGRlICQKOkNvcHlyaWdodDogVGhpcyBzdHlsZXNoZWV0IGhhcyBiZWVuIHBsYWNlZCBp
biB0aGUgcHVibGljIGRvbWFpbi4KCkRlZmF1bHQgY2FzY2FkaW5nIHN0eWxlIHNoZWV0IGZv
ciB0aGUgSFRNTCBvdXRwdXQgb2YgRG9jdXRpbHMuCgpTZWUgaHR0cDovL2RvY3V0aWxzLnNm
Lm5ldC9kb2NzL2hvd3RvL2h0bWwtc3R5bGVzaGVldHMuaHRtbCBmb3IgaG93IHRvCmN1c3Rv
bWl6ZSB0aGlzIHN0eWxlIHNoZWV0LgoqLwoKLyogdXNlZCB0byByZW1vdmUgYm9yZGVycyBm
cm9tIHRhYmxlcyBhbmQgaW1hZ2VzICovCi5ib3JkZXJsZXNzLCB0YWJsZS5ib3JkZXJsZXNz
IHRkLCB0YWJsZS5ib3JkZXJsZXNzIHRoIHsKICBib3JkZXI6IDAgfQoKdGFibGUuYm9yZGVy
bGVzcyB0ZCwgdGFibGUuYm9yZGVybGVzcyB0aCB7CiAgLyogT3ZlcnJpZGUgcGFkZGluZyBm
b3IgInRhYmxlLmRvY3V0aWxzIHRkIiB3aXRoICIhIGltcG9ydGFudCIuCiAgICAgVGhlIHJp
Z2h0IHBhZGRpbmcgc2VwYXJhdGVzIHRoZSB0YWJsZSBjZWxscy4gKi8KICBwYWRkaW5nOiAw
IDAuNWVtIDAgMCAhIGltcG9ydGFudCB9CgouZmlyc3QgewogIC8qIE92ZXJyaWRlIG1vcmUg
c3BlY2lmaWMgbWFyZ2luIHN0eWxlcyB3aXRoICIhIGltcG9ydGFudCIuICovCiAgbWFyZ2lu
LXRvcDogMCAhIGltcG9ydGFudCB9CgoubGFzdCwgLndpdGgtc3VidGl0bGUgewogIG1hcmdp
bi1ib3R0b206IDAgISBpbXBvcnRhbnQgfQoKLmhpZGRlbiB7CiAgZGlzcGxheTogbm9uZSB9
CgphLnRvYy1iYWNrcmVmIHsKICB0ZXh0LWRlY29yYXRpb246IG5vbmUgOwogIGNvbG9yOiBi
bGFjayB9CgpibG9ja3F1b3RlLmVwaWdyYXBoIHsKICBtYXJnaW46IDJlbSA1ZW0gOyB9Cgpk
bC5kb2N1dGlscyBkZCB7CiAgbWFyZ2luLWJvdHRvbTogMC41ZW0gfQoKb2JqZWN0W3R5cGU9
ImltYWdlL3N2Zyt4bWwiXSwgb2JqZWN0W3R5cGU9ImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZl
LWZsYXNoIl0gewogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi8qIFVuY29tbWVudCAoYW5kIHJl
bW92ZSB0aGlzIHRleHQhKSB0byBnZXQgYm9sZC1mYWNlZCBkZWZpbml0aW9uIGxpc3QgdGVy
bXMKZGwuZG9jdXRpbHMgZHQgewogIGZvbnQtd2VpZ2h0OiBib2xkIH0KKi8KCmRpdi5hYnN0
cmFjdCB7CiAgbWFyZ2luOiAyZW0gNWVtIH0KCmRpdi5hYnN0cmFjdCBwLnRvcGljLXRpdGxl
IHsKICBmb250LXdlaWdodDogYm9sZCA7CiAgdGV4dC1hbGlnbjogY2VudGVyIH0KCmRpdi5h
ZG1vbml0aW9uLCBkaXYuYXR0ZW50aW9uLCBkaXYuY2F1dGlvbiwgZGl2LmRhbmdlciwgZGl2
LmVycm9yLApkaXYuaGludCwgZGl2LmltcG9ydGFudCwgZGl2Lm5vdGUsIGRpdi50aXAsIGRp
di53YXJuaW5nIHsKICBtYXJnaW46IDJlbSA7CiAgYm9yZGVyOiBtZWRpdW0gb3V0c2V0IDsK
ICBwYWRkaW5nOiAxZW0gfQoKZGl2LmFkbW9uaXRpb24gcC5hZG1vbml0aW9uLXRpdGxlLCBk
aXYuaGludCBwLmFkbW9uaXRpb24tdGl0bGUsCmRpdi5pbXBvcnRhbnQgcC5hZG1vbml0aW9u
LXRpdGxlLCBkaXYubm90ZSBwLmFkbW9uaXRpb24tdGl0bGUsCmRpdi50aXAgcC5hZG1vbml0
aW9uLXRpdGxlIHsKICBmb250LXdlaWdodDogYm9sZCA7CiAgZm9udC1mYW1pbHk6IHNhbnMt
c2VyaWYgfQoKZGl2LmF0dGVudGlvbiBwLmFkbW9uaXRpb24tdGl0bGUsIGRpdi5jYXV0aW9u
IHAuYWRtb25pdGlvbi10aXRsZSwKZGl2LmRhbmdlciBwLmFkbW9uaXRpb24tdGl0bGUsIGRp
di5lcnJvciBwLmFkbW9uaXRpb24tdGl0bGUsCmRpdi53YXJuaW5nIHAuYWRtb25pdGlvbi10
aXRsZSwgLmNvZGUgLmVycm9yIHsKICBjb2xvcjogcmVkIDsKICBmb250LXdlaWdodDogYm9s
ZCA7CiAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWYgfQoKLyogVW5jb21tZW50IChhbmQgcmVt
b3ZlIHRoaXMgdGV4dCEpIHRvIGdldCByZWR1Y2VkIHZlcnRpY2FsIHNwYWNlIGluCiAgIGNv
bXBvdW5kIHBhcmFncmFwaHMuCmRpdi5jb21wb3VuZCAuY29tcG91bmQtZmlyc3QsIGRpdi5j
b21wb3VuZCAuY29tcG91bmQtbWlkZGxlIHsKICBtYXJnaW4tYm90dG9tOiAwLjVlbSB9Cgpk
aXYuY29tcG91bmQgLmNvbXBvdW5kLWxhc3QsIGRpdi5jb21wb3VuZCAuY29tcG91bmQtbWlk
ZGxlIHsKICBtYXJnaW4tdG9wOiAwLjVlbSB9CiovCgpkaXYuZGVkaWNhdGlvbiB7CiAgbWFy
Z2luOiAyZW0gNWVtIDsKICB0ZXh0LWFsaWduOiBjZW50ZXIgOwogIGZvbnQtc3R5bGU6IGl0
YWxpYyB9CgpkaXYuZGVkaWNhdGlvbiBwLnRvcGljLXRpdGxlIHsKICBmb250LXdlaWdodDog
Ym9sZCA7CiAgZm9udC1zdHlsZTogbm9ybWFsIH0KCmRpdi5maWd1cmUgewogIG1hcmdpbi1s
ZWZ0OiAyZW0gOwogIG1hcmdpbi1yaWdodDogMmVtIH0KCmRpdi5mb290ZXIsIGRpdi5oZWFk
ZXIgewogIGNsZWFyOiBib3RoOwogIGZvbnQtc2l6ZTogc21hbGxlciB9CgpkaXYubGluZS1i
bG9jayB7CiAgZGlzcGxheTogYmxvY2sgOwogIG1hcmdpbi10b3A6IDFlbSA7CiAgbWFyZ2lu
LWJvdHRvbTogMWVtIH0KCmRpdi5saW5lLWJsb2NrIGRpdi5saW5lLWJsb2NrIHsKICBtYXJn
aW4tdG9wOiAwIDsKICBtYXJnaW4tYm90dG9tOiAwIDsKICBtYXJnaW4tbGVmdDogMS41ZW0g
fQoKZGl2LnNpZGViYXIgewogIG1hcmdpbjogMCAwIDAuNWVtIDFlbSA7CiAgYm9yZGVyOiBt
ZWRpdW0gb3V0c2V0IDsKICBwYWRkaW5nOiAxZW0gOwogIGJhY2tncm91bmQtY29sb3I6ICNm
ZmZmZWUgOwogIHdpZHRoOiA0MCUgOwogIGZsb2F0OiByaWdodCA7CiAgY2xlYXI6IHJpZ2h0
IH0KCmRpdi5zaWRlYmFyIHAucnVicmljIHsKICBmb250LWZhbWlseTogc2Fucy1zZXJpZiA7
CiAgZm9udC1zaXplOiBtZWRpdW0gfQoKZGl2LnN5c3RlbS1tZXNzYWdlcyB7CiAgbWFyZ2lu
OiA1ZW0gfQoKZGl2LnN5c3RlbS1tZXNzYWdlcyBoMSB7CiAgY29sb3I6IHJlZCB9CgpkaXYu
c3lzdGVtLW1lc3NhZ2UgewogIGJvcmRlcjogbWVkaXVtIG91dHNldCA7CiAgcGFkZGluZzog
MWVtIH0KCmRpdi5zeXN0ZW0tbWVzc2FnZSBwLnN5c3RlbS1tZXNzYWdlLXRpdGxlIHsKICBj
b2xvcjogcmVkIDsKICBmb250LXdlaWdodDogYm9sZCB9CgpkaXYudG9waWMgewogIG1hcmdp
bjogMmVtIH0KCmgxLnNlY3Rpb24tc3VidGl0bGUsIGgyLnNlY3Rpb24tc3VidGl0bGUsIGgz
LnNlY3Rpb24tc3VidGl0bGUsCmg0LnNlY3Rpb24tc3VidGl0bGUsIGg1LnNlY3Rpb24tc3Vi
dGl0bGUsIGg2LnNlY3Rpb24tc3VidGl0bGUgewogIG1hcmdpbi10b3A6IDAuNGVtIH0KCmgx
LnRpdGxlIHsKICB0ZXh0LWFsaWduOiBjZW50ZXIgfQoKaDIuc3VidGl0bGUgewogIHRleHQt
YWxpZ246IGNlbnRlciB9Cgpoci5kb2N1dGlscyB7CiAgd2lkdGg6IDc1JSB9CgppbWcuYWxp
Z24tbGVmdCwgLmZpZ3VyZS5hbGlnbi1sZWZ0LCBvYmplY3QuYWxpZ24tbGVmdCB7CiAgY2xl
YXI6IGxlZnQgOwogIGZsb2F0OiBsZWZ0IDsKICBtYXJnaW4tcmlnaHQ6IDFlbSB9CgppbWcu
YWxpZ24tcmlnaHQsIC5maWd1cmUuYWxpZ24tcmlnaHQsIG9iamVjdC5hbGlnbi1yaWdodCB7
CiAgY2xlYXI6IHJpZ2h0IDsKICBmbG9hdDogcmlnaHQgOwogIG1hcmdpbi1sZWZ0OiAxZW0g
fQoKaW1nLmFsaWduLWNlbnRlciwgLmZpZ3VyZS5hbGlnbi1jZW50ZXIsIG9iamVjdC5hbGln
bi1jZW50ZXIgewogIGRpc3BsYXk6IGJsb2NrOwogIG1hcmdpbi1sZWZ0OiBhdXRvOwogIG1h
cmdpbi1yaWdodDogYXV0bzsKfQoKLmFsaWduLWxlZnQgewogIHRleHQtYWxpZ246IGxlZnQg
fQoKLmFsaWduLWNlbnRlciB7CiAgY2xlYXI6IGJvdGggOwogIHRleHQtYWxpZ246IGNlbnRl
ciB9CgouYWxpZ24tcmlnaHQgewogIHRleHQtYWxpZ246IHJpZ2h0IH0KCi8qIHJlc2V0IGlu
bmVyIGFsaWdubWVudCBpbiBmaWd1cmVzICovCmRpdi5hbGlnbi1yaWdodCB7CiAgdGV4dC1h
bGlnbjogaW5oZXJpdCB9CgovKiBkaXYuYWxpZ24tY2VudGVyICogeyAqLwovKiAgIHRleHQt
YWxpZ246IGxlZnQgfSAqLwoKb2wuc2ltcGxlLCB1bC5zaW1wbGUgewogIG1hcmdpbi1ib3R0
b206IDFlbSB9CgpvbC5hcmFiaWMgewogIGxpc3Qtc3R5bGU6IGRlY2ltYWwgfQoKb2wubG93
ZXJhbHBoYSB7CiAgbGlzdC1zdHlsZTogbG93ZXItYWxwaGEgfQoKb2wudXBwZXJhbHBoYSB7
CiAgbGlzdC1zdHlsZTogdXBwZXItYWxwaGEgfQoKb2wubG93ZXJyb21hbiB7CiAgbGlzdC1z
dHlsZTogbG93ZXItcm9tYW4gfQoKb2wudXBwZXJyb21hbiB7CiAgbGlzdC1zdHlsZTogdXBw
ZXItcm9tYW4gfQoKcC5hdHRyaWJ1dGlvbiB7CiAgdGV4dC1hbGlnbjogcmlnaHQgOwogIG1h
cmdpbi1sZWZ0OiA1MCUgfQoKcC5jYXB0aW9uIHsKICBmb250LXN0eWxlOiBpdGFsaWMgfQoK
cC5jcmVkaXRzIHsKICBmb250LXN0eWxlOiBpdGFsaWMgOwogIGZvbnQtc2l6ZTogc21hbGxl
ciB9CgpwLmxhYmVsIHsKICB3aGl0ZS1zcGFjZTogbm93cmFwIH0KCnAucnVicmljIHsKICBm
b250LXdlaWdodDogYm9sZCA7CiAgZm9udC1zaXplOiBsYXJnZXIgOwogIGNvbG9yOiBtYXJv
b24gOwogIHRleHQtYWxpZ246IGNlbnRlciB9CgpwLnNpZGViYXItdGl0bGUgewogIGZvbnQt
ZmFtaWx5OiBzYW5zLXNlcmlmIDsKICBmb250LXdlaWdodDogYm9sZCA7CiAgZm9udC1zaXpl
OiBsYXJnZXIgfQoKcC5zaWRlYmFyLXN1YnRpdGxlIHsKICBmb250LWZhbWlseTogc2Fucy1z
ZXJpZiA7CiAgZm9udC13ZWlnaHQ6IGJvbGQgfQoKcC50b3BpYy10aXRsZSB7CiAgZm9udC13
ZWlnaHQ6IGJvbGQgfQoKcHJlLmFkZHJlc3MgewogIG1hcmdpbi1ib3R0b206IDAgOwogIG1h
cmdpbi10b3A6IDAgOwogIGZvbnQ6IGluaGVyaXQgfQoKcHJlLmxpdGVyYWwtYmxvY2ssIHBy
ZS5kb2N0ZXN0LWJsb2NrLCBwcmUubWF0aCwgcHJlLmNvZGUgewogIG1hcmdpbi1sZWZ0OiAy
ZW0gOwogIG1hcmdpbi1yaWdodDogMmVtIH0KCnByZS5jb2RlIC5sbiB7IGNvbG9yOiBncmV5
OyB9IC8qIGxpbmUgbnVtYmVycyAqLwpwcmUuY29kZSwgY29kZSB7IGJhY2tncm91bmQtY29s
b3I6ICNlZWVlZWUgfQpwcmUuY29kZSAuY29tbWVudCwgY29kZSAuY29tbWVudCB7IGNvbG9y
OiAjNUM2NTc2IH0KcHJlLmNvZGUgLmtleXdvcmQsIGNvZGUgLmtleXdvcmQgeyBjb2xvcjog
IzNCMEQwNjsgZm9udC13ZWlnaHQ6IGJvbGQgfQpwcmUuY29kZSAubGl0ZXJhbC5zdHJpbmcs
IGNvZGUgLmxpdGVyYWwuc3RyaW5nIHsgY29sb3I6ICMwQzU0MDQgfQpwcmUuY29kZSAubmFt
ZS5idWlsdGluLCBjb2RlIC5uYW1lLmJ1aWx0aW4geyBjb2xvcjogIzM1MkI4NCB9CnByZS5j
b2RlIC5kZWxldGVkLCBjb2RlIC5kZWxldGVkIHsgYmFja2dyb3VuZC1jb2xvcjogI0RFQjBB
MX0KcHJlLmNvZGUgLmluc2VydGVkLCBjb2RlIC5pbnNlcnRlZCB7IGJhY2tncm91bmQtY29s
b3I6ICNBM0QyODl9CgpzcGFuLmNsYXNzaWZpZXIgewogIGZvbnQtZmFtaWx5OiBzYW5zLXNl
cmlmIDsKICBmb250LXN0eWxlOiBvYmxpcXVlIH0KCnNwYW4uY2xhc3NpZmllci1kZWxpbWl0
ZXIgewogIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmIDsKICBmb250LXdlaWdodDogYm9sZCB9
CgpzcGFuLmludGVycHJldGVkIHsKICBmb250LWZhbWlseTogc2Fucy1zZXJpZiB9CgpzcGFu
Lm9wdGlvbiB7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcCB9CgpzcGFuLnByZSB7CiAgd2hpdGUt
c3BhY2U6IHByZSB9CgpzcGFuLnByb2JsZW1hdGljIHsKICBjb2xvcjogcmVkIH0KCnNwYW4u
c2VjdGlvbi1zdWJ0aXRsZSB7CiAgLyogZm9udC1zaXplIHJlbGF0aXZlIHRvIHBhcmVudCAo
aDEuLmg2IGVsZW1lbnQpICovCiAgZm9udC1zaXplOiA4MCUgfQoKdGFibGUuY2l0YXRpb24g
ewogIGJvcmRlci1sZWZ0OiBzb2xpZCAxcHggZ3JheTsKICBtYXJnaW4tbGVmdDogMXB4IH0K
CnRhYmxlLmRvY2luZm8gewogIG1hcmdpbjogMmVtIDRlbSB9Cgp0YWJsZS5kb2N1dGlscyB7
CiAgbWFyZ2luLXRvcDogMC41ZW0gOwogIG1hcmdpbi1ib3R0b206IDAuNWVtIH0KCnRhYmxl
LmZvb3Rub3RlIHsKICBib3JkZXItbGVmdDogc29saWQgMXB4IGJsYWNrOwogIG1hcmdpbi1s
ZWZ0OiAxcHggfQoKdGFibGUuZG9jdXRpbHMgdGQsIHRhYmxlLmRvY3V0aWxzIHRoLAp0YWJs
ZS5kb2NpbmZvIHRkLCB0YWJsZS5kb2NpbmZvIHRoIHsKICBwYWRkaW5nLWxlZnQ6IDAuNWVt
IDsKICBwYWRkaW5nLXJpZ2h0OiAwLjVlbSA7CiAgdmVydGljYWwtYWxpZ246IHRvcCB9Cgp0
YWJsZS5kb2N1dGlscyB0aC5maWVsZC1uYW1lLCB0YWJsZS5kb2NpbmZvIHRoLmRvY2luZm8t
bmFtZSB7CiAgZm9udC13ZWlnaHQ6IGJvbGQgOwogIHRleHQtYWxpZ246IGxlZnQgOwogIHdo
aXRlLXNwYWNlOiBub3dyYXAgOwogIHBhZGRpbmctbGVmdDogMCB9CgovKiAiYm9va3RhYnMi
IHN0eWxlIChubyB2ZXJ0aWNhbCBsaW5lcykgKi8KdGFibGUuZG9jdXRpbHMuYm9va3RhYnMg
ewogIGJvcmRlcjogMHB4OwogIGJvcmRlci10b3A6IDJweCBzb2xpZDsKICBib3JkZXItYm90
dG9tOiAycHggc29saWQ7CiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKfQp0YWJsZS5k
b2N1dGlscy5ib29rdGFicyAqIHsKICBib3JkZXI6IDBweDsKfQp0YWJsZS5kb2N1dGlscy5i
b29rdGFicyB0aCB7CiAgYm9yZGVyLWJvdHRvbTogdGhpbiBzb2xpZDsKICB0ZXh0LWFsaWdu
OiBsZWZ0Owp9CgpoMSB0dC5kb2N1dGlscywgaDIgdHQuZG9jdXRpbHMsIGgzIHR0LmRvY3V0
aWxzLApoNCB0dC5kb2N1dGlscywgaDUgdHQuZG9jdXRpbHMsIGg2IHR0LmRvY3V0aWxzIHsK
ICBmb250LXNpemU6IDEwMCUgfQoKdWwuYXV0by10b2MgewogIGxpc3Qtc3R5bGUtdHlwZTog
bm9uZSB9Cgo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5Pgo8ZGl2IGNsYXNzPSJkb2N1bWVudCIg
aWQ9ImEtdW5pZmllZC12aXNpb24tZm9yLW1hbmlwdWxhdGluZy10dXBsZS1saWtlLW9iamVj
dHMiPgo8aDEgY2xhc3M9InRpdGxlIj5BIFVuaWZpZWQgVmlzaW9uIGZvciBNYW5pcHVsYXRp
bmcgVHVwbGUtbGlrZSBPYmplY3RzPC9oMT4KPHRhYmxlIGNsYXNzPSJkb2NpbmZvIiBmcmFt
ZT0idm9pZCIgcnVsZXM9Im5vbmUiPgo8Y29sIGNsYXNzPSJkb2NpbmZvLW5hbWUiIC8+Cjxj
b2wgY2xhc3M9ImRvY2luZm8tY29udGVudCIgLz4KPHRib2R5IHZhbGlnbj0idG9wIj4KPHRy
IGNsYXNzPSJmaWVsZCI+PHRoIGNsYXNzPSJkb2NpbmZvLW5hbWUiPkRvY3VtZW50OjwvdGg+
PHRkIGNsYXNzPSJmaWVsZC1ib2R5Ij5EWFhYWFIwIChUQkQpPC90ZD4KPC90cj4KPHRyPjx0
aCBjbGFzcz0iZG9jaW5mby1uYW1lIj5EYXRlOjwvdGg+Cjx0ZD4yMDE2LTAzLTE4PC90ZD48
L3RyPgo8dHIgY2xhc3M9ImZpZWxkIj48dGggY2xhc3M9ImRvY2luZm8tbmFtZSI+UHJvamVj
dDo8L3RoPjx0ZCBjbGFzcz0iZmllbGQtYm9keSI+SVNPL0lFQyBKVEMxIFNDMjIgV0cyMSBQ
cm9ncmFtbWluZyBMYW5ndWFnZSBDKys8L3RkPgo8L3RyPgo8dHIgY2xhc3M9ImZpZWxkIj48
dGggY2xhc3M9ImRvY2luZm8tbmFtZSI+QXVkaWVuY2U6PC90aD48dGQgY2xhc3M9ImZpZWxk
LWJvZHkiPkV2b2x1dGlvbiBXb3JraW5nIEdyb3VwPC90ZD4KPC90cj4KPHRyPjx0aCBjbGFz
cz0iZG9jaW5mby1uYW1lIj5BdXRob3I6PC90aD4KPHRkPk1hdHRoZXcgV29laGxrZSAoPGEg
Y2xhc3M9InJlZmVyZW5jZSBleHRlcm5hbCIgaHJlZj0ibWFpbHRvOm13b2VobGtlLmZsb3Nz
JiM2NDtnbWFpbC5jb20iPm13b2VobGtlLmZsb3NzJiM2NDtnbWFpbC5jb208L2E+KTwvdGQ+
PC90cj4KPC90Ym9keT4KPC90YWJsZT4KPHN0eWxlPgogIGh0bWwgeyBjb2xvcjogYmxhY2s7
IGJhY2tncm91bmQ6IHdoaXRlOyB9CiAgdGFibGUuZG9jaW5mbyB7IG1hcmdpbjogMmVtIDA7
IH0KPC9zdHlsZT48ZGl2IGNsYXNzPSJzZWN0aW9uIiBpZD0iYWJzdHJhY3QiPgo8aDE+PGEg
Y2xhc3M9InRvYy1iYWNrcmVmIiBocmVmPSIjaWQ4Ij5BYnN0cmFjdDwvYT48L2gxPgo8cD5U
aGVyZSBpcyBtdWNoIGFjdGl2aXR5IGFuZCBkaXNjdXNzaW9uIHN1cnJvdW5kaW5nIHR1cGxl
LWxpa2Ugb2JqZWN0cywgd2l0aCBtYW55IGZlYXR1cmVzIGJlaW5nIHJlcXVlc3RlZCBhbmQg
bWFueSBwYXBlcnMgc3VibWl0dGVkIG9yIHBsYW5uZWQuIEl0IGlzIGltcG9ydGFudCB0aGF0
IHdlIGVzdGFibGlzaCBhIHBsYW4gZm9yIHdoZXJlIHdlIGFyZSBnb2luZyB0aGF0IHRha2Vz
IGludG8gYWNjb3VudCBmdXR1cmUgZGlyZWN0aW9ucyBpbiBvcmRlciB0byBhdm9pZCBvdmVy
Y29tcGxpY2F0aW5nIHRoZSBsYW5ndWFnZSBvciBwYWludGluZyBvdXJzZWx2ZXMgaW50byBh
IGNvcm5lciBvZiBpbmNvbXBhdGlibGUgZmVhdHVyZXMuPC9wPgo8ZGl2IGNsYXNzPSJjb250
ZW50cyB0b3BpYyIgaWQ9ImNvbnRlbnRzIj4KPHAgY2xhc3M9InRvcGljLXRpdGxlIGZpcnN0
Ij5Db250ZW50czwvcD4KPHVsIGNsYXNzPSJzaW1wbGUiPgo8bGk+PGEgY2xhc3M9InJlZmVy
ZW5jZSBpbnRlcm5hbCIgaHJlZj0iI2Fic3RyYWN0IiBpZD0iaWQ4Ij5BYnN0cmFjdDwvYT48
L2xpPgo8bGk+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iI2JhY2tncm91
bmQiIGlkPSJpZDkiPkJhY2tncm91bmQ8L2E+PC9saT4KPGxpPjxhIGNsYXNzPSJyZWZlcmVu
Y2UgaW50ZXJuYWwiIGhyZWY9IiNwcmVmYWNlIiBpZD0iaWQxMCI+UHJlZmFjZTwvYT48L2xp
Pgo8bGk+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iI2RlZmluaXRpb25z
IiBpZD0iaWQxMSI+RGVmaW5pdGlvbnM8L2E+PC9saT4KPGxpPjxhIGNsYXNzPSJyZWZlcmVu
Y2UgaW50ZXJuYWwiIGhyZWY9IiNhY2Nlc3MiIGlkPSJpZDEyIj5BY2Nlc3M8L2E+PHVsPgo8
bGk+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iI2FuLW9wZXJhdG9yLWxp
a2UtYWx0ZXJuYXRpdmUiIGlkPSJpZDEzIj5BbiBvcGVyYXRvci1saWtlIGFsdGVybmF0aXZl
PC9hPjwvbGk+CjwvdWw+CjwvbGk+CjxsaT48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFs
IiBocmVmPSIjZ2VuZXJhbGl6ZWQtdW5wYWNraW5nIiBpZD0iaWQxNCI+R2VuZXJhbGl6ZWQg
VW5wYWNraW5nPC9hPjwvbGk+CjxsaT48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBo
cmVmPSIjdW5pZmljYXRpb24tb2YtdW5wYWNraW5nIiBpZD0iaWQxNSI+VW5pZmljYXRpb24g
b2YgVW5wYWNraW5nPC9hPjwvbGk+CjxsaT48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFs
IiBocmVmPSIjc2xpY2luZyIgaWQ9ImlkMTYiPlNsaWNpbmc8L2E+PC9saT4KPGxpPjxhIGNs
YXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9IiNwYWNrLWdlbmVyYXRpb24tcmV2aXNp
dGVkIiBpZD0iaWQxNyI+UGFjayBHZW5lcmF0aW9uLCBSZXZpc2l0ZWQ8L2E+PC9saT4KPGxp
PjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9IiNzdW1tYXJ5IiBpZD0iaWQx
OCI+U3VtbWFyeTwvYT48L2xpPgo8bGk+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIg
aHJlZj0iI2Fja25vd2xlZGdtZW50cyIgaWQ9ImlkMTkiPkFja25vd2xlZGdtZW50czwvYT48
L2xpPgo8bGk+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iI2Zvb3Rub3Rl
cyIgaWQ9ImlkMjAiPkZvb3Rub3RlczwvYT48L2xpPgo8bGk+PGEgY2xhc3M9InJlZmVyZW5j
ZSBpbnRlcm5hbCIgaHJlZj0iI3JlZmVyZW5jZXMiIGlkPSJpZDIxIj5SZWZlcmVuY2VzPC9h
PjwvbGk+CjwvdWw+CjwvZGl2Pgo8L2Rpdj4KPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9ImJh
Y2tncm91bmQiPgo8aDE+PGEgY2xhc3M9InRvYy1iYWNrcmVmIiBocmVmPSIjaWQ5Ij5CYWNr
Z3JvdW5kPC9hPjwvaDE+CjxwPkF0IHRoZSAyMDE2IEphY2tzb252aWxsZSBtZWV0aW5nLCA8
YSBjbGFzcz0icmVmZXJlbmNlIGV4dGVybmFsIiBocmVmPSJodHRwOi8vd2cyMS5saW5rL3Aw
MTQ0Ij5QMDE0NDwvYT4gd2FzIGRpc2N1c3NlZCBmb3IgdGhlIHNlY29uZCB0aW1lLiBSZWNl
cHRpb24gd2FzIGdlbmVyYWxseSBwb3NpdGl2ZSwgYnV0IHNvbWUgaXNzdWVzIHJlbWFpbmVk
IHRvIGJlIGFkZHJlc3NlZC4gSXQgc2VlbXMgcXVpdGUgY2xlYXIgdGhhdCB0aGlzIGlzIGEg
ZGVzaXJlZCBkaXJlY3Rpb24gZm9yIEMrKy4gVW5mb3J0dW5hdGVseSwgPGEgY2xhc3M9InJl
ZmVyZW5jZSBleHRlcm5hbCIgaHJlZj0iaHR0cDovL3dnMjEubGluay9wMDE5NyI+UDAxOTc8
L2E+LCB3aGljaCB3YXMgc2NoZWR1bGVkIGZvciBwcmVzZW50YXRpb24gYW5kIGhhcyBzb21l
IGltcGFjdCBvbiB0aGUgZGlyZWN0aW9uIHdoaWNoIDxhIGNsYXNzPSJyZWZlcmVuY2UgZXh0
ZXJuYWwiIGhyZWY9Imh0dHA6Ly93ZzIxLmxpbmsvcDAxNDQiPlAwMTQ0PC9hPiBpcyBmb2xs
b3dpbmcsIHdhcyBza2lwcGVkIGR1ZSB0byB0aW1lIGNvbnN0cmFpbnRzLjwvcD4KPHA+RGlz
Y3Vzc2lvbiBvbiB0aGUgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFz
cz0icHJlIj5zdGQtcHJvcG9zYWxzPC9zcGFuPjwvdHQ+IGZvcnVtIG9mdGVuIGJyaW5ncyB1
cCB0aGUgZGVzaXJlIHRvIGV4dGVuZCB1c2Ugb2YgJnF1b3Q7dHVwbGUtbGlrZSZxdW90OyBv
YmplY3RzIHRvIGNvbnRleHRzIG90aGVyIHRoYW4gbmFtZSBiaW5kaW5nIChpLmUuIDxhIGNs
YXNzPSJyZWZlcmVuY2UgZXh0ZXJuYWwiIGhyZWY9Imh0dHA6Ly93ZzIxLmxpbmsvcDAxNDQi
PlAwMTQ0PC9hPikuIFRoZXJlIGlzIGFsc28gc2lnbmlmaWNhbnQgYW5kIHJlbGF0ZWQgZGlz
Y3Vzc2lvbiBvbiBpbXByb3ZpbmcgdGhlIHVzYWJpbGl0eSBvZiBwYXJhbWV0ZXIgcGFja3Mu
IFdlIGZlZWwgdGhhdCBzZXZlcmFsIG9mIHRoZXNlIGFyZWFzIGFyZSBjbG9zZWx5IHJlbGF0
ZWQgYW5kIHdhcnJhbnQgdGhlIGZvcm1hdGlvbiBvZiBhIGNvbmNyZXRlIGFuZCB1bmlmaWVk
IHZpc2lvbiBmb3IgZnV0dXJlIGRpcmVjdGlvbi48L3A+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJz
ZWN0aW9uIiBpZD0icHJlZmFjZSI+CjxoMT48YSBjbGFzcz0idG9jLWJhY2tyZWYiIGhyZWY9
IiNpZDEwIj5QcmVmYWNlPC9hPjwvaDE+CjxwPldlIHByZXNlbnQgc2V2ZXJhbCBzdWdnZXN0
aW9ucyBpbiB0aGlzIHBhcGVyLCBhbG9uZyB3aXRoIGFjY29tcGFueWluZyBzeW50YXguIFdl
IG11c3Qgc3RyZXNzIDxlbT5lbXBoYXRpY2FsbHk8L2VtPiB0aGF0IHRoaXMgcGFwZXIgaXMg
bm90IGludGVuZGVkIHRvIHByb3Bvc2UgYW55IGZlYXR1cmVzIGluIGFuZCBvZiBpdHNlbGYg
KHRoYXQgd2lsbCBjb21lIGxhdGVyKS4gUmF0aGVyLCB3ZSB3aXNoIHRvIG91dGxpbmUgc2V2
ZXJhbCBhcmVhcyBvZiBhbnRpY2lwYXRlZCBmdXR1cmUgZGV2ZWxvcG1lbnQgd2hpY2ggd2Ug
ZmVlbCBuZWVkIHRvIGJlIGV4cGxvcmVkIGFuZCwgaW4gcGFydGljdWxhciwgY29uc2lkZXJl
ZCBieSBvdGhlciBwcm9wb3NhbHMgYmVpbmcgcHV0IGZvcndhcmQsIGVzcGVjaWFsbHkgPGEg
Y2xhc3M9InJlZmVyZW5jZSBleHRlcm5hbCIgaHJlZj0iaHR0cDovL3dnMjEubGluay9wMDE0
NCI+UDAxNDQ8L2E+LiBXaGlsZSBzb21lIGJyaWVmIHN0YXRlbWVudHMgYXJlIG1hZGUgYXMg
dG8gb3VyIGNob2ljZXMsIHdlIHVyZ2UgdGhlIHJlYWRlciB0byBrZWVwIGluIG1pbmQgdGhh
dCBzeW50YXggc2hvd24gaXMgdXNlZCBpbiB0aGlzIGNvbnRleHQgb25seSBhcyBhIHRvb2wg
dG8gY29tbXVuaWNhdGUgZXhhbXBsZXMgb2YgdGhlIGZ1dHVyZSBmZWF0dXJlIHNwYWNlLCBh
bmQgbm90IHRvIGdldCBodW5nIHVwIG9uIG1pbm9yIHF1aWJibGVzLiBJbiBwYXJ0aWN1bGFy
LCBvdXIgbW9zdCBpbW1lZGlhdGUgY29uY2VybiBpcyBmb3IgdW5pZmljYXRpb24gb2YgaW1w
bGVtZW50YXRpb24gZGV0YWlscyByZWxhdGVkIHRvIHVucGFja2luZyBhbmQgY3VzdG9taXph
dGlvbiBwb2ludHMgb2YgdGhlIHNhbWUuIFdoaWxlIHdlIGZlZWwgYWxzbyB0aGF0IHNpbWls
YXIgY29uc2lkZXJhdGlvbnMgYXJlIGltcG9ydGFudCB3aXRoIHJlc3BlY3QgdG8gcGFyYW1l
dGVyIHBhY2tzLCB0aGF0IGZlYXR1cmUgc3BhY2UgaXMgbGVzcyBtYXR1cmUsIGFuZCBhY2Nv
cmRpbmdseSB0aGUgbmVlZCBmb3IgYSBjb25zb2xpZGF0ZWQgZGlyZWN0aW9uIGlzIGxlc3Mg
dXJnZW50LCBpZiBubyBsZXNzIHJlYWwuPC9wPgo8L2Rpdj4KPGRpdiBjbGFzcz0ic2VjdGlv
biIgaWQ9ImRlZmluaXRpb25zIj4KPGgxPjxhIGNsYXNzPSJ0b2MtYmFja3JlZiIgaHJlZj0i
I2lkMTEiPkRlZmluaXRpb25zPC9hPjwvaDE+CjxwPkEgJnF1b3Q7dHVwbGUgbGlrZSZxdW90
OyBpcyBhbnkgb2JqZWN0IGNvbnNpc3Rpbmcgb2Ygb25lIG9yICh1c3VhbGx5KSBtb3JlIG9y
dGhvZ29uYWwgdmFsdWVzIChpbiBtYXRoZW1hdGljYWwgbm90YXRpb24sIGEgJnF1b3Q7cHJv
ZHVjdCB0eXBlJnF1b3Q7KS4gVGhlIGNhbm9uaWNhbCBleGFtcGxlIGlzIDxjb2RlIGNsYXNz
PSJjcHAgYysrIj48c3BhbiBjbGFzcz0ibmFtZSI+c3RkPC9zcGFuPjxzcGFuIGNsYXNzPSJv
cGVyYXRvciI+Ojo8L3NwYW4+PHNwYW4gY2xhc3M9Im5hbWUiPnR1cGxlPC9zcGFuPjwvY29k
ZT4sIGJ1dCBvdGhlciBleGFtcGxlcyBpbmNsdWRlIDxjb2RlIGNsYXNzPSJjcHAgYysrIj48
c3BhbiBjbGFzcz0ibmFtZSI+c3RkPC9zcGFuPjxzcGFuIGNsYXNzPSJvcGVyYXRvciI+Ojo8
L3NwYW4+PHNwYW4gY2xhc3M9Im5hbWUiPmFycmF5PC9zcGFuPjwvY29kZT4gb3Igc2ltaWxh
ciBmaXhlZC1zaXplIHZlY3RvciB0eXBlcyBhbmQgbW9zdCBhZ2dyZWdhdGVzLCBhcyB3ZWxs
IGFzIHNvbWUgbm9uLWFnZ3JlZ2F0ZSB1c2VyIHR5cGVzIGluY2x1ZGluZyBvbmVzIHdpdGgg
bm8gcHVibGljIE5TRE0nczxhIGNsYXNzPSJmb290bm90ZS1yZWZlcmVuY2UiIGhyZWY9IiNw
dCIgaWQ9ImlkMSI+WzFdPC9hPi48L3A+CjxwPiZxdW90O1VucGFja2luZyZxdW90OyByZWZl
cnMgdG8gdGhlIGNvbnZlcnNpb24gb2YgYSB0dXBsZS1saWtlIG9iamVjdCBpbnRvIGl0cyBj
b21wb25lbnQgcGFydHMuIFRoaXMgaW5jbHVkZXMgYm90aCBuYW1lLWJpbmRpbmcgdW5wYWNr
aW5nIChpLmUuIDxhIGNsYXNzPSJyZWZlcmVuY2UgZXh0ZXJuYWwiIGhyZWY9Imh0dHA6Ly93
ZzIxLmxpbmsvcDAxNDQiPlAwMTQ0PC9hPikgYW5kICZxdW90O2dlbmVyYWxpemVkIHVucGFj
a2luZyZxdW90OyB3aGVyZSB0aGUgY29tcG9uZW50cyBhcmUgdXNlZCBpbiBhIG5vbi1iaW5k
aW5nIGNvbnRleHQ7IGZvciBleGFtcGxlLCBhcyB2YWx1ZXMgaW4gYSBmdW5jdGlvbiBwYXJh
bWV0ZXIgbGlzdC4gTmFtZS1iaW5kaW5nIHVucGFja2luZyBpcyBhbHNvIGNhbGxlZCAmcXVv
dDtzdHJ1Y3R1cmVkIGJpbmRpbmcmcXVvdDsgYW5kLCBoaXN0b3JpY2FsbHksICZxdW90O2Fz
c2lnbm1lbnQgdW5wYWNraW5nJnF1b3Q7LiBXZSBwcmVmZXIgdGhlIHRlcm0gJnF1b3Q7bmFt
ZS1iaW5kaW5nIHVucGFja2luZyZxdW90OyBhcyBpdCBkb2VzIG5vdCBjYWxsIGludG8gcXVl
c3Rpb24gaXNzdWVzIG9mICZxdW90O3RydWUgYXNzaWdubWVudCZxdW90OyB2ZXJzdXMgYWxp
YXNpbmcgd2hlcmUgPGEgY2xhc3M9InJlZmVyZW5jZSBleHRlcm5hbCIgaHJlZj0iaHR0cDov
L3dnMjEubGluay9wMDE0NCI+UDAxNDQ8L2E+IHNwZWNpZmljYWxseSBkZXNpcmVzIHRvIGF2
b2lkIGNlcnRhaW4gb3ZlcmhlYWRzLCBhbmQgdGhlIHVzZSBvZiAmcXVvdDt1bnBhY2tpbmcm
cXVvdDsgc2VydmVzIHRvIGNvbm5lY3QgdHdvIGNsb3NlbHkgcmVsYXRlZCBjb25jZXB0cy48
L3A+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJzZWN0aW9uIiBpZD0iYWNjZXNzIj4KPGgxPjxhIGNs
YXNzPSJ0b2MtYmFja3JlZiIgaHJlZj0iI2lkMTIiPkFjY2VzczwvYT48L2gxPgo8cD5PbmUg
b2YgdGhlIGFjdGl2ZSBxdWVzdGlvbnMgYXJvdW5kIDxhIGNsYXNzPSJyZWZlcmVuY2UgZXh0
ZXJuYWwiIGhyZWY9Imh0dHA6Ly93ZzIxLmxpbmsvcDAxNDQiPlAwMTQ0PC9hPiByZWdhcmRz
IHRoZSBjdXN0b21pemF0aW9uIHBvaW50LiBXZSBmZWVsIHN0cm9uZ2x5IHRoYXQgdGhlIGN1
c3RvbWl6YXRpb24gcG9pbnQgZm9yIG5hbWUtYmluZGluZyB1bnBhY2tpbmcgc2hvdWxkIGJl
IHRoZSBzYW1lIGFzIHVzZWQgYnkgZ2VuZXJhbGl6ZWQgdW5wYWNraW5nIGFuZCBieSBleGlz
dGluZyBhbmQgcHJvcG9zZWQgdXRpbGl0eSBmdW5jdGlvbnMgKGUuZy4gPGNvZGUgY2xhc3M9
ImNwcCBjKysiPjxzcGFuIGNsYXNzPSJuYW1lIj5zdGQ8L3NwYW4+PHNwYW4gY2xhc3M9Im9w
ZXJhdG9yIj46Ojwvc3Bhbj48c3BhbiBjbGFzcz0ibmFtZSI+YXBwbHk8L3NwYW4+PC9jb2Rl
PiBhbmQgPGNvZGUgY2xhc3M9ImNwcCBjKysiPjxzcGFuIGNsYXNzPSJuYW1lIj5zdGQ8L3Nw
YW4+PHNwYW4gY2xhc3M9Im9wZXJhdG9yIj46Ojwvc3Bhbj48c3BhbiBjbGFzcz0ibmFtZSI+
bWFrZV9mcm9tX3R1cGxlPC9zcGFuPjwvY29kZT4pIHRoYXQgYWN0IG9uIHR1cGxlLWxpa2Ug
b2JqZWN0cy4gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHRoZSBzYWtlIG9mIGNvbnNpc3RlbmN5
OyB0aGVzZSBvcGVyYXRpb25zIGFyZSBleHRyZW1lbHkgc2ltaWxhciwgYW5kIHVzaW5nIGRp
ZmZlcmVudCBjdXN0b21pemF0aW9uIHBvaW50cyB3aWxsIGxpa2VseSByZXN1bHQgaW4gY29u
ZnVzaW9uIGFuZCB0ZWFjaGluZyBkaWZmaWN1bHR5LjwvcD4KPHA+VGhhdCBzYWlkLCB3ZSBm
ZWVsIGxlc3Mgc3Ryb25nbHkgYWJvdXQgdGhlIGV4YWN0IG5hdHVyZSBvZiB0aG9zZSBjdXN0
b21pemF0aW9uIHBvaW50cywgcHJvdmlkaW5nIHRoYXQgdGhvc2UgcG9pbnRzIHdoaWNoIGFy
ZSBldmVudHVhbGx5IHVzZWQgcHJvdmlkZSBzYXRpc2ZhY3RvcnkgYmFja3dhcmRzIGNvbXBh
dGliaWxpdHkuPC9wPgo8cD5BdCBwcmVzZW50LCB0aGVzZSBjdXN0b21pemF0aW9uIHBvaW50
cyBhcmU6PC9wPgo8ZGwgY2xhc3M9ImRvY3V0aWxzIj4KPGR0Pjxjb2RlIGNsYXNzPSJjcHAg
YysrIj48c3BhbiBjbGFzcz0ibmFtZSI+Z2V0PC9zcGFuPjxzcGFuIGNsYXNzPSJvcGVyYXRv
ciI+Jmx0Ozwvc3Bhbj48c3BhbiBjbGFzcz0ibmFtZSI+Tjwvc3Bhbj48c3BhbiBjbGFzcz0i
b3BlcmF0b3IiPiZndDs8L3NwYW4+PHNwYW4gY2xhc3M9InB1bmN0dWF0aW9uIj4oPC9zcGFu
PjxzcGFuIGNsYXNzPSJuYW1lIj5UPC9zcGFuPjxzcGFuIGNsYXNzPSJwdW5jdHVhdGlvbiI+
KTwvc3Bhbj48L2NvZGU+OjwvZHQ+CjxkZD5BY2Nlc3MgdGhlIE4ndGggdmFsdWUgb2YgdGhl
IHR1cGxlLWxpa2UsIHdoZXJlIDxjb2RlIGNsYXNzPSJjcHAgYysrIj48c3BhbiBjbGFzcz0i
bGl0ZXJhbCBudW1iZXIgaW50ZWdlciI+MDwvc3Bhbj4gPHNwYW4gY2xhc3M9Im9wZXJhdG9y
Ij4mbHQ7PC9zcGFuPiA8c3BhbiBjbGFzcz0ibmFtZSI+Tjwvc3Bhbj4gPHNwYW4gY2xhc3M9
Im9wZXJhdG9yIj4mbHQ7PC9zcGFuPiA8c3BhbiBjbGFzcz0ibmFtZSI+dHVwbGVfc2l6ZTwv
c3Bhbj48c3BhbiBjbGFzcz0icHVuY3R1YXRpb24iPig8L3NwYW4+PHNwYW4gY2xhc3M9Im5h
bWUiPlQ8L3NwYW4+PHNwYW4gY2xhc3M9InB1bmN0dWF0aW9uIj4pPC9zcGFuPjwvY29kZT4u
PC9kZD4KPGR0Pjxjb2RlIGNsYXNzPSJjcHAgYysrIj48c3BhbiBjbGFzcz0ibmFtZSI+Y29u
c3RleHByPC9zcGFuPiA8c3BhbiBjbGFzcz0ibmFtZSI+dHVwbGVfc2l6ZTwvc3Bhbj48c3Bh
biBjbGFzcz0icHVuY3R1YXRpb24iPig8L3NwYW4+PHNwYW4gY2xhc3M9Im5hbWUiPlQ8L3Nw
YW4+PHNwYW4gY2xhc3M9InB1bmN0dWF0aW9uIj4pPC9zcGFuPjwvY29kZT46PC9kdD4KPGRk
PlJldHVybnMgdGhlIHNpemUgb2YgKGkuZS4gbnVtYmVyIG9mIGVsZW1lbnRzIGluKSB0aGUg
dHVwbGUtbGlrZS48L2RkPgo8L2RsPgo8ZGl2IGNsYXNzPSJzZWN0aW9uIiBpZD0iYW4tb3Bl
cmF0b3ItbGlrZS1hbHRlcm5hdGl2ZSI+CjxoMj48YSBjbGFzcz0idG9jLWJhY2tyZWYiIGhy
ZWY9IiNpZDEzIj5BbiBvcGVyYXRvci1saWtlIGFsdGVybmF0aXZlPC9hPjwvaDI+CjxwPlNv
bWUgY29uY2VybnMgd2VyZSBleHByZXNzZWQgdGhhdCBvdmVybG9hZGluZyBvbiA8Y29kZSBj
bGFzcz0iY3BwIGMrKyI+PHNwYW4gY2xhc3M9Im5hbWUiPmdldDwvc3Bhbj48c3BhbiBjbGFz
cz0ib3BlcmF0b3IiPiZsdDs8L3NwYW4+PHNwYW4gY2xhc3M9Im5hbWUiPk48L3NwYW4+PHNw
YW4gY2xhc3M9Im9wZXJhdG9yIj4mZ3Q7PC9zcGFuPjxzcGFuIGNsYXNzPSJwdW5jdHVhdGlv
biI+KDwvc3Bhbj48c3BhbiBjbGFzcz0ibmFtZSI+VDwvc3Bhbj48c3BhbiBjbGFzcz0icHVu
Y3R1YXRpb24iPik8L3NwYW4+PC9jb2RlPiBpcyBub3QgYXBwcm9wcmlhdGUgZHVlIHRvIGl0
cyB1c2UgZm9yIG90aGVyIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm90IHJlbGF0ZWQgdG8gdHVw
bGUtbGlrZSBvYmplY3RzLiBPbmUgYWx0ZXJuYXRpdmUgbWlnaHQgYmUgdG8gaW1wbGVtZW50
IGEgbmV3IG9wZXJhdG9yIHR5cGU6PC9wPgo8cHJlIGNsYXNzPSJjb2RlIGMrKyBsaXRlcmFs
LWJsb2NrIj4KPHNwYW4gY2xhc3M9ImtleXdvcmQiPm9wZXJhdG9yPC9zcGFuPiA8c3BhbiBj
bGFzcz0ibmFtZSBmdW5jdGlvbiI+Z2V0PC9zcGFuPjxzcGFuIGNsYXNzPSJwdW5jdHVhdGlv
biI+KDwvc3Bhbj48c3BhbiBjbGFzcz0ia2V5d29yZCI+YXV0bzwvc3Bhbj48c3BhbiBjbGFz
cz0ib3BlcmF0b3IiPiZhbXA7PC9zcGFuPiA8c3BhbiBjbGFzcz0ibmFtZSI+dHVwbGU8L3Nw
YW4+PHNwYW4gY2xhc3M9InB1bmN0dWF0aW9uIj4sPC9zcGFuPiA8c3BhbiBjbGFzcz0ibmFt
ZSI+Y29uc3RleHByPC9zcGFuPiA8c3BhbiBjbGFzcz0ia2V5d29yZCB0eXBlIj5zaXplX3Q8
L3NwYW4+IDxzcGFuIGNsYXNzPSJuYW1lIj5pPC9zcGFuPjxzcGFuIGNsYXNzPSJwdW5jdHVh
dGlvbiI+KTs8L3NwYW4+CjxzcGFuIGNsYXNzPSJuYW1lIj5jb25zdGV4cHI8L3NwYW4+IDxz
cGFuIGNsYXNzPSJrZXl3b3JkIj5vcGVyYXRvcjwvc3Bhbj4gPHNwYW4gY2xhc3M9ImtleXdv
cmQiPnNpemVvZjwvc3Bhbj48c3BhbiBjbGFzcz0ib3BlcmF0b3IiPiZsdDs8L3NwYW4+PHNw
YW4gY2xhc3M9Im5hbWUiPlQ8L3NwYW4+PHNwYW4gY2xhc3M9Im9wZXJhdG9yIj4mZ3Q7PC9z
cGFuPjxzcGFuIGNsYXNzPSJwdW5jdHVhdGlvbiI+KCk7PC9zcGFuPgo8L3ByZT4KPHA+SXQg
bWF5IGJlIHJlYXNvbmFibGUgb3IgZXZlbiBkZXNpcmFibGUgdG8gcmVzdHJpY3QgYWNjZXNz
IG9mIHRoZXNlIG9wZXJhdG9ycyB0byBlaXRoZXIgZXhwbGljaXQgc3BlbGxpbmcgb3IgdXNl
IG9mIGRlZGljYXRlZCBzeW50YXg6PC9wPgo8cHJlIGNsYXNzPSJjb2RlIGMrKyBsaXRlcmFs
LWJsb2NrIj4KPHNwYW4gY2xhc3M9Im5hbWUiPk15VHVwbGVMaWtlPC9zcGFuPiA8c3BhbiBj
bGFzcz0ibmFtZSI+dDwvc3Bhbj48c3BhbiBjbGFzcz0icHVuY3R1YXRpb24iPjs8L3NwYW4+
Cgo8c3BhbiBjbGFzcz0icHVuY3R1YXRpb24iPls8L3NwYW4+PHNwYW4gY2xhc3M9ImxpdGVy
YWwgbnVtYmVyIGludGVnZXIiPjA8L3NwYW4+PHNwYW4gY2xhc3M9InB1bmN0dWF0aW9uIj5d
PC9zcGFuPjxzcGFuIGNsYXNzPSJuYW1lIj50PC9zcGFuPjxzcGFuIGNsYXNzPSJwdW5jdHVh
dGlvbiI+Ozwvc3Bhbj4gPHNwYW4gY2xhc3M9ImNvbW1lbnQgc2luZ2xlIj4vLyBvcGVyYXRv
ciBnZXQKPC9zcGFuPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zaXplb2Y8L3NwYW4+PHNwYW4g
Y2xhc3M9InB1bmN0dWF0aW9uIj4uLi4oPC9zcGFuPjxzcGFuIGNsYXNzPSJuYW1lIj50PC9z
cGFuPjxzcGFuIGNsYXNzPSJwdW5jdHVhdGlvbiI+KTs8L3NwYW4+IDxzcGFuIGNsYXNzPSJj
b21tZW50IHNpbmdsZSI+Ly8gb3BlcmF0b3Igc2l6ZW9mCjwvc3Bhbj4KPHNwYW4gY2xhc3M9
ImtleXdvcmQiPmF1dG88L3NwYW4+IDxzcGFuIGNsYXNzPSJwdW5jdHVhdGlvbiI+Wzwvc3Bh
bj48c3BhbiBjbGFzcz0ibmFtZSI+eDwvc3Bhbj48c3BhbiBjbGFzcz0icHVuY3R1YXRpb24i
Piw8L3NwYW4+IDxzcGFuIGNsYXNzPSJuYW1lIj55PC9zcGFuPjxzcGFuIGNsYXNzPSJwdW5j
dHVhdGlvbiI+XTwvc3Bhbj4gPHNwYW4gY2xhc3M9Im9wZXJhdG9yIj49PC9zcGFuPiA8c3Bh
biBjbGFzcz0ibmFtZSI+dDwvc3Bhbj48c3BhbiBjbGFzcz0icHVuY3R1YXRpb24iPjs8L3Nw
YW4+IDxzcGFuIGNsYXNzPSJjb21tZW50IHNpbmdsZSI+Ly8gYm90aCwgdmlhIG5hbWUtYmlu
ZGluZyB1bnBhY2tpbmcsIGNhc2UgMgo8L3NwYW4+CjwvcHJlPgo8cD5XZSBzaG91bGQgbm90
ZSB0aGF0LCB3aGlsZSB0aGVyZSBhcmUgc29tZSBzdHJvbmcgZmVlbGluZ3Mgb24gdGhlc2Ug
dG9waWNzLCB3ZSBkbyBub3QgZmVlbCB0aGF0IGFueSBwYXJ0aWN1bGFyIHJlc29sdXRpb24g
aXMgY3JpdGljYWwgZm9yIGFueSBvZiB0aGUgZGlyZWN0aW9ucyB3ZSBhcmUgZXhwbG9yaW5n
LiBJbiB0aGlzIGFyZWEsIHdlIGZlZWwgb25seSB0aGF0IGEgY29uc2lzdGVudCBhbmQgY2xl
YXIgZGlyZWN0aW9uIGlzIGltcG9ydGFudC48L3A+CjxwPihUeXBlcyBoYXZlIGJlZW4gZWxp
ZGVkIGluIHRoZSBhYm92ZSBleGFtcGxlcywgYXMgdGhleSBhcmUgbm90IGNydWNpYWwgdG8g
dGhlIGRpc2N1c3Npb24uKTwvcD4KPC9kaXY+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJzZWN0aW9u
IiBpZD0iZ2VuZXJhbGl6ZWQtdW5wYWNraW5nIj4KPGgxPjxhIGNsYXNzPSJ0b2MtYmFja3Jl
ZiIgaHJlZj0iI2lkMTQiPkdlbmVyYWxpemVkIFVucGFja2luZzwvYT48L2gxPgo8cD5HZW5l
cmFsaXplZCB1bnBhY2tpbmcgaXMgdGhlIGNvbnZlcnNpb24gb2YgYSB0dXBsZS1saWtlIHRv
IGEgJnF1b3Q7dmFsdWUgc2VxdWVuY2UmcXVvdDssIGluIHRoZSBtYW5uZXIgb2YgUHl0aG9u
J3MgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj4qPC90dD4gb3BlcmF0b3IsIHN1Y2gg
dGhhdCB0aGUgcmVzdWx0aW5nIHNlcXVlbmNlIG1heSBiZSB1c2VkIGluIGFueSBwbGFjZSB0
aGF0IGEgY29tbWEgc2VwYXJhdGVkIHNlcXVlbmNlIG1heSBiZSB1c2VkLiBXaGlsZSBmdW5j
dGlvbiBwYXJhbWV0ZXIgbGlzdHMgaXMgdGhlIGNhbm9uaWNhbCBleGFtcGxlLCB0aGlzIHdv
dWxkIGFsc28gaW5jbHVkZSBicmFjZWQgaW5pdGlhbGl6ZXIgbGlzdHMuIEZvbGxvd2luZyBk
aXNjdXNzaW9uIG9uIHRoZSA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNs
YXNzPSJwcmUiPnN0ZC1wcm9wb3NhbHM8L3NwYW4+PC90dD4gZm9ydW0sIHdlIGJlbGlldmUg
dGhhdCB0aGUgbW9zdCByZWFzb25hYmxlIGFuZCB1c2VmdWwgbWVjaGFuaXNtIG9mIGFjY29t
cGxpc2hpbmcgdGhpcyBpcyB0byBwcm92aWRlIGEgbWVjaGFuaXNtIHdoZXJlYnkgYSB0dXBs
ZS1saWtlIG1heSBiZSBjb252ZXJ0ZWQgaW50byBhIHBhcmFtZXRlciBwYWNrLiBNdWNoIGFz
IGluIHRoZSBuYW1lLWJpbmRpbmcgdW5wYWNraW5nIGNhc2UsIHRoZXJlIGlzIGEgbG9naWNh
bCBjb2RlIHRyYW5zZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgZm9yIHRoaXMgcHVy
cG9zZSwgYnkgcGxhY2luZyB0aGUgdHVwbGUtbGlrZSBpbnRvIGEgdGVtcG9yYXJ5ICh3aGVy
ZSBuZWNlc3NhcnksIGkuZS4gaWYgdGhlIHR1cGxlLWxpa2UgaXMgYW4gZXhwcmVzc2lvbiBy
YXRoZXIgdGhhbiBhbHJlYWR5IGEgbmFtZWQgdmFyaWFibGUpIGFuZCB0YWtpbmcgdGhlIHBh
cmFtZXRlciBwYWNrIHRvIGJlIDxjb2RlIGNsYXNzPSJjcHAgYysrIj48c3BhbiBjbGFzcz0i
bmFtZSI+Z2V0PC9zcGFuPjxzcGFuIGNsYXNzPSJvcGVyYXRvciI+Jmx0Ozwvc3Bhbj48c3Bh
biBjbGFzcz0ibGl0ZXJhbCBudW1iZXIgaW50ZWdlciI+MDwvc3Bhbj48c3BhbiBjbGFzcz0i
b3BlcmF0b3IiPiZndDs8L3NwYW4+PHNwYW4gY2xhc3M9InB1bmN0dWF0aW9uIj4oPC9zcGFu
PjxzcGFuIGNsYXNzPSJrZXl3b3JkIHR5cGUiPl9fdDwvc3Bhbj48c3BhbiBjbGFzcz0icHVu
Y3R1YXRpb24iPiksPC9zcGFuPiA8c3BhbiBjbGFzcz0ibmFtZSI+Z2V0PC9zcGFuPjxzcGFu
IGNsYXNzPSJvcGVyYXRvciI+Jmx0Ozwvc3Bhbj48c3BhbiBjbGFzcz0ibGl0ZXJhbCBudW1i
ZXIgaW50ZWdlciI+MTwvc3Bhbj48c3BhbiBjbGFzcz0ib3BlcmF0b3IiPiZndDs8L3NwYW4+
PHNwYW4gY2xhc3M9InB1bmN0dWF0aW9uIj4oPC9zcGFuPjxzcGFuIGNsYXNzPSJrZXl3b3Jk
IHR5cGUiPl9fdDwvc3Bhbj48c3BhbiBjbGFzcz0icHVuY3R1YXRpb24iPiksPC9zcGFuPiA8
c3BhbiBjbGFzcz0icHVuY3R1YXRpb24iPi4uLjwvc3Bhbj48L2NvZGU+LiBUaGlzIGV4dGVu
ZHMgdGhlIHVzYWJsZSBzY29wZSB0byBhbnl3aGVyZSBhIGZvbGQgZXhwcmVzc2lvbiBtYXkg
YmUgdXNlZC48L3A+CjxwPldlIGFyZSBhd2FyZSBvZiBhdCBsZWFzdCB0aHJlZSBwb3NzaWJs
ZSBtZWNoYW5pc21zIGZvciBpbXBsZW1lbnRpbmcgZ2VuZXJhbGl6ZWQgdW5wYWNraW5nLiBP
bmUgb3B0aW9uIGlzIHRvIGVtcGxveSBhIG5ldyBzeW50YXggdG8gcGVyZm9ybSB0aGlzIG9w
ZXJhdGlvbiBkaXJlY3RseS4gQW5vdGhlciBpcyB0byBtYWtlIG11bHRpcGxlIHJldHVybiB2
YWx1ZXMsIHRyZWF0ZWQgYXMgcGFyYW1ldGVyIHBhY2tzLCBmaXJzdCBjbGFzcyBjaXRpemVu
cyBvZiB0aGUgbGFuZ3VhZ2UuIEEgdGhpcmQgaXMgdG8gY3JlYXRlIGEgcGFyYW1ldGVyIHBh
Y2sgJnF1b3Q7Z2VuZXJhdG9yJnF1b3Q7LiBUaGUgbGF0dGVyIHR3byBvcHRpb25zIG1ha2Ug
aXQgcG9zc2libGUgdG8gd3JpdGUgYSBmdW5jdGlvbiAod2hpY2ggbWlnaHQgcmVhc29uYWJs
eSBiZSBuYW1lZCA8Y29kZSBjbGFzcz0iY3BwIGMrKyI+PHNwYW4gY2xhc3M9Im5hbWUiPnN0
ZDwvc3Bhbj48c3BhbiBjbGFzcz0ib3BlcmF0b3IiPjo6PC9zcGFuPjxzcGFuIGNsYXNzPSJu
YW1lIj51bnBhY2s8L3NwYW4+PC9jb2RlPikgdGhhdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBm
b3JtZXIuPC9wPgo8cD5TZXZlcmFsIHBvc3NpYmxlIHN5bnRheGVzIGhhdmUgYmVlbiBwcm9w
b3NlZCwgaW5jbHVkaW5nIHBvc3RmaXggb3BlcmF0b3IgPHR0IGNsYXNzPSJkb2N1dGlscyBs
aXRlcmFsIj5+PC90dD4uIE91ciBwcmVmZXJlbmNlLCBob3dldmVyLCBpcyBwcmVmaXggb3Bl
cmF0b3IgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj5bOl08L3R0PiAoZm9yIHJlYXNv
bnMgdGhhdCB3aWxsIGJlIOKAlCB2ZXJ5IGJyaWVmbHkg4oCUIHNob3duIGxhdGVyKSwgd2hp
Y2ggd2Ugd2lsbCB1c2UgaGVyZSwgYWx3YXlzIGJlYXJpbmcgaW4gbWluZCB0aGF0IHRoaXMg
aXMgc3RyaWN0bHkgZm9yIGRlbW9uc3RyYXRpdmUgcHVycG9zZXMuIEZvciBleGFtcGxlOjwv
cD4KPHByZSBjbGFzcz0iY29kZSBjKysgbGl0ZXJhbC1ibG9jayI+CjxzcGFuIGNsYXNzPSJr
ZXl3b3JkIj5zdHJ1Y3Q8L3NwYW4+IDxzcGFuIGNsYXNzPSJwdW5jdHVhdGlvbiI+ezwvc3Bh
bj4gPHNwYW4gY2xhc3M9ImtleXdvcmQgdHlwZSI+ZG91YmxlPC9zcGFuPiA8c3BhbiBjbGFz
cz0ibmFtZSI+eDwvc3Bhbj48c3BhbiBjbGFzcz0icHVuY3R1YXRpb24iPiw8L3NwYW4+IDxz
cGFuIGNsYXNzPSJuYW1lIj55PC9zcGFuPjxzcGFuIGNsYXNzPSJwdW5jdHVhdGlvbiI+Ozwv
c3Bhbj4gPHNwYW4gY2xhc3M9InB1bmN0dWF0aW9uIj59PC9zcGFuPiA8c3BhbiBjbGFzcz0i
bmFtZSI+cG9pbnQ8L3NwYW4+IDxzcGFuIGNsYXNzPSJvcGVyYXRvciI+PTwvc3Bhbj4gPHNw
YW4gY2xhc3M9InB1bmN0dWF0aW9uIj4uLi47PC9zcGFuPgo8c3BhbiBjbGFzcz0ia2V5d29y
ZCI+YXV0bzwvc3Bhbj4gPHNwYW4gY2xhc3M9Im5hbWUiPmg8L3NwYW4+IDxzcGFuIGNsYXNz
PSJvcGVyYXRvciI+PTwvc3Bhbj4gPHNwYW4gY2xhc3M9Im5hbWUiPnN0ZDwvc3Bhbj48c3Bh
biBjbGFzcz0ib3BlcmF0b3IiPjo6PC9zcGFuPjxzcGFuIGNsYXNzPSJuYW1lIj5oeXBvdDwv
c3Bhbj48c3BhbiBjbGFzcz0icHVuY3R1YXRpb24iPihbPC9zcGFuPjxzcGFuIGNsYXNzPSJv
cGVyYXRvciI+Ojwvc3Bhbj48c3BhbiBjbGFzcz0icHVuY3R1YXRpb24iPl08L3NwYW4+PHNw
YW4gY2xhc3M9Im5hbWUiPnBvaW50PC9zcGFuPjxzcGFuIGNsYXNzPSJwdW5jdHVhdGlvbiI+
Li4uKTs8L3NwYW4+CjwvcHJlPgo8cD5UaGUgYWRkaXRpb24gb2Ygc3VjaCBhIGZlYXR1cmUs
IHJlZ2FyZGxlc3Mgb2YgaXRzIGZvcm08YSBjbGFzcz0iZm9vdG5vdGUtcmVmZXJlbmNlIiBo
cmVmPSIjdWYiIGlkPSJpZDIiPlsyXTwvYT4sIHdvdWxkIG9idmlhdGUgbW9zdCAodGhvdWdo
IHBlcmhhcHMgbm90IGFsbCkgdXNlIGNhc2VzIGZvciA8Y29kZSBjbGFzcz0iY3BwIGMrKyI+
PHNwYW4gY2xhc3M9Im5hbWUiPnN0ZDwvc3Bhbj48c3BhbiBjbGFzcz0ib3BlcmF0b3IiPjo6
PC9zcGFuPjxzcGFuIGNsYXNzPSJuYW1lIj5hcHBseTwvc3Bhbj48L2NvZGU+IGFuZCA8Y29k
ZSBjbGFzcz0iY3BwIGMrKyI+PHNwYW4gY2xhc3M9Im5hbWUiPnNkPC9zcGFuPjxzcGFuIGNs
YXNzPSJvcGVyYXRvciI+Ojo8L3NwYW4+PHNwYW4gY2xhc3M9Im5hbWUiPm1ha2VfZnJvbV90
dXBsZTwvc3Bhbj48L2NvZGU+LiBJdCB3b3VsZCBhbHNvIHBlcm1pdCB0cml2aWFsIGNvbnZl
cnNpb25zIGJldHdlZW4gZGlmZmVyZW50ICZxdW90O3NpbXBsZSZxdW90OyB0eXBlcyB3aGlj
aCBhcmUgZGlzdGluY3QgYnV0IGxheW91dCBjb21wYXRpYmxlLCBieSB1bnBhY2tpbmcgdGhl
IGZpcnN0IHR5cGUgaW50byBhIGJyYWNlZCBpbml0aWFsaXplciBsaXN0IHVzZWQgdG8gY29u
c3RydWN0IHRoZSBzZWNvbmQuIFdlIGJlbGlldmUgdGhhdCB0aGlzIGZlYXR1cmUgd2lsbCBi
ZSBhdCBsZWFzdCBhcyBpbXBvcnRhbnQgYW5kIHVzZWZ1bCBhcyBuYW1lLWJpbmRpbmcgdW5w
YWNraW5nLjwvcD4KPC9kaXY+CjxkaXYgY2xhc3M9InNlY3Rpb24iIGlkPSJ1bmlmaWNhdGlv
bi1vZi11bnBhY2tpbmciPgo8aDE+PGEgY2xhc3M9InRvYy1iYWNrcmVmIiBocmVmPSIjaWQx
NSI+VW5pZmljYXRpb24gb2YgVW5wYWNraW5nPC9hPjwvaDE+CjxwPlBvc3NpYmx5IHRoZSBt
b3N0IGltcG9ydGFudCBhc3BlY3Qgb2YgPGEgY2xhc3M9InJlZmVyZW5jZSBleHRlcm5hbCIg
aHJlZj0iaHR0cDovL3dnMjEubGluay9wMDE5NyI+UDAxOTc8L2E+IGluIG91ciBvcGluaW9u
IGlzIHRoZSBwcm92aXNpb24gZm9yIGEgc2luZ2xlLCB1bmlmaWVkIG1lY2hhbmlzbSBmb3Ig
dW5wYWNraW5nLCB3aGV0aGVyIGluIHRoZSBuYW1lLWJpbmRpbmcgb3IgZ2VuZXJhbGl6ZWQg
c2Vuc2VzLiBUaGUgY3JpdGljYWwgYXNwZWN0IG9mIDxhIGNsYXNzPSJyZWZlcmVuY2UgZXh0
ZXJuYWwiIGhyZWY9Imh0dHA6Ly93ZzIxLmxpbmsvcDAxOTciPlAwMTk3PC9hPiwgYW5kIHRo
ZSBvbmUgdGhhdCB3ZSBmZWVsIHN0cm9uZ2x5IG5lZWRzIHRvIGJlIGNvbnNpZGVyZWQgYnkg
PGEgY2xhc3M9InJlZmVyZW5jZSBleHRlcm5hbCIgaHJlZj0iaHR0cDovL3dnMjEubGluay9w
MDE0NCI+UDAxNDQ8L2E+LCBpcyBwcm92aWRpbmcgaW1wbGljaXQgZ2VuZXJhbCB0dXBsZS1s
aWtlIGFjY2VzcyB0byBzaW1wbGUgZGF0YSBzdHJ1Y3R1cmVzLiBJbiBwYXJ0aWN1bGFyLCB3
ZSBmZWVsIHRoYXQgaXQgd291bGQgYmUgYSB0cmF2ZXN0eSBmb3IgbmFtZS1iaW5kaW5nIHVu
cGFja2luZyBhbmQgZ2VuZXJhbGl6ZWQgdW5wYWNraW5nIHRvIHVzZSBkaWZmZXJlbnQgY3Vz
dG9taXphdGlvbiBwb2ludHMgb3IgdG8gb3RoZXJ3aXNlIGJlaGF2ZSBkaWZmZXJlbnRseSB3
aGVuIHVzZWQgaW4gd2F5cyB3aGVyZSBpbnR1aXRpb24gc3Ryb25nbHkgZXhwZWN0cyBlcXVp
dmFsZW50IGJlaGF2aW9yLiBJbiBwYXJ0aWN1bGFyLCB3ZSBmZWVsIHN0cm9uZ2x5IHRoYXQs
IGZvciBhIHR1cGxlLWxpa2UgdHlwZSBoYXZpbmcgYSBkZWZhdWx0IGRlc3RydWN0b3IsIHRo
ZSBmb2xsb3dpbmcgc2hvdWxkIGJlIGVxdWl2YWxlbnQgKGFmdGVyIG9wdGltaXphdGlvbnMp
OjwvcD4KPHByZSBjbGFzcz0iY29kZSBjKysgbGl0ZXJhbC1ibG9jayI+CjxzcGFuIGNsYXNz
PSJrZXl3b3JkIj5hdXRvPC9zcGFuPiA8c3BhbiBjbGFzcz0icHVuY3R1YXRpb24iPls8L3Nw
YW4+PHNwYW4gY2xhc3M9Im5hbWUiPng8L3NwYW4+PHNwYW4gY2xhc3M9InB1bmN0dWF0aW9u
Ij4sPC9zcGFuPiA8c3BhbiBjbGFzcz0ibmFtZSI+eTwvc3Bhbj48c3BhbiBjbGFzcz0icHVu
Y3R1YXRpb24iPl08L3NwYW4+IDxzcGFuIGNsYXNzPSJvcGVyYXRvciI+PTwvc3Bhbj4gPHNw
YW4gY2xhc3M9Im5hbWUiPnQ8L3NwYW4+PHNwYW4gY2xhc3M9InB1bmN0dWF0aW9uIj47PC9z
cGFuPgo8c3BhbiBjbGFzcz0ia2V5d29yZCI+YXV0bzwvc3Bhbj4gPHNwYW4gY2xhc3M9InB1
bmN0dWF0aW9uIj5bPC9zcGFuPjxzcGFuIGNsYXNzPSJuYW1lIj54PC9zcGFuPjxzcGFuIGNs
YXNzPSJwdW5jdHVhdGlvbiI+LDwvc3Bhbj4gPHNwYW4gY2xhc3M9Im5hbWUiPnk8L3NwYW4+
PHNwYW4gY2xhc3M9InB1bmN0dWF0aW9uIj5dPC9zcGFuPiA8c3BhbiBjbGFzcz0ib3BlcmF0
b3IiPj08L3NwYW4+IDxzcGFuIGNsYXNzPSJwdW5jdHVhdGlvbiI+e1s8L3NwYW4+PHNwYW4g
Y2xhc3M9Im9wZXJhdG9yIj46PC9zcGFuPjxzcGFuIGNsYXNzPSJwdW5jdHVhdGlvbiI+XTwv
c3Bhbj48c3BhbiBjbGFzcz0ibmFtZSI+dDwvc3Bhbj48c3BhbiBjbGFzcz0icHVuY3R1YXRp
b24iPi4uLn07PC9zcGFuPgo8L3ByZT4KPHA+KFRoaXMgaWxsdXN0cmF0ZXMgYSBuZWVkIHRv
IGJlIGNhcmVmdWwgd2l0aCBsaWZldGltZSBzZW1hbnRpY3M7IGluIHBhcnRpY3VsYXIsIHVu
cGFja2luZyBzaG91bGQgbGlrZWx5IGVpdGhlciBleHRlbmQgbGlmZXRpbWUgd2hlbiB1c2Vk
IGluIGEgYnJhY2VkIGluaXRpYWxpemVyIGxpc3QsIG9yIHNob3VsZCBleHBsaWNpdGx5IGNy
ZWF0ZSB2YWx1ZSBjb3BpZXMgaW4gc3VjaCBjYXNlLiBUaGUgZm9ybWVyIHdvdWxkIG1ha2Ug
dGhlIGFib3ZlIGVxdWl2YWxlbnQgZm9yIDxlbT5hbnk8L2VtPiB0dXBsZS1saWtlLCB3aGls
ZSB0aGUgbGF0dGVyIG1heSBiZSB1c2VmdWwgZm9yIHNlcGFyYXRpbmcgbGlmZXRpbWUgb2Yg
dGhlIHR1cGxlLWxpa2UgYW5kIGl0cyBjb21wb25lbnRzLiBXZSBkbyBub3QgcmVjb21tZW5k
IGEgZGlyZWN0aW9uIGF0IHRoaXMgdGltZSwgYWx0aG91Z2ggdGhpcyBpcyBsaWtlbHkgdG8g
YmUgb2YgcmVsZXZhbmNlIHdoZW4gY29uc2lkZXJpbmcgYSBsYW5ndWFnZSBzb2x1dGlvbiB2
ZXJzdXMgYSAmcXVvdDtsaWJyYXJ5JnF1b3Q7IHNvbHV0aW9uLik8L3A+CjxwPkl0IHNob3Vs
ZCBiZSBub3RlZCB0aGF0IDxhIGNsYXNzPSJyZWZlcmVuY2UgZXh0ZXJuYWwiIGhyZWY9Imh0
dHA6Ly93ZzIxLmxpbmsvcDAxOTciPlAwMTk3PC9hPiB3b3VsZCBwcm92aWRlIGEgbW9kZXN0
IGVuaGFuY2VtZW50IHRvIG5hbWUtYmluZGluZyB1bnBhY2tpbmcuIFdoZXJlIDxhIGNsYXNz
PSJyZWZlcmVuY2UgZXh0ZXJuYWwiIGhyZWY9Imh0dHA6Ly93ZzIxLmxpbmsvcDAxNDQiPlAw
MTQ0PC9hPiBsaW1pdHMgaXRzZWxmIHRvICZxdW90O2ZsYXQmcXVvdDsgY2xhc3NlcywgPGEg
Y2xhc3M9InJlZmVyZW5jZSBleHRlcm5hbCIgaHJlZj0iaHR0cDovL3dnMjEubGluay9wMDE5
NyI+UDAxOTc8L2E+IHdvdWxkIGV4dGVuZCBpbXBsaWNpdCB0dXBsZS1saWtlIGFjY2VzcyB0
byBhbGwgY2xhc3NlcyB3aGljaDo8L3A+CjxibG9ja3F1b3RlPgo8dWwgY2xhc3M9InNpbXBs
ZSI+CjxsaT5Db250YWluIG5vIG5vbi1wdWJsaWMgTlNETSdzPC9saT4KPGxpPkNvbnRhaW4g
bm8gbWVtYmVycyBvZiB1bmlvbiB0eXBlPC9saT4KPGxpPkhhdmUgbm8gdmlydHVhbDxhIGNs
YXNzPSJmb290bm90ZS1yZWZlcmVuY2UiIGhyZWY9IiN2YiIgaWQ9ImlkMyI+WzNdPC9hPiBh
bmQvb3Igbm9uLXB1YmxpYzxhIGNsYXNzPSJmb290bm90ZS1yZWZlcmVuY2UiIGhyZWY9IiNl
YiIgaWQ9ImlkNCI+WzRdPC9hPiBiYXNlIGNsYXNzZXM8L2xpPgo8bGk+SGF2ZSBubyBiYXNl
IGNsYXNzZXMgd2hpY2ggZG8gbm90IGFsc28gbWVldCB0aGUgcHJlY2VkaW5nIGVsaWdpYmls
aXR5IGNyaXRlcmlhPC9saT4KPC91bD4KPC9ibG9ja3F1b3RlPgo8cD5XaGlsZSBpdCB3b3Vs
ZCBub3QgYmUgYSBjYXRhc3Ryb3BoaWMgbG9zcyBpZiBub24tJnF1b3Q7ZmxhdCZxdW90OyBj
bGFzc2VzIHdlcmUgbm90IHN1cHBvcnRlZCwgd2UgZG8gZmVlbCB0aGF0IGl0IHdvdWxkIGJl
IG1vc3QgdW5mb3J0dW5hdGUgaWYgd2UgYXJlIG5vdCBhYmxlIOKAlCBldmVudHVhbGx5IOKA
lCB0byByZWx5IG9uIHRoaXMgaW1wbGljaXQgYWNjZXNzIHRvIGltcGxlbWVudCBuYW1lLWJp
bmRpbmcgdW5wYWNraW5nLCBhbmQgYWNjb3JkaW5nbHkgdG8gZWxpbWluYXRlIDxhIGNsYXNz
PSJyZWZlcmVuY2UgZXh0ZXJuYWwiIGhyZWY9Imh0dHA6Ly93ZzIxLmxpbmsvcDAxNDQiPlAw
MTQ0PC9hPiBjYXNlIDMuIEluIGFkZGl0aW9uIHRvIGNvbnNpc3RlbmN5LCB3ZSBmZWVsIHRo
YXQgdGhpcyBpcyBpbXBvcnRhbnQgZm9yIHRoZSBzYWtlIG9mIHNpbXBsaWNpdHksIGFzIGl0
IGVsaW1pbmF0ZXMgYSBzcGVjaWFsIGNhc2UgZnJvbSBuYW1lLWJpbmRpbmcgdW5wYWNraW5n
LiBXZSBhcmUgY29uZmlkZW50IHRoYXQgdGhlIHBlcmZvcm1hbmNlIGlzc3VlcyAodGhhdCBp
cywgdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBjYXNlIDMgcmVwcmVzZW50cyBuYW1lIGFsaWFz
aW5nIGFuZCBuZWl0aGVyIGNvbnN1bWVzIHN0b3JhZ2UgYmV5b25kIHRoYXQgcmVxdWlyZWQg
Zm9yIHRoZSB0dXBsZS1saWtlIGl0c2VsZiBub3IgYWRkcyBhbnkgYWNjZXNzIGluZGlyZWN0
aW9uKSBjYW4gYmUgc2F0aXNmYWN0b3JpbHkgYWRkcmVzc2VkIHRocm91Z2ggY29tcGlsZXIg
b3B0aW1pemF0aW9uLCBrZWVwaW5nIGluIG1pbmQgb2YgY291cnNlIHRoYXQgdGhlIGltcGxl
bWVudGF0aW9ucyBvZiB0aGUgJnF1b3Q7Z2V0JnF1b3Q7IGZ1bmN0aW9uIChob3dldmVyIHdl
IHVsdGltYXRlbHkgc3BlbGwgaXQpIGFyZSBpbmxpbmUgaW4gdGhlc2UgaW5zdGFuY2VzLjwv
cD4KPHA+VGhlIHByb2JsZW0gdGhhdCBhcmlzZXMgZnJvbSB0aGlzIGFwcHJvYWNoIGlzIGJp
dGZpZWxkIG1lbWJlcnMuIEF0IHRoZSAyMDE2IEphY2tzb252aWxsZSBtZWV0aW5nLCBhdCBs
ZWFzdCBvbmUgaW5kaXZpZHVhbCBleHByZXNzZWQgYSBzdHJvbmcgb3BpbmlvbiB0aGF0IHBy
b3ZpZGluZyByZWFkL3dyaXRlIGFjY2VzcyB0byBiaXRmaWVsZCBtZW1iZXJzIHZpYSBuYW1l
LWJpbmRpbmcgdW5wYWNraW5nIGlzIGEgJnF1b3Q7bXVzdCBoYXZlJnF1b3Q7IGZlYXR1cmUu
IFdlIGVuY291cmFnZSBnaXZpbmcgc2VyaW91cyBjb25zaWRlcmF0aW9uIHRvIHRoZSB0cnVl
IGltcG9ydGFuY2Ugb2YgdGhpcyBmZWF0dXJlLCBhbmQgdG8gd2F5cyB0aGF0IHRoaXMgY291
bGQgYmUgYWRkcmVzc2VkIGluIGEgd2F5IHRoYXQgZG9lcyBub3QgcmVxdWlyZSBzcGVjaWFs
IGNhc2luZy4gKEluIHBhcnRpY3VsYXIsIHdlIG5vdGUgdGhhdCB0aGUgZ2VuZXJhbCBhYmls
aXR5IHRvIGhhdmUgYSByZWZlcmVuY2UgdG8gYSBiaXRmaWVsZCDigJQgbGlrZWx5IHRocm91
Z2ggc29tZSBuZXcgbGlicmFyeSB0eXBlIOKAlCBzZWVtcyBhdCBsZWFzdCBhcyBpbnRlcmVz
dGluZyBhcyBiZWluZyBhYmxlIHRvIG5hbWUtYmluZCB0byBhIGNvbXBvbmVudCBvZiBzdWNo
IHR5cGUgb2YgYSB0dXBsZS1saWtlLik8L3A+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJzZWN0aW9u
IiBpZD0ic2xpY2luZyI+CjxoMT48YSBjbGFzcz0idG9jLWJhY2tyZWYiIGhyZWY9IiNpZDE2
Ij5TbGljaW5nPC9hPjwvaDE+CjxwPkluIG91ciBlYXJsaWVyIGRpc2N1c3Npb24gb24gPGEg
Y2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iI2FjY2VzcyI+QWNjZXNzPC9hPiwg
d2UgbWVudGlvbmVkIHN5bnRheCBmb3IgYWNjZXNzaW5nIHNwZWNpZmljIGVsZW1lbnRzIG9m
IGEgdHVwbGUtbGlrZS4gV2hpbGUgdGhlIG5lZWQgdG8gYWNjZXNzIGluZGl2aWR1YWwgZWxl
bWVudHMgaXMgb2J2aW91cyBhbmQgY2xlYXJseSBkb2VzIG5vdCByZXF1aXJlIGEgc3ludGFj
dGljIHNvbHV0aW9uICh3ZSBhbHJlYWR5IGhhdmUgPGNvZGUgY2xhc3M9ImNwcCBjKysiPjxz
cGFuIGNsYXNzPSJuYW1lIj5zdGQ8L3NwYW4+PHNwYW4gY2xhc3M9Im9wZXJhdG9yIj46Ojwv
c3Bhbj48c3BhbiBjbGFzcz0ibmFtZSI+Z2V0PC9zcGFuPjxzcGFuIGNsYXNzPSJvcGVyYXRv
ciI+Jmx0Ozwvc3Bhbj48c3BhbiBjbGFzcz0ibmFtZSI+Tjwvc3Bhbj48c3BhbiBjbGFzcz0i
b3BlcmF0b3IiPiZndDs8L3NwYW4+PC9jb2RlPiksIGFub3RoZXIgZGVzaXJlIHRoYXQgY29t
ZXMgdXAgb2Z0ZW4gaXMgdGhlIGFiaWxpdHkgdG8gc2xpY2UgYSB0dXBsZS1saWtlOyBlLmcu
IHRvIHN0cmlwIHRoZSBmaXJzdCBlbGVtZW50IG9yIHRha2Ugb25seSB0aGUgZmlyc3QgTiBl
bGVtZW50cy48L3A+CjxwPldlIGNob3NlIDxjb2RlIGNsYXNzPSJjcHAgYysrIj48c3BhbiBj
bGFzcz0icHVuY3R1YXRpb24iPls8L3NwYW4+PHNwYW4gY2xhc3M9Im9wZXJhdG9yIj46PC9z
cGFuPjxzcGFuIGNsYXNzPSJwdW5jdHVhdGlvbiI+XTwvc3Bhbj48L2NvZGU+IGJlY2F1c2Ug
aXQgbmF0dXJhbGx5IGV4dGVuZHMgdG8gc2xpY2luZywgYnV0IHZhcmlvdXMgcG9zc2libGUg
c29sdXRpb25zIGhhdmUgYmVlbiBzdWdnZXN0ZWQsIGluY2x1ZGluZyBwYWNrIGdlbmVyYXRv
cnMgKHdoaWNoIHdvdWxkIG9mZmVyIHNpZ25pZmljYW50IGV4cHJlc3NpdmUgcG93ZXIpLiBN
b3JlIGltcG9ydGFudGx5LCBzaW5jZSB3ZSByZWNvbW1lbmQgdGhhdCBnZW5lcmFsaXplZCB1
bnBhY2tpbmcgY29udmVydCBhIHR1cGxlLWxpa2UgdG8gYSBwYXJhbWV0ZXIgcGFjaywgaXQg
bWFrZXMgc2Vuc2UgdGhhdCBhIHN5bnRheCBmb3Igc2xpY2luZyB0dXBsZS1saWtlcyBzaG91
bGQgYWxzbyB3b3JrIG9uIHBhcmFtZXRlciBwYWNrcyBkaXJlY3RseS4gSW4gYWRkaXRpb24g
dG8gdGhlIGFkdmFudGFnZXMgZm9yIHR1cGxlLWxpa2VzLCB0aGlzIGVuYWJsZXMgc2ltcGxl
IGFuZCBwb3dlcmZ1bCB0cmFuc2Zvcm1hdGlvbnMgZm9yIHZhcmlhZGljIHRlbXBsYXRlcywg
dGh1cyBzYXRpc2Z5aW5nIGFub3RoZXIgaW1wb3J0YW50IGNvbnRlbXBvcmFyeSB1c2UgY2Fz
ZS4gSW4gcGFydGljdWxhciwgd2UgY2FuIG5vdyB3cml0ZSByZWN1cnNpdmUgdmFyaWFkaWMg
dGVtcGxhdGUgZnVuY3Rpb25zIGxpa2U6PC9wPgo8cHJlIGNsYXNzPSJjb2RlIGMrKyBsaXRl
cmFsLWJsb2NrIj4KPHNwYW4gY2xhc3M9ImtleXdvcmQgdHlwZSI+dm9pZDwvc3Bhbj4gPHNw
YW4gY2xhc3M9Im5hbWUgZnVuY3Rpb24iPnByaW50X2VhY2g8L3NwYW4+PHNwYW4gY2xhc3M9
InB1bmN0dWF0aW9uIj4oKTwvc3Bhbj4gPHNwYW4gY2xhc3M9InB1bmN0dWF0aW9uIj57fTwv
c3Bhbj4gPHNwYW4gY2xhc3M9ImNvbW1lbnQgc2luZ2xlIj4vLyBzZW50aW5lbAo8L3NwYW4+
CjxzcGFuIGNsYXNzPSJrZXl3b3JkIj50ZW1wbGF0ZTwvc3Bhbj4gPHNwYW4gY2xhc3M9Im9w
ZXJhdG9yIj4mbHQ7PC9zcGFuPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj50eXBlbmFtZTwvc3Bh
bj48c3BhbiBjbGFzcz0icHVuY3R1YXRpb24iPi4uLjwvc3Bhbj4gPHNwYW4gY2xhc3M9Im5h
bWUiPlQ8L3NwYW4+PHNwYW4gY2xhc3M9Im9wZXJhdG9yIj4mZ3Q7PC9zcGFuPgo8c3BhbiBj
bGFzcz0ia2V5d29yZCB0eXBlIj52b2lkPC9zcGFuPiA8c3BhbiBjbGFzcz0ibmFtZSI+cHJp
bnRfZWFjaDwvc3Bhbj48c3BhbiBjbGFzcz0icHVuY3R1YXRpb24iPig8L3NwYW4+PHNwYW4g
Y2xhc3M9Im5hbWUiPlQ8L3NwYW4+PHNwYW4gY2xhc3M9InB1bmN0dWF0aW9uIj4uLi48L3Nw
YW4+IDxzcGFuIGNsYXNzPSJuYW1lIj52YWx1ZXM8L3NwYW4+PHNwYW4gY2xhc3M9InB1bmN0
dWF0aW9uIj4pPC9zcGFuPgo8c3BhbiBjbGFzcz0icHVuY3R1YXRpb24iPns8L3NwYW4+CiAg
PHNwYW4gY2xhc3M9Im5hbWUiPnByaW50X29uZTwvc3Bhbj48c3BhbiBjbGFzcz0icHVuY3R1
YXRpb24iPihbPC9zcGFuPjxzcGFuIGNsYXNzPSJsaXRlcmFsIG51bWJlciBpbnRlZ2VyIj4w
PC9zcGFuPjxzcGFuIGNsYXNzPSJwdW5jdHVhdGlvbiI+XTwvc3Bhbj48c3BhbiBjbGFzcz0i
bmFtZSI+dmFsdWVzPC9zcGFuPjxzcGFuIGNsYXNzPSJwdW5jdHVhdGlvbiI+KTs8L3NwYW4+
CiAgPHNwYW4gY2xhc3M9Im5hbWUiPnByaW50X2VhY2g8L3NwYW4+PHNwYW4gY2xhc3M9InB1
bmN0dWF0aW9uIj4oWzwvc3Bhbj48c3BhbiBjbGFzcz0ibGl0ZXJhbCBudW1iZXIgaW50ZWdl
ciI+MTwvc3Bhbj48c3BhbiBjbGFzcz0ib3BlcmF0b3IiPjo8L3NwYW4+PHNwYW4gY2xhc3M9
InB1bmN0dWF0aW9uIj5dPC9zcGFuPjxzcGFuIGNsYXNzPSJuYW1lIj52YWx1ZXM8L3NwYW4+
PHNwYW4gY2xhc3M9InB1bmN0dWF0aW9uIj4pOzwvc3Bhbj4KPHNwYW4gY2xhc3M9InB1bmN0
dWF0aW9uIj59PC9zcGFuPgo8L3ByZT4KPHA+VGhpcyBpcyBhIGZhaXJseSB0cml2aWFsIGV4
YW1wbGUgdGhhdCBwcmV2aW91c2x5IGNvdWxkIGJlIHdyaXR0ZW4gYnkgYnJlYWtpbmcgdGhl
IGNvbXBsZXRlIHBhY2sgaW50byBhIHNlcGFyYXRlbHkgbmFtZWQgaGVhZCBhcmd1bWVudCBh
bmQgdGFpbCBwYWNrLiBUaGlzLCBob3dldmVyLCBtZXJlbHkgc2NyYXRjaGVzIHRoZSBzdXJm
YWNlLiBPbmUgY291bGQgaW1hZ2luZSBpbXBsZW1lbnRpbmcgYSA8Y29kZSBjbGFzcz0iY3Bw
IGMrKyI+PHNwYW4gY2xhc3M9Im5hbWUiPmNvbnN0ZXhwcjwvc3Bhbj48L2NvZGU+IGRpdmlk
ZS1hbmQtY29ucXVlciBzb3J0IGFsZ29yaXRobSB1c2luZyBzbGljaW5nIHRvIHRyaXZpYWxs
eSBzcGxpdCB0aGUgaW5jb21pbmcgcGFyYW1ldGVyIHBhY2sgaW4gaGFsZi4gTWFueSBvdGhl
ciBleGFtcGxlcyB3aGljaCBjYW4gYmUgcmVhZGlseSBpbXBsZW1lbnRlZCB3aXRoIHNsaWNp
bmcgYnV0IHdvdWxkIGJlIGRpZmZpY3VsdCBhbmQvb3IgZXhwZW5zaXZlIHRvIGltcGxlbWVu
dCBvdGhlcndpc2UgY2FuIGJlIGltYWdpbmVkLjwvcD4KPC9kaXY+CjxkaXYgY2xhc3M9InNl
Y3Rpb24iIGlkPSJwYWNrLWdlbmVyYXRpb24tcmV2aXNpdGVkIj4KPGgxPjxhIGNsYXNzPSJ0
b2MtYmFja3JlZiIgaHJlZj0iI2lkMTciPlBhY2sgR2VuZXJhdGlvbiwgUmV2aXNpdGVkPC9h
PjwvaDE+CjxwPlBhcmFtZXRlciBwYWNrIGdlbmVyYXRpb24gaXMsIGluIGdlbmVyYWwsIGFu
IGludGVyZXN0aW5nIGZlYXR1cmUuIFN1Z2dlc3RlZCBleGFtcGxlIHVzZXMgaW5jbHVkZSBn
ZW5lcmF0aW5nIGFuIGludGVnZXIgbGlzdDxhIGNsYXNzPSJmb290bm90ZS1yZWZlcmVuY2Ui
IGhyZWY9IiNpbCIgaWQ9ImlkNSI+WzVdPC9hPiwgYSB0eXBlIGxpc3QsIGFuZCBwZXJmb3Jt
aW5nIHZhcmlvdXMgbWFuaXB1bGF0aW9ucyBvbiBwYXJhbWV0ZXIgcGFja3MuIFdoaWxlIHN1
Y2ggbWFuaXB1bGF0aW9ucyBjb3VsZCBpbmNsdWRlIHNsaWNpbmcgYW5kIHJldmVyc2luZywg
d2Ugbm90ZSB0aGF0IHRoZXNlIG9wZXJhdGlvbnMgYXBwZWFyIHRvIHJlbHkgb24gYSBzeW50
YWN0aWMgbWVjaGFuaXNtIGZvciBleHRyYWN0aW5nIGEgc2luZ2xlIGVsZW1lbnQgZnJvbSBh
IHBhY2sgKHJlZmVyZW5jZSBpcyBtYWRlIHRvIDxhIGNsYXNzPSJyZWZlcmVuY2UgZXh0ZXJu
YWwiIGhyZWY9Imh0dHA6Ly93ZzIxLmxpbmsvbjQyMzUiPk40MjM1PC9hPikuIFdlIGFsc28g
d29uZGVyIGlmIHNsaWNpbmcgb3BlcmF0aW9ucyBpbXBsZW1lbnRlZCBpbiB0aGlzIG1hbm5l
ciB3b3VsZCBwZXJmb3JtIHNhdGlzZmFjdG9yaWx5IGNvbXBhcmVkIHRvIHN5bnRhY3RpYyBz
bGljaW5nLjwvcD4KPHA+Q29uc2VxdWVudGx5LCB3ZSBzdGlsbCBuZWVkIGEgc3ludGF4IGZv
ciBpbmRleGVkIGFjY2VzcyBvZiBwYXJhbWV0ZXIgcGFjayBlbGVtZW50cy4gVGhpcyBpbiB0
dXJuIGFsbG93cyB1cyB0byBhcHBseSB0aGUgcHJldmlvdXMgYXJndW1lbnQgaW4gcmV2ZXJz
ZTsgbmFtZWx5LCB3aHkgbm90IHNlbGVjdCBhIHN5bnRheCB0aGF0IGlzIG5vbi1hbWJpZ3Vv
dXMsIGVhc2lseSBleHRlbmRlZCB0byBzbGljaW5nLCBhbmQgbWF5IGJlIGFwcGxpZWQgYWxz
byB0byB0dXBsZS1saWtlcz8gVGhpcyBpcyBhIHBvaW50IHRoYXQgd2UgZmVlbCBpcyB3b3J0
aCBzZXJpb3VzIGNvbnNpZGVyYXRpb24gYXMgd2UgY29uc2lkZXIgd2hhdCBkaXJlY3Rpb24g
Z2VuZXJhbGl6ZWQgdW5wYWNraW5nIHNob3VsZCB0YWtlLjwvcD4KPC9kaXY+CjxkaXYgY2xh
c3M9InNlY3Rpb24iIGlkPSJzdW1tYXJ5Ij4KPGgxPjxhIGNsYXNzPSJ0b2MtYmFja3JlZiIg
aHJlZj0iI2lkMTgiPlN1bW1hcnk8L2E+PC9oMT4KPHA+UHJldmlvdXMgZGlzY3Vzc2lvbnMg
4oCUIGJvdGggaW4gRVdHIGFuZCBvbiB0aGUgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFs
Ij48c3BhbiBjbGFzcz0icHJlIj5zdGQtcHJvcG9zYWxzPC9zcGFuPjwvdHQ+IGZvcnVtIOKA
lCBzdWdnZXN0IGEgc3Ryb25nIGRlc2lyZSBieSB0aGUgQysrIGNvbW11bml0eSB0byBtb3Zl
IHRoZSBsYW5ndWFnZSBpbiBhIGRpcmVjdGlvbiB0aGF0IGJsdXJzIHRoZSBsaW5lIGJldHdl
ZW4gY29udGFpbmVycyBhbmQgdGhlaXIgY29udGFpbmVkIHZhbHVlIHNlcXVlbmNlcywgbWFr
aW5nIGl0IGVhc3kgdG8gbW92ZSBmcm9tIG9uZSB0byB0aGUgb3RoZXIsIGFzIGlzIG9mdGVu
IGZvdW5kIGluIG90aGVyIGxhbmd1YWdlcyAoZS5nLiBQeXRob24pLiBBdCB0aGUgc2FtZSB0
aW1lLCB0aGVyZSBhcmUgYSBudW1iZXIgb2YgcHJvcG9zYWxzIGVpdGhlciBwdWJsaXNoZWQg
b3IgaW4gdGhlIHdvcmtzIHRvIHNpbXBsaWZ5IHdvcmtpbmcgd2l0aCBwYXJhbWV0ZXIgcGFj
a3MuIE1vcmVvdmVyLCBkdWUgdG8gdGhlIHNpZ25pZmljYW50IHV0aWxpdHkgb2YgdW5wYWNr
aW5nIGFuZCBvdGhlcndpc2Ugd29ya2luZyB3aXRoIHR1cGxlLWxpa2Ugb2JqZWN0cyBhcyBw
YXJhbWV0ZXIgcGFja3MsIHRoZXNlIGFyZWFzIGFyZSBjbG9zZWx5IHJlbGF0ZWQgYW5kIHRv
IHNvbWUgZXh0ZW50IG92ZXJsYXAuPC9wPgo8cD5XZSBoYXZlIG9ic2VydmVkIHJlY2VudGx5
IHRoYXQgJnF1b3Q7Y29tcGxleGl0eSZxdW90OyBpcyBhIGZyZXF1ZW50IGNvbXBsYWludCBt
YWRlIGFnYWluc3QgQysrLCBlc3BlY2lhbGx5IHRoYXQgaXQgaXMgJnF1b3Q7aGFyZCB0byB0
ZWFjaCZxdW90Oy4gQXMgd2UgY29uc2lkZXIgZmVhdHVyZXMgdG8gc2ltcGxpZnkgd29ya2lu
ZyB3aXRoIHR1cGxlLWxpa2Ugb2JqZWN0cyBhbmQvb3IgcGFyYW1ldGVyIHBhY2tzLCB3ZSBm
ZWVsIGl0IGlzIG9mIHV0bW9zdCBpbXBvcnRhbmNlIHRvIGVzdGFibGlzaCBhbmQgYWRoZXJl
IHRvIGEgY29uc2lzdGVudCB2aXNpb24gb2YgdGhlc2UgZnVuY3Rpb25zLCBpbiB0ZXJtcyBv
ZiBib3RoIHN5bnRheCBhbmQgZnVuY3Rpb24uIFdlIHNwZWNpZmljYWxseSB1cmdlIHRoYXQg
bmFtZS1iaW5kaW5nIHVucGFja2luZyB3b3VsZCBjYXJlZnVsbHkgY29uc2lkZXIgY3VzdG9t
aXphdGlvbiBwb2ludHM8YSBjbGFzcz0iZm9vdG5vdGUtcmVmZXJlbmNlIiBocmVmPSIjY3Ai
IGlkPSJpZDYiPls2XTwvYT4gYW5kIHRoZSBmdXR1cmUgcG9zc2liaWxpdHkgb2YgaW1wbGlj
aXQgdHVwbGUtbGlrZSBhY2Nlc3MgKHNlZSBlc3BlY2lhbGx5IDxhIGNsYXNzPSJyZWZlcmVu
Y2UgZXh0ZXJuYWwiIGhyZWY9Imh0dHA6Ly93ZzIxLmxpbmsvcDAxOTciPlAwMTk3PC9hPikg
YW5kIGdlbmVyYWxpemVkIHVucGFja2luZyBpbiBvcmRlciB0byB3b3JrIHRvd2FyZDxhIGNs
YXNzPSJmb290bm90ZS1yZWZlcmVuY2UiIGhyZWY9IiNmZCIgaWQ9ImlkNyI+WzddPC9hPiBh
IGNvbW1vbiBtZWNoYW5pc20gZm9yIGJvdGggdGhhdCB3b3VsZCBlbGltaW5hdGUgc3BlY2lh
bCBjYXNlIHJ1bGVzIHNwZWNpZmljIHRvIHRoZSBpbmRpdmlkdWFsIGZlYXR1cmVzLiBXZSBh
bHNvIHVyZ2UgdGhlIGNvbW1pdHRlZSB0byBjb25zaWRlciB0aGVzZSBpc3N1ZXMgYW5kIGhv
dyBzdWNoIGZlYXR1cmVzIHJlbGF0ZSAob3IgY2FuIGJlIG1hZGUgdG8gcmVsYXRlKSB0byB0
dXBsZS1saWtlIG9iamVjdHMgaW4gb3JkZXIgdG8gbWF4aW1pemUgY29uc2lzdGVuY3kgb2Yg
b3BlcmF0aW9ucyBvbiBib3RoIG9iamVjdCB0eXBlcywgYW5kIHdlIHVyZ2UgYXV0aG9ycyB3
b3JraW5nIG9uIHN1Y2ggcHJvcG9zYWxzIHRvIGRvIGxpa2V3aXNlLiBGaW5hbGx5LCB3ZSBz
dHJvbmdseSBlbmNvdXJhZ2UgYW55IGF1dGhvcnMgd29ya2luZyBpbiB0aGlzIHJlYWxtIHRv
IG1haW50YWluIGNvbW11bmljYXRpb24gaW4gb3JkZXIgdG8gcmVkdWNlIHRoZSBkYW5nZXJz
IG9mIGNvbXBldGluZywgaW5jb21wYXRpYmxlIHByb3Bvc2FscyBhbmQgdG8gbWF4aW1pemUg
b3VyIGFiaWxpdHkgYXMgYSBjb21tdW5pdHkgdG8gcHVyc3VlIGEgd2VsbCBjb25zaWRlcmVk
LCBjb25zaXN0ZW50LCBhbmQgbWF4aW1hbGx5IGZ1bmN0aW9uYWwgZGlyZWN0aW9uLjwvcD4K
PHA+Qnkgb2ZmZXJpbmcgYSBnbGltcHNlIGF0IHdoZXJlIHdlIG1pZ2h0IGJlIGdvaW5nLCB3
ZSBob3BlIHdlIGhhdmUgZGVtb25zdHJhdGVkIHRoZSBpbXBvcnRhbmNlIG9mIGtlZXBpbmcg
dGhlIGZ1dHVyZSBpbiBtaW5kIHdoaWxlIGRldmVsb3BpbmcgbmV3IGFuZCBleGNpdGluZyBm
ZWF0dXJlcyB0b2RheS4gV2UgZXNwZWNpYWxseSBob3BlIHdlIGhhdmUgZGVtb25zdHJhdGVk
IHRoZSBpbXBvcnRhbmNlIG9mIGNvbnNpZGVyaW5nIHRoZSBkaXJlY3Rpb24gcHJvcG9zZWQg
YnkgPGEgY2xhc3M9InJlZmVyZW5jZSBleHRlcm5hbCIgaHJlZj0iaHR0cDovL3dnMjEubGlu
ay9wMDE5NyI+UDAxOTc8L2E+IChpbXBsaWNpdCB0dXBsZS1saWtlIGFjY2VzcyBmb3IgJnF1
b3Q7c2ltcGxlJnF1b3Q7IHR5cGVzKSBpbiBsaWdodCBvZiA8YSBjbGFzcz0icmVmZXJlbmNl
IGV4dGVybmFsIiBocmVmPSJodHRwOi8vd2cyMS5saW5rL3AwMTQ0Ij5QMDE0NDwvYT4gKG5h
bWUtYmluZGluZyB1bnBhY2tpbmcpIGluIG9yZGVyIHRvIG1haW50YWluIGNvbnNpc3RlbmN5
IGFuZCBzaW1wbGljaXR5IG9mIHNwZWNpZmljYXRpb24gaW4gb3JkZXIgdG8gbWF4aW1pemUg
dGhlIGFiaWxpdHkgb2YgdXNlcnMgdG8gdW5kZXJzdGFuZCB0aGUgb3BlcmF0aW9uIG9mIHRo
ZXNlIGZlYXR1cmVzIGFuZCB0byB1c2UgdGhlbSBpbiBhIHNlbnNpYmxlIG1hbm5lci48L3A+
CjwvZGl2Pgo8ZGl2IGNsYXNzPSJzZWN0aW9uIiBpZD0iYWNrbm93bGVkZ21lbnRzIj4KPGgx
PjxhIGNsYXNzPSJ0b2MtYmFja3JlZiIgaHJlZj0iI2lkMTkiPkFja25vd2xlZGdtZW50czwv
YT48L2gxPgo8cD5XZSB3b3VsZCBsaWtlIHRvIHRoYW5rIHRoZSBhdXRob3JzIG9mIDxhIGNs
YXNzPSJyZWZlcmVuY2UgZXh0ZXJuYWwiIGhyZWY9Imh0dHA6Ly93ZzIxLmxpbmsvcDAxNDQi
PlAwMTQ0PC9hPiwgZm9yIG9idmlvdXMgcmVhc29ucy4gV2Ugd291bGQgbGlrZSB0byB0aGFu
ayBNaWtlIFNwZXJ0dXMgYW5kIERhdmVlZCBWYW5kZXZvb3JkZSBmb3Igc2hhcmluZyBhICZx
dW90O3ByZXZpZXcmcXVvdDsgb2YgdGhlaXIgcmVzcGVjdGl2ZSB3b3Jrcy1pbi1wcm9ncmVz
cyBpbiB0aGUgYXJlYSBvZiBwYXJhbWV0ZXIgcGFja3MuIFdlIHdvdWxkIGxpa2UgdG8gdGhh
bmtzIERhbmllbCBGcmV5IGZvciBoaXMgb3duIHdvcmsgb24gcGFyYW1ldGVyIHBhY2tzLCB3
aGljaCBhbHNvIGZvcmNlZCB1cyB0byBjb25zaWRlciB0aGUgZGVmZW5zZSBvdXIgb3duIHBy
ZWZlcmVuY2VzIG1vcmUgc3RyZW51b3VzbHkgdGhhbiBoYWQgYmVlbiBkb25lIGJlZm9yZS4g
QXMgYWx3YXlzLCB3ZSB3b3VsZCBhbHNvIGxpa2UgdG8gdGhhbmsgZXZlcnlvbmUgdGhhdCBo
YXMgc2hhcmVkIHRoZWlyIHRob3VnaHRzIGFuZCBpZGVhcyBvbiB0aGVzZSBpc3N1ZXMsIGJv
dGggaW4gcGVyc29uIGF0IHRoZSAyMDE2IEphY2tzb252aWxsZSBtZWV0aW5nIGFuZCBvbiA8
dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPnN0ZC1wcm9w
b3NhbHM8L3NwYW4+PC90dD4uPC9wPgo8L2Rpdj4KPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9
ImZvb3Rub3RlcyI+CjxoMT48YSBjbGFzcz0idG9jLWJhY2tyZWYiIGhyZWY9IiNpZDIwIj5G
b290bm90ZXM8L2E+PC9oMT4KPHRhYmxlIGNsYXNzPSJkb2N1dGlscyBmb290bm90ZSIgZnJh
bWU9InZvaWQiIGlkPSJwdCIgcnVsZXM9Im5vbmUiPgo8Y29sZ3JvdXA+PGNvbCBjbGFzcz0i
bGFiZWwiIC8+PGNvbCAvPjwvY29sZ3JvdXA+Cjx0Ym9keSB2YWxpZ249InRvcCI+Cjx0cj48
dGQgY2xhc3M9ImxhYmVsIj48YSBjbGFzcz0iZm4tYmFja3JlZiIgaHJlZj0iI2lkMSI+WzFd
PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJyZWZlcmVuY2UgZXh0ZXJuYWwiIGhyZWY9Imh0dHA6
Ly9kb2MucXQuaW8vcXQtNS42L3F2ZWN0b3IzZC5odG1sIj5RVmVjdG9yM0Q8L2E+IGNvbWVz
IHRvIG1pbmQgYXMgYW4gZXhhbXBsZSBvZiBhIHVzZXIgdHlwZSB3aGljaCBpcyDigJQgb3Ig
YXQgbGVhc3QsIG91Z2h0IHRvIGJlIOKAlCB0dXBsZS1saWtlIGJ1dCBoYXMgbm8gcHVibGlj
IGRhdGEgbWVtYmVycy48L3RkPjwvdHI+CjwvdGJvZHk+CjwvdGFibGU+Cjx0YWJsZSBjbGFz
cz0iZG9jdXRpbHMgZm9vdG5vdGUiIGZyYW1lPSJ2b2lkIiBpZD0idWYiIHJ1bGVzPSJub25l
Ij4KPGNvbGdyb3VwPjxjb2wgY2xhc3M9ImxhYmVsIiAvPjxjb2wgLz48L2NvbGdyb3VwPgo8
dGJvZHkgdmFsaWduPSJ0b3AiPgo8dHI+PHRkIGNsYXNzPSJsYWJlbCI+PGEgY2xhc3M9ImZu
LWJhY2tyZWYiIGhyZWY9IiNpZDIiPlsyXTwvYT48L3RkPjx0ZD5UaGUgZm9ybSB0aGF0IHVu
cGFja2luZyB0YWtlcyBpcyBub3QgZW50aXJlbHkgdW5pbnRlcmVzdGluZywgaG93ZXZlciBz
dWNoIGRpc2N1c3Npb24gaXMgbm90IGluIHNjb3BlIGZvciB0aGlzIHBhcGVyLjwvdGQ+PC90
cj4KPC90Ym9keT4KPC90YWJsZT4KPHRhYmxlIGNsYXNzPSJkb2N1dGlscyBmb290bm90ZSIg
ZnJhbWU9InZvaWQiIGlkPSJ2YiIgcnVsZXM9Im5vbmUiPgo8Y29sZ3JvdXA+PGNvbCBjbGFz
cz0ibGFiZWwiIC8+PGNvbCAvPjwvY29sZ3JvdXA+Cjx0Ym9keSB2YWxpZ249InRvcCI+Cjx0
cj48dGQgY2xhc3M9ImxhYmVsIj48YSBjbGFzcz0iZm4tYmFja3JlZiIgaHJlZj0iI2lkMyI+
WzNdPC9hPjwvdGQ+PHRkPldoaWxlIHByZXNlbnQgaW4gdGhlIGluaXRpYWwgcmV2aXNpb24g
b2YgPGEgY2xhc3M9InJlZmVyZW5jZSBleHRlcm5hbCIgaHJlZj0iaHR0cDovL3dnMjEubGlu
ay9wMDE5NyI+UDAxOTc8L2E+LCB0aGlzIHJlc3RyaWN0aW9uIGlzIG5vdCBzZWVuIGluIDxh
IGNsYXNzPSJyZWZlcmVuY2UgZXh0ZXJuYWwiIGhyZWY9Imh0dHA6Ly93ZzIxLmxpbmsvcDAx
NDQiPlAwMTQ0PC9hPiwgYW5kIHVwb24gZnVydGhlciBjb25zaWRlcmF0aW9uLCBtYXkgYmUg
dW5uZWNlc3NhcnkuPC90ZD48L3RyPgo8L3Rib2R5Pgo8L3RhYmxlPgo8dGFibGUgY2xhc3M9
ImRvY3V0aWxzIGZvb3Rub3RlIiBmcmFtZT0idm9pZCIgaWQ9ImViIiBydWxlcz0ibm9uZSI+
Cjxjb2xncm91cD48Y29sIGNsYXNzPSJsYWJlbCIgLz48Y29sIC8+PC9jb2xncm91cD4KPHRi
b2R5IHZhbGlnbj0idG9wIj4KPHRyPjx0ZCBjbGFzcz0ibGFiZWwiPjxhIGNsYXNzPSJmbi1i
YWNrcmVmIiBocmVmPSIjaWQ0Ij5bNF08L2E+PC90ZD48dGQ+VGhpcyBjb3VsZCBwcm9iYWJs
eSBiZSByZWxheGVkIHRvIG5vbi1wdWJsaWMgPGVtPmFuZCBub24tZW1wdHk8L2VtPiBiYXNl
IGNsYXNzZXMsIGlmIGRlc2lyZWQuPC90ZD48L3RyPgo8L3Rib2R5Pgo8L3RhYmxlPgo8dGFi
bGUgY2xhc3M9ImRvY3V0aWxzIGZvb3Rub3RlIiBmcmFtZT0idm9pZCIgaWQ9ImlsIiBydWxl
cz0ibm9uZSI+Cjxjb2xncm91cD48Y29sIGNsYXNzPSJsYWJlbCIgLz48Y29sIC8+PC9jb2xn
cm91cD4KPHRib2R5IHZhbGlnbj0idG9wIj4KPHRyPjx0ZCBjbGFzcz0ibGFiZWwiPjxhIGNs
YXNzPSJmbi1iYWNrcmVmIiBocmVmPSIjaWQ1Ij5bNV08L2E+PC90ZD48dGQ+VGhlIHB1cmVs
eSB0ZW1wbGF0ZSBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZSBjbGFzcz0iY3BwIGMrKyI+PHNw
YW4gY2xhc3M9Im5hbWUiPnN0ZDwvc3Bhbj48c3BhbiBjbGFzcz0ib3BlcmF0b3IiPjo6PC9z
cGFuPjxzcGFuIGNsYXNzPSJuYW1lIj5pbnRlZ2VyX3NlcXVlbmNlPC9zcGFuPjwvY29kZT4g
aXMgZXh0cmVtZWx5IGV4cGVuc2l2ZSwgdG8gdGhlIHBvaW50IHRoYXQgbWFueSBjb21waWxl
cnMgYXJlIHByb3ZpZGluZyBpbXBsZW1lbnRhdGlvbnMgYmFzZWQgb24gY29tcGlsZXIgaW50
cmluc2ljcy4gUGFyYW1ldGVyIHBhY2sgZ2VuZXJhdG9ycyBoYXZlIHRoZSBwb3RlbnRpYWwg
dG8gcHJvdmlkZSBhIHNhdGlzZmFjdG9yeSBpbXBsZW1lbnRhdGlvbiB3aXRob3V0IHN1Y2gg
aW50cmluc2ljcy48L3RkPjwvdHI+CjwvdGJvZHk+CjwvdGFibGU+Cjx0YWJsZSBjbGFzcz0i
ZG9jdXRpbHMgZm9vdG5vdGUiIGZyYW1lPSJ2b2lkIiBpZD0iY3AiIHJ1bGVzPSJub25lIj4K
PGNvbGdyb3VwPjxjb2wgY2xhc3M9ImxhYmVsIiAvPjxjb2wgLz48L2NvbGdyb3VwPgo8dGJv
ZHkgdmFsaWduPSJ0b3AiPgo8dHI+PHRkIGNsYXNzPSJsYWJlbCI+PGEgY2xhc3M9ImZuLWJh
Y2tyZWYiIGhyZWY9IiNpZDYiPls2XTwvYT48L3RkPjx0ZD5JdCBpcyBvdXIgdW5kZXJzdGFu
ZGluZyB0aGF0IHRoZSBjb21taXR0ZWUgYW5kIHRoZSBhdXRob3JzIG9mIDxhIGNsYXNzPSJy
ZWZlcmVuY2UgZXh0ZXJuYWwiIGhyZWY9Imh0dHA6Ly93ZzIxLmxpbmsvcDAxNDQiPlAwMTQ0
PC9hPiBhcmUgd2VsbCBhd2FyZSBvZiB0aGUgc3Ryb25nIGZlZWxpbmdzIHN1cnJvdW5kaW5n
IGN1c3RvbWl6YXRpb24gcG9pbnRzIGFuZCA8ZW0+YXJlPC9lbT4gZ2l2aW5nIHRoZW0gc2Vy
aW91cyBjb25zaWRlcmF0aW9uLiBXZSB3aXNoIHRvIHRha2UgdGhpcyBvcHBvcnR1bml0eSB0
byB0aGFuayBhbmQgY29tbWVuZCB0aGVtIGZvciB0aGVzZSBlZmZvcnRzLjwvdGQ+PC90cj4K
PC90Ym9keT4KPC90YWJsZT4KPHRhYmxlIGNsYXNzPSJkb2N1dGlscyBmb290bm90ZSIgZnJh
bWU9InZvaWQiIGlkPSJmZCIgcnVsZXM9Im5vbmUiPgo8Y29sZ3JvdXA+PGNvbCBjbGFzcz0i
bGFiZWwiIC8+PGNvbCAvPjwvY29sZ3JvdXA+Cjx0Ym9keSB2YWxpZ249InRvcCI+Cjx0cj48
dGQgY2xhc3M9ImxhYmVsIj48YSBjbGFzcz0iZm4tYmFja3JlZiIgaHJlZj0iI2lkNyI+Wzdd
PC9hPjwvdGQ+PHRkPldlIHdvdWxkIGxpa2UgdG8gcmVpdGVyYXRlIHRoYXQgd2UgaGF2ZSBu
byBvYmplY3Rpb24gdG8gc3BlY2lhbCBjYXNlIGhhbmRsaW5nIG9mICZxdW90O2ltcGxpY2l0
bHkgdHVwbGUtbGlrZSZxdW90OyB0eXBlcyBpbiB0aGUgc2hvcnQgdGVybSwgZXNwZWNpYWxs
eSBpZiBpdCBtZWFucyBuYW1lLWJpbmRpbmcgdW5wYWNraW5nIGlzIGF2YWlsYWJsZSBpbiBD
KysxNywgPGVtPnByb3ZpZGVkPC9lbT4gdGhlcmUgaXMgYSBsb25nIHRlcm0gbWlncmF0aW9u
IHJvdXRlIHRoYXQgd291bGQgYWxsb3cgdGhpcyBzcGVjaWFsIGNhc2UgdG8gYmUgcmVwbGFj
ZWQgd2l0aCBtb3JlIGdlbmVyYWxpemVkIGZ1bmN0aW9uYWxpdHkuPC90ZD48L3RyPgo8L3Ri
b2R5Pgo8L3RhYmxlPgo8L2Rpdj4KPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9InJlZmVyZW5j
ZXMiPgo8aDE+PGEgY2xhc3M9InRvYy1iYWNrcmVmIiBocmVmPSIjaWQyMSI+UmVmZXJlbmNl
czwvYT48L2gxPgo8dWw+CjxsaT48cCBjbGFzcz0iZmlyc3QiPjxhIGNsYXNzPSJyZWZlcmVu
Y2UgZXh0ZXJuYWwiIGhyZWY9Imh0dHA6Ly93ZzIxLmxpbmsvbjQyMzUiPk40MjM1PC9hPiBT
ZWxlY3RpbmcgZnJvbSBQYXJhbWV0ZXIgUGFja3M8L3A+CjxwPjxhIGNsYXNzPSJyZWZlcmVu
Y2UgZXh0ZXJuYWwiIGhyZWY9Imh0dHA6Ly93ZzIxLmxpbmsvbjQyMzUiPmh0dHA6Ly93ZzIx
LmxpbmsvbjQyMzU8L2E+PC9wPgo8L2xpPgo8L3VsPgo8dWw+CjxsaT48cCBjbGFzcz0iZmly
c3QiPjxhIGNsYXNzPSJyZWZlcmVuY2UgZXh0ZXJuYWwiIGhyZWY9Imh0dHA6Ly93ZzIxLmxp
bmsvcDAxNDQiPlAwMTQ0PC9hPiBTdHJ1Y3R1cmVkIEJpbmRpbmdzPC9wPgo8cD48YSBjbGFz
cz0icmVmZXJlbmNlIGV4dGVybmFsIiBocmVmPSJodHRwOi8vd2cyMS5saW5rL3AwMTQ0Ij5o
dHRwOi8vd2cyMS5saW5rL3AwMTQ0PC9hPjwvcD4KPC9saT4KPC91bD4KPHVsPgo8bGk+PHAg
Y2xhc3M9ImZpcnN0Ij48YSBjbGFzcz0icmVmZXJlbmNlIGV4dGVybmFsIiBocmVmPSJodHRw
Oi8vd2cyMS5saW5rL3AwMTk3Ij5QMDE5NzwvYT4gRGVmYXVsdCBUdXBsZS1saWtlIEFjY2Vz
czwvcD4KPHA+PGEgY2xhc3M9InJlZmVyZW5jZSBleHRlcm5hbCIgaHJlZj0iaHR0cDovL3dn
MjEubGluay9wMDE5NyI+aHR0cDovL3dnMjEubGluay9wMDE5NzwvYT48L3A+CjwvbGk+Cjwv
dWw+CjwhLS0gLi4gLi4gLi4gLi4gLi4gLi4gLi4gLi4gLi4gLi4gLi4gLi4gLi4gLi4gLi4g
Li4gLi4gLi4gLi4gLi4gLi4gLi4gLi4gLi4gLi4gLS0+CjwhLS0ga2F0ZTogaGwgcmVTdHJ1
Y3R1cmVkVGV4dCAtLT4KPC9kaXY+CjwvZGl2Pgo8L2JvZHk+CjwvaHRtbD4K
--------------060305020907090604080801
Content-Type: text/prs.fallenstein.rst;
 name="dxxxx-tuple-like-unified-vision.rst"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
 filename="dxxxx-tuple-like-unified-vision.rst"

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D
  A Unified Vision for Manipulating Tuple-like Objects
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D

:Document:  DXXXXR0 (TBD)
:Date:      2016-03-18
:Project:   ISO/IEC JTC1 SC22 WG21 Programming Language C++
:Audience:  Evolution Working Group
:Author:    Matthew Woehlke (mwoehlke.floss@gmail.com)

=2E. raw:: html

  <style>
    html { color: black; background: white; }
    table.docinfo { margin: 2em 0; }
  </style>

=2E. role:: cpp(code)
   :language: c++


Abstract
=3D=3D=3D=3D=3D=3D=3D=3D

There is much activity and discussion surrounding tuple-like objects, wit=
h many features being requested and many papers submitted or planned. It =
is important that we establish a plan for where we are going that takes i=
nto account future directions in order to avoid overcomplicating the lang=
uage or painting ourselves into a corner of incompatible features.

=2E. contents::


Background
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

At the 2016 Jacksonville meeting, P0144_ was discussed for the second tim=
e. Reception was generally positive, but some issues remained to be addre=
ssed. It seems quite clear that this is a desired direction for C++. Unfo=
rtunately, P0197_, which was scheduled for presentation and has some impa=
ct on the direction which P0144_ is following, was skipped due to time co=
nstraints.

Discussion on the ``std-proposals`` forum often brings up the desire to e=
xtend use of "tuple-like" objects to contexts other than name binding (i.=
e. P0144_). There is also significant and related discussion on improving=
 the usability of parameter packs. We feel that several of these areas ar=
e closely related and warrant the formation of a concrete and unified vis=
ion for future direction.


Preface
=3D=3D=3D=3D=3D=3D=3D

We present several suggestions in this paper, along with accompanying syn=
tax. We must stress *emphatically* that this paper is not intended to pro=
pose any features in and of itself (that will come later). Rather, we wis=
h to outline several areas of anticipated future development which we fee=
l need to be explored and, in particular, considered by other proposals b=
eing put forward, especially P0144_. While some brief statements are made=
 as to our choices, we urge the reader to keep in mind that syntax shown =
is used in this context only as a tool to communicate examples of the fut=
ure feature space, and not to get hung up on minor quibbles. In particula=
r, our most immediate concern is for unification of implementation detail=
s related to unpacking and customization points of the same. While we fee=
l also that similar considerations are important with respect to paramete=
r packs, that feature space is less mature, and accordingly the need for =
a consolidated direction is less urgent, if no less real.


Definitions
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

A "tuple like" is any object consisting of one or (usually) more orthogon=
al values (in mathematical notation, a "product type"). The canonical exa=
mple is :cpp:`std::tuple`, but other examples include :cpp:`std::array` o=
r similar fixed-size vector types and most aggregates, as well as some no=
n-aggregate user types including ones with no public NSDM's\ [#pt]_.

"Unpacking" refers to the conversion of a tuple-like object into its comp=
onent parts. This includes both name-binding unpacking (i.e. P0144_) and =
"generalized unpacking" where the components are used in a non-binding co=
ntext; for example, as values in a function parameter list. Name-binding =
unpacking is also called "structured binding" and, historically, "assignm=
ent unpacking". We prefer the term "name-binding unpacking" as it does no=
t call into question issues of "true assignment" versus aliasing where P0=
144_ specifically desires to avoid certain overheads, and the use of "unp=
acking" serves to connect two closely related concepts.


Access
=3D=3D=3D=3D=3D=3D

One of the active questions around P0144_ regards the customization point=
=2E We feel strongly that the customization point for name-binding unpack=
ing should be the same as used by generalized unpacking and by existing a=
nd proposed utility functions (e.g. :cpp:`std::apply` and :cpp:`std::make=
_from_tuple`) that act on tuple-like objects. This is important for the s=
ake of consistency; these operations are extremely similar, and using dif=
ferent customization points will likely result in confusion and teaching =
difficulty.

That said, we feel less strongly about the exact nature of those customiz=
ation points, providing that those points which are eventually used provi=
de satisfactory backwards compatibility.

At present, these customization points are:

:cpp:`get<N>(T)`:
    Access the N'th value of the tuple-like, where :cpp:`0 < N < tuple_si=
ze(T)`.

:cpp:`constexpr tuple_size(T)`:
    Returns the size of (i.e. number of elements in) the tuple-like.

An operator-like alternative
----------------------------

Some concerns were expressed that overloading on :cpp:`get<N>(T)` is not =
appropriate due to its use for other operations that are not related to t=
uple-like objects. One alternative might be to implement a new operator t=
ype:

=2E. code:: c++

  operator get(auto& tuple, constexpr size_t i);
  constexpr operator sizeof<T>();

It may be reasonable or even desirable to restrict access of these operat=
ors to either explicit spelling or use of dedicated syntax:

=2E. code:: c++

  MyTupleLike t;

  [0]t; // operator get
  sizeof...(t); // operator sizeof

  auto [x, y] =3D t; // both, via name-binding unpacking, case 2

We should note that, while there are some strong feelings on these topics=
, we do not feel that any particular resolution is critical for any of th=
e directions we are exploring. In this area, we feel only that a consiste=
nt and clear direction is important.

(Types have been elided in the above examples, as they are not crucial to=
 the discussion.)


Generalized Unpacking
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

Generalized unpacking is the conversion of a tuple-like to a "value seque=
nce", in the manner of Python's ``*`` operator, such that the resulting s=
equence may be used in any place that a comma separated sequence may be u=
sed. While function parameter lists is the canonical example, this would =
also include braced initializer lists. Following discussion on the ``std-=
proposals`` forum, we believe that the most reasonable and useful mechani=
sm of accomplishing this is to provide a mechanism whereby a tuple-like m=
ay be converted into a parameter pack. Much as in the name-binding unpack=
ing case, there is a logical code transformation that can be applied for =
this purpose, by placing the tuple-like into a temporary (where necessary=
, i.e. if the tuple-like is an expression rather than already a named var=
iable) and taking the parameter pack to be :cpp:`get<0>(__t), get<1>(__t)=
, ...`. This extends the usable scope to anywhere a fold expression may b=
e used.

We are aware of at least three possible mechanisms for implementing gener=
alized unpacking. One option is to employ a new syntax to perform this op=
eration directly. Another is to make multiple return values, treated as p=
arameter packs, first class citizens of the language. A third is to creat=
e a parameter pack "generator". The latter two options make it possible t=
o write a function (which might reasonably be named :cpp:`std::unpack`) t=
hat is equivalent to the former.

Several possible syntaxes have been proposed, including postfix operator =
``~``. Our preference, however, is prefix operator ``[:]`` (for reasons t=
hat will be |--| very briefly |--| shown later), which we will use here, =
always bearing in mind that this is strictly for demonstrative purposes. =
For example:

=2E. code:: c++

  struct { double x, y; } point =3D ...;
  auto h =3D std::hypot([:]point...);

The addition of such a feature, regardless of its form\ [#uf]_, would obv=
iate most (though perhaps not all) use cases for :cpp:`std::apply` and :c=
pp:`sd::make_from_tuple`. It would also permit trivial conversions betwee=
n different "simple" types which are distinct but layout compatible, by u=
npacking the first type into a braced initializer list used to construct =
the second. We believe that this feature will be at least as important an=
d useful as name-binding unpacking.


Unification of Unpacking
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

Possibly the most important aspect of P0197_ in our opinion is the provis=
ion for a single, unified mechanism for unpacking, whether in the name-bi=
nding or generalized senses. The critical aspect of P0197_, and the one t=
hat we feel strongly needs to be considered by P0144_, is providing impli=
cit general tuple-like access to simple data structures. In particular, w=
e feel that it would be a travesty for name-binding unpacking and general=
ized unpacking to use different customization points or to otherwise beha=
ve differently when used in ways where intuition strongly expects equival=
ent behavior. In particular, we feel strongly that, for a tuple-like type=
 having a default destructor, the following should be equivalent (after o=
ptimizations):

=2E. code:: c++

  auto [x, y] =3D t;
  auto [x, y] =3D {[:]t...};

(This illustrates a need to be careful with lifetime semantics; in partic=
ular, unpacking should likely either extend lifetime when used in a brace=
d initializer list, or should explicitly create value copies in such case=
=2E The former would make the above equivalent for *any* tuple-like, whil=
e the latter may be useful for separating lifetime of the tuple-like and =
its components. We do not recommend a direction at this time, although th=
is is likely to be of relevance when considering a language solution vers=
us a "library" solution.)

It should be noted that P0197_ would provide a modest enhancement to name=
-binding unpacking. Where P0144_ limits itself to "flat" classes, P0197_ =
would extend implicit tuple-like access to all classes which:

  * Contain no non-public NSDM's
  * Contain no members of union type
  * Have no virtual\ [#vb]_ and/or non-public\ [#eb]_ base classes
  * Have no base classes which do not also meet the preceding eligibility=
 criteria

While it would not be a catastrophic loss if non-"flat" classes were not =
supported, we do feel that it would be most unfortunate if we are not abl=
e |--| eventually |--| to rely on this implicit access to implement name-=
binding unpacking, and accordingly to eliminate P0144_ case 3. In additio=
n to consistency, we feel that this is important for the sake of simplici=
ty, as it eliminates a special case from name-binding unpacking. We are c=
onfident that the performance issues (that is, the understanding that cas=
e 3 represents name aliasing and neither consumes storage beyond that req=
uired for the tuple-like itself nor adds any access indirection) can be s=
atisfactorily addressed through compiler optimization, keeping in mind of=
 course that the implementations of the "get" function (however we ultima=
tely spell it) are inline in these instances.

The problem that arises from this approach is bitfield members. At the 20=
16 Jacksonville meeting, at least one individual expressed a strong opini=
on that providing read/write access to bitfield members via name-binding =
unpacking is a "must have" feature. We encourage giving serious considera=
tion to the true importance of this feature, and to ways that this could =
be addressed in a way that does not require special casing. (In particula=
r, we note that the general ability to have a reference to a bitfield |--=
| likely through some new library type |--| seems at least as interesting=
 as being able to name-bind to a component of such type of a tuple-like.)=



Slicing
=3D=3D=3D=3D=3D=3D=3D

In our earlier discussion on `Access`_, we mentioned syntax for accessing=
 specific elements of a tuple-like. While the need to access individual e=
lements is obvious and clearly does not require a syntactic solution (we =
already have :cpp:`std::get<N>`), another desire that comes up often is t=
he ability to slice a tuple-like; e.g. to strip the first element or take=
 only the first N elements.

We chose :cpp:`[:]` because it naturally extends to slicing, but various =
possible solutions have been suggested, including pack generators (which =
would offer significant expressive power). More importantly, since we rec=
ommend that generalized unpacking convert a tuple-like to a parameter pac=
k, it makes sense that a syntax for slicing tuple-likes should also work =
on parameter packs directly. In addition to the advantages for tuple-like=
s, this enables simple and powerful transformations for variadic template=
s, thus satisfying another important contemporary use case. In particular=
, we can now write recursive variadic template functions like:

=2E. code:: c++

  void print_each() {} // sentinel

  template <typename... T>
  void print_each(T... values)
  {
    print_one([0]values);
    print_each([1:]values);
  }

This is a fairly trivial example that previously could be written by brea=
king the complete pack into a separately named head argument and tail pac=
k. This, however, merely scratches the surface. One could imagine impleme=
nting a :cpp:`constexpr` divide-and-conquer sort algorithm using slicing =
to trivially split the incoming parameter pack in half. Many other exampl=
es which can be readily implemented with slicing but would be difficult a=
nd/or expensive to implement otherwise can be imagined.


Pack Generation, Revisited
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D

Parameter pack generation is, in general, an interesting feature. Suggest=
ed example uses include generating an integer list\ [#il]_, a type list, =
and performing various manipulations on parameter packs. While such manip=
ulations could include slicing and reversing, we note that these operatio=
ns appear to rely on a syntactic mechanism for extracting a single elemen=
t from a pack (reference is made to N4235_). We also wonder if slicing op=
erations implemented in this manner would perform satisfactorily compared=
 to syntactic slicing.

Consequently, we still need a syntax for indexed access of parameter pack=
 elements. This in turn allows us to apply the previous argument in rever=
se; namely, why not select a syntax that is non-ambiguous, easily extende=
d to slicing, and may be applied also to tuple-likes? This is a point tha=
t we feel is worth serious consideration as we consider what direction ge=
neralized unpacking should take.


Summary
=3D=3D=3D=3D=3D=3D=3D

Previous discussions |--| both in EWG and on the ``std-proposals`` forum =
|--| suggest a strong desire by the C++ community to move the language in=
 a direction that blurs the line between containers and their contained v=
alue sequences, making it easy to move from one to the other, as is often=
 found in other languages (e.g. Python). At the same time, there are a nu=
mber of proposals either published or in the works to simplify working wi=
th parameter packs. Moreover, due to the significant utility of unpacking=
 and otherwise working with tuple-like objects as parameter packs, these =
areas are closely related and to some extent overlap.

We have observed recently that "complexity" is a frequent complaint made =
against C++, especially that it is "hard to teach". As we consider featur=
es to simplify working with tuple-like objects and/or parameter packs, we=
 feel it is of utmost importance to establish and adhere to a consistent =
vision of these functions, in terms of both syntax and function. We speci=
fically urge that name-binding unpacking would carefully consider customi=
zation points\ [#cp]_ and the future possibility of implicit tuple-like a=
ccess (see especially P0197_) and generalized unpacking in order to work =
toward\ [#fd]_ a common mechanism for both that would eliminate special c=
ase rules specific to the individual features. We also urge the committee=
 to consider these issues and how such features relate (or can be made to=
 relate) to tuple-like objects in order to maximize consistency of operat=
ions on both object types, and we urge authors working on such proposals =
to do likewise. Finally, we strongly encourage any authors working in thi=
s realm to maintain communication in order to reduce the dangers of compe=
ting, incompatible proposals and to maximize our ability as a community t=
o pursue a well considered, consistent, and maximally functional directio=
n.

By offering a glimpse at where we might be going, we hope we have demonst=
rated the importance of keeping the future in mind while developing new a=
nd exciting features today. We especially hope we have demonstrated the i=
mportance of considering the direction proposed by P0197_ (implicit tuple=
-like access for "simple" types) in light of P0144_ (name-binding unpacki=
ng) in order to maintain consistency and simplicity of specification in o=
rder to maximize the ability of users to understand the operation of thes=
e features and to use them in a sensible manner.


Acknowledgments
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

We would like to thank the authors of P0144_, for obvious reasons. We wou=
ld like to thank Mike Spertus and Daveed Vandevoorde for sharing a "previ=
ew" of their respective works-in-progress in the area of parameter packs.=
 We would like to thanks Daniel Frey for his own work on parameter packs,=
 which also forced us to consider the defense our own preferences more st=
renuously than had been done before. As always, we would also like to tha=
nk everyone that has shared their thoughts and ideas on these issues, bot=
h in person at the 2016 Jacksonville meeting and on ``std-proposals``.


Footnotes
=3D=3D=3D=3D=3D=3D=3D=3D=3D

=2E. [#pt] `QVector3D <http://doc.qt.io/qt-5.6/qvector3d.html>`_ comes to=
 mind as an example of a user type which is |--| or at least, ought to be=
 |--| tuple-like but has no public data members.

=2E. [#uf] The form that unpacking takes is not entirely uninteresting, h=
owever such discussion is not in scope for this paper.

=2E. [#vb] While present in the initial revision of P0197_, this restrict=
ion is not seen in P0144_, and upon further consideration, may be unneces=
sary.

=2E. [#eb] This could probably be relaxed to non-public *and non-empty* b=
ase classes, if desired.

=2E. [#il] The purely template implementation of :cpp:`std::integer_seque=
nce` is extremely expensive, to the point that many compilers are providi=
ng implementations based on compiler intrinsics. Parameter pack generator=
s have the potential to provide a satisfactory implementation without suc=
h intrinsics.

=2E. [#cp] It is our understanding that the committee and the authors of =
P0144_ are well aware of the strong feelings surrounding customization po=
ints and *are* giving them serious consideration. We wish to take this op=
portunity to thank and commend them for these efforts.

=2E. [#fd] We would like to reiterate that we have no objection to specia=
l case handling of "implicitly tuple-like" types in the short term, espec=
ially if it means name-binding unpacking is available in C++17, *provided=
* there is a long term migration route that would allow this special case=
 to be replaced with more generalized functionality.


References
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

=2E. _N4235: http://wg21.link/n4235

* N4235_ Selecting from Parameter Packs

  http://wg21.link/n4235

=2E. _P0144: http://wg21.link/p0144

* P0144_ Structured Bindings

  http://wg21.link/p0144

=2E. _P0197: http://wg21.link/p0197

* P0197_ Default Tuple-like Access

  http://wg21.link/p0197

=2E. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..=
 .. ..

=2E. |--| unicode:: U+02014 .. em dash

=2E. kate: hl reStructuredText

--------------060305020907090604080801--


.
