<?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>155524</bug_id>
          
          <creation_ts>2016-03-15 17:11:38 -0700</creation_ts>
          <short_desc>Web Automation: Add Automation.evaluateJavaScriptFunction</short_desc>
          <delta_ts>2016-03-28 09:41:28 -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>Web Inspector</component>
          <version>WebKit 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>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Timothy Hatcher">timothy</reporter>
          <assigned_to name="Timothy Hatcher">timothy</assigned_to>
          <cc>bburg</cc>
    
    <cc>graouts</cc>
    
    <cc>joepeck</cc>
    
    <cc>mattbaker</cc>
    
    <cc>nvasilyev</cc>
    
    <cc>timothy</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1175210</commentid>
    <comment_count>0</comment_count>
      <attachid>274158</attachid>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2016-03-15 17:11:38 -0700</bug_when>
    <thetext>Created attachment 274158
WIP

Add a way to execute JS to the Automation domain.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1175212</commentid>
    <comment_count>1</comment_count>
      <attachid>274158</attachid>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2016-03-15 17:13:06 -0700</bug_when>
    <thetext>Comment on attachment 274158
WIP

Needs some better error handling then it is ready to go.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1175213</commentid>
    <comment_count>2</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2016-03-15 17:13:24 -0700</bug_when>
    <thetext>&lt;rdar://problem/25181888&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1175421</commentid>
    <comment_count>3</comment_count>
      <attachid>274158</attachid>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2016-03-16 11:41:50 -0700</bug_when>
    <thetext>Comment on attachment 274158
WIP

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

&gt; Source/WebKit2/WebProcess/Automation/WebAutomationSessionProxy.cpp:43
&gt; +static JSObjectRef toJSArray(JSContextRef context, const Vector&lt;T&gt;&amp; data, JSValueRef (*converter)(JSContextRef, const T&amp;), JSValueRef* exception = 0)

Only nit I have is this 0 could be nullptr.

&gt; Source/WebKit2/WebProcess/Automation/WebAutomationSessionProxy.cpp:48
&gt; +        return JSObjectMakeArray(context, 0, 0, exception);

Second 0 here could be nullptr.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1175747</commentid>
    <comment_count>4</comment_count>
      <attachid>274294</attachid>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2016-03-17 09:13:02 -0700</bug_when>
    <thetext>Created attachment 274294
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1175897</commentid>
    <comment_count>5</comment_count>
      <attachid>274294</attachid>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2016-03-17 16:02:56 -0700</bug_when>
    <thetext>Comment on attachment 274294
Patch

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

r=me

&gt; Source/WebKit2/UIProcess/Automation/WebAutomationSession.cpp:271
&gt; +        argumentsVector.append(argumentString);

Since you did a reserveCapacity you can use uncheckedAppend here.

&gt; Source/WebKit2/UIProcess/Automation/WebAutomationSession.cpp:277
&gt; +    page-&gt;process().send(Messages::WebAutomationSessionProxy::EvaluateJavaScriptFunction(page-&gt;mainFrame()-&gt;frameID(), function, argumentsVector, expectsImplicitCallbackArgument, callbackID), 0);

This last parameter is 0, should it be page-&gt;pageId() or not included alltogether?

&gt; Source/WebKit2/WebProcess/Automation/WebAutomationSessionProxy.cpp:57
&gt; +        convertedData.append(convertedValue);

Nit: uncheckedAppend here too.

&gt; Source/WebKit2/WebProcess/Automation/WebAutomationSessionProxy.cpp:83
&gt; +    JSObjectRef evaluateJavaScriptFunction = const_cast&lt;JSObjectRef&gt;(JSObjectGetProperty(context, object, toJSString(propertyName).get(), exception));

The name evaluateJavaScriptFunction here is too specific.Eventually propertyFunction will probably be used for methods other than &quot;evaluateJavaScriptFunction&quot;. Perhaps just &quot;function&quot; or &quot;method&quot;.

&gt; Source/WebKit2/WebProcess/Automation/WebAutomationSessionProxy.cpp:175
&gt; +    auto pendingFrameCallbacks = m_webFramePendingEvaluateJavaScriptCallbacksMap.get(frameID);
&gt; +    for (uint64_t callbackID : pendingFrameCallbacks)
&gt; +        didEvaluateJavaScriptFunction(frameID, callbackID, errorMessage, errorType);

This seems dangerous. It may be modifying the vector that it is iterating over (didEvaluateJavaScriptFunction removes the callback for the given callbackID). It might be safe if pendingFrameCallbacks is a copy of the Vector, but then doing a copy here seems poor.

Since here we know it will be an error, and we know we will remove everything, it seems like it would be best to just do a single iteration and remove the entire list instead of using didEvaluateJavaScriptFunction and doing individual removals (which can be expensive in Vectors).

      for (uint64_t callbackID : pendingFrameCallbacks)
          WebProcess::singleton().parentProcessConnection()-&gt;send(Messages::WebAutomationSession::DidEvaluateJavaScriptFunction(callbackID, errorMessage, errorType));
      m_webFramePendingEvaluateJavaScriptCallbacksMap.remove(frameID);

&gt; Source/WebKit2/WebProcess/Automation/WebAutomationSessionProxy.cpp:232
&gt; +    pendingFrameCallbacks.removeAll(callbackID);

There shouldn&apos;t be duplicates, right? So removeFirst() should be enough.

&gt; Source/WebKit2/WebProcess/Automation/WebAutomationSessionProxy.cpp:235
&gt; +    if (!pendingFrameCallbacks.isEmpty())
&gt; +        m_webFramePendingEvaluateJavaScriptCallbacksMap.set(frameID, pendingFrameCallbacks);

Is this necessary? If so, it seems like this would be doing a lot of Vector copying, which seems poor.

&gt; Source/WebKit2/WebProcess/Automation/WebAutomationSessionProxy.cpp:239
&gt; +    WebProcess::singleton().parentProcessConnection()-&gt;send(Messages::WebAutomationSession::DidEvaluateJavaScriptFunction(callbackID, result, errorType), 0);

Is the 0 needed here?

&gt; Source/WebKit2/WebProcess/Automation/WebAutomationSessionProxy.js:31
&gt;  let Object = {}.constructor;

Is there a plan to use this? Seems we might be good without it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1176208</commentid>
    <comment_count>6</comment_count>
      <attachid>274294</attachid>
    <who name="Blaze Burg">bburg</who>
    <bug_when>2016-03-18 10:21:34 -0700</bug_when>
    <thetext>Comment on attachment 274294
Patch

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

s

&gt; Source/WebKit2/UIProcess/Automation/Automation.json:105
&gt; +                { &quot;name&quot;: &quot;handle&quot;, &quot;$ref&quot;: &quot;BrowsingContextHandle&quot;, &quot;description&quot;: &quot;The handle for the browsing context the script should be evaluated.&quot; },

I think this should be a frame handle, but this is OK until frame handles are added.

EDIT: Ah, I see you put a FIXME in the appropriate place. Thanks.

&gt; Source/WebKit2/UIProcess/Automation/Automation.json:106
&gt; +                { &quot;name&quot;: &quot;function&quot;, &quot;type&quot;: &quot;string&quot;, &quot;description&quot;: &quot;The script to evaluate in the browsing context. It must be a function result.&quot; },

What does &apos;function result&apos; mean here? is the string the body of a function, or does it evaluate to a function that is then called? I think the latter is what this says, but it&apos;s not clear.

&gt; Source/WebKit2/UIProcess/Automation/Automation.json:107
&gt; +                { &quot;name&quot;: &quot;arguments&quot;, &quot;type&quot;: &quot;array&quot;, &quot;items&quot;: { &quot;type&quot;: &quot;string&quot; }, &quot;description&quot;: &quot;The arguments to pass to the function when called. They will be parsed as JSON before calling the function.&quot; },

We really need to add JSON and base64 primitive types to the protocol. I filed some placeholder bugs for later.

&gt;&gt; Source/WebKit2/WebProcess/Automation/WebAutomationSessionProxy.cpp:175
&gt;&gt; +        didEvaluateJavaScriptFunction(frameID, callbackID, errorMessage, errorType);
&gt; 
&gt; This seems dangerous. It may be modifying the vector that it is iterating over (didEvaluateJavaScriptFunction removes the callback for the given callbackID). It might be safe if pendingFrameCallbacks is a copy of the Vector, but then doing a copy here seems poor.
&gt; 
&gt; Since here we know it will be an error, and we know we will remove everything, it seems like it would be best to just do a single iteration and remove the entire list instead of using didEvaluateJavaScriptFunction and doing individual removals (which can be expensive in Vectors).
&gt; 
&gt;       for (uint64_t callbackID : pendingFrameCallbacks)
&gt;           WebProcess::singleton().parentProcessConnection()-&gt;send(Messages::WebAutomationSession::DidEvaluateJavaScriptFunction(callbackID, errorMessage, errorType));
&gt;       m_webFramePendingEvaluateJavaScriptCallbacksMap.remove(frameID);

I think it would be simpler to use HashMap::take(), this is what it&apos;s designed for.

&gt; Source/WebKit2/WebProcess/Automation/WebAutomationSessionProxy.cpp:237
&gt; +        m_webFramePendingEvaluateJavaScriptCallbacksMap.remove(frameID);

Nit: adding &apos;to&apos; to this member&apos;s name would be nice: m_webFrameToPendingEvaluateJavaScriptCallbacksMap

&gt; Source/WebKit2/WebProcess/Automation/WebAutomationSessionProxy.js:47
&gt; +        // The script is expected to be a function declaration. Evaluate it inside parenthesis to get the function value.

EDIT: ok, this is clearer than the protocol description. Please update to match this better.

&gt; Source/WebKit2/WebProcess/Automation/WebAutomationSessionProxy.js:50
&gt; +            throw new TypeError(&quot;Script did not evaluate to a function.&quot;);

I&apos;m trying to think of a way to test this in WebKit directly. It&apos;s kind of difficult given how LayoutTests are initiated from WebProcess, though.

&gt; Source/WebKit2/WebProcess/Automation/WebAutomationSessionProxy.js:52
&gt; +        let argumentValues = argumentStrings.map(this._jsonParse, this);

Consider doing all JSON parsing related stuff here inside its own try/catch scope, so we can report the error correctly without the page knowing it happened.

&gt; Source/WebKit2/WebProcess/Automation/WebAutomationSessionProxy.js:59
&gt; +            callback(functionValue.apply(null, argumentValues));

We don&apos;t want a try-catch scope here because the injected snippet could throw an exception on purpose to test how the page reacts. The call stack could look a bit weird though...

&gt; Source/WebKit2/WebProcess/Automation/WebAutomationSessionProxy.js:98
&gt; +        throw {name: &quot;NodeNotFound&quot;, message: &quot;Node with identifier &apos;&quot; + identifier + &quot;&apos; was not found&quot;};

Usually it&apos;s bad style to throw anything that&apos;s not an Error instance since it breaks promise chaining. Probably not relevant here. You could make an error instance and set these properties on it.

Also, throwing an error here without a surrounding try-catch at looks like a bug to me. Client code could have a top-level error handler, and details from this injected script could show up in &apos;user space&apos;. See above.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1178165</commentid>
    <comment_count>7</comment_count>
      <attachid>274294</attachid>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2016-03-25 16:26:50 -0700</bug_when>
    <thetext>Comment on attachment 274294
Patch

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

&gt; Source/WebKit2/WebProcess/Automation/WebAutomationSessionProxy.js:84
&gt; +        if (value instanceof Node)
&gt; +            return this._createNodeHandle(this._identifierForNode(value));

Do we need to handle NodeList and HTMLCollection? For those we can just Array.from() and loop through the nodes in the list.
Also, `document instanceof Node` is true, but `document isntanceof Element` is false. Should `document` be allowed here?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1178328</commentid>
    <comment_count>8</comment_count>
      <attachid>274294</attachid>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2016-03-27 09:57:19 -0700</bug_when>
    <thetext>Comment on attachment 274294
Patch

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

&gt;&gt; Source/WebKit2/WebProcess/Automation/WebAutomationSessionProxy.js:98
&gt;&gt; +        throw {name: &quot;NodeNotFound&quot;, message: &quot;Node with identifier &apos;&quot; + identifier + &quot;&apos; was not found&quot;};
&gt; 
&gt; Usually it&apos;s bad style to throw anything that&apos;s not an Error instance since it breaks promise chaining. Probably not relevant here. You could make an error instance and set these properties on it.
&gt; 
&gt; Also, throwing an error here without a surrounding try-catch at looks like a bug to me. Client code could have a top-level error handler, and details from this injected script could show up in &apos;user space&apos;. See above.

Exceptions thrown during a JSC API calls (which is what we use in this patch) are not reported to the page&apos;s &quot;error&quot; event listeners.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1178427</commentid>
    <comment_count>9</comment_count>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2016-03-28 09:41:28 -0700</bug_when>
    <thetext>https://trac.webkit.org/r198737</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>274158</attachid>
            <date>2016-03-15 17:11:38 -0700</date>
            <delta_ts>2016-03-17 09:12:56 -0700</delta_ts>
            <desc>WIP</desc>
            <filename>WIP.patch</filename>
            <type>text/plain</type>
            <size>15814</size>
            <attacher name="Timothy Hatcher">timothy</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BdXRvbWF0aW9uL0F1dG9tYXRp
b24uanNvbiBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BdXRvbWF0aW9uL0F1dG9tYXRpb24u
anNvbgppbmRleCBjNzA4OTQ2Li40N2JlMGU3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9V
SVByb2Nlc3MvQXV0b21hdGlvbi9BdXRvbWF0aW9uLmpzb24KKysrIGIvU291cmNlL1dlYktpdDIv
VUlQcm9jZXNzL0F1dG9tYXRpb24vQXV0b21hdGlvbi5qc29uCkBAIC05NSw2ICs5NSwyMCBAQAog
ICAgICAgICAgICAgInBhcmFtZXRlcnMiOiBbCiAgICAgICAgICAgICAgICAgeyAibmFtZSI6ICJo
YW5kbGUiLCAiJHJlZiI6ICJCcm93c2luZ0NvbnRleHRIYW5kbGUiLCAiZGVzY3JpcHRpb24iOiAi
VGhlIGhhbmRsZSBmb3IgdGhlIGJyb3dzaW5nIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgcmVsb2Fk
ZWQuIiB9CiAgICAgICAgICAgICBdCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAg
ICJuYW1lIjogImV2YWx1YXRlSmF2YVNjcmlwdEZ1bmN0aW9uIiwKKyAgICAgICAgICAgICJkZXNj
cmlwdGlvbiI6ICJFdmFsdWF0ZXMgYSBzY3JpcHQgZnVuY3Rpb24gaW4gYSBicm93c2luZyBjb250
ZXh0IGFuZCBjYWxscyBpdCB3aXRoIHRoZSBzdXBwbGllZCBhcmd1bWVudHMuIiwKKyAgICAgICAg
ICAgICJwYXJhbWV0ZXJzIjogWworICAgICAgICAgICAgICAgIHsgIm5hbWUiOiAiaGFuZGxlIiwg
IiRyZWYiOiAiQnJvd3NpbmdDb250ZXh0SGFuZGxlIiwgImRlc2NyaXB0aW9uIjogIlRoZSBoYW5k
bGUgZm9yIHRoZSBicm93c2luZyBjb250ZXh0IHRoZSBzY3JpcHQgc2hvdWxkIGJlIGV2YWx1YXRl
ZC4iIH0sCisgICAgICAgICAgICAgICAgeyAibmFtZSI6ICJmdW5jdGlvbiIsICJ0eXBlIjogInN0
cmluZyIsICJkZXNjcmlwdGlvbiI6ICJUaGUgc2NyaXB0IHRvIGV2YWx1YXRlIGluIHRoZSBicm93
c2luZyBjb250ZXh0LiBJdCBtdXN0IGJlIGEgZnVuY3Rpb24gcmVzdWx0LiIgfSwKKyAgICAgICAg
ICAgICAgICB7ICJuYW1lIjogImFyZ3VtZW50cyIsICJ0eXBlIjogImFycmF5IiwgIml0ZW1zIjog
eyAidHlwZSI6ICJzdHJpbmciIH0sICJkZXNjcmlwdGlvbiI6ICJUaGUgYXJndW1lbnRzIHRvIHBh
c3MgdG8gdGhlIGZ1bmN0aW9uIHdoZW4gY2FsbGVkLiBUaGV5IHdpbGwgYmUgcGFyc2VkIGFzIEpT
T04gYmVmb3JlIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLiIgfSwKKyAgICAgICAgICAgICAgICB7ICJu
YW1lIjogImV4cGVjdHNJbXBsaWNpdENhbGxiYWNrQXJndW1lbnQiLCAidHlwZSI6ICJib29sZWFu
IiwgImRlc2NyaXB0aW9uIjogIlRoZSBmdW5jdGlvbiBleHBlY3RzIGEgY2FsbGJhY2sgZnVuY3Rp
b24gYXMgdGhlIGxhc3QgYXJndW1lbnQuIEl0IGlzIGV4cGVjdGVkIHRvIGNhbGwgdGhpcyBjYWxs
YmFjayB3aXRoIGEgcmVzdWx0LiIgfQorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJyZXR1
cm5zIjogWworICAgICAgICAgICAgICAgIHsgIm5hbWUiOiAicmVzdWx0IiwgInR5cGUiOiAic3Ry
aW5nIiwgImRlc2NyaXB0aW9uIjogIlRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIGNhbGxlZCBm
dW5jdGlvbi4gSXQgaXMgSlNPTiBlbmNvZGVkIGFmdGVyIHRoZSBmdW5jdGlvbiByZXR1cm5zIG9y
IGNhbGxzIHRoZSBjYWxsYmFjay4iIH0KKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAiYXN5
bmMiOiB0cnVlCiAgICAgICAgIH0KICAgICBdCiB9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0
Mi9VSVByb2Nlc3MvQXV0b21hdGlvbi9XZWJBdXRvbWF0aW9uU2Vzc2lvbi5jcHAgYi9Tb3VyY2Uv
V2ViS2l0Mi9VSVByb2Nlc3MvQXV0b21hdGlvbi9XZWJBdXRvbWF0aW9uU2Vzc2lvbi5jcHAKaW5k
ZXggZjQwZmIxZi4uYTU5NjE1NSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNz
L0F1dG9tYXRpb24vV2ViQXV0b21hdGlvblNlc3Npb24uY3BwCisrKyBiL1NvdXJjZS9XZWJLaXQy
L1VJUHJvY2Vzcy9BdXRvbWF0aW9uL1dlYkF1dG9tYXRpb25TZXNzaW9uLmNwcApAQCAtMjU1LDQg
KzI1NSwzOCBAQCB2b2lkIFdlYkF1dG9tYXRpb25TZXNzaW9uOjpyZWxvYWRCcm93c2luZ0NvbnRl
eHQoSW5zcGVjdG9yOjpFcnJvclN0cmluZyYgZXJyb3JTdAogICAgIHBhZ2UtPnJlbG9hZChyZWxv
YWRGcm9tT3JpZ2luLCBjb250ZW50QmxvY2tlcnNFbmFibGVkKTsKIH0KIAordm9pZCBXZWJBdXRv
bWF0aW9uU2Vzc2lvbjo6ZXZhbHVhdGVKYXZhU2NyaXB0RnVuY3Rpb24oSW5zcGVjdG9yOjpFcnJv
clN0cmluZyYgZXJyb3JTdHJpbmcsIGNvbnN0IFN0cmluZyYgaGFuZGxlLCBjb25zdCBTdHJpbmcm
IGZ1bmN0aW9uLCBjb25zdCBJbnNwZWN0b3I6Okluc3BlY3RvckFycmF5JiBhcmd1bWVudHMsIGJv
b2wgZXhwZWN0c0ltcGxpY2l0Q2FsbGJhY2tBcmd1bWVudCwgUmVmPEV2YWx1YXRlSmF2YVNjcmlw
dEZ1bmN0aW9uQ2FsbGJhY2s+JiYgY2FsbGJhY2spCit7CisgICAgLy8gRklYTUUgMjQxNzI0Mzk6
IFRoaXMgc2hvdWxkIGJlIGEgZnJhbWUgaGFuZGxlLCBub3QgYSBwYWdlIGhhbmRsZS4gQ2hhbmdl
IHRoaXMgb25jZSB3ZSBoYXZlIGZyYW1lIHN1cHBvcnQuCisgICAgV2ViUGFnZVByb3h5KiBwYWdl
ID0gd2ViUGFnZVByb3h5Rm9ySGFuZGxlKGhhbmRsZSk7CisgICAgaWYgKCFwYWdlKQorICAgICAg
ICBGQUlMX1dJVEhfUFJFREVGSU5FRF9FUlJPUl9NRVNTQUdFKFdpbmRvd05vdEZvdW5kKTsKKwor
ICAgIFZlY3RvcjxTdHJpbmc+IGFyZ3VtZW50c1ZlY3RvcjsKKyAgICBhcmd1bWVudHNWZWN0b3Iu
cmVzZXJ2ZUNhcGFjaXR5KGFyZ3VtZW50cy5sZW5ndGgoKSk7CisKKyAgICBmb3IgKGF1dG8mIGFy
Z3VtZW50IDogYXJndW1lbnRzKSB7CisgICAgICAgIFN0cmluZyBhcmd1bWVudFN0cmluZzsKKyAg
ICAgICAgYXJndW1lbnQtPmFzU3RyaW5nKGFyZ3VtZW50U3RyaW5nKTsKKyAgICAgICAgYXJndW1l
bnRzVmVjdG9yLmFwcGVuZChhcmd1bWVudFN0cmluZyk7CisgICAgfQorCisgICAgdWludDY0X3Qg
Y2FsbGJhY2tJRCA9IG1fbmV4dEV2YWx1YXRlSmF2YVNjcmlwdENhbGxiYWNrSUQrKzsKKyAgICBt
X2V2YWx1YXRlSmF2YVNjcmlwdEZ1bmN0aW9uQ2FsbGJhY2tzLnNldChjYWxsYmFja0lELCBXVEZN
b3ZlKGNhbGxiYWNrKSk7CisKKyAgICBwYWdlLT5wcm9jZXNzKCkuc2VuZChNZXNzYWdlczo6V2Vi
QXV0b21hdGlvblNlc3Npb25Qcm94eTo6RXZhbHVhdGVKYXZhU2NyaXB0RnVuY3Rpb24ocGFnZS0+
bWFpbkZyYW1lKCktPmZyYW1lSUQoKSwgZnVuY3Rpb24sIGFyZ3VtZW50c1ZlY3RvciwgZXhwZWN0
c0ltcGxpY2l0Q2FsbGJhY2tBcmd1bWVudCwgY2FsbGJhY2tJRCksIDApOworfQorCit2b2lkIFdl
YkF1dG9tYXRpb25TZXNzaW9uOjpkaWRFdmFsdWF0ZUphdmFTY3JpcHRGdW5jdGlvbih1aW50NjRf
dCBjYWxsYmFja0lELCBjb25zdCBTdHJpbmcmIHJlc3VsdCwgYm9vbCByZXN1bHRJc0Vycm9yKQor
eworICAgIGF1dG8gY2FsbGJhY2sgPSBtX2V2YWx1YXRlSmF2YVNjcmlwdEZ1bmN0aW9uQ2FsbGJh
Y2tzLnRha2UoY2FsbGJhY2tJRCk7CisgICAgaWYgKCFjYWxsYmFjaykKKyAgICAgICAgcmV0dXJu
OworCisgICAgaWYgKHJlc3VsdElzRXJyb3IpCisgICAgICAgIGNhbGxiYWNrLT5zZW5kRmFpbHVy
ZShyZXN1bHQpOworICAgIGVsc2UKKyAgICAgICAgY2FsbGJhY2stPnNlbmRTdWNjZXNzKHJlc3Vs
dCk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktp
dDIvVUlQcm9jZXNzL0F1dG9tYXRpb24vV2ViQXV0b21hdGlvblNlc3Npb24uaCBiL1NvdXJjZS9X
ZWJLaXQyL1VJUHJvY2Vzcy9BdXRvbWF0aW9uL1dlYkF1dG9tYXRpb25TZXNzaW9uLmgKaW5kZXgg
ZGI2ZmMzMi4uZjc4ZGNiOSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0F1
dG9tYXRpb24vV2ViQXV0b21hdGlvblNlc3Npb24uaAorKysgYi9Tb3VyY2UvV2ViS2l0Mi9VSVBy
b2Nlc3MvQXV0b21hdGlvbi9XZWJBdXRvbWF0aW9uU2Vzc2lvbi5oCkBAIC04OSw2ICs4OSw3IEBA
IHB1YmxpYzoKICAgICB2b2lkIGdvQmFja0luQnJvd3NpbmdDb250ZXh0KEluc3BlY3Rvcjo6RXJy
b3JTdHJpbmcmLCBjb25zdCBTdHJpbmcmKSBvdmVycmlkZTsKICAgICB2b2lkIGdvRm9yd2FyZElu
QnJvd3NpbmdDb250ZXh0KEluc3BlY3Rvcjo6RXJyb3JTdHJpbmcmLCBjb25zdCBTdHJpbmcmKSBv
dmVycmlkZTsKICAgICB2b2lkIHJlbG9hZEJyb3dzaW5nQ29udGV4dChJbnNwZWN0b3I6OkVycm9y
U3RyaW5nJiwgY29uc3QgU3RyaW5nJikgb3ZlcnJpZGU7CisgICAgdm9pZCBldmFsdWF0ZUphdmFT
Y3JpcHRGdW5jdGlvbihJbnNwZWN0b3I6OkVycm9yU3RyaW5nJiwgY29uc3QgU3RyaW5nJiBoYW5k
bGUsIGNvbnN0IFN0cmluZyYgZnVuY3Rpb24sIGNvbnN0IEluc3BlY3Rvcjo6SW5zcGVjdG9yQXJy
YXkmIGFyZ3VtZW50cywgYm9vbCBleHBlY3RzSW1wbGljaXRDYWxsYmFja0FyZ3VtZW50LCBSZWY8
SW5zcGVjdG9yOjpBdXRvbWF0aW9uQmFja2VuZERpc3BhdGNoZXJIYW5kbGVyOjpFdmFsdWF0ZUph
dmFTY3JpcHRGdW5jdGlvbkNhbGxiYWNrPiYmKSBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgICBX
ZWJLaXQ6OldlYlBhZ2VQcm94eSogd2ViUGFnZVByb3h5Rm9ySGFuZGxlKGNvbnN0IFN0cmluZyYp
OwpAQCAtOTgsOCArOTksNyBAQCBwcml2YXRlOgogICAgIHZvaWQgZGlkUmVjZWl2ZU1lc3NhZ2Uo
SVBDOjpDb25uZWN0aW9uJiwgSVBDOjpNZXNzYWdlRGVjb2RlciYpIG92ZXJyaWRlOwogCiAgICAg
Ly8gQ2FsbGVkIGJ5IFdlYkF1dG9tYXRpb25TZXNzaW9uIG1lc3NhZ2VzCi0gICAgLy8gRklYTUU6
IEFkZCBtZXNzYWdlIGZ1bmN0aW9ucyBoZXJlLgotICAgIHZvaWQgdGVzdCgpIHsgfTsKKyAgICB2
b2lkIGRpZEV2YWx1YXRlSmF2YVNjcmlwdEZ1bmN0aW9uKHVpbnQ2NF90IGNhbGxiYWNrSUQsIGNv
bnN0IFN0cmluZyYgcmVzdWx0LCBib29sIHJlc3VsdElzRXJyb3IpOwogCiAgICAgV2ViS2l0OjpX
ZWJQcm9jZXNzUG9vbCogbV9wcm9jZXNzUG9vbCB7IG51bGxwdHIgfTsKICAgICBzdGQ6OnVuaXF1
ZV9wdHI8QVBJOjpBdXRvbWF0aW9uU2Vzc2lvbkNsaWVudD4gbV9jbGllbnQ7CkBAIC0xMTIsNiAr
MTEyLDkgQEAgcHJpdmF0ZToKICAgICBIYW5kbGVXZWJQYWdlTWFwIG1faGFuZGxlV2ViUGFnZU1h
cDsKICAgICBTdHJpbmcgbV9hY3RpdmVCcm93c2luZ0NvbnRleHRIYW5kbGU7CiAKKyAgICB1aW50
NjRfdCBtX25leHRFdmFsdWF0ZUphdmFTY3JpcHRDYWxsYmFja0lEIHsgMSB9OworICAgIEhhc2hN
YXA8dWludDY0X3QsIFJlZlB0cjxJbnNwZWN0b3I6OkF1dG9tYXRpb25CYWNrZW5kRGlzcGF0Y2hl
ckhhbmRsZXI6OkV2YWx1YXRlSmF2YVNjcmlwdEZ1bmN0aW9uQ2FsbGJhY2s+PiBtX2V2YWx1YXRl
SmF2YVNjcmlwdEZ1bmN0aW9uQ2FsbGJhY2tzOworCiAjaWYgRU5BQkxFKFJFTU9URV9JTlNQRUNU
T1IpCiAgICAgSW5zcGVjdG9yOjpGcm9udGVuZENoYW5uZWwqIG1fcmVtb3RlQ2hhbm5lbCB7IG51
bGxwdHIgfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0F1
dG9tYXRpb24vV2ViQXV0b21hdGlvblNlc3Npb24ubWVzc2FnZXMuaW4gYi9Tb3VyY2UvV2ViS2l0
Mi9VSVByb2Nlc3MvQXV0b21hdGlvbi9XZWJBdXRvbWF0aW9uU2Vzc2lvbi5tZXNzYWdlcy5pbgpp
bmRleCA5MmY3NTBjLi5kZDg4YWQyIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nl
c3MvQXV0b21hdGlvbi9XZWJBdXRvbWF0aW9uU2Vzc2lvbi5tZXNzYWdlcy5pbgorKysgYi9Tb3Vy
Y2UvV2ViS2l0Mi9VSVByb2Nlc3MvQXV0b21hdGlvbi9XZWJBdXRvbWF0aW9uU2Vzc2lvbi5tZXNz
YWdlcy5pbgpAQCAtMjEsNiArMjEsNSBAQAogIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogCiBtZXNzYWdlcyAtPiBX
ZWJBdXRvbWF0aW9uU2Vzc2lvbiB7Ci0gICAgLy8gRklYTUU6IEFkZCBtZXNzYWdlcyBoZXJlLgot
ICAgIFRlc3QoKQorICAgIERpZEV2YWx1YXRlSmF2YVNjcmlwdEZ1bmN0aW9uKHVpbnQ2NF90IGNh
bGxiYWNrSUQsIFN0cmluZyByZXN1bHQsIGJvb2wgcmVzdWx0SXNFcnJvcikKIH0KZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvQXV0b21hdGlvbi9XZWJBdXRvbWF0aW9uU2Vz
c2lvblByb3h5LmNwcCBiL1NvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvQXV0b21hdGlvbi9XZWJB
dXRvbWF0aW9uU2Vzc2lvblByb3h5LmNwcAppbmRleCAxMmUxNWFjLi42OTAwNGY0IDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL0F1dG9tYXRpb24vV2ViQXV0b21hdGlvblNl
c3Npb25Qcm94eS5jcHAKKysrIGIvU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9BdXRvbWF0aW9u
L1dlYkF1dG9tYXRpb25TZXNzaW9uUHJveHkuY3BwCkBAIC0zOSw2ICszOSwzMSBAQAogCiBuYW1l
c3BhY2UgV2ViS2l0IHsKIAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgSlNPYmplY3RS
ZWYgdG9KU0FycmF5KEpTQ29udGV4dFJlZiBjb250ZXh0LCBjb25zdCBWZWN0b3I8VD4mIGRhdGEs
IEpTVmFsdWVSZWYgKCpjb252ZXJ0ZXIpKEpTQ29udGV4dFJlZiwgY29uc3QgVCYpLCBKU1ZhbHVl
UmVmKiBleGNlcHRpb24gPSAwKQoreworICAgIEFTU0VSVF9BUkcoY29udmVydGVyLCBjb252ZXJ0
ZXIpOworCisgICAgaWYgKGRhdGEuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gSlNPYmplY3RN
YWtlQXJyYXkoY29udGV4dCwgMCwgMCwgZXhjZXB0aW9uKTsKKworICAgIFZlY3RvcjxKU1ZhbHVl
UmVmLCA4PiBjb252ZXJ0ZWREYXRhOworICAgIGNvbnZlcnRlZERhdGEucmVzZXJ2ZUNhcGFjaXR5
KGRhdGEuc2l6ZSgpKTsKKworICAgIGZvciAoYXV0byYgb3JpZ2luYWxWYWx1ZSA6IGRhdGEpIHsK
KyAgICAgICAgSlNWYWx1ZVJlZiBjb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnRlcihjb250ZXh0LCBv
cmlnaW5hbFZhbHVlKTsKKyAgICAgICAgSlNWYWx1ZVByb3RlY3QoY29udGV4dCwgY29udmVydGVk
VmFsdWUpOworICAgICAgICBjb252ZXJ0ZWREYXRhLmFwcGVuZChjb252ZXJ0ZWRWYWx1ZSk7Cisg
ICAgfQorCisgICAgSlNPYmplY3RSZWYgYXJyYXkgPSBKU09iamVjdE1ha2VBcnJheShjb250ZXh0
LCBjb252ZXJ0ZWREYXRhLnNpemUoKSwgY29udmVydGVkRGF0YS5kYXRhKCksIGV4Y2VwdGlvbik7
CisKKyAgICBmb3IgKGF1dG8mIGNvbnZlcnRlZFZhbHVlIDogY29udmVydGVkRGF0YSkKKyAgICAg
ICAgSlNWYWx1ZVVucHJvdGVjdChjb250ZXh0LCBjb252ZXJ0ZWRWYWx1ZSk7CisKKyAgICByZXR1
cm4gYXJyYXk7Cit9CisKIHN0YXRpYyBpbmxpbmUgSlNSZXRhaW5QdHI8SlNTdHJpbmdSZWY+IHRv
SlNTdHJpbmcoY29uc3QgU3RyaW5nJiBzdHJpbmcpCiB7CiAgICAgcmV0dXJuIEpTUmV0YWluUHRy
PEpTU3RyaW5nUmVmPihBZG9wdCwgT3BhcXVlSlNTdHJpbmc6OmNyZWF0ZShzdHJpbmcpLmxlYWtS
ZWYoKSk7CkBAIC00OSw2ICs3NCwxNyBAQCBzdGF0aWMgaW5saW5lIEpTVmFsdWVSZWYgdG9KU1Zh
bHVlKEpTQ29udGV4dFJlZiBjb250ZXh0LCBjb25zdCBTdHJpbmcmIHN0cmluZykKICAgICByZXR1
cm4gSlNWYWx1ZU1ha2VTdHJpbmcoY29udGV4dCwgdG9KU1N0cmluZyhzdHJpbmcpLmdldCgpKTsK
IH0KIAorc3RhdGljIGlubGluZSBKU1ZhbHVlUmVmIGNhbGxQcm9wZXJ0eUZ1bmN0aW9uKEpTQ29u
dGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBvYmplY3QsIGNvbnN0IFN0cmluZyYgcHJvcGVy
dHlOYW1lLCBzaXplX3QgYXJndW1lbnRDb3VudCwgY29uc3QgSlNWYWx1ZVJlZiBhcmd1bWVudHNb
XSwgSlNWYWx1ZVJlZiogZXhjZXB0aW9uKQoreworICAgIEFTU0VSVF9BUkcob2JqZWN0LCBvYmpl
Y3QpOworICAgIEFTU0VSVF9BUkcob2JqZWN0LCBKU1ZhbHVlSXNPYmplY3QoY29udGV4dCwgb2Jq
ZWN0KSk7CisKKyAgICBKU09iamVjdFJlZiBldmFsdWF0ZUphdmFTY3JpcHRGdW5jdGlvbiA9IGNv
bnN0X2Nhc3Q8SlNPYmplY3RSZWY+KEpTT2JqZWN0R2V0UHJvcGVydHkoY29udGV4dCwgb2JqZWN0
LCB0b0pTU3RyaW5nKHByb3BlcnR5TmFtZSkuZ2V0KCksIGV4Y2VwdGlvbikpOworICAgIEFTU0VS
VChKU09iamVjdElzRnVuY3Rpb24oY29udGV4dCwgZXZhbHVhdGVKYXZhU2NyaXB0RnVuY3Rpb24p
KTsKKworICAgIHJldHVybiBKU09iamVjdENhbGxBc0Z1bmN0aW9uKGNvbnRleHQsIGV2YWx1YXRl
SmF2YVNjcmlwdEZ1bmN0aW9uLCBvYmplY3QsIGFyZ3VtZW50Q291bnQsIGFyZ3VtZW50cywgZXhj
ZXB0aW9uKTsKK30KKwogV2ViQXV0b21hdGlvblNlc3Npb25Qcm94eTo6V2ViQXV0b21hdGlvblNl
c3Npb25Qcm94eShjb25zdCBTdHJpbmcmIHNlc3Npb25JZGVudGlmaWVyKQogICAgIDogbV9zZXNz
aW9uSWRlbnRpZmllcihzZXNzaW9uSWRlbnRpZmllcikKIHsKQEAgLTc3LDYgKzExMywyNiBAQCBz
dGF0aWMgSlNWYWx1ZVJlZiBjcmVhdGVVVUlEKEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVj
dFJlZiBmdW5jdGlvbiwgSlNPYmplYwogICAgIHJldHVybiB0b0pTVmFsdWUoY29udGV4dCwgV2Vi
Q29yZTo6Y3JlYXRlQ2Fub25pY2FsVVVJRFN0cmluZygpLmNvbnZlcnRUb0FTQ0lJVXBwZXJjYXNl
KCkpOwogfQogCitzdGF0aWMgSlNWYWx1ZVJlZiBldmFsdWF0ZUphdmFTY3JpcHRDYWxsYmFjayhK
U0NvbnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RSZWYgZnVuY3Rpb24sIEpTT2JqZWN0UmVmIHRo
aXNPYmplY3QsIHNpemVfdCBhcmd1bWVudENvdW50LCBjb25zdCBKU1ZhbHVlUmVmIGFyZ3VtZW50
c1tdLCBKU1ZhbHVlUmVmKiBleGNlcHRpb24pCit7CisgICAgQVNTRVJUX0FSRyhhcmd1bWVudENv
dW50LCBhcmd1bWVudENvdW50ID09IDMpOworICAgIEFTU0VSVF9BUkcoYXJndW1lbnRzLCBKU1Zh
bHVlSXNOdW1iZXIoY29udGV4dCwgYXJndW1lbnRzWzBdKSk7CisgICAgQVNTRVJUX0FSRyhhcmd1
bWVudHMsIEpTVmFsdWVJc1N0cmluZyhjb250ZXh0LCBhcmd1bWVudHNbMV0pKTsKKyAgICBBU1NF
UlRfQVJHKGFyZ3VtZW50cywgSlNWYWx1ZUlzQm9vbGVhbihjb250ZXh0LCBhcmd1bWVudHNbMl0p
KTsKKworICAgIGF1dG8gYXV0b21hdGlvblNlc3Npb25Qcm94eSA9IFdlYlByb2Nlc3M6OnNpbmds
ZXRvbigpLmF1dG9tYXRpb25TZXNzaW9uUHJveHkoKTsKKyAgICBpZiAoIWF1dG9tYXRpb25TZXNz
aW9uUHJveHkpCisgICAgICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsK
KworICAgIHVpbnQ2NF90IGNhbGxiYWNrSUQgPSBKU1ZhbHVlVG9OdW1iZXIoY29udGV4dCwgYXJn
dW1lbnRzWzBdLCBleGNlcHRpb24pOworICAgIEpTUmV0YWluUHRyPEpTU3RyaW5nUmVmPiByZXN1
bHQoQWRvcHQsIEpTVmFsdWVUb1N0cmluZ0NvcHkoY29udGV4dCwgYXJndW1lbnRzWzFdLCBleGNl
cHRpb24pKTsKKyAgICBib29sIHJlc3VsdElzRXJyb3IgPSBKU1ZhbHVlVG9Cb29sZWFuKGNvbnRl
eHQsIGFyZ3VtZW50c1syXSk7CisKKyAgICBXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5wYXJlbnRQ
cm9jZXNzQ29ubmVjdGlvbigpLT5zZW5kKE1lc3NhZ2VzOjpXZWJBdXRvbWF0aW9uU2Vzc2lvbjo6
RGlkRXZhbHVhdGVKYXZhU2NyaXB0RnVuY3Rpb24oY2FsbGJhY2tJRCwgcmVzdWx0LT5zdHJpbmco
KSwgcmVzdWx0SXNFcnJvciksIDApOworCisgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVk
KGNvbnRleHQpOworfQorCiBKU09iamVjdFJlZiBXZWJBdXRvbWF0aW9uU2Vzc2lvblByb3h5Ojpz
Y3JpcHRPYmplY3RGb3JGcmFtZShXZWJGcmFtZSYgZnJhbWUpCiB7CiAgICAgaWYgKEpTT2JqZWN0
UmVmIHNjcmlwdE9iamVjdCA9IG1fd2ViRnJhbWVTY3JpcHRPYmplY3RNYXAuZ2V0KGZyYW1lLmZy
YW1lSUQoKSkpCkBAIC0xMTAsNCArMTY2LDMwIEBAIHZvaWQgV2ViQXV0b21hdGlvblNlc3Npb25Q
cm94eTo6ZGlkQ2xlYXJXaW5kb3dPYmplY3RGb3JGcmFtZShXZWJGcmFtZSYgZnJhbWUpCiAgICAg
ICAgIEpTVmFsdWVVbnByb3RlY3QoZnJhbWUuanNDb250ZXh0KCksIHNjcmlwdE9iamVjdCk7CiB9
CiAKK3ZvaWQgV2ViQXV0b21hdGlvblNlc3Npb25Qcm94eTo6ZXZhbHVhdGVKYXZhU2NyaXB0RnVu
Y3Rpb24odWludDY0X3QgZnJhbWVJRCwgY29uc3QgU3RyaW5nJiBmdW5jdGlvbiwgVmVjdG9yPFN0
cmluZz4gYXJndW1lbnRzLCBib29sIGV4cGVjdHNJbXBsaWNpdENhbGxiYWNrQXJndW1lbnQsIHVp
bnQ2NF90IGNhbGxiYWNrSUQpCit7CisgICAgV2ViRnJhbWUqIGZyYW1lID0gV2ViUHJvY2Vzczo6
c2luZ2xldG9uKCkud2ViRnJhbWUoZnJhbWVJRCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgSlNPYmplY3RSZWYgc2NyaXB0T2JqZWN0ID0gc2NyaXB0T2JqZWN0Rm9y
RnJhbWUoKmZyYW1lKTsKKyAgICBpZiAoIXNjcmlwdE9iamVjdCkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgSlNWYWx1ZVJlZiBleGNlcHRpb24gPSBudWxscHRyOworICAgIEpTR2xvYmFsQ29udGV4
dFJlZiBjb250ZXh0ID0gZnJhbWUtPmpzQ29udGV4dCgpOworCisgICAgSlNPYmplY3RSZWYgY2Fs
bGJhY2tGdW5jdGlvbiA9IEpTT2JqZWN0TWFrZUZ1bmN0aW9uV2l0aENhbGxiYWNrKGNvbnRleHQs
IG51bGxwdHIsIGV2YWx1YXRlSmF2YVNjcmlwdENhbGxiYWNrKTsKKworICAgIEpTVmFsdWVSZWYg
ZnVuY3Rpb25Bcmd1bWVudHNbXSA9IHsKKyAgICAgICAgdG9KU1ZhbHVlKGNvbnRleHQsIGZ1bmN0
aW9uKSwKKyAgICAgICAgdG9KU0FycmF5KGNvbnRleHQsIGFyZ3VtZW50cywgdG9KU1ZhbHVlLCAm
ZXhjZXB0aW9uKSwKKyAgICAgICAgSlNWYWx1ZU1ha2VCb29sZWFuKGNvbnRleHQsIGV4cGVjdHNJ
bXBsaWNpdENhbGxiYWNrQXJndW1lbnQpLAorICAgICAgICBKU1ZhbHVlTWFrZU51bWJlcihjb250
ZXh0LCBjYWxsYmFja0lEKSwKKyAgICAgICAgY2FsbGJhY2tGdW5jdGlvbgorICAgIH07CisKKyAg
ICBjYWxsUHJvcGVydHlGdW5jdGlvbihjb250ZXh0LCBzY3JpcHRPYmplY3QsIEFTQ0lJTGl0ZXJh
bCgiZXZhbHVhdGVKYXZhU2NyaXB0RnVuY3Rpb24iKSwgV1RGX0FSUkFZX0xFTkdUSChmdW5jdGlv
bkFyZ3VtZW50cyksIGZ1bmN0aW9uQXJndW1lbnRzLCAmZXhjZXB0aW9uKTsKK30KKwogfSAvLyBu
YW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL0F1
dG9tYXRpb24vV2ViQXV0b21hdGlvblNlc3Npb25Qcm94eS5oIGIvU291cmNlL1dlYktpdDIvV2Vi
UHJvY2Vzcy9BdXRvbWF0aW9uL1dlYkF1dG9tYXRpb25TZXNzaW9uUHJveHkuaAppbmRleCBkMWNi
ZmVhLi40NTRhZDEyIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL0F1dG9t
YXRpb24vV2ViQXV0b21hdGlvblNlc3Npb25Qcm94eS5oCisrKyBiL1NvdXJjZS9XZWJLaXQyL1dl
YlByb2Nlc3MvQXV0b21hdGlvbi9XZWJBdXRvbWF0aW9uU2Vzc2lvblByb3h5LmgKQEAgLTUwLDgg
KzUwLDcgQEAgcHJpdmF0ZToKICAgICB2b2lkIGRpZFJlY2VpdmVNZXNzYWdlKElQQzo6Q29ubmVj
dGlvbiYsIElQQzo6TWVzc2FnZURlY29kZXImKTsKIAogICAgIC8vIENhbGxlZCBieSBXZWJBdXRv
bWF0aW9uU2Vzc2lvblByb3h5IG1lc3NhZ2VzCi0gICAgLy8gRklYTUU6IEFkZCBtZXNzYWdlIGZ1
bmN0aW9ucyBoZXJlLgotICAgIHZvaWQgdGVzdCgpIHsgfTsKKyAgICB2b2lkIGV2YWx1YXRlSmF2
YVNjcmlwdEZ1bmN0aW9uKHVpbnQ2NF90IGZyYW1lSUQsIGNvbnN0IFN0cmluZyYgZnVuY3Rpb24s
IFZlY3RvcjxTdHJpbmc+IGFyZ3VtZW50cywgYm9vbCBleHBlY3RzSW1wbGljaXRDYWxsYmFja0Fy
Z3VtZW50LCB1aW50NjRfdCBjYWxsYmFja0lEKTsKIAogICAgIFN0cmluZyBtX3Nlc3Npb25JZGVu
dGlmaWVyOwogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL0F1dG9tYXRp
b24vV2ViQXV0b21hdGlvblNlc3Npb25Qcm94eS5qcyBiL1NvdXJjZS9XZWJLaXQyL1dlYlByb2Nl
c3MvQXV0b21hdGlvbi9XZWJBdXRvbWF0aW9uU2Vzc2lvblByb3h5LmpzCmluZGV4IDBjNDJmMzIu
LmIxNzA1OWIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvQXV0b21hdGlv
bi9XZWJBdXRvbWF0aW9uU2Vzc2lvblByb3h5LmpzCisrKyBiL1NvdXJjZS9XZWJLaXQyL1dlYlBy
b2Nlc3MvQXV0b21hdGlvbi9XZWJBdXRvbWF0aW9uU2Vzc2lvblByb3h5LmpzCkBAIC0zMCwxMSAr
MzAsOTAgQEAKIC8vIFByb3RlY3QgYWdhaW5zdCBPYmplY3Qgb3ZlcndyaXR0ZW4gYnkgdGhlIHBh
Z2UuCiBsZXQgT2JqZWN0ID0ge30uY29uc3RydWN0b3I7CiAKK2NvbnN0IHNlc3Npb25Ob2RlUHJv
cGVydHlOYW1lID0gInNlc3Npb24tbm9kZS0iICsgc2Vzc2lvbklkZW50aWZpZXI7CisKIGxldCBB
dXRvbWF0aW9uU2Vzc2lvblByb3h5ID0gY2xhc3MgQXV0b21hdGlvblNlc3Npb25Qcm94eQogewor
ICAgIGNvbnN0cnVjdG9yKCkKKyAgICB7CisgICAgICAgIHRoaXMuX25vZGVUb0lkTWFwID0gbmV3
IE1hcDsKKyAgICAgICAgdGhpcy5faWRUb05vZGVNYXAgPSBuZXcgTWFwOworICAgIH0KKwogICAg
IC8vIFB1YmxpYwogCi0gICAgLy8gRklYTUU6IEFkZCBmdW5jdGlvbnMgaGVyZS4KKyAgICBldmFs
dWF0ZUphdmFTY3JpcHRGdW5jdGlvbihmdW5jdGlvblN0cmluZywgYXJndW1lbnRTdHJpbmdzLCBl
eHBlY3RzSW1wbGljaXRDYWxsYmFja0FyZ3VtZW50LCBjYWxsYmFja0lELCByZXN1bHRDYWxsYmFj
aykKKyAgICB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBUaGUgc2NyaXB0IGlzIGV4
cGVjdGVkIHRvIGJlIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24uIEV2YWx1YXRlIGl0IGluc2lkZSBw
YXJlbnRoZXNpcyB0byBnZXQgdGhlIGZ1bmN0aW9uIHZhbHVlLgorICAgICAgICAgICAgbGV0IGZ1
bmN0aW9uVmFsdWUgPSBldmFsdWF0ZSgiKCIgKyBmdW5jdGlvblN0cmluZyArICIpIik7CisgICAg
ICAgICAgICBpZiAodHlwZW9mIGZ1bmN0aW9uVmFsdWUgIT09ICJmdW5jdGlvbiIpCisgICAgICAg
ICAgICAgICAgdGhyb3cgIlNjcmlwdCBkaWQgbm90IGV2YWx1YXRlIHRvIGEgZnVuY3Rpb24uIjsK
KworICAgICAgICAgICAgbGV0IGFyZ3VtZW50VmFsdWVzID0gYXJndW1lbnRTdHJpbmdzLm1hcCh0
aGlzLl9qc29uUGFyc2UsIHRoaXMpOworCisgICAgICAgICAgICBpZiAoZXhwZWN0c0ltcGxpY2l0
Q2FsbGJhY2tBcmd1bWVudCkgeworICAgICAgICAgICAgICAgIGFyZ3VtZW50VmFsdWVzLnB1c2go
KHJlc3VsdCkgPT4gcmVzdWx0Q2FsbGJhY2soY2FsbGJhY2tJRCwgdGhpcy5fanNvblN0cmluZ2lm
eShyZXN1bHQpLCBmYWxzZSkpOworICAgICAgICAgICAgICAgIGZ1bmN0aW9uVmFsdWUuYXBwbHko
bnVsbCwgYXJndW1lbnRWYWx1ZXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
ICAgICBsZXQgcmVzdWx0ID0gZnVuY3Rpb25WYWx1ZS5hcHBseShudWxsLCBhcmd1bWVudFZhbHVl
cyk7CisgICAgICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2soY2FsbGJhY2tJRCwgdGhpcy5fanNv
blN0cmluZ2lmeShyZXN1bHQpLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0
Y2ggKGVycm9yKSB7CisgICAgICAgICAgICByZXN1bHRDYWxsYmFjayhjYWxsYmFja0lELCB0aGlz
Ll9qc29uU3RyaW5naWZ5KGVycm9yKSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAv
LyBQcml2YXRlCisKKyAgICBfanNvblBhcnNlKHN0cmluZykKKyAgICB7CisgICAgICAgIHJldHVy
biBKU09OLnBhcnNlKHN0cmluZywgKGtleSwgdmFsdWUpID0+IHRoaXMuX3Jldml2ZUpTT05WYWx1
ZShrZXksIHZhbHVlKSk7CisgICAgfQorCisgICAgX2pzb25TdHJpbmdpZnkob3JpZ2luYWwpCisg
ICAgeworICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob3JpZ2luYWwsIChrZXksIHZhbHVl
KSA9PiB0aGlzLl9yZXBsYWNlSlNPTlZhbHVlKGtleSwgdmFsdWUpKTsKKyAgICB9CisKKyAgICBf
cmV2aXZlSlNPTlZhbHVlKGtleSwgdmFsdWUpCisgICAgeworICAgICAgICBpZiAodmFsdWVbc2Vz
c2lvbk5vZGVQcm9wZXJ0eU5hbWVdKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25vZGVGb3JJ
ZGVudGlmaWVyKHZhbHVlW3Nlc3Npb25Ob2RlUHJvcGVydHlOYW1lXSk7CisgICAgICAgIHJldHVy
biB2YWx1ZTsKKyAgICB9CisKKyAgICBfcmVwbGFjZUpTT05WYWx1ZShrZXksIHZhbHVlKQorICAg
IHsKKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTm9kZSkKKyAgICAgICAgICAgIHJldHVy
biB0aGlzLl9jcmVhdGVOb2RlSGFuZGxlKHRoaXMuX2lkZW50aWZpZXJGb3JOb2RlKHZhbHVlKSk7
CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBfY3JlYXRlTm9kZUhhbmRsZShp
ZGVudGlmaWVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHtbc2Vzc2lvbk5vZGVQcm9wZXJ0eU5h
bWVdOiBpZGVudGlmaWVyfTsKKyAgICB9CisKKyAgICBfbm9kZUZvcklkZW50aWZpZXIoaWRlbnRp
ZmllcikKKyAgICB7CisgICAgICAgIGxldCBub2RlID0gdGhpcy5faWRUb05vZGVNYXAuZ2V0KGlk
ZW50aWZpZXIpOworICAgICAgICBpZiAobm9kZSkKKyAgICAgICAgICAgIHJldHVybiBub2RlOwor
ICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoIk5vZGUgd2l0aCBpZGVudGlmaWVyICci
ICsgaWRlbnRpZmllciArICInIHdhcyBub3QgZm91bmQiKTsKKyAgICB9CisKKyAgICBfaWRlbnRp
ZmllckZvck5vZGUobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBpZGVudGlmaWVyID0gdGhpcy5f
bm9kZVRvSWRNYXAuZ2V0KG5vZGUpOworICAgICAgICBpZiAoaWRlbnRpZmllcikKKyAgICAgICAg
ICAgIHJldHVybiBpZGVudGlmaWVyOworCisgICAgICAgIGlkZW50aWZpZXIgPSAibm9kZS0iICsg
Y3JlYXRlVVVJRCgpOworICAgICAgICB0aGlzLl9ub2RlVG9JZE1hcC5zZXQobm9kZSwgaWRlbnRp
Zmllcik7CisgICAgICAgIHRoaXMuX2lkVG9Ob2RlTWFwLnNldChpZGVudGlmaWVyLCBub2RlKTsK
KyAgICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CisgICAgfQogfTsKIAogcmV0dXJuIG5ldyBBdXRv
bWF0aW9uU2Vzc2lvblByb3h5OwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvV2ViUHJvY2Vz
cy9BdXRvbWF0aW9uL1dlYkF1dG9tYXRpb25TZXNzaW9uUHJveHkubWVzc2FnZXMuaW4gYi9Tb3Vy
Y2UvV2ViS2l0Mi9XZWJQcm9jZXNzL0F1dG9tYXRpb24vV2ViQXV0b21hdGlvblNlc3Npb25Qcm94
eS5tZXNzYWdlcy5pbgppbmRleCA0ZTNjOGNjLi4xZDBmOGFmIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViS2l0Mi9XZWJQcm9jZXNzL0F1dG9tYXRpb24vV2ViQXV0b21hdGlvblNlc3Npb25Qcm94eS5t
ZXNzYWdlcy5pbgorKysgYi9Tb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL0F1dG9tYXRpb24vV2Vi
QXV0b21hdGlvblNlc3Npb25Qcm94eS5tZXNzYWdlcy5pbgpAQCAtMjEsNiArMjEsNSBAQAogIyBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgogCiBtZXNzYWdlcyAtPiBXZWJBdXRvbWF0aW9uU2Vzc2lvblByb3h5IHsKLSAg
ICAvLyBGSVhNRTogQWRkIG1lc3NhZ2VzIGhlcmUuCi0gICAgVGVzdCgpCisgICAgRXZhbHVhdGVK
YXZhU2NyaXB0RnVuY3Rpb24odWludDY0X3QgZnJhbWUsIFN0cmluZyBmdW5jdGlvbiwgVmVjdG9y
PFN0cmluZz4gYXJndW1lbnRzLCBib29sIGV4cGVjdHNJbXBsaWNpdENhbGxiYWNrQXJndW1lbnQs
IHVpbnQ2NF90IGNhbGxiYWNrSUQpCiB9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>274294</attachid>
            <date>2016-03-17 09:13:02 -0700</date>
            <delta_ts>2016-03-17 16:02:56 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-155524-20160317091251.patch</filename>
            <type>text/plain</type>
            <size>23146</size>
            <attacher name="Timothy Hatcher">timothy</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTk4MzAyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cKaW5kZXggMjAyOGRhZDQyOWE5MTBl
NjA1MjgyMDdmNDc4MTZiMDMxZjE0NWEzOS4uMDM5OTMzOGY5OTA0ZTljNTg1Yjg0YWJiMzFmMmVj
ZDM4YTI4OGU1NiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJLaXQyL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQyIEBACisyMDE2LTAzLTE3ICBUaW1v
dGh5IEhhdGNoZXIgIDx0aW1vdGh5QGFwcGxlLmNvbT4KKworICAgICAgICBXZWIgQXV0b21hdGlv
bjogQWRkIEF1dG9tYXRpb24uZXZhbHVhdGVKYXZhU2NyaXB0RnVuY3Rpb24KKworICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU1NTI0CisgICAgICAgIHJk
YXI6Ly9wcm9ibGVtLzI1MTgxODg4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BT
ISkuCisKKyAgICAgICAgKiBVSVByb2Nlc3MvQXV0b21hdGlvbi9BdXRvbWF0aW9uLmpzb246IEFk
ZGVkIGV2YWx1YXRlSmF2YVNjcmlwdEZ1bmN0aW9uIGNvbW1hbmQuCisKKyAgICAgICAgKiBVSVBy
b2Nlc3MvQXV0b21hdGlvbi9XZWJBdXRvbWF0aW9uU2Vzc2lvbi5jcHA6CisgICAgICAgIChXZWJL
aXQ6OldlYkF1dG9tYXRpb25TZXNzaW9uOjpldmFsdWF0ZUphdmFTY3JpcHRGdW5jdGlvbik6IEFk
ZGVkLgorICAgICAgICAoV2ViS2l0OjpXZWJBdXRvbWF0aW9uU2Vzc2lvbjo6ZGlkRXZhbHVhdGVK
YXZhU2NyaXB0RnVuY3Rpb24pOiBBZGRlZC4KKyAgICAgICAgKiBVSVByb2Nlc3MvQXV0b21hdGlv
bi9XZWJBdXRvbWF0aW9uU2Vzc2lvbi5oOgorICAgICAgICAqIFVJUHJvY2Vzcy9BdXRvbWF0aW9u
L1dlYkF1dG9tYXRpb25TZXNzaW9uLm1lc3NhZ2VzLmluOiBBZGRlZCBkaWRFdmFsdWF0ZUphdmFT
Y3JpcHRGdW5jdGlvbi4KKworICAgICAgICAqIFdlYlByb2Nlc3MvQXV0b21hdGlvbi9XZWJBdXRv
bWF0aW9uU2Vzc2lvblByb3h5LmNwcDoKKyAgICAgICAgKFdlYktpdDo6dG9KU0FycmF5KTogQWRk
ZWQuCisgICAgICAgIChXZWJLaXQ6OmNhbGxQcm9wZXJ0eUZ1bmN0aW9uKTogQWRkZWQuCisgICAg
ICAgIChXZWJLaXQ6OmV2YWx1YXRlSmF2YVNjcmlwdENhbGxiYWNrKTogQWRkZWQuCisgICAgICAg
IChXZWJLaXQ6OldlYkF1dG9tYXRpb25TZXNzaW9uUHJveHk6OmRpZENsZWFyV2luZG93T2JqZWN0
Rm9yRnJhbWUpOiBEaXNwYXRjaCBwZW5kaW5nIGNhbGxiYWNrcyBhcyBlcnJvcnMuCisgICAgICAg
IChXZWJLaXQ6OldlYkF1dG9tYXRpb25TZXNzaW9uUHJveHk6OmV2YWx1YXRlSmF2YVNjcmlwdEZ1
bmN0aW9uKTogQWRkZWQuCisgICAgICAgIChXZWJLaXQ6OldlYkF1dG9tYXRpb25TZXNzaW9uUHJv
eHk6OmRpZEV2YWx1YXRlSmF2YVNjcmlwdEZ1bmN0aW9uKTogQWRkZWQuCisgICAgICAgICogV2Vi
UHJvY2Vzcy9BdXRvbWF0aW9uL1dlYkF1dG9tYXRpb25TZXNzaW9uUHJveHkuaDoKKworICAgICAg
ICAqIFdlYlByb2Nlc3MvQXV0b21hdGlvbi9XZWJBdXRvbWF0aW9uU2Vzc2lvblByb3h5LmpzOgor
ICAgICAgICAoQXV0b21hdGlvblNlc3Npb25Qcm94eSk6IEFkZGVkIG1hcHMgZm9yIG5vZGUgaGFu
ZGxlcy4KKyAgICAgICAgKEF1dG9tYXRpb25TZXNzaW9uUHJveHkucHJvdG90eXBlLmV2YWx1YXRl
SmF2YVNjcmlwdEZ1bmN0aW9uKTogQWRkZWQuCisgICAgICAgIChBdXRvbWF0aW9uU2Vzc2lvblBy
b3h5LnByb3RvdHlwZS5fanNvblBhcnNlKTogQWRkZWQuCisgICAgICAgIChBdXRvbWF0aW9uU2Vz
c2lvblByb3h5LnByb3RvdHlwZS5fanNvblN0cmluZ2lmeSk6IEFkZGVkLgorICAgICAgICAoQXV0
b21hdGlvblNlc3Npb25Qcm94eS5wcm90b3R5cGUuX3Jldml2ZUpTT05WYWx1ZSk6IEFkZGVkLgor
ICAgICAgICAoQXV0b21hdGlvblNlc3Npb25Qcm94eS5wcm90b3R5cGUuX3JlcGxhY2VKU09OVmFs
dWUpOiBBZGRlZC4KKyAgICAgICAgKEF1dG9tYXRpb25TZXNzaW9uUHJveHkucHJvdG90eXBlLl9j
cmVhdGVOb2RlSGFuZGxlKTogQWRkZWQuCisgICAgICAgIChBdXRvbWF0aW9uU2Vzc2lvblByb3h5
LnByb3RvdHlwZS5fbm9kZUZvcklkZW50aWZpZXIpOiBBZGRlZC4KKyAgICAgICAgKEF1dG9tYXRp
b25TZXNzaW9uUHJveHkucHJvdG90eXBlLl9pZGVudGlmaWVyRm9yTm9kZSk6IEFkZGVkLgorCisg
ICAgICAgICogV2ViUHJvY2Vzcy9BdXRvbWF0aW9uL1dlYkF1dG9tYXRpb25TZXNzaW9uUHJveHku
bWVzc2FnZXMuaW46IEFkZGVkIGV2YWx1YXRlSmF2YVNjcmlwdEZ1bmN0aW9uLgorCiAyMDE2LTAz
LTE0ICBUaW1vdGh5IEhhdGNoZXIgIDx0aW1vdGh5QGFwcGxlLmNvbT4KIAogICAgICAgICBBZGQg
V2ViQXV0b21hdGlvblNlc3Npb25Qcm94eSBmb3IgV2ViUHJvY2VzcyBzaWRlIGF1dG9tYXRpb24g
dGFza3MKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BdXRvbWF0aW9uL0F1
dG9tYXRpb24uanNvbiBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BdXRvbWF0aW9uL0F1dG9t
YXRpb24uanNvbgppbmRleCBjNzA4OTQ2M2M1MWJkZTM3MmEwOTRmNzlhZjY2MDNlYWNhOTExZWUw
Li40MDQ0ZDMwMzA0ZTAyYWFlNzhhYzZlNWY0N2QwMWU1MDQ1Yzk0Y2UzIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQXV0b21hdGlvbi9BdXRvbWF0aW9uLmpzb24KKysrIGIv
U291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0F1dG9tYXRpb24vQXV0b21hdGlvbi5qc29uCkBAIC0x
Myw3ICsxMyw5IEBACiAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBlbnVtIGNvbnRh
aW5zIHByZWRlZmluZWQgZXJyb3IgbWVzc2FnZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBzaWduYWwg
YSB3ZWxsLWRlZmluZWQgZXJyb3IgY29uZGl0aW9uLCBzdWNoIGFzIGEgbWlzc2luZyBpbXBsZW1l
bnRhdGlvbiwgdW5rbm93biB3aW5kb3cgaGFuZGxlLCBhbmQgc28gZm9ydGguIFRoZSBiYWNrZW5k
IHNpZ25hbHMgb25lIG9mIHRoZXNlIGVycm9ycyBieSB1c2luZyBpdCBhcyBhIHByZWZpeCBvZiB0
aGUgY29tbWFuZHMncyBlcnJvciBtZXNzYWdlICh0aGUgZXJyb3JTdHJpbmcgYXJndW1lbnQgaW4g
Z2VuZXJhdGVkIEMrKyBiYWNrZW5kIGRpc3BhdGNoZXJzKS4gVGhpcyB3aWxsIGJlIHJlcG9ydGVk
IHRvIHRoZSBmcm9udGVuZCBhcyBhIHByb3RvY29sIGVycm9yIHdpdGggYSBKU09OLVJQQyBlcnJv
ciBjb2RlIG9mICdTZXJ2ZXJFcnJvcicuIEl0IGlzIHVwIHRvIHRoZSBmcm9udGVuZCB3aGV0aGVy
IGFuZCBob3cgdG8gZGVhbCB3aXRoIGVycm9ycy4iLAogICAgICAgICAgICAgImVudW0iOiBbCiAg
ICAgICAgICAgICAgICAgIkludGVybmFsRXJyb3IiLAorICAgICAgICAgICAgICAgICJKYXZhU2Ny
aXB0RXJyb3IiLAogICAgICAgICAgICAgICAgICJXaW5kb3dOb3RGb3VuZCIsCisgICAgICAgICAg
ICAgICAgIk5vZGVOb3RGb3VuZCIsCiAgICAgICAgICAgICAgICAgIk5vdEltcGxlbWVudGVkIgog
ICAgICAgICAgICAgXQogICAgICAgICB9LApAQCAtOTUsNiArOTcsMjAgQEAKICAgICAgICAgICAg
ICJwYXJhbWV0ZXJzIjogWwogICAgICAgICAgICAgICAgIHsgIm5hbWUiOiAiaGFuZGxlIiwgIiRy
ZWYiOiAiQnJvd3NpbmdDb250ZXh0SGFuZGxlIiwgImRlc2NyaXB0aW9uIjogIlRoZSBoYW5kbGUg
Zm9yIHRoZSBicm93c2luZyBjb250ZXh0IHRoYXQgc2hvdWxkIGJlIHJlbG9hZGVkLiIgfQogICAg
ICAgICAgICAgXQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAibmFtZSI6ICJl
dmFsdWF0ZUphdmFTY3JpcHRGdW5jdGlvbiIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAi
RXZhbHVhdGVzIGEgc2NyaXB0IGZ1bmN0aW9uIGluIGEgYnJvd3NpbmcgY29udGV4dCBhbmQgY2Fs
bHMgaXQgd2l0aCB0aGUgc3VwcGxpZWQgYXJndW1lbnRzLiIsCisgICAgICAgICAgICAicGFyYW1l
dGVycyI6IFsKKyAgICAgICAgICAgICAgICB7ICJuYW1lIjogImhhbmRsZSIsICIkcmVmIjogIkJy
b3dzaW5nQ29udGV4dEhhbmRsZSIsICJkZXNjcmlwdGlvbiI6ICJUaGUgaGFuZGxlIGZvciB0aGUg
YnJvd3NpbmcgY29udGV4dCB0aGUgc2NyaXB0IHNob3VsZCBiZSBldmFsdWF0ZWQuIiB9LAorICAg
ICAgICAgICAgICAgIHsgIm5hbWUiOiAiZnVuY3Rpb24iLCAidHlwZSI6ICJzdHJpbmciLCAiZGVz
Y3JpcHRpb24iOiAiVGhlIHNjcmlwdCB0byBldmFsdWF0ZSBpbiB0aGUgYnJvd3NpbmcgY29udGV4
dC4gSXQgbXVzdCBiZSBhIGZ1bmN0aW9uIHJlc3VsdC4iIH0sCisgICAgICAgICAgICAgICAgeyAi
bmFtZSI6ICJhcmd1bWVudHMiLCAidHlwZSI6ICJhcnJheSIsICJpdGVtcyI6IHsgInR5cGUiOiAi
c3RyaW5nIiB9LCAiZGVzY3JpcHRpb24iOiAiVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBm
dW5jdGlvbiB3aGVuIGNhbGxlZC4gVGhleSB3aWxsIGJlIHBhcnNlZCBhcyBKU09OIGJlZm9yZSBj
YWxsaW5nIHRoZSBmdW5jdGlvbi4iIH0sCisgICAgICAgICAgICAgICAgeyAibmFtZSI6ICJleHBl
Y3RzSW1wbGljaXRDYWxsYmFja0FyZ3VtZW50IiwgInR5cGUiOiAiYm9vbGVhbiIsICJkZXNjcmlw
dGlvbiI6ICJUaGUgZnVuY3Rpb24gZXhwZWN0cyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGFzIHRoZSBs
YXN0IGFyZ3VtZW50LiBJdCBpcyBleHBlY3RlZCB0byBjYWxsIHRoaXMgY2FsbGJhY2sgd2l0aCBh
IHJlc3VsdC4iIH0KKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAicmV0dXJucyI6IFsKKyAg
ICAgICAgICAgICAgICB7ICJuYW1lIjogInJlc3VsdCIsICJ0eXBlIjogInN0cmluZyIsICJkZXNj
cmlwdGlvbiI6ICJUaGUgcmVzdWx0IHJldHVybmVkIGJ5IHRoZSBjYWxsZWQgZnVuY3Rpb24uIEl0
IGlzIEpTT04gZW5jb2RlZCBhZnRlciB0aGUgZnVuY3Rpb24gcmV0dXJucyBvciBjYWxscyB0aGUg
Y2FsbGJhY2suIiB9CisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImFzeW5jIjogdHJ1ZQog
ICAgICAgICB9CiAgICAgXQogfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNz
L0F1dG9tYXRpb24vV2ViQXV0b21hdGlvblNlc3Npb24uY3BwIGIvU291cmNlL1dlYktpdDIvVUlQ
cm9jZXNzL0F1dG9tYXRpb24vV2ViQXV0b21hdGlvblNlc3Npb24uY3BwCmluZGV4IGY0MGZiMWYy
ZWE1MTQ4ZDkzZmFjMjJiOGViMTE5ZWY3YWI4MjAyN2EuLjlkMjc4MmZlNmY2MjYyOTA5ZjA5MTZk
NzdiN2Q1MmYwODMzNTEyZDQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9B
dXRvbWF0aW9uL1dlYkF1dG9tYXRpb25TZXNzaW9uLmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0Mi9V
SVByb2Nlc3MvQXV0b21hdGlvbi9XZWJBdXRvbWF0aW9uU2Vzc2lvbi5jcHAKQEAgLTI1NSw0ICsy
NTUsMzkgQEAgdm9pZCBXZWJBdXRvbWF0aW9uU2Vzc2lvbjo6cmVsb2FkQnJvd3NpbmdDb250ZXh0
KEluc3BlY3Rvcjo6RXJyb3JTdHJpbmcmIGVycm9yU3QKICAgICBwYWdlLT5yZWxvYWQocmVsb2Fk
RnJvbU9yaWdpbiwgY29udGVudEJsb2NrZXJzRW5hYmxlZCk7CiB9CiAKK3ZvaWQgV2ViQXV0b21h
dGlvblNlc3Npb246OmV2YWx1YXRlSmF2YVNjcmlwdEZ1bmN0aW9uKEluc3BlY3Rvcjo6RXJyb3JT
dHJpbmcmIGVycm9yU3RyaW5nLCBjb25zdCBTdHJpbmcmIGhhbmRsZSwgY29uc3QgU3RyaW5nJiBm
dW5jdGlvbiwgY29uc3QgSW5zcGVjdG9yOjpJbnNwZWN0b3JBcnJheSYgYXJndW1lbnRzLCBib29s
IGV4cGVjdHNJbXBsaWNpdENhbGxiYWNrQXJndW1lbnQsIFJlZjxFdmFsdWF0ZUphdmFTY3JpcHRG
dW5jdGlvbkNhbGxiYWNrPiYmIGNhbGxiYWNrKQoreworICAgIC8vIEZJWE1FIDI0MTcyNDM5OiBU
aGlzIHNob3VsZCBiZSBhIGZyYW1lIGhhbmRsZSwgbm90IGEgcGFnZSBoYW5kbGUuIENoYW5nZSB0
aGlzIG9uY2Ugd2UgaGF2ZSBmcmFtZSBzdXBwb3J0LgorICAgIFdlYlBhZ2VQcm94eSogcGFnZSA9
IHdlYlBhZ2VQcm94eUZvckhhbmRsZShoYW5kbGUpOworICAgIGlmICghcGFnZSkKKyAgICAgICAg
RkFJTF9XSVRIX1BSRURFRklORURfRVJST1JfTUVTU0FHRShXaW5kb3dOb3RGb3VuZCk7CisKKyAg
ICBWZWN0b3I8U3RyaW5nPiBhcmd1bWVudHNWZWN0b3I7CisgICAgYXJndW1lbnRzVmVjdG9yLnJl
c2VydmVDYXBhY2l0eShhcmd1bWVudHMubGVuZ3RoKCkpOworCisgICAgZm9yIChhdXRvJiBhcmd1
bWVudCA6IGFyZ3VtZW50cykgeworICAgICAgICBTdHJpbmcgYXJndW1lbnRTdHJpbmc7CisgICAg
ICAgIGFyZ3VtZW50LT5hc1N0cmluZyhhcmd1bWVudFN0cmluZyk7CisgICAgICAgIGFyZ3VtZW50
c1ZlY3Rvci5hcHBlbmQoYXJndW1lbnRTdHJpbmcpOworICAgIH0KKworICAgIHVpbnQ2NF90IGNh
bGxiYWNrSUQgPSBtX25leHRFdmFsdWF0ZUphdmFTY3JpcHRDYWxsYmFja0lEKys7CisgICAgbV9l
dmFsdWF0ZUphdmFTY3JpcHRGdW5jdGlvbkNhbGxiYWNrcy5zZXQoY2FsbGJhY2tJRCwgV1RGTW92
ZShjYWxsYmFjaykpOworCisgICAgcGFnZS0+cHJvY2VzcygpLnNlbmQoTWVzc2FnZXM6OldlYkF1
dG9tYXRpb25TZXNzaW9uUHJveHk6OkV2YWx1YXRlSmF2YVNjcmlwdEZ1bmN0aW9uKHBhZ2UtPm1h
aW5GcmFtZSgpLT5mcmFtZUlEKCksIGZ1bmN0aW9uLCBhcmd1bWVudHNWZWN0b3IsIGV4cGVjdHNJ
bXBsaWNpdENhbGxiYWNrQXJndW1lbnQsIGNhbGxiYWNrSUQpLCAwKTsKK30KKwordm9pZCBXZWJB
dXRvbWF0aW9uU2Vzc2lvbjo6ZGlkRXZhbHVhdGVKYXZhU2NyaXB0RnVuY3Rpb24odWludDY0X3Qg
Y2FsbGJhY2tJRCwgY29uc3QgU3RyaW5nJiByZXN1bHQsIGNvbnN0IFN0cmluZyYgZXJyb3JUeXBl
KQoreworICAgIGF1dG8gY2FsbGJhY2sgPSBtX2V2YWx1YXRlSmF2YVNjcmlwdEZ1bmN0aW9uQ2Fs
bGJhY2tzLnRha2UoY2FsbGJhY2tJRCk7CisgICAgaWYgKCFjYWxsYmFjaykKKyAgICAgICAgcmV0
dXJuOworCisgICAgaWYgKCFlcnJvclR5cGUuaXNFbXB0eSgpKSB7CisgICAgICAgIC8vIEZJWE1F
OiBXZSBzaG91bGQgc2VuZCBib3RoIHRoZSBlcnJvclR5cGUgYW5kIHJlc3VsdCwgc2luY2UgcmVz
dWx0IGhhcyB0aGUgc3BlY2lmaWMgZXhjZXB0aW9uIG1lc3NhZ2UuCisgICAgICAgIGNhbGxiYWNr
LT5zZW5kRmFpbHVyZShlcnJvclR5cGUpOworICAgIH0gZWxzZQorICAgICAgICBjYWxsYmFjay0+
c2VuZFN1Y2Nlc3MocmVzdWx0KTsKK30KKwogfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQXV0b21hdGlvbi9XZWJBdXRvbWF0aW9uU2Vz
c2lvbi5oIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0F1dG9tYXRpb24vV2ViQXV0b21hdGlv
blNlc3Npb24uaAppbmRleCBkYjZmYzMyY2IwMTBiNTI5NzQyODZmYmY1YTRiZDZlMTYwZDk3ZTk1
Li45YjljOTAwMDAzY2RhYTFmODZiNjcyNDM0NmIyOTg1NThiZDZhYzFkIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQXV0b21hdGlvbi9XZWJBdXRvbWF0aW9uU2Vzc2lvbi5o
CisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BdXRvbWF0aW9uL1dlYkF1dG9tYXRpb25T
ZXNzaW9uLmgKQEAgLTg5LDYgKzg5LDcgQEAgcHVibGljOgogICAgIHZvaWQgZ29CYWNrSW5Ccm93
c2luZ0NvbnRleHQoSW5zcGVjdG9yOjpFcnJvclN0cmluZyYsIGNvbnN0IFN0cmluZyYpIG92ZXJy
aWRlOwogICAgIHZvaWQgZ29Gb3J3YXJkSW5Ccm93c2luZ0NvbnRleHQoSW5zcGVjdG9yOjpFcnJv
clN0cmluZyYsIGNvbnN0IFN0cmluZyYpIG92ZXJyaWRlOwogICAgIHZvaWQgcmVsb2FkQnJvd3Np
bmdDb250ZXh0KEluc3BlY3Rvcjo6RXJyb3JTdHJpbmcmLCBjb25zdCBTdHJpbmcmKSBvdmVycmlk
ZTsKKyAgICB2b2lkIGV2YWx1YXRlSmF2YVNjcmlwdEZ1bmN0aW9uKEluc3BlY3Rvcjo6RXJyb3JT
dHJpbmcmLCBjb25zdCBTdHJpbmcmIGhhbmRsZSwgY29uc3QgU3RyaW5nJiBmdW5jdGlvbiwgY29u
c3QgSW5zcGVjdG9yOjpJbnNwZWN0b3JBcnJheSYgYXJndW1lbnRzLCBib29sIGV4cGVjdHNJbXBs
aWNpdENhbGxiYWNrQXJndW1lbnQsIFJlZjxJbnNwZWN0b3I6OkF1dG9tYXRpb25CYWNrZW5kRGlz
cGF0Y2hlckhhbmRsZXI6OkV2YWx1YXRlSmF2YVNjcmlwdEZ1bmN0aW9uQ2FsbGJhY2s+JiYpIG92
ZXJyaWRlOwogCiBwcml2YXRlOgogICAgIFdlYktpdDo6V2ViUGFnZVByb3h5KiB3ZWJQYWdlUHJv
eHlGb3JIYW5kbGUoY29uc3QgU3RyaW5nJik7CkBAIC05OCw4ICs5OSw3IEBAIHByaXZhdGU6CiAg
ICAgdm9pZCBkaWRSZWNlaXZlTWVzc2FnZShJUEM6OkNvbm5lY3Rpb24mLCBJUEM6Ok1lc3NhZ2VE
ZWNvZGVyJikgb3ZlcnJpZGU7CiAKICAgICAvLyBDYWxsZWQgYnkgV2ViQXV0b21hdGlvblNlc3Np
b24gbWVzc2FnZXMKLSAgICAvLyBGSVhNRTogQWRkIG1lc3NhZ2UgZnVuY3Rpb25zIGhlcmUuCi0g
ICAgdm9pZCB0ZXN0KCkgeyB9OworICAgIHZvaWQgZGlkRXZhbHVhdGVKYXZhU2NyaXB0RnVuY3Rp
b24odWludDY0X3QgY2FsbGJhY2tJRCwgY29uc3QgU3RyaW5nJiByZXN1bHQsIGNvbnN0IFN0cmlu
ZyYgZXJyb3JUeXBlKTsKIAogICAgIFdlYktpdDo6V2ViUHJvY2Vzc1Bvb2wqIG1fcHJvY2Vzc1Bv
b2wgeyBudWxscHRyIH07CiAgICAgc3RkOjp1bmlxdWVfcHRyPEFQSTo6QXV0b21hdGlvblNlc3Np
b25DbGllbnQ+IG1fY2xpZW50OwpAQCAtMTEyLDYgKzExMiw5IEBAIHByaXZhdGU6CiAgICAgSGFu
ZGxlV2ViUGFnZU1hcCBtX2hhbmRsZVdlYlBhZ2VNYXA7CiAgICAgU3RyaW5nIG1fYWN0aXZlQnJv
d3NpbmdDb250ZXh0SGFuZGxlOwogCisgICAgdWludDY0X3QgbV9uZXh0RXZhbHVhdGVKYXZhU2Ny
aXB0Q2FsbGJhY2tJRCB7IDEgfTsKKyAgICBIYXNoTWFwPHVpbnQ2NF90LCBSZWZQdHI8SW5zcGVj
dG9yOjpBdXRvbWF0aW9uQmFja2VuZERpc3BhdGNoZXJIYW5kbGVyOjpFdmFsdWF0ZUphdmFTY3Jp
cHRGdW5jdGlvbkNhbGxiYWNrPj4gbV9ldmFsdWF0ZUphdmFTY3JpcHRGdW5jdGlvbkNhbGxiYWNr
czsKKwogI2lmIEVOQUJMRShSRU1PVEVfSU5TUEVDVE9SKQogICAgIEluc3BlY3Rvcjo6RnJvbnRl
bmRDaGFubmVsKiBtX3JlbW90ZUNoYW5uZWwgeyBudWxscHRyIH07CiAjZW5kaWYKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BdXRvbWF0aW9uL1dlYkF1dG9tYXRpb25TZXNz
aW9uLm1lc3NhZ2VzLmluIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0F1dG9tYXRpb24vV2Vi
QXV0b21hdGlvblNlc3Npb24ubWVzc2FnZXMuaW4KaW5kZXggOTJmNzUwY2FiMGRiYTRjMGM4Nzg3
ZjMxNjdjYjdlY2Q4MDMwMjE1YS4uYjg2OGRkMGMwNmM0MmFlNmFjMjBhNzRiOGYzODVhOTFlNWM5
N2ZlNiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0F1dG9tYXRpb24vV2Vi
QXV0b21hdGlvblNlc3Npb24ubWVzc2FnZXMuaW4KKysrIGIvU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL0F1dG9tYXRpb24vV2ViQXV0b21hdGlvblNlc3Npb24ubWVzc2FnZXMuaW4KQEAgLTIxLDYg
KzIxLDUgQEAKICMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KIAogbWVzc2FnZXMgLT4gV2ViQXV0b21hdGlvblNlc3Np
b24gewotICAgIC8vIEZJWE1FOiBBZGQgbWVzc2FnZXMgaGVyZS4KLSAgICBUZXN0KCkKKyAgICBE
aWRFdmFsdWF0ZUphdmFTY3JpcHRGdW5jdGlvbih1aW50NjRfdCBjYWxsYmFja0lELCBTdHJpbmcg
cmVzdWx0LCBTdHJpbmcgZXJyb3JUeXBlKQogfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIv
V2ViUHJvY2Vzcy9BdXRvbWF0aW9uL1dlYkF1dG9tYXRpb25TZXNzaW9uUHJveHkuY3BwIGIvU291
cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9BdXRvbWF0aW9uL1dlYkF1dG9tYXRpb25TZXNzaW9uUHJv
eHkuY3BwCmluZGV4IDEyZTE1YWM2N2RlZjQ5NjBhYTIxNzYxOGJiNmYyNTE1Y2JlYWRkOGIuLmUx
ODI3NjE5NTcwOGIzYmMyODllNjcwOWQyMjM4NTYyMTM2MWVhZWMgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJLaXQyL1dlYlByb2Nlc3MvQXV0b21hdGlvbi9XZWJBdXRvbWF0aW9uU2Vzc2lvblByb3h5
LmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL0F1dG9tYXRpb24vV2ViQXV0b21h
dGlvblNlc3Npb25Qcm94eS5jcHAKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlICJjb25maWcu
aCIKICNpbmNsdWRlICJXZWJBdXRvbWF0aW9uU2Vzc2lvblByb3h5LmgiCiAKKyNpbmNsdWRlICJJ
bnNwZWN0b3JQcm90b2NvbE9iamVjdHMuaCIKICNpbmNsdWRlICJXZWJBdXRvbWF0aW9uU2Vzc2lv
bk1lc3NhZ2VzLmgiCiAjaW5jbHVkZSAiV2ViQXV0b21hdGlvblNlc3Npb25Qcm94eU1lc3NhZ2Vz
LmgiCiAjaW5jbHVkZSAiV2ViQXV0b21hdGlvblNlc3Npb25Qcm94eVNjcmlwdFNvdXJjZS5oIgpA
QCAtMzksNiArNDAsMzEgQEAKIAogbmFtZXNwYWNlIFdlYktpdCB7CiAKK3RlbXBsYXRlIDx0eXBl
bmFtZSBUPgorc3RhdGljIEpTT2JqZWN0UmVmIHRvSlNBcnJheShKU0NvbnRleHRSZWYgY29udGV4
dCwgY29uc3QgVmVjdG9yPFQ+JiBkYXRhLCBKU1ZhbHVlUmVmICgqY29udmVydGVyKShKU0NvbnRl
eHRSZWYsIGNvbnN0IFQmKSwgSlNWYWx1ZVJlZiogZXhjZXB0aW9uKQoreworICAgIEFTU0VSVF9B
UkcoY29udmVydGVyLCBjb252ZXJ0ZXIpOworCisgICAgaWYgKGRhdGEuaXNFbXB0eSgpKQorICAg
ICAgICByZXR1cm4gSlNPYmplY3RNYWtlQXJyYXkoY29udGV4dCwgMCwgbnVsbHB0ciwgZXhjZXB0
aW9uKTsKKworICAgIFZlY3RvcjxKU1ZhbHVlUmVmLCA4PiBjb252ZXJ0ZWREYXRhOworICAgIGNv
bnZlcnRlZERhdGEucmVzZXJ2ZUNhcGFjaXR5KGRhdGEuc2l6ZSgpKTsKKworICAgIGZvciAoYXV0
byYgb3JpZ2luYWxWYWx1ZSA6IGRhdGEpIHsKKyAgICAgICAgSlNWYWx1ZVJlZiBjb252ZXJ0ZWRW
YWx1ZSA9IGNvbnZlcnRlcihjb250ZXh0LCBvcmlnaW5hbFZhbHVlKTsKKyAgICAgICAgSlNWYWx1
ZVByb3RlY3QoY29udGV4dCwgY29udmVydGVkVmFsdWUpOworICAgICAgICBjb252ZXJ0ZWREYXRh
LmFwcGVuZChjb252ZXJ0ZWRWYWx1ZSk7CisgICAgfQorCisgICAgSlNPYmplY3RSZWYgYXJyYXkg
PSBKU09iamVjdE1ha2VBcnJheShjb250ZXh0LCBjb252ZXJ0ZWREYXRhLnNpemUoKSwgY29udmVy
dGVkRGF0YS5kYXRhKCksIGV4Y2VwdGlvbik7CisKKyAgICBmb3IgKGF1dG8mIGNvbnZlcnRlZFZh
bHVlIDogY29udmVydGVkRGF0YSkKKyAgICAgICAgSlNWYWx1ZVVucHJvdGVjdChjb250ZXh0LCBj
b252ZXJ0ZWRWYWx1ZSk7CisKKyAgICByZXR1cm4gYXJyYXk7Cit9CisKIHN0YXRpYyBpbmxpbmUg
SlNSZXRhaW5QdHI8SlNTdHJpbmdSZWY+IHRvSlNTdHJpbmcoY29uc3QgU3RyaW5nJiBzdHJpbmcp
CiB7CiAgICAgcmV0dXJuIEpTUmV0YWluUHRyPEpTU3RyaW5nUmVmPihBZG9wdCwgT3BhcXVlSlNT
dHJpbmc6OmNyZWF0ZShzdHJpbmcpLmxlYWtSZWYoKSk7CkBAIC00OSw2ICs3NSwxNyBAQCBzdGF0
aWMgaW5saW5lIEpTVmFsdWVSZWYgdG9KU1ZhbHVlKEpTQ29udGV4dFJlZiBjb250ZXh0LCBjb25z
dCBTdHJpbmcmIHN0cmluZykKICAgICByZXR1cm4gSlNWYWx1ZU1ha2VTdHJpbmcoY29udGV4dCwg
dG9KU1N0cmluZyhzdHJpbmcpLmdldCgpKTsKIH0KIAorc3RhdGljIGlubGluZSBKU1ZhbHVlUmVm
IGNhbGxQcm9wZXJ0eUZ1bmN0aW9uKEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBv
YmplY3QsIGNvbnN0IFN0cmluZyYgcHJvcGVydHlOYW1lLCBzaXplX3QgYXJndW1lbnRDb3VudCwg
Y29uc3QgSlNWYWx1ZVJlZiBhcmd1bWVudHNbXSwgSlNWYWx1ZVJlZiogZXhjZXB0aW9uKQorewor
ICAgIEFTU0VSVF9BUkcob2JqZWN0LCBvYmplY3QpOworICAgIEFTU0VSVF9BUkcob2JqZWN0LCBK
U1ZhbHVlSXNPYmplY3QoY29udGV4dCwgb2JqZWN0KSk7CisKKyAgICBKU09iamVjdFJlZiBldmFs
dWF0ZUphdmFTY3JpcHRGdW5jdGlvbiA9IGNvbnN0X2Nhc3Q8SlNPYmplY3RSZWY+KEpTT2JqZWN0
R2V0UHJvcGVydHkoY29udGV4dCwgb2JqZWN0LCB0b0pTU3RyaW5nKHByb3BlcnR5TmFtZSkuZ2V0
KCksIGV4Y2VwdGlvbikpOworICAgIEFTU0VSVChKU09iamVjdElzRnVuY3Rpb24oY29udGV4dCwg
ZXZhbHVhdGVKYXZhU2NyaXB0RnVuY3Rpb24pKTsKKworICAgIHJldHVybiBKU09iamVjdENhbGxB
c0Z1bmN0aW9uKGNvbnRleHQsIGV2YWx1YXRlSmF2YVNjcmlwdEZ1bmN0aW9uLCBvYmplY3QsIGFy
Z3VtZW50Q291bnQsIGFyZ3VtZW50cywgZXhjZXB0aW9uKTsKK30KKwogV2ViQXV0b21hdGlvblNl
c3Npb25Qcm94eTo6V2ViQXV0b21hdGlvblNlc3Npb25Qcm94eShjb25zdCBTdHJpbmcmIHNlc3Np
b25JZGVudGlmaWVyKQogICAgIDogbV9zZXNzaW9uSWRlbnRpZmllcihzZXNzaW9uSWRlbnRpZmll
cikKIHsKQEAgLTc3LDYgKzExNCwyNiBAQCBzdGF0aWMgSlNWYWx1ZVJlZiBjcmVhdGVVVUlEKEpT
Q29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwgSlNPYmplYwogICAgIHJl
dHVybiB0b0pTVmFsdWUoY29udGV4dCwgV2ViQ29yZTo6Y3JlYXRlQ2Fub25pY2FsVVVJRFN0cmlu
ZygpLmNvbnZlcnRUb0FTQ0lJVXBwZXJjYXNlKCkpOwogfQogCitzdGF0aWMgSlNWYWx1ZVJlZiBl
dmFsdWF0ZUphdmFTY3JpcHRDYWxsYmFjayhKU0NvbnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RS
ZWYgZnVuY3Rpb24sIEpTT2JqZWN0UmVmIHRoaXNPYmplY3QsIHNpemVfdCBhcmd1bWVudENvdW50
LCBjb25zdCBKU1ZhbHVlUmVmIGFyZ3VtZW50c1tdLCBKU1ZhbHVlUmVmKiBleGNlcHRpb24pCit7
CisgICAgQVNTRVJUX0FSRyhhcmd1bWVudENvdW50LCBhcmd1bWVudENvdW50ID09IDMpOworICAg
IEFTU0VSVF9BUkcoYXJndW1lbnRzLCBKU1ZhbHVlSXNOdW1iZXIoY29udGV4dCwgYXJndW1lbnRz
WzBdKSk7CisgICAgQVNTRVJUX0FSRyhhcmd1bWVudHMsIEpTVmFsdWVJc051bWJlcihjb250ZXh0
LCBhcmd1bWVudHNbMV0pKTsKKyAgICBBU1NFUlRfQVJHKGFyZ3VtZW50cywgSlNWYWx1ZUlzU3Ry
aW5nKGNvbnRleHQsIGFyZ3VtZW50c1syXSkpOworCisgICAgYXV0byBhdXRvbWF0aW9uU2Vzc2lv
blByb3h5ID0gV2ViUHJvY2Vzczo6c2luZ2xldG9uKCkuYXV0b21hdGlvblNlc3Npb25Qcm94eSgp
OworICAgIGlmICghYXV0b21hdGlvblNlc3Npb25Qcm94eSkKKyAgICAgICAgcmV0dXJuIEpTVmFs
dWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworCisgICAgdWludDY0X3QgZnJhbWVJRCA9IEpTVmFs
dWVUb051bWJlcihjb250ZXh0LCBhcmd1bWVudHNbMF0sIGV4Y2VwdGlvbik7CisgICAgdWludDY0
X3QgY2FsbGJhY2tJRCA9IEpTVmFsdWVUb051bWJlcihjb250ZXh0LCBhcmd1bWVudHNbMV0sIGV4
Y2VwdGlvbik7CisgICAgSlNSZXRhaW5QdHI8SlNTdHJpbmdSZWY+IHJlc3VsdChBZG9wdCwgSlNW
YWx1ZVRvU3RyaW5nQ29weShjb250ZXh0LCBhcmd1bWVudHNbMl0sIGV4Y2VwdGlvbikpOworCisg
ICAgYXV0b21hdGlvblNlc3Npb25Qcm94eS0+ZGlkRXZhbHVhdGVKYXZhU2NyaXB0RnVuY3Rpb24o
ZnJhbWVJRCwgY2FsbGJhY2tJRCwgcmVzdWx0LT5zdHJpbmcoKSwgZW1wdHlTdHJpbmcoKSk7CisK
KyAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7Cit9CisKIEpTT2JqZWN0
UmVmIFdlYkF1dG9tYXRpb25TZXNzaW9uUHJveHk6OnNjcmlwdE9iamVjdEZvckZyYW1lKFdlYkZy
YW1lJiBmcmFtZSkKIHsKICAgICBpZiAoSlNPYmplY3RSZWYgc2NyaXB0T2JqZWN0ID0gbV93ZWJG
cmFtZVNjcmlwdE9iamVjdE1hcC5nZXQoZnJhbWUuZnJhbWVJRCgpKSkKQEAgLTEwNiw4ICsxNjMs
ODAgQEAgSlNPYmplY3RSZWYgV2ViQXV0b21hdGlvblNlc3Npb25Qcm94eTo6c2NyaXB0T2JqZWN0
Rm9yRnJhbWUoV2ViRnJhbWUmIGZyYW1lKQogCiB2b2lkIFdlYkF1dG9tYXRpb25TZXNzaW9uUHJv
eHk6OmRpZENsZWFyV2luZG93T2JqZWN0Rm9yRnJhbWUoV2ViRnJhbWUmIGZyYW1lKQogewotICAg
IGlmIChKU09iamVjdFJlZiBzY3JpcHRPYmplY3QgPSBtX3dlYkZyYW1lU2NyaXB0T2JqZWN0TWFw
LnRha2UoZnJhbWUuZnJhbWVJRCgpKSkKKyAgICB1aW50NjRfdCBmcmFtZUlEID0gZnJhbWUuZnJh
bWVJRCgpOworICAgIGlmIChKU09iamVjdFJlZiBzY3JpcHRPYmplY3QgPSBtX3dlYkZyYW1lU2Ny
aXB0T2JqZWN0TWFwLnRha2UoZnJhbWVJRCkpCiAgICAgICAgIEpTVmFsdWVVbnByb3RlY3QoZnJh
bWUuanNDb250ZXh0KCksIHNjcmlwdE9iamVjdCk7CisKKyAgICBTdHJpbmcgZXJyb3JNZXNzYWdl
ID0gQVNDSUlMaXRlcmFsKCJDYWxsYmFjayB3YXMgbm90IGNhbGxlZCBiZWZvcmUgdGhlIHVubG9h
ZCBldmVudC4iKTsKKyAgICBTdHJpbmcgZXJyb3JUeXBlID0gSW5zcGVjdG9yOjpQcm90b2NvbDo6
Z2V0RW51bUNvbnN0YW50VmFsdWUoSW5zcGVjdG9yOjpQcm90b2NvbDo6QXV0b21hdGlvbjo6RXJy
b3JNZXNzYWdlOjpKYXZhU2NyaXB0RXJyb3IpOworCisgICAgYXV0byBwZW5kaW5nRnJhbWVDYWxs
YmFja3MgPSBtX3dlYkZyYW1lUGVuZGluZ0V2YWx1YXRlSmF2YVNjcmlwdENhbGxiYWNrc01hcC5n
ZXQoZnJhbWVJRCk7CisgICAgZm9yICh1aW50NjRfdCBjYWxsYmFja0lEIDogcGVuZGluZ0ZyYW1l
Q2FsbGJhY2tzKQorICAgICAgICBkaWRFdmFsdWF0ZUphdmFTY3JpcHRGdW5jdGlvbihmcmFtZUlE
LCBjYWxsYmFja0lELCBlcnJvck1lc3NhZ2UsIGVycm9yVHlwZSk7Cit9CisKK3ZvaWQgV2ViQXV0
b21hdGlvblNlc3Npb25Qcm94eTo6ZXZhbHVhdGVKYXZhU2NyaXB0RnVuY3Rpb24odWludDY0X3Qg
ZnJhbWVJRCwgY29uc3QgU3RyaW5nJiBmdW5jdGlvbiwgVmVjdG9yPFN0cmluZz4gYXJndW1lbnRz
LCBib29sIGV4cGVjdHNJbXBsaWNpdENhbGxiYWNrQXJndW1lbnQsIHVpbnQ2NF90IGNhbGxiYWNr
SUQpCit7CisgICAgV2ViRnJhbWUqIGZyYW1lID0gV2ViUHJvY2Vzczo6c2luZ2xldG9uKCkud2Vi
RnJhbWUoZnJhbWVJRCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
SlNPYmplY3RSZWYgc2NyaXB0T2JqZWN0ID0gc2NyaXB0T2JqZWN0Rm9yRnJhbWUoKmZyYW1lKTsK
KyAgICBpZiAoIXNjcmlwdE9iamVjdCkKKyAgICAgICAgcmV0dXJuOworCisgICAgSlNWYWx1ZVJl
ZiBleGNlcHRpb24gPSBudWxscHRyOworICAgIEpTR2xvYmFsQ29udGV4dFJlZiBjb250ZXh0ID0g
ZnJhbWUtPmpzQ29udGV4dCgpOworCisgICAgSlNPYmplY3RSZWYgY2FsbGJhY2tGdW5jdGlvbiA9
IEpTT2JqZWN0TWFrZUZ1bmN0aW9uV2l0aENhbGxiYWNrKGNvbnRleHQsIG51bGxwdHIsIGV2YWx1
YXRlSmF2YVNjcmlwdENhbGxiYWNrKTsKKworICAgIGlmIChleHBlY3RzSW1wbGljaXRDYWxsYmFj
a0FyZ3VtZW50KSB7CisgICAgICAgIGF1dG8gcmVzdWx0ID0gbV93ZWJGcmFtZVBlbmRpbmdFdmFs
dWF0ZUphdmFTY3JpcHRDYWxsYmFja3NNYXAuYWRkKGZyYW1lSUQsIFZlY3Rvcjx1aW50NjRfdD4o
KSk7CisgICAgICAgIHJlc3VsdC5pdGVyYXRvci0+dmFsdWUuYXBwZW5kKGNhbGxiYWNrSUQpOwor
ICAgIH0KKworICAgIEpTVmFsdWVSZWYgZnVuY3Rpb25Bcmd1bWVudHNbXSA9IHsKKyAgICAgICAg
dG9KU1ZhbHVlKGNvbnRleHQsIGZ1bmN0aW9uKSwKKyAgICAgICAgdG9KU0FycmF5KGNvbnRleHQs
IGFyZ3VtZW50cywgdG9KU1ZhbHVlLCAmZXhjZXB0aW9uKSwKKyAgICAgICAgSlNWYWx1ZU1ha2VC
b29sZWFuKGNvbnRleHQsIGV4cGVjdHNJbXBsaWNpdENhbGxiYWNrQXJndW1lbnQpLAorICAgICAg
ICBKU1ZhbHVlTWFrZU51bWJlcihjb250ZXh0LCBmcmFtZUlEKSwKKyAgICAgICAgSlNWYWx1ZU1h
a2VOdW1iZXIoY29udGV4dCwgY2FsbGJhY2tJRCksCisgICAgICAgIGNhbGxiYWNrRnVuY3Rpb24K
KyAgICB9OworCisgICAgY2FsbFByb3BlcnR5RnVuY3Rpb24oY29udGV4dCwgc2NyaXB0T2JqZWN0
LCBBU0NJSUxpdGVyYWwoImV2YWx1YXRlSmF2YVNjcmlwdEZ1bmN0aW9uIiksIFdURl9BUlJBWV9M
RU5HVEgoZnVuY3Rpb25Bcmd1bWVudHMpLCBmdW5jdGlvbkFyZ3VtZW50cywgJmV4Y2VwdGlvbik7
CisKKyAgICBpZiAoIWV4Y2VwdGlvbikKKyAgICAgICAgcmV0dXJuOworCisgICAgU3RyaW5nIGVy
cm9yVHlwZSA9IEluc3BlY3Rvcjo6UHJvdG9jb2w6OmdldEVudW1Db25zdGFudFZhbHVlKEluc3Bl
Y3Rvcjo6UHJvdG9jb2w6OkF1dG9tYXRpb246OkVycm9yTWVzc2FnZTo6SmF2YVNjcmlwdEVycm9y
KTsKKworICAgIEpTUmV0YWluUHRyPEpTU3RyaW5nUmVmPiBleGNlcHRpb25NZXNzYWdlOworICAg
IGlmIChKU1ZhbHVlSXNPYmplY3QoY29udGV4dCwgZXhjZXB0aW9uKSkgeworICAgICAgICBKU1Zh
bHVlUmVmIG5hbWVWYWx1ZSA9IEpTT2JqZWN0R2V0UHJvcGVydHkoY29udGV4dCwgY29uc3RfY2Fz
dDxKU09iamVjdFJlZj4oZXhjZXB0aW9uKSwgdG9KU1N0cmluZyhBU0NJSUxpdGVyYWwoIm5hbWUi
KSkuZ2V0KCksIG51bGxwdHIpOworICAgICAgICBKU1JldGFpblB0cjxKU1N0cmluZ1JlZj4gZXhj
ZXB0aW9uTmFtZShBZG9wdCwgSlNWYWx1ZVRvU3RyaW5nQ29weShjb250ZXh0LCBuYW1lVmFsdWUs
IG51bGxwdHIpKTsKKyAgICAgICAgaWYgKGV4Y2VwdGlvbk5hbWUtPnN0cmluZygpID09ICJOb2Rl
Tm90Rm91bmQiKQorICAgICAgICAgICAgZXJyb3JUeXBlID0gSW5zcGVjdG9yOjpQcm90b2NvbDo6
Z2V0RW51bUNvbnN0YW50VmFsdWUoSW5zcGVjdG9yOjpQcm90b2NvbDo6QXV0b21hdGlvbjo6RXJy
b3JNZXNzYWdlOjpOb2RlTm90Rm91bmQpOworCisgICAgICAgIEpTVmFsdWVSZWYgbWVzc2FnZVZh
bHVlID0gSlNPYmplY3RHZXRQcm9wZXJ0eShjb250ZXh0LCBjb25zdF9jYXN0PEpTT2JqZWN0UmVm
PihleGNlcHRpb24pLCB0b0pTU3RyaW5nKEFTQ0lJTGl0ZXJhbCgibWVzc2FnZSIpKS5nZXQoKSwg
bnVsbHB0cik7CisgICAgICAgIGV4Y2VwdGlvbk1lc3NhZ2UuYWRvcHQoSlNWYWx1ZVRvU3RyaW5n
Q29weShjb250ZXh0LCBtZXNzYWdlVmFsdWUsIG51bGxwdHIpKTsKKyAgICB9IGVsc2UKKyAgICAg
ICAgZXhjZXB0aW9uTWVzc2FnZS5hZG9wdChKU1ZhbHVlVG9TdHJpbmdDb3B5KGNvbnRleHQsIGV4
Y2VwdGlvbiwgbnVsbHB0cikpOworCisgICAgZGlkRXZhbHVhdGVKYXZhU2NyaXB0RnVuY3Rpb24o
ZnJhbWVJRCwgY2FsbGJhY2tJRCwgZXhjZXB0aW9uTWVzc2FnZS0+c3RyaW5nKCksIGVycm9yVHlw
ZSk7Cit9CisKK3ZvaWQgV2ViQXV0b21hdGlvblNlc3Npb25Qcm94eTo6ZGlkRXZhbHVhdGVKYXZh
U2NyaXB0RnVuY3Rpb24odWludDY0X3QgZnJhbWVJRCwgdWludDY0X3QgY2FsbGJhY2tJRCwgY29u
c3QgU3RyaW5nJiByZXN1bHQsIGNvbnN0IFN0cmluZyYgZXJyb3JUeXBlKQoreworICAgIGF1dG8g
cGVuZGluZ0ZyYW1lQ2FsbGJhY2tzID0gbV93ZWJGcmFtZVBlbmRpbmdFdmFsdWF0ZUphdmFTY3Jp
cHRDYWxsYmFja3NNYXAuZ2V0KGZyYW1lSUQpOworICAgIHBlbmRpbmdGcmFtZUNhbGxiYWNrcy5y
ZW1vdmVBbGwoY2FsbGJhY2tJRCk7CisKKyAgICBpZiAoIXBlbmRpbmdGcmFtZUNhbGxiYWNrcy5p
c0VtcHR5KCkpCisgICAgICAgIG1fd2ViRnJhbWVQZW5kaW5nRXZhbHVhdGVKYXZhU2NyaXB0Q2Fs
bGJhY2tzTWFwLnNldChmcmFtZUlELCBwZW5kaW5nRnJhbWVDYWxsYmFja3MpOworICAgIGVsc2UK
KyAgICAgICAgbV93ZWJGcmFtZVBlbmRpbmdFdmFsdWF0ZUphdmFTY3JpcHRDYWxsYmFja3NNYXAu
cmVtb3ZlKGZyYW1lSUQpOworCisgICAgV2ViUHJvY2Vzczo6c2luZ2xldG9uKCkucGFyZW50UHJv
Y2Vzc0Nvbm5lY3Rpb24oKS0+c2VuZChNZXNzYWdlczo6V2ViQXV0b21hdGlvblNlc3Npb246OkRp
ZEV2YWx1YXRlSmF2YVNjcmlwdEZ1bmN0aW9uKGNhbGxiYWNrSUQsIHJlc3VsdCwgZXJyb3JUeXBl
KSwgMCk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YktpdDIvV2ViUHJvY2Vzcy9BdXRvbWF0aW9uL1dlYkF1dG9tYXRpb25TZXNzaW9uUHJveHkuaCBi
L1NvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvQXV0b21hdGlvbi9XZWJBdXRvbWF0aW9uU2Vzc2lv
blByb3h5LmgKaW5kZXggZDFjYmZlYTQ3ODlkZmZkOWFiNTdjNGM1ZTA0ZjliZjU3MWRjNGJmYS4u
OTU3ZGRlNDllN2I5OWYxZWQ1Y2UyMTk1MTQ4ZWJlODZkMDIyMjE0MCAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9BdXRvbWF0aW9uL1dlYkF1dG9tYXRpb25TZXNzaW9uUHJv
eHkuaAorKysgYi9Tb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL0F1dG9tYXRpb24vV2ViQXV0b21h
dGlvblNlc3Npb25Qcm94eS5oCkBAIC00Myw2ICs0Myw4IEBAIHB1YmxpYzoKIAogICAgIHZvaWQg
ZGlkQ2xlYXJXaW5kb3dPYmplY3RGb3JGcmFtZShXZWJGcmFtZSYpOwogCisgICAgdm9pZCBkaWRF
dmFsdWF0ZUphdmFTY3JpcHRGdW5jdGlvbih1aW50NjRfdCBmcmFtZUlELCB1aW50NjRfdCBjYWxs
YmFja0lELCBjb25zdCBTdHJpbmcmIHJlc3VsdCwgY29uc3QgU3RyaW5nJiBlcnJvclR5cGUpOwor
CiBwcml2YXRlOgogICAgIEpTT2JqZWN0UmVmIHNjcmlwdE9iamVjdEZvckZyYW1lKFdlYkZyYW1l
Jik7CiAKQEAgLTUwLDEzICs1MiwxMiBAQCBwcml2YXRlOgogICAgIHZvaWQgZGlkUmVjZWl2ZU1l
c3NhZ2UoSVBDOjpDb25uZWN0aW9uJiwgSVBDOjpNZXNzYWdlRGVjb2RlciYpOwogCiAgICAgLy8g
Q2FsbGVkIGJ5IFdlYkF1dG9tYXRpb25TZXNzaW9uUHJveHkgbWVzc2FnZXMKLSAgICAvLyBGSVhN
RTogQWRkIG1lc3NhZ2UgZnVuY3Rpb25zIGhlcmUuCi0gICAgdm9pZCB0ZXN0KCkgeyB9OworICAg
IHZvaWQgZXZhbHVhdGVKYXZhU2NyaXB0RnVuY3Rpb24odWludDY0X3QgZnJhbWVJRCwgY29uc3Qg
U3RyaW5nJiBmdW5jdGlvbiwgVmVjdG9yPFN0cmluZz4gYXJndW1lbnRzLCBib29sIGV4cGVjdHNJ
bXBsaWNpdENhbGxiYWNrQXJndW1lbnQsIHVpbnQ2NF90IGNhbGxiYWNrSUQpOwogCiAgICAgU3Ry
aW5nIG1fc2Vzc2lvbklkZW50aWZpZXI7CiAKLSAgICB0eXBlZGVmIEhhc2hNYXA8dWludDY0X3Qs
IEpTT2JqZWN0UmVmPiBXZWJGcmFtZVNjcmlwdE9iamVjdE1hcDsKLSAgICBXZWJGcmFtZVNjcmlw
dE9iamVjdE1hcCBtX3dlYkZyYW1lU2NyaXB0T2JqZWN0TWFwOworICAgIEhhc2hNYXA8dWludDY0
X3QsIEpTT2JqZWN0UmVmPiBtX3dlYkZyYW1lU2NyaXB0T2JqZWN0TWFwOworICAgIEhhc2hNYXA8
dWludDY0X3QsIFZlY3Rvcjx1aW50NjRfdD4+IG1fd2ViRnJhbWVQZW5kaW5nRXZhbHVhdGVKYXZh
U2NyaXB0Q2FsbGJhY2tzTWFwOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL0F1dG9tYXRpb24vV2ViQXV0b21hdGlvblNl
c3Npb25Qcm94eS5qcyBiL1NvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvQXV0b21hdGlvbi9XZWJB
dXRvbWF0aW9uU2Vzc2lvblByb3h5LmpzCmluZGV4IDBjNDJmMzJiN2UyMTNkMmFjMWM1MjgyM2Fk
OWE2MjQ3MDJjZmYzYzUuLjVkZDcwZmEzZGJiOTk2YjAzMmZkMGEwNjAzZjUwN2NjZjlmYjJmNjQg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvQXV0b21hdGlvbi9XZWJBdXRv
bWF0aW9uU2Vzc2lvblByb3h5LmpzCisrKyBiL1NvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvQXV0
b21hdGlvbi9XZWJBdXRvbWF0aW9uU2Vzc2lvblByb3h5LmpzCkBAIC0zMCwxMSArMzAsODcgQEAK
IC8vIFByb3RlY3QgYWdhaW5zdCBPYmplY3Qgb3ZlcndyaXR0ZW4gYnkgdGhlIHBhZ2UuCiBsZXQg
T2JqZWN0ID0ge30uY29uc3RydWN0b3I7CiAKK2NvbnN0IHNlc3Npb25Ob2RlUHJvcGVydHlOYW1l
ID0gInNlc3Npb24tbm9kZS0iICsgc2Vzc2lvbklkZW50aWZpZXI7CisKIGxldCBBdXRvbWF0aW9u
U2Vzc2lvblByb3h5ID0gY2xhc3MgQXV0b21hdGlvblNlc3Npb25Qcm94eQogeworICAgIGNvbnN0
cnVjdG9yKCkKKyAgICB7CisgICAgICAgIHRoaXMuX25vZGVUb0lkTWFwID0gbmV3IE1hcDsKKyAg
ICAgICAgdGhpcy5faWRUb05vZGVNYXAgPSBuZXcgTWFwOworICAgIH0KKwogICAgIC8vIFB1Ymxp
YwogCi0gICAgLy8gRklYTUU6IEFkZCBmdW5jdGlvbnMgaGVyZS4KKyAgICBldmFsdWF0ZUphdmFT
Y3JpcHRGdW5jdGlvbihmdW5jdGlvblN0cmluZywgYXJndW1lbnRTdHJpbmdzLCBleHBlY3RzSW1w
bGljaXRDYWxsYmFja0FyZ3VtZW50LCBmcmFtZUlELCBjYWxsYmFja0lELCByZXN1bHRDYWxsYmFj
aykKKyAgICB7CisgICAgICAgIC8vIFRoZSBzY3JpcHQgaXMgZXhwZWN0ZWQgdG8gYmUgYSBmdW5j
dGlvbiBkZWNsYXJhdGlvbi4gRXZhbHVhdGUgaXQgaW5zaWRlIHBhcmVudGhlc2lzIHRvIGdldCB0
aGUgZnVuY3Rpb24gdmFsdWUuCisgICAgICAgIGxldCBmdW5jdGlvblZhbHVlID0gZXZhbHVhdGUo
IigiICsgZnVuY3Rpb25TdHJpbmcgKyAiKSIpOworICAgICAgICBpZiAodHlwZW9mIGZ1bmN0aW9u
VmFsdWUgIT09ICJmdW5jdGlvbiIpCisgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJT
Y3JpcHQgZGlkIG5vdCBldmFsdWF0ZSB0byBhIGZ1bmN0aW9uLiIpOworCisgICAgICAgIGxldCBh
cmd1bWVudFZhbHVlcyA9IGFyZ3VtZW50U3RyaW5ncy5tYXAodGhpcy5fanNvblBhcnNlLCB0aGlz
KTsKKyAgICAgICAgbGV0IGNhbGxiYWNrID0gKHJlc3VsdCkgPT4gcmVzdWx0Q2FsbGJhY2soZnJh
bWVJRCwgY2FsbGJhY2tJRCwgdGhpcy5fanNvblN0cmluZ2lmeShyZXN1bHQpKTsKKworICAgICAg
ICBpZiAoZXhwZWN0c0ltcGxpY2l0Q2FsbGJhY2tBcmd1bWVudCkgeworICAgICAgICAgICAgYXJn
dW1lbnRWYWx1ZXMucHVzaChjYWxsYmFjayk7CisgICAgICAgICAgICBmdW5jdGlvblZhbHVlLmFw
cGx5KG51bGwsIGFyZ3VtZW50VmFsdWVzKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBj
YWxsYmFjayhmdW5jdGlvblZhbHVlLmFwcGx5KG51bGwsIGFyZ3VtZW50VmFsdWVzKSk7CisgICAg
fQorCisgICAgLy8gUHJpdmF0ZQorCisgICAgX2pzb25QYXJzZShzdHJpbmcpCisgICAgeworICAg
ICAgICByZXR1cm4gSlNPTi5wYXJzZShzdHJpbmcsIChrZXksIHZhbHVlKSA9PiB0aGlzLl9yZXZp
dmVKU09OVmFsdWUoa2V5LCB2YWx1ZSkpOworICAgIH0KKworICAgIF9qc29uU3RyaW5naWZ5KG9y
aWdpbmFsKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9yaWdpbmFsLCAo
a2V5LCB2YWx1ZSkgPT4gdGhpcy5fcmVwbGFjZUpTT05WYWx1ZShrZXksIHZhbHVlKSk7CisgICAg
fQorCisgICAgX3Jldml2ZUpTT05WYWx1ZShrZXksIHZhbHVlKQorICAgIHsKKyAgICAgICAgaWYg
KHZhbHVlW3Nlc3Npb25Ob2RlUHJvcGVydHlOYW1lXSkKKyAgICAgICAgICAgIHJldHVybiB0aGlz
Ll9ub2RlRm9ySWRlbnRpZmllcih2YWx1ZVtzZXNzaW9uTm9kZVByb3BlcnR5TmFtZV0pOworICAg
ICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgX3JlcGxhY2VKU09OVmFsdWUoa2V5LCB2
YWx1ZSkKKyAgICB7CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5vZGUpCisgICAgICAg
ICAgICByZXR1cm4gdGhpcy5fY3JlYXRlTm9kZUhhbmRsZSh0aGlzLl9pZGVudGlmaWVyRm9yTm9k
ZSh2YWx1ZSkpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgX2NyZWF0ZU5v
ZGVIYW5kbGUoaWRlbnRpZmllcikKKyAgICB7CisgICAgICAgIHJldHVybiB7W3Nlc3Npb25Ob2Rl
UHJvcGVydHlOYW1lXTogaWRlbnRpZmllcn07CisgICAgfQorCisgICAgX25vZGVGb3JJZGVudGlm
aWVyKGlkZW50aWZpZXIpCisgICAgeworICAgICAgICBsZXQgbm9kZSA9IHRoaXMuX2lkVG9Ob2Rl
TWFwLmdldChpZGVudGlmaWVyKTsKKyAgICAgICAgaWYgKG5vZGUpCisgICAgICAgICAgICByZXR1
cm4gbm9kZTsKKyAgICAgICAgdGhyb3cge25hbWU6ICJOb2RlTm90Rm91bmQiLCBtZXNzYWdlOiAi
Tm9kZSB3aXRoIGlkZW50aWZpZXIgJyIgKyBpZGVudGlmaWVyICsgIicgd2FzIG5vdCBmb3VuZCJ9
OworICAgIH0KKworICAgIF9pZGVudGlmaWVyRm9yTm9kZShub2RlKQorICAgIHsKKyAgICAgICAg
bGV0IGlkZW50aWZpZXIgPSB0aGlzLl9ub2RlVG9JZE1hcC5nZXQobm9kZSk7CisgICAgICAgIGlm
IChpZGVudGlmaWVyKQorICAgICAgICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CisKKyAgICAgICAg
aWRlbnRpZmllciA9ICJub2RlLSIgKyBjcmVhdGVVVUlEKCk7CisKKyAgICAgICAgdGhpcy5fbm9k
ZVRvSWRNYXAuc2V0KG5vZGUsIGlkZW50aWZpZXIpOworICAgICAgICB0aGlzLl9pZFRvTm9kZU1h
cC5zZXQoaWRlbnRpZmllciwgbm9kZSk7CisKKyAgICAgICAgcmV0dXJuIGlkZW50aWZpZXI7Cisg
ICAgfQogfTsKIAogcmV0dXJuIG5ldyBBdXRvbWF0aW9uU2Vzc2lvblByb3h5OwpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9BdXRvbWF0aW9uL1dlYkF1dG9tYXRpb25TZXNz
aW9uUHJveHkubWVzc2FnZXMuaW4gYi9Tb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL0F1dG9tYXRp
b24vV2ViQXV0b21hdGlvblNlc3Npb25Qcm94eS5tZXNzYWdlcy5pbgppbmRleCA0ZTNjOGNjYmJi
YTNkMzE0ZDBhOGM5ZGRlYmY4NDM5NWE2YjVlNWNmLi4xZDBmOGFmZmM2OGM4N2VhYmY4NzJiNWUx
MjExZmYzMzY1Nzc3MTA3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL0F1
dG9tYXRpb24vV2ViQXV0b21hdGlvblNlc3Npb25Qcm94eS5tZXNzYWdlcy5pbgorKysgYi9Tb3Vy
Y2UvV2ViS2l0Mi9XZWJQcm9jZXNzL0F1dG9tYXRpb24vV2ViQXV0b21hdGlvblNlc3Npb25Qcm94
eS5tZXNzYWdlcy5pbgpAQCAtMjEsNiArMjEsNSBAQAogIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogCiBtZXNzYWdl
cyAtPiBXZWJBdXRvbWF0aW9uU2Vzc2lvblByb3h5IHsKLSAgICAvLyBGSVhNRTogQWRkIG1lc3Nh
Z2VzIGhlcmUuCi0gICAgVGVzdCgpCisgICAgRXZhbHVhdGVKYXZhU2NyaXB0RnVuY3Rpb24odWlu
dDY0X3QgZnJhbWUsIFN0cmluZyBmdW5jdGlvbiwgVmVjdG9yPFN0cmluZz4gYXJndW1lbnRzLCBi
b29sIGV4cGVjdHNJbXBsaWNpdENhbGxiYWNrQXJndW1lbnQsIHVpbnQ2NF90IGNhbGxiYWNrSUQp
CiB9Cg==
</data>
<flag name="review"
          id="298770"
          type_id="1"
          status="+"
          setter="joepeck"
    />
    <flag name="commit-queue"
          id="298771"
          type_id="3"
          status="-"
          setter="timothy"
    />
          </attachment>
      

    </bug>

</bugzilla>