<?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>33001</bug_id>
          
          <creation_ts>2009-12-28 15:44:57 -0800</creation_ts>
          <short_desc>Web Inspector: Migrate to canvas-based text viewer / editor that scales.</short_desc>
          <delta_ts>2010-01-07 13:38:37 -0800</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 (Deprecated)</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc>http://repenaxa.com/editor/editor.html</bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Pavel Feldman">pfeldman</reporter>
          <assigned_to name="Pavel Feldman">pfeldman</assigned_to>
          <cc>bweinstein</cc>
    
    <cc>dbates</cc>
    
    <cc>eric</cc>
    
    <cc>joepeck</cc>
    
    <cc>keishi</cc>
    
    <cc>mjs</cc>
    
    <cc>rik</cc>
    
    <cc>timothy</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>175327</commentid>
    <comment_count>0</comment_count>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2009-12-28 15:44:57 -0800</bug_when>
    <thetext>I started experimenting with the canvas-based viewers / editors and ended up writing my own :) I took about two days to bring it to the following state:
http://repenaxa.com/editor/editor.html

- Simple (~800 lines of code so far)
- Feels snappy
- Scales
- It highlights in a fairly optimal way (by the regex modulus)
- Supports clipboard

Todo:
- Editor does not track view size (canvas is set its container&apos;s client width/height without being updated on resize). Hit refresh to fix :)
- Lacks lots of keyboard actions

I am now gathering your feedback. I think it is a way to go (at least for the viewers). But if you like an idea of having a simple and lightweight editor in inspector, I am all for pulling it all in. Source code available upon request.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>175364</commentid>
    <comment_count>1</comment_count>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2009-12-28 18:32:52 -0800</bug_when>
    <thetext>Very impressive!!

Two passing nit-picks.

The insertion caret is 2px wide, should be 1px.

THe text selection should fill the whole line width when the whole line is selected and is in the middle of a selection spanning multiple lines. If that dosen&apos;t make sense just look at what WebKit does normally.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>175365</commentid>
    <comment_count>2</comment_count>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2009-12-28 18:34:22 -0800</bug_when>
    <thetext>The caret should not be visible when there is a range selection.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>175523</commentid>
    <comment_count>3</comment_count>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2009-12-29 05:54:16 -0800</bug_when>
    <thetext>Yah, I thought this was awesome! I really like how snappy it is. Very cool stuff =)

I had a few whitespace battles:
  - tab key doesn&apos;t work
  - newline should auto-indent?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>175662</commentid>
    <comment_count>4</comment_count>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2009-12-29 11:42:56 -0800</bug_when>
    <thetext>(In reply to comment #1)
&gt; Very impressive!!
&gt; 
&gt; Two passing nit-picks.
&gt; 
&gt; The insertion caret is 2px wide, should be 1px.
&gt; 

Done.

&gt; THe text selection should fill the whole line width when the whole line is
&gt; selected and is in the middle of a selection spanning multiple lines. If that
&gt; dosen&apos;t make sense just look at what WebKit does normally.

Done.

================
(In reply to comment #2)
&gt; The caret should not be visible when there is a range selection.

I don&apos;t think so. In general, IDEs show it. Rationale: where does selection grow upon Shift + Right when there is a range selected?

================
(In reply to comment #3)
&gt; Yah, I thought this was awesome! I really like how snappy it is. Very cool
&gt; stuff =)
&gt; 
&gt; I had a few whitespace battles:
&gt;   - tab key doesn&apos;t work
&gt;   - newline should auto-indent?

Oh. I&apos;ve just nailed down alt + cmd + shift + arrows combinations. Tabs and indent are more of language-specific...


Should I put up a change for review?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>175673</commentid>
    <comment_count>5</comment_count>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2009-12-29 11:53:09 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; (In reply to comment #1)
&gt; &gt; The caret should not be visible when there is a range selection.
&gt; 
&gt; I don&apos;t think so. In general, IDEs show it. Rationale: where does selection
&gt; grow upon Shift + Right when there is a range selected?

No editors/IDEs I have used show the caret.

Xcode - no.
TextMate - no.
SubEthaEdit - no.
TextEdit - no.
Eclipse - yes?

The selection extension problem has been lived with in many editors that don&apos;t show it.

We should strive to make it feel like WebKit&apos;s editing as much as possible. Or make it a setting?

&gt; Should I put up a change for review?

Sure.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>175921</commentid>
    <comment_count>6</comment_count>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2009-12-30 07:32:29 -0800</bug_when>
    <thetext>Looking better and better. You seem to be blitzing through feature requests, so I&apos;ll be happy to add some more!

Feature Requests:

  -⌘↑ and ⌘↓ or Home / End to move to the top and bottom of a document.
  - Tab works now, but it should be more then 1 space!
  - Line Numbers? There is a little space on the edge.

Minor Bugs:

  - When selecting a line, with ⌘←, then pushing ← should leave the cursor where it is, not actually go left to the previous line. ⌥← does this correctly.
  - Select All ⌘A then push ← leaves a small &quot;selection&quot; on the bottom left.

Keep up the great work. I look forward to seeing a patch =).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>175952</commentid>
    <comment_count>7</comment_count>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2009-12-30 09:42:47 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; Looking better and better. You seem to be blitzing through feature requests, so
&gt; I&apos;ll be happy to add some more!
&gt; 
&gt; Feature Requests:
&gt; 
&gt;   -⌘↑ and ⌘↓ or Home / End to move to the top and bottom of a document.

Done, as well as PageUp/Down, Ctrl Up/Down

&gt;   - Tab works now, but it should be more then 1 space!

Present text model is very simple - one character in source line is one glyph on screen. Tab complicatens it, so leaving for latter.

&gt;   - Line Numbers? There is a little space on the edge.
&gt; 

Done.

&gt; Minor Bugs:
&gt; 
&gt;   - When selecting a line, with ⌘←, then pushing ← should leave the cursor
&gt; where it is, not actually go left to the previous line. ⌥← does this correctly.

Done.

&gt;   - Select All ⌘A then push ← leaves a small &quot;selection&quot; on the bottom left.
&gt; 

Could not repro this one. Could be obsolete.

&gt; Keep up the great work. I look forward to seeing a patch =).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>175996</commentid>
    <comment_count>8</comment_count>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2009-12-30 11:50:32 -0800</bug_when>
    <thetext>The longest line, line 80, is cut off by the scrollbar (hides some characters under the scrollbar).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>176181</commentid>
    <comment_count>9</comment_count>
      <attachid>45708</attachid>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2009-12-31 06:51:54 -0800</bug_when>
    <thetext>Created attachment 45708
[PATCH] Meet the editor</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>176182</commentid>
    <comment_count>10</comment_count>
      <attachid>45709</attachid>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2009-12-31 06:53:15 -0800</bug_when>
    <thetext>Created attachment 45709
[File] Standalone editor runner for quick testing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>176184</commentid>
    <comment_count>11</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2009-12-31 07:00:49 -0800</bug_when>
    <thetext>style-queue ran check-webkit-style on attachment 45708 without any errors.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>177017</commentid>
    <comment_count>12</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2010-01-04 21:20:47 -0800</bug_when>
    <thetext>Very cool.

Two possible enhancements:

1) Allow double clicking on a word to select it (like in TextEdit).
2) Allow a closed selection to be extended. That is, suppose a selection has been made that starts at point (x_0, y_0). Then hold down the shift key and click on some other place (x_1, y_1) in the document to extend the existing selection up to the point (x_1, y_1). Notice, the closer the point (x_1, y_1) to the point (x_0, y_0), the smaller the existing selection becomes. Also, we could make this work for &quot;dragged&quot; selections. That is, make an existing selection then, holding down the shift key, click and drag to extend/reduce the existing selection.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>177019</commentid>
    <comment_count>13</comment_count>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2010-01-04 21:29:58 -0800</bug_when>
    <thetext>Another nice feature that I enjoy in Xcode is the flashing of the matching brace/parenthesis/bracket when you arrow past the other one. Also double clicking them select the contents between the two.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>177087</commentid>
    <comment_count>14</comment_count>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2010-01-05 01:25:39 -0800</bug_when>
    <thetext>(In reply to comment #12)
&gt; Very cool.
&gt; 
&gt; Two possible enhancements:
&gt; 
&gt; 1) Allow double clicking on a word to select it (like in TextEdit).

This was working, but regressed while I was renaming stuff for the patch. Fixed now.
 
&gt; 2) Allow a closed selection to be extended. That is, suppose a selection has
&gt; been made that starts at point (x_0, y_0). Then hold down the shift key and
&gt; click on some other place (x_1, y_1) in the document to extend the existing
&gt; selection up to the point (x_1, y_1). Notice, the closer the point (x_1, y_1)
&gt; to the point (x_0, y_0), the smaller the existing selection becomes. Also, we
&gt; could make this work for &quot;dragged&quot; selections. That is, make an existing
&gt; selection then, holding down the shift key, click and drag to extend/reduce the
&gt; existing selection.

Fixed. This was a one line change in fact:

was:
this._setCaretLocation(location.line, location.column);

now:
if (e.shiftKey)
        this._setSelectionEnd(location.line, location.column);
else
        this._setCaretLocation(location.line, location.column);

Check out http://repenaxa.com/editor/editor.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>177088</commentid>
    <comment_count>15</comment_count>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2010-01-05 01:30:25 -0800</bug_when>
    <thetext>(In reply to comment #13)
&gt; Another nice feature that I enjoy in Xcode is the flashing of the matching
&gt; brace/parenthesis/bracket when you arrow past the other one. Also double
&gt; clicking them select the contents between the two.

We&apos;ll get there. I was trying to improve highlighter speed via switching from regex to a lexer. That would also solve a whole class of problems such as matching brace, indent in code block, etc.

But it seems like all lexers are hand-written for java/ecmascript. I found couple of parser generators with JavaScript target, but no good grammars for them.  I&apos;ll spend some more time looking at ANTLRv3&apos;s ECMAScript one anyways.

Bespin is using simple hand-written lexer that makes it much faster than us. But it is really poor - no support for multiline tokens such as strings / regexes, etc.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>177257</commentid>
    <comment_count>16</comment_count>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2010-01-05 11:22:40 -0800</bug_when>
    <thetext>I have been thinking about this more.

I love how the viewing is super fast and performs well compared to the DOM. Though there are things we miss when using canvas that I think are big.

When viewing:
* All the native text related context menu options. Some can be emulated. Others can&apos;t, like text-to-speach, spotlight, look up in dictionary and Snow Leopard&apos;s text services.

When editing:
* All the &quot;for free&quot; platform native text behaviors, substitutions and transformations in Snow Leopard. Some we could emulate, others we couldn&apos;t without excesive cost.
* Spelling and grammer checking also for free normally.

This makes me wonder if a hybrid editor would be feasable. One that uses a DOM for the portion that is being edited and uses the native WebKit editing support. While just viewing uses the canvas.

Also text selection while viewing could use the DOM to invoke native context menu items. Or add a way to invoke the native text context menu from JS with a canvas backed by text data.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>177259</commentid>
    <comment_count>17</comment_count>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2010-01-05 11:25:35 -0800</bug_when>
    <thetext>Note: not all the native behaviors and context menu items are desired in an IDE editor, but I do find that I use some of them (like spell checking and dictionary) a lot when coding in Xcode.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>177297</commentid>
    <comment_count>18</comment_count>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2010-01-05 12:21:18 -0800</bug_when>
    <thetext>(In reply to comment #16)

I started with a kind of hybrid approach where I tried to have two layers: invisible text input that has focus and canvas that renders contents nicely. It did not work well for multiple reasons, primarily key handling. Highlighting text both with canvas and divs is double-work, so I&apos;d like avoid it as I can.

There were two reasons I started this:
1) To make viewer scale
2) To allow limited in place editing that would not make developer sick.

I did not think that spell checker was such an important feature given the overall goal. This thing will never (not anywhere soon) be an editor for daily programming.

So I&apos;d focus on a viewing perspective first. As you point out, this change introduces regressions:
- No web search
- No spotlight search
- No dictionary lookup
- No text to speech.

I think losing all but the last one is fine. Last one is tough due to its accessibility nature. Are you ready to lose it?

There are also few hacks we could use. The way custom popup is implemented, it can be tweaked to leave text view / text edit actions in place. Upon context menu toggle, we could create artificial input element with selected text / hover word. Then show original menu items.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>177345</commentid>
    <comment_count>19</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-01-05 13:19:24 -0800</bug_when>
    <thetext>Why is this bug marked security sensitive?  Does it need to be?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>177389</commentid>
    <comment_count>20</comment_count>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2010-01-05 14:16:49 -0800</bug_when>
    <thetext>Is there any approach where we can get good display performance without resorting to Canvas text drawing? I think the costs of losing native text functionality, especially accessibility, will be pretty high. BeSpin has gotten significant criticism for not really having an accessibility story, and I would not want to replicate their approach without having some way to deal with accessibility issues.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>177439</commentid>
    <comment_count>21</comment_count>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2010-01-05 15:32:08 -0800</bug_when>
    <thetext>(In reply to comment #20)
&gt; I would not want to replicate their approach without having some way to deal with accessibility issues.

We have couple of options here:

1) Forget about canvas, do the span-based rendering of visible area. My fear is that it would result in ugly code and would not really address &apos;native editor experience&apos; issue.
2) Toggle between native and canvas-based editors. That would make syntax highlighting and accessibility features mutually exclusive. Not an ideal accessibility story, but fairly pragmatic one.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>177999</commentid>
    <comment_count>22</comment_count>
    <who name="Keishi Hattori">keishi</who>
    <bug_when>2010-01-06 22:16:29 -0800</bug_when>
    <thetext>CJK characters have double the width in monospace font. We need to do something about it because the caret position goes out of sync.
http://en.wikipedia.org/wiki/Fullwidth_form</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>178112</commentid>
    <comment_count>23</comment_count>
      <attachid>46041</attachid>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2010-01-07 03:18:49 -0800</bug_when>
    <thetext>Created attachment 46041
[PATCH] Same with support for CJK.

Strictly speaking, we are no longer monospace-bound. Ctrl+Alt+M toggles monospace mode.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>178113</commentid>
    <comment_count>24</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-01-07 03:23:38 -0800</bug_when>
    <thetext>style-queue ran check-webkit-style on attachment 46041 without any errors.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>178117</commentid>
    <comment_count>25</comment_count>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2010-01-07 03:33:21 -0800</bug_when>
    <thetext>(In reply to comment #22)
&gt; CJK characters have double the width in monospace font. We need to do something
&gt; about it because the caret position goes out of sync.
&gt; http://en.wikipedia.org/wiki/Fullwidth_form

Keishi, I uploaded latest version to http://repenaxa.com/editor/editor.html. Tell me if it behaves as expected!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>178182</commentid>
    <comment_count>26</comment_count>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2010-01-07 07:51:13 -0800</bug_when>
    <thetext>Nice work on CJK,

This made me think of another issue. We will not have support for input managers, common and often required for Asian and other languages.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>178227</commentid>
    <comment_count>27</comment_count>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2010-01-07 09:36:05 -0800</bug_when>
    <thetext>(In reply to comment #26)
&gt; Nice work on CJK,
&gt; 
&gt; This made me think of another issue. We will not have support for input
&gt; managers, common and often required for Asian and other languages.

I was thinking about it, but at some point decided that &quot;textInput&quot; event that I am using for characters input should actually handle it behind the scenes. Did not check whether that was the case though. I think Keishi would know best.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>178229</commentid>
    <comment_count>28</comment_count>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2010-01-07 09:37:32 -0800</bug_when>
    <thetext>(In reply to comment #27)
&gt; (In reply to comment #26)
&gt; &gt; Nice work on CJK,
&gt; &gt; 
&gt; &gt; This made me think of another issue. We will not have support for input
&gt; &gt; managers, common and often required for Asian and other languages.
&gt; 
&gt; I was thinking about it, but at some point decided that &quot;textInput&quot; event that
&gt; I am using for characters input should actually handle it behind the scenes.
&gt; Did not check whether that was the case though. I think Keishi would know best.

I am not so sure. THe input manager needs to know where to show up on screen, etc.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>178290</commentid>
    <comment_count>29</comment_count>
      <attachid>46041</attachid>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2010-01-07 11:38:23 -0800</bug_when>
    <thetext>Comment on attachment 46041
[PATCH] Same with support for CJK.

&gt; +    setText: function(text)

Can this be a getter and setter? Why only a setter?


&gt; +            console.log(&quot;Repaint %d:%d&quot;, firstLine, lastLine);

I think we have WebInspector.log which will log to the current inspector&apos;s console to make it easy to see.


&gt; +        this._replaceSelectionWith(e.clipboardData.getData(&quot;Text&quot;));

What happens when there is no Text on the pastboard? Like an image. Maybe it should bail and not replace the selection with nothing.


&gt; +        this._isMac = navigator.userAgent.indexOf(&quot;Mac OS&quot;) !== -1;
&gt; +        this._isWin = navigator.userAgent.indexOf(&quot;Windows&quot;) !== -1;
&gt; +        this._isLinux = navigator.userAgent.indexOf(&quot;Linux&quot;) !== -1;

It is good the editor is standalone, but I would like to see this use WebInspector.platform. These classes already require the WebInspector object ro exist for namespace.


&gt; +            else if (this._isLinux)
&gt; +                this._font = &quot;10px Droid Sans Mono&quot;;

Does this ship with all Linux platforms? I thought this was a Google font.


&gt; +WebInspector.TextCursor = function(cursorElement)
&gt; +{
&gt; +    this._visible = false;
&gt; +    this._cursorElement = cursorElement;
&gt; +}

Why do you use a DOM element for this? Why paint it in the canvas?


&gt; +WebInspector.TextEditorModel.prototype = {
&gt; +
&gt; +    linesCount: function()

Remove extra empty line. Use a getter?


&gt; +    columnsCount: function()

Getter?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>178365</commentid>
    <comment_count>30</comment_count>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2010-01-07 13:38:37 -0800</bug_when>
    <thetext>(In reply to comment #29)
&gt; (From update of attachment 46041 [details])
&gt; &gt; +    setText: function(text)
&gt; 
&gt; Can this be a getter and setter? Why only a setter?
&gt; 

Is now setter. Will add getter once there are clients!

&gt; 
&gt; &gt; +            console.log(&quot;Repaint %d:%d&quot;, firstLine, lastLine);
&gt; 

Done.

&gt; 
&gt; 
&gt; &gt; +        this._replaceSelectionWith(e.clipboardData.getData(&quot;Text&quot;));
&gt; 
&gt; What happens when there is no Text on the pastboard? Like an image. Maybe it
&gt; should bail and not replace the selection with nothing.

Done.

&gt; 
&gt; 
&gt; &gt; +        this._isMac = navigator.userAgent.indexOf(&quot;Mac OS&quot;) !== -1;
&gt; &gt; +        this._isWin = navigator.userAgent.indexOf(&quot;Windows&quot;) !== -1;
&gt; &gt; +        this._isLinux = navigator.userAgent.indexOf(&quot;Linux&quot;) !== -1;
&gt; 
&gt; It is good the editor is standalone, but I would like to see this use
&gt; WebInspector.platform. These classes already require the WebInspector object ro
&gt; exist for namespace.
&gt; 

Done.

&gt; 
&gt; &gt; +            else if (this._isLinux)
&gt; &gt; +                this._font = &quot;10px Droid Sans Mono&quot;;
&gt; 
&gt; Does this ship with all Linux platforms? I thought this was a Google font.
&gt;

Android one. Removed.
 
&gt; 
&gt; &gt; +WebInspector.TextCursor = function(cursorElement)
&gt; &gt; +{
&gt; &gt; +    this._visible = false;
&gt; &gt; +    this._cursorElement = cursorElement;
&gt; &gt; +}
&gt; 
&gt; Why do you use a DOM element for this? Why paint it in the canvas?
&gt; 
&gt;

In order not to repaint too much.
 
&gt; &gt; +WebInspector.TextEditorModel.prototype = {
&gt; &gt; +
&gt; &gt; +    linesCount: function()
&gt; 
&gt; Remove extra empty line. Use a getter?
&gt; 

Done.

&gt; 
&gt; &gt; +    columnsCount: function()
&gt; 
&gt; Getter?

Done.

Committing to http://svn.webkit.org/repository/webkit/trunk ...
	M	WebCore/ChangeLog
	M	WebCore/WebCore.gypi
	M	WebCore/WebCore.vcproj/WebCore.vcproj
	A	WebCore/inspector/front-end/JavaScriptHighlighterScheme.js
	M	WebCore/inspector/front-end/KeyboardShortcut.js
	A	WebCore/inspector/front-end/TextEditor.js
	A	WebCore/inspector/front-end/TextEditorHighlighter.js
	A	WebCore/inspector/front-end/TextEditorModel.js
	M	WebCore/inspector/front-end/WebKit.qrc
	M	WebCore/inspector/front-end/inspector.css
	M	WebCore/inspector/front-end/inspector.html
Committed r52945</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>45708</attachid>
            <date>2009-12-31 06:51:54 -0800</date>
            <delta_ts>2010-01-07 03:18:49 -0800</delta_ts>
            <desc>[PATCH] Meet the editor</desc>
            <filename>editor</filename>
            <type>text/plain</type>
            <size>63555</size>
            <attacher name="Pavel Feldman">pfeldman</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MDA4MmQ0ZS4uMzM5MDBkMCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzMyBAQAorMjAwOS0xMi0zMSAgUGF2ZWwgRmVsZG1h
biAgPHBmZWxkbWFuQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBXZWIgSW5zcGVjdG9yOiBNaWdyYXRlIHRvIGNhbnZhcy1iYXNl
ZCB0ZXh0IHZpZXdlciAvIGVkaXRvciB0aGF0IHNjYWxlcy4KKworICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzMwMDEKKworICAgICAgICAqIFdlYkNvcmUu
Z3lwaToKKyAgICAgICAgKiBXZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvajoKKyAgICAgICAg
KiBpbnNwZWN0b3IvZnJvbnQtZW5kL0phdmFTY3JpcHRIaWdobGlnaHRlclNjaGVtZS5qczogQWRk
ZWQuCisgICAgICAgIChXZWJJbnNwZWN0b3IuSmF2YVNjcmlwdEhpZ2hsaWdodGVyU2NoZW1lKToK
KyAgICAgICAgKCk6CisgICAgICAgICogaW5zcGVjdG9yL2Zyb250LWVuZC9LZXlib2FyZFNob3J0
Y3V0LmpzOgorICAgICAgICAqIGluc3BlY3Rvci9mcm9udC1lbmQvVGV4dEVkaXRvci5qczogQWRk
ZWQuCisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dEVkaXRvcik6CisgICAgICAgIChXZWJJbnNw
ZWN0b3IuVGV4dFNlbGVjdGlvbk1vZGVsKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0Q3Vy
c29yKToKKyAgICAgICAgKiBpbnNwZWN0b3IvZnJvbnQtZW5kL1RleHRFZGl0b3JIaWdobGlnaHRl
ci5qczogQWRkZWQuCisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dEVkaXRvckhpZ2hsaWdodGVy
KToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0RWRpdG9ySGlnaGxpZ2h0ZXIucHJvdG90eXBl
LmhpZ2hsaWdodCk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dEVkaXRvckhpZ2hsaWdodGVy
LnByb3RvdHlwZS5fbGV4KToKKyAgICAgICAgKiBpbnNwZWN0b3IvZnJvbnQtZW5kL1RleHRFZGl0
b3JNb2RlbC5qczogQWRkZWQuCisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dFJhbmdlKToKKyAg
ICAgICAgKFdlYkluc3BlY3Rvci5UZXh0UmFuZ2UucHJvdG90eXBlLmNsb25lKToKKyAgICAgICAg
KFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yTW9kZWwpOgorICAgICAgICAqIGluc3BlY3Rvci9mcm9u
dC1lbmQvV2ViS2l0LnFyYzoKKyAgICAgICAgKiBpbnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rv
ci5jc3M6CisgICAgICAgICogaW5zcGVjdG9yL2Zyb250LWVuZC9pbnNwZWN0b3IuaHRtbDoKKwog
MjAwOS0xMi0zMCAgRGFyaW4gRmlzaGVyICA8ZGFyaW5AY2hyb21pdW0ub3JnPgogCiAgICAgICAg
IFJldmlld2VkIGJ5IERhdmlkIExldmluLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9XZWJDb3JlLmd5
cGkgYi9XZWJDb3JlL1dlYkNvcmUuZ3lwaQppbmRleCBhMzM2NjkzLi5hNzA3MWIxIDEwMDY0NAot
LS0gYS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQorKysgYi9XZWJDb3JlL1dlYkNvcmUuZ3lwaQpAQCAt
MzY4MCw2ICszNjgwLDcgQEAKICAgICAgICAgICAgICdpbnNwZWN0b3IvZnJvbnQtZW5kL0luamVj
dGVkU2NyaXB0LmpzJywKICAgICAgICAgICAgICdpbnNwZWN0b3IvZnJvbnQtZW5kL0luamVjdGVk
U2NyaXB0QWNjZXNzLmpzJywKICAgICAgICAgICAgICdpbnNwZWN0b3IvZnJvbnQtZW5kL2luc3Bl
Y3Rvci5qcycsCisgICAgICAgICAgICAnaW5zcGVjdG9yL2Zyb250LWVuZC9KYXZhU2NyaXB0SGln
aGxpZ2h0ZXJTY2hlbWUuanMnLAogICAgICAgICAgICAgJ2luc3BlY3Rvci9mcm9udC1lbmQvSmF2
YVNjcmlwdFNvdXJjZVN5bnRheEhpZ2hsaWdodGVyLmpzJywKICAgICAgICAgICAgICdpbnNwZWN0
b3IvZnJvbnQtZW5kL0tleWJvYXJkU2hvcnRjdXQuanMnLAogICAgICAgICAgICAgJ2luc3BlY3Rv
ci9mcm9udC1lbmQvTWV0cmljc1NpZGViYXJQYW5lLmpzJywKQEAgLTM3MTUsNiArMzcxNiw5IEBA
CiAgICAgICAgICAgICAnaW5zcGVjdG9yL2Zyb250LWVuZC9TdHlsZXNTaWRlYmFyUGFuZS5qcycs
CiAgICAgICAgICAgICAnaW5zcGVjdG9yL2Zyb250LWVuZC9TdW1tYXJ5QmFyLmpzJywKICAgICAg
ICAgICAgICdpbnNwZWN0b3IvZnJvbnQtZW5kL1Rlc3RDb250cm9sbGVyLmpzJywKKyAgICAgICAg
ICAgICdpbnNwZWN0b3IvZnJvbnQtZW5kL1RleHRFZGl0b3IuanMnLAorICAgICAgICAgICAgJ2lu
c3BlY3Rvci9mcm9udC1lbmQvVGV4dEVkaXRvckhpZ2hsaWdodGVyLmpzJywKKyAgICAgICAgICAg
ICdpbnNwZWN0b3IvZnJvbnQtZW5kL1RleHRFZGl0b3JNb2RlbC5qcycsCiAgICAgICAgICAgICAn
aW5zcGVjdG9yL2Zyb250LWVuZC9UZXh0UHJvbXB0LmpzJywKICAgICAgICAgICAgICdpbnNwZWN0
b3IvZnJvbnQtZW5kL1RpbWVsaW5lQWdlbnQuanMnLAogICAgICAgICAgICAgJ2luc3BlY3Rvci9m
cm9udC1lbmQvVGltZWxpbmVPdmVydmlld1BhbmUuanMnLApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9X
ZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvaiBiL1dlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2Vi
Q29yZS52Y3Byb2oKaW5kZXggOWRmOWE0NS4uMWJiOTNjNCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9X
ZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagorKysgYi9XZWJDb3JlL1dlYkNvcmUudmNwcm9q
L1dlYkNvcmUudmNwcm9qCkBAIC00Mjg0OCw2ICs0Mjg0OCwxMCBAQAogCQkJCQk+DQogCQkJCTwv
RmlsZT4NCiAJCQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0aD0iLi5caW5zcGVjdG9yXGZyb250
LWVuZFxKYXZhU2NyaXB0SGlnaGxpZ2h0ZXJTY2hlbWUuanMiDQorCQkJCQk+DQorCQkJCTwvRmls
ZT4NCisJCQkJPEZpbGUNCiAJCQkJCVJlbGF0aXZlUGF0aD0iLi5caW5zcGVjdG9yXGZyb250LWVu
ZFxKYXZhU2NyaXB0U291cmNlU3ludGF4SGlnaGxpZ2h0ZXIuanMiDQogCQkJCQk+DQogCQkJCTwv
RmlsZT4NCkBAIC00Mjk4NCw2ICs0Mjk4OCwxOCBAQAogCQkJCQk+DQogCQkJCTwvRmlsZT4NCiAJ
CQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0aD0iLi5caW5zcGVjdG9yXGZyb250LWVuZFxUZXh0
RWRpdG9yLmpzIg0KKwkJCQkJPg0KKwkJCQk8L0ZpbGU+DQorCQkJCTxGaWxlDQorCQkJCQlSZWxh
dGl2ZVBhdGg9Ii4uXGluc3BlY3Rvclxmcm9udC1lbmRcVGV4dEVkaXRvckhpZ2hsaWdodGVyLmpz
Ig0KKwkJCQkJPg0KKwkJCQk8L0ZpbGU+DQorCQkJCTxGaWxlDQorCQkJCQlSZWxhdGl2ZVBhdGg9
Ii4uXGluc3BlY3Rvclxmcm9udC1lbmRcVGV4dEVkaXRvck1vZGVsLmpzIg0KKwkJCQkJPg0KKwkJ
CQk8L0ZpbGU+DQorCQkJCTxGaWxlDQogCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGluc3BlY3Rvclxm
cm9udC1lbmRcVGV4dFByb21wdC5qcyINCiAJCQkJCT4NCiAJCQkJPC9GaWxlPg0KZGlmZiAtLWdp
dCBhL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9KYXZhU2NyaXB0SGlnaGxpZ2h0ZXJTY2hl
bWUuanMgYi9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvSmF2YVNjcmlwdEhpZ2hsaWdodGVy
U2NoZW1lLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYmYwNDkKLS0t
IC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvSmF2YVNjcmlwdEhp
Z2hsaWdodGVyU2NoZW1lLmpzCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA5IEFwcGxlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykg
MjAwOSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitXZWJJbnNwZWN0b3IuSmF2YVNjcmlwdEhpZ2hsaWdo
dGVyU2NoZW1lID0gZnVuY3Rpb24oKSB7CisgICAgdGhpcy5MZXhTdGF0ZSA9IHsKKyAgICAgICAg
SW5pdGlhbDogMSwKKyAgICAgICAgRGl2aXNpb25BbGxvd2VkOiAyCisgICAgfTsKKyAgICB0aGlz
LkNvbnRpbnVlU3RhdGUgPSB7CisgICAgICAgIE5vbmU6IDAsCisgICAgICAgIENvbW1lbnQ6IDEs
CisgICAgICAgIFNpbmdsZVF1b3RlU3RyaW5nOiAyLAorICAgICAgICBEb3VibGVRdW90ZVN0cmlu
ZzogMywKKyAgICAgICAgUmVnRXhwOiA0CisgICAgfTsKKworICAgIHZhciBrZXl3b3JkcyA9IFsK
KyAgICAgICAgIm51bGwiLCAidHJ1ZSIsICJmYWxzZSIsICJicmVhayIsICJjYXNlIiwgImNhdGNo
IiwgImNvbnN0IiwgImRlZmF1bHQiLCAiZmluYWxseSIsICJmb3IiLAorICAgICAgICAiaW5zdGFu
Y2VvZiIsICJuZXciLCAidmFyIiwgImNvbnRpbnVlIiwgImZ1bmN0aW9uIiwgInJldHVybiIsICJ2
b2lkIiwgImRlbGV0ZSIsICJpZiIsCisgICAgICAgICJ0aGlzIiwgImRvIiwgIndoaWxlIiwgImVs
c2UiLCAiaW4iLCAic3dpdGNoIiwgInRocm93IiwgInRyeSIsICJ0eXBlb2YiLCAiZGVidWdnZXIi
LAorICAgICAgICAiY2xhc3MiLCAiZW51bSIsICJleHBvcnQiLCAiZXh0ZW5kcyIsICJpbXBvcnQi
LCAic3VwZXIiLCAiZ2V0IiwgInNldCIKKyAgICBdLmtleVNldCgpOworCisgICAgdmFyIHRva2Vu
VHlwZXMgPSBXZWJJbnNwZWN0b3IuVGV4dEVkaXRvckhpZ2hsaWdodGVyLlRva2VuVHlwZTsKKwor
ICAgIHRoaXMucnVsZXMgPSBbeworICAgICAgICBuYW1lOiAic2luZ2xlTGluZUNvbW1lbnRBY3Rp
b24iLAorICAgICAgICBwYXR0ZXJuOiAvXig/OlwvXC8uKikvLAorICAgICAgICB0eXBlOiB0b2tl
blR5cGVzLkNvbW1lbnQKKyAgICB9LCB7CisgICAgICAgIG5hbWU6ICJtdWx0aUxpbmVTaW5nbGVM
aW5lQ29tbWVudEFjdGlvbiIsCisgICAgICAgIHBhdHRlcm46IC9eKD86XC9cKig/OlteXCpdfFwq
W15cL10pKlwqK1wvKS8sCisgICAgICAgIHR5cGU6IHRva2VuVHlwZXMuQ29tbWVudAorICAgIH0s
IHsKKyAgICAgICAgbmFtZTogIm11bHRpTGluZUNvbW1lbnRTdGFydEFjdGlvbiIsCisgICAgICAg
IHBhdHRlcm46IC9eKD86XC9cKig/OlteXCpdfFwqW15cL10pKikvLAorICAgICAgICB0eXBlOiB0
b2tlblR5cGVzLkNvbW1lbnQsCisgICAgICAgIHBvc3RDb250aW51ZVN0YXRlOiB0aGlzLkNvbnRp
bnVlU3RhdGUuQ29tbWVudAorICAgIH0sIHsKKyAgICAgICAgbmFtZTogIm11bHRpTGluZUNvbW1l
bnRFbmRBY3Rpb24iLAorICAgICAgICBwYXR0ZXJuOiAvXig/Oig/OlteXCpdfFwqW15cL10pKlwq
K1wvKS8sCisgICAgICAgIHR5cGU6IHRva2VuVHlwZXMuQ29tbWVudCwKKyAgICAgICAgcHJlQ29u
dGludWVTdGF0ZTogdGhpcy5Db250aW51ZVN0YXRlLkNvbW1lbnQsCisgICAgICAgIHBvc3RDb250
aW51ZVN0YXRlOiB0aGlzLkNvbnRpbnVlU3RhdGUuTm9uZQorICAgIH0sIHsKKyAgICAgICAgbmFt
ZTogIm11bHRpTGluZUNvbW1lbnRNaWRkbGVBY3Rpb24iLAorICAgICAgICBwYXR0ZXJuOiAvXi4q
LywKKyAgICAgICAgdHlwZTogdG9rZW5UeXBlcy5Db21tZW50LAorICAgICAgICBwcmVDb250aW51
ZVN0YXRlOiB0aGlzLkNvbnRpbnVlU3RhdGUuQ29tbWVudAorICAgIH0sIHsKKyAgICAgICAgbmFt
ZTogIm51bWVyaWNMaXRlcmFsQWN0aW9uIiwKKyAgICAgICAgcGF0dGVybjogL14oPzooPzowfFsx
LTldXGQqKVwuXGQrPyg/OltlRV0oPzpcZCt8XCtcZCt8LVxkKykpP3xcLlxkKyg/OltlRV0oPzpc
ZCt8XCtcZCt8LVxkKykpP3woPzowfFsxLTldXGQqKSg/OltlRV0oPzpcZCt8XCtcZCt8LVxkKykp
P3wweFswLTlhLWZBLUZdK3wwWFswLTlhLWZBLUZdKylccyovLAorICAgICAgICB0eXBlOiB0b2tl
blR5cGVzLk51bWJlciwKKyAgICAgICAgcG9zdExleFN0YXRlOiB0aGlzLkxleFN0YXRlLkRpdmlz
aW9uQWxsb3dlZAorICAgIH0sIHsKKyAgICAgICAgbmFtZTogInN0cmluZ0xpdGVyYWxBY3Rpb24i
LAorICAgICAgICBwYXR0ZXJuOiAvXig/OiIoPzpbXiJcXF18XFwoPzpbJyJcYmZucnR2XXxbXici
XGJmbnJ0djAtOXh1XXwwfHhbMC05YS1mQS1GXVswLTlhLWZBLUZdfCg/OnVbMC05YS1mQS1GXVsw
LTlhLWZBLUZdWzAtOWEtZkEtRl1bMC05YS1mQS1GXSkpKSoifCcoPzpbXidcXF18XFwoPzpbJyJc
YmZucnR2XXxbXiciXGJmbnJ0djAtOXh1XXwwfHhbMC05YS1mQS1GXVswLTlhLWZBLUZdfCg/OnVb
MC05YS1mQS1GXVswLTlhLWZBLUZdWzAtOWEtZkEtRl1bMC05YS1mQS1GXSkpKSonKS8sCisgICAg
ICAgIHR5cGU6IHRva2VuVHlwZXMuU3RyaW5nLAorICAgICAgICBwb3N0TGV4U3RhdGU6IHRoaXMu
TGV4U3RhdGUuSW5pdGlhbAorICAgIH0sIHsKKyAgICAgICAgbmFtZTogInNpbmdsZVF1b3RlU3Ry
aW5nU3RhcnRBY3Rpb24iLAorICAgICAgICBwYXR0ZXJuOiAvXig/OicoPzpbXidcXF18XFwoPzpb
JyJcYmZucnR2XXxbXiciXGJmbnJ0djAtOXh1XXwwfHhbMC05YS1mQS1GXVswLTlhLWZBLUZdfCg/
OnVbMC05YS1mQS1GXVswLTlhLWZBLUZdWzAtOWEtZkEtRl1bMC05YS1mQS1GXSkpKSopXFwkLywK
KyAgICAgICAgdHlwZTogdG9rZW5UeXBlcy5TdHJpbmcsCisgICAgICAgIHBvc3RDb250aW51ZVN0
YXRlOiAgdGhpcy5Db250aW51ZVN0YXRlLlNpbmdsZVF1b3RlU3RyaW5nCisgICAgfSwgeworICAg
ICAgICBuYW1lOiAic2luZ2xlUXVvdGVTdHJpbmdFbmRBY3Rpb24iLAorICAgICAgICBwYXR0ZXJu
OiAvXig/Oig/OlteJ1xcXXxcXCg/OlsnIlxiZm5ydHZdfFteJyJcYmZucnR2MC05eHVdfDB8eFsw
LTlhLWZBLUZdWzAtOWEtZkEtRl18KD86dVswLTlhLWZBLUZdWzAtOWEtZkEtRl1bMC05YS1mQS1G
XVswLTlhLWZBLUZdKSkpKicpLywKKyAgICAgICAgdHlwZTogdG9rZW5UeXBlcy5TdHJpbmcsCisg
ICAgICAgIHByZUNvbnRpbnVlU3RhdGU6IHRoaXMuQ29udGludWVTdGF0ZS5TaW5nbGVRdW90ZVN0
cmluZywKKyAgICAgICAgcG9zdENvbnRpbnVlU3RhdGU6IHRoaXMuQ29udGludWVTdGF0ZS5Ob25l
CisgICAgfSwgeworICAgICAgICBuYW1lOiAic2luZ2xlUXVvdGVTdHJpbmdNaWRkbGVBY3Rpb24i
LAorICAgICAgICBwYXR0ZXJuOiAvXig/Oig/OlteJ1xcXXxcXCg/OlsnIlxiZm5ydHZdfFteJyJc
YmZucnR2MC05eHVdfDB8eFswLTlhLWZBLUZdWzAtOWEtZkEtRl18KD86dVswLTlhLWZBLUZdWzAt
OWEtZkEtRl1bMC05YS1mQS1GXVswLTlhLWZBLUZdKSkpKilcXCQvLAorICAgICAgICB0eXBlOiB0
b2tlblR5cGVzLlN0cmluZywKKyAgICAgICAgcHJlQ29udGludWVTdGF0ZTogdGhpcy5Db250aW51
ZVN0YXRlLlNpbmdsZVF1b3RlU3RyaW5nCisgICAgfSwgeworICAgICAgICBuYW1lOiAiZG91Ymxl
UXVvdGVTdHJpbmdTdGFydEFjdGlvbiIsCisgICAgICAgIHBhdHRlcm46IC9eKD86Iig/OlteIlxc
XXxcXCg/OlsnIlxiZm5ydHZdfFteJyJcYmZucnR2MC05eHVdfDB8eFswLTlhLWZBLUZdWzAtOWEt
ZkEtRl18KD86dVswLTlhLWZBLUZdWzAtOWEtZkEtRl1bMC05YS1mQS1GXVswLTlhLWZBLUZdKSkp
KilcXCQvLAorICAgICAgICB0eXBlOiB0b2tlblR5cGVzLlN0cmluZywKKyAgICAgICAgcG9zdENv
bnRpbnVlU3RhdGU6IHRoaXMuQ29udGludWVTdGF0ZS5Eb3VibGVRdW90ZVN0cmluZworICAgIH0s
IHsKKyAgICAgICAgbmFtZTogImRvdWJsZVF1b3RlU3RyaW5nRW5kQWN0aW9uIiwKKyAgICAgICAg
cGF0dGVybjogL14oPzooPzpbXiJcXF18XFwoPzpbJyJcYmZucnR2XXxbXiciXGJmbnJ0djAtOXh1
XXwwfHhbMC05YS1mQS1GXVswLTlhLWZBLUZdfCg/OnVbMC05YS1mQS1GXVswLTlhLWZBLUZdWzAt
OWEtZkEtRl1bMC05YS1mQS1GXSkpKSoiKS8sCisgICAgICAgIHR5cGU6IHRva2VuVHlwZXMuU3Ry
aW5nLAorICAgICAgICBwcmVDb250aW51ZVN0YXRlOiB0aGlzLkNvbnRpbnVlU3RhdGUuRG91Ymxl
UXVvdGVTdHJpbmcsCisgICAgICAgIHBvc3RDb250aW51ZVN0YXRlOiB0aGlzLkNvbnRpbnVlU3Rh
dGUuTm9uZQorICAgIH0sIHsKKyAgICAgICAgbmFtZTogImRvdWJsZVF1b3RlU3RyaW5nTWlkZGxl
QWN0aW9uIiwKKyAgICAgICAgcGF0dGVybjogL14oPzooPzpbXiJcXF18XFwoPzpbJyJcYmZucnR2
XXxbXiciXGJmbnJ0djAtOXh1XXwwfHhbMC05YS1mQS1GXVswLTlhLWZBLUZdfCg/OnVbMC05YS1m
QS1GXVswLTlhLWZBLUZdWzAtOWEtZkEtRl1bMC05YS1mQS1GXSkpKSopXFwkLywKKyAgICAgICAg
dHlwZTogdG9rZW5UeXBlcy5TdHJpbmcsCisgICAgICAgIHByZUNvbnRpbnVlU3RhdGU6IHRoaXMu
Q29udGludWVTdGF0ZS5Eb3VibGVRdW90ZVN0cmluZworICAgIH0sIHsKKyAgICAgICAgbmFtZTog
ImtleXdvcmRBY3Rpb24iLAorICAgICAgICBwYXR0ZXJuOiAvXig/Oig/OlthLXpBLVpdfFskX118
XFwoPzp1WzAtOWEtZkEtRl1bMC05YS1mQS1GXVswLTlhLWZBLUZdWzAtOWEtZkEtRl0pKSg/Oig/
OlthLXpBLVpdfFskX118XFwoPzp1WzAtOWEtZkEtRl1bMC05YS1mQS1GXVswLTlhLWZBLUZdWzAt
OWEtZkEtRl0pKXxbMC05XSkqKS8sCisgICAgICAgIGtleXdvcmRzOiBrZXl3b3JkcywKKyAgICAg
ICAgdHlwZTogdG9rZW5UeXBlcy5LZXl3b3JkLAorICAgICAgICBwb3N0TGV4U3RhdGU6IHRoaXMu
TGV4U3RhdGUuSW5pdGlhbAorICAgIH0sIHsKKyAgICAgICAgbmFtZTogImlkZW50QWN0aW9uIiwK
KyAgICAgICAgcGF0dGVybjogL14oPzooPzpbYS16QS1aXXxbJF9dfFxcKD86dVswLTlhLWZBLUZd
WzAtOWEtZkEtRl1bMC05YS1mQS1GXVswLTlhLWZBLUZdKSkoPzooPzpbYS16QS1aXXxbJF9dfFxc
KD86dVswLTlhLWZBLUZdWzAtOWEtZkEtRl1bMC05YS1mQS1GXVswLTlhLWZBLUZdKSl8WzAtOV0p
KilccyovLAorICAgICAgICBwb3N0TGV4U3RhdGU6IHRoaXMuTGV4U3RhdGUuRGl2aXNpb25BbGxv
d2VkCisgICAgfSwgeworICAgICAgICBuYW1lOiAicmlnaHRQYXJlbkFjdGlvbiIsCisgICAgICAg
IHBhdHRlcm46IC9eXClccyovLAorICAgICAgICBwb3N0TGV4U3RhdGU6IHRoaXMuTGV4U3RhdGUu
RGl2aXNpb25BbGxvd2VkCisgICAgfSwgeworICAgICAgICBuYW1lOiAicHVuY3R1YXRvckFjdGlv
biIsCisgICAgICAgIHBhdHRlcm46IC9eKD86PD18Pj18PT09fD09fCE9fCE9PXxcK1wrfFwtXC18
PDx8Pj58Pj4+fCYmfFx8XHx8XCs9fFwtPXxcKj18JT18PDw9fD4+PXw+Pj49fCY9fFx8PXxePXxb
XHN7fVwoXFtcXVwuOyw8PlwrXC1cKiUmXHxcXiF+XD86PV0pLywKKyAgICAgICAgcG9zdExleFN0
YXRlOiB0aGlzLkxleFN0YXRlLkluaXRpYWwKKyAgICB9LCB7CisgICAgICAgIG5hbWU6ICJkaXZQ
dW5jdHVhdG9yQWN0aW9uIiwKKyAgICAgICAgcGF0dGVybjogL14oPzpcLz0/KS8sCisgICAgICAg
IHByZUxleFN0YXRlOiB0aGlzLkxleFN0YXRlLkRpdmlzaW9uQWxsb3dlZCwKKyAgICAgICAgcG9z
dExleFN0YXRlOiB0aGlzLkxleFN0YXRlLkluaXRpYWwKKyAgICB9LCB7CisgICAgICAgIG5hbWU6
ICJyZWdFeHBMaXRlcmFsQWN0aW9uIiwKKyAgICAgICAgcGF0dGVybjogL14oPzpcLyg/Oig/Olxc
Lil8W15cXCpcL10pKD86KD86XFwuKXxbXlxcXC9dKSpcLyg/Oig/OlthLXpBLVpdfFskX118XFwo
Pzp1WzAtOWEtZkEtRl1bMC05YS1mQS1GXVswLTlhLWZBLUZdWzAtOWEtZkEtRl0pKXxbMC05XSkq
KS8sCisgICAgICAgIHR5cGU6IHRva2VuVHlwZXMuU3RyaW5nLAorICAgICAgICBwb3N0TGV4U3Rh
dGU6IHRoaXMuTGV4U3RhdGUuSW5pdGlhbAorICAgIH0sIHsKKyAgICAgICAgbmFtZTogInJlZ0V4
cFN0YXJ0QWN0aW9uIiwKKyAgICAgICAgcGF0dGVybjogL14oPzpcLyg/Oig/OlxcLil8W15cXCpc
L10pKD86KD86XFwuKXxbXlxcXC9dKSopXFwkLywKKyAgICAgICAgdHlwZTogdG9rZW5UeXBlcy5T
dHJpbmcsCisgICAgICAgIHBvc3RDb250aW51ZVN0YXRlOiB0aGlzLkNvbnRpbnVlU3RhdGUuUmVn
RXhwCisgICAgfSwgeworICAgICAgICBuYW1lOiAicmVnRXhwRW5kQWN0aW9uIiwKKyAgICAgICAg
cGF0dGVybjogL14oPzooPzooPzpcXC4pfFteXFxcL10pKlwvKD86KD86W2EtekEtWl18WyRfXXxc
XCg/OnVbMC05YS1mQS1GXVswLTlhLWZBLUZdWzAtOWEtZkEtRl1bMC05YS1mQS1GXSkpfFswLTld
KSopLywKKyAgICAgICAgdHlwZTogdG9rZW5UeXBlcy5TdHJpbmcsCisgICAgICAgIHByZUNvbnRp
bnVlU3RhdGU6IHRoaXMuQ29udGludWVTdGF0ZS5SZWdFeHAsCisgICAgICAgIHBvc3RDb250aW51
ZVN0YXRlOiB0aGlzLkNvbnRpbnVlU3RhdGUuTm9uZQorICAgIH0sIHsKKyAgICAgICAgbmFtZTog
InJlZ0V4cE1pZGRsZUFjdGlvbiIsCisgICAgICAgIHBhdHRlcm46IC9eKD86KD86KD86XFwuKXxb
XlxcXC9dKSopXFwkLywKKyAgICAgICAgdHlwZTogdG9rZW5UeXBlcy5TdHJpbmcsCisgICAgICAg
IHByZUNvbnRpbnVlU3RhdGU6IHRoaXMuQ29udGludWVTdGF0ZS5SZWdFeHAKKyAgICB9LCB7Cisg
ICAgICAgIG5hbWU6ICJ3aGl0ZXNwYWNlIiwKKyAgICAgICAgcGF0dGVybjogL15ccyskLworICAg
IH1dOworfQorCitXZWJJbnNwZWN0b3IuSmF2YVNjcmlwdEhpZ2hsaWdodGVyU2NoZW1lLnByb3Rv
dHlwZSA9IHsKKyAgICByZXNldDogZnVuY3Rpb24oaGlnaGxpZ2h0ZXIpCisgICAgeworICAgICAg
ICBoaWdobGlnaHRlci5sZXhTdGF0ZSA9IHRoaXMuTGV4U3RhdGUuSW5pdGlhbDsKKyAgICAgICAg
aGlnaGxpZ2h0ZXIuY29udGludWVTdGF0ZSA9IHRoaXMuQ29udGludWVTdGF0ZS5Ob25lOworICAg
IH0KK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9LZXlib2FyZFNo
b3J0Y3V0LmpzIGIvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0tleWJvYXJkU2hvcnRjdXQu
anMKaW5kZXggMGEwNjhkNS4uNzgzZWM4MyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9pbnNwZWN0b3Iv
ZnJvbnQtZW5kL0tleWJvYXJkU2hvcnRjdXQuanMKKysrIGIvV2ViQ29yZS9pbnNwZWN0b3IvZnJv
bnQtZW5kL0tleWJvYXJkU2hvcnRjdXQuanMKQEAgLTQ1LDYgKzQ1LDcgQEAgV2ViSW5zcGVjdG9y
LktleWJvYXJkU2hvcnRjdXQuTW9kaWZpZXJzID0gewogCiBXZWJJbnNwZWN0b3IuS2V5Ym9hcmRT
aG9ydGN1dC5LZXlDb2RlcyA9IHsKICAgICBCYWNrc3BhY2U6IDgsCisgICAgVGFiOiA5LAogICAg
IEVzYzogMjcsCiAgICAgU3BhY2U6IDMyLAogICAgIFBhZ2VVcDogMzMsICAgICAgLy8gYWxzbyBO
VU1fTk9SVEhfRUFTVApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL1Rl
eHRFZGl0b3IuanMgYi9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvVGV4dEVkaXRvci5qcwpu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmRjNDFkCi0tLSAvZGV2L251bGwK
KysrIGIvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL1RleHRFZGl0b3IuanMKQEAgLTAsMCAr
MSw3NzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoK
KyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgor
ICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBH
b29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1
c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMg
c29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5E
IENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklH
SFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCitXZWJJbnNwZWN0b3IuVGV4dEVkaXRvciA9IGZ1bmN0aW9uKCkKK3sKKyAgICB0aGlz
Ll90ZXh0TW9kZWwgPSBuZXcgV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JNb2RlbCh0aGlzLl90ZXh0
Q2hhbmdlZC5iaW5kKHRoaXMpKTsKKyAgICB0aGlzLl9oaWdobGlnaHRlciA9IG5ldyBXZWJJbnNw
ZWN0b3IuVGV4dEVkaXRvckhpZ2hsaWdodGVyKHRoaXMuX3RleHRNb2RlbCk7CisKKyAgICB0aGlz
LmVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgICB0aGlzLmVsZW1l
bnQuY2xhc3NOYW1lID0gInRleHQtZWRpdG9yIjsKKyAgICB0aGlzLmVsZW1lbnQudGFiSW5kZXgg
PSAwOworCisgICAgdGhpcy5fY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFz
Iik7CisgICAgdGhpcy5fY2FudmFzLmNsYXNzTmFtZSA9ICJ0ZXh0LWVkaXRvci1jYW52YXMiOwor
ICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9jYW52YXMpOworCisgICAgdGhpcy5f
Y29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgdGhpcy5fY29u
dGFpbmVyLmNsYXNzTmFtZSA9ICJ0ZXh0LWVkaXRvci1jb250YWluZXIiOworICAgIHRoaXMuZWxl
bWVudC5hcHBlbmRDaGlsZCh0aGlzLl9jb250YWluZXIpOworCisgICAgdGhpcy5fc2hlZXQgPSBk
b2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgICB0aGlzLl9zaGVldC5jbGFzc05hbWUg
PSAidGV4dC1lZGl0b3Itc2hlZXQiOworICAgIHRoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZCh0
aGlzLl9zaGVldCk7CisKKyAgICB0aGlzLl9saW5lSGVpZ2h0ID0gMTQ7CisKKyAgICB2YXIgY3Vy
c29yRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgIGN1cnNvckVs
ZW1lbnQuY2xhc3NOYW1lID0gInRleHQtZWRpdG9yLWN1cnNvciI7CisgICAgY3Vyc29yRWxlbWVu
dC5zdHlsZS5oZWlnaHQgPSB0aGlzLl9saW5lSGVpZ2h0ICsgInB4IjsKKyAgICB0aGlzLl9jb250
YWluZXIuYXBwZW5kQ2hpbGQoY3Vyc29yRWxlbWVudCk7CisKKyAgICB0aGlzLl9jb250YWluZXIu
YWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgdGhpcy5fc2Nyb2xsLmJpbmQodGhpcykpOworICAg
IHRoaXMuX2NvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgdGhpcy5fbW91c2VV
cC5iaW5kKHRoaXMpKTsKKyAgICB0aGlzLl9jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigibW91
c2Vkb3duIiwgdGhpcy5fbW91c2VEb3duLmJpbmQodGhpcykpOworICAgIHRoaXMuX2NvbnRhaW5l
ci5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCB0aGlzLl9tb3VzZU1vdmUuYmluZCh0aGlz
KSk7CisgICAgdGhpcy5fY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IiwgdGhp
cy5fbW91c2VPdXQuYmluZCh0aGlzKSk7CisgICAgdGhpcy5fY29udGFpbmVyLmFkZEV2ZW50TGlz
dGVuZXIoImRibGNsaWNrIiwgdGhpcy5fZGJsQ2xpY2suYmluZCh0aGlzKSk7CisgICAgdGhpcy5l
bGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCB0aGlzLl9rZXlEb3duLmJpbmQodGhp
cykpOworICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJ0ZXh0SW5wdXQiLCB0aGlz
Ll90ZXh0SW5wdXQuYmluZCh0aGlzKSk7IAorICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3Rl
bmVyKCJiZWZvcmVjb3B5IiwgdGhpcy5fYmVmb3JlQ29weS5iaW5kKHRoaXMpKTsgCisgICAgdGhp
cy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNvcHkiLCB0aGlzLl9jb3B5LmJpbmQodGhpcykp
OyAKKyAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JlY3V0IiwgdGhpcy5f
YmVmb3JlQ3V0LmJpbmQodGhpcykpOyAKKyAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5l
cigiY3V0IiwgdGhpcy5fY3V0LmJpbmQodGhpcykpOyAKKyAgICB0aGlzLmVsZW1lbnQuYWRkRXZl
bnRMaXN0ZW5lcigiYmVmb3JlcGFzdGUiLCB0aGlzLl9iZWZvcmVQYXN0ZS5iaW5kKHRoaXMpKTsg
CisgICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInBhc3RlIiwgdGhpcy5fcGFzdGUu
YmluZCh0aGlzKSk7IAorCisgICAgdGhpcy5fZGVzaXJlZENhcmV0Q29sdW1uID0gMDsKKyAgICB0
aGlzLl9zY3JvbGxMZWZ0ID0gMDsKKyAgICB0aGlzLl9zY3JvbGxUb3AgPSAwOworCisgICAgdGhp
cy5fY3R4ID0gdGhpcy5fY2FudmFzLmdldENvbnRleHQoIjJkIik7CisgICAgdGhpcy5fc2VsZWN0
aW9uID0gbmV3IFdlYkluc3BlY3Rvci5UZXh0U2VsZWN0aW9uTW9kZWwodGhpcy5fc2VsZWN0aW9u
Q2hhbmdlZC5iaW5kKHRoaXMpKTsKKyAgICB0aGlzLl9jdXJzb3IgPSBuZXcgV2ViSW5zcGVjdG9y
LlRleHRDdXJzb3IoY3Vyc29yRWxlbWVudCwgdGhpcy5fbGluZUhlaWdodCk7CisKKyAgICB0aGlz
Ll9pbml0Rm9udCgpOworCisgICAgdGhpcy5fcmVnaXN0ZXJTaG9ydGN1dHMoKTsKKyAgICAvLyBE
ZWJ1Z2dpbmcgZmxhZ3MsIGFsbG93IGRpc2FibGluZyAvIGVuYWJsaW5nIGhpZ2hsaWdodHMgYW5k
IHRyYWNrIHJlcGFpbnRzLgorICAgIHRoaXMuX2ltYWdlRGF0YUVuYWJsZWQgPSBmYWxzZTsKKyAg
ICB0aGlzLl9oaWdobGlnaHRpbmdFbmFibGVkID0gdHJ1ZTsKKyAgICB0aGlzLl9kZWJ1Z01vZGUg
PSBmYWxzZTsKK30KKworV2ViSW5zcGVjdG9yLlRleHRFZGl0b3IucHJvdG90eXBlID0geworICAg
IHNldFRleHQ6IGZ1bmN0aW9uKHRleHQpCisgICAgeworICAgICAgICB2YXIgbGFzdExpbmUgPSB0
aGlzLl90ZXh0TW9kZWwubGluZXNDb3VudCgpIC0gMTsKKyAgICAgICAgdGhpcy5fdGV4dE1vZGVs
LnNldFRleHQobnVsbCwgdGV4dCk7CisgICAgICAgIHRoaXMuX3RleHRNb2RlbC5yZXNldFVuZG9T
dGFjaygpOworICAgICAgICB0aGlzLl9zZXRDYXJldExvY2F0aW9uKDAsIDApOworICAgIH0sCisK
KyAgICBzZXRTZWxlY3Rpb246IGZ1bmN0aW9uKHN0YXJ0TGluZSwgc3RhcnRDb2x1bW4sIGVuZExp
bmUsIGVuZENvbHVtbikKKyAgICB7CisgICAgICAgIHZhciBzdGFydCA9IHRoaXMuX2ZpdChzdGFy
dExpbmUsIHN0YXJ0Q29sdW1uKTsKKyAgICAgICAgdGhpcy5fc2VsZWN0aW9uLnNldFN0YXJ0KHN0
YXJ0LmxpbmUsIHN0YXJ0LmNvbHVtbik7CisgICAgICAgIHRoaXMuX3NldFNlbGVjdGlvbkVuZChl
bmRMaW5lLCBlbmRDb2x1bW4pOworICAgIH0sCisKKyAgICByZXZlYWw6IGZ1bmN0aW9uKGxpbmUs
IGNvbHVtbikgeworICAgICAgICB2YXIgZmlyc3RMaW5lID0gdGhpcy5fc2Nyb2xsVG9wIC8gdGhp
cy5fbGluZUhlaWdodDsKKyAgICAgICAgdmFyIHZpc2libGVMaW5lcyA9IHRoaXMuX2NvbnRhaW5l
ci5jbGllbnRIZWlnaHQgLyB0aGlzLl9saW5lSGVpZ2h0OworICAgICAgICB2YXIgbWluVG9wID0g
KGxpbmUgLSB2aXNpYmxlTGluZXMgKyAxKSAqIHRoaXMuX2xpbmVIZWlnaHQgKyAzOworICAgICAg
ICB2YXIgbWF4VG9wID0gbGluZSAqIHRoaXMuX2xpbmVIZWlnaHQ7CisgICAgICAgIGlmICh0aGlz
Ll9zY3JvbGxUb3AgPCBtaW5Ub3ApCisgICAgICAgICAgICB0aGlzLl9jb250YWluZXIuc2Nyb2xs
VG9wID0gbWluVG9wOworICAgICAgICBpZiAodGhpcy5fc2Nyb2xsVG9wID4gbWF4VG9wKQorICAg
ICAgICAgICAgdGhpcy5fY29udGFpbmVyLnNjcm9sbFRvcCA9IG1heFRvcDsKKworICAgICAgICB2
YXIgZmlyc3RDb2x1bW4gPSB0aGlzLl9zY3JvbGxMZWZ0IC8gdGhpcy5fY2hhcldpZHRoOworICAg
ICAgICB2YXIgdmlzaWJsZUNvbHVtbnMgPSAodGhpcy5fY29udGFpbmVyLmNsaWVudFdpZHRoIC0g
dGhpcy5fbGluZU51bWJlck9mZnNldCkgLyB0aGlzLl9jaGFyV2lkdGg7CisgICAgICAgIHZhciBt
aW5MZWZ0ID0gKGNvbHVtbiAtIHZpc2libGVDb2x1bW5zICsgMSkgKiB0aGlzLl9jaGFyV2lkdGgg
KyB0aGlzLl9saW5lTnVtYmVyT2Zmc2V0OworICAgICAgICB2YXIgbWF4TGVmdCA9IGNvbHVtbiAq
IHRoaXMuX2NoYXJXaWR0aDsKKyAgICAgICAgaWYgKHRoaXMuX3Njcm9sbExlZnQgPCBtaW5MZWZ0
KQorICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLnNjcm9sbExlZnQgPSBtaW5MZWZ0ICsgdGhp
cy5fY2hhcldpZHRoICogMTU7CisgICAgICAgIGlmICh0aGlzLl9zY3JvbGxMZWZ0ID4gbWF4TGVm
dCkKKyAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5zY3JvbGxMZWZ0ID0gbWF4TGVmdDsKKyAg
ICB9LAorCisgICAgLy8gV2ViSW5zcGVjdG9yLlRleHRNb2RlbCBsaXN0ZW5lcgorICAgIF90ZXh0
Q2hhbmdlZDogZnVuY3Rpb24ob2xkUmFuZ2UsIG5ld1JhbmdlLCBvbGRUZXh0LCBuZXdUZXh0KQor
ICAgIHsKKyAgICAgICAgdGhpcy5fbXV0ZVNlbGVjdGlvbkxpc3RlbmVyID0gdHJ1ZTsKKyAgICAg
ICAgdGhpcy5fc2V0Q2FyZXRMb2NhdGlvbihuZXdSYW5nZS5lbmRMaW5lLCBuZXdSYW5nZS5lbmRD
b2x1bW4sIHRydWUpOworICAgICAgICBkZWxldGUgdGhpcy5fbXV0ZVNlbGVjdGlvbkxpc3RlbmVy
OworICAgICAgICBpZiAobmV3UmFuZ2UubGluZXNDb3VudCgpID09IG9sZFJhbmdlLmxpbmVzQ291
bnQoKSkKKyAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdGVMaW5lcyhuZXdSYW5nZS5zdGFydExp
bmUsIG5ld1JhbmdlLmVuZExpbmUgKyAxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgLy8g
TGluZXMgc2hpZnRlZCwgaW52YWxpZGF0ZSBhbGwgdW5kZXIgc3RhcnQgbGluZS4gQWxzbyBjbGVh
ciBsaW5lcyB0aGF0IG5vdyBhcmUgb3V0c2lkZSBtb2RlbCByYW5nZS4KKyAgICAgICAgICAgIHRo
aXMuX2ludmFsaWRhdGVMaW5lcyhuZXdSYW5nZS5zdGFydExpbmUsIHRoaXMuX3RleHRNb2RlbC5s
aW5lc0NvdW50KCkgKyBNYXRoLm1heCgwLCBvbGRSYW5nZS5lbmRMaW5lIC0gbmV3UmFuZ2UuZW5k
TGluZSkpOworCisgICAgICAgIHRoaXMuX2ludmFsaWRhdGVIaWdobGlnaHQobmV3UmFuZ2Uuc3Rh
cnRMaW5lKTsKKyAgICAgICAgdGhpcy5fdXBkYXRlU2l6ZSgpOworICAgICAgICB0aGlzLl9wYWlu
dCgpOworICAgIH0sCisKKyAgICAvLyBXZWJJbnNwZWN0b3IuVGV4dFNlbGVjdGlvbk1vZGVsIGxp
c3RlbmVyCisgICAgX3NlbGVjdGlvbkNoYW5nZWQ6IGZ1bmN0aW9uKG9sZFJhbmdlLCBuZXdSYW5n
ZSkKKyAgICB7CisgICAgICAgIHRoaXMuX2ludmFsaWRhdGVMaW5lcyhvbGRSYW5nZS5zdGFydExp
bmUsIG9sZFJhbmdlLmVuZExpbmUgKyAxKTsKKyAgICAgICAgdGhpcy5faW52YWxpZGF0ZUxpbmVz
KG5ld1JhbmdlLnN0YXJ0TGluZSwgbmV3UmFuZ2UuZW5kTGluZSArIDEpOworICAgICAgICBpZiAo
IXRoaXMuX211dGVTZWxlY3Rpb25MaXN0ZW5lcikKKyAgICAgICAgICAgIHRoaXMuX3BhaW50KCk7
CisgICAgfSwKKworICAgIF91cGRhdGVTaXplOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB2
YXIgbmV3TGluZU51bWJlckRpZ2l0cyA9IHRoaXMuX2RlY2ltYWxEaWdpdHModGhpcy5fdGV4dE1v
ZGVsLmxpbmVzQ291bnQoKSk7CisgICAgICAgIHRoaXMuX2xpbmVOdW1iZXJPZmZzZXQgPSAobmV3
TGluZU51bWJlckRpZ2l0cyArIDIpICogdGhpcy5fY2hhcldpZHRoOworCisgICAgICAgIHRoaXMu
X3NoZWV0LnN0eWxlLndpZHRoID0gKHRoaXMuX2NoYXJXaWR0aCAqIHRoaXMuX3RleHRNb2RlbC5j
b2x1bW5zQ291bnQoKSkgKyB0aGlzLl9saW5lTnVtYmVyT2Zmc2V0ICsgInB4IjsKKyAgICAgICAg
dGhpcy5fc2hlZXQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5fbGluZUhlaWdodCAqIHRoaXMuX3RleHRN
b2RlbC5saW5lc0NvdW50KCkgKyAicHgiOworCisgICAgICAgIGlmICh0aGlzLl9jYW52YXMud2lk
dGggIT09IHRoaXMuX2NvbnRhaW5lci5jbGllbnRXaWR0aCB8fCB0aGlzLl9jYW52YXMuaGVpZ2h0
ICE9PSB0aGlzLl9jb250YWluZXIuY2xpZW50SGVpZ2h0IHx8IG5ld0xpbmVOdW1iZXJEaWdpdHMg
IT09IHRoaXMuX2xpbmVOdW1iZXJEaWdpdHMpIHsKKyAgICAgICAgICAgIHRoaXMuX2xpbmVOdW1i
ZXJEaWdpdHMgPSBuZXdMaW5lTnVtYmVyRGlnaXRzOworICAgICAgICAgICAgdGhpcy5fcmVwYWlu
dEFsbCgpOworICAgICAgICB9CisgICAgfSwKKworICAgIF9yZXBhaW50QWxsOiBmdW5jdGlvbigp
CisgICAgeworICAgICAgICB0aGlzLl9jYW52YXMud2lkdGggPSB0aGlzLl9jb250YWluZXIuY2xp
ZW50V2lkdGg7CisgICAgICAgIHRoaXMuX2NhbnZhcy5oZWlnaHQgPSB0aGlzLl9jb250YWluZXIu
Y2xpZW50SGVpZ2h0OworICAgICAgICB0aGlzLl9pbnZhbGlkYXRlTGluZXMoMCwgdGhpcy5fdGV4
dE1vZGVsLmxpbmVzQ291bnQoKSk7CisgICAgICAgIHRoaXMuX3BhaW50KCk7CisgICAgICAgIHRo
aXMuX3VwZGF0ZUN1cnNvcih0aGlzLl9zZWxlY3Rpb24uZW5kTGluZSwgdGhpcy5fc2VsZWN0aW9u
LmVuZENvbHVtbik7CisgICAgfSwKKworICAgIF9pbnZhbGlkYXRlTGluZXM6IGZ1bmN0aW9uKHN0
YXJ0TGluZSwgZW5kTGluZSkKKyAgICB7CisgICAgICAgIGlmICghdGhpcy5fZGFtYWdlKQorICAg
ICAgICAgICAgdGhpcy5fZGFtYWdlID0gWyB7IHN0YXJ0TGluZTogc3RhcnRMaW5lLCBlbmRMaW5l
OiBlbmRMaW5lIH0gXTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmb3IgKHZhciBpID0g
MDsgaSA8IHRoaXMuX2RhbWFnZS5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIHZhciBj
aHVuayA9IHRoaXMuX2RhbWFnZVtpXTsKKyAgICAgICAgICAgICAgICBpZiAoY2h1bmsuc3RhcnRM
aW5lIDw9IGVuZExpbmUgJiYgY2h1bmsuZW5kTGluZSA+PSBzdGFydExpbmUpIHsKKyAgICAgICAg
ICAgICAgICAgICAgY2h1bmsuc3RhcnRMaW5lID0gTWF0aC5taW4oY2h1bmsuc3RhcnRMaW5lLCBz
dGFydExpbmUpOworICAgICAgICAgICAgICAgICAgICBjaHVuay5lbmRMaW5lID0gTWF0aC5tYXgo
Y2h1bmsuZW5kTGluZSwgZW5kTGluZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLl9kYW1hZ2Uu
cHVzaCh7IHN0YXJ0TGluZTogc3RhcnRMaW5lLCBlbmRMaW5lOiBlbmRMaW5lIH0pOworICAgICAg
ICB9CisgICAgfSwKKworICAgIF9wYWludDogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgZm9y
ICh2YXIgaSA9IDA7IHRoaXMuX2RhbWFnZSAmJiBpIDwgdGhpcy5fZGFtYWdlLmxlbmd0aDsgKytp
KQorICAgICAgICAgICAgdGhpcy5fcGFpbnRMaW5lcyh0aGlzLl9kYW1hZ2VbaV0uc3RhcnRMaW5l
LCB0aGlzLl9kYW1hZ2VbaV0uZW5kTGluZSk7CisgICAgICAgIGRlbGV0ZSB0aGlzLl9kYW1hZ2U7
CisgICAgfSwKKworICAgIF9wYWludExpbmVzOiBmdW5jdGlvbihmaXJzdExpbmUsIGxhc3RMaW5l
KQorICAgIHsKKyAgICAgICAgdGhpcy5fY3R4LmZvbnQgPSB0aGlzLl9mb250OworICAgICAgICB0
aGlzLl9jdHgudGV4dEJhc2VsaW5lID0gMDsKKworICAgICAgICBmaXJzdExpbmUgPSBNYXRoLm1h
eChmaXJzdExpbmUsIE1hdGguZmxvb3IodGhpcy5fc2Nyb2xsVG9wIC8gdGhpcy5fbGluZUhlaWdo
dCkgLSAxKTsKKyAgICAgICAgbGFzdExpbmUgPSBNYXRoLm1pbihsYXN0TGluZSwgTWF0aC5jZWls
KGZpcnN0TGluZSArIHRoaXMuX2NhbnZhcy5oZWlnaHQgLyB0aGlzLl9saW5lSGVpZ2h0KSArIDEp
OworCisgICAgICAgIGlmICh0aGlzLl9kZWJ1Z01vZGUpIHsKKyAgICAgICAgICAgIHRoaXMuX2N0
eC5maWxsU3R5bGUgPSAicmdiKDI1NSwyNTUsMCkiOworICAgICAgICAgICAgdmFyIGhlaWdodCA9
IE1hdGgubWluKHRoaXMuX2NhbnZhcy5oZWlnaHQsIChsYXN0TGluZSAtIGZpcnN0TGluZSkgKiB0
aGlzLl9saW5lSGVpZ2h0KTsKKyAgICAgICAgICAgIHRoaXMuX2N0eC5maWxsUmVjdCgwLCB0aGlz
Ll9saW5lSGVpZ2h0ICogZmlyc3RMaW5lIC0gdGhpcy5fc2Nyb2xsVG9wICsgMywgdGhpcy5fY2Fu
dmFzLndpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgdGhpcy5fY3R4LmZpbGxTdHlsZSA9ICJy
Z2IoMCwwLDApIjsKKyAgICAgICAgICAgIHNldFRpbWVvdXQodGhpcy5fcGFpbnRMaW5lc0NvbnRp
bnVhdGlvbi5iaW5kKHRoaXMsIGZpcnN0TGluZSwgbGFzdExpbmUpLCAxMDApOworICAgICAgICB9
IGVsc2UKKyAgICAgICAgICAgIHRoaXMuX3BhaW50TGluZXNDb250aW51YXRpb24oZmlyc3RMaW5l
LCBsYXN0TGluZSk7CisgICAgfSwKKworICAgIF9wYWludExpbmVzQ29udGludWF0aW9uOiBmdW5j
dGlvbihmaXJzdExpbmUsIGxhc3RMaW5lKSB7CisgICAgICAgIC8vIENsZWFyIGFsbC4KKyAgICAg
ICAgdmFyIGhlaWdodCA9IE1hdGgubWluKHRoaXMuX2NhbnZhcy5oZWlnaHQsIChsYXN0TGluZSAt
IGZpcnN0TGluZSkgKiB0aGlzLl9saW5lSGVpZ2h0KTsKKyAgICAgICAgdGhpcy5fY3R4LmZpbGxT
dHlsZSA9ICJyZ2IoMjU1LDI1NSwyNTUpIjsKKyAgICAgICAgdGhpcy5fY3R4LmZpbGxSZWN0KDAs
IHRoaXMuX2xpbmVIZWlnaHQgKiBmaXJzdExpbmUgLSB0aGlzLl9zY3JvbGxUb3AgKyAzLCB0aGlz
Ll9jYW52YXMud2lkdGgsIGhlaWdodCk7CisKKyAgICAgICAgbGFzdExpbmUgPSBNYXRoLm1pbihs
YXN0TGluZSwgdGhpcy5fdGV4dE1vZGVsLmxpbmVzQ291bnQoKSk7CisKKyAgICAgICAgLy8gUGFp
bnQgbGluZSBudW1iZXJzIGFuZCBzZXBhcmF0b3IuCisgICAgICAgIHRoaXMuX2N0eC5maWxsU3R5
bGUgPSAicmdiKDIzNSwyMzUsMjM1KSI7CisgICAgICAgIHRoaXMuX2N0eC5maWxsUmVjdCh0aGlz
Ll9saW5lTnVtYmVyT2Zmc2V0IC0gMiwgMCwgMSwgdGhpcy5fY2FudmFzLndpZHRoKTsKKyAgICAg
ICAgdGhpcy5fY3R4LmZpbGxTdHlsZSA9ICJyZ2IoMTU1LDE1NSwxNTUpIjsKKyAgICAgICAgZm9y
ICh2YXIgaSA9IGZpcnN0TGluZTsgaSA8IGxhc3RMaW5lOyArK2kpIHsKKyAgICAgICAgICAgIHRo
aXMuX2N0eC5maWxsVGV4dChpICsgMSwgKHRoaXMuX2xpbmVOdW1iZXJEaWdpdHMgLSB0aGlzLl9k
ZWNpbWFsRGlnaXRzKGkgKyAxKSArIDEpICogdGhpcy5fY2hhcldpZHRoLCB0aGlzLl9saW5lSGVp
Z2h0ICogKGkgKyAxKSAtIHRoaXMuX3Njcm9sbFRvcCk7CisgICAgICAgIH0KKworICAgICAgICAv
LyBDbGlwIGVkaXRvciBhcmVhLgorICAgICAgICB0aGlzLl9jdHguc2F2ZSgpOworICAgICAgICB0
aGlzLl9jdHguYmVnaW5QYXRoKCk7CisgICAgICAgIHRoaXMuX2N0eC5yZWN0KHRoaXMuX2xpbmVO
dW1iZXJPZmZzZXQgLSAxLCAwLCB0aGlzLl9jYW52YXMud2lkdGggLSB0aGlzLl9saW5lTnVtYmVy
T2Zmc2V0ICsgMSwgdGhpcy5fY2FudmFzLmhlaWdodCk7CisgICAgICAgIHRoaXMuX2N0eC5jbGlw
KCk7CisKKyAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGlvbi5zdGFydExpbmUgPT09IHRoaXMuX3Nl
bGVjdGlvbi5lbmRMaW5lICYmIGZpcnN0TGluZSA8PSB0aGlzLl9zZWxlY3Rpb24uc3RhcnRMaW5l
ICYmIHRoaXMuX3NlbGVjdGlvbi5zdGFydExpbmUgPCBsYXN0TGluZSkKKyAgICAgICAgICAgIHRo
aXMuX3BhaW50Q3VycmVudExpbmUodGhpcy5fc2VsZWN0aW9uLnN0YXJ0TGluZSk7CisKKyAgICAg
ICAgaWYgKHRoaXMuX2hpZ2hsaWdodGluZ0VuYWJsZWQpCisgICAgICAgICAgICB0aGlzLl9oaWdo
bGlnaHRlci5oaWdobGlnaHQoZmlyc3RMaW5lLCBsYXN0TGluZSk7CisKKyAgICAgICAgdGhpcy5f
cGFpbnRTZWxlY3Rpb24oZmlyc3RMaW5lLCBsYXN0TGluZSk7CisKKyAgICAgICAgZm9yICh2YXIg
aSA9IGZpcnN0TGluZTsgaSA8IGxhc3RMaW5lOyArK2kpIHsKKyAgICAgICAgICAgIHZhciBsaW5l
ID0gdGhpcy5fdGV4dE1vZGVsLmxpbmUoaSk7CisgICAgICAgICAgICBpZiAoIXRoaXMuX2hpZ2hs
aWdodGluZ0VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9jdHguZmlsbFRleHQobGlu
ZSwgdGhpcy5fbGluZU51bWJlck9mZnNldCAtIHRoaXMuX3Njcm9sbExlZnQsIHRoaXMuX2xpbmVI
ZWlnaHQgKiAoaSArIDEpIC0gdGhpcy5fc2Nyb2xsVG9wKTsKKyAgICAgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSB0aGlz
Ll90ZXh0TW9kZWwuZ2V0QXR0cmlidXRlcyhpLCAiaGlnaGxpZ2h0Iik7CisgICAgICAgICAgICB2
YXIgcGxhaW5UZXh0U3RhcnQgPSAtMTsKKyAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwg
bGluZS5sZW5ndGg7KSB7CisgICAgICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0
ZXMgJiYgYXR0cmlidXRlc1tqXTsKKyAgICAgICAgICAgICAgICBpZiAoIWF0dHJpYnV0ZSB8fCAh
YXR0cmlidXRlLnN0eWxlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwbGFpblRleHRTdGFy
dCA9PT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICBwbGFpblRleHRTdGFydCA9IGo7Cisg
ICAgICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgICAgICAgICBpZiAocGxhaW5UZXh0U3RhcnQgIT09IC0xKSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICB0aGlzLl9jdHguZmlsbFN0eWxlID0gInJnYigwLDAsMCkiOworICAgICAgICAg
ICAgICAgICAgICAgICAgdGhpcy5fY3R4LmZpbGxUZXh0KGxpbmUuc3Vic3RyaW5nKHBsYWluVGV4
dFN0YXJ0LCBqKSwgdGhpcy5fbGluZU51bWJlck9mZnNldCAtIHRoaXMuX3Njcm9sbExlZnQgKyBw
bGFpblRleHRTdGFydCAqIHRoaXMuX2NoYXJXaWR0aCwgdGhpcy5fbGluZUhlaWdodCAqIChpICsg
MSkgLSB0aGlzLl9zY3JvbGxUb3ApOworICAgICAgICAgICAgICAgICAgICAgICAgcGxhaW5UZXh0
U3RhcnQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0
aGlzLl9jdHguZmlsbFN0eWxlID0gYXR0cmlidXRlLnN0eWxlOworICAgICAgICAgICAgICAgICAg
ICB0aGlzLl9jdHguZmlsbFRleHQobGluZS5zdWJzdHJpbmcoaiwgaiArIGF0dHJpYnV0ZS5sZW5n
dGgpLCB0aGlzLl9saW5lTnVtYmVyT2Zmc2V0IC0gdGhpcy5fc2Nyb2xsTGVmdCArIGogKiB0aGlz
Ll9jaGFyV2lkdGgsIHRoaXMuX2xpbmVIZWlnaHQgKiAoaSArIDEpIC0gdGhpcy5fc2Nyb2xsVG9w
KTsKKyAgICAgICAgICAgICAgICAgICAgaiArPSBhdHRyaWJ1dGUubGVuZ3RoOworICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwbGFpblRleHRTdGFydCAh
PT0gLTEpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9jdHguZmlsbFN0eWxlID0gInJnYigwLDAs
MCkiOworICAgICAgICAgICAgICAgIHRoaXMuX2N0eC5maWxsVGV4dChsaW5lLnN1YnN0cmluZyhw
bGFpblRleHRTdGFydCwgbGluZS5sZW5ndGgpLCB0aGlzLl9saW5lTnVtYmVyT2Zmc2V0IC0gdGhp
cy5fc2Nyb2xsTGVmdCArIHBsYWluVGV4dFN0YXJ0ICogdGhpcy5fY2hhcldpZHRoLCB0aGlzLl9s
aW5lSGVpZ2h0ICogKGkgKyAxKSAtIHRoaXMuX3Njcm9sbFRvcCk7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICAgICAgdGhpcy5fY3R4LnJlc3RvcmUoKTsKKyAgICB9LAorCisgICAgX3Bh
aW50Q3VycmVudExpbmU6IGZ1bmN0aW9uKGxpbmUpCisgICAgeworICAgICAgICB0aGlzLl9jdHgu
ZmlsbFN0eWxlID0gInJnYigyMzIsIDI0MiwgMjU0KSI7CisgICAgICAgIHRoaXMuX2N0eC5maWxs
UmVjdCgwLCB0aGlzLl9saW5lSGVpZ2h0ICogbGluZSAtIHRoaXMuX3Njcm9sbFRvcCArIDMsIHRo
aXMuX2NhbnZhcy53aWR0aCwgdGhpcy5fbGluZUhlaWdodCk7CisgICAgICAgIHRoaXMuX2N0eC5m
aWxsU3R5bGUgPSAicmdiKDAsIDAsIDApIjsKKyAgICB9LAorCisgICAgX3Njcm9sbDogZnVuY3Rp
b24oZSkKKyAgICB7CisgICAgICAgIGlmICghdGhpcy5faW1hZ2VEYXRhRW5hYmxlZCkgeworICAg
ICAgICAgICAgdGhpcy5fc2Nyb2xsVG9wID0gdGhpcy5fY29udGFpbmVyLnNjcm9sbFRvcDsKKyAg
ICAgICAgICAgIHRoaXMuX3Njcm9sbExlZnQgPSB0aGlzLl9jb250YWluZXIuc2Nyb2xsTGVmdDsK
KyAgICAgICAgICAgIHRoaXMuX3JlcGFpbnRBbGwoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgfQorCisgICAgICAgIC8vIENvZGUgYmVsb3cgaXMgYW4gZXhwZXJpbWVudCB0aGF0IGNv
cGllcyB2YWxpZCBhcmVhcyBvbiBzY3JvbGwuCisgICAgICAgIC8vIENhbiBiZSB0b2dnbGVkIHZp
YSBDdHJsICsgQWx0ICsgRS4KKyAgICAgICAgdmFyIHNjcm9sbFRvcERlbHRhID0gdGhpcy5fY29u
dGFpbmVyLnNjcm9sbFRvcCAtIHRoaXMuX3Njcm9sbFRvcDsKKyAgICAgICAgdmFyIHNjcm9sbExl
ZnREZWx0YSA9IHRoaXMuX2NvbnRhaW5lci5zY3JvbGxMZWZ0IC0gdGhpcy5fc2Nyb2xsTGVmdDsK
KyAgICAgICAgdmFyIGRhdGEgPSB0aGlzLl9jdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHRoaXMuX2Nh
bnZhcy53aWR0aCwgdGhpcy5fY2FudmFzLmhlaWdodCk7CisgICAgICAgIHRoaXMuX2N0eC5wdXRJ
bWFnZURhdGEoZGF0YSwgLXNjcm9sbExlZnREZWx0YSwgLXNjcm9sbFRvcERlbHRhKTsKKworICAg
ICAgICBpZiAoc2Nyb2xsVG9wRGVsdGEgPiAwKSB7CisgICAgICAgICAgICB2YXIgb2xkTGFzdFZp
c2libGUgPSBNYXRoLmZsb29yKCh0aGlzLl9zY3JvbGxUb3AgKyB0aGlzLl9jYW52YXMuaGVpZ2h0
KSAvIHRoaXMuX2xpbmVIZWlnaHQpOworICAgICAgICAgICAgdmFyIG5ld0xhc3RWaXNpYmxlID0g
TWF0aC5jZWlsKCh0aGlzLl9jb250YWluZXIuc2Nyb2xsVG9wICsgdGhpcy5fY2FudmFzLmhlaWdo
dCkgLyB0aGlzLl9saW5lSGVpZ2h0KSArIDE7CisgICAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRl
TGluZXMob2xkTGFzdFZpc2libGUsIG5ld0xhc3RWaXNpYmxlKTsKKyAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgIHZhciBvbGRGaXJzdFZpc2libGUgPSBNYXRoLmNlaWwodGhpcy5fc2Nyb2xs
VG9wIC8gdGhpcy5fbGluZUhlaWdodCk7CisgICAgICAgICAgICB2YXIgbmV3Rmlyc3RWaXNpYmxl
ID0gTWF0aC5jZWlsKHRoaXMuX2NvbnRhaW5lci5zY3JvbGxUb3AgLyB0aGlzLl9saW5lSGVpZ2h0
KSAtIDE7CisgICAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRlTGluZXMobmV3Rmlyc3RWaXNpYmxl
LCBvbGRGaXJzdFZpc2libGUpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5fc2Nyb2xsVG9w
ICs9IHNjcm9sbFRvcERlbHRhOworICAgICAgICB0aGlzLl9zY3JvbGxMZWZ0ICs9IHNjcm9sbExl
ZnREZWx0YTsKKworICAgICAgICB0aGlzLl9wYWludCgpOworICAgIH0sCisKKyAgICBfbW91c2VV
cDogZnVuY3Rpb24oZSkKKyAgICB7CisgICAgICAgIHRoaXMuX2lzRHJhZ2dpbmcgPSBmYWxzZTsK
KyAgICB9LAorCisgICAgX21vdXNlRG93bjogZnVuY3Rpb24oZSkKKyAgICB7CisgICAgICAgIHZh
ciBsb2NhdGlvbiA9IHRoaXMuX2NhcmV0Rm9yTW91c2VFdmVudChlKTsKKyAgICAgICAgdGhpcy5f
c2V0Q2FyZXRMb2NhdGlvbihsb2NhdGlvbi5saW5lLCBsb2NhdGlvbi5jb2x1bW4pOworICAgICAg
ICB0aGlzLl9pc0RyYWdnaW5nID0gdHJ1ZTsKKyAgICAgICAgdGhpcy5fdGV4dE1vZGVsLm1hcmtV
bmRvYWJsZVN0YXRlKCk7CisgICAgfSwKKworICAgIF9tb3VzZU1vdmU6IGZ1bmN0aW9uKGUpCisg
ICAgeworICAgICAgICBpZiAoIXRoaXMuX2lzRHJhZ2dpbmcpCisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIHZhciBsb2NhdGlvbiA9IHRoaXMuX2NhcmV0Rm9yTW91c2VFdmVudChlKTsKKyAg
ICAgICAgdGhpcy5fc2V0U2VsZWN0aW9uRW5kKGxvY2F0aW9uLmxpbmUsIGxvY2F0aW9uLmNvbHVt
bikKKyAgICB9LAorCisgICAgX21vdXNlT3V0OiBmdW5jdGlvbihlKQorICAgIHsKKyAgICAgICAg
dGhpcy5faXNEcmFnZ2luZyA9IGZhbHNlOworICAgIH0sCisKKyAgICBfZGJsQ2xpY2s6IGZ1bmN0
aW9uKGUpCisgICAgeworICAgICAgICB2YXIgbG9jYXRpb24gPSB0aGlzLl9jYXJldEZvck1vdXNl
RXZlbnQoZSk7CisgICAgICAgIHZhciByYW5nZSA9IHRoaXMuX3RleHRNb2RlbC53b3JkUmFuZ2Uo
bG9jYXRpb24ubGluZSwgbG9jYXRpb24uY29sdW1uKTsKKyAgICAgICAgdGhpcy5zZXRTZWxlY3Rp
b24ocmFuZ2Uuc3RhcnRMaW5lLCByYW5nZS5zdGFydENvbHVtbiwgcmFuZ2UuZW5kTGluZSwgcmFu
Z2UuZW5kQ29sdW1uKTsKKyAgICB9LAorCisgICAgX2NhcmV0Rm9yTW91c2VFdmVudDogZnVuY3Rp
b24oZSkKKyAgICB7CisgICAgICAgIHZhciBsaW5lID0gTWF0aC5mbG9vcigoZS55ICsgdGhpcy5f
c2Nyb2xsVG9wIC0gNCkgLyB0aGlzLl9saW5lSGVpZ2h0KTsKKyAgICAgICAgdmFyIGNvbHVtbiA9
IE1hdGguZmxvb3IoKGUueCArIHRoaXMuX3Njcm9sbExlZnQgLSB0aGlzLl9saW5lTnVtYmVyT2Zm
c2V0KSAvIHRoaXMuX2NoYXJXaWR0aCk7CisgICAgICAgIHJldHVybiB7IGxpbmU6IGxpbmUsIGNv
bHVtbjogY29sdW1uIH07CisgICAgfSwKKworICAgIF9rZXlEb3duOiBmdW5jdGlvbihlKQorICAg
IHsKKyAgICAgICAgdmFyIHNob3J0Y3V0S2V5ID0gV2ViSW5zcGVjdG9yLktleWJvYXJkU2hvcnRj
dXQubWFrZUtleUZyb21FdmVudChlKTsKKyAgICAgICAgdmFyIGhhbmRsZXIgPSB0aGlzLl9zaG9y
dGN1dHNbc2hvcnRjdXRLZXldOworICAgICAgICBpZiAoaGFuZGxlcikgeworICAgICAgICAgICAg
aGFuZGxlci5jYWxsKHRoaXMpOworICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOworICAg
ICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgfQorCisgICAgICAgIGlmICh0aGlzLl9oYW5kbGVOYXZpZ2F0aW9uS2V5KGUpKSB7CisgICAg
ICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlv
bigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGtleUNv
ZGVzID0gV2ViSW5zcGVjdG9yLktleWJvYXJkU2hvcnRjdXQuS2V5Q29kZXM7CisgICAgICAgIHN3
aXRjaCAoZS5rZXlDb2RlKSB7CisgICAgICAgICAgICBjYXNlIGtleUNvZGVzLkJhY2tzcGFjZToK
KyAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVCYWNrc3BhY2VLZXkoKTsKKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga2V5Q29kZXMuRGVsZXRlOgorICAgICAgICAg
ICAgICAgIHRoaXMuX2hhbmRsZURlbGV0ZUtleSgpOworICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgY2FzZSBrZXlDb2Rlcy5UYWI6CisgICAgICAgICAgICAgICAgdmFyIHJhbmdl
ID0gdGhpcy5fc2VsZWN0aW9uLnJhbmdlKCk7CisgICAgICAgICAgICAgICAgdGhpcy5fdGV4dE1v
ZGVsLnNldFRleHQocmFuZ2UsICJcdCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgY2FzZSBrZXlDb2Rlcy5FbnRlcjoKKyAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSB0
aGlzLl9zZWxlY3Rpb24ucmFuZ2UoKTsKKyAgICAgICAgICAgICAgICB0aGlzLl90ZXh0TW9kZWwu
c2V0VGV4dChyYW5nZSwgIlxuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAg
IGUucHJldmVudERlZmF1bHQoKTsKKyAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKKyAgICB9
LAorCisgICAgX2hhbmRsZU5hdmlnYXRpb25LZXk6IGZ1bmN0aW9uKGUpCisgICAgeworICAgICAg
ICB2YXIgY2FyZXRMaW5lID0gdGhpcy5fc2VsZWN0aW9uLmVuZExpbmU7CisgICAgICAgIHZhciBj
YXJldENvbHVtbiA9IHRoaXMuX3NlbGVjdGlvbi5lbmRDb2x1bW47CisgICAgICAgIHZhciBhcnJv
d0FjdGlvbiA9IGUuc2hpZnRLZXkgPyB0aGlzLl9zZXRTZWxlY3Rpb25FbmQgOiB0aGlzLl9zZXRD
YXJldExvY2F0aW9uOworCisgICAgICAgIHZhciBrZXlDb2RlcyA9IFdlYkluc3BlY3Rvci5LZXli
b2FyZFNob3J0Y3V0LktleUNvZGVzOworICAgICAgICBzd2l0Y2ggKGUua2V5Q29kZSkgeworICAg
ICAgICAgICAgY2FzZSBrZXlDb2Rlcy5VcDoKKyAgICAgICAgICAgIGNhc2Uga2V5Q29kZXMuUGFn
ZVVwOgorICAgICAgICAgICAgICAgIGlmIChlLm1ldGFLZXkpCisgICAgICAgICAgICAgICAgICAg
IGFycm93QWN0aW9uLmNhbGwodGhpcywgMCwgMCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgZWxz
ZSBpZiAoZS5jdHJsS2V5KQorICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb250YWluZXIuc2Ny
b2xsVG9wIC09IHRoaXMuX2xpbmVIZWlnaHQ7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAg
ICAgICAgICAgICAgICAgIHZhciBqdW1wID0gZS5rZXlDb2RlID09PSBrZXlDb2Rlcy5VcCA/IDEg
OiBNYXRoLmZsb29yKHRoaXMuX2NhbnZhcy5oZWlnaHQgLyB0aGlzLl9saW5lSGVpZ2h0KTsKKyAg
ICAgICAgICAgICAgICAgICAgYXJyb3dBY3Rpb24uY2FsbCh0aGlzLCBjYXJldExpbmUgLSBqdW1w
LCB0aGlzLl9kZXNpcmVkQ2FyZXRDb2x1bW4sIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga2V5Q29kZXMuRG93bjoKKyAg
ICAgICAgICAgIGNhc2Uga2V5Q29kZXMuUGFnZURvd246CisgICAgICAgICAgICAgICAgaWYgKGUu
bWV0YUtleSkKKyAgICAgICAgICAgICAgICAgICAgYXJyb3dBY3Rpb24uY2FsbCh0aGlzLCB0aGlz
Ll90ZXh0TW9kZWwubGluZXNDb3VudCgpIC0gMSwgdGhpcy5fdGV4dE1vZGVsLmxpbmVMZW5ndGgo
dGhpcy5fdGV4dE1vZGVsLmxpbmVzQ291bnQoKSAtIDEpLCB0cnVlKTsKKyAgICAgICAgICAgICAg
ICBlbHNlIGlmIChlLmN0cmxLZXkpCisgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5l
ci5zY3JvbGxUb3AgKz0gdGhpcy5fbGluZUhlaWdodDsKKyAgICAgICAgICAgICAgICBlbHNlIHsK
KyAgICAgICAgICAgICAgICAgICAgdmFyIGp1bXAgPSBlLmtleUNvZGUgPT09IGtleUNvZGVzLkRv
d24gPyAxIDogTWF0aC5mbG9vcih0aGlzLl9jYW52YXMuaGVpZ2h0IC8gdGhpcy5fbGluZUhlaWdo
dCk7CisgICAgICAgICAgICAgICAgICAgIGFycm93QWN0aW9uLmNhbGwodGhpcywgY2FyZXRMaW5l
ICsganVtcCwgdGhpcy5fZGVzaXJlZENhcmV0Q29sdW1uLCB0cnVlKTsKKyAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtleUNvZGVzLkxl
ZnQ6CisgICAgICAgICAgICAgICAgaWYgKCFlLnNoaWZ0S2V5ICYmICFlLm1ldGFLZXkgJiYgIXRo
aXMuX2lzQWx0Q3RybChlKSAmJiAhdGhpcy5fc2VsZWN0aW9uLmlzRW1wdHkoKSkgeworICAgICAg
ICAgICAgICAgICAgICAvLyBSZXNldCBzZWxlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgdmFy
IHJhbmdlID0gdGhpcy5fc2VsZWN0aW9uLnJhbmdlKCk7CisgICAgICAgICAgICAgICAgICAgIHRo
aXMuX3NldENhcmV0TG9jYXRpb24ocmFuZ2Uuc3RhcnRMaW5lLCByYW5nZS5zdGFydENvbHVtbik7
CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLm1ldGFLZXkpCisgICAgICAgICAgICAgICAg
ICAgIGFycm93QWN0aW9uLmNhbGwodGhpcywgdGhpcy5fc2VsZWN0aW9uLmVuZExpbmUsIDApOwor
ICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNhcmV0Q29sdW1uID09PSAwICYmIGNhcmV0TGluZSA+
IDApCisgICAgICAgICAgICAgICAgICAgIGFycm93QWN0aW9uLmNhbGwodGhpcywgY2FyZXRMaW5l
IC0gMSwgdGhpcy5fdGV4dE1vZGVsLmxpbmVMZW5ndGgoY2FyZXRMaW5lIC0gMSkpOworICAgICAg
ICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX2lzQWx0Q3RybChlKSkgeworICAgICAgICAgICAgICAg
ICAgICBjYXJldENvbHVtbiA9IHRoaXMuX3RleHRNb2RlbC53b3JkU3RhcnQodGhpcy5fc2VsZWN0
aW9uLmVuZExpbmUsIHRoaXMuX3NlbGVjdGlvbi5lbmRDb2x1bW4pOworICAgICAgICAgICAgICAg
ICAgICBpZiAoY2FyZXRDb2x1bW4gPT09IHRoaXMuX3NlbGVjdGlvbi5lbmRDb2x1bW4pCisgICAg
ICAgICAgICAgICAgICAgICAgICBjYXJldENvbHVtbiA9IDA7CisgICAgICAgICAgICAgICAgICAg
IGFycm93QWN0aW9uLmNhbGwodGhpcywgY2FyZXRMaW5lLCBjYXJldENvbHVtbik7CisgICAgICAg
ICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIGFycm93QWN0aW9uLmNhbGwodGhp
cywgY2FyZXRMaW5lLCBjYXJldENvbHVtbiAtIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgY2FzZSBrZXlDb2Rlcy5SaWdodDoKKyAgICAgICAgICAgICAgICB2YXIgbGlu
ZSA9IHRoaXMuX3RleHRNb2RlbC5saW5lKGNhcmV0TGluZSk7CisgICAgICAgICAgICAgICAgaWYg
KCFlLnNoaWZ0S2V5ICYmICFlLm1ldGFLZXkgJiYgIXRoaXMuX2lzQWx0Q3RybChlKSAmJiAhdGhp
cy5fc2VsZWN0aW9uLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCBz
ZWxlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5fc2VsZWN0aW9u
LnJhbmdlKCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NldENhcmV0TG9jYXRpb24ocmFu
Z2UuZW5kTGluZSwgcmFuZ2UuZW5kQ29sdW1uKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYg
KGUubWV0YUtleSkKKyAgICAgICAgICAgICAgICAgICAgYXJyb3dBY3Rpb24uY2FsbCh0aGlzLCB0
aGlzLl9zZWxlY3Rpb24uZW5kTGluZSwgdGhpcy5fdGV4dE1vZGVsLmxpbmVMZW5ndGgodGhpcy5f
c2VsZWN0aW9uLmVuZExpbmUpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChjYXJldENvbHVt
biA9PT0gbGluZS5sZW5ndGggJiYgY2FyZXRMaW5lIDwgdGhpcy5fdGV4dE1vZGVsLmxpbmVzQ291
bnQoKSAtIDEpCisgICAgICAgICAgICAgICAgICAgIGFycm93QWN0aW9uLmNhbGwodGhpcywgY2Fy
ZXRMaW5lICsgMSwgMCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5faXNBbHRDdHJs
KGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhcmV0Q29sdW1uID0gdGhpcy5fdGV4dE1vZGVs
LndvcmRFbmQodGhpcy5fc2VsZWN0aW9uLmVuZExpbmUsIHRoaXMuX3NlbGVjdGlvbi5lbmRDb2x1
bW4pOworICAgICAgICAgICAgICAgICAgICBpZiAoY2FyZXRDb2x1bW4gPT09IHRoaXMuX3NlbGVj
dGlvbi5lbmRDb2x1bW4pCisgICAgICAgICAgICAgICAgICAgICAgICBjYXJldENvbHVtbiA9IGxp
bmUubGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBhcnJvd0FjdGlvbi5jYWxsKHRoaXMsIGNh
cmV0TGluZSwgY2FyZXRDb2x1bW4pOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAg
ICAgICAgICAgICBhcnJvd0FjdGlvbi5jYWxsKHRoaXMsIGNhcmV0TGluZSwgY2FyZXRDb2x1bW4g
KyAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuX3RleHRN
b2RlbC5tYXJrVW5kb2FibGVTdGF0ZSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9LAor
CisgICAgX3RleHRJbnB1dDogZnVuY3Rpb24oZSkKKyAgICB7CisgICAgICAgIHZhciByYW5nZSA9
IHRoaXMuX3NlbGVjdGlvbi5yYW5nZSgpOworICAgICAgICBpZiAoZS5kYXRhICYmICFlLmFsdEtl
eSAmJiAhZS5jdHJsS2V5ICYmICFlLm1ldGFLZXkpIHsKKyAgICAgICAgICAgIHRoaXMuX3RleHRN
b2RlbC5zZXRUZXh0KHJhbmdlLCBlLmRhdGEpOworICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVs
dCgpOworICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKKyAgICAgICAgfQorICAgIH0s
CisKKyAgICBfc2V0Q2FyZXRMb2NhdGlvbjogZnVuY3Rpb24obGluZSwgY29sdW1uLCB1cGRvd24p
CisgICAgeworICAgICAgICB0aGlzLnNldFNlbGVjdGlvbihsaW5lLCBjb2x1bW4sIGxpbmUsIGNv
bHVtbiwgdXBkb3duKTsKKyAgICB9LAorCisgICAgX3NldFNlbGVjdGlvbkVuZDogZnVuY3Rpb24o
bGluZSwgY29sdW1uLCB1cGRvd24pCisgICAgeworICAgICAgICBpZiAoIXVwZG93bikKKyAgICAg
ICAgICAgIHRoaXMuX2Rlc2lyZWRDYXJldENvbHVtbiA9IGNvbHVtbjsKKworICAgICAgICB2YXIg
ZW5kID0gdGhpcy5fZml0KGxpbmUsIGNvbHVtbik7CisgICAgICAgIHRoaXMuX3NlbGVjdGlvbi5z
ZXRFbmQoZW5kLmxpbmUsIGVuZC5jb2x1bW4pOworICAgICAgICB0aGlzLnJldmVhbCh0aGlzLl9z
ZWxlY3Rpb24uZW5kTGluZSwgdGhpcy5fc2VsZWN0aW9uLmVuZENvbHVtbik7CisgICAgICAgIHRo
aXMuX3VwZGF0ZUN1cnNvcihlbmQubGluZSwgZW5kLmNvbHVtbik7CisgICAgfSwKKworICAgIF91
cGRhdGVDdXJzb3I6IGZ1bmN0aW9uKGxpbmUsIGNvbHVtbikKKyAgICB7CisgICAgICAgIGlmIChj
b2x1bW4gKiB0aGlzLl9jaGFyV2lkdGggPj0gdGhpcy5fY29udGFpbmVyLnNjcm9sbExlZnQpCisg
ICAgICAgICAgICB0aGlzLl9jdXJzb3Iuc2V0TG9jYXRpb24odGhpcy5fbGluZU51bWJlck9mZnNl
dCArIGNvbHVtbiAqIHRoaXMuX2NoYXJXaWR0aCAtIDEsIGxpbmUgKiB0aGlzLl9saW5lSGVpZ2h0
ICsgMyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRoaXMuX2N1cnNvci5zZXRMb2NhdGlv
bigwLCAwKTsKKyAgICB9LAorCisgICAgX2ZpdDogZnVuY3Rpb24obGluZSwgY29sdW1uKQorICAg
IHsKKyAgICAgICAgbGluZSA9IE1hdGgubWF4KDAsIE1hdGgubWluKGxpbmUsIHRoaXMuX3RleHRN
b2RlbC5saW5lc0NvdW50KCkgLSAxKSk7CisgICAgICAgIHZhciBsaW5lTGVuZ3RoID0gdGhpcy5f
dGV4dE1vZGVsLmxpbmVMZW5ndGgobGluZSk7CisgICAgICAgIGNvbHVtbiA9IE1hdGgubWF4KDAs
IE1hdGgubWluKGNvbHVtbiwgbGluZUxlbmd0aCkpOworICAgICAgICByZXR1cm4geyBsaW5lOiBs
aW5lLCBjb2x1bW46IGNvbHVtbiB9OworICAgIH0sCisKKyAgICBfaW52YWxpZGF0ZUhpZ2hsaWdo
dDogZnVuY3Rpb24oc3RhcnRMaW5lKQorICAgIHsKKyAgICAgICAgaWYgKCF0aGlzLl9oaWdobGln
aHRpbmdFbmFibGVkKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB2YXIgZmlyc3RWaXNp
YmxlTGluZSA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IodGhpcy5fc2Nyb2xsVG9wIC8gdGhpcy5f
bGluZUhlaWdodCkgLSAxKTsKKyAgICAgICAgdmFyIGxhc3RWaXNpYmxlTGluZSA9IE1hdGgubWlu
KHRoaXMuX3RleHRNb2RlbC5saW5lc0NvdW50KCksIE1hdGguY2VpbChmaXJzdFZpc2libGVMaW5l
ICsgdGhpcy5fY2FudmFzLmhlaWdodCAvIHRoaXMuX2xpbmVIZWlnaHQgKyAxKSk7CisKKyAgICAg
ICAgdmFyIGRhbWFnZSA9IHRoaXMuX2hpZ2hsaWdodGVyLmhpZ2hsaWdodChzdGFydExpbmUsIGxh
c3RWaXNpYmxlTGluZSk7CisgICAgICAgIGZvciAodmFyIGxpbmUgaW4gZGFtYWdlKQorICAgICAg
ICAgICAgdGhpcy5faW52YWxpZGF0ZUxpbmVzKGxpbmUsIHBhcnNlSW50KGxpbmUpICsgMSk7Cisg
ICAgfSwKKworICAgIF9wYWludFNlbGVjdGlvbjogZnVuY3Rpb24oZmlyc3RMaW5lLCBsYXN0TGlu
ZSkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl9zZWxlY3Rpb24uaXNFbXB0eSgpKQorICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLl9zZWxlY3Rpb24ucmFuZ2Uo
KTsKKyAgICAgICAgdGhpcy5fY3R4LmZpbGxTdHlsZSA9ICJyZ2IoMTgxLCAyMTMsIDI1NSkiOwor
CisgICAgICAgIGZpcnN0TGluZSA9IE1hdGgubWF4KGZpcnN0TGluZSwgcmFuZ2Uuc3RhcnRMaW5l
KTsKKyAgICAgICAgZW5kTGluZSA9IE1hdGgubWluKGxhc3RMaW5lLCByYW5nZS5lbmRMaW5lICsg
MSk7CisKKyAgICAgICAgZm9yICh2YXIgaSA9IGZpcnN0TGluZTsgaSA8IGVuZExpbmU7ICsraSkg
eworICAgICAgICAgICAgdmFyIGxpbmUgPSB0aGlzLl90ZXh0TW9kZWwubGluZShpKTsKKyAgICAg
ICAgICAgIHZhciBmcm9tLCB0bzsKKworICAgICAgICAgICAgaWYgKGkgPT09IHJhbmdlLnN0YXJ0
TGluZSkKKyAgICAgICAgICAgICAgICBmcm9tID0gTWF0aC5taW4obGluZS5sZW5ndGgsIHJhbmdl
LnN0YXJ0Q29sdW1uKSAqIHRoaXMuX2NoYXJXaWR0aCAtIHRoaXMuX3Njcm9sbExlZnQgKyB0aGlz
Ll9saW5lTnVtYmVyT2Zmc2V0IC0gMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAg
ICBmcm9tID0gMDsKKworICAgICAgICAgICAgaWYgKGkgPT09IHJhbmdlLmVuZExpbmUpCisgICAg
ICAgICAgICAgICAgdG8gPSBNYXRoLm1pbihyYW5nZS5lbmRDb2x1bW4sIGxpbmUubGVuZ3RoKSAq
IHRoaXMuX2NoYXJXaWR0aCAtIHRoaXMuX3Njcm9sbExlZnQgKyB0aGlzLl9saW5lTnVtYmVyT2Zm
c2V0IC0gMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0byA9IHRoaXMuX2Nh
bnZhcy53aWR0aDsKKworICAgICAgICAgICAgdGhpcy5fY3R4LmZpbGxSZWN0KGZyb20sIHRoaXMu
X2xpbmVIZWlnaHQgKiBpIC0gdGhpcy5fc2Nyb2xsVG9wICsgMywgdG8gLSBmcm9tLCB0aGlzLl9s
aW5lSGVpZ2h0KTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLl9jdHguZmlsbFN0eWxlID0gInJn
YigwLCAwLCAwKSI7CisgICAgfSwKKworICAgIF9iZWZvcmVDb3B5OiBmdW5jdGlvbihlKQorICAg
IHsKKyAgICAgICAgaWYgKCF0aGlzLl9zZWxlY3Rpb24uaXNFbXB0eSgpKQorICAgICAgICAgICAg
ZS5wcmV2ZW50RGVmYXVsdCgpOworICAgIH0sCisKKyAgICBfY29weTogZnVuY3Rpb24oZSkKKyAg
ICB7CisgICAgICAgIHZhciBzZWxlY3Rpb24gPSB0aGlzLl9zZWxlY3Rpb24ucmFuZ2UoKTsKKyAg
ICAgICAgdmFyIHRleHQgPSB0aGlzLl90ZXh0TW9kZWwuY29weVJhbmdlKHNlbGVjdGlvbik7CisK
KyAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgICBlLmNsaXBib2FyZERhdGEuY2xl
YXJEYXRhKCk7CisgICAgICAgIGUuY2xpcGJvYXJkRGF0YS5zZXREYXRhKCJ0ZXh0L3BsYWluIiwg
dGV4dCk7CisgICAgfSwKKworICAgIF9iZWZvcmVDdXQ6IGZ1bmN0aW9uKGUpCisgICAgeworICAg
ICAgICBpZiAoIXRoaXMuX3NlbGVjdGlvbi5pc0VtcHR5KCkpCisgICAgICAgICAgICBlLnByZXZl
bnREZWZhdWx0KCk7CisgICAgfSwKKworICAgIF9jdXQ6IGZ1bmN0aW9uKGUpCisgICAgeworICAg
ICAgICB2YXIgcmFuZ2UgPSB0aGlzLl9zZWxlY3Rpb24ucmFuZ2UoKTsKKyAgICAgICAgdmFyIHRl
eHQgPSB0aGlzLl90ZXh0TW9kZWwuY3V0UmFuZ2UocmFuZ2UpOworICAgICAgICBlLnByZXZlbnRE
ZWZhdWx0KCk7CisgICAgICAgIGUuY2xpcGJvYXJkRGF0YS5jbGVhckRhdGEoKTsKKyAgICAgICAg
ZS5jbGlwYm9hcmREYXRhLnNldERhdGEoInRleHQvcGxhaW4iLCB0ZXh0KTsKKyAgICB9LAorCisg
ICAgX2JlZm9yZVBhc3RlOiBmdW5jdGlvbihlKQorICAgIHsKKyAgICAgICAgZS5wcmV2ZW50RGVm
YXVsdCgpOworICAgIH0sCisKKyAgICBfcGFzdGU6IGZ1bmN0aW9uKGUpCisgICAgeworICAgICAg
ICB2YXIgcmFuZ2UgPSB0aGlzLl9zZWxlY3Rpb24ucmFuZ2UoKTsKKyAgICAgICAgdmFyIG5ld1Jh
bmdlID0gdGhpcy5fdGV4dE1vZGVsLnNldFRleHQocmFuZ2UsIGUuY2xpcGJvYXJkRGF0YS5nZXRE
YXRhKCJUZXh0IikpOworICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CisgICAgfSwKKworICAg
IF9zZWxlY3RBbGw6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIHRoaXMuX3NlbGVjdGlvbi5z
ZXRTdGFydCgwLCAwKTsKKyAgICAgICAgdmFyIGxhc3RMaW5lTnVtID0gdGhpcy5fdGV4dE1vZGVs
LmxpbmVzQ291bnQoKSAtIDE7CisgICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uKDAsIDAsIGxhc3RM
aW5lTnVtLCB0aGlzLl90ZXh0TW9kZWwubGluZUxlbmd0aChsYXN0TGluZU51bSkpOworICAgIH0s
CisKKyAgICBfZGVjaW1hbERpZ2l0czogZnVuY3Rpb24obnVtYmVyKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIE1hdGguY2VpbChNYXRoLmxvZyhudW1iZXIgKyAxKSAvIE1hdGgubG9nKDEwKSk7Cisg
ICAgfSwKKworICAgIF9pbml0Rm9udDogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgdGhpcy5f
Zm9udCA9ICIxMHB4IG1vbm9zcGFjZSI7CisgICAgICAgIHRoaXMuX2lzTWFjID0gbmF2aWdhdG9y
LnVzZXJBZ2VudC5pbmRleE9mKCJNYWMgT1MiKSAhPT0gLTE7CisgICAgICAgIHRoaXMuX2lzV2lu
ID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJXaW5kb3dzIikgIT09IC0xOworICAgICAg
ICB0aGlzLl9pc0xpbnV4ID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJMaW51eCIpICE9
PSAtMTsKKworICAgICAgICBpZiAodGhpcy5faXNNYWMpCisgICAgICAgICAgICB0aGlzLl9mb250
ID0gIjEwcHggTW9uYWNvIjsKKyAgICAgICAgZWxzZSBpZiAodGhpcy5faXNXaW4pCisgICAgICAg
ICAgICB0aGlzLl9mb250ID0gIjEycHggQ291cmllciBOZXciOworICAgICAgICBlbHNlIGlmICh0
aGlzLl9pc0xpbnV4KQorICAgICAgICAgICAgdGhpcy5fZm9udCA9ICIxMHB4IERyb2lkIFNhbnMg
TW9ubyI7CisKKyAgICAgICAgdGhpcy5fY3R4LmZvbnQgPSB0aGlzLl9mb250OworICAgICAgICB0
aGlzLl9jaGFyV2lkdGggPSB0aGlzLl9jdHgubWVhc3VyZVRleHQoImEiKS53aWR0aDsKKyAgICB9
LAorCisgICAgX2lzTWV0YUN0cmw6IGZ1bmN0aW9uKGUpCisgICAgeworICAgICAgICByZXR1cm4g
dGhpcy5faXNNYWMgPyBlLm1ldGFLZXkgOiBlLmN0cmxLZXk7CisgICAgfSwKKworICAgIF9pc0Fs
dEN0cmw6IGZ1bmN0aW9uKGUpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5faXNNYWMgPyBl
LmFsdEtleSA6IGUuY3RybEtleTsKKyAgICB9LAorCisgICAgX3JlZ2lzdGVyU2hvcnRjdXRzOiBm
dW5jdGlvbigpCisgICAgeworICAgICAgICB2YXIgbW9kaWZpZXJzID0gV2ViSW5zcGVjdG9yLktl
eWJvYXJkU2hvcnRjdXQuTW9kaWZpZXJzOworICAgICAgICB0aGlzLl9zaG9ydGN1dHMgPSB7fTsK
KyAgICAgICAgdGhpcy5fc2hvcnRjdXRzW1dlYkluc3BlY3Rvci5LZXlib2FyZFNob3J0Y3V0Lm1h
a2VLZXkoInoiLCB0aGlzLl9pc01hYyA/IG1vZGlmaWVycy5NZXRhIDogbW9kaWZpZXJzLkN0cmwp
XSA9IHRoaXMuX3RleHRNb2RlbC51bmRvLmJpbmQodGhpcy5fdGV4dE1vZGVsKTsKKyAgICAgICAg
dGhpcy5fc2hvcnRjdXRzW1dlYkluc3BlY3Rvci5LZXlib2FyZFNob3J0Y3V0Lm1ha2VLZXkoInoi
LCBtb2RpZmllcnMuU2hpZnQgfCAodGhpcy5faXNNYWMgPyBtb2RpZmllcnMuTWV0YSA6IG1vZGlm
aWVycy5DdHJsKSldID0gdGhpcy5fdGV4dE1vZGVsLnJlZG8uYmluZCh0aGlzLl90ZXh0TW9kZWwp
OworICAgICAgICB0aGlzLl9zaG9ydGN1dHNbV2ViSW5zcGVjdG9yLktleWJvYXJkU2hvcnRjdXQu
bWFrZUtleSgiYSIsIHRoaXMuX2lzTWFjID8gbW9kaWZpZXJzLk1ldGEgOiBtb2RpZmllcnMuQ3Ry
bCldID0gdGhpcy5fc2VsZWN0QWxsLmJpbmQodGhpcyk7CisgICAgICAgIGlmICh0aGlzLl9pc01h
YykKKyAgICAgICAgICAgIHRoaXMuX3Nob3J0Y3V0c1tXZWJJbnNwZWN0b3IuS2V5Ym9hcmRTaG9y
dGN1dC5tYWtlS2V5KCJkIiwgbW9kaWZpZXJzLkN0cmwpXSA9IHRoaXMuX2hhbmRsZURlbGV0ZUtl
eS5iaW5kKHRoaXMpOworCisgICAgICAgIHRoaXMuX3Nob3J0Y3V0c1tXZWJJbnNwZWN0b3IuS2V5
Ym9hcmRTaG9ydGN1dC5tYWtlS2V5KCJkIiwgbW9kaWZpZXJzLkN0cmwgfCBtb2RpZmllcnMuQWx0
KV0gPSB0aGlzLl9oYW5kbGVUb2dnbGVEZWJ1Z01vZGUuYmluZCh0aGlzKTsKKyAgICAgICAgdGhp
cy5fc2hvcnRjdXRzW1dlYkluc3BlY3Rvci5LZXlib2FyZFNob3J0Y3V0Lm1ha2VLZXkoImUiLCBt
b2RpZmllcnMuQ3RybCB8IG1vZGlmaWVycy5BbHQpXSA9IHRoaXMuX2hhbmRsZVRvZ2dsZVNjcm9s
bE1vZGUuYmluZCh0aGlzKTsKKyAgICAgICAgdGhpcy5fc2hvcnRjdXRzW1dlYkluc3BlY3Rvci5L
ZXlib2FyZFNob3J0Y3V0Lm1ha2VLZXkoImgiLCBtb2RpZmllcnMuQ3RybCB8IG1vZGlmaWVycy5B
bHQpXSA9IHRoaXMuX2hhbmRsZVRvZ2dsZUhpZ2hsaWdodE1vZGUuYmluZCh0aGlzKTsKKyAgICB9
LAorCisgICAgX2hhbmRsZURlbGV0ZUtleTogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgdmFy
IHJhbmdlID0gdGhpcy5fc2VsZWN0aW9uLnJhbmdlKCk7CisgICAgICAgIGlmIChyYW5nZS5pc0Vt
cHR5KCkpIHsKKyAgICAgICAgICAgIGlmIChyYW5nZS5lbmRDb2x1bW4gPCB0aGlzLl90ZXh0TW9k
ZWwubGluZUxlbmd0aChyYW5nZS5zdGFydExpbmUpKQorICAgICAgICAgICAgICAgIHJhbmdlLmVu
ZENvbHVtbisrOworICAgICAgICAgICAgZWxzZSBpZiAocmFuZ2UuZW5kTGluZSA8IHRoaXMuX3Rl
eHRNb2RlbC5saW5lc0NvdW50KCkpIHsKKyAgICAgICAgICAgICAgICByYW5nZS5lbmRMaW5lKys7
CisgICAgICAgICAgICAgICAgcmFuZ2UuZW5kQ29sdW1uID0gMDsKKyAgICAgICAgICAgIH0gZWxz
ZQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0aGlzLl90ZXh0
TW9kZWwuc2V0VGV4dChyYW5nZSwgIiIpOworICAgIH0sCisKKyAgICBfaGFuZGxlQmFja3NwYWNl
S2V5OiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLl9zZWxlY3Rp
b24ucmFuZ2UoKTsKKyAgICAgICAgaWYgKHJhbmdlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAg
aWYgKHJhbmdlLnN0YXJ0Q29sdW1uID4gMCkKKyAgICAgICAgICAgICAgICByYW5nZS5zdGFydENv
bHVtbi0tOworICAgICAgICAgICAgZWxzZSBpZiAocmFuZ2Uuc3RhcnRMaW5lID4gMCkgeworICAg
ICAgICAgICAgICAgIHJhbmdlLnN0YXJ0TGluZS0tOworICAgICAgICAgICAgICAgIHJhbmdlLnN0
YXJ0Q29sdW1uID0gdGhpcy5fdGV4dE1vZGVsLmxpbmVMZW5ndGgocmFuZ2Uuc3RhcnRMaW5lKTsK
KyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQor
ICAgICAgICB0aGlzLl90ZXh0TW9kZWwuc2V0VGV4dChyYW5nZSwgIiIpOworICAgIH0sCisKKyAg
ICBfaGFuZGxlVG9nZ2xlRGVidWdNb2RlOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB0aGlz
Ll9kZWJ1Z01vZGUgPSAhdGhpcy5fZGVidWdNb2RlOworICAgIH0sCisKKyAgICBfaGFuZGxlVG9n
Z2xlU2Nyb2xsTW9kZTogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgdGhpcy5faW1hZ2VEYXRh
RW5hYmxlZCA9ICF0aGlzLl9pbWFnZURhdGFFbmFibGVkOworICAgIH0sCisKKyAgICBfaGFuZGxl
VG9nZ2xlSGlnaGxpZ2h0TW9kZTogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgdGhpcy5faGln
aGxpZ2h0aW5nRW5hYmxlZCA9ICF0aGlzLl9oaWdobGlnaHRpbmdFbmFibGVkOworICAgIH0KK30K
KworV2ViSW5zcGVjdG9yLlRleHRTZWxlY3Rpb25Nb2RlbCA9IGZ1bmN0aW9uKGNoYW5nZUxpc3Rl
bmVyKQoreworICAgIHRoaXMuc3RhcnRMaW5lID0gMDsKKyAgICB0aGlzLnN0YXJ0Q29sdW1uID0g
MDsKKyAgICB0aGlzLmVuZExpbmUgPSAwOworICAgIHRoaXMuZW5kQ29sdW1uID0gMDsKKyAgICB0
aGlzLl9jaGFuZ2VMaXN0ZW5lciA9IGNoYW5nZUxpc3RlbmVyOworfQorCitXZWJJbnNwZWN0b3Iu
VGV4dFNlbGVjdGlvbk1vZGVsLnByb3RvdHlwZSA9IHsKKyAgICBzZXRTdGFydDogZnVuY3Rpb24o
bGluZSwgY29sdW1uKQorICAgIHsKKyAgICAgICAgdmFyIG9sZFJhbmdlID0gdGhpcy5yYW5nZSgp
OworCisgICAgICAgIHRoaXMuc3RhcnRMaW5lID0gbGluZTsKKyAgICAgICAgdGhpcy5zdGFydENv
bHVtbiA9IGNvbHVtbjsKKyAgICAgICAgdGhpcy5lbmRMaW5lID0gbGluZTsKKyAgICAgICAgdGhp
cy5lbmRDb2x1bW4gPSBjb2x1bW47CisKKyAgICAgICAgdGhpcy5fY2hhbmdlTGlzdGVuZXIob2xk
UmFuZ2UsIHRoaXMucmFuZ2UoKSk7CisgICAgfSwKKworICAgIHNldEVuZDogZnVuY3Rpb24obGlu
ZSwgY29sdW1uKQorICAgIHsKKyAgICAgICAgdmFyIG9sZFJhbmdlID0gdGhpcy5yYW5nZSgpOwor
CisgICAgICAgIHRoaXMuZW5kTGluZSA9IGxpbmU7CisgICAgICAgIHRoaXMuZW5kQ29sdW1uID0g
Y29sdW1uOworCisgICAgICAgIHRoaXMuX2NoYW5nZUxpc3RlbmVyKG9sZFJhbmdlLCB0aGlzLnJh
bmdlKCksIHRoaXMuZW5kTGluZSwgdGhpcy5lbmRDb2x1bW4pOworICAgIH0sCisKKyAgICByYW5n
ZTogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuc3RhcnRMaW5lIDwgdGhpcy5l
bmRMaW5lIHx8ICh0aGlzLnN0YXJ0TGluZSA9PT0gdGhpcy5lbmRMaW5lICYmIHRoaXMuc3RhcnRD
b2x1bW4gPD0gdGhpcy5lbmRDb2x1bW4pKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJJbnNw
ZWN0b3IuVGV4dFJhbmdlKHRoaXMuc3RhcnRMaW5lLCB0aGlzLnN0YXJ0Q29sdW1uLCB0aGlzLmVu
ZExpbmUsIHRoaXMuZW5kQ29sdW1uKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJu
IG5ldyBXZWJJbnNwZWN0b3IuVGV4dFJhbmdlKHRoaXMuZW5kTGluZSwgdGhpcy5lbmRDb2x1bW4s
IHRoaXMuc3RhcnRMaW5lLCB0aGlzLnN0YXJ0Q29sdW1uKTsKKyAgICB9LAorCisgICAgaXNFbXB0
eTogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRMaW5lID09PSB0
aGlzLmVuZExpbmUgJiYgdGhpcy5zdGFydENvbHVtbiA9PT0gdGhpcy5lbmRDb2x1bW47CisgICAg
fQorfQorCitXZWJJbnNwZWN0b3IuVGV4dEN1cnNvciA9IGZ1bmN0aW9uKGN1cnNvckVsZW1lbnQp
Cit7CisgICAgdGhpcy5fdmlzaWJsZSA9IGZhbHNlOworICAgIHRoaXMuX2N1cnNvckVsZW1lbnQg
PSBjdXJzb3JFbGVtZW50OworfQorCitXZWJJbnNwZWN0b3IuVGV4dEN1cnNvci5wcm90b3R5cGUg
PSB7CisgICAgc2V0TG9jYXRpb246IGZ1bmN0aW9uKHgsIHkpCisgICAgeworICAgICAgICB0aGlz
Ll94ID0geDsKKyAgICAgICAgdGhpcy5feSA9IHk7CisgICAgICAgIGlmICh0aGlzLl9wYWludElu
dGVydmFsKSB7CisgICAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLl9wYWludElu
dGVydmFsKTsKKyAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9wYWludEludGVydmFsOworICAgICAg
ICB9CisgICAgICAgIHRoaXMuX3BhaW50SW50ZXJ2YWwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwodGhp
cy5fcGFpbnQuYmluZCh0aGlzLCBmYWxzZSksIDUwMCk7CisgICAgICAgIHRoaXMuX3BhaW50KHRy
dWUpOworICAgIH0sCisKKyAgICBfcGFpbnQ6IGZ1bmN0aW9uKGZvcmNlKQorICAgIHsKKyAgICAg
ICAgaWYgKGZvcmNlKQorICAgICAgICAgICAgdGhpcy5fdmlzaWJsZSA9IHRydWU7CisgICAgICAg
IGVsc2UKKyAgICAgICAgICAgIHRoaXMuX3Zpc2libGUgPSAhdGhpcy5fdmlzaWJsZTsKKyAgICAg
ICAgdGhpcy5fY3Vyc29yRWxlbWVudC5zdHlsZS5sZWZ0ID0gdGhpcy5feCArICJweCI7CisgICAg
ICAgIHRoaXMuX2N1cnNvckVsZW1lbnQuc3R5bGUudG9wID0gdGhpcy5feSArICJweCI7CisgICAg
ICAgIHRoaXMuX2N1cnNvckVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IHRoaXMuX3Zpc2libGUgPyAi
YmxvY2siIDogIm5vbmUiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUvaW5zcGVjdG9y
L2Zyb250LWVuZC9UZXh0RWRpdG9ySGlnaGxpZ2h0ZXIuanMgYi9XZWJDb3JlL2luc3BlY3Rvci9m
cm9udC1lbmQvVGV4dEVkaXRvckhpZ2hsaWdodGVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAuLjlmMWIyOTkKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2luc3BlY3Rv
ci9mcm9udC1lbmQvVGV4dEVkaXRvckhpZ2hsaWdodGVyLmpzCkBAIC0wLDAgKzEsMTMxIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAq
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBk
aXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5v
ciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRo
b3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JT
CisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIg
T1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICog
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK1dlYklu
c3BlY3Rvci5UZXh0RWRpdG9ySGlnaGxpZ2h0ZXIgPSBmdW5jdGlvbih0ZXh0TW9kZWwpCit7Cisg
ICAgdGhpcy5fdGV4dE1vZGVsID0gdGV4dE1vZGVsOworICAgIHRoaXMuX2hpZ2hsaWdodGVyU2No
ZW1lID0gbmV3IFdlYkluc3BlY3Rvci5KYXZhU2NyaXB0SGlnaGxpZ2h0ZXJTY2hlbWUoKTsKKwor
ICAgIHRoaXMuX3N0eWxlcyA9IFtdOworICAgIHRoaXMuX3N0eWxlc1tXZWJJbnNwZWN0b3IuVGV4
dEVkaXRvckhpZ2hsaWdodGVyLlRva2VuVHlwZS5Db21tZW50XSA9ICJyZ2IoMCwgMTE2LCAwKSI7
CisgICAgdGhpcy5fc3R5bGVzW1dlYkluc3BlY3Rvci5UZXh0RWRpdG9ySGlnaGxpZ2h0ZXIuVG9r
ZW5UeXBlLlN0cmluZ10gPSAicmdiKDE5NiwgMjYsIDIyKSI7CisgICAgdGhpcy5fc3R5bGVzW1dl
Ykluc3BlY3Rvci5UZXh0RWRpdG9ySGlnaGxpZ2h0ZXIuVG9rZW5UeXBlLktleXdvcmRdID0gInJn
YigxNzAsIDEzLCAxNDUpIjsKKyAgICB0aGlzLl9zdHlsZXNbV2ViSW5zcGVjdG9yLlRleHRFZGl0
b3JIaWdobGlnaHRlci5Ub2tlblR5cGUuTnVtYmVyXSA9ICJyZ2IoMjgsIDAsIDIwNykiOworfQor
CitXZWJJbnNwZWN0b3IuVGV4dEVkaXRvckhpZ2hsaWdodGVyLlRva2VuVHlwZSA9IHsKKyAgICBD
b21tZW50OiAwLAorICAgIFN0cmluZzogMSwKKyAgICBLZXl3b3JkOiAyLAorICAgIE51bWJlcjog
MworfQorCitXZWJJbnNwZWN0b3IuVGV4dEVkaXRvckhpZ2hsaWdodGVyLnByb3RvdHlwZSA9IHsK
KyAgICBoaWdobGlnaHQ6IGZ1bmN0aW9uKHN0YXJ0TGluZSwgZW5kTGluZSkKKyAgICB7CisgICAg
ICAgIHRoaXMuX2hpZ2hsaWdodGVyU2NoZW1lLnJlc2V0KHRoaXMpOworICAgICAgICAvLyBSZXdp
bmQgdG8gdGhlIGxhc3QgaGlnaGxpZ2h0ZWQgbGluZSB0byBnYWluIHByb3BlciBoaWdobGlnaHRl
ciBjb250ZXh0LgorICAgICAgICB3aGlsZSAoc3RhcnRMaW5lID4gMCAmJiAhdGhpcy5fdGV4dE1v
ZGVsLmdldEF0dHJpYnV0ZShzdGFydExpbmUgLSAxLCAwLCAiaGlnaGxpZ2h0ZXItc3RhdGUiKSkK
KyAgICAgICAgICAgIHN0YXJ0TGluZS0tOworCisgICAgICAgIC8vIFJlc3RvcmUgaGlnaGxpZ2h0
ZXIgY29udGV4dCB0YWtlbiBmcm9tIHByZXZpb3VzIGxpbmUuCisgICAgICAgIHZhciBzdGF0ZSA9
IHRoaXMuX3RleHRNb2RlbC5nZXRBdHRyaWJ1dGUoc3RhcnRMaW5lIC0gMSwgMCwgImhpZ2hsaWdo
dGVyLXN0YXRlIik7CisgICAgICAgIGlmIChzdGF0ZSkgeworICAgICAgICAgICAgdGhpcy5jb250
aW51ZVN0YXRlID0gc3RhdGUucG9zdENvbnRpbnVlU3RhdGU7CisgICAgICAgICAgICB0aGlzLmxl
eFN0YXRlID0gc3RhdGUucG9zdExleFN0YXRlOworICAgICAgICB9CisKKyAgICAgICAgLy8gRWFj
aCBsaW5lIGhhcyBhc3NvY2lhdGVkIHN0YXRlIGF0dHJpYnV0ZSB3aXRoIHByZS0gYW5kIHBvc3Qt
aGlnaGxpZ2h0ZXIgY29uZGl0aW9ucy4KKyAgICAgICAgLy8gSGlnaGxpZ2h0IGxpbmVzIGZyb20g
cmFuZ2UgdW50aWwgd2UgZmluZCBsaW5lIHByZWNvbmRpdGlvbiBtYXRjaGluZyBoaWdobGlnaHRl
ciBzdGF0ZS4KKyAgICAgICAgdmFyIGRhbWFnZSA9IHt9OworICAgICAgICBmb3IgKHZhciBpID0g
c3RhcnRMaW5lOyBpIDwgZW5kTGluZTsgKytpKSB7CisgICAgICAgICAgICBzdGF0ZSA9IHRoaXMu
X3RleHRNb2RlbC5nZXRBdHRyaWJ1dGUoaSwgMCwgImhpZ2hsaWdodGVyLXN0YXRlIik7CisgICAg
ICAgICAgICBpZiAoc3RhdGUgJiYgc3RhdGUucHJlQ29udGludWVTdGF0ZSA9PT0gdGhpcy5jb250
aW51ZVN0YXRlICYmIHN0YXRlLnByZUxleFN0YXRlID09PSB0aGlzLmxleFN0YXRlKSB7CisgICAg
ICAgICAgICAgICAgLy8gRm9sbG93aW5nIGxpbmVzIGFyZSB1cCB0byBkYXRlLCBubyBuZWVkIHJl
LWhpZ2hsaWdodC4KKyAgICAgICAgICAgICAgICB0aGlzLmNvbnRpbnVlU3RhdGUgPSBzdGF0ZS5w
b3N0Q29udGludWVTdGF0ZTsKKyAgICAgICAgICAgICAgICB0aGlzLmxleFN0YXRlID0gc3RhdGUu
cG9zdExleFN0YXRlOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICBkYW1hZ2VbaV0gPSB0cnVlOworCisgICAgICAgICAgICBzdGF0ZSA9IHt9
OworICAgICAgICAgICAgc3RhdGUucHJlQ29udGludWVTdGF0ZSA9IHRoaXMuY29udGludWVTdGF0
ZTsKKyAgICAgICAgICAgIHN0YXRlLnByZUxleFN0YXRlID0gdGhpcy5sZXhTdGF0ZTsKKworICAg
ICAgICAgICAgdGhpcy5fdGV4dE1vZGVsLnJlbW92ZUF0dHJpYnV0ZXMoaSwgImhpZ2hsaWdodCIp
OworICAgICAgICAgICAgdmFyIGxpbmUgPSB0aGlzLl90ZXh0TW9kZWwubGluZShpKTsKKyAgICAg
ICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGluZS5sZW5ndGg7KQorICAgICAgICAgICAgICAg
IGogKz0gdGhpcy5fbGV4KGxpbmUuc3Vic3RyaW5nKGopLCBpLCBqKTsKKworICAgICAgICAgICAg
c3RhdGUucG9zdENvbnRpbnVlU3RhdGUgPSB0aGlzLmNvbnRpbnVlU3RhdGU7CisgICAgICAgICAg
ICBzdGF0ZS5wb3N0TGV4U3RhdGUgPSB0aGlzLmxleFN0YXRlOworICAgICAgICAgICAgdGhpcy5f
dGV4dE1vZGVsLmFkZEF0dHJpYnV0ZShpLCAwLCAiaGlnaGxpZ2h0ZXItc3RhdGUiLCBzdGF0ZSk7
CisgICAgICAgIH0KKworICAgICAgICBzdGF0ZSA9IHRoaXMuX3RleHRNb2RlbC5nZXRBdHRyaWJ1
dGUoZW5kTGluZSwgMCwgImhpZ2hsaWdodGVyLXN0YXRlIik7CisKKyAgICAgICAgaWYgKHN0YXRl
ICYmIChzdGF0ZS5wcmVDb250aW51ZVN0YXRlICE9PSB0aGlzLmNvbnRpbnVlU3RhdGUgfHwgc3Rh
dGUucHJlTGV4U3RhdGUgIT09IHRoaXMubGV4U3RhdGUpKSB7CisgICAgICAgICAgICAvLyBSZXF1
ZXN0ZWQgaGlnaGxpZ2h0IHJhbmdlIGlzIG92ZXIsIGJ1dCB3ZSBkaWQgbm90IHJlY292ZXIuIElu
dmFsaWRhdGUgdGFpbCBoaWdobGlnaHRpbmcuCisgICAgICAgICAgICBmb3IgKHZhciBpID0gZW5k
TGluZTsgaSA8IHRoaXMuX3RleHRNb2RlbC5saW5lc0NvdW50KCk7ICsraSkKKyAgICAgICAgICAg
ICAgICB0aGlzLl90ZXh0TW9kZWwucmVtb3ZlQXR0cmlidXRlcyhpLCAiaGlnaGxpZ2h0ZXItc3Rh
dGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkYW1hZ2U7CisgICAgfSwKKworICAg
IF9sZXg6IGZ1bmN0aW9uKGNvZGVGcmFnbWVudCwgbGluZSwgY29sdW1uKSB7CisgICAgICAgIHZh
ciB0b2tlbiA9IG51bGw7CisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5faGlnaGxp
Z2h0ZXJTY2hlbWUucnVsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHZhciBydWxlID0g
dGhpcy5faGlnaGxpZ2h0ZXJTY2hlbWUucnVsZXNbaV07CisgICAgICAgICAgICB2YXIgcnVsZUNv
bnRpbnVlU3RhdGVDb25kaXRpb24gPSB0eXBlb2YgcnVsZS5wcmVDb250aW51ZVN0YXRlICE9PSAi
dW5kZWZpbmVkIiA/IHJ1bGUucHJlQ29udGludWVTdGF0ZSA6IHRoaXMuX2hpZ2hsaWdodGVyU2No
ZW1lLkNvbnRpbnVlU3RhdGUuTm9uZTsKKyAgICAgICAgICAgIGlmICh0aGlzLmNvbnRpbnVlU3Rh
dGUgIT09IHJ1bGVDb250aW51ZVN0YXRlQ29uZGl0aW9uKQorICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICAgICAgaWYgKHR5cGVvZiBydWxlLnByZUxleFN0YXRlICE9PSAidW5kZWZp
bmVkIiAmJiB0aGlzLmxleFN0YXRlICE9PSBydWxlLnByZUxleFN0YXRlKQorICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICB2YXIgbWF0Y2ggPSBydWxlLnBhdHRlcm4uZXhl
Yyhjb2RlRnJhZ21lbnQpOworICAgICAgICAgICAgaWYgKG1hdGNoKSB7CisgICAgICAgICAgICAg
ICAgdG9rZW4gPSBtYXRjaFswXTsKKyAgICAgICAgICAgICAgICBpZiAodG9rZW4gJiYgKCFydWxl
LmtleXdvcmRzIHx8ICh0b2tlbiBpbiBydWxlLmtleXdvcmRzKSkpIHsKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKHR5cGVvZiBydWxlLnR5cGUgPT09ICJudW1iZXIiKQorICAgICAgICAgICAgICAg
ICAgICAgICAgdGhpcy5fdGV4dE1vZGVsLmFkZEF0dHJpYnV0ZShsaW5lLCBjb2x1bW4sICJoaWdo
bGlnaHQiLCB7IGxlbmd0aDogdG9rZW4ubGVuZ3RoLCBzdHlsZTogdGhpcy5fc3R5bGVzW3J1bGUu
dHlwZV0gfSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcnVsZS5wb3N0TGV4U3Rh
dGUgIT09ICJ1bmRlZmluZWQiKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sZXhTdGF0
ZSA9IHJ1bGUucG9zdExleFN0YXRlOworICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJ1
bGUucG9zdENvbnRpbnVlU3RhdGUgIT09ICJ1bmRlZmluZWQiKQorICAgICAgICAgICAgICAgICAg
ICAgICAgdGhpcy5jb250aW51ZVN0YXRlID0gcnVsZS5wb3N0Q29udGludWVTdGF0ZTsKKyAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuLmxlbmd0aDsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQpkaWZm
IC0tZ2l0IGEvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL1RleHRFZGl0b3JNb2RlbC5qcyBi
L1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9UZXh0RWRpdG9yTW9kZWwuanMKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBmNjlmZAotLS0gL2Rldi9udWxsCisrKyBiL1dl
YkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9UZXh0RWRpdG9yTW9kZWwuanMKQEAgLTAsMCArMSwz
MTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAq
CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICog
aW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29n
bGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2Vk
IHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29m
dHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENP
TlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQK
KyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCitXZWJJbnNwZWN0b3IuVGV4dFJhbmdlID0gZnVuY3Rpb24oc3RhcnRMaW5lLCBzdGFydENv
bHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uKQoreworICAgIHRoaXMuc3RhcnRMaW5lID0gc3RhcnRM
aW5lOworICAgIHRoaXMuc3RhcnRDb2x1bW4gPSBzdGFydENvbHVtbjsKKyAgICB0aGlzLmVuZExp
bmUgPSBlbmRMaW5lOworICAgIHRoaXMuZW5kQ29sdW1uID0gZW5kQ29sdW1uOworfQorCitXZWJJ
bnNwZWN0b3IuVGV4dFJhbmdlLnByb3RvdHlwZSA9IHsKKyAgICBpc0VtcHR5OiBmdW5jdGlvbigp
CisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5zdGFydExpbmUgPT09IHRoaXMuZW5kTGluZSAm
JiB0aGlzLnN0YXJ0Q29sdW1uID09PSB0aGlzLmVuZENvbHVtbjsKKyAgICB9LAorCisgICAgbGlu
ZXNDb3VudDogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZW5kTGluZSAt
IHRoaXMuc3RhcnRMaW5lOworICAgIH0sCisKKyAgICBjbG9uZTogZnVuY3Rpb24oKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIG5ldyBXZWJJbnNwZWN0b3IuVGV4dFJhbmdlKHRoaXMuc3RhcnRMaW5l
LCB0aGlzLnN0YXJ0Q29sdW1uLCB0aGlzLmVuZExpbmUsIHRoaXMuZW5kQ29sdW1uKTsgCisgICAg
fQorfQorCitXZWJJbnNwZWN0b3IuVGV4dEVkaXRvck1vZGVsID0gZnVuY3Rpb24oY2hhbmdlTGlz
dGVuZXIpCit7CisgICAgdGhpcy5fY2hhbmdlTGlzdGVuZXIgPSBjaGFuZ2VMaXN0ZW5lcjsKKyAg
ICB0aGlzLl9saW5lcyA9IFsiIl07CisgICAgdGhpcy5fYXR0cmlidXRlcyA9IFtdOworICAgIHRo
aXMuX3VuZG9TdGFjayA9IFtdOworfQorCitXZWJJbnNwZWN0b3IuVGV4dEVkaXRvck1vZGVsLnBy
b3RvdHlwZSA9IHsKKworICAgIGxpbmVzQ291bnQ6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAg
IHJldHVybiB0aGlzLl9saW5lcy5sZW5ndGg7CisgICAgfSwKKworICAgIGNvbHVtbnNDb3VudDog
ZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgdmFyIHdpZHRoID0gMDsKKyAgICAgICAgdmFyIGxp
bmVzQ291bnQgPSB0aGlzLl9saW5lcy5sZW5ndGg7CisgICAgICAgIGZvciAodmFyIGkgPSAwOyBp
IDwgbGluZXNDb3VudDsgKytpKSB7CisgICAgICAgICAgICB2YXIgbGluZSA9IHRoaXMuX2xpbmVz
W2ldOworICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoID4gd2lkdGgpCisgICAgICAgICAgICAg
ICAgd2lkdGggPSBsaW5lLmxlbmd0aDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gd2lkdGg7
CisgICAgfSwKKworICAgIGxpbmU6IGZ1bmN0aW9uKGxpbmVOdW1iZXIpCisgICAgeworICAgICAg
ICBpZiAobGluZU51bWJlciA+PSB0aGlzLl9saW5lcy5sZW5ndGgpCisgICAgICAgICAgICB0aHJv
dyAiT3V0IG9mIGJvdW5kczoiICsgbGluZU51bWJlcjsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2xp
bmVzW2xpbmVOdW1iZXJdOworICAgIH0sCisKKyAgICBsaW5lTGVuZ3RoOiBmdW5jdGlvbihsaW5l
TnVtYmVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2xpbmVzW2xpbmVOdW1iZXJdLmxl
bmd0aDsKKyAgICB9LAorCisgICAgc2V0VGV4dDogZnVuY3Rpb24ocmFuZ2UsIHRleHQpCisgICAg
eworICAgICAgICBpZiAoIXJhbmdlKQorICAgICAgICAgICAgcmFuZ2UgPSBuZXcgV2ViSW5zcGVj
dG9yLlRleHRSYW5nZSgwLCAwLCB0aGlzLl9saW5lcy5sZW5ndGggLSAxLCB0aGlzLl9saW5lc1t0
aGlzLl9saW5lcy5sZW5ndGggLSAxXS5sZW5ndGgpOworICAgICAgICB2YXIgY29tbWFuZCA9IHRo
aXMuX3B1c2hVbmRvYWJsZUNvbW1hbmQocmFuZ2UsIHRleHQpOworICAgICAgICB2YXIgbmV3UmFu
Z2UgPSB0aGlzLl9pbm5lclNldFRleHQocmFuZ2UsIHRleHQpOworICAgICAgICBjb21tYW5kLnJh
bmdlID0gbmV3UmFuZ2UuY2xvbmUoKTsKKworICAgICAgICB0aGlzLl9jaGFuZ2VMaXN0ZW5lcihy
YW5nZSwgbmV3UmFuZ2UsIGNvbW1hbmQudGV4dCwgdGV4dCk7CisgICAgICAgIHJldHVybiBuZXdS
YW5nZTsKKyAgICB9LAorCisgICAgX2lubmVyU2V0VGV4dDogZnVuY3Rpb24ocmFuZ2UsIHRleHQp
CisgICAgeworICAgICAgICB0aGlzLl9lcmFzZVJhbmdlKHJhbmdlKTsKKyAgICAgICAgaWYgKHRl
eHQgPT09ICIiKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJJbnNwZWN0b3IuVGV4dFJhbmdl
KHJhbmdlLnN0YXJ0TGluZSwgcmFuZ2Uuc3RhcnRDb2x1bW4sIHJhbmdlLnN0YXJ0TGluZSwgcmFu
Z2Uuc3RhcnRDb2x1bW4pOworCisgICAgICAgIHZhciBuZXdMaW5lcyA9IHRleHQuc3BsaXQoIlxu
Iik7CisgICAgICAgIHZhciBwcmVmaXggPSB0aGlzLl9saW5lc1tyYW5nZS5zdGFydExpbmVdLnN1
YnN0cmluZygwLCByYW5nZS5zdGFydENvbHVtbik7CisgICAgICAgIHZhciBwcmVmaXhBcmd1bWVu
dHMgPSB0aGlzLl9hcmd1bWVudHMKKyAgICAgICAgdmFyIHN1ZmZpeCA9IHRoaXMuX2xpbmVzW3Jh
bmdlLnN0YXJ0TGluZV0uc3Vic3RyaW5nKHJhbmdlLnN0YXJ0Q29sdW1uKTsKKworICAgICAgICB2
YXIgcG9zdENhcmV0ID0gcHJlZml4Lmxlbmd0aDsKKyAgICAgICAgLy8gSW5zZXJ0IHRleHQuCisg
ICAgICAgIGlmIChuZXdMaW5lcy5sZW5ndGggPT09IDEpIHsKKyAgICAgICAgICAgIHRoaXMuX3Nl
dExpbmUocmFuZ2Uuc3RhcnRMaW5lLCBwcmVmaXggKyBuZXdMaW5lc1swXSArIHN1ZmZpeCk7Cisg
ICAgICAgICAgICBwb3N0Q2FyZXQgKz0gbmV3TGluZXNbMF0ubGVuZ3RoOworICAgICAgICB9IGVs
c2UgeworICAgICAgICAgICAgdGhpcy5fc2V0TGluZShyYW5nZS5zdGFydExpbmUsIHByZWZpeCAr
IG5ld0xpbmVzWzBdKTsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbmV3TGluZXMu
bGVuZ3RoOyArK2kpCisgICAgICAgICAgICAgICAgdGhpcy5faW5zZXJ0TGluZShyYW5nZS5zdGFy
dExpbmUgKyBpLCBuZXdMaW5lc1tpXSk7CisgICAgICAgICAgICB0aGlzLl9zZXRMaW5lKHJhbmdl
LnN0YXJ0TGluZSArIG5ld0xpbmVzLmxlbmd0aCAtIDEsIG5ld0xpbmVzW25ld0xpbmVzLmxlbmd0
aCAtIDFdICsgc3VmZml4KTsKKyAgICAgICAgICAgIHBvc3RDYXJldCA9IG5ld0xpbmVzW25ld0xp
bmVzLmxlbmd0aCAtIDFdLmxlbmd0aDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFdl
Ykluc3BlY3Rvci5UZXh0UmFuZ2UocmFuZ2Uuc3RhcnRMaW5lLCByYW5nZS5zdGFydENvbHVtbiwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLnN0YXJ0TGlu
ZSArIG5ld0xpbmVzLmxlbmd0aCAtIDEsIHBvc3RDYXJldCk7CisgICAgfSwKKworICAgIF9lcmFz
ZVJhbmdlOiBmdW5jdGlvbihyYW5nZSkKKyAgICB7CisgICAgICAgIGlmIChyYW5nZS5pc0VtcHR5
KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgdmFyIHByZWZpeCA9IHRoaXMuX2xp
bmVzW3JhbmdlLnN0YXJ0TGluZV0uc3Vic3RyaW5nKDAsIHJhbmdlLnN0YXJ0Q29sdW1uKTsKKyAg
ICAgICAgdmFyIHN1ZmZpeCA9IHRoaXMuX2xpbmVzW3JhbmdlLmVuZExpbmVdLnN1YnN0cmluZyhy
YW5nZS5lbmRDb2x1bW4pOworCisgICAgICAgIGlmIChyYW5nZS5lbmRMaW5lID4gcmFuZ2Uuc3Rh
cnRMaW5lKQorICAgICAgICAgICAgdGhpcy5fcmVtb3ZlTGluZXMocmFuZ2Uuc3RhcnRMaW5lICsg
MSwgcmFuZ2UuZW5kTGluZSAtIHJhbmdlLnN0YXJ0TGluZSk7CisgICAgICAgIHRoaXMuX3NldExp
bmUocmFuZ2Uuc3RhcnRMaW5lLCBwcmVmaXggKyBzdWZmaXgpOworICAgIH0sCisKKyAgICBfc2V0
TGluZTogZnVuY3Rpb24obGluZU51bWJlciwgdGV4dCkKKyAgICB7CisgICAgICAgIHRoaXMuX2xp
bmVzW2xpbmVOdW1iZXJdID0gdGV4dDsKKyAgICAgICAgZGVsZXRlIHRoaXMuX2F0dHJpYnV0ZXNb
bGluZU51bWJlcl07CisgICAgfSwKKworICAgIF9yZW1vdmVMaW5lczogZnVuY3Rpb24oZnJvbUxp
bmUsIGNvdW50KQorICAgIHsKKyAgICAgICAgdGhpcy5fbGluZXMuc3BsaWNlKGZyb21MaW5lLCBj
b3VudCk7CisgICAgICAgIHRoaXMuX2F0dHJpYnV0ZXMuc3BsaWNlKGZyb21MaW5lLCBjb3VudCk7
CisgICAgfSwKKworICAgIF9pbnNlcnRMaW5lOiBmdW5jdGlvbihsaW5lTnVtYmVyLCB0ZXh0KQor
ICAgIHsKKyAgICAgICAgdGhpcy5fbGluZXMuc3BsaWNlKGxpbmVOdW1iZXIsIDAsIHRleHQpOwor
ICAgICAgICB0aGlzLl9hdHRyaWJ1dGVzLnNwbGljZShsaW5lTnVtYmVyLCAwLCBbXSk7CisgICAg
fSwKKworICAgIHdvcmRSYW5nZTogZnVuY3Rpb24obGluZU51bWJlciwgY29sdW1uKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShsaW5lTnVtYmVyLCB0aGlzLndvcmRTdGFydChsaW5l
TnVtYmVyLCBjb2x1bW4sIHRydWUpLCBsaW5lTnVtYmVyLCB0aGlzLndvcmRFbmQobGluZU51bWJl
ciwgY29sdW1uLCB0cnVlKSk7CisgICAgfSwKKworICAgIHdvcmRTdGFydDogZnVuY3Rpb24obGlu
ZU51bWJlciwgY29sdW1uLCBnYXBsZXNzKQorICAgIHsKKyAgICAgICAgdmFyIGxpbmUgPSB0aGlz
Ll9saW5lc1tsaW5lTnVtYmVyXTsKKyAgICAgICAgdmFyIHBhdHRlcm4gPSAvXHcrLzsKKyAgICAg
ICAgdmFyIHByZWZpeCA9IGxpbmUuc3Vic3RyaW5nKDAsIGNvbHVtbikuc3BsaXQoIiIpLnJldmVy
c2UoKS5qb2luKCIiKTsKKyAgICAgICAgdmFyIHByZWZpeE1hdGNoID0gcGF0dGVybi5leGVjKHBy
ZWZpeCk7CisgICAgICAgIHJldHVybiBwcmVmaXhNYXRjaCAmJiAoIWdhcGxlc3MgfHwgcHJlZml4
TWF0Y2guaW5kZXggPT09IDApID8gY29sdW1uIC0gcHJlZml4TWF0Y2guaW5kZXggLSBwcmVmaXhN
YXRjaFswXS5sZW5ndGggOiBjb2x1bW47CisgICAgfSwKKworICAgIHdvcmRFbmQ6IGZ1bmN0aW9u
KGxpbmVOdW1iZXIsIGNvbHVtbiwgZ2FwbGVzcykKKyAgICB7CisgICAgICAgIHZhciBsaW5lID0g
dGhpcy5fbGluZXNbbGluZU51bWJlcl07CisgICAgICAgIHZhciBwYXR0ZXJuID0gL1x3Ky87Cisg
ICAgICAgIHZhciBzdWZmaXggPSBsaW5lLnN1YnN0cmluZyhjb2x1bW4pOworICAgICAgICB2YXIg
c3VmZml4TWF0Y2ggPSBwYXR0ZXJuLmV4ZWMoc3VmZml4KTsKKyAgICAgICAgcmV0dXJuIHN1ZmZp
eE1hdGNoICYmICghZ2FwbGVzcyB8fCBzdWZmaXhNYXRjaC5pbmRleCA9PT0gMCkgPyBjb2x1bW4g
KyBzdWZmaXhNYXRjaC5pbmRleCArIHN1ZmZpeE1hdGNoWzBdLmxlbmd0aCA6IGNvbHVtbjsKKyAg
ICB9LAorCisgICAgY29weVJhbmdlOiBmdW5jdGlvbihyYW5nZSkKKyAgICB7CisgICAgICAgIHZh
ciBjbGlwID0gW107CisgICAgICAgIGlmIChyYW5nZS5zdGFydExpbmUgPT09IHJhbmdlLmVuZExp
bmUpIHsKKyAgICAgICAgICAgIGNsaXAucHVzaCh0aGlzLl9saW5lc1tyYW5nZS5zdGFydExpbmVd
LnN1YnN0cmluZyhyYW5nZS5zdGFydENvbHVtbiwgcmFuZ2UuZW5kQ29sdW1uKSk7CisgICAgICAg
ICAgICByZXR1cm4gY2xpcC5qb2luKCJcbiIpOworICAgICAgICB9CisgICAgICAgIGNsaXAucHVz
aCh0aGlzLl9saW5lc1tyYW5nZS5zdGFydExpbmVdLnN1YnN0cmluZyhyYW5nZS5zdGFydENvbHVt
bikpOworICAgICAgICBmb3IgKHZhciBpID0gcmFuZ2Uuc3RhcnRMaW5lICsgMTsgaSA8IHJhbmdl
LmVuZExpbmU7ICsraSkgeworICAgICAgICAgICAgY2xpcC5wdXNoKHRoaXMuX2xpbmVzW2ldKTsK
KyAgICAgICAgfQorICAgICAgICBjbGlwLnB1c2godGhpcy5fbGluZXNbcmFuZ2UuZW5kTGluZV0u
c3Vic3RyaW5nKDAsIHJhbmdlLmVuZENvbHVtbikpOworICAgICAgICByZXR1cm4gY2xpcC5qb2lu
KCJcbiIpOworICAgIH0sCisKKyAgICBjdXRSYW5nZTogZnVuY3Rpb24ocmFuZ2UpCisgICAgewor
ICAgICAgICB0aGlzLm1hcmtVbmRvYWJsZVN0YXRlKCk7CisKKyAgICAgICAgdmFyIGNsaXAgPSB0
aGlzLmNvcHlSYW5nZShyYW5nZSk7CisgICAgICAgIHRoaXMuc2V0VGV4dChyYW5nZSwgIiIpOwor
ICAgICAgICByZXR1cm4gY2xpcDsKKyAgICB9LAorCisgICAgYWRkQXR0cmlidXRlOiBmdW5jdGlv
bihsaW5lLCBjb2x1bW4sIG5hbWUsIHZhbHVlKQorICAgIHsKKyAgICAgICAgdmFyIGF0dHJzID0g
dGhpcy5fYXR0cmlidXRlc1tsaW5lXTsKKyAgICAgICAgaWYgKCFhdHRycykgeworICAgICAgICAg
ICAgYXR0cnMgPSBbXTsKKyAgICAgICAgICAgIHRoaXMuX2F0dHJpYnV0ZXNbbGluZV0gPSBhdHRy
czsKKyAgICAgICAgfQorICAgICAgICB2YXIgZmFtaWx5ID0gYXR0cnNbbmFtZV07CisgICAgICAg
IGlmICghZmFtaWx5KSB7CisgICAgICAgICAgICBmYW1pbHkgPSBbXTsKKyAgICAgICAgICAgIGF0
dHJzW25hbWVdID0gZmFtaWx5OworICAgICAgICB9CisgICAgICAgIGZhbWlseVtjb2x1bW5dID0g
dmFsdWU7CisgICAgfSwKKworICAgIGdldEF0dHJpYnV0ZTogZnVuY3Rpb24obGluZSwgY29sdW1u
LCBuYW1lKQorICAgIHsKKyAgICAgICAgdmFyIGZhbWlseSA9IHRoaXMuZ2V0QXR0cmlidXRlcyhs
aW5lLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbWlseSA/IGZhbWlseVtjb2x1bW5dIDogbnVs
bDsKKyAgICB9LAorCisgICAgZ2V0QXR0cmlidXRlczogZnVuY3Rpb24obGluZSwgbmFtZSkKKyAg
ICB7CisgICAgICAgIHZhciBhdHRycyA9IHRoaXMuX2F0dHJpYnV0ZXNbbGluZV07CisgICAgICAg
IHJldHVybiBhdHRycyA/IGF0dHJzW25hbWVdIDogbnVsbDsKKyAgICB9LAorCisgICAgcmVtb3Zl
QXR0cmlidXRlczogZnVuY3Rpb24obGluZSwgbmFtZSkKKyAgICB7CisgICAgICAgIHZhciBhdHRy
cyA9IHRoaXMuX2F0dHJpYnV0ZXNbbGluZV07CisgICAgICAgIGlmIChhdHRycykKKyAgICAgICAg
ICAgIGRlbGV0ZSBhdHRyc1tuYW1lXTsKKyAgICB9LAorCisgICAgX3B1c2hVbmRvYWJsZUNvbW1h
bmQ6IGZ1bmN0aW9uKHJhbmdlLCB0ZXh0KQorICAgIHsKKyAgICAgICAgdmFyIGNvbW1hbmQgPSB7
CisgICAgICAgICAgICB0ZXh0OiB0aGlzLmNvcHlSYW5nZShyYW5nZSksCisgICAgICAgICAgICBz
dGFydExpbmU6IHJhbmdlLnN0YXJ0TGluZSwKKyAgICAgICAgICAgIHN0YXJ0Q29sdW1uOiByYW5n
ZS5zdGFydENvbHVtbiwKKyAgICAgICAgICAgIGVuZExpbmU6IHJhbmdlLnN0YXJ0TGluZSwKKyAg
ICAgICAgICAgIGVuZENvbHVtbjogcmFuZ2Uuc3RhcnRDb2x1bW4KKyAgICAgICAgfTsKKyAgICAg
ICAgaWYgKHRoaXMuX2luVW5kbykKKyAgICAgICAgICAgIHRoaXMuX3JlZG9TdGFjay5wdXNoKGNv
bW1hbmQpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICghdGhpcy5faW5SZWRvKQor
ICAgICAgICAgICAgICAgIHRoaXMuX3JlZG9TdGFjayA9IFtdOworICAgICAgICAgICAgdGhpcy5f
dW5kb1N0YWNrLnB1c2goY29tbWFuZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbW1h
bmQ7CisgICAgfSwKKworICAgIHVuZG86IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIHRoaXMu
X21hcmtSZWRvYWJsZVN0YXRlKCk7CisKKyAgICAgICAgdGhpcy5faW5VbmRvID0gdHJ1ZTsKKyAg
ICAgICAgdmFyIHJhbmdlID0gdGhpcy5fZG9VbmRvKHRoaXMuX3VuZG9TdGFjayk7CisgICAgICAg
IGRlbGV0ZSB0aGlzLl9pblVuZG87CisKKyAgICAgICAgcmV0dXJuIHJhbmdlOworICAgIH0sCisK
KyAgICByZWRvOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB0aGlzLm1hcmtVbmRvYWJsZVN0
YXRlKCk7CisKKyAgICAgICAgdGhpcy5faW5SZWRvID0gdHJ1ZTsKKyAgICAgICAgdmFyIHJhbmdl
ID0gdGhpcy5fZG9VbmRvKHRoaXMuX3JlZG9TdGFjayk7CisgICAgICAgIGRlbGV0ZSB0aGlzLl9p
blJlZG87CisKKyAgICAgICAgcmV0dXJuIHJhbmdlOworICAgIH0sCisKKyAgICBfZG9VbmRvOiBm
dW5jdGlvbihzdGFjaykKKyAgICB7CisgICAgICAgIHZhciByYW5nZSA9IG51bGw7CisgICAgICAg
IGZvciAodmFyIGkgPSBzdGFjay5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICAg
ICAgdmFyIGNvbW1hbmQgPSBzdGFja1tpXTsKKyAgICAgICAgICAgIHN0YWNrLmxlbmd0aCA9IGk7
CisKKyAgICAgICAgICAgIHJhbmdlID0gdGhpcy5zZXRUZXh0KGNvbW1hbmQucmFuZ2UsIGNvbW1h
bmQudGV4dCk7CisgICAgICAgICAgICBpZiAoaSA+IDAgJiYgc3RhY2tbaSAtIDFdLmV4cGxpY2l0
KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOworICAgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgICAgIHJldHVybiByYW5nZTsKKyAgICB9LAorCisgICAgbWFya1VuZG9hYmxlU3Rh
dGU6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl91bmRvU3RhY2subGVuZ3Ro
KQorICAgICAgICAgICAgdGhpcy5fdW5kb1N0YWNrW3RoaXMuX3VuZG9TdGFjay5sZW5ndGggLSAx
XS5leHBsaWNpdCA9IHRydWU7CisgICAgfSwKKworICAgIF9tYXJrUmVkb2FibGVTdGF0ZTogZnVu
Y3Rpb24oKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX3JlZG9TdGFjay5sZW5ndGgpCisgICAg
ICAgICAgICB0aGlzLl9yZWRvU3RhY2tbdGhpcy5fcmVkb1N0YWNrLmxlbmd0aCAtIDFdLmV4cGxp
Y2l0ID0gdHJ1ZTsKKyAgICB9LAorCisgICAgcmVzZXRVbmRvU3RhY2s6IGZ1bmN0aW9uKCkKKyAg
ICB7CisgICAgICAgIHRoaXMuX3VuZG9TdGFjayA9IFtdOworICAgIH0KK30KZGlmZiAtLWdpdCBh
L1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9XZWJLaXQucXJjIGIvV2ViQ29yZS9pbnNwZWN0
b3IvZnJvbnQtZW5kL1dlYktpdC5xcmMKaW5kZXggNGEyMWUyYy4uODVkYmM2YiAxMDA2NDQKLS0t
IGEvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL1dlYktpdC5xcmMKKysrIGIvV2ViQ29yZS9p
bnNwZWN0b3IvZnJvbnQtZW5kL1dlYktpdC5xcmMKQEAgLTM1LDYgKzM1LDcgQEAKICAgICA8Zmls
ZT5pbnNwZWN0b3IuanM8L2ZpbGU+CiAgICAgPGZpbGU+SW5zcGVjdG9yQmFja2VuZFN0dWIuanM8
L2ZpbGU+CiAgICAgPGZpbGU+SW5zcGVjdG9yRnJvbnRlbmRIb3N0U3R1Yi5qczwvZmlsZT4KKyAg
ICA8ZmlsZT5KYXZhU2NyaXB0SGlnaGxpZ2h0ZXJTY2hlbWUuanM8L2ZpbGU+CiAgICAgPGZpbGU+
SmF2YVNjcmlwdFNvdXJjZVN5bnRheEhpZ2hsaWdodGVyLmpzPC9maWxlPgogICAgIDxmaWxlPktl
eWJvYXJkU2hvcnRjdXQuanM8L2ZpbGU+CiAgICAgPGZpbGU+TWV0cmljc1NpZGViYXJQYW5lLmpz
PC9maWxlPgpAQCAtNzAsNiArNzEsOSBAQAogICAgIDxmaWxlPlN0eWxlc1NpZGViYXJQYW5lLmpz
PC9maWxlPgogICAgIDxmaWxlPlN1bW1hcnlCYXIuanM8L2ZpbGU+CiAgICAgPGZpbGU+VGVzdENv
bnRyb2xsZXIuanM8L2ZpbGU+CisgICAgPGZpbGU+VGV4dEVkaXRvci5qczwvZmlsZT4KKyAgICA8
ZmlsZT5UZXh0RWRpdG9ySGlnaGxpZ2h0ZXIuanM8L2ZpbGU+CisgICAgPGZpbGU+VGV4dEVkaXRv
ck1vZGVsLmpzPC9maWxlPgogICAgIDxmaWxlPlRleHRQcm9tcHQuanM8L2ZpbGU+CiAgICAgPGZp
bGU+VGltZWxpbmVBZ2VudC5qczwvZmlsZT4KICAgICA8ZmlsZT5UaW1lbGluZUdyaWQuanM8L2Zp
bGU+CmRpZmYgLS1naXQgYS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvaW5zcGVjdG9yLmNz
cyBiL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9pbnNwZWN0b3IuY3NzCmluZGV4IGI2NzYx
NzUuLmRmZjhjMjkgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9pbnNw
ZWN0b3IuY3NzCisrKyBiL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9pbnNwZWN0b3IuY3Nz
CkBAIC0zNzU4LDMgKzM3NTgsNDkgQEAgb2wuYnJlYWtwb2ludC1saXN0IHsKIC53ZWJraXQtaHRt
bC1qcy1ub2RlLCAud2Via2l0LWh0bWwtY3NzLW5vZGUgewogICAgIHdoaXRlLXNwYWNlOiBwcmU7
CiB9CisKKy50ZXh0LWVkaXRvciB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDow
OworICAgIGxlZnQ6MDsKKyAgICByaWdodDowOworICAgIGJvdHRvbTowOworICAgIC13ZWJraXQt
dXNlci1zZWxlY3Q6IHRleHQ7CisgICAgLXdlYmtpdC11c2VyLW1vZGlmeTogcmVhZC13cml0ZS1w
bGFpbnRleHQtb25seTsKK30KKworLnRleHQtZWRpdG9yLWNhbnZhcyB7CisgICAgcG9zaXRpb246
IGFic29sdXRlOworICAgIHRvcDowOworICAgIGxlZnQ6MDsKKyAgICByaWdodDowOworICAgIGJv
dHRvbTowOworICAgIHotaW5kZXg6IDEwOworICAgIHBvaW50ZXItZXZlbnRzOiBub25lOworfQor
CisudGV4dC1lZGl0b3ItY29udGFpbmVyIHsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAg
dG9wOjA7CisgICAgbGVmdDowOworICAgIHJpZ2h0OjA7CisgICAgYm90dG9tOjA7CisgICAgb3Zl
cmZsb3c6IGF1dG87Cit9CisKKy50ZXh0LWVkaXRvci1zaGVldCB7CisgICAgb3BhY2l0eTogMDsK
K30KKworLnRleHQtZWRpdG9yLWN1cnNvciB7CisgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9u
ZTsKKyAgICAtd2Via2l0LXVzZXItbW9kaWZ5OiBub25lOworICAgIHBvc2l0aW9uOiBhYnNvbHV0
ZTsKKyAgICB0b3A6MDsKKyAgICBsZWZ0OjA7CisgICAgd2lkdGg6MXB4OworICAgIGhlaWdodDog
MTRweDsKKyAgICB6LWluZGV4OiAyMDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsKKyAg
ICBwb2ludGVyLWV2ZW50czogbm9uZTsKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUvaW5zcGVjdG9y
L2Zyb250LWVuZC9pbnNwZWN0b3IuaHRtbCBiL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9p
bnNwZWN0b3IuaHRtbAppbmRleCA5Zjc4YzBmLi4xMjhmMmU4IDEwMDY0NAotLS0gYS9XZWJDb3Jl
L2luc3BlY3Rvci9mcm9udC1lbmQvaW5zcGVjdG9yLmh0bWwKKysrIGIvV2ViQ29yZS9pbnNwZWN0
b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5odG1sCkBAIC05NCw2ICs5NCwxMCBAQCBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgog
ICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IlNvdXJjZVN5bnRheEhpZ2hs
aWdodGVyLmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIg
c3JjPSJDU1NTb3VyY2VTeW50YXhIaWdobGlnaHRlci5qcyI+PC9zY3JpcHQ+CiAgICAgPHNjcmlw
dCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iSmF2YVNjcmlwdFNvdXJjZVN5bnRheEhpZ2hs
aWdodGVyLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIg
c3JjPSJUZXh0RWRpdG9yTW9kZWwuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlwZT0idGV4
dC9qYXZhc2NyaXB0IiBzcmM9IlRleHRFZGl0b3IuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQg
dHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IlRleHRFZGl0b3JIaWdobGlnaHRlci5qcyI+PC9z
Y3JpcHQ+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iSmF2YVNjcmlw
dEhpZ2hsaWdodGVyU2NoZW1lLmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0IHR5cGU9InRleHQv
amF2YXNjcmlwdCIgc3JjPSJTb3VyY2VWaWV3LmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0IHR5
cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJGb250Vmlldy5qcyI+PC9zY3JpcHQ+CiAgICAgPHNj
cmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iSW1hZ2VWaWV3LmpzIj48L3NjcmlwdD4K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>45709</attachid>
            <date>2009-12-31 06:53:15 -0800</date>
            <delta_ts>2009-12-31 06:53:15 -0800</delta_ts>
            <desc>[File] Standalone editor runner for quick testing.</desc>
            <filename>editor.html</filename>
            <type>text/plain</type>
            <size>958</size>
            <attacher name="Pavel Feldman">pfeldman</attacher>
            
              <data encoding="base64">PGh0bWw+CjxoZWFkPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJl
Zj0iaW5zcGVjdG9yLmNzcyI+CjxzY3JpcHQ+CldlYkluc3BlY3RvciA9IHt9Cjwvc2NyaXB0PgoK
PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idXRpbGl0aWVzLmpzIj48L3Njcmlw
dD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iS2V5Ym9hcmRTaG9ydGN1dC5q
cyI+PC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IlRleHRFZGl0
b3JNb2RlbC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9
IlRleHRFZGl0b3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIg
c3JjPSJUZXh0RWRpdG9ySGlnaGxpZ2h0ZXIuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRl
eHQvamF2YXNjcmlwdCIgc3JjPSJKYXZhU2NyaXB0SGlnaGxpZ2h0ZXJTY2hlbWUuanMiPjwvc2Ny
aXB0PgoKPHNjcmlwdD4KZnVuY3Rpb24gd2luZG93TG9hZGVkKCkKewogICAgdGhpcy5lZGl0b3Ig
PSBuZXcgV2ViSW5zcGVjdG9yLlRleHRFZGl0b3IoKTsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5k
Q2hpbGQodGhpcy5lZGl0b3IuZWxlbWVudCk7CiAgICB0aGlzLmVkaXRvci5fdXBkYXRlU2l6ZSgp
OwoKICAgIHZhciBjbGllbnQgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgIGNsaWVudC5vcGVu
KCJHRVQiLCAiSmF2YVNjcmlwdEhpZ2hsaWdodGVyU2NoZW1lLmpzIiwgZmFsc2UpOwogICAgY2xp
ZW50LnNlbmQoKTsKICAgIHRoaXMuZWRpdG9yLnNldFRleHQoY2xpZW50LnJlc3BvbnNlVGV4dCk7
CiAgICB0aGlzLmVkaXRvci5lbGVtZW50LmZvY3VzKCk7Cn0KPC9zY3JpcHQ+CjwvaGVhZD4KCjxi
b2R5IG9ubG9hZD0id2luZG93TG9hZGVkKCk7Ij48L2JvZHk+Cgo8L2h0bWw+Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>46041</attachid>
            <date>2010-01-07 03:18:49 -0800</date>
            <delta_ts>2010-01-07 11:38:22 -0800</delta_ts>
            <desc>[PATCH] Same with support for CJK.</desc>
            <filename>canvas_editor</filename>
            <type>text/plain</type>
            <size>66842</size>
            <attacher name="Pavel Feldman">pfeldman</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MDA4MmQ0ZS4uMzM5MDBkMCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzMyBAQAorMjAwOS0xMi0zMSAgUGF2ZWwgRmVsZG1h
biAgPHBmZWxkbWFuQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBXZWIgSW5zcGVjdG9yOiBNaWdyYXRlIHRvIGNhbnZhcy1iYXNl
ZCB0ZXh0IHZpZXdlciAvIGVkaXRvciB0aGF0IHNjYWxlcy4KKworICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzMwMDEKKworICAgICAgICAqIFdlYkNvcmUu
Z3lwaToKKyAgICAgICAgKiBXZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvajoKKyAgICAgICAg
KiBpbnNwZWN0b3IvZnJvbnQtZW5kL0phdmFTY3JpcHRIaWdobGlnaHRlclNjaGVtZS5qczogQWRk
ZWQuCisgICAgICAgIChXZWJJbnNwZWN0b3IuSmF2YVNjcmlwdEhpZ2hsaWdodGVyU2NoZW1lKToK
KyAgICAgICAgKCk6CisgICAgICAgICogaW5zcGVjdG9yL2Zyb250LWVuZC9LZXlib2FyZFNob3J0
Y3V0LmpzOgorICAgICAgICAqIGluc3BlY3Rvci9mcm9udC1lbmQvVGV4dEVkaXRvci5qczogQWRk
ZWQuCisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dEVkaXRvcik6CisgICAgICAgIChXZWJJbnNw
ZWN0b3IuVGV4dFNlbGVjdGlvbk1vZGVsKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0Q3Vy
c29yKToKKyAgICAgICAgKiBpbnNwZWN0b3IvZnJvbnQtZW5kL1RleHRFZGl0b3JIaWdobGlnaHRl
ci5qczogQWRkZWQuCisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dEVkaXRvckhpZ2hsaWdodGVy
KToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0RWRpdG9ySGlnaGxpZ2h0ZXIucHJvdG90eXBl
LmhpZ2hsaWdodCk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dEVkaXRvckhpZ2hsaWdodGVy
LnByb3RvdHlwZS5fbGV4KToKKyAgICAgICAgKiBpbnNwZWN0b3IvZnJvbnQtZW5kL1RleHRFZGl0
b3JNb2RlbC5qczogQWRkZWQuCisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dFJhbmdlKToKKyAg
ICAgICAgKFdlYkluc3BlY3Rvci5UZXh0UmFuZ2UucHJvdG90eXBlLmNsb25lKToKKyAgICAgICAg
KFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yTW9kZWwpOgorICAgICAgICAqIGluc3BlY3Rvci9mcm9u
dC1lbmQvV2ViS2l0LnFyYzoKKyAgICAgICAgKiBpbnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rv
ci5jc3M6CisgICAgICAgICogaW5zcGVjdG9yL2Zyb250LWVuZC9pbnNwZWN0b3IuaHRtbDoKKwog
MjAwOS0xMi0zMCAgRGFyaW4gRmlzaGVyICA8ZGFyaW5AY2hyb21pdW0ub3JnPgogCiAgICAgICAg
IFJldmlld2VkIGJ5IERhdmlkIExldmluLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9XZWJDb3JlLmd5
cGkgYi9XZWJDb3JlL1dlYkNvcmUuZ3lwaQppbmRleCBhMzM2NjkzLi5hNzA3MWIxIDEwMDY0NAot
LS0gYS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQorKysgYi9XZWJDb3JlL1dlYkNvcmUuZ3lwaQpAQCAt
MzY4MCw2ICszNjgwLDcgQEAKICAgICAgICAgICAgICdpbnNwZWN0b3IvZnJvbnQtZW5kL0luamVj
dGVkU2NyaXB0LmpzJywKICAgICAgICAgICAgICdpbnNwZWN0b3IvZnJvbnQtZW5kL0luamVjdGVk
U2NyaXB0QWNjZXNzLmpzJywKICAgICAgICAgICAgICdpbnNwZWN0b3IvZnJvbnQtZW5kL2luc3Bl
Y3Rvci5qcycsCisgICAgICAgICAgICAnaW5zcGVjdG9yL2Zyb250LWVuZC9KYXZhU2NyaXB0SGln
aGxpZ2h0ZXJTY2hlbWUuanMnLAogICAgICAgICAgICAgJ2luc3BlY3Rvci9mcm9udC1lbmQvSmF2
YVNjcmlwdFNvdXJjZVN5bnRheEhpZ2hsaWdodGVyLmpzJywKICAgICAgICAgICAgICdpbnNwZWN0
b3IvZnJvbnQtZW5kL0tleWJvYXJkU2hvcnRjdXQuanMnLAogICAgICAgICAgICAgJ2luc3BlY3Rv
ci9mcm9udC1lbmQvTWV0cmljc1NpZGViYXJQYW5lLmpzJywKQEAgLTM3MTUsNiArMzcxNiw5IEBA
CiAgICAgICAgICAgICAnaW5zcGVjdG9yL2Zyb250LWVuZC9TdHlsZXNTaWRlYmFyUGFuZS5qcycs
CiAgICAgICAgICAgICAnaW5zcGVjdG9yL2Zyb250LWVuZC9TdW1tYXJ5QmFyLmpzJywKICAgICAg
ICAgICAgICdpbnNwZWN0b3IvZnJvbnQtZW5kL1Rlc3RDb250cm9sbGVyLmpzJywKKyAgICAgICAg
ICAgICdpbnNwZWN0b3IvZnJvbnQtZW5kL1RleHRFZGl0b3IuanMnLAorICAgICAgICAgICAgJ2lu
c3BlY3Rvci9mcm9udC1lbmQvVGV4dEVkaXRvckhpZ2hsaWdodGVyLmpzJywKKyAgICAgICAgICAg
ICdpbnNwZWN0b3IvZnJvbnQtZW5kL1RleHRFZGl0b3JNb2RlbC5qcycsCiAgICAgICAgICAgICAn
aW5zcGVjdG9yL2Zyb250LWVuZC9UZXh0UHJvbXB0LmpzJywKICAgICAgICAgICAgICdpbnNwZWN0
b3IvZnJvbnQtZW5kL1RpbWVsaW5lQWdlbnQuanMnLAogICAgICAgICAgICAgJ2luc3BlY3Rvci9m
cm9udC1lbmQvVGltZWxpbmVPdmVydmlld1BhbmUuanMnLApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9X
ZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvaiBiL1dlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2Vi
Q29yZS52Y3Byb2oKaW5kZXggOWRmOWE0NS4uMWJiOTNjNCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9X
ZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagorKysgYi9XZWJDb3JlL1dlYkNvcmUudmNwcm9q
L1dlYkNvcmUudmNwcm9qCkBAIC00Mjg0OCw2ICs0Mjg0OCwxMCBAQAogCQkJCQk+DQogCQkJCTwv
RmlsZT4NCiAJCQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0aD0iLi5caW5zcGVjdG9yXGZyb250
LWVuZFxKYXZhU2NyaXB0SGlnaGxpZ2h0ZXJTY2hlbWUuanMiDQorCQkJCQk+DQorCQkJCTwvRmls
ZT4NCisJCQkJPEZpbGUNCiAJCQkJCVJlbGF0aXZlUGF0aD0iLi5caW5zcGVjdG9yXGZyb250LWVu
ZFxKYXZhU2NyaXB0U291cmNlU3ludGF4SGlnaGxpZ2h0ZXIuanMiDQogCQkJCQk+DQogCQkJCTwv
RmlsZT4NCkBAIC00Mjk4NCw2ICs0Mjk4OCwxOCBAQAogCQkJCQk+DQogCQkJCTwvRmlsZT4NCiAJ
CQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0aD0iLi5caW5zcGVjdG9yXGZyb250LWVuZFxUZXh0
RWRpdG9yLmpzIg0KKwkJCQkJPg0KKwkJCQk8L0ZpbGU+DQorCQkJCTxGaWxlDQorCQkJCQlSZWxh
dGl2ZVBhdGg9Ii4uXGluc3BlY3Rvclxmcm9udC1lbmRcVGV4dEVkaXRvckhpZ2hsaWdodGVyLmpz
Ig0KKwkJCQkJPg0KKwkJCQk8L0ZpbGU+DQorCQkJCTxGaWxlDQorCQkJCQlSZWxhdGl2ZVBhdGg9
Ii4uXGluc3BlY3Rvclxmcm9udC1lbmRcVGV4dEVkaXRvck1vZGVsLmpzIg0KKwkJCQkJPg0KKwkJ
CQk8L0ZpbGU+DQorCQkJCTxGaWxlDQogCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGluc3BlY3Rvclxm
cm9udC1lbmRcVGV4dFByb21wdC5qcyINCiAJCQkJCT4NCiAJCQkJPC9GaWxlPg0KZGlmZiAtLWdp
dCBhL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9KYXZhU2NyaXB0SGlnaGxpZ2h0ZXJTY2hl
bWUuanMgYi9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvSmF2YVNjcmlwdEhpZ2hsaWdodGVy
U2NoZW1lLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYmYwNDkKLS0t
IC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvSmF2YVNjcmlwdEhp
Z2hsaWdodGVyU2NoZW1lLmpzCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA5IEFwcGxlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykg
MjAwOSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitXZWJJbnNwZWN0b3IuSmF2YVNjcmlwdEhpZ2hsaWdo
dGVyU2NoZW1lID0gZnVuY3Rpb24oKSB7CisgICAgdGhpcy5MZXhTdGF0ZSA9IHsKKyAgICAgICAg
SW5pdGlhbDogMSwKKyAgICAgICAgRGl2aXNpb25BbGxvd2VkOiAyCisgICAgfTsKKyAgICB0aGlz
LkNvbnRpbnVlU3RhdGUgPSB7CisgICAgICAgIE5vbmU6IDAsCisgICAgICAgIENvbW1lbnQ6IDEs
CisgICAgICAgIFNpbmdsZVF1b3RlU3RyaW5nOiAyLAorICAgICAgICBEb3VibGVRdW90ZVN0cmlu
ZzogMywKKyAgICAgICAgUmVnRXhwOiA0CisgICAgfTsKKworICAgIHZhciBrZXl3b3JkcyA9IFsK
KyAgICAgICAgIm51bGwiLCAidHJ1ZSIsICJmYWxzZSIsICJicmVhayIsICJjYXNlIiwgImNhdGNo
IiwgImNvbnN0IiwgImRlZmF1bHQiLCAiZmluYWxseSIsICJmb3IiLAorICAgICAgICAiaW5zdGFu
Y2VvZiIsICJuZXciLCAidmFyIiwgImNvbnRpbnVlIiwgImZ1bmN0aW9uIiwgInJldHVybiIsICJ2
b2lkIiwgImRlbGV0ZSIsICJpZiIsCisgICAgICAgICJ0aGlzIiwgImRvIiwgIndoaWxlIiwgImVs
c2UiLCAiaW4iLCAic3dpdGNoIiwgInRocm93IiwgInRyeSIsICJ0eXBlb2YiLCAiZGVidWdnZXIi
LAorICAgICAgICAiY2xhc3MiLCAiZW51bSIsICJleHBvcnQiLCAiZXh0ZW5kcyIsICJpbXBvcnQi
LCAic3VwZXIiLCAiZ2V0IiwgInNldCIKKyAgICBdLmtleVNldCgpOworCisgICAgdmFyIHRva2Vu
VHlwZXMgPSBXZWJJbnNwZWN0b3IuVGV4dEVkaXRvckhpZ2hsaWdodGVyLlRva2VuVHlwZTsKKwor
ICAgIHRoaXMucnVsZXMgPSBbeworICAgICAgICBuYW1lOiAic2luZ2xlTGluZUNvbW1lbnRBY3Rp
b24iLAorICAgICAgICBwYXR0ZXJuOiAvXig/OlwvXC8uKikvLAorICAgICAgICB0eXBlOiB0b2tl
blR5cGVzLkNvbW1lbnQKKyAgICB9LCB7CisgICAgICAgIG5hbWU6ICJtdWx0aUxpbmVTaW5nbGVM
aW5lQ29tbWVudEFjdGlvbiIsCisgICAgICAgIHBhdHRlcm46IC9eKD86XC9cKig/OlteXCpdfFwq
W15cL10pKlwqK1wvKS8sCisgICAgICAgIHR5cGU6IHRva2VuVHlwZXMuQ29tbWVudAorICAgIH0s
IHsKKyAgICAgICAgbmFtZTogIm11bHRpTGluZUNvbW1lbnRTdGFydEFjdGlvbiIsCisgICAgICAg
IHBhdHRlcm46IC9eKD86XC9cKig/OlteXCpdfFwqW15cL10pKikvLAorICAgICAgICB0eXBlOiB0
b2tlblR5cGVzLkNvbW1lbnQsCisgICAgICAgIHBvc3RDb250aW51ZVN0YXRlOiB0aGlzLkNvbnRp
bnVlU3RhdGUuQ29tbWVudAorICAgIH0sIHsKKyAgICAgICAgbmFtZTogIm11bHRpTGluZUNvbW1l
bnRFbmRBY3Rpb24iLAorICAgICAgICBwYXR0ZXJuOiAvXig/Oig/OlteXCpdfFwqW15cL10pKlwq
K1wvKS8sCisgICAgICAgIHR5cGU6IHRva2VuVHlwZXMuQ29tbWVudCwKKyAgICAgICAgcHJlQ29u
dGludWVTdGF0ZTogdGhpcy5Db250aW51ZVN0YXRlLkNvbW1lbnQsCisgICAgICAgIHBvc3RDb250
aW51ZVN0YXRlOiB0aGlzLkNvbnRpbnVlU3RhdGUuTm9uZQorICAgIH0sIHsKKyAgICAgICAgbmFt
ZTogIm11bHRpTGluZUNvbW1lbnRNaWRkbGVBY3Rpb24iLAorICAgICAgICBwYXR0ZXJuOiAvXi4q
LywKKyAgICAgICAgdHlwZTogdG9rZW5UeXBlcy5Db21tZW50LAorICAgICAgICBwcmVDb250aW51
ZVN0YXRlOiB0aGlzLkNvbnRpbnVlU3RhdGUuQ29tbWVudAorICAgIH0sIHsKKyAgICAgICAgbmFt
ZTogIm51bWVyaWNMaXRlcmFsQWN0aW9uIiwKKyAgICAgICAgcGF0dGVybjogL14oPzooPzowfFsx
LTldXGQqKVwuXGQrPyg/OltlRV0oPzpcZCt8XCtcZCt8LVxkKykpP3xcLlxkKyg/OltlRV0oPzpc
ZCt8XCtcZCt8LVxkKykpP3woPzowfFsxLTldXGQqKSg/OltlRV0oPzpcZCt8XCtcZCt8LVxkKykp
P3wweFswLTlhLWZBLUZdK3wwWFswLTlhLWZBLUZdKylccyovLAorICAgICAgICB0eXBlOiB0b2tl
blR5cGVzLk51bWJlciwKKyAgICAgICAgcG9zdExleFN0YXRlOiB0aGlzLkxleFN0YXRlLkRpdmlz
aW9uQWxsb3dlZAorICAgIH0sIHsKKyAgICAgICAgbmFtZTogInN0cmluZ0xpdGVyYWxBY3Rpb24i
LAorICAgICAgICBwYXR0ZXJuOiAvXig/OiIoPzpbXiJcXF18XFwoPzpbJyJcYmZucnR2XXxbXici
XGJmbnJ0djAtOXh1XXwwfHhbMC05YS1mQS1GXVswLTlhLWZBLUZdfCg/OnVbMC05YS1mQS1GXVsw
LTlhLWZBLUZdWzAtOWEtZkEtRl1bMC05YS1mQS1GXSkpKSoifCcoPzpbXidcXF18XFwoPzpbJyJc
YmZucnR2XXxbXiciXGJmbnJ0djAtOXh1XXwwfHhbMC05YS1mQS1GXVswLTlhLWZBLUZdfCg/OnVb
MC05YS1mQS1GXVswLTlhLWZBLUZdWzAtOWEtZkEtRl1bMC05YS1mQS1GXSkpKSonKS8sCisgICAg
ICAgIHR5cGU6IHRva2VuVHlwZXMuU3RyaW5nLAorICAgICAgICBwb3N0TGV4U3RhdGU6IHRoaXMu
TGV4U3RhdGUuSW5pdGlhbAorICAgIH0sIHsKKyAgICAgICAgbmFtZTogInNpbmdsZVF1b3RlU3Ry
aW5nU3RhcnRBY3Rpb24iLAorICAgICAgICBwYXR0ZXJuOiAvXig/OicoPzpbXidcXF18XFwoPzpb
JyJcYmZucnR2XXxbXiciXGJmbnJ0djAtOXh1XXwwfHhbMC05YS1mQS1GXVswLTlhLWZBLUZdfCg/
OnVbMC05YS1mQS1GXVswLTlhLWZBLUZdWzAtOWEtZkEtRl1bMC05YS1mQS1GXSkpKSopXFwkLywK
KyAgICAgICAgdHlwZTogdG9rZW5UeXBlcy5TdHJpbmcsCisgICAgICAgIHBvc3RDb250aW51ZVN0
YXRlOiAgdGhpcy5Db250aW51ZVN0YXRlLlNpbmdsZVF1b3RlU3RyaW5nCisgICAgfSwgeworICAg
ICAgICBuYW1lOiAic2luZ2xlUXVvdGVTdHJpbmdFbmRBY3Rpb24iLAorICAgICAgICBwYXR0ZXJu
OiAvXig/Oig/OlteJ1xcXXxcXCg/OlsnIlxiZm5ydHZdfFteJyJcYmZucnR2MC05eHVdfDB8eFsw
LTlhLWZBLUZdWzAtOWEtZkEtRl18KD86dVswLTlhLWZBLUZdWzAtOWEtZkEtRl1bMC05YS1mQS1G
XVswLTlhLWZBLUZdKSkpKicpLywKKyAgICAgICAgdHlwZTogdG9rZW5UeXBlcy5TdHJpbmcsCisg
ICAgICAgIHByZUNvbnRpbnVlU3RhdGU6IHRoaXMuQ29udGludWVTdGF0ZS5TaW5nbGVRdW90ZVN0
cmluZywKKyAgICAgICAgcG9zdENvbnRpbnVlU3RhdGU6IHRoaXMuQ29udGludWVTdGF0ZS5Ob25l
CisgICAgfSwgeworICAgICAgICBuYW1lOiAic2luZ2xlUXVvdGVTdHJpbmdNaWRkbGVBY3Rpb24i
LAorICAgICAgICBwYXR0ZXJuOiAvXig/Oig/OlteJ1xcXXxcXCg/OlsnIlxiZm5ydHZdfFteJyJc
YmZucnR2MC05eHVdfDB8eFswLTlhLWZBLUZdWzAtOWEtZkEtRl18KD86dVswLTlhLWZBLUZdWzAt
OWEtZkEtRl1bMC05YS1mQS1GXVswLTlhLWZBLUZdKSkpKilcXCQvLAorICAgICAgICB0eXBlOiB0
b2tlblR5cGVzLlN0cmluZywKKyAgICAgICAgcHJlQ29udGludWVTdGF0ZTogdGhpcy5Db250aW51
ZVN0YXRlLlNpbmdsZVF1b3RlU3RyaW5nCisgICAgfSwgeworICAgICAgICBuYW1lOiAiZG91Ymxl
UXVvdGVTdHJpbmdTdGFydEFjdGlvbiIsCisgICAgICAgIHBhdHRlcm46IC9eKD86Iig/OlteIlxc
XXxcXCg/OlsnIlxiZm5ydHZdfFteJyJcYmZucnR2MC05eHVdfDB8eFswLTlhLWZBLUZdWzAtOWEt
ZkEtRl18KD86dVswLTlhLWZBLUZdWzAtOWEtZkEtRl1bMC05YS1mQS1GXVswLTlhLWZBLUZdKSkp
KilcXCQvLAorICAgICAgICB0eXBlOiB0b2tlblR5cGVzLlN0cmluZywKKyAgICAgICAgcG9zdENv
bnRpbnVlU3RhdGU6IHRoaXMuQ29udGludWVTdGF0ZS5Eb3VibGVRdW90ZVN0cmluZworICAgIH0s
IHsKKyAgICAgICAgbmFtZTogImRvdWJsZVF1b3RlU3RyaW5nRW5kQWN0aW9uIiwKKyAgICAgICAg
cGF0dGVybjogL14oPzooPzpbXiJcXF18XFwoPzpbJyJcYmZucnR2XXxbXiciXGJmbnJ0djAtOXh1
XXwwfHhbMC05YS1mQS1GXVswLTlhLWZBLUZdfCg/OnVbMC05YS1mQS1GXVswLTlhLWZBLUZdWzAt
OWEtZkEtRl1bMC05YS1mQS1GXSkpKSoiKS8sCisgICAgICAgIHR5cGU6IHRva2VuVHlwZXMuU3Ry
aW5nLAorICAgICAgICBwcmVDb250aW51ZVN0YXRlOiB0aGlzLkNvbnRpbnVlU3RhdGUuRG91Ymxl
UXVvdGVTdHJpbmcsCisgICAgICAgIHBvc3RDb250aW51ZVN0YXRlOiB0aGlzLkNvbnRpbnVlU3Rh
dGUuTm9uZQorICAgIH0sIHsKKyAgICAgICAgbmFtZTogImRvdWJsZVF1b3RlU3RyaW5nTWlkZGxl
QWN0aW9uIiwKKyAgICAgICAgcGF0dGVybjogL14oPzooPzpbXiJcXF18XFwoPzpbJyJcYmZucnR2
XXxbXiciXGJmbnJ0djAtOXh1XXwwfHhbMC05YS1mQS1GXVswLTlhLWZBLUZdfCg/OnVbMC05YS1m
QS1GXVswLTlhLWZBLUZdWzAtOWEtZkEtRl1bMC05YS1mQS1GXSkpKSopXFwkLywKKyAgICAgICAg
dHlwZTogdG9rZW5UeXBlcy5TdHJpbmcsCisgICAgICAgIHByZUNvbnRpbnVlU3RhdGU6IHRoaXMu
Q29udGludWVTdGF0ZS5Eb3VibGVRdW90ZVN0cmluZworICAgIH0sIHsKKyAgICAgICAgbmFtZTog
ImtleXdvcmRBY3Rpb24iLAorICAgICAgICBwYXR0ZXJuOiAvXig/Oig/OlthLXpBLVpdfFskX118
XFwoPzp1WzAtOWEtZkEtRl1bMC05YS1mQS1GXVswLTlhLWZBLUZdWzAtOWEtZkEtRl0pKSg/Oig/
OlthLXpBLVpdfFskX118XFwoPzp1WzAtOWEtZkEtRl1bMC05YS1mQS1GXVswLTlhLWZBLUZdWzAt
OWEtZkEtRl0pKXxbMC05XSkqKS8sCisgICAgICAgIGtleXdvcmRzOiBrZXl3b3JkcywKKyAgICAg
ICAgdHlwZTogdG9rZW5UeXBlcy5LZXl3b3JkLAorICAgICAgICBwb3N0TGV4U3RhdGU6IHRoaXMu
TGV4U3RhdGUuSW5pdGlhbAorICAgIH0sIHsKKyAgICAgICAgbmFtZTogImlkZW50QWN0aW9uIiwK
KyAgICAgICAgcGF0dGVybjogL14oPzooPzpbYS16QS1aXXxbJF9dfFxcKD86dVswLTlhLWZBLUZd
WzAtOWEtZkEtRl1bMC05YS1mQS1GXVswLTlhLWZBLUZdKSkoPzooPzpbYS16QS1aXXxbJF9dfFxc
KD86dVswLTlhLWZBLUZdWzAtOWEtZkEtRl1bMC05YS1mQS1GXVswLTlhLWZBLUZdKSl8WzAtOV0p
KilccyovLAorICAgICAgICBwb3N0TGV4U3RhdGU6IHRoaXMuTGV4U3RhdGUuRGl2aXNpb25BbGxv
d2VkCisgICAgfSwgeworICAgICAgICBuYW1lOiAicmlnaHRQYXJlbkFjdGlvbiIsCisgICAgICAg
IHBhdHRlcm46IC9eXClccyovLAorICAgICAgICBwb3N0TGV4U3RhdGU6IHRoaXMuTGV4U3RhdGUu
RGl2aXNpb25BbGxvd2VkCisgICAgfSwgeworICAgICAgICBuYW1lOiAicHVuY3R1YXRvckFjdGlv
biIsCisgICAgICAgIHBhdHRlcm46IC9eKD86PD18Pj18PT09fD09fCE9fCE9PXxcK1wrfFwtXC18
PDx8Pj58Pj4+fCYmfFx8XHx8XCs9fFwtPXxcKj18JT18PDw9fD4+PXw+Pj49fCY9fFx8PXxePXxb
XHN7fVwoXFtcXVwuOyw8PlwrXC1cKiUmXHxcXiF+XD86PV0pLywKKyAgICAgICAgcG9zdExleFN0
YXRlOiB0aGlzLkxleFN0YXRlLkluaXRpYWwKKyAgICB9LCB7CisgICAgICAgIG5hbWU6ICJkaXZQ
dW5jdHVhdG9yQWN0aW9uIiwKKyAgICAgICAgcGF0dGVybjogL14oPzpcLz0/KS8sCisgICAgICAg
IHByZUxleFN0YXRlOiB0aGlzLkxleFN0YXRlLkRpdmlzaW9uQWxsb3dlZCwKKyAgICAgICAgcG9z
dExleFN0YXRlOiB0aGlzLkxleFN0YXRlLkluaXRpYWwKKyAgICB9LCB7CisgICAgICAgIG5hbWU6
ICJyZWdFeHBMaXRlcmFsQWN0aW9uIiwKKyAgICAgICAgcGF0dGVybjogL14oPzpcLyg/Oig/Olxc
Lil8W15cXCpcL10pKD86KD86XFwuKXxbXlxcXC9dKSpcLyg/Oig/OlthLXpBLVpdfFskX118XFwo
Pzp1WzAtOWEtZkEtRl1bMC05YS1mQS1GXVswLTlhLWZBLUZdWzAtOWEtZkEtRl0pKXxbMC05XSkq
KS8sCisgICAgICAgIHR5cGU6IHRva2VuVHlwZXMuU3RyaW5nLAorICAgICAgICBwb3N0TGV4U3Rh
dGU6IHRoaXMuTGV4U3RhdGUuSW5pdGlhbAorICAgIH0sIHsKKyAgICAgICAgbmFtZTogInJlZ0V4
cFN0YXJ0QWN0aW9uIiwKKyAgICAgICAgcGF0dGVybjogL14oPzpcLyg/Oig/OlxcLil8W15cXCpc
L10pKD86KD86XFwuKXxbXlxcXC9dKSopXFwkLywKKyAgICAgICAgdHlwZTogdG9rZW5UeXBlcy5T
dHJpbmcsCisgICAgICAgIHBvc3RDb250aW51ZVN0YXRlOiB0aGlzLkNvbnRpbnVlU3RhdGUuUmVn
RXhwCisgICAgfSwgeworICAgICAgICBuYW1lOiAicmVnRXhwRW5kQWN0aW9uIiwKKyAgICAgICAg
cGF0dGVybjogL14oPzooPzooPzpcXC4pfFteXFxcL10pKlwvKD86KD86W2EtekEtWl18WyRfXXxc
XCg/OnVbMC05YS1mQS1GXVswLTlhLWZBLUZdWzAtOWEtZkEtRl1bMC05YS1mQS1GXSkpfFswLTld
KSopLywKKyAgICAgICAgdHlwZTogdG9rZW5UeXBlcy5TdHJpbmcsCisgICAgICAgIHByZUNvbnRp
bnVlU3RhdGU6IHRoaXMuQ29udGludWVTdGF0ZS5SZWdFeHAsCisgICAgICAgIHBvc3RDb250aW51
ZVN0YXRlOiB0aGlzLkNvbnRpbnVlU3RhdGUuTm9uZQorICAgIH0sIHsKKyAgICAgICAgbmFtZTog
InJlZ0V4cE1pZGRsZUFjdGlvbiIsCisgICAgICAgIHBhdHRlcm46IC9eKD86KD86KD86XFwuKXxb
XlxcXC9dKSopXFwkLywKKyAgICAgICAgdHlwZTogdG9rZW5UeXBlcy5TdHJpbmcsCisgICAgICAg
IHByZUNvbnRpbnVlU3RhdGU6IHRoaXMuQ29udGludWVTdGF0ZS5SZWdFeHAKKyAgICB9LCB7Cisg
ICAgICAgIG5hbWU6ICJ3aGl0ZXNwYWNlIiwKKyAgICAgICAgcGF0dGVybjogL15ccyskLworICAg
IH1dOworfQorCitXZWJJbnNwZWN0b3IuSmF2YVNjcmlwdEhpZ2hsaWdodGVyU2NoZW1lLnByb3Rv
dHlwZSA9IHsKKyAgICByZXNldDogZnVuY3Rpb24oaGlnaGxpZ2h0ZXIpCisgICAgeworICAgICAg
ICBoaWdobGlnaHRlci5sZXhTdGF0ZSA9IHRoaXMuTGV4U3RhdGUuSW5pdGlhbDsKKyAgICAgICAg
aGlnaGxpZ2h0ZXIuY29udGludWVTdGF0ZSA9IHRoaXMuQ29udGludWVTdGF0ZS5Ob25lOworICAg
IH0KK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9LZXlib2FyZFNo
b3J0Y3V0LmpzIGIvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0tleWJvYXJkU2hvcnRjdXQu
anMKaW5kZXggMGEwNjhkNS4uYjkzODZkYyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9pbnNwZWN0b3Iv
ZnJvbnQtZW5kL0tleWJvYXJkU2hvcnRjdXQuanMKKysrIGIvV2ViQ29yZS9pbnNwZWN0b3IvZnJv
bnQtZW5kL0tleWJvYXJkU2hvcnRjdXQuanMKQEAgLTQ1LDYgKzQ1LDcgQEAgV2ViSW5zcGVjdG9y
LktleWJvYXJkU2hvcnRjdXQuTW9kaWZpZXJzID0gewogCiBXZWJJbnNwZWN0b3IuS2V5Ym9hcmRT
aG9ydGN1dC5LZXlDb2RlcyA9IHsKICAgICBCYWNrc3BhY2U6IDgsCisgICAgVGFiOiA5LAogICAg
IEVzYzogMjcsCiAgICAgU3BhY2U6IDMyLAogICAgIFBhZ2VVcDogMzMsICAgICAgLy8gYWxzbyBO
VU1fTk9SVEhfRUFTVApAQCAtNzMsNyArNzQsNyBAQCBXZWJJbnNwZWN0b3IuS2V5Ym9hcmRTaG9y
dGN1dC5LZXlDb2RlcyA9IHsKICAgICBQZXJpb2Q6IDE5MCwgICAgICAgLy8gLgogICAgIFNsYXNo
OiAxOTEsICAgICAgICAvLyAvCiAgICAgQXBvc3Ryb3BoZTogMTkyLCAgIC8vIGAKLSAgICBTaW5n
bGVRdW90ZTogMjIyLCAgLy8gJworICAgIFNpbmdsZVF1b3RlOiAyMjIgICAvLyAnCiB9OwogCiAv
KioKZGlmZiAtLWdpdCBhL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9UZXh0RWRpdG9yLmpz
IGIvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL1RleHRFZGl0b3IuanMKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThmZDk1OAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNv
cmUvaW5zcGVjdG9yL2Zyb250LWVuZC9UZXh0RWRpdG9yLmpzCkBAIC0wLDAgKzEsODc1IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAg
ICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAq
IGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4g
bm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRv
cnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdp
dGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRP
UlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05F
UiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisg
KiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworV2Vi
SW5zcGVjdG9yLlRleHRFZGl0b3IgPSBmdW5jdGlvbigpCit7CisgICAgdGhpcy5fdGV4dE1vZGVs
ID0gbmV3IFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yTW9kZWwodGhpcy5fdGV4dENoYW5nZWQuYmlu
ZCh0aGlzKSk7CisgICAgdGhpcy5faGlnaGxpZ2h0ZXIgPSBuZXcgV2ViSW5zcGVjdG9yLlRleHRF
ZGl0b3JIaWdobGlnaHRlcih0aGlzLl90ZXh0TW9kZWwpOworCisgICAgdGhpcy5lbGVtZW50ID0g
ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgdGhpcy5lbGVtZW50LmNsYXNzTmFt
ZSA9ICJ0ZXh0LWVkaXRvciI7CisgICAgdGhpcy5lbGVtZW50LnRhYkluZGV4ID0gMDsKKworICAg
IHRoaXMuX2NhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOworICAgIHRo
aXMuX2NhbnZhcy5jbGFzc05hbWUgPSAidGV4dC1lZGl0b3ItY2FudmFzIjsKKyAgICB0aGlzLmVs
ZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fY2FudmFzKTsKKworICAgIHRoaXMuX2NvbnRhaW5lciA9
IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgIHRoaXMuX2NvbnRhaW5lci5jbGFz
c05hbWUgPSAidGV4dC1lZGl0b3ItY29udGFpbmVyIjsKKyAgICB0aGlzLmVsZW1lbnQuYXBwZW5k
Q2hpbGQodGhpcy5fY29udGFpbmVyKTsKKworICAgIHRoaXMuX3NoZWV0ID0gZG9jdW1lbnQuY3Jl
YXRlRWxlbWVudCgiZGl2Iik7CisgICAgdGhpcy5fc2hlZXQuY2xhc3NOYW1lID0gInRleHQtZWRp
dG9yLXNoZWV0IjsKKyAgICB0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fc2hlZXQp
OworCisgICAgdGhpcy5fbGluZUhlaWdodCA9IDE0OworCisgICAgdmFyIGN1cnNvckVsZW1lbnQg
PSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgICBjdXJzb3JFbGVtZW50LmNsYXNz
TmFtZSA9ICJ0ZXh0LWVkaXRvci1jdXJzb3IiOworICAgIGN1cnNvckVsZW1lbnQuc3R5bGUuaGVp
Z2h0ID0gdGhpcy5fbGluZUhlaWdodCArICJweCI7CisgICAgdGhpcy5fY29udGFpbmVyLmFwcGVu
ZENoaWxkKGN1cnNvckVsZW1lbnQpOworCisgICAgdGhpcy5fY29udGFpbmVyLmFkZEV2ZW50TGlz
dGVuZXIoInNjcm9sbCIsIHRoaXMuX3Njcm9sbC5iaW5kKHRoaXMpKTsKKyAgICB0aGlzLl9zaGVl
dC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgdGhpcy5fbW91c2VVcC5iaW5kKHRoaXMpKTsK
KyAgICB0aGlzLl9zaGVldC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLCB0aGlzLl9tb3Vz
ZURvd24uYmluZCh0aGlzKSk7CisgICAgdGhpcy5fc2hlZXQuYWRkRXZlbnRMaXN0ZW5lcigibW91
c2Vtb3ZlIiwgdGhpcy5fbW91c2VNb3ZlLmJpbmQodGhpcykpOworICAgIHRoaXMuX3NoZWV0LmFk
ZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IiwgdGhpcy5fbW91c2VPdXQuYmluZCh0aGlzKSk7Cisg
ICAgdGhpcy5fc2hlZXQuYWRkRXZlbnRMaXN0ZW5lcigiZGJsY2xpY2siLCB0aGlzLl9kYmxDbGlj
ay5iaW5kKHRoaXMpKTsKKyAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93
biIsIHRoaXMuX2tleURvd24uYmluZCh0aGlzKSk7CisgICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50
TGlzdGVuZXIoInRleHRJbnB1dCIsIHRoaXMuX3RleHRJbnB1dC5iaW5kKHRoaXMpKTsKKyAgICB0
aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JlY29weSIsIHRoaXMuX2JlZm9yZUNv
cHkuYmluZCh0aGlzKSk7CisgICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNvcHki
LCB0aGlzLl9jb3B5LmJpbmQodGhpcykpOworICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3Rl
bmVyKCJiZWZvcmVjdXQiLCB0aGlzLl9iZWZvcmVDdXQuYmluZCh0aGlzKSk7CisgICAgdGhpcy5l
bGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoImN1dCIsIHRoaXMuX2N1dC5iaW5kKHRoaXMpKTsKKyAg
ICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JlcGFzdGUiLCB0aGlzLl9iZWZv
cmVQYXN0ZS5iaW5kKHRoaXMpKTsKKyAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigi
cGFzdGUiLCB0aGlzLl9wYXN0ZS5iaW5kKHRoaXMpKTsKKworICAgIHRoaXMuX2Rlc2lyZWRDYXJl
dENvbHVtbiA9IDA7CisgICAgdGhpcy5fc2Nyb2xsTGVmdCA9IDA7CisgICAgdGhpcy5fc2Nyb2xs
VG9wID0gMDsKKworICAgIHRoaXMuX2N0eCA9IHRoaXMuX2NhbnZhcy5nZXRDb250ZXh0KCIyZCIp
OworICAgIHRoaXMuX3NlbGVjdGlvbiA9IG5ldyBXZWJJbnNwZWN0b3IuVGV4dFNlbGVjdGlvbk1v
ZGVsKHRoaXMuX3NlbGVjdGlvbkNoYW5nZWQuYmluZCh0aGlzKSk7CisgICAgdGhpcy5fY3Vyc29y
ID0gbmV3IFdlYkluc3BlY3Rvci5UZXh0Q3Vyc29yKGN1cnNvckVsZW1lbnQsIHRoaXMuX2xpbmVI
ZWlnaHQpOworCisgICAgdGhpcy5fcGFpbnRDb2FsZXNjaW5nTGV2ZWwgPSAwOworCisgICAgdGhp
cy5faW5pdEZvbnQoKTsKKyAgICB0aGlzLl9yZWdpc3RlclNob3J0Y3V0cygpOworICAgIC8vIERl
YnVnZ2luZyBmbGFncywgYWxsb3cgZGlzYWJsaW5nIC8gZW5hYmxpbmcgaGlnaGxpZ2h0cyBhbmQg
dHJhY2sgcmVwYWludHMuCisgICAgdGhpcy5faGlnaGxpZ2h0aW5nRW5hYmxlZCA9IHRydWU7Cisg
ICAgdGhpcy5fZGVidWdNb2RlID0gZmFsc2U7CisgICAgdGhpcy5fbGluZUFsaWdubWVudE9mZnNl
dCA9IDA7CisKKyAgICB0aGlzLl90ZXh0V2lkdGggPSAwOworICAgIHRoaXMuX2xvbmdlc3RMaW5l
TnVtYmVyID0gMDsKK30KKworV2ViSW5zcGVjdG9yLlRleHRFZGl0b3IucHJvdG90eXBlID0gewor
ICAgIHNldFRleHQ6IGZ1bmN0aW9uKHRleHQpCisgICAgeworICAgICAgICB2YXIgbGFzdExpbmUg
PSB0aGlzLl90ZXh0TW9kZWwubGluZXNDb3VudCgpIC0gMTsKKyAgICAgICAgdGhpcy5fdGV4dE1v
ZGVsLnNldFRleHQobnVsbCwgdGV4dCk7CisgICAgICAgIHRoaXMuX3RleHRNb2RlbC5yZXNldFVu
ZG9TdGFjaygpOworICAgICAgICB0aGlzLl9zZXRDYXJldExvY2F0aW9uKDAsIDApOworICAgIH0s
CisKKyAgICBzZXRTZWxlY3Rpb246IGZ1bmN0aW9uKHN0YXJ0TGluZSwgc3RhcnRDb2x1bW4sIGVu
ZExpbmUsIGVuZENvbHVtbikKKyAgICB7CisgICAgICAgIHZhciBzdGFydCA9IHRoaXMuX2ZpdChz
dGFydExpbmUsIHN0YXJ0Q29sdW1uKTsKKyAgICAgICAgdGhpcy5fc2VsZWN0aW9uLnNldFN0YXJ0
KHN0YXJ0LmxpbmUsIHN0YXJ0LmNvbHVtbik7CisgICAgICAgIHRoaXMuX3NldFNlbGVjdGlvbkVu
ZChlbmRMaW5lLCBlbmRDb2x1bW4pOworICAgIH0sCisKKyAgICByZXZlYWw6IGZ1bmN0aW9uKGxp
bmUsIGNvbHVtbikgeworICAgICAgICB2YXIgZmlyc3RMaW5lID0gdGhpcy5fc2Nyb2xsVG9wIC8g
dGhpcy5fbGluZUhlaWdodDsKKyAgICAgICAgdmFyIHZpc2libGVMaW5lcyA9IHRoaXMuX2NhbnZh
cy5oZWlnaHQgLyB0aGlzLl9saW5lSGVpZ2h0OworICAgICAgICB2YXIgbWluVG9wID0gKGxpbmUg
LSB2aXNpYmxlTGluZXMgKyAxKSAqIHRoaXMuX2xpbmVIZWlnaHQ7CisgICAgICAgIHZhciBtYXhU
b3AgPSBsaW5lICogdGhpcy5fbGluZUhlaWdodDsKKyAgICAgICAgaWYgKHRoaXMuX3Njcm9sbFRv
cCA8IG1pblRvcCkgeworICAgICAgICAgICAgdGhpcy5fbGluZUFsaWdubWVudE9mZnNldCA9IHRo
aXMuX2NhbnZhcy5oZWlnaHQgJSB0aGlzLl9saW5lSGVpZ2h0OworICAgICAgICAgICAgdGhpcy5f
Y29udGFpbmVyLnNjcm9sbFRvcCA9IG1pblRvcDsKKyAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9z
Y3JvbGxUb3AgPiBtYXhUb3ApIHsKKyAgICAgICAgICAgIHRoaXMuX2xpbmVBbGlnbm1lbnRPZmZz
ZXQgPSAwOworICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLnNjcm9sbFRvcCA9IG1heFRvcDsK
KyAgICAgICAgfQorCisgICAgICAgIHZhciBmaXJzdENvbHVtbiA9IHRoaXMuX2NvbHVtbkZvck9m
ZnNldChsaW5lLCB0aGlzLl9zY3JvbGxMZWZ0KTsKKyAgICAgICAgdmFyIG1heExlZnQgPSB0aGlz
Ll9jb2x1bW5Ub09mZnNldChsaW5lLCBjb2x1bW4pOworICAgICAgICB2YXIgbWluTGVmdCA9IG1h
eExlZnQgLSB0aGlzLl9jb250YWluZXIuY2xpZW50V2lkdGggKyB0aGlzLl9saW5lTnVtYmVyT2Zm
c2V0OworICAgICAgICBpZiAodGhpcy5fc2Nyb2xsTGVmdCA8IG1pbkxlZnQpCisgICAgICAgICAg
ICB0aGlzLl9jb250YWluZXIuc2Nyb2xsTGVmdCA9IG1pbkxlZnQgKyAxMDA7CisgICAgICAgIGlm
ICh0aGlzLl9zY3JvbGxMZWZ0ID4gbWF4TGVmdCkKKyAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5l
ci5zY3JvbGxMZWZ0ID0gbWF4TGVmdDsKKyAgICB9LAorCisgICAgLy8gV2ViSW5zcGVjdG9yLlRl
eHRNb2RlbCBsaXN0ZW5lcgorICAgIF90ZXh0Q2hhbmdlZDogZnVuY3Rpb24ob2xkUmFuZ2UsIG5l
d1JhbmdlLCBvbGRUZXh0LCBuZXdUZXh0KQorICAgIHsKKyAgICAgICAgaWYgKG5ld1JhbmdlLmxp
bmVzQ291bnQoKSA9PSBvbGRSYW5nZS5saW5lc0NvdW50KCkpCisgICAgICAgICAgICB0aGlzLl9p
bnZhbGlkYXRlTGluZXMobmV3UmFuZ2Uuc3RhcnRMaW5lLCBuZXdSYW5nZS5lbmRMaW5lICsgMSk7
CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIC8vIExpbmVzIHNoaWZ0ZWQsIGludmFsaWRhdGUg
YWxsIHVuZGVyIHN0YXJ0IGxpbmUuIEFsc28gY2xlYXIgbGluZXMgdGhhdCBub3cgYXJlIG91dHNp
ZGUgbW9kZWwgcmFuZ2UuCisgICAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRlTGluZXMobmV3UmFu
Z2Uuc3RhcnRMaW5lLCB0aGlzLl90ZXh0TW9kZWwubGluZXNDb3VudCgpICsgTWF0aC5tYXgoMCwg
b2xkUmFuZ2UuZW5kTGluZSAtIG5ld1JhbmdlLmVuZExpbmUpKTsKKworICAgICAgICB0aGlzLl9p
bnZhbGlkYXRlSGlnaGxpZ2h0KG5ld1JhbmdlLnN0YXJ0TGluZSk7CisgICAgICAgIHRoaXMuX3Vw
ZGF0ZVNpemUobmV3UmFuZ2Uuc3RhcnRMaW5lLCBNYXRoLm1heChuZXdSYW5nZS5lbmRMaW5lLCBv
bGRSYW5nZS5lbmRMaW5lKSk7CisgICAgICAgIHRoaXMuX3BhaW50KCk7CisgICAgfSwKKworICAg
IC8vIFdlYkluc3BlY3Rvci5UZXh0U2VsZWN0aW9uTW9kZWwgbGlzdGVuZXIKKyAgICBfc2VsZWN0
aW9uQ2hhbmdlZDogZnVuY3Rpb24ob2xkUmFuZ2UsIG5ld1JhbmdlKQorICAgIHsKKyAgICAgICAg
dGhpcy5faW52YWxpZGF0ZUxpbmVzKG9sZFJhbmdlLnN0YXJ0TGluZSwgb2xkUmFuZ2UuZW5kTGlu
ZSArIDEpOworICAgICAgICB0aGlzLl9pbnZhbGlkYXRlTGluZXMobmV3UmFuZ2Uuc3RhcnRMaW5l
LCBuZXdSYW5nZS5lbmRMaW5lICsgMSk7CisgICAgICAgIHRoaXMuX3BhaW50KCk7CisgICAgfSwK
KworICAgIF91cGRhdGVTaXplOiBmdW5jdGlvbihzdGFydExpbmUsIGVuZExpbmUpCisgICAgewor
ICAgICAgICB2YXIgbmV3TGluZU51bWJlckRpZ2l0cyA9IHRoaXMuX2RlY2ltYWxEaWdpdHModGhp
cy5fdGV4dE1vZGVsLmxpbmVzQ291bnQoKSk7CisgICAgICAgIHRoaXMuX2xpbmVOdW1iZXJPZmZz
ZXQgPSAobmV3TGluZU51bWJlckRpZ2l0cyArIDIpICogdGhpcy5fZGlnaXRXaWR0aDsKKworICAg
ICAgICB2YXIgZ3VhcmRlZEVuZExpbmUgPSBNYXRoLm1pbih0aGlzLl90ZXh0TW9kZWwubGluZXND
b3VudCgpLCBlbmRMaW5lICsgMSk7CisgICAgICAgIHZhciBuZXdNYXhpbXVtID0gZmFsc2U7Cisg
ICAgICAgIGZvciAodmFyIGkgPSBzdGFydExpbmU7IGkgPCBndWFyZGVkRW5kTGluZTsgKytpKSB7
CisgICAgICAgICAgICB2YXIgbGluZVdpZHRoID0gdGhpcy5fY3R4Lm1lYXN1cmVUZXh0KHRoaXMu
X3RleHRNb2RlbC5saW5lKGkpKS53aWR0aDsKKyAgICAgICAgICAgIGlmIChsaW5lV2lkdGggPiB0
aGlzLl90ZXh0V2lkdGgpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl90ZXh0V2lkdGggPSBsaW5l
V2lkdGg7CisgICAgICAgICAgICAgICAgdGhpcy5fbG9uZ2VzdExpbmVOdW1iZXIgPSBpOworICAg
ICAgICAgICAgICAgIG5ld01heGltdW0gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9
CisKKyAgICAgICAgaWYgKCFuZXdNYXhpbXVtICYmIHN0YXJ0TGluZSA8PSB0aGlzLl9sb25nZXN0
TGluZU51bWJlciAmJiB0aGlzLl9sb25nZXN0TGluZU51bWJlciA8PSBlbmRMaW5lKSB7CisgICAg
ICAgICAgICB0aGlzLl90ZXh0V2lkdGggPSAwOworICAgICAgICAgICAgdGhpcy5fbG9uZ2VzdExp
bmVOdW1iZXIgPSAwOworICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl90ZXh0
TW9kZWwubGluZXNDb3VudCgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICB2YXIgbGluZVdpZHRo
ID0gdGhpcy5fY3R4Lm1lYXN1cmVUZXh0KHRoaXMuX3RleHRNb2RlbC5saW5lKGkpKS53aWR0aDsK
KyAgICAgICAgICAgICAgICBpZiAobGluZVdpZHRoID4gdGhpcy5fdGV4dFdpZHRoKSB7CisgICAg
ICAgICAgICAgICAgICAgIHRoaXMuX3RleHRXaWR0aCA9IGxpbmVXaWR0aDsKKyAgICAgICAgICAg
ICAgICAgICAgdGhpcy5fbG9uZ2VzdExpbmVOdW1iZXIgPSBpOworICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuX3NoZWV0LnN0eWxlLndp
ZHRoID0gdGhpcy5fdGV4dFdpZHRoICsgdGhpcy5fbGluZU51bWJlck9mZnNldCArICJweCI7Cisg
ICAgICAgIHRoaXMuX3NoZWV0LnN0eWxlLmhlaWdodCA9IHRoaXMuX2xpbmVIZWlnaHQgKiB0aGlz
Ll90ZXh0TW9kZWwubGluZXNDb3VudCgpICsgInB4IjsKKworICAgICAgICBpZiAodGhpcy5fY2Fu
dmFzLndpZHRoICE9PSB0aGlzLl9jb250YWluZXIuY2xpZW50V2lkdGggfHwgdGhpcy5fY2FudmFz
LmhlaWdodCAhPT0gdGhpcy5fY29udGFpbmVyLmNsaWVudEhlaWdodCB8fCBuZXdMaW5lTnVtYmVy
RGlnaXRzICE9PSB0aGlzLl9saW5lTnVtYmVyRGlnaXRzKSB7CisgICAgICAgICAgICB0aGlzLl9j
YW52YXMud2lkdGggPSB0aGlzLl9jb250YWluZXIuY2xpZW50V2lkdGg7CisgICAgICAgICAgICB0
aGlzLl9jYW52YXMuaGVpZ2h0ID0gdGhpcy5fY29udGFpbmVyLmNsaWVudEhlaWdodDsKKyAgICAg
ICAgICAgIHRoaXMuX2xpbmVOdW1iZXJEaWdpdHMgPSBuZXdMaW5lTnVtYmVyRGlnaXRzOworICAg
ICAgICAgICAgdGhpcy5fcmVwYWludEFsbCgpOworICAgICAgICB9CisgICAgfSwKKworICAgIF9y
ZXBhaW50QWxsOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB0aGlzLl9pbnZhbGlkYXRlTGlu
ZXMoMCwgdGhpcy5fdGV4dE1vZGVsLmxpbmVzQ291bnQoKSk7CisgICAgICAgIHRoaXMuX3BhaW50
KCk7CisgICAgICAgIHRoaXMuX3VwZGF0ZUN1cnNvcih0aGlzLl9zZWxlY3Rpb24uZW5kTGluZSwg
dGhpcy5fc2VsZWN0aW9uLmVuZENvbHVtbik7CisgICAgfSwKKworICAgIF9pbnZhbGlkYXRlTGlu
ZXM6IGZ1bmN0aW9uKHN0YXJ0TGluZSwgZW5kTGluZSkKKyAgICB7CisgICAgICAgIGlmICghdGhp
cy5fZGFtYWdlKQorICAgICAgICAgICAgdGhpcy5fZGFtYWdlID0gWyB7IHN0YXJ0TGluZTogc3Rh
cnRMaW5lLCBlbmRMaW5lOiBlbmRMaW5lIH0gXTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAg
ICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2RhbWFnZS5sZW5ndGg7ICsraSkgeworICAgICAg
ICAgICAgICAgIHZhciBjaHVuayA9IHRoaXMuX2RhbWFnZVtpXTsKKyAgICAgICAgICAgICAgICBp
ZiAoY2h1bmsuc3RhcnRMaW5lIDw9IGVuZExpbmUgJiYgY2h1bmsuZW5kTGluZSA+PSBzdGFydExp
bmUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2h1bmsuc3RhcnRMaW5lID0gTWF0aC5taW4oY2h1
bmsuc3RhcnRMaW5lLCBzdGFydExpbmUpOworICAgICAgICAgICAgICAgICAgICBjaHVuay5lbmRM
aW5lID0gTWF0aC5tYXgoY2h1bmsuZW5kTGluZSwgZW5kTGluZSk7CisgICAgICAgICAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICB0aGlzLl9kYW1hZ2UucHVzaCh7IHN0YXJ0TGluZTogc3RhcnRMaW5lLCBlbmRMaW5lOiBlbmRM
aW5lIH0pOworICAgICAgICB9CisgICAgfSwKKworICAgIF9wYWludDogZnVuY3Rpb24oKQorICAg
IHsKKyAgICAgICAgaWYgKHRoaXMuX3BhaW50Q29hbGVzY2luZ0xldmVsKQorICAgICAgICAgICAg
cmV0dXJuOworCisgICAgICAgIGZvciAodmFyIGkgPSAwOyB0aGlzLl9kYW1hZ2UgJiYgaSA8IHRo
aXMuX2RhbWFnZS5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgIHRoaXMuX3BhaW50TGluZXModGhp
cy5fZGFtYWdlW2ldLnN0YXJ0TGluZSwgdGhpcy5fZGFtYWdlW2ldLmVuZExpbmUpOworICAgICAg
ICBkZWxldGUgdGhpcy5fZGFtYWdlOworICAgIH0sCisKKyAgICBfcGFpbnRMaW5lczogZnVuY3Rp
b24oZmlyc3RMaW5lLCBsYXN0TGluZSkKKyAgICB7CisgICAgICAgIHRoaXMuX2N0eC5mb250ID0g
dGhpcy5fZm9udDsKKyAgICAgICAgdGhpcy5fY3R4LnRleHRCYXNlbGluZSA9ICJib3R0b20iOwor
CisgICAgICAgIGZpcnN0TGluZSA9IE1hdGgubWF4KGZpcnN0TGluZSwgTWF0aC5mbG9vcih0aGlz
Ll9zY3JvbGxUb3AgLyB0aGlzLl9saW5lSGVpZ2h0KSAtIDEpOworICAgICAgICBsYXN0TGluZSA9
IE1hdGgubWluKGxhc3RMaW5lLCBNYXRoLmNlaWwoKHRoaXMuX3Njcm9sbFRvcCArIHRoaXMuX2Nh
bnZhcy5oZWlnaHQpIC8gdGhpcy5fbGluZUhlaWdodCkgKyAxKTsKKyAgICAgICAgaWYgKGZpcnN0
TGluZSA+IGxhc3RMaW5lKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmICh0aGlz
Ll9kZWJ1Z01vZGUpIHsKKyAgICAgICAgICAgIGNvbnNvbGUubG9nKCJSZXBhaW50ICVkOiVkIiwg
Zmlyc3RMaW5lLCBsYXN0TGluZSk7CisgICAgICAgICAgICB0aGlzLl9jdHguZmlsbFN0eWxlID0g
InJnYigyNTUsMjU1LDApIjsKKyAgICAgICAgICAgIHZhciBoZWlnaHQgPSAobGFzdExpbmUgLSBm
aXJzdExpbmUpICogdGhpcy5fbGluZUhlaWdodDsKKyAgICAgICAgICAgIHRoaXMuX2N0eC5maWxs
UmVjdCgwLCB0aGlzLl9saW5lSGVpZ2h0ICogZmlyc3RMaW5lIC0gdGhpcy5fc2Nyb2xsVG9wLCB0
aGlzLl9jYW52YXMud2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBzZXRUaW1lb3V0KHRoaXMu
X3BhaW50TGluZXNDb250aW51YXRpb24uYmluZCh0aGlzLCBmaXJzdExpbmUsIGxhc3RMaW5lKSwg
MTAwKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICB0aGlzLl9wYWludExpbmVzQ29udGlu
dWF0aW9uKGZpcnN0TGluZSwgbGFzdExpbmUpOworICAgIH0sCisKKyAgICBfcGFpbnRMaW5lc0Nv
bnRpbnVhdGlvbjogZnVuY3Rpb24oZmlyc3RMaW5lLCBsYXN0TGluZSkgeworICAgICAgICAvLyBD
bGVhciBhbGwuCisgICAgICAgIHZhciBoZWlnaHQgPSAobGFzdExpbmUgLSBmaXJzdExpbmUpICog
dGhpcy5fbGluZUhlaWdodDsKKyAgICAgICAgdGhpcy5fY3R4LmZpbGxTdHlsZSA9ICJyZ2IoMjU1
LDI1NSwyNTUpIjsKKyAgICAgICAgdGhpcy5fY3R4LmZpbGxSZWN0KDAsIHRoaXMuX2xpbmVIZWln
aHQgKiBmaXJzdExpbmUgLSB0aGlzLl9zY3JvbGxUb3AsIHRoaXMuX2NhbnZhcy53aWR0aCwgaGVp
Z2h0KTsKKworICAgICAgICBsYXN0TGluZSA9IE1hdGgubWluKGxhc3RMaW5lLCB0aGlzLl90ZXh0
TW9kZWwubGluZXNDb3VudCgpKTsKKworICAgICAgICAvLyBQYWludCBsaW5lIG51bWJlcnMgYW5k
IHNlcGFyYXRvci4KKyAgICAgICAgdGhpcy5fY3R4LmZpbGxTdHlsZSA9ICJyZ2IoMjM1LDIzNSwy
MzUpIjsKKyAgICAgICAgdGhpcy5fY3R4LmZpbGxSZWN0KHRoaXMuX2xpbmVOdW1iZXJPZmZzZXQg
LSAyLCAwLCAxLCB0aGlzLl9jYW52YXMud2lkdGgpOworICAgICAgICB0aGlzLl9jdHguZmlsbFN0
eWxlID0gInJnYigxNTUsMTU1LDE1NSkiOworICAgICAgICBmb3IgKHZhciBpID0gZmlyc3RMaW5l
OyBpIDwgbGFzdExpbmU7ICsraSkKKyAgICAgICAgICAgdGhpcy5fY3R4LmZpbGxUZXh0KGkgKyAx
LCAodGhpcy5fbGluZU51bWJlckRpZ2l0cyAtIHRoaXMuX2RlY2ltYWxEaWdpdHMoaSArIDEpICsg
MSkgKiB0aGlzLl9kaWdpdFdpZHRoLCB0aGlzLl9saW5lSGVpZ2h0ICogKGkgKyAxKSAtIHRoaXMu
X3Njcm9sbFRvcCk7CisKKyAgICAgICAgLy8gQ2xpcCBlZGl0b3IgYXJlYS4KKyAgICAgICAgdGhp
cy5fY3R4LnNhdmUoKTsKKyAgICAgICAgdGhpcy5fY3R4LmJlZ2luUGF0aCgpOworICAgICAgICB0
aGlzLl9jdHgucmVjdCh0aGlzLl9saW5lTnVtYmVyT2Zmc2V0IC0gMSwgMCwgdGhpcy5fY2FudmFz
LndpZHRoIC0gdGhpcy5fbGluZU51bWJlck9mZnNldCArIDEsIHRoaXMuX2NhbnZhcy5oZWlnaHQp
OworICAgICAgICB0aGlzLl9jdHguY2xpcCgpOworCisgICAgICAgIGlmICh0aGlzLl9zZWxlY3Rp
b24uc3RhcnRMaW5lID09PSB0aGlzLl9zZWxlY3Rpb24uZW5kTGluZSAmJiBmaXJzdExpbmUgPD0g
dGhpcy5fc2VsZWN0aW9uLnN0YXJ0TGluZSAmJiB0aGlzLl9zZWxlY3Rpb24uc3RhcnRMaW5lIDwg
bGFzdExpbmUpCisgICAgICAgICAgICB0aGlzLl9wYWludEN1cnJlbnRMaW5lKHRoaXMuX3NlbGVj
dGlvbi5zdGFydExpbmUpOworCisgICAgICAgIGlmICh0aGlzLl9oaWdobGlnaHRpbmdFbmFibGVk
KQorICAgICAgICAgICAgdGhpcy5faGlnaGxpZ2h0ZXIuaGlnaGxpZ2h0KGZpcnN0TGluZSwgbGFz
dExpbmUpOworCisgICAgICAgIHRoaXMuX3BhaW50U2VsZWN0aW9uKGZpcnN0TGluZSwgbGFzdExp
bmUpOworCisgICAgICAgIGZvciAodmFyIGkgPSBmaXJzdExpbmU7IGkgPCBsYXN0TGluZTsgKytp
KSB7CisgICAgICAgICAgICB2YXIgbGluZSA9IHRoaXMuX3RleHRNb2RlbC5saW5lKGkpOworICAg
ICAgICAgICAgaWYgKCF0aGlzLl9oaWdobGlnaHRpbmdFbmFibGVkKSB7CisgICAgICAgICAgICAg
ICAgdGhpcy5fY3R4LmZpbGxUZXh0KGxpbmUsIHRoaXMuX2xpbmVOdW1iZXJPZmZzZXQgLSB0aGlz
Ll9zY3JvbGxMZWZ0LCB0aGlzLl9saW5lSGVpZ2h0ICogKGkgKyAxKSAtIHRoaXMuX3Njcm9sbFRv
cCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIHZhciBhdHRyaWJ1dGVzID0gdGhpcy5fdGV4dE1vZGVsLmdldEF0dHJpYnV0ZXMoaSwgImhp
Z2hsaWdodCIpOworICAgICAgICAgICAgdmFyIHBsYWluVGV4dFN0YXJ0ID0gLTE7CisgICAgICAg
ICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxpbmUubGVuZ3RoOykgeworICAgICAgICAgICAgICAg
IHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzICYmIGF0dHJpYnV0ZXNbal07CisgICAgICAgICAg
ICAgICAgaWYgKCFhdHRyaWJ1dGUgfHwgIWF0dHJpYnV0ZS5zdHlsZSkgeworICAgICAgICAgICAg
ICAgICAgICBpZiAocGxhaW5UZXh0U3RhcnQgPT09IC0xKQorICAgICAgICAgICAgICAgICAgICAg
ICAgcGxhaW5UZXh0U3RhcnQgPSBqOworICAgICAgICAgICAgICAgICAgICBqKys7CisgICAgICAg
ICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBsYWluVGV4dFN0YXJ0
ICE9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3R4LmZpbGxTdHlsZSA9
ICJyZ2IoMCwwLDApIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2N0eC5maWxsVGV4
dChsaW5lLnN1YnN0cmluZyhwbGFpblRleHRTdGFydCwgaiksIHRoaXMuX2xpbmVOdW1iZXJPZmZz
ZXQgLSB0aGlzLl9zY3JvbGxMZWZ0ICsgdGhpcy5fY29sdW1uVG9PZmZzZXQoaSwgcGxhaW5UZXh0
U3RhcnQpLCB0aGlzLl9saW5lSGVpZ2h0ICogKGkgKyAxKSAtIHRoaXMuX3Njcm9sbFRvcCk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBwbGFpblRleHRTdGFydCA9IC0xOworICAgICAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX2N0eC5maWxsU3R5bGUgPSBhdHRy
aWJ1dGUuc3R5bGU7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX2N0eC5maWxsVGV4dChsaW5l
LnN1YnN0cmluZyhqLCBqICsgYXR0cmlidXRlLmxlbmd0aCksIHRoaXMuX2xpbmVOdW1iZXJPZmZz
ZXQgLSB0aGlzLl9zY3JvbGxMZWZ0ICsgdGhpcy5fY29sdW1uVG9PZmZzZXQoaSwgaiksIHRoaXMu
X2xpbmVIZWlnaHQgKiAoaSArIDEpIC0gdGhpcy5fc2Nyb2xsVG9wKTsKKyAgICAgICAgICAgICAg
ICAgICAgaiArPSBhdHRyaWJ1dGUubGVuZ3RoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIGlmIChwbGFpblRleHRTdGFydCAhPT0gLTEpIHsKKyAgICAgICAg
ICAgICAgICB0aGlzLl9jdHguZmlsbFN0eWxlID0gInJnYigwLDAsMCkiOworICAgICAgICAgICAg
ICAgIHRoaXMuX2N0eC5maWxsVGV4dChsaW5lLnN1YnN0cmluZyhwbGFpblRleHRTdGFydCwgbGlu
ZS5sZW5ndGgpLCB0aGlzLl9saW5lTnVtYmVyT2Zmc2V0IC0gdGhpcy5fc2Nyb2xsTGVmdCArIHRo
aXMuX2NvbHVtblRvT2Zmc2V0KGksIHBsYWluVGV4dFN0YXJ0KSwgdGhpcy5fbGluZUhlaWdodCAq
IChpICsgMSkgLSB0aGlzLl9zY3JvbGxUb3ApOworICAgICAgICAgICAgfQorICAgICAgICB9Cisg
ICAgICAgIHRoaXMuX2N0eC5yZXN0b3JlKCk7CisgICAgfSwKKworICAgIF9wYWludEN1cnJlbnRM
aW5lOiBmdW5jdGlvbihsaW5lKQorICAgIHsKKyAgICAgICAgdGhpcy5fY3R4LmZpbGxTdHlsZSA9
ICJyZ2IoMjMyLCAyNDIsIDI1NCkiOworICAgICAgICB0aGlzLl9jdHguZmlsbFJlY3QoMCwgdGhp
cy5fbGluZUhlaWdodCAqIGxpbmUgLSB0aGlzLl9zY3JvbGxUb3AsIHRoaXMuX2NhbnZhcy53aWR0
aCwgdGhpcy5fbGluZUhlaWdodCk7CisgICAgICAgIHRoaXMuX2N0eC5maWxsU3R5bGUgPSAicmdi
KDAsIDAsIDApIjsKKyAgICB9LAorCisgICAgX3Njcm9sbDogZnVuY3Rpb24oZSkKKyAgICB7Cisg
ICAgICAgIGlmICh0aGlzLl9tdXRlU2Nyb2xsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAg
ICAgIGlmICh0aGlzLl9jb250YWluZXIuc2Nyb2xsVG9wID09PSAwKQorICAgICAgICAgICAgdGhp
cy5fbGluZUFsaWdubWVudE9mZnNldCA9IDA7CisgICAgICAgIGVsc2UgaWYgKHRoaXMuX2NvbnRh
aW5lci5zY3JvbGxUb3AgKyB0aGlzLl9jb250YWluZXIuY2xpZW50SGVpZ2h0ID09PSB0aGlzLl90
ZXh0TW9kZWwubGluZXNDb3VudCgpICogdGhpcy5fbGluZUhlaWdodCkKKyAgICAgICAgICAgIHRo
aXMuX2xpbmVBbGlnbm1lbnRPZmZzZXQgPSB0aGlzLl9jb250YWluZXIuc2Nyb2xsVG9wICUgdGhp
cy5fbGluZUhlaWdodDsKKworICAgICAgICAvLyBFbmZvcmNlIGxpbmUgYWxpZ25tZW50LgorICAg
ICAgICBpZiAodGhpcy5fY29udGFpbmVyLnNjcm9sbFRvcCAlIHRoaXMuX2xpbmVIZWlnaHQgIT09
IHRoaXMuX2xpbmVBbGlnbm1lbnRPZmZzZXQpIHsKKyAgICAgICAgICAgIHZhciBsaW5lc09mZnNl
dCA9IE1hdGguZmxvb3IodGhpcy5fY29udGFpbmVyLnNjcm9sbFRvcCAvIHRoaXMuX2xpbmVIZWln
aHQpOworICAgICAgICAgICAgdGhpcy5fbXV0ZVNjcm9sbCA9IHRydWU7CisgICAgICAgICAgICB0
aGlzLl9jb250YWluZXIuc2Nyb2xsVG9wID0gbGluZXNPZmZzZXQgKiB0aGlzLl9saW5lSGVpZ2h0
ICsgdGhpcy5fbGluZUFsaWdubWVudE9mZnNldDsKKyAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9t
dXRlU2Nyb2xsOworICAgICAgICB9CisKKyAgICAgICAgLy8gSGlkZSBkaXYtYmFzZWQgY3Vyc29y
IGZpcnN0LgorICAgICAgICB0aGlzLl9jdXJzb3IuX2N1cnNvckVsZW1lbnQuc3R5bGUuZGlzcGxh
eSA9ICJub25lIjsKKyAgICAgICAgc2V0VGltZW91dCh0aGlzLl9yZXBhaW50T25TY3JvbGwuYmlu
ZCh0aGlzKSwgMCk7CisgICAgfSwKKworICAgIF9yZXBhaW50T25TY3JvbGw6IGZ1bmN0aW9uKCkK
KyAgICB7CisgICAgICAgIHZhciBsaW5lc09mZnNldCA9IE1hdGguZmxvb3IodGhpcy5fY29udGFp
bmVyLnNjcm9sbFRvcCAvIHRoaXMuX2xpbmVIZWlnaHQpOworICAgICAgICBpZiAodGhpcy5fc2Ny
b2xsVG9wICE9PSB0aGlzLl9jb250YWluZXIuc2Nyb2xsVG9wIHx8IHRoaXMuX3Njcm9sbExlZnQg
IT09IHRoaXMuX2NvbnRhaW5lci5zY3JvbGxMZWZ0KSB7CisgICAgICAgICAgICB0aGlzLl9zY3Jv
bGxUb3AgPSB0aGlzLl9jb250YWluZXIuc2Nyb2xsVG9wOworICAgICAgICAgICAgdGhpcy5fc2Ny
b2xsTGVmdCA9IHRoaXMuX2NvbnRhaW5lci5zY3JvbGxMZWZ0OworICAgICAgICAgICAgdGhpcy5f
cmVwYWludEFsbCgpOworICAgICAgICB9CisgICAgfSwKKworICAgIF9tb3VzZVVwOiBmdW5jdGlv
bihlKQorICAgIHsKKyAgICAgICAgdGhpcy5faXNEcmFnZ2luZyA9IGZhbHNlOworICAgIH0sCisK
KyAgICBfbW91c2VEb3duOiBmdW5jdGlvbihlKQorICAgIHsKKyAgICAgICAgdmFyIGxvY2F0aW9u
ID0gdGhpcy5fY2FyZXRGb3JNb3VzZUV2ZW50KGUpOworICAgICAgICBpZiAoZS5zaGlmdEtleSkK
KyAgICAgICAgICAgIHRoaXMuX3NldFNlbGVjdGlvbkVuZChsb2NhdGlvbi5saW5lLCBsb2NhdGlv
bi5jb2x1bW4pOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aGlzLl9zZXRDYXJldExvY2F0
aW9uKGxvY2F0aW9uLmxpbmUsIGxvY2F0aW9uLmNvbHVtbik7CisgICAgICAgIHRoaXMuX2lzRHJh
Z2dpbmcgPSB0cnVlOworICAgICAgICB0aGlzLl90ZXh0TW9kZWwubWFya1VuZG9hYmxlU3RhdGUo
KTsKKyAgICB9LAorCisgICAgX21vdXNlTW92ZTogZnVuY3Rpb24oZSkKKyAgICB7CisgICAgICAg
IGlmICghdGhpcy5faXNEcmFnZ2luZykKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdmFy
IGxvY2F0aW9uID0gdGhpcy5fY2FyZXRGb3JNb3VzZUV2ZW50KGUpOworICAgICAgICB0aGlzLl9z
ZXRTZWxlY3Rpb25FbmQobG9jYXRpb24ubGluZSwgbG9jYXRpb24uY29sdW1uKQorICAgIH0sCisK
KyAgICBfbW91c2VPdXQ6IGZ1bmN0aW9uKGUpCisgICAgeworICAgICAgICB0aGlzLl9pc0RyYWdn
aW5nID0gZmFsc2U7CisgICAgfSwKKworICAgIF9kYmxDbGljazogZnVuY3Rpb24oZSkKKyAgICB7
CisgICAgICAgIHZhciBsb2NhdGlvbiA9IHRoaXMuX2NhcmV0Rm9yTW91c2VFdmVudChlKTsKKyAg
ICAgICAgdmFyIHJhbmdlID0gdGhpcy5fdGV4dE1vZGVsLndvcmRSYW5nZShsb2NhdGlvbi5saW5l
LCBsb2NhdGlvbi5jb2x1bW4pOworICAgICAgICB0aGlzLnNldFNlbGVjdGlvbihyYW5nZS5zdGFy
dExpbmUsIHJhbmdlLnN0YXJ0Q29sdW1uLCByYW5nZS5lbmRMaW5lLCByYW5nZS5lbmRDb2x1bW4p
OworICAgIH0sCisKKyAgICBfY2FyZXRGb3JNb3VzZUV2ZW50OiBmdW5jdGlvbihlKQorICAgIHsK
KyAgICAgICAgdmFyIGxpbmVOdW1iZXIgPSBNYXRoLmZsb29yKChlLnkgKyB0aGlzLl9zY3JvbGxU
b3AgLSA0KSAvIHRoaXMuX2xpbmVIZWlnaHQpOworICAgICAgICB2YXIgbGluZSA9IHRoaXMuX3Rl
eHRNb2RlbC5saW5lKGxpbmVOdW1iZXIpOworICAgICAgICB2YXIgb2Zmc2V0ID0gZS54ICsgdGhp
cy5fc2Nyb2xsTGVmdCAtIHRoaXMuX2xpbmVOdW1iZXJPZmZzZXQgLSB0aGlzLl9kaWdpdFdpZHRo
OworICAgICAgICByZXR1cm4geyBsaW5lOiBsaW5lTnVtYmVyLCBjb2x1bW46IHRoaXMuX2NvbHVt
bkZvck9mZnNldChsaW5lTnVtYmVyLCBvZmZzZXQpIH07CisgICAgfSwKKworICAgIF9jb2x1bW5G
b3JPZmZzZXQ6IGZ1bmN0aW9uKGxpbmVOdW1iZXIsIG9mZnNldCkKKyAgICB7CisgICAgICAgIHZh
ciBsaW5lID0gdGhpcy5fdGV4dE1vZGVsLmxpbmUobGluZU51bWJlcik7CisgICAgICAgIGZvciAo
dmFyIGNvbHVtbiA9IDA7IGNvbHVtbiA8IGxpbmUubGVuZ3RoOyArK2NvbHVtbikgeworICAgICAg
ICAgICAgaWYgKHRoaXMuX2N0eC5tZWFzdXJlVGV4dChsaW5lLnN1YnN0cmluZygwLCBjb2x1bW4p
KS53aWR0aCA+IG9mZnNldCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAg
ICAgICByZXR1cm4gY29sdW1uOworICAgIH0sCisKKyAgICBfY29sdW1uVG9PZmZzZXQ6IGZ1bmN0
aW9uKGxpbmVOdW1iZXIsIGNvbHVtbikKKyAgICB7CisgICAgICAgIHZhciBsaW5lID0gdGhpcy5f
dGV4dE1vZGVsLmxpbmUobGluZU51bWJlcik7CisgICAgICAgIHJldHVybiB0aGlzLl9jdHgubWVh
c3VyZVRleHQobGluZS5zdWJzdHJpbmcoMCwgY29sdW1uKSkud2lkdGg7CisgICAgfSwKKworICAg
IF9rZXlEb3duOiBmdW5jdGlvbihlKQorICAgIHsKKyAgICAgICAgdmFyIHNob3J0Y3V0S2V5ID0g
V2ViSW5zcGVjdG9yLktleWJvYXJkU2hvcnRjdXQubWFrZUtleUZyb21FdmVudChlKTsKKyAgICAg
ICAgdmFyIGhhbmRsZXIgPSB0aGlzLl9zaG9ydGN1dHNbc2hvcnRjdXRLZXldOworICAgICAgICBp
ZiAoaGFuZGxlcikgeworICAgICAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMpOworICAgICAgICAg
ICAgZS5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsK
KyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLl9oYW5k
bGVOYXZpZ2F0aW9uS2V5KGUpKSB7CisgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7Cisg
ICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOworICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICB9CisKKyAgICAgICAgdmFyIGtleUNvZGVzID0gV2ViSW5zcGVjdG9yLktleWJvYXJkU2hv
cnRjdXQuS2V5Q29kZXM7CisgICAgICAgIHN3aXRjaCAoZS5rZXlDb2RlKSB7CisgICAgICAgICAg
ICBjYXNlIGtleUNvZGVzLkJhY2tzcGFjZToKKyAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVC
YWNrc3BhY2VLZXkoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Ug
a2V5Q29kZXMuRGVsZXRlOgorICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZURlbGV0ZUtleSgp
OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrZXlDb2Rlcy5UYWI6
CisgICAgICAgICAgICAgICAgdGhpcy5fcmVwbGFjZVNlbGVjdGlvbldpdGgoIlx0Iik7CisgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtleUNvZGVzLkVudGVyOgorICAg
ICAgICAgICAgICAgIHRoaXMuX3JlcGxhY2VTZWxlY3Rpb25XaXRoKCJcbiIpOworICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1
cm47CisgICAgICAgIH0KKworICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgIGUu
c3RvcFByb3BhZ2F0aW9uKCk7CisgICAgfSwKKworICAgIF9oYW5kbGVOYXZpZ2F0aW9uS2V5OiBm
dW5jdGlvbihlKQorICAgIHsKKyAgICAgICAgdmFyIGNhcmV0TGluZSA9IHRoaXMuX3NlbGVjdGlv
bi5lbmRMaW5lOworICAgICAgICB2YXIgY2FyZXRDb2x1bW4gPSB0aGlzLl9zZWxlY3Rpb24uZW5k
Q29sdW1uOworICAgICAgICB2YXIgYXJyb3dBY3Rpb24gPSBlLnNoaWZ0S2V5ID8gdGhpcy5fc2V0
U2VsZWN0aW9uRW5kIDogdGhpcy5fc2V0Q2FyZXRMb2NhdGlvbjsKKworICAgICAgICB2YXIga2V5
Q29kZXMgPSBXZWJJbnNwZWN0b3IuS2V5Ym9hcmRTaG9ydGN1dC5LZXlDb2RlczsKKyAgICAgICAg
c3dpdGNoIChlLmtleUNvZGUpIHsKKyAgICAgICAgICAgIGNhc2Uga2V5Q29kZXMuVXA6CisgICAg
ICAgICAgICBjYXNlIGtleUNvZGVzLlBhZ2VVcDoKKyAgICAgICAgICAgICAgICBpZiAoZS5tZXRh
S2V5KQorICAgICAgICAgICAgICAgICAgICBhcnJvd0FjdGlvbi5jYWxsKHRoaXMsIDAsIDAsIHRy
dWUpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGUuY3RybEtleSkKKyAgICAgICAgICAgICAg
ICAgICAgdGhpcy5fY29udGFpbmVyLnNjcm9sbFRvcCAtPSB0aGlzLl9saW5lSGVpZ2h0OworICAg
ICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB2YXIganVtcCA9IGUua2V5
Q29kZSA9PT0ga2V5Q29kZXMuVXAgPyAxIDogTWF0aC5mbG9vcih0aGlzLl9jYW52YXMuaGVpZ2h0
IC8gdGhpcy5fbGluZUhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIGFycm93QWN0aW9uLmNh
bGwodGhpcywgY2FyZXRMaW5lIC0ganVtcCwgdGhpcy5fZGVzaXJlZENhcmV0Q29sdW1uLCB0cnVl
KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICBjYXNlIGtleUNvZGVzLkRvd246CisgICAgICAgICAgICBjYXNlIGtleUNvZGVzLlBhZ2VEb3du
OgorICAgICAgICAgICAgICAgIGlmIChlLm1ldGFLZXkpCisgICAgICAgICAgICAgICAgICAgIGFy
cm93QWN0aW9uLmNhbGwodGhpcywgdGhpcy5fdGV4dE1vZGVsLmxpbmVzQ291bnQoKSAtIDEsIHRo
aXMuX3RleHRNb2RlbC5saW5lTGVuZ3RoKHRoaXMuX3RleHRNb2RlbC5saW5lc0NvdW50KCkgLSAx
KSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZS5jdHJsS2V5KQorICAgICAgICAg
ICAgICAgICAgICB0aGlzLl9jb250YWluZXIuc2Nyb2xsVG9wICs9IHRoaXMuX2xpbmVIZWlnaHQ7
CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHZhciBqdW1wID0g
ZS5rZXlDb2RlID09PSBrZXlDb2Rlcy5Eb3duID8gMSA6IE1hdGguZmxvb3IodGhpcy5fY2FudmFz
LmhlaWdodCAvIHRoaXMuX2xpbmVIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBhcnJvd0Fj
dGlvbi5jYWxsKHRoaXMsIGNhcmV0TGluZSArIGp1bXAsIHRoaXMuX2Rlc2lyZWRDYXJldENvbHVt
biwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgY2FzZSBrZXlDb2Rlcy5MZWZ0OgorICAgICAgICAgICAgICAgIGlmICghZS5zaGlm
dEtleSAmJiAhZS5tZXRhS2V5ICYmICF0aGlzLl9pc0FsdEN0cmwoZSkgJiYgIXRoaXMuX3NlbGVj
dGlvbi5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgc2VsZWN0aW9u
CisgICAgICAgICAgICAgICAgICAgIHZhciByYW5nZSA9IHRoaXMuX3NlbGVjdGlvbi5yYW5nZSgp
OworICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXRDYXJldExvY2F0aW9uKHJhbmdlLnN0YXJ0
TGluZSwgcmFuZ2Uuc3RhcnRDb2x1bW4pOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5t
ZXRhS2V5KQorICAgICAgICAgICAgICAgICAgICBhcnJvd0FjdGlvbi5jYWxsKHRoaXMsIHRoaXMu
X3NlbGVjdGlvbi5lbmRMaW5lLCAwKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChjYXJldENv
bHVtbiA9PT0gMCAmJiBjYXJldExpbmUgPiAwKQorICAgICAgICAgICAgICAgICAgICBhcnJvd0Fj
dGlvbi5jYWxsKHRoaXMsIGNhcmV0TGluZSAtIDEsIHRoaXMuX3RleHRNb2RlbC5saW5lTGVuZ3Ro
KGNhcmV0TGluZSAtIDEpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9pc0FsdEN0
cmwoZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FyZXRDb2x1bW4gPSB0aGlzLl90ZXh0TW9k
ZWwud29yZFN0YXJ0KHRoaXMuX3NlbGVjdGlvbi5lbmRMaW5lLCB0aGlzLl9zZWxlY3Rpb24uZW5k
Q29sdW1uKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhcmV0Q29sdW1uID09PSB0aGlzLl9z
ZWxlY3Rpb24uZW5kQ29sdW1uKQorICAgICAgICAgICAgICAgICAgICAgICAgY2FyZXRDb2x1bW4g
PSAwOworICAgICAgICAgICAgICAgICAgICBhcnJvd0FjdGlvbi5jYWxsKHRoaXMsIGNhcmV0TGlu
ZSwgY2FyZXRDb2x1bW4pOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAg
ICAgICBhcnJvd0FjdGlvbi5jYWxsKHRoaXMsIGNhcmV0TGluZSwgY2FyZXRDb2x1bW4gLSAxKTsK
KyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga2V5Q29kZXMuUmlnaHQ6
CisgICAgICAgICAgICAgICAgdmFyIGxpbmUgPSB0aGlzLl90ZXh0TW9kZWwubGluZShjYXJldExp
bmUpOworICAgICAgICAgICAgICAgIGlmICghZS5zaGlmdEtleSAmJiAhZS5tZXRhS2V5ICYmICF0
aGlzLl9pc0FsdEN0cmwoZSkgJiYgIXRoaXMuX3NlbGVjdGlvbi5pc0VtcHR5KCkpIHsKKyAgICAg
ICAgICAgICAgICAgICAgLy8gUmVzZXQgc2VsZWN0aW9uCisgICAgICAgICAgICAgICAgICAgIHZh
ciByYW5nZSA9IHRoaXMuX3NlbGVjdGlvbi5yYW5nZSgpOworICAgICAgICAgICAgICAgICAgICB0
aGlzLl9zZXRDYXJldExvY2F0aW9uKHJhbmdlLmVuZExpbmUsIHJhbmdlLmVuZENvbHVtbik7Cisg
ICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLm1ldGFLZXkpCisgICAgICAgICAgICAgICAgICAg
IGFycm93QWN0aW9uLmNhbGwodGhpcywgdGhpcy5fc2VsZWN0aW9uLmVuZExpbmUsIHRoaXMuX3Rl
eHRNb2RlbC5saW5lTGVuZ3RoKHRoaXMuX3NlbGVjdGlvbi5lbmRMaW5lKSk7CisgICAgICAgICAg
ICAgICAgZWxzZSBpZiAoY2FyZXRDb2x1bW4gPT09IGxpbmUubGVuZ3RoICYmIGNhcmV0TGluZSA8
IHRoaXMuX3RleHRNb2RlbC5saW5lc0NvdW50KCkgLSAxKQorICAgICAgICAgICAgICAgICAgICBh
cnJvd0FjdGlvbi5jYWxsKHRoaXMsIGNhcmV0TGluZSArIDEsIDApOworICAgICAgICAgICAgICAg
IGVsc2UgaWYgKHRoaXMuX2lzQWx0Q3RybChlKSkgeworICAgICAgICAgICAgICAgICAgICBjYXJl
dENvbHVtbiA9IHRoaXMuX3RleHRNb2RlbC53b3JkRW5kKHRoaXMuX3NlbGVjdGlvbi5lbmRMaW5l
LCB0aGlzLl9zZWxlY3Rpb24uZW5kQ29sdW1uKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNh
cmV0Q29sdW1uID09PSB0aGlzLl9zZWxlY3Rpb24uZW5kQ29sdW1uKQorICAgICAgICAgICAgICAg
ICAgICAgICAgY2FyZXRDb2x1bW4gPSBsaW5lLmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAg
YXJyb3dBY3Rpb24uY2FsbCh0aGlzLCBjYXJldExpbmUsIGNhcmV0Q29sdW1uKTsKKyAgICAgICAg
ICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgYXJyb3dBY3Rpb24uY2FsbCh0aGlz
LCBjYXJldExpbmUsIGNhcmV0Q29sdW1uICsgMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgfQorICAgICAgICB0aGlzLl90ZXh0TW9kZWwubWFya1VuZG9hYmxlU3RhdGUoKTsKKyAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgfSwKKworICAgIF90ZXh0SW5wdXQ6IGZ1bmN0aW9uKGUpCisg
ICAgeworICAgICAgICBpZiAoZS5kYXRhICYmICFlLmFsdEtleSAmJiAhZS5jdHJsS2V5ICYmICFl
Lm1ldGFLZXkpIHsKKyAgICAgICAgICAgIHRoaXMuX3JlcGxhY2VTZWxlY3Rpb25XaXRoKGUuZGF0
YSk7CisgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgICAgICBlLnN0b3BQ
cm9wYWdhdGlvbigpOworICAgICAgICB9CisgICAgfSwKKworICAgIF9zZXRDYXJldExvY2F0aW9u
OiBmdW5jdGlvbihsaW5lLCBjb2x1bW4sIHVwZG93bikKKyAgICB7CisgICAgICAgIHRoaXMuc2V0
U2VsZWN0aW9uKGxpbmUsIGNvbHVtbiwgbGluZSwgY29sdW1uLCB1cGRvd24pOworICAgIH0sCisK
KyAgICBfc2V0U2VsZWN0aW9uRW5kOiBmdW5jdGlvbihsaW5lLCBjb2x1bW4sIHVwZG93bikKKyAg
ICB7CisgICAgICAgIGlmICghdXBkb3duKQorICAgICAgICAgICAgdGhpcy5fZGVzaXJlZENhcmV0
Q29sdW1uID0gY29sdW1uOworCisgICAgICAgIHZhciBlbmQgPSB0aGlzLl9maXQobGluZSwgY29s
dW1uKTsKKyAgICAgICAgdGhpcy5fc2VsZWN0aW9uLnNldEVuZChlbmQubGluZSwgZW5kLmNvbHVt
bik7CisgICAgICAgIHRoaXMucmV2ZWFsKHRoaXMuX3NlbGVjdGlvbi5lbmRMaW5lLCB0aGlzLl9z
ZWxlY3Rpb24uZW5kQ29sdW1uKTsKKyAgICAgICAgdGhpcy5fdXBkYXRlQ3Vyc29yKGVuZC5saW5l
LCBlbmQuY29sdW1uKTsKKyAgICB9LAorCisgICAgX3VwZGF0ZUN1cnNvcjogZnVuY3Rpb24obGlu
ZSwgY29sdW1uKQorICAgIHsKKyAgICAgICAgaWYgKGxpbmUgPiB0aGlzLl90ZXh0TW9kZWwubGlu
ZXNDb3VudCgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB2YXIgb2Zmc2V0ID0gdGhp
cy5fY29sdW1uVG9PZmZzZXQobGluZSwgY29sdW1uKTsKKyAgICAgICAgaWYgKG9mZnNldCA+PSB0
aGlzLl9jb250YWluZXIuc2Nyb2xsTGVmdCkKKyAgICAgICAgICAgIHRoaXMuX2N1cnNvci5zZXRM
b2NhdGlvbih0aGlzLl9saW5lTnVtYmVyT2Zmc2V0ICsgb2Zmc2V0IC0gMSwgbGluZSAqIHRoaXMu
X2xpbmVIZWlnaHQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aGlzLl9jdXJzb3Iuc2V0
TG9jYXRpb24oMCwgMCk7CisgICAgfSwKKworICAgIF9maXQ6IGZ1bmN0aW9uKGxpbmUsIGNvbHVt
bikKKyAgICB7CisgICAgICAgIGxpbmUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihsaW5lLCB0aGlz
Ll90ZXh0TW9kZWwubGluZXNDb3VudCgpIC0gMSkpOworICAgICAgICB2YXIgbGluZUxlbmd0aCA9
IHRoaXMuX3RleHRNb2RlbC5saW5lTGVuZ3RoKGxpbmUpOworICAgICAgICBjb2x1bW4gPSBNYXRo
Lm1heCgwLCBNYXRoLm1pbihjb2x1bW4sIGxpbmVMZW5ndGgpKTsKKyAgICAgICAgcmV0dXJuIHsg
bGluZTogbGluZSwgY29sdW1uOiBjb2x1bW4gfTsKKyAgICB9LAorCisgICAgX2ludmFsaWRhdGVI
aWdobGlnaHQ6IGZ1bmN0aW9uKHN0YXJ0TGluZSkKKyAgICB7CisgICAgICAgIGlmICghdGhpcy5f
aGlnaGxpZ2h0aW5nRW5hYmxlZCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdmFyIGZp
cnN0VmlzaWJsZUxpbmUgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKHRoaXMuX3Njcm9sbFRvcCAv
IHRoaXMuX2xpbmVIZWlnaHQpIC0gMSk7CisgICAgICAgIHZhciBsYXN0VmlzaWJsZUxpbmUgPSBN
YXRoLm1pbih0aGlzLl90ZXh0TW9kZWwubGluZXNDb3VudCgpLCBNYXRoLmNlaWwoZmlyc3RWaXNp
YmxlTGluZSArIHRoaXMuX2NhbnZhcy5oZWlnaHQgLyB0aGlzLl9saW5lSGVpZ2h0ICsgMSkpOwor
CisgICAgICAgIHZhciBkYW1hZ2UgPSB0aGlzLl9oaWdobGlnaHRlci5oaWdobGlnaHQoc3RhcnRM
aW5lLCBsYXN0VmlzaWJsZUxpbmUpOworICAgICAgICBmb3IgKHZhciBsaW5lIGluIGRhbWFnZSkK
KyAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdGVMaW5lcyhsaW5lLCBwYXJzZUludChsaW5lKSAr
IDEpOworICAgIH0sCisKKyAgICBfcGFpbnRTZWxlY3Rpb246IGZ1bmN0aW9uKGZpcnN0TGluZSwg
bGFzdExpbmUpCisgICAgeworICAgICAgICBpZiAodGhpcy5fc2VsZWN0aW9uLmlzRW1wdHkoKSkK
KyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5fc2VsZWN0aW9u
LnJhbmdlKCk7CisgICAgICAgIHRoaXMuX2N0eC5maWxsU3R5bGUgPSAicmdiKDE4MSwgMjEzLCAy
NTUpIjsKKworICAgICAgICBmaXJzdExpbmUgPSBNYXRoLm1heChmaXJzdExpbmUsIHJhbmdlLnN0
YXJ0TGluZSk7CisgICAgICAgIGVuZExpbmUgPSBNYXRoLm1pbihsYXN0TGluZSwgcmFuZ2UuZW5k
TGluZSArIDEpOworCisgICAgICAgIGZvciAodmFyIGkgPSBmaXJzdExpbmU7IGkgPCBlbmRMaW5l
OyArK2kpIHsKKyAgICAgICAgICAgIHZhciBsaW5lID0gdGhpcy5fdGV4dE1vZGVsLmxpbmUoaSk7
CisgICAgICAgICAgICB2YXIgZnJvbSwgdG87CisKKyAgICAgICAgICAgIGlmIChpID09PSByYW5n
ZS5zdGFydExpbmUpIHsKKyAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5fY29sdW1u
VG9PZmZzZXQocmFuZ2Uuc3RhcnRMaW5lLCByYW5nZS5zdGFydENvbHVtbik7CisgICAgICAgICAg
ICAgICAgZnJvbSA9IG9mZnNldCAtIHRoaXMuX3Njcm9sbExlZnQgKyB0aGlzLl9saW5lTnVtYmVy
T2Zmc2V0IC0gMTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGZyb20gPSAw
OworCisgICAgICAgICAgICBpZiAoaSA9PT0gcmFuZ2UuZW5kTGluZSkgeworICAgICAgICAgICAg
ICAgIHZhciBvZmZzZXQgPSB0aGlzLl9jb2x1bW5Ub09mZnNldChyYW5nZS5lbmRMaW5lLCByYW5n
ZS5lbmRDb2x1bW4pOworICAgICAgICAgICAgICAgIHRvID0gb2Zmc2V0IC0gdGhpcy5fc2Nyb2xs
TGVmdCArIHRoaXMuX2xpbmVOdW1iZXJPZmZzZXQgLSAxOworICAgICAgICAgICAgfSBlbHNlCisg
ICAgICAgICAgICAgICAgdG8gPSB0aGlzLl9jYW52YXMud2lkdGg7CisKKyAgICAgICAgICAgIHRo
aXMuX2N0eC5maWxsUmVjdChmcm9tLCB0aGlzLl9saW5lSGVpZ2h0ICogaSAtIHRoaXMuX3Njcm9s
bFRvcCwgdG8gLSBmcm9tLCB0aGlzLl9saW5lSGVpZ2h0KTsKKyAgICAgICAgfQorICAgICAgICB0
aGlzLl9jdHguZmlsbFN0eWxlID0gInJnYigwLCAwLCAwKSI7CisgICAgfSwKKworICAgIF9iZWZv
cmVDb3B5OiBmdW5jdGlvbihlKQorICAgIHsKKyAgICAgICAgaWYgKCF0aGlzLl9zZWxlY3Rpb24u
aXNFbXB0eSgpKQorICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOworICAgIH0sCisKKyAg
ICBfY29weTogZnVuY3Rpb24oZSkKKyAgICB7CisgICAgICAgIHZhciByYW5nZSA9IHRoaXMuX3Nl
bGVjdGlvbi5yYW5nZSgpOworICAgICAgICB2YXIgdGV4dCA9IHRoaXMuX3RleHRNb2RlbC5jb3B5
UmFuZ2UocmFuZ2UpOworCisgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKKyAgICAgICAgZS5j
bGlwYm9hcmREYXRhLmNsZWFyRGF0YSgpOworICAgICAgICBlLmNsaXBib2FyZERhdGEuc2V0RGF0
YSgidGV4dC9wbGFpbiIsIHRleHQpOworICAgIH0sCisKKyAgICBfYmVmb3JlQ3V0OiBmdW5jdGlv
bihlKQorICAgIHsKKyAgICAgICAgaWYgKCF0aGlzLl9zZWxlY3Rpb24uaXNFbXB0eSgpKQorICAg
ICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOworICAgIH0sCisKKyAgICBfY3V0OiBmdW5jdGlv
bihlKQorICAgIHsKKyAgICAgICAgdGhpcy5fdGV4dE1vZGVsLm1hcmtVbmRvYWJsZVN0YXRlKCk7
CisgICAgICAgIHRoaXMuX2NvcHkoZSk7CisgICAgICAgIHRoaXMuX3JlcGxhY2VTZWxlY3Rpb25X
aXRoKCIiKTsKKyAgICB9LAorCisgICAgX2JlZm9yZVBhc3RlOiBmdW5jdGlvbihlKQorICAgIHsK
KyAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOworICAgIH0sCisKKyAgICBfcGFzdGU6IGZ1bmN0
aW9uKGUpCisgICAgeworICAgICAgICB0aGlzLl90ZXh0TW9kZWwubWFya1VuZG9hYmxlU3RhdGUo
KTsKKyAgICAgICAgdGhpcy5fcmVwbGFjZVNlbGVjdGlvbldpdGgoZS5jbGlwYm9hcmREYXRhLmdl
dERhdGEoIlRleHQiKSk7CisgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKKyAgICB9LAorCisg
ICAgX3JlcGxhY2VTZWxlY3Rpb25XaXRoOiBmdW5jdGlvbihuZXdUZXh0LCBvdmVycmlkZVJhbmdl
KQorICAgIHsKKyAgICAgICAgdmFyIHJhbmdlID0gb3ZlcnJpZGVSYW5nZSB8fCB0aGlzLl9zZWxl
Y3Rpb24ucmFuZ2UoKTsKKworICAgICAgICB0aGlzLl9zZXRDb2FsZXNjaW5nVXBkYXRlKHRydWUp
OworICAgICAgICB2YXIgbmV3UmFuZ2UgPSB0aGlzLl90ZXh0TW9kZWwuc2V0VGV4dChyYW5nZSwg
bmV3VGV4dCk7CisgICAgICAgIHRoaXMuX3NldENhcmV0TG9jYXRpb24obmV3UmFuZ2UuZW5kTGlu
ZSwgbmV3UmFuZ2UuZW5kQ29sdW1uKTsKKyAgICAgICAgdGhpcy5fc2V0Q29hbGVzY2luZ1VwZGF0
ZShmYWxzZSk7CisgICAgfSwKKworICAgIF9zZXRDb2FsZXNjaW5nVXBkYXRlOiBmdW5jdGlvbihl
bmFibGVkKQorICAgIHsKKyAgICAgICAgaWYgKGVuYWJsZWQpCisgICAgICAgICAgICB0aGlzLl9w
YWludENvYWxlc2NpbmdMZXZlbCsrOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aGlzLl9w
YWludENvYWxlc2NpbmdMZXZlbC0tOworICAgICAgICBpZiAoIXRoaXMuX3BhaW50Q29hbGVzY2lu
Z0xldmVsKQorICAgICAgICAgICAgdGhpcy5fcGFpbnQoKTsKKyAgICB9LAorCisgICAgX3NlbGVj
dEFsbDogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgLy8gTm8gbmVlZCB0byByZXZlYWwgbGFz
dCBzZWxlY3Rpb24gbGluZSBpbiBzZWxlY3QgYWxsLgorICAgICAgICB0aGlzLl9zZWxlY3Rpb24u
c2V0U3RhcnQoMCwgMCk7CisgICAgICAgIHZhciBsYXN0TGluZU51bSA9IHRoaXMuX3RleHRNb2Rl
bC5saW5lc0NvdW50KCkgLSAxOworICAgICAgICB0aGlzLl9zZWxlY3Rpb24uc2V0RW5kKGxhc3RM
aW5lTnVtLCB0aGlzLl90ZXh0TW9kZWwubGluZUxlbmd0aChsYXN0TGluZU51bSkpOworICAgICAg
ICB0aGlzLl91cGRhdGVDdXJzb3IodGhpcy5fc2VsZWN0aW9uLmVuZExpbmUsIHRoaXMuX3NlbGVj
dGlvbi5lbmRDb2x1bW4pOworICAgIH0sCisKKyAgICBfaW5pdEZvbnQ6IGZ1bmN0aW9uKHNhbnNT
ZXJpZikKKyAgICB7CisgICAgICAgIHRoaXMuX2lzTWFjID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5p
bmRleE9mKCJNYWMgT1MiKSAhPT0gLTE7CisgICAgICAgIHRoaXMuX2lzV2luID0gbmF2aWdhdG9y
LnVzZXJBZ2VudC5pbmRleE9mKCJXaW5kb3dzIikgIT09IC0xOworICAgICAgICB0aGlzLl9pc0xp
bnV4ID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJMaW51eCIpICE9PSAtMTsKKworICAg
ICAgICBpZiAoc2Fuc1NlcmlmKSB7CisgICAgICAgICAgICB0aGlzLl9pc01vbm9zcGFjZSA9IGZh
bHNlOworICAgICAgICAgICAgdGhpcy5fZm9udCA9ICIxMHB4IHNhbnMtc2VyaWYiOworICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5faXNNb25vc3BhY2UgPSB0cnVlOworICAgICAg
ICAgICAgdGhpcy5fZm9udCA9ICIxMHB4IG1vbm9zcGFjZSI7CisgICAgICAgICAgICBpZiAodGhp
cy5faXNNYWMpCisgICAgICAgICAgICAgICAgdGhpcy5fZm9udCA9ICIxMHB4IE1vbmFjbyI7Cisg
ICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9pc1dpbikKKyAgICAgICAgICAgICAgICB0aGlzLl9m
b250ID0gIjExcHggQ291cmllciBOZXciOworICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5faXNM
aW51eCkKKyAgICAgICAgICAgICAgICB0aGlzLl9mb250ID0gIjEwcHggRHJvaWQgU2FucyBNb25v
IjsKKyAgICAgICAgfQorICAgICAgICB0aGlzLl9jdHguZm9udCA9IHRoaXMuX2ZvbnQ7CisgICAg
ICAgIHRoaXMuX2RpZ2l0V2lkdGggPSB0aGlzLl9jdHgubWVhc3VyZVRleHQoIjAiKS53aWR0aDsK
KyAgICB9LAorCisgICAgX3JlZ2lzdGVyU2hvcnRjdXRzOiBmdW5jdGlvbigpCisgICAgeworICAg
ICAgICB2YXIgbW9kaWZpZXJzID0gV2ViSW5zcGVjdG9yLktleWJvYXJkU2hvcnRjdXQuTW9kaWZp
ZXJzOworICAgICAgICB0aGlzLl9zaG9ydGN1dHMgPSB7fTsKKyAgICAgICAgdGhpcy5fc2hvcnRj
dXRzW1dlYkluc3BlY3Rvci5LZXlib2FyZFNob3J0Y3V0Lm1ha2VLZXkoInoiLCB0aGlzLl9pc01h
YyA/IG1vZGlmaWVycy5NZXRhIDogbW9kaWZpZXJzLkN0cmwpXSA9IHRoaXMuX2hhbmRsZVVuZG8u
YmluZCh0aGlzKTsKKyAgICAgICAgdGhpcy5fc2hvcnRjdXRzW1dlYkluc3BlY3Rvci5LZXlib2Fy
ZFNob3J0Y3V0Lm1ha2VLZXkoInoiLCBtb2RpZmllcnMuU2hpZnQgfCAodGhpcy5faXNNYWMgPyBt
b2RpZmllcnMuTWV0YSA6IG1vZGlmaWVycy5DdHJsKSldID0gdGhpcy5faGFuZGxlUmVkby5iaW5k
KHRoaXMpOworICAgICAgICB0aGlzLl9zaG9ydGN1dHNbV2ViSW5zcGVjdG9yLktleWJvYXJkU2hv
cnRjdXQubWFrZUtleSgiYSIsIHRoaXMuX2lzTWFjID8gbW9kaWZpZXJzLk1ldGEgOiBtb2RpZmll
cnMuQ3RybCldID0gdGhpcy5fc2VsZWN0QWxsLmJpbmQodGhpcyk7CisgICAgICAgIGlmICh0aGlz
Ll9pc01hYykKKyAgICAgICAgICAgIHRoaXMuX3Nob3J0Y3V0c1tXZWJJbnNwZWN0b3IuS2V5Ym9h
cmRTaG9ydGN1dC5tYWtlS2V5KCJkIiwgbW9kaWZpZXJzLkN0cmwpXSA9IHRoaXMuX2hhbmRsZURl
bGV0ZUtleS5iaW5kKHRoaXMpOworCisgICAgICAgIHRoaXMuX3Nob3J0Y3V0c1tXZWJJbnNwZWN0
b3IuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlS2V5KCJkIiwgbW9kaWZpZXJzLkN0cmwgfCBtb2RpZmll
cnMuQWx0KV0gPSB0aGlzLl9oYW5kbGVUb2dnbGVEZWJ1Z01vZGUuYmluZCh0aGlzKTsKKyAgICAg
ICAgdGhpcy5fc2hvcnRjdXRzW1dlYkluc3BlY3Rvci5LZXlib2FyZFNob3J0Y3V0Lm1ha2VLZXko
ImgiLCBtb2RpZmllcnMuQ3RybCB8IG1vZGlmaWVycy5BbHQpXSA9IHRoaXMuX2hhbmRsZVRvZ2ds
ZUhpZ2hsaWdodE1vZGUuYmluZCh0aGlzKTsKKyAgICAgICAgdGhpcy5fc2hvcnRjdXRzW1dlYklu
c3BlY3Rvci5LZXlib2FyZFNob3J0Y3V0Lm1ha2VLZXkoIm0iLCBtb2RpZmllcnMuQ3RybCB8IG1v
ZGlmaWVycy5BbHQpXSA9IHRoaXMuX2hhbmRsZVRvZ2dsZU1vbm9zcGFjZU1vZGUuYmluZCh0aGlz
KTsKKyAgICB9LAorCisgICAgX2hhbmRsZVVuZG86IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAg
IHRoaXMuX3NldENvYWxlc2NpbmdVcGRhdGUodHJ1ZSk7CisgICAgICAgIHZhciByYW5nZSA9IHRo
aXMuX3RleHRNb2RlbC51bmRvKCk7CisgICAgICAgIGlmIChyYW5nZSkKKyAgICAgICAgICAgIHRo
aXMuX3NldENhcmV0TG9jYXRpb24ocmFuZ2UuZW5kTGluZSwgcmFuZ2UuZW5kQ29sdW1uKTsKKyAg
ICAgICAgdGhpcy5fc2V0Q29hbGVzY2luZ1VwZGF0ZShmYWxzZSk7CisgICAgfSwKKworICAgIF9o
YW5kbGVSZWRvOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB0aGlzLl9zZXRDb2FsZXNjaW5n
VXBkYXRlKHRydWUpOworICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLl90ZXh0TW9kZWwucmVkbygp
OworICAgICAgICBpZiAocmFuZ2UpCisgICAgICAgICAgICB0aGlzLl9zZXRDYXJldExvY2F0aW9u
KHJhbmdlLmVuZExpbmUsIHJhbmdlLmVuZENvbHVtbik7CisgICAgICAgIHRoaXMuX3NldENvYWxl
c2NpbmdVcGRhdGUoZmFsc2UpOworICAgIH0sCisKKyAgICBfaGFuZGxlRGVsZXRlS2V5OiBmdW5j
dGlvbigpCisgICAgeworICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLl9zZWxlY3Rpb24ucmFuZ2Uo
KTsKKyAgICAgICAgaWYgKHJhbmdlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKHJhbmdl
LmVuZENvbHVtbiA8IHRoaXMuX3RleHRNb2RlbC5saW5lTGVuZ3RoKHJhbmdlLnN0YXJ0TGluZSkp
CisgICAgICAgICAgICAgICAgcmFuZ2UuZW5kQ29sdW1uKys7CisgICAgICAgICAgICBlbHNlIGlm
IChyYW5nZS5lbmRMaW5lIDwgdGhpcy5fdGV4dE1vZGVsLmxpbmVzQ291bnQoKSkgeworICAgICAg
ICAgICAgICAgIHJhbmdlLmVuZExpbmUrKzsKKyAgICAgICAgICAgICAgICByYW5nZS5lbmRDb2x1
bW4gPSAwOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICB9IGVsc2UKKyAgICAgICAgICAgIHRoaXMuX3RleHRNb2RlbC5tYXJrVW5kb2FibGVTdGF0
ZSgpOworICAgICAgICB0aGlzLl9yZXBsYWNlU2VsZWN0aW9uV2l0aCgiIiwgcmFuZ2UpOworICAg
IH0sCisKKyAgICBfaGFuZGxlQmFja3NwYWNlS2V5OiBmdW5jdGlvbigpCisgICAgeworICAgICAg
ICB2YXIgcmFuZ2UgPSB0aGlzLl9zZWxlY3Rpb24ucmFuZ2UoKTsKKyAgICAgICAgaWYgKHJhbmdl
LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0Q29sdW1uID4gMCkKKyAg
ICAgICAgICAgICAgICByYW5nZS5zdGFydENvbHVtbi0tOworICAgICAgICAgICAgZWxzZSBpZiAo
cmFuZ2Uuc3RhcnRMaW5lID4gMCkgeworICAgICAgICAgICAgICAgIHJhbmdlLnN0YXJ0TGluZS0t
OworICAgICAgICAgICAgICAgIHJhbmdlLnN0YXJ0Q29sdW1uID0gdGhpcy5fdGV4dE1vZGVsLmxp
bmVMZW5ndGgocmFuZ2Uuc3RhcnRMaW5lKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICB0aGlzLl90ZXh0TW9k
ZWwubWFya1VuZG9hYmxlU3RhdGUoKTsKKyAgICAgICAgdGhpcy5fcmVwbGFjZVNlbGVjdGlvbldp
dGgoIiIsIHJhbmdlKTsKKyAgICB9LAorCisgICAgX2hhbmRsZVRvZ2dsZURlYnVnTW9kZTogZnVu
Y3Rpb24oKQorICAgIHsKKyAgICAgICAgdGhpcy5fZGVidWdNb2RlID0gIXRoaXMuX2RlYnVnTW9k
ZTsKKyAgICB9LAorCisgICAgX2hhbmRsZVRvZ2dsZU1vbm9zcGFjZU1vZGU6IGZ1bmN0aW9uKCkK
KyAgICB7CisgICAgICAgIHRoaXMuX2luaXRGb250KHRoaXMuX2lzTW9ub3NwYWNlKTsKKyAgICAg
ICAgdGhpcy5fdXBkYXRlU2l6ZSgwLCB0aGlzLl90ZXh0TW9kZWwubGluZXNDb3VudCgpKTsKKyAg
ICAgICAgdGhpcy5fcmVwYWludEFsbCgpOworICAgIH0sCisKKyAgICBfaGFuZGxlVG9nZ2xlSGln
aGxpZ2h0TW9kZTogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgdGhpcy5faGlnaGxpZ2h0aW5n
RW5hYmxlZCA9ICF0aGlzLl9oaWdobGlnaHRpbmdFbmFibGVkOworICAgIH0sCisKKyAgICBfaXNN
ZXRhQ3RybDogZnVuY3Rpb24oZSkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9pc01hYyA/
IGUubWV0YUtleSA6IGUuY3RybEtleTsKKyAgICB9LAorCisgICAgX2lzQWx0Q3RybDogZnVuY3Rp
b24oZSkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9pc01hYyA/IGUuYWx0S2V5IDogZS5j
dHJsS2V5OworICAgIH0sCisKKyAgICBfZGVjaW1hbERpZ2l0czogZnVuY3Rpb24obnVtYmVyKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIE1hdGguY2VpbChNYXRoLmxvZyhudW1iZXIgKyAxKSAvIE1h
dGgubG9nKDEwKSk7CisgICAgfQorfQorCitXZWJJbnNwZWN0b3IuVGV4dFNlbGVjdGlvbk1vZGVs
ID0gZnVuY3Rpb24oY2hhbmdlTGlzdGVuZXIpCit7CisgICAgdGhpcy5zdGFydExpbmUgPSAwOwor
ICAgIHRoaXMuc3RhcnRDb2x1bW4gPSAwOworICAgIHRoaXMuZW5kTGluZSA9IDA7CisgICAgdGhp
cy5lbmRDb2x1bW4gPSAwOworICAgIHRoaXMuX2NoYW5nZUxpc3RlbmVyID0gY2hhbmdlTGlzdGVu
ZXI7Cit9CisKK1dlYkluc3BlY3Rvci5UZXh0U2VsZWN0aW9uTW9kZWwucHJvdG90eXBlID0gewor
ICAgIHNldFN0YXJ0OiBmdW5jdGlvbihsaW5lLCBjb2x1bW4pCisgICAgeworICAgICAgICB2YXIg
b2xkUmFuZ2UgPSB0aGlzLnJhbmdlKCk7CisKKyAgICAgICAgdGhpcy5zdGFydExpbmUgPSBsaW5l
OworICAgICAgICB0aGlzLnN0YXJ0Q29sdW1uID0gY29sdW1uOworICAgICAgICB0aGlzLmVuZExp
bmUgPSBsaW5lOworICAgICAgICB0aGlzLmVuZENvbHVtbiA9IGNvbHVtbjsKKworICAgICAgICB0
aGlzLl9jaGFuZ2VMaXN0ZW5lcihvbGRSYW5nZSwgdGhpcy5yYW5nZSgpKTsKKyAgICB9LAorCisg
ICAgc2V0RW5kOiBmdW5jdGlvbihsaW5lLCBjb2x1bW4pCisgICAgeworICAgICAgICB2YXIgb2xk
UmFuZ2UgPSB0aGlzLnJhbmdlKCk7CisKKyAgICAgICAgdGhpcy5lbmRMaW5lID0gbGluZTsKKyAg
ICAgICAgdGhpcy5lbmRDb2x1bW4gPSBjb2x1bW47CisKKyAgICAgICAgdGhpcy5fY2hhbmdlTGlz
dGVuZXIob2xkUmFuZ2UsIHRoaXMucmFuZ2UoKSwgdGhpcy5lbmRMaW5lLCB0aGlzLmVuZENvbHVt
bik7CisgICAgfSwKKworICAgIHJhbmdlOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICBpZiAo
dGhpcy5zdGFydExpbmUgPCB0aGlzLmVuZExpbmUgfHwgKHRoaXMuc3RhcnRMaW5lID09PSB0aGlz
LmVuZExpbmUgJiYgdGhpcy5zdGFydENvbHVtbiA8PSB0aGlzLmVuZENvbHVtbikpCisgICAgICAg
ICAgICByZXR1cm4gbmV3IFdlYkluc3BlY3Rvci5UZXh0UmFuZ2UodGhpcy5zdGFydExpbmUsIHRo
aXMuc3RhcnRDb2x1bW4sIHRoaXMuZW5kTGluZSwgdGhpcy5lbmRDb2x1bW4pOworICAgICAgICBl
bHNlCisgICAgICAgICAgICByZXR1cm4gbmV3IFdlYkluc3BlY3Rvci5UZXh0UmFuZ2UodGhpcy5l
bmRMaW5lLCB0aGlzLmVuZENvbHVtbiwgdGhpcy5zdGFydExpbmUsIHRoaXMuc3RhcnRDb2x1bW4p
OworICAgIH0sCisKKyAgICBpc0VtcHR5OiBmdW5jdGlvbigpCisgICAgeworICAgICAgICByZXR1
cm4gdGhpcy5zdGFydExpbmUgPT09IHRoaXMuZW5kTGluZSAmJiB0aGlzLnN0YXJ0Q29sdW1uID09
PSB0aGlzLmVuZENvbHVtbjsKKyAgICB9Cit9CisKK1dlYkluc3BlY3Rvci5UZXh0Q3Vyc29yID0g
ZnVuY3Rpb24oY3Vyc29yRWxlbWVudCkKK3sKKyAgICB0aGlzLl92aXNpYmxlID0gZmFsc2U7Cisg
ICAgdGhpcy5fY3Vyc29yRWxlbWVudCA9IGN1cnNvckVsZW1lbnQ7Cit9CisKK1dlYkluc3BlY3Rv
ci5UZXh0Q3Vyc29yLnByb3RvdHlwZSA9IHsKKyAgICBzZXRMb2NhdGlvbjogZnVuY3Rpb24oeCwg
eSkKKyAgICB7CisgICAgICAgIHRoaXMuX3ggPSB4OworICAgICAgICB0aGlzLl95ID0geTsKKyAg
ICAgICAgaWYgKHRoaXMuX3BhaW50SW50ZXJ2YWwpIHsKKyAgICAgICAgICAgIHdpbmRvdy5jbGVh
ckludGVydmFsKHRoaXMuX3BhaW50SW50ZXJ2YWwpOworICAgICAgICAgICAgZGVsZXRlIHRoaXMu
X3BhaW50SW50ZXJ2YWw7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5fcGFpbnRJbnRlcnZhbCA9
IHdpbmRvdy5zZXRJbnRlcnZhbCh0aGlzLl9wYWludC5iaW5kKHRoaXMsIGZhbHNlKSwgNTAwKTsK
KyAgICAgICAgdGhpcy5fcGFpbnQodHJ1ZSk7CisgICAgfSwKKworICAgIF9wYWludDogZnVuY3Rp
b24oZm9yY2UpCisgICAgeworICAgICAgICBpZiAoZm9yY2UpCisgICAgICAgICAgICB0aGlzLl92
aXNpYmxlID0gdHJ1ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhpcy5fdmlzaWJsZSA9
ICF0aGlzLl92aXNpYmxlOworICAgICAgICB0aGlzLl9jdXJzb3JFbGVtZW50LnN0eWxlLmxlZnQg
PSB0aGlzLl94ICsgInB4IjsKKyAgICAgICAgdGhpcy5fY3Vyc29yRWxlbWVudC5zdHlsZS50b3Ag
PSB0aGlzLl95ICsgInB4IjsKKyAgICAgICAgdGhpcy5fY3Vyc29yRWxlbWVudC5zdHlsZS5kaXNw
bGF5ID0gdGhpcy5fdmlzaWJsZSA/ICJibG9jayIgOiAibm9uZSI7CisgICAgfQorfQpkaWZmIC0t
Z2l0IGEvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL1RleHRFZGl0b3JIaWdobGlnaHRlci5q
cyBiL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9UZXh0RWRpdG9ySGlnaGxpZ2h0ZXIuanMK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYxYjI5OQotLS0gL2Rldi9udWxs
CisrKyBiL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9UZXh0RWRpdG9ySGlnaGxpZ2h0ZXIu
anMKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJl
CisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHly
aWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhl
IG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9y
cyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9t
CisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNz
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBI
T0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAq
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBU
SEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JIaWdobGlnaHRlciA9IGZ1
bmN0aW9uKHRleHRNb2RlbCkKK3sKKyAgICB0aGlzLl90ZXh0TW9kZWwgPSB0ZXh0TW9kZWw7Cisg
ICAgdGhpcy5faGlnaGxpZ2h0ZXJTY2hlbWUgPSBuZXcgV2ViSW5zcGVjdG9yLkphdmFTY3JpcHRI
aWdobGlnaHRlclNjaGVtZSgpOworCisgICAgdGhpcy5fc3R5bGVzID0gW107CisgICAgdGhpcy5f
c3R5bGVzW1dlYkluc3BlY3Rvci5UZXh0RWRpdG9ySGlnaGxpZ2h0ZXIuVG9rZW5UeXBlLkNvbW1l
bnRdID0gInJnYigwLCAxMTYsIDApIjsKKyAgICB0aGlzLl9zdHlsZXNbV2ViSW5zcGVjdG9yLlRl
eHRFZGl0b3JIaWdobGlnaHRlci5Ub2tlblR5cGUuU3RyaW5nXSA9ICJyZ2IoMTk2LCAyNiwgMjIp
IjsKKyAgICB0aGlzLl9zdHlsZXNbV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JIaWdobGlnaHRlci5U
b2tlblR5cGUuS2V5d29yZF0gPSAicmdiKDE3MCwgMTMsIDE0NSkiOworICAgIHRoaXMuX3N0eWxl
c1tXZWJJbnNwZWN0b3IuVGV4dEVkaXRvckhpZ2hsaWdodGVyLlRva2VuVHlwZS5OdW1iZXJdID0g
InJnYigyOCwgMCwgMjA3KSI7Cit9CisKK1dlYkluc3BlY3Rvci5UZXh0RWRpdG9ySGlnaGxpZ2h0
ZXIuVG9rZW5UeXBlID0geworICAgIENvbW1lbnQ6IDAsCisgICAgU3RyaW5nOiAxLAorICAgIEtl
eXdvcmQ6IDIsCisgICAgTnVtYmVyOiAzCit9CisKK1dlYkluc3BlY3Rvci5UZXh0RWRpdG9ySGln
aGxpZ2h0ZXIucHJvdG90eXBlID0geworICAgIGhpZ2hsaWdodDogZnVuY3Rpb24oc3RhcnRMaW5l
LCBlbmRMaW5lKQorICAgIHsKKyAgICAgICAgdGhpcy5faGlnaGxpZ2h0ZXJTY2hlbWUucmVzZXQo
dGhpcyk7CisgICAgICAgIC8vIFJld2luZCB0byB0aGUgbGFzdCBoaWdobGlnaHRlZCBsaW5lIHRv
IGdhaW4gcHJvcGVyIGhpZ2hsaWdodGVyIGNvbnRleHQuCisgICAgICAgIHdoaWxlIChzdGFydExp
bmUgPiAwICYmICF0aGlzLl90ZXh0TW9kZWwuZ2V0QXR0cmlidXRlKHN0YXJ0TGluZSAtIDEsIDAs
ICJoaWdobGlnaHRlci1zdGF0ZSIpKQorICAgICAgICAgICAgc3RhcnRMaW5lLS07CisKKyAgICAg
ICAgLy8gUmVzdG9yZSBoaWdobGlnaHRlciBjb250ZXh0IHRha2VuIGZyb20gcHJldmlvdXMgbGlu
ZS4KKyAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5fdGV4dE1vZGVsLmdldEF0dHJpYnV0ZShzdGFy
dExpbmUgLSAxLCAwLCAiaGlnaGxpZ2h0ZXItc3RhdGUiKTsKKyAgICAgICAgaWYgKHN0YXRlKSB7
CisgICAgICAgICAgICB0aGlzLmNvbnRpbnVlU3RhdGUgPSBzdGF0ZS5wb3N0Q29udGludWVTdGF0
ZTsKKyAgICAgICAgICAgIHRoaXMubGV4U3RhdGUgPSBzdGF0ZS5wb3N0TGV4U3RhdGU7CisgICAg
ICAgIH0KKworICAgICAgICAvLyBFYWNoIGxpbmUgaGFzIGFzc29jaWF0ZWQgc3RhdGUgYXR0cmli
dXRlIHdpdGggcHJlLSBhbmQgcG9zdC1oaWdobGlnaHRlciBjb25kaXRpb25zLgorICAgICAgICAv
LyBIaWdobGlnaHQgbGluZXMgZnJvbSByYW5nZSB1bnRpbCB3ZSBmaW5kIGxpbmUgcHJlY29uZGl0
aW9uIG1hdGNoaW5nIGhpZ2hsaWdodGVyIHN0YXRlLgorICAgICAgICB2YXIgZGFtYWdlID0ge307
CisgICAgICAgIGZvciAodmFyIGkgPSBzdGFydExpbmU7IGkgPCBlbmRMaW5lOyArK2kpIHsKKyAg
ICAgICAgICAgIHN0YXRlID0gdGhpcy5fdGV4dE1vZGVsLmdldEF0dHJpYnV0ZShpLCAwLCAiaGln
aGxpZ2h0ZXItc3RhdGUiKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZSAmJiBzdGF0ZS5wcmVDb250
aW51ZVN0YXRlID09PSB0aGlzLmNvbnRpbnVlU3RhdGUgJiYgc3RhdGUucHJlTGV4U3RhdGUgPT09
IHRoaXMubGV4U3RhdGUpIHsKKyAgICAgICAgICAgICAgICAvLyBGb2xsb3dpbmcgbGluZXMgYXJl
IHVwIHRvIGRhdGUsIG5vIG5lZWQgcmUtaGlnaGxpZ2h0LgorICAgICAgICAgICAgICAgIHRoaXMu
Y29udGludWVTdGF0ZSA9IHN0YXRlLnBvc3RDb250aW51ZVN0YXRlOworICAgICAgICAgICAgICAg
IHRoaXMubGV4U3RhdGUgPSBzdGF0ZS5wb3N0TGV4U3RhdGU7CisgICAgICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRhbWFnZVtpXSA9IHRydWU7CisK
KyAgICAgICAgICAgIHN0YXRlID0ge307CisgICAgICAgICAgICBzdGF0ZS5wcmVDb250aW51ZVN0
YXRlID0gdGhpcy5jb250aW51ZVN0YXRlOworICAgICAgICAgICAgc3RhdGUucHJlTGV4U3RhdGUg
PSB0aGlzLmxleFN0YXRlOworCisgICAgICAgICAgICB0aGlzLl90ZXh0TW9kZWwucmVtb3ZlQXR0
cmlidXRlcyhpLCAiaGlnaGxpZ2h0Iik7CisgICAgICAgICAgICB2YXIgbGluZSA9IHRoaXMuX3Rl
eHRNb2RlbC5saW5lKGkpOworICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsaW5lLmxl
bmd0aDspCisgICAgICAgICAgICAgICAgaiArPSB0aGlzLl9sZXgobGluZS5zdWJzdHJpbmcoaiks
IGksIGopOworCisgICAgICAgICAgICBzdGF0ZS5wb3N0Q29udGludWVTdGF0ZSA9IHRoaXMuY29u
dGludWVTdGF0ZTsKKyAgICAgICAgICAgIHN0YXRlLnBvc3RMZXhTdGF0ZSA9IHRoaXMubGV4U3Rh
dGU7CisgICAgICAgICAgICB0aGlzLl90ZXh0TW9kZWwuYWRkQXR0cmlidXRlKGksIDAsICJoaWdo
bGlnaHRlci1zdGF0ZSIsIHN0YXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRlID0gdGhp
cy5fdGV4dE1vZGVsLmdldEF0dHJpYnV0ZShlbmRMaW5lLCAwLCAiaGlnaGxpZ2h0ZXItc3RhdGUi
KTsKKworICAgICAgICBpZiAoc3RhdGUgJiYgKHN0YXRlLnByZUNvbnRpbnVlU3RhdGUgIT09IHRo
aXMuY29udGludWVTdGF0ZSB8fCBzdGF0ZS5wcmVMZXhTdGF0ZSAhPT0gdGhpcy5sZXhTdGF0ZSkp
IHsKKyAgICAgICAgICAgIC8vIFJlcXVlc3RlZCBoaWdobGlnaHQgcmFuZ2UgaXMgb3ZlciwgYnV0
IHdlIGRpZCBub3QgcmVjb3Zlci4gSW52YWxpZGF0ZSB0YWlsIGhpZ2hsaWdodGluZy4KKyAgICAg
ICAgICAgIGZvciAodmFyIGkgPSBlbmRMaW5lOyBpIDwgdGhpcy5fdGV4dE1vZGVsLmxpbmVzQ291
bnQoKTsgKytpKQorICAgICAgICAgICAgICAgIHRoaXMuX3RleHRNb2RlbC5yZW1vdmVBdHRyaWJ1
dGVzKGksICJoaWdobGlnaHRlci1zdGF0ZSIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJu
IGRhbWFnZTsKKyAgICB9LAorCisgICAgX2xleDogZnVuY3Rpb24oY29kZUZyYWdtZW50LCBsaW5l
LCBjb2x1bW4pIHsKKyAgICAgICAgdmFyIHRva2VuID0gbnVsbDsKKyAgICAgICAgZm9yICh2YXIg
aSA9IDA7IGkgPCB0aGlzLl9oaWdobGlnaHRlclNjaGVtZS5ydWxlcy5sZW5ndGg7IGkrKykgewor
ICAgICAgICAgICAgdmFyIHJ1bGUgPSB0aGlzLl9oaWdobGlnaHRlclNjaGVtZS5ydWxlc1tpXTsK
KyAgICAgICAgICAgIHZhciBydWxlQ29udGludWVTdGF0ZUNvbmRpdGlvbiA9IHR5cGVvZiBydWxl
LnByZUNvbnRpbnVlU3RhdGUgIT09ICJ1bmRlZmluZWQiID8gcnVsZS5wcmVDb250aW51ZVN0YXRl
IDogdGhpcy5faGlnaGxpZ2h0ZXJTY2hlbWUuQ29udGludWVTdGF0ZS5Ob25lOworICAgICAgICAg
ICAgaWYgKHRoaXMuY29udGludWVTdGF0ZSAhPT0gcnVsZUNvbnRpbnVlU3RhdGVDb25kaXRpb24p
CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAodHlwZW9mIHJ1bGUu
cHJlTGV4U3RhdGUgIT09ICJ1bmRlZmluZWQiICYmIHRoaXMubGV4U3RhdGUgIT09IHJ1bGUucHJl
TGV4U3RhdGUpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIHZhciBt
YXRjaCA9IHJ1bGUucGF0dGVybi5leGVjKGNvZGVGcmFnbWVudCk7CisgICAgICAgICAgICBpZiAo
bWF0Y2gpIHsKKyAgICAgICAgICAgICAgICB0b2tlbiA9IG1hdGNoWzBdOworICAgICAgICAgICAg
ICAgIGlmICh0b2tlbiAmJiAoIXJ1bGUua2V5d29yZHMgfHwgKHRva2VuIGluIHJ1bGUua2V5d29y
ZHMpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJ1bGUudHlwZSA9PT0gIm51
bWJlciIpCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXh0TW9kZWwuYWRkQXR0cmli
dXRlKGxpbmUsIGNvbHVtbiwgImhpZ2hsaWdodCIsIHsgbGVuZ3RoOiB0b2tlbi5sZW5ndGgsIHN0
eWxlOiB0aGlzLl9zdHlsZXNbcnVsZS50eXBlXSB9KTsKKyAgICAgICAgICAgICAgICAgICAgaWYg
KHR5cGVvZiBydWxlLnBvc3RMZXhTdGF0ZSAhPT0gInVuZGVmaW5lZCIpCisgICAgICAgICAgICAg
ICAgICAgICAgICB0aGlzLmxleFN0YXRlID0gcnVsZS5wb3N0TGV4U3RhdGU7CisgICAgICAgICAg
ICAgICAgICAgIGlmICh0eXBlb2YgcnVsZS5wb3N0Q29udGludWVTdGF0ZSAhPT0gInVuZGVmaW5l
ZCIpCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRpbnVlU3RhdGUgPSBydWxlLnBv
c3RDb250aW51ZVN0YXRlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4ubGVuZ3Ro
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBy
ZXR1cm4gMTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1l
bmQvVGV4dEVkaXRvck1vZGVsLmpzIGIvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL1RleHRF
ZGl0b3JNb2RlbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTM0ZmZl
Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL1RleHRFZGl0
b3JNb2RlbC5qcwpAQCAtMCwwICsxLDMwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBH
b29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
CisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBO
ZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBj
b250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRl
cml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0
ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBD
T1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRF
RCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK1dlYkluc3BlY3Rvci5UZXh0UmFuZ2UgPSBmdW5j
dGlvbihzdGFydExpbmUsIHN0YXJ0Q29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pCit7CisgICAg
dGhpcy5zdGFydExpbmUgPSBzdGFydExpbmU7CisgICAgdGhpcy5zdGFydENvbHVtbiA9IHN0YXJ0
Q29sdW1uOworICAgIHRoaXMuZW5kTGluZSA9IGVuZExpbmU7CisgICAgdGhpcy5lbmRDb2x1bW4g
PSBlbmRDb2x1bW47Cit9CisKK1dlYkluc3BlY3Rvci5UZXh0UmFuZ2UucHJvdG90eXBlID0gewor
ICAgIGlzRW1wdHk6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0
TGluZSA9PT0gdGhpcy5lbmRMaW5lICYmIHRoaXMuc3RhcnRDb2x1bW4gPT09IHRoaXMuZW5kQ29s
dW1uOworICAgIH0sCisKKyAgICBsaW5lc0NvdW50OiBmdW5jdGlvbigpCisgICAgeworICAgICAg
ICByZXR1cm4gdGhpcy5lbmRMaW5lIC0gdGhpcy5zdGFydExpbmU7CisgICAgfSwKKworICAgIGNs
b25lOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFdlYkluc3BlY3Rvci5U
ZXh0UmFuZ2UodGhpcy5zdGFydExpbmUsIHRoaXMuc3RhcnRDb2x1bW4sIHRoaXMuZW5kTGluZSwg
dGhpcy5lbmRDb2x1bW4pOyAKKyAgICB9Cit9CisKK1dlYkluc3BlY3Rvci5UZXh0RWRpdG9yTW9k
ZWwgPSBmdW5jdGlvbihjaGFuZ2VMaXN0ZW5lcikKK3sKKyAgICB0aGlzLl9jaGFuZ2VMaXN0ZW5l
ciA9IGNoYW5nZUxpc3RlbmVyOworICAgIHRoaXMuX2xpbmVzID0gWyIiXTsKKyAgICB0aGlzLl9h
dHRyaWJ1dGVzID0gW107CisgICAgdGhpcy5fdW5kb1N0YWNrID0gW107CisgICAgdGhpcy5fbm9Q
dW5jdHVhdGlvblJlZ2V4ID0gL1teICElJigpKissLS46Ozw9Pj9cW1xdXF57fH1+XSsvOworfQor
CitXZWJJbnNwZWN0b3IuVGV4dEVkaXRvck1vZGVsLnByb3RvdHlwZSA9IHsKKworICAgIGxpbmVz
Q291bnQ6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9saW5lcy5sZW5n
dGg7CisgICAgfSwKKworICAgIGNvbHVtbnNDb3VudDogZnVuY3Rpb24oKQorICAgIHsKKyAgICAg
ICAgdmFyIHdpZHRoID0gMDsKKyAgICAgICAgdmFyIGxpbmVzQ291bnQgPSB0aGlzLl9saW5lcy5s
ZW5ndGg7CisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXNDb3VudDsgKytpKSB7Cisg
ICAgICAgICAgICB2YXIgbGluZSA9IHRoaXMuX2xpbmVzW2ldOworICAgICAgICAgICAgaWYgKGxp
bmUubGVuZ3RoID4gd2lkdGgpCisgICAgICAgICAgICAgICAgd2lkdGggPSBsaW5lLmxlbmd0aDsK
KyAgICAgICAgfQorICAgICAgICByZXR1cm4gd2lkdGg7CisgICAgfSwKKworICAgIGxpbmU6IGZ1
bmN0aW9uKGxpbmVOdW1iZXIpCisgICAgeworICAgICAgICBpZiAobGluZU51bWJlciA+PSB0aGlz
Ll9saW5lcy5sZW5ndGgpCisgICAgICAgICAgICB0aHJvdyAiT3V0IG9mIGJvdW5kczoiICsgbGlu
ZU51bWJlcjsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2xpbmVzW2xpbmVOdW1iZXJdOworICAgIH0s
CisKKyAgICBsaW5lTGVuZ3RoOiBmdW5jdGlvbihsaW5lTnVtYmVyKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIHRoaXMuX2xpbmVzW2xpbmVOdW1iZXJdLmxlbmd0aDsKKyAgICB9LAorCisgICAgc2V0
VGV4dDogZnVuY3Rpb24ocmFuZ2UsIHRleHQpCisgICAgeworICAgICAgICBpZiAoIXJhbmdlKQor
ICAgICAgICAgICAgcmFuZ2UgPSBuZXcgV2ViSW5zcGVjdG9yLlRleHRSYW5nZSgwLCAwLCB0aGlz
Ll9saW5lcy5sZW5ndGggLSAxLCB0aGlzLl9saW5lc1t0aGlzLl9saW5lcy5sZW5ndGggLSAxXS5s
ZW5ndGgpOworICAgICAgICB2YXIgY29tbWFuZCA9IHRoaXMuX3B1c2hVbmRvYWJsZUNvbW1hbmQo
cmFuZ2UsIHRleHQpOworICAgICAgICB2YXIgbmV3UmFuZ2UgPSB0aGlzLl9pbm5lclNldFRleHQo
cmFuZ2UsIHRleHQpOworICAgICAgICBjb21tYW5kLnJhbmdlID0gbmV3UmFuZ2UuY2xvbmUoKTsK
KworICAgICAgICB0aGlzLl9jaGFuZ2VMaXN0ZW5lcihyYW5nZSwgbmV3UmFuZ2UsIGNvbW1hbmQu
dGV4dCwgdGV4dCk7CisgICAgICAgIHJldHVybiBuZXdSYW5nZTsKKyAgICB9LAorCisgICAgX2lu
bmVyU2V0VGV4dDogZnVuY3Rpb24ocmFuZ2UsIHRleHQpCisgICAgeworICAgICAgICB0aGlzLl9l
cmFzZVJhbmdlKHJhbmdlKTsKKyAgICAgICAgaWYgKHRleHQgPT09ICIiKQorICAgICAgICAgICAg
cmV0dXJuIG5ldyBXZWJJbnNwZWN0b3IuVGV4dFJhbmdlKHJhbmdlLnN0YXJ0TGluZSwgcmFuZ2Uu
c3RhcnRDb2x1bW4sIHJhbmdlLnN0YXJ0TGluZSwgcmFuZ2Uuc3RhcnRDb2x1bW4pOworCisgICAg
ICAgIHZhciBuZXdMaW5lcyA9IHRleHQuc3BsaXQoIlxuIik7CisgICAgICAgIHZhciBwcmVmaXgg
PSB0aGlzLl9saW5lc1tyYW5nZS5zdGFydExpbmVdLnN1YnN0cmluZygwLCByYW5nZS5zdGFydENv
bHVtbik7CisgICAgICAgIHZhciBwcmVmaXhBcmd1bWVudHMgPSB0aGlzLl9hcmd1bWVudHMKKyAg
ICAgICAgdmFyIHN1ZmZpeCA9IHRoaXMuX2xpbmVzW3JhbmdlLnN0YXJ0TGluZV0uc3Vic3RyaW5n
KHJhbmdlLnN0YXJ0Q29sdW1uKTsKKworICAgICAgICB2YXIgcG9zdENhcmV0ID0gcHJlZml4Lmxl
bmd0aDsKKyAgICAgICAgLy8gSW5zZXJ0IHRleHQuCisgICAgICAgIGlmIChuZXdMaW5lcy5sZW5n
dGggPT09IDEpIHsKKyAgICAgICAgICAgIHRoaXMuX3NldExpbmUocmFuZ2Uuc3RhcnRMaW5lLCBw
cmVmaXggKyBuZXdMaW5lc1swXSArIHN1ZmZpeCk7CisgICAgICAgICAgICBwb3N0Q2FyZXQgKz0g
bmV3TGluZXNbMF0ubGVuZ3RoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5f
c2V0TGluZShyYW5nZS5zdGFydExpbmUsIHByZWZpeCArIG5ld0xpbmVzWzBdKTsKKyAgICAgICAg
ICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbmV3TGluZXMubGVuZ3RoOyArK2kpCisgICAgICAgICAg
ICAgICAgdGhpcy5faW5zZXJ0TGluZShyYW5nZS5zdGFydExpbmUgKyBpLCBuZXdMaW5lc1tpXSk7
CisgICAgICAgICAgICB0aGlzLl9zZXRMaW5lKHJhbmdlLnN0YXJ0TGluZSArIG5ld0xpbmVzLmxl
bmd0aCAtIDEsIG5ld0xpbmVzW25ld0xpbmVzLmxlbmd0aCAtIDFdICsgc3VmZml4KTsKKyAgICAg
ICAgICAgIHBvc3RDYXJldCA9IG5ld0xpbmVzW25ld0xpbmVzLmxlbmd0aCAtIDFdLmxlbmd0aDsK
KyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFdlYkluc3BlY3Rvci5UZXh0UmFuZ2UocmFu
Z2Uuc3RhcnRMaW5lLCByYW5nZS5zdGFydENvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHJhbmdlLnN0YXJ0TGluZSArIG5ld0xpbmVzLmxlbmd0aCAtIDEs
IHBvc3RDYXJldCk7CisgICAgfSwKKworICAgIF9lcmFzZVJhbmdlOiBmdW5jdGlvbihyYW5nZSkK
KyAgICB7CisgICAgICAgIGlmIChyYW5nZS5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm47
CisKKyAgICAgICAgdmFyIHByZWZpeCA9IHRoaXMuX2xpbmVzW3JhbmdlLnN0YXJ0TGluZV0uc3Vi
c3RyaW5nKDAsIHJhbmdlLnN0YXJ0Q29sdW1uKTsKKyAgICAgICAgdmFyIHN1ZmZpeCA9IHRoaXMu
X2xpbmVzW3JhbmdlLmVuZExpbmVdLnN1YnN0cmluZyhyYW5nZS5lbmRDb2x1bW4pOworCisgICAg
ICAgIGlmIChyYW5nZS5lbmRMaW5lID4gcmFuZ2Uuc3RhcnRMaW5lKQorICAgICAgICAgICAgdGhp
cy5fcmVtb3ZlTGluZXMocmFuZ2Uuc3RhcnRMaW5lICsgMSwgcmFuZ2UuZW5kTGluZSAtIHJhbmdl
LnN0YXJ0TGluZSk7CisgICAgICAgIHRoaXMuX3NldExpbmUocmFuZ2Uuc3RhcnRMaW5lLCBwcmVm
aXggKyBzdWZmaXgpOworICAgIH0sCisKKyAgICBfc2V0TGluZTogZnVuY3Rpb24obGluZU51bWJl
ciwgdGV4dCkKKyAgICB7CisgICAgICAgIHRoaXMuX2xpbmVzW2xpbmVOdW1iZXJdID0gdGV4dDsK
KyAgICAgICAgZGVsZXRlIHRoaXMuX2F0dHJpYnV0ZXNbbGluZU51bWJlcl07CisgICAgfSwKKwor
ICAgIF9yZW1vdmVMaW5lczogZnVuY3Rpb24oZnJvbUxpbmUsIGNvdW50KQorICAgIHsKKyAgICAg
ICAgdGhpcy5fbGluZXMuc3BsaWNlKGZyb21MaW5lLCBjb3VudCk7CisgICAgICAgIHRoaXMuX2F0
dHJpYnV0ZXMuc3BsaWNlKGZyb21MaW5lLCBjb3VudCk7CisgICAgfSwKKworICAgIF9pbnNlcnRM
aW5lOiBmdW5jdGlvbihsaW5lTnVtYmVyLCB0ZXh0KQorICAgIHsKKyAgICAgICAgdGhpcy5fbGlu
ZXMuc3BsaWNlKGxpbmVOdW1iZXIsIDAsIHRleHQpOworICAgICAgICB0aGlzLl9hdHRyaWJ1dGVz
LnNwbGljZShsaW5lTnVtYmVyLCAwLCBbXSk7CisgICAgfSwKKworICAgIHdvcmRSYW5nZTogZnVu
Y3Rpb24obGluZU51bWJlciwgY29sdW1uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBXZWJJ
bnNwZWN0b3IuVGV4dFJhbmdlKGxpbmVOdW1iZXIsIHRoaXMud29yZFN0YXJ0KGxpbmVOdW1iZXIs
IGNvbHVtbiwgdHJ1ZSksIGxpbmVOdW1iZXIsIHRoaXMud29yZEVuZChsaW5lTnVtYmVyLCBjb2x1
bW4sIHRydWUpKTsKKyAgICB9LAorCisgICAgd29yZFN0YXJ0OiBmdW5jdGlvbihsaW5lTnVtYmVy
LCBjb2x1bW4sIGdhcGxlc3MpCisgICAgeworICAgICAgICB2YXIgbGluZSA9IHRoaXMuX2xpbmVz
W2xpbmVOdW1iZXJdOworICAgICAgICB2YXIgcHJlZml4ID0gbGluZS5zdWJzdHJpbmcoMCwgY29s
dW1uKS5zcGxpdCgiIikucmV2ZXJzZSgpLmpvaW4oIiIpOworICAgICAgICB2YXIgcHJlZml4TWF0
Y2ggPSB0aGlzLl9ub1B1bmN0dWF0aW9uUmVnZXguZXhlYyhwcmVmaXgpOworICAgICAgICByZXR1
cm4gcHJlZml4TWF0Y2ggJiYgKCFnYXBsZXNzIHx8IHByZWZpeE1hdGNoLmluZGV4ID09PSAwKSA/
IGNvbHVtbiAtIHByZWZpeE1hdGNoLmluZGV4IC0gcHJlZml4TWF0Y2hbMF0ubGVuZ3RoIDogY29s
dW1uOworICAgIH0sCisKKyAgICB3b3JkRW5kOiBmdW5jdGlvbihsaW5lTnVtYmVyLCBjb2x1bW4s
IGdhcGxlc3MpCisgICAgeworICAgICAgICB2YXIgbGluZSA9IHRoaXMuX2xpbmVzW2xpbmVOdW1i
ZXJdOworICAgICAgICB2YXIgc3VmZml4ID0gbGluZS5zdWJzdHJpbmcoY29sdW1uKTsKKyAgICAg
ICAgdmFyIHN1ZmZpeE1hdGNoID0gdGhpcy5fbm9QdW5jdHVhdGlvblJlZ2V4LmV4ZWMoc3VmZml4
KTsKKyAgICAgICAgcmV0dXJuIHN1ZmZpeE1hdGNoICYmICghZ2FwbGVzcyB8fCBzdWZmaXhNYXRj
aC5pbmRleCA9PT0gMCkgPyBjb2x1bW4gKyBzdWZmaXhNYXRjaC5pbmRleCArIHN1ZmZpeE1hdGNo
WzBdLmxlbmd0aCA6IGNvbHVtbjsKKyAgICB9LAorCisgICAgY29weVJhbmdlOiBmdW5jdGlvbihy
YW5nZSkKKyAgICB7CisgICAgICAgIHZhciBjbGlwID0gW107CisgICAgICAgIGlmIChyYW5nZS5z
dGFydExpbmUgPT09IHJhbmdlLmVuZExpbmUpIHsKKyAgICAgICAgICAgIGNsaXAucHVzaCh0aGlz
Ll9saW5lc1tyYW5nZS5zdGFydExpbmVdLnN1YnN0cmluZyhyYW5nZS5zdGFydENvbHVtbiwgcmFu
Z2UuZW5kQ29sdW1uKSk7CisgICAgICAgICAgICByZXR1cm4gY2xpcC5qb2luKCJcbiIpOworICAg
ICAgICB9CisgICAgICAgIGNsaXAucHVzaCh0aGlzLl9saW5lc1tyYW5nZS5zdGFydExpbmVdLnN1
YnN0cmluZyhyYW5nZS5zdGFydENvbHVtbikpOworICAgICAgICBmb3IgKHZhciBpID0gcmFuZ2Uu
c3RhcnRMaW5lICsgMTsgaSA8IHJhbmdlLmVuZExpbmU7ICsraSkKKyAgICAgICAgICAgIGNsaXAu
cHVzaCh0aGlzLl9saW5lc1tpXSk7CisgICAgICAgIGNsaXAucHVzaCh0aGlzLl9saW5lc1tyYW5n
ZS5lbmRMaW5lXS5zdWJzdHJpbmcoMCwgcmFuZ2UuZW5kQ29sdW1uKSk7CisgICAgICAgIHJldHVy
biBjbGlwLmpvaW4oIlxuIik7CisgICAgfSwKKworICAgIGFkZEF0dHJpYnV0ZTogZnVuY3Rpb24o
bGluZSwgY29sdW1uLCBuYW1lLCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHZhciBhdHRycyA9IHRo
aXMuX2F0dHJpYnV0ZXNbbGluZV07CisgICAgICAgIGlmICghYXR0cnMpIHsKKyAgICAgICAgICAg
IGF0dHJzID0gW107CisgICAgICAgICAgICB0aGlzLl9hdHRyaWJ1dGVzW2xpbmVdID0gYXR0cnM7
CisgICAgICAgIH0KKyAgICAgICAgdmFyIGZhbWlseSA9IGF0dHJzW25hbWVdOworICAgICAgICBp
ZiAoIWZhbWlseSkgeworICAgICAgICAgICAgZmFtaWx5ID0gW107CisgICAgICAgICAgICBhdHRy
c1tuYW1lXSA9IGZhbWlseTsKKyAgICAgICAgfQorICAgICAgICBmYW1pbHlbY29sdW1uXSA9IHZh
bHVlOworICAgIH0sCisKKyAgICBnZXRBdHRyaWJ1dGU6IGZ1bmN0aW9uKGxpbmUsIGNvbHVtbiwg
bmFtZSkKKyAgICB7CisgICAgICAgIHZhciBmYW1pbHkgPSB0aGlzLmdldEF0dHJpYnV0ZXMobGlu
ZSwgbmFtZSk7CisgICAgICAgIHJldHVybiBmYW1pbHkgPyBmYW1pbHlbY29sdW1uXSA6IG51bGw7
CisgICAgfSwKKworICAgIGdldEF0dHJpYnV0ZXM6IGZ1bmN0aW9uKGxpbmUsIG5hbWUpCisgICAg
eworICAgICAgICB2YXIgYXR0cnMgPSB0aGlzLl9hdHRyaWJ1dGVzW2xpbmVdOworICAgICAgICBy
ZXR1cm4gYXR0cnMgPyBhdHRyc1tuYW1lXSA6IG51bGw7CisgICAgfSwKKworICAgIHJlbW92ZUF0
dHJpYnV0ZXM6IGZ1bmN0aW9uKGxpbmUsIG5hbWUpCisgICAgeworICAgICAgICB2YXIgYXR0cnMg
PSB0aGlzLl9hdHRyaWJ1dGVzW2xpbmVdOworICAgICAgICBpZiAoYXR0cnMpCisgICAgICAgICAg
ICBkZWxldGUgYXR0cnNbbmFtZV07CisgICAgfSwKKworICAgIF9wdXNoVW5kb2FibGVDb21tYW5k
OiBmdW5jdGlvbihyYW5nZSwgdGV4dCkKKyAgICB7CisgICAgICAgIHZhciBjb21tYW5kID0gewor
ICAgICAgICAgICAgdGV4dDogdGhpcy5jb3B5UmFuZ2UocmFuZ2UpLAorICAgICAgICAgICAgc3Rh
cnRMaW5lOiByYW5nZS5zdGFydExpbmUsCisgICAgICAgICAgICBzdGFydENvbHVtbjogcmFuZ2Uu
c3RhcnRDb2x1bW4sCisgICAgICAgICAgICBlbmRMaW5lOiByYW5nZS5zdGFydExpbmUsCisgICAg
ICAgICAgICBlbmRDb2x1bW46IHJhbmdlLnN0YXJ0Q29sdW1uCisgICAgICAgIH07CisgICAgICAg
IGlmICh0aGlzLl9pblVuZG8pCisgICAgICAgICAgICB0aGlzLl9yZWRvU3RhY2sucHVzaChjb21t
YW5kKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoIXRoaXMuX2luUmVkbykKKyAg
ICAgICAgICAgICAgICB0aGlzLl9yZWRvU3RhY2sgPSBbXTsKKyAgICAgICAgICAgIHRoaXMuX3Vu
ZG9TdGFjay5wdXNoKGNvbW1hbmQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb21tYW5k
OworICAgIH0sCisKKyAgICB1bmRvOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB0aGlzLl9t
YXJrUmVkb2FibGVTdGF0ZSgpOworCisgICAgICAgIHRoaXMuX2luVW5kbyA9IHRydWU7CisgICAg
ICAgIHZhciByYW5nZSA9IHRoaXMuX2RvVW5kbyh0aGlzLl91bmRvU3RhY2spOworICAgICAgICBk
ZWxldGUgdGhpcy5faW5VbmRvOworCisgICAgICAgIHJldHVybiByYW5nZTsKKyAgICB9LAorCisg
ICAgcmVkbzogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgdGhpcy5tYXJrVW5kb2FibGVTdGF0
ZSgpOworCisgICAgICAgIHRoaXMuX2luUmVkbyA9IHRydWU7CisgICAgICAgIHZhciByYW5nZSA9
IHRoaXMuX2RvVW5kbyh0aGlzLl9yZWRvU3RhY2spOworICAgICAgICBkZWxldGUgdGhpcy5faW5S
ZWRvOworCisgICAgICAgIHJldHVybiByYW5nZTsKKyAgICB9LAorCisgICAgX2RvVW5kbzogZnVu
Y3Rpb24oc3RhY2spCisgICAgeworICAgICAgICB2YXIgcmFuZ2UgPSBudWxsOworICAgICAgICBm
b3IgKHZhciBpID0gc3RhY2subGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgICAg
IHZhciBjb21tYW5kID0gc3RhY2tbaV07CisgICAgICAgICAgICBzdGFjay5sZW5ndGggPSBpOwor
CisgICAgICAgICAgICByYW5nZSA9IHRoaXMuc2V0VGV4dChjb21tYW5kLnJhbmdlLCBjb21tYW5k
LnRleHQpOworICAgICAgICAgICAgaWYgKGkgPiAwICYmIHN0YWNrW2kgLSAxXS5leHBsaWNpdCkK
KyAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJu
IHJhbmdlOworICAgIH0sCisKKyAgICBtYXJrVW5kb2FibGVTdGF0ZTogZnVuY3Rpb24oKQorICAg
IHsKKyAgICAgICAgaWYgKHRoaXMuX3VuZG9TdGFjay5sZW5ndGgpCisgICAgICAgICAgICB0aGlz
Ll91bmRvU3RhY2tbdGhpcy5fdW5kb1N0YWNrLmxlbmd0aCAtIDFdLmV4cGxpY2l0ID0gdHJ1ZTsK
KyAgICB9LAorCisgICAgX21hcmtSZWRvYWJsZVN0YXRlOiBmdW5jdGlvbigpCisgICAgeworICAg
ICAgICBpZiAodGhpcy5fcmVkb1N0YWNrLmxlbmd0aCkKKyAgICAgICAgICAgIHRoaXMuX3JlZG9T
dGFja1t0aGlzLl9yZWRvU3RhY2subGVuZ3RoIC0gMV0uZXhwbGljaXQgPSB0cnVlOworICAgIH0s
CisKKyAgICByZXNldFVuZG9TdGFjazogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgdGhpcy5f
dW5kb1N0YWNrID0gW107CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9pbnNwZWN0b3Iv
ZnJvbnQtZW5kL1dlYktpdC5xcmMgYi9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvV2ViS2l0
LnFyYwppbmRleCA0YTIxZTJjLi44NWRiYzZiIDEwMDY0NAotLS0gYS9XZWJDb3JlL2luc3BlY3Rv
ci9mcm9udC1lbmQvV2ViS2l0LnFyYworKysgYi9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQv
V2ViS2l0LnFyYwpAQCAtMzUsNiArMzUsNyBAQAogICAgIDxmaWxlPmluc3BlY3Rvci5qczwvZmls
ZT4KICAgICA8ZmlsZT5JbnNwZWN0b3JCYWNrZW5kU3R1Yi5qczwvZmlsZT4KICAgICA8ZmlsZT5J
bnNwZWN0b3JGcm9udGVuZEhvc3RTdHViLmpzPC9maWxlPgorICAgIDxmaWxlPkphdmFTY3JpcHRI
aWdobGlnaHRlclNjaGVtZS5qczwvZmlsZT4KICAgICA8ZmlsZT5KYXZhU2NyaXB0U291cmNlU3lu
dGF4SGlnaGxpZ2h0ZXIuanM8L2ZpbGU+CiAgICAgPGZpbGU+S2V5Ym9hcmRTaG9ydGN1dC5qczwv
ZmlsZT4KICAgICA8ZmlsZT5NZXRyaWNzU2lkZWJhclBhbmUuanM8L2ZpbGU+CkBAIC03MCw2ICs3
MSw5IEBACiAgICAgPGZpbGU+U3R5bGVzU2lkZWJhclBhbmUuanM8L2ZpbGU+CiAgICAgPGZpbGU+
U3VtbWFyeUJhci5qczwvZmlsZT4KICAgICA8ZmlsZT5UZXN0Q29udHJvbGxlci5qczwvZmlsZT4K
KyAgICA8ZmlsZT5UZXh0RWRpdG9yLmpzPC9maWxlPgorICAgIDxmaWxlPlRleHRFZGl0b3JIaWdo
bGlnaHRlci5qczwvZmlsZT4KKyAgICA8ZmlsZT5UZXh0RWRpdG9yTW9kZWwuanM8L2ZpbGU+CiAg
ICAgPGZpbGU+VGV4dFByb21wdC5qczwvZmlsZT4KICAgICA8ZmlsZT5UaW1lbGluZUFnZW50Lmpz
PC9maWxlPgogICAgIDxmaWxlPlRpbWVsaW5lR3JpZC5qczwvZmlsZT4KZGlmZiAtLWdpdCBhL1dl
YkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9pbnNwZWN0b3IuY3NzIGIvV2ViQ29yZS9pbnNwZWN0
b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5jc3MKaW5kZXggYjY3NjE3NS4uZGZmOGMyOSAxMDA2NDQK
LS0tIGEvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5jc3MKKysrIGIvV2Vi
Q29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5jc3MKQEAgLTM3NTgsMyArMzc1OCw0
OSBAQCBvbC5icmVha3BvaW50LWxpc3QgewogLndlYmtpdC1odG1sLWpzLW5vZGUsIC53ZWJraXQt
aHRtbC1jc3Mtbm9kZSB7CiAgICAgd2hpdGUtc3BhY2U6IHByZTsKIH0KKworLnRleHQtZWRpdG9y
IHsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgdG9wOjA7CisgICAgbGVmdDowOworICAg
IHJpZ2h0OjA7CisgICAgYm90dG9tOjA7CisgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogdGV4dDsK
KyAgICAtd2Via2l0LXVzZXItbW9kaWZ5OiByZWFkLXdyaXRlLXBsYWludGV4dC1vbmx5OworfQor
CisudGV4dC1lZGl0b3ItY2FudmFzIHsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgdG9w
OjA7CisgICAgbGVmdDowOworICAgIHJpZ2h0OjA7CisgICAgYm90dG9tOjA7CisgICAgei1pbmRl
eDogMTA7CisgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cit9CisKKy50ZXh0LWVkaXRvci1jb250
YWluZXIgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6MDsKKyAgICBsZWZ0OjA7
CisgICAgcmlnaHQ6MDsKKyAgICBib3R0b206MDsKKyAgICBvdmVyZmxvdzogYXV0bzsKK30KKwor
LnRleHQtZWRpdG9yLXNoZWV0IHsKKyAgICBvcGFjaXR5OiAwOworfQorCisudGV4dC1lZGl0b3It
Y3Vyc29yIHsKKyAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOworICAgIC13ZWJraXQtdXNl
ci1tb2RpZnk6IG5vbmU7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDowOworICAg
IGxlZnQ6MDsKKyAgICB3aWR0aDoxcHg7CisgICAgaGVpZ2h0OiAxNHB4OworICAgIHotaW5kZXg6
IDIwOworICAgIGJhY2tncm91bmQtY29sb3I6IGJsYWNrOworICAgIHBvaW50ZXItZXZlbnRzOiBu
b25lOworfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rv
ci5odG1sIGIvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5odG1sCmluZGV4
IDlmNzhjMGYuLjEyOGYyZTggMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVu
ZC9pbnNwZWN0b3IuaHRtbAorKysgYi9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvaW5zcGVj
dG9yLmh0bWwKQEAgLTk0LDYgKzk0LDEwIEBAIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgICAgPHNjcmlwdCB0eXBlPSJ0
ZXh0L2phdmFzY3JpcHQiIHNyYz0iU291cmNlU3ludGF4SGlnaGxpZ2h0ZXIuanMiPjwvc2NyaXB0
PgogICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IkNTU1NvdXJjZVN5bnRh
eEhpZ2hsaWdodGVyLmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNj
cmlwdCIgc3JjPSJKYXZhU2NyaXB0U291cmNlU3ludGF4SGlnaGxpZ2h0ZXIuanMiPjwvc2NyaXB0
PgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IlRleHRFZGl0b3JNb2Rl
bC5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0i
VGV4dEVkaXRvci5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3Jp
cHQiIHNyYz0iVGV4dEVkaXRvckhpZ2hsaWdodGVyLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0
IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJKYXZhU2NyaXB0SGlnaGxpZ2h0ZXJTY2hlbWUu
anMiPjwvc2NyaXB0PgogICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IlNv
dXJjZVZpZXcuanMiPjwvc2NyaXB0PgogICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0
IiBzcmM9IkZvbnRWaWV3LmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2
YXNjcmlwdCIgc3JjPSJJbWFnZVZpZXcuanMiPjwvc2NyaXB0Pgo=
</data>
<flag name="review"
          id="28235"
          type_id="1"
          status="+"
          setter="timothy"
    />
          </attachment>
      

    </bug>

</bugzilla>