<?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>174715</bug_id>
          
          <creation_ts>2017-07-21 09:39:57 -0700</creation_ts>
          <short_desc>Add a data structure for fixed sets of data that can switch its implementation strategy based on the input</short_desc>
          <delta_ts>2017-12-11 08:49:46 -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 Template Framework</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>NEW</bug_status>
          <resolution></resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>174195</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Sam Weinig">sam</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>andersca</cc>
    
    <cc>cdumez</cc>
    
    <cc>darin</cc>
    
    <cc>ysuzuki</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1330986</commentid>
    <comment_count>0</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2017-07-21 09:39:57 -0700</bug_when>
    <thetext>It&apos;s become increasingly common for there to be a need for a fixed (at compile time) set or map of objects. We have increasingly turned to NeverDestroyed&lt;HashSet&lt;&gt;&gt;s for these, but in many cases this is non-optimal. We should add a data structure that chooses the right underlying model (Single item, linear search array, binary search array, hash set, perfect hashing) based on the input (or direct choice by the author in special cases). (as a side note, when sets are needed, we could look into optimizations like having the hash table and the values array in contiguous readonly memory, we could avoid the need for deleted values and perhaps other aspects that are only needed in dynamic hash tables).

References to comments leading to this bug:

I noted in bug 174348:

&quot;My biggest takeaway is that we have a lot of static maps / sets / vectors that never change and that perhaps we should have specialized data structures for them. And, it reaffirmed my curiosity on determining the right size of a list deserves what data structure (e.g. does a list of 4 items really need to be in a HashSet, or would lookups in Vector be just as fast).&quot;


Darin noted in bug 174533:

&quot;I am annoyed by the overuse of HashSet for fixed sets where more efficient algorithms may work better. I think I need to build a FixedSet family of class templates. Then it can be a HashSet only when the set is huge, an array with binary search when it’s smaller, an array with linear search when it’s even smaller, and a single function call when it has exactly one element. Either FixedSet can automatically do the right thing, we can have multiple FixedSet classes with identical interfaces but different implementations (FixedSingleItemSet, FixedLinearSearchSet, FixedBinarySearchSet, FixedHashSet), or FixedSet can take a template parameter to tell it which type of implementation to generate.&quot;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1330989</commentid>
    <comment_count>1</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2017-07-21 09:52:31 -0700</bug_when>
    <thetext>An interesting library that solves some of the goals here and might be useful for inspiration or otherwise is Serge Guelton&apos;s Frozen:
(Blog post: https://blog.quarkslab.com/frozen-an-header-only-constexpr-alternative-to-gperf-for-c14-users.html, GitHub: https://github.com/serge-sans-paille/frozen).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1331000</commentid>
    <comment_count>2</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2017-07-21 10:09:55 -0700</bug_when>
    <thetext>(In reply to Sam Weinig from comment #1)
&gt; An interesting library that solves some of the goals here and might be
&gt; useful for inspiration or otherwise is Serge Guelton&apos;s Frozen:
&gt; (Blog post:
&gt; https://blog.quarkslab.com/frozen-an-header-only-constexpr-alternative-to-
&gt; gperf-for-c14-users.html, GitHub:
&gt; https://github.com/serge-sans-paille/frozen).

That sounds cool. Reading the post(http://stevehanov.ca/blog/index.php?id=119), their minimal (good!) perfect-hashing construction is O(N). Not taking too much time to find an appropriate seed for the hash function in compile time.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1331001</commentid>
    <comment_count>3</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2017-07-21 10:14:42 -0700</bug_when>
    <thetext>Potentially, we can use this structure for static hash tables in JSC&apos;s prototypes and constructors.
Currently, we are deploying a bit simple perfect hashing table: Inserting the values to the table. If we find a collision, we just double the size of the table and perform again.
This potentially minimizes the current static hash tables.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1331003</commentid>
    <comment_count>4</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2017-07-21 10:20:14 -0700</bug_when>
    <thetext>I think we should upgrade Windows buildbot&apos;s MSVC to 2017 to use C++14 including related-constexpr. According to this library, it requires C++14 constexpr.
And even if we construct the own one, it becomes complicated code if we do not have C++14 relaxed constexpr.

We already upgraded GCC. So, after upgrading MSVC, we can start using this feature.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1331090</commentid>
    <comment_count>5</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2017-07-21 13:33:06 -0700</bug_when>
    <thetext>We already use perfect hashing implemented with gperf for cases where we decided performance was absolutely critical. The goal here is not necessarily to replace that, but to replace the cases where we needlessly use HashSet and create something that is unnecessarily large in code size and inefficient. With something trivially easy to use correctly and with good performance.

We may want to do this for just sets, or both sets and maps, for just strings or for all types of keys.

I do not think we should use perfect hashing for very small sets. I think we can outperform it with linear search and maybe even with binary search for some larger sets. Even for larger sets, I am not entirely sure perfect hashing is what we should be after. These are the considerations from most important to least, I think:

1) clarity of source code
2) memory use
3) code size
4) speed

Maybe I’m wrong about 2-4, but I am pretty sure that 1 is the top one.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1331378</commentid>
    <comment_count>6</comment_count>
      <attachid>316206</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2017-07-22 11:55:04 -0700</bug_when>
    <thetext>Created attachment 316206
FixedSet Proof of Concept

I played with this idea a little this morning and got a simple proof of concept done that works with integers. It will need more work to generalize it, but that&apos;s why it&apos;s a proof of concept.

The way it works is you do something like:

    static constexpr auto set = makeFixedSet&lt;unsigned&gt;( 5, 4, 1, 2, 3 );

If chooses the data structure to use based on how many arguments are passed to makeFixedSet. For a single argument, it uses a FixedSetSingle. For 4 or less, it uses a FixedSetLinearSearchArray. And for 5 and more, it uses FixedSetBinarySearchArray.

The input does not need to be pre-sorted, as the FixedSetBinarySearchArray does a constexpr sort of the contents.

I left out a HashTable or Perfect Hash variant from this proof of concept, but once additional types are added, I don&apos;t think adding those will be too much trouble (famous last words).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1331402</commentid>
    <comment_count>7</comment_count>
      <attachid>316214</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2017-07-22 17:13:08 -0700</bug_when>
    <thetext>Created attachment 316214
Updated Proof of Concept (added MetaStrings)

Made a little more progress. I added a mechanism to compile time strings from a parameter pack (see makeFixedStringArray) and added a basic MetaString type. I&apos;d like to get to the point where I can convert the MetaString into a WTF::StaticStringImpl, and have those be the basis for the actual set, but I am thinking that will mean I need to maintain the string length as a constant, so MetaString will probably have to evolve.

For AtomicStrings, I think we will have to take a slightly different tack, and build the constant strings at compile time, but lazily create the actual AtomicStringImpls at first use.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1380211</commentid>
    <comment_count>8</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2017-12-11 08:49:46 -0800</bug_when>
    <thetext>Now, VC++ is updated: it means that relaxed constexpr is available in WebKit!</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>316206</attachid>
            <date>2017-07-22 11:55:04 -0700</date>
            <delta_ts>2017-07-22 11:55:04 -0700</delta_ts>
            <desc>FixedSet Proof of Concept</desc>
            <filename>fixedSetProofOfConcept.diff</filename>
            <type>text/plain</type>
            <size>17001</size>
            <attacher name="Sam Weinig">sam</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdFdlYktpdEFQSS54Y29kZXByb2ovcHJvamVj
dC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdFdlYktpdEFQ
SS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAyMTk3NTApCisrKyBUb29scy9U
ZXN0V2ViS2l0QVBJL1Rlc3RXZWJLaXRBUEkueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29y
a2luZyBjb3B5KQpAQCAtMjU5LDYgKzI1OSw3IEBACiAJCTdDMzk2NTA2MUNERDc0RjkwMDk0REJC
OCAvKiBDb2xvci5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSA3QzM5NjUwNTFDREQ3NEY5MDA5NERCQjggLyogQ29sb3IuY3BwICovOyB9OwogCQk3QzNE
QjhFNDFEMTIxMjlCMDBBRThDQzMgLyogQ29tbWFuZEJhY2tGb3J3YXJkLm1tIGluIFNvdXJjZXMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gN0MzREI4RTIxRDEyMTI5QjAwQUU4
Q0MzIC8qIENvbW1hbmRCYWNrRm9yd2FyZC5tbSAqLzsgfTsKIAkJN0M0MTdGMzMxRDE5RTE0ODAw
QjhFRjUzIC8qIFdLV2ViVmlld0RlZmF1bHROYXZpZ2F0aW9uRGVsZWdhdGUubW0gaW4gU291cmNl
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA3QzQxN0YzMTFEMTlFMTQ4MDBC
OEVGNTMgLyogV0tXZWJWaWV3RGVmYXVsdE5hdmlnYXRpb25EZWxlZ2F0ZS5tbSAqLzsgfTsKKwkJ
N0M0MUVGNjkxRjIzMTIyNzAwQkZDRTk3IC8qIEZpeGVkU2V0LmNwcCBpbiBTb3VyY2VzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDdDNDFFRjY4MUYyMzEyMjcwMEJGQ0U5NyAv
KiBGaXhlZFNldC5jcHAgKi87IH07CiAJCTdDNDg2QkExMUFBMTI1NjcwMDNGNkY5QiAvKiBidW5k
bGUtZmlsZS5odG1sIGluIENvcHkgUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IDdDNDg2QkEwMUFBMTI1NEIwMDNGNkY5QiAvKiBidW5kbGUtZmlsZS5odG1sICov
OyB9OwogCQk3QzU0QTRCRTFBQTExQ0NBMDAzODBGNzggLyogV0tCdW5kbGVGaWxlSGFuZGxlLmNw
cCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDdDNTRBNEJD
MUFBMTFDQ0EwMDM4MEY3OCAvKiBXS0J1bmRsZUZpbGVIYW5kbGUuY3BwICovOyB9OwogCQk3QzU0
QTRDMTFBQTExQ0U0MDAzODBGNzggLyogV0tCdW5kbGVGaWxlSGFuZGxlX0J1bmRsZS5jcHAgaW4g
U291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA3QzU0QTRCRjFBQTEx
Q0U0MDAzODBGNzggLyogV0tCdW5kbGVGaWxlSGFuZGxlX0J1bmRsZS5jcHAgKi87IH07CkBAIC0z
NzYsNyArMzc3LDYgQEAKIAkJN0NDRTdFQzExQTQxMUE3RTAwNDQ3QzRDIC8qIEhUTUxDb2xsZWN0
aW9uTmFtZWRJdGVtLm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gOUI0RjhGQTMxNTlENTJCMTAwMkQ5Rjk0IC8qIEhUTUxDb2xsZWN0aW9uTmFtZWRJdGVt
Lm1tICovOyB9OwogCQk3Q0NFN0VDMjFBNDExQTdFMDA0NDdDNEMgLyogSFRNTEZvcm1Db2xsZWN0
aW9uTmFtZWRJdGVtLm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gOUIyNkZDNkIxNTlEMDYxMDAwQ0MzNzY1IC8qIEhUTUxGb3JtQ29sbGVjdGlvbk5hbWVk
SXRlbS5tbSAqLzsgfTsKIAkJN0NDRTdFQzMxQTQxMUE3RTAwNDQ3QzRDIC8qIEluc3BlY3RvckJh
ci5tbSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEM1MDdF
OEE2MTRDNjU0NUIwMDVENkIzQiAvKiBJbnNwZWN0b3JCYXIubW0gKi87IH07Ci0JCTk1NjQ2RTVC
MUYxREI2MEUwMERFMEVCOSAvKiBJbnNwZWN0b3JWYWx1ZS5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA5NTNGNDc5MTFGMURCNDAzMDBFM0QxRTMgLyog
SW5zcGVjdG9yVmFsdWUuY3BwICovOyB9OwogCQk3Q0NFN0VDNDFBNDExQTdFMDA0NDdDNEMgLyog
SlNXcmFwcGVyRm9yTm9kZUluV2ViRnJhbWUubW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSA0QkI0MTYwMTE2ODE1QjI2MDA4MjQyMzggLyogSlNXcmFwcGVy
Rm9yTm9kZUluV2ViRnJhbWUubW0gKi87IH07CiAJCTdDQ0U3RUM1MUE0MTFBN0UwMDQ0N0M0QyAv
KiBNZW1vcnlDYWNoZURpc2FibGVXaXRoaW5SZXNvdXJjZUxvYWREZWxlZ2F0ZS5tbSBpbiBTb3Vy
Y2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEUxMjIwRDlGMTU1QjI1NDgw
MDEzRTJGQyAvKiBNZW1vcnlDYWNoZURpc2FibGVXaXRoaW5SZXNvdXJjZUxvYWREZWxlZ2F0ZS5t
bSAqLzsgfTsKIAkJN0NDRTdFQzYxQTQxMUE3RTAwNDQ3QzRDIC8qIE1lbW9yeUNhY2hlUHJ1bmVX
aXRoaW5SZXNvdXJjZUxvYWREZWxlZ2F0ZS5tbSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IDUxN0U3REZCMTUxMTBFQTYwMEQwQjAwOCAvKiBNZW1vcnlDYWNo
ZVBydW5lV2l0aGluUmVzb3VyY2VMb2FkRGVsZWdhdGUubW0gKi87IH07CkBAIC01MTIsNiArNTEy
LDcgQEAKIAkJOTNGNTZEQTcxRTVGOTE3NDAwM0VERTg0IC8qIGxpYmljdWNvcmUuZHlsaWIgaW4g
RnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA3QzgzRTAzMzFE
MEE1RjI3MDBGRUJDRjMgLyogbGliaWN1Y29yZS5keWxpYiAqLzsgfTsKIAkJOTNGNTZEQTkxRTVG
OTE5RDAwM0VERTg0IC8qIFdLV2ViVmlld1NuYXBzaG90Lm1tIGluIFNvdXJjZXMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOTNGNTZEQTgxRTVGOTE4MTAwM0VERTg0IC8qIFdL
V2ViVmlld1NuYXBzaG90Lm1tICovOyB9OwogCQk5M0Y3RTg2RjE0REM4RTVDMDBDODRBOTkgLyog
TmV3Rmlyc3RWaXN1YWxseU5vbkVtcHR5TGF5b3V0RnJhbWVzX0J1bmRsZS5jcHAgaW4gU291cmNl
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA5M0Y3RTg2RTE0REM4RTVCMDBD
ODRBOTkgLyogTmV3Rmlyc3RWaXN1YWxseU5vbkVtcHR5TGF5b3V0RnJhbWVzX0J1bmRsZS5jcHAg
Ki87IH07CisJCTk1NjQ2RTVCMUYxREI2MEUwMERFMEVCOSAvKiBJbnNwZWN0b3JWYWx1ZS5jcHAg
aW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA5NTNGNDc5MTFG
MURCNDAzMDBFM0QxRTMgLyogSW5zcGVjdG9yVmFsdWUuY3BwICovOyB9OwogCQk5OTg0RkFDQzFD
RkZBRjYwMDA4RDE5OEMgLyogV0tXZWJWaWV3VGV4dElucHV0Lm1tIGluIFNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOTk4NEZBQ0ExQ0ZGQUVFRTAwOEQxOThDIC8q
IFdLV2ViVmlld1RleHRJbnB1dC5tbSAqLzsgfTsKIAkJOTk4NEZBQ0UxQ0ZGQjA5MDAwOEQxOThD
IC8qIGVkaXRhYmxlLWJvZHkuaHRtbCBpbiBDb3B5IFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSA5OTg0RkFDRDFDRkZCMDM4MDA4RDE5OEMgLyogZWRpdGFibGUt
Ym9keS5odG1sICovOyB9OwogCQk5QjA3ODZBNTFDNTg4NUMzMDBEMTU5RTMgLyogSW5qZWN0ZWRC
dW5kbGVNYWtlQWxsU2hhZG93Um9vdHNPcGVuX0J1bmRsZS5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA5QjA3ODZBNDFDNTg4NUMzMDBEMTU5RTMgLyog
SW5qZWN0ZWRCdW5kbGVNYWtlQWxsU2hhZG93Um9vdHNPcGVuX0J1bmRsZS5jcHAgKi87IH07CkBA
IC0xMzE0LDYgKzEzMTUsNyBAQAogCQk3QzM5NjUwNTFDREQ3NEY5MDA5NERCQjggLyogQ29sb3Iu
Y3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gQ29sb3IuY3BwOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk3QzNEQjhFMjFEMTIxMjlCMDBBRThDQzMgLyogQ29t
bWFuZEJhY2tGb3J3YXJkLm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRo
ID0gQ29tbWFuZEJhY2tGb3J3YXJkLm1tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk3
QzQxN0YzMTFEMTlFMTQ4MDBCOEVGNTMgLyogV0tXZWJWaWV3RGVmYXVsdE5hdmlnYXRpb25EZWxl
Z2F0ZS5tbSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLm9iamNwcDsgcGF0aCA9IFdLV2ViVmll
d0RlZmF1bHROYXZpZ2F0aW9uRGVsZWdhdGUubW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CisJCTdDNDFFRjY4MUYyMzEyMjcwMEJGQ0U5NyAvKiBGaXhlZFNldC5jcHAgKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7
IHBhdGggPSBGaXhlZFNldC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTdDNDg2
QkEwMUFBMTI1NEIwMDNGNkY5QiAvKiBidW5kbGUtZmlsZS5odG1sICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5odG1sOyBwYXRoID0gImJ1bmRs
ZS1maWxlLmh0bWwiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk3QzU0QTRCQzFBQTEx
Q0NBMDAzODBGNzggLyogV0tCdW5kbGVGaWxlSGFuZGxlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuY3BwLmNwcDsgcGF0aCA9IFdLQnVuZGxlRmlsZUhhbmRsZS5jcHA7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CiAJCTdDNTRBNEJGMUFBMTFDRTQwMDM4MEY3OCAvKiBXS0J1bmRsZUZpbGVI
YW5kbGVfQnVuZGxlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFdL
QnVuZGxlRmlsZUhhbmRsZV9CdW5kbGUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpA
QCAtMTM5OCw2ICsxNDAwLDcgQEAKIAkJOTNGNTZEQTgxRTVGOTE4MTAwM0VERTg0IC8qIFdLV2Vi
Vmlld1NuYXBzaG90Lm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRoID0g
V0tXZWJWaWV3U25hcHNob3QubW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTkzRjdF
ODZCMTREQzhFNEQwMEM4NEE5OSAvKiBOZXdGaXJzdFZpc3VhbGx5Tm9uRW1wdHlMYXlvdXRGcmFt
ZXMuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gTmV3Rmlyc3RWaXN1
YWxseU5vbkVtcHR5TGF5b3V0RnJhbWVzLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
IAkJOTNGN0U4NkUxNERDOEU1QjAwQzg0QTk5IC8qIE5ld0ZpcnN0VmlzdWFsbHlOb25FbXB0eUxh
eW91dEZyYW1lc19CdW5kbGUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRo
ID0gTmV3Rmlyc3RWaXN1YWxseU5vbkVtcHR5TGF5b3V0RnJhbWVzX0J1bmRsZS5jcHA7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTk1M0Y0NzkxMUYxREI0MDMwMEUzRDFFMyAvKiBJbnNw
ZWN0b3JWYWx1ZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBJbnNwZWN0b3JWYWx1ZS5jcHA7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTk5ODRGQUNBMUNGRkFFRUUwMDhEMTk4QyAvKiBX
S1dlYlZpZXdUZXh0SW5wdXQubW0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5vYmpjcHA7IHBh
dGggPSBXS1dlYlZpZXdUZXh0SW5wdXQubW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJ
CTk5ODRGQUNEMUNGRkIwMzgwMDhEMTk4QyAvKiBlZGl0YWJsZS1ib2R5Lmh0bWwgKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSB0ZXh0Lmh0bWw7IHBhdGggPSAiZWRpdGFibGUtYm9keS5odG1sIjsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKIAkJOUIwNzg2QTIxQzU4ODMwRjAwRDE1OUUzIC8qIEluamVjdGVkQnVuZGxl
TWFrZUFsbFNoYWRvd1Jvb3RzT3Blbi5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7
IHBhdGggPSBJbmplY3RlZEJ1bmRsZU1ha2VBbGxTaGFkb3dSb290c09wZW4uY3BwOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwpAQCAtMTU0MCw3ICsxNTQzLDYgQEAKIAkJQzJDRjk3NTkxNkNF
QzY5RTAwNTRFOTlEIC8qIEpTQ29udGV4dEJhY2tGb3J3YXJkQ2FjaGUyLmh0bWwgKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSB0ZXh0Lmh0bWw7IHBhdGggPSBKU0NvbnRleHRCYWNrRm9yd2FyZENhY2hlMi5odG1sOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlDMkVCMkREMTE2Q0FDN0FDMDA5QjUyRUUgLyogV2Vi
Vmlld0RpZENyZWF0ZUphdmFTY3JpcHRDb250ZXh0Lm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
cHAub2JqY3BwOyBwYXRoID0gV2ViVmlld0RpZENyZWF0ZUphdmFTY3JpcHRDb250ZXh0Lm1tOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlDNTA3RThBNjE0QzY1NDVCMDA1RDZCM0IgLyog
SW5zcGVjdG9yQmFyLm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRoID0g
SW5zcGVjdG9yQmFyLm1tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwotCQk5NTNGNDc5MTFG
MURCNDAzMDBFM0QxRTMgLyogSW5zcGVjdG9yVmFsdWUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0g
SW5zcGVjdG9yVmFsdWUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlDNTEwMUM0
RTE3NkI4QkI5MDBFRTlCMTUgLyogZmluZFJhbmdlcy5odG1sICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5odG1s
OyBwYXRoID0gZmluZFJhbmdlcy5odG1sOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlD
NTFBRkI5ODE2OUY0OUZGMDA5Q0NGNjYgLyogRmluZE1hdGNoZXMubW0gKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5vYmpjcHA7IHBhdGggPSBGaW5kTWF0Y2hlcy5tbTsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKIAkJQzU0MEY3NzUxNTJFNERBMDAwQTQwQzhDIC8qIFNpbXBsaWZ5TWFya3Vw
Lm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRoID0gU2ltcGxpZnlNYXJr
dXAubW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0yNDE2LDYgKzI0MTgsNyBAQAog
CQkJCTdBQTZBMTUxMUFBQzBCMzEwMDJCMkVEMyAvKiBXb3JrUXVldWUuY3BwICovLAogCQkJCTI2
NUFGNTRGMTVEMUU0OEEwMEIwQ0I0QSAvKiBXVEZTdHJpbmcuY3BwICovLAogCQkJCTgzREI3OTY3
MUVGNjNCM0MwMEJGQTVFNSAvKiBGdW5jdGlvbi5jcHAgKi8sCisJCQkJN0M0MUVGNjgxRjIzMTIy
NzAwQkZDRTk3IC8qIEZpeGVkU2V0LmNwcCAqLywKIAkJCSk7CiAJCQlwYXRoID0gV1RGOwogCQkJ
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKQEAgLTI5MjYsNiArMjkyOSw3IEBACiAJCQkJNTMxQzFE
OEUxREY4RUY3MjAwNkU5NzlGIC8qIExFQkRlY29kZXIuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJ
N0M4M0RFRTgxRDBBNTkwQzAwRkVCQ0YzIC8qIExpc3RIYXNoU2V0LmNwcCBpbiBTb3VyY2VzICov
LAogCQkJCTUzMTFCRDVFMUVBOTQ5MEUwMDUyNTI4MSAvKiBUaHJlYWRNZXNzYWdlcy5jcHAgaW4g
U291cmNlcyAqLywKKwkJCQk3QzQxRUY2OTFGMjMxMjI3MDBCRkNFOTcgLyogRml4ZWRTZXQuY3Bw
IGluIFNvdXJjZXMgKi8sCiAJCQkJN0M4M0RGMUQxRDBBNTkwQzAwRkVCQ0YzIC8qIExvY2suY3Bw
IGluIFNvdXJjZXMgKi8sCiAJCQkJN0M4M0RFRUQxRDBBNTkwQzAwRkVCQ0YzIC8qIE1hdGhFeHRy
YXMuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJN0M4M0RFRUYxRDBBNTkwQzAwRkVCQ0YzIC8qIE1E
NS5jcHAgaW4gU291cmNlcyAqLywKSW5kZXg6IFRvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdHMvV1RG
L0ZpeGVkU2V0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dU
Ri9GaXhlZFNldC5jcHAJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvVGVzdFdlYktpdEFQSS9UZXN0
cy9XVEYvRml4ZWRTZXQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjg5IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5E
IElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFt
ZXNwYWNlIFRlc3RXZWJLaXRBUEkgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+
CitzdHJ1Y3QgRml4ZWRBcnJheSB7CisgICAgY29uc3RleHByIFQmIG9wZXJhdG9yW10oc2l6ZV90
IGkpCisgICAgeworICAgICAgICByZXR1cm4gdmFsdWVzW2ldOworICAgIH0KKworICAgIGNvbnN0
ZXhwciBjb25zdCBUJiBvcGVyYXRvcltdKHNpemVfdCBpKSBjb25zdAorICAgIHsKKyAgICAgICAg
cmV0dXJuIHZhbHVlc1tpXTsKKyAgICB9CisKKyAgICBjb25zdGV4cHIgY29uc3QgVCogYmVnaW4o
KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlczsKKyAgICB9CisgICAgY29uc3Rl
eHByIGNvbnN0IFQqIGVuZCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gdmFsdWVzICsg
TjsKKyAgICB9CisKKyAgICBUIHZhbHVlc1tOXTsKK307CisKK3RlbXBsYXRlPGNsYXNzIFQ+Citj
b25zdGV4cHIgdm9pZCBjb25zdGV4cHJfc3dhcChUJiBhLCBUJiBiKQoreworICAgIFQgdG1wID0g
c3RkOjptb3ZlKGEpOworICAgIGEgPSBzdGQ6Om1vdmUoYik7CisgICAgYiA9IHN0ZDo6bW92ZSh0
bXApOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Citjb25zdGV4cHIgdm9p
ZCByZWN1cnNpdmVTb3J0KEZpeGVkQXJyYXk8VCwgTj4mIGFycmF5LCBzaXplX3QgbGVmdCwgc2l6
ZV90IHJpZ2h0KQoreworICAgIGlmIChsZWZ0IDwgcmlnaHQpIHsKKyAgICAgICAgc2l6ZV90IG0g
PSBsZWZ0OworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSBsZWZ0ICsgMTsgaSA8IHJpZ2h0OyBp
KyspIHsKKyAgICAgICAgICAgIGlmIChhcnJheVtpXSA8IGFycmF5W2xlZnRdKQorICAgICAgICAg
ICAgICAgIGNvbnN0ZXhwcl9zd2FwKGFycmF5WysrbV0sIGFycmF5W2ldKTsKKyAgICAgICAgfQor
CisgICAgICAgIGNvbnN0ZXhwcl9zd2FwKGFycmF5W2xlZnRdLCBhcnJheVttXSk7CisKKyAgICAg
ICAgcmVjdXJzaXZlU29ydChhcnJheSwgbGVmdCwgbSk7CisgICAgICAgIHJlY3Vyc2l2ZVNvcnQo
YXJyYXksIG0gKyAxLCByaWdodCk7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwg
c2l6ZV90IE4+Citjb25zdGV4cHIgRml4ZWRBcnJheTxULCBOPiBzb3J0KEZpeGVkQXJyYXk8VCwg
Tj4gYXJyYXkpCit7CisgICAgYXV0byBzb3J0ZWQgPSBhcnJheTsKKyAgICByZWN1cnNpdmVTb3J0
KHNvcnRlZCwgMCwgTik7CisgICAgcmV0dXJuIHNvcnRlZDsKK30KKwordGVtcGxhdGUgPHR5cGVu
YW1lIFQsIHNpemVfdCBOPgorY29uc3RleHByIGJvb2wgYmluYXJ5U2VhcmNoKEZpeGVkQXJyYXk8
VCwgTj4gYXJyYXksIFQga2V5KQoreworICAgIHNpemVfdCBzaXplID0gTjsKKyAgICBzaXplX3Qg
b2Zmc2V0ID0gMDsKKyAgICB3aGlsZSAoc2l6ZSA+IDEpIHsKKyAgICAgICAgc2l6ZV90IHBvcyA9
IChzaXplIC0gMSkgPj4gMTsKKyAgICAgICAgYXV0byB2YWx1ZSA9IGFycmF5W29mZnNldCArIHBv
c107CisgICAgICAgIGlmICh2YWx1ZSA9PSBrZXkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICAgICAgCisgICAgICAgIGlmIChrZXkgPCB2YWx1ZSkKKyAgICAgICAgICAgIHNpemUgPSBw
b3M7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc2l6ZSAtPSAocG9zICsgMSk7CisgICAg
ICAgICAgICBvZmZzZXQgKz0gKHBvcyArIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0
dXJuIGFycmF5W29mZnNldF0gPT0ga2V5OworfQorCitlbnVtIGNsYXNzIEZpeGVkVHlwZSB7Cisg
ICAgU2luZ2xlLAorICAgIExpbmVhclNlYXJjaEFycmF5LAorICAgIEJpbmFyeVNlYXJjaEFycmF5
Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEZpeGVkU2V0U2luZ2xlIHsKKyAg
ICBzdGF0aWMgY29uc3RleHByIEZpeGVkVHlwZSB0eXBlID0gRml4ZWRUeXBlOjpTaW5nbGU7Cisg
ICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgbnVtYmVyT2ZFbGVtZW50cyA9IDE7CisKKyAgICB0
ZW1wbGF0ZTx0eXBlbmFtZSBVPgorICAgIGNvbnN0ZXhwciBGaXhlZFNldFNpbmdsZShVJiYgdikK
KyAgICAgICAgOiBtX3ZhbHVlIHsgc3RhdGljX2Nhc3Q8VD4odikgfQorICAgIHsKKyAgICB9CisK
KyAgICBjb25zdGV4cHIgc2l6ZV90IHNpemUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJu
IG51bWJlck9mRWxlbWVudHM7CisgICAgfQorCisgICAgY29uc3RleHByIGJvb2wgY29udGFpbnMo
VCBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX3ZhbHVlID09IG90aGVyOwor
ICAgIH0KKworICAgIGNvbnN0ZXhwciBjb25zdCBUKiBiZWdpbigpIGNvbnN0CisgICAgeworICAg
ICAgICByZXR1cm4gJm1fdmFsdWU7CisgICAgfQorICAgIGNvbnN0ZXhwciBjb25zdCBUKiBlbmQo
KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuICZtX3ZhbHVlICsgbnVtYmVyT2ZFbGVtZW50
czsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgVCBtX3ZhbHVlOworfTsKKwordGVtcGxhdGU8dHlw
ZW5hbWUgVCwgc2l6ZV90IE4+CitzdHJ1Y3QgRml4ZWRTZXRMaW5lYXJTZWFyY2hBcnJheSB7Cisg
ICAgc3RhdGljIGNvbnN0ZXhwciBGaXhlZFR5cGUgdHlwZSA9IEZpeGVkVHlwZTo6TGluZWFyU2Vh
cmNoQXJyYXk7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgbnVtYmVyT2ZFbGVtZW50cyA9
IE47CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBUcz4KKyAgICBjb25zdGV4cHIgRml4ZWRT
ZXRMaW5lYXJTZWFyY2hBcnJheShUcy4uLiB2YWx1ZXMpCisgICAgICAgIDogbV92YWx1ZXN7IHsg
c3RhdGljX2Nhc3Q8VD4odmFsdWVzKS4uLiB9IH0KKyAgICB7CisgICAgfQorCisgICAgY29uc3Rl
eHByIHNpemVfdCBzaXplKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBudW1iZXJPZkVs
ZW1lbnRzOworICAgIH0KKworICAgIGNvbnN0ZXhwciBib29sIGNvbnRhaW5zKFQgb3RoZXIpIGNv
bnN0CisgICAgeworICAgICAgICBmb3IgKGF1dG8gdmFsdWUgOiBtX3ZhbHVlcykgeworICAgICAg
ICAgICAgaWYgKHZhbHVlID09IG90aGVyKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdGV4cHIg
Y29uc3QgVCogYmVnaW4oKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fdmFsdWVzLmJl
Z2luKCk7CisgICAgfQorICAgIGNvbnN0ZXhwciBjb25zdCBUKiBlbmQoKSBjb25zdAorICAgIHsK
KyAgICAgICAgcmV0dXJuIG1fdmFsdWVzLmVuZCgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBG
aXhlZEFycmF5PFQsIE4+IG1fdmFsdWVzOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgc2l6
ZV90IE4+CitzdHJ1Y3QgRml4ZWRTZXRCaW5hcnlTZWFyY2hBcnJheSB7CisgICAgc3RhdGljIGNv
bnN0ZXhwciBGaXhlZFR5cGUgdHlwZSA9IEZpeGVkVHlwZTo6QmluYXJ5U2VhcmNoQXJyYXk7Cisg
ICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgbnVtYmVyT2ZFbGVtZW50cyA9IE47CisKKyAgICB0
ZW1wbGF0ZTx0eXBlbmFtZS4uLiBUcz4KKyAgICBjb25zdGV4cHIgRml4ZWRTZXRCaW5hcnlTZWFy
Y2hBcnJheShUcy4uLiB2YWx1ZXMpCisgICAgICAgIDogbV92YWx1ZXN7IHNvcnQoRml4ZWRBcnJh
eTxULCBOPnsgeyBzdGF0aWNfY2FzdDxUPih2YWx1ZXMpLi4ufSB9KSB9CisgICAgeworICAgIH0K
KworICAgIGNvbnN0ZXhwciBzaXplX3Qgc2l6ZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1
cm4gbnVtYmVyT2ZFbGVtZW50czsKKyAgICB9CisKKyAgICBjb25zdGV4cHIgYm9vbCBjb250YWlu
cyhUIGtleSkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBiaW5hcnlTZWFyY2gobV92YWx1
ZXMsIGtleSk7CisgICAgfQorCisgICAgY29uc3RleHByIGNvbnN0IFQqIGJlZ2luKCkgY29uc3QK
KyAgICB7CisgICAgICAgIHJldHVybiBtX3ZhbHVlcy5iZWdpbigpOworICAgIH0KKworICAgIGNv
bnN0ZXhwciBjb25zdCBUKiBlbmQoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fdmFs
dWVzLmVuZCgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBGaXhlZEFycmF5PFQsIE4+IG1fdmFs
dWVzOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgc2l6ZV90IE4+CitzdHJ1Y3QgRml4ZWRT
ZXRTZWxlY3RvciB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qgc2l6ZSA9IE47CisKKyAg
ICB1c2luZyBUeXBlID0KKyAgICAgICAgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxzaXplID09
IDEsIEZpeGVkU2V0U2luZ2xlPFQ+LAorICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjpjb25kaXRp
b25hbDxzaXplIDw9IDQsIEZpeGVkU2V0TGluZWFyU2VhcmNoQXJyYXk8VCwgc2l6ZT4sCisgICAg
ICAgICAgICAgICAgRml4ZWRTZXRCaW5hcnlTZWFyY2hBcnJheTxULCBzaXplPgorICAgICAgICAg
ICAgPjo6dHlwZQorICAgICAgICA+Ojp0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwg
dHlwZW5hbWUuLi4gVHM+Citjb25zdGV4cHIgYXV0byBtYWtlRml4ZWRTZXQoVHMuLi4gdmFsdWVz
KSAtPiB0eXBlbmFtZSBGaXhlZFNldFNlbGVjdG9yPFQsIHNpemVvZi4uLihUcyk+OjpUeXBlCit7
CisgICAgcmV0dXJuIHsgc3RkOjpmb3J3YXJkPFRzPih2YWx1ZXMpLi4uIH07Cit9CisKK1RFU1Qo
V1RGX0ZpeGVkU2V0LCBTaW5nbGUpCit7CisgICAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIHNldCA9
IG1ha2VGaXhlZFNldDx1bnNpZ25lZD4oIDE3ICk7CisgICAgc3RhdGljX2Fzc2VydChzZXQudHlw
ZSA9PSBGaXhlZFR5cGU6OlNpbmdsZSwgIlNpbmdsZSBlbGVtZW50IHNldCIpOworICAgIHN0YXRp
Y19hc3NlcnQoc2V0LnNpemUoKSA9PSAxLCAiU2V0IHNpemUgaXMgY29uc3RleHByIik7CisgICAg
c3RhdGljX2Fzc2VydChzZXQuY29udGFpbnMoMTcpLCAiU2V0IGNvbnRhaW5zIGlzIGNvbnN0ZXhw
ciIpOworICAgIHN0YXRpY19hc3NlcnQoIXNldC5jb250YWlucygxOCksICJTZXQgY29udGFpbnMg
aXMgY29uc3RleHByIik7CisKKyAgICBBU1NFUlRfRVEoKGludClGaXhlZFR5cGU6OlNpbmdsZSwg
KGludClzZXQudHlwZSk7CisgICAgQVNTRVJUX1RSVUUoc2V0LmNvbnRhaW5zKDE3KSk7CisgICAg
QVNTRVJUX0ZBTFNFKHNldC5jb250YWlucygzKSk7Cit9CisKK1RFU1QoV1RGX0ZpeGVkU2V0LCBM
aW5lYXJTZWFyY2hBcnJheSkKK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGF1dG8gc2V0ID0gbWFr
ZUZpeGVkU2V0PHVuc2lnbmVkPiggNCwgMiApOworICAgIHN0YXRpY19hc3NlcnQoc2V0LnR5cGUg
PT0gRml4ZWRUeXBlOjpMaW5lYXJTZWFyY2hBcnJheSwgIkxpbmVhciBhcnJheSBzZXQiKTsKKyAg
ICBzdGF0aWNfYXNzZXJ0KHNldC5zaXplKCkgPT0gMiwgIlNldCBzaXplIGlzIGNvbnN0ZXhwciIp
OworICAgIHN0YXRpY19hc3NlcnQoc2V0LmNvbnRhaW5zKDIpLCAiU2V0IGNvbnRhaW5zIGlzIGNv
bnN0ZXhwciIpOworICAgIHN0YXRpY19hc3NlcnQoIXNldC5jb250YWlucygzKSwgIlNldCBjb250
YWlucyBpcyBjb25zdGV4cHIiKTsKKworICAgIEFTU0VSVF9FUSgoaW50KUZpeGVkVHlwZTo6TGlu
ZWFyU2VhcmNoQXJyYXksIChpbnQpc2V0LnR5cGUpOworICAgIEFTU0VSVF9UUlVFKHNldC5jb250
YWlucyg0KSk7CisgICAgQVNTRVJUX0ZBTFNFKHNldC5jb250YWlucygxKSk7Cit9CisKK1RFU1Qo
V1RGX0ZpeGVkU2V0LCBCaW5hcnlTZWFyY2hBcnJheSkKK3sKKyAgICBzdGF0aWMgY29uc3RleHBy
IGF1dG8gc2V0ID0gbWFrZUZpeGVkU2V0PHVuc2lnbmVkPiggNSwgNCwgMSwgMiwgMyApOworICAg
IHN0YXRpY19hc3NlcnQoc2V0LnR5cGUgPT0gRml4ZWRUeXBlOjpCaW5hcnlTZWFyY2hBcnJheSwg
ImJpbmFyeSBzZWFyY2ggYXJyYXkgc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChzZXQuc2l6ZSgp
ID09IDUsICJTZXQgc2l6ZSBpcyBjb25zdGV4cHIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNldC5j
b250YWlucyg0KSwgIlNldCBjb250YWlucyBpcyBjb25zdGV4cHIiKTsKKyAgICBzdGF0aWNfYXNz
ZXJ0KCFzZXQuY29udGFpbnMoMjApLCAiU2V0IGNvbnRhaW5zIGlzIGNvbnN0ZXhwciIpOworCisg
ICAgQVNTRVJUX0VRKChpbnQpRml4ZWRUeXBlOjpCaW5hcnlTZWFyY2hBcnJheSwgKGludClzZXQu
dHlwZSk7CisKKyAgICBBU1NFUlRfVFJVRShzZXQuY29udGFpbnMoMSkpOworICAgIEFTU0VSVF9U
UlVFKHNldC5jb250YWlucygyKSk7CisgICAgQVNTRVJUX1RSVUUoc2V0LmNvbnRhaW5zKDMpKTsK
KyAgICBBU1NFUlRfVFJVRShzZXQuY29udGFpbnMoNCkpOworICAgIEFTU0VSVF9UUlVFKHNldC5j
b250YWlucyg1KSk7CisgICAgQVNTRVJUX0ZBTFNFKHNldC5jb250YWlucygwKSk7CisgICAgQVNT
RVJUX0ZBTFNFKHNldC5jb250YWlucyg2KSk7CisgICAgQVNTRVJUX0ZBTFNFKHNldC5jb250YWlu
cyg3KSk7Cit9CisKK30K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>316214</attachid>
            <date>2017-07-22 17:13:08 -0700</date>
            <delta_ts>2017-07-22 17:13:08 -0700</delta_ts>
            <desc>Updated Proof of Concept (added MetaStrings)</desc>
            <filename>fixedSetProofOfConcept2.diff</filename>
            <type>text/plain</type>
            <size>19869</size>
            <attacher name="Sam Weinig">sam</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdFdlYktpdEFQSS54Y29kZXByb2ovcHJvamVj
dC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdFdlYktpdEFQ
SS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAyMTk3NjQpCisrKyBUb29scy9U
ZXN0V2ViS2l0QVBJL1Rlc3RXZWJLaXRBUEkueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29y
a2luZyBjb3B5KQpAQCAtMjU5LDYgKzI1OSw3IEBACiAJCTdDMzk2NTA2MUNERDc0RjkwMDk0REJC
OCAvKiBDb2xvci5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSA3QzM5NjUwNTFDREQ3NEY5MDA5NERCQjggLyogQ29sb3IuY3BwICovOyB9OwogCQk3QzNE
QjhFNDFEMTIxMjlCMDBBRThDQzMgLyogQ29tbWFuZEJhY2tGb3J3YXJkLm1tIGluIFNvdXJjZXMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gN0MzREI4RTIxRDEyMTI5QjAwQUU4
Q0MzIC8qIENvbW1hbmRCYWNrRm9yd2FyZC5tbSAqLzsgfTsKIAkJN0M0MTdGMzMxRDE5RTE0ODAw
QjhFRjUzIC8qIFdLV2ViVmlld0RlZmF1bHROYXZpZ2F0aW9uRGVsZWdhdGUubW0gaW4gU291cmNl
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA3QzQxN0YzMTFEMTlFMTQ4MDBC
OEVGNTMgLyogV0tXZWJWaWV3RGVmYXVsdE5hdmlnYXRpb25EZWxlZ2F0ZS5tbSAqLzsgfTsKKwkJ
N0M0MUVGNjkxRjIzMTIyNzAwQkZDRTk3IC8qIEZpeGVkU2V0LmNwcCBpbiBTb3VyY2VzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDdDNDFFRjY4MUYyMzEyMjcwMEJGQ0U5NyAv
KiBGaXhlZFNldC5jcHAgKi87IH07CiAJCTdDNDg2QkExMUFBMTI1NjcwMDNGNkY5QiAvKiBidW5k
bGUtZmlsZS5odG1sIGluIENvcHkgUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IDdDNDg2QkEwMUFBMTI1NEIwMDNGNkY5QiAvKiBidW5kbGUtZmlsZS5odG1sICov
OyB9OwogCQk3QzU0QTRCRTFBQTExQ0NBMDAzODBGNzggLyogV0tCdW5kbGVGaWxlSGFuZGxlLmNw
cCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDdDNTRBNEJD
MUFBMTFDQ0EwMDM4MEY3OCAvKiBXS0J1bmRsZUZpbGVIYW5kbGUuY3BwICovOyB9OwogCQk3QzU0
QTRDMTFBQTExQ0U0MDAzODBGNzggLyogV0tCdW5kbGVGaWxlSGFuZGxlX0J1bmRsZS5jcHAgaW4g
U291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA3QzU0QTRCRjFBQTEx
Q0U0MDAzODBGNzggLyogV0tCdW5kbGVGaWxlSGFuZGxlX0J1bmRsZS5jcHAgKi87IH07CkBAIC0z
NzYsNyArMzc3LDYgQEAKIAkJN0NDRTdFQzExQTQxMUE3RTAwNDQ3QzRDIC8qIEhUTUxDb2xsZWN0
aW9uTmFtZWRJdGVtLm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gOUI0RjhGQTMxNTlENTJCMTAwMkQ5Rjk0IC8qIEhUTUxDb2xsZWN0aW9uTmFtZWRJdGVt
Lm1tICovOyB9OwogCQk3Q0NFN0VDMjFBNDExQTdFMDA0NDdDNEMgLyogSFRNTEZvcm1Db2xsZWN0
aW9uTmFtZWRJdGVtLm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gOUIyNkZDNkIxNTlEMDYxMDAwQ0MzNzY1IC8qIEhUTUxGb3JtQ29sbGVjdGlvbk5hbWVk
SXRlbS5tbSAqLzsgfTsKIAkJN0NDRTdFQzMxQTQxMUE3RTAwNDQ3QzRDIC8qIEluc3BlY3RvckJh
ci5tbSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEM1MDdF
OEE2MTRDNjU0NUIwMDVENkIzQiAvKiBJbnNwZWN0b3JCYXIubW0gKi87IH07Ci0JCTk1NjQ2RTVC
MUYxREI2MEUwMERFMEVCOSAvKiBJbnNwZWN0b3JWYWx1ZS5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA5NTNGNDc5MTFGMURCNDAzMDBFM0QxRTMgLyog
SW5zcGVjdG9yVmFsdWUuY3BwICovOyB9OwogCQk3Q0NFN0VDNDFBNDExQTdFMDA0NDdDNEMgLyog
SlNXcmFwcGVyRm9yTm9kZUluV2ViRnJhbWUubW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSA0QkI0MTYwMTE2ODE1QjI2MDA4MjQyMzggLyogSlNXcmFwcGVy
Rm9yTm9kZUluV2ViRnJhbWUubW0gKi87IH07CiAJCTdDQ0U3RUM1MUE0MTFBN0UwMDQ0N0M0QyAv
KiBNZW1vcnlDYWNoZURpc2FibGVXaXRoaW5SZXNvdXJjZUxvYWREZWxlZ2F0ZS5tbSBpbiBTb3Vy
Y2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEUxMjIwRDlGMTU1QjI1NDgw
MDEzRTJGQyAvKiBNZW1vcnlDYWNoZURpc2FibGVXaXRoaW5SZXNvdXJjZUxvYWREZWxlZ2F0ZS5t
bSAqLzsgfTsKIAkJN0NDRTdFQzYxQTQxMUE3RTAwNDQ3QzRDIC8qIE1lbW9yeUNhY2hlUHJ1bmVX
aXRoaW5SZXNvdXJjZUxvYWREZWxlZ2F0ZS5tbSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IDUxN0U3REZCMTUxMTBFQTYwMEQwQjAwOCAvKiBNZW1vcnlDYWNo
ZVBydW5lV2l0aGluUmVzb3VyY2VMb2FkRGVsZWdhdGUubW0gKi87IH07CkBAIC01MTIsNiArNTEy
LDcgQEAKIAkJOTNGNTZEQTcxRTVGOTE3NDAwM0VERTg0IC8qIGxpYmljdWNvcmUuZHlsaWIgaW4g
RnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA3QzgzRTAzMzFE
MEE1RjI3MDBGRUJDRjMgLyogbGliaWN1Y29yZS5keWxpYiAqLzsgfTsKIAkJOTNGNTZEQTkxRTVG
OTE5RDAwM0VERTg0IC8qIFdLV2ViVmlld1NuYXBzaG90Lm1tIGluIFNvdXJjZXMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOTNGNTZEQTgxRTVGOTE4MTAwM0VERTg0IC8qIFdL
V2ViVmlld1NuYXBzaG90Lm1tICovOyB9OwogCQk5M0Y3RTg2RjE0REM4RTVDMDBDODRBOTkgLyog
TmV3Rmlyc3RWaXN1YWxseU5vbkVtcHR5TGF5b3V0RnJhbWVzX0J1bmRsZS5jcHAgaW4gU291cmNl
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA5M0Y3RTg2RTE0REM4RTVCMDBD
ODRBOTkgLyogTmV3Rmlyc3RWaXN1YWxseU5vbkVtcHR5TGF5b3V0RnJhbWVzX0J1bmRsZS5jcHAg
Ki87IH07CisJCTk1NjQ2RTVCMUYxREI2MEUwMERFMEVCOSAvKiBJbnNwZWN0b3JWYWx1ZS5jcHAg
aW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA5NTNGNDc5MTFG
MURCNDAzMDBFM0QxRTMgLyogSW5zcGVjdG9yVmFsdWUuY3BwICovOyB9OwogCQk5OTg0RkFDQzFD
RkZBRjYwMDA4RDE5OEMgLyogV0tXZWJWaWV3VGV4dElucHV0Lm1tIGluIFNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOTk4NEZBQ0ExQ0ZGQUVFRTAwOEQxOThDIC8q
IFdLV2ViVmlld1RleHRJbnB1dC5tbSAqLzsgfTsKIAkJOTk4NEZBQ0UxQ0ZGQjA5MDAwOEQxOThD
IC8qIGVkaXRhYmxlLWJvZHkuaHRtbCBpbiBDb3B5IFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSA5OTg0RkFDRDFDRkZCMDM4MDA4RDE5OEMgLyogZWRpdGFibGUt
Ym9keS5odG1sICovOyB9OwogCQk5QjA3ODZBNTFDNTg4NUMzMDBEMTU5RTMgLyogSW5qZWN0ZWRC
dW5kbGVNYWtlQWxsU2hhZG93Um9vdHNPcGVuX0J1bmRsZS5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA5QjA3ODZBNDFDNTg4NUMzMDBEMTU5RTMgLyog
SW5qZWN0ZWRCdW5kbGVNYWtlQWxsU2hhZG93Um9vdHNPcGVuX0J1bmRsZS5jcHAgKi87IH07CkBA
IC0xMzE0LDYgKzEzMTUsNyBAQAogCQk3QzM5NjUwNTFDREQ3NEY5MDA5NERCQjggLyogQ29sb3Iu
Y3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gQ29sb3IuY3BwOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk3QzNEQjhFMjFEMTIxMjlCMDBBRThDQzMgLyogQ29t
bWFuZEJhY2tGb3J3YXJkLm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRo
ID0gQ29tbWFuZEJhY2tGb3J3YXJkLm1tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk3
QzQxN0YzMTFEMTlFMTQ4MDBCOEVGNTMgLyogV0tXZWJWaWV3RGVmYXVsdE5hdmlnYXRpb25EZWxl
Z2F0ZS5tbSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLm9iamNwcDsgcGF0aCA9IFdLV2ViVmll
d0RlZmF1bHROYXZpZ2F0aW9uRGVsZWdhdGUubW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CisJCTdDNDFFRjY4MUYyMzEyMjcwMEJGQ0U5NyAvKiBGaXhlZFNldC5jcHAgKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7
IHBhdGggPSBGaXhlZFNldC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTdDNDg2
QkEwMUFBMTI1NEIwMDNGNkY5QiAvKiBidW5kbGUtZmlsZS5odG1sICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5odG1sOyBwYXRoID0gImJ1bmRs
ZS1maWxlLmh0bWwiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk3QzU0QTRCQzFBQTEx
Q0NBMDAzODBGNzggLyogV0tCdW5kbGVGaWxlSGFuZGxlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuY3BwLmNwcDsgcGF0aCA9IFdLQnVuZGxlRmlsZUhhbmRsZS5jcHA7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CiAJCTdDNTRBNEJGMUFBMTFDRTQwMDM4MEY3OCAvKiBXS0J1bmRsZUZpbGVI
YW5kbGVfQnVuZGxlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFdL
QnVuZGxlRmlsZUhhbmRsZV9CdW5kbGUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpA
QCAtMTM5OCw2ICsxNDAwLDcgQEAKIAkJOTNGNTZEQTgxRTVGOTE4MTAwM0VERTg0IC8qIFdLV2Vi
Vmlld1NuYXBzaG90Lm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRoID0g
V0tXZWJWaWV3U25hcHNob3QubW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTkzRjdF
ODZCMTREQzhFNEQwMEM4NEE5OSAvKiBOZXdGaXJzdFZpc3VhbGx5Tm9uRW1wdHlMYXlvdXRGcmFt
ZXMuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gTmV3Rmlyc3RWaXN1
YWxseU5vbkVtcHR5TGF5b3V0RnJhbWVzLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
IAkJOTNGN0U4NkUxNERDOEU1QjAwQzg0QTk5IC8qIE5ld0ZpcnN0VmlzdWFsbHlOb25FbXB0eUxh
eW91dEZyYW1lc19CdW5kbGUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRo
ID0gTmV3Rmlyc3RWaXN1YWxseU5vbkVtcHR5TGF5b3V0RnJhbWVzX0J1bmRsZS5jcHA7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTk1M0Y0NzkxMUYxREI0MDMwMEUzRDFFMyAvKiBJbnNw
ZWN0b3JWYWx1ZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBJbnNwZWN0b3JWYWx1ZS5jcHA7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTk5ODRGQUNBMUNGRkFFRUUwMDhEMTk4QyAvKiBX
S1dlYlZpZXdUZXh0SW5wdXQubW0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5vYmpjcHA7IHBh
dGggPSBXS1dlYlZpZXdUZXh0SW5wdXQubW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJ
CTk5ODRGQUNEMUNGRkIwMzgwMDhEMTk4QyAvKiBlZGl0YWJsZS1ib2R5Lmh0bWwgKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSB0ZXh0Lmh0bWw7IHBhdGggPSAiZWRpdGFibGUtYm9keS5odG1sIjsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKIAkJOUIwNzg2QTIxQzU4ODMwRjAwRDE1OUUzIC8qIEluamVjdGVkQnVuZGxl
TWFrZUFsbFNoYWRvd1Jvb3RzT3Blbi5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7
IHBhdGggPSBJbmplY3RlZEJ1bmRsZU1ha2VBbGxTaGFkb3dSb290c09wZW4uY3BwOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwpAQCAtMTU0MCw3ICsxNTQzLDYgQEAKIAkJQzJDRjk3NTkxNkNF
QzY5RTAwNTRFOTlEIC8qIEpTQ29udGV4dEJhY2tGb3J3YXJkQ2FjaGUyLmh0bWwgKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSB0ZXh0Lmh0bWw7IHBhdGggPSBKU0NvbnRleHRCYWNrRm9yd2FyZENhY2hlMi5odG1sOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlDMkVCMkREMTE2Q0FDN0FDMDA5QjUyRUUgLyogV2Vi
Vmlld0RpZENyZWF0ZUphdmFTY3JpcHRDb250ZXh0Lm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
cHAub2JqY3BwOyBwYXRoID0gV2ViVmlld0RpZENyZWF0ZUphdmFTY3JpcHRDb250ZXh0Lm1tOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlDNTA3RThBNjE0QzY1NDVCMDA1RDZCM0IgLyog
SW5zcGVjdG9yQmFyLm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRoID0g
SW5zcGVjdG9yQmFyLm1tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwotCQk5NTNGNDc5MTFG
MURCNDAzMDBFM0QxRTMgLyogSW5zcGVjdG9yVmFsdWUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0g
SW5zcGVjdG9yVmFsdWUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlDNTEwMUM0
RTE3NkI4QkI5MDBFRTlCMTUgLyogZmluZFJhbmdlcy5odG1sICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5odG1s
OyBwYXRoID0gZmluZFJhbmdlcy5odG1sOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlD
NTFBRkI5ODE2OUY0OUZGMDA5Q0NGNjYgLyogRmluZE1hdGNoZXMubW0gKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5vYmpjcHA7IHBhdGggPSBGaW5kTWF0Y2hlcy5tbTsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKIAkJQzU0MEY3NzUxNTJFNERBMDAwQTQwQzhDIC8qIFNpbXBsaWZ5TWFya3Vw
Lm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRoID0gU2ltcGxpZnlNYXJr
dXAubW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0yNDE2LDYgKzI0MTgsNyBAQAog
CQkJCTdBQTZBMTUxMUFBQzBCMzEwMDJCMkVEMyAvKiBXb3JrUXVldWUuY3BwICovLAogCQkJCTI2
NUFGNTRGMTVEMUU0OEEwMEIwQ0I0QSAvKiBXVEZTdHJpbmcuY3BwICovLAogCQkJCTgzREI3OTY3
MUVGNjNCM0MwMEJGQTVFNSAvKiBGdW5jdGlvbi5jcHAgKi8sCisJCQkJN0M0MUVGNjgxRjIzMTIy
NzAwQkZDRTk3IC8qIEZpeGVkU2V0LmNwcCAqLywKIAkJCSk7CiAJCQlwYXRoID0gV1RGOwogCQkJ
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKQEAgLTI5MjYsNiArMjkyOSw3IEBACiAJCQkJNTMxQzFE
OEUxREY4RUY3MjAwNkU5NzlGIC8qIExFQkRlY29kZXIuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJ
N0M4M0RFRTgxRDBBNTkwQzAwRkVCQ0YzIC8qIExpc3RIYXNoU2V0LmNwcCBpbiBTb3VyY2VzICov
LAogCQkJCTUzMTFCRDVFMUVBOTQ5MEUwMDUyNTI4MSAvKiBUaHJlYWRNZXNzYWdlcy5jcHAgaW4g
U291cmNlcyAqLywKKwkJCQk3QzQxRUY2OTFGMjMxMjI3MDBCRkNFOTcgLyogRml4ZWRTZXQuY3Bw
IGluIFNvdXJjZXMgKi8sCiAJCQkJN0M4M0RGMUQxRDBBNTkwQzAwRkVCQ0YzIC8qIExvY2suY3Bw
IGluIFNvdXJjZXMgKi8sCiAJCQkJN0M4M0RFRUQxRDBBNTkwQzAwRkVCQ0YzIC8qIE1hdGhFeHRy
YXMuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJN0M4M0RFRUYxRDBBNTkwQzAwRkVCQ0YzIC8qIE1E
NS5jcHAgaW4gU291cmNlcyAqLywKSW5kZXg6IFRvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdHMvV1RG
L0ZpeGVkU2V0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dU
Ri9GaXhlZFNldC5jcHAJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvVGVzdFdlYktpdEFQSS9UZXN0
cy9XVEYvRml4ZWRTZXQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDEyIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5E
IElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFt
ZXNwYWNlIFRlc3RXZWJLaXRBUEkgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+
CitzdHJ1Y3QgRml4ZWRBcnJheSB7CisgICAgY29uc3RleHByIFQmIG9wZXJhdG9yW10oc2l6ZV90
IGkpCisgICAgeworICAgICAgICByZXR1cm4gdmFsdWVzW2ldOworICAgIH0KKworICAgIGNvbnN0
ZXhwciBjb25zdCBUJiBvcGVyYXRvcltdKHNpemVfdCBpKSBjb25zdAorICAgIHsKKyAgICAgICAg
cmV0dXJuIHZhbHVlc1tpXTsKKyAgICB9CisKKyAgICBjb25zdGV4cHIgc2l6ZV90IHNpemUoKSBj
b25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIE47CisgICAgfQorCisgICAgY29uc3RleHByIGNv
bnN0IFQqIGJlZ2luKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiB2YWx1ZXM7CisgICAg
fQorCisgICAgY29uc3RleHByIGNvbnN0IFQqIGVuZCgpIGNvbnN0CisgICAgeworICAgICAgICBy
ZXR1cm4gdmFsdWVzICsgTjsKKyAgICB9CisKKyAgICBUIHZhbHVlc1tOXTsKK307CisKK3RlbXBs
YXRlIDx0eXBlbmFtZSBULCBzdGQ6OnNpemVfdCBOLCBzdGQ6OnNpemVfdC4uLiBJPgorY29uc3Rl
eHByIEZpeGVkQXJyYXk8VCwgTiArIDE+IGFwcGVuZEltcGwoRml4ZWRBcnJheTxULCBOPiBhLCBU
IHQsIHN0ZDo6aW5kZXhfc2VxdWVuY2U8SS4uLj4pCit7CisgICAgcmV0dXJuIEZpeGVkQXJyYXk8
VCwgTiArIDE+eyB7IGFbSV0uLi4sIHQgfSB9OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwg
c3RkOjpzaXplX3QgTj4KK2NvbnN0ZXhwciBGaXhlZEFycmF5PFQsIE4gKyAxPiBhcHBlbmQoRml4
ZWRBcnJheTxULCBOPiBhLCBUIHQpCit7CisgICAgcmV0dXJuIGFwcGVuZEltcGwoYSwgdCwgc3Rk
OjptYWtlX2luZGV4X3NlcXVlbmNlPE4+KCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4K
K2NvbnN0ZXhwciBGaXhlZEFycmF5PFQsIDE+IGFwcGVuZChGaXhlZEFycmF5PFQsIDA+IGEsIFQg
dCkKK3sKKyAgICByZXR1cm4gRml4ZWRBcnJheTxULCAxPnsgeyB0IH0gfTsKK30KKwordGVtcGxh
dGU8Y2xhc3MgVD4KK2NvbnN0ZXhwciB2b2lkIGNvbnN0ZXhwcl9zd2FwKFQmIGEsIFQmIGIpCit7
CisgICAgVCB0bXAgPSBzdGQ6Om1vdmUoYSk7CisgICAgYSA9IHN0ZDo6bW92ZShiKTsKKyAgICBi
ID0gc3RkOjptb3ZlKHRtcCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4K
K2NvbnN0ZXhwciB2b2lkIHJlY3Vyc2l2ZVNvcnQoRml4ZWRBcnJheTxULCBOPiYgYXJyYXksIHNp
emVfdCBsZWZ0LCBzaXplX3QgcmlnaHQpCit7CisgICAgaWYgKGxlZnQgPCByaWdodCkgeworICAg
ICAgICBzaXplX3QgbSA9IGxlZnQ7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IGxlZnQgKyAx
OyBpIDwgcmlnaHQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGFycmF5W2ldIDwgYXJyYXlbbGVm
dF0pCisgICAgICAgICAgICAgICAgY29uc3RleHByX3N3YXAoYXJyYXlbKyttXSwgYXJyYXlbaV0p
OworICAgICAgICB9CisKKyAgICAgICAgY29uc3RleHByX3N3YXAoYXJyYXlbbGVmdF0sIGFycmF5
W21dKTsKKworICAgICAgICByZWN1cnNpdmVTb3J0KGFycmF5LCBsZWZ0LCBtKTsKKyAgICAgICAg
cmVjdXJzaXZlU29ydChhcnJheSwgbSArIDEsIHJpZ2h0KTsKKyAgICB9Cit9CisKK3RlbXBsYXRl
IDx0eXBlbmFtZSBULCBzaXplX3QgTj4KK2NvbnN0ZXhwciBGaXhlZEFycmF5PFQsIE4+IHNvcnQo
Rml4ZWRBcnJheTxULCBOPiBhcnJheSkKK3sKKyAgICBhdXRvIHNvcnRlZCA9IGFycmF5OworICAg
IHJlY3Vyc2l2ZVNvcnQoc29ydGVkLCAwLCBOKTsKKyAgICByZXR1cm4gc29ydGVkOworfQorCit0
ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Citjb25zdGV4cHIgYm9vbCBiaW5hcnlTZWFy
Y2goRml4ZWRBcnJheTxULCBOPiBhcnJheSwgVCBrZXkpCit7CisgICAgc2l6ZV90IHNpemUgPSBO
OworICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIHdoaWxlIChzaXplID4gMSkgeworICAgICAg
ICBzaXplX3QgcG9zID0gKHNpemUgLSAxKSA+PiAxOworICAgICAgICBhdXRvIHZhbHVlID0gYXJy
YXlbb2Zmc2V0ICsgcG9zXTsKKyAgICAgICAgaWYgKHZhbHVlID09IGtleSkKKyAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICAKKyAgICAgICAgaWYgKGtleSA8IHZhbHVlKQorICAgICAg
ICAgICAgc2l6ZSA9IHBvczsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzaXplIC09IChw
b3MgKyAxKTsKKyAgICAgICAgICAgIG9mZnNldCArPSAocG9zICsgMSk7CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICByZXR1cm4gYXJyYXlbb2Zmc2V0XSA9PSBrZXk7Cit9CisKK2VudW0gY2xhc3Mg
Rml4ZWRUeXBlIHsKKyAgICBTaW5nbGUsCisgICAgTGluZWFyU2VhcmNoQXJyYXksCisgICAgQmlu
YXJ5U2VhcmNoQXJyYXkKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgRml4ZWRT
ZXRTaW5nbGUgeworICAgIHN0YXRpYyBjb25zdGV4cHIgRml4ZWRUeXBlIHR5cGUgPSBGaXhlZFR5
cGU6OlNpbmdsZTsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBudW1iZXJPZkVsZW1lbnRz
ID0gMTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+CisgICAgY29uc3RleHByIEZpeGVkU2V0
U2luZ2xlKFUmJiB2KQorICAgICAgICA6IG1fdmFsdWUgeyBzdGF0aWNfY2FzdDxUPih2KSB9Cisg
ICAgeworICAgIH0KKworICAgIGNvbnN0ZXhwciBGaXhlZFNldFNpbmdsZShGaXhlZEFycmF5PFQs
IDE+IHZhbHVlKQorICAgICAgICA6IG1fdmFsdWUgeyB2YWx1ZVswXSB9CisgICAgeworICAgIH0K
KworICAgIGNvbnN0ZXhwciBzaXplX3Qgc2l6ZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1
cm4gbnVtYmVyT2ZFbGVtZW50czsKKyAgICB9CisKKyAgICBjb25zdGV4cHIgYm9vbCBjb250YWlu
cyhUIGtleSkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX3ZhbHVlID09IGtleTsKKyAg
ICB9CisKKyAgICBjb25zdGV4cHIgY29uc3QgVCogYmVnaW4oKSBjb25zdAorICAgIHsKKyAgICAg
ICAgcmV0dXJuICZtX3ZhbHVlOworICAgIH0KKyAgICBjb25zdGV4cHIgY29uc3QgVCogZW5kKCkg
Y29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAmbV92YWx1ZSArIG51bWJlck9mRWxlbWVudHM7
CisgICAgfQorCitwcml2YXRlOgorICAgIFQgbV92YWx1ZTsKK307CisKK3RlbXBsYXRlPHR5cGVu
YW1lIFQsIHNpemVfdCBOPgorc3RydWN0IEZpeGVkU2V0TGluZWFyU2VhcmNoQXJyYXkgeworICAg
IHN0YXRpYyBjb25zdGV4cHIgRml4ZWRUeXBlIHR5cGUgPSBGaXhlZFR5cGU6OkxpbmVhclNlYXJj
aEFycmF5OworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IG51bWJlck9mRWxlbWVudHMgPSBO
OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gVHM+CisgICAgY29uc3RleHByIEZpeGVkU2V0
TGluZWFyU2VhcmNoQXJyYXkoVHMuLi4gdmFsdWVzKQorICAgICAgICA6IG1fdmFsdWVzeyB7IHN0
YXRpY19jYXN0PFQ+KHZhbHVlcykuLi4gfSB9CisgICAgeworICAgIH0KKworICAgIGNvbnN0ZXhw
ciBGaXhlZFNldExpbmVhclNlYXJjaEFycmF5KEZpeGVkQXJyYXk8VCwgTj4gdmFsdWVzKQorICAg
ICAgICA6IG1fdmFsdWVzeyB2YWx1ZXMgfQorICAgIHsKKyAgICB9CisKKyAgICBjb25zdGV4cHIg
c2l6ZV90IHNpemUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG51bWJlck9mRWxlbWVu
dHM7CisgICAgfQorCisgICAgY29uc3RleHByIGJvb2wgY29udGFpbnMoVCBrZXkpIGNvbnN0Cisg
ICAgeworICAgICAgICBmb3IgKGF1dG8gdmFsdWUgOiBtX3ZhbHVlcykgeworICAgICAgICAgICAg
aWYgKHZhbHVlID09IGtleSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAg
fQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3RleHByIGNvbnN0IFQq
IGJlZ2luKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX3ZhbHVlcy5iZWdpbigpOwor
ICAgIH0KKyAgICBjb25zdGV4cHIgY29uc3QgVCogZW5kKCkgY29uc3QKKyAgICB7CisgICAgICAg
IHJldHVybiBtX3ZhbHVlcy5lbmQoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRml4ZWRBcnJh
eTxULCBOPiBtX3ZhbHVlczsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBOPgor
c3RydWN0IEZpeGVkU2V0QmluYXJ5U2VhcmNoQXJyYXkgeworICAgIHN0YXRpYyBjb25zdGV4cHIg
Rml4ZWRUeXBlIHR5cGUgPSBGaXhlZFR5cGU6OkJpbmFyeVNlYXJjaEFycmF5OworICAgIHN0YXRp
YyBjb25zdGV4cHIgc2l6ZV90IG51bWJlck9mRWxlbWVudHMgPSBOOworCisgICAgdGVtcGxhdGU8
dHlwZW5hbWUuLi4gVHM+CisgICAgY29uc3RleHByIEZpeGVkU2V0QmluYXJ5U2VhcmNoQXJyYXko
VHMuLi4gdmFsdWVzKQorICAgICAgICA6IG1fdmFsdWVzeyBzb3J0KEZpeGVkQXJyYXk8VCwgTj57
IHsgc3RhdGljX2Nhc3Q8VD4odmFsdWVzKS4uLn0gfSkgfQorICAgIHsKKyAgICB9CisKKyAgICBj
b25zdGV4cHIgRml4ZWRTZXRCaW5hcnlTZWFyY2hBcnJheShGaXhlZEFycmF5PFQsIE4+IHZhbHVl
cykKKyAgICAgICAgOiBtX3ZhbHVlc3sgc29ydCh2YWx1ZXMpIH0KKyAgICB7CisgICAgfQorCisg
ICAgY29uc3RleHByIHNpemVfdCBzaXplKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBu
dW1iZXJPZkVsZW1lbnRzOworICAgIH0KKworICAgIGNvbnN0ZXhwciBib29sIGNvbnRhaW5zKFQg
a2V5KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGJpbmFyeVNlYXJjaChtX3ZhbHVlcywg
a2V5KTsKKyAgICB9CisKKyAgICBjb25zdGV4cHIgY29uc3QgVCogYmVnaW4oKSBjb25zdAorICAg
IHsKKyAgICAgICAgcmV0dXJuIG1fdmFsdWVzLmJlZ2luKCk7CisgICAgfQorCisgICAgY29uc3Rl
eHByIGNvbnN0IFQqIGVuZCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV92YWx1ZXMu
ZW5kKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIEZpeGVkQXJyYXk8VCwgTj4gbV92YWx1ZXM7
Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBzaXplX3QgTj4KK3N0cnVjdCBGaXhlZFNldFNl
bGVjdG9yIHsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBzaXplID0gTjsKKworICAgIHVz
aW5nIFR5cGUgPQorICAgICAgICB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPHNpemUgPT0gMSwg
Rml4ZWRTZXRTaW5nbGU8VD4sCisgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFs
PHNpemUgPD0gNCwgRml4ZWRTZXRMaW5lYXJTZWFyY2hBcnJheTxULCBzaXplPiwKKyAgICAgICAg
ICAgICAgICBGaXhlZFNldEJpbmFyeVNlYXJjaEFycmF5PFQsIHNpemU+CisgICAgICAgICAgICA+
Ojp0eXBlCisgICAgICAgID46OnR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBl
bmFtZS4uLiBUcz4KK2NvbnN0ZXhwciBhdXRvIG1ha2VGaXhlZFNldChUcy4uLiB2YWx1ZXMpIC0+
IHR5cGVuYW1lIEZpeGVkU2V0U2VsZWN0b3I8VCwgc2l6ZW9mLi4uKFRzKT46OlR5cGUKK3sKKyAg
ICByZXR1cm4geyBzdGQ6OmZvcndhcmQ8VHM+KHZhbHVlcykuLi4gfTsKK30KKwordGVtcGxhdGU8
dHlwZW5hbWUgVCwgc2l6ZV90IE4+Citjb25zdGV4cHIgYXV0byBtYWtlRml4ZWRTZXQoRml4ZWRB
cnJheTxULCBOPiB2YWx1ZXMpIC0+IHR5cGVuYW1lIEZpeGVkU2V0U2VsZWN0b3I8VCwgTj46OlR5
cGUKK3sKKyAgICByZXR1cm4geyB2YWx1ZXMgfTsKK30KKworY2xhc3MgTWV0YVN0cmluZyB7Citw
dWJsaWM6CisgICAgdGVtcGxhdGU8c2l6ZV90IE4+CisgICAgY29uc3RleHByIE1ldGFTdHJpbmco
Y29uc3QgY2hhciAoJmRhdGEpW05dKQorICAgICAgICA6IG1fZGF0YShkYXRhKQorICAgICAgICAs
IG1fc2l6ZShOKQorICAgIHsKKyAgICB9CisKKyAgICBjb25zdGV4cHIgTWV0YVN0cmluZygpCisg
ICAgICAgIDogbV9kYXRhIHsgbnVsbHB0ciB9CisgICAgICAgICwgbV9zaXplIHsgMCB9CisgICAg
eworICAgIH0KKworICAgIGNvbnN0ZXhwciBNZXRhU3RyaW5nKGNvbnN0IGNoYXIqIGRhdGEsIHNp
emVfdCBzaXplKQorICAgICAgICA6IG1fZGF0YShkYXRhKQorICAgICAgICAsIG1fc2l6ZShzaXpl
KQorICAgIHsKKyAgICB9CisgIAorICAgIGNvbnN0ZXhwciBvcGVyYXRvciBjb25zdCBjaGFyKigp
CisgICAgeworICAgICAgICByZXR1cm4gbV9kYXRhOworICAgIH0KKyAKKyAgICBjb25zdGV4cHIg
Y29uc3QgY2hhciogZGF0YSgpCisgICAgeworICAgICAgICByZXR1cm4gbV9kYXRhOworICAgIH0K
KworICAgIGNvbnN0ZXhwciBzaXplX3Qgc2l6ZSgpCisgICAgeworICAgICAgICByZXR1cm4gbV9z
aXplOworICAgIH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBjaGFyKiBtX2RhdGE7CisgICAgc2l6
ZV90IG1fc2l6ZTsKK307CisKK2NvbnN0ZXhwciBGaXhlZEFycmF5PE1ldGFTdHJpbmcsIDA+IGJ1
aWxkKCkKK3sKKyAgICByZXR1cm4geyB9OworfQorCit0ZW1wbGF0ZTxzaXplX3QgTiwgdHlwZW5h
bWUuLi4gUmVzdD4KK2NvbnN0ZXhwciBhdXRvIGJ1aWxkKGNvbnN0IGNoYXIgKCZmaXJzdClbTl0s
IFJlc3QmJi4uLiByZXN0KSAtPiBGaXhlZEFycmF5PE1ldGFTdHJpbmcsIHNpemVvZi4uLihyZXN0
KSArIDE+Cit7CisgICAgcmV0dXJuIGFwcGVuZChidWlsZChyZXN0Li4uKSwgTWV0YVN0cmluZyB7
IGZpcnN0LCBOIH0pOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBUcz4KK2NvbnN0ZXhwciBh
dXRvIG1ha2VGaXhlZFN0cmluZ0FycmF5KFRzJiYuLi4gdmFsdWVzKSAtPiBkZWNsdHlwZShidWls
ZCh2YWx1ZXMuLi4pKQoreworICAgIHJldHVybiBidWlsZCh2YWx1ZXMuLi4pOworfQorCit0ZW1w
bGF0ZTx0eXBlbmFtZS4uLiBUcz4KK2NvbnN0ZXhwciBhdXRvIG1ha2VGaXhlZE1ldGFTdHJpbmdT
ZXQoVHMmJi4uLiB2YWx1ZXMpIC0+IGRlY2x0eXBlKG1ha2VGaXhlZFNldDxNZXRhU3RyaW5nPiht
YWtlRml4ZWRTdHJpbmdBcnJheSh2YWx1ZXMuLi4pKSkKK3sKKyAgICByZXR1cm4gbWFrZUZpeGVk
U2V0PE1ldGFTdHJpbmc+KG1ha2VGaXhlZFN0cmluZ0FycmF5KHZhbHVlcy4uLikpOworfQorCitU
RVNUKFdURl9GaXhlZFNldCwgTWV0YVN0cmluZ0FycmF5KQoreworICAgIHN0YXRpYyBjb25zdGV4
cHIgYXV0byBhcnJheSA9IG1ha2VGaXhlZFN0cmluZ0FycmF5KCAidGVzdCIsICJ3b3JsZCIsICJs
b3ZlbHkiICk7CisgICAgQVNTRVJUX0VRKDN1LCBhcnJheS5zaXplKCkpOworfQorCitURVNUKFdU
Rl9GaXhlZFNldCwgTWV0YVN0cmluZ1NldCkKK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGF1dG8g
c2V0ID0gbWFrZUZpeGVkTWV0YVN0cmluZ1NldCggInRlc3QiLCAid29ybGQiLCAibG92ZWx5IiAp
OworICAgIHN0YXRpY19hc3NlcnQoc2V0LnR5cGUgPT0gRml4ZWRUeXBlOjpMaW5lYXJTZWFyY2hB
cnJheSwgIkxpbmVhciBhcnJheSBzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNldC5zaXplKCkg
PT0gMywgIlNldCBzaXplIGlzIGNvbnN0ZXhwciIpOworICAgIEFTU0VSVF9FUSgzdSwgc2V0LnNp
emUoKSk7Cit9CisKK1RFU1QoV1RGX0ZpeGVkU2V0LCBTaW5nbGUpCit7CisgICAgc3RhdGljIGNv
bnN0ZXhwciBhdXRvIHNldCA9IG1ha2VGaXhlZFNldDx1bnNpZ25lZD4oIDE3ICk7CisgICAgc3Rh
dGljX2Fzc2VydChzZXQudHlwZSA9PSBGaXhlZFR5cGU6OlNpbmdsZSwgIlNpbmdsZSBlbGVtZW50
IHNldCIpOworICAgIHN0YXRpY19hc3NlcnQoc2V0LnNpemUoKSA9PSAxLCAiU2V0IHNpemUgaXMg
Y29uc3RleHByIik7CisgICAgc3RhdGljX2Fzc2VydChzZXQuY29udGFpbnMoMTcpLCAiU2V0IGNv
bnRhaW5zIGlzIGNvbnN0ZXhwciIpOworICAgIHN0YXRpY19hc3NlcnQoIXNldC5jb250YWlucygx
OCksICJTZXQgY29udGFpbnMgaXMgY29uc3RleHByIik7CisKKyAgICBBU1NFUlRfRVEoKGludClG
aXhlZFR5cGU6OlNpbmdsZSwgKGludClzZXQudHlwZSk7CisgICAgQVNTRVJUX1RSVUUoc2V0LmNv
bnRhaW5zKDE3KSk7CisgICAgQVNTRVJUX0ZBTFNFKHNldC5jb250YWlucygzKSk7Cit9CisKK1RF
U1QoV1RGX0ZpeGVkU2V0LCBMaW5lYXJTZWFyY2hBcnJheSkKK3sKKyAgICBzdGF0aWMgY29uc3Rl
eHByIGF1dG8gc2V0ID0gbWFrZUZpeGVkU2V0PHVuc2lnbmVkPiggNCwgMiApOworICAgIHN0YXRp
Y19hc3NlcnQoc2V0LnR5cGUgPT0gRml4ZWRUeXBlOjpMaW5lYXJTZWFyY2hBcnJheSwgIkxpbmVh
ciBhcnJheSBzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNldC5zaXplKCkgPT0gMiwgIlNldCBz
aXplIGlzIGNvbnN0ZXhwciIpOworICAgIHN0YXRpY19hc3NlcnQoc2V0LmNvbnRhaW5zKDIpLCAi
U2V0IGNvbnRhaW5zIGlzIGNvbnN0ZXhwciIpOworICAgIHN0YXRpY19hc3NlcnQoIXNldC5jb250
YWlucygzKSwgIlNldCBjb250YWlucyBpcyBjb25zdGV4cHIiKTsKKworICAgIEFTU0VSVF9FUSgo
aW50KUZpeGVkVHlwZTo6TGluZWFyU2VhcmNoQXJyYXksIChpbnQpc2V0LnR5cGUpOworICAgIEFT
U0VSVF9UUlVFKHNldC5jb250YWlucyg0KSk7CisgICAgQVNTRVJUX0ZBTFNFKHNldC5jb250YWlu
cygxKSk7Cit9CisKK1RFU1QoV1RGX0ZpeGVkU2V0LCBCaW5hcnlTZWFyY2hBcnJheSkKK3sKKyAg
ICBzdGF0aWMgY29uc3RleHByIGF1dG8gc2V0ID0gbWFrZUZpeGVkU2V0PHVuc2lnbmVkPiggNSwg
NCwgMSwgMiwgMyApOworICAgIHN0YXRpY19hc3NlcnQoc2V0LnR5cGUgPT0gRml4ZWRUeXBlOjpC
aW5hcnlTZWFyY2hBcnJheSwgImJpbmFyeSBzZWFyY2ggYXJyYXkgc2V0Iik7CisgICAgc3RhdGlj
X2Fzc2VydChzZXQuc2l6ZSgpID09IDUsICJTZXQgc2l6ZSBpcyBjb25zdGV4cHIiKTsKKyAgICBz
dGF0aWNfYXNzZXJ0KHNldC5jb250YWlucyg0KSwgIlNldCBjb250YWlucyBpcyBjb25zdGV4cHIi
KTsKKyAgICBzdGF0aWNfYXNzZXJ0KCFzZXQuY29udGFpbnMoMjApLCAiU2V0IGNvbnRhaW5zIGlz
IGNvbnN0ZXhwciIpOworCisgICAgQVNTRVJUX0VRKChpbnQpRml4ZWRUeXBlOjpCaW5hcnlTZWFy
Y2hBcnJheSwgKGludClzZXQudHlwZSk7CisKKyAgICBBU1NFUlRfVFJVRShzZXQuY29udGFpbnMo
MSkpOworICAgIEFTU0VSVF9UUlVFKHNldC5jb250YWlucygyKSk7CisgICAgQVNTRVJUX1RSVUUo
c2V0LmNvbnRhaW5zKDMpKTsKKyAgICBBU1NFUlRfVFJVRShzZXQuY29udGFpbnMoNCkpOworICAg
IEFTU0VSVF9UUlVFKHNldC5jb250YWlucyg1KSk7CisgICAgQVNTRVJUX0ZBTFNFKHNldC5jb250
YWlucygwKSk7CisgICAgQVNTRVJUX0ZBTFNFKHNldC5jb250YWlucyg2KSk7CisgICAgQVNTRVJU
X0ZBTFNFKHNldC5jb250YWlucyg3KSk7Cit9CisKK30K
</data>

          </attachment>
      

    </bug>

</bugzilla>