<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>24462</bug_id>
          
          <creation_ts>2009-03-09 08:31:03 -0700</creation_ts>
          <short_desc>Move cross-origin access control code out of XMLHttpRequest</short_desc>
          <delta_ts>2009-08-10 20:30:37 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Page Loading</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Alexey Proskuryakov">ap</reporter>
          <assigned_to name="Alexey Proskuryakov">ap</assigned_to>
          <cc>mike</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>112824</commentid>
    <comment_count>0</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2009-03-09 08:31:03 -0700</bug_when>
    <thetext>Cross-origin resource sharing is a separate specification that will be used for more than just XHR.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>112826</commentid>
    <comment_count>1</comment_count>
      <attachid>28413</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2009-03-09 08:36:41 -0700</bug_when>
    <thetext>Created attachment 28413
Part 1</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>112828</commentid>
    <comment_count>2</comment_count>
      <attachid>28413</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-03-09 09:05:16 -0700</bug_when>
    <thetext>Comment on attachment 28413
Part 1

&gt; +bool accessControlCheck(const ResourceResponse&amp; response, bool includeCredentials, SecurityOrigin* securityOrigin)

I&apos;m not sure this name is clear enough; we normally try to name functions so they describe their return values. Maybe something like passesAccessControlCheck would be better? Or some other name that describes the boolean return value. I also think the &quot;named boolean&quot; idiom might be best for the includeCredentials boolean, assuming that most callers pass a constant.

&gt; +    unsigned expiryDelta = 0;
&gt; +    if (!parseAccessControlMaxAge(response.httpHeaderField(&quot;Access-Control-Max-Age&quot;), expiryDelta))
&gt; +        expiryDelta = 5;

Annoying to find this magic number hiding here. Ideally the 5 would be named constant. I know you didn&apos;t add this. It also seems strange to initialize expiryDelta to 0 and then set it to 5. Do we need to initialize it at all?

&gt; +bool CrossOriginPreflightResultCache::canSkipPreflight(const String&amp; origin, const KURL&amp; url, bool includeCredentials,
&gt; +                                            const String&amp; method, const HTTPHeaderMap&amp; requestHeaders)

The above is a practical demonstration of why I prefer to indent by a single tab stop instead of lining things up.

&gt; +        template&lt;class HashType&gt;
&gt; +        static void addToAccessControlAllowList(const String&amp; string, unsigned start, unsigned end, HashSet&lt;String, HashType&gt;&amp;);
&gt; +        template&lt;class HashType&gt;
&gt; +        static bool parseAccessControlAllowList(const String&amp; string, HashSet&lt;String, HashType&gt;&amp;);
&gt; +        static bool parseAccessControlMaxAge(const String&amp; string, unsigned&amp; expiryDelta);

I think the template declarations either need to be all one one line, or perhaps with some blank space.

I&apos;m not sure why these functions are class members -- they could be free functions instead.

The argument name &quot;string&quot; could be omitted.

&gt; +        // FIXME: A better solution to holding onto the absolute expiration time might be
&gt; +        // to start a timer for the expiration delta, that removes this from the cache when
&gt; +        // it fires.

This has a comma that&apos;s incorrect and should be removed.

r=me, with or without changes</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>112967</commentid>
    <comment_count>3</comment_count>
      <attachid>28413</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2009-03-10 01:14:14 -0700</bug_when>
    <thetext>Comment on attachment 28413
Part 1

Committed revision 41548, clearing review flag.

I made the changes, except for adding an enum for includeCredentials argument (because the funciton is always called with a variable for it), and for adding a constant for expiryDelta (my understanding that this code will need to be refactored soon).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138893</commentid>
    <comment_count>4</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2009-08-10 20:30:37 -0700</bug_when>
    <thetext>This work is continued in bug 28134.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>28413</attachid>
            <date>2009-03-09 08:36:41 -0700</date>
            <delta_ts>2009-03-10 01:14:14 -0700</delta_ts>
            <desc>Part 1</desc>
            <filename>MoveAccessControlPart1.txt</filename>
            <type>text/plain</type>
            <size>43910</size>
            <attacher name="Alexey Proskuryakov">ap</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0MTUyNikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNTEgQEAKKzIwMDktMDMtMDkgIEFsZXhleSBQcm9za3VyeWFrb3YgIDxhcEB3ZWJr
aXQub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNDQ2MgorICAgICAgICBN
b3ZlIGNyb3NzLW9yaWdpbiBhY2Nlc3MgY29udHJvbCBjb2RlIG91dCBvZiBYTUxIdHRwUmVxdWVz
dAorCisgICAgICAgIFN0ZXAgMTogbW92ZSBwcmVmbGlnaHQgcmVzdWx0IGNhY2hlIGFuZCBhY2Nl
c3MgY29udHJvbCBoZWxwZXIgZnVuY3Rpb25zLgorCisgICAgICAgIE5vIGNoYW5nZSBpbiBiZWhh
dmlvciwgc28gbm8gdGVzdC4KKworICAgICAgICAqIEdOVW1ha2VmaWxlLmFtOgorICAgICAgICAq
IFdlYkNvcmUucHJvOgorICAgICAgICAqIFdlYkNvcmUuc2NvbnM6CisgICAgICAgICogV2ViQ29y
ZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2o6CisgICAgICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJv
amVjdC5wYnhwcm9qOgorICAgICAgICAqIFdlYkNvcmVTb3VyY2VzLmJrbDoKKyAgICAgICAgKiBs
b2FkZXIvQ3Jvc3NPcmlnaW5BY2Nlc3NDb250cm9sLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJD
b3JlOjppc09uQWNjZXNzQ29udHJvbFNpbXBsZVJlcXVlc3RIZWFkZXJXaGl0ZWxpc3QpOgorICAg
ICAgICAoV2ViQ29yZTo6aXNTaW1wbGVDcm9zc09yaWdpbkFjY2Vzc1JlcXVlc3QpOgorICAgICAg
ICAoV2ViQ29yZTo6Y3JlYXRlQWxsb3dlZENyb3NzT3JpZ2luUmVzcG9uc2VIZWFkZXJzU2V0KToK
KyAgICAgICAgKFdlYkNvcmU6OmlzT25BY2Nlc3NDb250cm9sUmVzcG9uc2VIZWFkZXJXaGl0ZWxp
c3QpOgorICAgICAgICAoV2ViQ29yZTo6YWNjZXNzQ29udHJvbENoZWNrKToKKyAgICAgICAgKiBs
b2FkZXIvQ3Jvc3NPcmlnaW5BY2Nlc3NDb250cm9sLmg6IEFkZGVkLgorICAgICAgICAqIGxvYWRl
ci9Dcm9zc09yaWdpblByZWZsaWdodFJlc3VsdENhY2hlLmNwcDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjpDcm9zc09yaWdpblByZWZsaWdodFJlc3VsdENhY2hlSXRlbTo6cGFyc2VBY2Nlc3ND
b250cm9sTWF4QWdlKToKKyAgICAgICAgKFdlYkNvcmU6OkNyb3NzT3JpZ2luUHJlZmxpZ2h0UmVz
dWx0Q2FjaGVJdGVtOjpwYXJzZSk6CisgICAgICAgIChXZWJDb3JlOjpDcm9zc09yaWdpblByZWZs
aWdodFJlc3VsdENhY2hlSXRlbTo6YWxsb3dzQ3Jvc3NPcmlnaW5NZXRob2QpOgorICAgICAgICAo
V2ViQ29yZTo6Q3Jvc3NPcmlnaW5QcmVmbGlnaHRSZXN1bHRDYWNoZUl0ZW06OmFsbG93c0Nyb3Nz
T3JpZ2luSGVhZGVycyk6CisgICAgICAgIChXZWJDb3JlOjpDcm9zc09yaWdpblByZWZsaWdodFJl
c3VsdENhY2hlSXRlbTo6YWxsb3dzUmVxdWVzdCk6CisgICAgICAgIChXZWJDb3JlOjpDcm9zc09y
aWdpblByZWZsaWdodFJlc3VsdENhY2hlOjpzaGFyZWQpOgorICAgICAgICAoV2ViQ29yZTo6Q3Jv
c3NPcmlnaW5QcmVmbGlnaHRSZXN1bHRDYWNoZTo6YXBwZW5kRW50cnkpOgorICAgICAgICAoV2Vi
Q29yZTo6Q3Jvc3NPcmlnaW5QcmVmbGlnaHRSZXN1bHRDYWNoZTo6Y2FuU2tpcFByZWZsaWdodCk6
CisgICAgICAgICogbG9hZGVyL0Nyb3NzT3JpZ2luUHJlZmxpZ2h0UmVzdWx0Q2FjaGUuaDogQWRk
ZWQuCisgICAgICAgIChXZWJDb3JlOjpDcm9zc09yaWdpblByZWZsaWdodFJlc3VsdENhY2hlSXRl
bTo6Q3Jvc3NPcmlnaW5QcmVmbGlnaHRSZXN1bHRDYWNoZUl0ZW0pOgorICAgICAgICAoV2ViQ29y
ZTo6Q3Jvc3NPcmlnaW5QcmVmbGlnaHRSZXN1bHRDYWNoZTo6Q3Jvc3NPcmlnaW5QcmVmbGlnaHRS
ZXN1bHRDYWNoZSk6CisgICAgICAgIChXZWJDb3JlOjpDcm9zc09yaWdpblByZWZsaWdodFJlc3Vs
dENhY2hlSXRlbTo6YWRkVG9BY2Nlc3NDb250cm9sQWxsb3dMaXN0KToKKyAgICAgICAgKFdlYkNv
cmU6OkNyb3NzT3JpZ2luUHJlZmxpZ2h0UmVzdWx0Q2FjaGVJdGVtOjpwYXJzZUFjY2Vzc0NvbnRy
b2xBbGxvd0xpc3QpOgorICAgICAgICAqIHhtbC9YTUxIdHRwUmVxdWVzdC5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpYTUxIdHRwUmVxdWVzdFN0YXRpY0RhdGE6OlhNTEh0dHBSZXF1ZXN0U3RhdGlj
RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpYTUxIdHRwUmVxdWVzdDo6Y3JlYXRlUmVxdWVzdCk6
CisgICAgICAgIChXZWJDb3JlOjpYTUxIdHRwUmVxdWVzdDo6bWFrZUNyb3NzT3JpZ2luQWNjZXNz
UmVxdWVzdCk6CisgICAgICAgIChXZWJDb3JlOjpYTUxIdHRwUmVxdWVzdDo6bWFrZVNpbXBsZUNy
b3NzT3JpZ2luQWNjZXNzUmVxdWVzdCk6CisgICAgICAgIChXZWJDb3JlOjpYTUxIdHRwUmVxdWVz
dDo6bWFrZUNyb3NzT3JpZ2luQWNjZXNzUmVxdWVzdFdpdGhQcmVmbGlnaHQpOgorICAgICAgICAo
V2ViQ29yZTo6WE1MSHR0cFJlcXVlc3Q6OmRpZFJlY2VpdmVSZXNwb25zZSk6CisgICAgICAgIChX
ZWJDb3JlOjpYTUxIdHRwUmVxdWVzdDo6ZGlkUmVjZWl2ZVJlc3BvbnNlUHJlZmxpZ2h0KToKKyAg
ICAgICAgKiB4bWwvWE1MSHR0cFJlcXVlc3QuaDoKKwogMjAwOS0wMy0wOCAgTWFyayBSb3dlICA8
bXJvd2VAYXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IE9saXZlciBIdW50LgpJbmRl
eDogV2ViQ29yZS9HTlVtYWtlZmlsZS5hbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL0dOVW1ha2Vm
aWxlLmFtCShyZXZpc2lvbiA0MTUyNikKKysrIFdlYkNvcmUvR05VbWFrZWZpbGUuYW0JKHdvcmtp
bmcgY29weSkKQEAgLTEwNTgsNiArMTA1OCwxMCBAQCB3ZWJjb3JlX3NvdXJjZXMgKz0gXAogCVdl
YkNvcmUvbG9hZGVyL0NhY2hlZFhCTERvY3VtZW50LmggXAogCVdlYkNvcmUvbG9hZGVyL0NhY2hl
ZFhTTFN0eWxlU2hlZXQuY3BwIFwKIAlXZWJDb3JlL2xvYWRlci9DYWNoZWRYU0xTdHlsZVNoZWV0
LmggXAorCVdlYkNvcmUvbG9hZGVyL0Nyb3NzT3JpZ2luQWNjZXNzQ29udHJvbC5jcHAgXAorCVdl
YkNvcmUvbG9hZGVyL0Nyb3NzT3JpZ2luQWNjZXNzQ29udHJvbC5oIFwKKwlXZWJDb3JlL2xvYWRl
ci9Dcm9zc09yaWdpblByZWZsaWdodFJlc3VsdENhY2hlLmNwcCBcCisJV2ViQ29yZS9sb2FkZXIv
Q3Jvc3NPcmlnaW5QcmVmbGlnaHRSZXN1bHRDYWNoZS5oIFwKIAlXZWJDb3JlL2xvYWRlci9Eb2NM
b2FkZXIuY3BwIFwKIAlXZWJDb3JlL2xvYWRlci9Eb2NMb2FkZXIuaCBcCiAJV2ViQ29yZS9sb2Fk
ZXIvRG9jdW1lbnRMb2FkZXIuY3BwIFwKSW5kZXg6IFdlYkNvcmUvV2ViQ29yZS5wcm8KPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLnBybwkocmV2aXNpb24gNDE1MjYpCisrKyBXZWJDb3Jl
L1dlYkNvcmUucHJvCSh3b3JraW5nIGNvcHkpCkBAIC03OTgsNiArNzk4LDggQEAgU09VUkNFUyAr
PSBcCiAgICAgbG9hZGVyL0NhY2hlZFJlc291cmNlLmNwcCBcCiAgICAgbG9hZGVyL0NhY2hlZFNj
cmlwdC5jcHAgXAogICAgIGxvYWRlci9DYWNoZWRYU0xTdHlsZVNoZWV0LmNwcCBcCisgICAgbG9h
ZGVyL0Nyb3NzT3JpZ2luQWNjZXNzQ29udHJvbC5jcHAgXAorICAgIGxvYWRlci9Dcm9zc09yaWdp
blByZWZsaWdodFJlc3VsdENhY2hlLmNwcCBcCiAgICAgbG9hZGVyL0RvY0xvYWRlci5jcHAgXAog
ICAgIGxvYWRlci9Eb2N1bWVudExvYWRlci5jcHAgXAogICAgIGxvYWRlci9Eb2N1bWVudFRocmVh
ZGFibGVMb2FkZXIuY3BwIFwKSW5kZXg6IFdlYkNvcmUvV2ViQ29yZS5zY29ucwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL1dlYkNvcmUuc2NvbnMJKHJldmlzaW9uIDQxNTI2KQorKysgV2ViQ29yZS9X
ZWJDb3JlLnNjb25zCSh3b3JraW5nIGNvcHkpCkBAIC0zMzMsNiArMzMzLDggQEAgc291cmNlc1sn
bG9hZGVyJ10gPSBbCiAgICAgJ2xvYWRlci9DYWNoZWRTY3JpcHQuY3BwJywKICAgICAnbG9hZGVy
L0NhY2hlZFhCTERvY3VtZW50LmNwcCcsCiAgICAgJ2xvYWRlci9DYWNoZWRYU0xTdHlsZVNoZWV0
LmNwcCcsCisgICAgJ2xvYWRlci9Dcm9zc09yaWdpbkFjY2Vzc0NvbnRyb2wuY3BwJywKKyAgICAn
bG9hZGVyL0Nyb3NzT3JpZ2luUHJlZmxpZ2h0UmVzdWx0Q2FjaGUuY3BwJywKICAgICAnbG9hZGVy
L0RvY0xvYWRlci5jcHAnLAogICAgICdsb2FkZXIvRG9jdW1lbnRMb2FkZXIuY3BwJywKICAgICAn
bG9hZGVyL0RvY3VtZW50VGhyZWFkYWJsZUxvYWRlci5jcHAnLApJbmRleDogV2ViQ29yZS9XZWJD
b3JlU291cmNlcy5ia2wKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlU291cmNlcy5ia2wJ
KHJldmlzaW9uIDQxNTI2KQorKysgV2ViQ29yZS9XZWJDb3JlU291cmNlcy5ia2wJKHdvcmtpbmcg
Y29weSkKQEAgLTY0NSw2ICs2NDUsOCBAQCBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGxpc3Qgb2Yg
ZmlsZXMgbmVlCiAgICAgICAgIGxvYWRlci9DYWNoZWRSZXNvdXJjZUNsaWVudFdhbGtlci5jcHAK
ICAgICAgICAgbG9hZGVyL0NhY2hlZFNjcmlwdC5jcHAKICAgICAgICAgbG9hZGVyL0NhY2hlZFhT
TFN0eWxlU2hlZXQuY3BwCisgICAgICAgIGxvYWRlci9Dcm9zc09yaWdpbkFjY2Vzc0NvbnRyb2wu
Y3BwCisgICAgICAgIGxvYWRlci9Dcm9zc09yaWdpblByZWZsaWdodFJlc3VsdENhY2hlLmNwcAog
ICAgICAgICBsb2FkZXIvRG9jTG9hZGVyLmNwcAogICAgICAgICBsb2FkZXIvRG9jdW1lbnRMb2Fk
ZXIuY3BwCiAgICAgICAgIGxvYWRlci9Eb2N1bWVudFRocmVhZGFibGVMb2FkZXIuY3BwCkluZGV4
OiBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHJldmlzaW9uIDQxNTI2KQorKysg
V2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagkod29ya2luZyBjb3B5KQpAQCAt
Mjc4NCw2ICsyNzg0LDIyIEBACiAJCQkJPg0KIAkJCTwvRmlsZT4NCiAJCQk8RmlsZQ0KKwkJCQlS
ZWxhdGl2ZVBhdGg9Ii4uXGxvYWRlclxDcm9zc09yaWdpbkFjY2Vzc0NvbnRyb2wuY3BwIg0KKwkJ
CQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbG9hZGVy
XENyb3NzT3JpZ2luQWNjZXNzQ29udHJvbC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxG
aWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbG9hZGVyXENyb3NzT3JpZ2luUHJlZmxpZ2h0UmVz
dWx0Q2FjaGUuY3BwIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0
aXZlUGF0aD0iLi5cbG9hZGVyXENyb3NzT3JpZ2luUHJlZmxpZ2h0UmVzdWx0Q2FjaGUuaCINCisJ
CQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KIAkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxvYWRl
clxEb2NMb2FkZXIuY3BwIg0KIAkJCQk+DQogCQkJPC9GaWxlPg0KSW5kZXg6IFdlYkNvcmUvV2Vi
Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2Vi
Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiA0MTUyNikKKysrIFdlYkNv
cmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC00
MzcwLDYgKzQzNzAsMTAgQEAKIAkJRTFDMzZDQkQwRUIwODA2MjAwNzQxMEJDIC8qIEpTRE9NR2xv
YmFsT2JqZWN0LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IEUxQzM2Q0JDMEVCMDgwNjIwMDc0MTBCQyAvKiBKU0RPTUdsb2JhbE9iamVjdC5jcHAgKi87
IH07CiAJCUUxQzM2RDM0MEVCMEEwOTQwMDc0MTBCQyAvKiBKU1dvcmtlckNvbnRleHRCYXNlLmNw
cCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEUxQzM2RDMy
MEVCMEEwOTQwMDc0MTBCQyAvKiBKU1dvcmtlckNvbnRleHRCYXNlLmNwcCAqLzsgfTsKIAkJRTFD
MzZEMzUwRUIwQTA5NDAwNzQxMEJDIC8qIEpTV29ya2VyQ29udGV4dEJhc2UuaCBpbiBIZWFkZXJz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEUxQzM2RDMzMEVCMEEwOTQwMDc0
MTBCQyAvKiBKU1dvcmtlckNvbnRleHRCYXNlLmggKi87IH07CisJCUUxQzQxNURBMEY2NTVENkYw
MDkyRDJGQiAvKiBDcm9zc09yaWdpblByZWZsaWdodFJlc3VsdENhY2hlLmggaW4gSGVhZGVycyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFMUM0MTVEOTBGNjU1RDZGMDA5MkQy
RkIgLyogQ3Jvc3NPcmlnaW5QcmVmbGlnaHRSZXN1bHRDYWNoZS5oICovOyB9OworCQlFMUM0MTVE
RTBGNjU1RDdDMDA5MkQyRkIgLyogQ3Jvc3NPcmlnaW5QcmVmbGlnaHRSZXN1bHRDYWNoZS5jcHAg
aW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFMUM0MTVERDBG
NjU1RDdDMDA5MkQyRkIgLyogQ3Jvc3NPcmlnaW5QcmVmbGlnaHRSZXN1bHRDYWNoZS5jcHAgKi87
IH07CisJCUUxQzQxNjEyMEY2NTYyRkQwMDkyRDJGQiAvKiBDcm9zc09yaWdpbkFjY2Vzc0NvbnRy
b2wuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEUxQzQx
NjExMEY2NTYyRkQwMDkyRDJGQiAvKiBDcm9zc09yaWdpbkFjY2Vzc0NvbnRyb2wuaCAqLzsgfTsK
KwkJRTFDNDE2MTcwRjY1NjMxODAwOTJEMkZCIC8qIENyb3NzT3JpZ2luQWNjZXNzQ29udHJvbC5j
cHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFMUM0MTYx
NjBGNjU2MzE4MDA5MkQyRkIgLyogQ3Jvc3NPcmlnaW5BY2Nlc3NDb250cm9sLmNwcCAqLzsgfTsK
IAkJRTFDNERFNjkwRUE3NUMxRTAwMjNDQ0Q2IC8qIEFjdGl2ZURPTU9iamVjdC5oIGluIEhlYWRl
cnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTFDNERFNjgwRUE3NUMxRTAw
MjNDQ0Q2IC8qIEFjdGl2ZURPTU9iamVjdC5oICovOyB9OwogCQlFMUM0REU2RTBFQTc1QzY1MDAy
M0NDRDYgLyogQWN0aXZlRE9NT2JqZWN0LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IEUxQzRERTZEMEVBNzVDNjUwMDIzQ0NENiAvKiBBY3RpdmVET01P
YmplY3QuY3BwICovOyB9OwogCQlFMUM4QkU1RDBFOEJEMTVBMDA2NENCN0QgLyogSlNXb3JrZXIu
Y3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTFDOEJF
NUMwRThCRDE1QTAwNjRDQjdEIC8qIEpTV29ya2VyLmNwcCAqLzsgfTsKQEAgLTkyMDQsNiArOTIw
OCwxMCBAQAogCQlFMUMzNkNCQzBFQjA4MDYyMDA3NDEwQkMgLyogSlNET01HbG9iYWxPYmplY3Qu
Y3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSlNET01HbG9iYWxPYmpl
Y3QuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlFMUMzNkQzMjBFQjBBMDk0MDA3
NDEwQkMgLyogSlNXb3JrZXJDb250ZXh0QmFzZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNw
cC5jcHA7IHBhdGggPSBKU1dvcmtlckNvbnRleHRCYXNlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKIAkJRTFDMzZEMzMwRUIwQTA5NDAwNzQxMEJDIC8qIEpTV29ya2VyQ29udGV4dEJh
c2UuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSlNXb3JrZXJDb250ZXh0QmFz
ZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFMUM0MTVEOTBGNjU1RDZGMDA5MkQy
RkIgLyogQ3Jvc3NPcmlnaW5QcmVmbGlnaHRSZXN1bHRDYWNoZS5oICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jLmg7IHBhdGggPSBDcm9zc09yaWdpblByZWZsaWdodFJlc3VsdENhY2hlLmg7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUUxQzQxNUREMEY2NTVEN0MwMDkyRDJGQiAvKiBDcm9z
c09yaWdpblByZWZsaWdodFJlc3VsdENhY2hlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3Bw
LmNwcDsgcGF0aCA9IENyb3NzT3JpZ2luUHJlZmxpZ2h0UmVzdWx0Q2FjaGUuY3BwOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OworCQlFMUM0MTYxMTBGNjU2MkZEMDA5MkQyRkIgLyogQ3Jvc3NP
cmlnaW5BY2Nlc3NDb250cm9sLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IENy
b3NzT3JpZ2luQWNjZXNzQ29udHJvbC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlF
MUM0MTYxNjBGNjU2MzE4MDA5MkQyRkIgLyogQ3Jvc3NPcmlnaW5BY2Nlc3NDb250cm9sLmNwcCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IENyb3NzT3JpZ2luQWNjZXNzQ29u
dHJvbC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUUxQzRERTY4MEVBNzVDMUUw
MDIzQ0NENiAvKiBBY3RpdmVET01PYmplY3QuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBw
YXRoID0gQWN0aXZlRE9NT2JqZWN0Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUUx
QzRERTZEMEVBNzVDNjUwMDIzQ0NENiAvKiBBY3RpdmVET01PYmplY3QuY3BwICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gQWN0aXZlRE9NT2JqZWN0LmNwcDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRTFDOEJFNUMwRThCRDE1QTAwNjRDQjdEIC8qIEpTV29ya2Vy
LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEpTV29ya2VyLmNwcDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTEzNzExLDYgKzEzNzE5LDEwIEBACiAJCQkJ
QkNCMTZDMEQwOTc5QzNCRDAwNDY3NzQxIC8qIENhY2hlZFhCTERvY3VtZW50LmggKi8sCiAJCQkJ
QkNCMTZDMEUwOTc5QzNCRDAwNDY3NzQxIC8qIENhY2hlZFhTTFN0eWxlU2hlZXQuY3BwICovLAog
CQkJCUJDQjE2QzBGMDk3OUMzQkQwMDQ2Nzc0MSAvKiBDYWNoZWRYU0xTdHlsZVNoZWV0LmggKi8s
CisJCQkJRTFDNDE2MTYwRjY1NjMxODAwOTJEMkZCIC8qIENyb3NzT3JpZ2luQWNjZXNzQ29udHJv
bC5jcHAgKi8sCisJCQkJRTFDNDE2MTEwRjY1NjJGRDAwOTJEMkZCIC8qIENyb3NzT3JpZ2luQWNj
ZXNzQ29udHJvbC5oICovLAorCQkJCUUxQzQxNUREMEY2NTVEN0MwMDkyRDJGQiAvKiBDcm9zc09y
aWdpblByZWZsaWdodFJlc3VsdENhY2hlLmNwcCAqLywKKwkJCQlFMUM0MTVEOTBGNjU1RDZGMDA5
MkQyRkIgLyogQ3Jvc3NPcmlnaW5QcmVmbGlnaHRSZXN1bHRDYWNoZS5oICovLAogCQkJCUJDQjE2
QzEwMDk3OUMzQkQwMDQ2Nzc0MSAvKiBEb2NMb2FkZXIuY3BwICovLAogCQkJCUJDQjE2QzExMDk3
OUMzQkQwMDQ2Nzc0MSAvKiBEb2NMb2FkZXIuaCAqLywKIAkJCQk5M0UyMjdEQjBBRjU4OUFEMDBE
NDgzMjQgLyogRG9jdW1lbnRMb2FkZXIuY3BwICovLApAQCAtMTY4NTIsNiArMTY4NjQsOCBAQAog
CQkJCTQxRjA2MjAxMEY1RjBCNjYwMEEwN0VBQyAvKiBJbnNwZWN0b3JSZXNvdXJjZS5oIGluIEhl
YWRlcnMgKi8sCiAJCQkJNDFGMDYyMTQwRjVGMTkyNjAwQTA3RUFDIC8qIEluc3BlY3RvckRhdGFi
YXNlUmVzb3VyY2UuaCBpbiBIZWFkZXJzICovLAogCQkJCTVEOTI1QjY4MEY2NEQ0REQwMEI4NDdG
MCAvKiBTY3JvbGxCZWhhdmlvci5oIGluIEhlYWRlcnMgKi8sCisJCQkJRTFDNDE1REEwRjY1NUQ2
RjAwOTJEMkZCIC8qIENyb3NzT3JpZ2luUHJlZmxpZ2h0UmVzdWx0Q2FjaGUuaCBpbiBIZWFkZXJz
ICovLAorCQkJCUUxQzQxNjEyMEY2NTYyRkQwMDkyRDJGQiAvKiBDcm9zc09yaWdpbkFjY2Vzc0Nv
bnRyb2wuaCBpbiBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9z
dHByb2Nlc3NpbmcgPSAwOwogCQl9OwpAQCAtMTg4NDcsNiArMTg4NjEsOCBAQAogCQkJCTQxRjA2
MjAyMEY1RjBCNjYwMEEwN0VBQyAvKiBJbnNwZWN0b3JSZXNvdXJjZS5jcHAgaW4gU291cmNlcyAq
LywKIAkJCQk0MUYwNjIxNTBGNUYxOTI2MDBBMDdFQUMgLyogSW5zcGVjdG9yRGF0YWJhc2VSZXNv
dXJjZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk1RDkyNUI2NzBGNjRENEREMDBCODQ3RjAgLyog
U2Nyb2xsQmVoYXZpb3IuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJRTFDNDE1REUwRjY1NUQ3QzAw
OTJEMkZCIC8qIENyb3NzT3JpZ2luUHJlZmxpZ2h0UmVzdWx0Q2FjaGUuY3BwIGluIFNvdXJjZXMg
Ki8sCisJCQkJRTFDNDE2MTcwRjY1NjMxODAwOTJEMkZCIC8qIENyb3NzT3JpZ2luQWNjZXNzQ29u
dHJvbC5jcHAgaW4gU291cmNlcyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBv
c3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKSW5kZXg6IFdlYkNvcmUvbG9hZGVyL0Nyb3NzT3JpZ2lu
QWNjZXNzQ29udHJvbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9sb2FkZXIvQ3Jvc3NPcmln
aW5BY2Nlc3NDb250cm9sLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvbG9hZGVyL0Nyb3Nz
T3JpZ2luQWNjZXNzQ29udHJvbC5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsOTcgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQXBwbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVU
RVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRF
UiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNyb3NzT3JpZ2luQWNj
ZXNzQ29udHJvbC5oIgorCisjaW5jbHVkZSAiQXRvbWljU3RyaW5nLmgiCisjaW5jbHVkZSAiUmVz
b3VyY2VSZXNwb25zZS5oIgorI2luY2x1ZGUgIlNlY3VyaXR5T3JpZ2luLmgiCisjaW5jbHVkZSA8
d3RmL1RocmVhZGluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2Jvb2wgaXNPbkFjY2Vz
c0NvbnRyb2xTaW1wbGVSZXF1ZXN0SGVhZGVyV2hpdGVsaXN0KGNvbnN0IFN0cmluZyYgbmFtZSkK
K3sKKyAgICByZXR1cm4gZXF1YWxJZ25vcmluZ0Nhc2UobmFtZSwgImFjY2VwdCIpIHx8IGVxdWFs
SWdub3JpbmdDYXNlKG5hbWUsICJhY2NlcHQtbGFuZ3VhZ2UiKSB8fCBlcXVhbElnbm9yaW5nQ2Fz
ZShuYW1lLCAiY29udGVudC10eXBlIik7Cit9CisKK2Jvb2wgaXNTaW1wbGVDcm9zc09yaWdpbkFj
Y2Vzc1JlcXVlc3QoY29uc3QgU3RyaW5nJiBtZXRob2QsIGNvbnN0IEhUVFBIZWFkZXJNYXAmIGhl
YWRlck1hcCkKK3sKKyAgICBpZiAobWV0aG9kICE9ICJHRVQiICYmIG1ldGhvZCAhPSAiUE9TVCIp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEhUVFBIZWFkZXJNYXA6OmNvbnN0X2l0ZXJh
dG9yIGVuZCA9IGhlYWRlck1hcC5lbmQoKTsKKyAgICBmb3IgKEhUVFBIZWFkZXJNYXA6OmNvbnN0
X2l0ZXJhdG9yIGl0ID0gaGVhZGVyTWFwLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAg
ICAgICBpZiAoIWlzT25BY2Nlc3NDb250cm9sU2ltcGxlUmVxdWVzdEhlYWRlcldoaXRlbGlzdChp
dC0+Zmlyc3QpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVy
biB0cnVlOworfQorCit0eXBlZGVmIEhhc2hTZXQ8U3RyaW5nLCBDYXNlRm9sZGluZ0hhc2g+IEhU
VFBIZWFkZXJTZXQ7CitzdGF0aWMgSFRUUEhlYWRlclNldCogY3JlYXRlQWxsb3dlZENyb3NzT3Jp
Z2luUmVzcG9uc2VIZWFkZXJzU2V0KCkKK3sKKyAgICBIVFRQSGVhZGVyU2V0KiBoZWFkZXJTZXQg
PSBuZXcgSGFzaFNldDxTdHJpbmcsIENhc2VGb2xkaW5nSGFzaD47CisgICAgCisgICAgaGVhZGVy
U2V0LT5hZGQoImNhY2hlLWNvbnRyb2wiKTsKKyAgICBoZWFkZXJTZXQtPmFkZCgiY29udGVudC1s
YW5ndWFnZSIpOworICAgIGhlYWRlclNldC0+YWRkKCJjb250ZW50LXR5cGUiKTsKKyAgICBoZWFk
ZXJTZXQtPmFkZCgiZXhwaXJlcyIpOworICAgIGhlYWRlclNldC0+YWRkKCJsYXN0LW1vZGlmaWVk
Iik7CisgICAgaGVhZGVyU2V0LT5hZGQoInByYWdtYSIpOworCisgICAgcmV0dXJuIGhlYWRlclNl
dDsKK30KKworYm9vbCBpc09uQWNjZXNzQ29udHJvbFJlc3BvbnNlSGVhZGVyV2hpdGVsaXN0KGNv
bnN0IFN0cmluZyYgbmFtZSkKK3sKKyAgICBBdG9taWNhbGx5SW5pdGlhbGl6ZWRTdGF0aWMoSFRU
UEhlYWRlclNldCosIGFsbG93ZWRDcm9zc09yaWdpblJlc3BvbnNlSGVhZGVycyA9IGNyZWF0ZUFs
bG93ZWRDcm9zc09yaWdpblJlc3BvbnNlSGVhZGVyc1NldCgpKTsKKworICAgIHJldHVybiBhbGxv
d2VkQ3Jvc3NPcmlnaW5SZXNwb25zZUhlYWRlcnMtPmNvbnRhaW5zKG5hbWUpOworfQorCitib29s
IGFjY2Vzc0NvbnRyb2xDaGVjayhjb25zdCBSZXNvdXJjZVJlc3BvbnNlJiByZXNwb25zZSwgYm9v
bCBpbmNsdWRlQ3JlZGVudGlhbHMsIFNlY3VyaXR5T3JpZ2luKiBzZWN1cml0eU9yaWdpbikKK3sK
KyAgICBjb25zdCBTdHJpbmcmIGFjY2Vzc0NvbnRyb2xPcmlnaW5TdHJpbmcgPSByZXNwb25zZS5o
dHRwSGVhZGVyRmllbGQoIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbiIpOworICAgIGlmIChh
Y2Nlc3NDb250cm9sT3JpZ2luU3RyaW5nID09ICIqIiAmJiAhaW5jbHVkZUNyZWRlbnRpYWxzKQor
ICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIFJlZlB0cjxTZWN1cml0eU9yaWdpbj4gYWNjZXNz
Q29udHJvbE9yaWdpbiA9IFNlY3VyaXR5T3JpZ2luOjpjcmVhdGVGcm9tU3RyaW5nKGFjY2Vzc0Nv
bnRyb2xPcmlnaW5TdHJpbmcpOworICAgIGlmICghYWNjZXNzQ29udHJvbE9yaWdpbi0+aXNTYW1l
U2NoZW1lSG9zdFBvcnQoc2VjdXJpdHlPcmlnaW4pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBpZiAoaW5jbHVkZUNyZWRlbnRpYWxzKSB7CisgICAgICAgIGNvbnN0IFN0cmluZyYgYWNj
ZXNzQ29udHJvbENyZWRlbnRpYWxzU3RyaW5nID0gcmVzcG9uc2UuaHR0cEhlYWRlckZpZWxkKCJB
Y2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFscyIpOworICAgICAgICBpZiAoYWNjZXNzQ29u
dHJvbENyZWRlbnRpYWxzU3RyaW5nICE9ICJ0cnVlIikKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQoKUHJvcGVydHkgY2hhbmdlcyBvbjogV2ViQ29yZS9sb2FkZXIvQ3Jvc3NPcmlnaW5BY2Nlc3ND
b250cm9sLmNwcApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fCk5hbWU6IHN2bjplb2wtc3R5bGUKICAgKyBuYXRpdmUKCklu
ZGV4OiBXZWJDb3JlL2xvYWRlci9Dcm9zc09yaWdpbkFjY2Vzc0NvbnRyb2wuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL2xvYWRlci9Dcm9zc09yaWdpbkFjY2Vzc0NvbnRyb2wuaAkocmV2aXNpb24g
MCkKKysrIFdlYkNvcmUvbG9hZGVyL0Nyb3NzT3JpZ2luQWNjZXNzQ29udHJvbC5oCShyZXZpc2lv
biAwKQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIElu
Yy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKgorICovCisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KworICAgIGNsYXNzIEhUVFBIZWFkZXJNYXA7CisgICAgY2xhc3MgUmVzb3VyY2VSZXNwb25zZTsK
KyAgICBjbGFzcyBTZWN1cml0eU9yaWdpbjsKKyAgICBjbGFzcyBTdHJpbmc7CisKKyAgICBib29s
IGlzU2ltcGxlQ3Jvc3NPcmlnaW5BY2Nlc3NSZXF1ZXN0KGNvbnN0IFN0cmluZyYgbWV0aG9kLCBj
b25zdCBIVFRQSGVhZGVyTWFwJik7CisgICAgYm9vbCBpc09uQWNjZXNzQ29udHJvbFNpbXBsZVJl
cXVlc3RIZWFkZXJXaGl0ZWxpc3QoY29uc3QgU3RyaW5nJik7CisgICAgYm9vbCBpc09uQWNjZXNz
Q29udHJvbFJlc3BvbnNlSGVhZGVyV2hpdGVsaXN0KGNvbnN0IFN0cmluZyYpOworCisgICAgYm9v
bCBhY2Nlc3NDb250cm9sQ2hlY2soY29uc3QgUmVzb3VyY2VSZXNwb25zZSYsIGJvb2wgaW5jbHVk
ZUNyZWRlbnRpYWxzLCBTZWN1cml0eU9yaWdpbiopOworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
CgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBXZWJDb3JlL2xvYWRlci9Dcm9zc09yaWdpbkFjY2Vzc0Nv
bnRyb2wuaApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fCk5hbWU6IHN2bjplb2wtc3R5bGUKICAgKyBuYXRpdmUKCkluZGV4
OiBXZWJDb3JlL2xvYWRlci9Dcm9zc09yaWdpblByZWZsaWdodFJlc3VsdENhY2hlLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL2xvYWRlci9Dcm9zc09yaWdpblByZWZsaWdodFJlc3VsdENhY2hl
LmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvbG9hZGVyL0Nyb3NzT3JpZ2luUHJlZmxpZ2h0
UmVzdWx0Q2FjaGUuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAwOCBBcHBsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICoKKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ3Jvc3NPcmlnaW5QcmVmbGlnaHRS
ZXN1bHRDYWNoZS5oIgorCisjaW5jbHVkZSAiQ3Jvc3NPcmlnaW5BY2Nlc3NDb250cm9sLmgiCisj
aW5jbHVkZSAiUmVzb3VyY2VSZXNwb25zZS5oIgorI2luY2x1ZGUgPHd0Zi9DdXJyZW50VGltZS5o
PgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2Jvb2wgQ3Jvc3NPcmlnaW5QcmVmbGlnaHRSZXN1
bHRDYWNoZUl0ZW06OnBhcnNlQWNjZXNzQ29udHJvbE1heEFnZShjb25zdCBTdHJpbmcmIHN0cmlu
ZywgdW5zaWduZWQmIGV4cGlyeURlbHRhKQoreworICAgIC8vIEZJWE1FOiB0aGlzIHdpbGwgbm90
IGRvIHRoZSBjb3JyZWN0IHRoaW5nIGZvciBhIG51bWJlciBzdGFydGluZyB3aXRoIGEgJysnCisg
ICAgYm9vbCBvayA9IGZhbHNlOworICAgIGV4cGlyeURlbHRhID0gc3RyaW5nLnRvVUludFN0cmlj
dCgmb2spOworICAgIHJldHVybiBvazsKK30KKworYm9vbCBDcm9zc09yaWdpblByZWZsaWdodFJl
c3VsdENhY2hlSXRlbTo6cGFyc2UoY29uc3QgUmVzb3VyY2VSZXNwb25zZSYgcmVzcG9uc2UpCit7
CisgICAgbV9tZXRob2RzLmNsZWFyKCk7CisgICAgaWYgKCFwYXJzZUFjY2Vzc0NvbnRyb2xBbGxv
d0xpc3QocmVzcG9uc2UuaHR0cEhlYWRlckZpZWxkKCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRo
b2RzIiksIG1fbWV0aG9kcykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIG1faGVhZGVy
cy5jbGVhcigpOworICAgIGlmICghcGFyc2VBY2Nlc3NDb250cm9sQWxsb3dMaXN0KHJlc3BvbnNl
Lmh0dHBIZWFkZXJGaWVsZCgiQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVycyIpLCBtX2hlYWRl
cnMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB1bnNpZ25lZCBleHBpcnlEZWx0YSA9
IDA7CisgICAgaWYgKCFwYXJzZUFjY2Vzc0NvbnRyb2xNYXhBZ2UocmVzcG9uc2UuaHR0cEhlYWRl
ckZpZWxkKCJBY2Nlc3MtQ29udHJvbC1NYXgtQWdlIiksIGV4cGlyeURlbHRhKSkKKyAgICAgICAg
ZXhwaXJ5RGVsdGEgPSA1OworCisgICAgbV9hYnNvbHV0ZUV4cGlyeVRpbWUgPSBjdXJyZW50VGlt
ZSgpICsgZXhwaXJ5RGVsdGE7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ3Jvc3NPcmln
aW5QcmVmbGlnaHRSZXN1bHRDYWNoZUl0ZW06OmFsbG93c0Nyb3NzT3JpZ2luTWV0aG9kKGNvbnN0
IFN0cmluZyYgbWV0aG9kKSBjb25zdAoreworICAgIHJldHVybiBtX21ldGhvZHMuY29udGFpbnMo
bWV0aG9kKSB8fCBtZXRob2QgPT0gIkdFVCIgfHwgbWV0aG9kID09ICJQT1NUIjsKK30KKworYm9v
bCBDcm9zc09yaWdpblByZWZsaWdodFJlc3VsdENhY2hlSXRlbTo6YWxsb3dzQ3Jvc3NPcmlnaW5I
ZWFkZXJzKGNvbnN0IEhUVFBIZWFkZXJNYXAmIHJlcXVlc3RIZWFkZXJzKSBjb25zdAoreworICAg
IEhUVFBIZWFkZXJNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IHJlcXVlc3RIZWFkZXJzLmVuZCgp
OworICAgIGZvciAoSFRUUEhlYWRlck1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSByZXF1ZXN0SGVh
ZGVycy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgaWYgKCFtX2hlYWRlcnMu
Y29udGFpbnMoaXQtPmZpcnN0KSAmJiAhaXNPbkFjY2Vzc0NvbnRyb2xTaW1wbGVSZXF1ZXN0SGVh
ZGVyV2hpdGVsaXN0KGl0LT5maXJzdCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
fQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIENyb3NzT3JpZ2luUHJlZmxpZ2h0UmVzdWx0
Q2FjaGVJdGVtOjphbGxvd3NSZXF1ZXN0KGJvb2wgaW5jbHVkZUNyZWRlbnRpYWxzLCBjb25zdCBT
dHJpbmcmIG1ldGhvZCwgY29uc3QgSFRUUEhlYWRlck1hcCYgcmVxdWVzdEhlYWRlcnMpIGNvbnN0
Cit7CisgICAgaWYgKG1fYWJzb2x1dGVFeHBpcnlUaW1lIDwgY3VycmVudFRpbWUoKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChpbmNsdWRlQ3JlZGVudGlhbHMgJiYgIW1fY3JlZGVu
dGlhbHMpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIWFsbG93c0Nyb3NzT3JpZ2lu
TWV0aG9kKG1ldGhvZCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIWFsbG93c0Ny
b3NzT3JpZ2luSGVhZGVycyhyZXF1ZXN0SGVhZGVycykpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICByZXR1cm4gdHJ1ZTsKK30KKworQ3Jvc3NPcmlnaW5QcmVmbGlnaHRSZXN1bHRDYWNoZSYg
Q3Jvc3NPcmlnaW5QcmVmbGlnaHRSZXN1bHRDYWNoZTo6c2hhcmVkKCkKK3sKKyAgICBBdG9taWNh
bGx5SW5pdGlhbGl6ZWRTdGF0aWMoQ3Jvc3NPcmlnaW5QcmVmbGlnaHRSZXN1bHRDYWNoZSYsIGNh
Y2hlID0gKm5ldyBDcm9zc09yaWdpblByZWZsaWdodFJlc3VsdENhY2hlKTsKKyAgICByZXR1cm4g
Y2FjaGU7Cit9CisKK3ZvaWQgQ3Jvc3NPcmlnaW5QcmVmbGlnaHRSZXN1bHRDYWNoZTo6YXBwZW5k
RW50cnkoY29uc3QgU3RyaW5nJiBvcmlnaW4sIGNvbnN0IEtVUkwmIHVybCwgQ3Jvc3NPcmlnaW5Q
cmVmbGlnaHRSZXN1bHRDYWNoZUl0ZW0qIHByZWZsaWdodFJlc3VsdCkKK3sKKyAgICBNdXRleExv
Y2tlciBsb2NrKG1fbXV0ZXgpOworICAgIC8vIE5vdGUgdGhhdCB0aGUgZW50cnkgbWF5IGFscmVh
ZHkgYmUgcHJlc2VudCBpbiB0aGUgSGFzaE1hcCBpZiBhbm90aGVyIHRocmVhZCBpcyBhY2Nlc3Np
bmcgdGhlIHNhbWUgbG9jYXRpb24uCisgICAgbV9wcmVmbGlnaHRIYXNoTWFwLnNldChzdGQ6Om1h
a2VfcGFpcihvcmlnaW4uY29weSgpLCB1cmwuY29weSgpKSwgcHJlZmxpZ2h0UmVzdWx0KTsKK30K
KworYm9vbCBDcm9zc09yaWdpblByZWZsaWdodFJlc3VsdENhY2hlOjpjYW5Ta2lwUHJlZmxpZ2h0
KGNvbnN0IFN0cmluZyYgb3JpZ2luLCBjb25zdCBLVVJMJiB1cmwsIGJvb2wgaW5jbHVkZUNyZWRl
bnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25z
dCBTdHJpbmcmIG1ldGhvZCwgY29uc3QgSFRUUEhlYWRlck1hcCYgcmVxdWVzdEhlYWRlcnMpCit7
CisgICAgTXV0ZXhMb2NrZXIgbG9jayhtX211dGV4KTsKKyAgICBDcm9zc09yaWdpblByZWZsaWdo
dFJlc3VsdEhhc2hNYXA6Oml0ZXJhdG9yIGNhY2hlSXQgPSBtX3ByZWZsaWdodEhhc2hNYXAuZmlu
ZChzdGQ6Om1ha2VfcGFpcihvcmlnaW4sIHVybCkpOworICAgIGlmIChjYWNoZUl0ID09IG1fcHJl
ZmxpZ2h0SGFzaE1hcC5lbmQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGNh
Y2hlSXQtPnNlY29uZC0+YWxsb3dzUmVxdWVzdChpbmNsdWRlQ3JlZGVudGlhbHMsIG1ldGhvZCwg
cmVxdWVzdEhlYWRlcnMpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGRlbGV0ZSBjYWNo
ZUl0LT5zZWNvbmQ7CisgICAgbV9wcmVmbGlnaHRIYXNoTWFwLnJlbW92ZShjYWNoZUl0KTsKKyAg
ICByZXR1cm4gZmFsc2U7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKClByb3BlcnR5IGNo
YW5nZXMgb246IFdlYkNvcmUvbG9hZGVyL0Nyb3NzT3JpZ2luUHJlZmxpZ2h0UmVzdWx0Q2FjaGUu
Y3BwCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX18KTmFtZTogc3ZuOmVvbC1zdHlsZQogICArIG5hdGl2ZQoKSW5kZXg6IFdl
YkNvcmUvbG9hZGVyL0Nyb3NzT3JpZ2luUHJlZmxpZ2h0UmVzdWx0Q2FjaGUuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL2xvYWRlci9Dcm9zc09yaWdpblByZWZsaWdodFJlc3VsdENhY2hlLmgJKHJl
dmlzaW9uIDApCisrKyBXZWJDb3JlL2xvYWRlci9Dcm9zc09yaWdpblByZWZsaWdodFJlc3VsdENh
Y2hlLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA4IEFwcGxlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKgorICovCisKKyNpbmNs
dWRlICJLVVJMSGFzaC5oIgorI2luY2x1ZGUgIlN0cmluZ0hhc2guaCIKKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCisgICAgY2xhc3MgSFRUUEhlYWRlck1hcDsKKyAgICBjbGFzcyBSZXNvdXJjZVJl
c3BvbnNlOworCisgICAgY2xhc3MgQ3Jvc3NPcmlnaW5QcmVmbGlnaHRSZXN1bHRDYWNoZUl0ZW0g
OiBOb25jb3B5YWJsZSB7CisgICAgcHVibGljOgorICAgICAgICBDcm9zc09yaWdpblByZWZsaWdo
dFJlc3VsdENhY2hlSXRlbShib29sIGNyZWRlbnRpYWxzKQorICAgICAgICAgICAgOiBtX2Fic29s
dXRlRXhwaXJ5VGltZSgwKQorICAgICAgICAgICAgLCBtX2NyZWRlbnRpYWxzKGNyZWRlbnRpYWxz
KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBib29sIHBhcnNlKGNvbnN0IFJlc291
cmNlUmVzcG9uc2UmKTsKKyAgICAgICAgYm9vbCBhbGxvd3NDcm9zc09yaWdpbk1ldGhvZChjb25z
dCBTdHJpbmcmKSBjb25zdDsKKyAgICAgICAgYm9vbCBhbGxvd3NDcm9zc09yaWdpbkhlYWRlcnMo
Y29uc3QgSFRUUEhlYWRlck1hcCYpIGNvbnN0OworICAgICAgICBib29sIGFsbG93c1JlcXVlc3Qo
Ym9vbCBpbmNsdWRlQ3JlZGVudGlhbHMsIGNvbnN0IFN0cmluZyYgbWV0aG9kLCBjb25zdCBIVFRQ
SGVhZGVyTWFwJiByZXF1ZXN0SGVhZGVycykgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAg
ICB0ZW1wbGF0ZTxjbGFzcyBIYXNoVHlwZT4KKyAgICAgICAgc3RhdGljIHZvaWQgYWRkVG9BY2Nl
c3NDb250cm9sQWxsb3dMaXN0KGNvbnN0IFN0cmluZyYgc3RyaW5nLCB1bnNpZ25lZCBzdGFydCwg
dW5zaWduZWQgZW5kLCBIYXNoU2V0PFN0cmluZywgSGFzaFR5cGU+Jik7CisgICAgICAgIHRlbXBs
YXRlPGNsYXNzIEhhc2hUeXBlPgorICAgICAgICBzdGF0aWMgYm9vbCBwYXJzZUFjY2Vzc0NvbnRy
b2xBbGxvd0xpc3QoY29uc3QgU3RyaW5nJiBzdHJpbmcsIEhhc2hTZXQ8U3RyaW5nLCBIYXNoVHlw
ZT4mKTsKKyAgICAgICAgc3RhdGljIGJvb2wgcGFyc2VBY2Nlc3NDb250cm9sTWF4QWdlKGNvbnN0
IFN0cmluZyYgc3RyaW5nLCB1bnNpZ25lZCYgZXhwaXJ5RGVsdGEpOworCisgICAgICAgIHR5cGVk
ZWYgSGFzaFNldDxTdHJpbmcsIENhc2VGb2xkaW5nSGFzaD4gSGVhZGVyc1NldDsKKworICAgICAg
ICAvLyBGSVhNRTogQSBiZXR0ZXIgc29sdXRpb24gdG8gaG9sZGluZyBvbnRvIHRoZSBhYnNvbHV0
ZSBleHBpcmF0aW9uIHRpbWUgbWlnaHQgYmUKKyAgICAgICAgLy8gdG8gc3RhcnQgYSB0aW1lciBm
b3IgdGhlIGV4cGlyYXRpb24gZGVsdGEsIHRoYXQgcmVtb3ZlcyB0aGlzIGZyb20gdGhlIGNhY2hl
IHdoZW4KKyAgICAgICAgLy8gaXQgZmlyZXMuCisgICAgICAgIGRvdWJsZSBtX2Fic29sdXRlRXhw
aXJ5VGltZTsKKyAgICAgICAgYm9vbCBtX2NyZWRlbnRpYWxzOworICAgICAgICBIYXNoU2V0PFN0
cmluZz4gbV9tZXRob2RzOworICAgICAgICBIZWFkZXJzU2V0IG1faGVhZGVyczsKKyAgICB9Owor
CisgICAgY2xhc3MgQ3Jvc3NPcmlnaW5QcmVmbGlnaHRSZXN1bHRDYWNoZSA6IE5vbmNvcHlhYmxl
IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHN0YXRpYyBDcm9zc09yaWdpblByZWZsaWdodFJlc3Vs
dENhY2hlJiBzaGFyZWQoKTsKKworICAgICAgICB2b2lkIGFwcGVuZEVudHJ5KGNvbnN0IFN0cmlu
ZyYgb3JpZ2luLCBjb25zdCBLVVJMJiwgQ3Jvc3NPcmlnaW5QcmVmbGlnaHRSZXN1bHRDYWNoZUl0
ZW0qKTsKKyAgICAgICAgYm9vbCBjYW5Ta2lwUHJlZmxpZ2h0KGNvbnN0IFN0cmluZyYgb3JpZ2lu
LCBjb25zdCBLVVJMJiwgYm9vbCBpbmNsdWRlQ3JlZGVudGlhbHMsIGNvbnN0IFN0cmluZyYgbWV0
aG9kLCBjb25zdCBIVFRQSGVhZGVyTWFwJiByZXF1ZXN0SGVhZGVycyk7CisKKyAgICBwcml2YXRl
OgorICAgICAgICBDcm9zc09yaWdpblByZWZsaWdodFJlc3VsdENhY2hlKCkgeyB9CisKKyAgICAg
ICAgdHlwZWRlZiBIYXNoTWFwPHN0ZDo6cGFpcjxTdHJpbmcsIEtVUkw+LCBDcm9zc09yaWdpblBy
ZWZsaWdodFJlc3VsdENhY2hlSXRlbSo+IENyb3NzT3JpZ2luUHJlZmxpZ2h0UmVzdWx0SGFzaE1h
cDsKKworICAgICAgICBDcm9zc09yaWdpblByZWZsaWdodFJlc3VsdEhhc2hNYXAgbV9wcmVmbGln
aHRIYXNoTWFwOworICAgICAgICBNdXRleCBtX211dGV4OworICAgIH07CisKKyAgICB0ZW1wbGF0
ZTxjbGFzcyBIYXNoVHlwZT4KKyAgICB2b2lkIENyb3NzT3JpZ2luUHJlZmxpZ2h0UmVzdWx0Q2Fj
aGVJdGVtOjphZGRUb0FjY2Vzc0NvbnRyb2xBbGxvd0xpc3QoY29uc3QgU3RyaW5nJiBzdHJpbmcs
IHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBlbmQsIEhhc2hTZXQ8U3RyaW5nLCBIYXNoVHlwZT4m
IHNldCkKKyAgICB7CisgICAgICAgIFN0cmluZ0ltcGwqIHN0cmluZ0ltcGwgPSBzdHJpbmcuaW1w
bCgpOworICAgICAgICBpZiAoIXN0cmluZ0ltcGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAg
ICAgICAgLy8gU2tpcCB3aGl0ZSBzcGFjZSBmcm9tIHN0YXJ0LgorICAgICAgICB3aGlsZSAoc3Rh
cnQgPD0gZW5kICYmIGlzU3BhY2VPck5ld2xpbmUoKCpzdHJpbmdJbXBsKVtzdGFydF0pKQorICAg
ICAgICAgICAgc3RhcnQrKzsKKworICAgICAgICAvLyBvbmx5IHdoaXRlIHNwYWNlCisgICAgICAg
IGlmIChzdGFydCA+IGVuZCkgCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gU2tp
cCB3aGl0ZSBzcGFjZSBmcm9tIGVuZC4KKyAgICAgICAgd2hpbGUgKGVuZCAmJiBpc1NwYWNlT3JO
ZXdsaW5lKCgqc3RyaW5nSW1wbClbZW5kXSkpCisgICAgICAgICAgICBlbmQtLTsKKworICAgICAg
ICAvLyBzdWJzdHJpbmdDb3B5KCkgaXMgY2FsbGVkIG9uIHRoZSBzdHJpbmdzIGJlY2F1c2UgdGhl
IGNhY2hlIGlzIGFjY2Vzc2VkIG9uIG11bHRpcGxlIHRocmVhZHMuCisgICAgICAgIHNldC5hZGQo
c3RyaW5nLnN1YnN0cmluZ0NvcHkoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSkpOworICAgIH0KKwor
ICAgIHRlbXBsYXRlPGNsYXNzIEhhc2hUeXBlPgorICAgIGJvb2wgQ3Jvc3NPcmlnaW5QcmVmbGln
aHRSZXN1bHRDYWNoZUl0ZW06OnBhcnNlQWNjZXNzQ29udHJvbEFsbG93TGlzdChjb25zdCBTdHJp
bmcmIHN0cmluZywgSGFzaFNldDxTdHJpbmcsIEhhc2hUeXBlPiYgc2V0KQorICAgIHsKKyAgICAg
ICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgaW50IGVuZDsKKyAgICAgICAgd2hpbGUgKChlbmQg
PSBzdHJpbmcuZmluZCgnLCcsIHN0YXJ0KSkgIT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChzdGFy
dCA9PSBlbmQpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBh
ZGRUb0FjY2Vzc0NvbnRyb2xBbGxvd0xpc3Qoc3RyaW5nLCBzdGFydCwgZW5kIC0gMSwgc2V0KTsK
KyAgICAgICAgICAgIHN0YXJ0ID0gZW5kICsgMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3Rh
cnQgIT0gc3RhdGljX2Nhc3Q8aW50PihzdHJpbmcubGVuZ3RoKCkpKQorICAgICAgICAgICAgYWRk
VG9BY2Nlc3NDb250cm9sQWxsb3dMaXN0KHN0cmluZywgc3RhcnQsIHN0cmluZy5sZW5ndGgoKSAt
IDEsIHNldCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCit9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBXZWJDb3JlL2xvYWRlci9Dcm9zc09yaWdp
blByZWZsaWdodFJlc3VsdENhY2hlLmgKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpOYW1lOiBzdm46ZW9sLXN0eWxlCiAg
ICsgbmF0aXZlCgpJbmRleDogV2ViQ29yZS94bWwvWE1MSHR0cFJlcXVlc3QuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUveG1sL1hNTEh0dHBSZXF1ZXN0LmNwcAkocmV2aXNpb24gNDE1MjYpCisr
KyBXZWJDb3JlL3htbC9YTUxIdHRwUmVxdWVzdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIzLDYg
KzIzLDggQEAKICNpbmNsdWRlICJYTUxIdHRwUmVxdWVzdC5oIgogCiAjaW5jbHVkZSAiQ1N0cmlu
Zy5oIgorI2luY2x1ZGUgIkNyb3NzT3JpZ2luQWNjZXNzQ29udHJvbC5oIgorI2luY2x1ZGUgIkNy
b3NzT3JpZ2luUHJlZmxpZ2h0UmVzdWx0Q2FjaGUuaCIKICNpbmNsdWRlICJET01JbXBsZW1lbnRh
dGlvbi5oIgogI2luY2x1ZGUgIkRvY3VtZW50LmgiCiAjaW5jbHVkZSAiRXZlbnQuaCIKQEAgLTMx
LDI0ICszMywxNiBAQAogI2luY2x1ZGUgIkV2ZW50TmFtZXMuaCIKICNpbmNsdWRlICJGaWxlLmgi
CiAjaW5jbHVkZSAiSFRUUFBhcnNlcnMuaCIKLSNpbmNsdWRlICJLVVJMLmgiCi0jaW5jbHVkZSAi
S1VSTEhhc2guaCIKICNpbmNsdWRlICJSZXNvdXJjZUVycm9yLmgiCiAjaW5jbHVkZSAiUmVzb3Vy
Y2VSZXF1ZXN0LmgiCi0jaW5jbHVkZSAiU2NyaXB0RXhlY3V0aW9uQ29udGV4dC5oIgotI2luY2x1
ZGUgIlNlY3VyaXR5T3JpZ2luLmgiCiAjaW5jbHVkZSAiU2V0dGluZ3MuaCIKLSNpbmNsdWRlICJT
eXN0ZW1UaW1lLmgiCiAjaW5jbHVkZSAiVGV4dFJlc291cmNlRGVjb2Rlci5oIgogI2luY2x1ZGUg
IlRocmVhZGFibGVMb2FkZXIuaCIKICNpbmNsdWRlICJYTUxIdHRwUmVxdWVzdEV4Y2VwdGlvbi5o
IgogI2luY2x1ZGUgIlhNTEh0dHBSZXF1ZXN0UHJvZ3Jlc3NFdmVudC5oIgogI2luY2x1ZGUgIlhN
TEh0dHBSZXF1ZXN0VXBsb2FkLmgiCiAjaW5jbHVkZSAibWFya3VwLmgiCi0jaW5jbHVkZSA8d3Rm
L0N1cnJlbnRUaW1lLmg+Ci0jaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+CiAjaW5jbHVkZSA8
d3RmL1N0ZExpYkV4dHJhcy5oPgotI2luY2x1ZGUgPHd0Zi9UaHJlYWRpbmcuaD4KIAogI2lmIFVT
RShKU0MpCiAjaW5jbHVkZSAiSlNET01XaW5kb3cuaCIKQEAgLTU2LDE0ICs1MCwxMSBAQAogCiBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAKLXR5cGVkZWYgSGFzaFNldDxTdHJpbmcsIENhc2VGb2xkaW5n
SGFzaD4gSGVhZGVyc1NldDsKLQogc3RydWN0IFhNTEh0dHBSZXF1ZXN0U3RhdGljRGF0YSB7CiAg
ICAgWE1MSHR0cFJlcXVlc3RTdGF0aWNEYXRhKCk7CiAgICAgU3RyaW5nIG1fcHJveHlIZWFkZXJQ
cmVmaXg7CiAgICAgU3RyaW5nIG1fc2VjSGVhZGVyUHJlZml4OwogICAgIEhhc2hTZXQ8U3RyaW5n
LCBDYXNlRm9sZGluZ0hhc2g+IG1fZm9yYmlkZGVuUmVxdWVzdEhlYWRlcnM7Ci0gICAgSGFzaFNl
dDxTdHJpbmcsIENhc2VGb2xkaW5nSGFzaD4gbV9hbGxvd2VkQ3Jvc3NTaXRlUmVzcG9uc2VIZWFk
ZXJzOwogfTsKIAogWE1MSHR0cFJlcXVlc3RTdGF0aWNEYXRhOjpYTUxIdHRwUmVxdWVzdFN0YXRp
Y0RhdGEoKQpAQCAtODUsNjMgKzc2LDYgQEAgWE1MSHR0cFJlcXVlc3RTdGF0aWNEYXRhOjpYTUxI
dHRwUmVxdWVzdAogICAgIG1fZm9yYmlkZGVuUmVxdWVzdEhlYWRlcnMuYWRkKCJ0cmFuc2Zlci1l
bmNvZGluZyIpOwogICAgIG1fZm9yYmlkZGVuUmVxdWVzdEhlYWRlcnMuYWRkKCJ1cGdyYWRlIik7
CiAgICAgbV9mb3JiaWRkZW5SZXF1ZXN0SGVhZGVycy5hZGQoInZpYSIpOwotCi0gICAgbV9hbGxv
d2VkQ3Jvc3NTaXRlUmVzcG9uc2VIZWFkZXJzLmFkZCgiY2FjaGUtY29udHJvbCIpOwotICAgIG1f
YWxsb3dlZENyb3NzU2l0ZVJlc3BvbnNlSGVhZGVycy5hZGQoImNvbnRlbnQtbGFuZ3VhZ2UiKTsK
LSAgICBtX2FsbG93ZWRDcm9zc1NpdGVSZXNwb25zZUhlYWRlcnMuYWRkKCJjb250ZW50LXR5cGUi
KTsKLSAgICBtX2FsbG93ZWRDcm9zc1NpdGVSZXNwb25zZUhlYWRlcnMuYWRkKCJleHBpcmVzIik7
Ci0gICAgbV9hbGxvd2VkQ3Jvc3NTaXRlUmVzcG9uc2VIZWFkZXJzLmFkZCgibGFzdC1tb2RpZmll
ZCIpOwotICAgIG1fYWxsb3dlZENyb3NzU2l0ZVJlc3BvbnNlSGVhZGVycy5hZGQoInByYWdtYSIp
OwotfQotCi1jbGFzcyBQcmVmbGlnaHRSZXN1bHRDYWNoZUl0ZW0gOiBOb25jb3B5YWJsZSB7Ci1w
dWJsaWM6Ci0gICAgUHJlZmxpZ2h0UmVzdWx0Q2FjaGVJdGVtKGJvb2wgY3JlZGVudGlhbHMpCi0g
ICAgICAgIDogbV9hYnNvbHV0ZUV4cGlyeVRpbWUoMCkKLSAgICAgICAgLCBtX2NyZWRlbnRpYWxz
KGNyZWRlbnRpYWxzKQotICAgIHsKLSAgICB9Ci0KLSAgICBib29sIHBhcnNlKGNvbnN0IFJlc291
cmNlUmVzcG9uc2UmKTsKLSAgICBib29sIGFsbG93c0Nyb3NzU2l0ZU1ldGhvZChjb25zdCBTdHJp
bmcmKSBjb25zdDsKLSAgICBib29sIGFsbG93c0Nyb3NzU2l0ZUhlYWRlcnMoY29uc3QgSFRUUEhl
YWRlck1hcCYpIGNvbnN0OwotICAgIGJvb2wgYWxsb3dzUmVxdWVzdChib29sIGluY2x1ZGVDcmVk
ZW50aWFscywgY29uc3QgU3RyaW5nJiBtZXRob2QsIGNvbnN0IEhUVFBIZWFkZXJNYXAmIHJlcXVl
c3RIZWFkZXJzKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICB0ZW1wbGF0ZTxjbGFzcyBIYXNoVHlw
ZT4KLSAgICBzdGF0aWMgdm9pZCBhZGRUb0FjY2Vzc0NvbnRyb2xBbGxvd0xpc3QoY29uc3QgU3Ry
aW5nJiBzdHJpbmcsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBlbmQsIEhhc2hTZXQ8U3RyaW5n
LCBIYXNoVHlwZT4mKTsKLSAgICB0ZW1wbGF0ZTxjbGFzcyBIYXNoVHlwZT4KLSAgICBzdGF0aWMg
Ym9vbCBwYXJzZUFjY2Vzc0NvbnRyb2xBbGxvd0xpc3QoY29uc3QgU3RyaW5nJiBzdHJpbmcsIEhh
c2hTZXQ8U3RyaW5nLCBIYXNoVHlwZT4mKTsKLSAgICBzdGF0aWMgYm9vbCBwYXJzZUFjY2Vzc0Nv
bnRyb2xNYXhBZ2UoY29uc3QgU3RyaW5nJiBzdHJpbmcsIHVuc2lnbmVkJiBleHBpcnlEZWx0YSk7
Ci0KLSAgICAvLyBGSVhNRTogQSBiZXR0ZXIgc29sdXRpb24gdG8gaG9sZGluZyBvbnRvIHRoZSBh
YnNvbHV0ZSBleHBpcmF0aW9uIHRpbWUgbWlnaHQgYmUKLSAgICAvLyB0byBzdGFydCBhIHRpbWVy
IGZvciB0aGUgZXhwaXJhdGlvbiBkZWx0YSwgdGhhdCByZW1vdmVzIHRoaXMgZnJvbSB0aGUgY2Fj
aGUgd2hlbgotICAgIC8vIGl0IGZpcmVzLgotICAgIGRvdWJsZSBtX2Fic29sdXRlRXhwaXJ5VGlt
ZTsKLSAgICBib29sIG1fY3JlZGVudGlhbHM7Ci0gICAgSGFzaFNldDxTdHJpbmc+IG1fbWV0aG9k
czsKLSAgICBIZWFkZXJzU2V0IG1faGVhZGVyczsKLX07Ci0KLWNsYXNzIFByZWZsaWdodFJlc3Vs
dENhY2hlIDogTm9uY29weWFibGUgewotcHVibGljOgotICAgIHN0YXRpYyBQcmVmbGlnaHRSZXN1
bHRDYWNoZSYgc2hhcmVkKCk7Ci0KLSAgICB2b2lkIGFwcGVuZEVudHJ5KGNvbnN0IFN0cmluZyYg
b3JpZ2luLCBjb25zdCBLVVJMJiwgUHJlZmxpZ2h0UmVzdWx0Q2FjaGVJdGVtKik7Ci0gICAgYm9v
bCBjYW5Ta2lwUHJlZmxpZ2h0KGNvbnN0IFN0cmluZyYgb3JpZ2luLCBjb25zdCBLVVJMJiwgYm9v
bCBpbmNsdWRlQ3JlZGVudGlhbHMsIGNvbnN0IFN0cmluZyYgbWV0aG9kLCBjb25zdCBIVFRQSGVh
ZGVyTWFwJiByZXF1ZXN0SGVhZGVycyk7Ci0KLXByaXZhdGU6Ci0gICAgUHJlZmxpZ2h0UmVzdWx0
Q2FjaGUoKSB7IH0KLQotICAgIHR5cGVkZWYgSGFzaE1hcDxzdGQ6OnBhaXI8U3RyaW5nLCBLVVJM
PiwgUHJlZmxpZ2h0UmVzdWx0Q2FjaGVJdGVtKj4gUHJlZmxpZ2h0UmVzdWx0SGFzaE1hcDsKLQot
ICAgIFByZWZsaWdodFJlc3VsdEhhc2hNYXAgbV9wcmVmbGlnaHRIYXNoTWFwOwotICAgIE11dGV4
IG1fbXV0ZXg7Ci19OwotCi1zdGF0aWMgYm9vbCBpc09uQWNjZXNzQ29udHJvbFNpbXBsZVJlcXVl
c3RIZWFkZXJXaGl0ZWxpc3QoY29uc3QgU3RyaW5nJiBuYW1lKQotewotICAgIHJldHVybiBlcXVh
bElnbm9yaW5nQ2FzZShuYW1lLCAiYWNjZXB0IikgfHwgZXF1YWxJZ25vcmluZ0Nhc2UobmFtZSwg
ImFjY2VwdC1sYW5ndWFnZSIpIHx8IGVxdWFsSWdub3JpbmdDYXNlKG5hbWUsICJjb250ZW50LXR5
cGUiKTsKIH0KIAogLy8gRGV0ZXJtaW5lcyBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIHRva2VuLCBh
cyBkZWZpbmVkIGJ5CkBAIC0xNzgsMTMxICsxMTIsNiBAQCBzdGF0aWMgYm9vbCBpc1NldENvb2tp
ZUhlYWRlcihjb25zdCBBdG9tCiAgICAgcmV0dXJuIGVxdWFsSWdub3JpbmdDYXNlKG5hbWUsICJz
ZXQtY29va2llIikgfHwgZXF1YWxJZ25vcmluZ0Nhc2UobmFtZSwgInNldC1jb29raWUyIik7CiB9
CiAKLXRlbXBsYXRlPGNsYXNzIEhhc2hUeXBlPgotdm9pZCBQcmVmbGlnaHRSZXN1bHRDYWNoZUl0
ZW06OmFkZFRvQWNjZXNzQ29udHJvbEFsbG93TGlzdChjb25zdCBTdHJpbmcmIHN0cmluZywgdW5z
aWduZWQgc3RhcnQsIHVuc2lnbmVkIGVuZCwgSGFzaFNldDxTdHJpbmcsIEhhc2hUeXBlPiYgc2V0
KQotewotICAgIFN0cmluZ0ltcGwqIHN0cmluZ0ltcGwgPSBzdHJpbmcuaW1wbCgpOwotICAgIGlm
ICghc3RyaW5nSW1wbCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gU2tpcCB3aGl0ZSBzcGFj
ZSBmcm9tIHN0YXJ0LgotICAgIHdoaWxlIChzdGFydCA8PSBlbmQgJiYgaXNTcGFjZU9yTmV3bGlu
ZSgoKnN0cmluZ0ltcGwpW3N0YXJ0XSkpCi0gICAgICAgIHN0YXJ0Kys7Ci0KLSAgICAvLyBvbmx5
IHdoaXRlIHNwYWNlCi0gICAgaWYgKHN0YXJ0ID4gZW5kKSAKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgLy8gU2tpcCB3aGl0ZSBzcGFjZSBmcm9tIGVuZC4KLSAgICB3aGlsZSAoZW5kICYmIGlzU3Bh
Y2VPck5ld2xpbmUoKCpzdHJpbmdJbXBsKVtlbmRdKSkKLSAgICAgICAgZW5kLS07Ci0KLSAgICAv
LyBzdWJzdHJpbmdDb3B5KCkgaXMgY2FsbGVkIG9uIHRoZSBzdHJpbmdzIGJlY2F1c2UgdGhlIGNh
Y2hlIGlzIGFjY2Vzc2VkIG9uIG11bHRpcGxlIHRocmVhZHMuCi0gICAgc2V0LmFkZChzdHJpbmcu
c3Vic3RyaW5nQ29weShzdGFydCwgZW5kIC0gc3RhcnQgKyAxKSk7Ci19Ci0KLQotdGVtcGxhdGU8
Y2xhc3MgSGFzaFR5cGU+Ci1ib29sIFByZWZsaWdodFJlc3VsdENhY2hlSXRlbTo6cGFyc2VBY2Nl
c3NDb250cm9sQWxsb3dMaXN0KGNvbnN0IFN0cmluZyYgc3RyaW5nLCBIYXNoU2V0PFN0cmluZywg
SGFzaFR5cGU+JiBzZXQpCi17Ci0gICAgaW50IHN0YXJ0ID0gMDsKLSAgICBpbnQgZW5kOwotICAg
IHdoaWxlICgoZW5kID0gc3RyaW5nLmZpbmQoJywnLCBzdGFydCkpICE9IC0xKSB7Ci0gICAgICAg
IGlmIChzdGFydCA9PSBlbmQpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAg
YWRkVG9BY2Nlc3NDb250cm9sQWxsb3dMaXN0KHN0cmluZywgc3RhcnQsIGVuZCAtIDEsIHNldCk7
Ci0gICAgICAgIHN0YXJ0ID0gZW5kICsgMTsKLSAgICB9Ci0gICAgaWYgKHN0YXJ0ICE9IHN0YXRp
Y19jYXN0PGludD4oc3RyaW5nLmxlbmd0aCgpKSkKLSAgICAgICAgYWRkVG9BY2Nlc3NDb250cm9s
QWxsb3dMaXN0KHN0cmluZywgc3RhcnQsIHN0cmluZy5sZW5ndGgoKSAtIDEsIHNldCk7Ci0KLSAg
ICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBQcmVmbGlnaHRSZXN1bHRDYWNoZUl0ZW06OnBhcnNl
QWNjZXNzQ29udHJvbE1heEFnZShjb25zdCBTdHJpbmcmIHN0cmluZywgdW5zaWduZWQmIGV4cGly
eURlbHRhKQotewotICAgIC8vIEZJWE1FOiB0aGlzIHdpbGwgbm90IGRvIHRoZSBjb3JyZWN0IHRo
aW5nIGZvciBhIG51bWJlciBzdGFydGluZyB3aXRoIGEgJysnCi0gICAgYm9vbCBvayA9IGZhbHNl
OwotICAgIGV4cGlyeURlbHRhID0gc3RyaW5nLnRvVUludFN0cmljdCgmb2spOwotICAgIHJldHVy
biBvazsKLX0KLQotYm9vbCBQcmVmbGlnaHRSZXN1bHRDYWNoZUl0ZW06OnBhcnNlKGNvbnN0IFJl
c291cmNlUmVzcG9uc2UmIHJlc3BvbnNlKQotewotICAgIG1fbWV0aG9kcy5jbGVhcigpOwotICAg
IGlmICghcGFyc2VBY2Nlc3NDb250cm9sQWxsb3dMaXN0KHJlc3BvbnNlLmh0dHBIZWFkZXJGaWVs
ZCgiQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kcyIpLCBtX21ldGhvZHMpKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0KLSAgICBtX2hlYWRlcnMuY2xlYXIoKTsKLSAgICBpZiAoIXBhcnNlQWNj
ZXNzQ29udHJvbEFsbG93TGlzdChyZXNwb25zZS5odHRwSGVhZGVyRmllbGQoIkFjY2Vzcy1Db250
cm9sLUFsbG93LUhlYWRlcnMiKSwgbV9oZWFkZXJzKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgdW5zaWduZWQgZXhwaXJ5RGVsdGEgPSAwOwotICAgIGlmICghcGFyc2VBY2Nlc3NDb250
cm9sTWF4QWdlKHJlc3BvbnNlLmh0dHBIZWFkZXJGaWVsZCgiQWNjZXNzLUNvbnRyb2wtTWF4LUFn
ZSIpLCBleHBpcnlEZWx0YSkpCi0gICAgICAgIGV4cGlyeURlbHRhID0gNTsKLQotICAgIG1fYWJz
b2x1dGVFeHBpcnlUaW1lID0gY3VycmVudFRpbWUoKSArIGV4cGlyeURlbHRhOwotICAgIHJldHVy
biB0cnVlOwotfQotCi1ib29sIFByZWZsaWdodFJlc3VsdENhY2hlSXRlbTo6YWxsb3dzQ3Jvc3NT
aXRlTWV0aG9kKGNvbnN0IFN0cmluZyYgbWV0aG9kKSBjb25zdAotewotICAgIHJldHVybiBtX21l
dGhvZHMuY29udGFpbnMobWV0aG9kKSB8fCBtZXRob2QgPT0gIkdFVCIgfHwgbWV0aG9kID09ICJQ
T1NUIjsKLX0KLQotYm9vbCBQcmVmbGlnaHRSZXN1bHRDYWNoZUl0ZW06OmFsbG93c0Nyb3NzU2l0
ZUhlYWRlcnMoY29uc3QgSFRUUEhlYWRlck1hcCYgcmVxdWVzdEhlYWRlcnMpIGNvbnN0Ci17Ci0g
ICAgSFRUUEhlYWRlck1hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gcmVxdWVzdEhlYWRlcnMuZW5k
KCk7Ci0gICAgZm9yIChIVFRQSGVhZGVyTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IHJlcXVlc3RI
ZWFkZXJzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICBpZiAoIW1faGVhZGVy
cy5jb250YWlucyhpdC0+Zmlyc3QpICYmICFpc09uQWNjZXNzQ29udHJvbFNpbXBsZVJlcXVlc3RI
ZWFkZXJXaGl0ZWxpc3QoaXQtPmZpcnN0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgUHJlZmxpZ2h0UmVzdWx0Q2FjaGVJdGVt
OjphbGxvd3NSZXF1ZXN0KGJvb2wgaW5jbHVkZUNyZWRlbnRpYWxzLCBjb25zdCBTdHJpbmcmIG1l
dGhvZCwgY29uc3QgSFRUUEhlYWRlck1hcCYgcmVxdWVzdEhlYWRlcnMpIGNvbnN0Ci17Ci0gICAg
aWYgKG1fYWJzb2x1dGVFeHBpcnlUaW1lIDwgY3VycmVudFRpbWUoKSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIGlmIChpbmNsdWRlQ3JlZGVudGlhbHMgJiYgIW1fY3JlZGVudGlhbHMpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoIWFsbG93c0Nyb3NzU2l0ZU1ldGhvZChtZXRo
b2QpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCFhbGxvd3NDcm9zc1NpdGVIZWFk
ZXJzKHJlcXVlc3RIZWFkZXJzKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiB0
cnVlOwotfQotCi1QcmVmbGlnaHRSZXN1bHRDYWNoZSYgUHJlZmxpZ2h0UmVzdWx0Q2FjaGU6OnNo
YXJlZCgpCi17Ci0gICAgQXRvbWljYWxseUluaXRpYWxpemVkU3RhdGljKFByZWZsaWdodFJlc3Vs
dENhY2hlJiwgY2FjaGUgPSAqbmV3IFByZWZsaWdodFJlc3VsdENhY2hlKTsKLSAgICByZXR1cm4g
Y2FjaGU7Ci19Ci0KLXZvaWQgUHJlZmxpZ2h0UmVzdWx0Q2FjaGU6OmFwcGVuZEVudHJ5KGNvbnN0
IFN0cmluZyYgb3JpZ2luLCBjb25zdCBLVVJMJiB1cmwsIFByZWZsaWdodFJlc3VsdENhY2hlSXRl
bSogcHJlZmxpZ2h0UmVzdWx0KQotewotICAgIE11dGV4TG9ja2VyIGxvY2sobV9tdXRleCk7Ci0g
ICAgLy8gTm90ZSB0aGF0IHRoZSBlbnRyeSBtYXkgYWxyZWFkeSBiZSBwcmVzZW50IGluIHRoZSBI
YXNoTWFwIGlmIGFub3RoZXIgdGhyZWFkIGlzIGFjY2Vzc2luZyB0aGUgc2FtZSBsb2NhdGlvbi4K
LSAgICBtX3ByZWZsaWdodEhhc2hNYXAuc2V0KHN0ZDo6bWFrZV9wYWlyKG9yaWdpbi5jb3B5KCks
IHVybC5jb3B5KCkpLCBwcmVmbGlnaHRSZXN1bHQpOwotfQotCi1ib29sIFByZWZsaWdodFJlc3Vs
dENhY2hlOjpjYW5Ta2lwUHJlZmxpZ2h0KGNvbnN0IFN0cmluZyYgb3JpZ2luLCBjb25zdCBLVVJM
JiB1cmwsIGJvb2wgaW5jbHVkZUNyZWRlbnRpYWxzLAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcmIG1ldGhvZCwgY29uc3QgSFRUUEhlYWRl
ck1hcCYgcmVxdWVzdEhlYWRlcnMpCi17Ci0gICAgTXV0ZXhMb2NrZXIgbG9jayhtX211dGV4KTsK
LSAgICBQcmVmbGlnaHRSZXN1bHRIYXNoTWFwOjppdGVyYXRvciBjYWNoZUl0ID0gbV9wcmVmbGln
aHRIYXNoTWFwLmZpbmQoc3RkOjptYWtlX3BhaXIob3JpZ2luLCB1cmwpKTsKLSAgICBpZiAoY2Fj
aGVJdCA9PSBtX3ByZWZsaWdodEhhc2hNYXAuZW5kKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LQotICAgIGlmIChjYWNoZUl0LT5zZWNvbmQtPmFsbG93c1JlcXVlc3QoaW5jbHVkZUNyZWRlbnRp
YWxzLCBtZXRob2QsIHJlcXVlc3RIZWFkZXJzKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAg
ICBkZWxldGUgY2FjaGVJdC0+c2Vjb25kOwotICAgIG1fcHJlZmxpZ2h0SGFzaE1hcC5yZW1vdmUo
Y2FjaGVJdCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCiBzdGF0aWMgY29uc3QgWE1MSHR0cFJl
cXVlc3RTdGF0aWNEYXRhKiBzdGF0aWNEYXRhID0gMDsKIAogc3RhdGljIGNvbnN0IFhNTEh0dHBS
ZXF1ZXN0U3RhdGljRGF0YSogY3JlYXRlWE1MSHR0cFJlcXVlc3RTdGF0aWNEYXRhKCkKQEAgLTY0
MCw3ICs0NDksNyBAQCB2b2lkIFhNTEh0dHBSZXF1ZXN0OjpjcmVhdGVSZXF1ZXN0KEV4Y2VwCiAg
ICAgbV9zYW1lT3JpZ2luUmVxdWVzdCA9IHNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKS0+c2VjdXJp
dHlPcmlnaW4oKS0+Y2FuUmVxdWVzdChtX3VybCk7CiAKICAgICBpZiAoIW1fc2FtZU9yaWdpblJl
cXVlc3QpIHsKLSAgICAgICAgbWFrZUNyb3NzU2l0ZUFjY2Vzc1JlcXVlc3QoZWMpOworICAgICAg
ICBtYWtlQ3Jvc3NPcmlnaW5BY2Nlc3NSZXF1ZXN0KGVjKTsKICAgICAgICAgcmV0dXJuOwogICAg
IH0KIApAQCAtNjY4LDMzICs0NzcsMTkgQEAgdm9pZCBYTUxIdHRwUmVxdWVzdDo6bWFrZVNhbWVP
cmlnaW5SZXF1ZQogICAgICAgICBsb2FkUmVxdWVzdFN5bmNocm9ub3VzbHkocmVxdWVzdCwgZWMp
OwogfQogCi1ib29sIFhNTEh0dHBSZXF1ZXN0Ojppc1NpbXBsZUNyb3NzU2l0ZUFjY2Vzc1JlcXVl
c3QoKSBjb25zdAotewotICAgIGlmIChtX21ldGhvZCAhPSAiR0VUIiAmJiBtX21ldGhvZCAhPSAi
UE9TVCIpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIEhUVFBIZWFkZXJNYXA6OmNvbnN0
X2l0ZXJhdG9yIGVuZCA9IG1fcmVxdWVzdEhlYWRlcnMuZW5kKCk7Ci0gICAgZm9yIChIVFRQSGVh
ZGVyTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVxdWVzdEhlYWRlcnMuYmVnaW4oKTsgaXQg
IT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIGlmICghaXNPbkFjY2Vzc0NvbnRyb2xTaW1wbGVSZXF1
ZXN0SGVhZGVyV2hpdGVsaXN0KGl0LT5maXJzdCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgWE1MSHR0cFJlcXVlc3Q6Om1h
a2VDcm9zc1NpdGVBY2Nlc3NSZXF1ZXN0KEV4Y2VwdGlvbkNvZGUmIGVjKQordm9pZCBYTUxIdHRw
UmVxdWVzdDo6bWFrZUNyb3NzT3JpZ2luQWNjZXNzUmVxdWVzdChFeGNlcHRpb25Db2RlJiBlYykK
IHsKICAgICBBU1NFUlQoIW1fc2FtZU9yaWdpblJlcXVlc3QpOwogCi0gICAgaWYgKGlzU2ltcGxl
Q3Jvc3NTaXRlQWNjZXNzUmVxdWVzdCgpKQotICAgICAgICBtYWtlU2ltcGxlQ3Jvc3NTaXRlQWNj
ZXNzUmVxdWVzdChlYyk7CisgICAgaWYgKGlzU2ltcGxlQ3Jvc3NPcmlnaW5BY2Nlc3NSZXF1ZXN0
KG1fbWV0aG9kLCBtX3JlcXVlc3RIZWFkZXJzKSkKKyAgICAgICAgbWFrZVNpbXBsZUNyb3NzT3Jp
Z2luQWNjZXNzUmVxdWVzdChlYyk7CiAgICAgZWxzZQotICAgICAgICBtYWtlQ3Jvc3NTaXRlQWNj
ZXNzUmVxdWVzdFdpdGhQcmVmbGlnaHQoZWMpOworICAgICAgICBtYWtlQ3Jvc3NPcmlnaW5BY2Nl
c3NSZXF1ZXN0V2l0aFByZWZsaWdodChlYyk7CiB9CiAKLXZvaWQgWE1MSHR0cFJlcXVlc3Q6Om1h
a2VTaW1wbGVDcm9zc1NpdGVBY2Nlc3NSZXF1ZXN0KEV4Y2VwdGlvbkNvZGUmIGVjKQordm9pZCBY
TUxIdHRwUmVxdWVzdDo6bWFrZVNpbXBsZUNyb3NzT3JpZ2luQWNjZXNzUmVxdWVzdChFeGNlcHRp
b25Db2RlJiBlYykKIHsKLSAgICBBU1NFUlQoaXNTaW1wbGVDcm9zc1NpdGVBY2Nlc3NSZXF1ZXN0
KCkpOworICAgIEFTU0VSVChpc1NpbXBsZUNyb3NzT3JpZ2luQWNjZXNzUmVxdWVzdChtX21ldGhv
ZCwgbV9yZXF1ZXN0SGVhZGVycykpOwogCiAgICAgS1VSTCB1cmwgPSBtX3VybDsKICAgICB1cmwu
c2V0VXNlcihTdHJpbmcoKSk7CkBAIC03MTQsMTQgKzUwOSwxNCBAQCB2b2lkIFhNTEh0dHBSZXF1
ZXN0OjptYWtlU2ltcGxlQ3Jvc3NTaXRlCiAgICAgICAgIGxvYWRSZXF1ZXN0U3luY2hyb25vdXNs
eShyZXF1ZXN0LCBlYyk7CiB9CiAKLXZvaWQgWE1MSHR0cFJlcXVlc3Q6Om1ha2VDcm9zc1NpdGVB
Y2Nlc3NSZXF1ZXN0V2l0aFByZWZsaWdodChFeGNlcHRpb25Db2RlJiBlYykKK3ZvaWQgWE1MSHR0
cFJlcXVlc3Q6Om1ha2VDcm9zc09yaWdpbkFjY2Vzc1JlcXVlc3RXaXRoUHJlZmxpZ2h0KEV4Y2Vw
dGlvbkNvZGUmIGVjKQogewogICAgIFN0cmluZyBvcmlnaW4gPSBzY3JpcHRFeGVjdXRpb25Db250
ZXh0KCktPnNlY3VyaXR5T3JpZ2luKCktPnRvU3RyaW5nKCk7CiAgICAgS1VSTCB1cmwgPSBtX3Vy
bDsKICAgICB1cmwuc2V0VXNlcihTdHJpbmcoKSk7CiAgICAgdXJsLnNldFBhc3MoU3RyaW5nKCkp
OwogCi0gICAgaWYgKCFQcmVmbGlnaHRSZXN1bHRDYWNoZTo6c2hhcmVkKCkuY2FuU2tpcFByZWZs
aWdodChvcmlnaW4sIHVybCwgbV9pbmNsdWRlQ3JlZGVudGlhbHMsIG1fbWV0aG9kLCBtX3JlcXVl
c3RIZWFkZXJzKSkgeworICAgIGlmICghQ3Jvc3NPcmlnaW5QcmVmbGlnaHRSZXN1bHRDYWNoZTo6
c2hhcmVkKCkuY2FuU2tpcFByZWZsaWdodChvcmlnaW4sIHVybCwgbV9pbmNsdWRlQ3JlZGVudGlh
bHMsIG1fbWV0aG9kLCBtX3JlcXVlc3RIZWFkZXJzKSkgewogICAgICAgICBtX2luUHJlZmxpZ2h0
ID0gdHJ1ZTsKICAgICAgICAgUmVzb3VyY2VSZXF1ZXN0IHByZWZsaWdodFJlcXVlc3QodXJsKTsK
ICAgICAgICAgcHJlZmxpZ2h0UmVxdWVzdC5zZXRIVFRQTWV0aG9kKCJPUFRJT05TIik7CkBAIC0x
MDcyLDExICs4NjcsNiBAQCBTdHJpbmcgWE1MSHR0cFJlcXVlc3Q6OmdldFJlc3BvbnNlSGVhZGVy
CiAgICAgcmV0dXJuIG1fcmVzcG9uc2UuaHR0cEhlYWRlckZpZWxkKG5hbWUpOwogfQogCi1ib29s
IFhNTEh0dHBSZXF1ZXN0Ojppc09uQWNjZXNzQ29udHJvbFJlc3BvbnNlSGVhZGVyV2hpdGVsaXN0
KGNvbnN0IFN0cmluZyYgbmFtZSkgY29uc3QKLXsKLSAgICByZXR1cm4gc3RhdGljRGF0YS0+bV9h
bGxvd2VkQ3Jvc3NTaXRlUmVzcG9uc2VIZWFkZXJzLmNvbnRhaW5zKG5hbWUpOwotfQotCiBTdHJp
bmcgWE1MSHR0cFJlcXVlc3Q6OnJlc3BvbnNlTUlNRVR5cGUoKSBjb25zdAogewogICAgIFN0cmlu
ZyBtaW1lVHlwZSA9IGV4dHJhY3RNSU1FVHlwZUZyb21NZWRpYVR5cGUobV9taW1lVHlwZU92ZXJy
aWRlKTsKQEAgLTEyMDIsMjUgKzk5Miw2IEBAIHZvaWQgWE1MSHR0cFJlcXVlc3Q6OmRpZFNlbmRE
YXRhKHVuc2lnbmUKICAgICB9CiB9CiAKLWJvb2wgWE1MSHR0cFJlcXVlc3Q6OmFjY2Vzc0NvbnRy
b2xDaGVjayhjb25zdCBSZXNvdXJjZVJlc3BvbnNlJiByZXNwb25zZSkKLXsKLSAgICBjb25zdCBT
dHJpbmcmIGFjY2Vzc0NvbnRyb2xPcmlnaW5TdHJpbmcgPSByZXNwb25zZS5odHRwSGVhZGVyRmll
bGQoIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbiIpOwotICAgIGlmIChhY2Nlc3NDb250cm9s
T3JpZ2luU3RyaW5nID09ICIqIiAmJiAhbV9pbmNsdWRlQ3JlZGVudGlhbHMpCi0gICAgICAgIHJl
dHVybiB0cnVlOwotCi0gICAgUmVmUHRyPFNlY3VyaXR5T3JpZ2luPiBhY2Nlc3NDb250cm9sT3Jp
Z2luID0gU2VjdXJpdHlPcmlnaW46OmNyZWF0ZUZyb21TdHJpbmcoYWNjZXNzQ29udHJvbE9yaWdp
blN0cmluZyk7Ci0gICAgaWYgKCFhY2Nlc3NDb250cm9sT3JpZ2luLT5pc1NhbWVTY2hlbWVIb3N0
UG9ydChzY3JpcHRFeGVjdXRpb25Db250ZXh0KCktPnNlY3VyaXR5T3JpZ2luKCkpKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAobV9pbmNsdWRlQ3JlZGVudGlhbHMpIHsKLSAgICAg
ICAgY29uc3QgU3RyaW5nJiBhY2Nlc3NDb250cm9sQ3JlZGVudGlhbHNTdHJpbmcgPSByZXNwb25z
ZS5odHRwSGVhZGVyRmllbGQoIkFjY2Vzcy1Db250cm9sLUFsbG93LUNyZWRlbnRpYWxzIik7Ci0g
ICAgICAgIGlmIChhY2Nlc3NDb250cm9sQ3JlZGVudGlhbHNTdHJpbmcgIT0gInRydWUiKQotICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCiB2
b2lkIFhNTEh0dHBSZXF1ZXN0OjpkaWRSZWNlaXZlUmVzcG9uc2UoY29uc3QgUmVzb3VyY2VSZXNw
b25zZSYgcmVzcG9uc2UpCiB7CiAgICAgaWYgKG1faW5QcmVmbGlnaHQpIHsKQEAgLTEyMjksNyAr
MTAwMCw3IEBAIHZvaWQgWE1MSHR0cFJlcXVlc3Q6OmRpZFJlY2VpdmVSZXNwb25zZSgKICAgICB9
CiAKICAgICBpZiAoIW1fc2FtZU9yaWdpblJlcXVlc3QpIHsKLSAgICAgICAgaWYgKCFhY2Nlc3ND
b250cm9sQ2hlY2socmVzcG9uc2UpKSB7CisgICAgICAgIGlmICghYWNjZXNzQ29udHJvbENoZWNr
KHJlc3BvbnNlLCBtX2luY2x1ZGVDcmVkZW50aWFscywgc2NyaXB0RXhlY3V0aW9uQ29udGV4dCgp
LT5zZWN1cml0eU9yaWdpbigpKSkgewogICAgICAgICAgICAgbmV0d29ya0Vycm9yKCk7CiAgICAg
ICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTEyNDYsMjAgKzEwMTcsMjAgQEAgdm9pZCBY
TUxIdHRwUmVxdWVzdDo6ZGlkUmVjZWl2ZVJlc3BvbnNlUAogICAgIEFTU0VSVChtX2luUHJlZmxp
Z2h0KTsKICAgICBBU1NFUlQoIW1fc2FtZU9yaWdpblJlcXVlc3QpOwogCi0gICAgaWYgKCFhY2Nl
c3NDb250cm9sQ2hlY2socmVzcG9uc2UpKSB7CisgICAgaWYgKCFhY2Nlc3NDb250cm9sQ2hlY2so
cmVzcG9uc2UsIG1faW5jbHVkZUNyZWRlbnRpYWxzLCBzY3JpcHRFeGVjdXRpb25Db250ZXh0KCkt
PnNlY3VyaXR5T3JpZ2luKCkpKSB7CiAgICAgICAgIG5ldHdvcmtFcnJvcigpOwogICAgICAgICBy
ZXR1cm47CiAgICAgfQogCi0gICAgT3duUHRyPFByZWZsaWdodFJlc3VsdENhY2hlSXRlbT4gcHJl
ZmxpZ2h0UmVzdWx0KG5ldyBQcmVmbGlnaHRSZXN1bHRDYWNoZUl0ZW0obV9pbmNsdWRlQ3JlZGVu
dGlhbHMpKTsKKyAgICBPd25QdHI8Q3Jvc3NPcmlnaW5QcmVmbGlnaHRSZXN1bHRDYWNoZUl0ZW0+
IHByZWZsaWdodFJlc3VsdChuZXcgQ3Jvc3NPcmlnaW5QcmVmbGlnaHRSZXN1bHRDYWNoZUl0ZW0o
bV9pbmNsdWRlQ3JlZGVudGlhbHMpKTsKICAgICBpZiAoIXByZWZsaWdodFJlc3VsdC0+cGFyc2Uo
cmVzcG9uc2UpCi0gICAgICAgIHx8ICFwcmVmbGlnaHRSZXN1bHQtPmFsbG93c0Nyb3NzU2l0ZU1l
dGhvZChtX21ldGhvZCkKLSAgICAgICAgfHwgIXByZWZsaWdodFJlc3VsdC0+YWxsb3dzQ3Jvc3NT
aXRlSGVhZGVycyhtX3JlcXVlc3RIZWFkZXJzKSkgeworICAgICAgICB8fCAhcHJlZmxpZ2h0UmVz
dWx0LT5hbGxvd3NDcm9zc09yaWdpbk1ldGhvZChtX21ldGhvZCkKKyAgICAgICAgfHwgIXByZWZs
aWdodFJlc3VsdC0+YWxsb3dzQ3Jvc3NPcmlnaW5IZWFkZXJzKG1fcmVxdWVzdEhlYWRlcnMpKSB7
CiAgICAgICAgIG5ldHdvcmtFcnJvcigpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAg
UHJlZmxpZ2h0UmVzdWx0Q2FjaGU6OnNoYXJlZCgpLmFwcGVuZEVudHJ5KHNjcmlwdEV4ZWN1dGlv
bkNvbnRleHQoKS0+c2VjdXJpdHlPcmlnaW4oKS0+dG9TdHJpbmcoKSwgbV91cmwsIHByZWZsaWdo
dFJlc3VsdC5yZWxlYXNlKCkpOworICAgIENyb3NzT3JpZ2luUHJlZmxpZ2h0UmVzdWx0Q2FjaGU6
OnNoYXJlZCgpLmFwcGVuZEVudHJ5KHNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKS0+c2VjdXJpdHlP
cmlnaW4oKS0+dG9TdHJpbmcoKSwgbV91cmwsIHByZWZsaWdodFJlc3VsdC5yZWxlYXNlKCkpOwog
fQogCiB2b2lkIFhNTEh0dHBSZXF1ZXN0OjpkaWRSZWNlaXZlQXV0aGVudGljYXRpb25DYW5jZWxs
YXRpb24oY29uc3QgUmVzb3VyY2VSZXNwb25zZSYgZmFpbHVyZVJlc3BvbnNlKQpJbmRleDogV2Vi
Q29yZS94bWwvWE1MSHR0cFJlcXVlc3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3htbC9YTUxI
dHRwUmVxdWVzdC5oCShyZXZpc2lvbiA0MTUyNikKKysrIFdlYkNvcmUveG1sL1hNTEh0dHBSZXF1
ZXN0LmgJKHdvcmtpbmcgY29weSkKQEAgLTE1OCwyMSArMTU4LDE1IEBAIHByaXZhdGU6CiAgICAg
dm9pZCBjcmVhdGVSZXF1ZXN0KEV4Y2VwdGlvbkNvZGUmKTsKIAogICAgIHZvaWQgbWFrZVNhbWVP
cmlnaW5SZXF1ZXN0KEV4Y2VwdGlvbkNvZGUmKTsKLSAgICB2b2lkIG1ha2VDcm9zc1NpdGVBY2Nl
c3NSZXF1ZXN0KEV4Y2VwdGlvbkNvZGUmKTsKKyAgICB2b2lkIG1ha2VDcm9zc09yaWdpbkFjY2Vz
c1JlcXVlc3QoRXhjZXB0aW9uQ29kZSYpOwogCi0gICAgdm9pZCBtYWtlU2ltcGxlQ3Jvc3NTaXRl
QWNjZXNzUmVxdWVzdChFeGNlcHRpb25Db2RlJik7Ci0gICAgdm9pZCBtYWtlQ3Jvc3NTaXRlQWNj
ZXNzUmVxdWVzdFdpdGhQcmVmbGlnaHQoRXhjZXB0aW9uQ29kZSYpOworICAgIHZvaWQgbWFrZVNp
bXBsZUNyb3NzT3JpZ2luQWNjZXNzUmVxdWVzdChFeGNlcHRpb25Db2RlJik7CisgICAgdm9pZCBt
YWtlQ3Jvc3NPcmlnaW5BY2Nlc3NSZXF1ZXN0V2l0aFByZWZsaWdodChFeGNlcHRpb25Db2RlJik7
CiAgICAgdm9pZCBoYW5kbGVBc3luY2hyb25vdXNQcmVmbGlnaHRSZXN1bHQoKTsKIAogICAgIHZv
aWQgbG9hZFJlcXVlc3RTeW5jaHJvbm91c2x5KFJlc291cmNlUmVxdWVzdCYsIEV4Y2VwdGlvbkNv
ZGUmKTsKICAgICB2b2lkIGxvYWRSZXF1ZXN0QXN5bmNocm9ub3VzbHkoUmVzb3VyY2VSZXF1ZXN0
Jik7CiAKLSAgICBib29sIGlzT25BY2Nlc3NDb250cm9sUmVzcG9uc2VIZWFkZXJXaGl0ZWxpc3Qo
Y29uc3QgU3RyaW5nJikgY29uc3Q7Ci0KLSAgICBib29sIGlzU2ltcGxlQ3Jvc3NTaXRlQWNjZXNz
UmVxdWVzdCgpIGNvbnN0OwotICAgIFN0cmluZyBhY2Nlc3NDb250cm9sT3JpZ2luKCkgY29uc3Q7
Ci0gICAgYm9vbCBhY2Nlc3NDb250cm9sQ2hlY2soY29uc3QgUmVzb3VyY2VSZXNwb25zZSYpOwot
CiAgICAgdm9pZCBnZW5lcmljRXJyb3IoKTsKICAgICB2b2lkIG5ldHdvcmtFcnJvcigpOwogICAg
IHZvaWQgYWJvcnRFcnJvcigpOwo=
</data>

          </attachment>
      

    </bug>

</bugzilla>