<?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>238251</bug_id>
          
          <creation_ts>2022-03-23 03:48:59 -0700</creation_ts>
          <short_desc>[WebGPU] Implement Device::createTexture() according to the spec</short_desc>
          <delta_ts>2022-03-23 19:34:40 -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>WebGPU</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Myles C. Maxfield">mmaxfield</reporter>
          <assigned_to name="Myles C. Maxfield">mmaxfield</assigned_to>
          <cc>darin</cc>
    
    <cc>dino</cc>
    
    <cc>djg</cc>
    
    <cc>kkinnunen</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1854108</commentid>
    <comment_count>0</comment_count>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2022-03-23 03:48:59 -0700</bug_when>
    <thetext>[WebGPU] Implement Device::createTexture() according to the spec</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1854109</commentid>
    <comment_count>1</comment_count>
      <attachid>455484</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2022-03-23 03:51:51 -0700</bug_when>
    <thetext>Created attachment 455484
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1854192</commentid>
    <comment_count>2</comment_count>
      <attachid>455484</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2022-03-23 08:57:59 -0700</bug_when>
    <thetext>Comment on attachment 455484
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=455484&amp;action=review

&gt; Source/WebGPU/WebGPU/Texture.h:60
&gt;      const id&lt;MTLTexture&gt; m_texture { nil };

Why is it safe to have a raw pointer here? Doesn’t this need to be a RetainPtr?

&gt; Source/WebGPU/WebGPU/Texture.h:62
&gt; +    const WGPUTextureDescriptor m_descriptor { }; // &quot;The GPUTextureDescriptor describing this texture.&quot;

I don’t think you need { } here. Unless WGPUTextureDescriptor is a scalar. Otherwise the descriptor should have default values for its members rather than a { } here.

&gt; Source/WebGPU/WebGPU/Texture.mm:36
&gt; +static std::optional&lt;WGPUFeatureName&gt; featureRequirementForFormat(WGPUTextureFormat format)

If WGPUTextureFormat an enum? If not, why not? If it’s an enum, maybe we want switches without defaults below so we can be reminded by compiler warnings to revisit them all any time we add a new enumeration value.

&gt; Source/WebGPU/WebGPU/Texture.mm:495
&gt; +    // &quot;descriptor.mipLevelCount must be greater than zero.&quot;
&gt; +    if (!descriptor.mipLevelCount)
&gt; +        return false;

I’m not sure that this style where we quote every line of the specification (which may no longer match this in future as it is revised) and have code doing exactly that just below. Also, why not use &quot;&gt; 0&quot; if the text version says &quot;greater than zero&quot;?

&gt; Tools/TestWebKitAPI/Tests/WTF/MathExtras.cpp:631
&gt; +    EXPECT_EQ(WTF::fastLog2(1u), 0u);
&gt; +    EXPECT_EQ(WTF::fastLog2(2u), 1u);
&gt; +    EXPECT_EQ(WTF::fastLog2(3u), 2u);
&gt; +    EXPECT_EQ(WTF::fastLog2(4u), 2u);
&gt; +    EXPECT_EQ(WTF::fastLog2(5u), 3u);
&gt; +    EXPECT_EQ(WTF::fastLog2(6u), 3u);
&gt; +    EXPECT_EQ(WTF::fastLog2(7u), 3u);
&gt; +    EXPECT_EQ(WTF::fastLog2(8u), 3u);
&gt; +    EXPECT_EQ(WTF::fastLog2(9u), 4u);

Is testing 1-9 sufficient coverage? Typically I like to test edge cases, like the highest supported value, the first unsupported, and various boundaries, etc. etc. It seems peculiar to test such a small range so close to 0.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1854427</commentid>
    <comment_count>3</comment_count>
      <attachid>455484</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2022-03-23 15:00:41 -0700</bug_when>
    <thetext>Comment on attachment 455484
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=455484&amp;action=review

&gt;&gt; Source/WebGPU/WebGPU/Texture.h:60
&gt;&gt;      const id&lt;MTLTexture&gt; m_texture { nil };
&gt; 
&gt; Why is it safe to have a raw pointer here? Doesn’t this need to be a RetainPtr?

This framework has ARC enabled.

&gt;&gt; Source/WebGPU/WebGPU/Texture.h:62
&gt;&gt; +    const WGPUTextureDescriptor m_descriptor { }; // &quot;The GPUTextureDescriptor describing this texture.&quot;
&gt; 
&gt; I don’t think you need { } here. Unless WGPUTextureDescriptor is a scalar. Otherwise the descriptor should have default values for its members rather than a { } here.

WGPUTextureDescriptor is a struct, but it&apos;s a struct defined in a 3rd party header. So far, we&apos;ve been avoiding modifying the header, to make future merges from upstream easier.

&gt;&gt; Source/WebGPU/WebGPU/Texture.mm:36
&gt;&gt; +static std::optional&lt;WGPUFeatureName&gt; featureRequirementForFormat(WGPUTextureFormat format)
&gt; 
&gt; If WGPUTextureFormat an enum? If not, why not? If it’s an enum, maybe we want switches without defaults below so we can be reminded by compiler warnings to revisit them all any time we add a new enumeration value.

It is, and yes, I think you&apos;re right (similar to https://bugs.webkit.org/show_bug.cgi?id=238250#c3). I&apos;ll update this code.

&gt;&gt; Source/WebGPU/WebGPU/Texture.mm:495
&gt;&gt; +        return false;
&gt; 
&gt; I’m not sure that this style where we quote every line of the specification (which may no longer match this in future as it is revised) and have code doing exactly that just below. Also, why not use &quot;&gt; 0&quot; if the text version says &quot;greater than zero&quot;?

I knew you would say that 😜

I added these comments to make it super clear how the code maps to the spec, and to make it super clear where to make changes when the spec changes. I also kind of like these kind of comments during the initial development of a project, because it makes it more clear if there&apos;s some part of the implementation that&apos;s missing; it won&apos;t silently be absent but will instead have the form of a comment without any accompanying C++ code. (Of course this doesn&apos;t help the possibility of me forgetting to write the comment and the code together.)

(I also know you dislike code that naively mirrors the spec, but I haven&apos;t been doing that. For example, see how Buffer.h is missing a few fields that are present in the spec, because our implementation doesn&apos;t actually need them. I also included comments in these locations to make it clear that these omissions are intentional.)

For the &quot;greater than zero&quot;, that is the spec describing what must be true in order for validation to return true. If the statement doesn&apos;t hold, then validation must return false, so that&apos;s what this `if` block is doing here - checking the negation of the statement. Because the types are unsigned, (!(descriptor.mipLevelCount &gt; 0)) is the same as (!descriptor.mipLevelCount).

&gt;&gt; Tools/TestWebKitAPI/Tests/WTF/MathExtras.cpp:631
&gt;&gt; +    EXPECT_EQ(WTF::fastLog2(9u), 4u);
&gt; 
&gt; Is testing 1-9 sufficient coverage? Typically I like to test edge cases, like the highest supported value, the first unsupported, and various boundaries, etc. etc. It seems peculiar to test such a small range so close to 0.

Yeah, I originally added this as a form of documentation, but I think you&apos;re right that it makes sense to write proper test cases while I&apos;m here. Will fix.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1854522</commentid>
    <comment_count>4</comment_count>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2022-03-23 18:03:25 -0700</bug_when>
    <thetext>Committed r291777 (248805@trunk): &lt;https://commits.webkit.org/248805@trunk&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1854523</commentid>
    <comment_count>5</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2022-03-23 18:03:48 -0700</bug_when>
    <thetext>&lt;rdar://problem/90737153&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>455484</attachid>
            <date>2022-03-23 03:51:51 -0700</date>
            <delta_ts>2022-03-23 08:57:59 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-238251-20220323035150.patch</filename>
            <type>text/plain</type>
            <size>40472</size>
            <attacher name="Myles C. Maxfield">mmaxfield</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjkxNzQxCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViR1BVL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJHUFUvQ2hhbmdlTG9nCmluZGV4IDc3MTM3ZTczNjMyMmIyMDRh
ZWUxYjE0ZDQ0Yjg1OWY3MjMwMDUxMjIuLjkwMDRkYTRjNTAyMjkyYWViZWQ3YjIyYmM3NDBiNzFl
ZjdlMDkxZTUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJHUFUvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJHUFUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMzYgQEAKKzIwMjItMDMtMjMgIE15bGVzIEMu
IE1heGZpZWxkICA8bW1heGZpZWxkQGFwcGxlLmNvbT4KKworICAgICAgICBbV2ViR1BVXSBJbXBs
ZW1lbnQgRGV2aWNlOjpjcmVhdGVUZXh0dXJlKCkgYWNjb3JkaW5nIHRvIHRoZSBzcGVjCisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMzgyNTEKKworICAg
ICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBTaW1wbHkgdHlwZSBp
biB0aGUgc3BlYyBpbnRvIHRoZSBjb21wdXRlciwgaW4gQysrIGZvcm0uCisgICAgICAgIEFsbCBm
dW5jdGlvbmFsaXR5IGhhcyBsaW5rcyB0byB0aGUgc3BlYyB0byBkZXNjcmliZSBpdHMgb3JpZ2lu
cy4KKworICAgICAgICBUZXN0OiBhcGkvdmFsaWRhdGlvbi9jcmVhdGVUZXh0dXJlLnNwZWMudHMK
KworICAgICAgICAqIFdlYkdQVS9EZXZpY2UuaDoKKyAgICAgICAgKiBXZWJHUFUvVGV4dHVyZS5o
OgorICAgICAgICAoV2ViR1BVOjpUZXh0dXJlOjpjcmVhdGUpOgorICAgICAgICAoV2ViR1BVOjpU
ZXh0dXJlOjpkZXNjcmlwdG9yIGNvbnN0KToKKyAgICAgICAgKiBXZWJHUFUvVGV4dHVyZS5tbToK
KyAgICAgICAgKFdlYkdQVTo6ZmVhdHVyZVJlcXVpcmVtZW50Rm9yRm9ybWF0KToKKyAgICAgICAg
KFdlYkdQVTo6aXNDb21wcmVzc2VkRm9ybWF0KToKKyAgICAgICAgKFdlYkdQVTo6aXNEZXB0aE9y
U3RlbmNpbEZvcm1hdCk6CisgICAgICAgIChXZWJHUFU6OnRleGVsQmxvY2tXaWR0aCk6CisgICAg
ICAgIChXZWJHUFU6OnRleGVsQmxvY2tIZWlnaHQpOgorICAgICAgICAoV2ViR1BVOjppc1JlbmRl
cmFibGVGb3JtYXQpOgorICAgICAgICAoV2ViR1BVOjpzdXBwb3J0c011bHRpc2FtcGxpbmcpOgor
ICAgICAgICAoV2ViR1BVOjptYXhpbXVtTWlwbGV2ZWxDb3VudCk6CisgICAgICAgIChXZWJHUFU6
Omhhc1N0b3JhZ2VCaW5kaW5nQ2FwYWJpbGl0eSk6CisgICAgICAgIChXZWJHUFU6OkRldmljZTo6
dmFsaWRhdGVDcmVhdGVUZXh0dXJlKToKKyAgICAgICAgKFdlYkdQVTo6dXNhZ2UpOgorICAgICAg
ICAoV2ViR1BVOjpwaXhlbEZvcm1hdCk6CisgICAgICAgIChXZWJHUFU6OnN0b3JhZ2VNb2RlKToK
KyAgICAgICAgKFdlYkdQVTo6RGV2aWNlOjpjcmVhdGVUZXh0dXJlKToKKyAgICAgICAgKFdlYkdQ
VTo6VGV4dHVyZTo6VGV4dHVyZSk6CisKIDIwMjItMDMtMjIgIE15bGVzIEMuIE1heGZpZWxkICA8
bW1heGZpZWxkQGFwcGxlLmNvbT4KIAogICAgICAgICBbV2ViR1BVXSBBbGxvY2F0aW5nIGEgYnVm
ZmVyIG9mIHNpemUgMCBjcmFzaGVzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViR1BVL1dlYkdQVS9E
ZXZpY2UuaCBiL1NvdXJjZS9XZWJHUFUvV2ViR1BVL0RldmljZS5oCmluZGV4IDY4NDgzZjliNjQ0
MTM1NGNlMThmMDEwNzdiMTQ1ZGU1MWUxNTEzNjQuLjJhMjQ3MTc3NDljOTdkOTg3ODRkNjkwNjhj
MGM2ZjNjMTQzNDA5MzMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJHUFUvV2ViR1BVL0RldmljZS5o
CisrKyBiL1NvdXJjZS9XZWJHUFUvV2ViR1BVL0RldmljZS5oCkBAIC0xMDMsNiArMTAzLDcgQEAg
cHJpdmF0ZToKICAgICBFcnJvclNjb3BlKiBjdXJyZW50RXJyb3JTY29wZShXR1BVRXJyb3JGaWx0
ZXIpOwogICAgIGJvb2wgdmFsaWRhdGVQb3BFcnJvclNjb3BlKCkgY29uc3Q7CiAgICAgaWQ8TVRM
QnVmZmVyPiBzYWZlQ3JlYXRlQnVmZmVyKE5TVUludGVnZXIgbGVuZ3RoLCBNVExTdG9yYWdlTW9k
ZSwgTVRMQ1BVQ2FjaGVNb2RlID0gTVRMQ1BVQ2FjaGVNb2RlRGVmYXVsdENhY2hlLCBNVExIYXph
cmRUcmFja2luZ01vZGUgPSBNVExIYXphcmRUcmFja2luZ01vZGVEZWZhdWx0KSBjb25zdDsKKyAg
ICBib29sIHZhbGlkYXRlQ3JlYXRlVGV4dHVyZShjb25zdCBXR1BVVGV4dHVyZURlc2NyaXB0b3Im
KTsKIAogICAgIHN0cnVjdCBFcnJvciB7CiAgICAgICAgIFdHUFVFcnJvclR5cGUgdHlwZTsKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJHUFUvV2ViR1BVL1RleHR1cmUuaCBiL1NvdXJjZS9XZWJHUFUv
V2ViR1BVL1RleHR1cmUuaAppbmRleCA5NTlhMGQ0ZGMxNWQyZTk2N2Q3NDQyYzdiM2E5NTEyMWRl
NjI1YmJjLi45YTU5NzhkNzM5MTJjOTkxZTRiNDNiY2VkMjc5ZDExZDNlYmI3NDA1IDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViR1BVL1dlYkdQVS9UZXh0dXJlLmgKKysrIGIvU291cmNlL1dlYkdQVS9X
ZWJHUFUvVGV4dHVyZS5oCkBAIC00MCw5ICs0MCw5IEBAIGNsYXNzIFRleHR1cmVWaWV3OwogY2xh
c3MgVGV4dHVyZSA6IHB1YmxpYyBXR1BVVGV4dHVyZUltcGwsIHB1YmxpYyBSZWZDb3VudGVkPFRl
eHR1cmU+IHsKICAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKIHB1YmxpYzoKLSAgICBzdGF0
aWMgUmVmPFRleHR1cmU+IGNyZWF0ZShpZDxNVExUZXh0dXJlPiB0ZXh0dXJlKQorICAgIHN0YXRp
YyBSZWY8VGV4dHVyZT4gY3JlYXRlKGlkPE1UTFRleHR1cmU+IHRleHR1cmUsIGNvbnN0IFdHUFVU
ZXh0dXJlRGVzY3JpcHRvciYgZGVzY3JpcHRvcikKICAgICB7Ci0gICAgICAgIHJldHVybiBhZG9w
dFJlZigqbmV3IFRleHR1cmUodGV4dHVyZSkpOworICAgICAgICByZXR1cm4gYWRvcHRSZWYoKm5l
dyBUZXh0dXJlKHRleHR1cmUsIGRlc2NyaXB0b3IpKTsKICAgICB9CiAKICAgICB+VGV4dHVyZSgp
OwpAQCAtNTIsMTEgKzUyLDE0IEBAIHB1YmxpYzoKICAgICB2b2lkIHNldExhYmVsKFN0cmluZyYm
KTsKIAogICAgIGlkPE1UTFRleHR1cmU+IHRleHR1cmUoKSBjb25zdCB7IHJldHVybiBtX3RleHR1
cmU7IH0KKyAgICBjb25zdCBXR1BVVGV4dHVyZURlc2NyaXB0b3ImIGRlc2NyaXB0b3IoKSBjb25z
dCB7IHJldHVybiBtX2Rlc2NyaXB0b3I7IH0KIAogcHJpdmF0ZToKLSAgICBUZXh0dXJlKGlkPE1U
TFRleHR1cmU+KTsKKyAgICBUZXh0dXJlKGlkPE1UTFRleHR1cmU+LCBjb25zdCBXR1BVVGV4dHVy
ZURlc2NyaXB0b3ImKTsKIAogICAgIGNvbnN0IGlkPE1UTFRleHR1cmU+IG1fdGV4dHVyZSB7IG5p
bCB9OworCisgICAgY29uc3QgV0dQVVRleHR1cmVEZXNjcmlwdG9yIG1fZGVzY3JpcHRvciB7IH07
IC8vICJUaGUgR1BVVGV4dHVyZURlc2NyaXB0b3IgZGVzY3JpYmluZyB0aGlzIHRleHR1cmUuIgog
fTsKIAogfSAvLyBuYW1lc3BhY2UgV2ViR1BVCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViR1BVL1dl
YkdQVS9UZXh0dXJlLm1tIGIvU291cmNlL1dlYkdQVS9XZWJHUFUvVGV4dHVyZS5tbQppbmRleCAy
M2VhNDIzNDdjZDM2NjgzYmQwZjhkMmY4ZWU1NWJkMzU4MWM0ZTBlLi4wOTJiYmYyZTUzYWYzNTYz
YTUzMWRjNjRhNmNkZmU2OThlN2E3NGVlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViR1BVL1dlYkdQ
VS9UZXh0dXJlLm1tCisrKyBiL1NvdXJjZS9XZWJHUFUvV2ViR1BVL1RleHR1cmUubW0KQEAgLTI5
LDE3ICsyOSw4OTYgQEAKICNpbXBvcnQgIkFQSUNvbnZlcnNpb25zLmgiCiAjaW1wb3J0ICJEZXZp
Y2UuaCIKICNpbXBvcnQgIlRleHR1cmVWaWV3LmgiCisjaW1wb3J0IDx3dGYvTWF0aEV4dHJhcy5o
PgogCiBuYW1lc3BhY2UgV2ViR1BVIHsKIAorc3RhdGljIHN0ZDo6b3B0aW9uYWw8V0dQVUZlYXR1
cmVOYW1lPiBmZWF0dXJlUmVxdWlyZW1lbnRGb3JGb3JtYXQoV0dQVVRleHR1cmVGb3JtYXQgZm9y
bWF0KQoreworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1h
dF9CQzFSR0JBVW5vcm06CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9CQzFSR0JBVW5vcm1T
cmdiOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQkMyUkdCQVVub3JtOgorICAgIGNhc2Ug
V0dQVVRleHR1cmVGb3JtYXRfQkMyUkdCQVVub3JtU3JnYjoKKyAgICBjYXNlIFdHUFVUZXh0dXJl
Rm9ybWF0X0JDM1JHQkFVbm9ybToKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0JDM1JHQkFV
bm9ybVNyZ2I6CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9CQzRSVW5vcm06CisgICAgY2Fz
ZSBXR1BVVGV4dHVyZUZvcm1hdF9CQzRSU25vcm06CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1h
dF9CQzVSR1Vub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQkM1UkdTbm9ybToKKyAg
ICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0JDNkhSR0JVZmxvYXQ6CisgICAgY2FzZSBXR1BVVGV4
dHVyZUZvcm1hdF9CQzZIUkdCRmxvYXQ6CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9CQzdS
R0JBVW5vcm06CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9CQzdSR0JBVW5vcm1TcmdiOgor
ICAgICAgICByZXR1cm4gV0dQVUZlYXR1cmVOYW1lX1RleHR1cmVDb21wcmVzc2lvbkJDOworICAg
IGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfRVRDMlJHQjhVbm9ybToKKyAgICBjYXNlIFdHUFVUZXh0
dXJlRm9ybWF0X0VUQzJSR0I4VW5vcm1TcmdiOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRf
RVRDMlJHQjhBMVVub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfRVRDMlJHQjhBMVVu
b3JtU3JnYjoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0VUQzJSR0JBOFVub3JtOgorICAg
IGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfRVRDMlJHQkE4VW5vcm1TcmdiOgorICAgIGNhc2UgV0dQ
VVRleHR1cmVGb3JtYXRfRUFDUjExVW5vcm06CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9F
QUNSMTFTbm9ybToKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0VBQ1JHMTFVbm9ybToKKyAg
ICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0VBQ1JHMTFTbm9ybToKKyAgICAgICAgcmV0dXJuIFdH
UFVGZWF0dXJlTmFtZV9UZXh0dXJlQ29tcHJlc3Npb25FVEMyOworICAgIGNhc2UgV0dQVVRleHR1
cmVGb3JtYXRfQVNUQzR4NFVub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzR4
NFVub3JtU3JnYjoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0FTVEM1eDRVbm9ybToKKyAg
ICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0FTVEM1eDRVbm9ybVNyZ2I6CisgICAgY2FzZSBXR1BV
VGV4dHVyZUZvcm1hdF9BU1RDNXg1VW5vcm06CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9B
U1RDNXg1VW5vcm1TcmdiOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzZ4NVVub3Jt
OgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzZ4NVVub3JtU3JnYjoKKyAgICBjYXNl
IFdHUFVUZXh0dXJlRm9ybWF0X0FTVEM2eDZVbm9ybToKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9y
bWF0X0FTVEM2eDZVbm9ybVNyZ2I6CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9BU1RDOHg1
VW5vcm06CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9BU1RDOHg1VW5vcm1TcmdiOgorICAg
IGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzh4NlVub3JtOgorICAgIGNhc2UgV0dQVVRleHR1
cmVGb3JtYXRfQVNUQzh4NlVub3JtU3JnYjoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0FT
VEM4eDhVbm9ybToKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0FTVEM4eDhVbm9ybVNyZ2I6
CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9BU1RDMTB4NVVub3JtOgorICAgIGNhc2UgV0dQ
VVRleHR1cmVGb3JtYXRfQVNUQzEweDVVbm9ybVNyZ2I6CisgICAgY2FzZSBXR1BVVGV4dHVyZUZv
cm1hdF9BU1RDMTB4NlVub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzEweDZV
bm9ybVNyZ2I6CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9BU1RDMTB4OFVub3JtOgorICAg
IGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzEweDhVbm9ybVNyZ2I6CisgICAgY2FzZSBXR1BV
VGV4dHVyZUZvcm1hdF9BU1RDMTB4MTBVbm9ybToKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0
X0FTVEMxMHgxMFVub3JtU3JnYjoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0FTVEMxMngx
MFVub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzEyeDEwVW5vcm1TcmdiOgor
ICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzEyeDEyVW5vcm06CisgICAgY2FzZSBXR1BV
VGV4dHVyZUZvcm1hdF9BU1RDMTJ4MTJVbm9ybVNyZ2I6CisgICAgICAgIHJldHVybiBXR1BVRmVh
dHVyZU5hbWVfVGV4dHVyZUNvbXByZXNzaW9uQVNUQzsKKyAgICBkZWZhdWx0OgorICAgICAgICBy
ZXR1cm4gc3RkOjpudWxsb3B0OworICAgIH0KK30KKworc3RhdGljIGJvb2wgaXNDb21wcmVzc2Vk
Rm9ybWF0KFdHUFVUZXh0dXJlRm9ybWF0IGZvcm1hdCkKK3sKKyAgICAvLyBodHRwczovL2dwdXdl
Yi5naXRodWIuaW8vZ3B1d2ViLyNwYWNrZWQtZm9ybWF0cworICAgIC8vICJBIGNvbXByZXNzZWQg
Zm9ybWF0IGlzIGFueSBmb3JtYXQgd2l0aCBhIGJsb2NrIHNpemUgZ3JlYXRlciB0aGFuIDEgw5cg
MS4iCisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0JD
MVJHQkFVbm9ybToKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0JDMVJHQkFVbm9ybVNyZ2I6
CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9CQzJSR0JBVW5vcm06CisgICAgY2FzZSBXR1BV
VGV4dHVyZUZvcm1hdF9CQzJSR0JBVW5vcm1TcmdiOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3Jt
YXRfQkMzUkdCQVVub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQkMzUkdCQVVub3Jt
U3JnYjoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0JDNFJVbm9ybToKKyAgICBjYXNlIFdH
UFVUZXh0dXJlRm9ybWF0X0JDNFJTbm9ybToKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0JD
NVJHVW5vcm06CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9CQzVSR1Nub3JtOgorICAgIGNh
c2UgV0dQVVRleHR1cmVGb3JtYXRfQkM2SFJHQlVmbG9hdDoKKyAgICBjYXNlIFdHUFVUZXh0dXJl
Rm9ybWF0X0JDNkhSR0JGbG9hdDoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0JDN1JHQkFV
bm9ybToKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0JDN1JHQkFVbm9ybVNyZ2I6CisgICAg
Y2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9FVEMyUkdCOFVub3JtOgorICAgIGNhc2UgV0dQVVRleHR1
cmVGb3JtYXRfRVRDMlJHQjhVbm9ybVNyZ2I6CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9F
VEMyUkdCOEExVW5vcm06CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9FVEMyUkdCOEExVW5v
cm1TcmdiOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfRVRDMlJHQkE4VW5vcm06CisgICAg
Y2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9FVEMyUkdCQThVbm9ybVNyZ2I6CisgICAgY2FzZSBXR1BV
VGV4dHVyZUZvcm1hdF9FQUNSMTFVbm9ybToKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0VB
Q1IxMVNub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfRUFDUkcxMVVub3JtOgorICAg
IGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfRUFDUkcxMVNub3JtOgorICAgIGNhc2UgV0dQVVRleHR1
cmVGb3JtYXRfQVNUQzR4NFVub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzR4
NFVub3JtU3JnYjoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0FTVEM1eDRVbm9ybToKKyAg
ICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0FTVEM1eDRVbm9ybVNyZ2I6CisgICAgY2FzZSBXR1BV
VGV4dHVyZUZvcm1hdF9BU1RDNXg1VW5vcm06CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9B
U1RDNXg1VW5vcm1TcmdiOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzZ4NVVub3Jt
OgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzZ4NVVub3JtU3JnYjoKKyAgICBjYXNl
IFdHUFVUZXh0dXJlRm9ybWF0X0FTVEM2eDZVbm9ybToKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9y
bWF0X0FTVEM2eDZVbm9ybVNyZ2I6CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9BU1RDOHg1
VW5vcm06CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9BU1RDOHg1VW5vcm1TcmdiOgorICAg
IGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzh4NlVub3JtOgorICAgIGNhc2UgV0dQVVRleHR1
cmVGb3JtYXRfQVNUQzh4NlVub3JtU3JnYjoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0FT
VEM4eDhVbm9ybToKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0FTVEM4eDhVbm9ybVNyZ2I6
CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9BU1RDMTB4NVVub3JtOgorICAgIGNhc2UgV0dQ
VVRleHR1cmVGb3JtYXRfQVNUQzEweDVVbm9ybVNyZ2I6CisgICAgY2FzZSBXR1BVVGV4dHVyZUZv
cm1hdF9BU1RDMTB4NlVub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzEweDZV
bm9ybVNyZ2I6CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9BU1RDMTB4OFVub3JtOgorICAg
IGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzEweDhVbm9ybVNyZ2I6CisgICAgY2FzZSBXR1BV
VGV4dHVyZUZvcm1hdF9BU1RDMTB4MTBVbm9ybToKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0
X0FTVEMxMHgxMFVub3JtU3JnYjoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0FTVEMxMngx
MFVub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzEyeDEwVW5vcm1TcmdiOgor
ICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzEyeDEyVW5vcm06CisgICAgY2FzZSBXR1BV
VGV4dHVyZUZvcm1hdF9BU1RDMTJ4MTJVbm9ybVNyZ2I6CisgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK3N0YXRpYyBi
b29sIGlzRGVwdGhPclN0ZW5jaWxGb3JtYXQoV0dQVVRleHR1cmVGb3JtYXQgZm9ybWF0KQorewor
ICAgIC8vIGh0dHBzOi8vZ3B1d2ViLmdpdGh1Yi5pby9ncHV3ZWIvI2RlcHRoLWZvcm1hdHMKKyAg
ICAvLyAiQSBkZXB0aC1vci1zdGVuY2lsIGZvcm1hdCBpcyBhbnkgZm9ybWF0IHdpdGggZGVwdGgg
YW5kL29yIHN0ZW5jaWwgYXNwZWN0cy4iCisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICBjYXNl
IFdHUFVUZXh0dXJlRm9ybWF0X1N0ZW5jaWw4OgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRf
RGVwdGgxNlVub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfRGVwdGgyNFBsdXM6Cisg
ICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9EZXB0aDI0UGx1c1N0ZW5jaWw4OgorICAgIGNhc2Ug
V0dQVVRleHR1cmVGb3JtYXRfRGVwdGgyNFVub3JtU3RlbmNpbDg6CisgICAgY2FzZSBXR1BVVGV4
dHVyZUZvcm1hdF9EZXB0aDMyRmxvYXQ6CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9EZXB0
aDMyRmxvYXRTdGVuY2lsODoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworc3RhdGljIHVpbnQzMl90IHRleGVsQmxv
Y2tXaWR0aChXR1BVVGV4dHVyZUZvcm1hdCBmb3JtYXQpCit7CisgICAgLy8gaHR0cHM6Ly9ncHV3
ZWIuZ2l0aHViLmlvL2dwdXdlYi8jdGV4ZWwtYmxvY2std2lkdGgKKyAgICBzd2l0Y2ggKGZvcm1h
dCkgeworICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQkMxUkdCQVVub3JtOgorICAgIGNhc2Ug
V0dQVVRleHR1cmVGb3JtYXRfQkMxUkdCQVVub3JtU3JnYjoKKyAgICBjYXNlIFdHUFVUZXh0dXJl
Rm9ybWF0X0JDMlJHQkFVbm9ybToKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0JDMlJHQkFV
bm9ybVNyZ2I6CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9CQzNSR0JBVW5vcm06CisgICAg
Y2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9CQzNSR0JBVW5vcm1TcmdiOgorICAgIGNhc2UgV0dQVVRl
eHR1cmVGb3JtYXRfQkM0UlVub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQkM0UlNu
b3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQkM1UkdVbm9ybToKKyAgICBjYXNlIFdH
UFVUZXh0dXJlRm9ybWF0X0JDNVJHU25vcm06CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9C
QzZIUkdCVWZsb2F0OgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQkM2SFJHQkZsb2F0Ogor
ICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQkM3UkdCQVVub3JtOgorICAgIGNhc2UgV0dQVVRl
eHR1cmVGb3JtYXRfQkM3UkdCQVVub3JtU3JnYjoKKyAgICAgICAgcmV0dXJuIDQ7CisgICAgY2Fz
ZSBXR1BVVGV4dHVyZUZvcm1hdF9FVEMyUkdCOFVub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVG
b3JtYXRfRVRDMlJHQjhVbm9ybVNyZ2I6CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9FVEMy
UkdCOEExVW5vcm06CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9FVEMyUkdCOEExVW5vcm1T
cmdiOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfRVRDMlJHQkE4VW5vcm06CisgICAgY2Fz
ZSBXR1BVVGV4dHVyZUZvcm1hdF9FVEMyUkdCQThVbm9ybVNyZ2I6CisgICAgY2FzZSBXR1BVVGV4
dHVyZUZvcm1hdF9FQUNSMTFVbm9ybToKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0VBQ1Ix
MVNub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfRUFDUkcxMVVub3JtOgorICAgIGNh
c2UgV0dQVVRleHR1cmVGb3JtYXRfRUFDUkcxMVNub3JtOgorICAgICAgICByZXR1cm4gNDsKKyAg
ICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0FTVEM0eDRVbm9ybToKKyAgICBjYXNlIFdHUFVUZXh0
dXJlRm9ybWF0X0FTVEM0eDRVbm9ybVNyZ2I6CisgICAgICAgIHJldHVybiA0OworICAgIGNhc2Ug
V0dQVVRleHR1cmVGb3JtYXRfQVNUQzV4NFVub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3Jt
YXRfQVNUQzV4NFVub3JtU3JnYjoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0FTVEM1eDVV
bm9ybToKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0FTVEM1eDVVbm9ybVNyZ2I6CisgICAg
ICAgIHJldHVybiA1OworICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzZ4NVVub3JtOgor
ICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzZ4NVVub3JtU3JnYjoKKyAgICBjYXNlIFdH
UFVUZXh0dXJlRm9ybWF0X0FTVEM2eDZVbm9ybToKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0
X0FTVEM2eDZVbm9ybVNyZ2I6CisgICAgICAgIHJldHVybiA2OworICAgIGNhc2UgV0dQVVRleHR1
cmVGb3JtYXRfQVNUQzh4NVVub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzh4
NVVub3JtU3JnYjoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0FTVEM4eDZVbm9ybToKKyAg
ICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0FTVEM4eDZVbm9ybVNyZ2I6CisgICAgY2FzZSBXR1BV
VGV4dHVyZUZvcm1hdF9BU1RDOHg4VW5vcm06CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9B
U1RDOHg4VW5vcm1TcmdiOgorICAgICAgICByZXR1cm4gODsKKyAgICBjYXNlIFdHUFVUZXh0dXJl
Rm9ybWF0X0FTVEMxMHg1VW5vcm06CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9BU1RDMTB4
NVVub3JtU3JnYjoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0FTVEMxMHg2VW5vcm06Cisg
ICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9BU1RDMTB4NlVub3JtU3JnYjoKKyAgICBjYXNlIFdH
UFVUZXh0dXJlRm9ybWF0X0FTVEMxMHg4VW5vcm06CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1h
dF9BU1RDMTB4OFVub3JtU3JnYjoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0FTVEMxMHgx
MFVub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzEweDEwVW5vcm1TcmdiOgor
ICAgICAgICByZXR1cm4gMTA7CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9BU1RDMTJ4MTBV
bm9ybToKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0FTVEMxMngxMFVub3JtU3JnYjoKKyAg
ICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0FTVEMxMngxMlVub3JtOgorICAgIGNhc2UgV0dQVVRl
eHR1cmVGb3JtYXRfQVNUQzEyeDEyVW5vcm1TcmdiOgorICAgICAgICByZXR1cm4gMTI7CisgICAg
ZGVmYXVsdDoKKyAgICAgICAgLy8gIkZvciBwaXhlbC1iYXNlZCBHUFVUZXh0dXJlRm9ybWF0cywg
dGhlIHRleGVsIGJsb2NrIHdpZHRoIGFuZCB0ZXhlbCBibG9jayBoZWlnaHQgYXJlIGFsd2F5cyAx
LiIKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCitzdGF0aWMgdWludDMyX3QgdGV4ZWxC
bG9ja0hlaWdodChXR1BVVGV4dHVyZUZvcm1hdCBmb3JtYXQpCit7CisgICAgLy8gaHR0cHM6Ly9n
cHV3ZWIuZ2l0aHViLmlvL2dwdXdlYi8jdGV4ZWwtYmxvY2staGVpZ2h0CisgICAgc3dpdGNoIChm
b3JtYXQpIHsKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0JDMVJHQkFVbm9ybToKKyAgICBj
YXNlIFdHUFVUZXh0dXJlRm9ybWF0X0JDMVJHQkFVbm9ybVNyZ2I6CisgICAgY2FzZSBXR1BVVGV4
dHVyZUZvcm1hdF9CQzJSR0JBVW5vcm06CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9CQzJS
R0JBVW5vcm1TcmdiOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQkMzUkdCQVVub3JtOgor
ICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQkMzUkdCQVVub3JtU3JnYjoKKyAgICBjYXNlIFdH
UFVUZXh0dXJlRm9ybWF0X0JDNFJVbm9ybToKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0JD
NFJTbm9ybToKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0JDNVJHVW5vcm06CisgICAgY2Fz
ZSBXR1BVVGV4dHVyZUZvcm1hdF9CQzVSR1Nub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3Jt
YXRfQkM2SFJHQlVmbG9hdDoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0JDNkhSR0JGbG9h
dDoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0JDN1JHQkFVbm9ybToKKyAgICBjYXNlIFdH
UFVUZXh0dXJlRm9ybWF0X0JDN1JHQkFVbm9ybVNyZ2I6CisgICAgICAgIHJldHVybiA0OworICAg
IGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfRVRDMlJHQjhVbm9ybToKKyAgICBjYXNlIFdHUFVUZXh0
dXJlRm9ybWF0X0VUQzJSR0I4VW5vcm1TcmdiOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRf
RVRDMlJHQjhBMVVub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfRVRDMlJHQjhBMVVu
b3JtU3JnYjoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0VUQzJSR0JBOFVub3JtOgorICAg
IGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfRVRDMlJHQkE4VW5vcm1TcmdiOgorICAgIGNhc2UgV0dQ
VVRleHR1cmVGb3JtYXRfRUFDUjExVW5vcm06CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9F
QUNSMTFTbm9ybToKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0VBQ1JHMTFVbm9ybToKKyAg
ICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0VBQ1JHMTFTbm9ybToKKyAgICAgICAgcmV0dXJuIDQ7
CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9BU1RDNHg0VW5vcm06CisgICAgY2FzZSBXR1BV
VGV4dHVyZUZvcm1hdF9BU1RDNHg0VW5vcm1TcmdiOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3Jt
YXRfQVNUQzV4NFVub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzV4NFVub3Jt
U3JnYjoKKyAgICAgICAgcmV0dXJuIDQ7CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9BU1RD
NXg1VW5vcm06CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9BU1RDNXg1VW5vcm1TcmdiOgor
ICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzZ4NVVub3JtOgorICAgIGNhc2UgV0dQVVRl
eHR1cmVGb3JtYXRfQVNUQzZ4NVVub3JtU3JnYjoKKyAgICAgICAgcmV0dXJuIDU7CisgICAgY2Fz
ZSBXR1BVVGV4dHVyZUZvcm1hdF9BU1RDNng2VW5vcm06CisgICAgY2FzZSBXR1BVVGV4dHVyZUZv
cm1hdF9BU1RDNng2VW5vcm1TcmdiOgorICAgICAgICByZXR1cm4gNjsKKyAgICBjYXNlIFdHUFVU
ZXh0dXJlRm9ybWF0X0FTVEM4eDVVbm9ybToKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0FT
VEM4eDVVbm9ybVNyZ2I6CisgICAgICAgIHJldHVybiA1OworICAgIGNhc2UgV0dQVVRleHR1cmVG
b3JtYXRfQVNUQzh4NlVub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzh4NlVu
b3JtU3JnYjoKKyAgICAgICAgcmV0dXJuIDY7CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9B
U1RDOHg4VW5vcm06CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9BU1RDOHg4VW5vcm1Tcmdi
OgorICAgICAgICByZXR1cm4gODsKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0FTVEMxMHg1
VW5vcm06CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9BU1RDMTB4NVVub3JtU3JnYjoKKyAg
ICAgICAgcmV0dXJuIDU7CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9BU1RDMTB4NlVub3Jt
OgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzEweDZVbm9ybVNyZ2I6CisgICAgICAg
IHJldHVybiA2OworICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzEweDhVbm9ybToKKyAg
ICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0FTVEMxMHg4VW5vcm1TcmdiOgorICAgICAgICByZXR1
cm4gODsKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0FTVEMxMHgxMFVub3JtOgorICAgIGNh
c2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzEweDEwVW5vcm1TcmdiOgorICAgIGNhc2UgV0dQVVRl
eHR1cmVGb3JtYXRfQVNUQzEyeDEwVW5vcm06CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9B
U1RDMTJ4MTBVbm9ybVNyZ2I6CisgICAgICAgIHJldHVybiAxMDsKKyAgICBjYXNlIFdHUFVUZXh0
dXJlRm9ybWF0X0FTVEMxMngxMlVub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNU
QzEyeDEyVW5vcm1TcmdiOgorICAgICAgICByZXR1cm4gMTI7CisgICAgZGVmYXVsdDoKKyAgICAg
ICAgLy8gIkZvciBwaXhlbC1iYXNlZCBHUFVUZXh0dXJlRm9ybWF0cywgdGhlIHRleGVsIGJsb2Nr
IHdpZHRoIGFuZCB0ZXhlbCBibG9jayBoZWlnaHQgYXJlIGFsd2F5cyAxLiIKKyAgICAgICAgcmV0
dXJuIDE7CisgICAgfQorfQorCitzdGF0aWMgYm9vbCBpc1JlbmRlcmFibGVGb3JtYXQoV0dQVVRl
eHR1cmVGb3JtYXQgZm9ybWF0KQoreworICAgIC8vIGh0dHBzOi8vZ3B1d2ViLmdpdGh1Yi5pby9n
cHV3ZWIvI3JlbmRlcmFibGUtZm9ybWF0CisgICAgLy8gIklmIGEgZm9ybWF0IGlzIGxpc3RlZCBp
biDCp+KArzI1LjEuMSBQbGFpbiBjb2xvciBmb3JtYXRzIHdpdGggUkVOREVSX0FUVEFDSE1FTlQg
Y2FwYWJpbGl0eSwgaXQgaXMgYSBjb2xvciByZW5kZXJhYmxlIGZvcm1hdC4gQW55IG90aGVyIGZv
cm1hdCBpcyBub3QgYSBjb2xvciByZW5kZXJhYmxlIGZvcm1hdC4gQWxsIGRlcHRoLW9yLXN0ZW5j
aWwgZm9ybWF0cyBhcmUgcmVuZGVyYWJsZS4iCisgICAgLy8gaHR0cHM6Ly9ncHV3ZWIuZ2l0aHVi
LmlvL2dwdXdlYi8jcGxhaW4tY29sb3ItZm9ybWF0cworICAgIHN3aXRjaCAoZm9ybWF0KSB7Cisg
ICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9SOFVub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVG
b3JtYXRfUjhVaW50OgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfUjhTaW50OgorICAgIGNh
c2UgV0dQVVRleHR1cmVGb3JtYXRfUjE2VWludDoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0
X1IxNlNpbnQ6CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9SMTZGbG9hdDoKKyAgICBjYXNl
IFdHUFVUZXh0dXJlRm9ybWF0X1JHOFVub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRf
Ukc4VWludDoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X1JHOFNpbnQ6CisgICAgY2FzZSBX
R1BVVGV4dHVyZUZvcm1hdF9SMzJGbG9hdDoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X1Iz
MlVpbnQ6CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9SMzJTaW50OgorICAgIGNhc2UgV0dQ
VVRleHR1cmVGb3JtYXRfUkcxNlVpbnQ6CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9SRzE2
U2ludDoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X1JHMTZGbG9hdDoKKyAgICBjYXNlIFdH
UFVUZXh0dXJlRm9ybWF0X1JHQkE4VW5vcm06CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9S
R0JBOFVub3JtU3JnYjoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X1JHQkE4VWludDoKKyAg
ICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X1JHQkE4U2ludDoKKyAgICBjYXNlIFdHUFVUZXh0dXJl
Rm9ybWF0X0JHUkE4VW5vcm06CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9CR1JBOFVub3Jt
U3JnYjoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X1JHQjEwQTJVbm9ybToKKyAgICBjYXNl
IFdHUFVUZXh0dXJlRm9ybWF0X1JHQjlFNVVmbG9hdDoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9y
bWF0X1JHMzJGbG9hdDoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X1JHMzJVaW50OgorICAg
IGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfUkczMlNpbnQ6CisgICAgY2FzZSBXR1BVVGV4dHVyZUZv
cm1hdF9SR0JBMTZVaW50OgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfUkdCQTE2U2ludDoK
KyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X1JHQkExNkZsb2F0OgorICAgIGNhc2UgV0dQVVRl
eHR1cmVGb3JtYXRfUkdCQTMyRmxvYXQ6CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9SR0JB
MzJVaW50OgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfUkdCQTMyU2ludDoKKyAgICBjYXNl
IFdHUFVUZXh0dXJlRm9ybWF0X1N0ZW5jaWw4OgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRf
RGVwdGgxNlVub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfRGVwdGgyNFBsdXM6Cisg
ICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9EZXB0aDI0UGx1c1N0ZW5jaWw4OgorICAgIGNhc2Ug
V0dQVVRleHR1cmVGb3JtYXRfRGVwdGgyNFVub3JtU3RlbmNpbDg6CisgICAgY2FzZSBXR1BVVGV4
dHVyZUZvcm1hdF9EZXB0aDMyRmxvYXQ6CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9EZXB0
aDMyRmxvYXRTdGVuY2lsODoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworc3RhdGljIGJvb2wgc3VwcG9ydHNNdWx0
aXNhbXBsaW5nKFdHUFVUZXh0dXJlRm9ybWF0IGZvcm1hdCkKK3sKKyAgICBzd2l0Y2ggKGZvcm1h
dCkgeworICAgIC8vIGh0dHBzOi8vZ3B1d2ViLmdpdGh1Yi5pby9ncHV3ZWIvI3RleHR1cmUtZm9y
bWF0LWNhcHMKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X1I4VW5vcm06CisgICAgY2FzZSBX
R1BVVGV4dHVyZUZvcm1hdF9SOFNub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfUjhV
aW50OgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfUjhTaW50OgorICAgIGNhc2UgV0dQVVRl
eHR1cmVGb3JtYXRfUjE2VWludDoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X1IxNlNpbnQ6
CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9SMTZGbG9hdDoKKyAgICBjYXNlIFdHUFVUZXh0
dXJlRm9ybWF0X1JHOFVub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfUkc4U25vcm06
CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9SRzhVaW50OgorICAgIGNhc2UgV0dQVVRleHR1
cmVGb3JtYXRfUkc4U2ludDoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X1IzMkZsb2F0Ogor
ICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfUkcxNlVpbnQ6CisgICAgY2FzZSBXR1BVVGV4dHVy
ZUZvcm1hdF9SRzE2U2ludDoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X1JHMTZGbG9hdDoK
KyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X1JHQkE4VW5vcm06CisgICAgY2FzZSBXR1BVVGV4
dHVyZUZvcm1hdF9SR0JBOFVub3JtU3JnYjoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X1JH
QkE4U25vcm06CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9SR0JBOFVpbnQ6CisgICAgY2Fz
ZSBXR1BVVGV4dHVyZUZvcm1hdF9SR0JBOFNpbnQ6CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1h
dF9CR1JBOFVub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQkdSQThVbm9ybVNyZ2I6
CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9SR0IxMEEyVW5vcm06CisgICAgY2FzZSBXR1BV
VGV4dHVyZUZvcm1hdF9SRzExQjEwVWZsb2F0OgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRf
UkdCOUU1VWZsb2F0OgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfUkdCQTE2VWludDoKKyAg
ICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X1JHQkExNlNpbnQ6CisgICAgY2FzZSBXR1BVVGV4dHVy
ZUZvcm1hdF9SR0JBMTZGbG9hdDoKKworICAgIC8vIGh0dHBzOi8vZ3B1d2ViLmdpdGh1Yi5pby9n
cHV3ZWIvI2RlcHRoLWZvcm1hdHMKKyAgICAvLyAiQWxsIG9mIHRoZXNlIGZvcm1hdHMgc3VwcG9y
dCBtdWx0aXNhbXBsaW5nLiIKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X1N0ZW5jaWw4Ogor
ICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfRGVwdGgxNlVub3JtOgorICAgIGNhc2UgV0dQVVRl
eHR1cmVGb3JtYXRfRGVwdGgyNFBsdXM6CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9EZXB0
aDI0UGx1c1N0ZW5jaWw4OgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfRGVwdGgyNFVub3Jt
U3RlbmNpbDg6CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9EZXB0aDMyRmxvYXQ6CisgICAg
Y2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9EZXB0aDMyRmxvYXRTdGVuY2lsODoKKyAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30K
Kworc3RhdGljIHVpbnQzMl90IG1heGltdW1NaXBsZXZlbENvdW50KFdHUFVUZXh0dXJlRGltZW5z
aW9uIGRpbWVuc2lvbiwgV0dQVUV4dGVudDNEIHNpemUpCit7CisgICAgLy8gaHR0cHM6Ly9ncHV3
ZWIuZ2l0aHViLmlvL2dwdXdlYi8jYWJzdHJhY3Qtb3BkZWYtbWF4aW11bS1taXBsZXZlbC1jb3Vu
dAorCisgICAgLy8gIkNhbGN1bGF0ZSB0aGUgbWF4IGRpbWVuc2lvbiB2YWx1ZSBtOiIKKyAgICB1
aW50MzJfdCBtID0gMDsKKworICAgIC8vICJJZiBkaW1lbnNpb24gaXM6IgorICAgIHN3aXRjaCAo
ZGltZW5zaW9uKSB7CisgICAgY2FzZSBXR1BVVGV4dHVyZURpbWVuc2lvbl8xRDoKKyAgICAgICAg
Ly8gIlJldHVybiAxLiIKKyAgICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBXR1BVVGV4dHVyZURp
bWVuc2lvbl8yRDoKKyAgICAgICAgLy8gIkxldCBtID0gbWF4KHNpemUud2lkdGgsIHNpemUuaGVp
Z2h0KS4iCisgICAgICAgIG0gPSBzdGQ6Om1heChzaXplLndpZHRoLCBzaXplLmhlaWdodCk7Cisg
ICAgICAgIGJyZWFrOworICAgIGNhc2UgV0dQVVRleHR1cmVEaW1lbnNpb25fM0Q6CisgICAgICAg
IC8vICJMZXQgbSA9IG1heChtYXgoc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpLCBzaXplLmRlcHRo
T3JBcnJheUxheWVyKS4iCisgICAgICAgIG0gPSBzdGQ6Om1heChzdGQ6Om1heChzaXplLndpZHRo
LCBzaXplLmhlaWdodCksIHNpemUuZGVwdGhPckFycmF5TGF5ZXJzKTsKKyAgICAgICAgYnJlYWs7
CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gIlJldHVy
biBmbG9vcihsb2cyKG0pKSArIDEuIgorICAgIGF1dG8gaXNQb3dlck9mMiA9ICEobSAmIChtIC0g
MSkpOworICAgIGlmIChpc1Bvd2VyT2YyKQorICAgICAgICByZXR1cm4gV1RGOjpmYXN0TG9nMiht
KSArIDE7CisgICAgcmV0dXJuIFdURjo6ZmFzdExvZzIobSk7Cit9CisKK3N0YXRpYyBib29sIGhh
c1N0b3JhZ2VCaW5kaW5nQ2FwYWJpbGl0eShXR1BVVGV4dHVyZUZvcm1hdCBmb3JtYXQpCit7Cisg
ICAgLy8gaHR0cHM6Ly9ncHV3ZWIuZ2l0aHViLmlvL2dwdXdlYi8jcGxhaW4tY29sb3ItZm9ybWF0
cworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9SR0JB
OFVub3JtOgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfUkdCQThTbm9ybToKKyAgICBjYXNl
IFdHUFVUZXh0dXJlRm9ybWF0X1JHQkE4VWludDoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0
X1JHQkE4U2ludDoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X1JHQkExNlVpbnQ6CisgICAg
Y2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9SR0JBMTZTaW50OgorICAgIGNhc2UgV0dQVVRleHR1cmVG
b3JtYXRfUkdCQTE2RmxvYXQ6CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9SMzJGbG9hdDoK
KyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X1IzMlVpbnQ6CisgICAgY2FzZSBXR1BVVGV4dHVy
ZUZvcm1hdF9SMzJTaW50OgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfUkczMkZsb2F0Ogor
ICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfUkczMlVpbnQ6CisgICAgY2FzZSBXR1BVVGV4dHVy
ZUZvcm1hdF9SRzMyU2ludDoKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X1JHQkEzMkZsb2F0
OgorICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfUkdCQTMyVWludDoKKyAgICBjYXNlIFdHUFVU
ZXh0dXJlRm9ybWF0X1JHQkEzMlNpbnQ6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1
bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgRGV2aWNlOjp2YWxp
ZGF0ZUNyZWF0ZVRleHR1cmUoY29uc3QgV0dQVVRleHR1cmVEZXNjcmlwdG9yJiBkZXNjcmlwdG9y
KQoreworICAgIC8vIEZJWE1FOiAidGhpcyBtdXN0IGJlIGEgdmFsaWQgR1BVRGV2aWNlLiIKKwor
ICAgIC8vICJkZXNjcmlwdG9yLnVzYWdlIG11c3Qgbm90IGJlIDAuIgorICAgIGlmICghZGVzY3Jp
cHRvci51c2FnZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gImRlc2NyaXB0b3Iu
c2l6ZS53aWR0aCwgZGVzY3JpcHRvci5zaXplLmhlaWdodCwgYW5kIGRlc2NyaXB0b3Iuc2l6ZS5k
ZXB0aE9yQXJyYXlMYXllcnMgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iCisgICAgaWYgKCFk
ZXNjcmlwdG9yLnNpemUud2lkdGggfHwgIWRlc2NyaXB0b3Iuc2l6ZS5oZWlnaHQgfHwgIWRlc2Ny
aXB0b3Iuc2l6ZS5kZXB0aE9yQXJyYXlMYXllcnMpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIC8vICJkZXNjcmlwdG9yLm1pcExldmVsQ291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVy
by4iCisgICAgaWYgKCFkZXNjcmlwdG9yLm1pcExldmVsQ291bnQpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIC8vICJkZXNjcmlwdG9yLnNhbXBsZUNvdW50IG11c3QgYmUgZWl0aGVyIDEg
b3IgNC4iCisgICAgaWYgKGRlc2NyaXB0b3Iuc2FtcGxlQ291bnQgIT0gMSAmJiBkZXNjcmlwdG9y
LnNhbXBsZUNvdW50ICE9IDQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vICJJZiBk
ZXNjcmlwdG9yLmRpbWVuc2lvbiBpczoiCisgICAgc3dpdGNoIChkZXNjcmlwdG9yLmRpbWVuc2lv
bikgeworICAgIGNhc2UgV0dQVVRleHR1cmVEaW1lbnNpb25fMUQ6CisgICAgICAgIC8vIEZJWE1F
OiAiZGVzY3JpcHRvci5zaXplLndpZHRoIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRo
aXMubGltaXRzLm1heFRleHR1cmVEaW1lbnNpb24xRC4iCisKKyAgICAgICAgLy8gImRlc2NyaXB0
b3Iuc2l6ZS5oZWlnaHQgbXVzdCBiZSAxLiIKKyAgICAgICAgaWYgKGRlc2NyaXB0b3Iuc2l6ZS5o
ZWlnaHQgIT0gMSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyAiZGVz
Y3JpcHRvci5zaXplLmRlcHRoT3JBcnJheUxheWVycyBtdXN0IGJlIDEuIgorICAgICAgICBpZiAo
ZGVzY3JpcHRvci5zaXplLmRlcHRoT3JBcnJheUxheWVycyAhPSAxKQorICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgICAgIC8vICJkZXNjcmlwdG9yLnNhbXBsZUNvdW50IG11c3QgYmUg
MS4iCisgICAgICAgIGlmIChkZXNjcmlwdG9yLnNhbXBsZUNvdW50ICE9IDEpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gImRlc2NyaXB0b3IuZm9ybWF0IG11c3Qgbm90
IGJlIGEgY29tcHJlc3NlZCBmb3JtYXQgb3IgZGVwdGgtb3Itc3RlbmNpbCBmb3JtYXQuIgorICAg
ICAgICBpZiAoaXNDb21wcmVzc2VkRm9ybWF0KGRlc2NyaXB0b3IuZm9ybWF0KSB8fCBpc0RlcHRo
T3JTdGVuY2lsRm9ybWF0KGRlc2NyaXB0b3IuZm9ybWF0KSkKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBXR1BVVGV4dHVyZURpbWVuc2lvbl8yRDoK
KyAgICAgICAgLy8gRklYTUU6ICJkZXNjcmlwdG9yLnNpemUud2lkdGggbXVzdCBiZSBsZXNzIHRo
YW4gb3IgZXF1YWwgdG8gdGhpcy5saW1pdHMubWF4VGV4dHVyZURpbWVuc2lvbjJELiIKKworICAg
ICAgICAvLyBGSVhNRTogImRlc2NyaXB0b3Iuc2l6ZS5oZWlnaHQgbXVzdCBiZSBsZXNzIHRoYW4g
b3IgZXF1YWwgdG8gdGhpcy5saW1pdHMubWF4VGV4dHVyZURpbWVuc2lvbjJELiIKKworICAgICAg
ICAvLyBGSVhNRTogImRlc2NyaXB0b3Iuc2l6ZS5kZXB0aE9yQXJyYXlMYXllcnMgbXVzdCBiZSBs
ZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhpcy5saW1pdHMubWF4VGV4dHVyZUFycmF5TGF5ZXJzLiIK
KyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBXR1BVVGV4dHVyZURpbWVuc2lvbl8zRDoKKyAgICAg
ICAgLy8gRklYTUU6ICJkZXNjcmlwdG9yLnNpemUud2lkdGggbXVzdCBiZSBsZXNzIHRoYW4gb3Ig
ZXF1YWwgdG8gdGhpcy5saW1pdHMubWF4VGV4dHVyZURpbWVuc2lvbjNELiIKKworICAgICAgICAv
LyBGSVhNRTogImRlc2NyaXB0b3Iuc2l6ZS5oZWlnaHQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1
YWwgdG8gdGhpcy5saW1pdHMubWF4VGV4dHVyZURpbWVuc2lvbjNELiIKKworICAgICAgICAvLyBG
SVhNRTogImRlc2NyaXB0b3Iuc2l6ZS5kZXB0aE9yQXJyYXlMYXllcnMgbXVzdCBiZSBsZXNzIHRo
YW4gb3IgZXF1YWwgdG8gdGhpcy5saW1pdHMubWF4VGV4dHVyZURpbWVuc2lvbjNELiIKKworICAg
ICAgICAvLyAiZGVzY3JpcHRvci5zYW1wbGVDb3VudCBtdXN0IGJlIDEuIgorICAgICAgICBpZiAo
ZGVzY3JpcHRvci5zYW1wbGVDb3VudCAhPSAxKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgICAgIC8vICJkZXNjcmlwdG9yLmZvcm1hdCBtdXN0IG5vdCBiZSBhIGNvbXByZXNzZWQg
Zm9ybWF0IG9yIGRlcHRoLW9yLXN0ZW5jaWwgZm9ybWF0LiIKKyAgICAgICAgaWYgKGlzQ29tcHJl
c3NlZEZvcm1hdChkZXNjcmlwdG9yLmZvcm1hdCkgfHwgaXNEZXB0aE9yU3RlbmNpbEZvcm1hdChk
ZXNjcmlwdG9yLmZvcm1hdCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGJy
ZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAv
LyAiZGVzY3JpcHRvci5zaXplLndpZHRoIG11c3QgYmUgbXVsdGlwbGUgb2YgdGV4ZWwgYmxvY2sg
d2lkdGguIgorICAgIGlmIChkZXNjcmlwdG9yLnNpemUud2lkdGggJSB0ZXhlbEJsb2NrV2lkdGgo
ZGVzY3JpcHRvci5mb3JtYXQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyAiZGVz
Y3JpcHRvci5zaXplLmhlaWdodCBtdXN0IGJlIG11bHRpcGxlIG9mIHRleGVsIGJsb2NrIGhlaWdo
dC4iCisgICAgaWYgKGRlc2NyaXB0b3Iuc2l6ZS5oZWlnaHQgJSB0ZXhlbEJsb2NrSGVpZ2h0KGRl
c2NyaXB0b3IuZm9ybWF0KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gIklmIGRl
c2NyaXB0b3Iuc2FtcGxlQ291bnQgPiAxOiIKKyAgICBpZiAoZGVzY3JpcHRvci5zYW1wbGVDb3Vu
dCA+IDEpIHsKKyAgICAgICAgLy8gImRlc2NyaXB0b3IubWlwTGV2ZWxDb3VudCBtdXN0IGJlIDEu
IgorICAgICAgICBpZiAoZGVzY3JpcHRvci5taXBMZXZlbENvdW50ICE9IDEpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gImRlc2NyaXB0b3Iuc2l6ZS5kZXB0aE9yQXJy
YXlMYXllcnMgbXVzdCBiZSAxLiIKKyAgICAgICAgaWYgKGRlc2NyaXB0b3Iuc2l6ZS5kZXB0aE9y
QXJyYXlMYXllcnMgIT0gMSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAv
LyAiZGVzY3JpcHRvci51c2FnZSBtdXN0IG5vdCBpbmNsdWRlIHRoZSBTVE9SQUdFX0JJTkRJTkcg
Yml0LiIKKyAgICAgICAgaWYgKGRlc2NyaXB0b3IudXNhZ2UgJiBXR1BVVGV4dHVyZVVzYWdlX1N0
b3JhZ2VCaW5kaW5nKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vICJk
ZXNjcmlwdG9yLmZvcm1hdCBtdXN0IGJlIGEgcmVuZGVyYWJsZSBmb3JtYXQiCisgICAgICAgIGlm
ICghaXNSZW5kZXJhYmxlRm9ybWF0KGRlc2NyaXB0b3IuZm9ybWF0KSkKKyAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgICAgICAvLyAiYW5kIHN1cHBvcnQgbXVsdGlzYW1wbGluZyBhY2Nv
cmRpbmcgdG8gwqfigK8yNS4xIFRleHR1cmUgRm9ybWF0IENhcGFiaWxpdGllcy4iCisgICAgICAg
IGlmICghc3VwcG9ydHNNdWx0aXNhbXBsaW5nKGRlc2NyaXB0b3IuZm9ybWF0KSkKKyAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyAiZGVzY3JpcHRvci5taXBMZXZlbENv
dW50IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIG1heGltdW0gbWlwTGV2ZWwgY291bnQo
ZGVzY3JpcHRvci5kaW1lbnNpb24sIGRlc2NyaXB0b3Iuc2l6ZSkuIgorICAgIGlmIChkZXNjcmlw
dG9yLm1pcExldmVsQ291bnQgPiBtYXhpbXVtTWlwbGV2ZWxDb3VudChkZXNjcmlwdG9yLmRpbWVu
c2lvbiwgZGVzY3JpcHRvci5zaXplKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8g
ImRlc2NyaXB0b3IudXNhZ2UgbXVzdCBiZSBhIGNvbWJpbmF0aW9uIG9mIEdQVVRleHR1cmVVc2Fn
ZSB2YWx1ZXMuIgorCisgICAgLy8gIklmIGRlc2NyaXB0b3IudXNhZ2UgaW5jbHVkZXMgdGhlIFJF
TkRFUl9BVFRBQ0hNRU5UIGJpdDoiCisgICAgaWYgKGRlc2NyaXB0b3IudXNhZ2UgJiBXR1BVVGV4
dHVyZVVzYWdlX1JlbmRlckF0dGFjaG1lbnQpIHsKKyAgICAgICAgLy8gImRlc2NyaXB0b3IuZm9y
bWF0IG11c3QgYmUgYSByZW5kZXJhYmxlIGZvcm1hdC4iCisgICAgICAgIGlmICghaXNSZW5kZXJh
YmxlRm9ybWF0KGRlc2NyaXB0b3IuZm9ybWF0KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgICAgICAvLyAiZGVzY3JpcHRvci5kaW1lbnNpb24gbXVzdCBiZSAiMmQiLiIKKyAgICAg
ICAgaWYgKGRlc2NyaXB0b3IuZGltZW5zaW9uICE9IFdHUFVUZXh0dXJlRGltZW5zaW9uXzJEKQor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vICJJZiBkZXNjcmlwdG9y
LnVzYWdlIGluY2x1ZGVzIHRoZSBTVE9SQUdFX0JJTkRJTkcgYml0OiIKKyAgICBpZiAoZGVzY3Jp
cHRvci51c2FnZSAmIFdHUFVUZXh0dXJlVXNhZ2VfU3RvcmFnZUJpbmRpbmcpIHsKKyAgICAgICAg
Ly8gImRlc2NyaXB0b3IuZm9ybWF0IG11c3QgYmUgbGlzdGVkIGluIMKn4oCvMjUuMS4xIFBsYWlu
IGNvbG9yIGZvcm1hdHMgdGFibGUgd2l0aCBTVE9SQUdFX0JJTkRJTkcgY2FwYWJpbGl0eS4iCisg
ICAgICAgIGlmICghaGFzU3RvcmFnZUJpbmRpbmdDYXBhYmlsaXR5KGRlc2NyaXB0b3IuZm9ybWF0
KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBGSVhNRTogIkZv
ciBlYWNoIHZpZXdGb3JtYXQgaW4gZGVzY3JpcHRvci52aWV3Rm9ybWF0cywgZGVzY3JpcHRvci5m
b3JtYXQgYW5kIHZpZXdGb3JtYXQgbXVzdCBiZSB0ZXh0dXJlIHZpZXcgZm9ybWF0IGNvbXBhdGli
bGUuIgorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBNVExUZXh0dXJlVXNhZ2UgdXNh
Z2UoV0dQVVRleHR1cmVVc2FnZUZsYWdzIHVzYWdlKQoreworICAgIE1UTFRleHR1cmVVc2FnZSBy
ZXN1bHQgPSBNVExUZXh0dXJlVXNhZ2VVbmtub3duOworICAgIGlmICh1c2FnZSAmIFdHUFVUZXh0
dXJlVXNhZ2VfVGV4dHVyZUJpbmRpbmcpCisgICAgICAgIHJlc3VsdCB8PSBNVExUZXh0dXJlVXNh
Z2VTaGFkZXJSZWFkOworICAgIGlmICh1c2FnZSAmIFdHUFVUZXh0dXJlVXNhZ2VfU3RvcmFnZUJp
bmRpbmcpCisgICAgICAgIHJlc3VsdCB8PSBNVExUZXh0dXJlVXNhZ2VTaGFkZXJXcml0ZTsKKyAg
ICBpZiAodXNhZ2UgJiBXR1BVVGV4dHVyZVVzYWdlX1JlbmRlckF0dGFjaG1lbnQpCisgICAgICAg
IHJlc3VsdCB8PSBNVExUZXh0dXJlVXNhZ2VSZW5kZXJUYXJnZXQ7CisgICAgLy8gRklYTUU6IERl
dGVybWluZSB3aGV0aGVyIE1UTFRleHR1cmVVc2FnZVBpeGVsRm9ybWF0VmlldyBzaG91bGQgYmUg
c2V0IG9yIG5vdAorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBzdGQ6Om9wdGlvbmFs
PE1UTFBpeGVsRm9ybWF0PiBwaXhlbEZvcm1hdChXR1BVVGV4dHVyZUZvcm1hdCB0ZXh0dXJlRm9y
bWF0KQoreworICAgIHN3aXRjaCAodGV4dHVyZUZvcm1hdCkgeworICAgIGNhc2UgV0dQVVRleHR1
cmVGb3JtYXRfVW5kZWZpbmVkOgorICAgICAgICByZXR1cm4gc3RkOjpudWxsb3B0OworICAgIGNh
c2UgV0dQVVRleHR1cmVGb3JtYXRfUjhVbm9ybToKKyAgICAgICAgcmV0dXJuIE1UTFBpeGVsRm9y
bWF0UjhVbm9ybTsKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X1I4U25vcm06CisgICAgICAg
IHJldHVybiBNVExQaXhlbEZvcm1hdFI4U25vcm07CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1h
dF9SOFVpbnQ6CisgICAgICAgIHJldHVybiBNVExQaXhlbEZvcm1hdFI4VWludDsKKyAgICBjYXNl
IFdHUFVUZXh0dXJlRm9ybWF0X1I4U2ludDoKKyAgICAgICAgcmV0dXJuIE1UTFBpeGVsRm9ybWF0
UjhTaW50OworICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfUjE2VWludDoKKyAgICAgICAgcmV0
dXJuIE1UTFBpeGVsRm9ybWF0UjE2VWludDsKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X1Ix
NlNpbnQ6CisgICAgICAgIHJldHVybiBNVExQaXhlbEZvcm1hdFIxNlNpbnQ7CisgICAgY2FzZSBX
R1BVVGV4dHVyZUZvcm1hdF9SMTZGbG9hdDoKKyAgICAgICAgcmV0dXJuIE1UTFBpeGVsRm9ybWF0
UjE2RmxvYXQ7CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9SRzhVbm9ybToKKyAgICAgICAg
cmV0dXJuIE1UTFBpeGVsRm9ybWF0Ukc4VW5vcm07CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1h
dF9SRzhTbm9ybToKKyAgICAgICAgcmV0dXJuIE1UTFBpeGVsRm9ybWF0Ukc4U25vcm07CisgICAg
Y2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9SRzhVaW50OgorICAgICAgICByZXR1cm4gTVRMUGl4ZWxG
b3JtYXRSRzhVaW50OworICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfUkc4U2ludDoKKyAgICAg
ICAgcmV0dXJuIE1UTFBpeGVsRm9ybWF0Ukc4U2ludDsKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9y
bWF0X1IzMkZsb2F0OgorICAgICAgICByZXR1cm4gTVRMUGl4ZWxGb3JtYXRSMzJGbG9hdDsKKyAg
ICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X1IzMlVpbnQ6CisgICAgICAgIHJldHVybiBNVExQaXhl
bEZvcm1hdFIzMlVpbnQ7CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9SMzJTaW50OgorICAg
ICAgICByZXR1cm4gTVRMUGl4ZWxGb3JtYXRSMzJTaW50OworICAgIGNhc2UgV0dQVVRleHR1cmVG
b3JtYXRfUkcxNlVpbnQ6CisgICAgICAgIHJldHVybiBNVExQaXhlbEZvcm1hdFJHMTZVaW50Owor
ICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfUkcxNlNpbnQ6CisgICAgICAgIHJldHVybiBNVExQ
aXhlbEZvcm1hdFJHMTZTaW50OworICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfUkcxNkZsb2F0
OgorICAgICAgICByZXR1cm4gTVRMUGl4ZWxGb3JtYXRSRzE2RmxvYXQ7CisgICAgY2FzZSBXR1BV
VGV4dHVyZUZvcm1hdF9SR0JBOFVub3JtOgorICAgICAgICByZXR1cm4gTVRMUGl4ZWxGb3JtYXRS
R0JBOFVub3JtOworICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfUkdCQThVbm9ybVNyZ2I6Cisg
ICAgICAgIHJldHVybiBNVExQaXhlbEZvcm1hdFJHQkE4VW5vcm1fc1JHQjsKKyAgICBjYXNlIFdH
UFVUZXh0dXJlRm9ybWF0X1JHQkE4U25vcm06CisgICAgICAgIHJldHVybiBNVExQaXhlbEZvcm1h
dFJHQkE4U25vcm07CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9SR0JBOFVpbnQ6CisgICAg
ICAgIHJldHVybiBNVExQaXhlbEZvcm1hdFJHQkE4VWludDsKKyAgICBjYXNlIFdHUFVUZXh0dXJl
Rm9ybWF0X1JHQkE4U2ludDoKKyAgICAgICAgcmV0dXJuIE1UTFBpeGVsRm9ybWF0UkdCQThTaW50
OworICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQkdSQThVbm9ybToKKyAgICAgICAgcmV0dXJu
IE1UTFBpeGVsRm9ybWF0QkdSQThVbm9ybTsKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0JH
UkE4VW5vcm1TcmdiOgorICAgICAgICByZXR1cm4gTVRMUGl4ZWxGb3JtYXRCR1JBOFVub3JtX3NS
R0I7CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9SR0IxMEEyVW5vcm06CisgICAgICAgIHJl
dHVybiBNVExQaXhlbEZvcm1hdFJHQjEwQTJVbm9ybTsKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9y
bWF0X1JHMTFCMTBVZmxvYXQ6CisgICAgICAgIHJldHVybiBNVExQaXhlbEZvcm1hdFJHMTFCMTBG
bG9hdDsKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X1JHQjlFNVVmbG9hdDoKKyAgICAgICAg
cmV0dXJuIE1UTFBpeGVsRm9ybWF0UkdCOUU1RmxvYXQ7CisgICAgY2FzZSBXR1BVVGV4dHVyZUZv
cm1hdF9SRzMyRmxvYXQ6CisgICAgICAgIHJldHVybiBNVExQaXhlbEZvcm1hdFJHMzJGbG9hdDsK
KyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X1JHMzJVaW50OgorICAgICAgICByZXR1cm4gTVRM
UGl4ZWxGb3JtYXRSRzMyVWludDsKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X1JHMzJTaW50
OgorICAgICAgICByZXR1cm4gTVRMUGl4ZWxGb3JtYXRSRzMyU2ludDsKKyAgICBjYXNlIFdHUFVU
ZXh0dXJlRm9ybWF0X1JHQkExNlVpbnQ6CisgICAgICAgIHJldHVybiBNVExQaXhlbEZvcm1hdFJH
QkExNlVpbnQ7CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9SR0JBMTZTaW50OgorICAgICAg
ICByZXR1cm4gTVRMUGl4ZWxGb3JtYXRSR0JBMTZTaW50OworICAgIGNhc2UgV0dQVVRleHR1cmVG
b3JtYXRfUkdCQTE2RmxvYXQ6CisgICAgICAgIHJldHVybiBNVExQaXhlbEZvcm1hdFJHQkExNkZs
b2F0OworICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfUkdCQTMyRmxvYXQ6CisgICAgICAgIHJl
dHVybiBNVExQaXhlbEZvcm1hdFJHQkEzMkZsb2F0OworICAgIGNhc2UgV0dQVVRleHR1cmVGb3Jt
YXRfUkdCQTMyVWludDoKKyAgICAgICAgcmV0dXJuIE1UTFBpeGVsRm9ybWF0UkdCQTMyVWludDsK
KyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X1JHQkEzMlNpbnQ6CisgICAgICAgIHJldHVybiBN
VExQaXhlbEZvcm1hdFJHQkEzMlNpbnQ7CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9TdGVu
Y2lsODoKKyAgICAgICAgcmV0dXJuIE1UTFBpeGVsRm9ybWF0U3RlbmNpbDg7CisgICAgY2FzZSBX
R1BVVGV4dHVyZUZvcm1hdF9EZXB0aDE2VW5vcm06CisgICAgICAgIHJldHVybiBNVExQaXhlbEZv
cm1hdERlcHRoMTZVbm9ybTsKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0RlcHRoMjRQbHVz
OgorICAgICAgICByZXR1cm4gTVRMUGl4ZWxGb3JtYXREZXB0aDMyRmxvYXQ7CisgICAgY2FzZSBX
R1BVVGV4dHVyZUZvcm1hdF9EZXB0aDI0UGx1c1N0ZW5jaWw4OgorICAgICAgICByZXR1cm4gTVRM
UGl4ZWxGb3JtYXREZXB0aDMyRmxvYXRfU3RlbmNpbDg7CisgICAgY2FzZSBXR1BVVGV4dHVyZUZv
cm1hdF9EZXB0aDI0VW5vcm1TdGVuY2lsODoKKyAgICAgICAgcmV0dXJuIE1UTFBpeGVsRm9ybWF0
RGVwdGgyNFVub3JtX1N0ZW5jaWw4OworICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfRGVwdGgz
MkZsb2F0OgorICAgICAgICByZXR1cm4gTVRMUGl4ZWxGb3JtYXREZXB0aDMyRmxvYXQ7CisgICAg
Y2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9EZXB0aDMyRmxvYXRTdGVuY2lsODoKKyAgICAgICAgcmV0
dXJuIE1UTFBpeGVsRm9ybWF0RGVwdGgzMkZsb2F0X1N0ZW5jaWw4OworICAgIGNhc2UgV0dQVVRl
eHR1cmVGb3JtYXRfQkMxUkdCQVVub3JtOgorICAgICAgICByZXR1cm4gTVRMUGl4ZWxGb3JtYXRC
QzFfUkdCQTsKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0JDMVJHQkFVbm9ybVNyZ2I6Cisg
ICAgICAgIHJldHVybiBNVExQaXhlbEZvcm1hdEJDMV9SR0JBX3NSR0I7CisgICAgY2FzZSBXR1BV
VGV4dHVyZUZvcm1hdF9CQzJSR0JBVW5vcm06CisgICAgICAgIHJldHVybiBNVExQaXhlbEZvcm1h
dEJDMl9SR0JBOworICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQkMyUkdCQVVub3JtU3JnYjoK
KyAgICAgICAgcmV0dXJuIE1UTFBpeGVsRm9ybWF0QkMyX1JHQkFfc1JHQjsKKyAgICBjYXNlIFdH
UFVUZXh0dXJlRm9ybWF0X0JDM1JHQkFVbm9ybToKKyAgICAgICAgcmV0dXJuIE1UTFBpeGVsRm9y
bWF0QkMzX1JHQkE7CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9CQzNSR0JBVW5vcm1Tcmdi
OgorICAgICAgICByZXR1cm4gTVRMUGl4ZWxGb3JtYXRCQzNfUkdCQV9zUkdCOworICAgIGNhc2Ug
V0dQVVRleHR1cmVGb3JtYXRfQkM0UlVub3JtOgorICAgICAgICByZXR1cm4gTVRMUGl4ZWxGb3Jt
YXRCQzRfUlVub3JtOworICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQkM0UlNub3JtOgorICAg
ICAgICByZXR1cm4gTVRMUGl4ZWxGb3JtYXRCQzRfUlNub3JtOworICAgIGNhc2UgV0dQVVRleHR1
cmVGb3JtYXRfQkM1UkdVbm9ybToKKyAgICAgICAgcmV0dXJuIE1UTFBpeGVsRm9ybWF0QkM1X1JH
VW5vcm07CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9CQzVSR1Nub3JtOgorICAgICAgICBy
ZXR1cm4gTVRMUGl4ZWxGb3JtYXRCQzVfUkdTbm9ybTsKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9y
bWF0X0JDNkhSR0JVZmxvYXQ6CisgICAgICAgIHJldHVybiBNVExQaXhlbEZvcm1hdEJDNkhfUkdC
VWZsb2F0OworICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQkM2SFJHQkZsb2F0OgorICAgICAg
ICByZXR1cm4gTVRMUGl4ZWxGb3JtYXRCQzZIX1JHQkZsb2F0OworICAgIGNhc2UgV0dQVVRleHR1
cmVGb3JtYXRfQkM3UkdCQVVub3JtOgorICAgICAgICByZXR1cm4gTVRMUGl4ZWxGb3JtYXRCQzdf
UkdCQVVub3JtOworICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQkM3UkdCQVVub3JtU3JnYjoK
KyAgICAgICAgcmV0dXJuIE1UTFBpeGVsRm9ybWF0QkM3X1JHQkFVbm9ybV9zUkdCOworICAgIGNh
c2UgV0dQVVRleHR1cmVGb3JtYXRfRVRDMlJHQjhVbm9ybToKKyAgICAgICAgcmV0dXJuIE1UTFBp
eGVsRm9ybWF0RVRDMl9SR0I4OworICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfRVRDMlJHQjhV
bm9ybVNyZ2I6CisgICAgICAgIHJldHVybiBNVExQaXhlbEZvcm1hdEVUQzJfUkdCOF9zUkdCOwor
ICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfRVRDMlJHQjhBMVVub3JtOgorICAgICAgICByZXR1
cm4gTVRMUGl4ZWxGb3JtYXRFVEMyX1JHQjhBMTsKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0
X0VUQzJSR0I4QTFVbm9ybVNyZ2I6CisgICAgICAgIHJldHVybiBNVExQaXhlbEZvcm1hdEVUQzJf
UkdCOEExX3NSR0I7CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9FVEMyUkdCQThVbm9ybToK
KyAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dwdXdl
Yi9ncHV3ZWIvaXNzdWVzLzI2ODMgZXRjMi1yZ2JhOHVub3JtIGFuZCBldGMyLXJnYmE4dW5vcm0t
c3JnYiBkbyBub3QgZXhpc3QgaW4gTWV0YWwKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0VU
QzJSR0JBOFVub3JtU3JnYjoKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsgLy8gaHR0cHM6
Ly9naXRodWIuY29tL2dwdXdlYi9ncHV3ZWIvaXNzdWVzLzI2ODMgZXRjMi1yZ2JhOHVub3JtIGFu
ZCBldGMyLXJnYmE4dW5vcm0tc3JnYiBkbyBub3QgZXhpc3QgaW4gTWV0YWwKKyAgICBjYXNlIFdH
UFVUZXh0dXJlRm9ybWF0X0VBQ1IxMVVub3JtOgorICAgICAgICByZXR1cm4gTVRMUGl4ZWxGb3Jt
YXRFQUNfUjExVW5vcm07CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9FQUNSMTFTbm9ybToK
KyAgICAgICAgcmV0dXJuIE1UTFBpeGVsRm9ybWF0RUFDX1IxMVNub3JtOworICAgIGNhc2UgV0dQ
VVRleHR1cmVGb3JtYXRfRUFDUkcxMVVub3JtOgorICAgICAgICByZXR1cm4gTVRMUGl4ZWxGb3Jt
YXRFQUNfUkcxMVVub3JtOworICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfRUFDUkcxMVNub3Jt
OgorICAgICAgICByZXR1cm4gTVRMUGl4ZWxGb3JtYXRFQUNfUkcxMVNub3JtOworICAgIGNhc2Ug
V0dQVVRleHR1cmVGb3JtYXRfQVNUQzR4NFVub3JtOgorICAgICAgICByZXR1cm4gTVRMUGl4ZWxG
b3JtYXRBU1RDXzR4NF9MRFI7CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9BU1RDNHg0VW5v
cm1TcmdiOgorICAgICAgICByZXR1cm4gTVRMUGl4ZWxGb3JtYXRBU1RDXzR4NF9zUkdCOworICAg
IGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzV4NFVub3JtOgorICAgICAgICByZXR1cm4gTVRM
UGl4ZWxGb3JtYXRBU1RDXzV4NF9MRFI7CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9BU1RD
NXg0VW5vcm1TcmdiOgorICAgICAgICByZXR1cm4gTVRMUGl4ZWxGb3JtYXRBU1RDXzV4NF9zUkdC
OworICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzV4NVVub3JtOgorICAgICAgICByZXR1
cm4gTVRMUGl4ZWxGb3JtYXRBU1RDXzV4NV9MRFI7CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1h
dF9BU1RDNXg1VW5vcm1TcmdiOgorICAgICAgICByZXR1cm4gTVRMUGl4ZWxGb3JtYXRBU1RDXzV4
NV9zUkdCOworICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzZ4NVVub3JtOgorICAgICAg
ICByZXR1cm4gTVRMUGl4ZWxGb3JtYXRBU1RDXzZ4NV9MRFI7CisgICAgY2FzZSBXR1BVVGV4dHVy
ZUZvcm1hdF9BU1RDNng1VW5vcm1TcmdiOgorICAgICAgICByZXR1cm4gTVRMUGl4ZWxGb3JtYXRB
U1RDXzZ4NV9zUkdCOworICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzZ4NlVub3JtOgor
ICAgICAgICByZXR1cm4gTVRMUGl4ZWxGb3JtYXRBU1RDXzZ4Nl9MRFI7CisgICAgY2FzZSBXR1BV
VGV4dHVyZUZvcm1hdF9BU1RDNng2VW5vcm1TcmdiOgorICAgICAgICByZXR1cm4gTVRMUGl4ZWxG
b3JtYXRBU1RDXzZ4Nl9zUkdCOworICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzh4NVVu
b3JtOgorICAgICAgICByZXR1cm4gTVRMUGl4ZWxGb3JtYXRBU1RDXzh4NV9MRFI7CisgICAgY2Fz
ZSBXR1BVVGV4dHVyZUZvcm1hdF9BU1RDOHg1VW5vcm1TcmdiOgorICAgICAgICByZXR1cm4gTVRM
UGl4ZWxGb3JtYXRBU1RDXzh4NV9zUkdCOworICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNU
Qzh4NlVub3JtOgorICAgICAgICByZXR1cm4gTVRMUGl4ZWxGb3JtYXRBU1RDXzh4Nl9MRFI7Cisg
ICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9BU1RDOHg2VW5vcm1TcmdiOgorICAgICAgICByZXR1
cm4gTVRMUGl4ZWxGb3JtYXRBU1RDXzh4Nl9zUkdCOworICAgIGNhc2UgV0dQVVRleHR1cmVGb3Jt
YXRfQVNUQzh4OFVub3JtOgorICAgICAgICByZXR1cm4gTVRMUGl4ZWxGb3JtYXRBU1RDXzh4OF9M
RFI7CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9BU1RDOHg4VW5vcm1TcmdiOgorICAgICAg
ICByZXR1cm4gTVRMUGl4ZWxGb3JtYXRBU1RDXzh4OF9zUkdCOworICAgIGNhc2UgV0dQVVRleHR1
cmVGb3JtYXRfQVNUQzEweDVVbm9ybToKKyAgICAgICAgcmV0dXJuIE1UTFBpeGVsRm9ybWF0QVNU
Q18xMHg1X0xEUjsKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0FTVEMxMHg1VW5vcm1Tcmdi
OgorICAgICAgICByZXR1cm4gTVRMUGl4ZWxGb3JtYXRBU1RDXzEweDVfc1JHQjsKKyAgICBjYXNl
IFdHUFVUZXh0dXJlRm9ybWF0X0FTVEMxMHg2VW5vcm06CisgICAgICAgIHJldHVybiBNVExQaXhl
bEZvcm1hdEFTVENfMTB4Nl9MRFI7CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9BU1RDMTB4
NlVub3JtU3JnYjoKKyAgICAgICAgcmV0dXJuIE1UTFBpeGVsRm9ybWF0QVNUQ18xMHg2X3NSR0I7
CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9BU1RDMTB4OFVub3JtOgorICAgICAgICByZXR1
cm4gTVRMUGl4ZWxGb3JtYXRBU1RDXzEweDhfTERSOworICAgIGNhc2UgV0dQVVRleHR1cmVGb3Jt
YXRfQVNUQzEweDhVbm9ybVNyZ2I6CisgICAgICAgIHJldHVybiBNVExQaXhlbEZvcm1hdEFTVENf
MTB4OF9zUkdCOworICAgIGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfQVNUQzEweDEwVW5vcm06Cisg
ICAgICAgIHJldHVybiBNVExQaXhlbEZvcm1hdEFTVENfMTB4MTBfTERSOworICAgIGNhc2UgV0dQ
VVRleHR1cmVGb3JtYXRfQVNUQzEweDEwVW5vcm1TcmdiOgorICAgICAgICByZXR1cm4gTVRMUGl4
ZWxGb3JtYXRBU1RDXzEweDEwX3NSR0I7CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9BU1RD
MTJ4MTBVbm9ybToKKyAgICAgICAgcmV0dXJuIE1UTFBpeGVsRm9ybWF0QVNUQ18xMngxMF9MRFI7
CisgICAgY2FzZSBXR1BVVGV4dHVyZUZvcm1hdF9BU1RDMTJ4MTBVbm9ybVNyZ2I6CisgICAgICAg
IHJldHVybiBNVExQaXhlbEZvcm1hdEFTVENfMTJ4MTBfc1JHQjsKKyAgICBjYXNlIFdHUFVUZXh0
dXJlRm9ybWF0X0FTVEMxMngxMlVub3JtOgorICAgICAgICByZXR1cm4gTVRMUGl4ZWxGb3JtYXRB
U1RDXzEyeDEyX0xEUjsKKyAgICBjYXNlIFdHUFVUZXh0dXJlRm9ybWF0X0FTVEMxMngxMlVub3Jt
U3JnYjoKKyAgICAgICAgcmV0dXJuIE1UTFBpeGVsRm9ybWF0QVNUQ18xMngxMl9zUkdCOworICAg
IGNhc2UgV0dQVVRleHR1cmVGb3JtYXRfRm9yY2UzMjoKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVs
bG9wdDsKKyAgICB9Cit9CisKK3N0YXRpYyBNVExTdG9yYWdlTW9kZSBzdG9yYWdlTW9kZShib29s
IGRldmljZUhhc1VuaWZpZWRNZW1vcnkpCit7CisgICAgaWYgKGRldmljZUhhc1VuaWZpZWRNZW1v
cnkpCisgICAgICAgIHJldHVybiBNVExTdG9yYWdlTW9kZVNoYXJlZDsKKyNpZiBQTEFURk9STShN
QUMpIHx8IFBMQVRGT1JNKE1BQ0NBVEFMWVNUKQorICAgIHJldHVybiBNVExTdG9yYWdlTW9kZU1h
bmFnZWQ7CisjZWxzZQorICAgIHJldHVybiBNVExTdG9yYWdlTW9kZVByaXZhdGU7CisjZW5kaWYK
K30KKwogUmVmUHRyPFRleHR1cmU+IERldmljZTo6Y3JlYXRlVGV4dHVyZShjb25zdCBXR1BVVGV4
dHVyZURlc2NyaXB0b3ImIGRlc2NyaXB0b3IpCiB7Ci0gICAgVU5VU0VEX1BBUkFNKGRlc2NyaXB0
b3IpOwotICAgIHJldHVybiBUZXh0dXJlOjpjcmVhdGUobmlsKTsKKyAgICBpZiAoZGVzY3JpcHRv
ci5uZXh0SW5DaGFpbikKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAvLyBodHRwczov
L2dwdXdlYi5naXRodWIuaW8vZ3B1d2ViLyNkb20tZ3B1ZGV2aWNlLWNyZWF0ZXRleHR1cmUKKwor
ICAgIC8vICJJZiBkZXNjcmlwdG9yLmZvcm1hdCBpcyBhIEdQVVRleHR1cmVGb3JtYXQgdGhhdCBy
ZXF1aXJlcyBhIGZlYXR1cmUgKHNlZSDCp+KArzI1LjEgVGV4dHVyZSBGb3JtYXQgQ2FwYWJpbGl0
aWVzKQorICAgIGlmIChmZWF0dXJlUmVxdWlyZW1lbnRGb3JGb3JtYXQoZGVzY3JpcHRvci5mb3Jt
YXQpKSB7CisgICAgICAgIC8vIEZJWE1FOiAiYnV0IHRoaXMuW1tkZXZpY2VdXS5bW2ZlYXR1cmVz
XV0gZG9lcyBub3QgY29udGFpbiB0aGUgZmVhdHVyZSwgdGhyb3cgYSBUeXBlRXJyb3IuIgorICAg
ICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICAvLyAiSWYgYW55IG9mIHRoZSBmb2xs
b3dpbmcgcmVxdWlyZW1lbnRzIGFyZSB1bm1ldDoiCisgICAgaWYgKCF2YWxpZGF0ZUNyZWF0ZVRl
eHR1cmUoZGVzY3JpcHRvcikpIHsKKyAgICAgICAgLy8gIkdlbmVyYXRlIGEgdmFsaWRhdGlvbiBl
cnJvci4iCisgICAgICAgIGdlbmVyYXRlQVZhbGlkYXRpb25FcnJvcigiVmFsaWRhdGlvbiBmYWls
dXJlLiJfcyk7CisgICAgICAgIC8vIEZJWE1FOiAiUmV0dXJuIGEgbmV3IGludmFsaWQgR1BVVGV4
dHVyZS4iCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIE1UTFRleHR1cmVE
ZXNjcmlwdG9yICp0ZXh0dXJlRGVzY3JpcHRvciA9IFtNVExUZXh0dXJlRGVzY3JpcHRvciBuZXdd
OworCisgICAgdGV4dHVyZURlc2NyaXB0b3IudXNhZ2UgPSB1c2FnZShkZXNjcmlwdG9yLnVzYWdl
KTsKKworICAgIHN3aXRjaCAoZGVzY3JpcHRvci5kaW1lbnNpb24pIHsKKyAgICBjYXNlIFdHUFVU
ZXh0dXJlRGltZW5zaW9uXzFEOgorICAgICAgICB0ZXh0dXJlRGVzY3JpcHRvci53aWR0aCA9IGRl
c2NyaXB0b3Iuc2l6ZS53aWR0aDsKKyAgICAgICAgaWYgKGRlc2NyaXB0b3Iuc2l6ZS5kZXB0aE9y
QXJyYXlMYXllcnMgPiAxKSB7CisgICAgICAgICAgICB0ZXh0dXJlRGVzY3JpcHRvci50ZXh0dXJl
VHlwZSA9IE1UTFRleHR1cmVUeXBlMURBcnJheTsKKyAgICAgICAgICAgIHRleHR1cmVEZXNjcmlw
dG9yLmFycmF5TGVuZ3RoID0gZGVzY3JpcHRvci5zaXplLmRlcHRoT3JBcnJheUxheWVyczsKKyAg
ICAgICAgfSBlbHNlCisgICAgICAgICAgICB0ZXh0dXJlRGVzY3JpcHRvci50ZXh0dXJlVHlwZSA9
IE1UTFRleHR1cmVUeXBlMUQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV0dQVVRleHR1cmVE
aW1lbnNpb25fMkQ6CisgICAgICAgIHRleHR1cmVEZXNjcmlwdG9yLndpZHRoID0gZGVzY3JpcHRv
ci5zaXplLndpZHRoOworICAgICAgICB0ZXh0dXJlRGVzY3JpcHRvci5oZWlnaHQgPSBkZXNjcmlw
dG9yLnNpemUuaGVpZ2h0OworICAgICAgICBpZiAoZGVzY3JpcHRvci5zaXplLmRlcHRoT3JBcnJh
eUxheWVycyA+IDEpIHsKKyAgICAgICAgICAgIHRleHR1cmVEZXNjcmlwdG9yLmFycmF5TGVuZ3Ro
ID0gZGVzY3JpcHRvci5zaXplLmRlcHRoT3JBcnJheUxheWVyczsKKyAgICAgICAgICAgIGlmIChk
ZXNjcmlwdG9yLnNhbXBsZUNvdW50ID4gMSkKKyAgICAgICAgICAgICAgICB0ZXh0dXJlRGVzY3Jp
cHRvci50ZXh0dXJlVHlwZSA9IE1UTFRleHR1cmVUeXBlMkRNdWx0aXNhbXBsZUFycmF5OworICAg
ICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRleHR1cmVEZXNjcmlwdG9yLnRleHR1cmVU
eXBlID0gTVRMVGV4dHVyZVR5cGUyREFycmF5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgaWYgKGRlc2NyaXB0b3Iuc2FtcGxlQ291bnQgPiAxKQorICAgICAgICAgICAgICAgIHRleHR1
cmVEZXNjcmlwdG9yLnRleHR1cmVUeXBlID0gTVRMVGV4dHVyZVR5cGUyRE11bHRpc2FtcGxlOwor
ICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRleHR1cmVEZXNjcmlwdG9yLnRleHR1
cmVUeXBlID0gTVRMVGV4dHVyZVR5cGUyRDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAg
ICBjYXNlIFdHUFVUZXh0dXJlRGltZW5zaW9uXzNEOgorICAgICAgICB0ZXh0dXJlRGVzY3JpcHRv
ci53aWR0aCA9IGRlc2NyaXB0b3Iuc2l6ZS53aWR0aDsKKyAgICAgICAgdGV4dHVyZURlc2NyaXB0
b3IuaGVpZ2h0ID0gZGVzY3JpcHRvci5zaXplLmhlaWdodDsKKyAgICAgICAgdGV4dHVyZURlc2Ny
aXB0b3IuZGVwdGggPSBkZXNjcmlwdG9yLnNpemUuZGVwdGhPckFycmF5TGF5ZXJzOworICAgICAg
ICB0ZXh0dXJlRGVzY3JpcHRvci50ZXh0dXJlVHlwZSA9IE1UTFRleHR1cmVUeXBlM0Q7CisgICAg
ICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0K
KworICAgIGlmIChhdXRvIHBpeGVsRm9ybWF0ID0gV2ViR1BVOjpwaXhlbEZvcm1hdChkZXNjcmlw
dG9yLmZvcm1hdCkpCisgICAgICAgIHRleHR1cmVEZXNjcmlwdG9yLnBpeGVsRm9ybWF0ID0gcGl4
ZWxGb3JtYXQudmFsdWUoKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBudWxscHRyOworCisg
ICAgdGV4dHVyZURlc2NyaXB0b3IubWlwbWFwTGV2ZWxDb3VudCA9IGRlc2NyaXB0b3IubWlwTGV2
ZWxDb3VudDsKKworICAgIHRleHR1cmVEZXNjcmlwdG9yLnNhbXBsZUNvdW50ID0gZGVzY3JpcHRv
ci5zYW1wbGVDb3VudDsKKworICAgIHRleHR1cmVEZXNjcmlwdG9yLnN0b3JhZ2VNb2RlID0gc3Rv
cmFnZU1vZGUoaGFzVW5pZmllZE1lbW9yeSgpKTsKKworICAgIC8vIEZJWE1FKFBFUkZPUk1BTkNF
KTogQ29uc2lkZXIgd3JpdGUtY29tYmluaW5nIENQVSBjYWNoZSBtb2RlLgorICAgIC8vIEZJWE1F
KFBFUkZPUk1BTkNFKTogQ29uc2lkZXIgaW1wbGVtZW50aW5nIGhhemFyZCB0cmFja2luZyBvdXJz
ZWxmLgorCisgICAgaWQ8TVRMVGV4dHVyZT4gdGV4dHVyZSA9IFttX2RldmljZSBuZXdUZXh0dXJl
V2l0aERlc2NyaXB0b3I6dGV4dHVyZURlc2NyaXB0b3JdOworICAgIGlmICghdGV4dHVyZSkKKyAg
ICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICB0ZXh0dXJlLmxhYmVsID0gZnJvbUFQSShkZXNj
cmlwdG9yLmxhYmVsKTsKKworICAgIC8vICJMZXQgdCBiZSBhIG5ldyBHUFVUZXh0dXJlIG9iamVj
dC4iCisgICAgLy8gIlNldCB0LltbZGVzY3JpcHRvcl1dIHRvIGRlc2NyaXB0b3IuIgorICAgIC8v
ICJSZXR1cm4gdC4iCisKKyAgICByZXR1cm4gVGV4dHVyZTo6Y3JlYXRlKHRleHR1cmUsIGRlc2Ny
aXB0b3IpOwogfQogCi1UZXh0dXJlOjpUZXh0dXJlKGlkPE1UTFRleHR1cmU+IHRleHR1cmUpCitU
ZXh0dXJlOjpUZXh0dXJlKGlkPE1UTFRleHR1cmU+IHRleHR1cmUsIGNvbnN0IFdHUFVUZXh0dXJl
RGVzY3JpcHRvciYgZGVzY3JpcHRvcikKICAgICA6IG1fdGV4dHVyZSh0ZXh0dXJlKQorICAgICwg
bV9kZXNjcmlwdG9yKGRlc2NyaXB0b3IpCiB7CiB9CiAKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5n
ZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRleCAxMTEwZmExZWEwNjE5MDA4OGYyYTQwZDE3NDBk
OTBiMDVhYmI3ZTE3Li44NDA5YjM2YTVjYTkwOGNjMGFmODA4NWI5MjhlOWQ0NjA5MjdjYzk3IDEw
MDY0NAotLS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMg
KzEsMTUgQEAKKzIwMjItMDMtMjMgIE15bGVzIEMuIE1heGZpZWxkICA8bW1heGZpZWxkQGFwcGxl
LmNvbT4KKworICAgICAgICBbV2ViR1BVXSBJbXBsZW1lbnQgRGV2aWNlOjpjcmVhdGVUZXh0dXJl
KCkgYWNjb3JkaW5nIHRvIHRoZSBzcGVjCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0yMzgyNTEKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBEb2N1bWVudCB0aGUgYmVoYXZpb3Igb2YgZmFzdExvZzIoKS4KKwor
ICAgICAgICAqIFRlc3RXZWJLaXRBUEkvVGVzdHMvV1RGL01hdGhFeHRyYXMuY3BwOgorICAgICAg
ICAoVGVzdFdlYktpdEFQSTo6VEVTVCk6CisKIDIwMjItMDMtMjIgIEJlbiBOaGFtICA8bmhhbUBh
cHBsZS5jb20+CiAKICAgICAgICAgT25seSBzaG93IG5vdGlmaWNhdGlvbiBwZXJtaXNzaW9uIHBy
b21wdCBvbiB0cmFuc2llbnQgYWN0aXZhdGlvbgpkaWZmIC0tZ2l0IGEvVG9vbHMvVGVzdFdlYktp
dEFQSS9UZXN0cy9XVEYvTWF0aEV4dHJhcy5jcHAgYi9Ub29scy9UZXN0V2ViS2l0QVBJL1Rlc3Rz
L1dURi9NYXRoRXh0cmFzLmNwcAppbmRleCA3ZjgxYzczZDdmMzJmMTM5MmU5YzlhNTJkODQyMTcy
NmRjMTVjZTljLi40YzI3MDNlNzZlMzhjNGQ3NWFhMTMxNDBlNGQwMmJlMGQxMDEyMGIwIDEwMDY0
NAotLS0gYS9Ub29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dURi9NYXRoRXh0cmFzLmNwcAorKysg
Yi9Ub29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dURi9NYXRoRXh0cmFzLmNwcApAQCAtNjE4LDQg
KzYxOCwxNyBAQCBURVNUKFdURiwgZ2V0TVNCU2V0Q29uc3RleHByKQogICAgIEVYUEVDVF9FUShX
VEY6OmdldE1TQlNldENvbnN0ZXhwcjx1aW50NjRfdD4oNDIpLCA1VSk7CiB9CiAKK1RFU1QoV1RG
LCBmYXN0TG9nMikKK3sKKyAgICBFWFBFQ1RfRVEoV1RGOjpmYXN0TG9nMigxdSksIDB1KTsKKyAg
ICBFWFBFQ1RfRVEoV1RGOjpmYXN0TG9nMigydSksIDF1KTsKKyAgICBFWFBFQ1RfRVEoV1RGOjpm
YXN0TG9nMigzdSksIDJ1KTsKKyAgICBFWFBFQ1RfRVEoV1RGOjpmYXN0TG9nMig0dSksIDJ1KTsK
KyAgICBFWFBFQ1RfRVEoV1RGOjpmYXN0TG9nMig1dSksIDN1KTsKKyAgICBFWFBFQ1RfRVEoV1RG
OjpmYXN0TG9nMig2dSksIDN1KTsKKyAgICBFWFBFQ1RfRVEoV1RGOjpmYXN0TG9nMig3dSksIDN1
KTsKKyAgICBFWFBFQ1RfRVEoV1RGOjpmYXN0TG9nMig4dSksIDN1KTsKKyAgICBFWFBFQ1RfRVEo
V1RGOjpmYXN0TG9nMig5dSksIDR1KTsKK30KKwogfSAvLyBuYW1lc3BhY2UgVGVzdFdlYktpdEFQ
SQo=
</data>
<flag name="review"
          id="483496"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>